From 8fbd15aa9c7beb7241ab814ce39274afea2c24eb Mon Sep 17 00:00:00 2001 From: Dan Stough Date: Tue, 14 Feb 2023 14:44:55 -0500 Subject: [PATCH 001/262] [OSS] Post Consul 1.15 updates (#16256) * chore: update dev build to 1.16 * chore(ci): add nightly 1.15 test --- .../{nightly-test-1.11.x.yaml => nightly-test-1.15.x.yaml} | 6 +++--- version/VERSION | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) rename .github/workflows/{nightly-test-1.11.x.yaml => nightly-test-1.15.x.yaml} (98%) diff --git a/.github/workflows/nightly-test-1.11.x.yaml b/.github/workflows/nightly-test-1.15.x.yaml similarity index 98% rename from .github/workflows/nightly-test-1.11.x.yaml rename to .github/workflows/nightly-test-1.15.x.yaml index cd913d4eca4..18fe5466f00 100644 --- a/.github/workflows/nightly-test-1.11.x.yaml +++ b/.github/workflows/nightly-test-1.15.x.yaml @@ -1,4 +1,4 @@ -name: Nightly Test 1.11.x +name: Nightly Test 1.15.x on: schedule: - cron: '0 4 * * *' @@ -6,8 +6,8 @@ on: env: EMBER_PARTITION_TOTAL: 4 # Has to be changed in tandem with the matrix.partition - BRANCH: "release/1.11.x" - BRANCH_NAME: "release-1.11.x" # Used for naming artifacts + BRANCH: "release/1.15.x" + BRANCH_NAME: "release/1.15.x" # Used for naming artifacts jobs: frontend-test-workspace-node: diff --git a/version/VERSION b/version/VERSION index 0dec25d15b3..1f0d2f33519 100644 --- a/version/VERSION +++ b/version/VERSION @@ -1 +1 @@ -1.15.0-dev \ No newline at end of file +1.16.0-dev From 247211de6a79324fe4afc2c42f8b33c5c275b988 Mon Sep 17 00:00:00 2001 From: malizz Date: Tue, 14 Feb 2023 14:22:09 -0800 Subject: [PATCH 002/262] add integration tests for troubleshoot (#16223) * draft * expose internal admin port and add proxy test * update tests * move comment * add failure case, fix lint issues * cleanup * handle error * revert changes to service interface * address review comments * fix merge conflict * merge the tests so cluster is created once * fix other test --- .../consul-container/libs/service/connect.go | 58 +++++++++++----- .../consul-container/libs/service/examples.go | 15 ++++ .../consul-container/libs/service/gateway.go | 15 ++++ .../consul-container/libs/service/helpers.go | 2 - .../consul-container/libs/service/service.go | 7 +- .../libs/topology/service_topology.go | 51 ++++++++++++++ .../test/observability/access_logs_test.go | 41 +---------- .../test/troubleshoot/troubleshoot_test.go | 68 +++++++++++++++++++ 8 files changed, 196 insertions(+), 61 deletions(-) create mode 100644 test/integration/consul-container/libs/topology/service_topology.go create mode 100644 test/integration/consul-container/test/troubleshoot/troubleshoot_test.go diff --git a/test/integration/consul-container/libs/service/connect.go b/test/integration/consul-container/libs/service/connect.go index 3fa9bcbde25..ac4907d4e58 100644 --- a/test/integration/consul-container/libs/service/connect.go +++ b/test/integration/consul-container/libs/service/connect.go @@ -20,17 +20,33 @@ import ( // ConnectContainer type ConnectContainer struct { - ctx context.Context - container testcontainers.Container - ip string - appPort int - adminPort int - mappedPublicPort int - serviceName string + ctx context.Context + container testcontainers.Container + ip string + appPort int + externalAdminPort int + internalAdminPort int + mappedPublicPort int + serviceName string } var _ Service = (*ConnectContainer)(nil) +func (g ConnectContainer) Exec(ctx context.Context, cmd []string) (string, error) { + exitCode, reader, err := g.container.Exec(ctx, cmd) + if err != nil { + return "", fmt.Errorf("exec with error %s", err) + } + if exitCode != 0 { + return "", fmt.Errorf("exec with exit code %d", exitCode) + } + buf, err := io.ReadAll(reader) + if err != nil { + return "", fmt.Errorf("error reading from exec output: %w", err) + } + return string(buf), nil +} + func (g ConnectContainer) Export(partition, peer string, client *api.Client) error { return fmt.Errorf("ConnectContainer export unimplemented") } @@ -97,8 +113,13 @@ func (g ConnectContainer) Terminate() error { return cluster.TerminateContainer(g.ctx, g.container, true) } +func (g ConnectContainer) GetInternalAdminAddr() (string, int) { + return "localhost", g.internalAdminPort +} + +// GetAdminAddr returns the external admin port func (g ConnectContainer) GetAdminAddr() (string, int) { - return "localhost", g.adminPort + return "localhost", g.externalAdminPort } func (g ConnectContainer) GetStatus() (string, error) { @@ -133,7 +154,7 @@ func NewConnectService(ctx context.Context, sidecarServiceName string, serviceID } dockerfileCtx.BuildArgs = buildargs - adminPort, err := node.ClaimAdminPort() + internalAdminPort, err := node.ClaimAdminPort() if err != nil { return nil, err } @@ -146,7 +167,7 @@ func NewConnectService(ctx context.Context, sidecarServiceName string, serviceID Cmd: []string{ "consul", "connect", "envoy", "-sidecar-for", serviceID, - "-admin-bind", fmt.Sprintf("0.0.0.0:%d", adminPort), + "-admin-bind", fmt.Sprintf("0.0.0.0:%d", internalAdminPort), "--", "--log-level", envoyLogLevel, }, @@ -182,7 +203,7 @@ func NewConnectService(ctx context.Context, sidecarServiceName string, serviceID var ( appPortStr = strconv.Itoa(serviceBindPort) - adminPortStr = strconv.Itoa(adminPort) + adminPortStr = strconv.Itoa(internalAdminPort) ) info, err := cluster.LaunchContainerOnNode(ctx, node, req, []string{appPortStr, adminPortStr}) @@ -191,18 +212,19 @@ func NewConnectService(ctx context.Context, sidecarServiceName string, serviceID } out := &ConnectContainer{ - ctx: ctx, - container: info.Container, - ip: info.IP, - appPort: info.MappedPorts[appPortStr].Int(), - adminPort: info.MappedPorts[adminPortStr].Int(), - serviceName: sidecarServiceName, + ctx: ctx, + container: info.Container, + ip: info.IP, + appPort: info.MappedPorts[appPortStr].Int(), + externalAdminPort: info.MappedPorts[adminPortStr].Int(), + internalAdminPort: internalAdminPort, + serviceName: sidecarServiceName, } fmt.Printf("NewConnectService: name %s, mapped App Port %d, service bind port %d\n", serviceID, out.appPort, serviceBindPort) fmt.Printf("NewConnectService sidecar: name %s, mapped admin port %d, admin port %d\n", - sidecarServiceName, out.adminPort, adminPort) + sidecarServiceName, out.externalAdminPort, internalAdminPort) return out, nil } diff --git a/test/integration/consul-container/libs/service/examples.go b/test/integration/consul-container/libs/service/examples.go index e4c1fd186a3..9d95f6e9099 100644 --- a/test/integration/consul-container/libs/service/examples.go +++ b/test/integration/consul-container/libs/service/examples.go @@ -29,6 +29,21 @@ type exampleContainer struct { var _ Service = (*exampleContainer)(nil) +func (g exampleContainer) Exec(ctx context.Context, cmd []string) (string, error) { + exitCode, reader, err := g.container.Exec(ctx, cmd) + if err != nil { + return "", fmt.Errorf("exec with error %s", err) + } + if exitCode != 0 { + return "", fmt.Errorf("exec with exit code %d", exitCode) + } + buf, err := io.ReadAll(reader) + if err != nil { + return "", fmt.Errorf("error reading from exec output: %w", err) + } + return string(buf), nil +} + func (g exampleContainer) Export(partition, peerName string, client *api.Client) error { config := &api.ExportedServicesConfigEntry{ Name: partition, diff --git a/test/integration/consul-container/libs/service/gateway.go b/test/integration/consul-container/libs/service/gateway.go index 5da2281338c..5fb3a36184b 100644 --- a/test/integration/consul-container/libs/service/gateway.go +++ b/test/integration/consul-container/libs/service/gateway.go @@ -30,6 +30,21 @@ type gatewayContainer struct { var _ Service = (*gatewayContainer)(nil) +func (g gatewayContainer) Exec(ctx context.Context, cmd []string) (string, error) { + exitCode, reader, err := g.container.Exec(ctx, cmd) + if err != nil { + return "", fmt.Errorf("exec with error %s", err) + } + if exitCode != 0 { + return "", fmt.Errorf("exec with exit code %d", exitCode) + } + buf, err := io.ReadAll(reader) + if err != nil { + return "", fmt.Errorf("error reading from exec output: %w", err) + } + return string(buf), nil +} + func (g gatewayContainer) Export(partition, peer string, client *api.Client) error { return fmt.Errorf("gatewayContainer export unimplemented") } diff --git a/test/integration/consul-container/libs/service/helpers.go b/test/integration/consul-container/libs/service/helpers.go index 54a16249eec..55ad94bb7f6 100644 --- a/test/integration/consul-container/libs/service/helpers.go +++ b/test/integration/consul-container/libs/service/helpers.go @@ -3,9 +3,7 @@ package service import ( "context" "fmt" - "github.com/hashicorp/consul/api" - libcluster "github.com/hashicorp/consul/test/integration/consul-container/libs/cluster" "github.com/hashicorp/consul/test/integration/consul-container/libs/utils" ) diff --git a/test/integration/consul-container/libs/service/service.go b/test/integration/consul-container/libs/service/service.go index 75a35a74a6f..57a3539a641 100644 --- a/test/integration/consul-container/libs/service/service.go +++ b/test/integration/consul-container/libs/service/service.go @@ -1,13 +1,18 @@ package service -import "github.com/hashicorp/consul/api" +import ( + "context" + "github.com/hashicorp/consul/api" +) // Service represents a process that will be registered with the // Consul catalog, including Consul components such as sidecars and gateways type Service interface { + Exec(ctx context.Context, cmd []string) (string, error) // Export a service to the peering cluster Export(partition, peer string, client *api.Client) error GetAddr() (string, int) + // GetAdminAddr returns the external admin address GetAdminAddr() (string, int) GetLogs() (string, error) GetName() string diff --git a/test/integration/consul-container/libs/topology/service_topology.go b/test/integration/consul-container/libs/topology/service_topology.go new file mode 100644 index 00000000000..1cacd1a84c4 --- /dev/null +++ b/test/integration/consul-container/libs/topology/service_topology.go @@ -0,0 +1,51 @@ +package topology + +import ( + "fmt" + "testing" + + "github.com/hashicorp/consul/api" + libassert "github.com/hashicorp/consul/test/integration/consul-container/libs/assert" + libcluster "github.com/hashicorp/consul/test/integration/consul-container/libs/cluster" + libservice "github.com/hashicorp/consul/test/integration/consul-container/libs/service" + "github.com/stretchr/testify/require" +) + +func CreateServices(t *testing.T, cluster *libcluster.Cluster) (libservice.Service, libservice.Service) { + node := cluster.Agents[0] + client := node.GetClient() + + // Register service as HTTP + serviceDefault := &api.ServiceConfigEntry{ + Kind: api.ServiceDefaults, + Name: libservice.StaticServerServiceName, + Protocol: "http", + } + + ok, _, err := client.ConfigEntries().Set(serviceDefault, nil) + require.NoError(t, err, "error writing HTTP service-default") + require.True(t, ok, "did not write HTTP service-default") + + // Create a service and proxy instance + serviceOpts := &libservice.ServiceOpts{ + Name: libservice.StaticServerServiceName, + ID: "static-server", + HTTPPort: 8080, + GRPCPort: 8079, + } + + // Create a service and proxy instance + _, serverConnectProxy, err := libservice.CreateAndRegisterStaticServerAndSidecar(node, serviceOpts) + require.NoError(t, err) + + libassert.CatalogServiceExists(t, client, fmt.Sprintf("%s-sidecar-proxy", libservice.StaticServerServiceName)) + libassert.CatalogServiceExists(t, client, libservice.StaticServerServiceName) + + // Create a client proxy instance with the server as an upstream + clientConnectProxy, err := libservice.CreateAndRegisterStaticClientSidecar(node, "", false) + require.NoError(t, err) + + libassert.CatalogServiceExists(t, client, fmt.Sprintf("%s-sidecar-proxy", libservice.StaticClientServiceName)) + + return serverConnectProxy, clientConnectProxy +} diff --git a/test/integration/consul-container/test/observability/access_logs_test.go b/test/integration/consul-container/test/observability/access_logs_test.go index dcedb0de553..6c173e7c035 100644 --- a/test/integration/consul-container/test/observability/access_logs_test.go +++ b/test/integration/consul-container/test/observability/access_logs_test.go @@ -64,7 +64,7 @@ func TestAccessLogs(t *testing.T) { require.NoError(t, err) require.True(t, set) - serverService, clientService := createServices(t, cluster) + serverService, clientService := topology.CreateServices(t, cluster) _, port := clientService.GetAddr() // Validate Custom JSON @@ -121,42 +121,3 @@ func TestAccessLogs(t *testing.T) { // TODO: add a test to check that connections without a matching filter chain are NOT logged } - -func createServices(t *testing.T, cluster *libcluster.Cluster) (libservice.Service, libservice.Service) { - node := cluster.Agents[0] - client := node.GetClient() - - // Register service as HTTP - serviceDefault := &api.ServiceConfigEntry{ - Kind: api.ServiceDefaults, - Name: libservice.StaticServerServiceName, - Protocol: "http", - } - - ok, _, err := client.ConfigEntries().Set(serviceDefault, nil) - require.NoError(t, err, "error writing HTTP service-default") - require.True(t, ok, "did not write HTTP service-default") - - // Create a service and proxy instance - serviceOpts := &libservice.ServiceOpts{ - Name: libservice.StaticServerServiceName, - ID: "static-server", - HTTPPort: 8080, - GRPCPort: 8079, - } - - // Create a service and proxy instance - _, serverConnectProxy, err := libservice.CreateAndRegisterStaticServerAndSidecar(node, serviceOpts) - require.NoError(t, err) - - libassert.CatalogServiceExists(t, client, fmt.Sprintf("%s-sidecar-proxy", libservice.StaticServerServiceName)) - libassert.CatalogServiceExists(t, client, libservice.StaticServerServiceName) - - // Create a client proxy instance with the server as an upstream - clientConnectProxy, err := libservice.CreateAndRegisterStaticClientSidecar(node, "", false) - require.NoError(t, err) - - libassert.CatalogServiceExists(t, client, fmt.Sprintf("%s-sidecar-proxy", libservice.StaticClientServiceName)) - - return serverConnectProxy, clientConnectProxy -} diff --git a/test/integration/consul-container/test/troubleshoot/troubleshoot_test.go b/test/integration/consul-container/test/troubleshoot/troubleshoot_test.go new file mode 100644 index 00000000000..7803b38bff4 --- /dev/null +++ b/test/integration/consul-container/test/troubleshoot/troubleshoot_test.go @@ -0,0 +1,68 @@ +package troubleshoot + +import ( + "context" + "fmt" + "github.com/stretchr/testify/assert" + "strings" + "testing" + "time" + + "github.com/stretchr/testify/require" + + libcluster "github.com/hashicorp/consul/test/integration/consul-container/libs/cluster" + libservice "github.com/hashicorp/consul/test/integration/consul-container/libs/service" + "github.com/hashicorp/consul/test/integration/consul-container/libs/topology" +) + +func TestTroubleshootProxy(t *testing.T) { + t.Parallel() + cluster, _, _ := topology.NewPeeringCluster(t, 1, &libcluster.BuildOptions{ + Datacenter: "dc1", + InjectAutoEncryption: true, + }) + + serverService, clientService := topology.CreateServices(t, cluster) + + clientSidecar, ok := clientService.(*libservice.ConnectContainer) + require.True(t, ok) + _, clientAdminPort := clientSidecar.GetInternalAdminAddr() + + t.Run("upstream exists and is healthy", func(t *testing.T) { + require.Eventually(t, func() bool { + output, err := clientSidecar.Exec(context.Background(), + []string{"consul", "troubleshoot", "upstreams", + "-envoy-admin-endpoint", fmt.Sprintf("localhost:%v", clientAdminPort)}) + require.NoError(t, err) + upstreamExists := assert.Contains(t, output, libservice.StaticServerServiceName) + + output, err = clientSidecar.Exec(context.Background(), []string{"consul", "troubleshoot", "proxy", + "-envoy-admin-endpoint", fmt.Sprintf("localhost:%v", clientAdminPort), + "-upstream-envoy-id", libservice.StaticServerServiceName}) + require.NoError(t, err) + certsValid := strings.Contains(output, "certificates are valid") + listenersExist := strings.Contains(output, fmt.Sprintf("listener for upstream \"%s\" found", libservice.StaticServerServiceName)) + routesExist := strings.Contains(output, fmt.Sprintf("route for upstream \"%s\" found", libservice.StaticServerServiceName)) + healthyEndpoints := strings.Contains(output, "✓ healthy endpoints for cluster") + return upstreamExists && certsValid && listenersExist && routesExist && healthyEndpoints + }, 60*time.Second, 10*time.Second) + }) + + t.Run("terminate upstream and check if client sees it as unhealthy", func(t *testing.T) { + err := serverService.Terminate() + require.NoError(t, err) + + require.Eventually(t, func() bool { + output, err := clientSidecar.Exec(context.Background(), []string{"consul", "troubleshoot", "proxy", + "-envoy-admin-endpoint", fmt.Sprintf("localhost:%v", clientAdminPort), + "-upstream-envoy-id", libservice.StaticServerServiceName}) + require.NoError(t, err) + + certsValid := strings.Contains(output, "certificates are valid") + listenersExist := strings.Contains(output, fmt.Sprintf("listener for upstream \"%s\" found", libservice.StaticServerServiceName)) + routesExist := strings.Contains(output, fmt.Sprintf("route for upstream \"%s\" found", libservice.StaticServerServiceName)) + endpointUnhealthy := strings.Contains(output, "no healthy endpoints for cluster") + return certsValid && listenersExist && routesExist && endpointUnhealthy + }, 60*time.Second, 10*time.Second) + }) +} From fd61605ffb7f511767b68b50f7bbb44f0a9f4d28 Mon Sep 17 00:00:00 2001 From: cskh Date: Wed, 15 Feb 2023 10:26:43 -0500 Subject: [PATCH 003/262] upgrade test: fix flaky peering through mesh gateway (#16271) --- .../consul-container/libs/assert/envoy.go | 2 +- .../consul-container/libs/service/connect.go | 7 ++++ .../consul-container/libs/service/examples.go | 7 ++++ .../consul-container/libs/service/gateway.go | 7 ++++ .../consul-container/libs/service/service.go | 1 + .../libs/topology/peering_topology.go | 42 +++++++++++++++---- .../rotate_server_and_ca_then_fail_test.go | 2 +- .../upgrade/peering_control_plane_mgw_test.go | 26 ++++-------- .../test/upgrade/peering_http_test.go | 2 +- 9 files changed, 67 insertions(+), 29 deletions(-) diff --git a/test/integration/consul-container/libs/assert/envoy.go b/test/integration/consul-container/libs/assert/envoy.go index e62118c4f1d..6713c4fb649 100644 --- a/test/integration/consul-container/libs/assert/envoy.go +++ b/test/integration/consul-container/libs/assert/envoy.go @@ -127,7 +127,7 @@ func AssertEnvoyMetricAtLeast(t *testing.T, adminPort int, prefix, metric string err error ) failer := func() *retry.Timer { - return &retry.Timer{Timeout: 30 * time.Second, Wait: 500 * time.Millisecond} + return &retry.Timer{Timeout: 60 * time.Second, Wait: 500 * time.Millisecond} } retry.RunWith(failer(), t, func(r *retry.R) { diff --git a/test/integration/consul-container/libs/service/connect.go b/test/integration/consul-container/libs/service/connect.go index ac4907d4e58..b5a8087d2d6 100644 --- a/test/integration/consul-container/libs/service/connect.go +++ b/test/integration/consul-container/libs/service/connect.go @@ -109,6 +109,13 @@ func (g ConnectContainer) Start() error { return g.container.Start(g.ctx) } +func (g ConnectContainer) Stop() error { + if g.container == nil { + return fmt.Errorf("container has not been initialized") + } + return g.container.Stop(context.Background(), nil) +} + func (g ConnectContainer) Terminate() error { return cluster.TerminateContainer(g.ctx, g.container, true) } diff --git a/test/integration/consul-container/libs/service/examples.go b/test/integration/consul-container/libs/service/examples.go index 9d95f6e9099..da075f5aec9 100644 --- a/test/integration/consul-container/libs/service/examples.go +++ b/test/integration/consul-container/libs/service/examples.go @@ -101,6 +101,13 @@ func (g exampleContainer) Start() error { return g.container.Start(context.Background()) } +func (g exampleContainer) Stop() error { + if g.container == nil { + return fmt.Errorf("container has not been initialized") + } + return g.container.Stop(context.Background(), nil) +} + func (c exampleContainer) Terminate() error { return cluster.TerminateContainer(c.ctx, c.container, true) } diff --git a/test/integration/consul-container/libs/service/gateway.go b/test/integration/consul-container/libs/service/gateway.go index 5fb3a36184b..70897fc7b09 100644 --- a/test/integration/consul-container/libs/service/gateway.go +++ b/test/integration/consul-container/libs/service/gateway.go @@ -86,6 +86,13 @@ func (g gatewayContainer) Start() error { return g.container.Start(context.Background()) } +func (g gatewayContainer) Stop() error { + if g.container == nil { + return fmt.Errorf("container has not been initialized") + } + return g.container.Stop(context.Background(), nil) +} + func (c gatewayContainer) Terminate() error { return cluster.TerminateContainer(c.ctx, c.container, true) } diff --git a/test/integration/consul-container/libs/service/service.go b/test/integration/consul-container/libs/service/service.go index 57a3539a641..99da5582269 100644 --- a/test/integration/consul-container/libs/service/service.go +++ b/test/integration/consul-container/libs/service/service.go @@ -18,6 +18,7 @@ type Service interface { GetName() string GetServiceName() string Start() (err error) + Stop() (err error) Terminate() error Restart() error GetStatus() (string, error) diff --git a/test/integration/consul-container/libs/topology/peering_topology.go b/test/integration/consul-container/libs/topology/peering_topology.go index 1c764c45c53..ba36978c72f 100644 --- a/test/integration/consul-container/libs/topology/peering_topology.go +++ b/test/integration/consul-container/libs/topology/peering_topology.go @@ -41,6 +41,7 @@ type BuiltCluster struct { func BasicPeeringTwoClustersSetup( t *testing.T, consulVersion string, + peeringThroughMeshgateway bool, ) (*BuiltCluster, *BuiltCluster) { // acceptingCluster, acceptingCtx, acceptingClient := NewPeeringCluster(t, "dc1", 3, consulVersion, true) acceptingCluster, acceptingCtx, acceptingClient := NewPeeringCluster(t, 3, &libcluster.BuildOptions{ @@ -53,6 +54,38 @@ func BasicPeeringTwoClustersSetup( ConsulVersion: consulVersion, InjectAutoEncryption: true, }) + + // Create the mesh gateway for dataplane traffic and peering control plane traffic (if enabled) + acceptingClusterGateway, err := libservice.NewGatewayService(context.Background(), "mesh", "mesh", acceptingCluster.Clients()[0]) + require.NoError(t, err) + dialingClusterGateway, err := libservice.NewGatewayService(context.Background(), "mesh", "mesh", dialingCluster.Clients()[0]) + require.NoError(t, err) + + // Enable peering control plane traffic through mesh gateway + if peeringThroughMeshgateway { + req := &api.MeshConfigEntry{ + Peering: &api.PeeringMeshConfig{ + PeerThroughMeshGateways: true, + }, + } + configCluster := func(cli *api.Client) error { + libassert.CatalogServiceExists(t, cli, "mesh") + ok, _, err := cli.ConfigEntries().Set(req, &api.WriteOptions{}) + if !ok { + return fmt.Errorf("config entry is not set") + } + + if err != nil { + return fmt.Errorf("error writing config entry: %s", err) + } + return nil + } + err = configCluster(dialingClient) + require.NoError(t, err) + err = configCluster(acceptingClient) + require.NoError(t, err) + } + require.NoError(t, dialingCluster.PeerWithCluster(acceptingClient, AcceptingPeerName, DialingPeerName)) libassert.PeeringStatus(t, acceptingClient, AcceptingPeerName, api.PeeringStateActive) @@ -60,7 +93,6 @@ func BasicPeeringTwoClustersSetup( // Register an static-server service in acceptingCluster and export to dialing cluster var serverService, serverSidecarService libservice.Service - var acceptingClusterGateway libservice.Service { clientNode := acceptingCluster.Clients()[0] @@ -81,15 +113,10 @@ func BasicPeeringTwoClustersSetup( libassert.CatalogServiceExists(t, acceptingClient, "static-server-sidecar-proxy") require.NoError(t, serverService.Export("default", AcceptingPeerName, acceptingClient)) - - // Create the mesh gateway for dataplane traffic - acceptingClusterGateway, err = libservice.NewGatewayService(context.Background(), "mesh", "mesh", clientNode) - require.NoError(t, err) } // Register an static-client service in dialing cluster and set upstream to static-server service var clientSidecarService *libservice.ConnectContainer - var dialingClusterGateway libservice.Service { clientNode := dialingCluster.Clients()[0] @@ -100,9 +127,6 @@ func BasicPeeringTwoClustersSetup( libassert.CatalogServiceExists(t, dialingClient, "static-client-sidecar-proxy") - // Create the mesh gateway for dataplane traffic - dialingClusterGateway, err = libservice.NewGatewayService(context.Background(), "mesh", "mesh", clientNode) - require.NoError(t, err) } _, adminPort := clientSidecarService.GetAdminAddr() diff --git a/test/integration/consul-container/test/peering/rotate_server_and_ca_then_fail_test.go b/test/integration/consul-container/test/peering/rotate_server_and_ca_then_fail_test.go index 223effa449b..bbac9cc0340 100644 --- a/test/integration/consul-container/test/peering/rotate_server_and_ca_then_fail_test.go +++ b/test/integration/consul-container/test/peering/rotate_server_and_ca_then_fail_test.go @@ -50,7 +50,7 @@ import ( func TestPeering_RotateServerAndCAThenFail_(t *testing.T) { t.Parallel() - accepting, dialing := libtopology.BasicPeeringTwoClustersSetup(t, utils.TargetVersion) + accepting, dialing := libtopology.BasicPeeringTwoClustersSetup(t, utils.TargetVersion, false) var ( acceptingCluster = accepting.Cluster dialingCluster = dialing.Cluster diff --git a/test/integration/consul-container/test/upgrade/peering_control_plane_mgw_test.go b/test/integration/consul-container/test/upgrade/peering_control_plane_mgw_test.go index f4112b6f6b8..5ccba956773 100644 --- a/test/integration/consul-container/test/upgrade/peering_control_plane_mgw_test.go +++ b/test/integration/consul-container/test/upgrade/peering_control_plane_mgw_test.go @@ -42,7 +42,7 @@ func TestPeering_Upgrade_ControlPlane_MGW(t *testing.T) { } run := func(t *testing.T, tc testcase) { - accepting, dialing := libtopology.BasicPeeringTwoClustersSetup(t, tc.oldversion) + accepting, dialing := libtopology.BasicPeeringTwoClustersSetup(t, tc.oldversion, true) var ( acceptingCluster = accepting.Cluster dialingCluster = dialing.Cluster @@ -54,19 +54,6 @@ func TestPeering_Upgrade_ControlPlane_MGW(t *testing.T) { acceptingClient, err := acceptingCluster.GetClient(nil, false) require.NoError(t, err) - // Enable peering control plane traffic through mesh gateway - req := &api.MeshConfigEntry{ - Peering: &api.PeeringMeshConfig{ - PeerThroughMeshGateways: true, - }, - } - ok, _, err := dialingClient.ConfigEntries().Set(req, &api.WriteOptions{}) - require.True(t, ok) - require.NoError(t, err) - ok, _, err = acceptingClient.ConfigEntries().Set(req, &api.WriteOptions{}) - require.True(t, ok) - require.NoError(t, err) - // Verify control plane endpoints and traffic in gateway _, gatewayAdminPort := dialing.Gateway.GetAdminAddr() libassert.AssertUpstreamEndpointStatus(t, gatewayAdminPort, "server.dc1.peering", "HEALTHY", 1) @@ -74,6 +61,9 @@ func TestPeering_Upgrade_ControlPlane_MGW(t *testing.T) { libassert.AssertEnvoyMetricAtLeast(t, gatewayAdminPort, "cluster.static-server.default.default.accepting-to-dialer.external", "upstream_cx_total", 1) + libassert.AssertEnvoyMetricAtLeast(t, gatewayAdminPort, + "cluster.server.dc1.peering", + "upstream_cx_total", 1) // Upgrade the accepting cluster and assert peering is still ACTIVE require.NoError(t, acceptingCluster.StandardUpgrade(t, context.Background(), tc.targetVersion)) @@ -90,11 +80,12 @@ func TestPeering_Upgrade_ControlPlane_MGW(t *testing.T) { // - Register a new static-client service in dialing cluster and // - set upstream to static-server service in peered cluster - // Restart the gateway & proxy sidecar + // Stop the accepting gateway and restart dialing gateway + // to force peering control plane traffic through dialing mesh gateway + require.NoError(t, accepting.Gateway.Stop()) require.NoError(t, dialing.Gateway.Restart()) - require.NoError(t, dialing.Container.Restart()) - // Restarted gateway should not have any measurement on data plane traffic + // Restarted dialing gateway should not have any measurement on data plane traffic libassert.AssertEnvoyMetricAtMost(t, gatewayAdminPort, "cluster.static-server.default.default.accepting-to-dialer.external", "upstream_cx_total", 0) @@ -102,6 +93,7 @@ func TestPeering_Upgrade_ControlPlane_MGW(t *testing.T) { libassert.AssertEnvoyMetricAtLeast(t, gatewayAdminPort, "cluster.server.dc1.peering", "upstream_cx_total", 1) + require.NoError(t, accepting.Gateway.Start()) clientSidecarService, err := libservice.CreateAndRegisterStaticClientSidecar(dialingCluster.Servers()[0], libtopology.DialingPeerName, true) require.NoError(t, err) diff --git a/test/integration/consul-container/test/upgrade/peering_http_test.go b/test/integration/consul-container/test/upgrade/peering_http_test.go index aec03a3edb4..fe91f765309 100644 --- a/test/integration/consul-container/test/upgrade/peering_http_test.go +++ b/test/integration/consul-container/test/upgrade/peering_http_test.go @@ -99,7 +99,7 @@ func TestPeering_UpgradeToTarget_fromLatest(t *testing.T) { } run := func(t *testing.T, tc testcase) { - accepting, dialing := libtopology.BasicPeeringTwoClustersSetup(t, tc.oldversion) + accepting, dialing := libtopology.BasicPeeringTwoClustersSetup(t, tc.oldversion, false) var ( acceptingCluster = accepting.Cluster dialingCluster = dialing.Cluster From dd0ca4825c240b7b543391047c58a2757b7368f0 Mon Sep 17 00:00:00 2001 From: Nathan Coleman Date: Wed, 15 Feb 2023 11:06:44 -0500 Subject: [PATCH 004/262] Add inline-certificate as possible payload of config-entry wrapper (#16254) Co-authored-by: Andrew Stucki <3577250+andrewstucki@users.noreply.github.com> --- proto/pbconfigentry/config_entry.go | 16 + proto/pbconfigentry/config_entry.pb.go | 2225 ++++++++++++------------ proto/pbconfigentry/config_entry.proto | 1 + 3 files changed, 1141 insertions(+), 1101 deletions(-) diff --git a/proto/pbconfigentry/config_entry.go b/proto/pbconfigentry/config_entry.go index c570f9d35c6..4b36134794d 100644 --- a/proto/pbconfigentry/config_entry.go +++ b/proto/pbconfigentry/config_entry.go @@ -81,6 +81,14 @@ func ConfigEntryToStructs(s *ConfigEntry) structs.ConfigEntry { pbcommon.RaftIndexToStructs(s.RaftIndex, &target.RaftIndex) pbcommon.EnterpriseMetaToStructs(s.EnterpriseMeta, &target.EnterpriseMeta) return &target + case Kind_KindInlineCertificate: + var target structs.InlineCertificateConfigEntry + target.Name = s.Name + + InlineCertificateToStructs(s.GetInlineCertificate(), &target) + pbcommon.RaftIndexToStructs(s.RaftIndex, &target.RaftIndex) + pbcommon.EnterpriseMetaToStructs(s.EnterpriseMeta, &target.EnterpriseMeta) + return &target case Kind_KindServiceDefaults: var target structs.ServiceConfigEntry target.Name = s.Name @@ -177,6 +185,14 @@ func ConfigEntryFromStructs(s structs.ConfigEntry) *ConfigEntry { configEntry.Entry = &ConfigEntry_HTTPRoute{ HTTPRoute: &route, } + case *structs.InlineCertificateConfigEntry: + var cert InlineCertificate + InlineCertificateFromStructs(v, &cert) + + configEntry.Kind = Kind_KindInlineCertificate + configEntry.Entry = &ConfigEntry_InlineCertificate{ + InlineCertificate: &cert, + } default: panic(fmt.Sprintf("unable to convert %T to proto", s)) } diff --git a/proto/pbconfigentry/config_entry.pb.go b/proto/pbconfigentry/config_entry.pb.go index c929a21d5c5..4d9d292d7d4 100644 --- a/proto/pbconfigentry/config_entry.pb.go +++ b/proto/pbconfigentry/config_entry.pb.go @@ -575,6 +575,7 @@ type ConfigEntry struct { // *ConfigEntry_BoundAPIGateway // *ConfigEntry_TCPRoute // *ConfigEntry_HTTPRoute + // *ConfigEntry_InlineCertificate Entry isConfigEntry_Entry `protobuf_oneof:"Entry"` } @@ -708,6 +709,13 @@ func (x *ConfigEntry) GetHTTPRoute() *HTTPRoute { return nil } +func (x *ConfigEntry) GetInlineCertificate() *InlineCertificate { + if x, ok := x.GetEntry().(*ConfigEntry_InlineCertificate); ok { + return x.InlineCertificate + } + return nil +} + type isConfigEntry_Entry interface { isConfigEntry_Entry() } @@ -748,6 +756,10 @@ type ConfigEntry_HTTPRoute struct { HTTPRoute *HTTPRoute `protobuf:"bytes,13,opt,name=HTTPRoute,proto3,oneof"` } +type ConfigEntry_InlineCertificate struct { + InlineCertificate *InlineCertificate `protobuf:"bytes,14,opt,name=InlineCertificate,proto3,oneof"` +} + func (*ConfigEntry_MeshConfig) isConfigEntry_Entry() {} func (*ConfigEntry_ServiceResolver) isConfigEntry_Entry() {} @@ -766,6 +778,8 @@ func (*ConfigEntry_TCPRoute) isConfigEntry_Entry() {} func (*ConfigEntry_HTTPRoute) isConfigEntry_Entry() {} +func (*ConfigEntry_InlineCertificate) isConfigEntry_Entry() {} + // mog annotation: // // target=github.com/hashicorp/consul/agent/structs.MeshConfigEntry @@ -5310,7 +5324,7 @@ var file_proto_pbconfigentry_config_entry_proto_rawDesc = []byte{ 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1b, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x70, 0x62, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, - 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xd2, 0x08, + 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xbc, 0x09, 0x0a, 0x0b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x3f, 0x0a, 0x04, 0x4b, 0x69, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2b, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, @@ -5379,815 +5393,686 @@ var file_proto_pbconfigentry_config_entry_proto_rawDesc = []byte{ 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x48, 0x00, 0x52, 0x09, - 0x48, 0x54, 0x54, 0x50, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x42, 0x07, 0x0a, 0x05, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x22, 0xec, 0x03, 0x0a, 0x0a, 0x4d, 0x65, 0x73, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x12, 0x6d, 0x0a, 0x10, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, - 0x50, 0x72, 0x6f, 0x78, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x41, 0x2e, 0x68, 0x61, - 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, - 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, - 0x74, 0x72, 0x79, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x50, - 0x72, 0x6f, 0x78, 0x79, 0x4d, 0x65, 0x73, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x10, - 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x78, 0x79, - 0x12, 0x46, 0x0a, 0x03, 0x54, 0x4c, 0x53, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x34, 0x2e, - 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, - 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x4d, 0x65, 0x73, 0x68, 0x54, 0x4c, 0x53, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x52, 0x03, 0x54, 0x4c, 0x53, 0x12, 0x49, 0x0a, 0x04, 0x48, 0x54, 0x54, 0x50, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, - 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, - 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x4d, - 0x65, 0x73, 0x68, 0x48, 0x54, 0x54, 0x50, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x04, 0x48, - 0x54, 0x54, 0x50, 0x12, 0x4f, 0x0a, 0x04, 0x4d, 0x65, 0x74, 0x61, 0x18, 0x04, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x3b, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, - 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x4d, 0x65, 0x73, 0x68, 0x43, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, - 0x4d, 0x65, 0x74, 0x61, 0x12, 0x52, 0x0a, 0x07, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, + 0x48, 0x54, 0x54, 0x50, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x12, 0x68, 0x0a, 0x11, 0x49, 0x6e, 0x6c, + 0x69, 0x6e, 0x65, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x18, 0x0e, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, + 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, + 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x49, 0x6e, 0x6c, + 0x69, 0x6e, 0x65, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x48, 0x00, + 0x52, 0x11, 0x49, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, + 0x61, 0x74, 0x65, 0x42, 0x07, 0x0a, 0x05, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x22, 0xec, 0x03, 0x0a, + 0x0a, 0x4d, 0x65, 0x73, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x6d, 0x0a, 0x10, 0x54, + 0x72, 0x61, 0x6e, 0x73, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x41, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, - 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x50, 0x65, - 0x65, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x65, 0x73, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, - 0x07, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x1a, 0x37, 0x0a, 0x09, 0x4d, 0x65, 0x74, 0x61, - 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, 0x22, 0x50, 0x0a, 0x1a, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, - 0x50, 0x72, 0x6f, 0x78, 0x79, 0x4d, 0x65, 0x73, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, - 0x32, 0x0a, 0x14, 0x4d, 0x65, 0x73, 0x68, 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x4f, 0x6e, 0x6c, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x4d, - 0x65, 0x73, 0x68, 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x4f, - 0x6e, 0x6c, 0x79, 0x22, 0xc9, 0x01, 0x0a, 0x0d, 0x4d, 0x65, 0x73, 0x68, 0x54, 0x4c, 0x53, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x5b, 0x0a, 0x08, 0x49, 0x6e, 0x63, 0x6f, 0x6d, 0x69, 0x6e, - 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3f, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, + 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x54, 0x72, + 0x61, 0x6e, 0x73, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x4d, 0x65, + 0x73, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x10, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, + 0x61, 0x72, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x12, 0x46, 0x0a, 0x03, 0x54, 0x4c, + 0x53, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, - 0x4d, 0x65, 0x73, 0x68, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x54, - 0x4c, 0x53, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x08, 0x49, 0x6e, 0x63, 0x6f, 0x6d, 0x69, - 0x6e, 0x67, 0x12, 0x5b, 0x0a, 0x08, 0x4f, 0x75, 0x74, 0x67, 0x6f, 0x69, 0x6e, 0x67, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3f, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, - 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, - 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x4d, 0x65, 0x73, - 0x68, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x54, 0x4c, 0x53, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x08, 0x4f, 0x75, 0x74, 0x67, 0x6f, 0x69, 0x6e, 0x67, 0x22, - 0x8a, 0x01, 0x0a, 0x18, 0x4d, 0x65, 0x73, 0x68, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x61, 0x6c, 0x54, 0x4c, 0x53, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x24, 0x0a, 0x0d, - 0x54, 0x4c, 0x53, 0x4d, 0x69, 0x6e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0d, 0x54, 0x4c, 0x53, 0x4d, 0x69, 0x6e, 0x56, 0x65, 0x72, 0x73, 0x69, - 0x6f, 0x6e, 0x12, 0x24, 0x0a, 0x0d, 0x54, 0x4c, 0x53, 0x4d, 0x61, 0x78, 0x56, 0x65, 0x72, 0x73, - 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x54, 0x4c, 0x53, 0x4d, 0x61, - 0x78, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x22, 0x0a, 0x0c, 0x43, 0x69, 0x70, 0x68, - 0x65, 0x72, 0x53, 0x75, 0x69, 0x74, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, - 0x43, 0x69, 0x70, 0x68, 0x65, 0x72, 0x53, 0x75, 0x69, 0x74, 0x65, 0x73, 0x22, 0x54, 0x0a, 0x0e, - 0x4d, 0x65, 0x73, 0x68, 0x48, 0x54, 0x54, 0x50, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x42, - 0x0a, 0x1c, 0x53, 0x61, 0x6e, 0x69, 0x74, 0x69, 0x7a, 0x65, 0x58, 0x46, 0x6f, 0x72, 0x77, 0x61, - 0x72, 0x64, 0x65, 0x64, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x65, 0x72, 0x74, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x1c, 0x53, 0x61, 0x6e, 0x69, 0x74, 0x69, 0x7a, 0x65, 0x58, 0x46, - 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x65, 0x64, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x65, - 0x72, 0x74, 0x22, 0x4d, 0x0a, 0x11, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x65, 0x73, - 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x38, 0x0a, 0x17, 0x50, 0x65, 0x65, 0x72, 0x54, - 0x68, 0x72, 0x6f, 0x75, 0x67, 0x68, 0x4d, 0x65, 0x73, 0x68, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, - 0x79, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x17, 0x50, 0x65, 0x65, 0x72, 0x54, 0x68, - 0x72, 0x6f, 0x75, 0x67, 0x68, 0x4d, 0x65, 0x73, 0x68, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, - 0x73, 0x22, 0xf6, 0x06, 0x0a, 0x0f, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, - 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x12, 0x24, 0x0a, 0x0d, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, - 0x53, 0x75, 0x62, 0x73, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x44, 0x65, - 0x66, 0x61, 0x75, 0x6c, 0x74, 0x53, 0x75, 0x62, 0x73, 0x65, 0x74, 0x12, 0x5d, 0x0a, 0x07, 0x53, - 0x75, 0x62, 0x73, 0x65, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x43, 0x2e, 0x68, - 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, - 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, - 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x6f, - 0x6c, 0x76, 0x65, 0x72, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x65, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x07, 0x53, 0x75, 0x62, 0x73, 0x65, 0x74, 0x73, 0x12, 0x5a, 0x0a, 0x08, 0x52, 0x65, - 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3e, 0x2e, 0x68, - 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, - 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, - 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x6f, - 0x6c, 0x76, 0x65, 0x72, 0x52, 0x65, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x52, 0x08, 0x52, 0x65, - 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x12, 0x60, 0x0a, 0x08, 0x46, 0x61, 0x69, 0x6c, 0x6f, 0x76, - 0x65, 0x72, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x44, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, - 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, - 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, - 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, - 0x2e, 0x46, 0x61, 0x69, 0x6c, 0x6f, 0x76, 0x65, 0x72, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, - 0x46, 0x61, 0x69, 0x6c, 0x6f, 0x76, 0x65, 0x72, 0x12, 0x41, 0x0a, 0x0e, 0x43, 0x6f, 0x6e, 0x6e, - 0x65, 0x63, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x05, 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, 0x52, 0x0e, 0x43, 0x6f, 0x6e, - 0x6e, 0x65, 0x63, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x57, 0x0a, 0x0c, 0x4c, - 0x6f, 0x61, 0x64, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x33, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, - 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x4c, 0x6f, 0x61, 0x64, 0x42, 0x61, - 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x72, 0x52, 0x0c, 0x4c, 0x6f, 0x61, 0x64, 0x42, 0x61, 0x6c, 0x61, - 0x6e, 0x63, 0x65, 0x72, 0x12, 0x54, 0x0a, 0x04, 0x4d, 0x65, 0x74, 0x61, 0x18, 0x07, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x40, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, - 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x4d, 0x65, 0x74, 0x61, 0x1a, 0x78, 0x0a, 0x0c, 0x53, 0x75, - 0x62, 0x73, 0x65, 0x74, 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, 0x52, 0x0a, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3c, 0x2e, 0x68, 0x61, + 0x4d, 0x65, 0x73, 0x68, 0x54, 0x4c, 0x53, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x03, 0x54, + 0x4c, 0x53, 0x12, 0x49, 0x0a, 0x04, 0x48, 0x54, 0x54, 0x50, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x35, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, + 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x4d, 0x65, 0x73, 0x68, 0x48, 0x54, 0x54, + 0x50, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x04, 0x48, 0x54, 0x54, 0x50, 0x12, 0x4f, 0x0a, + 0x04, 0x4d, 0x65, 0x74, 0x61, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3b, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, - 0x74, 0x72, 0x79, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x6c, - 0x76, 0x65, 0x72, 0x53, 0x75, 0x62, 0x73, 0x65, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x7b, 0x0a, 0x0d, 0x46, 0x61, 0x69, 0x6c, 0x6f, 0x76, 0x65, 0x72, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x54, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3e, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, + 0x74, 0x72, 0x79, 0x2e, 0x4d, 0x65, 0x73, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x4d, + 0x65, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x52, + 0x0a, 0x07, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x38, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, + 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x4d, + 0x65, 0x73, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x07, 0x50, 0x65, 0x65, 0x72, 0x69, + 0x6e, 0x67, 0x1a, 0x37, 0x0a, 0x09, 0x4d, 0x65, 0x74, 0x61, 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, 0x22, 0x50, 0x0a, 0x1a, 0x54, + 0x72, 0x61, 0x6e, 0x73, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x4d, + 0x65, 0x73, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x32, 0x0a, 0x14, 0x4d, 0x65, 0x73, + 0x68, 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x4f, 0x6e, 0x6c, + 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x4d, 0x65, 0x73, 0x68, 0x44, 0x65, 0x73, + 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x4f, 0x6e, 0x6c, 0x79, 0x22, 0xc9, 0x01, + 0x0a, 0x0d, 0x4d, 0x65, 0x73, 0x68, 0x54, 0x4c, 0x53, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, + 0x5b, 0x0a, 0x08, 0x49, 0x6e, 0x63, 0x6f, 0x6d, 0x69, 0x6e, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x3f, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, + 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x4d, 0x65, 0x73, 0x68, 0x44, 0x69, + 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x54, 0x4c, 0x53, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x52, 0x08, 0x49, 0x6e, 0x63, 0x6f, 0x6d, 0x69, 0x6e, 0x67, 0x12, 0x5b, 0x0a, 0x08, + 0x4f, 0x75, 0x74, 0x67, 0x6f, 0x69, 0x6e, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3f, + 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, + 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x4d, 0x65, 0x73, 0x68, 0x44, 0x69, 0x72, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x54, 0x4c, 0x53, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, + 0x08, 0x4f, 0x75, 0x74, 0x67, 0x6f, 0x69, 0x6e, 0x67, 0x22, 0x8a, 0x01, 0x0a, 0x18, 0x4d, 0x65, + 0x73, 0x68, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x54, 0x4c, 0x53, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x24, 0x0a, 0x0d, 0x54, 0x4c, 0x53, 0x4d, 0x69, 0x6e, + 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x54, + 0x4c, 0x53, 0x4d, 0x69, 0x6e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x0a, 0x0d, + 0x54, 0x4c, 0x53, 0x4d, 0x61, 0x78, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0d, 0x54, 0x4c, 0x53, 0x4d, 0x61, 0x78, 0x56, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x12, 0x22, 0x0a, 0x0c, 0x43, 0x69, 0x70, 0x68, 0x65, 0x72, 0x53, 0x75, 0x69, 0x74, + 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x43, 0x69, 0x70, 0x68, 0x65, 0x72, + 0x53, 0x75, 0x69, 0x74, 0x65, 0x73, 0x22, 0x54, 0x0a, 0x0e, 0x4d, 0x65, 0x73, 0x68, 0x48, 0x54, + 0x54, 0x50, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x42, 0x0a, 0x1c, 0x53, 0x61, 0x6e, 0x69, + 0x74, 0x69, 0x7a, 0x65, 0x58, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x65, 0x64, 0x43, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x43, 0x65, 0x72, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x1c, + 0x53, 0x61, 0x6e, 0x69, 0x74, 0x69, 0x7a, 0x65, 0x58, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, + 0x65, 0x64, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x65, 0x72, 0x74, 0x22, 0x4d, 0x0a, 0x11, + 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x65, 0x73, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x12, 0x38, 0x0a, 0x17, 0x50, 0x65, 0x65, 0x72, 0x54, 0x68, 0x72, 0x6f, 0x75, 0x67, 0x68, + 0x4d, 0x65, 0x73, 0x68, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x73, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x17, 0x50, 0x65, 0x65, 0x72, 0x54, 0x68, 0x72, 0x6f, 0x75, 0x67, 0x68, 0x4d, + 0x65, 0x73, 0x68, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x73, 0x22, 0xf6, 0x06, 0x0a, 0x0f, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x12, + 0x24, 0x0a, 0x0d, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x53, 0x75, 0x62, 0x73, 0x65, 0x74, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x53, + 0x75, 0x62, 0x73, 0x65, 0x74, 0x12, 0x5d, 0x0a, 0x07, 0x53, 0x75, 0x62, 0x73, 0x65, 0x74, 0x73, + 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x43, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x46, 0x61, - 0x69, 0x6c, 0x6f, 0x76, 0x65, 0x72, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, - 0x01, 0x1a, 0x37, 0x0a, 0x09, 0x4d, 0x65, 0x74, 0x61, 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, 0x22, 0x51, 0x0a, 0x15, 0x53, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x53, 0x75, 0x62, - 0x73, 0x65, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x06, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x20, 0x0a, 0x0b, 0x4f, - 0x6e, 0x6c, 0x79, 0x50, 0x61, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x0b, 0x4f, 0x6e, 0x6c, 0x79, 0x50, 0x61, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x22, 0xc9, 0x01, - 0x0a, 0x17, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, - 0x72, 0x52, 0x65, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x53, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x53, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x75, - 0x62, 0x73, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x53, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x53, 0x75, 0x62, 0x73, 0x65, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x4e, 0x61, 0x6d, - 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x4e, 0x61, - 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x50, 0x61, 0x72, 0x74, 0x69, - 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x50, 0x61, 0x72, 0x74, - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x44, 0x61, 0x74, 0x61, 0x63, 0x65, 0x6e, - 0x74, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x44, 0x61, 0x74, 0x61, 0x63, - 0x65, 0x6e, 0x74, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x65, 0x65, 0x72, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x50, 0x65, 0x65, 0x72, 0x22, 0xf9, 0x01, 0x0a, 0x17, 0x53, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x46, 0x61, 0x69, - 0x6c, 0x6f, 0x76, 0x65, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, - 0x24, 0x0a, 0x0d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x75, 0x62, 0x73, 0x65, 0x74, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, - 0x75, 0x62, 0x73, 0x65, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x44, 0x61, 0x74, 0x61, 0x63, 0x65, 0x6e, 0x74, 0x65, - 0x72, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0b, 0x44, 0x61, 0x74, 0x61, 0x63, 0x65, - 0x6e, 0x74, 0x65, 0x72, 0x73, 0x12, 0x5e, 0x0a, 0x07, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, - 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x44, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x2e, 0x53, + 0x75, 0x62, 0x73, 0x65, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x53, 0x75, 0x62, + 0x73, 0x65, 0x74, 0x73, 0x12, 0x5a, 0x0a, 0x08, 0x52, 0x65, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3e, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x46, 0x61, - 0x69, 0x6c, 0x6f, 0x76, 0x65, 0x72, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x07, 0x54, 0x61, - 0x72, 0x67, 0x65, 0x74, 0x73, 0x22, 0xcf, 0x01, 0x0a, 0x1d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x46, 0x61, 0x69, 0x6c, 0x6f, 0x76, 0x65, - 0x72, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x75, 0x62, 0x73, - 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x53, 0x75, 0x62, 0x73, 0x65, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x50, 0x61, 0x72, 0x74, 0x69, - 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x50, 0x61, 0x72, 0x74, - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x44, 0x61, 0x74, 0x61, 0x63, 0x65, 0x6e, 0x74, 0x65, - 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x44, 0x61, 0x74, 0x61, 0x63, 0x65, 0x6e, - 0x74, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x65, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x50, 0x65, 0x65, 0x72, 0x22, 0xc7, 0x02, 0x0a, 0x0c, 0x4c, 0x6f, 0x61, 0x64, - 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x50, 0x6f, 0x6c, 0x69, - 0x63, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, - 0x12, 0x5d, 0x0a, 0x0e, 0x52, 0x69, 0x6e, 0x67, 0x48, 0x61, 0x73, 0x68, 0x43, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, - 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, - 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, - 0x2e, 0x52, 0x69, 0x6e, 0x67, 0x48, 0x61, 0x73, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, - 0x0e, 0x52, 0x69, 0x6e, 0x67, 0x48, 0x61, 0x73, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, - 0x69, 0x0a, 0x12, 0x4c, 0x65, 0x61, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x68, 0x61, - 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, - 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, - 0x74, 0x72, 0x79, 0x2e, 0x4c, 0x65, 0x61, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x12, 0x4c, 0x65, 0x61, 0x73, 0x74, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x55, 0x0a, 0x0c, 0x48, 0x61, - 0x73, 0x68, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x31, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, - 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x48, 0x61, 0x73, 0x68, 0x50, 0x6f, 0x6c, - 0x69, 0x63, 0x79, 0x52, 0x0c, 0x48, 0x61, 0x73, 0x68, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, - 0x73, 0x22, 0x64, 0x0a, 0x0e, 0x52, 0x69, 0x6e, 0x67, 0x48, 0x61, 0x73, 0x68, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x12, 0x28, 0x0a, 0x0f, 0x4d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x52, 0x69, - 0x6e, 0x67, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0f, 0x4d, 0x69, - 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x52, 0x69, 0x6e, 0x67, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x28, 0x0a, - 0x0f, 0x4d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x52, 0x69, 0x6e, 0x67, 0x53, 0x69, 0x7a, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0f, 0x4d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x52, - 0x69, 0x6e, 0x67, 0x53, 0x69, 0x7a, 0x65, 0x22, 0x36, 0x0a, 0x12, 0x4c, 0x65, 0x61, 0x73, 0x74, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x20, 0x0a, - 0x0b, 0x43, 0x68, 0x6f, 0x69, 0x63, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x0b, 0x43, 0x68, 0x6f, 0x69, 0x63, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, - 0xd3, 0x01, 0x0a, 0x0a, 0x48, 0x61, 0x73, 0x68, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x14, - 0x0a, 0x05, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x46, - 0x69, 0x65, 0x6c, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x56, 0x61, 0x6c, - 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x56, - 0x61, 0x6c, 0x75, 0x65, 0x12, 0x57, 0x0a, 0x0c, 0x43, 0x6f, 0x6f, 0x6b, 0x69, 0x65, 0x43, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x68, 0x61, 0x73, - 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, - 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, - 0x72, 0x79, 0x2e, 0x43, 0x6f, 0x6f, 0x6b, 0x69, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, - 0x0c, 0x43, 0x6f, 0x6f, 0x6b, 0x69, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x1a, 0x0a, - 0x08, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x50, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x08, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x50, 0x12, 0x1a, 0x0a, 0x08, 0x54, 0x65, 0x72, - 0x6d, 0x69, 0x6e, 0x61, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x54, 0x65, 0x72, - 0x6d, 0x69, 0x6e, 0x61, 0x6c, 0x22, 0x69, 0x0a, 0x0c, 0x43, 0x6f, 0x6f, 0x6b, 0x69, 0x65, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x18, 0x0a, 0x07, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, - 0x2b, 0x0a, 0x03, 0x54, 0x54, 0x4c, 0x18, 0x02, 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, 0x52, 0x03, 0x54, 0x54, 0x4c, 0x12, 0x12, 0x0a, 0x04, - 0x50, 0x61, 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x50, 0x61, 0x74, 0x68, - 0x22, 0x98, 0x03, 0x0a, 0x0e, 0x49, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x47, 0x61, 0x74, 0x65, - 0x77, 0x61, 0x79, 0x12, 0x49, 0x0a, 0x03, 0x54, 0x4c, 0x53, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x37, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, - 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, - 0x54, 0x4c, 0x53, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x03, 0x54, 0x4c, 0x53, 0x12, 0x54, - 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x36, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, - 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x49, 0x6e, 0x67, 0x72, 0x65, 0x73, - 0x73, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x65, - 0x6e, 0x65, 0x72, 0x73, 0x12, 0x53, 0x0a, 0x04, 0x4d, 0x65, 0x74, 0x61, 0x18, 0x03, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x3f, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x52, 0x65, + 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x52, 0x08, 0x52, 0x65, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, + 0x12, 0x60, 0x0a, 0x08, 0x46, 0x61, 0x69, 0x6c, 0x6f, 0x76, 0x65, 0x72, 0x18, 0x04, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x44, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x49, 0x6e, 0x67, 0x72, 0x65, - 0x73, 0x73, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x52, 0x04, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x57, 0x0a, 0x08, 0x44, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3b, 0x2e, 0x68, 0x61, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x2e, 0x46, 0x61, 0x69, 0x6c, 0x6f, + 0x76, 0x65, 0x72, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x46, 0x61, 0x69, 0x6c, 0x6f, 0x76, + 0x65, 0x72, 0x12, 0x41, 0x0a, 0x0e, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x54, 0x69, 0x6d, + 0x65, 0x6f, 0x75, 0x74, 0x18, 0x05, 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, 0x52, 0x0e, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x54, 0x69, + 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x57, 0x0a, 0x0c, 0x4c, 0x6f, 0x61, 0x64, 0x42, 0x61, 0x6c, + 0x61, 0x6e, 0x63, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, - 0x74, 0x72, 0x79, 0x2e, 0x49, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x08, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, - 0x74, 0x73, 0x1a, 0x37, 0x0a, 0x09, 0x4d, 0x65, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, + 0x74, 0x72, 0x79, 0x2e, 0x4c, 0x6f, 0x61, 0x64, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x72, + 0x52, 0x0c, 0x4c, 0x6f, 0x61, 0x64, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x72, 0x12, 0x54, + 0x0a, 0x04, 0x4d, 0x65, 0x74, 0x61, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x40, 0x2e, 0x68, + 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, + 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, + 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x6f, + 0x6c, 0x76, 0x65, 0x72, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, + 0x4d, 0x65, 0x74, 0x61, 0x1a, 0x78, 0x0a, 0x0c, 0x53, 0x75, 0x62, 0x73, 0x65, 0x74, 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, 0x52, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3c, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, + 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, + 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x53, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x53, 0x75, 0x62, + 0x73, 0x65, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x7b, + 0x0a, 0x0d, 0x46, 0x61, 0x69, 0x6c, 0x6f, 0x76, 0x65, 0x72, 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, 0x22, 0x8f, 0x02, 0x0a, 0x14, - 0x49, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x43, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x12, 0x26, 0x0a, 0x0e, 0x4d, 0x61, 0x78, 0x43, 0x6f, 0x6e, 0x6e, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0e, 0x4d, 0x61, - 0x78, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2e, 0x0a, 0x12, - 0x4d, 0x61, 0x78, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x12, 0x4d, 0x61, 0x78, 0x50, 0x65, 0x6e, - 0x64, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x12, 0x34, 0x0a, 0x15, - 0x4d, 0x61, 0x78, 0x43, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x15, 0x4d, 0x61, 0x78, - 0x43, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x73, 0x12, 0x69, 0x0a, 0x12, 0x50, 0x61, 0x73, 0x73, 0x69, 0x76, 0x65, 0x48, 0x65, 0x61, - 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x39, - 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, - 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x50, 0x61, 0x73, 0x73, 0x69, 0x76, 0x65, 0x48, 0x65, - 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x12, 0x50, 0x61, 0x73, 0x73, 0x69, - 0x76, 0x65, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x22, 0xea, 0x01, - 0x0a, 0x10, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x54, 0x4c, 0x53, 0x43, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x12, 0x18, 0x0a, 0x07, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x07, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x4c, 0x0a, 0x03, - 0x53, 0x44, 0x53, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x68, 0x61, 0x73, 0x68, - 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, - 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, - 0x79, 0x2e, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x54, 0x4c, 0x53, 0x53, 0x44, 0x53, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x03, 0x53, 0x44, 0x53, 0x12, 0x24, 0x0a, 0x0d, 0x54, 0x4c, - 0x53, 0x4d, 0x69, 0x6e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0d, 0x54, 0x4c, 0x53, 0x4d, 0x69, 0x6e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x12, 0x24, 0x0a, 0x0d, 0x54, 0x4c, 0x53, 0x4d, 0x61, 0x78, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x54, 0x4c, 0x53, 0x4d, 0x61, 0x78, 0x56, - 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x22, 0x0a, 0x0c, 0x43, 0x69, 0x70, 0x68, 0x65, 0x72, - 0x53, 0x75, 0x69, 0x74, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x43, 0x69, - 0x70, 0x68, 0x65, 0x72, 0x53, 0x75, 0x69, 0x74, 0x65, 0x73, 0x22, 0x5b, 0x0a, 0x13, 0x47, 0x61, - 0x74, 0x65, 0x77, 0x61, 0x79, 0x54, 0x4c, 0x53, 0x53, 0x44, 0x53, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x12, 0x20, 0x0a, 0x0b, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, - 0x61, 0x6d, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x43, 0x65, 0x72, 0x74, 0x52, 0x65, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x43, 0x65, 0x72, 0x74, 0x52, - 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x22, 0xdf, 0x01, 0x0a, 0x0f, 0x49, 0x6e, 0x67, 0x72, - 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x50, - 0x6f, 0x72, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x12, - 0x1a, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x51, 0x0a, 0x08, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x35, 0x2e, - 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, - 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x49, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x53, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x52, 0x08, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x49, - 0x0a, 0x03, 0x54, 0x4c, 0x53, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x68, 0x61, - 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, - 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, - 0x74, 0x72, 0x79, 0x2e, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x54, 0x4c, 0x53, 0x43, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x52, 0x03, 0x54, 0x4c, 0x53, 0x22, 0xb7, 0x06, 0x0a, 0x0e, 0x49, 0x6e, - 0x67, 0x72, 0x65, 0x73, 0x73, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, - 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, - 0x12, 0x14, 0x0a, 0x05, 0x48, 0x6f, 0x73, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, - 0x05, 0x48, 0x6f, 0x73, 0x74, 0x73, 0x12, 0x50, 0x0a, 0x03, 0x54, 0x4c, 0x53, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x3e, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, - 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, - 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x47, 0x61, 0x74, 0x65, - 0x77, 0x61, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x54, 0x4c, 0x53, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x52, 0x03, 0x54, 0x4c, 0x53, 0x12, 0x62, 0x0a, 0x0e, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x3a, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, + 0x79, 0x12, 0x54, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x3e, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x48, 0x65, 0x61, - 0x64, 0x65, 0x72, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x52, 0x0e, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x12, 0x64, 0x0a, 0x0f, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, - 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, - 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x48, 0x54, - 0x54, 0x50, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x72, - 0x73, 0x52, 0x0f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x65, 0x61, 0x64, 0x65, - 0x72, 0x73, 0x12, 0x53, 0x0a, 0x04, 0x4d, 0x65, 0x74, 0x61, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x3f, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x46, 0x61, 0x69, 0x6c, 0x6f, 0x76, 0x65, 0x72, + 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x37, 0x0a, 0x09, 0x4d, + 0x65, 0x74, 0x61, 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, 0x22, 0x51, 0x0a, 0x15, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, + 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x53, 0x75, 0x62, 0x73, 0x65, 0x74, 0x12, 0x16, 0x0a, + 0x06, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x46, + 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x20, 0x0a, 0x0b, 0x4f, 0x6e, 0x6c, 0x79, 0x50, 0x61, 0x73, + 0x73, 0x69, 0x6e, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x4f, 0x6e, 0x6c, 0x79, + 0x50, 0x61, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x22, 0xc9, 0x01, 0x0a, 0x17, 0x53, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x52, 0x65, 0x64, 0x69, 0x72, + 0x65, 0x63, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x24, 0x0a, + 0x0d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x75, 0x62, 0x73, 0x65, 0x74, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x75, 0x62, + 0x73, 0x65, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x1e, 0x0a, 0x0a, 0x44, 0x61, 0x74, 0x61, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0a, 0x44, 0x61, 0x74, 0x61, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x12, + 0x12, 0x0a, 0x04, 0x50, 0x65, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x50, + 0x65, 0x65, 0x72, 0x22, 0xf9, 0x01, 0x0a, 0x17, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, + 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x46, 0x61, 0x69, 0x6c, 0x6f, 0x76, 0x65, 0x72, 0x12, + 0x18, 0x0a, 0x07, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x07, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x53, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x53, 0x75, 0x62, 0x73, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x75, 0x62, 0x73, 0x65, 0x74, 0x12, + 0x1c, 0x0a, 0x09, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x09, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x20, 0x0a, + 0x0b, 0x44, 0x61, 0x74, 0x61, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x18, 0x04, 0x20, 0x03, + 0x28, 0x09, 0x52, 0x0b, 0x44, 0x61, 0x74, 0x61, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x12, + 0x5e, 0x0a, 0x07, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x44, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x49, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x04, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x58, 0x0a, 0x0e, 0x45, 0x6e, 0x74, 0x65, 0x72, - 0x70, 0x72, 0x69, 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x30, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, - 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, - 0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x4d, 0x65, 0x74, - 0x61, 0x52, 0x0e, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x4d, 0x65, 0x74, - 0x61, 0x12, 0x26, 0x0a, 0x0e, 0x4d, 0x61, 0x78, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0e, 0x4d, 0x61, 0x78, 0x43, 0x6f, - 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2e, 0x0a, 0x12, 0x4d, 0x61, 0x78, - 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x18, - 0x09, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x12, 0x4d, 0x61, 0x78, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, - 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x4d, 0x61, 0x78, - 0x43, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x15, 0x4d, 0x61, 0x78, 0x43, 0x6f, 0x6e, - 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x12, - 0x69, 0x0a, 0x12, 0x50, 0x61, 0x73, 0x73, 0x69, 0x76, 0x65, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, - 0x43, 0x68, 0x65, 0x63, 0x6b, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x68, 0x61, - 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, - 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, - 0x74, 0x72, 0x79, 0x2e, 0x50, 0x61, 0x73, 0x73, 0x69, 0x76, 0x65, 0x48, 0x65, 0x61, 0x6c, 0x74, - 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x12, 0x50, 0x61, 0x73, 0x73, 0x69, 0x76, 0x65, 0x48, - 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x1a, 0x37, 0x0a, 0x09, 0x4d, 0x65, - 0x74, 0x61, 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, 0x22, 0x67, 0x0a, 0x17, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x53, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x54, 0x4c, 0x53, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x4c, - 0x0a, 0x03, 0x53, 0x44, 0x53, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x68, 0x61, + 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x46, 0x61, 0x69, 0x6c, 0x6f, 0x76, 0x65, 0x72, + 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x07, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x22, + 0xcf, 0x01, 0x0a, 0x1d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x6c, + 0x76, 0x65, 0x72, 0x46, 0x61, 0x69, 0x6c, 0x6f, 0x76, 0x65, 0x72, 0x54, 0x61, 0x72, 0x67, 0x65, + 0x74, 0x12, 0x18, 0x0a, 0x07, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x07, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x53, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x75, 0x62, 0x73, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x75, 0x62, 0x73, 0x65, + 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x1c, 0x0a, 0x09, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x09, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1e, 0x0a, + 0x0a, 0x44, 0x61, 0x74, 0x61, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0a, 0x44, 0x61, 0x74, 0x61, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x12, 0x12, 0x0a, + 0x04, 0x50, 0x65, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x50, 0x65, 0x65, + 0x72, 0x22, 0xc7, 0x02, 0x0a, 0x0c, 0x4c, 0x6f, 0x61, 0x64, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, + 0x65, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x06, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x5d, 0x0a, 0x0e, 0x52, 0x69, + 0x6e, 0x67, 0x48, 0x61, 0x73, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, + 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x52, 0x69, 0x6e, 0x67, 0x48, + 0x61, 0x73, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x0e, 0x52, 0x69, 0x6e, 0x67, 0x48, + 0x61, 0x73, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x69, 0x0a, 0x12, 0x4c, 0x65, 0x61, + 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, + 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, + 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x4c, 0x65, + 0x61, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x52, 0x12, 0x4c, 0x65, 0x61, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x12, 0x55, 0x0a, 0x0c, 0x48, 0x61, 0x73, 0x68, 0x50, 0x6f, 0x6c, 0x69, + 0x63, 0x69, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x68, 0x61, 0x73, + 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, + 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, + 0x72, 0x79, 0x2e, 0x48, 0x61, 0x73, 0x68, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x0c, 0x48, + 0x61, 0x73, 0x68, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x22, 0x64, 0x0a, 0x0e, 0x52, + 0x69, 0x6e, 0x67, 0x48, 0x61, 0x73, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x28, 0x0a, + 0x0f, 0x4d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x52, 0x69, 0x6e, 0x67, 0x53, 0x69, 0x7a, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0f, 0x4d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x52, + 0x69, 0x6e, 0x67, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x4d, 0x61, 0x78, 0x69, 0x6d, + 0x75, 0x6d, 0x52, 0x69, 0x6e, 0x67, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x0f, 0x4d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x52, 0x69, 0x6e, 0x67, 0x53, 0x69, 0x7a, + 0x65, 0x22, 0x36, 0x0a, 0x12, 0x4c, 0x65, 0x61, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x20, 0x0a, 0x0b, 0x43, 0x68, 0x6f, 0x69, 0x63, + 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x43, 0x68, + 0x6f, 0x69, 0x63, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0xd3, 0x01, 0x0a, 0x0a, 0x48, 0x61, + 0x73, 0x68, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x46, 0x69, 0x65, 0x6c, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x1e, + 0x0a, 0x0a, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0a, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x57, + 0x0a, 0x0c, 0x43, 0x6f, 0x6f, 0x6b, 0x69, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, + 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, + 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x43, 0x6f, 0x6f, + 0x6b, 0x69, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x0c, 0x43, 0x6f, 0x6f, 0x6b, 0x69, + 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x1a, 0x0a, 0x08, 0x53, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x49, 0x50, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x53, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x49, 0x50, 0x12, 0x1a, 0x0a, 0x08, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x6c, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x6c, 0x22, + 0x69, 0x0a, 0x0c, 0x43, 0x6f, 0x6f, 0x6b, 0x69, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, + 0x18, 0x0a, 0x07, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x07, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2b, 0x0a, 0x03, 0x54, 0x54, 0x4c, + 0x18, 0x02, 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, 0x52, 0x03, 0x54, 0x54, 0x4c, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x61, 0x74, 0x68, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x50, 0x61, 0x74, 0x68, 0x22, 0x98, 0x03, 0x0a, 0x0e, 0x49, + 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x12, 0x49, 0x0a, + 0x03, 0x54, 0x4c, 0x53, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x68, 0x61, 0x73, + 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, + 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, + 0x72, 0x79, 0x2e, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x54, 0x4c, 0x53, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x52, 0x03, 0x54, 0x4c, 0x53, 0x12, 0x54, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, + 0x65, 0x6e, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, - 0x74, 0x72, 0x79, 0x2e, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x54, 0x4c, 0x53, 0x53, 0x44, - 0x53, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x03, 0x53, 0x44, 0x53, 0x22, 0xcb, 0x02, 0x0a, - 0x13, 0x48, 0x54, 0x54, 0x50, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x4d, 0x6f, 0x64, 0x69, 0x66, - 0x69, 0x65, 0x72, 0x73, 0x12, 0x55, 0x0a, 0x03, 0x41, 0x64, 0x64, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x43, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, - 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x48, 0x65, - 0x61, 0x64, 0x65, 0x72, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x2e, 0x41, 0x64, - 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x03, 0x41, 0x64, 0x64, 0x12, 0x55, 0x0a, 0x03, 0x53, - 0x65, 0x74, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x43, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, + 0x74, 0x72, 0x79, 0x2e, 0x49, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x65, + 0x6e, 0x65, 0x72, 0x52, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x73, 0x12, 0x53, + 0x0a, 0x04, 0x4d, 0x65, 0x74, 0x61, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3f, 0x2e, 0x68, + 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, + 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, + 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x49, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x47, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x4d, + 0x65, 0x74, 0x61, 0x12, 0x57, 0x0a, 0x08, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3b, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, + 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, + 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x49, 0x6e, + 0x67, 0x72, 0x65, 0x73, 0x73, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x52, 0x08, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x1a, 0x37, 0x0a, 0x09, + 0x4d, 0x65, 0x74, 0x61, 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, 0x22, 0x8f, 0x02, 0x0a, 0x14, 0x49, 0x6e, 0x67, 0x72, 0x65, 0x73, + 0x73, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x26, + 0x0a, 0x0e, 0x4d, 0x61, 0x78, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0e, 0x4d, 0x61, 0x78, 0x43, 0x6f, 0x6e, 0x6e, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2e, 0x0a, 0x12, 0x4d, 0x61, 0x78, 0x50, 0x65, 0x6e, + 0x64, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x12, 0x4d, 0x61, 0x78, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x4d, 0x61, 0x78, 0x43, 0x6f, 0x6e, + 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x15, 0x4d, 0x61, 0x78, 0x43, 0x6f, 0x6e, 0x63, 0x75, 0x72, + 0x72, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x12, 0x69, 0x0a, 0x12, + 0x50, 0x61, 0x73, 0x73, 0x69, 0x76, 0x65, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, + 0x63, 0x6b, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, - 0x2e, 0x48, 0x54, 0x54, 0x50, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x4d, 0x6f, 0x64, 0x69, 0x66, - 0x69, 0x65, 0x72, 0x73, 0x2e, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x03, 0x53, - 0x65, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x18, 0x03, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x06, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x1a, 0x36, 0x0a, 0x08, 0x41, 0x64, - 0x64, 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, 0x36, 0x0a, 0x08, 0x53, 0x65, 0x74, 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, 0x22, 0xf6, 0x01, 0x0a, 0x11, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x12, 0x50, 0x0a, 0x07, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x36, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, - 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x53, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x73, 0x12, 0x56, 0x0a, 0x04, 0x4d, 0x65, 0x74, 0x61, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x42, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, - 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x4d, 0x65, 0x74, 0x61, 0x1a, 0x37, 0x0a, 0x09, 0x4d, 0x65, - 0x74, 0x61, 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, 0x22, 0xa6, 0x06, 0x0a, 0x0f, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, - 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x4e, 0x0a, 0x06, 0x41, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x36, 0x2e, 0x68, 0x61, - 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, - 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, - 0x74, 0x72, 0x79, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x06, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x5c, 0x0a, 0x0b, 0x50, - 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x3a, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, - 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x69, - 0x6f, 0x6e, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x50, 0x65, - 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x50, 0x72, 0x65, - 0x63, 0x65, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x50, - 0x72, 0x65, 0x63, 0x65, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x4c, 0x65, 0x67, - 0x61, 0x63, 0x79, 0x49, 0x44, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x4c, 0x65, 0x67, - 0x61, 0x63, 0x79, 0x49, 0x44, 0x12, 0x4e, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x0e, 0x32, 0x3a, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, + 0x2e, 0x50, 0x61, 0x73, 0x73, 0x69, 0x76, 0x65, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, + 0x65, 0x63, 0x6b, 0x52, 0x12, 0x50, 0x61, 0x73, 0x73, 0x69, 0x76, 0x65, 0x48, 0x65, 0x61, 0x6c, + 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x22, 0xea, 0x01, 0x0a, 0x10, 0x47, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x54, 0x4c, 0x53, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x18, 0x0a, 0x07, + 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x45, + 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x4c, 0x0a, 0x03, 0x53, 0x44, 0x53, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, - 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x49, 0x6e, 0x74, 0x65, - 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, - 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x44, 0x65, 0x73, 0x63, - 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x66, 0x0a, 0x0a, 0x4c, 0x65, 0x67, 0x61, 0x63, - 0x79, 0x4d, 0x65, 0x74, 0x61, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x46, 0x2e, 0x68, 0x61, + 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x47, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x54, 0x4c, 0x53, 0x53, 0x44, 0x53, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, + 0x03, 0x53, 0x44, 0x53, 0x12, 0x24, 0x0a, 0x0d, 0x54, 0x4c, 0x53, 0x4d, 0x69, 0x6e, 0x56, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x54, 0x4c, 0x53, + 0x4d, 0x69, 0x6e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x0a, 0x0d, 0x54, 0x4c, + 0x53, 0x4d, 0x61, 0x78, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0d, 0x54, 0x4c, 0x53, 0x4d, 0x61, 0x78, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x12, 0x22, 0x0a, 0x0c, 0x43, 0x69, 0x70, 0x68, 0x65, 0x72, 0x53, 0x75, 0x69, 0x74, 0x65, 0x73, + 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x43, 0x69, 0x70, 0x68, 0x65, 0x72, 0x53, 0x75, + 0x69, 0x74, 0x65, 0x73, 0x22, 0x5b, 0x0a, 0x13, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x54, + 0x4c, 0x53, 0x53, 0x44, 0x53, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x20, 0x0a, 0x0b, 0x43, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0b, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x22, 0x0a, + 0x0c, 0x43, 0x65, 0x72, 0x74, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0c, 0x43, 0x65, 0x72, 0x74, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x22, 0xdf, 0x01, 0x0a, 0x0f, 0x49, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, + 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x50, 0x72, 0x6f, + 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x50, 0x72, 0x6f, + 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x51, 0x0a, 0x08, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, + 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, + 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, + 0x49, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x08, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x49, 0x0a, 0x03, 0x54, 0x4c, 0x53, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, + 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, + 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x47, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x54, 0x4c, 0x53, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x03, + 0x54, 0x4c, 0x53, 0x22, 0xb7, 0x06, 0x0a, 0x0e, 0x49, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x53, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x48, 0x6f, + 0x73, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x48, 0x6f, 0x73, 0x74, 0x73, + 0x12, 0x50, 0x0a, 0x03, 0x54, 0x4c, 0x53, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3e, 0x2e, + 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, + 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x53, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x54, 0x4c, 0x53, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x03, 0x54, + 0x4c, 0x53, 0x12, 0x62, 0x0a, 0x0e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x65, 0x61, + 0x64, 0x65, 0x72, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x68, 0x61, 0x73, + 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, + 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, + 0x72, 0x79, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x4d, 0x6f, 0x64, + 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x52, 0x0e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, + 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x12, 0x64, 0x0a, 0x0f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x3a, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, + 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x48, 0x65, 0x61, 0x64, + 0x65, 0x72, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x52, 0x0f, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x12, 0x53, 0x0a, 0x04, + 0x4d, 0x65, 0x74, 0x61, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3f, 0x2e, 0x68, 0x61, 0x73, + 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, + 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, + 0x72, 0x79, 0x2e, 0x49, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x4d, 0x65, 0x74, + 0x61, 0x12, 0x58, 0x0a, 0x0e, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x4d, + 0x65, 0x74, 0x61, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x68, 0x61, 0x73, 0x68, + 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, + 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x74, + 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x52, 0x0e, 0x45, 0x6e, 0x74, + 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x26, 0x0a, 0x0e, 0x4d, + 0x61, 0x78, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x08, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x0e, 0x4d, 0x61, 0x78, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x12, 0x2e, 0x0a, 0x12, 0x4d, 0x61, 0x78, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, + 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x12, 0x4d, 0x61, 0x78, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x4d, 0x61, 0x78, 0x43, 0x6f, 0x6e, 0x63, 0x75, 0x72, + 0x72, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x18, 0x0a, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x15, 0x4d, 0x61, 0x78, 0x43, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x12, 0x69, 0x0a, 0x12, 0x50, 0x61, 0x73, + 0x73, 0x69, 0x76, 0x65, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x18, + 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, + 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, + 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x50, 0x61, + 0x73, 0x73, 0x69, 0x76, 0x65, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, + 0x52, 0x12, 0x50, 0x61, 0x73, 0x73, 0x69, 0x76, 0x65, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, + 0x68, 0x65, 0x63, 0x6b, 0x1a, 0x37, 0x0a, 0x09, 0x4d, 0x65, 0x74, 0x61, 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, 0x22, 0x67, 0x0a, + 0x17, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x54, + 0x4c, 0x53, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x4c, 0x0a, 0x03, 0x53, 0x44, 0x53, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, + 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, + 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x47, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x54, 0x4c, 0x53, 0x53, 0x44, 0x53, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x52, 0x03, 0x53, 0x44, 0x53, 0x22, 0xcb, 0x02, 0x0a, 0x13, 0x48, 0x54, 0x54, 0x50, 0x48, + 0x65, 0x61, 0x64, 0x65, 0x72, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x12, 0x55, + 0x0a, 0x03, 0x41, 0x64, 0x64, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x43, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, - 0x74, 0x72, 0x79, 0x2e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x74, - 0x69, 0x6f, 0x6e, 0x2e, 0x4c, 0x65, 0x67, 0x61, 0x63, 0x79, 0x4d, 0x65, 0x74, 0x61, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x52, 0x0a, 0x4c, 0x65, 0x67, 0x61, 0x63, 0x79, 0x4d, 0x65, 0x74, 0x61, 0x12, - 0x46, 0x0a, 0x10, 0x4c, 0x65, 0x67, 0x61, 0x63, 0x79, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, - 0x69, 0x6d, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, - 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x10, 0x4c, 0x65, 0x67, 0x61, 0x63, 0x79, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x46, 0x0a, 0x10, 0x4c, 0x65, 0x67, 0x61, 0x63, - 0x79, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x10, 0x4c, - 0x65, 0x67, 0x61, 0x63, 0x79, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, - 0x58, 0x0a, 0x0e, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x4d, 0x65, 0x74, - 0x61, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, - 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, - 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x74, 0x65, 0x72, - 0x70, 0x72, 0x69, 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x52, 0x0e, 0x45, 0x6e, 0x74, 0x65, 0x72, - 0x70, 0x72, 0x69, 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x65, 0x65, - 0x72, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x50, 0x65, 0x65, 0x72, 0x1a, 0x3d, 0x0a, - 0x0f, 0x4c, 0x65, 0x67, 0x61, 0x63, 0x79, 0x4d, 0x65, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x74, 0x72, 0x79, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x4d, 0x6f, + 0x64, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x2e, 0x41, 0x64, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x52, 0x03, 0x41, 0x64, 0x64, 0x12, 0x55, 0x0a, 0x03, 0x53, 0x65, 0x74, 0x18, 0x02, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x43, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, + 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x48, + 0x65, 0x61, 0x64, 0x65, 0x72, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x2e, 0x53, + 0x65, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x03, 0x53, 0x65, 0x74, 0x12, 0x16, 0x0a, 0x06, + 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x52, 0x65, + 0x6d, 0x6f, 0x76, 0x65, 0x1a, 0x36, 0x0a, 0x08, 0x41, 0x64, 0x64, 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, 0x22, 0xb9, 0x01, 0x0a, - 0x13, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, - 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x4e, 0x0a, 0x06, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0e, 0x32, 0x36, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, - 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, - 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x49, 0x6e, 0x74, - 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x06, 0x41, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x52, 0x0a, 0x04, 0x48, 0x54, 0x54, 0x50, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x3e, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, - 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x6e, - 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x54, 0x54, 0x50, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, - 0x6f, 0x6e, 0x52, 0x04, 0x48, 0x54, 0x54, 0x50, 0x22, 0xed, 0x01, 0x0a, 0x17, 0x49, 0x6e, 0x74, - 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x54, 0x54, 0x50, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, - 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x50, 0x61, 0x74, 0x68, 0x45, 0x78, 0x61, 0x63, - 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x50, 0x61, 0x74, 0x68, 0x45, 0x78, 0x61, - 0x63, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x50, 0x61, 0x74, 0x68, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x50, 0x61, 0x74, 0x68, 0x50, 0x72, 0x65, 0x66, - 0x69, 0x78, 0x12, 0x1c, 0x0a, 0x09, 0x50, 0x61, 0x74, 0x68, 0x52, 0x65, 0x67, 0x65, 0x78, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x50, 0x61, 0x74, 0x68, 0x52, 0x65, 0x67, 0x65, 0x78, - 0x12, 0x5c, 0x0a, 0x06, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x44, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, - 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x69, - 0x6f, 0x6e, 0x48, 0x54, 0x54, 0x50, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x50, 0x65, 0x72, 0x6d, - 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x06, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x18, - 0x0a, 0x07, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, - 0x07, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x73, 0x22, 0xc1, 0x01, 0x0a, 0x1d, 0x49, 0x6e, 0x74, - 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x54, 0x54, 0x50, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, - 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, - 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x18, - 0x0a, 0x07, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x07, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x45, 0x78, 0x61, 0x63, - 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x45, 0x78, 0x61, 0x63, 0x74, 0x12, 0x16, - 0x0a, 0x06, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, - 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x12, 0x16, 0x0a, 0x06, 0x53, 0x75, 0x66, 0x66, 0x69, 0x78, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x53, 0x75, 0x66, 0x66, 0x69, 0x78, 0x12, 0x14, - 0x0a, 0x05, 0x52, 0x65, 0x67, 0x65, 0x78, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x52, - 0x65, 0x67, 0x65, 0x78, 0x12, 0x16, 0x0a, 0x06, 0x49, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x18, 0x07, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x49, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x22, 0xb6, 0x08, 0x0a, - 0x0f, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, - 0x12, 0x1a, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x44, 0x0a, 0x04, - 0x4d, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x30, 0x2e, 0x68, 0x61, 0x73, + 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x36, 0x0a, 0x08, + 0x53, 0x65, 0x74, 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, 0x22, 0xf6, 0x01, 0x0a, 0x11, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x50, 0x0a, 0x07, 0x53, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x68, 0x61, + 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, + 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, + 0x74, 0x72, 0x79, 0x2e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x12, 0x56, 0x0a, 0x04, + 0x4d, 0x65, 0x74, 0x61, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x42, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, - 0x72, 0x79, 0x2e, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x04, 0x4d, 0x6f, - 0x64, 0x65, 0x12, 0x69, 0x0a, 0x10, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x61, 0x72, 0x65, 0x6e, - 0x74, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3d, 0x2e, 0x68, - 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, - 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, - 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, - 0x50, 0x72, 0x6f, 0x78, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x10, 0x54, 0x72, 0x61, - 0x6e, 0x73, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x12, 0x5a, 0x0a, - 0x0b, 0x4d, 0x65, 0x73, 0x68, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, - 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x4d, 0x65, 0x73, 0x68, 0x47, - 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x0b, 0x4d, 0x65, - 0x73, 0x68, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x12, 0x4b, 0x0a, 0x06, 0x45, 0x78, 0x70, - 0x6f, 0x73, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x68, 0x61, 0x73, 0x68, - 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, - 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, - 0x79, 0x2e, 0x45, 0x78, 0x70, 0x6f, 0x73, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x06, - 0x45, 0x78, 0x70, 0x6f, 0x73, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, - 0x61, 0x6c, 0x53, 0x4e, 0x49, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x45, 0x78, 0x74, - 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x53, 0x4e, 0x49, 0x12, 0x64, 0x0a, 0x0e, 0x55, 0x70, 0x73, 0x74, - 0x72, 0x65, 0x61, 0x6d, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x3c, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, - 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x55, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, - 0x6d, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0e, - 0x55, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x5a, - 0x0a, 0x0b, 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x08, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, - 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, - 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x44, 0x65, 0x73, 0x74, - 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x0b, 0x44, - 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x34, 0x0a, 0x15, 0x4d, 0x61, - 0x78, 0x49, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x52, 0x15, 0x4d, 0x61, 0x78, 0x49, 0x6e, - 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x12, 0x34, 0x0a, 0x15, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, - 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x4d, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x15, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x54, 0x69, 0x6d, - 0x65, 0x6f, 0x75, 0x74, 0x4d, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x4d, 0x73, 0x18, - 0x0b, 0x20, 0x01, 0x28, 0x05, 0x52, 0x15, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x4d, 0x73, 0x12, 0x3c, 0x0a, 0x19, - 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x6f, - 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x19, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, - 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x54, 0x0a, 0x04, 0x4d, 0x65, - 0x74, 0x61, 0x18, 0x0d, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x40, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, - 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, - 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, - 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, - 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x4d, 0x65, 0x74, 0x61, - 0x12, 0x5a, 0x0a, 0x0f, 0x45, 0x6e, 0x76, 0x6f, 0x79, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, - 0x6f, 0x6e, 0x73, 0x18, 0x0e, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x68, 0x61, 0x73, 0x68, - 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, - 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x76, - 0x6f, 0x79, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x0f, 0x45, 0x6e, 0x76, - 0x6f, 0x79, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x37, 0x0a, 0x09, - 0x4d, 0x65, 0x74, 0x61, 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, 0x22, 0x74, 0x0a, 0x16, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x61, - 0x72, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, - 0x32, 0x0a, 0x14, 0x4f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x65, - 0x6e, 0x65, 0x72, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x14, 0x4f, - 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x50, - 0x6f, 0x72, 0x74, 0x12, 0x26, 0x0a, 0x0e, 0x44, 0x69, 0x61, 0x6c, 0x65, 0x64, 0x44, 0x69, 0x72, - 0x65, 0x63, 0x74, 0x6c, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x44, 0x69, 0x61, - 0x6c, 0x65, 0x64, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6c, 0x79, 0x22, 0x5f, 0x0a, 0x11, 0x4d, - 0x65, 0x73, 0x68, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x12, 0x4a, 0x0a, 0x04, 0x4d, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x36, - 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, - 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x4d, 0x65, 0x73, 0x68, 0x47, 0x61, 0x74, 0x65, 0x77, - 0x61, 0x79, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x04, 0x4d, 0x6f, 0x64, 0x65, 0x22, 0x6f, 0x0a, 0x0c, - 0x45, 0x78, 0x70, 0x6f, 0x73, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x16, 0x0a, 0x06, - 0x43, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x43, 0x68, - 0x65, 0x63, 0x6b, 0x73, 0x12, 0x47, 0x0a, 0x05, 0x50, 0x61, 0x74, 0x68, 0x73, 0x18, 0x02, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, - 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, - 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x45, 0x78, 0x70, 0x6f, - 0x73, 0x65, 0x50, 0x61, 0x74, 0x68, 0x52, 0x05, 0x50, 0x61, 0x74, 0x68, 0x73, 0x22, 0xb0, 0x01, - 0x0a, 0x0a, 0x45, 0x78, 0x70, 0x6f, 0x73, 0x65, 0x50, 0x61, 0x74, 0x68, 0x12, 0x22, 0x0a, 0x0c, - 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x0c, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x50, 0x6f, 0x72, 0x74, - 0x12, 0x12, 0x0a, 0x04, 0x50, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x50, 0x61, 0x74, 0x68, 0x12, 0x24, 0x0a, 0x0d, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x50, 0x61, 0x74, - 0x68, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x4c, 0x6f, 0x63, - 0x61, 0x6c, 0x50, 0x61, 0x74, 0x68, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x50, 0x72, - 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x50, 0x72, - 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x28, 0x0a, 0x0f, 0x50, 0x61, 0x72, 0x73, 0x65, 0x64, - 0x46, 0x72, 0x6f, 0x6d, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x0f, 0x50, 0x61, 0x72, 0x73, 0x65, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x43, 0x68, 0x65, 0x63, 0x6b, - 0x22, 0xbf, 0x01, 0x0a, 0x15, 0x55, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x53, 0x0a, 0x09, 0x4f, 0x76, - 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x35, 0x2e, + 0x72, 0x79, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, + 0x4d, 0x65, 0x74, 0x61, 0x1a, 0x37, 0x0a, 0x09, 0x4d, 0x65, 0x74, 0x61, 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, 0x22, 0xa6, 0x06, + 0x0a, 0x0f, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, + 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x4e, 0x0a, 0x06, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x36, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, + 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, + 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x49, 0x6e, + 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x06, 0x41, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x5c, 0x0a, 0x0b, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, + 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x68, 0x61, 0x73, + 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, + 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, + 0x72, 0x79, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x72, 0x6d, + 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, + 0x6f, 0x6e, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x50, 0x72, 0x65, 0x63, 0x65, 0x64, 0x65, 0x6e, 0x63, + 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x50, 0x72, 0x65, 0x63, 0x65, 0x64, 0x65, + 0x6e, 0x63, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x4c, 0x65, 0x67, 0x61, 0x63, 0x79, 0x49, 0x44, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x4c, 0x65, 0x67, 0x61, 0x63, 0x79, 0x49, 0x44, 0x12, + 0x4e, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x3a, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x55, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x43, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x52, 0x09, 0x4f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x73, 0x12, - 0x51, 0x0a, 0x08, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x35, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, - 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x55, 0x70, 0x73, 0x74, 0x72, 0x65, - 0x61, 0x6d, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x08, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, - 0x74, 0x73, 0x22, 0x8a, 0x05, 0x0a, 0x0e, 0x55, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x58, 0x0a, 0x0e, 0x45, 0x6e, 0x74, - 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x53, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, + 0x20, 0x0a, 0x0b, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x07, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x12, 0x66, 0x0a, 0x0a, 0x4c, 0x65, 0x67, 0x61, 0x63, 0x79, 0x4d, 0x65, 0x74, 0x61, 0x18, + 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x46, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, + 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, + 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x53, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x4c, 0x65, + 0x67, 0x61, 0x63, 0x79, 0x4d, 0x65, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x4c, + 0x65, 0x67, 0x61, 0x63, 0x79, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x46, 0x0a, 0x10, 0x4c, 0x65, 0x67, + 0x61, 0x63, 0x79, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x18, 0x09, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, + 0x10, 0x4c, 0x65, 0x67, 0x61, 0x63, 0x79, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, + 0x65, 0x12, 0x46, 0x0a, 0x10, 0x4c, 0x65, 0x67, 0x61, 0x63, 0x79, 0x55, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x54, 0x69, 0x6d, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x10, 0x4c, 0x65, 0x67, 0x61, 0x63, 0x79, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x58, 0x0a, 0x0e, 0x45, 0x6e, 0x74, + 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x52, 0x0e, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x4d, - 0x65, 0x74, 0x61, 0x12, 0x2c, 0x0a, 0x11, 0x45, 0x6e, 0x76, 0x6f, 0x79, 0x4c, 0x69, 0x73, 0x74, - 0x65, 0x6e, 0x65, 0x72, 0x4a, 0x53, 0x4f, 0x4e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, - 0x45, 0x6e, 0x76, 0x6f, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x4a, 0x53, 0x4f, - 0x4e, 0x12, 0x2a, 0x0a, 0x10, 0x45, 0x6e, 0x76, 0x6f, 0x79, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, - 0x72, 0x4a, 0x53, 0x4f, 0x4e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x45, 0x6e, 0x76, - 0x6f, 0x79, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4a, 0x53, 0x4f, 0x4e, 0x12, 0x1a, 0x0a, - 0x08, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x2a, 0x0a, 0x10, 0x43, 0x6f, 0x6e, - 0x6e, 0x65, 0x63, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x4d, 0x73, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x10, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x54, 0x69, 0x6d, 0x65, - 0x6f, 0x75, 0x74, 0x4d, 0x73, 0x12, 0x4d, 0x0a, 0x06, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x18, - 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, - 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, - 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x55, 0x70, - 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x52, 0x06, 0x4c, 0x69, - 0x6d, 0x69, 0x74, 0x73, 0x12, 0x69, 0x0a, 0x12, 0x50, 0x61, 0x73, 0x73, 0x69, 0x76, 0x65, 0x48, - 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x39, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, - 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x50, 0x61, 0x73, 0x73, 0x69, 0x76, 0x65, - 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x12, 0x50, 0x61, 0x73, - 0x73, 0x69, 0x76, 0x65, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x12, - 0x5a, 0x0a, 0x0b, 0x4d, 0x65, 0x73, 0x68, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x18, 0x09, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, - 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, - 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x4d, 0x65, 0x73, - 0x68, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x0b, - 0x4d, 0x65, 0x73, 0x68, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x12, 0x3e, 0x0a, 0x1a, 0x42, - 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x4f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x6f, - 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x1a, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x4f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, - 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x50, - 0x65, 0x65, 0x72, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x50, 0x65, 0x65, 0x72, 0x22, - 0x9e, 0x01, 0x0a, 0x0e, 0x55, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x4c, 0x69, 0x6d, 0x69, - 0x74, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x4d, 0x61, 0x78, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x4d, 0x61, 0x78, 0x43, - 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2e, 0x0a, 0x12, 0x4d, 0x61, - 0x78, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x12, 0x4d, 0x61, 0x78, 0x50, 0x65, 0x6e, 0x64, 0x69, - 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x4d, 0x61, - 0x78, 0x43, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x15, 0x4d, 0x61, 0x78, 0x43, 0x6f, - 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, - 0x22, 0xa7, 0x01, 0x0a, 0x12, 0x50, 0x61, 0x73, 0x73, 0x69, 0x76, 0x65, 0x48, 0x65, 0x61, 0x6c, - 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x12, 0x35, 0x0a, 0x08, 0x49, 0x6e, 0x74, 0x65, 0x72, - 0x76, 0x61, 0x6c, 0x18, 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, 0x52, 0x08, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x12, 0x20, - 0x0a, 0x0b, 0x4d, 0x61, 0x78, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x73, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x4d, 0x61, 0x78, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x73, - 0x12, 0x38, 0x0a, 0x17, 0x45, 0x6e, 0x66, 0x6f, 0x72, 0x63, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6e, - 0x73, 0x65, 0x63, 0x75, 0x74, 0x69, 0x76, 0x65, 0x35, 0x78, 0x78, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x0d, 0x52, 0x17, 0x45, 0x6e, 0x66, 0x6f, 0x72, 0x63, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6e, 0x73, - 0x65, 0x63, 0x75, 0x74, 0x69, 0x76, 0x65, 0x35, 0x78, 0x78, 0x22, 0x45, 0x0a, 0x11, 0x44, 0x65, - 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, - 0x1c, 0x0a, 0x09, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x09, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x12, 0x12, 0x0a, - 0x04, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x50, 0x6f, 0x72, - 0x74, 0x22, 0xb6, 0x02, 0x0a, 0x0a, 0x41, 0x50, 0x49, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, - 0x12, 0x4f, 0x0a, 0x04, 0x4d, 0x65, 0x74, 0x61, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3b, + 0x65, 0x74, 0x61, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x65, 0x65, 0x72, 0x18, 0x0c, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x50, 0x65, 0x65, 0x72, 0x1a, 0x3d, 0x0a, 0x0f, 0x4c, 0x65, 0x67, 0x61, 0x63, + 0x79, 0x4d, 0x65, 0x74, 0x61, 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, 0x22, 0xb9, 0x01, 0x0a, 0x13, 0x49, 0x6e, 0x74, 0x65, 0x6e, + 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x4e, + 0x0a, 0x06, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x36, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x41, 0x50, 0x49, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, - 0x79, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x4d, 0x65, 0x74, - 0x61, 0x12, 0x57, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x73, 0x18, 0x02, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, - 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, - 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x41, 0x50, 0x49, - 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, - 0x09, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x73, 0x12, 0x45, 0x0a, 0x06, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x68, 0x61, 0x73, + 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, + 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x06, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x52, + 0x0a, 0x04, 0x48, 0x54, 0x54, 0x50, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3e, 0x2e, 0x68, + 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, + 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, + 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x54, + 0x54, 0x50, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x04, 0x48, 0x54, + 0x54, 0x50, 0x22, 0xed, 0x01, 0x0a, 0x17, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, + 0x48, 0x54, 0x54, 0x50, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1c, + 0x0a, 0x09, 0x50, 0x61, 0x74, 0x68, 0x45, 0x78, 0x61, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x09, 0x50, 0x61, 0x74, 0x68, 0x45, 0x78, 0x61, 0x63, 0x74, 0x12, 0x1e, 0x0a, 0x0a, + 0x50, 0x61, 0x74, 0x68, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0a, 0x50, 0x61, 0x74, 0x68, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x12, 0x1c, 0x0a, 0x09, + 0x50, 0x61, 0x74, 0x68, 0x52, 0x65, 0x67, 0x65, 0x78, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x09, 0x50, 0x61, 0x74, 0x68, 0x52, 0x65, 0x67, 0x65, 0x78, 0x12, 0x5c, 0x0a, 0x06, 0x48, 0x65, + 0x61, 0x64, 0x65, 0x72, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x44, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, - 0x72, 0x79, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x1a, 0x37, 0x0a, 0x09, 0x4d, 0x65, 0x74, 0x61, 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, 0x22, 0x5a, 0x0a, 0x06, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x12, 0x50, 0x0a, 0x0a, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, - 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, - 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, - 0x2e, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x43, 0x6f, 0x6e, 0x64, - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x8b, 0x02, 0x0a, 0x09, 0x43, 0x6f, 0x6e, 0x64, 0x69, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x12, 0x16, 0x0a, 0x06, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x06, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x4d, 0x65, 0x73, 0x73, - 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x4d, 0x65, 0x73, 0x73, 0x61, - 0x67, 0x65, 0x12, 0x54, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, + 0x72, 0x79, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x54, 0x54, 0x50, + 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, + 0x52, 0x06, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x4d, 0x65, 0x74, 0x68, + 0x6f, 0x64, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x4d, 0x65, 0x74, 0x68, 0x6f, + 0x64, 0x73, 0x22, 0xc1, 0x01, 0x0a, 0x1d, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, + 0x48, 0x54, 0x54, 0x50, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, + 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x50, 0x72, 0x65, 0x73, + 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x50, 0x72, 0x65, 0x73, 0x65, + 0x6e, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x45, 0x78, 0x61, 0x63, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x45, 0x78, 0x61, 0x63, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x50, 0x72, 0x65, 0x66, + 0x69, 0x78, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, + 0x12, 0x16, 0x0a, 0x06, 0x53, 0x75, 0x66, 0x66, 0x69, 0x78, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x06, 0x53, 0x75, 0x66, 0x66, 0x69, 0x78, 0x12, 0x14, 0x0a, 0x05, 0x52, 0x65, 0x67, 0x65, + 0x78, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x52, 0x65, 0x67, 0x65, 0x78, 0x12, 0x16, + 0x0a, 0x06, 0x49, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, + 0x49, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x22, 0xb6, 0x08, 0x0a, 0x0f, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x50, 0x72, + 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x50, 0x72, + 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x44, 0x0a, 0x04, 0x4d, 0x6f, 0x64, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x30, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, - 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x52, 0x65, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x08, - 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x4a, 0x0a, 0x12, 0x4c, 0x61, 0x73, 0x74, - 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, - 0x52, 0x12, 0x4c, 0x61, 0x73, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, - 0x54, 0x69, 0x6d, 0x65, 0x22, 0x8c, 0x02, 0x0a, 0x12, 0x41, 0x50, 0x49, 0x47, 0x61, 0x74, 0x65, - 0x77, 0x61, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x4e, - 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, - 0x1a, 0x0a, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x50, - 0x6f, 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x12, - 0x5d, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x0e, 0x32, 0x41, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, - 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x41, 0x50, 0x49, 0x47, 0x61, 0x74, - 0x65, 0x77, 0x61, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x74, - 0x6f, 0x63, 0x6f, 0x6c, 0x52, 0x08, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x53, - 0x0a, 0x03, 0x54, 0x4c, 0x53, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x41, 0x2e, 0x68, 0x61, - 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, - 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, - 0x74, 0x72, 0x79, 0x2e, 0x41, 0x50, 0x49, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x54, 0x4c, - 0x53, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x03, - 0x54, 0x4c, 0x53, 0x22, 0xde, 0x01, 0x0a, 0x1a, 0x41, 0x50, 0x49, 0x47, 0x61, 0x74, 0x65, 0x77, - 0x61, 0x79, 0x54, 0x4c, 0x53, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x12, 0x5c, 0x0a, 0x0c, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, - 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, - 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, - 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, - 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x52, 0x0c, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, - 0x12, 0x1e, 0x0a, 0x0a, 0x4d, 0x69, 0x6e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x4d, 0x69, 0x6e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x12, 0x1e, 0x0a, 0x0a, 0x4d, 0x61, 0x78, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x4d, 0x61, 0x78, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x12, 0x22, 0x0a, 0x0c, 0x43, 0x69, 0x70, 0x68, 0x65, 0x72, 0x53, 0x75, 0x69, 0x74, 0x65, 0x73, - 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x43, 0x69, 0x70, 0x68, 0x65, 0x72, 0x53, 0x75, - 0x69, 0x74, 0x65, 0x73, 0x22, 0xb7, 0x01, 0x0a, 0x11, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x4b, 0x69, - 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x12, - 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, - 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x53, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, - 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x53, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x58, 0x0a, 0x0e, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, - 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x68, + 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x50, 0x72, 0x6f, + 0x78, 0x79, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x04, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x69, 0x0a, 0x10, + 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x78, 0x79, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3d, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, + 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, + 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x54, + 0x72, 0x61, 0x6e, 0x73, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x10, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x61, 0x72, 0x65, + 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x12, 0x5a, 0x0a, 0x0b, 0x4d, 0x65, 0x73, 0x68, 0x47, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, - 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, - 0x45, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x52, 0x0e, - 0x45, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x22, 0xfe, - 0x01, 0x0a, 0x0f, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x41, 0x50, 0x49, 0x47, 0x61, 0x74, 0x65, 0x77, - 0x61, 0x79, 0x12, 0x54, 0x0a, 0x04, 0x4d, 0x65, 0x74, 0x61, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x40, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, - 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x41, 0x50, - 0x49, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x52, 0x04, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x5c, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, - 0x65, 0x6e, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3e, 0x2e, 0x68, 0x61, - 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, - 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, - 0x74, 0x72, 0x79, 0x2e, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x41, 0x50, 0x49, 0x47, 0x61, 0x74, 0x65, - 0x77, 0x61, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x09, 0x4c, 0x69, 0x73, - 0x74, 0x65, 0x6e, 0x65, 0x72, 0x73, 0x1a, 0x37, 0x0a, 0x09, 0x4d, 0x65, 0x74, 0x61, 0x45, 0x6e, + 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, + 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x4d, 0x65, 0x73, 0x68, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x0b, 0x4d, 0x65, 0x73, 0x68, 0x47, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x12, 0x4b, 0x0a, 0x06, 0x45, 0x78, 0x70, 0x6f, 0x73, 0x65, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, + 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, + 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x45, 0x78, 0x70, 0x6f, + 0x73, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x06, 0x45, 0x78, 0x70, 0x6f, 0x73, 0x65, + 0x12, 0x20, 0x0a, 0x0b, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x53, 0x4e, 0x49, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x53, + 0x4e, 0x49, 0x12, 0x64, 0x0a, 0x0e, 0x55, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3c, 0x2e, 0x68, 0x61, 0x73, + 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, + 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, + 0x72, 0x79, 0x2e, 0x55, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0e, 0x55, 0x70, 0x73, 0x74, 0x72, 0x65, + 0x61, 0x6d, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x5a, 0x0a, 0x0b, 0x44, 0x65, 0x73, 0x74, + 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x38, 0x2e, + 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, + 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x0b, 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x34, 0x0a, 0x15, 0x4d, 0x61, 0x78, 0x49, 0x6e, 0x62, 0x6f, 0x75, + 0x6e, 0x64, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x09, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x15, 0x4d, 0x61, 0x78, 0x49, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, + 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x4c, 0x6f, + 0x63, 0x61, 0x6c, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, + 0x74, 0x4d, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x52, 0x15, 0x4c, 0x6f, 0x63, 0x61, 0x6c, + 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x4d, 0x73, + 0x12, 0x34, 0x0a, 0x15, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x4d, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x15, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x69, 0x6d, + 0x65, 0x6f, 0x75, 0x74, 0x4d, 0x73, 0x12, 0x3c, 0x0a, 0x19, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, + 0x65, 0x49, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x19, 0x42, 0x61, 0x6c, 0x61, 0x6e, + 0x63, 0x65, 0x49, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x54, 0x0a, 0x04, 0x4d, 0x65, 0x74, 0x61, 0x18, 0x0d, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x40, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, + 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x5a, 0x0a, 0x0f, 0x45, 0x6e, + 0x76, 0x6f, 0x79, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x0e, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, + 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, + 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x76, 0x6f, 0x79, 0x45, 0x78, 0x74, 0x65, + 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x0f, 0x45, 0x6e, 0x76, 0x6f, 0x79, 0x45, 0x78, 0x74, 0x65, + 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x37, 0x0a, 0x09, 0x4d, 0x65, 0x74, 0x61, 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, 0x22, - 0xdd, 0x01, 0x0a, 0x17, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x41, 0x50, 0x49, 0x47, 0x61, 0x74, 0x65, - 0x77, 0x61, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x4e, - 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, - 0x5c, 0x0a, 0x0c, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, 0x18, - 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, - 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, - 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x52, 0x65, - 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, - 0x0c, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, 0x12, 0x50, 0x0a, - 0x06, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x38, 0x2e, + 0x74, 0x0a, 0x16, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x50, 0x72, + 0x6f, 0x78, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x32, 0x0a, 0x14, 0x4f, 0x75, 0x74, + 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x50, 0x6f, 0x72, + 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x14, 0x4f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, + 0x64, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x26, 0x0a, + 0x0e, 0x44, 0x69, 0x61, 0x6c, 0x65, 0x64, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6c, 0x79, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x44, 0x69, 0x61, 0x6c, 0x65, 0x64, 0x44, 0x69, 0x72, + 0x65, 0x63, 0x74, 0x6c, 0x79, 0x22, 0x5f, 0x0a, 0x11, 0x4d, 0x65, 0x73, 0x68, 0x47, 0x61, 0x74, + 0x65, 0x77, 0x61, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x4a, 0x0a, 0x04, 0x4d, 0x6f, + 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x36, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, + 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, + 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, + 0x2e, 0x4d, 0x65, 0x73, 0x68, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x4d, 0x6f, 0x64, 0x65, + 0x52, 0x04, 0x4d, 0x6f, 0x64, 0x65, 0x22, 0x6f, 0x0a, 0x0c, 0x45, 0x78, 0x70, 0x6f, 0x73, 0x65, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x16, 0x0a, 0x06, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x73, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x12, 0x47, + 0x0a, 0x05, 0x50, 0x61, 0x74, 0x68, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, - 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x06, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x22, - 0xe6, 0x01, 0x0a, 0x11, 0x49, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, - 0x69, 0x63, 0x61, 0x74, 0x65, 0x12, 0x56, 0x0a, 0x04, 0x4d, 0x65, 0x74, 0x61, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x42, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, - 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, - 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x49, 0x6e, 0x6c, 0x69, - 0x6e, 0x65, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x2e, 0x4d, 0x65, - 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x20, 0x0a, - 0x0b, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0b, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x12, - 0x1e, 0x0a, 0x0a, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0a, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x1a, - 0x37, 0x0a, 0x09, 0x4d, 0x65, 0x74, 0x61, 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, 0x22, 0x99, 0x03, 0x0a, 0x09, 0x48, 0x54, 0x54, - 0x50, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x12, 0x4e, 0x0a, 0x04, 0x4d, 0x65, 0x74, 0x61, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, - 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, - 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x48, 0x54, 0x54, - 0x50, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x52, 0x04, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x52, 0x0a, 0x07, 0x50, 0x61, 0x72, 0x65, 0x6e, 0x74, - 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, + 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x45, 0x78, 0x70, 0x6f, 0x73, 0x65, 0x50, 0x61, 0x74, 0x68, + 0x52, 0x05, 0x50, 0x61, 0x74, 0x68, 0x73, 0x22, 0xb0, 0x01, 0x0a, 0x0a, 0x45, 0x78, 0x70, 0x6f, + 0x73, 0x65, 0x50, 0x61, 0x74, 0x68, 0x12, 0x22, 0x0a, 0x0c, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, + 0x65, 0x72, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x4c, 0x69, + 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x61, + 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x50, 0x61, 0x74, 0x68, 0x12, 0x24, + 0x0a, 0x0d, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x50, 0x61, 0x74, 0x68, 0x50, 0x6f, 0x72, 0x74, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x50, 0x61, 0x74, 0x68, + 0x50, 0x6f, 0x72, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, + 0x12, 0x28, 0x0a, 0x0f, 0x50, 0x61, 0x72, 0x73, 0x65, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x43, 0x68, + 0x65, 0x63, 0x6b, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x50, 0x61, 0x72, 0x73, 0x65, + 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x22, 0xbf, 0x01, 0x0a, 0x15, 0x55, + 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x53, 0x0a, 0x09, 0x4f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, - 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, - 0x65, 0x52, 0x07, 0x50, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x4a, 0x0a, 0x05, 0x52, 0x75, - 0x6c, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x68, 0x61, 0x73, 0x68, - 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, - 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, - 0x79, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x52, - 0x05, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x48, 0x6f, 0x73, 0x74, 0x6e, 0x61, - 0x6d, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x48, 0x6f, 0x73, 0x74, 0x6e, - 0x61, 0x6d, 0x65, 0x73, 0x12, 0x45, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x05, + 0x55, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x09, + 0x4f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x73, 0x12, 0x51, 0x0a, 0x08, 0x44, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x68, 0x61, + 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, + 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, + 0x74, 0x72, 0x79, 0x2e, 0x55, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x52, 0x08, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x22, 0x8a, 0x05, 0x0a, + 0x0e, 0x55, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, + 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, + 0x61, 0x6d, 0x65, 0x12, 0x58, 0x0a, 0x0e, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, + 0x65, 0x4d, 0x65, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x68, 0x61, + 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, + 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, + 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x52, 0x0e, 0x45, + 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x2c, 0x0a, + 0x11, 0x45, 0x6e, 0x76, 0x6f, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x4a, 0x53, + 0x4f, 0x4e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x45, 0x6e, 0x76, 0x6f, 0x79, 0x4c, + 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x4a, 0x53, 0x4f, 0x4e, 0x12, 0x2a, 0x0a, 0x10, 0x45, + 0x6e, 0x76, 0x6f, 0x79, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4a, 0x53, 0x4f, 0x4e, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x45, 0x6e, 0x76, 0x6f, 0x79, 0x43, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x4a, 0x53, 0x4f, 0x4e, 0x12, 0x1a, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x74, 0x6f, + 0x63, 0x6f, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x50, 0x72, 0x6f, 0x74, 0x6f, + 0x63, 0x6f, 0x6c, 0x12, 0x2a, 0x0a, 0x10, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x54, 0x69, + 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x4d, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x10, 0x43, + 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x4d, 0x73, 0x12, + 0x4d, 0x0a, 0x06, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x35, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, + 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x55, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, + 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x52, 0x06, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x12, 0x69, + 0x0a, 0x12, 0x50, 0x61, 0x73, 0x73, 0x69, 0x76, 0x65, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, + 0x68, 0x65, 0x63, 0x6b, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x68, 0x61, 0x73, + 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, + 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, + 0x72, 0x79, 0x2e, 0x50, 0x61, 0x73, 0x73, 0x69, 0x76, 0x65, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, + 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x12, 0x50, 0x61, 0x73, 0x73, 0x69, 0x76, 0x65, 0x48, 0x65, + 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x12, 0x5a, 0x0a, 0x0b, 0x4d, 0x65, 0x73, + 0x68, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x38, + 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, + 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x4d, 0x65, 0x73, 0x68, 0x47, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x0b, 0x4d, 0x65, 0x73, 0x68, 0x47, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x12, 0x3e, 0x0a, 0x1a, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, + 0x4f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x1a, 0x42, 0x61, 0x6c, 0x61, 0x6e, + 0x63, 0x65, 0x4f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x65, 0x65, 0x72, 0x18, 0x0b, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x50, 0x65, 0x65, 0x72, 0x22, 0x9e, 0x01, 0x0a, 0x0e, 0x55, 0x70, + 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x12, 0x26, 0x0a, 0x0e, + 0x4d, 0x61, 0x78, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x4d, 0x61, 0x78, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2e, 0x0a, 0x12, 0x4d, 0x61, 0x78, 0x50, 0x65, 0x6e, 0x64, 0x69, + 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x12, 0x4d, 0x61, 0x78, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x4d, 0x61, 0x78, 0x43, 0x6f, 0x6e, 0x63, 0x75, + 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x15, 0x4d, 0x61, 0x78, 0x43, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, + 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x22, 0xa7, 0x01, 0x0a, 0x12, 0x50, + 0x61, 0x73, 0x73, 0x69, 0x76, 0x65, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, + 0x6b, 0x12, 0x35, 0x0a, 0x08, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 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, 0x52, 0x08, + 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x12, 0x20, 0x0a, 0x0b, 0x4d, 0x61, 0x78, 0x46, + 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x4d, + 0x61, 0x78, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x73, 0x12, 0x38, 0x0a, 0x17, 0x45, 0x6e, + 0x66, 0x6f, 0x72, 0x63, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6e, 0x73, 0x65, 0x63, 0x75, 0x74, 0x69, + 0x76, 0x65, 0x35, 0x78, 0x78, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x17, 0x45, 0x6e, 0x66, + 0x6f, 0x72, 0x63, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6e, 0x73, 0x65, 0x63, 0x75, 0x74, 0x69, 0x76, + 0x65, 0x35, 0x78, 0x78, 0x22, 0x45, 0x0a, 0x11, 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x1c, 0x0a, 0x09, 0x41, 0x64, 0x64, + 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x41, 0x64, + 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x22, 0xb6, 0x02, 0x0a, 0x0a, + 0x41, 0x50, 0x49, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x12, 0x4f, 0x0a, 0x04, 0x4d, 0x65, + 0x74, 0x61, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3b, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, + 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, + 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, + 0x2e, 0x41, 0x50, 0x49, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4d, 0x65, 0x74, 0x61, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x57, 0x0a, 0x09, 0x4c, + 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x39, + 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, + 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x41, 0x50, 0x49, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, + 0x79, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x65, + 0x6e, 0x65, 0x72, 0x73, 0x12, 0x45, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x53, 0x74, 0x61, @@ -6195,249 +6080,385 @@ var file_proto_pbconfigentry_config_entry_proto_rawDesc = []byte{ 0x65, 0x74, 0x61, 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, 0x22, 0xf9, 0x01, 0x0a, 0x0d, 0x48, 0x54, 0x54, 0x50, 0x52, 0x6f, 0x75, - 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x4c, 0x0a, 0x07, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, - 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, - 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, - 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, - 0x48, 0x54, 0x54, 0x50, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x52, 0x07, 0x46, 0x69, 0x6c, - 0x74, 0x65, 0x72, 0x73, 0x12, 0x4a, 0x0a, 0x07, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x18, - 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, - 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, - 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x48, 0x54, - 0x54, 0x50, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x52, 0x07, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, - 0x12, 0x4e, 0x0a, 0x08, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, + 0x3a, 0x02, 0x38, 0x01, 0x22, 0x5a, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x50, + 0x0a, 0x0a, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x08, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, - 0x22, 0xc4, 0x02, 0x0a, 0x09, 0x48, 0x54, 0x54, 0x50, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x12, 0x50, - 0x0a, 0x07, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x36, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, - 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x48, 0x65, 0x61, 0x64, - 0x65, 0x72, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x52, 0x07, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, - 0x12, 0x4e, 0x0a, 0x06, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, - 0x32, 0x36, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, - 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x4d, 0x61, 0x74, - 0x63, 0x68, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x52, 0x06, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, - 0x12, 0x48, 0x0a, 0x04, 0x50, 0x61, 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x34, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x43, 0x6f, 0x6e, 0x64, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x22, 0x8b, 0x02, 0x0a, 0x09, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, + 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x54, 0x79, + 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x52, 0x65, + 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x52, 0x65, 0x61, 0x73, + 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x07, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x54, 0x0a, 0x08, + 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x50, 0x61, 0x74, 0x68, 0x4d, - 0x61, 0x74, 0x63, 0x68, 0x52, 0x04, 0x50, 0x61, 0x74, 0x68, 0x12, 0x4b, 0x0a, 0x05, 0x51, 0x75, - 0x65, 0x72, 0x79, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x68, 0x61, 0x73, 0x68, - 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, - 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, - 0x79, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4d, 0x61, 0x74, 0x63, 0x68, - 0x52, 0x05, 0x51, 0x75, 0x65, 0x72, 0x79, 0x22, 0x8d, 0x01, 0x0a, 0x0f, 0x48, 0x54, 0x54, 0x50, - 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x12, 0x50, 0x0a, 0x05, 0x4d, - 0x61, 0x74, 0x63, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x3a, 0x2e, 0x68, 0x61, 0x73, + 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, + 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x08, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x12, 0x4a, 0x0a, 0x12, 0x4c, 0x61, 0x73, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x12, 0x4c, 0x61, 0x73, 0x74, + 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x22, 0x8c, + 0x02, 0x0a, 0x12, 0x41, 0x50, 0x49, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x4c, 0x69, 0x73, + 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x48, 0x6f, 0x73, + 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x48, 0x6f, 0x73, + 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x5d, 0x0a, 0x08, 0x50, 0x72, 0x6f, + 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x41, 0x2e, 0x68, 0x61, + 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, + 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, + 0x74, 0x72, 0x79, 0x2e, 0x41, 0x50, 0x49, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x4c, 0x69, + 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x52, 0x08, + 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x53, 0x0a, 0x03, 0x54, 0x4c, 0x53, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x41, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, + 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, + 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x41, 0x50, + 0x49, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x54, 0x4c, 0x53, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x03, 0x54, 0x4c, 0x53, 0x22, 0xde, 0x01, + 0x0a, 0x1a, 0x41, 0x50, 0x49, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x54, 0x4c, 0x53, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x5c, 0x0a, 0x0c, + 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, + 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x0c, 0x43, 0x65, + 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x4d, 0x69, + 0x6e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, + 0x4d, 0x69, 0x6e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x4d, 0x61, + 0x78, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, + 0x4d, 0x61, 0x78, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x22, 0x0a, 0x0c, 0x43, 0x69, + 0x70, 0x68, 0x65, 0x72, 0x53, 0x75, 0x69, 0x74, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, + 0x52, 0x0c, 0x43, 0x69, 0x70, 0x68, 0x65, 0x72, 0x53, 0x75, 0x69, 0x74, 0x65, 0x73, 0x22, 0xb7, + 0x01, 0x0a, 0x11, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, + 0x65, 0x6e, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x4b, 0x69, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, + 0x53, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0b, 0x53, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x58, + 0x0a, 0x0e, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, + 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, + 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x70, + 0x72, 0x69, 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x52, 0x0e, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x70, + 0x72, 0x69, 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x22, 0xfe, 0x01, 0x0a, 0x0f, 0x42, 0x6f, 0x75, + 0x6e, 0x64, 0x41, 0x50, 0x49, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x12, 0x54, 0x0a, 0x04, + 0x4d, 0x65, 0x74, 0x61, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x40, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, - 0x72, 0x79, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x74, - 0x63, 0x68, 0x54, 0x79, 0x70, 0x65, 0x52, 0x05, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x12, 0x12, 0x0a, - 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, - 0x65, 0x12, 0x14, 0x0a, 0x05, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x75, 0x0a, 0x0d, 0x48, 0x54, 0x54, 0x50, 0x50, - 0x61, 0x74, 0x68, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x12, 0x4e, 0x0a, 0x05, 0x4d, 0x61, 0x74, 0x63, - 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x38, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, + 0x72, 0x79, 0x2e, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x41, 0x50, 0x49, 0x47, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x4d, 0x65, + 0x74, 0x61, 0x12, 0x5c, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x73, 0x18, + 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3e, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, + 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, + 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x42, 0x6f, + 0x75, 0x6e, 0x64, 0x41, 0x50, 0x49, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x4c, 0x69, 0x73, + 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x73, + 0x1a, 0x37, 0x0a, 0x09, 0x4d, 0x65, 0x74, 0x61, 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, 0x22, 0xdd, 0x01, 0x0a, 0x17, 0x42, 0x6f, + 0x75, 0x6e, 0x64, 0x41, 0x50, 0x49, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x4c, 0x69, 0x73, + 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x5c, 0x0a, 0x0c, 0x43, 0x65, 0x72, + 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x38, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, + 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x0c, 0x43, 0x65, 0x72, 0x74, 0x69, + 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, 0x12, 0x50, 0x0a, 0x06, 0x52, 0x6f, 0x75, 0x74, 0x65, + 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, - 0x48, 0x54, 0x54, 0x50, 0x50, 0x61, 0x74, 0x68, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x54, 0x79, 0x70, - 0x65, 0x52, 0x05, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x56, 0x61, 0x6c, 0x75, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x8b, - 0x01, 0x0a, 0x0e, 0x48, 0x54, 0x54, 0x50, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4d, 0x61, 0x74, 0x63, - 0x68, 0x12, 0x4f, 0x0a, 0x05, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, - 0x32, 0x39, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, - 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x51, 0x75, 0x65, - 0x72, 0x79, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x54, 0x79, 0x70, 0x65, 0x52, 0x05, 0x4d, 0x61, 0x74, - 0x63, 0x68, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x22, 0xb5, 0x01, 0x0a, - 0x0b, 0x48, 0x54, 0x54, 0x50, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x12, 0x51, 0x0a, 0x07, - 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x37, 0x2e, + 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, + 0x65, 0x52, 0x06, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x22, 0xe6, 0x01, 0x0a, 0x11, 0x49, 0x6e, + 0x6c, 0x69, 0x6e, 0x65, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x12, + 0x56, 0x0a, 0x04, 0x4d, 0x65, 0x74, 0x61, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x42, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, - 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x52, 0x07, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x12, - 0x53, 0x0a, 0x0b, 0x55, 0x52, 0x4c, 0x52, 0x65, 0x77, 0x72, 0x69, 0x74, 0x65, 0x73, 0x18, 0x02, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, - 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, - 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x55, 0x52, 0x4c, - 0x52, 0x65, 0x77, 0x72, 0x69, 0x74, 0x65, 0x52, 0x0b, 0x55, 0x52, 0x4c, 0x52, 0x65, 0x77, 0x72, - 0x69, 0x74, 0x65, 0x73, 0x22, 0x20, 0x0a, 0x0a, 0x55, 0x52, 0x4c, 0x52, 0x65, 0x77, 0x72, 0x69, - 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x50, 0x61, 0x74, 0x68, 0x22, 0xc2, 0x02, 0x0a, 0x10, 0x48, 0x54, 0x54, 0x50, 0x48, - 0x65, 0x61, 0x64, 0x65, 0x72, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x52, 0x0a, 0x03, 0x41, - 0x64, 0x64, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x40, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, - 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, - 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, - 0x2e, 0x48, 0x54, 0x54, 0x50, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x46, 0x69, 0x6c, 0x74, 0x65, - 0x72, 0x2e, 0x41, 0x64, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x03, 0x41, 0x64, 0x64, 0x12, - 0x16, 0x0a, 0x06, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, - 0x06, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x12, 0x52, 0x0a, 0x03, 0x53, 0x65, 0x74, 0x18, 0x03, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x40, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, - 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, - 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x48, 0x54, 0x54, - 0x50, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x2e, 0x53, 0x65, - 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x03, 0x53, 0x65, 0x74, 0x1a, 0x36, 0x0a, 0x08, 0x41, - 0x64, 0x64, 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, 0x36, 0x0a, 0x08, 0x53, 0x65, 0x74, 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, 0x22, 0xe1, 0x01, 0x0a, 0x0b, - 0x48, 0x54, 0x54, 0x50, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x4e, - 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, - 0x16, 0x0a, 0x06, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x06, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x4c, 0x0a, 0x07, 0x46, 0x69, 0x6c, 0x74, 0x65, - 0x72, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, - 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, - 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, - 0x2e, 0x48, 0x54, 0x54, 0x50, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x52, 0x07, 0x46, 0x69, - 0x6c, 0x74, 0x65, 0x72, 0x73, 0x12, 0x58, 0x0a, 0x0e, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, - 0x69, 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, - 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, - 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, - 0x2e, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x52, - 0x0e, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x22, - 0xfc, 0x02, 0x0a, 0x08, 0x54, 0x43, 0x50, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x12, 0x4d, 0x0a, 0x04, - 0x4d, 0x65, 0x74, 0x61, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x68, 0x61, 0x73, - 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, - 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, - 0x72, 0x79, 0x2e, 0x54, 0x43, 0x50, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x2e, 0x4d, 0x65, 0x74, 0x61, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x52, 0x0a, 0x07, 0x50, - 0x61, 0x72, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x68, - 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, - 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, - 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x66, - 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x07, 0x50, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x73, 0x12, - 0x4d, 0x0a, 0x08, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x31, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, + 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x49, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x43, 0x65, 0x72, 0x74, + 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x04, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x20, 0x0a, 0x0b, 0x43, 0x65, 0x72, 0x74, 0x69, + 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x43, 0x65, + 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x50, 0x72, 0x69, + 0x76, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x50, + 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x1a, 0x37, 0x0a, 0x09, 0x4d, 0x65, 0x74, + 0x61, 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, 0x22, 0x99, 0x03, 0x0a, 0x09, 0x48, 0x54, 0x54, 0x50, 0x52, 0x6f, 0x75, 0x74, 0x65, + 0x12, 0x4e, 0x0a, 0x04, 0x4d, 0x65, 0x74, 0x61, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3a, + 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, + 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x52, 0x6f, 0x75, 0x74, 0x65, + 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x4d, 0x65, 0x74, 0x61, + 0x12, 0x52, 0x0a, 0x07, 0x50, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x38, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x54, 0x43, 0x50, 0x53, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x52, 0x08, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x45, - 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, + 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x07, 0x50, 0x61, 0x72, + 0x65, 0x6e, 0x74, 0x73, 0x12, 0x4a, 0x0a, 0x05, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x18, 0x03, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, + 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, + 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x48, 0x54, 0x54, 0x50, + 0x52, 0x6f, 0x75, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x05, 0x52, 0x75, 0x6c, 0x65, 0x73, + 0x12, 0x1c, 0x0a, 0x09, 0x48, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x04, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x09, 0x48, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x45, + 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x1a, 0x37, 0x0a, 0x09, 0x4d, 0x65, 0x74, 0x61, 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, 0x22, 0x92, - 0x01, 0x0a, 0x0a, 0x54, 0x43, 0x50, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x12, 0x0a, - 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, - 0x65, 0x12, 0x16, 0x0a, 0x06, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x06, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x58, 0x0a, 0x0e, 0x45, 0x6e, 0x74, - 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x30, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xf9, + 0x01, 0x0a, 0x0d, 0x48, 0x54, 0x54, 0x50, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, + 0x12, 0x4c, 0x0a, 0x07, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x32, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, - 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x4d, - 0x65, 0x74, 0x61, 0x52, 0x0e, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x4d, - 0x65, 0x74, 0x61, 0x2a, 0xfd, 0x01, 0x0a, 0x04, 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x0f, 0x0a, 0x0b, - 0x4b, 0x69, 0x6e, 0x64, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, 0x12, 0x12, 0x0a, - 0x0e, 0x4b, 0x69, 0x6e, 0x64, 0x4d, 0x65, 0x73, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x10, - 0x01, 0x12, 0x17, 0x0a, 0x13, 0x4b, 0x69, 0x6e, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x10, 0x02, 0x12, 0x16, 0x0a, 0x12, 0x4b, 0x69, - 0x6e, 0x64, 0x49, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, - 0x10, 0x03, 0x12, 0x19, 0x0a, 0x15, 0x4b, 0x69, 0x6e, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x10, 0x04, 0x12, 0x17, 0x0a, - 0x13, 0x4b, 0x69, 0x6e, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x44, 0x65, 0x66, 0x61, - 0x75, 0x6c, 0x74, 0x73, 0x10, 0x05, 0x12, 0x19, 0x0a, 0x15, 0x4b, 0x69, 0x6e, 0x64, 0x49, 0x6e, - 0x6c, 0x69, 0x6e, 0x65, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x10, - 0x06, 0x12, 0x12, 0x0a, 0x0e, 0x4b, 0x69, 0x6e, 0x64, 0x41, 0x50, 0x49, 0x47, 0x61, 0x74, 0x65, - 0x77, 0x61, 0x79, 0x10, 0x07, 0x12, 0x17, 0x0a, 0x13, 0x4b, 0x69, 0x6e, 0x64, 0x42, 0x6f, 0x75, - 0x6e, 0x64, 0x41, 0x50, 0x49, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x10, 0x08, 0x12, 0x11, - 0x0a, 0x0d, 0x4b, 0x69, 0x6e, 0x64, 0x48, 0x54, 0x54, 0x50, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x10, - 0x09, 0x12, 0x10, 0x0a, 0x0c, 0x4b, 0x69, 0x6e, 0x64, 0x54, 0x43, 0x50, 0x52, 0x6f, 0x75, 0x74, - 0x65, 0x10, 0x0a, 0x2a, 0x26, 0x0a, 0x0f, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, - 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x08, 0x0a, 0x04, 0x44, 0x65, 0x6e, 0x79, 0x10, 0x00, - 0x12, 0x09, 0x0a, 0x05, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x10, 0x01, 0x2a, 0x21, 0x0a, 0x13, 0x49, - 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x79, - 0x70, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x10, 0x00, 0x2a, 0x50, - 0x0a, 0x09, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x14, 0x0a, 0x10, 0x50, - 0x72, 0x6f, 0x78, 0x79, 0x4d, 0x6f, 0x64, 0x65, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x10, - 0x00, 0x12, 0x18, 0x0a, 0x14, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x4d, 0x6f, 0x64, 0x65, 0x54, 0x72, - 0x61, 0x6e, 0x73, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x10, 0x01, 0x12, 0x13, 0x0a, 0x0f, 0x50, - 0x72, 0x6f, 0x78, 0x79, 0x4d, 0x6f, 0x64, 0x65, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x10, 0x02, - 0x2a, 0x7b, 0x0a, 0x0f, 0x4d, 0x65, 0x73, 0x68, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x4d, - 0x6f, 0x64, 0x65, 0x12, 0x1a, 0x0a, 0x16, 0x4d, 0x65, 0x73, 0x68, 0x47, 0x61, 0x74, 0x65, 0x77, - 0x61, 0x79, 0x4d, 0x6f, 0x64, 0x65, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x10, 0x00, 0x12, - 0x17, 0x0a, 0x13, 0x4d, 0x65, 0x73, 0x68, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x4d, 0x6f, - 0x64, 0x65, 0x4e, 0x6f, 0x6e, 0x65, 0x10, 0x01, 0x12, 0x18, 0x0a, 0x14, 0x4d, 0x65, 0x73, 0x68, - 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x4d, 0x6f, 0x64, 0x65, 0x4c, 0x6f, 0x63, 0x61, 0x6c, - 0x10, 0x02, 0x12, 0x19, 0x0a, 0x15, 0x4d, 0x65, 0x73, 0x68, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, - 0x79, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x10, 0x03, 0x2a, 0x4f, 0x0a, - 0x1a, 0x41, 0x50, 0x49, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x65, - 0x6e, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x18, 0x0a, 0x14, 0x4c, - 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x48, - 0x54, 0x54, 0x50, 0x10, 0x00, 0x12, 0x17, 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, - 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x54, 0x43, 0x50, 0x10, 0x01, 0x2a, 0x92, - 0x02, 0x0a, 0x0f, 0x48, 0x54, 0x54, 0x50, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x4d, 0x65, 0x74, 0x68, - 0x6f, 0x64, 0x12, 0x16, 0x0a, 0x12, 0x48, 0x54, 0x54, 0x50, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x4d, - 0x65, 0x74, 0x68, 0x6f, 0x64, 0x41, 0x6c, 0x6c, 0x10, 0x00, 0x12, 0x1a, 0x0a, 0x16, 0x48, 0x54, - 0x54, 0x50, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x43, 0x6f, 0x6e, - 0x6e, 0x65, 0x63, 0x74, 0x10, 0x01, 0x12, 0x19, 0x0a, 0x15, 0x48, 0x54, 0x54, 0x50, 0x4d, 0x61, - 0x74, 0x63, 0x68, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x10, - 0x02, 0x12, 0x16, 0x0a, 0x12, 0x48, 0x54, 0x54, 0x50, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x4d, 0x65, - 0x74, 0x68, 0x6f, 0x64, 0x47, 0x65, 0x74, 0x10, 0x03, 0x12, 0x17, 0x0a, 0x13, 0x48, 0x54, 0x54, - 0x50, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x48, 0x65, 0x61, 0x64, - 0x10, 0x04, 0x12, 0x1a, 0x0a, 0x16, 0x48, 0x54, 0x54, 0x50, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x4d, - 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x10, 0x05, 0x12, 0x18, - 0x0a, 0x14, 0x48, 0x54, 0x54, 0x50, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x4d, 0x65, 0x74, 0x68, 0x6f, - 0x64, 0x50, 0x61, 0x74, 0x63, 0x68, 0x10, 0x06, 0x12, 0x17, 0x0a, 0x13, 0x48, 0x54, 0x54, 0x50, - 0x4d, 0x61, 0x74, 0x63, 0x68, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x50, 0x6f, 0x73, 0x74, 0x10, - 0x07, 0x12, 0x16, 0x0a, 0x12, 0x48, 0x54, 0x54, 0x50, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x4d, 0x65, - 0x74, 0x68, 0x6f, 0x64, 0x50, 0x75, 0x74, 0x10, 0x08, 0x12, 0x18, 0x0a, 0x14, 0x48, 0x54, 0x54, - 0x50, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x54, 0x72, 0x61, 0x63, - 0x65, 0x10, 0x09, 0x2a, 0xa7, 0x01, 0x0a, 0x13, 0x48, 0x54, 0x54, 0x50, 0x48, 0x65, 0x61, 0x64, - 0x65, 0x72, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x54, 0x79, 0x70, 0x65, 0x12, 0x18, 0x0a, 0x14, 0x48, - 0x54, 0x54, 0x50, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x45, 0x78, - 0x61, 0x63, 0x74, 0x10, 0x00, 0x12, 0x19, 0x0a, 0x15, 0x48, 0x54, 0x54, 0x50, 0x48, 0x65, 0x61, - 0x64, 0x65, 0x72, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x10, 0x01, - 0x12, 0x1a, 0x0a, 0x16, 0x48, 0x54, 0x54, 0x50, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x4d, 0x61, - 0x74, 0x63, 0x68, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x10, 0x02, 0x12, 0x24, 0x0a, 0x20, - 0x48, 0x54, 0x54, 0x50, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x52, - 0x65, 0x67, 0x75, 0x6c, 0x61, 0x72, 0x45, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, - 0x10, 0x03, 0x12, 0x19, 0x0a, 0x15, 0x48, 0x54, 0x54, 0x50, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, - 0x4d, 0x61, 0x74, 0x63, 0x68, 0x53, 0x75, 0x66, 0x66, 0x69, 0x78, 0x10, 0x04, 0x2a, 0x68, 0x0a, - 0x11, 0x48, 0x54, 0x54, 0x50, 0x50, 0x61, 0x74, 0x68, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x54, 0x79, - 0x70, 0x65, 0x12, 0x16, 0x0a, 0x12, 0x48, 0x54, 0x54, 0x50, 0x50, 0x61, 0x74, 0x68, 0x4d, 0x61, - 0x74, 0x63, 0x68, 0x45, 0x78, 0x61, 0x63, 0x74, 0x10, 0x00, 0x12, 0x17, 0x0a, 0x13, 0x48, 0x54, - 0x54, 0x50, 0x50, 0x61, 0x74, 0x68, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x50, 0x72, 0x65, 0x66, 0x69, - 0x78, 0x10, 0x01, 0x12, 0x22, 0x0a, 0x1e, 0x48, 0x54, 0x54, 0x50, 0x50, 0x61, 0x74, 0x68, 0x4d, - 0x61, 0x74, 0x63, 0x68, 0x52, 0x65, 0x67, 0x75, 0x6c, 0x61, 0x72, 0x45, 0x78, 0x70, 0x72, 0x65, - 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x10, 0x03, 0x2a, 0x6d, 0x0a, 0x12, 0x48, 0x54, 0x54, 0x50, 0x51, - 0x75, 0x65, 0x72, 0x79, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x54, 0x79, 0x70, 0x65, 0x12, 0x17, 0x0a, - 0x13, 0x48, 0x54, 0x54, 0x50, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x45, - 0x78, 0x61, 0x63, 0x74, 0x10, 0x00, 0x12, 0x19, 0x0a, 0x15, 0x48, 0x54, 0x54, 0x50, 0x51, 0x75, - 0x65, 0x72, 0x79, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x10, - 0x01, 0x12, 0x23, 0x0a, 0x1f, 0x48, 0x54, 0x54, 0x50, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4d, 0x61, - 0x74, 0x63, 0x68, 0x52, 0x65, 0x67, 0x75, 0x6c, 0x61, 0x72, 0x45, 0x78, 0x70, 0x72, 0x65, 0x73, - 0x73, 0x69, 0x6f, 0x6e, 0x10, 0x03, 0x42, 0xa6, 0x02, 0x0a, 0x29, 0x63, 0x6f, 0x6d, 0x2e, 0x68, + 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x46, 0x69, + 0x6c, 0x74, 0x65, 0x72, 0x73, 0x52, 0x07, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x12, 0x4a, + 0x0a, 0x07, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x30, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, + 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x4d, 0x61, 0x74, 0x63, + 0x68, 0x52, 0x07, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x12, 0x4e, 0x0a, 0x08, 0x53, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, - 0x6e, 0x74, 0x72, 0x79, 0x42, 0x10, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x2f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, - 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2f, 0x63, - 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x70, 0x62, 0x63, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0xa2, 0x02, 0x04, 0x48, 0x43, 0x49, 0x43, - 0xaa, 0x02, 0x25, 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x43, 0x6f, 0x6e, - 0x73, 0x75, 0x6c, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0xca, 0x02, 0x25, 0x48, 0x61, 0x73, 0x68, 0x69, - 0x63, 0x6f, 0x72, 0x70, 0x5c, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x5c, 0x49, 0x6e, 0x74, 0x65, - 0x72, 0x6e, 0x61, 0x6c, 0x5c, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, - 0xe2, 0x02, 0x31, 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x5c, 0x43, 0x6f, 0x6e, - 0x73, 0x75, 0x6c, 0x5c, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5c, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, - 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x28, 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, - 0x3a, 0x3a, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x3a, 0x3a, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, - 0x61, 0x6c, 0x3a, 0x3a, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x62, - 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x52, 0x08, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x22, 0xc4, 0x02, 0x0a, 0x09, 0x48, + 0x54, 0x54, 0x50, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x12, 0x50, 0x0a, 0x07, 0x48, 0x65, 0x61, 0x64, + 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x68, 0x61, 0x73, 0x68, + 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, + 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, + 0x79, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x74, 0x63, + 0x68, 0x52, 0x07, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x12, 0x4e, 0x0a, 0x06, 0x4d, 0x65, + 0x74, 0x68, 0x6f, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x36, 0x2e, 0x68, 0x61, 0x73, + 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, + 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, + 0x72, 0x79, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x4d, 0x65, 0x74, 0x68, + 0x6f, 0x64, 0x52, 0x06, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, 0x48, 0x0a, 0x04, 0x50, 0x61, + 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, + 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, + 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, + 0x2e, 0x48, 0x54, 0x54, 0x50, 0x50, 0x61, 0x74, 0x68, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x52, 0x04, + 0x50, 0x61, 0x74, 0x68, 0x12, 0x4b, 0x0a, 0x05, 0x51, 0x75, 0x65, 0x72, 0x79, 0x18, 0x04, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, + 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, + 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x48, 0x54, 0x54, 0x50, + 0x51, 0x75, 0x65, 0x72, 0x79, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x52, 0x05, 0x51, 0x75, 0x65, 0x72, + 0x79, 0x22, 0x8d, 0x01, 0x0a, 0x0f, 0x48, 0x54, 0x54, 0x50, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, + 0x4d, 0x61, 0x74, 0x63, 0x68, 0x12, 0x50, 0x0a, 0x05, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x3a, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, + 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, + 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x48, 0x54, 0x54, + 0x50, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x54, 0x79, 0x70, 0x65, + 0x52, 0x05, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x56, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x56, 0x61, 0x6c, 0x75, + 0x65, 0x22, 0x75, 0x0a, 0x0d, 0x48, 0x54, 0x54, 0x50, 0x50, 0x61, 0x74, 0x68, 0x4d, 0x61, 0x74, + 0x63, 0x68, 0x12, 0x4e, 0x0a, 0x05, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x38, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, + 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x50, 0x61, + 0x74, 0x68, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x54, 0x79, 0x70, 0x65, 0x52, 0x05, 0x4d, 0x61, 0x74, + 0x63, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x8b, 0x01, 0x0a, 0x0e, 0x48, 0x54, 0x54, + 0x50, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x12, 0x4f, 0x0a, 0x05, 0x4d, + 0x61, 0x74, 0x63, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x39, 0x2e, 0x68, 0x61, 0x73, + 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, + 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, + 0x72, 0x79, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4d, 0x61, 0x74, 0x63, + 0x68, 0x54, 0x79, 0x70, 0x65, 0x52, 0x05, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x12, 0x12, 0x0a, 0x04, + 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, + 0x12, 0x14, 0x0a, 0x05, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x22, 0xb5, 0x01, 0x0a, 0x0b, 0x48, 0x54, 0x54, 0x50, 0x46, + 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x12, 0x51, 0x0a, 0x07, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, + 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, + 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, + 0x48, 0x54, 0x54, 0x50, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, + 0x52, 0x07, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x12, 0x53, 0x0a, 0x0b, 0x55, 0x52, 0x4c, + 0x52, 0x65, 0x77, 0x72, 0x69, 0x74, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x31, + 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, + 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x55, 0x52, 0x4c, 0x52, 0x65, 0x77, 0x72, 0x69, 0x74, + 0x65, 0x52, 0x0b, 0x55, 0x52, 0x4c, 0x52, 0x65, 0x77, 0x72, 0x69, 0x74, 0x65, 0x73, 0x22, 0x20, + 0x0a, 0x0a, 0x55, 0x52, 0x4c, 0x52, 0x65, 0x77, 0x72, 0x69, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, + 0x50, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x50, 0x61, 0x74, 0x68, + 0x22, 0xc2, 0x02, 0x0a, 0x10, 0x48, 0x54, 0x54, 0x50, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x46, + 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x52, 0x0a, 0x03, 0x41, 0x64, 0x64, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x40, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, + 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x48, + 0x65, 0x61, 0x64, 0x65, 0x72, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x2e, 0x41, 0x64, 0x64, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x52, 0x03, 0x41, 0x64, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x52, 0x65, 0x6d, + 0x6f, 0x76, 0x65, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x52, 0x65, 0x6d, 0x6f, 0x76, + 0x65, 0x12, 0x52, 0x0a, 0x03, 0x53, 0x65, 0x74, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x40, + 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, + 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x48, 0x65, 0x61, 0x64, 0x65, + 0x72, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x2e, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x52, 0x03, 0x53, 0x65, 0x74, 0x1a, 0x36, 0x0a, 0x08, 0x41, 0x64, 0x64, 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, 0x36, 0x0a, + 0x08, 0x53, 0x65, 0x74, 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, 0x22, 0xe1, 0x01, 0x0a, 0x0b, 0x48, 0x54, 0x54, 0x50, 0x53, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x57, 0x65, 0x69, + 0x67, 0x68, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x57, 0x65, 0x69, 0x67, 0x68, + 0x74, 0x12, 0x4c, 0x0a, 0x07, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, + 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x46, + 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x52, 0x07, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x12, + 0x58, 0x0a, 0x0e, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x4d, 0x65, 0x74, + 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, + 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, + 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x74, 0x65, 0x72, + 0x70, 0x72, 0x69, 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x52, 0x0e, 0x45, 0x6e, 0x74, 0x65, 0x72, + 0x70, 0x72, 0x69, 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x22, 0xfc, 0x02, 0x0a, 0x08, 0x54, 0x43, + 0x50, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x12, 0x4d, 0x0a, 0x04, 0x4d, 0x65, 0x74, 0x61, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, + 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, + 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x54, 0x43, 0x50, + 0x52, 0x6f, 0x75, 0x74, 0x65, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, + 0x04, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x52, 0x0a, 0x07, 0x50, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x73, + 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, + 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, + 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x52, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, + 0x52, 0x07, 0x50, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x4d, 0x0a, 0x08, 0x53, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x68, 0x61, + 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, + 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, + 0x74, 0x72, 0x79, 0x2e, 0x54, 0x43, 0x50, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x08, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x45, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, + 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, + 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, + 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x1a, + 0x37, 0x0a, 0x09, 0x4d, 0x65, 0x74, 0x61, 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, 0x22, 0x92, 0x01, 0x0a, 0x0a, 0x54, 0x43, 0x50, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x57, + 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x57, 0x65, 0x69, + 0x67, 0x68, 0x74, 0x12, 0x58, 0x0a, 0x0e, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, + 0x65, 0x4d, 0x65, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x68, 0x61, + 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, + 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, + 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x52, 0x0e, 0x45, + 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x2a, 0xfd, 0x01, + 0x0a, 0x04, 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x0f, 0x0a, 0x0b, 0x4b, 0x69, 0x6e, 0x64, 0x55, 0x6e, + 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e, 0x4b, 0x69, 0x6e, 0x64, 0x4d, + 0x65, 0x73, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x10, 0x01, 0x12, 0x17, 0x0a, 0x13, 0x4b, + 0x69, 0x6e, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, + 0x65, 0x72, 0x10, 0x02, 0x12, 0x16, 0x0a, 0x12, 0x4b, 0x69, 0x6e, 0x64, 0x49, 0x6e, 0x67, 0x72, + 0x65, 0x73, 0x73, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x10, 0x03, 0x12, 0x19, 0x0a, 0x15, + 0x4b, 0x69, 0x6e, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x74, 0x65, 0x6e, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x10, 0x04, 0x12, 0x17, 0x0a, 0x13, 0x4b, 0x69, 0x6e, 0x64, 0x53, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x10, 0x05, + 0x12, 0x19, 0x0a, 0x15, 0x4b, 0x69, 0x6e, 0x64, 0x49, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x43, 0x65, + 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x10, 0x06, 0x12, 0x12, 0x0a, 0x0e, 0x4b, + 0x69, 0x6e, 0x64, 0x41, 0x50, 0x49, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x10, 0x07, 0x12, + 0x17, 0x0a, 0x13, 0x4b, 0x69, 0x6e, 0x64, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x41, 0x50, 0x49, 0x47, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x10, 0x08, 0x12, 0x11, 0x0a, 0x0d, 0x4b, 0x69, 0x6e, 0x64, + 0x48, 0x54, 0x54, 0x50, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x10, 0x09, 0x12, 0x10, 0x0a, 0x0c, 0x4b, + 0x69, 0x6e, 0x64, 0x54, 0x43, 0x50, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x10, 0x0a, 0x2a, 0x26, 0x0a, + 0x0f, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x12, 0x08, 0x0a, 0x04, 0x44, 0x65, 0x6e, 0x79, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x41, 0x6c, + 0x6c, 0x6f, 0x77, 0x10, 0x01, 0x2a, 0x21, 0x0a, 0x13, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x69, + 0x6f, 0x6e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, 0x0a, 0x06, + 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x10, 0x00, 0x2a, 0x50, 0x0a, 0x09, 0x50, 0x72, 0x6f, 0x78, + 0x79, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x14, 0x0a, 0x10, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x4d, 0x6f, + 0x64, 0x65, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x10, 0x00, 0x12, 0x18, 0x0a, 0x14, 0x50, + 0x72, 0x6f, 0x78, 0x79, 0x4d, 0x6f, 0x64, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x61, 0x72, + 0x65, 0x6e, 0x74, 0x10, 0x01, 0x12, 0x13, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x4d, 0x6f, + 0x64, 0x65, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x10, 0x02, 0x2a, 0x7b, 0x0a, 0x0f, 0x4d, 0x65, + 0x73, 0x68, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x1a, 0x0a, + 0x16, 0x4d, 0x65, 0x73, 0x68, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x4d, 0x6f, 0x64, 0x65, + 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x10, 0x00, 0x12, 0x17, 0x0a, 0x13, 0x4d, 0x65, 0x73, + 0x68, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x4d, 0x6f, 0x64, 0x65, 0x4e, 0x6f, 0x6e, 0x65, + 0x10, 0x01, 0x12, 0x18, 0x0a, 0x14, 0x4d, 0x65, 0x73, 0x68, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, + 0x79, 0x4d, 0x6f, 0x64, 0x65, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x10, 0x02, 0x12, 0x19, 0x0a, 0x15, + 0x4d, 0x65, 0x73, 0x68, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x4d, 0x6f, 0x64, 0x65, 0x52, + 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x10, 0x03, 0x2a, 0x4f, 0x0a, 0x1a, 0x41, 0x50, 0x49, 0x47, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x50, 0x72, 0x6f, + 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x18, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, + 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x48, 0x54, 0x54, 0x50, 0x10, 0x00, 0x12, + 0x17, 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, + 0x63, 0x6f, 0x6c, 0x54, 0x43, 0x50, 0x10, 0x01, 0x2a, 0x92, 0x02, 0x0a, 0x0f, 0x48, 0x54, 0x54, + 0x50, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, 0x16, 0x0a, 0x12, + 0x48, 0x54, 0x54, 0x50, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x41, + 0x6c, 0x6c, 0x10, 0x00, 0x12, 0x1a, 0x0a, 0x16, 0x48, 0x54, 0x54, 0x50, 0x4d, 0x61, 0x74, 0x63, + 0x68, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x10, 0x01, + 0x12, 0x19, 0x0a, 0x15, 0x48, 0x54, 0x54, 0x50, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x4d, 0x65, 0x74, + 0x68, 0x6f, 0x64, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x10, 0x02, 0x12, 0x16, 0x0a, 0x12, 0x48, + 0x54, 0x54, 0x50, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x47, 0x65, + 0x74, 0x10, 0x03, 0x12, 0x17, 0x0a, 0x13, 0x48, 0x54, 0x54, 0x50, 0x4d, 0x61, 0x74, 0x63, 0x68, + 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x48, 0x65, 0x61, 0x64, 0x10, 0x04, 0x12, 0x1a, 0x0a, 0x16, + 0x48, 0x54, 0x54, 0x50, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x10, 0x05, 0x12, 0x18, 0x0a, 0x14, 0x48, 0x54, 0x54, 0x50, + 0x4d, 0x61, 0x74, 0x63, 0x68, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x50, 0x61, 0x74, 0x63, 0x68, + 0x10, 0x06, 0x12, 0x17, 0x0a, 0x13, 0x48, 0x54, 0x54, 0x50, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x4d, + 0x65, 0x74, 0x68, 0x6f, 0x64, 0x50, 0x6f, 0x73, 0x74, 0x10, 0x07, 0x12, 0x16, 0x0a, 0x12, 0x48, + 0x54, 0x54, 0x50, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x50, 0x75, + 0x74, 0x10, 0x08, 0x12, 0x18, 0x0a, 0x14, 0x48, 0x54, 0x54, 0x50, 0x4d, 0x61, 0x74, 0x63, 0x68, + 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x54, 0x72, 0x61, 0x63, 0x65, 0x10, 0x09, 0x2a, 0xa7, 0x01, + 0x0a, 0x13, 0x48, 0x54, 0x54, 0x50, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x74, 0x63, + 0x68, 0x54, 0x79, 0x70, 0x65, 0x12, 0x18, 0x0a, 0x14, 0x48, 0x54, 0x54, 0x50, 0x48, 0x65, 0x61, + 0x64, 0x65, 0x72, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x45, 0x78, 0x61, 0x63, 0x74, 0x10, 0x00, 0x12, + 0x19, 0x0a, 0x15, 0x48, 0x54, 0x54, 0x50, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x74, + 0x63, 0x68, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x10, 0x01, 0x12, 0x1a, 0x0a, 0x16, 0x48, 0x54, + 0x54, 0x50, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x50, 0x72, 0x65, + 0x73, 0x65, 0x6e, 0x74, 0x10, 0x02, 0x12, 0x24, 0x0a, 0x20, 0x48, 0x54, 0x54, 0x50, 0x48, 0x65, + 0x61, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x52, 0x65, 0x67, 0x75, 0x6c, 0x61, 0x72, + 0x45, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x10, 0x03, 0x12, 0x19, 0x0a, 0x15, + 0x48, 0x54, 0x54, 0x50, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x53, + 0x75, 0x66, 0x66, 0x69, 0x78, 0x10, 0x04, 0x2a, 0x68, 0x0a, 0x11, 0x48, 0x54, 0x54, 0x50, 0x50, + 0x61, 0x74, 0x68, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x54, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x12, + 0x48, 0x54, 0x54, 0x50, 0x50, 0x61, 0x74, 0x68, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x45, 0x78, 0x61, + 0x63, 0x74, 0x10, 0x00, 0x12, 0x17, 0x0a, 0x13, 0x48, 0x54, 0x54, 0x50, 0x50, 0x61, 0x74, 0x68, + 0x4d, 0x61, 0x74, 0x63, 0x68, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x10, 0x01, 0x12, 0x22, 0x0a, + 0x1e, 0x48, 0x54, 0x54, 0x50, 0x50, 0x61, 0x74, 0x68, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x52, 0x65, + 0x67, 0x75, 0x6c, 0x61, 0x72, 0x45, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x10, + 0x03, 0x2a, 0x6d, 0x0a, 0x12, 0x48, 0x54, 0x54, 0x50, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4d, 0x61, + 0x74, 0x63, 0x68, 0x54, 0x79, 0x70, 0x65, 0x12, 0x17, 0x0a, 0x13, 0x48, 0x54, 0x54, 0x50, 0x51, + 0x75, 0x65, 0x72, 0x79, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x45, 0x78, 0x61, 0x63, 0x74, 0x10, 0x00, + 0x12, 0x19, 0x0a, 0x15, 0x48, 0x54, 0x54, 0x50, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4d, 0x61, 0x74, + 0x63, 0x68, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x10, 0x01, 0x12, 0x23, 0x0a, 0x1f, 0x48, + 0x54, 0x54, 0x50, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x52, 0x65, 0x67, + 0x75, 0x6c, 0x61, 0x72, 0x45, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x10, 0x03, + 0x42, 0xa6, 0x02, 0x0a, 0x29, 0x63, 0x6f, 0x6d, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, + 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, + 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x42, 0x10, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x50, 0x72, 0x6f, 0x74, 0x6f, + 0x50, 0x01, 0x5a, 0x2f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x68, + 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2f, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x70, 0x62, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, + 0x74, 0x72, 0x79, 0xa2, 0x02, 0x04, 0x48, 0x43, 0x49, 0x43, 0xaa, 0x02, 0x25, 0x48, 0x61, 0x73, + 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x49, 0x6e, + 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, + 0x72, 0x79, 0xca, 0x02, 0x25, 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x5c, 0x43, + 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x5c, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5c, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0xe2, 0x02, 0x31, 0x48, 0x61, 0x73, + 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x5c, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x5c, 0x49, 0x6e, + 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5c, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, + 0x72, 0x79, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, + 0x28, 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x3a, 0x3a, 0x43, 0x6f, 0x6e, 0x73, + 0x75, 0x6c, 0x3a, 0x3a, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x3a, 0x3a, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x33, } var ( @@ -6563,118 +6584,119 @@ var file_proto_pbconfigentry_config_entry_proto_depIdxs = []int32{ 56, // 9: hashicorp.consul.internal.configentry.ConfigEntry.BoundAPIGateway:type_name -> hashicorp.consul.internal.configentry.BoundAPIGateway 69, // 10: hashicorp.consul.internal.configentry.ConfigEntry.TCPRoute:type_name -> hashicorp.consul.internal.configentry.TCPRoute 59, // 11: hashicorp.consul.internal.configentry.ConfigEntry.HTTPRoute:type_name -> hashicorp.consul.internal.configentry.HTTPRoute - 12, // 12: hashicorp.consul.internal.configentry.MeshConfig.TransparentProxy:type_name -> hashicorp.consul.internal.configentry.TransparentProxyMeshConfig - 13, // 13: hashicorp.consul.internal.configentry.MeshConfig.TLS:type_name -> hashicorp.consul.internal.configentry.MeshTLSConfig - 15, // 14: hashicorp.consul.internal.configentry.MeshConfig.HTTP:type_name -> hashicorp.consul.internal.configentry.MeshHTTPConfig - 71, // 15: hashicorp.consul.internal.configentry.MeshConfig.Meta:type_name -> hashicorp.consul.internal.configentry.MeshConfig.MetaEntry - 16, // 16: hashicorp.consul.internal.configentry.MeshConfig.Peering:type_name -> hashicorp.consul.internal.configentry.PeeringMeshConfig - 14, // 17: hashicorp.consul.internal.configentry.MeshTLSConfig.Incoming:type_name -> hashicorp.consul.internal.configentry.MeshDirectionalTLSConfig - 14, // 18: hashicorp.consul.internal.configentry.MeshTLSConfig.Outgoing:type_name -> hashicorp.consul.internal.configentry.MeshDirectionalTLSConfig - 72, // 19: hashicorp.consul.internal.configentry.ServiceResolver.Subsets:type_name -> hashicorp.consul.internal.configentry.ServiceResolver.SubsetsEntry - 19, // 20: hashicorp.consul.internal.configentry.ServiceResolver.Redirect:type_name -> hashicorp.consul.internal.configentry.ServiceResolverRedirect - 73, // 21: hashicorp.consul.internal.configentry.ServiceResolver.Failover:type_name -> hashicorp.consul.internal.configentry.ServiceResolver.FailoverEntry - 91, // 22: hashicorp.consul.internal.configentry.ServiceResolver.ConnectTimeout:type_name -> google.protobuf.Duration - 22, // 23: hashicorp.consul.internal.configentry.ServiceResolver.LoadBalancer:type_name -> hashicorp.consul.internal.configentry.LoadBalancer - 74, // 24: hashicorp.consul.internal.configentry.ServiceResolver.Meta:type_name -> hashicorp.consul.internal.configentry.ServiceResolver.MetaEntry - 21, // 25: hashicorp.consul.internal.configentry.ServiceResolverFailover.Targets:type_name -> hashicorp.consul.internal.configentry.ServiceResolverFailoverTarget - 23, // 26: hashicorp.consul.internal.configentry.LoadBalancer.RingHashConfig:type_name -> hashicorp.consul.internal.configentry.RingHashConfig - 24, // 27: hashicorp.consul.internal.configentry.LoadBalancer.LeastRequestConfig:type_name -> hashicorp.consul.internal.configentry.LeastRequestConfig - 25, // 28: hashicorp.consul.internal.configentry.LoadBalancer.HashPolicies:type_name -> hashicorp.consul.internal.configentry.HashPolicy - 26, // 29: hashicorp.consul.internal.configentry.HashPolicy.CookieConfig:type_name -> hashicorp.consul.internal.configentry.CookieConfig - 91, // 30: hashicorp.consul.internal.configentry.CookieConfig.TTL:type_name -> google.protobuf.Duration - 29, // 31: hashicorp.consul.internal.configentry.IngressGateway.TLS:type_name -> hashicorp.consul.internal.configentry.GatewayTLSConfig - 31, // 32: hashicorp.consul.internal.configentry.IngressGateway.Listeners:type_name -> hashicorp.consul.internal.configentry.IngressListener - 75, // 33: hashicorp.consul.internal.configentry.IngressGateway.Meta:type_name -> hashicorp.consul.internal.configentry.IngressGateway.MetaEntry - 28, // 34: hashicorp.consul.internal.configentry.IngressGateway.Defaults:type_name -> hashicorp.consul.internal.configentry.IngressServiceConfig - 48, // 35: hashicorp.consul.internal.configentry.IngressServiceConfig.PassiveHealthCheck:type_name -> hashicorp.consul.internal.configentry.PassiveHealthCheck - 30, // 36: hashicorp.consul.internal.configentry.GatewayTLSConfig.SDS:type_name -> hashicorp.consul.internal.configentry.GatewayTLSSDSConfig - 32, // 37: hashicorp.consul.internal.configentry.IngressListener.Services:type_name -> hashicorp.consul.internal.configentry.IngressService - 29, // 38: hashicorp.consul.internal.configentry.IngressListener.TLS:type_name -> hashicorp.consul.internal.configentry.GatewayTLSConfig - 33, // 39: hashicorp.consul.internal.configentry.IngressService.TLS:type_name -> hashicorp.consul.internal.configentry.GatewayServiceTLSConfig - 34, // 40: hashicorp.consul.internal.configentry.IngressService.RequestHeaders:type_name -> hashicorp.consul.internal.configentry.HTTPHeaderModifiers - 34, // 41: hashicorp.consul.internal.configentry.IngressService.ResponseHeaders:type_name -> hashicorp.consul.internal.configentry.HTTPHeaderModifiers - 76, // 42: hashicorp.consul.internal.configentry.IngressService.Meta:type_name -> hashicorp.consul.internal.configentry.IngressService.MetaEntry - 89, // 43: hashicorp.consul.internal.configentry.IngressService.EnterpriseMeta:type_name -> hashicorp.consul.internal.common.EnterpriseMeta - 48, // 44: hashicorp.consul.internal.configentry.IngressService.PassiveHealthCheck:type_name -> hashicorp.consul.internal.configentry.PassiveHealthCheck - 30, // 45: hashicorp.consul.internal.configentry.GatewayServiceTLSConfig.SDS:type_name -> hashicorp.consul.internal.configentry.GatewayTLSSDSConfig - 77, // 46: hashicorp.consul.internal.configentry.HTTPHeaderModifiers.Add:type_name -> hashicorp.consul.internal.configentry.HTTPHeaderModifiers.AddEntry - 78, // 47: hashicorp.consul.internal.configentry.HTTPHeaderModifiers.Set:type_name -> hashicorp.consul.internal.configentry.HTTPHeaderModifiers.SetEntry - 36, // 48: hashicorp.consul.internal.configentry.ServiceIntentions.Sources:type_name -> hashicorp.consul.internal.configentry.SourceIntention - 79, // 49: hashicorp.consul.internal.configentry.ServiceIntentions.Meta:type_name -> hashicorp.consul.internal.configentry.ServiceIntentions.MetaEntry - 1, // 50: hashicorp.consul.internal.configentry.SourceIntention.Action:type_name -> hashicorp.consul.internal.configentry.IntentionAction - 37, // 51: hashicorp.consul.internal.configentry.SourceIntention.Permissions:type_name -> hashicorp.consul.internal.configentry.IntentionPermission - 2, // 52: hashicorp.consul.internal.configentry.SourceIntention.Type:type_name -> hashicorp.consul.internal.configentry.IntentionSourceType - 80, // 53: hashicorp.consul.internal.configentry.SourceIntention.LegacyMeta:type_name -> hashicorp.consul.internal.configentry.SourceIntention.LegacyMetaEntry - 92, // 54: hashicorp.consul.internal.configentry.SourceIntention.LegacyCreateTime:type_name -> google.protobuf.Timestamp - 92, // 55: hashicorp.consul.internal.configentry.SourceIntention.LegacyUpdateTime:type_name -> google.protobuf.Timestamp - 89, // 56: hashicorp.consul.internal.configentry.SourceIntention.EnterpriseMeta:type_name -> hashicorp.consul.internal.common.EnterpriseMeta - 1, // 57: hashicorp.consul.internal.configentry.IntentionPermission.Action:type_name -> hashicorp.consul.internal.configentry.IntentionAction - 38, // 58: hashicorp.consul.internal.configentry.IntentionPermission.HTTP:type_name -> hashicorp.consul.internal.configentry.IntentionHTTPPermission - 39, // 59: hashicorp.consul.internal.configentry.IntentionHTTPPermission.Header:type_name -> hashicorp.consul.internal.configentry.IntentionHTTPHeaderPermission - 3, // 60: hashicorp.consul.internal.configentry.ServiceDefaults.Mode:type_name -> hashicorp.consul.internal.configentry.ProxyMode - 41, // 61: hashicorp.consul.internal.configentry.ServiceDefaults.TransparentProxy:type_name -> hashicorp.consul.internal.configentry.TransparentProxyConfig - 42, // 62: hashicorp.consul.internal.configentry.ServiceDefaults.MeshGateway:type_name -> hashicorp.consul.internal.configentry.MeshGatewayConfig - 43, // 63: hashicorp.consul.internal.configentry.ServiceDefaults.Expose:type_name -> hashicorp.consul.internal.configentry.ExposeConfig - 45, // 64: hashicorp.consul.internal.configentry.ServiceDefaults.UpstreamConfig:type_name -> hashicorp.consul.internal.configentry.UpstreamConfiguration - 49, // 65: hashicorp.consul.internal.configentry.ServiceDefaults.Destination:type_name -> hashicorp.consul.internal.configentry.DestinationConfig - 81, // 66: hashicorp.consul.internal.configentry.ServiceDefaults.Meta:type_name -> hashicorp.consul.internal.configentry.ServiceDefaults.MetaEntry - 93, // 67: hashicorp.consul.internal.configentry.ServiceDefaults.EnvoyExtensions:type_name -> hashicorp.consul.internal.common.EnvoyExtension - 4, // 68: hashicorp.consul.internal.configentry.MeshGatewayConfig.Mode:type_name -> hashicorp.consul.internal.configentry.MeshGatewayMode - 44, // 69: hashicorp.consul.internal.configentry.ExposeConfig.Paths:type_name -> hashicorp.consul.internal.configentry.ExposePath - 46, // 70: hashicorp.consul.internal.configentry.UpstreamConfiguration.Overrides:type_name -> hashicorp.consul.internal.configentry.UpstreamConfig - 46, // 71: hashicorp.consul.internal.configentry.UpstreamConfiguration.Defaults:type_name -> hashicorp.consul.internal.configentry.UpstreamConfig - 89, // 72: hashicorp.consul.internal.configentry.UpstreamConfig.EnterpriseMeta:type_name -> hashicorp.consul.internal.common.EnterpriseMeta - 47, // 73: hashicorp.consul.internal.configentry.UpstreamConfig.Limits:type_name -> hashicorp.consul.internal.configentry.UpstreamLimits - 48, // 74: hashicorp.consul.internal.configentry.UpstreamConfig.PassiveHealthCheck:type_name -> hashicorp.consul.internal.configentry.PassiveHealthCheck - 42, // 75: hashicorp.consul.internal.configentry.UpstreamConfig.MeshGateway:type_name -> hashicorp.consul.internal.configentry.MeshGatewayConfig - 91, // 76: hashicorp.consul.internal.configentry.PassiveHealthCheck.Interval:type_name -> google.protobuf.Duration - 82, // 77: hashicorp.consul.internal.configentry.APIGateway.Meta:type_name -> hashicorp.consul.internal.configentry.APIGateway.MetaEntry - 53, // 78: hashicorp.consul.internal.configentry.APIGateway.Listeners:type_name -> hashicorp.consul.internal.configentry.APIGatewayListener - 51, // 79: hashicorp.consul.internal.configentry.APIGateway.Status:type_name -> hashicorp.consul.internal.configentry.Status - 52, // 80: hashicorp.consul.internal.configentry.Status.Conditions:type_name -> hashicorp.consul.internal.configentry.Condition - 55, // 81: hashicorp.consul.internal.configentry.Condition.Resource:type_name -> hashicorp.consul.internal.configentry.ResourceReference - 92, // 82: hashicorp.consul.internal.configentry.Condition.LastTransitionTime:type_name -> google.protobuf.Timestamp - 5, // 83: hashicorp.consul.internal.configentry.APIGatewayListener.Protocol:type_name -> hashicorp.consul.internal.configentry.APIGatewayListenerProtocol - 54, // 84: hashicorp.consul.internal.configentry.APIGatewayListener.TLS:type_name -> hashicorp.consul.internal.configentry.APIGatewayTLSConfiguration - 55, // 85: hashicorp.consul.internal.configentry.APIGatewayTLSConfiguration.Certificates:type_name -> hashicorp.consul.internal.configentry.ResourceReference - 89, // 86: hashicorp.consul.internal.configentry.ResourceReference.EnterpriseMeta:type_name -> hashicorp.consul.internal.common.EnterpriseMeta - 83, // 87: hashicorp.consul.internal.configentry.BoundAPIGateway.Meta:type_name -> hashicorp.consul.internal.configentry.BoundAPIGateway.MetaEntry - 57, // 88: hashicorp.consul.internal.configentry.BoundAPIGateway.Listeners:type_name -> hashicorp.consul.internal.configentry.BoundAPIGatewayListener - 55, // 89: hashicorp.consul.internal.configentry.BoundAPIGatewayListener.Certificates:type_name -> hashicorp.consul.internal.configentry.ResourceReference - 55, // 90: hashicorp.consul.internal.configentry.BoundAPIGatewayListener.Routes:type_name -> hashicorp.consul.internal.configentry.ResourceReference - 84, // 91: hashicorp.consul.internal.configentry.InlineCertificate.Meta:type_name -> hashicorp.consul.internal.configentry.InlineCertificate.MetaEntry - 85, // 92: hashicorp.consul.internal.configentry.HTTPRoute.Meta:type_name -> hashicorp.consul.internal.configentry.HTTPRoute.MetaEntry - 55, // 93: hashicorp.consul.internal.configentry.HTTPRoute.Parents:type_name -> hashicorp.consul.internal.configentry.ResourceReference - 60, // 94: hashicorp.consul.internal.configentry.HTTPRoute.Rules:type_name -> hashicorp.consul.internal.configentry.HTTPRouteRule - 51, // 95: hashicorp.consul.internal.configentry.HTTPRoute.Status:type_name -> hashicorp.consul.internal.configentry.Status - 65, // 96: hashicorp.consul.internal.configentry.HTTPRouteRule.Filters:type_name -> hashicorp.consul.internal.configentry.HTTPFilters - 61, // 97: hashicorp.consul.internal.configentry.HTTPRouteRule.Matches:type_name -> hashicorp.consul.internal.configentry.HTTPMatch - 68, // 98: hashicorp.consul.internal.configentry.HTTPRouteRule.Services:type_name -> hashicorp.consul.internal.configentry.HTTPService - 62, // 99: hashicorp.consul.internal.configentry.HTTPMatch.Headers:type_name -> hashicorp.consul.internal.configentry.HTTPHeaderMatch - 6, // 100: hashicorp.consul.internal.configentry.HTTPMatch.Method:type_name -> hashicorp.consul.internal.configentry.HTTPMatchMethod - 63, // 101: hashicorp.consul.internal.configentry.HTTPMatch.Path:type_name -> hashicorp.consul.internal.configentry.HTTPPathMatch - 64, // 102: hashicorp.consul.internal.configentry.HTTPMatch.Query:type_name -> hashicorp.consul.internal.configentry.HTTPQueryMatch - 7, // 103: hashicorp.consul.internal.configentry.HTTPHeaderMatch.Match:type_name -> hashicorp.consul.internal.configentry.HTTPHeaderMatchType - 8, // 104: hashicorp.consul.internal.configentry.HTTPPathMatch.Match:type_name -> hashicorp.consul.internal.configentry.HTTPPathMatchType - 9, // 105: hashicorp.consul.internal.configentry.HTTPQueryMatch.Match:type_name -> hashicorp.consul.internal.configentry.HTTPQueryMatchType - 67, // 106: hashicorp.consul.internal.configentry.HTTPFilters.Headers:type_name -> hashicorp.consul.internal.configentry.HTTPHeaderFilter - 66, // 107: hashicorp.consul.internal.configentry.HTTPFilters.URLRewrites:type_name -> hashicorp.consul.internal.configentry.URLRewrite - 86, // 108: hashicorp.consul.internal.configentry.HTTPHeaderFilter.Add:type_name -> hashicorp.consul.internal.configentry.HTTPHeaderFilter.AddEntry - 87, // 109: hashicorp.consul.internal.configentry.HTTPHeaderFilter.Set:type_name -> hashicorp.consul.internal.configentry.HTTPHeaderFilter.SetEntry - 65, // 110: hashicorp.consul.internal.configentry.HTTPService.Filters:type_name -> hashicorp.consul.internal.configentry.HTTPFilters - 89, // 111: hashicorp.consul.internal.configentry.HTTPService.EnterpriseMeta:type_name -> hashicorp.consul.internal.common.EnterpriseMeta - 88, // 112: hashicorp.consul.internal.configentry.TCPRoute.Meta:type_name -> hashicorp.consul.internal.configentry.TCPRoute.MetaEntry - 55, // 113: hashicorp.consul.internal.configentry.TCPRoute.Parents:type_name -> hashicorp.consul.internal.configentry.ResourceReference - 70, // 114: hashicorp.consul.internal.configentry.TCPRoute.Services:type_name -> hashicorp.consul.internal.configentry.TCPService - 51, // 115: hashicorp.consul.internal.configentry.TCPRoute.Status:type_name -> hashicorp.consul.internal.configentry.Status - 89, // 116: hashicorp.consul.internal.configentry.TCPService.EnterpriseMeta:type_name -> hashicorp.consul.internal.common.EnterpriseMeta - 18, // 117: hashicorp.consul.internal.configentry.ServiceResolver.SubsetsEntry.value:type_name -> hashicorp.consul.internal.configentry.ServiceResolverSubset - 20, // 118: hashicorp.consul.internal.configentry.ServiceResolver.FailoverEntry.value:type_name -> hashicorp.consul.internal.configentry.ServiceResolverFailover - 119, // [119:119] is the sub-list for method output_type - 119, // [119:119] is the sub-list for method input_type - 119, // [119:119] is the sub-list for extension type_name - 119, // [119:119] is the sub-list for extension extendee - 0, // [0:119] is the sub-list for field type_name + 58, // 12: hashicorp.consul.internal.configentry.ConfigEntry.InlineCertificate:type_name -> hashicorp.consul.internal.configentry.InlineCertificate + 12, // 13: hashicorp.consul.internal.configentry.MeshConfig.TransparentProxy:type_name -> hashicorp.consul.internal.configentry.TransparentProxyMeshConfig + 13, // 14: hashicorp.consul.internal.configentry.MeshConfig.TLS:type_name -> hashicorp.consul.internal.configentry.MeshTLSConfig + 15, // 15: hashicorp.consul.internal.configentry.MeshConfig.HTTP:type_name -> hashicorp.consul.internal.configentry.MeshHTTPConfig + 71, // 16: hashicorp.consul.internal.configentry.MeshConfig.Meta:type_name -> hashicorp.consul.internal.configentry.MeshConfig.MetaEntry + 16, // 17: hashicorp.consul.internal.configentry.MeshConfig.Peering:type_name -> hashicorp.consul.internal.configentry.PeeringMeshConfig + 14, // 18: hashicorp.consul.internal.configentry.MeshTLSConfig.Incoming:type_name -> hashicorp.consul.internal.configentry.MeshDirectionalTLSConfig + 14, // 19: hashicorp.consul.internal.configentry.MeshTLSConfig.Outgoing:type_name -> hashicorp.consul.internal.configentry.MeshDirectionalTLSConfig + 72, // 20: hashicorp.consul.internal.configentry.ServiceResolver.Subsets:type_name -> hashicorp.consul.internal.configentry.ServiceResolver.SubsetsEntry + 19, // 21: hashicorp.consul.internal.configentry.ServiceResolver.Redirect:type_name -> hashicorp.consul.internal.configentry.ServiceResolverRedirect + 73, // 22: hashicorp.consul.internal.configentry.ServiceResolver.Failover:type_name -> hashicorp.consul.internal.configentry.ServiceResolver.FailoverEntry + 91, // 23: hashicorp.consul.internal.configentry.ServiceResolver.ConnectTimeout:type_name -> google.protobuf.Duration + 22, // 24: hashicorp.consul.internal.configentry.ServiceResolver.LoadBalancer:type_name -> hashicorp.consul.internal.configentry.LoadBalancer + 74, // 25: hashicorp.consul.internal.configentry.ServiceResolver.Meta:type_name -> hashicorp.consul.internal.configentry.ServiceResolver.MetaEntry + 21, // 26: hashicorp.consul.internal.configentry.ServiceResolverFailover.Targets:type_name -> hashicorp.consul.internal.configentry.ServiceResolverFailoverTarget + 23, // 27: hashicorp.consul.internal.configentry.LoadBalancer.RingHashConfig:type_name -> hashicorp.consul.internal.configentry.RingHashConfig + 24, // 28: hashicorp.consul.internal.configentry.LoadBalancer.LeastRequestConfig:type_name -> hashicorp.consul.internal.configentry.LeastRequestConfig + 25, // 29: hashicorp.consul.internal.configentry.LoadBalancer.HashPolicies:type_name -> hashicorp.consul.internal.configentry.HashPolicy + 26, // 30: hashicorp.consul.internal.configentry.HashPolicy.CookieConfig:type_name -> hashicorp.consul.internal.configentry.CookieConfig + 91, // 31: hashicorp.consul.internal.configentry.CookieConfig.TTL:type_name -> google.protobuf.Duration + 29, // 32: hashicorp.consul.internal.configentry.IngressGateway.TLS:type_name -> hashicorp.consul.internal.configentry.GatewayTLSConfig + 31, // 33: hashicorp.consul.internal.configentry.IngressGateway.Listeners:type_name -> hashicorp.consul.internal.configentry.IngressListener + 75, // 34: hashicorp.consul.internal.configentry.IngressGateway.Meta:type_name -> hashicorp.consul.internal.configentry.IngressGateway.MetaEntry + 28, // 35: hashicorp.consul.internal.configentry.IngressGateway.Defaults:type_name -> hashicorp.consul.internal.configentry.IngressServiceConfig + 48, // 36: hashicorp.consul.internal.configentry.IngressServiceConfig.PassiveHealthCheck:type_name -> hashicorp.consul.internal.configentry.PassiveHealthCheck + 30, // 37: hashicorp.consul.internal.configentry.GatewayTLSConfig.SDS:type_name -> hashicorp.consul.internal.configentry.GatewayTLSSDSConfig + 32, // 38: hashicorp.consul.internal.configentry.IngressListener.Services:type_name -> hashicorp.consul.internal.configentry.IngressService + 29, // 39: hashicorp.consul.internal.configentry.IngressListener.TLS:type_name -> hashicorp.consul.internal.configentry.GatewayTLSConfig + 33, // 40: hashicorp.consul.internal.configentry.IngressService.TLS:type_name -> hashicorp.consul.internal.configentry.GatewayServiceTLSConfig + 34, // 41: hashicorp.consul.internal.configentry.IngressService.RequestHeaders:type_name -> hashicorp.consul.internal.configentry.HTTPHeaderModifiers + 34, // 42: hashicorp.consul.internal.configentry.IngressService.ResponseHeaders:type_name -> hashicorp.consul.internal.configentry.HTTPHeaderModifiers + 76, // 43: hashicorp.consul.internal.configentry.IngressService.Meta:type_name -> hashicorp.consul.internal.configentry.IngressService.MetaEntry + 89, // 44: hashicorp.consul.internal.configentry.IngressService.EnterpriseMeta:type_name -> hashicorp.consul.internal.common.EnterpriseMeta + 48, // 45: hashicorp.consul.internal.configentry.IngressService.PassiveHealthCheck:type_name -> hashicorp.consul.internal.configentry.PassiveHealthCheck + 30, // 46: hashicorp.consul.internal.configentry.GatewayServiceTLSConfig.SDS:type_name -> hashicorp.consul.internal.configentry.GatewayTLSSDSConfig + 77, // 47: hashicorp.consul.internal.configentry.HTTPHeaderModifiers.Add:type_name -> hashicorp.consul.internal.configentry.HTTPHeaderModifiers.AddEntry + 78, // 48: hashicorp.consul.internal.configentry.HTTPHeaderModifiers.Set:type_name -> hashicorp.consul.internal.configentry.HTTPHeaderModifiers.SetEntry + 36, // 49: hashicorp.consul.internal.configentry.ServiceIntentions.Sources:type_name -> hashicorp.consul.internal.configentry.SourceIntention + 79, // 50: hashicorp.consul.internal.configentry.ServiceIntentions.Meta:type_name -> hashicorp.consul.internal.configentry.ServiceIntentions.MetaEntry + 1, // 51: hashicorp.consul.internal.configentry.SourceIntention.Action:type_name -> hashicorp.consul.internal.configentry.IntentionAction + 37, // 52: hashicorp.consul.internal.configentry.SourceIntention.Permissions:type_name -> hashicorp.consul.internal.configentry.IntentionPermission + 2, // 53: hashicorp.consul.internal.configentry.SourceIntention.Type:type_name -> hashicorp.consul.internal.configentry.IntentionSourceType + 80, // 54: hashicorp.consul.internal.configentry.SourceIntention.LegacyMeta:type_name -> hashicorp.consul.internal.configentry.SourceIntention.LegacyMetaEntry + 92, // 55: hashicorp.consul.internal.configentry.SourceIntention.LegacyCreateTime:type_name -> google.protobuf.Timestamp + 92, // 56: hashicorp.consul.internal.configentry.SourceIntention.LegacyUpdateTime:type_name -> google.protobuf.Timestamp + 89, // 57: hashicorp.consul.internal.configentry.SourceIntention.EnterpriseMeta:type_name -> hashicorp.consul.internal.common.EnterpriseMeta + 1, // 58: hashicorp.consul.internal.configentry.IntentionPermission.Action:type_name -> hashicorp.consul.internal.configentry.IntentionAction + 38, // 59: hashicorp.consul.internal.configentry.IntentionPermission.HTTP:type_name -> hashicorp.consul.internal.configentry.IntentionHTTPPermission + 39, // 60: hashicorp.consul.internal.configentry.IntentionHTTPPermission.Header:type_name -> hashicorp.consul.internal.configentry.IntentionHTTPHeaderPermission + 3, // 61: hashicorp.consul.internal.configentry.ServiceDefaults.Mode:type_name -> hashicorp.consul.internal.configentry.ProxyMode + 41, // 62: hashicorp.consul.internal.configentry.ServiceDefaults.TransparentProxy:type_name -> hashicorp.consul.internal.configentry.TransparentProxyConfig + 42, // 63: hashicorp.consul.internal.configentry.ServiceDefaults.MeshGateway:type_name -> hashicorp.consul.internal.configentry.MeshGatewayConfig + 43, // 64: hashicorp.consul.internal.configentry.ServiceDefaults.Expose:type_name -> hashicorp.consul.internal.configentry.ExposeConfig + 45, // 65: hashicorp.consul.internal.configentry.ServiceDefaults.UpstreamConfig:type_name -> hashicorp.consul.internal.configentry.UpstreamConfiguration + 49, // 66: hashicorp.consul.internal.configentry.ServiceDefaults.Destination:type_name -> hashicorp.consul.internal.configentry.DestinationConfig + 81, // 67: hashicorp.consul.internal.configentry.ServiceDefaults.Meta:type_name -> hashicorp.consul.internal.configentry.ServiceDefaults.MetaEntry + 93, // 68: hashicorp.consul.internal.configentry.ServiceDefaults.EnvoyExtensions:type_name -> hashicorp.consul.internal.common.EnvoyExtension + 4, // 69: hashicorp.consul.internal.configentry.MeshGatewayConfig.Mode:type_name -> hashicorp.consul.internal.configentry.MeshGatewayMode + 44, // 70: hashicorp.consul.internal.configentry.ExposeConfig.Paths:type_name -> hashicorp.consul.internal.configentry.ExposePath + 46, // 71: hashicorp.consul.internal.configentry.UpstreamConfiguration.Overrides:type_name -> hashicorp.consul.internal.configentry.UpstreamConfig + 46, // 72: hashicorp.consul.internal.configentry.UpstreamConfiguration.Defaults:type_name -> hashicorp.consul.internal.configentry.UpstreamConfig + 89, // 73: hashicorp.consul.internal.configentry.UpstreamConfig.EnterpriseMeta:type_name -> hashicorp.consul.internal.common.EnterpriseMeta + 47, // 74: hashicorp.consul.internal.configentry.UpstreamConfig.Limits:type_name -> hashicorp.consul.internal.configentry.UpstreamLimits + 48, // 75: hashicorp.consul.internal.configentry.UpstreamConfig.PassiveHealthCheck:type_name -> hashicorp.consul.internal.configentry.PassiveHealthCheck + 42, // 76: hashicorp.consul.internal.configentry.UpstreamConfig.MeshGateway:type_name -> hashicorp.consul.internal.configentry.MeshGatewayConfig + 91, // 77: hashicorp.consul.internal.configentry.PassiveHealthCheck.Interval:type_name -> google.protobuf.Duration + 82, // 78: hashicorp.consul.internal.configentry.APIGateway.Meta:type_name -> hashicorp.consul.internal.configentry.APIGateway.MetaEntry + 53, // 79: hashicorp.consul.internal.configentry.APIGateway.Listeners:type_name -> hashicorp.consul.internal.configentry.APIGatewayListener + 51, // 80: hashicorp.consul.internal.configentry.APIGateway.Status:type_name -> hashicorp.consul.internal.configentry.Status + 52, // 81: hashicorp.consul.internal.configentry.Status.Conditions:type_name -> hashicorp.consul.internal.configentry.Condition + 55, // 82: hashicorp.consul.internal.configentry.Condition.Resource:type_name -> hashicorp.consul.internal.configentry.ResourceReference + 92, // 83: hashicorp.consul.internal.configentry.Condition.LastTransitionTime:type_name -> google.protobuf.Timestamp + 5, // 84: hashicorp.consul.internal.configentry.APIGatewayListener.Protocol:type_name -> hashicorp.consul.internal.configentry.APIGatewayListenerProtocol + 54, // 85: hashicorp.consul.internal.configentry.APIGatewayListener.TLS:type_name -> hashicorp.consul.internal.configentry.APIGatewayTLSConfiguration + 55, // 86: hashicorp.consul.internal.configentry.APIGatewayTLSConfiguration.Certificates:type_name -> hashicorp.consul.internal.configentry.ResourceReference + 89, // 87: hashicorp.consul.internal.configentry.ResourceReference.EnterpriseMeta:type_name -> hashicorp.consul.internal.common.EnterpriseMeta + 83, // 88: hashicorp.consul.internal.configentry.BoundAPIGateway.Meta:type_name -> hashicorp.consul.internal.configentry.BoundAPIGateway.MetaEntry + 57, // 89: hashicorp.consul.internal.configentry.BoundAPIGateway.Listeners:type_name -> hashicorp.consul.internal.configentry.BoundAPIGatewayListener + 55, // 90: hashicorp.consul.internal.configentry.BoundAPIGatewayListener.Certificates:type_name -> hashicorp.consul.internal.configentry.ResourceReference + 55, // 91: hashicorp.consul.internal.configentry.BoundAPIGatewayListener.Routes:type_name -> hashicorp.consul.internal.configentry.ResourceReference + 84, // 92: hashicorp.consul.internal.configentry.InlineCertificate.Meta:type_name -> hashicorp.consul.internal.configentry.InlineCertificate.MetaEntry + 85, // 93: hashicorp.consul.internal.configentry.HTTPRoute.Meta:type_name -> hashicorp.consul.internal.configentry.HTTPRoute.MetaEntry + 55, // 94: hashicorp.consul.internal.configentry.HTTPRoute.Parents:type_name -> hashicorp.consul.internal.configentry.ResourceReference + 60, // 95: hashicorp.consul.internal.configentry.HTTPRoute.Rules:type_name -> hashicorp.consul.internal.configentry.HTTPRouteRule + 51, // 96: hashicorp.consul.internal.configentry.HTTPRoute.Status:type_name -> hashicorp.consul.internal.configentry.Status + 65, // 97: hashicorp.consul.internal.configentry.HTTPRouteRule.Filters:type_name -> hashicorp.consul.internal.configentry.HTTPFilters + 61, // 98: hashicorp.consul.internal.configentry.HTTPRouteRule.Matches:type_name -> hashicorp.consul.internal.configentry.HTTPMatch + 68, // 99: hashicorp.consul.internal.configentry.HTTPRouteRule.Services:type_name -> hashicorp.consul.internal.configentry.HTTPService + 62, // 100: hashicorp.consul.internal.configentry.HTTPMatch.Headers:type_name -> hashicorp.consul.internal.configentry.HTTPHeaderMatch + 6, // 101: hashicorp.consul.internal.configentry.HTTPMatch.Method:type_name -> hashicorp.consul.internal.configentry.HTTPMatchMethod + 63, // 102: hashicorp.consul.internal.configentry.HTTPMatch.Path:type_name -> hashicorp.consul.internal.configentry.HTTPPathMatch + 64, // 103: hashicorp.consul.internal.configentry.HTTPMatch.Query:type_name -> hashicorp.consul.internal.configentry.HTTPQueryMatch + 7, // 104: hashicorp.consul.internal.configentry.HTTPHeaderMatch.Match:type_name -> hashicorp.consul.internal.configentry.HTTPHeaderMatchType + 8, // 105: hashicorp.consul.internal.configentry.HTTPPathMatch.Match:type_name -> hashicorp.consul.internal.configentry.HTTPPathMatchType + 9, // 106: hashicorp.consul.internal.configentry.HTTPQueryMatch.Match:type_name -> hashicorp.consul.internal.configentry.HTTPQueryMatchType + 67, // 107: hashicorp.consul.internal.configentry.HTTPFilters.Headers:type_name -> hashicorp.consul.internal.configentry.HTTPHeaderFilter + 66, // 108: hashicorp.consul.internal.configentry.HTTPFilters.URLRewrites:type_name -> hashicorp.consul.internal.configentry.URLRewrite + 86, // 109: hashicorp.consul.internal.configentry.HTTPHeaderFilter.Add:type_name -> hashicorp.consul.internal.configentry.HTTPHeaderFilter.AddEntry + 87, // 110: hashicorp.consul.internal.configentry.HTTPHeaderFilter.Set:type_name -> hashicorp.consul.internal.configentry.HTTPHeaderFilter.SetEntry + 65, // 111: hashicorp.consul.internal.configentry.HTTPService.Filters:type_name -> hashicorp.consul.internal.configentry.HTTPFilters + 89, // 112: hashicorp.consul.internal.configentry.HTTPService.EnterpriseMeta:type_name -> hashicorp.consul.internal.common.EnterpriseMeta + 88, // 113: hashicorp.consul.internal.configentry.TCPRoute.Meta:type_name -> hashicorp.consul.internal.configentry.TCPRoute.MetaEntry + 55, // 114: hashicorp.consul.internal.configentry.TCPRoute.Parents:type_name -> hashicorp.consul.internal.configentry.ResourceReference + 70, // 115: hashicorp.consul.internal.configentry.TCPRoute.Services:type_name -> hashicorp.consul.internal.configentry.TCPService + 51, // 116: hashicorp.consul.internal.configentry.TCPRoute.Status:type_name -> hashicorp.consul.internal.configentry.Status + 89, // 117: hashicorp.consul.internal.configentry.TCPService.EnterpriseMeta:type_name -> hashicorp.consul.internal.common.EnterpriseMeta + 18, // 118: hashicorp.consul.internal.configentry.ServiceResolver.SubsetsEntry.value:type_name -> hashicorp.consul.internal.configentry.ServiceResolverSubset + 20, // 119: hashicorp.consul.internal.configentry.ServiceResolver.FailoverEntry.value:type_name -> hashicorp.consul.internal.configentry.ServiceResolverFailover + 120, // [120:120] is the sub-list for method output_type + 120, // [120:120] is the sub-list for method input_type + 120, // [120:120] is the sub-list for extension type_name + 120, // [120:120] is the sub-list for extension extendee + 0, // [0:120] is the sub-list for field type_name } func init() { file_proto_pbconfigentry_config_entry_proto_init() } @@ -7426,6 +7448,7 @@ func file_proto_pbconfigentry_config_entry_proto_init() { (*ConfigEntry_BoundAPIGateway)(nil), (*ConfigEntry_TCPRoute)(nil), (*ConfigEntry_HTTPRoute)(nil), + (*ConfigEntry_InlineCertificate)(nil), } type x struct{} out := protoimpl.TypeBuilder{ diff --git a/proto/pbconfigentry/config_entry.proto b/proto/pbconfigentry/config_entry.proto index 53d69a64bc7..6749d5838c5 100644 --- a/proto/pbconfigentry/config_entry.proto +++ b/proto/pbconfigentry/config_entry.proto @@ -37,6 +37,7 @@ message ConfigEntry { BoundAPIGateway BoundAPIGateway = 11; TCPRoute TCPRoute = 12; HTTPRoute HTTPRoute = 13; + InlineCertificate InlineCertificate = 14; } } From 1d9ee50681275f96b62feac844b2a12da5e2f753 Mon Sep 17 00:00:00 2001 From: Curt Bushko Date: Wed, 15 Feb 2023 11:45:43 -0500 Subject: [PATCH 005/262] [OSS] connect: Bump Envoy 1.22.5 to 1.22.7, 1.23.2 to 1.23.4, 1.24.0 to 1.24.2, add 1.25.1, remove 1.21.5 (#16274) * Bump Envoy 1.22.5 to 1.22.7, 1.23.2 to 1.23.4, 1.24.0 to 1.24.2, add 1.25.1, remove 1.21.5 --- .changelog/16274.txt | 3 +++ .circleci/config.yml | 8 ++++---- envoyextensions/xdscommon/envoy_versioning_test.go | 7 ++++--- envoyextensions/xdscommon/proxysupport.go | 6 +++--- website/content/docs/connect/proxies/envoy.mdx | 2 ++ 5 files changed, 16 insertions(+), 10 deletions(-) create mode 100644 .changelog/16274.txt diff --git a/.changelog/16274.txt b/.changelog/16274.txt new file mode 100644 index 00000000000..983d33b1959 --- /dev/null +++ b/.changelog/16274.txt @@ -0,0 +1,3 @@ +```release-note:improvement +connect: Bump Envoy 1.22.5 to 1.22.7, 1.23.2 to 1.23.4, 1.24.0 to 1.24.2, add 1.25.1, remove 1.21.5 +``` diff --git a/.circleci/config.yml b/.circleci/config.yml index dae806a625b..7dd57d1bbe9 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -23,10 +23,10 @@ references: BASH_ENV: .circleci/bash_env.sh GO_VERSION: 1.19.4 envoy-versions: &supported_envoy_versions - - &default_envoy_version "1.21.5" - - "1.22.5" - - "1.23.2" - - "1.24.0" + - &default_envoy_version "1.22.7" + - "1.23.4" + - "1.24.2" + - "1.25.1" nomad-versions: &supported_nomad_versions - &default_nomad_version "1.3.3" - "1.2.10" diff --git a/envoyextensions/xdscommon/envoy_versioning_test.go b/envoyextensions/xdscommon/envoy_versioning_test.go index 833e3014ebe..e20a2ca8cee 100644 --- a/envoyextensions/xdscommon/envoy_versioning_test.go +++ b/envoyextensions/xdscommon/envoy_versioning_test.go @@ -121,6 +121,7 @@ func TestDetermineSupportedProxyFeaturesFromString(t *testing.T) { "1.18.6": {expectErr: "Envoy 1.18.6 " + errTooOld}, "1.19.5": {expectErr: "Envoy 1.19.5 " + errTooOld}, "1.20.7": {expectErr: "Envoy 1.20.7 " + errTooOld}, + "1.21.5": {expectErr: "Envoy 1.21.5 " + errTooOld}, } // Insert a bunch of valid versions. @@ -135,10 +136,10 @@ func TestDetermineSupportedProxyFeaturesFromString(t *testing.T) { } */ for _, v := range []string{ - "1.21.0", "1.21.1", "1.21.2", "1.21.3", "1.21.4", "1.21.5", "1.22.0", "1.22.1", "1.22.2", "1.22.3", "1.22.4", "1.22.5", - "1.23.0", "1.23.1", "1.23.2", - "1.24.0", + "1.23.0", "1.23.1", "1.23.2", "1.23.3", "1.23.4", + "1.24.0", "1.24.1", "1.24.2", + "1.25.0", "1.25.1", } { cases[v] = testcase{expect: SupportedProxyFeatures{}} } diff --git a/envoyextensions/xdscommon/proxysupport.go b/envoyextensions/xdscommon/proxysupport.go index 963e0dba0c2..bedc0608bfd 100644 --- a/envoyextensions/xdscommon/proxysupport.go +++ b/envoyextensions/xdscommon/proxysupport.go @@ -9,10 +9,10 @@ import "strings" // // see: https://www.consul.io/docs/connect/proxies/envoy#supported-versions var EnvoyVersions = []string{ - "1.24.0", - "1.23.2", + "1.25.1", + "1.24.2", + "1.23.4", "1.22.5", - "1.21.5", } // UnsupportedEnvoyVersions lists any unsupported Envoy versions (mainly minor versions) that fall diff --git a/website/content/docs/connect/proxies/envoy.mdx b/website/content/docs/connect/proxies/envoy.mdx index 19e98a13676..b47639dc765 100644 --- a/website/content/docs/connect/proxies/envoy.mdx +++ b/website/content/docs/connect/proxies/envoy.mdx @@ -39,6 +39,7 @@ Consul supports **four major Envoy releases** at the beginning of each major Con | Consul Version | Compatible Envoy Versions | | ------------------- | -----------------------------------------------------------------------------------| +| 1.15.x | 1.25.1, 1.24.2, 1.23.4, 1.22.5 | | 1.14.x | 1.24.0, 1.23.1, 1.22.5, 1.21.5 | | 1.13.x | 1.23.1, 1.22.5, 1.21.5, 1.20.7 | | 1.12.x | 1.22.5, 1.21.5, 1.20.7, 1.19.5 | @@ -52,6 +53,7 @@ Consul Dataplane is a feature introduced in Consul v1.14. Because each version o | Consul Version | Consul Dataplane Version | Bundled Envoy Version | | ------------------- | ------------------------ | ---------------------- | +| 1.15.x | 1.1.x | 1.25.x | | 1.14.x | 1.0.x | 1.24.x | ## Getting Started From 6599a9be1df8749431ed0f5af7a7a8772ce4281e Mon Sep 17 00:00:00 2001 From: Derek Menteer <105233703+hashi-derek@users.noreply.github.com> Date: Wed, 15 Feb 2023 11:54:44 -0600 Subject: [PATCH 006/262] Fix nil-pointer panics from proxycfg package. (#16277) Prior to this PR, servers / agents would panic and crash if an ingress or api gateway were configured to use a discovery chain that both: 1. Referenced a peered service 2. Had a mesh gateway mode of local This could occur, because code for handling upstream watches was shared between both connect-proxy and the gateways. As a short-term fix, this PR ensures that the maps are always initialized for these gateway services. This PR also wraps the proxycfg execution and service registration calls with recover statements to ensure that future issues like this do not put the server into an unrecoverable state. --- agent/proxycfg/api_gateway.go | 1 + agent/proxycfg/ingress_gateway.go | 1 + agent/proxycfg/manager.go | 15 +++++++++++++++ agent/proxycfg/state.go | 16 ++++++++++++++++ 4 files changed, 33 insertions(+) diff --git a/agent/proxycfg/api_gateway.go b/agent/proxycfg/api_gateway.go index 28a6c423006..c9b5ad1007e 100644 --- a/agent/proxycfg/api_gateway.go +++ b/agent/proxycfg/api_gateway.go @@ -73,6 +73,7 @@ func (h *handlerAPIGateway) initialize(ctx context.Context) (ConfigSnapshot, err snap.APIGateway.WatchedDiscoveryChains = make(map[UpstreamID]context.CancelFunc) snap.APIGateway.WatchedGateways = make(map[UpstreamID]map[string]context.CancelFunc) snap.APIGateway.WatchedGatewayEndpoints = make(map[UpstreamID]map[string]structs.CheckServiceNodes) + snap.APIGateway.WatchedLocalGWEndpoints = watch.NewMap[string, structs.CheckServiceNodes]() snap.APIGateway.WatchedUpstreams = make(map[UpstreamID]map[string]context.CancelFunc) snap.APIGateway.WatchedUpstreamEndpoints = make(map[UpstreamID]map[string]structs.CheckServiceNodes) diff --git a/agent/proxycfg/ingress_gateway.go b/agent/proxycfg/ingress_gateway.go index b6c1cd6e029..f0f75d8107c 100644 --- a/agent/proxycfg/ingress_gateway.go +++ b/agent/proxycfg/ingress_gateway.go @@ -67,6 +67,7 @@ func (s *handlerIngressGateway) initialize(ctx context.Context) (ConfigSnapshot, snap.IngressGateway.WatchedUpstreamEndpoints = make(map[UpstreamID]map[string]structs.CheckServiceNodes) snap.IngressGateway.WatchedGateways = make(map[UpstreamID]map[string]context.CancelFunc) snap.IngressGateway.WatchedGatewayEndpoints = make(map[UpstreamID]map[string]structs.CheckServiceNodes) + snap.IngressGateway.WatchedLocalGWEndpoints = watch.NewMap[string, structs.CheckServiceNodes]() snap.IngressGateway.Listeners = make(map[IngressListenerKey]structs.IngressListener) snap.IngressGateway.UpstreamPeerTrustBundles = watch.NewMap[string, *pbpeering.PeeringTrustBundle]() snap.IngressGateway.PeerUpstreamEndpoints = watch.NewMap[UpstreamID, structs.CheckServiceNodes]() diff --git a/agent/proxycfg/manager.go b/agent/proxycfg/manager.go index eb5df5a8552..c58268e7e03 100644 --- a/agent/proxycfg/manager.go +++ b/agent/proxycfg/manager.go @@ -2,6 +2,7 @@ package proxycfg import ( "errors" + "runtime/debug" "sync" "github.com/hashicorp/go-hclog" @@ -142,6 +143,20 @@ func (m *Manager) Register(id ProxyID, ns *structs.NodeService, source ProxySour m.mu.Lock() defer m.mu.Unlock() + defer func() { + if r := recover(); r != nil { + m.Logger.Error("unexpected panic during service manager registration", + "node", id.NodeName, + "service", id.ServiceID, + "message", r, + "stacktrace", string(debug.Stack()), + ) + } + }() + return m.register(id, ns, source, token, overwrite) +} + +func (m *Manager) register(id ProxyID, ns *structs.NodeService, source ProxySource, token string, overwrite bool) error { state, ok := m.proxies[id] if ok { if state.source != source && !overwrite { diff --git a/agent/proxycfg/state.go b/agent/proxycfg/state.go index 57964d54fe1..d312c3b4c10 100644 --- a/agent/proxycfg/state.go +++ b/agent/proxycfg/state.go @@ -6,6 +6,7 @@ import ( "fmt" "net" "reflect" + "runtime/debug" "sync/atomic" "time" @@ -298,6 +299,21 @@ func newConfigSnapshotFromServiceInstance(s serviceInstance, config stateConfig) } func (s *state) run(ctx context.Context, snap *ConfigSnapshot) { + // Add a recover here so than any panics do not make their way up + // into the server / agent. + defer func() { + if r := recover(); r != nil { + s.logger.Error("unexpected panic while running proxycfg", + "node", s.serviceInstance.proxyID.NodeName, + "service", s.serviceInstance.proxyID.ServiceID, + "message", r, + "stacktrace", string(debug.Stack())) + } + }() + s.unsafeRun(ctx, snap) +} + +func (s *state) unsafeRun(ctx context.Context, snap *ConfigSnapshot) { // Close the channel we return from Watch when we stop so consumers can stop // watching and clean up their goroutines. It's important we do this here and // not in Close since this routine sends on this chan and so might panic if it From 514fb25a6fff38322398860e1b157d866c45ad81 Mon Sep 17 00:00:00 2001 From: Nathan Coleman Date: Wed, 15 Feb 2023 14:49:34 -0500 Subject: [PATCH 007/262] Fix infinite recursion in inline-certificate config entry (#16276) * Fix infinite recursion on InlineCertificateConfigEntry GetNamespace() + GetMeta() were calling themselves. This change also simplifies by removing nil-checking to match pre-existing config entries Co-Authored-By: Andrew Stucki <3577250+andrewstucki@users.noreply.github.com> * Add tests for inline-certificate * Add alias for private key field on inline-certificate * Use valid certificate + private key for inline-certificate tests --------- Co-authored-by: Andrew Stucki <3577250+andrewstucki@users.noreply.github.com> --- .../config_entry_inline_certificate.go | 38 +----- api/config_entry_inline_certificate.go | 48 ++----- api/config_entry_inline_certificate_test.go | 122 ++++++++++++++++++ 3 files changed, 137 insertions(+), 71 deletions(-) create mode 100644 api/config_entry_inline_certificate_test.go diff --git a/agent/structs/config_entry_inline_certificate.go b/agent/structs/config_entry_inline_certificate.go index 7cfc71a6b2c..24028ffff2f 100644 --- a/agent/structs/config_entry_inline_certificate.go +++ b/agent/structs/config_entry_inline_certificate.go @@ -29,17 +29,14 @@ type InlineCertificateConfigEntry struct { RaftIndex } -func (e *InlineCertificateConfigEntry) GetKind() string { - return InlineCertificate -} - -func (e *InlineCertificateConfigEntry) GetName() string { - return e.Name -} - -func (e *InlineCertificateConfigEntry) Normalize() error { - return nil +func (e *InlineCertificateConfigEntry) GetKind() string { return InlineCertificate } +func (e *InlineCertificateConfigEntry) GetName() string { return e.Name } +func (e *InlineCertificateConfigEntry) Normalize() error { return nil } +func (e *InlineCertificateConfigEntry) GetMeta() map[string]string { return e.Meta } +func (e *InlineCertificateConfigEntry) GetEnterpriseMeta() *acl.EnterpriseMeta { + return &e.EnterpriseMeta } +func (e *InlineCertificateConfigEntry) GetRaftIndex() *RaftIndex { return &e.RaftIndex } func (e *InlineCertificateConfigEntry) Validate() error { privateKeyBlock, _ := pem.Decode([]byte(e.PrivateKey)) @@ -78,24 +75,3 @@ func (e *InlineCertificateConfigEntry) CanWrite(authz acl.Authorizer) error { e.FillAuthzContext(&authzContext) return authz.ToAllowAuthorizer().MeshWriteAllowed(&authzContext) } - -func (e *InlineCertificateConfigEntry) GetMeta() map[string]string { - if e == nil { - return nil - } - return e.Meta -} - -func (e *InlineCertificateConfigEntry) GetEnterpriseMeta() *acl.EnterpriseMeta { - if e == nil { - return nil - } - return &e.EnterpriseMeta -} - -func (e *InlineCertificateConfigEntry) GetRaftIndex() *RaftIndex { - if e == nil { - return &RaftIndex{} - } - return &e.RaftIndex -} diff --git a/api/config_entry_inline_certificate.go b/api/config_entry_inline_certificate.go index d2aa5115eac..bbf12ccaaf6 100644 --- a/api/config_entry_inline_certificate.go +++ b/api/config_entry_inline_certificate.go @@ -12,7 +12,7 @@ type InlineCertificateConfigEntry struct { // Certificate is the public certificate component of an x509 key pair encoded in raw PEM format. Certificate string // PrivateKey is the private key component of an x509 key pair encoded in raw PEM format. - PrivateKey string + PrivateKey string `alias:"private_key"` Meta map[string]string `json:",omitempty"` @@ -34,42 +34,10 @@ type InlineCertificateConfigEntry struct { Namespace string `json:",omitempty"` } -func (a *InlineCertificateConfigEntry) GetKind() string { - return InlineCertificate -} - -func (a *InlineCertificateConfigEntry) GetName() string { - if a != nil { - return "" - } - return a.Name -} - -func (a *InlineCertificateConfigEntry) GetPartition() string { - if a != nil { - return "" - } - return a.Partition -} - -func (a *InlineCertificateConfigEntry) GetNamespace() string { - if a != nil { - return "" - } - return a.GetNamespace() -} - -func (a *InlineCertificateConfigEntry) GetMeta() map[string]string { - if a != nil { - return nil - } - return a.GetMeta() -} - -func (a *InlineCertificateConfigEntry) GetCreateIndex() uint64 { - return a.CreateIndex -} - -func (a *InlineCertificateConfigEntry) GetModifyIndex() uint64 { - return a.ModifyIndex -} +func (a *InlineCertificateConfigEntry) GetKind() string { return InlineCertificate } +func (a *InlineCertificateConfigEntry) GetName() string { return a.Name } +func (a *InlineCertificateConfigEntry) GetPartition() string { return a.Partition } +func (a *InlineCertificateConfigEntry) GetNamespace() string { return a.Namespace } +func (a *InlineCertificateConfigEntry) GetMeta() map[string]string { return a.Meta } +func (a *InlineCertificateConfigEntry) GetCreateIndex() uint64 { return a.CreateIndex } +func (a *InlineCertificateConfigEntry) GetModifyIndex() uint64 { return a.ModifyIndex } diff --git a/api/config_entry_inline_certificate_test.go b/api/config_entry_inline_certificate_test.go new file mode 100644 index 00000000000..3b1cc1f54ef --- /dev/null +++ b/api/config_entry_inline_certificate_test.go @@ -0,0 +1,122 @@ +package api + +import ( + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +const ( + // generated via openssl req -x509 -sha256 -days 1825 -newkey rsa:2048 -keyout private.key -out certificate.crt + validPrivateKey = `-----BEGIN RSA PRIVATE KEY----- +MIIEowIBAAKCAQEAx95Opa6t4lGEpiTUogEBptqOdam2ch4BHQGhNhX/MrDwwuZQ +httBwMfngQ/wd9NmYEPAwj0dumUoAITIq6i2jQlhqTodElkbsd5vWY8R/bxJWQSo +NvVE12TlzECxGpJEiHt4W0r8pGffk+rvpljiUyCfnT1kGF3znOSjK1hRMTn6RKWC +yYaBvXQiB4SGilfLgJcEpOJKtISIxmZ+S409g9X5VU88/Bmmrz4cMyxce86Kc2ug +5/MOv0CjWDJwlrv8njneV2zvraQ61DDwQftrXOvuCbO5IBRHMOBHiHTZ4rtGuhMa +Ir21V4vb6n8c4YzXiFvhUYcyX7rltGZzVd+WmQIDAQABAoIBACYvceUzp2MK4gYA +GWPOP2uKbBdM0l+hHeNV0WAM+dHMfmMuL4pkT36ucqt0ySOLjw6rQyOZG5nmA6t9 +sv0g4ae2eCMlyDIeNi1Yavu4Wt6YX4cTXbQKThm83C6W2X9THKbauBbxD621bsDK +7PhiGPN60yPue7YwFQAPqqD4YaK+s22HFIzk9gwM/rkvAUNwRv7SyHMiFe4Igc1C +Eev7iHWzvj5Heoz6XfF+XNF9DU+TieSUAdjd56VyUb8XL4+uBTOhHwLiXvAmfaMR +HvpcxeKnYZusS6NaOxcUHiJnsLNWrxmJj9WEGgQzuLxcLjTe4vVmELVZD8t3QUKj +PAxu8tUCgYEA7KIWVn9dfVpokReorFym+J8FzLwSktP9RZYEMonJo00i8aii3K9s +u/aSwRWQSCzmON1ZcxZzWhwQF9usz6kGCk//9+4hlVW90GtNK0RD+j7sp4aT2JI8 +9eLEjTG+xSXa7XWe98QncjjL9lu/yrRncSTxHs13q/XP198nn2aYuQ8CgYEA2Dnt +sRBzv0fFEvzzFv7G/5f85mouN38TUYvxNRTjBLCXl9DeKjDkOVZ2b6qlfQnYXIru +H+W+v+AZEb6fySXc8FRab7lkgTMrwE+aeI4rkW7asVwtclv01QJ5wMnyT84AgDD/ +Dgt/RThFaHgtU9TW5GOZveL+l9fVPn7vKFdTJdcCgYEArJ99zjHxwJ1whNAOk1av +09UmRPm6TvRo4heTDk8oEoIWCNatoHI0z1YMLuENNSnT9Q280FFDayvnrY/qnD7A +kktT/sjwJOG8q8trKzIMqQS4XWm2dxoPcIyyOBJfCbEY6XuRsUuePxwh5qF942EB +yS9a2s6nC4Ix0lgPrqAIr48CgYBgS/Q6riwOXSU8nqCYdiEkBYlhCJrKpnJxF9T1 +ofa0yPzKZP/8ZEfP7VzTwHjxJehQ1qLUW9pG08P2biH1UEKEWdzo8vT6wVJT1F/k +HtTycR8+a+Hlk2SHVRHqNUYQGpuIe8mrdJ1as4Pd0d/F/P0zO9Rlh+mAsGPM8HUM +T0+9gwKBgHDoerX7NTskg0H0t8O+iSMevdxpEWp34ZYa9gHiftTQGyrRgERCa7Gj +nZPAxKb2JoWyfnu3v7G5gZ8fhDFsiOxLbZv6UZJBbUIh1MjJISpXrForDrC2QNLX +kHrHfwBFDB3KMudhQknsJzEJKCL/KmFH6o0MvsoaT9yzEl3K+ah/ +-----END RSA PRIVATE KEY-----` + validCertificate = `-----BEGIN CERTIFICATE----- +MIICljCCAX4CCQCQMDsYO8FrPjANBgkqhkiG9w0BAQsFADANMQswCQYDVQQGEwJV +UzAeFw0yMjEyMjAxNzUwMjVaFw0yNzEyMTkxNzUwMjVaMA0xCzAJBgNVBAYTAlVT +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx95Opa6t4lGEpiTUogEB +ptqOdam2ch4BHQGhNhX/MrDwwuZQhttBwMfngQ/wd9NmYEPAwj0dumUoAITIq6i2 +jQlhqTodElkbsd5vWY8R/bxJWQSoNvVE12TlzECxGpJEiHt4W0r8pGffk+rvplji +UyCfnT1kGF3znOSjK1hRMTn6RKWCyYaBvXQiB4SGilfLgJcEpOJKtISIxmZ+S409 +g9X5VU88/Bmmrz4cMyxce86Kc2ug5/MOv0CjWDJwlrv8njneV2zvraQ61DDwQftr +XOvuCbO5IBRHMOBHiHTZ4rtGuhMaIr21V4vb6n8c4YzXiFvhUYcyX7rltGZzVd+W +mQIDAQABMA0GCSqGSIb3DQEBCwUAA4IBAQBfCqoUIdPf/HGSbOorPyZWbyizNtHJ +GL7x9cAeIYxpI5Y/WcO1o5v94lvrgm3FNfJoGKbV66+JxOge731FrfMpHplhar1Z +RahYIzNLRBTLrwadLAZkApUpZvB8qDK4knsTWFYujNsylCww2A6ajzIMFNU4GkUK +NtyHRuD+KYRmjXtyX1yHNqfGN3vOQmwavHq2R8wHYuBSc6LAHHV9vG+j0VsgMELO +qwxn8SmLkSKbf2+MsQVzLCXXN5u+D8Yv+4py+oKP4EQ5aFZuDEx+r/G/31rTthww +AAJAMaoXmoYVdgXV+CPuBb2M4XCpuzLu3bcA2PXm5ipSyIgntMKwXV7r +-----END CERTIFICATE-----` +) + +func TestAPI_ConfigEntries_InlineCertificate(t *testing.T) { + t.Parallel() + c, s := makeClient(t) + defer s.Stop() + + configEntries := c.ConfigEntries() + + cert1 := &InlineCertificateConfigEntry{ + Kind: InlineCertificate, + Name: "cert1", + Meta: map[string]string{"foo": "bar"}, + Certificate: validCertificate, + PrivateKey: validPrivateKey, + } + + // set it + _, wm, err := configEntries.Set(cert1, nil) + require.NoError(t, err) + assert.NotNil(t, wm) + + // get it + entry, qm, err := configEntries.Get(InlineCertificate, "cert1", nil) + require.NoError(t, err) + require.NotNil(t, qm) + assert.NotEqual(t, 0, qm.RequestTime) + + readCert, ok := entry.(*InlineCertificateConfigEntry) + require.True(t, ok) + assert.Equal(t, cert1.Kind, readCert.Kind) + assert.Equal(t, cert1.Name, readCert.Name) + assert.Equal(t, cert1.Meta, readCert.Meta) + assert.Equal(t, cert1.Meta, readCert.GetMeta()) + + // update it + cert1.Meta["bar"] = "baz" + written, wm, err := configEntries.CAS(cert1, readCert.ModifyIndex, nil) + require.NoError(t, err) + require.NotNil(t, wm) + assert.NotEqual(t, 0, wm.RequestTime) + assert.True(t, written) + + // list it + entries, qm, err := configEntries.List(InlineCertificate, nil) + require.NoError(t, err) + require.NotNil(t, qm) + assert.NotEqual(t, 0, qm.RequestTime) + + require.Len(t, entries, 1) + assert.Equal(t, cert1.Kind, entries[0].GetKind()) + assert.Equal(t, cert1.Name, entries[0].GetName()) + + readCert, ok = entries[0].(*InlineCertificateConfigEntry) + require.True(t, ok) + assert.Equal(t, cert1.Certificate, readCert.Certificate) + assert.Equal(t, cert1.Meta, readCert.Meta) + + // delete it + wm, err = configEntries.Delete(InlineCertificate, cert1.Name, nil) + require.NoError(t, err) + require.NotNil(t, wm) + assert.NotEqual(t, 0, wm.RequestTime) + + // try to get it + _, _, err = configEntries.Get(InlineCertificate, cert1.Name, nil) + assert.Error(t, err) +} From c5e729e86576771c4c22c6da1e57aaa377319323 Mon Sep 17 00:00:00 2001 From: trujillo-adam <47586768+trujillo-adam@users.noreply.github.com> Date: Wed, 15 Feb 2023 14:37:32 -0800 Subject: [PATCH 008/262] Docs/reformat service splitters conf entry (#16264) * for tab testing * updates * Update * adding sandbox to test conf ref types * testing tweaks to the conf ref template * reintroduce tabbed specification * applied feedback from MKO session * applied feedback on format from luke and jared * Apply suggestions from code review Co-authored-by: Dan Upton * fixed some minor HCL formatting in complete conf * Apply suggestions from code review Co-authored-by: Jeff Boruszak <104028618+boruszak@users.noreply.github.com> * fixed bad link * resolving conflicts --------- Co-authored-by: boruszak Co-authored-by: Dan Upton Co-authored-by: Jeff Boruszak <104028618+boruszak@users.noreply.github.com> --- .../config-entries/service-splitter.mdx | 835 +++++++++++++----- 1 file changed, 630 insertions(+), 205 deletions(-) diff --git a/website/content/docs/connect/config-entries/service-splitter.mdx b/website/content/docs/connect/config-entries/service-splitter.mdx index 4386fba281b..34ea9597e21 100644 --- a/website/content/docs/connect/config-entries/service-splitter.mdx +++ b/website/content/docs/connect/config-entries/service-splitter.mdx @@ -1,54 +1,575 @@ ---- +--- layout: docs -page_title: Service Splitter - Configuration Entry Reference -description: >- - The service splitter configuration entry kind defines how to divide service mesh traffic between service instances. Use the reference guide to learn about `""service-splitter""` config entry parameters and how it can be used for traffic management behaviors like canary rollouts, blue green deployment, and load balancing across environments. +page_title: Service Splitter Configuration Entry Reference +description: >- + Service splitter configuration entries are L7 traffic management tools for redirecting requests for a service to + multiple instances. Learn how to write `service-splitter` config entries in HCL or YAML with a specification + reference, configuration model, a complete example, and example code by use case. --- -# Service Splitter Configuration Entry +# Service Splitter Configuration Reference + +This reference page describes the structure and contents of service splitter configuration entries. Configure and apply service splitters to redirect a percentage of incoming traffic requests for a service to one or more specific service instances. + +## Configuration model + +The following list outlines field hierarchy, language-specific data types, and requirements in a service splitter configuration entry. Click on a property name to view additional details, including default values. + + + + + +- [`Kind`](#kind): string | required +- [`Name`](#name): string | required +- [`Namespace`](#namespace): string +- [`Partition`](#partition): string +- [`Meta`](#meta): map +- [`Splits`](#splits): map | required + - [`Weight`](#splits-weight): number | required + - [`Service`](#splits-service): string | required + - [`ServiceSubset`](#splits-servicesubset): string + - [`Namespace`](#splits-namespace): string + - [`Partition`](#splits-partition): string + - [`RequestHeaders`](#splits-requestheaders): map + - [`Add`](#splits-requestheaders): map + - [`Set`](#splits-requestheaders): map + - [`Remove`](#splits-requestheaders): map + - [`ResponseHeaders`](#splits-responseheaders): map + - [`Add`](#splits-responseheaders): map + - [`Set`](#splits-responseheaders): map + - [`Remove`](#splits-responseheaders): map + + + + + +- [`apiVersion`](#apiversion): string | required +- [`kind`](#kind): string | required +- [`metadata`](#metadata): object | required + - [`name`](#metadata-name): string | required + - [`namespace`](#metadata-namespace): string | optional +- [`spec`](#spec): object | required + - [`splits`](#spec-splits): list | required + - [`weight`](#spec-splits-weight): float32 | required + - [`service`](#spec-splits-service): string | required + - [`serviceSubset`](#spec-splits-servicesubset): string + - [`namespace`](#spec-splits-namespace): string + - [`partition`](#spec-splits-partition): string + - [`requestHeaders`](#spec-splits-requestheaders): HTTPHeaderModifiers + - [`add`](#spec-splits-requestheaders): map + - [`set`](#spec-splits-requestheaders): map + - [`remove`](#spec-splits-requestheaders): map + - [`responseHeaders`](#spec-splits-responseheaders): HTTPHeaderModifiers + - [`add`](#spec-splits-responseheaders): map + - [`set`](#spec-splits-responseheaders): map + - [`remove`](#spec-splits-responseheaders): map + + + + +## Complete configuration + +When every field is defined, a service splitter configuration entry has the following form: + + + + + +```hcl +Kind = "service-splitter" ## string | required +Name = "config-entry-name" ## string | required +Namespace = "main" ## string +Partition = "partition" ## string +Meta = { ## map + key = "value" +} +Splits = [ ## list | required + { ## map + Weight = 90 ## number | required + Service = "service" ## string + ServiceSubset = "v1" ## string + Namespace = "target-namespace" ## string + Partition = "target-partition" ## string + RequestHeaders = { ## map + Set = { + "X-Web-Version" : "from-v1" + } + } + ResponseHeaders = { ## map + Set = { + "X-Web-Version" : "to-v1" + } + } + }, + { + Weight = 10 + Service = "service" + ServiceSubset = "v2" + Namespace = "target-namespace" + Partition = "target-partition" + RequestHeaders = { + Set = { + "X-Web-Version" : "from-v2" + } + } + ResponseHeaders = { + Set = { + "X-Web-Version" : "to-v2" + } + } + } +] +``` + + + + + +```json +{ + "Kind" : "service-splitter", ## string | required + "Name" : "config-entry-name", ## string | required + "Namespace" : "main", ## string + "Partition" : "partition", ## string + "Meta" : { ## map + "_key_" : "_value_" + }, + "Splits" : [ ## list | required + { ## map + "Weight" : 90, ## number | required + "Service" : "service", ## string + "ServiceSubset" : "v1", ## string + "Namespace" : "target-namespace", ## string + "Partition" : "target-partition", ## string + "RequestHeaders" : { ## map + "Set" : { + "X-Web-Version": "from-v1" + } + }, + "ResponseHeaders" : { ## map + "Set" : { + "X-Web-Version": "to-v1" + } + } + }, + { + "Weight" : 10, + "Service" : "service", + "ServiceSubset" : "v2", + "Namespace" : "target-namespace", + "Partition" : "target-partition", + "RequestHeaders" : { + "Set" : { + "X-Web-Version": "from-v2" + } + }, + "ResponseHeaders" : { + "Set" : { + "X-Web-Version": "to-v2" + } + } + } + ] +} +``` + + + + + +```yaml +apiVersion: consul.hashicorp.com/v1alpha1 # string | required +kind: ServiceSplitter # string | required +metadata: # object | required + name: config-entry-name # string | required + namespace: main # string +spec: + splits: # list + - weight: 90 # floating point | required + service: service # string + serviceSubset: v1 # string + namespace: target-namespace # string + partition: target-partition # string + requestHeaders: + set: + x-web-version: from-v1 # string + responseHeaders: + set: + x-web-version: to-v1 # string + - weight: 10 + service: service + serviceSubset: v2 + namespace: target-namespace + partition: target-partition + requestHeaders: + set: + x-web-version: from-v2 + responseHeaders: + set: + x-web-version: to-v2 +``` + + + + + +## Specification + +This section provides details about the fields you can configure in the service splitter configuration entry. + + + + + +### `Kind` + +Specifies the type of configuration entry to implement. + +#### Values + +- Default: none +- This field is required. +- Data type: String value that must be set to `service-splitter`. + +### `Name` + +Specifies a name for the configuration entry. The name is metadata that you can use to reference the configuration entry when performing Consul operations, such as applying a configuration entry to a specific cluster. + +#### Values + +- Default: Defaults to the name of the node after writing the entry to the Consul server. +- This field is required. +- Data type: String + + +### `Namespace` + +Specifies the [namespace](/consul/docs/enterprise/namespaces) to apply the configuration entry. + +#### Values + +- Default: None +- Data type: String + +### `Partition` + +Specifies the [admin partition](/consul/docs/enterprise/admin-partitions) to apply the configuration entry. + +#### Values + +- Default: `Default` +- Data type: String + +### `Meta` + +Specifies key-value pairs to add to the KV store. + +#### Values + +- Default: none +- Data type: Map of one or more key-value pairs + - keys: String + - values: String, integer, or float + +### `Splits` + +Defines how much traffic to send to sets of service instances during a traffic split. + +#### Values + +- Default: None +- This field is required. +- Data type: list of objects that can contain the following fields: + - `Weight`: The sum of weights for a set of service instances must add up to 100. + - `Service`: This field is required. + - `ServiceSubset` + - `Namespace` + - `Partition` + - `RequestHeaders` + - `ResponseHeaders` + +### `Splits[].Weight` + +Specifies the percentage of traffic sent to the set of service instances specified in the [`Service`](#service) field. Each weight must be a floating integer between `0` and `100`. The smallest representable value is `.01`. The sum of weights across all splits must add up to `100`. + +#### Values + +- Default: `null` +- This field is required. +- Data type: Floating number from `.01` to `100`. + +### `Splits[].Service` + +Specifies the name of the service to resolve. + +#### Values + +- Default: Inherits the value of the [`Name`](#name) field. +- Data type: String + +### `Splits[].ServiceSubset` + +Specifies a subset of the service to resolve. A service subset assigns a name to a specific subset of discoverable service instances within a datacenter, such as `version2` or `canary`. All services have an unnamed default subset that returns all healthy instances. + +You can define service subsets in a [service resolver configuration entry](/consul/docs/connect/config-entries/service-resolver), which are referenced by their names throughout the other configuration entries. This field overrides the default subset value in the service resolver configuration entry. + +#### Values + +- Default: If empty, the `split` uses the default subset. +- Data type: String + +### `Splits[].Namespace` + +Specifies the [namespace](/consul/docs/enterprise/namespaces) to use in the FQDN when resolving the service. + +#### Values + +- Default: Inherits the value of [`Namespace`](#Namespace) from the top-level of the configuration entry. +- Data type: String + +### `Splits[].Partition` + +Specifies the [admin partition](/consul/docs/enterprise/admin-partitions) to use in the FQDN when resolving the service. + +#### Values + +- Default: By default, the `service-splitter` uses the [admin partition specified in the top-level configuration entry](#partition). +- Data type: String + +### `Splits[].RequestHeaders` + +Specifies a set of HTTP-specific header modification rules applied to requests routed with the service split. You cannot configure request headers if the listener protocol is set to `tcp`. Refer to [Set HTTP Headers](#set-http-headers) for an example configuration. + +#### Values + +- Default: None +- Values: Object containing one or more fields that define header modification rules + - `Add`: Map of one or more key-value pairs + - `Set`: Map of one or more key-value pairs + - `Remove`: Map of one or more key-value pairs + +The following table describes how to configure values for request headers: + +| Rule | Description | Type | +| --- | --- | --- | +| `Add` | Defines a set of key-value pairs to add to the header. Use header names as the keys. Header names are not case-sensitive. If header values with the same name already exist, the value is appended and Consul applies both headers. You can [use variable placeholders](#use-variable-placeholders). | map of strings | +| `Set` | Defines a set of key-value pairs to add to the request header or to replace existing header values with. Use header names as the keys. Header names are not case-sensitive. If header values with the same names already exist, Consul replaces the header values. You can [use variable placeholders](#use-variable-placeholders). | map of strings | +| `Remove` | Defines an list of headers to remove. Consul removes only headers containing exact matches. Header names are not case-sensitive. | list of strings | + +#### Use variable placeholders + +For `Add` and `Set`, if the service is configured to use Envoy as the proxy, the value may contain variables to interpolate dynamic metadata into the value. For example, using the variable `%DOWNSTREAM_REMOTE_ADDRESS%` in your configuration entry allows you to pass a value that is generated when the split occurs. + + +### `Splits[].ResponseHeaders` + +Specifies a set of HTTP-specific header modification rules applied to responses routed with the service split. You cannot configure request headers if the listener protocol is set to `tcp`. Refer to [Set HTTP Headers](#set-http-headers) for an example configuration. + +#### Values + +- Default: None +- Values: Object containing one or more fields that define header modification rules + - `Add`: Map of one or more string key-value pairs + - `Set`: Map of one or more string key-value pairs + - `Remove`: Map of one or more string key-value pairs + +The following table describes how to configure values for response headers: + +| Rule | Description | Type | +| --- | --- | --- | +| `Add` | Defines a set of key-value pairs to add to the header. Use header names as the keys. Header names are not case-sensitive. If header values with the same name already exist, the value is appended and Consul applies both headers. You can [use variable placeholders](#use-variable-placeholders). | map of strings | +| `Set` | Defines a set of key-value pairs to add to the request header or to replace existing header values with. Use header names as the keys. Header names are not case-sensitive. If header values with the same names already exist, Consul replaces the header values. You can [use variable placeholders](#use-variable-placeholders). | map of strings | +| `Remove` | Defines an list of headers to remove. Consul removes only headers containing exact matches. Header names are not case-sensitive. | list of strings | + +#### Use variable placeholders + +For `Add` and `Set`, if the service is configured to use Envoy as the proxy, the value may contain variables to interpolate dynamic metadata into the value. For example, using the variable `%DOWNSTREAM_REMOTE_ADDRESS%` in your configuration entry allows you to pass a value that is generated when the split occurs. + + + + + +### `apiVersion` + +Kubernetes-only parameter that specifies the version of the Consul API that the configuration entry maps to Kubernetes configurations. The value must be `consul.hashicorp.com/v1alpha1`. + +### `kind` + +Specifies the type of configuration entry to implement. + +#### Values + +- Default: none +- This field is required. +- Data type: String value that must be set to `serviceSplitter`. + +### `metadata.name` + +Specifies a name for the configuration entry. The name is metadata that you can use to reference the configuration entry when performing Consul operations, such as applying a configuration entry to a specific cluster. + +#### Values + +- Default: Inherits name from the host node +- This field is required. +- Data type: String + + +### `metadata.namespace` + +Specifies the Consul namespace to use for resolving the service. You can map Consul namespaces to Kubernetes Namespaces in different ways. Refer to [Custom Resource Definitions (CRDs) for Consul on Kubernetes](/consul/docs/k8s/crds#consul-enterprise) for additional information. + +#### Values + +- Default: None +- Data type: String + +### `spec` + +Kubernetes-only field that contains all of the configurations for service splitter pods. + +#### Values + +- Default: none +- This field is required. +- Data type: Object containing [`spec.splits`](#spec-splits) configuration + +### `spec.meta` + +Specifies key-value pairs to add to the KV store. + +#### Values + +- Default: none +- Data type: Map of one or more key-value pairs + - keys: String + - values: String, integer, or float + +### `spec.splits` + +Defines how much traffic to send to sets of service instances during a traffic split. --> **v1.8.4+:** On Kubernetes, the `ServiceSplitter` custom resource is supported in Consul versions 1.8.4+.
-**v1.6.0+:** On other platforms, this config entry is supported in Consul versions 1.6.0+. +#### Values -The `service-splitter` config entry kind (`ServiceSplitter` on Kubernetes) controls how to split incoming Connect -requests across different subsets of a single service (like during staged -canary rollouts), or perhaps across different services (like during a v2 -rewrite or other type of codebase migration). +- Default: None +- This field is required. +- Data type: list of objects that can contain the following fields: + - `weight`: The sum of weights for a set of service instances. The total defined value must add up to 100. + - `service`: This field is required. + - `serviceSubset` + - `namespace` + - `partition` + - `requestHeaders` + - `responseHeaders` -If no splitter config is defined for a service it is assumed 100% of traffic -flows to a service with the same name and discovery continues on to the -resolution stage. +### `spec.splits[].weight` -## Interaction with other Config Entries +Specifies the percentage of traffic sent to the set of service instances specified in the [`spec.splits.service`](#spec-splits-service) field. Each weight must be a floating integer between `0` and `100`. The smallest representable value is `.01`. The sum of weights across all splits must add up to `100`. -- Service splitter config entries are a component of [L7 Traffic - Management](/consul/docs/connect/l7-traffic). +#### Values -- Service splitter config entries are restricted to only services that define - their protocol as http-based via a corresponding - [`service-defaults`](/consul/docs/connect/config-entries/service-defaults) config - entry or globally via - [`proxy-defaults`](/consul/docs/connect/config-entries/proxy-defaults) . +- Default: `null` +- This field is required. +- Data type: Floating integer from `.01` to `100` -- Any split destination that specifies a different `Service` field and omits - the `ServiceSubset` field is eligible for further splitting should a splitter - be configured for that other service, otherwise resolution proceeds according - to any configured - [`service-resolver`](/consul/docs/connect/config-entries/service-resolver). +### `spec.splits[].service` -## UI +Specifies the name of the service to resolve. -Once a `service-splitter` is successfully entered, you can view it in the UI. Service routers, service splitters, and service resolvers can all be viewed by clicking on your service then switching to the _routing_ tab. +#### Values -![screenshot of service splitter in the UI](/img/l7-routing/Splitter.png) +- Default: The service matching the configuration entry [`meta.name`](#metadata-name) field. +- Data type: String -## Sample Config Entries +### `spec.splits[].serviceSubset` + +Specifies a subset of the service to resolve. This field overrides the `DefaultSubset`. + +#### Values + +- Default: Inherits the name of the default subset. +- Data type: String + +### `spec.splits[].namespace` + +Specifies the [namespace](/consul/docs/enterprise/namespaces) to use when resolving the service. + +#### Values + +- Default: The namespace specified in the top-level configuration entry. +- Data type: String + +### `spec.splits[].partition` + +Specifies which [admin partition](/consul/docs/enterprise/admin-partitions) to use in the FQDN when resolving the service. + +#### Values + +- Default: `default` +- Data type: String + +### `spec.splits[].requestHeaders` + +Specifies a set of HTTP-specific header modification rules applied to requests routed with the service split. You cannot configure request headers if the listener protocol is set to `tcp`. Refer to [Set HTTP Headers](#set-http-headers) for an example configuration. + +#### Values + +- Default: None +- Values: Object containing one or more fields that define header modification rules + - `add`: Map of one or more key-value pairs + - `set`: Map of one or more key-value pairs + - `remove`: Map of one or more key-value pairs + +The following table describes how to configure values for request headers: + +| Rule | Description | Type | +| --- | --- | --- | +| `add` | Defines a set of key-value pairs to add to the header. Use header names as the keys. Header names are not case-sensitive. If header values with the same name already exist, the value is appended and Consul applies both headers. You can [use variable placeholders](#use-variable-placeholders). | map of strings | +| `set` | Defines a set of key-value pairs to add to the request header or to replace existing header values with. Use header names as the keys. Header names are not case-sensitive. If header values with the same names already exist, Consul replaces the header values. You can [use variable placeholders](#use-variable-placeholders). | map of strings | +| `remove` | Defines an list of headers to remove. Consul removes only headers containing exact matches. Header names are not case-sensitive. | list of strings | + +#### Use variable placeholders + +For `add` and `set`, if the service is configured to use Envoy as the proxy, the value may contain variables to interpolate dynamic metadata into the value. For example, using the variable `%DOWNSTREAM_REMOTE_ADDRESS%` in your configuration entry allows you to pass a value that is generated when the split occurs. + +### `spec.splits[].responseHeaders` + +Specifies a set of HTTP-specific header modification rules applied to responses routed with the service split. You cannot configure request headers if the listener protocol is set to `tcp`. Refer to [Set HTTP Headers](#set-http-headers) for an example configuration. + +#### Values + +- Default: None +- Values: Object containing one or more fields that define header modification rules + - `add`: Map of one or more string key-value pairs + - `set`: Map of one or more string key-value pairs + - `remove`: Map of one or more string key-value pairs + +The following table describes how to configure values for response headers: + +| Rule | Description | Type | +| --- | --- | --- | +| `add` | Defines a set of key-value pairs to add to the header. Use header names as the keys. Header names are not case-sensitive. If header values with the same name already exist, the value is appended and Consul applies both headers. You can [use variable placeholders](#use-variable-placeholders). | map of strings | +| `set` | Defines a set of key-value pairs to add to the request header or to replace existing header values with. Use header names as the keys. Header names are not case-sensitive. If header values with the same names already exist, Consul replaces the header values. You can [use variable placeholders](#use-variable-placeholders). | map of strings | +| `remove` | Defines an list of headers to remove. Consul removes only headers containing exact matches. Header names are not case-sensitive. | list of strings | + +#### Use variable placeholders + +For `add` and `set`, if the service is configured to use Envoy as the proxy, the value may contain variables to interpolate dynamic metadata into the value. For example, using the variable `%DOWNSTREAM_REMOTE_ADDRESS%` in your configuration entry allows you to pass a value that is generated when the split occurs. + +
+ +
+ +## Examples + +The following examples demonstrate common service splitter configuration patterns for specific use cases. ### Two subsets of same service Split traffic between two subsets of the same service: - + + + ```hcl Kind = "service-splitter" @@ -65,18 +586,9 @@ Splits = [ ] ``` -```yaml -apiVersion: consul.hashicorp.com/v1alpha1 -kind: ServiceSplitter -metadata: - name: web -spec: - splits: - - weight: 90 - serviceSubset: v1 - - weight: 10 - serviceSubset: v2 -``` + + + ```json { @@ -95,13 +607,34 @@ spec: } ``` - + + + + +```yaml +apiVersion: consul.hashicorp.com/v1alpha1 +kind: ServiceSplitter +metadata: + name: web +spec: + splits: + - weight: 90 + serviceSubset: v1 + - weight: 10 + serviceSubset: v2 +``` + + + + ### Two different services Split traffic between two services: - + + + ```hcl Kind = "service-splitter" @@ -118,18 +651,9 @@ Splits = [ ] ``` -```yaml -apiVersion: consul.hashicorp.com/v1alpha1 -kind: ServiceSplitter -metadata: - name: web -spec: - splits: - - weight: 50 - # will default to service with same name as config entry ("web") - - weight: 50 - service: web-rewrite -``` + + + ```json { @@ -147,14 +671,35 @@ spec: } ``` - + + + + +```yaml +apiVersion: consul.hashicorp.com/v1alpha1 +kind: ServiceSplitter +metadata: + name: web +spec: + splits: + - weight: 50 + # defaults to the service with same name as the configuration entry ("web") + - weight: 50 + service: web-rewrite +``` + + + + ### Set HTTP Headers Split traffic between two subsets with extra headers added so clients can tell which version: - + + + ```hcl Kind = "service-splitter" @@ -181,24 +726,9 @@ Splits = [ ] ``` -```yaml -apiVersion: consul.hashicorp.com/v1alpha1 -kind: ServiceSplitter -metadata: - name: web -spec: - splits: - - weight: 90 - serviceSubset: v1 - responseHeaders: - set: - x-web-version: v1 - - weight: 10 - serviceSubset: v2 - responseHeaders: - set: - x-web-version: v2 -``` + + + ```json { @@ -227,136 +757,31 @@ spec: } ``` - + -## Available Fields -', - yaml: false, - }, - { - name: 'Namespace', - type: `string: "default"`, - enterprise: true, - description: - 'Specifies the namespace to which the configuration entry will apply.', - yaml: false, - }, - { - name: 'Partition', - type: `string: "default"`, - enterprise: true, - description: - 'Specifies the admin partition to which the configuration entry will apply.', - yaml: false, - }, - { - name: 'Meta', - type: 'map: nil', - description: - 'Specifies arbitrary KV metadata pairs. Added in Consul 1.8.4.', - yaml: false, - }, - { - name: 'metadata', - children: [ - { - name: 'name', - description: 'Set to the name of the service being configured.', - }, - { - name: 'namespace', - description: - 'If running Consul Open Source, the namespace is ignored (see [Kubernetes Namespaces in Consul OSS](/consul/docs/k8s/crds#consul-oss)). If running Consul Enterprise see [Kubernetes Namespaces in Consul Enterprise](/consul/docs/k8s/crds#consul-enterprise) for more details.', - }, - ], - hcl: false, - }, - { - name: 'Splits', - type: 'array', - description: - 'Defines how much traffic to send to which set of service instances during a traffic split. The sum of weights across all splits must add up to 100.', - children: [ - { - name: 'weight', - type: 'float32: 0', - description: - 'A value between 0 and 100 reflecting what portion of traffic should be directed to this split. The smallest representable weight is 1/10000 or .01%', - }, - { - name: 'Service', - type: 'string: ""', - description: 'The service to resolve instead of the default.', - }, - { - name: 'ServiceSubset', - type: 'string: ""', - description: { - hcl: - "A named subset of the given service to resolve instead of one defined as that service's `DefaultSubset`. If empty the default subset is used.", - yaml: - "A named subset of the given service to resolve instead of one defined as that service's `defaultSubset`. If empty the default subset is used.", - }, - }, - { - name: 'Namespace', - enterprise: true, - type: 'string: ""', - description: - 'The namespace to resolve the service from instead of the current namespace. If empty, the current namespace is used.', - }, - { - name: 'Partition', - enterprise: true, - type: 'string: ""', - description: - 'The admin partition to resolve the service from instead of the current partition. If empty, the current partition is used.', - }, - { - name: 'RequestHeaders', - type: 'HTTPHeaderModifiers: ', - description: `A set of [HTTP-specific header modification rules](/consul/docs/connect/config-entries/service-router#httpheadermodifiers) - that will be applied to requests routed to this split. - This cannot be used with a \`tcp\` listener.`, - }, - { - name: 'ResponseHeaders', - type: 'HTTPHeaderModifiers: ', - description: `A set of [HTTP-specific header modification rules](/consul/docs/connect/config-entries/service-router#httpheadermodifiers) - that will be applied to responses from this split. - This cannot be used with a \`tcp\` listener.`, - }, - ], - }, - ]} -/> - -## ACLs -Configuration entries may be protected by [ACLs](/consul/docs/security/acl). + -Reading a `service-splitter` config entry requires `service:read` on the resource. +```yaml +apiVersion: consul.hashicorp.com/v1alpha1 +kind: ServiceSplitter +metadata: + name: web +spec: + splits: + - weight: 90 + serviceSubset: v1 + responseHeaders: + set: + x-web-version: v1 + - weight: 10 + serviceSubset: v2 + responseHeaders: + set: + x-web-version: v2 +``` -Creating, updating, or deleting a `service-splitter` config entry requires -`service:write` on the resource and `service:read` on any other service referenced by -name in these fields: + -- [`Splits[].Service`](#service) + \ No newline at end of file From 30112288c893a43e545ff7d446f05be15c037093 Mon Sep 17 00:00:00 2001 From: Derek Menteer <105233703+hashi-derek@users.noreply.github.com> Date: Thu, 16 Feb 2023 09:22:41 -0600 Subject: [PATCH 009/262] Fix mesh gateways incorrectly matching peer locality. (#16257) Fix mesh gateways incorrectly matching peer locality. This fixes an issue where local mesh gateways use an incorrect address when attempting to forward traffic to a peered datacenter. Prior to this change it would use the lan address instead of the wan if the locality matched. This should never be done for peering, since we must route all traffic through the remote mesh gateway. --- .changelog/16257.txt | 3 +++ agent/proxycfg/testing_mesh_gateway.go | 8 ++++---- agent/proxycfg/testing_upstreams.go | 4 ++-- agent/structs/testing_catalog.go | 27 ++++++++++++++++++-------- agent/xds/endpoints.go | 4 +++- 5 files changed, 31 insertions(+), 15 deletions(-) create mode 100644 .changelog/16257.txt diff --git a/.changelog/16257.txt b/.changelog/16257.txt new file mode 100644 index 00000000000..8e98530c421 --- /dev/null +++ b/.changelog/16257.txt @@ -0,0 +1,3 @@ +```release-note:bug +peering: Fix issue where mesh gateways would use the wrong address when contacting a remote peer with the same datacenter name. +``` diff --git a/agent/proxycfg/testing_mesh_gateway.go b/agent/proxycfg/testing_mesh_gateway.go index 039807ed619..f6b463f9d3f 100644 --- a/agent/proxycfg/testing_mesh_gateway.go +++ b/agent/proxycfg/testing_mesh_gateway.go @@ -659,8 +659,8 @@ func TestConfigSnapshotPeeredMeshGateway(t testing.T, variant string, nsFn func( CorrelationID: "peering-connect-service:peer-a:db", Result: &structs.IndexedCheckServiceNodes{ Nodes: structs.CheckServiceNodes{ - structs.TestCheckNodeServiceWithNameInPeer(t, "db", "peer-a", "10.40.1.1", false), - structs.TestCheckNodeServiceWithNameInPeer(t, "db", "peer-a", "10.40.1.2", false), + structs.TestCheckNodeServiceWithNameInPeer(t, "db", "dc1", "peer-a", "10.40.1.1", false), + structs.TestCheckNodeServiceWithNameInPeer(t, "db", "dc1", "peer-a", "10.40.1.2", false), }, }, }, @@ -668,8 +668,8 @@ func TestConfigSnapshotPeeredMeshGateway(t testing.T, variant string, nsFn func( CorrelationID: "peering-connect-service:peer-b:alt", Result: &structs.IndexedCheckServiceNodes{ Nodes: structs.CheckServiceNodes{ - structs.TestCheckNodeServiceWithNameInPeer(t, "alt", "peer-b", "10.40.2.1", false), - structs.TestCheckNodeServiceWithNameInPeer(t, "alt", "peer-b", "10.40.2.2", true), + structs.TestCheckNodeServiceWithNameInPeer(t, "alt", "remote-dc", "peer-b", "10.40.2.1", false), + structs.TestCheckNodeServiceWithNameInPeer(t, "alt", "remote-dc", "peer-b", "10.40.2.2", true), }, }, }, diff --git a/agent/proxycfg/testing_upstreams.go b/agent/proxycfg/testing_upstreams.go index ed2e65d8d67..cb38a3de16a 100644 --- a/agent/proxycfg/testing_upstreams.go +++ b/agent/proxycfg/testing_upstreams.go @@ -94,7 +94,7 @@ func setupTestVariationConfigEntriesAndSnapshot( events = append(events, UpdateEvent{ CorrelationID: "upstream-peer:db?peer=cluster-01", Result: &structs.IndexedCheckServiceNodes{ - Nodes: structs.CheckServiceNodes{structs.TestCheckNodeServiceWithNameInPeer(t, "db", "cluster-01", "10.40.1.1", false)}, + Nodes: structs.CheckServiceNodes{structs.TestCheckNodeServiceWithNameInPeer(t, "db", "dc1", "cluster-01", "10.40.1.1", false)}, }, }) case "redirect-to-cluster-peer": @@ -112,7 +112,7 @@ func setupTestVariationConfigEntriesAndSnapshot( events = append(events, UpdateEvent{ CorrelationID: "upstream-peer:db?peer=cluster-01", Result: &structs.IndexedCheckServiceNodes{ - Nodes: structs.CheckServiceNodes{structs.TestCheckNodeServiceWithNameInPeer(t, "db", "cluster-01", "10.40.1.1", false)}, + Nodes: structs.CheckServiceNodes{structs.TestCheckNodeServiceWithNameInPeer(t, "db", "dc2", "cluster-01", "10.40.1.1", false)}, }, }) case "failover-through-double-remote-gateway-triggered": diff --git a/agent/structs/testing_catalog.go b/agent/structs/testing_catalog.go index 11316905117..f7f2a7e710e 100644 --- a/agent/structs/testing_catalog.go +++ b/agent/structs/testing_catalog.go @@ -55,11 +55,13 @@ func TestNodeServiceWithName(t testing.T, name string) *NodeService { const peerTrustDomain = "1c053652-8512-4373-90cf-5a7f6263a994.consul" -func TestCheckNodeServiceWithNameInPeer(t testing.T, name, peer, ip string, useHostname bool) CheckServiceNode { +func TestCheckNodeServiceWithNameInPeer(t testing.T, name, dc, peer, ip string, useHostname bool) CheckServiceNode { service := &NodeService{ - Kind: ServiceKindTypical, - Service: name, - Port: 8080, + Kind: ServiceKindTypical, + Service: name, + // We should not see this port number appear in most xds golden tests, + // because the WAN addr should typically be used. + Port: 9090, PeerName: peer, Connect: ServiceConnect{ PeerMeta: &PeeringServiceMeta{ @@ -72,6 +74,13 @@ func TestCheckNodeServiceWithNameInPeer(t testing.T, name, peer, ip string, useH Protocol: "tcp", }, }, + // This value should typically be seen in golden file output, since this is a peered service. + TaggedAddresses: map[string]ServiceAddress{ + TaggedAddressWAN: { + Address: ip, + Port: 8080, + }, + }, } if useHostname { @@ -89,10 +98,12 @@ func TestCheckNodeServiceWithNameInPeer(t testing.T, name, peer, ip string, useH return CheckServiceNode{ Node: &Node{ - ID: "test1", - Node: "test1", - Address: ip, - Datacenter: "cloud-dc", + ID: "test1", + Node: "test1", + // We should not see this address appear in most xds golden tests, + // because the WAN addr should typically be used. + Address: "1.23.45.67", + Datacenter: dc, }, Service: service, } diff --git a/agent/xds/endpoints.go b/agent/xds/endpoints.go index dcdbb4d2f5d..d117f8dd829 100644 --- a/agent/xds/endpoints.go +++ b/agent/xds/endpoints.go @@ -449,7 +449,9 @@ func (s *ResourceGenerator) makeEndpointsForOutgoingPeeredServices( la := makeLoadAssignment( clusterName, groups, - cfgSnap.Locality, + // Use an empty key here so that it never matches. This will force the mesh gateway to always + // reference the remote mesh gateway's wan addr. + proxycfg.GatewayKey{}, ) resources = append(resources, la) } From 388876c206e1712d30deb763e24aff8895a52463 Mon Sep 17 00:00:00 2001 From: Dhia Ayachi Date: Thu, 16 Feb 2023 14:21:50 -0500 Subject: [PATCH 010/262] add server side rate-limiter changelog entry (#16292) --- .changelog/16292.txt | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 .changelog/16292.txt diff --git a/.changelog/16292.txt b/.changelog/16292.txt new file mode 100644 index 00000000000..085fe7fd07c --- /dev/null +++ b/.changelog/16292.txt @@ -0,0 +1,3 @@ +```release-note:feature +server: added server side RPC requests global read/write rate-limiter. +``` From 2460ac99c95aa9177d0ae4e527ee6d8d2fbac062 Mon Sep 17 00:00:00 2001 From: Thomas Eckert Date: Thu, 16 Feb 2023 14:42:36 -0500 Subject: [PATCH 011/262] API Gateway Envoy Golden Listener Tests (#16221) * Simple API Gateway e2e test for tcp routes * Drop DNSSans since we don't front the Gateway with a leaf cert * WIP listener tests for api-gateway * Return early if no routes * Add back in leaf cert to testing * Fix merge conflicts * Re-add kind to setup * Fix iteration over listener upstreams * New tcp listener test * Add tests for API Gateway with TCP and HTTP routes * Move zero-route check back * Drop generateIngressDNSSANs * Check for chains not routes --------- Co-authored-by: Andrew Stucki --- agent/proxycfg/testing_api_gateway.go | 145 +++++++++++++ agent/xds/listeners_test.go | 205 ++++++++++++++++++ ...ttp-listener-with-http-route.latest.golden | 49 +++++ .../api-gateway-http-listener.latest.golden | 5 + ...api-gateway-nil-config-entry.latest.golden | 5 + ...ener-with-tcp-and-http-route.latest.golden | 74 +++++++ ...-tcp-listener-with-tcp-route.latest.golden | 32 +++ .../api-gateway-tcp-listener.latest.golden | 5 + .../api-gateway-tcp-listeners.latest.golden | 5 + .../listeners/api-gateway.latest.golden | 5 + .../case-api-gateway-tcp-conflicted/setup.sh | 3 +- .../case-api-gateway-tcp-simple/setup.sh | 3 +- .../case-api-gateway-tcp-simple/verify.bats | 2 +- 13 files changed, 535 insertions(+), 3 deletions(-) create mode 100644 agent/proxycfg/testing_api_gateway.go create mode 100644 agent/xds/testdata/listeners/api-gateway-http-listener-with-http-route.latest.golden create mode 100644 agent/xds/testdata/listeners/api-gateway-http-listener.latest.golden create mode 100644 agent/xds/testdata/listeners/api-gateway-nil-config-entry.latest.golden create mode 100644 agent/xds/testdata/listeners/api-gateway-tcp-listener-with-tcp-and-http-route.latest.golden create mode 100644 agent/xds/testdata/listeners/api-gateway-tcp-listener-with-tcp-route.latest.golden create mode 100644 agent/xds/testdata/listeners/api-gateway-tcp-listener.latest.golden create mode 100644 agent/xds/testdata/listeners/api-gateway-tcp-listeners.latest.golden create mode 100644 agent/xds/testdata/listeners/api-gateway.latest.golden diff --git a/agent/proxycfg/testing_api_gateway.go b/agent/proxycfg/testing_api_gateway.go new file mode 100644 index 00000000000..8a9e113f76e --- /dev/null +++ b/agent/proxycfg/testing_api_gateway.go @@ -0,0 +1,145 @@ +package proxycfg + +import ( + "fmt" + "github.com/hashicorp/consul/agent/connect" + "github.com/hashicorp/consul/agent/consul/discoverychain" + "github.com/mitchellh/go-testing-interface" + + "github.com/hashicorp/consul/agent/structs" +) + +func TestConfigSnapshotAPIGateway( + t testing.T, + variation string, + nsFn func(ns *structs.NodeService), + configFn func(entry *structs.APIGatewayConfigEntry, boundEntry *structs.BoundAPIGatewayConfigEntry), + routes []structs.BoundRoute, + extraUpdates []UpdateEvent, + additionalEntries ...structs.ConfigEntry, +) *ConfigSnapshot { + roots, placeholderLeaf := TestCerts(t) + + entry := &structs.APIGatewayConfigEntry{ + Kind: structs.APIGateway, + Name: "api-gateway", + } + boundEntry := &structs.BoundAPIGatewayConfigEntry{ + Kind: structs.BoundAPIGateway, + Name: "api-gateway", + } + + if configFn != nil { + configFn(entry, boundEntry) + } + + baseEvents := []UpdateEvent{ + { + CorrelationID: rootsWatchID, + Result: roots, + }, + { + CorrelationID: leafWatchID, + Result: placeholderLeaf, + }, + { + CorrelationID: gatewayConfigWatchID, + Result: &structs.ConfigEntryResponse{ + Entry: entry, + }, + }, + { + CorrelationID: gatewayConfigWatchID, + Result: &structs.ConfigEntryResponse{ + Entry: boundEntry, + }, + }, + } + + for _, route := range routes { + // Add the watch event for the route. + watch := UpdateEvent{ + CorrelationID: routeConfigWatchID, + Result: &structs.ConfigEntryResponse{ + Entry: route, + }, + } + baseEvents = append(baseEvents, watch) + + // Add the watch event for the discovery chain. + entries := []structs.ConfigEntry{ + &structs.ProxyConfigEntry{ + Kind: structs.ProxyDefaults, + Name: structs.ProxyConfigGlobal, + Config: map[string]interface{}{ + "protocol": route.GetProtocol(), + }, + }, + &structs.ServiceResolverConfigEntry{ + Kind: structs.ServiceResolver, + Name: "api-gateway", + }, + } + + // Add a discovery chain watch event for each service. + for _, serviceName := range route.GetServiceNames() { + discoChain := UpdateEvent{ + CorrelationID: fmt.Sprintf("discovery-chain:%s", UpstreamIDString("", "", serviceName.Name, &serviceName.EnterpriseMeta, "")), + Result: &structs.DiscoveryChainResponse{ + Chain: discoverychain.TestCompileConfigEntries(t, serviceName.Name, "default", "default", "dc1", connect.TestClusterID+".consul", nil, entries...), + }, + } + baseEvents = append(baseEvents, discoChain) + } + } + + upstreams := structs.TestUpstreams(t) + + baseEvents = testSpliceEvents(baseEvents, setupTestVariationConfigEntriesAndSnapshot( + t, variation, upstreams, additionalEntries..., + )) + + return testConfigSnapshotFixture(t, &structs.NodeService{ + Kind: structs.ServiceKindAPIGateway, + Service: "api-gateway", + Address: "1.2.3.4", + Meta: nil, + TaggedAddresses: nil, + }, nsFn, nil, testSpliceEvents(baseEvents, extraUpdates)) +} + +// TestConfigSnapshotAPIGateway_NilConfigEntry is used to test when +// the update event for the config entry returns nil +// since this always happens on the first watch if it doesn't exist. +func TestConfigSnapshotAPIGateway_NilConfigEntry( + t testing.T, +) *ConfigSnapshot { + roots, _ := TestCerts(t) + + baseEvents := []UpdateEvent{ + { + CorrelationID: rootsWatchID, + Result: roots, + }, + { + CorrelationID: gatewayConfigWatchID, + Result: &structs.ConfigEntryResponse{ + Entry: nil, // The first watch on a config entry will return nil if the config entry doesn't exist. + }, + }, + { + CorrelationID: gatewayConfigWatchID, + Result: &structs.ConfigEntryResponse{ + Entry: nil, // The first watch on a config entry will return nil if the config entry doesn't exist. + }, + }, + } + + return testConfigSnapshotFixture(t, &structs.NodeService{ + Kind: structs.ServiceKindAPIGateway, + Service: "api-gateway", + Address: "1.2.3.4", + Meta: nil, + TaggedAddresses: nil, + }, nil, nil, testSpliceEvents(baseEvents, nil)) +} diff --git a/agent/xds/listeners_test.go b/agent/xds/listeners_test.go index fffe3dc342d..e4e7c845751 100644 --- a/agent/xds/listeners_test.go +++ b/agent/xds/listeners_test.go @@ -527,6 +527,211 @@ func TestListenersFromSnapshot(t *testing.T) { }, nil) }, }, + { + name: "api-gateway", + create: func(t testinf.T) *proxycfg.ConfigSnapshot { + return proxycfg.TestConfigSnapshotAPIGateway(t, "default", nil, nil, nil, nil) + }, + }, + { + name: "api-gateway-nil-config-entry", + create: func(t testinf.T) *proxycfg.ConfigSnapshot { + return proxycfg.TestConfigSnapshotAPIGateway_NilConfigEntry(t) + }, + }, + { + name: "api-gateway-tcp-listener", + create: func(t testinf.T) *proxycfg.ConfigSnapshot { + return proxycfg.TestConfigSnapshotAPIGateway(t, "default", nil, func(entry *structs.APIGatewayConfigEntry, bound *structs.BoundAPIGatewayConfigEntry) { + entry.Listeners = []structs.APIGatewayListener{ + { + Name: "listener", + Protocol: structs.ListenerProtocolTCP, + Port: 8080, + }, + } + bound.Listeners = []structs.BoundAPIGatewayListener{ + { + Name: "listener", + }, + } + }, nil, nil) + }, + }, + { + name: "api-gateway-tcp-listener-with-tcp-route", + create: func(t testinf.T) *proxycfg.ConfigSnapshot { + return proxycfg.TestConfigSnapshotAPIGateway(t, "default", nil, func(entry *structs.APIGatewayConfigEntry, bound *structs.BoundAPIGatewayConfigEntry) { + entry.Listeners = []structs.APIGatewayListener{ + { + Name: "listener", + Protocol: structs.ListenerProtocolTCP, + Port: 8080, + }, + } + bound.Listeners = []structs.BoundAPIGatewayListener{ + { + Name: "listener", + Routes: []structs.ResourceReference{ + { + Name: "tcp-route", + Kind: structs.TCPRoute, + }, + }, + }, + } + + }, []structs.BoundRoute{ + &structs.TCPRouteConfigEntry{ + Name: "tcp-route", + Kind: structs.TCPRoute, + Parents: []structs.ResourceReference{ + { + Kind: structs.APIGateway, + Name: "api-gateway", + }, + }, + Services: []structs.TCPService{ + {Name: "tcp-service"}, + }, + }, + }, nil) + }, + }, + { + name: "api-gateway-http-listener", + create: func(t testinf.T) *proxycfg.ConfigSnapshot { + return proxycfg.TestConfigSnapshotAPIGateway(t, "default", nil, func(entry *structs.APIGatewayConfigEntry, bound *structs.BoundAPIGatewayConfigEntry) { + entry.Listeners = []structs.APIGatewayListener{ + { + Name: "listener", + Protocol: structs.ListenerProtocolHTTP, + Port: 8080, + }, + } + bound.Listeners = []structs.BoundAPIGatewayListener{ + { + Name: "listener", + Routes: []structs.ResourceReference{}, + }, + } + }, nil, nil) + }, + }, + { + name: "api-gateway-http-listener-with-http-route", + create: func(t testinf.T) *proxycfg.ConfigSnapshot { + return proxycfg.TestConfigSnapshotAPIGateway(t, "default", nil, func(entry *structs.APIGatewayConfigEntry, bound *structs.BoundAPIGatewayConfigEntry) { + entry.Listeners = []structs.APIGatewayListener{ + { + Name: "listener", + Protocol: structs.ListenerProtocolHTTP, + Port: 8080, + }, + } + bound.Listeners = []structs.BoundAPIGatewayListener{ + { + Name: "listener", + Routes: []structs.ResourceReference{ + { + Name: "http-route", + Kind: structs.HTTPRoute, + }, + }, + }, + } + }, []structs.BoundRoute{ + &structs.HTTPRouteConfigEntry{ + Name: "http-route", + Kind: structs.HTTPRoute, + Parents: []structs.ResourceReference{ + { + Kind: structs.APIGateway, + Name: "api-gateway", + }, + }, + Rules: []structs.HTTPRouteRule{ + { + Services: []structs.HTTPService{ + {Name: "http-service"}, + }, + }, + }, + }, + }, nil) + }, + }, + { + name: "api-gateway-tcp-listener-with-tcp-and-http-route", + create: func(t testinf.T) *proxycfg.ConfigSnapshot { + return proxycfg.TestConfigSnapshotAPIGateway(t, "default", nil, func(entry *structs.APIGatewayConfigEntry, bound *structs.BoundAPIGatewayConfigEntry) { + entry.Listeners = []structs.APIGatewayListener{ + { + Name: "listener-tcp", + Protocol: structs.ListenerProtocolTCP, + Port: 8080, + }, + { + Name: "listener-http", + Protocol: structs.ListenerProtocolHTTP, + Port: 8081, + }, + } + bound.Listeners = []structs.BoundAPIGatewayListener{ + { + Name: "listener-tcp", + Routes: []structs.ResourceReference{ + { + Name: "tcp-route", + Kind: structs.TCPRoute, + }, + }, + }, + { + Name: "listener-http", + Routes: []structs.ResourceReference{ + { + Name: "http-route", + Kind: structs.HTTPRoute, + }, + }, + }, + } + + }, []structs.BoundRoute{ + &structs.TCPRouteConfigEntry{ + Name: "tcp-route", + Kind: structs.TCPRoute, + Parents: []structs.ResourceReference{ + { + Kind: structs.APIGateway, + Name: "api-gateway", + }, + }, + Services: []structs.TCPService{ + {Name: "tcp-service"}, + }, + }, + &structs.HTTPRouteConfigEntry{ + Name: "http-route", + Kind: structs.HTTPRoute, + Parents: []structs.ResourceReference{ + { + Kind: structs.APIGateway, + Name: "api-gateway", + }, + }, + Rules: []structs.HTTPRouteRule{ + { + Services: []structs.HTTPService{ + {Name: "http-service"}, + }, + }, + }, + }, + }, nil) + }, + }, { name: "ingress-gateway", create: func(t testinf.T) *proxycfg.ConfigSnapshot { diff --git a/agent/xds/testdata/listeners/api-gateway-http-listener-with-http-route.latest.golden b/agent/xds/testdata/listeners/api-gateway-http-listener-with-http-route.latest.golden new file mode 100644 index 00000000000..0bf31dc6624 --- /dev/null +++ b/agent/xds/testdata/listeners/api-gateway-http-listener-with-http-route.latest.golden @@ -0,0 +1,49 @@ +{ + "versionInfo": "00000001", + "resources": [ + { + "@type": "type.googleapis.com/envoy.config.listener.v3.Listener", + "name": "http:1.2.3.4:8080", + "address": { + "socketAddress": { + "address": "1.2.3.4", + "portValue": 8080 + } + }, + "filterChains": [ + { + "filters": [ + { + "name": "envoy.filters.network.http_connection_manager", + "typedConfig": { + "@type": "type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager", + "statPrefix": "ingress_upstream_8080", + "rds": { + "configSource": { + "ads": {}, + "resourceApiVersion": "V3" + }, + "routeConfigName": "8080" + }, + "httpFilters": [ + { + "name": "envoy.filters.http.router", + "typedConfig": { + "@type": "type.googleapis.com/envoy.extensions.filters.http.router.v3.Router" + } + } + ], + "tracing": { + "randomSampling": {} + } + } + } + ] + } + ], + "trafficDirection": "OUTBOUND" + } + ], + "typeUrl": "type.googleapis.com/envoy.config.listener.v3.Listener", + "nonce": "00000001" +} \ No newline at end of file diff --git a/agent/xds/testdata/listeners/api-gateway-http-listener.latest.golden b/agent/xds/testdata/listeners/api-gateway-http-listener.latest.golden new file mode 100644 index 00000000000..53b67bb3730 --- /dev/null +++ b/agent/xds/testdata/listeners/api-gateway-http-listener.latest.golden @@ -0,0 +1,5 @@ +{ + "versionInfo": "00000001", + "typeUrl": "type.googleapis.com/envoy.config.listener.v3.Listener", + "nonce": "00000001" +} \ No newline at end of file diff --git a/agent/xds/testdata/listeners/api-gateway-nil-config-entry.latest.golden b/agent/xds/testdata/listeners/api-gateway-nil-config-entry.latest.golden new file mode 100644 index 00000000000..53b67bb3730 --- /dev/null +++ b/agent/xds/testdata/listeners/api-gateway-nil-config-entry.latest.golden @@ -0,0 +1,5 @@ +{ + "versionInfo": "00000001", + "typeUrl": "type.googleapis.com/envoy.config.listener.v3.Listener", + "nonce": "00000001" +} \ No newline at end of file diff --git a/agent/xds/testdata/listeners/api-gateway-tcp-listener-with-tcp-and-http-route.latest.golden b/agent/xds/testdata/listeners/api-gateway-tcp-listener-with-tcp-and-http-route.latest.golden new file mode 100644 index 00000000000..8da750a5929 --- /dev/null +++ b/agent/xds/testdata/listeners/api-gateway-tcp-listener-with-tcp-and-http-route.latest.golden @@ -0,0 +1,74 @@ +{ + "versionInfo": "00000001", + "resources": [ + { + "@type": "type.googleapis.com/envoy.config.listener.v3.Listener", + "name": "http:1.2.3.4:8081", + "address": { + "socketAddress": { + "address": "1.2.3.4", + "portValue": 8081 + } + }, + "filterChains": [ + { + "filters": [ + { + "name": "envoy.filters.network.http_connection_manager", + "typedConfig": { + "@type": "type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager", + "statPrefix": "ingress_upstream_8081", + "rds": { + "configSource": { + "ads": {}, + "resourceApiVersion": "V3" + }, + "routeConfigName": "8081" + }, + "httpFilters": [ + { + "name": "envoy.filters.http.router", + "typedConfig": { + "@type": "type.googleapis.com/envoy.extensions.filters.http.router.v3.Router" + } + } + ], + "tracing": { + "randomSampling": {} + } + } + } + ] + } + ], + "trafficDirection": "OUTBOUND" + }, + { + "@type": "type.googleapis.com/envoy.config.listener.v3.Listener", + "name": "tcp-service:1.2.3.4:8080", + "address": { + "socketAddress": { + "address": "1.2.3.4", + "portValue": 8080 + } + }, + "filterChains": [ + { + "filters": [ + { + "name": "envoy.filters.network.tcp_proxy", + "typedConfig": { + "@type": "type.googleapis.com/envoy.extensions.filters.network.tcp_proxy.v3.TcpProxy", + "statPrefix": "upstream.tcp-service.default.default.dc1", + "cluster": "tcp-service.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul" + } + } + ] + } + ], + "trafficDirection": "OUTBOUND" + } + ], + "typeUrl": "type.googleapis.com/envoy.config.listener.v3.Listener", + "nonce": "00000001" +} \ No newline at end of file diff --git a/agent/xds/testdata/listeners/api-gateway-tcp-listener-with-tcp-route.latest.golden b/agent/xds/testdata/listeners/api-gateway-tcp-listener-with-tcp-route.latest.golden new file mode 100644 index 00000000000..12f6c29726d --- /dev/null +++ b/agent/xds/testdata/listeners/api-gateway-tcp-listener-with-tcp-route.latest.golden @@ -0,0 +1,32 @@ +{ + "versionInfo": "00000001", + "resources": [ + { + "@type": "type.googleapis.com/envoy.config.listener.v3.Listener", + "name": "tcp-service:1.2.3.4:8080", + "address": { + "socketAddress": { + "address": "1.2.3.4", + "portValue": 8080 + } + }, + "filterChains": [ + { + "filters": [ + { + "name": "envoy.filters.network.tcp_proxy", + "typedConfig": { + "@type": "type.googleapis.com/envoy.extensions.filters.network.tcp_proxy.v3.TcpProxy", + "statPrefix": "upstream.tcp-service.default.default.dc1", + "cluster": "tcp-service.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul" + } + } + ] + } + ], + "trafficDirection": "OUTBOUND" + } + ], + "typeUrl": "type.googleapis.com/envoy.config.listener.v3.Listener", + "nonce": "00000001" +} \ No newline at end of file diff --git a/agent/xds/testdata/listeners/api-gateway-tcp-listener.latest.golden b/agent/xds/testdata/listeners/api-gateway-tcp-listener.latest.golden new file mode 100644 index 00000000000..53b67bb3730 --- /dev/null +++ b/agent/xds/testdata/listeners/api-gateway-tcp-listener.latest.golden @@ -0,0 +1,5 @@ +{ + "versionInfo": "00000001", + "typeUrl": "type.googleapis.com/envoy.config.listener.v3.Listener", + "nonce": "00000001" +} \ No newline at end of file diff --git a/agent/xds/testdata/listeners/api-gateway-tcp-listeners.latest.golden b/agent/xds/testdata/listeners/api-gateway-tcp-listeners.latest.golden new file mode 100644 index 00000000000..d2d839adf95 --- /dev/null +++ b/agent/xds/testdata/listeners/api-gateway-tcp-listeners.latest.golden @@ -0,0 +1,5 @@ +{ + "versionInfo": "00000001", + "typeUrl": "type.googleapis.com/envoy.config.listener.v3.Listener", + "nonce": "00000001" +} \ No newline at end of file diff --git a/agent/xds/testdata/listeners/api-gateway.latest.golden b/agent/xds/testdata/listeners/api-gateway.latest.golden new file mode 100644 index 00000000000..d2d839adf95 --- /dev/null +++ b/agent/xds/testdata/listeners/api-gateway.latest.golden @@ -0,0 +1,5 @@ +{ + "versionInfo": "00000001", + "typeUrl": "type.googleapis.com/envoy.config.listener.v3.Listener", + "nonce": "00000001" +} \ No newline at end of file diff --git a/test/integration/connect/envoy/case-api-gateway-tcp-conflicted/setup.sh b/test/integration/connect/envoy/case-api-gateway-tcp-conflicted/setup.sh index 2394ab23621..bb9baacbb0f 100644 --- a/test/integration/connect/envoy/case-api-gateway-tcp-conflicted/setup.sh +++ b/test/integration/connect/envoy/case-api-gateway-tcp-conflicted/setup.sh @@ -38,6 +38,7 @@ services = [ ] parents = [ { + kind = "api-gateway" name = "api-gateway" } ] @@ -47,4 +48,4 @@ register_services primary gen_envoy_bootstrap api-gateway 20000 primary true gen_envoy_bootstrap s1 19000 -gen_envoy_bootstrap s2 19001 \ No newline at end of file +gen_envoy_bootstrap s2 19001 diff --git a/test/integration/connect/envoy/case-api-gateway-tcp-simple/setup.sh b/test/integration/connect/envoy/case-api-gateway-tcp-simple/setup.sh index fd4f474abfd..56a86166d4c 100644 --- a/test/integration/connect/envoy/case-api-gateway-tcp-simple/setup.sh +++ b/test/integration/connect/envoy/case-api-gateway-tcp-simple/setup.sh @@ -47,6 +47,7 @@ parents = [ { name = "api-gateway" sectionName = "listener-two" + kind = "api-gateway" } ] ' @@ -73,4 +74,4 @@ register_services primary gen_envoy_bootstrap api-gateway 20000 primary true gen_envoy_bootstrap s1 19000 -gen_envoy_bootstrap s2 19001 \ No newline at end of file +gen_envoy_bootstrap s2 19001 diff --git a/test/integration/connect/envoy/case-api-gateway-tcp-simple/verify.bats b/test/integration/connect/envoy/case-api-gateway-tcp-simple/verify.bats index 51ed646bd6b..e96f473be4f 100644 --- a/test/integration/connect/envoy/case-api-gateway-tcp-simple/verify.bats +++ b/test/integration/connect/envoy/case-api-gateway-tcp-simple/verify.bats @@ -29,4 +29,4 @@ load helpers @test "api gateway should get an intentions error connecting to s2 via configured port" { run retry_default must_fail_tcp_connection localhost:9998 -} \ No newline at end of file +} From 8dab825c36406e8dd9222e857b486f139072c45a Mon Sep 17 00:00:00 2001 From: Nitya Dhanushkodi Date: Fri, 17 Feb 2023 07:43:05 -0800 Subject: [PATCH 012/262] troubleshoot: fixes and updated messages (#16294) --- .../validateupstream_test.go | 12 +++-- .../troubleshoot/proxy/troubleshoot_proxy.go | 20 ++++--- .../upstreams/troubleshoot_upstreams.go | 16 +++--- .../test/troubleshoot/troubleshoot_test.go | 25 +++++---- troubleshoot/proxy/certs.go | 20 +++++-- troubleshoot/proxy/certs_test.go | 12 +++-- troubleshoot/proxy/stats.go | 20 +++++-- troubleshoot/proxy/troubleshoot_proxy.go | 13 +---- troubleshoot/proxy/upstreams.go | 5 +- troubleshoot/proxy/upstreams_test.go | 9 ++-- troubleshoot/validate/validate.go | 53 ++++++++++++++----- troubleshoot/validate/validate_test.go | 10 ++-- 12 files changed, 135 insertions(+), 80 deletions(-) diff --git a/agent/xds/validateupstream-test/validateupstream_test.go b/agent/xds/validateupstream-test/validateupstream_test.go index c78b34d7aa0..250b6acdec3 100644 --- a/agent/xds/validateupstream-test/validateupstream_test.go +++ b/agent/xds/validateupstream-test/validateupstream_test.go @@ -55,7 +55,7 @@ func TestValidateUpstreams(t *testing.T) { delete(ir.Index[xdscommon.ListenerType], listenerName) return ir }, - err: "no listener for upstream \"db\"", + err: "No listener for upstream \"db\"", }, { name: "tcp-missing-cluster", @@ -66,7 +66,7 @@ func TestValidateUpstreams(t *testing.T) { delete(ir.Index[xdscommon.ClusterType], sni) return ir }, - err: "no cluster \"db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul\" for upstream \"db\"", + err: "No cluster \"db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul\" for upstream \"db\"", }, { name: "http-success", @@ -124,7 +124,7 @@ func TestValidateUpstreams(t *testing.T) { delete(ir.Index[xdscommon.RouteType], "db") return ir }, - err: "no route for upstream \"db\"", + err: "No route for upstream \"db\"", }, { name: "redirect", @@ -170,7 +170,7 @@ func TestValidateUpstreams(t *testing.T) { delete(ir.Index[xdscommon.ClusterType], sni) return ir }, - err: "no cluster \"google.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul\" for upstream \"240.0.0.1\"", + err: "No cluster \"google.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul\" for upstream \"240.0.0.1\"", }, { name: "tproxy-http-redirect-success", @@ -230,7 +230,9 @@ func TestValidateUpstreams(t *testing.T) { var outputErrors string for _, msgError := range messages.Errors() { outputErrors += msgError.Message - outputErrors += msgError.PossibleActions + for _, action := range msgError.PossibleActions { + outputErrors += action + } } if len(tt.err) == 0 { require.True(t, messages.Success()) diff --git a/command/troubleshoot/proxy/troubleshoot_proxy.go b/command/troubleshoot/proxy/troubleshoot_proxy.go index 8950424a786..57d982dea0d 100644 --- a/command/troubleshoot/proxy/troubleshoot_proxy.go +++ b/command/troubleshoot/proxy/troubleshoot_proxy.go @@ -77,12 +77,12 @@ func (c *cmd) Run(args []string) int { t, err := troubleshoot.NewTroubleshoot(adminBindIP, adminPort) if err != nil { - c.UI.Error("error generating troubleshoot client: " + err.Error()) + c.UI.Error("Error generating troubleshoot client: " + err.Error()) return 1 } messages, err := t.RunAllTests(c.upstreamEnvoyID, c.upstreamIP) if err != nil { - c.UI.Error("error running the tests: " + err.Error()) + c.UI.Error("Error running the tests: " + err.Error()) return 1 } @@ -92,11 +92,16 @@ func (c *cmd) Run(args []string) int { c.UI.SuccessOutput(o.Message) } else { c.UI.ErrorOutput(o.Message) - if o.PossibleActions != "" { - c.UI.UnchangedOutput(o.PossibleActions) + for _, action := range o.PossibleActions { + c.UI.UnchangedOutput("-> " + action) } } } + if messages.Success() { + c.UI.UnchangedOutput("If you are still experiencing issues, you can:") + c.UI.UnchangedOutput("-> Check intentions to ensure the upstream allows traffic from this source") + c.UI.UnchangedOutput("-> If using transparent proxy, ensure DNS resolution is to the same IP you have verified here") + } return 0 } @@ -114,14 +119,15 @@ const ( Usage: consul troubleshoot proxy [options] Connects to local envoy proxy and troubleshoots service mesh communication issues. - Requires an upstream service envoy identifier. + Requires an upstream service identifier. When debugging explicitly configured upstreams, + use -upstream-envoy-id, when debugging transparent proxy upstreams use -upstream-ip. Examples: (explicit upstreams only) $ consul troubleshoot proxy -upstream-envoy-id foo (transparent proxy only) - $ consul troubleshoot proxy -upstream-ip + $ consul troubleshoot proxy -upstream-ip 240.0.0.1 - where 'foo' is the upstream envoy identifier which + where 'foo' is the upstream envoy identifier and '240.0.0.1' is an upstream ip which can be obtained by running: $ consul troubleshoot upstreams [options] ` diff --git a/command/troubleshoot/upstreams/troubleshoot_upstreams.go b/command/troubleshoot/upstreams/troubleshoot_upstreams.go index 1249f5ddc56..435630cdc9e 100644 --- a/command/troubleshoot/upstreams/troubleshoot_upstreams.go +++ b/command/troubleshoot/upstreams/troubleshoot_upstreams.go @@ -77,24 +77,24 @@ func (c *cmd) Run(args []string) int { return 1 } - c.UI.Output(fmt.Sprintf("==> Upstreams (explicit upstreams only) (%v)", len(envoyIDs))) + c.UI.HeaderOutput(fmt.Sprintf("Upstreams (explicit upstreams only) (%v)\n", len(envoyIDs))) for _, u := range envoyIDs { - c.UI.Output(u) + c.UI.UnchangedOutput(u) } - c.UI.Output(fmt.Sprintf("\n==> Upstream IPs (transparent proxy only) (%v)", len(upstreamIPs))) + c.UI.HeaderOutput(fmt.Sprintf("Upstream IPs (transparent proxy only) (%v)", len(upstreamIPs))) tbl := cli.NewTable("IPs ", "Virtual ", "Cluster Names") for _, u := range upstreamIPs { tbl.AddRow([]string{formatIPs(u.IPs), strconv.FormatBool(u.IsVirtual), formatClusterNames(u.ClusterNames)}, []string{}) } c.UI.Table(tbl) - c.UI.Output("\nIf you don't see your upstream address or cluster for a transparent proxy upstream:") - c.UI.Output("- Check intentions: Tproxy upstreams are configured based on intentions, make sure you " + + c.UI.UnchangedOutput("\nIf you cannot find the upstream address or cluster for a transparent proxy upstream:") + c.UI.UnchangedOutput("-> Check intentions: Transparent proxy upstreams are configured based on intentions. Make sure you " + "have configured intentions to allow traffic to your upstream.") - c.UI.Output("- You can also check that the right cluster is being dialed by running a DNS lookup " + - "for the upstream you are dialing (i.e dig backend.svc.consul). If the address you get from that is missing " + - "from the Upstream IPs your proxy may be misconfigured.") + c.UI.UnchangedOutput("-> To check that the right cluster is being dialed, run a DNS lookup " + + "for the upstream you are dialing. For example, run `dig backend.svc.consul` to return the IP address for the `backend` service. If the address you get from that is missing " + + "from the upstream IPs, it means that your proxy may be misconfigured.") return 0 } diff --git a/test/integration/consul-container/test/troubleshoot/troubleshoot_test.go b/test/integration/consul-container/test/troubleshoot/troubleshoot_test.go index 7803b38bff4..3470e738922 100644 --- a/test/integration/consul-container/test/troubleshoot/troubleshoot_test.go +++ b/test/integration/consul-container/test/troubleshoot/troubleshoot_test.go @@ -3,11 +3,12 @@ package troubleshoot import ( "context" "fmt" - "github.com/stretchr/testify/assert" "strings" "testing" "time" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" libcluster "github.com/hashicorp/consul/test/integration/consul-container/libs/cluster" @@ -40,11 +41,12 @@ func TestTroubleshootProxy(t *testing.T) { "-envoy-admin-endpoint", fmt.Sprintf("localhost:%v", clientAdminPort), "-upstream-envoy-id", libservice.StaticServerServiceName}) require.NoError(t, err) - certsValid := strings.Contains(output, "certificates are valid") - listenersExist := strings.Contains(output, fmt.Sprintf("listener for upstream \"%s\" found", libservice.StaticServerServiceName)) - routesExist := strings.Contains(output, fmt.Sprintf("route for upstream \"%s\" found", libservice.StaticServerServiceName)) - healthyEndpoints := strings.Contains(output, "✓ healthy endpoints for cluster") - return upstreamExists && certsValid && listenersExist && routesExist && healthyEndpoints + certsValid := strings.Contains(output, "Certificates are valid") + noRejectedConfig := strings.Contains(output, "Envoy has 0 rejected configurations") + noConnFailure := strings.Contains(output, "Envoy has detected 0 connection failure(s)") + listenersExist := strings.Contains(output, fmt.Sprintf("Listener for upstream \"%s\" found", libservice.StaticServerServiceName)) + healthyEndpoints := strings.Contains(output, "Healthy endpoints for cluster") + return upstreamExists && certsValid && listenersExist && noRejectedConfig && noConnFailure && healthyEndpoints }, 60*time.Second, 10*time.Second) }) @@ -58,11 +60,12 @@ func TestTroubleshootProxy(t *testing.T) { "-upstream-envoy-id", libservice.StaticServerServiceName}) require.NoError(t, err) - certsValid := strings.Contains(output, "certificates are valid") - listenersExist := strings.Contains(output, fmt.Sprintf("listener for upstream \"%s\" found", libservice.StaticServerServiceName)) - routesExist := strings.Contains(output, fmt.Sprintf("route for upstream \"%s\" found", libservice.StaticServerServiceName)) - endpointUnhealthy := strings.Contains(output, "no healthy endpoints for cluster") - return certsValid && listenersExist && routesExist && endpointUnhealthy + certsValid := strings.Contains(output, "Certificates are valid") + noRejectedConfig := strings.Contains(output, "Envoy has 0 rejected configurations") + noConnFailure := strings.Contains(output, "Envoy has detected 0 connection failure(s)") + listenersExist := strings.Contains(output, fmt.Sprintf("Listener for upstream \"%s\" found", libservice.StaticServerServiceName)) + endpointUnhealthy := strings.Contains(output, "No healthy endpoints for cluster") + return certsValid && listenersExist && noRejectedConfig && noConnFailure && endpointUnhealthy }, 60*time.Second, 10*time.Second) }) } diff --git a/troubleshoot/proxy/certs.go b/troubleshoot/proxy/certs.go index 1fa61f3483e..ec4b2bc703d 100644 --- a/troubleshoot/proxy/certs.go +++ b/troubleshoot/proxy/certs.go @@ -18,7 +18,10 @@ func (t *Troubleshoot) validateCerts(certs *envoy_admin_v3.Certificates) validat if certs == nil { msg := validate.Message{ Success: false, - Message: "certificate object is nil in the proxy configuration", + Message: "Certificate object is nil in the proxy configuration", + PossibleActions: []string{ + "Check the logs of the Consul agent configuring the local proxy and ensure XDS updates are being sent to the proxy", + }, } return []validate.Message{msg} } @@ -26,7 +29,10 @@ func (t *Troubleshoot) validateCerts(certs *envoy_admin_v3.Certificates) validat if len(certs.GetCertificates()) == 0 { msg := validate.Message{ Success: false, - Message: "no certificates found", + Message: "No certificates found", + PossibleActions: []string{ + "Check the logs of the Consul agent configuring the local proxy and ensure XDS updates are being sent to the proxy", + }, } return []validate.Message{msg} } @@ -36,7 +42,10 @@ func (t *Troubleshoot) validateCerts(certs *envoy_admin_v3.Certificates) validat if now.After(cacert.GetExpirationTime().AsTime()) { msg := validate.Message{ Success: false, - Message: "ca certificate is expired", + Message: "CA certificate is expired", + PossibleActions: []string{ + "Check the logs of the Consul agent configuring the local proxy and ensure XDS updates are being sent to the proxy", + }, } certMessages = append(certMessages, msg) } @@ -46,7 +55,10 @@ func (t *Troubleshoot) validateCerts(certs *envoy_admin_v3.Certificates) validat if now.After(cc.GetExpirationTime().AsTime()) { msg := validate.Message{ Success: false, - Message: "certificate chain is expired", + Message: "Certificate chain is expired", + PossibleActions: []string{ + "Check the logs of the Consul agent configuring the local proxy and ensure XDS updates are being sent to the proxy", + }, } certMessages = append(certMessages, msg) } diff --git a/troubleshoot/proxy/certs_test.go b/troubleshoot/proxy/certs_test.go index 63f2a0256c1..fc03cb062ff 100644 --- a/troubleshoot/proxy/certs_test.go +++ b/troubleshoot/proxy/certs_test.go @@ -21,13 +21,13 @@ func TestValidateCerts(t *testing.T) { }{ "cert is nil": { certs: nil, - expectedError: "certificate object is nil in the proxy configuration", + expectedError: "Certificate object is nil in the proxy configuration", }, "no certificates": { certs: &envoy_admin_v3.Certificates{ Certificates: []*envoy_admin_v3.Certificate{}, }, - expectedError: "no certificates found", + expectedError: "No certificates found", }, "ca expired": { certs: &envoy_admin_v3.Certificates{ @@ -41,7 +41,7 @@ func TestValidateCerts(t *testing.T) { }, }, }, - expectedError: "ca certificate is expired", + expectedError: "CA certificate is expired", }, "cert expired": { certs: &envoy_admin_v3.Certificates{ @@ -55,7 +55,7 @@ func TestValidateCerts(t *testing.T) { }, }, }, - expectedError: "certificate chain is expired", + expectedError: "Certificate chain is expired", }, } @@ -67,7 +67,9 @@ func TestValidateCerts(t *testing.T) { var outputErrors string for _, msgError := range messages.Errors() { outputErrors += msgError.Message - outputErrors += msgError.PossibleActions + for _, action := range msgError.PossibleActions { + outputErrors += action + } } if tc.expectedError == "" { require.True(t, messages.Success()) diff --git a/troubleshoot/proxy/stats.go b/troubleshoot/proxy/stats.go index 0fdb0e43ee7..a2ab88ffa6b 100644 --- a/troubleshoot/proxy/stats.go +++ b/troubleshoot/proxy/stats.go @@ -3,6 +3,7 @@ package troubleshoot import ( "encoding/json" "fmt" + envoy_admin_v3 "github.com/envoyproxy/go-control-plane/envoy/admin/v3" "github.com/hashicorp/consul/troubleshoot/validate" ) @@ -32,10 +33,19 @@ func (t *Troubleshoot) troubleshootStats() (validate.Messages, error) { } } - statMessages = append(statMessages, validate.Message{ - Success: true, - Message: fmt.Sprintf("Envoy has %v rejected configurations", totalConfigRejections), - }) + if totalConfigRejections > 0 { + statMessages = append(statMessages, validate.Message{ + Message: fmt.Sprintf("Envoy has %v rejected configurations", totalConfigRejections), + PossibleActions: []string{ + "Check the logs of the Consul agent configuring the local proxy to see why Envoy rejected this configuration", + }, + }) + } else { + statMessages = append(statMessages, validate.Message{ + Success: true, + Message: fmt.Sprintf("Envoy has %v rejected configurations", totalConfigRejections), + }) + } connectionFailureStats, err := t.getEnvoyStats("upstream_cx_connect_fail") if err != nil { @@ -50,7 +60,7 @@ func (t *Troubleshoot) troubleshootStats() (validate.Messages, error) { } statMessages = append(statMessages, validate.Message{ Success: true, - Message: fmt.Sprintf("Envoy has detected %v connection failure(s).", totalCxFailures), + Message: fmt.Sprintf("Envoy has detected %v connection failure(s)", totalCxFailures), }) return statMessages, nil } diff --git a/troubleshoot/proxy/troubleshoot_proxy.go b/troubleshoot/proxy/troubleshoot_proxy.go index ff74aff0d4e..8d1bfdc0bf1 100644 --- a/troubleshoot/proxy/troubleshoot_proxy.go +++ b/troubleshoot/proxy/troubleshoot_proxy.go @@ -10,15 +10,6 @@ import ( "github.com/hashicorp/consul/troubleshoot/validate" ) -const ( - listeners string = "type.googleapis.com/envoy.admin.v3.ListenersConfigDump" - clusters string = "type.googleapis.com/envoy.admin.v3.ClustersConfigDump" - routes string = "type.googleapis.com/envoy.admin.v3.RoutesConfigDump" - endpoints string = "type.googleapis.com/envoy.admin.v3.EndpointsConfigDump" - bootstrap string = "type.googleapis.com/envoy.admin.v3.BootstrapConfigDump" - httpConnManager string = "type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager" -) - type Troubleshoot struct { client *api.Client envoyAddr net.IPAddr @@ -79,7 +70,7 @@ func (t *Troubleshoot) RunAllTests(upstreamEnvoyID, upstreamIP string) (validate if errors := messages.Errors(); len(errors) == 0 { msg := validate.Message{ Success: true, - Message: "certificates are valid", + Message: "Certificates are valid", } allTestMessages = append(allTestMessages, msg) } @@ -97,7 +88,7 @@ func (t *Troubleshoot) RunAllTests(upstreamEnvoyID, upstreamIP string) (validate if errors := messages.Errors(); len(errors) == 0 { msg := validate.Message{ Success: true, - Message: "upstream resources are valid", + Message: "Upstream resources are valid", } allTestMessages = append(allTestMessages, msg) } diff --git a/troubleshoot/proxy/upstreams.go b/troubleshoot/proxy/upstreams.go index abd9711abfa..2ac7c8e953d 100644 --- a/troubleshoot/proxy/upstreams.go +++ b/troubleshoot/proxy/upstreams.go @@ -2,6 +2,7 @@ package troubleshoot import ( "fmt" + envoy_admin_v3 "github.com/envoyproxy/go-control-plane/envoy/admin/v3" envoy_listener_v3 "github.com/envoyproxy/go-control-plane/envoy/config/listener/v3" envoy_route_v3 "github.com/envoyproxy/go-control-plane/envoy/config/route/v3" @@ -29,7 +30,7 @@ func (t *Troubleshoot) GetUpstreams() ([]string, []UpstreamIP, error) { for _, cfg := range t.envoyConfigDump.Configs { switch cfg.TypeUrl { - case listeners: + case listenersType: lcd := &envoy_admin_v3.ListenersConfigDump{} err := proto.Unmarshal(cfg.GetValue(), lcd) @@ -135,7 +136,7 @@ func getClustersFromRoutes(routeName string, cfgDump *envoy_admin_v3.ConfigDump) for _, cfg := range cfgDump.Configs { switch cfg.TypeUrl { - case routes: + case routesType: rcd := &envoy_admin_v3.RoutesConfigDump{} err := proto.Unmarshal(cfg.GetValue(), rcd) diff --git a/troubleshoot/proxy/upstreams_test.go b/troubleshoot/proxy/upstreams_test.go index 6493b5349d2..e1d6ff90753 100644 --- a/troubleshoot/proxy/upstreams_test.go +++ b/troubleshoot/proxy/upstreams_test.go @@ -1,14 +1,15 @@ package troubleshoot import ( + "io" + "os" + "testing" + envoy_admin_v3 "github.com/envoyproxy/go-control-plane/envoy/admin/v3" envoy_listener_v3 "github.com/envoyproxy/go-control-plane/envoy/config/listener/v3" "github.com/stretchr/testify/require" "google.golang.org/protobuf/encoding/protojson" "google.golang.org/protobuf/proto" - "io" - "os" - "testing" ) func TestGetUpstreamIPsFromFilterChain(t *testing.T) { @@ -61,7 +62,7 @@ func TestGetUpstreamIPsFromFilterChain(t *testing.T) { for _, cfg := range cfgDump.Configs { switch cfg.TypeUrl { - case listeners: + case listenersType: lcd := &envoy_admin_v3.ListenersConfigDump{} err := proto.Unmarshal(cfg.GetValue(), lcd) diff --git a/troubleshoot/validate/validate.go b/troubleshoot/validate/validate.go index 59dad4031a3..01f950ba6db 100644 --- a/troubleshoot/validate/validate.go +++ b/troubleshoot/validate/validate.go @@ -110,7 +110,7 @@ type Messages []Message type Message struct { Success bool Message string - PossibleActions string + PossibleActions []string } func (m Messages) Success() bool { @@ -137,6 +137,18 @@ func (m Messages) Errors() Messages { // GetMessages returns the error based only on Validate's state. func (v *Validate) GetMessages(validateEndpoints bool, endpointValidator EndpointValidator, clusters *envoy_admin_v3.Clusters) Messages { var messages Messages + missingXDSActions := []string{ + "Check that your upstream service is registered with Consul", + "Make sure your upstream exists by running the `consul[-k8s] troubleshoot upstreams` command", + "If you are using transparent proxy for this upstream, ensure you have set up allow intentions to the upstream", + "Check the logs of the Consul agent configuring the local proxy to ensure XDS resources were sent by Consul", + } + missingEndpointsActions := []string{ + "Check that your upstream service is healthy and running", + "Check that your upstream service is registered with Consul", + "Check that the upstream proxy is healthy and running", + "If you are explicitly configuring upstreams, ensure the name of the upstream is correct", + } var upstream string upstream = v.envoyID @@ -145,19 +157,25 @@ func (v *Validate) GetMessages(validateEndpoints bool, endpointValidator Endpoin } if !v.listener { - messages = append(messages, Message{Message: fmt.Sprintf("no listener for upstream %q", upstream)}) + messages = append(messages, Message{ + Message: fmt.Sprintf("No listener for upstream %q", upstream), + PossibleActions: missingXDSActions, + }) } else { messages = append(messages, Message{ - Message: fmt.Sprintf("listener for upstream %q found", upstream), + Message: fmt.Sprintf("Listener for upstream %q found", upstream), Success: true, }) } if v.usesRDS && !v.route { - messages = append(messages, Message{Message: fmt.Sprintf("no route for upstream %q", upstream)}) - } else { messages = append(messages, Message{ - Message: fmt.Sprintf("route for upstream %q found", upstream), + Message: fmt.Sprintf("No route for upstream %q", upstream), + PossibleActions: missingXDSActions, + }) + } else if v.route { + messages = append(messages, Message{ + Message: fmt.Sprintf("Route for upstream %q found", upstream), Success: true, }) } @@ -173,11 +191,14 @@ func (v *Validate) GetMessages(validateEndpoints bool, endpointValidator Endpoin _, ok := v.snis[sni] if !ok || !resource.cluster { - messages = append(messages, Message{Message: fmt.Sprintf("no cluster %q for upstream %q", sni, upstream)}) + messages = append(messages, Message{ + Message: fmt.Sprintf("No cluster %q for upstream %q", sni, upstream), + PossibleActions: missingXDSActions, + }) continue } else { messages = append(messages, Message{ - Message: fmt.Sprintf("cluster %q for upstream %q found", sni, upstream), + Message: fmt.Sprintf("Cluster %q for upstream %q found", sni, upstream), Success: true, }) } @@ -186,7 +207,7 @@ func (v *Validate) GetMessages(validateEndpoints bool, endpointValidator Endpoin // validation. if strings.Contains(sni, "passthrough~") { messages = append(messages, Message{ - Message: fmt.Sprintf("cluster %q is a passthrough cluster, skipping endpoint healthiness check", sni), + Message: fmt.Sprintf("Cluster %q is a passthrough cluster, skipping endpoint healthiness check", sni), Success: true, }) continue @@ -206,10 +227,13 @@ func (v *Validate) GetMessages(validateEndpoints bool, endpointValidator Endpoin } } if !oneClusterHasEndpoints { - messages = append(messages, Message{Message: fmt.Sprintf("no healthy endpoints for aggregate cluster %q for upstream %q", sni, upstream)}) + messages = append(messages, Message{ + Message: fmt.Sprintf("No healthy endpoints for aggregate cluster %q for upstream %q", sni, upstream), + PossibleActions: missingEndpointsActions, + }) } else { messages = append(messages, Message{ - Message: fmt.Sprintf("healthy endpoints for aggregate cluster %q for upstream %q", sni, upstream), + Message: fmt.Sprintf("Healthy endpoints for aggregate cluster %q for upstream %q found", sni, upstream), Success: true, }) } @@ -218,11 +242,12 @@ func (v *Validate) GetMessages(validateEndpoints bool, endpointValidator Endpoin endpointValidator(resource, sni, clusters) if (resource.usesEDS && !resource.loadAssignment) || resource.endpoints == 0 { messages = append(messages, Message{ - Message: fmt.Sprintf("no healthy endpoints for cluster %q for upstream %q", sni, upstream), + Message: fmt.Sprintf("No healthy endpoints for cluster %q for upstream %q", sni, upstream), + PossibleActions: missingEndpointsActions, }) } else { messages = append(messages, Message{ - Message: fmt.Sprintf("healthy endpoints for cluster %q for upstream %q", sni, upstream), + Message: fmt.Sprintf("Healthy endpoints for cluster %q for upstream %q found", sni, upstream), Success: true, }) } @@ -235,7 +260,7 @@ func (v *Validate) GetMessages(validateEndpoints bool, endpointValidator Endpoin } if numRequiredResources == 0 { - messages = append(messages, Message{Message: fmt.Sprintf("no clusters found on route or listener")}) + messages = append(messages, Message{Message: fmt.Sprintf("No clusters found on route or listener")}) } return messages diff --git a/troubleshoot/validate/validate_test.go b/troubleshoot/validate/validate_test.go index c8f353f306a..6496001b79a 100644 --- a/troubleshoot/validate/validate_test.go +++ b/troubleshoot/validate/validate_test.go @@ -63,7 +63,7 @@ func TestErrors(t *testing.T) { r.loadAssignment = true r.endpoints = 1 }, - err: "no clusters found on route or listener", + err: "No clusters found on route or listener", }, "no healthy endpoints": { validate: func() *Validate { @@ -86,7 +86,7 @@ func TestErrors(t *testing.T) { endpointValidator: func(r *resource, s string, clusters *envoy_admin_v3.Clusters) { r.loadAssignment = true }, - err: "no healthy endpoints for cluster \"db-sni\" for upstream \"db\"", + err: "No healthy endpoints for cluster \"db-sni\" for upstream \"db\"", }, "success: aggregate cluster with one target with endpoints": { validate: func() *Validate { @@ -169,7 +169,7 @@ func TestErrors(t *testing.T) { r.loadAssignment = true r.endpoints = 0 }, - err: "no healthy endpoints for aggregate cluster \"db-sni\" for upstream \"db\"", + err: "No healthy endpoints for aggregate cluster \"db-sni\" for upstream \"db\"", }, "success: passthrough cluster doesn't error even though there are zero endpoints": { validate: func() *Validate { @@ -203,7 +203,9 @@ func TestErrors(t *testing.T) { var outputErrors string for _, msgError := range messages.Errors() { outputErrors += msgError.Message - outputErrors += msgError.PossibleActions + for _, action := range msgError.PossibleActions { + outputErrors += action + } } if tc.err == "" { require.True(t, messages.Success()) From b3ddd4d24efd42cc10db34e99400f44c30d7ec37 Mon Sep 17 00:00:00 2001 From: Andrew Stucki Date: Fri, 17 Feb 2023 12:46:03 -0500 Subject: [PATCH 013/262] Inline API Gateway TLS cert code (#16295) * Include secret type when building resources from config snapshot * First pass at generating envoy secrets from api-gateway snapshot * Update comments for xDS update order * Add secret type + corresponding golden files to existing tests * Initialize test helpers for testing api-gateway resource generation * Generate golden files for new api-gateway xDS resource test * Support ADS for TLS certificates on api-gateway * Configure TLS on api-gateway listeners * Inline TLS cert code * update tests * Add SNI support so we can have multiple certificates * Remove commented out section from helper * regen deep-copy * Add tcp tls test --------- Co-authored-by: Nathan Coleman --- agent/proxycfg/proxycfg.deepcopy.go | 17 ++ agent/proxycfg/snapshot.go | 40 ++- agent/proxycfg/testing_api_gateway.go | 12 + .../config_entry_inline_certificate.go | 24 ++ agent/structs/config_entry_status.go | 5 + agent/xds/delta.go | 15 +- agent/xds/listeners.go | 3 + agent/xds/listeners_ingress.go | 168 +++++++++- agent/xds/listeners_test.go | 13 +- agent/xds/resources.go | 3 +- agent/xds/resources_test.go | 106 ++++++- agent/xds/secrets.go | 12 +- agent/xds/testcommon/testcommon.go | 3 + ...and-inline-certificate.envoy-1-21-x.golden | 55 ++++ ...route-and-inline-certificate.latest.golden | 55 ++++ ...route-and-inline-certificate.latest.golden | 5 + ...ttp-listener-with-http-route.latest.golden | 56 ++-- .../api-gateway-http-listener.latest.golden | 6 +- ...api-gateway-nil-config-entry.latest.golden | 6 +- ...ener-with-tcp-and-http-route.latest.golden | 84 ++--- ...-tcp-listener-with-tcp-route.latest.golden | 36 +-- .../api-gateway-tcp-listener.latest.golden | 6 +- ...route-and-inline-certificate.latest.golden | 60 ++++ ...route-and-inline-certificate.latest.golden | 5 + ...route-and-inline-certificate.latest.golden | 5 + ...nect-proxy-exported-to-peers.latest.golden | 5 + ...and-failover-to-cluster-peer.latest.golden | 5 + ...and-redirect-to-cluster-peer.latest.golden | 5 + ...-proxy-with-peered-upstreams.latest.golden | 5 + .../testdata/secrets/defaults.latest.golden | 5 + ...ateway-with-peered-upstreams.latest.golden | 5 + ...ateway-peering-control-plane.latest.golden | 5 + ...ed-services-http-with-router.latest.golden | 5 + ...xported-peered-services-http.latest.golden | 5 + ...ith-exported-peered-services.latest.golden | 5 + ...ith-imported-peered-services.latest.golden | 5 + ...through-mesh-gateway-enabled.latest.golden | 5 + ...arent-proxy-destination-http.latest.golden | 5 + ...ransparent-proxy-destination.latest.golden | 5 + ...ng-gateway-destinations-only.latest.golden | 5 + ...-proxy-with-peered-upstreams.latest.golden | 5 + .../secrets/transparent-proxy.latest.golden | 5 + .../capture.sh | 3 + .../service_gateway.hcl | 4 + .../setup.sh | 287 ++++++++++++++++++ .../vars.sh | 3 + .../verify.bats | 48 +++ .../capture.sh | 3 + .../service_gateway.hcl | 4 + .../setup.sh | 279 +++++++++++++++++ .../vars.sh | 3 + .../verify.bats | 43 +++ test/integration/connect/envoy/helpers.bash | 14 + 53 files changed, 1441 insertions(+), 135 deletions(-) create mode 100644 agent/xds/testdata/clusters/api-gateway-with-tcp-route-and-inline-certificate.envoy-1-21-x.golden create mode 100644 agent/xds/testdata/clusters/api-gateway-with-tcp-route-and-inline-certificate.latest.golden create mode 100644 agent/xds/testdata/endpoints/api-gateway-with-tcp-route-and-inline-certificate.latest.golden create mode 100644 agent/xds/testdata/listeners/api-gateway-with-tcp-route-and-inline-certificate.latest.golden create mode 100644 agent/xds/testdata/routes/api-gateway-with-tcp-route-and-inline-certificate.latest.golden create mode 100644 agent/xds/testdata/secrets/api-gateway-with-tcp-route-and-inline-certificate.latest.golden create mode 100644 agent/xds/testdata/secrets/connect-proxy-exported-to-peers.latest.golden create mode 100644 agent/xds/testdata/secrets/connect-proxy-with-chain-and-failover-to-cluster-peer.latest.golden create mode 100644 agent/xds/testdata/secrets/connect-proxy-with-chain-and-redirect-to-cluster-peer.latest.golden create mode 100644 agent/xds/testdata/secrets/connect-proxy-with-peered-upstreams.latest.golden create mode 100644 agent/xds/testdata/secrets/defaults.latest.golden create mode 100644 agent/xds/testdata/secrets/local-mesh-gateway-with-peered-upstreams.latest.golden create mode 100644 agent/xds/testdata/secrets/mesh-gateway-peering-control-plane.latest.golden create mode 100644 agent/xds/testdata/secrets/mesh-gateway-with-exported-peered-services-http-with-router.latest.golden create mode 100644 agent/xds/testdata/secrets/mesh-gateway-with-exported-peered-services-http.latest.golden create mode 100644 agent/xds/testdata/secrets/mesh-gateway-with-exported-peered-services.latest.golden create mode 100644 agent/xds/testdata/secrets/mesh-gateway-with-imported-peered-services.latest.golden create mode 100644 agent/xds/testdata/secrets/mesh-gateway-with-peer-through-mesh-gateway-enabled.latest.golden create mode 100644 agent/xds/testdata/secrets/transparent-proxy-destination-http.latest.golden create mode 100644 agent/xds/testdata/secrets/transparent-proxy-destination.latest.golden create mode 100644 agent/xds/testdata/secrets/transparent-proxy-terminating-gateway-destinations-only.latest.golden create mode 100644 agent/xds/testdata/secrets/transparent-proxy-with-peered-upstreams.latest.golden create mode 100644 agent/xds/testdata/secrets/transparent-proxy.latest.golden create mode 100644 test/integration/connect/envoy/case-api-gateway-http-tls-overlapping-hosts/capture.sh create mode 100644 test/integration/connect/envoy/case-api-gateway-http-tls-overlapping-hosts/service_gateway.hcl create mode 100644 test/integration/connect/envoy/case-api-gateway-http-tls-overlapping-hosts/setup.sh create mode 100644 test/integration/connect/envoy/case-api-gateway-http-tls-overlapping-hosts/vars.sh create mode 100644 test/integration/connect/envoy/case-api-gateway-http-tls-overlapping-hosts/verify.bats create mode 100644 test/integration/connect/envoy/case-api-gateway-tcp-tls-overlapping-hosts/capture.sh create mode 100644 test/integration/connect/envoy/case-api-gateway-tcp-tls-overlapping-hosts/service_gateway.hcl create mode 100644 test/integration/connect/envoy/case-api-gateway-tcp-tls-overlapping-hosts/setup.sh create mode 100644 test/integration/connect/envoy/case-api-gateway-tcp-tls-overlapping-hosts/vars.sh create mode 100644 test/integration/connect/envoy/case-api-gateway-tcp-tls-overlapping-hosts/verify.bats diff --git a/agent/proxycfg/proxycfg.deepcopy.go b/agent/proxycfg/proxycfg.deepcopy.go index 4c0318f67bf..f1772ae72ed 100644 --- a/agent/proxycfg/proxycfg.deepcopy.go +++ b/agent/proxycfg/proxycfg.deepcopy.go @@ -310,6 +310,23 @@ func (o *configSnapshotAPIGateway) DeepCopy() *configSnapshotAPIGateway { cp.Listeners[k2] = cp_Listeners_v2 } } + if o.ListenerCertificates != nil { + cp.ListenerCertificates = make(map[IngressListenerKey][]structs.InlineCertificateConfigEntry, len(o.ListenerCertificates)) + for k2, v2 := range o.ListenerCertificates { + var cp_ListenerCertificates_v2 []structs.InlineCertificateConfigEntry + if v2 != nil { + cp_ListenerCertificates_v2 = make([]structs.InlineCertificateConfigEntry, len(v2)) + copy(cp_ListenerCertificates_v2, v2) + for i3 := range v2 { + { + retV := v2[i3].DeepCopy() + cp_ListenerCertificates_v2[i3] = *retV + } + } + } + cp.ListenerCertificates[k2] = cp_ListenerCertificates_v2 + } + } if o.BoundListeners != nil { cp.BoundListeners = make(map[string]structs.BoundAPIGatewayListener, len(o.BoundListeners)) for k2, v2 := range o.BoundListeners { diff --git a/agent/proxycfg/snapshot.go b/agent/proxycfg/snapshot.go index 13c85400562..6ce5a30083e 100644 --- a/agent/proxycfg/snapshot.go +++ b/agent/proxycfg/snapshot.go @@ -734,6 +734,8 @@ type configSnapshotAPIGateway struct { // Listeners is the original listener config from the api-gateway config // entry to save us trying to pass fields through Upstreams Listeners map[string]structs.APIGatewayListener + // this acts as an intermediary for inlining certificates + ListenerCertificates map[IngressListenerKey][]structs.InlineCertificateConfigEntry BoundListeners map[string]structs.BoundAPIGatewayListener } @@ -751,6 +753,9 @@ func (c *configSnapshotAPIGateway) ToIngress(datacenter string) (configSnapshotI watchedUpstreamEndpoints := make(map[UpstreamID]map[string]structs.CheckServiceNodes) watchedGatewayEndpoints := make(map[UpstreamID]map[string]structs.CheckServiceNodes) + // reset the cached certificates + c.ListenerCertificates = make(map[IngressListenerKey][]structs.InlineCertificateConfigEntry) + for name, listener := range c.Listeners { boundListener, ok := c.BoundListeners[name] if !ok { @@ -802,17 +807,18 @@ func (c *configSnapshotAPIGateway) ToIngress(datacenter string) (configSnapshotI watchedGatewayEndpoints[id] = gatewayEndpoints } + key := IngressListenerKey{ + Port: listener.Port, + Protocol: string(listener.Protocol), + } + // Configure TLS for the ingress listener - tls, err := c.toIngressTLS() + tls, err := c.toIngressTLS(key, listener, boundListener) if err != nil { return configSnapshotIngressGateway{}, err } - ingressListener.TLS = tls - key := IngressListenerKey{ - Port: listener.Port, - Protocol: string(listener.Protocol), - } + ingressListener.TLS = tls ingressListeners[key] = ingressListener ingressUpstreams[key] = upstreams } @@ -905,9 +911,25 @@ DOMAIN_LOOP: return services, upstreams, compiled, err } -func (c *configSnapshotAPIGateway) toIngressTLS() (*structs.GatewayTLSConfig, error) { - // TODO (t-eckert) this is dependent on future SDS work. - return &structs.GatewayTLSConfig{}, nil +func (c *configSnapshotAPIGateway) toIngressTLS(key IngressListenerKey, listener structs.APIGatewayListener, bound structs.BoundAPIGatewayListener) (*structs.GatewayTLSConfig, error) { + if len(listener.TLS.Certificates) == 0 { + return nil, nil + } + + for _, certRef := range bound.Certificates { + cert, ok := c.Certificates.Get(certRef) + if !ok { + continue + } + c.ListenerCertificates[key] = append(c.ListenerCertificates[key], *cert) + } + + return &structs.GatewayTLSConfig{ + Enabled: true, + TLSMinVersion: listener.TLS.MinVersion, + TLSMaxVersion: listener.TLS.MaxVersion, + CipherSuites: listener.TLS.CipherSuites, + }, nil } type configSnapshotIngressGateway struct { diff --git a/agent/proxycfg/testing_api_gateway.go b/agent/proxycfg/testing_api_gateway.go index 8a9e113f76e..dd55f2eec5c 100644 --- a/agent/proxycfg/testing_api_gateway.go +++ b/agent/proxycfg/testing_api_gateway.go @@ -2,6 +2,7 @@ package proxycfg import ( "fmt" + "github.com/hashicorp/consul/agent/connect" "github.com/hashicorp/consul/agent/consul/discoverychain" "github.com/mitchellh/go-testing-interface" @@ -15,6 +16,7 @@ func TestConfigSnapshotAPIGateway( nsFn func(ns *structs.NodeService), configFn func(entry *structs.APIGatewayConfigEntry, boundEntry *structs.BoundAPIGatewayConfigEntry), routes []structs.BoundRoute, + certificates []structs.InlineCertificateConfigEntry, extraUpdates []UpdateEvent, additionalEntries ...structs.ConfigEntry, ) *ConfigSnapshot { @@ -93,6 +95,16 @@ func TestConfigSnapshotAPIGateway( } } + for _, certificate := range certificates { + inlineCertificate := certificate + baseEvents = append(baseEvents, UpdateEvent{ + CorrelationID: inlineCertificateConfigWatchID, + Result: &structs.ConfigEntryResponse{ + Entry: &inlineCertificate, + }, + }) + } + upstreams := structs.TestUpstreams(t) baseEvents = testSpliceEvents(baseEvents, setupTestVariationConfigEntriesAndSnapshot( diff --git a/agent/structs/config_entry_inline_certificate.go b/agent/structs/config_entry_inline_certificate.go index 24028ffff2f..18e3c7716db 100644 --- a/agent/structs/config_entry_inline_certificate.go +++ b/agent/structs/config_entry_inline_certificate.go @@ -64,6 +64,30 @@ func (e *InlineCertificateConfigEntry) Validate() error { return nil } +func (e *InlineCertificateConfigEntry) Hosts() ([]string, error) { + certificateBlock, _ := pem.Decode([]byte(e.Certificate)) + if certificateBlock == nil { + return nil, errors.New("failed to parse certificate PEM") + } + + certificate, err := x509.ParseCertificate(certificateBlock.Bytes) + if err != nil { + return nil, fmt.Errorf("failed to parse certificate: %w", err) + } + + hosts := []string{certificate.Subject.CommonName} + + for _, name := range certificate.DNSNames { + hosts = append(hosts, name) + } + + for _, ip := range certificate.IPAddresses { + hosts = append(hosts, ip.String()) + } + + return hosts, nil +} + func (e *InlineCertificateConfigEntry) CanRead(authz acl.Authorizer) error { var authzContext acl.AuthorizerContext e.FillAuthzContext(&authzContext) diff --git a/agent/structs/config_entry_status.go b/agent/structs/config_entry_status.go index faafd34d7b7..5485a6ccaf9 100644 --- a/agent/structs/config_entry_status.go +++ b/agent/structs/config_entry_status.go @@ -1,6 +1,7 @@ package structs import ( + "fmt" "sort" "time" @@ -24,6 +25,10 @@ type ResourceReference struct { acl.EnterpriseMeta } +func (r *ResourceReference) String() string { + return fmt.Sprintf("%s:%s/%s/%s/%s", r.Kind, r.PartitionOrDefault(), r.NamespaceOrDefault(), r.Name, r.SectionName) +} + func (r *ResourceReference) IsSame(other *ResourceReference) bool { if r == nil && other == nil { return true diff --git a/agent/xds/delta.go b/agent/xds/delta.go index 5a1ef17d244..62a725b8f1b 100644 --- a/agent/xds/delta.go +++ b/agent/xds/delta.go @@ -466,20 +466,21 @@ func (s *Server) applyEnvoyExtensions(resources *xdscommon.IndexedResources, cfg return nil } +// https://www.envoyproxy.io/docs/envoy/latest/api-docs/xds_protocol#eventual-consistency-considerations var xDSUpdateOrder = []xDSUpdateOperation{ - // TODO Update comments + // 1. SDS updates (if any) can be pushed here with no harm. {TypeUrl: xdscommon.SecretType, Upsert: true}, - // 1. CDS updates (if any) must always be pushed first. + // 2. CDS updates (if any) must always be pushed before the following types. {TypeUrl: xdscommon.ClusterType, Upsert: true}, - // 2. EDS updates (if any) must arrive after CDS updates for the respective clusters. + // 3. EDS updates (if any) must arrive after CDS updates for the respective clusters. {TypeUrl: xdscommon.EndpointType, Upsert: true}, - // 3. LDS updates must arrive after corresponding CDS/EDS updates. + // 4. LDS updates must arrive after corresponding CDS/EDS updates. {TypeUrl: xdscommon.ListenerType, Upsert: true, Remove: true}, - // 4. RDS updates related to the newly added listeners must arrive after CDS/EDS/LDS updates. + // 5. RDS updates related to the newly added listeners must arrive after CDS/EDS/LDS updates. {TypeUrl: xdscommon.RouteType, Upsert: true, Remove: true}, - // 5. (NOT IMPLEMENTED YET IN CONSUL) VHDS updates (if any) related to the newly added RouteConfigurations must arrive after RDS updates. + // 6. (NOT IMPLEMENTED YET IN CONSUL) VHDS updates (if any) related to the newly added RouteConfigurations must arrive after RDS updates. // {}, - // 6. Stale CDS clusters, related EDS endpoints (ones no longer being referenced) and SDS secrets can then be removed. + // 7. Stale CDS clusters, related EDS endpoints (ones no longer being referenced) and SDS secrets can then be removed. {TypeUrl: xdscommon.ClusterType, Remove: true}, {TypeUrl: xdscommon.EndpointType, Remove: true}, {TypeUrl: xdscommon.SecretType, Remove: true}, diff --git a/agent/xds/listeners.go b/agent/xds/listeners.go index 291e7151764..0c31c423849 100644 --- a/agent/xds/listeners.go +++ b/agent/xds/listeners.go @@ -2328,6 +2328,9 @@ func makeHTTPInspectorListenerFilter() (*envoy_listener_v3.ListenerFilter, error } func makeSNIFilterChainMatch(sniMatches ...string) *envoy_listener_v3.FilterChainMatch { + if sniMatches == nil { + return nil + } return &envoy_listener_v3.FilterChainMatch{ ServerNames: sniMatches, } diff --git a/agent/xds/listeners_ingress.go b/agent/xds/listeners_ingress.go index 6083529849d..40eb24230e0 100644 --- a/agent/xds/listeners_ingress.go +++ b/agent/xds/listeners_ingress.go @@ -13,6 +13,7 @@ import ( "github.com/hashicorp/consul/agent/proxycfg" "github.com/hashicorp/consul/agent/structs" + "github.com/hashicorp/consul/lib" "github.com/hashicorp/consul/types" ) @@ -25,6 +26,15 @@ func (s *ResourceGenerator) makeIngressGatewayListeners(address string, cfgSnap return nil, fmt.Errorf("no listener config found for listener on proto/port %s/%d", listenerKey.Protocol, listenerKey.Port) } + var isAPIGatewayWithTLS bool + var certs []structs.InlineCertificateConfigEntry + if cfgSnap.APIGateway.ListenerCertificates != nil { + certs = cfgSnap.APIGateway.ListenerCertificates[listenerKey] + } + if certs != nil { + isAPIGatewayWithTLS = true + } + tlsContext, err := makeDownstreamTLSContextFromSnapshotListenerConfig(cfgSnap, listenerCfg) if err != nil { return nil, err @@ -72,6 +82,7 @@ func (s *ResourceGenerator) makeIngressGatewayListeners(address string, cfgSnap logger: s.Logger, } l := makeListener(opts) + filterChain, err := s.makeUpstreamFilterChain(filterChainOpts{ accessLogs: &cfgSnap.Proxy.AccessLogs, routeName: uid.EnvoyID(), @@ -87,8 +98,30 @@ func (s *ResourceGenerator) makeIngressGatewayListeners(address string, cfgSnap l.FilterChains = []*envoy_listener_v3.FilterChain{ filterChain, } - resources = append(resources, l) + if isAPIGatewayWithTLS { + // construct SNI filter chains + l.FilterChains, err = makeInlineOverrideFilterChains(cfgSnap, cfgSnap.IngressGateway.TLSConfig, listenerKey, listenerFilterOpts{ + useRDS: useRDS, + protocol: listenerKey.Protocol, + routeName: listenerKey.RouteName(), + cluster: clusterName, + statPrefix: "ingress_upstream_", + accessLogs: &cfgSnap.Proxy.AccessLogs, + logger: s.Logger, + }, certs) + if err != nil { + return nil, err + } + // add the tls inspector to do SNI introspection + tlsInspector, err := makeTLSInspectorListenerFilter() + if err != nil { + return nil, err + } + l.ListenerFilters = []*envoy_listener_v3.ListenerFilter{tlsInspector} + } + + resources = append(resources, l) } else { // If multiple upstreams share this port, make a special listener for the protocol. listenerOpts := makeListenerOpts{ @@ -121,6 +154,13 @@ func (s *ResourceGenerator) makeIngressGatewayListeners(address string, cfgSnap return nil, err } + if isAPIGatewayWithTLS { + sniFilterChains, err = makeInlineOverrideFilterChains(cfgSnap, cfgSnap.IngressGateway.TLSConfig, listenerKey, filterOpts, certs) + if err != nil { + return nil, err + } + } + // If there are any sni filter chains, we need a TLS inspector filter! if len(sniFilterChains) > 0 { tlsInspector, err := makeTLSInspectorListenerFilter() @@ -134,7 +174,7 @@ func (s *ResourceGenerator) makeIngressGatewayListeners(address string, cfgSnap // See if there are other services that didn't have specific SNI-matching // filter chains. If so add a default filterchain to serve them. - if len(sniFilterChains) < len(upstreams) { + if len(sniFilterChains) < len(upstreams) && !isAPIGatewayWithTLS { defaultFilter, err := makeListenerFilter(filterOpts) if err != nil { return nil, err @@ -379,10 +419,133 @@ func makeSDSOverrideFilterChains(cfgSnap *proxycfg.ConfigSnapshot, return chains, nil } +// when we have multiple certificates on a single listener, we need +// to duplicate the filter chains with multiple TLS contexts +func makeInlineOverrideFilterChains(cfgSnap *proxycfg.ConfigSnapshot, + tlsCfg structs.GatewayTLSConfig, + listenerKey proxycfg.IngressListenerKey, + filterOpts listenerFilterOpts, + certs []structs.InlineCertificateConfigEntry) ([]*envoy_listener_v3.FilterChain, error) { + + listenerCfg, ok := cfgSnap.IngressGateway.Listeners[listenerKey] + if !ok { + return nil, fmt.Errorf("no listener config found for listener on port %d", listenerKey.Port) + } + + var chains []*envoy_listener_v3.FilterChain + + constructChain := func(name string, hosts []string, tlsContext *envoy_tls_v3.CommonTlsContext) error { + filterOpts.filterName = name + filter, err := makeListenerFilter(filterOpts) + if err != nil { + return err + } + + // Configure alpn protocols on TLSContext + tlsContext.AlpnProtocols = getAlpnProtocols(listenerCfg.Protocol) + transportSocket, err := makeDownstreamTLSTransportSocket(&envoy_tls_v3.DownstreamTlsContext{ + CommonTlsContext: tlsContext, + RequireClientCertificate: &wrapperspb.BoolValue{Value: false}, + }) + if err != nil { + return err + } + + chains = append(chains, &envoy_listener_v3.FilterChain{ + FilterChainMatch: makeSNIFilterChainMatch(hosts...), + Filters: []*envoy_listener_v3.Filter{ + filter, + }, + TransportSocket: transportSocket, + }) + + return nil + } + + multipleCerts := len(certs) > 1 + + allCertHosts := map[string]struct{}{} + overlappingHosts := map[string]struct{}{} + + if multipleCerts { + // we only need to prune out overlapping hosts if we have more than + // one certificate + for _, cert := range certs { + hosts, err := cert.Hosts() + if err != nil { + return nil, fmt.Errorf("unable to parse hosts from x509 certificate: %v", hosts) + } + for _, host := range hosts { + if _, ok := allCertHosts[host]; ok { + overlappingHosts[host] = struct{}{} + } + allCertHosts[host] = struct{}{} + } + } + } + + for _, cert := range certs { + var hosts []string + + // if we only have one cert, we just use it for all ingress + if multipleCerts { + // otherwise, we need an SNI per cert and to fallback to our ingress + // gateway certificate signed by our Consul CA + certHosts, err := cert.Hosts() + if err != nil { + return nil, fmt.Errorf("unable to parse hosts from x509 certificate: %v", hosts) + } + // filter out any overlapping hosts so we don't have collisions in our filter chains + for _, host := range certHosts { + if _, ok := overlappingHosts[host]; !ok { + hosts = append(hosts, host) + } + } + + if len(hosts) == 0 { + // all of our hosts are overlapping, so we just skip this filter and it'll be + // handled by the default filter chain + continue + } + } + + if err := constructChain(cert.Name, hosts, makeInlineTLSContextFromGatewayTLSConfig(tlsCfg, cert)); err != nil { + return nil, err + } + } + + if multipleCerts { + // if we have more than one cert, add a default handler that uses the leaf cert from connect + if err := constructChain("default", nil, makeCommonTLSContext(cfgSnap.Leaf(), cfgSnap.RootPEMs(), makeTLSParametersFromGatewayTLSConfig(tlsCfg))); err != nil { + return nil, err + } + } + + return chains, nil +} + func makeTLSParametersFromGatewayTLSConfig(tlsCfg structs.GatewayTLSConfig) *envoy_tls_v3.TlsParameters { return makeTLSParametersFromTLSConfig(tlsCfg.TLSMinVersion, tlsCfg.TLSMaxVersion, tlsCfg.CipherSuites) } +func makeInlineTLSContextFromGatewayTLSConfig(tlsCfg structs.GatewayTLSConfig, cert structs.InlineCertificateConfigEntry) *envoy_tls_v3.CommonTlsContext { + return &envoy_tls_v3.CommonTlsContext{ + TlsParams: makeTLSParametersFromGatewayTLSConfig(tlsCfg), + TlsCertificates: []*envoy_tls_v3.TlsCertificate{{ + CertificateChain: &envoy_core_v3.DataSource{ + Specifier: &envoy_core_v3.DataSource_InlineString{ + InlineString: lib.EnsureTrailingNewline(cert.Certificate), + }, + }, + PrivateKey: &envoy_core_v3.DataSource{ + Specifier: &envoy_core_v3.DataSource_InlineString{ + InlineString: lib.EnsureTrailingNewline(cert.PrivateKey), + }, + }, + }}, + } +} + func makeCommonTLSContextFromGatewayTLSConfig(tlsCfg structs.GatewayTLSConfig) *envoy_tls_v3.CommonTlsContext { return &envoy_tls_v3.CommonTlsContext{ TlsParams: makeTLSParametersFromGatewayTLSConfig(tlsCfg), @@ -396,6 +559,7 @@ func makeCommonTLSContextFromGatewayServiceTLSConfig(tlsCfg structs.GatewayServi TlsCertificateSdsSecretConfigs: makeTLSCertificateSdsSecretConfigsFromSDS(*tlsCfg.SDS), } } + func makeTLSCertificateSdsSecretConfigsFromSDS(sdsCfg structs.GatewayTLSSDSConfig) []*envoy_tls_v3.SdsSecretConfig { return []*envoy_tls_v3.SdsSecretConfig{ { diff --git a/agent/xds/listeners_test.go b/agent/xds/listeners_test.go index e4e7c845751..6d0d64407bb 100644 --- a/agent/xds/listeners_test.go +++ b/agent/xds/listeners_test.go @@ -530,7 +530,7 @@ func TestListenersFromSnapshot(t *testing.T) { { name: "api-gateway", create: func(t testinf.T) *proxycfg.ConfigSnapshot { - return proxycfg.TestConfigSnapshotAPIGateway(t, "default", nil, nil, nil, nil) + return proxycfg.TestConfigSnapshotAPIGateway(t, "default", nil, nil, nil, nil, nil) }, }, { @@ -555,7 +555,7 @@ func TestListenersFromSnapshot(t *testing.T) { Name: "listener", }, } - }, nil, nil) + }, nil, nil, nil) }, }, { @@ -595,7 +595,7 @@ func TestListenersFromSnapshot(t *testing.T) { {Name: "tcp-service"}, }, }, - }, nil) + }, nil, nil) }, }, { @@ -615,7 +615,7 @@ func TestListenersFromSnapshot(t *testing.T) { Routes: []structs.ResourceReference{}, }, } - }, nil, nil) + }, nil, nil, nil) }, }, { @@ -658,7 +658,7 @@ func TestListenersFromSnapshot(t *testing.T) { }, }, }, - }, nil) + }, nil, nil) }, }, { @@ -697,7 +697,6 @@ func TestListenersFromSnapshot(t *testing.T) { }, }, } - }, []structs.BoundRoute{ &structs.TCPRouteConfigEntry{ Name: "tcp-route", @@ -729,7 +728,7 @@ func TestListenersFromSnapshot(t *testing.T) { }, }, }, - }, nil) + }, nil, nil) }, }, { diff --git a/agent/xds/resources.go b/agent/xds/resources.go index 6bd6709343c..cab494da4ca 100644 --- a/agent/xds/resources.go +++ b/agent/xds/resources.go @@ -35,8 +35,7 @@ func NewResourceGenerator( func (g *ResourceGenerator) AllResourcesFromSnapshot(cfgSnap *proxycfg.ConfigSnapshot) (map[string][]proto.Message, error) { all := make(map[string][]proto.Message) - // TODO Add xdscommon.SecretType - for _, typeUrl := range []string{xdscommon.ListenerType, xdscommon.RouteType, xdscommon.ClusterType, xdscommon.EndpointType} { + for _, typeUrl := range []string{xdscommon.ListenerType, xdscommon.RouteType, xdscommon.ClusterType, xdscommon.EndpointType, xdscommon.SecretType} { res, err := g.resourcesFromSnapshot(typeUrl, cfgSnap) if err != nil { return nil, fmt.Errorf("failed to generate xDS resources for %q: %v", typeUrl, err) diff --git a/agent/xds/resources_test.go b/agent/xds/resources_test.go index ad3c1b396c2..5fc31dc9e2d 100644 --- a/agent/xds/resources_test.go +++ b/agent/xds/resources_test.go @@ -9,6 +9,8 @@ import ( envoy_endpoint_v3 "github.com/envoyproxy/go-control-plane/envoy/config/endpoint/v3" envoy_listener_v3 "github.com/envoyproxy/go-control-plane/envoy/config/listener/v3" envoy_route_v3 "github.com/envoyproxy/go-control-plane/envoy/config/route/v3" + envoy_tls_v3 "github.com/envoyproxy/go-control-plane/envoy/extensions/transport_sockets/tls/v3" + "github.com/hashicorp/consul/agent/xds/testcommon" "github.com/hashicorp/consul/envoyextensions/xdscommon" @@ -25,6 +27,7 @@ var testTypeUrlToPrettyName = map[string]string{ xdscommon.RouteType: "routes", xdscommon.ClusterType: "clusters", xdscommon.EndpointType: "endpoints", + xdscommon.SecretType: "secrets", } type goldenTestCase struct { @@ -60,7 +63,7 @@ func TestAllResourcesFromSnapshot(t *testing.T) { // We need to replace the TLS certs with deterministic ones to make golden // files workable. Note we don't update these otherwise they'd change - // golder files for every test case and so not be any use! + // golden files for every test case and so not be any use! testcommon.SetupTLSRootsAndLeaf(t, snap) if tt.setup != nil { @@ -82,6 +85,7 @@ func TestAllResourcesFromSnapshot(t *testing.T) { xdscommon.RouteType, xdscommon.ClusterType, xdscommon.EndpointType, + xdscommon.SecretType, } require.Len(t, resources, len(typeUrls)) @@ -101,6 +105,8 @@ func TestAllResourcesFromSnapshot(t *testing.T) { return items[i].(*envoy_cluster_v3.Cluster).Name < items[j].(*envoy_cluster_v3.Cluster).Name case xdscommon.EndpointType: return items[i].(*envoy_endpoint_v3.ClusterLoadAssignment).ClusterName < items[j].(*envoy_endpoint_v3.ClusterLoadAssignment).ClusterName + case xdscommon.SecretType: + return items[i].(*envoy_tls_v3.Secret).Name < items[j].(*envoy_tls_v3.Secret).Name default: panic("not possible") } @@ -165,6 +171,7 @@ func TestAllResourcesFromSnapshot(t *testing.T) { tests = append(tests, getMeshGatewayPeeringGoldenTestCases()...) tests = append(tests, getTrafficControlPeeringGoldenTestCases()...) tests = append(tests, getEnterpriseGoldenTestCases()...) + tests = append(tests, getAPIGatewayGoldenTestCases()...) latestEnvoyVersion := xdscommon.EnvoyVersions[0] for _, envoyVersion := range xdscommon.EnvoyVersions { @@ -256,3 +263,100 @@ func getTrafficControlPeeringGoldenTestCases() []goldenTestCase { }, } } + +const ( + gatewayTestPrivateKey = `-----BEGIN RSA PRIVATE KEY----- +MIIEowIBAAKCAQEAx95Opa6t4lGEpiTUogEBptqOdam2ch4BHQGhNhX/MrDwwuZQ +httBwMfngQ/wd9NmYEPAwj0dumUoAITIq6i2jQlhqTodElkbsd5vWY8R/bxJWQSo +NvVE12TlzECxGpJEiHt4W0r8pGffk+rvpljiUyCfnT1kGF3znOSjK1hRMTn6RKWC +yYaBvXQiB4SGilfLgJcEpOJKtISIxmZ+S409g9X5VU88/Bmmrz4cMyxce86Kc2ug +5/MOv0CjWDJwlrv8njneV2zvraQ61DDwQftrXOvuCbO5IBRHMOBHiHTZ4rtGuhMa +Ir21V4vb6n8c4YzXiFvhUYcyX7rltGZzVd+WmQIDAQABAoIBACYvceUzp2MK4gYA +GWPOP2uKbBdM0l+hHeNV0WAM+dHMfmMuL4pkT36ucqt0ySOLjw6rQyOZG5nmA6t9 +sv0g4ae2eCMlyDIeNi1Yavu4Wt6YX4cTXbQKThm83C6W2X9THKbauBbxD621bsDK +7PhiGPN60yPue7YwFQAPqqD4YaK+s22HFIzk9gwM/rkvAUNwRv7SyHMiFe4Igc1C +Eev7iHWzvj5Heoz6XfF+XNF9DU+TieSUAdjd56VyUb8XL4+uBTOhHwLiXvAmfaMR +HvpcxeKnYZusS6NaOxcUHiJnsLNWrxmJj9WEGgQzuLxcLjTe4vVmELVZD8t3QUKj +PAxu8tUCgYEA7KIWVn9dfVpokReorFym+J8FzLwSktP9RZYEMonJo00i8aii3K9s +u/aSwRWQSCzmON1ZcxZzWhwQF9usz6kGCk//9+4hlVW90GtNK0RD+j7sp4aT2JI8 +9eLEjTG+xSXa7XWe98QncjjL9lu/yrRncSTxHs13q/XP198nn2aYuQ8CgYEA2Dnt +sRBzv0fFEvzzFv7G/5f85mouN38TUYvxNRTjBLCXl9DeKjDkOVZ2b6qlfQnYXIru +H+W+v+AZEb6fySXc8FRab7lkgTMrwE+aeI4rkW7asVwtclv01QJ5wMnyT84AgDD/ +Dgt/RThFaHgtU9TW5GOZveL+l9fVPn7vKFdTJdcCgYEArJ99zjHxwJ1whNAOk1av +09UmRPm6TvRo4heTDk8oEoIWCNatoHI0z1YMLuENNSnT9Q280FFDayvnrY/qnD7A +kktT/sjwJOG8q8trKzIMqQS4XWm2dxoPcIyyOBJfCbEY6XuRsUuePxwh5qF942EB +yS9a2s6nC4Ix0lgPrqAIr48CgYBgS/Q6riwOXSU8nqCYdiEkBYlhCJrKpnJxF9T1 +ofa0yPzKZP/8ZEfP7VzTwHjxJehQ1qLUW9pG08P2biH1UEKEWdzo8vT6wVJT1F/k +HtTycR8+a+Hlk2SHVRHqNUYQGpuIe8mrdJ1as4Pd0d/F/P0zO9Rlh+mAsGPM8HUM +T0+9gwKBgHDoerX7NTskg0H0t8O+iSMevdxpEWp34ZYa9gHiftTQGyrRgERCa7Gj +nZPAxKb2JoWyfnu3v7G5gZ8fhDFsiOxLbZv6UZJBbUIh1MjJISpXrForDrC2QNLX +kHrHfwBFDB3KMudhQknsJzEJKCL/KmFH6o0MvsoaT9yzEl3K+ah/ +-----END RSA PRIVATE KEY-----` + gatewayTestCertificate = `-----BEGIN CERTIFICATE----- +MIICljCCAX4CCQCQMDsYO8FrPjANBgkqhkiG9w0BAQsFADANMQswCQYDVQQGEwJV +UzAeFw0yMjEyMjAxNzUwMjVaFw0yNzEyMTkxNzUwMjVaMA0xCzAJBgNVBAYTAlVT +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx95Opa6t4lGEpiTUogEB +ptqOdam2ch4BHQGhNhX/MrDwwuZQhttBwMfngQ/wd9NmYEPAwj0dumUoAITIq6i2 +jQlhqTodElkbsd5vWY8R/bxJWQSoNvVE12TlzECxGpJEiHt4W0r8pGffk+rvplji +UyCfnT1kGF3znOSjK1hRMTn6RKWCyYaBvXQiB4SGilfLgJcEpOJKtISIxmZ+S409 +g9X5VU88/Bmmrz4cMyxce86Kc2ug5/MOv0CjWDJwlrv8njneV2zvraQ61DDwQftr +XOvuCbO5IBRHMOBHiHTZ4rtGuhMaIr21V4vb6n8c4YzXiFvhUYcyX7rltGZzVd+W +mQIDAQABMA0GCSqGSIb3DQEBCwUAA4IBAQBfCqoUIdPf/HGSbOorPyZWbyizNtHJ +GL7x9cAeIYxpI5Y/WcO1o5v94lvrgm3FNfJoGKbV66+JxOge731FrfMpHplhar1Z +RahYIzNLRBTLrwadLAZkApUpZvB8qDK4knsTWFYujNsylCww2A6ajzIMFNU4GkUK +NtyHRuD+KYRmjXtyX1yHNqfGN3vOQmwavHq2R8wHYuBSc6LAHHV9vG+j0VsgMELO +qwxn8SmLkSKbf2+MsQVzLCXXN5u+D8Yv+4py+oKP4EQ5aFZuDEx+r/G/31rTthww +AAJAMaoXmoYVdgXV+CPuBb2M4XCpuzLu3bcA2PXm5ipSyIgntMKwXV7r +-----END CERTIFICATE-----` +) + +func getAPIGatewayGoldenTestCases() []goldenTestCase { + return []goldenTestCase{ + { + name: "api-gateway-with-tcp-route-and-inline-certificate", + create: func(t testinf.T) *proxycfg.ConfigSnapshot { + return proxycfg.TestConfigSnapshotAPIGateway(t, "default", nil, func(entry *structs.APIGatewayConfigEntry, bound *structs.BoundAPIGatewayConfigEntry) { + entry.Listeners = []structs.APIGatewayListener{ + { + Name: "listener", + Protocol: structs.ListenerProtocolTCP, + Port: 8080, + TLS: structs.APIGatewayTLSConfiguration{ + Certificates: []structs.ResourceReference{{ + Kind: structs.InlineCertificate, + Name: "certificate", + }}, + }, + }, + } + bound.Listeners = []structs.BoundAPIGatewayListener{ + { + Name: "listener", + Certificates: []structs.ResourceReference{{ + Kind: structs.InlineCertificate, + Name: "certificate", + }}, + Routes: []structs.ResourceReference{{ + Kind: structs.TCPRoute, + Name: "route", + }}, + }, + } + }, []structs.BoundRoute{ + &structs.TCPRouteConfigEntry{ + Kind: structs.TCPRoute, + Name: "route", + Services: []structs.TCPService{{ + Name: "service", + }}, + }, + }, []structs.InlineCertificateConfigEntry{{ + Kind: structs.InlineCertificate, + Name: "certificate", + PrivateKey: gatewayTestPrivateKey, + Certificate: gatewayTestCertificate, + }}, nil) + }, + }, + } +} diff --git a/agent/xds/secrets.go b/agent/xds/secrets.go index 5547b6d2037..a1ef50e44ca 100644 --- a/agent/xds/secrets.go +++ b/agent/xds/secrets.go @@ -21,18 +21,10 @@ func (s *ResourceGenerator) secretsFromSnapshot(cfgSnap *proxycfg.ConfigSnapshot case structs.ServiceKindConnectProxy, structs.ServiceKindTerminatingGateway, structs.ServiceKindMeshGateway, - structs.ServiceKindIngressGateway: + structs.ServiceKindIngressGateway, + structs.ServiceKindAPIGateway: return nil, nil - // Only API gateways utilize secrets - case structs.ServiceKindAPIGateway: - return s.secretsFromSnapshotAPIGateway(cfgSnap) default: return nil, fmt.Errorf("Invalid service kind: %v", cfgSnap.Kind) } } - -func (s *ResourceGenerator) secretsFromSnapshotAPIGateway(cfgSnap *proxycfg.ConfigSnapshot) ([]proto.Message, error) { - var res []proto.Message - // TODO - return res, nil -} diff --git a/agent/xds/testcommon/testcommon.go b/agent/xds/testcommon/testcommon.go index c310d0980a6..ba75cf9ae97 100644 --- a/agent/xds/testcommon/testcommon.go +++ b/agent/xds/testcommon/testcommon.go @@ -22,6 +22,9 @@ func SetupTLSRootsAndLeaf(t *testing.T, snap *proxycfg.ConfigSnapshot) { case structs.ServiceKindMeshGateway: snap.MeshGateway.Leaf.CertPEM = loadTestResource(t, "test-leaf-cert") snap.MeshGateway.Leaf.PrivateKeyPEM = loadTestResource(t, "test-leaf-key") + case structs.ServiceKindAPIGateway: + snap.APIGateway.Leaf.CertPEM = loadTestResource(t, "test-leaf-cert") + snap.APIGateway.Leaf.PrivateKeyPEM = loadTestResource(t, "test-leaf-key") } } if snap.Roots != nil { diff --git a/agent/xds/testdata/clusters/api-gateway-with-tcp-route-and-inline-certificate.envoy-1-21-x.golden b/agent/xds/testdata/clusters/api-gateway-with-tcp-route-and-inline-certificate.envoy-1-21-x.golden new file mode 100644 index 00000000000..0f1acf25883 --- /dev/null +++ b/agent/xds/testdata/clusters/api-gateway-with-tcp-route-and-inline-certificate.envoy-1-21-x.golden @@ -0,0 +1,55 @@ +{ + "versionInfo": "00000001", + "resources": [ + { + "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", + "name": "my-tcp-service.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "altStatName": "my-tcp-service.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "type": "EDS", + "edsClusterConfig": { + "edsConfig": { + "ads": {}, + "resourceApiVersion": "V3" + } + }, + "connectTimeout": "5s", + "circuitBreakers": {}, + "outlierDetection": {}, + "commonLbConfig": { + "healthyPanicThreshold": {} + }, + "transportSocket": { + "name": "tls", + "typedConfig": { + "@type": "type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext", + "commonTlsContext": { + "tlsParams": {}, + "tlsCertificates": [ + { + "certificateChain": { + "inlineString": "-----BEGIN CERTIFICATE-----\nMIICBTCCAaugAwIBAgIIDUmSJn0rk7IwCgYIKoZIzj0EAwIwFjEUMBIGA1UEAxML\nVGVzdCBDQSA5OTcwHhcNMjMwMjEzMTk1NzI2WhcNMzMwMjEwMTk1NzI2WjAAMFkw\nEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEg0SW0HLUZjEG9lnmnVT8g/1i+zdPVrCq\nWIltXSdtS3xbwaiP+5Vnc4sr/MqLhIC46BfyjrQWlz8bH+AGmn6pqKOB+DCB9TAO\nBgNVHQ8BAf8EBAMCA7gwHQYDVR0lBBYwFAYIKwYBBQUHAwIGCCsGAQUFBwMBMAwG\nA1UdEwEB/wQCMAAwKQYDVR0OBCIEIJhaXpuR2wfoxMchnGF3jGjSlhq4ldWkWnbj\nTjqghzzBMCsGA1UdIwQkMCKAIPSY/nP8UYJ63YM3PU3r4pUr6PujDyRaz1fyqlsJ\njZOZMF4GA1UdEQEB/wRUMFKCAIZOc3BpZmZlOi8vMTExMTExMTEtMjIyMi0zMzMz\nLTQ0NDQtNTU1NTU1NTU1NTU1LmNvbnN1bC9ucy9kZWZhdWx0L2RjL2RjMS9zdmMv\nd2ViMAoGCCqGSM49BAMCA0gAMEUCIQCWa5SsdXjVOHrIymFBFDYaB63G37I7G4fS\nnwHSTUX4WgIgRSmlLlZyYAC7iVfxYawVF00jlJgiI9BR15jZKX7AbQY=\n-----END CERTIFICATE-----\n" + }, + "privateKey": { + "inlineString": "-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEIAXRcUw9WfqWXNpB17uKREas/k4BEXmfTrHuMipy4cBYoAoGCCqGSM49\nAwEHoUQDQgAEg0SW0HLUZjEG9lnmnVT8g/1i+zdPVrCqWIltXSdtS3xbwaiP+5Vn\nc4sr/MqLhIC46BfyjrQWlz8bH+AGmn6pqA==\n-----END EC PRIVATE KEY-----\n" + } + } + ], + "validationContext": { + "trustedCa": { + "inlineString": "-----BEGIN CERTIFICATE-----\nMIICXDCCAgKgAwIBAgIICpZq70Z9LyUwCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowFDESMBAG\nA1UEAxMJVGVzdCBDQSAyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEIhywH1gx\nAsMwuF3ukAI5YL2jFxH6Usnma1HFSfVyxbXX1/uoZEYrj8yCAtdU2yoHETyd+Zx2\nThhRLP79pYegCaOCATwwggE4MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTAD\nAQH/MGgGA1UdDgRhBF9kMToxMToxMTphYzoyYTpiYTo5NzpiMjozZjphYzo3Yjpi\nZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1ZTo0MTo2ZjpmMjo3\nMzo5NTo1ODowYzpkYjBqBgNVHSMEYzBhgF9kMToxMToxMTphYzoyYTpiYTo5Nzpi\nMjozZjphYzo3YjpiZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1\nZTo0MTo2ZjpmMjo3Mzo5NTo1ODowYzpkYjA/BgNVHREEODA2hjRzcGlmZmU6Ly8x\nMTExMTExMS0yMjIyLTMzMzMtNDQ0NC01NTU1NTU1NTU1NTUuY29uc3VsMAoGCCqG\nSM49BAMCA0gAMEUCICOY0i246rQHJt8o8Oya0D5PLL1FnmsQmQqIGCi31RwnAiEA\noR5f6Ku+cig2Il8T8LJujOp2/2A72QcHZA57B13y+8o=\n-----END CERTIFICATE-----\n" + }, + "matchSubjectAltNames": [ + { + "exact": "spiffe://11111111-2222-3333-4444-555555555555.consul/ns/default/dc/dc1/svc/my-tcp-service" + } + ] + } + }, + "sni": "my-tcp-service.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul" + } + } + } + ], + "typeUrl": "type.googleapis.com/envoy.config.cluster.v3.Cluster", + "nonce": "00000001" +} \ No newline at end of file diff --git a/agent/xds/testdata/clusters/api-gateway-with-tcp-route-and-inline-certificate.latest.golden b/agent/xds/testdata/clusters/api-gateway-with-tcp-route-and-inline-certificate.latest.golden new file mode 100644 index 00000000000..f18e7e0d976 --- /dev/null +++ b/agent/xds/testdata/clusters/api-gateway-with-tcp-route-and-inline-certificate.latest.golden @@ -0,0 +1,55 @@ +{ + "versionInfo": "00000001", + "resources": [ + { + "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", + "name": "service.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "altStatName": "service.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "type": "EDS", + "edsClusterConfig": { + "edsConfig": { + "ads": {}, + "resourceApiVersion": "V3" + } + }, + "connectTimeout": "5s", + "circuitBreakers": {}, + "outlierDetection": {}, + "commonLbConfig": { + "healthyPanicThreshold": {} + }, + "transportSocket": { + "name": "tls", + "typedConfig": { + "@type": "type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext", + "commonTlsContext": { + "tlsParams": {}, + "tlsCertificates": [ + { + "certificateChain": { + "inlineString": "-----BEGIN CERTIFICATE-----\nMIICjDCCAjKgAwIBAgIIC5llxGV1gB8wCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowDjEMMAoG\nA1UEAxMDd2ViMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEADPv1RHVNRfa2VKR\nAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Favq5E0ivpNtv1QnFhxtPd7d5k4e+T7\nSkW1TaOCAXIwggFuMA4GA1UdDwEB/wQEAwIDuDAdBgNVHSUEFjAUBggrBgEFBQcD\nAgYIKwYBBQUHAwEwDAYDVR0TAQH/BAIwADBoBgNVHQ4EYQRfN2Q6MDc6ODc6M2E6\nNDA6MTk6NDc6YzM6NWE6YzA6YmE6NjI6ZGY6YWY6NGI6ZDQ6MDU6MjU6NzY6M2Q6\nNWE6OGQ6MTY6OGQ6Njc6NWU6MmU6YTA6MzQ6N2Q6ZGM6ZmYwagYDVR0jBGMwYYBf\nZDE6MTE6MTE6YWM6MmE6YmE6OTc6YjI6M2Y6YWM6N2I6YmQ6ZGE6YmU6YjE6OGE6\nZmM6OWE6YmE6YjU6YmM6ODM6ZTc6NWU6NDE6NmY6ZjI6NzM6OTU6NTg6MGM6ZGIw\nWQYDVR0RBFIwUIZOc3BpZmZlOi8vMTExMTExMTEtMjIyMi0zMzMzLTQ0NDQtNTU1\nNTU1NTU1NTU1LmNvbnN1bC9ucy9kZWZhdWx0L2RjL2RjMS9zdmMvd2ViMAoGCCqG\nSM49BAMCA0gAMEUCIGC3TTvvjj76KMrguVyFf4tjOqaSCRie3nmHMRNNRav7AiEA\npY0heYeK9A6iOLrzqxSerkXXQyj5e9bE4VgUnxgPU6g=\n-----END CERTIFICATE-----\n" + }, + "privateKey": { + "inlineString": "-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEIMoTkpRggp3fqZzFKh82yS4LjtJI+XY+qX/7DefHFrtdoAoGCCqGSM49\nAwEHoUQDQgAEADPv1RHVNRfa2VKRAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Fav\nq5E0ivpNtv1QnFhxtPd7d5k4e+T7SkW1TQ==\n-----END EC PRIVATE KEY-----\n" + } + } + ], + "validationContext": { + "trustedCa": { + "inlineString": "-----BEGIN CERTIFICATE-----\nMIICXDCCAgKgAwIBAgIICpZq70Z9LyUwCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowFDESMBAG\nA1UEAxMJVGVzdCBDQSAyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEIhywH1gx\nAsMwuF3ukAI5YL2jFxH6Usnma1HFSfVyxbXX1/uoZEYrj8yCAtdU2yoHETyd+Zx2\nThhRLP79pYegCaOCATwwggE4MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTAD\nAQH/MGgGA1UdDgRhBF9kMToxMToxMTphYzoyYTpiYTo5NzpiMjozZjphYzo3Yjpi\nZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1ZTo0MTo2ZjpmMjo3\nMzo5NTo1ODowYzpkYjBqBgNVHSMEYzBhgF9kMToxMToxMTphYzoyYTpiYTo5Nzpi\nMjozZjphYzo3YjpiZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1\nZTo0MTo2ZjpmMjo3Mzo5NTo1ODowYzpkYjA/BgNVHREEODA2hjRzcGlmZmU6Ly8x\nMTExMTExMS0yMjIyLTMzMzMtNDQ0NC01NTU1NTU1NTU1NTUuY29uc3VsMAoGCCqG\nSM49BAMCA0gAMEUCICOY0i246rQHJt8o8Oya0D5PLL1FnmsQmQqIGCi31RwnAiEA\noR5f6Ku+cig2Il8T8LJujOp2/2A72QcHZA57B13y+8o=\n-----END CERTIFICATE-----\n" + }, + "matchSubjectAltNames": [ + { + "exact": "spiffe://11111111-2222-3333-4444-555555555555.consul/ns/default/dc/dc1/svc/service" + } + ] + } + }, + "sni": "service.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul" + } + } + } + ], + "typeUrl": "type.googleapis.com/envoy.config.cluster.v3.Cluster", + "nonce": "00000001" +} \ No newline at end of file diff --git a/agent/xds/testdata/endpoints/api-gateway-with-tcp-route-and-inline-certificate.latest.golden b/agent/xds/testdata/endpoints/api-gateway-with-tcp-route-and-inline-certificate.latest.golden new file mode 100644 index 00000000000..8504dae2b84 --- /dev/null +++ b/agent/xds/testdata/endpoints/api-gateway-with-tcp-route-and-inline-certificate.latest.golden @@ -0,0 +1,5 @@ +{ + "versionInfo": "00000001", + "typeUrl": "type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment", + "nonce": "00000001" +} \ No newline at end of file diff --git a/agent/xds/testdata/listeners/api-gateway-http-listener-with-http-route.latest.golden b/agent/xds/testdata/listeners/api-gateway-http-listener-with-http-route.latest.golden index 0bf31dc6624..e9bee988de9 100644 --- a/agent/xds/testdata/listeners/api-gateway-http-listener-with-http-route.latest.golden +++ b/agent/xds/testdata/listeners/api-gateway-http-listener-with-http-route.latest.golden @@ -1,49 +1,49 @@ { - "versionInfo": "00000001", - "resources": [ + "versionInfo": "00000001", + "resources": [ { - "@type": "type.googleapis.com/envoy.config.listener.v3.Listener", - "name": "http:1.2.3.4:8080", - "address": { - "socketAddress": { - "address": "1.2.3.4", - "portValue": 8080 + "@type": "type.googleapis.com/envoy.config.listener.v3.Listener", + "name": "http:1.2.3.4:8080", + "address": { + "socketAddress": { + "address": "1.2.3.4", + "portValue": 8080 } }, - "filterChains": [ + "filterChains": [ { - "filters": [ + "filters": [ { - "name": "envoy.filters.network.http_connection_manager", - "typedConfig": { - "@type": "type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager", - "statPrefix": "ingress_upstream_8080", - "rds": { - "configSource": { - "ads": {}, - "resourceApiVersion": "V3" + "name": "envoy.filters.network.http_connection_manager", + "typedConfig": { + "@type": "type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager", + "statPrefix": "ingress_upstream_8080", + "rds": { + "configSource": { + "ads": {}, + "resourceApiVersion": "V3" }, - "routeConfigName": "8080" + "routeConfigName": "8080" }, - "httpFilters": [ + "httpFilters": [ { - "name": "envoy.filters.http.router", - "typedConfig": { - "@type": "type.googleapis.com/envoy.extensions.filters.http.router.v3.Router" + "name": "envoy.filters.http.router", + "typedConfig": { + "@type": "type.googleapis.com/envoy.extensions.filters.http.router.v3.Router" } } ], - "tracing": { - "randomSampling": {} + "tracing": { + "randomSampling": {} } } } ] } ], - "trafficDirection": "OUTBOUND" + "trafficDirection": "OUTBOUND" } ], - "typeUrl": "type.googleapis.com/envoy.config.listener.v3.Listener", - "nonce": "00000001" + "typeUrl": "type.googleapis.com/envoy.config.listener.v3.Listener", + "nonce": "00000001" } \ No newline at end of file diff --git a/agent/xds/testdata/listeners/api-gateway-http-listener.latest.golden b/agent/xds/testdata/listeners/api-gateway-http-listener.latest.golden index 53b67bb3730..d2d839adf95 100644 --- a/agent/xds/testdata/listeners/api-gateway-http-listener.latest.golden +++ b/agent/xds/testdata/listeners/api-gateway-http-listener.latest.golden @@ -1,5 +1,5 @@ { - "versionInfo": "00000001", - "typeUrl": "type.googleapis.com/envoy.config.listener.v3.Listener", - "nonce": "00000001" + "versionInfo": "00000001", + "typeUrl": "type.googleapis.com/envoy.config.listener.v3.Listener", + "nonce": "00000001" } \ No newline at end of file diff --git a/agent/xds/testdata/listeners/api-gateway-nil-config-entry.latest.golden b/agent/xds/testdata/listeners/api-gateway-nil-config-entry.latest.golden index 53b67bb3730..d2d839adf95 100644 --- a/agent/xds/testdata/listeners/api-gateway-nil-config-entry.latest.golden +++ b/agent/xds/testdata/listeners/api-gateway-nil-config-entry.latest.golden @@ -1,5 +1,5 @@ { - "versionInfo": "00000001", - "typeUrl": "type.googleapis.com/envoy.config.listener.v3.Listener", - "nonce": "00000001" + "versionInfo": "00000001", + "typeUrl": "type.googleapis.com/envoy.config.listener.v3.Listener", + "nonce": "00000001" } \ No newline at end of file diff --git a/agent/xds/testdata/listeners/api-gateway-tcp-listener-with-tcp-and-http-route.latest.golden b/agent/xds/testdata/listeners/api-gateway-tcp-listener-with-tcp-and-http-route.latest.golden index 8da750a5929..9e136780767 100644 --- a/agent/xds/testdata/listeners/api-gateway-tcp-listener-with-tcp-and-http-route.latest.golden +++ b/agent/xds/testdata/listeners/api-gateway-tcp-listener-with-tcp-and-http-route.latest.golden @@ -1,74 +1,74 @@ { - "versionInfo": "00000001", - "resources": [ + "versionInfo": "00000001", + "resources": [ { - "@type": "type.googleapis.com/envoy.config.listener.v3.Listener", - "name": "http:1.2.3.4:8081", - "address": { - "socketAddress": { - "address": "1.2.3.4", - "portValue": 8081 + "@type": "type.googleapis.com/envoy.config.listener.v3.Listener", + "name": "http:1.2.3.4:8081", + "address": { + "socketAddress": { + "address": "1.2.3.4", + "portValue": 8081 } }, - "filterChains": [ + "filterChains": [ { - "filters": [ + "filters": [ { - "name": "envoy.filters.network.http_connection_manager", - "typedConfig": { - "@type": "type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager", - "statPrefix": "ingress_upstream_8081", - "rds": { - "configSource": { - "ads": {}, - "resourceApiVersion": "V3" + "name": "envoy.filters.network.http_connection_manager", + "typedConfig": { + "@type": "type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager", + "statPrefix": "ingress_upstream_8081", + "rds": { + "configSource": { + "ads": {}, + "resourceApiVersion": "V3" }, - "routeConfigName": "8081" + "routeConfigName": "8081" }, - "httpFilters": [ + "httpFilters": [ { - "name": "envoy.filters.http.router", - "typedConfig": { - "@type": "type.googleapis.com/envoy.extensions.filters.http.router.v3.Router" + "name": "envoy.filters.http.router", + "typedConfig": { + "@type": "type.googleapis.com/envoy.extensions.filters.http.router.v3.Router" } } ], - "tracing": { - "randomSampling": {} + "tracing": { + "randomSampling": {} } } } ] } ], - "trafficDirection": "OUTBOUND" + "trafficDirection": "OUTBOUND" }, { - "@type": "type.googleapis.com/envoy.config.listener.v3.Listener", - "name": "tcp-service:1.2.3.4:8080", - "address": { - "socketAddress": { - "address": "1.2.3.4", - "portValue": 8080 + "@type": "type.googleapis.com/envoy.config.listener.v3.Listener", + "name": "tcp-service:1.2.3.4:8080", + "address": { + "socketAddress": { + "address": "1.2.3.4", + "portValue": 8080 } }, - "filterChains": [ + "filterChains": [ { - "filters": [ + "filters": [ { - "name": "envoy.filters.network.tcp_proxy", - "typedConfig": { - "@type": "type.googleapis.com/envoy.extensions.filters.network.tcp_proxy.v3.TcpProxy", - "statPrefix": "upstream.tcp-service.default.default.dc1", - "cluster": "tcp-service.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul" + "name": "envoy.filters.network.tcp_proxy", + "typedConfig": { + "@type": "type.googleapis.com/envoy.extensions.filters.network.tcp_proxy.v3.TcpProxy", + "statPrefix": "upstream.tcp-service.default.default.dc1", + "cluster": "tcp-service.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul" } } ] } ], - "trafficDirection": "OUTBOUND" + "trafficDirection": "OUTBOUND" } ], - "typeUrl": "type.googleapis.com/envoy.config.listener.v3.Listener", - "nonce": "00000001" + "typeUrl": "type.googleapis.com/envoy.config.listener.v3.Listener", + "nonce": "00000001" } \ No newline at end of file diff --git a/agent/xds/testdata/listeners/api-gateway-tcp-listener-with-tcp-route.latest.golden b/agent/xds/testdata/listeners/api-gateway-tcp-listener-with-tcp-route.latest.golden index 12f6c29726d..ffcb5830b9a 100644 --- a/agent/xds/testdata/listeners/api-gateway-tcp-listener-with-tcp-route.latest.golden +++ b/agent/xds/testdata/listeners/api-gateway-tcp-listener-with-tcp-route.latest.golden @@ -1,32 +1,32 @@ { - "versionInfo": "00000001", - "resources": [ + "versionInfo": "00000001", + "resources": [ { - "@type": "type.googleapis.com/envoy.config.listener.v3.Listener", - "name": "tcp-service:1.2.3.4:8080", - "address": { - "socketAddress": { - "address": "1.2.3.4", - "portValue": 8080 + "@type": "type.googleapis.com/envoy.config.listener.v3.Listener", + "name": "tcp-service:1.2.3.4:8080", + "address": { + "socketAddress": { + "address": "1.2.3.4", + "portValue": 8080 } }, - "filterChains": [ + "filterChains": [ { - "filters": [ + "filters": [ { - "name": "envoy.filters.network.tcp_proxy", - "typedConfig": { - "@type": "type.googleapis.com/envoy.extensions.filters.network.tcp_proxy.v3.TcpProxy", - "statPrefix": "upstream.tcp-service.default.default.dc1", - "cluster": "tcp-service.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul" + "name": "envoy.filters.network.tcp_proxy", + "typedConfig": { + "@type": "type.googleapis.com/envoy.extensions.filters.network.tcp_proxy.v3.TcpProxy", + "statPrefix": "upstream.tcp-service.default.default.dc1", + "cluster": "tcp-service.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul" } } ] } ], - "trafficDirection": "OUTBOUND" + "trafficDirection": "OUTBOUND" } ], - "typeUrl": "type.googleapis.com/envoy.config.listener.v3.Listener", - "nonce": "00000001" + "typeUrl": "type.googleapis.com/envoy.config.listener.v3.Listener", + "nonce": "00000001" } \ No newline at end of file diff --git a/agent/xds/testdata/listeners/api-gateway-tcp-listener.latest.golden b/agent/xds/testdata/listeners/api-gateway-tcp-listener.latest.golden index 53b67bb3730..d2d839adf95 100644 --- a/agent/xds/testdata/listeners/api-gateway-tcp-listener.latest.golden +++ b/agent/xds/testdata/listeners/api-gateway-tcp-listener.latest.golden @@ -1,5 +1,5 @@ { - "versionInfo": "00000001", - "typeUrl": "type.googleapis.com/envoy.config.listener.v3.Listener", - "nonce": "00000001" + "versionInfo": "00000001", + "typeUrl": "type.googleapis.com/envoy.config.listener.v3.Listener", + "nonce": "00000001" } \ No newline at end of file diff --git a/agent/xds/testdata/listeners/api-gateway-with-tcp-route-and-inline-certificate.latest.golden b/agent/xds/testdata/listeners/api-gateway-with-tcp-route-and-inline-certificate.latest.golden new file mode 100644 index 00000000000..0287ebcc4a1 --- /dev/null +++ b/agent/xds/testdata/listeners/api-gateway-with-tcp-route-and-inline-certificate.latest.golden @@ -0,0 +1,60 @@ +{ + "versionInfo": "00000001", + "resources": [ + { + "@type": "type.googleapis.com/envoy.config.listener.v3.Listener", + "name": "service:1.2.3.4:8080", + "address": { + "socketAddress": { + "address": "1.2.3.4", + "portValue": 8080 + } + }, + "filterChains": [ + { + "filters": [ + { + "name": "envoy.filters.network.tcp_proxy", + "typedConfig": { + "@type": "type.googleapis.com/envoy.extensions.filters.network.tcp_proxy.v3.TcpProxy", + "statPrefix": "ingress_upstream_certificate", + "cluster": "service.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul" + } + } + ], + "transportSocket": { + "name": "tls", + "typedConfig": { + "@type": "type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.DownstreamTlsContext", + "commonTlsContext": { + "tlsParams": {}, + "tlsCertificates": [ + { + "certificateChain": { + "inlineString": "-----BEGIN CERTIFICATE-----\nMIICljCCAX4CCQCQMDsYO8FrPjANBgkqhkiG9w0BAQsFADANMQswCQYDVQQGEwJV\nUzAeFw0yMjEyMjAxNzUwMjVaFw0yNzEyMTkxNzUwMjVaMA0xCzAJBgNVBAYTAlVT\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx95Opa6t4lGEpiTUogEB\nptqOdam2ch4BHQGhNhX/MrDwwuZQhttBwMfngQ/wd9NmYEPAwj0dumUoAITIq6i2\njQlhqTodElkbsd5vWY8R/bxJWQSoNvVE12TlzECxGpJEiHt4W0r8pGffk+rvplji\nUyCfnT1kGF3znOSjK1hRMTn6RKWCyYaBvXQiB4SGilfLgJcEpOJKtISIxmZ+S409\ng9X5VU88/Bmmrz4cMyxce86Kc2ug5/MOv0CjWDJwlrv8njneV2zvraQ61DDwQftr\nXOvuCbO5IBRHMOBHiHTZ4rtGuhMaIr21V4vb6n8c4YzXiFvhUYcyX7rltGZzVd+W\nmQIDAQABMA0GCSqGSIb3DQEBCwUAA4IBAQBfCqoUIdPf/HGSbOorPyZWbyizNtHJ\nGL7x9cAeIYxpI5Y/WcO1o5v94lvrgm3FNfJoGKbV66+JxOge731FrfMpHplhar1Z\nRahYIzNLRBTLrwadLAZkApUpZvB8qDK4knsTWFYujNsylCww2A6ajzIMFNU4GkUK\nNtyHRuD+KYRmjXtyX1yHNqfGN3vOQmwavHq2R8wHYuBSc6LAHHV9vG+j0VsgMELO\nqwxn8SmLkSKbf2+MsQVzLCXXN5u+D8Yv+4py+oKP4EQ5aFZuDEx+r/G/31rTthww\nAAJAMaoXmoYVdgXV+CPuBb2M4XCpuzLu3bcA2PXm5ipSyIgntMKwXV7r\n-----END CERTIFICATE-----\n" + }, + "privateKey": { + "inlineString": "-----BEGIN RSA PRIVATE KEY-----\nMIIEowIBAAKCAQEAx95Opa6t4lGEpiTUogEBptqOdam2ch4BHQGhNhX/MrDwwuZQ\nhttBwMfngQ/wd9NmYEPAwj0dumUoAITIq6i2jQlhqTodElkbsd5vWY8R/bxJWQSo\nNvVE12TlzECxGpJEiHt4W0r8pGffk+rvpljiUyCfnT1kGF3znOSjK1hRMTn6RKWC\nyYaBvXQiB4SGilfLgJcEpOJKtISIxmZ+S409g9X5VU88/Bmmrz4cMyxce86Kc2ug\n5/MOv0CjWDJwlrv8njneV2zvraQ61DDwQftrXOvuCbO5IBRHMOBHiHTZ4rtGuhMa\nIr21V4vb6n8c4YzXiFvhUYcyX7rltGZzVd+WmQIDAQABAoIBACYvceUzp2MK4gYA\nGWPOP2uKbBdM0l+hHeNV0WAM+dHMfmMuL4pkT36ucqt0ySOLjw6rQyOZG5nmA6t9\nsv0g4ae2eCMlyDIeNi1Yavu4Wt6YX4cTXbQKThm83C6W2X9THKbauBbxD621bsDK\n7PhiGPN60yPue7YwFQAPqqD4YaK+s22HFIzk9gwM/rkvAUNwRv7SyHMiFe4Igc1C\nEev7iHWzvj5Heoz6XfF+XNF9DU+TieSUAdjd56VyUb8XL4+uBTOhHwLiXvAmfaMR\nHvpcxeKnYZusS6NaOxcUHiJnsLNWrxmJj9WEGgQzuLxcLjTe4vVmELVZD8t3QUKj\nPAxu8tUCgYEA7KIWVn9dfVpokReorFym+J8FzLwSktP9RZYEMonJo00i8aii3K9s\nu/aSwRWQSCzmON1ZcxZzWhwQF9usz6kGCk//9+4hlVW90GtNK0RD+j7sp4aT2JI8\n9eLEjTG+xSXa7XWe98QncjjL9lu/yrRncSTxHs13q/XP198nn2aYuQ8CgYEA2Dnt\nsRBzv0fFEvzzFv7G/5f85mouN38TUYvxNRTjBLCXl9DeKjDkOVZ2b6qlfQnYXIru\nH+W+v+AZEb6fySXc8FRab7lkgTMrwE+aeI4rkW7asVwtclv01QJ5wMnyT84AgDD/\nDgt/RThFaHgtU9TW5GOZveL+l9fVPn7vKFdTJdcCgYEArJ99zjHxwJ1whNAOk1av\n09UmRPm6TvRo4heTDk8oEoIWCNatoHI0z1YMLuENNSnT9Q280FFDayvnrY/qnD7A\nkktT/sjwJOG8q8trKzIMqQS4XWm2dxoPcIyyOBJfCbEY6XuRsUuePxwh5qF942EB\nyS9a2s6nC4Ix0lgPrqAIr48CgYBgS/Q6riwOXSU8nqCYdiEkBYlhCJrKpnJxF9T1\nofa0yPzKZP/8ZEfP7VzTwHjxJehQ1qLUW9pG08P2biH1UEKEWdzo8vT6wVJT1F/k\nHtTycR8+a+Hlk2SHVRHqNUYQGpuIe8mrdJ1as4Pd0d/F/P0zO9Rlh+mAsGPM8HUM\nT0+9gwKBgHDoerX7NTskg0H0t8O+iSMevdxpEWp34ZYa9gHiftTQGyrRgERCa7Gj\nnZPAxKb2JoWyfnu3v7G5gZ8fhDFsiOxLbZv6UZJBbUIh1MjJISpXrForDrC2QNLX\nkHrHfwBFDB3KMudhQknsJzEJKCL/KmFH6o0MvsoaT9yzEl3K+ah/\n-----END RSA PRIVATE KEY-----\n" + } + } + ] + }, + "requireClientCertificate": false + } + } + } + ], + "listenerFilters": [ + { + "name": "envoy.filters.listener.tls_inspector", + "typedConfig": { + "@type": "type.googleapis.com/envoy.extensions.filters.listener.tls_inspector.v3.TlsInspector" + } + } + ], + "trafficDirection": "OUTBOUND" + } + ], + "typeUrl": "type.googleapis.com/envoy.config.listener.v3.Listener", + "nonce": "00000001" +} \ No newline at end of file diff --git a/agent/xds/testdata/routes/api-gateway-with-tcp-route-and-inline-certificate.latest.golden b/agent/xds/testdata/routes/api-gateway-with-tcp-route-and-inline-certificate.latest.golden new file mode 100644 index 00000000000..9c050cbe6b4 --- /dev/null +++ b/agent/xds/testdata/routes/api-gateway-with-tcp-route-and-inline-certificate.latest.golden @@ -0,0 +1,5 @@ +{ + "versionInfo": "00000001", + "typeUrl": "type.googleapis.com/envoy.config.route.v3.RouteConfiguration", + "nonce": "00000001" +} \ No newline at end of file diff --git a/agent/xds/testdata/secrets/api-gateway-with-tcp-route-and-inline-certificate.latest.golden b/agent/xds/testdata/secrets/api-gateway-with-tcp-route-and-inline-certificate.latest.golden new file mode 100644 index 00000000000..95612291de7 --- /dev/null +++ b/agent/xds/testdata/secrets/api-gateway-with-tcp-route-and-inline-certificate.latest.golden @@ -0,0 +1,5 @@ +{ + "versionInfo": "00000001", + "typeUrl": "type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.Secret", + "nonce": "00000001" +} \ No newline at end of file diff --git a/agent/xds/testdata/secrets/connect-proxy-exported-to-peers.latest.golden b/agent/xds/testdata/secrets/connect-proxy-exported-to-peers.latest.golden new file mode 100644 index 00000000000..e6c25e165c6 --- /dev/null +++ b/agent/xds/testdata/secrets/connect-proxy-exported-to-peers.latest.golden @@ -0,0 +1,5 @@ +{ + "versionInfo": "00000001", + "typeUrl": "type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.Secret", + "nonce": "00000001" +} \ No newline at end of file diff --git a/agent/xds/testdata/secrets/connect-proxy-with-chain-and-failover-to-cluster-peer.latest.golden b/agent/xds/testdata/secrets/connect-proxy-with-chain-and-failover-to-cluster-peer.latest.golden new file mode 100644 index 00000000000..e6c25e165c6 --- /dev/null +++ b/agent/xds/testdata/secrets/connect-proxy-with-chain-and-failover-to-cluster-peer.latest.golden @@ -0,0 +1,5 @@ +{ + "versionInfo": "00000001", + "typeUrl": "type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.Secret", + "nonce": "00000001" +} \ No newline at end of file diff --git a/agent/xds/testdata/secrets/connect-proxy-with-chain-and-redirect-to-cluster-peer.latest.golden b/agent/xds/testdata/secrets/connect-proxy-with-chain-and-redirect-to-cluster-peer.latest.golden new file mode 100644 index 00000000000..e6c25e165c6 --- /dev/null +++ b/agent/xds/testdata/secrets/connect-proxy-with-chain-and-redirect-to-cluster-peer.latest.golden @@ -0,0 +1,5 @@ +{ + "versionInfo": "00000001", + "typeUrl": "type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.Secret", + "nonce": "00000001" +} \ No newline at end of file diff --git a/agent/xds/testdata/secrets/connect-proxy-with-peered-upstreams.latest.golden b/agent/xds/testdata/secrets/connect-proxy-with-peered-upstreams.latest.golden new file mode 100644 index 00000000000..e6c25e165c6 --- /dev/null +++ b/agent/xds/testdata/secrets/connect-proxy-with-peered-upstreams.latest.golden @@ -0,0 +1,5 @@ +{ + "versionInfo": "00000001", + "typeUrl": "type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.Secret", + "nonce": "00000001" +} \ No newline at end of file diff --git a/agent/xds/testdata/secrets/defaults.latest.golden b/agent/xds/testdata/secrets/defaults.latest.golden new file mode 100644 index 00000000000..e6c25e165c6 --- /dev/null +++ b/agent/xds/testdata/secrets/defaults.latest.golden @@ -0,0 +1,5 @@ +{ + "versionInfo": "00000001", + "typeUrl": "type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.Secret", + "nonce": "00000001" +} \ No newline at end of file diff --git a/agent/xds/testdata/secrets/local-mesh-gateway-with-peered-upstreams.latest.golden b/agent/xds/testdata/secrets/local-mesh-gateway-with-peered-upstreams.latest.golden new file mode 100644 index 00000000000..e6c25e165c6 --- /dev/null +++ b/agent/xds/testdata/secrets/local-mesh-gateway-with-peered-upstreams.latest.golden @@ -0,0 +1,5 @@ +{ + "versionInfo": "00000001", + "typeUrl": "type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.Secret", + "nonce": "00000001" +} \ No newline at end of file diff --git a/agent/xds/testdata/secrets/mesh-gateway-peering-control-plane.latest.golden b/agent/xds/testdata/secrets/mesh-gateway-peering-control-plane.latest.golden new file mode 100644 index 00000000000..e6c25e165c6 --- /dev/null +++ b/agent/xds/testdata/secrets/mesh-gateway-peering-control-plane.latest.golden @@ -0,0 +1,5 @@ +{ + "versionInfo": "00000001", + "typeUrl": "type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.Secret", + "nonce": "00000001" +} \ No newline at end of file diff --git a/agent/xds/testdata/secrets/mesh-gateway-with-exported-peered-services-http-with-router.latest.golden b/agent/xds/testdata/secrets/mesh-gateway-with-exported-peered-services-http-with-router.latest.golden new file mode 100644 index 00000000000..e6c25e165c6 --- /dev/null +++ b/agent/xds/testdata/secrets/mesh-gateway-with-exported-peered-services-http-with-router.latest.golden @@ -0,0 +1,5 @@ +{ + "versionInfo": "00000001", + "typeUrl": "type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.Secret", + "nonce": "00000001" +} \ No newline at end of file diff --git a/agent/xds/testdata/secrets/mesh-gateway-with-exported-peered-services-http.latest.golden b/agent/xds/testdata/secrets/mesh-gateway-with-exported-peered-services-http.latest.golden new file mode 100644 index 00000000000..e6c25e165c6 --- /dev/null +++ b/agent/xds/testdata/secrets/mesh-gateway-with-exported-peered-services-http.latest.golden @@ -0,0 +1,5 @@ +{ + "versionInfo": "00000001", + "typeUrl": "type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.Secret", + "nonce": "00000001" +} \ No newline at end of file diff --git a/agent/xds/testdata/secrets/mesh-gateway-with-exported-peered-services.latest.golden b/agent/xds/testdata/secrets/mesh-gateway-with-exported-peered-services.latest.golden new file mode 100644 index 00000000000..e6c25e165c6 --- /dev/null +++ b/agent/xds/testdata/secrets/mesh-gateway-with-exported-peered-services.latest.golden @@ -0,0 +1,5 @@ +{ + "versionInfo": "00000001", + "typeUrl": "type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.Secret", + "nonce": "00000001" +} \ No newline at end of file diff --git a/agent/xds/testdata/secrets/mesh-gateway-with-imported-peered-services.latest.golden b/agent/xds/testdata/secrets/mesh-gateway-with-imported-peered-services.latest.golden new file mode 100644 index 00000000000..e6c25e165c6 --- /dev/null +++ b/agent/xds/testdata/secrets/mesh-gateway-with-imported-peered-services.latest.golden @@ -0,0 +1,5 @@ +{ + "versionInfo": "00000001", + "typeUrl": "type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.Secret", + "nonce": "00000001" +} \ No newline at end of file diff --git a/agent/xds/testdata/secrets/mesh-gateway-with-peer-through-mesh-gateway-enabled.latest.golden b/agent/xds/testdata/secrets/mesh-gateway-with-peer-through-mesh-gateway-enabled.latest.golden new file mode 100644 index 00000000000..e6c25e165c6 --- /dev/null +++ b/agent/xds/testdata/secrets/mesh-gateway-with-peer-through-mesh-gateway-enabled.latest.golden @@ -0,0 +1,5 @@ +{ + "versionInfo": "00000001", + "typeUrl": "type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.Secret", + "nonce": "00000001" +} \ No newline at end of file diff --git a/agent/xds/testdata/secrets/transparent-proxy-destination-http.latest.golden b/agent/xds/testdata/secrets/transparent-proxy-destination-http.latest.golden new file mode 100644 index 00000000000..e6c25e165c6 --- /dev/null +++ b/agent/xds/testdata/secrets/transparent-proxy-destination-http.latest.golden @@ -0,0 +1,5 @@ +{ + "versionInfo": "00000001", + "typeUrl": "type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.Secret", + "nonce": "00000001" +} \ No newline at end of file diff --git a/agent/xds/testdata/secrets/transparent-proxy-destination.latest.golden b/agent/xds/testdata/secrets/transparent-proxy-destination.latest.golden new file mode 100644 index 00000000000..e6c25e165c6 --- /dev/null +++ b/agent/xds/testdata/secrets/transparent-proxy-destination.latest.golden @@ -0,0 +1,5 @@ +{ + "versionInfo": "00000001", + "typeUrl": "type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.Secret", + "nonce": "00000001" +} \ No newline at end of file diff --git a/agent/xds/testdata/secrets/transparent-proxy-terminating-gateway-destinations-only.latest.golden b/agent/xds/testdata/secrets/transparent-proxy-terminating-gateway-destinations-only.latest.golden new file mode 100644 index 00000000000..e6c25e165c6 --- /dev/null +++ b/agent/xds/testdata/secrets/transparent-proxy-terminating-gateway-destinations-only.latest.golden @@ -0,0 +1,5 @@ +{ + "versionInfo": "00000001", + "typeUrl": "type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.Secret", + "nonce": "00000001" +} \ No newline at end of file diff --git a/agent/xds/testdata/secrets/transparent-proxy-with-peered-upstreams.latest.golden b/agent/xds/testdata/secrets/transparent-proxy-with-peered-upstreams.latest.golden new file mode 100644 index 00000000000..e6c25e165c6 --- /dev/null +++ b/agent/xds/testdata/secrets/transparent-proxy-with-peered-upstreams.latest.golden @@ -0,0 +1,5 @@ +{ + "versionInfo": "00000001", + "typeUrl": "type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.Secret", + "nonce": "00000001" +} \ No newline at end of file diff --git a/agent/xds/testdata/secrets/transparent-proxy.latest.golden b/agent/xds/testdata/secrets/transparent-proxy.latest.golden new file mode 100644 index 00000000000..e6c25e165c6 --- /dev/null +++ b/agent/xds/testdata/secrets/transparent-proxy.latest.golden @@ -0,0 +1,5 @@ +{ + "versionInfo": "00000001", + "typeUrl": "type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.Secret", + "nonce": "00000001" +} \ No newline at end of file diff --git a/test/integration/connect/envoy/case-api-gateway-http-tls-overlapping-hosts/capture.sh b/test/integration/connect/envoy/case-api-gateway-http-tls-overlapping-hosts/capture.sh new file mode 100644 index 00000000000..8ba0e0ddabc --- /dev/null +++ b/test/integration/connect/envoy/case-api-gateway-http-tls-overlapping-hosts/capture.sh @@ -0,0 +1,3 @@ +#!/bin/bash + +snapshot_envoy_admin localhost:20000 api-gateway primary || true \ No newline at end of file diff --git a/test/integration/connect/envoy/case-api-gateway-http-tls-overlapping-hosts/service_gateway.hcl b/test/integration/connect/envoy/case-api-gateway-http-tls-overlapping-hosts/service_gateway.hcl new file mode 100644 index 00000000000..486c25c59e5 --- /dev/null +++ b/test/integration/connect/envoy/case-api-gateway-http-tls-overlapping-hosts/service_gateway.hcl @@ -0,0 +1,4 @@ +services { + name = "api-gateway" + kind = "api-gateway" +} diff --git a/test/integration/connect/envoy/case-api-gateway-http-tls-overlapping-hosts/setup.sh b/test/integration/connect/envoy/case-api-gateway-http-tls-overlapping-hosts/setup.sh new file mode 100644 index 00000000000..2b2cbd160fa --- /dev/null +++ b/test/integration/connect/envoy/case-api-gateway-http-tls-overlapping-hosts/setup.sh @@ -0,0 +1,287 @@ +#!/bin/bash + +set -euo pipefail + +upsert_config_entry primary ' +kind = "api-gateway" +name = "api-gateway" +listeners = [ + { + name = "listener-one" + port = 9999 + protocol = "http" + tls = { + certificates = [ + { + kind = "inline-certificate" + name = "host-consul-example" + } + ] + } + }, + { + name = "listener-two" + port = 9998 + protocol = "http" + tls = { + certificates = [ + { + kind = "inline-certificate" + name = "host-consul-example" + }, + { + kind = "inline-certificate" + name = "also-host-consul-example" + }, + { + kind = "inline-certificate" + name = "other-consul-example" + } + ] + } + } +] +' + +upsert_config_entry primary ' +kind = "inline-certificate" +name = "host-consul-example" +private_key = </dev/null) + + echo "WANT CN: ${CN} (SNI: ${SERVER_NAME})" + echo "GOT CERT:" + echo "$CERT" + + echo "$CERT" | grep "CN = ${CN}" +} + function assert_envoy_version { local ADMINPORT=$1 run retry_default curl -f -s localhost:$ADMINPORT/server_info From a8dc1083993588fb32b5fbf7ad0470a233907a9c Mon Sep 17 00:00:00 2001 From: David Yu Date: Fri, 17 Feb 2023 10:13:43 -0800 Subject: [PATCH 014/262] ISSUE_TEMPLATE: Update issue template to include ask for HCL config files for bugs (#16307) * Update bug_report.md --- .github/ISSUE_TEMPLATE/bug_report.md | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index c269a70a458..71813a02162 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -20,11 +20,18 @@ Steps to reproduce this issue, eg: ### Consul info for both Client and Server + + +
Client info ``` -output from client 'consul info' command here +Output from client 'consul info' command here +``` + +``` +Client agent HCL config ```
@@ -33,7 +40,11 @@ output from client 'consul info' command here Server info ``` -output from server 'consul info' command here +Output from server 'consul info' command here +``` + +``` +Server agent HCL config ``` From e4a992c58173ae52309b93ef23c85b3edd45a1e0 Mon Sep 17 00:00:00 2001 From: Andrew Stucki Date: Fri, 17 Feb 2023 13:18:11 -0500 Subject: [PATCH 015/262] Fix hostname alignment checks for HTTPRoutes (#16300) * Fix hostname alignment checks for HTTPRoutes --- agent/consul/discoverychain/gateway.go | 13 +- agent/consul/discoverychain/gateway_test.go | 3 + agent/consul/gateways/controller_gateways.go | 8 + agent/proxycfg/snapshot.go | 15 +- agent/structs/config_entry_gateways.go | 7 + agent/structs/config_entry_routes.go | 26 +++ .../capture.sh | 3 + .../service_gateway.hcl | 4 + .../case-api-gateway-http-hostnames/setup.sh | 156 ++++++++++++++++++ .../case-api-gateway-http-hostnames/vars.sh | 3 + .../verify.bats | 66 ++++++++ 11 files changed, 291 insertions(+), 13 deletions(-) create mode 100644 test/integration/connect/envoy/case-api-gateway-http-hostnames/capture.sh create mode 100644 test/integration/connect/envoy/case-api-gateway-http-hostnames/service_gateway.hcl create mode 100644 test/integration/connect/envoy/case-api-gateway-http-hostnames/setup.sh create mode 100644 test/integration/connect/envoy/case-api-gateway-http-hostnames/vars.sh create mode 100644 test/integration/connect/envoy/case-api-gateway-http-hostnames/verify.bats diff --git a/agent/consul/discoverychain/gateway.go b/agent/consul/discoverychain/gateway.go index cd582f1ec02..c9acdbbfda2 100644 --- a/agent/consul/discoverychain/gateway.go +++ b/agent/consul/discoverychain/gateway.go @@ -17,6 +17,7 @@ type GatewayChainSynthesizer struct { trustDomain string suffix string gateway *structs.APIGatewayConfigEntry + hostname string matchesByHostname map[string][]hostnameMatch tcpRoutes []structs.TCPRouteConfigEntry } @@ -44,17 +45,17 @@ func (l *GatewayChainSynthesizer) AddTCPRoute(route structs.TCPRouteConfigEntry) l.tcpRoutes = append(l.tcpRoutes, route) } +// SetHostname sets the base hostname for a listener that this is being synthesized for +func (l *GatewayChainSynthesizer) SetHostname(hostname string) { + l.hostname = hostname +} + // AddHTTPRoute takes a new route and flattens its rule matches out per hostname. // This is required since a single route can specify multiple hostnames, and a // single hostname can be specified in multiple routes. Routing for a given // hostname must behave based on the aggregate of all rules that apply to it. func (l *GatewayChainSynthesizer) AddHTTPRoute(route structs.HTTPRouteConfigEntry) { - hostnames := route.Hostnames - if len(route.Hostnames) == 0 { - // add a wildcard if there are no explicit hostnames set - hostnames = append(hostnames, "*") - } - + hostnames := route.FilteredHostnames(l.hostname) for _, host := range hostnames { matches, ok := l.matchesByHostname[host] if !ok { diff --git a/agent/consul/discoverychain/gateway_test.go b/agent/consul/discoverychain/gateway_test.go index 1d6ec78d24c..1c44f680b7c 100644 --- a/agent/consul/discoverychain/gateway_test.go +++ b/agent/consul/discoverychain/gateway_test.go @@ -459,6 +459,7 @@ func TestGatewayChainSynthesizer_AddHTTPRoute(t *testing.T) { gatewayChainSynthesizer := NewGatewayChainSynthesizer(datacenter, "domain", "suffix", gateway) + gatewayChainSynthesizer.SetHostname("*") gatewayChainSynthesizer.AddHTTPRoute(tc.route) require.Equal(t, tc.expectedMatchesByHostname, gatewayChainSynthesizer.matchesByHostname) @@ -621,6 +622,8 @@ func TestGatewayChainSynthesizer_Synthesize(t *testing.T) { for name, tc := range cases { t.Run(name, func(t *testing.T) { + tc.synthesizer.SetHostname("*") + for _, tcpRoute := range tc.tcpRoutes { tc.synthesizer.AddTCPRoute(*tcpRoute) } diff --git a/agent/consul/gateways/controller_gateways.go b/agent/consul/gateways/controller_gateways.go index 53d8c9a888c..f06b48581fa 100644 --- a/agent/consul/gateways/controller_gateways.go +++ b/agent/consul/gateways/controller_gateways.go @@ -701,6 +701,14 @@ func (g *gatewayMeta) bindRoute(listener *structs.APIGatewayListener, bound *str return false, nil } + if route, ok := route.(*structs.HTTPRouteConfigEntry); ok { + // check our hostnames + hostnames := route.FilteredHostnames(listener.GetHostname()) + if len(hostnames) == 0 { + return false, fmt.Errorf("failed to bind route to gateway %s: listener %s is does not have any hostnames that match the route", route.GetName(), g.Gateway.Name) + } + } + if listener.Protocol == route.GetProtocol() && bound.BindRoute(structs.ResourceReference{ Kind: route.GetKind(), Name: route.GetName(), diff --git a/agent/proxycfg/snapshot.go b/agent/proxycfg/snapshot.go index 6ce5a30083e..f60e62319e5 100644 --- a/agent/proxycfg/snapshot.go +++ b/agent/proxycfg/snapshot.go @@ -774,7 +774,7 @@ func (c *configSnapshotAPIGateway) ToIngress(datacenter string) (configSnapshotI } // Create a synthesized discovery chain for each service. - services, upstreams, compiled, err := c.synthesizeChains(datacenter, listener.Protocol, listener.Port, listener.Name, boundListener) + services, upstreams, compiled, err := c.synthesizeChains(datacenter, listener, boundListener) if err != nil { return configSnapshotIngressGateway{}, err } @@ -836,7 +836,7 @@ func (c *configSnapshotAPIGateway) ToIngress(datacenter string) (configSnapshotI }, nil } -func (c *configSnapshotAPIGateway) synthesizeChains(datacenter string, protocol structs.APIGatewayListenerProtocol, port int, name string, boundListener structs.BoundAPIGatewayListener) ([]structs.IngressService, structs.Upstreams, []*structs.CompiledDiscoveryChain, error) { +func (c *configSnapshotAPIGateway) synthesizeChains(datacenter string, listener structs.APIGatewayListener, boundListener structs.BoundAPIGatewayListener) ([]structs.IngressService, structs.Upstreams, []*structs.CompiledDiscoveryChain, error) { chains := []*structs.CompiledDiscoveryChain{} trustDomain := "" @@ -852,12 +852,13 @@ DOMAIN_LOOP: } } - synthesizer := discoverychain.NewGatewayChainSynthesizer(datacenter, trustDomain, name, c.GatewayConfig) + synthesizer := discoverychain.NewGatewayChainSynthesizer(datacenter, trustDomain, listener.Name, c.GatewayConfig) + synthesizer.SetHostname(listener.GetHostname()) for _, routeRef := range boundListener.Routes { switch routeRef.Kind { case structs.HTTPRoute: route, ok := c.HTTPRoutes.Get(routeRef) - if !ok || protocol != structs.ListenerProtocolHTTP { + if !ok || listener.Protocol != structs.ListenerProtocolHTTP { continue } synthesizer.AddHTTPRoute(*route) @@ -869,7 +870,7 @@ DOMAIN_LOOP: } case structs.TCPRoute: route, ok := c.TCPRoutes.Get(routeRef) - if !ok || protocol != structs.ListenerProtocolTCP { + if !ok || listener.Protocol != structs.ListenerProtocolTCP { continue } synthesizer.AddTCPRoute(*route) @@ -901,9 +902,9 @@ DOMAIN_LOOP: DestinationNamespace: service.NamespaceOrDefault(), DestinationPartition: service.PartitionOrDefault(), IngressHosts: service.Hosts, - LocalBindPort: port, + LocalBindPort: listener.Port, Config: map[string]interface{}{ - "protocol": string(protocol), + "protocol": string(listener.Protocol), }, }) } diff --git a/agent/structs/config_entry_gateways.go b/agent/structs/config_entry_gateways.go index 83bbcfb1595..7d4ffd4479d 100644 --- a/agent/structs/config_entry_gateways.go +++ b/agent/structs/config_entry_gateways.go @@ -897,6 +897,13 @@ type APIGatewayListener struct { TLS APIGatewayTLSConfiguration } +func (l APIGatewayListener) GetHostname() string { + if l.Hostname != "" { + return l.Hostname + } + return "*" +} + // APIGatewayTLSConfiguration specifies the configuration of a listener’s // TLS settings. type APIGatewayTLSConfiguration struct { diff --git a/agent/structs/config_entry_routes.go b/agent/structs/config_entry_routes.go index 7c959d79b0b..26e50b3f2d2 100644 --- a/agent/structs/config_entry_routes.go +++ b/agent/structs/config_entry_routes.go @@ -2,6 +2,7 @@ package structs import ( "fmt" + "strings" "github.com/hashicorp/consul/acl" ) @@ -121,6 +122,31 @@ func (e *HTTPRouteConfigEntry) GetRaftIndex() *RaftIndex { return &e.RaftIndex } +func (e *HTTPRouteConfigEntry) FilteredHostnames(listenerHostname string) []string { + if len(e.Hostnames) == 0 { + // we have no hostnames specified here, so treat it like a wildcard + return []string{listenerHostname} + } + + wildcardHostname := strings.ContainsRune(listenerHostname, '*') || listenerHostname == "*" + listenerHostname = strings.TrimPrefix(strings.TrimPrefix(listenerHostname, "*"), ".") + + hostnames := []string{} + for _, hostname := range e.Hostnames { + if wildcardHostname { + if strings.HasSuffix(hostname, listenerHostname) { + hostnames = append(hostnames, hostname) + } + continue + } + + if hostname == listenerHostname { + hostnames = append(hostnames, hostname) + } + } + return hostnames +} + // HTTPMatch specifies the criteria that should be // used in determining whether or not a request should // be routed to a given set of services. diff --git a/test/integration/connect/envoy/case-api-gateway-http-hostnames/capture.sh b/test/integration/connect/envoy/case-api-gateway-http-hostnames/capture.sh new file mode 100644 index 00000000000..8ba0e0ddabc --- /dev/null +++ b/test/integration/connect/envoy/case-api-gateway-http-hostnames/capture.sh @@ -0,0 +1,3 @@ +#!/bin/bash + +snapshot_envoy_admin localhost:20000 api-gateway primary || true \ No newline at end of file diff --git a/test/integration/connect/envoy/case-api-gateway-http-hostnames/service_gateway.hcl b/test/integration/connect/envoy/case-api-gateway-http-hostnames/service_gateway.hcl new file mode 100644 index 00000000000..486c25c59e5 --- /dev/null +++ b/test/integration/connect/envoy/case-api-gateway-http-hostnames/service_gateway.hcl @@ -0,0 +1,4 @@ +services { + name = "api-gateway" + kind = "api-gateway" +} diff --git a/test/integration/connect/envoy/case-api-gateway-http-hostnames/setup.sh b/test/integration/connect/envoy/case-api-gateway-http-hostnames/setup.sh new file mode 100644 index 00000000000..f4963a2a24f --- /dev/null +++ b/test/integration/connect/envoy/case-api-gateway-http-hostnames/setup.sh @@ -0,0 +1,156 @@ +#!/bin/bash + +set -euo pipefail + +upsert_config_entry primary ' +kind = "api-gateway" +name = "api-gateway" +listeners = [ + { + name = "listener-one" + port = 9999 + protocol = "http" + hostname = "*.consul.example" + }, + { + name = "listener-two" + port = 9998 + protocol = "http" + hostname = "foo.bar.baz" + }, + { + name = "listener-three" + port = 9997 + protocol = "http" + hostname = "*.consul.example" + }, + { + name = "listener-four" + port = 9996 + protocol = "http" + hostname = "*.consul.example" + }, + { + name = "listener-five" + port = 9995 + protocol = "http" + hostname = "foo.bar.baz" + } +] +' + +upsert_config_entry primary ' +Kind = "proxy-defaults" +Name = "global" +Config { + protocol = "http" +} +' + +upsert_config_entry primary ' +kind = "http-route" +name = "api-gateway-route-one" +hostnames = ["test.consul.example"] +rules = [ + { + services = [ + { + name = "s1" + } + ] + } +] +parents = [ + { + name = "api-gateway" + sectionName = "listener-one" + }, +] +' + +upsert_config_entry primary ' +kind = "http-route" +name = "api-gateway-route-two" +hostnames = ["foo.bar.baz"] +rules = [ + { + services = [ + { + name = "s1" + } + ] + } +] +parents = [ + { + name = "api-gateway" + sectionName = "listener-two" + }, +] +' + +upsert_config_entry primary ' +kind = "http-route" +name = "api-gateway-route-three" +hostnames = ["foo.bar.baz"] +rules = [ + { + services = [ + { + name = "s1" + } + ] + } +] +parents = [ + { + name = "api-gateway" + sectionName = "listener-three" + }, +] +' + +upsert_config_entry primary ' +kind = "http-route" +name = "api-gateway-route-four" +rules = [ + { + services = [ + { + name = "s1" + } + ] + } +] +parents = [ + { + name = "api-gateway" + sectionName = "listener-four" + }, +] +' + +upsert_config_entry primary ' +kind = "http-route" +name = "api-gateway-route-five" +rules = [ + { + services = [ + { + name = "s1" + } + ] + } +] +parents = [ + { + name = "api-gateway" + sectionName = "listener-five" + }, +] +' + +register_services primary + +gen_envoy_bootstrap api-gateway 20000 primary true +gen_envoy_bootstrap s1 19000 \ No newline at end of file diff --git a/test/integration/connect/envoy/case-api-gateway-http-hostnames/vars.sh b/test/integration/connect/envoy/case-api-gateway-http-hostnames/vars.sh new file mode 100644 index 00000000000..38a47d85278 --- /dev/null +++ b/test/integration/connect/envoy/case-api-gateway-http-hostnames/vars.sh @@ -0,0 +1,3 @@ +#!/bin/bash + +export REQUIRED_SERVICES="$DEFAULT_REQUIRED_SERVICES api-gateway-primary" diff --git a/test/integration/connect/envoy/case-api-gateway-http-hostnames/verify.bats b/test/integration/connect/envoy/case-api-gateway-http-hostnames/verify.bats new file mode 100644 index 00000000000..ba109ea6f9d --- /dev/null +++ b/test/integration/connect/envoy/case-api-gateway-http-hostnames/verify.bats @@ -0,0 +1,66 @@ +#!/usr/bin/env bats + +load helpers + +@test "api gateway proxy admin is up on :20000" { + retry_default curl -f -s localhost:20000/stats -o /dev/null +} + +@test "api gateway should have be accepted and not conflicted" { + assert_config_entry_status Accepted True Accepted primary api-gateway api-gateway + assert_config_entry_status Conflicted False NoConflict primary api-gateway api-gateway +} + +@test "api gateway should be bound to route one" { + assert_config_entry_status Bound True Bound primary http-route api-gateway-route-one + assert_upstream_has_endpoints_in_status 127.0.0.1:20000 s1 HEALTHY 1 +} + +@test "api gateway should be bound to route two" { + assert_config_entry_status Bound True Bound primary http-route api-gateway-route-two +} + +@test "api gateway should be unbound to route three" { + assert_config_entry_status Bound False FailedToBind primary http-route api-gateway-route-three +} + +@test "api gateway should be bound to route four" { + assert_config_entry_status Bound True Bound primary http-route api-gateway-route-four +} + +@test "api gateway should be bound to route five" { + assert_config_entry_status Bound True Bound primary http-route api-gateway-route-five +} + +@test "api gateway should be able to connect to s1 via route one with the proper host" { + run retry_long curl -H "Host: test.consul.example" -s -f -d hello localhost:9999 + [ "$status" -eq 0 ] + [[ "$output" == *"hello"* ]] +} + +@test "api gateway should not be able to connect to s1 via route one with a mismatched host" { + run retry_default sh -c "curl -H \"Host: foo.consul.example\" -sI -o /dev/null -w \"%{http_code}\" localhost:9999 | grep 404" + [ "$status" -eq 0 ] + [[ "$output" == "404" ]] +} + +@test "api gateway should be able to connect to s1 via route two with the proper host" { + run retry_long curl -H "Host: foo.bar.baz" -s -f -d hello localhost:9998 + [ "$status" -eq 0 ] + [[ "$output" == *"hello"* ]] +} + +@test "api gateway should be able to connect to s1 via route four with any subdomain of the listener host" { + run retry_long curl -H "Host: test.consul.example" -s -f -d hello localhost:9996 + [ "$status" -eq 0 ] + [[ "$output" == *"hello"* ]] + run retry_long curl -H "Host: foo.consul.example" -s -f -d hello localhost:9996 + [ "$status" -eq 0 ] + [[ "$output" == *"hello"* ]] +} + +@test "api gateway should be able to connect to s1 via route five with the proper host" { + run retry_long curl -H "Host: foo.bar.baz" -s -f -d hello localhost:9995 + [ "$status" -eq 0 ] + [[ "$output" == *"hello"* ]] +} \ No newline at end of file From ee99d5c3a0cd871ad11f5257b05d518b28d2fe64 Mon Sep 17 00:00:00 2001 From: Andrew Stucki Date: Fri, 17 Feb 2023 14:07:49 -0500 Subject: [PATCH 016/262] Fix panicky xDS test flakes (#16305) * Add defensive guard to make some tests less flaky and panic less * Do the actual fix --- agent/xds/testing.go | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/agent/xds/testing.go b/agent/xds/testing.go index 967a96e6acd..76cc53f49fd 100644 --- a/agent/xds/testing.go +++ b/agent/xds/testing.go @@ -85,6 +85,8 @@ type TestEnvoy struct { EnvoyVersion string deltaStream *TestADSDeltaStream // Incremental v3 + + closed bool } // NewTestEnvoy creates a TestEnvoy instance. @@ -225,9 +227,9 @@ func (e *TestEnvoy) Close() error { defer e.mu.Unlock() // unblock the recv chans to simulate recv errors when client disconnects - if e.deltaStream != nil && e.deltaStream.recvCh != nil { + if !e.closed && e.deltaStream.recvCh != nil { close(e.deltaStream.recvCh) - e.deltaStream = nil + e.closed = true } if e.cancel != nil { e.cancel() From 58801cc8aa87cc72e37b601070eca355ca1e58c2 Mon Sep 17 00:00:00 2001 From: Andrew Stucki Date: Fri, 17 Feb 2023 14:22:01 -0500 Subject: [PATCH 017/262] Add stricter validation and some normalization code for API Gateway ConfigEntries (#16304) * Add stricter validation and some normalization code for API Gateway ConfigEntries --- agent/structs/config_entry_gateways.go | 95 ++--- .../config_entry_inline_certificate.go | 17 + .../config_entry_inline_certificate_test.go | 96 ++++- agent/structs/config_entry_routes.go | 337 ++++++++++++------ agent/structs/config_entry_routes_test.go | 206 +++++++++++ api/config_entry_inline_certificate_test.go | 82 +++-- 6 files changed, 596 insertions(+), 237 deletions(-) diff --git a/agent/structs/config_entry_gateways.go b/agent/structs/config_entry_gateways.go index 7d4ffd4479d..0d4019896f3 100644 --- a/agent/structs/config_entry_gateways.go +++ b/agent/structs/config_entry_gateways.go @@ -713,6 +713,18 @@ type APIGatewayConfigEntry struct { RaftIndex } +func (e *APIGatewayConfigEntry) GetKind() string { return APIGateway } +func (e *APIGatewayConfigEntry) GetName() string { return e.Name } +func (e *APIGatewayConfigEntry) GetMeta() map[string]string { return e.Meta } +func (e *APIGatewayConfigEntry) GetRaftIndex() *RaftIndex { return &e.RaftIndex } +func (e *APIGatewayConfigEntry) GetEnterpriseMeta() *acl.EnterpriseMeta { return &e.EnterpriseMeta } + +var _ ControlledConfigEntry = (*APIGatewayConfigEntry)(nil) + +func (e *APIGatewayConfigEntry) GetStatus() Status { return e.Status } +func (e *APIGatewayConfigEntry) SetStatus(status Status) { e.Status = status } +func (e *APIGatewayConfigEntry) DefaultStatus() Status { return Status{} } + func (e *APIGatewayConfigEntry) ListenerIsReady(name string) bool { for _, condition := range e.Status.Conditions { if !condition.Resource.IsSame(&ResourceReference{ @@ -732,34 +744,28 @@ func (e *APIGatewayConfigEntry) ListenerIsReady(name string) bool { return true } -func (e *APIGatewayConfigEntry) GetKind() string { - return APIGateway -} - -func (e *APIGatewayConfigEntry) GetName() string { - if e == nil { - return "" - } - return e.Name -} - -func (e *APIGatewayConfigEntry) GetMeta() map[string]string { - if e == nil { - return nil - } - return e.Meta -} - func (e *APIGatewayConfigEntry) Normalize() error { for i, listener := range e.Listeners { protocol := strings.ToLower(string(listener.Protocol)) listener.Protocol = APIGatewayListenerProtocol(protocol) e.Listeners[i] = listener + + for i, cert := range listener.TLS.Certificates { + if cert.Kind == "" { + cert.Kind = InlineCertificate + } + listener.TLS.Certificates[i] = cert + } } + return nil } func (e *APIGatewayConfigEntry) Validate() error { + if err := validateConfigEntryMeta(e.Meta); err != nil { + return err + } + if err := e.validateListenerNames(); err != nil { return err } @@ -843,34 +849,6 @@ func (e *APIGatewayConfigEntry) CanWrite(authz acl.Authorizer) error { return authz.ToAllowAuthorizer().MeshWriteAllowed(&authzContext) } -func (e *APIGatewayConfigEntry) GetRaftIndex() *RaftIndex { - if e == nil { - return &RaftIndex{} - } - return &e.RaftIndex -} - -func (e *APIGatewayConfigEntry) GetEnterpriseMeta() *acl.EnterpriseMeta { - if e == nil { - return nil - } - return &e.EnterpriseMeta -} - -var _ ControlledConfigEntry = (*APIGatewayConfigEntry)(nil) - -func (e *APIGatewayConfigEntry) GetStatus() Status { - return e.Status -} - -func (e *APIGatewayConfigEntry) SetStatus(status Status) { - e.Status = status -} - -func (e *APIGatewayConfigEntry) DefaultStatus() Status { - return Status{} -} - // APIGatewayListenerProtocol is the protocol that an APIGateway listener uses type APIGatewayListenerProtocol string @@ -991,27 +969,10 @@ func (e *BoundAPIGatewayConfigEntry) IsInitializedForGateway(gateway *APIGateway return true } -func (e *BoundAPIGatewayConfigEntry) GetKind() string { - return BoundAPIGateway -} - -func (e *BoundAPIGatewayConfigEntry) GetName() string { - if e == nil { - return "" - } - return e.Name -} - -func (e *BoundAPIGatewayConfigEntry) GetMeta() map[string]string { - if e == nil { - return nil - } - return e.Meta -} - -func (e *BoundAPIGatewayConfigEntry) Normalize() error { - return nil -} +func (e *BoundAPIGatewayConfigEntry) GetKind() string { return BoundAPIGateway } +func (e *BoundAPIGatewayConfigEntry) GetName() string { return e.Name } +func (e *BoundAPIGatewayConfigEntry) GetMeta() map[string]string { return e.Meta } +func (e *BoundAPIGatewayConfigEntry) Normalize() error { return nil } func (e *BoundAPIGatewayConfigEntry) Validate() error { allowedCertificateKinds := map[string]bool{ diff --git a/agent/structs/config_entry_inline_certificate.go b/agent/structs/config_entry_inline_certificate.go index 18e3c7716db..bdbcbc6ae05 100644 --- a/agent/structs/config_entry_inline_certificate.go +++ b/agent/structs/config_entry_inline_certificate.go @@ -8,6 +8,7 @@ import ( "fmt" "github.com/hashicorp/consul/acl" + "github.com/miekg/dns" ) // InlineCertificateConfigEntry manages the configuration for an inline certificate @@ -39,6 +40,10 @@ func (e *InlineCertificateConfigEntry) GetEnterpriseMeta() *acl.EnterpriseMeta { func (e *InlineCertificateConfigEntry) GetRaftIndex() *RaftIndex { return &e.RaftIndex } func (e *InlineCertificateConfigEntry) Validate() error { + if err := validateConfigEntryMeta(e.Meta); err != nil { + return err + } + privateKeyBlock, _ := pem.Decode([]byte(e.PrivateKey)) if privateKeyBlock == nil { return errors.New("failed to parse private key PEM") @@ -61,6 +66,18 @@ func (e *InlineCertificateConfigEntry) Validate() error { return err } + // validate that each host referenced in the CN, DNSSans, and IPSans + // are valid hostnames + hosts, err := e.Hosts() + if err != nil { + return err + } + for _, host := range hosts { + if _, ok := dns.IsDomainName(host); !ok { + return fmt.Errorf("host %q must be a valid DNS hostname", host) + } + } + return nil } diff --git a/agent/structs/config_entry_inline_certificate_test.go b/agent/structs/config_entry_inline_certificate_test.go index 3e9d84e4f4b..db46ca92a7d 100644 --- a/agent/structs/config_entry_inline_certificate_test.go +++ b/agent/structs/config_entry_inline_certificate_test.go @@ -5,6 +5,73 @@ import "testing" const ( // generated via openssl req -x509 -sha256 -days 1825 -newkey rsa:2048 -keyout private.key -out certificate.crt validPrivateKey = `-----BEGIN RSA PRIVATE KEY----- +MIIEpAIBAAKCAQEA0wzZeonUklhOvJ0AxcdDdCTiMwR9tsm/6IGcw9Jm50xVY+qg +5GFg1RWrQaODq7Gjqd/JDUAwtTBnQMs1yt6nbsHe2QhbD4XeqtZ+6fTv1ZpG3k8F +eB/M01xFqovczRV/ie77wd4vqoPD+AcfD8NDAFJt3htwUgGIqkQHP329Sh3TtLga +9ZMCs1MoTT+POYGUPL8bwt9R6ClNrucbH4Bs6OnX2ZFbKF75O9OHKNxWTmpDSodv +OFbFyKps3BfnPuF0Z6mj5M5yZeCjmtfS25PrsM3pMBGK5YHb0MlFfZIrIGboMbrz +9F/BMQJ64pMe43KwqHvTnbKWhp6PzLhEkPGLnwIDAQABAoIBADBEJAiONPszDu67 +yU1yAM8zEDgysr127liyK7PtDnOfVXgAVMNmMcsJpZzhVF+TxKY487YAFCOb6kE7 +OBYpTYla9SgVbR3js8TGQUgoKCFlowd8cvfB7gn4dEZIrjqIzB4zdYgk1Cne8JZs +qoHkWhJcx5ugEtPuXd7yp+WxT/T+6uOro06scp67NhP5t9yoAGFv5Vdb577RuzRo +Wkd9higQ9A20+GtjCY0EYxdgRviWvW7mM5/F+Lzcaui86ME+ga754gX8zgW3+NJ5 +LMsz5OLSnh291Uyjmr77HWBv/xvpq01Fls0LyJcgxFVZuJs5GQz+l3otSqv4FTP6 +Ua9w/YECgYEA8To3dgUK1QhzX5rwhWtlst3pItGTvmEdNzXmjgSylu7uKM13i+xg +llhp2uXrOEtuL+xtBZdeFNaijusbyqjg0xj6e4o31c19okuuDkJD5/sfQq22bvrn +gVJMGuESprIiPePrEyrXCHOdxH6eDgR2dIzAeO5vz0nnKGFAWrJJbvECgYEA3/mJ +eacXOJznw4Sa8jGWS2FtZLKxDHph7uDKMJmuG0ukb3aHJ9dMHrPleCLo8mhpoObA +hueoIbIP7swGrQx79+nZbnQpF6rMp6FAU5bF3gSrj1eWbaeh8pn9mrv4hal9USmn +orTbXMxDp3XSh7voR8Fqy5tMQqwZ+Lz74ccbw48CgYEA5cEhGdNrocPOv3x/IVRN +JLOfXX5nTaiJfxBja1imEIO5ajtoZWjaBdhn2gmqo4+UfyicHfsxrH9RjPX5HmkC +2Yys5gWbcJOr2Wxjd0k+DDFucL+rRsDKxq1vtxov/X0kh/YQ68ydynr0BTbjq04s +1I1KtOPEspYdCKS3+qpcrsECgYBtvYeVesBO9do9G0kMKC26y4bdEwzaz1ASykNn +IrWDHEH6dznr1HqwhHaHsZsvwucWdlmZAAKKWAOkfoU63uYS55qomvPTa9WQwNqS +2koi6Wjh+Al1uvAHvVncKgOwAgar8Nv5ReJBirgPYhSAexpppiRclL/93vNuw7Iq +wvMgkwKBgQC5wnb6SUUrzzKKSRgyusHM/XrjiKgVKq7lvFE9/iJkcw+BEXpjjbEe +RyD0a7PRtCfR39SMVrZp4KXVNNK5ln0WhuLvraMDwOpH9JDWHQiAhuJ3ooSwBylK ++QCLjyOtWAGZAIBRJyb1txfTXZ++dldkOjBi3bmEiadOa48ksvDsNQ== +-----END RSA PRIVATE KEY-----` + validCertificate = `-----BEGIN CERTIFICATE----- +MIIDQjCCAioCCQC6cMRYsE+ahDANBgkqhkiG9w0BAQsFADBjMQswCQYDVQQGEwJV +UzELMAkGA1UECAwCQ0ExCzAJBgNVBAcMAkxBMQ0wCwYDVQQKDARUZXN0MQ0wCwYD +VQQLDARTdHViMRwwGgYDVQQDDBNob3N0LmNvbnN1bC5leGFtcGxlMB4XDTIzMDIx +NzAyMTA1MloXDTI4MDIxNjAyMTA1MlowYzELMAkGA1UEBhMCVVMxCzAJBgNVBAgM +AkNBMQswCQYDVQQHDAJMQTENMAsGA1UECgwEVGVzdDENMAsGA1UECwwEU3R1YjEc +MBoGA1UEAwwTaG9zdC5jb25zdWwuZXhhbXBsZTCCASIwDQYJKoZIhvcNAQEBBQAD +ggEPADCCAQoCggEBANMM2XqJ1JJYTrydAMXHQ3Qk4jMEfbbJv+iBnMPSZudMVWPq +oORhYNUVq0Gjg6uxo6nfyQ1AMLUwZ0DLNcrep27B3tkIWw+F3qrWfun079WaRt5P +BXgfzNNcRaqL3M0Vf4nu+8HeL6qDw/gHHw/DQwBSbd4bcFIBiKpEBz99vUod07S4 +GvWTArNTKE0/jzmBlDy/G8LfUegpTa7nGx+AbOjp19mRWyhe+TvThyjcVk5qQ0qH +bzhWxciqbNwX5z7hdGepo+TOcmXgo5rX0tuT67DN6TARiuWB29DJRX2SKyBm6DG6 +8/RfwTECeuKTHuNysKh7052yloaej8y4RJDxi58CAwEAATANBgkqhkiG9w0BAQsF +AAOCAQEAHF10odRNJ7TKvcD2JPtR8wMacfldSiPcQnn+rhMUyBaKOoSrALxOev+N +L8N+RtEV+KXkyBkvT71OZzEpY9ROwqOQ/acnMdbfG0IBPbg3c/7WDD2sjcdr1zvc +U3T7WJ7G3guZ5aWCuAGgOyT6ZW8nrDa4yFbKZ1PCJkvUQ2ttO1lXmyGPM533Y2pi +SeXP6LL7z5VNqYO3oz5IJEstt10IKxdmb2gKFhHjgEmHN2gFL0jaPi4mjjaINrxq +MdqcM9IzLr26AjZ45NuI9BCcZWO1mraaQTOIb3QL5LyqaC7CRJXLYPSGARthyDhq +J3TrQE3YVrL4D9xnklT86WDnZKApJg== +-----END CERTIFICATE-----` + mismatchedCertificate = `-----BEGIN CERTIFICATE----- +MIIDQjCCAioCCQC2H6+PYz23xDANBgkqhkiG9w0BAQsFADBjMQswCQYDVQQGEwJV +UzELMAkGA1UECAwCQ0ExCzAJBgNVBAcMAkxBMQ0wCwYDVQQKDARUZXN0MQwwCgYD +VQQLDANGb28xHTAbBgNVBAMMFG90aGVyLmNvbnN1bC5leGFtcGxlMB4XDTIzMDIx +NzAyMTM0OVoXDTI4MDIxNjAyMTM0OVowYzELMAkGA1UEBhMCVVMxCzAJBgNVBAgM +AkNBMQswCQYDVQQHDAJMQTENMAsGA1UECgwEVGVzdDEMMAoGA1UECwwDRm9vMR0w +GwYDVQQDDBRvdGhlci5jb25zdWwuZXhhbXBsZTCCASIwDQYJKoZIhvcNAQEBBQAD +ggEPADCCAQoCggEBAO0IH/dzmWJaTPVL32xQVHivrnQk38vskW0ymILYuaismUMJ +0+xrcaTcVljU+3nKhmSW9wcYSFY02GcGWAdcw8x8xO801cna020T+DIWiYaljXT3 +agrbYfULF9q+ihT6IL1D2mFa0AW1x6Bk1XAmZRSTpRBhp7iFNnCXGRK8sSSr95ge +DxaRyj/2F8t6kG+ANPkRBiPd2rRgsYQjuTLuZYBvseeJygnSF8ty1QMg6koz7kdN +bPon3Q5GFH71WNwzm9G3DWjMIu+dhpHz7rsbCnhwLB5lh1jsZBYkAMt3kiyY0g4I +ReuiVWesMe+AMG/DQZvZ5mE252QFJ92dLTeo5RcCAwEAATANBgkqhkiG9w0BAQsF +AAOCAQEAijm6blixjl+pMRAj7EajoPjU+GqhooZayJrvdwvofwcPxQYpkPuh7Uc6 +l2z494b75cRzMw7wS+iW/ad8NYrfw1JwHMsUfncxs5LDO5GsKl9Krg/39goDl3wC +ywTcl00y+FMYfldNPjKDLunENmn+yPa2pKuBVQ0yOKALp+oUeJFVzRNPV5fohlBi +HjypkO0KaVmCG6P01cqCgVkNzxnX9qQYP3YXX1yt5iOcI7QcoOa5WnRhOuD8WqJ1 +v3AZGYNvKyXf9E5nD0y2Cmz6t1awjFjzMlXMx6AdHrjWqxtHhYQ1xz4P4NfzK27m +cCtURSzXMgcrSeZLepBfdICf+0/0+Q== +-----END CERTIFICATE-----` + emptyCNPrivateKey = `-----BEGIN RSA PRIVATE KEY----- MIIEowIBAAKCAQEAx95Opa6t4lGEpiTUogEBptqOdam2ch4BHQGhNhX/MrDwwuZQ httBwMfngQ/wd9NmYEPAwj0dumUoAITIq6i2jQlhqTodElkbsd5vWY8R/bxJWQSo NvVE12TlzECxGpJEiHt4W0r8pGffk+rvpljiUyCfnT1kGF3znOSjK1hRMTn6RKWC @@ -31,7 +98,7 @@ T0+9gwKBgHDoerX7NTskg0H0t8O+iSMevdxpEWp34ZYa9gHiftTQGyrRgERCa7Gj nZPAxKb2JoWyfnu3v7G5gZ8fhDFsiOxLbZv6UZJBbUIh1MjJISpXrForDrC2QNLX kHrHfwBFDB3KMudhQknsJzEJKCL/KmFH6o0MvsoaT9yzEl3K+ah/ -----END RSA PRIVATE KEY-----` - validCertificate = `-----BEGIN CERTIFICATE----- + emptyCNCertificate = `-----BEGIN CERTIFICATE----- MIICljCCAX4CCQCQMDsYO8FrPjANBgkqhkiG9w0BAQsFADANMQswCQYDVQQGEwJV UzAeFw0yMjEyMjAxNzUwMjVaFw0yNzEyMTkxNzUwMjVaMA0xCzAJBgNVBAYTAlVT MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx95Opa6t4lGEpiTUogEB @@ -46,26 +113,12 @@ RahYIzNLRBTLrwadLAZkApUpZvB8qDK4knsTWFYujNsylCww2A6ajzIMFNU4GkUK NtyHRuD+KYRmjXtyX1yHNqfGN3vOQmwavHq2R8wHYuBSc6LAHHV9vG+j0VsgMELO qwxn8SmLkSKbf2+MsQVzLCXXN5u+D8Yv+4py+oKP4EQ5aFZuDEx+r/G/31rTthww AAJAMaoXmoYVdgXV+CPuBb2M4XCpuzLu3bcA2PXm5ipSyIgntMKwXV7r ------END CERTIFICATE-----` - mismatchedCertificate = `-----BEGIN CERTIFICATE----- -MIICljCCAX4CCQC49bq8e0QgLDANBgkqhkiG9w0BAQsFADANMQswCQYDVQQGEwJV -UzAeFw0yMjEyMjAxNzUyMzJaFw0yNzEyMTkxNzUyMzJaMA0xCzAJBgNVBAYTAlVT -MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAk7Are9ulVDY0IqaG5Pt/ -OVuS0kmDhgVUfQBM5JDGRfIsu1ebn68kn5JGCTQ+nC8nU9QXRJS7vG6As5GWm08W -FpkOyIbHLjOhWtYCYzQ+0R+sSSoMnczgl8l6wIUIkR3Vpoy6QUsSZbvo4/xDi3Uk -1CF+JMTM2oFDLD8PNrNzW/txRyTugK36W1G1ofUhvP6EHsTjmVcZwBcLOKToov6L -Ai758MLztl1/X/90DNdZwuHC9fGIgx52Ojz3+XIocXFttr+J8xZglMCtqL4n40bh -5b1DE+hC3NHQmA+7Chc99z28baj2cU1woNk/TO+ewqpyvj+WPWwGOQt3U63ZoPaw -yQIDAQABMA0GCSqGSIb3DQEBCwUAA4IBAQCMF3JlrDdcSv2KYrxEp1tWB/GglI8a -JiSvrf3hePaRz59099bg4DoHzTn0ptOcOPOO9epDPbCJrUqLuPlwvrQRvll6GaW1 -y3TcbnE1AbwTAjbOTgpLhvuj6IVlyNNLoKbjZqs4A8N8i6UkQ7Y8qg77lwxD3QoH -pWLwGZKJifKPa7ObVWmKj727kbU59nA2Hx+Y4qa/MyiPWxJM9Y0JsFGxSBxp4kmQ -q4ikzSWaPv/TvtV+d4mO1H44aggdNMCYIQd/5BXQzG40l+ecHnBueJyG312ax/Zp -NsYUAKQT864cGlxrnWVgT4sW/tsl9Qen7g9iAdeBAPvLO7cQjAjtc7KZ -----END CERTIFICATE-----` ) func TestInlineCertificate(t *testing.T) { + t.Parallel() + cases := map[string]configEntryTestcase{ "invalid private key": { entry: &InlineCertificateConfigEntry{ @@ -101,6 +154,15 @@ func TestInlineCertificate(t *testing.T) { Certificate: validCertificate, }, }, + "empty cn certificate": { + entry: &InlineCertificateConfigEntry{ + Kind: InlineCertificate, + Name: "cert-five", + PrivateKey: emptyCNPrivateKey, + Certificate: emptyCNCertificate, + }, + validateErr: "host \"\" must be a valid DNS hostname", + }, } testConfigEntryNormalizeAndValidate(t, cases) } diff --git a/agent/structs/config_entry_routes.go b/agent/structs/config_entry_routes.go index 26e50b3f2d2..027c8f7f7e7 100644 --- a/agent/structs/config_entry_routes.go +++ b/agent/structs/config_entry_routes.go @@ -5,6 +5,7 @@ import ( "strings" "github.com/hashicorp/consul/acl" + "github.com/miekg/dns" ) // BoundRoute indicates a route that has parent gateways which @@ -41,15 +42,22 @@ type HTTPRouteConfigEntry struct { RaftIndex } -func (e *HTTPRouteConfigEntry) GetServices() []HTTPService { - targets := []HTTPService{} - for _, rule := range e.Rules { - for _, service := range rule.Services { - targets = append(targets, service) - } - } - return targets -} +func (e *HTTPRouteConfigEntry) GetKind() string { return HTTPRoute } +func (e *HTTPRouteConfigEntry) GetName() string { return e.Name } +func (e *HTTPRouteConfigEntry) GetMeta() map[string]string { return e.Meta } +func (e *HTTPRouteConfigEntry) GetEnterpriseMeta() *acl.EnterpriseMeta { return &e.EnterpriseMeta } +func (e *HTTPRouteConfigEntry) GetRaftIndex() *RaftIndex { return &e.RaftIndex } + +var _ ControlledConfigEntry = (*HTTPRouteConfigEntry)(nil) + +func (e *HTTPRouteConfigEntry) GetStatus() Status { return e.Status } +func (e *HTTPRouteConfigEntry) SetStatus(status Status) { e.Status = status } +func (e *HTTPRouteConfigEntry) DefaultStatus() Status { return Status{} } + +var _ BoundRoute = (*HTTPRouteConfigEntry)(nil) + +func (e *HTTPRouteConfigEntry) GetParents() []ResourceReference { return e.Parents } +func (e *HTTPRouteConfigEntry) GetProtocol() APIGatewayListenerProtocol { return ListenerProtocolHTTP } func (e *HTTPRouteConfigEntry) GetServiceNames() []ServiceName { services := []ServiceName{} @@ -59,67 +67,219 @@ func (e *HTTPRouteConfigEntry) GetServiceNames() []ServiceName { return services } -func (e *HTTPRouteConfigEntry) GetKind() string { - return HTTPRoute +func (e *HTTPRouteConfigEntry) GetServices() []HTTPService { + targets := []HTTPService{} + for _, rule := range e.Rules { + targets = append(targets, rule.Services...) + } + return targets } -func (e *HTTPRouteConfigEntry) GetName() string { - if e == nil { - return "" +func (e *HTTPRouteConfigEntry) Normalize() error { + for i, parent := range e.Parents { + if parent.Kind == "" { + parent.Kind = APIGateway + e.Parents[i] = parent + } + } + + for i, rule := range e.Rules { + for j, match := range rule.Matches { + rule.Matches[j] = normalizeHTTPMatch(match) + } + e.Rules[i] = rule } - return e.Name + + return nil } -func (e *HTTPRouteConfigEntry) GetParents() []ResourceReference { - if e == nil { - return []ResourceReference{} +func normalizeHTTPMatch(match HTTPMatch) HTTPMatch { + method := string(match.Method) + method = strings.ToUpper(method) + match.Method = HTTPMatchMethod(method) + + pathMatch := match.Path.Match + if string(pathMatch) == "" { + match.Path.Match = HTTPPathMatchPrefix + match.Path.Value = "/" } - return e.Parents + + return match } -func (e *HTTPRouteConfigEntry) GetProtocol() APIGatewayListenerProtocol { - return ListenerProtocolHTTP +func (e *HTTPRouteConfigEntry) Validate() error { + for _, host := range e.Hostnames { + // validate that each host referenced in a valid dns name and has + // no wildcards in it + if _, ok := dns.IsDomainName(host); !ok { + return fmt.Errorf("host %q must be a valid DNS hostname", host) + } + + if strings.ContainsRune(host, '*') { + return fmt.Errorf("host %q must not be a wildcard", host) + } + } + + validParentKinds := map[string]bool{ + APIGateway: true, + } + + for _, parent := range e.Parents { + if !validParentKinds[parent.Kind] { + return fmt.Errorf("unsupported parent kind: %q, must be 'api-gateway'", parent.Kind) + } + } + + if err := validateConfigEntryMeta(e.Meta); err != nil { + return err + } + + for i, rule := range e.Rules { + if err := validateRule(rule); err != nil { + return fmt.Errorf("Rule[%d], %w", i, err) + } + } + + return nil } -func (e *HTTPRouteConfigEntry) Normalize() error { +func validateRule(rule HTTPRouteRule) error { + if err := validateFilters(rule.Filters); err != nil { + return err + } + + for i, match := range rule.Matches { + if err := validateMatch(match); err != nil { + return fmt.Errorf("Match[%d], %w", i, err) + } + } + + for i, service := range rule.Services { + if err := validateHTTPService(service); err != nil { + return fmt.Errorf("Service[%d], %w", i, err) + } + } + return nil } -func (e *HTTPRouteConfigEntry) Validate() error { +func validateMatch(match HTTPMatch) error { + if match.Method != HTTPMatchMethodAll { + if !isValidHTTPMethod(string(match.Method)) { + return fmt.Errorf("Method contains an invalid method %q", match.Method) + } + } + + for i, query := range match.Query { + if err := validateHTTPQueryMatch(query); err != nil { + return fmt.Errorf("Query[%d], %w", i, err) + } + } + + for i, header := range match.Headers { + if err := validateHTTPHeaderMatch(header); err != nil { + return fmt.Errorf("Headers[%d], %w", i, err) + } + } + + if err := validateHTTPPathMatch(match.Path); err != nil { + return fmt.Errorf("Path, %w", err) + } + return nil } -func (e *HTTPRouteConfigEntry) CanRead(authz acl.Authorizer) error { - var authzContext acl.AuthorizerContext - e.FillAuthzContext(&authzContext) - return authz.ToAllowAuthorizer().MeshReadAllowed(&authzContext) +func validateHTTPService(service HTTPService) error { + return validateFilters(service.Filters) } -func (e *HTTPRouteConfigEntry) CanWrite(authz acl.Authorizer) error { - var authzContext acl.AuthorizerContext - e.FillAuthzContext(&authzContext) - return authz.ToAllowAuthorizer().MeshWriteAllowed(&authzContext) +func validateFilters(filter HTTPFilters) error { + for i, header := range filter.Headers { + if err := validateHeaderFilter(header); err != nil { + return fmt.Errorf("HTTPFilters, Headers[%d], %w", i, err) + } + } + + for i, rewrite := range filter.URLRewrites { + if err := validateURLRewrite(rewrite); err != nil { + return fmt.Errorf("HTTPFilters, URLRewrite[%d], %w", i, err) + } + } + + return nil +} + +func validateURLRewrite(rewrite URLRewrite) error { + // TODO: we don't really have validation of the actual params + // passed as "PrefixRewrite" in our discoverychain config + // entries, figure out if we should have something here + return nil +} + +func validateHeaderFilter(filter HTTPHeaderFilter) error { + // TODO: we don't really have validation of the values + // passed as header modifiers in our current discoverychain + // config entries, figure out if we need to + return nil } -func (e *HTTPRouteConfigEntry) GetMeta() map[string]string { - if e == nil { +func validateHTTPQueryMatch(query HTTPQueryMatch) error { + if query.Name == "" { + return fmt.Errorf("missing required Name field") + } + + switch query.Match { + case HTTPQueryMatchExact, + HTTPQueryMatchPresent, + HTTPQueryMatchRegularExpression: return nil + default: + return fmt.Errorf("match type should be one of present, exact, or regex") } - return e.Meta } -func (e *HTTPRouteConfigEntry) GetEnterpriseMeta() *acl.EnterpriseMeta { - if e == nil { +func validateHTTPHeaderMatch(header HTTPHeaderMatch) error { + if header.Name == "" { + return fmt.Errorf("missing required Name field") + } + + switch header.Match { + case HTTPHeaderMatchExact, + HTTPHeaderMatchPrefix, + HTTPHeaderMatchRegularExpression, + HTTPHeaderMatchSuffix, + HTTPHeaderMatchPresent: return nil + default: + return fmt.Errorf("match type should be one of present, exact, prefix, suffix, or regex") } - return &e.EnterpriseMeta } -func (e *HTTPRouteConfigEntry) GetRaftIndex() *RaftIndex { - if e == nil { - return &RaftIndex{} +func validateHTTPPathMatch(path HTTPPathMatch) error { + switch path.Match { + case HTTPPathMatchExact, + HTTPPathMatchPrefix: + if !strings.HasPrefix(path.Value, "/") { + return fmt.Errorf("%s type match doesn't start with '/': %q", path.Match, path.Value) + } + fallthrough + case HTTPPathMatchRegularExpression: + return nil + default: + return fmt.Errorf("match type should be one of exact, prefix, or regex") } - return &e.RaftIndex +} + +func (e *HTTPRouteConfigEntry) CanRead(authz acl.Authorizer) error { + var authzContext acl.AuthorizerContext + e.FillAuthzContext(&authzContext) + return authz.ToAllowAuthorizer().MeshReadAllowed(&authzContext) +} + +func (e *HTTPRouteConfigEntry) CanWrite(authz acl.Authorizer) error { + var authzContext acl.AuthorizerContext + e.FillAuthzContext(&authzContext) + return authz.ToAllowAuthorizer().MeshWriteAllowed(&authzContext) } func (e *HTTPRouteConfigEntry) FilteredHostnames(listenerHostname string) []string { @@ -279,20 +439,6 @@ func (s HTTPService) ServiceName() ServiceName { return NewServiceName(s.Name, &s.EnterpriseMeta) } -var _ ControlledConfigEntry = (*HTTPRouteConfigEntry)(nil) - -func (e *HTTPRouteConfigEntry) GetStatus() Status { - return e.Status -} - -func (e *HTTPRouteConfigEntry) SetStatus(status Status) { - e.Status = status -} - -func (e *HTTPRouteConfigEntry) DefaultStatus() Status { - return Status{} -} - // TCPRouteConfigEntry manages the configuration for a TCP route // with the given name. type TCPRouteConfigEntry struct { @@ -317,9 +463,22 @@ type TCPRouteConfigEntry struct { RaftIndex } -func (e *TCPRouteConfigEntry) GetServices() []TCPService { - return e.Services -} +func (e *TCPRouteConfigEntry) GetKind() string { return TCPRoute } +func (e *TCPRouteConfigEntry) GetName() string { return e.Name } +func (e *TCPRouteConfigEntry) GetMeta() map[string]string { return e.Meta } +func (e *TCPRouteConfigEntry) GetRaftIndex() *RaftIndex { return &e.RaftIndex } +func (e *TCPRouteConfigEntry) GetEnterpriseMeta() *acl.EnterpriseMeta { return &e.EnterpriseMeta } + +var _ ControlledConfigEntry = (*TCPRouteConfigEntry)(nil) + +func (e *TCPRouteConfigEntry) GetStatus() Status { return e.Status } +func (e *TCPRouteConfigEntry) SetStatus(status Status) { e.Status = status } +func (e *TCPRouteConfigEntry) DefaultStatus() Status { return Status{} } + +var _ BoundRoute = (*TCPRouteConfigEntry)(nil) + +func (e *TCPRouteConfigEntry) GetParents() []ResourceReference { return e.Parents } +func (e *TCPRouteConfigEntry) GetProtocol() APIGatewayListenerProtocol { return ListenerProtocolTCP } func (e *TCPRouteConfigEntry) GetServiceNames() []ServiceName { services := []ServiceName{} @@ -329,34 +488,7 @@ func (e *TCPRouteConfigEntry) GetServiceNames() []ServiceName { return services } -func (e *TCPRouteConfigEntry) GetKind() string { - return TCPRoute -} - -func (e *TCPRouteConfigEntry) GetName() string { - if e == nil { - return "" - } - return e.Name -} - -func (e *TCPRouteConfigEntry) GetParents() []ResourceReference { - if e == nil { - return []ResourceReference{} - } - return e.Parents -} - -func (e *TCPRouteConfigEntry) GetProtocol() APIGatewayListenerProtocol { - return ListenerProtocolTCP -} - -func (e *TCPRouteConfigEntry) GetMeta() map[string]string { - if e == nil { - return nil - } - return e.Meta -} +func (e *TCPRouteConfigEntry) GetServices() []TCPService { return e.Services } func (e *TCPRouteConfigEntry) Normalize() error { for i, parent := range e.Parents { @@ -381,6 +513,11 @@ func (e *TCPRouteConfigEntry) Validate() error { return fmt.Errorf("unsupported parent kind: %q, must be 'api-gateway'", parent.Kind) } } + + if err := validateConfigEntryMeta(e.Meta); err != nil { + return err + } + return nil } @@ -396,34 +533,6 @@ func (e *TCPRouteConfigEntry) CanWrite(authz acl.Authorizer) error { return authz.ToAllowAuthorizer().MeshWriteAllowed(&authzContext) } -func (e *TCPRouteConfigEntry) GetRaftIndex() *RaftIndex { - if e == nil { - return &RaftIndex{} - } - return &e.RaftIndex -} - -func (e *TCPRouteConfigEntry) GetEnterpriseMeta() *acl.EnterpriseMeta { - if e == nil { - return nil - } - return &e.EnterpriseMeta -} - -var _ ControlledConfigEntry = (*TCPRouteConfigEntry)(nil) - -func (e *TCPRouteConfigEntry) GetStatus() Status { - return e.Status -} - -func (e *TCPRouteConfigEntry) SetStatus(status Status) { - e.Status = status -} - -func (e *TCPRouteConfigEntry) DefaultStatus() Status { - return Status{} -} - // TCPService is a service reference for a TCPRoute type TCPService struct { Name string diff --git a/agent/structs/config_entry_routes_test.go b/agent/structs/config_entry_routes_test.go index dc89ca9e090..ecacafdbf5a 100644 --- a/agent/structs/config_entry_routes_test.go +++ b/agent/structs/config_entry_routes_test.go @@ -7,6 +7,8 @@ import ( ) func TestTCPRoute(t *testing.T) { + t.Parallel() + cases := map[string]configEntryTestcase{ "multiple services": { entry: &TCPRouteConfigEntry{ @@ -56,3 +58,207 @@ func TestTCPRoute(t *testing.T) { } testConfigEntryNormalizeAndValidate(t, cases) } + +func TestHTTPRoute(t *testing.T) { + t.Parallel() + + cases := map[string]configEntryTestcase{ + "normalize parent kind": { + entry: &HTTPRouteConfigEntry{ + Kind: HTTPRoute, + Name: "route-one", + Parents: []ResourceReference{{ + Name: "gateway", + }}, + }, + normalizeOnly: true, + check: func(t *testing.T, entry ConfigEntry) { + expectedParent := ResourceReference{ + Kind: APIGateway, + Name: "gateway", + } + route := entry.(*HTTPRouteConfigEntry) + require.Len(t, route.Parents, 1) + require.Equal(t, expectedParent, route.Parents[0]) + }, + }, + "invalid parent kind": { + entry: &HTTPRouteConfigEntry{ + Kind: HTTPRoute, + Name: "route-two", + Parents: []ResourceReference{{ + Kind: "route", + Name: "gateway", + }}, + }, + validateErr: "unsupported parent kind", + }, + "wildcard hostnames": { + entry: &HTTPRouteConfigEntry{ + Kind: HTTPRoute, + Name: "route-two", + Parents: []ResourceReference{{ + Name: "gateway", + }}, + Hostnames: []string{"*"}, + }, + validateErr: "host \"*\" must not be a wildcard", + }, + "wildcard subdomain": { + entry: &HTTPRouteConfigEntry{ + Kind: HTTPRoute, + Name: "route-two", + Parents: []ResourceReference{{ + Name: "gateway", + }}, + Hostnames: []string{"*.consul.example"}, + }, + validateErr: "host \"*.consul.example\" must not be a wildcard", + }, + "valid dns hostname": { + entry: &HTTPRouteConfigEntry{ + Kind: HTTPRoute, + Name: "route-two", + Parents: []ResourceReference{{ + Name: "gateway", + }}, + Hostnames: []string{"...not legal"}, + }, + validateErr: "host \"...not legal\" must be a valid DNS hostname", + }, + "rule matches invalid header match type": { + entry: &HTTPRouteConfigEntry{ + Kind: HTTPRoute, + Name: "route-two", + Parents: []ResourceReference{{ + Name: "gateway", + }}, + Rules: []HTTPRouteRule{{ + Matches: []HTTPMatch{{ + Headers: []HTTPHeaderMatch{{ + Match: HTTPHeaderMatchType("foo"), + Name: "foo", + }}, + }}, + }}, + }, + validateErr: "Rule[0], Match[0], Headers[0], match type should be one of present, exact, prefix, suffix, or regex", + }, + "rule matches invalid header match name": { + entry: &HTTPRouteConfigEntry{ + Kind: HTTPRoute, + Name: "route-two", + Parents: []ResourceReference{{ + Name: "gateway", + }}, + Rules: []HTTPRouteRule{{ + Matches: []HTTPMatch{{ + Headers: []HTTPHeaderMatch{{ + Match: HTTPHeaderMatchPresent, + }}, + }}, + }}, + }, + validateErr: "Rule[0], Match[0], Headers[0], missing required Name field", + }, + "rule matches invalid query match type": { + entry: &HTTPRouteConfigEntry{ + Kind: HTTPRoute, + Name: "route-two", + Parents: []ResourceReference{{ + Name: "gateway", + }}, + Rules: []HTTPRouteRule{{ + Matches: []HTTPMatch{{ + Query: []HTTPQueryMatch{{ + Match: HTTPQueryMatchType("foo"), + Name: "foo", + }}, + }}, + }}, + }, + validateErr: "Rule[0], Match[0], Query[0], match type should be one of present, exact, or regex", + }, + "rule matches invalid query match name": { + entry: &HTTPRouteConfigEntry{ + Kind: HTTPRoute, + Name: "route-two", + Parents: []ResourceReference{{ + Name: "gateway", + }}, + Rules: []HTTPRouteRule{{ + Matches: []HTTPMatch{{ + Query: []HTTPQueryMatch{{ + Match: HTTPQueryMatchPresent, + }}, + }}, + }}, + }, + validateErr: "Rule[0], Match[0], Query[0], missing required Name field", + }, + "rule matches invalid path match type": { + entry: &HTTPRouteConfigEntry{ + Kind: HTTPRoute, + Name: "route-two", + Parents: []ResourceReference{{ + Name: "gateway", + }}, + Rules: []HTTPRouteRule{{ + Matches: []HTTPMatch{{ + Path: HTTPPathMatch{ + Match: HTTPPathMatchType("foo"), + }, + }}, + }}, + }, + validateErr: "Rule[0], Match[0], Path, match type should be one of exact, prefix, or regex", + }, + "rule matches invalid path match prefix": { + entry: &HTTPRouteConfigEntry{ + Kind: HTTPRoute, + Name: "route-two", + Parents: []ResourceReference{{ + Name: "gateway", + }}, + Rules: []HTTPRouteRule{{ + Matches: []HTTPMatch{{ + Path: HTTPPathMatch{ + Match: HTTPPathMatchPrefix, + }, + }}, + }}, + }, + validateErr: "Rule[0], Match[0], Path, prefix type match doesn't start with '/': \"\"", + }, + "rule matches invalid method": { + entry: &HTTPRouteConfigEntry{ + Kind: HTTPRoute, + Name: "route-two", + Parents: []ResourceReference{{ + Name: "gateway", + }}, + Rules: []HTTPRouteRule{{ + Matches: []HTTPMatch{{ + Method: HTTPMatchMethod("foo"), + }}, + }}, + }, + validateErr: "Rule[0], Match[0], Method contains an invalid method \"FOO\"", + }, + "rule normalizes method casing and path matches": { + entry: &HTTPRouteConfigEntry{ + Kind: HTTPRoute, + Name: "route-two", + Parents: []ResourceReference{{ + Name: "gateway", + }}, + Rules: []HTTPRouteRule{{ + Matches: []HTTPMatch{{ + Method: HTTPMatchMethod("trace"), + }}, + }}, + }, + }, + } + testConfigEntryNormalizeAndValidate(t, cases) +} diff --git a/api/config_entry_inline_certificate_test.go b/api/config_entry_inline_certificate_test.go index 3b1cc1f54ef..78771fcc78c 100644 --- a/api/config_entry_inline_certificate_test.go +++ b/api/config_entry_inline_certificate_test.go @@ -10,47 +10,51 @@ import ( const ( // generated via openssl req -x509 -sha256 -days 1825 -newkey rsa:2048 -keyout private.key -out certificate.crt validPrivateKey = `-----BEGIN RSA PRIVATE KEY----- -MIIEowIBAAKCAQEAx95Opa6t4lGEpiTUogEBptqOdam2ch4BHQGhNhX/MrDwwuZQ -httBwMfngQ/wd9NmYEPAwj0dumUoAITIq6i2jQlhqTodElkbsd5vWY8R/bxJWQSo -NvVE12TlzECxGpJEiHt4W0r8pGffk+rvpljiUyCfnT1kGF3znOSjK1hRMTn6RKWC -yYaBvXQiB4SGilfLgJcEpOJKtISIxmZ+S409g9X5VU88/Bmmrz4cMyxce86Kc2ug -5/MOv0CjWDJwlrv8njneV2zvraQ61DDwQftrXOvuCbO5IBRHMOBHiHTZ4rtGuhMa -Ir21V4vb6n8c4YzXiFvhUYcyX7rltGZzVd+WmQIDAQABAoIBACYvceUzp2MK4gYA -GWPOP2uKbBdM0l+hHeNV0WAM+dHMfmMuL4pkT36ucqt0ySOLjw6rQyOZG5nmA6t9 -sv0g4ae2eCMlyDIeNi1Yavu4Wt6YX4cTXbQKThm83C6W2X9THKbauBbxD621bsDK -7PhiGPN60yPue7YwFQAPqqD4YaK+s22HFIzk9gwM/rkvAUNwRv7SyHMiFe4Igc1C -Eev7iHWzvj5Heoz6XfF+XNF9DU+TieSUAdjd56VyUb8XL4+uBTOhHwLiXvAmfaMR -HvpcxeKnYZusS6NaOxcUHiJnsLNWrxmJj9WEGgQzuLxcLjTe4vVmELVZD8t3QUKj -PAxu8tUCgYEA7KIWVn9dfVpokReorFym+J8FzLwSktP9RZYEMonJo00i8aii3K9s -u/aSwRWQSCzmON1ZcxZzWhwQF9usz6kGCk//9+4hlVW90GtNK0RD+j7sp4aT2JI8 -9eLEjTG+xSXa7XWe98QncjjL9lu/yrRncSTxHs13q/XP198nn2aYuQ8CgYEA2Dnt -sRBzv0fFEvzzFv7G/5f85mouN38TUYvxNRTjBLCXl9DeKjDkOVZ2b6qlfQnYXIru -H+W+v+AZEb6fySXc8FRab7lkgTMrwE+aeI4rkW7asVwtclv01QJ5wMnyT84AgDD/ -Dgt/RThFaHgtU9TW5GOZveL+l9fVPn7vKFdTJdcCgYEArJ99zjHxwJ1whNAOk1av -09UmRPm6TvRo4heTDk8oEoIWCNatoHI0z1YMLuENNSnT9Q280FFDayvnrY/qnD7A -kktT/sjwJOG8q8trKzIMqQS4XWm2dxoPcIyyOBJfCbEY6XuRsUuePxwh5qF942EB -yS9a2s6nC4Ix0lgPrqAIr48CgYBgS/Q6riwOXSU8nqCYdiEkBYlhCJrKpnJxF9T1 -ofa0yPzKZP/8ZEfP7VzTwHjxJehQ1qLUW9pG08P2biH1UEKEWdzo8vT6wVJT1F/k -HtTycR8+a+Hlk2SHVRHqNUYQGpuIe8mrdJ1as4Pd0d/F/P0zO9Rlh+mAsGPM8HUM -T0+9gwKBgHDoerX7NTskg0H0t8O+iSMevdxpEWp34ZYa9gHiftTQGyrRgERCa7Gj -nZPAxKb2JoWyfnu3v7G5gZ8fhDFsiOxLbZv6UZJBbUIh1MjJISpXrForDrC2QNLX -kHrHfwBFDB3KMudhQknsJzEJKCL/KmFH6o0MvsoaT9yzEl3K+ah/ +MIIEpAIBAAKCAQEA0wzZeonUklhOvJ0AxcdDdCTiMwR9tsm/6IGcw9Jm50xVY+qg +5GFg1RWrQaODq7Gjqd/JDUAwtTBnQMs1yt6nbsHe2QhbD4XeqtZ+6fTv1ZpG3k8F +eB/M01xFqovczRV/ie77wd4vqoPD+AcfD8NDAFJt3htwUgGIqkQHP329Sh3TtLga +9ZMCs1MoTT+POYGUPL8bwt9R6ClNrucbH4Bs6OnX2ZFbKF75O9OHKNxWTmpDSodv +OFbFyKps3BfnPuF0Z6mj5M5yZeCjmtfS25PrsM3pMBGK5YHb0MlFfZIrIGboMbrz +9F/BMQJ64pMe43KwqHvTnbKWhp6PzLhEkPGLnwIDAQABAoIBADBEJAiONPszDu67 +yU1yAM8zEDgysr127liyK7PtDnOfVXgAVMNmMcsJpZzhVF+TxKY487YAFCOb6kE7 +OBYpTYla9SgVbR3js8TGQUgoKCFlowd8cvfB7gn4dEZIrjqIzB4zdYgk1Cne8JZs +qoHkWhJcx5ugEtPuXd7yp+WxT/T+6uOro06scp67NhP5t9yoAGFv5Vdb577RuzRo +Wkd9higQ9A20+GtjCY0EYxdgRviWvW7mM5/F+Lzcaui86ME+ga754gX8zgW3+NJ5 +LMsz5OLSnh291Uyjmr77HWBv/xvpq01Fls0LyJcgxFVZuJs5GQz+l3otSqv4FTP6 +Ua9w/YECgYEA8To3dgUK1QhzX5rwhWtlst3pItGTvmEdNzXmjgSylu7uKM13i+xg +llhp2uXrOEtuL+xtBZdeFNaijusbyqjg0xj6e4o31c19okuuDkJD5/sfQq22bvrn +gVJMGuESprIiPePrEyrXCHOdxH6eDgR2dIzAeO5vz0nnKGFAWrJJbvECgYEA3/mJ +eacXOJznw4Sa8jGWS2FtZLKxDHph7uDKMJmuG0ukb3aHJ9dMHrPleCLo8mhpoObA +hueoIbIP7swGrQx79+nZbnQpF6rMp6FAU5bF3gSrj1eWbaeh8pn9mrv4hal9USmn +orTbXMxDp3XSh7voR8Fqy5tMQqwZ+Lz74ccbw48CgYEA5cEhGdNrocPOv3x/IVRN +JLOfXX5nTaiJfxBja1imEIO5ajtoZWjaBdhn2gmqo4+UfyicHfsxrH9RjPX5HmkC +2Yys5gWbcJOr2Wxjd0k+DDFucL+rRsDKxq1vtxov/X0kh/YQ68ydynr0BTbjq04s +1I1KtOPEspYdCKS3+qpcrsECgYBtvYeVesBO9do9G0kMKC26y4bdEwzaz1ASykNn +IrWDHEH6dznr1HqwhHaHsZsvwucWdlmZAAKKWAOkfoU63uYS55qomvPTa9WQwNqS +2koi6Wjh+Al1uvAHvVncKgOwAgar8Nv5ReJBirgPYhSAexpppiRclL/93vNuw7Iq +wvMgkwKBgQC5wnb6SUUrzzKKSRgyusHM/XrjiKgVKq7lvFE9/iJkcw+BEXpjjbEe +RyD0a7PRtCfR39SMVrZp4KXVNNK5ln0WhuLvraMDwOpH9JDWHQiAhuJ3ooSwBylK ++QCLjyOtWAGZAIBRJyb1txfTXZ++dldkOjBi3bmEiadOa48ksvDsNQ== -----END RSA PRIVATE KEY-----` validCertificate = `-----BEGIN CERTIFICATE----- -MIICljCCAX4CCQCQMDsYO8FrPjANBgkqhkiG9w0BAQsFADANMQswCQYDVQQGEwJV -UzAeFw0yMjEyMjAxNzUwMjVaFw0yNzEyMTkxNzUwMjVaMA0xCzAJBgNVBAYTAlVT -MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx95Opa6t4lGEpiTUogEB -ptqOdam2ch4BHQGhNhX/MrDwwuZQhttBwMfngQ/wd9NmYEPAwj0dumUoAITIq6i2 -jQlhqTodElkbsd5vWY8R/bxJWQSoNvVE12TlzECxGpJEiHt4W0r8pGffk+rvplji -UyCfnT1kGF3znOSjK1hRMTn6RKWCyYaBvXQiB4SGilfLgJcEpOJKtISIxmZ+S409 -g9X5VU88/Bmmrz4cMyxce86Kc2ug5/MOv0CjWDJwlrv8njneV2zvraQ61DDwQftr -XOvuCbO5IBRHMOBHiHTZ4rtGuhMaIr21V4vb6n8c4YzXiFvhUYcyX7rltGZzVd+W -mQIDAQABMA0GCSqGSIb3DQEBCwUAA4IBAQBfCqoUIdPf/HGSbOorPyZWbyizNtHJ -GL7x9cAeIYxpI5Y/WcO1o5v94lvrgm3FNfJoGKbV66+JxOge731FrfMpHplhar1Z -RahYIzNLRBTLrwadLAZkApUpZvB8qDK4knsTWFYujNsylCww2A6ajzIMFNU4GkUK -NtyHRuD+KYRmjXtyX1yHNqfGN3vOQmwavHq2R8wHYuBSc6LAHHV9vG+j0VsgMELO -qwxn8SmLkSKbf2+MsQVzLCXXN5u+D8Yv+4py+oKP4EQ5aFZuDEx+r/G/31rTthww -AAJAMaoXmoYVdgXV+CPuBb2M4XCpuzLu3bcA2PXm5ipSyIgntMKwXV7r +MIIDQjCCAioCCQC6cMRYsE+ahDANBgkqhkiG9w0BAQsFADBjMQswCQYDVQQGEwJV +UzELMAkGA1UECAwCQ0ExCzAJBgNVBAcMAkxBMQ0wCwYDVQQKDARUZXN0MQ0wCwYD +VQQLDARTdHViMRwwGgYDVQQDDBNob3N0LmNvbnN1bC5leGFtcGxlMB4XDTIzMDIx +NzAyMTA1MloXDTI4MDIxNjAyMTA1MlowYzELMAkGA1UEBhMCVVMxCzAJBgNVBAgM +AkNBMQswCQYDVQQHDAJMQTENMAsGA1UECgwEVGVzdDENMAsGA1UECwwEU3R1YjEc +MBoGA1UEAwwTaG9zdC5jb25zdWwuZXhhbXBsZTCCASIwDQYJKoZIhvcNAQEBBQAD +ggEPADCCAQoCggEBANMM2XqJ1JJYTrydAMXHQ3Qk4jMEfbbJv+iBnMPSZudMVWPq +oORhYNUVq0Gjg6uxo6nfyQ1AMLUwZ0DLNcrep27B3tkIWw+F3qrWfun079WaRt5P +BXgfzNNcRaqL3M0Vf4nu+8HeL6qDw/gHHw/DQwBSbd4bcFIBiKpEBz99vUod07S4 +GvWTArNTKE0/jzmBlDy/G8LfUegpTa7nGx+AbOjp19mRWyhe+TvThyjcVk5qQ0qH +bzhWxciqbNwX5z7hdGepo+TOcmXgo5rX0tuT67DN6TARiuWB29DJRX2SKyBm6DG6 +8/RfwTECeuKTHuNysKh7052yloaej8y4RJDxi58CAwEAATANBgkqhkiG9w0BAQsF +AAOCAQEAHF10odRNJ7TKvcD2JPtR8wMacfldSiPcQnn+rhMUyBaKOoSrALxOev+N +L8N+RtEV+KXkyBkvT71OZzEpY9ROwqOQ/acnMdbfG0IBPbg3c/7WDD2sjcdr1zvc +U3T7WJ7G3guZ5aWCuAGgOyT6ZW8nrDa4yFbKZ1PCJkvUQ2ttO1lXmyGPM533Y2pi +SeXP6LL7z5VNqYO3oz5IJEstt10IKxdmb2gKFhHjgEmHN2gFL0jaPi4mjjaINrxq +MdqcM9IzLr26AjZ45NuI9BCcZWO1mraaQTOIb3QL5LyqaC7CRJXLYPSGARthyDhq +J3TrQE3YVrL4D9xnklT86WDnZKApJg== -----END CERTIFICATE-----` ) From 9ed554b40c96e5edbf318acb76138a3c796909e3 Mon Sep 17 00:00:00 2001 From: David Yu Date: Fri, 17 Feb 2023 11:46:31 -0800 Subject: [PATCH 018/262] ISSUE TEMPLATE: update issue templates to include comments instead of inline text for instructions (#16313) * Update bug_report.md * Update feature_request.md * Update ui_issues.md * Update pull_request_template.md --- .github/ISSUE_TEMPLATE/bug_report.md | 26 +++++++++++++++++++- .github/ISSUE_TEMPLATE/feature_request.md | 14 ++++++++++- .github/ISSUE_TEMPLATE/ui_issues.md | 29 ++++++++++++++++++++++- .github/pull_request_template.md | 17 ++++++++++++- 4 files changed, 82 insertions(+), 4 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index 71813a02162..8a7e26fd226 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -4,20 +4,34 @@ about: You're experiencing an issue with Consul that is different than the docum --- + + #### Overview of the Issue -A paragraph or two about the issue you're experiencing. + + +--- #### Reproduction Steps + + ### Consul info for both Client and Server @@ -51,8 +65,18 @@ Server agent HCL config ### Operating system and Environment details + + ### Log Fragments + + Include appropriate Client or Server log fragments. If the log is longer than a few dozen lines, please include the URL to the [gist](https://gist.github.com/) of the log instead of posting it in the issue. Use `-log-level=TRACE` on the client and server to capture the maximum log detail. diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md index fb9b6b4ef03..b3cd70e8cd1 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -4,12 +4,24 @@ about: If you have something you think Consul could improve or add support for. --- + + #### Feature Description + + #### Use Case(s) -Any relevant use-cases that you see. + diff --git a/.github/ISSUE_TEMPLATE/ui_issues.md b/.github/ISSUE_TEMPLATE/ui_issues.md index dd5a6351c8d..3a3ca0ed17e 100644 --- a/.github/ISSUE_TEMPLATE/ui_issues.md +++ b/.github/ISSUE_TEMPLATE/ui_issues.md @@ -4,41 +4,68 @@ about: You have usage feedback for the browser based UI --- + + ### Overview of the Issue -A paragraph or two about the issue you're experiencing / suggestion for + + ### Reproduction Steps + + ### Describe the solution you'd like + + ### Consul Version + + ### Browser and Operating system details + + ### Screengrabs / Web Inspector logs + diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index 43b3ac71337..7f1e645aa33 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -1,16 +1,31 @@ ### Description -Describe why you're making this change, in plain English. + + ### Testing & Reproduction steps + + + ### Links + + + ### PR Checklist * [ ] updated test coverage From f1436109eab840e4db766ad75a7262e61c4d6ffc Mon Sep 17 00:00:00 2001 From: Dan Stough Date: Fri, 17 Feb 2023 15:04:12 -0500 Subject: [PATCH 019/262] [OSS] security: update go to 1.20.1 (#16263) * security: update go to 1.20.1 --- .changelog/16263.txt | 4 +++ .circleci/config.yml | 26 +++++++------- .github/workflows/build.yml | 20 +++++------ GNUmakefile | 6 ++-- agent/agent_test.go | 5 +-- agent/consul/auto_config_endpoint_test.go | 5 ++- agent/consul/internal_endpoint_test.go | 2 +- agent/consul/leader_peering_test.go | 4 +-- agent/consul/state/acl_test.go | 2 -- agent/coordinate_endpoint_test.go | 6 ++-- agent/grpc-external/limiter/limiter_test.go | 4 --- agent/prepared_query_endpoint_test.go | 21 ++++++------ agent/testagent.go | 5 --- agent/txn_endpoint_test.go | 18 +++++----- api/go.mod | 2 +- build-support/docker/Build-Go.dockerfile | 2 +- command/members/members_test.go | 3 -- envoyextensions/go.mod | 2 +- go.mod | 2 +- lib/rand.go | 34 ------------------- main.go | 5 --- proto-public/pbdns/mock_DNSServiceClient.go | 7 ++-- proto-public/pbdns/mock_DNSServiceServer.go | 7 ++-- .../pbdns/mock_UnsafeDNSServiceServer.go | 2 +- sdk/freeport/freeport.go | 1 - sdk/go.mod | 2 +- test/integration/consul-container/go.mod | 2 +- tlsutil/config_test.go | 2 +- troubleshoot/go.mod | 2 +- 29 files changed, 80 insertions(+), 123 deletions(-) create mode 100644 .changelog/16263.txt delete mode 100644 lib/rand.go diff --git a/.changelog/16263.txt b/.changelog/16263.txt new file mode 100644 index 00000000000..a8cd3f9043a --- /dev/null +++ b/.changelog/16263.txt @@ -0,0 +1,4 @@ +```release-note:security +Upgrade to use Go 1.20.1. +This resolves vulnerabilities [CVE-2022-41724](https://go.dev/issue/58001) in `crypto/tls` and [CVE-2022-41723](https://go.dev/issue/57855) in `net/http`. +``` diff --git a/.circleci/config.yml b/.circleci/config.yml index 7dd57d1bbe9..46ebfe240e9 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -21,7 +21,7 @@ references: GIT_COMMITTER_NAME: circleci-consul S3_ARTIFACT_BUCKET: consul-dev-artifacts-v2 BASH_ENV: .circleci/bash_env.sh - GO_VERSION: 1.19.4 + GO_VERSION: 1.20.1 envoy-versions: &supported_envoy_versions - &default_envoy_version "1.22.7" - "1.23.4" @@ -39,7 +39,7 @@ references: images: # When updating the Go version, remember to also update the versions in the # workflows section for go-test-lib jobs. - go: &GOLANG_IMAGE docker.mirror.hashicorp.services/cimg/go:1.19.4 + go: &GOLANG_IMAGE docker.mirror.hashicorp.services/cimg/go:1.20.1 ember: &EMBER_IMAGE docker.mirror.hashicorp.services/circleci/node:14-browsers ubuntu: &UBUNTU_CI_IMAGE ubuntu-2004:202201-02 cache: @@ -613,7 +613,7 @@ jobs: - run: *notify-slack-failure nomad-integration-test: &NOMAD_TESTS docker: - - image: docker.mirror.hashicorp.services/cimg/go:1.19 + - image: docker.mirror.hashicorp.services/cimg/go:1.20 parameters: nomad-version: type: enum @@ -1110,34 +1110,34 @@ workflows: - go-test-lib: name: "go-test-envoyextensions" path: envoyextensions - go-version: "1.19" + go-version: "1.20" requires: [dev-build] <<: *filter-ignore-non-go-branches - go-test-lib: name: "go-test-troubleshoot" path: troubleshoot - go-version: "1.19" + go-version: "1.20" requires: [dev-build] <<: *filter-ignore-non-go-branches - go-test-lib: - name: "go-test-api go1.18" + name: "go-test-api go1.19" path: api - go-version: "1.18" + go-version: "1.19" requires: [dev-build] - go-test-lib: - name: "go-test-api go1.19" + name: "go-test-api go1.20" path: api - go-version: "1.19" + go-version: "1.20" requires: [dev-build] - go-test-lib: - name: "go-test-sdk go1.18" + name: "go-test-sdk go1.19" path: sdk - go-version: "1.18" + go-version: "1.19" <<: *filter-ignore-non-go-branches - go-test-lib: - name: "go-test-sdk go1.19" + name: "go-test-sdk go1.20" path: sdk - go-version: "1.19" + go-version: "1.20" <<: *filter-ignore-non-go-branches - go-test-race: *filter-ignore-non-go-branches - go-test-32bit: *filter-ignore-non-go-branches diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 20f316c12e3..b0c1dbbd82d 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -79,15 +79,15 @@ jobs: strategy: matrix: include: - - {go: "1.19.4", goos: "linux", goarch: "386"} - - {go: "1.19.4", goos: "linux", goarch: "amd64"} - - {go: "1.19.4", goos: "linux", goarch: "arm"} - - {go: "1.19.4", goos: "linux", goarch: "arm64"} - - {go: "1.19.4", goos: "freebsd", goarch: "386"} - - {go: "1.19.4", goos: "freebsd", goarch: "amd64"} - - {go: "1.19.4", goos: "windows", goarch: "386"} - - {go: "1.19.4", goos: "windows", goarch: "amd64"} - - {go: "1.19.4", goos: "solaris", goarch: "amd64"} + - {go: "1.20.1", goos: "linux", goarch: "386"} + - {go: "1.20.1", goos: "linux", goarch: "amd64"} + - {go: "1.20.1", goos: "linux", goarch: "arm"} + - {go: "1.20.1", goos: "linux", goarch: "arm64"} + - {go: "1.20.1", goos: "freebsd", goarch: "386"} + - {go: "1.20.1", goos: "freebsd", goarch: "amd64"} + - {go: "1.20.1", goos: "windows", goarch: "386"} + - {go: "1.20.1", goos: "windows", goarch: "amd64"} + - {go: "1.20.1", goos: "solaris", goarch: "amd64"} fail-fast: true name: Go ${{ matrix.go }} ${{ matrix.goos }} ${{ matrix.goarch }} build @@ -176,7 +176,7 @@ jobs: matrix: goos: [ darwin ] goarch: [ "amd64", "arm64" ] - go: [ "1.19.4" ] + go: [ "1.20.1" ] fail-fast: true name: Go ${{ matrix.go }} ${{ matrix.goos }} ${{ matrix.goarch }} build diff --git a/GNUmakefile b/GNUmakefile index f1cebb68955..ee765693f4a 100644 --- a/GNUmakefile +++ b/GNUmakefile @@ -7,11 +7,11 @@ SHELL = bash # These version variables can either be a valid string for "go install @" # or the string @DEV to imply use what is currently installed locally. ### -GOLANGCI_LINT_VERSION='v1.50.1' -MOCKERY_VERSION='v2.15.0' +GOLANGCI_LINT_VERSION='v1.51.1' +MOCKERY_VERSION='v2.20.0' BUF_VERSION='v1.4.0' PROTOC_GEN_GO_GRPC_VERSION="v1.2.0" -MOG_VERSION='v0.3.0' +MOG_VERSION='v0.4.0' PROTOC_GO_INJECT_TAG_VERSION='v1.3.0' PROTOC_GEN_GO_BINARY_VERSION="v0.1.0" DEEP_COPY_VERSION='bc3f5aa5735d8a54961580a3a24422c308c831c2' diff --git a/agent/agent_test.go b/agent/agent_test.go index d6dd2cc5fcf..bcc57cf41e0 100644 --- a/agent/agent_test.go +++ b/agent/agent_test.go @@ -4,12 +4,13 @@ import ( "bytes" "context" "crypto/md5" + "crypto/rand" "crypto/tls" "crypto/x509" "encoding/base64" "encoding/json" "fmt" - "math/rand" + mathrand "math/rand" "net" "net/http" "net/http/httptest" @@ -752,7 +753,7 @@ func testAgent_AddServices_AliasUpdateCheckNotReverted(t *testing.T, extraHCL st func test_createAlias(t *testing.T, agent *TestAgent, chk *structs.CheckType, expectedResult string) func(r *retry.R) { t.Helper() - serviceNum := rand.Int() + serviceNum := mathrand.Int() srv := &structs.NodeService{ Service: fmt.Sprintf("serviceAlias-%d", serviceNum), Tags: []string{"tag1"}, diff --git a/agent/consul/auto_config_endpoint_test.go b/agent/consul/auto_config_endpoint_test.go index ac9ea4128dd..1f0f8e18a1c 100644 --- a/agent/consul/auto_config_endpoint_test.go +++ b/agent/consul/auto_config_endpoint_test.go @@ -3,12 +3,11 @@ package consul import ( "bytes" "crypto" - crand "crypto/rand" + "crypto/rand" "crypto/x509" "encoding/base64" "encoding/pem" "fmt" - "math/rand" "net" "net/url" "os" @@ -884,7 +883,7 @@ func TestAutoConfig_parseAutoConfigCSR(t *testing.T) { // customizations to allow for better unit testing. createCSR := func(tmpl *x509.CertificateRequest, privateKey crypto.Signer) (string, error) { connect.HackSANExtensionForCSR(tmpl) - bs, err := x509.CreateCertificateRequest(crand.Reader, tmpl, privateKey) + bs, err := x509.CreateCertificateRequest(rand.Reader, tmpl, privateKey) require.NoError(t, err) var csrBuf bytes.Buffer err = pem.Encode(&csrBuf, &pem.Block{Type: "CERTIFICATE REQUEST", Bytes: bs}) diff --git a/agent/consul/internal_endpoint_test.go b/agent/consul/internal_endpoint_test.go index e0aa941b90e..181de4ed82c 100644 --- a/agent/consul/internal_endpoint_test.go +++ b/agent/consul/internal_endpoint_test.go @@ -1,9 +1,9 @@ package consul import ( + "crypto/rand" "encoding/base64" "fmt" - "math/rand" "os" "strings" "testing" diff --git a/agent/consul/leader_peering_test.go b/agent/consul/leader_peering_test.go index 4be6326c095..143448535aa 100644 --- a/agent/consul/leader_peering_test.go +++ b/agent/consul/leader_peering_test.go @@ -478,7 +478,7 @@ func TestLeader_PeeringSync_FailsForTLSError(t *testing.T) { t.Run("server-name-validation", func(t *testing.T) { testLeader_PeeringSync_failsForTLSError(t, func(token *structs.PeeringToken) { token.ServerName = "wrong.name" - }, `transport: authentication handshake failed: x509: certificate is valid for server.dc1.peering.11111111-2222-3333-4444-555555555555.consul, not wrong.name`) + }, `transport: authentication handshake failed: tls: failed to verify certificate: x509: certificate is valid for server.dc1.peering.11111111-2222-3333-4444-555555555555.consul, not wrong.name`) }) t.Run("bad-ca-roots", func(t *testing.T) { wrongRoot, err := os.ReadFile("../../test/client_certs/rootca.crt") @@ -486,7 +486,7 @@ func TestLeader_PeeringSync_FailsForTLSError(t *testing.T) { testLeader_PeeringSync_failsForTLSError(t, func(token *structs.PeeringToken) { token.CA = []string{string(wrongRoot)} - }, `transport: authentication handshake failed: x509: certificate signed by unknown authority`) + }, `transport: authentication handshake failed: tls: failed to verify certificate: x509: certificate signed by unknown authority`) }) } diff --git a/agent/consul/state/acl_test.go b/agent/consul/state/acl_test.go index 5e01514730f..fc00728282a 100644 --- a/agent/consul/state/acl_test.go +++ b/agent/consul/state/acl_test.go @@ -13,7 +13,6 @@ import ( "github.com/hashicorp/consul/acl" "github.com/hashicorp/consul/agent/structs" - "github.com/hashicorp/consul/lib" "github.com/hashicorp/consul/proto/pbacl" ) @@ -3570,7 +3569,6 @@ func TestStateStore_ACLPolicies_Snapshot_Restore(t *testing.T) { } func TestTokenPoliciesIndex(t *testing.T) { - lib.SeedMathRand() idIndex := &memdb.IndexSchema{ Name: "id", diff --git a/agent/coordinate_endpoint_test.go b/agent/coordinate_endpoint_test.go index 4782ae72d0f..71492d909c4 100644 --- a/agent/coordinate_endpoint_test.go +++ b/agent/coordinate_endpoint_test.go @@ -40,9 +40,9 @@ func TestCoordinate_Disabled_Response(t *testing.T) { req, _ := http.NewRequest("PUT", "/should/not/care", nil) resp := httptest.NewRecorder() obj, err := tt(resp, req) - if err, ok := err.(HTTPError); ok { - if err.StatusCode != 401 { - t.Fatalf("expected status 401 but got %d", err.StatusCode) + if httpErr, ok := err.(HTTPError); ok { + if httpErr.StatusCode != 401 { + t.Fatalf("expected status 401 but got %d", httpErr.StatusCode) } } else { t.Fatalf("expected HTTP error but got %v", err) diff --git a/agent/grpc-external/limiter/limiter_test.go b/agent/grpc-external/limiter/limiter_test.go index cef6a4d4171..7f5b9654a0a 100644 --- a/agent/grpc-external/limiter/limiter_test.go +++ b/agent/grpc-external/limiter/limiter_test.go @@ -8,12 +8,8 @@ import ( "time" "github.com/stretchr/testify/require" - - "github.com/hashicorp/consul/lib" ) -func init() { lib.SeedMathRand() } - func TestSessionLimiter(t *testing.T) { lim := NewSessionLimiter() diff --git a/agent/prepared_query_endpoint_test.go b/agent/prepared_query_endpoint_test.go index 33240fd77ae..09012bc2a06 100644 --- a/agent/prepared_query_endpoint_test.go +++ b/agent/prepared_query_endpoint_test.go @@ -13,9 +13,10 @@ import ( "github.com/hashicorp/consul/testrpc" + "github.com/stretchr/testify/require" + "github.com/hashicorp/consul/agent/structs" "github.com/hashicorp/consul/types" - "github.com/stretchr/testify/require" ) // MockPreparedQuery is a fake endpoint that we inject into the Consul server @@ -628,9 +629,9 @@ func TestPreparedQuery_Execute(t *testing.T) { req, _ := http.NewRequest("GET", "/v1/query/not-there/execute", body) resp := httptest.NewRecorder() _, err := a.srv.PreparedQuerySpecific(resp, req) - if err, ok := err.(HTTPError); ok { - if err.StatusCode != 404 { - t.Fatalf("expected status 404 but got %d", err.StatusCode) + if httpErr, ok := err.(HTTPError); ok { + if httpErr.StatusCode != 404 { + t.Fatalf("expected status 404 but got %d", httpErr.StatusCode) } } else { t.Fatalf("expected HTTP error but got %v", err) @@ -768,9 +769,9 @@ func TestPreparedQuery_Explain(t *testing.T) { req, _ := http.NewRequest("GET", "/v1/query/not-there/explain", body) resp := httptest.NewRecorder() _, err := a.srv.PreparedQuerySpecific(resp, req) - if err, ok := err.(HTTPError); ok { - if err.StatusCode != 404 { - t.Fatalf("expected status 404 but got %d", err.StatusCode) + if httpErr, ok := err.(HTTPError); ok { + if httpErr.StatusCode != 404 { + t.Fatalf("expected status 404 but got %d", httpErr.StatusCode) } } else { t.Fatalf("expected HTTP error but got %v", err) @@ -862,9 +863,9 @@ func TestPreparedQuery_Get(t *testing.T) { req, _ := http.NewRequest("GET", "/v1/query/f004177f-2c28-83b7-4229-eacc25fe55d1", body) resp := httptest.NewRecorder() _, err := a.srv.PreparedQuerySpecific(resp, req) - if err, ok := err.(HTTPError); ok { - if err.StatusCode != 404 { - t.Fatalf("expected status 404 but got %d", err.StatusCode) + if httpErr, ok := err.(HTTPError); ok { + if httpErr.StatusCode != 404 { + t.Fatalf("expected status 404 but got %d", httpErr.StatusCode) } } else { t.Fatalf("expected HTTP error but got %v", err) diff --git a/agent/testagent.go b/agent/testagent.go index db08be40a4b..54db5c72ba4 100644 --- a/agent/testagent.go +++ b/agent/testagent.go @@ -6,7 +6,6 @@ import ( "crypto/x509" "fmt" "io" - "math/rand" "net" "net/http/httptest" "path/filepath" @@ -32,10 +31,6 @@ import ( "github.com/hashicorp/consul/tlsutil" ) -func init() { - rand.Seed(time.Now().UnixNano()) // seed random number generator -} - // TestAgent encapsulates an Agent with a default configuration and // startup procedure suitable for testing. It panics if there are errors // during creation or startup instead of returning errors. It manages a diff --git a/agent/txn_endpoint_test.go b/agent/txn_endpoint_test.go index 90e5359955c..ce94b5c3e63 100644 --- a/agent/txn_endpoint_test.go +++ b/agent/txn_endpoint_test.go @@ -67,9 +67,9 @@ func TestTxnEndpoint_Bad_Size_Item(t *testing.T) { t.Fatalf("err: %v", err) } } else { - if err, ok := err.(HTTPError); ok { - if err.StatusCode != 413 { - t.Fatalf("expected 413 but got %d", err.StatusCode) + if httpErr, ok := err.(HTTPError); ok { + if httpErr.StatusCode != 413 { + t.Fatalf("expected 413 but got %d", httpErr.StatusCode) } } else { t.Fatalf("excected HTTP error but got %v", err) @@ -150,9 +150,9 @@ func TestTxnEndpoint_Bad_Size_Net(t *testing.T) { t.Fatalf("err: %v", err) } } else { - if err, ok := err.(HTTPError); ok { - if err.StatusCode != 413 { - t.Fatalf("expected 413 but got %d", err.StatusCode) + if httpErr, ok := err.(HTTPError); ok { + if httpErr.StatusCode != 413 { + t.Fatalf("expected 413 but got %d", httpErr.StatusCode) } } else { t.Fatalf("excected HTTP error but got %v", err) @@ -220,9 +220,9 @@ func TestTxnEndpoint_Bad_Size_Ops(t *testing.T) { resp := httptest.NewRecorder() _, err := a.srv.Txn(resp, req) - if err, ok := err.(HTTPError); ok { - if err.StatusCode != 413 { - t.Fatalf("expected 413 but got %d", err.StatusCode) + if httpErr, ok := err.(HTTPError); ok { + if httpErr.StatusCode != 413 { + t.Fatalf("expected 413 but got %d", httpErr.StatusCode) } } else { t.Fatalf("expected HTTP error but got %v", err) diff --git a/api/go.mod b/api/go.mod index 20c8e80814b..d9a68569df7 100644 --- a/api/go.mod +++ b/api/go.mod @@ -1,6 +1,6 @@ module github.com/hashicorp/consul/api -go 1.18 +go 1.20 replace github.com/hashicorp/consul/sdk => ../sdk diff --git a/build-support/docker/Build-Go.dockerfile b/build-support/docker/Build-Go.dockerfile index cd578b451b7..543344ea3f4 100644 --- a/build-support/docker/Build-Go.dockerfile +++ b/build-support/docker/Build-Go.dockerfile @@ -1,4 +1,4 @@ -ARG GOLANG_VERSION=1.19.2 +ARG GOLANG_VERSION=1.20.1 FROM golang:${GOLANG_VERSION} WORKDIR /consul diff --git a/command/members/members_test.go b/command/members/members_test.go index cc4a21742ae..c9a2d42b77d 100644 --- a/command/members/members_test.go +++ b/command/members/members_test.go @@ -13,7 +13,6 @@ import ( "github.com/hashicorp/consul/agent" consulapi "github.com/hashicorp/consul/api" - "github.com/hashicorp/consul/lib" ) // TODO(partitions): split these tests @@ -206,8 +205,6 @@ func zip(t *testing.T, k, v []string) map[string]string { } func TestSortByMemberNamePartitionAndSegment(t *testing.T) { - lib.SeedMathRand() - // For the test data we'll give them names that would sort them backwards // if we only sorted by name. newData := func() []*consulapi.AgentMember { diff --git a/envoyextensions/go.mod b/envoyextensions/go.mod index f96560804c9..5a73e969c2d 100644 --- a/envoyextensions/go.mod +++ b/envoyextensions/go.mod @@ -1,6 +1,6 @@ module github.com/hashicorp/consul/envoyextensions -go 1.19 +go 1.20 replace github.com/hashicorp/consul/api => ../api diff --git a/go.mod b/go.mod index 5a38efd9dc8..299e682647c 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module github.com/hashicorp/consul -go 1.19 +go 1.20 replace ( github.com/hashicorp/consul/api => ./api diff --git a/lib/rand.go b/lib/rand.go deleted file mode 100644 index 22aa4f3544b..00000000000 --- a/lib/rand.go +++ /dev/null @@ -1,34 +0,0 @@ -package lib - -import ( - crand "crypto/rand" - "math" - "math/big" - "math/rand" - "sync" - "time" -) - -var ( - once sync.Once - - // SeededSecurely is set to true if a cryptographically secure seed - // was used to initialize rand. When false, the start time is used - // as a seed. - SeededSecurely bool -) - -// SeedMathRand provides weak, but guaranteed seeding, which is better than -// running with Go's default seed of 1. A call to SeedMathRand() is expected -// to be called via init(), but never a second time. -func SeedMathRand() { - once.Do(func() { - n, err := crand.Int(crand.Reader, big.NewInt(math.MaxInt64)) - if err != nil { - rand.Seed(time.Now().UTC().UnixNano()) - return - } - rand.Seed(n.Int64()) - SeededSecurely = true - }) -} diff --git a/main.go b/main.go index 5138f8c2219..804635060a8 100644 --- a/main.go +++ b/main.go @@ -11,14 +11,9 @@ import ( "github.com/hashicorp/consul/command" "github.com/hashicorp/consul/command/cli" "github.com/hashicorp/consul/command/version" - "github.com/hashicorp/consul/lib" _ "github.com/hashicorp/consul/service_os" ) -func init() { - lib.SeedMathRand() -} - func main() { os.Exit(realMain()) } diff --git a/proto-public/pbdns/mock_DNSServiceClient.go b/proto-public/pbdns/mock_DNSServiceClient.go index 24906ab8547..d9fffda65ae 100644 --- a/proto-public/pbdns/mock_DNSServiceClient.go +++ b/proto-public/pbdns/mock_DNSServiceClient.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.15.0. DO NOT EDIT. +// Code generated by mockery v2.20.0. DO NOT EDIT. package pbdns @@ -27,6 +27,10 @@ func (_m *MockDNSServiceClient) Query(ctx context.Context, in *QueryRequest, opt ret := _m.Called(_ca...) var r0 *QueryResponse + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *QueryRequest, ...grpc.CallOption) (*QueryResponse, error)); ok { + return rf(ctx, in, opts...) + } if rf, ok := ret.Get(0).(func(context.Context, *QueryRequest, ...grpc.CallOption) *QueryResponse); ok { r0 = rf(ctx, in, opts...) } else { @@ -35,7 +39,6 @@ func (_m *MockDNSServiceClient) Query(ctx context.Context, in *QueryRequest, opt } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, *QueryRequest, ...grpc.CallOption) error); ok { r1 = rf(ctx, in, opts...) } else { diff --git a/proto-public/pbdns/mock_DNSServiceServer.go b/proto-public/pbdns/mock_DNSServiceServer.go index e9bd338daf1..e78c7d4c304 100644 --- a/proto-public/pbdns/mock_DNSServiceServer.go +++ b/proto-public/pbdns/mock_DNSServiceServer.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.15.0. DO NOT EDIT. +// Code generated by mockery v2.20.0. DO NOT EDIT. package pbdns @@ -18,6 +18,10 @@ func (_m *MockDNSServiceServer) Query(_a0 context.Context, _a1 *QueryRequest) (* ret := _m.Called(_a0, _a1) var r0 *QueryResponse + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *QueryRequest) (*QueryResponse, error)); ok { + return rf(_a0, _a1) + } if rf, ok := ret.Get(0).(func(context.Context, *QueryRequest) *QueryResponse); ok { r0 = rf(_a0, _a1) } else { @@ -26,7 +30,6 @@ func (_m *MockDNSServiceServer) Query(_a0 context.Context, _a1 *QueryRequest) (* } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, *QueryRequest) error); ok { r1 = rf(_a0, _a1) } else { diff --git a/proto-public/pbdns/mock_UnsafeDNSServiceServer.go b/proto-public/pbdns/mock_UnsafeDNSServiceServer.go index 0a6c47c2cb7..43a9e1e461a 100644 --- a/proto-public/pbdns/mock_UnsafeDNSServiceServer.go +++ b/proto-public/pbdns/mock_UnsafeDNSServiceServer.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.15.0. DO NOT EDIT. +// Code generated by mockery v2.20.0. DO NOT EDIT. package pbdns diff --git a/sdk/freeport/freeport.go b/sdk/freeport/freeport.go index 6eda1d4279b..6c275fe8667 100644 --- a/sdk/freeport/freeport.go +++ b/sdk/freeport/freeport.go @@ -114,7 +114,6 @@ func initialize() { panic("freeport: block size too big or too many blocks requested") } - rand.Seed(time.Now().UnixNano()) firstPort, lockLn = alloc() condNotEmpty = sync.NewCond(&mu) diff --git a/sdk/go.mod b/sdk/go.mod index b7c2eb01426..63ad3671a3e 100644 --- a/sdk/go.mod +++ b/sdk/go.mod @@ -1,6 +1,6 @@ module github.com/hashicorp/consul/sdk -go 1.18 +go 1.20 require ( github.com/hashicorp/go-cleanhttp v0.5.1 diff --git a/test/integration/consul-container/go.mod b/test/integration/consul-container/go.mod index a88a6aff0b3..513612707d7 100644 --- a/test/integration/consul-container/go.mod +++ b/test/integration/consul-container/go.mod @@ -1,6 +1,6 @@ module github.com/hashicorp/consul/test/integration/consul-container -go 1.19 +go 1.20 require ( github.com/avast/retry-go v3.0.0+incompatible diff --git a/tlsutil/config_test.go b/tlsutil/config_test.go index 7ce7893bfbe..388b4934ed4 100644 --- a/tlsutil/config_test.go +++ b/tlsutil/config_test.go @@ -906,7 +906,7 @@ func TestConfigurator_outgoingWrapperALPN_serverHasNoNodeNameInSAN(t *testing.T) _, err = wrap("dc1", "bob", "foo", client) require.Error(t, err) - _, ok := err.(x509.HostnameError) + _, ok := err.(*tls.CertificateVerificationError) require.True(t, ok) client.Close() diff --git a/troubleshoot/go.mod b/troubleshoot/go.mod index c4e445ee05f..cf82c88f1e1 100644 --- a/troubleshoot/go.mod +++ b/troubleshoot/go.mod @@ -1,6 +1,6 @@ module github.com/hashicorp/consul/troubleshoot -go 1.19 +go 1.20 replace github.com/hashicorp/consul/api => ../api From 085c0addc0e7fb7b38d7ed149649dc372ad2de4a Mon Sep 17 00:00:00 2001 From: Matt Keeler Date: Fri, 17 Feb 2023 16:14:46 -0500 Subject: [PATCH 020/262] Protobuf Refactoring for Multi-Module Cleanliness (#16302) Protobuf Refactoring for Multi-Module Cleanliness This commit includes the following: Moves all packages that were within proto/ to proto/private Rewrites imports to account for the packages being moved Adds in buf.work.yaml to enable buf workspaces Names the proto-public buf module so that we can override the Go package imports within proto/buf.yaml Bumps the buf version dependency to 1.14.0 (I was trying out the version to see if it would get around an issue - it didn't but it also doesn't break things and it seemed best to keep up with the toolchain changes) Why: In the future we will need to consume other protobuf dependencies such as the Google HTTP annotations for openapi generation or grpc-gateway usage. There were some recent changes to have our own ratelimiting annotations. The two combined were not working when I was trying to use them together (attempting to rebase another branch) Buf workspaces should be the solution to the problem Buf workspaces means that each module will have generated Go code that embeds proto file names relative to the proto dir and not the top level repo root. This resulted in proto file name conflicts in the Go global protobuf type registry. The solution to that was to add in a private/ directory into the path within the proto/ directory. That then required rewriting all the imports. Is this safe? AFAICT yes The gRPC wire protocol doesn't seem to care about the proto file names (although the Go grpc code does tack on the proto file name as Metadata in the ServiceDesc) Other than imports, there were no changes to any generated code as a result of this. --- GNUmakefile | 10 +- agent/agent.go | 4 +- agent/agent_test.go | 2 +- agent/auto-config/auto_config.go | 2 +- agent/auto-config/auto_config_test.go | 4 +- agent/auto-config/config_translate.go | 6 +- agent/auto-config/config_translate_test.go | 4 +- agent/auto-config/mock_test.go | 2 +- agent/auto-config/persist.go | 2 +- agent/auto-config/tls.go | 4 +- agent/cache-types/mock_PeeringLister_test.go | 2 +- .../mock_TrustBundleLister_test.go | 2 +- .../mock_TrustBundleReader_test.go | 2 +- agent/cache-types/peerings.go | 2 +- agent/cache-types/peerings_test.go | 2 +- agent/cache-types/trust_bundle.go | 2 +- agent/cache-types/trust_bundle_test.go | 2 +- agent/cache-types/trust_bundles.go | 2 +- agent/cache-types/trust_bundles_test.go | 2 +- agent/config/runtime_test.go | 2 +- agent/consul/auto_config_endpoint.go | 6 +- agent/consul/auto_config_endpoint_test.go | 8 +- .../autopilotevents/ready_servers_events.go | 2 +- .../ready_servers_events_test.go | 2 +- agent/consul/fsm/commands_oss.go | 2 +- agent/consul/fsm/snapshot_oss.go | 2 +- agent/consul/fsm/snapshot_test.go | 4 +- agent/consul/internal_endpoint_test.go | 2 +- agent/consul/leader_peering.go | 4 +- agent/consul/leader_peering_test.go | 2 +- agent/consul/operator_backend.go | 3 +- agent/consul/operator_backend_test.go | 16 +- agent/consul/peering_backend.go | 2 +- agent/consul/peering_backend_oss_test.go | 2 +- agent/consul/peering_backend_test.go | 4 +- agent/consul/prepared_query_endpoint_test.go | 2 +- agent/consul/rpc_test.go | 2 +- agent/consul/server.go | 2 +- agent/consul/state/acl.go | 2 +- agent/consul/state/acl_test.go | 2 +- agent/consul/state/catalog_events.go | 6 +- agent/consul/state/catalog_events_test.go | 4 +- agent/consul/state/config_entry_events.go | 4 +- .../consul/state/config_entry_events_test.go | 2 +- agent/consul/state/connect_ca_events.go | 2 +- agent/consul/state/connect_ca_test.go | 2 +- agent/consul/state/events.go | 2 +- agent/consul/state/events_test.go | 2 +- agent/consul/state/memdb.go | 2 +- agent/consul/state/peering.go | 2 +- agent/consul/state/peering_oss.go | 2 +- agent/consul/state/peering_oss_test.go | 2 +- agent/consul/state/peering_test.go | 4 +- agent/consul/state/schema_test.go | 2 +- agent/consul/state/state_store_test.go | 2 +- agent/consul/state/store_integration_test.go | 2 +- agent/consul/stream/event.go | 2 +- agent/consul/stream/event_publisher_test.go | 2 +- agent/consul/subscribe_backend_test.go | 4 +- .../usagemetrics/usagemetrics_oss_test.go | 2 +- .../builtin/aws-lambda/aws_lambda_test.go | 2 +- .../services/peerstream/replication.go | 8 +- .../services/peerstream/server.go | 4 +- .../services/peerstream/server_test.go | 4 +- .../services/peerstream/stream_resources.go | 4 +- .../services/peerstream/stream_test.go | 12 +- .../peerstream/subscription_blocking.go | 2 +- .../peerstream/subscription_manager.go | 8 +- .../peerstream/subscription_manager_test.go | 10 +- .../services/peerstream/subscription_state.go | 2 +- .../peerstream/subscription_state_test.go | 2 +- .../services/peerstream/subscription_view.go | 4 +- .../peerstream/subscription_view_test.go | 4 +- .../services/peerstream/testing.go | 2 +- .../serverdiscovery/watch_servers_test.go | 2 +- agent/grpc-external/stats_test.go | 2 +- .../services/subscribe/logger.go | 2 +- .../services/subscribe/subscribe.go | 2 +- .../services/subscribe/subscribe_test.go | 8 +- agent/grpc-internal/stats_test.go | 2 +- .../testutil/testservice/simple.pb.binary.go | 2 +- .../testutil/testservice/simple.pb.go | 125 +- .../testutil/testservice/simple_grpc.pb.go | 4 +- agent/http.go | 2 +- agent/operator_endpoint.go | 2 +- agent/peering_endpoint.go | 2 +- agent/peering_endpoint_oss_test.go | 2 +- agent/peering_endpoint_test.go | 2 +- agent/pool/pool.go | 2 +- agent/proxycfg-glue/config_entry.go | 6 +- agent/proxycfg-glue/config_entry_test.go | 4 +- .../exported_peered_services_test.go | 2 +- agent/proxycfg-glue/glue.go | 2 +- agent/proxycfg-glue/health_test.go | 2 +- agent/proxycfg-glue/intentions.go | 2 +- agent/proxycfg-glue/intentions_ent_test.go | 2 +- agent/proxycfg-glue/intentions_oss.go | 2 +- agent/proxycfg-glue/intentions_test.go | 2 +- agent/proxycfg-glue/peering_list.go | 2 +- agent/proxycfg-glue/peering_list_test.go | 2 +- agent/proxycfg-glue/service_list.go | 4 +- agent/proxycfg-glue/service_list_test.go | 2 +- agent/proxycfg-glue/trust_bundle.go | 2 +- agent/proxycfg-glue/trust_bundle_test.go | 2 +- agent/proxycfg/api_gateway.go | 2 +- agent/proxycfg/connect_proxy.go | 2 +- agent/proxycfg/ingress_gateway.go | 2 +- agent/proxycfg/manager_test.go | 2 +- agent/proxycfg/mesh_gateway.go | 2 +- agent/proxycfg/proxycfg.deepcopy.go | 2 +- agent/proxycfg/snapshot.go | 2 +- agent/proxycfg/snapshot_test.go | 2 +- agent/proxycfg/state_test.go | 4 +- agent/proxycfg/testing.go | 2 +- agent/proxycfg/testing_mesh_gateway.go | 2 +- agent/proxycfg/testing_peering.go | 2 +- agent/proxycfg/testing_upstreams.go | 2 +- agent/proxycfg/upstreams.go | 2 +- agent/rpc/operator/service.go | 3 +- agent/rpc/operator/service_test.go | 3 +- agent/rpc/peering/service.go | 4 +- agent/rpc/peering/service_oss_test.go | 2 +- agent/rpc/peering/service_test.go | 4 +- agent/rpc/peering/testing.go | 2 +- agent/rpcclient/health/health.go | 2 +- agent/rpcclient/health/streaming_test.go | 2 +- agent/rpcclient/health/view.go | 4 +- agent/rpcclient/health/view_test.go | 8 +- agent/structs/structs_ext_test.go | 2 +- agent/submatview/handler.go | 2 +- agent/submatview/local_materializer.go | 2 +- agent/submatview/local_materializer_test.go | 2 +- agent/submatview/materializer.go | 2 +- agent/submatview/rpc_materializer.go | 2 +- agent/submatview/store_integration_test.go | 2 +- agent/submatview/store_test.go | 6 +- agent/submatview/streaming_test.go | 6 +- agent/ui_endpoint_test.go | 2 +- agent/xds/clusters.go | 2 +- agent/xds/listeners.go | 2 +- agent/xds/rbac.go | 2 +- agent/xds/rbac_test.go | 2 +- buf.work.yaml | 5 + build-support/scripts/protobuf.sh | 22 +- connect/tls_test.go | 2 +- .../tools/proto-gen-rpc-glue/e2e/source.pb.go | 2 +- .../postprocess/main.go | 36 +- .../ratelimit/ratelimit.pb.binary.go | 2 +- .../annotations/ratelimit/ratelimit.pb.go | 167 +- proto-public/buf.gen.yaml | 8 +- proto-public/buf.yaml | 1 + proto-public/pbacl/acl.pb.binary.go | 2 +- proto-public/pbacl/acl.pb.go | 218 +- proto-public/pbacl/acl.proto | 10 +- proto-public/pbacl/acl_grpc.pb.go | 4 +- proto-public/pbconnectca/ca.pb.binary.go | 2 +- proto-public/pbconnectca/ca.pb.go | 230 +- proto-public/pbconnectca/ca.proto | 10 +- proto-public/pbconnectca/ca_grpc.pb.go | 4 +- .../pbdataplane/dataplane.pb.binary.go | 2 +- proto-public/pbdataplane/dataplane.pb.go | 360 ++- proto-public/pbdataplane/dataplane.proto | 10 +- proto-public/pbdataplane/dataplane_grpc.pb.go | 4 +- proto-public/pbdns/dns.pb.binary.go | 2 +- proto-public/pbdns/dns.pb.go | 150 +- proto-public/pbdns/dns.proto | 6 +- proto-public/pbdns/dns_grpc.pb.go | 4 +- .../serverdiscovery.pb.binary.go | 2 +- .../pbserverdiscovery/serverdiscovery.pb.go | 172 +- .../pbserverdiscovery/serverdiscovery.proto | 6 +- .../serverdiscovery_grpc.pb.go | 4 +- proto/buf.gen.yaml | 10 +- proto/pbacl/acl.pb.go | 167 - proto/pboperator/operator.pb.go | 247 -- proto/pbstatus/status.pb.go | 211 -- proto/{ => private}/pbacl/acl.go | 0 proto/{ => private}/pbacl/acl.pb.binary.go | 2 +- proto/private/pbacl/acl.pb.go | 168 + proto/{ => private}/pbacl/acl.proto | 0 proto/{ => private}/pbautoconf/auto_config.go | 0 .../pbautoconf/auto_config.pb.binary.go | 2 +- .../pbautoconf/auto_config.pb.go | 181 +- .../pbautoconf/auto_config.proto | 4 +- .../pbautoconf/auto_config_oss.go | 0 proto/{ => private}/pbcommon/common.gen.go | 0 proto/{ => private}/pbcommon/common.go | 0 .../pbcommon/common.pb.binary.go | 2 +- proto/{ => private}/pbcommon/common.pb.go | 309 +- proto/{ => private}/pbcommon/common.proto | 0 proto/{ => private}/pbcommon/common_oss.go | 0 .../pbcommon/convert_pbstruct.go | 0 .../pbcommon/convert_pbstruct_test.go | 0 .../pbconfig/config.pb.binary.go | 2 +- proto/{ => private}/pbconfig/config.pb.go | 385 +-- proto/{ => private}/pbconfig/config.proto | 0 .../pbconfigentry/config_entry.gen.go | 0 .../pbconfigentry/config_entry.go | 2 +- .../pbconfigentry/config_entry.pb.binary.go | 2 +- .../pbconfigentry/config_entry.pb.go | 2730 ++++++++--------- .../pbconfigentry/config_entry.proto | 2 +- proto/{ => private}/pbconnect/connect.gen.go | 0 proto/{ => private}/pbconnect/connect.go | 2 +- .../pbconnect/connect.pb.binary.go | 2 +- proto/{ => private}/pbconnect/connect.pb.go | 305 +- proto/{ => private}/pbconnect/connect.proto | 2 +- .../{ => private}/pboperator/operator.gen.go | 0 .../pboperator/operator.pb.binary.go | 2 +- proto/private/pboperator/operator.pb.go | 247 ++ proto/{ => private}/pboperator/operator.proto | 6 +- .../pboperator/operator_grpc.pb.go | 4 +- proto/{ => private}/pbpeering/peering.gen.go | 0 proto/{ => private}/pbpeering/peering.go | 0 .../pbpeering/peering.pb.binary.go | 2 +- proto/{ => private}/pbpeering/peering.pb.go | 1127 ++++--- proto/{ => private}/pbpeering/peering.proto | 34 +- .../pbpeering/peering.rpcglue.pb.go | 0 .../pbpeering/peering_grpc.pb.go | 4 +- proto/{ => private}/pbpeering/peering_oss.go | 0 proto/{ => private}/pbpeerstream/convert.go | 2 +- .../{ => private}/pbpeerstream/peerstream.go | 0 .../pbpeerstream/peerstream.pb.binary.go | 2 +- .../pbpeerstream/peerstream.pb.go | 448 +-- .../pbpeerstream/peerstream.proto | 16 +- .../pbpeerstream/peerstream_grpc.pb.go | 4 +- proto/{ => private}/pbpeerstream/types.go | 0 proto/{ => private}/pbservice/convert.go | 2 +- proto/{ => private}/pbservice/convert_oss.go | 2 +- .../pbservice/convert_oss_test.go | 0 proto/{ => private}/pbservice/convert_test.go | 0 .../pbservice/healthcheck.gen.go | 0 .../pbservice/healthcheck.pb.binary.go | 2 +- .../{ => private}/pbservice/healthcheck.pb.go | 503 +-- .../{ => private}/pbservice/healthcheck.proto | 2 +- proto/{ => private}/pbservice/ids.go | 0 proto/{ => private}/pbservice/ids_test.go | 2 +- proto/{ => private}/pbservice/node.gen.go | 0 .../{ => private}/pbservice/node.pb.binary.go | 2 +- proto/{ => private}/pbservice/node.pb.go | 351 +-- proto/{ => private}/pbservice/node.proto | 6 +- proto/{ => private}/pbservice/service.gen.go | 0 .../pbservice/service.pb.binary.go | 2 +- proto/{ => private}/pbservice/service.pb.go | 647 ++-- proto/{ => private}/pbservice/service.proto | 4 +- .../pbstatus/status.pb.binary.go | 2 +- proto/private/pbstatus/status.pb.go | 212 ++ proto/{ => private}/pbstatus/status.proto | 0 proto/{ => private}/pbsubscribe/subscribe.go | 0 .../pbsubscribe/subscribe.pb.binary.go | 2 +- .../{ => private}/pbsubscribe/subscribe.pb.go | 418 +-- .../{ => private}/pbsubscribe/subscribe.proto | 14 +- .../pbsubscribe/subscribe_grpc.pb.go | 4 +- proto/{ => private}/prototest/testing.go | 0 tlsutil/config.go | 2 +- 253 files changed, 5379 insertions(+), 5432 deletions(-) create mode 100644 buf.work.yaml delete mode 100644 proto/pbacl/acl.pb.go delete mode 100644 proto/pboperator/operator.pb.go delete mode 100644 proto/pbstatus/status.pb.go rename proto/{ => private}/pbacl/acl.go (100%) rename proto/{ => private}/pbacl/acl.pb.binary.go (91%) create mode 100644 proto/private/pbacl/acl.pb.go rename proto/{ => private}/pbacl/acl.proto (100%) rename proto/{ => private}/pbautoconf/auto_config.go (100%) rename proto/{ => private}/pbautoconf/auto_config.pb.binary.go (93%) rename proto/{ => private}/pbautoconf/auto_config.pb.go (50%) rename proto/{ => private}/pbautoconf/auto_config.proto (95%) rename proto/{ => private}/pbautoconf/auto_config_oss.go (100%) rename proto/{ => private}/pbcommon/common.gen.go (100%) rename proto/{ => private}/pbcommon/common.go (100%) rename proto/{ => private}/pbcommon/common.pb.binary.go (98%) rename proto/{ => private}/pbcommon/common.pb.go (63%) rename proto/{ => private}/pbcommon/common.proto (100%) rename proto/{ => private}/pbcommon/common_oss.go (100%) rename proto/{ => private}/pbcommon/convert_pbstruct.go (100%) rename proto/{ => private}/pbcommon/convert_pbstruct_test.go (100%) rename proto/{ => private}/pbconfig/config.pb.binary.go (98%) rename proto/{ => private}/pbconfig/config.pb.go (56%) rename proto/{ => private}/pbconfig/config.proto (100%) rename proto/{ => private}/pbconfigentry/config_entry.gen.go (100%) rename proto/{ => private}/pbconfigentry/config_entry.go (99%) rename proto/{ => private}/pbconfigentry/config_entry.pb.binary.go (99%) rename proto/{ => private}/pbconfigentry/config_entry.pb.go (65%) rename proto/{ => private}/pbconfigentry/config_entry.proto (99%) rename proto/{ => private}/pbconnect/connect.gen.go (100%) rename proto/{ => private}/pbconnect/connect.go (97%) rename proto/{ => private}/pbconnect/connect.pb.binary.go (95%) rename proto/{ => private}/pbconnect/connect.pb.go (60%) rename proto/{ => private}/pbconnect/connect.proto (99%) rename proto/{ => private}/pboperator/operator.gen.go (100%) rename proto/{ => private}/pboperator/operator.pb.binary.go (94%) create mode 100644 proto/private/pboperator/operator.pb.go rename proto/{ => private}/pboperator/operator.proto (76%) rename proto/{ => private}/pboperator/operator_grpc.pb.go (97%) rename proto/{ => private}/pbpeering/peering.gen.go (100%) rename proto/{ => private}/pbpeering/peering.go (100%) rename proto/{ => private}/pbpeering/peering.pb.binary.go (99%) rename proto/{ => private}/pbpeering/peering.pb.go (66%) rename proto/{ => private}/pbpeering/peering.proto (93%) rename proto/{ => private}/pbpeering/peering.rpcglue.pb.go (100%) rename proto/{ => private}/pbpeering/peering_grpc.pb.go (99%) rename proto/{ => private}/pbpeering/peering_oss.go (100%) rename proto/{ => private}/pbpeerstream/convert.go (93%) rename proto/{ => private}/pbpeerstream/peerstream.go (100%) rename proto/{ => private}/pbpeerstream/peerstream.pb.binary.go (98%) rename proto/{ => private}/pbpeerstream/peerstream.pb.go (59%) rename proto/{ => private}/pbpeerstream/peerstream.proto (92%) rename proto/{ => private}/pbpeerstream/peerstream_grpc.pb.go (98%) rename proto/{ => private}/pbpeerstream/types.go (100%) rename proto/{ => private}/pbservice/convert.go (99%) rename proto/{ => private}/pbservice/convert_oss.go (86%) rename proto/{ => private}/pbservice/convert_oss_test.go (100%) rename proto/{ => private}/pbservice/convert_test.go (100%) rename proto/{ => private}/pbservice/healthcheck.gen.go (100%) rename proto/{ => private}/pbservice/healthcheck.pb.binary.go (96%) rename proto/{ => private}/pbservice/healthcheck.pb.go (56%) rename proto/{ => private}/pbservice/healthcheck.proto (99%) rename proto/{ => private}/pbservice/ids.go (100%) rename proto/{ => private}/pbservice/ids_test.go (98%) rename proto/{ => private}/pbservice/node.gen.go (100%) rename proto/{ => private}/pbservice/node.pb.binary.go (97%) rename proto/{ => private}/pbservice/node.pb.go (59%) rename proto/{ => private}/pbservice/node.proto (97%) rename proto/{ => private}/pbservice/service.gen.go (100%) rename proto/{ => private}/pbservice/service.pb.binary.go (98%) rename proto/{ => private}/pbservice/service.pb.go (62%) rename proto/{ => private}/pbservice/service.proto (99%) rename proto/{ => private}/pbstatus/status.pb.binary.go (90%) create mode 100644 proto/private/pbstatus/status.pb.go rename proto/{ => private}/pbstatus/status.proto (100%) rename proto/{ => private}/pbsubscribe/subscribe.go (100%) rename proto/{ => private}/pbsubscribe/subscribe.pb.binary.go (97%) rename proto/{ => private}/pbsubscribe/subscribe.pb.go (61%) rename proto/{ => private}/pbsubscribe/subscribe.proto (95%) rename proto/{ => private}/pbsubscribe/subscribe_grpc.pb.go (98%) rename proto/{ => private}/prototest/testing.go (100%) diff --git a/GNUmakefile b/GNUmakefile index ee765693f4a..9a68a484c11 100644 --- a/GNUmakefile +++ b/GNUmakefile @@ -9,7 +9,8 @@ SHELL = bash ### GOLANGCI_LINT_VERSION='v1.51.1' MOCKERY_VERSION='v2.20.0' -BUF_VERSION='v1.4.0' +BUF_VERSION='v1.14.0' + PROTOC_GEN_GO_GRPC_VERSION="v1.2.0" MOG_VERSION='v0.4.0' PROTOC_GO_INJECT_TAG_VERSION='v1.3.0' @@ -495,12 +496,11 @@ proto-format: proto-tools .PHONY: proto-lint proto-lint: proto-tools - @buf lint --config proto/buf.yaml --path proto - @buf lint --config proto-public/buf.yaml --path proto-public + @buf lint @for fn in $$(find proto -name '*.proto'); do \ - if [[ "$$fn" = "proto/pbsubscribe/subscribe.proto" ]]; then \ + if [[ "$$fn" = "proto/private/pbsubscribe/subscribe.proto" ]]; then \ continue ; \ - elif [[ "$$fn" = "proto/pbpartition/partition.proto" ]]; then \ + elif [[ "$$fn" = "proto/private/pbpartition/partition.proto" ]]; then \ continue ; \ fi ; \ pkg=$$(grep "^package " "$$fn" | sed 's/^package \(.*\);/\1/'); \ diff --git a/agent/agent.go b/agent/agent.go index bff47a0fcf2..c10537fd82b 100644 --- a/agent/agent.go +++ b/agent/agent.go @@ -64,8 +64,8 @@ import ( "github.com/hashicorp/consul/lib/mutex" "github.com/hashicorp/consul/lib/routine" "github.com/hashicorp/consul/logging" - "github.com/hashicorp/consul/proto/pboperator" - "github.com/hashicorp/consul/proto/pbpeering" + "github.com/hashicorp/consul/proto/private/pboperator" + "github.com/hashicorp/consul/proto/private/pbpeering" "github.com/hashicorp/consul/tlsutil" "github.com/hashicorp/consul/types" ) diff --git a/agent/agent_test.go b/agent/agent_test.go index bcc57cf41e0..ad2be987b5f 100644 --- a/agent/agent_test.go +++ b/agent/agent_test.go @@ -54,7 +54,7 @@ import ( "github.com/hashicorp/consul/internal/go-sso/oidcauth/oidcauthtest" "github.com/hashicorp/consul/ipaddr" "github.com/hashicorp/consul/lib" - "github.com/hashicorp/consul/proto/pbautoconf" + "github.com/hashicorp/consul/proto/private/pbautoconf" "github.com/hashicorp/consul/sdk/freeport" "github.com/hashicorp/consul/sdk/testutil" "github.com/hashicorp/consul/sdk/testutil/retry" diff --git a/agent/auto-config/auto_config.go b/agent/auto-config/auto_config.go index df4fe3d29df..022240c19ad 100644 --- a/agent/auto-config/auto_config.go +++ b/agent/auto-config/auto_config.go @@ -14,7 +14,7 @@ import ( "github.com/hashicorp/consul/agent/token" "github.com/hashicorp/consul/lib/retry" "github.com/hashicorp/consul/logging" - "github.com/hashicorp/consul/proto/pbautoconf" + "github.com/hashicorp/consul/proto/private/pbautoconf" ) // AutoConfig is all the state necessary for being able to parse a configuration diff --git a/agent/auto-config/auto_config_test.go b/agent/auto-config/auto_config_test.go index 4834fcaac51..b364a4fbd1f 100644 --- a/agent/auto-config/auto_config_test.go +++ b/agent/auto-config/auto_config_test.go @@ -22,8 +22,8 @@ import ( "github.com/hashicorp/consul/agent/structs" "github.com/hashicorp/consul/agent/token" "github.com/hashicorp/consul/lib/retry" - "github.com/hashicorp/consul/proto/pbautoconf" - "github.com/hashicorp/consul/proto/pbconfig" + "github.com/hashicorp/consul/proto/private/pbautoconf" + "github.com/hashicorp/consul/proto/private/pbconfig" "github.com/hashicorp/consul/sdk/testutil" testretry "github.com/hashicorp/consul/sdk/testutil/retry" ) diff --git a/agent/auto-config/config_translate.go b/agent/auto-config/config_translate.go index c5c3606a906..b5cb759b813 100644 --- a/agent/auto-config/config_translate.go +++ b/agent/auto-config/config_translate.go @@ -3,9 +3,9 @@ package autoconf import ( "github.com/hashicorp/consul/agent/config" "github.com/hashicorp/consul/agent/structs" - "github.com/hashicorp/consul/proto/pbautoconf" - "github.com/hashicorp/consul/proto/pbconfig" - "github.com/hashicorp/consul/proto/pbconnect" + "github.com/hashicorp/consul/proto/private/pbautoconf" + "github.com/hashicorp/consul/proto/private/pbconfig" + "github.com/hashicorp/consul/proto/private/pbconnect" "github.com/hashicorp/consul/types" ) diff --git a/agent/auto-config/config_translate_test.go b/agent/auto-config/config_translate_test.go index e48eebf312c..ce73e3b71d8 100644 --- a/agent/auto-config/config_translate_test.go +++ b/agent/auto-config/config_translate_test.go @@ -7,8 +7,8 @@ import ( "github.com/hashicorp/consul/agent/config" "github.com/hashicorp/consul/agent/structs" - pbconfig "github.com/hashicorp/consul/proto/pbconfig" - "github.com/hashicorp/consul/proto/pbconnect" + pbconfig "github.com/hashicorp/consul/proto/private/pbconfig" + "github.com/hashicorp/consul/proto/private/pbconnect" ) func stringPointer(s string) *string { diff --git a/agent/auto-config/mock_test.go b/agent/auto-config/mock_test.go index 1ff53bc6291..8c2f2f7ecba 100644 --- a/agent/auto-config/mock_test.go +++ b/agent/auto-config/mock_test.go @@ -15,7 +15,7 @@ import ( "github.com/hashicorp/consul/agent/metadata" "github.com/hashicorp/consul/agent/structs" "github.com/hashicorp/consul/agent/token" - "github.com/hashicorp/consul/proto/pbautoconf" + "github.com/hashicorp/consul/proto/private/pbautoconf" "github.com/hashicorp/consul/sdk/testutil" ) diff --git a/agent/auto-config/persist.go b/agent/auto-config/persist.go index f75c0f376bf..fcfd8cdb857 100644 --- a/agent/auto-config/persist.go +++ b/agent/auto-config/persist.go @@ -5,7 +5,7 @@ import ( "os" "path/filepath" - "github.com/hashicorp/consul/proto/pbautoconf" + "github.com/hashicorp/consul/proto/private/pbautoconf" "google.golang.org/protobuf/encoding/protojson" ) diff --git a/agent/auto-config/tls.go b/agent/auto-config/tls.go index e8a59d19f99..a26f7aaa6a0 100644 --- a/agent/auto-config/tls.go +++ b/agent/auto-config/tls.go @@ -9,8 +9,8 @@ import ( cachetype "github.com/hashicorp/consul/agent/cache-types" "github.com/hashicorp/consul/agent/connect" "github.com/hashicorp/consul/agent/structs" - "github.com/hashicorp/consul/proto/pbautoconf" - "github.com/hashicorp/consul/proto/pbconnect" + "github.com/hashicorp/consul/proto/private/pbautoconf" + "github.com/hashicorp/consul/proto/private/pbconnect" ) const ( diff --git a/agent/cache-types/mock_PeeringLister_test.go b/agent/cache-types/mock_PeeringLister_test.go index c9141e28a44..b881b0b80b8 100644 --- a/agent/cache-types/mock_PeeringLister_test.go +++ b/agent/cache-types/mock_PeeringLister_test.go @@ -9,7 +9,7 @@ import ( mock "github.com/stretchr/testify/mock" - pbpeering "github.com/hashicorp/consul/proto/pbpeering" + pbpeering "github.com/hashicorp/consul/proto/private/pbpeering" ) // MockPeeringLister is an autogenerated mock type for the PeeringLister type diff --git a/agent/cache-types/mock_TrustBundleLister_test.go b/agent/cache-types/mock_TrustBundleLister_test.go index 4fde13129d6..08bc5933712 100644 --- a/agent/cache-types/mock_TrustBundleLister_test.go +++ b/agent/cache-types/mock_TrustBundleLister_test.go @@ -9,7 +9,7 @@ import ( mock "github.com/stretchr/testify/mock" - pbpeering "github.com/hashicorp/consul/proto/pbpeering" + pbpeering "github.com/hashicorp/consul/proto/private/pbpeering" ) // MockTrustBundleLister is an autogenerated mock type for the TrustBundleLister type diff --git a/agent/cache-types/mock_TrustBundleReader_test.go b/agent/cache-types/mock_TrustBundleReader_test.go index 119f246fb1b..6394b32e000 100644 --- a/agent/cache-types/mock_TrustBundleReader_test.go +++ b/agent/cache-types/mock_TrustBundleReader_test.go @@ -9,7 +9,7 @@ import ( mock "github.com/stretchr/testify/mock" - pbpeering "github.com/hashicorp/consul/proto/pbpeering" + pbpeering "github.com/hashicorp/consul/proto/private/pbpeering" ) // MockTrustBundleReader is an autogenerated mock type for the TrustBundleReader type diff --git a/agent/cache-types/peerings.go b/agent/cache-types/peerings.go index 7ecbb183e87..ebff1e90ccb 100644 --- a/agent/cache-types/peerings.go +++ b/agent/cache-types/peerings.go @@ -7,7 +7,7 @@ import ( "time" external "github.com/hashicorp/consul/agent/grpc-external" - "github.com/hashicorp/consul/proto/pbpeering" + "github.com/hashicorp/consul/proto/private/pbpeering" "github.com/mitchellh/hashstructure" "google.golang.org/grpc" "google.golang.org/grpc/codes" diff --git a/agent/cache-types/peerings_test.go b/agent/cache-types/peerings_test.go index e96e6256e93..6def5badd9d 100644 --- a/agent/cache-types/peerings_test.go +++ b/agent/cache-types/peerings_test.go @@ -13,7 +13,7 @@ import ( grpcstatus "google.golang.org/grpc/status" "github.com/hashicorp/consul/agent/cache" - "github.com/hashicorp/consul/proto/pbpeering" + "github.com/hashicorp/consul/proto/private/pbpeering" ) func TestPeerings(t *testing.T) { diff --git a/agent/cache-types/trust_bundle.go b/agent/cache-types/trust_bundle.go index addc65ac94c..f63d60889b0 100644 --- a/agent/cache-types/trust_bundle.go +++ b/agent/cache-types/trust_bundle.go @@ -12,7 +12,7 @@ import ( "github.com/hashicorp/consul/agent/cache" external "github.com/hashicorp/consul/agent/grpc-external" "github.com/hashicorp/consul/agent/structs" - "github.com/hashicorp/consul/proto/pbpeering" + "github.com/hashicorp/consul/proto/private/pbpeering" ) // Recommended name for registration. diff --git a/agent/cache-types/trust_bundle_test.go b/agent/cache-types/trust_bundle_test.go index ea36e8d8a7c..67cf7d5b4dc 100644 --- a/agent/cache-types/trust_bundle_test.go +++ b/agent/cache-types/trust_bundle_test.go @@ -9,7 +9,7 @@ import ( "github.com/stretchr/testify/require" "github.com/hashicorp/consul/agent/cache" - "github.com/hashicorp/consul/proto/pbpeering" + "github.com/hashicorp/consul/proto/private/pbpeering" ) func TestTrustBundle(t *testing.T) { diff --git a/agent/cache-types/trust_bundles.go b/agent/cache-types/trust_bundles.go index 47f411f02fe..49a1dfde0b6 100644 --- a/agent/cache-types/trust_bundles.go +++ b/agent/cache-types/trust_bundles.go @@ -14,7 +14,7 @@ import ( "github.com/hashicorp/consul/agent/cache" external "github.com/hashicorp/consul/agent/grpc-external" "github.com/hashicorp/consul/agent/structs" - "github.com/hashicorp/consul/proto/pbpeering" + "github.com/hashicorp/consul/proto/private/pbpeering" ) // Recommended name for registration. diff --git a/agent/cache-types/trust_bundles_test.go b/agent/cache-types/trust_bundles_test.go index 733becdd60b..ed177f8b990 100644 --- a/agent/cache-types/trust_bundles_test.go +++ b/agent/cache-types/trust_bundles_test.go @@ -11,7 +11,7 @@ import ( grpcstatus "google.golang.org/grpc/status" "github.com/hashicorp/consul/agent/cache" - "github.com/hashicorp/consul/proto/pbpeering" + "github.com/hashicorp/consul/proto/private/pbpeering" ) func TestTrustBundles(t *testing.T) { diff --git a/agent/config/runtime_test.go b/agent/config/runtime_test.go index 2954dee6700..2844dd3a7f3 100644 --- a/agent/config/runtime_test.go +++ b/agent/config/runtime_test.go @@ -33,7 +33,7 @@ import ( "github.com/hashicorp/consul/agent/token" "github.com/hashicorp/consul/lib" "github.com/hashicorp/consul/logging" - "github.com/hashicorp/consul/proto/prototest" + "github.com/hashicorp/consul/proto/private/prototest" "github.com/hashicorp/consul/sdk/testutil" "github.com/hashicorp/consul/tlsutil" "github.com/hashicorp/consul/types" diff --git a/agent/consul/auto_config_endpoint.go b/agent/consul/auto_config_endpoint.go index e33fb19d49e..c44206e6768 100644 --- a/agent/consul/auto_config_endpoint.go +++ b/agent/consul/auto_config_endpoint.go @@ -16,9 +16,9 @@ import ( "github.com/hashicorp/consul/agent/dns" "github.com/hashicorp/consul/agent/structs" "github.com/hashicorp/consul/lib/template" - "github.com/hashicorp/consul/proto/pbautoconf" - "github.com/hashicorp/consul/proto/pbconfig" - "github.com/hashicorp/consul/proto/pbconnect" + "github.com/hashicorp/consul/proto/private/pbautoconf" + "github.com/hashicorp/consul/proto/private/pbconfig" + "github.com/hashicorp/consul/proto/private/pbconnect" "github.com/hashicorp/consul/tlsutil" ) diff --git a/agent/consul/auto_config_endpoint_test.go b/agent/consul/auto_config_endpoint_test.go index 1f0f8e18a1c..12b99282dec 100644 --- a/agent/consul/auto_config_endpoint_test.go +++ b/agent/consul/auto_config_endpoint_test.go @@ -23,10 +23,10 @@ import ( "github.com/hashicorp/consul/agent/connect" "github.com/hashicorp/consul/agent/structs" "github.com/hashicorp/consul/internal/go-sso/oidcauth/oidcauthtest" - "github.com/hashicorp/consul/proto/pbautoconf" - "github.com/hashicorp/consul/proto/pbconfig" - "github.com/hashicorp/consul/proto/pbconnect" - "github.com/hashicorp/consul/proto/prototest" + "github.com/hashicorp/consul/proto/private/pbautoconf" + "github.com/hashicorp/consul/proto/private/pbconfig" + "github.com/hashicorp/consul/proto/private/pbconnect" + "github.com/hashicorp/consul/proto/private/prototest" "github.com/hashicorp/consul/sdk/testutil" "github.com/hashicorp/consul/tlsutil" "github.com/hashicorp/consul/types" diff --git a/agent/consul/autopilotevents/ready_servers_events.go b/agent/consul/autopilotevents/ready_servers_events.go index 862959a1271..9b4e2af2a80 100644 --- a/agent/consul/autopilotevents/ready_servers_events.go +++ b/agent/consul/autopilotevents/ready_servers_events.go @@ -14,7 +14,7 @@ import ( "github.com/hashicorp/consul/acl" "github.com/hashicorp/consul/agent/consul/stream" "github.com/hashicorp/consul/agent/structs" - "github.com/hashicorp/consul/proto/pbsubscribe" + "github.com/hashicorp/consul/proto/private/pbsubscribe" "github.com/hashicorp/consul/types" ) diff --git a/agent/consul/autopilotevents/ready_servers_events_test.go b/agent/consul/autopilotevents/ready_servers_events_test.go index aedf25c4d99..6944177e473 100644 --- a/agent/consul/autopilotevents/ready_servers_events_test.go +++ b/agent/consul/autopilotevents/ready_servers_events_test.go @@ -13,7 +13,7 @@ import ( "github.com/hashicorp/consul/acl" "github.com/hashicorp/consul/agent/consul/stream" structs "github.com/hashicorp/consul/agent/structs" - "github.com/hashicorp/consul/proto/pbsubscribe" + "github.com/hashicorp/consul/proto/private/pbsubscribe" types "github.com/hashicorp/consul/types" ) diff --git a/agent/consul/fsm/commands_oss.go b/agent/consul/fsm/commands_oss.go index 0fb7d694f55..5d6f8c2a49b 100644 --- a/agent/consul/fsm/commands_oss.go +++ b/agent/consul/fsm/commands_oss.go @@ -10,7 +10,7 @@ import ( "github.com/hashicorp/consul/agent/consul/state" "github.com/hashicorp/consul/agent/structs" "github.com/hashicorp/consul/api" - "github.com/hashicorp/consul/proto/pbpeering" + "github.com/hashicorp/consul/proto/private/pbpeering" ) var CommandsSummaries = []prometheus.SummaryDefinition{ diff --git a/agent/consul/fsm/snapshot_oss.go b/agent/consul/fsm/snapshot_oss.go index 3d0cd83439b..e0bf928c838 100644 --- a/agent/consul/fsm/snapshot_oss.go +++ b/agent/consul/fsm/snapshot_oss.go @@ -10,7 +10,7 @@ import ( "github.com/hashicorp/consul/agent/consul/state" "github.com/hashicorp/consul/agent/structs" - "github.com/hashicorp/consul/proto/pbpeering" + "github.com/hashicorp/consul/proto/private/pbpeering" ) func init() { diff --git a/agent/consul/fsm/snapshot_test.go b/agent/consul/fsm/snapshot_test.go index 97fa87e4348..eea7bd63b3d 100644 --- a/agent/consul/fsm/snapshot_test.go +++ b/agent/consul/fsm/snapshot_test.go @@ -16,8 +16,8 @@ import ( "github.com/hashicorp/consul/agent/structs" "github.com/hashicorp/consul/api" "github.com/hashicorp/consul/lib/stringslice" - "github.com/hashicorp/consul/proto/pbpeering" - "github.com/hashicorp/consul/proto/prototest" + "github.com/hashicorp/consul/proto/private/pbpeering" + "github.com/hashicorp/consul/proto/private/prototest" "github.com/hashicorp/consul/sdk/testutil" ) diff --git a/agent/consul/internal_endpoint_test.go b/agent/consul/internal_endpoint_test.go index 181de4ed82c..476411eb9f4 100644 --- a/agent/consul/internal_endpoint_test.go +++ b/agent/consul/internal_endpoint_test.go @@ -19,7 +19,7 @@ import ( "github.com/hashicorp/consul/agent/structs" "github.com/hashicorp/consul/api" "github.com/hashicorp/consul/lib/stringslice" - "github.com/hashicorp/consul/proto/pbpeering" + "github.com/hashicorp/consul/proto/private/pbpeering" "github.com/hashicorp/consul/sdk/testutil" "github.com/hashicorp/consul/sdk/testutil/retry" "github.com/hashicorp/consul/testrpc" diff --git a/agent/consul/leader_peering.go b/agent/consul/leader_peering.go index 4e76c26d31d..1ba16e2ba1f 100644 --- a/agent/consul/leader_peering.go +++ b/agent/consul/leader_peering.go @@ -27,8 +27,8 @@ import ( "github.com/hashicorp/consul/agent/structs" "github.com/hashicorp/consul/api" "github.com/hashicorp/consul/logging" - "github.com/hashicorp/consul/proto/pbpeering" - "github.com/hashicorp/consul/proto/pbpeerstream" + "github.com/hashicorp/consul/proto/private/pbpeering" + "github.com/hashicorp/consul/proto/private/pbpeerstream" ) var leaderExportedServicesCountKeyDeprecated = []string{"consul", "peering", "exported_services"} diff --git a/agent/consul/leader_peering_test.go b/agent/consul/leader_peering_test.go index 143448535aa..f468d9fcd70 100644 --- a/agent/consul/leader_peering_test.go +++ b/agent/consul/leader_peering_test.go @@ -28,7 +28,7 @@ import ( "github.com/hashicorp/consul/agent/consul/state" "github.com/hashicorp/consul/agent/structs" "github.com/hashicorp/consul/api" - "github.com/hashicorp/consul/proto/pbpeering" + "github.com/hashicorp/consul/proto/private/pbpeering" "github.com/hashicorp/consul/sdk/freeport" "github.com/hashicorp/consul/sdk/testutil" "github.com/hashicorp/consul/sdk/testutil/retry" diff --git a/agent/consul/operator_backend.go b/agent/consul/operator_backend.go index 50d7e56da8b..0596d408ed1 100644 --- a/agent/consul/operator_backend.go +++ b/agent/consul/operator_backend.go @@ -2,10 +2,11 @@ package consul import ( "context" + "github.com/hashicorp/consul/acl" "github.com/hashicorp/consul/acl/resolver" "github.com/hashicorp/consul/agent/rpc/operator" - "github.com/hashicorp/consul/proto/pboperator" + "github.com/hashicorp/consul/proto/private/pboperator" "github.com/hashicorp/raft" ) diff --git a/agent/consul/operator_backend_test.go b/agent/consul/operator_backend_test.go index 0130416140f..e6bb46c61b1 100644 --- a/agent/consul/operator_backend_test.go +++ b/agent/consul/operator_backend_test.go @@ -2,14 +2,15 @@ package consul import ( "context" + "testing" + "time" + "github.com/hashicorp/consul/acl" external "github.com/hashicorp/consul/agent/grpc-external" "github.com/hashicorp/consul/agent/structs" - "github.com/hashicorp/consul/proto/pboperator" + "github.com/hashicorp/consul/proto/private/pboperator" "github.com/hashicorp/consul/sdk/testutil/retry" "google.golang.org/grpc/credentials/insecure" - "testing" - "time" "github.com/stretchr/testify/require" gogrpc "google.golang.org/grpc" @@ -124,8 +125,7 @@ func TestOperatorBackend_TransferLeaderWithACL(t *testing.T) { require.Nil(t, reply) time.Sleep(1 * time.Second) testrpc.WaitForLeader(t, s1.RPC, "dc1") - retry.Run(t, func(r *retry.R) { - time.Sleep(1 * time.Second) + retry.RunWith(&retry.Timer{Wait: time.Second, Timeout: 3 * time.Second}, t, func(r *retry.R) { afterLeader, _ := s1.raft.LeaderWithID() require.NotEmpty(r, afterLeader) if afterLeader != beforeLeader { @@ -151,8 +151,7 @@ func TestOperatorBackend_TransferLeaderWithACL(t *testing.T) { require.True(t, acl.IsErrPermissionDenied(err)) require.Nil(t, reply) testrpc.WaitForLeader(t, s1.RPC, "dc1") - retry.Run(t, func(r *retry.R) { - time.Sleep(1 * time.Second) + retry.RunWith(&retry.Timer{Wait: time.Second, Timeout: 3 * time.Second}, t, func(r *retry.R) { afterLeader, _ := s1.raft.LeaderWithID() require.NotEmpty(r, afterLeader) if afterLeader != beforeLeader { @@ -176,8 +175,7 @@ func TestOperatorBackend_TransferLeaderWithACL(t *testing.T) { require.True(t, reply.Success) time.Sleep(1 * time.Second) testrpc.WaitForLeader(t, s1.RPC, "dc1") - retry.Run(t, func(r *retry.R) { - time.Sleep(1 * time.Second) + retry.RunWith(&retry.Timer{Wait: 2 * time.Second, Timeout: 6 * time.Second}, t, func(r *retry.R) { afterLeader, _ := s1.raft.LeaderWithID() require.NotEmpty(r, afterLeader) if afterLeader == beforeLeader { diff --git a/agent/consul/peering_backend.go b/agent/consul/peering_backend.go index 7c0b7c2e542..f5ac65b52cd 100644 --- a/agent/consul/peering_backend.go +++ b/agent/consul/peering_backend.go @@ -21,7 +21,7 @@ import ( "github.com/hashicorp/consul/agent/structs" "github.com/hashicorp/consul/ipaddr" "github.com/hashicorp/consul/lib" - "github.com/hashicorp/consul/proto/pbpeering" + "github.com/hashicorp/consul/proto/private/pbpeering" ) type PeeringBackend struct { diff --git a/agent/consul/peering_backend_oss_test.go b/agent/consul/peering_backend_oss_test.go index a9305de5ffa..4e477e0d27f 100644 --- a/agent/consul/peering_backend_oss_test.go +++ b/agent/consul/peering_backend_oss_test.go @@ -13,7 +13,7 @@ import ( "github.com/hashicorp/consul/agent/connect" "github.com/hashicorp/consul/agent/structs" - "github.com/hashicorp/consul/proto/pbpeering" + "github.com/hashicorp/consul/proto/private/pbpeering" "github.com/hashicorp/consul/sdk/freeport" "github.com/hashicorp/consul/testrpc" ) diff --git a/agent/consul/peering_backend_test.go b/agent/consul/peering_backend_test.go index b7a725409bc..b5adb7c50dc 100644 --- a/agent/consul/peering_backend_test.go +++ b/agent/consul/peering_backend_test.go @@ -17,8 +17,8 @@ import ( "github.com/hashicorp/consul/agent/consul/state" "github.com/hashicorp/consul/agent/pool" "github.com/hashicorp/consul/agent/structs" - "github.com/hashicorp/consul/proto/pbpeering" - "github.com/hashicorp/consul/proto/pbpeerstream" + "github.com/hashicorp/consul/proto/private/pbpeering" + "github.com/hashicorp/consul/proto/private/pbpeerstream" "github.com/hashicorp/consul/sdk/freeport" "github.com/hashicorp/consul/sdk/testutil" "github.com/hashicorp/consul/testrpc" diff --git a/agent/consul/prepared_query_endpoint_test.go b/agent/consul/prepared_query_endpoint_test.go index 418710b8b50..d883c8bf4d3 100644 --- a/agent/consul/prepared_query_endpoint_test.go +++ b/agent/consul/prepared_query_endpoint_test.go @@ -27,7 +27,7 @@ import ( "github.com/hashicorp/consul/agent/structs/aclfilter" tokenStore "github.com/hashicorp/consul/agent/token" "github.com/hashicorp/consul/api" - "github.com/hashicorp/consul/proto/pbpeering" + "github.com/hashicorp/consul/proto/private/pbpeering" "github.com/hashicorp/consul/sdk/freeport" "github.com/hashicorp/consul/sdk/testutil/retry" "github.com/hashicorp/consul/testrpc" diff --git a/agent/consul/rpc_test.go b/agent/consul/rpc_test.go index 843dd4c1f49..0eff59b2beb 100644 --- a/agent/consul/rpc_test.go +++ b/agent/consul/rpc_test.go @@ -39,7 +39,7 @@ import ( tokenStore "github.com/hashicorp/consul/agent/token" "github.com/hashicorp/consul/api" "github.com/hashicorp/consul/lib" - "github.com/hashicorp/consul/proto/pbsubscribe" + "github.com/hashicorp/consul/proto/private/pbsubscribe" "github.com/hashicorp/consul/sdk/testutil" "github.com/hashicorp/consul/sdk/testutil/retry" "github.com/hashicorp/consul/testrpc" diff --git a/agent/consul/server.go b/agent/consul/server.go index 5a68e780b41..ea81cf96528 100644 --- a/agent/consul/server.go +++ b/agent/consul/server.go @@ -64,7 +64,7 @@ import ( "github.com/hashicorp/consul/lib" "github.com/hashicorp/consul/lib/routine" "github.com/hashicorp/consul/logging" - "github.com/hashicorp/consul/proto/pbsubscribe" + "github.com/hashicorp/consul/proto/private/pbsubscribe" "github.com/hashicorp/consul/tlsutil" "github.com/hashicorp/consul/types" cslversion "github.com/hashicorp/consul/version" diff --git a/agent/consul/state/acl.go b/agent/consul/state/acl.go index 1b7debe3690..dab6d3ba082 100644 --- a/agent/consul/state/acl.go +++ b/agent/consul/state/acl.go @@ -8,7 +8,7 @@ import ( "github.com/hashicorp/consul/acl" "github.com/hashicorp/consul/agent/structs" - "github.com/hashicorp/consul/proto/pbacl" + "github.com/hashicorp/consul/proto/private/pbacl" ) // ACLTokens is used when saving a snapshot diff --git a/agent/consul/state/acl_test.go b/agent/consul/state/acl_test.go index fc00728282a..d3edd73481d 100644 --- a/agent/consul/state/acl_test.go +++ b/agent/consul/state/acl_test.go @@ -13,7 +13,7 @@ import ( "github.com/hashicorp/consul/acl" "github.com/hashicorp/consul/agent/structs" - "github.com/hashicorp/consul/proto/pbacl" + "github.com/hashicorp/consul/proto/private/pbacl" ) const ( diff --git a/agent/consul/state/catalog_events.go b/agent/consul/state/catalog_events.go index 5fa03023e63..553fb4eef12 100644 --- a/agent/consul/state/catalog_events.go +++ b/agent/consul/state/catalog_events.go @@ -9,9 +9,9 @@ import ( "github.com/hashicorp/consul/acl" "github.com/hashicorp/consul/agent/consul/stream" "github.com/hashicorp/consul/agent/structs" - "github.com/hashicorp/consul/proto/pbcommon" - "github.com/hashicorp/consul/proto/pbservice" - "github.com/hashicorp/consul/proto/pbsubscribe" + "github.com/hashicorp/consul/proto/private/pbcommon" + "github.com/hashicorp/consul/proto/private/pbservice" + "github.com/hashicorp/consul/proto/private/pbsubscribe" ) // EventSubjectService is a stream.Subject used to route and receive events for diff --git a/agent/consul/state/catalog_events_test.go b/agent/consul/state/catalog_events_test.go index 5d1d0d1fc02..f64d7102e41 100644 --- a/agent/consul/state/catalog_events_test.go +++ b/agent/consul/state/catalog_events_test.go @@ -12,8 +12,8 @@ import ( "github.com/hashicorp/consul/agent/consul/stream" "github.com/hashicorp/consul/agent/structs" "github.com/hashicorp/consul/api" - "github.com/hashicorp/consul/proto/pbsubscribe" - "github.com/hashicorp/consul/proto/prototest" + "github.com/hashicorp/consul/proto/private/pbsubscribe" + "github.com/hashicorp/consul/proto/private/prototest" "github.com/hashicorp/consul/types" ) diff --git a/agent/consul/state/config_entry_events.go b/agent/consul/state/config_entry_events.go index c081d778b8d..4502beb0b74 100644 --- a/agent/consul/state/config_entry_events.go +++ b/agent/consul/state/config_entry_events.go @@ -6,8 +6,8 @@ import ( "github.com/hashicorp/consul/acl" "github.com/hashicorp/consul/agent/consul/stream" "github.com/hashicorp/consul/agent/structs" - "github.com/hashicorp/consul/proto/pbconfigentry" - "github.com/hashicorp/consul/proto/pbsubscribe" + "github.com/hashicorp/consul/proto/private/pbconfigentry" + "github.com/hashicorp/consul/proto/private/pbsubscribe" ) // Adding events for a new config entry kind? Remember to update ConfigEntryFromStructs and ConfigEntryToStructs. diff --git a/agent/consul/state/config_entry_events_test.go b/agent/consul/state/config_entry_events_test.go index 63c21f645b2..57e1cdb4672 100644 --- a/agent/consul/state/config_entry_events_test.go +++ b/agent/consul/state/config_entry_events_test.go @@ -7,7 +7,7 @@ import ( "github.com/hashicorp/consul/agent/consul/stream" "github.com/hashicorp/consul/agent/structs" - "github.com/hashicorp/consul/proto/pbsubscribe" + "github.com/hashicorp/consul/proto/private/pbsubscribe" ) func TestConfigEntryEventsFromChanges(t *testing.T) { diff --git a/agent/consul/state/connect_ca_events.go b/agent/consul/state/connect_ca_events.go index 36fe8ce3518..ae907af0e06 100644 --- a/agent/consul/state/connect_ca_events.go +++ b/agent/consul/state/connect_ca_events.go @@ -4,7 +4,7 @@ import ( "github.com/hashicorp/consul/acl" "github.com/hashicorp/consul/agent/consul/stream" "github.com/hashicorp/consul/agent/structs" - "github.com/hashicorp/consul/proto/pbsubscribe" + "github.com/hashicorp/consul/proto/private/pbsubscribe" ) // EventTopicCARoots is the streaming topic to which events will be published diff --git a/agent/consul/state/connect_ca_test.go b/agent/consul/state/connect_ca_test.go index 0a39e763230..44f1746f71f 100644 --- a/agent/consul/state/connect_ca_test.go +++ b/agent/consul/state/connect_ca_test.go @@ -4,7 +4,7 @@ import ( "reflect" "testing" - "github.com/hashicorp/consul/proto/prototest" + "github.com/hashicorp/consul/proto/private/prototest" "github.com/hashicorp/consul/sdk/testutil" "github.com/hashicorp/go-memdb" diff --git a/agent/consul/state/events.go b/agent/consul/state/events.go index f17f38f6576..15765a0b41f 100644 --- a/agent/consul/state/events.go +++ b/agent/consul/state/events.go @@ -6,7 +6,7 @@ import ( "github.com/hashicorp/consul/acl" "github.com/hashicorp/consul/agent/consul/stream" - "github.com/hashicorp/consul/proto/pbsubscribe" + "github.com/hashicorp/consul/proto/private/pbsubscribe" ) // PBToStreamSubscribeRequest takes a protobuf subscribe request and enterprise diff --git a/agent/consul/state/events_test.go b/agent/consul/state/events_test.go index cf231148d5c..5d3da1e0e9e 100644 --- a/agent/consul/state/events_test.go +++ b/agent/consul/state/events_test.go @@ -8,7 +8,7 @@ import ( "github.com/hashicorp/consul/acl" "github.com/hashicorp/consul/agent/consul/stream" - "github.com/hashicorp/consul/proto/pbsubscribe" + "github.com/hashicorp/consul/proto/private/pbsubscribe" ) const aclToken = "67b04fbc-e35f-494a-ad43-739f1c8b839c" diff --git a/agent/consul/state/memdb.go b/agent/consul/state/memdb.go index a0b2f116acb..02b4b489039 100644 --- a/agent/consul/state/memdb.go +++ b/agent/consul/state/memdb.go @@ -6,7 +6,7 @@ import ( "github.com/hashicorp/go-memdb" "github.com/hashicorp/consul/agent/consul/stream" - "github.com/hashicorp/consul/proto/pbsubscribe" + "github.com/hashicorp/consul/proto/private/pbsubscribe" ) // ReadTxn is implemented by memdb.Txn to perform read operations. diff --git a/agent/consul/state/peering.go b/agent/consul/state/peering.go index 32e60450044..708b28848d9 100644 --- a/agent/consul/state/peering.go +++ b/agent/consul/state/peering.go @@ -14,7 +14,7 @@ import ( "github.com/hashicorp/consul/agent/structs" "github.com/hashicorp/consul/lib" "github.com/hashicorp/consul/lib/maps" - "github.com/hashicorp/consul/proto/pbpeering" + "github.com/hashicorp/consul/proto/private/pbpeering" ) const ( diff --git a/agent/consul/state/peering_oss.go b/agent/consul/state/peering_oss.go index a331b56489a..b36a5ccaa11 100644 --- a/agent/consul/state/peering_oss.go +++ b/agent/consul/state/peering_oss.go @@ -7,7 +7,7 @@ import ( "fmt" "strings" - "github.com/hashicorp/consul/proto/pbpeering" + "github.com/hashicorp/consul/proto/private/pbpeering" ) func indexPeeringFromQuery(q Query) ([]byte, error) { diff --git a/agent/consul/state/peering_oss_test.go b/agent/consul/state/peering_oss_test.go index daea60c091e..d2c37008069 100644 --- a/agent/consul/state/peering_oss_test.go +++ b/agent/consul/state/peering_oss_test.go @@ -7,7 +7,7 @@ import ( "time" "github.com/hashicorp/consul/agent/structs" - "github.com/hashicorp/consul/proto/pbpeering" + "github.com/hashicorp/consul/proto/private/pbpeering" ) func testIndexerTablePeering() map[string]indexerTestCase { diff --git a/agent/consul/state/peering_test.go b/agent/consul/state/peering_test.go index 2c2caaab9a9..dc8dd897462 100644 --- a/agent/consul/state/peering_test.go +++ b/agent/consul/state/peering_test.go @@ -11,8 +11,8 @@ import ( "github.com/hashicorp/consul/acl" "github.com/hashicorp/consul/agent/connect" "github.com/hashicorp/consul/agent/structs" - "github.com/hashicorp/consul/proto/pbpeering" - "github.com/hashicorp/consul/proto/prototest" + "github.com/hashicorp/consul/proto/private/pbpeering" + "github.com/hashicorp/consul/proto/private/prototest" "github.com/hashicorp/consul/sdk/testutil" ) diff --git a/agent/consul/state/schema_test.go b/agent/consul/state/schema_test.go index 89adf14a2e6..b19c0bd246f 100644 --- a/agent/consul/state/schema_test.go +++ b/agent/consul/state/schema_test.go @@ -7,7 +7,7 @@ import ( "github.com/hashicorp/go-memdb" "github.com/stretchr/testify/require" - "github.com/hashicorp/consul/proto/pbpeering" + "github.com/hashicorp/consul/proto/private/pbpeering" ) type indexerTestCase struct { diff --git a/agent/consul/state/state_store_test.go b/agent/consul/state/state_store_test.go index 88e5418c8d7..a61365d82c7 100644 --- a/agent/consul/state/state_store_test.go +++ b/agent/consul/state/state_store_test.go @@ -12,7 +12,7 @@ import ( "github.com/hashicorp/consul/acl" "github.com/hashicorp/consul/agent/structs" - "github.com/hashicorp/consul/proto/pbpeering" + "github.com/hashicorp/consul/proto/private/pbpeering" "github.com/hashicorp/consul/types" ) diff --git a/agent/consul/state/store_integration_test.go b/agent/consul/state/store_integration_test.go index 0d28880aa38..d6e93044d88 100644 --- a/agent/consul/state/store_integration_test.go +++ b/agent/consul/state/store_integration_test.go @@ -10,7 +10,7 @@ import ( "github.com/hashicorp/consul/acl" "github.com/hashicorp/consul/agent/consul/stream" "github.com/hashicorp/consul/agent/structs" - "github.com/hashicorp/consul/proto/pbsubscribe" + "github.com/hashicorp/consul/proto/private/pbsubscribe" ) func TestStore_IntegrationWithEventPublisher_ACLTokenUpdate(t *testing.T) { diff --git a/agent/consul/stream/event.go b/agent/consul/stream/event.go index aade425bb27..34b715c5e85 100644 --- a/agent/consul/stream/event.go +++ b/agent/consul/stream/event.go @@ -8,7 +8,7 @@ import ( "fmt" "github.com/hashicorp/consul/acl" - "github.com/hashicorp/consul/proto/pbsubscribe" + "github.com/hashicorp/consul/proto/private/pbsubscribe" ) // Topic is an identifier that partitions events. A subscription will only receive diff --git a/agent/consul/stream/event_publisher_test.go b/agent/consul/stream/event_publisher_test.go index 652747d3967..6f081fe3d63 100644 --- a/agent/consul/stream/event_publisher_test.go +++ b/agent/consul/stream/event_publisher_test.go @@ -9,7 +9,7 @@ import ( "github.com/stretchr/testify/require" "github.com/hashicorp/consul/acl" - "github.com/hashicorp/consul/proto/pbsubscribe" + "github.com/hashicorp/consul/proto/private/pbsubscribe" "github.com/hashicorp/consul/sdk/testutil" ) diff --git a/agent/consul/subscribe_backend_test.go b/agent/consul/subscribe_backend_test.go index 770f4a61d92..a0d07e6480c 100644 --- a/agent/consul/subscribe_backend_test.go +++ b/agent/consul/subscribe_backend_test.go @@ -19,8 +19,8 @@ import ( "github.com/hashicorp/consul/agent/grpc-internal/resolver" "github.com/hashicorp/consul/agent/router" "github.com/hashicorp/consul/agent/structs" - "github.com/hashicorp/consul/proto/pbservice" - "github.com/hashicorp/consul/proto/pbsubscribe" + "github.com/hashicorp/consul/proto/private/pbservice" + "github.com/hashicorp/consul/proto/private/pbsubscribe" "github.com/hashicorp/consul/sdk/testutil" "github.com/hashicorp/consul/testrpc" ) diff --git a/agent/consul/usagemetrics/usagemetrics_oss_test.go b/agent/consul/usagemetrics/usagemetrics_oss_test.go index 002fc2a81c4..3789b6660cf 100644 --- a/agent/consul/usagemetrics/usagemetrics_oss_test.go +++ b/agent/consul/usagemetrics/usagemetrics_oss_test.go @@ -16,7 +16,7 @@ import ( "github.com/hashicorp/consul/acl" "github.com/hashicorp/consul/agent/consul/state" "github.com/hashicorp/consul/agent/structs" - "github.com/hashicorp/consul/proto/pbpeering" + "github.com/hashicorp/consul/proto/private/pbpeering" "github.com/hashicorp/consul/sdk/testutil" ) diff --git a/agent/envoyextensions/builtin/aws-lambda/aws_lambda_test.go b/agent/envoyextensions/builtin/aws-lambda/aws_lambda_test.go index f0ac9c1e7c7..214a5bc34da 100644 --- a/agent/envoyextensions/builtin/aws-lambda/aws_lambda_test.go +++ b/agent/envoyextensions/builtin/aws-lambda/aws_lambda_test.go @@ -20,7 +20,7 @@ import ( "github.com/hashicorp/consul/api" "github.com/hashicorp/consul/envoyextensions/extensioncommon" - "github.com/hashicorp/consul/proto/prototest" + "github.com/hashicorp/consul/proto/private/prototest" ) func TestConstructor(t *testing.T) { diff --git a/agent/grpc-external/services/peerstream/replication.go b/agent/grpc-external/services/peerstream/replication.go index 20ceac14892..8a71c9bc6bb 100644 --- a/agent/grpc-external/services/peerstream/replication.go +++ b/agent/grpc-external/services/peerstream/replication.go @@ -13,10 +13,10 @@ import ( "github.com/hashicorp/consul/agent/cache" "github.com/hashicorp/consul/agent/consul/state" "github.com/hashicorp/consul/agent/structs" - "github.com/hashicorp/consul/proto/pbpeering" - "github.com/hashicorp/consul/proto/pbpeerstream" - "github.com/hashicorp/consul/proto/pbservice" - "github.com/hashicorp/consul/proto/pbstatus" + "github.com/hashicorp/consul/proto/private/pbpeering" + "github.com/hashicorp/consul/proto/private/pbpeerstream" + "github.com/hashicorp/consul/proto/private/pbservice" + "github.com/hashicorp/consul/proto/private/pbstatus" "github.com/hashicorp/consul/types" ) diff --git a/agent/grpc-external/services/peerstream/server.go b/agent/grpc-external/services/peerstream/server.go index 8a5e33e93c5..da21e3edaa6 100644 --- a/agent/grpc-external/services/peerstream/server.go +++ b/agent/grpc-external/services/peerstream/server.go @@ -12,8 +12,8 @@ import ( "github.com/hashicorp/consul/agent/consul/state" "github.com/hashicorp/consul/agent/consul/stream" "github.com/hashicorp/consul/agent/structs" - "github.com/hashicorp/consul/proto/pbpeering" - "github.com/hashicorp/consul/proto/pbpeerstream" + "github.com/hashicorp/consul/proto/private/pbpeering" + "github.com/hashicorp/consul/proto/private/pbpeerstream" ) // TODO(peering): fix up these interfaces to be more testable now that they are diff --git a/agent/grpc-external/services/peerstream/server_test.go b/agent/grpc-external/services/peerstream/server_test.go index a24d8edc2f5..7f584c95cbb 100644 --- a/agent/grpc-external/services/peerstream/server_test.go +++ b/agent/grpc-external/services/peerstream/server_test.go @@ -4,8 +4,8 @@ import ( "context" "testing" - "github.com/hashicorp/consul/proto/pbpeering" - "github.com/hashicorp/consul/proto/pbpeerstream" + "github.com/hashicorp/consul/proto/private/pbpeering" + "github.com/hashicorp/consul/proto/private/pbpeerstream" "github.com/hashicorp/consul/sdk/testutil" "github.com/stretchr/testify/require" ) diff --git a/agent/grpc-external/services/peerstream/stream_resources.go b/agent/grpc-external/services/peerstream/stream_resources.go index c9c077776f0..5522b8f4e45 100644 --- a/agent/grpc-external/services/peerstream/stream_resources.go +++ b/agent/grpc-external/services/peerstream/stream_resources.go @@ -21,8 +21,8 @@ import ( external "github.com/hashicorp/consul/agent/grpc-external" "github.com/hashicorp/consul/agent/structs" "github.com/hashicorp/consul/lib" - "github.com/hashicorp/consul/proto/pbpeering" - "github.com/hashicorp/consul/proto/pbpeerstream" + "github.com/hashicorp/consul/proto/private/pbpeering" + "github.com/hashicorp/consul/proto/private/pbpeerstream" ) type BidirectionalStream interface { diff --git a/agent/grpc-external/services/peerstream/stream_test.go b/agent/grpc-external/services/peerstream/stream_test.go index b21f35bccef..63df91aa7c2 100644 --- a/agent/grpc-external/services/peerstream/stream_test.go +++ b/agent/grpc-external/services/peerstream/stream_test.go @@ -29,12 +29,12 @@ import ( "github.com/hashicorp/consul/agent/structs" "github.com/hashicorp/consul/lib" "github.com/hashicorp/consul/logging" - "github.com/hashicorp/consul/proto/pbcommon" - "github.com/hashicorp/consul/proto/pbpeering" - "github.com/hashicorp/consul/proto/pbpeerstream" - "github.com/hashicorp/consul/proto/pbservice" - "github.com/hashicorp/consul/proto/pbstatus" - "github.com/hashicorp/consul/proto/prototest" + "github.com/hashicorp/consul/proto/private/pbcommon" + "github.com/hashicorp/consul/proto/private/pbpeering" + "github.com/hashicorp/consul/proto/private/pbpeerstream" + "github.com/hashicorp/consul/proto/private/pbservice" + "github.com/hashicorp/consul/proto/private/pbstatus" + "github.com/hashicorp/consul/proto/private/prototest" "github.com/hashicorp/consul/sdk/freeport" "github.com/hashicorp/consul/sdk/testutil" "github.com/hashicorp/consul/sdk/testutil/retry" diff --git a/agent/grpc-external/services/peerstream/subscription_blocking.go b/agent/grpc-external/services/peerstream/subscription_blocking.go index 8b53d3f1978..fe0cd4d7890 100644 --- a/agent/grpc-external/services/peerstream/subscription_blocking.go +++ b/agent/grpc-external/services/peerstream/subscription_blocking.go @@ -11,7 +11,7 @@ import ( "github.com/hashicorp/consul/agent/cache" "github.com/hashicorp/consul/agent/structs" "github.com/hashicorp/consul/lib/retry" - "github.com/hashicorp/consul/proto/pbservice" + "github.com/hashicorp/consul/proto/private/pbservice" ) // This file contains direct state store functions that need additional diff --git a/agent/grpc-external/services/peerstream/subscription_manager.go b/agent/grpc-external/services/peerstream/subscription_manager.go index 0f9174dd859..d290d2dc1a0 100644 --- a/agent/grpc-external/services/peerstream/subscription_manager.go +++ b/agent/grpc-external/services/peerstream/subscription_manager.go @@ -24,10 +24,10 @@ import ( "github.com/hashicorp/consul/agent/structs" "github.com/hashicorp/consul/agent/submatview" "github.com/hashicorp/consul/api" - "github.com/hashicorp/consul/proto/pbcommon" - "github.com/hashicorp/consul/proto/pbpeering" - "github.com/hashicorp/consul/proto/pbpeerstream" - "github.com/hashicorp/consul/proto/pbservice" + "github.com/hashicorp/consul/proto/private/pbcommon" + "github.com/hashicorp/consul/proto/private/pbpeering" + "github.com/hashicorp/consul/proto/private/pbpeerstream" + "github.com/hashicorp/consul/proto/private/pbservice" ) type MaterializedViewStore interface { diff --git a/agent/grpc-external/services/peerstream/subscription_manager_test.go b/agent/grpc-external/services/peerstream/subscription_manager_test.go index 6d7a41979ce..a749787744c 100644 --- a/agent/grpc-external/services/peerstream/subscription_manager_test.go +++ b/agent/grpc-external/services/peerstream/subscription_manager_test.go @@ -18,11 +18,11 @@ import ( "github.com/hashicorp/consul/agent/consul/stream" "github.com/hashicorp/consul/agent/structs" "github.com/hashicorp/consul/api" - "github.com/hashicorp/consul/proto/pbcommon" - "github.com/hashicorp/consul/proto/pbpeering" - "github.com/hashicorp/consul/proto/pbpeerstream" - "github.com/hashicorp/consul/proto/pbservice" - "github.com/hashicorp/consul/proto/prototest" + "github.com/hashicorp/consul/proto/private/pbcommon" + "github.com/hashicorp/consul/proto/private/pbpeering" + "github.com/hashicorp/consul/proto/private/pbpeerstream" + "github.com/hashicorp/consul/proto/private/pbservice" + "github.com/hashicorp/consul/proto/private/prototest" "github.com/hashicorp/consul/sdk/testutil" "github.com/hashicorp/consul/types" ) diff --git a/agent/grpc-external/services/peerstream/subscription_state.go b/agent/grpc-external/services/peerstream/subscription_state.go index 54b4a84a3a2..47318c430b3 100644 --- a/agent/grpc-external/services/peerstream/subscription_state.go +++ b/agent/grpc-external/services/peerstream/subscription_state.go @@ -12,7 +12,7 @@ import ( "github.com/hashicorp/consul/agent/cache" "github.com/hashicorp/consul/agent/structs" - "github.com/hashicorp/consul/proto/pbservice" + "github.com/hashicorp/consul/proto/private/pbservice" ) // subscriptionState is a collection of working state tied to a peerID subscription. diff --git a/agent/grpc-external/services/peerstream/subscription_state_test.go b/agent/grpc-external/services/peerstream/subscription_state_test.go index 253def99a94..abb1ce767d5 100644 --- a/agent/grpc-external/services/peerstream/subscription_state_test.go +++ b/agent/grpc-external/services/peerstream/subscription_state_test.go @@ -12,7 +12,7 @@ import ( "github.com/hashicorp/consul/acl" "github.com/hashicorp/consul/agent/cache" "github.com/hashicorp/consul/agent/structs" - "github.com/hashicorp/consul/proto/pbservice" + "github.com/hashicorp/consul/proto/private/pbservice" "github.com/hashicorp/consul/sdk/testutil" ) diff --git a/agent/grpc-external/services/peerstream/subscription_view.go b/agent/grpc-external/services/peerstream/subscription_view.go index d8b17c76ab8..691507984c9 100644 --- a/agent/grpc-external/services/peerstream/subscription_view.go +++ b/agent/grpc-external/services/peerstream/subscription_view.go @@ -12,8 +12,8 @@ import ( "github.com/hashicorp/consul/agent/consul/stream" "github.com/hashicorp/consul/agent/structs" "github.com/hashicorp/consul/agent/submatview" - "github.com/hashicorp/consul/proto/pbservice" - "github.com/hashicorp/consul/proto/pbsubscribe" + "github.com/hashicorp/consul/proto/private/pbservice" + "github.com/hashicorp/consul/proto/private/pbsubscribe" ) type Subscriber interface { diff --git a/agent/grpc-external/services/peerstream/subscription_view_test.go b/agent/grpc-external/services/peerstream/subscription_view_test.go index c96b19bb213..d900d9524e1 100644 --- a/agent/grpc-external/services/peerstream/subscription_view_test.go +++ b/agent/grpc-external/services/peerstream/subscription_view_test.go @@ -18,8 +18,8 @@ import ( "github.com/hashicorp/consul/agent/consul/stream" "github.com/hashicorp/consul/agent/structs" "github.com/hashicorp/consul/agent/submatview" - "github.com/hashicorp/consul/proto/pbservice" - "github.com/hashicorp/consul/proto/pbsubscribe" + "github.com/hashicorp/consul/proto/private/pbservice" + "github.com/hashicorp/consul/proto/private/pbsubscribe" ) // testInitialIndex is the first index that will be used in simulated updates. diff --git a/agent/grpc-external/services/peerstream/testing.go b/agent/grpc-external/services/peerstream/testing.go index 4f0297a6c52..676aba46f23 100644 --- a/agent/grpc-external/services/peerstream/testing.go +++ b/agent/grpc-external/services/peerstream/testing.go @@ -11,7 +11,7 @@ import ( "github.com/stretchr/testify/require" "google.golang.org/grpc/metadata" - "github.com/hashicorp/consul/proto/pbpeerstream" + "github.com/hashicorp/consul/proto/private/pbpeerstream" ) type MockClient struct { diff --git a/agent/grpc-external/services/serverdiscovery/watch_servers_test.go b/agent/grpc-external/services/serverdiscovery/watch_servers_test.go index 91570e39541..784c8ba915f 100644 --- a/agent/grpc-external/services/serverdiscovery/watch_servers_test.go +++ b/agent/grpc-external/services/serverdiscovery/watch_servers_test.go @@ -20,7 +20,7 @@ import ( "github.com/hashicorp/consul/agent/grpc-external/testutils" "github.com/hashicorp/consul/agent/structs" "github.com/hashicorp/consul/proto-public/pbserverdiscovery" - "github.com/hashicorp/consul/proto/prototest" + "github.com/hashicorp/consul/proto/private/prototest" "github.com/hashicorp/consul/sdk/testutil" ) diff --git a/agent/grpc-external/stats_test.go b/agent/grpc-external/stats_test.go index afe4ddfd0e9..31591ee9727 100644 --- a/agent/grpc-external/stats_test.go +++ b/agent/grpc-external/stats_test.go @@ -18,7 +18,7 @@ import ( grpcmiddleware "github.com/hashicorp/consul/agent/grpc-middleware" "github.com/hashicorp/consul/agent/grpc-middleware/testutil" "github.com/hashicorp/consul/agent/grpc-middleware/testutil/testservice" - "github.com/hashicorp/consul/proto/prototest" + "github.com/hashicorp/consul/proto/private/prototest" ) func TestServer_EmitsStats(t *testing.T) { diff --git a/agent/grpc-internal/services/subscribe/logger.go b/agent/grpc-internal/services/subscribe/logger.go index 4a494d8c884..12350454402 100644 --- a/agent/grpc-internal/services/subscribe/logger.go +++ b/agent/grpc-internal/services/subscribe/logger.go @@ -7,7 +7,7 @@ import ( "github.com/hashicorp/go-uuid" "github.com/hashicorp/consul/agent/consul/stream" - "github.com/hashicorp/consul/proto/pbsubscribe" + "github.com/hashicorp/consul/proto/private/pbsubscribe" ) // streamID is used in logs as a unique identifier for a subscription. The value diff --git a/agent/grpc-internal/services/subscribe/subscribe.go b/agent/grpc-internal/services/subscribe/subscribe.go index b78af0e38cd..01c61e53abf 100644 --- a/agent/grpc-internal/services/subscribe/subscribe.go +++ b/agent/grpc-internal/services/subscribe/subscribe.go @@ -12,7 +12,7 @@ import ( "github.com/hashicorp/consul/agent/consul/state" "github.com/hashicorp/consul/agent/consul/stream" "github.com/hashicorp/consul/agent/structs" - "github.com/hashicorp/consul/proto/pbsubscribe" + "github.com/hashicorp/consul/proto/private/pbsubscribe" ) // Server implements a StateChangeSubscriptionServer for accepting SubscribeRequests, diff --git a/agent/grpc-internal/services/subscribe/subscribe_test.go b/agent/grpc-internal/services/subscribe/subscribe_test.go index f31169eb94e..efb826c0c91 100644 --- a/agent/grpc-internal/services/subscribe/subscribe_test.go +++ b/agent/grpc-internal/services/subscribe/subscribe_test.go @@ -25,10 +25,10 @@ import ( grpc "github.com/hashicorp/consul/agent/grpc-internal" "github.com/hashicorp/consul/agent/structs" "github.com/hashicorp/consul/api" - "github.com/hashicorp/consul/proto/pbcommon" - "github.com/hashicorp/consul/proto/pbservice" - "github.com/hashicorp/consul/proto/pbsubscribe" - "github.com/hashicorp/consul/proto/prototest" + "github.com/hashicorp/consul/proto/private/pbcommon" + "github.com/hashicorp/consul/proto/private/pbservice" + "github.com/hashicorp/consul/proto/private/pbsubscribe" + "github.com/hashicorp/consul/proto/private/prototest" "github.com/hashicorp/consul/sdk/testutil" "github.com/hashicorp/consul/types" ) diff --git a/agent/grpc-internal/stats_test.go b/agent/grpc-internal/stats_test.go index 49059eaf4a5..82ea690e940 100644 --- a/agent/grpc-internal/stats_test.go +++ b/agent/grpc-internal/stats_test.go @@ -17,7 +17,7 @@ import ( "github.com/hashicorp/consul/agent/consul/rate" "github.com/hashicorp/consul/agent/grpc-middleware/testutil" "github.com/hashicorp/consul/agent/grpc-middleware/testutil/testservice" - "github.com/hashicorp/consul/proto/prototest" + "github.com/hashicorp/consul/proto/private/prototest" ) func noopRegister(*grpc.Server) {} diff --git a/agent/grpc-middleware/testutil/testservice/simple.pb.binary.go b/agent/grpc-middleware/testutil/testservice/simple.pb.binary.go index 1814a991a38..78466759513 100644 --- a/agent/grpc-middleware/testutil/testservice/simple.pb.binary.go +++ b/agent/grpc-middleware/testutil/testservice/simple.pb.binary.go @@ -1,5 +1,5 @@ // Code generated by protoc-gen-go-binary. DO NOT EDIT. -// source: agent/grpc-middleware/testutil/testservice/simple.proto +// source: simple.proto package testservice diff --git a/agent/grpc-middleware/testutil/testservice/simple.pb.go b/agent/grpc-middleware/testutil/testservice/simple.pb.go index 96a36fdb53a..1dcee8ad393 100644 --- a/agent/grpc-middleware/testutil/testservice/simple.pb.go +++ b/agent/grpc-middleware/testutil/testservice/simple.pb.go @@ -2,7 +2,7 @@ // versions: // protoc-gen-go v1.28.1 // protoc (unknown) -// source: agent/grpc-middleware/testutil/testservice/simple.proto +// source: simple.proto package testservice @@ -31,7 +31,7 @@ type Req struct { func (x *Req) Reset() { *x = Req{} if protoimpl.UnsafeEnabled { - mi := &file_agent_grpc_middleware_testutil_testservice_simple_proto_msgTypes[0] + mi := &file_simple_proto_msgTypes[0] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -44,7 +44,7 @@ func (x *Req) String() string { func (*Req) ProtoMessage() {} func (x *Req) ProtoReflect() protoreflect.Message { - mi := &file_agent_grpc_middleware_testutil_testservice_simple_proto_msgTypes[0] + mi := &file_simple_proto_msgTypes[0] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -57,7 +57,7 @@ func (x *Req) ProtoReflect() protoreflect.Message { // Deprecated: Use Req.ProtoReflect.Descriptor instead. func (*Req) Descriptor() ([]byte, []int) { - return file_agent_grpc_middleware_testutil_testservice_simple_proto_rawDescGZIP(), []int{0} + return file_simple_proto_rawDescGZIP(), []int{0} } func (x *Req) GetDatacenter() string { @@ -79,7 +79,7 @@ type Resp struct { func (x *Resp) Reset() { *x = Resp{} if protoimpl.UnsafeEnabled { - mi := &file_agent_grpc_middleware_testutil_testservice_simple_proto_msgTypes[1] + mi := &file_simple_proto_msgTypes[1] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -92,7 +92,7 @@ func (x *Resp) String() string { func (*Resp) ProtoMessage() {} func (x *Resp) ProtoReflect() protoreflect.Message { - mi := &file_agent_grpc_middleware_testutil_testservice_simple_proto_msgTypes[1] + mi := &file_simple_proto_msgTypes[1] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -105,7 +105,7 @@ func (x *Resp) ProtoReflect() protoreflect.Message { // Deprecated: Use Resp.ProtoReflect.Descriptor instead. func (*Resp) Descriptor() ([]byte, []int) { - return file_agent_grpc_middleware_testutil_testservice_simple_proto_rawDescGZIP(), []int{1} + return file_simple_proto_rawDescGZIP(), []int{1} } func (x *Resp) GetServerName() string { @@ -122,62 +122,57 @@ func (x *Resp) GetDatacenter() string { return "" } -var File_agent_grpc_middleware_testutil_testservice_simple_proto protoreflect.FileDescriptor - -var file_agent_grpc_middleware_testutil_testservice_simple_proto_rawDesc = []byte{ - 0x0a, 0x37, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2f, 0x67, 0x72, 0x70, 0x63, 0x2d, 0x6d, 0x69, 0x64, - 0x64, 0x6c, 0x65, 0x77, 0x61, 0x72, 0x65, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x75, 0x74, 0x69, 0x6c, - 0x2f, 0x74, 0x65, 0x73, 0x74, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2f, 0x73, 0x69, 0x6d, - 0x70, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0b, 0x74, 0x65, 0x73, 0x74, 0x73, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x22, 0x25, 0x0a, 0x03, 0x52, 0x65, 0x71, 0x12, 0x1e, 0x0a, - 0x0a, 0x44, 0x61, 0x74, 0x61, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0a, 0x44, 0x61, 0x74, 0x61, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x22, 0x46, 0x0a, - 0x04, 0x52, 0x65, 0x73, 0x70, 0x12, 0x1e, 0x0a, 0x0a, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x4e, - 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x53, 0x65, 0x72, 0x76, 0x65, - 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x44, 0x61, 0x74, 0x61, 0x63, 0x65, 0x6e, - 0x74, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x44, 0x61, 0x74, 0x61, 0x63, - 0x65, 0x6e, 0x74, 0x65, 0x72, 0x32, 0x6d, 0x0a, 0x06, 0x53, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x12, - 0x32, 0x0a, 0x09, 0x53, 0x6f, 0x6d, 0x65, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x12, 0x10, 0x2e, 0x74, - 0x65, 0x73, 0x74, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x52, 0x65, 0x71, 0x1a, 0x11, - 0x2e, 0x74, 0x65, 0x73, 0x74, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x52, 0x65, 0x73, - 0x70, 0x22, 0x00, 0x12, 0x2f, 0x0a, 0x04, 0x46, 0x6c, 0x6f, 0x77, 0x12, 0x10, 0x2e, 0x74, 0x65, - 0x73, 0x74, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x52, 0x65, 0x71, 0x1a, 0x11, 0x2e, - 0x74, 0x65, 0x73, 0x74, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x70, - 0x22, 0x00, 0x30, 0x01, 0x42, 0xdd, 0x01, 0x0a, 0x0f, 0x63, 0x6f, 0x6d, 0x2e, 0x74, 0x65, 0x73, - 0x74, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x42, 0x0b, 0x53, 0x69, 0x6d, 0x70, 0x6c, 0x65, - 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x71, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, - 0x63, 0x6f, 0x6d, 0x2f, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2f, 0x63, 0x6f, - 0x6e, 0x73, 0x75, 0x6c, 0x2f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2f, 0x67, 0x72, 0x70, 0x63, 0x2d, - 0x6d, 0x69, 0x64, 0x64, 0x6c, 0x65, 0x77, 0x61, 0x72, 0x65, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x75, - 0x74, 0x69, 0x6c, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2f, - 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2f, 0x67, 0x72, 0x70, 0x63, 0x2d, 0x6d, 0x69, 0x64, 0x64, 0x6c, - 0x65, 0x77, 0x61, 0x72, 0x65, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x75, 0x74, 0x69, 0x6c, 0x2f, 0x74, - 0x65, 0x73, 0x74, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0xa2, 0x02, 0x03, 0x54, 0x58, 0x58, - 0xaa, 0x02, 0x0b, 0x54, 0x65, 0x73, 0x74, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0xca, 0x02, - 0x0b, 0x54, 0x65, 0x73, 0x74, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0xe2, 0x02, 0x17, 0x54, - 0x65, 0x73, 0x74, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, - 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x0b, 0x54, 0x65, 0x73, 0x74, 0x73, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +var File_simple_proto protoreflect.FileDescriptor + +var file_simple_proto_rawDesc = []byte{ + 0x0a, 0x0c, 0x73, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0b, + 0x74, 0x65, 0x73, 0x74, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x22, 0x25, 0x0a, 0x03, 0x52, + 0x65, 0x71, 0x12, 0x1e, 0x0a, 0x0a, 0x44, 0x61, 0x74, 0x61, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x44, 0x61, 0x74, 0x61, 0x63, 0x65, 0x6e, 0x74, + 0x65, 0x72, 0x22, 0x46, 0x0a, 0x04, 0x52, 0x65, 0x73, 0x70, 0x12, 0x1e, 0x0a, 0x0a, 0x53, 0x65, + 0x72, 0x76, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, + 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x44, 0x61, + 0x74, 0x61, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, + 0x44, 0x61, 0x74, 0x61, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x32, 0x6d, 0x0a, 0x06, 0x53, 0x69, + 0x6d, 0x70, 0x6c, 0x65, 0x12, 0x32, 0x0a, 0x09, 0x53, 0x6f, 0x6d, 0x65, 0x74, 0x68, 0x69, 0x6e, + 0x67, 0x12, 0x10, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, + 0x52, 0x65, 0x71, 0x1a, 0x11, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x22, 0x00, 0x12, 0x2f, 0x0a, 0x04, 0x46, 0x6c, 0x6f, 0x77, + 0x12, 0x10, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x52, + 0x65, 0x71, 0x1a, 0x11, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x2e, 0x52, 0x65, 0x73, 0x70, 0x22, 0x00, 0x30, 0x01, 0x42, 0xb2, 0x01, 0x0a, 0x0f, 0x63, 0x6f, + 0x6d, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x42, 0x0b, 0x53, + 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x46, 0x67, 0x69, + 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, + 0x72, 0x70, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2f, + 0x67, 0x72, 0x70, 0x63, 0x2d, 0x6d, 0x69, 0x64, 0x64, 0x6c, 0x65, 0x77, 0x61, 0x72, 0x65, 0x2f, + 0x74, 0x65, 0x73, 0x74, 0x75, 0x74, 0x69, 0x6c, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x73, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0xa2, 0x02, 0x03, 0x54, 0x58, 0x58, 0xaa, 0x02, 0x0b, 0x54, 0x65, 0x73, + 0x74, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0xca, 0x02, 0x0b, 0x54, 0x65, 0x73, 0x74, 0x73, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0xe2, 0x02, 0x17, 0x54, 0x65, 0x73, 0x74, 0x73, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, + 0xea, 0x02, 0x0b, 0x54, 0x65, 0x73, 0x74, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x62, 0x06, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( - file_agent_grpc_middleware_testutil_testservice_simple_proto_rawDescOnce sync.Once - file_agent_grpc_middleware_testutil_testservice_simple_proto_rawDescData = file_agent_grpc_middleware_testutil_testservice_simple_proto_rawDesc + file_simple_proto_rawDescOnce sync.Once + file_simple_proto_rawDescData = file_simple_proto_rawDesc ) -func file_agent_grpc_middleware_testutil_testservice_simple_proto_rawDescGZIP() []byte { - file_agent_grpc_middleware_testutil_testservice_simple_proto_rawDescOnce.Do(func() { - file_agent_grpc_middleware_testutil_testservice_simple_proto_rawDescData = protoimpl.X.CompressGZIP(file_agent_grpc_middleware_testutil_testservice_simple_proto_rawDescData) +func file_simple_proto_rawDescGZIP() []byte { + file_simple_proto_rawDescOnce.Do(func() { + file_simple_proto_rawDescData = protoimpl.X.CompressGZIP(file_simple_proto_rawDescData) }) - return file_agent_grpc_middleware_testutil_testservice_simple_proto_rawDescData + return file_simple_proto_rawDescData } -var file_agent_grpc_middleware_testutil_testservice_simple_proto_msgTypes = make([]protoimpl.MessageInfo, 2) -var file_agent_grpc_middleware_testutil_testservice_simple_proto_goTypes = []interface{}{ +var file_simple_proto_msgTypes = make([]protoimpl.MessageInfo, 2) +var file_simple_proto_goTypes = []interface{}{ (*Req)(nil), // 0: testservice.Req (*Resp)(nil), // 1: testservice.Resp } -var file_agent_grpc_middleware_testutil_testservice_simple_proto_depIdxs = []int32{ +var file_simple_proto_depIdxs = []int32{ 0, // 0: testservice.Simple.Something:input_type -> testservice.Req 0, // 1: testservice.Simple.Flow:input_type -> testservice.Req 1, // 2: testservice.Simple.Something:output_type -> testservice.Resp @@ -189,13 +184,13 @@ var file_agent_grpc_middleware_testutil_testservice_simple_proto_depIdxs = []int 0, // [0:0] is the sub-list for field type_name } -func init() { file_agent_grpc_middleware_testutil_testservice_simple_proto_init() } -func file_agent_grpc_middleware_testutil_testservice_simple_proto_init() { - if File_agent_grpc_middleware_testutil_testservice_simple_proto != nil { +func init() { file_simple_proto_init() } +func file_simple_proto_init() { + if File_simple_proto != nil { return } if !protoimpl.UnsafeEnabled { - file_agent_grpc_middleware_testutil_testservice_simple_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + file_simple_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Req); i { case 0: return &v.state @@ -207,7 +202,7 @@ func file_agent_grpc_middleware_testutil_testservice_simple_proto_init() { return nil } } - file_agent_grpc_middleware_testutil_testservice_simple_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + file_simple_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Resp); i { case 0: return &v.state @@ -224,18 +219,18 @@ func file_agent_grpc_middleware_testutil_testservice_simple_proto_init() { out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_agent_grpc_middleware_testutil_testservice_simple_proto_rawDesc, + RawDescriptor: file_simple_proto_rawDesc, NumEnums: 0, NumMessages: 2, NumExtensions: 0, NumServices: 1, }, - GoTypes: file_agent_grpc_middleware_testutil_testservice_simple_proto_goTypes, - DependencyIndexes: file_agent_grpc_middleware_testutil_testservice_simple_proto_depIdxs, - MessageInfos: file_agent_grpc_middleware_testutil_testservice_simple_proto_msgTypes, + GoTypes: file_simple_proto_goTypes, + DependencyIndexes: file_simple_proto_depIdxs, + MessageInfos: file_simple_proto_msgTypes, }.Build() - File_agent_grpc_middleware_testutil_testservice_simple_proto = out.File - file_agent_grpc_middleware_testutil_testservice_simple_proto_rawDesc = nil - file_agent_grpc_middleware_testutil_testservice_simple_proto_goTypes = nil - file_agent_grpc_middleware_testutil_testservice_simple_proto_depIdxs = nil + File_simple_proto = out.File + file_simple_proto_rawDesc = nil + file_simple_proto_goTypes = nil + file_simple_proto_depIdxs = nil } diff --git a/agent/grpc-middleware/testutil/testservice/simple_grpc.pb.go b/agent/grpc-middleware/testutil/testservice/simple_grpc.pb.go index 39aac241d4d..44936be4d38 100644 --- a/agent/grpc-middleware/testutil/testservice/simple_grpc.pb.go +++ b/agent/grpc-middleware/testutil/testservice/simple_grpc.pb.go @@ -2,7 +2,7 @@ // versions: // - protoc-gen-go-grpc v1.2.0 // - protoc (unknown) -// source: agent/grpc-middleware/testutil/testservice/simple.proto +// source: simple.proto package testservice @@ -163,5 +163,5 @@ var Simple_ServiceDesc = grpc.ServiceDesc{ ServerStreams: true, }, }, - Metadata: "agent/grpc-middleware/testutil/testservice/simple.proto", + Metadata: "simple.proto", } diff --git a/agent/http.go b/agent/http.go index cb2c11b59ed..ae5068ab160 100644 --- a/agent/http.go +++ b/agent/http.go @@ -35,7 +35,7 @@ import ( "github.com/hashicorp/consul/api" "github.com/hashicorp/consul/lib" "github.com/hashicorp/consul/logging" - "github.com/hashicorp/consul/proto/pbcommon" + "github.com/hashicorp/consul/proto/private/pbcommon" ) var HTTPSummaries = []prometheus.SummaryDefinition{ diff --git a/agent/operator_endpoint.go b/agent/operator_endpoint.go index 132f9e9a442..d916e22edc5 100644 --- a/agent/operator_endpoint.go +++ b/agent/operator_endpoint.go @@ -8,7 +8,7 @@ import ( "github.com/armon/go-metrics" external "github.com/hashicorp/consul/agent/grpc-external" - "github.com/hashicorp/consul/proto/pboperator" + "github.com/hashicorp/consul/proto/private/pboperator" multierror "github.com/hashicorp/go-multierror" "github.com/hashicorp/raft" diff --git a/agent/peering_endpoint.go b/agent/peering_endpoint.go index 5632f320fc6..df5cc414ad6 100644 --- a/agent/peering_endpoint.go +++ b/agent/peering_endpoint.go @@ -10,7 +10,7 @@ import ( "github.com/hashicorp/consul/agent/structs" "github.com/hashicorp/consul/api" "github.com/hashicorp/consul/lib" - "github.com/hashicorp/consul/proto/pbpeering" + "github.com/hashicorp/consul/proto/private/pbpeering" ) // PeeringEndpoint handles GET, DELETE on v1/peering/name diff --git a/agent/peering_endpoint_oss_test.go b/agent/peering_endpoint_oss_test.go index 5e00b05767f..e579bb62ba7 100644 --- a/agent/peering_endpoint_oss_test.go +++ b/agent/peering_endpoint_oss_test.go @@ -13,7 +13,7 @@ import ( "github.com/stretchr/testify/require" - "github.com/hashicorp/consul/proto/pbpeering" + "github.com/hashicorp/consul/proto/private/pbpeering" "github.com/hashicorp/consul/testrpc" ) diff --git a/agent/peering_endpoint_test.go b/agent/peering_endpoint_test.go index c49d77de68e..e8efdc88d63 100644 --- a/agent/peering_endpoint_test.go +++ b/agent/peering_endpoint_test.go @@ -17,7 +17,7 @@ import ( "github.com/hashicorp/consul/agent/structs" "github.com/hashicorp/consul/api" - "github.com/hashicorp/consul/proto/pbpeering" + "github.com/hashicorp/consul/proto/private/pbpeering" "github.com/hashicorp/consul/sdk/testutil/retry" "github.com/hashicorp/consul/testrpc" ) diff --git a/agent/pool/pool.go b/agent/pool/pool.go index 593838601f6..5fff76d3272 100644 --- a/agent/pool/pool.go +++ b/agent/pool/pool.go @@ -18,7 +18,7 @@ import ( "github.com/hashicorp/consul/agent/structs" "github.com/hashicorp/consul/lib" - "github.com/hashicorp/consul/proto/pbcommon" + "github.com/hashicorp/consul/proto/private/pbcommon" "github.com/hashicorp/consul/tlsutil" ) diff --git a/agent/proxycfg-glue/config_entry.go b/agent/proxycfg-glue/config_entry.go index 022b9161ca9..bd017c25baf 100644 --- a/agent/proxycfg-glue/config_entry.go +++ b/agent/proxycfg-glue/config_entry.go @@ -10,9 +10,9 @@ import ( "github.com/hashicorp/consul/agent/proxycfg" "github.com/hashicorp/consul/agent/structs" "github.com/hashicorp/consul/agent/submatview" - "github.com/hashicorp/consul/proto/pbcommon" - "github.com/hashicorp/consul/proto/pbconfigentry" - "github.com/hashicorp/consul/proto/pbsubscribe" + "github.com/hashicorp/consul/proto/private/pbcommon" + "github.com/hashicorp/consul/proto/private/pbconfigentry" + "github.com/hashicorp/consul/proto/private/pbsubscribe" ) // CacheConfigEntry satisfies the proxycfg.ConfigEntry interface by sourcing diff --git a/agent/proxycfg-glue/config_entry_test.go b/agent/proxycfg-glue/config_entry_test.go index 4b1976f44f1..c780bdfe8ce 100644 --- a/agent/proxycfg-glue/config_entry_test.go +++ b/agent/proxycfg-glue/config_entry_test.go @@ -7,8 +7,8 @@ import ( "github.com/hashicorp/consul/acl" "github.com/hashicorp/consul/agent/structs" - "github.com/hashicorp/consul/proto/pbconfigentry" - "github.com/hashicorp/consul/proto/pbsubscribe" + "github.com/hashicorp/consul/proto/private/pbconfigentry" + "github.com/hashicorp/consul/proto/private/pbsubscribe" "github.com/hashicorp/consul/sdk/testutil" ) diff --git a/agent/proxycfg-glue/exported_peered_services_test.go b/agent/proxycfg-glue/exported_peered_services_test.go index 8ba7390fbf5..697c0d52c76 100644 --- a/agent/proxycfg-glue/exported_peered_services_test.go +++ b/agent/proxycfg-glue/exported_peered_services_test.go @@ -7,7 +7,7 @@ import ( "github.com/hashicorp/consul/agent/consul/state" "github.com/hashicorp/consul/agent/proxycfg" "github.com/hashicorp/consul/agent/structs" - "github.com/hashicorp/consul/proto/pbpeering" + "github.com/hashicorp/consul/proto/private/pbpeering" "github.com/hashicorp/consul/sdk/testutil" "github.com/stretchr/testify/require" ) diff --git a/agent/proxycfg-glue/glue.go b/agent/proxycfg-glue/glue.go index a188a0a852b..d6540e75ba7 100644 --- a/agent/proxycfg-glue/glue.go +++ b/agent/proxycfg-glue/glue.go @@ -6,7 +6,7 @@ import ( "github.com/hashicorp/go-hclog" "github.com/hashicorp/go-memdb" - "github.com/hashicorp/consul/proto/pbpeering" + "github.com/hashicorp/consul/proto/private/pbpeering" "github.com/hashicorp/consul/acl" "github.com/hashicorp/consul/agent/cache" diff --git a/agent/proxycfg-glue/health_test.go b/agent/proxycfg-glue/health_test.go index b4e6035ee5f..6cc4447815f 100644 --- a/agent/proxycfg-glue/health_test.go +++ b/agent/proxycfg-glue/health_test.go @@ -15,7 +15,7 @@ import ( "github.com/hashicorp/consul/agent/proxycfg" "github.com/hashicorp/consul/agent/structs" "github.com/hashicorp/consul/agent/submatview" - "github.com/hashicorp/consul/proto/pbsubscribe" + "github.com/hashicorp/consul/proto/private/pbsubscribe" "github.com/hashicorp/consul/sdk/testutil" ) diff --git a/agent/proxycfg-glue/intentions.go b/agent/proxycfg-glue/intentions.go index 69652d922da..ac19ecbdf6e 100644 --- a/agent/proxycfg-glue/intentions.go +++ b/agent/proxycfg-glue/intentions.go @@ -11,7 +11,7 @@ import ( "github.com/hashicorp/consul/agent/proxycfg" "github.com/hashicorp/consul/agent/structs" "github.com/hashicorp/consul/agent/submatview" - "github.com/hashicorp/consul/proto/pbsubscribe" + "github.com/hashicorp/consul/proto/private/pbsubscribe" ) // CacheIntentions satisfies the proxycfg.Intentions interface by sourcing data diff --git a/agent/proxycfg-glue/intentions_ent_test.go b/agent/proxycfg-glue/intentions_ent_test.go index 00eb37285db..b5163785e12 100644 --- a/agent/proxycfg-glue/intentions_ent_test.go +++ b/agent/proxycfg-glue/intentions_ent_test.go @@ -14,7 +14,7 @@ import ( "github.com/hashicorp/consul/agent/proxycfg" "github.com/hashicorp/consul/agent/structs" "github.com/hashicorp/consul/agent/submatview" - "github.com/hashicorp/consul/proto/pbsubscribe" + "github.com/hashicorp/consul/proto/private/pbsubscribe" "github.com/hashicorp/consul/sdk/testutil" ) diff --git a/agent/proxycfg-glue/intentions_oss.go b/agent/proxycfg-glue/intentions_oss.go index b19053bcae1..8b67d0b4950 100644 --- a/agent/proxycfg-glue/intentions_oss.go +++ b/agent/proxycfg-glue/intentions_oss.go @@ -6,7 +6,7 @@ package proxycfgglue import ( "github.com/hashicorp/consul/acl" "github.com/hashicorp/consul/agent/structs" - "github.com/hashicorp/consul/proto/pbsubscribe" + "github.com/hashicorp/consul/proto/private/pbsubscribe" ) func (s serverIntentions) buildSubjects(serviceName string, entMeta acl.EnterpriseMeta) []*pbsubscribe.NamedSubject { diff --git a/agent/proxycfg-glue/intentions_test.go b/agent/proxycfg-glue/intentions_test.go index 5c4701e642d..06b8aaa2a57 100644 --- a/agent/proxycfg-glue/intentions_test.go +++ b/agent/proxycfg-glue/intentions_test.go @@ -16,7 +16,7 @@ import ( "github.com/hashicorp/consul/agent/proxycfg" "github.com/hashicorp/consul/agent/structs" "github.com/hashicorp/consul/agent/submatview" - "github.com/hashicorp/consul/proto/pbsubscribe" + "github.com/hashicorp/consul/proto/private/pbsubscribe" "github.com/hashicorp/consul/sdk/testutil" ) diff --git a/agent/proxycfg-glue/peering_list.go b/agent/proxycfg-glue/peering_list.go index 296a79edb40..777ccaee309 100644 --- a/agent/proxycfg-glue/peering_list.go +++ b/agent/proxycfg-glue/peering_list.go @@ -11,7 +11,7 @@ import ( "github.com/hashicorp/consul/agent/consul/watch" "github.com/hashicorp/consul/agent/proxycfg" "github.com/hashicorp/consul/agent/structs" - "github.com/hashicorp/consul/proto/pbpeering" + "github.com/hashicorp/consul/proto/private/pbpeering" ) // CachePeeringList satisfies the proxycfg.PeeringList interface by sourcing diff --git a/agent/proxycfg-glue/peering_list_test.go b/agent/proxycfg-glue/peering_list_test.go index cc608086c89..509fbcdc0e5 100644 --- a/agent/proxycfg-glue/peering_list_test.go +++ b/agent/proxycfg-glue/peering_list_test.go @@ -10,7 +10,7 @@ import ( cachetype "github.com/hashicorp/consul/agent/cache-types" "github.com/hashicorp/consul/agent/consul/state" "github.com/hashicorp/consul/agent/proxycfg" - "github.com/hashicorp/consul/proto/pbpeering" + "github.com/hashicorp/consul/proto/private/pbpeering" "github.com/hashicorp/consul/sdk/testutil" ) diff --git a/agent/proxycfg-glue/service_list.go b/agent/proxycfg-glue/service_list.go index 14dc13f31b5..7e7e6bbf6ce 100644 --- a/agent/proxycfg-glue/service_list.go +++ b/agent/proxycfg-glue/service_list.go @@ -10,8 +10,8 @@ import ( "github.com/hashicorp/consul/agent/proxycfg" "github.com/hashicorp/consul/agent/structs" "github.com/hashicorp/consul/agent/submatview" - "github.com/hashicorp/consul/proto/pbcommon" - "github.com/hashicorp/consul/proto/pbsubscribe" + "github.com/hashicorp/consul/proto/private/pbcommon" + "github.com/hashicorp/consul/proto/private/pbsubscribe" ) // CacheServiceList satisfies the proxycfg.ServiceList interface by sourcing diff --git a/agent/proxycfg-glue/service_list_test.go b/agent/proxycfg-glue/service_list_test.go index eedb211b330..4ab3edbf134 100644 --- a/agent/proxycfg-glue/service_list_test.go +++ b/agent/proxycfg-glue/service_list_test.go @@ -15,7 +15,7 @@ import ( "github.com/hashicorp/consul/agent/proxycfg" "github.com/hashicorp/consul/agent/structs" "github.com/hashicorp/consul/agent/submatview" - "github.com/hashicorp/consul/proto/pbsubscribe" + "github.com/hashicorp/consul/proto/private/pbsubscribe" "github.com/hashicorp/consul/sdk/testutil" ) diff --git a/agent/proxycfg-glue/trust_bundle.go b/agent/proxycfg-glue/trust_bundle.go index 4d6cbc4d239..e642bb19ba6 100644 --- a/agent/proxycfg-glue/trust_bundle.go +++ b/agent/proxycfg-glue/trust_bundle.go @@ -13,7 +13,7 @@ import ( "github.com/hashicorp/consul/agent/consul/watch" "github.com/hashicorp/consul/agent/proxycfg" "github.com/hashicorp/consul/agent/structs" - "github.com/hashicorp/consul/proto/pbpeering" + "github.com/hashicorp/consul/proto/private/pbpeering" ) // CacheTrustBundle satisfies the proxycfg.TrustBundle interface by sourcing diff --git a/agent/proxycfg-glue/trust_bundle_test.go b/agent/proxycfg-glue/trust_bundle_test.go index 878b42df81d..8d4270f07cf 100644 --- a/agent/proxycfg-glue/trust_bundle_test.go +++ b/agent/proxycfg-glue/trust_bundle_test.go @@ -13,7 +13,7 @@ import ( "github.com/hashicorp/consul/agent/proxycfg" "github.com/hashicorp/consul/agent/structs" "github.com/hashicorp/consul/lib" - "github.com/hashicorp/consul/proto/pbpeering" + "github.com/hashicorp/consul/proto/private/pbpeering" "github.com/hashicorp/consul/sdk/testutil" ) diff --git a/agent/proxycfg/api_gateway.go b/agent/proxycfg/api_gateway.go index c9b5ad1007e..c5a44f17c6c 100644 --- a/agent/proxycfg/api_gateway.go +++ b/agent/proxycfg/api_gateway.go @@ -7,7 +7,7 @@ import ( cachetype "github.com/hashicorp/consul/agent/cache-types" "github.com/hashicorp/consul/agent/proxycfg/internal/watch" "github.com/hashicorp/consul/agent/structs" - "github.com/hashicorp/consul/proto/pbpeering" + "github.com/hashicorp/consul/proto/private/pbpeering" ) var _ kindHandler = (*handlerAPIGateway)(nil) diff --git a/agent/proxycfg/connect_proxy.go b/agent/proxycfg/connect_proxy.go index 81b41db6940..98001fd8663 100644 --- a/agent/proxycfg/connect_proxy.go +++ b/agent/proxycfg/connect_proxy.go @@ -8,7 +8,7 @@ import ( cachetype "github.com/hashicorp/consul/agent/cache-types" "github.com/hashicorp/consul/agent/proxycfg/internal/watch" "github.com/hashicorp/consul/agent/structs" - "github.com/hashicorp/consul/proto/pbpeering" + "github.com/hashicorp/consul/proto/private/pbpeering" ) type handlerConnectProxy struct { diff --git a/agent/proxycfg/ingress_gateway.go b/agent/proxycfg/ingress_gateway.go index f0f75d8107c..00e0ae27705 100644 --- a/agent/proxycfg/ingress_gateway.go +++ b/agent/proxycfg/ingress_gateway.go @@ -7,7 +7,7 @@ import ( cachetype "github.com/hashicorp/consul/agent/cache-types" "github.com/hashicorp/consul/agent/proxycfg/internal/watch" "github.com/hashicorp/consul/agent/structs" - "github.com/hashicorp/consul/proto/pbpeering" + "github.com/hashicorp/consul/proto/private/pbpeering" ) type handlerIngressGateway struct { diff --git a/agent/proxycfg/manager_test.go b/agent/proxycfg/manager_test.go index 7d946ce823f..b478489a61e 100644 --- a/agent/proxycfg/manager_test.go +++ b/agent/proxycfg/manager_test.go @@ -13,7 +13,7 @@ import ( "github.com/hashicorp/consul/agent/proxycfg/internal/watch" "github.com/hashicorp/consul/agent/structs" "github.com/hashicorp/consul/api" - "github.com/hashicorp/consul/proto/pbpeering" + "github.com/hashicorp/consul/proto/private/pbpeering" "github.com/hashicorp/consul/sdk/testutil" ) diff --git a/agent/proxycfg/mesh_gateway.go b/agent/proxycfg/mesh_gateway.go index 28375d68e2d..a60f921cc7d 100644 --- a/agent/proxycfg/mesh_gateway.go +++ b/agent/proxycfg/mesh_gateway.go @@ -17,7 +17,7 @@ import ( "github.com/hashicorp/consul/agent/structs" "github.com/hashicorp/consul/lib/maps" "github.com/hashicorp/consul/logging" - "github.com/hashicorp/consul/proto/pbpeering" + "github.com/hashicorp/consul/proto/private/pbpeering" ) type handlerMeshGateway struct { diff --git a/agent/proxycfg/proxycfg.deepcopy.go b/agent/proxycfg/proxycfg.deepcopy.go index f1772ae72ed..2694c31eda5 100644 --- a/agent/proxycfg/proxycfg.deepcopy.go +++ b/agent/proxycfg/proxycfg.deepcopy.go @@ -5,7 +5,7 @@ package proxycfg import ( "context" "github.com/hashicorp/consul/agent/structs" - "github.com/hashicorp/consul/proto/pbpeering" + "github.com/hashicorp/consul/proto/private/pbpeering" "github.com/hashicorp/consul/types" ) diff --git a/agent/proxycfg/snapshot.go b/agent/proxycfg/snapshot.go index f60e62319e5..68b85f97547 100644 --- a/agent/proxycfg/snapshot.go +++ b/agent/proxycfg/snapshot.go @@ -12,7 +12,7 @@ import ( "github.com/hashicorp/consul/agent/proxycfg/internal/watch" "github.com/hashicorp/consul/agent/structs" "github.com/hashicorp/consul/lib" - "github.com/hashicorp/consul/proto/pbpeering" + "github.com/hashicorp/consul/proto/private/pbpeering" ) // TODO(ingress): Can we think of a better for this bag of data? diff --git a/agent/proxycfg/snapshot_test.go b/agent/proxycfg/snapshot_test.go index 92f2ac19f8e..ebb5798211b 100644 --- a/agent/proxycfg/snapshot_test.go +++ b/agent/proxycfg/snapshot_test.go @@ -10,7 +10,7 @@ import ( fuzz "github.com/google/gofuzz" "github.com/hashicorp/consul/agent/proxycfg/internal/watch" "github.com/hashicorp/consul/agent/structs" - "github.com/hashicorp/consul/proto/pbpeering" + "github.com/hashicorp/consul/proto/private/pbpeering" "github.com/stretchr/testify/require" ) diff --git a/agent/proxycfg/state_test.go b/agent/proxycfg/state_test.go index 894f2bd4795..b3cf47a42f0 100644 --- a/agent/proxycfg/state_test.go +++ b/agent/proxycfg/state_test.go @@ -15,8 +15,8 @@ import ( cachetype "github.com/hashicorp/consul/agent/cache-types" "github.com/hashicorp/consul/agent/consul/discoverychain" "github.com/hashicorp/consul/agent/structs" - "github.com/hashicorp/consul/proto/pbpeering" - "github.com/hashicorp/consul/proto/prototest" + "github.com/hashicorp/consul/proto/private/pbpeering" + "github.com/hashicorp/consul/proto/private/prototest" "github.com/hashicorp/consul/sdk/testutil" ) diff --git a/agent/proxycfg/testing.go b/agent/proxycfg/testing.go index 8fbb247e084..412688d51d1 100644 --- a/agent/proxycfg/testing.go +++ b/agent/proxycfg/testing.go @@ -20,7 +20,7 @@ import ( "github.com/hashicorp/consul/agent/connect" "github.com/hashicorp/consul/agent/structs" "github.com/hashicorp/consul/api" - "github.com/hashicorp/consul/proto/pbpeering" + "github.com/hashicorp/consul/proto/private/pbpeering" ) func TestPeerTrustBundles(t testing.T) *pbpeering.TrustBundleListByServiceResponse { diff --git a/agent/proxycfg/testing_mesh_gateway.go b/agent/proxycfg/testing_mesh_gateway.go index f6b463f9d3f..c968189de32 100644 --- a/agent/proxycfg/testing_mesh_gateway.go +++ b/agent/proxycfg/testing_mesh_gateway.go @@ -11,7 +11,7 @@ import ( "github.com/hashicorp/consul/agent/connect" "github.com/hashicorp/consul/agent/consul/discoverychain" "github.com/hashicorp/consul/agent/structs" - "github.com/hashicorp/consul/proto/pbpeering" + "github.com/hashicorp/consul/proto/private/pbpeering" ) func TestConfigSnapshotMeshGateway(t testing.T, variant string, nsFn func(ns *structs.NodeService), extraUpdates []UpdateEvent) *ConfigSnapshot { diff --git a/agent/proxycfg/testing_peering.go b/agent/proxycfg/testing_peering.go index ae173afd4a7..82bdb70ee7b 100644 --- a/agent/proxycfg/testing_peering.go +++ b/agent/proxycfg/testing_peering.go @@ -4,7 +4,7 @@ import ( "github.com/mitchellh/go-testing-interface" "github.com/hashicorp/consul/agent/structs" - "github.com/hashicorp/consul/proto/pbpeering" + "github.com/hashicorp/consul/proto/private/pbpeering" ) func TestConfigSnapshotPeering(t testing.T) *ConfigSnapshot { diff --git a/agent/proxycfg/testing_upstreams.go b/agent/proxycfg/testing_upstreams.go index cb38a3de16a..84a18733cc7 100644 --- a/agent/proxycfg/testing_upstreams.go +++ b/agent/proxycfg/testing_upstreams.go @@ -8,7 +8,7 @@ import ( "github.com/hashicorp/consul/agent/connect" "github.com/hashicorp/consul/agent/consul/discoverychain" "github.com/hashicorp/consul/agent/structs" - "github.com/hashicorp/consul/proto/pbpeering" + "github.com/hashicorp/consul/proto/private/pbpeering" ) func setupTestVariationConfigEntriesAndSnapshot( diff --git a/agent/proxycfg/upstreams.go b/agent/proxycfg/upstreams.go index 367eeda62cc..30fe4328058 100644 --- a/agent/proxycfg/upstreams.go +++ b/agent/proxycfg/upstreams.go @@ -11,7 +11,7 @@ import ( "github.com/hashicorp/consul/acl" cachetype "github.com/hashicorp/consul/agent/cache-types" "github.com/hashicorp/consul/agent/structs" - "github.com/hashicorp/consul/proto/pbpeering" + "github.com/hashicorp/consul/proto/private/pbpeering" ) type handlerUpstreams struct { diff --git a/agent/rpc/operator/service.go b/agent/rpc/operator/service.go index cbe876a7f1d..6f3ef3cfda4 100644 --- a/agent/rpc/operator/service.go +++ b/agent/rpc/operator/service.go @@ -2,11 +2,12 @@ package operator import ( "context" + "github.com/hashicorp/consul/acl" "github.com/hashicorp/consul/acl/resolver" external "github.com/hashicorp/consul/agent/grpc-external" "github.com/hashicorp/consul/agent/structs" - "github.com/hashicorp/consul/proto/pboperator" + "github.com/hashicorp/consul/proto/private/pboperator" "github.com/hashicorp/go-hclog" "google.golang.org/grpc" ) diff --git a/agent/rpc/operator/service_test.go b/agent/rpc/operator/service_test.go index f9d7c52aeb0..b2bdd6990e4 100644 --- a/agent/rpc/operator/service_test.go +++ b/agent/rpc/operator/service_test.go @@ -8,12 +8,13 @@ import ( "github.com/hashicorp/go-hclog" "github.com/stretchr/testify/mock" "github.com/stretchr/testify/require" + "google.golang.org/grpc" "github.com/hashicorp/consul/acl" "github.com/hashicorp/consul/acl/resolver" "github.com/hashicorp/consul/agent/structs" - "github.com/hashicorp/consul/proto/pboperator" + "github.com/hashicorp/consul/proto/private/pboperator" ) type MockBackend struct { diff --git a/agent/rpc/peering/service.go b/agent/rpc/peering/service.go index 9a6b1adaa5d..1e4e93fc5c8 100644 --- a/agent/rpc/peering/service.go +++ b/agent/rpc/peering/service.go @@ -28,8 +28,8 @@ import ( "github.com/hashicorp/consul/agent/grpc-external/services/peerstream" "github.com/hashicorp/consul/agent/structs" "github.com/hashicorp/consul/lib" - "github.com/hashicorp/consul/proto/pbpeering" - "github.com/hashicorp/consul/proto/pbpeerstream" + "github.com/hashicorp/consul/proto/private/pbpeering" + "github.com/hashicorp/consul/proto/private/pbpeerstream" ) var ( diff --git a/agent/rpc/peering/service_oss_test.go b/agent/rpc/peering/service_oss_test.go index 173e018897c..bdaecda1a7f 100644 --- a/agent/rpc/peering/service_oss_test.go +++ b/agent/rpc/peering/service_oss_test.go @@ -10,7 +10,7 @@ import ( "github.com/stretchr/testify/require" - "github.com/hashicorp/consul/proto/pbpeering" + "github.com/hashicorp/consul/proto/private/pbpeering" ) func TestPeeringService_RejectsPartition(t *testing.T) { diff --git a/agent/rpc/peering/service_test.go b/agent/rpc/peering/service_test.go index b8fa04ef869..ced1e286c76 100644 --- a/agent/rpc/peering/service_test.go +++ b/agent/rpc/peering/service_test.go @@ -38,8 +38,8 @@ import ( "github.com/hashicorp/consul/agent/structs" "github.com/hashicorp/consul/agent/token" "github.com/hashicorp/consul/lib" - "github.com/hashicorp/consul/proto/pbpeering" - "github.com/hashicorp/consul/proto/prototest" + "github.com/hashicorp/consul/proto/private/pbpeering" + "github.com/hashicorp/consul/proto/private/prototest" "github.com/hashicorp/consul/sdk/freeport" "github.com/hashicorp/consul/sdk/testutil" "github.com/hashicorp/consul/sdk/testutil/retry" diff --git a/agent/rpc/peering/testing.go b/agent/rpc/peering/testing.go index 577f78229fc..7ee448ec144 100644 --- a/agent/rpc/peering/testing.go +++ b/agent/rpc/peering/testing.go @@ -3,7 +3,7 @@ package peering import ( "github.com/hashicorp/consul/acl" "github.com/hashicorp/consul/agent/structs" - "github.com/hashicorp/consul/proto/pbpeering" + "github.com/hashicorp/consul/proto/private/pbpeering" ) // same certificate that appears in our connect tests diff --git a/agent/rpcclient/health/health.go b/agent/rpcclient/health/health.go index 1f1781e1a68..1edc1bfd260 100644 --- a/agent/rpcclient/health/health.go +++ b/agent/rpcclient/health/health.go @@ -8,7 +8,7 @@ import ( "github.com/hashicorp/consul/agent/cache" "github.com/hashicorp/consul/agent/structs" "github.com/hashicorp/consul/agent/submatview" - "github.com/hashicorp/consul/proto/pbsubscribe" + "github.com/hashicorp/consul/proto/private/pbsubscribe" ) // Client provides access to service health data. diff --git a/agent/rpcclient/health/streaming_test.go b/agent/rpcclient/health/streaming_test.go index a55fac25b4e..915025a2131 100644 --- a/agent/rpcclient/health/streaming_test.go +++ b/agent/rpcclient/health/streaming_test.go @@ -5,7 +5,7 @@ import ( "google.golang.org/grpc" - "github.com/hashicorp/consul/proto/pbsubscribe" + "github.com/hashicorp/consul/proto/private/pbsubscribe" ) // streamClient is a mock StreamingClient for testing that allows diff --git a/agent/rpcclient/health/view.go b/agent/rpcclient/health/view.go index fd19cb4a001..1684382de72 100644 --- a/agent/rpcclient/health/view.go +++ b/agent/rpcclient/health/view.go @@ -12,8 +12,8 @@ import ( "google.golang.org/grpc" "github.com/hashicorp/consul/agent/structs" - "github.com/hashicorp/consul/proto/pbservice" - "github.com/hashicorp/consul/proto/pbsubscribe" + "github.com/hashicorp/consul/proto/private/pbservice" + "github.com/hashicorp/consul/proto/private/pbsubscribe" ) type MaterializerDeps struct { diff --git a/agent/rpcclient/health/view_test.go b/agent/rpcclient/health/view_test.go index 8fcb50da339..b419bc1ceab 100644 --- a/agent/rpcclient/health/view_test.go +++ b/agent/rpcclient/health/view_test.go @@ -17,10 +17,10 @@ import ( "github.com/hashicorp/consul/agent/structs" "github.com/hashicorp/consul/agent/submatview" - "github.com/hashicorp/consul/proto/pbcommon" - "github.com/hashicorp/consul/proto/pbservice" - "github.com/hashicorp/consul/proto/pbsubscribe" - "github.com/hashicorp/consul/proto/prototest" + "github.com/hashicorp/consul/proto/private/pbcommon" + "github.com/hashicorp/consul/proto/private/pbservice" + "github.com/hashicorp/consul/proto/private/pbsubscribe" + "github.com/hashicorp/consul/proto/private/prototest" "github.com/hashicorp/consul/sdk/testutil" "github.com/hashicorp/consul/types" ) diff --git a/agent/structs/structs_ext_test.go b/agent/structs/structs_ext_test.go index 185f5869068..8c74850a848 100644 --- a/agent/structs/structs_ext_test.go +++ b/agent/structs/structs_ext_test.go @@ -4,7 +4,7 @@ import ( "testing" "github.com/hashicorp/consul/agent/structs" - "github.com/hashicorp/consul/proto/pbpeering" + "github.com/hashicorp/consul/proto/private/pbpeering" "github.com/stretchr/testify/require" ) diff --git a/agent/submatview/handler.go b/agent/submatview/handler.go index 8f03fbfd4f9..557112e8bd2 100644 --- a/agent/submatview/handler.go +++ b/agent/submatview/handler.go @@ -1,7 +1,7 @@ package submatview import ( - "github.com/hashicorp/consul/proto/pbsubscribe" + "github.com/hashicorp/consul/proto/private/pbsubscribe" ) // eventHandler is a function which performs some operation on the received diff --git a/agent/submatview/local_materializer.go b/agent/submatview/local_materializer.go index b3d4480bdac..49ad26a2ae8 100644 --- a/agent/submatview/local_materializer.go +++ b/agent/submatview/local_materializer.go @@ -9,7 +9,7 @@ import ( "github.com/hashicorp/consul/agent/consul/state" "github.com/hashicorp/consul/agent/consul/stream" "github.com/hashicorp/consul/lib/retry" - "github.com/hashicorp/consul/proto/pbsubscribe" + "github.com/hashicorp/consul/proto/private/pbsubscribe" ) // LocalMaterializer is a materializer for a stream of events diff --git a/agent/submatview/local_materializer_test.go b/agent/submatview/local_materializer_test.go index 3e6f522f1d5..deb3c5606e0 100644 --- a/agent/submatview/local_materializer_test.go +++ b/agent/submatview/local_materializer_test.go @@ -13,7 +13,7 @@ import ( "github.com/hashicorp/consul/agent/consul/state" "github.com/hashicorp/consul/agent/consul/stream" "github.com/hashicorp/consul/agent/structs" - "github.com/hashicorp/consul/proto/pbsubscribe" + "github.com/hashicorp/consul/proto/private/pbsubscribe" ) func TestLocalMaterializer(t *testing.T) { diff --git a/agent/submatview/materializer.go b/agent/submatview/materializer.go index cc8f6311995..2a084b6a3e2 100644 --- a/agent/submatview/materializer.go +++ b/agent/submatview/materializer.go @@ -8,7 +8,7 @@ import ( "github.com/hashicorp/go-hclog" "github.com/hashicorp/consul/lib/retry" - "github.com/hashicorp/consul/proto/pbsubscribe" + "github.com/hashicorp/consul/proto/private/pbsubscribe" ) // View receives events from, and return results to, Materializer. A view is diff --git a/agent/submatview/rpc_materializer.go b/agent/submatview/rpc_materializer.go index 3b379d4e843..c7fa1faf6ad 100644 --- a/agent/submatview/rpc_materializer.go +++ b/agent/submatview/rpc_materializer.go @@ -7,7 +7,7 @@ import ( "google.golang.org/grpc/codes" "google.golang.org/grpc/status" - "github.com/hashicorp/consul/proto/pbsubscribe" + "github.com/hashicorp/consul/proto/private/pbsubscribe" ) // RPCMaterializer is a materializer for a streaming cache type diff --git a/agent/submatview/store_integration_test.go b/agent/submatview/store_integration_test.go index 0e3fb3c6307..a47e62e730d 100644 --- a/agent/submatview/store_integration_test.go +++ b/agent/submatview/store_integration_test.go @@ -26,7 +26,7 @@ import ( "github.com/hashicorp/consul/agent/rpcclient/health" "github.com/hashicorp/consul/agent/structs" "github.com/hashicorp/consul/agent/submatview" - "github.com/hashicorp/consul/proto/pbsubscribe" + "github.com/hashicorp/consul/proto/private/pbsubscribe" ) func TestStore_IntegrationWithBackend(t *testing.T) { diff --git a/agent/submatview/store_test.go b/agent/submatview/store_test.go index aab09959986..824b606f475 100644 --- a/agent/submatview/store_test.go +++ b/agent/submatview/store_test.go @@ -11,9 +11,9 @@ import ( "github.com/hashicorp/consul/agent/cache" "github.com/hashicorp/consul/lib/ttlcache" - "github.com/hashicorp/consul/proto/pbcommon" - "github.com/hashicorp/consul/proto/pbservice" - "github.com/hashicorp/consul/proto/pbsubscribe" + "github.com/hashicorp/consul/proto/private/pbcommon" + "github.com/hashicorp/consul/proto/private/pbservice" + "github.com/hashicorp/consul/proto/private/pbsubscribe" "github.com/hashicorp/consul/sdk/testutil" "github.com/hashicorp/consul/sdk/testutil/retry" ) diff --git a/agent/submatview/streaming_test.go b/agent/submatview/streaming_test.go index 7d87e63f1d9..62bcca65493 100644 --- a/agent/submatview/streaming_test.go +++ b/agent/submatview/streaming_test.go @@ -5,12 +5,12 @@ import ( "fmt" "sync" - "github.com/hashicorp/consul/proto/pbcommon" + "github.com/hashicorp/consul/proto/private/pbcommon" "google.golang.org/grpc" - "github.com/hashicorp/consul/proto/pbservice" - "github.com/hashicorp/consul/proto/pbsubscribe" + "github.com/hashicorp/consul/proto/private/pbservice" + "github.com/hashicorp/consul/proto/private/pbsubscribe" "github.com/hashicorp/consul/types" ) diff --git a/agent/ui_endpoint_test.go b/agent/ui_endpoint_test.go index 2d7ff7feb54..29f6da8aec7 100644 --- a/agent/ui_endpoint_test.go +++ b/agent/ui_endpoint_test.go @@ -22,7 +22,7 @@ import ( "github.com/hashicorp/consul/agent/config" "github.com/hashicorp/consul/agent/structs" "github.com/hashicorp/consul/api" - "github.com/hashicorp/consul/proto/pbpeering" + "github.com/hashicorp/consul/proto/private/pbpeering" "github.com/hashicorp/consul/sdk/testutil" "github.com/hashicorp/consul/sdk/testutil/retry" "github.com/hashicorp/consul/testrpc" diff --git a/agent/xds/clusters.go b/agent/xds/clusters.go index 7ee9a5577dc..704857e5daa 100644 --- a/agent/xds/clusters.go +++ b/agent/xds/clusters.go @@ -26,7 +26,7 @@ import ( "github.com/hashicorp/consul/agent/proxycfg" "github.com/hashicorp/consul/agent/structs" "github.com/hashicorp/consul/envoyextensions/xdscommon" - "github.com/hashicorp/consul/proto/pbpeering" + "github.com/hashicorp/consul/proto/private/pbpeering" ) const ( diff --git a/agent/xds/listeners.go b/agent/xds/listeners.go index 0c31c423849..1eb80d79cd6 100644 --- a/agent/xds/listeners.go +++ b/agent/xds/listeners.go @@ -42,7 +42,7 @@ import ( "github.com/hashicorp/consul/envoyextensions/xdscommon" "github.com/hashicorp/consul/lib" "github.com/hashicorp/consul/lib/stringslice" - "github.com/hashicorp/consul/proto/pbpeering" + "github.com/hashicorp/consul/proto/private/pbpeering" "github.com/hashicorp/consul/sdk/iptables" "github.com/hashicorp/consul/types" ) diff --git a/agent/xds/rbac.go b/agent/xds/rbac.go index d237b3e7b40..579de980909 100644 --- a/agent/xds/rbac.go +++ b/agent/xds/rbac.go @@ -16,7 +16,7 @@ import ( "github.com/hashicorp/consul/agent/connect" "github.com/hashicorp/consul/agent/structs" - "github.com/hashicorp/consul/proto/pbpeering" + "github.com/hashicorp/consul/proto/private/pbpeering" ) func makeRBACNetworkFilter( diff --git a/agent/xds/rbac_test.go b/agent/xds/rbac_test.go index e0ab500541e..113587bb908 100644 --- a/agent/xds/rbac_test.go +++ b/agent/xds/rbac_test.go @@ -14,7 +14,7 @@ import ( "github.com/stretchr/testify/require" "github.com/hashicorp/consul/agent/structs" - "github.com/hashicorp/consul/proto/pbpeering" + "github.com/hashicorp/consul/proto/private/pbpeering" ) func TestRemoveIntentionPrecedence(t *testing.T) { diff --git a/buf.work.yaml b/buf.work.yaml new file mode 100644 index 00000000000..3d501b74ea5 --- /dev/null +++ b/buf.work.yaml @@ -0,0 +1,5 @@ +version: v1 +directories: + - proto + - proto-public + diff --git a/build-support/scripts/protobuf.sh b/build-support/scripts/protobuf.sh index 7b815d355ea..f1c7b19fe68 100755 --- a/build-support/scripts/protobuf.sh +++ b/build-support/scripts/protobuf.sh @@ -45,24 +45,10 @@ function main { local mods=$(find . -name 'buf.gen.yaml' -exec dirname {} \; | sort) for mod in $mods do + status_stage "Generating protobuf module: $mod" ( - # This looks special and it is. First of all this is not just `buf generate` - # from within the $mod directory because doing that would have caused global - # file registration conflicts when Consul starts. TLDR there is that Go's - # protobuf code tracks protobufs by their file paths so those filepaths all - # must be unique. - # - # To work around those constraints we are trying to get the file descriptors - # passed off to protoc-gen-go to include the top level path. The file paths - # in the file descriptors will be relative to where `buf` is run. Therefore - # we must run `buf` from the root of the repo but still tell it to only - # generate the singular directory. The --template argument allows us to - # point buf a particular configuration for what code to generate. The - # --path argument allows us to tell `buf` which files/directories to - # operate on. Hopefully in the future `buf` will be able to add prefixes - # to file descriptor paths and we can modify this to work in a more natural way. - buf generate --template ${mod}/buf.gen.yaml --path ${mod} cd $mod + buf generate for proto_file in $(buf ls-files) do postprocess_protobuf_code $proto_file @@ -107,7 +93,7 @@ function postprocess_protobuf_code { if test -n "${build_tags}"; then for file in "${proto_go_path}" "${proto_go_bin_path}" "${proto_go_grpc_path}" do - if test -f "${file}" + if test -f "${file}" -a "$(head -n 2 ${file})" != "${build_tags}" then echo "Adding build tags to ${file}" echo -e "${build_tags}\n" >> "${file}.new" @@ -130,7 +116,7 @@ function postprocess_protobuf_code { function generate_mog_code { local mog_order - mog_order="$(go list -tags "${GOTAGS}" -deps ./proto/pb... | grep "consul/proto/")" + mog_order="$(go list -tags "${GOTAGS}" -deps ./proto/private/pb... | grep "consul/proto/private")" for FULL_PKG in ${mog_order}; do PKG="${FULL_PKG/#github.com\/hashicorp\/consul\/}" diff --git a/connect/tls_test.go b/connect/tls_test.go index 1f830722405..838bfc008cb 100644 --- a/connect/tls_test.go +++ b/connect/tls_test.go @@ -13,7 +13,7 @@ import ( "github.com/hashicorp/consul/agent" "github.com/hashicorp/consul/agent/connect" "github.com/hashicorp/consul/api" - "github.com/hashicorp/consul/proto/prototest" + "github.com/hashicorp/consul/proto/private/prototest" "github.com/hashicorp/consul/sdk/testutil" "github.com/hashicorp/consul/testrpc" ) diff --git a/internal/tools/proto-gen-rpc-glue/e2e/source.pb.go b/internal/tools/proto-gen-rpc-glue/e2e/source.pb.go index f90deb2067d..c0f01a6690c 100644 --- a/internal/tools/proto-gen-rpc-glue/e2e/source.pb.go +++ b/internal/tools/proto-gen-rpc-glue/e2e/source.pb.go @@ -3,7 +3,7 @@ package e2e -import "github.com/hashicorp/consul/proto/pbcommon" +import "github.com/hashicorp/consul/proto/private/pbcommon" // @consul-rpc-glue: WriteRequest,TargetDatacenter type ExampleWriteRequest struct { diff --git a/internal/tools/protoc-gen-consul-rate-limit/postprocess/main.go b/internal/tools/protoc-gen-consul-rate-limit/postprocess/main.go index 564a37796b2..4d5eabb58a2 100644 --- a/internal/tools/protoc-gen-consul-rate-limit/postprocess/main.go +++ b/internal/tools/protoc-gen-consul-rate-limit/postprocess/main.go @@ -7,6 +7,7 @@ import ( "flag" "fmt" "go/format" + "io/fs" "os" "path/filepath" "sort" @@ -83,6 +84,7 @@ func run(inputPaths []string, outputPath string) error { // enterpriseFileName adds the _ent filename suffix before the extension. // // Example: +// // enterpriseFileName("bar/baz/foo.gen.go") => "bar/baz/foo_ent.gen.go" func enterpriseFileName(filename string) string { fileName := filepath.Base(filename) @@ -113,24 +115,34 @@ func (s spec) GoOperationType() string { func collectSpecs(inputPaths []string) ([]spec, []spec, error) { var specs []spec + var specFiles []string for _, protoPath := range inputPaths { - specFiles, err := filepath.Glob(filepath.Join(protoPath, "*", ".ratelimit.tmp")) + err := filepath.WalkDir(protoPath, func(path string, info fs.DirEntry, err error) error { + if err != nil { + return err + } + if info.Name() == ".ratelimit.tmp" { + specFiles = append(specFiles, path) + } + + return nil + }) if err != nil { - return nil, nil, fmt.Errorf("failed to glob directory: %s - %s", protoPath, err) + return nil, nil, fmt.Errorf("failed to walk directory: %s - %w", protoPath, err) } + } - for _, file := range specFiles { - b, err := os.ReadFile(file) - if err != nil { - return nil, nil, fmt.Errorf("failed to read ratelimit file: %w", err) - } + for _, file := range specFiles { + b, err := os.ReadFile(file) + if err != nil { + return nil, nil, fmt.Errorf("failed to read ratelimit file: %w", err) + } - var fileSpecs []spec - if err := json.Unmarshal(b, &fileSpecs); err != nil { - return nil, nil, fmt.Errorf("failed to unmarshal ratelimit file %s - %w", file, err) - } - specs = append(specs, fileSpecs...) + var fileSpecs []spec + if err := json.Unmarshal(b, &fileSpecs); err != nil { + return nil, nil, fmt.Errorf("failed to unmarshal ratelimit file %s - %w", file, err) } + specs = append(specs, fileSpecs...) } sort.Slice(specs, func(a, b int) bool { diff --git a/proto-public/annotations/ratelimit/ratelimit.pb.binary.go b/proto-public/annotations/ratelimit/ratelimit.pb.binary.go index 316afdc87e0..a1bf8983f69 100644 --- a/proto-public/annotations/ratelimit/ratelimit.pb.binary.go +++ b/proto-public/annotations/ratelimit/ratelimit.pb.binary.go @@ -1,5 +1,5 @@ // Code generated by protoc-gen-go-binary. DO NOT EDIT. -// source: proto-public/annotations/ratelimit/ratelimit.proto +// source: annotations/ratelimit/ratelimit.proto package ratelimit diff --git a/proto-public/annotations/ratelimit/ratelimit.pb.go b/proto-public/annotations/ratelimit/ratelimit.pb.go index 80d21fb41ce..6887640f6ca 100644 --- a/proto-public/annotations/ratelimit/ratelimit.pb.go +++ b/proto-public/annotations/ratelimit/ratelimit.pb.go @@ -2,7 +2,7 @@ // versions: // protoc-gen-go v1.28.1 // protoc (unknown) -// source: proto-public/annotations/ratelimit/ratelimit.proto +// source: annotations/ratelimit/ratelimit.proto package ratelimit @@ -59,11 +59,11 @@ func (x OperationType) String() string { } func (OperationType) Descriptor() protoreflect.EnumDescriptor { - return file_proto_public_annotations_ratelimit_ratelimit_proto_enumTypes[0].Descriptor() + return file_annotations_ratelimit_ratelimit_proto_enumTypes[0].Descriptor() } func (OperationType) Type() protoreflect.EnumType { - return &file_proto_public_annotations_ratelimit_ratelimit_proto_enumTypes[0] + return &file_annotations_ratelimit_ratelimit_proto_enumTypes[0] } func (x OperationType) Number() protoreflect.EnumNumber { @@ -72,7 +72,7 @@ func (x OperationType) Number() protoreflect.EnumNumber { // Deprecated: Use OperationType.Descriptor instead. func (OperationType) EnumDescriptor() ([]byte, []int) { - return file_proto_public_annotations_ratelimit_ratelimit_proto_rawDescGZIP(), []int{0} + return file_annotations_ratelimit_ratelimit_proto_rawDescGZIP(), []int{0} } // Spec describes the kind of rate limit that will be applied to this RPC. @@ -87,7 +87,7 @@ type Spec struct { func (x *Spec) Reset() { *x = Spec{} if protoimpl.UnsafeEnabled { - mi := &file_proto_public_annotations_ratelimit_ratelimit_proto_msgTypes[0] + mi := &file_annotations_ratelimit_ratelimit_proto_msgTypes[0] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -100,7 +100,7 @@ func (x *Spec) String() string { func (*Spec) ProtoMessage() {} func (x *Spec) ProtoReflect() protoreflect.Message { - mi := &file_proto_public_annotations_ratelimit_ratelimit_proto_msgTypes[0] + mi := &file_annotations_ratelimit_ratelimit_proto_msgTypes[0] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -113,7 +113,7 @@ func (x *Spec) ProtoReflect() protoreflect.Message { // Deprecated: Use Spec.ProtoReflect.Descriptor instead. func (*Spec) Descriptor() ([]byte, []int) { - return file_proto_public_annotations_ratelimit_ratelimit_proto_rawDescGZIP(), []int{0} + return file_annotations_ratelimit_ratelimit_proto_rawDescGZIP(), []int{0} } func (x *Spec) GetOperationType() OperationType { @@ -123,96 +123,95 @@ func (x *Spec) GetOperationType() OperationType { return OperationType_OPERATION_TYPE_UNSPECIFIED } -var file_proto_public_annotations_ratelimit_ratelimit_proto_extTypes = []protoimpl.ExtensionInfo{ +var file_annotations_ratelimit_ratelimit_proto_extTypes = []protoimpl.ExtensionInfo{ { ExtendedType: (*descriptorpb.MethodOptions)(nil), ExtensionType: (*Spec)(nil), Field: 8300, Name: "hashicorp.consul.internal.ratelimit.spec", Tag: "bytes,8300,opt,name=spec", - Filename: "proto-public/annotations/ratelimit/ratelimit.proto", + Filename: "annotations/ratelimit/ratelimit.proto", }, } // Extension fields to descriptorpb.MethodOptions. var ( // optional hashicorp.consul.internal.ratelimit.Spec spec = 8300; - E_Spec = &file_proto_public_annotations_ratelimit_ratelimit_proto_extTypes[0] + E_Spec = &file_annotations_ratelimit_ratelimit_proto_extTypes[0] ) -var File_proto_public_annotations_ratelimit_ratelimit_proto protoreflect.FileDescriptor +var File_annotations_ratelimit_ratelimit_proto protoreflect.FileDescriptor -var file_proto_public_annotations_ratelimit_ratelimit_proto_rawDesc = []byte{ - 0x0a, 0x32, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2d, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x2f, 0x61, - 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x72, 0x61, 0x74, 0x65, 0x6c, - 0x69, 0x6d, 0x69, 0x74, 0x2f, 0x72, 0x61, 0x74, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x23, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, - 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, - 0x72, 0x61, 0x74, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x1a, 0x20, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x64, 0x65, 0x73, 0x63, 0x72, - 0x69, 0x70, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x61, 0x0a, 0x04, 0x53, - 0x70, 0x65, 0x63, 0x12, 0x59, 0x0a, 0x0e, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x32, 0x2e, 0x68, 0x61, - 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, - 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x72, 0x61, 0x74, 0x65, 0x6c, 0x69, 0x6d, 0x69, - 0x74, 0x2e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x52, - 0x0d, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x2a, 0x7d, - 0x0a, 0x0d, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, - 0x1e, 0x0a, 0x1a, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x59, 0x50, - 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, - 0x19, 0x0a, 0x15, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x59, 0x50, - 0x45, 0x5f, 0x45, 0x58, 0x45, 0x4d, 0x50, 0x54, 0x10, 0x01, 0x12, 0x17, 0x0a, 0x13, 0x4f, 0x50, - 0x45, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x52, 0x45, 0x41, - 0x44, 0x10, 0x02, 0x12, 0x18, 0x0a, 0x14, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, - 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x57, 0x52, 0x49, 0x54, 0x45, 0x10, 0x03, 0x3a, 0x5e, 0x0a, - 0x04, 0x73, 0x70, 0x65, 0x63, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xec, 0x40, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x68, - 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, - 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x72, 0x61, 0x74, 0x65, 0x6c, 0x69, 0x6d, - 0x69, 0x74, 0x2e, 0x53, 0x70, 0x65, 0x63, 0x52, 0x04, 0x73, 0x70, 0x65, 0x63, 0x42, 0xa9, 0x02, - 0x0a, 0x27, 0x63, 0x6f, 0x6d, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, - 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, - 0x72, 0x61, 0x74, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x42, 0x0e, 0x52, 0x61, 0x74, 0x65, 0x6c, - 0x69, 0x6d, 0x69, 0x74, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x3e, 0x67, 0x69, 0x74, - 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, - 0x70, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2d, 0x70, - 0x75, 0x62, 0x6c, 0x69, 0x63, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x2f, 0x72, 0x61, 0x74, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0xa2, 0x02, 0x04, 0x48, 0x43, - 0x49, 0x52, 0xaa, 0x02, 0x23, 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x43, - 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x52, - 0x61, 0x74, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0xca, 0x02, 0x23, 0x48, 0x61, 0x73, 0x68, 0x69, - 0x63, 0x6f, 0x72, 0x70, 0x5c, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x5c, 0x49, 0x6e, 0x74, 0x65, - 0x72, 0x6e, 0x61, 0x6c, 0x5c, 0x52, 0x61, 0x74, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0xe2, 0x02, - 0x2f, 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x5c, 0x43, 0x6f, 0x6e, 0x73, 0x75, - 0x6c, 0x5c, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5c, 0x52, 0x61, 0x74, 0x65, 0x6c, - 0x69, 0x6d, 0x69, 0x74, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, - 0xea, 0x02, 0x26, 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x3a, 0x3a, 0x43, 0x6f, - 0x6e, 0x73, 0x75, 0x6c, 0x3a, 0x3a, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x3a, 0x3a, - 0x52, 0x61, 0x74, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x33, +var file_annotations_ratelimit_ratelimit_proto_rawDesc = []byte{ + 0x0a, 0x25, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x72, 0x61, + 0x74, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x2f, 0x72, 0x61, 0x74, 0x65, 0x6c, 0x69, 0x6d, 0x69, + 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x23, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, + 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, + 0x61, 0x6c, 0x2e, 0x72, 0x61, 0x74, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x1a, 0x20, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x61, + 0x0a, 0x04, 0x53, 0x70, 0x65, 0x63, 0x12, 0x59, 0x0a, 0x0e, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x32, + 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, + 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x72, 0x61, 0x74, 0x65, 0x6c, + 0x69, 0x6d, 0x69, 0x74, 0x2e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, + 0x70, 0x65, 0x52, 0x0d, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, + 0x65, 0x2a, 0x7d, 0x0a, 0x0d, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, + 0x70, 0x65, 0x12, 0x1e, 0x0a, 0x1a, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, + 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, + 0x10, 0x00, 0x12, 0x19, 0x0a, 0x15, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, + 0x54, 0x59, 0x50, 0x45, 0x5f, 0x45, 0x58, 0x45, 0x4d, 0x50, 0x54, 0x10, 0x01, 0x12, 0x17, 0x0a, + 0x13, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, + 0x52, 0x45, 0x41, 0x44, 0x10, 0x02, 0x12, 0x18, 0x0a, 0x14, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, + 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x57, 0x52, 0x49, 0x54, 0x45, 0x10, 0x03, + 0x3a, 0x5e, 0x0a, 0x04, 0x73, 0x70, 0x65, 0x63, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, + 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xec, 0x40, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x29, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, + 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x72, 0x61, 0x74, 0x65, + 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x2e, 0x53, 0x70, 0x65, 0x63, 0x52, 0x04, 0x73, 0x70, 0x65, 0x63, + 0x42, 0xa9, 0x02, 0x0a, 0x27, 0x63, 0x6f, 0x6d, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, + 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, + 0x61, 0x6c, 0x2e, 0x72, 0x61, 0x74, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x42, 0x0e, 0x52, 0x61, + 0x74, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x3e, + 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x68, 0x61, 0x73, 0x68, 0x69, + 0x63, 0x6f, 0x72, 0x70, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2f, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x2d, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x72, 0x61, 0x74, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0xa2, 0x02, + 0x04, 0x48, 0x43, 0x49, 0x52, 0xaa, 0x02, 0x23, 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, + 0x70, 0x2e, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, + 0x6c, 0x2e, 0x52, 0x61, 0x74, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0xca, 0x02, 0x23, 0x48, 0x61, + 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x5c, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x5c, 0x49, + 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5c, 0x52, 0x61, 0x74, 0x65, 0x6c, 0x69, 0x6d, 0x69, + 0x74, 0xe2, 0x02, 0x2f, 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x5c, 0x43, 0x6f, + 0x6e, 0x73, 0x75, 0x6c, 0x5c, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5c, 0x52, 0x61, + 0x74, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, + 0x61, 0x74, 0x61, 0xea, 0x02, 0x26, 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x3a, + 0x3a, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x3a, 0x3a, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, + 0x6c, 0x3a, 0x3a, 0x52, 0x61, 0x74, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x62, 0x06, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x33, } var ( - file_proto_public_annotations_ratelimit_ratelimit_proto_rawDescOnce sync.Once - file_proto_public_annotations_ratelimit_ratelimit_proto_rawDescData = file_proto_public_annotations_ratelimit_ratelimit_proto_rawDesc + file_annotations_ratelimit_ratelimit_proto_rawDescOnce sync.Once + file_annotations_ratelimit_ratelimit_proto_rawDescData = file_annotations_ratelimit_ratelimit_proto_rawDesc ) -func file_proto_public_annotations_ratelimit_ratelimit_proto_rawDescGZIP() []byte { - file_proto_public_annotations_ratelimit_ratelimit_proto_rawDescOnce.Do(func() { - file_proto_public_annotations_ratelimit_ratelimit_proto_rawDescData = protoimpl.X.CompressGZIP(file_proto_public_annotations_ratelimit_ratelimit_proto_rawDescData) +func file_annotations_ratelimit_ratelimit_proto_rawDescGZIP() []byte { + file_annotations_ratelimit_ratelimit_proto_rawDescOnce.Do(func() { + file_annotations_ratelimit_ratelimit_proto_rawDescData = protoimpl.X.CompressGZIP(file_annotations_ratelimit_ratelimit_proto_rawDescData) }) - return file_proto_public_annotations_ratelimit_ratelimit_proto_rawDescData + return file_annotations_ratelimit_ratelimit_proto_rawDescData } -var file_proto_public_annotations_ratelimit_ratelimit_proto_enumTypes = make([]protoimpl.EnumInfo, 1) -var file_proto_public_annotations_ratelimit_ratelimit_proto_msgTypes = make([]protoimpl.MessageInfo, 1) -var file_proto_public_annotations_ratelimit_ratelimit_proto_goTypes = []interface{}{ +var file_annotations_ratelimit_ratelimit_proto_enumTypes = make([]protoimpl.EnumInfo, 1) +var file_annotations_ratelimit_ratelimit_proto_msgTypes = make([]protoimpl.MessageInfo, 1) +var file_annotations_ratelimit_ratelimit_proto_goTypes = []interface{}{ (OperationType)(0), // 0: hashicorp.consul.internal.ratelimit.OperationType (*Spec)(nil), // 1: hashicorp.consul.internal.ratelimit.Spec (*descriptorpb.MethodOptions)(nil), // 2: google.protobuf.MethodOptions } -var file_proto_public_annotations_ratelimit_ratelimit_proto_depIdxs = []int32{ +var file_annotations_ratelimit_ratelimit_proto_depIdxs = []int32{ 0, // 0: hashicorp.consul.internal.ratelimit.Spec.operation_type:type_name -> hashicorp.consul.internal.ratelimit.OperationType 2, // 1: hashicorp.consul.internal.ratelimit.spec:extendee -> google.protobuf.MethodOptions 1, // 2: hashicorp.consul.internal.ratelimit.spec:type_name -> hashicorp.consul.internal.ratelimit.Spec @@ -223,13 +222,13 @@ var file_proto_public_annotations_ratelimit_ratelimit_proto_depIdxs = []int32{ 0, // [0:1] is the sub-list for field type_name } -func init() { file_proto_public_annotations_ratelimit_ratelimit_proto_init() } -func file_proto_public_annotations_ratelimit_ratelimit_proto_init() { - if File_proto_public_annotations_ratelimit_ratelimit_proto != nil { +func init() { file_annotations_ratelimit_ratelimit_proto_init() } +func file_annotations_ratelimit_ratelimit_proto_init() { + if File_annotations_ratelimit_ratelimit_proto != nil { return } if !protoimpl.UnsafeEnabled { - file_proto_public_annotations_ratelimit_ratelimit_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + file_annotations_ratelimit_ratelimit_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Spec); i { case 0: return &v.state @@ -246,20 +245,20 @@ func file_proto_public_annotations_ratelimit_ratelimit_proto_init() { out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_proto_public_annotations_ratelimit_ratelimit_proto_rawDesc, + RawDescriptor: file_annotations_ratelimit_ratelimit_proto_rawDesc, NumEnums: 1, NumMessages: 1, NumExtensions: 1, NumServices: 0, }, - GoTypes: file_proto_public_annotations_ratelimit_ratelimit_proto_goTypes, - DependencyIndexes: file_proto_public_annotations_ratelimit_ratelimit_proto_depIdxs, - EnumInfos: file_proto_public_annotations_ratelimit_ratelimit_proto_enumTypes, - MessageInfos: file_proto_public_annotations_ratelimit_ratelimit_proto_msgTypes, - ExtensionInfos: file_proto_public_annotations_ratelimit_ratelimit_proto_extTypes, + GoTypes: file_annotations_ratelimit_ratelimit_proto_goTypes, + DependencyIndexes: file_annotations_ratelimit_ratelimit_proto_depIdxs, + EnumInfos: file_annotations_ratelimit_ratelimit_proto_enumTypes, + MessageInfos: file_annotations_ratelimit_ratelimit_proto_msgTypes, + ExtensionInfos: file_annotations_ratelimit_ratelimit_proto_extTypes, }.Build() - File_proto_public_annotations_ratelimit_ratelimit_proto = out.File - file_proto_public_annotations_ratelimit_ratelimit_proto_rawDesc = nil - file_proto_public_annotations_ratelimit_ratelimit_proto_goTypes = nil - file_proto_public_annotations_ratelimit_ratelimit_proto_depIdxs = nil + File_annotations_ratelimit_ratelimit_proto = out.File + file_annotations_ratelimit_ratelimit_proto_rawDesc = nil + file_annotations_ratelimit_ratelimit_proto_goTypes = nil + file_annotations_ratelimit_ratelimit_proto_depIdxs = nil } diff --git a/proto-public/buf.gen.yaml b/proto-public/buf.gen.yaml index 8a878a3d333..eb6c4a40800 100644 --- a/proto-public/buf.gen.yaml +++ b/proto-public/buf.gen.yaml @@ -2,13 +2,7 @@ version: v1 managed: enabled: true go_package_prefix: - # this is not github.com/hashicorp/consul/proto-public because we are going - # to execute buf generate from the top level directory so that the filepaths - # contain the full path within the repo. This avoids registration conflicts - # in protocolbuffers/protobuf-go when Consul starts. Those conflicts would - # have been due to a protobuf file being registered to a global registry - # using a relative file name. - default: github.com/hashicorp/consul + default: github.com/hashicorp/consul/proto-public plugins: - name: go out: . diff --git a/proto-public/buf.yaml b/proto-public/buf.yaml index 85ac0bcd5bd..6167085d4f4 100644 --- a/proto-public/buf.yaml +++ b/proto-public/buf.yaml @@ -1,4 +1,5 @@ version: v1 +name: buf.build/hashicorp/consul lint: use: - DEFAULT diff --git a/proto-public/pbacl/acl.pb.binary.go b/proto-public/pbacl/acl.pb.binary.go index 63284c9ce98..ce563f31b8a 100644 --- a/proto-public/pbacl/acl.pb.binary.go +++ b/proto-public/pbacl/acl.pb.binary.go @@ -1,5 +1,5 @@ // Code generated by protoc-gen-go-binary. DO NOT EDIT. -// source: proto-public/pbacl/acl.proto +// source: pbacl/acl.proto package pbacl diff --git a/proto-public/pbacl/acl.pb.go b/proto-public/pbacl/acl.pb.go index 2fb7cd03444..f574708e2bd 100644 --- a/proto-public/pbacl/acl.pb.go +++ b/proto-public/pbacl/acl.pb.go @@ -2,7 +2,7 @@ // versions: // protoc-gen-go v1.28.1 // protoc (unknown) -// source: proto-public/pbacl/acl.proto +// source: pbacl/acl.proto package pbacl @@ -30,7 +30,7 @@ type LogoutResponse struct { func (x *LogoutResponse) Reset() { *x = LogoutResponse{} if protoimpl.UnsafeEnabled { - mi := &file_proto_public_pbacl_acl_proto_msgTypes[0] + mi := &file_pbacl_acl_proto_msgTypes[0] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -43,7 +43,7 @@ func (x *LogoutResponse) String() string { func (*LogoutResponse) ProtoMessage() {} func (x *LogoutResponse) ProtoReflect() protoreflect.Message { - mi := &file_proto_public_pbacl_acl_proto_msgTypes[0] + mi := &file_pbacl_acl_proto_msgTypes[0] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -56,7 +56,7 @@ func (x *LogoutResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use LogoutResponse.ProtoReflect.Descriptor instead. func (*LogoutResponse) Descriptor() ([]byte, []int) { - return file_proto_public_pbacl_acl_proto_rawDescGZIP(), []int{0} + return file_pbacl_acl_proto_rawDescGZIP(), []int{0} } type LoginRequest struct { @@ -86,7 +86,7 @@ type LoginRequest struct { func (x *LoginRequest) Reset() { *x = LoginRequest{} if protoimpl.UnsafeEnabled { - mi := &file_proto_public_pbacl_acl_proto_msgTypes[1] + mi := &file_pbacl_acl_proto_msgTypes[1] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -99,7 +99,7 @@ func (x *LoginRequest) String() string { func (*LoginRequest) ProtoMessage() {} func (x *LoginRequest) ProtoReflect() protoreflect.Message { - mi := &file_proto_public_pbacl_acl_proto_msgTypes[1] + mi := &file_pbacl_acl_proto_msgTypes[1] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -112,7 +112,7 @@ func (x *LoginRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use LoginRequest.ProtoReflect.Descriptor instead. func (*LoginRequest) Descriptor() ([]byte, []int) { - return file_proto_public_pbacl_acl_proto_rawDescGZIP(), []int{1} + return file_pbacl_acl_proto_rawDescGZIP(), []int{1} } func (x *LoginRequest) GetAuthMethod() string { @@ -169,7 +169,7 @@ type LoginResponse struct { func (x *LoginResponse) Reset() { *x = LoginResponse{} if protoimpl.UnsafeEnabled { - mi := &file_proto_public_pbacl_acl_proto_msgTypes[2] + mi := &file_pbacl_acl_proto_msgTypes[2] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -182,7 +182,7 @@ func (x *LoginResponse) String() string { func (*LoginResponse) ProtoMessage() {} func (x *LoginResponse) ProtoReflect() protoreflect.Message { - mi := &file_proto_public_pbacl_acl_proto_msgTypes[2] + mi := &file_pbacl_acl_proto_msgTypes[2] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -195,7 +195,7 @@ func (x *LoginResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use LoginResponse.ProtoReflect.Descriptor instead. func (*LoginResponse) Descriptor() ([]byte, []int) { - return file_proto_public_pbacl_acl_proto_rawDescGZIP(), []int{2} + return file_pbacl_acl_proto_rawDescGZIP(), []int{2} } func (x *LoginResponse) GetToken() *LoginToken { @@ -219,7 +219,7 @@ type LoginToken struct { func (x *LoginToken) Reset() { *x = LoginToken{} if protoimpl.UnsafeEnabled { - mi := &file_proto_public_pbacl_acl_proto_msgTypes[3] + mi := &file_pbacl_acl_proto_msgTypes[3] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -232,7 +232,7 @@ func (x *LoginToken) String() string { func (*LoginToken) ProtoMessage() {} func (x *LoginToken) ProtoReflect() protoreflect.Message { - mi := &file_proto_public_pbacl_acl_proto_msgTypes[3] + mi := &file_pbacl_acl_proto_msgTypes[3] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -245,7 +245,7 @@ func (x *LoginToken) ProtoReflect() protoreflect.Message { // Deprecated: Use LoginToken.ProtoReflect.Descriptor instead. func (*LoginToken) Descriptor() ([]byte, []int) { - return file_proto_public_pbacl_acl_proto_rawDescGZIP(), []int{3} + return file_pbacl_acl_proto_rawDescGZIP(), []int{3} } func (x *LoginToken) GetAccessorId() string { @@ -276,7 +276,7 @@ type LogoutRequest struct { func (x *LogoutRequest) Reset() { *x = LogoutRequest{} if protoimpl.UnsafeEnabled { - mi := &file_proto_public_pbacl_acl_proto_msgTypes[4] + mi := &file_pbacl_acl_proto_msgTypes[4] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -289,7 +289,7 @@ func (x *LogoutRequest) String() string { func (*LogoutRequest) ProtoMessage() {} func (x *LogoutRequest) ProtoReflect() protoreflect.Message { - mi := &file_proto_public_pbacl_acl_proto_msgTypes[4] + mi := &file_pbacl_acl_proto_msgTypes[4] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -302,7 +302,7 @@ func (x *LogoutRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use LogoutRequest.ProtoReflect.Descriptor instead. func (*LogoutRequest) Descriptor() ([]byte, []int) { - return file_proto_public_pbacl_acl_proto_rawDescGZIP(), []int{4} + return file_pbacl_acl_proto_rawDescGZIP(), []int{4} } func (x *LogoutRequest) GetToken() string { @@ -319,91 +319,89 @@ func (x *LogoutRequest) GetDatacenter() string { return "" } -var File_proto_public_pbacl_acl_proto protoreflect.FileDescriptor - -var file_proto_public_pbacl_acl_proto_rawDesc = []byte{ - 0x0a, 0x1c, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2d, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x2f, 0x70, - 0x62, 0x61, 0x63, 0x6c, 0x2f, 0x61, 0x63, 0x6c, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x14, - 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, - 0x2e, 0x61, 0x63, 0x6c, 0x1a, 0x32, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2d, 0x70, 0x75, 0x62, 0x6c, - 0x69, 0x63, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x72, - 0x61, 0x74, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x2f, 0x72, 0x61, 0x74, 0x65, 0x6c, 0x69, 0x6d, - 0x69, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x10, 0x0a, 0x0e, 0x4c, 0x6f, 0x67, 0x6f, - 0x75, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xa9, 0x02, 0x0a, 0x0c, 0x4c, - 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x61, - 0x75, 0x74, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0a, 0x61, 0x75, 0x74, 0x68, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, 0x21, 0x0a, 0x0c, - 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0b, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, - 0x40, 0x0a, 0x04, 0x6d, 0x65, 0x74, 0x61, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2c, 0x2e, - 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, - 0x2e, 0x61, 0x63, 0x6c, 0x2e, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x6d, 0x65, 0x74, - 0x61, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, - 0x1c, 0x0a, 0x09, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x09, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, - 0x0a, 0x64, 0x61, 0x74, 0x61, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0a, 0x64, 0x61, 0x74, 0x61, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x1a, 0x37, 0x0a, - 0x09, 0x4d, 0x65, 0x74, 0x61, 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, 0x22, 0x47, 0x0a, 0x0d, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x36, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, - 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x61, 0x63, 0x6c, 0x2e, 0x4c, 0x6f, - 0x67, 0x69, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x22, - 0x4a, 0x0a, 0x0a, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x1f, 0x0a, - 0x0b, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0a, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x49, 0x64, 0x12, 0x1b, - 0x0a, 0x09, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x49, 0x64, 0x22, 0x45, 0x0a, 0x0d, 0x4c, - 0x6f, 0x67, 0x6f, 0x75, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, - 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, - 0x65, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x61, 0x74, 0x61, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x61, 0x74, 0x61, 0x63, 0x65, 0x6e, 0x74, - 0x65, 0x72, 0x32, 0xc3, 0x01, 0x0a, 0x0a, 0x41, 0x43, 0x4c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x12, 0x58, 0x0a, 0x05, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x12, 0x22, 0x2e, 0x68, 0x61, 0x73, - 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x61, 0x63, - 0x6c, 0x2e, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, - 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, - 0x6c, 0x2e, 0x61, 0x63, 0x6c, 0x2e, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x06, 0xe2, 0x86, 0x04, 0x02, 0x08, 0x03, 0x12, 0x5b, 0x0a, 0x06, 0x4c, - 0x6f, 0x67, 0x6f, 0x75, 0x74, 0x12, 0x23, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, - 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x61, 0x63, 0x6c, 0x2e, 0x4c, 0x6f, 0x67, - 0x6f, 0x75, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x68, 0x61, 0x73, - 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x61, 0x63, - 0x6c, 0x2e, 0x4c, 0x6f, 0x67, 0x6f, 0x75, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x06, 0xe2, 0x86, 0x04, 0x02, 0x08, 0x03, 0x42, 0xc6, 0x01, 0x0a, 0x18, 0x63, 0x6f, 0x6d, - 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, - 0x6c, 0x2e, 0x61, 0x63, 0x6c, 0x42, 0x08, 0x41, 0x63, 0x6c, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, - 0x01, 0x5a, 0x2e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x68, 0x61, - 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2f, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x2d, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x2f, 0x70, 0x62, 0x61, 0x63, - 0x6c, 0xa2, 0x02, 0x03, 0x48, 0x43, 0x41, 0xaa, 0x02, 0x14, 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, - 0x6f, 0x72, 0x70, 0x2e, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x41, 0x63, 0x6c, 0xca, 0x02, - 0x14, 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x5c, 0x43, 0x6f, 0x6e, 0x73, 0x75, - 0x6c, 0x5c, 0x41, 0x63, 0x6c, 0xe2, 0x02, 0x20, 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, - 0x70, 0x5c, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x5c, 0x41, 0x63, 0x6c, 0x5c, 0x47, 0x50, 0x42, - 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x16, 0x48, 0x61, 0x73, 0x68, 0x69, - 0x63, 0x6f, 0x72, 0x70, 0x3a, 0x3a, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x3a, 0x3a, 0x41, 0x63, - 0x6c, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +var File_pbacl_acl_proto protoreflect.FileDescriptor + +var file_pbacl_acl_proto_rawDesc = []byte{ + 0x0a, 0x0f, 0x70, 0x62, 0x61, 0x63, 0x6c, 0x2f, 0x61, 0x63, 0x6c, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x12, 0x14, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, + 0x73, 0x75, 0x6c, 0x2e, 0x61, 0x63, 0x6c, 0x1a, 0x25, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x72, 0x61, 0x74, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x2f, 0x72, + 0x61, 0x74, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x10, + 0x0a, 0x0e, 0x4c, 0x6f, 0x67, 0x6f, 0x75, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0xa9, 0x02, 0x0a, 0x0c, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x61, 0x75, 0x74, 0x68, 0x4d, 0x65, 0x74, 0x68, + 0x6f, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x5f, 0x74, 0x6f, 0x6b, + 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, + 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x40, 0x0a, 0x04, 0x6d, 0x65, 0x74, 0x61, 0x18, 0x03, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, + 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x61, 0x63, 0x6c, 0x2e, 0x4c, 0x6f, 0x67, 0x69, 0x6e, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x04, 0x6d, 0x65, 0x74, 0x61, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x61, 0x74, 0x61, 0x63, 0x65, 0x6e, 0x74, 0x65, + 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x61, 0x74, 0x61, 0x63, 0x65, 0x6e, + 0x74, 0x65, 0x72, 0x1a, 0x37, 0x0a, 0x09, 0x4d, 0x65, 0x74, 0x61, 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, 0x22, 0x47, 0x0a, 0x0d, + 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x36, 0x0a, + 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x68, + 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, + 0x61, 0x63, 0x6c, 0x2e, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x05, + 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x4a, 0x0a, 0x0a, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x54, 0x6f, + 0x6b, 0x65, 0x6e, 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x5f, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, + 0x6f, 0x72, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x5f, 0x69, + 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x49, + 0x64, 0x22, 0x45, 0x0a, 0x0d, 0x4c, 0x6f, 0x67, 0x6f, 0x75, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x61, 0x74, 0x61, + 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x61, + 0x74, 0x61, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x32, 0xc3, 0x01, 0x0a, 0x0a, 0x41, 0x43, 0x4c, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x58, 0x0a, 0x05, 0x4c, 0x6f, 0x67, 0x69, 0x6e, + 0x12, 0x22, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, + 0x73, 0x75, 0x6c, 0x2e, 0x61, 0x63, 0x6c, 0x2e, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, + 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x61, 0x63, 0x6c, 0x2e, 0x4c, 0x6f, 0x67, 0x69, + 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xe2, 0x86, 0x04, 0x02, 0x08, + 0x03, 0x12, 0x5b, 0x0a, 0x06, 0x4c, 0x6f, 0x67, 0x6f, 0x75, 0x74, 0x12, 0x23, 0x2e, 0x68, 0x61, + 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x61, + 0x63, 0x6c, 0x2e, 0x4c, 0x6f, 0x67, 0x6f, 0x75, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x24, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, + 0x73, 0x75, 0x6c, 0x2e, 0x61, 0x63, 0x6c, 0x2e, 0x4c, 0x6f, 0x67, 0x6f, 0x75, 0x74, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xe2, 0x86, 0x04, 0x02, 0x08, 0x03, 0x42, 0xc6, + 0x01, 0x0a, 0x18, 0x63, 0x6f, 0x6d, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, + 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x61, 0x63, 0x6c, 0x42, 0x08, 0x41, 0x63, 0x6c, + 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x2e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, + 0x63, 0x6f, 0x6d, 0x2f, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2f, 0x63, 0x6f, + 0x6e, 0x73, 0x75, 0x6c, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2d, 0x70, 0x75, 0x62, 0x6c, 0x69, + 0x63, 0x2f, 0x70, 0x62, 0x61, 0x63, 0x6c, 0xa2, 0x02, 0x03, 0x48, 0x43, 0x41, 0xaa, 0x02, 0x14, + 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, + 0x2e, 0x41, 0x63, 0x6c, 0xca, 0x02, 0x14, 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, + 0x5c, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x5c, 0x41, 0x63, 0x6c, 0xe2, 0x02, 0x20, 0x48, 0x61, + 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x5c, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x5c, 0x41, + 0x63, 0x6c, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, + 0x16, 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x3a, 0x3a, 0x43, 0x6f, 0x6e, 0x73, + 0x75, 0x6c, 0x3a, 0x3a, 0x41, 0x63, 0x6c, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( - file_proto_public_pbacl_acl_proto_rawDescOnce sync.Once - file_proto_public_pbacl_acl_proto_rawDescData = file_proto_public_pbacl_acl_proto_rawDesc + file_pbacl_acl_proto_rawDescOnce sync.Once + file_pbacl_acl_proto_rawDescData = file_pbacl_acl_proto_rawDesc ) -func file_proto_public_pbacl_acl_proto_rawDescGZIP() []byte { - file_proto_public_pbacl_acl_proto_rawDescOnce.Do(func() { - file_proto_public_pbacl_acl_proto_rawDescData = protoimpl.X.CompressGZIP(file_proto_public_pbacl_acl_proto_rawDescData) +func file_pbacl_acl_proto_rawDescGZIP() []byte { + file_pbacl_acl_proto_rawDescOnce.Do(func() { + file_pbacl_acl_proto_rawDescData = protoimpl.X.CompressGZIP(file_pbacl_acl_proto_rawDescData) }) - return file_proto_public_pbacl_acl_proto_rawDescData + return file_pbacl_acl_proto_rawDescData } -var file_proto_public_pbacl_acl_proto_msgTypes = make([]protoimpl.MessageInfo, 6) -var file_proto_public_pbacl_acl_proto_goTypes = []interface{}{ +var file_pbacl_acl_proto_msgTypes = make([]protoimpl.MessageInfo, 6) +var file_pbacl_acl_proto_goTypes = []interface{}{ (*LogoutResponse)(nil), // 0: hashicorp.consul.acl.LogoutResponse (*LoginRequest)(nil), // 1: hashicorp.consul.acl.LoginRequest (*LoginResponse)(nil), // 2: hashicorp.consul.acl.LoginResponse @@ -411,7 +409,7 @@ var file_proto_public_pbacl_acl_proto_goTypes = []interface{}{ (*LogoutRequest)(nil), // 4: hashicorp.consul.acl.LogoutRequest nil, // 5: hashicorp.consul.acl.LoginRequest.MetaEntry } -var file_proto_public_pbacl_acl_proto_depIdxs = []int32{ +var file_pbacl_acl_proto_depIdxs = []int32{ 5, // 0: hashicorp.consul.acl.LoginRequest.meta:type_name -> hashicorp.consul.acl.LoginRequest.MetaEntry 3, // 1: hashicorp.consul.acl.LoginResponse.token:type_name -> hashicorp.consul.acl.LoginToken 1, // 2: hashicorp.consul.acl.ACLService.Login:input_type -> hashicorp.consul.acl.LoginRequest @@ -425,13 +423,13 @@ var file_proto_public_pbacl_acl_proto_depIdxs = []int32{ 0, // [0:2] is the sub-list for field type_name } -func init() { file_proto_public_pbacl_acl_proto_init() } -func file_proto_public_pbacl_acl_proto_init() { - if File_proto_public_pbacl_acl_proto != nil { +func init() { file_pbacl_acl_proto_init() } +func file_pbacl_acl_proto_init() { + if File_pbacl_acl_proto != nil { return } if !protoimpl.UnsafeEnabled { - file_proto_public_pbacl_acl_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + file_pbacl_acl_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*LogoutResponse); i { case 0: return &v.state @@ -443,7 +441,7 @@ func file_proto_public_pbacl_acl_proto_init() { return nil } } - file_proto_public_pbacl_acl_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + file_pbacl_acl_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*LoginRequest); i { case 0: return &v.state @@ -455,7 +453,7 @@ func file_proto_public_pbacl_acl_proto_init() { return nil } } - file_proto_public_pbacl_acl_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + file_pbacl_acl_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*LoginResponse); i { case 0: return &v.state @@ -467,7 +465,7 @@ func file_proto_public_pbacl_acl_proto_init() { return nil } } - file_proto_public_pbacl_acl_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + file_pbacl_acl_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*LoginToken); i { case 0: return &v.state @@ -479,7 +477,7 @@ func file_proto_public_pbacl_acl_proto_init() { return nil } } - file_proto_public_pbacl_acl_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + file_pbacl_acl_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*LogoutRequest); i { case 0: return &v.state @@ -496,18 +494,18 @@ func file_proto_public_pbacl_acl_proto_init() { out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_proto_public_pbacl_acl_proto_rawDesc, + RawDescriptor: file_pbacl_acl_proto_rawDesc, NumEnums: 0, NumMessages: 6, NumExtensions: 0, NumServices: 1, }, - GoTypes: file_proto_public_pbacl_acl_proto_goTypes, - DependencyIndexes: file_proto_public_pbacl_acl_proto_depIdxs, - MessageInfos: file_proto_public_pbacl_acl_proto_msgTypes, + GoTypes: file_pbacl_acl_proto_goTypes, + DependencyIndexes: file_pbacl_acl_proto_depIdxs, + MessageInfos: file_pbacl_acl_proto_msgTypes, }.Build() - File_proto_public_pbacl_acl_proto = out.File - file_proto_public_pbacl_acl_proto_rawDesc = nil - file_proto_public_pbacl_acl_proto_goTypes = nil - file_proto_public_pbacl_acl_proto_depIdxs = nil + File_pbacl_acl_proto = out.File + file_pbacl_acl_proto_rawDesc = nil + file_pbacl_acl_proto_goTypes = nil + file_pbacl_acl_proto_depIdxs = nil } diff --git a/proto-public/pbacl/acl.proto b/proto-public/pbacl/acl.proto index 71395acc5de..1e8d9645756 100644 --- a/proto-public/pbacl/acl.proto +++ b/proto-public/pbacl/acl.proto @@ -2,22 +2,18 @@ syntax = "proto3"; package hashicorp.consul.acl; -import "proto-public/annotations/ratelimit/ratelimit.proto"; +import "annotations/ratelimit/ratelimit.proto"; service ACLService { // Login exchanges the presented bearer token for a Consul ACL token using a // configured auth method. rpc Login(LoginRequest) returns (LoginResponse) { - option (hashicorp.consul.internal.ratelimit.spec) = { - operation_type: OPERATION_TYPE_WRITE, - }; + option (hashicorp.consul.internal.ratelimit.spec) = {operation_type: OPERATION_TYPE_WRITE}; } // Logout destroys the given ACL token once the caller is done with it. rpc Logout(LogoutRequest) returns (LogoutResponse) { - option (hashicorp.consul.internal.ratelimit.spec) = { - operation_type: OPERATION_TYPE_WRITE, - }; + option (hashicorp.consul.internal.ratelimit.spec) = {operation_type: OPERATION_TYPE_WRITE}; } } diff --git a/proto-public/pbacl/acl_grpc.pb.go b/proto-public/pbacl/acl_grpc.pb.go index 87155b8d0fc..19fd5553f32 100644 --- a/proto-public/pbacl/acl_grpc.pb.go +++ b/proto-public/pbacl/acl_grpc.pb.go @@ -2,7 +2,7 @@ // versions: // - protoc-gen-go-grpc v1.2.0 // - protoc (unknown) -// source: proto-public/pbacl/acl.proto +// source: pbacl/acl.proto package pbacl @@ -141,5 +141,5 @@ var ACLService_ServiceDesc = grpc.ServiceDesc{ }, }, Streams: []grpc.StreamDesc{}, - Metadata: "proto-public/pbacl/acl.proto", + Metadata: "pbacl/acl.proto", } diff --git a/proto-public/pbconnectca/ca.pb.binary.go b/proto-public/pbconnectca/ca.pb.binary.go index 5b5821c7acc..c7dea673936 100644 --- a/proto-public/pbconnectca/ca.pb.binary.go +++ b/proto-public/pbconnectca/ca.pb.binary.go @@ -1,5 +1,5 @@ // Code generated by protoc-gen-go-binary. DO NOT EDIT. -// source: proto-public/pbconnectca/ca.proto +// source: pbconnectca/ca.proto package pbconnectca diff --git a/proto-public/pbconnectca/ca.pb.go b/proto-public/pbconnectca/ca.pb.go index 6b487f2c5a1..23f1181fa39 100644 --- a/proto-public/pbconnectca/ca.pb.go +++ b/proto-public/pbconnectca/ca.pb.go @@ -2,7 +2,7 @@ // versions: // protoc-gen-go v1.28.1 // protoc (unknown) -// source: proto-public/pbconnectca/ca.proto +// source: pbconnectca/ca.proto package pbconnectca @@ -31,7 +31,7 @@ type WatchRootsRequest struct { func (x *WatchRootsRequest) Reset() { *x = WatchRootsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_proto_public_pbconnectca_ca_proto_msgTypes[0] + mi := &file_pbconnectca_ca_proto_msgTypes[0] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -44,7 +44,7 @@ func (x *WatchRootsRequest) String() string { func (*WatchRootsRequest) ProtoMessage() {} func (x *WatchRootsRequest) ProtoReflect() protoreflect.Message { - mi := &file_proto_public_pbconnectca_ca_proto_msgTypes[0] + mi := &file_pbconnectca_ca_proto_msgTypes[0] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -57,7 +57,7 @@ func (x *WatchRootsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use WatchRootsRequest.ProtoReflect.Descriptor instead. func (*WatchRootsRequest) Descriptor() ([]byte, []int) { - return file_proto_public_pbconnectca_ca_proto_rawDescGZIP(), []int{0} + return file_pbconnectca_ca_proto_rawDescGZIP(), []int{0} } type WatchRootsResponse struct { @@ -84,7 +84,7 @@ type WatchRootsResponse struct { func (x *WatchRootsResponse) Reset() { *x = WatchRootsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_proto_public_pbconnectca_ca_proto_msgTypes[1] + mi := &file_pbconnectca_ca_proto_msgTypes[1] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -97,7 +97,7 @@ func (x *WatchRootsResponse) String() string { func (*WatchRootsResponse) ProtoMessage() {} func (x *WatchRootsResponse) ProtoReflect() protoreflect.Message { - mi := &file_proto_public_pbconnectca_ca_proto_msgTypes[1] + mi := &file_pbconnectca_ca_proto_msgTypes[1] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -110,7 +110,7 @@ func (x *WatchRootsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use WatchRootsResponse.ProtoReflect.Descriptor instead. func (*WatchRootsResponse) Descriptor() ([]byte, []int) { - return file_proto_public_pbconnectca_ca_proto_rawDescGZIP(), []int{1} + return file_pbconnectca_ca_proto_rawDescGZIP(), []int{1} } func (x *WatchRootsResponse) GetActiveRootId() string { @@ -172,7 +172,7 @@ type CARoot struct { func (x *CARoot) Reset() { *x = CARoot{} if protoimpl.UnsafeEnabled { - mi := &file_proto_public_pbconnectca_ca_proto_msgTypes[2] + mi := &file_pbconnectca_ca_proto_msgTypes[2] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -185,7 +185,7 @@ func (x *CARoot) String() string { func (*CARoot) ProtoMessage() {} func (x *CARoot) ProtoReflect() protoreflect.Message { - mi := &file_proto_public_pbconnectca_ca_proto_msgTypes[2] + mi := &file_pbconnectca_ca_proto_msgTypes[2] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -198,7 +198,7 @@ func (x *CARoot) ProtoReflect() protoreflect.Message { // Deprecated: Use CARoot.ProtoReflect.Descriptor instead. func (*CARoot) Descriptor() ([]byte, []int) { - return file_proto_public_pbconnectca_ca_proto_rawDescGZIP(), []int{2} + return file_pbconnectca_ca_proto_rawDescGZIP(), []int{2} } func (x *CARoot) GetId() string { @@ -273,7 +273,7 @@ type SignRequest struct { func (x *SignRequest) Reset() { *x = SignRequest{} if protoimpl.UnsafeEnabled { - mi := &file_proto_public_pbconnectca_ca_proto_msgTypes[3] + mi := &file_pbconnectca_ca_proto_msgTypes[3] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -286,7 +286,7 @@ func (x *SignRequest) String() string { func (*SignRequest) ProtoMessage() {} func (x *SignRequest) ProtoReflect() protoreflect.Message { - mi := &file_proto_public_pbconnectca_ca_proto_msgTypes[3] + mi := &file_pbconnectca_ca_proto_msgTypes[3] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -299,7 +299,7 @@ func (x *SignRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SignRequest.ProtoReflect.Descriptor instead. func (*SignRequest) Descriptor() ([]byte, []int) { - return file_proto_public_pbconnectca_ca_proto_rawDescGZIP(), []int{3} + return file_pbconnectca_ca_proto_rawDescGZIP(), []int{3} } func (x *SignRequest) GetCsr() string { @@ -321,7 +321,7 @@ type SignResponse struct { func (x *SignResponse) Reset() { *x = SignResponse{} if protoimpl.UnsafeEnabled { - mi := &file_proto_public_pbconnectca_ca_proto_msgTypes[4] + mi := &file_pbconnectca_ca_proto_msgTypes[4] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -334,7 +334,7 @@ func (x *SignResponse) String() string { func (*SignResponse) ProtoMessage() {} func (x *SignResponse) ProtoReflect() protoreflect.Message { - mi := &file_proto_public_pbconnectca_ca_proto_msgTypes[4] + mi := &file_pbconnectca_ca_proto_msgTypes[4] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -347,7 +347,7 @@ func (x *SignResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use SignResponse.ProtoReflect.Descriptor instead. func (*SignResponse) Descriptor() ([]byte, []int) { - return file_proto_public_pbconnectca_ca_proto_rawDescGZIP(), []int{4} + return file_pbconnectca_ca_proto_rawDescGZIP(), []int{4} } func (x *SignResponse) GetCertPem() string { @@ -357,99 +357,97 @@ func (x *SignResponse) GetCertPem() string { return "" } -var File_proto_public_pbconnectca_ca_proto protoreflect.FileDescriptor - -var file_proto_public_pbconnectca_ca_proto_rawDesc = []byte{ - 0x0a, 0x21, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2d, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x2f, 0x70, - 0x62, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x63, 0x61, 0x2f, 0x63, 0x61, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x12, 0x1a, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, - 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x63, 0x61, 0x1a, - 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x1a, 0x32, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2d, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x2f, 0x61, - 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x72, 0x61, 0x74, 0x65, 0x6c, - 0x69, 0x6d, 0x69, 0x74, 0x2f, 0x72, 0x61, 0x74, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x13, 0x0a, 0x11, 0x57, 0x61, 0x74, 0x63, 0x68, 0x52, 0x6f, 0x6f, - 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x97, 0x01, 0x0a, 0x12, 0x57, 0x61, - 0x74, 0x63, 0x68, 0x52, 0x6f, 0x6f, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x24, 0x0a, 0x0e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x5f, - 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, - 0x52, 0x6f, 0x6f, 0x74, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x74, 0x72, 0x75, 0x73, 0x74, 0x5f, - 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x74, 0x72, - 0x75, 0x73, 0x74, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x12, 0x38, 0x0a, 0x05, 0x72, 0x6f, 0x6f, - 0x74, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, +var File_pbconnectca_ca_proto protoreflect.FileDescriptor + +var file_pbconnectca_ca_proto_rawDesc = []byte{ + 0x0a, 0x14, 0x70, 0x62, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x63, 0x61, 0x2f, 0x63, 0x61, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x1a, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, + 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, + 0x63, 0x61, 0x1a, 0x25, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, + 0x72, 0x61, 0x74, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x2f, 0x72, 0x61, 0x74, 0x65, 0x6c, 0x69, + 0x6d, 0x69, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, + 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x13, 0x0a, 0x11, 0x57, 0x61, + 0x74, 0x63, 0x68, 0x52, 0x6f, 0x6f, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, + 0x97, 0x01, 0x0a, 0x12, 0x57, 0x61, 0x74, 0x63, 0x68, 0x52, 0x6f, 0x6f, 0x74, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x24, 0x0a, 0x0e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, + 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, + 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x52, 0x6f, 0x6f, 0x74, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, + 0x74, 0x72, 0x75, 0x73, 0x74, 0x5f, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0b, 0x74, 0x72, 0x75, 0x73, 0x74, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x12, + 0x38, 0x0a, 0x05, 0x72, 0x6f, 0x6f, 0x74, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, + 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, + 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x63, 0x61, 0x2e, 0x43, 0x41, 0x52, 0x6f, + 0x6f, 0x74, 0x52, 0x05, 0x72, 0x6f, 0x6f, 0x74, 0x73, 0x22, 0x9d, 0x02, 0x0a, 0x06, 0x43, 0x41, + 0x52, 0x6f, 0x6f, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x65, 0x72, 0x69, + 0x61, 0x6c, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, + 0x0c, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x24, 0x0a, + 0x0e, 0x73, 0x69, 0x67, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x69, 0x64, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x69, 0x67, 0x6e, 0x69, 0x6e, 0x67, 0x4b, 0x65, + 0x79, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x72, 0x6f, 0x6f, 0x74, 0x5f, 0x63, 0x65, 0x72, 0x74, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x6f, 0x6f, 0x74, 0x43, 0x65, 0x72, 0x74, + 0x12, 0x2d, 0x0a, 0x12, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x65, + 0x5f, 0x63, 0x65, 0x72, 0x74, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x11, 0x69, 0x6e, + 0x74, 0x65, 0x72, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x65, 0x43, 0x65, 0x72, 0x74, 0x73, 0x12, + 0x16, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x06, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x12, 0x40, 0x0a, 0x0e, 0x72, 0x6f, 0x74, 0x61, 0x74, + 0x65, 0x64, 0x5f, 0x6f, 0x75, 0x74, 0x5f, 0x61, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0c, 0x72, 0x6f, 0x74, + 0x61, 0x74, 0x65, 0x64, 0x4f, 0x75, 0x74, 0x41, 0x74, 0x22, 0x1f, 0x0a, 0x0b, 0x53, 0x69, 0x67, + 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x63, 0x73, 0x72, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x63, 0x73, 0x72, 0x22, 0x29, 0x0a, 0x0c, 0x53, 0x69, + 0x67, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x63, 0x65, + 0x72, 0x74, 0x5f, 0x70, 0x65, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x65, + 0x72, 0x74, 0x50, 0x65, 0x6d, 0x32, 0xec, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, + 0x74, 0x43, 0x41, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x75, 0x0a, 0x0a, 0x57, 0x61, + 0x74, 0x63, 0x68, 0x52, 0x6f, 0x6f, 0x74, 0x73, 0x12, 0x2d, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x6e, - 0x65, 0x63, 0x74, 0x63, 0x61, 0x2e, 0x43, 0x41, 0x52, 0x6f, 0x6f, 0x74, 0x52, 0x05, 0x72, 0x6f, - 0x6f, 0x74, 0x73, 0x22, 0x9d, 0x02, 0x0a, 0x06, 0x43, 0x41, 0x52, 0x6f, 0x6f, 0x74, 0x12, 0x0e, - 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, - 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x5f, 0x6e, 0x75, 0x6d, - 0x62, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x73, 0x65, 0x72, 0x69, 0x61, - 0x6c, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x24, 0x0a, 0x0e, 0x73, 0x69, 0x67, 0x6e, 0x69, - 0x6e, 0x67, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0c, 0x73, 0x69, 0x67, 0x6e, 0x69, 0x6e, 0x67, 0x4b, 0x65, 0x79, 0x49, 0x64, 0x12, 0x1b, 0x0a, - 0x09, 0x72, 0x6f, 0x6f, 0x74, 0x5f, 0x63, 0x65, 0x72, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x72, 0x6f, 0x6f, 0x74, 0x43, 0x65, 0x72, 0x74, 0x12, 0x2d, 0x0a, 0x12, 0x69, 0x6e, - 0x74, 0x65, 0x72, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x65, 0x5f, 0x63, 0x65, 0x72, 0x74, 0x73, - 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x11, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6d, 0x65, 0x64, - 0x69, 0x61, 0x74, 0x65, 0x43, 0x65, 0x72, 0x74, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x63, 0x74, - 0x69, 0x76, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x76, - 0x65, 0x12, 0x40, 0x0a, 0x0e, 0x72, 0x6f, 0x74, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x6f, 0x75, 0x74, - 0x5f, 0x61, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, - 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0c, 0x72, 0x6f, 0x74, 0x61, 0x74, 0x65, 0x64, 0x4f, 0x75, - 0x74, 0x41, 0x74, 0x22, 0x1f, 0x0a, 0x0b, 0x53, 0x69, 0x67, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x63, 0x73, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x03, 0x63, 0x73, 0x72, 0x22, 0x29, 0x0a, 0x0c, 0x53, 0x69, 0x67, 0x6e, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x63, 0x65, 0x72, 0x74, 0x5f, 0x70, 0x65, 0x6d, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x65, 0x72, 0x74, 0x50, 0x65, 0x6d, 0x32, - 0xec, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x43, 0x41, 0x53, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x12, 0x75, 0x0a, 0x0a, 0x57, 0x61, 0x74, 0x63, 0x68, 0x52, 0x6f, 0x6f, - 0x74, 0x73, 0x12, 0x2d, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, + 0x65, 0x63, 0x74, 0x63, 0x61, 0x2e, 0x57, 0x61, 0x74, 0x63, 0x68, 0x52, 0x6f, 0x6f, 0x74, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, + 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x6e, 0x65, + 0x63, 0x74, 0x63, 0x61, 0x2e, 0x57, 0x61, 0x74, 0x63, 0x68, 0x52, 0x6f, 0x6f, 0x74, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xe2, 0x86, 0x04, 0x02, 0x08, 0x02, 0x30, + 0x01, 0x12, 0x61, 0x0a, 0x04, 0x53, 0x69, 0x67, 0x6e, 0x12, 0x27, 0x2e, 0x68, 0x61, 0x73, 0x68, + 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, + 0x6e, 0x65, 0x63, 0x74, 0x63, 0x61, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x63, 0x61, 0x2e, - 0x57, 0x61, 0x74, 0x63, 0x68, 0x52, 0x6f, 0x6f, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x2e, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, - 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x63, 0x61, 0x2e, 0x57, - 0x61, 0x74, 0x63, 0x68, 0x52, 0x6f, 0x6f, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x06, 0xe2, 0x86, 0x04, 0x02, 0x08, 0x02, 0x30, 0x01, 0x12, 0x61, 0x0a, 0x04, 0x53, - 0x69, 0x67, 0x6e, 0x12, 0x27, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, - 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x63, 0x61, - 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x68, - 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, - 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x63, 0x61, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xe2, 0x86, 0x04, 0x02, 0x08, 0x03, 0x42, 0xe9, - 0x01, 0x0a, 0x1e, 0x63, 0x6f, 0x6d, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, - 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x63, - 0x61, 0x42, 0x07, 0x43, 0x61, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x34, 0x67, 0x69, - 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, - 0x72, 0x70, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2d, - 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x2f, 0x70, 0x62, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, - 0x63, 0x61, 0xa2, 0x02, 0x03, 0x48, 0x43, 0x43, 0xaa, 0x02, 0x1a, 0x48, 0x61, 0x73, 0x68, 0x69, - 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x6e, - 0x65, 0x63, 0x74, 0x63, 0x61, 0xca, 0x02, 0x1a, 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, - 0x70, 0x5c, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x5c, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, - 0x63, 0x61, 0xe2, 0x02, 0x26, 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x5c, 0x43, - 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x5c, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x63, 0x61, 0x5c, - 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x1c, 0x48, 0x61, - 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x3a, 0x3a, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x3a, - 0x3a, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x63, 0x61, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x33, + 0x53, 0x69, 0x67, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xe2, 0x86, + 0x04, 0x02, 0x08, 0x03, 0x42, 0xe9, 0x01, 0x0a, 0x1e, 0x63, 0x6f, 0x6d, 0x2e, 0x68, 0x61, 0x73, + 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x63, 0x6f, + 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x63, 0x61, 0x42, 0x07, 0x43, 0x61, 0x50, 0x72, 0x6f, 0x74, 0x6f, + 0x50, 0x01, 0x5a, 0x34, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x68, + 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2f, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2d, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x2f, 0x70, 0x62, 0x63, + 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x63, 0x61, 0xa2, 0x02, 0x03, 0x48, 0x43, 0x43, 0xaa, 0x02, + 0x1a, 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x43, 0x6f, 0x6e, 0x73, 0x75, + 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x63, 0x61, 0xca, 0x02, 0x1a, 0x48, 0x61, + 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x5c, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x5c, 0x43, + 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x63, 0x61, 0xe2, 0x02, 0x26, 0x48, 0x61, 0x73, 0x68, 0x69, + 0x63, 0x6f, 0x72, 0x70, 0x5c, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x5c, 0x43, 0x6f, 0x6e, 0x6e, + 0x65, 0x63, 0x74, 0x63, 0x61, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, + 0x61, 0xea, 0x02, 0x1c, 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x3a, 0x3a, 0x43, + 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x3a, 0x3a, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x63, 0x61, + 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( - file_proto_public_pbconnectca_ca_proto_rawDescOnce sync.Once - file_proto_public_pbconnectca_ca_proto_rawDescData = file_proto_public_pbconnectca_ca_proto_rawDesc + file_pbconnectca_ca_proto_rawDescOnce sync.Once + file_pbconnectca_ca_proto_rawDescData = file_pbconnectca_ca_proto_rawDesc ) -func file_proto_public_pbconnectca_ca_proto_rawDescGZIP() []byte { - file_proto_public_pbconnectca_ca_proto_rawDescOnce.Do(func() { - file_proto_public_pbconnectca_ca_proto_rawDescData = protoimpl.X.CompressGZIP(file_proto_public_pbconnectca_ca_proto_rawDescData) +func file_pbconnectca_ca_proto_rawDescGZIP() []byte { + file_pbconnectca_ca_proto_rawDescOnce.Do(func() { + file_pbconnectca_ca_proto_rawDescData = protoimpl.X.CompressGZIP(file_pbconnectca_ca_proto_rawDescData) }) - return file_proto_public_pbconnectca_ca_proto_rawDescData + return file_pbconnectca_ca_proto_rawDescData } -var file_proto_public_pbconnectca_ca_proto_msgTypes = make([]protoimpl.MessageInfo, 5) -var file_proto_public_pbconnectca_ca_proto_goTypes = []interface{}{ +var file_pbconnectca_ca_proto_msgTypes = make([]protoimpl.MessageInfo, 5) +var file_pbconnectca_ca_proto_goTypes = []interface{}{ (*WatchRootsRequest)(nil), // 0: hashicorp.consul.connectca.WatchRootsRequest (*WatchRootsResponse)(nil), // 1: hashicorp.consul.connectca.WatchRootsResponse (*CARoot)(nil), // 2: hashicorp.consul.connectca.CARoot @@ -457,7 +455,7 @@ var file_proto_public_pbconnectca_ca_proto_goTypes = []interface{}{ (*SignResponse)(nil), // 4: hashicorp.consul.connectca.SignResponse (*timestamppb.Timestamp)(nil), // 5: google.protobuf.Timestamp } -var file_proto_public_pbconnectca_ca_proto_depIdxs = []int32{ +var file_pbconnectca_ca_proto_depIdxs = []int32{ 2, // 0: hashicorp.consul.connectca.WatchRootsResponse.roots:type_name -> hashicorp.consul.connectca.CARoot 5, // 1: hashicorp.consul.connectca.CARoot.rotated_out_at:type_name -> google.protobuf.Timestamp 0, // 2: hashicorp.consul.connectca.ConnectCAService.WatchRoots:input_type -> hashicorp.consul.connectca.WatchRootsRequest @@ -471,13 +469,13 @@ var file_proto_public_pbconnectca_ca_proto_depIdxs = []int32{ 0, // [0:2] is the sub-list for field type_name } -func init() { file_proto_public_pbconnectca_ca_proto_init() } -func file_proto_public_pbconnectca_ca_proto_init() { - if File_proto_public_pbconnectca_ca_proto != nil { +func init() { file_pbconnectca_ca_proto_init() } +func file_pbconnectca_ca_proto_init() { + if File_pbconnectca_ca_proto != nil { return } if !protoimpl.UnsafeEnabled { - file_proto_public_pbconnectca_ca_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + file_pbconnectca_ca_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*WatchRootsRequest); i { case 0: return &v.state @@ -489,7 +487,7 @@ func file_proto_public_pbconnectca_ca_proto_init() { return nil } } - file_proto_public_pbconnectca_ca_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + file_pbconnectca_ca_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*WatchRootsResponse); i { case 0: return &v.state @@ -501,7 +499,7 @@ func file_proto_public_pbconnectca_ca_proto_init() { return nil } } - file_proto_public_pbconnectca_ca_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + file_pbconnectca_ca_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CARoot); i { case 0: return &v.state @@ -513,7 +511,7 @@ func file_proto_public_pbconnectca_ca_proto_init() { return nil } } - file_proto_public_pbconnectca_ca_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + file_pbconnectca_ca_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SignRequest); i { case 0: return &v.state @@ -525,7 +523,7 @@ func file_proto_public_pbconnectca_ca_proto_init() { return nil } } - file_proto_public_pbconnectca_ca_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + file_pbconnectca_ca_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SignResponse); i { case 0: return &v.state @@ -542,18 +540,18 @@ func file_proto_public_pbconnectca_ca_proto_init() { out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_proto_public_pbconnectca_ca_proto_rawDesc, + RawDescriptor: file_pbconnectca_ca_proto_rawDesc, NumEnums: 0, NumMessages: 5, NumExtensions: 0, NumServices: 1, }, - GoTypes: file_proto_public_pbconnectca_ca_proto_goTypes, - DependencyIndexes: file_proto_public_pbconnectca_ca_proto_depIdxs, - MessageInfos: file_proto_public_pbconnectca_ca_proto_msgTypes, + GoTypes: file_pbconnectca_ca_proto_goTypes, + DependencyIndexes: file_pbconnectca_ca_proto_depIdxs, + MessageInfos: file_pbconnectca_ca_proto_msgTypes, }.Build() - File_proto_public_pbconnectca_ca_proto = out.File - file_proto_public_pbconnectca_ca_proto_rawDesc = nil - file_proto_public_pbconnectca_ca_proto_goTypes = nil - file_proto_public_pbconnectca_ca_proto_depIdxs = nil + File_pbconnectca_ca_proto = out.File + file_pbconnectca_ca_proto_rawDesc = nil + file_pbconnectca_ca_proto_goTypes = nil + file_pbconnectca_ca_proto_depIdxs = nil } diff --git a/proto-public/pbconnectca/ca.proto b/proto-public/pbconnectca/ca.proto index 0184bfc4aa3..3d4b857e5ec 100644 --- a/proto-public/pbconnectca/ca.proto +++ b/proto-public/pbconnectca/ca.proto @@ -2,25 +2,21 @@ syntax = "proto3"; package hashicorp.consul.connectca; +import "annotations/ratelimit/ratelimit.proto"; import "google/protobuf/timestamp.proto"; -import "proto-public/annotations/ratelimit/ratelimit.proto"; service ConnectCAService { // WatchRoots provides a stream on which you can receive the list of active // Connect CA roots. Current roots are sent immediately at the start of the // stream, and new lists will be sent whenever the roots are rotated. rpc WatchRoots(WatchRootsRequest) returns (stream WatchRootsResponse) { - option (hashicorp.consul.internal.ratelimit.spec) = { - operation_type: OPERATION_TYPE_READ, - }; + option (hashicorp.consul.internal.ratelimit.spec) = {operation_type: OPERATION_TYPE_READ}; } // Sign a leaf certificate for the service or agent identified by the SPIFFE // ID in the given CSR's SAN. rpc Sign(SignRequest) returns (SignResponse) { - option (hashicorp.consul.internal.ratelimit.spec) = { - operation_type: OPERATION_TYPE_WRITE, - }; + option (hashicorp.consul.internal.ratelimit.spec) = {operation_type: OPERATION_TYPE_WRITE}; } } diff --git a/proto-public/pbconnectca/ca_grpc.pb.go b/proto-public/pbconnectca/ca_grpc.pb.go index 58669becbcd..a4a9db6a1ae 100644 --- a/proto-public/pbconnectca/ca_grpc.pb.go +++ b/proto-public/pbconnectca/ca_grpc.pb.go @@ -2,7 +2,7 @@ // versions: // - protoc-gen-go-grpc v1.2.0 // - protoc (unknown) -// source: proto-public/pbconnectca/ca.proto +// source: pbconnectca/ca.proto package pbconnectca @@ -173,5 +173,5 @@ var ConnectCAService_ServiceDesc = grpc.ServiceDesc{ ServerStreams: true, }, }, - Metadata: "proto-public/pbconnectca/ca.proto", + Metadata: "pbconnectca/ca.proto", } diff --git a/proto-public/pbdataplane/dataplane.pb.binary.go b/proto-public/pbdataplane/dataplane.pb.binary.go index 6a754a0f221..1cf43d3ab2f 100644 --- a/proto-public/pbdataplane/dataplane.pb.binary.go +++ b/proto-public/pbdataplane/dataplane.pb.binary.go @@ -1,5 +1,5 @@ // Code generated by protoc-gen-go-binary. DO NOT EDIT. -// source: proto-public/pbdataplane/dataplane.proto +// source: pbdataplane/dataplane.proto package pbdataplane diff --git a/proto-public/pbdataplane/dataplane.pb.go b/proto-public/pbdataplane/dataplane.pb.go index c989f6df31e..de960441647 100644 --- a/proto-public/pbdataplane/dataplane.pb.go +++ b/proto-public/pbdataplane/dataplane.pb.go @@ -4,7 +4,7 @@ // versions: // protoc-gen-go v1.28.1 // protoc (unknown) -// source: proto-public/pbdataplane/dataplane.proto +// source: pbdataplane/dataplane.proto package pbdataplane @@ -60,11 +60,11 @@ func (x DataplaneFeatures) String() string { } func (DataplaneFeatures) Descriptor() protoreflect.EnumDescriptor { - return file_proto_public_pbdataplane_dataplane_proto_enumTypes[0].Descriptor() + return file_pbdataplane_dataplane_proto_enumTypes[0].Descriptor() } func (DataplaneFeatures) Type() protoreflect.EnumType { - return &file_proto_public_pbdataplane_dataplane_proto_enumTypes[0] + return &file_pbdataplane_dataplane_proto_enumTypes[0] } func (x DataplaneFeatures) Number() protoreflect.EnumNumber { @@ -73,7 +73,7 @@ func (x DataplaneFeatures) Number() protoreflect.EnumNumber { // Deprecated: Use DataplaneFeatures.Descriptor instead. func (DataplaneFeatures) EnumDescriptor() ([]byte, []int) { - return file_proto_public_pbdataplane_dataplane_proto_rawDescGZIP(), []int{0} + return file_pbdataplane_dataplane_proto_rawDescGZIP(), []int{0} } type ServiceKind int32 @@ -140,11 +140,11 @@ func (x ServiceKind) String() string { } func (ServiceKind) Descriptor() protoreflect.EnumDescriptor { - return file_proto_public_pbdataplane_dataplane_proto_enumTypes[1].Descriptor() + return file_pbdataplane_dataplane_proto_enumTypes[1].Descriptor() } func (ServiceKind) Type() protoreflect.EnumType { - return &file_proto_public_pbdataplane_dataplane_proto_enumTypes[1] + return &file_pbdataplane_dataplane_proto_enumTypes[1] } func (x ServiceKind) Number() protoreflect.EnumNumber { @@ -153,7 +153,7 @@ func (x ServiceKind) Number() protoreflect.EnumNumber { // Deprecated: Use ServiceKind.Descriptor instead. func (ServiceKind) EnumDescriptor() ([]byte, []int) { - return file_proto_public_pbdataplane_dataplane_proto_rawDescGZIP(), []int{1} + return file_pbdataplane_dataplane_proto_rawDescGZIP(), []int{1} } type GetSupportedDataplaneFeaturesRequest struct { @@ -165,7 +165,7 @@ type GetSupportedDataplaneFeaturesRequest struct { func (x *GetSupportedDataplaneFeaturesRequest) Reset() { *x = GetSupportedDataplaneFeaturesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_proto_public_pbdataplane_dataplane_proto_msgTypes[0] + mi := &file_pbdataplane_dataplane_proto_msgTypes[0] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -178,7 +178,7 @@ func (x *GetSupportedDataplaneFeaturesRequest) String() string { func (*GetSupportedDataplaneFeaturesRequest) ProtoMessage() {} func (x *GetSupportedDataplaneFeaturesRequest) ProtoReflect() protoreflect.Message { - mi := &file_proto_public_pbdataplane_dataplane_proto_msgTypes[0] + mi := &file_pbdataplane_dataplane_proto_msgTypes[0] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -191,7 +191,7 @@ func (x *GetSupportedDataplaneFeaturesRequest) ProtoReflect() protoreflect.Messa // Deprecated: Use GetSupportedDataplaneFeaturesRequest.ProtoReflect.Descriptor instead. func (*GetSupportedDataplaneFeaturesRequest) Descriptor() ([]byte, []int) { - return file_proto_public_pbdataplane_dataplane_proto_rawDescGZIP(), []int{0} + return file_pbdataplane_dataplane_proto_rawDescGZIP(), []int{0} } type DataplaneFeatureSupport struct { @@ -206,7 +206,7 @@ type DataplaneFeatureSupport struct { func (x *DataplaneFeatureSupport) Reset() { *x = DataplaneFeatureSupport{} if protoimpl.UnsafeEnabled { - mi := &file_proto_public_pbdataplane_dataplane_proto_msgTypes[1] + mi := &file_pbdataplane_dataplane_proto_msgTypes[1] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -219,7 +219,7 @@ func (x *DataplaneFeatureSupport) String() string { func (*DataplaneFeatureSupport) ProtoMessage() {} func (x *DataplaneFeatureSupport) ProtoReflect() protoreflect.Message { - mi := &file_proto_public_pbdataplane_dataplane_proto_msgTypes[1] + mi := &file_pbdataplane_dataplane_proto_msgTypes[1] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -232,7 +232,7 @@ func (x *DataplaneFeatureSupport) ProtoReflect() protoreflect.Message { // Deprecated: Use DataplaneFeatureSupport.ProtoReflect.Descriptor instead. func (*DataplaneFeatureSupport) Descriptor() ([]byte, []int) { - return file_proto_public_pbdataplane_dataplane_proto_rawDescGZIP(), []int{1} + return file_pbdataplane_dataplane_proto_rawDescGZIP(), []int{1} } func (x *DataplaneFeatureSupport) GetFeatureName() DataplaneFeatures { @@ -260,7 +260,7 @@ type GetSupportedDataplaneFeaturesResponse struct { func (x *GetSupportedDataplaneFeaturesResponse) Reset() { *x = GetSupportedDataplaneFeaturesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_proto_public_pbdataplane_dataplane_proto_msgTypes[2] + mi := &file_pbdataplane_dataplane_proto_msgTypes[2] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -273,7 +273,7 @@ func (x *GetSupportedDataplaneFeaturesResponse) String() string { func (*GetSupportedDataplaneFeaturesResponse) ProtoMessage() {} func (x *GetSupportedDataplaneFeaturesResponse) ProtoReflect() protoreflect.Message { - mi := &file_proto_public_pbdataplane_dataplane_proto_msgTypes[2] + mi := &file_pbdataplane_dataplane_proto_msgTypes[2] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -286,7 +286,7 @@ func (x *GetSupportedDataplaneFeaturesResponse) ProtoReflect() protoreflect.Mess // Deprecated: Use GetSupportedDataplaneFeaturesResponse.ProtoReflect.Descriptor instead. func (*GetSupportedDataplaneFeaturesResponse) Descriptor() ([]byte, []int) { - return file_proto_public_pbdataplane_dataplane_proto_rawDescGZIP(), []int{2} + return file_pbdataplane_dataplane_proto_rawDescGZIP(), []int{2} } func (x *GetSupportedDataplaneFeaturesResponse) GetSupportedDataplaneFeatures() []*DataplaneFeatureSupport { @@ -315,7 +315,7 @@ type GetEnvoyBootstrapParamsRequest struct { func (x *GetEnvoyBootstrapParamsRequest) Reset() { *x = GetEnvoyBootstrapParamsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_proto_public_pbdataplane_dataplane_proto_msgTypes[3] + mi := &file_pbdataplane_dataplane_proto_msgTypes[3] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -328,7 +328,7 @@ func (x *GetEnvoyBootstrapParamsRequest) String() string { func (*GetEnvoyBootstrapParamsRequest) ProtoMessage() {} func (x *GetEnvoyBootstrapParamsRequest) ProtoReflect() protoreflect.Message { - mi := &file_proto_public_pbdataplane_dataplane_proto_msgTypes[3] + mi := &file_pbdataplane_dataplane_proto_msgTypes[3] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -341,7 +341,7 @@ func (x *GetEnvoyBootstrapParamsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetEnvoyBootstrapParamsRequest.ProtoReflect.Descriptor instead. func (*GetEnvoyBootstrapParamsRequest) Descriptor() ([]byte, []int) { - return file_proto_public_pbdataplane_dataplane_proto_rawDescGZIP(), []int{3} + return file_pbdataplane_dataplane_proto_rawDescGZIP(), []int{3} } func (m *GetEnvoyBootstrapParamsRequest) GetNodeSpec() isGetEnvoyBootstrapParamsRequest_NodeSpec { @@ -425,7 +425,7 @@ type GetEnvoyBootstrapParamsResponse struct { func (x *GetEnvoyBootstrapParamsResponse) Reset() { *x = GetEnvoyBootstrapParamsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_proto_public_pbdataplane_dataplane_proto_msgTypes[4] + mi := &file_pbdataplane_dataplane_proto_msgTypes[4] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -438,7 +438,7 @@ func (x *GetEnvoyBootstrapParamsResponse) String() string { func (*GetEnvoyBootstrapParamsResponse) ProtoMessage() {} func (x *GetEnvoyBootstrapParamsResponse) ProtoReflect() protoreflect.Message { - mi := &file_proto_public_pbdataplane_dataplane_proto_msgTypes[4] + mi := &file_pbdataplane_dataplane_proto_msgTypes[4] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -451,7 +451,7 @@ func (x *GetEnvoyBootstrapParamsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetEnvoyBootstrapParamsResponse.ProtoReflect.Descriptor instead. func (*GetEnvoyBootstrapParamsResponse) Descriptor() ([]byte, []int) { - return file_proto_public_pbdataplane_dataplane_proto_rawDescGZIP(), []int{4} + return file_pbdataplane_dataplane_proto_rawDescGZIP(), []int{4} } func (x *GetEnvoyBootstrapParamsResponse) GetServiceKind() ServiceKind { @@ -517,158 +517,156 @@ func (x *GetEnvoyBootstrapParamsResponse) GetAccessLogs() []string { return nil } -var File_proto_public_pbdataplane_dataplane_proto protoreflect.FileDescriptor +var File_pbdataplane_dataplane_proto protoreflect.FileDescriptor -var file_proto_public_pbdataplane_dataplane_proto_rawDesc = []byte{ - 0x0a, 0x28, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2d, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x2f, 0x70, - 0x62, 0x64, 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2f, 0x64, 0x61, 0x74, 0x61, 0x70, - 0x6c, 0x61, 0x6e, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x1a, 0x68, 0x61, 0x73, 0x68, - 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x64, 0x61, 0x74, - 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x32, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2d, 0x70, 0x75, 0x62, 0x6c, - 0x69, 0x63, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x72, - 0x61, 0x74, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x2f, 0x72, 0x61, 0x74, 0x65, 0x6c, 0x69, 0x6d, - 0x69, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x26, 0x0a, 0x24, 0x47, 0x65, 0x74, 0x53, - 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x44, 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, - 0x65, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x22, 0x89, 0x01, 0x0a, 0x17, 0x44, 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x46, 0x65, - 0x61, 0x74, 0x75, 0x72, 0x65, 0x53, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x50, 0x0a, 0x0c, - 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0e, 0x32, 0x2d, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, +var file_pbdataplane_dataplane_proto_rawDesc = []byte{ + 0x0a, 0x1b, 0x70, 0x62, 0x64, 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2f, 0x64, 0x61, + 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x1a, 0x68, + 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, + 0x64, 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x1a, 0x25, 0x61, 0x6e, 0x6e, 0x6f, 0x74, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x72, 0x61, 0x74, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, + 0x2f, 0x72, 0x61, 0x74, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2f, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x26, + 0x0a, 0x24, 0x47, 0x65, 0x74, 0x53, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x44, 0x61, + 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x89, 0x01, 0x0a, 0x17, 0x44, 0x61, 0x74, 0x61, 0x70, + 0x6c, 0x61, 0x6e, 0x65, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x53, 0x75, 0x70, 0x70, 0x6f, + 0x72, 0x74, 0x12, 0x50, 0x0a, 0x0c, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2d, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, + 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x64, 0x61, 0x74, 0x61, + 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x46, + 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x52, 0x0b, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, + 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x65, + 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, + 0x65, 0x64, 0x22, 0x9e, 0x01, 0x0a, 0x25, 0x47, 0x65, 0x74, 0x53, 0x75, 0x70, 0x70, 0x6f, 0x72, + 0x74, 0x65, 0x64, 0x44, 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x46, 0x65, 0x61, 0x74, + 0x75, 0x72, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x75, 0x0a, 0x1c, + 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x70, 0x6c, + 0x61, 0x6e, 0x65, 0x5f, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, - 0x73, 0x52, 0x0b, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1c, - 0x0a, 0x09, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x09, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x22, 0x9e, 0x01, 0x0a, - 0x25, 0x47, 0x65, 0x74, 0x53, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x44, 0x61, 0x74, - 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x75, 0x0a, 0x1c, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, - 0x74, 0x65, 0x64, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x5f, 0x66, 0x65, - 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x68, - 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, - 0x64, 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x70, 0x6c, - 0x61, 0x6e, 0x65, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x53, 0x75, 0x70, 0x70, 0x6f, 0x72, - 0x74, 0x52, 0x1a, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x44, 0x61, 0x74, 0x61, - 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x22, 0xc2, 0x01, - 0x0a, 0x1e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x6f, 0x79, 0x42, 0x6f, 0x6f, 0x74, 0x73, 0x74, - 0x72, 0x61, 0x70, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x19, 0x0a, 0x07, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x48, 0x00, 0x52, 0x06, 0x6e, 0x6f, 0x64, 0x65, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x09, 0x6e, - 0x6f, 0x64, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, - 0x52, 0x08, 0x6e, 0x6f, 0x64, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, - 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x70, 0x61, 0x72, - 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x61, - 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, - 0x70, 0x61, 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, - 0x73, 0x70, 0x61, 0x63, 0x65, 0x42, 0x0b, 0x0a, 0x09, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x73, 0x70, - 0x65, 0x63, 0x22, 0xeb, 0x02, 0x0a, 0x1f, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x6f, 0x79, 0x42, - 0x6f, 0x6f, 0x74, 0x73, 0x74, 0x72, 0x61, 0x70, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4a, 0x0a, 0x0c, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x5f, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x27, 0x2e, 0x68, - 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, - 0x64, 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x4b, 0x69, 0x6e, 0x64, 0x52, 0x0b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4b, 0x69, - 0x6e, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x1c, 0x0a, 0x09, - 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x70, 0x61, - 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, - 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x61, 0x74, 0x61, - 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x61, - 0x74, 0x61, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x12, 0x2f, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, - 0x74, 0x52, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x17, 0x0a, 0x07, 0x6e, 0x6f, 0x64, - 0x65, 0x5f, 0x69, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6e, 0x6f, 0x64, 0x65, - 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6e, 0x6f, 0x64, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, - 0x1f, 0x0a, 0x0b, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x6c, 0x6f, 0x67, 0x73, 0x18, 0x09, - 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x6f, 0x67, 0x73, - 0x2a, 0xc7, 0x01, 0x0a, 0x11, 0x44, 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x46, 0x65, - 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x12, 0x22, 0x0a, 0x1e, 0x44, 0x41, 0x54, 0x41, 0x50, 0x4c, - 0x41, 0x4e, 0x45, 0x5f, 0x46, 0x45, 0x41, 0x54, 0x55, 0x52, 0x45, 0x53, 0x5f, 0x55, 0x4e, 0x53, - 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x24, 0x0a, 0x20, 0x44, 0x41, + 0x53, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x1a, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, + 0x65, 0x64, 0x44, 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x46, 0x65, 0x61, 0x74, 0x75, + 0x72, 0x65, 0x73, 0x22, 0xc2, 0x01, 0x0a, 0x1e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x6f, 0x79, + 0x42, 0x6f, 0x6f, 0x74, 0x73, 0x74, 0x72, 0x61, 0x70, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x07, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x06, 0x6e, 0x6f, 0x64, 0x65, 0x49, + 0x64, 0x12, 0x1d, 0x0a, 0x09, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x08, 0x6e, 0x6f, 0x64, 0x65, 0x4e, 0x61, 0x6d, 0x65, + 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, + 0x1c, 0x0a, 0x09, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x09, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, + 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x42, 0x0b, 0x0a, 0x09, 0x6e, + 0x6f, 0x64, 0x65, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x22, 0xeb, 0x02, 0x0a, 0x1f, 0x47, 0x65, 0x74, + 0x45, 0x6e, 0x76, 0x6f, 0x79, 0x42, 0x6f, 0x6f, 0x74, 0x73, 0x74, 0x72, 0x61, 0x70, 0x50, 0x61, + 0x72, 0x61, 0x6d, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4a, 0x0a, 0x0c, + 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x27, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, + 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2e, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4b, 0x69, 0x6e, 0x64, 0x52, 0x0b, 0x73, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x12, 0x1c, 0x0a, 0x09, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1e, + 0x0a, 0x0a, 0x64, 0x61, 0x74, 0x61, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0a, 0x64, 0x61, 0x74, 0x61, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x12, 0x2f, + 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, + 0x17, 0x0a, 0x07, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x06, 0x6e, 0x6f, 0x64, 0x65, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x6e, 0x6f, 0x64, 0x65, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6e, 0x6f, 0x64, + 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, + 0x6c, 0x6f, 0x67, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x61, 0x63, 0x63, 0x65, + 0x73, 0x73, 0x4c, 0x6f, 0x67, 0x73, 0x2a, 0xc7, 0x01, 0x0a, 0x11, 0x44, 0x61, 0x74, 0x61, 0x70, + 0x6c, 0x61, 0x6e, 0x65, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x12, 0x22, 0x0a, 0x1e, + 0x44, 0x41, 0x54, 0x41, 0x50, 0x4c, 0x41, 0x4e, 0x45, 0x5f, 0x46, 0x45, 0x41, 0x54, 0x55, 0x52, + 0x45, 0x53, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, + 0x12, 0x24, 0x0a, 0x20, 0x44, 0x41, 0x54, 0x41, 0x50, 0x4c, 0x41, 0x4e, 0x45, 0x5f, 0x46, 0x45, + 0x41, 0x54, 0x55, 0x52, 0x45, 0x53, 0x5f, 0x57, 0x41, 0x54, 0x43, 0x48, 0x5f, 0x53, 0x45, 0x52, + 0x56, 0x45, 0x52, 0x53, 0x10, 0x01, 0x12, 0x32, 0x0a, 0x2e, 0x44, 0x41, 0x54, 0x41, 0x50, 0x4c, + 0x41, 0x4e, 0x45, 0x5f, 0x46, 0x45, 0x41, 0x54, 0x55, 0x52, 0x45, 0x53, 0x5f, 0x45, 0x44, 0x47, + 0x45, 0x5f, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x5f, 0x4d, 0x41, + 0x4e, 0x41, 0x47, 0x45, 0x4d, 0x45, 0x4e, 0x54, 0x10, 0x02, 0x12, 0x34, 0x0a, 0x30, 0x44, 0x41, 0x54, 0x41, 0x50, 0x4c, 0x41, 0x4e, 0x45, 0x5f, 0x46, 0x45, 0x41, 0x54, 0x55, 0x52, 0x45, 0x53, - 0x5f, 0x57, 0x41, 0x54, 0x43, 0x48, 0x5f, 0x53, 0x45, 0x52, 0x56, 0x45, 0x52, 0x53, 0x10, 0x01, - 0x12, 0x32, 0x0a, 0x2e, 0x44, 0x41, 0x54, 0x41, 0x50, 0x4c, 0x41, 0x4e, 0x45, 0x5f, 0x46, 0x45, - 0x41, 0x54, 0x55, 0x52, 0x45, 0x53, 0x5f, 0x45, 0x44, 0x47, 0x45, 0x5f, 0x43, 0x45, 0x52, 0x54, - 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x5f, 0x4d, 0x41, 0x4e, 0x41, 0x47, 0x45, 0x4d, 0x45, - 0x4e, 0x54, 0x10, 0x02, 0x12, 0x34, 0x0a, 0x30, 0x44, 0x41, 0x54, 0x41, 0x50, 0x4c, 0x41, 0x4e, - 0x45, 0x5f, 0x46, 0x45, 0x41, 0x54, 0x55, 0x52, 0x45, 0x53, 0x5f, 0x45, 0x4e, 0x56, 0x4f, 0x59, - 0x5f, 0x42, 0x4f, 0x4f, 0x54, 0x53, 0x54, 0x52, 0x41, 0x50, 0x5f, 0x43, 0x4f, 0x4e, 0x46, 0x49, - 0x47, 0x55, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x03, 0x2a, 0xea, 0x01, 0x0a, 0x0b, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x1c, 0x0a, 0x18, 0x53, 0x45, - 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, - 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x18, 0x0a, 0x14, 0x53, 0x45, 0x52, 0x56, - 0x49, 0x43, 0x45, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x54, 0x59, 0x50, 0x49, 0x43, 0x41, 0x4c, - 0x10, 0x01, 0x12, 0x1e, 0x0a, 0x1a, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x4b, 0x49, - 0x4e, 0x44, 0x5f, 0x43, 0x4f, 0x4e, 0x4e, 0x45, 0x43, 0x54, 0x5f, 0x50, 0x52, 0x4f, 0x58, 0x59, - 0x10, 0x02, 0x12, 0x1d, 0x0a, 0x19, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x4b, 0x49, - 0x4e, 0x44, 0x5f, 0x4d, 0x45, 0x53, 0x48, 0x5f, 0x47, 0x41, 0x54, 0x45, 0x57, 0x41, 0x59, 0x10, - 0x03, 0x12, 0x24, 0x0a, 0x20, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x4b, 0x49, 0x4e, - 0x44, 0x5f, 0x54, 0x45, 0x52, 0x4d, 0x49, 0x4e, 0x41, 0x54, 0x49, 0x4e, 0x47, 0x5f, 0x47, 0x41, - 0x54, 0x45, 0x57, 0x41, 0x59, 0x10, 0x04, 0x12, 0x20, 0x0a, 0x1c, 0x53, 0x45, 0x52, 0x56, 0x49, - 0x43, 0x45, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x49, 0x4e, 0x47, 0x52, 0x45, 0x53, 0x53, 0x5f, - 0x47, 0x41, 0x54, 0x45, 0x57, 0x41, 0x59, 0x10, 0x05, 0x12, 0x1c, 0x0a, 0x18, 0x53, 0x45, 0x52, - 0x56, 0x49, 0x43, 0x45, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x41, 0x50, 0x49, 0x5f, 0x47, 0x41, - 0x54, 0x45, 0x57, 0x41, 0x59, 0x10, 0x06, 0x32, 0xde, 0x02, 0x0a, 0x10, 0x44, 0x61, 0x74, 0x61, - 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0xac, 0x01, 0x0a, - 0x1d, 0x47, 0x65, 0x74, 0x53, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x44, 0x61, 0x74, - 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x12, 0x40, - 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, - 0x6c, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x53, - 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x44, 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, - 0x65, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x41, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, - 0x73, 0x75, 0x6c, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2e, 0x47, 0x65, - 0x74, 0x53, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x44, 0x61, 0x74, 0x61, 0x70, 0x6c, - 0x61, 0x6e, 0x65, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x06, 0xe2, 0x86, 0x04, 0x02, 0x08, 0x02, 0x12, 0x9a, 0x01, 0x0a, 0x17, - 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x6f, 0x79, 0x42, 0x6f, 0x6f, 0x74, 0x73, 0x74, 0x72, 0x61, - 0x70, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x3a, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, - 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x70, - 0x6c, 0x61, 0x6e, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x6f, 0x79, 0x42, 0x6f, 0x6f, - 0x74, 0x73, 0x74, 0x72, 0x61, 0x70, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x3b, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, - 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, - 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x6f, 0x79, 0x42, 0x6f, 0x6f, 0x74, 0x73, 0x74, 0x72, - 0x61, 0x70, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x06, 0xe2, 0x86, 0x04, 0x02, 0x08, 0x02, 0x42, 0xf0, 0x01, 0x0a, 0x1e, 0x63, 0x6f, 0x6d, - 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, - 0x6c, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x42, 0x0e, 0x44, 0x61, 0x74, - 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x34, 0x67, - 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, - 0x6f, 0x72, 0x70, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x2d, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x2f, 0x70, 0x62, 0x64, 0x61, 0x74, 0x61, 0x70, 0x6c, - 0x61, 0x6e, 0x65, 0xa2, 0x02, 0x03, 0x48, 0x43, 0x44, 0xaa, 0x02, 0x1a, 0x48, 0x61, 0x73, 0x68, - 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x44, 0x61, 0x74, - 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0xca, 0x02, 0x1a, 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, - 0x72, 0x70, 0x5c, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x5c, 0x44, 0x61, 0x74, 0x61, 0x70, 0x6c, - 0x61, 0x6e, 0x65, 0xe2, 0x02, 0x26, 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x5c, - 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x5c, 0x44, 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, - 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x1c, 0x48, - 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x3a, 0x3a, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, - 0x3a, 0x3a, 0x44, 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x33, + 0x5f, 0x45, 0x4e, 0x56, 0x4f, 0x59, 0x5f, 0x42, 0x4f, 0x4f, 0x54, 0x53, 0x54, 0x52, 0x41, 0x50, + 0x5f, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x55, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x03, + 0x2a, 0xea, 0x01, 0x0a, 0x0b, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4b, 0x69, 0x6e, 0x64, + 0x12, 0x1c, 0x0a, 0x18, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x4b, 0x49, 0x4e, 0x44, + 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x18, + 0x0a, 0x14, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x54, + 0x59, 0x50, 0x49, 0x43, 0x41, 0x4c, 0x10, 0x01, 0x12, 0x1e, 0x0a, 0x1a, 0x53, 0x45, 0x52, 0x56, + 0x49, 0x43, 0x45, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x43, 0x4f, 0x4e, 0x4e, 0x45, 0x43, 0x54, + 0x5f, 0x50, 0x52, 0x4f, 0x58, 0x59, 0x10, 0x02, 0x12, 0x1d, 0x0a, 0x19, 0x53, 0x45, 0x52, 0x56, + 0x49, 0x43, 0x45, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x4d, 0x45, 0x53, 0x48, 0x5f, 0x47, 0x41, + 0x54, 0x45, 0x57, 0x41, 0x59, 0x10, 0x03, 0x12, 0x24, 0x0a, 0x20, 0x53, 0x45, 0x52, 0x56, 0x49, + 0x43, 0x45, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x54, 0x45, 0x52, 0x4d, 0x49, 0x4e, 0x41, 0x54, + 0x49, 0x4e, 0x47, 0x5f, 0x47, 0x41, 0x54, 0x45, 0x57, 0x41, 0x59, 0x10, 0x04, 0x12, 0x20, 0x0a, + 0x1c, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x49, 0x4e, + 0x47, 0x52, 0x45, 0x53, 0x53, 0x5f, 0x47, 0x41, 0x54, 0x45, 0x57, 0x41, 0x59, 0x10, 0x05, 0x12, + 0x1c, 0x0a, 0x18, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, + 0x41, 0x50, 0x49, 0x5f, 0x47, 0x41, 0x54, 0x45, 0x57, 0x41, 0x59, 0x10, 0x06, 0x32, 0xde, 0x02, + 0x0a, 0x10, 0x44, 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x12, 0xac, 0x01, 0x0a, 0x1d, 0x47, 0x65, 0x74, 0x53, 0x75, 0x70, 0x70, 0x6f, 0x72, + 0x74, 0x65, 0x64, 0x44, 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x46, 0x65, 0x61, 0x74, + 0x75, 0x72, 0x65, 0x73, 0x12, 0x40, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, + 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, + 0x65, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x44, 0x61, + 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x41, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, + 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x70, 0x6c, + 0x61, 0x6e, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, + 0x44, 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xe2, 0x86, 0x04, 0x02, 0x08, + 0x02, 0x12, 0x9a, 0x01, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x6f, 0x79, 0x42, 0x6f, + 0x6f, 0x74, 0x73, 0x74, 0x72, 0x61, 0x70, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x3a, 0x2e, + 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, + 0x2e, 0x64, 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, + 0x76, 0x6f, 0x79, 0x42, 0x6f, 0x6f, 0x74, 0x73, 0x74, 0x72, 0x61, 0x70, 0x50, 0x61, 0x72, 0x61, + 0x6d, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3b, 0x2e, 0x68, 0x61, 0x73, 0x68, + 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x64, 0x61, 0x74, + 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x6f, 0x79, 0x42, + 0x6f, 0x6f, 0x74, 0x73, 0x74, 0x72, 0x61, 0x70, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xe2, 0x86, 0x04, 0x02, 0x08, 0x02, 0x42, 0xf0, + 0x01, 0x0a, 0x1e, 0x63, 0x6f, 0x6d, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, + 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, + 0x65, 0x42, 0x0e, 0x44, 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x50, 0x72, 0x6f, 0x74, + 0x6f, 0x50, 0x01, 0x5a, 0x34, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, + 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, + 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2d, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x2f, 0x70, 0x62, + 0x64, 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0xa2, 0x02, 0x03, 0x48, 0x43, 0x44, 0xaa, + 0x02, 0x1a, 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x43, 0x6f, 0x6e, 0x73, + 0x75, 0x6c, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0xca, 0x02, 0x1a, 0x48, + 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x5c, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x5c, + 0x44, 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0xe2, 0x02, 0x26, 0x48, 0x61, 0x73, 0x68, + 0x69, 0x63, 0x6f, 0x72, 0x70, 0x5c, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x5c, 0x44, 0x61, 0x74, + 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, + 0x74, 0x61, 0xea, 0x02, 0x1c, 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x3a, 0x3a, + 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x3a, 0x3a, 0x44, 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, + 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( - file_proto_public_pbdataplane_dataplane_proto_rawDescOnce sync.Once - file_proto_public_pbdataplane_dataplane_proto_rawDescData = file_proto_public_pbdataplane_dataplane_proto_rawDesc + file_pbdataplane_dataplane_proto_rawDescOnce sync.Once + file_pbdataplane_dataplane_proto_rawDescData = file_pbdataplane_dataplane_proto_rawDesc ) -func file_proto_public_pbdataplane_dataplane_proto_rawDescGZIP() []byte { - file_proto_public_pbdataplane_dataplane_proto_rawDescOnce.Do(func() { - file_proto_public_pbdataplane_dataplane_proto_rawDescData = protoimpl.X.CompressGZIP(file_proto_public_pbdataplane_dataplane_proto_rawDescData) +func file_pbdataplane_dataplane_proto_rawDescGZIP() []byte { + file_pbdataplane_dataplane_proto_rawDescOnce.Do(func() { + file_pbdataplane_dataplane_proto_rawDescData = protoimpl.X.CompressGZIP(file_pbdataplane_dataplane_proto_rawDescData) }) - return file_proto_public_pbdataplane_dataplane_proto_rawDescData + return file_pbdataplane_dataplane_proto_rawDescData } -var file_proto_public_pbdataplane_dataplane_proto_enumTypes = make([]protoimpl.EnumInfo, 2) -var file_proto_public_pbdataplane_dataplane_proto_msgTypes = make([]protoimpl.MessageInfo, 5) -var file_proto_public_pbdataplane_dataplane_proto_goTypes = []interface{}{ +var file_pbdataplane_dataplane_proto_enumTypes = make([]protoimpl.EnumInfo, 2) +var file_pbdataplane_dataplane_proto_msgTypes = make([]protoimpl.MessageInfo, 5) +var file_pbdataplane_dataplane_proto_goTypes = []interface{}{ (DataplaneFeatures)(0), // 0: hashicorp.consul.dataplane.DataplaneFeatures (ServiceKind)(0), // 1: hashicorp.consul.dataplane.ServiceKind (*GetSupportedDataplaneFeaturesRequest)(nil), // 2: hashicorp.consul.dataplane.GetSupportedDataplaneFeaturesRequest @@ -678,7 +676,7 @@ var file_proto_public_pbdataplane_dataplane_proto_goTypes = []interface{}{ (*GetEnvoyBootstrapParamsResponse)(nil), // 6: hashicorp.consul.dataplane.GetEnvoyBootstrapParamsResponse (*structpb.Struct)(nil), // 7: google.protobuf.Struct } -var file_proto_public_pbdataplane_dataplane_proto_depIdxs = []int32{ +var file_pbdataplane_dataplane_proto_depIdxs = []int32{ 0, // 0: hashicorp.consul.dataplane.DataplaneFeatureSupport.feature_name:type_name -> hashicorp.consul.dataplane.DataplaneFeatures 3, // 1: hashicorp.consul.dataplane.GetSupportedDataplaneFeaturesResponse.supported_dataplane_features:type_name -> hashicorp.consul.dataplane.DataplaneFeatureSupport 1, // 2: hashicorp.consul.dataplane.GetEnvoyBootstrapParamsResponse.service_kind:type_name -> hashicorp.consul.dataplane.ServiceKind @@ -694,13 +692,13 @@ var file_proto_public_pbdataplane_dataplane_proto_depIdxs = []int32{ 0, // [0:4] is the sub-list for field type_name } -func init() { file_proto_public_pbdataplane_dataplane_proto_init() } -func file_proto_public_pbdataplane_dataplane_proto_init() { - if File_proto_public_pbdataplane_dataplane_proto != nil { +func init() { file_pbdataplane_dataplane_proto_init() } +func file_pbdataplane_dataplane_proto_init() { + if File_pbdataplane_dataplane_proto != nil { return } if !protoimpl.UnsafeEnabled { - file_proto_public_pbdataplane_dataplane_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + file_pbdataplane_dataplane_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetSupportedDataplaneFeaturesRequest); i { case 0: return &v.state @@ -712,7 +710,7 @@ func file_proto_public_pbdataplane_dataplane_proto_init() { return nil } } - file_proto_public_pbdataplane_dataplane_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + file_pbdataplane_dataplane_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*DataplaneFeatureSupport); i { case 0: return &v.state @@ -724,7 +722,7 @@ func file_proto_public_pbdataplane_dataplane_proto_init() { return nil } } - file_proto_public_pbdataplane_dataplane_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + file_pbdataplane_dataplane_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetSupportedDataplaneFeaturesResponse); i { case 0: return &v.state @@ -736,7 +734,7 @@ func file_proto_public_pbdataplane_dataplane_proto_init() { return nil } } - file_proto_public_pbdataplane_dataplane_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + file_pbdataplane_dataplane_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetEnvoyBootstrapParamsRequest); i { case 0: return &v.state @@ -748,7 +746,7 @@ func file_proto_public_pbdataplane_dataplane_proto_init() { return nil } } - file_proto_public_pbdataplane_dataplane_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + file_pbdataplane_dataplane_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetEnvoyBootstrapParamsResponse); i { case 0: return &v.state @@ -761,7 +759,7 @@ func file_proto_public_pbdataplane_dataplane_proto_init() { } } } - file_proto_public_pbdataplane_dataplane_proto_msgTypes[3].OneofWrappers = []interface{}{ + file_pbdataplane_dataplane_proto_msgTypes[3].OneofWrappers = []interface{}{ (*GetEnvoyBootstrapParamsRequest_NodeId)(nil), (*GetEnvoyBootstrapParamsRequest_NodeName)(nil), } @@ -769,19 +767,19 @@ func file_proto_public_pbdataplane_dataplane_proto_init() { out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_proto_public_pbdataplane_dataplane_proto_rawDesc, + RawDescriptor: file_pbdataplane_dataplane_proto_rawDesc, NumEnums: 2, NumMessages: 5, NumExtensions: 0, NumServices: 1, }, - GoTypes: file_proto_public_pbdataplane_dataplane_proto_goTypes, - DependencyIndexes: file_proto_public_pbdataplane_dataplane_proto_depIdxs, - EnumInfos: file_proto_public_pbdataplane_dataplane_proto_enumTypes, - MessageInfos: file_proto_public_pbdataplane_dataplane_proto_msgTypes, + GoTypes: file_pbdataplane_dataplane_proto_goTypes, + DependencyIndexes: file_pbdataplane_dataplane_proto_depIdxs, + EnumInfos: file_pbdataplane_dataplane_proto_enumTypes, + MessageInfos: file_pbdataplane_dataplane_proto_msgTypes, }.Build() - File_proto_public_pbdataplane_dataplane_proto = out.File - file_proto_public_pbdataplane_dataplane_proto_rawDesc = nil - file_proto_public_pbdataplane_dataplane_proto_goTypes = nil - file_proto_public_pbdataplane_dataplane_proto_depIdxs = nil + File_pbdataplane_dataplane_proto = out.File + file_pbdataplane_dataplane_proto_rawDesc = nil + file_pbdataplane_dataplane_proto_goTypes = nil + file_pbdataplane_dataplane_proto_depIdxs = nil } diff --git a/proto-public/pbdataplane/dataplane.proto b/proto-public/pbdataplane/dataplane.proto index 1eb6b3f374c..a1a685b0165 100644 --- a/proto-public/pbdataplane/dataplane.proto +++ b/proto-public/pbdataplane/dataplane.proto @@ -4,8 +4,8 @@ syntax = "proto3"; package hashicorp.consul.dataplane; +import "annotations/ratelimit/ratelimit.proto"; import "google/protobuf/struct.proto"; -import "proto-public/annotations/ratelimit/ratelimit.proto"; message GetSupportedDataplaneFeaturesRequest {} @@ -89,14 +89,10 @@ message GetEnvoyBootstrapParamsResponse { service DataplaneService { rpc GetSupportedDataplaneFeatures(GetSupportedDataplaneFeaturesRequest) returns (GetSupportedDataplaneFeaturesResponse) { - option (hashicorp.consul.internal.ratelimit.spec) = { - operation_type: OPERATION_TYPE_READ, - }; + option (hashicorp.consul.internal.ratelimit.spec) = {operation_type: OPERATION_TYPE_READ}; } rpc GetEnvoyBootstrapParams(GetEnvoyBootstrapParamsRequest) returns (GetEnvoyBootstrapParamsResponse) { - option (hashicorp.consul.internal.ratelimit.spec) = { - operation_type: OPERATION_TYPE_READ, - }; + option (hashicorp.consul.internal.ratelimit.spec) = {operation_type: OPERATION_TYPE_READ}; } } diff --git a/proto-public/pbdataplane/dataplane_grpc.pb.go b/proto-public/pbdataplane/dataplane_grpc.pb.go index 353326d7aa1..5aec5e9f0b3 100644 --- a/proto-public/pbdataplane/dataplane_grpc.pb.go +++ b/proto-public/pbdataplane/dataplane_grpc.pb.go @@ -2,7 +2,7 @@ // versions: // - protoc-gen-go-grpc v1.2.0 // - protoc (unknown) -// source: proto-public/pbdataplane/dataplane.proto +// source: pbdataplane/dataplane.proto package pbdataplane @@ -135,5 +135,5 @@ var DataplaneService_ServiceDesc = grpc.ServiceDesc{ }, }, Streams: []grpc.StreamDesc{}, - Metadata: "proto-public/pbdataplane/dataplane.proto", + Metadata: "pbdataplane/dataplane.proto", } diff --git a/proto-public/pbdns/dns.pb.binary.go b/proto-public/pbdns/dns.pb.binary.go index c49eeb5eb3f..059ec39b5fd 100644 --- a/proto-public/pbdns/dns.pb.binary.go +++ b/proto-public/pbdns/dns.pb.binary.go @@ -1,5 +1,5 @@ // Code generated by protoc-gen-go-binary. DO NOT EDIT. -// source: proto-public/pbdns/dns.proto +// source: pbdns/dns.proto package pbdns diff --git a/proto-public/pbdns/dns.pb.go b/proto-public/pbdns/dns.pb.go index 9c90b582493..d4dcf673871 100644 --- a/proto-public/pbdns/dns.pb.go +++ b/proto-public/pbdns/dns.pb.go @@ -2,7 +2,7 @@ // versions: // protoc-gen-go v1.28.1 // protoc (unknown) -// source: proto-public/pbdns/dns.proto +// source: pbdns/dns.proto package pbdns @@ -54,11 +54,11 @@ func (x Protocol) String() string { } func (Protocol) Descriptor() protoreflect.EnumDescriptor { - return file_proto_public_pbdns_dns_proto_enumTypes[0].Descriptor() + return file_pbdns_dns_proto_enumTypes[0].Descriptor() } func (Protocol) Type() protoreflect.EnumType { - return &file_proto_public_pbdns_dns_proto_enumTypes[0] + return &file_pbdns_dns_proto_enumTypes[0] } func (x Protocol) Number() protoreflect.EnumNumber { @@ -67,7 +67,7 @@ func (x Protocol) Number() protoreflect.EnumNumber { // Deprecated: Use Protocol.Descriptor instead. func (Protocol) EnumDescriptor() ([]byte, []int) { - return file_proto_public_pbdns_dns_proto_rawDescGZIP(), []int{0} + return file_pbdns_dns_proto_rawDescGZIP(), []int{0} } type QueryRequest struct { @@ -84,7 +84,7 @@ type QueryRequest struct { func (x *QueryRequest) Reset() { *x = QueryRequest{} if protoimpl.UnsafeEnabled { - mi := &file_proto_public_pbdns_dns_proto_msgTypes[0] + mi := &file_pbdns_dns_proto_msgTypes[0] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -97,7 +97,7 @@ func (x *QueryRequest) String() string { func (*QueryRequest) ProtoMessage() {} func (x *QueryRequest) ProtoReflect() protoreflect.Message { - mi := &file_proto_public_pbdns_dns_proto_msgTypes[0] + mi := &file_pbdns_dns_proto_msgTypes[0] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -110,7 +110,7 @@ func (x *QueryRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use QueryRequest.ProtoReflect.Descriptor instead. func (*QueryRequest) Descriptor() ([]byte, []int) { - return file_proto_public_pbdns_dns_proto_rawDescGZIP(), []int{0} + return file_pbdns_dns_proto_rawDescGZIP(), []int{0} } func (x *QueryRequest) GetMsg() []byte { @@ -139,7 +139,7 @@ type QueryResponse struct { func (x *QueryResponse) Reset() { *x = QueryResponse{} if protoimpl.UnsafeEnabled { - mi := &file_proto_public_pbdns_dns_proto_msgTypes[1] + mi := &file_pbdns_dns_proto_msgTypes[1] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -152,7 +152,7 @@ func (x *QueryResponse) String() string { func (*QueryResponse) ProtoMessage() {} func (x *QueryResponse) ProtoReflect() protoreflect.Message { - mi := &file_proto_public_pbdns_dns_proto_msgTypes[1] + mi := &file_pbdns_dns_proto_msgTypes[1] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -165,7 +165,7 @@ func (x *QueryResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use QueryResponse.ProtoReflect.Descriptor instead. func (*QueryResponse) Descriptor() ([]byte, []int) { - return file_proto_public_pbdns_dns_proto_rawDescGZIP(), []int{1} + return file_pbdns_dns_proto_rawDescGZIP(), []int{1} } func (x *QueryResponse) GetMsg() []byte { @@ -175,71 +175,69 @@ func (x *QueryResponse) GetMsg() []byte { return nil } -var File_proto_public_pbdns_dns_proto protoreflect.FileDescriptor - -var file_proto_public_pbdns_dns_proto_rawDesc = []byte{ - 0x0a, 0x1c, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2d, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x2f, 0x70, - 0x62, 0x64, 0x6e, 0x73, 0x2f, 0x64, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x14, +var File_pbdns_dns_proto protoreflect.FileDescriptor + +var file_pbdns_dns_proto_rawDesc = []byte{ + 0x0a, 0x0f, 0x70, 0x62, 0x64, 0x6e, 0x73, 0x2f, 0x64, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x12, 0x14, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, + 0x73, 0x75, 0x6c, 0x2e, 0x64, 0x6e, 0x73, 0x1a, 0x25, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x72, 0x61, 0x74, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x2f, 0x72, + 0x61, 0x74, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x5c, + 0x0a, 0x0c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, + 0x0a, 0x03, 0x6d, 0x73, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x6d, 0x73, 0x67, + 0x12, 0x3a, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, + 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x64, 0x6e, 0x73, 0x2e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, + 0x6f, 0x6c, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x22, 0x21, 0x0a, 0x0d, + 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x10, 0x0a, + 0x03, 0x6d, 0x73, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x6d, 0x73, 0x67, 0x2a, + 0x4e, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x1e, 0x0a, 0x1a, 0x50, + 0x52, 0x4f, 0x54, 0x4f, 0x43, 0x4f, 0x4c, 0x5f, 0x55, 0x4e, 0x53, 0x45, 0x54, 0x5f, 0x55, 0x4e, + 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x10, 0x0a, 0x0c, 0x50, + 0x52, 0x4f, 0x54, 0x4f, 0x43, 0x4f, 0x4c, 0x5f, 0x54, 0x43, 0x50, 0x10, 0x01, 0x12, 0x10, 0x0a, + 0x0c, 0x50, 0x52, 0x4f, 0x54, 0x4f, 0x43, 0x4f, 0x4c, 0x5f, 0x55, 0x44, 0x50, 0x10, 0x02, 0x32, + 0x66, 0x0a, 0x0a, 0x44, 0x4e, 0x53, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x58, 0x0a, + 0x05, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x22, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, + 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x64, 0x6e, 0x73, 0x2e, 0x51, 0x75, + 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x68, 0x61, 0x73, + 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x64, 0x6e, + 0x73, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x06, 0xe2, 0x86, 0x04, 0x02, 0x08, 0x02, 0x42, 0xc6, 0x01, 0x0a, 0x18, 0x63, 0x6f, 0x6d, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, - 0x2e, 0x64, 0x6e, 0x73, 0x1a, 0x32, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2d, 0x70, 0x75, 0x62, 0x6c, - 0x69, 0x63, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x72, - 0x61, 0x74, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x2f, 0x72, 0x61, 0x74, 0x65, 0x6c, 0x69, 0x6d, - 0x69, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x5c, 0x0a, 0x0c, 0x51, 0x75, 0x65, 0x72, - 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6d, 0x73, 0x67, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x6d, 0x73, 0x67, 0x12, 0x3a, 0x0a, 0x08, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x68, - 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, - 0x64, 0x6e, 0x73, 0x2e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x52, 0x08, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x22, 0x21, 0x0a, 0x0d, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x6d, 0x73, 0x67, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x6d, 0x73, 0x67, 0x2a, 0x4e, 0x0a, 0x08, 0x50, 0x72, 0x6f, - 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x1e, 0x0a, 0x1a, 0x50, 0x52, 0x4f, 0x54, 0x4f, 0x43, 0x4f, - 0x4c, 0x5f, 0x55, 0x4e, 0x53, 0x45, 0x54, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, - 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x10, 0x0a, 0x0c, 0x50, 0x52, 0x4f, 0x54, 0x4f, 0x43, 0x4f, - 0x4c, 0x5f, 0x54, 0x43, 0x50, 0x10, 0x01, 0x12, 0x10, 0x0a, 0x0c, 0x50, 0x52, 0x4f, 0x54, 0x4f, - 0x43, 0x4f, 0x4c, 0x5f, 0x55, 0x44, 0x50, 0x10, 0x02, 0x32, 0x66, 0x0a, 0x0a, 0x44, 0x4e, 0x53, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x58, 0x0a, 0x05, 0x51, 0x75, 0x65, 0x72, 0x79, - 0x12, 0x22, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, - 0x73, 0x75, 0x6c, 0x2e, 0x64, 0x6e, 0x73, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, - 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x64, 0x6e, 0x73, 0x2e, 0x51, 0x75, 0x65, 0x72, - 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xe2, 0x86, 0x04, 0x02, 0x08, - 0x02, 0x42, 0xc6, 0x01, 0x0a, 0x18, 0x63, 0x6f, 0x6d, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, - 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x64, 0x6e, 0x73, 0x42, 0x08, - 0x44, 0x6e, 0x73, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x2e, 0x67, 0x69, 0x74, 0x68, - 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, - 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2d, 0x70, 0x75, - 0x62, 0x6c, 0x69, 0x63, 0x2f, 0x70, 0x62, 0x64, 0x6e, 0x73, 0xa2, 0x02, 0x03, 0x48, 0x43, 0x44, - 0xaa, 0x02, 0x14, 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x43, 0x6f, 0x6e, - 0x73, 0x75, 0x6c, 0x2e, 0x44, 0x6e, 0x73, 0xca, 0x02, 0x14, 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, - 0x6f, 0x72, 0x70, 0x5c, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x5c, 0x44, 0x6e, 0x73, 0xe2, 0x02, - 0x20, 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x5c, 0x43, 0x6f, 0x6e, 0x73, 0x75, - 0x6c, 0x5c, 0x44, 0x6e, 0x73, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, - 0x61, 0xea, 0x02, 0x16, 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x3a, 0x3a, 0x43, - 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x3a, 0x3a, 0x44, 0x6e, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x33, + 0x2e, 0x64, 0x6e, 0x73, 0x42, 0x08, 0x44, 0x6e, 0x73, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, + 0x5a, 0x2e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x68, 0x61, 0x73, + 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2f, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x2d, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x2f, 0x70, 0x62, 0x64, 0x6e, 0x73, + 0xa2, 0x02, 0x03, 0x48, 0x43, 0x44, 0xaa, 0x02, 0x14, 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, + 0x72, 0x70, 0x2e, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x44, 0x6e, 0x73, 0xca, 0x02, 0x14, + 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x5c, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, + 0x5c, 0x44, 0x6e, 0x73, 0xe2, 0x02, 0x20, 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, + 0x5c, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x5c, 0x44, 0x6e, 0x73, 0x5c, 0x47, 0x50, 0x42, 0x4d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x16, 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, + 0x6f, 0x72, 0x70, 0x3a, 0x3a, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x3a, 0x3a, 0x44, 0x6e, 0x73, + 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( - file_proto_public_pbdns_dns_proto_rawDescOnce sync.Once - file_proto_public_pbdns_dns_proto_rawDescData = file_proto_public_pbdns_dns_proto_rawDesc + file_pbdns_dns_proto_rawDescOnce sync.Once + file_pbdns_dns_proto_rawDescData = file_pbdns_dns_proto_rawDesc ) -func file_proto_public_pbdns_dns_proto_rawDescGZIP() []byte { - file_proto_public_pbdns_dns_proto_rawDescOnce.Do(func() { - file_proto_public_pbdns_dns_proto_rawDescData = protoimpl.X.CompressGZIP(file_proto_public_pbdns_dns_proto_rawDescData) +func file_pbdns_dns_proto_rawDescGZIP() []byte { + file_pbdns_dns_proto_rawDescOnce.Do(func() { + file_pbdns_dns_proto_rawDescData = protoimpl.X.CompressGZIP(file_pbdns_dns_proto_rawDescData) }) - return file_proto_public_pbdns_dns_proto_rawDescData + return file_pbdns_dns_proto_rawDescData } -var file_proto_public_pbdns_dns_proto_enumTypes = make([]protoimpl.EnumInfo, 1) -var file_proto_public_pbdns_dns_proto_msgTypes = make([]protoimpl.MessageInfo, 2) -var file_proto_public_pbdns_dns_proto_goTypes = []interface{}{ +var file_pbdns_dns_proto_enumTypes = make([]protoimpl.EnumInfo, 1) +var file_pbdns_dns_proto_msgTypes = make([]protoimpl.MessageInfo, 2) +var file_pbdns_dns_proto_goTypes = []interface{}{ (Protocol)(0), // 0: hashicorp.consul.dns.Protocol (*QueryRequest)(nil), // 1: hashicorp.consul.dns.QueryRequest (*QueryResponse)(nil), // 2: hashicorp.consul.dns.QueryResponse } -var file_proto_public_pbdns_dns_proto_depIdxs = []int32{ +var file_pbdns_dns_proto_depIdxs = []int32{ 0, // 0: hashicorp.consul.dns.QueryRequest.protocol:type_name -> hashicorp.consul.dns.Protocol 1, // 1: hashicorp.consul.dns.DNSService.Query:input_type -> hashicorp.consul.dns.QueryRequest 2, // 2: hashicorp.consul.dns.DNSService.Query:output_type -> hashicorp.consul.dns.QueryResponse @@ -250,13 +248,13 @@ var file_proto_public_pbdns_dns_proto_depIdxs = []int32{ 0, // [0:1] is the sub-list for field type_name } -func init() { file_proto_public_pbdns_dns_proto_init() } -func file_proto_public_pbdns_dns_proto_init() { - if File_proto_public_pbdns_dns_proto != nil { +func init() { file_pbdns_dns_proto_init() } +func file_pbdns_dns_proto_init() { + if File_pbdns_dns_proto != nil { return } if !protoimpl.UnsafeEnabled { - file_proto_public_pbdns_dns_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + file_pbdns_dns_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*QueryRequest); i { case 0: return &v.state @@ -268,7 +266,7 @@ func file_proto_public_pbdns_dns_proto_init() { return nil } } - file_proto_public_pbdns_dns_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + file_pbdns_dns_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*QueryResponse); i { case 0: return &v.state @@ -285,19 +283,19 @@ func file_proto_public_pbdns_dns_proto_init() { out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_proto_public_pbdns_dns_proto_rawDesc, + RawDescriptor: file_pbdns_dns_proto_rawDesc, NumEnums: 1, NumMessages: 2, NumExtensions: 0, NumServices: 1, }, - GoTypes: file_proto_public_pbdns_dns_proto_goTypes, - DependencyIndexes: file_proto_public_pbdns_dns_proto_depIdxs, - EnumInfos: file_proto_public_pbdns_dns_proto_enumTypes, - MessageInfos: file_proto_public_pbdns_dns_proto_msgTypes, + GoTypes: file_pbdns_dns_proto_goTypes, + DependencyIndexes: file_pbdns_dns_proto_depIdxs, + EnumInfos: file_pbdns_dns_proto_enumTypes, + MessageInfos: file_pbdns_dns_proto_msgTypes, }.Build() - File_proto_public_pbdns_dns_proto = out.File - file_proto_public_pbdns_dns_proto_rawDesc = nil - file_proto_public_pbdns_dns_proto_goTypes = nil - file_proto_public_pbdns_dns_proto_depIdxs = nil + File_pbdns_dns_proto = out.File + file_pbdns_dns_proto_rawDesc = nil + file_pbdns_dns_proto_goTypes = nil + file_pbdns_dns_proto_depIdxs = nil } diff --git a/proto-public/pbdns/dns.proto b/proto-public/pbdns/dns.proto index bf8afc48f31..8f09be179b3 100644 --- a/proto-public/pbdns/dns.proto +++ b/proto-public/pbdns/dns.proto @@ -2,16 +2,14 @@ syntax = "proto3"; package hashicorp.consul.dns; -import "proto-public/annotations/ratelimit/ratelimit.proto"; +import "annotations/ratelimit/ratelimit.proto"; option go_package = "github.com/hashicorp/consul/proto-public/pbdns"; service DNSService { // Query sends a DNS request over to Consul server and returns a DNS reply message. rpc Query(QueryRequest) returns (QueryResponse) { - option (hashicorp.consul.internal.ratelimit.spec) = { - operation_type: OPERATION_TYPE_READ, - }; + option (hashicorp.consul.internal.ratelimit.spec) = {operation_type: OPERATION_TYPE_READ}; } } diff --git a/proto-public/pbdns/dns_grpc.pb.go b/proto-public/pbdns/dns_grpc.pb.go index 85ecc8d48dc..4bccf8c58b9 100644 --- a/proto-public/pbdns/dns_grpc.pb.go +++ b/proto-public/pbdns/dns_grpc.pb.go @@ -2,7 +2,7 @@ // versions: // - protoc-gen-go-grpc v1.2.0 // - protoc (unknown) -// source: proto-public/pbdns/dns.proto +// source: pbdns/dns.proto package pbdns @@ -101,5 +101,5 @@ var DNSService_ServiceDesc = grpc.ServiceDesc{ }, }, Streams: []grpc.StreamDesc{}, - Metadata: "proto-public/pbdns/dns.proto", + Metadata: "pbdns/dns.proto", } diff --git a/proto-public/pbserverdiscovery/serverdiscovery.pb.binary.go b/proto-public/pbserverdiscovery/serverdiscovery.pb.binary.go index 645d83eed58..6eb65295e92 100644 --- a/proto-public/pbserverdiscovery/serverdiscovery.pb.binary.go +++ b/proto-public/pbserverdiscovery/serverdiscovery.pb.binary.go @@ -1,5 +1,5 @@ // Code generated by protoc-gen-go-binary. DO NOT EDIT. -// source: proto-public/pbserverdiscovery/serverdiscovery.proto +// source: pbserverdiscovery/serverdiscovery.proto package pbserverdiscovery diff --git a/proto-public/pbserverdiscovery/serverdiscovery.pb.go b/proto-public/pbserverdiscovery/serverdiscovery.pb.go index 47a6d4c8d44..3aa214877e7 100644 --- a/proto-public/pbserverdiscovery/serverdiscovery.pb.go +++ b/proto-public/pbserverdiscovery/serverdiscovery.pb.go @@ -5,7 +5,7 @@ // versions: // protoc-gen-go v1.28.1 // protoc (unknown) -// source: proto-public/pbserverdiscovery/serverdiscovery.proto +// source: pbserverdiscovery/serverdiscovery.proto package pbserverdiscovery @@ -37,7 +37,7 @@ type WatchServersRequest struct { func (x *WatchServersRequest) Reset() { *x = WatchServersRequest{} if protoimpl.UnsafeEnabled { - mi := &file_proto_public_pbserverdiscovery_serverdiscovery_proto_msgTypes[0] + mi := &file_pbserverdiscovery_serverdiscovery_proto_msgTypes[0] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -50,7 +50,7 @@ func (x *WatchServersRequest) String() string { func (*WatchServersRequest) ProtoMessage() {} func (x *WatchServersRequest) ProtoReflect() protoreflect.Message { - mi := &file_proto_public_pbserverdiscovery_serverdiscovery_proto_msgTypes[0] + mi := &file_pbserverdiscovery_serverdiscovery_proto_msgTypes[0] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -63,7 +63,7 @@ func (x *WatchServersRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use WatchServersRequest.ProtoReflect.Descriptor instead. func (*WatchServersRequest) Descriptor() ([]byte, []int) { - return file_proto_public_pbserverdiscovery_serverdiscovery_proto_rawDescGZIP(), []int{0} + return file_pbserverdiscovery_serverdiscovery_proto_rawDescGZIP(), []int{0} } func (x *WatchServersRequest) GetWan() bool { @@ -85,7 +85,7 @@ type WatchServersResponse struct { func (x *WatchServersResponse) Reset() { *x = WatchServersResponse{} if protoimpl.UnsafeEnabled { - mi := &file_proto_public_pbserverdiscovery_serverdiscovery_proto_msgTypes[1] + mi := &file_pbserverdiscovery_serverdiscovery_proto_msgTypes[1] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -98,7 +98,7 @@ func (x *WatchServersResponse) String() string { func (*WatchServersResponse) ProtoMessage() {} func (x *WatchServersResponse) ProtoReflect() protoreflect.Message { - mi := &file_proto_public_pbserverdiscovery_serverdiscovery_proto_msgTypes[1] + mi := &file_pbserverdiscovery_serverdiscovery_proto_msgTypes[1] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -111,7 +111,7 @@ func (x *WatchServersResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use WatchServersResponse.ProtoReflect.Descriptor instead. func (*WatchServersResponse) Descriptor() ([]byte, []int) { - return file_proto_public_pbserverdiscovery_serverdiscovery_proto_rawDescGZIP(), []int{1} + return file_pbserverdiscovery_serverdiscovery_proto_rawDescGZIP(), []int{1} } func (x *WatchServersResponse) GetServers() []*Server { @@ -137,7 +137,7 @@ type Server struct { func (x *Server) Reset() { *x = Server{} if protoimpl.UnsafeEnabled { - mi := &file_proto_public_pbserverdiscovery_serverdiscovery_proto_msgTypes[2] + mi := &file_pbserverdiscovery_serverdiscovery_proto_msgTypes[2] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -150,7 +150,7 @@ func (x *Server) String() string { func (*Server) ProtoMessage() {} func (x *Server) ProtoReflect() protoreflect.Message { - mi := &file_proto_public_pbserverdiscovery_serverdiscovery_proto_msgTypes[2] + mi := &file_pbserverdiscovery_serverdiscovery_proto_msgTypes[2] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -163,7 +163,7 @@ func (x *Server) ProtoReflect() protoreflect.Message { // Deprecated: Use Server.ProtoReflect.Descriptor instead. func (*Server) Descriptor() ([]byte, []int) { - return file_proto_public_pbserverdiscovery_serverdiscovery_proto_rawDescGZIP(), []int{2} + return file_pbserverdiscovery_serverdiscovery_proto_rawDescGZIP(), []int{2} } func (x *Server) GetId() string { @@ -187,81 +187,79 @@ func (x *Server) GetVersion() string { return "" } -var File_proto_public_pbserverdiscovery_serverdiscovery_proto protoreflect.FileDescriptor - -var file_proto_public_pbserverdiscovery_serverdiscovery_proto_rawDesc = []byte{ - 0x0a, 0x34, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2d, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x2f, 0x70, - 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, - 0x2f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x20, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, - 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x64, - 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x1a, 0x32, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2d, - 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x2f, 0x72, 0x61, 0x74, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x2f, 0x72, 0x61, 0x74, - 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x27, 0x0a, 0x13, - 0x57, 0x61, 0x74, 0x63, 0x68, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x77, 0x61, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x03, 0x77, 0x61, 0x6e, 0x22, 0x5a, 0x0a, 0x14, 0x57, 0x61, 0x74, 0x63, 0x68, 0x53, 0x65, - 0x72, 0x76, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x42, 0x0a, - 0x07, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, - 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, - 0x6c, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, - 0x79, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x52, 0x07, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, - 0x73, 0x22, 0x4c, 0x0a, 0x06, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x12, 0x0e, 0x0a, 0x02, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x61, - 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, - 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x32, - 0xa2, 0x01, 0x0a, 0x16, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, - 0x65, 0x72, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x87, 0x01, 0x0a, 0x0c, 0x57, - 0x61, 0x74, 0x63, 0x68, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x12, 0x35, 0x2e, 0x68, 0x61, - 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x73, - 0x65, 0x72, 0x76, 0x65, 0x72, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x2e, 0x57, - 0x61, 0x74, 0x63, 0x68, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x36, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, - 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x64, 0x69, 0x73, 0x63, - 0x6f, 0x76, 0x65, 0x72, 0x79, 0x2e, 0x57, 0x61, 0x74, 0x63, 0x68, 0x53, 0x65, 0x72, 0x76, 0x65, - 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xe2, 0x86, 0x04, 0x02, - 0x08, 0x02, 0x30, 0x01, 0x42, 0x9a, 0x02, 0x0a, 0x24, 0x63, 0x6f, 0x6d, 0x2e, 0x68, 0x61, 0x73, - 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x73, 0x65, - 0x72, 0x76, 0x65, 0x72, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x42, 0x14, 0x53, - 0x65, 0x72, 0x76, 0x65, 0x72, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x50, 0x72, - 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x3a, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, - 0x6d, 0x2f, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2f, 0x63, 0x6f, 0x6e, 0x73, - 0x75, 0x6c, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2d, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x2f, - 0x70, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, - 0x79, 0xa2, 0x02, 0x03, 0x48, 0x43, 0x53, 0xaa, 0x02, 0x20, 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, - 0x6f, 0x72, 0x70, 0x2e, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, - 0x72, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0xca, 0x02, 0x20, 0x48, 0x61, 0x73, - 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x5c, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x5c, 0x53, 0x65, - 0x72, 0x76, 0x65, 0x72, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0xe2, 0x02, 0x2c, - 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x5c, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, - 0x5c, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, - 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x22, 0x48, - 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x3a, 0x3a, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, - 0x3a, 0x3a, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, - 0x79, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +var File_pbserverdiscovery_serverdiscovery_proto protoreflect.FileDescriptor + +var file_pbserverdiscovery_serverdiscovery_proto_rawDesc = []byte{ + 0x0a, 0x27, 0x70, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x76, + 0x65, 0x72, 0x79, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x76, + 0x65, 0x72, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x20, 0x68, 0x61, 0x73, 0x68, 0x69, + 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x73, 0x65, 0x72, 0x76, + 0x65, 0x72, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x1a, 0x25, 0x61, 0x6e, 0x6e, + 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x72, 0x61, 0x74, 0x65, 0x6c, 0x69, 0x6d, + 0x69, 0x74, 0x2f, 0x72, 0x61, 0x74, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x22, 0x27, 0x0a, 0x13, 0x57, 0x61, 0x74, 0x63, 0x68, 0x53, 0x65, 0x72, 0x76, 0x65, + 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x77, 0x61, 0x6e, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x77, 0x61, 0x6e, 0x22, 0x5a, 0x0a, 0x14, 0x57, + 0x61, 0x74, 0x63, 0x68, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x42, 0x0a, 0x07, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, + 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x64, 0x69, + 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x52, 0x07, + 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x22, 0x4c, 0x0a, 0x06, 0x53, 0x65, 0x72, 0x76, 0x65, + 0x72, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, + 0x64, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x76, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x32, 0xa2, 0x01, 0x0a, 0x16, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x12, 0x87, 0x01, 0x0a, 0x0c, 0x57, 0x61, 0x74, 0x63, 0x68, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x73, 0x12, 0x35, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, + 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x64, 0x69, 0x73, 0x63, 0x6f, + 0x76, 0x65, 0x72, 0x79, 0x2e, 0x57, 0x61, 0x74, 0x63, 0x68, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x36, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, + 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x73, 0x65, 0x72, 0x76, + 0x65, 0x72, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x2e, 0x57, 0x61, 0x74, 0x63, + 0x68, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x06, 0xe2, 0x86, 0x04, 0x02, 0x08, 0x02, 0x30, 0x01, 0x42, 0x9a, 0x02, 0x0a, 0x24, 0x63, + 0x6f, 0x6d, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, + 0x73, 0x75, 0x6c, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x76, + 0x65, 0x72, 0x79, 0x42, 0x14, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x64, 0x69, 0x73, 0x63, 0x6f, + 0x76, 0x65, 0x72, 0x79, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x3a, 0x67, 0x69, 0x74, + 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, + 0x70, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2d, 0x70, + 0x75, 0x62, 0x6c, 0x69, 0x63, 0x2f, 0x70, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x64, 0x69, + 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0xa2, 0x02, 0x03, 0x48, 0x43, 0x53, 0xaa, 0x02, 0x20, + 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, + 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, + 0xca, 0x02, 0x20, 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x5c, 0x43, 0x6f, 0x6e, + 0x73, 0x75, 0x6c, 0x5c, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x76, + 0x65, 0x72, 0x79, 0xe2, 0x02, 0x2c, 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x5c, + 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x5c, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x64, 0x69, 0x73, + 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, + 0x74, 0x61, 0xea, 0x02, 0x22, 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x3a, 0x3a, + 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x3a, 0x3a, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x64, 0x69, + 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( - file_proto_public_pbserverdiscovery_serverdiscovery_proto_rawDescOnce sync.Once - file_proto_public_pbserverdiscovery_serverdiscovery_proto_rawDescData = file_proto_public_pbserverdiscovery_serverdiscovery_proto_rawDesc + file_pbserverdiscovery_serverdiscovery_proto_rawDescOnce sync.Once + file_pbserverdiscovery_serverdiscovery_proto_rawDescData = file_pbserverdiscovery_serverdiscovery_proto_rawDesc ) -func file_proto_public_pbserverdiscovery_serverdiscovery_proto_rawDescGZIP() []byte { - file_proto_public_pbserverdiscovery_serverdiscovery_proto_rawDescOnce.Do(func() { - file_proto_public_pbserverdiscovery_serverdiscovery_proto_rawDescData = protoimpl.X.CompressGZIP(file_proto_public_pbserverdiscovery_serverdiscovery_proto_rawDescData) +func file_pbserverdiscovery_serverdiscovery_proto_rawDescGZIP() []byte { + file_pbserverdiscovery_serverdiscovery_proto_rawDescOnce.Do(func() { + file_pbserverdiscovery_serverdiscovery_proto_rawDescData = protoimpl.X.CompressGZIP(file_pbserverdiscovery_serverdiscovery_proto_rawDescData) }) - return file_proto_public_pbserverdiscovery_serverdiscovery_proto_rawDescData + return file_pbserverdiscovery_serverdiscovery_proto_rawDescData } -var file_proto_public_pbserverdiscovery_serverdiscovery_proto_msgTypes = make([]protoimpl.MessageInfo, 3) -var file_proto_public_pbserverdiscovery_serverdiscovery_proto_goTypes = []interface{}{ +var file_pbserverdiscovery_serverdiscovery_proto_msgTypes = make([]protoimpl.MessageInfo, 3) +var file_pbserverdiscovery_serverdiscovery_proto_goTypes = []interface{}{ (*WatchServersRequest)(nil), // 0: hashicorp.consul.serverdiscovery.WatchServersRequest (*WatchServersResponse)(nil), // 1: hashicorp.consul.serverdiscovery.WatchServersResponse (*Server)(nil), // 2: hashicorp.consul.serverdiscovery.Server } -var file_proto_public_pbserverdiscovery_serverdiscovery_proto_depIdxs = []int32{ +var file_pbserverdiscovery_serverdiscovery_proto_depIdxs = []int32{ 2, // 0: hashicorp.consul.serverdiscovery.WatchServersResponse.servers:type_name -> hashicorp.consul.serverdiscovery.Server 0, // 1: hashicorp.consul.serverdiscovery.ServerDiscoveryService.WatchServers:input_type -> hashicorp.consul.serverdiscovery.WatchServersRequest 1, // 2: hashicorp.consul.serverdiscovery.ServerDiscoveryService.WatchServers:output_type -> hashicorp.consul.serverdiscovery.WatchServersResponse @@ -272,13 +270,13 @@ var file_proto_public_pbserverdiscovery_serverdiscovery_proto_depIdxs = []int32{ 0, // [0:1] is the sub-list for field type_name } -func init() { file_proto_public_pbserverdiscovery_serverdiscovery_proto_init() } -func file_proto_public_pbserverdiscovery_serverdiscovery_proto_init() { - if File_proto_public_pbserverdiscovery_serverdiscovery_proto != nil { +func init() { file_pbserverdiscovery_serverdiscovery_proto_init() } +func file_pbserverdiscovery_serverdiscovery_proto_init() { + if File_pbserverdiscovery_serverdiscovery_proto != nil { return } if !protoimpl.UnsafeEnabled { - file_proto_public_pbserverdiscovery_serverdiscovery_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + file_pbserverdiscovery_serverdiscovery_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*WatchServersRequest); i { case 0: return &v.state @@ -290,7 +288,7 @@ func file_proto_public_pbserverdiscovery_serverdiscovery_proto_init() { return nil } } - file_proto_public_pbserverdiscovery_serverdiscovery_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + file_pbserverdiscovery_serverdiscovery_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*WatchServersResponse); i { case 0: return &v.state @@ -302,7 +300,7 @@ func file_proto_public_pbserverdiscovery_serverdiscovery_proto_init() { return nil } } - file_proto_public_pbserverdiscovery_serverdiscovery_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + file_pbserverdiscovery_serverdiscovery_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Server); i { case 0: return &v.state @@ -319,18 +317,18 @@ func file_proto_public_pbserverdiscovery_serverdiscovery_proto_init() { out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_proto_public_pbserverdiscovery_serverdiscovery_proto_rawDesc, + RawDescriptor: file_pbserverdiscovery_serverdiscovery_proto_rawDesc, NumEnums: 0, NumMessages: 3, NumExtensions: 0, NumServices: 1, }, - GoTypes: file_proto_public_pbserverdiscovery_serverdiscovery_proto_goTypes, - DependencyIndexes: file_proto_public_pbserverdiscovery_serverdiscovery_proto_depIdxs, - MessageInfos: file_proto_public_pbserverdiscovery_serverdiscovery_proto_msgTypes, + GoTypes: file_pbserverdiscovery_serverdiscovery_proto_goTypes, + DependencyIndexes: file_pbserverdiscovery_serverdiscovery_proto_depIdxs, + MessageInfos: file_pbserverdiscovery_serverdiscovery_proto_msgTypes, }.Build() - File_proto_public_pbserverdiscovery_serverdiscovery_proto = out.File - file_proto_public_pbserverdiscovery_serverdiscovery_proto_rawDesc = nil - file_proto_public_pbserverdiscovery_serverdiscovery_proto_goTypes = nil - file_proto_public_pbserverdiscovery_serverdiscovery_proto_depIdxs = nil + File_pbserverdiscovery_serverdiscovery_proto = out.File + file_pbserverdiscovery_serverdiscovery_proto_rawDesc = nil + file_pbserverdiscovery_serverdiscovery_proto_goTypes = nil + file_pbserverdiscovery_serverdiscovery_proto_depIdxs = nil } diff --git a/proto-public/pbserverdiscovery/serverdiscovery.proto b/proto-public/pbserverdiscovery/serverdiscovery.proto index a4a41e96319..3a7ecbdf91e 100644 --- a/proto-public/pbserverdiscovery/serverdiscovery.proto +++ b/proto-public/pbserverdiscovery/serverdiscovery.proto @@ -5,7 +5,7 @@ syntax = "proto3"; package hashicorp.consul.serverdiscovery; -import "proto-public/annotations/ratelimit/ratelimit.proto"; +import "annotations/ratelimit/ratelimit.proto"; service ServerDiscoveryService { // WatchServers will stream back sets of ready servers as they change such as @@ -13,9 +13,7 @@ service ServerDiscoveryService { // should be considered ready for sending general RPC requests towards that would // catalog queries, xDS proxy configurations and similar services. rpc WatchServers(WatchServersRequest) returns (stream WatchServersResponse) { - option (hashicorp.consul.internal.ratelimit.spec) = { - operation_type: OPERATION_TYPE_READ, - }; + option (hashicorp.consul.internal.ratelimit.spec) = {operation_type: OPERATION_TYPE_READ}; } } diff --git a/proto-public/pbserverdiscovery/serverdiscovery_grpc.pb.go b/proto-public/pbserverdiscovery/serverdiscovery_grpc.pb.go index bb75ee84ee3..c690eb37542 100644 --- a/proto-public/pbserverdiscovery/serverdiscovery_grpc.pb.go +++ b/proto-public/pbserverdiscovery/serverdiscovery_grpc.pb.go @@ -2,7 +2,7 @@ // versions: // - protoc-gen-go-grpc v1.2.0 // - protoc (unknown) -// source: proto-public/pbserverdiscovery/serverdiscovery.proto +// source: pbserverdiscovery/serverdiscovery.proto package pbserverdiscovery @@ -134,5 +134,5 @@ var ServerDiscoveryService_ServiceDesc = grpc.ServiceDesc{ ServerStreams: true, }, }, - Metadata: "proto-public/pbserverdiscovery/serverdiscovery.proto", + Metadata: "pbserverdiscovery/serverdiscovery.proto", } diff --git a/proto/buf.gen.yaml b/proto/buf.gen.yaml index cd296f741a4..23c350bd14a 100644 --- a/proto/buf.gen.yaml +++ b/proto/buf.gen.yaml @@ -2,13 +2,9 @@ version: v1 managed: enabled: true go_package_prefix: - # this is not github.com/hashicorp/consul/proto because we are going - # to execute buf generate from the top level directory so that the filepaths - # contain the full path within the repo. This avoids registration conflicts - # in protocolbuffers/protobuf-go when Consul starts. Those conflicts would - # have been due to a protobuf file being registered to a global registry - # using a relative file name. - default: github.com/hashicorp/consul + default: github.com/hashicorp/consul/proto + override: + buf.build/hashicorp/consul: github.com/hashicorp/consul/proto-public plugins: - name: go out: . diff --git a/proto/pbacl/acl.pb.go b/proto/pbacl/acl.pb.go deleted file mode 100644 index 43066692134..00000000000 --- a/proto/pbacl/acl.pb.go +++ /dev/null @@ -1,167 +0,0 @@ -// Code generated by protoc-gen-go. DO NOT EDIT. -// versions: -// protoc-gen-go v1.28.1 -// protoc (unknown) -// source: proto/pbacl/acl.proto - -package pbacl - -import ( - protoreflect "google.golang.org/protobuf/reflect/protoreflect" - protoimpl "google.golang.org/protobuf/runtime/protoimpl" - reflect "reflect" - sync "sync" -) - -const ( - // Verify that this generated code is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) - // Verify that runtime/protoimpl is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) -) - -type ACLLink struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - ID string `protobuf:"bytes,1,opt,name=ID,proto3" json:"ID,omitempty"` - // @gotags: hash:ignore-" - Name string `protobuf:"bytes,2,opt,name=Name,proto3" json:"Name,omitempty"` -} - -func (x *ACLLink) Reset() { - *x = ACLLink{} - if protoimpl.UnsafeEnabled { - mi := &file_proto_pbacl_acl_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *ACLLink) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ACLLink) ProtoMessage() {} - -func (x *ACLLink) ProtoReflect() protoreflect.Message { - mi := &file_proto_pbacl_acl_proto_msgTypes[0] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use ACLLink.ProtoReflect.Descriptor instead. -func (*ACLLink) Descriptor() ([]byte, []int) { - return file_proto_pbacl_acl_proto_rawDescGZIP(), []int{0} -} - -func (x *ACLLink) GetID() string { - if x != nil { - return x.ID - } - return "" -} - -func (x *ACLLink) GetName() string { - if x != nil { - return x.Name - } - return "" -} - -var File_proto_pbacl_acl_proto protoreflect.FileDescriptor - -var file_proto_pbacl_acl_proto_rawDesc = []byte{ - 0x0a, 0x15, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x70, 0x62, 0x61, 0x63, 0x6c, 0x2f, 0x61, 0x63, - 0x6c, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x1d, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, - 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, - 0x61, 0x6c, 0x2e, 0x61, 0x63, 0x6c, 0x22, 0x2d, 0x0a, 0x07, 0x41, 0x43, 0x4c, 0x4c, 0x69, 0x6e, - 0x6b, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, - 0x44, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x42, 0xee, 0x01, 0x0a, 0x21, 0x63, 0x6f, 0x6d, 0x2e, 0x68, 0x61, - 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, - 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x61, 0x63, 0x6c, 0x42, 0x08, 0x41, 0x63, 0x6c, - 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x27, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, - 0x63, 0x6f, 0x6d, 0x2f, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2f, 0x63, 0x6f, - 0x6e, 0x73, 0x75, 0x6c, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x70, 0x62, 0x61, 0x63, 0x6c, - 0xa2, 0x02, 0x04, 0x48, 0x43, 0x49, 0x41, 0xaa, 0x02, 0x1d, 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, - 0x6f, 0x72, 0x70, 0x2e, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x72, - 0x6e, 0x61, 0x6c, 0x2e, 0x41, 0x63, 0x6c, 0xca, 0x02, 0x1d, 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, - 0x6f, 0x72, 0x70, 0x5c, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x5c, 0x49, 0x6e, 0x74, 0x65, 0x72, - 0x6e, 0x61, 0x6c, 0x5c, 0x41, 0x63, 0x6c, 0xe2, 0x02, 0x29, 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, - 0x6f, 0x72, 0x70, 0x5c, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x5c, 0x49, 0x6e, 0x74, 0x65, 0x72, - 0x6e, 0x61, 0x6c, 0x5c, 0x41, 0x63, 0x6c, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, - 0x61, 0x74, 0x61, 0xea, 0x02, 0x20, 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x3a, - 0x3a, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x3a, 0x3a, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, - 0x6c, 0x3a, 0x3a, 0x41, 0x63, 0x6c, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, -} - -var ( - file_proto_pbacl_acl_proto_rawDescOnce sync.Once - file_proto_pbacl_acl_proto_rawDescData = file_proto_pbacl_acl_proto_rawDesc -) - -func file_proto_pbacl_acl_proto_rawDescGZIP() []byte { - file_proto_pbacl_acl_proto_rawDescOnce.Do(func() { - file_proto_pbacl_acl_proto_rawDescData = protoimpl.X.CompressGZIP(file_proto_pbacl_acl_proto_rawDescData) - }) - return file_proto_pbacl_acl_proto_rawDescData -} - -var file_proto_pbacl_acl_proto_msgTypes = make([]protoimpl.MessageInfo, 1) -var file_proto_pbacl_acl_proto_goTypes = []interface{}{ - (*ACLLink)(nil), // 0: hashicorp.consul.internal.acl.ACLLink -} -var file_proto_pbacl_acl_proto_depIdxs = []int32{ - 0, // [0:0] is the sub-list for method output_type - 0, // [0:0] is the sub-list for method input_type - 0, // [0:0] is the sub-list for extension type_name - 0, // [0:0] is the sub-list for extension extendee - 0, // [0:0] is the sub-list for field type_name -} - -func init() { file_proto_pbacl_acl_proto_init() } -func file_proto_pbacl_acl_proto_init() { - if File_proto_pbacl_acl_proto != nil { - return - } - if !protoimpl.UnsafeEnabled { - file_proto_pbacl_acl_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ACLLink); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - } - type x struct{} - out := protoimpl.TypeBuilder{ - File: protoimpl.DescBuilder{ - GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_proto_pbacl_acl_proto_rawDesc, - NumEnums: 0, - NumMessages: 1, - NumExtensions: 0, - NumServices: 0, - }, - GoTypes: file_proto_pbacl_acl_proto_goTypes, - DependencyIndexes: file_proto_pbacl_acl_proto_depIdxs, - MessageInfos: file_proto_pbacl_acl_proto_msgTypes, - }.Build() - File_proto_pbacl_acl_proto = out.File - file_proto_pbacl_acl_proto_rawDesc = nil - file_proto_pbacl_acl_proto_goTypes = nil - file_proto_pbacl_acl_proto_depIdxs = nil -} diff --git a/proto/pboperator/operator.pb.go b/proto/pboperator/operator.pb.go deleted file mode 100644 index 1b9cd0f5ceb..00000000000 --- a/proto/pboperator/operator.pb.go +++ /dev/null @@ -1,247 +0,0 @@ -// Code generated by protoc-gen-go. DO NOT EDIT. -// versions: -// protoc-gen-go v1.28.1 -// protoc (unknown) -// source: proto/pboperator/operator.proto - -package pboperator - -import ( - _ "github.com/hashicorp/consul/proto-public/annotations/ratelimit" - protoreflect "google.golang.org/protobuf/reflect/protoreflect" - protoimpl "google.golang.org/protobuf/runtime/protoimpl" - reflect "reflect" - sync "sync" -) - -const ( - // Verify that this generated code is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) - // Verify that runtime/protoimpl is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) -) - -type TransferLeaderRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - ID string `protobuf:"bytes,1,opt,name=ID,proto3" json:"ID,omitempty"` -} - -func (x *TransferLeaderRequest) Reset() { - *x = TransferLeaderRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_proto_pboperator_operator_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *TransferLeaderRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*TransferLeaderRequest) ProtoMessage() {} - -func (x *TransferLeaderRequest) ProtoReflect() protoreflect.Message { - mi := &file_proto_pboperator_operator_proto_msgTypes[0] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use TransferLeaderRequest.ProtoReflect.Descriptor instead. -func (*TransferLeaderRequest) Descriptor() ([]byte, []int) { - return file_proto_pboperator_operator_proto_rawDescGZIP(), []int{0} -} - -func (x *TransferLeaderRequest) GetID() string { - if x != nil { - return x.ID - } - return "" -} - -// mog annotation: -// -// target=github.com/hashicorp/consul/api.TransferLeaderResponse -// output=operator.gen.go -// name=API -type TransferLeaderResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // true if the transfer is a success - Success bool `protobuf:"varint,1,opt,name=success,proto3" json:"success,omitempty"` -} - -func (x *TransferLeaderResponse) Reset() { - *x = TransferLeaderResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_proto_pboperator_operator_proto_msgTypes[1] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *TransferLeaderResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*TransferLeaderResponse) ProtoMessage() {} - -func (x *TransferLeaderResponse) ProtoReflect() protoreflect.Message { - mi := &file_proto_pboperator_operator_proto_msgTypes[1] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use TransferLeaderResponse.ProtoReflect.Descriptor instead. -func (*TransferLeaderResponse) Descriptor() ([]byte, []int) { - return file_proto_pboperator_operator_proto_rawDescGZIP(), []int{1} -} - -func (x *TransferLeaderResponse) GetSuccess() bool { - if x != nil { - return x.Success - } - return false -} - -var File_proto_pboperator_operator_proto protoreflect.FileDescriptor - -var file_proto_pboperator_operator_proto_rawDesc = []byte{ - 0x0a, 0x1f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x70, 0x62, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, - 0x6f, 0x72, 0x2f, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x12, 0x22, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, - 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x6f, 0x70, 0x65, - 0x72, 0x61, 0x74, 0x6f, 0x72, 0x1a, 0x32, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2d, 0x70, 0x75, 0x62, - 0x6c, 0x69, 0x63, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, - 0x72, 0x61, 0x74, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x2f, 0x72, 0x61, 0x74, 0x65, 0x6c, 0x69, - 0x6d, 0x69, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x27, 0x0a, 0x15, 0x54, 0x72, 0x61, - 0x6e, 0x73, 0x66, 0x65, 0x72, 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, - 0x49, 0x44, 0x22, 0x32, 0x0a, 0x16, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x4c, 0x65, - 0x61, 0x64, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, - 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, - 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x32, 0xa3, 0x01, 0x0a, 0x0f, 0x4f, 0x70, 0x65, 0x72, 0x61, - 0x74, 0x6f, 0x72, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x8f, 0x01, 0x0a, 0x0e, 0x54, - 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x39, 0x2e, - 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, - 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, - 0x6f, 0x72, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x4c, 0x65, 0x61, 0x64, 0x65, - 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3a, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, - 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, - 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x54, 0x72, - 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xe2, 0x86, 0x04, 0x02, 0x08, 0x01, 0x42, 0x91, 0x02, 0x0a, - 0x26, 0x63, 0x6f, 0x6d, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, - 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x6f, - 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x42, 0x0d, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, - 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x2c, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, - 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2f, 0x63, - 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x70, 0x62, 0x6f, 0x70, - 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0xa2, 0x02, 0x04, 0x48, 0x43, 0x49, 0x4f, 0xaa, 0x02, 0x22, - 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, - 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, - 0x6f, 0x72, 0xca, 0x02, 0x22, 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x5c, 0x43, - 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x5c, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5c, 0x4f, - 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0xe2, 0x02, 0x2e, 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, - 0x6f, 0x72, 0x70, 0x5c, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x5c, 0x49, 0x6e, 0x74, 0x65, 0x72, - 0x6e, 0x61, 0x6c, 0x5c, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x5c, 0x47, 0x50, 0x42, - 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x25, 0x48, 0x61, 0x73, 0x68, 0x69, - 0x63, 0x6f, 0x72, 0x70, 0x3a, 0x3a, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x3a, 0x3a, 0x49, 0x6e, - 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x3a, 0x3a, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, - 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, -} - -var ( - file_proto_pboperator_operator_proto_rawDescOnce sync.Once - file_proto_pboperator_operator_proto_rawDescData = file_proto_pboperator_operator_proto_rawDesc -) - -func file_proto_pboperator_operator_proto_rawDescGZIP() []byte { - file_proto_pboperator_operator_proto_rawDescOnce.Do(func() { - file_proto_pboperator_operator_proto_rawDescData = protoimpl.X.CompressGZIP(file_proto_pboperator_operator_proto_rawDescData) - }) - return file_proto_pboperator_operator_proto_rawDescData -} - -var file_proto_pboperator_operator_proto_msgTypes = make([]protoimpl.MessageInfo, 2) -var file_proto_pboperator_operator_proto_goTypes = []interface{}{ - (*TransferLeaderRequest)(nil), // 0: hashicorp.consul.internal.operator.TransferLeaderRequest - (*TransferLeaderResponse)(nil), // 1: hashicorp.consul.internal.operator.TransferLeaderResponse -} -var file_proto_pboperator_operator_proto_depIdxs = []int32{ - 0, // 0: hashicorp.consul.internal.operator.OperatorService.TransferLeader:input_type -> hashicorp.consul.internal.operator.TransferLeaderRequest - 1, // 1: hashicorp.consul.internal.operator.OperatorService.TransferLeader:output_type -> hashicorp.consul.internal.operator.TransferLeaderResponse - 1, // [1:2] is the sub-list for method output_type - 0, // [0:1] is the sub-list for method input_type - 0, // [0:0] is the sub-list for extension type_name - 0, // [0:0] is the sub-list for extension extendee - 0, // [0:0] is the sub-list for field type_name -} - -func init() { file_proto_pboperator_operator_proto_init() } -func file_proto_pboperator_operator_proto_init() { - if File_proto_pboperator_operator_proto != nil { - return - } - if !protoimpl.UnsafeEnabled { - file_proto_pboperator_operator_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TransferLeaderRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_proto_pboperator_operator_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TransferLeaderResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - } - type x struct{} - out := protoimpl.TypeBuilder{ - File: protoimpl.DescBuilder{ - GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_proto_pboperator_operator_proto_rawDesc, - NumEnums: 0, - NumMessages: 2, - NumExtensions: 0, - NumServices: 1, - }, - GoTypes: file_proto_pboperator_operator_proto_goTypes, - DependencyIndexes: file_proto_pboperator_operator_proto_depIdxs, - MessageInfos: file_proto_pboperator_operator_proto_msgTypes, - }.Build() - File_proto_pboperator_operator_proto = out.File - file_proto_pboperator_operator_proto_rawDesc = nil - file_proto_pboperator_operator_proto_goTypes = nil - file_proto_pboperator_operator_proto_depIdxs = nil -} diff --git a/proto/pbstatus/status.pb.go b/proto/pbstatus/status.pb.go deleted file mode 100644 index bdc5b70d798..00000000000 --- a/proto/pbstatus/status.pb.go +++ /dev/null @@ -1,211 +0,0 @@ -// Copyright 2020 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// Code generated by protoc-gen-go. DO NOT EDIT. -// versions: -// protoc-gen-go v1.28.1 -// protoc (unknown) -// source: proto/pbstatus/status.proto - -package pbstatus - -import ( - protoreflect "google.golang.org/protobuf/reflect/protoreflect" - protoimpl "google.golang.org/protobuf/runtime/protoimpl" - anypb "google.golang.org/protobuf/types/known/anypb" - reflect "reflect" - sync "sync" -) - -const ( - // Verify that this generated code is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) - // Verify that runtime/protoimpl is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) -) - -// The `Status` type defines a logical error model that is suitable for -// different programming environments, including REST APIs and RPC APIs. It is -// used by [gRPC](https://github.com/grpc). Each `Status` message contains -// three pieces of data: error code, error message, and error details. -// -// You can find out more about this error model and how to work with it in the -// [API Design Guide](https://cloud.google.com/apis/design/errors). -type Status struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // The status code, which should be an enum value of [google.rpc.Code][google.rpc.Code]. - Code int32 `protobuf:"varint,1,opt,name=code,proto3" json:"code,omitempty"` - // A developer-facing error message, which should be in English. Any - // user-facing error message should be localized and sent in the - // [google.rpc.Status.details][google.rpc.Status.details] field, or localized by the client. - Message string `protobuf:"bytes,2,opt,name=message,proto3" json:"message,omitempty"` - // A list of messages that carry the error details. There is a common set of - // message types for APIs to use. - Details []*anypb.Any `protobuf:"bytes,3,rep,name=details,proto3" json:"details,omitempty"` -} - -func (x *Status) Reset() { - *x = Status{} - if protoimpl.UnsafeEnabled { - mi := &file_proto_pbstatus_status_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *Status) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*Status) ProtoMessage() {} - -func (x *Status) ProtoReflect() protoreflect.Message { - mi := &file_proto_pbstatus_status_proto_msgTypes[0] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use Status.ProtoReflect.Descriptor instead. -func (*Status) Descriptor() ([]byte, []int) { - return file_proto_pbstatus_status_proto_rawDescGZIP(), []int{0} -} - -func (x *Status) GetCode() int32 { - if x != nil { - return x.Code - } - return 0 -} - -func (x *Status) GetMessage() string { - if x != nil { - return x.Message - } - return "" -} - -func (x *Status) GetDetails() []*anypb.Any { - if x != nil { - return x.Details - } - return nil -} - -var File_proto_pbstatus_status_proto protoreflect.FileDescriptor - -var file_proto_pbstatus_status_proto_rawDesc = []byte{ - 0x0a, 0x1b, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x70, 0x62, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x2f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x20, 0x68, - 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, - 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x1a, - 0x19, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2f, 0x61, 0x6e, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x66, 0x0a, 0x06, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, - 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, - 0x67, 0x65, 0x12, 0x2e, 0x0a, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x03, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x41, 0x6e, 0x79, 0x52, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, - 0x6c, 0x73, 0x42, 0x83, 0x02, 0x0a, 0x24, 0x63, 0x6f, 0x6d, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, - 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, - 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x42, 0x0b, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x2a, 0x67, 0x69, 0x74, 0x68, - 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, - 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x70, 0x62, - 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0xa2, 0x02, 0x04, 0x48, 0x43, 0x49, 0x53, 0xaa, 0x02, 0x20, - 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, - 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0xca, 0x02, 0x20, 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x5c, 0x43, 0x6f, 0x6e, - 0x73, 0x75, 0x6c, 0x5c, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5c, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0xe2, 0x02, 0x2c, 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x5c, - 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x5c, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5c, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, - 0x74, 0x61, 0xea, 0x02, 0x23, 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x3a, 0x3a, - 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x3a, 0x3a, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, - 0x3a, 0x3a, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, -} - -var ( - file_proto_pbstatus_status_proto_rawDescOnce sync.Once - file_proto_pbstatus_status_proto_rawDescData = file_proto_pbstatus_status_proto_rawDesc -) - -func file_proto_pbstatus_status_proto_rawDescGZIP() []byte { - file_proto_pbstatus_status_proto_rawDescOnce.Do(func() { - file_proto_pbstatus_status_proto_rawDescData = protoimpl.X.CompressGZIP(file_proto_pbstatus_status_proto_rawDescData) - }) - return file_proto_pbstatus_status_proto_rawDescData -} - -var file_proto_pbstatus_status_proto_msgTypes = make([]protoimpl.MessageInfo, 1) -var file_proto_pbstatus_status_proto_goTypes = []interface{}{ - (*Status)(nil), // 0: hashicorp.consul.internal.status.Status - (*anypb.Any)(nil), // 1: google.protobuf.Any -} -var file_proto_pbstatus_status_proto_depIdxs = []int32{ - 1, // 0: hashicorp.consul.internal.status.Status.details:type_name -> google.protobuf.Any - 1, // [1:1] is the sub-list for method output_type - 1, // [1:1] is the sub-list for method input_type - 1, // [1:1] is the sub-list for extension type_name - 1, // [1:1] is the sub-list for extension extendee - 0, // [0:1] is the sub-list for field type_name -} - -func init() { file_proto_pbstatus_status_proto_init() } -func file_proto_pbstatus_status_proto_init() { - if File_proto_pbstatus_status_proto != nil { - return - } - if !protoimpl.UnsafeEnabled { - file_proto_pbstatus_status_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Status); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - } - type x struct{} - out := protoimpl.TypeBuilder{ - File: protoimpl.DescBuilder{ - GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_proto_pbstatus_status_proto_rawDesc, - NumEnums: 0, - NumMessages: 1, - NumExtensions: 0, - NumServices: 0, - }, - GoTypes: file_proto_pbstatus_status_proto_goTypes, - DependencyIndexes: file_proto_pbstatus_status_proto_depIdxs, - MessageInfos: file_proto_pbstatus_status_proto_msgTypes, - }.Build() - File_proto_pbstatus_status_proto = out.File - file_proto_pbstatus_status_proto_rawDesc = nil - file_proto_pbstatus_status_proto_goTypes = nil - file_proto_pbstatus_status_proto_depIdxs = nil -} diff --git a/proto/pbacl/acl.go b/proto/private/pbacl/acl.go similarity index 100% rename from proto/pbacl/acl.go rename to proto/private/pbacl/acl.go diff --git a/proto/pbacl/acl.pb.binary.go b/proto/private/pbacl/acl.pb.binary.go similarity index 91% rename from proto/pbacl/acl.pb.binary.go rename to proto/private/pbacl/acl.pb.binary.go index 9f93a6f1743..f96b7a115bd 100644 --- a/proto/pbacl/acl.pb.binary.go +++ b/proto/private/pbacl/acl.pb.binary.go @@ -1,5 +1,5 @@ // Code generated by protoc-gen-go-binary. DO NOT EDIT. -// source: proto/pbacl/acl.proto +// source: private/pbacl/acl.proto package pbacl diff --git a/proto/private/pbacl/acl.pb.go b/proto/private/pbacl/acl.pb.go new file mode 100644 index 00000000000..3f6e012aa20 --- /dev/null +++ b/proto/private/pbacl/acl.pb.go @@ -0,0 +1,168 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.28.1 +// protoc (unknown) +// source: private/pbacl/acl.proto + +package pbacl + +import ( + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +type ACLLink struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ID string `protobuf:"bytes,1,opt,name=ID,proto3" json:"ID,omitempty"` + // @gotags: hash:ignore-" + Name string `protobuf:"bytes,2,opt,name=Name,proto3" json:"Name,omitempty"` +} + +func (x *ACLLink) Reset() { + *x = ACLLink{} + if protoimpl.UnsafeEnabled { + mi := &file_private_pbacl_acl_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ACLLink) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ACLLink) ProtoMessage() {} + +func (x *ACLLink) ProtoReflect() protoreflect.Message { + mi := &file_private_pbacl_acl_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ACLLink.ProtoReflect.Descriptor instead. +func (*ACLLink) Descriptor() ([]byte, []int) { + return file_private_pbacl_acl_proto_rawDescGZIP(), []int{0} +} + +func (x *ACLLink) GetID() string { + if x != nil { + return x.ID + } + return "" +} + +func (x *ACLLink) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +var File_private_pbacl_acl_proto protoreflect.FileDescriptor + +var file_private_pbacl_acl_proto_rawDesc = []byte{ + 0x0a, 0x17, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2f, 0x70, 0x62, 0x61, 0x63, 0x6c, 0x2f, + 0x61, 0x63, 0x6c, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x1d, 0x68, 0x61, 0x73, 0x68, 0x69, + 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, + 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x61, 0x63, 0x6c, 0x22, 0x2d, 0x0a, 0x07, 0x41, 0x43, 0x4c, 0x4c, + 0x69, 0x6e, 0x6b, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x02, 0x49, 0x44, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x42, 0xf6, 0x01, 0x0a, 0x21, 0x63, 0x6f, 0x6d, 0x2e, + 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, + 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x61, 0x63, 0x6c, 0x42, 0x08, 0x41, + 0x63, 0x6c, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x2f, 0x67, 0x69, 0x74, 0x68, 0x75, + 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2f, + 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x70, 0x72, 0x69, + 0x76, 0x61, 0x74, 0x65, 0x2f, 0x70, 0x62, 0x61, 0x63, 0x6c, 0xa2, 0x02, 0x04, 0x48, 0x43, 0x49, + 0x41, 0xaa, 0x02, 0x1d, 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x43, 0x6f, + 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x41, 0x63, + 0x6c, 0xca, 0x02, 0x1d, 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x5c, 0x43, 0x6f, + 0x6e, 0x73, 0x75, 0x6c, 0x5c, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5c, 0x41, 0x63, + 0x6c, 0xe2, 0x02, 0x29, 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x5c, 0x43, 0x6f, + 0x6e, 0x73, 0x75, 0x6c, 0x5c, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5c, 0x41, 0x63, + 0x6c, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x20, + 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x3a, 0x3a, 0x43, 0x6f, 0x6e, 0x73, 0x75, + 0x6c, 0x3a, 0x3a, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x3a, 0x3a, 0x41, 0x63, 0x6c, + 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_private_pbacl_acl_proto_rawDescOnce sync.Once + file_private_pbacl_acl_proto_rawDescData = file_private_pbacl_acl_proto_rawDesc +) + +func file_private_pbacl_acl_proto_rawDescGZIP() []byte { + file_private_pbacl_acl_proto_rawDescOnce.Do(func() { + file_private_pbacl_acl_proto_rawDescData = protoimpl.X.CompressGZIP(file_private_pbacl_acl_proto_rawDescData) + }) + return file_private_pbacl_acl_proto_rawDescData +} + +var file_private_pbacl_acl_proto_msgTypes = make([]protoimpl.MessageInfo, 1) +var file_private_pbacl_acl_proto_goTypes = []interface{}{ + (*ACLLink)(nil), // 0: hashicorp.consul.internal.acl.ACLLink +} +var file_private_pbacl_acl_proto_depIdxs = []int32{ + 0, // [0:0] is the sub-list for method output_type + 0, // [0:0] is the sub-list for method input_type + 0, // [0:0] is the sub-list for extension type_name + 0, // [0:0] is the sub-list for extension extendee + 0, // [0:0] is the sub-list for field type_name +} + +func init() { file_private_pbacl_acl_proto_init() } +func file_private_pbacl_acl_proto_init() { + if File_private_pbacl_acl_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_private_pbacl_acl_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ACLLink); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_private_pbacl_acl_proto_rawDesc, + NumEnums: 0, + NumMessages: 1, + NumExtensions: 0, + NumServices: 0, + }, + GoTypes: file_private_pbacl_acl_proto_goTypes, + DependencyIndexes: file_private_pbacl_acl_proto_depIdxs, + MessageInfos: file_private_pbacl_acl_proto_msgTypes, + }.Build() + File_private_pbacl_acl_proto = out.File + file_private_pbacl_acl_proto_rawDesc = nil + file_private_pbacl_acl_proto_goTypes = nil + file_private_pbacl_acl_proto_depIdxs = nil +} diff --git a/proto/pbacl/acl.proto b/proto/private/pbacl/acl.proto similarity index 100% rename from proto/pbacl/acl.proto rename to proto/private/pbacl/acl.proto diff --git a/proto/pbautoconf/auto_config.go b/proto/private/pbautoconf/auto_config.go similarity index 100% rename from proto/pbautoconf/auto_config.go rename to proto/private/pbautoconf/auto_config.go diff --git a/proto/pbautoconf/auto_config.pb.binary.go b/proto/private/pbautoconf/auto_config.pb.binary.go similarity index 93% rename from proto/pbautoconf/auto_config.pb.binary.go rename to proto/private/pbautoconf/auto_config.pb.binary.go index 4fc5f7fbe0a..cca257177c8 100644 --- a/proto/pbautoconf/auto_config.pb.binary.go +++ b/proto/private/pbautoconf/auto_config.pb.binary.go @@ -1,5 +1,5 @@ // Code generated by protoc-gen-go-binary. DO NOT EDIT. -// source: proto/pbautoconf/auto_config.proto +// source: private/pbautoconf/auto_config.proto package pbautoconf diff --git a/proto/pbautoconf/auto_config.pb.go b/proto/private/pbautoconf/auto_config.pb.go similarity index 50% rename from proto/pbautoconf/auto_config.pb.go rename to proto/private/pbautoconf/auto_config.pb.go index 3af70821fb7..afc0e28e50c 100644 --- a/proto/pbautoconf/auto_config.pb.go +++ b/proto/private/pbautoconf/auto_config.pb.go @@ -2,13 +2,13 @@ // versions: // protoc-gen-go v1.28.1 // protoc (unknown) -// source: proto/pbautoconf/auto_config.proto +// source: private/pbautoconf/auto_config.proto package pbautoconf import ( - pbconfig "github.com/hashicorp/consul/proto/pbconfig" - pbconnect "github.com/hashicorp/consul/proto/pbconnect" + pbconfig "github.com/hashicorp/consul/proto/private/pbconfig" + pbconnect "github.com/hashicorp/consul/proto/private/pbconnect" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" reflect "reflect" @@ -54,7 +54,7 @@ type AutoConfigRequest struct { func (x *AutoConfigRequest) Reset() { *x = AutoConfigRequest{} if protoimpl.UnsafeEnabled { - mi := &file_proto_pbautoconf_auto_config_proto_msgTypes[0] + mi := &file_private_pbautoconf_auto_config_proto_msgTypes[0] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -67,7 +67,7 @@ func (x *AutoConfigRequest) String() string { func (*AutoConfigRequest) ProtoMessage() {} func (x *AutoConfigRequest) ProtoReflect() protoreflect.Message { - mi := &file_proto_pbautoconf_auto_config_proto_msgTypes[0] + mi := &file_private_pbautoconf_auto_config_proto_msgTypes[0] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -80,7 +80,7 @@ func (x *AutoConfigRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use AutoConfigRequest.ProtoReflect.Descriptor instead. func (*AutoConfigRequest) Descriptor() ([]byte, []int) { - return file_proto_pbautoconf_auto_config_proto_rawDescGZIP(), []int{0} + return file_private_pbautoconf_auto_config_proto_rawDescGZIP(), []int{0} } func (x *AutoConfigRequest) GetDatacenter() string { @@ -152,7 +152,7 @@ type AutoConfigResponse struct { func (x *AutoConfigResponse) Reset() { *x = AutoConfigResponse{} if protoimpl.UnsafeEnabled { - mi := &file_proto_pbautoconf_auto_config_proto_msgTypes[1] + mi := &file_private_pbautoconf_auto_config_proto_msgTypes[1] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -165,7 +165,7 @@ func (x *AutoConfigResponse) String() string { func (*AutoConfigResponse) ProtoMessage() {} func (x *AutoConfigResponse) ProtoReflect() protoreflect.Message { - mi := &file_proto_pbautoconf_auto_config_proto_msgTypes[1] + mi := &file_private_pbautoconf_auto_config_proto_msgTypes[1] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -178,7 +178,7 @@ func (x *AutoConfigResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use AutoConfigResponse.ProtoReflect.Descriptor instead. func (*AutoConfigResponse) Descriptor() ([]byte, []int) { - return file_proto_pbautoconf_auto_config_proto_rawDescGZIP(), []int{1} + return file_private_pbautoconf_auto_config_proto_rawDescGZIP(), []int{1} } func (x *AutoConfigResponse) GetConfig() *pbconfig.Config { @@ -209,89 +209,90 @@ func (x *AutoConfigResponse) GetExtraCACertificates() []string { return nil } -var File_proto_pbautoconf_auto_config_proto protoreflect.FileDescriptor - -var file_proto_pbautoconf_auto_config_proto_rawDesc = []byte{ - 0x0a, 0x22, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x70, 0x62, 0x61, 0x75, 0x74, 0x6f, 0x63, 0x6f, - 0x6e, 0x66, 0x2f, 0x61, 0x75, 0x74, 0x6f, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x22, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, - 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, - 0x61, 0x75, 0x74, 0x6f, 0x63, 0x6f, 0x6e, 0x66, 0x1a, 0x1b, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, - 0x70, 0x62, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1d, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x70, 0x62, 0x63, - 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x2f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xc5, 0x01, 0x0a, 0x11, 0x41, 0x75, 0x74, 0x6f, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x44, 0x61, - 0x74, 0x61, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, - 0x44, 0x61, 0x74, 0x61, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x6f, - 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x18, - 0x0a, 0x07, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x07, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x50, 0x61, 0x72, 0x74, - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x50, 0x61, 0x72, - 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x4a, 0x57, 0x54, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x03, 0x4a, 0x57, 0x54, 0x12, 0x20, 0x0a, 0x0b, 0x43, 0x6f, 0x6e, 0x73, - 0x75, 0x6c, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x43, - 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x43, 0x53, - 0x52, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x43, 0x53, 0x52, 0x22, 0x9f, 0x02, 0x0a, - 0x12, 0x41, 0x75, 0x74, 0x6f, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x40, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, - 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, - 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x06, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x44, 0x0a, 0x07, 0x43, 0x41, 0x52, 0x6f, 0x6f, 0x74, 0x73, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, +var File_private_pbautoconf_auto_config_proto protoreflect.FileDescriptor + +var file_private_pbautoconf_auto_config_proto_rawDesc = []byte{ + 0x0a, 0x24, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2f, 0x70, 0x62, 0x61, 0x75, 0x74, 0x6f, + 0x63, 0x6f, 0x6e, 0x66, 0x2f, 0x61, 0x75, 0x74, 0x6f, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x22, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, + 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, + 0x6c, 0x2e, 0x61, 0x75, 0x74, 0x6f, 0x63, 0x6f, 0x6e, 0x66, 0x1a, 0x1d, 0x70, 0x72, 0x69, 0x76, + 0x61, 0x74, 0x65, 0x2f, 0x70, 0x62, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2f, 0x63, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x70, 0x72, 0x69, 0x76, 0x61, + 0x74, 0x65, 0x2f, 0x70, 0x62, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x2f, 0x63, 0x6f, 0x6e, + 0x6e, 0x65, 0x63, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xc5, 0x01, 0x0a, 0x11, 0x41, + 0x75, 0x74, 0x6f, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x1e, 0x0a, 0x0a, 0x44, 0x61, 0x74, 0x61, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x44, 0x61, 0x74, 0x61, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, + 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x1c, + 0x0a, 0x09, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x09, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x10, 0x0a, 0x03, + 0x4a, 0x57, 0x54, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x4a, 0x57, 0x54, 0x12, 0x20, + 0x0a, 0x0b, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0b, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x54, 0x6f, 0x6b, 0x65, 0x6e, + 0x12, 0x10, 0x0a, 0x03, 0x43, 0x53, 0x52, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x43, + 0x53, 0x52, 0x22, 0x9f, 0x02, 0x0a, 0x12, 0x41, 0x75, 0x74, 0x6f, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x40, 0x0a, 0x06, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x68, 0x61, 0x73, 0x68, + 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, + 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x52, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x44, 0x0a, 0x07, 0x43, + 0x41, 0x52, 0x6f, 0x6f, 0x74, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x68, + 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, + 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, + 0x2e, 0x43, 0x41, 0x52, 0x6f, 0x6f, 0x74, 0x73, 0x52, 0x07, 0x43, 0x41, 0x52, 0x6f, 0x6f, 0x74, + 0x73, 0x12, 0x4f, 0x0a, 0x0b, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, - 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x2e, 0x43, 0x41, 0x52, 0x6f, 0x6f, - 0x74, 0x73, 0x52, 0x07, 0x43, 0x41, 0x52, 0x6f, 0x6f, 0x74, 0x73, 0x12, 0x4f, 0x0a, 0x0b, 0x43, - 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x2d, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, - 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, - 0x6e, 0x65, 0x63, 0x74, 0x2e, 0x49, 0x73, 0x73, 0x75, 0x65, 0x64, 0x43, 0x65, 0x72, 0x74, 0x52, - 0x0b, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x12, 0x30, 0x0a, 0x13, - 0x45, 0x78, 0x74, 0x72, 0x61, 0x43, 0x41, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, - 0x74, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x13, 0x45, 0x78, 0x74, 0x72, 0x61, - 0x43, 0x41, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, 0x42, 0x93, - 0x02, 0x0a, 0x26, 0x63, 0x6f, 0x6d, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, - 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, - 0x2e, 0x61, 0x75, 0x74, 0x6f, 0x63, 0x6f, 0x6e, 0x66, 0x42, 0x0f, 0x41, 0x75, 0x74, 0x6f, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x2c, 0x67, 0x69, - 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, - 0x72, 0x70, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, - 0x70, 0x62, 0x61, 0x75, 0x74, 0x6f, 0x63, 0x6f, 0x6e, 0x66, 0xa2, 0x02, 0x04, 0x48, 0x43, 0x49, - 0x41, 0xaa, 0x02, 0x22, 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x43, 0x6f, - 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x41, 0x75, - 0x74, 0x6f, 0x63, 0x6f, 0x6e, 0x66, 0xca, 0x02, 0x22, 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, - 0x72, 0x70, 0x5c, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x5c, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, - 0x61, 0x6c, 0x5c, 0x41, 0x75, 0x74, 0x6f, 0x63, 0x6f, 0x6e, 0x66, 0xe2, 0x02, 0x2e, 0x48, 0x61, - 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x5c, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x5c, 0x49, - 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5c, 0x41, 0x75, 0x74, 0x6f, 0x63, 0x6f, 0x6e, 0x66, - 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x25, 0x48, - 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x3a, 0x3a, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, - 0x3a, 0x3a, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x3a, 0x3a, 0x41, 0x75, 0x74, 0x6f, - 0x63, 0x6f, 0x6e, 0x66, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x2e, 0x49, 0x73, 0x73, 0x75, 0x65, + 0x64, 0x43, 0x65, 0x72, 0x74, 0x52, 0x0b, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, + 0x74, 0x65, 0x12, 0x30, 0x0a, 0x13, 0x45, 0x78, 0x74, 0x72, 0x61, 0x43, 0x41, 0x43, 0x65, 0x72, + 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x13, 0x45, 0x78, 0x74, 0x72, 0x61, 0x43, 0x41, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, + 0x61, 0x74, 0x65, 0x73, 0x42, 0x9b, 0x02, 0x0a, 0x26, 0x63, 0x6f, 0x6d, 0x2e, 0x68, 0x61, 0x73, + 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, + 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x61, 0x75, 0x74, 0x6f, 0x63, 0x6f, 0x6e, 0x66, 0x42, + 0x0f, 0x41, 0x75, 0x74, 0x6f, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x50, 0x72, 0x6f, 0x74, 0x6f, + 0x50, 0x01, 0x5a, 0x34, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x68, + 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2f, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2f, 0x70, 0x62, + 0x61, 0x75, 0x74, 0x6f, 0x63, 0x6f, 0x6e, 0x66, 0xa2, 0x02, 0x04, 0x48, 0x43, 0x49, 0x41, 0xaa, + 0x02, 0x22, 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x43, 0x6f, 0x6e, 0x73, + 0x75, 0x6c, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x41, 0x75, 0x74, 0x6f, + 0x63, 0x6f, 0x6e, 0x66, 0xca, 0x02, 0x22, 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, + 0x5c, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x5c, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, + 0x5c, 0x41, 0x75, 0x74, 0x6f, 0x63, 0x6f, 0x6e, 0x66, 0xe2, 0x02, 0x2e, 0x48, 0x61, 0x73, 0x68, + 0x69, 0x63, 0x6f, 0x72, 0x70, 0x5c, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x5c, 0x49, 0x6e, 0x74, + 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5c, 0x41, 0x75, 0x74, 0x6f, 0x63, 0x6f, 0x6e, 0x66, 0x5c, 0x47, + 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x25, 0x48, 0x61, 0x73, + 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x3a, 0x3a, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x3a, 0x3a, + 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x3a, 0x3a, 0x41, 0x75, 0x74, 0x6f, 0x63, 0x6f, + 0x6e, 0x66, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( - file_proto_pbautoconf_auto_config_proto_rawDescOnce sync.Once - file_proto_pbautoconf_auto_config_proto_rawDescData = file_proto_pbautoconf_auto_config_proto_rawDesc + file_private_pbautoconf_auto_config_proto_rawDescOnce sync.Once + file_private_pbautoconf_auto_config_proto_rawDescData = file_private_pbautoconf_auto_config_proto_rawDesc ) -func file_proto_pbautoconf_auto_config_proto_rawDescGZIP() []byte { - file_proto_pbautoconf_auto_config_proto_rawDescOnce.Do(func() { - file_proto_pbautoconf_auto_config_proto_rawDescData = protoimpl.X.CompressGZIP(file_proto_pbautoconf_auto_config_proto_rawDescData) +func file_private_pbautoconf_auto_config_proto_rawDescGZIP() []byte { + file_private_pbautoconf_auto_config_proto_rawDescOnce.Do(func() { + file_private_pbautoconf_auto_config_proto_rawDescData = protoimpl.X.CompressGZIP(file_private_pbautoconf_auto_config_proto_rawDescData) }) - return file_proto_pbautoconf_auto_config_proto_rawDescData + return file_private_pbautoconf_auto_config_proto_rawDescData } -var file_proto_pbautoconf_auto_config_proto_msgTypes = make([]protoimpl.MessageInfo, 2) -var file_proto_pbautoconf_auto_config_proto_goTypes = []interface{}{ +var file_private_pbautoconf_auto_config_proto_msgTypes = make([]protoimpl.MessageInfo, 2) +var file_private_pbautoconf_auto_config_proto_goTypes = []interface{}{ (*AutoConfigRequest)(nil), // 0: hashicorp.consul.internal.autoconf.AutoConfigRequest (*AutoConfigResponse)(nil), // 1: hashicorp.consul.internal.autoconf.AutoConfigResponse (*pbconfig.Config)(nil), // 2: hashicorp.consul.internal.config.Config (*pbconnect.CARoots)(nil), // 3: hashicorp.consul.internal.connect.CARoots (*pbconnect.IssuedCert)(nil), // 4: hashicorp.consul.internal.connect.IssuedCert } -var file_proto_pbautoconf_auto_config_proto_depIdxs = []int32{ +var file_private_pbautoconf_auto_config_proto_depIdxs = []int32{ 2, // 0: hashicorp.consul.internal.autoconf.AutoConfigResponse.Config:type_name -> hashicorp.consul.internal.config.Config 3, // 1: hashicorp.consul.internal.autoconf.AutoConfigResponse.CARoots:type_name -> hashicorp.consul.internal.connect.CARoots 4, // 2: hashicorp.consul.internal.autoconf.AutoConfigResponse.Certificate:type_name -> hashicorp.consul.internal.connect.IssuedCert @@ -302,13 +303,13 @@ var file_proto_pbautoconf_auto_config_proto_depIdxs = []int32{ 0, // [0:3] is the sub-list for field type_name } -func init() { file_proto_pbautoconf_auto_config_proto_init() } -func file_proto_pbautoconf_auto_config_proto_init() { - if File_proto_pbautoconf_auto_config_proto != nil { +func init() { file_private_pbautoconf_auto_config_proto_init() } +func file_private_pbautoconf_auto_config_proto_init() { + if File_private_pbautoconf_auto_config_proto != nil { return } if !protoimpl.UnsafeEnabled { - file_proto_pbautoconf_auto_config_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + file_private_pbautoconf_auto_config_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*AutoConfigRequest); i { case 0: return &v.state @@ -320,7 +321,7 @@ func file_proto_pbautoconf_auto_config_proto_init() { return nil } } - file_proto_pbautoconf_auto_config_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + file_private_pbautoconf_auto_config_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*AutoConfigResponse); i { case 0: return &v.state @@ -337,18 +338,18 @@ func file_proto_pbautoconf_auto_config_proto_init() { out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_proto_pbautoconf_auto_config_proto_rawDesc, + RawDescriptor: file_private_pbautoconf_auto_config_proto_rawDesc, NumEnums: 0, NumMessages: 2, NumExtensions: 0, NumServices: 0, }, - GoTypes: file_proto_pbautoconf_auto_config_proto_goTypes, - DependencyIndexes: file_proto_pbautoconf_auto_config_proto_depIdxs, - MessageInfos: file_proto_pbautoconf_auto_config_proto_msgTypes, + GoTypes: file_private_pbautoconf_auto_config_proto_goTypes, + DependencyIndexes: file_private_pbautoconf_auto_config_proto_depIdxs, + MessageInfos: file_private_pbautoconf_auto_config_proto_msgTypes, }.Build() - File_proto_pbautoconf_auto_config_proto = out.File - file_proto_pbautoconf_auto_config_proto_rawDesc = nil - file_proto_pbautoconf_auto_config_proto_goTypes = nil - file_proto_pbautoconf_auto_config_proto_depIdxs = nil + File_private_pbautoconf_auto_config_proto = out.File + file_private_pbautoconf_auto_config_proto_rawDesc = nil + file_private_pbautoconf_auto_config_proto_goTypes = nil + file_private_pbautoconf_auto_config_proto_depIdxs = nil } diff --git a/proto/pbautoconf/auto_config.proto b/proto/private/pbautoconf/auto_config.proto similarity index 95% rename from proto/pbautoconf/auto_config.proto rename to proto/private/pbautoconf/auto_config.proto index c43f1c912e2..07ad2ac1d6a 100644 --- a/proto/pbautoconf/auto_config.proto +++ b/proto/private/pbautoconf/auto_config.proto @@ -2,8 +2,8 @@ syntax = "proto3"; package hashicorp.consul.internal.autoconf; -import "proto/pbconfig/config.proto"; -import "proto/pbconnect/connect.proto"; +import "private/pbconfig/config.proto"; +import "private/pbconnect/connect.proto"; // AutoConfigRequest is the data structure to be sent along with the // AutoConfig.InitialConfiguration RPC diff --git a/proto/pbautoconf/auto_config_oss.go b/proto/private/pbautoconf/auto_config_oss.go similarity index 100% rename from proto/pbautoconf/auto_config_oss.go rename to proto/private/pbautoconf/auto_config_oss.go diff --git a/proto/pbcommon/common.gen.go b/proto/private/pbcommon/common.gen.go similarity index 100% rename from proto/pbcommon/common.gen.go rename to proto/private/pbcommon/common.gen.go diff --git a/proto/pbcommon/common.go b/proto/private/pbcommon/common.go similarity index 100% rename from proto/pbcommon/common.go rename to proto/private/pbcommon/common.go diff --git a/proto/pbcommon/common.pb.binary.go b/proto/private/pbcommon/common.pb.binary.go similarity index 98% rename from proto/pbcommon/common.pb.binary.go rename to proto/private/pbcommon/common.pb.binary.go index 1ddb20b5111..e7e96dbf732 100644 --- a/proto/pbcommon/common.pb.binary.go +++ b/proto/private/pbcommon/common.pb.binary.go @@ -1,5 +1,5 @@ // Code generated by protoc-gen-go-binary. DO NOT EDIT. -// source: proto/pbcommon/common.proto +// source: private/pbcommon/common.proto package pbcommon diff --git a/proto/pbcommon/common.pb.go b/proto/private/pbcommon/common.pb.go similarity index 63% rename from proto/pbcommon/common.pb.go rename to proto/private/pbcommon/common.pb.go index 2ba5a2fb48b..f785eca341f 100644 --- a/proto/pbcommon/common.pb.go +++ b/proto/private/pbcommon/common.pb.go @@ -2,7 +2,7 @@ // versions: // protoc-gen-go v1.28.1 // protoc (unknown) -// source: proto/pbcommon/common.proto +// source: private/pbcommon/common.proto package pbcommon @@ -45,7 +45,7 @@ type RaftIndex struct { func (x *RaftIndex) Reset() { *x = RaftIndex{} if protoimpl.UnsafeEnabled { - mi := &file_proto_pbcommon_common_proto_msgTypes[0] + mi := &file_private_pbcommon_common_proto_msgTypes[0] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -58,7 +58,7 @@ func (x *RaftIndex) String() string { func (*RaftIndex) ProtoMessage() {} func (x *RaftIndex) ProtoReflect() protoreflect.Message { - mi := &file_proto_pbcommon_common_proto_msgTypes[0] + mi := &file_private_pbcommon_common_proto_msgTypes[0] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -71,7 +71,7 @@ func (x *RaftIndex) ProtoReflect() protoreflect.Message { // Deprecated: Use RaftIndex.ProtoReflect.Descriptor instead. func (*RaftIndex) Descriptor() ([]byte, []int) { - return file_proto_pbcommon_common_proto_rawDescGZIP(), []int{0} + return file_private_pbcommon_common_proto_rawDescGZIP(), []int{0} } func (x *RaftIndex) GetCreateIndex() uint64 { @@ -101,7 +101,7 @@ type TargetDatacenter struct { func (x *TargetDatacenter) Reset() { *x = TargetDatacenter{} if protoimpl.UnsafeEnabled { - mi := &file_proto_pbcommon_common_proto_msgTypes[1] + mi := &file_private_pbcommon_common_proto_msgTypes[1] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -114,7 +114,7 @@ func (x *TargetDatacenter) String() string { func (*TargetDatacenter) ProtoMessage() {} func (x *TargetDatacenter) ProtoReflect() protoreflect.Message { - mi := &file_proto_pbcommon_common_proto_msgTypes[1] + mi := &file_private_pbcommon_common_proto_msgTypes[1] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -127,7 +127,7 @@ func (x *TargetDatacenter) ProtoReflect() protoreflect.Message { // Deprecated: Use TargetDatacenter.ProtoReflect.Descriptor instead. func (*TargetDatacenter) Descriptor() ([]byte, []int) { - return file_proto_pbcommon_common_proto_rawDescGZIP(), []int{1} + return file_private_pbcommon_common_proto_rawDescGZIP(), []int{1} } func (x *TargetDatacenter) GetDatacenter() string { @@ -156,7 +156,7 @@ type WriteRequest struct { func (x *WriteRequest) Reset() { *x = WriteRequest{} if protoimpl.UnsafeEnabled { - mi := &file_proto_pbcommon_common_proto_msgTypes[2] + mi := &file_private_pbcommon_common_proto_msgTypes[2] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -169,7 +169,7 @@ func (x *WriteRequest) String() string { func (*WriteRequest) ProtoMessage() {} func (x *WriteRequest) ProtoReflect() protoreflect.Message { - mi := &file_proto_pbcommon_common_proto_msgTypes[2] + mi := &file_private_pbcommon_common_proto_msgTypes[2] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -182,7 +182,7 @@ func (x *WriteRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use WriteRequest.ProtoReflect.Descriptor instead. func (*WriteRequest) Descriptor() ([]byte, []int) { - return file_proto_pbcommon_common_proto_rawDescGZIP(), []int{2} + return file_private_pbcommon_common_proto_rawDescGZIP(), []int{2} } func (x *WriteRequest) GetToken() string { @@ -213,7 +213,7 @@ type ReadRequest struct { func (x *ReadRequest) Reset() { *x = ReadRequest{} if protoimpl.UnsafeEnabled { - mi := &file_proto_pbcommon_common_proto_msgTypes[3] + mi := &file_private_pbcommon_common_proto_msgTypes[3] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -226,7 +226,7 @@ func (x *ReadRequest) String() string { func (*ReadRequest) ProtoMessage() {} func (x *ReadRequest) ProtoReflect() protoreflect.Message { - mi := &file_proto_pbcommon_common_proto_msgTypes[3] + mi := &file_private_pbcommon_common_proto_msgTypes[3] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -239,7 +239,7 @@ func (x *ReadRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ReadRequest.ProtoReflect.Descriptor instead. func (*ReadRequest) Descriptor() ([]byte, []int) { - return file_proto_pbcommon_common_proto_rawDescGZIP(), []int{3} + return file_private_pbcommon_common_proto_rawDescGZIP(), []int{3} } func (x *ReadRequest) GetToken() string { @@ -326,7 +326,7 @@ type QueryOptions struct { func (x *QueryOptions) Reset() { *x = QueryOptions{} if protoimpl.UnsafeEnabled { - mi := &file_proto_pbcommon_common_proto_msgTypes[4] + mi := &file_private_pbcommon_common_proto_msgTypes[4] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -339,7 +339,7 @@ func (x *QueryOptions) String() string { func (*QueryOptions) ProtoMessage() {} func (x *QueryOptions) ProtoReflect() protoreflect.Message { - mi := &file_proto_pbcommon_common_proto_msgTypes[4] + mi := &file_private_pbcommon_common_proto_msgTypes[4] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -352,7 +352,7 @@ func (x *QueryOptions) ProtoReflect() protoreflect.Message { // Deprecated: Use QueryOptions.ProtoReflect.Descriptor instead. func (*QueryOptions) Descriptor() ([]byte, []int) { - return file_proto_pbcommon_common_proto_rawDescGZIP(), []int{4} + return file_private_pbcommon_common_proto_rawDescGZIP(), []int{4} } func (x *QueryOptions) GetToken() string { @@ -468,7 +468,7 @@ type QueryMeta struct { func (x *QueryMeta) Reset() { *x = QueryMeta{} if protoimpl.UnsafeEnabled { - mi := &file_proto_pbcommon_common_proto_msgTypes[5] + mi := &file_private_pbcommon_common_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -481,7 +481,7 @@ func (x *QueryMeta) String() string { func (*QueryMeta) ProtoMessage() {} func (x *QueryMeta) ProtoReflect() protoreflect.Message { - mi := &file_proto_pbcommon_common_proto_msgTypes[5] + mi := &file_private_pbcommon_common_proto_msgTypes[5] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -494,7 +494,7 @@ func (x *QueryMeta) ProtoReflect() protoreflect.Message { // Deprecated: Use QueryMeta.ProtoReflect.Descriptor instead. func (*QueryMeta) Descriptor() ([]byte, []int) { - return file_proto_pbcommon_common_proto_rawDescGZIP(), []int{5} + return file_private_pbcommon_common_proto_rawDescGZIP(), []int{5} } func (x *QueryMeta) GetIndex() uint64 { @@ -548,7 +548,7 @@ type EnterpriseMeta struct { func (x *EnterpriseMeta) Reset() { *x = EnterpriseMeta{} if protoimpl.UnsafeEnabled { - mi := &file_proto_pbcommon_common_proto_msgTypes[6] + mi := &file_private_pbcommon_common_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -561,7 +561,7 @@ func (x *EnterpriseMeta) String() string { func (*EnterpriseMeta) ProtoMessage() {} func (x *EnterpriseMeta) ProtoReflect() protoreflect.Message { - mi := &file_proto_pbcommon_common_proto_msgTypes[6] + mi := &file_private_pbcommon_common_proto_msgTypes[6] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -574,7 +574,7 @@ func (x *EnterpriseMeta) ProtoReflect() protoreflect.Message { // Deprecated: Use EnterpriseMeta.ProtoReflect.Descriptor instead. func (*EnterpriseMeta) Descriptor() ([]byte, []int) { - return file_proto_pbcommon_common_proto_rawDescGZIP(), []int{6} + return file_private_pbcommon_common_proto_rawDescGZIP(), []int{6} } func (x *EnterpriseMeta) GetNamespace() string { @@ -610,7 +610,7 @@ type EnvoyExtension struct { func (x *EnvoyExtension) Reset() { *x = EnvoyExtension{} if protoimpl.UnsafeEnabled { - mi := &file_proto_pbcommon_common_proto_msgTypes[7] + mi := &file_private_pbcommon_common_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -623,7 +623,7 @@ func (x *EnvoyExtension) String() string { func (*EnvoyExtension) ProtoMessage() {} func (x *EnvoyExtension) ProtoReflect() protoreflect.Message { - mi := &file_proto_pbcommon_common_proto_msgTypes[7] + mi := &file_private_pbcommon_common_proto_msgTypes[7] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -636,7 +636,7 @@ func (x *EnvoyExtension) ProtoReflect() protoreflect.Message { // Deprecated: Use EnvoyExtension.ProtoReflect.Descriptor instead. func (*EnvoyExtension) Descriptor() ([]byte, []int) { - return file_proto_pbcommon_common_proto_rawDescGZIP(), []int{7} + return file_private_pbcommon_common_proto_rawDescGZIP(), []int{7} } func (x *EnvoyExtension) GetName() string { @@ -660,124 +660,125 @@ func (x *EnvoyExtension) GetArguments() *structpb.Struct { return nil } -var File_proto_pbcommon_common_proto protoreflect.FileDescriptor - -var file_proto_pbcommon_common_proto_rawDesc = []byte{ - 0x0a, 0x1b, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x70, 0x62, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, - 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x20, 0x68, - 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, - 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x1a, - 0x1e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2f, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, - 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2f, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x4f, 0x0a, - 0x09, 0x52, 0x61, 0x66, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x20, 0x0a, 0x0b, 0x43, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, - 0x0b, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x20, 0x0a, 0x0b, - 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x04, 0x52, 0x0b, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x32, - 0x0a, 0x10, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x44, 0x61, 0x74, 0x61, 0x63, 0x65, 0x6e, 0x74, - 0x65, 0x72, 0x12, 0x1e, 0x0a, 0x0a, 0x44, 0x61, 0x74, 0x61, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x44, 0x61, 0x74, 0x61, 0x63, 0x65, 0x6e, 0x74, - 0x65, 0x72, 0x22, 0x24, 0x0a, 0x0c, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x51, 0x0a, 0x0b, 0x52, 0x65, 0x61, 0x64, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x54, 0x6f, 0x6b, 0x65, 0x6e, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x2c, 0x0a, - 0x11, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x43, 0x6f, 0x6e, 0x73, 0x69, 0x73, 0x74, 0x65, - 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, - 0x65, 0x43, 0x6f, 0x6e, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x74, 0x22, 0xec, 0x03, 0x0a, 0x0c, - 0x51, 0x75, 0x65, 0x72, 0x79, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x14, 0x0a, 0x05, - 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x54, 0x6f, 0x6b, - 0x65, 0x6e, 0x12, 0x24, 0x0a, 0x0d, 0x4d, 0x69, 0x6e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x49, 0x6e, - 0x64, 0x65, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x4d, 0x69, 0x6e, 0x51, 0x75, - 0x65, 0x72, 0x79, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x3d, 0x0a, 0x0c, 0x4d, 0x61, 0x78, 0x51, - 0x75, 0x65, 0x72, 0x79, 0x54, 0x69, 0x6d, 0x65, 0x18, 0x03, 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, 0x52, 0x0c, 0x4d, 0x61, 0x78, 0x51, 0x75, - 0x65, 0x72, 0x79, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x41, 0x6c, 0x6c, 0x6f, 0x77, - 0x53, 0x74, 0x61, 0x6c, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x41, 0x6c, 0x6c, - 0x6f, 0x77, 0x53, 0x74, 0x61, 0x6c, 0x65, 0x12, 0x2c, 0x0a, 0x11, 0x52, 0x65, 0x71, 0x75, 0x69, - 0x72, 0x65, 0x43, 0x6f, 0x6e, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x11, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x43, 0x6f, 0x6e, 0x73, 0x69, - 0x73, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x55, 0x73, 0x65, 0x43, 0x61, 0x63, 0x68, - 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x55, 0x73, 0x65, 0x43, 0x61, 0x63, 0x68, - 0x65, 0x12, 0x45, 0x0a, 0x10, 0x4d, 0x61, 0x78, 0x53, 0x74, 0x61, 0x6c, 0x65, 0x44, 0x75, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, +var File_private_pbcommon_common_proto protoreflect.FileDescriptor + +var file_private_pbcommon_common_proto_rawDesc = []byte{ + 0x0a, 0x1d, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2f, 0x70, 0x62, 0x63, 0x6f, 0x6d, 0x6d, + 0x6f, 0x6e, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, + 0x20, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, + 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, + 0x6e, 0x1a, 0x1e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2f, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2f, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, + 0x4f, 0x0a, 0x09, 0x52, 0x61, 0x66, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x20, 0x0a, 0x0b, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x0b, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x20, + 0x0a, 0x0b, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x04, 0x52, 0x0b, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x49, 0x6e, 0x64, 0x65, 0x78, + 0x22, 0x32, 0x0a, 0x10, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x44, 0x61, 0x74, 0x61, 0x63, 0x65, + 0x6e, 0x74, 0x65, 0x72, 0x12, 0x1e, 0x0a, 0x0a, 0x44, 0x61, 0x74, 0x61, 0x63, 0x65, 0x6e, 0x74, + 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x44, 0x61, 0x74, 0x61, 0x63, 0x65, + 0x6e, 0x74, 0x65, 0x72, 0x22, 0x24, 0x0a, 0x0c, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x51, 0x0a, 0x0b, 0x52, 0x65, + 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x54, 0x6f, 0x6b, + 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, + 0x2c, 0x0a, 0x11, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x43, 0x6f, 0x6e, 0x73, 0x69, 0x73, + 0x74, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x52, 0x65, 0x71, 0x75, + 0x69, 0x72, 0x65, 0x43, 0x6f, 0x6e, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x74, 0x22, 0xec, 0x03, + 0x0a, 0x0c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x14, + 0x0a, 0x05, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x54, + 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x24, 0x0a, 0x0d, 0x4d, 0x69, 0x6e, 0x51, 0x75, 0x65, 0x72, 0x79, + 0x49, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x4d, 0x69, 0x6e, + 0x51, 0x75, 0x65, 0x72, 0x79, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x3d, 0x0a, 0x0c, 0x4d, 0x61, + 0x78, 0x51, 0x75, 0x65, 0x72, 0x79, 0x54, 0x69, 0x6d, 0x65, 0x18, 0x03, 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, 0x52, 0x0c, 0x4d, 0x61, 0x78, + 0x51, 0x75, 0x65, 0x72, 0x79, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x41, 0x6c, 0x6c, + 0x6f, 0x77, 0x53, 0x74, 0x61, 0x6c, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x41, + 0x6c, 0x6c, 0x6f, 0x77, 0x53, 0x74, 0x61, 0x6c, 0x65, 0x12, 0x2c, 0x0a, 0x11, 0x52, 0x65, 0x71, + 0x75, 0x69, 0x72, 0x65, 0x43, 0x6f, 0x6e, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x43, 0x6f, 0x6e, + 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x55, 0x73, 0x65, 0x43, 0x61, + 0x63, 0x68, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x55, 0x73, 0x65, 0x43, 0x61, + 0x63, 0x68, 0x65, 0x12, 0x45, 0x0a, 0x10, 0x4d, 0x61, 0x78, 0x53, 0x74, 0x61, 0x6c, 0x65, 0x44, + 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x07, 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, 0x52, 0x10, 0x4d, 0x61, 0x78, 0x53, 0x74, 0x61, + 0x6c, 0x65, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x31, 0x0a, 0x06, 0x4d, 0x61, + 0x78, 0x41, 0x67, 0x65, 0x18, 0x08, 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, 0x52, 0x06, 0x4d, 0x61, 0x78, 0x41, 0x67, 0x65, 0x12, 0x26, 0x0a, + 0x0e, 0x4d, 0x75, 0x73, 0x74, 0x52, 0x65, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x18, + 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x4d, 0x75, 0x73, 0x74, 0x52, 0x65, 0x76, 0x61, 0x6c, + 0x69, 0x64, 0x61, 0x74, 0x65, 0x12, 0x3d, 0x0a, 0x0c, 0x53, 0x74, 0x61, 0x6c, 0x65, 0x49, 0x66, + 0x45, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x0a, 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, 0x52, 0x10, 0x4d, 0x61, 0x78, 0x53, 0x74, 0x61, 0x6c, 0x65, - 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x31, 0x0a, 0x06, 0x4d, 0x61, 0x78, 0x41, - 0x67, 0x65, 0x18, 0x08, 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, 0x52, 0x06, 0x4d, 0x61, 0x78, 0x41, 0x67, 0x65, 0x12, 0x26, 0x0a, 0x0e, 0x4d, - 0x75, 0x73, 0x74, 0x52, 0x65, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x18, 0x09, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x0e, 0x4d, 0x75, 0x73, 0x74, 0x52, 0x65, 0x76, 0x61, 0x6c, 0x69, 0x64, - 0x61, 0x74, 0x65, 0x12, 0x3d, 0x0a, 0x0c, 0x53, 0x74, 0x61, 0x6c, 0x65, 0x49, 0x66, 0x45, 0x72, - 0x72, 0x6f, 0x72, 0x18, 0x0a, 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, 0x52, 0x0c, 0x53, 0x74, 0x61, 0x6c, 0x65, 0x49, 0x66, 0x45, 0x72, 0x72, - 0x6f, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x0b, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x06, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x22, 0xee, 0x01, 0x0a, 0x09, 0x51, - 0x75, 0x65, 0x72, 0x79, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x14, 0x0a, 0x05, 0x49, 0x6e, 0x64, 0x65, - 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x3b, - 0x0a, 0x0b, 0x4c, 0x61, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x18, 0x02, 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, 0x52, 0x0b, - 0x4c, 0x61, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x4b, - 0x6e, 0x6f, 0x77, 0x6e, 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x0b, 0x4b, 0x6e, 0x6f, 0x77, 0x6e, 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x2a, 0x0a, - 0x10, 0x43, 0x6f, 0x6e, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x4c, 0x65, 0x76, 0x65, - 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x43, 0x6f, 0x6e, 0x73, 0x69, 0x73, 0x74, - 0x65, 0x6e, 0x63, 0x79, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x34, 0x0a, 0x15, 0x52, 0x65, 0x73, - 0x75, 0x6c, 0x74, 0x73, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x65, 0x64, 0x42, 0x79, 0x41, 0x43, - 0x4c, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x15, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, - 0x73, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x65, 0x64, 0x42, 0x79, 0x41, 0x43, 0x4c, 0x73, 0x4a, - 0x04, 0x08, 0x05, 0x10, 0x06, 0x4a, 0x04, 0x08, 0x06, 0x10, 0x07, 0x22, 0x4c, 0x0a, 0x0e, 0x45, - 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x1c, 0x0a, - 0x09, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x09, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x50, - 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, - 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x77, 0x0a, 0x0e, 0x45, 0x6e, 0x76, - 0x6f, 0x79, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x4e, - 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, - 0x1a, 0x0a, 0x08, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x08, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x12, 0x35, 0x0a, 0x09, 0x41, - 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x09, 0x41, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x42, 0x83, 0x02, 0x0a, 0x24, 0x63, 0x6f, 0x6d, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, - 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, - 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x42, 0x0b, 0x43, 0x6f, 0x6d, - 0x6d, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x2a, 0x67, 0x69, 0x74, 0x68, - 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, - 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x70, 0x62, - 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0xa2, 0x02, 0x04, 0x48, 0x43, 0x49, 0x43, 0xaa, 0x02, 0x20, - 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, - 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, - 0xca, 0x02, 0x20, 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x5c, 0x43, 0x6f, 0x6e, - 0x73, 0x75, 0x6c, 0x5c, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5c, 0x43, 0x6f, 0x6d, - 0x6d, 0x6f, 0x6e, 0xe2, 0x02, 0x2c, 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x5c, - 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x5c, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5c, - 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, - 0x74, 0x61, 0xea, 0x02, 0x23, 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x3a, 0x3a, - 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x3a, 0x3a, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, - 0x3a, 0x3a, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0c, 0x53, 0x74, 0x61, 0x6c, 0x65, 0x49, 0x66, 0x45, + 0x72, 0x72, 0x6f, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x0b, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x22, 0xee, 0x01, 0x0a, + 0x09, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x14, 0x0a, 0x05, 0x49, 0x6e, + 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x49, 0x6e, 0x64, 0x65, 0x78, + 0x12, 0x3b, 0x0a, 0x0b, 0x4c, 0x61, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x18, + 0x02, 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, + 0x52, 0x0b, 0x4c, 0x61, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x12, 0x20, 0x0a, + 0x0b, 0x4b, 0x6e, 0x6f, 0x77, 0x6e, 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x0b, 0x4b, 0x6e, 0x6f, 0x77, 0x6e, 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, + 0x2a, 0x0a, 0x10, 0x43, 0x6f, 0x6e, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x4c, 0x65, + 0x76, 0x65, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x43, 0x6f, 0x6e, 0x73, 0x69, + 0x73, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x34, 0x0a, 0x15, 0x52, + 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x65, 0x64, 0x42, 0x79, + 0x41, 0x43, 0x4c, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x15, 0x52, 0x65, 0x73, 0x75, + 0x6c, 0x74, 0x73, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x65, 0x64, 0x42, 0x79, 0x41, 0x43, 0x4c, + 0x73, 0x4a, 0x04, 0x08, 0x05, 0x10, 0x06, 0x4a, 0x04, 0x08, 0x06, 0x10, 0x07, 0x22, 0x4c, 0x0a, + 0x0e, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x12, + 0x1c, 0x0a, 0x09, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x09, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1c, 0x0a, + 0x09, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x09, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x77, 0x0a, 0x0e, 0x45, + 0x6e, 0x76, 0x6f, 0x79, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, + 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, + 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x08, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x12, 0x35, 0x0a, + 0x09, 0x41, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x09, 0x41, 0x72, 0x67, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x42, 0x8b, 0x02, 0x0a, 0x24, 0x63, 0x6f, 0x6d, 0x2e, 0x68, 0x61, 0x73, + 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, + 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x42, 0x0b, 0x43, + 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x32, 0x67, 0x69, + 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, + 0x72, 0x70, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, + 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2f, 0x70, 0x62, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, + 0xa2, 0x02, 0x04, 0x48, 0x43, 0x49, 0x43, 0xaa, 0x02, 0x20, 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, + 0x6f, 0x72, 0x70, 0x2e, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x72, + 0x6e, 0x61, 0x6c, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0xca, 0x02, 0x20, 0x48, 0x61, 0x73, + 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x5c, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x5c, 0x49, 0x6e, + 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5c, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0xe2, 0x02, 0x2c, + 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x5c, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, + 0x5c, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5c, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, + 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x23, 0x48, + 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x3a, 0x3a, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, + 0x3a, 0x3a, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x3a, 0x3a, 0x43, 0x6f, 0x6d, 0x6d, + 0x6f, 0x6e, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( - file_proto_pbcommon_common_proto_rawDescOnce sync.Once - file_proto_pbcommon_common_proto_rawDescData = file_proto_pbcommon_common_proto_rawDesc + file_private_pbcommon_common_proto_rawDescOnce sync.Once + file_private_pbcommon_common_proto_rawDescData = file_private_pbcommon_common_proto_rawDesc ) -func file_proto_pbcommon_common_proto_rawDescGZIP() []byte { - file_proto_pbcommon_common_proto_rawDescOnce.Do(func() { - file_proto_pbcommon_common_proto_rawDescData = protoimpl.X.CompressGZIP(file_proto_pbcommon_common_proto_rawDescData) +func file_private_pbcommon_common_proto_rawDescGZIP() []byte { + file_private_pbcommon_common_proto_rawDescOnce.Do(func() { + file_private_pbcommon_common_proto_rawDescData = protoimpl.X.CompressGZIP(file_private_pbcommon_common_proto_rawDescData) }) - return file_proto_pbcommon_common_proto_rawDescData + return file_private_pbcommon_common_proto_rawDescData } -var file_proto_pbcommon_common_proto_msgTypes = make([]protoimpl.MessageInfo, 8) -var file_proto_pbcommon_common_proto_goTypes = []interface{}{ +var file_private_pbcommon_common_proto_msgTypes = make([]protoimpl.MessageInfo, 8) +var file_private_pbcommon_common_proto_goTypes = []interface{}{ (*RaftIndex)(nil), // 0: hashicorp.consul.internal.common.RaftIndex (*TargetDatacenter)(nil), // 1: hashicorp.consul.internal.common.TargetDatacenter (*WriteRequest)(nil), // 2: hashicorp.consul.internal.common.WriteRequest @@ -789,7 +790,7 @@ var file_proto_pbcommon_common_proto_goTypes = []interface{}{ (*durationpb.Duration)(nil), // 8: google.protobuf.Duration (*structpb.Struct)(nil), // 9: google.protobuf.Struct } -var file_proto_pbcommon_common_proto_depIdxs = []int32{ +var file_private_pbcommon_common_proto_depIdxs = []int32{ 8, // 0: hashicorp.consul.internal.common.QueryOptions.MaxQueryTime:type_name -> google.protobuf.Duration 8, // 1: hashicorp.consul.internal.common.QueryOptions.MaxStaleDuration:type_name -> google.protobuf.Duration 8, // 2: hashicorp.consul.internal.common.QueryOptions.MaxAge:type_name -> google.protobuf.Duration @@ -803,13 +804,13 @@ var file_proto_pbcommon_common_proto_depIdxs = []int32{ 0, // [0:6] is the sub-list for field type_name } -func init() { file_proto_pbcommon_common_proto_init() } -func file_proto_pbcommon_common_proto_init() { - if File_proto_pbcommon_common_proto != nil { +func init() { file_private_pbcommon_common_proto_init() } +func file_private_pbcommon_common_proto_init() { + if File_private_pbcommon_common_proto != nil { return } if !protoimpl.UnsafeEnabled { - file_proto_pbcommon_common_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + file_private_pbcommon_common_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*RaftIndex); i { case 0: return &v.state @@ -821,7 +822,7 @@ func file_proto_pbcommon_common_proto_init() { return nil } } - file_proto_pbcommon_common_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + file_private_pbcommon_common_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*TargetDatacenter); i { case 0: return &v.state @@ -833,7 +834,7 @@ func file_proto_pbcommon_common_proto_init() { return nil } } - file_proto_pbcommon_common_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + file_private_pbcommon_common_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*WriteRequest); i { case 0: return &v.state @@ -845,7 +846,7 @@ func file_proto_pbcommon_common_proto_init() { return nil } } - file_proto_pbcommon_common_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + file_private_pbcommon_common_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ReadRequest); i { case 0: return &v.state @@ -857,7 +858,7 @@ func file_proto_pbcommon_common_proto_init() { return nil } } - file_proto_pbcommon_common_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + file_private_pbcommon_common_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*QueryOptions); i { case 0: return &v.state @@ -869,7 +870,7 @@ func file_proto_pbcommon_common_proto_init() { return nil } } - file_proto_pbcommon_common_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + file_private_pbcommon_common_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*QueryMeta); i { case 0: return &v.state @@ -881,7 +882,7 @@ func file_proto_pbcommon_common_proto_init() { return nil } } - file_proto_pbcommon_common_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { + file_private_pbcommon_common_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*EnterpriseMeta); i { case 0: return &v.state @@ -893,7 +894,7 @@ func file_proto_pbcommon_common_proto_init() { return nil } } - file_proto_pbcommon_common_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { + file_private_pbcommon_common_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*EnvoyExtension); i { case 0: return &v.state @@ -910,18 +911,18 @@ func file_proto_pbcommon_common_proto_init() { out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_proto_pbcommon_common_proto_rawDesc, + RawDescriptor: file_private_pbcommon_common_proto_rawDesc, NumEnums: 0, NumMessages: 8, NumExtensions: 0, NumServices: 0, }, - GoTypes: file_proto_pbcommon_common_proto_goTypes, - DependencyIndexes: file_proto_pbcommon_common_proto_depIdxs, - MessageInfos: file_proto_pbcommon_common_proto_msgTypes, + GoTypes: file_private_pbcommon_common_proto_goTypes, + DependencyIndexes: file_private_pbcommon_common_proto_depIdxs, + MessageInfos: file_private_pbcommon_common_proto_msgTypes, }.Build() - File_proto_pbcommon_common_proto = out.File - file_proto_pbcommon_common_proto_rawDesc = nil - file_proto_pbcommon_common_proto_goTypes = nil - file_proto_pbcommon_common_proto_depIdxs = nil + File_private_pbcommon_common_proto = out.File + file_private_pbcommon_common_proto_rawDesc = nil + file_private_pbcommon_common_proto_goTypes = nil + file_private_pbcommon_common_proto_depIdxs = nil } diff --git a/proto/pbcommon/common.proto b/proto/private/pbcommon/common.proto similarity index 100% rename from proto/pbcommon/common.proto rename to proto/private/pbcommon/common.proto diff --git a/proto/pbcommon/common_oss.go b/proto/private/pbcommon/common_oss.go similarity index 100% rename from proto/pbcommon/common_oss.go rename to proto/private/pbcommon/common_oss.go diff --git a/proto/pbcommon/convert_pbstruct.go b/proto/private/pbcommon/convert_pbstruct.go similarity index 100% rename from proto/pbcommon/convert_pbstruct.go rename to proto/private/pbcommon/convert_pbstruct.go diff --git a/proto/pbcommon/convert_pbstruct_test.go b/proto/private/pbcommon/convert_pbstruct_test.go similarity index 100% rename from proto/pbcommon/convert_pbstruct_test.go rename to proto/private/pbcommon/convert_pbstruct_test.go diff --git a/proto/pbconfig/config.pb.binary.go b/proto/private/pbconfig/config.pb.binary.go similarity index 98% rename from proto/pbconfig/config.pb.binary.go rename to proto/private/pbconfig/config.pb.binary.go index a978adc8a69..d599791b950 100644 --- a/proto/pbconfig/config.pb.binary.go +++ b/proto/private/pbconfig/config.pb.binary.go @@ -1,5 +1,5 @@ // Code generated by protoc-gen-go-binary. DO NOT EDIT. -// source: proto/pbconfig/config.proto +// source: private/pbconfig/config.proto package pbconfig diff --git a/proto/pbconfig/config.pb.go b/proto/private/pbconfig/config.pb.go similarity index 56% rename from proto/pbconfig/config.pb.go rename to proto/private/pbconfig/config.pb.go index 589985d171e..4539fc419e2 100644 --- a/proto/pbconfig/config.pb.go +++ b/proto/private/pbconfig/config.pb.go @@ -2,7 +2,7 @@ // versions: // protoc-gen-go v1.28.1 // protoc (unknown) -// source: proto/pbconfig/config.proto +// source: private/pbconfig/config.proto package pbconfig @@ -39,7 +39,7 @@ type Config struct { func (x *Config) Reset() { *x = Config{} if protoimpl.UnsafeEnabled { - mi := &file_proto_pbconfig_config_proto_msgTypes[0] + mi := &file_private_pbconfig_config_proto_msgTypes[0] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -52,7 +52,7 @@ func (x *Config) String() string { func (*Config) ProtoMessage() {} func (x *Config) ProtoReflect() protoreflect.Message { - mi := &file_proto_pbconfig_config_proto_msgTypes[0] + mi := &file_private_pbconfig_config_proto_msgTypes[0] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -65,7 +65,7 @@ func (x *Config) ProtoReflect() protoreflect.Message { // Deprecated: Use Config.ProtoReflect.Descriptor instead. func (*Config) Descriptor() ([]byte, []int) { - return file_proto_pbconfig_config_proto_rawDescGZIP(), []int{0} + return file_private_pbconfig_config_proto_rawDescGZIP(), []int{0} } func (x *Config) GetDatacenter() string { @@ -143,7 +143,7 @@ type Gossip struct { func (x *Gossip) Reset() { *x = Gossip{} if protoimpl.UnsafeEnabled { - mi := &file_proto_pbconfig_config_proto_msgTypes[1] + mi := &file_private_pbconfig_config_proto_msgTypes[1] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -156,7 +156,7 @@ func (x *Gossip) String() string { func (*Gossip) ProtoMessage() {} func (x *Gossip) ProtoReflect() protoreflect.Message { - mi := &file_proto_pbconfig_config_proto_msgTypes[1] + mi := &file_private_pbconfig_config_proto_msgTypes[1] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -169,7 +169,7 @@ func (x *Gossip) ProtoReflect() protoreflect.Message { // Deprecated: Use Gossip.ProtoReflect.Descriptor instead. func (*Gossip) Descriptor() ([]byte, []int) { - return file_proto_pbconfig_config_proto_rawDescGZIP(), []int{1} + return file_private_pbconfig_config_proto_rawDescGZIP(), []int{1} } func (x *Gossip) GetEncryption() *GossipEncryption { @@ -199,7 +199,7 @@ type GossipEncryption struct { func (x *GossipEncryption) Reset() { *x = GossipEncryption{} if protoimpl.UnsafeEnabled { - mi := &file_proto_pbconfig_config_proto_msgTypes[2] + mi := &file_private_pbconfig_config_proto_msgTypes[2] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -212,7 +212,7 @@ func (x *GossipEncryption) String() string { func (*GossipEncryption) ProtoMessage() {} func (x *GossipEncryption) ProtoReflect() protoreflect.Message { - mi := &file_proto_pbconfig_config_proto_msgTypes[2] + mi := &file_private_pbconfig_config_proto_msgTypes[2] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -225,7 +225,7 @@ func (x *GossipEncryption) ProtoReflect() protoreflect.Message { // Deprecated: Use GossipEncryption.ProtoReflect.Descriptor instead. func (*GossipEncryption) Descriptor() ([]byte, []int) { - return file_proto_pbconfig_config_proto_rawDescGZIP(), []int{2} + return file_private_pbconfig_config_proto_rawDescGZIP(), []int{2} } func (x *GossipEncryption) GetKey() string { @@ -268,7 +268,7 @@ type TLS struct { func (x *TLS) Reset() { *x = TLS{} if protoimpl.UnsafeEnabled { - mi := &file_proto_pbconfig_config_proto_msgTypes[3] + mi := &file_private_pbconfig_config_proto_msgTypes[3] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -281,7 +281,7 @@ func (x *TLS) String() string { func (*TLS) ProtoMessage() {} func (x *TLS) ProtoReflect() protoreflect.Message { - mi := &file_proto_pbconfig_config_proto_msgTypes[3] + mi := &file_private_pbconfig_config_proto_msgTypes[3] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -294,7 +294,7 @@ func (x *TLS) ProtoReflect() protoreflect.Message { // Deprecated: Use TLS.ProtoReflect.Descriptor instead. func (*TLS) Descriptor() ([]byte, []int) { - return file_proto_pbconfig_config_proto_rawDescGZIP(), []int{3} + return file_private_pbconfig_config_proto_rawDescGZIP(), []int{3} } func (x *TLS) GetVerifyOutgoing() bool { @@ -358,7 +358,7 @@ type ACL struct { func (x *ACL) Reset() { *x = ACL{} if protoimpl.UnsafeEnabled { - mi := &file_proto_pbconfig_config_proto_msgTypes[4] + mi := &file_private_pbconfig_config_proto_msgTypes[4] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -371,7 +371,7 @@ func (x *ACL) String() string { func (*ACL) ProtoMessage() {} func (x *ACL) ProtoReflect() protoreflect.Message { - mi := &file_proto_pbconfig_config_proto_msgTypes[4] + mi := &file_private_pbconfig_config_proto_msgTypes[4] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -384,7 +384,7 @@ func (x *ACL) ProtoReflect() protoreflect.Message { // Deprecated: Use ACL.ProtoReflect.Descriptor instead. func (*ACL) Descriptor() ([]byte, []int) { - return file_proto_pbconfig_config_proto_rawDescGZIP(), []int{4} + return file_private_pbconfig_config_proto_rawDescGZIP(), []int{4} } func (x *ACL) GetEnabled() bool { @@ -481,7 +481,7 @@ type ACLTokens struct { func (x *ACLTokens) Reset() { *x = ACLTokens{} if protoimpl.UnsafeEnabled { - mi := &file_proto_pbconfig_config_proto_msgTypes[5] + mi := &file_private_pbconfig_config_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -494,7 +494,7 @@ func (x *ACLTokens) String() string { func (*ACLTokens) ProtoMessage() {} func (x *ACLTokens) ProtoReflect() protoreflect.Message { - mi := &file_proto_pbconfig_config_proto_msgTypes[5] + mi := &file_private_pbconfig_config_proto_msgTypes[5] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -507,7 +507,7 @@ func (x *ACLTokens) ProtoReflect() protoreflect.Message { // Deprecated: Use ACLTokens.ProtoReflect.Descriptor instead. func (*ACLTokens) Descriptor() ([]byte, []int) { - return file_proto_pbconfig_config_proto_rawDescGZIP(), []int{5} + return file_private_pbconfig_config_proto_rawDescGZIP(), []int{5} } func (x *ACLTokens) GetInitialManagement() string { @@ -564,7 +564,7 @@ type ACLServiceProviderToken struct { func (x *ACLServiceProviderToken) Reset() { *x = ACLServiceProviderToken{} if protoimpl.UnsafeEnabled { - mi := &file_proto_pbconfig_config_proto_msgTypes[6] + mi := &file_private_pbconfig_config_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -577,7 +577,7 @@ func (x *ACLServiceProviderToken) String() string { func (*ACLServiceProviderToken) ProtoMessage() {} func (x *ACLServiceProviderToken) ProtoReflect() protoreflect.Message { - mi := &file_proto_pbconfig_config_proto_msgTypes[6] + mi := &file_private_pbconfig_config_proto_msgTypes[6] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -590,7 +590,7 @@ func (x *ACLServiceProviderToken) ProtoReflect() protoreflect.Message { // Deprecated: Use ACLServiceProviderToken.ProtoReflect.Descriptor instead. func (*ACLServiceProviderToken) Descriptor() ([]byte, []int) { - return file_proto_pbconfig_config_proto_rawDescGZIP(), []int{6} + return file_private_pbconfig_config_proto_rawDescGZIP(), []int{6} } func (x *ACLServiceProviderToken) GetAccessorID() string { @@ -621,7 +621,7 @@ type AutoEncrypt struct { func (x *AutoEncrypt) Reset() { *x = AutoEncrypt{} if protoimpl.UnsafeEnabled { - mi := &file_proto_pbconfig_config_proto_msgTypes[7] + mi := &file_private_pbconfig_config_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -634,7 +634,7 @@ func (x *AutoEncrypt) String() string { func (*AutoEncrypt) ProtoMessage() {} func (x *AutoEncrypt) ProtoReflect() protoreflect.Message { - mi := &file_proto_pbconfig_config_proto_msgTypes[7] + mi := &file_private_pbconfig_config_proto_msgTypes[7] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -647,7 +647,7 @@ func (x *AutoEncrypt) ProtoReflect() protoreflect.Message { // Deprecated: Use AutoEncrypt.ProtoReflect.Descriptor instead. func (*AutoEncrypt) Descriptor() ([]byte, []int) { - return file_proto_pbconfig_config_proto_rawDescGZIP(), []int{7} + return file_private_pbconfig_config_proto_rawDescGZIP(), []int{7} } func (x *AutoEncrypt) GetTLS() bool { @@ -678,165 +678,166 @@ func (x *AutoEncrypt) GetAllowTLS() bool { return false } -var File_proto_pbconfig_config_proto protoreflect.FileDescriptor - -var file_proto_pbconfig_config_proto_rawDesc = []byte{ - 0x0a, 0x1b, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x70, 0x62, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x20, 0x68, - 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, - 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, - 0xb7, 0x03, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x1e, 0x0a, 0x0a, 0x44, 0x61, - 0x74, 0x61, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, - 0x44, 0x61, 0x74, 0x61, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x12, 0x2c, 0x0a, 0x11, 0x50, 0x72, - 0x69, 0x6d, 0x61, 0x72, 0x79, 0x44, 0x61, 0x74, 0x61, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x44, 0x61, - 0x74, 0x61, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x12, 0x1a, 0x0a, 0x08, 0x4e, 0x6f, 0x64, 0x65, - 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x4e, 0x6f, 0x64, 0x65, - 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x4e, - 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x53, 0x65, 0x67, 0x6d, 0x65, - 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, - 0x69, 0x6f, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x50, 0x61, 0x72, 0x74, 0x69, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x37, 0x0a, 0x03, 0x41, 0x43, 0x4c, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x25, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, - 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x41, 0x43, 0x4c, 0x52, 0x03, 0x41, 0x43, 0x4c, 0x12, 0x4f, 0x0a, - 0x0b, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, - 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70, - 0x74, 0x52, 0x0b, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x12, 0x40, - 0x0a, 0x06, 0x47, 0x6f, 0x73, 0x73, 0x69, 0x70, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, - 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, +var File_private_pbconfig_config_proto protoreflect.FileDescriptor + +var file_private_pbconfig_config_proto_rawDesc = []byte{ + 0x0a, 0x1d, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2f, 0x70, 0x62, 0x63, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, + 0x20, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x2e, 0x47, 0x6f, 0x73, 0x73, 0x69, 0x70, 0x52, 0x06, 0x47, 0x6f, 0x73, 0x73, 0x69, 0x70, - 0x12, 0x37, 0x0a, 0x03, 0x54, 0x4c, 0x53, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, - 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, - 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x2e, 0x54, 0x4c, 0x53, 0x52, 0x03, 0x54, 0x4c, 0x53, 0x22, 0x80, 0x01, 0x0a, 0x06, 0x47, 0x6f, - 0x73, 0x73, 0x69, 0x70, 0x12, 0x52, 0x0a, 0x0a, 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, - 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, - 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x47, 0x6f, 0x73, 0x73, - 0x69, 0x70, 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x45, 0x6e, - 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x22, 0x0a, 0x0c, 0x52, 0x65, 0x74, 0x72, - 0x79, 0x4a, 0x6f, 0x69, 0x6e, 0x4c, 0x41, 0x4e, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, - 0x52, 0x65, 0x74, 0x72, 0x79, 0x4a, 0x6f, 0x69, 0x6e, 0x4c, 0x41, 0x4e, 0x22, 0x74, 0x0a, 0x10, - 0x47, 0x6f, 0x73, 0x73, 0x69, 0x70, 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x12, 0x10, 0x0a, 0x03, 0x4b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x4b, - 0x65, 0x79, 0x12, 0x26, 0x0a, 0x0e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x49, 0x6e, 0x63, 0x6f, - 0x6d, 0x69, 0x6e, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x56, 0x65, 0x72, 0x69, - 0x66, 0x79, 0x49, 0x6e, 0x63, 0x6f, 0x6d, 0x69, 0x6e, 0x67, 0x12, 0x26, 0x0a, 0x0e, 0x56, 0x65, - 0x72, 0x69, 0x66, 0x79, 0x4f, 0x75, 0x74, 0x67, 0x6f, 0x69, 0x6e, 0x67, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x0e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x4f, 0x75, 0x74, 0x67, 0x6f, 0x69, - 0x6e, 0x67, 0x22, 0xfa, 0x01, 0x0a, 0x03, 0x54, 0x4c, 0x53, 0x12, 0x26, 0x0a, 0x0e, 0x56, 0x65, - 0x72, 0x69, 0x66, 0x79, 0x4f, 0x75, 0x74, 0x67, 0x6f, 0x69, 0x6e, 0x67, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x0e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x4f, 0x75, 0x74, 0x67, 0x6f, 0x69, - 0x6e, 0x67, 0x12, 0x32, 0x0a, 0x14, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x53, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x48, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x14, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x48, 0x6f, - 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x43, 0x69, 0x70, 0x68, 0x65, 0x72, - 0x53, 0x75, 0x69, 0x74, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x43, 0x69, - 0x70, 0x68, 0x65, 0x72, 0x53, 0x75, 0x69, 0x74, 0x65, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x4d, 0x69, - 0x6e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, - 0x4d, 0x69, 0x6e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x53, 0x0a, 0x23, 0x44, 0x65, - 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x50, 0x72, 0x65, 0x66, 0x65, 0x72, 0x53, + 0x67, 0x22, 0xb7, 0x03, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x1e, 0x0a, 0x0a, + 0x44, 0x61, 0x74, 0x61, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0a, 0x44, 0x61, 0x74, 0x61, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x12, 0x2c, 0x0a, 0x11, + 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x44, 0x61, 0x74, 0x61, 0x63, 0x65, 0x6e, 0x74, 0x65, + 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, + 0x44, 0x61, 0x74, 0x61, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x12, 0x1a, 0x0a, 0x08, 0x4e, 0x6f, + 0x64, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x4e, 0x6f, + 0x64, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, + 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x53, 0x65, 0x67, + 0x6d, 0x65, 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x50, 0x61, 0x72, 0x74, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x50, 0x61, 0x72, + 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x37, 0x0a, 0x03, 0x41, 0x43, 0x4c, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, + 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, + 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x41, 0x43, 0x4c, 0x52, 0x03, 0x41, 0x43, 0x4c, 0x12, + 0x4f, 0x0a, 0x0b, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, + 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, + 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x63, 0x72, + 0x79, 0x70, 0x74, 0x52, 0x0b, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, + 0x12, 0x40, 0x0a, 0x06, 0x47, 0x6f, 0x73, 0x73, 0x69, 0x70, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x28, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, + 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x2e, 0x47, 0x6f, 0x73, 0x73, 0x69, 0x70, 0x52, 0x06, 0x47, 0x6f, 0x73, 0x73, + 0x69, 0x70, 0x12, 0x37, 0x0a, 0x03, 0x54, 0x4c, 0x53, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x25, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, + 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x2e, 0x54, 0x4c, 0x53, 0x52, 0x03, 0x54, 0x4c, 0x53, 0x22, 0x80, 0x01, 0x0a, 0x06, + 0x47, 0x6f, 0x73, 0x73, 0x69, 0x70, 0x12, 0x52, 0x0a, 0x0a, 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x68, 0x61, 0x73, + 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, + 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x47, 0x6f, + 0x73, 0x73, 0x69, 0x70, 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, + 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x22, 0x0a, 0x0c, 0x52, 0x65, + 0x74, 0x72, 0x79, 0x4a, 0x6f, 0x69, 0x6e, 0x4c, 0x41, 0x4e, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, + 0x52, 0x0c, 0x52, 0x65, 0x74, 0x72, 0x79, 0x4a, 0x6f, 0x69, 0x6e, 0x4c, 0x41, 0x4e, 0x22, 0x74, + 0x0a, 0x10, 0x47, 0x6f, 0x73, 0x73, 0x69, 0x70, 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x4b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x4b, 0x65, 0x79, 0x12, 0x26, 0x0a, 0x0e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x49, 0x6e, + 0x63, 0x6f, 0x6d, 0x69, 0x6e, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x56, 0x65, + 0x72, 0x69, 0x66, 0x79, 0x49, 0x6e, 0x63, 0x6f, 0x6d, 0x69, 0x6e, 0x67, 0x12, 0x26, 0x0a, 0x0e, + 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x4f, 0x75, 0x74, 0x67, 0x6f, 0x69, 0x6e, 0x67, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x4f, 0x75, 0x74, 0x67, + 0x6f, 0x69, 0x6e, 0x67, 0x22, 0xfa, 0x01, 0x0a, 0x03, 0x54, 0x4c, 0x53, 0x12, 0x26, 0x0a, 0x0e, + 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x4f, 0x75, 0x74, 0x67, 0x6f, 0x69, 0x6e, 0x67, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x4f, 0x75, 0x74, 0x67, + 0x6f, 0x69, 0x6e, 0x67, 0x12, 0x32, 0x0a, 0x14, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x53, 0x65, + 0x72, 0x76, 0x65, 0x72, 0x48, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x14, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x48, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x43, 0x69, 0x70, 0x68, + 0x65, 0x72, 0x53, 0x75, 0x69, 0x74, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, + 0x43, 0x69, 0x70, 0x68, 0x65, 0x72, 0x53, 0x75, 0x69, 0x74, 0x65, 0x73, 0x12, 0x1e, 0x0a, 0x0a, + 0x4d, 0x69, 0x6e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0a, 0x4d, 0x69, 0x6e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x53, 0x0a, 0x23, + 0x44, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x50, 0x72, 0x65, 0x66, 0x65, + 0x72, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x43, 0x69, 0x70, 0x68, 0x65, 0x72, 0x53, 0x75, 0x69, + 0x74, 0x65, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x42, 0x02, 0x18, 0x01, 0x52, 0x22, 0x44, + 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x50, 0x72, 0x65, 0x66, 0x65, 0x72, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x43, 0x69, 0x70, 0x68, 0x65, 0x72, 0x53, 0x75, 0x69, 0x74, 0x65, - 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x42, 0x02, 0x18, 0x01, 0x52, 0x22, 0x44, 0x65, 0x70, - 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x50, 0x72, 0x65, 0x66, 0x65, 0x72, 0x53, 0x65, 0x72, - 0x76, 0x65, 0x72, 0x43, 0x69, 0x70, 0x68, 0x65, 0x72, 0x53, 0x75, 0x69, 0x74, 0x65, 0x73, 0x22, - 0xd5, 0x03, 0x0a, 0x03, 0x41, 0x43, 0x4c, 0x12, 0x18, 0x0a, 0x07, 0x45, 0x6e, 0x61, 0x62, 0x6c, - 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, - 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x54, 0x4c, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x54, 0x4c, 0x12, - 0x18, 0x0a, 0x07, 0x52, 0x6f, 0x6c, 0x65, 0x54, 0x54, 0x4c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x07, 0x52, 0x6f, 0x6c, 0x65, 0x54, 0x54, 0x4c, 0x12, 0x1a, 0x0a, 0x08, 0x54, 0x6f, 0x6b, - 0x65, 0x6e, 0x54, 0x54, 0x4c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x54, 0x6f, 0x6b, - 0x65, 0x6e, 0x54, 0x54, 0x4c, 0x12, 0x1e, 0x0a, 0x0a, 0x44, 0x6f, 0x77, 0x6e, 0x50, 0x6f, 0x6c, - 0x69, 0x63, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x44, 0x6f, 0x77, 0x6e, 0x50, - 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x24, 0x0a, 0x0d, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, - 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x44, 0x65, - 0x66, 0x61, 0x75, 0x6c, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x30, 0x0a, 0x13, 0x45, - 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x4b, 0x65, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x6f, 0x6c, 0x69, - 0x63, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, - 0x4b, 0x65, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x43, 0x0a, - 0x06, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, + 0x73, 0x22, 0xd5, 0x03, 0x0a, 0x03, 0x41, 0x43, 0x4c, 0x12, 0x18, 0x0a, 0x07, 0x45, 0x6e, 0x61, + 0x62, 0x6c, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x45, 0x6e, 0x61, 0x62, + 0x6c, 0x65, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x54, 0x4c, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x54, + 0x4c, 0x12, 0x18, 0x0a, 0x07, 0x52, 0x6f, 0x6c, 0x65, 0x54, 0x54, 0x4c, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x07, 0x52, 0x6f, 0x6c, 0x65, 0x54, 0x54, 0x4c, 0x12, 0x1a, 0x0a, 0x08, 0x54, + 0x6f, 0x6b, 0x65, 0x6e, 0x54, 0x54, 0x4c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x54, + 0x6f, 0x6b, 0x65, 0x6e, 0x54, 0x54, 0x4c, 0x12, 0x1e, 0x0a, 0x0a, 0x44, 0x6f, 0x77, 0x6e, 0x50, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x44, 0x6f, 0x77, + 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x24, 0x0a, 0x0d, 0x44, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, + 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x30, 0x0a, + 0x13, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x4b, 0x65, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x45, 0x6e, 0x61, 0x62, + 0x6c, 0x65, 0x4b, 0x65, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, + 0x43, 0x0a, 0x06, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x2b, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, + 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x2e, 0x41, 0x43, 0x4c, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x52, 0x06, 0x54, 0x6f, + 0x6b, 0x65, 0x6e, 0x73, 0x12, 0x39, 0x0a, 0x16, 0x44, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, + 0x65, 0x64, 0x5f, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x54, 0x54, 0x4c, 0x18, 0x09, + 0x20, 0x01, 0x28, 0x09, 0x42, 0x02, 0x18, 0x01, 0x52, 0x15, 0x44, 0x65, 0x70, 0x72, 0x65, 0x63, + 0x61, 0x74, 0x65, 0x64, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x54, 0x54, 0x4c, 0x12, + 0x36, 0x0a, 0x16, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x50, 0x65, + 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x16, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x50, 0x65, 0x72, 0x73, + 0x69, 0x73, 0x74, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x30, 0x0a, 0x13, 0x4d, 0x53, 0x50, 0x44, 0x69, + 0x73, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x6f, 0x6f, 0x74, 0x73, 0x74, 0x72, 0x61, 0x70, 0x18, 0x0b, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x4d, 0x53, 0x50, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, + 0x42, 0x6f, 0x6f, 0x74, 0x73, 0x74, 0x72, 0x61, 0x70, 0x22, 0xa4, 0x02, 0x0a, 0x09, 0x41, 0x43, + 0x4c, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x12, 0x2c, 0x0a, 0x11, 0x49, 0x6e, 0x69, 0x74, 0x69, + 0x61, 0x6c, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x11, 0x49, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x4d, 0x61, 0x6e, 0x61, 0x67, + 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x52, 0x65, 0x70, 0x6c, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x0a, 0x0d, 0x41, 0x67, 0x65, 0x6e, 0x74, + 0x52, 0x65, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, + 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x12, 0x18, 0x0a, + 0x07, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, + 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x41, 0x67, 0x65, 0x6e, 0x74, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x71, 0x0a, + 0x16, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x50, + 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x2e, 0x41, 0x43, 0x4c, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x52, 0x06, 0x54, 0x6f, 0x6b, 0x65, - 0x6e, 0x73, 0x12, 0x39, 0x0a, 0x16, 0x44, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, - 0x5f, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x54, 0x54, 0x4c, 0x18, 0x09, 0x20, 0x01, - 0x28, 0x09, 0x42, 0x02, 0x18, 0x01, 0x52, 0x15, 0x44, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, - 0x65, 0x64, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x54, 0x54, 0x4c, 0x12, 0x36, 0x0a, - 0x16, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x50, 0x65, 0x72, 0x73, - 0x69, 0x73, 0x74, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x16, 0x45, - 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x50, 0x65, 0x72, 0x73, 0x69, 0x73, - 0x74, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x30, 0x0a, 0x13, 0x4d, 0x53, 0x50, 0x44, 0x69, 0x73, 0x61, - 0x62, 0x6c, 0x65, 0x42, 0x6f, 0x6f, 0x74, 0x73, 0x74, 0x72, 0x61, 0x70, 0x18, 0x0b, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x13, 0x4d, 0x53, 0x50, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x6f, - 0x6f, 0x74, 0x73, 0x74, 0x72, 0x61, 0x70, 0x22, 0xa4, 0x02, 0x0a, 0x09, 0x41, 0x43, 0x4c, 0x54, - 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x12, 0x2c, 0x0a, 0x11, 0x49, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, - 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x11, 0x49, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, - 0x65, 0x6e, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x0a, 0x0d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, - 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x41, 0x67, - 0x65, 0x6e, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x12, 0x18, 0x0a, 0x07, 0x44, - 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x44, 0x65, - 0x66, 0x61, 0x75, 0x6c, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x71, 0x0a, 0x16, 0x4d, - 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x50, 0x72, 0x6f, - 0x76, 0x69, 0x64, 0x65, 0x72, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x68, 0x61, - 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, - 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x41, - 0x43, 0x4c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, - 0x72, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x16, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x22, 0x55, - 0x0a, 0x17, 0x41, 0x43, 0x4c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x50, 0x72, 0x6f, 0x76, - 0x69, 0x64, 0x65, 0x72, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x41, 0x63, 0x63, - 0x65, 0x73, 0x73, 0x6f, 0x72, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x41, - 0x63, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x49, 0x44, 0x12, 0x1a, 0x0a, 0x08, 0x53, 0x65, 0x63, - 0x72, 0x65, 0x74, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x53, 0x65, 0x63, - 0x72, 0x65, 0x74, 0x49, 0x44, 0x22, 0x69, 0x0a, 0x0b, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x63, - 0x72, 0x79, 0x70, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x54, 0x4c, 0x53, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x03, 0x54, 0x4c, 0x53, 0x12, 0x16, 0x0a, 0x06, 0x44, 0x4e, 0x53, 0x53, 0x41, 0x4e, - 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x44, 0x4e, 0x53, 0x53, 0x41, 0x4e, 0x12, 0x14, - 0x0a, 0x05, 0x49, 0x50, 0x53, 0x41, 0x4e, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x49, - 0x50, 0x53, 0x41, 0x4e, 0x12, 0x1a, 0x0a, 0x08, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x54, 0x4c, 0x53, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x54, 0x4c, 0x53, - 0x42, 0x83, 0x02, 0x0a, 0x24, 0x63, 0x6f, 0x6d, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, - 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, - 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x42, 0x0b, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x2a, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, - 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2f, 0x63, - 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x70, 0x62, 0x63, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0xa2, 0x02, 0x04, 0x48, 0x43, 0x49, 0x43, 0xaa, 0x02, 0x20, 0x48, 0x61, - 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x49, - 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0xca, 0x02, - 0x20, 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x5c, 0x43, 0x6f, 0x6e, 0x73, 0x75, - 0x6c, 0x5c, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5c, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0xe2, 0x02, 0x2c, 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x5c, 0x43, 0x6f, - 0x6e, 0x73, 0x75, 0x6c, 0x5c, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5c, 0x43, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, - 0xea, 0x02, 0x23, 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x3a, 0x3a, 0x43, 0x6f, - 0x6e, 0x73, 0x75, 0x6c, 0x3a, 0x3a, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x3a, 0x3a, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x2e, 0x41, 0x43, 0x4c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x50, 0x72, 0x6f, 0x76, 0x69, + 0x64, 0x65, 0x72, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x16, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, + 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, + 0x22, 0x55, 0x0a, 0x17, 0x41, 0x43, 0x4c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x50, 0x72, + 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x41, + 0x63, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0a, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x49, 0x44, 0x12, 0x1a, 0x0a, 0x08, 0x53, + 0x65, 0x63, 0x72, 0x65, 0x74, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x53, + 0x65, 0x63, 0x72, 0x65, 0x74, 0x49, 0x44, 0x22, 0x69, 0x0a, 0x0b, 0x41, 0x75, 0x74, 0x6f, 0x45, + 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x54, 0x4c, 0x53, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x03, 0x54, 0x4c, 0x53, 0x12, 0x16, 0x0a, 0x06, 0x44, 0x4e, 0x53, 0x53, + 0x41, 0x4e, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x44, 0x4e, 0x53, 0x53, 0x41, 0x4e, + 0x12, 0x14, 0x0a, 0x05, 0x49, 0x50, 0x53, 0x41, 0x4e, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x05, 0x49, 0x50, 0x53, 0x41, 0x4e, 0x12, 0x1a, 0x0a, 0x08, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x54, + 0x4c, 0x53, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x54, + 0x4c, 0x53, 0x42, 0x8b, 0x02, 0x0a, 0x24, 0x63, 0x6f, 0x6d, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, + 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, + 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x42, 0x0b, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x32, 0x67, 0x69, 0x74, 0x68, + 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, + 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x70, 0x72, + 0x69, 0x76, 0x61, 0x74, 0x65, 0x2f, 0x70, 0x62, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0xa2, 0x02, + 0x04, 0x48, 0x43, 0x49, 0x43, 0xaa, 0x02, 0x20, 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, + 0x70, 0x2e, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, + 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0xca, 0x02, 0x20, 0x48, 0x61, 0x73, 0x68, 0x69, + 0x63, 0x6f, 0x72, 0x70, 0x5c, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x5c, 0x49, 0x6e, 0x74, 0x65, + 0x72, 0x6e, 0x61, 0x6c, 0x5c, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0xe2, 0x02, 0x2c, 0x48, 0x61, + 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x5c, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x5c, 0x49, + 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5c, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5c, 0x47, + 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x23, 0x48, 0x61, 0x73, + 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x3a, 0x3a, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x3a, 0x3a, + 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x3a, 0x3a, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( - file_proto_pbconfig_config_proto_rawDescOnce sync.Once - file_proto_pbconfig_config_proto_rawDescData = file_proto_pbconfig_config_proto_rawDesc + file_private_pbconfig_config_proto_rawDescOnce sync.Once + file_private_pbconfig_config_proto_rawDescData = file_private_pbconfig_config_proto_rawDesc ) -func file_proto_pbconfig_config_proto_rawDescGZIP() []byte { - file_proto_pbconfig_config_proto_rawDescOnce.Do(func() { - file_proto_pbconfig_config_proto_rawDescData = protoimpl.X.CompressGZIP(file_proto_pbconfig_config_proto_rawDescData) +func file_private_pbconfig_config_proto_rawDescGZIP() []byte { + file_private_pbconfig_config_proto_rawDescOnce.Do(func() { + file_private_pbconfig_config_proto_rawDescData = protoimpl.X.CompressGZIP(file_private_pbconfig_config_proto_rawDescData) }) - return file_proto_pbconfig_config_proto_rawDescData + return file_private_pbconfig_config_proto_rawDescData } -var file_proto_pbconfig_config_proto_msgTypes = make([]protoimpl.MessageInfo, 8) -var file_proto_pbconfig_config_proto_goTypes = []interface{}{ +var file_private_pbconfig_config_proto_msgTypes = make([]protoimpl.MessageInfo, 8) +var file_private_pbconfig_config_proto_goTypes = []interface{}{ (*Config)(nil), // 0: hashicorp.consul.internal.config.Config (*Gossip)(nil), // 1: hashicorp.consul.internal.config.Gossip (*GossipEncryption)(nil), // 2: hashicorp.consul.internal.config.GossipEncryption @@ -846,7 +847,7 @@ var file_proto_pbconfig_config_proto_goTypes = []interface{}{ (*ACLServiceProviderToken)(nil), // 6: hashicorp.consul.internal.config.ACLServiceProviderToken (*AutoEncrypt)(nil), // 7: hashicorp.consul.internal.config.AutoEncrypt } -var file_proto_pbconfig_config_proto_depIdxs = []int32{ +var file_private_pbconfig_config_proto_depIdxs = []int32{ 4, // 0: hashicorp.consul.internal.config.Config.ACL:type_name -> hashicorp.consul.internal.config.ACL 7, // 1: hashicorp.consul.internal.config.Config.AutoEncrypt:type_name -> hashicorp.consul.internal.config.AutoEncrypt 1, // 2: hashicorp.consul.internal.config.Config.Gossip:type_name -> hashicorp.consul.internal.config.Gossip @@ -861,13 +862,13 @@ var file_proto_pbconfig_config_proto_depIdxs = []int32{ 0, // [0:7] is the sub-list for field type_name } -func init() { file_proto_pbconfig_config_proto_init() } -func file_proto_pbconfig_config_proto_init() { - if File_proto_pbconfig_config_proto != nil { +func init() { file_private_pbconfig_config_proto_init() } +func file_private_pbconfig_config_proto_init() { + if File_private_pbconfig_config_proto != nil { return } if !protoimpl.UnsafeEnabled { - file_proto_pbconfig_config_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + file_private_pbconfig_config_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Config); i { case 0: return &v.state @@ -879,7 +880,7 @@ func file_proto_pbconfig_config_proto_init() { return nil } } - file_proto_pbconfig_config_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + file_private_pbconfig_config_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Gossip); i { case 0: return &v.state @@ -891,7 +892,7 @@ func file_proto_pbconfig_config_proto_init() { return nil } } - file_proto_pbconfig_config_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + file_private_pbconfig_config_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GossipEncryption); i { case 0: return &v.state @@ -903,7 +904,7 @@ func file_proto_pbconfig_config_proto_init() { return nil } } - file_proto_pbconfig_config_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + file_private_pbconfig_config_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*TLS); i { case 0: return &v.state @@ -915,7 +916,7 @@ func file_proto_pbconfig_config_proto_init() { return nil } } - file_proto_pbconfig_config_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + file_private_pbconfig_config_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ACL); i { case 0: return &v.state @@ -927,7 +928,7 @@ func file_proto_pbconfig_config_proto_init() { return nil } } - file_proto_pbconfig_config_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + file_private_pbconfig_config_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ACLTokens); i { case 0: return &v.state @@ -939,7 +940,7 @@ func file_proto_pbconfig_config_proto_init() { return nil } } - file_proto_pbconfig_config_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { + file_private_pbconfig_config_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ACLServiceProviderToken); i { case 0: return &v.state @@ -951,7 +952,7 @@ func file_proto_pbconfig_config_proto_init() { return nil } } - file_proto_pbconfig_config_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { + file_private_pbconfig_config_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*AutoEncrypt); i { case 0: return &v.state @@ -968,18 +969,18 @@ func file_proto_pbconfig_config_proto_init() { out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_proto_pbconfig_config_proto_rawDesc, + RawDescriptor: file_private_pbconfig_config_proto_rawDesc, NumEnums: 0, NumMessages: 8, NumExtensions: 0, NumServices: 0, }, - GoTypes: file_proto_pbconfig_config_proto_goTypes, - DependencyIndexes: file_proto_pbconfig_config_proto_depIdxs, - MessageInfos: file_proto_pbconfig_config_proto_msgTypes, + GoTypes: file_private_pbconfig_config_proto_goTypes, + DependencyIndexes: file_private_pbconfig_config_proto_depIdxs, + MessageInfos: file_private_pbconfig_config_proto_msgTypes, }.Build() - File_proto_pbconfig_config_proto = out.File - file_proto_pbconfig_config_proto_rawDesc = nil - file_proto_pbconfig_config_proto_goTypes = nil - file_proto_pbconfig_config_proto_depIdxs = nil + File_private_pbconfig_config_proto = out.File + file_private_pbconfig_config_proto_rawDesc = nil + file_private_pbconfig_config_proto_goTypes = nil + file_private_pbconfig_config_proto_depIdxs = nil } diff --git a/proto/pbconfig/config.proto b/proto/private/pbconfig/config.proto similarity index 100% rename from proto/pbconfig/config.proto rename to proto/private/pbconfig/config.proto diff --git a/proto/pbconfigentry/config_entry.gen.go b/proto/private/pbconfigentry/config_entry.gen.go similarity index 100% rename from proto/pbconfigentry/config_entry.gen.go rename to proto/private/pbconfigentry/config_entry.gen.go diff --git a/proto/pbconfigentry/config_entry.go b/proto/private/pbconfigentry/config_entry.go similarity index 99% rename from proto/pbconfigentry/config_entry.go rename to proto/private/pbconfigentry/config_entry.go index 4b36134794d..49eccbe6bcf 100644 --- a/proto/pbconfigentry/config_entry.go +++ b/proto/private/pbconfigentry/config_entry.go @@ -8,7 +8,7 @@ import ( "github.com/hashicorp/consul/acl" "github.com/hashicorp/consul/agent/structs" - "github.com/hashicorp/consul/proto/pbcommon" + "github.com/hashicorp/consul/proto/private/pbcommon" "github.com/hashicorp/consul/types" ) diff --git a/proto/pbconfigentry/config_entry.pb.binary.go b/proto/private/pbconfigentry/config_entry.pb.binary.go similarity index 99% rename from proto/pbconfigentry/config_entry.pb.binary.go rename to proto/private/pbconfigentry/config_entry.pb.binary.go index 81370bcb0ae..1916e6df0a8 100644 --- a/proto/pbconfigentry/config_entry.pb.binary.go +++ b/proto/private/pbconfigentry/config_entry.pb.binary.go @@ -1,5 +1,5 @@ // Code generated by protoc-gen-go-binary. DO NOT EDIT. -// source: proto/pbconfigentry/config_entry.proto +// source: private/pbconfigentry/config_entry.proto package pbconfigentry diff --git a/proto/pbconfigentry/config_entry.pb.go b/proto/private/pbconfigentry/config_entry.pb.go similarity index 65% rename from proto/pbconfigentry/config_entry.pb.go rename to proto/private/pbconfigentry/config_entry.pb.go index 4d9d292d7d4..1d0f1b5a7ee 100644 --- a/proto/pbconfigentry/config_entry.pb.go +++ b/proto/private/pbconfigentry/config_entry.pb.go @@ -2,12 +2,12 @@ // versions: // protoc-gen-go v1.28.1 // protoc (unknown) -// source: proto/pbconfigentry/config_entry.proto +// source: private/pbconfigentry/config_entry.proto package pbconfigentry import ( - pbcommon "github.com/hashicorp/consul/proto/pbcommon" + pbcommon "github.com/hashicorp/consul/proto/private/pbcommon" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" durationpb "google.golang.org/protobuf/types/known/durationpb" @@ -80,11 +80,11 @@ func (x Kind) String() string { } func (Kind) Descriptor() protoreflect.EnumDescriptor { - return file_proto_pbconfigentry_config_entry_proto_enumTypes[0].Descriptor() + return file_private_pbconfigentry_config_entry_proto_enumTypes[0].Descriptor() } func (Kind) Type() protoreflect.EnumType { - return &file_proto_pbconfigentry_config_entry_proto_enumTypes[0] + return &file_private_pbconfigentry_config_entry_proto_enumTypes[0] } func (x Kind) Number() protoreflect.EnumNumber { @@ -93,7 +93,7 @@ func (x Kind) Number() protoreflect.EnumNumber { // Deprecated: Use Kind.Descriptor instead. func (Kind) EnumDescriptor() ([]byte, []int) { - return file_proto_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{0} + return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{0} } type IntentionAction int32 @@ -126,11 +126,11 @@ func (x IntentionAction) String() string { } func (IntentionAction) Descriptor() protoreflect.EnumDescriptor { - return file_proto_pbconfigentry_config_entry_proto_enumTypes[1].Descriptor() + return file_private_pbconfigentry_config_entry_proto_enumTypes[1].Descriptor() } func (IntentionAction) Type() protoreflect.EnumType { - return &file_proto_pbconfigentry_config_entry_proto_enumTypes[1] + return &file_private_pbconfigentry_config_entry_proto_enumTypes[1] } func (x IntentionAction) Number() protoreflect.EnumNumber { @@ -139,7 +139,7 @@ func (x IntentionAction) Number() protoreflect.EnumNumber { // Deprecated: Use IntentionAction.Descriptor instead. func (IntentionAction) EnumDescriptor() ([]byte, []int) { - return file_proto_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{1} + return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{1} } type IntentionSourceType int32 @@ -169,11 +169,11 @@ func (x IntentionSourceType) String() string { } func (IntentionSourceType) Descriptor() protoreflect.EnumDescriptor { - return file_proto_pbconfigentry_config_entry_proto_enumTypes[2].Descriptor() + return file_private_pbconfigentry_config_entry_proto_enumTypes[2].Descriptor() } func (IntentionSourceType) Type() protoreflect.EnumType { - return &file_proto_pbconfigentry_config_entry_proto_enumTypes[2] + return &file_private_pbconfigentry_config_entry_proto_enumTypes[2] } func (x IntentionSourceType) Number() protoreflect.EnumNumber { @@ -182,7 +182,7 @@ func (x IntentionSourceType) Number() protoreflect.EnumNumber { // Deprecated: Use IntentionSourceType.Descriptor instead. func (IntentionSourceType) EnumDescriptor() ([]byte, []int) { - return file_proto_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{2} + return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{2} } type ProxyMode int32 @@ -218,11 +218,11 @@ func (x ProxyMode) String() string { } func (ProxyMode) Descriptor() protoreflect.EnumDescriptor { - return file_proto_pbconfigentry_config_entry_proto_enumTypes[3].Descriptor() + return file_private_pbconfigentry_config_entry_proto_enumTypes[3].Descriptor() } func (ProxyMode) Type() protoreflect.EnumType { - return &file_proto_pbconfigentry_config_entry_proto_enumTypes[3] + return &file_private_pbconfigentry_config_entry_proto_enumTypes[3] } func (x ProxyMode) Number() protoreflect.EnumNumber { @@ -231,7 +231,7 @@ func (x ProxyMode) Number() protoreflect.EnumNumber { // Deprecated: Use ProxyMode.Descriptor instead. func (ProxyMode) EnumDescriptor() ([]byte, []int) { - return file_proto_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{3} + return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{3} } type MeshGatewayMode int32 @@ -270,11 +270,11 @@ func (x MeshGatewayMode) String() string { } func (MeshGatewayMode) Descriptor() protoreflect.EnumDescriptor { - return file_proto_pbconfigentry_config_entry_proto_enumTypes[4].Descriptor() + return file_private_pbconfigentry_config_entry_proto_enumTypes[4].Descriptor() } func (MeshGatewayMode) Type() protoreflect.EnumType { - return &file_proto_pbconfigentry_config_entry_proto_enumTypes[4] + return &file_private_pbconfigentry_config_entry_proto_enumTypes[4] } func (x MeshGatewayMode) Number() protoreflect.EnumNumber { @@ -283,7 +283,7 @@ func (x MeshGatewayMode) Number() protoreflect.EnumNumber { // Deprecated: Use MeshGatewayMode.Descriptor instead. func (MeshGatewayMode) EnumDescriptor() ([]byte, []int) { - return file_proto_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{4} + return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{4} } type APIGatewayListenerProtocol int32 @@ -316,11 +316,11 @@ func (x APIGatewayListenerProtocol) String() string { } func (APIGatewayListenerProtocol) Descriptor() protoreflect.EnumDescriptor { - return file_proto_pbconfigentry_config_entry_proto_enumTypes[5].Descriptor() + return file_private_pbconfigentry_config_entry_proto_enumTypes[5].Descriptor() } func (APIGatewayListenerProtocol) Type() protoreflect.EnumType { - return &file_proto_pbconfigentry_config_entry_proto_enumTypes[5] + return &file_private_pbconfigentry_config_entry_proto_enumTypes[5] } func (x APIGatewayListenerProtocol) Number() protoreflect.EnumNumber { @@ -329,7 +329,7 @@ func (x APIGatewayListenerProtocol) Number() protoreflect.EnumNumber { // Deprecated: Use APIGatewayListenerProtocol.Descriptor instead. func (APIGatewayListenerProtocol) EnumDescriptor() ([]byte, []int) { - return file_proto_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{5} + return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{5} } type HTTPMatchMethod int32 @@ -386,11 +386,11 @@ func (x HTTPMatchMethod) String() string { } func (HTTPMatchMethod) Descriptor() protoreflect.EnumDescriptor { - return file_proto_pbconfigentry_config_entry_proto_enumTypes[6].Descriptor() + return file_private_pbconfigentry_config_entry_proto_enumTypes[6].Descriptor() } func (HTTPMatchMethod) Type() protoreflect.EnumType { - return &file_proto_pbconfigentry_config_entry_proto_enumTypes[6] + return &file_private_pbconfigentry_config_entry_proto_enumTypes[6] } func (x HTTPMatchMethod) Number() protoreflect.EnumNumber { @@ -399,7 +399,7 @@ func (x HTTPMatchMethod) Number() protoreflect.EnumNumber { // Deprecated: Use HTTPMatchMethod.Descriptor instead. func (HTTPMatchMethod) EnumDescriptor() ([]byte, []int) { - return file_proto_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{6} + return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{6} } type HTTPHeaderMatchType int32 @@ -441,11 +441,11 @@ func (x HTTPHeaderMatchType) String() string { } func (HTTPHeaderMatchType) Descriptor() protoreflect.EnumDescriptor { - return file_proto_pbconfigentry_config_entry_proto_enumTypes[7].Descriptor() + return file_private_pbconfigentry_config_entry_proto_enumTypes[7].Descriptor() } func (HTTPHeaderMatchType) Type() protoreflect.EnumType { - return &file_proto_pbconfigentry_config_entry_proto_enumTypes[7] + return &file_private_pbconfigentry_config_entry_proto_enumTypes[7] } func (x HTTPHeaderMatchType) Number() protoreflect.EnumNumber { @@ -454,7 +454,7 @@ func (x HTTPHeaderMatchType) Number() protoreflect.EnumNumber { // Deprecated: Use HTTPHeaderMatchType.Descriptor instead. func (HTTPHeaderMatchType) EnumDescriptor() ([]byte, []int) { - return file_proto_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{7} + return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{7} } type HTTPPathMatchType int32 @@ -490,11 +490,11 @@ func (x HTTPPathMatchType) String() string { } func (HTTPPathMatchType) Descriptor() protoreflect.EnumDescriptor { - return file_proto_pbconfigentry_config_entry_proto_enumTypes[8].Descriptor() + return file_private_pbconfigentry_config_entry_proto_enumTypes[8].Descriptor() } func (HTTPPathMatchType) Type() protoreflect.EnumType { - return &file_proto_pbconfigentry_config_entry_proto_enumTypes[8] + return &file_private_pbconfigentry_config_entry_proto_enumTypes[8] } func (x HTTPPathMatchType) Number() protoreflect.EnumNumber { @@ -503,7 +503,7 @@ func (x HTTPPathMatchType) Number() protoreflect.EnumNumber { // Deprecated: Use HTTPPathMatchType.Descriptor instead. func (HTTPPathMatchType) EnumDescriptor() ([]byte, []int) { - return file_proto_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{8} + return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{8} } type HTTPQueryMatchType int32 @@ -539,11 +539,11 @@ func (x HTTPQueryMatchType) String() string { } func (HTTPQueryMatchType) Descriptor() protoreflect.EnumDescriptor { - return file_proto_pbconfigentry_config_entry_proto_enumTypes[9].Descriptor() + return file_private_pbconfigentry_config_entry_proto_enumTypes[9].Descriptor() } func (HTTPQueryMatchType) Type() protoreflect.EnumType { - return &file_proto_pbconfigentry_config_entry_proto_enumTypes[9] + return &file_private_pbconfigentry_config_entry_proto_enumTypes[9] } func (x HTTPQueryMatchType) Number() protoreflect.EnumNumber { @@ -552,7 +552,7 @@ func (x HTTPQueryMatchType) Number() protoreflect.EnumNumber { // Deprecated: Use HTTPQueryMatchType.Descriptor instead. func (HTTPQueryMatchType) EnumDescriptor() ([]byte, []int) { - return file_proto_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{9} + return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{9} } type ConfigEntry struct { @@ -582,7 +582,7 @@ type ConfigEntry struct { func (x *ConfigEntry) Reset() { *x = ConfigEntry{} if protoimpl.UnsafeEnabled { - mi := &file_proto_pbconfigentry_config_entry_proto_msgTypes[0] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[0] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -595,7 +595,7 @@ func (x *ConfigEntry) String() string { func (*ConfigEntry) ProtoMessage() {} func (x *ConfigEntry) ProtoReflect() protoreflect.Message { - mi := &file_proto_pbconfigentry_config_entry_proto_msgTypes[0] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[0] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -608,7 +608,7 @@ func (x *ConfigEntry) ProtoReflect() protoreflect.Message { // Deprecated: Use ConfigEntry.ProtoReflect.Descriptor instead. func (*ConfigEntry) Descriptor() ([]byte, []int) { - return file_proto_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{0} + return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{0} } func (x *ConfigEntry) GetKind() Kind { @@ -801,7 +801,7 @@ type MeshConfig struct { func (x *MeshConfig) Reset() { *x = MeshConfig{} if protoimpl.UnsafeEnabled { - mi := &file_proto_pbconfigentry_config_entry_proto_msgTypes[1] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[1] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -814,7 +814,7 @@ func (x *MeshConfig) String() string { func (*MeshConfig) ProtoMessage() {} func (x *MeshConfig) ProtoReflect() protoreflect.Message { - mi := &file_proto_pbconfigentry_config_entry_proto_msgTypes[1] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[1] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -827,7 +827,7 @@ func (x *MeshConfig) ProtoReflect() protoreflect.Message { // Deprecated: Use MeshConfig.ProtoReflect.Descriptor instead. func (*MeshConfig) Descriptor() ([]byte, []int) { - return file_proto_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{1} + return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{1} } func (x *MeshConfig) GetTransparentProxy() *TransparentProxyMeshConfig { @@ -881,7 +881,7 @@ type TransparentProxyMeshConfig struct { func (x *TransparentProxyMeshConfig) Reset() { *x = TransparentProxyMeshConfig{} if protoimpl.UnsafeEnabled { - mi := &file_proto_pbconfigentry_config_entry_proto_msgTypes[2] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[2] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -894,7 +894,7 @@ func (x *TransparentProxyMeshConfig) String() string { func (*TransparentProxyMeshConfig) ProtoMessage() {} func (x *TransparentProxyMeshConfig) ProtoReflect() protoreflect.Message { - mi := &file_proto_pbconfigentry_config_entry_proto_msgTypes[2] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[2] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -907,7 +907,7 @@ func (x *TransparentProxyMeshConfig) ProtoReflect() protoreflect.Message { // Deprecated: Use TransparentProxyMeshConfig.ProtoReflect.Descriptor instead. func (*TransparentProxyMeshConfig) Descriptor() ([]byte, []int) { - return file_proto_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{2} + return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{2} } func (x *TransparentProxyMeshConfig) GetMeshDestinationsOnly() bool { @@ -934,7 +934,7 @@ type MeshTLSConfig struct { func (x *MeshTLSConfig) Reset() { *x = MeshTLSConfig{} if protoimpl.UnsafeEnabled { - mi := &file_proto_pbconfigentry_config_entry_proto_msgTypes[3] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[3] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -947,7 +947,7 @@ func (x *MeshTLSConfig) String() string { func (*MeshTLSConfig) ProtoMessage() {} func (x *MeshTLSConfig) ProtoReflect() protoreflect.Message { - mi := &file_proto_pbconfigentry_config_entry_proto_msgTypes[3] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[3] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -960,7 +960,7 @@ func (x *MeshTLSConfig) ProtoReflect() protoreflect.Message { // Deprecated: Use MeshTLSConfig.ProtoReflect.Descriptor instead. func (*MeshTLSConfig) Descriptor() ([]byte, []int) { - return file_proto_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{3} + return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{3} } func (x *MeshTLSConfig) GetIncoming() *MeshDirectionalTLSConfig { @@ -998,7 +998,7 @@ type MeshDirectionalTLSConfig struct { func (x *MeshDirectionalTLSConfig) Reset() { *x = MeshDirectionalTLSConfig{} if protoimpl.UnsafeEnabled { - mi := &file_proto_pbconfigentry_config_entry_proto_msgTypes[4] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[4] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1011,7 +1011,7 @@ func (x *MeshDirectionalTLSConfig) String() string { func (*MeshDirectionalTLSConfig) ProtoMessage() {} func (x *MeshDirectionalTLSConfig) ProtoReflect() protoreflect.Message { - mi := &file_proto_pbconfigentry_config_entry_proto_msgTypes[4] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[4] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1024,7 +1024,7 @@ func (x *MeshDirectionalTLSConfig) ProtoReflect() protoreflect.Message { // Deprecated: Use MeshDirectionalTLSConfig.ProtoReflect.Descriptor instead. func (*MeshDirectionalTLSConfig) Descriptor() ([]byte, []int) { - return file_proto_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{4} + return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{4} } func (x *MeshDirectionalTLSConfig) GetTLSMinVersion() string { @@ -1064,7 +1064,7 @@ type MeshHTTPConfig struct { func (x *MeshHTTPConfig) Reset() { *x = MeshHTTPConfig{} if protoimpl.UnsafeEnabled { - mi := &file_proto_pbconfigentry_config_entry_proto_msgTypes[5] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1077,7 +1077,7 @@ func (x *MeshHTTPConfig) String() string { func (*MeshHTTPConfig) ProtoMessage() {} func (x *MeshHTTPConfig) ProtoReflect() protoreflect.Message { - mi := &file_proto_pbconfigentry_config_entry_proto_msgTypes[5] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[5] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1090,7 +1090,7 @@ func (x *MeshHTTPConfig) ProtoReflect() protoreflect.Message { // Deprecated: Use MeshHTTPConfig.ProtoReflect.Descriptor instead. func (*MeshHTTPConfig) Descriptor() ([]byte, []int) { - return file_proto_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{5} + return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{5} } func (x *MeshHTTPConfig) GetSanitizeXForwardedClientCert() bool { @@ -1116,7 +1116,7 @@ type PeeringMeshConfig struct { func (x *PeeringMeshConfig) Reset() { *x = PeeringMeshConfig{} if protoimpl.UnsafeEnabled { - mi := &file_proto_pbconfigentry_config_entry_proto_msgTypes[6] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1129,7 +1129,7 @@ func (x *PeeringMeshConfig) String() string { func (*PeeringMeshConfig) ProtoMessage() {} func (x *PeeringMeshConfig) ProtoReflect() protoreflect.Message { - mi := &file_proto_pbconfigentry_config_entry_proto_msgTypes[6] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[6] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1142,7 +1142,7 @@ func (x *PeeringMeshConfig) ProtoReflect() protoreflect.Message { // Deprecated: Use PeeringMeshConfig.ProtoReflect.Descriptor instead. func (*PeeringMeshConfig) Descriptor() ([]byte, []int) { - return file_proto_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{6} + return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{6} } func (x *PeeringMeshConfig) GetPeerThroughMeshGateways() bool { @@ -1176,7 +1176,7 @@ type ServiceResolver struct { func (x *ServiceResolver) Reset() { *x = ServiceResolver{} if protoimpl.UnsafeEnabled { - mi := &file_proto_pbconfigentry_config_entry_proto_msgTypes[7] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1189,7 +1189,7 @@ func (x *ServiceResolver) String() string { func (*ServiceResolver) ProtoMessage() {} func (x *ServiceResolver) ProtoReflect() protoreflect.Message { - mi := &file_proto_pbconfigentry_config_entry_proto_msgTypes[7] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[7] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1202,7 +1202,7 @@ func (x *ServiceResolver) ProtoReflect() protoreflect.Message { // Deprecated: Use ServiceResolver.ProtoReflect.Descriptor instead. func (*ServiceResolver) Descriptor() ([]byte, []int) { - return file_proto_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{7} + return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{7} } func (x *ServiceResolver) GetDefaultSubset() string { @@ -1271,7 +1271,7 @@ type ServiceResolverSubset struct { func (x *ServiceResolverSubset) Reset() { *x = ServiceResolverSubset{} if protoimpl.UnsafeEnabled { - mi := &file_proto_pbconfigentry_config_entry_proto_msgTypes[8] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1284,7 +1284,7 @@ func (x *ServiceResolverSubset) String() string { func (*ServiceResolverSubset) ProtoMessage() {} func (x *ServiceResolverSubset) ProtoReflect() protoreflect.Message { - mi := &file_proto_pbconfigentry_config_entry_proto_msgTypes[8] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[8] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1297,7 +1297,7 @@ func (x *ServiceResolverSubset) ProtoReflect() protoreflect.Message { // Deprecated: Use ServiceResolverSubset.ProtoReflect.Descriptor instead. func (*ServiceResolverSubset) Descriptor() ([]byte, []int) { - return file_proto_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{8} + return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{8} } func (x *ServiceResolverSubset) GetFilter() string { @@ -1335,7 +1335,7 @@ type ServiceResolverRedirect struct { func (x *ServiceResolverRedirect) Reset() { *x = ServiceResolverRedirect{} if protoimpl.UnsafeEnabled { - mi := &file_proto_pbconfigentry_config_entry_proto_msgTypes[9] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1348,7 +1348,7 @@ func (x *ServiceResolverRedirect) String() string { func (*ServiceResolverRedirect) ProtoMessage() {} func (x *ServiceResolverRedirect) ProtoReflect() protoreflect.Message { - mi := &file_proto_pbconfigentry_config_entry_proto_msgTypes[9] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[9] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1361,7 +1361,7 @@ func (x *ServiceResolverRedirect) ProtoReflect() protoreflect.Message { // Deprecated: Use ServiceResolverRedirect.ProtoReflect.Descriptor instead. func (*ServiceResolverRedirect) Descriptor() ([]byte, []int) { - return file_proto_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{9} + return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{9} } func (x *ServiceResolverRedirect) GetService() string { @@ -1426,7 +1426,7 @@ type ServiceResolverFailover struct { func (x *ServiceResolverFailover) Reset() { *x = ServiceResolverFailover{} if protoimpl.UnsafeEnabled { - mi := &file_proto_pbconfigentry_config_entry_proto_msgTypes[10] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1439,7 +1439,7 @@ func (x *ServiceResolverFailover) String() string { func (*ServiceResolverFailover) ProtoMessage() {} func (x *ServiceResolverFailover) ProtoReflect() protoreflect.Message { - mi := &file_proto_pbconfigentry_config_entry_proto_msgTypes[10] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[10] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1452,7 +1452,7 @@ func (x *ServiceResolverFailover) ProtoReflect() protoreflect.Message { // Deprecated: Use ServiceResolverFailover.ProtoReflect.Descriptor instead. func (*ServiceResolverFailover) Descriptor() ([]byte, []int) { - return file_proto_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{10} + return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{10} } func (x *ServiceResolverFailover) GetService() string { @@ -1511,7 +1511,7 @@ type ServiceResolverFailoverTarget struct { func (x *ServiceResolverFailoverTarget) Reset() { *x = ServiceResolverFailoverTarget{} if protoimpl.UnsafeEnabled { - mi := &file_proto_pbconfigentry_config_entry_proto_msgTypes[11] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1524,7 +1524,7 @@ func (x *ServiceResolverFailoverTarget) String() string { func (*ServiceResolverFailoverTarget) ProtoMessage() {} func (x *ServiceResolverFailoverTarget) ProtoReflect() protoreflect.Message { - mi := &file_proto_pbconfigentry_config_entry_proto_msgTypes[11] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[11] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1537,7 +1537,7 @@ func (x *ServiceResolverFailoverTarget) ProtoReflect() protoreflect.Message { // Deprecated: Use ServiceResolverFailoverTarget.ProtoReflect.Descriptor instead. func (*ServiceResolverFailoverTarget) Descriptor() ([]byte, []int) { - return file_proto_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{11} + return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{11} } func (x *ServiceResolverFailoverTarget) GetService() string { @@ -1601,7 +1601,7 @@ type LoadBalancer struct { func (x *LoadBalancer) Reset() { *x = LoadBalancer{} if protoimpl.UnsafeEnabled { - mi := &file_proto_pbconfigentry_config_entry_proto_msgTypes[12] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1614,7 +1614,7 @@ func (x *LoadBalancer) String() string { func (*LoadBalancer) ProtoMessage() {} func (x *LoadBalancer) ProtoReflect() protoreflect.Message { - mi := &file_proto_pbconfigentry_config_entry_proto_msgTypes[12] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[12] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1627,7 +1627,7 @@ func (x *LoadBalancer) ProtoReflect() protoreflect.Message { // Deprecated: Use LoadBalancer.ProtoReflect.Descriptor instead. func (*LoadBalancer) Descriptor() ([]byte, []int) { - return file_proto_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{12} + return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{12} } func (x *LoadBalancer) GetPolicy() string { @@ -1675,7 +1675,7 @@ type RingHashConfig struct { func (x *RingHashConfig) Reset() { *x = RingHashConfig{} if protoimpl.UnsafeEnabled { - mi := &file_proto_pbconfigentry_config_entry_proto_msgTypes[13] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1688,7 +1688,7 @@ func (x *RingHashConfig) String() string { func (*RingHashConfig) ProtoMessage() {} func (x *RingHashConfig) ProtoReflect() protoreflect.Message { - mi := &file_proto_pbconfigentry_config_entry_proto_msgTypes[13] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[13] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1701,7 +1701,7 @@ func (x *RingHashConfig) ProtoReflect() protoreflect.Message { // Deprecated: Use RingHashConfig.ProtoReflect.Descriptor instead. func (*RingHashConfig) Descriptor() ([]byte, []int) { - return file_proto_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{13} + return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{13} } func (x *RingHashConfig) GetMinimumRingSize() uint64 { @@ -1734,7 +1734,7 @@ type LeastRequestConfig struct { func (x *LeastRequestConfig) Reset() { *x = LeastRequestConfig{} if protoimpl.UnsafeEnabled { - mi := &file_proto_pbconfigentry_config_entry_proto_msgTypes[14] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1747,7 +1747,7 @@ func (x *LeastRequestConfig) String() string { func (*LeastRequestConfig) ProtoMessage() {} func (x *LeastRequestConfig) ProtoReflect() protoreflect.Message { - mi := &file_proto_pbconfigentry_config_entry_proto_msgTypes[14] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[14] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1760,7 +1760,7 @@ func (x *LeastRequestConfig) ProtoReflect() protoreflect.Message { // Deprecated: Use LeastRequestConfig.ProtoReflect.Descriptor instead. func (*LeastRequestConfig) Descriptor() ([]byte, []int) { - return file_proto_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{14} + return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{14} } func (x *LeastRequestConfig) GetChoiceCount() uint32 { @@ -1790,7 +1790,7 @@ type HashPolicy struct { func (x *HashPolicy) Reset() { *x = HashPolicy{} if protoimpl.UnsafeEnabled { - mi := &file_proto_pbconfigentry_config_entry_proto_msgTypes[15] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[15] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1803,7 +1803,7 @@ func (x *HashPolicy) String() string { func (*HashPolicy) ProtoMessage() {} func (x *HashPolicy) ProtoReflect() protoreflect.Message { - mi := &file_proto_pbconfigentry_config_entry_proto_msgTypes[15] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[15] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1816,7 +1816,7 @@ func (x *HashPolicy) ProtoReflect() protoreflect.Message { // Deprecated: Use HashPolicy.ProtoReflect.Descriptor instead. func (*HashPolicy) Descriptor() ([]byte, []int) { - return file_proto_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{15} + return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{15} } func (x *HashPolicy) GetField() string { @@ -1873,7 +1873,7 @@ type CookieConfig struct { func (x *CookieConfig) Reset() { *x = CookieConfig{} if protoimpl.UnsafeEnabled { - mi := &file_proto_pbconfigentry_config_entry_proto_msgTypes[16] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[16] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1886,7 +1886,7 @@ func (x *CookieConfig) String() string { func (*CookieConfig) ProtoMessage() {} func (x *CookieConfig) ProtoReflect() protoreflect.Message { - mi := &file_proto_pbconfigentry_config_entry_proto_msgTypes[16] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[16] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1899,7 +1899,7 @@ func (x *CookieConfig) ProtoReflect() protoreflect.Message { // Deprecated: Use CookieConfig.ProtoReflect.Descriptor instead. func (*CookieConfig) Descriptor() ([]byte, []int) { - return file_proto_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{16} + return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{16} } func (x *CookieConfig) GetSession() bool { @@ -1943,7 +1943,7 @@ type IngressGateway struct { func (x *IngressGateway) Reset() { *x = IngressGateway{} if protoimpl.UnsafeEnabled { - mi := &file_proto_pbconfigentry_config_entry_proto_msgTypes[17] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[17] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1956,7 +1956,7 @@ func (x *IngressGateway) String() string { func (*IngressGateway) ProtoMessage() {} func (x *IngressGateway) ProtoReflect() protoreflect.Message { - mi := &file_proto_pbconfigentry_config_entry_proto_msgTypes[17] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[17] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1969,7 +1969,7 @@ func (x *IngressGateway) ProtoReflect() protoreflect.Message { // Deprecated: Use IngressGateway.ProtoReflect.Descriptor instead. func (*IngressGateway) Descriptor() ([]byte, []int) { - return file_proto_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{17} + return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{17} } func (x *IngressGateway) GetTLS() *GatewayTLSConfig { @@ -2019,7 +2019,7 @@ type IngressServiceConfig struct { func (x *IngressServiceConfig) Reset() { *x = IngressServiceConfig{} if protoimpl.UnsafeEnabled { - mi := &file_proto_pbconfigentry_config_entry_proto_msgTypes[18] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[18] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2032,7 +2032,7 @@ func (x *IngressServiceConfig) String() string { func (*IngressServiceConfig) ProtoMessage() {} func (x *IngressServiceConfig) ProtoReflect() protoreflect.Message { - mi := &file_proto_pbconfigentry_config_entry_proto_msgTypes[18] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[18] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2045,7 +2045,7 @@ func (x *IngressServiceConfig) ProtoReflect() protoreflect.Message { // Deprecated: Use IngressServiceConfig.ProtoReflect.Descriptor instead. func (*IngressServiceConfig) Descriptor() ([]byte, []int) { - return file_proto_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{18} + return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{18} } func (x *IngressServiceConfig) GetMaxConnections() uint32 { @@ -2099,7 +2099,7 @@ type GatewayTLSConfig struct { func (x *GatewayTLSConfig) Reset() { *x = GatewayTLSConfig{} if protoimpl.UnsafeEnabled { - mi := &file_proto_pbconfigentry_config_entry_proto_msgTypes[19] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[19] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2112,7 +2112,7 @@ func (x *GatewayTLSConfig) String() string { func (*GatewayTLSConfig) ProtoMessage() {} func (x *GatewayTLSConfig) ProtoReflect() protoreflect.Message { - mi := &file_proto_pbconfigentry_config_entry_proto_msgTypes[19] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[19] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2125,7 +2125,7 @@ func (x *GatewayTLSConfig) ProtoReflect() protoreflect.Message { // Deprecated: Use GatewayTLSConfig.ProtoReflect.Descriptor instead. func (*GatewayTLSConfig) Descriptor() ([]byte, []int) { - return file_proto_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{19} + return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{19} } func (x *GatewayTLSConfig) GetEnabled() bool { @@ -2180,7 +2180,7 @@ type GatewayTLSSDSConfig struct { func (x *GatewayTLSSDSConfig) Reset() { *x = GatewayTLSSDSConfig{} if protoimpl.UnsafeEnabled { - mi := &file_proto_pbconfigentry_config_entry_proto_msgTypes[20] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[20] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2193,7 +2193,7 @@ func (x *GatewayTLSSDSConfig) String() string { func (*GatewayTLSSDSConfig) ProtoMessage() {} func (x *GatewayTLSSDSConfig) ProtoReflect() protoreflect.Message { - mi := &file_proto_pbconfigentry_config_entry_proto_msgTypes[20] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[20] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2206,7 +2206,7 @@ func (x *GatewayTLSSDSConfig) ProtoReflect() protoreflect.Message { // Deprecated: Use GatewayTLSSDSConfig.ProtoReflect.Descriptor instead. func (*GatewayTLSSDSConfig) Descriptor() ([]byte, []int) { - return file_proto_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{20} + return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{20} } func (x *GatewayTLSSDSConfig) GetClusterName() string { @@ -2243,7 +2243,7 @@ type IngressListener struct { func (x *IngressListener) Reset() { *x = IngressListener{} if protoimpl.UnsafeEnabled { - mi := &file_proto_pbconfigentry_config_entry_proto_msgTypes[21] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[21] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2256,7 +2256,7 @@ func (x *IngressListener) String() string { func (*IngressListener) ProtoMessage() {} func (x *IngressListener) ProtoReflect() protoreflect.Message { - mi := &file_proto_pbconfigentry_config_entry_proto_msgTypes[21] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[21] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2269,7 +2269,7 @@ func (x *IngressListener) ProtoReflect() protoreflect.Message { // Deprecated: Use IngressListener.ProtoReflect.Descriptor instead. func (*IngressListener) Descriptor() ([]byte, []int) { - return file_proto_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{21} + return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{21} } func (x *IngressListener) GetPort() int32 { @@ -2327,7 +2327,7 @@ type IngressService struct { func (x *IngressService) Reset() { *x = IngressService{} if protoimpl.UnsafeEnabled { - mi := &file_proto_pbconfigentry_config_entry_proto_msgTypes[22] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[22] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2340,7 +2340,7 @@ func (x *IngressService) String() string { func (*IngressService) ProtoMessage() {} func (x *IngressService) ProtoReflect() protoreflect.Message { - mi := &file_proto_pbconfigentry_config_entry_proto_msgTypes[22] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[22] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2353,7 +2353,7 @@ func (x *IngressService) ProtoReflect() protoreflect.Message { // Deprecated: Use IngressService.ProtoReflect.Descriptor instead. func (*IngressService) Descriptor() ([]byte, []int) { - return file_proto_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{22} + return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{22} } func (x *IngressService) GetName() string { @@ -2449,7 +2449,7 @@ type GatewayServiceTLSConfig struct { func (x *GatewayServiceTLSConfig) Reset() { *x = GatewayServiceTLSConfig{} if protoimpl.UnsafeEnabled { - mi := &file_proto_pbconfigentry_config_entry_proto_msgTypes[23] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[23] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2462,7 +2462,7 @@ func (x *GatewayServiceTLSConfig) String() string { func (*GatewayServiceTLSConfig) ProtoMessage() {} func (x *GatewayServiceTLSConfig) ProtoReflect() protoreflect.Message { - mi := &file_proto_pbconfigentry_config_entry_proto_msgTypes[23] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[23] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2475,7 +2475,7 @@ func (x *GatewayServiceTLSConfig) ProtoReflect() protoreflect.Message { // Deprecated: Use GatewayServiceTLSConfig.ProtoReflect.Descriptor instead. func (*GatewayServiceTLSConfig) Descriptor() ([]byte, []int) { - return file_proto_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{23} + return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{23} } func (x *GatewayServiceTLSConfig) GetSDS() *GatewayTLSSDSConfig { @@ -2503,7 +2503,7 @@ type HTTPHeaderModifiers struct { func (x *HTTPHeaderModifiers) Reset() { *x = HTTPHeaderModifiers{} if protoimpl.UnsafeEnabled { - mi := &file_proto_pbconfigentry_config_entry_proto_msgTypes[24] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[24] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2516,7 +2516,7 @@ func (x *HTTPHeaderModifiers) String() string { func (*HTTPHeaderModifiers) ProtoMessage() {} func (x *HTTPHeaderModifiers) ProtoReflect() protoreflect.Message { - mi := &file_proto_pbconfigentry_config_entry_proto_msgTypes[24] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[24] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2529,7 +2529,7 @@ func (x *HTTPHeaderModifiers) ProtoReflect() protoreflect.Message { // Deprecated: Use HTTPHeaderModifiers.ProtoReflect.Descriptor instead. func (*HTTPHeaderModifiers) Descriptor() ([]byte, []int) { - return file_proto_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{24} + return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{24} } func (x *HTTPHeaderModifiers) GetAdd() map[string]string { @@ -2571,7 +2571,7 @@ type ServiceIntentions struct { func (x *ServiceIntentions) Reset() { *x = ServiceIntentions{} if protoimpl.UnsafeEnabled { - mi := &file_proto_pbconfigentry_config_entry_proto_msgTypes[25] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[25] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2584,7 +2584,7 @@ func (x *ServiceIntentions) String() string { func (*ServiceIntentions) ProtoMessage() {} func (x *ServiceIntentions) ProtoReflect() protoreflect.Message { - mi := &file_proto_pbconfigentry_config_entry_proto_msgTypes[25] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[25] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2597,7 +2597,7 @@ func (x *ServiceIntentions) ProtoReflect() protoreflect.Message { // Deprecated: Use ServiceIntentions.ProtoReflect.Descriptor instead. func (*ServiceIntentions) Descriptor() ([]byte, []int) { - return file_proto_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{25} + return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{25} } func (x *ServiceIntentions) GetSources() []*SourceIntention { @@ -2647,7 +2647,7 @@ type SourceIntention struct { func (x *SourceIntention) Reset() { *x = SourceIntention{} if protoimpl.UnsafeEnabled { - mi := &file_proto_pbconfigentry_config_entry_proto_msgTypes[26] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[26] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2660,7 +2660,7 @@ func (x *SourceIntention) String() string { func (*SourceIntention) ProtoMessage() {} func (x *SourceIntention) ProtoReflect() protoreflect.Message { - mi := &file_proto_pbconfigentry_config_entry_proto_msgTypes[26] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[26] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2673,7 +2673,7 @@ func (x *SourceIntention) ProtoReflect() protoreflect.Message { // Deprecated: Use SourceIntention.ProtoReflect.Descriptor instead. func (*SourceIntention) Descriptor() ([]byte, []int) { - return file_proto_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{26} + return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{26} } func (x *SourceIntention) GetName() string { @@ -2778,7 +2778,7 @@ type IntentionPermission struct { func (x *IntentionPermission) Reset() { *x = IntentionPermission{} if protoimpl.UnsafeEnabled { - mi := &file_proto_pbconfigentry_config_entry_proto_msgTypes[27] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[27] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2791,7 +2791,7 @@ func (x *IntentionPermission) String() string { func (*IntentionPermission) ProtoMessage() {} func (x *IntentionPermission) ProtoReflect() protoreflect.Message { - mi := &file_proto_pbconfigentry_config_entry_proto_msgTypes[27] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[27] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2804,7 +2804,7 @@ func (x *IntentionPermission) ProtoReflect() protoreflect.Message { // Deprecated: Use IntentionPermission.ProtoReflect.Descriptor instead. func (*IntentionPermission) Descriptor() ([]byte, []int) { - return file_proto_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{27} + return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{27} } func (x *IntentionPermission) GetAction() IntentionAction { @@ -2841,7 +2841,7 @@ type IntentionHTTPPermission struct { func (x *IntentionHTTPPermission) Reset() { *x = IntentionHTTPPermission{} if protoimpl.UnsafeEnabled { - mi := &file_proto_pbconfigentry_config_entry_proto_msgTypes[28] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[28] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2854,7 +2854,7 @@ func (x *IntentionHTTPPermission) String() string { func (*IntentionHTTPPermission) ProtoMessage() {} func (x *IntentionHTTPPermission) ProtoReflect() protoreflect.Message { - mi := &file_proto_pbconfigentry_config_entry_proto_msgTypes[28] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[28] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2867,7 +2867,7 @@ func (x *IntentionHTTPPermission) ProtoReflect() protoreflect.Message { // Deprecated: Use IntentionHTTPPermission.ProtoReflect.Descriptor instead. func (*IntentionHTTPPermission) Descriptor() ([]byte, []int) { - return file_proto_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{28} + return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{28} } func (x *IntentionHTTPPermission) GetPathExact() string { @@ -2927,7 +2927,7 @@ type IntentionHTTPHeaderPermission struct { func (x *IntentionHTTPHeaderPermission) Reset() { *x = IntentionHTTPHeaderPermission{} if protoimpl.UnsafeEnabled { - mi := &file_proto_pbconfigentry_config_entry_proto_msgTypes[29] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[29] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2940,7 +2940,7 @@ func (x *IntentionHTTPHeaderPermission) String() string { func (*IntentionHTTPHeaderPermission) ProtoMessage() {} func (x *IntentionHTTPHeaderPermission) ProtoReflect() protoreflect.Message { - mi := &file_proto_pbconfigentry_config_entry_proto_msgTypes[29] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[29] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2953,7 +2953,7 @@ func (x *IntentionHTTPHeaderPermission) ProtoReflect() protoreflect.Message { // Deprecated: Use IntentionHTTPHeaderPermission.ProtoReflect.Descriptor instead. func (*IntentionHTTPHeaderPermission) Descriptor() ([]byte, []int) { - return file_proto_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{29} + return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{29} } func (x *IntentionHTTPHeaderPermission) GetName() string { @@ -3040,7 +3040,7 @@ type ServiceDefaults struct { func (x *ServiceDefaults) Reset() { *x = ServiceDefaults{} if protoimpl.UnsafeEnabled { - mi := &file_proto_pbconfigentry_config_entry_proto_msgTypes[30] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[30] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3053,7 +3053,7 @@ func (x *ServiceDefaults) String() string { func (*ServiceDefaults) ProtoMessage() {} func (x *ServiceDefaults) ProtoReflect() protoreflect.Message { - mi := &file_proto_pbconfigentry_config_entry_proto_msgTypes[30] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[30] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3066,7 +3066,7 @@ func (x *ServiceDefaults) ProtoReflect() protoreflect.Message { // Deprecated: Use ServiceDefaults.ProtoReflect.Descriptor instead. func (*ServiceDefaults) Descriptor() ([]byte, []int) { - return file_proto_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{30} + return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{30} } func (x *ServiceDefaults) GetProtocol() string { @@ -3185,7 +3185,7 @@ type TransparentProxyConfig struct { func (x *TransparentProxyConfig) Reset() { *x = TransparentProxyConfig{} if protoimpl.UnsafeEnabled { - mi := &file_proto_pbconfigentry_config_entry_proto_msgTypes[31] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[31] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3198,7 +3198,7 @@ func (x *TransparentProxyConfig) String() string { func (*TransparentProxyConfig) ProtoMessage() {} func (x *TransparentProxyConfig) ProtoReflect() protoreflect.Message { - mi := &file_proto_pbconfigentry_config_entry_proto_msgTypes[31] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[31] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3211,7 +3211,7 @@ func (x *TransparentProxyConfig) ProtoReflect() protoreflect.Message { // Deprecated: Use TransparentProxyConfig.ProtoReflect.Descriptor instead. func (*TransparentProxyConfig) Descriptor() ([]byte, []int) { - return file_proto_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{31} + return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{31} } func (x *TransparentProxyConfig) GetOutboundListenerPort() int32 { @@ -3245,7 +3245,7 @@ type MeshGatewayConfig struct { func (x *MeshGatewayConfig) Reset() { *x = MeshGatewayConfig{} if protoimpl.UnsafeEnabled { - mi := &file_proto_pbconfigentry_config_entry_proto_msgTypes[32] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[32] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3258,7 +3258,7 @@ func (x *MeshGatewayConfig) String() string { func (*MeshGatewayConfig) ProtoMessage() {} func (x *MeshGatewayConfig) ProtoReflect() protoreflect.Message { - mi := &file_proto_pbconfigentry_config_entry_proto_msgTypes[32] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[32] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3271,7 +3271,7 @@ func (x *MeshGatewayConfig) ProtoReflect() protoreflect.Message { // Deprecated: Use MeshGatewayConfig.ProtoReflect.Descriptor instead. func (*MeshGatewayConfig) Descriptor() ([]byte, []int) { - return file_proto_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{32} + return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{32} } func (x *MeshGatewayConfig) GetMode() MeshGatewayMode { @@ -3298,7 +3298,7 @@ type ExposeConfig struct { func (x *ExposeConfig) Reset() { *x = ExposeConfig{} if protoimpl.UnsafeEnabled { - mi := &file_proto_pbconfigentry_config_entry_proto_msgTypes[33] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[33] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3311,7 +3311,7 @@ func (x *ExposeConfig) String() string { func (*ExposeConfig) ProtoMessage() {} func (x *ExposeConfig) ProtoReflect() protoreflect.Message { - mi := &file_proto_pbconfigentry_config_entry_proto_msgTypes[33] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[33] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3324,7 +3324,7 @@ func (x *ExposeConfig) ProtoReflect() protoreflect.Message { // Deprecated: Use ExposeConfig.ProtoReflect.Descriptor instead. func (*ExposeConfig) Descriptor() ([]byte, []int) { - return file_proto_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{33} + return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{33} } func (x *ExposeConfig) GetChecks() bool { @@ -3363,7 +3363,7 @@ type ExposePath struct { func (x *ExposePath) Reset() { *x = ExposePath{} if protoimpl.UnsafeEnabled { - mi := &file_proto_pbconfigentry_config_entry_proto_msgTypes[34] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[34] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3376,7 +3376,7 @@ func (x *ExposePath) String() string { func (*ExposePath) ProtoMessage() {} func (x *ExposePath) ProtoReflect() protoreflect.Message { - mi := &file_proto_pbconfigentry_config_entry_proto_msgTypes[34] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[34] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3389,7 +3389,7 @@ func (x *ExposePath) ProtoReflect() protoreflect.Message { // Deprecated: Use ExposePath.ProtoReflect.Descriptor instead. func (*ExposePath) Descriptor() ([]byte, []int) { - return file_proto_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{34} + return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{34} } func (x *ExposePath) GetListenerPort() int32 { @@ -3444,7 +3444,7 @@ type UpstreamConfiguration struct { func (x *UpstreamConfiguration) Reset() { *x = UpstreamConfiguration{} if protoimpl.UnsafeEnabled { - mi := &file_proto_pbconfigentry_config_entry_proto_msgTypes[35] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[35] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3457,7 +3457,7 @@ func (x *UpstreamConfiguration) String() string { func (*UpstreamConfiguration) ProtoMessage() {} func (x *UpstreamConfiguration) ProtoReflect() protoreflect.Message { - mi := &file_proto_pbconfigentry_config_entry_proto_msgTypes[35] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[35] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3470,7 +3470,7 @@ func (x *UpstreamConfiguration) ProtoReflect() protoreflect.Message { // Deprecated: Use UpstreamConfiguration.ProtoReflect.Descriptor instead. func (*UpstreamConfiguration) Descriptor() ([]byte, []int) { - return file_proto_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{35} + return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{35} } func (x *UpstreamConfiguration) GetOverrides() []*UpstreamConfig { @@ -3515,7 +3515,7 @@ type UpstreamConfig struct { func (x *UpstreamConfig) Reset() { *x = UpstreamConfig{} if protoimpl.UnsafeEnabled { - mi := &file_proto_pbconfigentry_config_entry_proto_msgTypes[36] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[36] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3528,7 +3528,7 @@ func (x *UpstreamConfig) String() string { func (*UpstreamConfig) ProtoMessage() {} func (x *UpstreamConfig) ProtoReflect() protoreflect.Message { - mi := &file_proto_pbconfigentry_config_entry_proto_msgTypes[36] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[36] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3541,7 +3541,7 @@ func (x *UpstreamConfig) ProtoReflect() protoreflect.Message { // Deprecated: Use UpstreamConfig.ProtoReflect.Descriptor instead. func (*UpstreamConfig) Descriptor() ([]byte, []int) { - return file_proto_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{36} + return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{36} } func (x *UpstreamConfig) GetName() string { @@ -3642,7 +3642,7 @@ type UpstreamLimits struct { func (x *UpstreamLimits) Reset() { *x = UpstreamLimits{} if protoimpl.UnsafeEnabled { - mi := &file_proto_pbconfigentry_config_entry_proto_msgTypes[37] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[37] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3655,7 +3655,7 @@ func (x *UpstreamLimits) String() string { func (*UpstreamLimits) ProtoMessage() {} func (x *UpstreamLimits) ProtoReflect() protoreflect.Message { - mi := &file_proto_pbconfigentry_config_entry_proto_msgTypes[37] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[37] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3668,7 +3668,7 @@ func (x *UpstreamLimits) ProtoReflect() protoreflect.Message { // Deprecated: Use UpstreamLimits.ProtoReflect.Descriptor instead. func (*UpstreamLimits) Descriptor() ([]byte, []int) { - return file_proto_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{37} + return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{37} } func (x *UpstreamLimits) GetMaxConnections() int32 { @@ -3712,7 +3712,7 @@ type PassiveHealthCheck struct { func (x *PassiveHealthCheck) Reset() { *x = PassiveHealthCheck{} if protoimpl.UnsafeEnabled { - mi := &file_proto_pbconfigentry_config_entry_proto_msgTypes[38] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[38] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3725,7 +3725,7 @@ func (x *PassiveHealthCheck) String() string { func (*PassiveHealthCheck) ProtoMessage() {} func (x *PassiveHealthCheck) ProtoReflect() protoreflect.Message { - mi := &file_proto_pbconfigentry_config_entry_proto_msgTypes[38] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[38] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3738,7 +3738,7 @@ func (x *PassiveHealthCheck) ProtoReflect() protoreflect.Message { // Deprecated: Use PassiveHealthCheck.ProtoReflect.Descriptor instead. func (*PassiveHealthCheck) Descriptor() ([]byte, []int) { - return file_proto_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{38} + return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{38} } func (x *PassiveHealthCheck) GetInterval() *durationpb.Duration { @@ -3780,7 +3780,7 @@ type DestinationConfig struct { func (x *DestinationConfig) Reset() { *x = DestinationConfig{} if protoimpl.UnsafeEnabled { - mi := &file_proto_pbconfigentry_config_entry_proto_msgTypes[39] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[39] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3793,7 +3793,7 @@ func (x *DestinationConfig) String() string { func (*DestinationConfig) ProtoMessage() {} func (x *DestinationConfig) ProtoReflect() protoreflect.Message { - mi := &file_proto_pbconfigentry_config_entry_proto_msgTypes[39] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[39] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3806,7 +3806,7 @@ func (x *DestinationConfig) ProtoReflect() protoreflect.Message { // Deprecated: Use DestinationConfig.ProtoReflect.Descriptor instead. func (*DestinationConfig) Descriptor() ([]byte, []int) { - return file_proto_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{39} + return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{39} } func (x *DestinationConfig) GetAddresses() []string { @@ -3842,7 +3842,7 @@ type APIGateway struct { func (x *APIGateway) Reset() { *x = APIGateway{} if protoimpl.UnsafeEnabled { - mi := &file_proto_pbconfigentry_config_entry_proto_msgTypes[40] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[40] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3855,7 +3855,7 @@ func (x *APIGateway) String() string { func (*APIGateway) ProtoMessage() {} func (x *APIGateway) ProtoReflect() protoreflect.Message { - mi := &file_proto_pbconfigentry_config_entry_proto_msgTypes[40] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[40] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3868,7 +3868,7 @@ func (x *APIGateway) ProtoReflect() protoreflect.Message { // Deprecated: Use APIGateway.ProtoReflect.Descriptor instead. func (*APIGateway) Descriptor() ([]byte, []int) { - return file_proto_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{40} + return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{40} } func (x *APIGateway) GetMeta() map[string]string { @@ -3908,7 +3908,7 @@ type Status struct { func (x *Status) Reset() { *x = Status{} if protoimpl.UnsafeEnabled { - mi := &file_proto_pbconfigentry_config_entry_proto_msgTypes[41] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[41] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3921,7 +3921,7 @@ func (x *Status) String() string { func (*Status) ProtoMessage() {} func (x *Status) ProtoReflect() protoreflect.Message { - mi := &file_proto_pbconfigentry_config_entry_proto_msgTypes[41] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[41] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3934,7 +3934,7 @@ func (x *Status) ProtoReflect() protoreflect.Message { // Deprecated: Use Status.ProtoReflect.Descriptor instead. func (*Status) Descriptor() ([]byte, []int) { - return file_proto_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{41} + return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{41} } func (x *Status) GetConditions() []*Condition { @@ -3966,7 +3966,7 @@ type Condition struct { func (x *Condition) Reset() { *x = Condition{} if protoimpl.UnsafeEnabled { - mi := &file_proto_pbconfigentry_config_entry_proto_msgTypes[42] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[42] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3979,7 +3979,7 @@ func (x *Condition) String() string { func (*Condition) ProtoMessage() {} func (x *Condition) ProtoReflect() protoreflect.Message { - mi := &file_proto_pbconfigentry_config_entry_proto_msgTypes[42] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[42] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3992,7 +3992,7 @@ func (x *Condition) ProtoReflect() protoreflect.Message { // Deprecated: Use Condition.ProtoReflect.Descriptor instead. func (*Condition) Descriptor() ([]byte, []int) { - return file_proto_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{42} + return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{42} } func (x *Condition) GetType() string { @@ -4059,7 +4059,7 @@ type APIGatewayListener struct { func (x *APIGatewayListener) Reset() { *x = APIGatewayListener{} if protoimpl.UnsafeEnabled { - mi := &file_proto_pbconfigentry_config_entry_proto_msgTypes[43] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[43] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4072,7 +4072,7 @@ func (x *APIGatewayListener) String() string { func (*APIGatewayListener) ProtoMessage() {} func (x *APIGatewayListener) ProtoReflect() protoreflect.Message { - mi := &file_proto_pbconfigentry_config_entry_proto_msgTypes[43] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[43] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4085,7 +4085,7 @@ func (x *APIGatewayListener) ProtoReflect() protoreflect.Message { // Deprecated: Use APIGatewayListener.ProtoReflect.Descriptor instead. func (*APIGatewayListener) Descriptor() ([]byte, []int) { - return file_proto_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{43} + return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{43} } func (x *APIGatewayListener) GetName() string { @@ -4145,7 +4145,7 @@ type APIGatewayTLSConfiguration struct { func (x *APIGatewayTLSConfiguration) Reset() { *x = APIGatewayTLSConfiguration{} if protoimpl.UnsafeEnabled { - mi := &file_proto_pbconfigentry_config_entry_proto_msgTypes[44] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[44] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4158,7 +4158,7 @@ func (x *APIGatewayTLSConfiguration) String() string { func (*APIGatewayTLSConfiguration) ProtoMessage() {} func (x *APIGatewayTLSConfiguration) ProtoReflect() protoreflect.Message { - mi := &file_proto_pbconfigentry_config_entry_proto_msgTypes[44] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[44] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4171,7 +4171,7 @@ func (x *APIGatewayTLSConfiguration) ProtoReflect() protoreflect.Message { // Deprecated: Use APIGatewayTLSConfiguration.ProtoReflect.Descriptor instead. func (*APIGatewayTLSConfiguration) Descriptor() ([]byte, []int) { - return file_proto_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{44} + return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{44} } func (x *APIGatewayTLSConfiguration) GetCertificates() []*ResourceReference { @@ -4222,7 +4222,7 @@ type ResourceReference struct { func (x *ResourceReference) Reset() { *x = ResourceReference{} if protoimpl.UnsafeEnabled { - mi := &file_proto_pbconfigentry_config_entry_proto_msgTypes[45] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[45] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4235,7 +4235,7 @@ func (x *ResourceReference) String() string { func (*ResourceReference) ProtoMessage() {} func (x *ResourceReference) ProtoReflect() protoreflect.Message { - mi := &file_proto_pbconfigentry_config_entry_proto_msgTypes[45] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[45] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4248,7 +4248,7 @@ func (x *ResourceReference) ProtoReflect() protoreflect.Message { // Deprecated: Use ResourceReference.ProtoReflect.Descriptor instead. func (*ResourceReference) Descriptor() ([]byte, []int) { - return file_proto_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{45} + return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{45} } func (x *ResourceReference) GetKind() string { @@ -4297,7 +4297,7 @@ type BoundAPIGateway struct { func (x *BoundAPIGateway) Reset() { *x = BoundAPIGateway{} if protoimpl.UnsafeEnabled { - mi := &file_proto_pbconfigentry_config_entry_proto_msgTypes[46] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[46] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4310,7 +4310,7 @@ func (x *BoundAPIGateway) String() string { func (*BoundAPIGateway) ProtoMessage() {} func (x *BoundAPIGateway) ProtoReflect() protoreflect.Message { - mi := &file_proto_pbconfigentry_config_entry_proto_msgTypes[46] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[46] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4323,7 +4323,7 @@ func (x *BoundAPIGateway) ProtoReflect() protoreflect.Message { // Deprecated: Use BoundAPIGateway.ProtoReflect.Descriptor instead. func (*BoundAPIGateway) Descriptor() ([]byte, []int) { - return file_proto_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{46} + return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{46} } func (x *BoundAPIGateway) GetMeta() map[string]string { @@ -4358,7 +4358,7 @@ type BoundAPIGatewayListener struct { func (x *BoundAPIGatewayListener) Reset() { *x = BoundAPIGatewayListener{} if protoimpl.UnsafeEnabled { - mi := &file_proto_pbconfigentry_config_entry_proto_msgTypes[47] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[47] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4371,7 +4371,7 @@ func (x *BoundAPIGatewayListener) String() string { func (*BoundAPIGatewayListener) ProtoMessage() {} func (x *BoundAPIGatewayListener) ProtoReflect() protoreflect.Message { - mi := &file_proto_pbconfigentry_config_entry_proto_msgTypes[47] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[47] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4384,7 +4384,7 @@ func (x *BoundAPIGatewayListener) ProtoReflect() protoreflect.Message { // Deprecated: Use BoundAPIGatewayListener.ProtoReflect.Descriptor instead. func (*BoundAPIGatewayListener) Descriptor() ([]byte, []int) { - return file_proto_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{47} + return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{47} } func (x *BoundAPIGatewayListener) GetName() string { @@ -4427,7 +4427,7 @@ type InlineCertificate struct { func (x *InlineCertificate) Reset() { *x = InlineCertificate{} if protoimpl.UnsafeEnabled { - mi := &file_proto_pbconfigentry_config_entry_proto_msgTypes[48] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[48] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4440,7 +4440,7 @@ func (x *InlineCertificate) String() string { func (*InlineCertificate) ProtoMessage() {} func (x *InlineCertificate) ProtoReflect() protoreflect.Message { - mi := &file_proto_pbconfigentry_config_entry_proto_msgTypes[48] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[48] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4453,7 +4453,7 @@ func (x *InlineCertificate) ProtoReflect() protoreflect.Message { // Deprecated: Use InlineCertificate.ProtoReflect.Descriptor instead. func (*InlineCertificate) Descriptor() ([]byte, []int) { - return file_proto_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{48} + return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{48} } func (x *InlineCertificate) GetMeta() map[string]string { @@ -4498,7 +4498,7 @@ type HTTPRoute struct { func (x *HTTPRoute) Reset() { *x = HTTPRoute{} if protoimpl.UnsafeEnabled { - mi := &file_proto_pbconfigentry_config_entry_proto_msgTypes[49] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[49] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4511,7 +4511,7 @@ func (x *HTTPRoute) String() string { func (*HTTPRoute) ProtoMessage() {} func (x *HTTPRoute) ProtoReflect() protoreflect.Message { - mi := &file_proto_pbconfigentry_config_entry_proto_msgTypes[49] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[49] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4524,7 +4524,7 @@ func (x *HTTPRoute) ProtoReflect() protoreflect.Message { // Deprecated: Use HTTPRoute.ProtoReflect.Descriptor instead. func (*HTTPRoute) Descriptor() ([]byte, []int) { - return file_proto_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{49} + return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{49} } func (x *HTTPRoute) GetMeta() map[string]string { @@ -4580,7 +4580,7 @@ type HTTPRouteRule struct { func (x *HTTPRouteRule) Reset() { *x = HTTPRouteRule{} if protoimpl.UnsafeEnabled { - mi := &file_proto_pbconfigentry_config_entry_proto_msgTypes[50] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[50] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4593,7 +4593,7 @@ func (x *HTTPRouteRule) String() string { func (*HTTPRouteRule) ProtoMessage() {} func (x *HTTPRouteRule) ProtoReflect() protoreflect.Message { - mi := &file_proto_pbconfigentry_config_entry_proto_msgTypes[50] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[50] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4606,7 +4606,7 @@ func (x *HTTPRouteRule) ProtoReflect() protoreflect.Message { // Deprecated: Use HTTPRouteRule.ProtoReflect.Descriptor instead. func (*HTTPRouteRule) Descriptor() ([]byte, []int) { - return file_proto_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{50} + return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{50} } func (x *HTTPRouteRule) GetFilters() *HTTPFilters { @@ -4650,7 +4650,7 @@ type HTTPMatch struct { func (x *HTTPMatch) Reset() { *x = HTTPMatch{} if protoimpl.UnsafeEnabled { - mi := &file_proto_pbconfigentry_config_entry_proto_msgTypes[51] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[51] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4663,7 +4663,7 @@ func (x *HTTPMatch) String() string { func (*HTTPMatch) ProtoMessage() {} func (x *HTTPMatch) ProtoReflect() protoreflect.Message { - mi := &file_proto_pbconfigentry_config_entry_proto_msgTypes[51] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[51] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4676,7 +4676,7 @@ func (x *HTTPMatch) ProtoReflect() protoreflect.Message { // Deprecated: Use HTTPMatch.ProtoReflect.Descriptor instead. func (*HTTPMatch) Descriptor() ([]byte, []int) { - return file_proto_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{51} + return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{51} } func (x *HTTPMatch) GetHeaders() []*HTTPHeaderMatch { @@ -4726,7 +4726,7 @@ type HTTPHeaderMatch struct { func (x *HTTPHeaderMatch) Reset() { *x = HTTPHeaderMatch{} if protoimpl.UnsafeEnabled { - mi := &file_proto_pbconfigentry_config_entry_proto_msgTypes[52] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[52] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4739,7 +4739,7 @@ func (x *HTTPHeaderMatch) String() string { func (*HTTPHeaderMatch) ProtoMessage() {} func (x *HTTPHeaderMatch) ProtoReflect() protoreflect.Message { - mi := &file_proto_pbconfigentry_config_entry_proto_msgTypes[52] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[52] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4752,7 +4752,7 @@ func (x *HTTPHeaderMatch) ProtoReflect() protoreflect.Message { // Deprecated: Use HTTPHeaderMatch.ProtoReflect.Descriptor instead. func (*HTTPHeaderMatch) Descriptor() ([]byte, []int) { - return file_proto_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{52} + return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{52} } func (x *HTTPHeaderMatch) GetMatch() HTTPHeaderMatchType { @@ -4794,7 +4794,7 @@ type HTTPPathMatch struct { func (x *HTTPPathMatch) Reset() { *x = HTTPPathMatch{} if protoimpl.UnsafeEnabled { - mi := &file_proto_pbconfigentry_config_entry_proto_msgTypes[53] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[53] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4807,7 +4807,7 @@ func (x *HTTPPathMatch) String() string { func (*HTTPPathMatch) ProtoMessage() {} func (x *HTTPPathMatch) ProtoReflect() protoreflect.Message { - mi := &file_proto_pbconfigentry_config_entry_proto_msgTypes[53] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[53] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4820,7 +4820,7 @@ func (x *HTTPPathMatch) ProtoReflect() protoreflect.Message { // Deprecated: Use HTTPPathMatch.ProtoReflect.Descriptor instead. func (*HTTPPathMatch) Descriptor() ([]byte, []int) { - return file_proto_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{53} + return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{53} } func (x *HTTPPathMatch) GetMatch() HTTPPathMatchType { @@ -4856,7 +4856,7 @@ type HTTPQueryMatch struct { func (x *HTTPQueryMatch) Reset() { *x = HTTPQueryMatch{} if protoimpl.UnsafeEnabled { - mi := &file_proto_pbconfigentry_config_entry_proto_msgTypes[54] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[54] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4869,7 +4869,7 @@ func (x *HTTPQueryMatch) String() string { func (*HTTPQueryMatch) ProtoMessage() {} func (x *HTTPQueryMatch) ProtoReflect() protoreflect.Message { - mi := &file_proto_pbconfigentry_config_entry_proto_msgTypes[54] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[54] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4882,7 +4882,7 @@ func (x *HTTPQueryMatch) ProtoReflect() protoreflect.Message { // Deprecated: Use HTTPQueryMatch.ProtoReflect.Descriptor instead. func (*HTTPQueryMatch) Descriptor() ([]byte, []int) { - return file_proto_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{54} + return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{54} } func (x *HTTPQueryMatch) GetMatch() HTTPQueryMatchType { @@ -4923,7 +4923,7 @@ type HTTPFilters struct { func (x *HTTPFilters) Reset() { *x = HTTPFilters{} if protoimpl.UnsafeEnabled { - mi := &file_proto_pbconfigentry_config_entry_proto_msgTypes[55] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[55] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4936,7 +4936,7 @@ func (x *HTTPFilters) String() string { func (*HTTPFilters) ProtoMessage() {} func (x *HTTPFilters) ProtoReflect() protoreflect.Message { - mi := &file_proto_pbconfigentry_config_entry_proto_msgTypes[55] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[55] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4949,7 +4949,7 @@ func (x *HTTPFilters) ProtoReflect() protoreflect.Message { // Deprecated: Use HTTPFilters.ProtoReflect.Descriptor instead. func (*HTTPFilters) Descriptor() ([]byte, []int) { - return file_proto_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{55} + return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{55} } func (x *HTTPFilters) GetHeaders() []*HTTPHeaderFilter { @@ -4982,7 +4982,7 @@ type URLRewrite struct { func (x *URLRewrite) Reset() { *x = URLRewrite{} if protoimpl.UnsafeEnabled { - mi := &file_proto_pbconfigentry_config_entry_proto_msgTypes[56] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[56] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4995,7 +4995,7 @@ func (x *URLRewrite) String() string { func (*URLRewrite) ProtoMessage() {} func (x *URLRewrite) ProtoReflect() protoreflect.Message { - mi := &file_proto_pbconfigentry_config_entry_proto_msgTypes[56] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[56] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5008,7 +5008,7 @@ func (x *URLRewrite) ProtoReflect() protoreflect.Message { // Deprecated: Use URLRewrite.ProtoReflect.Descriptor instead. func (*URLRewrite) Descriptor() ([]byte, []int) { - return file_proto_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{56} + return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{56} } func (x *URLRewrite) GetPath() string { @@ -5036,7 +5036,7 @@ type HTTPHeaderFilter struct { func (x *HTTPHeaderFilter) Reset() { *x = HTTPHeaderFilter{} if protoimpl.UnsafeEnabled { - mi := &file_proto_pbconfigentry_config_entry_proto_msgTypes[57] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[57] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5049,7 +5049,7 @@ func (x *HTTPHeaderFilter) String() string { func (*HTTPHeaderFilter) ProtoMessage() {} func (x *HTTPHeaderFilter) ProtoReflect() protoreflect.Message { - mi := &file_proto_pbconfigentry_config_entry_proto_msgTypes[57] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[57] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5062,7 +5062,7 @@ func (x *HTTPHeaderFilter) ProtoReflect() protoreflect.Message { // Deprecated: Use HTTPHeaderFilter.ProtoReflect.Descriptor instead. func (*HTTPHeaderFilter) Descriptor() ([]byte, []int) { - return file_proto_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{57} + return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{57} } func (x *HTTPHeaderFilter) GetAdd() map[string]string { @@ -5107,7 +5107,7 @@ type HTTPService struct { func (x *HTTPService) Reset() { *x = HTTPService{} if protoimpl.UnsafeEnabled { - mi := &file_proto_pbconfigentry_config_entry_proto_msgTypes[58] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[58] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5120,7 +5120,7 @@ func (x *HTTPService) String() string { func (*HTTPService) ProtoMessage() {} func (x *HTTPService) ProtoReflect() protoreflect.Message { - mi := &file_proto_pbconfigentry_config_entry_proto_msgTypes[58] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[58] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5133,7 +5133,7 @@ func (x *HTTPService) ProtoReflect() protoreflect.Message { // Deprecated: Use HTTPService.ProtoReflect.Descriptor instead. func (*HTTPService) Descriptor() ([]byte, []int) { - return file_proto_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{58} + return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{58} } func (x *HTTPService) GetName() string { @@ -5184,7 +5184,7 @@ type TCPRoute struct { func (x *TCPRoute) Reset() { *x = TCPRoute{} if protoimpl.UnsafeEnabled { - mi := &file_proto_pbconfigentry_config_entry_proto_msgTypes[59] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[59] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5197,7 +5197,7 @@ func (x *TCPRoute) String() string { func (*TCPRoute) ProtoMessage() {} func (x *TCPRoute) ProtoReflect() protoreflect.Message { - mi := &file_proto_pbconfigentry_config_entry_proto_msgTypes[59] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[59] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5210,7 +5210,7 @@ func (x *TCPRoute) ProtoReflect() protoreflect.Message { // Deprecated: Use TCPRoute.ProtoReflect.Descriptor instead. func (*TCPRoute) Descriptor() ([]byte, []int) { - return file_proto_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{59} + return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{59} } func (x *TCPRoute) GetMeta() map[string]string { @@ -5261,7 +5261,7 @@ type TCPService struct { func (x *TCPService) Reset() { *x = TCPService{} if protoimpl.UnsafeEnabled { - mi := &file_proto_pbconfigentry_config_entry_proto_msgTypes[60] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[60] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5274,7 +5274,7 @@ func (x *TCPService) String() string { func (*TCPService) ProtoMessage() {} func (x *TCPService) ProtoReflect() protoreflect.Message { - mi := &file_proto_pbconfigentry_config_entry_proto_msgTypes[60] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[60] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5287,7 +5287,7 @@ func (x *TCPService) ProtoReflect() protoreflect.Message { // Deprecated: Use TCPService.ProtoReflect.Descriptor instead. func (*TCPService) Descriptor() ([]byte, []int) { - return file_proto_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{60} + return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{60} } func (x *TCPService) GetName() string { @@ -5311,1171 +5311,1171 @@ func (x *TCPService) GetEnterpriseMeta() *pbcommon.EnterpriseMeta { return nil } -var File_proto_pbconfigentry_config_entry_proto protoreflect.FileDescriptor +var File_private_pbconfigentry_config_entry_proto protoreflect.FileDescriptor -var file_proto_pbconfigentry_config_entry_proto_rawDesc = []byte{ - 0x0a, 0x26, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x70, 0x62, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x65, 0x6e, 0x74, - 0x72, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x25, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, - 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, - 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x1a, - 0x1e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2f, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, - 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x1a, 0x1b, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x70, 0x62, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, - 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xbc, 0x09, - 0x0a, 0x0b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x3f, 0x0a, - 0x04, 0x4b, 0x69, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2b, 0x2e, 0x68, 0x61, - 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, - 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, - 0x74, 0x72, 0x79, 0x2e, 0x4b, 0x69, 0x6e, 0x64, 0x52, 0x04, 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x12, - 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, - 0x6d, 0x65, 0x12, 0x58, 0x0a, 0x0e, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, - 0x4d, 0x65, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x68, 0x61, 0x73, - 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, - 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6e, - 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x52, 0x0e, 0x45, 0x6e, - 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x49, 0x0a, 0x09, - 0x52, 0x61, 0x66, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, +var file_private_pbconfigentry_config_entry_proto_rawDesc = []byte{ + 0x0a, 0x28, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2f, 0x70, 0x62, 0x63, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x65, + 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x25, 0x68, 0x61, 0x73, 0x68, + 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, + 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, + 0x79, 0x1a, 0x1e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2f, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x1a, 0x1d, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2f, 0x70, 0x62, 0x63, 0x6f, + 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x22, 0xbc, 0x09, 0x0a, 0x0b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x12, 0x3f, 0x0a, 0x04, 0x4b, 0x69, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2b, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, - 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, - 0x6f, 0x6e, 0x2e, 0x52, 0x61, 0x66, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x09, 0x52, 0x61, - 0x66, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x53, 0x0a, 0x0a, 0x4d, 0x65, 0x73, 0x68, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x68, 0x61, - 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, - 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, - 0x74, 0x72, 0x79, 0x2e, 0x4d, 0x65, 0x73, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x48, 0x00, - 0x52, 0x0a, 0x4d, 0x65, 0x73, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x62, 0x0a, 0x0f, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, - 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, - 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x53, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x48, 0x00, 0x52, - 0x0f, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, - 0x12, 0x5f, 0x0a, 0x0e, 0x49, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x47, 0x61, 0x74, 0x65, 0x77, - 0x61, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, - 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, - 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, - 0x2e, 0x49, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x48, - 0x00, 0x52, 0x0e, 0x49, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, - 0x79, 0x12, 0x68, 0x0a, 0x11, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x74, 0x65, - 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x68, + 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x4b, 0x69, 0x6e, 0x64, 0x52, 0x04, 0x4b, 0x69, + 0x6e, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x58, 0x0a, 0x0e, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x70, + 0x72, 0x69, 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, + 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, + 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, + 0x6e, 0x2e, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, + 0x52, 0x0e, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, + 0x12, 0x49, 0x0a, 0x09, 0x52, 0x61, 0x66, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, + 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, + 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x52, 0x61, 0x66, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, + 0x52, 0x09, 0x52, 0x61, 0x66, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x53, 0x0a, 0x0a, 0x4d, + 0x65, 0x73, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x31, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, + 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x4d, 0x65, 0x73, 0x68, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x48, 0x00, 0x52, 0x0a, 0x4d, 0x65, 0x73, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x12, 0x62, 0x0a, 0x0f, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x6c, + 0x76, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x68, 0x61, 0x73, 0x68, + 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, + 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, + 0x79, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, + 0x72, 0x48, 0x00, 0x52, 0x0f, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x6f, + 0x6c, 0x76, 0x65, 0x72, 0x12, 0x5f, 0x0a, 0x0e, 0x49, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x47, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, - 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x74, 0x65, - 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x48, 0x00, 0x52, 0x11, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x62, 0x0a, 0x0f, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x09, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, - 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, - 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x53, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x48, 0x00, 0x52, 0x0f, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x12, - 0x53, 0x0a, 0x0a, 0x41, 0x50, 0x49, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x18, 0x0a, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, - 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, - 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x41, 0x50, 0x49, 0x47, - 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x48, 0x00, 0x52, 0x0a, 0x41, 0x50, 0x49, 0x47, 0x61, 0x74, - 0x65, 0x77, 0x61, 0x79, 0x12, 0x62, 0x0a, 0x0f, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x41, 0x50, 0x49, - 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x36, 0x2e, - 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, - 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x41, 0x50, 0x49, 0x47, 0x61, - 0x74, 0x65, 0x77, 0x61, 0x79, 0x48, 0x00, 0x52, 0x0f, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x41, 0x50, - 0x49, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x12, 0x4d, 0x0a, 0x08, 0x54, 0x43, 0x50, 0x52, - 0x6f, 0x75, 0x74, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x68, 0x61, 0x73, - 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, - 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, - 0x72, 0x79, 0x2e, 0x54, 0x43, 0x50, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x48, 0x00, 0x52, 0x08, 0x54, - 0x43, 0x50, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x12, 0x50, 0x0a, 0x09, 0x48, 0x54, 0x54, 0x50, 0x52, - 0x6f, 0x75, 0x74, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x68, 0x61, 0x73, - 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, - 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, - 0x72, 0x79, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x48, 0x00, 0x52, 0x09, - 0x48, 0x54, 0x54, 0x50, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x12, 0x68, 0x0a, 0x11, 0x49, 0x6e, 0x6c, - 0x69, 0x6e, 0x65, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x18, 0x0e, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, - 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, - 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x49, 0x6e, 0x6c, - 0x69, 0x6e, 0x65, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x48, 0x00, - 0x52, 0x11, 0x49, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, - 0x61, 0x74, 0x65, 0x42, 0x07, 0x0a, 0x05, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x22, 0xec, 0x03, 0x0a, - 0x0a, 0x4d, 0x65, 0x73, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x6d, 0x0a, 0x10, 0x54, - 0x72, 0x61, 0x6e, 0x73, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x41, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, - 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, - 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x54, 0x72, - 0x61, 0x6e, 0x73, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x4d, 0x65, - 0x73, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x10, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, - 0x61, 0x72, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x12, 0x46, 0x0a, 0x03, 0x54, 0x4c, - 0x53, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, + 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x49, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x47, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x48, 0x00, 0x52, 0x0e, 0x49, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x47, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x12, 0x68, 0x0a, 0x11, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x38, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, + 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x48, 0x00, 0x52, 0x11, 0x53, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, + 0x62, 0x0a, 0x0f, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, + 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, + 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, + 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, + 0x48, 0x00, 0x52, 0x0f, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x44, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x73, 0x12, 0x53, 0x0a, 0x0a, 0x41, 0x50, 0x49, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, + 0x79, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, - 0x4d, 0x65, 0x73, 0x68, 0x54, 0x4c, 0x53, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x03, 0x54, - 0x4c, 0x53, 0x12, 0x49, 0x0a, 0x04, 0x48, 0x54, 0x54, 0x50, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x35, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, - 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x4d, 0x65, 0x73, 0x68, 0x48, 0x54, 0x54, - 0x50, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x04, 0x48, 0x54, 0x54, 0x50, 0x12, 0x4f, 0x0a, - 0x04, 0x4d, 0x65, 0x74, 0x61, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3b, 0x2e, 0x68, 0x61, + 0x41, 0x50, 0x49, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x48, 0x00, 0x52, 0x0a, 0x41, 0x50, + 0x49, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x12, 0x62, 0x0a, 0x0f, 0x42, 0x6f, 0x75, 0x6e, + 0x64, 0x41, 0x50, 0x49, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x18, 0x0b, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x36, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, + 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x41, + 0x50, 0x49, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x48, 0x00, 0x52, 0x0f, 0x42, 0x6f, 0x75, + 0x6e, 0x64, 0x41, 0x50, 0x49, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x12, 0x4d, 0x0a, 0x08, + 0x54, 0x43, 0x50, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, + 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, + 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x54, 0x43, 0x50, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x48, + 0x00, 0x52, 0x08, 0x54, 0x43, 0x50, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x12, 0x50, 0x0a, 0x09, 0x48, + 0x54, 0x54, 0x50, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, + 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, + 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x52, 0x6f, 0x75, 0x74, 0x65, + 0x48, 0x00, 0x52, 0x09, 0x48, 0x54, 0x54, 0x50, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x12, 0x68, 0x0a, + 0x11, 0x49, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, + 0x74, 0x65, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, + 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, + 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, + 0x2e, 0x49, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, + 0x74, 0x65, 0x48, 0x00, 0x52, 0x11, 0x49, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x43, 0x65, 0x72, 0x74, + 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x42, 0x07, 0x0a, 0x05, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x22, 0xec, 0x03, 0x0a, 0x0a, 0x4d, 0x65, 0x73, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, + 0x6d, 0x0a, 0x10, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x50, 0x72, + 0x6f, 0x78, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x41, 0x2e, 0x68, 0x61, 0x73, 0x68, + 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, + 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, + 0x79, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, + 0x78, 0x79, 0x4d, 0x65, 0x73, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x10, 0x54, 0x72, + 0x61, 0x6e, 0x73, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x12, 0x46, + 0x0a, 0x03, 0x54, 0x4c, 0x53, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, - 0x74, 0x72, 0x79, 0x2e, 0x4d, 0x65, 0x73, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x4d, - 0x65, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x52, - 0x0a, 0x07, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x38, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, + 0x74, 0x72, 0x79, 0x2e, 0x4d, 0x65, 0x73, 0x68, 0x54, 0x4c, 0x53, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x52, 0x03, 0x54, 0x4c, 0x53, 0x12, 0x49, 0x0a, 0x04, 0x48, 0x54, 0x54, 0x50, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, + 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, + 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x4d, 0x65, 0x73, + 0x68, 0x48, 0x54, 0x54, 0x50, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x04, 0x48, 0x54, 0x54, + 0x50, 0x12, 0x4f, 0x0a, 0x04, 0x4d, 0x65, 0x74, 0x61, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x3b, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x4d, - 0x65, 0x73, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x07, 0x50, 0x65, 0x65, 0x72, 0x69, - 0x6e, 0x67, 0x1a, 0x37, 0x0a, 0x09, 0x4d, 0x65, 0x74, 0x61, 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, 0x22, 0x50, 0x0a, 0x1a, 0x54, - 0x72, 0x61, 0x6e, 0x73, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x4d, - 0x65, 0x73, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x32, 0x0a, 0x14, 0x4d, 0x65, 0x73, + 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x4d, 0x65, 0x73, 0x68, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x4d, 0x65, + 0x74, 0x61, 0x12, 0x52, 0x0a, 0x07, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, + 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, + 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x50, 0x65, 0x65, 0x72, + 0x69, 0x6e, 0x67, 0x4d, 0x65, 0x73, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x07, 0x50, + 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x1a, 0x37, 0x0a, 0x09, 0x4d, 0x65, 0x74, 0x61, 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, 0x22, + 0x50, 0x0a, 0x1a, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x50, 0x72, + 0x6f, 0x78, 0x79, 0x4d, 0x65, 0x73, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x32, 0x0a, + 0x14, 0x4d, 0x65, 0x73, 0x68, 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x4f, 0x6e, 0x6c, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x4d, 0x65, 0x73, 0x68, 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x4f, 0x6e, 0x6c, - 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x4d, 0x65, 0x73, 0x68, 0x44, 0x65, 0x73, - 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x4f, 0x6e, 0x6c, 0x79, 0x22, 0xc9, 0x01, - 0x0a, 0x0d, 0x4d, 0x65, 0x73, 0x68, 0x54, 0x4c, 0x53, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, - 0x5b, 0x0a, 0x08, 0x49, 0x6e, 0x63, 0x6f, 0x6d, 0x69, 0x6e, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x3f, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, - 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x4d, 0x65, 0x73, 0x68, 0x44, 0x69, - 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x54, 0x4c, 0x53, 0x43, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x52, 0x08, 0x49, 0x6e, 0x63, 0x6f, 0x6d, 0x69, 0x6e, 0x67, 0x12, 0x5b, 0x0a, 0x08, - 0x4f, 0x75, 0x74, 0x67, 0x6f, 0x69, 0x6e, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3f, - 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, - 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x4d, 0x65, 0x73, 0x68, 0x44, 0x69, 0x72, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x54, 0x4c, 0x53, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, - 0x08, 0x4f, 0x75, 0x74, 0x67, 0x6f, 0x69, 0x6e, 0x67, 0x22, 0x8a, 0x01, 0x0a, 0x18, 0x4d, 0x65, + 0x79, 0x22, 0xc9, 0x01, 0x0a, 0x0d, 0x4d, 0x65, 0x73, 0x68, 0x54, 0x4c, 0x53, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x12, 0x5b, 0x0a, 0x08, 0x49, 0x6e, 0x63, 0x6f, 0x6d, 0x69, 0x6e, 0x67, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3f, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, + 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, + 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x4d, 0x65, 0x73, 0x68, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x54, 0x4c, 0x53, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x24, 0x0a, 0x0d, 0x54, 0x4c, 0x53, 0x4d, 0x69, 0x6e, - 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x54, - 0x4c, 0x53, 0x4d, 0x69, 0x6e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x0a, 0x0d, - 0x54, 0x4c, 0x53, 0x4d, 0x61, 0x78, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0d, 0x54, 0x4c, 0x53, 0x4d, 0x61, 0x78, 0x56, 0x65, 0x72, 0x73, 0x69, - 0x6f, 0x6e, 0x12, 0x22, 0x0a, 0x0c, 0x43, 0x69, 0x70, 0x68, 0x65, 0x72, 0x53, 0x75, 0x69, 0x74, - 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x43, 0x69, 0x70, 0x68, 0x65, 0x72, - 0x53, 0x75, 0x69, 0x74, 0x65, 0x73, 0x22, 0x54, 0x0a, 0x0e, 0x4d, 0x65, 0x73, 0x68, 0x48, 0x54, - 0x54, 0x50, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x42, 0x0a, 0x1c, 0x53, 0x61, 0x6e, 0x69, - 0x74, 0x69, 0x7a, 0x65, 0x58, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x65, 0x64, 0x43, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x43, 0x65, 0x72, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x1c, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x08, 0x49, 0x6e, 0x63, 0x6f, 0x6d, 0x69, 0x6e, 0x67, + 0x12, 0x5b, 0x0a, 0x08, 0x4f, 0x75, 0x74, 0x67, 0x6f, 0x69, 0x6e, 0x67, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x3f, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, + 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x4d, 0x65, 0x73, 0x68, 0x44, + 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x54, 0x4c, 0x53, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x52, 0x08, 0x4f, 0x75, 0x74, 0x67, 0x6f, 0x69, 0x6e, 0x67, 0x22, 0x8a, 0x01, + 0x0a, 0x18, 0x4d, 0x65, 0x73, 0x68, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x61, + 0x6c, 0x54, 0x4c, 0x53, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x24, 0x0a, 0x0d, 0x54, 0x4c, + 0x53, 0x4d, 0x69, 0x6e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0d, 0x54, 0x4c, 0x53, 0x4d, 0x69, 0x6e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x12, 0x24, 0x0a, 0x0d, 0x54, 0x4c, 0x53, 0x4d, 0x61, 0x78, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x54, 0x4c, 0x53, 0x4d, 0x61, 0x78, 0x56, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x22, 0x0a, 0x0c, 0x43, 0x69, 0x70, 0x68, 0x65, 0x72, + 0x53, 0x75, 0x69, 0x74, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x43, 0x69, + 0x70, 0x68, 0x65, 0x72, 0x53, 0x75, 0x69, 0x74, 0x65, 0x73, 0x22, 0x54, 0x0a, 0x0e, 0x4d, 0x65, + 0x73, 0x68, 0x48, 0x54, 0x54, 0x50, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x42, 0x0a, 0x1c, 0x53, 0x61, 0x6e, 0x69, 0x74, 0x69, 0x7a, 0x65, 0x58, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, - 0x65, 0x64, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x65, 0x72, 0x74, 0x22, 0x4d, 0x0a, 0x11, - 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x65, 0x73, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x12, 0x38, 0x0a, 0x17, 0x50, 0x65, 0x65, 0x72, 0x54, 0x68, 0x72, 0x6f, 0x75, 0x67, 0x68, - 0x4d, 0x65, 0x73, 0x68, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x73, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x17, 0x50, 0x65, 0x65, 0x72, 0x54, 0x68, 0x72, 0x6f, 0x75, 0x67, 0x68, 0x4d, - 0x65, 0x73, 0x68, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x73, 0x22, 0xf6, 0x06, 0x0a, 0x0f, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x12, - 0x24, 0x0a, 0x0d, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x53, 0x75, 0x62, 0x73, 0x65, 0x74, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x53, - 0x75, 0x62, 0x73, 0x65, 0x74, 0x12, 0x5d, 0x0a, 0x07, 0x53, 0x75, 0x62, 0x73, 0x65, 0x74, 0x73, - 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x43, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, - 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, - 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x2e, 0x53, - 0x75, 0x62, 0x73, 0x65, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x53, 0x75, 0x62, - 0x73, 0x65, 0x74, 0x73, 0x12, 0x5a, 0x0a, 0x08, 0x52, 0x65, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3e, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, + 0x65, 0x64, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x65, 0x72, 0x74, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x1c, 0x53, 0x61, 0x6e, 0x69, 0x74, 0x69, 0x7a, 0x65, 0x58, 0x46, 0x6f, 0x72, + 0x77, 0x61, 0x72, 0x64, 0x65, 0x64, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x65, 0x72, 0x74, + 0x22, 0x4d, 0x0a, 0x11, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x65, 0x73, 0x68, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x38, 0x0a, 0x17, 0x50, 0x65, 0x65, 0x72, 0x54, 0x68, 0x72, + 0x6f, 0x75, 0x67, 0x68, 0x4d, 0x65, 0x73, 0x68, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x73, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x17, 0x50, 0x65, 0x65, 0x72, 0x54, 0x68, 0x72, 0x6f, + 0x75, 0x67, 0x68, 0x4d, 0x65, 0x73, 0x68, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x73, 0x22, + 0xf6, 0x06, 0x0a, 0x0f, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x6c, + 0x76, 0x65, 0x72, 0x12, 0x24, 0x0a, 0x0d, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x53, 0x75, + 0x62, 0x73, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x44, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x53, 0x75, 0x62, 0x73, 0x65, 0x74, 0x12, 0x5d, 0x0a, 0x07, 0x53, 0x75, 0x62, + 0x73, 0x65, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x43, 0x2e, 0x68, 0x61, 0x73, + 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, + 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, + 0x72, 0x79, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, + 0x65, 0x72, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x65, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, + 0x07, 0x53, 0x75, 0x62, 0x73, 0x65, 0x74, 0x73, 0x12, 0x5a, 0x0a, 0x08, 0x52, 0x65, 0x64, 0x69, + 0x72, 0x65, 0x63, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3e, 0x2e, 0x68, 0x61, 0x73, + 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, + 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, + 0x72, 0x79, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, + 0x65, 0x72, 0x52, 0x65, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x52, 0x08, 0x52, 0x65, 0x64, 0x69, + 0x72, 0x65, 0x63, 0x74, 0x12, 0x60, 0x0a, 0x08, 0x46, 0x61, 0x69, 0x6c, 0x6f, 0x76, 0x65, 0x72, + 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x44, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x52, 0x65, - 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x52, 0x08, 0x52, 0x65, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, - 0x12, 0x60, 0x0a, 0x08, 0x46, 0x61, 0x69, 0x6c, 0x6f, 0x76, 0x65, 0x72, 0x18, 0x04, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x44, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, - 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x2e, 0x46, 0x61, 0x69, 0x6c, 0x6f, - 0x76, 0x65, 0x72, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x46, 0x61, 0x69, 0x6c, 0x6f, 0x76, - 0x65, 0x72, 0x12, 0x41, 0x0a, 0x0e, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x54, 0x69, 0x6d, - 0x65, 0x6f, 0x75, 0x74, 0x18, 0x05, 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, 0x52, 0x0e, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x54, 0x69, - 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x57, 0x0a, 0x0c, 0x4c, 0x6f, 0x61, 0x64, 0x42, 0x61, 0x6c, - 0x61, 0x6e, 0x63, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x68, 0x61, - 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, - 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, - 0x74, 0x72, 0x79, 0x2e, 0x4c, 0x6f, 0x61, 0x64, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x72, - 0x52, 0x0c, 0x4c, 0x6f, 0x61, 0x64, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x72, 0x12, 0x54, - 0x0a, 0x04, 0x4d, 0x65, 0x74, 0x61, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x40, 0x2e, 0x68, - 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, - 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, - 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x6f, - 0x6c, 0x76, 0x65, 0x72, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, - 0x4d, 0x65, 0x74, 0x61, 0x1a, 0x78, 0x0a, 0x0c, 0x53, 0x75, 0x62, 0x73, 0x65, 0x74, 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, 0x52, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3c, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, - 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, - 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x53, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x53, 0x75, 0x62, - 0x73, 0x65, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x7b, - 0x0a, 0x0d, 0x46, 0x61, 0x69, 0x6c, 0x6f, 0x76, 0x65, 0x72, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, - 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, - 0x79, 0x12, 0x54, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x3e, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x2e, 0x46, + 0x61, 0x69, 0x6c, 0x6f, 0x76, 0x65, 0x72, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x46, 0x61, + 0x69, 0x6c, 0x6f, 0x76, 0x65, 0x72, 0x12, 0x41, 0x0a, 0x0e, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, + 0x74, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x05, 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, 0x52, 0x0e, 0x43, 0x6f, 0x6e, 0x6e, 0x65, + 0x63, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x57, 0x0a, 0x0c, 0x4c, 0x6f, 0x61, + 0x64, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x33, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, + 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x4c, 0x6f, 0x61, 0x64, 0x42, 0x61, 0x6c, 0x61, + 0x6e, 0x63, 0x65, 0x72, 0x52, 0x0c, 0x4c, 0x6f, 0x61, 0x64, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, + 0x65, 0x72, 0x12, 0x54, 0x0a, 0x04, 0x4d, 0x65, 0x74, 0x61, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x40, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x46, 0x61, 0x69, 0x6c, 0x6f, 0x76, 0x65, 0x72, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x37, 0x0a, 0x09, 0x4d, - 0x65, 0x74, 0x61, 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, 0x22, 0x51, 0x0a, 0x15, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, - 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x53, 0x75, 0x62, 0x73, 0x65, 0x74, 0x12, 0x16, 0x0a, - 0x06, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x46, - 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x20, 0x0a, 0x0b, 0x4f, 0x6e, 0x6c, 0x79, 0x50, 0x61, 0x73, - 0x73, 0x69, 0x6e, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x4f, 0x6e, 0x6c, 0x79, - 0x50, 0x61, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x22, 0xc9, 0x01, 0x0a, 0x17, 0x53, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x52, 0x65, 0x64, 0x69, 0x72, - 0x65, 0x63, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x18, 0x01, + 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x52, 0x04, 0x4d, 0x65, 0x74, 0x61, 0x1a, 0x78, 0x0a, 0x0c, 0x53, 0x75, 0x62, 0x73, + 0x65, 0x74, 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, 0x52, 0x0a, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3c, 0x2e, 0x68, 0x61, 0x73, 0x68, + 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, + 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, + 0x79, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, + 0x72, 0x53, 0x75, 0x62, 0x73, 0x65, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, + 0x38, 0x01, 0x1a, 0x7b, 0x0a, 0x0d, 0x46, 0x61, 0x69, 0x6c, 0x6f, 0x76, 0x65, 0x72, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x54, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3e, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, + 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, + 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x53, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x46, 0x61, 0x69, 0x6c, + 0x6f, 0x76, 0x65, 0x72, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, + 0x37, 0x0a, 0x09, 0x4d, 0x65, 0x74, 0x61, 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, 0x22, 0x51, 0x0a, 0x15, 0x53, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x53, 0x75, 0x62, 0x73, 0x65, + 0x74, 0x12, 0x16, 0x0a, 0x06, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x06, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x20, 0x0a, 0x0b, 0x4f, 0x6e, 0x6c, + 0x79, 0x50, 0x61, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, + 0x4f, 0x6e, 0x6c, 0x79, 0x50, 0x61, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x22, 0xc9, 0x01, 0x0a, 0x17, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x52, + 0x65, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x75, 0x62, 0x73, + 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x53, 0x75, 0x62, 0x73, 0x65, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x4e, 0x61, 0x6d, 0x65, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x4e, 0x61, 0x6d, 0x65, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x44, 0x61, 0x74, 0x61, 0x63, 0x65, 0x6e, 0x74, 0x65, + 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x44, 0x61, 0x74, 0x61, 0x63, 0x65, 0x6e, + 0x74, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x65, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x50, 0x65, 0x65, 0x72, 0x22, 0xf9, 0x01, 0x0a, 0x17, 0x53, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x46, 0x61, 0x69, 0x6c, 0x6f, + 0x76, 0x65, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x75, 0x62, 0x73, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x75, 0x62, 0x73, 0x65, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, - 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, - 0x1e, 0x0a, 0x0a, 0x44, 0x61, 0x74, 0x61, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0a, 0x44, 0x61, 0x74, 0x61, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x12, - 0x12, 0x0a, 0x04, 0x50, 0x65, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x50, - 0x65, 0x65, 0x72, 0x22, 0xf9, 0x01, 0x0a, 0x17, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, - 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x46, 0x61, 0x69, 0x6c, 0x6f, 0x76, 0x65, 0x72, 0x12, - 0x18, 0x0a, 0x07, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x07, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x53, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x53, 0x75, 0x62, 0x73, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x75, 0x62, 0x73, 0x65, 0x74, 0x12, - 0x1c, 0x0a, 0x09, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x09, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x20, 0x0a, - 0x0b, 0x44, 0x61, 0x74, 0x61, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x18, 0x04, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x0b, 0x44, 0x61, 0x74, 0x61, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x12, - 0x5e, 0x0a, 0x07, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x44, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, - 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x46, 0x61, 0x69, 0x6c, 0x6f, 0x76, 0x65, 0x72, - 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x07, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x22, - 0xcf, 0x01, 0x0a, 0x1d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x6c, - 0x76, 0x65, 0x72, 0x46, 0x61, 0x69, 0x6c, 0x6f, 0x76, 0x65, 0x72, 0x54, 0x61, 0x72, 0x67, 0x65, - 0x74, 0x12, 0x18, 0x0a, 0x07, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x07, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x75, 0x62, 0x73, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x75, 0x62, 0x73, 0x65, - 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, - 0x1c, 0x0a, 0x09, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x09, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1e, 0x0a, - 0x0a, 0x44, 0x61, 0x74, 0x61, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0a, 0x44, 0x61, 0x74, 0x61, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x12, 0x12, 0x0a, - 0x04, 0x50, 0x65, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x50, 0x65, 0x65, - 0x72, 0x22, 0xc7, 0x02, 0x0a, 0x0c, 0x4c, 0x6f, 0x61, 0x64, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, - 0x65, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x06, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x5d, 0x0a, 0x0e, 0x52, 0x69, - 0x6e, 0x67, 0x48, 0x61, 0x73, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, - 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x52, 0x69, 0x6e, 0x67, 0x48, - 0x61, 0x73, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x0e, 0x52, 0x69, 0x6e, 0x67, 0x48, - 0x61, 0x73, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x69, 0x0a, 0x12, 0x4c, 0x65, 0x61, - 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, - 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, - 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x4c, 0x65, - 0x61, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x52, 0x12, 0x4c, 0x65, 0x61, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x43, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x12, 0x55, 0x0a, 0x0c, 0x48, 0x61, 0x73, 0x68, 0x50, 0x6f, 0x6c, 0x69, - 0x63, 0x69, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x68, 0x61, 0x73, - 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, - 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, - 0x72, 0x79, 0x2e, 0x48, 0x61, 0x73, 0x68, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x0c, 0x48, - 0x61, 0x73, 0x68, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x22, 0x64, 0x0a, 0x0e, 0x52, - 0x69, 0x6e, 0x67, 0x48, 0x61, 0x73, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x28, 0x0a, - 0x0f, 0x4d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x52, 0x69, 0x6e, 0x67, 0x53, 0x69, 0x7a, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0f, 0x4d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x52, - 0x69, 0x6e, 0x67, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x4d, 0x61, 0x78, 0x69, 0x6d, - 0x75, 0x6d, 0x52, 0x69, 0x6e, 0x67, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, - 0x52, 0x0f, 0x4d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x52, 0x69, 0x6e, 0x67, 0x53, 0x69, 0x7a, - 0x65, 0x22, 0x36, 0x0a, 0x12, 0x4c, 0x65, 0x61, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x20, 0x0a, 0x0b, 0x43, 0x68, 0x6f, 0x69, 0x63, - 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x43, 0x68, - 0x6f, 0x69, 0x63, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0xd3, 0x01, 0x0a, 0x0a, 0x48, 0x61, - 0x73, 0x68, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x46, 0x69, 0x65, 0x6c, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x1e, - 0x0a, 0x0a, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0a, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x57, - 0x0a, 0x0c, 0x43, 0x6f, 0x6f, 0x6b, 0x69, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, + 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x44, 0x61, 0x74, 0x61, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x73, + 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0b, 0x44, 0x61, 0x74, 0x61, 0x63, 0x65, 0x6e, 0x74, + 0x65, 0x72, 0x73, 0x12, 0x5e, 0x0a, 0x07, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x18, 0x05, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x44, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, - 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x43, 0x6f, 0x6f, - 0x6b, 0x69, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x0c, 0x43, 0x6f, 0x6f, 0x6b, 0x69, - 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x1a, 0x0a, 0x08, 0x53, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x49, 0x50, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x53, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x49, 0x50, 0x12, 0x1a, 0x0a, 0x08, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x6c, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x6c, 0x22, - 0x69, 0x0a, 0x0c, 0x43, 0x6f, 0x6f, 0x6b, 0x69, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, - 0x18, 0x0a, 0x07, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x07, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2b, 0x0a, 0x03, 0x54, 0x54, 0x4c, - 0x18, 0x02, 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, 0x52, 0x03, 0x54, 0x54, 0x4c, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x61, 0x74, 0x68, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x50, 0x61, 0x74, 0x68, 0x22, 0x98, 0x03, 0x0a, 0x0e, 0x49, - 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x12, 0x49, 0x0a, - 0x03, 0x54, 0x4c, 0x53, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x68, 0x61, 0x73, - 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, - 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, - 0x72, 0x79, 0x2e, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x54, 0x4c, 0x53, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x52, 0x03, 0x54, 0x4c, 0x53, 0x12, 0x54, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, - 0x65, 0x6e, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x68, 0x61, - 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, - 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, - 0x74, 0x72, 0x79, 0x2e, 0x49, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x65, - 0x6e, 0x65, 0x72, 0x52, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x73, 0x12, 0x53, - 0x0a, 0x04, 0x4d, 0x65, 0x74, 0x61, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3f, 0x2e, 0x68, - 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, - 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, - 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x49, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x47, 0x61, 0x74, 0x65, - 0x77, 0x61, 0x79, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x4d, - 0x65, 0x74, 0x61, 0x12, 0x57, 0x0a, 0x08, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3b, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, - 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, - 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x49, 0x6e, - 0x67, 0x72, 0x65, 0x73, 0x73, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x52, 0x08, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x1a, 0x37, 0x0a, 0x09, - 0x4d, 0x65, 0x74, 0x61, 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, 0x22, 0x8f, 0x02, 0x0a, 0x14, 0x49, 0x6e, 0x67, 0x72, 0x65, 0x73, - 0x73, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x26, - 0x0a, 0x0e, 0x4d, 0x61, 0x78, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0e, 0x4d, 0x61, 0x78, 0x43, 0x6f, 0x6e, 0x6e, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2e, 0x0a, 0x12, 0x4d, 0x61, 0x78, 0x50, 0x65, 0x6e, - 0x64, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x12, 0x4d, 0x61, 0x78, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x4d, 0x61, 0x78, 0x43, 0x6f, 0x6e, - 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x15, 0x4d, 0x61, 0x78, 0x43, 0x6f, 0x6e, 0x63, 0x75, 0x72, - 0x72, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x12, 0x69, 0x0a, 0x12, - 0x50, 0x61, 0x73, 0x73, 0x69, 0x76, 0x65, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, - 0x63, 0x6b, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, + 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x53, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x46, 0x61, 0x69, 0x6c, + 0x6f, 0x76, 0x65, 0x72, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x07, 0x54, 0x61, 0x72, 0x67, + 0x65, 0x74, 0x73, 0x22, 0xcf, 0x01, 0x0a, 0x1d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, + 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x46, 0x61, 0x69, 0x6c, 0x6f, 0x76, 0x65, 0x72, 0x54, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, + 0x24, 0x0a, 0x0d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x75, 0x62, 0x73, 0x65, 0x74, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, + 0x75, 0x62, 0x73, 0x65, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x44, 0x61, 0x74, 0x61, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x44, 0x61, 0x74, 0x61, 0x63, 0x65, 0x6e, 0x74, 0x65, + 0x72, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x65, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x50, 0x65, 0x65, 0x72, 0x22, 0xc7, 0x02, 0x0a, 0x0c, 0x4c, 0x6f, 0x61, 0x64, 0x42, 0x61, + 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x5d, + 0x0a, 0x0e, 0x52, 0x69, 0x6e, 0x67, 0x48, 0x61, 0x73, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, + 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, + 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x52, + 0x69, 0x6e, 0x67, 0x48, 0x61, 0x73, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x0e, 0x52, + 0x69, 0x6e, 0x67, 0x48, 0x61, 0x73, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x69, 0x0a, + 0x12, 0x4c, 0x65, 0x61, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x68, 0x61, 0x73, 0x68, + 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, + 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, + 0x79, 0x2e, 0x4c, 0x65, 0x61, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x52, 0x12, 0x4c, 0x65, 0x61, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x55, 0x0a, 0x0c, 0x48, 0x61, 0x73, 0x68, + 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x31, + 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, + 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x48, 0x61, 0x73, 0x68, 0x50, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x52, 0x0c, 0x48, 0x61, 0x73, 0x68, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x22, + 0x64, 0x0a, 0x0e, 0x52, 0x69, 0x6e, 0x67, 0x48, 0x61, 0x73, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x12, 0x28, 0x0a, 0x0f, 0x4d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x52, 0x69, 0x6e, 0x67, + 0x53, 0x69, 0x7a, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0f, 0x4d, 0x69, 0x6e, 0x69, + 0x6d, 0x75, 0x6d, 0x52, 0x69, 0x6e, 0x67, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x4d, + 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x52, 0x69, 0x6e, 0x67, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x04, 0x52, 0x0f, 0x4d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x52, 0x69, 0x6e, + 0x67, 0x53, 0x69, 0x7a, 0x65, 0x22, 0x36, 0x0a, 0x12, 0x4c, 0x65, 0x61, 0x73, 0x74, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x20, 0x0a, 0x0b, 0x43, + 0x68, 0x6f, 0x69, 0x63, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x0b, 0x43, 0x68, 0x6f, 0x69, 0x63, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0xd3, 0x01, + 0x0a, 0x0a, 0x48, 0x61, 0x73, 0x68, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x14, 0x0a, 0x05, + 0x46, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x46, 0x69, 0x65, + 0x6c, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x56, 0x61, 0x6c, + 0x75, 0x65, 0x12, 0x57, 0x0a, 0x0c, 0x43, 0x6f, 0x6f, 0x6b, 0x69, 0x65, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, - 0x2e, 0x50, 0x61, 0x73, 0x73, 0x69, 0x76, 0x65, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, - 0x65, 0x63, 0x6b, 0x52, 0x12, 0x50, 0x61, 0x73, 0x73, 0x69, 0x76, 0x65, 0x48, 0x65, 0x61, 0x6c, - 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x22, 0xea, 0x01, 0x0a, 0x10, 0x47, 0x61, 0x74, 0x65, - 0x77, 0x61, 0x79, 0x54, 0x4c, 0x53, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x18, 0x0a, 0x07, - 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x45, - 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x4c, 0x0a, 0x03, 0x53, 0x44, 0x53, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, - 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, - 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x47, 0x61, 0x74, 0x65, - 0x77, 0x61, 0x79, 0x54, 0x4c, 0x53, 0x53, 0x44, 0x53, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, - 0x03, 0x53, 0x44, 0x53, 0x12, 0x24, 0x0a, 0x0d, 0x54, 0x4c, 0x53, 0x4d, 0x69, 0x6e, 0x56, 0x65, - 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x54, 0x4c, 0x53, - 0x4d, 0x69, 0x6e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x0a, 0x0d, 0x54, 0x4c, - 0x53, 0x4d, 0x61, 0x78, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0d, 0x54, 0x4c, 0x53, 0x4d, 0x61, 0x78, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x12, 0x22, 0x0a, 0x0c, 0x43, 0x69, 0x70, 0x68, 0x65, 0x72, 0x53, 0x75, 0x69, 0x74, 0x65, 0x73, - 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x43, 0x69, 0x70, 0x68, 0x65, 0x72, 0x53, 0x75, - 0x69, 0x74, 0x65, 0x73, 0x22, 0x5b, 0x0a, 0x13, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x54, - 0x4c, 0x53, 0x53, 0x44, 0x53, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x20, 0x0a, 0x0b, 0x43, - 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0b, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x22, 0x0a, - 0x0c, 0x43, 0x65, 0x72, 0x74, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0c, 0x43, 0x65, 0x72, 0x74, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x22, 0xdf, 0x01, 0x0a, 0x0f, 0x49, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, - 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x50, 0x72, 0x6f, - 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x50, 0x72, 0x6f, - 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x51, 0x0a, 0x08, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, + 0x2e, 0x43, 0x6f, 0x6f, 0x6b, 0x69, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x0c, 0x43, + 0x6f, 0x6f, 0x6b, 0x69, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x1a, 0x0a, 0x08, 0x53, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x50, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x53, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x50, 0x12, 0x1a, 0x0a, 0x08, 0x54, 0x65, 0x72, 0x6d, 0x69, + 0x6e, 0x61, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x54, 0x65, 0x72, 0x6d, 0x69, + 0x6e, 0x61, 0x6c, 0x22, 0x69, 0x0a, 0x0c, 0x43, 0x6f, 0x6f, 0x6b, 0x69, 0x65, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x12, 0x18, 0x0a, 0x07, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2b, 0x0a, + 0x03, 0x54, 0x54, 0x4c, 0x18, 0x02, 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, 0x52, 0x03, 0x54, 0x54, 0x4c, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x61, + 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x50, 0x61, 0x74, 0x68, 0x22, 0x98, + 0x03, 0x0a, 0x0e, 0x49, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, + 0x79, 0x12, 0x49, 0x0a, 0x03, 0x54, 0x4c, 0x53, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x37, + 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, + 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x54, 0x4c, + 0x53, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x03, 0x54, 0x4c, 0x53, 0x12, 0x54, 0x0a, 0x09, + 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x36, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, + 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x49, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x4c, + 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, + 0x72, 0x73, 0x12, 0x53, 0x0a, 0x04, 0x4d, 0x65, 0x74, 0x61, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x3f, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, + 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x49, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, + 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x04, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x57, 0x0a, 0x08, 0x44, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3b, 0x2e, 0x68, 0x61, 0x73, 0x68, + 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, + 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, + 0x79, 0x2e, 0x49, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x08, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, + 0x1a, 0x37, 0x0a, 0x09, 0x4d, 0x65, 0x74, 0x61, 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, 0x22, 0x8f, 0x02, 0x0a, 0x14, 0x49, 0x6e, + 0x67, 0x72, 0x65, 0x73, 0x73, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x12, 0x26, 0x0a, 0x0e, 0x4d, 0x61, 0x78, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0e, 0x4d, 0x61, 0x78, 0x43, + 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2e, 0x0a, 0x12, 0x4d, 0x61, + 0x78, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x12, 0x4d, 0x61, 0x78, 0x50, 0x65, 0x6e, 0x64, 0x69, + 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x4d, 0x61, + 0x78, 0x43, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x15, 0x4d, 0x61, 0x78, 0x43, 0x6f, + 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, + 0x12, 0x69, 0x0a, 0x12, 0x50, 0x61, 0x73, 0x73, 0x69, 0x76, 0x65, 0x48, 0x65, 0x61, 0x6c, 0x74, + 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x68, + 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, + 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, + 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x50, 0x61, 0x73, 0x73, 0x69, 0x76, 0x65, 0x48, 0x65, 0x61, 0x6c, + 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x12, 0x50, 0x61, 0x73, 0x73, 0x69, 0x76, 0x65, + 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x22, 0xea, 0x01, 0x0a, 0x10, + 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x54, 0x4c, 0x53, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x12, 0x18, 0x0a, 0x07, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x07, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x4c, 0x0a, 0x03, 0x53, 0x44, + 0x53, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, - 0x49, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x08, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x49, 0x0a, 0x03, 0x54, 0x4c, 0x53, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, - 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, - 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x47, 0x61, - 0x74, 0x65, 0x77, 0x61, 0x79, 0x54, 0x4c, 0x53, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x03, - 0x54, 0x4c, 0x53, 0x22, 0xb7, 0x06, 0x0a, 0x0e, 0x49, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x48, 0x6f, - 0x73, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x48, 0x6f, 0x73, 0x74, 0x73, - 0x12, 0x50, 0x0a, 0x03, 0x54, 0x4c, 0x53, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3e, 0x2e, + 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x54, 0x4c, 0x53, 0x53, 0x44, 0x53, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x52, 0x03, 0x53, 0x44, 0x53, 0x12, 0x24, 0x0a, 0x0d, 0x54, 0x4c, 0x53, 0x4d, + 0x69, 0x6e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0d, 0x54, 0x4c, 0x53, 0x4d, 0x69, 0x6e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x24, + 0x0a, 0x0d, 0x54, 0x4c, 0x53, 0x4d, 0x61, 0x78, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x54, 0x4c, 0x53, 0x4d, 0x61, 0x78, 0x56, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x22, 0x0a, 0x0c, 0x43, 0x69, 0x70, 0x68, 0x65, 0x72, 0x53, 0x75, + 0x69, 0x74, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x43, 0x69, 0x70, 0x68, + 0x65, 0x72, 0x53, 0x75, 0x69, 0x74, 0x65, 0x73, 0x22, 0x5b, 0x0a, 0x13, 0x47, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x54, 0x4c, 0x53, 0x53, 0x44, 0x53, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, + 0x20, 0x0a, 0x0b, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x61, 0x6d, + 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x43, 0x65, 0x72, 0x74, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x43, 0x65, 0x72, 0x74, 0x52, 0x65, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x22, 0xdf, 0x01, 0x0a, 0x0f, 0x49, 0x6e, 0x67, 0x72, 0x65, 0x73, + 0x73, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x6f, 0x72, + 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x1a, 0x0a, + 0x08, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x51, 0x0a, 0x08, 0x53, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x68, 0x61, + 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, + 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, + 0x74, 0x72, 0x79, 0x2e, 0x49, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x52, 0x08, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x49, 0x0a, 0x03, + 0x54, 0x4c, 0x53, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x68, 0x61, 0x73, 0x68, + 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, + 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, + 0x79, 0x2e, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x54, 0x4c, 0x53, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x52, 0x03, 0x54, 0x4c, 0x53, 0x22, 0xb7, 0x06, 0x0a, 0x0e, 0x49, 0x6e, 0x67, 0x72, + 0x65, 0x73, 0x73, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, + 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x14, + 0x0a, 0x05, 0x48, 0x6f, 0x73, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x48, + 0x6f, 0x73, 0x74, 0x73, 0x12, 0x50, 0x0a, 0x03, 0x54, 0x4c, 0x53, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x3e, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, + 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, + 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x54, 0x4c, 0x53, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x52, 0x03, 0x54, 0x4c, 0x53, 0x12, 0x62, 0x0a, 0x0e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3a, + 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, + 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x48, 0x65, 0x61, 0x64, 0x65, + 0x72, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x52, 0x0e, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x12, 0x64, 0x0a, 0x0f, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, + 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, + 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x48, 0x54, 0x54, 0x50, + 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x52, + 0x0f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, + 0x12, 0x53, 0x0a, 0x04, 0x4d, 0x65, 0x74, 0x61, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3f, + 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, + 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x49, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x53, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, + 0x04, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x58, 0x0a, 0x0e, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, + 0x69, 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, - 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x53, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x54, 0x4c, 0x53, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x03, 0x54, - 0x4c, 0x53, 0x12, 0x62, 0x0a, 0x0e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x65, 0x61, - 0x64, 0x65, 0x72, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x68, 0x61, 0x73, - 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, - 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, - 0x72, 0x79, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x4d, 0x6f, 0x64, - 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x52, 0x0e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, - 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x12, 0x64, 0x0a, 0x0f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x3a, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, + 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, + 0x2e, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x52, + 0x0e, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x12, + 0x26, 0x0a, 0x0e, 0x4d, 0x61, 0x78, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0e, 0x4d, 0x61, 0x78, 0x43, 0x6f, 0x6e, 0x6e, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2e, 0x0a, 0x12, 0x4d, 0x61, 0x78, 0x50, 0x65, + 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x18, 0x09, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x12, 0x4d, 0x61, 0x78, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x4d, 0x61, 0x78, 0x43, 0x6f, + 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, + 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x15, 0x4d, 0x61, 0x78, 0x43, 0x6f, 0x6e, 0x63, 0x75, + 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x12, 0x69, 0x0a, + 0x12, 0x50, 0x61, 0x73, 0x73, 0x69, 0x76, 0x65, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, + 0x65, 0x63, 0x6b, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x68, 0x61, 0x73, 0x68, + 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, + 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, + 0x79, 0x2e, 0x50, 0x61, 0x73, 0x73, 0x69, 0x76, 0x65, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, + 0x68, 0x65, 0x63, 0x6b, 0x52, 0x12, 0x50, 0x61, 0x73, 0x73, 0x69, 0x76, 0x65, 0x48, 0x65, 0x61, + 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x1a, 0x37, 0x0a, 0x09, 0x4d, 0x65, 0x74, 0x61, + 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, 0x22, 0x67, 0x0a, 0x17, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x53, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x54, 0x4c, 0x53, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x4c, 0x0a, 0x03, + 0x53, 0x44, 0x53, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x68, 0x61, 0x73, 0x68, + 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, + 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, + 0x79, 0x2e, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x54, 0x4c, 0x53, 0x53, 0x44, 0x53, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x03, 0x53, 0x44, 0x53, 0x22, 0xcb, 0x02, 0x0a, 0x13, 0x48, + 0x54, 0x54, 0x50, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, + 0x72, 0x73, 0x12, 0x55, 0x0a, 0x03, 0x41, 0x64, 0x64, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x43, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x48, 0x65, 0x61, 0x64, - 0x65, 0x72, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x52, 0x0f, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x12, 0x53, 0x0a, 0x04, - 0x4d, 0x65, 0x74, 0x61, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3f, 0x2e, 0x68, 0x61, 0x73, - 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, - 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, - 0x72, 0x79, 0x2e, 0x49, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x4d, 0x65, 0x74, - 0x61, 0x12, 0x58, 0x0a, 0x0e, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x4d, - 0x65, 0x74, 0x61, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x68, 0x61, 0x73, 0x68, + 0x65, 0x72, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x2e, 0x41, 0x64, 0x64, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x52, 0x03, 0x41, 0x64, 0x64, 0x12, 0x55, 0x0a, 0x03, 0x53, 0x65, 0x74, + 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x43, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, + 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, + 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x48, + 0x54, 0x54, 0x50, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, + 0x72, 0x73, 0x2e, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x03, 0x53, 0x65, 0x74, + 0x12, 0x16, 0x0a, 0x06, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, + 0x52, 0x06, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x1a, 0x36, 0x0a, 0x08, 0x41, 0x64, 0x64, 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, 0x36, 0x0a, 0x08, 0x53, 0x65, 0x74, 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, 0x22, 0xf6, 0x01, 0x0a, 0x11, 0x53, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x50, + 0x0a, 0x07, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x36, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, + 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, + 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, + 0x12, 0x56, 0x0a, 0x04, 0x4d, 0x65, 0x74, 0x61, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x42, + 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, + 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, + 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x52, 0x04, 0x4d, 0x65, 0x74, 0x61, 0x1a, 0x37, 0x0a, 0x09, 0x4d, 0x65, 0x74, 0x61, + 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, 0x22, 0xa6, 0x06, 0x0a, 0x0f, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x74, 0x65, + 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x4e, 0x0a, 0x06, 0x41, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x36, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, - 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x74, - 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x52, 0x0e, 0x45, 0x6e, 0x74, - 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x26, 0x0a, 0x0e, 0x4d, - 0x61, 0x78, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x08, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x0e, 0x4d, 0x61, 0x78, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x12, 0x2e, 0x0a, 0x12, 0x4d, 0x61, 0x78, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, - 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x12, 0x4d, 0x61, 0x78, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x4d, 0x61, 0x78, 0x43, 0x6f, 0x6e, 0x63, 0x75, 0x72, - 0x72, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x18, 0x0a, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x15, 0x4d, 0x61, 0x78, 0x43, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, - 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x12, 0x69, 0x0a, 0x12, 0x50, 0x61, 0x73, - 0x73, 0x69, 0x76, 0x65, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x18, - 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, - 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, - 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x50, 0x61, - 0x73, 0x73, 0x69, 0x76, 0x65, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, - 0x52, 0x12, 0x50, 0x61, 0x73, 0x73, 0x69, 0x76, 0x65, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, - 0x68, 0x65, 0x63, 0x6b, 0x1a, 0x37, 0x0a, 0x09, 0x4d, 0x65, 0x74, 0x61, 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, 0x22, 0x67, 0x0a, - 0x17, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x54, - 0x4c, 0x53, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x4c, 0x0a, 0x03, 0x53, 0x44, 0x53, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, + 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, + 0x79, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x06, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x5c, 0x0a, 0x0b, 0x50, 0x65, 0x72, + 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3a, + 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, + 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, + 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x50, 0x65, 0x72, 0x6d, + 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x50, 0x72, 0x65, 0x63, 0x65, + 0x64, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x50, 0x72, 0x65, + 0x63, 0x65, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x4c, 0x65, 0x67, 0x61, 0x63, + 0x79, 0x49, 0x44, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x4c, 0x65, 0x67, 0x61, 0x63, + 0x79, 0x49, 0x44, 0x12, 0x4e, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x3a, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, + 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x74, + 0x69, 0x6f, 0x6e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x54, + 0x79, 0x70, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x66, 0x0a, 0x0a, 0x4c, 0x65, 0x67, 0x61, 0x63, 0x79, 0x4d, + 0x65, 0x74, 0x61, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x46, 0x2e, 0x68, 0x61, 0x73, 0x68, + 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, + 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, + 0x79, 0x2e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, + 0x6e, 0x2e, 0x4c, 0x65, 0x67, 0x61, 0x63, 0x79, 0x4d, 0x65, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x0a, 0x4c, 0x65, 0x67, 0x61, 0x63, 0x79, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x46, 0x0a, + 0x10, 0x4c, 0x65, 0x67, 0x61, 0x63, 0x79, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, + 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x52, 0x10, 0x4c, 0x65, 0x67, 0x61, 0x63, 0x79, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x46, 0x0a, 0x10, 0x4c, 0x65, 0x67, 0x61, 0x63, 0x79, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x10, 0x4c, 0x65, 0x67, + 0x61, 0x63, 0x79, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x58, 0x0a, + 0x0e, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x18, + 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, - 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x47, 0x61, - 0x74, 0x65, 0x77, 0x61, 0x79, 0x54, 0x4c, 0x53, 0x53, 0x44, 0x53, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x52, 0x03, 0x53, 0x44, 0x53, 0x22, 0xcb, 0x02, 0x0a, 0x13, 0x48, 0x54, 0x54, 0x50, 0x48, - 0x65, 0x61, 0x64, 0x65, 0x72, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x12, 0x55, - 0x0a, 0x03, 0x41, 0x64, 0x64, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x43, 0x2e, 0x68, 0x61, - 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, - 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, - 0x74, 0x72, 0x79, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x4d, 0x6f, - 0x64, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x2e, 0x41, 0x64, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x52, 0x03, 0x41, 0x64, 0x64, 0x12, 0x55, 0x0a, 0x03, 0x53, 0x65, 0x74, 0x18, 0x02, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x43, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, + 0x6c, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, + 0x69, 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x52, 0x0e, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, + 0x69, 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x65, 0x65, 0x72, 0x18, + 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x50, 0x65, 0x65, 0x72, 0x1a, 0x3d, 0x0a, 0x0f, 0x4c, + 0x65, 0x67, 0x61, 0x63, 0x79, 0x4d, 0x65, 0x74, 0x61, 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, 0x22, 0xb9, 0x01, 0x0a, 0x13, 0x49, + 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, + 0x6f, 0x6e, 0x12, 0x4e, 0x0a, 0x06, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x36, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x48, - 0x65, 0x61, 0x64, 0x65, 0x72, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x2e, 0x53, - 0x65, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x03, 0x53, 0x65, 0x74, 0x12, 0x16, 0x0a, 0x06, - 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x52, 0x65, - 0x6d, 0x6f, 0x76, 0x65, 0x1a, 0x36, 0x0a, 0x08, 0x41, 0x64, 0x64, 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, 0x36, 0x0a, 0x08, - 0x53, 0x65, 0x74, 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, 0x22, 0xf6, 0x01, 0x0a, 0x11, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x50, 0x0a, 0x07, 0x53, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x68, 0x61, - 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, - 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, - 0x74, 0x72, 0x79, 0x2e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x12, 0x56, 0x0a, 0x04, - 0x4d, 0x65, 0x74, 0x61, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x42, 0x2e, 0x68, 0x61, 0x73, - 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, - 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, - 0x72, 0x79, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, - 0x4d, 0x65, 0x74, 0x61, 0x1a, 0x37, 0x0a, 0x09, 0x4d, 0x65, 0x74, 0x61, 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, 0x22, 0xa6, 0x06, - 0x0a, 0x0f, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, - 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x4e, 0x0a, 0x06, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x36, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, - 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, - 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x49, 0x6e, - 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x06, 0x41, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x5c, 0x0a, 0x0b, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, - 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x68, 0x61, 0x73, - 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, - 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, - 0x72, 0x79, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x72, 0x6d, - 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, - 0x6f, 0x6e, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x50, 0x72, 0x65, 0x63, 0x65, 0x64, 0x65, 0x6e, 0x63, - 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x50, 0x72, 0x65, 0x63, 0x65, 0x64, 0x65, - 0x6e, 0x63, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x4c, 0x65, 0x67, 0x61, 0x63, 0x79, 0x49, 0x44, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x4c, 0x65, 0x67, 0x61, 0x63, 0x79, 0x49, 0x44, 0x12, - 0x4e, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x3a, 0x2e, - 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, - 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x53, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, - 0x20, 0x0a, 0x0b, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x07, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x12, 0x66, 0x0a, 0x0a, 0x4c, 0x65, 0x67, 0x61, 0x63, 0x79, 0x4d, 0x65, 0x74, 0x61, 0x18, - 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x46, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, - 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, - 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x53, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x4c, 0x65, - 0x67, 0x61, 0x63, 0x79, 0x4d, 0x65, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x4c, - 0x65, 0x67, 0x61, 0x63, 0x79, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x46, 0x0a, 0x10, 0x4c, 0x65, 0x67, - 0x61, 0x63, 0x79, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x18, 0x09, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, - 0x10, 0x4c, 0x65, 0x67, 0x61, 0x63, 0x79, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, - 0x65, 0x12, 0x46, 0x0a, 0x10, 0x4c, 0x65, 0x67, 0x61, 0x63, 0x79, 0x55, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x54, 0x69, 0x6d, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, - 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x10, 0x4c, 0x65, 0x67, 0x61, 0x63, 0x79, 0x55, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x58, 0x0a, 0x0e, 0x45, 0x6e, 0x74, - 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x18, 0x0b, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x30, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, - 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, - 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x4d, - 0x65, 0x74, 0x61, 0x52, 0x0e, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x4d, - 0x65, 0x74, 0x61, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x65, 0x65, 0x72, 0x18, 0x0c, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x50, 0x65, 0x65, 0x72, 0x1a, 0x3d, 0x0a, 0x0f, 0x4c, 0x65, 0x67, 0x61, 0x63, - 0x79, 0x4d, 0x65, 0x74, 0x61, 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, 0x22, 0xb9, 0x01, 0x0a, 0x13, 0x49, 0x6e, 0x74, 0x65, 0x6e, - 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x4e, - 0x0a, 0x06, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x36, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x6e, + 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x06, 0x41, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x52, 0x0a, 0x04, 0x48, 0x54, 0x54, 0x50, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x3e, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, + 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x69, + 0x6f, 0x6e, 0x48, 0x54, 0x54, 0x50, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, + 0x52, 0x04, 0x48, 0x54, 0x54, 0x50, 0x22, 0xed, 0x01, 0x0a, 0x17, 0x49, 0x6e, 0x74, 0x65, 0x6e, + 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x54, 0x54, 0x50, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, + 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x50, 0x61, 0x74, 0x68, 0x45, 0x78, 0x61, 0x63, 0x74, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x50, 0x61, 0x74, 0x68, 0x45, 0x78, 0x61, 0x63, 0x74, + 0x12, 0x1e, 0x0a, 0x0a, 0x50, 0x61, 0x74, 0x68, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x50, 0x61, 0x74, 0x68, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, + 0x12, 0x1c, 0x0a, 0x09, 0x50, 0x61, 0x74, 0x68, 0x52, 0x65, 0x67, 0x65, 0x78, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x09, 0x50, 0x61, 0x74, 0x68, 0x52, 0x65, 0x67, 0x65, 0x78, 0x12, 0x5c, + 0x0a, 0x06, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x44, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, - 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x06, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x52, - 0x0a, 0x04, 0x48, 0x54, 0x54, 0x50, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3e, 0x2e, 0x68, - 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, - 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, - 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x54, - 0x54, 0x50, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x04, 0x48, 0x54, - 0x54, 0x50, 0x22, 0xed, 0x01, 0x0a, 0x17, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, - 0x48, 0x54, 0x54, 0x50, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1c, - 0x0a, 0x09, 0x50, 0x61, 0x74, 0x68, 0x45, 0x78, 0x61, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x09, 0x50, 0x61, 0x74, 0x68, 0x45, 0x78, 0x61, 0x63, 0x74, 0x12, 0x1e, 0x0a, 0x0a, - 0x50, 0x61, 0x74, 0x68, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0a, 0x50, 0x61, 0x74, 0x68, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x12, 0x1c, 0x0a, 0x09, - 0x50, 0x61, 0x74, 0x68, 0x52, 0x65, 0x67, 0x65, 0x78, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x09, 0x50, 0x61, 0x74, 0x68, 0x52, 0x65, 0x67, 0x65, 0x78, 0x12, 0x5c, 0x0a, 0x06, 0x48, 0x65, - 0x61, 0x64, 0x65, 0x72, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x44, 0x2e, 0x68, 0x61, 0x73, + 0x48, 0x54, 0x54, 0x50, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, + 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x06, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x18, 0x0a, 0x07, + 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x4d, + 0x65, 0x74, 0x68, 0x6f, 0x64, 0x73, 0x22, 0xc1, 0x01, 0x0a, 0x1d, 0x49, 0x6e, 0x74, 0x65, 0x6e, + 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x54, 0x54, 0x50, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x50, 0x65, + 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, + 0x50, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x50, + 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x45, 0x78, 0x61, 0x63, 0x74, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x45, 0x78, 0x61, 0x63, 0x74, 0x12, 0x16, 0x0a, 0x06, + 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x50, 0x72, + 0x65, 0x66, 0x69, 0x78, 0x12, 0x16, 0x0a, 0x06, 0x53, 0x75, 0x66, 0x66, 0x69, 0x78, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x53, 0x75, 0x66, 0x66, 0x69, 0x78, 0x12, 0x14, 0x0a, 0x05, + 0x52, 0x65, 0x67, 0x65, 0x78, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x52, 0x65, 0x67, + 0x65, 0x78, 0x12, 0x16, 0x0a, 0x06, 0x49, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x18, 0x07, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x06, 0x49, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x22, 0xb6, 0x08, 0x0a, 0x0f, 0x53, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x1a, + 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x44, 0x0a, 0x04, 0x4d, 0x6f, + 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x30, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, + 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, + 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, + 0x2e, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x04, 0x4d, 0x6f, 0x64, 0x65, + 0x12, 0x69, 0x0a, 0x10, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x50, + 0x72, 0x6f, 0x78, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3d, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, - 0x72, 0x79, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x54, 0x54, 0x50, - 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, - 0x52, 0x06, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x4d, 0x65, 0x74, 0x68, - 0x6f, 0x64, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x4d, 0x65, 0x74, 0x68, 0x6f, - 0x64, 0x73, 0x22, 0xc1, 0x01, 0x0a, 0x1d, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, - 0x48, 0x54, 0x54, 0x50, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, - 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x50, 0x72, 0x65, 0x73, - 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x50, 0x72, 0x65, 0x73, 0x65, - 0x6e, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x45, 0x78, 0x61, 0x63, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x45, 0x78, 0x61, 0x63, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x50, 0x72, 0x65, 0x66, - 0x69, 0x78, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, - 0x12, 0x16, 0x0a, 0x06, 0x53, 0x75, 0x66, 0x66, 0x69, 0x78, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x06, 0x53, 0x75, 0x66, 0x66, 0x69, 0x78, 0x12, 0x14, 0x0a, 0x05, 0x52, 0x65, 0x67, 0x65, - 0x78, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x52, 0x65, 0x67, 0x65, 0x78, 0x12, 0x16, - 0x0a, 0x06, 0x49, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, - 0x49, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x22, 0xb6, 0x08, 0x0a, 0x0f, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x50, 0x72, - 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x50, 0x72, - 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x44, 0x0a, 0x04, 0x4d, 0x6f, 0x64, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0e, 0x32, 0x30, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, - 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, - 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x50, 0x72, 0x6f, - 0x78, 0x79, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x04, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x69, 0x0a, 0x10, - 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x78, 0x79, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3d, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, + 0x72, 0x79, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x50, 0x72, + 0x6f, 0x78, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x10, 0x54, 0x72, 0x61, 0x6e, 0x73, + 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x12, 0x5a, 0x0a, 0x0b, 0x4d, + 0x65, 0x73, 0x68, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x38, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, + 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x4d, 0x65, 0x73, 0x68, 0x47, 0x61, 0x74, + 0x65, 0x77, 0x61, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x0b, 0x4d, 0x65, 0x73, 0x68, + 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x12, 0x4b, 0x0a, 0x06, 0x45, 0x78, 0x70, 0x6f, 0x73, + 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, + 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, + 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, + 0x45, 0x78, 0x70, 0x6f, 0x73, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x06, 0x45, 0x78, + 0x70, 0x6f, 0x73, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, + 0x53, 0x4e, 0x49, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x45, 0x78, 0x74, 0x65, 0x72, + 0x6e, 0x61, 0x6c, 0x53, 0x4e, 0x49, 0x12, 0x64, 0x0a, 0x0e, 0x55, 0x70, 0x73, 0x74, 0x72, 0x65, + 0x61, 0x6d, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3c, + 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, + 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x55, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0e, 0x55, 0x70, + 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x5a, 0x0a, 0x0b, + 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x38, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, + 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x0b, 0x44, 0x65, 0x73, + 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x34, 0x0a, 0x15, 0x4d, 0x61, 0x78, 0x49, + 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x52, 0x15, 0x4d, 0x61, 0x78, 0x49, 0x6e, 0x62, 0x6f, + 0x75, 0x6e, 0x64, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x34, + 0x0a, 0x15, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x54, 0x69, + 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x4d, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x52, 0x15, 0x4c, + 0x6f, 0x63, 0x61, 0x6c, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x6f, + 0x75, 0x74, 0x4d, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x4d, 0x73, 0x18, 0x0b, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x15, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x4d, 0x73, 0x12, 0x3c, 0x0a, 0x19, 0x42, 0x61, + 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x6f, 0x6e, 0x6e, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x19, 0x42, + 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x6f, 0x6e, + 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x54, 0x0a, 0x04, 0x4d, 0x65, 0x74, 0x61, + 0x18, 0x0d, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x40, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, - 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x54, - 0x72, 0x61, 0x6e, 0x73, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x10, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x61, 0x72, 0x65, - 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x12, 0x5a, 0x0a, 0x0b, 0x4d, 0x65, 0x73, 0x68, 0x47, - 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x68, + 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x53, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x2e, 0x4d, + 0x65, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x5a, + 0x0a, 0x0f, 0x45, 0x6e, 0x76, 0x6f, 0x79, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, + 0x73, 0x18, 0x0e, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, + 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, + 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x76, 0x6f, 0x79, + 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x0f, 0x45, 0x6e, 0x76, 0x6f, 0x79, + 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x37, 0x0a, 0x09, 0x4d, 0x65, + 0x74, 0x61, 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, 0x22, 0x74, 0x0a, 0x16, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x61, 0x72, 0x65, + 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x32, 0x0a, + 0x14, 0x4f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, + 0x72, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x14, 0x4f, 0x75, 0x74, + 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x50, 0x6f, 0x72, + 0x74, 0x12, 0x26, 0x0a, 0x0e, 0x44, 0x69, 0x61, 0x6c, 0x65, 0x64, 0x44, 0x69, 0x72, 0x65, 0x63, + 0x74, 0x6c, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x44, 0x69, 0x61, 0x6c, 0x65, + 0x64, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6c, 0x79, 0x22, 0x5f, 0x0a, 0x11, 0x4d, 0x65, 0x73, + 0x68, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x4a, + 0x0a, 0x04, 0x4d, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x36, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x4d, 0x65, 0x73, 0x68, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x0b, 0x4d, 0x65, 0x73, 0x68, 0x47, 0x61, 0x74, 0x65, - 0x77, 0x61, 0x79, 0x12, 0x4b, 0x0a, 0x06, 0x45, 0x78, 0x70, 0x6f, 0x73, 0x65, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, - 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, - 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x45, 0x78, 0x70, 0x6f, - 0x73, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x06, 0x45, 0x78, 0x70, 0x6f, 0x73, 0x65, - 0x12, 0x20, 0x0a, 0x0b, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x53, 0x4e, 0x49, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x53, - 0x4e, 0x49, 0x12, 0x64, 0x0a, 0x0e, 0x55, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x43, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3c, 0x2e, 0x68, 0x61, 0x73, - 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, - 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, - 0x72, 0x79, 0x2e, 0x55, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0e, 0x55, 0x70, 0x73, 0x74, 0x72, 0x65, - 0x61, 0x6d, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x5a, 0x0a, 0x0b, 0x44, 0x65, 0x73, 0x74, - 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x38, 0x2e, - 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, - 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x0b, 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x34, 0x0a, 0x15, 0x4d, 0x61, 0x78, 0x49, 0x6e, 0x62, 0x6f, 0x75, - 0x6e, 0x64, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x09, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x15, 0x4d, 0x61, 0x78, 0x49, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, - 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x4c, 0x6f, - 0x63, 0x61, 0x6c, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, - 0x74, 0x4d, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x52, 0x15, 0x4c, 0x6f, 0x63, 0x61, 0x6c, - 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x4d, 0x73, - 0x12, 0x34, 0x0a, 0x15, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x4d, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x15, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x69, 0x6d, - 0x65, 0x6f, 0x75, 0x74, 0x4d, 0x73, 0x12, 0x3c, 0x0a, 0x19, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, - 0x65, 0x49, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x19, 0x42, 0x61, 0x6c, 0x61, 0x6e, - 0x63, 0x65, 0x49, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x54, 0x0a, 0x04, 0x4d, 0x65, 0x74, 0x61, 0x18, 0x0d, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x40, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, - 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x5a, 0x0a, 0x0f, 0x45, 0x6e, - 0x76, 0x6f, 0x79, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x0e, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, - 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, - 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x76, 0x6f, 0x79, 0x45, 0x78, 0x74, 0x65, - 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x0f, 0x45, 0x6e, 0x76, 0x6f, 0x79, 0x45, 0x78, 0x74, 0x65, - 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x37, 0x0a, 0x09, 0x4d, 0x65, 0x74, 0x61, 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, 0x22, - 0x74, 0x0a, 0x16, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x50, 0x72, - 0x6f, 0x78, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x32, 0x0a, 0x14, 0x4f, 0x75, 0x74, - 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x50, 0x6f, 0x72, - 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x14, 0x4f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, - 0x64, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x26, 0x0a, - 0x0e, 0x44, 0x69, 0x61, 0x6c, 0x65, 0x64, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6c, 0x79, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x44, 0x69, 0x61, 0x6c, 0x65, 0x64, 0x44, 0x69, 0x72, - 0x65, 0x63, 0x74, 0x6c, 0x79, 0x22, 0x5f, 0x0a, 0x11, 0x4d, 0x65, 0x73, 0x68, 0x47, 0x61, 0x74, - 0x65, 0x77, 0x61, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x4a, 0x0a, 0x04, 0x4d, 0x6f, - 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x36, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, - 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, - 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, - 0x2e, 0x4d, 0x65, 0x73, 0x68, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x4d, 0x6f, 0x64, 0x65, - 0x52, 0x04, 0x4d, 0x6f, 0x64, 0x65, 0x22, 0x6f, 0x0a, 0x0c, 0x45, 0x78, 0x70, 0x6f, 0x73, 0x65, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x16, 0x0a, 0x06, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x73, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x12, 0x47, - 0x0a, 0x05, 0x50, 0x61, 0x74, 0x68, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, - 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, - 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x45, 0x78, 0x70, 0x6f, 0x73, 0x65, 0x50, 0x61, 0x74, 0x68, - 0x52, 0x05, 0x50, 0x61, 0x74, 0x68, 0x73, 0x22, 0xb0, 0x01, 0x0a, 0x0a, 0x45, 0x78, 0x70, 0x6f, - 0x73, 0x65, 0x50, 0x61, 0x74, 0x68, 0x12, 0x22, 0x0a, 0x0c, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, - 0x65, 0x72, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x4c, 0x69, - 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x61, - 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x50, 0x61, 0x74, 0x68, 0x12, 0x24, - 0x0a, 0x0d, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x50, 0x61, 0x74, 0x68, 0x50, 0x6f, 0x72, 0x74, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x50, 0x61, 0x74, 0x68, - 0x50, 0x6f, 0x72, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, - 0x12, 0x28, 0x0a, 0x0f, 0x50, 0x61, 0x72, 0x73, 0x65, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x43, 0x68, - 0x65, 0x63, 0x6b, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x50, 0x61, 0x72, 0x73, 0x65, - 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x22, 0xbf, 0x01, 0x0a, 0x15, 0x55, - 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x53, 0x0a, 0x09, 0x4f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, - 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, - 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, - 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, - 0x55, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x09, - 0x4f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x73, 0x12, 0x51, 0x0a, 0x08, 0x44, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x68, 0x61, + 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x04, 0x4d, 0x6f, 0x64, 0x65, 0x22, 0x6f, 0x0a, 0x0c, 0x45, 0x78, + 0x70, 0x6f, 0x73, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x16, 0x0a, 0x06, 0x43, 0x68, + 0x65, 0x63, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x43, 0x68, 0x65, 0x63, + 0x6b, 0x73, 0x12, 0x47, 0x0a, 0x05, 0x50, 0x61, 0x74, 0x68, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x31, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, + 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x45, 0x78, 0x70, 0x6f, 0x73, 0x65, + 0x50, 0x61, 0x74, 0x68, 0x52, 0x05, 0x50, 0x61, 0x74, 0x68, 0x73, 0x22, 0xb0, 0x01, 0x0a, 0x0a, + 0x45, 0x78, 0x70, 0x6f, 0x73, 0x65, 0x50, 0x61, 0x74, 0x68, 0x12, 0x22, 0x0a, 0x0c, 0x4c, 0x69, + 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x0c, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x12, + 0x0a, 0x04, 0x50, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x50, 0x61, + 0x74, 0x68, 0x12, 0x24, 0x0a, 0x0d, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x50, 0x61, 0x74, 0x68, 0x50, + 0x6f, 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x4c, 0x6f, 0x63, 0x61, 0x6c, + 0x50, 0x61, 0x74, 0x68, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x74, + 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x50, 0x72, 0x6f, 0x74, + 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x28, 0x0a, 0x0f, 0x50, 0x61, 0x72, 0x73, 0x65, 0x64, 0x46, 0x72, + 0x6f, 0x6d, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x50, + 0x61, 0x72, 0x73, 0x65, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x22, 0xbf, + 0x01, 0x0a, 0x15, 0x55, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x53, 0x0a, 0x09, 0x4f, 0x76, 0x65, 0x72, + 0x72, 0x69, 0x64, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x55, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x43, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x52, 0x08, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x22, 0x8a, 0x05, 0x0a, - 0x0e, 0x55, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, - 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, - 0x61, 0x6d, 0x65, 0x12, 0x58, 0x0a, 0x0e, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, - 0x65, 0x4d, 0x65, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x68, 0x61, - 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, - 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, - 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x52, 0x0e, 0x45, - 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x2c, 0x0a, - 0x11, 0x45, 0x6e, 0x76, 0x6f, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x4a, 0x53, - 0x4f, 0x4e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x45, 0x6e, 0x76, 0x6f, 0x79, 0x4c, - 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x4a, 0x53, 0x4f, 0x4e, 0x12, 0x2a, 0x0a, 0x10, 0x45, - 0x6e, 0x76, 0x6f, 0x79, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4a, 0x53, 0x4f, 0x4e, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x45, 0x6e, 0x76, 0x6f, 0x79, 0x43, 0x6c, 0x75, 0x73, - 0x74, 0x65, 0x72, 0x4a, 0x53, 0x4f, 0x4e, 0x12, 0x1a, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x74, 0x6f, - 0x63, 0x6f, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x50, 0x72, 0x6f, 0x74, 0x6f, - 0x63, 0x6f, 0x6c, 0x12, 0x2a, 0x0a, 0x10, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x54, 0x69, - 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x4d, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x10, 0x43, - 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x4d, 0x73, 0x12, - 0x4d, 0x0a, 0x06, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x69, 0x67, 0x52, 0x09, 0x4f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x73, 0x12, 0x51, 0x0a, + 0x08, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x55, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, - 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x52, 0x06, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x12, 0x69, - 0x0a, 0x12, 0x50, 0x61, 0x73, 0x73, 0x69, 0x76, 0x65, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, - 0x68, 0x65, 0x63, 0x6b, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x68, 0x61, 0x73, - 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, - 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, - 0x72, 0x79, 0x2e, 0x50, 0x61, 0x73, 0x73, 0x69, 0x76, 0x65, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, - 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x12, 0x50, 0x61, 0x73, 0x73, 0x69, 0x76, 0x65, 0x48, 0x65, - 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x12, 0x5a, 0x0a, 0x0b, 0x4d, 0x65, 0x73, - 0x68, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x38, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x08, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, + 0x22, 0x8a, 0x05, 0x0a, 0x0e, 0x55, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x58, 0x0a, 0x0e, 0x45, 0x6e, 0x74, 0x65, 0x72, + 0x70, 0x72, 0x69, 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x30, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, + 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, + 0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x4d, 0x65, 0x74, + 0x61, 0x52, 0x0e, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x4d, 0x65, 0x74, + 0x61, 0x12, 0x2c, 0x0a, 0x11, 0x45, 0x6e, 0x76, 0x6f, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, + 0x65, 0x72, 0x4a, 0x53, 0x4f, 0x4e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x45, 0x6e, + 0x76, 0x6f, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x4a, 0x53, 0x4f, 0x4e, 0x12, + 0x2a, 0x0a, 0x10, 0x45, 0x6e, 0x76, 0x6f, 0x79, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4a, + 0x53, 0x4f, 0x4e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x45, 0x6e, 0x76, 0x6f, 0x79, + 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4a, 0x53, 0x4f, 0x4e, 0x12, 0x1a, 0x0a, 0x08, 0x50, + 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x50, + 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x2a, 0x0a, 0x10, 0x43, 0x6f, 0x6e, 0x6e, 0x65, + 0x63, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x4d, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x10, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, + 0x74, 0x4d, 0x73, 0x12, 0x4d, 0x0a, 0x06, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x18, 0x07, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, + 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, + 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x55, 0x70, 0x73, 0x74, + 0x72, 0x65, 0x61, 0x6d, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x52, 0x06, 0x4c, 0x69, 0x6d, 0x69, + 0x74, 0x73, 0x12, 0x69, 0x0a, 0x12, 0x50, 0x61, 0x73, 0x73, 0x69, 0x76, 0x65, 0x48, 0x65, 0x61, + 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x4d, 0x65, 0x73, 0x68, 0x47, 0x61, 0x74, 0x65, 0x77, - 0x61, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x0b, 0x4d, 0x65, 0x73, 0x68, 0x47, 0x61, - 0x74, 0x65, 0x77, 0x61, 0x79, 0x12, 0x3e, 0x0a, 0x1a, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, - 0x4f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x1a, 0x42, 0x61, 0x6c, 0x61, 0x6e, - 0x63, 0x65, 0x4f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x65, 0x65, 0x72, 0x18, 0x0b, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x50, 0x65, 0x65, 0x72, 0x22, 0x9e, 0x01, 0x0a, 0x0e, 0x55, 0x70, - 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x12, 0x26, 0x0a, 0x0e, - 0x4d, 0x61, 0x78, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x4d, 0x61, 0x78, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2e, 0x0a, 0x12, 0x4d, 0x61, 0x78, 0x50, 0x65, 0x6e, 0x64, 0x69, - 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x12, 0x4d, 0x61, 0x78, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x4d, 0x61, 0x78, 0x43, 0x6f, 0x6e, 0x63, 0x75, - 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x15, 0x4d, 0x61, 0x78, 0x43, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, - 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x22, 0xa7, 0x01, 0x0a, 0x12, 0x50, - 0x61, 0x73, 0x73, 0x69, 0x76, 0x65, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, - 0x6b, 0x12, 0x35, 0x0a, 0x08, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 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, 0x52, 0x08, - 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x12, 0x20, 0x0a, 0x0b, 0x4d, 0x61, 0x78, 0x46, - 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x4d, - 0x61, 0x78, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x73, 0x12, 0x38, 0x0a, 0x17, 0x45, 0x6e, - 0x66, 0x6f, 0x72, 0x63, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6e, 0x73, 0x65, 0x63, 0x75, 0x74, 0x69, - 0x76, 0x65, 0x35, 0x78, 0x78, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x17, 0x45, 0x6e, 0x66, - 0x6f, 0x72, 0x63, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6e, 0x73, 0x65, 0x63, 0x75, 0x74, 0x69, 0x76, - 0x65, 0x35, 0x78, 0x78, 0x22, 0x45, 0x0a, 0x11, 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x1c, 0x0a, 0x09, 0x41, 0x64, 0x64, - 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x41, 0x64, - 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x22, 0xb6, 0x02, 0x0a, 0x0a, - 0x41, 0x50, 0x49, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x12, 0x4f, 0x0a, 0x04, 0x4d, 0x65, - 0x74, 0x61, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3b, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, + 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x50, 0x61, 0x73, 0x73, 0x69, 0x76, 0x65, 0x48, 0x65, + 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x12, 0x50, 0x61, 0x73, 0x73, 0x69, + 0x76, 0x65, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x12, 0x5a, 0x0a, + 0x0b, 0x4d, 0x65, 0x73, 0x68, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x18, 0x09, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, + 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x4d, 0x65, 0x73, 0x68, 0x47, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x0b, 0x4d, 0x65, + 0x73, 0x68, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x12, 0x3e, 0x0a, 0x1a, 0x42, 0x61, 0x6c, + 0x61, 0x6e, 0x63, 0x65, 0x4f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x6f, 0x6e, 0x6e, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x1a, 0x42, + 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x4f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x6f, + 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x65, 0x65, + 0x72, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x50, 0x65, 0x65, 0x72, 0x22, 0x9e, 0x01, + 0x0a, 0x0e, 0x55, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, + 0x12, 0x26, 0x0a, 0x0e, 0x4d, 0x61, 0x78, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x4d, 0x61, 0x78, 0x43, 0x6f, 0x6e, + 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2e, 0x0a, 0x12, 0x4d, 0x61, 0x78, 0x50, + 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x12, 0x4d, 0x61, 0x78, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x4d, 0x61, 0x78, 0x43, + 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x15, 0x4d, 0x61, 0x78, 0x43, 0x6f, 0x6e, 0x63, + 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x22, 0xa7, + 0x01, 0x0a, 0x12, 0x50, 0x61, 0x73, 0x73, 0x69, 0x76, 0x65, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, + 0x43, 0x68, 0x65, 0x63, 0x6b, 0x12, 0x35, 0x0a, 0x08, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, + 0x6c, 0x18, 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, 0x52, 0x08, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x12, 0x20, 0x0a, 0x0b, + 0x4d, 0x61, 0x78, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x0b, 0x4d, 0x61, 0x78, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x73, 0x12, 0x38, + 0x0a, 0x17, 0x45, 0x6e, 0x66, 0x6f, 0x72, 0x63, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6e, 0x73, 0x65, + 0x63, 0x75, 0x74, 0x69, 0x76, 0x65, 0x35, 0x78, 0x78, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x17, 0x45, 0x6e, 0x66, 0x6f, 0x72, 0x63, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6e, 0x73, 0x65, 0x63, + 0x75, 0x74, 0x69, 0x76, 0x65, 0x35, 0x78, 0x78, 0x22, 0x45, 0x0a, 0x11, 0x44, 0x65, 0x73, 0x74, + 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x1c, 0x0a, + 0x09, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, + 0x52, 0x09, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x50, + 0x6f, 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x22, + 0xb6, 0x02, 0x0a, 0x0a, 0x41, 0x50, 0x49, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x12, 0x4f, + 0x0a, 0x04, 0x4d, 0x65, 0x74, 0x61, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3b, 0x2e, 0x68, + 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, + 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, + 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x41, 0x50, 0x49, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, + 0x4d, 0x65, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x4d, 0x65, 0x74, 0x61, 0x12, + 0x57, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, + 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x41, 0x50, 0x49, 0x47, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x09, 0x4c, + 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x73, 0x12, 0x45, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, - 0x2e, 0x41, 0x50, 0x49, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4d, 0x65, 0x74, 0x61, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x57, 0x0a, 0x09, 0x4c, - 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x39, - 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, - 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x41, 0x50, 0x49, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, - 0x79, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x65, - 0x6e, 0x65, 0x72, 0x73, 0x12, 0x45, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, - 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, - 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x52, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x1a, 0x37, 0x0a, 0x09, 0x4d, - 0x65, 0x74, 0x61, 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, 0x22, 0x5a, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x50, - 0x0a, 0x0a, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, + 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x1a, + 0x37, 0x0a, 0x09, 0x4d, 0x65, 0x74, 0x61, 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, 0x22, 0x5a, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x12, 0x50, 0x0a, 0x0a, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, + 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, + 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x43, + 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x8b, 0x02, 0x0a, 0x09, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x16, + 0x0a, 0x06, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, + 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, + 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, + 0x12, 0x54, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x43, 0x6f, 0x6e, 0x64, 0x69, - 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x22, 0x8b, 0x02, 0x0a, 0x09, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, - 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x54, 0x79, - 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x52, 0x65, - 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x52, 0x65, 0x61, 0x73, - 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x07, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x54, 0x0a, 0x08, - 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x38, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x08, 0x52, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x4a, 0x0a, 0x12, 0x4c, 0x61, 0x73, 0x74, 0x54, 0x72, + 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x12, + 0x4c, 0x61, 0x73, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, + 0x6d, 0x65, 0x22, 0x8c, 0x02, 0x0a, 0x12, 0x41, 0x50, 0x49, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, + 0x79, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, + 0x08, 0x48, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x48, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x6f, 0x72, + 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x5d, 0x0a, + 0x08, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x41, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, + 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x41, 0x50, 0x49, 0x47, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, + 0x6f, 0x6c, 0x52, 0x08, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x53, 0x0a, 0x03, + 0x54, 0x4c, 0x53, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x41, 0x2e, 0x68, 0x61, 0x73, 0x68, + 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, + 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, + 0x79, 0x2e, 0x41, 0x50, 0x49, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x54, 0x4c, 0x53, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x03, 0x54, 0x4c, + 0x53, 0x22, 0xde, 0x01, 0x0a, 0x1a, 0x41, 0x50, 0x49, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, + 0x54, 0x4c, 0x53, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x12, 0x5c, 0x0a, 0x0c, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, + 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, + 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x52, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, + 0x52, 0x0c, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, 0x12, 0x1e, + 0x0a, 0x0a, 0x4d, 0x69, 0x6e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0a, 0x4d, 0x69, 0x6e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1e, + 0x0a, 0x0a, 0x4d, 0x61, 0x78, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0a, 0x4d, 0x61, 0x78, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x22, + 0x0a, 0x0c, 0x43, 0x69, 0x70, 0x68, 0x65, 0x72, 0x53, 0x75, 0x69, 0x74, 0x65, 0x73, 0x18, 0x04, + 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x43, 0x69, 0x70, 0x68, 0x65, 0x72, 0x53, 0x75, 0x69, 0x74, + 0x65, 0x73, 0x22, 0xb7, 0x01, 0x0a, 0x11, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, + 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x4b, 0x69, 0x6e, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x12, 0x0a, 0x04, + 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, + 0x12, 0x20, 0x0a, 0x0b, 0x53, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x53, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, + 0x6d, 0x65, 0x12, 0x58, 0x0a, 0x0e, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, + 0x4d, 0x65, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x68, 0x61, 0x73, + 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, + 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6e, + 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x52, 0x0e, 0x45, 0x6e, + 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x22, 0xfe, 0x01, 0x0a, + 0x0f, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x41, 0x50, 0x49, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, + 0x12, 0x54, 0x0a, 0x04, 0x4d, 0x65, 0x74, 0x61, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x40, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, - 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x08, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x12, 0x4a, 0x0a, 0x12, 0x4c, 0x61, 0x73, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, - 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x12, 0x4c, 0x61, 0x73, 0x74, - 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x22, 0x8c, - 0x02, 0x0a, 0x12, 0x41, 0x50, 0x49, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x4c, 0x69, 0x73, - 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x48, 0x6f, 0x73, - 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x48, 0x6f, 0x73, - 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x5d, 0x0a, 0x08, 0x50, 0x72, 0x6f, - 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x41, 0x2e, 0x68, 0x61, + 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x41, 0x50, 0x49, 0x47, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x52, 0x04, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x5c, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, + 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3e, 0x2e, 0x68, 0x61, 0x73, 0x68, + 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, + 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, + 0x79, 0x2e, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x41, 0x50, 0x49, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, + 0x79, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x65, + 0x6e, 0x65, 0x72, 0x73, 0x1a, 0x37, 0x0a, 0x09, 0x4d, 0x65, 0x74, 0x61, 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, 0x22, 0xdd, 0x01, + 0x0a, 0x17, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x41, 0x50, 0x49, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, + 0x79, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x5c, 0x0a, + 0x0c, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, 0x18, 0x02, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, + 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, + 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x52, 0x65, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x0c, 0x43, + 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, 0x12, 0x50, 0x0a, 0x06, 0x52, + 0x6f, 0x75, 0x74, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, - 0x74, 0x72, 0x79, 0x2e, 0x41, 0x50, 0x49, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x4c, 0x69, - 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x52, 0x08, - 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x53, 0x0a, 0x03, 0x54, 0x4c, 0x53, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x41, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, - 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, - 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x41, 0x50, - 0x49, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x54, 0x4c, 0x53, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x03, 0x54, 0x4c, 0x53, 0x22, 0xde, 0x01, - 0x0a, 0x1a, 0x41, 0x50, 0x49, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x54, 0x4c, 0x53, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x5c, 0x0a, 0x0c, - 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, + 0x74, 0x72, 0x79, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x06, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x22, 0xe6, 0x01, + 0x0a, 0x11, 0x49, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, + 0x61, 0x74, 0x65, 0x12, 0x56, 0x0a, 0x04, 0x4d, 0x65, 0x74, 0x61, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x42, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, + 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x49, 0x6e, 0x6c, 0x69, 0x6e, 0x65, + 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x2e, 0x4d, 0x65, 0x74, 0x61, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x20, 0x0a, 0x0b, 0x43, + 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0b, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x12, 0x1e, 0x0a, + 0x0a, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0a, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x1a, 0x37, 0x0a, + 0x09, 0x4d, 0x65, 0x74, 0x61, 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, 0x22, 0x99, 0x03, 0x0a, 0x09, 0x48, 0x54, 0x54, 0x50, 0x52, + 0x6f, 0x75, 0x74, 0x65, 0x12, 0x4e, 0x0a, 0x04, 0x4d, 0x65, 0x74, 0x61, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x0c, 0x43, 0x65, - 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x4d, 0x69, - 0x6e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, - 0x4d, 0x69, 0x6e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x4d, 0x61, - 0x78, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, - 0x4d, 0x61, 0x78, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x22, 0x0a, 0x0c, 0x43, 0x69, - 0x70, 0x68, 0x65, 0x72, 0x53, 0x75, 0x69, 0x74, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, - 0x52, 0x0c, 0x43, 0x69, 0x70, 0x68, 0x65, 0x72, 0x53, 0x75, 0x69, 0x74, 0x65, 0x73, 0x22, 0xb7, - 0x01, 0x0a, 0x11, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, - 0x65, 0x6e, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x4b, 0x69, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, - 0x53, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0b, 0x53, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x58, - 0x0a, 0x0e, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, - 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, - 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x70, - 0x72, 0x69, 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x52, 0x0e, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x70, - 0x72, 0x69, 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x22, 0xfe, 0x01, 0x0a, 0x0f, 0x42, 0x6f, 0x75, - 0x6e, 0x64, 0x41, 0x50, 0x49, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x12, 0x54, 0x0a, 0x04, - 0x4d, 0x65, 0x74, 0x61, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x40, 0x2e, 0x68, 0x61, 0x73, - 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, - 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, - 0x72, 0x79, 0x2e, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x41, 0x50, 0x49, 0x47, 0x61, 0x74, 0x65, 0x77, - 0x61, 0x79, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x4d, 0x65, - 0x74, 0x61, 0x12, 0x5c, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x73, 0x18, - 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3e, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x52, + 0x6f, 0x75, 0x74, 0x65, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, + 0x4d, 0x65, 0x74, 0x61, 0x12, 0x52, 0x0a, 0x07, 0x50, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x73, 0x18, + 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, - 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x42, 0x6f, - 0x75, 0x6e, 0x64, 0x41, 0x50, 0x49, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x4c, 0x69, 0x73, - 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x73, - 0x1a, 0x37, 0x0a, 0x09, 0x4d, 0x65, 0x74, 0x61, 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, 0x22, 0xdd, 0x01, 0x0a, 0x17, 0x42, 0x6f, - 0x75, 0x6e, 0x64, 0x41, 0x50, 0x49, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x4c, 0x69, 0x73, - 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x5c, 0x0a, 0x0c, 0x43, 0x65, 0x72, - 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x38, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, - 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x0c, 0x43, 0x65, 0x72, 0x74, 0x69, - 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, 0x12, 0x50, 0x0a, 0x06, 0x52, 0x6f, 0x75, 0x74, 0x65, - 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, + 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x52, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, + 0x07, 0x50, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x4a, 0x0a, 0x05, 0x52, 0x75, 0x6c, 0x65, + 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, - 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, - 0x65, 0x52, 0x06, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x22, 0xe6, 0x01, 0x0a, 0x11, 0x49, 0x6e, - 0x6c, 0x69, 0x6e, 0x65, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x12, - 0x56, 0x0a, 0x04, 0x4d, 0x65, 0x74, 0x61, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x42, 0x2e, - 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, - 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x49, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x43, 0x65, 0x72, 0x74, - 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x04, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x20, 0x0a, 0x0b, 0x43, 0x65, 0x72, 0x74, 0x69, - 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x43, 0x65, - 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x50, 0x72, 0x69, - 0x76, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x50, - 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x1a, 0x37, 0x0a, 0x09, 0x4d, 0x65, 0x74, + 0x48, 0x54, 0x54, 0x50, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x05, 0x52, + 0x75, 0x6c, 0x65, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x48, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, + 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x48, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, + 0x65, 0x73, 0x12, 0x45, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, + 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x52, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x1a, 0x37, 0x0a, 0x09, 0x4d, 0x65, 0x74, 0x61, 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, 0x22, 0x99, 0x03, 0x0a, 0x09, 0x48, 0x54, 0x54, 0x50, 0x52, 0x6f, 0x75, 0x74, 0x65, - 0x12, 0x4e, 0x0a, 0x04, 0x4d, 0x65, 0x74, 0x61, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3a, - 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, - 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x52, 0x6f, 0x75, 0x74, 0x65, - 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x4d, 0x65, 0x74, 0x61, - 0x12, 0x52, 0x0a, 0x07, 0x50, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x38, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, - 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x07, 0x50, 0x61, 0x72, - 0x65, 0x6e, 0x74, 0x73, 0x12, 0x4a, 0x0a, 0x05, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x18, 0x03, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, + 0x38, 0x01, 0x22, 0xf9, 0x01, 0x0a, 0x0d, 0x48, 0x54, 0x54, 0x50, 0x52, 0x6f, 0x75, 0x74, 0x65, + 0x52, 0x75, 0x6c, 0x65, 0x12, 0x4c, 0x0a, 0x07, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, + 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, + 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x48, 0x54, + 0x54, 0x50, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x52, 0x07, 0x46, 0x69, 0x6c, 0x74, 0x65, + 0x72, 0x73, 0x12, 0x4a, 0x0a, 0x07, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x18, 0x02, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x48, 0x54, 0x54, 0x50, - 0x52, 0x6f, 0x75, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x05, 0x52, 0x75, 0x6c, 0x65, 0x73, - 0x12, 0x1c, 0x0a, 0x09, 0x48, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x04, 0x20, - 0x03, 0x28, 0x09, 0x52, 0x09, 0x48, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x45, - 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, + 0x4d, 0x61, 0x74, 0x63, 0x68, 0x52, 0x07, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x12, 0x4e, + 0x0a, 0x08, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x32, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, + 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x53, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x52, 0x08, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x22, 0xc4, + 0x02, 0x0a, 0x09, 0x48, 0x54, 0x54, 0x50, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x12, 0x50, 0x0a, 0x07, + 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x36, 0x2e, + 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, + 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, + 0x4d, 0x61, 0x74, 0x63, 0x68, 0x52, 0x07, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x12, 0x4e, + 0x0a, 0x06, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x36, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x53, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x1a, 0x37, 0x0a, 0x09, 0x4d, 0x65, 0x74, 0x61, 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, 0x22, 0xf9, - 0x01, 0x0a, 0x0d, 0x48, 0x54, 0x54, 0x50, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, - 0x12, 0x4c, 0x0a, 0x07, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x32, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, - 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x46, 0x69, - 0x6c, 0x74, 0x65, 0x72, 0x73, 0x52, 0x07, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x12, 0x4a, - 0x0a, 0x07, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x30, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, - 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x4d, 0x61, 0x74, 0x63, - 0x68, 0x52, 0x07, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x12, 0x4e, 0x0a, 0x08, 0x53, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x68, + 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x4d, 0x61, 0x74, 0x63, 0x68, + 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x52, 0x06, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, 0x48, + 0x0a, 0x04, 0x50, 0x61, 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, - 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x52, 0x08, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x22, 0xc4, 0x02, 0x0a, 0x09, 0x48, - 0x54, 0x54, 0x50, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x12, 0x50, 0x0a, 0x07, 0x48, 0x65, 0x61, 0x64, - 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x68, 0x61, 0x73, 0x68, - 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, - 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, - 0x79, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x74, 0x63, - 0x68, 0x52, 0x07, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x12, 0x4e, 0x0a, 0x06, 0x4d, 0x65, - 0x74, 0x68, 0x6f, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x36, 0x2e, 0x68, 0x61, 0x73, - 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, - 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, - 0x72, 0x79, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x4d, 0x65, 0x74, 0x68, - 0x6f, 0x64, 0x52, 0x06, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, 0x48, 0x0a, 0x04, 0x50, 0x61, - 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, - 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, - 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, - 0x2e, 0x48, 0x54, 0x54, 0x50, 0x50, 0x61, 0x74, 0x68, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x52, 0x04, - 0x50, 0x61, 0x74, 0x68, 0x12, 0x4b, 0x0a, 0x05, 0x51, 0x75, 0x65, 0x72, 0x79, 0x18, 0x04, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, - 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, - 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x48, 0x54, 0x54, 0x50, - 0x51, 0x75, 0x65, 0x72, 0x79, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x52, 0x05, 0x51, 0x75, 0x65, 0x72, - 0x79, 0x22, 0x8d, 0x01, 0x0a, 0x0f, 0x48, 0x54, 0x54, 0x50, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, - 0x4d, 0x61, 0x74, 0x63, 0x68, 0x12, 0x50, 0x0a, 0x05, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0e, 0x32, 0x3a, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, - 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, - 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x48, 0x54, 0x54, - 0x50, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x54, 0x79, 0x70, 0x65, - 0x52, 0x05, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x56, - 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x56, 0x61, 0x6c, 0x75, - 0x65, 0x22, 0x75, 0x0a, 0x0d, 0x48, 0x54, 0x54, 0x50, 0x50, 0x61, 0x74, 0x68, 0x4d, 0x61, 0x74, - 0x63, 0x68, 0x12, 0x4e, 0x0a, 0x05, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0e, 0x32, 0x38, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, - 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x50, 0x61, - 0x74, 0x68, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x54, 0x79, 0x70, 0x65, 0x52, 0x05, 0x4d, 0x61, 0x74, - 0x63, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x8b, 0x01, 0x0a, 0x0e, 0x48, 0x54, 0x54, - 0x50, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x12, 0x4f, 0x0a, 0x05, 0x4d, - 0x61, 0x74, 0x63, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x39, 0x2e, 0x68, 0x61, 0x73, - 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, - 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, - 0x72, 0x79, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4d, 0x61, 0x74, 0x63, - 0x68, 0x54, 0x79, 0x70, 0x65, 0x52, 0x05, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x12, 0x12, 0x0a, 0x04, - 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, - 0x12, 0x14, 0x0a, 0x05, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x22, 0xb5, 0x01, 0x0a, 0x0b, 0x48, 0x54, 0x54, 0x50, 0x46, - 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x12, 0x51, 0x0a, 0x07, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, - 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, + 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x50, 0x61, 0x74, 0x68, 0x4d, 0x61, 0x74, + 0x63, 0x68, 0x52, 0x04, 0x50, 0x61, 0x74, 0x68, 0x12, 0x4b, 0x0a, 0x05, 0x51, 0x75, 0x65, 0x72, + 0x79, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, - 0x48, 0x54, 0x54, 0x50, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, - 0x52, 0x07, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x12, 0x53, 0x0a, 0x0b, 0x55, 0x52, 0x4c, - 0x52, 0x65, 0x77, 0x72, 0x69, 0x74, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x31, + 0x48, 0x54, 0x54, 0x50, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x52, 0x05, + 0x51, 0x75, 0x65, 0x72, 0x79, 0x22, 0x8d, 0x01, 0x0a, 0x0f, 0x48, 0x54, 0x54, 0x50, 0x48, 0x65, + 0x61, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x12, 0x50, 0x0a, 0x05, 0x4d, 0x61, 0x74, + 0x63, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x3a, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, + 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, + 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, + 0x2e, 0x48, 0x54, 0x54, 0x50, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x74, 0x63, 0x68, + 0x54, 0x79, 0x70, 0x65, 0x52, 0x05, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x12, 0x12, 0x0a, 0x04, 0x4e, + 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, + 0x14, 0x0a, 0x05, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x56, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x75, 0x0a, 0x0d, 0x48, 0x54, 0x54, 0x50, 0x50, 0x61, 0x74, + 0x68, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x12, 0x4e, 0x0a, 0x05, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x38, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, + 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, + 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x48, 0x54, + 0x54, 0x50, 0x50, 0x61, 0x74, 0x68, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x54, 0x79, 0x70, 0x65, 0x52, + 0x05, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x8b, 0x01, 0x0a, + 0x0e, 0x48, 0x54, 0x54, 0x50, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x12, + 0x4f, 0x0a, 0x05, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x39, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x55, 0x52, 0x4c, 0x52, 0x65, 0x77, 0x72, 0x69, 0x74, - 0x65, 0x52, 0x0b, 0x55, 0x52, 0x4c, 0x52, 0x65, 0x77, 0x72, 0x69, 0x74, 0x65, 0x73, 0x22, 0x20, - 0x0a, 0x0a, 0x55, 0x52, 0x4c, 0x52, 0x65, 0x77, 0x72, 0x69, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, - 0x50, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x50, 0x61, 0x74, 0x68, - 0x22, 0xc2, 0x02, 0x0a, 0x10, 0x48, 0x54, 0x54, 0x50, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x46, - 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x52, 0x0a, 0x03, 0x41, 0x64, 0x64, 0x18, 0x01, 0x20, 0x03, + 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x51, 0x75, 0x65, 0x72, 0x79, + 0x4d, 0x61, 0x74, 0x63, 0x68, 0x54, 0x79, 0x70, 0x65, 0x52, 0x05, 0x4d, 0x61, 0x74, 0x63, 0x68, + 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x22, 0xb5, 0x01, 0x0a, 0x0b, 0x48, + 0x54, 0x54, 0x50, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x12, 0x51, 0x0a, 0x07, 0x48, 0x65, + 0x61, 0x64, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x68, 0x61, + 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, + 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, + 0x74, 0x72, 0x79, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x46, 0x69, + 0x6c, 0x74, 0x65, 0x72, 0x52, 0x07, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x12, 0x53, 0x0a, + 0x0b, 0x55, 0x52, 0x4c, 0x52, 0x65, 0x77, 0x72, 0x69, 0x74, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, + 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x55, 0x52, 0x4c, 0x52, 0x65, + 0x77, 0x72, 0x69, 0x74, 0x65, 0x52, 0x0b, 0x55, 0x52, 0x4c, 0x52, 0x65, 0x77, 0x72, 0x69, 0x74, + 0x65, 0x73, 0x22, 0x20, 0x0a, 0x0a, 0x55, 0x52, 0x4c, 0x52, 0x65, 0x77, 0x72, 0x69, 0x74, 0x65, + 0x12, 0x12, 0x0a, 0x04, 0x50, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x50, 0x61, 0x74, 0x68, 0x22, 0xc2, 0x02, 0x0a, 0x10, 0x48, 0x54, 0x54, 0x50, 0x48, 0x65, 0x61, + 0x64, 0x65, 0x72, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x52, 0x0a, 0x03, 0x41, 0x64, 0x64, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x40, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, + 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, + 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x48, + 0x54, 0x54, 0x50, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x2e, + 0x41, 0x64, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x03, 0x41, 0x64, 0x64, 0x12, 0x16, 0x0a, + 0x06, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x52, + 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x12, 0x52, 0x0a, 0x03, 0x53, 0x65, 0x74, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x40, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x48, - 0x65, 0x61, 0x64, 0x65, 0x72, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x2e, 0x41, 0x64, 0x64, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x52, 0x03, 0x41, 0x64, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x52, 0x65, 0x6d, - 0x6f, 0x76, 0x65, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x52, 0x65, 0x6d, 0x6f, 0x76, - 0x65, 0x12, 0x52, 0x0a, 0x03, 0x53, 0x65, 0x74, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x40, - 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, - 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x48, 0x65, 0x61, 0x64, 0x65, - 0x72, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x2e, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x52, 0x03, 0x53, 0x65, 0x74, 0x1a, 0x36, 0x0a, 0x08, 0x41, 0x64, 0x64, 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, 0x36, 0x0a, - 0x08, 0x53, 0x65, 0x74, 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, 0x22, 0xe1, 0x01, 0x0a, 0x0b, 0x48, 0x54, 0x54, 0x50, 0x53, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x57, 0x65, 0x69, - 0x67, 0x68, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x57, 0x65, 0x69, 0x67, 0x68, - 0x74, 0x12, 0x4c, 0x0a, 0x07, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, - 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x46, - 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x52, 0x07, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x12, - 0x58, 0x0a, 0x0e, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x4d, 0x65, 0x74, - 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, - 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, - 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x74, 0x65, 0x72, - 0x70, 0x72, 0x69, 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x52, 0x0e, 0x45, 0x6e, 0x74, 0x65, 0x72, - 0x70, 0x72, 0x69, 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x22, 0xfc, 0x02, 0x0a, 0x08, 0x54, 0x43, - 0x50, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x12, 0x4d, 0x0a, 0x04, 0x4d, 0x65, 0x74, 0x61, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, - 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, - 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x54, 0x43, 0x50, - 0x52, 0x6f, 0x75, 0x74, 0x65, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, - 0x04, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x52, 0x0a, 0x07, 0x50, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x73, - 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, + 0x65, 0x61, 0x64, 0x65, 0x72, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x2e, 0x53, 0x65, 0x74, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x52, 0x03, 0x53, 0x65, 0x74, 0x1a, 0x36, 0x0a, 0x08, 0x41, 0x64, 0x64, + 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, 0x36, 0x0a, 0x08, 0x53, 0x65, 0x74, 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, 0x22, 0xe1, 0x01, 0x0a, 0x0b, 0x48, 0x54, + 0x54, 0x50, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, + 0x06, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x57, + 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x4c, 0x0a, 0x07, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, - 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x52, - 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, - 0x52, 0x07, 0x50, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x4d, 0x0a, 0x08, 0x53, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x68, 0x61, - 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, - 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, - 0x74, 0x72, 0x79, 0x2e, 0x54, 0x43, 0x50, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x08, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x45, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, - 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, - 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, - 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x1a, - 0x37, 0x0a, 0x09, 0x4d, 0x65, 0x74, 0x61, 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, 0x22, 0x92, 0x01, 0x0a, 0x0a, 0x54, 0x43, 0x50, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x57, - 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x57, 0x65, 0x69, - 0x67, 0x68, 0x74, 0x12, 0x58, 0x0a, 0x0e, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, + 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x48, + 0x54, 0x54, 0x50, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x52, 0x07, 0x46, 0x69, 0x6c, 0x74, + 0x65, 0x72, 0x73, 0x12, 0x58, 0x0a, 0x0e, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x52, 0x0e, 0x45, - 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x2a, 0xfd, 0x01, - 0x0a, 0x04, 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x0f, 0x0a, 0x0b, 0x4b, 0x69, 0x6e, 0x64, 0x55, 0x6e, - 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e, 0x4b, 0x69, 0x6e, 0x64, 0x4d, - 0x65, 0x73, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x10, 0x01, 0x12, 0x17, 0x0a, 0x13, 0x4b, - 0x69, 0x6e, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, - 0x65, 0x72, 0x10, 0x02, 0x12, 0x16, 0x0a, 0x12, 0x4b, 0x69, 0x6e, 0x64, 0x49, 0x6e, 0x67, 0x72, - 0x65, 0x73, 0x73, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x10, 0x03, 0x12, 0x19, 0x0a, 0x15, - 0x4b, 0x69, 0x6e, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x74, 0x65, 0x6e, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x10, 0x04, 0x12, 0x17, 0x0a, 0x13, 0x4b, 0x69, 0x6e, 0x64, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x10, 0x05, - 0x12, 0x19, 0x0a, 0x15, 0x4b, 0x69, 0x6e, 0x64, 0x49, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x43, 0x65, - 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x10, 0x06, 0x12, 0x12, 0x0a, 0x0e, 0x4b, - 0x69, 0x6e, 0x64, 0x41, 0x50, 0x49, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x10, 0x07, 0x12, - 0x17, 0x0a, 0x13, 0x4b, 0x69, 0x6e, 0x64, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x41, 0x50, 0x49, 0x47, - 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x10, 0x08, 0x12, 0x11, 0x0a, 0x0d, 0x4b, 0x69, 0x6e, 0x64, - 0x48, 0x54, 0x54, 0x50, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x10, 0x09, 0x12, 0x10, 0x0a, 0x0c, 0x4b, - 0x69, 0x6e, 0x64, 0x54, 0x43, 0x50, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x10, 0x0a, 0x2a, 0x26, 0x0a, - 0x0f, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x12, 0x08, 0x0a, 0x04, 0x44, 0x65, 0x6e, 0x79, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x41, 0x6c, - 0x6c, 0x6f, 0x77, 0x10, 0x01, 0x2a, 0x21, 0x0a, 0x13, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x69, - 0x6f, 0x6e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, 0x0a, 0x06, - 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x10, 0x00, 0x2a, 0x50, 0x0a, 0x09, 0x50, 0x72, 0x6f, 0x78, - 0x79, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x14, 0x0a, 0x10, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x4d, 0x6f, - 0x64, 0x65, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x10, 0x00, 0x12, 0x18, 0x0a, 0x14, 0x50, - 0x72, 0x6f, 0x78, 0x79, 0x4d, 0x6f, 0x64, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x61, 0x72, - 0x65, 0x6e, 0x74, 0x10, 0x01, 0x12, 0x13, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x4d, 0x6f, - 0x64, 0x65, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x10, 0x02, 0x2a, 0x7b, 0x0a, 0x0f, 0x4d, 0x65, - 0x73, 0x68, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x1a, 0x0a, - 0x16, 0x4d, 0x65, 0x73, 0x68, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x4d, 0x6f, 0x64, 0x65, - 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x10, 0x00, 0x12, 0x17, 0x0a, 0x13, 0x4d, 0x65, 0x73, - 0x68, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x4d, 0x6f, 0x64, 0x65, 0x4e, 0x6f, 0x6e, 0x65, - 0x10, 0x01, 0x12, 0x18, 0x0a, 0x14, 0x4d, 0x65, 0x73, 0x68, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, - 0x79, 0x4d, 0x6f, 0x64, 0x65, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x10, 0x02, 0x12, 0x19, 0x0a, 0x15, - 0x4d, 0x65, 0x73, 0x68, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x4d, 0x6f, 0x64, 0x65, 0x52, - 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x10, 0x03, 0x2a, 0x4f, 0x0a, 0x1a, 0x41, 0x50, 0x49, 0x47, 0x61, - 0x74, 0x65, 0x77, 0x61, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x50, 0x72, 0x6f, - 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x18, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, - 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x48, 0x54, 0x54, 0x50, 0x10, 0x00, 0x12, - 0x17, 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, - 0x63, 0x6f, 0x6c, 0x54, 0x43, 0x50, 0x10, 0x01, 0x2a, 0x92, 0x02, 0x0a, 0x0f, 0x48, 0x54, 0x54, - 0x50, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, 0x16, 0x0a, 0x12, - 0x48, 0x54, 0x54, 0x50, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x41, - 0x6c, 0x6c, 0x10, 0x00, 0x12, 0x1a, 0x0a, 0x16, 0x48, 0x54, 0x54, 0x50, 0x4d, 0x61, 0x74, 0x63, - 0x68, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x10, 0x01, - 0x12, 0x19, 0x0a, 0x15, 0x48, 0x54, 0x54, 0x50, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x4d, 0x65, 0x74, - 0x68, 0x6f, 0x64, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x10, 0x02, 0x12, 0x16, 0x0a, 0x12, 0x48, - 0x54, 0x54, 0x50, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x47, 0x65, - 0x74, 0x10, 0x03, 0x12, 0x17, 0x0a, 0x13, 0x48, 0x54, 0x54, 0x50, 0x4d, 0x61, 0x74, 0x63, 0x68, - 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x48, 0x65, 0x61, 0x64, 0x10, 0x04, 0x12, 0x1a, 0x0a, 0x16, - 0x48, 0x54, 0x54, 0x50, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x10, 0x05, 0x12, 0x18, 0x0a, 0x14, 0x48, 0x54, 0x54, 0x50, - 0x4d, 0x61, 0x74, 0x63, 0x68, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x50, 0x61, 0x74, 0x63, 0x68, - 0x10, 0x06, 0x12, 0x17, 0x0a, 0x13, 0x48, 0x54, 0x54, 0x50, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x4d, - 0x65, 0x74, 0x68, 0x6f, 0x64, 0x50, 0x6f, 0x73, 0x74, 0x10, 0x07, 0x12, 0x16, 0x0a, 0x12, 0x48, - 0x54, 0x54, 0x50, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x50, 0x75, - 0x74, 0x10, 0x08, 0x12, 0x18, 0x0a, 0x14, 0x48, 0x54, 0x54, 0x50, 0x4d, 0x61, 0x74, 0x63, 0x68, - 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x54, 0x72, 0x61, 0x63, 0x65, 0x10, 0x09, 0x2a, 0xa7, 0x01, - 0x0a, 0x13, 0x48, 0x54, 0x54, 0x50, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x74, 0x63, - 0x68, 0x54, 0x79, 0x70, 0x65, 0x12, 0x18, 0x0a, 0x14, 0x48, 0x54, 0x54, 0x50, 0x48, 0x65, 0x61, - 0x64, 0x65, 0x72, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x45, 0x78, 0x61, 0x63, 0x74, 0x10, 0x00, 0x12, - 0x19, 0x0a, 0x15, 0x48, 0x54, 0x54, 0x50, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x74, - 0x63, 0x68, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x10, 0x01, 0x12, 0x1a, 0x0a, 0x16, 0x48, 0x54, - 0x54, 0x50, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x50, 0x72, 0x65, - 0x73, 0x65, 0x6e, 0x74, 0x10, 0x02, 0x12, 0x24, 0x0a, 0x20, 0x48, 0x54, 0x54, 0x50, 0x48, 0x65, - 0x61, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x52, 0x65, 0x67, 0x75, 0x6c, 0x61, 0x72, - 0x45, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x10, 0x03, 0x12, 0x19, 0x0a, 0x15, - 0x48, 0x54, 0x54, 0x50, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x53, - 0x75, 0x66, 0x66, 0x69, 0x78, 0x10, 0x04, 0x2a, 0x68, 0x0a, 0x11, 0x48, 0x54, 0x54, 0x50, 0x50, - 0x61, 0x74, 0x68, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x54, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x12, - 0x48, 0x54, 0x54, 0x50, 0x50, 0x61, 0x74, 0x68, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x45, 0x78, 0x61, - 0x63, 0x74, 0x10, 0x00, 0x12, 0x17, 0x0a, 0x13, 0x48, 0x54, 0x54, 0x50, 0x50, 0x61, 0x74, 0x68, - 0x4d, 0x61, 0x74, 0x63, 0x68, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x10, 0x01, 0x12, 0x22, 0x0a, - 0x1e, 0x48, 0x54, 0x54, 0x50, 0x50, 0x61, 0x74, 0x68, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x52, 0x65, - 0x67, 0x75, 0x6c, 0x61, 0x72, 0x45, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x10, - 0x03, 0x2a, 0x6d, 0x0a, 0x12, 0x48, 0x54, 0x54, 0x50, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4d, 0x61, - 0x74, 0x63, 0x68, 0x54, 0x79, 0x70, 0x65, 0x12, 0x17, 0x0a, 0x13, 0x48, 0x54, 0x54, 0x50, 0x51, - 0x75, 0x65, 0x72, 0x79, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x45, 0x78, 0x61, 0x63, 0x74, 0x10, 0x00, - 0x12, 0x19, 0x0a, 0x15, 0x48, 0x54, 0x54, 0x50, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4d, 0x61, 0x74, - 0x63, 0x68, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x10, 0x01, 0x12, 0x23, 0x0a, 0x1f, 0x48, - 0x54, 0x54, 0x50, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x52, 0x65, 0x67, + 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x22, 0xfc, 0x02, + 0x0a, 0x08, 0x54, 0x43, 0x50, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x12, 0x4d, 0x0a, 0x04, 0x4d, 0x65, + 0x74, 0x61, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, + 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, + 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, + 0x2e, 0x54, 0x43, 0x50, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x52, 0x04, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x52, 0x0a, 0x07, 0x50, 0x61, 0x72, + 0x65, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x68, 0x61, 0x73, + 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, + 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, + 0x72, 0x79, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, + 0x65, 0x6e, 0x63, 0x65, 0x52, 0x07, 0x50, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x4d, 0x0a, + 0x08, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x31, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, + 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x54, 0x43, 0x50, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x52, 0x08, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x45, 0x0a, 0x06, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x68, + 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, + 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, + 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x1a, 0x37, 0x0a, 0x09, 0x4d, 0x65, 0x74, 0x61, 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, 0x22, 0x92, 0x01, 0x0a, + 0x0a, 0x54, 0x43, 0x50, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x4e, + 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, + 0x16, 0x0a, 0x06, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x06, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x58, 0x0a, 0x0e, 0x45, 0x6e, 0x74, 0x65, 0x72, + 0x70, 0x72, 0x69, 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x30, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, + 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, + 0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x4d, 0x65, 0x74, + 0x61, 0x52, 0x0e, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x4d, 0x65, 0x74, + 0x61, 0x2a, 0xfd, 0x01, 0x0a, 0x04, 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x0f, 0x0a, 0x0b, 0x4b, 0x69, + 0x6e, 0x64, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e, 0x4b, + 0x69, 0x6e, 0x64, 0x4d, 0x65, 0x73, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x10, 0x01, 0x12, + 0x17, 0x0a, 0x13, 0x4b, 0x69, 0x6e, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, + 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x10, 0x02, 0x12, 0x16, 0x0a, 0x12, 0x4b, 0x69, 0x6e, 0x64, + 0x49, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x10, 0x03, + 0x12, 0x19, 0x0a, 0x15, 0x4b, 0x69, 0x6e, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, + 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x10, 0x04, 0x12, 0x17, 0x0a, 0x13, 0x4b, + 0x69, 0x6e, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x73, 0x10, 0x05, 0x12, 0x19, 0x0a, 0x15, 0x4b, 0x69, 0x6e, 0x64, 0x49, 0x6e, 0x6c, 0x69, + 0x6e, 0x65, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x10, 0x06, 0x12, + 0x12, 0x0a, 0x0e, 0x4b, 0x69, 0x6e, 0x64, 0x41, 0x50, 0x49, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, + 0x79, 0x10, 0x07, 0x12, 0x17, 0x0a, 0x13, 0x4b, 0x69, 0x6e, 0x64, 0x42, 0x6f, 0x75, 0x6e, 0x64, + 0x41, 0x50, 0x49, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x10, 0x08, 0x12, 0x11, 0x0a, 0x0d, + 0x4b, 0x69, 0x6e, 0x64, 0x48, 0x54, 0x54, 0x50, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x10, 0x09, 0x12, + 0x10, 0x0a, 0x0c, 0x4b, 0x69, 0x6e, 0x64, 0x54, 0x43, 0x50, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x10, + 0x0a, 0x2a, 0x26, 0x0a, 0x0f, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x08, 0x0a, 0x04, 0x44, 0x65, 0x6e, 0x79, 0x10, 0x00, 0x12, 0x09, + 0x0a, 0x05, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x10, 0x01, 0x2a, 0x21, 0x0a, 0x13, 0x49, 0x6e, 0x74, + 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, + 0x12, 0x0a, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x10, 0x00, 0x2a, 0x50, 0x0a, 0x09, + 0x50, 0x72, 0x6f, 0x78, 0x79, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x14, 0x0a, 0x10, 0x50, 0x72, 0x6f, + 0x78, 0x79, 0x4d, 0x6f, 0x64, 0x65, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x10, 0x00, 0x12, + 0x18, 0x0a, 0x14, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x4d, 0x6f, 0x64, 0x65, 0x54, 0x72, 0x61, 0x6e, + 0x73, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x10, 0x01, 0x12, 0x13, 0x0a, 0x0f, 0x50, 0x72, 0x6f, + 0x78, 0x79, 0x4d, 0x6f, 0x64, 0x65, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x10, 0x02, 0x2a, 0x7b, + 0x0a, 0x0f, 0x4d, 0x65, 0x73, 0x68, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x4d, 0x6f, 0x64, + 0x65, 0x12, 0x1a, 0x0a, 0x16, 0x4d, 0x65, 0x73, 0x68, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, + 0x4d, 0x6f, 0x64, 0x65, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x10, 0x00, 0x12, 0x17, 0x0a, + 0x13, 0x4d, 0x65, 0x73, 0x68, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x4d, 0x6f, 0x64, 0x65, + 0x4e, 0x6f, 0x6e, 0x65, 0x10, 0x01, 0x12, 0x18, 0x0a, 0x14, 0x4d, 0x65, 0x73, 0x68, 0x47, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x4d, 0x6f, 0x64, 0x65, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x10, 0x02, + 0x12, 0x19, 0x0a, 0x15, 0x4d, 0x65, 0x73, 0x68, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x4d, + 0x6f, 0x64, 0x65, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x10, 0x03, 0x2a, 0x4f, 0x0a, 0x1a, 0x41, + 0x50, 0x49, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, + 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x18, 0x0a, 0x14, 0x4c, 0x69, 0x73, + 0x74, 0x65, 0x6e, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x48, 0x54, 0x54, + 0x50, 0x10, 0x00, 0x12, 0x17, 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x50, + 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x54, 0x43, 0x50, 0x10, 0x01, 0x2a, 0x92, 0x02, 0x0a, + 0x0f, 0x48, 0x54, 0x54, 0x50, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, + 0x12, 0x16, 0x0a, 0x12, 0x48, 0x54, 0x54, 0x50, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x4d, 0x65, 0x74, + 0x68, 0x6f, 0x64, 0x41, 0x6c, 0x6c, 0x10, 0x00, 0x12, 0x1a, 0x0a, 0x16, 0x48, 0x54, 0x54, 0x50, + 0x4d, 0x61, 0x74, 0x63, 0x68, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x43, 0x6f, 0x6e, 0x6e, 0x65, + 0x63, 0x74, 0x10, 0x01, 0x12, 0x19, 0x0a, 0x15, 0x48, 0x54, 0x54, 0x50, 0x4d, 0x61, 0x74, 0x63, + 0x68, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x10, 0x02, 0x12, + 0x16, 0x0a, 0x12, 0x48, 0x54, 0x54, 0x50, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x4d, 0x65, 0x74, 0x68, + 0x6f, 0x64, 0x47, 0x65, 0x74, 0x10, 0x03, 0x12, 0x17, 0x0a, 0x13, 0x48, 0x54, 0x54, 0x50, 0x4d, + 0x61, 0x74, 0x63, 0x68, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x48, 0x65, 0x61, 0x64, 0x10, 0x04, + 0x12, 0x1a, 0x0a, 0x16, 0x48, 0x54, 0x54, 0x50, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x4d, 0x65, 0x74, + 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x10, 0x05, 0x12, 0x18, 0x0a, 0x14, + 0x48, 0x54, 0x54, 0x50, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x50, + 0x61, 0x74, 0x63, 0x68, 0x10, 0x06, 0x12, 0x17, 0x0a, 0x13, 0x48, 0x54, 0x54, 0x50, 0x4d, 0x61, + 0x74, 0x63, 0x68, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x50, 0x6f, 0x73, 0x74, 0x10, 0x07, 0x12, + 0x16, 0x0a, 0x12, 0x48, 0x54, 0x54, 0x50, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x4d, 0x65, 0x74, 0x68, + 0x6f, 0x64, 0x50, 0x75, 0x74, 0x10, 0x08, 0x12, 0x18, 0x0a, 0x14, 0x48, 0x54, 0x54, 0x50, 0x4d, + 0x61, 0x74, 0x63, 0x68, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x54, 0x72, 0x61, 0x63, 0x65, 0x10, + 0x09, 0x2a, 0xa7, 0x01, 0x0a, 0x13, 0x48, 0x54, 0x54, 0x50, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, + 0x4d, 0x61, 0x74, 0x63, 0x68, 0x54, 0x79, 0x70, 0x65, 0x12, 0x18, 0x0a, 0x14, 0x48, 0x54, 0x54, + 0x50, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x45, 0x78, 0x61, 0x63, + 0x74, 0x10, 0x00, 0x12, 0x19, 0x0a, 0x15, 0x48, 0x54, 0x54, 0x50, 0x48, 0x65, 0x61, 0x64, 0x65, + 0x72, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x10, 0x01, 0x12, 0x1a, + 0x0a, 0x16, 0x48, 0x54, 0x54, 0x50, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x74, 0x63, + 0x68, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x10, 0x02, 0x12, 0x24, 0x0a, 0x20, 0x48, 0x54, + 0x54, 0x50, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x52, 0x65, 0x67, 0x75, 0x6c, 0x61, 0x72, 0x45, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x10, 0x03, - 0x42, 0xa6, 0x02, 0x0a, 0x29, 0x63, 0x6f, 0x6d, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, - 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, - 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x42, 0x10, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x50, 0x72, 0x6f, 0x74, 0x6f, - 0x50, 0x01, 0x5a, 0x2f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x68, - 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2f, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x70, 0x62, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, - 0x74, 0x72, 0x79, 0xa2, 0x02, 0x04, 0x48, 0x43, 0x49, 0x43, 0xaa, 0x02, 0x25, 0x48, 0x61, 0x73, - 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x49, 0x6e, - 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, - 0x72, 0x79, 0xca, 0x02, 0x25, 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x5c, 0x43, - 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x5c, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5c, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0xe2, 0x02, 0x31, 0x48, 0x61, 0x73, - 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x5c, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x5c, 0x49, 0x6e, - 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5c, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, - 0x72, 0x79, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, - 0x28, 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x3a, 0x3a, 0x43, 0x6f, 0x6e, 0x73, - 0x75, 0x6c, 0x3a, 0x3a, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x3a, 0x3a, 0x43, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x33, + 0x12, 0x19, 0x0a, 0x15, 0x48, 0x54, 0x54, 0x50, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x4d, 0x61, + 0x74, 0x63, 0x68, 0x53, 0x75, 0x66, 0x66, 0x69, 0x78, 0x10, 0x04, 0x2a, 0x68, 0x0a, 0x11, 0x48, + 0x54, 0x54, 0x50, 0x50, 0x61, 0x74, 0x68, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x54, 0x79, 0x70, 0x65, + 0x12, 0x16, 0x0a, 0x12, 0x48, 0x54, 0x54, 0x50, 0x50, 0x61, 0x74, 0x68, 0x4d, 0x61, 0x74, 0x63, + 0x68, 0x45, 0x78, 0x61, 0x63, 0x74, 0x10, 0x00, 0x12, 0x17, 0x0a, 0x13, 0x48, 0x54, 0x54, 0x50, + 0x50, 0x61, 0x74, 0x68, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x10, + 0x01, 0x12, 0x22, 0x0a, 0x1e, 0x48, 0x54, 0x54, 0x50, 0x50, 0x61, 0x74, 0x68, 0x4d, 0x61, 0x74, + 0x63, 0x68, 0x52, 0x65, 0x67, 0x75, 0x6c, 0x61, 0x72, 0x45, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, + 0x69, 0x6f, 0x6e, 0x10, 0x03, 0x2a, 0x6d, 0x0a, 0x12, 0x48, 0x54, 0x54, 0x50, 0x51, 0x75, 0x65, + 0x72, 0x79, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x54, 0x79, 0x70, 0x65, 0x12, 0x17, 0x0a, 0x13, 0x48, + 0x54, 0x54, 0x50, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x45, 0x78, 0x61, + 0x63, 0x74, 0x10, 0x00, 0x12, 0x19, 0x0a, 0x15, 0x48, 0x54, 0x54, 0x50, 0x51, 0x75, 0x65, 0x72, + 0x79, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x10, 0x01, 0x12, + 0x23, 0x0a, 0x1f, 0x48, 0x54, 0x54, 0x50, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4d, 0x61, 0x74, 0x63, + 0x68, 0x52, 0x65, 0x67, 0x75, 0x6c, 0x61, 0x72, 0x45, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, + 0x6f, 0x6e, 0x10, 0x03, 0x42, 0xae, 0x02, 0x0a, 0x29, 0x63, 0x6f, 0x6d, 0x2e, 0x68, 0x61, 0x73, + 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, + 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, + 0x72, 0x79, 0x42, 0x10, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x50, + 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x37, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, + 0x6f, 0x6d, 0x2f, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2f, 0x63, 0x6f, 0x6e, + 0x73, 0x75, 0x6c, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, + 0x65, 0x2f, 0x70, 0x62, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0xa2, + 0x02, 0x04, 0x48, 0x43, 0x49, 0x43, 0xaa, 0x02, 0x25, 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, + 0x72, 0x70, 0x2e, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, + 0x61, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0xca, 0x02, + 0x25, 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x5c, 0x43, 0x6f, 0x6e, 0x73, 0x75, + 0x6c, 0x5c, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5c, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0xe2, 0x02, 0x31, 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, + 0x72, 0x70, 0x5c, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x5c, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, + 0x61, 0x6c, 0x5c, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x5c, 0x47, + 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x28, 0x48, 0x61, 0x73, + 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x3a, 0x3a, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x3a, 0x3a, + 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x3a, 0x3a, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x65, 0x6e, 0x74, 0x72, 0x79, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( - file_proto_pbconfigentry_config_entry_proto_rawDescOnce sync.Once - file_proto_pbconfigentry_config_entry_proto_rawDescData = file_proto_pbconfigentry_config_entry_proto_rawDesc + file_private_pbconfigentry_config_entry_proto_rawDescOnce sync.Once + file_private_pbconfigentry_config_entry_proto_rawDescData = file_private_pbconfigentry_config_entry_proto_rawDesc ) -func file_proto_pbconfigentry_config_entry_proto_rawDescGZIP() []byte { - file_proto_pbconfigentry_config_entry_proto_rawDescOnce.Do(func() { - file_proto_pbconfigentry_config_entry_proto_rawDescData = protoimpl.X.CompressGZIP(file_proto_pbconfigentry_config_entry_proto_rawDescData) +func file_private_pbconfigentry_config_entry_proto_rawDescGZIP() []byte { + file_private_pbconfigentry_config_entry_proto_rawDescOnce.Do(func() { + file_private_pbconfigentry_config_entry_proto_rawDescData = protoimpl.X.CompressGZIP(file_private_pbconfigentry_config_entry_proto_rawDescData) }) - return file_proto_pbconfigentry_config_entry_proto_rawDescData + return file_private_pbconfigentry_config_entry_proto_rawDescData } -var file_proto_pbconfigentry_config_entry_proto_enumTypes = make([]protoimpl.EnumInfo, 10) -var file_proto_pbconfigentry_config_entry_proto_msgTypes = make([]protoimpl.MessageInfo, 79) -var file_proto_pbconfigentry_config_entry_proto_goTypes = []interface{}{ +var file_private_pbconfigentry_config_entry_proto_enumTypes = make([]protoimpl.EnumInfo, 10) +var file_private_pbconfigentry_config_entry_proto_msgTypes = make([]protoimpl.MessageInfo, 79) +var file_private_pbconfigentry_config_entry_proto_goTypes = []interface{}{ (Kind)(0), // 0: hashicorp.consul.internal.configentry.Kind (IntentionAction)(0), // 1: hashicorp.consul.internal.configentry.IntentionAction (IntentionSourceType)(0), // 2: hashicorp.consul.internal.configentry.IntentionSourceType @@ -6571,7 +6571,7 @@ var file_proto_pbconfigentry_config_entry_proto_goTypes = []interface{}{ (*timestamppb.Timestamp)(nil), // 92: google.protobuf.Timestamp (*pbcommon.EnvoyExtension)(nil), // 93: hashicorp.consul.internal.common.EnvoyExtension } -var file_proto_pbconfigentry_config_entry_proto_depIdxs = []int32{ +var file_private_pbconfigentry_config_entry_proto_depIdxs = []int32{ 0, // 0: hashicorp.consul.internal.configentry.ConfigEntry.Kind:type_name -> hashicorp.consul.internal.configentry.Kind 89, // 1: hashicorp.consul.internal.configentry.ConfigEntry.EnterpriseMeta:type_name -> hashicorp.consul.internal.common.EnterpriseMeta 90, // 2: hashicorp.consul.internal.configentry.ConfigEntry.RaftIndex:type_name -> hashicorp.consul.internal.common.RaftIndex @@ -6699,13 +6699,13 @@ var file_proto_pbconfigentry_config_entry_proto_depIdxs = []int32{ 0, // [0:120] is the sub-list for field type_name } -func init() { file_proto_pbconfigentry_config_entry_proto_init() } -func file_proto_pbconfigentry_config_entry_proto_init() { - if File_proto_pbconfigentry_config_entry_proto != nil { +func init() { file_private_pbconfigentry_config_entry_proto_init() } +func file_private_pbconfigentry_config_entry_proto_init() { + if File_private_pbconfigentry_config_entry_proto != nil { return } if !protoimpl.UnsafeEnabled { - file_proto_pbconfigentry_config_entry_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + file_private_pbconfigentry_config_entry_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ConfigEntry); i { case 0: return &v.state @@ -6717,7 +6717,7 @@ func file_proto_pbconfigentry_config_entry_proto_init() { return nil } } - file_proto_pbconfigentry_config_entry_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + file_private_pbconfigentry_config_entry_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*MeshConfig); i { case 0: return &v.state @@ -6729,7 +6729,7 @@ func file_proto_pbconfigentry_config_entry_proto_init() { return nil } } - file_proto_pbconfigentry_config_entry_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + file_private_pbconfigentry_config_entry_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*TransparentProxyMeshConfig); i { case 0: return &v.state @@ -6741,7 +6741,7 @@ func file_proto_pbconfigentry_config_entry_proto_init() { return nil } } - file_proto_pbconfigentry_config_entry_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + file_private_pbconfigentry_config_entry_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*MeshTLSConfig); i { case 0: return &v.state @@ -6753,7 +6753,7 @@ func file_proto_pbconfigentry_config_entry_proto_init() { return nil } } - file_proto_pbconfigentry_config_entry_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + file_private_pbconfigentry_config_entry_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*MeshDirectionalTLSConfig); i { case 0: return &v.state @@ -6765,7 +6765,7 @@ func file_proto_pbconfigentry_config_entry_proto_init() { return nil } } - file_proto_pbconfigentry_config_entry_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + file_private_pbconfigentry_config_entry_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*MeshHTTPConfig); i { case 0: return &v.state @@ -6777,7 +6777,7 @@ func file_proto_pbconfigentry_config_entry_proto_init() { return nil } } - file_proto_pbconfigentry_config_entry_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { + file_private_pbconfigentry_config_entry_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PeeringMeshConfig); i { case 0: return &v.state @@ -6789,7 +6789,7 @@ func file_proto_pbconfigentry_config_entry_proto_init() { return nil } } - file_proto_pbconfigentry_config_entry_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { + file_private_pbconfigentry_config_entry_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ServiceResolver); i { case 0: return &v.state @@ -6801,7 +6801,7 @@ func file_proto_pbconfigentry_config_entry_proto_init() { return nil } } - file_proto_pbconfigentry_config_entry_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { + file_private_pbconfigentry_config_entry_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ServiceResolverSubset); i { case 0: return &v.state @@ -6813,7 +6813,7 @@ func file_proto_pbconfigentry_config_entry_proto_init() { return nil } } - file_proto_pbconfigentry_config_entry_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { + file_private_pbconfigentry_config_entry_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ServiceResolverRedirect); i { case 0: return &v.state @@ -6825,7 +6825,7 @@ func file_proto_pbconfigentry_config_entry_proto_init() { return nil } } - file_proto_pbconfigentry_config_entry_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { + file_private_pbconfigentry_config_entry_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ServiceResolverFailover); i { case 0: return &v.state @@ -6837,7 +6837,7 @@ func file_proto_pbconfigentry_config_entry_proto_init() { return nil } } - file_proto_pbconfigentry_config_entry_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { + file_private_pbconfigentry_config_entry_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ServiceResolverFailoverTarget); i { case 0: return &v.state @@ -6849,7 +6849,7 @@ func file_proto_pbconfigentry_config_entry_proto_init() { return nil } } - file_proto_pbconfigentry_config_entry_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { + file_private_pbconfigentry_config_entry_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*LoadBalancer); i { case 0: return &v.state @@ -6861,7 +6861,7 @@ func file_proto_pbconfigentry_config_entry_proto_init() { return nil } } - file_proto_pbconfigentry_config_entry_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { + file_private_pbconfigentry_config_entry_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*RingHashConfig); i { case 0: return &v.state @@ -6873,7 +6873,7 @@ func file_proto_pbconfigentry_config_entry_proto_init() { return nil } } - file_proto_pbconfigentry_config_entry_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { + file_private_pbconfigentry_config_entry_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*LeastRequestConfig); i { case 0: return &v.state @@ -6885,7 +6885,7 @@ func file_proto_pbconfigentry_config_entry_proto_init() { return nil } } - file_proto_pbconfigentry_config_entry_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { + file_private_pbconfigentry_config_entry_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*HashPolicy); i { case 0: return &v.state @@ -6897,7 +6897,7 @@ func file_proto_pbconfigentry_config_entry_proto_init() { return nil } } - file_proto_pbconfigentry_config_entry_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { + file_private_pbconfigentry_config_entry_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CookieConfig); i { case 0: return &v.state @@ -6909,7 +6909,7 @@ func file_proto_pbconfigentry_config_entry_proto_init() { return nil } } - file_proto_pbconfigentry_config_entry_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { + file_private_pbconfigentry_config_entry_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*IngressGateway); i { case 0: return &v.state @@ -6921,7 +6921,7 @@ func file_proto_pbconfigentry_config_entry_proto_init() { return nil } } - file_proto_pbconfigentry_config_entry_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { + file_private_pbconfigentry_config_entry_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*IngressServiceConfig); i { case 0: return &v.state @@ -6933,7 +6933,7 @@ func file_proto_pbconfigentry_config_entry_proto_init() { return nil } } - file_proto_pbconfigentry_config_entry_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { + file_private_pbconfigentry_config_entry_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GatewayTLSConfig); i { case 0: return &v.state @@ -6945,7 +6945,7 @@ func file_proto_pbconfigentry_config_entry_proto_init() { return nil } } - file_proto_pbconfigentry_config_entry_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { + file_private_pbconfigentry_config_entry_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GatewayTLSSDSConfig); i { case 0: return &v.state @@ -6957,7 +6957,7 @@ func file_proto_pbconfigentry_config_entry_proto_init() { return nil } } - file_proto_pbconfigentry_config_entry_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { + file_private_pbconfigentry_config_entry_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*IngressListener); i { case 0: return &v.state @@ -6969,7 +6969,7 @@ func file_proto_pbconfigentry_config_entry_proto_init() { return nil } } - file_proto_pbconfigentry_config_entry_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { + file_private_pbconfigentry_config_entry_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*IngressService); i { case 0: return &v.state @@ -6981,7 +6981,7 @@ func file_proto_pbconfigentry_config_entry_proto_init() { return nil } } - file_proto_pbconfigentry_config_entry_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { + file_private_pbconfigentry_config_entry_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GatewayServiceTLSConfig); i { case 0: return &v.state @@ -6993,7 +6993,7 @@ func file_proto_pbconfigentry_config_entry_proto_init() { return nil } } - file_proto_pbconfigentry_config_entry_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { + file_private_pbconfigentry_config_entry_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*HTTPHeaderModifiers); i { case 0: return &v.state @@ -7005,7 +7005,7 @@ func file_proto_pbconfigentry_config_entry_proto_init() { return nil } } - file_proto_pbconfigentry_config_entry_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { + file_private_pbconfigentry_config_entry_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ServiceIntentions); i { case 0: return &v.state @@ -7017,7 +7017,7 @@ func file_proto_pbconfigentry_config_entry_proto_init() { return nil } } - file_proto_pbconfigentry_config_entry_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { + file_private_pbconfigentry_config_entry_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SourceIntention); i { case 0: return &v.state @@ -7029,7 +7029,7 @@ func file_proto_pbconfigentry_config_entry_proto_init() { return nil } } - file_proto_pbconfigentry_config_entry_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { + file_private_pbconfigentry_config_entry_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*IntentionPermission); i { case 0: return &v.state @@ -7041,7 +7041,7 @@ func file_proto_pbconfigentry_config_entry_proto_init() { return nil } } - file_proto_pbconfigentry_config_entry_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { + file_private_pbconfigentry_config_entry_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*IntentionHTTPPermission); i { case 0: return &v.state @@ -7053,7 +7053,7 @@ func file_proto_pbconfigentry_config_entry_proto_init() { return nil } } - file_proto_pbconfigentry_config_entry_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { + file_private_pbconfigentry_config_entry_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*IntentionHTTPHeaderPermission); i { case 0: return &v.state @@ -7065,7 +7065,7 @@ func file_proto_pbconfigentry_config_entry_proto_init() { return nil } } - file_proto_pbconfigentry_config_entry_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} { + file_private_pbconfigentry_config_entry_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ServiceDefaults); i { case 0: return &v.state @@ -7077,7 +7077,7 @@ func file_proto_pbconfigentry_config_entry_proto_init() { return nil } } - file_proto_pbconfigentry_config_entry_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { + file_private_pbconfigentry_config_entry_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*TransparentProxyConfig); i { case 0: return &v.state @@ -7089,7 +7089,7 @@ func file_proto_pbconfigentry_config_entry_proto_init() { return nil } } - file_proto_pbconfigentry_config_entry_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} { + file_private_pbconfigentry_config_entry_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*MeshGatewayConfig); i { case 0: return &v.state @@ -7101,7 +7101,7 @@ func file_proto_pbconfigentry_config_entry_proto_init() { return nil } } - file_proto_pbconfigentry_config_entry_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} { + file_private_pbconfigentry_config_entry_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ExposeConfig); i { case 0: return &v.state @@ -7113,7 +7113,7 @@ func file_proto_pbconfigentry_config_entry_proto_init() { return nil } } - file_proto_pbconfigentry_config_entry_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} { + file_private_pbconfigentry_config_entry_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ExposePath); i { case 0: return &v.state @@ -7125,7 +7125,7 @@ func file_proto_pbconfigentry_config_entry_proto_init() { return nil } } - file_proto_pbconfigentry_config_entry_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} { + file_private_pbconfigentry_config_entry_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*UpstreamConfiguration); i { case 0: return &v.state @@ -7137,7 +7137,7 @@ func file_proto_pbconfigentry_config_entry_proto_init() { return nil } } - file_proto_pbconfigentry_config_entry_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} { + file_private_pbconfigentry_config_entry_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*UpstreamConfig); i { case 0: return &v.state @@ -7149,7 +7149,7 @@ func file_proto_pbconfigentry_config_entry_proto_init() { return nil } } - file_proto_pbconfigentry_config_entry_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} { + file_private_pbconfigentry_config_entry_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*UpstreamLimits); i { case 0: return &v.state @@ -7161,7 +7161,7 @@ func file_proto_pbconfigentry_config_entry_proto_init() { return nil } } - file_proto_pbconfigentry_config_entry_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} { + file_private_pbconfigentry_config_entry_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PassiveHealthCheck); i { case 0: return &v.state @@ -7173,7 +7173,7 @@ func file_proto_pbconfigentry_config_entry_proto_init() { return nil } } - file_proto_pbconfigentry_config_entry_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} { + file_private_pbconfigentry_config_entry_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*DestinationConfig); i { case 0: return &v.state @@ -7185,7 +7185,7 @@ func file_proto_pbconfigentry_config_entry_proto_init() { return nil } } - file_proto_pbconfigentry_config_entry_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} { + file_private_pbconfigentry_config_entry_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*APIGateway); i { case 0: return &v.state @@ -7197,7 +7197,7 @@ func file_proto_pbconfigentry_config_entry_proto_init() { return nil } } - file_proto_pbconfigentry_config_entry_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} { + file_private_pbconfigentry_config_entry_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Status); i { case 0: return &v.state @@ -7209,7 +7209,7 @@ func file_proto_pbconfigentry_config_entry_proto_init() { return nil } } - file_proto_pbconfigentry_config_entry_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} { + file_private_pbconfigentry_config_entry_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Condition); i { case 0: return &v.state @@ -7221,7 +7221,7 @@ func file_proto_pbconfigentry_config_entry_proto_init() { return nil } } - file_proto_pbconfigentry_config_entry_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} { + file_private_pbconfigentry_config_entry_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*APIGatewayListener); i { case 0: return &v.state @@ -7233,7 +7233,7 @@ func file_proto_pbconfigentry_config_entry_proto_init() { return nil } } - file_proto_pbconfigentry_config_entry_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} { + file_private_pbconfigentry_config_entry_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*APIGatewayTLSConfiguration); i { case 0: return &v.state @@ -7245,7 +7245,7 @@ func file_proto_pbconfigentry_config_entry_proto_init() { return nil } } - file_proto_pbconfigentry_config_entry_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} { + file_private_pbconfigentry_config_entry_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ResourceReference); i { case 0: return &v.state @@ -7257,7 +7257,7 @@ func file_proto_pbconfigentry_config_entry_proto_init() { return nil } } - file_proto_pbconfigentry_config_entry_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} { + file_private_pbconfigentry_config_entry_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*BoundAPIGateway); i { case 0: return &v.state @@ -7269,7 +7269,7 @@ func file_proto_pbconfigentry_config_entry_proto_init() { return nil } } - file_proto_pbconfigentry_config_entry_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} { + file_private_pbconfigentry_config_entry_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*BoundAPIGatewayListener); i { case 0: return &v.state @@ -7281,7 +7281,7 @@ func file_proto_pbconfigentry_config_entry_proto_init() { return nil } } - file_proto_pbconfigentry_config_entry_proto_msgTypes[48].Exporter = func(v interface{}, i int) interface{} { + file_private_pbconfigentry_config_entry_proto_msgTypes[48].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*InlineCertificate); i { case 0: return &v.state @@ -7293,7 +7293,7 @@ func file_proto_pbconfigentry_config_entry_proto_init() { return nil } } - file_proto_pbconfigentry_config_entry_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} { + file_private_pbconfigentry_config_entry_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*HTTPRoute); i { case 0: return &v.state @@ -7305,7 +7305,7 @@ func file_proto_pbconfigentry_config_entry_proto_init() { return nil } } - file_proto_pbconfigentry_config_entry_proto_msgTypes[50].Exporter = func(v interface{}, i int) interface{} { + file_private_pbconfigentry_config_entry_proto_msgTypes[50].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*HTTPRouteRule); i { case 0: return &v.state @@ -7317,7 +7317,7 @@ func file_proto_pbconfigentry_config_entry_proto_init() { return nil } } - file_proto_pbconfigentry_config_entry_proto_msgTypes[51].Exporter = func(v interface{}, i int) interface{} { + file_private_pbconfigentry_config_entry_proto_msgTypes[51].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*HTTPMatch); i { case 0: return &v.state @@ -7329,7 +7329,7 @@ func file_proto_pbconfigentry_config_entry_proto_init() { return nil } } - file_proto_pbconfigentry_config_entry_proto_msgTypes[52].Exporter = func(v interface{}, i int) interface{} { + file_private_pbconfigentry_config_entry_proto_msgTypes[52].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*HTTPHeaderMatch); i { case 0: return &v.state @@ -7341,7 +7341,7 @@ func file_proto_pbconfigentry_config_entry_proto_init() { return nil } } - file_proto_pbconfigentry_config_entry_proto_msgTypes[53].Exporter = func(v interface{}, i int) interface{} { + file_private_pbconfigentry_config_entry_proto_msgTypes[53].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*HTTPPathMatch); i { case 0: return &v.state @@ -7353,7 +7353,7 @@ func file_proto_pbconfigentry_config_entry_proto_init() { return nil } } - file_proto_pbconfigentry_config_entry_proto_msgTypes[54].Exporter = func(v interface{}, i int) interface{} { + file_private_pbconfigentry_config_entry_proto_msgTypes[54].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*HTTPQueryMatch); i { case 0: return &v.state @@ -7365,7 +7365,7 @@ func file_proto_pbconfigentry_config_entry_proto_init() { return nil } } - file_proto_pbconfigentry_config_entry_proto_msgTypes[55].Exporter = func(v interface{}, i int) interface{} { + file_private_pbconfigentry_config_entry_proto_msgTypes[55].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*HTTPFilters); i { case 0: return &v.state @@ -7377,7 +7377,7 @@ func file_proto_pbconfigentry_config_entry_proto_init() { return nil } } - file_proto_pbconfigentry_config_entry_proto_msgTypes[56].Exporter = func(v interface{}, i int) interface{} { + file_private_pbconfigentry_config_entry_proto_msgTypes[56].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*URLRewrite); i { case 0: return &v.state @@ -7389,7 +7389,7 @@ func file_proto_pbconfigentry_config_entry_proto_init() { return nil } } - file_proto_pbconfigentry_config_entry_proto_msgTypes[57].Exporter = func(v interface{}, i int) interface{} { + file_private_pbconfigentry_config_entry_proto_msgTypes[57].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*HTTPHeaderFilter); i { case 0: return &v.state @@ -7401,7 +7401,7 @@ func file_proto_pbconfigentry_config_entry_proto_init() { return nil } } - file_proto_pbconfigentry_config_entry_proto_msgTypes[58].Exporter = func(v interface{}, i int) interface{} { + file_private_pbconfigentry_config_entry_proto_msgTypes[58].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*HTTPService); i { case 0: return &v.state @@ -7413,7 +7413,7 @@ func file_proto_pbconfigentry_config_entry_proto_init() { return nil } } - file_proto_pbconfigentry_config_entry_proto_msgTypes[59].Exporter = func(v interface{}, i int) interface{} { + file_private_pbconfigentry_config_entry_proto_msgTypes[59].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*TCPRoute); i { case 0: return &v.state @@ -7425,7 +7425,7 @@ func file_proto_pbconfigentry_config_entry_proto_init() { return nil } } - file_proto_pbconfigentry_config_entry_proto_msgTypes[60].Exporter = func(v interface{}, i int) interface{} { + file_private_pbconfigentry_config_entry_proto_msgTypes[60].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*TCPService); i { case 0: return &v.state @@ -7438,7 +7438,7 @@ func file_proto_pbconfigentry_config_entry_proto_init() { } } } - file_proto_pbconfigentry_config_entry_proto_msgTypes[0].OneofWrappers = []interface{}{ + file_private_pbconfigentry_config_entry_proto_msgTypes[0].OneofWrappers = []interface{}{ (*ConfigEntry_MeshConfig)(nil), (*ConfigEntry_ServiceResolver)(nil), (*ConfigEntry_IngressGateway)(nil), @@ -7454,19 +7454,19 @@ func file_proto_pbconfigentry_config_entry_proto_init() { out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_proto_pbconfigentry_config_entry_proto_rawDesc, + RawDescriptor: file_private_pbconfigentry_config_entry_proto_rawDesc, NumEnums: 10, NumMessages: 79, NumExtensions: 0, NumServices: 0, }, - GoTypes: file_proto_pbconfigentry_config_entry_proto_goTypes, - DependencyIndexes: file_proto_pbconfigentry_config_entry_proto_depIdxs, - EnumInfos: file_proto_pbconfigentry_config_entry_proto_enumTypes, - MessageInfos: file_proto_pbconfigentry_config_entry_proto_msgTypes, + GoTypes: file_private_pbconfigentry_config_entry_proto_goTypes, + DependencyIndexes: file_private_pbconfigentry_config_entry_proto_depIdxs, + EnumInfos: file_private_pbconfigentry_config_entry_proto_enumTypes, + MessageInfos: file_private_pbconfigentry_config_entry_proto_msgTypes, }.Build() - File_proto_pbconfigentry_config_entry_proto = out.File - file_proto_pbconfigentry_config_entry_proto_rawDesc = nil - file_proto_pbconfigentry_config_entry_proto_goTypes = nil - file_proto_pbconfigentry_config_entry_proto_depIdxs = nil + File_private_pbconfigentry_config_entry_proto = out.File + file_private_pbconfigentry_config_entry_proto_rawDesc = nil + file_private_pbconfigentry_config_entry_proto_goTypes = nil + file_private_pbconfigentry_config_entry_proto_depIdxs = nil } diff --git a/proto/pbconfigentry/config_entry.proto b/proto/private/pbconfigentry/config_entry.proto similarity index 99% rename from proto/pbconfigentry/config_entry.proto rename to proto/private/pbconfigentry/config_entry.proto index 6749d5838c5..51acec261d8 100644 --- a/proto/pbconfigentry/config_entry.proto +++ b/proto/private/pbconfigentry/config_entry.proto @@ -4,7 +4,7 @@ package hashicorp.consul.internal.configentry; import "google/protobuf/duration.proto"; import "google/protobuf/timestamp.proto"; -import "proto/pbcommon/common.proto"; +import "private/pbcommon/common.proto"; enum Kind { KindUnknown = 0; diff --git a/proto/pbconnect/connect.gen.go b/proto/private/pbconnect/connect.gen.go similarity index 100% rename from proto/pbconnect/connect.gen.go rename to proto/private/pbconnect/connect.gen.go diff --git a/proto/pbconnect/connect.go b/proto/private/pbconnect/connect.go similarity index 97% rename from proto/pbconnect/connect.go rename to proto/private/pbconnect/connect.go index ae279b31aa2..8b0ead509e6 100644 --- a/proto/pbconnect/connect.go +++ b/proto/private/pbconnect/connect.go @@ -3,7 +3,7 @@ package pbconnect import ( "github.com/hashicorp/consul/acl" "github.com/hashicorp/consul/agent/structs" - "github.com/hashicorp/consul/proto/pbcommon" + "github.com/hashicorp/consul/proto/private/pbcommon" ) func QueryMetaFrom(f structs.QueryMeta) *pbcommon.QueryMeta { diff --git a/proto/pbconnect/connect.pb.binary.go b/proto/private/pbconnect/connect.pb.binary.go similarity index 95% rename from proto/pbconnect/connect.pb.binary.go rename to proto/private/pbconnect/connect.pb.binary.go index 181211db17f..60f27c9766d 100644 --- a/proto/pbconnect/connect.pb.binary.go +++ b/proto/private/pbconnect/connect.pb.binary.go @@ -1,5 +1,5 @@ // Code generated by protoc-gen-go-binary. DO NOT EDIT. -// source: proto/pbconnect/connect.proto +// source: private/pbconnect/connect.proto package pbconnect diff --git a/proto/pbconnect/connect.pb.go b/proto/private/pbconnect/connect.pb.go similarity index 60% rename from proto/pbconnect/connect.pb.go rename to proto/private/pbconnect/connect.pb.go index 4d6ac71f3a9..394f28647b7 100644 --- a/proto/pbconnect/connect.pb.go +++ b/proto/private/pbconnect/connect.pb.go @@ -2,12 +2,12 @@ // versions: // protoc-gen-go v1.28.1 // protoc (unknown) -// source: proto/pbconnect/connect.proto +// source: private/pbconnect/connect.proto package pbconnect import ( - pbcommon "github.com/hashicorp/consul/proto/pbcommon" + pbcommon "github.com/hashicorp/consul/proto/private/pbcommon" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" timestamppb "google.golang.org/protobuf/types/known/timestamppb" @@ -72,7 +72,7 @@ type CARoots struct { func (x *CARoots) Reset() { *x = CARoots{} if protoimpl.UnsafeEnabled { - mi := &file_proto_pbconnect_connect_proto_msgTypes[0] + mi := &file_private_pbconnect_connect_proto_msgTypes[0] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -85,7 +85,7 @@ func (x *CARoots) String() string { func (*CARoots) ProtoMessage() {} func (x *CARoots) ProtoReflect() protoreflect.Message { - mi := &file_proto_pbconnect_connect_proto_msgTypes[0] + mi := &file_private_pbconnect_connect_proto_msgTypes[0] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -98,7 +98,7 @@ func (x *CARoots) ProtoReflect() protoreflect.Message { // Deprecated: Use CARoots.ProtoReflect.Descriptor instead. func (*CARoots) Descriptor() ([]byte, []int) { - return file_proto_pbconnect_connect_proto_rawDescGZIP(), []int{0} + return file_private_pbconnect_connect_proto_rawDescGZIP(), []int{0} } func (x *CARoots) GetActiveRootID() string { @@ -202,7 +202,7 @@ type CARoot struct { func (x *CARoot) Reset() { *x = CARoot{} if protoimpl.UnsafeEnabled { - mi := &file_proto_pbconnect_connect_proto_msgTypes[1] + mi := &file_private_pbconnect_connect_proto_msgTypes[1] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -215,7 +215,7 @@ func (x *CARoot) String() string { func (*CARoot) ProtoMessage() {} func (x *CARoot) ProtoReflect() protoreflect.Message { - mi := &file_proto_pbconnect_connect_proto_msgTypes[1] + mi := &file_private_pbconnect_connect_proto_msgTypes[1] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -228,7 +228,7 @@ func (x *CARoot) ProtoReflect() protoreflect.Message { // Deprecated: Use CARoot.ProtoReflect.Descriptor instead. func (*CARoot) Descriptor() ([]byte, []int) { - return file_proto_pbconnect_connect_proto_rawDescGZIP(), []int{1} + return file_private_pbconnect_connect_proto_rawDescGZIP(), []int{1} } func (x *CARoot) GetID() string { @@ -396,7 +396,7 @@ type IssuedCert struct { func (x *IssuedCert) Reset() { *x = IssuedCert{} if protoimpl.UnsafeEnabled { - mi := &file_proto_pbconnect_connect_proto_msgTypes[2] + mi := &file_private_pbconnect_connect_proto_msgTypes[2] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -409,7 +409,7 @@ func (x *IssuedCert) String() string { func (*IssuedCert) ProtoMessage() {} func (x *IssuedCert) ProtoReflect() protoreflect.Message { - mi := &file_proto_pbconnect_connect_proto_msgTypes[2] + mi := &file_private_pbconnect_connect_proto_msgTypes[2] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -422,7 +422,7 @@ func (x *IssuedCert) ProtoReflect() protoreflect.Message { // Deprecated: Use IssuedCert.ProtoReflect.Descriptor instead. func (*IssuedCert) Descriptor() ([]byte, []int) { - return file_proto_pbconnect_connect_proto_rawDescGZIP(), []int{2} + return file_private_pbconnect_connect_proto_rawDescGZIP(), []int{2} } func (x *IssuedCert) GetSerialNumber() string { @@ -523,143 +523,144 @@ func (x *IssuedCert) GetRaftIndex() *pbcommon.RaftIndex { return nil } -var File_proto_pbconnect_connect_proto protoreflect.FileDescriptor - -var file_proto_pbconnect_connect_proto_rawDesc = []byte{ - 0x0a, 0x1d, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x70, 0x62, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, - 0x74, 0x2f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, - 0x21, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, - 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x6e, 0x65, - 0x63, 0x74, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x1a, 0x1b, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x70, 0x62, 0x63, 0x6f, 0x6d, - 0x6d, 0x6f, 0x6e, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x22, 0xdb, 0x01, 0x0a, 0x07, 0x43, 0x41, 0x52, 0x6f, 0x6f, 0x74, 0x73, 0x12, 0x22, 0x0a, 0x0c, - 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x52, 0x6f, 0x6f, 0x74, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0c, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x52, 0x6f, 0x6f, 0x74, 0x49, 0x44, - 0x12, 0x20, 0x0a, 0x0b, 0x54, 0x72, 0x75, 0x73, 0x74, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x54, 0x72, 0x75, 0x73, 0x74, 0x44, 0x6f, 0x6d, 0x61, - 0x69, 0x6e, 0x12, 0x3f, 0x0a, 0x05, 0x52, 0x6f, 0x6f, 0x74, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x29, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, - 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, - 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x2e, 0x43, 0x41, 0x52, 0x6f, 0x6f, 0x74, 0x52, 0x05, 0x52, 0x6f, - 0x6f, 0x74, 0x73, 0x12, 0x49, 0x0a, 0x09, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4d, 0x65, 0x74, 0x61, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, - 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, - 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4d, - 0x65, 0x74, 0x61, 0x52, 0x09, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4d, 0x65, 0x74, 0x61, 0x22, 0x97, - 0x05, 0x0a, 0x06, 0x43, 0x41, 0x52, 0x6f, 0x6f, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x22, 0x0a, - 0x0c, 0x53, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x04, 0x52, 0x0c, 0x53, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x4e, 0x75, 0x6d, 0x62, 0x65, - 0x72, 0x12, 0x22, 0x0a, 0x0c, 0x53, 0x69, 0x67, 0x6e, 0x69, 0x6e, 0x67, 0x4b, 0x65, 0x79, 0x49, - 0x44, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x53, 0x69, 0x67, 0x6e, 0x69, 0x6e, 0x67, - 0x4b, 0x65, 0x79, 0x49, 0x44, 0x12, 0x30, 0x0a, 0x13, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, - 0x6c, 0x54, 0x72, 0x75, 0x73, 0x74, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x13, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x54, 0x72, 0x75, 0x73, - 0x74, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x12, 0x38, 0x0a, 0x09, 0x4e, 0x6f, 0x74, 0x42, 0x65, - 0x66, 0x6f, 0x72, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, - 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x4e, 0x6f, 0x74, 0x42, 0x65, 0x66, 0x6f, 0x72, - 0x65, 0x12, 0x36, 0x0a, 0x08, 0x4e, 0x6f, 0x74, 0x41, 0x66, 0x74, 0x65, 0x72, 0x18, 0x07, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, - 0x08, 0x4e, 0x6f, 0x74, 0x41, 0x66, 0x74, 0x65, 0x72, 0x12, 0x1a, 0x0a, 0x08, 0x52, 0x6f, 0x6f, - 0x74, 0x43, 0x65, 0x72, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x52, 0x6f, 0x6f, - 0x74, 0x43, 0x65, 0x72, 0x74, 0x12, 0x2c, 0x0a, 0x11, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6d, 0x65, - 0x64, 0x69, 0x61, 0x74, 0x65, 0x43, 0x65, 0x72, 0x74, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x09, - 0x52, 0x11, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x65, 0x43, 0x65, - 0x72, 0x74, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x53, 0x69, 0x67, 0x6e, 0x69, 0x6e, 0x67, 0x43, 0x65, - 0x72, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x53, 0x69, 0x67, 0x6e, 0x69, 0x6e, - 0x67, 0x43, 0x65, 0x72, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x53, 0x69, 0x67, 0x6e, 0x69, 0x6e, 0x67, - 0x4b, 0x65, 0x79, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x53, 0x69, 0x67, 0x6e, 0x69, - 0x6e, 0x67, 0x4b, 0x65, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x18, - 0x0c, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x12, 0x3e, 0x0a, - 0x0c, 0x52, 0x6f, 0x74, 0x61, 0x74, 0x65, 0x64, 0x4f, 0x75, 0x74, 0x41, 0x74, 0x18, 0x0d, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, - 0x0c, 0x52, 0x6f, 0x74, 0x61, 0x74, 0x65, 0x64, 0x4f, 0x75, 0x74, 0x41, 0x74, 0x12, 0x26, 0x0a, - 0x0e, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x54, 0x79, 0x70, 0x65, 0x18, - 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x4b, 0x65, - 0x79, 0x54, 0x79, 0x70, 0x65, 0x12, 0x26, 0x0a, 0x0e, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, - 0x4b, 0x65, 0x79, 0x42, 0x69, 0x74, 0x73, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x50, - 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x42, 0x69, 0x74, 0x73, 0x12, 0x49, 0x0a, - 0x09, 0x52, 0x61, 0x66, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x2b, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, - 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6d, - 0x6d, 0x6f, 0x6e, 0x2e, 0x52, 0x61, 0x66, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x09, 0x52, - 0x61, 0x66, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x22, 0xc7, 0x04, 0x0a, 0x0a, 0x49, 0x73, 0x73, - 0x75, 0x65, 0x64, 0x43, 0x65, 0x72, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x53, 0x65, 0x72, 0x69, 0x61, - 0x6c, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x53, - 0x65, 0x72, 0x69, 0x61, 0x6c, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x43, - 0x65, 0x72, 0x74, 0x50, 0x45, 0x4d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x43, 0x65, - 0x72, 0x74, 0x50, 0x45, 0x4d, 0x12, 0x24, 0x0a, 0x0d, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, - 0x4b, 0x65, 0x79, 0x50, 0x45, 0x4d, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x50, 0x72, - 0x69, 0x76, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x50, 0x45, 0x4d, 0x12, 0x18, 0x0a, 0x07, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x53, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x55, 0x52, 0x49, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x55, 0x52, 0x49, 0x12, 0x14, 0x0a, 0x05, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x41, - 0x67, 0x65, 0x6e, 0x74, 0x55, 0x52, 0x49, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x41, - 0x67, 0x65, 0x6e, 0x74, 0x55, 0x52, 0x49, 0x12, 0x12, 0x0a, 0x04, 0x4b, 0x69, 0x6e, 0x64, 0x18, - 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x4b, - 0x69, 0x6e, 0x64, 0x55, 0x52, 0x49, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x4b, 0x69, - 0x6e, 0x64, 0x55, 0x52, 0x49, 0x12, 0x1c, 0x0a, 0x09, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x55, - 0x52, 0x49, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, - 0x55, 0x52, 0x49, 0x12, 0x3a, 0x0a, 0x0a, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x41, 0x66, 0x74, 0x65, - 0x72, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, - 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x41, 0x66, 0x74, 0x65, 0x72, 0x12, - 0x3c, 0x0a, 0x0b, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x42, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x18, 0x09, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, - 0x52, 0x0b, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x42, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x12, 0x58, 0x0a, - 0x0e, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x18, - 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, +var File_private_pbconnect_connect_proto protoreflect.FileDescriptor + +var file_private_pbconnect_connect_proto_rawDesc = []byte{ + 0x0a, 0x1f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2f, 0x70, 0x62, 0x63, 0x6f, 0x6e, 0x6e, + 0x65, 0x63, 0x74, 0x2f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x12, 0x21, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, + 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, + 0x6e, 0x65, 0x63, 0x74, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1d, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2f, 0x70, + 0x62, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xdb, 0x01, 0x0a, 0x07, 0x43, 0x41, 0x52, 0x6f, 0x6f, 0x74, 0x73, + 0x12, 0x22, 0x0a, 0x0c, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x52, 0x6f, 0x6f, 0x74, 0x49, 0x44, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x52, 0x6f, + 0x6f, 0x74, 0x49, 0x44, 0x12, 0x20, 0x0a, 0x0b, 0x54, 0x72, 0x75, 0x73, 0x74, 0x44, 0x6f, 0x6d, + 0x61, 0x69, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x54, 0x72, 0x75, 0x73, 0x74, + 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x12, 0x3f, 0x0a, 0x05, 0x52, 0x6f, 0x6f, 0x74, 0x73, 0x18, + 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, - 0x6c, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, - 0x69, 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x52, 0x0e, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, - 0x69, 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x49, 0x0a, 0x09, 0x52, 0x61, 0x66, 0x74, 0x49, - 0x6e, 0x64, 0x65, 0x78, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x68, 0x61, 0x73, + 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x2e, 0x43, 0x41, 0x52, 0x6f, 0x6f, 0x74, + 0x52, 0x05, 0x52, 0x6f, 0x6f, 0x74, 0x73, 0x12, 0x49, 0x0a, 0x09, 0x51, 0x75, 0x65, 0x72, 0x79, + 0x4d, 0x65, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, - 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x52, 0x61, - 0x66, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x09, 0x52, 0x61, 0x66, 0x74, 0x49, 0x6e, 0x64, - 0x65, 0x78, 0x42, 0x8a, 0x02, 0x0a, 0x25, 0x63, 0x6f, 0x6d, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, - 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, - 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x42, 0x0c, 0x43, 0x6f, - 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x2b, 0x67, 0x69, - 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, - 0x72, 0x70, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, - 0x70, 0x62, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0xa2, 0x02, 0x04, 0x48, 0x43, 0x49, 0x43, - 0xaa, 0x02, 0x21, 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x43, 0x6f, 0x6e, - 0x73, 0x75, 0x6c, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, - 0x6e, 0x65, 0x63, 0x74, 0xca, 0x02, 0x21, 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, + 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x51, 0x75, + 0x65, 0x72, 0x79, 0x4d, 0x65, 0x74, 0x61, 0x52, 0x09, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4d, 0x65, + 0x74, 0x61, 0x22, 0x97, 0x05, 0x0a, 0x06, 0x43, 0x41, 0x52, 0x6f, 0x6f, 0x74, 0x12, 0x0e, 0x0a, + 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, 0x12, 0x0a, + 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, + 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x53, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x4e, 0x75, 0x6d, 0x62, 0x65, + 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x53, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x4e, + 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x22, 0x0a, 0x0c, 0x53, 0x69, 0x67, 0x6e, 0x69, 0x6e, 0x67, + 0x4b, 0x65, 0x79, 0x49, 0x44, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x53, 0x69, 0x67, + 0x6e, 0x69, 0x6e, 0x67, 0x4b, 0x65, 0x79, 0x49, 0x44, 0x12, 0x30, 0x0a, 0x13, 0x45, 0x78, 0x74, + 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x54, 0x72, 0x75, 0x73, 0x74, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, + 0x54, 0x72, 0x75, 0x73, 0x74, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x12, 0x38, 0x0a, 0x09, 0x4e, + 0x6f, 0x74, 0x42, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x4e, 0x6f, 0x74, 0x42, + 0x65, 0x66, 0x6f, 0x72, 0x65, 0x12, 0x36, 0x0a, 0x08, 0x4e, 0x6f, 0x74, 0x41, 0x66, 0x74, 0x65, + 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x52, 0x08, 0x4e, 0x6f, 0x74, 0x41, 0x66, 0x74, 0x65, 0x72, 0x12, 0x1a, 0x0a, + 0x08, 0x52, 0x6f, 0x6f, 0x74, 0x43, 0x65, 0x72, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x52, 0x6f, 0x6f, 0x74, 0x43, 0x65, 0x72, 0x74, 0x12, 0x2c, 0x0a, 0x11, 0x49, 0x6e, 0x74, + 0x65, 0x72, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x65, 0x43, 0x65, 0x72, 0x74, 0x73, 0x18, 0x09, + 0x20, 0x03, 0x28, 0x09, 0x52, 0x11, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6d, 0x65, 0x64, 0x69, 0x61, + 0x74, 0x65, 0x43, 0x65, 0x72, 0x74, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x53, 0x69, 0x67, 0x6e, 0x69, + 0x6e, 0x67, 0x43, 0x65, 0x72, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x53, 0x69, + 0x67, 0x6e, 0x69, 0x6e, 0x67, 0x43, 0x65, 0x72, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x53, 0x69, 0x67, + 0x6e, 0x69, 0x6e, 0x67, 0x4b, 0x65, 0x79, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x53, + 0x69, 0x67, 0x6e, 0x69, 0x6e, 0x67, 0x4b, 0x65, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x41, 0x63, 0x74, + 0x69, 0x76, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x41, 0x63, 0x74, 0x69, 0x76, + 0x65, 0x12, 0x3e, 0x0a, 0x0c, 0x52, 0x6f, 0x74, 0x61, 0x74, 0x65, 0x64, 0x4f, 0x75, 0x74, 0x41, + 0x74, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x52, 0x0c, 0x52, 0x6f, 0x74, 0x61, 0x74, 0x65, 0x64, 0x4f, 0x75, 0x74, 0x41, + 0x74, 0x12, 0x26, 0x0a, 0x0e, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x54, + 0x79, 0x70, 0x65, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x50, 0x72, 0x69, 0x76, 0x61, + 0x74, 0x65, 0x4b, 0x65, 0x79, 0x54, 0x79, 0x70, 0x65, 0x12, 0x26, 0x0a, 0x0e, 0x50, 0x72, 0x69, + 0x76, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x42, 0x69, 0x74, 0x73, 0x18, 0x0f, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x0e, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x42, 0x69, 0x74, + 0x73, 0x12, 0x49, 0x0a, 0x09, 0x52, 0x61, 0x66, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x10, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, + 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, + 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x52, 0x61, 0x66, 0x74, 0x49, 0x6e, 0x64, 0x65, + 0x78, 0x52, 0x09, 0x52, 0x61, 0x66, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x22, 0xc7, 0x04, 0x0a, + 0x0a, 0x49, 0x73, 0x73, 0x75, 0x65, 0x64, 0x43, 0x65, 0x72, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x53, + 0x65, 0x72, 0x69, 0x61, 0x6c, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0c, 0x53, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, + 0x18, 0x0a, 0x07, 0x43, 0x65, 0x72, 0x74, 0x50, 0x45, 0x4d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x07, 0x43, 0x65, 0x72, 0x74, 0x50, 0x45, 0x4d, 0x12, 0x24, 0x0a, 0x0d, 0x50, 0x72, 0x69, + 0x76, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x50, 0x45, 0x4d, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0d, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x50, 0x45, 0x4d, 0x12, + 0x18, 0x0a, 0x07, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x07, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x53, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x55, 0x52, 0x49, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x53, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x55, 0x52, 0x49, 0x12, 0x14, 0x0a, 0x05, 0x41, 0x67, 0x65, + 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, + 0x1a, 0x0a, 0x08, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x55, 0x52, 0x49, 0x18, 0x07, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x55, 0x52, 0x49, 0x12, 0x12, 0x0a, 0x04, 0x4b, + 0x69, 0x6e, 0x64, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4b, 0x69, 0x6e, 0x64, 0x12, + 0x18, 0x0a, 0x07, 0x4b, 0x69, 0x6e, 0x64, 0x55, 0x52, 0x49, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x07, 0x4b, 0x69, 0x6e, 0x64, 0x55, 0x52, 0x49, 0x12, 0x1c, 0x0a, 0x09, 0x53, 0x65, 0x72, + 0x76, 0x65, 0x72, 0x55, 0x52, 0x49, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x53, 0x65, + 0x72, 0x76, 0x65, 0x72, 0x55, 0x52, 0x49, 0x12, 0x3a, 0x0a, 0x0a, 0x56, 0x61, 0x6c, 0x69, 0x64, + 0x41, 0x66, 0x74, 0x65, 0x72, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x41, 0x66, + 0x74, 0x65, 0x72, 0x12, 0x3c, 0x0a, 0x0b, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x42, 0x65, 0x66, 0x6f, + 0x72, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, + 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0b, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x42, 0x65, 0x66, 0x6f, 0x72, + 0x65, 0x12, 0x58, 0x0a, 0x0e, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x4d, + 0x65, 0x74, 0x61, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x68, 0x61, 0x73, 0x68, + 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, + 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x74, + 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x52, 0x0e, 0x45, 0x6e, 0x74, + 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x49, 0x0a, 0x09, 0x52, + 0x61, 0x66, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, + 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, + 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, + 0x6e, 0x2e, 0x52, 0x61, 0x66, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x09, 0x52, 0x61, 0x66, + 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x42, 0x92, 0x02, 0x0a, 0x25, 0x63, 0x6f, 0x6d, 0x2e, 0x68, + 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, + 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, + 0x42, 0x0c, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, + 0x5a, 0x33, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x68, 0x61, 0x73, + 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2f, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x2f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2f, 0x70, 0x62, 0x63, 0x6f, + 0x6e, 0x6e, 0x65, 0x63, 0x74, 0xa2, 0x02, 0x04, 0x48, 0x43, 0x49, 0x43, 0xaa, 0x02, 0x21, 0x48, + 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, + 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, + 0xca, 0x02, 0x21, 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x5c, 0x43, 0x6f, 0x6e, + 0x73, 0x75, 0x6c, 0x5c, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5c, 0x43, 0x6f, 0x6e, + 0x6e, 0x65, 0x63, 0x74, 0xe2, 0x02, 0x2d, 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x5c, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x5c, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, - 0x5c, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0xe2, 0x02, 0x2d, 0x48, 0x61, 0x73, 0x68, 0x69, - 0x63, 0x6f, 0x72, 0x70, 0x5c, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x5c, 0x49, 0x6e, 0x74, 0x65, - 0x72, 0x6e, 0x61, 0x6c, 0x5c, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x5c, 0x47, 0x50, 0x42, - 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x24, 0x48, 0x61, 0x73, 0x68, 0x69, - 0x63, 0x6f, 0x72, 0x70, 0x3a, 0x3a, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x3a, 0x3a, 0x49, 0x6e, - 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x3a, 0x3a, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x62, - 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x5c, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, + 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x24, 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, + 0x3a, 0x3a, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x3a, 0x3a, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, + 0x61, 0x6c, 0x3a, 0x3a, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x62, 0x06, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x33, } var ( - file_proto_pbconnect_connect_proto_rawDescOnce sync.Once - file_proto_pbconnect_connect_proto_rawDescData = file_proto_pbconnect_connect_proto_rawDesc + file_private_pbconnect_connect_proto_rawDescOnce sync.Once + file_private_pbconnect_connect_proto_rawDescData = file_private_pbconnect_connect_proto_rawDesc ) -func file_proto_pbconnect_connect_proto_rawDescGZIP() []byte { - file_proto_pbconnect_connect_proto_rawDescOnce.Do(func() { - file_proto_pbconnect_connect_proto_rawDescData = protoimpl.X.CompressGZIP(file_proto_pbconnect_connect_proto_rawDescData) +func file_private_pbconnect_connect_proto_rawDescGZIP() []byte { + file_private_pbconnect_connect_proto_rawDescOnce.Do(func() { + file_private_pbconnect_connect_proto_rawDescData = protoimpl.X.CompressGZIP(file_private_pbconnect_connect_proto_rawDescData) }) - return file_proto_pbconnect_connect_proto_rawDescData + return file_private_pbconnect_connect_proto_rawDescData } -var file_proto_pbconnect_connect_proto_msgTypes = make([]protoimpl.MessageInfo, 3) -var file_proto_pbconnect_connect_proto_goTypes = []interface{}{ +var file_private_pbconnect_connect_proto_msgTypes = make([]protoimpl.MessageInfo, 3) +var file_private_pbconnect_connect_proto_goTypes = []interface{}{ (*CARoots)(nil), // 0: hashicorp.consul.internal.connect.CARoots (*CARoot)(nil), // 1: hashicorp.consul.internal.connect.CARoot (*IssuedCert)(nil), // 2: hashicorp.consul.internal.connect.IssuedCert @@ -668,7 +669,7 @@ var file_proto_pbconnect_connect_proto_goTypes = []interface{}{ (*pbcommon.RaftIndex)(nil), // 5: hashicorp.consul.internal.common.RaftIndex (*pbcommon.EnterpriseMeta)(nil), // 6: hashicorp.consul.internal.common.EnterpriseMeta } -var file_proto_pbconnect_connect_proto_depIdxs = []int32{ +var file_private_pbconnect_connect_proto_depIdxs = []int32{ 1, // 0: hashicorp.consul.internal.connect.CARoots.Roots:type_name -> hashicorp.consul.internal.connect.CARoot 3, // 1: hashicorp.consul.internal.connect.CARoots.QueryMeta:type_name -> hashicorp.consul.internal.common.QueryMeta 4, // 2: hashicorp.consul.internal.connect.CARoot.NotBefore:type_name -> google.protobuf.Timestamp @@ -686,13 +687,13 @@ var file_proto_pbconnect_connect_proto_depIdxs = []int32{ 0, // [0:10] is the sub-list for field type_name } -func init() { file_proto_pbconnect_connect_proto_init() } -func file_proto_pbconnect_connect_proto_init() { - if File_proto_pbconnect_connect_proto != nil { +func init() { file_private_pbconnect_connect_proto_init() } +func file_private_pbconnect_connect_proto_init() { + if File_private_pbconnect_connect_proto != nil { return } if !protoimpl.UnsafeEnabled { - file_proto_pbconnect_connect_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + file_private_pbconnect_connect_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CARoots); i { case 0: return &v.state @@ -704,7 +705,7 @@ func file_proto_pbconnect_connect_proto_init() { return nil } } - file_proto_pbconnect_connect_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + file_private_pbconnect_connect_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CARoot); i { case 0: return &v.state @@ -716,7 +717,7 @@ func file_proto_pbconnect_connect_proto_init() { return nil } } - file_proto_pbconnect_connect_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + file_private_pbconnect_connect_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*IssuedCert); i { case 0: return &v.state @@ -733,18 +734,18 @@ func file_proto_pbconnect_connect_proto_init() { out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_proto_pbconnect_connect_proto_rawDesc, + RawDescriptor: file_private_pbconnect_connect_proto_rawDesc, NumEnums: 0, NumMessages: 3, NumExtensions: 0, NumServices: 0, }, - GoTypes: file_proto_pbconnect_connect_proto_goTypes, - DependencyIndexes: file_proto_pbconnect_connect_proto_depIdxs, - MessageInfos: file_proto_pbconnect_connect_proto_msgTypes, + GoTypes: file_private_pbconnect_connect_proto_goTypes, + DependencyIndexes: file_private_pbconnect_connect_proto_depIdxs, + MessageInfos: file_private_pbconnect_connect_proto_msgTypes, }.Build() - File_proto_pbconnect_connect_proto = out.File - file_proto_pbconnect_connect_proto_rawDesc = nil - file_proto_pbconnect_connect_proto_goTypes = nil - file_proto_pbconnect_connect_proto_depIdxs = nil + File_private_pbconnect_connect_proto = out.File + file_private_pbconnect_connect_proto_rawDesc = nil + file_private_pbconnect_connect_proto_goTypes = nil + file_private_pbconnect_connect_proto_depIdxs = nil } diff --git a/proto/pbconnect/connect.proto b/proto/private/pbconnect/connect.proto similarity index 99% rename from proto/pbconnect/connect.proto rename to proto/private/pbconnect/connect.proto index 071f76deae3..f19e135c380 100644 --- a/proto/pbconnect/connect.proto +++ b/proto/private/pbconnect/connect.proto @@ -3,7 +3,7 @@ syntax = "proto3"; package hashicorp.consul.internal.connect; import "google/protobuf/timestamp.proto"; -import "proto/pbcommon/common.proto"; +import "private/pbcommon/common.proto"; // CARoots is the list of all currently trusted CA Roots. // diff --git a/proto/pboperator/operator.gen.go b/proto/private/pboperator/operator.gen.go similarity index 100% rename from proto/pboperator/operator.gen.go rename to proto/private/pboperator/operator.gen.go diff --git a/proto/pboperator/operator.pb.binary.go b/proto/private/pboperator/operator.pb.binary.go similarity index 94% rename from proto/pboperator/operator.pb.binary.go rename to proto/private/pboperator/operator.pb.binary.go index 51f4fa3d817..a748b48fcef 100644 --- a/proto/pboperator/operator.pb.binary.go +++ b/proto/private/pboperator/operator.pb.binary.go @@ -1,5 +1,5 @@ // Code generated by protoc-gen-go-binary. DO NOT EDIT. -// source: proto/pboperator/operator.proto +// source: private/pboperator/operator.proto package pboperator diff --git a/proto/private/pboperator/operator.pb.go b/proto/private/pboperator/operator.pb.go new file mode 100644 index 00000000000..c66f16795b1 --- /dev/null +++ b/proto/private/pboperator/operator.pb.go @@ -0,0 +1,247 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.28.1 +// protoc (unknown) +// source: private/pboperator/operator.proto + +package pboperator + +import ( + _ "github.com/hashicorp/consul/proto-public/annotations/ratelimit" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +type TransferLeaderRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ID string `protobuf:"bytes,1,opt,name=ID,proto3" json:"ID,omitempty"` +} + +func (x *TransferLeaderRequest) Reset() { + *x = TransferLeaderRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_private_pboperator_operator_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *TransferLeaderRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TransferLeaderRequest) ProtoMessage() {} + +func (x *TransferLeaderRequest) ProtoReflect() protoreflect.Message { + mi := &file_private_pboperator_operator_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use TransferLeaderRequest.ProtoReflect.Descriptor instead. +func (*TransferLeaderRequest) Descriptor() ([]byte, []int) { + return file_private_pboperator_operator_proto_rawDescGZIP(), []int{0} +} + +func (x *TransferLeaderRequest) GetID() string { + if x != nil { + return x.ID + } + return "" +} + +// mog annotation: +// +// target=github.com/hashicorp/consul/api.TransferLeaderResponse +// output=operator.gen.go +// name=API +type TransferLeaderResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // true if the transfer is a success + Success bool `protobuf:"varint,1,opt,name=success,proto3" json:"success,omitempty"` +} + +func (x *TransferLeaderResponse) Reset() { + *x = TransferLeaderResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_private_pboperator_operator_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *TransferLeaderResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TransferLeaderResponse) ProtoMessage() {} + +func (x *TransferLeaderResponse) ProtoReflect() protoreflect.Message { + mi := &file_private_pboperator_operator_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use TransferLeaderResponse.ProtoReflect.Descriptor instead. +func (*TransferLeaderResponse) Descriptor() ([]byte, []int) { + return file_private_pboperator_operator_proto_rawDescGZIP(), []int{1} +} + +func (x *TransferLeaderResponse) GetSuccess() bool { + if x != nil { + return x.Success + } + return false +} + +var File_private_pboperator_operator_proto protoreflect.FileDescriptor + +var file_private_pboperator_operator_proto_rawDesc = []byte{ + 0x0a, 0x21, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2f, 0x70, 0x62, 0x6f, 0x70, 0x65, 0x72, + 0x61, 0x74, 0x6f, 0x72, 0x2f, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x12, 0x22, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, + 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x6f, + 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x1a, 0x25, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x72, 0x61, 0x74, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x2f, 0x72, + 0x61, 0x74, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x27, + 0x0a, 0x15, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x22, 0x32, 0x0a, 0x16, 0x54, 0x72, 0x61, 0x6e, 0x73, + 0x66, 0x65, 0x72, 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x32, 0xa3, 0x01, 0x0a, 0x0f, + 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, + 0x8f, 0x01, 0x0a, 0x0e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x4c, 0x65, 0x61, 0x64, + 0x65, 0x72, 0x12, 0x39, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, + 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x6f, + 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, + 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3a, 0x2e, + 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, + 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, + 0x6f, 0x72, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x4c, 0x65, 0x61, 0x64, 0x65, + 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xe2, 0x86, 0x04, 0x02, 0x08, + 0x01, 0x42, 0x99, 0x02, 0x0a, 0x26, 0x63, 0x6f, 0x6d, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, + 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, + 0x6e, 0x61, 0x6c, 0x2e, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x42, 0x0d, 0x4f, 0x70, + 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x34, 0x67, + 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, + 0x6f, 0x72, 0x70, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x2f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2f, 0x70, 0x62, 0x6f, 0x70, 0x65, 0x72, 0x61, + 0x74, 0x6f, 0x72, 0xa2, 0x02, 0x04, 0x48, 0x43, 0x49, 0x4f, 0xaa, 0x02, 0x22, 0x48, 0x61, 0x73, + 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x49, 0x6e, + 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0xca, + 0x02, 0x22, 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x5c, 0x43, 0x6f, 0x6e, 0x73, + 0x75, 0x6c, 0x5c, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5c, 0x4f, 0x70, 0x65, 0x72, + 0x61, 0x74, 0x6f, 0x72, 0xe2, 0x02, 0x2e, 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, + 0x5c, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x5c, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, + 0x5c, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, + 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x25, 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, + 0x70, 0x3a, 0x3a, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x3a, 0x3a, 0x49, 0x6e, 0x74, 0x65, 0x72, + 0x6e, 0x61, 0x6c, 0x3a, 0x3a, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x62, 0x06, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_private_pboperator_operator_proto_rawDescOnce sync.Once + file_private_pboperator_operator_proto_rawDescData = file_private_pboperator_operator_proto_rawDesc +) + +func file_private_pboperator_operator_proto_rawDescGZIP() []byte { + file_private_pboperator_operator_proto_rawDescOnce.Do(func() { + file_private_pboperator_operator_proto_rawDescData = protoimpl.X.CompressGZIP(file_private_pboperator_operator_proto_rawDescData) + }) + return file_private_pboperator_operator_proto_rawDescData +} + +var file_private_pboperator_operator_proto_msgTypes = make([]protoimpl.MessageInfo, 2) +var file_private_pboperator_operator_proto_goTypes = []interface{}{ + (*TransferLeaderRequest)(nil), // 0: hashicorp.consul.internal.operator.TransferLeaderRequest + (*TransferLeaderResponse)(nil), // 1: hashicorp.consul.internal.operator.TransferLeaderResponse +} +var file_private_pboperator_operator_proto_depIdxs = []int32{ + 0, // 0: hashicorp.consul.internal.operator.OperatorService.TransferLeader:input_type -> hashicorp.consul.internal.operator.TransferLeaderRequest + 1, // 1: hashicorp.consul.internal.operator.OperatorService.TransferLeader:output_type -> hashicorp.consul.internal.operator.TransferLeaderResponse + 1, // [1:2] is the sub-list for method output_type + 0, // [0:1] is the sub-list for method input_type + 0, // [0:0] is the sub-list for extension type_name + 0, // [0:0] is the sub-list for extension extendee + 0, // [0:0] is the sub-list for field type_name +} + +func init() { file_private_pboperator_operator_proto_init() } +func file_private_pboperator_operator_proto_init() { + if File_private_pboperator_operator_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_private_pboperator_operator_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TransferLeaderRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_private_pboperator_operator_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TransferLeaderResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_private_pboperator_operator_proto_rawDesc, + NumEnums: 0, + NumMessages: 2, + NumExtensions: 0, + NumServices: 1, + }, + GoTypes: file_private_pboperator_operator_proto_goTypes, + DependencyIndexes: file_private_pboperator_operator_proto_depIdxs, + MessageInfos: file_private_pboperator_operator_proto_msgTypes, + }.Build() + File_private_pboperator_operator_proto = out.File + file_private_pboperator_operator_proto_rawDesc = nil + file_private_pboperator_operator_proto_goTypes = nil + file_private_pboperator_operator_proto_depIdxs = nil +} diff --git a/proto/pboperator/operator.proto b/proto/private/pboperator/operator.proto similarity index 76% rename from proto/pboperator/operator.proto rename to proto/private/pboperator/operator.proto index 896c9eb227a..db4d02d1540 100644 --- a/proto/pboperator/operator.proto +++ b/proto/private/pboperator/operator.proto @@ -2,15 +2,13 @@ syntax = "proto3"; package hashicorp.consul.internal.operator; -import "proto-public/annotations/ratelimit/ratelimit.proto"; +import "annotations/ratelimit/ratelimit.proto"; // Operator defines a set of operators operation applicable to Consul service OperatorService { //Transfer raft leadership to another node rpc TransferLeader(TransferLeaderRequest) returns (TransferLeaderResponse) { - option (hashicorp.consul.internal.ratelimit.spec) = { - operation_type: OPERATION_TYPE_EXEMPT, - }; + option (hashicorp.consul.internal.ratelimit.spec) = {operation_type: OPERATION_TYPE_EXEMPT}; } } diff --git a/proto/pboperator/operator_grpc.pb.go b/proto/private/pboperator/operator_grpc.pb.go similarity index 97% rename from proto/pboperator/operator_grpc.pb.go rename to proto/private/pboperator/operator_grpc.pb.go index b8dac9336c4..c9af9d083d5 100644 --- a/proto/pboperator/operator_grpc.pb.go +++ b/proto/private/pboperator/operator_grpc.pb.go @@ -2,7 +2,7 @@ // versions: // - protoc-gen-go-grpc v1.2.0 // - protoc (unknown) -// source: proto/pboperator/operator.proto +// source: private/pboperator/operator.proto package pboperator @@ -101,5 +101,5 @@ var OperatorService_ServiceDesc = grpc.ServiceDesc{ }, }, Streams: []grpc.StreamDesc{}, - Metadata: "proto/pboperator/operator.proto", + Metadata: "private/pboperator/operator.proto", } diff --git a/proto/pbpeering/peering.gen.go b/proto/private/pbpeering/peering.gen.go similarity index 100% rename from proto/pbpeering/peering.gen.go rename to proto/private/pbpeering/peering.gen.go diff --git a/proto/pbpeering/peering.go b/proto/private/pbpeering/peering.go similarity index 100% rename from proto/pbpeering/peering.go rename to proto/private/pbpeering/peering.go diff --git a/proto/pbpeering/peering.pb.binary.go b/proto/private/pbpeering/peering.pb.binary.go similarity index 99% rename from proto/pbpeering/peering.pb.binary.go rename to proto/private/pbpeering/peering.pb.binary.go index 30772dcd6c6..af74d9a49e6 100644 --- a/proto/pbpeering/peering.pb.binary.go +++ b/proto/private/pbpeering/peering.pb.binary.go @@ -1,5 +1,5 @@ // Code generated by protoc-gen-go-binary. DO NOT EDIT. -// source: proto/pbpeering/peering.proto +// source: private/pbpeering/peering.proto package pbpeering diff --git a/proto/pbpeering/peering.pb.go b/proto/private/pbpeering/peering.pb.go similarity index 66% rename from proto/pbpeering/peering.pb.go rename to proto/private/pbpeering/peering.pb.go index 955900c6aa2..6132adaffdf 100644 --- a/proto/pbpeering/peering.pb.go +++ b/proto/private/pbpeering/peering.pb.go @@ -2,7 +2,7 @@ // versions: // protoc-gen-go v1.28.1 // protoc (unknown) -// source: proto/pbpeering/peering.proto +// source: private/pbpeering/peering.proto package pbpeering @@ -81,11 +81,11 @@ func (x PeeringState) String() string { } func (PeeringState) Descriptor() protoreflect.EnumDescriptor { - return file_proto_pbpeering_peering_proto_enumTypes[0].Descriptor() + return file_private_pbpeering_peering_proto_enumTypes[0].Descriptor() } func (PeeringState) Type() protoreflect.EnumType { - return &file_proto_pbpeering_peering_proto_enumTypes[0] + return &file_private_pbpeering_peering_proto_enumTypes[0] } func (x PeeringState) Number() protoreflect.EnumNumber { @@ -94,7 +94,7 @@ func (x PeeringState) Number() protoreflect.EnumNumber { // Deprecated: Use PeeringState.Descriptor instead. func (PeeringState) EnumDescriptor() ([]byte, []int) { - return file_proto_pbpeering_peering_proto_rawDescGZIP(), []int{0} + return file_private_pbpeering_peering_proto_rawDescGZIP(), []int{0} } // SecretsWriteRequest encodes a request to write a peering secret as the result @@ -119,7 +119,7 @@ type SecretsWriteRequest struct { func (x *SecretsWriteRequest) Reset() { *x = SecretsWriteRequest{} if protoimpl.UnsafeEnabled { - mi := &file_proto_pbpeering_peering_proto_msgTypes[0] + mi := &file_private_pbpeering_peering_proto_msgTypes[0] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -132,7 +132,7 @@ func (x *SecretsWriteRequest) String() string { func (*SecretsWriteRequest) ProtoMessage() {} func (x *SecretsWriteRequest) ProtoReflect() protoreflect.Message { - mi := &file_proto_pbpeering_peering_proto_msgTypes[0] + mi := &file_private_pbpeering_peering_proto_msgTypes[0] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -145,7 +145,7 @@ func (x *SecretsWriteRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SecretsWriteRequest.ProtoReflect.Descriptor instead. func (*SecretsWriteRequest) Descriptor() ([]byte, []int) { - return file_proto_pbpeering_peering_proto_rawDescGZIP(), []int{0} + return file_private_pbpeering_peering_proto_rawDescGZIP(), []int{0} } func (x *SecretsWriteRequest) GetPeerID() string { @@ -233,7 +233,7 @@ type PeeringSecrets struct { func (x *PeeringSecrets) Reset() { *x = PeeringSecrets{} if protoimpl.UnsafeEnabled { - mi := &file_proto_pbpeering_peering_proto_msgTypes[1] + mi := &file_private_pbpeering_peering_proto_msgTypes[1] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -246,7 +246,7 @@ func (x *PeeringSecrets) String() string { func (*PeeringSecrets) ProtoMessage() {} func (x *PeeringSecrets) ProtoReflect() protoreflect.Message { - mi := &file_proto_pbpeering_peering_proto_msgTypes[1] + mi := &file_private_pbpeering_peering_proto_msgTypes[1] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -259,7 +259,7 @@ func (x *PeeringSecrets) ProtoReflect() protoreflect.Message { // Deprecated: Use PeeringSecrets.ProtoReflect.Descriptor instead. func (*PeeringSecrets) Descriptor() ([]byte, []int) { - return file_proto_pbpeering_peering_proto_rawDescGZIP(), []int{1} + return file_private_pbpeering_peering_proto_rawDescGZIP(), []int{1} } func (x *PeeringSecrets) GetPeerID() string { @@ -342,7 +342,7 @@ type Peering struct { func (x *Peering) Reset() { *x = Peering{} if protoimpl.UnsafeEnabled { - mi := &file_proto_pbpeering_peering_proto_msgTypes[2] + mi := &file_private_pbpeering_peering_proto_msgTypes[2] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -355,7 +355,7 @@ func (x *Peering) String() string { func (*Peering) ProtoMessage() {} func (x *Peering) ProtoReflect() protoreflect.Message { - mi := &file_proto_pbpeering_peering_proto_msgTypes[2] + mi := &file_private_pbpeering_peering_proto_msgTypes[2] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -368,7 +368,7 @@ func (x *Peering) ProtoReflect() protoreflect.Message { // Deprecated: Use Peering.ProtoReflect.Descriptor instead. func (*Peering) Descriptor() ([]byte, []int) { - return file_proto_pbpeering_peering_proto_rawDescGZIP(), []int{2} + return file_private_pbpeering_peering_proto_rawDescGZIP(), []int{2} } func (x *Peering) GetID() string { @@ -495,7 +495,7 @@ type RemoteInfo struct { func (x *RemoteInfo) Reset() { *x = RemoteInfo{} if protoimpl.UnsafeEnabled { - mi := &file_proto_pbpeering_peering_proto_msgTypes[3] + mi := &file_private_pbpeering_peering_proto_msgTypes[3] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -508,7 +508,7 @@ func (x *RemoteInfo) String() string { func (*RemoteInfo) ProtoMessage() {} func (x *RemoteInfo) ProtoReflect() protoreflect.Message { - mi := &file_proto_pbpeering_peering_proto_msgTypes[3] + mi := &file_private_pbpeering_peering_proto_msgTypes[3] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -521,7 +521,7 @@ func (x *RemoteInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use RemoteInfo.ProtoReflect.Descriptor instead. func (*RemoteInfo) Descriptor() ([]byte, []int) { - return file_proto_pbpeering_peering_proto_rawDescGZIP(), []int{3} + return file_private_pbpeering_peering_proto_rawDescGZIP(), []int{3} } func (x *RemoteInfo) GetPartition() string { @@ -559,7 +559,7 @@ type StreamStatus struct { func (x *StreamStatus) Reset() { *x = StreamStatus{} if protoimpl.UnsafeEnabled { - mi := &file_proto_pbpeering_peering_proto_msgTypes[4] + mi := &file_private_pbpeering_peering_proto_msgTypes[4] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -572,7 +572,7 @@ func (x *StreamStatus) String() string { func (*StreamStatus) ProtoMessage() {} func (x *StreamStatus) ProtoReflect() protoreflect.Message { - mi := &file_proto_pbpeering_peering_proto_msgTypes[4] + mi := &file_private_pbpeering_peering_proto_msgTypes[4] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -585,7 +585,7 @@ func (x *StreamStatus) ProtoReflect() protoreflect.Message { // Deprecated: Use StreamStatus.ProtoReflect.Descriptor instead. func (*StreamStatus) Descriptor() ([]byte, []int) { - return file_proto_pbpeering_peering_proto_rawDescGZIP(), []int{4} + return file_private_pbpeering_peering_proto_rawDescGZIP(), []int{4} } func (x *StreamStatus) GetImportedServices() []string { @@ -651,7 +651,7 @@ type PeeringTrustBundle struct { func (x *PeeringTrustBundle) Reset() { *x = PeeringTrustBundle{} if protoimpl.UnsafeEnabled { - mi := &file_proto_pbpeering_peering_proto_msgTypes[5] + mi := &file_private_pbpeering_peering_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -664,7 +664,7 @@ func (x *PeeringTrustBundle) String() string { func (*PeeringTrustBundle) ProtoMessage() {} func (x *PeeringTrustBundle) ProtoReflect() protoreflect.Message { - mi := &file_proto_pbpeering_peering_proto_msgTypes[5] + mi := &file_private_pbpeering_peering_proto_msgTypes[5] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -677,7 +677,7 @@ func (x *PeeringTrustBundle) ProtoReflect() protoreflect.Message { // Deprecated: Use PeeringTrustBundle.ProtoReflect.Descriptor instead. func (*PeeringTrustBundle) Descriptor() ([]byte, []int) { - return file_proto_pbpeering_peering_proto_rawDescGZIP(), []int{5} + return file_private_pbpeering_peering_proto_rawDescGZIP(), []int{5} } func (x *PeeringTrustBundle) GetTrustDomain() string { @@ -742,7 +742,7 @@ type PeeringServerAddresses struct { func (x *PeeringServerAddresses) Reset() { *x = PeeringServerAddresses{} if protoimpl.UnsafeEnabled { - mi := &file_proto_pbpeering_peering_proto_msgTypes[6] + mi := &file_private_pbpeering_peering_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -755,7 +755,7 @@ func (x *PeeringServerAddresses) String() string { func (*PeeringServerAddresses) ProtoMessage() {} func (x *PeeringServerAddresses) ProtoReflect() protoreflect.Message { - mi := &file_proto_pbpeering_peering_proto_msgTypes[6] + mi := &file_private_pbpeering_peering_proto_msgTypes[6] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -768,7 +768,7 @@ func (x *PeeringServerAddresses) ProtoReflect() protoreflect.Message { // Deprecated: Use PeeringServerAddresses.ProtoReflect.Descriptor instead. func (*PeeringServerAddresses) Descriptor() ([]byte, []int) { - return file_proto_pbpeering_peering_proto_rawDescGZIP(), []int{6} + return file_private_pbpeering_peering_proto_rawDescGZIP(), []int{6} } func (x *PeeringServerAddresses) GetAddresses() []string { @@ -791,7 +791,7 @@ type PeeringReadRequest struct { func (x *PeeringReadRequest) Reset() { *x = PeeringReadRequest{} if protoimpl.UnsafeEnabled { - mi := &file_proto_pbpeering_peering_proto_msgTypes[7] + mi := &file_private_pbpeering_peering_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -804,7 +804,7 @@ func (x *PeeringReadRequest) String() string { func (*PeeringReadRequest) ProtoMessage() {} func (x *PeeringReadRequest) ProtoReflect() protoreflect.Message { - mi := &file_proto_pbpeering_peering_proto_msgTypes[7] + mi := &file_private_pbpeering_peering_proto_msgTypes[7] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -817,7 +817,7 @@ func (x *PeeringReadRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use PeeringReadRequest.ProtoReflect.Descriptor instead. func (*PeeringReadRequest) Descriptor() ([]byte, []int) { - return file_proto_pbpeering_peering_proto_rawDescGZIP(), []int{7} + return file_private_pbpeering_peering_proto_rawDescGZIP(), []int{7} } func (x *PeeringReadRequest) GetName() string { @@ -845,7 +845,7 @@ type PeeringReadResponse struct { func (x *PeeringReadResponse) Reset() { *x = PeeringReadResponse{} if protoimpl.UnsafeEnabled { - mi := &file_proto_pbpeering_peering_proto_msgTypes[8] + mi := &file_private_pbpeering_peering_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -858,7 +858,7 @@ func (x *PeeringReadResponse) String() string { func (*PeeringReadResponse) ProtoMessage() {} func (x *PeeringReadResponse) ProtoReflect() protoreflect.Message { - mi := &file_proto_pbpeering_peering_proto_msgTypes[8] + mi := &file_private_pbpeering_peering_proto_msgTypes[8] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -871,7 +871,7 @@ func (x *PeeringReadResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use PeeringReadResponse.ProtoReflect.Descriptor instead. func (*PeeringReadResponse) Descriptor() ([]byte, []int) { - return file_proto_pbpeering_peering_proto_rawDescGZIP(), []int{8} + return file_private_pbpeering_peering_proto_rawDescGZIP(), []int{8} } func (x *PeeringReadResponse) GetPeering() *Peering { @@ -893,7 +893,7 @@ type PeeringListRequest struct { func (x *PeeringListRequest) Reset() { *x = PeeringListRequest{} if protoimpl.UnsafeEnabled { - mi := &file_proto_pbpeering_peering_proto_msgTypes[9] + mi := &file_private_pbpeering_peering_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -906,7 +906,7 @@ func (x *PeeringListRequest) String() string { func (*PeeringListRequest) ProtoMessage() {} func (x *PeeringListRequest) ProtoReflect() protoreflect.Message { - mi := &file_proto_pbpeering_peering_proto_msgTypes[9] + mi := &file_private_pbpeering_peering_proto_msgTypes[9] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -919,7 +919,7 @@ func (x *PeeringListRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use PeeringListRequest.ProtoReflect.Descriptor instead. func (*PeeringListRequest) Descriptor() ([]byte, []int) { - return file_proto_pbpeering_peering_proto_rawDescGZIP(), []int{9} + return file_private_pbpeering_peering_proto_rawDescGZIP(), []int{9} } func (x *PeeringListRequest) GetPartition() string { @@ -941,7 +941,7 @@ type PeeringListResponse struct { func (x *PeeringListResponse) Reset() { *x = PeeringListResponse{} if protoimpl.UnsafeEnabled { - mi := &file_proto_pbpeering_peering_proto_msgTypes[10] + mi := &file_private_pbpeering_peering_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -954,7 +954,7 @@ func (x *PeeringListResponse) String() string { func (*PeeringListResponse) ProtoMessage() {} func (x *PeeringListResponse) ProtoReflect() protoreflect.Message { - mi := &file_proto_pbpeering_peering_proto_msgTypes[10] + mi := &file_private_pbpeering_peering_proto_msgTypes[10] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -967,7 +967,7 @@ func (x *PeeringListResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use PeeringListResponse.ProtoReflect.Descriptor instead. func (*PeeringListResponse) Descriptor() ([]byte, []int) { - return file_proto_pbpeering_peering_proto_rawDescGZIP(), []int{10} + return file_private_pbpeering_peering_proto_rawDescGZIP(), []int{10} } func (x *PeeringListResponse) GetPeerings() []*Peering { @@ -1001,7 +1001,7 @@ type PeeringWriteRequest struct { func (x *PeeringWriteRequest) Reset() { *x = PeeringWriteRequest{} if protoimpl.UnsafeEnabled { - mi := &file_proto_pbpeering_peering_proto_msgTypes[11] + mi := &file_private_pbpeering_peering_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1014,7 +1014,7 @@ func (x *PeeringWriteRequest) String() string { func (*PeeringWriteRequest) ProtoMessage() {} func (x *PeeringWriteRequest) ProtoReflect() protoreflect.Message { - mi := &file_proto_pbpeering_peering_proto_msgTypes[11] + mi := &file_private_pbpeering_peering_proto_msgTypes[11] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1027,7 +1027,7 @@ func (x *PeeringWriteRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use PeeringWriteRequest.ProtoReflect.Descriptor instead. func (*PeeringWriteRequest) Descriptor() ([]byte, []int) { - return file_proto_pbpeering_peering_proto_rawDescGZIP(), []int{11} + return file_private_pbpeering_peering_proto_rawDescGZIP(), []int{11} } func (x *PeeringWriteRequest) GetPeering() *Peering { @@ -1061,7 +1061,7 @@ type PeeringWriteResponse struct { func (x *PeeringWriteResponse) Reset() { *x = PeeringWriteResponse{} if protoimpl.UnsafeEnabled { - mi := &file_proto_pbpeering_peering_proto_msgTypes[12] + mi := &file_private_pbpeering_peering_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1074,7 +1074,7 @@ func (x *PeeringWriteResponse) String() string { func (*PeeringWriteResponse) ProtoMessage() {} func (x *PeeringWriteResponse) ProtoReflect() protoreflect.Message { - mi := &file_proto_pbpeering_peering_proto_msgTypes[12] + mi := &file_private_pbpeering_peering_proto_msgTypes[12] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1087,7 +1087,7 @@ func (x *PeeringWriteResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use PeeringWriteResponse.ProtoReflect.Descriptor instead. func (*PeeringWriteResponse) Descriptor() ([]byte, []int) { - return file_proto_pbpeering_peering_proto_rawDescGZIP(), []int{12} + return file_private_pbpeering_peering_proto_rawDescGZIP(), []int{12} } type PeeringDeleteRequest struct { @@ -1102,7 +1102,7 @@ type PeeringDeleteRequest struct { func (x *PeeringDeleteRequest) Reset() { *x = PeeringDeleteRequest{} if protoimpl.UnsafeEnabled { - mi := &file_proto_pbpeering_peering_proto_msgTypes[13] + mi := &file_private_pbpeering_peering_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1115,7 +1115,7 @@ func (x *PeeringDeleteRequest) String() string { func (*PeeringDeleteRequest) ProtoMessage() {} func (x *PeeringDeleteRequest) ProtoReflect() protoreflect.Message { - mi := &file_proto_pbpeering_peering_proto_msgTypes[13] + mi := &file_private_pbpeering_peering_proto_msgTypes[13] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1128,7 +1128,7 @@ func (x *PeeringDeleteRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use PeeringDeleteRequest.ProtoReflect.Descriptor instead. func (*PeeringDeleteRequest) Descriptor() ([]byte, []int) { - return file_proto_pbpeering_peering_proto_rawDescGZIP(), []int{13} + return file_private_pbpeering_peering_proto_rawDescGZIP(), []int{13} } func (x *PeeringDeleteRequest) GetName() string { @@ -1154,7 +1154,7 @@ type PeeringDeleteResponse struct { func (x *PeeringDeleteResponse) Reset() { *x = PeeringDeleteResponse{} if protoimpl.UnsafeEnabled { - mi := &file_proto_pbpeering_peering_proto_msgTypes[14] + mi := &file_private_pbpeering_peering_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1167,7 +1167,7 @@ func (x *PeeringDeleteResponse) String() string { func (*PeeringDeleteResponse) ProtoMessage() {} func (x *PeeringDeleteResponse) ProtoReflect() protoreflect.Message { - mi := &file_proto_pbpeering_peering_proto_msgTypes[14] + mi := &file_private_pbpeering_peering_proto_msgTypes[14] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1180,7 +1180,7 @@ func (x *PeeringDeleteResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use PeeringDeleteResponse.ProtoReflect.Descriptor instead. func (*PeeringDeleteResponse) Descriptor() ([]byte, []int) { - return file_proto_pbpeering_peering_proto_rawDescGZIP(), []int{14} + return file_private_pbpeering_peering_proto_rawDescGZIP(), []int{14} } type TrustBundleListByServiceRequest struct { @@ -1197,7 +1197,7 @@ type TrustBundleListByServiceRequest struct { func (x *TrustBundleListByServiceRequest) Reset() { *x = TrustBundleListByServiceRequest{} if protoimpl.UnsafeEnabled { - mi := &file_proto_pbpeering_peering_proto_msgTypes[15] + mi := &file_private_pbpeering_peering_proto_msgTypes[15] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1210,7 +1210,7 @@ func (x *TrustBundleListByServiceRequest) String() string { func (*TrustBundleListByServiceRequest) ProtoMessage() {} func (x *TrustBundleListByServiceRequest) ProtoReflect() protoreflect.Message { - mi := &file_proto_pbpeering_peering_proto_msgTypes[15] + mi := &file_private_pbpeering_peering_proto_msgTypes[15] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1223,7 +1223,7 @@ func (x *TrustBundleListByServiceRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use TrustBundleListByServiceRequest.ProtoReflect.Descriptor instead. func (*TrustBundleListByServiceRequest) Descriptor() ([]byte, []int) { - return file_proto_pbpeering_peering_proto_rawDescGZIP(), []int{15} + return file_private_pbpeering_peering_proto_rawDescGZIP(), []int{15} } func (x *TrustBundleListByServiceRequest) GetServiceName() string { @@ -1266,7 +1266,7 @@ type TrustBundleListByServiceResponse struct { func (x *TrustBundleListByServiceResponse) Reset() { *x = TrustBundleListByServiceResponse{} if protoimpl.UnsafeEnabled { - mi := &file_proto_pbpeering_peering_proto_msgTypes[16] + mi := &file_private_pbpeering_peering_proto_msgTypes[16] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1279,7 +1279,7 @@ func (x *TrustBundleListByServiceResponse) String() string { func (*TrustBundleListByServiceResponse) ProtoMessage() {} func (x *TrustBundleListByServiceResponse) ProtoReflect() protoreflect.Message { - mi := &file_proto_pbpeering_peering_proto_msgTypes[16] + mi := &file_private_pbpeering_peering_proto_msgTypes[16] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1292,7 +1292,7 @@ func (x *TrustBundleListByServiceResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use TrustBundleListByServiceResponse.ProtoReflect.Descriptor instead. func (*TrustBundleListByServiceResponse) Descriptor() ([]byte, []int) { - return file_proto_pbpeering_peering_proto_rawDescGZIP(), []int{16} + return file_private_pbpeering_peering_proto_rawDescGZIP(), []int{16} } func (x *TrustBundleListByServiceResponse) GetIndex() uint64 { @@ -1321,7 +1321,7 @@ type TrustBundleReadRequest struct { func (x *TrustBundleReadRequest) Reset() { *x = TrustBundleReadRequest{} if protoimpl.UnsafeEnabled { - mi := &file_proto_pbpeering_peering_proto_msgTypes[17] + mi := &file_private_pbpeering_peering_proto_msgTypes[17] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1334,7 +1334,7 @@ func (x *TrustBundleReadRequest) String() string { func (*TrustBundleReadRequest) ProtoMessage() {} func (x *TrustBundleReadRequest) ProtoReflect() protoreflect.Message { - mi := &file_proto_pbpeering_peering_proto_msgTypes[17] + mi := &file_private_pbpeering_peering_proto_msgTypes[17] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1347,7 +1347,7 @@ func (x *TrustBundleReadRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use TrustBundleReadRequest.ProtoReflect.Descriptor instead. func (*TrustBundleReadRequest) Descriptor() ([]byte, []int) { - return file_proto_pbpeering_peering_proto_rawDescGZIP(), []int{17} + return file_private_pbpeering_peering_proto_rawDescGZIP(), []int{17} } func (x *TrustBundleReadRequest) GetName() string { @@ -1376,7 +1376,7 @@ type TrustBundleReadResponse struct { func (x *TrustBundleReadResponse) Reset() { *x = TrustBundleReadResponse{} if protoimpl.UnsafeEnabled { - mi := &file_proto_pbpeering_peering_proto_msgTypes[18] + mi := &file_private_pbpeering_peering_proto_msgTypes[18] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1389,7 +1389,7 @@ func (x *TrustBundleReadResponse) String() string { func (*TrustBundleReadResponse) ProtoMessage() {} func (x *TrustBundleReadResponse) ProtoReflect() protoreflect.Message { - mi := &file_proto_pbpeering_peering_proto_msgTypes[18] + mi := &file_private_pbpeering_peering_proto_msgTypes[18] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1402,7 +1402,7 @@ func (x *TrustBundleReadResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use TrustBundleReadResponse.ProtoReflect.Descriptor instead. func (*TrustBundleReadResponse) Descriptor() ([]byte, []int) { - return file_proto_pbpeering_peering_proto_rawDescGZIP(), []int{18} + return file_private_pbpeering_peering_proto_rawDescGZIP(), []int{18} } func (x *TrustBundleReadResponse) GetIndex() uint64 { @@ -1431,7 +1431,7 @@ type PeeringTerminateByIDRequest struct { func (x *PeeringTerminateByIDRequest) Reset() { *x = PeeringTerminateByIDRequest{} if protoimpl.UnsafeEnabled { - mi := &file_proto_pbpeering_peering_proto_msgTypes[19] + mi := &file_private_pbpeering_peering_proto_msgTypes[19] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1444,7 +1444,7 @@ func (x *PeeringTerminateByIDRequest) String() string { func (*PeeringTerminateByIDRequest) ProtoMessage() {} func (x *PeeringTerminateByIDRequest) ProtoReflect() protoreflect.Message { - mi := &file_proto_pbpeering_peering_proto_msgTypes[19] + mi := &file_private_pbpeering_peering_proto_msgTypes[19] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1457,7 +1457,7 @@ func (x *PeeringTerminateByIDRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use PeeringTerminateByIDRequest.ProtoReflect.Descriptor instead. func (*PeeringTerminateByIDRequest) Descriptor() ([]byte, []int) { - return file_proto_pbpeering_peering_proto_rawDescGZIP(), []int{19} + return file_private_pbpeering_peering_proto_rawDescGZIP(), []int{19} } func (x *PeeringTerminateByIDRequest) GetID() string { @@ -1476,7 +1476,7 @@ type PeeringTerminateByIDResponse struct { func (x *PeeringTerminateByIDResponse) Reset() { *x = PeeringTerminateByIDResponse{} if protoimpl.UnsafeEnabled { - mi := &file_proto_pbpeering_peering_proto_msgTypes[20] + mi := &file_private_pbpeering_peering_proto_msgTypes[20] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1489,7 +1489,7 @@ func (x *PeeringTerminateByIDResponse) String() string { func (*PeeringTerminateByIDResponse) ProtoMessage() {} func (x *PeeringTerminateByIDResponse) ProtoReflect() protoreflect.Message { - mi := &file_proto_pbpeering_peering_proto_msgTypes[20] + mi := &file_private_pbpeering_peering_proto_msgTypes[20] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1502,7 +1502,7 @@ func (x *PeeringTerminateByIDResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use PeeringTerminateByIDResponse.ProtoReflect.Descriptor instead. func (*PeeringTerminateByIDResponse) Descriptor() ([]byte, []int) { - return file_proto_pbpeering_peering_proto_rawDescGZIP(), []int{20} + return file_private_pbpeering_peering_proto_rawDescGZIP(), []int{20} } type PeeringTrustBundleWriteRequest struct { @@ -1516,7 +1516,7 @@ type PeeringTrustBundleWriteRequest struct { func (x *PeeringTrustBundleWriteRequest) Reset() { *x = PeeringTrustBundleWriteRequest{} if protoimpl.UnsafeEnabled { - mi := &file_proto_pbpeering_peering_proto_msgTypes[21] + mi := &file_private_pbpeering_peering_proto_msgTypes[21] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1529,7 +1529,7 @@ func (x *PeeringTrustBundleWriteRequest) String() string { func (*PeeringTrustBundleWriteRequest) ProtoMessage() {} func (x *PeeringTrustBundleWriteRequest) ProtoReflect() protoreflect.Message { - mi := &file_proto_pbpeering_peering_proto_msgTypes[21] + mi := &file_private_pbpeering_peering_proto_msgTypes[21] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1542,7 +1542,7 @@ func (x *PeeringTrustBundleWriteRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use PeeringTrustBundleWriteRequest.ProtoReflect.Descriptor instead. func (*PeeringTrustBundleWriteRequest) Descriptor() ([]byte, []int) { - return file_proto_pbpeering_peering_proto_rawDescGZIP(), []int{21} + return file_private_pbpeering_peering_proto_rawDescGZIP(), []int{21} } func (x *PeeringTrustBundleWriteRequest) GetPeeringTrustBundle() *PeeringTrustBundle { @@ -1561,7 +1561,7 @@ type PeeringTrustBundleWriteResponse struct { func (x *PeeringTrustBundleWriteResponse) Reset() { *x = PeeringTrustBundleWriteResponse{} if protoimpl.UnsafeEnabled { - mi := &file_proto_pbpeering_peering_proto_msgTypes[22] + mi := &file_private_pbpeering_peering_proto_msgTypes[22] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1574,7 +1574,7 @@ func (x *PeeringTrustBundleWriteResponse) String() string { func (*PeeringTrustBundleWriteResponse) ProtoMessage() {} func (x *PeeringTrustBundleWriteResponse) ProtoReflect() protoreflect.Message { - mi := &file_proto_pbpeering_peering_proto_msgTypes[22] + mi := &file_private_pbpeering_peering_proto_msgTypes[22] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1587,7 +1587,7 @@ func (x *PeeringTrustBundleWriteResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use PeeringTrustBundleWriteResponse.ProtoReflect.Descriptor instead. func (*PeeringTrustBundleWriteResponse) Descriptor() ([]byte, []int) { - return file_proto_pbpeering_peering_proto_rawDescGZIP(), []int{22} + return file_private_pbpeering_peering_proto_rawDescGZIP(), []int{22} } type PeeringTrustBundleDeleteRequest struct { @@ -1602,7 +1602,7 @@ type PeeringTrustBundleDeleteRequest struct { func (x *PeeringTrustBundleDeleteRequest) Reset() { *x = PeeringTrustBundleDeleteRequest{} if protoimpl.UnsafeEnabled { - mi := &file_proto_pbpeering_peering_proto_msgTypes[23] + mi := &file_private_pbpeering_peering_proto_msgTypes[23] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1615,7 +1615,7 @@ func (x *PeeringTrustBundleDeleteRequest) String() string { func (*PeeringTrustBundleDeleteRequest) ProtoMessage() {} func (x *PeeringTrustBundleDeleteRequest) ProtoReflect() protoreflect.Message { - mi := &file_proto_pbpeering_peering_proto_msgTypes[23] + mi := &file_private_pbpeering_peering_proto_msgTypes[23] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1628,7 +1628,7 @@ func (x *PeeringTrustBundleDeleteRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use PeeringTrustBundleDeleteRequest.ProtoReflect.Descriptor instead. func (*PeeringTrustBundleDeleteRequest) Descriptor() ([]byte, []int) { - return file_proto_pbpeering_peering_proto_rawDescGZIP(), []int{23} + return file_private_pbpeering_peering_proto_rawDescGZIP(), []int{23} } func (x *PeeringTrustBundleDeleteRequest) GetName() string { @@ -1654,7 +1654,7 @@ type PeeringTrustBundleDeleteResponse struct { func (x *PeeringTrustBundleDeleteResponse) Reset() { *x = PeeringTrustBundleDeleteResponse{} if protoimpl.UnsafeEnabled { - mi := &file_proto_pbpeering_peering_proto_msgTypes[24] + mi := &file_private_pbpeering_peering_proto_msgTypes[24] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1667,7 +1667,7 @@ func (x *PeeringTrustBundleDeleteResponse) String() string { func (*PeeringTrustBundleDeleteResponse) ProtoMessage() {} func (x *PeeringTrustBundleDeleteResponse) ProtoReflect() protoreflect.Message { - mi := &file_proto_pbpeering_peering_proto_msgTypes[24] + mi := &file_private_pbpeering_peering_proto_msgTypes[24] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1680,7 +1680,7 @@ func (x *PeeringTrustBundleDeleteResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use PeeringTrustBundleDeleteResponse.ProtoReflect.Descriptor instead. func (*PeeringTrustBundleDeleteResponse) Descriptor() ([]byte, []int) { - return file_proto_pbpeering_peering_proto_rawDescGZIP(), []int{24} + return file_private_pbpeering_peering_proto_rawDescGZIP(), []int{24} } // mog annotation: @@ -1708,7 +1708,7 @@ type GenerateTokenRequest struct { func (x *GenerateTokenRequest) Reset() { *x = GenerateTokenRequest{} if protoimpl.UnsafeEnabled { - mi := &file_proto_pbpeering_peering_proto_msgTypes[25] + mi := &file_private_pbpeering_peering_proto_msgTypes[25] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1721,7 +1721,7 @@ func (x *GenerateTokenRequest) String() string { func (*GenerateTokenRequest) ProtoMessage() {} func (x *GenerateTokenRequest) ProtoReflect() protoreflect.Message { - mi := &file_proto_pbpeering_peering_proto_msgTypes[25] + mi := &file_private_pbpeering_peering_proto_msgTypes[25] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1734,7 +1734,7 @@ func (x *GenerateTokenRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GenerateTokenRequest.ProtoReflect.Descriptor instead. func (*GenerateTokenRequest) Descriptor() ([]byte, []int) { - return file_proto_pbpeering_peering_proto_rawDescGZIP(), []int{25} + return file_private_pbpeering_peering_proto_rawDescGZIP(), []int{25} } func (x *GenerateTokenRequest) GetPeerName() string { @@ -1783,7 +1783,7 @@ type GenerateTokenResponse struct { func (x *GenerateTokenResponse) Reset() { *x = GenerateTokenResponse{} if protoimpl.UnsafeEnabled { - mi := &file_proto_pbpeering_peering_proto_msgTypes[26] + mi := &file_private_pbpeering_peering_proto_msgTypes[26] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1796,7 +1796,7 @@ func (x *GenerateTokenResponse) String() string { func (*GenerateTokenResponse) ProtoMessage() {} func (x *GenerateTokenResponse) ProtoReflect() protoreflect.Message { - mi := &file_proto_pbpeering_peering_proto_msgTypes[26] + mi := &file_private_pbpeering_peering_proto_msgTypes[26] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1809,7 +1809,7 @@ func (x *GenerateTokenResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GenerateTokenResponse.ProtoReflect.Descriptor instead. func (*GenerateTokenResponse) Descriptor() ([]byte, []int) { - return file_proto_pbpeering_peering_proto_rawDescGZIP(), []int{26} + return file_private_pbpeering_peering_proto_rawDescGZIP(), []int{26} } func (x *GenerateTokenResponse) GetPeeringToken() string { @@ -1842,7 +1842,7 @@ type EstablishRequest struct { func (x *EstablishRequest) Reset() { *x = EstablishRequest{} if protoimpl.UnsafeEnabled { - mi := &file_proto_pbpeering_peering_proto_msgTypes[27] + mi := &file_private_pbpeering_peering_proto_msgTypes[27] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1855,7 +1855,7 @@ func (x *EstablishRequest) String() string { func (*EstablishRequest) ProtoMessage() {} func (x *EstablishRequest) ProtoReflect() protoreflect.Message { - mi := &file_proto_pbpeering_peering_proto_msgTypes[27] + mi := &file_private_pbpeering_peering_proto_msgTypes[27] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1868,7 +1868,7 @@ func (x *EstablishRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use EstablishRequest.ProtoReflect.Descriptor instead. func (*EstablishRequest) Descriptor() ([]byte, []int) { - return file_proto_pbpeering_peering_proto_rawDescGZIP(), []int{27} + return file_private_pbpeering_peering_proto_rawDescGZIP(), []int{27} } func (x *EstablishRequest) GetPeerName() string { @@ -1913,7 +1913,7 @@ type EstablishResponse struct { func (x *EstablishResponse) Reset() { *x = EstablishResponse{} if protoimpl.UnsafeEnabled { - mi := &file_proto_pbpeering_peering_proto_msgTypes[28] + mi := &file_private_pbpeering_peering_proto_msgTypes[28] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1926,7 +1926,7 @@ func (x *EstablishResponse) String() string { func (*EstablishResponse) ProtoMessage() {} func (x *EstablishResponse) ProtoReflect() protoreflect.Message { - mi := &file_proto_pbpeering_peering_proto_msgTypes[28] + mi := &file_private_pbpeering_peering_proto_msgTypes[28] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1939,7 +1939,7 @@ func (x *EstablishResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use EstablishResponse.ProtoReflect.Descriptor instead. func (*EstablishResponse) Descriptor() ([]byte, []int) { - return file_proto_pbpeering_peering_proto_rawDescGZIP(), []int{28} + return file_private_pbpeering_peering_proto_rawDescGZIP(), []int{28} } // GenerateTokenRequest encodes a request to persist a peering establishment @@ -1957,7 +1957,7 @@ type SecretsWriteRequest_GenerateTokenRequest struct { func (x *SecretsWriteRequest_GenerateTokenRequest) Reset() { *x = SecretsWriteRequest_GenerateTokenRequest{} if protoimpl.UnsafeEnabled { - mi := &file_proto_pbpeering_peering_proto_msgTypes[29] + mi := &file_private_pbpeering_peering_proto_msgTypes[29] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1970,7 +1970,7 @@ func (x *SecretsWriteRequest_GenerateTokenRequest) String() string { func (*SecretsWriteRequest_GenerateTokenRequest) ProtoMessage() {} func (x *SecretsWriteRequest_GenerateTokenRequest) ProtoReflect() protoreflect.Message { - mi := &file_proto_pbpeering_peering_proto_msgTypes[29] + mi := &file_private_pbpeering_peering_proto_msgTypes[29] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1983,7 +1983,7 @@ func (x *SecretsWriteRequest_GenerateTokenRequest) ProtoReflect() protoreflect.M // Deprecated: Use SecretsWriteRequest_GenerateTokenRequest.ProtoReflect.Descriptor instead. func (*SecretsWriteRequest_GenerateTokenRequest) Descriptor() ([]byte, []int) { - return file_proto_pbpeering_peering_proto_rawDescGZIP(), []int{0, 0} + return file_private_pbpeering_peering_proto_rawDescGZIP(), []int{0, 0} } func (x *SecretsWriteRequest_GenerateTokenRequest) GetEstablishmentSecret() string { @@ -2011,7 +2011,7 @@ type SecretsWriteRequest_ExchangeSecretRequest struct { func (x *SecretsWriteRequest_ExchangeSecretRequest) Reset() { *x = SecretsWriteRequest_ExchangeSecretRequest{} if protoimpl.UnsafeEnabled { - mi := &file_proto_pbpeering_peering_proto_msgTypes[30] + mi := &file_private_pbpeering_peering_proto_msgTypes[30] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2024,7 +2024,7 @@ func (x *SecretsWriteRequest_ExchangeSecretRequest) String() string { func (*SecretsWriteRequest_ExchangeSecretRequest) ProtoMessage() {} func (x *SecretsWriteRequest_ExchangeSecretRequest) ProtoReflect() protoreflect.Message { - mi := &file_proto_pbpeering_peering_proto_msgTypes[30] + mi := &file_private_pbpeering_peering_proto_msgTypes[30] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2037,7 +2037,7 @@ func (x *SecretsWriteRequest_ExchangeSecretRequest) ProtoReflect() protoreflect. // Deprecated: Use SecretsWriteRequest_ExchangeSecretRequest.ProtoReflect.Descriptor instead. func (*SecretsWriteRequest_ExchangeSecretRequest) Descriptor() ([]byte, []int) { - return file_proto_pbpeering_peering_proto_rawDescGZIP(), []int{0, 1} + return file_private_pbpeering_peering_proto_rawDescGZIP(), []int{0, 1} } func (x *SecretsWriteRequest_ExchangeSecretRequest) GetEstablishmentSecret() string { @@ -2070,7 +2070,7 @@ type SecretsWriteRequest_PromotePendingRequest struct { func (x *SecretsWriteRequest_PromotePendingRequest) Reset() { *x = SecretsWriteRequest_PromotePendingRequest{} if protoimpl.UnsafeEnabled { - mi := &file_proto_pbpeering_peering_proto_msgTypes[31] + mi := &file_private_pbpeering_peering_proto_msgTypes[31] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2083,7 +2083,7 @@ func (x *SecretsWriteRequest_PromotePendingRequest) String() string { func (*SecretsWriteRequest_PromotePendingRequest) ProtoMessage() {} func (x *SecretsWriteRequest_PromotePendingRequest) ProtoReflect() protoreflect.Message { - mi := &file_proto_pbpeering_peering_proto_msgTypes[31] + mi := &file_private_pbpeering_peering_proto_msgTypes[31] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2096,7 +2096,7 @@ func (x *SecretsWriteRequest_PromotePendingRequest) ProtoReflect() protoreflect. // Deprecated: Use SecretsWriteRequest_PromotePendingRequest.ProtoReflect.Descriptor instead. func (*SecretsWriteRequest_PromotePendingRequest) Descriptor() ([]byte, []int) { - return file_proto_pbpeering_peering_proto_rawDescGZIP(), []int{0, 2} + return file_private_pbpeering_peering_proto_rawDescGZIP(), []int{0, 2} } func (x *SecretsWriteRequest_PromotePendingRequest) GetActiveStreamSecret() string { @@ -2122,7 +2122,7 @@ type SecretsWriteRequest_EstablishRequest struct { func (x *SecretsWriteRequest_EstablishRequest) Reset() { *x = SecretsWriteRequest_EstablishRequest{} if protoimpl.UnsafeEnabled { - mi := &file_proto_pbpeering_peering_proto_msgTypes[32] + mi := &file_private_pbpeering_peering_proto_msgTypes[32] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2135,7 +2135,7 @@ func (x *SecretsWriteRequest_EstablishRequest) String() string { func (*SecretsWriteRequest_EstablishRequest) ProtoMessage() {} func (x *SecretsWriteRequest_EstablishRequest) ProtoReflect() protoreflect.Message { - mi := &file_proto_pbpeering_peering_proto_msgTypes[32] + mi := &file_private_pbpeering_peering_proto_msgTypes[32] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2148,7 +2148,7 @@ func (x *SecretsWriteRequest_EstablishRequest) ProtoReflect() protoreflect.Messa // Deprecated: Use SecretsWriteRequest_EstablishRequest.ProtoReflect.Descriptor instead. func (*SecretsWriteRequest_EstablishRequest) Descriptor() ([]byte, []int) { - return file_proto_pbpeering_peering_proto_rawDescGZIP(), []int{0, 3} + return file_private_pbpeering_peering_proto_rawDescGZIP(), []int{0, 3} } func (x *SecretsWriteRequest_EstablishRequest) GetActiveStreamSecret() string { @@ -2170,7 +2170,7 @@ type PeeringSecrets_Establishment struct { func (x *PeeringSecrets_Establishment) Reset() { *x = PeeringSecrets_Establishment{} if protoimpl.UnsafeEnabled { - mi := &file_proto_pbpeering_peering_proto_msgTypes[33] + mi := &file_private_pbpeering_peering_proto_msgTypes[33] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2183,7 +2183,7 @@ func (x *PeeringSecrets_Establishment) String() string { func (*PeeringSecrets_Establishment) ProtoMessage() {} func (x *PeeringSecrets_Establishment) ProtoReflect() protoreflect.Message { - mi := &file_proto_pbpeering_peering_proto_msgTypes[33] + mi := &file_private_pbpeering_peering_proto_msgTypes[33] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2196,7 +2196,7 @@ func (x *PeeringSecrets_Establishment) ProtoReflect() protoreflect.Message { // Deprecated: Use PeeringSecrets_Establishment.ProtoReflect.Descriptor instead. func (*PeeringSecrets_Establishment) Descriptor() ([]byte, []int) { - return file_proto_pbpeering_peering_proto_rawDescGZIP(), []int{1, 0} + return file_private_pbpeering_peering_proto_rawDescGZIP(), []int{1, 0} } func (x *PeeringSecrets_Establishment) GetSecretID() string { @@ -2229,7 +2229,7 @@ type PeeringSecrets_Stream struct { func (x *PeeringSecrets_Stream) Reset() { *x = PeeringSecrets_Stream{} if protoimpl.UnsafeEnabled { - mi := &file_proto_pbpeering_peering_proto_msgTypes[34] + mi := &file_private_pbpeering_peering_proto_msgTypes[34] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2242,7 +2242,7 @@ func (x *PeeringSecrets_Stream) String() string { func (*PeeringSecrets_Stream) ProtoMessage() {} func (x *PeeringSecrets_Stream) ProtoReflect() protoreflect.Message { - mi := &file_proto_pbpeering_peering_proto_msgTypes[34] + mi := &file_private_pbpeering_peering_proto_msgTypes[34] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2255,7 +2255,7 @@ func (x *PeeringSecrets_Stream) ProtoReflect() protoreflect.Message { // Deprecated: Use PeeringSecrets_Stream.ProtoReflect.Descriptor instead. func (*PeeringSecrets_Stream) Descriptor() ([]byte, []int) { - return file_proto_pbpeering_peering_proto_rawDescGZIP(), []int{1, 1} + return file_private_pbpeering_peering_proto_rawDescGZIP(), []int{1, 1} } func (x *PeeringSecrets_Stream) GetActiveSecretID() string { @@ -2272,443 +2272,442 @@ func (x *PeeringSecrets_Stream) GetPendingSecretID() string { return "" } -var File_proto_pbpeering_peering_proto protoreflect.FileDescriptor - -var file_proto_pbpeering_peering_proto_rawDesc = []byte{ - 0x0a, 0x1d, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x70, 0x62, 0x70, 0x65, 0x65, 0x72, 0x69, 0x6e, - 0x67, 0x2f, 0x70, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, - 0x21, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, - 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x69, - 0x6e, 0x67, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x1a, 0x32, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2d, 0x70, 0x75, 0x62, 0x6c, 0x69, - 0x63, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x72, 0x61, - 0x74, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x2f, 0x72, 0x61, 0x74, 0x65, 0x6c, 0x69, 0x6d, 0x69, - 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xe5, 0x06, 0x0a, 0x13, 0x53, 0x65, 0x63, 0x72, - 0x65, 0x74, 0x73, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x16, 0x0a, 0x06, 0x50, 0x65, 0x65, 0x72, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x06, 0x50, 0x65, 0x65, 0x72, 0x49, 0x44, 0x12, 0x74, 0x0a, 0x0e, 0x67, 0x65, 0x6e, 0x65, 0x72, - 0x61, 0x74, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x4b, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, - 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x70, 0x65, 0x65, 0x72, - 0x69, 0x6e, 0x67, 0x2e, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x57, 0x72, 0x69, 0x74, 0x65, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, - 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x0d, - 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x77, 0x0a, - 0x0f, 0x65, 0x78, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x4c, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, +var File_private_pbpeering_peering_proto protoreflect.FileDescriptor + +var file_private_pbpeering_peering_proto_rawDesc = []byte{ + 0x0a, 0x1f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2f, 0x70, 0x62, 0x70, 0x65, 0x65, 0x72, + 0x69, 0x6e, 0x67, 0x2f, 0x70, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x12, 0x21, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, + 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x70, 0x65, 0x65, + 0x72, 0x69, 0x6e, 0x67, 0x1a, 0x25, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x2f, 0x72, 0x61, 0x74, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x2f, 0x72, 0x61, 0x74, 0x65, + 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, + 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xe5, 0x06, 0x0a, + 0x13, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x50, 0x65, 0x65, 0x72, 0x49, 0x44, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x50, 0x65, 0x65, 0x72, 0x49, 0x44, 0x12, 0x74, 0x0a, 0x0e, + 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x4b, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, + 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, + 0x2e, 0x70, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, + 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x47, 0x65, 0x6e, + 0x65, 0x72, 0x61, 0x74, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x48, 0x00, 0x52, 0x0d, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x54, 0x6f, 0x6b, + 0x65, 0x6e, 0x12, 0x77, 0x0a, 0x0f, 0x65, 0x78, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x73, + 0x65, 0x63, 0x72, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x4c, 0x2e, 0x68, 0x61, + 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, + 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x2e, + 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x2e, 0x45, 0x78, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x53, 0x65, 0x63, 0x72, + 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x0e, 0x65, 0x78, 0x63, + 0x68, 0x61, 0x6e, 0x67, 0x65, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x12, 0x77, 0x0a, 0x0f, 0x70, + 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x5f, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x4c, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, + 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, + 0x2e, 0x70, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, + 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x72, 0x6f, + 0x6d, 0x6f, 0x74, 0x65, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x48, 0x00, 0x52, 0x0e, 0x70, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x50, 0x65, 0x6e, + 0x64, 0x69, 0x6e, 0x67, 0x12, 0x67, 0x0a, 0x09, 0x65, 0x73, 0x74, 0x61, 0x62, 0x6c, 0x69, 0x73, + 0x68, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x47, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, + 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, + 0x6e, 0x61, 0x6c, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x53, 0x65, 0x63, 0x72, + 0x65, 0x74, 0x73, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, + 0x45, 0x73, 0x74, 0x61, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x48, 0x00, 0x52, 0x09, 0x65, 0x73, 0x74, 0x61, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x1a, 0x49, 0x0a, + 0x14, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x31, 0x0a, 0x14, 0x65, 0x73, 0x74, 0x61, 0x62, 0x6c, 0x69, + 0x73, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x13, 0x65, 0x73, 0x74, 0x61, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x6d, 0x65, + 0x6e, 0x74, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x1a, 0x7e, 0x0a, 0x15, 0x45, 0x78, 0x63, 0x68, + 0x61, 0x6e, 0x67, 0x65, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x31, 0x0a, 0x14, 0x65, 0x73, 0x74, 0x61, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x6d, 0x65, + 0x6e, 0x74, 0x5f, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x13, 0x65, 0x73, 0x74, 0x61, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, + 0x63, 0x72, 0x65, 0x74, 0x12, 0x32, 0x0a, 0x15, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, + 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5f, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x13, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x72, 0x65, + 0x61, 0x6d, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x1a, 0x49, 0x0a, 0x15, 0x50, 0x72, 0x6f, 0x6d, + 0x6f, 0x74, 0x65, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x30, 0x0a, 0x14, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x73, 0x74, 0x72, 0x65, + 0x61, 0x6d, 0x5f, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x12, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x53, 0x65, 0x63, + 0x72, 0x65, 0x74, 0x1a, 0x44, 0x0a, 0x10, 0x45, 0x73, 0x74, 0x61, 0x62, 0x6c, 0x69, 0x73, 0x68, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x30, 0x0a, 0x14, 0x61, 0x63, 0x74, 0x69, 0x76, + 0x65, 0x5f, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5f, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x53, 0x74, 0x72, + 0x65, 0x61, 0x6d, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x42, 0x09, 0x0a, 0x07, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x22, 0xea, 0x02, 0x0a, 0x0e, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, + 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x50, 0x65, 0x65, 0x72, 0x49, + 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x50, 0x65, 0x65, 0x72, 0x49, 0x44, 0x12, + 0x65, 0x0a, 0x0d, 0x65, 0x73, 0x74, 0x61, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x6d, 0x65, 0x6e, 0x74, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3f, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, - 0x61, 0x6c, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x53, 0x65, 0x63, 0x72, 0x65, - 0x74, 0x73, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x45, - 0x78, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x0e, 0x65, 0x78, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, - 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x12, 0x77, 0x0a, 0x0f, 0x70, 0x72, 0x6f, 0x6d, 0x6f, 0x74, - 0x65, 0x5f, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x4c, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, - 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x70, 0x65, 0x65, 0x72, - 0x69, 0x6e, 0x67, 0x2e, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x57, 0x72, 0x69, 0x74, 0x65, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x50, - 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, - 0x0e, 0x70, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x12, - 0x67, 0x0a, 0x09, 0x65, 0x73, 0x74, 0x61, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x47, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, + 0x61, 0x6c, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x69, + 0x6e, 0x67, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x2e, 0x45, 0x73, 0x74, 0x61, 0x62, 0x6c, + 0x69, 0x73, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0d, 0x65, 0x73, 0x74, 0x61, 0x62, 0x6c, 0x69, + 0x73, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x50, 0x0a, 0x06, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, + 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, + 0x61, 0x6c, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x69, + 0x6e, 0x67, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, + 0x52, 0x06, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x1a, 0x2b, 0x0a, 0x0d, 0x45, 0x73, 0x74, 0x61, + 0x62, 0x6c, 0x69, 0x73, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x53, 0x65, 0x63, + 0x72, 0x65, 0x74, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x53, 0x65, 0x63, + 0x72, 0x65, 0x74, 0x49, 0x44, 0x1a, 0x5a, 0x0a, 0x06, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x12, + 0x26, 0x0a, 0x0e, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x49, + 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x53, + 0x65, 0x63, 0x72, 0x65, 0x74, 0x49, 0x44, 0x12, 0x28, 0x0a, 0x0f, 0x50, 0x65, 0x6e, 0x64, 0x69, + 0x6e, 0x67, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0f, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x49, + 0x44, 0x22, 0xf7, 0x05, 0x0a, 0x07, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x0e, 0x0a, + 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, 0x12, 0x0a, + 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, + 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x38, 0x0a, 0x09, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, + 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x48, 0x0a, 0x04, 0x4d, 0x65, 0x74, + 0x61, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, + 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, + 0x6e, 0x61, 0x6c, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x50, 0x65, 0x65, 0x72, + 0x69, 0x6e, 0x67, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x4d, + 0x65, 0x74, 0x61, 0x12, 0x45, 0x0a, 0x05, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x2f, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x70, - 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x57, 0x72, - 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x45, 0x73, 0x74, 0x61, 0x62, - 0x6c, 0x69, 0x73, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x09, 0x65, - 0x73, 0x74, 0x61, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x1a, 0x49, 0x0a, 0x14, 0x47, 0x65, 0x6e, 0x65, - 0x72, 0x61, 0x74, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x31, 0x0a, 0x14, 0x65, 0x73, 0x74, 0x61, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x6d, 0x65, 0x6e, - 0x74, 0x5f, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, - 0x65, 0x73, 0x74, 0x61, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x63, - 0x72, 0x65, 0x74, 0x1a, 0x7e, 0x0a, 0x15, 0x45, 0x78, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x53, - 0x65, 0x63, 0x72, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x31, 0x0a, 0x14, - 0x65, 0x73, 0x74, 0x61, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x65, - 0x63, 0x72, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x65, 0x73, 0x74, 0x61, - 0x62, 0x6c, 0x69, 0x73, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x12, - 0x32, 0x0a, 0x15, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x73, 0x74, 0x72, 0x65, 0x61, - 0x6d, 0x5f, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, - 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x53, 0x65, 0x63, - 0x72, 0x65, 0x74, 0x1a, 0x49, 0x0a, 0x15, 0x50, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x50, 0x65, - 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x30, 0x0a, 0x14, - 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5f, 0x73, 0x65, - 0x63, 0x72, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x61, 0x63, 0x74, 0x69, - 0x76, 0x65, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x1a, 0x44, - 0x0a, 0x10, 0x45, 0x73, 0x74, 0x61, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x30, 0x0a, 0x14, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x73, 0x74, 0x72, - 0x65, 0x61, 0x6d, 0x5f, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x12, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x53, 0x65, - 0x63, 0x72, 0x65, 0x74, 0x42, 0x09, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, - 0xea, 0x02, 0x0a, 0x0e, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x53, 0x65, 0x63, 0x72, 0x65, - 0x74, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x50, 0x65, 0x65, 0x72, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x06, 0x50, 0x65, 0x65, 0x72, 0x49, 0x44, 0x12, 0x65, 0x0a, 0x0d, 0x65, 0x73, - 0x74, 0x61, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x3f, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, - 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x70, 0x65, - 0x65, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x53, 0x65, 0x63, - 0x72, 0x65, 0x74, 0x73, 0x2e, 0x45, 0x73, 0x74, 0x61, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x6d, 0x65, - 0x6e, 0x74, 0x52, 0x0d, 0x65, 0x73, 0x74, 0x61, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x6d, 0x65, 0x6e, - 0x74, 0x12, 0x50, 0x0a, 0x06, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x38, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, - 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x70, 0x65, - 0x65, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x53, 0x65, 0x63, - 0x72, 0x65, 0x74, 0x73, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x06, 0x73, 0x74, 0x72, - 0x65, 0x61, 0x6d, 0x1a, 0x2b, 0x0a, 0x0d, 0x45, 0x73, 0x74, 0x61, 0x62, 0x6c, 0x69, 0x73, 0x68, - 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x49, 0x44, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x49, 0x44, - 0x1a, 0x5a, 0x0a, 0x06, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x12, 0x26, 0x0a, 0x0e, 0x41, 0x63, - 0x74, 0x69, 0x76, 0x65, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0e, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, - 0x49, 0x44, 0x12, 0x28, 0x0a, 0x0f, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x53, 0x65, 0x63, - 0x72, 0x65, 0x74, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x50, 0x65, 0x6e, - 0x64, 0x69, 0x6e, 0x67, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x49, 0x44, 0x22, 0xf7, 0x05, 0x0a, - 0x07, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, - 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x09, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x38, 0x0a, 0x09, 0x44, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x44, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x64, 0x41, 0x74, 0x12, 0x48, 0x0a, 0x04, 0x4d, 0x65, 0x74, 0x61, 0x18, 0x05, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, + 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x53, 0x74, + 0x61, 0x74, 0x65, 0x52, 0x05, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x50, 0x65, + 0x65, 0x72, 0x49, 0x44, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x50, 0x65, 0x65, 0x72, + 0x49, 0x44, 0x12, 0x1e, 0x0a, 0x0a, 0x50, 0x65, 0x65, 0x72, 0x43, 0x41, 0x50, 0x65, 0x6d, 0x73, + 0x18, 0x08, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x50, 0x65, 0x65, 0x72, 0x43, 0x41, 0x50, 0x65, + 0x6d, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x50, 0x65, 0x65, 0x72, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x50, 0x65, 0x65, 0x72, + 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x30, 0x0a, 0x13, 0x50, 0x65, + 0x65, 0x72, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, + 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x09, 0x52, 0x13, 0x50, 0x65, 0x65, 0x72, 0x53, 0x65, 0x72, + 0x76, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x12, 0x53, 0x0a, 0x0c, + 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x0d, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x70, - 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x4d, - 0x65, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x45, - 0x0a, 0x05, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2f, 0x2e, - 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, - 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x69, 0x6e, - 0x67, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x05, - 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x50, 0x65, 0x65, 0x72, 0x49, 0x44, 0x18, - 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x50, 0x65, 0x65, 0x72, 0x49, 0x44, 0x12, 0x1e, 0x0a, - 0x0a, 0x50, 0x65, 0x65, 0x72, 0x43, 0x41, 0x50, 0x65, 0x6d, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, - 0x09, 0x52, 0x0a, 0x50, 0x65, 0x65, 0x72, 0x43, 0x41, 0x50, 0x65, 0x6d, 0x73, 0x12, 0x26, 0x0a, - 0x0e, 0x50, 0x65, 0x65, 0x72, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x18, - 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x50, 0x65, 0x65, 0x72, 0x53, 0x65, 0x72, 0x76, 0x65, - 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x30, 0x0a, 0x13, 0x50, 0x65, 0x65, 0x72, 0x53, 0x65, 0x72, - 0x76, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x18, 0x0a, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x13, 0x50, 0x65, 0x65, 0x72, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x41, 0x64, - 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x12, 0x53, 0x0a, 0x0c, 0x53, 0x74, 0x72, 0x65, 0x61, - 0x6d, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, - 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, - 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x69, 0x6e, - 0x67, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x0c, - 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x20, 0x0a, 0x0b, - 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x0b, 0x20, 0x01, 0x28, - 0x04, 0x52, 0x0b, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x20, - 0x0a, 0x0b, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x0c, 0x20, - 0x01, 0x28, 0x04, 0x52, 0x0b, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x49, 0x6e, 0x64, 0x65, 0x78, - 0x12, 0x45, 0x0a, 0x06, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x2d, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, - 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x70, 0x65, 0x65, - 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, - 0x06, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x12, 0x34, 0x0a, 0x15, 0x4d, 0x61, 0x6e, 0x75, 0x61, - 0x6c, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, - 0x18, 0x12, 0x20, 0x03, 0x28, 0x09, 0x52, 0x15, 0x4d, 0x61, 0x6e, 0x75, 0x61, 0x6c, 0x53, 0x65, - 0x72, 0x76, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x1a, 0x37, 0x0a, - 0x09, 0x4d, 0x65, 0x74, 0x61, 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, 0x22, 0x4a, 0x0a, 0x0a, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, - 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1c, 0x0a, 0x09, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, - 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, - 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x44, 0x61, 0x74, 0x61, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x44, 0x61, 0x74, 0x61, 0x63, 0x65, 0x6e, 0x74, - 0x65, 0x72, 0x22, 0x9e, 0x02, 0x0a, 0x0c, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x12, 0x2a, 0x0a, 0x10, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x10, 0x49, - 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, - 0x2a, 0x0a, 0x10, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x10, 0x45, 0x78, 0x70, 0x6f, 0x72, - 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x40, 0x0a, 0x0d, 0x4c, - 0x61, 0x73, 0x74, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0d, - 0x4c, 0x61, 0x73, 0x74, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x12, 0x3c, 0x0a, - 0x0b, 0x4c, 0x61, 0x73, 0x74, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x18, 0x04, 0x20, 0x01, + 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x52, 0x0c, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, + 0x18, 0x0b, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x49, 0x6e, + 0x64, 0x65, 0x78, 0x12, 0x20, 0x0a, 0x0b, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x49, 0x6e, 0x64, + 0x65, 0x78, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, + 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x45, 0x0a, 0x06, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x18, + 0x11, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, + 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, + 0x6c, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, + 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x06, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x12, 0x34, 0x0a, 0x15, + 0x4d, 0x61, 0x6e, 0x75, 0x61, 0x6c, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, + 0x65, 0x73, 0x73, 0x65, 0x73, 0x18, 0x12, 0x20, 0x03, 0x28, 0x09, 0x52, 0x15, 0x4d, 0x61, 0x6e, + 0x75, 0x61, 0x6c, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, + 0x65, 0x73, 0x1a, 0x37, 0x0a, 0x09, 0x4d, 0x65, 0x74, 0x61, 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, 0x22, 0x4a, 0x0a, 0x0a, 0x52, + 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1c, 0x0a, 0x09, 0x50, 0x61, 0x72, + 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x50, 0x61, + 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x44, 0x61, 0x74, 0x61, 0x63, + 0x65, 0x6e, 0x74, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x44, 0x61, 0x74, + 0x61, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x22, 0x9e, 0x02, 0x0a, 0x0c, 0x53, 0x74, 0x72, 0x65, + 0x61, 0x6d, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x2a, 0x0a, 0x10, 0x49, 0x6d, 0x70, 0x6f, + 0x72, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x09, 0x52, 0x10, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x73, 0x12, 0x2a, 0x0a, 0x10, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x10, + 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, + 0x12, 0x40, 0x0a, 0x0d, 0x4c, 0x61, 0x73, 0x74, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, + 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x52, 0x0d, 0x4c, 0x61, 0x73, 0x74, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, + 0x61, 0x74, 0x12, 0x3c, 0x0a, 0x0b, 0x4c, 0x61, 0x73, 0x74, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, + 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x52, 0x0b, 0x4c, 0x61, 0x73, 0x74, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, + 0x12, 0x36, 0x0a, 0x08, 0x4c, 0x61, 0x73, 0x74, 0x53, 0x65, 0x6e, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0b, - 0x4c, 0x61, 0x73, 0x74, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x12, 0x36, 0x0a, 0x08, 0x4c, - 0x61, 0x73, 0x74, 0x53, 0x65, 0x6e, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x08, 0x4c, 0x61, 0x73, 0x74, 0x53, - 0x65, 0x6e, 0x64, 0x22, 0xfe, 0x01, 0x0a, 0x12, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x54, - 0x72, 0x75, 0x73, 0x74, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x54, 0x72, - 0x75, 0x73, 0x74, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0b, 0x54, 0x72, 0x75, 0x73, 0x74, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x12, 0x1a, 0x0a, 0x08, - 0x50, 0x65, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x50, 0x65, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x50, 0x61, 0x72, 0x74, - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x50, 0x61, 0x72, - 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x52, 0x6f, 0x6f, 0x74, 0x50, 0x45, - 0x4d, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x52, 0x6f, 0x6f, 0x74, 0x50, 0x45, - 0x4d, 0x73, 0x12, 0x2c, 0x0a, 0x11, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x50, 0x61, - 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x45, - 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, - 0x12, 0x20, 0x0a, 0x0b, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x64, - 0x65, 0x78, 0x12, 0x20, 0x0a, 0x0b, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x49, 0x6e, 0x64, 0x65, - 0x78, 0x18, 0x07, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x49, - 0x6e, 0x64, 0x65, 0x78, 0x22, 0x36, 0x0a, 0x16, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x53, - 0x65, 0x72, 0x76, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x12, 0x1c, - 0x0a, 0x09, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x09, 0x52, 0x09, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x22, 0x46, 0x0a, 0x12, - 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, - 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x50, 0x61, 0x72, 0x74, 0x69, - 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x5b, 0x0a, 0x13, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x52, - 0x65, 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x44, 0x0a, 0x07, 0x50, - 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x68, - 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, - 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, - 0x2e, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x07, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, - 0x67, 0x22, 0x32, 0x0a, 0x12, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x4c, 0x69, 0x73, 0x74, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x50, 0x61, 0x72, 0x74, 0x69, - 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x50, 0x61, 0x72, 0x74, - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x73, 0x0a, 0x13, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, - 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x46, 0x0a, 0x08, - 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, - 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, - 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x69, - 0x6e, 0x67, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x08, 0x50, 0x65, 0x65, 0x72, - 0x69, 0x6e, 0x67, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x04, 0x52, 0x05, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x22, 0xca, 0x02, 0x0a, 0x13, 0x50, - 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x44, 0x0a, 0x07, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x08, + 0x4c, 0x61, 0x73, 0x74, 0x53, 0x65, 0x6e, 0x64, 0x22, 0xfe, 0x01, 0x0a, 0x12, 0x50, 0x65, 0x65, + 0x72, 0x69, 0x6e, 0x67, 0x54, 0x72, 0x75, 0x73, 0x74, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x12, + 0x20, 0x0a, 0x0b, 0x54, 0x72, 0x75, 0x73, 0x74, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x54, 0x72, 0x75, 0x73, 0x74, 0x44, 0x6f, 0x6d, 0x61, 0x69, + 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x50, 0x65, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x50, 0x65, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, + 0x09, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x09, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x52, + 0x6f, 0x6f, 0x74, 0x50, 0x45, 0x4d, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x52, + 0x6f, 0x6f, 0x74, 0x50, 0x45, 0x4d, 0x73, 0x12, 0x2c, 0x0a, 0x11, 0x45, 0x78, 0x70, 0x6f, 0x72, + 0x74, 0x65, 0x64, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x11, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x50, 0x61, 0x72, 0x74, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x49, + 0x6e, 0x64, 0x65, 0x78, 0x18, 0x06, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x20, 0x0a, 0x0b, 0x4d, 0x6f, 0x64, 0x69, 0x66, + 0x79, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x07, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x4d, 0x6f, + 0x64, 0x69, 0x66, 0x79, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x36, 0x0a, 0x16, 0x50, 0x65, 0x65, + 0x72, 0x69, 0x6e, 0x67, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, + 0x73, 0x65, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, + 0x73, 0x22, 0x46, 0x0a, 0x12, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x61, 0x64, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x50, + 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, + 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x5b, 0x0a, 0x13, 0x50, 0x65, 0x65, + 0x72, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x44, 0x0a, 0x07, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x2a, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, + 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x70, 0x65, + 0x65, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x07, 0x50, + 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x32, 0x0a, 0x12, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, + 0x67, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, + 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x09, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x73, 0x0a, 0x13, 0x50, 0x65, + 0x65, 0x72, 0x69, 0x6e, 0x67, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x46, 0x0a, 0x08, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x52, - 0x07, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x5e, 0x0a, 0x0e, 0x53, 0x65, 0x63, 0x72, - 0x65, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x36, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, - 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x70, 0x65, 0x65, - 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x57, 0x72, 0x69, 0x74, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x0e, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x54, 0x0a, 0x04, 0x4d, 0x65, 0x74, 0x61, - 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x40, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, + 0x08, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x49, 0x6e, 0x64, + 0x65, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x22, + 0xca, 0x02, 0x0a, 0x13, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x57, 0x72, 0x69, 0x74, 0x65, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x44, 0x0a, 0x07, 0x50, 0x65, 0x65, 0x72, 0x69, + 0x6e, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, + 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, + 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x50, 0x65, 0x65, + 0x72, 0x69, 0x6e, 0x67, 0x52, 0x07, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x5e, 0x0a, + 0x0e, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, + 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, + 0x6c, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, + 0x73, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x0e, 0x53, + 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x54, 0x0a, + 0x04, 0x4d, 0x65, 0x74, 0x61, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x40, 0x2e, 0x68, 0x61, + 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, + 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x2e, + 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x4d, + 0x65, 0x74, 0x61, 0x1a, 0x37, 0x0a, 0x09, 0x4d, 0x65, 0x74, 0x61, 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, 0x22, 0x16, 0x0a, 0x14, + 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x48, 0x0a, 0x14, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x44, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, + 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, + 0x12, 0x1c, 0x0a, 0x09, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x09, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x17, + 0x0a, 0x15, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x93, 0x01, 0x0a, 0x1f, 0x54, 0x72, 0x75, 0x73, + 0x74, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x79, 0x53, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x53, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0b, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, + 0x09, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x09, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x50, + 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, + 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x4b, 0x69, 0x6e, + 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4b, 0x69, 0x6e, 0x64, 0x22, 0x89, 0x01, + 0x0a, 0x20, 0x54, 0x72, 0x75, 0x73, 0x74, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x4c, 0x69, 0x73, + 0x74, 0x42, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x05, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x4f, 0x0a, 0x07, 0x42, 0x75, 0x6e, 0x64, + 0x6c, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x68, 0x61, 0x73, 0x68, + 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, + 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x50, 0x65, + 0x65, 0x72, 0x69, 0x6e, 0x67, 0x54, 0x72, 0x75, 0x73, 0x74, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, + 0x52, 0x07, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x73, 0x22, 0x4a, 0x0a, 0x16, 0x54, 0x72, 0x75, + 0x73, 0x74, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x52, 0x65, 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x50, 0x61, 0x72, 0x74, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x50, 0x61, 0x72, 0x74, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x7e, 0x0a, 0x17, 0x54, 0x72, 0x75, 0x73, 0x74, 0x42, 0x75, + 0x6e, 0x64, 0x6c, 0x65, 0x52, 0x65, 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x14, 0x0a, 0x05, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, + 0x05, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x4d, 0x0a, 0x06, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x69, - 0x6e, 0x67, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4d, - 0x65, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x4d, 0x65, 0x74, 0x61, 0x1a, 0x37, + 0x6e, 0x67, 0x54, 0x72, 0x75, 0x73, 0x74, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x52, 0x06, 0x42, + 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x22, 0x2d, 0x0a, 0x1b, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, + 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x42, 0x79, 0x49, 0x44, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x02, 0x49, 0x44, 0x22, 0x1e, 0x0a, 0x1c, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x54, + 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x42, 0x79, 0x49, 0x44, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x87, 0x01, 0x0a, 0x1e, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, + 0x54, 0x72, 0x75, 0x73, 0x74, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x57, 0x72, 0x69, 0x74, 0x65, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x65, 0x0a, 0x12, 0x50, 0x65, 0x65, 0x72, 0x69, + 0x6e, 0x67, 0x54, 0x72, 0x75, 0x73, 0x74, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, + 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, + 0x70, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x54, + 0x72, 0x75, 0x73, 0x74, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x52, 0x12, 0x50, 0x65, 0x65, 0x72, + 0x69, 0x6e, 0x67, 0x54, 0x72, 0x75, 0x73, 0x74, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x22, 0x21, + 0x0a, 0x1f, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x54, 0x72, 0x75, 0x73, 0x74, 0x42, 0x75, + 0x6e, 0x64, 0x6c, 0x65, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x53, 0x0a, 0x1f, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x54, 0x72, 0x75, 0x73, + 0x74, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x50, 0x61, 0x72, 0x74, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x50, 0x61, 0x72, + 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x22, 0x0a, 0x20, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, + 0x67, 0x54, 0x72, 0x75, 0x73, 0x74, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x9a, 0x02, 0x0a, 0x14, 0x47, + 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x50, 0x65, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x50, 0x65, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, + 0x1c, 0x0a, 0x09, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x09, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x55, 0x0a, + 0x04, 0x4d, 0x65, 0x74, 0x61, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x41, 0x2e, 0x68, 0x61, + 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, + 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x2e, + 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, + 0x4d, 0x65, 0x74, 0x61, 0x12, 0x38, 0x0a, 0x17, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x45, 0x78, + 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x18, + 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x17, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x45, 0x78, 0x74, + 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x1a, 0x37, 0x0a, 0x09, 0x4d, 0x65, 0x74, 0x61, 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, 0x22, 0x16, 0x0a, 0x14, 0x50, 0x65, 0x65, 0x72, 0x69, - 0x6e, 0x67, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x48, 0x0a, 0x14, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x50, - 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, - 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x17, 0x0a, 0x15, 0x50, 0x65, 0x65, - 0x72, 0x69, 0x6e, 0x67, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x93, 0x01, 0x0a, 0x1f, 0x54, 0x72, 0x75, 0x73, 0x74, 0x42, 0x75, 0x6e, 0x64, - 0x6c, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x53, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x4e, 0x61, 0x6d, 0x65, - 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x4e, 0x61, 0x6d, - 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, - 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x50, 0x61, 0x72, 0x74, 0x69, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x4b, 0x69, 0x6e, 0x64, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x4b, 0x69, 0x6e, 0x64, 0x22, 0x89, 0x01, 0x0a, 0x20, 0x54, 0x72, 0x75, - 0x73, 0x74, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x79, 0x53, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, - 0x05, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x49, 0x6e, - 0x64, 0x65, 0x78, 0x12, 0x4f, 0x0a, 0x07, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x73, 0x18, 0x02, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, - 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, - 0x2e, 0x70, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, - 0x54, 0x72, 0x75, 0x73, 0x74, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x52, 0x07, 0x42, 0x75, 0x6e, - 0x64, 0x6c, 0x65, 0x73, 0x22, 0x4a, 0x0a, 0x16, 0x54, 0x72, 0x75, 0x73, 0x74, 0x42, 0x75, 0x6e, - 0x64, 0x6c, 0x65, 0x52, 0x65, 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, - 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, - 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, - 0x22, 0x7e, 0x0a, 0x17, 0x54, 0x72, 0x75, 0x73, 0x74, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x52, - 0x65, 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x49, - 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x49, 0x6e, 0x64, 0x65, - 0x78, 0x12, 0x4d, 0x0a, 0x06, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x35, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, - 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x70, 0x65, - 0x65, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x54, 0x72, 0x75, - 0x73, 0x74, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x52, 0x06, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, - 0x22, 0x2d, 0x0a, 0x1b, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x54, 0x65, 0x72, 0x6d, 0x69, - 0x6e, 0x61, 0x74, 0x65, 0x42, 0x79, 0x49, 0x44, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x22, - 0x1e, 0x0a, 0x1c, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, - 0x61, 0x74, 0x65, 0x42, 0x79, 0x49, 0x44, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x87, 0x01, 0x0a, 0x1e, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x54, 0x72, 0x75, 0x73, 0x74, - 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x65, 0x0a, 0x12, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x54, 0x72, 0x75, - 0x73, 0x74, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x35, - 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, - 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x69, - 0x6e, 0x67, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x54, 0x72, 0x75, 0x73, 0x74, 0x42, - 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x52, 0x12, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x54, 0x72, - 0x75, 0x73, 0x74, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x22, 0x21, 0x0a, 0x1f, 0x50, 0x65, 0x65, - 0x72, 0x69, 0x6e, 0x67, 0x54, 0x72, 0x75, 0x73, 0x74, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x57, - 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x53, 0x0a, 0x1f, - 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x54, 0x72, 0x75, 0x73, 0x74, 0x42, 0x75, 0x6e, 0x64, - 0x6c, 0x65, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, - 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, - 0x6e, 0x22, 0x22, 0x0a, 0x20, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x54, 0x72, 0x75, 0x73, - 0x74, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x9a, 0x02, 0x0a, 0x14, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, - 0x74, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, - 0x0a, 0x08, 0x50, 0x65, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x50, 0x65, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x50, 0x61, - 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x50, - 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x55, 0x0a, 0x04, 0x4d, 0x65, 0x74, 0x61, - 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x41, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, - 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, - 0x61, 0x6c, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, - 0x61, 0x74, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, - 0x4d, 0x65, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x4d, 0x65, 0x74, 0x61, 0x12, - 0x38, 0x0a, 0x17, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, - 0x6c, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, - 0x52, 0x17, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, - 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x1a, 0x37, 0x0a, 0x09, 0x4d, 0x65, 0x74, - 0x61, 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, 0x22, 0x3b, 0x0a, 0x15, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x54, 0x6f, - 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x50, - 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0c, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, - 0xfc, 0x01, 0x0a, 0x10, 0x45, 0x73, 0x74, 0x61, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x50, 0x65, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x50, 0x65, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, - 0x12, 0x22, 0x0a, 0x0c, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x54, 0x6f, 0x6b, 0x65, 0x6e, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x54, - 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, - 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, - 0x6f, 0x6e, 0x12, 0x51, 0x0a, 0x04, 0x4d, 0x65, 0x74, 0x61, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x3d, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, - 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x70, 0x65, 0x65, - 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x45, 0x73, 0x74, 0x61, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, - 0x04, 0x4d, 0x65, 0x74, 0x61, 0x1a, 0x37, 0x0a, 0x09, 0x4d, 0x65, 0x74, 0x61, 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, 0x22, 0x13, - 0x0a, 0x11, 0x45, 0x73, 0x74, 0x61, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x2a, 0x73, 0x0a, 0x0c, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x53, 0x74, - 0x61, 0x74, 0x65, 0x12, 0x0d, 0x0a, 0x09, 0x55, 0x4e, 0x44, 0x45, 0x46, 0x49, 0x4e, 0x45, 0x44, - 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x50, 0x45, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, - 0x10, 0x0a, 0x0c, 0x45, 0x53, 0x54, 0x41, 0x42, 0x4c, 0x49, 0x53, 0x48, 0x49, 0x4e, 0x47, 0x10, - 0x02, 0x12, 0x0a, 0x0a, 0x06, 0x41, 0x43, 0x54, 0x49, 0x56, 0x45, 0x10, 0x03, 0x12, 0x0b, 0x0a, - 0x07, 0x46, 0x41, 0x49, 0x4c, 0x49, 0x4e, 0x47, 0x10, 0x04, 0x12, 0x0c, 0x0a, 0x08, 0x44, 0x45, - 0x4c, 0x45, 0x54, 0x49, 0x4e, 0x47, 0x10, 0x05, 0x12, 0x0e, 0x0a, 0x0a, 0x54, 0x45, 0x52, 0x4d, - 0x49, 0x4e, 0x41, 0x54, 0x45, 0x44, 0x10, 0x06, 0x32, 0x83, 0x09, 0x0a, 0x0e, 0x50, 0x65, 0x65, - 0x72, 0x69, 0x6e, 0x67, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x8a, 0x01, 0x0a, 0x0d, - 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x37, 0x2e, - 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, - 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x69, 0x6e, - 0x67, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x38, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, - 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, - 0x61, 0x6c, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, + 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x3b, 0x0a, 0x15, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x06, 0xe2, 0x86, 0x04, 0x02, 0x08, 0x03, 0x12, 0x7e, 0x0a, 0x09, 0x45, 0x73, 0x74, 0x61, - 0x62, 0x6c, 0x69, 0x73, 0x68, 0x12, 0x33, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, + 0x12, 0x22, 0x0a, 0x0c, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x54, 0x6f, 0x6b, 0x65, 0x6e, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x54, + 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0xfc, 0x01, 0x0a, 0x10, 0x45, 0x73, 0x74, 0x61, 0x62, 0x6c, 0x69, + 0x73, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x50, 0x65, 0x65, + 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x50, 0x65, 0x65, + 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, + 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x50, 0x65, 0x65, + 0x72, 0x69, 0x6e, 0x67, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x50, 0x61, 0x72, + 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x50, 0x61, + 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x51, 0x0a, 0x04, 0x4d, 0x65, 0x74, 0x61, 0x18, + 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3d, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x45, 0x73, 0x74, 0x61, 0x62, 0x6c, - 0x69, 0x73, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x34, 0x2e, 0x68, 0x61, 0x73, + 0x69, 0x73, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x4d, 0x65, 0x74, 0x61, 0x1a, 0x37, 0x0a, 0x09, 0x4d, 0x65, + 0x74, 0x61, 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, 0x22, 0x13, 0x0a, 0x11, 0x45, 0x73, 0x74, 0x61, 0x62, 0x6c, 0x69, 0x73, 0x68, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2a, 0x73, 0x0a, 0x0c, 0x50, 0x65, 0x65, 0x72, + 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x0d, 0x0a, 0x09, 0x55, 0x4e, 0x44, 0x45, + 0x46, 0x49, 0x4e, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x50, 0x45, 0x4e, 0x44, 0x49, + 0x4e, 0x47, 0x10, 0x01, 0x12, 0x10, 0x0a, 0x0c, 0x45, 0x53, 0x54, 0x41, 0x42, 0x4c, 0x49, 0x53, + 0x48, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x12, 0x0a, 0x0a, 0x06, 0x41, 0x43, 0x54, 0x49, 0x56, 0x45, + 0x10, 0x03, 0x12, 0x0b, 0x0a, 0x07, 0x46, 0x41, 0x49, 0x4c, 0x49, 0x4e, 0x47, 0x10, 0x04, 0x12, + 0x0c, 0x0a, 0x08, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x49, 0x4e, 0x47, 0x10, 0x05, 0x12, 0x0e, 0x0a, + 0x0a, 0x54, 0x45, 0x52, 0x4d, 0x49, 0x4e, 0x41, 0x54, 0x45, 0x44, 0x10, 0x06, 0x32, 0x83, 0x09, + 0x0a, 0x0e, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x12, 0x8a, 0x01, 0x0a, 0x0d, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x54, 0x6f, 0x6b, + 0x65, 0x6e, 0x12, 0x37, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, + 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x70, + 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x54, + 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x38, 0x2e, 0x68, 0x61, + 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, + 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x2e, + 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xe2, 0x86, 0x04, 0x02, 0x08, 0x03, 0x12, 0x7e, 0x0a, + 0x09, 0x45, 0x73, 0x74, 0x61, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x12, 0x33, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x45, - 0x73, 0x74, 0x61, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x06, 0xe2, 0x86, 0x04, 0x02, 0x08, 0x03, 0x12, 0x84, 0x01, 0x0a, 0x0b, 0x50, 0x65, 0x65, - 0x72, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x61, 0x64, 0x12, 0x35, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, - 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, - 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x50, 0x65, 0x65, - 0x72, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x36, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, - 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x70, 0x65, 0x65, 0x72, - 0x69, 0x6e, 0x67, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x61, 0x64, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xe2, 0x86, 0x04, 0x02, 0x08, 0x02, 0x12, - 0x84, 0x01, 0x0a, 0x0b, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x4c, 0x69, 0x73, 0x74, 0x12, - 0x35, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, + 0x73, 0x74, 0x61, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x34, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x70, 0x65, 0x65, 0x72, - 0x69, 0x6e, 0x67, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x4c, 0x69, 0x73, 0x74, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x36, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, + 0x69, 0x6e, 0x67, 0x2e, 0x45, 0x73, 0x74, 0x61, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xe2, 0x86, 0x04, 0x02, 0x08, 0x03, 0x12, 0x84, 0x01, + 0x0a, 0x0b, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x61, 0x64, 0x12, 0x35, 0x2e, + 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, + 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x69, 0x6e, + 0x67, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x61, 0x64, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x36, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, + 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, + 0x2e, 0x70, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, + 0x52, 0x65, 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xe2, 0x86, + 0x04, 0x02, 0x08, 0x02, 0x12, 0x84, 0x01, 0x0a, 0x0b, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, + 0x4c, 0x69, 0x73, 0x74, 0x12, 0x35, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, + 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, + 0x2e, 0x70, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, + 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x36, 0x2e, 0x68, 0x61, + 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, + 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x2e, + 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x06, 0xe2, 0x86, 0x04, 0x02, 0x08, 0x02, 0x12, 0x8a, 0x01, 0x0a, 0x0d, + 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x37, 0x2e, + 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, + 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x69, 0x6e, + 0x67, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x38, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x69, - 0x6e, 0x67, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, - 0xe2, 0x86, 0x04, 0x02, 0x08, 0x02, 0x12, 0x8a, 0x01, 0x0a, 0x0d, 0x50, 0x65, 0x65, 0x72, 0x69, - 0x6e, 0x67, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x37, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, - 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, - 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x50, 0x65, 0x65, - 0x72, 0x69, 0x6e, 0x67, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x38, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, + 0x6e, 0x67, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x06, 0xe2, 0x86, 0x04, 0x02, 0x08, 0x03, 0x12, 0x87, 0x01, 0x0a, 0x0c, 0x50, 0x65, 0x65, + 0x72, 0x69, 0x6e, 0x67, 0x57, 0x72, 0x69, 0x74, 0x65, 0x12, 0x36, 0x2e, 0x68, 0x61, 0x73, 0x68, + 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, + 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x50, 0x65, + 0x65, 0x72, 0x69, 0x6e, 0x67, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x37, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x70, 0x65, - 0x65, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x44, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xe2, 0x86, 0x04, - 0x02, 0x08, 0x03, 0x12, 0x87, 0x01, 0x0a, 0x0c, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x57, - 0x72, 0x69, 0x74, 0x65, 0x12, 0x36, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, + 0x65, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x57, 0x72, 0x69, + 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xe2, 0x86, 0x04, 0x02, + 0x08, 0x03, 0x12, 0xab, 0x01, 0x0a, 0x18, 0x54, 0x72, 0x75, 0x73, 0x74, 0x42, 0x75, 0x6e, 0x64, + 0x6c, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, + 0x42, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, + 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x70, 0x65, 0x65, 0x72, + 0x69, 0x6e, 0x67, 0x2e, 0x54, 0x72, 0x75, 0x73, 0x74, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x4c, + 0x69, 0x73, 0x74, 0x42, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x43, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, + 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, + 0x70, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x54, 0x72, 0x75, 0x73, 0x74, 0x42, 0x75, 0x6e, + 0x64, 0x6c, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xe2, 0x86, 0x04, 0x02, 0x08, 0x02, + 0x12, 0x90, 0x01, 0x0a, 0x0f, 0x54, 0x72, 0x75, 0x73, 0x74, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, + 0x52, 0x65, 0x61, 0x64, 0x12, 0x39, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, - 0x2e, 0x70, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, - 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x37, 0x2e, 0x68, - 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, - 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, - 0x2e, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xe2, 0x86, 0x04, 0x02, 0x08, 0x03, 0x12, 0xab, 0x01, - 0x0a, 0x18, 0x54, 0x72, 0x75, 0x73, 0x74, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x4c, 0x69, 0x73, - 0x74, 0x42, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x42, 0x2e, 0x68, 0x61, 0x73, - 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, - 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x54, - 0x72, 0x75, 0x73, 0x74, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x79, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x43, - 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, - 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x69, - 0x6e, 0x67, 0x2e, 0x54, 0x72, 0x75, 0x73, 0x74, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x4c, 0x69, - 0x73, 0x74, 0x42, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x06, 0xe2, 0x86, 0x04, 0x02, 0x08, 0x02, 0x12, 0x90, 0x01, 0x0a, 0x0f, - 0x54, 0x72, 0x75, 0x73, 0x74, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x52, 0x65, 0x61, 0x64, 0x12, - 0x39, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, + 0x2e, 0x70, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x54, 0x72, 0x75, 0x73, 0x74, 0x42, 0x75, + 0x6e, 0x64, 0x6c, 0x65, 0x52, 0x65, 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x3a, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x54, 0x72, 0x75, 0x73, 0x74, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x52, - 0x65, 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3a, 0x2e, 0x68, 0x61, 0x73, - 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, - 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x54, - 0x72, 0x75, 0x73, 0x74, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x52, 0x65, 0x61, 0x64, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xe2, 0x86, 0x04, 0x02, 0x08, 0x02, 0x42, 0x8a, - 0x02, 0x0a, 0x25, 0x63, 0x6f, 0x6d, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, - 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, - 0x2e, 0x70, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x42, 0x0c, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, - 0x67, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x2b, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, - 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2f, 0x63, - 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x70, 0x62, 0x70, 0x65, - 0x65, 0x72, 0x69, 0x6e, 0x67, 0xa2, 0x02, 0x04, 0x48, 0x43, 0x49, 0x50, 0xaa, 0x02, 0x21, 0x48, - 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, - 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, - 0xca, 0x02, 0x21, 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x5c, 0x43, 0x6f, 0x6e, - 0x73, 0x75, 0x6c, 0x5c, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5c, 0x50, 0x65, 0x65, - 0x72, 0x69, 0x6e, 0x67, 0xe2, 0x02, 0x2d, 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, - 0x5c, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x5c, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, - 0x5c, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, - 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x24, 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, - 0x3a, 0x3a, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x3a, 0x3a, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, - 0x61, 0x6c, 0x3a, 0x3a, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x06, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x33, + 0x65, 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xe2, 0x86, 0x04, + 0x02, 0x08, 0x02, 0x42, 0x92, 0x02, 0x0a, 0x25, 0x63, 0x6f, 0x6d, 0x2e, 0x68, 0x61, 0x73, 0x68, + 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, + 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x42, 0x0c, 0x50, + 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x33, 0x67, + 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, + 0x6f, 0x72, 0x70, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x2f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2f, 0x70, 0x62, 0x70, 0x65, 0x65, 0x72, 0x69, + 0x6e, 0x67, 0xa2, 0x02, 0x04, 0x48, 0x43, 0x49, 0x50, 0xaa, 0x02, 0x21, 0x48, 0x61, 0x73, 0x68, + 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x49, 0x6e, 0x74, + 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0xca, 0x02, 0x21, + 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x5c, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, + 0x5c, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5c, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, + 0x67, 0xe2, 0x02, 0x2d, 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x5c, 0x43, 0x6f, + 0x6e, 0x73, 0x75, 0x6c, 0x5c, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5c, 0x50, 0x65, + 0x65, 0x72, 0x69, 0x6e, 0x67, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, + 0x61, 0xea, 0x02, 0x24, 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x3a, 0x3a, 0x43, + 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x3a, 0x3a, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x3a, + 0x3a, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( - file_proto_pbpeering_peering_proto_rawDescOnce sync.Once - file_proto_pbpeering_peering_proto_rawDescData = file_proto_pbpeering_peering_proto_rawDesc + file_private_pbpeering_peering_proto_rawDescOnce sync.Once + file_private_pbpeering_peering_proto_rawDescData = file_private_pbpeering_peering_proto_rawDesc ) -func file_proto_pbpeering_peering_proto_rawDescGZIP() []byte { - file_proto_pbpeering_peering_proto_rawDescOnce.Do(func() { - file_proto_pbpeering_peering_proto_rawDescData = protoimpl.X.CompressGZIP(file_proto_pbpeering_peering_proto_rawDescData) +func file_private_pbpeering_peering_proto_rawDescGZIP() []byte { + file_private_pbpeering_peering_proto_rawDescOnce.Do(func() { + file_private_pbpeering_peering_proto_rawDescData = protoimpl.X.CompressGZIP(file_private_pbpeering_peering_proto_rawDescData) }) - return file_proto_pbpeering_peering_proto_rawDescData + return file_private_pbpeering_peering_proto_rawDescData } -var file_proto_pbpeering_peering_proto_enumTypes = make([]protoimpl.EnumInfo, 1) -var file_proto_pbpeering_peering_proto_msgTypes = make([]protoimpl.MessageInfo, 39) -var file_proto_pbpeering_peering_proto_goTypes = []interface{}{ +var file_private_pbpeering_peering_proto_enumTypes = make([]protoimpl.EnumInfo, 1) +var file_private_pbpeering_peering_proto_msgTypes = make([]protoimpl.MessageInfo, 39) +var file_private_pbpeering_peering_proto_goTypes = []interface{}{ (PeeringState)(0), // 0: hashicorp.consul.internal.peering.PeeringState (*SecretsWriteRequest)(nil), // 1: hashicorp.consul.internal.peering.SecretsWriteRequest (*PeeringSecrets)(nil), // 2: hashicorp.consul.internal.peering.PeeringSecrets @@ -2751,7 +2750,7 @@ var file_proto_pbpeering_peering_proto_goTypes = []interface{}{ nil, // 39: hashicorp.consul.internal.peering.EstablishRequest.MetaEntry (*timestamppb.Timestamp)(nil), // 40: google.protobuf.Timestamp } -var file_proto_pbpeering_peering_proto_depIdxs = []int32{ +var file_private_pbpeering_peering_proto_depIdxs = []int32{ 30, // 0: hashicorp.consul.internal.peering.SecretsWriteRequest.generate_token:type_name -> hashicorp.consul.internal.peering.SecretsWriteRequest.GenerateTokenRequest 31, // 1: hashicorp.consul.internal.peering.SecretsWriteRequest.exchange_secret:type_name -> hashicorp.consul.internal.peering.SecretsWriteRequest.ExchangeSecretRequest 32, // 2: hashicorp.consul.internal.peering.SecretsWriteRequest.promote_pending:type_name -> hashicorp.consul.internal.peering.SecretsWriteRequest.PromotePendingRequest @@ -2799,13 +2798,13 @@ var file_proto_pbpeering_peering_proto_depIdxs = []int32{ 0, // [0:24] is the sub-list for field type_name } -func init() { file_proto_pbpeering_peering_proto_init() } -func file_proto_pbpeering_peering_proto_init() { - if File_proto_pbpeering_peering_proto != nil { +func init() { file_private_pbpeering_peering_proto_init() } +func file_private_pbpeering_peering_proto_init() { + if File_private_pbpeering_peering_proto != nil { return } if !protoimpl.UnsafeEnabled { - file_proto_pbpeering_peering_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + file_private_pbpeering_peering_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SecretsWriteRequest); i { case 0: return &v.state @@ -2817,7 +2816,7 @@ func file_proto_pbpeering_peering_proto_init() { return nil } } - file_proto_pbpeering_peering_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + file_private_pbpeering_peering_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PeeringSecrets); i { case 0: return &v.state @@ -2829,7 +2828,7 @@ func file_proto_pbpeering_peering_proto_init() { return nil } } - file_proto_pbpeering_peering_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + file_private_pbpeering_peering_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Peering); i { case 0: return &v.state @@ -2841,7 +2840,7 @@ func file_proto_pbpeering_peering_proto_init() { return nil } } - file_proto_pbpeering_peering_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + file_private_pbpeering_peering_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*RemoteInfo); i { case 0: return &v.state @@ -2853,7 +2852,7 @@ func file_proto_pbpeering_peering_proto_init() { return nil } } - file_proto_pbpeering_peering_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + file_private_pbpeering_peering_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*StreamStatus); i { case 0: return &v.state @@ -2865,7 +2864,7 @@ func file_proto_pbpeering_peering_proto_init() { return nil } } - file_proto_pbpeering_peering_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + file_private_pbpeering_peering_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PeeringTrustBundle); i { case 0: return &v.state @@ -2877,7 +2876,7 @@ func file_proto_pbpeering_peering_proto_init() { return nil } } - file_proto_pbpeering_peering_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { + file_private_pbpeering_peering_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PeeringServerAddresses); i { case 0: return &v.state @@ -2889,7 +2888,7 @@ func file_proto_pbpeering_peering_proto_init() { return nil } } - file_proto_pbpeering_peering_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { + file_private_pbpeering_peering_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PeeringReadRequest); i { case 0: return &v.state @@ -2901,7 +2900,7 @@ func file_proto_pbpeering_peering_proto_init() { return nil } } - file_proto_pbpeering_peering_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { + file_private_pbpeering_peering_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PeeringReadResponse); i { case 0: return &v.state @@ -2913,7 +2912,7 @@ func file_proto_pbpeering_peering_proto_init() { return nil } } - file_proto_pbpeering_peering_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { + file_private_pbpeering_peering_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PeeringListRequest); i { case 0: return &v.state @@ -2925,7 +2924,7 @@ func file_proto_pbpeering_peering_proto_init() { return nil } } - file_proto_pbpeering_peering_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { + file_private_pbpeering_peering_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PeeringListResponse); i { case 0: return &v.state @@ -2937,7 +2936,7 @@ func file_proto_pbpeering_peering_proto_init() { return nil } } - file_proto_pbpeering_peering_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { + file_private_pbpeering_peering_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PeeringWriteRequest); i { case 0: return &v.state @@ -2949,7 +2948,7 @@ func file_proto_pbpeering_peering_proto_init() { return nil } } - file_proto_pbpeering_peering_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { + file_private_pbpeering_peering_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PeeringWriteResponse); i { case 0: return &v.state @@ -2961,7 +2960,7 @@ func file_proto_pbpeering_peering_proto_init() { return nil } } - file_proto_pbpeering_peering_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { + file_private_pbpeering_peering_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PeeringDeleteRequest); i { case 0: return &v.state @@ -2973,7 +2972,7 @@ func file_proto_pbpeering_peering_proto_init() { return nil } } - file_proto_pbpeering_peering_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { + file_private_pbpeering_peering_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PeeringDeleteResponse); i { case 0: return &v.state @@ -2985,7 +2984,7 @@ func file_proto_pbpeering_peering_proto_init() { return nil } } - file_proto_pbpeering_peering_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { + file_private_pbpeering_peering_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*TrustBundleListByServiceRequest); i { case 0: return &v.state @@ -2997,7 +2996,7 @@ func file_proto_pbpeering_peering_proto_init() { return nil } } - file_proto_pbpeering_peering_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { + file_private_pbpeering_peering_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*TrustBundleListByServiceResponse); i { case 0: return &v.state @@ -3009,7 +3008,7 @@ func file_proto_pbpeering_peering_proto_init() { return nil } } - file_proto_pbpeering_peering_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { + file_private_pbpeering_peering_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*TrustBundleReadRequest); i { case 0: return &v.state @@ -3021,7 +3020,7 @@ func file_proto_pbpeering_peering_proto_init() { return nil } } - file_proto_pbpeering_peering_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { + file_private_pbpeering_peering_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*TrustBundleReadResponse); i { case 0: return &v.state @@ -3033,7 +3032,7 @@ func file_proto_pbpeering_peering_proto_init() { return nil } } - file_proto_pbpeering_peering_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { + file_private_pbpeering_peering_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PeeringTerminateByIDRequest); i { case 0: return &v.state @@ -3045,7 +3044,7 @@ func file_proto_pbpeering_peering_proto_init() { return nil } } - file_proto_pbpeering_peering_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { + file_private_pbpeering_peering_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PeeringTerminateByIDResponse); i { case 0: return &v.state @@ -3057,7 +3056,7 @@ func file_proto_pbpeering_peering_proto_init() { return nil } } - file_proto_pbpeering_peering_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { + file_private_pbpeering_peering_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PeeringTrustBundleWriteRequest); i { case 0: return &v.state @@ -3069,7 +3068,7 @@ func file_proto_pbpeering_peering_proto_init() { return nil } } - file_proto_pbpeering_peering_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { + file_private_pbpeering_peering_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PeeringTrustBundleWriteResponse); i { case 0: return &v.state @@ -3081,7 +3080,7 @@ func file_proto_pbpeering_peering_proto_init() { return nil } } - file_proto_pbpeering_peering_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { + file_private_pbpeering_peering_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PeeringTrustBundleDeleteRequest); i { case 0: return &v.state @@ -3093,7 +3092,7 @@ func file_proto_pbpeering_peering_proto_init() { return nil } } - file_proto_pbpeering_peering_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { + file_private_pbpeering_peering_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PeeringTrustBundleDeleteResponse); i { case 0: return &v.state @@ -3105,7 +3104,7 @@ func file_proto_pbpeering_peering_proto_init() { return nil } } - file_proto_pbpeering_peering_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { + file_private_pbpeering_peering_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GenerateTokenRequest); i { case 0: return &v.state @@ -3117,7 +3116,7 @@ func file_proto_pbpeering_peering_proto_init() { return nil } } - file_proto_pbpeering_peering_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { + file_private_pbpeering_peering_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GenerateTokenResponse); i { case 0: return &v.state @@ -3129,7 +3128,7 @@ func file_proto_pbpeering_peering_proto_init() { return nil } } - file_proto_pbpeering_peering_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { + file_private_pbpeering_peering_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*EstablishRequest); i { case 0: return &v.state @@ -3141,7 +3140,7 @@ func file_proto_pbpeering_peering_proto_init() { return nil } } - file_proto_pbpeering_peering_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { + file_private_pbpeering_peering_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*EstablishResponse); i { case 0: return &v.state @@ -3153,7 +3152,7 @@ func file_proto_pbpeering_peering_proto_init() { return nil } } - file_proto_pbpeering_peering_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { + file_private_pbpeering_peering_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SecretsWriteRequest_GenerateTokenRequest); i { case 0: return &v.state @@ -3165,7 +3164,7 @@ func file_proto_pbpeering_peering_proto_init() { return nil } } - file_proto_pbpeering_peering_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} { + file_private_pbpeering_peering_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SecretsWriteRequest_ExchangeSecretRequest); i { case 0: return &v.state @@ -3177,7 +3176,7 @@ func file_proto_pbpeering_peering_proto_init() { return nil } } - file_proto_pbpeering_peering_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { + file_private_pbpeering_peering_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SecretsWriteRequest_PromotePendingRequest); i { case 0: return &v.state @@ -3189,7 +3188,7 @@ func file_proto_pbpeering_peering_proto_init() { return nil } } - file_proto_pbpeering_peering_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} { + file_private_pbpeering_peering_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SecretsWriteRequest_EstablishRequest); i { case 0: return &v.state @@ -3201,7 +3200,7 @@ func file_proto_pbpeering_peering_proto_init() { return nil } } - file_proto_pbpeering_peering_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} { + file_private_pbpeering_peering_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PeeringSecrets_Establishment); i { case 0: return &v.state @@ -3213,7 +3212,7 @@ func file_proto_pbpeering_peering_proto_init() { return nil } } - file_proto_pbpeering_peering_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} { + file_private_pbpeering_peering_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PeeringSecrets_Stream); i { case 0: return &v.state @@ -3226,7 +3225,7 @@ func file_proto_pbpeering_peering_proto_init() { } } } - file_proto_pbpeering_peering_proto_msgTypes[0].OneofWrappers = []interface{}{ + file_private_pbpeering_peering_proto_msgTypes[0].OneofWrappers = []interface{}{ (*SecretsWriteRequest_GenerateToken)(nil), (*SecretsWriteRequest_ExchangeSecret)(nil), (*SecretsWriteRequest_PromotePending)(nil), @@ -3236,19 +3235,19 @@ func file_proto_pbpeering_peering_proto_init() { out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_proto_pbpeering_peering_proto_rawDesc, + RawDescriptor: file_private_pbpeering_peering_proto_rawDesc, NumEnums: 1, NumMessages: 39, NumExtensions: 0, NumServices: 1, }, - GoTypes: file_proto_pbpeering_peering_proto_goTypes, - DependencyIndexes: file_proto_pbpeering_peering_proto_depIdxs, - EnumInfos: file_proto_pbpeering_peering_proto_enumTypes, - MessageInfos: file_proto_pbpeering_peering_proto_msgTypes, + GoTypes: file_private_pbpeering_peering_proto_goTypes, + DependencyIndexes: file_private_pbpeering_peering_proto_depIdxs, + EnumInfos: file_private_pbpeering_peering_proto_enumTypes, + MessageInfos: file_private_pbpeering_peering_proto_msgTypes, }.Build() - File_proto_pbpeering_peering_proto = out.File - file_proto_pbpeering_peering_proto_rawDesc = nil - file_proto_pbpeering_peering_proto_goTypes = nil - file_proto_pbpeering_peering_proto_depIdxs = nil + File_private_pbpeering_peering_proto = out.File + file_private_pbpeering_peering_proto_rawDesc = nil + file_private_pbpeering_peering_proto_goTypes = nil + file_private_pbpeering_peering_proto_depIdxs = nil } diff --git a/proto/pbpeering/peering.proto b/proto/private/pbpeering/peering.proto similarity index 93% rename from proto/pbpeering/peering.proto rename to proto/private/pbpeering/peering.proto index 751eadc6a1a..3d6c353e28d 100644 --- a/proto/pbpeering/peering.proto +++ b/proto/private/pbpeering/peering.proto @@ -2,61 +2,45 @@ syntax = "proto3"; package hashicorp.consul.internal.peering; +import "annotations/ratelimit/ratelimit.proto"; import "google/protobuf/timestamp.proto"; -import "proto-public/annotations/ratelimit/ratelimit.proto"; // PeeringService handles operations for establishing peering relationships // between disparate Consul clusters. service PeeringService { rpc GenerateToken(GenerateTokenRequest) returns (GenerateTokenResponse) { - option (hashicorp.consul.internal.ratelimit.spec) = { - operation_type: OPERATION_TYPE_WRITE, - }; + option (hashicorp.consul.internal.ratelimit.spec) = {operation_type: OPERATION_TYPE_WRITE}; } rpc Establish(EstablishRequest) returns (EstablishResponse) { - option (hashicorp.consul.internal.ratelimit.spec) = { - operation_type: OPERATION_TYPE_WRITE, - }; + option (hashicorp.consul.internal.ratelimit.spec) = {operation_type: OPERATION_TYPE_WRITE}; } rpc PeeringRead(PeeringReadRequest) returns (PeeringReadResponse) { - option (hashicorp.consul.internal.ratelimit.spec) = { - operation_type: OPERATION_TYPE_READ, - }; + option (hashicorp.consul.internal.ratelimit.spec) = {operation_type: OPERATION_TYPE_READ}; } rpc PeeringList(PeeringListRequest) returns (PeeringListResponse) { - option (hashicorp.consul.internal.ratelimit.spec) = { - operation_type: OPERATION_TYPE_READ, - }; + option (hashicorp.consul.internal.ratelimit.spec) = {operation_type: OPERATION_TYPE_READ}; } rpc PeeringDelete(PeeringDeleteRequest) returns (PeeringDeleteResponse) { - option (hashicorp.consul.internal.ratelimit.spec) = { - operation_type: OPERATION_TYPE_WRITE, - }; + option (hashicorp.consul.internal.ratelimit.spec) = {operation_type: OPERATION_TYPE_WRITE}; } // TODO(peering): As of writing, this method is only used in tests to set up Peerings in the state store. // Consider removing if we can find another way to populate state store in peering_endpoint_test.go rpc PeeringWrite(PeeringWriteRequest) returns (PeeringWriteResponse) { - option (hashicorp.consul.internal.ratelimit.spec) = { - operation_type: OPERATION_TYPE_WRITE, - }; + option (hashicorp.consul.internal.ratelimit.spec) = {operation_type: OPERATION_TYPE_WRITE}; } // TODO(peering): Rename this to PeeredServiceRoots? or something like that? rpc TrustBundleListByService(TrustBundleListByServiceRequest) returns (TrustBundleListByServiceResponse) { - option (hashicorp.consul.internal.ratelimit.spec) = { - operation_type: OPERATION_TYPE_READ, - }; + option (hashicorp.consul.internal.ratelimit.spec) = {operation_type: OPERATION_TYPE_READ}; } rpc TrustBundleRead(TrustBundleReadRequest) returns (TrustBundleReadResponse) { - option (hashicorp.consul.internal.ratelimit.spec) = { - operation_type: OPERATION_TYPE_READ, - }; + option (hashicorp.consul.internal.ratelimit.spec) = {operation_type: OPERATION_TYPE_READ}; } } diff --git a/proto/pbpeering/peering.rpcglue.pb.go b/proto/private/pbpeering/peering.rpcglue.pb.go similarity index 100% rename from proto/pbpeering/peering.rpcglue.pb.go rename to proto/private/pbpeering/peering.rpcglue.pb.go diff --git a/proto/pbpeering/peering_grpc.pb.go b/proto/private/pbpeering/peering_grpc.pb.go similarity index 99% rename from proto/pbpeering/peering_grpc.pb.go rename to proto/private/pbpeering/peering_grpc.pb.go index 0eb3c734a82..a879f3e00fc 100644 --- a/proto/pbpeering/peering_grpc.pb.go +++ b/proto/private/pbpeering/peering_grpc.pb.go @@ -2,7 +2,7 @@ // versions: // - protoc-gen-go-grpc v1.2.0 // - protoc (unknown) -// source: proto/pbpeering/peering.proto +// source: private/pbpeering/peering.proto package pbpeering @@ -357,5 +357,5 @@ var PeeringService_ServiceDesc = grpc.ServiceDesc{ }, }, Streams: []grpc.StreamDesc{}, - Metadata: "proto/pbpeering/peering.proto", + Metadata: "private/pbpeering/peering.proto", } diff --git a/proto/pbpeering/peering_oss.go b/proto/private/pbpeering/peering_oss.go similarity index 100% rename from proto/pbpeering/peering_oss.go rename to proto/private/pbpeering/peering_oss.go diff --git a/proto/pbpeerstream/convert.go b/proto/private/pbpeerstream/convert.go similarity index 93% rename from proto/pbpeerstream/convert.go rename to proto/private/pbpeerstream/convert.go index 67ddb636fd9..603e6b1aa9e 100644 --- a/proto/pbpeerstream/convert.go +++ b/proto/private/pbpeerstream/convert.go @@ -4,7 +4,7 @@ import ( "fmt" "github.com/hashicorp/consul/agent/structs" - pbservice "github.com/hashicorp/consul/proto/pbservice" + pbservice "github.com/hashicorp/consul/proto/private/pbservice" ) // CheckServiceNodesToStruct converts the contained CheckServiceNodes to their structs equivalent. diff --git a/proto/pbpeerstream/peerstream.go b/proto/private/pbpeerstream/peerstream.go similarity index 100% rename from proto/pbpeerstream/peerstream.go rename to proto/private/pbpeerstream/peerstream.go diff --git a/proto/pbpeerstream/peerstream.pb.binary.go b/proto/private/pbpeerstream/peerstream.pb.binary.go similarity index 98% rename from proto/pbpeerstream/peerstream.pb.binary.go rename to proto/private/pbpeerstream/peerstream.pb.binary.go index 87c4e7bec6f..98ccfee2f92 100644 --- a/proto/pbpeerstream/peerstream.pb.binary.go +++ b/proto/private/pbpeerstream/peerstream.pb.binary.go @@ -1,5 +1,5 @@ // Code generated by protoc-gen-go-binary. DO NOT EDIT. -// source: proto/pbpeerstream/peerstream.proto +// source: private/pbpeerstream/peerstream.proto package pbpeerstream diff --git a/proto/pbpeerstream/peerstream.pb.go b/proto/private/pbpeerstream/peerstream.pb.go similarity index 59% rename from proto/pbpeerstream/peerstream.pb.go rename to proto/private/pbpeerstream/peerstream.pb.go index 87c79ea343b..35a03f0e346 100644 --- a/proto/pbpeerstream/peerstream.pb.go +++ b/proto/private/pbpeerstream/peerstream.pb.go @@ -2,15 +2,15 @@ // versions: // protoc-gen-go v1.28.1 // protoc (unknown) -// source: proto/pbpeerstream/peerstream.proto +// source: private/pbpeerstream/peerstream.proto package pbpeerstream import ( _ "github.com/hashicorp/consul/proto-public/annotations/ratelimit" - pbpeering "github.com/hashicorp/consul/proto/pbpeering" - pbservice "github.com/hashicorp/consul/proto/pbservice" - pbstatus "github.com/hashicorp/consul/proto/pbstatus" + pbpeering "github.com/hashicorp/consul/proto/private/pbpeering" + pbservice "github.com/hashicorp/consul/proto/private/pbservice" + pbstatus "github.com/hashicorp/consul/proto/private/pbstatus" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" anypb "google.golang.org/protobuf/types/known/anypb" @@ -57,11 +57,11 @@ func (x Operation) String() string { } func (Operation) Descriptor() protoreflect.EnumDescriptor { - return file_proto_pbpeerstream_peerstream_proto_enumTypes[0].Descriptor() + return file_private_pbpeerstream_peerstream_proto_enumTypes[0].Descriptor() } func (Operation) Type() protoreflect.EnumType { - return &file_proto_pbpeerstream_peerstream_proto_enumTypes[0] + return &file_private_pbpeerstream_peerstream_proto_enumTypes[0] } func (x Operation) Number() protoreflect.EnumNumber { @@ -70,7 +70,7 @@ func (x Operation) Number() protoreflect.EnumNumber { // Deprecated: Use Operation.Descriptor instead. func (Operation) EnumDescriptor() ([]byte, []int) { - return file_proto_pbpeerstream_peerstream_proto_rawDescGZIP(), []int{0} + return file_private_pbpeerstream_peerstream_proto_rawDescGZIP(), []int{0} } type ReplicationMessage struct { @@ -91,7 +91,7 @@ type ReplicationMessage struct { func (x *ReplicationMessage) Reset() { *x = ReplicationMessage{} if protoimpl.UnsafeEnabled { - mi := &file_proto_pbpeerstream_peerstream_proto_msgTypes[0] + mi := &file_private_pbpeerstream_peerstream_proto_msgTypes[0] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -104,7 +104,7 @@ func (x *ReplicationMessage) String() string { func (*ReplicationMessage) ProtoMessage() {} func (x *ReplicationMessage) ProtoReflect() protoreflect.Message { - mi := &file_proto_pbpeerstream_peerstream_proto_msgTypes[0] + mi := &file_private_pbpeerstream_peerstream_proto_msgTypes[0] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -117,7 +117,7 @@ func (x *ReplicationMessage) ProtoReflect() protoreflect.Message { // Deprecated: Use ReplicationMessage.ProtoReflect.Descriptor instead. func (*ReplicationMessage) Descriptor() ([]byte, []int) { - return file_proto_pbpeerstream_peerstream_proto_rawDescGZIP(), []int{0} + return file_private_pbpeerstream_peerstream_proto_rawDescGZIP(), []int{0} } func (m *ReplicationMessage) GetPayload() isReplicationMessage_Payload { @@ -210,7 +210,7 @@ type LeaderAddress struct { func (x *LeaderAddress) Reset() { *x = LeaderAddress{} if protoimpl.UnsafeEnabled { - mi := &file_proto_pbpeerstream_peerstream_proto_msgTypes[1] + mi := &file_private_pbpeerstream_peerstream_proto_msgTypes[1] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -223,7 +223,7 @@ func (x *LeaderAddress) String() string { func (*LeaderAddress) ProtoMessage() {} func (x *LeaderAddress) ProtoReflect() protoreflect.Message { - mi := &file_proto_pbpeerstream_peerstream_proto_msgTypes[1] + mi := &file_private_pbpeerstream_peerstream_proto_msgTypes[1] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -236,7 +236,7 @@ func (x *LeaderAddress) ProtoReflect() protoreflect.Message { // Deprecated: Use LeaderAddress.ProtoReflect.Descriptor instead. func (*LeaderAddress) Descriptor() ([]byte, []int) { - return file_proto_pbpeerstream_peerstream_proto_rawDescGZIP(), []int{1} + return file_private_pbpeerstream_peerstream_proto_rawDescGZIP(), []int{1} } func (x *LeaderAddress) GetAddress() string { @@ -258,7 +258,7 @@ type ExportedService struct { func (x *ExportedService) Reset() { *x = ExportedService{} if protoimpl.UnsafeEnabled { - mi := &file_proto_pbpeerstream_peerstream_proto_msgTypes[2] + mi := &file_private_pbpeerstream_peerstream_proto_msgTypes[2] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -271,7 +271,7 @@ func (x *ExportedService) String() string { func (*ExportedService) ProtoMessage() {} func (x *ExportedService) ProtoReflect() protoreflect.Message { - mi := &file_proto_pbpeerstream_peerstream_proto_msgTypes[2] + mi := &file_private_pbpeerstream_peerstream_proto_msgTypes[2] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -284,7 +284,7 @@ func (x *ExportedService) ProtoReflect() protoreflect.Message { // Deprecated: Use ExportedService.ProtoReflect.Descriptor instead. func (*ExportedService) Descriptor() ([]byte, []int) { - return file_proto_pbpeerstream_peerstream_proto_rawDescGZIP(), []int{2} + return file_private_pbpeerstream_peerstream_proto_rawDescGZIP(), []int{2} } func (x *ExportedService) GetNodes() []*pbservice.CheckServiceNode { @@ -307,7 +307,7 @@ type ExportedServiceList struct { func (x *ExportedServiceList) Reset() { *x = ExportedServiceList{} if protoimpl.UnsafeEnabled { - mi := &file_proto_pbpeerstream_peerstream_proto_msgTypes[3] + mi := &file_private_pbpeerstream_peerstream_proto_msgTypes[3] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -320,7 +320,7 @@ func (x *ExportedServiceList) String() string { func (*ExportedServiceList) ProtoMessage() {} func (x *ExportedServiceList) ProtoReflect() protoreflect.Message { - mi := &file_proto_pbpeerstream_peerstream_proto_msgTypes[3] + mi := &file_private_pbpeerstream_peerstream_proto_msgTypes[3] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -333,7 +333,7 @@ func (x *ExportedServiceList) ProtoReflect() protoreflect.Message { // Deprecated: Use ExportedServiceList.ProtoReflect.Descriptor instead. func (*ExportedServiceList) Descriptor() ([]byte, []int) { - return file_proto_pbpeerstream_peerstream_proto_rawDescGZIP(), []int{3} + return file_private_pbpeerstream_peerstream_proto_rawDescGZIP(), []int{3} } func (x *ExportedServiceList) GetServices() []string { @@ -358,7 +358,7 @@ type ExchangeSecretRequest struct { func (x *ExchangeSecretRequest) Reset() { *x = ExchangeSecretRequest{} if protoimpl.UnsafeEnabled { - mi := &file_proto_pbpeerstream_peerstream_proto_msgTypes[4] + mi := &file_private_pbpeerstream_peerstream_proto_msgTypes[4] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -371,7 +371,7 @@ func (x *ExchangeSecretRequest) String() string { func (*ExchangeSecretRequest) ProtoMessage() {} func (x *ExchangeSecretRequest) ProtoReflect() protoreflect.Message { - mi := &file_proto_pbpeerstream_peerstream_proto_msgTypes[4] + mi := &file_private_pbpeerstream_peerstream_proto_msgTypes[4] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -384,7 +384,7 @@ func (x *ExchangeSecretRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ExchangeSecretRequest.ProtoReflect.Descriptor instead. func (*ExchangeSecretRequest) Descriptor() ([]byte, []int) { - return file_proto_pbpeerstream_peerstream_proto_rawDescGZIP(), []int{4} + return file_private_pbpeerstream_peerstream_proto_rawDescGZIP(), []int{4} } func (x *ExchangeSecretRequest) GetPeerID() string { @@ -414,7 +414,7 @@ type ExchangeSecretResponse struct { func (x *ExchangeSecretResponse) Reset() { *x = ExchangeSecretResponse{} if protoimpl.UnsafeEnabled { - mi := &file_proto_pbpeerstream_peerstream_proto_msgTypes[5] + mi := &file_private_pbpeerstream_peerstream_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -427,7 +427,7 @@ func (x *ExchangeSecretResponse) String() string { func (*ExchangeSecretResponse) ProtoMessage() {} func (x *ExchangeSecretResponse) ProtoReflect() protoreflect.Message { - mi := &file_proto_pbpeerstream_peerstream_proto_msgTypes[5] + mi := &file_private_pbpeerstream_peerstream_proto_msgTypes[5] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -440,7 +440,7 @@ func (x *ExchangeSecretResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ExchangeSecretResponse.ProtoReflect.Descriptor instead. func (*ExchangeSecretResponse) Descriptor() ([]byte, []int) { - return file_proto_pbpeerstream_peerstream_proto_rawDescGZIP(), []int{5} + return file_private_pbpeerstream_peerstream_proto_rawDescGZIP(), []int{5} } func (x *ExchangeSecretResponse) GetStreamSecret() string { @@ -468,7 +468,7 @@ type ReplicationMessage_Open struct { func (x *ReplicationMessage_Open) Reset() { *x = ReplicationMessage_Open{} if protoimpl.UnsafeEnabled { - mi := &file_proto_pbpeerstream_peerstream_proto_msgTypes[6] + mi := &file_private_pbpeerstream_peerstream_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -481,7 +481,7 @@ func (x *ReplicationMessage_Open) String() string { func (*ReplicationMessage_Open) ProtoMessage() {} func (x *ReplicationMessage_Open) ProtoReflect() protoreflect.Message { - mi := &file_proto_pbpeerstream_peerstream_proto_msgTypes[6] + mi := &file_private_pbpeerstream_peerstream_proto_msgTypes[6] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -494,7 +494,7 @@ func (x *ReplicationMessage_Open) ProtoReflect() protoreflect.Message { // Deprecated: Use ReplicationMessage_Open.ProtoReflect.Descriptor instead. func (*ReplicationMessage_Open) Descriptor() ([]byte, []int) { - return file_proto_pbpeerstream_peerstream_proto_rawDescGZIP(), []int{0, 0} + return file_private_pbpeerstream_peerstream_proto_rawDescGZIP(), []int{0, 0} } func (x *ReplicationMessage_Open) GetPeerID() string { @@ -542,7 +542,7 @@ type ReplicationMessage_Request struct { func (x *ReplicationMessage_Request) Reset() { *x = ReplicationMessage_Request{} if protoimpl.UnsafeEnabled { - mi := &file_proto_pbpeerstream_peerstream_proto_msgTypes[7] + mi := &file_private_pbpeerstream_peerstream_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -555,7 +555,7 @@ func (x *ReplicationMessage_Request) String() string { func (*ReplicationMessage_Request) ProtoMessage() {} func (x *ReplicationMessage_Request) ProtoReflect() protoreflect.Message { - mi := &file_proto_pbpeerstream_peerstream_proto_msgTypes[7] + mi := &file_private_pbpeerstream_peerstream_proto_msgTypes[7] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -568,7 +568,7 @@ func (x *ReplicationMessage_Request) ProtoReflect() protoreflect.Message { // Deprecated: Use ReplicationMessage_Request.ProtoReflect.Descriptor instead. func (*ReplicationMessage_Request) Descriptor() ([]byte, []int) { - return file_proto_pbpeerstream_peerstream_proto_rawDescGZIP(), []int{0, 1} + return file_private_pbpeerstream_peerstream_proto_rawDescGZIP(), []int{0, 1} } func (x *ReplicationMessage_Request) GetPeerID() string { @@ -621,7 +621,7 @@ type ReplicationMessage_Response struct { func (x *ReplicationMessage_Response) Reset() { *x = ReplicationMessage_Response{} if protoimpl.UnsafeEnabled { - mi := &file_proto_pbpeerstream_peerstream_proto_msgTypes[8] + mi := &file_private_pbpeerstream_peerstream_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -634,7 +634,7 @@ func (x *ReplicationMessage_Response) String() string { func (*ReplicationMessage_Response) ProtoMessage() {} func (x *ReplicationMessage_Response) ProtoReflect() protoreflect.Message { - mi := &file_proto_pbpeerstream_peerstream_proto_msgTypes[8] + mi := &file_private_pbpeerstream_peerstream_proto_msgTypes[8] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -647,7 +647,7 @@ func (x *ReplicationMessage_Response) ProtoReflect() protoreflect.Message { // Deprecated: Use ReplicationMessage_Response.ProtoReflect.Descriptor instead. func (*ReplicationMessage_Response) Descriptor() ([]byte, []int) { - return file_proto_pbpeerstream_peerstream_proto_rawDescGZIP(), []int{0, 2} + return file_private_pbpeerstream_peerstream_proto_rawDescGZIP(), []int{0, 2} } func (x *ReplicationMessage_Response) GetNonce() string { @@ -696,7 +696,7 @@ type ReplicationMessage_Terminated struct { func (x *ReplicationMessage_Terminated) Reset() { *x = ReplicationMessage_Terminated{} if protoimpl.UnsafeEnabled { - mi := &file_proto_pbpeerstream_peerstream_proto_msgTypes[9] + mi := &file_private_pbpeerstream_peerstream_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -709,7 +709,7 @@ func (x *ReplicationMessage_Terminated) String() string { func (*ReplicationMessage_Terminated) ProtoMessage() {} func (x *ReplicationMessage_Terminated) ProtoReflect() protoreflect.Message { - mi := &file_proto_pbpeerstream_peerstream_proto_msgTypes[9] + mi := &file_private_pbpeerstream_peerstream_proto_msgTypes[9] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -722,7 +722,7 @@ func (x *ReplicationMessage_Terminated) ProtoReflect() protoreflect.Message { // Deprecated: Use ReplicationMessage_Terminated.ProtoReflect.Descriptor instead. func (*ReplicationMessage_Terminated) Descriptor() ([]byte, []int) { - return file_proto_pbpeerstream_peerstream_proto_rawDescGZIP(), []int{0, 3} + return file_private_pbpeerstream_peerstream_proto_rawDescGZIP(), []int{0, 3} } // Heartbeat is sent to verify that the connection is still active. @@ -735,7 +735,7 @@ type ReplicationMessage_Heartbeat struct { func (x *ReplicationMessage_Heartbeat) Reset() { *x = ReplicationMessage_Heartbeat{} if protoimpl.UnsafeEnabled { - mi := &file_proto_pbpeerstream_peerstream_proto_msgTypes[10] + mi := &file_private_pbpeerstream_peerstream_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -748,7 +748,7 @@ func (x *ReplicationMessage_Heartbeat) String() string { func (*ReplicationMessage_Heartbeat) ProtoMessage() {} func (x *ReplicationMessage_Heartbeat) ProtoReflect() protoreflect.Message { - mi := &file_proto_pbpeerstream_peerstream_proto_msgTypes[10] + mi := &file_private_pbpeerstream_peerstream_proto_msgTypes[10] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -761,177 +761,177 @@ func (x *ReplicationMessage_Heartbeat) ProtoReflect() protoreflect.Message { // Deprecated: Use ReplicationMessage_Heartbeat.ProtoReflect.Descriptor instead. func (*ReplicationMessage_Heartbeat) Descriptor() ([]byte, []int) { - return file_proto_pbpeerstream_peerstream_proto_rawDescGZIP(), []int{0, 4} -} - -var File_proto_pbpeerstream_peerstream_proto protoreflect.FileDescriptor - -var file_proto_pbpeerstream_peerstream_proto_rawDesc = []byte{ - 0x0a, 0x23, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x70, 0x62, 0x70, 0x65, 0x65, 0x72, 0x73, 0x74, - 0x72, 0x65, 0x61, 0x6d, 0x2f, 0x70, 0x65, 0x65, 0x72, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x24, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, - 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, - 0x2e, 0x70, 0x65, 0x65, 0x72, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x1a, 0x19, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x61, 0x6e, 0x79, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x32, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2d, 0x70, 0x75, - 0x62, 0x6c, 0x69, 0x63, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x2f, 0x72, 0x61, 0x74, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x2f, 0x72, 0x61, 0x74, 0x65, 0x6c, - 0x69, 0x6d, 0x69, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1d, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x2f, 0x70, 0x62, 0x70, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x2f, 0x70, 0x65, 0x65, 0x72, - 0x69, 0x6e, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1a, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x2f, 0x70, 0x62, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2f, 0x6e, 0x6f, 0x64, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1b, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x70, 0x62, 0x73, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x22, 0xbb, 0x08, 0x0a, 0x12, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x53, 0x0a, 0x04, 0x6f, 0x70, 0x65, - 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3d, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, - 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, - 0x6e, 0x61, 0x6c, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x2e, 0x52, - 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, - 0x65, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x48, 0x00, 0x52, 0x04, 0x6f, 0x70, 0x65, 0x6e, 0x12, 0x5c, - 0x0a, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x40, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, - 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x70, 0x65, 0x65, 0x72, - 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x48, 0x00, 0x52, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x5f, 0x0a, 0x08, - 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x41, + return file_private_pbpeerstream_peerstream_proto_rawDescGZIP(), []int{0, 4} +} + +var File_private_pbpeerstream_peerstream_proto protoreflect.FileDescriptor + +var file_private_pbpeerstream_peerstream_proto_rawDesc = []byte{ + 0x0a, 0x25, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2f, 0x70, 0x62, 0x70, 0x65, 0x65, 0x72, + 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x2f, 0x70, 0x65, 0x65, 0x72, 0x73, 0x74, 0x72, 0x65, 0x61, + 0x6d, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x24, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, + 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, + 0x61, 0x6c, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x1a, 0x25, 0x61, + 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x72, 0x61, 0x74, 0x65, 0x6c, + 0x69, 0x6d, 0x69, 0x74, 0x2f, 0x72, 0x61, 0x74, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x19, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x61, 0x6e, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, + 0x1f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2f, 0x70, 0x62, 0x70, 0x65, 0x65, 0x72, 0x69, + 0x6e, 0x67, 0x2f, 0x70, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x1a, 0x1c, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2f, 0x70, 0x62, 0x73, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x2f, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1d, + 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2f, 0x70, 0x62, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x2f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xbb, 0x08, + 0x0a, 0x12, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x73, + 0x73, 0x61, 0x67, 0x65, 0x12, 0x53, 0x0a, 0x04, 0x6f, 0x70, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x3d, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, + 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x70, + 0x65, 0x65, 0x72, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x4f, 0x70, 0x65, + 0x6e, 0x48, 0x00, 0x52, 0x04, 0x6f, 0x70, 0x65, 0x6e, 0x12, 0x5c, 0x0a, 0x07, 0x72, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x40, 0x2e, 0x68, 0x61, 0x73, + 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, + 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x73, 0x74, 0x72, 0x65, 0x61, + 0x6d, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x73, + 0x73, 0x61, 0x67, 0x65, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x07, + 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x5f, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x41, 0x2e, 0x68, 0x61, 0x73, 0x68, + 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, + 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, + 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x73, 0x73, + 0x61, 0x67, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x08, + 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x65, 0x0a, 0x0a, 0x74, 0x65, 0x72, 0x6d, + 0x69, 0x6e, 0x61, 0x74, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x43, 0x2e, 0x68, + 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, + 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x73, 0x74, 0x72, + 0x65, 0x61, 0x6d, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, + 0x64, 0x48, 0x00, 0x52, 0x0a, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x64, 0x12, + 0x62, 0x0a, 0x09, 0x68, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x42, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, + 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x70, + 0x65, 0x65, 0x72, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x48, 0x65, 0x61, + 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x48, 0x00, 0x52, 0x09, 0x68, 0x65, 0x61, 0x72, 0x74, 0x62, + 0x65, 0x61, 0x74, 0x1a, 0x8d, 0x01, 0x0a, 0x04, 0x4f, 0x70, 0x65, 0x6e, 0x12, 0x16, 0x0a, 0x06, + 0x50, 0x65, 0x65, 0x72, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x50, 0x65, + 0x65, 0x72, 0x49, 0x44, 0x12, 0x26, 0x0a, 0x0e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x53, 0x65, + 0x63, 0x72, 0x65, 0x74, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x53, 0x74, + 0x72, 0x65, 0x61, 0x6d, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x49, 0x44, 0x12, 0x45, 0x0a, 0x06, + 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x68, + 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, + 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, + 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x06, 0x52, 0x65, 0x6d, + 0x6f, 0x74, 0x65, 0x1a, 0xa9, 0x01, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x16, 0x0a, 0x06, 0x50, 0x65, 0x65, 0x72, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x06, 0x50, 0x65, 0x65, 0x72, 0x49, 0x44, 0x12, 0x24, 0x0a, 0x0d, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x4e, 0x6f, 0x6e, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4e, 0x6f, 0x6e, 0x63, 0x65, 0x12, 0x20, 0x0a, + 0x0b, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x55, 0x52, 0x4c, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0b, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x55, 0x52, 0x4c, 0x12, + 0x3e, 0x0a, 0x05, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, - 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x73, - 0x74, 0x72, 0x65, 0x61, 0x6d, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x48, 0x00, 0x52, 0x08, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x65, 0x0a, - 0x0a, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x43, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, - 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x70, 0x65, - 0x65, 0x72, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x54, 0x65, 0x72, 0x6d, - 0x69, 0x6e, 0x61, 0x74, 0x65, 0x64, 0x48, 0x00, 0x52, 0x0a, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, - 0x61, 0x74, 0x65, 0x64, 0x12, 0x62, 0x0a, 0x09, 0x68, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, - 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x42, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, - 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, - 0x6e, 0x61, 0x6c, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x2e, 0x52, - 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, - 0x65, 0x2e, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x48, 0x00, 0x52, 0x09, 0x68, - 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x1a, 0x8d, 0x01, 0x0a, 0x04, 0x4f, 0x70, 0x65, - 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x50, 0x65, 0x65, 0x72, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x06, 0x50, 0x65, 0x65, 0x72, 0x49, 0x44, 0x12, 0x26, 0x0a, 0x0e, 0x53, 0x74, 0x72, - 0x65, 0x61, 0x6d, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x49, - 0x44, 0x12, 0x45, 0x0a, 0x06, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x2d, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, - 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x70, 0x65, - 0x65, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, - 0x52, 0x06, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x1a, 0xa9, 0x01, 0x0a, 0x07, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x50, 0x65, 0x65, 0x72, 0x49, 0x44, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x50, 0x65, 0x65, 0x72, 0x49, 0x44, 0x12, 0x24, 0x0a, 0x0d, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4e, 0x6f, 0x6e, 0x63, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0d, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4e, 0x6f, 0x6e, + 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x05, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x1a, + 0xe3, 0x01, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, + 0x4e, 0x6f, 0x6e, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x4e, 0x6f, 0x6e, 0x63, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x55, 0x52, - 0x4c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x55, 0x52, 0x4c, 0x12, 0x3e, 0x0a, 0x05, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, - 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, - 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x05, 0x45, - 0x72, 0x72, 0x6f, 0x72, 0x1a, 0xe3, 0x01, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x14, 0x0a, 0x05, 0x4e, 0x6f, 0x6e, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x4e, 0x6f, 0x6e, 0x63, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x52, 0x65, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x55, 0x52, 0x4c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x52, 0x65, - 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x55, 0x52, 0x4c, 0x12, 0x1e, 0x0a, 0x0a, 0x52, 0x65, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x44, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x52, - 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x44, 0x12, 0x30, 0x0a, 0x08, 0x52, 0x65, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x41, 0x6e, - 0x79, 0x52, 0x08, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x4d, 0x0a, 0x09, 0x6f, - 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2f, - 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, - 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x73, - 0x74, 0x72, 0x65, 0x61, 0x6d, 0x2e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x09, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x0c, 0x0a, 0x0a, 0x54, 0x65, - 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x64, 0x1a, 0x0b, 0x0a, 0x09, 0x48, 0x65, 0x61, 0x72, - 0x74, 0x62, 0x65, 0x61, 0x74, 0x42, 0x09, 0x0a, 0x07, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, - 0x22, 0x29, 0x0a, 0x0d, 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, - 0x73, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x22, 0x5c, 0x0a, 0x0f, 0x45, - 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x49, - 0x0a, 0x05, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, - 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, - 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4e, 0x6f, - 0x64, 0x65, 0x52, 0x05, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x22, 0x31, 0x0a, 0x13, 0x45, 0x78, 0x70, - 0x6f, 0x72, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4c, 0x69, 0x73, 0x74, - 0x12, 0x1a, 0x0a, 0x08, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x08, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x22, 0x61, 0x0a, 0x15, - 0x45, 0x78, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x50, 0x65, 0x65, 0x72, 0x49, 0x44, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x50, 0x65, 0x65, 0x72, 0x49, 0x44, 0x12, 0x30, 0x0a, - 0x13, 0x45, 0x73, 0x74, 0x61, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, - 0x63, 0x72, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x45, 0x73, 0x74, 0x61, - 0x62, 0x6c, 0x69, 0x73, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x22, - 0x3c, 0x0a, 0x16, 0x45, 0x78, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x53, 0x65, 0x63, 0x72, 0x65, - 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x53, 0x74, 0x72, - 0x65, 0x61, 0x6d, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0c, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x2a, 0x3c, 0x0a, - 0x09, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x19, 0x0a, 0x15, 0x4f, 0x50, - 0x45, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, - 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x14, 0x0a, 0x10, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x49, - 0x4f, 0x4e, 0x5f, 0x55, 0x50, 0x53, 0x45, 0x52, 0x54, 0x10, 0x01, 0x32, 0xbd, 0x02, 0x0a, 0x11, - 0x50, 0x65, 0x65, 0x72, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x12, 0x91, 0x01, 0x0a, 0x0f, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x73, 0x12, 0x38, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, - 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, - 0x6c, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x2e, 0x52, 0x65, 0x70, - 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x1a, - 0x38, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, - 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x70, 0x65, 0x65, 0x72, - 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x06, 0xe2, 0x86, 0x04, 0x02, 0x08, - 0x02, 0x28, 0x01, 0x30, 0x01, 0x12, 0x93, 0x01, 0x0a, 0x0e, 0x45, 0x78, 0x63, 0x68, 0x61, 0x6e, - 0x67, 0x65, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x12, 0x3b, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, + 0x4c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x55, 0x52, 0x4c, 0x12, 0x1e, 0x0a, 0x0a, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x49, 0x44, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x49, 0x44, 0x12, 0x30, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x41, 0x6e, 0x79, 0x52, 0x08, 0x52, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x4d, 0x0a, 0x09, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2f, 0x2e, 0x68, 0x61, 0x73, 0x68, + 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, + 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, + 0x2e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x09, 0x6f, 0x70, 0x65, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x0c, 0x0a, 0x0a, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, + 0x74, 0x65, 0x64, 0x1a, 0x0b, 0x0a, 0x09, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, + 0x42, 0x09, 0x0a, 0x07, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x22, 0x29, 0x0a, 0x0d, 0x4c, + 0x65, 0x61, 0x64, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x18, 0x0a, 0x07, + 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, + 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x22, 0x5c, 0x0a, 0x0f, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, + 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x49, 0x0a, 0x05, 0x4e, 0x6f, 0x64, + 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, - 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x2e, - 0x45, 0x78, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3c, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, - 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, - 0x6c, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x2e, 0x45, 0x78, 0x63, - 0x68, 0x61, 0x6e, 0x67, 0x65, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x06, 0xe2, 0x86, 0x04, 0x02, 0x08, 0x03, 0x42, 0x9f, 0x02, 0x0a, 0x28, - 0x63, 0x6f, 0x6d, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, - 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x70, 0x65, - 0x65, 0x72, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x42, 0x0f, 0x50, 0x65, 0x65, 0x72, 0x73, 0x74, - 0x72, 0x65, 0x61, 0x6d, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x2e, 0x67, 0x69, 0x74, - 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, - 0x70, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x70, - 0x62, 0x70, 0x65, 0x65, 0x72, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0xa2, 0x02, 0x04, 0x48, 0x43, - 0x49, 0x50, 0xaa, 0x02, 0x24, 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x43, - 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x50, - 0x65, 0x65, 0x72, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0xca, 0x02, 0x24, 0x48, 0x61, 0x73, 0x68, - 0x69, 0x63, 0x6f, 0x72, 0x70, 0x5c, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x5c, 0x49, 0x6e, 0x74, - 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5c, 0x50, 0x65, 0x65, 0x72, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, - 0xe2, 0x02, 0x30, 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x5c, 0x43, 0x6f, 0x6e, - 0x73, 0x75, 0x6c, 0x5c, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5c, 0x50, 0x65, 0x65, - 0x72, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, - 0x61, 0x74, 0x61, 0xea, 0x02, 0x27, 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x3a, - 0x3a, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x3a, 0x3a, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, - 0x6c, 0x3a, 0x3a, 0x50, 0x65, 0x65, 0x72, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x62, 0x06, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x43, 0x68, 0x65, + 0x63, 0x6b, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x05, 0x4e, + 0x6f, 0x64, 0x65, 0x73, 0x22, 0x31, 0x0a, 0x13, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x53, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x53, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x22, 0x61, 0x0a, 0x15, 0x45, 0x78, 0x63, 0x68, 0x61, + 0x6e, 0x67, 0x65, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x16, 0x0a, 0x06, 0x50, 0x65, 0x65, 0x72, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x06, 0x50, 0x65, 0x65, 0x72, 0x49, 0x44, 0x12, 0x30, 0x0a, 0x13, 0x45, 0x73, 0x74, 0x61, + 0x62, 0x6c, 0x69, 0x73, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x45, 0x73, 0x74, 0x61, 0x62, 0x6c, 0x69, 0x73, 0x68, + 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x22, 0x3c, 0x0a, 0x16, 0x45, 0x78, + 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x53, 0x65, + 0x63, 0x72, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x53, 0x74, 0x72, 0x65, + 0x61, 0x6d, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x2a, 0x3c, 0x0a, 0x09, 0x4f, 0x70, 0x65, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x19, 0x0a, 0x15, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x49, + 0x4f, 0x4e, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, + 0x12, 0x14, 0x0a, 0x10, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x55, 0x50, + 0x53, 0x45, 0x52, 0x54, 0x10, 0x01, 0x32, 0xbd, 0x02, 0x0a, 0x11, 0x50, 0x65, 0x65, 0x72, 0x53, + 0x74, 0x72, 0x65, 0x61, 0x6d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x91, 0x01, 0x0a, + 0x0f, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, + 0x12, 0x38, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, + 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x70, 0x65, 0x65, + 0x72, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x1a, 0x38, 0x2e, 0x68, 0x61, 0x73, + 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, + 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x73, 0x74, 0x72, 0x65, 0x61, + 0x6d, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x73, + 0x73, 0x61, 0x67, 0x65, 0x22, 0x06, 0xe2, 0x86, 0x04, 0x02, 0x08, 0x02, 0x28, 0x01, 0x30, 0x01, + 0x12, 0x93, 0x01, 0x0a, 0x0e, 0x45, 0x78, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x53, 0x65, 0x63, + 0x72, 0x65, 0x74, 0x12, 0x3b, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, + 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, + 0x70, 0x65, 0x65, 0x72, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x2e, 0x45, 0x78, 0x63, 0x68, 0x61, + 0x6e, 0x67, 0x65, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x3c, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, + 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x70, 0x65, 0x65, + 0x72, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x2e, 0x45, 0x78, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, + 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, + 0xe2, 0x86, 0x04, 0x02, 0x08, 0x03, 0x42, 0xa7, 0x02, 0x0a, 0x28, 0x63, 0x6f, 0x6d, 0x2e, 0x68, + 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, + 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x73, 0x74, 0x72, + 0x65, 0x61, 0x6d, 0x42, 0x0f, 0x50, 0x65, 0x65, 0x72, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x50, + 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x36, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, + 0x6f, 0x6d, 0x2f, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2f, 0x63, 0x6f, 0x6e, + 0x73, 0x75, 0x6c, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, + 0x65, 0x2f, 0x70, 0x62, 0x70, 0x65, 0x65, 0x72, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0xa2, 0x02, + 0x04, 0x48, 0x43, 0x49, 0x50, 0xaa, 0x02, 0x24, 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, + 0x70, 0x2e, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, + 0x6c, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0xca, 0x02, 0x24, 0x48, + 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x5c, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x5c, + 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5c, 0x50, 0x65, 0x65, 0x72, 0x73, 0x74, 0x72, + 0x65, 0x61, 0x6d, 0xe2, 0x02, 0x30, 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x5c, + 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x5c, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5c, + 0x50, 0x65, 0x65, 0x72, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, + 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x27, 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, + 0x72, 0x70, 0x3a, 0x3a, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x3a, 0x3a, 0x49, 0x6e, 0x74, 0x65, + 0x72, 0x6e, 0x61, 0x6c, 0x3a, 0x3a, 0x50, 0x65, 0x65, 0x72, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, + 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( - file_proto_pbpeerstream_peerstream_proto_rawDescOnce sync.Once - file_proto_pbpeerstream_peerstream_proto_rawDescData = file_proto_pbpeerstream_peerstream_proto_rawDesc + file_private_pbpeerstream_peerstream_proto_rawDescOnce sync.Once + file_private_pbpeerstream_peerstream_proto_rawDescData = file_private_pbpeerstream_peerstream_proto_rawDesc ) -func file_proto_pbpeerstream_peerstream_proto_rawDescGZIP() []byte { - file_proto_pbpeerstream_peerstream_proto_rawDescOnce.Do(func() { - file_proto_pbpeerstream_peerstream_proto_rawDescData = protoimpl.X.CompressGZIP(file_proto_pbpeerstream_peerstream_proto_rawDescData) +func file_private_pbpeerstream_peerstream_proto_rawDescGZIP() []byte { + file_private_pbpeerstream_peerstream_proto_rawDescOnce.Do(func() { + file_private_pbpeerstream_peerstream_proto_rawDescData = protoimpl.X.CompressGZIP(file_private_pbpeerstream_peerstream_proto_rawDescData) }) - return file_proto_pbpeerstream_peerstream_proto_rawDescData + return file_private_pbpeerstream_peerstream_proto_rawDescData } -var file_proto_pbpeerstream_peerstream_proto_enumTypes = make([]protoimpl.EnumInfo, 1) -var file_proto_pbpeerstream_peerstream_proto_msgTypes = make([]protoimpl.MessageInfo, 11) -var file_proto_pbpeerstream_peerstream_proto_goTypes = []interface{}{ +var file_private_pbpeerstream_peerstream_proto_enumTypes = make([]protoimpl.EnumInfo, 1) +var file_private_pbpeerstream_peerstream_proto_msgTypes = make([]protoimpl.MessageInfo, 11) +var file_private_pbpeerstream_peerstream_proto_goTypes = []interface{}{ (Operation)(0), // 0: hashicorp.consul.internal.peerstream.Operation (*ReplicationMessage)(nil), // 1: hashicorp.consul.internal.peerstream.ReplicationMessage (*LeaderAddress)(nil), // 2: hashicorp.consul.internal.peerstream.LeaderAddress @@ -949,7 +949,7 @@ var file_proto_pbpeerstream_peerstream_proto_goTypes = []interface{}{ (*pbstatus.Status)(nil), // 14: hashicorp.consul.internal.status.Status (*anypb.Any)(nil), // 15: google.protobuf.Any } -var file_proto_pbpeerstream_peerstream_proto_depIdxs = []int32{ +var file_private_pbpeerstream_peerstream_proto_depIdxs = []int32{ 7, // 0: hashicorp.consul.internal.peerstream.ReplicationMessage.open:type_name -> hashicorp.consul.internal.peerstream.ReplicationMessage.Open 8, // 1: hashicorp.consul.internal.peerstream.ReplicationMessage.request:type_name -> hashicorp.consul.internal.peerstream.ReplicationMessage.Request 9, // 2: hashicorp.consul.internal.peerstream.ReplicationMessage.response:type_name -> hashicorp.consul.internal.peerstream.ReplicationMessage.Response @@ -971,13 +971,13 @@ var file_proto_pbpeerstream_peerstream_proto_depIdxs = []int32{ 0, // [0:10] is the sub-list for field type_name } -func init() { file_proto_pbpeerstream_peerstream_proto_init() } -func file_proto_pbpeerstream_peerstream_proto_init() { - if File_proto_pbpeerstream_peerstream_proto != nil { +func init() { file_private_pbpeerstream_peerstream_proto_init() } +func file_private_pbpeerstream_peerstream_proto_init() { + if File_private_pbpeerstream_peerstream_proto != nil { return } if !protoimpl.UnsafeEnabled { - file_proto_pbpeerstream_peerstream_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + file_private_pbpeerstream_peerstream_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ReplicationMessage); i { case 0: return &v.state @@ -989,7 +989,7 @@ func file_proto_pbpeerstream_peerstream_proto_init() { return nil } } - file_proto_pbpeerstream_peerstream_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + file_private_pbpeerstream_peerstream_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*LeaderAddress); i { case 0: return &v.state @@ -1001,7 +1001,7 @@ func file_proto_pbpeerstream_peerstream_proto_init() { return nil } } - file_proto_pbpeerstream_peerstream_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + file_private_pbpeerstream_peerstream_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ExportedService); i { case 0: return &v.state @@ -1013,7 +1013,7 @@ func file_proto_pbpeerstream_peerstream_proto_init() { return nil } } - file_proto_pbpeerstream_peerstream_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + file_private_pbpeerstream_peerstream_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ExportedServiceList); i { case 0: return &v.state @@ -1025,7 +1025,7 @@ func file_proto_pbpeerstream_peerstream_proto_init() { return nil } } - file_proto_pbpeerstream_peerstream_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + file_private_pbpeerstream_peerstream_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ExchangeSecretRequest); i { case 0: return &v.state @@ -1037,7 +1037,7 @@ func file_proto_pbpeerstream_peerstream_proto_init() { return nil } } - file_proto_pbpeerstream_peerstream_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + file_private_pbpeerstream_peerstream_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ExchangeSecretResponse); i { case 0: return &v.state @@ -1049,7 +1049,7 @@ func file_proto_pbpeerstream_peerstream_proto_init() { return nil } } - file_proto_pbpeerstream_peerstream_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { + file_private_pbpeerstream_peerstream_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ReplicationMessage_Open); i { case 0: return &v.state @@ -1061,7 +1061,7 @@ func file_proto_pbpeerstream_peerstream_proto_init() { return nil } } - file_proto_pbpeerstream_peerstream_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { + file_private_pbpeerstream_peerstream_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ReplicationMessage_Request); i { case 0: return &v.state @@ -1073,7 +1073,7 @@ func file_proto_pbpeerstream_peerstream_proto_init() { return nil } } - file_proto_pbpeerstream_peerstream_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { + file_private_pbpeerstream_peerstream_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ReplicationMessage_Response); i { case 0: return &v.state @@ -1085,7 +1085,7 @@ func file_proto_pbpeerstream_peerstream_proto_init() { return nil } } - file_proto_pbpeerstream_peerstream_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { + file_private_pbpeerstream_peerstream_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ReplicationMessage_Terminated); i { case 0: return &v.state @@ -1097,7 +1097,7 @@ func file_proto_pbpeerstream_peerstream_proto_init() { return nil } } - file_proto_pbpeerstream_peerstream_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { + file_private_pbpeerstream_peerstream_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ReplicationMessage_Heartbeat); i { case 0: return &v.state @@ -1110,7 +1110,7 @@ func file_proto_pbpeerstream_peerstream_proto_init() { } } } - file_proto_pbpeerstream_peerstream_proto_msgTypes[0].OneofWrappers = []interface{}{ + file_private_pbpeerstream_peerstream_proto_msgTypes[0].OneofWrappers = []interface{}{ (*ReplicationMessage_Open_)(nil), (*ReplicationMessage_Request_)(nil), (*ReplicationMessage_Response_)(nil), @@ -1121,19 +1121,19 @@ func file_proto_pbpeerstream_peerstream_proto_init() { out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_proto_pbpeerstream_peerstream_proto_rawDesc, + RawDescriptor: file_private_pbpeerstream_peerstream_proto_rawDesc, NumEnums: 1, NumMessages: 11, NumExtensions: 0, NumServices: 1, }, - GoTypes: file_proto_pbpeerstream_peerstream_proto_goTypes, - DependencyIndexes: file_proto_pbpeerstream_peerstream_proto_depIdxs, - EnumInfos: file_proto_pbpeerstream_peerstream_proto_enumTypes, - MessageInfos: file_proto_pbpeerstream_peerstream_proto_msgTypes, + GoTypes: file_private_pbpeerstream_peerstream_proto_goTypes, + DependencyIndexes: file_private_pbpeerstream_peerstream_proto_depIdxs, + EnumInfos: file_private_pbpeerstream_peerstream_proto_enumTypes, + MessageInfos: file_private_pbpeerstream_peerstream_proto_msgTypes, }.Build() - File_proto_pbpeerstream_peerstream_proto = out.File - file_proto_pbpeerstream_peerstream_proto_rawDesc = nil - file_proto_pbpeerstream_peerstream_proto_goTypes = nil - file_proto_pbpeerstream_peerstream_proto_depIdxs = nil + File_private_pbpeerstream_peerstream_proto = out.File + file_private_pbpeerstream_peerstream_proto_rawDesc = nil + file_private_pbpeerstream_peerstream_proto_goTypes = nil + file_private_pbpeerstream_peerstream_proto_depIdxs = nil } diff --git a/proto/pbpeerstream/peerstream.proto b/proto/private/pbpeerstream/peerstream.proto similarity index 92% rename from proto/pbpeerstream/peerstream.proto rename to proto/private/pbpeerstream/peerstream.proto index 4bdcb27267d..9dc4885d4b5 100644 --- a/proto/pbpeerstream/peerstream.proto +++ b/proto/private/pbpeerstream/peerstream.proto @@ -2,12 +2,12 @@ syntax = "proto3"; package hashicorp.consul.internal.peerstream; +import "annotations/ratelimit/ratelimit.proto"; import "google/protobuf/any.proto"; -import "proto-public/annotations/ratelimit/ratelimit.proto"; -import "proto/pbpeering/peering.proto"; -import "proto/pbservice/node.proto"; +import "private/pbpeering/peering.proto"; +import "private/pbservice/node.proto"; // TODO(peering): Handle this some other way -import "proto/pbstatus/status.proto"; +import "private/pbstatus/status.proto"; // TODO(peering): comments @@ -20,17 +20,13 @@ service PeerStreamService { // buf:lint:ignore RPC_RESPONSE_STANDARD_NAME // buf:lint:ignore RPC_REQUEST_RESPONSE_UNIQUE rpc StreamResources(stream ReplicationMessage) returns (stream ReplicationMessage) { - option (hashicorp.consul.internal.ratelimit.spec) = { - operation_type: OPERATION_TYPE_READ, - }; + option (hashicorp.consul.internal.ratelimit.spec) = {operation_type: OPERATION_TYPE_READ}; } // ExchangeSecret is a unary RPC for exchanging the one-time establishment secret // for a long-lived stream secret. rpc ExchangeSecret(ExchangeSecretRequest) returns (ExchangeSecretResponse) { - option (hashicorp.consul.internal.ratelimit.spec) = { - operation_type: OPERATION_TYPE_WRITE, - }; + option (hashicorp.consul.internal.ratelimit.spec) = {operation_type: OPERATION_TYPE_WRITE}; } } diff --git a/proto/pbpeerstream/peerstream_grpc.pb.go b/proto/private/pbpeerstream/peerstream_grpc.pb.go similarity index 98% rename from proto/pbpeerstream/peerstream_grpc.pb.go rename to proto/private/pbpeerstream/peerstream_grpc.pb.go index dc513f44b19..cdd3d869414 100644 --- a/proto/pbpeerstream/peerstream_grpc.pb.go +++ b/proto/private/pbpeerstream/peerstream_grpc.pb.go @@ -2,7 +2,7 @@ // versions: // - protoc-gen-go-grpc v1.2.0 // - protoc (unknown) -// source: proto/pbpeerstream/peerstream.proto +// source: private/pbpeerstream/peerstream.proto package pbpeerstream @@ -182,5 +182,5 @@ var PeerStreamService_ServiceDesc = grpc.ServiceDesc{ ClientStreams: true, }, }, - Metadata: "proto/pbpeerstream/peerstream.proto", + Metadata: "private/pbpeerstream/peerstream.proto", } diff --git a/proto/pbpeerstream/types.go b/proto/private/pbpeerstream/types.go similarity index 100% rename from proto/pbpeerstream/types.go rename to proto/private/pbpeerstream/types.go diff --git a/proto/pbservice/convert.go b/proto/private/pbservice/convert.go similarity index 99% rename from proto/pbservice/convert.go rename to proto/private/pbservice/convert.go index 167a12148cb..8e42e3758bd 100644 --- a/proto/pbservice/convert.go +++ b/proto/private/pbservice/convert.go @@ -2,7 +2,7 @@ package pbservice import ( "github.com/hashicorp/consul/agent/structs" - "github.com/hashicorp/consul/proto/pbcommon" + "github.com/hashicorp/consul/proto/private/pbcommon" "github.com/hashicorp/consul/types" ) diff --git a/proto/pbservice/convert_oss.go b/proto/private/pbservice/convert_oss.go similarity index 86% rename from proto/pbservice/convert_oss.go rename to proto/private/pbservice/convert_oss.go index 5ecd2f7f455..fd4a1bfd5b8 100644 --- a/proto/pbservice/convert_oss.go +++ b/proto/private/pbservice/convert_oss.go @@ -5,7 +5,7 @@ package pbservice import ( "github.com/hashicorp/consul/acl" - "github.com/hashicorp/consul/proto/pbcommon" + "github.com/hashicorp/consul/proto/private/pbcommon" ) func EnterpriseMetaToStructs(_ *pbcommon.EnterpriseMeta) acl.EnterpriseMeta { diff --git a/proto/pbservice/convert_oss_test.go b/proto/private/pbservice/convert_oss_test.go similarity index 100% rename from proto/pbservice/convert_oss_test.go rename to proto/private/pbservice/convert_oss_test.go diff --git a/proto/pbservice/convert_test.go b/proto/private/pbservice/convert_test.go similarity index 100% rename from proto/pbservice/convert_test.go rename to proto/private/pbservice/convert_test.go diff --git a/proto/pbservice/healthcheck.gen.go b/proto/private/pbservice/healthcheck.gen.go similarity index 100% rename from proto/pbservice/healthcheck.gen.go rename to proto/private/pbservice/healthcheck.gen.go diff --git a/proto/pbservice/healthcheck.pb.binary.go b/proto/private/pbservice/healthcheck.pb.binary.go similarity index 96% rename from proto/pbservice/healthcheck.pb.binary.go rename to proto/private/pbservice/healthcheck.pb.binary.go index 6971555ee00..b820f1da331 100644 --- a/proto/pbservice/healthcheck.pb.binary.go +++ b/proto/private/pbservice/healthcheck.pb.binary.go @@ -1,5 +1,5 @@ // Code generated by protoc-gen-go-binary. DO NOT EDIT. -// source: proto/pbservice/healthcheck.proto +// source: private/pbservice/healthcheck.proto package pbservice diff --git a/proto/pbservice/healthcheck.pb.go b/proto/private/pbservice/healthcheck.pb.go similarity index 56% rename from proto/pbservice/healthcheck.pb.go rename to proto/private/pbservice/healthcheck.pb.go index 31e082b8527..a8d16000e72 100644 --- a/proto/pbservice/healthcheck.pb.go +++ b/proto/private/pbservice/healthcheck.pb.go @@ -2,12 +2,12 @@ // versions: // protoc-gen-go v1.28.1 // protoc (unknown) -// source: proto/pbservice/healthcheck.proto +// source: private/pbservice/healthcheck.proto package pbservice import ( - pbcommon "github.com/hashicorp/consul/proto/pbcommon" + pbcommon "github.com/hashicorp/consul/proto/private/pbcommon" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" durationpb "google.golang.org/protobuf/types/known/durationpb" @@ -60,7 +60,7 @@ type HealthCheck struct { func (x *HealthCheck) Reset() { *x = HealthCheck{} if protoimpl.UnsafeEnabled { - mi := &file_proto_pbservice_healthcheck_proto_msgTypes[0] + mi := &file_private_pbservice_healthcheck_proto_msgTypes[0] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -73,7 +73,7 @@ func (x *HealthCheck) String() string { func (*HealthCheck) ProtoMessage() {} func (x *HealthCheck) ProtoReflect() protoreflect.Message { - mi := &file_proto_pbservice_healthcheck_proto_msgTypes[0] + mi := &file_private_pbservice_healthcheck_proto_msgTypes[0] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -86,7 +86,7 @@ func (x *HealthCheck) ProtoReflect() protoreflect.Message { // Deprecated: Use HealthCheck.ProtoReflect.Descriptor instead. func (*HealthCheck) Descriptor() ([]byte, []int) { - return file_proto_pbservice_healthcheck_proto_rawDescGZIP(), []int{0} + return file_private_pbservice_healthcheck_proto_rawDescGZIP(), []int{0} } func (x *HealthCheck) GetNode() string { @@ -219,7 +219,7 @@ type HeaderValue struct { func (x *HeaderValue) Reset() { *x = HeaderValue{} if protoimpl.UnsafeEnabled { - mi := &file_proto_pbservice_healthcheck_proto_msgTypes[1] + mi := &file_private_pbservice_healthcheck_proto_msgTypes[1] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -232,7 +232,7 @@ func (x *HeaderValue) String() string { func (*HeaderValue) ProtoMessage() {} func (x *HeaderValue) ProtoReflect() protoreflect.Message { - mi := &file_proto_pbservice_healthcheck_proto_msgTypes[1] + mi := &file_private_pbservice_healthcheck_proto_msgTypes[1] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -245,7 +245,7 @@ func (x *HeaderValue) ProtoReflect() protoreflect.Message { // Deprecated: Use HeaderValue.ProtoReflect.Descriptor instead. func (*HeaderValue) Descriptor() ([]byte, []int) { - return file_proto_pbservice_healthcheck_proto_rawDescGZIP(), []int{1} + return file_private_pbservice_healthcheck_proto_rawDescGZIP(), []int{1} } func (x *HeaderValue) GetValue() []string { @@ -302,7 +302,7 @@ type HealthCheckDefinition struct { func (x *HealthCheckDefinition) Reset() { *x = HealthCheckDefinition{} if protoimpl.UnsafeEnabled { - mi := &file_proto_pbservice_healthcheck_proto_msgTypes[2] + mi := &file_private_pbservice_healthcheck_proto_msgTypes[2] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -315,7 +315,7 @@ func (x *HealthCheckDefinition) String() string { func (*HealthCheckDefinition) ProtoMessage() {} func (x *HealthCheckDefinition) ProtoReflect() protoreflect.Message { - mi := &file_proto_pbservice_healthcheck_proto_msgTypes[2] + mi := &file_private_pbservice_healthcheck_proto_msgTypes[2] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -328,7 +328,7 @@ func (x *HealthCheckDefinition) ProtoReflect() protoreflect.Message { // Deprecated: Use HealthCheckDefinition.ProtoReflect.Descriptor instead. func (*HealthCheckDefinition) Descriptor() ([]byte, []int) { - return file_proto_pbservice_healthcheck_proto_rawDescGZIP(), []int{2} + return file_private_pbservice_healthcheck_proto_rawDescGZIP(), []int{2} } func (x *HealthCheckDefinition) GetHTTP() string { @@ -568,7 +568,7 @@ type CheckType struct { func (x *CheckType) Reset() { *x = CheckType{} if protoimpl.UnsafeEnabled { - mi := &file_proto_pbservice_healthcheck_proto_msgTypes[3] + mi := &file_private_pbservice_healthcheck_proto_msgTypes[3] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -581,7 +581,7 @@ func (x *CheckType) String() string { func (*CheckType) ProtoMessage() {} func (x *CheckType) ProtoReflect() protoreflect.Message { - mi := &file_proto_pbservice_healthcheck_proto_msgTypes[3] + mi := &file_private_pbservice_healthcheck_proto_msgTypes[3] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -594,7 +594,7 @@ func (x *CheckType) ProtoReflect() protoreflect.Message { // Deprecated: Use CheckType.ProtoReflect.Descriptor instead. func (*CheckType) Descriptor() ([]byte, []int) { - return file_proto_pbservice_healthcheck_proto_rawDescGZIP(), []int{3} + return file_private_pbservice_healthcheck_proto_rawDescGZIP(), []int{3} } func (x *CheckType) GetCheckID() string { @@ -828,242 +828,243 @@ func (x *CheckType) GetOutputMaxSize() int32 { return 0 } -var File_proto_pbservice_healthcheck_proto protoreflect.FileDescriptor - -var file_proto_pbservice_healthcheck_proto_rawDesc = []byte{ - 0x0a, 0x21, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x70, 0x62, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x2f, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x12, 0x21, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, - 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x73, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x1a, 0x1e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1b, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x70, 0x62, - 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x22, 0xfe, 0x04, 0x0a, 0x0b, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, - 0x65, 0x63, 0x6b, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x43, 0x68, 0x65, 0x63, 0x6b, - 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x49, - 0x44, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, - 0x05, 0x4e, 0x6f, 0x74, 0x65, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x4e, 0x6f, - 0x74, 0x65, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x06, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x44, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x44, 0x12, 0x20, 0x0a, 0x0b, 0x53, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x54, 0x61, 0x67, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x09, - 0x52, 0x0b, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x54, 0x61, 0x67, 0x73, 0x12, 0x12, 0x0a, - 0x04, 0x54, 0x79, 0x70, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x54, 0x79, 0x70, - 0x65, 0x12, 0x58, 0x0a, 0x0a, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, - 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, - 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, - 0x6c, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, - 0x43, 0x68, 0x65, 0x63, 0x6b, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x0a, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x49, 0x0a, 0x09, 0x52, - 0x61, 0x66, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, - 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, - 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, - 0x6e, 0x2e, 0x52, 0x61, 0x66, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x09, 0x52, 0x61, 0x66, - 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x58, 0x0a, 0x0e, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x70, - 0x72, 0x69, 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, - 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, - 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, - 0x6e, 0x2e, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, - 0x52, 0x0e, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, - 0x12, 0x20, 0x0a, 0x0b, 0x45, 0x78, 0x70, 0x6f, 0x73, 0x65, 0x64, 0x50, 0x6f, 0x72, 0x74, 0x18, - 0x0e, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x45, 0x78, 0x70, 0x6f, 0x73, 0x65, 0x64, 0x50, 0x6f, - 0x72, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x0f, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x12, 0x18, - 0x0a, 0x07, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x07, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x50, 0x65, 0x65, 0x72, - 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x11, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x50, 0x65, 0x65, 0x72, - 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x23, 0x0a, 0x0b, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x56, 0x61, - 0x6c, 0x75, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x05, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x92, 0x08, 0x0a, 0x15, 0x48, 0x65, +var File_private_pbservice_healthcheck_proto protoreflect.FileDescriptor + +var file_private_pbservice_healthcheck_proto_rawDesc = []byte{ + 0x0a, 0x23, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2f, 0x70, 0x62, 0x73, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x2f, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x21, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, + 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, + 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x1a, 0x1e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1d, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, + 0x65, 0x2f, 0x70, 0x62, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, + 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xfe, 0x04, 0x0a, 0x0b, 0x48, 0x65, 0x61, 0x6c, + 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x6f, 0x64, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x43, + 0x68, 0x65, 0x63, 0x6b, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x43, 0x68, + 0x65, 0x63, 0x6b, 0x49, 0x44, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x12, 0x14, 0x0a, 0x05, 0x4e, 0x6f, 0x74, 0x65, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x4e, 0x6f, 0x74, 0x65, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x4f, 0x75, 0x74, 0x70, 0x75, + 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, + 0x1c, 0x0a, 0x09, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x44, 0x18, 0x07, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x09, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x44, 0x12, 0x20, 0x0a, + 0x0b, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x08, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0b, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, + 0x20, 0x0a, 0x0b, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x54, 0x61, 0x67, 0x73, 0x18, 0x09, + 0x20, 0x03, 0x28, 0x09, 0x52, 0x0b, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x54, 0x61, 0x67, + 0x73, 0x12, 0x12, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x58, 0x0a, 0x0a, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x68, 0x61, 0x73, 0x68, + 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, + 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x48, 0x54, 0x54, 0x50, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x48, 0x54, 0x54, 0x50, 0x12, 0x24, 0x0a, 0x0d, 0x54, 0x4c, 0x53, 0x53, 0x65, - 0x72, 0x76, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x13, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, - 0x54, 0x4c, 0x53, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x24, 0x0a, - 0x0d, 0x54, 0x4c, 0x53, 0x53, 0x6b, 0x69, 0x70, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x54, 0x4c, 0x53, 0x53, 0x6b, 0x69, 0x70, 0x56, 0x65, 0x72, - 0x69, 0x66, 0x79, 0x12, 0x5c, 0x0a, 0x06, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x03, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x44, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, - 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, - 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, - 0x65, 0x63, 0x6b, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x48, 0x65, - 0x61, 0x64, 0x65, 0x72, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x06, 0x48, 0x65, 0x61, 0x64, 0x65, - 0x72, 0x12, 0x16, 0x0a, 0x06, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x06, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x42, 0x6f, 0x64, - 0x79, 0x18, 0x12, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x42, 0x6f, 0x64, 0x79, 0x12, 0x2a, 0x0a, - 0x10, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, - 0x73, 0x18, 0x16, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, - 0x52, 0x65, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x54, 0x43, 0x50, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x54, 0x43, 0x50, 0x12, 0x10, 0x0a, 0x03, 0x55, - 0x44, 0x50, 0x18, 0x17, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x55, 0x44, 0x50, 0x12, 0x1c, 0x0a, - 0x09, 0x4f, 0x53, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x18, 0x18, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x09, 0x4f, 0x53, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x35, 0x0a, 0x08, 0x49, - 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, + 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x49, 0x0a, 0x09, 0x52, 0x61, 0x66, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x0b, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, + 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, + 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x52, 0x61, 0x66, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, + 0x09, 0x52, 0x61, 0x66, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x58, 0x0a, 0x0e, 0x45, 0x6e, + 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x18, 0x0d, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, + 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, + 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, + 0x4d, 0x65, 0x74, 0x61, 0x52, 0x0e, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, + 0x4d, 0x65, 0x74, 0x61, 0x12, 0x20, 0x0a, 0x0b, 0x45, 0x78, 0x70, 0x6f, 0x73, 0x65, 0x64, 0x50, + 0x6f, 0x72, 0x74, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x45, 0x78, 0x70, 0x6f, 0x73, + 0x65, 0x64, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, + 0x61, 0x6c, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, + 0x61, 0x6c, 0x12, 0x18, 0x0a, 0x07, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x10, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x07, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x1a, 0x0a, 0x08, + 0x50, 0x65, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x11, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x50, 0x65, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x23, 0x0a, 0x0b, 0x48, 0x65, 0x61, 0x64, + 0x65, 0x72, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x56, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x92, 0x08, + 0x0a, 0x15, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x44, 0x65, 0x66, + 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x48, 0x54, 0x54, 0x50, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x48, 0x54, 0x54, 0x50, 0x12, 0x24, 0x0a, 0x0d, 0x54, + 0x4c, 0x53, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x13, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0d, 0x54, 0x4c, 0x53, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x4e, 0x61, 0x6d, + 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x54, 0x4c, 0x53, 0x53, 0x6b, 0x69, 0x70, 0x56, 0x65, 0x72, 0x69, + 0x66, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x54, 0x4c, 0x53, 0x53, 0x6b, 0x69, + 0x70, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x12, 0x5c, 0x0a, 0x06, 0x48, 0x65, 0x61, 0x64, 0x65, + 0x72, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x44, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, + 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, + 0x6e, 0x61, 0x6c, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x48, 0x65, 0x61, 0x6c, + 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, + 0x6e, 0x2e, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x06, 0x48, + 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, 0x12, 0x0a, + 0x04, 0x42, 0x6f, 0x64, 0x79, 0x18, 0x12, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x42, 0x6f, 0x64, + 0x79, 0x12, 0x2a, 0x0a, 0x10, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x64, 0x69, + 0x72, 0x65, 0x63, 0x74, 0x73, 0x18, 0x16, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x44, 0x69, 0x73, + 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x73, 0x12, 0x10, 0x0a, + 0x03, 0x54, 0x43, 0x50, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x54, 0x43, 0x50, 0x12, + 0x10, 0x0a, 0x03, 0x55, 0x44, 0x50, 0x18, 0x17, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x55, 0x44, + 0x50, 0x12, 0x1c, 0x0a, 0x09, 0x4f, 0x53, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x18, 0x18, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x4f, 0x53, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, + 0x35, 0x0a, 0x08, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x06, 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, 0x52, 0x08, 0x49, 0x6e, + 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x12, 0x24, 0x0a, 0x0d, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, + 0x4d, 0x61, 0x78, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0d, 0x4f, + 0x75, 0x74, 0x70, 0x75, 0x74, 0x4d, 0x61, 0x78, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x33, 0x0a, 0x07, + 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x07, 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, 0x52, 0x08, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, - 0x61, 0x6c, 0x12, 0x24, 0x0a, 0x0d, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x4d, 0x61, 0x78, 0x53, - 0x69, 0x7a, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0d, 0x4f, 0x75, 0x74, 0x70, 0x75, - 0x74, 0x4d, 0x61, 0x78, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x33, 0x0a, 0x07, 0x54, 0x69, 0x6d, 0x65, - 0x6f, 0x75, 0x74, 0x18, 0x07, 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, 0x52, 0x07, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x61, 0x0a, - 0x1e, 0x44, 0x65, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x43, 0x72, 0x69, 0x74, 0x69, - 0x63, 0x61, 0x6c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x41, 0x66, 0x74, 0x65, 0x72, 0x18, - 0x08, 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, - 0x52, 0x1e, 0x44, 0x65, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x43, 0x72, 0x69, 0x74, - 0x69, 0x63, 0x61, 0x6c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x41, 0x66, 0x74, 0x65, 0x72, - 0x12, 0x1e, 0x0a, 0x0a, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x41, 0x72, 0x67, 0x73, 0x18, 0x0a, - 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x41, 0x72, 0x67, 0x73, - 0x12, 0x2c, 0x0a, 0x11, 0x44, 0x6f, 0x63, 0x6b, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, - 0x6e, 0x65, 0x72, 0x49, 0x44, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x44, 0x6f, 0x63, - 0x6b, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x49, 0x44, 0x12, 0x14, - 0x0a, 0x05, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x53, - 0x68, 0x65, 0x6c, 0x6c, 0x12, 0x16, 0x0a, 0x06, 0x48, 0x32, 0x50, 0x49, 0x4e, 0x47, 0x18, 0x14, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x48, 0x32, 0x50, 0x49, 0x4e, 0x47, 0x12, 0x22, 0x0a, 0x0c, - 0x48, 0x32, 0x50, 0x69, 0x6e, 0x67, 0x55, 0x73, 0x65, 0x54, 0x4c, 0x53, 0x18, 0x15, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x0c, 0x48, 0x32, 0x50, 0x69, 0x6e, 0x67, 0x55, 0x73, 0x65, 0x54, 0x4c, 0x53, - 0x12, 0x12, 0x0a, 0x04, 0x47, 0x52, 0x50, 0x43, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x47, 0x52, 0x50, 0x43, 0x12, 0x1e, 0x0a, 0x0a, 0x47, 0x52, 0x50, 0x43, 0x55, 0x73, 0x65, 0x54, - 0x4c, 0x53, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x47, 0x52, 0x50, 0x43, 0x55, 0x73, - 0x65, 0x54, 0x4c, 0x53, 0x12, 0x1c, 0x0a, 0x09, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x4e, 0x6f, 0x64, - 0x65, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x4e, 0x6f, - 0x64, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x2b, 0x0a, 0x03, 0x54, 0x54, 0x4c, 0x18, 0x11, 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, 0x52, 0x03, - 0x54, 0x54, 0x4c, 0x1a, 0x69, 0x0a, 0x0b, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x03, 0x6b, 0x65, 0x79, 0x12, 0x44, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, - 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, - 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x56, 0x61, - 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xb4, - 0x0a, 0x0a, 0x09, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x54, 0x79, 0x70, 0x65, 0x12, 0x18, 0x0a, 0x07, - 0x43, 0x68, 0x65, 0x63, 0x6b, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x43, - 0x68, 0x65, 0x63, 0x6b, 0x49, 0x44, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x4e, 0x6f, 0x74, 0x65, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x4e, 0x6f, 0x74, 0x65, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x53, 0x63, 0x72, 0x69, - 0x70, 0x74, 0x41, 0x72, 0x67, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x53, 0x63, - 0x72, 0x69, 0x70, 0x74, 0x41, 0x72, 0x67, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x48, 0x54, 0x54, 0x50, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x48, 0x54, 0x54, 0x50, 0x12, 0x50, 0x0a, 0x06, - 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x14, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x68, - 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, - 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x54, 0x79, 0x70, 0x65, 0x2e, 0x48, 0x65, 0x61, 0x64, 0x65, - 0x72, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x06, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x16, - 0x0a, 0x06, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, - 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x42, 0x6f, 0x64, 0x79, 0x18, 0x1a, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x42, 0x6f, 0x64, 0x79, 0x12, 0x2a, 0x0a, 0x10, 0x44, 0x69, - 0x73, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x73, 0x18, 0x1f, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x64, - 0x69, 0x72, 0x65, 0x63, 0x74, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x54, 0x43, 0x50, 0x18, 0x08, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x03, 0x54, 0x43, 0x50, 0x12, 0x10, 0x0a, 0x03, 0x55, 0x44, 0x50, 0x18, - 0x20, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x55, 0x44, 0x50, 0x12, 0x1c, 0x0a, 0x09, 0x4f, 0x53, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x18, 0x21, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x4f, - 0x53, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x35, 0x0a, 0x08, 0x49, 0x6e, 0x74, 0x65, - 0x72, 0x76, 0x61, 0x6c, 0x18, 0x09, 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, 0x52, 0x08, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x12, - 0x1c, 0x0a, 0x09, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x4e, 0x6f, 0x64, 0x65, 0x18, 0x0a, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x09, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x22, 0x0a, - 0x0c, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x18, 0x0b, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0c, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x12, 0x2c, 0x0a, 0x11, 0x44, 0x6f, 0x63, 0x6b, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x74, 0x61, - 0x69, 0x6e, 0x65, 0x72, 0x49, 0x44, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x44, 0x6f, - 0x63, 0x6b, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x49, 0x44, 0x12, - 0x14, 0x0a, 0x05, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x12, 0x16, 0x0a, 0x06, 0x48, 0x32, 0x50, 0x49, 0x4e, 0x47, 0x18, - 0x1c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x48, 0x32, 0x50, 0x49, 0x4e, 0x47, 0x12, 0x22, 0x0a, - 0x0c, 0x48, 0x32, 0x50, 0x69, 0x6e, 0x67, 0x55, 0x73, 0x65, 0x54, 0x4c, 0x53, 0x18, 0x1e, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x0c, 0x48, 0x32, 0x50, 0x69, 0x6e, 0x67, 0x55, 0x73, 0x65, 0x54, 0x4c, - 0x53, 0x12, 0x12, 0x0a, 0x04, 0x47, 0x52, 0x50, 0x43, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x47, 0x52, 0x50, 0x43, 0x12, 0x1e, 0x0a, 0x0a, 0x47, 0x52, 0x50, 0x43, 0x55, 0x73, 0x65, - 0x54, 0x4c, 0x53, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x47, 0x52, 0x50, 0x43, 0x55, - 0x73, 0x65, 0x54, 0x4c, 0x53, 0x12, 0x24, 0x0a, 0x0d, 0x54, 0x4c, 0x53, 0x53, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x54, 0x4c, - 0x53, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x54, - 0x4c, 0x53, 0x53, 0x6b, 0x69, 0x70, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x18, 0x10, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x0d, 0x54, 0x4c, 0x53, 0x53, 0x6b, 0x69, 0x70, 0x56, 0x65, 0x72, 0x69, 0x66, - 0x79, 0x12, 0x33, 0x0a, 0x07, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x11, 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, 0x52, 0x07, 0x54, - 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x2b, 0x0a, 0x03, 0x54, 0x54, 0x4c, 0x18, 0x12, 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, 0x52, 0x03, - 0x54, 0x54, 0x4c, 0x12, 0x32, 0x0a, 0x14, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x42, 0x65, - 0x66, 0x6f, 0x72, 0x65, 0x50, 0x61, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x18, 0x15, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x14, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x42, 0x65, 0x66, 0x6f, 0x72, 0x65, - 0x50, 0x61, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x12, 0x34, 0x0a, 0x15, 0x46, 0x61, 0x69, 0x6c, 0x75, - 0x72, 0x65, 0x73, 0x42, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x57, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, - 0x18, 0x1d, 0x20, 0x01, 0x28, 0x05, 0x52, 0x15, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x73, - 0x42, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x57, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x12, 0x36, 0x0a, - 0x16, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x73, 0x42, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x43, - 0x72, 0x69, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x18, 0x16, 0x20, 0x01, 0x28, 0x05, 0x52, 0x16, 0x46, - 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x73, 0x42, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x43, 0x72, 0x69, - 0x74, 0x69, 0x63, 0x61, 0x6c, 0x12, 0x1c, 0x0a, 0x09, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x48, 0x54, - 0x54, 0x50, 0x18, 0x17, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x48, - 0x54, 0x54, 0x50, 0x12, 0x1c, 0x0a, 0x09, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x47, 0x52, 0x50, 0x43, - 0x18, 0x18, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x47, 0x52, 0x50, - 0x43, 0x12, 0x61, 0x0a, 0x1e, 0x44, 0x65, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x43, + 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, + 0x74, 0x12, 0x61, 0x0a, 0x1e, 0x44, 0x65, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x43, 0x72, 0x69, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x41, 0x66, - 0x74, 0x65, 0x72, 0x18, 0x13, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x74, 0x65, 0x72, 0x18, 0x08, 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, 0x52, 0x1e, 0x44, 0x65, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x43, 0x72, 0x69, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x41, - 0x66, 0x74, 0x65, 0x72, 0x12, 0x24, 0x0a, 0x0d, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x4d, 0x61, - 0x78, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x19, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x4f, 0x75, 0x74, - 0x70, 0x75, 0x74, 0x4d, 0x61, 0x78, 0x53, 0x69, 0x7a, 0x65, 0x1a, 0x69, 0x0a, 0x0b, 0x48, 0x65, - 0x61, 0x64, 0x65, 0x72, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x44, 0x0a, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x68, 0x61, 0x73, - 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, - 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x48, - 0x65, 0x61, 0x64, 0x65, 0x72, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x3a, 0x02, 0x38, 0x01, 0x42, 0x8e, 0x02, 0x0a, 0x25, 0x63, 0x6f, 0x6d, 0x2e, 0x68, 0x61, - 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, - 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x42, - 0x10, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x50, 0x72, 0x6f, 0x74, - 0x6f, 0x50, 0x01, 0x5a, 0x2b, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, - 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, - 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x70, 0x62, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0xa2, 0x02, 0x04, 0x48, 0x43, 0x49, 0x53, 0xaa, 0x02, 0x21, 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, - 0x6f, 0x72, 0x70, 0x2e, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x72, - 0x6e, 0x61, 0x6c, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0xca, 0x02, 0x21, 0x48, 0x61, + 0x66, 0x74, 0x65, 0x72, 0x12, 0x1e, 0x0a, 0x0a, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x41, 0x72, + 0x67, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x41, 0x72, 0x67, 0x73, 0x12, 0x2c, 0x0a, 0x11, 0x44, 0x6f, 0x63, 0x6b, 0x65, 0x72, 0x43, 0x6f, + 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x49, 0x44, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x11, 0x44, 0x6f, 0x63, 0x6b, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, + 0x49, 0x44, 0x12, 0x14, 0x0a, 0x05, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x18, 0x0c, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x12, 0x16, 0x0a, 0x06, 0x48, 0x32, 0x50, 0x49, + 0x4e, 0x47, 0x18, 0x14, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x48, 0x32, 0x50, 0x49, 0x4e, 0x47, + 0x12, 0x22, 0x0a, 0x0c, 0x48, 0x32, 0x50, 0x69, 0x6e, 0x67, 0x55, 0x73, 0x65, 0x54, 0x4c, 0x53, + 0x18, 0x15, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x48, 0x32, 0x50, 0x69, 0x6e, 0x67, 0x55, 0x73, + 0x65, 0x54, 0x4c, 0x53, 0x12, 0x12, 0x0a, 0x04, 0x47, 0x52, 0x50, 0x43, 0x18, 0x0d, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x47, 0x52, 0x50, 0x43, 0x12, 0x1e, 0x0a, 0x0a, 0x47, 0x52, 0x50, 0x43, + 0x55, 0x73, 0x65, 0x54, 0x4c, 0x53, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x47, 0x52, + 0x50, 0x43, 0x55, 0x73, 0x65, 0x54, 0x4c, 0x53, 0x12, 0x1c, 0x0a, 0x09, 0x41, 0x6c, 0x69, 0x61, + 0x73, 0x4e, 0x6f, 0x64, 0x65, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x41, 0x6c, 0x69, + 0x61, 0x73, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x53, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x41, 0x6c, + 0x69, 0x61, 0x73, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x2b, 0x0a, 0x03, 0x54, 0x54, + 0x4c, 0x18, 0x11, 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, 0x52, 0x03, 0x54, 0x54, 0x4c, 0x1a, 0x69, 0x0a, 0x0b, 0x48, 0x65, 0x61, 0x64, 0x65, + 0x72, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x44, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, + 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, + 0x6e, 0x61, 0x6c, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x48, 0x65, 0x61, 0x64, + 0x65, 0x72, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, + 0x38, 0x01, 0x22, 0xb4, 0x0a, 0x0a, 0x09, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x54, 0x79, 0x70, 0x65, + 0x12, 0x18, 0x0a, 0x07, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x07, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x49, 0x44, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, + 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x16, + 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x4e, 0x6f, 0x74, 0x65, 0x73, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x4e, 0x6f, 0x74, 0x65, 0x73, 0x12, 0x1e, 0x0a, 0x0a, + 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x41, 0x72, 0x67, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, + 0x52, 0x0a, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x41, 0x72, 0x67, 0x73, 0x12, 0x12, 0x0a, 0x04, + 0x48, 0x54, 0x54, 0x50, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x48, 0x54, 0x54, 0x50, + 0x12, 0x50, 0x0a, 0x06, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x14, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x38, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, + 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x73, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x54, 0x79, 0x70, 0x65, 0x2e, 0x48, + 0x65, 0x61, 0x64, 0x65, 0x72, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x06, 0x48, 0x65, 0x61, 0x64, + 0x65, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x18, 0x07, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x06, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x42, 0x6f, + 0x64, 0x79, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x42, 0x6f, 0x64, 0x79, 0x12, 0x2a, + 0x0a, 0x10, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x64, 0x69, 0x72, 0x65, 0x63, + 0x74, 0x73, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, + 0x65, 0x52, 0x65, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x54, 0x43, + 0x50, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x54, 0x43, 0x50, 0x12, 0x10, 0x0a, 0x03, + 0x55, 0x44, 0x50, 0x18, 0x20, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x55, 0x44, 0x50, 0x12, 0x1c, + 0x0a, 0x09, 0x4f, 0x53, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x18, 0x21, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x09, 0x4f, 0x53, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x35, 0x0a, 0x08, + 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x09, 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, 0x52, 0x08, 0x49, 0x6e, 0x74, 0x65, 0x72, + 0x76, 0x61, 0x6c, 0x12, 0x1c, 0x0a, 0x09, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x4e, 0x6f, 0x64, 0x65, + 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x4e, 0x6f, 0x64, + 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x53, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x2c, 0x0a, 0x11, 0x44, 0x6f, 0x63, 0x6b, 0x65, 0x72, 0x43, + 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x49, 0x44, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x11, 0x44, 0x6f, 0x63, 0x6b, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, + 0x72, 0x49, 0x44, 0x12, 0x14, 0x0a, 0x05, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x18, 0x0d, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x12, 0x16, 0x0a, 0x06, 0x48, 0x32, 0x50, + 0x49, 0x4e, 0x47, 0x18, 0x1c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x48, 0x32, 0x50, 0x49, 0x4e, + 0x47, 0x12, 0x22, 0x0a, 0x0c, 0x48, 0x32, 0x50, 0x69, 0x6e, 0x67, 0x55, 0x73, 0x65, 0x54, 0x4c, + 0x53, 0x18, 0x1e, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x48, 0x32, 0x50, 0x69, 0x6e, 0x67, 0x55, + 0x73, 0x65, 0x54, 0x4c, 0x53, 0x12, 0x12, 0x0a, 0x04, 0x47, 0x52, 0x50, 0x43, 0x18, 0x0e, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x47, 0x52, 0x50, 0x43, 0x12, 0x1e, 0x0a, 0x0a, 0x47, 0x52, 0x50, + 0x43, 0x55, 0x73, 0x65, 0x54, 0x4c, 0x53, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x47, + 0x52, 0x50, 0x43, 0x55, 0x73, 0x65, 0x54, 0x4c, 0x53, 0x12, 0x24, 0x0a, 0x0d, 0x54, 0x4c, 0x53, + 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0d, 0x54, 0x4c, 0x53, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, + 0x24, 0x0a, 0x0d, 0x54, 0x4c, 0x53, 0x53, 0x6b, 0x69, 0x70, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, + 0x18, 0x10, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x54, 0x4c, 0x53, 0x53, 0x6b, 0x69, 0x70, 0x56, + 0x65, 0x72, 0x69, 0x66, 0x79, 0x12, 0x33, 0x0a, 0x07, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, + 0x18, 0x11, 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, 0x52, 0x07, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x2b, 0x0a, 0x03, 0x54, 0x54, + 0x4c, 0x18, 0x12, 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, 0x52, 0x03, 0x54, 0x54, 0x4c, 0x12, 0x32, 0x0a, 0x14, 0x53, 0x75, 0x63, 0x63, 0x65, + 0x73, 0x73, 0x42, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x50, 0x61, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x18, + 0x15, 0x20, 0x01, 0x28, 0x05, 0x52, 0x14, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x42, 0x65, + 0x66, 0x6f, 0x72, 0x65, 0x50, 0x61, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x12, 0x34, 0x0a, 0x15, 0x46, + 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x73, 0x42, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x57, 0x61, 0x72, + 0x6e, 0x69, 0x6e, 0x67, 0x18, 0x1d, 0x20, 0x01, 0x28, 0x05, 0x52, 0x15, 0x46, 0x61, 0x69, 0x6c, + 0x75, 0x72, 0x65, 0x73, 0x42, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x57, 0x61, 0x72, 0x6e, 0x69, 0x6e, + 0x67, 0x12, 0x36, 0x0a, 0x16, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x73, 0x42, 0x65, 0x66, + 0x6f, 0x72, 0x65, 0x43, 0x72, 0x69, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x18, 0x16, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x16, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x73, 0x42, 0x65, 0x66, 0x6f, 0x72, + 0x65, 0x43, 0x72, 0x69, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x12, 0x1c, 0x0a, 0x09, 0x50, 0x72, 0x6f, + 0x78, 0x79, 0x48, 0x54, 0x54, 0x50, 0x18, 0x17, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x50, 0x72, + 0x6f, 0x78, 0x79, 0x48, 0x54, 0x54, 0x50, 0x12, 0x1c, 0x0a, 0x09, 0x50, 0x72, 0x6f, 0x78, 0x79, + 0x47, 0x52, 0x50, 0x43, 0x18, 0x18, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x50, 0x72, 0x6f, 0x78, + 0x79, 0x47, 0x52, 0x50, 0x43, 0x12, 0x61, 0x0a, 0x1e, 0x44, 0x65, 0x72, 0x65, 0x67, 0x69, 0x73, + 0x74, 0x65, 0x72, 0x43, 0x72, 0x69, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x41, 0x66, 0x74, 0x65, 0x72, 0x18, 0x13, 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, 0x52, 0x1e, 0x44, 0x65, 0x72, 0x65, 0x67, 0x69, + 0x73, 0x74, 0x65, 0x72, 0x43, 0x72, 0x69, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x53, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x41, 0x66, 0x74, 0x65, 0x72, 0x12, 0x24, 0x0a, 0x0d, 0x4f, 0x75, 0x74, 0x70, + 0x75, 0x74, 0x4d, 0x61, 0x78, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x19, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x0d, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x4d, 0x61, 0x78, 0x53, 0x69, 0x7a, 0x65, 0x1a, 0x69, + 0x0a, 0x0b, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, + 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, + 0x44, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, + 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, + 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x2e, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x42, 0x96, 0x02, 0x0a, 0x25, 0x63, 0x6f, + 0x6d, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, + 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x73, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x42, 0x10, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x63, 0x68, 0x65, 0x63, 0x6b, + 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x33, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, + 0x63, 0x6f, 0x6d, 0x2f, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2f, 0x63, 0x6f, + 0x6e, 0x73, 0x75, 0x6c, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x70, 0x72, 0x69, 0x76, 0x61, + 0x74, 0x65, 0x2f, 0x70, 0x62, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0xa2, 0x02, 0x04, 0x48, + 0x43, 0x49, 0x53, 0xaa, 0x02, 0x21, 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, + 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0xca, 0x02, 0x21, 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, + 0x6f, 0x72, 0x70, 0x5c, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x5c, 0x49, 0x6e, 0x74, 0x65, 0x72, + 0x6e, 0x61, 0x6c, 0x5c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0xe2, 0x02, 0x2d, 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x5c, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x5c, 0x49, - 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0xe2, - 0x02, 0x2d, 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x5c, 0x43, 0x6f, 0x6e, 0x73, - 0x75, 0x6c, 0x5c, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5c, 0x53, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, - 0x02, 0x24, 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x3a, 0x3a, 0x43, 0x6f, 0x6e, - 0x73, 0x75, 0x6c, 0x3a, 0x3a, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x3a, 0x3a, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5c, + 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x24, 0x48, 0x61, + 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x3a, 0x3a, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x3a, + 0x3a, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x3a, 0x3a, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( - file_proto_pbservice_healthcheck_proto_rawDescOnce sync.Once - file_proto_pbservice_healthcheck_proto_rawDescData = file_proto_pbservice_healthcheck_proto_rawDesc + file_private_pbservice_healthcheck_proto_rawDescOnce sync.Once + file_private_pbservice_healthcheck_proto_rawDescData = file_private_pbservice_healthcheck_proto_rawDesc ) -func file_proto_pbservice_healthcheck_proto_rawDescGZIP() []byte { - file_proto_pbservice_healthcheck_proto_rawDescOnce.Do(func() { - file_proto_pbservice_healthcheck_proto_rawDescData = protoimpl.X.CompressGZIP(file_proto_pbservice_healthcheck_proto_rawDescData) +func file_private_pbservice_healthcheck_proto_rawDescGZIP() []byte { + file_private_pbservice_healthcheck_proto_rawDescOnce.Do(func() { + file_private_pbservice_healthcheck_proto_rawDescData = protoimpl.X.CompressGZIP(file_private_pbservice_healthcheck_proto_rawDescData) }) - return file_proto_pbservice_healthcheck_proto_rawDescData + return file_private_pbservice_healthcheck_proto_rawDescData } -var file_proto_pbservice_healthcheck_proto_msgTypes = make([]protoimpl.MessageInfo, 6) -var file_proto_pbservice_healthcheck_proto_goTypes = []interface{}{ +var file_private_pbservice_healthcheck_proto_msgTypes = make([]protoimpl.MessageInfo, 6) +var file_private_pbservice_healthcheck_proto_goTypes = []interface{}{ (*HealthCheck)(nil), // 0: hashicorp.consul.internal.service.HealthCheck (*HeaderValue)(nil), // 1: hashicorp.consul.internal.service.HeaderValue (*HealthCheckDefinition)(nil), // 2: hashicorp.consul.internal.service.HealthCheckDefinition @@ -1074,7 +1075,7 @@ var file_proto_pbservice_healthcheck_proto_goTypes = []interface{}{ (*pbcommon.EnterpriseMeta)(nil), // 7: hashicorp.consul.internal.common.EnterpriseMeta (*durationpb.Duration)(nil), // 8: google.protobuf.Duration } -var file_proto_pbservice_healthcheck_proto_depIdxs = []int32{ +var file_private_pbservice_healthcheck_proto_depIdxs = []int32{ 2, // 0: hashicorp.consul.internal.service.HealthCheck.Definition:type_name -> hashicorp.consul.internal.service.HealthCheckDefinition 6, // 1: hashicorp.consul.internal.service.HealthCheck.RaftIndex:type_name -> hashicorp.consul.internal.common.RaftIndex 7, // 2: hashicorp.consul.internal.service.HealthCheck.EnterpriseMeta:type_name -> hashicorp.consul.internal.common.EnterpriseMeta @@ -1097,13 +1098,13 @@ var file_proto_pbservice_healthcheck_proto_depIdxs = []int32{ 0, // [0:15] is the sub-list for field type_name } -func init() { file_proto_pbservice_healthcheck_proto_init() } -func file_proto_pbservice_healthcheck_proto_init() { - if File_proto_pbservice_healthcheck_proto != nil { +func init() { file_private_pbservice_healthcheck_proto_init() } +func file_private_pbservice_healthcheck_proto_init() { + if File_private_pbservice_healthcheck_proto != nil { return } if !protoimpl.UnsafeEnabled { - file_proto_pbservice_healthcheck_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + file_private_pbservice_healthcheck_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*HealthCheck); i { case 0: return &v.state @@ -1115,7 +1116,7 @@ func file_proto_pbservice_healthcheck_proto_init() { return nil } } - file_proto_pbservice_healthcheck_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + file_private_pbservice_healthcheck_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*HeaderValue); i { case 0: return &v.state @@ -1127,7 +1128,7 @@ func file_proto_pbservice_healthcheck_proto_init() { return nil } } - file_proto_pbservice_healthcheck_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + file_private_pbservice_healthcheck_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*HealthCheckDefinition); i { case 0: return &v.state @@ -1139,7 +1140,7 @@ func file_proto_pbservice_healthcheck_proto_init() { return nil } } - file_proto_pbservice_healthcheck_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + file_private_pbservice_healthcheck_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CheckType); i { case 0: return &v.state @@ -1156,18 +1157,18 @@ func file_proto_pbservice_healthcheck_proto_init() { out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_proto_pbservice_healthcheck_proto_rawDesc, + RawDescriptor: file_private_pbservice_healthcheck_proto_rawDesc, NumEnums: 0, NumMessages: 6, NumExtensions: 0, NumServices: 0, }, - GoTypes: file_proto_pbservice_healthcheck_proto_goTypes, - DependencyIndexes: file_proto_pbservice_healthcheck_proto_depIdxs, - MessageInfos: file_proto_pbservice_healthcheck_proto_msgTypes, + GoTypes: file_private_pbservice_healthcheck_proto_goTypes, + DependencyIndexes: file_private_pbservice_healthcheck_proto_depIdxs, + MessageInfos: file_private_pbservice_healthcheck_proto_msgTypes, }.Build() - File_proto_pbservice_healthcheck_proto = out.File - file_proto_pbservice_healthcheck_proto_rawDesc = nil - file_proto_pbservice_healthcheck_proto_goTypes = nil - file_proto_pbservice_healthcheck_proto_depIdxs = nil + File_private_pbservice_healthcheck_proto = out.File + file_private_pbservice_healthcheck_proto_rawDesc = nil + file_private_pbservice_healthcheck_proto_goTypes = nil + file_private_pbservice_healthcheck_proto_depIdxs = nil } diff --git a/proto/pbservice/healthcheck.proto b/proto/private/pbservice/healthcheck.proto similarity index 99% rename from proto/pbservice/healthcheck.proto rename to proto/private/pbservice/healthcheck.proto index 8e6c8766951..d85ecdc788a 100644 --- a/proto/pbservice/healthcheck.proto +++ b/proto/private/pbservice/healthcheck.proto @@ -3,7 +3,7 @@ syntax = "proto3"; package hashicorp.consul.internal.service; import "google/protobuf/duration.proto"; -import "proto/pbcommon/common.proto"; +import "private/pbcommon/common.proto"; // HealthCheck represents a single check on a given node // diff --git a/proto/pbservice/ids.go b/proto/private/pbservice/ids.go similarity index 100% rename from proto/pbservice/ids.go rename to proto/private/pbservice/ids.go diff --git a/proto/pbservice/ids_test.go b/proto/private/pbservice/ids_test.go similarity index 98% rename from proto/pbservice/ids_test.go rename to proto/private/pbservice/ids_test.go index 3c933db4b42..a20b76065a7 100644 --- a/proto/pbservice/ids_test.go +++ b/proto/private/pbservice/ids_test.go @@ -5,7 +5,7 @@ import ( "github.com/stretchr/testify/require" - "github.com/hashicorp/consul/proto/pbcommon" + "github.com/hashicorp/consul/proto/private/pbcommon" ) func TestCheckServiceNode_UniqueID(t *testing.T) { diff --git a/proto/pbservice/node.gen.go b/proto/private/pbservice/node.gen.go similarity index 100% rename from proto/pbservice/node.gen.go rename to proto/private/pbservice/node.gen.go diff --git a/proto/pbservice/node.pb.binary.go b/proto/private/pbservice/node.pb.binary.go similarity index 97% rename from proto/pbservice/node.pb.binary.go rename to proto/private/pbservice/node.pb.binary.go index feba45a1d9a..0b2c4020879 100644 --- a/proto/pbservice/node.pb.binary.go +++ b/proto/private/pbservice/node.pb.binary.go @@ -1,5 +1,5 @@ // Code generated by protoc-gen-go-binary. DO NOT EDIT. -// source: proto/pbservice/node.proto +// source: private/pbservice/node.proto package pbservice diff --git a/proto/pbservice/node.pb.go b/proto/private/pbservice/node.pb.go similarity index 59% rename from proto/pbservice/node.pb.go rename to proto/private/pbservice/node.pb.go index cebee359f56..a9c22c570f5 100644 --- a/proto/pbservice/node.pb.go +++ b/proto/private/pbservice/node.pb.go @@ -2,12 +2,12 @@ // versions: // protoc-gen-go v1.28.1 // protoc (unknown) -// source: proto/pbservice/node.proto +// source: private/pbservice/node.proto package pbservice import ( - pbcommon "github.com/hashicorp/consul/proto/pbcommon" + pbcommon "github.com/hashicorp/consul/proto/private/pbcommon" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" reflect "reflect" @@ -34,7 +34,7 @@ type IndexedCheckServiceNodes struct { func (x *IndexedCheckServiceNodes) Reset() { *x = IndexedCheckServiceNodes{} if protoimpl.UnsafeEnabled { - mi := &file_proto_pbservice_node_proto_msgTypes[0] + mi := &file_private_pbservice_node_proto_msgTypes[0] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -47,7 +47,7 @@ func (x *IndexedCheckServiceNodes) String() string { func (*IndexedCheckServiceNodes) ProtoMessage() {} func (x *IndexedCheckServiceNodes) ProtoReflect() protoreflect.Message { - mi := &file_proto_pbservice_node_proto_msgTypes[0] + mi := &file_private_pbservice_node_proto_msgTypes[0] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -60,7 +60,7 @@ func (x *IndexedCheckServiceNodes) ProtoReflect() protoreflect.Message { // Deprecated: Use IndexedCheckServiceNodes.ProtoReflect.Descriptor instead. func (*IndexedCheckServiceNodes) Descriptor() ([]byte, []int) { - return file_proto_pbservice_node_proto_rawDescGZIP(), []int{0} + return file_private_pbservice_node_proto_rawDescGZIP(), []int{0} } func (x *IndexedCheckServiceNodes) GetIndex() uint64 { @@ -92,7 +92,7 @@ type CheckServiceNode struct { func (x *CheckServiceNode) Reset() { *x = CheckServiceNode{} if protoimpl.UnsafeEnabled { - mi := &file_proto_pbservice_node_proto_msgTypes[1] + mi := &file_private_pbservice_node_proto_msgTypes[1] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -105,7 +105,7 @@ func (x *CheckServiceNode) String() string { func (*CheckServiceNode) ProtoMessage() {} func (x *CheckServiceNode) ProtoReflect() protoreflect.Message { - mi := &file_proto_pbservice_node_proto_msgTypes[1] + mi := &file_private_pbservice_node_proto_msgTypes[1] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -118,7 +118,7 @@ func (x *CheckServiceNode) ProtoReflect() protoreflect.Message { // Deprecated: Use CheckServiceNode.ProtoReflect.Descriptor instead. func (*CheckServiceNode) Descriptor() ([]byte, []int) { - return file_proto_pbservice_node_proto_rawDescGZIP(), []int{1} + return file_private_pbservice_node_proto_rawDescGZIP(), []int{1} } func (x *CheckServiceNode) GetNode() *Node { @@ -170,7 +170,7 @@ type Node struct { func (x *Node) Reset() { *x = Node{} if protoimpl.UnsafeEnabled { - mi := &file_proto_pbservice_node_proto_msgTypes[2] + mi := &file_private_pbservice_node_proto_msgTypes[2] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -183,7 +183,7 @@ func (x *Node) String() string { func (*Node) ProtoMessage() {} func (x *Node) ProtoReflect() protoreflect.Message { - mi := &file_proto_pbservice_node_proto_msgTypes[2] + mi := &file_private_pbservice_node_proto_msgTypes[2] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -196,7 +196,7 @@ func (x *Node) ProtoReflect() protoreflect.Message { // Deprecated: Use Node.ProtoReflect.Descriptor instead. func (*Node) Descriptor() ([]byte, []int) { - return file_proto_pbservice_node_proto_rawDescGZIP(), []int{2} + return file_private_pbservice_node_proto_rawDescGZIP(), []int{2} } func (x *Node) GetID() string { @@ -334,7 +334,7 @@ type NodeService struct { func (x *NodeService) Reset() { *x = NodeService{} if protoimpl.UnsafeEnabled { - mi := &file_proto_pbservice_node_proto_msgTypes[3] + mi := &file_private_pbservice_node_proto_msgTypes[3] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -347,7 +347,7 @@ func (x *NodeService) String() string { func (*NodeService) ProtoMessage() {} func (x *NodeService) ProtoReflect() protoreflect.Message { - mi := &file_proto_pbservice_node_proto_msgTypes[3] + mi := &file_private_pbservice_node_proto_msgTypes[3] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -360,7 +360,7 @@ func (x *NodeService) ProtoReflect() protoreflect.Message { // Deprecated: Use NodeService.ProtoReflect.Descriptor instead. func (*NodeService) Descriptor() ([]byte, []int) { - return file_proto_pbservice_node_proto_rawDescGZIP(), []int{3} + return file_private_pbservice_node_proto_rawDescGZIP(), []int{3} } func (x *NodeService) GetKind() string { @@ -482,147 +482,148 @@ func (x *NodeService) GetRaftIndex() *pbcommon.RaftIndex { return nil } -var File_proto_pbservice_node_proto protoreflect.FileDescriptor - -var file_proto_pbservice_node_proto_rawDesc = []byte{ - 0x0a, 0x1a, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x70, 0x62, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x2f, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x21, 0x68, 0x61, - 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, - 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x1a, - 0x1b, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x70, 0x62, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, - 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x21, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x2f, 0x70, 0x62, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2f, 0x68, 0x65, - 0x61, 0x6c, 0x74, 0x68, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, - 0x1d, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x70, 0x62, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x2f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x7b, - 0x0a, 0x18, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x64, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x53, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x49, 0x6e, - 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x49, 0x6e, 0x64, 0x65, 0x78, - 0x12, 0x49, 0x0a, 0x05, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x33, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, +var File_private_pbservice_node_proto protoreflect.FileDescriptor + +var file_private_pbservice_node_proto_rawDesc = []byte{ + 0x0a, 0x1c, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2f, 0x70, 0x62, 0x73, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x2f, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x21, + 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, + 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x1a, 0x1d, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2f, 0x70, 0x62, 0x63, 0x6f, 0x6d, + 0x6d, 0x6f, 0x6e, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x1a, 0x23, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2f, 0x70, 0x62, 0x73, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x2f, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2f, 0x70, + 0x62, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x7b, 0x0a, 0x18, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x65, + 0x64, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4e, 0x6f, 0x64, + 0x65, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x05, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x49, 0x0a, 0x05, 0x4e, 0x6f, 0x64, 0x65, + 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, + 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, + 0x6e, 0x61, 0x6c, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x43, 0x68, 0x65, 0x63, + 0x6b, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x05, 0x4e, 0x6f, + 0x64, 0x65, 0x73, 0x22, 0xe1, 0x01, 0x0a, 0x10, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x53, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x3b, 0x0a, 0x04, 0x4e, 0x6f, 0x64, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, + 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, + 0x61, 0x6c, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x52, + 0x04, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x48, 0x0a, 0x07, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, + 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, + 0x61, 0x6c, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x53, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x07, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, + 0x46, 0x0a, 0x06, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x2e, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x73, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x05, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x22, 0xe1, 0x01, 0x0a, 0x10, - 0x43, 0x68, 0x65, 0x63, 0x6b, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4e, 0x6f, 0x64, 0x65, - 0x12, 0x3b, 0x0a, 0x04, 0x4e, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, + 0x69, 0x63, 0x65, 0x2e, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, + 0x06, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x22, 0x95, 0x04, 0x0a, 0x04, 0x4e, 0x6f, 0x64, 0x65, + 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, + 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x50, 0x65, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x09, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x50, 0x65, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x18, + 0x0a, 0x07, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x07, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x44, 0x61, 0x74, 0x61, + 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x44, 0x61, + 0x74, 0x61, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x12, 0x66, 0x0a, 0x0f, 0x54, 0x61, 0x67, 0x67, + 0x65, 0x64, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x3c, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, + 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x73, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x2e, 0x54, 0x61, 0x67, 0x67, 0x65, + 0x64, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, + 0x0f, 0x54, 0x61, 0x67, 0x67, 0x65, 0x64, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, + 0x12, 0x45, 0x0a, 0x04, 0x4d, 0x65, 0x74, 0x61, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x04, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x48, 0x0a, - 0x07, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, + 0x63, 0x65, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x04, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x49, 0x0a, 0x09, 0x52, 0x61, 0x66, 0x74, 0x49, + 0x6e, 0x64, 0x65, 0x78, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x68, 0x61, 0x73, + 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, + 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x52, 0x61, + 0x66, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x09, 0x52, 0x61, 0x66, 0x74, 0x49, 0x6e, 0x64, + 0x65, 0x78, 0x1a, 0x42, 0x0a, 0x14, 0x54, 0x61, 0x67, 0x67, 0x65, 0x64, 0x41, 0x64, 0x64, 0x72, + 0x65, 0x73, 0x73, 0x65, 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, 0x37, 0x0a, 0x09, 0x4d, 0x65, 0x74, 0x61, 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, 0x22, + 0xa9, 0x08, 0x0a, 0x0b, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, + 0x12, 0x0a, 0x04, 0x4b, 0x69, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4b, + 0x69, 0x6e, 0x64, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x02, 0x49, 0x44, 0x12, 0x18, 0x0a, 0x07, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x12, 0x0a, + 0x04, 0x54, 0x61, 0x67, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x54, 0x61, 0x67, + 0x73, 0x12, 0x18, 0x0a, 0x07, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x07, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x6d, 0x0a, 0x0f, 0x54, + 0x61, 0x67, 0x67, 0x65, 0x64, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x18, 0x0f, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x43, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, + 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, + 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x2e, 0x54, 0x61, 0x67, 0x67, 0x65, 0x64, 0x41, 0x64, 0x64, 0x72, 0x65, + 0x73, 0x73, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0f, 0x54, 0x61, 0x67, 0x67, 0x65, + 0x64, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x12, 0x4c, 0x0a, 0x04, 0x4d, 0x65, + 0x74, 0x61, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, + 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, + 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x4e, 0x6f, 0x64, + 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x52, 0x04, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x6f, 0x72, 0x74, + 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x1e, 0x0a, 0x0a, + 0x53, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x50, 0x61, 0x74, 0x68, 0x18, 0x11, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0a, 0x53, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x50, 0x61, 0x74, 0x68, 0x12, 0x44, 0x0a, 0x07, + 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, + 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, + 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x2e, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x52, 0x07, 0x57, 0x65, 0x69, 0x67, 0x68, + 0x74, 0x73, 0x12, 0x2c, 0x0a, 0x11, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x61, 0x67, 0x4f, + 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x45, + 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x61, 0x67, 0x4f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, + 0x12, 0x4b, 0x0a, 0x05, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x35, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, + 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x73, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x2e, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x50, 0x72, 0x6f, 0x78, 0x79, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x05, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x12, 0x4b, 0x0a, + 0x07, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x07, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x46, 0x0a, 0x06, 0x43, 0x68, 0x65, 0x63, 0x6b, - 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, - 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, - 0x6e, 0x61, 0x6c, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x48, 0x65, 0x61, 0x6c, - 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x06, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x22, - 0x95, 0x04, 0x0a, 0x04, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x6f, 0x64, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x1c, 0x0a, 0x09, - 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x09, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x50, 0x65, - 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x50, 0x65, - 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, - 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, - 0x12, 0x1e, 0x0a, 0x0a, 0x44, 0x61, 0x74, 0x61, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x44, 0x61, 0x74, 0x61, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, - 0x12, 0x66, 0x0a, 0x0f, 0x54, 0x61, 0x67, 0x67, 0x65, 0x64, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, - 0x73, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3c, 0x2e, 0x68, 0x61, 0x73, 0x68, - 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, - 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x4e, 0x6f, - 0x64, 0x65, 0x2e, 0x54, 0x61, 0x67, 0x67, 0x65, 0x64, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, - 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0f, 0x54, 0x61, 0x67, 0x67, 0x65, 0x64, 0x41, - 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x12, 0x45, 0x0a, 0x04, 0x4d, 0x65, 0x74, 0x61, - 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, - 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, - 0x61, 0x6c, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x2e, - 0x4d, 0x65, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x4d, 0x65, 0x74, 0x61, 0x12, - 0x49, 0x0a, 0x09, 0x52, 0x61, 0x66, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x07, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, + 0x63, 0x65, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, + 0x74, 0x52, 0x07, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x12, 0x3e, 0x0a, 0x1a, 0x4c, 0x6f, + 0x63, 0x61, 0x6c, 0x6c, 0x79, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x41, + 0x73, 0x53, 0x69, 0x64, 0x65, 0x63, 0x61, 0x72, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x08, 0x52, 0x1a, + 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x6c, 0x79, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, + 0x64, 0x41, 0x73, 0x53, 0x69, 0x64, 0x65, 0x63, 0x61, 0x72, 0x12, 0x58, 0x0a, 0x0e, 0x45, 0x6e, + 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x18, 0x10, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, - 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x52, 0x61, 0x66, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, - 0x09, 0x52, 0x61, 0x66, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x1a, 0x42, 0x0a, 0x14, 0x54, 0x61, - 0x67, 0x67, 0x65, 0x64, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 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, 0x37, - 0x0a, 0x09, 0x4d, 0x65, 0x74, 0x61, 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, 0x22, 0xa9, 0x08, 0x0a, 0x0b, 0x4e, 0x6f, 0x64, 0x65, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x4b, 0x69, 0x6e, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x0e, 0x0a, 0x02, 0x49, - 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, 0x18, 0x0a, 0x07, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x53, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x54, 0x61, 0x67, 0x73, 0x18, 0x04, 0x20, - 0x03, 0x28, 0x09, 0x52, 0x04, 0x54, 0x61, 0x67, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x41, 0x64, 0x64, - 0x72, 0x65, 0x73, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x41, 0x64, 0x64, 0x72, - 0x65, 0x73, 0x73, 0x12, 0x6d, 0x0a, 0x0f, 0x54, 0x61, 0x67, 0x67, 0x65, 0x64, 0x41, 0x64, 0x64, - 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x18, 0x0f, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x43, 0x2e, 0x68, - 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, - 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x54, 0x61, 0x67, - 0x67, 0x65, 0x64, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x0f, 0x54, 0x61, 0x67, 0x67, 0x65, 0x64, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, - 0x65, 0x73, 0x12, 0x4c, 0x0a, 0x04, 0x4d, 0x65, 0x74, 0x61, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x38, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, - 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x73, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x4d, 0x65, 0x74, 0x61, - 0x12, 0x12, 0x0a, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, - 0x50, 0x6f, 0x72, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x53, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x50, 0x61, - 0x74, 0x68, 0x18, 0x11, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x53, 0x6f, 0x63, 0x6b, 0x65, 0x74, - 0x50, 0x61, 0x74, 0x68, 0x12, 0x44, 0x0a, 0x07, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x18, - 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, - 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, - 0x6c, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, - 0x73, 0x52, 0x07, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x12, 0x2c, 0x0a, 0x11, 0x45, 0x6e, - 0x61, 0x62, 0x6c, 0x65, 0x54, 0x61, 0x67, 0x4f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x18, - 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x61, 0x67, - 0x4f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x12, 0x4b, 0x0a, 0x05, 0x50, 0x72, 0x6f, 0x78, - 0x79, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, - 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, - 0x6e, 0x61, 0x6c, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x43, 0x6f, 0x6e, 0x6e, - 0x65, 0x63, 0x74, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x05, - 0x50, 0x72, 0x6f, 0x78, 0x79, 0x12, 0x4b, 0x0a, 0x07, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, - 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, - 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, - 0x61, 0x6c, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x52, 0x07, 0x43, 0x6f, 0x6e, 0x6e, 0x65, - 0x63, 0x74, 0x12, 0x3e, 0x0a, 0x1a, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x6c, 0x79, 0x52, 0x65, 0x67, - 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x41, 0x73, 0x53, 0x69, 0x64, 0x65, 0x63, 0x61, 0x72, - 0x18, 0x0d, 0x20, 0x01, 0x28, 0x08, 0x52, 0x1a, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x6c, 0x79, 0x52, - 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x41, 0x73, 0x53, 0x69, 0x64, 0x65, 0x63, - 0x61, 0x72, 0x12, 0x58, 0x0a, 0x0e, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, - 0x4d, 0x65, 0x74, 0x61, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x68, 0x61, 0x73, - 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, - 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6e, - 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x52, 0x0e, 0x45, 0x6e, - 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x1a, 0x0a, 0x08, - 0x50, 0x65, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x12, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x50, 0x65, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x49, 0x0a, 0x09, 0x52, 0x61, 0x66, 0x74, - 0x49, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x68, 0x61, - 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, - 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x52, - 0x61, 0x66, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x09, 0x52, 0x61, 0x66, 0x74, 0x49, 0x6e, - 0x64, 0x65, 0x78, 0x1a, 0x75, 0x0a, 0x14, 0x54, 0x61, 0x67, 0x67, 0x65, 0x64, 0x41, 0x64, 0x64, - 0x72, 0x65, 0x73, 0x73, 0x65, 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, 0x47, 0x0a, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x68, - 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, - 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x37, 0x0a, 0x09, 0x4d, 0x65, - 0x74, 0x61, 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, 0x42, 0x87, 0x02, 0x0a, 0x25, 0x63, 0x6f, 0x6d, 0x2e, 0x68, 0x61, 0x73, 0x68, - 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, - 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x42, 0x09, 0x4e, - 0x6f, 0x64, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x2b, 0x67, 0x69, 0x74, 0x68, - 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, - 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x70, 0x62, + 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, + 0x4d, 0x65, 0x74, 0x61, 0x52, 0x0e, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, + 0x4d, 0x65, 0x74, 0x61, 0x12, 0x1a, 0x0a, 0x08, 0x50, 0x65, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, + 0x18, 0x12, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x50, 0x65, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, + 0x12, 0x49, 0x0a, 0x09, 0x52, 0x61, 0x66, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x0e, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, + 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, + 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x52, 0x61, 0x66, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, + 0x52, 0x09, 0x52, 0x61, 0x66, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x1a, 0x75, 0x0a, 0x14, 0x54, + 0x61, 0x67, 0x67, 0x65, 0x64, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 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, 0x47, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, + 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, + 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, + 0x38, 0x01, 0x1a, 0x37, 0x0a, 0x09, 0x4d, 0x65, 0x74, 0x61, 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, 0x42, 0x8f, 0x02, 0x0a, 0x25, + 0x63, 0x6f, 0x6d, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, + 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x73, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x42, 0x09, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, + 0x50, 0x01, 0x5a, 0x33, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x68, + 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2f, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2f, 0x70, 0x62, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0xa2, 0x02, 0x04, 0x48, 0x43, 0x49, 0x53, 0xaa, 0x02, 0x21, 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, @@ -638,19 +639,19 @@ var file_proto_pbservice_node_proto_rawDesc = []byte{ } var ( - file_proto_pbservice_node_proto_rawDescOnce sync.Once - file_proto_pbservice_node_proto_rawDescData = file_proto_pbservice_node_proto_rawDesc + file_private_pbservice_node_proto_rawDescOnce sync.Once + file_private_pbservice_node_proto_rawDescData = file_private_pbservice_node_proto_rawDesc ) -func file_proto_pbservice_node_proto_rawDescGZIP() []byte { - file_proto_pbservice_node_proto_rawDescOnce.Do(func() { - file_proto_pbservice_node_proto_rawDescData = protoimpl.X.CompressGZIP(file_proto_pbservice_node_proto_rawDescData) +func file_private_pbservice_node_proto_rawDescGZIP() []byte { + file_private_pbservice_node_proto_rawDescOnce.Do(func() { + file_private_pbservice_node_proto_rawDescData = protoimpl.X.CompressGZIP(file_private_pbservice_node_proto_rawDescData) }) - return file_proto_pbservice_node_proto_rawDescData + return file_private_pbservice_node_proto_rawDescData } -var file_proto_pbservice_node_proto_msgTypes = make([]protoimpl.MessageInfo, 8) -var file_proto_pbservice_node_proto_goTypes = []interface{}{ +var file_private_pbservice_node_proto_msgTypes = make([]protoimpl.MessageInfo, 8) +var file_private_pbservice_node_proto_goTypes = []interface{}{ (*IndexedCheckServiceNodes)(nil), // 0: hashicorp.consul.internal.service.IndexedCheckServiceNodes (*CheckServiceNode)(nil), // 1: hashicorp.consul.internal.service.CheckServiceNode (*Node)(nil), // 2: hashicorp.consul.internal.service.Node @@ -667,7 +668,7 @@ var file_proto_pbservice_node_proto_goTypes = []interface{}{ (*pbcommon.EnterpriseMeta)(nil), // 13: hashicorp.consul.internal.common.EnterpriseMeta (*ServiceAddress)(nil), // 14: hashicorp.consul.internal.service.ServiceAddress } -var file_proto_pbservice_node_proto_depIdxs = []int32{ +var file_private_pbservice_node_proto_depIdxs = []int32{ 1, // 0: hashicorp.consul.internal.service.IndexedCheckServiceNodes.Nodes:type_name -> hashicorp.consul.internal.service.CheckServiceNode 2, // 1: hashicorp.consul.internal.service.CheckServiceNode.Node:type_name -> hashicorp.consul.internal.service.Node 3, // 2: hashicorp.consul.internal.service.CheckServiceNode.Service:type_name -> hashicorp.consul.internal.service.NodeService @@ -690,15 +691,15 @@ var file_proto_pbservice_node_proto_depIdxs = []int32{ 0, // [0:15] is the sub-list for field type_name } -func init() { file_proto_pbservice_node_proto_init() } -func file_proto_pbservice_node_proto_init() { - if File_proto_pbservice_node_proto != nil { +func init() { file_private_pbservice_node_proto_init() } +func file_private_pbservice_node_proto_init() { + if File_private_pbservice_node_proto != nil { return } - file_proto_pbservice_healthcheck_proto_init() - file_proto_pbservice_service_proto_init() + file_private_pbservice_healthcheck_proto_init() + file_private_pbservice_service_proto_init() if !protoimpl.UnsafeEnabled { - file_proto_pbservice_node_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + file_private_pbservice_node_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*IndexedCheckServiceNodes); i { case 0: return &v.state @@ -710,7 +711,7 @@ func file_proto_pbservice_node_proto_init() { return nil } } - file_proto_pbservice_node_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + file_private_pbservice_node_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CheckServiceNode); i { case 0: return &v.state @@ -722,7 +723,7 @@ func file_proto_pbservice_node_proto_init() { return nil } } - file_proto_pbservice_node_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + file_private_pbservice_node_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Node); i { case 0: return &v.state @@ -734,7 +735,7 @@ func file_proto_pbservice_node_proto_init() { return nil } } - file_proto_pbservice_node_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + file_private_pbservice_node_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*NodeService); i { case 0: return &v.state @@ -751,18 +752,18 @@ func file_proto_pbservice_node_proto_init() { out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_proto_pbservice_node_proto_rawDesc, + RawDescriptor: file_private_pbservice_node_proto_rawDesc, NumEnums: 0, NumMessages: 8, NumExtensions: 0, NumServices: 0, }, - GoTypes: file_proto_pbservice_node_proto_goTypes, - DependencyIndexes: file_proto_pbservice_node_proto_depIdxs, - MessageInfos: file_proto_pbservice_node_proto_msgTypes, + GoTypes: file_private_pbservice_node_proto_goTypes, + DependencyIndexes: file_private_pbservice_node_proto_depIdxs, + MessageInfos: file_private_pbservice_node_proto_msgTypes, }.Build() - File_proto_pbservice_node_proto = out.File - file_proto_pbservice_node_proto_rawDesc = nil - file_proto_pbservice_node_proto_goTypes = nil - file_proto_pbservice_node_proto_depIdxs = nil + File_private_pbservice_node_proto = out.File + file_private_pbservice_node_proto_rawDesc = nil + file_private_pbservice_node_proto_goTypes = nil + file_private_pbservice_node_proto_depIdxs = nil } diff --git a/proto/pbservice/node.proto b/proto/private/pbservice/node.proto similarity index 97% rename from proto/pbservice/node.proto rename to proto/private/pbservice/node.proto index 7431b836ce0..7ea79bb7008 100644 --- a/proto/pbservice/node.proto +++ b/proto/private/pbservice/node.proto @@ -2,9 +2,9 @@ syntax = "proto3"; package hashicorp.consul.internal.service; -import "proto/pbcommon/common.proto"; -import "proto/pbservice/healthcheck.proto"; -import "proto/pbservice/service.proto"; +import "private/pbcommon/common.proto"; +import "private/pbservice/healthcheck.proto"; +import "private/pbservice/service.proto"; // IndexedCheckServiceNodes is used to return multiple instances for a given service. message IndexedCheckServiceNodes { diff --git a/proto/pbservice/service.gen.go b/proto/private/pbservice/service.gen.go similarity index 100% rename from proto/pbservice/service.gen.go rename to proto/private/pbservice/service.gen.go diff --git a/proto/pbservice/service.pb.binary.go b/proto/private/pbservice/service.pb.binary.go similarity index 98% rename from proto/pbservice/service.pb.binary.go rename to proto/private/pbservice/service.pb.binary.go index 8eab0ff9e75..bfd490fa811 100644 --- a/proto/pbservice/service.pb.binary.go +++ b/proto/private/pbservice/service.pb.binary.go @@ -1,5 +1,5 @@ // Code generated by protoc-gen-go-binary. DO NOT EDIT. -// source: proto/pbservice/service.proto +// source: private/pbservice/service.proto package pbservice diff --git a/proto/pbservice/service.pb.go b/proto/private/pbservice/service.pb.go similarity index 62% rename from proto/pbservice/service.pb.go rename to proto/private/pbservice/service.pb.go index b08f7508d1a..743ea79b2ee 100644 --- a/proto/pbservice/service.pb.go +++ b/proto/private/pbservice/service.pb.go @@ -2,12 +2,12 @@ // versions: // protoc-gen-go v1.28.1 // protoc (unknown) -// source: proto/pbservice/service.proto +// source: private/pbservice/service.proto package pbservice import ( - pbcommon "github.com/hashicorp/consul/proto/pbcommon" + pbcommon "github.com/hashicorp/consul/proto/private/pbcommon" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" structpb "google.golang.org/protobuf/types/known/structpb" @@ -88,7 +88,7 @@ type ConnectProxyConfig struct { func (x *ConnectProxyConfig) Reset() { *x = ConnectProxyConfig{} if protoimpl.UnsafeEnabled { - mi := &file_proto_pbservice_service_proto_msgTypes[0] + mi := &file_private_pbservice_service_proto_msgTypes[0] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -101,7 +101,7 @@ func (x *ConnectProxyConfig) String() string { func (*ConnectProxyConfig) ProtoMessage() {} func (x *ConnectProxyConfig) ProtoReflect() protoreflect.Message { - mi := &file_proto_pbservice_service_proto_msgTypes[0] + mi := &file_private_pbservice_service_proto_msgTypes[0] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -114,7 +114,7 @@ func (x *ConnectProxyConfig) ProtoReflect() protoreflect.Message { // Deprecated: Use ConnectProxyConfig.ProtoReflect.Descriptor instead. func (*ConnectProxyConfig) Descriptor() ([]byte, []int) { - return file_proto_pbservice_service_proto_rawDescGZIP(), []int{0} + return file_private_pbservice_service_proto_rawDescGZIP(), []int{0} } func (x *ConnectProxyConfig) GetDestinationServiceName() string { @@ -265,7 +265,7 @@ type Upstream struct { func (x *Upstream) Reset() { *x = Upstream{} if protoimpl.UnsafeEnabled { - mi := &file_proto_pbservice_service_proto_msgTypes[1] + mi := &file_private_pbservice_service_proto_msgTypes[1] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -278,7 +278,7 @@ func (x *Upstream) String() string { func (*Upstream) ProtoMessage() {} func (x *Upstream) ProtoReflect() protoreflect.Message { - mi := &file_proto_pbservice_service_proto_msgTypes[1] + mi := &file_private_pbservice_service_proto_msgTypes[1] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -291,7 +291,7 @@ func (x *Upstream) ProtoReflect() protoreflect.Message { // Deprecated: Use Upstream.ProtoReflect.Descriptor instead. func (*Upstream) Descriptor() ([]byte, []int) { - return file_proto_pbservice_service_proto_rawDescGZIP(), []int{1} + return file_private_pbservice_service_proto_rawDescGZIP(), []int{1} } func (x *Upstream) GetDestinationType() string { @@ -414,7 +414,7 @@ type ServiceConnect struct { func (x *ServiceConnect) Reset() { *x = ServiceConnect{} if protoimpl.UnsafeEnabled { - mi := &file_proto_pbservice_service_proto_msgTypes[2] + mi := &file_private_pbservice_service_proto_msgTypes[2] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -427,7 +427,7 @@ func (x *ServiceConnect) String() string { func (*ServiceConnect) ProtoMessage() {} func (x *ServiceConnect) ProtoReflect() protoreflect.Message { - mi := &file_proto_pbservice_service_proto_msgTypes[2] + mi := &file_private_pbservice_service_proto_msgTypes[2] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -440,7 +440,7 @@ func (x *ServiceConnect) ProtoReflect() protoreflect.Message { // Deprecated: Use ServiceConnect.ProtoReflect.Descriptor instead. func (*ServiceConnect) Descriptor() ([]byte, []int) { - return file_proto_pbservice_service_proto_rawDescGZIP(), []int{2} + return file_private_pbservice_service_proto_rawDescGZIP(), []int{2} } func (x *ServiceConnect) GetNative() bool { @@ -484,7 +484,7 @@ type PeeringServiceMeta struct { func (x *PeeringServiceMeta) Reset() { *x = PeeringServiceMeta{} if protoimpl.UnsafeEnabled { - mi := &file_proto_pbservice_service_proto_msgTypes[3] + mi := &file_private_pbservice_service_proto_msgTypes[3] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -497,7 +497,7 @@ func (x *PeeringServiceMeta) String() string { func (*PeeringServiceMeta) ProtoMessage() {} func (x *PeeringServiceMeta) ProtoReflect() protoreflect.Message { - mi := &file_proto_pbservice_service_proto_msgTypes[3] + mi := &file_private_pbservice_service_proto_msgTypes[3] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -510,7 +510,7 @@ func (x *PeeringServiceMeta) ProtoReflect() protoreflect.Message { // Deprecated: Use PeeringServiceMeta.ProtoReflect.Descriptor instead. func (*PeeringServiceMeta) Descriptor() ([]byte, []int) { - return file_proto_pbservice_service_proto_rawDescGZIP(), []int{3} + return file_private_pbservice_service_proto_rawDescGZIP(), []int{3} } func (x *PeeringServiceMeta) GetSNI() []string { @@ -558,7 +558,7 @@ type ExposeConfig struct { func (x *ExposeConfig) Reset() { *x = ExposeConfig{} if protoimpl.UnsafeEnabled { - mi := &file_proto_pbservice_service_proto_msgTypes[4] + mi := &file_private_pbservice_service_proto_msgTypes[4] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -571,7 +571,7 @@ func (x *ExposeConfig) String() string { func (*ExposeConfig) ProtoMessage() {} func (x *ExposeConfig) ProtoReflect() protoreflect.Message { - mi := &file_proto_pbservice_service_proto_msgTypes[4] + mi := &file_private_pbservice_service_proto_msgTypes[4] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -584,7 +584,7 @@ func (x *ExposeConfig) ProtoReflect() protoreflect.Message { // Deprecated: Use ExposeConfig.ProtoReflect.Descriptor instead. func (*ExposeConfig) Descriptor() ([]byte, []int) { - return file_proto_pbservice_service_proto_rawDescGZIP(), []int{4} + return file_private_pbservice_service_proto_rawDescGZIP(), []int{4} } func (x *ExposeConfig) GetChecks() bool { @@ -629,7 +629,7 @@ type ExposePath struct { func (x *ExposePath) Reset() { *x = ExposePath{} if protoimpl.UnsafeEnabled { - mi := &file_proto_pbservice_service_proto_msgTypes[5] + mi := &file_private_pbservice_service_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -642,7 +642,7 @@ func (x *ExposePath) String() string { func (*ExposePath) ProtoMessage() {} func (x *ExposePath) ProtoReflect() protoreflect.Message { - mi := &file_proto_pbservice_service_proto_msgTypes[5] + mi := &file_private_pbservice_service_proto_msgTypes[5] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -655,7 +655,7 @@ func (x *ExposePath) ProtoReflect() protoreflect.Message { // Deprecated: Use ExposePath.ProtoReflect.Descriptor instead. func (*ExposePath) Descriptor() ([]byte, []int) { - return file_proto_pbservice_service_proto_rawDescGZIP(), []int{5} + return file_private_pbservice_service_proto_rawDescGZIP(), []int{5} } func (x *ExposePath) GetListenerPort() int32 { @@ -710,7 +710,7 @@ type MeshGatewayConfig struct { func (x *MeshGatewayConfig) Reset() { *x = MeshGatewayConfig{} if protoimpl.UnsafeEnabled { - mi := &file_proto_pbservice_service_proto_msgTypes[6] + mi := &file_private_pbservice_service_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -723,7 +723,7 @@ func (x *MeshGatewayConfig) String() string { func (*MeshGatewayConfig) ProtoMessage() {} func (x *MeshGatewayConfig) ProtoReflect() protoreflect.Message { - mi := &file_proto_pbservice_service_proto_msgTypes[6] + mi := &file_private_pbservice_service_proto_msgTypes[6] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -736,7 +736,7 @@ func (x *MeshGatewayConfig) ProtoReflect() protoreflect.Message { // Deprecated: Use MeshGatewayConfig.ProtoReflect.Descriptor instead. func (*MeshGatewayConfig) Descriptor() ([]byte, []int) { - return file_proto_pbservice_service_proto_rawDescGZIP(), []int{6} + return file_private_pbservice_service_proto_rawDescGZIP(), []int{6} } func (x *MeshGatewayConfig) GetMode() string { @@ -767,7 +767,7 @@ type TransparentProxyConfig struct { func (x *TransparentProxyConfig) Reset() { *x = TransparentProxyConfig{} if protoimpl.UnsafeEnabled { - mi := &file_proto_pbservice_service_proto_msgTypes[7] + mi := &file_private_pbservice_service_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -780,7 +780,7 @@ func (x *TransparentProxyConfig) String() string { func (*TransparentProxyConfig) ProtoMessage() {} func (x *TransparentProxyConfig) ProtoReflect() protoreflect.Message { - mi := &file_proto_pbservice_service_proto_msgTypes[7] + mi := &file_private_pbservice_service_proto_msgTypes[7] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -793,7 +793,7 @@ func (x *TransparentProxyConfig) ProtoReflect() protoreflect.Message { // Deprecated: Use TransparentProxyConfig.ProtoReflect.Descriptor instead. func (*TransparentProxyConfig) Descriptor() ([]byte, []int) { - return file_proto_pbservice_service_proto_rawDescGZIP(), []int{7} + return file_private_pbservice_service_proto_rawDescGZIP(), []int{7} } func (x *TransparentProxyConfig) GetOutboundListenerPort() int32 { @@ -833,7 +833,7 @@ type AccessLogsConfig struct { func (x *AccessLogsConfig) Reset() { *x = AccessLogsConfig{} if protoimpl.UnsafeEnabled { - mi := &file_proto_pbservice_service_proto_msgTypes[8] + mi := &file_private_pbservice_service_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -846,7 +846,7 @@ func (x *AccessLogsConfig) String() string { func (*AccessLogsConfig) ProtoMessage() {} func (x *AccessLogsConfig) ProtoReflect() protoreflect.Message { - mi := &file_proto_pbservice_service_proto_msgTypes[8] + mi := &file_private_pbservice_service_proto_msgTypes[8] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -859,7 +859,7 @@ func (x *AccessLogsConfig) ProtoReflect() protoreflect.Message { // Deprecated: Use AccessLogsConfig.ProtoReflect.Descriptor instead. func (*AccessLogsConfig) Descriptor() ([]byte, []int) { - return file_proto_pbservice_service_proto_rawDescGZIP(), []int{8} + return file_private_pbservice_service_proto_rawDescGZIP(), []int{8} } func (x *AccessLogsConfig) GetEnabled() bool { @@ -958,7 +958,7 @@ type ServiceDefinition struct { func (x *ServiceDefinition) Reset() { *x = ServiceDefinition{} if protoimpl.UnsafeEnabled { - mi := &file_proto_pbservice_service_proto_msgTypes[9] + mi := &file_private_pbservice_service_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -971,7 +971,7 @@ func (x *ServiceDefinition) String() string { func (*ServiceDefinition) ProtoMessage() {} func (x *ServiceDefinition) ProtoReflect() protoreflect.Message { - mi := &file_proto_pbservice_service_proto_msgTypes[9] + mi := &file_private_pbservice_service_proto_msgTypes[9] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -984,7 +984,7 @@ func (x *ServiceDefinition) ProtoReflect() protoreflect.Message { // Deprecated: Use ServiceDefinition.ProtoReflect.Descriptor instead. func (*ServiceDefinition) Descriptor() ([]byte, []int) { - return file_proto_pbservice_service_proto_rawDescGZIP(), []int{9} + return file_private_pbservice_service_proto_rawDescGZIP(), []int{9} } func (x *ServiceDefinition) GetKind() string { @@ -1120,7 +1120,7 @@ type ServiceAddress struct { func (x *ServiceAddress) Reset() { *x = ServiceAddress{} if protoimpl.UnsafeEnabled { - mi := &file_proto_pbservice_service_proto_msgTypes[10] + mi := &file_private_pbservice_service_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1133,7 +1133,7 @@ func (x *ServiceAddress) String() string { func (*ServiceAddress) ProtoMessage() {} func (x *ServiceAddress) ProtoReflect() protoreflect.Message { - mi := &file_proto_pbservice_service_proto_msgTypes[10] + mi := &file_private_pbservice_service_proto_msgTypes[10] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1146,7 +1146,7 @@ func (x *ServiceAddress) ProtoReflect() protoreflect.Message { // Deprecated: Use ServiceAddress.ProtoReflect.Descriptor instead. func (*ServiceAddress) Descriptor() ([]byte, []int) { - return file_proto_pbservice_service_proto_rawDescGZIP(), []int{10} + return file_private_pbservice_service_proto_rawDescGZIP(), []int{10} } func (x *ServiceAddress) GetAddress() string { @@ -1178,7 +1178,7 @@ type Weights struct { func (x *Weights) Reset() { *x = Weights{} if protoimpl.UnsafeEnabled { - mi := &file_proto_pbservice_service_proto_msgTypes[11] + mi := &file_private_pbservice_service_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1191,7 +1191,7 @@ func (x *Weights) String() string { func (*Weights) ProtoMessage() {} func (x *Weights) ProtoReflect() protoreflect.Message { - mi := &file_proto_pbservice_service_proto_msgTypes[11] + mi := &file_private_pbservice_service_proto_msgTypes[11] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1204,7 +1204,7 @@ func (x *Weights) ProtoReflect() protoreflect.Message { // Deprecated: Use Weights.ProtoReflect.Descriptor instead. func (*Weights) Descriptor() ([]byte, []int) { - return file_proto_pbservice_service_proto_rawDescGZIP(), []int{11} + return file_private_pbservice_service_proto_rawDescGZIP(), []int{11} } func (x *Weights) GetPassing() int32 { @@ -1221,283 +1221,284 @@ func (x *Weights) GetWarning() int32 { return 0 } -var File_proto_pbservice_service_proto protoreflect.FileDescriptor - -var file_proto_pbservice_service_proto_rawDesc = []byte{ - 0x0a, 0x1d, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x70, 0x62, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, - 0x21, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, - 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2f, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x1a, 0x1b, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x70, 0x62, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, - 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x21, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x70, 0x62, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2f, 0x68, - 0x65, 0x61, 0x6c, 0x74, 0x68, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x22, 0xdf, 0x06, 0x0a, 0x12, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x50, 0x72, 0x6f, 0x78, - 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x36, 0x0a, 0x16, 0x44, 0x65, 0x73, 0x74, 0x69, - 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4e, 0x61, 0x6d, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x16, 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, - 0x32, 0x0a, 0x14, 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x44, +var File_private_pbservice_service_proto protoreflect.FileDescriptor + +var file_private_pbservice_service_proto_rawDesc = []byte{ + 0x0a, 0x1f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2f, 0x70, 0x62, 0x73, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x12, 0x21, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, + 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x73, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x1a, 0x1d, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2f, 0x70, 0x62, 0x63, 0x6f, + 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x1a, 0x23, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2f, 0x70, 0x62, 0x73, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x2f, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x63, 0x68, 0x65, 0x63, 0x6b, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xdf, 0x06, 0x0a, 0x12, 0x43, 0x6f, 0x6e, 0x6e, 0x65, + 0x63, 0x74, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x36, 0x0a, + 0x16, 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x16, 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x49, 0x44, 0x12, 0x30, 0x0a, 0x13, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x53, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x13, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x41, 0x64, - 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x2a, 0x0a, 0x10, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x53, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x10, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x50, 0x6f, 0x72, - 0x74, 0x12, 0x2f, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x06, 0x43, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x12, 0x49, 0x0a, 0x09, 0x55, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x73, 0x18, - 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, - 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, - 0x6c, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x55, 0x70, 0x73, 0x74, 0x72, 0x65, - 0x61, 0x6d, 0x52, 0x09, 0x55, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x73, 0x12, 0x56, 0x0a, - 0x0b, 0x4d, 0x65, 0x73, 0x68, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x18, 0x07, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, + 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x32, 0x0a, 0x14, 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x44, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x14, 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x44, 0x12, 0x30, 0x0a, 0x13, 0x4c, 0x6f, 0x63, + 0x61, 0x6c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x53, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x2a, 0x0a, 0x10, 0x4c, + 0x6f, 0x63, 0x61, 0x6c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x50, 0x6f, 0x72, 0x74, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x10, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x53, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x2f, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, + 0x52, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x49, 0x0a, 0x09, 0x55, 0x70, 0x73, 0x74, + 0x72, 0x65, 0x61, 0x6d, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x68, 0x61, + 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, + 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, + 0x55, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x09, 0x55, 0x70, 0x73, 0x74, 0x72, 0x65, + 0x61, 0x6d, 0x73, 0x12, 0x56, 0x0a, 0x0b, 0x4d, 0x65, 0x73, 0x68, 0x47, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, + 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, + 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x4d, 0x65, 0x73, + 0x68, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x0b, + 0x4d, 0x65, 0x73, 0x68, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x12, 0x47, 0x0a, 0x06, 0x45, + 0x78, 0x70, 0x6f, 0x73, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x68, 0x61, + 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, + 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, + 0x45, 0x78, 0x70, 0x6f, 0x73, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x06, 0x45, 0x78, + 0x70, 0x6f, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x4d, 0x6f, 0x64, 0x65, 0x18, 0x09, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x65, 0x0a, 0x10, 0x54, 0x72, 0x61, 0x6e, + 0x73, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x18, 0x0a, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x73, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x4d, 0x65, 0x73, 0x68, 0x47, 0x61, 0x74, 0x65, 0x77, - 0x61, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x0b, 0x4d, 0x65, 0x73, 0x68, 0x47, 0x61, - 0x74, 0x65, 0x77, 0x61, 0x79, 0x12, 0x47, 0x0a, 0x06, 0x45, 0x78, 0x70, 0x6f, 0x73, 0x65, 0x18, - 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x61, 0x72, 0x65, + 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x10, 0x54, + 0x72, 0x61, 0x6e, 0x73, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x12, + 0x36, 0x0a, 0x16, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, + 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x50, 0x61, 0x74, 0x68, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x16, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x6f, 0x63, + 0x6b, 0x65, 0x74, 0x50, 0x61, 0x74, 0x68, 0x12, 0x5a, 0x0a, 0x0f, 0x45, 0x6e, 0x76, 0x6f, 0x79, + 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x30, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, + 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6d, + 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x76, 0x6f, 0x79, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, + 0x6f, 0x6e, 0x52, 0x0f, 0x45, 0x6e, 0x76, 0x6f, 0x79, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, + 0x6f, 0x6e, 0x73, 0x12, 0x53, 0x0a, 0x0a, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x6f, 0x67, + 0x73, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, + 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, + 0x6e, 0x61, 0x6c, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x41, 0x63, 0x63, 0x65, + 0x73, 0x73, 0x4c, 0x6f, 0x67, 0x73, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x0a, 0x41, 0x63, + 0x63, 0x65, 0x73, 0x73, 0x4c, 0x6f, 0x67, 0x73, 0x22, 0x81, 0x05, 0x0a, 0x08, 0x55, 0x70, 0x73, + 0x74, 0x72, 0x65, 0x61, 0x6d, 0x12, 0x28, 0x0a, 0x0f, 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, + 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, + 0x32, 0x0a, 0x14, 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, + 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x44, + 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x12, 0x32, 0x0a, 0x14, 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0c, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x14, 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x61, + 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x0a, 0x0f, 0x44, 0x65, 0x73, 0x74, 0x69, + 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x65, 0x72, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0f, 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x65, + 0x72, 0x12, 0x28, 0x0a, 0x0f, 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x44, 0x65, 0x73, 0x74, + 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x44, + 0x61, 0x74, 0x61, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0a, 0x44, 0x61, 0x74, 0x61, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x12, 0x2a, 0x0a, 0x10, 0x4c, + 0x6f, 0x63, 0x61, 0x6c, 0x42, 0x69, 0x6e, 0x64, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x42, 0x69, 0x6e, 0x64, + 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x4c, 0x6f, 0x63, 0x61, 0x6c, + 0x42, 0x69, 0x6e, 0x64, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, + 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x42, 0x69, 0x6e, 0x64, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x2f, 0x0a, + 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x56, + 0x0a, 0x0b, 0x4d, 0x65, 0x73, 0x68, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x18, 0x08, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, + 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, + 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x4d, 0x65, 0x73, 0x68, 0x47, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x0b, 0x4d, 0x65, 0x73, 0x68, 0x47, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x12, 0x30, 0x0a, 0x13, 0x43, 0x65, 0x6e, 0x74, 0x72, 0x61, + 0x6c, 0x6c, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x64, 0x18, 0x09, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x13, 0x43, 0x65, 0x6e, 0x74, 0x72, 0x61, 0x6c, 0x6c, 0x79, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x64, 0x12, 0x30, 0x0a, 0x13, 0x4c, 0x6f, 0x63, 0x61, + 0x6c, 0x42, 0x69, 0x6e, 0x64, 0x53, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x50, 0x61, 0x74, 0x68, 0x18, + 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x42, 0x69, 0x6e, 0x64, + 0x53, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x50, 0x61, 0x74, 0x68, 0x12, 0x30, 0x0a, 0x13, 0x4c, 0x6f, + 0x63, 0x61, 0x6c, 0x42, 0x69, 0x6e, 0x64, 0x53, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x4d, 0x6f, 0x64, + 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x42, 0x69, + 0x6e, 0x64, 0x53, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x4d, 0x6f, 0x64, 0x65, 0x22, 0xdf, 0x01, 0x0a, + 0x0e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x12, + 0x16, 0x0a, 0x06, 0x4e, 0x61, 0x74, 0x69, 0x76, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x06, 0x4e, 0x61, 0x74, 0x69, 0x76, 0x65, 0x12, 0x5c, 0x0a, 0x0e, 0x53, 0x69, 0x64, 0x65, 0x63, + 0x61, 0x72, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x34, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, + 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x73, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x44, 0x65, 0x66, 0x69, 0x6e, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0e, 0x53, 0x69, 0x64, 0x65, 0x63, 0x61, 0x72, 0x53, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x51, 0x0a, 0x08, 0x50, 0x65, 0x65, 0x72, 0x4d, 0x65, 0x74, + 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, + 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, + 0x6e, 0x61, 0x6c, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x50, 0x65, 0x65, 0x72, + 0x69, 0x6e, 0x67, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x52, 0x08, + 0x50, 0x65, 0x65, 0x72, 0x4d, 0x65, 0x74, 0x61, 0x4a, 0x04, 0x08, 0x02, 0x10, 0x03, 0x22, 0x5e, + 0x0a, 0x12, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x4d, 0x65, 0x74, 0x61, 0x12, 0x10, 0x0a, 0x03, 0x53, 0x4e, 0x49, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x03, 0x53, 0x4e, 0x49, 0x12, 0x1a, 0x0a, 0x08, 0x53, 0x70, 0x69, 0x66, 0x66, 0x65, + 0x49, 0x44, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x53, 0x70, 0x69, 0x66, 0x66, 0x65, + 0x49, 0x44, 0x12, 0x1a, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x22, 0x6b, + 0x0a, 0x0c, 0x45, 0x78, 0x70, 0x6f, 0x73, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x16, + 0x0a, 0x06, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, + 0x43, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x12, 0x43, 0x0a, 0x05, 0x50, 0x61, 0x74, 0x68, 0x73, 0x18, + 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x45, 0x78, 0x70, 0x6f, 0x73, 0x65, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x06, 0x45, 0x78, 0x70, 0x6f, 0x73, 0x65, 0x12, 0x12, - 0x0a, 0x04, 0x4d, 0x6f, 0x64, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4d, 0x6f, - 0x64, 0x65, 0x12, 0x65, 0x0a, 0x10, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x61, 0x72, 0x65, 0x6e, - 0x74, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x68, - 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, - 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x78, - 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x10, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x61, - 0x72, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x12, 0x36, 0x0a, 0x16, 0x4c, 0x6f, 0x63, - 0x61, 0x6c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x50, - 0x61, 0x74, 0x68, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x16, 0x4c, 0x6f, 0x63, 0x61, 0x6c, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x50, 0x61, 0x74, - 0x68, 0x12, 0x5a, 0x0a, 0x0f, 0x45, 0x6e, 0x76, 0x6f, 0x79, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, - 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x68, 0x61, 0x73, - 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, - 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6e, - 0x76, 0x6f, 0x79, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x0f, 0x45, 0x6e, - 0x76, 0x6f, 0x79, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x53, 0x0a, - 0x0a, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x6f, 0x67, 0x73, 0x18, 0x0d, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x33, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, - 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x73, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x6f, 0x67, 0x73, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x0a, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x6f, - 0x67, 0x73, 0x22, 0x81, 0x05, 0x0a, 0x08, 0x55, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x12, - 0x28, 0x0a, 0x0f, 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, - 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x32, 0x0a, 0x14, 0x44, 0x65, 0x73, - 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x32, 0x0a, - 0x14, 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x72, 0x74, - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x44, 0x65, 0x73, - 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, - 0x6e, 0x12, 0x28, 0x0a, 0x0f, 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x50, 0x65, 0x65, 0x72, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x44, 0x65, 0x73, 0x74, - 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x65, 0x72, 0x12, 0x28, 0x0a, 0x0f, 0x44, - 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x44, 0x61, 0x74, 0x61, 0x63, 0x65, 0x6e, - 0x74, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x44, 0x61, 0x74, 0x61, 0x63, - 0x65, 0x6e, 0x74, 0x65, 0x72, 0x12, 0x2a, 0x0a, 0x10, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x42, 0x69, - 0x6e, 0x64, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x10, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x42, 0x69, 0x6e, 0x64, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, - 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x42, 0x69, 0x6e, 0x64, 0x50, 0x6f, - 0x72, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x42, - 0x69, 0x6e, 0x64, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x2f, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, - 0x52, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x56, 0x0a, 0x0b, 0x4d, 0x65, 0x73, 0x68, - 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x34, 0x2e, - 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, - 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x2e, 0x4d, 0x65, 0x73, 0x68, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x52, 0x0b, 0x4d, 0x65, 0x73, 0x68, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, - 0x12, 0x30, 0x0a, 0x13, 0x43, 0x65, 0x6e, 0x74, 0x72, 0x61, 0x6c, 0x6c, 0x79, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x43, - 0x65, 0x6e, 0x74, 0x72, 0x61, 0x6c, 0x6c, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, - 0x65, 0x64, 0x12, 0x30, 0x0a, 0x13, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x42, 0x69, 0x6e, 0x64, 0x53, - 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x50, 0x61, 0x74, 0x68, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x13, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x42, 0x69, 0x6e, 0x64, 0x53, 0x6f, 0x63, 0x6b, 0x65, 0x74, - 0x50, 0x61, 0x74, 0x68, 0x12, 0x30, 0x0a, 0x13, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x42, 0x69, 0x6e, - 0x64, 0x53, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x4d, 0x6f, 0x64, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x13, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x42, 0x69, 0x6e, 0x64, 0x53, 0x6f, 0x63, 0x6b, - 0x65, 0x74, 0x4d, 0x6f, 0x64, 0x65, 0x22, 0xdf, 0x01, 0x0a, 0x0e, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x4e, 0x61, 0x74, - 0x69, 0x76, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x4e, 0x61, 0x74, 0x69, 0x76, - 0x65, 0x12, 0x5c, 0x0a, 0x0e, 0x53, 0x69, 0x64, 0x65, 0x63, 0x61, 0x72, 0x53, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x68, 0x61, 0x73, 0x68, - 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, - 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x53, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x0e, 0x53, 0x69, 0x64, 0x65, 0x63, 0x61, 0x72, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, - 0x51, 0x0a, 0x08, 0x50, 0x65, 0x65, 0x72, 0x4d, 0x65, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x35, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, - 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x73, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x53, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x52, 0x08, 0x50, 0x65, 0x65, 0x72, 0x4d, 0x65, - 0x74, 0x61, 0x4a, 0x04, 0x08, 0x02, 0x10, 0x03, 0x22, 0x5e, 0x0a, 0x12, 0x50, 0x65, 0x65, 0x72, - 0x69, 0x6e, 0x67, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x10, - 0x0a, 0x03, 0x53, 0x4e, 0x49, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x03, 0x53, 0x4e, 0x49, - 0x12, 0x1a, 0x0a, 0x08, 0x53, 0x70, 0x69, 0x66, 0x66, 0x65, 0x49, 0x44, 0x18, 0x02, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x08, 0x53, 0x70, 0x69, 0x66, 0x66, 0x65, 0x49, 0x44, 0x12, 0x1a, 0x0a, 0x08, - 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x22, 0x6b, 0x0a, 0x0c, 0x45, 0x78, 0x70, 0x6f, - 0x73, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x16, 0x0a, 0x06, 0x43, 0x68, 0x65, 0x63, - 0x6b, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x73, - 0x12, 0x43, 0x0a, 0x05, 0x50, 0x61, 0x74, 0x68, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x2d, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, - 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x73, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x2e, 0x45, 0x78, 0x70, 0x6f, 0x73, 0x65, 0x50, 0x61, 0x74, 0x68, 0x52, 0x05, - 0x50, 0x61, 0x74, 0x68, 0x73, 0x22, 0xb0, 0x01, 0x0a, 0x0a, 0x45, 0x78, 0x70, 0x6f, 0x73, 0x65, - 0x50, 0x61, 0x74, 0x68, 0x12, 0x22, 0x0a, 0x0c, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, - 0x50, 0x6f, 0x72, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x4c, 0x69, 0x73, 0x74, - 0x65, 0x6e, 0x65, 0x72, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x61, 0x74, 0x68, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x50, 0x61, 0x74, 0x68, 0x12, 0x24, 0x0a, 0x0d, - 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x50, 0x61, 0x74, 0x68, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x0d, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x50, 0x61, 0x74, 0x68, 0x50, 0x6f, - 0x72, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x28, - 0x0a, 0x0f, 0x50, 0x61, 0x72, 0x73, 0x65, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x43, 0x68, 0x65, 0x63, - 0x6b, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x50, 0x61, 0x72, 0x73, 0x65, 0x64, 0x46, - 0x72, 0x6f, 0x6d, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x22, 0x27, 0x0a, 0x11, 0x4d, 0x65, 0x73, 0x68, - 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x12, 0x0a, - 0x04, 0x4d, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4d, 0x6f, 0x64, - 0x65, 0x22, 0x74, 0x0a, 0x16, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, - 0x50, 0x72, 0x6f, 0x78, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x32, 0x0a, 0x14, 0x4f, - 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x50, - 0x6f, 0x72, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x14, 0x4f, 0x75, 0x74, 0x62, 0x6f, - 0x75, 0x6e, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x50, 0x6f, 0x72, 0x74, 0x12, - 0x26, 0x0a, 0x0e, 0x44, 0x69, 0x61, 0x6c, 0x65, 0x64, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6c, - 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x44, 0x69, 0x61, 0x6c, 0x65, 0x64, 0x44, - 0x69, 0x72, 0x65, 0x63, 0x74, 0x6c, 0x79, 0x22, 0xc6, 0x01, 0x0a, 0x10, 0x41, 0x63, 0x63, 0x65, - 0x73, 0x73, 0x4c, 0x6f, 0x67, 0x73, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x18, 0x0a, 0x07, - 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x45, - 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x30, 0x0a, 0x13, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, - 0x65, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x4c, 0x6f, 0x67, 0x73, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x13, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x4c, 0x69, 0x73, 0x74, - 0x65, 0x6e, 0x65, 0x72, 0x4c, 0x6f, 0x67, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x12, 0x0a, 0x04, - 0x50, 0x61, 0x74, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x50, 0x61, 0x74, 0x68, - 0x12, 0x1e, 0x0a, 0x0a, 0x4a, 0x53, 0x4f, 0x4e, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x4a, 0x53, 0x4f, 0x4e, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, - 0x12, 0x1e, 0x0a, 0x0a, 0x54, 0x65, 0x78, 0x74, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x54, 0x65, 0x78, 0x74, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, - 0x22, 0xae, 0x08, 0x0a, 0x11, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x44, 0x65, 0x66, 0x69, - 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x4b, 0x69, 0x6e, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, - 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x12, - 0x0a, 0x04, 0x54, 0x61, 0x67, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x54, 0x61, - 0x67, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x07, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x73, 0x0a, 0x0f, - 0x54, 0x61, 0x67, 0x67, 0x65, 0x64, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x18, - 0x10, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x49, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, + 0x50, 0x61, 0x74, 0x68, 0x52, 0x05, 0x50, 0x61, 0x74, 0x68, 0x73, 0x22, 0xb0, 0x01, 0x0a, 0x0a, + 0x45, 0x78, 0x70, 0x6f, 0x73, 0x65, 0x50, 0x61, 0x74, 0x68, 0x12, 0x22, 0x0a, 0x0c, 0x4c, 0x69, + 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x0c, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x12, + 0x0a, 0x04, 0x50, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x50, 0x61, + 0x74, 0x68, 0x12, 0x24, 0x0a, 0x0d, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x50, 0x61, 0x74, 0x68, 0x50, + 0x6f, 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x4c, 0x6f, 0x63, 0x61, 0x6c, + 0x50, 0x61, 0x74, 0x68, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x74, + 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x50, 0x72, 0x6f, 0x74, + 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x28, 0x0a, 0x0f, 0x50, 0x61, 0x72, 0x73, 0x65, 0x64, 0x46, 0x72, + 0x6f, 0x6d, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x50, + 0x61, 0x72, 0x73, 0x65, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x22, 0x27, + 0x0a, 0x11, 0x4d, 0x65, 0x73, 0x68, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x12, 0x12, 0x0a, 0x04, 0x4d, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x4d, 0x6f, 0x64, 0x65, 0x22, 0x74, 0x0a, 0x16, 0x54, 0x72, 0x61, 0x6e, 0x73, + 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x12, 0x32, 0x0a, 0x14, 0x4f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x4c, 0x69, 0x73, + 0x74, 0x65, 0x6e, 0x65, 0x72, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x14, 0x4f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, + 0x72, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x26, 0x0a, 0x0e, 0x44, 0x69, 0x61, 0x6c, 0x65, 0x64, 0x44, + 0x69, 0x72, 0x65, 0x63, 0x74, 0x6c, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x44, + 0x69, 0x61, 0x6c, 0x65, 0x64, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6c, 0x79, 0x22, 0xc6, 0x01, + 0x0a, 0x10, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x6f, 0x67, 0x73, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x12, 0x18, 0x0a, 0x07, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x07, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x30, 0x0a, 0x13, + 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x4c, + 0x6f, 0x67, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x44, 0x69, 0x73, 0x61, 0x62, + 0x6c, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x4c, 0x6f, 0x67, 0x73, 0x12, 0x12, + 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x54, 0x79, + 0x70, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x61, 0x74, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x50, 0x61, 0x74, 0x68, 0x12, 0x1e, 0x0a, 0x0a, 0x4a, 0x53, 0x4f, 0x4e, 0x46, 0x6f, + 0x72, 0x6d, 0x61, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x4a, 0x53, 0x4f, 0x4e, + 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x54, 0x65, 0x78, 0x74, 0x46, 0x6f, + 0x72, 0x6d, 0x61, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x54, 0x65, 0x78, 0x74, + 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0xae, 0x08, 0x0a, 0x11, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, + 0x4b, 0x69, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4b, 0x69, 0x6e, 0x64, + 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, + 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x54, 0x61, 0x67, 0x73, 0x18, 0x04, 0x20, 0x03, + 0x28, 0x09, 0x52, 0x04, 0x54, 0x61, 0x67, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x41, 0x64, 0x64, 0x72, + 0x65, 0x73, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x41, 0x64, 0x64, 0x72, 0x65, + 0x73, 0x73, 0x12, 0x73, 0x0a, 0x0f, 0x54, 0x61, 0x67, 0x67, 0x65, 0x64, 0x41, 0x64, 0x64, 0x72, + 0x65, 0x73, 0x73, 0x65, 0x73, 0x18, 0x10, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x49, 0x2e, 0x68, 0x61, + 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, + 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, + 0x6e, 0x2e, 0x54, 0x61, 0x67, 0x67, 0x65, 0x64, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, + 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0f, 0x54, 0x61, 0x67, 0x67, 0x65, 0x64, 0x41, 0x64, + 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x12, 0x52, 0x0a, 0x04, 0x4d, 0x65, 0x74, 0x61, 0x18, + 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3e, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x54, 0x61, 0x67, 0x67, - 0x65, 0x64, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x52, 0x0f, 0x54, 0x61, 0x67, 0x67, 0x65, 0x64, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, - 0x73, 0x12, 0x52, 0x0a, 0x04, 0x4d, 0x65, 0x74, 0x61, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x3e, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, - 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x73, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x44, 0x65, 0x66, 0x69, 0x6e, - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, - 0x04, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x07, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x53, 0x6f, 0x63, - 0x6b, 0x65, 0x74, 0x50, 0x61, 0x74, 0x68, 0x18, 0x12, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x53, - 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x50, 0x61, 0x74, 0x68, 0x12, 0x42, 0x0a, 0x05, 0x43, 0x68, 0x65, - 0x63, 0x6b, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, + 0x65, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x74, 0x61, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x12, 0x0a, 0x04, 0x50, + 0x6f, 0x72, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x12, + 0x1e, 0x0a, 0x0a, 0x53, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x50, 0x61, 0x74, 0x68, 0x18, 0x12, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0a, 0x53, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x50, 0x61, 0x74, 0x68, 0x12, + 0x42, 0x0a, 0x05, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, + 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, + 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x54, 0x79, 0x70, 0x65, 0x52, 0x05, 0x43, 0x68, + 0x65, 0x63, 0x6b, 0x12, 0x44, 0x0a, 0x06, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x18, 0x09, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, + 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, + 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x54, 0x79, 0x70, + 0x65, 0x52, 0x06, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x12, 0x44, 0x0a, 0x07, 0x57, 0x65, 0x69, + 0x67, 0x68, 0x74, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x68, 0x61, 0x73, + 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, + 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x57, + 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x52, 0x07, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x12, + 0x14, 0x0a, 0x05, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x2c, 0x0a, 0x11, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x54, + 0x61, 0x67, 0x4f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x11, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x61, 0x67, 0x4f, 0x76, 0x65, 0x72, 0x72, + 0x69, 0x64, 0x65, 0x12, 0x4b, 0x0a, 0x05, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x18, 0x0e, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, + 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x73, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x50, 0x72, + 0x6f, 0x78, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x05, 0x50, 0x72, 0x6f, 0x78, 0x79, + 0x12, 0x58, 0x0a, 0x0e, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x4d, 0x65, + 0x74, 0x61, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, - 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x43, 0x68, 0x65, - 0x63, 0x6b, 0x54, 0x79, 0x70, 0x65, 0x52, 0x05, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x12, 0x44, 0x0a, - 0x06, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2c, 0x2e, - 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, - 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x54, 0x79, 0x70, 0x65, 0x52, 0x06, 0x43, 0x68, 0x65, - 0x63, 0x6b, 0x73, 0x12, 0x44, 0x0a, 0x07, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x18, 0x0a, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, - 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, - 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, - 0x52, 0x07, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x54, 0x6f, 0x6b, - 0x65, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, - 0x2c, 0x0a, 0x11, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x61, 0x67, 0x4f, 0x76, 0x65, 0x72, - 0x72, 0x69, 0x64, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x45, 0x6e, 0x61, 0x62, - 0x6c, 0x65, 0x54, 0x61, 0x67, 0x4f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x12, 0x4b, 0x0a, - 0x05, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x68, + 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x74, 0x65, + 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x52, 0x0e, 0x45, 0x6e, 0x74, 0x65, + 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x4b, 0x0a, 0x07, 0x43, 0x6f, + 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x68, 0x61, + 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, + 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x52, 0x07, + 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x1a, 0x75, 0x0a, 0x14, 0x54, 0x61, 0x67, 0x67, 0x65, + 0x64, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 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, 0x47, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x31, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, + 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x73, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x41, 0x64, 0x64, 0x72, + 0x65, 0x73, 0x73, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x37, + 0x0a, 0x09, 0x4d, 0x65, 0x74, 0x61, 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, 0x22, 0x3e, 0x0a, 0x0e, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x41, 0x64, 0x64, + 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x41, 0x64, 0x64, 0x72, + 0x65, 0x73, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x22, 0x3d, 0x0a, 0x07, 0x57, 0x65, 0x69, 0x67, 0x68, + 0x74, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x50, 0x61, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x07, 0x50, 0x61, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x12, 0x18, 0x0a, 0x07, + 0x57, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x57, + 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x42, 0x92, 0x02, 0x0a, 0x25, 0x63, 0x6f, 0x6d, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x2e, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x52, 0x05, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x12, 0x58, 0x0a, 0x0e, 0x45, 0x6e, - 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x18, 0x11, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, - 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, - 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, - 0x4d, 0x65, 0x74, 0x61, 0x52, 0x0e, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, - 0x4d, 0x65, 0x74, 0x61, 0x12, 0x4b, 0x0a, 0x07, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x18, - 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, - 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, - 0x6c, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x52, 0x07, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, - 0x74, 0x1a, 0x75, 0x0a, 0x14, 0x54, 0x61, 0x67, 0x67, 0x65, 0x64, 0x41, 0x64, 0x64, 0x72, 0x65, - 0x73, 0x73, 0x65, 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, 0x47, 0x0a, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x68, 0x61, 0x73, - 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, - 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x37, 0x0a, 0x09, 0x4d, 0x65, 0x74, 0x61, - 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, 0x22, 0x3e, 0x0a, 0x0e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x41, 0x64, 0x64, 0x72, - 0x65, 0x73, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x12, 0x0a, - 0x04, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x50, 0x6f, 0x72, - 0x74, 0x22, 0x3d, 0x0a, 0x07, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x12, 0x18, 0x0a, 0x07, - 0x50, 0x61, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x50, - 0x61, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x12, 0x18, 0x0a, 0x07, 0x57, 0x61, 0x72, 0x6e, 0x69, 0x6e, - 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x57, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, - 0x42, 0x8a, 0x02, 0x0a, 0x25, 0x63, 0x6f, 0x6d, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, - 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, - 0x61, 0x6c, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x42, 0x0c, 0x53, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x2b, 0x67, 0x69, 0x74, 0x68, - 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, - 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x70, 0x62, - 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0xa2, 0x02, 0x04, 0x48, 0x43, 0x49, 0x53, 0xaa, 0x02, - 0x21, 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x43, 0x6f, 0x6e, 0x73, 0x75, - 0x6c, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0xca, 0x02, 0x21, 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x5c, 0x43, - 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x5c, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5c, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0xe2, 0x02, 0x2d, 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, - 0x72, 0x70, 0x5c, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x5c, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, - 0x61, 0x6c, 0x5c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, - 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x24, 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, - 0x72, 0x70, 0x3a, 0x3a, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x3a, 0x3a, 0x49, 0x6e, 0x74, 0x65, - 0x72, 0x6e, 0x61, 0x6c, 0x3a, 0x3a, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x62, 0x06, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x42, 0x0c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, + 0x5a, 0x33, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x68, 0x61, 0x73, + 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2f, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x2f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2f, 0x70, 0x62, 0x73, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0xa2, 0x02, 0x04, 0x48, 0x43, 0x49, 0x53, 0xaa, 0x02, 0x21, 0x48, + 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, + 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0xca, 0x02, 0x21, 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x5c, 0x43, 0x6f, 0x6e, + 0x73, 0x75, 0x6c, 0x5c, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5c, 0x53, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0xe2, 0x02, 0x2d, 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, + 0x5c, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x5c, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, + 0x5c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, + 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x24, 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, + 0x3a, 0x3a, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x3a, 0x3a, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, + 0x61, 0x6c, 0x3a, 0x3a, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x33, } var ( - file_proto_pbservice_service_proto_rawDescOnce sync.Once - file_proto_pbservice_service_proto_rawDescData = file_proto_pbservice_service_proto_rawDesc + file_private_pbservice_service_proto_rawDescOnce sync.Once + file_private_pbservice_service_proto_rawDescData = file_private_pbservice_service_proto_rawDesc ) -func file_proto_pbservice_service_proto_rawDescGZIP() []byte { - file_proto_pbservice_service_proto_rawDescOnce.Do(func() { - file_proto_pbservice_service_proto_rawDescData = protoimpl.X.CompressGZIP(file_proto_pbservice_service_proto_rawDescData) +func file_private_pbservice_service_proto_rawDescGZIP() []byte { + file_private_pbservice_service_proto_rawDescOnce.Do(func() { + file_private_pbservice_service_proto_rawDescData = protoimpl.X.CompressGZIP(file_private_pbservice_service_proto_rawDescData) }) - return file_proto_pbservice_service_proto_rawDescData + return file_private_pbservice_service_proto_rawDescData } -var file_proto_pbservice_service_proto_msgTypes = make([]protoimpl.MessageInfo, 14) -var file_proto_pbservice_service_proto_goTypes = []interface{}{ +var file_private_pbservice_service_proto_msgTypes = make([]protoimpl.MessageInfo, 14) +var file_private_pbservice_service_proto_goTypes = []interface{}{ (*ConnectProxyConfig)(nil), // 0: hashicorp.consul.internal.service.ConnectProxyConfig (*Upstream)(nil), // 1: hashicorp.consul.internal.service.Upstream (*ServiceConnect)(nil), // 2: hashicorp.consul.internal.service.ServiceConnect @@ -1517,7 +1518,7 @@ var file_proto_pbservice_service_proto_goTypes = []interface{}{ (*CheckType)(nil), // 16: hashicorp.consul.internal.service.CheckType (*pbcommon.EnterpriseMeta)(nil), // 17: hashicorp.consul.internal.common.EnterpriseMeta } -var file_proto_pbservice_service_proto_depIdxs = []int32{ +var file_private_pbservice_service_proto_depIdxs = []int32{ 14, // 0: hashicorp.consul.internal.service.ConnectProxyConfig.Config:type_name -> google.protobuf.Struct 1, // 1: hashicorp.consul.internal.service.ConnectProxyConfig.Upstreams:type_name -> hashicorp.consul.internal.service.Upstream 6, // 2: hashicorp.consul.internal.service.ConnectProxyConfig.MeshGateway:type_name -> hashicorp.consul.internal.service.MeshGatewayConfig @@ -1546,14 +1547,14 @@ var file_proto_pbservice_service_proto_depIdxs = []int32{ 0, // [0:21] is the sub-list for field type_name } -func init() { file_proto_pbservice_service_proto_init() } -func file_proto_pbservice_service_proto_init() { - if File_proto_pbservice_service_proto != nil { +func init() { file_private_pbservice_service_proto_init() } +func file_private_pbservice_service_proto_init() { + if File_private_pbservice_service_proto != nil { return } - file_proto_pbservice_healthcheck_proto_init() + file_private_pbservice_healthcheck_proto_init() if !protoimpl.UnsafeEnabled { - file_proto_pbservice_service_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + file_private_pbservice_service_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ConnectProxyConfig); i { case 0: return &v.state @@ -1565,7 +1566,7 @@ func file_proto_pbservice_service_proto_init() { return nil } } - file_proto_pbservice_service_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + file_private_pbservice_service_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Upstream); i { case 0: return &v.state @@ -1577,7 +1578,7 @@ func file_proto_pbservice_service_proto_init() { return nil } } - file_proto_pbservice_service_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + file_private_pbservice_service_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ServiceConnect); i { case 0: return &v.state @@ -1589,7 +1590,7 @@ func file_proto_pbservice_service_proto_init() { return nil } } - file_proto_pbservice_service_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + file_private_pbservice_service_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PeeringServiceMeta); i { case 0: return &v.state @@ -1601,7 +1602,7 @@ func file_proto_pbservice_service_proto_init() { return nil } } - file_proto_pbservice_service_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + file_private_pbservice_service_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ExposeConfig); i { case 0: return &v.state @@ -1613,7 +1614,7 @@ func file_proto_pbservice_service_proto_init() { return nil } } - file_proto_pbservice_service_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + file_private_pbservice_service_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ExposePath); i { case 0: return &v.state @@ -1625,7 +1626,7 @@ func file_proto_pbservice_service_proto_init() { return nil } } - file_proto_pbservice_service_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { + file_private_pbservice_service_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*MeshGatewayConfig); i { case 0: return &v.state @@ -1637,7 +1638,7 @@ func file_proto_pbservice_service_proto_init() { return nil } } - file_proto_pbservice_service_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { + file_private_pbservice_service_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*TransparentProxyConfig); i { case 0: return &v.state @@ -1649,7 +1650,7 @@ func file_proto_pbservice_service_proto_init() { return nil } } - file_proto_pbservice_service_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { + file_private_pbservice_service_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*AccessLogsConfig); i { case 0: return &v.state @@ -1661,7 +1662,7 @@ func file_proto_pbservice_service_proto_init() { return nil } } - file_proto_pbservice_service_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { + file_private_pbservice_service_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ServiceDefinition); i { case 0: return &v.state @@ -1673,7 +1674,7 @@ func file_proto_pbservice_service_proto_init() { return nil } } - file_proto_pbservice_service_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { + file_private_pbservice_service_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ServiceAddress); i { case 0: return &v.state @@ -1685,7 +1686,7 @@ func file_proto_pbservice_service_proto_init() { return nil } } - file_proto_pbservice_service_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { + file_private_pbservice_service_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Weights); i { case 0: return &v.state @@ -1702,18 +1703,18 @@ func file_proto_pbservice_service_proto_init() { out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_proto_pbservice_service_proto_rawDesc, + RawDescriptor: file_private_pbservice_service_proto_rawDesc, NumEnums: 0, NumMessages: 14, NumExtensions: 0, NumServices: 0, }, - GoTypes: file_proto_pbservice_service_proto_goTypes, - DependencyIndexes: file_proto_pbservice_service_proto_depIdxs, - MessageInfos: file_proto_pbservice_service_proto_msgTypes, + GoTypes: file_private_pbservice_service_proto_goTypes, + DependencyIndexes: file_private_pbservice_service_proto_depIdxs, + MessageInfos: file_private_pbservice_service_proto_msgTypes, }.Build() - File_proto_pbservice_service_proto = out.File - file_proto_pbservice_service_proto_rawDesc = nil - file_proto_pbservice_service_proto_goTypes = nil - file_proto_pbservice_service_proto_depIdxs = nil + File_private_pbservice_service_proto = out.File + file_private_pbservice_service_proto_rawDesc = nil + file_private_pbservice_service_proto_goTypes = nil + file_private_pbservice_service_proto_depIdxs = nil } diff --git a/proto/pbservice/service.proto b/proto/private/pbservice/service.proto similarity index 99% rename from proto/pbservice/service.proto rename to proto/private/pbservice/service.proto index 22c8e2b75d0..b25363e2f87 100644 --- a/proto/pbservice/service.proto +++ b/proto/private/pbservice/service.proto @@ -3,8 +3,8 @@ syntax = "proto3"; package hashicorp.consul.internal.service; import "google/protobuf/struct.proto"; -import "proto/pbcommon/common.proto"; -import "proto/pbservice/healthcheck.proto"; +import "private/pbcommon/common.proto"; +import "private/pbservice/healthcheck.proto"; // ConnectProxyConfig describes the configuration needed for any proxy managed // or unmanaged. It describes a single logical service's listener and optionally diff --git a/proto/pbstatus/status.pb.binary.go b/proto/private/pbstatus/status.pb.binary.go similarity index 90% rename from proto/pbstatus/status.pb.binary.go rename to proto/private/pbstatus/status.pb.binary.go index 160fad658b7..f4b4c9e1a7b 100644 --- a/proto/pbstatus/status.pb.binary.go +++ b/proto/private/pbstatus/status.pb.binary.go @@ -1,5 +1,5 @@ // Code generated by protoc-gen-go-binary. DO NOT EDIT. -// source: proto/pbstatus/status.proto +// source: private/pbstatus/status.proto package pbstatus diff --git a/proto/private/pbstatus/status.pb.go b/proto/private/pbstatus/status.pb.go new file mode 100644 index 00000000000..c3d1568c6d6 --- /dev/null +++ b/proto/private/pbstatus/status.pb.go @@ -0,0 +1,212 @@ +// Copyright 2020 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.28.1 +// protoc (unknown) +// source: private/pbstatus/status.proto + +package pbstatus + +import ( + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + anypb "google.golang.org/protobuf/types/known/anypb" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +// The `Status` type defines a logical error model that is suitable for +// different programming environments, including REST APIs and RPC APIs. It is +// used by [gRPC](https://github.com/grpc). Each `Status` message contains +// three pieces of data: error code, error message, and error details. +// +// You can find out more about this error model and how to work with it in the +// [API Design Guide](https://cloud.google.com/apis/design/errors). +type Status struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The status code, which should be an enum value of [google.rpc.Code][google.rpc.Code]. + Code int32 `protobuf:"varint,1,opt,name=code,proto3" json:"code,omitempty"` + // A developer-facing error message, which should be in English. Any + // user-facing error message should be localized and sent in the + // [google.rpc.Status.details][google.rpc.Status.details] field, or localized by the client. + Message string `protobuf:"bytes,2,opt,name=message,proto3" json:"message,omitempty"` + // A list of messages that carry the error details. There is a common set of + // message types for APIs to use. + Details []*anypb.Any `protobuf:"bytes,3,rep,name=details,proto3" json:"details,omitempty"` +} + +func (x *Status) Reset() { + *x = Status{} + if protoimpl.UnsafeEnabled { + mi := &file_private_pbstatus_status_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Status) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Status) ProtoMessage() {} + +func (x *Status) ProtoReflect() protoreflect.Message { + mi := &file_private_pbstatus_status_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Status.ProtoReflect.Descriptor instead. +func (*Status) Descriptor() ([]byte, []int) { + return file_private_pbstatus_status_proto_rawDescGZIP(), []int{0} +} + +func (x *Status) GetCode() int32 { + if x != nil { + return x.Code + } + return 0 +} + +func (x *Status) GetMessage() string { + if x != nil { + return x.Message + } + return "" +} + +func (x *Status) GetDetails() []*anypb.Any { + if x != nil { + return x.Details + } + return nil +} + +var File_private_pbstatus_status_proto protoreflect.FileDescriptor + +var file_private_pbstatus_status_proto_rawDesc = []byte{ + 0x0a, 0x1d, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2f, 0x70, 0x62, 0x73, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, + 0x20, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, + 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x1a, 0x19, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2f, 0x61, 0x6e, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x66, 0x0a, 0x06, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, + 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, + 0x73, 0x61, 0x67, 0x65, 0x12, 0x2e, 0x0a, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, + 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x41, 0x6e, 0x79, 0x52, 0x07, 0x64, 0x65, 0x74, + 0x61, 0x69, 0x6c, 0x73, 0x42, 0x8b, 0x02, 0x0a, 0x24, 0x63, 0x6f, 0x6d, 0x2e, 0x68, 0x61, 0x73, + 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, + 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x42, 0x0b, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x32, 0x67, 0x69, + 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, + 0x72, 0x70, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, + 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2f, 0x70, 0x62, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, + 0xa2, 0x02, 0x04, 0x48, 0x43, 0x49, 0x53, 0xaa, 0x02, 0x20, 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, + 0x6f, 0x72, 0x70, 0x2e, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x72, + 0x6e, 0x61, 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0xca, 0x02, 0x20, 0x48, 0x61, 0x73, + 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x5c, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x5c, 0x49, 0x6e, + 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5c, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0xe2, 0x02, 0x2c, + 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x5c, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, + 0x5c, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5c, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x23, 0x48, + 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x3a, 0x3a, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, + 0x3a, 0x3a, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x3a, 0x3a, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_private_pbstatus_status_proto_rawDescOnce sync.Once + file_private_pbstatus_status_proto_rawDescData = file_private_pbstatus_status_proto_rawDesc +) + +func file_private_pbstatus_status_proto_rawDescGZIP() []byte { + file_private_pbstatus_status_proto_rawDescOnce.Do(func() { + file_private_pbstatus_status_proto_rawDescData = protoimpl.X.CompressGZIP(file_private_pbstatus_status_proto_rawDescData) + }) + return file_private_pbstatus_status_proto_rawDescData +} + +var file_private_pbstatus_status_proto_msgTypes = make([]protoimpl.MessageInfo, 1) +var file_private_pbstatus_status_proto_goTypes = []interface{}{ + (*Status)(nil), // 0: hashicorp.consul.internal.status.Status + (*anypb.Any)(nil), // 1: google.protobuf.Any +} +var file_private_pbstatus_status_proto_depIdxs = []int32{ + 1, // 0: hashicorp.consul.internal.status.Status.details:type_name -> google.protobuf.Any + 1, // [1:1] is the sub-list for method output_type + 1, // [1:1] is the sub-list for method input_type + 1, // [1:1] is the sub-list for extension type_name + 1, // [1:1] is the sub-list for extension extendee + 0, // [0:1] is the sub-list for field type_name +} + +func init() { file_private_pbstatus_status_proto_init() } +func file_private_pbstatus_status_proto_init() { + if File_private_pbstatus_status_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_private_pbstatus_status_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Status); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_private_pbstatus_status_proto_rawDesc, + NumEnums: 0, + NumMessages: 1, + NumExtensions: 0, + NumServices: 0, + }, + GoTypes: file_private_pbstatus_status_proto_goTypes, + DependencyIndexes: file_private_pbstatus_status_proto_depIdxs, + MessageInfos: file_private_pbstatus_status_proto_msgTypes, + }.Build() + File_private_pbstatus_status_proto = out.File + file_private_pbstatus_status_proto_rawDesc = nil + file_private_pbstatus_status_proto_goTypes = nil + file_private_pbstatus_status_proto_depIdxs = nil +} diff --git a/proto/pbstatus/status.proto b/proto/private/pbstatus/status.proto similarity index 100% rename from proto/pbstatus/status.proto rename to proto/private/pbstatus/status.proto diff --git a/proto/pbsubscribe/subscribe.go b/proto/private/pbsubscribe/subscribe.go similarity index 100% rename from proto/pbsubscribe/subscribe.go rename to proto/private/pbsubscribe/subscribe.go diff --git a/proto/pbsubscribe/subscribe.pb.binary.go b/proto/private/pbsubscribe/subscribe.pb.binary.go similarity index 97% rename from proto/pbsubscribe/subscribe.pb.binary.go rename to proto/private/pbsubscribe/subscribe.pb.binary.go index 188eff1f57f..51e697cc9d7 100644 --- a/proto/pbsubscribe/subscribe.pb.binary.go +++ b/proto/private/pbsubscribe/subscribe.pb.binary.go @@ -1,5 +1,5 @@ // Code generated by protoc-gen-go-binary. DO NOT EDIT. -// source: proto/pbsubscribe/subscribe.proto +// source: private/pbsubscribe/subscribe.proto package pbsubscribe diff --git a/proto/pbsubscribe/subscribe.pb.go b/proto/private/pbsubscribe/subscribe.pb.go similarity index 61% rename from proto/pbsubscribe/subscribe.pb.go rename to proto/private/pbsubscribe/subscribe.pb.go index b6f7b4eaec4..3338e5c7e6a 100644 --- a/proto/pbsubscribe/subscribe.pb.go +++ b/proto/private/pbsubscribe/subscribe.pb.go @@ -1,11 +1,11 @@ // -//Package event provides a service for subscribing to state change events. +// Package event provides a service for subscribing to state change events. // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.28.1 // protoc (unknown) -// source: proto/pbsubscribe/subscribe.proto +// source: private/pbsubscribe/subscribe.proto // TODO: ideally we would have prefixed this package as // "hashicorp.consul.internal.subscribe" before releasing but now correcting this will @@ -17,9 +17,9 @@ package pbsubscribe import ( _ "github.com/hashicorp/consul/proto-public/annotations/ratelimit" - pbcommon "github.com/hashicorp/consul/proto/pbcommon" - pbconfigentry "github.com/hashicorp/consul/proto/pbconfigentry" - pbservice "github.com/hashicorp/consul/proto/pbservice" + pbcommon "github.com/hashicorp/consul/proto/private/pbcommon" + pbconfigentry "github.com/hashicorp/consul/proto/private/pbconfigentry" + pbservice "github.com/hashicorp/consul/proto/private/pbservice" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" reflect "reflect" @@ -118,11 +118,11 @@ func (x Topic) String() string { } func (Topic) Descriptor() protoreflect.EnumDescriptor { - return file_proto_pbsubscribe_subscribe_proto_enumTypes[0].Descriptor() + return file_private_pbsubscribe_subscribe_proto_enumTypes[0].Descriptor() } func (Topic) Type() protoreflect.EnumType { - return &file_proto_pbsubscribe_subscribe_proto_enumTypes[0] + return &file_private_pbsubscribe_subscribe_proto_enumTypes[0] } func (x Topic) Number() protoreflect.EnumNumber { @@ -131,7 +131,7 @@ func (x Topic) Number() protoreflect.EnumNumber { // Deprecated: Use Topic.Descriptor instead. func (Topic) EnumDescriptor() ([]byte, []int) { - return file_proto_pbsubscribe_subscribe_proto_rawDescGZIP(), []int{0} + return file_private_pbsubscribe_subscribe_proto_rawDescGZIP(), []int{0} } type CatalogOp int32 @@ -164,11 +164,11 @@ func (x CatalogOp) String() string { } func (CatalogOp) Descriptor() protoreflect.EnumDescriptor { - return file_proto_pbsubscribe_subscribe_proto_enumTypes[1].Descriptor() + return file_private_pbsubscribe_subscribe_proto_enumTypes[1].Descriptor() } func (CatalogOp) Type() protoreflect.EnumType { - return &file_proto_pbsubscribe_subscribe_proto_enumTypes[1] + return &file_private_pbsubscribe_subscribe_proto_enumTypes[1] } func (x CatalogOp) Number() protoreflect.EnumNumber { @@ -177,7 +177,7 @@ func (x CatalogOp) Number() protoreflect.EnumNumber { // Deprecated: Use CatalogOp.Descriptor instead. func (CatalogOp) EnumDescriptor() ([]byte, []int) { - return file_proto_pbsubscribe_subscribe_proto_rawDescGZIP(), []int{1} + return file_private_pbsubscribe_subscribe_proto_rawDescGZIP(), []int{1} } type ConfigEntryUpdate_UpdateOp int32 @@ -210,11 +210,11 @@ func (x ConfigEntryUpdate_UpdateOp) String() string { } func (ConfigEntryUpdate_UpdateOp) Descriptor() protoreflect.EnumDescriptor { - return file_proto_pbsubscribe_subscribe_proto_enumTypes[2].Descriptor() + return file_private_pbsubscribe_subscribe_proto_enumTypes[2].Descriptor() } func (ConfigEntryUpdate_UpdateOp) Type() protoreflect.EnumType { - return &file_proto_pbsubscribe_subscribe_proto_enumTypes[2] + return &file_private_pbsubscribe_subscribe_proto_enumTypes[2] } func (x ConfigEntryUpdate_UpdateOp) Number() protoreflect.EnumNumber { @@ -223,7 +223,7 @@ func (x ConfigEntryUpdate_UpdateOp) Number() protoreflect.EnumNumber { // Deprecated: Use ConfigEntryUpdate_UpdateOp.Descriptor instead. func (ConfigEntryUpdate_UpdateOp) EnumDescriptor() ([]byte, []int) { - return file_proto_pbsubscribe_subscribe_proto_rawDescGZIP(), []int{5, 0} + return file_private_pbsubscribe_subscribe_proto_rawDescGZIP(), []int{5, 0} } type NamedSubject struct { @@ -253,7 +253,7 @@ type NamedSubject struct { func (x *NamedSubject) Reset() { *x = NamedSubject{} if protoimpl.UnsafeEnabled { - mi := &file_proto_pbsubscribe_subscribe_proto_msgTypes[0] + mi := &file_private_pbsubscribe_subscribe_proto_msgTypes[0] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -266,7 +266,7 @@ func (x *NamedSubject) String() string { func (*NamedSubject) ProtoMessage() {} func (x *NamedSubject) ProtoReflect() protoreflect.Message { - mi := &file_proto_pbsubscribe_subscribe_proto_msgTypes[0] + mi := &file_private_pbsubscribe_subscribe_proto_msgTypes[0] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -279,7 +279,7 @@ func (x *NamedSubject) ProtoReflect() protoreflect.Message { // Deprecated: Use NamedSubject.ProtoReflect.Descriptor instead. func (*NamedSubject) Descriptor() ([]byte, []int) { - return file_proto_pbsubscribe_subscribe_proto_rawDescGZIP(), []int{0} + return file_private_pbsubscribe_subscribe_proto_rawDescGZIP(), []int{0} } func (x *NamedSubject) GetKey() string { @@ -354,7 +354,7 @@ type SubscribeRequest struct { func (x *SubscribeRequest) Reset() { *x = SubscribeRequest{} if protoimpl.UnsafeEnabled { - mi := &file_proto_pbsubscribe_subscribe_proto_msgTypes[1] + mi := &file_private_pbsubscribe_subscribe_proto_msgTypes[1] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -367,7 +367,7 @@ func (x *SubscribeRequest) String() string { func (*SubscribeRequest) ProtoMessage() {} func (x *SubscribeRequest) ProtoReflect() protoreflect.Message { - mi := &file_proto_pbsubscribe_subscribe_proto_msgTypes[1] + mi := &file_private_pbsubscribe_subscribe_proto_msgTypes[1] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -380,7 +380,7 @@ func (x *SubscribeRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SubscribeRequest.ProtoReflect.Descriptor instead. func (*SubscribeRequest) Descriptor() ([]byte, []int) { - return file_proto_pbsubscribe_subscribe_proto_rawDescGZIP(), []int{1} + return file_private_pbsubscribe_subscribe_proto_rawDescGZIP(), []int{1} } func (x *SubscribeRequest) GetTopic() Topic { @@ -510,7 +510,7 @@ type Event struct { func (x *Event) Reset() { *x = Event{} if protoimpl.UnsafeEnabled { - mi := &file_proto_pbsubscribe_subscribe_proto_msgTypes[2] + mi := &file_private_pbsubscribe_subscribe_proto_msgTypes[2] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -523,7 +523,7 @@ func (x *Event) String() string { func (*Event) ProtoMessage() {} func (x *Event) ProtoReflect() protoreflect.Message { - mi := &file_proto_pbsubscribe_subscribe_proto_msgTypes[2] + mi := &file_private_pbsubscribe_subscribe_proto_msgTypes[2] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -536,7 +536,7 @@ func (x *Event) ProtoReflect() protoreflect.Message { // Deprecated: Use Event.ProtoReflect.Descriptor instead. func (*Event) Descriptor() ([]byte, []int) { - return file_proto_pbsubscribe_subscribe_proto_rawDescGZIP(), []int{2} + return file_private_pbsubscribe_subscribe_proto_rawDescGZIP(), []int{2} } func (x *Event) GetIndex() uint64 { @@ -661,7 +661,7 @@ type EventBatch struct { func (x *EventBatch) Reset() { *x = EventBatch{} if protoimpl.UnsafeEnabled { - mi := &file_proto_pbsubscribe_subscribe_proto_msgTypes[3] + mi := &file_private_pbsubscribe_subscribe_proto_msgTypes[3] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -674,7 +674,7 @@ func (x *EventBatch) String() string { func (*EventBatch) ProtoMessage() {} func (x *EventBatch) ProtoReflect() protoreflect.Message { - mi := &file_proto_pbsubscribe_subscribe_proto_msgTypes[3] + mi := &file_private_pbsubscribe_subscribe_proto_msgTypes[3] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -687,7 +687,7 @@ func (x *EventBatch) ProtoReflect() protoreflect.Message { // Deprecated: Use EventBatch.ProtoReflect.Descriptor instead. func (*EventBatch) Descriptor() ([]byte, []int) { - return file_proto_pbsubscribe_subscribe_proto_rawDescGZIP(), []int{3} + return file_private_pbsubscribe_subscribe_proto_rawDescGZIP(), []int{3} } func (x *EventBatch) GetEvents() []*Event { @@ -709,7 +709,7 @@ type ServiceHealthUpdate struct { func (x *ServiceHealthUpdate) Reset() { *x = ServiceHealthUpdate{} if protoimpl.UnsafeEnabled { - mi := &file_proto_pbsubscribe_subscribe_proto_msgTypes[4] + mi := &file_private_pbsubscribe_subscribe_proto_msgTypes[4] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -722,7 +722,7 @@ func (x *ServiceHealthUpdate) String() string { func (*ServiceHealthUpdate) ProtoMessage() {} func (x *ServiceHealthUpdate) ProtoReflect() protoreflect.Message { - mi := &file_proto_pbsubscribe_subscribe_proto_msgTypes[4] + mi := &file_private_pbsubscribe_subscribe_proto_msgTypes[4] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -735,7 +735,7 @@ func (x *ServiceHealthUpdate) ProtoReflect() protoreflect.Message { // Deprecated: Use ServiceHealthUpdate.ProtoReflect.Descriptor instead. func (*ServiceHealthUpdate) Descriptor() ([]byte, []int) { - return file_proto_pbsubscribe_subscribe_proto_rawDescGZIP(), []int{4} + return file_private_pbsubscribe_subscribe_proto_rawDescGZIP(), []int{4} } func (x *ServiceHealthUpdate) GetOp() CatalogOp { @@ -764,7 +764,7 @@ type ConfigEntryUpdate struct { func (x *ConfigEntryUpdate) Reset() { *x = ConfigEntryUpdate{} if protoimpl.UnsafeEnabled { - mi := &file_proto_pbsubscribe_subscribe_proto_msgTypes[5] + mi := &file_private_pbsubscribe_subscribe_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -777,7 +777,7 @@ func (x *ConfigEntryUpdate) String() string { func (*ConfigEntryUpdate) ProtoMessage() {} func (x *ConfigEntryUpdate) ProtoReflect() protoreflect.Message { - mi := &file_proto_pbsubscribe_subscribe_proto_msgTypes[5] + mi := &file_private_pbsubscribe_subscribe_proto_msgTypes[5] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -790,7 +790,7 @@ func (x *ConfigEntryUpdate) ProtoReflect() protoreflect.Message { // Deprecated: Use ConfigEntryUpdate.ProtoReflect.Descriptor instead. func (*ConfigEntryUpdate) Descriptor() ([]byte, []int) { - return file_proto_pbsubscribe_subscribe_proto_rawDescGZIP(), []int{5} + return file_private_pbsubscribe_subscribe_proto_rawDescGZIP(), []int{5} } func (x *ConfigEntryUpdate) GetOp() ConfigEntryUpdate_UpdateOp { @@ -821,7 +821,7 @@ type ServiceListUpdate struct { func (x *ServiceListUpdate) Reset() { *x = ServiceListUpdate{} if protoimpl.UnsafeEnabled { - mi := &file_proto_pbsubscribe_subscribe_proto_msgTypes[6] + mi := &file_private_pbsubscribe_subscribe_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -834,7 +834,7 @@ func (x *ServiceListUpdate) String() string { func (*ServiceListUpdate) ProtoMessage() {} func (x *ServiceListUpdate) ProtoReflect() protoreflect.Message { - mi := &file_proto_pbsubscribe_subscribe_proto_msgTypes[6] + mi := &file_private_pbsubscribe_subscribe_proto_msgTypes[6] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -847,7 +847,7 @@ func (x *ServiceListUpdate) ProtoReflect() protoreflect.Message { // Deprecated: Use ServiceListUpdate.ProtoReflect.Descriptor instead. func (*ServiceListUpdate) Descriptor() ([]byte, []int) { - return file_proto_pbsubscribe_subscribe_proto_rawDescGZIP(), []int{6} + return file_private_pbsubscribe_subscribe_proto_rawDescGZIP(), []int{6} } func (x *ServiceListUpdate) GetOp() CatalogOp { @@ -878,167 +878,167 @@ func (x *ServiceListUpdate) GetPeerName() string { return "" } -var File_proto_pbsubscribe_subscribe_proto protoreflect.FileDescriptor - -var file_proto_pbsubscribe_subscribe_proto_rawDesc = []byte{ - 0x0a, 0x21, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x70, 0x62, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, - 0x69, 0x62, 0x65, 0x2f, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x12, 0x09, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x1a, 0x32, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2d, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x2f, 0x61, 0x6e, 0x6e, - 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x72, 0x61, 0x74, 0x65, 0x6c, 0x69, 0x6d, - 0x69, 0x74, 0x2f, 0x72, 0x61, 0x74, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x1a, 0x1b, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x70, 0x62, 0x63, 0x6f, 0x6d, 0x6d, - 0x6f, 0x6e, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, - 0x26, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x70, 0x62, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, - 0x6e, 0x74, 0x72, 0x79, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x65, 0x6e, 0x74, 0x72, - 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1a, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x70, - 0x62, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2f, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x22, 0x78, 0x0a, 0x0c, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x53, 0x75, 0x62, 0x6a, - 0x65, 0x63, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x4b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x4b, 0x65, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, - 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x50, 0x65, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x50, 0x65, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0xe6, 0x02, - 0x0a, 0x10, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x26, 0x0a, 0x05, 0x54, 0x6f, 0x70, 0x69, 0x63, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0e, 0x32, 0x10, 0x2e, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x2e, 0x54, 0x6f, - 0x70, 0x69, 0x63, 0x52, 0x05, 0x54, 0x6f, 0x70, 0x69, 0x63, 0x12, 0x10, 0x0a, 0x03, 0x4b, 0x65, - 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x4b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, - 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x54, 0x6f, 0x6b, - 0x65, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x04, 0x52, 0x05, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1e, 0x0a, 0x0a, 0x44, 0x61, 0x74, 0x61, - 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x44, 0x61, - 0x74, 0x61, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x12, 0x1c, 0x0a, 0x09, 0x4e, 0x61, 0x6d, 0x65, - 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x4e, 0x61, 0x6d, - 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, - 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x50, 0x61, 0x72, 0x74, 0x69, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x50, 0x65, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, - 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x50, 0x65, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, - 0x12, 0x2a, 0x0a, 0x0f, 0x57, 0x69, 0x6c, 0x64, 0x63, 0x61, 0x72, 0x64, 0x53, 0x75, 0x62, 0x6a, - 0x65, 0x63, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x0f, 0x57, 0x69, 0x6c, - 0x64, 0x63, 0x61, 0x72, 0x64, 0x53, 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x3d, 0x0a, 0x0c, - 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x53, 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x0a, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x2e, 0x4e, - 0x61, 0x6d, 0x65, 0x64, 0x53, 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x48, 0x00, 0x52, 0x0c, 0x4e, - 0x61, 0x6d, 0x65, 0x64, 0x53, 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x42, 0x09, 0x0a, 0x07, 0x53, - 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x81, 0x03, 0x0a, 0x05, 0x45, 0x76, 0x65, 0x6e, 0x74, - 0x12, 0x14, 0x0a, 0x05, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, - 0x05, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x26, 0x0a, 0x0d, 0x45, 0x6e, 0x64, 0x4f, 0x66, 0x53, - 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, - 0x0d, 0x45, 0x6e, 0x64, 0x4f, 0x66, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x12, 0x32, - 0x0a, 0x13, 0x4e, 0x65, 0x77, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x54, 0x6f, 0x46, - 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x13, 0x4e, - 0x65, 0x77, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x54, 0x6f, 0x46, 0x6f, 0x6c, 0x6c, - 0x6f, 0x77, 0x12, 0x37, 0x0a, 0x0a, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x42, 0x61, 0x74, 0x63, 0x68, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, - 0x62, 0x65, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x42, 0x61, 0x74, 0x63, 0x68, 0x48, 0x00, 0x52, - 0x0a, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x42, 0x61, 0x74, 0x63, 0x68, 0x12, 0x46, 0x0a, 0x0d, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x18, 0x0a, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x2e, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x55, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x48, 0x00, 0x52, 0x0d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x48, 0x65, 0x61, - 0x6c, 0x74, 0x68, 0x12, 0x40, 0x0a, 0x0b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x73, 0x75, 0x62, 0x73, 0x63, - 0x72, 0x69, 0x62, 0x65, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x48, 0x00, 0x52, 0x0b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x38, 0x0a, 0x07, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, - 0x62, 0x65, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x48, 0x00, 0x52, 0x07, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x42, - 0x09, 0x0a, 0x07, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x22, 0x36, 0x0a, 0x0a, 0x45, 0x76, - 0x65, 0x6e, 0x74, 0x42, 0x61, 0x74, 0x63, 0x68, 0x12, 0x28, 0x0a, 0x06, 0x45, 0x76, 0x65, 0x6e, - 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x73, 0x75, 0x62, 0x73, 0x63, - 0x72, 0x69, 0x62, 0x65, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x06, 0x45, 0x76, 0x65, 0x6e, - 0x74, 0x73, 0x22, 0x9c, 0x01, 0x0a, 0x13, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x48, 0x65, - 0x61, 0x6c, 0x74, 0x68, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x24, 0x0a, 0x02, 0x4f, 0x70, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, - 0x62, 0x65, 0x2e, 0x43, 0x61, 0x74, 0x61, 0x6c, 0x6f, 0x67, 0x4f, 0x70, 0x52, 0x02, 0x4f, 0x70, - 0x12, 0x5f, 0x0a, 0x10, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x4e, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x68, 0x61, 0x73, - 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, - 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x43, - 0x68, 0x65, 0x63, 0x6b, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x52, - 0x10, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4e, 0x6f, 0x64, - 0x65, 0x22, 0xc4, 0x01, 0x0a, 0x11, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x35, 0x0a, 0x02, 0x4f, 0x70, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0e, 0x32, 0x25, 0x2e, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x2e, +var File_private_pbsubscribe_subscribe_proto protoreflect.FileDescriptor + +var file_private_pbsubscribe_subscribe_proto_rawDesc = []byte{ + 0x0a, 0x23, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2f, 0x70, 0x62, 0x73, 0x75, 0x62, 0x73, + 0x63, 0x72, 0x69, 0x62, 0x65, 0x2f, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x09, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, + 0x1a, 0x25, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x72, 0x61, + 0x74, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x2f, 0x72, 0x61, 0x74, 0x65, 0x6c, 0x69, 0x6d, 0x69, + 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1d, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, + 0x2f, 0x70, 0x62, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x28, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2f, + 0x70, 0x62, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2f, 0x63, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x1a, 0x1c, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2f, 0x70, 0x62, 0x73, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x2f, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x78, + 0x0a, 0x0c, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x53, 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x10, + 0x0a, 0x03, 0x4b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x4b, 0x65, 0x79, + 0x12, 0x1c, 0x0a, 0x09, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x09, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1c, + 0x0a, 0x09, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x09, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, + 0x50, 0x65, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x50, 0x65, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0xe6, 0x02, 0x0a, 0x10, 0x53, 0x75, 0x62, + 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x26, 0x0a, + 0x05, 0x54, 0x6f, 0x70, 0x69, 0x63, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x73, + 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x2e, 0x54, 0x6f, 0x70, 0x69, 0x63, 0x52, 0x05, + 0x54, 0x6f, 0x70, 0x69, 0x63, 0x12, 0x10, 0x0a, 0x03, 0x4b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x4b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x54, 0x6f, 0x6b, 0x65, 0x6e, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x14, 0x0a, + 0x05, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x49, 0x6e, + 0x64, 0x65, 0x78, 0x12, 0x1e, 0x0a, 0x0a, 0x44, 0x61, 0x74, 0x61, 0x63, 0x65, 0x6e, 0x74, 0x65, + 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x44, 0x61, 0x74, 0x61, 0x63, 0x65, 0x6e, + 0x74, 0x65, 0x72, 0x12, 0x1c, 0x0a, 0x09, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x07, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x1a, 0x0a, 0x08, 0x50, 0x65, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x50, 0x65, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2a, 0x0a, 0x0f, 0x57, + 0x69, 0x6c, 0x64, 0x63, 0x61, 0x72, 0x64, 0x53, 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x09, + 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x0f, 0x57, 0x69, 0x6c, 0x64, 0x63, 0x61, 0x72, 0x64, + 0x53, 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x3d, 0x0a, 0x0c, 0x4e, 0x61, 0x6d, 0x65, 0x64, + 0x53, 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, + 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x53, + 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x48, 0x00, 0x52, 0x0c, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x53, + 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x42, 0x09, 0x0a, 0x07, 0x53, 0x75, 0x62, 0x6a, 0x65, 0x63, + 0x74, 0x22, 0x81, 0x03, 0x0a, 0x05, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x49, + 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x49, 0x6e, 0x64, 0x65, + 0x78, 0x12, 0x26, 0x0a, 0x0d, 0x45, 0x6e, 0x64, 0x4f, 0x66, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, + 0x6f, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x0d, 0x45, 0x6e, 0x64, 0x4f, + 0x66, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x12, 0x32, 0x0a, 0x13, 0x4e, 0x65, 0x77, + 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x54, 0x6f, 0x46, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x13, 0x4e, 0x65, 0x77, 0x53, 0x6e, 0x61, + 0x70, 0x73, 0x68, 0x6f, 0x74, 0x54, 0x6f, 0x46, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x12, 0x37, 0x0a, + 0x0a, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x42, 0x61, 0x74, 0x63, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x15, 0x2e, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x2e, 0x45, 0x76, + 0x65, 0x6e, 0x74, 0x42, 0x61, 0x74, 0x63, 0x68, 0x48, 0x00, 0x52, 0x0a, 0x45, 0x76, 0x65, 0x6e, + 0x74, 0x42, 0x61, 0x74, 0x63, 0x68, 0x12, 0x46, 0x0a, 0x0d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, + 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x48, 0x00, 0x52, + 0x0d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x12, 0x40, + 0x0a, 0x0b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x18, 0x0b, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x55, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4f, 0x70, 0x52, 0x02, 0x4f, 0x70, 0x12, 0x54, - 0x0a, 0x0b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, - 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, - 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x43, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x22, 0x22, 0x0a, 0x08, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4f, 0x70, - 0x12, 0x0a, 0x0a, 0x06, 0x55, 0x70, 0x73, 0x65, 0x72, 0x74, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, - 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x10, 0x01, 0x22, 0xc3, 0x01, 0x0a, 0x11, 0x53, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x24, - 0x0a, 0x02, 0x4f, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x73, 0x75, 0x62, - 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x2e, 0x43, 0x61, 0x74, 0x61, 0x6c, 0x6f, 0x67, 0x4f, 0x70, - 0x52, 0x02, 0x4f, 0x70, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x58, 0x0a, 0x0e, 0x45, 0x6e, 0x74, 0x65, - 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x30, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, - 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6d, - 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x4d, 0x65, - 0x74, 0x61, 0x52, 0x0e, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x4d, 0x65, - 0x74, 0x61, 0x12, 0x1a, 0x0a, 0x08, 0x50, 0x65, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x50, 0x65, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x2a, 0x90, - 0x02, 0x0a, 0x05, 0x54, 0x6f, 0x70, 0x69, 0x63, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x6e, 0x6b, 0x6e, - 0x6f, 0x77, 0x6e, 0x10, 0x00, 0x12, 0x11, 0x0a, 0x0d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x10, 0x01, 0x12, 0x18, 0x0a, 0x14, 0x53, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, - 0x10, 0x02, 0x12, 0x0e, 0x0a, 0x0a, 0x4d, 0x65, 0x73, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x10, 0x03, 0x12, 0x13, 0x0a, 0x0f, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, - 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x10, 0x04, 0x12, 0x12, 0x0a, 0x0e, 0x49, 0x6e, 0x67, 0x72, 0x65, - 0x73, 0x73, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x10, 0x05, 0x12, 0x15, 0x0a, 0x11, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x10, 0x06, 0x12, 0x0f, 0x0a, 0x0b, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4c, 0x69, 0x73, - 0x74, 0x10, 0x07, 0x12, 0x13, 0x0a, 0x0f, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x44, 0x65, - 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x10, 0x08, 0x12, 0x0e, 0x0a, 0x0a, 0x41, 0x50, 0x49, 0x47, - 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x10, 0x09, 0x12, 0x0c, 0x0a, 0x08, 0x54, 0x43, 0x50, 0x52, - 0x6f, 0x75, 0x74, 0x65, 0x10, 0x0a, 0x12, 0x0d, 0x0a, 0x09, 0x48, 0x54, 0x54, 0x50, 0x52, 0x6f, - 0x75, 0x74, 0x65, 0x10, 0x0b, 0x12, 0x15, 0x0a, 0x11, 0x49, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x43, - 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x10, 0x0c, 0x12, 0x13, 0x0a, 0x0f, - 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x41, 0x50, 0x49, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x10, - 0x0d, 0x2a, 0x29, 0x0a, 0x09, 0x43, 0x61, 0x74, 0x61, 0x6c, 0x6f, 0x67, 0x4f, 0x70, 0x12, 0x0c, - 0x0a, 0x08, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x10, 0x00, 0x12, 0x0e, 0x0a, 0x0a, - 0x44, 0x65, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x10, 0x01, 0x32, 0x5f, 0x0a, 0x17, - 0x53, 0x74, 0x61, 0x74, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x53, 0x75, 0x62, 0x73, 0x63, - 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x44, 0x0a, 0x09, 0x53, 0x75, 0x62, 0x73, 0x63, - 0x72, 0x69, 0x62, 0x65, 0x12, 0x1b, 0x2e, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, - 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x10, 0x2e, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x2e, 0x45, 0x76, - 0x65, 0x6e, 0x74, 0x22, 0x06, 0xe2, 0x86, 0x04, 0x02, 0x08, 0x02, 0x30, 0x01, 0x42, 0x92, 0x01, - 0x0a, 0x0d, 0x63, 0x6f, 0x6d, 0x2e, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x42, - 0x0e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, - 0x01, 0x5a, 0x2d, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x68, 0x61, - 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2f, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x70, 0x62, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, - 0xa2, 0x02, 0x03, 0x53, 0x58, 0x58, 0xaa, 0x02, 0x09, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, - 0x62, 0x65, 0xca, 0x02, 0x09, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0xe2, 0x02, - 0x15, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, - 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x09, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, - 0x62, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x65, 0x48, 0x00, 0x52, 0x0b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x12, 0x38, 0x0a, 0x07, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1c, 0x2e, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x2e, 0x53, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x48, + 0x00, 0x52, 0x07, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x42, 0x09, 0x0a, 0x07, 0x50, 0x61, + 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x22, 0x36, 0x0a, 0x0a, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x42, 0x61, + 0x74, 0x63, 0x68, 0x12, 0x28, 0x0a, 0x06, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x2e, + 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x06, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x9c, 0x01, + 0x0a, 0x13, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x24, 0x0a, 0x02, 0x4f, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x14, 0x2e, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x2e, 0x43, 0x61, + 0x74, 0x61, 0x6c, 0x6f, 0x67, 0x4f, 0x70, 0x52, 0x02, 0x4f, 0x70, 0x12, 0x5f, 0x0a, 0x10, 0x43, + 0x68, 0x65, 0x63, 0x6b, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, + 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, + 0x6c, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x53, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x10, 0x43, 0x68, 0x65, 0x63, + 0x6b, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x22, 0xc4, 0x01, 0x0a, + 0x11, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x55, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x12, 0x35, 0x0a, 0x02, 0x4f, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x25, + 0x2e, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x55, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x4f, 0x70, 0x52, 0x02, 0x4f, 0x70, 0x12, 0x54, 0x0a, 0x0b, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x32, + 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, + 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x52, 0x0b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x22, + 0x22, 0x0a, 0x08, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4f, 0x70, 0x12, 0x0a, 0x0a, 0x06, 0x55, + 0x70, 0x73, 0x65, 0x72, 0x74, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x10, 0x01, 0x22, 0xc3, 0x01, 0x0a, 0x11, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4c, + 0x69, 0x73, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x24, 0x0a, 0x02, 0x4f, 0x70, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, + 0x65, 0x2e, 0x43, 0x61, 0x74, 0x61, 0x6c, 0x6f, 0x67, 0x4f, 0x70, 0x52, 0x02, 0x4f, 0x70, 0x12, + 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, + 0x61, 0x6d, 0x65, 0x12, 0x58, 0x0a, 0x0e, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, + 0x65, 0x4d, 0x65, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x68, 0x61, + 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, + 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, + 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x52, 0x0e, 0x45, + 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x1a, 0x0a, + 0x08, 0x50, 0x65, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x50, 0x65, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x2a, 0x90, 0x02, 0x0a, 0x05, 0x54, 0x6f, + 0x70, 0x69, 0x63, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, + 0x12, 0x11, 0x0a, 0x0d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x48, 0x65, 0x61, 0x6c, 0x74, + 0x68, 0x10, 0x01, 0x12, 0x18, 0x0a, 0x14, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x48, 0x65, + 0x61, 0x6c, 0x74, 0x68, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x10, 0x02, 0x12, 0x0e, 0x0a, + 0x0a, 0x4d, 0x65, 0x73, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x10, 0x03, 0x12, 0x13, 0x0a, + 0x0f, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, + 0x10, 0x04, 0x12, 0x12, 0x0a, 0x0e, 0x49, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x47, 0x61, 0x74, + 0x65, 0x77, 0x61, 0x79, 0x10, 0x05, 0x12, 0x15, 0x0a, 0x11, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x10, 0x06, 0x12, 0x0f, 0x0a, + 0x0b, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x10, 0x07, 0x12, 0x13, + 0x0a, 0x0f, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x73, 0x10, 0x08, 0x12, 0x0e, 0x0a, 0x0a, 0x41, 0x50, 0x49, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, + 0x79, 0x10, 0x09, 0x12, 0x0c, 0x0a, 0x08, 0x54, 0x43, 0x50, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x10, + 0x0a, 0x12, 0x0d, 0x0a, 0x09, 0x48, 0x54, 0x54, 0x50, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x10, 0x0b, + 0x12, 0x15, 0x0a, 0x11, 0x49, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, + 0x69, 0x63, 0x61, 0x74, 0x65, 0x10, 0x0c, 0x12, 0x13, 0x0a, 0x0f, 0x42, 0x6f, 0x75, 0x6e, 0x64, + 0x41, 0x50, 0x49, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x10, 0x0d, 0x2a, 0x29, 0x0a, 0x09, + 0x43, 0x61, 0x74, 0x61, 0x6c, 0x6f, 0x67, 0x4f, 0x70, 0x12, 0x0c, 0x0a, 0x08, 0x52, 0x65, 0x67, + 0x69, 0x73, 0x74, 0x65, 0x72, 0x10, 0x00, 0x12, 0x0e, 0x0a, 0x0a, 0x44, 0x65, 0x72, 0x65, 0x67, + 0x69, 0x73, 0x74, 0x65, 0x72, 0x10, 0x01, 0x32, 0x5f, 0x0a, 0x17, 0x53, 0x74, 0x61, 0x74, 0x65, + 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x44, 0x0a, 0x09, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x12, + 0x1b, 0x2e, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x2e, 0x53, 0x75, 0x62, 0x73, + 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x73, + 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x22, 0x06, + 0xe2, 0x86, 0x04, 0x02, 0x08, 0x02, 0x30, 0x01, 0x42, 0x9a, 0x01, 0x0a, 0x0d, 0x63, 0x6f, 0x6d, + 0x2e, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x42, 0x0e, 0x53, 0x75, 0x62, 0x73, + 0x63, 0x72, 0x69, 0x62, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x35, 0x67, 0x69, + 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, + 0x72, 0x70, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, + 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2f, 0x70, 0x62, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, + 0x69, 0x62, 0x65, 0xa2, 0x02, 0x03, 0x53, 0x58, 0x58, 0xaa, 0x02, 0x09, 0x53, 0x75, 0x62, 0x73, + 0x63, 0x72, 0x69, 0x62, 0x65, 0xca, 0x02, 0x09, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, + 0x65, 0xe2, 0x02, 0x15, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x5c, 0x47, 0x50, + 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x09, 0x53, 0x75, 0x62, 0x73, + 0x63, 0x72, 0x69, 0x62, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( - file_proto_pbsubscribe_subscribe_proto_rawDescOnce sync.Once - file_proto_pbsubscribe_subscribe_proto_rawDescData = file_proto_pbsubscribe_subscribe_proto_rawDesc + file_private_pbsubscribe_subscribe_proto_rawDescOnce sync.Once + file_private_pbsubscribe_subscribe_proto_rawDescData = file_private_pbsubscribe_subscribe_proto_rawDesc ) -func file_proto_pbsubscribe_subscribe_proto_rawDescGZIP() []byte { - file_proto_pbsubscribe_subscribe_proto_rawDescOnce.Do(func() { - file_proto_pbsubscribe_subscribe_proto_rawDescData = protoimpl.X.CompressGZIP(file_proto_pbsubscribe_subscribe_proto_rawDescData) +func file_private_pbsubscribe_subscribe_proto_rawDescGZIP() []byte { + file_private_pbsubscribe_subscribe_proto_rawDescOnce.Do(func() { + file_private_pbsubscribe_subscribe_proto_rawDescData = protoimpl.X.CompressGZIP(file_private_pbsubscribe_subscribe_proto_rawDescData) }) - return file_proto_pbsubscribe_subscribe_proto_rawDescData + return file_private_pbsubscribe_subscribe_proto_rawDescData } -var file_proto_pbsubscribe_subscribe_proto_enumTypes = make([]protoimpl.EnumInfo, 3) -var file_proto_pbsubscribe_subscribe_proto_msgTypes = make([]protoimpl.MessageInfo, 7) -var file_proto_pbsubscribe_subscribe_proto_goTypes = []interface{}{ +var file_private_pbsubscribe_subscribe_proto_enumTypes = make([]protoimpl.EnumInfo, 3) +var file_private_pbsubscribe_subscribe_proto_msgTypes = make([]protoimpl.MessageInfo, 7) +var file_private_pbsubscribe_subscribe_proto_goTypes = []interface{}{ (Topic)(0), // 0: subscribe.Topic (CatalogOp)(0), // 1: subscribe.CatalogOp (ConfigEntryUpdate_UpdateOp)(0), // 2: subscribe.ConfigEntryUpdate.UpdateOp @@ -1053,7 +1053,7 @@ var file_proto_pbsubscribe_subscribe_proto_goTypes = []interface{}{ (*pbconfigentry.ConfigEntry)(nil), // 11: hashicorp.consul.internal.configentry.ConfigEntry (*pbcommon.EnterpriseMeta)(nil), // 12: hashicorp.consul.internal.common.EnterpriseMeta } -var file_proto_pbsubscribe_subscribe_proto_depIdxs = []int32{ +var file_private_pbsubscribe_subscribe_proto_depIdxs = []int32{ 0, // 0: subscribe.SubscribeRequest.Topic:type_name -> subscribe.Topic 3, // 1: subscribe.SubscribeRequest.NamedSubject:type_name -> subscribe.NamedSubject 6, // 2: subscribe.Event.EventBatch:type_name -> subscribe.EventBatch @@ -1076,13 +1076,13 @@ var file_proto_pbsubscribe_subscribe_proto_depIdxs = []int32{ 0, // [0:13] is the sub-list for field type_name } -func init() { file_proto_pbsubscribe_subscribe_proto_init() } -func file_proto_pbsubscribe_subscribe_proto_init() { - if File_proto_pbsubscribe_subscribe_proto != nil { +func init() { file_private_pbsubscribe_subscribe_proto_init() } +func file_private_pbsubscribe_subscribe_proto_init() { + if File_private_pbsubscribe_subscribe_proto != nil { return } if !protoimpl.UnsafeEnabled { - file_proto_pbsubscribe_subscribe_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + file_private_pbsubscribe_subscribe_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*NamedSubject); i { case 0: return &v.state @@ -1094,7 +1094,7 @@ func file_proto_pbsubscribe_subscribe_proto_init() { return nil } } - file_proto_pbsubscribe_subscribe_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + file_private_pbsubscribe_subscribe_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SubscribeRequest); i { case 0: return &v.state @@ -1106,7 +1106,7 @@ func file_proto_pbsubscribe_subscribe_proto_init() { return nil } } - file_proto_pbsubscribe_subscribe_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + file_private_pbsubscribe_subscribe_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Event); i { case 0: return &v.state @@ -1118,7 +1118,7 @@ func file_proto_pbsubscribe_subscribe_proto_init() { return nil } } - file_proto_pbsubscribe_subscribe_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + file_private_pbsubscribe_subscribe_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*EventBatch); i { case 0: return &v.state @@ -1130,7 +1130,7 @@ func file_proto_pbsubscribe_subscribe_proto_init() { return nil } } - file_proto_pbsubscribe_subscribe_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + file_private_pbsubscribe_subscribe_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ServiceHealthUpdate); i { case 0: return &v.state @@ -1142,7 +1142,7 @@ func file_proto_pbsubscribe_subscribe_proto_init() { return nil } } - file_proto_pbsubscribe_subscribe_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + file_private_pbsubscribe_subscribe_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ConfigEntryUpdate); i { case 0: return &v.state @@ -1154,7 +1154,7 @@ func file_proto_pbsubscribe_subscribe_proto_init() { return nil } } - file_proto_pbsubscribe_subscribe_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { + file_private_pbsubscribe_subscribe_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ServiceListUpdate); i { case 0: return &v.state @@ -1167,11 +1167,11 @@ func file_proto_pbsubscribe_subscribe_proto_init() { } } } - file_proto_pbsubscribe_subscribe_proto_msgTypes[1].OneofWrappers = []interface{}{ + file_private_pbsubscribe_subscribe_proto_msgTypes[1].OneofWrappers = []interface{}{ (*SubscribeRequest_WildcardSubject)(nil), (*SubscribeRequest_NamedSubject)(nil), } - file_proto_pbsubscribe_subscribe_proto_msgTypes[2].OneofWrappers = []interface{}{ + file_private_pbsubscribe_subscribe_proto_msgTypes[2].OneofWrappers = []interface{}{ (*Event_EndOfSnapshot)(nil), (*Event_NewSnapshotToFollow)(nil), (*Event_EventBatch)(nil), @@ -1183,19 +1183,19 @@ func file_proto_pbsubscribe_subscribe_proto_init() { out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_proto_pbsubscribe_subscribe_proto_rawDesc, + RawDescriptor: file_private_pbsubscribe_subscribe_proto_rawDesc, NumEnums: 3, NumMessages: 7, NumExtensions: 0, NumServices: 1, }, - GoTypes: file_proto_pbsubscribe_subscribe_proto_goTypes, - DependencyIndexes: file_proto_pbsubscribe_subscribe_proto_depIdxs, - EnumInfos: file_proto_pbsubscribe_subscribe_proto_enumTypes, - MessageInfos: file_proto_pbsubscribe_subscribe_proto_msgTypes, + GoTypes: file_private_pbsubscribe_subscribe_proto_goTypes, + DependencyIndexes: file_private_pbsubscribe_subscribe_proto_depIdxs, + EnumInfos: file_private_pbsubscribe_subscribe_proto_enumTypes, + MessageInfos: file_private_pbsubscribe_subscribe_proto_msgTypes, }.Build() - File_proto_pbsubscribe_subscribe_proto = out.File - file_proto_pbsubscribe_subscribe_proto_rawDesc = nil - file_proto_pbsubscribe_subscribe_proto_goTypes = nil - file_proto_pbsubscribe_subscribe_proto_depIdxs = nil + File_private_pbsubscribe_subscribe_proto = out.File + file_private_pbsubscribe_subscribe_proto_rawDesc = nil + file_private_pbsubscribe_subscribe_proto_goTypes = nil + file_private_pbsubscribe_subscribe_proto_depIdxs = nil } diff --git a/proto/pbsubscribe/subscribe.proto b/proto/private/pbsubscribe/subscribe.proto similarity index 95% rename from proto/pbsubscribe/subscribe.proto rename to proto/private/pbsubscribe/subscribe.proto index 957388f33bc..8bd6a3864a4 100644 --- a/proto/pbsubscribe/subscribe.proto +++ b/proto/private/pbsubscribe/subscribe.proto @@ -1,5 +1,5 @@ /* -Package event provides a service for subscribing to state change events. + Package event provides a service for subscribing to state change events. */ syntax = "proto3"; @@ -10,10 +10,10 @@ syntax = "proto3"; // compatibility. package subscribe; -import "proto-public/annotations/ratelimit/ratelimit.proto"; -import "proto/pbcommon/common.proto"; -import "proto/pbconfigentry/config_entry.proto"; -import "proto/pbservice/node.proto"; +import "annotations/ratelimit/ratelimit.proto"; +import "private/pbcommon/common.proto"; +import "private/pbconfigentry/config_entry.proto"; +import "private/pbservice/node.proto"; // StateChangeSubscription service allows consumers to subscribe to topics of // state change events. Events are streamed as they happen. @@ -40,9 +40,7 @@ service StateChangeSubscription { // because the server state was restored from a snapshot. // buf:lint:ignore RPC_RESPONSE_STANDARD_NAME rpc Subscribe(SubscribeRequest) returns (stream Event) { - option (hashicorp.consul.internal.ratelimit.spec) = { - operation_type: OPERATION_TYPE_READ, - }; + option (hashicorp.consul.internal.ratelimit.spec) = {operation_type: OPERATION_TYPE_READ}; } } diff --git a/proto/pbsubscribe/subscribe_grpc.pb.go b/proto/private/pbsubscribe/subscribe_grpc.pb.go similarity index 98% rename from proto/pbsubscribe/subscribe_grpc.pb.go rename to proto/private/pbsubscribe/subscribe_grpc.pb.go index 06227290802..aa843928fd3 100644 --- a/proto/pbsubscribe/subscribe_grpc.pb.go +++ b/proto/private/pbsubscribe/subscribe_grpc.pb.go @@ -2,7 +2,7 @@ // versions: // - protoc-gen-go-grpc v1.2.0 // - protoc (unknown) -// source: proto/pbsubscribe/subscribe.proto +// source: private/pbsubscribe/subscribe.proto package pbsubscribe @@ -166,5 +166,5 @@ var StateChangeSubscription_ServiceDesc = grpc.ServiceDesc{ ServerStreams: true, }, }, - Metadata: "proto/pbsubscribe/subscribe.proto", + Metadata: "private/pbsubscribe/subscribe.proto", } diff --git a/proto/prototest/testing.go b/proto/private/prototest/testing.go similarity index 100% rename from proto/prototest/testing.go rename to proto/private/prototest/testing.go diff --git a/tlsutil/config.go b/tlsutil/config.go index e67b70d1b9c..2c2612c3d11 100644 --- a/tlsutil/config.go +++ b/tlsutil/config.go @@ -16,7 +16,7 @@ import ( "github.com/hashicorp/go-multierror" "github.com/hashicorp/consul/logging" - "github.com/hashicorp/consul/proto/pbconfig" + "github.com/hashicorp/consul/proto/private/pbconfig" "github.com/hashicorp/consul/types" ) From c9c49ea3a246d6dab7ad7ef489f51f4cf76b746a Mon Sep 17 00:00:00 2001 From: malizz Date: Fri, 17 Feb 2023 13:25:49 -0800 Subject: [PATCH 021/262] new docs for consul and consul-k8s troubleshoot command (#16284) * new docs for consul and consul-k8s troubleshoot command * add changelog * add troubleshoot command * address comments, and update cli output to match * revert changes to troubleshoot upstreams, changes will happen in separate pr * Update .changelog/16284.txt Co-authored-by: Nitya Dhanushkodi * address comments * update trouble proxy output * add missing s, add required fields in usage --------- Co-authored-by: Nitya Dhanushkodi --- .changelog/16284.txt | 3 + website/content/commands/index.mdx | 1 + .../content/commands/troubleshoot/index.mdx | 31 ++++++ .../content/commands/troubleshoot/proxy.mdx | 68 ++++++++++++ .../commands/troubleshoot/upstreams.mdx | 37 +++++++ website/content/docs/k8s/k8s-cli.mdx | 101 ++++++++++++++++++ website/data/commands-nav-data.json | 17 +++ 7 files changed, 258 insertions(+) create mode 100644 .changelog/16284.txt create mode 100644 website/content/commands/troubleshoot/index.mdx create mode 100644 website/content/commands/troubleshoot/proxy.mdx create mode 100644 website/content/commands/troubleshoot/upstreams.mdx diff --git a/.changelog/16284.txt b/.changelog/16284.txt new file mode 100644 index 00000000000..23dd2aa6fef --- /dev/null +++ b/.changelog/16284.txt @@ -0,0 +1,3 @@ +```release-note:feature +cli: adds new CLI commands `consul troubleshoot upstreams` and `consul troubleshoot proxy` to troubleshoot Consul's service mesh configuration and network issues. +``` \ No newline at end of file diff --git a/website/content/commands/index.mdx b/website/content/commands/index.mdx index 2946d794ba4..415fc551d33 100644 --- a/website/content/commands/index.mdx +++ b/website/content/commands/index.mdx @@ -56,6 +56,7 @@ Available commands are: services Interact with services snapshot Saves, restores and inspects snapshots of Consul server state tls Builtin helpers for creating CAs and certificates + troubleshoot Provides tools to troubleshoot Consul's service mesh configuration validate Validate config files/directories version Prints the Consul version watch Watch for changes in Consul diff --git a/website/content/commands/troubleshoot/index.mdx b/website/content/commands/troubleshoot/index.mdx new file mode 100644 index 00000000000..521981a77e0 --- /dev/null +++ b/website/content/commands/troubleshoot/index.mdx @@ -0,0 +1,31 @@ +--- +layout: commands +page_title: 'Commands: Troubleshoot' +description: >- + The `consul troubleshoot` command provides tools to troubleshoot Consul's service mesh configuration. +--- + +# Consul Troubleshooting + +Command: `consul troubleshoot` + +Use the `troubleshoot` command to diagnose Consul service mesh configuration or network issues. + +## Usage + +```text +Usage: consul troubleshoot [options] + + # ... + +Subcommands: + + proxy Troubleshoots service mesh issues from the current Envoy instance + upstreams Gets upstream Envoy identifiers and IPs configured for the proxy +``` + +For more information, examples, and usage about a subcommand, click on the name +of the subcommand in the sidebar or one of the links below: + +- [proxy](/consul/commands/troubleshoot/proxy) +- [upstreams](/consul/commands/troubleshoot/upstreams) diff --git a/website/content/commands/troubleshoot/proxy.mdx b/website/content/commands/troubleshoot/proxy.mdx new file mode 100644 index 00000000000..7a11983ae74 --- /dev/null +++ b/website/content/commands/troubleshoot/proxy.mdx @@ -0,0 +1,68 @@ +--- +layout: commands +page_title: 'Commands: Troubleshoot Proxy' +description: >- + The `consul troubleshoot proxy` diagnoses Consul service mesh configuration and network issues to an upstream. +--- + +# Consul Troubleshoot Proxy + +Command: `consul troubleshoot proxy` + +The `troubleshoot proxy` command diagnoses Consul service mesh configuration and network issues to an upstream. + +## Usage + +Usage: `consul troubleshoot proxy (-upstream-ip |-upstream-envoy-id ) [options]` +This command requires `-envoy-admin-endpoint` or `-upstream-ip` to specify the upstream. + +#### Command Options + +- `-envoy-admin-endpoint=` - Envoy admin endpoint address for the local Envoy instance. +Defaults to `127.0.0.1:19000`. + +- `-upstream-ip=` - The IP address of the upstream service; Use when the upstream is reached via a transparent proxy DNS address (KubeDNS or Consul DNS) + +- `-upstream-envoy-id=` - The Envoy identifier of the upstream service; Use when the upstream is explicitly configured on the downstream service. + +## Examples + +The following example illustrates how to troubleshoot Consul service mesh configuration and network issues to an upstream from a source proxy. + + ```shell-session + $ consul troubleshoot proxy -upstream-ip 10.4.6.160 + + ==> Validation + ✓ Certificates are valid + ✓ Envoy has 0 rejected configurations + ✓ Envoy has detected 0 connection failure(s) + ✓ Listener for upstream "backend" found + ✓ Route for upstream "backend" found + ✓ Cluster "backend.default.dc1.internal.e08fa6d6-e91e-dfe0-f6e1-ba097a828e31.consul" for upstream "backend" found + ✓ Healthy endpoints for cluster "backend.default.dc1.internal.e08fa6d6-e91e-dfe0-f6e1-ba097a828e31.consul" for upstream "backend" found + ✓ Cluster "backend2.default.dc1.internal.e08fa6d6-e91e-dfe0-f6e1-ba097a828e31.consul" for upstream "backend" found + ! No healthy endpoints for cluster "backend2.default.dc1.internal.e08fa6d6-e91e-dfe0-f6e1-ba097a828e31.consul" for upstream "backend" found + -> Check that your upstream service is healthy and running + -> Check that your upstream service is registered with Consul + -> Check that the upstream proxy is healthy and running + -> If you are explicitly configuring upstreams, ensure the name of the upstream is correct + ``` + +The following example troubleshoots Consul service mesh configuration and network issues from the local Envoy instance to the given upstream. + + ```shell-session + $ consul-k8s troubleshoot proxy -upstream-envoy-id db + + ==> Validation + ✓ Certificates are valid + ✓ Envoy has 0 rejected configurations + ✓ Envoy has detected 0 connection failure(s) + ✓ Listener for upstream "db" found + ✓ Route for upstream "db" found + ✓ Cluster "db.default.dc1.internal.e08fa6d6-e91e-dfe0.consul" for upstream "db" found + ✓ Healthy endpoints for cluster "db.default.dc1.internal.e08fa6d6-e91e-dfe0.consul" for upstream "db" found + + If you are still experiencing issues, you can: + -> Check intentions to ensure the upstream allows traffic from this source + -> If using transparent proxy, ensure DNS resolution is to the same IP you have verified here + ``` diff --git a/website/content/commands/troubleshoot/upstreams.mdx b/website/content/commands/troubleshoot/upstreams.mdx new file mode 100644 index 00000000000..5cbeb232ff7 --- /dev/null +++ b/website/content/commands/troubleshoot/upstreams.mdx @@ -0,0 +1,37 @@ +--- +layout: commands +page_title: 'Commands: Troubleshoot Upstreams' +description: >- + The `consul troubleshoot upstreams` lists the available upstreams in the Consul service mesh from the current service. +--- + +# Consul Troubleshoot Upstreams + +Command: `consul troubleshoot upstreams` + +The `troubleshoot upstreams` lists the available upstreams in the Consul service mesh from the current service. + +## Usage + +Usage: `consul troubleshoot upstreams [options]` + +#### Command Options + +- `-envoy-admin-endpoint=` - Envoy admin endpoint address for the local Envoy instance. +Defaults to `127.0.0.1:19000`. + +## Examples + +Display all transparent proxy upstreams in Consul service mesh from the current Envoy instance. + + ```shell-session + $ consul troubleshoot upstreams + ==> Upstreams (explicit upstreams only) (0) + + ==> Upstreams IPs (transparent proxy only) (1) + [10.4.6.160 240.0.0.3] true map[backend.default.dc1.internal.e08fa6d6-e91e-dfe0-f6e1-ba097a828e31.consul backend2.default.dc1.internal.e08fa6d6-e91e-dfe0-f6e1-ba097a828e31.consul] + + If you cannot find the upstream address or cluster for a transparent proxy upstream: + - Check intentions: Tproxy upstreams are configured based on intentions. Make sure you have configured intentions to allow traffic to your upstream. + - To check that the right cluster is being dialed, run a DNS lookup for the upstream you are dialing. For example, run `dig backend.svc.consul` to return the IP address for the `backend` service. If the address you get from that is missing from the upstream IPs, it means that your proxy may be misconfigured. + ``` diff --git a/website/content/docs/k8s/k8s-cli.mdx b/website/content/docs/k8s/k8s-cli.mdx index 402d2327b7d..b3e6f76bc4e 100644 --- a/website/content/docs/k8s/k8s-cli.mdx +++ b/website/content/docs/k8s/k8s-cli.mdx @@ -33,6 +33,7 @@ You can use the following commands with `consul-k8s`. - [`proxy list`](#proxy-list): List all Pods running proxies managed by Consul. - [`proxy read`](#proxy-read): Inspect the Envoy configuration for a given Pod. - [`status`](#status): Check the status of a Consul installation on Kubernetes. + - [`troubleshoot`](#troubleshoot): Troubleshoot Consul service mesh and networking issues from a given pod. - [`uninstall`](#uninstall): Uninstall Consul deployment. - [`upgrade`](#upgrade): Upgrade Consul on Kubernetes from an existing installation. - [`version`](#version): Print the version of the Consul on Kubernetes CLI. @@ -490,6 +491,106 @@ $ consul-k8s status ✓ Consul clients healthy (3/3) ``` +### `troubleshoot` + +The `troubleshoot` command exposes two subcommands for troubleshooting Consul +service mesh and network issues from a given pod. + +- [`troubleshoot upstreams`](#troubleshoot-upstreams): List all Envoy upstreams in Consul service mesh from the given pod. +- [`troubleshoot proxy`](#troubleshoot-proxy): Troubleshoot Consul service mesh configuration and network issues between the given pod and the given upstream. + +### `troubleshoot upstreams` + +```shell-session +$ consul-k8s troubleshoot upstreams -pod +``` + +| Flag | Description | Default | +| ------------------------------------ | ----------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------- | +| `-namespace`, `-n` | `String` The Kubernetes namespace to list proxies in. | Current [kubeconfig](https://kubernetes.io/docs/concepts/configuration/organize-cluster-access-kubeconfig/) namespace. | +| `-envoy-admin-endpoint` | `String` Envoy sidecar address and port | `127.0.0.1:19000` | + +#### Example Commands + +The following example displays all transparent proxy upstreams in Consul service mesh from the given pod. + + ```shell-session + $ consul-k8s troubleshoot upstreams -pod frontend-767ccfc8f9-6f6gx + + ==> Upstreams (explicit upstreams only) (0) + + ==> Upstreams IPs (transparent proxy only) (1) + [10.4.6.160 240.0.0.3] true map[backend.default.dc1.internal.e08fa6d6-e91e-dfe0-f6e1-ba097a828e31.consul backend2.default.dc1.internal.e08fa6d6-e91e-dfe0-f6e1-ba097a828e31.consul] + + If you cannot find the upstream address or cluster for a transparent proxy upstream: + - Check intentions: Tproxy upstreams are configured based on intentions. Make sure you have configured intentions to allow traffic to your upstream. + - To check that the right cluster is being dialed, run a DNS lookup for the upstream you are dialing. For example, run `dig backend.svc.consul` to return the IP address for the `backend` service. If the address you get from that is missing from the upstream IPs, it means that your proxy may be misconfigured. + ``` + +The following example displays all explicit upstreams from the given pod in the Consul service mesh. + + ```shell-session + $ consul-k8s troubleshoot upstreams -pod client-767ccfc8f9-6f6gx + + ==> Upstreams (explicit upstreams only) (1) + server + counting + + ==> Upstreams IPs (transparent proxy only) (0) + + If you cannot find the upstream address or cluster for a transparent proxy upstream: + - Check intentions: Tproxy upstreams are configured based on intentions. Make sure you have configured intentions to allow traffic to your upstream. + - To check that the right cluster is being dialed, run a DNS lookup for the upstream you are dialing. For example, run `dig backend.svc.consul` to return the IP address for the `backend` service. If the address you get from that is missing from the upstream IPs, it means that your proxy may be misconfigured. + ``` + +### `troubleshoot proxy` + +```shell-session +$ consul-k8s troubleshoot proxy -pod -upstream-ip +$ consul-k8s troubleshoot proxy -pod -upstream-envoy-id +``` + +| Flag | Description | Default | +| ------------------------------------ | ----------------------------------------------------------| ---------------------------------------------------------------------------------------------------------------------- | +| `-namespace`, `-n` | `String` The Kubernetes namespace to list proxies in. | Current [kubeconfig](https://kubernetes.io/docs/concepts/configuration/organize-cluster-access-kubeconfig/) namespace. | +| `-envoy-admin-endpoint` | `String` Envoy sidecar address and port | `127.0.0.1:19000` | +| `-upstream-ip` | `String` The IP address of the upstream transparent proxy | | +| `-upstream-envoy-id` | `String` The Envoy identifier of the upstream | | + +#### Example Commands + +The following example troubleshoots the Consul service mesh configuration and network issues between the given pod and the given upstream IP. + + ```shell-session + $ consul-k8s troubleshoot proxy -pod frontend-767ccfc8f9-6f6gx -upstream-ip 10.4.6.160 + + ==> Validation + ✓ certificates are valid + ✓ Envoy has 0 rejected configurations + ✓ Envoy has detected 0 connection failure(s) + ✓ listener for upstream "backend" found + ✓ route for upstream "backend" found + ✓ cluster "backend.default.dc1.internal..consul" for upstream "backend" found + ✓ healthy endpoints for cluster "backend.default.dc1.internal.e08fa6d6-e91e-dfe0-f6e1-ba097a828e31.consul" for upstream "backend" found + ✓ cluster "backend2.default.dc1.internal..consul" for upstream "backend" found + ! no healthy endpoints for cluster "backend2.default.dc1.internal.e08fa6d6-e91e-dfe0-f6e1-ba097a828e31.consul" for upstream "backend" found + ``` + +The following example troubleshoots the Consul service mesh configuration and network issues between the given pod and the given upstream. + + ```shell-session + $ consul-k8s troubleshoot proxy -pod frontend-767ccfc8f9-6f6gx -upstream-envoy-id db + + ==> Validation + ✓ certificates are valid + ✓ Envoy has 0 rejected configurations + ✓ Envoy has detected 0 connection failure(s) + ! no listener for upstream "db" found + ! no route for upstream "backend" found + ! no cluster "db.default.dc1.internal.e08fa6d6-e91e-dfe0-f6e1-ba097a828e31.consul" for upstream "db" found + ! no healthy endpoints for cluster "db.default.dc1.internal.e08fa6d6-e91e-dfe0-f6e1-ba097a828e31.consul" for upstream "db" found + ``` + ### `uninstall` The `uninstall` command removes Consul from Kubernetes. diff --git a/website/data/commands-nav-data.json b/website/data/commands-nav-data.json index 62ed01a4004..aac55d7952b 100644 --- a/website/data/commands-nav-data.json +++ b/website/data/commands-nav-data.json @@ -528,6 +528,23 @@ } ] }, + { + "title": "troubleshoot", + "routes": [ + { + "title": "Overview", + "path": "troubleshoot" + }, + { + "title": "upstreams", + "path": "troubleshoot/upstreams" + }, + { + "title": "proxy", + "path": "troubleshoot/proxy" + } + ] + }, { "title": "validate", "path": "validate" From 15d2684ecc5c97036d946c8e8f4578446a56b3e8 Mon Sep 17 00:00:00 2001 From: Andrew Stucki Date: Fri, 17 Feb 2023 16:37:34 -0500 Subject: [PATCH 022/262] Normalize all API Gateway references (#16316) --- agent/structs/config_entry_gateways.go | 24 ++++++++++++++++++++---- agent/structs/config_entry_routes.go | 18 ++++++++++++++++++ 2 files changed, 38 insertions(+), 4 deletions(-) diff --git a/agent/structs/config_entry_gateways.go b/agent/structs/config_entry_gateways.go index 0d4019896f3..c757dce984f 100644 --- a/agent/structs/config_entry_gateways.go +++ b/agent/structs/config_entry_gateways.go @@ -754,6 +754,8 @@ func (e *APIGatewayConfigEntry) Normalize() error { if cert.Kind == "" { cert.Kind = InlineCertificate } + cert.EnterpriseMeta.Normalize() + listener.TLS.Certificates[i] = cert } } @@ -972,7 +974,23 @@ func (e *BoundAPIGatewayConfigEntry) IsInitializedForGateway(gateway *APIGateway func (e *BoundAPIGatewayConfigEntry) GetKind() string { return BoundAPIGateway } func (e *BoundAPIGatewayConfigEntry) GetName() string { return e.Name } func (e *BoundAPIGatewayConfigEntry) GetMeta() map[string]string { return e.Meta } -func (e *BoundAPIGatewayConfigEntry) Normalize() error { return nil } +func (e *BoundAPIGatewayConfigEntry) Normalize() error { + for i, listener := range e.Listeners { + for j, route := range listener.Routes { + route.EnterpriseMeta.Normalize() + + listener.Routes[j] = route + } + for j, cert := range listener.Certificates { + cert.EnterpriseMeta.Normalize() + + listener.Certificates[j] = cert + } + + e.Listeners[i] = listener + } + return nil +} func (e *BoundAPIGatewayConfigEntry) Validate() error { allowedCertificateKinds := map[string]bool{ @@ -1109,8 +1127,6 @@ func (l *BoundAPIGatewayListener) UnbindRoute(route ResourceReference) bool { return false } -func (e *BoundAPIGatewayConfigEntry) GetStatus() Status { - return Status{} -} +func (e *BoundAPIGatewayConfigEntry) GetStatus() Status { return Status{} } func (e *BoundAPIGatewayConfigEntry) SetStatus(status Status) {} func (e *BoundAPIGatewayConfigEntry) DefaultStatus() Status { return Status{} } diff --git a/agent/structs/config_entry_routes.go b/agent/structs/config_entry_routes.go index 027c8f7f7e7..fa4427776a4 100644 --- a/agent/structs/config_entry_routes.go +++ b/agent/structs/config_entry_routes.go @@ -79,6 +79,7 @@ func (e *HTTPRouteConfigEntry) Normalize() error { for i, parent := range e.Parents { if parent.Kind == "" { parent.Kind = APIGateway + parent.EnterpriseMeta.Normalize() e.Parents[i] = parent } } @@ -87,12 +88,22 @@ func (e *HTTPRouteConfigEntry) Normalize() error { for j, match := range rule.Matches { rule.Matches[j] = normalizeHTTPMatch(match) } + + for j, service := range rule.Services { + rule.Services[j] = normalizeHTTPService(service) + } e.Rules[i] = rule } return nil } +func normalizeHTTPService(service HTTPService) HTTPService { + service.EnterpriseMeta.Normalize() + + return service +} + func normalizeHTTPMatch(match HTTPMatch) HTTPMatch { method := string(match.Method) method = strings.ToUpper(method) @@ -494,9 +505,16 @@ func (e *TCPRouteConfigEntry) Normalize() error { for i, parent := range e.Parents { if parent.Kind == "" { parent.Kind = APIGateway + parent.EnterpriseMeta.Normalize() e.Parents[i] = parent } } + + for i, service := range e.Services { + service.EnterpriseMeta.Normalize() + e.Services[i] = service + } + return nil } From 4607b535bef81283d31e9aca823679135dc52c35 Mon Sep 17 00:00:00 2001 From: Andrew Stucki Date: Fri, 17 Feb 2023 17:28:49 -0500 Subject: [PATCH 023/262] Fix HTTPRoute and TCPRoute expectation for enterprise metadata (#16322) --- agent/structs/config_entry_routes_test.go | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/agent/structs/config_entry_routes_test.go b/agent/structs/config_entry_routes_test.go index ecacafdbf5a..83ab8c4d79e 100644 --- a/agent/structs/config_entry_routes_test.go +++ b/agent/structs/config_entry_routes_test.go @@ -3,6 +3,7 @@ package structs import ( "testing" + "github.com/hashicorp/consul/acl" "github.com/stretchr/testify/require" ) @@ -36,8 +37,9 @@ func TestTCPRoute(t *testing.T) { normalizeOnly: true, check: func(t *testing.T, entry ConfigEntry) { expectedParent := ResourceReference{ - Kind: APIGateway, - Name: "gateway", + Kind: APIGateway, + Name: "gateway", + EnterpriseMeta: *acl.DefaultEnterpriseMeta(), } route := entry.(*TCPRouteConfigEntry) require.Len(t, route.Parents, 1) @@ -74,8 +76,9 @@ func TestHTTPRoute(t *testing.T) { normalizeOnly: true, check: func(t *testing.T, entry ConfigEntry) { expectedParent := ResourceReference{ - Kind: APIGateway, - Name: "gateway", + Kind: APIGateway, + Name: "gateway", + EnterpriseMeta: *acl.DefaultEnterpriseMeta(), } route := entry.(*HTTPRouteConfigEntry) require.Len(t, route.Parents, 1) From 412608863eea724771fdd8c68e10f5540a58a8d7 Mon Sep 17 00:00:00 2001 From: David Yu Date: Fri, 17 Feb 2023 15:01:31 -0800 Subject: [PATCH 024/262] ISSUE_TEMPLATE: formatting for comments (#16325) * Update all templates. --- .github/ISSUE_TEMPLATE/bug_report.md | 27 +++---------- .github/ISSUE_TEMPLATE/feature_request.md | 18 ++------- .github/ISSUE_TEMPLATE/ui_issues.md | 48 ++++++----------------- .github/pull_request_template.md | 6 +-- 4 files changed, 20 insertions(+), 79 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index 8a7e26fd226..678431cae30 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -4,25 +4,18 @@ about: You're experiencing an issue with Consul that is different than the docum --- - #### Overview of the Issue - + --- #### Reproduction Steps - + ### Log Fragments - - -Include appropriate Client or Server log fragments. If the log is longer than a few dozen lines, please include the URL to the [gist](https://gist.github.com/) of the log instead of posting it in the issue. Use `-log-level=TRACE` on the client and server to capture the maximum log detail. + diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md index b3cd70e8cd1..14017a9ae9c 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -4,24 +4,12 @@ about: If you have something you think Consul could improve or add support for. --- - + #### Feature Description - + #### Use Case(s) - + diff --git a/.github/ISSUE_TEMPLATE/ui_issues.md b/.github/ISSUE_TEMPLATE/ui_issues.md index 3a3ca0ed17e..3f1dc3f0371 100644 --- a/.github/ISSUE_TEMPLATE/ui_issues.md +++ b/.github/ISSUE_TEMPLATE/ui_issues.md @@ -4,26 +4,16 @@ about: You have usage feedback for the browser based UI --- - + ### Overview of the Issue - + ### Reproduction Steps - +UIs? ---> ### Consul Version - + ### Browser and Operating system details - + ### Screengrabs / Web Inspector logs - +itself. ---> diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index 7f1e645aa33..ed7531f38ea 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -1,10 +1,6 @@ ### Description - + ### Testing & Reproduction steps From 82b5b4cc9216cd3f2ad5ef05ad239ffa028282bb Mon Sep 17 00:00:00 2001 From: Dan Stough Date: Sat, 18 Feb 2023 14:58:39 -0500 Subject: [PATCH 025/262] fix: revert go mod compat for sdk,api to 1.19 (#16323) --- api/go.mod | 2 +- envoyextensions/go.mod | 2 +- sdk/freeport/freeport.go | 6 +++++- sdk/go.mod | 2 +- troubleshoot/go.mod | 2 +- 5 files changed, 9 insertions(+), 5 deletions(-) diff --git a/api/go.mod b/api/go.mod index d9a68569df7..c987fde1abe 100644 --- a/api/go.mod +++ b/api/go.mod @@ -1,6 +1,6 @@ module github.com/hashicorp/consul/api -go 1.20 +go 1.19 replace github.com/hashicorp/consul/sdk => ../sdk diff --git a/envoyextensions/go.mod b/envoyextensions/go.mod index 5a73e969c2d..f96560804c9 100644 --- a/envoyextensions/go.mod +++ b/envoyextensions/go.mod @@ -1,6 +1,6 @@ module github.com/hashicorp/consul/envoyextensions -go 1.20 +go 1.19 replace github.com/hashicorp/consul/api => ../api diff --git a/sdk/freeport/freeport.go b/sdk/freeport/freeport.go index 6c275fe8667..c51ef981539 100644 --- a/sdk/freeport/freeport.go +++ b/sdk/freeport/freeport.go @@ -76,6 +76,9 @@ var ( // total is the total number of available ports in the block for use. total int + // seededRand is a random generator that is pre-seeded from the current time. + seededRand *rand.Rand + // stopCh is used to signal to background goroutines to terminate. Only // really exists for the safety of reset() during unit tests. stopCh chan struct{} @@ -114,6 +117,7 @@ func initialize() { panic("freeport: block size too big or too many blocks requested") } + seededRand = rand.New(rand.NewSource(time.Now().UnixNano())) // This is compatible with go 1.19 but unnecessary in >= go1.20 firstPort, lockLn = alloc() condNotEmpty = sync.NewCond(&mu) @@ -255,7 +259,7 @@ func adjustMaxBlocks() (int, error) { // be automatically released when the application terminates. func alloc() (int, net.Listener) { for i := 0; i < attempts; i++ { - block := int(rand.Int31n(int32(effectiveMaxBlocks))) + block := int(seededRand.Int31n(int32(effectiveMaxBlocks))) firstPort := lowPort + block*blockSize ln, err := net.ListenTCP("tcp", tcpAddr("127.0.0.1", firstPort)) if err != nil { diff --git a/sdk/go.mod b/sdk/go.mod index 63ad3671a3e..8a04b9e1035 100644 --- a/sdk/go.mod +++ b/sdk/go.mod @@ -1,6 +1,6 @@ module github.com/hashicorp/consul/sdk -go 1.20 +go 1.19 require ( github.com/hashicorp/go-cleanhttp v0.5.1 diff --git a/troubleshoot/go.mod b/troubleshoot/go.mod index cf82c88f1e1..c4e445ee05f 100644 --- a/troubleshoot/go.mod +++ b/troubleshoot/go.mod @@ -1,6 +1,6 @@ module github.com/hashicorp/consul/troubleshoot -go 1.20 +go 1.19 replace github.com/hashicorp/consul/api => ../api From 8e5942f5caee081cd78870f30df5462fbdd49369 Mon Sep 17 00:00:00 2001 From: cskh Date: Tue, 21 Feb 2023 08:28:13 -0500 Subject: [PATCH 026/262] fix: add tls config to unix socket when https is used (#16301) * fix: add tls config to unix socket when https is used * unit test and changelog --- .changelog/16301.txt | 3 ++ agent/agent.go | 3 +- agent/http_test.go | 100 +++++++++++++++++++++++++++++++++++++++++-- 3 files changed, 102 insertions(+), 4 deletions(-) create mode 100644 .changelog/16301.txt diff --git a/.changelog/16301.txt b/.changelog/16301.txt new file mode 100644 index 00000000000..e1dc5deb1c5 --- /dev/null +++ b/.changelog/16301.txt @@ -0,0 +1,3 @@ +```release-note:bug +agent configuration: Fix issue of using unix socket when https is used. +``` diff --git a/agent/agent.go b/agent/agent.go index c10537fd82b..ec148637421 100644 --- a/agent/agent.go +++ b/agent/agent.go @@ -1051,7 +1051,8 @@ func (a *Agent) listenHTTP() ([]apiServer, error) { for _, l := range listeners { var tlscfg *tls.Config _, isTCP := l.(*tcpKeepAliveListener) - if isTCP && proto == "https" { + isUnix := l.Addr().Network() == "unix" + if (isTCP || isUnix) && proto == "https" { tlscfg = a.tlsConfigurator.IncomingHTTPSConfig() l = tls.NewListener(l, tlscfg) } diff --git a/agent/http_test.go b/agent/http_test.go index 39963be0417..7f95e38ce76 100644 --- a/agent/http_test.go +++ b/agent/http_test.go @@ -11,6 +11,7 @@ import ( "net/http" "net/http/httptest" "net/netip" + "net/url" "os" "path/filepath" "runtime" @@ -140,6 +141,95 @@ func TestHTTPServer_UnixSocket_FileExists(t *testing.T) { } } +func TestHTTPSServer_UnixSocket(t *testing.T) { + if testing.Short() { + t.Skip("too slow for testing.Short") + } + + t.Parallel() + if runtime.GOOS == "windows" { + t.SkipNow() + } + + tempDir := testutil.TempDir(t, "consul") + socket := filepath.Join(tempDir, "test.sock") + + a := StartTestAgent(t, TestAgent{ + UseHTTPS: true, + HCL: ` + addresses { + https = "unix://` + socket + `" + } + unix_sockets { + mode = "0777" + } + tls { + defaults { + ca_file = "../test/client_certs/rootca.crt" + cert_file = "../test/client_certs/server.crt" + key_file = "../test/client_certs/server.key" + } + } + `, + }) + defer a.Shutdown() + + // Ensure the socket was created + if _, err := os.Stat(socket); err != nil { + t.Fatalf("err: %s", err) + } + + // Ensure the mode was set properly + fi, err := os.Stat(socket) + if err != nil { + t.Fatalf("err: %s", err) + } + if fi.Mode().String() != "Srwxrwxrwx" { + t.Fatalf("bad permissions: %s", fi.Mode()) + } + + // Make an HTTP/2-enabled client, using the API helpers to set + // up TLS to be as normal as possible for Consul. + tlscfg := &api.TLSConfig{ + Address: "consul.test", + KeyFile: "../test/client_certs/client.key", + CertFile: "../test/client_certs/client.crt", + CAFile: "../test/client_certs/rootca.crt", + } + tlsccfg, err := api.SetupTLSConfig(tlscfg) + if err != nil { + t.Fatalf("err: %v", err) + } + transport := api.DefaultConfig().Transport + transport.TLSHandshakeTimeout = 30 * time.Second + transport.TLSClientConfig = tlsccfg + if err := http2.ConfigureTransport(transport); err != nil { + t.Fatalf("err: %v", err) + } + transport.DialContext = func(_ context.Context, _, _ string) (net.Conn, error) { + return net.Dial("unix", socket) + } + client := &http.Client{Transport: transport} + + u, err := url.Parse("https://unix" + socket) + if err != nil { + t.Fatalf("err: %s", err) + } + u.Path = "/v1/agent/self" + u.Scheme = "https" + resp, err := client.Get(u.String()) + if err != nil { + t.Fatalf("err: %s", err) + } + defer resp.Body.Close() + + if body, err := io.ReadAll(resp.Body); err != nil || len(body) == 0 { + t.Fatalf("bad: %s %v", body, err) + } else if !strings.Contains(string(body), "NodeName") { + t.Fatalf("NodeName not found in results: %s", string(body)) + } +} + func TestSetupHTTPServer_HTTP2(t *testing.T) { if testing.Short() { t.Skip("too slow for testing.Short") @@ -151,9 +241,13 @@ func TestSetupHTTPServer_HTTP2(t *testing.T) { a := StartTestAgent(t, TestAgent{ UseHTTPS: true, HCL: ` - key_file = "../test/client_certs/server.key" - cert_file = "../test/client_certs/server.crt" - ca_file = "../test/client_certs/rootca.crt" + tls { + defaults { + ca_file = "../test/client_certs/rootca.crt" + cert_file = "../test/client_certs/server.crt" + key_file = "../test/client_certs/server.key" + } + } `, }) defer a.Shutdown() From 9d55cd1f185d5e734558d3143888cf949356b8d7 Mon Sep 17 00:00:00 2001 From: wangxinyi7 <121973291+wangxinyi7@users.noreply.github.com> Date: Tue, 21 Feb 2023 08:47:11 -0800 Subject: [PATCH 027/262] fix flakieness (#16338) --- .../test/ratelimit/ratelimit_test.go | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/test/integration/consul-container/test/ratelimit/ratelimit_test.go b/test/integration/consul-container/test/ratelimit/ratelimit_test.go index bde1b44be9b..cb5c259eefe 100644 --- a/test/integration/consul-container/test/ratelimit/ratelimit_test.go +++ b/test/integration/consul-container/test/ratelimit/ratelimit_test.go @@ -46,6 +46,7 @@ func TestServerRequestRateLimit(t *testing.T) { description string cmd string operations []operation + mode string } getKV := action{ @@ -70,6 +71,7 @@ func TestServerRequestRateLimit(t *testing.T) { { description: "HTTP & net/RPC / Mode: disabled - errors: no / exceeded logs: no / metrics: no", cmd: `-hcl=limits { request_limits { mode = "disabled" read_rate = 0 write_rate = 0 }}`, + mode: "disabled", operations: []operation{ { action: putKV, @@ -88,6 +90,7 @@ func TestServerRequestRateLimit(t *testing.T) { { description: "HTTP & net/RPC / Mode: permissive - errors: no / exceeded logs: yes / metrics: yes", cmd: `-hcl=limits { request_limits { mode = "permissive" read_rate = 0 write_rate = 0 }}`, + mode: "permissive", operations: []operation{ { action: putKV, @@ -106,6 +109,7 @@ func TestServerRequestRateLimit(t *testing.T) { { description: "HTTP & net/RPC / Mode: enforcing - errors: yes / exceeded logs: yes / metrics: yes", cmd: `-hcl=limits { request_limits { mode = "enforcing" read_rate = 0 write_rate = 0 }}`, + mode: "enforcing", operations: []operation{ { action: putKV, @@ -154,7 +158,7 @@ func TestServerRequestRateLimit(t *testing.T) { // require.NoError(t, err) if metricsInfo != nil && err == nil { if op.expectMetric { - checkForMetric(r, metricsInfo, op.action.rateLimitOperation, op.action.rateLimitType) + checkForMetric(r, metricsInfo, op.action.rateLimitOperation, op.action.rateLimitType, tc.mode) } } @@ -171,17 +175,17 @@ func TestServerRequestRateLimit(t *testing.T) { } } -func checkForMetric(t *retry.R, metricsInfo *api.MetricsInfo, operationName string, expectedLimitType string) { - const counterName = "rpc.rate_limit.exceeded" +func checkForMetric(t *retry.R, metricsInfo *api.MetricsInfo, operationName string, expectedLimitType string, expectedMode string) { + const counterName = "consul.rpc.rate_limit.exceeded" var counter api.SampledValue for _, c := range metricsInfo.Counters { - if counter.Name == counterName { + if c.Name == counterName { counter = c break } } - require.NotNilf(t, counter, "counter not found: %s", counterName) + require.NotEmptyf(t, counter.Name, "counter not found: %s", counterName) operation, ok := counter.Labels["op"] require.True(t, ok) @@ -193,9 +197,9 @@ func checkForMetric(t *retry.R, metricsInfo *api.MetricsInfo, operationName stri require.True(t, ok) if operation == operationName { - require.Equal(t, 2, counter.Count) + require.GreaterOrEqual(t, counter.Count, 1) require.Equal(t, expectedLimitType, limitType) - require.Equal(t, "disabled", mode) + require.Equal(t, expectedMode, mode) } } From 8997f2bff17ece89d081640c7afb2579e713e9c7 Mon Sep 17 00:00:00 2001 From: Nick Irvine <115657443+nfi-hashicorp@users.noreply.github.com> Date: Tue, 21 Feb 2023 11:48:25 -0700 Subject: [PATCH 028/262] chore: document and unit test sdk/testutil/retry (#16049) --- sdk/testutil/retry/retry.go | 56 ++++++++++++++++++++++++++++---- sdk/testutil/retry/retry_test.go | 52 +++++++++++++++++++++++++++++ 2 files changed, 101 insertions(+), 7 deletions(-) diff --git a/sdk/testutil/retry/retry.go b/sdk/testutil/retry/retry.go index 6e3ab3d466e..4ee54ae83e2 100644 --- a/sdk/testutil/retry/retry.go +++ b/sdk/testutil/retry/retry.go @@ -5,10 +5,17 @@ // func TestX(t *testing.T) { // retry.Run(t, func(r *retry.R) { // if err := foo(); err != nil { -// r.Fatal("f: ", err) +// r.Errorf("foo: %s", err) +// return // } // }) // } +// +// Run uses the DefaultFailer, which is a Timer with a Timeout of 7s, +// and a Wait of 25ms. To customize, use RunWith. +// +// WARNING: unlike *testing.T, *retry.R#Fatal and FailNow *do not* +// fail the test function entirely, only the current run the retry func package retry import ( @@ -31,8 +38,16 @@ type Failer interface { } // R provides context for the retryer. +// +// Logs from Logf, (Error|Fatal)(f) are gathered in an internal buffer +// and printed only if the retryer fails. Printed logs are deduped and +// prefixed with source code line numbers type R struct { - fail bool + // fail is set by FailNow and (Fatal|Error)(f). It indicates the pass + // did not succeed, and should be retried + fail bool + // done is set by Stop. It indicates the entire run was a failure, + // and triggers t.FailNow() done bool output []string } @@ -43,33 +58,55 @@ func (r *R) Logf(format string, args ...interface{}) { func (r *R) Helper() {} -var runFailed = struct{}{} +// runFailed is a sentinel value to indicate that the func itself +// didn't panic, rather that `FailNow` was called. +type runFailed struct{} +// FailNow stops run execution. It is roughly equivalent to: +// +// r.Error("") +// return +// +// inside the function being run. func (r *R) FailNow() { r.fail = true - panic(runFailed) + panic(runFailed{}) } +// Fatal is equivalent to r.Logf(args) followed by r.FailNow(), i.e. the run +// function should be exited. Retries on the next run are allowed. Fatal is +// equivalent to +// +// r.Error(args) +// return +// +// inside the function being run. func (r *R) Fatal(args ...interface{}) { r.log(fmt.Sprint(args...)) r.FailNow() } +// Fatalf is like Fatal but allows a format string func (r *R) Fatalf(format string, args ...interface{}) { r.log(fmt.Sprintf(format, args...)) r.FailNow() } +// Error indicates the current run encountered an error and should be retried. +// It *does not* stop execution of the rest of the run function. func (r *R) Error(args ...interface{}) { r.log(fmt.Sprint(args...)) r.fail = true } +// Errorf is like Error but allows a format string func (r *R) Errorf(format string, args ...interface{}) { r.log(fmt.Sprintf(format, args...)) r.fail = true } +// If err is non-nil, equivalent to r.Fatal(err.Error()) followed by +// r.FailNow(). Otherwise a no-op. func (r *R) Check(err error) { if err != nil { r.log(err.Error()) @@ -81,7 +118,8 @@ func (r *R) log(s string) { r.output = append(r.output, decorate(s)) } -// Stop retrying, and fail the test with the specified error. +// Stop retrying, and fail the test, logging the specified error. +// Does not stop execution, so return should be called after. func (r *R) Stop(err error) { r.log(err.Error()) r.done = true @@ -142,9 +180,11 @@ func run(r Retryer, t Failer, f func(r *R)) { } for r.Continue() { + // run f(rr), but if recover yields a runFailed value, we know + // FailNow was called. func() { defer func() { - if p := recover(); p != nil && p != runFailed { + if p := recover(); p != nil && p != (runFailed{}) { panic(p) } }() @@ -163,7 +203,8 @@ func run(r Retryer, t Failer, f func(r *R)) { fail() } -// DefaultFailer provides default retry.Run() behavior for unit tests. +// DefaultFailer provides default retry.Run() behavior for unit tests, namely +// 7s timeout with a wait of 25ms func DefaultFailer() *Timer { return &Timer{Timeout: 7 * time.Second, Wait: 25 * time.Millisecond} } @@ -213,6 +254,7 @@ type Timer struct { Wait time.Duration // stop is the timeout deadline. + // TODO: Next()? // Set on the first invocation of Next(). stop time.Time } diff --git a/sdk/testutil/retry/retry_test.go b/sdk/testutil/retry/retry_test.go index 31923a0bfb2..ae1c81f6be4 100644 --- a/sdk/testutil/retry/retry_test.go +++ b/sdk/testutil/retry/retry_test.go @@ -5,6 +5,7 @@ import ( "testing" "time" + "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) @@ -41,6 +42,56 @@ func TestRetryer(t *testing.T) { } } +func TestBasics(t *testing.T) { + t.Run("Error allows retry", func(t *testing.T) { + i := 0 + Run(t, func(r *R) { + i++ + t.Logf("i: %d; r: %#v", i, r) + if i == 1 { + r.Errorf("Errorf, i: %d", i) + return + } + }) + assert.Equal(t, i, 2) + }) + + t.Run("Fatal returns from func, but does not fail test", func(t *testing.T) { + i := 0 + gotHere := false + ft := &fakeT{} + Run(ft, func(r *R) { + i++ + t.Logf("i: %d; r: %#v", i, r) + if i == 1 { + r.Fatalf("Fatalf, i: %d", i) + gotHere = true + } + }) + + assert.False(t, gotHere) + assert.Equal(t, i, 2) + // surprisingly, r.FailNow() *does not* trigger ft.FailNow()! + assert.Equal(t, ft.fails, 0) + }) + + t.Run("Func being run can panic with struct{}{}", func(t *testing.T) { + gotPanic := false + func() { + defer func() { + if p := recover(); p != nil { + gotPanic = true + } + }() + Run(t, func(r *R) { + panic(struct{}{}) + }) + }() + + assert.True(t, gotPanic) + }) +} + func TestRunWith(t *testing.T) { t.Run("calls FailNow after exceeding retries", func(t *testing.T) { ft := &fakeT{} @@ -65,6 +116,7 @@ func TestRunWith(t *testing.T) { r.Fatalf("not yet") }) + // TODO: these should all be assert require.Equal(t, 2, iter) require.Equal(t, 1, ft.fails) require.Len(t, ft.out, 1) From 7f9ec7893218bf6868aba1aebd2caaf19b2d7b10 Mon Sep 17 00:00:00 2001 From: Andrew Stucki Date: Tue, 21 Feb 2023 14:12:19 -0500 Subject: [PATCH 029/262] [API Gateway] Validate listener name is not empty (#16340) * [API Gateway] Validate listener name is not empty * Update docstrings and test --- agent/structs/config_entry_gateways.go | 11 ++++-- agent/structs/config_entry_gateways_test.go | 35 +++++++++++++++++++ api/config_entry_gateways.go | 5 ++- .../case-api-gateway-tcp-conflicted/setup.sh | 1 + 4 files changed, 46 insertions(+), 6 deletions(-) diff --git a/agent/structs/config_entry_gateways.go b/agent/structs/config_entry_gateways.go index c757dce984f..885a301fc46 100644 --- a/agent/structs/config_entry_gateways.go +++ b/agent/structs/config_entry_gateways.go @@ -2,6 +2,7 @@ package structs import ( "fmt" + "regexp" "sort" "strings" @@ -778,9 +779,14 @@ func (e *APIGatewayConfigEntry) Validate() error { return e.validateListeners() } +var listenerNameRegex = regexp.MustCompile(`^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$`) + func (e *APIGatewayConfigEntry) validateListenerNames() error { listeners := make(map[string]struct{}) for _, listener := range e.Listeners { + if len(listener.Name) < 1 || !listenerNameRegex.MatchString(listener.Name) { + return fmt.Errorf("listener name %q is invalid, must be at least 1 character and contain only letters, numbers, or dashes", listener.Name) + } if _, found := listeners[listener.Name]; found { return fmt.Errorf("found multiple listeners with the name %q", listener.Name) } @@ -861,9 +867,8 @@ const ( // APIGatewayListener represents an individual listener for an APIGateway type APIGatewayListener struct { - // Name is the optional name of the listener in a given gateway. This is - // optional but must be unique within a gateway; therefore, if a gateway - // has more than a single listener, all but one must specify a Name. + // Name is the name of the listener in a given gateway. This must be + // unique within a gateway. Name string // Hostname is the host name that a listener should be bound to. If // unspecified, the listener accepts requests for all hostnames. diff --git a/agent/structs/config_entry_gateways_test.go b/agent/structs/config_entry_gateways_test.go index dd1f624ecad..ca68ea4f40a 100644 --- a/agent/structs/config_entry_gateways_test.go +++ b/agent/structs/config_entry_gateways_test.go @@ -1143,12 +1143,40 @@ func TestAPIGateway_Listeners(t *testing.T) { }, validateErr: "multiple listeners with the name", }, + "empty listener name": { + entry: &APIGatewayConfigEntry{ + Kind: "api-gateway", + Name: "api-gw-one", + Listeners: []APIGatewayListener{ + { + Port: 80, + Protocol: "tcp", + }, + }, + }, + validateErr: "listener name \"\" is invalid, must be at least 1 character and contain only letters, numbers, or dashes", + }, + "invalid listener name": { + entry: &APIGatewayConfigEntry{ + Kind: "api-gateway", + Name: "api-gw-one", + Listeners: []APIGatewayListener{ + { + Port: 80, + Protocol: "tcp", + Name: "/", + }, + }, + }, + validateErr: "listener name \"/\" is invalid, must be at least 1 character and contain only letters, numbers, or dashes", + }, "merged listener protocol conflict": { entry: &APIGatewayConfigEntry{ Kind: "api-gateway", Name: "api-gw-two", Listeners: []APIGatewayListener{ { + Name: "listener-one", Port: 80, Protocol: ListenerProtocolHTTP, }, @@ -1167,6 +1195,7 @@ func TestAPIGateway_Listeners(t *testing.T) { Name: "api-gw-three", Listeners: []APIGatewayListener{ { + Name: "listener", Port: 80, Hostname: "host.one", }, @@ -1185,6 +1214,7 @@ func TestAPIGateway_Listeners(t *testing.T) { Name: "api-gw-four", Listeners: []APIGatewayListener{ { + Name: "listener", Port: 80, Hostname: "host.one", Protocol: APIGatewayListenerProtocol("UDP"), @@ -1199,6 +1229,7 @@ func TestAPIGateway_Listeners(t *testing.T) { Name: "api-gw-five", Listeners: []APIGatewayListener{ { + Name: "listener", Port: 80, Hostname: "host.one", Protocol: APIGatewayListenerProtocol("tcp"), @@ -1213,6 +1244,7 @@ func TestAPIGateway_Listeners(t *testing.T) { Name: "api-gw-six", Listeners: []APIGatewayListener{ { + Name: "listener", Port: -1, Protocol: APIGatewayListenerProtocol("tcp"), }, @@ -1226,6 +1258,7 @@ func TestAPIGateway_Listeners(t *testing.T) { Name: "api-gw-seven", Listeners: []APIGatewayListener{ { + Name: "listener", Port: 80, Hostname: "*.*.host.one", Protocol: APIGatewayListenerProtocol("http"), @@ -1240,6 +1273,7 @@ func TestAPIGateway_Listeners(t *testing.T) { Name: "api-gw-eight", Listeners: []APIGatewayListener{ { + Name: "listener", Port: 80, Hostname: "host.one", Protocol: APIGatewayListenerProtocol("http"), @@ -1259,6 +1293,7 @@ func TestAPIGateway_Listeners(t *testing.T) { Name: "api-gw-nine", Listeners: []APIGatewayListener{ { + Name: "listener", Port: 80, Hostname: "host.one", Protocol: APIGatewayListenerProtocol("http"), diff --git a/api/config_entry_gateways.go b/api/config_entry_gateways.go index 209c7ae0df9..05e43832c1f 100644 --- a/api/config_entry_gateways.go +++ b/api/config_entry_gateways.go @@ -268,9 +268,8 @@ func (g *APIGatewayConfigEntry) GetModifyIndex() uint64 { return g.ModifyInd // APIGatewayListener represents an individual listener for an APIGateway type APIGatewayListener struct { - // Name is the optional name of the listener in a given gateway. This is - // optional, however, it must be unique. Therefore, if a gateway has more - // than a single listener, all but one must specify a Name. + // Name is the name of the listener in a given gateway. This must be + // unique within a gateway. Name string // Hostname is the host name that a listener should be bound to, if // unspecified, the listener accepts requests for all hostnames. diff --git a/test/integration/connect/envoy/case-api-gateway-tcp-conflicted/setup.sh b/test/integration/connect/envoy/case-api-gateway-tcp-conflicted/setup.sh index bb9baacbb0f..76b656ac0d4 100644 --- a/test/integration/connect/envoy/case-api-gateway-tcp-conflicted/setup.sh +++ b/test/integration/connect/envoy/case-api-gateway-tcp-conflicted/setup.sh @@ -9,6 +9,7 @@ listeners = [ { port = 9999 protocol = "tcp" + name = "listener" } ] ' From ad865f549be0af3af77de5939f2f6948034ee13e Mon Sep 17 00:00:00 2001 From: Derek Menteer <105233703+hashi-derek@users.noreply.github.com> Date: Tue, 21 Feb 2023 13:59:36 -0600 Subject: [PATCH 030/262] Fix issue with peer services incorrectly appearing as connect-enabled. (#16339) Prior to this commit, all peer services were transmitted as connect-enabled as long as a one or more mesh-gateways were healthy. With this change, there is now a difference between typical services and connect services transmitted via peering. A service will be reported as "connect-enabled" as long as any of these conditions are met: 1. a connect-proxy sidecar is registered for the service name. 2. a connect-native instance of the service is registered. 3. a service resolver / splitter / router is registered for the service name. 4. a terminating gateway has registered the service. --- .changelog/16339.txt | 3 + agent/consul/state/catalog.go | 48 ++++- agent/consul/state/catalog_test.go | 55 +++++- agent/consul/state/peering.go | 185 +++++++++++++----- agent/consul/state/peering_test.go | 102 +++++++++- .../services/peerstream/stream_test.go | 75 ++++--- .../peerstream/subscription_manager.go | 2 +- .../peerstream/subscription_manager_test.go | 29 ++- .../exported_peered_services_test.go | 8 + agent/structs/peering.go | 3 +- agent/structs/structs.go | 6 + 11 files changed, 424 insertions(+), 92 deletions(-) create mode 100644 .changelog/16339.txt diff --git a/.changelog/16339.txt b/.changelog/16339.txt new file mode 100644 index 00000000000..cf44f010aff --- /dev/null +++ b/.changelog/16339.txt @@ -0,0 +1,3 @@ +```release-note:bug +peering: Fix bug where services were incorrectly imported as connect-enabled. +``` diff --git a/agent/consul/state/catalog.go b/agent/consul/state/catalog.go index 4d645013680..39a40d9cad3 100644 --- a/agent/consul/state/catalog.go +++ b/agent/consul/state/catalog.go @@ -900,12 +900,17 @@ func ensureServiceTxn(tx WriteTxn, idx uint64, node string, preserveIndexes bool return fmt.Errorf("failed updating gateway mapping: %s", err) } + if svc.PeerName == "" && sn.Name != "" { + if err := upsertKindServiceName(tx, idx, structs.ServiceKindConnectEnabled, sn); err != nil { + return fmt.Errorf("failed to persist service name as connect-enabled: %v", err) + } + } + + // Update the virtual IP for the service supported, err := virtualIPsSupported(tx, nil) if err != nil { return err } - - // Update the virtual IP for the service if supported { psn := structs.PeeredServiceName{Peer: svc.PeerName, ServiceName: sn} vip, err := assignServiceVirtualIP(tx, idx, psn) @@ -1964,6 +1969,24 @@ func (s *Store) deleteServiceTxn(tx WriteTxn, idx uint64, nodeName, serviceID st return fmt.Errorf("Could not find any service %s: %s", svc.ServiceName, err) } + // Cleanup ConnectEnabled for this service if none exist. + if svc.PeerName == "" && (svc.ServiceKind == structs.ServiceKindConnectProxy || svc.ServiceConnect.Native) { + service := svc.ServiceName + if svc.ServiceKind == structs.ServiceKindConnectProxy { + service = svc.ServiceProxy.DestinationServiceName + } + sn := structs.ServiceName{Name: service, EnterpriseMeta: svc.EnterpriseMeta} + connectEnabled, err := serviceHasConnectEnabledInstances(tx, sn.Name, &sn.EnterpriseMeta) + if err != nil { + return fmt.Errorf("failed to search for connect instances for service %q: %w", sn.Name, err) + } + if !connectEnabled { + if err := cleanupKindServiceName(tx, idx, sn, structs.ServiceKindConnectEnabled); err != nil { + return fmt.Errorf("failed to cleanup connect-enabled service name: %v", err) + } + } + } + if svc.PeerName == "" { sn := structs.ServiceName{Name: svc.ServiceName, EnterpriseMeta: svc.EnterpriseMeta} if err := cleanupGatewayWildcards(tx, idx, sn, false); err != nil { @@ -3731,6 +3754,27 @@ func serviceHasConnectInstances(tx WriteTxn, serviceName string, entMeta *acl.En return hasConnectInstance, hasNonConnectInstance, nil } +// serviceHasConnectEnabledInstances returns whether the given service name +// has a corresponding connect-proxy or connect-native instance. +// This function is mostly a clone of `serviceHasConnectInstances`, but it has +// an early return to improve performance and returns true if at least one +// connect-native instance exists. +func serviceHasConnectEnabledInstances(tx WriteTxn, serviceName string, entMeta *acl.EnterpriseMeta) (bool, error) { + query := Query{ + Value: serviceName, + EnterpriseMeta: *entMeta, + } + + svc, err := tx.First(tableServices, indexConnect, query) + if err != nil { + return false, fmt.Errorf("failed service lookup: %w", err) + } + if svc != nil { + return true, nil + } + return false, nil +} + // updateGatewayService associates services with gateways after an eligible event // ie. Registering a service in a namespace targeted by a gateway func updateGatewayService(tx WriteTxn, idx uint64, mapping *structs.GatewayService) error { diff --git a/agent/consul/state/catalog_test.go b/agent/consul/state/catalog_test.go index d354b9b094e..cef5ba0a0a0 100644 --- a/agent/consul/state/catalog_test.go +++ b/agent/consul/state/catalog_test.go @@ -8664,7 +8664,7 @@ func TestStateStore_EnsureService_ServiceNames(t *testing.T) { }, } - var idx uint64 + var idx, connectEnabledIdx uint64 testRegisterNode(t, s, idx, "node1") for _, svc := range services { @@ -8678,7 +8678,28 @@ func TestStateStore_EnsureService_ServiceNames(t *testing.T) { require.Len(t, gotNames, 1) require.Equal(t, svc.CompoundServiceName(), gotNames[0].Service) require.Equal(t, svc.Kind, gotNames[0].Kind) + if svc.Kind == structs.ServiceKindConnectProxy { + connectEnabledIdx = idx + } + } + + // A ConnectEnabled service should exist if a corresponding ConnectProxy or ConnectNative service exists. + verifyConnectEnabled := func(expectIdx uint64) { + gotIdx, gotNames, err := s.ServiceNamesOfKind(nil, structs.ServiceKindConnectEnabled) + require.NoError(t, err) + require.Equal(t, expectIdx, gotIdx) + require.Equal(t, []*KindServiceName{ + { + Kind: structs.ServiceKindConnectEnabled, + Service: structs.NewServiceName("foo", entMeta), + RaftIndex: structs.RaftIndex{ + CreateIndex: connectEnabledIdx, + ModifyIndex: connectEnabledIdx, + }, + }, + }, gotNames) } + verifyConnectEnabled(connectEnabledIdx) // Register another ingress gateway and there should be two names under the kind index newIngress := structs.NodeService{ @@ -8749,6 +8770,38 @@ func TestStateStore_EnsureService_ServiceNames(t *testing.T) { require.NoError(t, err) require.Equal(t, idx, gotIdx) require.Empty(t, got) + + // A ConnectEnabled entry should not be removed until all corresponding services are removed. + { + verifyConnectEnabled(connectEnabledIdx) + // Add a connect-native service. + idx++ + require.NoError(t, s.EnsureService(idx, "node1", &structs.NodeService{ + Kind: structs.ServiceKindTypical, + ID: "foo", + Service: "foo", + Address: "5.5.5.5", + Port: 5555, + EnterpriseMeta: *entMeta, + Connect: structs.ServiceConnect{ + Native: true, + }, + })) + verifyConnectEnabled(connectEnabledIdx) + + // Delete the proxy. This should not clean up the entry, because we still have a + // connect-native service registered. + idx++ + require.NoError(t, s.DeleteService(idx, "node1", "connect-proxy", entMeta, "")) + verifyConnectEnabled(connectEnabledIdx) + + // Remove the connect-native service to clear out the connect-enabled entry. + require.NoError(t, s.DeleteService(idx, "node1", "foo", entMeta, "")) + gotIdx, gotNames, err := s.ServiceNamesOfKind(nil, structs.ServiceKindConnectEnabled) + require.NoError(t, err) + require.Equal(t, idx, gotIdx) + require.Empty(t, gotNames) + } } func assertMaxIndexes(t *testing.T, tx ReadTxn, expect map[string]uint64, skip ...string) { diff --git a/agent/consul/state/peering.go b/agent/consul/state/peering.go index 708b28848d9..491d4887a23 100644 --- a/agent/consul/state/peering.go +++ b/agent/consul/state/peering.go @@ -770,88 +770,181 @@ func exportedServicesForPeerTxn( maxIdx := peering.ModifyIndex entMeta := structs.NodeEnterpriseMetaInPartition(peering.Partition) - idx, conf, err := getExportedServicesConfigEntryTxn(tx, ws, nil, entMeta) + idx, exportConf, err := getExportedServicesConfigEntryTxn(tx, ws, nil, entMeta) if err != nil { return 0, nil, fmt.Errorf("failed to fetch exported-services config entry: %w", err) } if idx > maxIdx { maxIdx = idx } - if conf == nil { + if exportConf == nil { return maxIdx, &structs.ExportedServiceList{}, nil } var ( - normalSet = make(map[structs.ServiceName]struct{}) - discoSet = make(map[structs.ServiceName]struct{}) + // exportedServices will contain the listing of all service names that are being exported + // and will need to be queried for connect / discovery chain information. + exportedServices = make(map[structs.ServiceName]struct{}) + + // exportedConnectServices will contain the listing of all connect service names that are being exported. + exportedConnectServices = make(map[structs.ServiceName]struct{}) + + // namespaceConnectServices provides a listing of all connect service names for a particular partition+namespace pair. + namespaceConnectServices = make(map[acl.EnterpriseMeta]map[string]struct{}) + + // namespaceDiscoChains provides a listing of all disco chain names for a particular partition+namespace pair. + namespaceDiscoChains = make(map[acl.EnterpriseMeta]map[string]struct{}) ) - // At least one of the following should be true for a name for it to - // replicate: - // - // - are a discovery chain by definition (service-router, service-splitter, service-resolver) - // - have an explicit sidecar kind=connect-proxy - // - use connect native mode + // Helper function for inserting data and auto-creating maps. + insertEntry := func(m map[acl.EnterpriseMeta]map[string]struct{}, entMeta acl.EnterpriseMeta, name string) { + names, ok := m[entMeta] + if !ok { + names = make(map[string]struct{}) + m[entMeta] = names + } + names[name] = struct{}{} + } - for _, svc := range conf.Services { + // Build the set of all services that will be exported. + // Any possible namespace wildcards or "consul" services should be removed by this step. + for _, svc := range exportConf.Services { // Prevent exporting the "consul" service. if svc.Name == structs.ConsulServiceName { continue } - svcMeta := acl.NewEnterpriseMetaWithPartition(entMeta.PartitionOrDefault(), svc.Namespace) + svcEntMeta := acl.NewEnterpriseMetaWithPartition(entMeta.PartitionOrDefault(), svc.Namespace) + svcName := structs.NewServiceName(svc.Name, &svcEntMeta) - sawPeer := false + peerFound := false for _, consumer := range svc.Consumers { - name := structs.NewServiceName(svc.Name, &svcMeta) - - if _, ok := normalSet[name]; ok { - // Service was covered by a wildcard that was already accounted for - continue + if consumer.Peer == peering.Name { + peerFound = true + break } - if consumer.Peer != peering.Name { - continue + } + // Only look for more information if the matching peer was found. + if !peerFound { + continue + } + + // If this isn't a wildcard, we can simply add it to the list of services to watch and move to the next entry. + if svc.Name != structs.WildcardSpecifier { + exportedServices[svcName] = struct{}{} + continue + } + + // If all services in the namespace are exported by the wildcard, query those service names. + idx, typicalServices, err := serviceNamesOfKindTxn(tx, ws, structs.ServiceKindTypical, svcEntMeta) + if err != nil { + return 0, nil, fmt.Errorf("failed to get typical service names: %w", err) + } + if idx > maxIdx { + maxIdx = idx + } + for _, sn := range typicalServices { + // Prevent exporting the "consul" service. + if sn.Service.Name != structs.ConsulServiceName { + exportedServices[sn.Service] = struct{}{} } - sawPeer = true + } - if svc.Name != structs.WildcardSpecifier { - normalSet[name] = struct{}{} + // List all config entries of kind service-resolver, service-router, service-splitter, because they + // will be exported as connect services. + idx, discoChains, err := listDiscoveryChainNamesTxn(tx, ws, nil, svcEntMeta) + if err != nil { + return 0, nil, fmt.Errorf("failed to get discovery chain names: %w", err) + } + if idx > maxIdx { + maxIdx = idx + } + for _, sn := range discoChains { + // Prevent exporting the "consul" service. + if sn.Name != structs.ConsulServiceName { + exportedConnectServices[sn] = struct{}{} + insertEntry(namespaceDiscoChains, svcEntMeta, sn.Name) } } + } - // If the target peer is a consumer, and all services in the namespace are exported, query those service names. - if sawPeer && svc.Name == structs.WildcardSpecifier { - idx, typicalServices, err := serviceNamesOfKindTxn(tx, ws, structs.ServiceKindTypical, svcMeta) + // At least one of the following should be true for a name to replicate it as a *connect* service: + // - are a discovery chain by definition (service-router, service-splitter, service-resolver) + // - have an explicit sidecar kind=connect-proxy + // - use connect native mode + // - are registered with a terminating gateway + populateConnectService := func(sn structs.ServiceName) error { + // Load all disco-chains in this namespace if we haven't already. + if _, ok := namespaceDiscoChains[sn.EnterpriseMeta]; !ok { + // Check to see if we have a discovery chain with the same name. + idx, chains, err := listDiscoveryChainNamesTxn(tx, ws, nil, sn.EnterpriseMeta) if err != nil { - return 0, nil, fmt.Errorf("failed to get typical service names: %w", err) + return fmt.Errorf("failed to get connect services: %w", err) } if idx > maxIdx { maxIdx = idx } - for _, s := range typicalServices { - // Prevent exporting the "consul" service. - if s.Service.Name == structs.ConsulServiceName { - continue - } - normalSet[s.Service] = struct{}{} + for _, sn := range chains { + insertEntry(namespaceDiscoChains, sn.EnterpriseMeta, sn.Name) } + } + // Check to see if we have the connect service. + if _, ok := namespaceDiscoChains[sn.EnterpriseMeta][sn.Name]; ok { + exportedConnectServices[sn] = struct{}{} + // Do not early return because we have multiple watches that should be established. + } - // list all config entries of kind service-resolver, service-router, service-splitter? - idx, discoChains, err := listDiscoveryChainNamesTxn(tx, ws, nil, svcMeta) + // Load all services in this namespace if we haven't already. + if _, ok := namespaceConnectServices[sn.EnterpriseMeta]; !ok { + // This is more efficient than querying the service instance table. + idx, connectServices, err := serviceNamesOfKindTxn(tx, ws, structs.ServiceKindConnectEnabled, sn.EnterpriseMeta) if err != nil { - return 0, nil, fmt.Errorf("failed to get discovery chain names: %w", err) + return fmt.Errorf("failed to get connect services: %w", err) } if idx > maxIdx { maxIdx = idx } - for _, sn := range discoChains { - discoSet[sn] = struct{}{} + for _, ksn := range connectServices { + insertEntry(namespaceConnectServices, sn.EnterpriseMeta, ksn.Service.Name) } } + // Check to see if we have the connect service. + if _, ok := namespaceConnectServices[sn.EnterpriseMeta][sn.Name]; ok { + exportedConnectServices[sn] = struct{}{} + // Do not early return because we have multiple watches that should be established. + } + + // Check if the service is exposed via terminating gateways. + svcGateways, err := tx.Get(tableGatewayServices, indexService, sn) + if err != nil { + return fmt.Errorf("failed gateway lookup for %q: %w", sn.Name, err) + } + ws.Add(svcGateways.WatchCh()) + for svc := svcGateways.Next(); svc != nil; svc = svcGateways.Next() { + gs, ok := svc.(*structs.GatewayService) + if !ok { + return fmt.Errorf("failed converting to GatewayService for %q", sn.Name) + } + if gs.GatewayKind == structs.ServiceKindTerminatingGateway { + exportedConnectServices[sn] = struct{}{} + break + } + } + + return nil } - normal := maps.SliceOfKeys(normalSet) - disco := maps.SliceOfKeys(discoSet) + // Perform queries and check if each service is connect-enabled. + for sn := range exportedServices { + // Do not query for data if we already know it's a connect service. + if _, ok := exportedConnectServices[sn]; ok { + continue + } + if err := populateConnectService(sn); err != nil { + return 0, nil, err + } + } + // Fetch the protocol / targets for connect services. chainInfo := make(map[structs.ServiceName]structs.ExportedDiscoveryChainInfo) populateChainInfo := func(svc structs.ServiceName) error { if _, ok := chainInfo[svc]; ok { @@ -899,21 +992,17 @@ func exportedServicesForPeerTxn( return nil } - for _, svc := range normal { - if err := populateChainInfo(svc); err != nil { - return 0, nil, err - } - } - for _, svc := range disco { + for svc := range exportedConnectServices { if err := populateChainInfo(svc); err != nil { return 0, nil, err } } - structs.ServiceList(normal).Sort() + sortedServices := maps.SliceOfKeys(exportedServices) + structs.ServiceList(sortedServices).Sort() list := &structs.ExportedServiceList{ - Services: normal, + Services: sortedServices, DiscoChains: chainInfo, } diff --git a/agent/consul/state/peering_test.go b/agent/consul/state/peering_test.go index dc8dd897462..f7232ca1add 100644 --- a/agent/consul/state/peering_test.go +++ b/agent/consul/state/peering_test.go @@ -1908,18 +1908,28 @@ func TestStateStore_ExportedServicesForPeer(t *testing.T) { }, }, { + // Should be exported as both a normal and disco chain (resolver). Name: "mysql", Consumers: []structs.ServiceConsumer{ {Peer: "my-peering"}, }, }, { + // Should be exported as both a normal and disco chain (connect-proxy). Name: "redis", Consumers: []structs.ServiceConsumer{ {Peer: "my-peering"}, }, }, { + // Should only be exported as a normal service. + Name: "prometheus", + Consumers: []structs.ServiceConsumer{ + {Peer: "my-peering"}, + }, + }, + { + // Should not be exported (different peer consumer) Name: "mongo", Consumers: []structs.ServiceConsumer{ {Peer: "my-other-peering"}, @@ -1932,12 +1942,37 @@ func TestStateStore_ExportedServicesForPeer(t *testing.T) { require.True(t, watchFired(ws)) ws = memdb.NewWatchSet() + // Register extra things so that disco chain entries appear. + lastIdx++ + require.NoError(t, s.EnsureNode(lastIdx, &structs.Node{ + Node: "node1", Address: "10.0.0.1", + })) + lastIdx++ + require.NoError(t, s.EnsureService(lastIdx, "node1", &structs.NodeService{ + Kind: structs.ServiceKindConnectProxy, + ID: "redis-sidecar-proxy", + Service: "redis-sidecar-proxy", + Port: 5005, + Proxy: structs.ConnectProxyConfig{ + DestinationServiceName: "redis", + }, + })) + ensureConfigEntry(t, &structs.ServiceResolverConfigEntry{ + Kind: structs.ServiceResolver, + Name: "mysql", + EnterpriseMeta: *defaultEntMeta, + }) + expect := &structs.ExportedServiceList{ Services: []structs.ServiceName{ { Name: "mysql", EnterpriseMeta: *defaultEntMeta, }, + { + Name: "prometheus", + EnterpriseMeta: *defaultEntMeta, + }, { Name: "redis", EnterpriseMeta: *defaultEntMeta, @@ -1998,17 +2033,21 @@ func TestStateStore_ExportedServicesForPeer(t *testing.T) { ws = memdb.NewWatchSet() expect := &structs.ExportedServiceList{ + // Only "billing" shows up, because there are no other service instances running, + // and "consul" is never exported. Services: []structs.ServiceName{ { Name: "billing", EnterpriseMeta: *defaultEntMeta, }, }, + // Only "mysql" appears because there it has a service resolver. + // "redis" does not appear, because it's a sidecar proxy without a corresponding service, so the wildcard doesn't find it. DiscoChains: map[structs.ServiceName]structs.ExportedDiscoveryChainInfo{ - newSN("billing"): { + newSN("mysql"): { Protocol: "tcp", TCPTargets: []*structs.DiscoveryTarget{ - newTarget("billing", "", "dc1"), + newTarget("mysql", "", "dc1"), }, }, }, @@ -2025,13 +2064,17 @@ func TestStateStore_ExportedServicesForPeer(t *testing.T) { ID: "payments", Service: "payments", Port: 5000, })) - // The proxy will be ignored. + // The proxy will cause "payments" to be output in the disco chains. It will NOT be output + // in the normal services list. lastIdx++ require.NoError(t, s.EnsureService(lastIdx, "foo", &structs.NodeService{ Kind: structs.ServiceKindConnectProxy, ID: "payments-proxy", Service: "payments-proxy", Port: 5000, + Proxy: structs.ConnectProxyConfig{ + DestinationServiceName: "payments", + }, })) lastIdx++ // The consul service should never be exported. @@ -2099,10 +2142,11 @@ func TestStateStore_ExportedServicesForPeer(t *testing.T) { }, DiscoChains: map[structs.ServiceName]structs.ExportedDiscoveryChainInfo{ // NOTE: no consul-redirect here - newSN("billing"): { + // NOTE: no billing here, because it does not have a proxy. + newSN("payments"): { Protocol: "http", }, - newSN("payments"): { + newSN("mysql"): { Protocol: "http", }, newSN("resolver"): { @@ -2129,6 +2173,9 @@ func TestStateStore_ExportedServicesForPeer(t *testing.T) { lastIdx++ require.NoError(t, s.DeleteConfigEntry(lastIdx, structs.ServiceSplitter, "splitter", nil)) + lastIdx++ + require.NoError(t, s.DeleteConfigEntry(lastIdx, structs.ServiceResolver, "mysql", nil)) + require.True(t, watchFired(ws)) ws = memdb.NewWatchSet() @@ -2160,6 +2207,51 @@ func TestStateStore_ExportedServicesForPeer(t *testing.T) { require.Equal(t, expect, got) }) + testutil.RunStep(t, "terminating gateway services are exported", func(t *testing.T) { + lastIdx++ + require.NoError(t, s.EnsureService(lastIdx, "foo", &structs.NodeService{ + ID: "term-svc", Service: "term-svc", Port: 6000, + })) + lastIdx++ + require.NoError(t, s.EnsureService(lastIdx, "foo", &structs.NodeService{ + Kind: structs.ServiceKindTerminatingGateway, + Service: "some-terminating-gateway", + ID: "some-terminating-gateway", + Port: 9000, + })) + lastIdx++ + require.NoError(t, s.EnsureConfigEntry(lastIdx, &structs.TerminatingGatewayConfigEntry{ + Kind: structs.TerminatingGateway, + Name: "some-terminating-gateway", + Services: []structs.LinkedService{{Name: "term-svc"}}, + })) + + expect := &structs.ExportedServiceList{ + Services: []structs.ServiceName{ + newSN("payments"), + newSN("term-svc"), + }, + DiscoChains: map[structs.ServiceName]structs.ExportedDiscoveryChainInfo{ + newSN("payments"): { + Protocol: "http", + }, + newSN("resolver"): { + Protocol: "http", + }, + newSN("router"): { + Protocol: "http", + }, + newSN("term-svc"): { + Protocol: "http", + }, + }, + } + idx, got, err := s.ExportedServicesForPeer(ws, id, "dc1") + require.NoError(t, err) + require.Equal(t, lastIdx, idx) + require.Equal(t, expect, got) + }) + testutil.RunStep(t, "deleting the config entry clears exported services", func(t *testing.T) { expect := &structs.ExportedServiceList{} diff --git a/agent/grpc-external/services/peerstream/stream_test.go b/agent/grpc-external/services/peerstream/stream_test.go index 63df91aa7c2..904c2c28b15 100644 --- a/agent/grpc-external/services/peerstream/stream_test.go +++ b/agent/grpc-external/services/peerstream/stream_test.go @@ -844,6 +844,13 @@ func TestStreamResources_Server_ServiceUpdates(t *testing.T) { Node: &structs.Node{Node: "foo", Address: "10.0.0.1"}, Service: &structs.NodeService{ID: "mysql-1", Service: "mysql", Port: 5000}, } + mysqlSidecar := &structs.NodeService{ + Kind: structs.ServiceKindConnectProxy, + Service: "mysql-sidecar-proxy", + Proxy: structs.ConnectProxyConfig{ + DestinationServiceName: "mysql", + }, + } lastIdx++ require.NoError(t, store.EnsureNode(lastIdx, mysql.Node)) @@ -851,6 +858,9 @@ func TestStreamResources_Server_ServiceUpdates(t *testing.T) { lastIdx++ require.NoError(t, store.EnsureService(lastIdx, "foo", mysql.Service)) + lastIdx++ + require.NoError(t, store.EnsureService(lastIdx, "foo", mysqlSidecar)) + mongoSvcDefaults := &structs.ServiceConfigEntry{ Kind: structs.ServiceDefaults, Name: "mongo", @@ -870,6 +880,24 @@ func TestStreamResources_Server_ServiceUpdates(t *testing.T) { mysqlProxySN = structs.NewServiceName("mysql-sidecar-proxy", nil).String() ) + testutil.RunStep(t, "initial stream data is received", func(t *testing.T) { + expectReplEvents(t, client, + func(t *testing.T, msg *pbpeerstream.ReplicationMessage) { + require.Equal(t, pbpeerstream.TypeURLPeeringTrustBundle, msg.GetResponse().ResourceURL) + // Roots tested in TestStreamResources_Server_CARootUpdates + }, + func(t *testing.T, msg *pbpeerstream.ReplicationMessage) { + require.Equal(t, pbpeerstream.TypeURLExportedServiceList, msg.GetResponse().ResourceURL) + require.Equal(t, subExportedServiceList, msg.GetResponse().ResourceID) + require.Equal(t, pbpeerstream.Operation_OPERATION_UPSERT, msg.GetResponse().Operation) + + var exportedServices pbpeerstream.ExportedServiceList + require.NoError(t, msg.GetResponse().Resource.UnmarshalTo(&exportedServices)) + require.ElementsMatch(t, []string{}, exportedServices.Services) + }, + ) + }) + testutil.RunStep(t, "exporting mysql leads to an UPSERT event", func(t *testing.T) { entry := &structs.ExportedServicesConfigEntry{ Name: "default", @@ -895,10 +923,6 @@ func TestStreamResources_Server_ServiceUpdates(t *testing.T) { require.NoError(t, store.EnsureConfigEntry(lastIdx, entry)) expectReplEvents(t, client, - func(t *testing.T, msg *pbpeerstream.ReplicationMessage) { - require.Equal(t, pbpeerstream.TypeURLPeeringTrustBundle, msg.GetResponse().ResourceURL) - // Roots tested in TestStreamResources_Server_CARootUpdates - }, func(t *testing.T, msg *pbpeerstream.ReplicationMessage) { // no mongo instances exist require.Equal(t, pbpeerstream.TypeURLExportedService, msg.GetResponse().ResourceURL) @@ -909,16 +933,6 @@ func TestStreamResources_Server_ServiceUpdates(t *testing.T) { require.NoError(t, msg.GetResponse().Resource.UnmarshalTo(&nodes)) require.Len(t, nodes.Nodes, 0) }, - func(t *testing.T, msg *pbpeerstream.ReplicationMessage) { - // proxies can't export because no mesh gateway exists yet - require.Equal(t, pbpeerstream.TypeURLExportedService, msg.GetResponse().ResourceURL) - require.Equal(t, mongoProxySN, msg.GetResponse().ResourceID) - require.Equal(t, pbpeerstream.Operation_OPERATION_UPSERT, msg.GetResponse().Operation) - - var nodes pbpeerstream.ExportedService - require.NoError(t, msg.GetResponse().Resource.UnmarshalTo(&nodes)) - require.Len(t, nodes.Nodes, 0) - }, func(t *testing.T, msg *pbpeerstream.ReplicationMessage) { require.Equal(t, pbpeerstream.TypeURLExportedService, msg.GetResponse().ResourceURL) require.Equal(t, mysqlSN, msg.GetResponse().ResourceID) @@ -938,17 +952,6 @@ func TestStreamResources_Server_ServiceUpdates(t *testing.T) { require.NoError(t, msg.GetResponse().Resource.UnmarshalTo(&nodes)) require.Len(t, nodes.Nodes, 0) }, - // This event happens because this is the first test case and there are - // no exported services when replication is initially set up. - func(t *testing.T, msg *pbpeerstream.ReplicationMessage) { - require.Equal(t, pbpeerstream.TypeURLExportedServiceList, msg.GetResponse().ResourceURL) - require.Equal(t, subExportedServiceList, msg.GetResponse().ResourceID) - require.Equal(t, pbpeerstream.Operation_OPERATION_UPSERT, msg.GetResponse().Operation) - - var exportedServices pbpeerstream.ExportedServiceList - require.NoError(t, msg.GetResponse().Resource.UnmarshalTo(&exportedServices)) - require.ElementsMatch(t, []string{}, exportedServices.Services) - }, func(t *testing.T, msg *pbpeerstream.ReplicationMessage) { require.Equal(t, pbpeerstream.TypeURLExportedServiceList, msg.GetResponse().ResourceURL) require.Equal(t, subExportedServiceList, msg.GetResponse().ResourceID) @@ -978,7 +981,7 @@ func TestStreamResources_Server_ServiceUpdates(t *testing.T) { expectReplEvents(t, client, func(t *testing.T, msg *pbpeerstream.ReplicationMessage) { require.Equal(t, pbpeerstream.TypeURLExportedService, msg.GetResponse().ResourceURL) - require.Equal(t, mongoProxySN, msg.GetResponse().ResourceID) + require.Equal(t, mysqlProxySN, msg.GetResponse().ResourceID) require.Equal(t, pbpeerstream.Operation_OPERATION_UPSERT, msg.GetResponse().Operation) var nodes pbpeerstream.ExportedService @@ -986,16 +989,26 @@ func TestStreamResources_Server_ServiceUpdates(t *testing.T) { require.Len(t, nodes.Nodes, 1) pm := nodes.Nodes[0].Service.Connect.PeerMeta - require.Equal(t, "grpc", pm.Protocol) + require.Equal(t, "tcp", pm.Protocol) spiffeIDs := []string{ - "spiffe://11111111-2222-3333-4444-555555555555.consul/ns/default/dc/dc1/svc/mongo", + "spiffe://11111111-2222-3333-4444-555555555555.consul/ns/default/dc/dc1/svc/mysql", "spiffe://11111111-2222-3333-4444-555555555555.consul/gateway/mesh/dc/dc1", } require.Equal(t, spiffeIDs, pm.SpiffeID) }, + ) + }) + + testutil.RunStep(t, "register service resolver to send proxy updates", func(t *testing.T) { + lastIdx++ + require.NoError(t, store.EnsureConfigEntry(lastIdx, &structs.ServiceResolverConfigEntry{ + Kind: structs.ServiceResolver, + Name: "mongo", + })) + expectReplEvents(t, client, func(t *testing.T, msg *pbpeerstream.ReplicationMessage) { require.Equal(t, pbpeerstream.TypeURLExportedService, msg.GetResponse().ResourceURL) - require.Equal(t, mysqlProxySN, msg.GetResponse().ResourceID) + require.Equal(t, mongoProxySN, msg.GetResponse().ResourceID) require.Equal(t, pbpeerstream.Operation_OPERATION_UPSERT, msg.GetResponse().Operation) var nodes pbpeerstream.ExportedService @@ -1003,9 +1016,9 @@ func TestStreamResources_Server_ServiceUpdates(t *testing.T) { require.Len(t, nodes.Nodes, 1) pm := nodes.Nodes[0].Service.Connect.PeerMeta - require.Equal(t, "tcp", pm.Protocol) + require.Equal(t, "grpc", pm.Protocol) spiffeIDs := []string{ - "spiffe://11111111-2222-3333-4444-555555555555.consul/ns/default/dc/dc1/svc/mysql", + "spiffe://11111111-2222-3333-4444-555555555555.consul/ns/default/dc/dc1/svc/mongo", "spiffe://11111111-2222-3333-4444-555555555555.consul/gateway/mesh/dc/dc1", } require.Equal(t, spiffeIDs, pm.SpiffeID) diff --git a/agent/grpc-external/services/peerstream/subscription_manager.go b/agent/grpc-external/services/peerstream/subscription_manager.go index d290d2dc1a0..58c629d5cd2 100644 --- a/agent/grpc-external/services/peerstream/subscription_manager.go +++ b/agent/grpc-external/services/peerstream/subscription_manager.go @@ -143,7 +143,7 @@ func (m *subscriptionManager) handleEvent(ctx context.Context, state *subscripti pending := &pendingPayload{} m.syncNormalServices(ctx, state, evt.Services) if m.config.ConnectEnabled { - m.syncDiscoveryChains(state, pending, evt.ListAllDiscoveryChains()) + m.syncDiscoveryChains(state, pending, evt.DiscoChains) } err := pending.Add( diff --git a/agent/grpc-external/services/peerstream/subscription_manager_test.go b/agent/grpc-external/services/peerstream/subscription_manager_test.go index a749787744c..1e663ba4fd8 100644 --- a/agent/grpc-external/services/peerstream/subscription_manager_test.go +++ b/agent/grpc-external/services/peerstream/subscription_manager_test.go @@ -472,15 +472,40 @@ func TestSubscriptionManager_InitialSnapshot(t *testing.T) { Node: &structs.Node{Node: "foo", Address: "10.0.0.1"}, Service: &structs.NodeService{ID: "mysql-1", Service: "mysql", Port: 5000}, } + mysqlSidecar := structs.NodeService{ + Kind: structs.ServiceKindConnectProxy, + Service: "mysql-sidecar-proxy", + Proxy: structs.ConnectProxyConfig{ + DestinationServiceName: "mysql", + }, + } backend.ensureNode(t, mysql.Node) backend.ensureService(t, "foo", mysql.Service) + backend.ensureService(t, "foo", &mysqlSidecar) mongo := &structs.CheckServiceNode{ - Node: &structs.Node{Node: "zip", Address: "10.0.0.3"}, - Service: &structs.NodeService{ID: "mongo-1", Service: "mongo", Port: 5000}, + Node: &structs.Node{Node: "zip", Address: "10.0.0.3"}, + Service: &structs.NodeService{ + ID: "mongo-1", + Service: "mongo", + Port: 5000, + }, + } + mongoSidecar := structs.NodeService{ + Kind: structs.ServiceKindConnectProxy, + Service: "mongo-sidecar-proxy", + Proxy: structs.ConnectProxyConfig{ + DestinationServiceName: "mongo", + }, } backend.ensureNode(t, mongo.Node) backend.ensureService(t, "zip", mongo.Service) + backend.ensureService(t, "zip", &mongoSidecar) + + backend.ensureConfigEntry(t, &structs.ServiceResolverConfigEntry{ + Kind: structs.ServiceResolver, + Name: "chain", + }) var ( mysqlCorrID = subExportedService + structs.NewServiceName("mysql", nil).String() diff --git a/agent/proxycfg-glue/exported_peered_services_test.go b/agent/proxycfg-glue/exported_peered_services_test.go index 697c0d52c76..ed07404adf5 100644 --- a/agent/proxycfg-glue/exported_peered_services_test.go +++ b/agent/proxycfg-glue/exported_peered_services_test.go @@ -49,6 +49,14 @@ func TestServerExportedPeeredServices(t *testing.T) { }, })) + // Create resolvers for each of the services so that they are guaranteed to be replicated by the peer stream. + for _, s := range []string{"web", "api", "db"} { + require.NoError(t, store.EnsureConfigEntry(0, &structs.ServiceResolverConfigEntry{ + Kind: structs.ServiceResolver, + Name: s, + })) + } + authz := policyAuthorizer(t, ` service "web" { policy = "read" } service "api" { policy = "read" } diff --git a/agent/structs/peering.go b/agent/structs/peering.go index 52d2f32a378..714a442e8f7 100644 --- a/agent/structs/peering.go +++ b/agent/structs/peering.go @@ -62,8 +62,7 @@ func (i ExportedDiscoveryChainInfo) Equal(o ExportedDiscoveryChainInfo) bool { return true } -// ListAllDiscoveryChains returns all discovery chains (union of Services and -// DiscoChains). +// ListAllDiscoveryChains returns all discovery chains (union of Services and DiscoChains). func (list *ExportedServiceList) ListAllDiscoveryChains() map[ServiceName]ExportedDiscoveryChainInfo { chainsByName := make(map[ServiceName]ExportedDiscoveryChainInfo) if list == nil { diff --git a/agent/structs/structs.go b/agent/structs/structs.go index 0a95da695ae..5191272a645 100644 --- a/agent/structs/structs.go +++ b/agent/structs/structs.go @@ -1235,6 +1235,12 @@ const ( // This service allows external traffic to exit the mesh through a terminating gateway // based on centralized configuration. ServiceKindDestination ServiceKind = "destination" + + // ServiceKindConnectEnabled is used to indicate whether a service is either + // connect-native or if the service has a corresponding sidecar. It is used for + // internal query purposes and should not be exposed to users as a valid Kind + // option. + ServiceKindConnectEnabled ServiceKind = "connect-enabled" ) // Type to hold a address and port of a service From 823fc821fa5f8af532e694ec786a25be68cacf15 Mon Sep 17 00:00:00 2001 From: Andrew Stucki Date: Tue, 21 Feb 2023 21:42:01 -0500 Subject: [PATCH 031/262] [API Gateway] Turn down controller log levels (#16348) --- agent/consul/gateways/controller_gateways.go | 92 ++++++++++---------- 1 file changed, 46 insertions(+), 46 deletions(-) diff --git a/agent/consul/gateways/controller_gateways.go b/agent/consul/gateways/controller_gateways.go index f06b48581fa..b1197d0ba4a 100644 --- a/agent/consul/gateways/controller_gateways.go +++ b/agent/consul/gateways/controller_gateways.go @@ -71,7 +71,7 @@ func (r *apiGatewayReconciler) Reconcile(ctx context.Context, req controller.Req func reconcileEntry[T structs.ControlledConfigEntry](store *state.Store, logger hclog.Logger, ctx context.Context, req controller.Request, reconciler func(ctx context.Context, req controller.Request, store *state.Store, entry T) error, cleaner func(ctx context.Context, req controller.Request, store *state.Store) error) error { _, entry, err := store.ConfigEntry(nil, req.Kind, req.Name, req.Meta) if err != nil { - requestLogger(logger, req).Error("error fetching config entry for reconciliation request", "error", err) + requestLogger(logger, req).Warn("error fetching config entry for reconciliation request", "error", err) return err } @@ -87,12 +87,12 @@ func reconcileEntry[T structs.ControlledConfigEntry](store *state.Store, logger func (r *apiGatewayReconciler) enqueueCertificateReferencedGateways(store *state.Store, _ context.Context, req controller.Request) error { logger := certificateRequestLogger(r.logger, req) - logger.Debug("certificate changed, enqueueing dependent gateways") - defer logger.Debug("finished enqueuing gateways") + logger.Trace("certificate changed, enqueueing dependent gateways") + defer logger.Trace("finished enqueuing gateways") _, entries, err := store.ConfigEntriesByKind(nil, structs.APIGateway, acl.WildcardEnterpriseMeta()) if err != nil { - logger.Error("error retrieving api gateways", "error", err) + logger.Warn("error retrieving api gateways", "error", err) return err } @@ -127,12 +127,12 @@ func (r *apiGatewayReconciler) enqueueCertificateReferencedGateways(store *state func (r *apiGatewayReconciler) cleanupBoundGateway(_ context.Context, req controller.Request, store *state.Store) error { logger := gatewayRequestLogger(r.logger, req) - logger.Debug("cleaning up bound gateway") - defer logger.Debug("finished cleaning up bound gateway") + logger.Trace("cleaning up bound gateway") + defer logger.Trace("finished cleaning up bound gateway") routes, err := retrieveAllRoutesFromStore(store) if err != nil { - logger.Error("error retrieving routes", "error", err) + logger.Warn("error retrieving routes", "error", err) return err } @@ -141,9 +141,9 @@ func (r *apiGatewayReconciler) cleanupBoundGateway(_ context.Context, req contro for _, modifiedRoute := range removeGateway(resource, routes...) { routeLogger := routeLogger(logger, modifiedRoute) - routeLogger.Debug("persisting route status") + routeLogger.Trace("persisting route status") if err := r.updater.Update(modifiedRoute); err != nil { - routeLogger.Error("error removing gateway from route", "error", err) + routeLogger.Warn("error removing gateway from route", "error", err) return err } } @@ -156,20 +156,20 @@ func (r *apiGatewayReconciler) cleanupBoundGateway(_ context.Context, req contro func (r *apiGatewayReconciler) reconcileBoundGateway(_ context.Context, req controller.Request, store *state.Store, bound *structs.BoundAPIGatewayConfigEntry) error { logger := gatewayRequestLogger(r.logger, req) - logger.Debug("reconciling bound gateway") - defer logger.Debug("finished reconciling bound gateway") + logger.Trace("reconciling bound gateway") + defer logger.Trace("finished reconciling bound gateway") _, gateway, err := store.ConfigEntry(nil, structs.APIGateway, req.Name, req.Meta) if err != nil { - logger.Error("error retrieving api gateway", "error", err) + logger.Warn("error retrieving api gateway", "error", err) return err } if gateway == nil { // delete the bound gateway - logger.Debug("deleting bound api gateway") + logger.Trace("deleting bound api gateway") if err := r.updater.Delete(bound); err != nil { - logger.Error("error deleting bound api gateway", "error", err) + logger.Warn("error deleting bound api gateway", "error", err) return err } } @@ -183,18 +183,18 @@ func (r *apiGatewayReconciler) reconcileBoundGateway(_ context.Context, req cont func (r *apiGatewayReconciler) cleanupGateway(_ context.Context, req controller.Request, store *state.Store) error { logger := gatewayRequestLogger(r.logger, req) - logger.Debug("cleaning up deleted gateway") - defer logger.Debug("finished cleaning up deleted gateway") + logger.Trace("cleaning up deleted gateway") + defer logger.Trace("finished cleaning up deleted gateway") _, bound, err := store.ConfigEntry(nil, structs.BoundAPIGateway, req.Name, req.Meta) if err != nil { - logger.Error("error retrieving bound api gateway", "error", err) + logger.Warn("error retrieving bound api gateway", "error", err) return err } - logger.Debug("deleting bound api gateway") + logger.Trace("deleting bound api gateway") if err := r.updater.Delete(bound); err != nil { - logger.Error("error deleting bound api gateway", "error", err) + logger.Warn("error deleting bound api gateway", "error", err) return err } @@ -212,8 +212,8 @@ func (r *apiGatewayReconciler) reconcileGateway(_ context.Context, req controlle logger := gatewayRequestLogger(r.logger, req) - logger.Debug("started reconciling gateway") - defer logger.Debug("finished reconciling gateway") + logger.Trace("started reconciling gateway") + defer logger.Trace("finished reconciling gateway") updater := structs.NewStatusUpdater(gateway) // we clear out the initial status conditions since we're doing a full update @@ -222,21 +222,21 @@ func (r *apiGatewayReconciler) reconcileGateway(_ context.Context, req controlle routes, err := retrieveAllRoutesFromStore(store) if err != nil { - logger.Error("error retrieving routes", "error", err) + logger.Warn("error retrieving routes", "error", err) return err } // construct the tuple we'll be working on to update state _, bound, err := store.ConfigEntry(nil, structs.BoundAPIGateway, req.Name, req.Meta) if err != nil { - logger.Error("error retrieving bound api gateway", "error", err) + logger.Warn("error retrieving bound api gateway", "error", err) return err } meta := newGatewayMeta(gateway, bound) certificateErrors, err := meta.checkCertificates(store) if err != nil { - logger.Error("error checking gateway certificates", "error", err) + logger.Warn("error checking gateway certificates", "error", err) return err } @@ -286,9 +286,9 @@ func (r *apiGatewayReconciler) reconcileGateway(_ context.Context, req controlle // now check if we need to update the gateway status if modifiedGateway, shouldUpdate := updater.UpdateEntry(); shouldUpdate { - logger.Debug("persisting gateway status") + logger.Trace("persisting gateway status") if err := r.updater.UpdateWithStatus(modifiedGateway); err != nil { - logger.Error("error persisting gateway status", "error", err) + logger.Warn("error persisting gateway status", "error", err) return err } } @@ -296,18 +296,18 @@ func (r *apiGatewayReconciler) reconcileGateway(_ context.Context, req controlle // next update route statuses for _, modifiedRoute := range updatedRoutes { routeLogger := routeLogger(logger, modifiedRoute) - routeLogger.Debug("persisting route status") + routeLogger.Trace("persisting route status") if err := r.updater.UpdateWithStatus(modifiedRoute); err != nil { - routeLogger.Error("error persisting route status", "error", err) + routeLogger.Warn("error persisting route status", "error", err) return err } } // now update the bound state if it changed if bound == nil || !bound.(*structs.BoundAPIGatewayConfigEntry).IsSame(meta.BoundGateway) { - logger.Debug("persisting bound api gateway") + logger.Trace("persisting bound api gateway") if err := r.updater.Update(meta.BoundGateway); err != nil { - logger.Error("error persisting bound api gateway", "error", err) + logger.Warn("error persisting bound api gateway", "error", err) return err } } @@ -320,20 +320,20 @@ func (r *apiGatewayReconciler) reconcileGateway(_ context.Context, req controlle func (r *apiGatewayReconciler) cleanupRoute(_ context.Context, req controller.Request, store *state.Store) error { logger := routeRequestLogger(r.logger, req) - logger.Debug("cleaning up route") - defer logger.Debug("finished cleaning up route") + logger.Trace("cleaning up route") + defer logger.Trace("finished cleaning up route") meta, err := getAllGatewayMeta(store) if err != nil { - logger.Error("error retrieving gateways", "error", err) + logger.Warn("error retrieving gateways", "error", err) return err } for _, modifiedGateway := range removeRoute(requestToResourceRef(req), meta...) { gatewayLogger := gatewayLogger(logger, modifiedGateway.BoundGateway) - gatewayLogger.Debug("persisting bound gateway state") + gatewayLogger.Trace("persisting bound gateway state") if err := r.updater.Update(modifiedGateway.BoundGateway); err != nil { - gatewayLogger.Error("error updating bound api gateway", "error", err) + gatewayLogger.Warn("error updating bound api gateway", "error", err) return err } } @@ -355,12 +355,12 @@ func (r *apiGatewayReconciler) reconcileRoute(_ context.Context, req controller. logger := routeRequestLogger(r.logger, req) - logger.Debug("reconciling route") - defer logger.Debug("finished reconciling route") + logger.Trace("reconciling route") + defer logger.Trace("finished reconciling route") meta, err := getAllGatewayMeta(store) if err != nil { - logger.Error("error retrieving gateways", "error", err) + logger.Warn("error retrieving gateways", "error", err) return err } @@ -378,9 +378,9 @@ func (r *apiGatewayReconciler) reconcileRoute(_ context.Context, req controller. modifiedGateway, shouldUpdate := gateway.checkConflicts() if shouldUpdate { gatewayLogger := gatewayLogger(logger, modifiedGateway) - gatewayLogger.Debug("persisting gateway status") + gatewayLogger.Trace("persisting gateway status") if err := r.updater.UpdateWithStatus(modifiedGateway); err != nil { - gatewayLogger.Error("error persisting gateway", "error", err) + gatewayLogger.Warn("error persisting gateway", "error", err) return err } } @@ -388,9 +388,9 @@ func (r *apiGatewayReconciler) reconcileRoute(_ context.Context, req controller. // next update the route status if modifiedRoute, shouldUpdate := updater.UpdateEntry(); shouldUpdate { - r.logger.Debug("persisting route status") + r.logger.Trace("persisting route status") if err := r.updater.UpdateWithStatus(modifiedRoute); err != nil { - r.logger.Error("error persisting route", "error", err) + r.logger.Warn("error persisting route", "error", err) return err } } @@ -398,9 +398,9 @@ func (r *apiGatewayReconciler) reconcileRoute(_ context.Context, req controller. // now update all of the bound gateways that have been modified for _, bound := range modifiedGateways { gatewayLogger := gatewayLogger(logger, bound) - gatewayLogger.Debug("persisting bound api gateway") + gatewayLogger.Trace("persisting bound api gateway") if err := r.updater.Update(bound); err != nil { - gatewayLogger.Error("error persisting bound api gateway", "error", err) + gatewayLogger.Warn("error persisting bound api gateway", "error", err) return err } } @@ -413,7 +413,7 @@ func (r *apiGatewayReconciler) reconcileRoute(_ context.Context, req controller. for _, service := range route.GetServiceNames() { _, chainSet, err := store.ReadDiscoveryChainConfigEntries(ws, service.Name, pointerTo(service.EnterpriseMeta)) if err != nil { - logger.Error("error reading discovery chain", "error", err) + logger.Warn("error reading discovery chain", "error", err) return err } @@ -481,7 +481,7 @@ func (r *apiGatewayReconciler) reconcileRoute(_ context.Context, req controller. } // the route is valid, attempt to bind it to all gateways - r.logger.Debug("binding routes to gateway") + r.logger.Trace("binding routes to gateway") modifiedGateways, boundRefs, bindErrors := bindRoutesToGateways(route, meta...) // set the status of the references that are bound From 18e2ee77ca9b7c517228ac26ee942d6fc367a9a4 Mon Sep 17 00:00:00 2001 From: Andrew Stucki Date: Tue, 21 Feb 2023 22:48:26 -0500 Subject: [PATCH 032/262] [API Gateway] Fix targeting service splitters in HTTPRoutes (#16350) * [API Gateway] Fix targeting service splitters in HTTPRoutes * Fix test description --- agent/consul/discoverychain/gateway.go | 39 +++ agent/consul/discoverychain/gateway_test.go | 254 ++++++++++++++++++ agent/structs/config_entry_routes.go | 8 +- .../capture.sh | 3 + .../service_gateway.hcl | 4 + .../service_s3.hcl | 9 + .../setup.sh | 80 ++++++ .../vars.sh | 3 + .../verify.bats | 23 ++ 9 files changed, 419 insertions(+), 4 deletions(-) create mode 100644 test/integration/connect/envoy/case-api-gateway-http-splitter-targets/capture.sh create mode 100644 test/integration/connect/envoy/case-api-gateway-http-splitter-targets/service_gateway.hcl create mode 100644 test/integration/connect/envoy/case-api-gateway-http-splitter-targets/service_s3.hcl create mode 100644 test/integration/connect/envoy/case-api-gateway-http-splitter-targets/setup.sh create mode 100644 test/integration/connect/envoy/case-api-gateway-http-splitter-targets/vars.sh create mode 100644 test/integration/connect/envoy/case-api-gateway-http-splitter-targets/verify.bats diff --git a/agent/consul/discoverychain/gateway.go b/agent/consul/discoverychain/gateway.go index c9acdbbfda2..35a8992d80f 100644 --- a/agent/consul/discoverychain/gateway.go +++ b/agent/consul/discoverychain/gateway.go @@ -5,6 +5,7 @@ import ( "hash/crc32" "sort" "strconv" + "strings" "github.com/hashicorp/consul/agent/configentry" "github.com/hashicorp/consul/agent/structs" @@ -126,6 +127,23 @@ func (l *GatewayChainSynthesizer) Synthesize(chains ...*structs.CompiledDiscover if err != nil { return nil, nil, err } + + // fix up the nodes for the terminal targets to either be a splitter or resolver if there is no splitter present + for name, node := range compiled.Nodes { + switch node.Type { + // we should only have these two types + case structs.DiscoveryGraphNodeTypeRouter: + for i, route := range node.Routes { + node.Routes[i].NextNode = targetForResolverNode(route.NextNode, chains) + } + case structs.DiscoveryGraphNodeTypeSplitter: + for i, split := range node.Splits { + node.Splits[i].NextNode = targetForResolverNode(split.NextNode, chains) + } + } + compiled.Nodes[name] = node + } + for _, c := range chains { for id, target := range c.Targets { compiled.Targets[id] = target @@ -177,6 +195,27 @@ func (l *GatewayChainSynthesizer) consolidateHTTPRoutes() []structs.HTTPRouteCon return routes } +func targetForResolverNode(nodeName string, chains []*structs.CompiledDiscoveryChain) string { + resolverPrefix := structs.DiscoveryGraphNodeTypeResolver + ":" + splitterPrefix := structs.DiscoveryGraphNodeTypeSplitter + ":" + + if !strings.HasPrefix(nodeName, resolverPrefix) { + return nodeName + } + + splitterName := splitterPrefix + strings.TrimPrefix(nodeName, resolverPrefix) + + for _, c := range chains { + for name, node := range c.Nodes { + if node.IsSplitter() && strings.HasPrefix(splitterName, name) { + return name + } + } + } + + return nodeName +} + func hostsKey(hosts ...string) string { sort.Strings(hosts) hostsHash := crc32.NewIEEE() diff --git a/agent/consul/discoverychain/gateway_test.go b/agent/consul/discoverychain/gateway_test.go index 1c44f680b7c..71e66b05127 100644 --- a/agent/consul/discoverychain/gateway_test.go +++ b/agent/consul/discoverychain/gateway_test.go @@ -3,6 +3,7 @@ package discoverychain import ( "testing" + "github.com/hashicorp/consul/agent/configentry" "github.com/hashicorp/consul/agent/structs" "github.com/stretchr/testify/require" ) @@ -640,3 +641,256 @@ func TestGatewayChainSynthesizer_Synthesize(t *testing.T) { }) } } + +func TestGatewayChainSynthesizer_ComplexChain(t *testing.T) { + t.Parallel() + + cases := map[string]struct { + synthesizer *GatewayChainSynthesizer + route *structs.HTTPRouteConfigEntry + entries []structs.ConfigEntry + expectedDiscoveryChain *structs.CompiledDiscoveryChain + }{ + "HTTP-Route with nested splitters": { + synthesizer: NewGatewayChainSynthesizer("dc1", "domain", "suffix", &structs.APIGatewayConfigEntry{ + Kind: structs.APIGateway, + Name: "gateway", + }), + route: &structs.HTTPRouteConfigEntry{ + Kind: structs.HTTPRoute, + Name: "test", + Rules: []structs.HTTPRouteRule{{ + Services: []structs.HTTPService{{ + Name: "splitter-one", + }}, + }}, + }, + entries: []structs.ConfigEntry{ + &structs.ServiceSplitterConfigEntry{ + Kind: structs.ServiceSplitter, + Name: "splitter-one", + Splits: []structs.ServiceSplit{{ + Service: "service-one", + Weight: 50, + }, { + Service: "splitter-two", + Weight: 50, + }}, + }, + &structs.ServiceSplitterConfigEntry{ + Kind: structs.ServiceSplitter, + Name: "splitter-two", + Splits: []structs.ServiceSplit{{ + Service: "service-two", + Weight: 50, + }, { + Service: "service-three", + Weight: 50, + }}, + }, + &structs.ProxyConfigEntry{ + Kind: structs.ProxyConfigGlobal, + Name: "global", + Config: map[string]interface{}{ + "protocol": "http", + }, + }, + }, + expectedDiscoveryChain: &structs.CompiledDiscoveryChain{ + ServiceName: "gateway-suffix-9b9265b", + Namespace: "default", + Partition: "default", + Datacenter: "dc1", + Protocol: "http", + StartNode: "router:gateway-suffix-9b9265b.default.default", + Nodes: map[string]*structs.DiscoveryGraphNode{ + "resolver:gateway-suffix-9b9265b.default.default.dc1": { + Type: "resolver", + Name: "gateway-suffix-9b9265b.default.default.dc1", + Resolver: &structs.DiscoveryResolver{ + Target: "gateway-suffix-9b9265b.default.default.dc1", + Default: true, + ConnectTimeout: 5000000000, + }, + }, + "resolver:service-one.default.default.dc1": { + Type: "resolver", + Name: "service-one.default.default.dc1", + Resolver: &structs.DiscoveryResolver{ + Target: "service-one.default.default.dc1", + Default: true, + ConnectTimeout: 5000000000, + }, + }, + "resolver:service-three.default.default.dc1": { + Type: "resolver", + Name: "service-three.default.default.dc1", + Resolver: &structs.DiscoveryResolver{ + Target: "service-three.default.default.dc1", + Default: true, + ConnectTimeout: 5000000000, + }, + }, + "resolver:service-two.default.default.dc1": { + Type: "resolver", + Name: "service-two.default.default.dc1", + Resolver: &structs.DiscoveryResolver{ + Target: "service-two.default.default.dc1", + Default: true, + ConnectTimeout: 5000000000, + }, + }, + "resolver:splitter-one.default.default.dc1": { + Type: "resolver", + Name: "splitter-one.default.default.dc1", + Resolver: &structs.DiscoveryResolver{ + Target: "splitter-one.default.default.dc1", + Default: true, + ConnectTimeout: 5000000000, + }, + }, + "router:gateway-suffix-9b9265b.default.default": { + Type: "router", + Name: "gateway-suffix-9b9265b.default.default", + Routes: []*structs.DiscoveryRoute{{ + Definition: &structs.ServiceRoute{ + Match: &structs.ServiceRouteMatch{ + HTTP: &structs.ServiceRouteHTTPMatch{ + PathPrefix: "/", + }, + }, + Destination: &structs.ServiceRouteDestination{ + Service: "splitter-one", + Partition: "default", + Namespace: "default", + RequestHeaders: &structs.HTTPHeaderModifiers{ + Add: make(map[string]string), + Set: make(map[string]string), + }, + }, + }, + NextNode: "splitter:splitter-one.default.default", + }, { + Definition: &structs.ServiceRoute{ + Match: &structs.ServiceRouteMatch{ + HTTP: &structs.ServiceRouteHTTPMatch{ + PathPrefix: "/", + }, + }, + Destination: &structs.ServiceRouteDestination{ + Service: "gateway-suffix-9b9265b", + Partition: "default", + Namespace: "default", + }, + }, + NextNode: "resolver:gateway-suffix-9b9265b.default.default.dc1", + }}, + }, + "splitter:splitter-one.default.default": { + Type: structs.DiscoveryGraphNodeTypeSplitter, + Name: "splitter-one.default.default", + Splits: []*structs.DiscoverySplit{{ + Definition: &structs.ServiceSplit{ + Weight: 50, + Service: "service-one", + }, + Weight: 50, + NextNode: "resolver:service-one.default.default.dc1", + }, { + Definition: &structs.ServiceSplit{ + Weight: 50, + Service: "service-two", + }, + Weight: 25, + NextNode: "resolver:service-two.default.default.dc1", + }, { + Definition: &structs.ServiceSplit{ + Weight: 50, + Service: "service-three", + }, + Weight: 25, + NextNode: "resolver:service-three.default.default.dc1", + }}, + }, + }, Targets: map[string]*structs.DiscoveryTarget{ + "gateway-suffix-9b9265b.default.default.dc1": { + ID: "gateway-suffix-9b9265b.default.default.dc1", + Service: "gateway-suffix-9b9265b", + Datacenter: "dc1", + Partition: "default", + Namespace: "default", + ConnectTimeout: 5000000000, + SNI: "gateway-suffix-9b9265b.default.dc1.internal.domain", + Name: "gateway-suffix-9b9265b.default.dc1.internal.domain", + }, + "service-one.default.default.dc1": { + ID: "service-one.default.default.dc1", + Service: "service-one", + Datacenter: "dc1", + Partition: "default", + Namespace: "default", + ConnectTimeout: 5000000000, + SNI: "service-one.default.dc1.internal.domain", + Name: "service-one.default.dc1.internal.domain", + }, + "service-three.default.default.dc1": { + ID: "service-three.default.default.dc1", + Service: "service-three", + Datacenter: "dc1", + Partition: "default", + Namespace: "default", + ConnectTimeout: 5000000000, + SNI: "service-three.default.dc1.internal.domain", + Name: "service-three.default.dc1.internal.domain", + }, + "service-two.default.default.dc1": { + ID: "service-two.default.default.dc1", + Service: "service-two", + Datacenter: "dc1", + Partition: "default", + Namespace: "default", + ConnectTimeout: 5000000000, + SNI: "service-two.default.dc1.internal.domain", + Name: "service-two.default.dc1.internal.domain", + }, + "splitter-one.default.default.dc1": { + ID: "splitter-one.default.default.dc1", + Service: "splitter-one", + Datacenter: "dc1", + Partition: "default", + Namespace: "default", + ConnectTimeout: 5000000000, + SNI: "splitter-one.default.dc1.internal.domain", + Name: "splitter-one.default.dc1.internal.domain", + }, + }}, + }, + } + + for name, tc := range cases { + t.Run(name, func(t *testing.T) { + service := tc.entries[0] + entries := configentry.NewDiscoveryChainSet() + entries.AddEntries(tc.entries...) + compiled, err := Compile(CompileRequest{ + ServiceName: service.GetName(), + EvaluateInNamespace: service.GetEnterpriseMeta().NamespaceOrDefault(), + EvaluateInPartition: service.GetEnterpriseMeta().PartitionOrDefault(), + EvaluateInDatacenter: "dc1", + EvaluateInTrustDomain: "domain", + Entries: entries, + }) + require.NoError(t, err) + + tc.synthesizer.SetHostname("*") + tc.synthesizer.AddHTTPRoute(*tc.route) + + chains := []*structs.CompiledDiscoveryChain{compiled} + _, discoveryChains, err := tc.synthesizer.Synthesize(chains...) + + require.NoError(t, err) + require.Len(t, discoveryChains, 1) + require.Equal(t, tc.expectedDiscoveryChain, discoveryChains[0]) + }) + } +} diff --git a/agent/structs/config_entry_routes.go b/agent/structs/config_entry_routes.go index fa4427776a4..0571a273f02 100644 --- a/agent/structs/config_entry_routes.go +++ b/agent/structs/config_entry_routes.go @@ -79,9 +79,9 @@ func (e *HTTPRouteConfigEntry) Normalize() error { for i, parent := range e.Parents { if parent.Kind == "" { parent.Kind = APIGateway - parent.EnterpriseMeta.Normalize() - e.Parents[i] = parent } + parent.EnterpriseMeta.Normalize() + e.Parents[i] = parent } for i, rule := range e.Rules { @@ -505,9 +505,9 @@ func (e *TCPRouteConfigEntry) Normalize() error { for i, parent := range e.Parents { if parent.Kind == "" { parent.Kind = APIGateway - parent.EnterpriseMeta.Normalize() - e.Parents[i] = parent } + parent.EnterpriseMeta.Normalize() + e.Parents[i] = parent } for i, service := range e.Services { diff --git a/test/integration/connect/envoy/case-api-gateway-http-splitter-targets/capture.sh b/test/integration/connect/envoy/case-api-gateway-http-splitter-targets/capture.sh new file mode 100644 index 00000000000..8ba0e0ddabc --- /dev/null +++ b/test/integration/connect/envoy/case-api-gateway-http-splitter-targets/capture.sh @@ -0,0 +1,3 @@ +#!/bin/bash + +snapshot_envoy_admin localhost:20000 api-gateway primary || true \ No newline at end of file diff --git a/test/integration/connect/envoy/case-api-gateway-http-splitter-targets/service_gateway.hcl b/test/integration/connect/envoy/case-api-gateway-http-splitter-targets/service_gateway.hcl new file mode 100644 index 00000000000..486c25c59e5 --- /dev/null +++ b/test/integration/connect/envoy/case-api-gateway-http-splitter-targets/service_gateway.hcl @@ -0,0 +1,4 @@ +services { + name = "api-gateway" + kind = "api-gateway" +} diff --git a/test/integration/connect/envoy/case-api-gateway-http-splitter-targets/service_s3.hcl b/test/integration/connect/envoy/case-api-gateway-http-splitter-targets/service_s3.hcl new file mode 100644 index 00000000000..2f6d05e0feb --- /dev/null +++ b/test/integration/connect/envoy/case-api-gateway-http-splitter-targets/service_s3.hcl @@ -0,0 +1,9 @@ +services { + id = "s3" + name = "s3" + port = 8182 + + connect { + sidecar_service {} + } +} diff --git a/test/integration/connect/envoy/case-api-gateway-http-splitter-targets/setup.sh b/test/integration/connect/envoy/case-api-gateway-http-splitter-targets/setup.sh new file mode 100644 index 00000000000..47916da173c --- /dev/null +++ b/test/integration/connect/envoy/case-api-gateway-http-splitter-targets/setup.sh @@ -0,0 +1,80 @@ +#!/bin/bash + +set -euo pipefail + +upsert_config_entry primary ' +kind = "api-gateway" +name = "api-gateway" +listeners = [ + { + name = "listener-one" + port = 9999 + protocol = "http" + } +] +' + +upsert_config_entry primary ' +Kind = "proxy-defaults" +Name = "global" +Config { + protocol = "http" +} +' + +upsert_config_entry primary ' +kind = "http-route" +name = "api-gateway-route-one" +rules = [ + { + services = [ + { + name = "splitter-one" + } + ] + } +] +parents = [ + { + name = "api-gateway" + sectionName = "listener-one" + } +] +' + +upsert_config_entry primary ' +kind = "service-splitter" +name = "splitter-one" +splits = [ + { + weight = 50, + service = "s1" + }, + { + weight = 50, + service = "splitter-two" + }, +] +' + +upsert_config_entry primary ' +kind = "service-splitter" +name = "splitter-two" +splits = [ + { + weight = 50, + service = "s2" + }, + { + weight = 50, + service = "s3" + }, +] +' + +register_services primary + +gen_envoy_bootstrap api-gateway 20000 primary true +gen_envoy_bootstrap s1 19000 +gen_envoy_bootstrap s2 19001 +gen_envoy_bootstrap s3 19002 \ No newline at end of file diff --git a/test/integration/connect/envoy/case-api-gateway-http-splitter-targets/vars.sh b/test/integration/connect/envoy/case-api-gateway-http-splitter-targets/vars.sh new file mode 100644 index 00000000000..38a47d85278 --- /dev/null +++ b/test/integration/connect/envoy/case-api-gateway-http-splitter-targets/vars.sh @@ -0,0 +1,3 @@ +#!/bin/bash + +export REQUIRED_SERVICES="$DEFAULT_REQUIRED_SERVICES api-gateway-primary" diff --git a/test/integration/connect/envoy/case-api-gateway-http-splitter-targets/verify.bats b/test/integration/connect/envoy/case-api-gateway-http-splitter-targets/verify.bats new file mode 100644 index 00000000000..50d447516b1 --- /dev/null +++ b/test/integration/connect/envoy/case-api-gateway-http-splitter-targets/verify.bats @@ -0,0 +1,23 @@ +#!/usr/bin/env bats + +load helpers + +@test "api gateway proxy admin is up on :20000" { + retry_default curl -f -s localhost:20000/stats -o /dev/null +} + +@test "api gateway should be accepted and not conflicted" { + assert_config_entry_status Accepted True Accepted primary api-gateway api-gateway + assert_config_entry_status Conflicted False NoConflict primary api-gateway api-gateway +} + +@test "api gateway should have healthy endpoints for s1" { + assert_config_entry_status Bound True Bound primary http-route api-gateway-route-one + assert_upstream_has_endpoints_in_status 127.0.0.1:20000 s1 HEALTHY 1 +} + +@test "api gateway should be able to connect to s1, s2, and s3 via configured port" { + run retry_default assert_expected_fortio_name_pattern ^FORTIO_NAME=s1$ + run retry_default assert_expected_fortio_name_pattern ^FORTIO_NAME=s2$ + run retry_default assert_expected_fortio_name_pattern ^FORTIO_NAME=s3$ +} \ No newline at end of file From 09726976611a799f5f717d2de32489d19487e774 Mon Sep 17 00:00:00 2001 From: Andrew Stucki Date: Tue, 21 Feb 2023 23:02:04 -0500 Subject: [PATCH 033/262] [API Gateway] Various fixes for Config Entry fields (#16347) * [API Gateway] Various fixes for Config Entry fields * simplify logic per PR review --- .../discoverychain/gateway_httproute.go | 17 +- agent/structs/config_entry_routes.go | 15 +- agent/structs/structs.deepcopy.go | 12 +- api/config_entry_routes.go | 7 +- .../private/pbconfigentry/config_entry.gen.go | 26 +- .../private/pbconfigentry/config_entry.pb.go | 362 +++++++++--------- .../private/pbconfigentry/config_entry.proto | 6 +- 7 files changed, 206 insertions(+), 239 deletions(-) diff --git a/agent/consul/discoverychain/gateway_httproute.go b/agent/consul/discoverychain/gateway_httproute.go index aaaec12e6b1..30968c9a4d5 100644 --- a/agent/consul/discoverychain/gateway_httproute.go +++ b/agent/consul/discoverychain/gateway_httproute.go @@ -77,15 +77,14 @@ func httpRouteToDiscoveryChain(route structs.HTTPRouteConfigEntry) (*structs.Ser for idx, rule := range route.Rules { modifier := httpRouteFiltersToServiceRouteHeaderModifier(rule.Filters.Headers) - prefixRewrite := httpRouteFiltersToDestinationPrefixRewrite(rule.Filters.URLRewrites) + prefixRewrite := httpRouteFiltersToDestinationPrefixRewrite(rule.Filters.URLRewrite) var destination structs.ServiceRouteDestination if len(rule.Services) == 1 { - // TODO open question: is there a use case where someone might want to set the rewrite to ""? service := rule.Services[0] - servicePrefixRewrite := httpRouteFiltersToDestinationPrefixRewrite(service.Filters.URLRewrites) - if servicePrefixRewrite == "" { + servicePrefixRewrite := httpRouteFiltersToDestinationPrefixRewrite(service.Filters.URLRewrite) + if service.Filters.URLRewrite == nil { servicePrefixRewrite = prefixRewrite } serviceModifier := httpRouteFiltersToServiceRouteHeaderModifier(service.Filters.Headers) @@ -176,13 +175,11 @@ func httpRouteToDiscoveryChain(route structs.HTTPRouteConfigEntry) (*structs.Ser return router, splitters, defaults } -func httpRouteFiltersToDestinationPrefixRewrite(rewrites []structs.URLRewrite) string { - for _, rewrite := range rewrites { - if rewrite.Path != "" { - return rewrite.Path - } +func httpRouteFiltersToDestinationPrefixRewrite(rewrite *structs.URLRewrite) string { + if rewrite == nil { + return "" } - return "" + return rewrite.Path } // httpRouteFiltersToServiceRouteHeaderModifier will consolidate a list of HTTP filters diff --git a/agent/structs/config_entry_routes.go b/agent/structs/config_entry_routes.go index 0571a273f02..801e22f18cb 100644 --- a/agent/structs/config_entry_routes.go +++ b/agent/structs/config_entry_routes.go @@ -211,16 +211,14 @@ func validateFilters(filter HTTPFilters) error { } } - for i, rewrite := range filter.URLRewrites { - if err := validateURLRewrite(rewrite); err != nil { - return fmt.Errorf("HTTPFilters, URLRewrite[%d], %w", i, err) - } + if err := validateURLRewrite(filter.URLRewrite); err != nil { + return fmt.Errorf("HTTPFilters, URLRewrite, %w", err) } return nil } -func validateURLRewrite(rewrite URLRewrite) error { +func validateURLRewrite(rewrite *URLRewrite) error { // TODO: we don't really have validation of the actual params // passed as "PrefixRewrite" in our discoverychain config // entries, figure out if we should have something here @@ -403,8 +401,8 @@ type HTTPQueryMatch struct { // HTTPFilters specifies a list of filters used to modify a request // before it is routed to an upstream. type HTTPFilters struct { - Headers []HTTPHeaderFilter - URLRewrites []URLRewrite + Headers []HTTPHeaderFilter + URLRewrite *URLRewrite } // HTTPHeaderFilter specifies how HTTP headers should be modified. @@ -554,9 +552,6 @@ func (e *TCPRouteConfigEntry) CanWrite(authz acl.Authorizer) error { // TCPService is a service reference for a TCPRoute type TCPService struct { Name string - // Weight specifies the proportion of requests forwarded to the referenced service. - // This is computed as weight/(sum of all weights in the list of services). - Weight int acl.EnterpriseMeta } diff --git a/agent/structs/structs.deepcopy.go b/agent/structs/structs.deepcopy.go index d52585771e7..43f94674c5f 100644 --- a/agent/structs/structs.deepcopy.go +++ b/agent/structs/structs.deepcopy.go @@ -329,9 +329,9 @@ func (o *HTTPRouteConfigEntry) DeepCopy() *HTTPRouteConfigEntry { } } } - if o.Rules[i2].Filters.URLRewrites != nil { - cp.Rules[i2].Filters.URLRewrites = make([]URLRewrite, len(o.Rules[i2].Filters.URLRewrites)) - copy(cp.Rules[i2].Filters.URLRewrites, o.Rules[i2].Filters.URLRewrites) + if o.Rules[i2].Filters.URLRewrite != nil { + cp.Rules[i2].Filters.URLRewrite = new(URLRewrite) + *cp.Rules[i2].Filters.URLRewrite = *o.Rules[i2].Filters.URLRewrite } if o.Rules[i2].Matches != nil { cp.Rules[i2].Matches = make([]HTTPMatch, len(o.Rules[i2].Matches)) @@ -373,9 +373,9 @@ func (o *HTTPRouteConfigEntry) DeepCopy() *HTTPRouteConfigEntry { } } } - if o.Rules[i2].Services[i4].Filters.URLRewrites != nil { - cp.Rules[i2].Services[i4].Filters.URLRewrites = make([]URLRewrite, len(o.Rules[i2].Services[i4].Filters.URLRewrites)) - copy(cp.Rules[i2].Services[i4].Filters.URLRewrites, o.Rules[i2].Services[i4].Filters.URLRewrites) + if o.Rules[i2].Services[i4].Filters.URLRewrite != nil { + cp.Rules[i2].Services[i4].Filters.URLRewrite = new(URLRewrite) + *cp.Rules[i2].Services[i4].Filters.URLRewrite = *o.Rules[i2].Services[i4].Filters.URLRewrite } } } diff --git a/api/config_entry_routes.go b/api/config_entry_routes.go index 8561c02eaf7..2edf9b23a4c 100644 --- a/api/config_entry_routes.go +++ b/api/config_entry_routes.go @@ -49,9 +49,6 @@ func (a *TCPRouteConfigEntry) GetModifyIndex() uint64 { return a.ModifyIndex // TCPService is a service reference for a TCPRoute type TCPService struct { Name string - // Weight specifies the proportion of requests forwarded to the referenced service. - // This is computed as weight/(sum of all weights in the list of services). - Weight int // Partition is the partition the config entry is associated with. // Partitioning is a Consul Enterprise feature. @@ -195,8 +192,8 @@ type HTTPQueryMatch struct { // HTTPFilters specifies a list of filters used to modify a request // before it is routed to an upstream. type HTTPFilters struct { - Headers []HTTPHeaderFilter - URLRewrites []URLRewrite + Headers []HTTPHeaderFilter + URLRewrite *URLRewrite } // HTTPHeaderFilter specifies how HTTP headers should be modified. diff --git a/proto/private/pbconfigentry/config_entry.gen.go b/proto/private/pbconfigentry/config_entry.gen.go index b5ae3861092..d4f2404b1f2 100644 --- a/proto/private/pbconfigentry/config_entry.gen.go +++ b/proto/private/pbconfigentry/config_entry.gen.go @@ -364,13 +364,10 @@ func HTTPFiltersToStructs(s *HTTPFilters, t *structs.HTTPFilters) { } } } - { - t.URLRewrites = make([]structs.URLRewrite, len(s.URLRewrites)) - for i := range s.URLRewrites { - if s.URLRewrites[i] != nil { - URLRewriteToStructs(s.URLRewrites[i], &t.URLRewrites[i]) - } - } + if s.URLRewrite != nil { + var x structs.URLRewrite + URLRewriteToStructs(s.URLRewrite, &x) + t.URLRewrite = &x } } func HTTPFiltersFromStructs(t *structs.HTTPFilters, s *HTTPFilters) { @@ -387,15 +384,10 @@ func HTTPFiltersFromStructs(t *structs.HTTPFilters, s *HTTPFilters) { } } } - { - s.URLRewrites = make([]*URLRewrite, len(t.URLRewrites)) - for i := range t.URLRewrites { - { - var x URLRewrite - URLRewriteFromStructs(&t.URLRewrites[i], &x) - s.URLRewrites[i] = &x - } - } + if t.URLRewrite != nil { + var x URLRewrite + URLRewriteFromStructs(t.URLRewrite, &x) + s.URLRewrite = &x } } func HTTPHeaderFilterToStructs(s *HTTPHeaderFilter, t *structs.HTTPHeaderFilter) { @@ -1635,7 +1627,6 @@ func TCPServiceToStructs(s *TCPService, t *structs.TCPService) { return } t.Name = s.Name - t.Weight = int(s.Weight) t.EnterpriseMeta = enterpriseMetaToStructs(s.EnterpriseMeta) } func TCPServiceFromStructs(t *structs.TCPService, s *TCPService) { @@ -1643,7 +1634,6 @@ func TCPServiceFromStructs(t *structs.TCPService, s *TCPService) { return } s.Name = t.Name - s.Weight = int32(t.Weight) s.EnterpriseMeta = enterpriseMetaFromStructs(t.EnterpriseMeta) } func TransparentProxyConfigToStructs(s *TransparentProxyConfig, t *structs.TransparentProxyConfig) { diff --git a/proto/private/pbconfigentry/config_entry.pb.go b/proto/private/pbconfigentry/config_entry.pb.go index 1d0f1b5a7ee..841a14f0261 100644 --- a/proto/private/pbconfigentry/config_entry.pb.go +++ b/proto/private/pbconfigentry/config_entry.pb.go @@ -4916,8 +4916,8 @@ type HTTPFilters struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Headers []*HTTPHeaderFilter `protobuf:"bytes,1,rep,name=Headers,proto3" json:"Headers,omitempty"` - URLRewrites []*URLRewrite `protobuf:"bytes,2,rep,name=URLRewrites,proto3" json:"URLRewrites,omitempty"` + Headers []*HTTPHeaderFilter `protobuf:"bytes,1,rep,name=Headers,proto3" json:"Headers,omitempty"` + URLRewrite *URLRewrite `protobuf:"bytes,2,opt,name=URLRewrite,proto3" json:"URLRewrite,omitempty"` } func (x *HTTPFilters) Reset() { @@ -4959,9 +4959,9 @@ func (x *HTTPFilters) GetHeaders() []*HTTPHeaderFilter { return nil } -func (x *HTTPFilters) GetURLRewrites() []*URLRewrite { +func (x *HTTPFilters) GetURLRewrite() *URLRewrite { if x != nil { - return x.URLRewrites + return x.URLRewrite } return nil } @@ -5252,10 +5252,8 @@ type TCPService struct { unknownFields protoimpl.UnknownFields Name string `protobuf:"bytes,1,opt,name=Name,proto3" json:"Name,omitempty"` - // mog: func-to=int func-from=int32 - Weight int32 `protobuf:"varint,2,opt,name=Weight,proto3" json:"Weight,omitempty"` // mog: func-to=enterpriseMetaToStructs func-from=enterpriseMetaFromStructs - EnterpriseMeta *pbcommon.EnterpriseMeta `protobuf:"bytes,4,opt,name=EnterpriseMeta,proto3" json:"EnterpriseMeta,omitempty"` + EnterpriseMeta *pbcommon.EnterpriseMeta `protobuf:"bytes,2,opt,name=EnterpriseMeta,proto3" json:"EnterpriseMeta,omitempty"` } func (x *TCPService) Reset() { @@ -5297,13 +5295,6 @@ func (x *TCPService) GetName() string { return "" } -func (x *TCPService) GetWeight() int32 { - if x != nil { - return x.Weight - } - return 0 -} - func (x *TCPService) GetEnterpriseMeta() *pbcommon.EnterpriseMeta { if x != nil { return x.EnterpriseMeta @@ -6277,188 +6268,187 @@ var file_private_pbconfigentry_config_entry_proto_rawDesc = []byte{ 0x4d, 0x61, 0x74, 0x63, 0x68, 0x54, 0x79, 0x70, 0x65, 0x52, 0x05, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x22, 0xb5, 0x01, 0x0a, 0x0b, 0x48, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x22, 0xb3, 0x01, 0x0a, 0x0b, 0x48, 0x54, 0x54, 0x50, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x12, 0x51, 0x0a, 0x07, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x46, 0x69, - 0x6c, 0x74, 0x65, 0x72, 0x52, 0x07, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x12, 0x53, 0x0a, - 0x0b, 0x55, 0x52, 0x4c, 0x52, 0x65, 0x77, 0x72, 0x69, 0x74, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, - 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x55, 0x52, 0x4c, 0x52, 0x65, - 0x77, 0x72, 0x69, 0x74, 0x65, 0x52, 0x0b, 0x55, 0x52, 0x4c, 0x52, 0x65, 0x77, 0x72, 0x69, 0x74, - 0x65, 0x73, 0x22, 0x20, 0x0a, 0x0a, 0x55, 0x52, 0x4c, 0x52, 0x65, 0x77, 0x72, 0x69, 0x74, 0x65, - 0x12, 0x12, 0x0a, 0x04, 0x50, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x50, 0x61, 0x74, 0x68, 0x22, 0xc2, 0x02, 0x0a, 0x10, 0x48, 0x54, 0x54, 0x50, 0x48, 0x65, 0x61, - 0x64, 0x65, 0x72, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x52, 0x0a, 0x03, 0x41, 0x64, 0x64, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x40, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, - 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, - 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x48, - 0x54, 0x54, 0x50, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x2e, - 0x41, 0x64, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x03, 0x41, 0x64, 0x64, 0x12, 0x16, 0x0a, - 0x06, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x52, - 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x12, 0x52, 0x0a, 0x03, 0x53, 0x65, 0x74, 0x18, 0x03, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x40, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, - 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x48, - 0x65, 0x61, 0x64, 0x65, 0x72, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x2e, 0x53, 0x65, 0x74, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x52, 0x03, 0x53, 0x65, 0x74, 0x1a, 0x36, 0x0a, 0x08, 0x41, 0x64, 0x64, - 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, 0x36, 0x0a, 0x08, 0x53, 0x65, 0x74, 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, 0x22, 0xe1, 0x01, 0x0a, 0x0b, 0x48, 0x54, - 0x54, 0x50, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, - 0x06, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x57, - 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x4c, 0x0a, 0x07, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, + 0x6c, 0x74, 0x65, 0x72, 0x52, 0x07, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x12, 0x51, 0x0a, + 0x0a, 0x55, 0x52, 0x4c, 0x52, 0x65, 0x77, 0x72, 0x69, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x31, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, + 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x55, 0x52, 0x4c, 0x52, 0x65, 0x77, + 0x72, 0x69, 0x74, 0x65, 0x52, 0x0a, 0x55, 0x52, 0x4c, 0x52, 0x65, 0x77, 0x72, 0x69, 0x74, 0x65, + 0x22, 0x20, 0x0a, 0x0a, 0x55, 0x52, 0x4c, 0x52, 0x65, 0x77, 0x72, 0x69, 0x74, 0x65, 0x12, 0x12, + 0x0a, 0x04, 0x50, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x50, 0x61, + 0x74, 0x68, 0x22, 0xc2, 0x02, 0x0a, 0x10, 0x48, 0x54, 0x54, 0x50, 0x48, 0x65, 0x61, 0x64, 0x65, + 0x72, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x52, 0x0a, 0x03, 0x41, 0x64, 0x64, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x40, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, + 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, + 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x48, 0x54, 0x54, + 0x50, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x2e, 0x41, 0x64, + 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x03, 0x41, 0x64, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x52, + 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x52, 0x65, 0x6d, + 0x6f, 0x76, 0x65, 0x12, 0x52, 0x0a, 0x03, 0x53, 0x65, 0x74, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x40, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, + 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x48, 0x65, 0x61, + 0x64, 0x65, 0x72, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x2e, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x52, 0x03, 0x53, 0x65, 0x74, 0x1a, 0x36, 0x0a, 0x08, 0x41, 0x64, 0x64, 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, + 0x36, 0x0a, 0x08, 0x53, 0x65, 0x74, 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, 0x22, 0xe1, 0x01, 0x0a, 0x0b, 0x48, 0x54, 0x54, 0x50, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x57, + 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x57, 0x65, 0x69, + 0x67, 0x68, 0x74, 0x12, 0x4c, 0x0a, 0x07, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, + 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, + 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x48, 0x54, 0x54, + 0x50, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x52, 0x07, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, + 0x73, 0x12, 0x58, 0x0a, 0x0e, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x4d, + 0x65, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x68, 0x61, 0x73, 0x68, + 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, + 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x74, + 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x52, 0x0e, 0x45, 0x6e, 0x74, + 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x22, 0xfc, 0x02, 0x0a, 0x08, + 0x54, 0x43, 0x50, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x12, 0x4d, 0x0a, 0x04, 0x4d, 0x65, 0x74, 0x61, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, - 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x48, - 0x54, 0x54, 0x50, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x52, 0x07, 0x46, 0x69, 0x6c, 0x74, - 0x65, 0x72, 0x73, 0x12, 0x58, 0x0a, 0x0e, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, - 0x65, 0x4d, 0x65, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x68, 0x61, - 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, - 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, - 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x52, 0x0e, 0x45, - 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x22, 0xfc, 0x02, - 0x0a, 0x08, 0x54, 0x43, 0x50, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x12, 0x4d, 0x0a, 0x04, 0x4d, 0x65, - 0x74, 0x61, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, + 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x54, + 0x43, 0x50, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x04, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x52, 0x0a, 0x07, 0x50, 0x61, 0x72, 0x65, 0x6e, + 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, - 0x2e, 0x54, 0x43, 0x50, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x52, 0x04, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x52, 0x0a, 0x07, 0x50, 0x61, 0x72, - 0x65, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x68, 0x61, 0x73, + 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x63, 0x65, 0x52, 0x07, 0x50, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x4d, 0x0a, 0x08, 0x53, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, + 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, + 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x54, 0x43, 0x50, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x52, 0x08, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x45, 0x0a, 0x06, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, - 0x72, 0x79, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, - 0x65, 0x6e, 0x63, 0x65, 0x52, 0x07, 0x50, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x4d, 0x0a, - 0x08, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x31, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, - 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x54, 0x43, 0x50, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x52, 0x08, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x45, 0x0a, 0x06, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x68, - 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, - 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, - 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x1a, 0x37, 0x0a, 0x09, 0x4d, 0x65, 0x74, 0x61, 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, 0x22, 0x92, 0x01, 0x0a, - 0x0a, 0x54, 0x43, 0x50, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x4e, - 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, - 0x16, 0x0a, 0x06, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x06, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x58, 0x0a, 0x0e, 0x45, 0x6e, 0x74, 0x65, 0x72, - 0x70, 0x72, 0x69, 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x30, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, - 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, - 0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x4d, 0x65, 0x74, - 0x61, 0x52, 0x0e, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x4d, 0x65, 0x74, - 0x61, 0x2a, 0xfd, 0x01, 0x0a, 0x04, 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x0f, 0x0a, 0x0b, 0x4b, 0x69, - 0x6e, 0x64, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e, 0x4b, - 0x69, 0x6e, 0x64, 0x4d, 0x65, 0x73, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x10, 0x01, 0x12, - 0x17, 0x0a, 0x13, 0x4b, 0x69, 0x6e, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, - 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x10, 0x02, 0x12, 0x16, 0x0a, 0x12, 0x4b, 0x69, 0x6e, 0x64, - 0x49, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x10, 0x03, - 0x12, 0x19, 0x0a, 0x15, 0x4b, 0x69, 0x6e, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, - 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x10, 0x04, 0x12, 0x17, 0x0a, 0x13, 0x4b, - 0x69, 0x6e, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, - 0x74, 0x73, 0x10, 0x05, 0x12, 0x19, 0x0a, 0x15, 0x4b, 0x69, 0x6e, 0x64, 0x49, 0x6e, 0x6c, 0x69, - 0x6e, 0x65, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x10, 0x06, 0x12, - 0x12, 0x0a, 0x0e, 0x4b, 0x69, 0x6e, 0x64, 0x41, 0x50, 0x49, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, - 0x79, 0x10, 0x07, 0x12, 0x17, 0x0a, 0x13, 0x4b, 0x69, 0x6e, 0x64, 0x42, 0x6f, 0x75, 0x6e, 0x64, - 0x41, 0x50, 0x49, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x10, 0x08, 0x12, 0x11, 0x0a, 0x0d, - 0x4b, 0x69, 0x6e, 0x64, 0x48, 0x54, 0x54, 0x50, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x10, 0x09, 0x12, - 0x10, 0x0a, 0x0c, 0x4b, 0x69, 0x6e, 0x64, 0x54, 0x43, 0x50, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x10, - 0x0a, 0x2a, 0x26, 0x0a, 0x0f, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x08, 0x0a, 0x04, 0x44, 0x65, 0x6e, 0x79, 0x10, 0x00, 0x12, 0x09, - 0x0a, 0x05, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x10, 0x01, 0x2a, 0x21, 0x0a, 0x13, 0x49, 0x6e, 0x74, - 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, - 0x12, 0x0a, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x10, 0x00, 0x2a, 0x50, 0x0a, 0x09, - 0x50, 0x72, 0x6f, 0x78, 0x79, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x14, 0x0a, 0x10, 0x50, 0x72, 0x6f, - 0x78, 0x79, 0x4d, 0x6f, 0x64, 0x65, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x10, 0x00, 0x12, - 0x18, 0x0a, 0x14, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x4d, 0x6f, 0x64, 0x65, 0x54, 0x72, 0x61, 0x6e, - 0x73, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x10, 0x01, 0x12, 0x13, 0x0a, 0x0f, 0x50, 0x72, 0x6f, - 0x78, 0x79, 0x4d, 0x6f, 0x64, 0x65, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x10, 0x02, 0x2a, 0x7b, - 0x0a, 0x0f, 0x4d, 0x65, 0x73, 0x68, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x4d, 0x6f, 0x64, - 0x65, 0x12, 0x1a, 0x0a, 0x16, 0x4d, 0x65, 0x73, 0x68, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, - 0x4d, 0x6f, 0x64, 0x65, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x10, 0x00, 0x12, 0x17, 0x0a, - 0x13, 0x4d, 0x65, 0x73, 0x68, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x4d, 0x6f, 0x64, 0x65, - 0x4e, 0x6f, 0x6e, 0x65, 0x10, 0x01, 0x12, 0x18, 0x0a, 0x14, 0x4d, 0x65, 0x73, 0x68, 0x47, 0x61, - 0x74, 0x65, 0x77, 0x61, 0x79, 0x4d, 0x6f, 0x64, 0x65, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x10, 0x02, - 0x12, 0x19, 0x0a, 0x15, 0x4d, 0x65, 0x73, 0x68, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x4d, - 0x6f, 0x64, 0x65, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x10, 0x03, 0x2a, 0x4f, 0x0a, 0x1a, 0x41, - 0x50, 0x49, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, - 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x18, 0x0a, 0x14, 0x4c, 0x69, 0x73, - 0x74, 0x65, 0x6e, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x48, 0x54, 0x54, - 0x50, 0x10, 0x00, 0x12, 0x17, 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x50, - 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x54, 0x43, 0x50, 0x10, 0x01, 0x2a, 0x92, 0x02, 0x0a, - 0x0f, 0x48, 0x54, 0x54, 0x50, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, - 0x12, 0x16, 0x0a, 0x12, 0x48, 0x54, 0x54, 0x50, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x4d, 0x65, 0x74, - 0x68, 0x6f, 0x64, 0x41, 0x6c, 0x6c, 0x10, 0x00, 0x12, 0x1a, 0x0a, 0x16, 0x48, 0x54, 0x54, 0x50, - 0x4d, 0x61, 0x74, 0x63, 0x68, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x43, 0x6f, 0x6e, 0x6e, 0x65, - 0x63, 0x74, 0x10, 0x01, 0x12, 0x19, 0x0a, 0x15, 0x48, 0x54, 0x54, 0x50, 0x4d, 0x61, 0x74, 0x63, - 0x68, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x10, 0x02, 0x12, - 0x16, 0x0a, 0x12, 0x48, 0x54, 0x54, 0x50, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x4d, 0x65, 0x74, 0x68, - 0x6f, 0x64, 0x47, 0x65, 0x74, 0x10, 0x03, 0x12, 0x17, 0x0a, 0x13, 0x48, 0x54, 0x54, 0x50, 0x4d, - 0x61, 0x74, 0x63, 0x68, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x48, 0x65, 0x61, 0x64, 0x10, 0x04, - 0x12, 0x1a, 0x0a, 0x16, 0x48, 0x54, 0x54, 0x50, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x4d, 0x65, 0x74, - 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x10, 0x05, 0x12, 0x18, 0x0a, 0x14, - 0x48, 0x54, 0x54, 0x50, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x50, - 0x61, 0x74, 0x63, 0x68, 0x10, 0x06, 0x12, 0x17, 0x0a, 0x13, 0x48, 0x54, 0x54, 0x50, 0x4d, 0x61, - 0x74, 0x63, 0x68, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x50, 0x6f, 0x73, 0x74, 0x10, 0x07, 0x12, - 0x16, 0x0a, 0x12, 0x48, 0x54, 0x54, 0x50, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x4d, 0x65, 0x74, 0x68, - 0x6f, 0x64, 0x50, 0x75, 0x74, 0x10, 0x08, 0x12, 0x18, 0x0a, 0x14, 0x48, 0x54, 0x54, 0x50, 0x4d, - 0x61, 0x74, 0x63, 0x68, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x54, 0x72, 0x61, 0x63, 0x65, 0x10, - 0x09, 0x2a, 0xa7, 0x01, 0x0a, 0x13, 0x48, 0x54, 0x54, 0x50, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, - 0x4d, 0x61, 0x74, 0x63, 0x68, 0x54, 0x79, 0x70, 0x65, 0x12, 0x18, 0x0a, 0x14, 0x48, 0x54, 0x54, - 0x50, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x45, 0x78, 0x61, 0x63, - 0x74, 0x10, 0x00, 0x12, 0x19, 0x0a, 0x15, 0x48, 0x54, 0x54, 0x50, 0x48, 0x65, 0x61, 0x64, 0x65, - 0x72, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x10, 0x01, 0x12, 0x1a, - 0x0a, 0x16, 0x48, 0x54, 0x54, 0x50, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x74, 0x63, - 0x68, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x10, 0x02, 0x12, 0x24, 0x0a, 0x20, 0x48, 0x54, - 0x54, 0x50, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x52, 0x65, 0x67, - 0x75, 0x6c, 0x61, 0x72, 0x45, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x10, 0x03, - 0x12, 0x19, 0x0a, 0x15, 0x48, 0x54, 0x54, 0x50, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x4d, 0x61, - 0x74, 0x63, 0x68, 0x53, 0x75, 0x66, 0x66, 0x69, 0x78, 0x10, 0x04, 0x2a, 0x68, 0x0a, 0x11, 0x48, - 0x54, 0x54, 0x50, 0x50, 0x61, 0x74, 0x68, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x54, 0x79, 0x70, 0x65, - 0x12, 0x16, 0x0a, 0x12, 0x48, 0x54, 0x54, 0x50, 0x50, 0x61, 0x74, 0x68, 0x4d, 0x61, 0x74, 0x63, - 0x68, 0x45, 0x78, 0x61, 0x63, 0x74, 0x10, 0x00, 0x12, 0x17, 0x0a, 0x13, 0x48, 0x54, 0x54, 0x50, - 0x50, 0x61, 0x74, 0x68, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x10, - 0x01, 0x12, 0x22, 0x0a, 0x1e, 0x48, 0x54, 0x54, 0x50, 0x50, 0x61, 0x74, 0x68, 0x4d, 0x61, 0x74, + 0x72, 0x79, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x1a, 0x37, 0x0a, 0x09, 0x4d, 0x65, 0x74, 0x61, 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, 0x22, 0x7a, 0x0a, 0x0a, 0x54, 0x43, + 0x50, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x58, 0x0a, 0x0e, + 0x45, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, + 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, + 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, + 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x52, 0x0e, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, + 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x2a, 0xfd, 0x01, 0x0a, 0x04, 0x4b, 0x69, 0x6e, 0x64, 0x12, + 0x0f, 0x0a, 0x0b, 0x4b, 0x69, 0x6e, 0x64, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, + 0x12, 0x12, 0x0a, 0x0e, 0x4b, 0x69, 0x6e, 0x64, 0x4d, 0x65, 0x73, 0x68, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x10, 0x01, 0x12, 0x17, 0x0a, 0x13, 0x4b, 0x69, 0x6e, 0x64, 0x53, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x10, 0x02, 0x12, 0x16, 0x0a, + 0x12, 0x4b, 0x69, 0x6e, 0x64, 0x49, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x47, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x10, 0x03, 0x12, 0x19, 0x0a, 0x15, 0x4b, 0x69, 0x6e, 0x64, 0x53, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x10, 0x04, + 0x12, 0x17, 0x0a, 0x13, 0x4b, 0x69, 0x6e, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x44, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x10, 0x05, 0x12, 0x19, 0x0a, 0x15, 0x4b, 0x69, 0x6e, + 0x64, 0x49, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, + 0x74, 0x65, 0x10, 0x06, 0x12, 0x12, 0x0a, 0x0e, 0x4b, 0x69, 0x6e, 0x64, 0x41, 0x50, 0x49, 0x47, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x10, 0x07, 0x12, 0x17, 0x0a, 0x13, 0x4b, 0x69, 0x6e, 0x64, + 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x41, 0x50, 0x49, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x10, + 0x08, 0x12, 0x11, 0x0a, 0x0d, 0x4b, 0x69, 0x6e, 0x64, 0x48, 0x54, 0x54, 0x50, 0x52, 0x6f, 0x75, + 0x74, 0x65, 0x10, 0x09, 0x12, 0x10, 0x0a, 0x0c, 0x4b, 0x69, 0x6e, 0x64, 0x54, 0x43, 0x50, 0x52, + 0x6f, 0x75, 0x74, 0x65, 0x10, 0x0a, 0x2a, 0x26, 0x0a, 0x0f, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x74, + 0x69, 0x6f, 0x6e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x08, 0x0a, 0x04, 0x44, 0x65, 0x6e, + 0x79, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x10, 0x01, 0x2a, 0x21, + 0x0a, 0x13, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x10, + 0x00, 0x2a, 0x50, 0x0a, 0x09, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x14, + 0x0a, 0x10, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x4d, 0x6f, 0x64, 0x65, 0x44, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x10, 0x00, 0x12, 0x18, 0x0a, 0x14, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x4d, 0x6f, 0x64, + 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x10, 0x01, 0x12, 0x13, + 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x4d, 0x6f, 0x64, 0x65, 0x44, 0x69, 0x72, 0x65, 0x63, + 0x74, 0x10, 0x02, 0x2a, 0x7b, 0x0a, 0x0f, 0x4d, 0x65, 0x73, 0x68, 0x47, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x1a, 0x0a, 0x16, 0x4d, 0x65, 0x73, 0x68, 0x47, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x4d, 0x6f, 0x64, 0x65, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x10, 0x00, 0x12, 0x17, 0x0a, 0x13, 0x4d, 0x65, 0x73, 0x68, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, + 0x79, 0x4d, 0x6f, 0x64, 0x65, 0x4e, 0x6f, 0x6e, 0x65, 0x10, 0x01, 0x12, 0x18, 0x0a, 0x14, 0x4d, + 0x65, 0x73, 0x68, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x4d, 0x6f, 0x64, 0x65, 0x4c, 0x6f, + 0x63, 0x61, 0x6c, 0x10, 0x02, 0x12, 0x19, 0x0a, 0x15, 0x4d, 0x65, 0x73, 0x68, 0x47, 0x61, 0x74, + 0x65, 0x77, 0x61, 0x79, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x10, 0x03, + 0x2a, 0x4f, 0x0a, 0x1a, 0x41, 0x50, 0x49, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x4c, 0x69, + 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x18, + 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, + 0x6f, 0x6c, 0x48, 0x54, 0x54, 0x50, 0x10, 0x00, 0x12, 0x17, 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, + 0x65, 0x6e, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x54, 0x43, 0x50, 0x10, + 0x01, 0x2a, 0x92, 0x02, 0x0a, 0x0f, 0x48, 0x54, 0x54, 0x50, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x4d, + 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, 0x16, 0x0a, 0x12, 0x48, 0x54, 0x54, 0x50, 0x4d, 0x61, 0x74, + 0x63, 0x68, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x41, 0x6c, 0x6c, 0x10, 0x00, 0x12, 0x1a, 0x0a, + 0x16, 0x48, 0x54, 0x54, 0x50, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, + 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x10, 0x01, 0x12, 0x19, 0x0a, 0x15, 0x48, 0x54, 0x54, + 0x50, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x10, 0x02, 0x12, 0x16, 0x0a, 0x12, 0x48, 0x54, 0x54, 0x50, 0x4d, 0x61, 0x74, 0x63, + 0x68, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x47, 0x65, 0x74, 0x10, 0x03, 0x12, 0x17, 0x0a, 0x13, + 0x48, 0x54, 0x54, 0x50, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x48, + 0x65, 0x61, 0x64, 0x10, 0x04, 0x12, 0x1a, 0x0a, 0x16, 0x48, 0x54, 0x54, 0x50, 0x4d, 0x61, 0x74, + 0x63, 0x68, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x10, + 0x05, 0x12, 0x18, 0x0a, 0x14, 0x48, 0x54, 0x54, 0x50, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x4d, 0x65, + 0x74, 0x68, 0x6f, 0x64, 0x50, 0x61, 0x74, 0x63, 0x68, 0x10, 0x06, 0x12, 0x17, 0x0a, 0x13, 0x48, + 0x54, 0x54, 0x50, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x50, 0x6f, + 0x73, 0x74, 0x10, 0x07, 0x12, 0x16, 0x0a, 0x12, 0x48, 0x54, 0x54, 0x50, 0x4d, 0x61, 0x74, 0x63, + 0x68, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x50, 0x75, 0x74, 0x10, 0x08, 0x12, 0x18, 0x0a, 0x14, + 0x48, 0x54, 0x54, 0x50, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x54, + 0x72, 0x61, 0x63, 0x65, 0x10, 0x09, 0x2a, 0xa7, 0x01, 0x0a, 0x13, 0x48, 0x54, 0x54, 0x50, 0x48, + 0x65, 0x61, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x54, 0x79, 0x70, 0x65, 0x12, 0x18, + 0x0a, 0x14, 0x48, 0x54, 0x54, 0x50, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x74, 0x63, + 0x68, 0x45, 0x78, 0x61, 0x63, 0x74, 0x10, 0x00, 0x12, 0x19, 0x0a, 0x15, 0x48, 0x54, 0x54, 0x50, + 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x50, 0x72, 0x65, 0x66, 0x69, + 0x78, 0x10, 0x01, 0x12, 0x1a, 0x0a, 0x16, 0x48, 0x54, 0x54, 0x50, 0x48, 0x65, 0x61, 0x64, 0x65, + 0x72, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x10, 0x02, 0x12, + 0x24, 0x0a, 0x20, 0x48, 0x54, 0x54, 0x50, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x52, 0x65, 0x67, 0x75, 0x6c, 0x61, 0x72, 0x45, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, - 0x69, 0x6f, 0x6e, 0x10, 0x03, 0x2a, 0x6d, 0x0a, 0x12, 0x48, 0x54, 0x54, 0x50, 0x51, 0x75, 0x65, - 0x72, 0x79, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x54, 0x79, 0x70, 0x65, 0x12, 0x17, 0x0a, 0x13, 0x48, - 0x54, 0x54, 0x50, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x45, 0x78, 0x61, - 0x63, 0x74, 0x10, 0x00, 0x12, 0x19, 0x0a, 0x15, 0x48, 0x54, 0x54, 0x50, 0x51, 0x75, 0x65, 0x72, - 0x79, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x10, 0x01, 0x12, - 0x23, 0x0a, 0x1f, 0x48, 0x54, 0x54, 0x50, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4d, 0x61, 0x74, 0x63, - 0x68, 0x52, 0x65, 0x67, 0x75, 0x6c, 0x61, 0x72, 0x45, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, - 0x6f, 0x6e, 0x10, 0x03, 0x42, 0xae, 0x02, 0x0a, 0x29, 0x63, 0x6f, 0x6d, 0x2e, 0x68, 0x61, 0x73, - 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, - 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, - 0x72, 0x79, 0x42, 0x10, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x50, - 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x37, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, - 0x6f, 0x6d, 0x2f, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2f, 0x63, 0x6f, 0x6e, - 0x73, 0x75, 0x6c, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, - 0x65, 0x2f, 0x70, 0x62, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0xa2, - 0x02, 0x04, 0x48, 0x43, 0x49, 0x43, 0xaa, 0x02, 0x25, 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, - 0x72, 0x70, 0x2e, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, - 0x61, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0xca, 0x02, - 0x25, 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x5c, 0x43, 0x6f, 0x6e, 0x73, 0x75, - 0x6c, 0x5c, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5c, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0xe2, 0x02, 0x31, 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, - 0x72, 0x70, 0x5c, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x5c, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, - 0x61, 0x6c, 0x5c, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x5c, 0x47, - 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x28, 0x48, 0x61, 0x73, - 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x3a, 0x3a, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x3a, 0x3a, - 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x3a, 0x3a, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x65, 0x6e, 0x74, 0x72, 0x79, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x69, 0x6f, 0x6e, 0x10, 0x03, 0x12, 0x19, 0x0a, 0x15, 0x48, 0x54, 0x54, 0x50, 0x48, 0x65, 0x61, + 0x64, 0x65, 0x72, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x53, 0x75, 0x66, 0x66, 0x69, 0x78, 0x10, 0x04, + 0x2a, 0x68, 0x0a, 0x11, 0x48, 0x54, 0x54, 0x50, 0x50, 0x61, 0x74, 0x68, 0x4d, 0x61, 0x74, 0x63, + 0x68, 0x54, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x12, 0x48, 0x54, 0x54, 0x50, 0x50, 0x61, 0x74, + 0x68, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x45, 0x78, 0x61, 0x63, 0x74, 0x10, 0x00, 0x12, 0x17, 0x0a, + 0x13, 0x48, 0x54, 0x54, 0x50, 0x50, 0x61, 0x74, 0x68, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x50, 0x72, + 0x65, 0x66, 0x69, 0x78, 0x10, 0x01, 0x12, 0x22, 0x0a, 0x1e, 0x48, 0x54, 0x54, 0x50, 0x50, 0x61, + 0x74, 0x68, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x52, 0x65, 0x67, 0x75, 0x6c, 0x61, 0x72, 0x45, 0x78, + 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x10, 0x03, 0x2a, 0x6d, 0x0a, 0x12, 0x48, 0x54, + 0x54, 0x50, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x54, 0x79, 0x70, 0x65, + 0x12, 0x17, 0x0a, 0x13, 0x48, 0x54, 0x54, 0x50, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4d, 0x61, 0x74, + 0x63, 0x68, 0x45, 0x78, 0x61, 0x63, 0x74, 0x10, 0x00, 0x12, 0x19, 0x0a, 0x15, 0x48, 0x54, 0x54, + 0x50, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x50, 0x72, 0x65, 0x73, 0x65, + 0x6e, 0x74, 0x10, 0x01, 0x12, 0x23, 0x0a, 0x1f, 0x48, 0x54, 0x54, 0x50, 0x51, 0x75, 0x65, 0x72, + 0x79, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x52, 0x65, 0x67, 0x75, 0x6c, 0x61, 0x72, 0x45, 0x78, 0x70, + 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x10, 0x03, 0x42, 0xae, 0x02, 0x0a, 0x29, 0x63, 0x6f, + 0x6d, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, + 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x42, 0x10, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x37, 0x67, 0x69, 0x74, + 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, + 0x70, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x70, + 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2f, 0x70, 0x62, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, + 0x6e, 0x74, 0x72, 0x79, 0xa2, 0x02, 0x04, 0x48, 0x43, 0x49, 0x43, 0xaa, 0x02, 0x25, 0x48, 0x61, + 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x49, + 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, + 0x74, 0x72, 0x79, 0xca, 0x02, 0x25, 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x5c, + 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x5c, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5c, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0xe2, 0x02, 0x31, 0x48, 0x61, + 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x5c, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x5c, 0x49, + 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5c, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, + 0x74, 0x72, 0x79, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, + 0x02, 0x28, 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x3a, 0x3a, 0x43, 0x6f, 0x6e, + 0x73, 0x75, 0x6c, 0x3a, 0x3a, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x3a, 0x3a, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x33, } var ( @@ -6680,7 +6670,7 @@ var file_private_pbconfigentry_config_entry_proto_depIdxs = []int32{ 8, // 105: hashicorp.consul.internal.configentry.HTTPPathMatch.Match:type_name -> hashicorp.consul.internal.configentry.HTTPPathMatchType 9, // 106: hashicorp.consul.internal.configentry.HTTPQueryMatch.Match:type_name -> hashicorp.consul.internal.configentry.HTTPQueryMatchType 67, // 107: hashicorp.consul.internal.configentry.HTTPFilters.Headers:type_name -> hashicorp.consul.internal.configentry.HTTPHeaderFilter - 66, // 108: hashicorp.consul.internal.configentry.HTTPFilters.URLRewrites:type_name -> hashicorp.consul.internal.configentry.URLRewrite + 66, // 108: hashicorp.consul.internal.configentry.HTTPFilters.URLRewrite:type_name -> hashicorp.consul.internal.configentry.URLRewrite 86, // 109: hashicorp.consul.internal.configentry.HTTPHeaderFilter.Add:type_name -> hashicorp.consul.internal.configentry.HTTPHeaderFilter.AddEntry 87, // 110: hashicorp.consul.internal.configentry.HTTPHeaderFilter.Set:type_name -> hashicorp.consul.internal.configentry.HTTPHeaderFilter.SetEntry 65, // 111: hashicorp.consul.internal.configentry.HTTPService.Filters:type_name -> hashicorp.consul.internal.configentry.HTTPFilters diff --git a/proto/private/pbconfigentry/config_entry.proto b/proto/private/pbconfigentry/config_entry.proto index 51acec261d8..a43b2d8c979 100644 --- a/proto/private/pbconfigentry/config_entry.proto +++ b/proto/private/pbconfigentry/config_entry.proto @@ -806,7 +806,7 @@ message HTTPQueryMatch { // name=Structs message HTTPFilters { repeated HTTPHeaderFilter Headers = 1; - repeated URLRewrite URLRewrites = 2; + URLRewrite URLRewrite = 2; } // mog annotation: @@ -863,8 +863,6 @@ message TCPRoute { // name=Structs message TCPService { string Name = 1; - // mog: func-to=int func-from=int32 - int32 Weight = 2; // mog: func-to=enterpriseMetaToStructs func-from=enterpriseMetaFromStructs - common.EnterpriseMeta EnterpriseMeta = 4; + common.EnterpriseMeta EnterpriseMeta = 2; } From de17c7c26fea03556cfe4af3bc3430c28e41b604 Mon Sep 17 00:00:00 2001 From: cskh Date: Wed, 22 Feb 2023 10:22:25 -0500 Subject: [PATCH 034/262] upgrade test: splitter and resolver config entry in peered cluster (#16356) --- .../consul-container/libs/assert/service.go | 28 ++- .../libs/cluster/container.go | 6 +- .../consul-container/libs/service/connect.go | 30 ++- .../consul-container/libs/service/examples.go | 4 + .../consul-container/libs/service/gateway.go | 4 + .../consul-container/libs/service/helpers.go | 4 +- .../consul-container/libs/service/service.go | 1 + .../test/upgrade/peering_http_test.go | 210 +++++++++++++++++- 8 files changed, 263 insertions(+), 24 deletions(-) diff --git a/test/integration/consul-container/libs/assert/service.go b/test/integration/consul-container/libs/assert/service.go index ba46821ffdc..15a03be3b61 100644 --- a/test/integration/consul-container/libs/assert/service.go +++ b/test/integration/consul-container/libs/assert/service.go @@ -49,9 +49,17 @@ func CatalogNodeExists(t *testing.T, c *api.Client, nodeName string) { }) } +func HTTPServiceEchoes(t *testing.T, ip string, port int, path string) { + doHTTPServiceEchoes(t, ip, port, path, nil) +} + +func HTTPServiceEchoesResHeader(t *testing.T, ip string, port int, path string, expectedResHeader map[string]string) { + doHTTPServiceEchoes(t, ip, port, path, expectedResHeader) +} + // HTTPServiceEchoes verifies that a post to the given ip/port combination returns the data // in the response body. Optional path can be provided to differentiate requests. -func HTTPServiceEchoes(t *testing.T, ip string, port int, path string) { +func doHTTPServiceEchoes(t *testing.T, ip string, port int, path string, expectedResHeader map[string]string) { const phrase = "hello" failer := func() *retry.Timer { @@ -82,6 +90,24 @@ func HTTPServiceEchoes(t *testing.T, ip string, port int, path string) { if !strings.Contains(string(body), phrase) { r.Fatal("received an incorrect response ", string(body)) } + + for k, v := range expectedResHeader { + if headerValues, ok := res.Header[k]; !ok { + r.Fatal("expected header not found", k) + } else { + found := false + for _, value := range headerValues { + if value == v { + found = true + break + } + } + + if !found { + r.Fatalf("header %s value not match want %s got %s ", k, v, headerValues) + } + } + } }) } diff --git a/test/integration/consul-container/libs/cluster/container.go b/test/integration/consul-container/libs/cluster/container.go index c9ce7792b6d..bd4416a35bf 100644 --- a/test/integration/consul-container/libs/cluster/container.go +++ b/test/integration/consul-container/libs/cluster/container.go @@ -26,8 +26,9 @@ const bootLogLine = "Consul agent running" const disableRYUKEnv = "TESTCONTAINERS_RYUK_DISABLED" // Exposed ports info -const MaxEnvoyOnNode = 10 // the max number of Envoy sidecar can run along with the agent, base is 19000 -const ServiceUpstreamLocalBindPort = 5000 // local bind Port of service's upstream +const MaxEnvoyOnNode = 10 // the max number of Envoy sidecar can run along with the agent, base is 19000 +const ServiceUpstreamLocalBindPort = 5000 // local bind Port of service's upstream +const ServiceUpstreamLocalBindPort2 = 5001 // local bind Port of service's upstream, for services with 2 upstreams // consulContainerNode implements the Agent interface by running a Consul agent // in a container. @@ -530,6 +531,7 @@ func newContainerRequest(config Config, opts containerOpts) (podRequest, consulR // Envoy upstream listener pod.ExposedPorts = append(pod.ExposedPorts, fmt.Sprintf("%d/tcp", ServiceUpstreamLocalBindPort)) + pod.ExposedPorts = append(pod.ExposedPorts, fmt.Sprintf("%d/tcp", ServiceUpstreamLocalBindPort2)) // Reserve the exposed ports for Envoy admin port, e.g., 19000 - 19009 basePort := 19000 diff --git a/test/integration/consul-container/libs/service/connect.go b/test/integration/consul-container/libs/service/connect.go index b5a8087d2d6..49a340bd2a1 100644 --- a/test/integration/consul-container/libs/service/connect.go +++ b/test/integration/consul-container/libs/service/connect.go @@ -14,7 +14,6 @@ import ( "github.com/hashicorp/consul/api" "github.com/hashicorp/consul/test/integration/consul-container/libs/cluster" - libcluster "github.com/hashicorp/consul/test/integration/consul-container/libs/cluster" "github.com/hashicorp/consul/test/integration/consul-container/libs/utils" ) @@ -23,7 +22,7 @@ type ConnectContainer struct { ctx context.Context container testcontainers.Container ip string - appPort int + appPort []int externalAdminPort int internalAdminPort int mappedPublicPort int @@ -52,6 +51,10 @@ func (g ConnectContainer) Export(partition, peer string, client *api.Client) err } func (g ConnectContainer) GetAddr() (string, int) { + return g.ip, g.appPort[0] +} + +func (g ConnectContainer) GetAddrs() (string, []int) { return g.ip, g.appPort } @@ -139,7 +142,7 @@ func (g ConnectContainer) GetStatus() (string, error) { // node. The container exposes port serviceBindPort and envoy admin port // (19000) by mapping them onto host ports. The container's name has a prefix // combining datacenter and name. -func NewConnectService(ctx context.Context, sidecarServiceName string, serviceID string, serviceBindPort int, node libcluster.Agent) (*ConnectContainer, error) { +func NewConnectService(ctx context.Context, sidecarServiceName string, serviceID string, serviceBindPorts []int, node cluster.Agent) (*ConnectContainer, error) { nodeConfig := node.GetConfig() if nodeConfig.ScratchDir == "" { return nil, fmt.Errorf("node ScratchDir is required") @@ -209,11 +212,19 @@ func NewConnectService(ctx context.Context, sidecarServiceName string, serviceID } var ( - appPortStr = strconv.Itoa(serviceBindPort) + appPortStrs []string adminPortStr = strconv.Itoa(internalAdminPort) ) - info, err := cluster.LaunchContainerOnNode(ctx, node, req, []string{appPortStr, adminPortStr}) + for _, port := range serviceBindPorts { + appPortStrs = append(appPortStrs, strconv.Itoa(port)) + } + + // expose the app ports and the envoy adminPortStr on the agent container + exposedPorts := make([]string, len(appPortStrs)) + copy(exposedPorts, appPortStrs) + exposedPorts = append(exposedPorts, adminPortStr) + info, err := cluster.LaunchContainerOnNode(ctx, node, req, exposedPorts) if err != nil { return nil, err } @@ -222,14 +233,17 @@ func NewConnectService(ctx context.Context, sidecarServiceName string, serviceID ctx: ctx, container: info.Container, ip: info.IP, - appPort: info.MappedPorts[appPortStr].Int(), externalAdminPort: info.MappedPorts[adminPortStr].Int(), internalAdminPort: internalAdminPort, serviceName: sidecarServiceName, } - fmt.Printf("NewConnectService: name %s, mapped App Port %d, service bind port %d\n", - serviceID, out.appPort, serviceBindPort) + for _, port := range appPortStrs { + out.appPort = append(out.appPort, info.MappedPorts[port].Int()) + } + + fmt.Printf("NewConnectService: name %s, mapped App Port %d, service bind port %v\n", + serviceID, out.appPort, serviceBindPorts) fmt.Printf("NewConnectService sidecar: name %s, mapped admin port %d, admin port %d\n", sidecarServiceName, out.externalAdminPort, internalAdminPort) diff --git a/test/integration/consul-container/libs/service/examples.go b/test/integration/consul-container/libs/service/examples.go index da075f5aec9..3d6258eaa9b 100644 --- a/test/integration/consul-container/libs/service/examples.go +++ b/test/integration/consul-container/libs/service/examples.go @@ -64,6 +64,10 @@ func (g exampleContainer) GetAddr() (string, int) { return g.ip, g.httpPort } +func (g exampleContainer) GetAddrs() (string, []int) { + return "", nil +} + func (g exampleContainer) Restart() error { return fmt.Errorf("Restart Unimplemented by ConnectContainer") } diff --git a/test/integration/consul-container/libs/service/gateway.go b/test/integration/consul-container/libs/service/gateway.go index 70897fc7b09..7028a612928 100644 --- a/test/integration/consul-container/libs/service/gateway.go +++ b/test/integration/consul-container/libs/service/gateway.go @@ -53,6 +53,10 @@ func (g gatewayContainer) GetAddr() (string, int) { return g.ip, g.port } +func (g gatewayContainer) GetAddrs() (string, []int) { + return "", nil +} + func (g gatewayContainer) GetLogs() (string, error) { rc, err := g.container.Logs(context.Background()) if err != nil { diff --git a/test/integration/consul-container/libs/service/helpers.go b/test/integration/consul-container/libs/service/helpers.go index 55ad94bb7f6..8de49e45c20 100644 --- a/test/integration/consul-container/libs/service/helpers.go +++ b/test/integration/consul-container/libs/service/helpers.go @@ -61,7 +61,7 @@ func CreateAndRegisterStaticServerAndSidecar(node libcluster.Agent, serviceOpts _ = serverService.Terminate() }) - serverConnectProxy, err := NewConnectService(context.Background(), fmt.Sprintf("%s-sidecar", serviceOpts.ID), serviceOpts.ID, serviceOpts.HTTPPort, node) // bindPort not used + serverConnectProxy, err := NewConnectService(context.Background(), fmt.Sprintf("%s-sidecar", serviceOpts.ID), serviceOpts.ID, []int{serviceOpts.HTTPPort}, node) // bindPort not used if err != nil { return nil, nil, err } @@ -117,7 +117,7 @@ func CreateAndRegisterStaticClientSidecar( } // Create a service and proxy instance - clientConnectProxy, err := NewConnectService(context.Background(), fmt.Sprintf("%s-sidecar", StaticClientServiceName), StaticClientServiceName, libcluster.ServiceUpstreamLocalBindPort, node) + clientConnectProxy, err := NewConnectService(context.Background(), fmt.Sprintf("%s-sidecar", StaticClientServiceName), StaticClientServiceName, []int{libcluster.ServiceUpstreamLocalBindPort}, node) if err != nil { return nil, err } diff --git a/test/integration/consul-container/libs/service/service.go b/test/integration/consul-container/libs/service/service.go index 99da5582269..f32bd67ff8b 100644 --- a/test/integration/consul-container/libs/service/service.go +++ b/test/integration/consul-container/libs/service/service.go @@ -12,6 +12,7 @@ type Service interface { // Export a service to the peering cluster Export(partition, peer string, client *api.Client) error GetAddr() (string, int) + GetAddrs() (string, []int) // GetAdminAddr returns the external admin address GetAdminAddr() (string, int) GetLogs() (string, error) diff --git a/test/integration/consul-container/test/upgrade/peering_http_test.go b/test/integration/consul-container/test/upgrade/peering_http_test.go index fe91f765309..b57ed1d1de3 100644 --- a/test/integration/consul-container/test/upgrade/peering_http_test.go +++ b/test/integration/consul-container/test/upgrade/peering_http_test.go @@ -21,10 +21,15 @@ func TestPeering_UpgradeToTarget_fromLatest(t *testing.T) { t.Parallel() type testcase struct { - oldversion string - targetVersion string - name string - create func(*cluster.Cluster) (libservice.Service, error) + oldversion string + targetVersion string + name string + // create creates addtional resources in peered clusters depending on cases, e.g., static-client, + // static server, and config-entries. It returns the proxy services, an assertation function to + // be called to verify the resources. + create func(*cluster.Cluster, *cluster.Cluster) (libservice.Service, libservice.Service, func(), error) + // extraAssertion adds additional assertion function to the common resources across cases. + // common resources includes static-client in dialing cluster, and static-server in accepting cluster. extraAssertion func(int) } tcs := []testcase{ @@ -38,8 +43,8 @@ func TestPeering_UpgradeToTarget_fromLatest(t *testing.T) { oldversion: "1.14", targetVersion: utils.TargetVersion, name: "basic", - create: func(c *cluster.Cluster) (libservice.Service, error) { - return nil, nil + create: func(accepting *cluster.Cluster, dialing *cluster.Cluster) (libservice.Service, libservice.Service, func(), error) { + return nil, nil, func() {}, nil }, extraAssertion: func(clientUpstreamPort int) {}, }, @@ -49,7 +54,8 @@ func TestPeering_UpgradeToTarget_fromLatest(t *testing.T) { name: "http_router", // Create a second static-service at the client agent of accepting cluster and // a service-router that routes /static-server-2 to static-server-2 - create: func(c *cluster.Cluster) (libservice.Service, error) { + create: func(accepting *cluster.Cluster, dialing *cluster.Cluster) (libservice.Service, libservice.Service, func(), error) { + c := accepting serviceOpts := &libservice.ServiceOpts{ Name: libservice.StaticServer2ServiceName, ID: "static-server-2", @@ -60,7 +66,7 @@ func TestPeering_UpgradeToTarget_fromLatest(t *testing.T) { _, serverConnectProxy, err := libservice.CreateAndRegisterStaticServerAndSidecar(c.Clients()[0], serviceOpts) libassert.CatalogServiceExists(t, c.Clients()[0].GetClient(), libservice.StaticServer2ServiceName) if err != nil { - return nil, err + return nil, nil, nil, err } err = c.ConfigEntryWrite(&api.ProxyConfigEntry{ Kind: api.ProxyDefaults, @@ -70,7 +76,7 @@ func TestPeering_UpgradeToTarget_fromLatest(t *testing.T) { }, }) if err != nil { - return nil, err + return nil, nil, nil, err } routerConfigEntry := &api.ServiceRouterConfigEntry{ Kind: api.ServiceRouter, @@ -90,12 +96,127 @@ func TestPeering_UpgradeToTarget_fromLatest(t *testing.T) { }, } err = c.ConfigEntryWrite(routerConfigEntry) - return serverConnectProxy, err + return serverConnectProxy, nil, func() {}, err }, extraAssertion: func(clientUpstreamPort int) { libassert.AssertFortioName(t, fmt.Sprintf("http://localhost:%d/static-server-2", clientUpstreamPort), "static-server-2") }, }, + { + oldversion: "1.14", + targetVersion: utils.TargetVersion, + name: "http splitter and resolver", + // In addtional to the basic topology, this case provisions the following + // services in the dialing cluster: + // + // - a new static-client at server_0 that has two upstreams: split-static-server (5000) + // and peer-static-server (5001) + // - a local static-server service at client_0 + // - service-splitter named split-static-server w/ 2 services: "local-static-server" and + // "peer-static-server". + // - service-resolved named local-static-server + // - service-resolved named peer-static-server + create: func(accepting *cluster.Cluster, dialing *cluster.Cluster) (libservice.Service, libservice.Service, func(), error) { + err := dialing.ConfigEntryWrite(&api.ProxyConfigEntry{ + Kind: api.ProxyDefaults, + Name: "global", + Config: map[string]interface{}{ + "protocol": "http", + }, + }) + if err != nil { + return nil, nil, nil, err + } + + clientConnectProxy, err := createAndRegisterStaticClientSidecarWithSplittingUpstreams(dialing) + if err != nil { + return nil, nil, nil, fmt.Errorf("error creating client connect proxy in cluster %s", dialing.NetworkName) + } + + // make a resolver for service peer-static-server + resolverConfigEntry := &api.ServiceResolverConfigEntry{ + Kind: api.ServiceResolver, + Name: "peer-static-server", + Redirect: &api.ServiceResolverRedirect{ + Service: libservice.StaticServerServiceName, + Peer: libtopology.DialingPeerName, + }, + } + err = dialing.ConfigEntryWrite(resolverConfigEntry) + if err != nil { + return nil, nil, nil, fmt.Errorf("error writing resolver config entry for %s", resolverConfigEntry.Name) + } + + // make a splitter for service split-static-server + splitter := &api.ServiceSplitterConfigEntry{ + Kind: api.ServiceSplitter, + Name: "split-static-server", + Splits: []api.ServiceSplit{ + { + Weight: 50, + Service: "local-static-server", + ResponseHeaders: &api.HTTPHeaderModifiers{ + Set: map[string]string{ + "x-test-split": "local", + }, + }, + }, + { + Weight: 50, + Service: "peer-static-server", + ResponseHeaders: &api.HTTPHeaderModifiers{ + Set: map[string]string{ + "x-test-split": "peer", + }, + }, + }, + }, + } + err = dialing.ConfigEntryWrite(splitter) + if err != nil { + return nil, nil, nil, fmt.Errorf("error writing splitter config entry for %s", splitter.Name) + } + + // make a resolver for service local-static-server + resolverConfigEntry = &api.ServiceResolverConfigEntry{ + Kind: api.ServiceResolver, + Name: "local-static-server", + Redirect: &api.ServiceResolverRedirect{ + Service: libservice.StaticServerServiceName, + }, + } + err = dialing.ConfigEntryWrite(resolverConfigEntry) + if err != nil { + return nil, nil, nil, fmt.Errorf("error writing resolver config entry for %s", resolverConfigEntry.Name) + } + + // Make a static-server in dialing cluster + serviceOpts := &libservice.ServiceOpts{ + Name: libservice.StaticServerServiceName, + ID: "static-server", + HTTPPort: 8081, + GRPCPort: 8078, + } + _, serverConnectProxy, err := libservice.CreateAndRegisterStaticServerAndSidecar(dialing.Clients()[0], serviceOpts) + libassert.CatalogServiceExists(t, dialing.Clients()[0].GetClient(), libservice.StaticServerServiceName) + if err != nil { + return nil, nil, nil, err + } + + _, appPorts := clientConnectProxy.GetAddrs() + assertionFn := func() { + libassert.HTTPServiceEchoesResHeader(t, "localhost", appPorts[0], "", map[string]string{ + "X-Test-Split": "local", + }) + libassert.HTTPServiceEchoesResHeader(t, "localhost", appPorts[0], "", map[string]string{ + "X-Test-Split": "peer", + }) + libassert.HTTPServiceEchoes(t, "localhost", appPorts[0], "") + } + return serverConnectProxy, clientConnectProxy, assertionFn, nil + }, + extraAssertion: func(clientUpstreamPort int) {}, + }, } run := func(t *testing.T, tc testcase) { @@ -115,7 +236,7 @@ func TestPeering_UpgradeToTarget_fromLatest(t *testing.T) { _, staticClientPort := dialing.Container.GetAddr() _, appPort := dialing.Container.GetAddr() - _, err = tc.create(acceptingCluster) + _, secondClientProxy, assertionAdditionalResources, err := tc.create(acceptingCluster, dialingCluster) require.NoError(t, err) tc.extraAssertion(appPort) @@ -145,6 +266,12 @@ func TestPeering_UpgradeToTarget_fromLatest(t *testing.T) { require.NoError(t, accepting.Container.Restart()) libassert.HTTPServiceEchoes(t, "localhost", staticClientPort, "") + // restart the secondClientProxy if exist + if secondClientProxy != nil { + require.NoError(t, secondClientProxy.Restart()) + } + assertionAdditionalResources() + clientSidecarService, err := libservice.CreateAndRegisterStaticClientSidecar(dialingCluster.Servers()[0], libtopology.DialingPeerName, true) require.NoError(t, err) _, port := clientSidecarService.GetAddr() @@ -165,3 +292,64 @@ func TestPeering_UpgradeToTarget_fromLatest(t *testing.T) { // time.Sleep(3 * time.Second) } } + +// createAndRegisterStaticClientSidecarWithSplittingUpstreams creates a static-client-1 that +// has two upstreams: split-static-server (5000) and peer-static-server (5001) +func createAndRegisterStaticClientSidecarWithSplittingUpstreams(c *cluster.Cluster) (*libservice.ConnectContainer, error) { + // Do some trickery to ensure that partial completion is correctly torn + // down, but successful execution is not. + var deferClean utils.ResettableDefer + defer deferClean.Execute() + + node := c.Servers()[0] + mgwMode := api.MeshGatewayModeLocal + + // Register the static-client service and sidecar first to prevent race with sidecar + // trying to get xDS before it's ready + req := &api.AgentServiceRegistration{ + Name: libservice.StaticClientServiceName, + Port: 8080, + Connect: &api.AgentServiceConnect{ + SidecarService: &api.AgentServiceRegistration{ + Proxy: &api.AgentServiceConnectProxyConfig{ + Upstreams: []api.Upstream{ + { + DestinationName: "split-static-server", + LocalBindAddress: "0.0.0.0", + LocalBindPort: cluster.ServiceUpstreamLocalBindPort, + MeshGateway: api.MeshGatewayConfig{ + Mode: mgwMode, + }, + }, + { + DestinationName: "peer-static-server", + LocalBindAddress: "0.0.0.0", + LocalBindPort: cluster.ServiceUpstreamLocalBindPort2, + MeshGateway: api.MeshGatewayConfig{ + Mode: mgwMode, + }, + }, + }, + }, + }, + }, + } + + if err := node.GetClient().Agent().ServiceRegister(req); err != nil { + return nil, err + } + + // Create a service and proxy instance + clientConnectProxy, err := libservice.NewConnectService(context.Background(), fmt.Sprintf("%s-sidecar", libservice.StaticClientServiceName), libservice.StaticClientServiceName, []int{cluster.ServiceUpstreamLocalBindPort, cluster.ServiceUpstreamLocalBindPort2}, node) + if err != nil { + return nil, err + } + deferClean.Add(func() { + _ = clientConnectProxy.Terminate() + }) + + // disable cleanup functions now that we have an object with a Terminate() function + deferClean.Reset() + + return clientConnectProxy, nil +} From 5309f68bc00407cfb4c844857a447cefd999269b Mon Sep 17 00:00:00 2001 From: Derek Menteer <105233703+hashi-derek@users.noreply.github.com> Date: Wed, 22 Feb 2023 10:09:41 -0600 Subject: [PATCH 035/262] Upgrade Alpine image to 3.17 (#16358) --- .changelog/16358.txt | 3 +++ Dockerfile | 4 ++-- test/integration/connect/envoy/Dockerfile-tcpdump | 4 ++-- test/integration/connect/envoy/helpers.bash | 2 +- 4 files changed, 8 insertions(+), 5 deletions(-) create mode 100644 .changelog/16358.txt diff --git a/.changelog/16358.txt b/.changelog/16358.txt new file mode 100644 index 00000000000..91fcfe4505c --- /dev/null +++ b/.changelog/16358.txt @@ -0,0 +1,3 @@ +```release-note:improvement +container: Upgrade container image to use to Alpine 3.17. +``` diff --git a/Dockerfile b/Dockerfile index 4882f1b46d9..45bef496c23 100644 --- a/Dockerfile +++ b/Dockerfile @@ -13,7 +13,7 @@ # Official docker image that includes binaries from releases.hashicorp.com. This # downloads the release from releases.hashicorp.com and therefore requires that # the release is published before building the Docker image. -FROM docker.mirror.hashicorp.services/alpine:3.15 as official +FROM docker.mirror.hashicorp.services/alpine:3.17 as official # This is the release of Consul to pull in. ARG VERSION @@ -109,7 +109,7 @@ CMD ["agent", "-dev", "-client", "0.0.0.0"] # Production docker image that uses CI built binaries. # Remember, this image cannot be built locally. -FROM docker.mirror.hashicorp.services/alpine:3.15 as default +FROM docker.mirror.hashicorp.services/alpine:3.17 as default ARG PRODUCT_VERSION ARG BIN_NAME diff --git a/test/integration/connect/envoy/Dockerfile-tcpdump b/test/integration/connect/envoy/Dockerfile-tcpdump index 03116e8f5a2..658cd30a233 100644 --- a/test/integration/connect/envoy/Dockerfile-tcpdump +++ b/test/integration/connect/envoy/Dockerfile-tcpdump @@ -1,7 +1,7 @@ -FROM alpine:3.12 +FROM alpine:3.17 RUN apk add --no-cache tcpdump VOLUME [ "/data" ] CMD [ "-w", "/data/all.pcap" ] -ENTRYPOINT [ "/usr/sbin/tcpdump" ] +ENTRYPOINT [ "/usr/bin/tcpdump" ] diff --git a/test/integration/connect/envoy/helpers.bash b/test/integration/connect/envoy/helpers.bash index 89610337a40..c7746d9260d 100755 --- a/test/integration/connect/envoy/helpers.bash +++ b/test/integration/connect/envoy/helpers.bash @@ -584,7 +584,7 @@ function docker_consul_for_proxy_bootstrap { function docker_wget { local DC=$1 shift 1 - docker run --rm --network container:envoy_consul-${DC}_1 docker.mirror.hashicorp.services/alpine:3.9 wget "$@" + docker run --rm --network container:envoy_consul-${DC}_1 docker.mirror.hashicorp.services/alpine:3.17 wget "$@" } function docker_curl { From b09d04a7858d6f243ab5455e8112560f2afc4eaa Mon Sep 17 00:00:00 2001 From: Nathan Coleman Date: Wed, 22 Feb 2023 12:34:27 -0500 Subject: [PATCH 036/262] Update existing docs from Consul API Gateway -> API Gateway for Kubernetes (#16360) * Update existing docs from Consul API Gateway -> API Gateway for Kubernetes * Update page header to reflect page title change * Update nav title to match new page title --- website/content/docs/api-gateway/index.mdx | 4 ++-- website/content/docs/api-gateway/install.mdx | 4 ++-- website/content/docs/api-gateway/tech-specs.mdx | 4 ++-- website/content/docs/api-gateway/upgrades.mdx | 4 ++-- website/content/docs/api-gateway/usage/usage.mdx | 4 ++-- website/data/docs-nav-data.json | 6 +++--- 6 files changed, 13 insertions(+), 13 deletions(-) diff --git a/website/content/docs/api-gateway/index.mdx b/website/content/docs/api-gateway/index.mdx index 1bdc0bfce9d..462c286e508 100644 --- a/website/content/docs/api-gateway/index.mdx +++ b/website/content/docs/api-gateway/index.mdx @@ -1,11 +1,11 @@ --- layout: docs -page_title: Consul API Gateway Overview +page_title: API Gateway for Kubernetes Overview description: >- Consul API Gateway enables external network client access to a service mesh on Kubernetes and forwards requests based on path or header information. Learn about how the k8s Gateway API specification configures Consul API Gateway so you can control access and simplify traffic management. --- -# Consul API Gateway Overview +# API Gateway for Kubernetes Overview This topic provides an overview of the Consul API Gateway. diff --git a/website/content/docs/api-gateway/install.mdx b/website/content/docs/api-gateway/install.mdx index 1ee4c61c8fc..1d715c0c478 100644 --- a/website/content/docs/api-gateway/install.mdx +++ b/website/content/docs/api-gateway/install.mdx @@ -1,11 +1,11 @@ --- layout: docs -page_title: Install Consul API Gateway +page_title: Install API Gateway for Kubernetes description: >- Learn how to install custom resource definitions (CRDs) and configure the Helm chart so that you can run Consul API Gateway on your Kubernetes deployment. --- -# Install Consul API Gateway +# Install API Gateway for Kubernetes This topic describes how to install and configure Consul API Gateway. diff --git a/website/content/docs/api-gateway/tech-specs.mdx b/website/content/docs/api-gateway/tech-specs.mdx index 9695eb0126a..7fb142340de 100644 --- a/website/content/docs/api-gateway/tech-specs.mdx +++ b/website/content/docs/api-gateway/tech-specs.mdx @@ -1,11 +1,11 @@ --- layout: docs -page_title: Consul API Gateway Technical Specifications +page_title: API Gateway for Kubernetes Technical Specifications description: >- Consul API Gateway is a service mesh add-on for Kubernetes deployments. Learn about its requirements for system resources, ports, and component versions, its Enterprise limitations, and compatible k8s cloud environments. --- -# Consul API Gateway Technical Specifications +# API Gateway for Kubernetes Technical Specifications This topic describes the technical specifications associated with using Consul API Gateway. diff --git a/website/content/docs/api-gateway/upgrades.mdx b/website/content/docs/api-gateway/upgrades.mdx index 821a80dce8c..e67c3a0de9c 100644 --- a/website/content/docs/api-gateway/upgrades.mdx +++ b/website/content/docs/api-gateway/upgrades.mdx @@ -1,11 +1,11 @@ --- layout: docs -page_title: Upgrade Consul API Gateway +page_title: Upgrade API Gateway for Kubernetes description: >- Upgrade Consul API Gateway to use newly supported features. Learn about the requirements, procedures, and post-configuration changes involved in standard and specific version upgrades. --- -# Upgrade Consul API Gateway +# Upgrade API Gateway for Kubernetes This topic describes how to upgrade Consul API Gateway. diff --git a/website/content/docs/api-gateway/usage/usage.mdx b/website/content/docs/api-gateway/usage/usage.mdx index 6dc4dd57607..b9b864ce234 100644 --- a/website/content/docs/api-gateway/usage/usage.mdx +++ b/website/content/docs/api-gateway/usage/usage.mdx @@ -1,11 +1,11 @@ --- layout: docs -page_title: Use Consul API Gateway +page_title: Deploy API Gateway for Kubernetes description: >- Learn how to apply a configured Consul API Gateway to your Kubernetes cluster, review the required fields for rerouting HTTP requests, and troubleshoot an error message. --- -# Basic Consul API Gateway Usage +# Deploy API Gateway for Kubernetes This topic describes how to use Consul API Gateway. diff --git a/website/data/docs-nav-data.json b/website/data/docs-nav-data.json index 16bf17d84ba..7d39c943400 100644 --- a/website/data/docs-nav-data.json +++ b/website/data/docs-nav-data.json @@ -193,7 +193,7 @@ ] }, { - "title": "Consul API Gateway", + "title": "API Gateway for Kubernetes", "routes": [ { "title": "v0.5.x", @@ -1293,7 +1293,7 @@ "divider": true }, { - "title": "Consul API Gateway", + "title": "API Gateway for Kubernetes", "routes": [ { "title": "Overview", @@ -1315,7 +1315,7 @@ "title": "Usage", "routes": [ { - "title": "Basic Usage", + "title": "Deploy", "path": "api-gateway/usage/usage" }, { From 84c7b0066cc180bd80d0b249f3a5e1b8445b82e8 Mon Sep 17 00:00:00 2001 From: Anita Akaeze Date: Wed, 22 Feb 2023 12:52:14 -0500 Subject: [PATCH 037/262] initial code (#16296) --- .../consul-container/libs/assert/envoy.go | 18 +- .../consul-container/libs/cluster/cluster.go | 14 ++ .../consul-container/libs/service/helpers.go | 89 +++++--- .../resolver_default_subset_test.go} | 10 +- .../resolver_subset_onlypassing_test.go | 196 ++++++++++++++++++ .../test/upgrade/peering_http_test.go | 3 +- 6 files changed, 299 insertions(+), 31 deletions(-) rename test/integration/consul-container/test/upgrade/{traffic_management_default_subset_test.go => l7_traffic_management/resolver_default_subset_test.go} (98%) create mode 100644 test/integration/consul-container/test/upgrade/l7_traffic_management/resolver_subset_onlypassing_test.go diff --git a/test/integration/consul-container/libs/assert/envoy.go b/test/integration/consul-container/libs/assert/envoy.go index 6713c4fb649..72c0ba990fb 100644 --- a/test/integration/consul-container/libs/assert/envoy.go +++ b/test/integration/consul-container/libs/assert/envoy.go @@ -11,6 +11,7 @@ import ( "time" "github.com/hashicorp/consul/sdk/testutil/retry" + libcluster "github.com/hashicorp/consul/test/integration/consul-container/libs/cluster" "github.com/hashicorp/consul/test/integration/consul-container/libs/utils" "github.com/hashicorp/go-cleanhttp" "github.com/stretchr/testify/assert" @@ -70,7 +71,11 @@ func AssertUpstreamEndpointStatus(t *testing.T, adminPort int, clusterName, heal filter := fmt.Sprintf(`.cluster_statuses[] | select(.name|contains("%s")) | [.host_statuses[].health_status.eds_health_status] | [select(.[] == "%s")] | length`, clusterName, healthStatus) results, err := utils.JQFilter(clusters, filter) require.NoErrorf(r, err, "could not found cluster name %s", clusterName) - require.Equal(r, count, len(results)) + + resultToString := strings.Join(results, " ") + result, err := strconv.Atoi(resultToString) + assert.NoError(r, err) + require.Equal(r, count, result) }) } @@ -251,3 +256,14 @@ func sanitizeResult(s string) []string { result := strings.Split(strings.ReplaceAll(s, `,`, " "), " ") return append(result[:0], result[1:]...) } + +// AssertServiceHasHealthyInstances asserts the number of instances of service equals count for a given service. +// https://developer.hashicorp.com/consul/docs/connect/config-entries/service-resolver#onlypassing +func AssertServiceHasHealthyInstances(t *testing.T, node libcluster.Agent, service string, onlypassing bool, count int) { + services, _, err := node.GetClient().Health().Service(service, "", onlypassing, nil) + require.NoError(t, err) + for _, v := range services { + fmt.Printf("%s service status: %s\n", v.Service.ID, v.Checks.AggregatedStatus()) + } + require.Equal(t, count, len(services)) +} diff --git a/test/integration/consul-container/libs/cluster/cluster.go b/test/integration/consul-container/libs/cluster/cluster.go index 2ec57a67173..c569a21a38e 100644 --- a/test/integration/consul-container/libs/cluster/cluster.go +++ b/test/integration/consul-container/libs/cluster/cluster.go @@ -600,6 +600,20 @@ func (c *Cluster) ConfigEntryWrite(entry api.ConfigEntry) error { return err } +func (c *Cluster) ConfigEntryDelete(entry api.ConfigEntry) error { + client, err := c.GetClient(nil, true) + if err != nil { + return err + } + + entries := client.ConfigEntries() + _, err = entries.Delete(entry.GetKind(), entry.GetName(), nil) + if err != nil { + return fmt.Errorf("error deleting config entry: %v", err) + } + return err +} + func extractSecretIDFrom(tokenOutput string) (string, error) { lines := strings.Split(tokenOutput, "\n") for _, line := range lines { diff --git a/test/integration/consul-container/libs/service/helpers.go b/test/integration/consul-container/libs/service/helpers.go index 8de49e45c20..f7b963ff5a0 100644 --- a/test/integration/consul-container/libs/service/helpers.go +++ b/test/integration/consul-container/libs/service/helpers.go @@ -3,6 +3,7 @@ package service import ( "context" "fmt" + "github.com/hashicorp/consul/api" libcluster "github.com/hashicorp/consul/test/integration/consul-container/libs/cluster" "github.com/hashicorp/consul/test/integration/consul-container/libs/utils" @@ -14,46 +15,38 @@ const ( StaticClientServiceName = "static-client" ) +type Checks struct { + Name string + TTL string +} + +type SidecarService struct { + Port int +} + type ServiceOpts struct { Name string ID string Meta map[string]string HTTPPort int GRPCPort int + Checks Checks + Connect SidecarService } -func CreateAndRegisterStaticServerAndSidecar(node libcluster.Agent, serviceOpts *ServiceOpts) (Service, Service, error) { +// createAndRegisterStaticServerAndSidecar register the services and launch static-server containers +func createAndRegisterStaticServerAndSidecar(node libcluster.Agent, grpcPort int, svc *api.AgentServiceRegistration) (Service, Service, error) { // Do some trickery to ensure that partial completion is correctly torn // down, but successful execution is not. var deferClean utils.ResettableDefer defer deferClean.Execute() - // Register the static-server service and sidecar first to prevent race with sidecar - // trying to get xDS before it's ready - req := &api.AgentServiceRegistration{ - Name: serviceOpts.Name, - ID: serviceOpts.ID, - Port: serviceOpts.HTTPPort, - Connect: &api.AgentServiceConnect{ - SidecarService: &api.AgentServiceRegistration{ - Proxy: &api.AgentServiceConnectProxyConfig{}, - }, - }, - Check: &api.AgentServiceCheck{ - Name: "Static Server Listening", - TCP: fmt.Sprintf("127.0.0.1:%d", serviceOpts.HTTPPort), - Interval: "10s", - Status: api.HealthPassing, - }, - Meta: serviceOpts.Meta, - } - - if err := node.GetClient().Agent().ServiceRegister(req); err != nil { + if err := node.GetClient().Agent().ServiceRegister(svc); err != nil { return nil, nil, err } // Create a service and proxy instance - serverService, err := NewExampleService(context.Background(), serviceOpts.ID, serviceOpts.HTTPPort, serviceOpts.GRPCPort, node) + serverService, err := NewExampleService(context.Background(), svc.ID, svc.Port, grpcPort, node) if err != nil { return nil, nil, err } @@ -61,7 +54,7 @@ func CreateAndRegisterStaticServerAndSidecar(node libcluster.Agent, serviceOpts _ = serverService.Terminate() }) - serverConnectProxy, err := NewConnectService(context.Background(), fmt.Sprintf("%s-sidecar", serviceOpts.ID), serviceOpts.ID, []int{serviceOpts.HTTPPort}, node) // bindPort not used + serverConnectProxy, err := NewConnectService(context.Background(), fmt.Sprintf("%s-sidecar", svc.ID), svc.ID, []int{svc.Port}, node) // bindPort not used if err != nil { return nil, nil, err } @@ -75,6 +68,54 @@ func CreateAndRegisterStaticServerAndSidecar(node libcluster.Agent, serviceOpts return serverService, serverConnectProxy, nil } +func CreateAndRegisterStaticServerAndSidecar(node libcluster.Agent, serviceOpts *ServiceOpts) (Service, Service, error) { + // Register the static-server service and sidecar first to prevent race with sidecar + // trying to get xDS before it's ready + req := &api.AgentServiceRegistration{ + Name: serviceOpts.Name, + ID: serviceOpts.ID, + Port: serviceOpts.HTTPPort, + Connect: &api.AgentServiceConnect{ + SidecarService: &api.AgentServiceRegistration{ + Proxy: &api.AgentServiceConnectProxyConfig{}, + }, + }, + Check: &api.AgentServiceCheck{ + Name: "Static Server Listening", + TCP: fmt.Sprintf("127.0.0.1:%d", serviceOpts.HTTPPort), + Interval: "10s", + Status: api.HealthPassing, + }, + Meta: serviceOpts.Meta, + } + return createAndRegisterStaticServerAndSidecar(node, serviceOpts.GRPCPort, req) +} + +func CreateAndRegisterStaticServerAndSidecarWithChecks(node libcluster.Agent, serviceOpts *ServiceOpts) (Service, Service, error) { + // Register the static-server service and sidecar first to prevent race with sidecar + // trying to get xDS before it's ready + req := &api.AgentServiceRegistration{ + Name: serviceOpts.Name, + ID: serviceOpts.ID, + Port: serviceOpts.HTTPPort, + Connect: &api.AgentServiceConnect{ + SidecarService: &api.AgentServiceRegistration{ + Proxy: &api.AgentServiceConnectProxyConfig{}, + Port: serviceOpts.Connect.Port, + }, + }, + Checks: api.AgentServiceChecks{ + { + Name: serviceOpts.Checks.Name, + TTL: serviceOpts.Checks.TTL, + }, + }, + Meta: serviceOpts.Meta, + } + + return createAndRegisterStaticServerAndSidecar(node, serviceOpts.GRPCPort, req) +} + func CreateAndRegisterStaticClientSidecar( node libcluster.Agent, peerName string, diff --git a/test/integration/consul-container/test/upgrade/traffic_management_default_subset_test.go b/test/integration/consul-container/test/upgrade/l7_traffic_management/resolver_default_subset_test.go similarity index 98% rename from test/integration/consul-container/test/upgrade/traffic_management_default_subset_test.go rename to test/integration/consul-container/test/upgrade/l7_traffic_management/resolver_default_subset_test.go index 5ff574e77e9..059ea39ae88 100644 --- a/test/integration/consul-container/test/upgrade/traffic_management_default_subset_test.go +++ b/test/integration/consul-container/test/upgrade/l7_traffic_management/resolver_default_subset_test.go @@ -18,7 +18,7 @@ import ( "gotest.tools/assert" ) -// TestTrafficManagement_Upgrade Summary +// TestTrafficManagement_ServiceResolverDefaultSubset Summary // This test starts up 3 servers and 1 client in the same datacenter. // // Steps: @@ -26,7 +26,7 @@ import ( // - Create one static-server and 2 subsets and 1 client and sidecar, then register them with Consul // - Validate static-server and 2 subsets are and proxy admin endpoint is healthy - 3 instances // - Validate static servers proxy listeners should be up and have right certs -func TestTrafficManagement_ServiceWithSubsets(t *testing.T) { +func TestTrafficManagement_ServiceResolverDefaultSubset(t *testing.T) { t.Parallel() var responseFormat = map[string]string{"format": "json"} @@ -151,8 +151,8 @@ func createService(t *testing.T, cluster *libcluster.Cluster) (libservice.Servic GRPCPort: 8079, } _, serverConnectProxy, err := libservice.CreateAndRegisterStaticServerAndSidecar(node, serviceOpts) - libassert.CatalogServiceExists(t, client, "static-server") require.NoError(t, err) + libassert.CatalogServiceExists(t, client, "static-server") serviceOptsV1 := &libservice.ServiceOpts{ Name: libservice.StaticServerServiceName, @@ -162,8 +162,8 @@ func createService(t *testing.T, cluster *libcluster.Cluster) (libservice.Servic GRPCPort: 8078, } _, serverConnectProxyV1, err := libservice.CreateAndRegisterStaticServerAndSidecar(node, serviceOptsV1) - libassert.CatalogServiceExists(t, client, "static-server") require.NoError(t, err) + libassert.CatalogServiceExists(t, client, "static-server") serviceOptsV2 := &libservice.ServiceOpts{ Name: libservice.StaticServerServiceName, @@ -173,8 +173,8 @@ func createService(t *testing.T, cluster *libcluster.Cluster) (libservice.Servic GRPCPort: 8077, } _, serverConnectProxyV2, err := libservice.CreateAndRegisterStaticServerAndSidecar(node, serviceOptsV2) - libassert.CatalogServiceExists(t, client, "static-server") require.NoError(t, err) + libassert.CatalogServiceExists(t, client, "static-server") // Create a client proxy instance with the server as an upstream clientConnectProxy, err := libservice.CreateAndRegisterStaticClientSidecar(node, "", false) diff --git a/test/integration/consul-container/test/upgrade/l7_traffic_management/resolver_subset_onlypassing_test.go b/test/integration/consul-container/test/upgrade/l7_traffic_management/resolver_subset_onlypassing_test.go new file mode 100644 index 00000000000..f33d74d6c1d --- /dev/null +++ b/test/integration/consul-container/test/upgrade/l7_traffic_management/resolver_subset_onlypassing_test.go @@ -0,0 +1,196 @@ +package upgrade + +import ( + "context" + "fmt" + "net/http" + "testing" + "time" + + "github.com/hashicorp/consul/api" + libassert "github.com/hashicorp/consul/test/integration/consul-container/libs/assert" + libcluster "github.com/hashicorp/consul/test/integration/consul-container/libs/cluster" + libservice "github.com/hashicorp/consul/test/integration/consul-container/libs/service" + "github.com/hashicorp/consul/test/integration/consul-container/libs/topology" + "github.com/hashicorp/consul/test/integration/consul-container/libs/utils" + libutils "github.com/hashicorp/consul/test/integration/consul-container/libs/utils" + "github.com/hashicorp/go-version" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +// TestTrafficManagement_ServiceResolverSubsetOnlyPassing Summary +// This test starts up 2 servers and 1 client in the same datacenter. +// +// Steps: +// - Create a single agent cluster. +// - Create one static-server, 1 subset server 1 client and sidecars for all services, then register them with Consul +func TestTrafficManagement_ServiceResolverSubsetOnlyPassing(t *testing.T) { + t.Parallel() + + responseFormat := map[string]string{"format": "json"} + + type testcase struct { + oldversion string + targetVersion string + } + tcs := []testcase{ + { + oldversion: "1.13", + targetVersion: utils.TargetVersion, + }, + { + oldversion: "1.14", + targetVersion: utils.TargetVersion, + }, + } + + run := func(t *testing.T, tc testcase) { + buildOpts := &libcluster.BuildOptions{ + ConsulVersion: tc.oldversion, + Datacenter: "dc1", + InjectAutoEncryption: true, + } + // If version < 1.14 disable AutoEncryption + oldVersion, _ := version.NewVersion(tc.oldversion) + if oldVersion.LessThan(libutils.Version_1_14) { + buildOpts.InjectAutoEncryption = false + } + cluster, _, _ := topology.NewPeeringCluster(t, 1, buildOpts) + node := cluster.Agents[0] + + // Register service resolver + serviceResolver := &api.ServiceResolverConfigEntry{ + Kind: api.ServiceResolver, + Name: libservice.StaticServerServiceName, + DefaultSubset: "test", + Subsets: map[string]api.ServiceResolverSubset{ + "test": { + OnlyPassing: true, + }, + }, + ConnectTimeout: 120 * time.Second, + } + err := cluster.ConfigEntryWrite(serviceResolver) + require.NoError(t, err) + + serverConnectProxy, serverConnectProxyV1, clientConnectProxy := createServiceAndSubset(t, cluster) + + _, port := clientConnectProxy.GetAddr() + _, adminPort := clientConnectProxy.GetAdminAddr() + _, serverAdminPort := serverConnectProxy.GetAdminAddr() + _, serverAdminPortV1 := serverConnectProxyV1.GetAdminAddr() + + // Upgrade cluster, restart sidecars then begin service traffic validation + require.NoError(t, cluster.StandardUpgrade(t, context.Background(), tc.targetVersion)) + require.NoError(t, clientConnectProxy.Restart()) + require.NoError(t, serverConnectProxy.Restart()) + require.NoError(t, serverConnectProxyV1.Restart()) + + // force static-server-v1 into a warning state + err = node.GetClient().Agent().UpdateTTL("service:static-server-v1", "", "warn") + assert.NoError(t, err) + + // validate static-client is up and running + libassert.AssertContainerState(t, clientConnectProxy, "running") + libassert.HTTPServiceEchoes(t, "localhost", port, "") + + // validate static-client proxy admin is up + _, clientStatusCode, err := libassert.GetEnvoyOutput(adminPort, "stats", responseFormat) + require.NoError(t, err) + assert.Equal(t, http.StatusOK, clientStatusCode, fmt.Sprintf("service cannot be reached %v", clientStatusCode)) + + // validate static-server proxy admin is up + _, serverStatusCode, err := libassert.GetEnvoyOutput(serverAdminPort, "stats", responseFormat) + require.NoError(t, err) + assert.Equal(t, http.StatusOK, serverStatusCode, fmt.Sprintf("service cannot be reached %v", serverStatusCode)) + + // validate static-server-v1 proxy admin is up + _, serverStatusCodeV1, err := libassert.GetEnvoyOutput(serverAdminPortV1, "stats", responseFormat) + require.NoError(t, err) + assert.Equal(t, http.StatusOK, serverStatusCodeV1, fmt.Sprintf("service cannot be reached %v", serverStatusCodeV1)) + + // certs are valid + libassert.AssertEnvoyPresentsCertURI(t, adminPort, libservice.StaticClientServiceName) + libassert.AssertEnvoyPresentsCertURI(t, serverAdminPort, libservice.StaticServerServiceName) + libassert.AssertEnvoyPresentsCertURI(t, serverAdminPortV1, libservice.StaticServerServiceName) + + // ########################### + // ## with onlypassing=true + // assert only one static-server proxy is healthy + libassert.AssertServiceHasHealthyInstances(t, node, libservice.StaticServerServiceName, true, 1) + + // static-client upstream should have 1 healthy endpoint for test.static-server + libassert.AssertUpstreamEndpointStatus(t, adminPort, "test.static-server.default", "HEALTHY", 1) + + // static-client upstream should have 1 unhealthy endpoint for test.static-server + libassert.AssertUpstreamEndpointStatus(t, adminPort, "test.static-server.default", "UNHEALTHY", 1) + + // static-client upstream should connect to static-server-v2 because the default subset value is to v2 set in the service resolver + libassert.AssertFortioName(t, fmt.Sprintf("http://localhost:%d", port), libservice.StaticServerServiceName) + + // ########################### + // ## with onlypassing=false + // revert to OnlyPassing=false by deleting the config + err = cluster.ConfigEntryDelete(serviceResolver) + require.NoError(t, err) + + // Consul health check assert only one static-server proxy is healthy when onlyPassing is false + libassert.AssertServiceHasHealthyInstances(t, node, libservice.StaticServerServiceName, false, 2) + + // Although the service status is in warning state, when onlypassing is set to false Envoy + // health check returns all service instances with "warning" or "passing" state as Healthy enpoints + libassert.AssertUpstreamEndpointStatus(t, adminPort, "static-server.default", "HEALTHY", 2) + + // static-client upstream should have 0 unhealthy endpoint for static-server + libassert.AssertUpstreamEndpointStatus(t, adminPort, "static-server.default", "UNHEALTHY", 0) + } + + for _, tc := range tcs { + t.Run(fmt.Sprintf("upgrade from %s to %s", tc.oldversion, tc.targetVersion), + func(t *testing.T) { + run(t, tc) + }) + } +} + +// create 2 servers and 1 client +func createServiceAndSubset(t *testing.T, cluster *libcluster.Cluster) (libservice.Service, libservice.Service, libservice.Service) { + node := cluster.Agents[0] + client := node.GetClient() + + serviceOpts := &libservice.ServiceOpts{ + Name: libservice.StaticServerServiceName, + ID: libservice.StaticServerServiceName, + HTTPPort: 8080, + GRPCPort: 8079, + } + _, serverConnectProxy, err := libservice.CreateAndRegisterStaticServerAndSidecar(node, serviceOpts) + require.NoError(t, err) + libassert.CatalogServiceExists(t, client, libservice.StaticServerServiceName) + + serviceOptsV1 := &libservice.ServiceOpts{ + Name: libservice.StaticServerServiceName, + ID: "static-server-v1", + Meta: map[string]string{"version": "v1"}, + HTTPPort: 8081, + GRPCPort: 8078, + Checks: libservice.Checks{ + Name: "main", + TTL: "30m", + }, + Connect: libservice.SidecarService{ + Port: 21011, + }, + } + _, serverConnectProxyV1, err := libservice.CreateAndRegisterStaticServerAndSidecarWithChecks(node, serviceOptsV1) + require.NoError(t, err) + libassert.CatalogServiceExists(t, client, libservice.StaticServerServiceName) + + // Create a client proxy instance with the server as an upstream + clientConnectProxy, err := libservice.CreateAndRegisterStaticClientSidecar(node, "", false) + require.NoError(t, err) + libassert.CatalogServiceExists(t, client, fmt.Sprintf("%s-sidecar-proxy", libservice.StaticClientServiceName)) + + return serverConnectProxy, serverConnectProxyV1, clientConnectProxy +} diff --git a/test/integration/consul-container/test/upgrade/peering_http_test.go b/test/integration/consul-container/test/upgrade/peering_http_test.go index b57ed1d1de3..e799cf59a8a 100644 --- a/test/integration/consul-container/test/upgrade/peering_http_test.go +++ b/test/integration/consul-container/test/upgrade/peering_http_test.go @@ -64,10 +64,11 @@ func TestPeering_UpgradeToTarget_fromLatest(t *testing.T) { GRPCPort: 8078, } _, serverConnectProxy, err := libservice.CreateAndRegisterStaticServerAndSidecar(c.Clients()[0], serviceOpts) - libassert.CatalogServiceExists(t, c.Clients()[0].GetClient(), libservice.StaticServer2ServiceName) if err != nil { return nil, nil, nil, err } + libassert.CatalogServiceExists(t, c.Clients()[0].GetClient(), libservice.StaticServer2ServiceName) + err = c.ConfigEntryWrite(&api.ProxyConfigEntry{ Kind: api.ProxyDefaults, Name: "global", From c0384c2e30a45aa607f18314951df3e8ddd0f6b6 Mon Sep 17 00:00:00 2001 From: Nathan Coleman Date: Wed, 22 Feb 2023 14:10:05 -0500 Subject: [PATCH 038/262] Add changelog entry for API Gateway (Beta) (#16369) * Placeholder commit for changelog entry * Add changelog entry announcing support for API Gateway on VMs * Adjust casing --- .changelog/16369.txt | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 .changelog/16369.txt diff --git a/.changelog/16369.txt b/.changelog/16369.txt new file mode 100644 index 00000000000..1ae86968c40 --- /dev/null +++ b/.changelog/16369.txt @@ -0,0 +1,3 @@ +```release-note:feature +**API Gateway (Beta)** This version adds support for API gateway on VMs. API gateway provides a highly-configurable ingress for requests coming into a Consul network. For more information, refer to the [API gateway](https://developer.hashicorp.com/consul/docs/connect/gateways/api-gateway) documentation. +``` From 641737f32b6ce151f5870a9d8123dc0faf436121 Mon Sep 17 00:00:00 2001 From: Andrew Stucki Date: Wed, 22 Feb 2023 14:55:40 -0500 Subject: [PATCH 039/262] [API Gateway] Fix infinite loop in controller and binding non-accepted routes and gateways (#16377) --- agent/consul/gateways/controller_gateways.go | 52 ++-- .../gateways/controller_gateways_test.go | 259 +++++++++++++++++- agent/structs/config_entry_status.go | 10 + 3 files changed, 286 insertions(+), 35 deletions(-) diff --git a/agent/consul/gateways/controller_gateways.go b/agent/consul/gateways/controller_gateways.go index b1197d0ba4a..cfc5a25ba7e 100644 --- a/agent/consul/gateways/controller_gateways.go +++ b/agent/consul/gateways/controller_gateways.go @@ -409,7 +409,6 @@ func (r *apiGatewayReconciler) reconcileRoute(_ context.Context, req controller. } var triggerOnce sync.Once - validTargets := true for _, service := range route.GetServiceNames() { _, chainSet, err := store.ReadDiscoveryChainConfigEntries(ws, service.Name, pointerTo(service.EnterpriseMeta)) if err != nil { @@ -422,11 +421,6 @@ func (r *apiGatewayReconciler) reconcileRoute(_ context.Context, req controller. r.controller.AddTrigger(req, ws.WatchCtx) }) - if chainSet.IsEmpty() { - updater.SetCondition(conditions.routeInvalidDiscoveryChain(errServiceDoesNotExist)) - continue - } - // make sure that we can actually compile a discovery chain based on this route // the main check is to make sure that all of the protocols align chain, err := discoverychain.Compile(discoverychain.CompileRequest{ @@ -438,28 +432,16 @@ func (r *apiGatewayReconciler) reconcileRoute(_ context.Context, req controller. Entries: chainSet, }) if err != nil { - // we only really need to return the first error for an invalid - // discovery chain, but we still want to set watches on everything in the - // store - if validTargets { - updater.SetCondition(conditions.routeInvalidDiscoveryChain(err)) - validTargets = false - } + updater.SetCondition(conditions.routeInvalidDiscoveryChain(err)) continue } if chain.Protocol != string(route.GetProtocol()) { - if validTargets { - updater.SetCondition(conditions.routeInvalidDiscoveryChain(errInvalidProtocol)) - validTargets = false - } + updater.SetCondition(conditions.routeInvalidDiscoveryChain(errInvalidProtocol)) continue } - // this makes sure we don't override an already set status - if validTargets { - updater.SetCondition(conditions.routeAccepted()) - } + updater.SetCondition(conditions.routeAccepted()) } // if we have no upstream targets, then set the route as invalid @@ -467,17 +449,6 @@ func (r *apiGatewayReconciler) reconcileRoute(_ context.Context, req controller. // we'll do it here too just in case if len(route.GetServiceNames()) == 0 { updater.SetCondition(conditions.routeNoUpstreams()) - validTargets = false - } - - if !validTargets { - // we return early, but need to make sure we're removed from all referencing - // gateways and our status is updated properly - updated := []*structs.BoundAPIGatewayConfigEntry{} - for _, modifiedGateway := range removeRoute(requestToResourceRef(req), meta...) { - updated = append(updated, modifiedGateway.BoundGateway) - } - return finalize(updated) } // the route is valid, attempt to bind it to all gateways @@ -575,6 +546,8 @@ type gatewayMeta struct { // the map values are pointers so that we can update them directly // and have the changes propagate back to the container gateways. boundListeners map[string]*structs.BoundAPIGatewayListener + + generator *gatewayConditionGenerator } // getAllGatewayMeta returns a pre-constructed list of all valid gateway and state @@ -701,11 +674,22 @@ func (g *gatewayMeta) bindRoute(listener *structs.APIGatewayListener, bound *str return false, nil } + // check to make sure we're not binding to an invalid gateway + if !g.Gateway.Status.MatchesConditionStatus(g.generator.gatewayAccepted()) { + return false, fmt.Errorf("failed to bind route to gateway %s: gateway has not been accepted", g.Gateway.Name) + } + + // check to make sure we're not binding to an invalid route + status := route.GetStatus() + if !status.MatchesConditionStatus(g.generator.routeAccepted()) { + return false, fmt.Errorf("failed to bind route to gateway %s: route has not been accepted", g.Gateway.Name) + } + if route, ok := route.(*structs.HTTPRouteConfigEntry); ok { // check our hostnames hostnames := route.FilteredHostnames(listener.GetHostname()) if len(hostnames) == 0 { - return false, fmt.Errorf("failed to bind route to gateway %s: listener %s is does not have any hostnames that match the route", route.GetName(), g.Gateway.Name) + return false, fmt.Errorf("failed to bind route to gateway %s: listener %s is does not have any hostnames that match the route", g.Gateway.Name, listener.Name) } } @@ -809,6 +793,8 @@ func (g *gatewayMeta) setConflicts(updater *structs.StatusUpdater) { // initialize sets up the listener maps that we use for quickly indexing the listeners in our binding logic func (g *gatewayMeta) initialize() *gatewayMeta { + g.generator = newGatewayConditionGenerator() + // set up the maps for fast access g.boundListeners = make(map[string]*structs.BoundAPIGatewayListener, len(g.BoundGateway.Listeners)) for i, listener := range g.BoundGateway.Listeners { diff --git a/agent/consul/gateways/controller_gateways_test.go b/agent/consul/gateways/controller_gateways_test.go index 0c47809c763..805a5738ce6 100644 --- a/agent/consul/gateways/controller_gateways_test.go +++ b/agent/consul/gateways/controller_gateways_test.go @@ -49,6 +49,11 @@ func TestBoundAPIGatewayBindRoute(t *testing.T) { Protocol: structs.ListenerProtocolTCP, }, }, + Status: structs.Status{ + Conditions: []structs.Condition{ + newGatewayConditionGenerator().gatewayAccepted(), + }, + }, }, }, route: &structs.TCPRouteConfigEntry{ @@ -61,6 +66,11 @@ func TestBoundAPIGatewayBindRoute(t *testing.T) { SectionName: "Listener", }, }, + Status: structs.Status{ + Conditions: []structs.Condition{ + newGatewayConditionGenerator().routeAccepted(), + }, + }, }, expectedBoundGateway: structs.BoundAPIGatewayConfigEntry{ Kind: structs.BoundAPIGateway, @@ -116,6 +126,11 @@ func TestBoundAPIGatewayBindRoute(t *testing.T) { Protocol: structs.ListenerProtocolTCP, }, }, + Status: structs.Status{ + Conditions: []structs.Condition{ + newGatewayConditionGenerator().gatewayAccepted(), + }, + }, }, }, route: &structs.TCPRouteConfigEntry{ @@ -127,6 +142,11 @@ func TestBoundAPIGatewayBindRoute(t *testing.T) { Name: "Gateway", }, }, + Status: structs.Status{ + Conditions: []structs.Condition{ + newGatewayConditionGenerator().routeAccepted(), + }, + }, }, expectedBoundGateway: structs.BoundAPIGatewayConfigEntry{ Kind: structs.BoundAPIGateway, @@ -417,6 +437,11 @@ func TestBindRoutesToGateways(t *testing.T) { Protocol: structs.ListenerProtocolTCP, }, }, + Status: structs.Status{ + Conditions: []structs.Condition{ + newGatewayConditionGenerator().gatewayAccepted(), + }, + }, }, }, }, @@ -431,6 +456,11 @@ func TestBindRoutesToGateways(t *testing.T) { SectionName: "Listener", }, }, + Status: structs.Status{ + Conditions: []structs.Condition{ + newGatewayConditionGenerator().routeAccepted(), + }, + }, }, }, expectedBoundAPIGateways: []*structs.BoundAPIGatewayConfigEntry{ @@ -521,6 +551,11 @@ func TestBindRoutesToGateways(t *testing.T) { Protocol: structs.ListenerProtocolTCP, }, }, + Status: structs.Status{ + Conditions: []structs.Condition{ + newGatewayConditionGenerator().gatewayAccepted(), + }, + }, }, }, { @@ -541,6 +576,11 @@ func TestBindRoutesToGateways(t *testing.T) { Protocol: structs.ListenerProtocolTCP, }, }, + Status: structs.Status{ + Conditions: []structs.Condition{ + newGatewayConditionGenerator().gatewayAccepted(), + }, + }, }, }, }, @@ -560,6 +600,11 @@ func TestBindRoutesToGateways(t *testing.T) { SectionName: "Listener", }, }, + Status: structs.Status{ + Conditions: []structs.Condition{ + newGatewayConditionGenerator().routeAccepted(), + }, + }, }, }, expectedBoundAPIGateways: []*structs.BoundAPIGatewayConfigEntry{ @@ -624,6 +669,11 @@ func TestBindRoutesToGateways(t *testing.T) { Protocol: structs.ListenerProtocolTCP, }, }, + Status: structs.Status{ + Conditions: []structs.Condition{ + newGatewayConditionGenerator().gatewayAccepted(), + }, + }, }, }, }, @@ -638,6 +688,11 @@ func TestBindRoutesToGateways(t *testing.T) { SectionName: "Listener 2", }, }, + Status: structs.Status{ + Conditions: []structs.Condition{ + newGatewayConditionGenerator().routeAccepted(), + }, + }, }, }, expectedBoundAPIGateways: []*structs.BoundAPIGatewayConfigEntry{ @@ -691,6 +746,11 @@ func TestBindRoutesToGateways(t *testing.T) { Protocol: structs.ListenerProtocolTCP, }, }, + Status: structs.Status{ + Conditions: []structs.Condition{ + newGatewayConditionGenerator().gatewayAccepted(), + }, + }, }, }, }, @@ -705,6 +765,11 @@ func TestBindRoutesToGateways(t *testing.T) { SectionName: "", }, }, + Status: structs.Status{ + Conditions: []structs.Condition{ + newGatewayConditionGenerator().routeAccepted(), + }, + }, }, }, expectedBoundAPIGateways: []*structs.BoundAPIGatewayConfigEntry{ @@ -770,6 +835,11 @@ func TestBindRoutesToGateways(t *testing.T) { Protocol: structs.ListenerProtocolTCP, }, }, + Status: structs.Status{ + Conditions: []structs.Condition{ + newGatewayConditionGenerator().gatewayAccepted(), + }, + }, }, }, }, @@ -784,6 +854,11 @@ func TestBindRoutesToGateways(t *testing.T) { SectionName: "", }, }, + Status: structs.Status{ + Conditions: []structs.Condition{ + newGatewayConditionGenerator().routeAccepted(), + }, + }, }, }, expectedBoundAPIGateways: []*structs.BoundAPIGatewayConfigEntry{ @@ -843,6 +918,11 @@ func TestBindRoutesToGateways(t *testing.T) { Protocol: structs.ListenerProtocolTCP, }, }, + Status: structs.Status{ + Conditions: []structs.Condition{ + newGatewayConditionGenerator().gatewayAccepted(), + }, + }, }, }, { @@ -871,6 +951,11 @@ func TestBindRoutesToGateways(t *testing.T) { Protocol: structs.ListenerProtocolTCP, }, }, + Status: structs.Status{ + Conditions: []structs.Condition{ + newGatewayConditionGenerator().gatewayAccepted(), + }, + }, }, }, }, @@ -890,6 +975,11 @@ func TestBindRoutesToGateways(t *testing.T) { SectionName: "Listener 2", }, }, + Status: structs.Status{ + Conditions: []structs.Condition{ + newGatewayConditionGenerator().routeAccepted(), + }, + }, }, }, expectedBoundAPIGateways: []*structs.BoundAPIGatewayConfigEntry{ @@ -968,6 +1058,11 @@ func TestBindRoutesToGateways(t *testing.T) { Protocol: structs.ListenerProtocolTCP, }, }, + Status: structs.Status{ + Conditions: []structs.Condition{ + newGatewayConditionGenerator().gatewayAccepted(), + }, + }, }, }, }, @@ -982,6 +1077,11 @@ func TestBindRoutesToGateways(t *testing.T) { SectionName: "Listener 2", }, }, + Status: structs.Status{ + Conditions: []structs.Condition{ + newGatewayConditionGenerator().routeAccepted(), + }, + }, }, }, expectedBoundAPIGateways: []*structs.BoundAPIGatewayConfigEntry{ @@ -1027,6 +1127,11 @@ func TestBindRoutesToGateways(t *testing.T) { Protocol: structs.ListenerProtocolTCP, }, }, + Status: structs.Status{ + Conditions: []structs.Condition{ + newGatewayConditionGenerator().gatewayAccepted(), + }, + }, }, }, { @@ -1047,6 +1152,11 @@ func TestBindRoutesToGateways(t *testing.T) { Protocol: structs.ListenerProtocolTCP, }, }, + Status: structs.Status{ + Conditions: []structs.Condition{ + newGatewayConditionGenerator().gatewayAccepted(), + }, + }, }, }, }, @@ -1061,6 +1171,11 @@ func TestBindRoutesToGateways(t *testing.T) { SectionName: "Listener 1", }, }, + Status: structs.Status{ + Conditions: []structs.Condition{ + newGatewayConditionGenerator().routeAccepted(), + }, + }, }, &structs.TCPRouteConfigEntry{ Name: "TCP Route 2", @@ -1072,6 +1187,11 @@ func TestBindRoutesToGateways(t *testing.T) { SectionName: "Listener 2", }, }, + Status: structs.Status{ + Conditions: []structs.Condition{ + newGatewayConditionGenerator().routeAccepted(), + }, + }, }, }, expectedBoundAPIGateways: []*structs.BoundAPIGatewayConfigEntry{ @@ -1128,6 +1248,11 @@ func TestBindRoutesToGateways(t *testing.T) { Protocol: structs.ListenerProtocolHTTP, }, }, + Status: structs.Status{ + Conditions: []structs.Condition{ + newGatewayConditionGenerator().gatewayAccepted(), + }, + }, }, }, }, @@ -1142,6 +1267,11 @@ func TestBindRoutesToGateways(t *testing.T) { SectionName: "Listener", }, }, + Status: structs.Status{ + Conditions: []structs.Condition{ + newGatewayConditionGenerator().routeAccepted(), + }, + }, }, }, expectedBoundAPIGateways: []*structs.BoundAPIGatewayConfigEntry{}, @@ -1181,6 +1311,11 @@ func TestBindRoutesToGateways(t *testing.T) { Protocol: structs.ListenerProtocolTCP, }, }, + Status: structs.Status{ + Conditions: []structs.Condition{ + newGatewayConditionGenerator().gatewayAccepted(), + }, + }, }, }, }, @@ -1195,6 +1330,11 @@ func TestBindRoutesToGateways(t *testing.T) { SectionName: "", }, }, + Status: structs.Status{ + Conditions: []structs.Condition{ + newGatewayConditionGenerator().routeAccepted(), + }, + }, }, }, expectedBoundAPIGateways: []*structs.BoundAPIGatewayConfigEntry{ @@ -1289,6 +1429,11 @@ func TestBindRoutesToGateways(t *testing.T) { Protocol: structs.ListenerProtocolTCP, }, }, + Status: structs.Status{ + Conditions: []structs.Condition{ + newGatewayConditionGenerator().gatewayAccepted(), + }, + }, }, }, }, @@ -1302,6 +1447,11 @@ func TestBindRoutesToGateways(t *testing.T) { Kind: structs.APIGateway, }, }, + Status: structs.Status{ + Conditions: []structs.Condition{ + newGatewayConditionGenerator().routeAccepted(), + }, + }, }, }, expectedBoundAPIGateways: []*structs.BoundAPIGatewayConfigEntry{}, @@ -1430,7 +1580,7 @@ func TestAPIGatewayController(t *testing.T) { }, }, }, - "tcp-route-no-gateways-invalid-targets": { + "tcp-route-not-accepted-bind": { requests: []controller.Request{{ Kind: structs.TCPRoute, Name: "tcp-route", @@ -1444,6 +1594,27 @@ func TestAPIGatewayController(t *testing.T) { Services: []structs.TCPService{{ Name: "tcp-upstream", }}, + Parents: []structs.ResourceReference{{ + Name: "api-gateway", + EnterpriseMeta: *defaultMeta, + }}, + }, + &structs.APIGatewayConfigEntry{ + Kind: structs.APIGateway, + Name: "api-gateway", + EnterpriseMeta: *defaultMeta, + Listeners: []structs.APIGatewayListener{{ + Name: "listener", + Port: 80, + }}, + }, + &structs.BoundAPIGatewayConfigEntry{ + Kind: structs.BoundAPIGateway, + Name: "api-gateway", + EnterpriseMeta: *defaultMeta, + Listeners: []structs.BoundAPIGatewayListener{{ + Name: "listener", + }}, }, }, finalEntries: []structs.ConfigEntry{ @@ -1453,10 +1624,41 @@ func TestAPIGatewayController(t *testing.T) { EnterpriseMeta: *defaultMeta, Status: structs.Status{ Conditions: []structs.Condition{ - conditions.routeInvalidDiscoveryChain(errServiceDoesNotExist), + conditions.routeAccepted(), + conditions.routeUnbound(structs.ResourceReference{ + Name: "api-gateway", + EnterpriseMeta: *defaultMeta, + }, errors.New("failed to bind route to gateway api-gateway: gateway has not been accepted")), + }, + }, + }, + &structs.APIGatewayConfigEntry{ + Kind: structs.APIGateway, + Name: "api-gateway", + EnterpriseMeta: *defaultMeta, + Listeners: []structs.APIGatewayListener{{ + Name: "listener", + Port: 80, + }}, + Status: structs.Status{ + Conditions: []structs.Condition{ + conditions.gatewayListenerNoConflicts(structs.ResourceReference{ + Kind: structs.APIGateway, + Name: "api-gateway", + SectionName: "listener", + EnterpriseMeta: *defaultMeta, + }), }, }, }, + &structs.BoundAPIGatewayConfigEntry{ + Kind: structs.BoundAPIGateway, + Name: "api-gateway", + EnterpriseMeta: *defaultMeta, + Listeners: []structs.BoundAPIGatewayListener{{ + Name: "listener", + }}, + }, }, }, "tcp-route-no-gateways-invalid-targets-bad-protocol": { @@ -1748,6 +1950,11 @@ func TestAPIGatewayController(t *testing.T) { Name: "gateway", EnterpriseMeta: *defaultMeta, }}, + Status: structs.Status{ + Conditions: []structs.Condition{ + newGatewayConditionGenerator().routeAccepted(), + }, + }, }, &structs.ServiceConfigEntry{ Kind: structs.ServiceDefaults, @@ -1763,6 +1970,11 @@ func TestAPIGatewayController(t *testing.T) { Protocol: structs.ListenerProtocolTCP, Port: 22, }}, + Status: structs.Status{ + Conditions: []structs.Condition{ + newGatewayConditionGenerator().gatewayAccepted(), + }, + }, }, &structs.BoundAPIGatewayConfigEntry{ Kind: structs.BoundAPIGateway, @@ -1840,6 +2052,11 @@ func TestAPIGatewayController(t *testing.T) { Name: "gateway", EnterpriseMeta: *defaultMeta, }}, + Status: structs.Status{ + Conditions: []structs.Condition{ + newGatewayConditionGenerator().routeAccepted(), + }, + }, }, &structs.ServiceConfigEntry{ Kind: structs.ServiceDefaults, @@ -1931,6 +2148,11 @@ func TestAPIGatewayController(t *testing.T) { Name: "gateway", EnterpriseMeta: *defaultMeta, }}, + Status: structs.Status{ + Conditions: []structs.Condition{ + newGatewayConditionGenerator().routeAccepted(), + }, + }, }, &structs.TCPRouteConfigEntry{ Kind: structs.TCPRoute, @@ -1944,6 +2166,11 @@ func TestAPIGatewayController(t *testing.T) { Name: "gateway", EnterpriseMeta: *defaultMeta, }}, + Status: structs.Status{ + Conditions: []structs.Condition{ + newGatewayConditionGenerator().routeAccepted(), + }, + }, }, &structs.ServiceConfigEntry{ Kind: structs.ServiceDefaults, @@ -2061,6 +2288,11 @@ func TestAPIGatewayController(t *testing.T) { Name: "gateway", EnterpriseMeta: *defaultMeta, }}, + Status: structs.Status{ + Conditions: []structs.Condition{ + newGatewayConditionGenerator().routeAccepted(), + }, + }, }, &structs.HTTPRouteConfigEntry{ Kind: structs.HTTPRoute, @@ -2076,6 +2308,11 @@ func TestAPIGatewayController(t *testing.T) { Name: "gateway", EnterpriseMeta: *defaultMeta, }}, + Status: structs.Status{ + Conditions: []structs.Condition{ + newGatewayConditionGenerator().routeAccepted(), + }, + }, }, &structs.ServiceConfigEntry{ Kind: structs.ServiceDefaults, @@ -2174,6 +2411,14 @@ func TestAPIGatewayController(t *testing.T) { Kind: structs.TCPRoute, Name: "tcp-route", Meta: acl.DefaultEnterpriseMeta(), + }, { + Kind: structs.TCPRoute, + Name: "tcp-route", + Meta: acl.DefaultEnterpriseMeta(), + }, { + Kind: structs.HTTPRoute, + Name: "http-route", + Meta: acl.DefaultEnterpriseMeta(), }, { Kind: structs.HTTPRoute, Name: "http-route", @@ -2327,6 +2572,11 @@ func TestAPIGatewayController(t *testing.T) { Name: "gateway", EnterpriseMeta: *defaultMeta, }}, + Status: structs.Status{ + Conditions: []structs.Condition{ + newGatewayConditionGenerator().routeAccepted(), + }, + }, }, &structs.TCPRouteConfigEntry{ Kind: structs.TCPRoute, @@ -2340,6 +2590,11 @@ func TestAPIGatewayController(t *testing.T) { Name: "gateway", EnterpriseMeta: *defaultMeta, }}, + Status: structs.Status{ + Conditions: []structs.Condition{ + newGatewayConditionGenerator().routeAccepted(), + }, + }, }, &structs.ServiceConfigEntry{ Kind: structs.ServiceDefaults, diff --git a/agent/structs/config_entry_status.go b/agent/structs/config_entry_status.go index 5485a6ccaf9..85140f3e5aa 100644 --- a/agent/structs/config_entry_status.go +++ b/agent/structs/config_entry_status.go @@ -50,6 +50,16 @@ type Status struct { Conditions []Condition } +func (s *Status) MatchesConditionStatus(condition Condition) bool { + for _, c := range s.Conditions { + if c.IsCondition(&condition) && + c.Status == condition.Status { + return true + } + } + return false +} + func (s Status) SameConditions(other Status) bool { if len(s.Conditions) != len(other.Conditions) { return false From ae9c22896762f6d4a952df03103fd2b55321b9eb Mon Sep 17 00:00:00 2001 From: Dhia Ayachi Date: Wed, 22 Feb 2023 15:15:51 -0500 Subject: [PATCH 040/262] Rate limiter/add ip prefix (#16342) * add support for prefixes in the config tree * fix to use default config when the prefix have no config --- agent/consul/multilimiter/multilimiter.go | 38 ++++------ .../consul/multilimiter/multilimiter_test.go | 76 ++++++++++++++++--- 2 files changed, 80 insertions(+), 34 deletions(-) diff --git a/agent/consul/multilimiter/multilimiter.go b/agent/consul/multilimiter/multilimiter.go index c66948b263c..21839d3fe06 100644 --- a/agent/consul/multilimiter/multilimiter.go +++ b/agent/consul/multilimiter/multilimiter.go @@ -15,14 +15,10 @@ var _ RateLimiter = &MultiLimiter{} const separator = "♣" -func makeKey(keys ...[]byte) KeyType { +func Key(keys ...[]byte) KeyType { return bytes.Join(keys, []byte(separator)) } -func Key(prefix, key []byte) KeyType { - return makeKey(prefix, key) -} - // RateLimiter is the interface implemented by MultiLimiter // //go:generate mockery --name RateLimiter --inpackage --filename mock_RateLimiter.go @@ -131,19 +127,9 @@ func (m *MultiLimiter) Run(ctx context.Context) { } -func splitKey(key []byte) ([]byte, []byte) { - - ret := bytes.SplitN(key, []byte(separator), 2) - if len(ret) != 2 { - return []byte(""), []byte("") - } - return ret[0], ret[1] -} - // Allow should be called by a request processor to check if the current request is Limited // The request processor should provide a LimitedEntity that implement the right Key() func (m *MultiLimiter) Allow(e LimitedEntity) bool { - prefix, _ := splitKey(e.Key()) limiters := m.limiters.Load() l, ok := limiters.Get(e.Key()) now := time.Now() @@ -157,14 +143,16 @@ func (m *MultiLimiter) Allow(e LimitedEntity) bool { } configs := m.limitersConfigs.Load() - c, okP := configs.Get(prefix) - var config = &m.defaultConfig.Load().LimiterConfig - if okP { - prefixConfig := c.(*LimiterConfig) - if prefixConfig != nil { - config = prefixConfig + config := &m.defaultConfig.Load().LimiterConfig + p, _, ok := configs.Root().LongestPrefix(e.Key()) + + if ok { + c, ok := configs.Get(p) + if ok && c != nil { + config = c.(*LimiterConfig) } } + limiter := &Limiter{limiter: rate.NewLimiter(config.Rate, config.Burst)} limiter.lastAccess.Store(unixNow) m.limiterCh <- &limiterWithKey{l: limiter, k: e.Key(), t: now} @@ -182,7 +170,6 @@ type tickerWrapper struct { func (t tickerWrapper) Ticker() <-chan time.Time { return t.ticker.C } - func (m *MultiLimiter) reconcile(ctx context.Context, waiter ticker, txn *radix.Txn, reconcileCheckLimit time.Duration) *radix.Txn { select { case <-waiter.Ticker(): @@ -223,8 +210,11 @@ func (m *MultiLimiter) reconcileConfig(txn *radix.Txn) { // find the prefix for the leaf and check if the defaultConfig is up-to-date // it's possible that the prefix is equal to the key - prefix, _ := splitKey(k) - v, ok := m.limitersConfigs.Load().Get(prefix) + p, _, ok := m.limitersConfigs.Load().Root().LongestPrefix(k) + if !ok { + continue + } + v, ok := m.limitersConfigs.Load().Get(p) if v == nil || !ok { continue } diff --git a/agent/consul/multilimiter/multilimiter_test.go b/agent/consul/multilimiter/multilimiter_test.go index b64f95febdc..2b04f29eef8 100644 --- a/agent/consul/multilimiter/multilimiter_test.go +++ b/agent/consul/multilimiter/multilimiter_test.go @@ -33,7 +33,7 @@ func TestNewMultiLimiter(t *testing.T) { func TestRateLimiterUpdate(t *testing.T) { c := Config{LimiterConfig: LimiterConfig{Rate: 0.1}, ReconcileCheckLimit: 1 * time.Hour, ReconcileCheckInterval: 10 * time.Millisecond} m := NewMultiLimiter(c) - key := makeKey([]byte("test")) + key := Key([]byte("test")) //Allow a key m.Allow(Limited{key: key}) @@ -77,7 +77,7 @@ func TestRateLimiterCleanup(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() m.Run(ctx) - key := makeKey([]byte("test")) + key := Key([]byte("test")) m.Allow(Limited{key: key}) retry.RunWith(&retry.Timer{Wait: 100 * time.Millisecond, Timeout: 2 * time.Second}, t, func(r *retry.R) { l := m.limiters.Load() @@ -279,6 +279,53 @@ func TestRateLimiterUpdateConfig(t *testing.T) { limiter := l.(*Limiter) require.True(t, c1.isApplied(limiter.limiter)) }) + t.Run("Allow an IP with prefix and check prefix config is applied to new keys under that prefix", func(t *testing.T) { + c := Config{LimiterConfig: LimiterConfig{Rate: 0.1}, ReconcileCheckLimit: 100 * time.Millisecond, ReconcileCheckInterval: 10 * time.Millisecond} + m := NewMultiLimiter(c) + require.Equal(t, *m.defaultConfig.Load(), c) + c1 := LimiterConfig{Rate: 3} + prefix := Key([]byte("ip.ratelimit"), []byte("127.0")) + m.UpdateConfig(c1, prefix) + ip := Key([]byte("ip.ratelimit"), []byte("127.0.0.1")) + m.Allow(ipLimited{key: ip}) + storeLimiter(m) + load := m.limiters.Load() + l, ok := load.Get(ip) + require.True(t, ok) + require.NotNil(t, l) + limiter := l.(*Limiter) + require.True(t, c1.isApplied(limiter.limiter)) + }) + + t.Run("Allow an IP with 2 prefixes and check prefix config is applied to new keys under that prefix", func(t *testing.T) { + c := Config{LimiterConfig: LimiterConfig{Rate: 0.1}, ReconcileCheckLimit: 100 * time.Millisecond, ReconcileCheckInterval: 10 * time.Millisecond} + m := NewMultiLimiter(c) + require.Equal(t, *m.defaultConfig.Load(), c) + c1 := LimiterConfig{Rate: 3} + prefix := Key([]byte("ip.ratelimit"), []byte("127.0")) + m.UpdateConfig(c1, prefix) + prefix = Key([]byte("ip.ratelimit"), []byte("127.0.0")) + c2 := LimiterConfig{Rate: 6} + m.UpdateConfig(c2, prefix) + ip := Key([]byte("ip.ratelimit"), []byte("127.0.0.1")) + m.Allow(ipLimited{key: ip}) + storeLimiter(m) + load := m.limiters.Load() + l, ok := load.Get(ip) + require.True(t, ok) + require.NotNil(t, l) + limiter := l.(*Limiter) + require.True(t, c2.isApplied(limiter.limiter)) + ip = Key([]byte("ip.ratelimit"), []byte("127.0.1.1")) + m.Allow(ipLimited{key: ip}) + storeLimiter(m) + load = m.limiters.Load() + l, ok = load.Get(ip) + require.True(t, ok) + require.NotNil(t, l) + limiter = l.(*Limiter) + require.True(t, c1.isApplied(limiter.limiter)) + }) t.Run("Allow an IP with prefix and check after it's cleaned new Allow would give it the right defaultConfig", func(t *testing.T) { c := Config{LimiterConfig: LimiterConfig{Rate: 0.1}, ReconcileCheckLimit: 100 * time.Millisecond, ReconcileCheckInterval: 10 * time.Millisecond} @@ -304,10 +351,10 @@ func FuzzSingleConfig(f *testing.F) { c := Config{LimiterConfig: LimiterConfig{Rate: 0.1}, ReconcileCheckLimit: 100 * time.Millisecond, ReconcileCheckInterval: 10 * time.Millisecond} m := NewMultiLimiter(c) require.Equal(f, *m.defaultConfig.Load(), c) - f.Add(makeKey(randIP())) - f.Add(makeKey(randIP(), randIP())) - f.Add(makeKey(randIP(), randIP(), randIP())) - f.Add(makeKey(randIP(), randIP(), randIP(), randIP())) + f.Add(Key(randIP())) + f.Add(Key(randIP(), randIP())) + f.Add(Key(randIP(), randIP(), randIP())) + f.Add(Key(randIP(), randIP(), randIP(), randIP())) f.Fuzz(func(t *testing.T, ff []byte) { m.Allow(Limited{key: ff}) storeLimiter(m) @@ -317,9 +364,9 @@ func FuzzSingleConfig(f *testing.F) { } func FuzzSplitKey(f *testing.F) { - f.Add(makeKey(randIP(), randIP())) - f.Add(makeKey(randIP(), randIP(), randIP())) - f.Add(makeKey(randIP(), randIP(), randIP(), randIP())) + f.Add(Key(randIP(), randIP())) + f.Add(Key(randIP(), randIP(), randIP())) + f.Add(Key(randIP(), randIP(), randIP(), randIP())) f.Add([]byte("")) f.Fuzz(func(t *testing.T, ff []byte) { prefix, suffix := splitKey(ff) @@ -342,7 +389,7 @@ func checkLimiter(t require.TestingT, ff []byte, Tree *radix.Txn) { func FuzzUpdateConfig(f *testing.F) { - f.Add(bytes.Join([][]byte{[]byte(""), makeKey(randIP()), makeKey(randIP(), randIP()), makeKey(randIP(), randIP(), randIP()), makeKey(randIP(), randIP(), randIP(), randIP())}, []byte(","))) + f.Add(bytes.Join([][]byte{[]byte(""), Key(randIP()), Key(randIP(), randIP()), Key(randIP(), randIP(), randIP()), Key(randIP(), randIP(), randIP(), randIP())}, []byte(","))) f.Fuzz(func(t *testing.T, ff []byte) { cm := Config{LimiterConfig: LimiterConfig{Rate: 0.1}, ReconcileCheckLimit: 1 * time.Millisecond, ReconcileCheckInterval: 1 * time.Millisecond} m := NewMultiLimiter(cm) @@ -509,3 +556,12 @@ type mockTicker struct { func (m *mockTicker) Ticker() <-chan time.Time { return m.tickerCh } + +func splitKey(key []byte) ([]byte, []byte) { + + ret := bytes.SplitN(key, []byte(separator), 2) + if len(ret) != 2 { + return []byte(""), []byte("") + } + return ret[0], ret[1] +} From 182f6c8be52d2bc96d6773336519a93e83c2b77d Mon Sep 17 00:00:00 2001 From: Ranjandas Date: Thu, 23 Feb 2023 07:27:02 +1100 Subject: [PATCH 041/262] Documentation update: Adding K8S clusters to external Consul servers (#16285) * Remove Consul Client installation option With Consul-K8S 1.0 and introduction of Consul-Dataplane, K8S has the option to run without running Consul Client agents. * remove note referring to the same documentation * Added instructions on the use of httpsPort when servers are not running TLS enabled * Modified titile and description --- .../servers-outside-kubernetes.mdx | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/website/content/docs/k8s/deployment-configurations/servers-outside-kubernetes.mdx b/website/content/docs/k8s/deployment-configurations/servers-outside-kubernetes.mdx index 93c98d7f317..8050e4d01b6 100644 --- a/website/content/docs/k8s/deployment-configurations/servers-outside-kubernetes.mdx +++ b/website/content/docs/k8s/deployment-configurations/servers-outside-kubernetes.mdx @@ -1,11 +1,11 @@ --- layout: docs -page_title: Join External Servers to Consul on Kubernetes +page_title: Join Kubernetes Clusters to external Consul Servers description: >- - Client agents that run on Kubernetes pods can join existing clusters whose server agents run outside of k8s. Learn how to expose gossip ports and bootstrap ACLs by configuring the Helm chart. + Kubernetes clusters can be joined to existing Consul clusters in a much simpler way with the introduction of Consul Dataplane. Learn how to add Kubernetes Clusters into an existing Consul cluster and bootstrap ACLs by configuring the Helm chart. --- -# Join External Servers to Consul on Kubernetes +# Join Kubernetes Clusters to external Consul Servers If you have a Consul cluster already running, you can configure your Consul on Kubernetes installation to join this existing cluster. @@ -14,9 +14,7 @@ The below `values.yaml` file shows how to configure the Helm chart to install Consul so that it joins an existing Consul server cluster. The `global.enabled` value first disables all chart components by default -so that each component is opt-in. This allows us to _only_ setup the client -agents. We then opt-in to the client agents by setting `client.enabled` to -`true`. +so that each component is opt-in. Next, configure `externalServers` to point it to Consul servers. The `externalServers.hosts` value must be provided and should be set to a DNS, an IP, @@ -37,8 +35,10 @@ externalServers: - **Note:** To join Consul on Kubernetes to an existing Consul server cluster running outside of Kubernetes, -refer to [Consul servers outside of Kubernetes](/consul/docs/k8s/deployment-configurations/servers-outside-kubernetes). +With the introduction of [Consul Dataplane](/consul/docs/connect/dataplane#what-is-consul-dataplane), Consul installation on Kubernetes is simplified by removing the Consul Client agents. +This requires the Helm installation and rest of the consul-k8s components installed on Kubernetes to talk to Consul Servers directly on various ports. +Before starting the installation, ensure that the Consul Servers are configured to have the gRPC port enabled `8502/tcp` using the [`ports.grpc = 8502`](/consul/docs/agent/config/config-files#grpc) configuration option. + ## Configuring TLS @@ -68,7 +68,7 @@ externalServers: If your HTTPS port is different from Consul's default `8501`, you must also set -`externalServers.httpsPort`. +`externalServers.httpsPort`. If the Consul servers are not running TLS enabled, use this config to set the HTTP port the servers are configured with (default `8500`). ## Configuring ACLs From 5400e3d83d719ddc9bef660559f2009207092572 Mon Sep 17 00:00:00 2001 From: Kyle Havlovitz Date: Wed, 22 Feb 2023 12:36:25 -0800 Subject: [PATCH 042/262] Add docs for usage endpoint and command (#16258) * Add docs for usage endpoint and command --- website/content/api-docs/operator/usage.mdx | 161 ++++++++++++++++++++ website/content/commands/operator/index.mdx | 2 + website/content/commands/operator/usage.mdx | 100 ++++++++++++ website/data/api-docs-nav-data.json | 4 + website/data/commands-nav-data.json | 4 + 5 files changed, 271 insertions(+) create mode 100644 website/content/api-docs/operator/usage.mdx create mode 100644 website/content/commands/operator/usage.mdx diff --git a/website/content/api-docs/operator/usage.mdx b/website/content/api-docs/operator/usage.mdx new file mode 100644 index 00000000000..82202b13fb8 --- /dev/null +++ b/website/content/api-docs/operator/usage.mdx @@ -0,0 +1,161 @@ +--- +layout: api +page_title: Usage - Operator - HTTP API +description: |- + The /operator/usage endpoint returns usage information about the number of + services, service instances and Connect-enabled service instances by + datacenter. +--- + +# Usage Operator HTTP API + +The `/operator/usage` endpoint returns usage information about the number of +services, service instances and Connect-enabled service instances by datacenter. + +| Method | Path | Produces | +| ------ | ----------------- | ------------------ | +| `GET` | `/operator/usage` | `application/json` | + +The table below shows this endpoint's support for +[blocking queries](/consul/api-docs/features/blocking), +[consistency modes](/consul/api-docs/features/consistency), +[agent caching](/consul/api-docs/features/caching), and +[required ACLs](/consul/api-docs/api-structure#authentication). + +| Blocking Queries | Consistency Modes | Agent Caching | ACL Required | +| ---------------- | ----------------- | ------------- | --------------- | +| `YES` | `all` | `none` | `operator:read` | + +The corresponding CLI command is [`consul operator usage instances`](/consul/commands/operator/usage). + +### Query Parameters + +- `global` `(bool: false)` - If present, usage information for all + known datacenters will be returned. By default, only the local datacenter's + usage information is returned. + +- `stale` `(bool: false)` - If the cluster does not currently have a leader, an + error will be returned. You can use the `?stale` query parameter to read the + Raft configuration from any of the Consul servers. + +### Sample Request + +```shell-session +$ curl \ + http://127.0.0.1:8500/v1/operator/usage +``` + +### Sample Response + + + +```json +{ + "Usage": { + "dc1": { + "Services": 1, + "ServiceInstances": 1, + "ConnectServiceInstances": { + "connect-native": 0, + "connect-proxy": 0, + "ingress-gateway": 0, + "mesh-gateway": 0, + "terminating-gateway": 0 + }, + "BillableServiceInstances": 0 + } + }, + "Index": 13, + "LastContact": 0, + "KnownLeader": true, + "ConsistencyLevel": "leader", + "NotModified": false, + "Backend": 0, + "ResultsFilteredByACLs": false +} +``` + + +```json +{ + "Usage": { + "dc1": { + "Services": 1, + "ServiceInstances": 1, + "ConnectServiceInstances": { + "connect-native": 0, + "connect-proxy": 0, + "ingress-gateway": 0, + "mesh-gateway": 0, + "terminating-gateway": 0 + }, + "BillableServiceInstances": 0, + "PartitionNamespaceServices": { + "default": { + "default": 1 + } + }, + "PartitionNamespaceServiceInstances": { + "default": { + "default": 1 + } + }, + "PartitionNamespaceBillableServiceInstances": { + "default": { + "default": 1 + } + }, + "PartitionNamespaceConnectServiceInstances": { + "default": { + "default": { + "connect-native": 0, + "connect-proxy": 0, + "ingress-gateway": 0, + "mesh-gateway": 0, + "terminating-gateway": 0 + } + } + } + } + }, + "Index": 13, + "LastContact": 0, + "KnownLeader": true, + "ConsistencyLevel": "leader", + "NotModified": false, + "Backend": 0, + "ResultsFilteredByACLs": false +} +``` + + + +- `Services` is the total number of unique service names registered in the + datacenter. + +- `ServiceInstances` is the total number of service instances registered in + the datacenter. + +- `ConnectServiceInstances` is the total number of Connect service instances + registered in the datacenter. + +- `BillableServiceInstances` is the total number of billable service instances + registered in the datacenter. This is only relevant in Consul Enterprise + and is the total service instance count, not including any Connect service + instances or any Consul server instances. + +- `PartitionNamespaceServices` is the total number + of unique service names registered in the datacenter, by partition and + namespace. + +- `PartitionNamespaceServiceInstances` is the total + number of service instances registered in the datacenter, by partition and + namespace. + +- `PartitionNamespaceBillableServiceInstances` is + the total number of billable service instances registered in the datacenter, + by partition and namespace. + +- `PartitionNamespaceConnectServiceInstances` is + the total number of Connect service instances registered in the datacenter, + by partition and namespace. \ No newline at end of file diff --git a/website/content/commands/operator/index.mdx b/website/content/commands/operator/index.mdx index 14ba3290528..060c4225588 100644 --- a/website/content/commands/operator/index.mdx +++ b/website/content/commands/operator/index.mdx @@ -37,6 +37,7 @@ Subcommands: area Provides tools for working with network areas (Enterprise-only) autopilot Provides tools for modifying Autopilot configuration raft Provides cluster-level tools for Consul operators + usage Provides cluster-level usage information ``` For more information, examples, and usage about a subcommand, click on the name @@ -45,3 +46,4 @@ of the subcommand in the sidebar or one of the links below: - [area](/consul/commands/operator/area) - [autopilot](/consul/commands/operator/autopilot) - [raft](/consul/commands/operator/raft) +- [usage](/consul/commands/operator/usage) diff --git a/website/content/commands/operator/usage.mdx b/website/content/commands/operator/usage.mdx new file mode 100644 index 00000000000..b0d7d03db2f --- /dev/null +++ b/website/content/commands/operator/usage.mdx @@ -0,0 +1,100 @@ +--- +layout: commands +page_title: 'Commands: Operator Usage' +description: > + The operator usage command provides cluster-level tools for Consul operators + to view usage information, such as service and service instance counts. +--- + +# Consul Operator Usage + +Command: `consul operator usage` + +The Usage `operator` command provides cluster-level tools for Consul operators +to view usage information, such as service and service instance counts. + +```text +Usage: consul operator usage [options] + + # ... + +Subcommands: + instances Display service instance usage information +``` + +## instances + +Corresponding HTTP API Endpoint: [\[GET\] /v1/operator/usage](/consul/api-docs/operator/usage#operator-usage) + +This command retrieves usage information about the number of services registered in a given +datacenter. By default, the datacenter of the local agent is queried. + +The table below shows this command's [required ACLs](/consul/api-docs/api-structure#authentication). Configuration of +[blocking queries](/consul/api-docs/features/blocking) and [agent caching](/consul/api-docs/features/caching) +are not supported from commands, but may be from the corresponding HTTP endpoint. + +| ACL Required | +| --------------- | +| `operator:read` | + +Usage: `consul operator usage instances` + +The output looks like this: + +```text +$ consul operator usage instances +Billable Service Instances Total: 3 +dc1 Billable Service Instances: 3 + +Billable Services +Services Service instances +2 3 + +Connect Services +Type Service instances +connect-native 0 +connect-proxy 0 +ingress-gateway 0 +mesh-gateway 1 +terminating-gateway 0 +``` + +With the `-all-datacenters` flag: + +```text +$ consul operator usage instances -all-datacenters +Billable Service Instances Total: 4 +dc1 Billable Service Instances: 3 +dc2 Billable Service Instances: 1 + +Billable Services +Datacenter Services Service instances +dc1 2 3 +dc2 1 1 + +Total 3 4 + +Connect Services +Datacenter Type Service instances +dc1 connect-native 0 +dc1 connect-proxy 0 +dc1 ingress-gateway 0 +dc1 mesh-gateway 1 +dc1 terminating-gateway 0 +dc2 connect-native 0 +dc2 connect-proxy 0 +dc2 ingress-gateway 0 +dc2 mesh-gateway 1 +dc2 terminating-gateway 1 + +Total 3 +``` + +#### Command Options + +- `-all-datacenters` - Display service counts from all known datacenters. + Default is `false`. + +- `-billable` - Display only billable service information. Default is `false`. + +- `-connect` - Display only Connect service information. Default is `false`. diff --git a/website/data/api-docs-nav-data.json b/website/data/api-docs-nav-data.json index fb1dd87421b..66d8fa9a949 100644 --- a/website/data/api-docs-nav-data.json +++ b/website/data/api-docs-nav-data.json @@ -165,6 +165,10 @@ { "title": "Segment", "path": "operator/segment" + }, + { + "title": "Usage", + "path": "operator/usage" } ] }, diff --git a/website/data/commands-nav-data.json b/website/data/commands-nav-data.json index aac55d7952b..ee491e9dfa7 100644 --- a/website/data/commands-nav-data.json +++ b/website/data/commands-nav-data.json @@ -425,6 +425,10 @@ { "title": "raft", "path": "operator/raft" + }, + { + "title": "usage", + "path": "operator/usage" } ] }, From 98a771d1e43fae5862f95b05fd76f7352eec5849 Mon Sep 17 00:00:00 2001 From: Anita Akaeze Date: Wed, 22 Feb 2023 15:43:20 -0500 Subject: [PATCH 043/262] NET-2285: Assert total number of expected instances by Consul (#16371) --- .../l7_traffic_management/resolver_default_subset_test.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/test/integration/consul-container/test/upgrade/l7_traffic_management/resolver_default_subset_test.go b/test/integration/consul-container/test/upgrade/l7_traffic_management/resolver_default_subset_test.go index 059ea39ae88..8c84067b2c4 100644 --- a/test/integration/consul-container/test/upgrade/l7_traffic_management/resolver_default_subset_test.go +++ b/test/integration/consul-container/test/upgrade/l7_traffic_management/resolver_default_subset_test.go @@ -58,6 +58,7 @@ func TestTrafficManagement_ServiceResolverDefaultSubset(t *testing.T) { buildOpts.InjectAutoEncryption = false } cluster, _, _ := topology.NewPeeringCluster(t, 1, buildOpts) + node := cluster.Agents[0] // Register service resolver serviceResolver := &api.ServiceResolverConfigEntry{ @@ -127,6 +128,9 @@ func TestTrafficManagement_ServiceResolverDefaultSubset(t *testing.T) { libassert.AssertEnvoyPresentsCertURI(t, serverAdminPortV1, "static-server") libassert.AssertEnvoyPresentsCertURI(t, serverAdminPortV2, "static-server") + // assert static-server proxies should be healthy + libassert.AssertServiceHasHealthyInstances(t, node, libservice.StaticServerServiceName, true, 3) + // static-client upstream should connect to static-server-v2 because the default subset value is to v2 set in the service resolver libassert.AssertFortioName(t, fmt.Sprintf("http://localhost:%d", port), "static-server-v2") } From 2e6b7d7b7a786c772be10fe8596ba2fa86bf182e Mon Sep 17 00:00:00 2001 From: Curt Bushko Date: Wed, 22 Feb 2023 15:59:56 -0500 Subject: [PATCH 044/262] set BRANCH_NAME to release-1.15.x (#16374) --- .github/workflows/nightly-test-1.15.x.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/nightly-test-1.15.x.yaml b/.github/workflows/nightly-test-1.15.x.yaml index 18fe5466f00..1b8f20787f8 100644 --- a/.github/workflows/nightly-test-1.15.x.yaml +++ b/.github/workflows/nightly-test-1.15.x.yaml @@ -7,7 +7,7 @@ on: env: EMBER_PARTITION_TOTAL: 4 # Has to be changed in tandem with the matrix.partition BRANCH: "release/1.15.x" - BRANCH_NAME: "release/1.15.x" # Used for naming artifacts + BRANCH_NAME: "release-1.15.x" # Used for naming artifacts jobs: frontend-test-workspace-node: From 340b5623536c295c6afba7a8a483e9ac3f6b6501 Mon Sep 17 00:00:00 2001 From: trujillo-adam <47586768+trujillo-adam@users.noreply.github.com> Date: Wed, 22 Feb 2023 13:02:51 -0800 Subject: [PATCH 045/262] Docs/rate limiting 1.15 (#16345) * Added rate limit section to agent overview, updated headings per style guide * added GTRL section and overview * added usage docs for rate limiting 1.15 * added file for initializing rate limits * added steps for initializing rate limits * updated descriptions for rate_limits in agent conf * updated rate limiter-related metrics * tweaks to agent index * Apply suggestions from code review Co-authored-by: Dhia Ayachi Co-authored-by: Krastin Krastev * Apply suggestions from code review Co-authored-by: Krastin Krastev * Apply suggestions from code review * Apply suggestions from code review Co-authored-by: Jeff Boruszak <104028618+boruszak@users.noreply.github.com> --------- Co-authored-by: Dhia Ayachi Co-authored-by: Krastin Krastev Co-authored-by: Jeff Boruszak <104028618+boruszak@users.noreply.github.com> --- .../docs/agent/config/config-files.mdx | 16 +-- website/content/docs/agent/config/index.mdx | 2 +- website/content/docs/agent/index.mdx | 27 +++-- website/content/docs/agent/limits/index.mdx | 33 +++++ .../docs/agent/limits/init-rate-limits.mdx | 32 +++++ .../limits/set-global-traffic-rate-limits.mdx | 114 ++++++++++++++++++ website/content/docs/agent/telemetry.mdx | 4 +- website/data/docs-nav-data.json | 17 +++ 8 files changed, 222 insertions(+), 23 deletions(-) create mode 100644 website/content/docs/agent/limits/index.mdx create mode 100644 website/content/docs/agent/limits/init-rate-limits.mdx create mode 100644 website/content/docs/agent/limits/set-global-traffic-rate-limits.mdx diff --git a/website/content/docs/agent/config/config-files.mdx b/website/content/docs/agent/config/config-files.mdx index 82053a93567..92047ce897e 100644 --- a/website/content/docs/agent/config/config-files.mdx +++ b/website/content/docs/agent/config/config-files.mdx @@ -534,17 +534,17 @@ Valid time units are 'ns', 'us' (or 'µs'), 'ms', 's', 'm', 'h'." - `license_path` This specifies the path to a file that contains the Consul Enterprise license. Alternatively the license may also be specified in either the `CONSUL_LICENSE` or `CONSUL_LICENSE_PATH` environment variables. See the [licensing documentation](/consul/docs/enterprise/license/overview) for more information about Consul Enterprise license management. Added in versions 1.10.0, 1.9.7 and 1.8.13. Prior to version 1.10.0 the value may be set for all agents to facilitate forwards compatibility with 1.10 but will only actually be used by client agents. -- `limits` Available in Consul 0.9.3 and later, this is a nested - object that configures limits that are enforced by the agent. Prior to Consul 1.5.2, - this only applied to agents in client mode, not Consul servers. The following parameters - are available: +- `limits`: This block specifies various types of limits that the Consul server agent enforces. - `http_max_conns_per_client` - Configures a limit of how many concurrent TCP connections a single client IP address is allowed to open to the agent's HTTP(S) server. This affects the HTTP(S) servers in both client and server agents. Default value is `200`. - `https_handshake_timeout` - Configures the limit for how long the HTTPS server in both client and server agents will wait for a client to complete a TLS handshake. This should be kept conservative as it limits how many connections an unauthenticated attacker can open if `verify_incoming` is being using to authenticate clients (strongly recommended in production). Default value is `5s`. - - `request_limits` - This object povides configuration for rate limiting RPC and gRPC requests on the consul server. As a result of rate limiting gRPC and RPC request, HTTP requests to the Consul server are rate limited. - - `mode` - Configures whether rate limiting is enabled or not as well as how it behaves through the use of 3 possible modes. The default value of "disabled" will prevent any rate limiting from occuring. A value of "permissive" will cause the system to track requests against the `read_rate` and `write_rate` but will only log violations and will not block and will allow the request to continue processing. A value of "enforcing" also tracks requests against the `read_rate` and `write_rate` but in addition to logging violations, the system will block the request from processings by returning an error. - - `read_rate` - Configures how frequently RPC, gRPC, and HTTP queries are allowed to happen. The rate limiter limits the rate to tokens per second equal to this value. See https://en.wikipedia.org/wiki/Token_bucket for more about token buckets. - - `write_rate` - Configures how frequently RPC, gRPC, and HTTP write are allowed to happen. The rate limiter limits the rate to tokens per second equal to this value. See https://en.wikipedia.org/wiki/Token_bucket for more about token buckets. + - `request_limits` - This object specifies configurations that limit the rate of RPC and gRPC requests on the Consul server. Limiting the rate of gRPC and RPC requests also limits HTTP requests to the Consul server. + - `mode` - String value that specifies an action to take if the rate of requests exceeds the limit. You can specify the following values: + - `permissive`: The server continues to allow requests and records an error in the logs. + - `enforcing`: The server stops accepting requests and records an error in the logs. + - `disabled`: Limits are not enforced or tracked. This is the default value for `mode`. + - `read_rate` - Integer value that specifies the number of read requests per second. Default is `100`. + - `write_rate` - Integer value that specifies the number of write requests per second. Default is `100`. - `rpc_handshake_timeout` - Configures the limit for how long servers will wait after a client TCP connection is established before they complete the connection handshake. When TLS is used, the same timeout applies to the TLS handshake separately from the initial protocol negotiation. All Consul clients should perform this immediately on establishing a new connection. This should be kept conservative as it limits how many connections an unauthenticated attacker can open if `verify_incoming` is being using to authenticate clients (strongly recommended in production). When `verify_incoming` is true on servers, this limits how long the connection socket and associated goroutines will be held open before the client successfully authenticates. Default value is `5s`. - `rpc_client_timeout` - Configures the limit for how long a client is allowed to read from an RPC connection. This is used to set an upper bound for calls to eventually terminate so that RPC connections are not held indefinitely. Blocking queries can override this timeout. Default is `60s`. - `rpc_max_conns_per_client` - Configures a limit of how many concurrent TCP connections a single source IP address is allowed to open to a single server. It affects both clients connections and other server connections. In general Consul clients multiplex many RPC calls over a single TCP connection so this can typically be kept low. It needs to be more than one though since servers open at least one additional connection for raft RPC, possibly more for WAN federation when using network areas, and snapshot requests from clients run over a separate TCP conn. A reasonably low limit significantly reduces the ability of an unauthenticated attacker to consume unbounded resources by holding open many connections. You may need to increase this if WAN federated servers connect via proxies or NAT gateways or similar causing many legitimate connections from a single source IP. Default value is `100` which is designed to be extremely conservative to limit issues with certain deployment patterns. Most deployments can probably reduce this safely. 100 connections on modern server hardware should not cause a significant impact on resource usage from an unauthenticated attacker though. diff --git a/website/content/docs/agent/config/index.mdx b/website/content/docs/agent/config/index.mdx index b2e3ac42c83..0ea4a030fb7 100644 --- a/website/content/docs/agent/config/index.mdx +++ b/website/content/docs/agent/config/index.mdx @@ -72,7 +72,7 @@ The following agent configuration options are reloadable at runtime: - These can be important in certain outage situations so being able to control them without a restart provides a recovery path that doesn't involve downtime. They generally shouldn't be changed otherwise. -- [RPC rate limiting](/consul/docs/agent/config/config-files#limits) +- [RPC rate limits](/consul/docs/agent/config/config-files#limits) - [HTTP Maximum Connections per Client](/consul/docs/agent/config/config-files#http_max_conns_per_client) - Services - TLS Configuration diff --git a/website/content/docs/agent/index.mdx b/website/content/docs/agent/index.mdx index bab9138e50d..3ad41480035 100644 --- a/website/content/docs/agent/index.mdx +++ b/website/content/docs/agent/index.mdx @@ -33,7 +33,7 @@ The following process describes the agent lifecycle within the context of an exi As a result, all nodes will eventually become aware of each other. 1. **Existing servers will begin replicating to the new node** if the agent is a server. -### Failures and Crashes +### Failures and crashes In the event of a network failure, some nodes may be unable to reach other nodes. Unreachable nodes will be marked as _failed_. @@ -48,7 +48,7 @@ catalog. Once the network recovers or a crashed agent restarts, the cluster will repair itself and unmark a node as failed. The health check in the catalog will also be updated to reflect the current state. -### Exiting Nodes +### Exiting nodes When a node leaves a cluster, it communicates its intent and the cluster marks the node as having _left_. In contrast to changes related to failures, all of the services provided by a node are immediately deregistered. @@ -61,6 +61,9 @@ interval of 72 hours (changing the reap interval is _not_ recommended due to its consequences during outage situations). Reaping is similar to leaving, causing all associated services to be deregistered. +## Limit traffic rates +You can define a set of rate limiting configurations that help operators protect Consul servers from excessive or peak usage. The configurations enable you to gracefully degrade Consul servers to avoid a global interruption of service. Consul supports global server rate limiting, which lets configure Consul servers to deny requests that exceed the read or write limits. Refer to [Traffic Rate Limits Overview](/consul/docs/agent/limits/limit-traffic-rates). + ## Requirements You should run one Consul agent per server or host. @@ -73,7 +76,7 @@ Refer to the following sections for information about host, port, memory, and ot The [Datacenter Deploy tutorial](/consul/tutorials/production-deploy/reference-architecture#deployment-system-requirements) contains additional information, including licensing configuration, environment variables, and other details. -### Maximum Latency Network requirements +### Maximum latency network requirements Consul uses the gossip protocol to share information across agents. To function properly, you cannot exceed the protocol's maximum latency threshold. The latency threshold is calculated according to the total round trip time (RTT) for communication between all agents. Other network usages outside of Gossip are not bound by these latency requirements (i.e. client to server RPCs, HTTP API requests, xDS proxy configuration, DNS). @@ -82,7 +85,7 @@ For data sent between all Consul agents the following latency requirements must - Average RTT for all traffic cannot exceed 50ms. - RTT for 99 percent of traffic cannot exceed 100ms. -## Starting the Consul Agent +## Starting the Consul agent Start a Consul agent with the `consul` command and `agent` subcommand using the following syntax: @@ -111,7 +114,7 @@ $ consul agent -data-dir=tmp/consul -dev Agents are highly configurable, which enables you to deploy Consul to any infrastructure. Many of the default options for the `agent` command are suitable for becoming familiar with a local instance of Consul. In practice, however, several additional configuration options must be specified for Consul to function as expected. Refer to [Agent Configuration](/consul/docs/agent/config) topic for a complete list of configuration options. -### Understanding the Agent Startup Output +### Understanding the agent startup output Consul prints several important messages on startup. The following example shows output from the [`consul agent`](/consul/commands/agent) command: @@ -162,7 +165,7 @@ When running under `systemd` on Linux, Consul notifies systemd by sending this either the `join` or `retry_join` option has to be set and the service definition file has to have `Type=notify` set. -## Configuring Consul Agents +## Configuring Consul agents You can specify many options to configure how Consul operates when issuing the `consul agent` command. You can also create one or more configuration files and provide them to Consul at startup using either the `-config-file` or `-config-dir` option. @@ -180,7 +183,7 @@ $ consul agent -config-file=server.json The configuration options necessary to successfully use Consul depend on several factors, including the type of agent you are configuring (client or server), the type of environment you are deploying to (e.g., on-premise, multi-cloud, etc.), and the security options you want to implement (ACLs, gRPC encryption). The following examples are intended to help you understand some of the combinations you can implement to configure Consul. -### Common Configuration Settings +### Common configuration settings The following settings are commonly used in the configuration file (also called a service definition file when registering services with Consul) to configure Consul agents: @@ -195,7 +198,7 @@ The following settings are commonly used in the configuration file (also called | `addresses` | Block of nested objects that define addresses bound to the agent for internal cluster communication. | `"http": "0.0.0.0"` See the Agent Configuration page for [default address values](/consul/docs/agent/config/config-files#addresses) | | `ports` | Block of nested objects that define ports bound to agent addresses.
See (link to addresses option) for details. | See the Agent Configuration page for [default port values](/consul/docs/agent/config/config-files#ports) | -### Server Node in a Service Mesh +### Server node in a service mesh The following example configuration is for a server agent named "`consul-server`". The server is [bootstrapped](/consul/docs/agent/config/cli-flags#_bootstrap) and the Consul GUI is enabled. The reason this server agent is configured for a service mesh is that the `connect` configuration is enabled. Connect is Consul's service mesh component that provides service-to-service connection authorization and encryption using mutual Transport Layer Security (TLS). Applications can use sidecar proxies in a service mesh configuration to establish TLS connections for inbound and outbound connections without being aware of Connect at all. See [Connect](/consul/docs/connect) for details. @@ -243,7 +246,7 @@ connect { -### Server Node with Encryption Enabled +### Server node with encryption enabled The following example shows a server node configured with encryption enabled. Refer to the [Security](/consul/docs/security) chapter for additional information about how to configure security options for Consul. @@ -313,7 +316,7 @@ tls { -### Client Node Registering a Service +### Client node registering a service Using Consul as a central service registry is a common use case. The following example configuration includes common settings to register a service with a Consul agent and enable health checks (see [Checks](/consul/docs/discovery/checks) to learn more about health checks): @@ -371,7 +374,7 @@ service { -## Client Node with Multiple Interfaces or IP addresses +## Client node with multiple interfaces or IP addresses The following example shows how to configure Consul to listen on multiple interfaces or IP addresses using a [go-sockaddr template]. @@ -422,7 +425,7 @@ advertise_addr = "{{ GetInterfaceIP \"en0\" }}" -## Stopping an Agent +## Stopping an agent An agent can be stopped in two ways: gracefully or forcefully. Servers and Clients both behave differently depending on the leave that is performed. There diff --git a/website/content/docs/agent/limits/index.mdx b/website/content/docs/agent/limits/index.mdx new file mode 100644 index 00000000000..ffa259cfd67 --- /dev/null +++ b/website/content/docs/agent/limits/index.mdx @@ -0,0 +1,33 @@ +--- +layout: docs +page_title: Limit Traffic Rates Overview +description: Rate limiting is a set of Consul server agent configurations that you can use to mitigate the risks to Consul servers when clients send excessive requests to Consul resources. + +--- + +# Traffic rate limiting overview + +This topic provides an overview of the rates limits you can configure for Consul servers. + +## Introduction +You can configure global RPC rate limits to mitigate the risks to Consul servers when clients send excessive read or write requests to Consul resources. A _read request_ is defined as any request that does not modify Consul internal state. A _write request_ is defined as any request that modifies Consul internal state. Rate limits for read and write requests are configured separately. + +## Rate limit modes + +You can set one of the following modes to determine how Consul servers react when exceeding request limits. + +- **Enforcing mode**: The rate limiter denies requests to a server once they exceed the configured rate. In this mode, Consul generates metrics and logs to help you understand your network's load and configure limits accordingly. +- **Permissive mode**: The rate limiter allows requests to a server once they exceed the configured rate. In this mode, Consul generates metrics and logs to help you understand your Consul load and configure limits accordingly. Use this mode to help you debug specific issues as you configure limits. +- **Disabled mode**: Disables the rate limiter. This mode allows all requests Consul does not generate logs or metrics. This is the default mode. + +Refer to [`rate_limits`](/consul/docs/agent/config/config-files#request_limits) for additional configuration information. + +## Request denials + +When an HTTP request is denied for rate limiting reason, Consul returns one of the following errors: + +- **429 Resource Exhausted**: Indicates that a server is not able to perform the request but that another server could potentially fulfill it. This error is most common on stale reads because any server may fulfill stale read requests. To resolve this type of error, we recommend immediately retrying the request to another server. If the request came from a Consul client agent, the agent automatically retries the request up to the limit set in the [`rpc_hold_timeout`](/consul/docs/agent/config/config-files#rpc_hold_timeout) configuration . + +- **503 Service Unavailable**: Indicates that server is unable to perform the request and that no other server can fulfill the request, either. This usually occurs on consistent reads or for writes. In this case we recommend retrying according to an exponential backoff schedule. If the request came from a Consul client agent, the agent automatically retries the request according to the [`rpc_hold_timeout`](/consul/docs/agent/config/config-files#rpc_hold_timeout) configuration. + +Refer to [Rate limit reached on the server](/consul/docs/troubleshoot/common-errors#rate-limit-reached-on-the-server) for additional information. \ No newline at end of file diff --git a/website/content/docs/agent/limits/init-rate-limits.mdx b/website/content/docs/agent/limits/init-rate-limits.mdx new file mode 100644 index 00000000000..35708571433 --- /dev/null +++ b/website/content/docs/agent/limits/init-rate-limits.mdx @@ -0,0 +1,32 @@ +--- +layout: docs +page_title: Initialize Rate Limit Settings +description: Learn how to determine regular and peak loads in your network so that you can set the initial global rate limit configurations. +--- + +# Initialize rate limit settings + +Because each network has different needs and application, you need to find out what the regular and peak loads in your network are before you set traffic limits. We recommend completing the following steps to benchmark request rates in your environment so that you can implement limits appropriate for your applications. + +1. In the agent configuration file, specify a global rate limit with arbitrary values based on the following conditions: + + - Environment where Consul servers are running + - Number of servers and the projected load + - Existing metrics expressing requests per second + +1. Set the `mode` to `permissive`. In the following example, the configuration allows up to 1000 reads and 500 writes per second for each Consul agent: + + ```hcl + request_limits { + mode = "permissive" + read_rate = 1000.0 + write_rate = 500.0 + } + ``` + +1. Observe the logs and metrics for your application's typical cycle, such as a 24 hour period. Refer to [`log_file`](/consul/docs/agent/config/config-files#log_file) for information about where to retrieve logs. Call the [`/agent/metrics`](/consul/api-docs/agent#view-metrics) HTTP API endpoint and check the data for the following metrics: + + - `rpc.rate_limit.exceeded.read` + - `rpc.rate_limit.exceeded.write` + +1. If the limits are not reached, set the `mode` configuration to `enforcing`. Otherwise, continue to adjust and iterate until you find your network's unique limits. \ No newline at end of file diff --git a/website/content/docs/agent/limits/set-global-traffic-rate-limits.mdx b/website/content/docs/agent/limits/set-global-traffic-rate-limits.mdx new file mode 100644 index 00000000000..466e0a25b01 --- /dev/null +++ b/website/content/docs/agent/limits/set-global-traffic-rate-limits.mdx @@ -0,0 +1,114 @@ +--- +layout: docs +page_title: Set a Global Limit on Traffic Rates +description: Use global rate limits to prevent excessive rates of requests to Consul servers. +--- + +# Set a global limit on traffic rates + +This topic describes how to configure rate limits for RPC and gRPC traffic to the Consul server. + +## Introduction + +Rate limits apply to each Consul server separately and limit the number of read requests or write requests to the server on the RPC and internal gRPC endpoints. + +Because all requests coming to a Consul server eventually perform an RPC or an internal gRPC request, global rate limits apply to Consul's user interfaces, such as the HTTP API interface, the CLI, and the external gRPC endpoint for services in the service mesh. + +Refer to [Initialize Rate Limit Settings]() for additional information about right-sizing your gRPC request configurations. + +## Set a global rate limit for a Consul server + +Configure the following settings in your Consul server configuration to limit the RPC and gRPC traffic rates. + +- Set the rate limiter [`mode`](/consul/docs/agent/config/config-files#mode-1) +- Set the [`read_rate`](/consul/docs/agent/config/config-files#read_rate) +- Set the [`write_rate`](/consul/docs/agent/config/config-files#write_rate) + +In the following example, the Consul server is configured to prevent more than `500` read and `200` write RPC calls: + + + +```hcl +limits = { + rate_limit = { + mode = "enforcing" + read_rate = 500 + write_rate = 200 + } +} +``` + +```json +{ + "limits" : { + "rate_limit" : { + "mode" : "enforcing", + "read_rate" : 500, + "write_rate" : 200 + } + } +} + +``` + + + +## Access rate limit logs + +Consul prints a log line for each rate limit request. The log includes information to identify the source of the request and the server's configured limit. Consul prints to `DEBUG` log level, and can be configured to drop log lines to avoid affecting the server health. Dropping a log line increments the `rpc.rate_limit.log_dropped` metric. + +The following example log shows that RPC request from `127.0.0.1:53562` to `KVS.Apply` exceeded the rate limit: + + + +```shell-session +2023-02-17T10:01:15.565-0500 [DEBUG] agent.server.rpc-rate-limit: RPC +exceeded allowed rate limit: rpc=KVS.Apply source_addr=127.0.0.1:53562 +limit_type=global/write limit_enforced=false +``` + + +## Review rate limit metrics + +Consul captures the following metrics associated with rate limits: + +- Type of limit +- Operation +- Rate limit mode + +Call the `agent/metrics` API endpoint to view the metrics associated with rate limits. Refer to [View Metrics](/consul/api-docs/agent#view-metrics) for API usage information. + +In the following example, Consul dropped a call to the `consul` service because it exceeded the limit by one call: + +```shell-session +$ curl http://127.0.0.1:8500/v1/agent/metrics +{ + . . . + "Counters": [ + { + "Name": "consul.rpc.rate_limit.exceeded", + "Count": 1, + "Sum": 1, + "Min": 1, + "Max": 1, + "Mean": 1, + "Stddev": 0, + "Labels": { + "service": "consul" + } + }, + { + "Name": "consul.rpc.rate_limit.log_dropped", + "Count": 1, + "Sum": 1, + "Min": 1, + "Max": 1, + "Mean": 1, + "Stddev": 0, + "Labels": {} + } + ], + . . . +``` + +Refer to [Telemetry](/consul/docs/agent/telemetry) for additional information. diff --git a/website/content/docs/agent/telemetry.mdx b/website/content/docs/agent/telemetry.mdx index 53d7ed91766..194f0d86d3b 100644 --- a/website/content/docs/agent/telemetry.mdx +++ b/website/content/docs/agent/telemetry.mdx @@ -477,8 +477,8 @@ These metrics are used to monitor the health of the Consul servers. | `consul.raft.transition.heartbeat_timeout` | The number of times an agent has transitioned to the Candidate state, after receive no heartbeat messages from the last known leader. | timeouts / interval | counter | | `consul.raft.verify_leader` | This metric doesn't have a direct correlation to the leader change. It just counts the number of times an agent checks if it is still the leader or not. For example, during every consistent read, the check is done. Depending on the load in the system, this metric count can be high as it is incremented each time a consistent read is completed. | checks / interval | Counter | | `consul.rpc.accept_conn` | Increments when a server accepts an RPC connection. | connections | counter | -| `consul.rpc.rate_limit.exceeded` | Increments whenever an RPC is over a configured rate limit. In permissive mode, the RPC is still allowed to proceed. | RPCs | counter | -| `consul.rpc.rate_limit.log_dropped` | Increments whenever a log that is emitted because an RPC exceeded a rate limit gets dropped because the output buffer is full. | log messages dropped | counter | +| `consul.rpc.rate_limit.exceeded` | Number of rate limited requests. Only increments when `rate_limits.mode` is set to `permissive` or `enforcing`. | requests | counter | +| `consul.rpc.rate_limit.log_dropped` | Number of logs for rate limited requests dropped for performance reasons. Only increments when `rate_limits.mode` is set to `permissive` or `enforcing` and the log is unable to print the number of excessive requests. | log lines | counter | | `consul.catalog.register` | Measures the time it takes to complete a catalog register operation. | ms | timer | | `consul.catalog.deregister` | Measures the time it takes to complete a catalog deregister operation. | ms | timer | | `consul.server.isLeader` | Track if a server is a leader(1) or not(0) | 1 or 0 | gauge | diff --git a/website/data/docs-nav-data.json b/website/data/docs-nav-data.json index 7d39c943400..a15b5169ac2 100644 --- a/website/data/docs-nav-data.json +++ b/website/data/docs-nav-data.json @@ -734,6 +734,23 @@ } ] }, + { + "title": "Limit Traffic Rates", + "routes": [ + { + "title": "Overview", + "path": "agent/limits" + }, + { + "title": "Initialize Rate Limit Settings", + "path": "agent/limits/init-rate-limits" + }, + { + "title": "Set Global Traffic Rate Limits", + "path": "agent/limits/set-global-traffic-rate-limits" + } + ] + }, { "title": "Configuration Entries", "path": "agent/config-entries" From 0c66bbf2b4e6c8729e3cf99c3d5fa8feb36b715a Mon Sep 17 00:00:00 2001 From: Valeriia Ruban Date: Wed, 22 Feb 2023 13:05:15 -0800 Subject: [PATCH 046/262] [UI] CC-4031: change from Action, a and button to hds::Button (#16251) --- .changelog/16251.txt | 3 + .../consul/token/selector/index.hbs | 18 +- .../consul/lock-session/form/index.hbs | 47 +++-- .../consul/lock-session/list/index.hbs | 34 ++-- .../app/templates/dc/nodes/show/sessions.hbs | 28 +-- .../components/consul/nspace/form/index.hbs | 39 ++-- .../app/templates/dc/nspaces/index.hbs | 26 ++- .../consul/partition/form/index.hbs | 43 ++-- .../app/templates/dc/partitions/index.hbs | 12 +- .../consul/peer/address/list/index.hbs | 2 +- .../consul/peer/address/list/index.scss | 3 + .../consul/peer/bento-box/index.hbs | 2 +- .../peer/form/generate/actions/index.hbs | 13 +- .../components/consul/peer/form/index.scss | 9 - .../peer/form/initiate/actions/index.hbs | 9 +- .../consul/peer/form/token/actions/index.hbs | 28 +-- .../peer/form/token/fieldsets/index.hbs | 12 +- .../app/components/consul/peer/index.scss | 1 + .../app/templates/dc/peers/index.hbs | 43 ++-- .../app/templates/dc/peers/show/addresses.hbs | 34 ++-- .../app/templates/dc/peers/show/exported.hbs | 34 ++-- .../app/templates/dc/peers/show/imported.hbs | 35 ++-- .../app/components/app-view/index.scss | 3 +- .../app/components/auth-form/index.hbs | 8 +- .../app/components/buttons/index.scss | 17 -- .../app/components/buttons/skin.scss | 15 -- .../confirmation-dialog/layout.scss | 3 +- .../components/consul/acl/disabled/index.hbs | 20 +- .../consul/intention/form/fieldsets/index.hbs | 61 +++--- .../consul/intention/form/index.hbs | 78 +++---- .../notice/custom-resource/index.hbs | 8 +- .../intention/notice/permissions/index.hbs | 10 +- .../intention/permission/form/index.hbs | 31 ++- .../app/components/consul/kv/form/index.hbs | 75 ++++--- .../consul/node/agentless-notice/index.hbs | 25 +-- .../components/delete-confirmation/index.hbs | 17 +- .../app/components/empty-state/README.mdx | 32 +-- .../app/components/empty-state/index.hbs | 11 +- .../app/components/empty-state/index.scss | 3 - .../app/components/error-state/index.hbs | 54 ++--- .../app/components/form-elements/index.scss | 12 +- .../app/components/modal-dialog/index.hbs | 12 +- .../app/components/modal-dialog/layout.scss | 2 - .../app/components/modal-dialog/skin.scss | 16 +- .../app/components/oidc-select/index.hbs | 20 +- .../app/components/oidc-select/index.scss | 4 +- .../app/components/policy-selector/index.hbs | 67 ++++-- .../app/components/role-selector/index.hbs | 76 ++++--- .../app/components/role-selector/index.js | 6 + .../app/mixins/with-blocking-actions.js | 8 +- ui/packages/consul-ui/app/styles/app.scss | 6 +- .../app/styles/base/reset/system.scss | 19 +- .../app/styles/routes/dc/acls/index.scss | 3 - .../styles/routes/dc/overview/license.scss | 8 - .../routes/dc/overview/serverstatus.scss | 19 +- .../consul-ui/app/styles/typography.scss | 1 - .../templates/dc/acls/auth-methods/index.hbs | 20 +- .../app/templates/dc/acls/policies/-form.hbs | 89 +++++--- .../app/templates/dc/acls/policies/index.hbs | 26 ++- .../app/templates/dc/acls/roles/-form.hbs | 154 ++++++++------ .../app/templates/dc/acls/roles/index.hbs | 26 ++- .../app/templates/dc/acls/tokens/-form.hbs | 71 ++++--- .../app/templates/dc/acls/tokens/edit.hbs | 31 ++- .../app/templates/dc/acls/tokens/index.hbs | 6 +- .../app/templates/dc/intentions/index.hbs | 26 ++- .../consul-ui/app/templates/dc/kv/index.hbs | 33 ++- .../app/templates/dc/nodes/index.hbs | 34 ++-- .../app/templates/dc/services/index.hbs | 26 +-- .../dc/services/instance/upstreams.hbs | 12 +- .../dc/services/show/intentions/index.hbs | 26 ++- .../app/templates/dc/show/license.hbs | 22 +- .../app/templates/dc/show/serverstatus.hbs | 9 +- ui/packages/consul-ui/package.json | 4 +- .../acceptance/dc/intentions/delete.feature | 2 +- .../tests/acceptance/dc/kvs/delete.feature | 2 +- .../dc/services/show/intentions/index.feature | 2 +- .../components/delete-confirmation-test.js | 4 +- .../tests/lib/page-object/createDeletable.js | 3 +- .../consul-ui/tests/pages/dc/acls/edit.js | 2 +- .../tests/pages/dc/acls/tokens/edit.js | 2 +- .../consul-ui/translations/routes/en-us.yaml | 40 ++-- ui/yarn.lock | 190 ++++++++++++++---- 82 files changed, 1268 insertions(+), 819 deletions(-) create mode 100644 .changelog/16251.txt create mode 100644 ui/packages/consul-peerings/app/components/consul/peer/address/list/index.scss diff --git a/.changelog/16251.txt b/.changelog/16251.txt new file mode 100644 index 00000000000..7aaf58011e0 --- /dev/null +++ b/.changelog/16251.txt @@ -0,0 +1,3 @@ +```release-note:improvement +ui: update from + />

Permissions

{{#if (gt item.Permissions.length 0) }} @@ -217,11 +218,23 @@

-
  • +
  • -
  • +
  • @@ -249,22 +262,20 @@ - - + + + + diff --git a/ui/packages/consul-ui/app/components/consul/intention/form/index.hbs b/ui/packages/consul-ui/app/components/consul/intention/form/index.hbs index e58b1ffb3f4..9334293a5c0 100644 --- a/ui/packages/consul-ui/app/components/consul/intention/form/index.hbs +++ b/ui/packages/consul-ui/app/components/consul/intention/form/index.hbs @@ -80,22 +80,20 @@ as |item readonly|}}

    - - + + + + {{/let}} @@ -174,32 +172,30 @@ as |item readonly|}} @onchange={{api.change}} />
    - - + + + {{#if (not api.isCreate)}} {{#if (not-eq item.ID 'anonymous') }} - + data-test-delete + /> {{/if}} {{/if}} +
    {{else}} @@ -231,9 +228,12 @@ as |item readonly|}}

    -

    - Learn more about CRDs -

    +
    {{/if}} diff --git a/ui/packages/consul-ui/app/components/consul/intention/notice/custom-resource/index.hbs b/ui/packages/consul-ui/app/components/consul/intention/notice/custom-resource/index.hbs index 0b629d4f58a..8fe86558697 100644 --- a/ui/packages/consul-ui/app/components/consul/intention/notice/custom-resource/index.hbs +++ b/ui/packages/consul-ui/app/components/consul/intention/notice/custom-resource/index.hbs @@ -15,7 +15,13 @@ as |notice|>

    - Learn more about CRDs +

    \ No newline at end of file diff --git a/ui/packages/consul-ui/app/components/consul/intention/notice/permissions/index.hbs b/ui/packages/consul-ui/app/components/consul/intention/notice/permissions/index.hbs index 9e42632ba73..33d8233bfe0 100644 --- a/ui/packages/consul-ui/app/components/consul/intention/notice/permissions/index.hbs +++ b/ui/packages/consul-ui/app/components/consul/intention/notice/permissions/index.hbs @@ -8,9 +8,13 @@ as |notice|>

    - - {{t "components.consul.intention.notice.permissions.footer"}} - +

    diff --git a/ui/packages/consul-ui/app/components/consul/intention/permission/form/index.hbs b/ui/packages/consul-ui/app/components/consul/intention/permission/form/index.hbs index f2b09732a29..91cbbbc5657 100644 --- a/ui/packages/consul-ui/app/components/consul/intention/permission/form/index.hbs +++ b/ui/packages/consul-ui/app/components/consul/intention/permission/form/index.hbs @@ -134,23 +134,20 @@ as |group|> - - - + + + + \ No newline at end of file diff --git a/ui/packages/consul-ui/app/components/consul/kv/form/index.hbs b/ui/packages/consul-ui/app/components/consul/kv/form/index.hbs index 8ca9d738a50..08ed3391235 100644 --- a/ui/packages/consul-ui/app/components/consul/kv/form/index.hbs +++ b/ui/packages/consul-ui/app/components/consul/kv/form/index.hbs @@ -60,29 +60,58 @@ {{/if}} - - {{#if api.isCreate}} -{{#if (not disabld)}} - -{{/if}} - - {{else}} -{{#if (not disabld)}} - -{{/if}} - -{{#if (not disabld)}} - - - - - - - - - {{/if}} -{{/if}} - + + + {{#if api.isCreate}} + {{#if (not disabld)}} + + {{/if}} + + + {{else}} + {{#if (not disabld)}} + + {{/if}} + + {{#if (not disabld)}} + + + + + + + + + {{/if}} + {{/if}} + + {{/let}} diff --git a/ui/packages/consul-ui/app/components/consul/node/agentless-notice/index.hbs b/ui/packages/consul-ui/app/components/consul/node/agentless-notice/index.hbs index 6ee6a31777c..069dff276a4 100644 --- a/ui/packages/consul-ui/app/components/consul/node/agentless-notice/index.hbs +++ b/ui/packages/consul-ui/app/components/consul/node/agentless-notice/index.hbs @@ -4,9 +4,13 @@

    {{t 'routes.dc.nodes.index.agentless.notice.header'}}

    - +

    @@ -14,15 +18,12 @@

    - + {{/if}} diff --git a/ui/packages/consul-ui/app/components/delete-confirmation/index.hbs b/ui/packages/consul-ui/app/components/delete-confirmation/index.hbs index df07485948b..35b2de1719c 100644 --- a/ui/packages/consul-ui/app/components/delete-confirmation/index.hbs +++ b/ui/packages/consul-ui/app/components/delete-confirmation/index.hbs @@ -1,7 +1,16 @@

    {{message}}

    - - + + + + \ No newline at end of file diff --git a/ui/packages/consul-ui/app/components/empty-state/README.mdx b/ui/packages/consul-ui/app/components/empty-state/README.mdx index 2e3d9e466dc..ac684fdf999 100644 --- a/ui/packages/consul-ui/app/components/empty-state/README.mdx +++ b/ui/packages/consul-ui/app/components/empty-state/README.mdx @@ -44,23 +44,23 @@ function.

    -
  • +
  • -
  • +
  • diff --git a/ui/packages/consul-ui/app/components/empty-state/index.hbs b/ui/packages/consul-ui/app/components/empty-state/index.hbs index fcbeeaa4f10..781f516eb0a 100644 --- a/ui/packages/consul-ui/app/components/empty-state/index.hbs +++ b/ui/packages/consul-ui/app/components/empty-state/index.hbs @@ -17,7 +17,9 @@
    {{yield}} {{#if login}} - @@ -25,12 +27,7 @@ @src={{uri 'settings://consul:token'}} @onchange={{action (mut token) value="data"}} /> - {{#if token.AccessorID}} - Log in with a different token - {{else}} - Log in - {{/if}} - + {{/if}}
    {{/yield-slot}} diff --git a/ui/packages/consul-ui/app/components/empty-state/index.scss b/ui/packages/consul-ui/app/components/empty-state/index.scss index 72b821403cf..7322580d694 100644 --- a/ui/packages/consul-ui/app/components/empty-state/index.scss +++ b/ui/packages/consul-ui/app/components/empty-state/index.scss @@ -16,6 +16,3 @@ %empty-state > ul > li > label > button { @extend %empty-state-anchor; } -%empty-state div > button { - @extend %primary-button; -} diff --git a/ui/packages/consul-ui/app/components/error-state/index.hbs b/ui/packages/consul-ui/app/components/error-state/index.hbs index d05bb30b6fb..0496c67403b 100644 --- a/ui/packages/consul-ui/app/components/error-state/index.hbs +++ b/ui/packages/consul-ui/app/components/error-state/index.hbs @@ -27,21 +27,25 @@

    - - @@ -68,21 +72,23 @@

    - - diff --git a/ui/packages/consul-ui/app/components/form-elements/index.scss b/ui/packages/consul-ui/app/components/form-elements/index.scss index 3ace8435f55..a1bf39ab08d 100644 --- a/ui/packages/consul-ui/app/components/form-elements/index.scss +++ b/ui/packages/consul-ui/app/components/form-elements/index.scss @@ -1,6 +1,7 @@ @import './skin'; @import './layout'; -%form h2 { +%form h2, +.modal-dialog-body h2 { @extend %h200; } /* TODO: This is positioning the element */ @@ -41,9 +42,7 @@ label span { @extend %form-element-error; } // TODO: float right here is too specific, this is currently used just for the role/policy selectors -label.type-dialog { - @extend %anchor; - cursor: pointer; +.type-dialog { float: right; } .type-toggle { @@ -69,6 +68,11 @@ span.label { %main-content .type-text { @extend %form-element; } +%main-content .type-select > span, +%main-content .type-password > span, +%main-content label.type-text > span { + line-height: 2.2em; +} %app-view-content form:not(.filter-bar) [role='radiogroup'], %modal-window [role='radiogroup'] { @extend %radio-group; diff --git a/ui/packages/consul-ui/app/components/modal-dialog/index.hbs b/ui/packages/consul-ui/app/components/modal-dialog/index.hbs index 6cb2f944f9e..b7205ad680c 100644 --- a/ui/packages/consul-ui/app/components/modal-dialog/index.hbs +++ b/ui/packages/consul-ui/app/components/modal-dialog/index.hbs @@ -20,12 +20,14 @@ role="document" > - {{compute (fn route.t 'documentation.body' - (hash - htmlSafe=true - ) - )}} +
    + + + +
    diff --git a/ui/packages/consul-ui/app/templates/dc/show/serverstatus.hbs b/ui/packages/consul-ui/app/templates/dc/show/serverstatus.hbs index dd2472ec80d..6e8adf89986 100644 --- a/ui/packages/consul-ui/app/templates/dc/show/serverstatus.hbs +++ b/ui/packages/consul-ui/app/templates/dc/show/serverstatus.hbs @@ -87,12 +87,15 @@ as |item|}} >
    - {{compute (fn route.t 'tolerance.link' (hash - htmlSafe=true - ))}}

    {{compute (fn route.t 'tolerance.header')}}

    +
    div'), ...deletable({}, 'main form > div'), use: clickable('[data-test-use]'), - confirmUse: clickable('button.type-delete'), + confirmUse: clickable('[data-test-confirm-use]'), clone: clickable('[data-test-clone]'), policies: policySelector(), roles: roleSelector(), diff --git a/ui/packages/consul-ui/translations/routes/en-us.yaml b/ui/packages/consul-ui/translations/routes/en-us.yaml index f9cd5ad10df..33d618ac4ab 100644 --- a/ui/packages/consul-ui/translations/routes/en-us.yaml +++ b/ui/packages/consul-ui/translations/routes/en-us.yaml @@ -5,8 +5,8 @@ dc: title: Server status unassigned: Unassigned Zones tolerance: - link: | - Learn how to improve fault tolerance + link-text: Learn how to improve fault tolerance + link: /architecture/improving-consul-resilience#strategies-to-increase-fault-tolerance header: Server fault tolerance immediate: header: Immediate @@ -34,25 +34,16 @@ dc:

    documentation: title: Learn More - body: | - - + links: + license-expiration: + text: License expiration + link: '/enterprise/license/faq#q-is-there-a-grace-period-when-licenses-expire' + renewing-license: + text: Renewing a license + link: '/enterprise/license/faq#q-how-can-i-renew-a-license' + applying-new-license: + text: Applying a new license + link: '/tutorials/nomad/hashicorp-enterprise-license?in=consul/enterprise' nodes: index: agentless: @@ -265,10 +256,9 @@ dc:

    The upstreams listed on this page have been defined in a proxy registration. There may be more upstreams, though, as "transparent" mode is enabled on this proxy.

    - footer: | -

    - Read the documentation -

    + footer: + link: "/connect/transparent-proxy" + text: Read the documentation empty: |

    This Service Instance has no Upstreams{items, select, diff --git a/ui/yarn.lock b/ui/yarn.lock index 96953879f60..13f277c65f0 100644 --- a/ui/yarn.lock +++ b/ui/yarn.lock @@ -2927,6 +2927,15 @@ ember-cli-version-checker "^5.1.2" semver "^7.3.5" +"@embroider/addon-shim@^1.0.0": + version "1.8.4" + resolved "https://registry.yarnpkg.com/@embroider/addon-shim/-/addon-shim-1.8.4.tgz#0e7f32c5506bf0f3eb0840506e31c36c7053763c" + integrity sha512-sFhfWC0vI18KxVenmswQ/ShIvBg4juL8ubI+Q3NTSdkCTeaPQ/DIOUF6oR5DCQ8eO/TkIaw+kdG3FkTY6yNJqA== + dependencies: + "@embroider/shared-internals" "^2.0.0" + broccoli-funnel "^3.0.8" + semver "^7.3.8" + "@embroider/addon-shim@^1.5.0": version "1.8.3" resolved "https://registry.yarnpkg.com/@embroider/addon-shim/-/addon-shim-1.8.3.tgz#2368510b8ce42d50d02cb3289c32e260dfa34bd9" @@ -3147,6 +3156,20 @@ semver "^7.3.5" typescript-memoize "^1.0.1" +"@embroider/shared-internals@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@embroider/shared-internals/-/shared-internals-2.0.0.tgz#d8205ec6944362aeecfbb51143db352430ced316" + integrity sha512-qZ2/xky9mWm5YC6noOa6AiAwgISEQ78YTZNv4SNu2PFgEK/H+Ha/3ddngzGSsnXkVnIHZyxIBzhxETonQYHY9g== + dependencies: + babel-import-util "^1.1.0" + ember-rfc176-data "^0.3.17" + fs-extra "^9.1.0" + js-string-escape "^1.0.1" + lodash "^4.17.21" + resolve-package-path "^4.0.1" + semver "^7.3.5" + typescript-memoize "^1.0.1" + "@embroider/util@^0.39.1 || ^0.40.0 || ^0.41.0": version "0.41.0" resolved "https://registry.yarnpkg.com/@embroider/util/-/util-0.41.0.tgz#5324cb4742aa4ed8d613c4f88a466f73e4e6acc1" @@ -3399,19 +3422,25 @@ faker "^4.1.0" js-yaml "^3.13.1" -"@hashicorp/design-system-components@^1.0.4": - version "1.0.4" - resolved "https://registry.yarnpkg.com/@hashicorp/design-system-components/-/design-system-components-1.0.4.tgz#e258cad1a41b00db3363db25bfdafaa598326b98" - integrity sha512-aaOncgPH4yDEvQuFfOa/cwAOttxwbaEdaENEl+88EOi/HLUe0mdS2HgpC96w3sWhedE/xylCgSHz0DemIj5dJQ== +"@hashicorp/design-system-components@^1.6.0": + version "1.6.1" + resolved "https://registry.yarnpkg.com/@hashicorp/design-system-components/-/design-system-components-1.6.1.tgz#da04f1199cdce78dcf6591c3678377b87bd67424" + integrity sha512-nfuY5KLK3kQWRfrFOIEEoSSca6LwZ9Zss13glHHyAIFt/gJ1pjSpcYj2XTukdjfAvx70qwQbHPPaAUXZ00vtoA== dependencies: - "@hashicorp/design-system-tokens" "^1.0.0" - "@hashicorp/ember-flight-icons" "^2.0.12" - ember-auto-import "^2.4.1" + "@hashicorp/design-system-tokens" "^1.4.0" + "@hashicorp/ember-flight-icons" "^3.0.2" + dialog-polyfill "^0.5.6" + ember-auto-import "^2.4.2" + ember-cached-decorator-polyfill "^0.1.4" ember-cli-babel "^7.26.11" - ember-cli-htmlbars "^6.0.1" + ember-cli-htmlbars "^6.1.0" ember-cli-sass "^10.0.1" + ember-composable-helpers "^4.4.1" + ember-focus-trap "^1.0.1" ember-keyboard "^8.1.0" ember-named-blocks-polyfill "^0.2.5" + ember-style-modifier "^0.8.0" + ember-truth-helpers "^3.0.0" sass "^1.43.4" "@hashicorp/design-system-tokens@^1.0.0": @@ -3419,6 +3448,11 @@ resolved "https://registry.yarnpkg.com/@hashicorp/design-system-tokens/-/design-system-tokens-1.0.0.tgz#06ab55873ef444b0958a5192db310278c6501f0b" integrity sha512-akziX9jiHnQ8KfJA6s8l+98Ukz30C5Lw7BpSPeTduOmdOlJv1uP7w4TV0hC6VIDMDrJrxIF5Y/HnpSCdQGlxQA== +"@hashicorp/design-system-tokens@^1.4.0": + version "1.4.0" + resolved "https://registry.yarnpkg.com/@hashicorp/design-system-tokens/-/design-system-tokens-1.4.0.tgz#2d42bd7d9250b01f77618663b3b92004be840af7" + integrity sha512-xZI5lom+qPi5B4qUDgXcuTc+A8/NQdXXBoIfB7NUnY/GRp4kOkxNkgScPj8fvAFvUuLdiCAQhpLU54z1A/Q3cA== + "@hashicorp/ember-cli-api-double@^4.0.0": version "4.0.0" resolved "https://registry.yarnpkg.com/@hashicorp/ember-cli-api-double/-/ember-cli-api-double-4.0.0.tgz#fd6181229c589b4db93f1784d022db064c61ec76" @@ -3434,34 +3468,20 @@ pretender "^3.2.0" recursive-readdir-sync "^1.0.6" -"@hashicorp/ember-flight-icons@^2.0.12": - version "2.0.12" - resolved "https://registry.yarnpkg.com/@hashicorp/ember-flight-icons/-/ember-flight-icons-2.0.12.tgz#788adf7a4fedc468d612d35b604255df948f4012" - integrity sha512-8fHPGaSpMkr5dLWaruwbq9INwZCi2EyTof/TR/dL8PN4UbCuY+KXNqG0lLIKNGFFTj09B1cO303m5GUfKKDGKQ== - dependencies: - "@hashicorp/flight-icons" "^2.10.0" - ember-cli-babel "^7.26.11" - ember-cli-htmlbars "^6.0.1" - -"@hashicorp/ember-flight-icons@^3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@hashicorp/ember-flight-icons/-/ember-flight-icons-3.0.0.tgz#fddeb8adfb036aa3573c55b7236b34172b49cba9" - integrity sha512-+QrV38Ix9dWLwMzdVcMcSmFfeSVGvWvB+3OVBq3ltOTmnoLPIAx8LT9UDZUZ1wa65ciO+a1YzLMmwWnQgX/r9Q== +"@hashicorp/ember-flight-icons@^3.0.2": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@hashicorp/ember-flight-icons/-/ember-flight-icons-3.0.2.tgz#8d884c07842a6c88df18ca680d7883a59222a2ba" + integrity sha512-WomQg1hw/IHA1N9hC77WbTNazVXqu2RdRoaVCGT99NTXQ4S7Bw7vhHheR4JAgt10ksMZFI3X/bJVHxFfjUCkSQ== dependencies: - "@hashicorp/flight-icons" "^2.11.0" - ember-auto-import "^2.4.1" + "@hashicorp/flight-icons" "^2.12.0" + ember-auto-import "^2.4.2" ember-cli-babel "^7.26.11" - ember-cli-htmlbars "^6.0.1" + ember-cli-htmlbars "^6.1.0" -"@hashicorp/flight-icons@^2.10.0": - version "2.10.0" - resolved "https://registry.yarnpkg.com/@hashicorp/flight-icons/-/flight-icons-2.10.0.tgz#24b03043bacda16e505200e6591dfef896ddacf1" - integrity sha512-jYUA0M6Tz+4RAudil+GW/fHbhZPcKCiIZZAguBDviqbLneMkMgPOBgbXWCGWsEQ1fJzP2cXbUaio8L0aQZPWQw== - -"@hashicorp/flight-icons@^2.11.0": - version "2.11.0" - resolved "https://registry.yarnpkg.com/@hashicorp/flight-icons/-/flight-icons-2.11.0.tgz#1500be99a42ee8512e7caece4bdae60ce8790577" - integrity sha512-teFkUY2di63JZ2gsegQgS+3f5YEP+GPuycB1Z2O+weInIrL33Ds0/J+lxFCmi2vkPAeY5xOnsclHYnhU6xOSmA== +"@hashicorp/flight-icons@^2.12.0": + version "2.12.0" + resolved "https://registry.yarnpkg.com/@hashicorp/flight-icons/-/flight-icons-2.12.0.tgz#48bc21f21678668ffe9147b181a2991d8b151fc7" + integrity sha512-PhjTTHCjoq4EJirifbxLxnxXnCRf1NUAYZ1WnFW8i0yOmmax6fgjsJRPlf0VIGsR8R7isFpjuy6gJ5c7mNhE0w== "@html-next/vertical-collection@^4.0.0": version "4.0.0" @@ -4874,6 +4894,11 @@ babel-import-util@^1.1.0: resolved "https://registry.yarnpkg.com/babel-import-util/-/babel-import-util-1.2.2.tgz#1027560e143a4a68b1758e71d4fadc661614e495" integrity sha512-8HgkHWt5WawRFukO30TuaL9EiDUOdvyKtDwLma4uBNeUSDbOO0/hiPfavrOWxSS6J6TKXfukWHZ3wiqZhJ8ONQ== +babel-import-util@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/babel-import-util/-/babel-import-util-1.3.0.tgz#dc9251ea39a7747bd586c1c13b8d785a42797f8e" + integrity sha512-PPzUT17eAI18zn6ek1R3sB4Krc/MbnmT1MkZQFmyhjoaEGBVwNABhfVU9+EKcDSKrrOm9OIpGhjxukx1GCiy1g== + babel-loader@^8.0.6, babel-loader@^8.1.0: version "8.2.2" resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.2.2.tgz#9363ce84c10c9a40e6c753748e1441b60c8a0b81" @@ -4950,6 +4975,13 @@ babel-plugin-ember-template-compilation@^1.0.0: magic-string "^0.25.7" string.prototype.matchall "^4.0.5" +babel-plugin-ember-template-compilation@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/babel-plugin-ember-template-compilation/-/babel-plugin-ember-template-compilation-2.0.0.tgz#41d895874ba6119dd461f61993c16d1154bf8a57" + integrity sha512-d+4jaB2ik0rt9TH0K9kOlKJeRBHEb373FgFMcU9ZaJL2zYuVXe19bqy+cWlLpLf1tpOBcBG9QTlFBCoImlOt1g== + dependencies: + babel-import-util "^1.3.0" + babel-plugin-filter-imports@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/babel-plugin-filter-imports/-/babel-plugin-filter-imports-4.0.0.tgz#068f8da15236a96a9602c36dc6f4a6eeca70a4f4" @@ -7717,6 +7749,11 @@ dezalgo@^1.0.0: asap "^2.0.0" wrappy "1" +dialog-polyfill@^0.5.6: + version "0.5.6" + resolved "https://registry.yarnpkg.com/dialog-polyfill/-/dialog-polyfill-0.5.6.tgz#7507b4c745a82fcee0fa07ce64d835979719599a" + integrity sha512-ZbVDJI9uvxPAKze6z146rmfUZjBqNEwcnFTVamQzXH+svluiV7swmVIGr7miwADgfgt1G2JQIytypM9fbyhX4w== + didyoumean@^1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/didyoumean/-/didyoumean-1.2.2.tgz#989346ffe9e839b4555ecf5666edea0d3e8ad037" @@ -7991,7 +8028,7 @@ ember-auto-import@^1.5.3, ember-auto-import@^1.6.0: walk-sync "^0.3.3" webpack "^4.43.0" -ember-auto-import@^2.2.3, ember-auto-import@^2.4.1, ember-auto-import@^2.4.2: +ember-auto-import@^2.2.3, ember-auto-import@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/ember-auto-import/-/ember-auto-import-2.4.2.tgz#d4d3bc6885a11cf124f606f5c37169bdf76e37ae" integrity sha512-REh+1aJWpTkvN42a/ga41OuRpUsSW7UQfPr2wPtYx56o/xoSNhVBXejy7yV9ObrkN7gogz6fs2xZwih5cOwpYg== @@ -8045,6 +8082,26 @@ ember-basic-dropdown@3.0.21, ember-basic-dropdown@^3.0.16: ember-style-modifier "^0.6.0" ember-truth-helpers "^2.1.0 || ^3.0.0" +ember-cache-primitive-polyfill@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/ember-cache-primitive-polyfill/-/ember-cache-primitive-polyfill-1.0.1.tgz#a27075443bd87e5af286c1cd8a7df24e3b9f6715" + integrity sha512-hSPcvIKarA8wad2/b6jDd/eU+OtKmi6uP+iYQbzi5TQpjsqV6b4QdRqrLk7ClSRRKBAtdTuutx+m+X+WlEd2lw== + dependencies: + ember-cli-babel "^7.22.1" + ember-cli-version-checker "^5.1.1" + ember-compatibility-helpers "^1.2.1" + silent-error "^1.1.1" + +ember-cached-decorator-polyfill@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/ember-cached-decorator-polyfill/-/ember-cached-decorator-polyfill-0.1.4.tgz#f1e2c65cc78d0d9c4ac0e047e643af477eb85ace" + integrity sha512-JOK7kBCWsTVCzmCefK4nr9BACDJk0owt9oIUaVt6Q0UtQ4XeAHmoK5kQ/YtDcxQF1ZevHQFdGhsTR3JLaHNJgA== + dependencies: + "@glimmer/tracking" "^1.0.4" + ember-cache-primitive-polyfill "^1.0.1" + ember-cli-babel "^7.21.0" + ember-cli-babel-plugin-helpers "^1.1.1" + ember-can@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/ember-can/-/ember-can-4.2.0.tgz#08bfec3b2b57aad3dc6e4dc36fe9692bd1794dab" @@ -8310,6 +8367,26 @@ ember-cli-htmlbars@^6.0.1: silent-error "^1.1.1" walk-sync "^2.2.0" +ember-cli-htmlbars@^6.1.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/ember-cli-htmlbars/-/ember-cli-htmlbars-6.2.0.tgz#18ec48ee1c93f9eed862a64eb24a9d14604f1dfc" + integrity sha512-j5EGixjGau23HrqRiW/JjoAovg5UBHfjbyN7wX5ekE90knIEqUUj1z/Mo/cTx/J2VepQ2lE6HdXW9LWQ/WdMtw== + dependencies: + "@ember/edition-utils" "^1.2.0" + babel-plugin-ember-template-compilation "^2.0.0" + babel-plugin-htmlbars-inline-precompile "^5.3.0" + broccoli-debug "^0.6.5" + broccoli-persistent-filter "^3.1.2" + broccoli-plugin "^4.0.3" + ember-cli-version-checker "^5.1.2" + fs-tree-diff "^2.0.1" + hash-for-dep "^1.5.1" + heimdalljs-logger "^0.1.10" + js-string-escape "^1.0.1" + semver "^7.3.4" + silent-error "^1.1.1" + walk-sync "^2.2.0" + ember-cli-inject-live-reload@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/ember-cli-inject-live-reload/-/ember-cli-inject-live-reload-2.0.2.tgz#95edb543b386239d35959e5ea9579f5382976ac7" @@ -8730,6 +8807,16 @@ ember-compatibility-helpers@^1.2.5: fs-extra "^9.1.0" semver "^5.4.1" +ember-composable-helpers@^4.4.1: + version "4.5.0" + resolved "https://registry.yarnpkg.com/ember-composable-helpers/-/ember-composable-helpers-4.5.0.tgz#94febbdf4348e64f45f7a6f993f326e32540a61e" + integrity sha512-XjpDLyVPsLCy6kd5dIxZonOECCO6AA5sY5Hr6tYUbJg3s5ghFAiFWaNcYraYC+fL2yPJQAswwpfwGlQORUJZkw== + dependencies: + "@babel/core" "^7.0.0" + broccoli-funnel "2.0.1" + ember-cli-babel "^7.26.3" + resolve "^1.10.0" + ember-composable-helpers@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/ember-composable-helpers/-/ember-composable-helpers-5.0.0.tgz#055bab3a3e234ab2917499b1465e968c253ca885" @@ -8862,6 +8949,14 @@ ember-factory-for-polyfill@^1.3.1: dependencies: ember-cli-version-checker "^2.1.0" +ember-focus-trap@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/ember-focus-trap/-/ember-focus-trap-1.0.1.tgz#a99565f6ce55d500b92a0965e79e3ad04219f157" + integrity sha512-ZUyq5ZkIuXp+ng9rCMkqBh36/V95PltL7iljStkma4+651xlAy3Z84L9WOu/uOJyVpNUxii8RJBbAySHV6c+RQ== + dependencies: + "@embroider/addon-shim" "^1.0.0" + focus-trap "^6.7.1" + ember-get-config@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/ember-get-config/-/ember-get-config-0.3.0.tgz#a73a1a87b48d9dde4c66a0e52ed5260b8a48cfbd" @@ -9286,6 +9381,14 @@ ember-style-modifier@^0.6.0: ember-cli-babel "^7.21.0" ember-modifier "^2.1.0" +ember-style-modifier@^0.8.0: + version "0.8.0" + resolved "https://registry.yarnpkg.com/ember-style-modifier/-/ember-style-modifier-0.8.0.tgz#ef46b3f288e63e3d850418ea8dc6f7b12edde721" + integrity sha512-I7M+oZ+poYYOP7n521rYv7kkYZbxotL8VbtHYxLQ3tasRZYQJ21qfu3vVjydSjwyE3w7EZRgKngBoMhKSAEZnw== + dependencies: + ember-cli-babel "^7.26.6" + ember-modifier "^3.2.7" + ember-template-lint@^2.0.1: version "2.21.0" resolved "https://registry.yarnpkg.com/ember-template-lint/-/ember-template-lint-2.21.0.tgz#7e120abf309a8810eeed26c52377943faf15a95b" @@ -10405,6 +10508,13 @@ flush-write-stream@^1.0.0: inherits "^2.0.3" readable-stream "^2.3.6" +focus-trap@^6.7.1: + version "6.9.4" + resolved "https://registry.yarnpkg.com/focus-trap/-/focus-trap-6.9.4.tgz#436da1a1d935c48b97da63cd8f361c6f3aa16444" + integrity sha512-v2NTsZe2FF59Y+sDykKY+XjqZ0cPfhq/hikWVL88BqLivnNiEffAsac6rP6H45ff9wG9LL5ToiDqrLEP9GX9mw== + dependencies: + tabbable "^5.3.3" + focusable-selectors@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/focusable-selectors/-/focusable-selectors-0.3.0.tgz#0cf0c617c0f130b3d421be6787acb95b0b4936c4" @@ -15578,6 +15688,13 @@ semver@^7.3.5: dependencies: lru-cache "^6.0.0" +semver@^7.3.8: + version "7.3.8" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.8.tgz#07a78feafb3f7b32347d725e33de7e2a2df67798" + integrity sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A== + dependencies: + lru-cache "^6.0.0" + send@0.17.1: version "0.17.1" resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8" @@ -16405,6 +16522,11 @@ sync-disk-cache@^2.0.0: rimraf "^3.0.0" username-sync "^1.0.2" +tabbable@^5.3.3: + version "5.3.3" + resolved "https://registry.yarnpkg.com/tabbable/-/tabbable-5.3.3.tgz#aac0ff88c73b22d6c3c5a50b1586310006b47fbf" + integrity sha512-QD9qKY3StfbZqWOPLp0++pOrAVb/HbUi5xCc8cUo4XjP19808oaMiDzn0leBY5mCespIBM0CIZePzZjgzR83kA== + table@^6.0.9: version "6.8.0" resolved "https://registry.yarnpkg.com/table/-/table-6.8.0.tgz#87e28f14fa4321c3377ba286f07b79b281a3b3ca" From 8ac211b42781a9dd20db85a3caeb49e93a5b014a Mon Sep 17 00:00:00 2001 From: Paul Banks Date: Thu, 23 Feb 2023 14:07:17 +0000 Subject: [PATCH 047/262] Correct WAL metrics registrations (#16388) --- agent/consul/server_log_verification.go | 4 +- agent/metrics_test.go | 190 ++++++++++++++++++++++++ agent/setup.go | 61 +++++++- 3 files changed, 248 insertions(+), 7 deletions(-) diff --git a/agent/consul/server_log_verification.go b/agent/consul/server_log_verification.go index 0c7e63e3a12..cb95b9aeeee 100644 --- a/agent/consul/server_log_verification.go +++ b/agent/consul/server_log_verification.go @@ -62,12 +62,12 @@ func makeLogVerifyReportFn(logger hclog.Logger) verifier.ReportFn { if r.WrittenSum > 0 && r.WrittenSum != r.ExpectedSum { // The failure occurred before the follower wrote to the log so it // must be corrupted in flight from the leader! - l2.Info("verification checksum FAILED: in-flight corruption", + l2.Error("verification checksum FAILED: in-flight corruption", "followerWriteChecksum", fmt.Sprintf("%08x", r.WrittenSum), "readChecksum", fmt.Sprintf("%08x", r.ReadSum), ) } else { - l2.Info("verification checksum FAILED: storage corruption", + l2.Error("verification checksum FAILED: storage corruption", "followerWriteChecksum", fmt.Sprintf("%08x", r.WrittenSum), "readChecksum", fmt.Sprintf("%08x", r.ReadSum), ) diff --git a/agent/metrics_test.go b/agent/metrics_test.go index 1f649dd07a5..6f75a4d233b 100644 --- a/agent/metrics_test.go +++ b/agent/metrics_test.go @@ -432,3 +432,193 @@ func TestHTTPHandlers_AgentMetrics_CACertExpiry_Prometheus(t *testing.T) { }) } + +func TestHTTPHandlers_AgentMetrics_WAL_Prometheus(t *testing.T) { + skipIfShortTesting(t) + // This test cannot use t.Parallel() since we modify global state, ie the global metrics instance + + t.Run("client agent emits nothing", func(t *testing.T) { + hcl := ` + server = false + telemetry = { + prometheus_retention_time = "5s", + disable_hostname = true + metrics_prefix = "agent_4" + } + raft_logstore { + backend = "wal" + } + bootstrap = false + ` + + a := StartTestAgent(t, TestAgent{HCL: hcl}) + defer a.Shutdown() + + respRec := httptest.NewRecorder() + recordPromMetrics(t, a, respRec) + + require.NotContains(t, respRec.Body.String(), "agent_4_raft_wal") + }) + + t.Run("server with WAL enabled emits WAL metrics", func(t *testing.T) { + hcl := ` + server = true + bootstrap = true + telemetry = { + prometheus_retention_time = "5s", + disable_hostname = true + metrics_prefix = "agent_5" + } + connect { + enabled = true + } + raft_logstore { + backend = "wal" + } + ` + + a := StartTestAgent(t, TestAgent{HCL: hcl}) + defer a.Shutdown() + testrpc.WaitForLeader(t, a.RPC, "dc1") + + respRec := httptest.NewRecorder() + recordPromMetrics(t, a, respRec) + + out := respRec.Body.String() + require.Contains(t, out, "agent_5_raft_wal_head_truncations") + require.Contains(t, out, "agent_5_raft_wal_last_segment_age_seconds") + require.Contains(t, out, "agent_5_raft_wal_log_appends") + require.Contains(t, out, "agent_5_raft_wal_log_entries_read") + require.Contains(t, out, "agent_5_raft_wal_log_entries_written") + require.Contains(t, out, "agent_5_raft_wal_log_entry_bytes_read") + require.Contains(t, out, "agent_5_raft_wal_log_entry_bytes_written") + require.Contains(t, out, "agent_5_raft_wal_segment_rotations") + require.Contains(t, out, "agent_5_raft_wal_stable_gets") + require.Contains(t, out, "agent_5_raft_wal_stable_sets") + require.Contains(t, out, "agent_5_raft_wal_tail_truncations") + }) + + t.Run("server without WAL enabled emits no WAL metrics", func(t *testing.T) { + hcl := ` + server = true + bootstrap = true + telemetry = { + prometheus_retention_time = "5s", + disable_hostname = true + metrics_prefix = "agent_6" + } + connect { + enabled = true + } + raft_logstore { + backend = "boltdb" + } + ` + + a := StartTestAgent(t, TestAgent{HCL: hcl}) + defer a.Shutdown() + testrpc.WaitForLeader(t, a.RPC, "dc1") + + respRec := httptest.NewRecorder() + recordPromMetrics(t, a, respRec) + + require.NotContains(t, respRec.Body.String(), "agent_6_raft_wal") + }) + +} + +func TestHTTPHandlers_AgentMetrics_LogVerifier_Prometheus(t *testing.T) { + skipIfShortTesting(t) + // This test cannot use t.Parallel() since we modify global state, ie the global metrics instance + + t.Run("client agent emits nothing", func(t *testing.T) { + hcl := ` + server = false + telemetry = { + prometheus_retention_time = "5s", + disable_hostname = true + metrics_prefix = "agent_4" + } + raft_logstore { + verification { + enabled = true + interval = "1s" + } + } + bootstrap = false + ` + + a := StartTestAgent(t, TestAgent{HCL: hcl}) + defer a.Shutdown() + + respRec := httptest.NewRecorder() + recordPromMetrics(t, a, respRec) + + require.NotContains(t, respRec.Body.String(), "agent_4_raft_logstore_verifier") + }) + + t.Run("server with verifier enabled emits all metrics", func(t *testing.T) { + hcl := ` + server = true + bootstrap = true + telemetry = { + prometheus_retention_time = "5s", + disable_hostname = true + metrics_prefix = "agent_5" + } + connect { + enabled = true + } + raft_logstore { + verification { + enabled = true + interval = "1s" + } + } + ` + + a := StartTestAgent(t, TestAgent{HCL: hcl}) + defer a.Shutdown() + testrpc.WaitForLeader(t, a.RPC, "dc1") + + respRec := httptest.NewRecorder() + recordPromMetrics(t, a, respRec) + + out := respRec.Body.String() + require.Contains(t, out, "agent_5_raft_logstore_verifier_checkpoints_written") + require.Contains(t, out, "agent_5_raft_logstore_verifier_dropped_reports") + require.Contains(t, out, "agent_5_raft_logstore_verifier_ranges_verified") + require.Contains(t, out, "agent_5_raft_logstore_verifier_read_checksum_failures") + require.Contains(t, out, "agent_5_raft_logstore_verifier_write_checksum_failures") + }) + + t.Run("server with verifier disabled emits no extra metrics", func(t *testing.T) { + hcl := ` + server = true + bootstrap = true + telemetry = { + prometheus_retention_time = "5s", + disable_hostname = true + metrics_prefix = "agent_6" + } + connect { + enabled = true + } + raft_logstore { + verification { + enabled = false + } + } + ` + + a := StartTestAgent(t, TestAgent{HCL: hcl}) + defer a.Shutdown() + testrpc.WaitForLeader(t, a.RPC, "dc1") + + respRec := httptest.NewRecorder() + recordPromMetrics(t, a, respRec) + + require.NotContains(t, respRec.Body.String(), "agent_6_raft_logstore_verifier") + }) + +} diff --git a/agent/setup.go b/agent/setup.go index 01d7b7593f6..8dc5e5e18c0 100644 --- a/agent/setup.go +++ b/agent/setup.go @@ -9,6 +9,8 @@ import ( "github.com/armon/go-metrics/prometheus" "github.com/hashicorp/go-hclog" + wal "github.com/hashicorp/raft-wal" + "github.com/hashicorp/raft-wal/verifier" "google.golang.org/grpc/grpclog" autoconf "github.com/hashicorp/consul/agent/auto-config" @@ -89,7 +91,7 @@ func NewBaseDeps(configLoader ConfigLoader, logOut io.Writer, providedLogger hcl } isServer := result.RuntimeConfig.ServerMode - gauges, counters, summaries := getPrometheusDefs(cfg.Telemetry, isServer) + gauges, counters, summaries := getPrometheusDefs(cfg, isServer) cfg.Telemetry.PrometheusOpts.GaugeDefinitions = gauges cfg.Telemetry.PrometheusOpts.CounterDefinitions = counters cfg.Telemetry.PrometheusOpts.SummaryDefinitions = summaries @@ -226,7 +228,7 @@ func newConnPool(config *config.RuntimeConfig, logger hclog.Logger, tls *tlsutil // getPrometheusDefs reaches into every slice of prometheus defs we've defined in each part of the agent, and appends // all of our slices into one nice slice of definitions per metric type for the Consul agent to pass to go-metrics. -func getPrometheusDefs(cfg lib.TelemetryConfig, isServer bool) ([]prometheus.GaugeDefinition, []prometheus.CounterDefinition, []prometheus.SummaryDefinition) { +func getPrometheusDefs(cfg *config.RuntimeConfig, isServer bool) ([]prometheus.GaugeDefinition, []prometheus.CounterDefinition, []prometheus.SummaryDefinition) { // TODO: "raft..." metrics come from the raft lib and we should migrate these to a telemetry // package within. In the mean time, we're going to define a few here because they're key to monitoring Consul. raftGauges := []prometheus.GaugeDefinition{ @@ -272,6 +274,29 @@ func getPrometheusDefs(cfg lib.TelemetryConfig, isServer bool) ([]prometheus.Gau ) } + if isServer && cfg.RaftLogStoreConfig.Verification.Enabled { + verifierGauges := make([]prometheus.GaugeDefinition, 0) + for _, d := range verifier.MetricDefinitions.Gauges { + verifierGauges = append(verifierGauges, prometheus.GaugeDefinition{ + Name: []string{"raft", "logstore", "verifier", d.Name}, + Help: d.Desc, + }) + } + gauges = append(gauges, verifierGauges) + } + + if isServer && cfg.RaftLogStoreConfig.Backend == consul.LogStoreBackendWAL { + + walGauges := make([]prometheus.GaugeDefinition, 0) + for _, d := range wal.MetricDefinitions.Gauges { + walGauges = append(walGauges, prometheus.GaugeDefinition{ + Name: []string{"raft", "wal", d.Name}, + Help: d.Desc, + }) + } + gauges = append(gauges, walGauges) + } + // Flatten definitions // NOTE(kit): Do we actually want to create a set here so we can ensure definition names are unique? var gaugeDefs []prometheus.GaugeDefinition @@ -280,7 +305,7 @@ func getPrometheusDefs(cfg lib.TelemetryConfig, isServer bool) ([]prometheus.Gau // TODO(kit): Prepending the service to each definition should be handled by go-metrics var withService []prometheus.GaugeDefinition for _, gauge := range g { - gauge.Name = append([]string{cfg.MetricsPrefix}, gauge.Name...) + gauge.Name = append([]string{cfg.Telemetry.MetricsPrefix}, gauge.Name...) withService = append(withService, gauge) } gaugeDefs = append(gaugeDefs, withService...) @@ -316,6 +341,32 @@ func getPrometheusDefs(cfg lib.TelemetryConfig, isServer bool) ([]prometheus.Gau raftCounters, rate.Counters, } + + // For some unknown reason, we seem to add the raft counters above without + // checking if this is a server like we do above for some of the summaries + // above. We should probably fix that but I want to not change behavior right + // now. If we are a server, add summaries for WAL and verifier metrics. + if isServer && cfg.RaftLogStoreConfig.Verification.Enabled { + verifierCounters := make([]prometheus.CounterDefinition, 0) + for _, d := range verifier.MetricDefinitions.Counters { + verifierCounters = append(verifierCounters, prometheus.CounterDefinition{ + Name: []string{"raft", "logstore", "verifier", d.Name}, + Help: d.Desc, + }) + } + counters = append(counters, verifierCounters) + } + if isServer && cfg.RaftLogStoreConfig.Backend == consul.LogStoreBackendWAL { + walCounters := make([]prometheus.CounterDefinition, 0) + for _, d := range wal.MetricDefinitions.Counters { + walCounters = append(walCounters, prometheus.CounterDefinition{ + Name: []string{"raft", "wal", d.Name}, + Help: d.Desc, + }) + } + counters = append(counters, walCounters) + } + // Flatten definitions // NOTE(kit): Do we actually want to create a set here so we can ensure definition names are unique? var counterDefs []prometheus.CounterDefinition @@ -323,7 +374,7 @@ func getPrometheusDefs(cfg lib.TelemetryConfig, isServer bool) ([]prometheus.Gau // TODO(kit): Prepending the service to each definition should be handled by go-metrics var withService []prometheus.CounterDefinition for _, counter := range c { - counter.Name = append([]string{cfg.MetricsPrefix}, counter.Name...) + counter.Name = append([]string{cfg.Telemetry.MetricsPrefix}, counter.Name...) withService = append(withService, counter) } counterDefs = append(counterDefs, withService...) @@ -377,7 +428,7 @@ func getPrometheusDefs(cfg lib.TelemetryConfig, isServer bool) ([]prometheus.Gau // TODO(kit): Prepending the service to each definition should be handled by go-metrics var withService []prometheus.SummaryDefinition for _, summary := range s { - summary.Name = append([]string{cfg.MetricsPrefix}, summary.Name...) + summary.Name = append([]string{cfg.Telemetry.MetricsPrefix}, summary.Name...) withService = append(withService, summary) } summaryDefs = append(summaryDefs, withService...) From 3358d823cc452a5ff647c36152c3141e219c8641 Mon Sep 17 00:00:00 2001 From: Dan Stough Date: Thu, 23 Feb 2023 10:39:15 -0500 Subject: [PATCH 048/262] chore: remove stable-website (#16386) --- .github/CONTRIBUTING.md | 3 +- .github/workflows/backport-assistant.yml | 27 ------------- .github/workflows/website-checker.yml | 51 ------------------------ 3 files changed, 1 insertion(+), 80 deletions(-) delete mode 100644 .github/workflows/website-checker.yml diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index 131d9057d2c..b691d1aae7b 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -162,8 +162,7 @@ When you're ready to submit a pull request: | --- | --- | | `pr/no-changelog` | This PR does not have an intended changelog entry | | `pr/no-metrics-test` | This PR does not require any testing for metrics | - | `backport/stable-website` | This PR contains documentation changes that are ready to be deployed immediately. Changes will also automatically get backported to the latest release branch | - | `backport/1.12.x` | Backport the changes in this PR to the targeted release branch. Consult the [Consul Release Notes](https://www.consul.io/docs/release-notes) page to view active releases. | + | `backport/1.12.x` | Backport the changes in this PR to the targeted release branch. Consult the [Consul Release Notes](https://www.consul.io/docs/release-notes) page to view active releases. Website documentation merged to the latest release branch is deployed immediately | Other labels may automatically be added by the Github Action CI. 7. After you submit, the Consul maintainers team needs time to carefully review your contribution and ensure it is production-ready, considering factors such as: security, diff --git a/.github/workflows/backport-assistant.yml b/.github/workflows/backport-assistant.yml index 7eac100546c..95fc03c10bb 100644 --- a/.github/workflows/backport-assistant.yml +++ b/.github/workflows/backport-assistant.yml @@ -18,33 +18,6 @@ jobs: runs-on: ubuntu-latest container: hashicorpdev/backport-assistant:0.3.0 steps: - - name: Run Backport Assistant for stable-website - run: | - backport-assistant backport -merge-method=squash -gh-automerge - env: - BACKPORT_LABEL_REGEXP: "type/docs-(?Pcherrypick)" - BACKPORT_TARGET_TEMPLATE: "stable-website" - BACKPORT_MERGE_COMMIT: true - GITHUB_TOKEN: ${{ secrets.ELEVATED_GITHUB_TOKEN }} - - name: Backport changes to latest release branch - run: | - # Use standard token here - resp=$(curl -f -s -H 'authorization: Bearer ${{ secrets.GITHUB_TOKEN }}' "https://api.github.com/repos/$GITHUB_REPOSITORY/labels?per_page=100") - ret="$?" - if [[ "$ret" -ne 0 ]]; then - echo "The GitHub API returned $ret" - exit $ret - fi - # get the latest backport label excluding any website labels, ex: `backport/0.3.x` and not `backport/website` - latest_backport_label=$(echo "$resp" | jq -r '.[] | select(.name | (startswith("backport/") and (contains("website") | not))) | .name' | sort -rV | head -n1) - echo "Latest backport label: $latest_backport_label" - # set BACKPORT_TARGET_TEMPLATE for backport-assistant - # trims backport/ from the beginning with parameter substitution - export BACKPORT_TARGET_TEMPLATE="release/${latest_backport_label#backport/}.x" - backport-assistant backport -merge-method=squash -gh-automerge - env: - BACKPORT_LABEL_REGEXP: "type/docs-(?Pcherrypick)" - GITHUB_TOKEN: ${{ secrets.ELEVATED_GITHUB_TOKEN }} - name: Run Backport Assistant for release branches run: | backport-assistant backport -merge-method=squash -gh-automerge diff --git a/.github/workflows/website-checker.yml b/.github/workflows/website-checker.yml deleted file mode 100644 index e5d628235dd..00000000000 --- a/.github/workflows/website-checker.yml +++ /dev/null @@ -1,51 +0,0 @@ -# The outline of this workflow is something that the GitHub Security team warns against -# here: https://securitylab.github.com/research/github-actions-preventing-pwn-requests. But -# due to this workflow only running a git diff check and not building or publishing anything, -# there is no harm in checking out the PR HEAD code. -# -# All the code checked out in this workflow should be considered untrusted. This workflow must -# never call any makefiles or scripts. It must never be changed to run any code from the checkout. - -# This workflow posts a message to a PR to remind maintainers that there are website/ changes -# in the PR and if they need to be cherry-picked to the stable-website branch, the -# 'type/docs-cherrypick' label needs to be applied. - -name: Website Checker - -on: - pull_request_target: - types: [opened] - # Runs on PRs to main and all release branches - branches: - - main - - release/* - -jobs: - # checks that a 'type/docs-cherrypick' label is attached to PRs with website/ changes - website-check: - # If there's already a `type/docs-cherrypick` label or an explicit `pr/no-docs` label, we ignore this check - if: >- - !contains(github.event.pull_request.labels.*.name, 'type/docs-cherrypick') && - !contains(github.event.pull_request.labels.*.name, 'pr/no-docs') - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@v2 - with: - ref: ${{ github.event.pull_request.head.sha }} - fetch-depth: 0 # by default the checkout action doesn't checkout all branches - - name: Check for website/ dir change in diff - run: | - # check if there is a diff in the website/ directory - website_files=$(git --no-pager diff --name-only HEAD "$(git merge-base HEAD "origin/${{ github.event.pull_request.base.ref }}")" -- website/) - - # If we find changed files in the website/ directory, we post a comment to the PR - if [ -n "$website_files" ]; then - # post PR comment to GitHub to check if a 'type/docs-cherrypick' label needs to be applied to the PR - echo "website-check: Did not find a 'type/docs-cherrypick' label, posting a reminder in the PR" - github_message="🤔 This PR has changes in the \`website/\` directory but does not have a \`type/docs-cherrypick\` label. If the changes are for the next version, this can be ignored. If they are updates to current docs, attach the label to auto cherrypick to the \`stable-website\` branch after merging." - curl -s -H "Authorization: token ${{ secrets.PR_COMMENT_TOKEN }}" \ - -X POST \ - -d "{ \"body\": \"${github_message}\"}" \ - "https://api.github.com/repos/${GITHUB_REPOSITORY}/issues/${{ github.event.pull_request.number }}/comments" - fi From 595131fca9eefcb405ae52b5895d861febbd9967 Mon Sep 17 00:00:00 2001 From: Eric Haberkorn Date: Thu, 23 Feb 2023 11:32:32 -0500 Subject: [PATCH 049/262] Refactor the disco chain -> xds logic (#16392) --- agent/xds/clusters.go | 260 +++++++++----- agent/xds/endpoints.go | 71 ++-- agent/xds/golden_test.go | 33 +- agent/xds/listeners.go | 11 +- agent/xds/routes.go | 12 +- ...and-failover-to-cluster-peer.latest.golden | 261 ++++++-------- ...roxy-with-chain-and-failover.latest.golden | 262 ++++++-------- ...and-redirect-to-cluster-peer.latest.golden | 167 ++++----- ...ough-local-gateway-triggered.latest.golden | 340 ++++++++---------- ...ilover-through-local-gateway.latest.golden | 340 ++++++++---------- ...ugh-remote-gateway-triggered.latest.golden | 340 ++++++++---------- ...lover-through-remote-gateway.latest.golden | 340 ++++++++---------- ...ough-local-gateway-triggered.latest.golden | 262 ++++++-------- ...ilover-through-local-gateway.latest.golden | 262 ++++++-------- ...ugh-remote-gateway-triggered.latest.golden | 262 ++++++-------- ...lover-through-remote-gateway.latest.golden | 262 ++++++-------- ...and-failover-to-cluster-peer.latest.golden | 175 ++++----- ...ress-with-chain-and-failover.latest.golden | 176 ++++----- ...ough-local-gateway-triggered.latest.golden | 248 ++++++------- ...ilover-through-local-gateway.latest.golden | 248 ++++++------- ...ugh-remote-gateway-triggered.latest.golden | 248 ++++++------- ...lover-through-remote-gateway.latest.golden | 248 ++++++------- ...ough-local-gateway-triggered.latest.golden | 176 ++++----- ...ilover-through-local-gateway.latest.golden | 176 ++++----- ...ugh-remote-gateway-triggered.latest.golden | 176 ++++----- ...lover-through-remote-gateway.latest.golden | 176 ++++----- ...and-failover-to-cluster-peer.latest.golden | 112 +++--- ...roxy-with-chain-and-failover.latest.golden | 116 +++--- ...ough-local-gateway-triggered.latest.golden | 152 ++++---- ...ilover-through-local-gateway.latest.golden | 116 +++--- ...ugh-remote-gateway-triggered.latest.golden | 152 ++++---- ...lover-through-remote-gateway.latest.golden | 116 +++--- ...ough-local-gateway-triggered.latest.golden | 116 +++--- ...ilover-through-local-gateway.latest.golden | 116 +++--- ...ugh-remote-gateway-triggered.latest.golden | 116 +++--- ...lover-through-remote-gateway.latest.golden | 116 +++--- ...and-failover-to-cluster-peer.latest.golden | 76 ++-- ...ress-with-chain-and-failover.latest.golden | 80 ++--- ...ough-local-gateway-triggered.latest.golden | 116 +++--- ...ilover-through-local-gateway.latest.golden | 80 ++--- ...ugh-remote-gateway-triggered.latest.golden | 116 +++--- ...lover-through-remote-gateway.latest.golden | 80 ++--- ...ough-local-gateway-triggered.latest.golden | 80 ++--- ...ilover-through-local-gateway.latest.golden | 80 ++--- ...ugh-remote-gateway-triggered.latest.golden | 80 ++--- ...lover-through-remote-gateway.latest.golden | 80 ++--- .../primary/verify.bats | 21 +- .../primary/verify.bats | 12 +- .../primary/verify.bats | 14 +- .../verify.bats | 6 +- .../primary/verify.bats | 12 +- 51 files changed, 3590 insertions(+), 4103 deletions(-) diff --git a/agent/xds/clusters.go b/agent/xds/clusters.go index 704857e5daa..9a296d2a851 100644 --- a/agent/xds/clusters.go +++ b/agent/xds/clusters.go @@ -1164,6 +1164,21 @@ func (s *ResourceGenerator) makeUpstreamClusterForPreparedQuery(upstream structs return c, nil } +func finalizeUpstreamConfig(cfg structs.UpstreamConfig, chain *structs.CompiledDiscoveryChain, connectTimeout time.Duration) structs.UpstreamConfig { + if cfg.Protocol == "" { + cfg.Protocol = chain.Protocol + } + + if cfg.Protocol == "" { + cfg.Protocol = "tcp" + } + + if cfg.ConnectTimeoutMs == 0 { + cfg.ConnectTimeoutMs = int(connectTimeout / time.Millisecond) + } + return cfg +} + func (s *ResourceGenerator) makeUpstreamClustersForDiscoveryChain( uid proxycfg.UpstreamID, upstream *structs.Upstream, @@ -1200,21 +1215,6 @@ func (s *ResourceGenerator) makeUpstreamClustersForDiscoveryChain( "error", err) } - finalizeUpstreamConfig := func(cfg structs.UpstreamConfig, connectTimeout time.Duration) structs.UpstreamConfig { - if cfg.Protocol == "" { - cfg.Protocol = chain.Protocol - } - - if cfg.Protocol == "" { - cfg.Protocol = "tcp" - } - - if cfg.ConnectTimeoutMs == 0 { - cfg.ConnectTimeoutMs = int(connectTimeout / time.Millisecond) - } - return cfg - } - var escapeHatchCluster *envoy_cluster_v3.Cluster if !forMeshGateway { if rawUpstreamConfig.EnvoyClusterJSON != "" { @@ -1243,15 +1243,14 @@ func (s *ResourceGenerator) makeUpstreamClustersForDiscoveryChain( case node.Resolver == nil: return nil, fmt.Errorf("impossible to process a non-resolver node") } - failover := node.Resolver.Failover // These variables are prefixed with primary to avoid shaddowing bugs. primaryTargetID := node.Resolver.Target primaryTarget := chain.Targets[primaryTargetID] - primaryTargetClusterData, ok := s.getTargetClusterData(upstreamsSnapshot, chain, primaryTargetID, forMeshGateway, false) - if !ok { + primaryTargetClusterName := s.getTargetClusterName(upstreamsSnapshot, chain, primaryTargetID, forMeshGateway, false) + if primaryTargetClusterName == "" { continue } - upstreamConfig := finalizeUpstreamConfig(rawUpstreamConfig, node.Resolver.ConnectTimeout) + upstreamConfig := finalizeUpstreamConfig(rawUpstreamConfig, chain, node.Resolver.ConnectTimeout) if forMeshGateway && !cfgSnap.Locality.Matches(primaryTarget.Datacenter, primaryTarget.Partition) { s.Logger.Warn("ignoring discovery chain target that crosses a datacenter or partition boundary in a mesh gateway", @@ -1261,28 +1260,27 @@ func (s *ResourceGenerator) makeUpstreamClustersForDiscoveryChain( continue } - // Construct the information required to make target clusters. When - // failover is configured, create the aggregate cluster. - var targetClustersData []targetClusterData - if failover != nil && !forMeshGateway { - var failoverClusterNames []string - for _, tid := range append([]string{primaryTargetID}, failover.Targets...) { - if td, ok := s.getTargetClusterData(upstreamsSnapshot, chain, tid, forMeshGateway, true); ok { - targetClustersData = append(targetClustersData, td) - failoverClusterNames = append(failoverClusterNames, td.clusterName) - } + mappedTargets, err := s.mapDiscoChainTargets(cfgSnap, chain, node, upstreamConfig, forMeshGateway) + if err != nil { + return nil, err + } + + var failoverClusterNames []string + if mappedTargets.failover { + for _, targetGroup := range mappedTargets.groupedTargets() { + failoverClusterNames = append(failoverClusterNames, targetGroup.ClusterName) } aggregateClusterConfig, err := anypb.New(&envoy_aggregate_cluster_v3.ClusterConfig{ Clusters: failoverClusterNames, }) if err != nil { - return nil, fmt.Errorf("failed to construct the aggregate cluster %q: %v", primaryTargetClusterData.clusterName, err) + return nil, fmt.Errorf("failed to construct the aggregate cluster %q: %v", mappedTargets.baseClusterName, err) } c := &envoy_cluster_v3.Cluster{ - Name: primaryTargetClusterData.clusterName, - AltStatName: primaryTargetClusterData.clusterName, + Name: mappedTargets.baseClusterName, + AltStatName: mappedTargets.baseClusterName, ConnectTimeout: durationpb.New(node.Resolver.ConnectTimeout), LbPolicy: envoy_cluster_v3.Cluster_CLUSTER_PROVIDED, ClusterDiscoveryType: &envoy_cluster_v3.Cluster_ClusterType{ @@ -1294,43 +1292,14 @@ func (s *ResourceGenerator) makeUpstreamClustersForDiscoveryChain( } out = append(out, c) - } else { - targetClustersData = append(targetClustersData, primaryTargetClusterData) } // Construct the target clusters. - for _, targetData := range targetClustersData { - target := chain.Targets[targetData.targetID] - sni := target.SNI - - targetUID := proxycfg.NewUpstreamIDFromTargetID(targetData.targetID) - if targetUID.Peer != "" { - peerMeta, found := upstreamsSnapshot.UpstreamPeerMeta(targetUID) - if !found { - s.Logger.Warn("failed to fetch upstream peering metadata for cluster", "target", targetUID) - } - upstreamCluster, err := s.makeUpstreamClusterForPeerService(targetUID, upstreamConfig, peerMeta, cfgSnap) - if err != nil { - continue - } - // Override the cluster name to include the failover-target~ prefix. - upstreamCluster.Name = targetData.clusterName - out = append(out, upstreamCluster) - continue - } - - targetSpiffeID := connect.SpiffeIDService{ - Host: cfgSnap.Roots.TrustDomain, - Namespace: target.Namespace, - Partition: target.Partition, - Datacenter: target.Datacenter, - Service: target.Service, - }.URI().String() - - s.Logger.Debug("generating cluster for", "cluster", targetData.clusterName) + for _, groupedTarget := range mappedTargets.groupedTargets() { + s.Logger.Debug("generating cluster for", "cluster", groupedTarget.ClusterName) c := &envoy_cluster_v3.Cluster{ - Name: targetData.clusterName, - AltStatName: targetData.clusterName, + Name: groupedTarget.ClusterName, + AltStatName: groupedTarget.ClusterName, ConnectTimeout: durationpb.New(node.Resolver.ConnectTimeout), ClusterDiscoveryType: &envoy_cluster_v3.Cluster_Type{Type: envoy_cluster_v3.Cluster_EDS}, CommonLbConfig: &envoy_cluster_v3.Cluster_CommonLbConfig{ @@ -1358,7 +1327,7 @@ func (s *ResourceGenerator) makeUpstreamClustersForDiscoveryChain( lb = node.LoadBalancer } if err := injectLBToCluster(lb, c); err != nil { - return nil, fmt.Errorf("failed to apply load balancer configuration to cluster %q: %v", targetData.clusterName, err) + return nil, fmt.Errorf("failed to apply load balancer configuration to cluster %q: %v", groupedTarget.ClusterName, err) } if upstreamConfig.Protocol == "http2" || upstreamConfig.Protocol == "grpc" { @@ -1367,29 +1336,17 @@ func (s *ResourceGenerator) makeUpstreamClustersForDiscoveryChain( } } - configureTLS := true - if forMeshGateway { - // We only initiate TLS if we're doing an L7 proxy. - configureTLS = structs.IsProtocolHTTPLike(upstreamConfig.Protocol) + switch len(groupedTarget.Targets) { + case 0: + continue + case 1: + // We expect one target so this passes through to continue setting the cluster up. + default: + return nil, fmt.Errorf("cannot have more than one target") } - if configureTLS { - commonTLSContext := makeCommonTLSContext( - cfgSnap.Leaf(), - cfgSnap.RootPEMs(), - makeTLSParametersFromProxyTLSConfig(cfgSnap.MeshConfigTLSOutgoing()), - ) - - err = injectSANMatcher(commonTLSContext, targetSpiffeID) - if err != nil { - return nil, fmt.Errorf("failed to inject SAN matcher rules for cluster %q: %v", sni, err) - } - - tlsContext := &envoy_tls_v3.UpstreamTlsContext{ - CommonTlsContext: commonTLSContext, - Sni: sni, - } - transportSocket, err := makeUpstreamTLSTransportSocket(tlsContext) + if targetInfo := groupedTarget.Targets[0]; targetInfo.TLSContext != nil { + transportSocket, err := makeUpstreamTLSTransportSocket(targetInfo.TLSContext) if err != nil { return nil, err } @@ -1894,7 +1851,7 @@ type targetClusterData struct { clusterName string } -func (s *ResourceGenerator) getTargetClusterData(upstreamsSnapshot *proxycfg.ConfigSnapshotUpstreams, chain *structs.CompiledDiscoveryChain, tid string, forMeshGateway bool, failover bool) (targetClusterData, bool) { +func (s *ResourceGenerator) getTargetClusterName(upstreamsSnapshot *proxycfg.ConfigSnapshotUpstreams, chain *structs.CompiledDiscoveryChain, tid string, forMeshGateway bool, failover bool) string { target := chain.Targets[tid] clusterName := target.Name targetUID := proxycfg.NewUpstreamIDFromTargetID(tid) @@ -1907,7 +1864,7 @@ func (s *ResourceGenerator) getTargetClusterData(upstreamsSnapshot *proxycfg.Con "peer", targetUID.Peer, "target", tid, ) - return targetClusterData{}, false + return "" } clusterName = generatePeeredClusterName(targetUID, tbs) @@ -1919,8 +1876,125 @@ func (s *ResourceGenerator) getTargetClusterData(upstreamsSnapshot *proxycfg.Con if forMeshGateway { clusterName = meshGatewayExportedClusterNamePrefix + clusterName } - return targetClusterData{ - targetID: tid, - clusterName: clusterName, - }, true + return clusterName +} + +type discoChainTargets struct { + baseClusterName string + targets []targetInfo + failover bool +} + +type targetInfo struct { + TargetID string + TLSContext *envoy_tls_v3.UpstreamTlsContext +} + +type discoChainTargetGroup struct { + Targets []targetInfo + ClusterName string +} + +func (ft discoChainTargets) groupedTargets() []discoChainTargetGroup { + var targetGroups []discoChainTargetGroup + + if !ft.failover { + targetGroups = append(targetGroups, discoChainTargetGroup{ + ClusterName: ft.baseClusterName, + Targets: ft.targets, + }) + return targetGroups + } + + for i, t := range ft.targets { + targetGroups = append(targetGroups, discoChainTargetGroup{ + ClusterName: fmt.Sprintf("%s%d~%s", failoverClusterNamePrefix, i, ft.baseClusterName), + Targets: []targetInfo{t}, + }) + } + + return targetGroups +} + +func (s *ResourceGenerator) mapDiscoChainTargets(cfgSnap *proxycfg.ConfigSnapshot, chain *structs.CompiledDiscoveryChain, node *structs.DiscoveryGraphNode, upstreamConfig structs.UpstreamConfig, forMeshGateway bool) (discoChainTargets, error) { + failoverTargets := discoChainTargets{} + + if node.Resolver == nil { + return discoChainTargets{}, fmt.Errorf("impossible to process a non-resolver node") + } + + primaryTargetID := node.Resolver.Target + upstreamsSnapshot, err := cfgSnap.ToConfigSnapshotUpstreams() + if err != nil && !forMeshGateway { + return discoChainTargets{}, err + } + + failoverTargets.baseClusterName = s.getTargetClusterName(upstreamsSnapshot, chain, primaryTargetID, forMeshGateway, false) + + tids := []string{primaryTargetID} + failover := node.Resolver.Failover + if failover != nil && !forMeshGateway { + tids = append(tids, failover.Targets...) + failoverTargets.failover = true + } + + for _, tid := range tids { + target := chain.Targets[tid] + var sni, rootPEMs string + var spiffeIDs []string + targetUID := proxycfg.NewUpstreamIDFromTargetID(tid) + ti := targetInfo{TargetID: tid} + + configureTLS := true + if forMeshGateway { + // We only initiate TLS if we're doing an L7 proxy. + configureTLS = structs.IsProtocolHTTPLike(upstreamConfig.Protocol) + } + + if !configureTLS { + failoverTargets.targets = append(failoverTargets.targets, ti) + continue + } + + if targetUID.Peer != "" { + tbs, _ := upstreamsSnapshot.UpstreamPeerTrustBundles.Get(targetUID.Peer) + rootPEMs = tbs.ConcatenatedRootPEMs() + + peerMeta, found := upstreamsSnapshot.UpstreamPeerMeta(targetUID) + if !found { + continue + } + sni = peerMeta.PrimarySNI() + spiffeIDs = peerMeta.SpiffeID + } else { + sni = target.SNI + rootPEMs = cfgSnap.RootPEMs() + spiffeIDs = []string{connect.SpiffeIDService{ + Host: cfgSnap.Roots.TrustDomain, + Namespace: target.Namespace, + Partition: target.Partition, + Datacenter: target.Datacenter, + Service: target.Service, + }.URI().String()} + } + commonTLSContext := makeCommonTLSContext( + cfgSnap.Leaf(), + rootPEMs, + makeTLSParametersFromProxyTLSConfig(cfgSnap.MeshConfigTLSOutgoing()), + ) + + err := injectSANMatcher(commonTLSContext, spiffeIDs...) + if err != nil { + return failoverTargets, fmt.Errorf("failed to inject SAN matcher rules for cluster %q: %v", sni, err) + } + + tlsContext := &envoy_tls_v3.UpstreamTlsContext{ + CommonTlsContext: commonTLSContext, + Sni: sni, + } + ti.TLSContext = tlsContext + failoverTargets.targets = append(failoverTargets.targets, ti) + } + + return failoverTargets, nil } diff --git a/agent/xds/endpoints.go b/agent/xds/endpoints.go index d117f8dd829..f0e8f47d3a3 100644 --- a/agent/xds/endpoints.go +++ b/agent/xds/endpoints.go @@ -621,14 +621,6 @@ func (s *ResourceGenerator) endpointsFromDiscoveryChain( upstreamConfigMap = make(map[string]interface{}) // TODO:needed? } - upstreamsSnapshot, err := cfgSnap.ToConfigSnapshotUpstreams() - - // Mesh gateways are exempt because upstreamsSnapshot is only used for - // cluster peering targets and transative failover/redirects are unsupported. - if err != nil && !forMeshGateway { - return nil, err - } - var resources []proto.Message var escapeHatchCluster *envoy_cluster_v3.Cluster @@ -664,44 +656,43 @@ func (s *ResourceGenerator) endpointsFromDiscoveryChain( // Find all resolver nodes. for _, node := range chain.Nodes { - if node.Type != structs.DiscoveryGraphNodeTypeResolver { + switch { + case node == nil: + return nil, fmt.Errorf("impossible to process a nil node") + case node.Type != structs.DiscoveryGraphNodeTypeResolver: continue + case node.Resolver == nil: + return nil, fmt.Errorf("impossible to process a non-resolver node") } - primaryTargetID := node.Resolver.Target - failover := node.Resolver.Failover - - var targetsClustersData []targetClusterData + rawUpstreamConfig, err := structs.ParseUpstreamConfigNoDefaults(upstreamConfigMap) + if err != nil { + return nil, err + } + upstreamConfig := finalizeUpstreamConfig(rawUpstreamConfig, chain, node.Resolver.ConnectTimeout) - var numFailoverTargets int - if failover != nil { - numFailoverTargets = len(failover.Targets) + mappedTargets, err := s.mapDiscoChainTargets(cfgSnap, chain, node, upstreamConfig, forMeshGateway) + if err != nil { + return nil, err } - if numFailoverTargets > 0 && !forMeshGateway { - for _, targetID := range append([]string{primaryTargetID}, failover.Targets...) { - targetData, ok := s.getTargetClusterData(upstreamsSnapshot, chain, targetID, forMeshGateway, true) - if !ok { - continue - } - if escapeHatchCluster != nil { - targetData.clusterName = escapeHatchCluster.Name - } - targetsClustersData = append(targetsClustersData, targetData) + for _, groupedTarget := range mappedTargets.groupedTargets() { + clusterName := groupedTarget.ClusterName + if escapeHatchCluster != nil { + clusterName = escapeHatchCluster.Name } - } else { - if td, ok := s.getTargetClusterData(upstreamsSnapshot, chain, primaryTargetID, forMeshGateway, false); ok { - if escapeHatchCluster != nil { - td.clusterName = escapeHatchCluster.Name - } - targetsClustersData = append(targetsClustersData, td) + switch len(groupedTarget.Targets) { + case 0: + continue + case 1: + // We expect one target so this passes through to continue setting the load assignment up. + default: + return nil, fmt.Errorf("cannot have more than one target") } - } - - for _, targetOpt := range targetsClustersData { - s.Logger.Debug("generating endpoints for", "cluster", targetOpt.clusterName) - targetUID := proxycfg.NewUpstreamIDFromTargetID(targetOpt.targetID) + ti := groupedTarget.Targets[0] + s.Logger.Debug("generating endpoints for", "cluster", clusterName, "targetID", ti.TargetID) + targetUID := proxycfg.NewUpstreamIDFromTargetID(ti.TargetID) if targetUID.Peer != "" { - loadAssignment, err := s.makeUpstreamLoadAssignmentForPeerService(cfgSnap, targetOpt.clusterName, targetUID, mgwMode) + loadAssignment, err := s.makeUpstreamLoadAssignmentForPeerService(cfgSnap, clusterName, targetUID, mgwMode) if err != nil { return nil, err } @@ -715,7 +706,7 @@ func (s *ResourceGenerator) endpointsFromDiscoveryChain( chain.Targets, upstreamEndpoints, gatewayEndpoints, - targetOpt.targetID, + ti.TargetID, gatewayKey, forMeshGateway, ) @@ -724,7 +715,7 @@ func (s *ResourceGenerator) endpointsFromDiscoveryChain( } la := makeLoadAssignment( - targetOpt.clusterName, + clusterName, []loadAssignmentEndpointGroup{endpointGroup}, gatewayKey, ) diff --git a/agent/xds/golden_test.go b/agent/xds/golden_test.go index 420285203e0..c056aa7b3a0 100644 --- a/agent/xds/golden_test.go +++ b/agent/xds/golden_test.go @@ -1,6 +1,7 @@ package xds import ( + "encoding/json" "flag" "fmt" "os" @@ -8,6 +9,7 @@ import ( "testing" "github.com/hashicorp/go-version" + "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "google.golang.org/protobuf/encoding/protojson" "google.golang.org/protobuf/proto" @@ -83,12 +85,16 @@ func golden(t *testing.T, name, subname, latestSubname, got string) string { golden := filepath.Join("testdata", name+suffix) - // Always load the latest golden file if configured to do so. - latestExpected := "" - if latestSubname != "" && subname != latestSubname { - latestGolden := filepath.Join("testdata", fmt.Sprintf("%s.%s.golden", name, latestSubname)) - raw, err := os.ReadFile(latestGolden) - require.NoError(t, err, "%q %q %q", name, subname, latestSubname) + var latestGoldenPath, latestExpected string + isLatest := subname == latestSubname + // Include latestSubname in the latest golden path if it exists. + if latestSubname == "" { + latestGoldenPath = filepath.Join("testdata", fmt.Sprintf("%s.golden", name)) + } else { + latestGoldenPath = filepath.Join("testdata", fmt.Sprintf("%s.%s.golden", name, latestSubname)) + } + + if raw, err := os.ReadFile(latestGoldenPath); err == nil { latestExpected = string(raw) } @@ -97,8 +103,14 @@ func golden(t *testing.T, name, subname, latestSubname, got string) string { // // To trim down PRs, we only create per-version golden files if they differ // from the latest version. + if *update && got != "" { - if latestExpected == got { + var gotInterface, latestExpectedInterface interface{} + json.Unmarshal([]byte(got), &gotInterface) + json.Unmarshal([]byte(latestExpected), &latestExpectedInterface) + + // Remove non-latest golden files if they are the same as the latest one. + if !isLatest && assert.ObjectsAreEqualValues(gotInterface, latestExpectedInterface) { // In update mode we erase a golden file if it is identical to // the golden file corresponding to the latest version of // envoy. @@ -109,7 +121,12 @@ func golden(t *testing.T, name, subname, latestSubname, got string) string { return got } - require.NoError(t, os.WriteFile(golden, []byte(got), 0644)) + // We use require.JSONEq to compare values and ObjectsAreEqualValues is used + // internally by that function to compare the string JSON values. This only + // writes updates the golden file when they actually change. + if !assert.ObjectsAreEqualValues(gotInterface, latestExpectedInterface) { + require.NoError(t, os.WriteFile(golden, []byte(got), 0644)) + } return got } diff --git a/agent/xds/listeners.go b/agent/xds/listeners.go index 1eb80d79cd6..962de5f7088 100644 --- a/agent/xds/listeners.go +++ b/agent/xds/listeners.go @@ -155,7 +155,7 @@ func (s *ResourceGenerator) listenersFromSnapshotConnectProxy(cfgSnap *proxycfg. // RDS, Envoy's Route Discovery Service, is only used for HTTP services with a customized discovery chain. useRDS := chain.Protocol != "tcp" && !chain.Default - var targetClusterData targetClusterData + var clusterName string if !useRDS { // When not using RDS we must generate a cluster name to attach to the filter chain. // With RDS, cluster names get attached to the dynamic routes instead. @@ -164,11 +164,10 @@ func (s *ResourceGenerator) listenersFromSnapshotConnectProxy(cfgSnap *proxycfg. return nil, err } - td, ok := s.getTargetClusterData(upstreamsSnapshot, chain, target.ID, false, false) - if !ok { + clusterName = s.getTargetClusterName(upstreamsSnapshot, chain, target.ID, false, false) + if clusterName == "" { continue } - targetClusterData = td } filterName := fmt.Sprintf("%s.%s.%s.%s", chain.ServiceName, chain.Namespace, chain.Partition, chain.Datacenter) @@ -178,7 +177,7 @@ func (s *ResourceGenerator) listenersFromSnapshotConnectProxy(cfgSnap *proxycfg. filterChain, err := s.makeUpstreamFilterChain(filterChainOpts{ accessLogs: &cfgSnap.Proxy.AccessLogs, routeName: uid.EnvoyID(), - clusterName: targetClusterData.clusterName, + clusterName: clusterName, filterName: filterName, protocol: cfg.Protocol, useRDS: useRDS, @@ -213,7 +212,7 @@ func (s *ResourceGenerator) listenersFromSnapshotConnectProxy(cfgSnap *proxycfg. filterChain, err := s.makeUpstreamFilterChain(filterChainOpts{ accessLogs: &cfgSnap.Proxy.AccessLogs, routeName: uid.EnvoyID(), - clusterName: targetClusterData.clusterName, + clusterName: clusterName, filterName: filterName, protocol: cfg.Protocol, useRDS: useRDS, diff --git a/agent/xds/routes.go b/agent/xds/routes.go index 46d8d2c0a8e..f0edd5c93d5 100644 --- a/agent/xds/routes.go +++ b/agent/xds/routes.go @@ -832,11 +832,11 @@ func (s *ResourceGenerator) makeRouteActionForChainCluster( chain *structs.CompiledDiscoveryChain, forMeshGateway bool, ) (*envoy_route_v3.Route_Route, bool) { - td, ok := s.getTargetClusterData(upstreamsSnapshot, chain, targetID, forMeshGateway, false) - if !ok { + clusterName := s.getTargetClusterName(upstreamsSnapshot, chain, targetID, forMeshGateway, false) + if clusterName == "" { return nil, false } - return makeRouteActionFromName(td.clusterName), true + return makeRouteActionFromName(clusterName), true } func makeRouteActionFromName(clusterName string) *envoy_route_v3.Route_Route { @@ -864,8 +864,8 @@ func (s *ResourceGenerator) makeRouteActionForSplitter( } targetID := nextNode.Resolver.Target - targetOptions, ok := s.getTargetClusterData(upstreamsSnapshot, chain, targetID, forMeshGateway, false) - if !ok { + clusterName := s.getTargetClusterName(upstreamsSnapshot, chain, targetID, forMeshGateway, false) + if clusterName == "" { continue } @@ -873,7 +873,7 @@ func (s *ResourceGenerator) makeRouteActionForSplitter( // deals with integers so scale everything up by 100x. cw := &envoy_route_v3.WeightedCluster_ClusterWeight{ Weight: makeUint32Value(int(split.Weight * 100)), - Name: targetOptions.clusterName, + Name: clusterName, } if err := injectHeaderManipToWeightedCluster(split.Definition, cw); err != nil { return nil, err diff --git a/agent/xds/testdata/clusters/connect-proxy-with-chain-and-failover-to-cluster-peer.latest.golden b/agent/xds/testdata/clusters/connect-proxy-with-chain-and-failover-to-cluster-peer.latest.golden index 78d23803d12..b6a9d7ec120 100644 --- a/agent/xds/testdata/clusters/connect-proxy-with-chain-and-failover-to-cluster-peer.latest.golden +++ b/agent/xds/testdata/clusters/connect-proxy-with-chain-and-failover-to-cluster-peer.latest.golden @@ -1,209 +1,182 @@ { - "versionInfo": "00000001", - "resources": [ + "versionInfo": "00000001", + "resources": [ { - "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", - "name": "db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", - "altStatName": "db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", - "clusterType": { - "name": "envoy.clusters.aggregate", - "typedConfig": { - "@type": "type.googleapis.com/envoy.extensions.clusters.aggregate.v3.ClusterConfig", - "clusters": [ - "failover-target~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", - "failover-target~db.default.cluster-01.external.peer1.domain" + "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", + "name": "db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "altStatName": "db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "clusterType": { + "name": "envoy.clusters.aggregate", + "typedConfig": { + "@type": "type.googleapis.com/envoy.extensions.clusters.aggregate.v3.ClusterConfig", + "clusters": [ + "failover-target~0~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "failover-target~1~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul" ] } }, - "connectTimeout": "33s", - "lbPolicy": "CLUSTER_PROVIDED" + "connectTimeout": "33s", + "lbPolicy": "CLUSTER_PROVIDED" }, { - "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", - "name": "failover-target~db.default.cluster-01.external.peer1.domain", - "type": "EDS", - "edsClusterConfig": { - "edsConfig": { - "ads": { - - }, - "resourceApiVersion": "V3" + "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", + "name": "failover-target~0~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "altStatName": "failover-target~0~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "type": "EDS", + "edsClusterConfig": { + "edsConfig": { + "ads": {}, + "resourceApiVersion": "V3" } }, - "connectTimeout": "1s", - "circuitBreakers": { - - }, - "outlierDetection": { - "maxEjectionPercent": 100 - }, - "commonLbConfig": { - "healthyPanicThreshold": { - - } + "connectTimeout": "33s", + "circuitBreakers": {}, + "outlierDetection": {}, + "commonLbConfig": { + "healthyPanicThreshold": {} }, - "transportSocket": { - "name": "tls", - "typedConfig": { - "@type": "type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext", - "commonTlsContext": { - "tlsParams": { - - }, - "tlsCertificates": [ + "transportSocket": { + "name": "tls", + "typedConfig": { + "@type": "type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext", + "commonTlsContext": { + "tlsParams": {}, + "tlsCertificates": [ { - "certificateChain": { - "inlineString": "-----BEGIN CERTIFICATE-----\nMIICjDCCAjKgAwIBAgIIC5llxGV1gB8wCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowDjEMMAoG\nA1UEAxMDd2ViMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEADPv1RHVNRfa2VKR\nAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Favq5E0ivpNtv1QnFhxtPd7d5k4e+T7\nSkW1TaOCAXIwggFuMA4GA1UdDwEB/wQEAwIDuDAdBgNVHSUEFjAUBggrBgEFBQcD\nAgYIKwYBBQUHAwEwDAYDVR0TAQH/BAIwADBoBgNVHQ4EYQRfN2Q6MDc6ODc6M2E6\nNDA6MTk6NDc6YzM6NWE6YzA6YmE6NjI6ZGY6YWY6NGI6ZDQ6MDU6MjU6NzY6M2Q6\nNWE6OGQ6MTY6OGQ6Njc6NWU6MmU6YTA6MzQ6N2Q6ZGM6ZmYwagYDVR0jBGMwYYBf\nZDE6MTE6MTE6YWM6MmE6YmE6OTc6YjI6M2Y6YWM6N2I6YmQ6ZGE6YmU6YjE6OGE6\nZmM6OWE6YmE6YjU6YmM6ODM6ZTc6NWU6NDE6NmY6ZjI6NzM6OTU6NTg6MGM6ZGIw\nWQYDVR0RBFIwUIZOc3BpZmZlOi8vMTExMTExMTEtMjIyMi0zMzMzLTQ0NDQtNTU1\nNTU1NTU1NTU1LmNvbnN1bC9ucy9kZWZhdWx0L2RjL2RjMS9zdmMvd2ViMAoGCCqG\nSM49BAMCA0gAMEUCIGC3TTvvjj76KMrguVyFf4tjOqaSCRie3nmHMRNNRav7AiEA\npY0heYeK9A6iOLrzqxSerkXXQyj5e9bE4VgUnxgPU6g=\n-----END CERTIFICATE-----\n" + "certificateChain": { + "inlineString": "-----BEGIN CERTIFICATE-----\nMIICjDCCAjKgAwIBAgIIC5llxGV1gB8wCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowDjEMMAoG\nA1UEAxMDd2ViMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEADPv1RHVNRfa2VKR\nAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Favq5E0ivpNtv1QnFhxtPd7d5k4e+T7\nSkW1TaOCAXIwggFuMA4GA1UdDwEB/wQEAwIDuDAdBgNVHSUEFjAUBggrBgEFBQcD\nAgYIKwYBBQUHAwEwDAYDVR0TAQH/BAIwADBoBgNVHQ4EYQRfN2Q6MDc6ODc6M2E6\nNDA6MTk6NDc6YzM6NWE6YzA6YmE6NjI6ZGY6YWY6NGI6ZDQ6MDU6MjU6NzY6M2Q6\nNWE6OGQ6MTY6OGQ6Njc6NWU6MmU6YTA6MzQ6N2Q6ZGM6ZmYwagYDVR0jBGMwYYBf\nZDE6MTE6MTE6YWM6MmE6YmE6OTc6YjI6M2Y6YWM6N2I6YmQ6ZGE6YmU6YjE6OGE6\nZmM6OWE6YmE6YjU6YmM6ODM6ZTc6NWU6NDE6NmY6ZjI6NzM6OTU6NTg6MGM6ZGIw\nWQYDVR0RBFIwUIZOc3BpZmZlOi8vMTExMTExMTEtMjIyMi0zMzMzLTQ0NDQtNTU1\nNTU1NTU1NTU1LmNvbnN1bC9ucy9kZWZhdWx0L2RjL2RjMS9zdmMvd2ViMAoGCCqG\nSM49BAMCA0gAMEUCIGC3TTvvjj76KMrguVyFf4tjOqaSCRie3nmHMRNNRav7AiEA\npY0heYeK9A6iOLrzqxSerkXXQyj5e9bE4VgUnxgPU6g=\n-----END CERTIFICATE-----\n" }, - "privateKey": { - "inlineString": "-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEIMoTkpRggp3fqZzFKh82yS4LjtJI+XY+qX/7DefHFrtdoAoGCCqGSM49\nAwEHoUQDQgAEADPv1RHVNRfa2VKRAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Fav\nq5E0ivpNtv1QnFhxtPd7d5k4e+T7SkW1TQ==\n-----END EC PRIVATE KEY-----\n" + "privateKey": { + "inlineString": "-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEIMoTkpRggp3fqZzFKh82yS4LjtJI+XY+qX/7DefHFrtdoAoGCCqGSM49\nAwEHoUQDQgAEADPv1RHVNRfa2VKRAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Fav\nq5E0ivpNtv1QnFhxtPd7d5k4e+T7SkW1TQ==\n-----END EC PRIVATE KEY-----\n" } } ], - "validationContext": { - "trustedCa": { - "inlineString": "peer1-root-1\n" + "validationContext": { + "trustedCa": { + "inlineString": "-----BEGIN CERTIFICATE-----\nMIICXDCCAgKgAwIBAgIICpZq70Z9LyUwCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowFDESMBAG\nA1UEAxMJVGVzdCBDQSAyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEIhywH1gx\nAsMwuF3ukAI5YL2jFxH6Usnma1HFSfVyxbXX1/uoZEYrj8yCAtdU2yoHETyd+Zx2\nThhRLP79pYegCaOCATwwggE4MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTAD\nAQH/MGgGA1UdDgRhBF9kMToxMToxMTphYzoyYTpiYTo5NzpiMjozZjphYzo3Yjpi\nZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1ZTo0MTo2ZjpmMjo3\nMzo5NTo1ODowYzpkYjBqBgNVHSMEYzBhgF9kMToxMToxMTphYzoyYTpiYTo5Nzpi\nMjozZjphYzo3YjpiZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1\nZTo0MTo2ZjpmMjo3Mzo5NTo1ODowYzpkYjA/BgNVHREEODA2hjRzcGlmZmU6Ly8x\nMTExMTExMS0yMjIyLTMzMzMtNDQ0NC01NTU1NTU1NTU1NTUuY29uc3VsMAoGCCqG\nSM49BAMCA0gAMEUCICOY0i246rQHJt8o8Oya0D5PLL1FnmsQmQqIGCi31RwnAiEA\noR5f6Ku+cig2Il8T8LJujOp2/2A72QcHZA57B13y+8o=\n-----END CERTIFICATE-----\n" }, - "matchSubjectAltNames": [ + "matchSubjectAltNames": [ { - "exact": "spiffe://1c053652-8512-4373-90cf-5a7f6263a994.consul/ns/default/dc/cluster-01-dc/svc/db" + "exact": "spiffe://11111111-2222-3333-4444-555555555555.consul/ns/default/dc/dc1/svc/db" } ] } }, - "sni": "db.default.default.cluster-01.external.1c053652-8512-4373-90cf-5a7f6263a994.consul" + "sni": "db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul" } } }, { - "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", - "name": "failover-target~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", - "altStatName": "failover-target~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", - "type": "EDS", - "edsClusterConfig": { - "edsConfig": { - "ads": { - - }, - "resourceApiVersion": "V3" + "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", + "name": "failover-target~1~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "altStatName": "failover-target~1~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "type": "EDS", + "edsClusterConfig": { + "edsConfig": { + "ads": {}, + "resourceApiVersion": "V3" } }, - "connectTimeout": "33s", - "circuitBreakers": { - - }, - "outlierDetection": { - + "connectTimeout": "33s", + "circuitBreakers": {}, + "outlierDetection": {}, + "commonLbConfig": { + "healthyPanicThreshold": {} }, - "commonLbConfig": { - "healthyPanicThreshold": { - - } - }, - "transportSocket": { - "name": "tls", - "typedConfig": { - "@type": "type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext", - "commonTlsContext": { - "tlsParams": { - - }, - "tlsCertificates": [ + "transportSocket": { + "name": "tls", + "typedConfig": { + "@type": "type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext", + "commonTlsContext": { + "tlsParams": {}, + "tlsCertificates": [ { - "certificateChain": { - "inlineString": "-----BEGIN CERTIFICATE-----\nMIICjDCCAjKgAwIBAgIIC5llxGV1gB8wCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowDjEMMAoG\nA1UEAxMDd2ViMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEADPv1RHVNRfa2VKR\nAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Favq5E0ivpNtv1QnFhxtPd7d5k4e+T7\nSkW1TaOCAXIwggFuMA4GA1UdDwEB/wQEAwIDuDAdBgNVHSUEFjAUBggrBgEFBQcD\nAgYIKwYBBQUHAwEwDAYDVR0TAQH/BAIwADBoBgNVHQ4EYQRfN2Q6MDc6ODc6M2E6\nNDA6MTk6NDc6YzM6NWE6YzA6YmE6NjI6ZGY6YWY6NGI6ZDQ6MDU6MjU6NzY6M2Q6\nNWE6OGQ6MTY6OGQ6Njc6NWU6MmU6YTA6MzQ6N2Q6ZGM6ZmYwagYDVR0jBGMwYYBf\nZDE6MTE6MTE6YWM6MmE6YmE6OTc6YjI6M2Y6YWM6N2I6YmQ6ZGE6YmU6YjE6OGE6\nZmM6OWE6YmE6YjU6YmM6ODM6ZTc6NWU6NDE6NmY6ZjI6NzM6OTU6NTg6MGM6ZGIw\nWQYDVR0RBFIwUIZOc3BpZmZlOi8vMTExMTExMTEtMjIyMi0zMzMzLTQ0NDQtNTU1\nNTU1NTU1NTU1LmNvbnN1bC9ucy9kZWZhdWx0L2RjL2RjMS9zdmMvd2ViMAoGCCqG\nSM49BAMCA0gAMEUCIGC3TTvvjj76KMrguVyFf4tjOqaSCRie3nmHMRNNRav7AiEA\npY0heYeK9A6iOLrzqxSerkXXQyj5e9bE4VgUnxgPU6g=\n-----END CERTIFICATE-----\n" + "certificateChain": { + "inlineString": "-----BEGIN CERTIFICATE-----\nMIICjDCCAjKgAwIBAgIIC5llxGV1gB8wCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowDjEMMAoG\nA1UEAxMDd2ViMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEADPv1RHVNRfa2VKR\nAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Favq5E0ivpNtv1QnFhxtPd7d5k4e+T7\nSkW1TaOCAXIwggFuMA4GA1UdDwEB/wQEAwIDuDAdBgNVHSUEFjAUBggrBgEFBQcD\nAgYIKwYBBQUHAwEwDAYDVR0TAQH/BAIwADBoBgNVHQ4EYQRfN2Q6MDc6ODc6M2E6\nNDA6MTk6NDc6YzM6NWE6YzA6YmE6NjI6ZGY6YWY6NGI6ZDQ6MDU6MjU6NzY6M2Q6\nNWE6OGQ6MTY6OGQ6Njc6NWU6MmU6YTA6MzQ6N2Q6ZGM6ZmYwagYDVR0jBGMwYYBf\nZDE6MTE6MTE6YWM6MmE6YmE6OTc6YjI6M2Y6YWM6N2I6YmQ6ZGE6YmU6YjE6OGE6\nZmM6OWE6YmE6YjU6YmM6ODM6ZTc6NWU6NDE6NmY6ZjI6NzM6OTU6NTg6MGM6ZGIw\nWQYDVR0RBFIwUIZOc3BpZmZlOi8vMTExMTExMTEtMjIyMi0zMzMzLTQ0NDQtNTU1\nNTU1NTU1NTU1LmNvbnN1bC9ucy9kZWZhdWx0L2RjL2RjMS9zdmMvd2ViMAoGCCqG\nSM49BAMCA0gAMEUCIGC3TTvvjj76KMrguVyFf4tjOqaSCRie3nmHMRNNRav7AiEA\npY0heYeK9A6iOLrzqxSerkXXQyj5e9bE4VgUnxgPU6g=\n-----END CERTIFICATE-----\n" }, - "privateKey": { - "inlineString": "-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEIMoTkpRggp3fqZzFKh82yS4LjtJI+XY+qX/7DefHFrtdoAoGCCqGSM49\nAwEHoUQDQgAEADPv1RHVNRfa2VKRAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Fav\nq5E0ivpNtv1QnFhxtPd7d5k4e+T7SkW1TQ==\n-----END EC PRIVATE KEY-----\n" + "privateKey": { + "inlineString": "-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEIMoTkpRggp3fqZzFKh82yS4LjtJI+XY+qX/7DefHFrtdoAoGCCqGSM49\nAwEHoUQDQgAEADPv1RHVNRfa2VKRAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Fav\nq5E0ivpNtv1QnFhxtPd7d5k4e+T7SkW1TQ==\n-----END EC PRIVATE KEY-----\n" } } ], - "validationContext": { - "trustedCa": { - "inlineString": "-----BEGIN CERTIFICATE-----\nMIICXDCCAgKgAwIBAgIICpZq70Z9LyUwCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowFDESMBAG\nA1UEAxMJVGVzdCBDQSAyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEIhywH1gx\nAsMwuF3ukAI5YL2jFxH6Usnma1HFSfVyxbXX1/uoZEYrj8yCAtdU2yoHETyd+Zx2\nThhRLP79pYegCaOCATwwggE4MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTAD\nAQH/MGgGA1UdDgRhBF9kMToxMToxMTphYzoyYTpiYTo5NzpiMjozZjphYzo3Yjpi\nZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1ZTo0MTo2ZjpmMjo3\nMzo5NTo1ODowYzpkYjBqBgNVHSMEYzBhgF9kMToxMToxMTphYzoyYTpiYTo5Nzpi\nMjozZjphYzo3YjpiZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1\nZTo0MTo2ZjpmMjo3Mzo5NTo1ODowYzpkYjA/BgNVHREEODA2hjRzcGlmZmU6Ly8x\nMTExMTExMS0yMjIyLTMzMzMtNDQ0NC01NTU1NTU1NTU1NTUuY29uc3VsMAoGCCqG\nSM49BAMCA0gAMEUCICOY0i246rQHJt8o8Oya0D5PLL1FnmsQmQqIGCi31RwnAiEA\noR5f6Ku+cig2Il8T8LJujOp2/2A72QcHZA57B13y+8o=\n-----END CERTIFICATE-----\n" + "validationContext": { + "trustedCa": { + "inlineString": "peer1-root-1\n" }, - "matchSubjectAltNames": [ + "matchSubjectAltNames": [ { - "exact": "spiffe://11111111-2222-3333-4444-555555555555.consul/ns/default/dc/dc1/svc/db" + "exact": "spiffe://1c053652-8512-4373-90cf-5a7f6263a994.consul/ns/default/dc/cluster-01-dc/svc/db" } ] } }, - "sni": "db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul" + "sni": "db.default.default.cluster-01.external.1c053652-8512-4373-90cf-5a7f6263a994.consul" } } }, { - "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", - "name": "geo-cache.default.dc1.query.11111111-2222-3333-4444-555555555555.consul", - "type": "EDS", - "edsClusterConfig": { - "edsConfig": { - "ads": { - - }, - "resourceApiVersion": "V3" + "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", + "name": "geo-cache.default.dc1.query.11111111-2222-3333-4444-555555555555.consul", + "type": "EDS", + "edsClusterConfig": { + "edsConfig": { + "ads": {}, + "resourceApiVersion": "V3" } }, - "connectTimeout": "5s", - "circuitBreakers": { - - }, - "outlierDetection": { - - }, - "transportSocket": { - "name": "tls", - "typedConfig": { - "@type": "type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext", - "commonTlsContext": { - "tlsParams": { - - }, - "tlsCertificates": [ + "connectTimeout": "5s", + "circuitBreakers": {}, + "outlierDetection": {}, + "transportSocket": { + "name": "tls", + "typedConfig": { + "@type": "type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext", + "commonTlsContext": { + "tlsParams": {}, + "tlsCertificates": [ { - "certificateChain": { - "inlineString": "-----BEGIN CERTIFICATE-----\nMIICjDCCAjKgAwIBAgIIC5llxGV1gB8wCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowDjEMMAoG\nA1UEAxMDd2ViMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEADPv1RHVNRfa2VKR\nAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Favq5E0ivpNtv1QnFhxtPd7d5k4e+T7\nSkW1TaOCAXIwggFuMA4GA1UdDwEB/wQEAwIDuDAdBgNVHSUEFjAUBggrBgEFBQcD\nAgYIKwYBBQUHAwEwDAYDVR0TAQH/BAIwADBoBgNVHQ4EYQRfN2Q6MDc6ODc6M2E6\nNDA6MTk6NDc6YzM6NWE6YzA6YmE6NjI6ZGY6YWY6NGI6ZDQ6MDU6MjU6NzY6M2Q6\nNWE6OGQ6MTY6OGQ6Njc6NWU6MmU6YTA6MzQ6N2Q6ZGM6ZmYwagYDVR0jBGMwYYBf\nZDE6MTE6MTE6YWM6MmE6YmE6OTc6YjI6M2Y6YWM6N2I6YmQ6ZGE6YmU6YjE6OGE6\nZmM6OWE6YmE6YjU6YmM6ODM6ZTc6NWU6NDE6NmY6ZjI6NzM6OTU6NTg6MGM6ZGIw\nWQYDVR0RBFIwUIZOc3BpZmZlOi8vMTExMTExMTEtMjIyMi0zMzMzLTQ0NDQtNTU1\nNTU1NTU1NTU1LmNvbnN1bC9ucy9kZWZhdWx0L2RjL2RjMS9zdmMvd2ViMAoGCCqG\nSM49BAMCA0gAMEUCIGC3TTvvjj76KMrguVyFf4tjOqaSCRie3nmHMRNNRav7AiEA\npY0heYeK9A6iOLrzqxSerkXXQyj5e9bE4VgUnxgPU6g=\n-----END CERTIFICATE-----\n" + "certificateChain": { + "inlineString": "-----BEGIN CERTIFICATE-----\nMIICjDCCAjKgAwIBAgIIC5llxGV1gB8wCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowDjEMMAoG\nA1UEAxMDd2ViMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEADPv1RHVNRfa2VKR\nAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Favq5E0ivpNtv1QnFhxtPd7d5k4e+T7\nSkW1TaOCAXIwggFuMA4GA1UdDwEB/wQEAwIDuDAdBgNVHSUEFjAUBggrBgEFBQcD\nAgYIKwYBBQUHAwEwDAYDVR0TAQH/BAIwADBoBgNVHQ4EYQRfN2Q6MDc6ODc6M2E6\nNDA6MTk6NDc6YzM6NWE6YzA6YmE6NjI6ZGY6YWY6NGI6ZDQ6MDU6MjU6NzY6M2Q6\nNWE6OGQ6MTY6OGQ6Njc6NWU6MmU6YTA6MzQ6N2Q6ZGM6ZmYwagYDVR0jBGMwYYBf\nZDE6MTE6MTE6YWM6MmE6YmE6OTc6YjI6M2Y6YWM6N2I6YmQ6ZGE6YmU6YjE6OGE6\nZmM6OWE6YmE6YjU6YmM6ODM6ZTc6NWU6NDE6NmY6ZjI6NzM6OTU6NTg6MGM6ZGIw\nWQYDVR0RBFIwUIZOc3BpZmZlOi8vMTExMTExMTEtMjIyMi0zMzMzLTQ0NDQtNTU1\nNTU1NTU1NTU1LmNvbnN1bC9ucy9kZWZhdWx0L2RjL2RjMS9zdmMvd2ViMAoGCCqG\nSM49BAMCA0gAMEUCIGC3TTvvjj76KMrguVyFf4tjOqaSCRie3nmHMRNNRav7AiEA\npY0heYeK9A6iOLrzqxSerkXXQyj5e9bE4VgUnxgPU6g=\n-----END CERTIFICATE-----\n" }, - "privateKey": { - "inlineString": "-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEIMoTkpRggp3fqZzFKh82yS4LjtJI+XY+qX/7DefHFrtdoAoGCCqGSM49\nAwEHoUQDQgAEADPv1RHVNRfa2VKRAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Fav\nq5E0ivpNtv1QnFhxtPd7d5k4e+T7SkW1TQ==\n-----END EC PRIVATE KEY-----\n" + "privateKey": { + "inlineString": "-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEIMoTkpRggp3fqZzFKh82yS4LjtJI+XY+qX/7DefHFrtdoAoGCCqGSM49\nAwEHoUQDQgAEADPv1RHVNRfa2VKRAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Fav\nq5E0ivpNtv1QnFhxtPd7d5k4e+T7SkW1TQ==\n-----END EC PRIVATE KEY-----\n" } } ], - "validationContext": { - "trustedCa": { - "inlineString": "-----BEGIN CERTIFICATE-----\nMIICXDCCAgKgAwIBAgIICpZq70Z9LyUwCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowFDESMBAG\nA1UEAxMJVGVzdCBDQSAyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEIhywH1gx\nAsMwuF3ukAI5YL2jFxH6Usnma1HFSfVyxbXX1/uoZEYrj8yCAtdU2yoHETyd+Zx2\nThhRLP79pYegCaOCATwwggE4MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTAD\nAQH/MGgGA1UdDgRhBF9kMToxMToxMTphYzoyYTpiYTo5NzpiMjozZjphYzo3Yjpi\nZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1ZTo0MTo2ZjpmMjo3\nMzo5NTo1ODowYzpkYjBqBgNVHSMEYzBhgF9kMToxMToxMTphYzoyYTpiYTo5Nzpi\nMjozZjphYzo3YjpiZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1\nZTo0MTo2ZjpmMjo3Mzo5NTo1ODowYzpkYjA/BgNVHREEODA2hjRzcGlmZmU6Ly8x\nMTExMTExMS0yMjIyLTMzMzMtNDQ0NC01NTU1NTU1NTU1NTUuY29uc3VsMAoGCCqG\nSM49BAMCA0gAMEUCICOY0i246rQHJt8o8Oya0D5PLL1FnmsQmQqIGCi31RwnAiEA\noR5f6Ku+cig2Il8T8LJujOp2/2A72QcHZA57B13y+8o=\n-----END CERTIFICATE-----\n" + "validationContext": { + "trustedCa": { + "inlineString": "-----BEGIN CERTIFICATE-----\nMIICXDCCAgKgAwIBAgIICpZq70Z9LyUwCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowFDESMBAG\nA1UEAxMJVGVzdCBDQSAyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEIhywH1gx\nAsMwuF3ukAI5YL2jFxH6Usnma1HFSfVyxbXX1/uoZEYrj8yCAtdU2yoHETyd+Zx2\nThhRLP79pYegCaOCATwwggE4MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTAD\nAQH/MGgGA1UdDgRhBF9kMToxMToxMTphYzoyYTpiYTo5NzpiMjozZjphYzo3Yjpi\nZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1ZTo0MTo2ZjpmMjo3\nMzo5NTo1ODowYzpkYjBqBgNVHSMEYzBhgF9kMToxMToxMTphYzoyYTpiYTo5Nzpi\nMjozZjphYzo3YjpiZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1\nZTo0MTo2ZjpmMjo3Mzo5NTo1ODowYzpkYjA/BgNVHREEODA2hjRzcGlmZmU6Ly8x\nMTExMTExMS0yMjIyLTMzMzMtNDQ0NC01NTU1NTU1NTU1NTUuY29uc3VsMAoGCCqG\nSM49BAMCA0gAMEUCICOY0i246rQHJt8o8Oya0D5PLL1FnmsQmQqIGCi31RwnAiEA\noR5f6Ku+cig2Il8T8LJujOp2/2A72QcHZA57B13y+8o=\n-----END CERTIFICATE-----\n" }, - "matchSubjectAltNames": [ + "matchSubjectAltNames": [ { - "exact": "spiffe://11111111-2222-3333-4444-555555555555.consul/ns/default/dc/dc1/svc/geo-cache-target" + "exact": "spiffe://11111111-2222-3333-4444-555555555555.consul/ns/default/dc/dc1/svc/geo-cache-target" }, { - "exact": "spiffe://11111111-2222-3333-4444-555555555555.consul/ns/default/dc/dc2/svc/geo-cache-target" + "exact": "spiffe://11111111-2222-3333-4444-555555555555.consul/ns/default/dc/dc2/svc/geo-cache-target" } ] } }, - "sni": "geo-cache.default.dc1.query.11111111-2222-3333-4444-555555555555.consul" + "sni": "geo-cache.default.dc1.query.11111111-2222-3333-4444-555555555555.consul" } } }, { - "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", - "name": "local_app", - "type": "STATIC", - "connectTimeout": "5s", - "loadAssignment": { - "clusterName": "local_app", - "endpoints": [ + "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", + "name": "local_app", + "type": "STATIC", + "connectTimeout": "5s", + "loadAssignment": { + "clusterName": "local_app", + "endpoints": [ { - "lbEndpoints": [ + "lbEndpoints": [ { - "endpoint": { - "address": { - "socketAddress": { - "address": "127.0.0.1", - "portValue": 8080 + "endpoint": { + "address": { + "socketAddress": { + "address": "127.0.0.1", + "portValue": 8080 } } } @@ -214,6 +187,6 @@ } } ], - "typeUrl": "type.googleapis.com/envoy.config.cluster.v3.Cluster", - "nonce": "00000001" + "typeUrl": "type.googleapis.com/envoy.config.cluster.v3.Cluster", + "nonce": "00000001" } \ No newline at end of file diff --git a/agent/xds/testdata/clusters/connect-proxy-with-chain-and-failover.latest.golden b/agent/xds/testdata/clusters/connect-proxy-with-chain-and-failover.latest.golden index 8a6f88a866b..2f37bfe304d 100644 --- a/agent/xds/testdata/clusters/connect-proxy-with-chain-and-failover.latest.golden +++ b/agent/xds/testdata/clusters/connect-proxy-with-chain-and-failover.latest.golden @@ -1,210 +1,182 @@ { - "versionInfo": "00000001", - "resources": [ + "versionInfo": "00000001", + "resources": [ { - "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", - "name": "db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", - "altStatName": "db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", - "clusterType": { - "name": "envoy.clusters.aggregate", - "typedConfig": { - "@type": "type.googleapis.com/envoy.extensions.clusters.aggregate.v3.ClusterConfig", - "clusters": [ - "failover-target~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", - "failover-target~fail.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul" + "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", + "name": "db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "altStatName": "db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "clusterType": { + "name": "envoy.clusters.aggregate", + "typedConfig": { + "@type": "type.googleapis.com/envoy.extensions.clusters.aggregate.v3.ClusterConfig", + "clusters": [ + "failover-target~0~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "failover-target~1~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul" ] } }, - "connectTimeout": "33s", - "lbPolicy": "CLUSTER_PROVIDED" + "connectTimeout": "33s", + "lbPolicy": "CLUSTER_PROVIDED" }, { - "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", - "name": "failover-target~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", - "altStatName": "failover-target~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", - "type": "EDS", - "edsClusterConfig": { - "edsConfig": { - "ads": { - - }, - "resourceApiVersion": "V3" + "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", + "name": "failover-target~0~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "altStatName": "failover-target~0~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "type": "EDS", + "edsClusterConfig": { + "edsConfig": { + "ads": {}, + "resourceApiVersion": "V3" } }, - "connectTimeout": "33s", - "circuitBreakers": { - - }, - "outlierDetection": { - - }, - "commonLbConfig": { - "healthyPanicThreshold": { - - } + "connectTimeout": "33s", + "circuitBreakers": {}, + "outlierDetection": {}, + "commonLbConfig": { + "healthyPanicThreshold": {} }, - "transportSocket": { - "name": "tls", - "typedConfig": { - "@type": "type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext", - "commonTlsContext": { - "tlsParams": { - - }, - "tlsCertificates": [ + "transportSocket": { + "name": "tls", + "typedConfig": { + "@type": "type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext", + "commonTlsContext": { + "tlsParams": {}, + "tlsCertificates": [ { - "certificateChain": { - "inlineString": "-----BEGIN CERTIFICATE-----\nMIICjDCCAjKgAwIBAgIIC5llxGV1gB8wCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowDjEMMAoG\nA1UEAxMDd2ViMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEADPv1RHVNRfa2VKR\nAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Favq5E0ivpNtv1QnFhxtPd7d5k4e+T7\nSkW1TaOCAXIwggFuMA4GA1UdDwEB/wQEAwIDuDAdBgNVHSUEFjAUBggrBgEFBQcD\nAgYIKwYBBQUHAwEwDAYDVR0TAQH/BAIwADBoBgNVHQ4EYQRfN2Q6MDc6ODc6M2E6\nNDA6MTk6NDc6YzM6NWE6YzA6YmE6NjI6ZGY6YWY6NGI6ZDQ6MDU6MjU6NzY6M2Q6\nNWE6OGQ6MTY6OGQ6Njc6NWU6MmU6YTA6MzQ6N2Q6ZGM6ZmYwagYDVR0jBGMwYYBf\nZDE6MTE6MTE6YWM6MmE6YmE6OTc6YjI6M2Y6YWM6N2I6YmQ6ZGE6YmU6YjE6OGE6\nZmM6OWE6YmE6YjU6YmM6ODM6ZTc6NWU6NDE6NmY6ZjI6NzM6OTU6NTg6MGM6ZGIw\nWQYDVR0RBFIwUIZOc3BpZmZlOi8vMTExMTExMTEtMjIyMi0zMzMzLTQ0NDQtNTU1\nNTU1NTU1NTU1LmNvbnN1bC9ucy9kZWZhdWx0L2RjL2RjMS9zdmMvd2ViMAoGCCqG\nSM49BAMCA0gAMEUCIGC3TTvvjj76KMrguVyFf4tjOqaSCRie3nmHMRNNRav7AiEA\npY0heYeK9A6iOLrzqxSerkXXQyj5e9bE4VgUnxgPU6g=\n-----END CERTIFICATE-----\n" + "certificateChain": { + "inlineString": "-----BEGIN CERTIFICATE-----\nMIICjDCCAjKgAwIBAgIIC5llxGV1gB8wCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowDjEMMAoG\nA1UEAxMDd2ViMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEADPv1RHVNRfa2VKR\nAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Favq5E0ivpNtv1QnFhxtPd7d5k4e+T7\nSkW1TaOCAXIwggFuMA4GA1UdDwEB/wQEAwIDuDAdBgNVHSUEFjAUBggrBgEFBQcD\nAgYIKwYBBQUHAwEwDAYDVR0TAQH/BAIwADBoBgNVHQ4EYQRfN2Q6MDc6ODc6M2E6\nNDA6MTk6NDc6YzM6NWE6YzA6YmE6NjI6ZGY6YWY6NGI6ZDQ6MDU6MjU6NzY6M2Q6\nNWE6OGQ6MTY6OGQ6Njc6NWU6MmU6YTA6MzQ6N2Q6ZGM6ZmYwagYDVR0jBGMwYYBf\nZDE6MTE6MTE6YWM6MmE6YmE6OTc6YjI6M2Y6YWM6N2I6YmQ6ZGE6YmU6YjE6OGE6\nZmM6OWE6YmE6YjU6YmM6ODM6ZTc6NWU6NDE6NmY6ZjI6NzM6OTU6NTg6MGM6ZGIw\nWQYDVR0RBFIwUIZOc3BpZmZlOi8vMTExMTExMTEtMjIyMi0zMzMzLTQ0NDQtNTU1\nNTU1NTU1NTU1LmNvbnN1bC9ucy9kZWZhdWx0L2RjL2RjMS9zdmMvd2ViMAoGCCqG\nSM49BAMCA0gAMEUCIGC3TTvvjj76KMrguVyFf4tjOqaSCRie3nmHMRNNRav7AiEA\npY0heYeK9A6iOLrzqxSerkXXQyj5e9bE4VgUnxgPU6g=\n-----END CERTIFICATE-----\n" }, - "privateKey": { - "inlineString": "-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEIMoTkpRggp3fqZzFKh82yS4LjtJI+XY+qX/7DefHFrtdoAoGCCqGSM49\nAwEHoUQDQgAEADPv1RHVNRfa2VKRAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Fav\nq5E0ivpNtv1QnFhxtPd7d5k4e+T7SkW1TQ==\n-----END EC PRIVATE KEY-----\n" + "privateKey": { + "inlineString": "-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEIMoTkpRggp3fqZzFKh82yS4LjtJI+XY+qX/7DefHFrtdoAoGCCqGSM49\nAwEHoUQDQgAEADPv1RHVNRfa2VKRAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Fav\nq5E0ivpNtv1QnFhxtPd7d5k4e+T7SkW1TQ==\n-----END EC PRIVATE KEY-----\n" } } ], - "validationContext": { - "trustedCa": { - "inlineString": "-----BEGIN CERTIFICATE-----\nMIICXDCCAgKgAwIBAgIICpZq70Z9LyUwCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowFDESMBAG\nA1UEAxMJVGVzdCBDQSAyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEIhywH1gx\nAsMwuF3ukAI5YL2jFxH6Usnma1HFSfVyxbXX1/uoZEYrj8yCAtdU2yoHETyd+Zx2\nThhRLP79pYegCaOCATwwggE4MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTAD\nAQH/MGgGA1UdDgRhBF9kMToxMToxMTphYzoyYTpiYTo5NzpiMjozZjphYzo3Yjpi\nZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1ZTo0MTo2ZjpmMjo3\nMzo5NTo1ODowYzpkYjBqBgNVHSMEYzBhgF9kMToxMToxMTphYzoyYTpiYTo5Nzpi\nMjozZjphYzo3YjpiZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1\nZTo0MTo2ZjpmMjo3Mzo5NTo1ODowYzpkYjA/BgNVHREEODA2hjRzcGlmZmU6Ly8x\nMTExMTExMS0yMjIyLTMzMzMtNDQ0NC01NTU1NTU1NTU1NTUuY29uc3VsMAoGCCqG\nSM49BAMCA0gAMEUCICOY0i246rQHJt8o8Oya0D5PLL1FnmsQmQqIGCi31RwnAiEA\noR5f6Ku+cig2Il8T8LJujOp2/2A72QcHZA57B13y+8o=\n-----END CERTIFICATE-----\n" + "validationContext": { + "trustedCa": { + "inlineString": "-----BEGIN CERTIFICATE-----\nMIICXDCCAgKgAwIBAgIICpZq70Z9LyUwCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowFDESMBAG\nA1UEAxMJVGVzdCBDQSAyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEIhywH1gx\nAsMwuF3ukAI5YL2jFxH6Usnma1HFSfVyxbXX1/uoZEYrj8yCAtdU2yoHETyd+Zx2\nThhRLP79pYegCaOCATwwggE4MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTAD\nAQH/MGgGA1UdDgRhBF9kMToxMToxMTphYzoyYTpiYTo5NzpiMjozZjphYzo3Yjpi\nZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1ZTo0MTo2ZjpmMjo3\nMzo5NTo1ODowYzpkYjBqBgNVHSMEYzBhgF9kMToxMToxMTphYzoyYTpiYTo5Nzpi\nMjozZjphYzo3YjpiZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1\nZTo0MTo2ZjpmMjo3Mzo5NTo1ODowYzpkYjA/BgNVHREEODA2hjRzcGlmZmU6Ly8x\nMTExMTExMS0yMjIyLTMzMzMtNDQ0NC01NTU1NTU1NTU1NTUuY29uc3VsMAoGCCqG\nSM49BAMCA0gAMEUCICOY0i246rQHJt8o8Oya0D5PLL1FnmsQmQqIGCi31RwnAiEA\noR5f6Ku+cig2Il8T8LJujOp2/2A72QcHZA57B13y+8o=\n-----END CERTIFICATE-----\n" }, - "matchSubjectAltNames": [ + "matchSubjectAltNames": [ { - "exact": "spiffe://11111111-2222-3333-4444-555555555555.consul/ns/default/dc/dc1/svc/db" + "exact": "spiffe://11111111-2222-3333-4444-555555555555.consul/ns/default/dc/dc1/svc/db" } ] } }, - "sni": "db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul" + "sni": "db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul" } } }, { - "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", - "name": "failover-target~fail.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", - "altStatName": "failover-target~fail.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", - "type": "EDS", - "edsClusterConfig": { - "edsConfig": { - "ads": { - - }, - "resourceApiVersion": "V3" + "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", + "name": "failover-target~1~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "altStatName": "failover-target~1~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "type": "EDS", + "edsClusterConfig": { + "edsConfig": { + "ads": {}, + "resourceApiVersion": "V3" } }, - "connectTimeout": "33s", - "circuitBreakers": { - - }, - "outlierDetection": { - + "connectTimeout": "33s", + "circuitBreakers": {}, + "outlierDetection": {}, + "commonLbConfig": { + "healthyPanicThreshold": {} }, - "commonLbConfig": { - "healthyPanicThreshold": { - - } - }, - "transportSocket": { - "name": "tls", - "typedConfig": { - "@type": "type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext", - "commonTlsContext": { - "tlsParams": { - - }, - "tlsCertificates": [ + "transportSocket": { + "name": "tls", + "typedConfig": { + "@type": "type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext", + "commonTlsContext": { + "tlsParams": {}, + "tlsCertificates": [ { - "certificateChain": { - "inlineString": "-----BEGIN CERTIFICATE-----\nMIICjDCCAjKgAwIBAgIIC5llxGV1gB8wCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowDjEMMAoG\nA1UEAxMDd2ViMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEADPv1RHVNRfa2VKR\nAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Favq5E0ivpNtv1QnFhxtPd7d5k4e+T7\nSkW1TaOCAXIwggFuMA4GA1UdDwEB/wQEAwIDuDAdBgNVHSUEFjAUBggrBgEFBQcD\nAgYIKwYBBQUHAwEwDAYDVR0TAQH/BAIwADBoBgNVHQ4EYQRfN2Q6MDc6ODc6M2E6\nNDA6MTk6NDc6YzM6NWE6YzA6YmE6NjI6ZGY6YWY6NGI6ZDQ6MDU6MjU6NzY6M2Q6\nNWE6OGQ6MTY6OGQ6Njc6NWU6MmU6YTA6MzQ6N2Q6ZGM6ZmYwagYDVR0jBGMwYYBf\nZDE6MTE6MTE6YWM6MmE6YmE6OTc6YjI6M2Y6YWM6N2I6YmQ6ZGE6YmU6YjE6OGE6\nZmM6OWE6YmE6YjU6YmM6ODM6ZTc6NWU6NDE6NmY6ZjI6NzM6OTU6NTg6MGM6ZGIw\nWQYDVR0RBFIwUIZOc3BpZmZlOi8vMTExMTExMTEtMjIyMi0zMzMzLTQ0NDQtNTU1\nNTU1NTU1NTU1LmNvbnN1bC9ucy9kZWZhdWx0L2RjL2RjMS9zdmMvd2ViMAoGCCqG\nSM49BAMCA0gAMEUCIGC3TTvvjj76KMrguVyFf4tjOqaSCRie3nmHMRNNRav7AiEA\npY0heYeK9A6iOLrzqxSerkXXQyj5e9bE4VgUnxgPU6g=\n-----END CERTIFICATE-----\n" + "certificateChain": { + "inlineString": "-----BEGIN CERTIFICATE-----\nMIICjDCCAjKgAwIBAgIIC5llxGV1gB8wCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowDjEMMAoG\nA1UEAxMDd2ViMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEADPv1RHVNRfa2VKR\nAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Favq5E0ivpNtv1QnFhxtPd7d5k4e+T7\nSkW1TaOCAXIwggFuMA4GA1UdDwEB/wQEAwIDuDAdBgNVHSUEFjAUBggrBgEFBQcD\nAgYIKwYBBQUHAwEwDAYDVR0TAQH/BAIwADBoBgNVHQ4EYQRfN2Q6MDc6ODc6M2E6\nNDA6MTk6NDc6YzM6NWE6YzA6YmE6NjI6ZGY6YWY6NGI6ZDQ6MDU6MjU6NzY6M2Q6\nNWE6OGQ6MTY6OGQ6Njc6NWU6MmU6YTA6MzQ6N2Q6ZGM6ZmYwagYDVR0jBGMwYYBf\nZDE6MTE6MTE6YWM6MmE6YmE6OTc6YjI6M2Y6YWM6N2I6YmQ6ZGE6YmU6YjE6OGE6\nZmM6OWE6YmE6YjU6YmM6ODM6ZTc6NWU6NDE6NmY6ZjI6NzM6OTU6NTg6MGM6ZGIw\nWQYDVR0RBFIwUIZOc3BpZmZlOi8vMTExMTExMTEtMjIyMi0zMzMzLTQ0NDQtNTU1\nNTU1NTU1NTU1LmNvbnN1bC9ucy9kZWZhdWx0L2RjL2RjMS9zdmMvd2ViMAoGCCqG\nSM49BAMCA0gAMEUCIGC3TTvvjj76KMrguVyFf4tjOqaSCRie3nmHMRNNRav7AiEA\npY0heYeK9A6iOLrzqxSerkXXQyj5e9bE4VgUnxgPU6g=\n-----END CERTIFICATE-----\n" }, - "privateKey": { - "inlineString": "-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEIMoTkpRggp3fqZzFKh82yS4LjtJI+XY+qX/7DefHFrtdoAoGCCqGSM49\nAwEHoUQDQgAEADPv1RHVNRfa2VKRAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Fav\nq5E0ivpNtv1QnFhxtPd7d5k4e+T7SkW1TQ==\n-----END EC PRIVATE KEY-----\n" + "privateKey": { + "inlineString": "-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEIMoTkpRggp3fqZzFKh82yS4LjtJI+XY+qX/7DefHFrtdoAoGCCqGSM49\nAwEHoUQDQgAEADPv1RHVNRfa2VKRAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Fav\nq5E0ivpNtv1QnFhxtPd7d5k4e+T7SkW1TQ==\n-----END EC PRIVATE KEY-----\n" } } ], - "validationContext": { - "trustedCa": { - "inlineString": "-----BEGIN CERTIFICATE-----\nMIICXDCCAgKgAwIBAgIICpZq70Z9LyUwCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowFDESMBAG\nA1UEAxMJVGVzdCBDQSAyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEIhywH1gx\nAsMwuF3ukAI5YL2jFxH6Usnma1HFSfVyxbXX1/uoZEYrj8yCAtdU2yoHETyd+Zx2\nThhRLP79pYegCaOCATwwggE4MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTAD\nAQH/MGgGA1UdDgRhBF9kMToxMToxMTphYzoyYTpiYTo5NzpiMjozZjphYzo3Yjpi\nZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1ZTo0MTo2ZjpmMjo3\nMzo5NTo1ODowYzpkYjBqBgNVHSMEYzBhgF9kMToxMToxMTphYzoyYTpiYTo5Nzpi\nMjozZjphYzo3YjpiZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1\nZTo0MTo2ZjpmMjo3Mzo5NTo1ODowYzpkYjA/BgNVHREEODA2hjRzcGlmZmU6Ly8x\nMTExMTExMS0yMjIyLTMzMzMtNDQ0NC01NTU1NTU1NTU1NTUuY29uc3VsMAoGCCqG\nSM49BAMCA0gAMEUCICOY0i246rQHJt8o8Oya0D5PLL1FnmsQmQqIGCi31RwnAiEA\noR5f6Ku+cig2Il8T8LJujOp2/2A72QcHZA57B13y+8o=\n-----END CERTIFICATE-----\n" + "validationContext": { + "trustedCa": { + "inlineString": "-----BEGIN CERTIFICATE-----\nMIICXDCCAgKgAwIBAgIICpZq70Z9LyUwCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowFDESMBAG\nA1UEAxMJVGVzdCBDQSAyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEIhywH1gx\nAsMwuF3ukAI5YL2jFxH6Usnma1HFSfVyxbXX1/uoZEYrj8yCAtdU2yoHETyd+Zx2\nThhRLP79pYegCaOCATwwggE4MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTAD\nAQH/MGgGA1UdDgRhBF9kMToxMToxMTphYzoyYTpiYTo5NzpiMjozZjphYzo3Yjpi\nZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1ZTo0MTo2ZjpmMjo3\nMzo5NTo1ODowYzpkYjBqBgNVHSMEYzBhgF9kMToxMToxMTphYzoyYTpiYTo5Nzpi\nMjozZjphYzo3YjpiZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1\nZTo0MTo2ZjpmMjo3Mzo5NTo1ODowYzpkYjA/BgNVHREEODA2hjRzcGlmZmU6Ly8x\nMTExMTExMS0yMjIyLTMzMzMtNDQ0NC01NTU1NTU1NTU1NTUuY29uc3VsMAoGCCqG\nSM49BAMCA0gAMEUCICOY0i246rQHJt8o8Oya0D5PLL1FnmsQmQqIGCi31RwnAiEA\noR5f6Ku+cig2Il8T8LJujOp2/2A72QcHZA57B13y+8o=\n-----END CERTIFICATE-----\n" }, - "matchSubjectAltNames": [ + "matchSubjectAltNames": [ { - "exact": "spiffe://11111111-2222-3333-4444-555555555555.consul/ns/default/dc/dc1/svc/fail" + "exact": "spiffe://11111111-2222-3333-4444-555555555555.consul/ns/default/dc/dc1/svc/fail" } ] } }, - "sni": "fail.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul" + "sni": "fail.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul" } } }, { - "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", - "name": "geo-cache.default.dc1.query.11111111-2222-3333-4444-555555555555.consul", - "type": "EDS", - "edsClusterConfig": { - "edsConfig": { - "ads": { - - }, - "resourceApiVersion": "V3" + "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", + "name": "geo-cache.default.dc1.query.11111111-2222-3333-4444-555555555555.consul", + "type": "EDS", + "edsClusterConfig": { + "edsConfig": { + "ads": {}, + "resourceApiVersion": "V3" } }, - "connectTimeout": "5s", - "circuitBreakers": { - - }, - "outlierDetection": { - - }, - "transportSocket": { - "name": "tls", - "typedConfig": { - "@type": "type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext", - "commonTlsContext": { - "tlsParams": { - - }, - "tlsCertificates": [ + "connectTimeout": "5s", + "circuitBreakers": {}, + "outlierDetection": {}, + "transportSocket": { + "name": "tls", + "typedConfig": { + "@type": "type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext", + "commonTlsContext": { + "tlsParams": {}, + "tlsCertificates": [ { - "certificateChain": { - "inlineString": "-----BEGIN CERTIFICATE-----\nMIICjDCCAjKgAwIBAgIIC5llxGV1gB8wCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowDjEMMAoG\nA1UEAxMDd2ViMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEADPv1RHVNRfa2VKR\nAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Favq5E0ivpNtv1QnFhxtPd7d5k4e+T7\nSkW1TaOCAXIwggFuMA4GA1UdDwEB/wQEAwIDuDAdBgNVHSUEFjAUBggrBgEFBQcD\nAgYIKwYBBQUHAwEwDAYDVR0TAQH/BAIwADBoBgNVHQ4EYQRfN2Q6MDc6ODc6M2E6\nNDA6MTk6NDc6YzM6NWE6YzA6YmE6NjI6ZGY6YWY6NGI6ZDQ6MDU6MjU6NzY6M2Q6\nNWE6OGQ6MTY6OGQ6Njc6NWU6MmU6YTA6MzQ6N2Q6ZGM6ZmYwagYDVR0jBGMwYYBf\nZDE6MTE6MTE6YWM6MmE6YmE6OTc6YjI6M2Y6YWM6N2I6YmQ6ZGE6YmU6YjE6OGE6\nZmM6OWE6YmE6YjU6YmM6ODM6ZTc6NWU6NDE6NmY6ZjI6NzM6OTU6NTg6MGM6ZGIw\nWQYDVR0RBFIwUIZOc3BpZmZlOi8vMTExMTExMTEtMjIyMi0zMzMzLTQ0NDQtNTU1\nNTU1NTU1NTU1LmNvbnN1bC9ucy9kZWZhdWx0L2RjL2RjMS9zdmMvd2ViMAoGCCqG\nSM49BAMCA0gAMEUCIGC3TTvvjj76KMrguVyFf4tjOqaSCRie3nmHMRNNRav7AiEA\npY0heYeK9A6iOLrzqxSerkXXQyj5e9bE4VgUnxgPU6g=\n-----END CERTIFICATE-----\n" + "certificateChain": { + "inlineString": "-----BEGIN CERTIFICATE-----\nMIICjDCCAjKgAwIBAgIIC5llxGV1gB8wCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowDjEMMAoG\nA1UEAxMDd2ViMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEADPv1RHVNRfa2VKR\nAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Favq5E0ivpNtv1QnFhxtPd7d5k4e+T7\nSkW1TaOCAXIwggFuMA4GA1UdDwEB/wQEAwIDuDAdBgNVHSUEFjAUBggrBgEFBQcD\nAgYIKwYBBQUHAwEwDAYDVR0TAQH/BAIwADBoBgNVHQ4EYQRfN2Q6MDc6ODc6M2E6\nNDA6MTk6NDc6YzM6NWE6YzA6YmE6NjI6ZGY6YWY6NGI6ZDQ6MDU6MjU6NzY6M2Q6\nNWE6OGQ6MTY6OGQ6Njc6NWU6MmU6YTA6MzQ6N2Q6ZGM6ZmYwagYDVR0jBGMwYYBf\nZDE6MTE6MTE6YWM6MmE6YmE6OTc6YjI6M2Y6YWM6N2I6YmQ6ZGE6YmU6YjE6OGE6\nZmM6OWE6YmE6YjU6YmM6ODM6ZTc6NWU6NDE6NmY6ZjI6NzM6OTU6NTg6MGM6ZGIw\nWQYDVR0RBFIwUIZOc3BpZmZlOi8vMTExMTExMTEtMjIyMi0zMzMzLTQ0NDQtNTU1\nNTU1NTU1NTU1LmNvbnN1bC9ucy9kZWZhdWx0L2RjL2RjMS9zdmMvd2ViMAoGCCqG\nSM49BAMCA0gAMEUCIGC3TTvvjj76KMrguVyFf4tjOqaSCRie3nmHMRNNRav7AiEA\npY0heYeK9A6iOLrzqxSerkXXQyj5e9bE4VgUnxgPU6g=\n-----END CERTIFICATE-----\n" }, - "privateKey": { - "inlineString": "-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEIMoTkpRggp3fqZzFKh82yS4LjtJI+XY+qX/7DefHFrtdoAoGCCqGSM49\nAwEHoUQDQgAEADPv1RHVNRfa2VKRAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Fav\nq5E0ivpNtv1QnFhxtPd7d5k4e+T7SkW1TQ==\n-----END EC PRIVATE KEY-----\n" + "privateKey": { + "inlineString": "-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEIMoTkpRggp3fqZzFKh82yS4LjtJI+XY+qX/7DefHFrtdoAoGCCqGSM49\nAwEHoUQDQgAEADPv1RHVNRfa2VKRAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Fav\nq5E0ivpNtv1QnFhxtPd7d5k4e+T7SkW1TQ==\n-----END EC PRIVATE KEY-----\n" } } ], - "validationContext": { - "trustedCa": { - "inlineString": "-----BEGIN CERTIFICATE-----\nMIICXDCCAgKgAwIBAgIICpZq70Z9LyUwCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowFDESMBAG\nA1UEAxMJVGVzdCBDQSAyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEIhywH1gx\nAsMwuF3ukAI5YL2jFxH6Usnma1HFSfVyxbXX1/uoZEYrj8yCAtdU2yoHETyd+Zx2\nThhRLP79pYegCaOCATwwggE4MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTAD\nAQH/MGgGA1UdDgRhBF9kMToxMToxMTphYzoyYTpiYTo5NzpiMjozZjphYzo3Yjpi\nZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1ZTo0MTo2ZjpmMjo3\nMzo5NTo1ODowYzpkYjBqBgNVHSMEYzBhgF9kMToxMToxMTphYzoyYTpiYTo5Nzpi\nMjozZjphYzo3YjpiZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1\nZTo0MTo2ZjpmMjo3Mzo5NTo1ODowYzpkYjA/BgNVHREEODA2hjRzcGlmZmU6Ly8x\nMTExMTExMS0yMjIyLTMzMzMtNDQ0NC01NTU1NTU1NTU1NTUuY29uc3VsMAoGCCqG\nSM49BAMCA0gAMEUCICOY0i246rQHJt8o8Oya0D5PLL1FnmsQmQqIGCi31RwnAiEA\noR5f6Ku+cig2Il8T8LJujOp2/2A72QcHZA57B13y+8o=\n-----END CERTIFICATE-----\n" + "validationContext": { + "trustedCa": { + "inlineString": "-----BEGIN CERTIFICATE-----\nMIICXDCCAgKgAwIBAgIICpZq70Z9LyUwCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowFDESMBAG\nA1UEAxMJVGVzdCBDQSAyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEIhywH1gx\nAsMwuF3ukAI5YL2jFxH6Usnma1HFSfVyxbXX1/uoZEYrj8yCAtdU2yoHETyd+Zx2\nThhRLP79pYegCaOCATwwggE4MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTAD\nAQH/MGgGA1UdDgRhBF9kMToxMToxMTphYzoyYTpiYTo5NzpiMjozZjphYzo3Yjpi\nZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1ZTo0MTo2ZjpmMjo3\nMzo5NTo1ODowYzpkYjBqBgNVHSMEYzBhgF9kMToxMToxMTphYzoyYTpiYTo5Nzpi\nMjozZjphYzo3YjpiZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1\nZTo0MTo2ZjpmMjo3Mzo5NTo1ODowYzpkYjA/BgNVHREEODA2hjRzcGlmZmU6Ly8x\nMTExMTExMS0yMjIyLTMzMzMtNDQ0NC01NTU1NTU1NTU1NTUuY29uc3VsMAoGCCqG\nSM49BAMCA0gAMEUCICOY0i246rQHJt8o8Oya0D5PLL1FnmsQmQqIGCi31RwnAiEA\noR5f6Ku+cig2Il8T8LJujOp2/2A72QcHZA57B13y+8o=\n-----END CERTIFICATE-----\n" }, - "matchSubjectAltNames": [ + "matchSubjectAltNames": [ { - "exact": "spiffe://11111111-2222-3333-4444-555555555555.consul/ns/default/dc/dc1/svc/geo-cache-target" + "exact": "spiffe://11111111-2222-3333-4444-555555555555.consul/ns/default/dc/dc1/svc/geo-cache-target" }, { - "exact": "spiffe://11111111-2222-3333-4444-555555555555.consul/ns/default/dc/dc2/svc/geo-cache-target" + "exact": "spiffe://11111111-2222-3333-4444-555555555555.consul/ns/default/dc/dc2/svc/geo-cache-target" } ] } }, - "sni": "geo-cache.default.dc1.query.11111111-2222-3333-4444-555555555555.consul" + "sni": "geo-cache.default.dc1.query.11111111-2222-3333-4444-555555555555.consul" } } }, { - "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", - "name": "local_app", - "type": "STATIC", - "connectTimeout": "5s", - "loadAssignment": { - "clusterName": "local_app", - "endpoints": [ + "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", + "name": "local_app", + "type": "STATIC", + "connectTimeout": "5s", + "loadAssignment": { + "clusterName": "local_app", + "endpoints": [ { - "lbEndpoints": [ + "lbEndpoints": [ { - "endpoint": { - "address": { - "socketAddress": { - "address": "127.0.0.1", - "portValue": 8080 + "endpoint": { + "address": { + "socketAddress": { + "address": "127.0.0.1", + "portValue": 8080 } } } @@ -215,6 +187,6 @@ } } ], - "typeUrl": "type.googleapis.com/envoy.config.cluster.v3.Cluster", - "nonce": "00000001" + "typeUrl": "type.googleapis.com/envoy.config.cluster.v3.Cluster", + "nonce": "00000001" } \ No newline at end of file diff --git a/agent/xds/testdata/clusters/connect-proxy-with-chain-and-redirect-to-cluster-peer.latest.golden b/agent/xds/testdata/clusters/connect-proxy-with-chain-and-redirect-to-cluster-peer.latest.golden index a797d7e8914..d6e4abf854c 100644 --- a/agent/xds/testdata/clusters/connect-proxy-with-chain-and-redirect-to-cluster-peer.latest.golden +++ b/agent/xds/testdata/clusters/connect-proxy-with-chain-and-redirect-to-cluster-peer.latest.golden @@ -1,134 +1,117 @@ { - "versionInfo": "00000001", - "resources": [ + "versionInfo": "00000001", + "resources": [ { - "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", - "name": "db.default.cluster-01.external.peer1.domain", - "type": "EDS", - "edsClusterConfig": { - "edsConfig": { - "ads": { - - }, - "resourceApiVersion": "V3" + "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", + "name": "db.default.cluster-01.external.peer1.domain", + "altStatName": "db.default.cluster-01.external.peer1.domain", + "type": "EDS", + "edsClusterConfig": { + "edsConfig": { + "ads": {}, + "resourceApiVersion": "V3" } }, - "connectTimeout": "1s", - "circuitBreakers": { - - }, - "outlierDetection": { - "maxEjectionPercent": 100 - }, - "commonLbConfig": { - "healthyPanicThreshold": { - - } + "connectTimeout": "33s", + "circuitBreakers": {}, + "outlierDetection": {}, + "commonLbConfig": { + "healthyPanicThreshold": {} }, - "transportSocket": { - "name": "tls", - "typedConfig": { - "@type": "type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext", - "commonTlsContext": { - "tlsParams": { - - }, - "tlsCertificates": [ + "transportSocket": { + "name": "tls", + "typedConfig": { + "@type": "type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext", + "commonTlsContext": { + "tlsParams": {}, + "tlsCertificates": [ { - "certificateChain": { - "inlineString": "-----BEGIN CERTIFICATE-----\nMIICjDCCAjKgAwIBAgIIC5llxGV1gB8wCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowDjEMMAoG\nA1UEAxMDd2ViMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEADPv1RHVNRfa2VKR\nAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Favq5E0ivpNtv1QnFhxtPd7d5k4e+T7\nSkW1TaOCAXIwggFuMA4GA1UdDwEB/wQEAwIDuDAdBgNVHSUEFjAUBggrBgEFBQcD\nAgYIKwYBBQUHAwEwDAYDVR0TAQH/BAIwADBoBgNVHQ4EYQRfN2Q6MDc6ODc6M2E6\nNDA6MTk6NDc6YzM6NWE6YzA6YmE6NjI6ZGY6YWY6NGI6ZDQ6MDU6MjU6NzY6M2Q6\nNWE6OGQ6MTY6OGQ6Njc6NWU6MmU6YTA6MzQ6N2Q6ZGM6ZmYwagYDVR0jBGMwYYBf\nZDE6MTE6MTE6YWM6MmE6YmE6OTc6YjI6M2Y6YWM6N2I6YmQ6ZGE6YmU6YjE6OGE6\nZmM6OWE6YmE6YjU6YmM6ODM6ZTc6NWU6NDE6NmY6ZjI6NzM6OTU6NTg6MGM6ZGIw\nWQYDVR0RBFIwUIZOc3BpZmZlOi8vMTExMTExMTEtMjIyMi0zMzMzLTQ0NDQtNTU1\nNTU1NTU1NTU1LmNvbnN1bC9ucy9kZWZhdWx0L2RjL2RjMS9zdmMvd2ViMAoGCCqG\nSM49BAMCA0gAMEUCIGC3TTvvjj76KMrguVyFf4tjOqaSCRie3nmHMRNNRav7AiEA\npY0heYeK9A6iOLrzqxSerkXXQyj5e9bE4VgUnxgPU6g=\n-----END CERTIFICATE-----\n" + "certificateChain": { + "inlineString": "-----BEGIN CERTIFICATE-----\nMIICjDCCAjKgAwIBAgIIC5llxGV1gB8wCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowDjEMMAoG\nA1UEAxMDd2ViMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEADPv1RHVNRfa2VKR\nAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Favq5E0ivpNtv1QnFhxtPd7d5k4e+T7\nSkW1TaOCAXIwggFuMA4GA1UdDwEB/wQEAwIDuDAdBgNVHSUEFjAUBggrBgEFBQcD\nAgYIKwYBBQUHAwEwDAYDVR0TAQH/BAIwADBoBgNVHQ4EYQRfN2Q6MDc6ODc6M2E6\nNDA6MTk6NDc6YzM6NWE6YzA6YmE6NjI6ZGY6YWY6NGI6ZDQ6MDU6MjU6NzY6M2Q6\nNWE6OGQ6MTY6OGQ6Njc6NWU6MmU6YTA6MzQ6N2Q6ZGM6ZmYwagYDVR0jBGMwYYBf\nZDE6MTE6MTE6YWM6MmE6YmE6OTc6YjI6M2Y6YWM6N2I6YmQ6ZGE6YmU6YjE6OGE6\nZmM6OWE6YmE6YjU6YmM6ODM6ZTc6NWU6NDE6NmY6ZjI6NzM6OTU6NTg6MGM6ZGIw\nWQYDVR0RBFIwUIZOc3BpZmZlOi8vMTExMTExMTEtMjIyMi0zMzMzLTQ0NDQtNTU1\nNTU1NTU1NTU1LmNvbnN1bC9ucy9kZWZhdWx0L2RjL2RjMS9zdmMvd2ViMAoGCCqG\nSM49BAMCA0gAMEUCIGC3TTvvjj76KMrguVyFf4tjOqaSCRie3nmHMRNNRav7AiEA\npY0heYeK9A6iOLrzqxSerkXXQyj5e9bE4VgUnxgPU6g=\n-----END CERTIFICATE-----\n" }, - "privateKey": { - "inlineString": "-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEIMoTkpRggp3fqZzFKh82yS4LjtJI+XY+qX/7DefHFrtdoAoGCCqGSM49\nAwEHoUQDQgAEADPv1RHVNRfa2VKRAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Fav\nq5E0ivpNtv1QnFhxtPd7d5k4e+T7SkW1TQ==\n-----END EC PRIVATE KEY-----\n" + "privateKey": { + "inlineString": "-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEIMoTkpRggp3fqZzFKh82yS4LjtJI+XY+qX/7DefHFrtdoAoGCCqGSM49\nAwEHoUQDQgAEADPv1RHVNRfa2VKRAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Fav\nq5E0ivpNtv1QnFhxtPd7d5k4e+T7SkW1TQ==\n-----END EC PRIVATE KEY-----\n" } } ], - "validationContext": { - "trustedCa": { - "inlineString": "peer1-root-1\n" + "validationContext": { + "trustedCa": { + "inlineString": "peer1-root-1\n" }, - "matchSubjectAltNames": [ + "matchSubjectAltNames": [ { - "exact": "spiffe://1c053652-8512-4373-90cf-5a7f6263a994.consul/ns/default/dc/cluster-01-dc/svc/db" + "exact": "spiffe://1c053652-8512-4373-90cf-5a7f6263a994.consul/ns/default/dc/cluster-01-dc/svc/db" } ] } }, - "sni": "db.default.default.cluster-01.external.1c053652-8512-4373-90cf-5a7f6263a994.consul" + "sni": "db.default.default.cluster-01.external.1c053652-8512-4373-90cf-5a7f6263a994.consul" } } }, { - "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", - "name": "geo-cache.default.dc1.query.11111111-2222-3333-4444-555555555555.consul", - "type": "EDS", - "edsClusterConfig": { - "edsConfig": { - "ads": { - - }, - "resourceApiVersion": "V3" + "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", + "name": "geo-cache.default.dc1.query.11111111-2222-3333-4444-555555555555.consul", + "type": "EDS", + "edsClusterConfig": { + "edsConfig": { + "ads": {}, + "resourceApiVersion": "V3" } }, - "connectTimeout": "5s", - "circuitBreakers": { - - }, - "outlierDetection": { - - }, - "transportSocket": { - "name": "tls", - "typedConfig": { - "@type": "type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext", - "commonTlsContext": { - "tlsParams": { - - }, - "tlsCertificates": [ + "connectTimeout": "5s", + "circuitBreakers": {}, + "outlierDetection": {}, + "transportSocket": { + "name": "tls", + "typedConfig": { + "@type": "type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext", + "commonTlsContext": { + "tlsParams": {}, + "tlsCertificates": [ { - "certificateChain": { - "inlineString": "-----BEGIN CERTIFICATE-----\nMIICjDCCAjKgAwIBAgIIC5llxGV1gB8wCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowDjEMMAoG\nA1UEAxMDd2ViMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEADPv1RHVNRfa2VKR\nAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Favq5E0ivpNtv1QnFhxtPd7d5k4e+T7\nSkW1TaOCAXIwggFuMA4GA1UdDwEB/wQEAwIDuDAdBgNVHSUEFjAUBggrBgEFBQcD\nAgYIKwYBBQUHAwEwDAYDVR0TAQH/BAIwADBoBgNVHQ4EYQRfN2Q6MDc6ODc6M2E6\nNDA6MTk6NDc6YzM6NWE6YzA6YmE6NjI6ZGY6YWY6NGI6ZDQ6MDU6MjU6NzY6M2Q6\nNWE6OGQ6MTY6OGQ6Njc6NWU6MmU6YTA6MzQ6N2Q6ZGM6ZmYwagYDVR0jBGMwYYBf\nZDE6MTE6MTE6YWM6MmE6YmE6OTc6YjI6M2Y6YWM6N2I6YmQ6ZGE6YmU6YjE6OGE6\nZmM6OWE6YmE6YjU6YmM6ODM6ZTc6NWU6NDE6NmY6ZjI6NzM6OTU6NTg6MGM6ZGIw\nWQYDVR0RBFIwUIZOc3BpZmZlOi8vMTExMTExMTEtMjIyMi0zMzMzLTQ0NDQtNTU1\nNTU1NTU1NTU1LmNvbnN1bC9ucy9kZWZhdWx0L2RjL2RjMS9zdmMvd2ViMAoGCCqG\nSM49BAMCA0gAMEUCIGC3TTvvjj76KMrguVyFf4tjOqaSCRie3nmHMRNNRav7AiEA\npY0heYeK9A6iOLrzqxSerkXXQyj5e9bE4VgUnxgPU6g=\n-----END CERTIFICATE-----\n" + "certificateChain": { + "inlineString": "-----BEGIN CERTIFICATE-----\nMIICjDCCAjKgAwIBAgIIC5llxGV1gB8wCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowDjEMMAoG\nA1UEAxMDd2ViMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEADPv1RHVNRfa2VKR\nAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Favq5E0ivpNtv1QnFhxtPd7d5k4e+T7\nSkW1TaOCAXIwggFuMA4GA1UdDwEB/wQEAwIDuDAdBgNVHSUEFjAUBggrBgEFBQcD\nAgYIKwYBBQUHAwEwDAYDVR0TAQH/BAIwADBoBgNVHQ4EYQRfN2Q6MDc6ODc6M2E6\nNDA6MTk6NDc6YzM6NWE6YzA6YmE6NjI6ZGY6YWY6NGI6ZDQ6MDU6MjU6NzY6M2Q6\nNWE6OGQ6MTY6OGQ6Njc6NWU6MmU6YTA6MzQ6N2Q6ZGM6ZmYwagYDVR0jBGMwYYBf\nZDE6MTE6MTE6YWM6MmE6YmE6OTc6YjI6M2Y6YWM6N2I6YmQ6ZGE6YmU6YjE6OGE6\nZmM6OWE6YmE6YjU6YmM6ODM6ZTc6NWU6NDE6NmY6ZjI6NzM6OTU6NTg6MGM6ZGIw\nWQYDVR0RBFIwUIZOc3BpZmZlOi8vMTExMTExMTEtMjIyMi0zMzMzLTQ0NDQtNTU1\nNTU1NTU1NTU1LmNvbnN1bC9ucy9kZWZhdWx0L2RjL2RjMS9zdmMvd2ViMAoGCCqG\nSM49BAMCA0gAMEUCIGC3TTvvjj76KMrguVyFf4tjOqaSCRie3nmHMRNNRav7AiEA\npY0heYeK9A6iOLrzqxSerkXXQyj5e9bE4VgUnxgPU6g=\n-----END CERTIFICATE-----\n" }, - "privateKey": { - "inlineString": "-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEIMoTkpRggp3fqZzFKh82yS4LjtJI+XY+qX/7DefHFrtdoAoGCCqGSM49\nAwEHoUQDQgAEADPv1RHVNRfa2VKRAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Fav\nq5E0ivpNtv1QnFhxtPd7d5k4e+T7SkW1TQ==\n-----END EC PRIVATE KEY-----\n" + "privateKey": { + "inlineString": "-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEIMoTkpRggp3fqZzFKh82yS4LjtJI+XY+qX/7DefHFrtdoAoGCCqGSM49\nAwEHoUQDQgAEADPv1RHVNRfa2VKRAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Fav\nq5E0ivpNtv1QnFhxtPd7d5k4e+T7SkW1TQ==\n-----END EC PRIVATE KEY-----\n" } } ], - "validationContext": { - "trustedCa": { - "inlineString": "-----BEGIN CERTIFICATE-----\nMIICXDCCAgKgAwIBAgIICpZq70Z9LyUwCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowFDESMBAG\nA1UEAxMJVGVzdCBDQSAyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEIhywH1gx\nAsMwuF3ukAI5YL2jFxH6Usnma1HFSfVyxbXX1/uoZEYrj8yCAtdU2yoHETyd+Zx2\nThhRLP79pYegCaOCATwwggE4MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTAD\nAQH/MGgGA1UdDgRhBF9kMToxMToxMTphYzoyYTpiYTo5NzpiMjozZjphYzo3Yjpi\nZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1ZTo0MTo2ZjpmMjo3\nMzo5NTo1ODowYzpkYjBqBgNVHSMEYzBhgF9kMToxMToxMTphYzoyYTpiYTo5Nzpi\nMjozZjphYzo3YjpiZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1\nZTo0MTo2ZjpmMjo3Mzo5NTo1ODowYzpkYjA/BgNVHREEODA2hjRzcGlmZmU6Ly8x\nMTExMTExMS0yMjIyLTMzMzMtNDQ0NC01NTU1NTU1NTU1NTUuY29uc3VsMAoGCCqG\nSM49BAMCA0gAMEUCICOY0i246rQHJt8o8Oya0D5PLL1FnmsQmQqIGCi31RwnAiEA\noR5f6Ku+cig2Il8T8LJujOp2/2A72QcHZA57B13y+8o=\n-----END CERTIFICATE-----\n" + "validationContext": { + "trustedCa": { + "inlineString": "-----BEGIN CERTIFICATE-----\nMIICXDCCAgKgAwIBAgIICpZq70Z9LyUwCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowFDESMBAG\nA1UEAxMJVGVzdCBDQSAyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEIhywH1gx\nAsMwuF3ukAI5YL2jFxH6Usnma1HFSfVyxbXX1/uoZEYrj8yCAtdU2yoHETyd+Zx2\nThhRLP79pYegCaOCATwwggE4MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTAD\nAQH/MGgGA1UdDgRhBF9kMToxMToxMTphYzoyYTpiYTo5NzpiMjozZjphYzo3Yjpi\nZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1ZTo0MTo2ZjpmMjo3\nMzo5NTo1ODowYzpkYjBqBgNVHSMEYzBhgF9kMToxMToxMTphYzoyYTpiYTo5Nzpi\nMjozZjphYzo3YjpiZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1\nZTo0MTo2ZjpmMjo3Mzo5NTo1ODowYzpkYjA/BgNVHREEODA2hjRzcGlmZmU6Ly8x\nMTExMTExMS0yMjIyLTMzMzMtNDQ0NC01NTU1NTU1NTU1NTUuY29uc3VsMAoGCCqG\nSM49BAMCA0gAMEUCICOY0i246rQHJt8o8Oya0D5PLL1FnmsQmQqIGCi31RwnAiEA\noR5f6Ku+cig2Il8T8LJujOp2/2A72QcHZA57B13y+8o=\n-----END CERTIFICATE-----\n" }, - "matchSubjectAltNames": [ + "matchSubjectAltNames": [ { - "exact": "spiffe://11111111-2222-3333-4444-555555555555.consul/ns/default/dc/dc1/svc/geo-cache-target" + "exact": "spiffe://11111111-2222-3333-4444-555555555555.consul/ns/default/dc/dc1/svc/geo-cache-target" }, { - "exact": "spiffe://11111111-2222-3333-4444-555555555555.consul/ns/default/dc/dc2/svc/geo-cache-target" + "exact": "spiffe://11111111-2222-3333-4444-555555555555.consul/ns/default/dc/dc2/svc/geo-cache-target" } ] } }, - "sni": "geo-cache.default.dc1.query.11111111-2222-3333-4444-555555555555.consul" + "sni": "geo-cache.default.dc1.query.11111111-2222-3333-4444-555555555555.consul" } } }, { - "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", - "name": "local_app", - "type": "STATIC", - "connectTimeout": "5s", - "loadAssignment": { - "clusterName": "local_app", - "endpoints": [ + "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", + "name": "local_app", + "type": "STATIC", + "connectTimeout": "5s", + "loadAssignment": { + "clusterName": "local_app", + "endpoints": [ { - "lbEndpoints": [ + "lbEndpoints": [ { - "endpoint": { - "address": { - "socketAddress": { - "address": "127.0.0.1", - "portValue": 8080 + "endpoint": { + "address": { + "socketAddress": { + "address": "127.0.0.1", + "portValue": 8080 } } } @@ -139,6 +122,6 @@ } } ], - "typeUrl": "type.googleapis.com/envoy.config.cluster.v3.Cluster", - "nonce": "00000001" + "typeUrl": "type.googleapis.com/envoy.config.cluster.v3.Cluster", + "nonce": "00000001" } \ No newline at end of file diff --git a/agent/xds/testdata/clusters/connect-proxy-with-tcp-chain-double-failover-through-local-gateway-triggered.latest.golden b/agent/xds/testdata/clusters/connect-proxy-with-tcp-chain-double-failover-through-local-gateway-triggered.latest.golden index e434b71c10f..35a149b7261 100644 --- a/agent/xds/testdata/clusters/connect-proxy-with-tcp-chain-double-failover-through-local-gateway-triggered.latest.golden +++ b/agent/xds/testdata/clusters/connect-proxy-with-tcp-chain-double-failover-through-local-gateway-triggered.latest.golden @@ -1,269 +1,231 @@ { - "versionInfo": "00000001", - "resources": [ + "versionInfo": "00000001", + "resources": [ { - "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", - "name": "db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", - "altStatName": "db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", - "clusterType": { - "name": "envoy.clusters.aggregate", - "typedConfig": { - "@type": "type.googleapis.com/envoy.extensions.clusters.aggregate.v3.ClusterConfig", - "clusters": [ - "failover-target~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", - "failover-target~db.default.dc2.internal.11111111-2222-3333-4444-555555555555.consul", - "failover-target~db.default.dc3.internal.11111111-2222-3333-4444-555555555555.consul" + "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", + "name": "db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "altStatName": "db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "clusterType": { + "name": "envoy.clusters.aggregate", + "typedConfig": { + "@type": "type.googleapis.com/envoy.extensions.clusters.aggregate.v3.ClusterConfig", + "clusters": [ + "failover-target~0~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "failover-target~1~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "failover-target~2~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul" ] } }, - "connectTimeout": "33s", - "lbPolicy": "CLUSTER_PROVIDED" + "connectTimeout": "33s", + "lbPolicy": "CLUSTER_PROVIDED" }, { - "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", - "name": "failover-target~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", - "altStatName": "failover-target~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", - "type": "EDS", - "edsClusterConfig": { - "edsConfig": { - "ads": { - - }, - "resourceApiVersion": "V3" - } - }, - "connectTimeout": "33s", - "circuitBreakers": { - - }, - "outlierDetection": { - - }, - "commonLbConfig": { - "healthyPanicThreshold": { - + "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", + "name": "failover-target~0~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "altStatName": "failover-target~0~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "type": "EDS", + "edsClusterConfig": { + "edsConfig": { + "ads": {}, + "resourceApiVersion": "V3" } }, - "transportSocket": { - "name": "tls", - "typedConfig": { - "@type": "type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext", - "commonTlsContext": { - "tlsParams": { - - }, - "tlsCertificates": [ + "connectTimeout": "33s", + "circuitBreakers": {}, + "outlierDetection": {}, + "commonLbConfig": { + "healthyPanicThreshold": {} + }, + "transportSocket": { + "name": "tls", + "typedConfig": { + "@type": "type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext", + "commonTlsContext": { + "tlsParams": {}, + "tlsCertificates": [ { - "certificateChain": { - "inlineString": "-----BEGIN CERTIFICATE-----\nMIICjDCCAjKgAwIBAgIIC5llxGV1gB8wCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowDjEMMAoG\nA1UEAxMDd2ViMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEADPv1RHVNRfa2VKR\nAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Favq5E0ivpNtv1QnFhxtPd7d5k4e+T7\nSkW1TaOCAXIwggFuMA4GA1UdDwEB/wQEAwIDuDAdBgNVHSUEFjAUBggrBgEFBQcD\nAgYIKwYBBQUHAwEwDAYDVR0TAQH/BAIwADBoBgNVHQ4EYQRfN2Q6MDc6ODc6M2E6\nNDA6MTk6NDc6YzM6NWE6YzA6YmE6NjI6ZGY6YWY6NGI6ZDQ6MDU6MjU6NzY6M2Q6\nNWE6OGQ6MTY6OGQ6Njc6NWU6MmU6YTA6MzQ6N2Q6ZGM6ZmYwagYDVR0jBGMwYYBf\nZDE6MTE6MTE6YWM6MmE6YmE6OTc6YjI6M2Y6YWM6N2I6YmQ6ZGE6YmU6YjE6OGE6\nZmM6OWE6YmE6YjU6YmM6ODM6ZTc6NWU6NDE6NmY6ZjI6NzM6OTU6NTg6MGM6ZGIw\nWQYDVR0RBFIwUIZOc3BpZmZlOi8vMTExMTExMTEtMjIyMi0zMzMzLTQ0NDQtNTU1\nNTU1NTU1NTU1LmNvbnN1bC9ucy9kZWZhdWx0L2RjL2RjMS9zdmMvd2ViMAoGCCqG\nSM49BAMCA0gAMEUCIGC3TTvvjj76KMrguVyFf4tjOqaSCRie3nmHMRNNRav7AiEA\npY0heYeK9A6iOLrzqxSerkXXQyj5e9bE4VgUnxgPU6g=\n-----END CERTIFICATE-----\n" + "certificateChain": { + "inlineString": "-----BEGIN CERTIFICATE-----\nMIICjDCCAjKgAwIBAgIIC5llxGV1gB8wCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowDjEMMAoG\nA1UEAxMDd2ViMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEADPv1RHVNRfa2VKR\nAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Favq5E0ivpNtv1QnFhxtPd7d5k4e+T7\nSkW1TaOCAXIwggFuMA4GA1UdDwEB/wQEAwIDuDAdBgNVHSUEFjAUBggrBgEFBQcD\nAgYIKwYBBQUHAwEwDAYDVR0TAQH/BAIwADBoBgNVHQ4EYQRfN2Q6MDc6ODc6M2E6\nNDA6MTk6NDc6YzM6NWE6YzA6YmE6NjI6ZGY6YWY6NGI6ZDQ6MDU6MjU6NzY6M2Q6\nNWE6OGQ6MTY6OGQ6Njc6NWU6MmU6YTA6MzQ6N2Q6ZGM6ZmYwagYDVR0jBGMwYYBf\nZDE6MTE6MTE6YWM6MmE6YmE6OTc6YjI6M2Y6YWM6N2I6YmQ6ZGE6YmU6YjE6OGE6\nZmM6OWE6YmE6YjU6YmM6ODM6ZTc6NWU6NDE6NmY6ZjI6NzM6OTU6NTg6MGM6ZGIw\nWQYDVR0RBFIwUIZOc3BpZmZlOi8vMTExMTExMTEtMjIyMi0zMzMzLTQ0NDQtNTU1\nNTU1NTU1NTU1LmNvbnN1bC9ucy9kZWZhdWx0L2RjL2RjMS9zdmMvd2ViMAoGCCqG\nSM49BAMCA0gAMEUCIGC3TTvvjj76KMrguVyFf4tjOqaSCRie3nmHMRNNRav7AiEA\npY0heYeK9A6iOLrzqxSerkXXQyj5e9bE4VgUnxgPU6g=\n-----END CERTIFICATE-----\n" }, - "privateKey": { - "inlineString": "-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEIMoTkpRggp3fqZzFKh82yS4LjtJI+XY+qX/7DefHFrtdoAoGCCqGSM49\nAwEHoUQDQgAEADPv1RHVNRfa2VKRAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Fav\nq5E0ivpNtv1QnFhxtPd7d5k4e+T7SkW1TQ==\n-----END EC PRIVATE KEY-----\n" + "privateKey": { + "inlineString": "-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEIMoTkpRggp3fqZzFKh82yS4LjtJI+XY+qX/7DefHFrtdoAoGCCqGSM49\nAwEHoUQDQgAEADPv1RHVNRfa2VKRAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Fav\nq5E0ivpNtv1QnFhxtPd7d5k4e+T7SkW1TQ==\n-----END EC PRIVATE KEY-----\n" } } ], - "validationContext": { - "trustedCa": { - "inlineString": "-----BEGIN CERTIFICATE-----\nMIICXDCCAgKgAwIBAgIICpZq70Z9LyUwCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowFDESMBAG\nA1UEAxMJVGVzdCBDQSAyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEIhywH1gx\nAsMwuF3ukAI5YL2jFxH6Usnma1HFSfVyxbXX1/uoZEYrj8yCAtdU2yoHETyd+Zx2\nThhRLP79pYegCaOCATwwggE4MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTAD\nAQH/MGgGA1UdDgRhBF9kMToxMToxMTphYzoyYTpiYTo5NzpiMjozZjphYzo3Yjpi\nZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1ZTo0MTo2ZjpmMjo3\nMzo5NTo1ODowYzpkYjBqBgNVHSMEYzBhgF9kMToxMToxMTphYzoyYTpiYTo5Nzpi\nMjozZjphYzo3YjpiZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1\nZTo0MTo2ZjpmMjo3Mzo5NTo1ODowYzpkYjA/BgNVHREEODA2hjRzcGlmZmU6Ly8x\nMTExMTExMS0yMjIyLTMzMzMtNDQ0NC01NTU1NTU1NTU1NTUuY29uc3VsMAoGCCqG\nSM49BAMCA0gAMEUCICOY0i246rQHJt8o8Oya0D5PLL1FnmsQmQqIGCi31RwnAiEA\noR5f6Ku+cig2Il8T8LJujOp2/2A72QcHZA57B13y+8o=\n-----END CERTIFICATE-----\n" + "validationContext": { + "trustedCa": { + "inlineString": "-----BEGIN CERTIFICATE-----\nMIICXDCCAgKgAwIBAgIICpZq70Z9LyUwCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowFDESMBAG\nA1UEAxMJVGVzdCBDQSAyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEIhywH1gx\nAsMwuF3ukAI5YL2jFxH6Usnma1HFSfVyxbXX1/uoZEYrj8yCAtdU2yoHETyd+Zx2\nThhRLP79pYegCaOCATwwggE4MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTAD\nAQH/MGgGA1UdDgRhBF9kMToxMToxMTphYzoyYTpiYTo5NzpiMjozZjphYzo3Yjpi\nZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1ZTo0MTo2ZjpmMjo3\nMzo5NTo1ODowYzpkYjBqBgNVHSMEYzBhgF9kMToxMToxMTphYzoyYTpiYTo5Nzpi\nMjozZjphYzo3YjpiZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1\nZTo0MTo2ZjpmMjo3Mzo5NTo1ODowYzpkYjA/BgNVHREEODA2hjRzcGlmZmU6Ly8x\nMTExMTExMS0yMjIyLTMzMzMtNDQ0NC01NTU1NTU1NTU1NTUuY29uc3VsMAoGCCqG\nSM49BAMCA0gAMEUCICOY0i246rQHJt8o8Oya0D5PLL1FnmsQmQqIGCi31RwnAiEA\noR5f6Ku+cig2Il8T8LJujOp2/2A72QcHZA57B13y+8o=\n-----END CERTIFICATE-----\n" }, - "matchSubjectAltNames": [ + "matchSubjectAltNames": [ { - "exact": "spiffe://11111111-2222-3333-4444-555555555555.consul/ns/default/dc/dc1/svc/db" + "exact": "spiffe://11111111-2222-3333-4444-555555555555.consul/ns/default/dc/dc1/svc/db" } ] } }, - "sni": "db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul" + "sni": "db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul" } } }, { - "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", - "name": "failover-target~db.default.dc2.internal.11111111-2222-3333-4444-555555555555.consul", - "altStatName": "failover-target~db.default.dc2.internal.11111111-2222-3333-4444-555555555555.consul", - "type": "EDS", - "edsClusterConfig": { - "edsConfig": { - "ads": { - - }, - "resourceApiVersion": "V3" - } - }, - "connectTimeout": "33s", - "circuitBreakers": { - - }, - "outlierDetection": { - - }, - "commonLbConfig": { - "healthyPanicThreshold": { - + "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", + "name": "failover-target~1~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "altStatName": "failover-target~1~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "type": "EDS", + "edsClusterConfig": { + "edsConfig": { + "ads": {}, + "resourceApiVersion": "V3" } }, - "transportSocket": { - "name": "tls", - "typedConfig": { - "@type": "type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext", - "commonTlsContext": { - "tlsParams": { - - }, - "tlsCertificates": [ + "connectTimeout": "33s", + "circuitBreakers": {}, + "outlierDetection": {}, + "commonLbConfig": { + "healthyPanicThreshold": {} + }, + "transportSocket": { + "name": "tls", + "typedConfig": { + "@type": "type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext", + "commonTlsContext": { + "tlsParams": {}, + "tlsCertificates": [ { - "certificateChain": { - "inlineString": "-----BEGIN CERTIFICATE-----\nMIICjDCCAjKgAwIBAgIIC5llxGV1gB8wCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowDjEMMAoG\nA1UEAxMDd2ViMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEADPv1RHVNRfa2VKR\nAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Favq5E0ivpNtv1QnFhxtPd7d5k4e+T7\nSkW1TaOCAXIwggFuMA4GA1UdDwEB/wQEAwIDuDAdBgNVHSUEFjAUBggrBgEFBQcD\nAgYIKwYBBQUHAwEwDAYDVR0TAQH/BAIwADBoBgNVHQ4EYQRfN2Q6MDc6ODc6M2E6\nNDA6MTk6NDc6YzM6NWE6YzA6YmE6NjI6ZGY6YWY6NGI6ZDQ6MDU6MjU6NzY6M2Q6\nNWE6OGQ6MTY6OGQ6Njc6NWU6MmU6YTA6MzQ6N2Q6ZGM6ZmYwagYDVR0jBGMwYYBf\nZDE6MTE6MTE6YWM6MmE6YmE6OTc6YjI6M2Y6YWM6N2I6YmQ6ZGE6YmU6YjE6OGE6\nZmM6OWE6YmE6YjU6YmM6ODM6ZTc6NWU6NDE6NmY6ZjI6NzM6OTU6NTg6MGM6ZGIw\nWQYDVR0RBFIwUIZOc3BpZmZlOi8vMTExMTExMTEtMjIyMi0zMzMzLTQ0NDQtNTU1\nNTU1NTU1NTU1LmNvbnN1bC9ucy9kZWZhdWx0L2RjL2RjMS9zdmMvd2ViMAoGCCqG\nSM49BAMCA0gAMEUCIGC3TTvvjj76KMrguVyFf4tjOqaSCRie3nmHMRNNRav7AiEA\npY0heYeK9A6iOLrzqxSerkXXQyj5e9bE4VgUnxgPU6g=\n-----END CERTIFICATE-----\n" + "certificateChain": { + "inlineString": "-----BEGIN CERTIFICATE-----\nMIICjDCCAjKgAwIBAgIIC5llxGV1gB8wCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowDjEMMAoG\nA1UEAxMDd2ViMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEADPv1RHVNRfa2VKR\nAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Favq5E0ivpNtv1QnFhxtPd7d5k4e+T7\nSkW1TaOCAXIwggFuMA4GA1UdDwEB/wQEAwIDuDAdBgNVHSUEFjAUBggrBgEFBQcD\nAgYIKwYBBQUHAwEwDAYDVR0TAQH/BAIwADBoBgNVHQ4EYQRfN2Q6MDc6ODc6M2E6\nNDA6MTk6NDc6YzM6NWE6YzA6YmE6NjI6ZGY6YWY6NGI6ZDQ6MDU6MjU6NzY6M2Q6\nNWE6OGQ6MTY6OGQ6Njc6NWU6MmU6YTA6MzQ6N2Q6ZGM6ZmYwagYDVR0jBGMwYYBf\nZDE6MTE6MTE6YWM6MmE6YmE6OTc6YjI6M2Y6YWM6N2I6YmQ6ZGE6YmU6YjE6OGE6\nZmM6OWE6YmE6YjU6YmM6ODM6ZTc6NWU6NDE6NmY6ZjI6NzM6OTU6NTg6MGM6ZGIw\nWQYDVR0RBFIwUIZOc3BpZmZlOi8vMTExMTExMTEtMjIyMi0zMzMzLTQ0NDQtNTU1\nNTU1NTU1NTU1LmNvbnN1bC9ucy9kZWZhdWx0L2RjL2RjMS9zdmMvd2ViMAoGCCqG\nSM49BAMCA0gAMEUCIGC3TTvvjj76KMrguVyFf4tjOqaSCRie3nmHMRNNRav7AiEA\npY0heYeK9A6iOLrzqxSerkXXQyj5e9bE4VgUnxgPU6g=\n-----END CERTIFICATE-----\n" }, - "privateKey": { - "inlineString": "-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEIMoTkpRggp3fqZzFKh82yS4LjtJI+XY+qX/7DefHFrtdoAoGCCqGSM49\nAwEHoUQDQgAEADPv1RHVNRfa2VKRAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Fav\nq5E0ivpNtv1QnFhxtPd7d5k4e+T7SkW1TQ==\n-----END EC PRIVATE KEY-----\n" + "privateKey": { + "inlineString": "-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEIMoTkpRggp3fqZzFKh82yS4LjtJI+XY+qX/7DefHFrtdoAoGCCqGSM49\nAwEHoUQDQgAEADPv1RHVNRfa2VKRAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Fav\nq5E0ivpNtv1QnFhxtPd7d5k4e+T7SkW1TQ==\n-----END EC PRIVATE KEY-----\n" } } ], - "validationContext": { - "trustedCa": { - "inlineString": "-----BEGIN CERTIFICATE-----\nMIICXDCCAgKgAwIBAgIICpZq70Z9LyUwCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowFDESMBAG\nA1UEAxMJVGVzdCBDQSAyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEIhywH1gx\nAsMwuF3ukAI5YL2jFxH6Usnma1HFSfVyxbXX1/uoZEYrj8yCAtdU2yoHETyd+Zx2\nThhRLP79pYegCaOCATwwggE4MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTAD\nAQH/MGgGA1UdDgRhBF9kMToxMToxMTphYzoyYTpiYTo5NzpiMjozZjphYzo3Yjpi\nZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1ZTo0MTo2ZjpmMjo3\nMzo5NTo1ODowYzpkYjBqBgNVHSMEYzBhgF9kMToxMToxMTphYzoyYTpiYTo5Nzpi\nMjozZjphYzo3YjpiZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1\nZTo0MTo2ZjpmMjo3Mzo5NTo1ODowYzpkYjA/BgNVHREEODA2hjRzcGlmZmU6Ly8x\nMTExMTExMS0yMjIyLTMzMzMtNDQ0NC01NTU1NTU1NTU1NTUuY29uc3VsMAoGCCqG\nSM49BAMCA0gAMEUCICOY0i246rQHJt8o8Oya0D5PLL1FnmsQmQqIGCi31RwnAiEA\noR5f6Ku+cig2Il8T8LJujOp2/2A72QcHZA57B13y+8o=\n-----END CERTIFICATE-----\n" + "validationContext": { + "trustedCa": { + "inlineString": "-----BEGIN CERTIFICATE-----\nMIICXDCCAgKgAwIBAgIICpZq70Z9LyUwCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowFDESMBAG\nA1UEAxMJVGVzdCBDQSAyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEIhywH1gx\nAsMwuF3ukAI5YL2jFxH6Usnma1HFSfVyxbXX1/uoZEYrj8yCAtdU2yoHETyd+Zx2\nThhRLP79pYegCaOCATwwggE4MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTAD\nAQH/MGgGA1UdDgRhBF9kMToxMToxMTphYzoyYTpiYTo5NzpiMjozZjphYzo3Yjpi\nZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1ZTo0MTo2ZjpmMjo3\nMzo5NTo1ODowYzpkYjBqBgNVHSMEYzBhgF9kMToxMToxMTphYzoyYTpiYTo5Nzpi\nMjozZjphYzo3YjpiZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1\nZTo0MTo2ZjpmMjo3Mzo5NTo1ODowYzpkYjA/BgNVHREEODA2hjRzcGlmZmU6Ly8x\nMTExMTExMS0yMjIyLTMzMzMtNDQ0NC01NTU1NTU1NTU1NTUuY29uc3VsMAoGCCqG\nSM49BAMCA0gAMEUCICOY0i246rQHJt8o8Oya0D5PLL1FnmsQmQqIGCi31RwnAiEA\noR5f6Ku+cig2Il8T8LJujOp2/2A72QcHZA57B13y+8o=\n-----END CERTIFICATE-----\n" }, - "matchSubjectAltNames": [ + "matchSubjectAltNames": [ { - "exact": "spiffe://11111111-2222-3333-4444-555555555555.consul/ns/default/dc/dc2/svc/db" + "exact": "spiffe://11111111-2222-3333-4444-555555555555.consul/ns/default/dc/dc2/svc/db" } ] } }, - "sni": "db.default.dc2.internal.11111111-2222-3333-4444-555555555555.consul" + "sni": "db.default.dc2.internal.11111111-2222-3333-4444-555555555555.consul" } } }, { - "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", - "name": "failover-target~db.default.dc3.internal.11111111-2222-3333-4444-555555555555.consul", - "altStatName": "failover-target~db.default.dc3.internal.11111111-2222-3333-4444-555555555555.consul", - "type": "EDS", - "edsClusterConfig": { - "edsConfig": { - "ads": { - - }, - "resourceApiVersion": "V3" + "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", + "name": "failover-target~2~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "altStatName": "failover-target~2~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "type": "EDS", + "edsClusterConfig": { + "edsConfig": { + "ads": {}, + "resourceApiVersion": "V3" } }, - "connectTimeout": "33s", - "circuitBreakers": { - - }, - "outlierDetection": { - - }, - "commonLbConfig": { - "healthyPanicThreshold": { - - } - }, - "transportSocket": { - "name": "tls", - "typedConfig": { - "@type": "type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext", - "commonTlsContext": { - "tlsParams": { - - }, - "tlsCertificates": [ + "connectTimeout": "33s", + "circuitBreakers": {}, + "outlierDetection": {}, + "commonLbConfig": { + "healthyPanicThreshold": {} + }, + "transportSocket": { + "name": "tls", + "typedConfig": { + "@type": "type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext", + "commonTlsContext": { + "tlsParams": {}, + "tlsCertificates": [ { - "certificateChain": { - "inlineString": "-----BEGIN CERTIFICATE-----\nMIICjDCCAjKgAwIBAgIIC5llxGV1gB8wCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowDjEMMAoG\nA1UEAxMDd2ViMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEADPv1RHVNRfa2VKR\nAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Favq5E0ivpNtv1QnFhxtPd7d5k4e+T7\nSkW1TaOCAXIwggFuMA4GA1UdDwEB/wQEAwIDuDAdBgNVHSUEFjAUBggrBgEFBQcD\nAgYIKwYBBQUHAwEwDAYDVR0TAQH/BAIwADBoBgNVHQ4EYQRfN2Q6MDc6ODc6M2E6\nNDA6MTk6NDc6YzM6NWE6YzA6YmE6NjI6ZGY6YWY6NGI6ZDQ6MDU6MjU6NzY6M2Q6\nNWE6OGQ6MTY6OGQ6Njc6NWU6MmU6YTA6MzQ6N2Q6ZGM6ZmYwagYDVR0jBGMwYYBf\nZDE6MTE6MTE6YWM6MmE6YmE6OTc6YjI6M2Y6YWM6N2I6YmQ6ZGE6YmU6YjE6OGE6\nZmM6OWE6YmE6YjU6YmM6ODM6ZTc6NWU6NDE6NmY6ZjI6NzM6OTU6NTg6MGM6ZGIw\nWQYDVR0RBFIwUIZOc3BpZmZlOi8vMTExMTExMTEtMjIyMi0zMzMzLTQ0NDQtNTU1\nNTU1NTU1NTU1LmNvbnN1bC9ucy9kZWZhdWx0L2RjL2RjMS9zdmMvd2ViMAoGCCqG\nSM49BAMCA0gAMEUCIGC3TTvvjj76KMrguVyFf4tjOqaSCRie3nmHMRNNRav7AiEA\npY0heYeK9A6iOLrzqxSerkXXQyj5e9bE4VgUnxgPU6g=\n-----END CERTIFICATE-----\n" + "certificateChain": { + "inlineString": "-----BEGIN CERTIFICATE-----\nMIICjDCCAjKgAwIBAgIIC5llxGV1gB8wCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowDjEMMAoG\nA1UEAxMDd2ViMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEADPv1RHVNRfa2VKR\nAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Favq5E0ivpNtv1QnFhxtPd7d5k4e+T7\nSkW1TaOCAXIwggFuMA4GA1UdDwEB/wQEAwIDuDAdBgNVHSUEFjAUBggrBgEFBQcD\nAgYIKwYBBQUHAwEwDAYDVR0TAQH/BAIwADBoBgNVHQ4EYQRfN2Q6MDc6ODc6M2E6\nNDA6MTk6NDc6YzM6NWE6YzA6YmE6NjI6ZGY6YWY6NGI6ZDQ6MDU6MjU6NzY6M2Q6\nNWE6OGQ6MTY6OGQ6Njc6NWU6MmU6YTA6MzQ6N2Q6ZGM6ZmYwagYDVR0jBGMwYYBf\nZDE6MTE6MTE6YWM6MmE6YmE6OTc6YjI6M2Y6YWM6N2I6YmQ6ZGE6YmU6YjE6OGE6\nZmM6OWE6YmE6YjU6YmM6ODM6ZTc6NWU6NDE6NmY6ZjI6NzM6OTU6NTg6MGM6ZGIw\nWQYDVR0RBFIwUIZOc3BpZmZlOi8vMTExMTExMTEtMjIyMi0zMzMzLTQ0NDQtNTU1\nNTU1NTU1NTU1LmNvbnN1bC9ucy9kZWZhdWx0L2RjL2RjMS9zdmMvd2ViMAoGCCqG\nSM49BAMCA0gAMEUCIGC3TTvvjj76KMrguVyFf4tjOqaSCRie3nmHMRNNRav7AiEA\npY0heYeK9A6iOLrzqxSerkXXQyj5e9bE4VgUnxgPU6g=\n-----END CERTIFICATE-----\n" }, - "privateKey": { - "inlineString": "-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEIMoTkpRggp3fqZzFKh82yS4LjtJI+XY+qX/7DefHFrtdoAoGCCqGSM49\nAwEHoUQDQgAEADPv1RHVNRfa2VKRAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Fav\nq5E0ivpNtv1QnFhxtPd7d5k4e+T7SkW1TQ==\n-----END EC PRIVATE KEY-----\n" + "privateKey": { + "inlineString": "-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEIMoTkpRggp3fqZzFKh82yS4LjtJI+XY+qX/7DefHFrtdoAoGCCqGSM49\nAwEHoUQDQgAEADPv1RHVNRfa2VKRAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Fav\nq5E0ivpNtv1QnFhxtPd7d5k4e+T7SkW1TQ==\n-----END EC PRIVATE KEY-----\n" } } ], - "validationContext": { - "trustedCa": { - "inlineString": "-----BEGIN CERTIFICATE-----\nMIICXDCCAgKgAwIBAgIICpZq70Z9LyUwCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowFDESMBAG\nA1UEAxMJVGVzdCBDQSAyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEIhywH1gx\nAsMwuF3ukAI5YL2jFxH6Usnma1HFSfVyxbXX1/uoZEYrj8yCAtdU2yoHETyd+Zx2\nThhRLP79pYegCaOCATwwggE4MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTAD\nAQH/MGgGA1UdDgRhBF9kMToxMToxMTphYzoyYTpiYTo5NzpiMjozZjphYzo3Yjpi\nZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1ZTo0MTo2ZjpmMjo3\nMzo5NTo1ODowYzpkYjBqBgNVHSMEYzBhgF9kMToxMToxMTphYzoyYTpiYTo5Nzpi\nMjozZjphYzo3YjpiZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1\nZTo0MTo2ZjpmMjo3Mzo5NTo1ODowYzpkYjA/BgNVHREEODA2hjRzcGlmZmU6Ly8x\nMTExMTExMS0yMjIyLTMzMzMtNDQ0NC01NTU1NTU1NTU1NTUuY29uc3VsMAoGCCqG\nSM49BAMCA0gAMEUCICOY0i246rQHJt8o8Oya0D5PLL1FnmsQmQqIGCi31RwnAiEA\noR5f6Ku+cig2Il8T8LJujOp2/2A72QcHZA57B13y+8o=\n-----END CERTIFICATE-----\n" + "validationContext": { + "trustedCa": { + "inlineString": "-----BEGIN CERTIFICATE-----\nMIICXDCCAgKgAwIBAgIICpZq70Z9LyUwCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowFDESMBAG\nA1UEAxMJVGVzdCBDQSAyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEIhywH1gx\nAsMwuF3ukAI5YL2jFxH6Usnma1HFSfVyxbXX1/uoZEYrj8yCAtdU2yoHETyd+Zx2\nThhRLP79pYegCaOCATwwggE4MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTAD\nAQH/MGgGA1UdDgRhBF9kMToxMToxMTphYzoyYTpiYTo5NzpiMjozZjphYzo3Yjpi\nZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1ZTo0MTo2ZjpmMjo3\nMzo5NTo1ODowYzpkYjBqBgNVHSMEYzBhgF9kMToxMToxMTphYzoyYTpiYTo5Nzpi\nMjozZjphYzo3YjpiZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1\nZTo0MTo2ZjpmMjo3Mzo5NTo1ODowYzpkYjA/BgNVHREEODA2hjRzcGlmZmU6Ly8x\nMTExMTExMS0yMjIyLTMzMzMtNDQ0NC01NTU1NTU1NTU1NTUuY29uc3VsMAoGCCqG\nSM49BAMCA0gAMEUCICOY0i246rQHJt8o8Oya0D5PLL1FnmsQmQqIGCi31RwnAiEA\noR5f6Ku+cig2Il8T8LJujOp2/2A72QcHZA57B13y+8o=\n-----END CERTIFICATE-----\n" }, - "matchSubjectAltNames": [ + "matchSubjectAltNames": [ { - "exact": "spiffe://11111111-2222-3333-4444-555555555555.consul/ns/default/dc/dc3/svc/db" + "exact": "spiffe://11111111-2222-3333-4444-555555555555.consul/ns/default/dc/dc3/svc/db" } ] } }, - "sni": "db.default.dc3.internal.11111111-2222-3333-4444-555555555555.consul" + "sni": "db.default.dc3.internal.11111111-2222-3333-4444-555555555555.consul" } } }, { - "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", - "name": "geo-cache.default.dc1.query.11111111-2222-3333-4444-555555555555.consul", - "type": "EDS", - "edsClusterConfig": { - "edsConfig": { - "ads": { - - }, - "resourceApiVersion": "V3" + "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", + "name": "geo-cache.default.dc1.query.11111111-2222-3333-4444-555555555555.consul", + "type": "EDS", + "edsClusterConfig": { + "edsConfig": { + "ads": {}, + "resourceApiVersion": "V3" } }, - "connectTimeout": "5s", - "circuitBreakers": { - - }, - "outlierDetection": { - - }, - "transportSocket": { - "name": "tls", - "typedConfig": { - "@type": "type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext", - "commonTlsContext": { - "tlsParams": { - - }, - "tlsCertificates": [ + "connectTimeout": "5s", + "circuitBreakers": {}, + "outlierDetection": {}, + "transportSocket": { + "name": "tls", + "typedConfig": { + "@type": "type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext", + "commonTlsContext": { + "tlsParams": {}, + "tlsCertificates": [ { - "certificateChain": { - "inlineString": "-----BEGIN CERTIFICATE-----\nMIICjDCCAjKgAwIBAgIIC5llxGV1gB8wCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowDjEMMAoG\nA1UEAxMDd2ViMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEADPv1RHVNRfa2VKR\nAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Favq5E0ivpNtv1QnFhxtPd7d5k4e+T7\nSkW1TaOCAXIwggFuMA4GA1UdDwEB/wQEAwIDuDAdBgNVHSUEFjAUBggrBgEFBQcD\nAgYIKwYBBQUHAwEwDAYDVR0TAQH/BAIwADBoBgNVHQ4EYQRfN2Q6MDc6ODc6M2E6\nNDA6MTk6NDc6YzM6NWE6YzA6YmE6NjI6ZGY6YWY6NGI6ZDQ6MDU6MjU6NzY6M2Q6\nNWE6OGQ6MTY6OGQ6Njc6NWU6MmU6YTA6MzQ6N2Q6ZGM6ZmYwagYDVR0jBGMwYYBf\nZDE6MTE6MTE6YWM6MmE6YmE6OTc6YjI6M2Y6YWM6N2I6YmQ6ZGE6YmU6YjE6OGE6\nZmM6OWE6YmE6YjU6YmM6ODM6ZTc6NWU6NDE6NmY6ZjI6NzM6OTU6NTg6MGM6ZGIw\nWQYDVR0RBFIwUIZOc3BpZmZlOi8vMTExMTExMTEtMjIyMi0zMzMzLTQ0NDQtNTU1\nNTU1NTU1NTU1LmNvbnN1bC9ucy9kZWZhdWx0L2RjL2RjMS9zdmMvd2ViMAoGCCqG\nSM49BAMCA0gAMEUCIGC3TTvvjj76KMrguVyFf4tjOqaSCRie3nmHMRNNRav7AiEA\npY0heYeK9A6iOLrzqxSerkXXQyj5e9bE4VgUnxgPU6g=\n-----END CERTIFICATE-----\n" + "certificateChain": { + "inlineString": "-----BEGIN CERTIFICATE-----\nMIICjDCCAjKgAwIBAgIIC5llxGV1gB8wCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowDjEMMAoG\nA1UEAxMDd2ViMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEADPv1RHVNRfa2VKR\nAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Favq5E0ivpNtv1QnFhxtPd7d5k4e+T7\nSkW1TaOCAXIwggFuMA4GA1UdDwEB/wQEAwIDuDAdBgNVHSUEFjAUBggrBgEFBQcD\nAgYIKwYBBQUHAwEwDAYDVR0TAQH/BAIwADBoBgNVHQ4EYQRfN2Q6MDc6ODc6M2E6\nNDA6MTk6NDc6YzM6NWE6YzA6YmE6NjI6ZGY6YWY6NGI6ZDQ6MDU6MjU6NzY6M2Q6\nNWE6OGQ6MTY6OGQ6Njc6NWU6MmU6YTA6MzQ6N2Q6ZGM6ZmYwagYDVR0jBGMwYYBf\nZDE6MTE6MTE6YWM6MmE6YmE6OTc6YjI6M2Y6YWM6N2I6YmQ6ZGE6YmU6YjE6OGE6\nZmM6OWE6YmE6YjU6YmM6ODM6ZTc6NWU6NDE6NmY6ZjI6NzM6OTU6NTg6MGM6ZGIw\nWQYDVR0RBFIwUIZOc3BpZmZlOi8vMTExMTExMTEtMjIyMi0zMzMzLTQ0NDQtNTU1\nNTU1NTU1NTU1LmNvbnN1bC9ucy9kZWZhdWx0L2RjL2RjMS9zdmMvd2ViMAoGCCqG\nSM49BAMCA0gAMEUCIGC3TTvvjj76KMrguVyFf4tjOqaSCRie3nmHMRNNRav7AiEA\npY0heYeK9A6iOLrzqxSerkXXQyj5e9bE4VgUnxgPU6g=\n-----END CERTIFICATE-----\n" }, - "privateKey": { - "inlineString": "-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEIMoTkpRggp3fqZzFKh82yS4LjtJI+XY+qX/7DefHFrtdoAoGCCqGSM49\nAwEHoUQDQgAEADPv1RHVNRfa2VKRAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Fav\nq5E0ivpNtv1QnFhxtPd7d5k4e+T7SkW1TQ==\n-----END EC PRIVATE KEY-----\n" + "privateKey": { + "inlineString": "-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEIMoTkpRggp3fqZzFKh82yS4LjtJI+XY+qX/7DefHFrtdoAoGCCqGSM49\nAwEHoUQDQgAEADPv1RHVNRfa2VKRAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Fav\nq5E0ivpNtv1QnFhxtPd7d5k4e+T7SkW1TQ==\n-----END EC PRIVATE KEY-----\n" } } ], - "validationContext": { - "trustedCa": { - "inlineString": "-----BEGIN CERTIFICATE-----\nMIICXDCCAgKgAwIBAgIICpZq70Z9LyUwCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowFDESMBAG\nA1UEAxMJVGVzdCBDQSAyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEIhywH1gx\nAsMwuF3ukAI5YL2jFxH6Usnma1HFSfVyxbXX1/uoZEYrj8yCAtdU2yoHETyd+Zx2\nThhRLP79pYegCaOCATwwggE4MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTAD\nAQH/MGgGA1UdDgRhBF9kMToxMToxMTphYzoyYTpiYTo5NzpiMjozZjphYzo3Yjpi\nZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1ZTo0MTo2ZjpmMjo3\nMzo5NTo1ODowYzpkYjBqBgNVHSMEYzBhgF9kMToxMToxMTphYzoyYTpiYTo5Nzpi\nMjozZjphYzo3YjpiZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1\nZTo0MTo2ZjpmMjo3Mzo5NTo1ODowYzpkYjA/BgNVHREEODA2hjRzcGlmZmU6Ly8x\nMTExMTExMS0yMjIyLTMzMzMtNDQ0NC01NTU1NTU1NTU1NTUuY29uc3VsMAoGCCqG\nSM49BAMCA0gAMEUCICOY0i246rQHJt8o8Oya0D5PLL1FnmsQmQqIGCi31RwnAiEA\noR5f6Ku+cig2Il8T8LJujOp2/2A72QcHZA57B13y+8o=\n-----END CERTIFICATE-----\n" + "validationContext": { + "trustedCa": { + "inlineString": "-----BEGIN CERTIFICATE-----\nMIICXDCCAgKgAwIBAgIICpZq70Z9LyUwCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowFDESMBAG\nA1UEAxMJVGVzdCBDQSAyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEIhywH1gx\nAsMwuF3ukAI5YL2jFxH6Usnma1HFSfVyxbXX1/uoZEYrj8yCAtdU2yoHETyd+Zx2\nThhRLP79pYegCaOCATwwggE4MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTAD\nAQH/MGgGA1UdDgRhBF9kMToxMToxMTphYzoyYTpiYTo5NzpiMjozZjphYzo3Yjpi\nZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1ZTo0MTo2ZjpmMjo3\nMzo5NTo1ODowYzpkYjBqBgNVHSMEYzBhgF9kMToxMToxMTphYzoyYTpiYTo5Nzpi\nMjozZjphYzo3YjpiZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1\nZTo0MTo2ZjpmMjo3Mzo5NTo1ODowYzpkYjA/BgNVHREEODA2hjRzcGlmZmU6Ly8x\nMTExMTExMS0yMjIyLTMzMzMtNDQ0NC01NTU1NTU1NTU1NTUuY29uc3VsMAoGCCqG\nSM49BAMCA0gAMEUCICOY0i246rQHJt8o8Oya0D5PLL1FnmsQmQqIGCi31RwnAiEA\noR5f6Ku+cig2Il8T8LJujOp2/2A72QcHZA57B13y+8o=\n-----END CERTIFICATE-----\n" }, - "matchSubjectAltNames": [ + "matchSubjectAltNames": [ { - "exact": "spiffe://11111111-2222-3333-4444-555555555555.consul/ns/default/dc/dc1/svc/geo-cache-target" + "exact": "spiffe://11111111-2222-3333-4444-555555555555.consul/ns/default/dc/dc1/svc/geo-cache-target" }, { - "exact": "spiffe://11111111-2222-3333-4444-555555555555.consul/ns/default/dc/dc2/svc/geo-cache-target" + "exact": "spiffe://11111111-2222-3333-4444-555555555555.consul/ns/default/dc/dc2/svc/geo-cache-target" } ] } }, - "sni": "geo-cache.default.dc1.query.11111111-2222-3333-4444-555555555555.consul" + "sni": "geo-cache.default.dc1.query.11111111-2222-3333-4444-555555555555.consul" } } }, { - "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", - "name": "local_app", - "type": "STATIC", - "connectTimeout": "5s", - "loadAssignment": { - "clusterName": "local_app", - "endpoints": [ + "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", + "name": "local_app", + "type": "STATIC", + "connectTimeout": "5s", + "loadAssignment": { + "clusterName": "local_app", + "endpoints": [ { - "lbEndpoints": [ + "lbEndpoints": [ { - "endpoint": { - "address": { - "socketAddress": { - "address": "127.0.0.1", - "portValue": 8080 + "endpoint": { + "address": { + "socketAddress": { + "address": "127.0.0.1", + "portValue": 8080 } } } @@ -274,6 +236,6 @@ } } ], - "typeUrl": "type.googleapis.com/envoy.config.cluster.v3.Cluster", - "nonce": "00000001" + "typeUrl": "type.googleapis.com/envoy.config.cluster.v3.Cluster", + "nonce": "00000001" } \ No newline at end of file diff --git a/agent/xds/testdata/clusters/connect-proxy-with-tcp-chain-double-failover-through-local-gateway.latest.golden b/agent/xds/testdata/clusters/connect-proxy-with-tcp-chain-double-failover-through-local-gateway.latest.golden index e434b71c10f..35a149b7261 100644 --- a/agent/xds/testdata/clusters/connect-proxy-with-tcp-chain-double-failover-through-local-gateway.latest.golden +++ b/agent/xds/testdata/clusters/connect-proxy-with-tcp-chain-double-failover-through-local-gateway.latest.golden @@ -1,269 +1,231 @@ { - "versionInfo": "00000001", - "resources": [ + "versionInfo": "00000001", + "resources": [ { - "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", - "name": "db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", - "altStatName": "db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", - "clusterType": { - "name": "envoy.clusters.aggregate", - "typedConfig": { - "@type": "type.googleapis.com/envoy.extensions.clusters.aggregate.v3.ClusterConfig", - "clusters": [ - "failover-target~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", - "failover-target~db.default.dc2.internal.11111111-2222-3333-4444-555555555555.consul", - "failover-target~db.default.dc3.internal.11111111-2222-3333-4444-555555555555.consul" + "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", + "name": "db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "altStatName": "db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "clusterType": { + "name": "envoy.clusters.aggregate", + "typedConfig": { + "@type": "type.googleapis.com/envoy.extensions.clusters.aggregate.v3.ClusterConfig", + "clusters": [ + "failover-target~0~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "failover-target~1~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "failover-target~2~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul" ] } }, - "connectTimeout": "33s", - "lbPolicy": "CLUSTER_PROVIDED" + "connectTimeout": "33s", + "lbPolicy": "CLUSTER_PROVIDED" }, { - "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", - "name": "failover-target~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", - "altStatName": "failover-target~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", - "type": "EDS", - "edsClusterConfig": { - "edsConfig": { - "ads": { - - }, - "resourceApiVersion": "V3" - } - }, - "connectTimeout": "33s", - "circuitBreakers": { - - }, - "outlierDetection": { - - }, - "commonLbConfig": { - "healthyPanicThreshold": { - + "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", + "name": "failover-target~0~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "altStatName": "failover-target~0~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "type": "EDS", + "edsClusterConfig": { + "edsConfig": { + "ads": {}, + "resourceApiVersion": "V3" } }, - "transportSocket": { - "name": "tls", - "typedConfig": { - "@type": "type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext", - "commonTlsContext": { - "tlsParams": { - - }, - "tlsCertificates": [ + "connectTimeout": "33s", + "circuitBreakers": {}, + "outlierDetection": {}, + "commonLbConfig": { + "healthyPanicThreshold": {} + }, + "transportSocket": { + "name": "tls", + "typedConfig": { + "@type": "type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext", + "commonTlsContext": { + "tlsParams": {}, + "tlsCertificates": [ { - "certificateChain": { - "inlineString": "-----BEGIN CERTIFICATE-----\nMIICjDCCAjKgAwIBAgIIC5llxGV1gB8wCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowDjEMMAoG\nA1UEAxMDd2ViMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEADPv1RHVNRfa2VKR\nAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Favq5E0ivpNtv1QnFhxtPd7d5k4e+T7\nSkW1TaOCAXIwggFuMA4GA1UdDwEB/wQEAwIDuDAdBgNVHSUEFjAUBggrBgEFBQcD\nAgYIKwYBBQUHAwEwDAYDVR0TAQH/BAIwADBoBgNVHQ4EYQRfN2Q6MDc6ODc6M2E6\nNDA6MTk6NDc6YzM6NWE6YzA6YmE6NjI6ZGY6YWY6NGI6ZDQ6MDU6MjU6NzY6M2Q6\nNWE6OGQ6MTY6OGQ6Njc6NWU6MmU6YTA6MzQ6N2Q6ZGM6ZmYwagYDVR0jBGMwYYBf\nZDE6MTE6MTE6YWM6MmE6YmE6OTc6YjI6M2Y6YWM6N2I6YmQ6ZGE6YmU6YjE6OGE6\nZmM6OWE6YmE6YjU6YmM6ODM6ZTc6NWU6NDE6NmY6ZjI6NzM6OTU6NTg6MGM6ZGIw\nWQYDVR0RBFIwUIZOc3BpZmZlOi8vMTExMTExMTEtMjIyMi0zMzMzLTQ0NDQtNTU1\nNTU1NTU1NTU1LmNvbnN1bC9ucy9kZWZhdWx0L2RjL2RjMS9zdmMvd2ViMAoGCCqG\nSM49BAMCA0gAMEUCIGC3TTvvjj76KMrguVyFf4tjOqaSCRie3nmHMRNNRav7AiEA\npY0heYeK9A6iOLrzqxSerkXXQyj5e9bE4VgUnxgPU6g=\n-----END CERTIFICATE-----\n" + "certificateChain": { + "inlineString": "-----BEGIN CERTIFICATE-----\nMIICjDCCAjKgAwIBAgIIC5llxGV1gB8wCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowDjEMMAoG\nA1UEAxMDd2ViMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEADPv1RHVNRfa2VKR\nAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Favq5E0ivpNtv1QnFhxtPd7d5k4e+T7\nSkW1TaOCAXIwggFuMA4GA1UdDwEB/wQEAwIDuDAdBgNVHSUEFjAUBggrBgEFBQcD\nAgYIKwYBBQUHAwEwDAYDVR0TAQH/BAIwADBoBgNVHQ4EYQRfN2Q6MDc6ODc6M2E6\nNDA6MTk6NDc6YzM6NWE6YzA6YmE6NjI6ZGY6YWY6NGI6ZDQ6MDU6MjU6NzY6M2Q6\nNWE6OGQ6MTY6OGQ6Njc6NWU6MmU6YTA6MzQ6N2Q6ZGM6ZmYwagYDVR0jBGMwYYBf\nZDE6MTE6MTE6YWM6MmE6YmE6OTc6YjI6M2Y6YWM6N2I6YmQ6ZGE6YmU6YjE6OGE6\nZmM6OWE6YmE6YjU6YmM6ODM6ZTc6NWU6NDE6NmY6ZjI6NzM6OTU6NTg6MGM6ZGIw\nWQYDVR0RBFIwUIZOc3BpZmZlOi8vMTExMTExMTEtMjIyMi0zMzMzLTQ0NDQtNTU1\nNTU1NTU1NTU1LmNvbnN1bC9ucy9kZWZhdWx0L2RjL2RjMS9zdmMvd2ViMAoGCCqG\nSM49BAMCA0gAMEUCIGC3TTvvjj76KMrguVyFf4tjOqaSCRie3nmHMRNNRav7AiEA\npY0heYeK9A6iOLrzqxSerkXXQyj5e9bE4VgUnxgPU6g=\n-----END CERTIFICATE-----\n" }, - "privateKey": { - "inlineString": "-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEIMoTkpRggp3fqZzFKh82yS4LjtJI+XY+qX/7DefHFrtdoAoGCCqGSM49\nAwEHoUQDQgAEADPv1RHVNRfa2VKRAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Fav\nq5E0ivpNtv1QnFhxtPd7d5k4e+T7SkW1TQ==\n-----END EC PRIVATE KEY-----\n" + "privateKey": { + "inlineString": "-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEIMoTkpRggp3fqZzFKh82yS4LjtJI+XY+qX/7DefHFrtdoAoGCCqGSM49\nAwEHoUQDQgAEADPv1RHVNRfa2VKRAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Fav\nq5E0ivpNtv1QnFhxtPd7d5k4e+T7SkW1TQ==\n-----END EC PRIVATE KEY-----\n" } } ], - "validationContext": { - "trustedCa": { - "inlineString": "-----BEGIN CERTIFICATE-----\nMIICXDCCAgKgAwIBAgIICpZq70Z9LyUwCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowFDESMBAG\nA1UEAxMJVGVzdCBDQSAyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEIhywH1gx\nAsMwuF3ukAI5YL2jFxH6Usnma1HFSfVyxbXX1/uoZEYrj8yCAtdU2yoHETyd+Zx2\nThhRLP79pYegCaOCATwwggE4MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTAD\nAQH/MGgGA1UdDgRhBF9kMToxMToxMTphYzoyYTpiYTo5NzpiMjozZjphYzo3Yjpi\nZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1ZTo0MTo2ZjpmMjo3\nMzo5NTo1ODowYzpkYjBqBgNVHSMEYzBhgF9kMToxMToxMTphYzoyYTpiYTo5Nzpi\nMjozZjphYzo3YjpiZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1\nZTo0MTo2ZjpmMjo3Mzo5NTo1ODowYzpkYjA/BgNVHREEODA2hjRzcGlmZmU6Ly8x\nMTExMTExMS0yMjIyLTMzMzMtNDQ0NC01NTU1NTU1NTU1NTUuY29uc3VsMAoGCCqG\nSM49BAMCA0gAMEUCICOY0i246rQHJt8o8Oya0D5PLL1FnmsQmQqIGCi31RwnAiEA\noR5f6Ku+cig2Il8T8LJujOp2/2A72QcHZA57B13y+8o=\n-----END CERTIFICATE-----\n" + "validationContext": { + "trustedCa": { + "inlineString": "-----BEGIN CERTIFICATE-----\nMIICXDCCAgKgAwIBAgIICpZq70Z9LyUwCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowFDESMBAG\nA1UEAxMJVGVzdCBDQSAyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEIhywH1gx\nAsMwuF3ukAI5YL2jFxH6Usnma1HFSfVyxbXX1/uoZEYrj8yCAtdU2yoHETyd+Zx2\nThhRLP79pYegCaOCATwwggE4MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTAD\nAQH/MGgGA1UdDgRhBF9kMToxMToxMTphYzoyYTpiYTo5NzpiMjozZjphYzo3Yjpi\nZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1ZTo0MTo2ZjpmMjo3\nMzo5NTo1ODowYzpkYjBqBgNVHSMEYzBhgF9kMToxMToxMTphYzoyYTpiYTo5Nzpi\nMjozZjphYzo3YjpiZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1\nZTo0MTo2ZjpmMjo3Mzo5NTo1ODowYzpkYjA/BgNVHREEODA2hjRzcGlmZmU6Ly8x\nMTExMTExMS0yMjIyLTMzMzMtNDQ0NC01NTU1NTU1NTU1NTUuY29uc3VsMAoGCCqG\nSM49BAMCA0gAMEUCICOY0i246rQHJt8o8Oya0D5PLL1FnmsQmQqIGCi31RwnAiEA\noR5f6Ku+cig2Il8T8LJujOp2/2A72QcHZA57B13y+8o=\n-----END CERTIFICATE-----\n" }, - "matchSubjectAltNames": [ + "matchSubjectAltNames": [ { - "exact": "spiffe://11111111-2222-3333-4444-555555555555.consul/ns/default/dc/dc1/svc/db" + "exact": "spiffe://11111111-2222-3333-4444-555555555555.consul/ns/default/dc/dc1/svc/db" } ] } }, - "sni": "db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul" + "sni": "db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul" } } }, { - "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", - "name": "failover-target~db.default.dc2.internal.11111111-2222-3333-4444-555555555555.consul", - "altStatName": "failover-target~db.default.dc2.internal.11111111-2222-3333-4444-555555555555.consul", - "type": "EDS", - "edsClusterConfig": { - "edsConfig": { - "ads": { - - }, - "resourceApiVersion": "V3" - } - }, - "connectTimeout": "33s", - "circuitBreakers": { - - }, - "outlierDetection": { - - }, - "commonLbConfig": { - "healthyPanicThreshold": { - + "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", + "name": "failover-target~1~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "altStatName": "failover-target~1~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "type": "EDS", + "edsClusterConfig": { + "edsConfig": { + "ads": {}, + "resourceApiVersion": "V3" } }, - "transportSocket": { - "name": "tls", - "typedConfig": { - "@type": "type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext", - "commonTlsContext": { - "tlsParams": { - - }, - "tlsCertificates": [ + "connectTimeout": "33s", + "circuitBreakers": {}, + "outlierDetection": {}, + "commonLbConfig": { + "healthyPanicThreshold": {} + }, + "transportSocket": { + "name": "tls", + "typedConfig": { + "@type": "type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext", + "commonTlsContext": { + "tlsParams": {}, + "tlsCertificates": [ { - "certificateChain": { - "inlineString": "-----BEGIN CERTIFICATE-----\nMIICjDCCAjKgAwIBAgIIC5llxGV1gB8wCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowDjEMMAoG\nA1UEAxMDd2ViMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEADPv1RHVNRfa2VKR\nAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Favq5E0ivpNtv1QnFhxtPd7d5k4e+T7\nSkW1TaOCAXIwggFuMA4GA1UdDwEB/wQEAwIDuDAdBgNVHSUEFjAUBggrBgEFBQcD\nAgYIKwYBBQUHAwEwDAYDVR0TAQH/BAIwADBoBgNVHQ4EYQRfN2Q6MDc6ODc6M2E6\nNDA6MTk6NDc6YzM6NWE6YzA6YmE6NjI6ZGY6YWY6NGI6ZDQ6MDU6MjU6NzY6M2Q6\nNWE6OGQ6MTY6OGQ6Njc6NWU6MmU6YTA6MzQ6N2Q6ZGM6ZmYwagYDVR0jBGMwYYBf\nZDE6MTE6MTE6YWM6MmE6YmE6OTc6YjI6M2Y6YWM6N2I6YmQ6ZGE6YmU6YjE6OGE6\nZmM6OWE6YmE6YjU6YmM6ODM6ZTc6NWU6NDE6NmY6ZjI6NzM6OTU6NTg6MGM6ZGIw\nWQYDVR0RBFIwUIZOc3BpZmZlOi8vMTExMTExMTEtMjIyMi0zMzMzLTQ0NDQtNTU1\nNTU1NTU1NTU1LmNvbnN1bC9ucy9kZWZhdWx0L2RjL2RjMS9zdmMvd2ViMAoGCCqG\nSM49BAMCA0gAMEUCIGC3TTvvjj76KMrguVyFf4tjOqaSCRie3nmHMRNNRav7AiEA\npY0heYeK9A6iOLrzqxSerkXXQyj5e9bE4VgUnxgPU6g=\n-----END CERTIFICATE-----\n" + "certificateChain": { + "inlineString": "-----BEGIN CERTIFICATE-----\nMIICjDCCAjKgAwIBAgIIC5llxGV1gB8wCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowDjEMMAoG\nA1UEAxMDd2ViMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEADPv1RHVNRfa2VKR\nAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Favq5E0ivpNtv1QnFhxtPd7d5k4e+T7\nSkW1TaOCAXIwggFuMA4GA1UdDwEB/wQEAwIDuDAdBgNVHSUEFjAUBggrBgEFBQcD\nAgYIKwYBBQUHAwEwDAYDVR0TAQH/BAIwADBoBgNVHQ4EYQRfN2Q6MDc6ODc6M2E6\nNDA6MTk6NDc6YzM6NWE6YzA6YmE6NjI6ZGY6YWY6NGI6ZDQ6MDU6MjU6NzY6M2Q6\nNWE6OGQ6MTY6OGQ6Njc6NWU6MmU6YTA6MzQ6N2Q6ZGM6ZmYwagYDVR0jBGMwYYBf\nZDE6MTE6MTE6YWM6MmE6YmE6OTc6YjI6M2Y6YWM6N2I6YmQ6ZGE6YmU6YjE6OGE6\nZmM6OWE6YmE6YjU6YmM6ODM6ZTc6NWU6NDE6NmY6ZjI6NzM6OTU6NTg6MGM6ZGIw\nWQYDVR0RBFIwUIZOc3BpZmZlOi8vMTExMTExMTEtMjIyMi0zMzMzLTQ0NDQtNTU1\nNTU1NTU1NTU1LmNvbnN1bC9ucy9kZWZhdWx0L2RjL2RjMS9zdmMvd2ViMAoGCCqG\nSM49BAMCA0gAMEUCIGC3TTvvjj76KMrguVyFf4tjOqaSCRie3nmHMRNNRav7AiEA\npY0heYeK9A6iOLrzqxSerkXXQyj5e9bE4VgUnxgPU6g=\n-----END CERTIFICATE-----\n" }, - "privateKey": { - "inlineString": "-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEIMoTkpRggp3fqZzFKh82yS4LjtJI+XY+qX/7DefHFrtdoAoGCCqGSM49\nAwEHoUQDQgAEADPv1RHVNRfa2VKRAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Fav\nq5E0ivpNtv1QnFhxtPd7d5k4e+T7SkW1TQ==\n-----END EC PRIVATE KEY-----\n" + "privateKey": { + "inlineString": "-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEIMoTkpRggp3fqZzFKh82yS4LjtJI+XY+qX/7DefHFrtdoAoGCCqGSM49\nAwEHoUQDQgAEADPv1RHVNRfa2VKRAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Fav\nq5E0ivpNtv1QnFhxtPd7d5k4e+T7SkW1TQ==\n-----END EC PRIVATE KEY-----\n" } } ], - "validationContext": { - "trustedCa": { - "inlineString": "-----BEGIN CERTIFICATE-----\nMIICXDCCAgKgAwIBAgIICpZq70Z9LyUwCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowFDESMBAG\nA1UEAxMJVGVzdCBDQSAyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEIhywH1gx\nAsMwuF3ukAI5YL2jFxH6Usnma1HFSfVyxbXX1/uoZEYrj8yCAtdU2yoHETyd+Zx2\nThhRLP79pYegCaOCATwwggE4MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTAD\nAQH/MGgGA1UdDgRhBF9kMToxMToxMTphYzoyYTpiYTo5NzpiMjozZjphYzo3Yjpi\nZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1ZTo0MTo2ZjpmMjo3\nMzo5NTo1ODowYzpkYjBqBgNVHSMEYzBhgF9kMToxMToxMTphYzoyYTpiYTo5Nzpi\nMjozZjphYzo3YjpiZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1\nZTo0MTo2ZjpmMjo3Mzo5NTo1ODowYzpkYjA/BgNVHREEODA2hjRzcGlmZmU6Ly8x\nMTExMTExMS0yMjIyLTMzMzMtNDQ0NC01NTU1NTU1NTU1NTUuY29uc3VsMAoGCCqG\nSM49BAMCA0gAMEUCICOY0i246rQHJt8o8Oya0D5PLL1FnmsQmQqIGCi31RwnAiEA\noR5f6Ku+cig2Il8T8LJujOp2/2A72QcHZA57B13y+8o=\n-----END CERTIFICATE-----\n" + "validationContext": { + "trustedCa": { + "inlineString": "-----BEGIN CERTIFICATE-----\nMIICXDCCAgKgAwIBAgIICpZq70Z9LyUwCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowFDESMBAG\nA1UEAxMJVGVzdCBDQSAyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEIhywH1gx\nAsMwuF3ukAI5YL2jFxH6Usnma1HFSfVyxbXX1/uoZEYrj8yCAtdU2yoHETyd+Zx2\nThhRLP79pYegCaOCATwwggE4MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTAD\nAQH/MGgGA1UdDgRhBF9kMToxMToxMTphYzoyYTpiYTo5NzpiMjozZjphYzo3Yjpi\nZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1ZTo0MTo2ZjpmMjo3\nMzo5NTo1ODowYzpkYjBqBgNVHSMEYzBhgF9kMToxMToxMTphYzoyYTpiYTo5Nzpi\nMjozZjphYzo3YjpiZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1\nZTo0MTo2ZjpmMjo3Mzo5NTo1ODowYzpkYjA/BgNVHREEODA2hjRzcGlmZmU6Ly8x\nMTExMTExMS0yMjIyLTMzMzMtNDQ0NC01NTU1NTU1NTU1NTUuY29uc3VsMAoGCCqG\nSM49BAMCA0gAMEUCICOY0i246rQHJt8o8Oya0D5PLL1FnmsQmQqIGCi31RwnAiEA\noR5f6Ku+cig2Il8T8LJujOp2/2A72QcHZA57B13y+8o=\n-----END CERTIFICATE-----\n" }, - "matchSubjectAltNames": [ + "matchSubjectAltNames": [ { - "exact": "spiffe://11111111-2222-3333-4444-555555555555.consul/ns/default/dc/dc2/svc/db" + "exact": "spiffe://11111111-2222-3333-4444-555555555555.consul/ns/default/dc/dc2/svc/db" } ] } }, - "sni": "db.default.dc2.internal.11111111-2222-3333-4444-555555555555.consul" + "sni": "db.default.dc2.internal.11111111-2222-3333-4444-555555555555.consul" } } }, { - "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", - "name": "failover-target~db.default.dc3.internal.11111111-2222-3333-4444-555555555555.consul", - "altStatName": "failover-target~db.default.dc3.internal.11111111-2222-3333-4444-555555555555.consul", - "type": "EDS", - "edsClusterConfig": { - "edsConfig": { - "ads": { - - }, - "resourceApiVersion": "V3" + "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", + "name": "failover-target~2~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "altStatName": "failover-target~2~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "type": "EDS", + "edsClusterConfig": { + "edsConfig": { + "ads": {}, + "resourceApiVersion": "V3" } }, - "connectTimeout": "33s", - "circuitBreakers": { - - }, - "outlierDetection": { - - }, - "commonLbConfig": { - "healthyPanicThreshold": { - - } - }, - "transportSocket": { - "name": "tls", - "typedConfig": { - "@type": "type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext", - "commonTlsContext": { - "tlsParams": { - - }, - "tlsCertificates": [ + "connectTimeout": "33s", + "circuitBreakers": {}, + "outlierDetection": {}, + "commonLbConfig": { + "healthyPanicThreshold": {} + }, + "transportSocket": { + "name": "tls", + "typedConfig": { + "@type": "type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext", + "commonTlsContext": { + "tlsParams": {}, + "tlsCertificates": [ { - "certificateChain": { - "inlineString": "-----BEGIN CERTIFICATE-----\nMIICjDCCAjKgAwIBAgIIC5llxGV1gB8wCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowDjEMMAoG\nA1UEAxMDd2ViMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEADPv1RHVNRfa2VKR\nAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Favq5E0ivpNtv1QnFhxtPd7d5k4e+T7\nSkW1TaOCAXIwggFuMA4GA1UdDwEB/wQEAwIDuDAdBgNVHSUEFjAUBggrBgEFBQcD\nAgYIKwYBBQUHAwEwDAYDVR0TAQH/BAIwADBoBgNVHQ4EYQRfN2Q6MDc6ODc6M2E6\nNDA6MTk6NDc6YzM6NWE6YzA6YmE6NjI6ZGY6YWY6NGI6ZDQ6MDU6MjU6NzY6M2Q6\nNWE6OGQ6MTY6OGQ6Njc6NWU6MmU6YTA6MzQ6N2Q6ZGM6ZmYwagYDVR0jBGMwYYBf\nZDE6MTE6MTE6YWM6MmE6YmE6OTc6YjI6M2Y6YWM6N2I6YmQ6ZGE6YmU6YjE6OGE6\nZmM6OWE6YmE6YjU6YmM6ODM6ZTc6NWU6NDE6NmY6ZjI6NzM6OTU6NTg6MGM6ZGIw\nWQYDVR0RBFIwUIZOc3BpZmZlOi8vMTExMTExMTEtMjIyMi0zMzMzLTQ0NDQtNTU1\nNTU1NTU1NTU1LmNvbnN1bC9ucy9kZWZhdWx0L2RjL2RjMS9zdmMvd2ViMAoGCCqG\nSM49BAMCA0gAMEUCIGC3TTvvjj76KMrguVyFf4tjOqaSCRie3nmHMRNNRav7AiEA\npY0heYeK9A6iOLrzqxSerkXXQyj5e9bE4VgUnxgPU6g=\n-----END CERTIFICATE-----\n" + "certificateChain": { + "inlineString": "-----BEGIN CERTIFICATE-----\nMIICjDCCAjKgAwIBAgIIC5llxGV1gB8wCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowDjEMMAoG\nA1UEAxMDd2ViMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEADPv1RHVNRfa2VKR\nAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Favq5E0ivpNtv1QnFhxtPd7d5k4e+T7\nSkW1TaOCAXIwggFuMA4GA1UdDwEB/wQEAwIDuDAdBgNVHSUEFjAUBggrBgEFBQcD\nAgYIKwYBBQUHAwEwDAYDVR0TAQH/BAIwADBoBgNVHQ4EYQRfN2Q6MDc6ODc6M2E6\nNDA6MTk6NDc6YzM6NWE6YzA6YmE6NjI6ZGY6YWY6NGI6ZDQ6MDU6MjU6NzY6M2Q6\nNWE6OGQ6MTY6OGQ6Njc6NWU6MmU6YTA6MzQ6N2Q6ZGM6ZmYwagYDVR0jBGMwYYBf\nZDE6MTE6MTE6YWM6MmE6YmE6OTc6YjI6M2Y6YWM6N2I6YmQ6ZGE6YmU6YjE6OGE6\nZmM6OWE6YmE6YjU6YmM6ODM6ZTc6NWU6NDE6NmY6ZjI6NzM6OTU6NTg6MGM6ZGIw\nWQYDVR0RBFIwUIZOc3BpZmZlOi8vMTExMTExMTEtMjIyMi0zMzMzLTQ0NDQtNTU1\nNTU1NTU1NTU1LmNvbnN1bC9ucy9kZWZhdWx0L2RjL2RjMS9zdmMvd2ViMAoGCCqG\nSM49BAMCA0gAMEUCIGC3TTvvjj76KMrguVyFf4tjOqaSCRie3nmHMRNNRav7AiEA\npY0heYeK9A6iOLrzqxSerkXXQyj5e9bE4VgUnxgPU6g=\n-----END CERTIFICATE-----\n" }, - "privateKey": { - "inlineString": "-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEIMoTkpRggp3fqZzFKh82yS4LjtJI+XY+qX/7DefHFrtdoAoGCCqGSM49\nAwEHoUQDQgAEADPv1RHVNRfa2VKRAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Fav\nq5E0ivpNtv1QnFhxtPd7d5k4e+T7SkW1TQ==\n-----END EC PRIVATE KEY-----\n" + "privateKey": { + "inlineString": "-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEIMoTkpRggp3fqZzFKh82yS4LjtJI+XY+qX/7DefHFrtdoAoGCCqGSM49\nAwEHoUQDQgAEADPv1RHVNRfa2VKRAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Fav\nq5E0ivpNtv1QnFhxtPd7d5k4e+T7SkW1TQ==\n-----END EC PRIVATE KEY-----\n" } } ], - "validationContext": { - "trustedCa": { - "inlineString": "-----BEGIN CERTIFICATE-----\nMIICXDCCAgKgAwIBAgIICpZq70Z9LyUwCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowFDESMBAG\nA1UEAxMJVGVzdCBDQSAyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEIhywH1gx\nAsMwuF3ukAI5YL2jFxH6Usnma1HFSfVyxbXX1/uoZEYrj8yCAtdU2yoHETyd+Zx2\nThhRLP79pYegCaOCATwwggE4MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTAD\nAQH/MGgGA1UdDgRhBF9kMToxMToxMTphYzoyYTpiYTo5NzpiMjozZjphYzo3Yjpi\nZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1ZTo0MTo2ZjpmMjo3\nMzo5NTo1ODowYzpkYjBqBgNVHSMEYzBhgF9kMToxMToxMTphYzoyYTpiYTo5Nzpi\nMjozZjphYzo3YjpiZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1\nZTo0MTo2ZjpmMjo3Mzo5NTo1ODowYzpkYjA/BgNVHREEODA2hjRzcGlmZmU6Ly8x\nMTExMTExMS0yMjIyLTMzMzMtNDQ0NC01NTU1NTU1NTU1NTUuY29uc3VsMAoGCCqG\nSM49BAMCA0gAMEUCICOY0i246rQHJt8o8Oya0D5PLL1FnmsQmQqIGCi31RwnAiEA\noR5f6Ku+cig2Il8T8LJujOp2/2A72QcHZA57B13y+8o=\n-----END CERTIFICATE-----\n" + "validationContext": { + "trustedCa": { + "inlineString": "-----BEGIN CERTIFICATE-----\nMIICXDCCAgKgAwIBAgIICpZq70Z9LyUwCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowFDESMBAG\nA1UEAxMJVGVzdCBDQSAyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEIhywH1gx\nAsMwuF3ukAI5YL2jFxH6Usnma1HFSfVyxbXX1/uoZEYrj8yCAtdU2yoHETyd+Zx2\nThhRLP79pYegCaOCATwwggE4MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTAD\nAQH/MGgGA1UdDgRhBF9kMToxMToxMTphYzoyYTpiYTo5NzpiMjozZjphYzo3Yjpi\nZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1ZTo0MTo2ZjpmMjo3\nMzo5NTo1ODowYzpkYjBqBgNVHSMEYzBhgF9kMToxMToxMTphYzoyYTpiYTo5Nzpi\nMjozZjphYzo3YjpiZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1\nZTo0MTo2ZjpmMjo3Mzo5NTo1ODowYzpkYjA/BgNVHREEODA2hjRzcGlmZmU6Ly8x\nMTExMTExMS0yMjIyLTMzMzMtNDQ0NC01NTU1NTU1NTU1NTUuY29uc3VsMAoGCCqG\nSM49BAMCA0gAMEUCICOY0i246rQHJt8o8Oya0D5PLL1FnmsQmQqIGCi31RwnAiEA\noR5f6Ku+cig2Il8T8LJujOp2/2A72QcHZA57B13y+8o=\n-----END CERTIFICATE-----\n" }, - "matchSubjectAltNames": [ + "matchSubjectAltNames": [ { - "exact": "spiffe://11111111-2222-3333-4444-555555555555.consul/ns/default/dc/dc3/svc/db" + "exact": "spiffe://11111111-2222-3333-4444-555555555555.consul/ns/default/dc/dc3/svc/db" } ] } }, - "sni": "db.default.dc3.internal.11111111-2222-3333-4444-555555555555.consul" + "sni": "db.default.dc3.internal.11111111-2222-3333-4444-555555555555.consul" } } }, { - "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", - "name": "geo-cache.default.dc1.query.11111111-2222-3333-4444-555555555555.consul", - "type": "EDS", - "edsClusterConfig": { - "edsConfig": { - "ads": { - - }, - "resourceApiVersion": "V3" + "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", + "name": "geo-cache.default.dc1.query.11111111-2222-3333-4444-555555555555.consul", + "type": "EDS", + "edsClusterConfig": { + "edsConfig": { + "ads": {}, + "resourceApiVersion": "V3" } }, - "connectTimeout": "5s", - "circuitBreakers": { - - }, - "outlierDetection": { - - }, - "transportSocket": { - "name": "tls", - "typedConfig": { - "@type": "type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext", - "commonTlsContext": { - "tlsParams": { - - }, - "tlsCertificates": [ + "connectTimeout": "5s", + "circuitBreakers": {}, + "outlierDetection": {}, + "transportSocket": { + "name": "tls", + "typedConfig": { + "@type": "type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext", + "commonTlsContext": { + "tlsParams": {}, + "tlsCertificates": [ { - "certificateChain": { - "inlineString": "-----BEGIN CERTIFICATE-----\nMIICjDCCAjKgAwIBAgIIC5llxGV1gB8wCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowDjEMMAoG\nA1UEAxMDd2ViMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEADPv1RHVNRfa2VKR\nAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Favq5E0ivpNtv1QnFhxtPd7d5k4e+T7\nSkW1TaOCAXIwggFuMA4GA1UdDwEB/wQEAwIDuDAdBgNVHSUEFjAUBggrBgEFBQcD\nAgYIKwYBBQUHAwEwDAYDVR0TAQH/BAIwADBoBgNVHQ4EYQRfN2Q6MDc6ODc6M2E6\nNDA6MTk6NDc6YzM6NWE6YzA6YmE6NjI6ZGY6YWY6NGI6ZDQ6MDU6MjU6NzY6M2Q6\nNWE6OGQ6MTY6OGQ6Njc6NWU6MmU6YTA6MzQ6N2Q6ZGM6ZmYwagYDVR0jBGMwYYBf\nZDE6MTE6MTE6YWM6MmE6YmE6OTc6YjI6M2Y6YWM6N2I6YmQ6ZGE6YmU6YjE6OGE6\nZmM6OWE6YmE6YjU6YmM6ODM6ZTc6NWU6NDE6NmY6ZjI6NzM6OTU6NTg6MGM6ZGIw\nWQYDVR0RBFIwUIZOc3BpZmZlOi8vMTExMTExMTEtMjIyMi0zMzMzLTQ0NDQtNTU1\nNTU1NTU1NTU1LmNvbnN1bC9ucy9kZWZhdWx0L2RjL2RjMS9zdmMvd2ViMAoGCCqG\nSM49BAMCA0gAMEUCIGC3TTvvjj76KMrguVyFf4tjOqaSCRie3nmHMRNNRav7AiEA\npY0heYeK9A6iOLrzqxSerkXXQyj5e9bE4VgUnxgPU6g=\n-----END CERTIFICATE-----\n" + "certificateChain": { + "inlineString": "-----BEGIN CERTIFICATE-----\nMIICjDCCAjKgAwIBAgIIC5llxGV1gB8wCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowDjEMMAoG\nA1UEAxMDd2ViMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEADPv1RHVNRfa2VKR\nAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Favq5E0ivpNtv1QnFhxtPd7d5k4e+T7\nSkW1TaOCAXIwggFuMA4GA1UdDwEB/wQEAwIDuDAdBgNVHSUEFjAUBggrBgEFBQcD\nAgYIKwYBBQUHAwEwDAYDVR0TAQH/BAIwADBoBgNVHQ4EYQRfN2Q6MDc6ODc6M2E6\nNDA6MTk6NDc6YzM6NWE6YzA6YmE6NjI6ZGY6YWY6NGI6ZDQ6MDU6MjU6NzY6M2Q6\nNWE6OGQ6MTY6OGQ6Njc6NWU6MmU6YTA6MzQ6N2Q6ZGM6ZmYwagYDVR0jBGMwYYBf\nZDE6MTE6MTE6YWM6MmE6YmE6OTc6YjI6M2Y6YWM6N2I6YmQ6ZGE6YmU6YjE6OGE6\nZmM6OWE6YmE6YjU6YmM6ODM6ZTc6NWU6NDE6NmY6ZjI6NzM6OTU6NTg6MGM6ZGIw\nWQYDVR0RBFIwUIZOc3BpZmZlOi8vMTExMTExMTEtMjIyMi0zMzMzLTQ0NDQtNTU1\nNTU1NTU1NTU1LmNvbnN1bC9ucy9kZWZhdWx0L2RjL2RjMS9zdmMvd2ViMAoGCCqG\nSM49BAMCA0gAMEUCIGC3TTvvjj76KMrguVyFf4tjOqaSCRie3nmHMRNNRav7AiEA\npY0heYeK9A6iOLrzqxSerkXXQyj5e9bE4VgUnxgPU6g=\n-----END CERTIFICATE-----\n" }, - "privateKey": { - "inlineString": "-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEIMoTkpRggp3fqZzFKh82yS4LjtJI+XY+qX/7DefHFrtdoAoGCCqGSM49\nAwEHoUQDQgAEADPv1RHVNRfa2VKRAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Fav\nq5E0ivpNtv1QnFhxtPd7d5k4e+T7SkW1TQ==\n-----END EC PRIVATE KEY-----\n" + "privateKey": { + "inlineString": "-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEIMoTkpRggp3fqZzFKh82yS4LjtJI+XY+qX/7DefHFrtdoAoGCCqGSM49\nAwEHoUQDQgAEADPv1RHVNRfa2VKRAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Fav\nq5E0ivpNtv1QnFhxtPd7d5k4e+T7SkW1TQ==\n-----END EC PRIVATE KEY-----\n" } } ], - "validationContext": { - "trustedCa": { - "inlineString": "-----BEGIN CERTIFICATE-----\nMIICXDCCAgKgAwIBAgIICpZq70Z9LyUwCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowFDESMBAG\nA1UEAxMJVGVzdCBDQSAyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEIhywH1gx\nAsMwuF3ukAI5YL2jFxH6Usnma1HFSfVyxbXX1/uoZEYrj8yCAtdU2yoHETyd+Zx2\nThhRLP79pYegCaOCATwwggE4MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTAD\nAQH/MGgGA1UdDgRhBF9kMToxMToxMTphYzoyYTpiYTo5NzpiMjozZjphYzo3Yjpi\nZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1ZTo0MTo2ZjpmMjo3\nMzo5NTo1ODowYzpkYjBqBgNVHSMEYzBhgF9kMToxMToxMTphYzoyYTpiYTo5Nzpi\nMjozZjphYzo3YjpiZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1\nZTo0MTo2ZjpmMjo3Mzo5NTo1ODowYzpkYjA/BgNVHREEODA2hjRzcGlmZmU6Ly8x\nMTExMTExMS0yMjIyLTMzMzMtNDQ0NC01NTU1NTU1NTU1NTUuY29uc3VsMAoGCCqG\nSM49BAMCA0gAMEUCICOY0i246rQHJt8o8Oya0D5PLL1FnmsQmQqIGCi31RwnAiEA\noR5f6Ku+cig2Il8T8LJujOp2/2A72QcHZA57B13y+8o=\n-----END CERTIFICATE-----\n" + "validationContext": { + "trustedCa": { + "inlineString": "-----BEGIN CERTIFICATE-----\nMIICXDCCAgKgAwIBAgIICpZq70Z9LyUwCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowFDESMBAG\nA1UEAxMJVGVzdCBDQSAyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEIhywH1gx\nAsMwuF3ukAI5YL2jFxH6Usnma1HFSfVyxbXX1/uoZEYrj8yCAtdU2yoHETyd+Zx2\nThhRLP79pYegCaOCATwwggE4MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTAD\nAQH/MGgGA1UdDgRhBF9kMToxMToxMTphYzoyYTpiYTo5NzpiMjozZjphYzo3Yjpi\nZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1ZTo0MTo2ZjpmMjo3\nMzo5NTo1ODowYzpkYjBqBgNVHSMEYzBhgF9kMToxMToxMTphYzoyYTpiYTo5Nzpi\nMjozZjphYzo3YjpiZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1\nZTo0MTo2ZjpmMjo3Mzo5NTo1ODowYzpkYjA/BgNVHREEODA2hjRzcGlmZmU6Ly8x\nMTExMTExMS0yMjIyLTMzMzMtNDQ0NC01NTU1NTU1NTU1NTUuY29uc3VsMAoGCCqG\nSM49BAMCA0gAMEUCICOY0i246rQHJt8o8Oya0D5PLL1FnmsQmQqIGCi31RwnAiEA\noR5f6Ku+cig2Il8T8LJujOp2/2A72QcHZA57B13y+8o=\n-----END CERTIFICATE-----\n" }, - "matchSubjectAltNames": [ + "matchSubjectAltNames": [ { - "exact": "spiffe://11111111-2222-3333-4444-555555555555.consul/ns/default/dc/dc1/svc/geo-cache-target" + "exact": "spiffe://11111111-2222-3333-4444-555555555555.consul/ns/default/dc/dc1/svc/geo-cache-target" }, { - "exact": "spiffe://11111111-2222-3333-4444-555555555555.consul/ns/default/dc/dc2/svc/geo-cache-target" + "exact": "spiffe://11111111-2222-3333-4444-555555555555.consul/ns/default/dc/dc2/svc/geo-cache-target" } ] } }, - "sni": "geo-cache.default.dc1.query.11111111-2222-3333-4444-555555555555.consul" + "sni": "geo-cache.default.dc1.query.11111111-2222-3333-4444-555555555555.consul" } } }, { - "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", - "name": "local_app", - "type": "STATIC", - "connectTimeout": "5s", - "loadAssignment": { - "clusterName": "local_app", - "endpoints": [ + "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", + "name": "local_app", + "type": "STATIC", + "connectTimeout": "5s", + "loadAssignment": { + "clusterName": "local_app", + "endpoints": [ { - "lbEndpoints": [ + "lbEndpoints": [ { - "endpoint": { - "address": { - "socketAddress": { - "address": "127.0.0.1", - "portValue": 8080 + "endpoint": { + "address": { + "socketAddress": { + "address": "127.0.0.1", + "portValue": 8080 } } } @@ -274,6 +236,6 @@ } } ], - "typeUrl": "type.googleapis.com/envoy.config.cluster.v3.Cluster", - "nonce": "00000001" + "typeUrl": "type.googleapis.com/envoy.config.cluster.v3.Cluster", + "nonce": "00000001" } \ No newline at end of file diff --git a/agent/xds/testdata/clusters/connect-proxy-with-tcp-chain-double-failover-through-remote-gateway-triggered.latest.golden b/agent/xds/testdata/clusters/connect-proxy-with-tcp-chain-double-failover-through-remote-gateway-triggered.latest.golden index e434b71c10f..35a149b7261 100644 --- a/agent/xds/testdata/clusters/connect-proxy-with-tcp-chain-double-failover-through-remote-gateway-triggered.latest.golden +++ b/agent/xds/testdata/clusters/connect-proxy-with-tcp-chain-double-failover-through-remote-gateway-triggered.latest.golden @@ -1,269 +1,231 @@ { - "versionInfo": "00000001", - "resources": [ + "versionInfo": "00000001", + "resources": [ { - "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", - "name": "db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", - "altStatName": "db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", - "clusterType": { - "name": "envoy.clusters.aggregate", - "typedConfig": { - "@type": "type.googleapis.com/envoy.extensions.clusters.aggregate.v3.ClusterConfig", - "clusters": [ - "failover-target~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", - "failover-target~db.default.dc2.internal.11111111-2222-3333-4444-555555555555.consul", - "failover-target~db.default.dc3.internal.11111111-2222-3333-4444-555555555555.consul" + "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", + "name": "db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "altStatName": "db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "clusterType": { + "name": "envoy.clusters.aggregate", + "typedConfig": { + "@type": "type.googleapis.com/envoy.extensions.clusters.aggregate.v3.ClusterConfig", + "clusters": [ + "failover-target~0~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "failover-target~1~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "failover-target~2~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul" ] } }, - "connectTimeout": "33s", - "lbPolicy": "CLUSTER_PROVIDED" + "connectTimeout": "33s", + "lbPolicy": "CLUSTER_PROVIDED" }, { - "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", - "name": "failover-target~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", - "altStatName": "failover-target~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", - "type": "EDS", - "edsClusterConfig": { - "edsConfig": { - "ads": { - - }, - "resourceApiVersion": "V3" - } - }, - "connectTimeout": "33s", - "circuitBreakers": { - - }, - "outlierDetection": { - - }, - "commonLbConfig": { - "healthyPanicThreshold": { - + "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", + "name": "failover-target~0~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "altStatName": "failover-target~0~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "type": "EDS", + "edsClusterConfig": { + "edsConfig": { + "ads": {}, + "resourceApiVersion": "V3" } }, - "transportSocket": { - "name": "tls", - "typedConfig": { - "@type": "type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext", - "commonTlsContext": { - "tlsParams": { - - }, - "tlsCertificates": [ + "connectTimeout": "33s", + "circuitBreakers": {}, + "outlierDetection": {}, + "commonLbConfig": { + "healthyPanicThreshold": {} + }, + "transportSocket": { + "name": "tls", + "typedConfig": { + "@type": "type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext", + "commonTlsContext": { + "tlsParams": {}, + "tlsCertificates": [ { - "certificateChain": { - "inlineString": "-----BEGIN CERTIFICATE-----\nMIICjDCCAjKgAwIBAgIIC5llxGV1gB8wCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowDjEMMAoG\nA1UEAxMDd2ViMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEADPv1RHVNRfa2VKR\nAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Favq5E0ivpNtv1QnFhxtPd7d5k4e+T7\nSkW1TaOCAXIwggFuMA4GA1UdDwEB/wQEAwIDuDAdBgNVHSUEFjAUBggrBgEFBQcD\nAgYIKwYBBQUHAwEwDAYDVR0TAQH/BAIwADBoBgNVHQ4EYQRfN2Q6MDc6ODc6M2E6\nNDA6MTk6NDc6YzM6NWE6YzA6YmE6NjI6ZGY6YWY6NGI6ZDQ6MDU6MjU6NzY6M2Q6\nNWE6OGQ6MTY6OGQ6Njc6NWU6MmU6YTA6MzQ6N2Q6ZGM6ZmYwagYDVR0jBGMwYYBf\nZDE6MTE6MTE6YWM6MmE6YmE6OTc6YjI6M2Y6YWM6N2I6YmQ6ZGE6YmU6YjE6OGE6\nZmM6OWE6YmE6YjU6YmM6ODM6ZTc6NWU6NDE6NmY6ZjI6NzM6OTU6NTg6MGM6ZGIw\nWQYDVR0RBFIwUIZOc3BpZmZlOi8vMTExMTExMTEtMjIyMi0zMzMzLTQ0NDQtNTU1\nNTU1NTU1NTU1LmNvbnN1bC9ucy9kZWZhdWx0L2RjL2RjMS9zdmMvd2ViMAoGCCqG\nSM49BAMCA0gAMEUCIGC3TTvvjj76KMrguVyFf4tjOqaSCRie3nmHMRNNRav7AiEA\npY0heYeK9A6iOLrzqxSerkXXQyj5e9bE4VgUnxgPU6g=\n-----END CERTIFICATE-----\n" + "certificateChain": { + "inlineString": "-----BEGIN CERTIFICATE-----\nMIICjDCCAjKgAwIBAgIIC5llxGV1gB8wCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowDjEMMAoG\nA1UEAxMDd2ViMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEADPv1RHVNRfa2VKR\nAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Favq5E0ivpNtv1QnFhxtPd7d5k4e+T7\nSkW1TaOCAXIwggFuMA4GA1UdDwEB/wQEAwIDuDAdBgNVHSUEFjAUBggrBgEFBQcD\nAgYIKwYBBQUHAwEwDAYDVR0TAQH/BAIwADBoBgNVHQ4EYQRfN2Q6MDc6ODc6M2E6\nNDA6MTk6NDc6YzM6NWE6YzA6YmE6NjI6ZGY6YWY6NGI6ZDQ6MDU6MjU6NzY6M2Q6\nNWE6OGQ6MTY6OGQ6Njc6NWU6MmU6YTA6MzQ6N2Q6ZGM6ZmYwagYDVR0jBGMwYYBf\nZDE6MTE6MTE6YWM6MmE6YmE6OTc6YjI6M2Y6YWM6N2I6YmQ6ZGE6YmU6YjE6OGE6\nZmM6OWE6YmE6YjU6YmM6ODM6ZTc6NWU6NDE6NmY6ZjI6NzM6OTU6NTg6MGM6ZGIw\nWQYDVR0RBFIwUIZOc3BpZmZlOi8vMTExMTExMTEtMjIyMi0zMzMzLTQ0NDQtNTU1\nNTU1NTU1NTU1LmNvbnN1bC9ucy9kZWZhdWx0L2RjL2RjMS9zdmMvd2ViMAoGCCqG\nSM49BAMCA0gAMEUCIGC3TTvvjj76KMrguVyFf4tjOqaSCRie3nmHMRNNRav7AiEA\npY0heYeK9A6iOLrzqxSerkXXQyj5e9bE4VgUnxgPU6g=\n-----END CERTIFICATE-----\n" }, - "privateKey": { - "inlineString": "-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEIMoTkpRggp3fqZzFKh82yS4LjtJI+XY+qX/7DefHFrtdoAoGCCqGSM49\nAwEHoUQDQgAEADPv1RHVNRfa2VKRAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Fav\nq5E0ivpNtv1QnFhxtPd7d5k4e+T7SkW1TQ==\n-----END EC PRIVATE KEY-----\n" + "privateKey": { + "inlineString": "-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEIMoTkpRggp3fqZzFKh82yS4LjtJI+XY+qX/7DefHFrtdoAoGCCqGSM49\nAwEHoUQDQgAEADPv1RHVNRfa2VKRAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Fav\nq5E0ivpNtv1QnFhxtPd7d5k4e+T7SkW1TQ==\n-----END EC PRIVATE KEY-----\n" } } ], - "validationContext": { - "trustedCa": { - "inlineString": "-----BEGIN CERTIFICATE-----\nMIICXDCCAgKgAwIBAgIICpZq70Z9LyUwCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowFDESMBAG\nA1UEAxMJVGVzdCBDQSAyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEIhywH1gx\nAsMwuF3ukAI5YL2jFxH6Usnma1HFSfVyxbXX1/uoZEYrj8yCAtdU2yoHETyd+Zx2\nThhRLP79pYegCaOCATwwggE4MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTAD\nAQH/MGgGA1UdDgRhBF9kMToxMToxMTphYzoyYTpiYTo5NzpiMjozZjphYzo3Yjpi\nZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1ZTo0MTo2ZjpmMjo3\nMzo5NTo1ODowYzpkYjBqBgNVHSMEYzBhgF9kMToxMToxMTphYzoyYTpiYTo5Nzpi\nMjozZjphYzo3YjpiZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1\nZTo0MTo2ZjpmMjo3Mzo5NTo1ODowYzpkYjA/BgNVHREEODA2hjRzcGlmZmU6Ly8x\nMTExMTExMS0yMjIyLTMzMzMtNDQ0NC01NTU1NTU1NTU1NTUuY29uc3VsMAoGCCqG\nSM49BAMCA0gAMEUCICOY0i246rQHJt8o8Oya0D5PLL1FnmsQmQqIGCi31RwnAiEA\noR5f6Ku+cig2Il8T8LJujOp2/2A72QcHZA57B13y+8o=\n-----END CERTIFICATE-----\n" + "validationContext": { + "trustedCa": { + "inlineString": "-----BEGIN CERTIFICATE-----\nMIICXDCCAgKgAwIBAgIICpZq70Z9LyUwCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowFDESMBAG\nA1UEAxMJVGVzdCBDQSAyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEIhywH1gx\nAsMwuF3ukAI5YL2jFxH6Usnma1HFSfVyxbXX1/uoZEYrj8yCAtdU2yoHETyd+Zx2\nThhRLP79pYegCaOCATwwggE4MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTAD\nAQH/MGgGA1UdDgRhBF9kMToxMToxMTphYzoyYTpiYTo5NzpiMjozZjphYzo3Yjpi\nZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1ZTo0MTo2ZjpmMjo3\nMzo5NTo1ODowYzpkYjBqBgNVHSMEYzBhgF9kMToxMToxMTphYzoyYTpiYTo5Nzpi\nMjozZjphYzo3YjpiZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1\nZTo0MTo2ZjpmMjo3Mzo5NTo1ODowYzpkYjA/BgNVHREEODA2hjRzcGlmZmU6Ly8x\nMTExMTExMS0yMjIyLTMzMzMtNDQ0NC01NTU1NTU1NTU1NTUuY29uc3VsMAoGCCqG\nSM49BAMCA0gAMEUCICOY0i246rQHJt8o8Oya0D5PLL1FnmsQmQqIGCi31RwnAiEA\noR5f6Ku+cig2Il8T8LJujOp2/2A72QcHZA57B13y+8o=\n-----END CERTIFICATE-----\n" }, - "matchSubjectAltNames": [ + "matchSubjectAltNames": [ { - "exact": "spiffe://11111111-2222-3333-4444-555555555555.consul/ns/default/dc/dc1/svc/db" + "exact": "spiffe://11111111-2222-3333-4444-555555555555.consul/ns/default/dc/dc1/svc/db" } ] } }, - "sni": "db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul" + "sni": "db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul" } } }, { - "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", - "name": "failover-target~db.default.dc2.internal.11111111-2222-3333-4444-555555555555.consul", - "altStatName": "failover-target~db.default.dc2.internal.11111111-2222-3333-4444-555555555555.consul", - "type": "EDS", - "edsClusterConfig": { - "edsConfig": { - "ads": { - - }, - "resourceApiVersion": "V3" - } - }, - "connectTimeout": "33s", - "circuitBreakers": { - - }, - "outlierDetection": { - - }, - "commonLbConfig": { - "healthyPanicThreshold": { - + "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", + "name": "failover-target~1~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "altStatName": "failover-target~1~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "type": "EDS", + "edsClusterConfig": { + "edsConfig": { + "ads": {}, + "resourceApiVersion": "V3" } }, - "transportSocket": { - "name": "tls", - "typedConfig": { - "@type": "type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext", - "commonTlsContext": { - "tlsParams": { - - }, - "tlsCertificates": [ + "connectTimeout": "33s", + "circuitBreakers": {}, + "outlierDetection": {}, + "commonLbConfig": { + "healthyPanicThreshold": {} + }, + "transportSocket": { + "name": "tls", + "typedConfig": { + "@type": "type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext", + "commonTlsContext": { + "tlsParams": {}, + "tlsCertificates": [ { - "certificateChain": { - "inlineString": "-----BEGIN CERTIFICATE-----\nMIICjDCCAjKgAwIBAgIIC5llxGV1gB8wCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowDjEMMAoG\nA1UEAxMDd2ViMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEADPv1RHVNRfa2VKR\nAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Favq5E0ivpNtv1QnFhxtPd7d5k4e+T7\nSkW1TaOCAXIwggFuMA4GA1UdDwEB/wQEAwIDuDAdBgNVHSUEFjAUBggrBgEFBQcD\nAgYIKwYBBQUHAwEwDAYDVR0TAQH/BAIwADBoBgNVHQ4EYQRfN2Q6MDc6ODc6M2E6\nNDA6MTk6NDc6YzM6NWE6YzA6YmE6NjI6ZGY6YWY6NGI6ZDQ6MDU6MjU6NzY6M2Q6\nNWE6OGQ6MTY6OGQ6Njc6NWU6MmU6YTA6MzQ6N2Q6ZGM6ZmYwagYDVR0jBGMwYYBf\nZDE6MTE6MTE6YWM6MmE6YmE6OTc6YjI6M2Y6YWM6N2I6YmQ6ZGE6YmU6YjE6OGE6\nZmM6OWE6YmE6YjU6YmM6ODM6ZTc6NWU6NDE6NmY6ZjI6NzM6OTU6NTg6MGM6ZGIw\nWQYDVR0RBFIwUIZOc3BpZmZlOi8vMTExMTExMTEtMjIyMi0zMzMzLTQ0NDQtNTU1\nNTU1NTU1NTU1LmNvbnN1bC9ucy9kZWZhdWx0L2RjL2RjMS9zdmMvd2ViMAoGCCqG\nSM49BAMCA0gAMEUCIGC3TTvvjj76KMrguVyFf4tjOqaSCRie3nmHMRNNRav7AiEA\npY0heYeK9A6iOLrzqxSerkXXQyj5e9bE4VgUnxgPU6g=\n-----END CERTIFICATE-----\n" + "certificateChain": { + "inlineString": "-----BEGIN CERTIFICATE-----\nMIICjDCCAjKgAwIBAgIIC5llxGV1gB8wCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowDjEMMAoG\nA1UEAxMDd2ViMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEADPv1RHVNRfa2VKR\nAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Favq5E0ivpNtv1QnFhxtPd7d5k4e+T7\nSkW1TaOCAXIwggFuMA4GA1UdDwEB/wQEAwIDuDAdBgNVHSUEFjAUBggrBgEFBQcD\nAgYIKwYBBQUHAwEwDAYDVR0TAQH/BAIwADBoBgNVHQ4EYQRfN2Q6MDc6ODc6M2E6\nNDA6MTk6NDc6YzM6NWE6YzA6YmE6NjI6ZGY6YWY6NGI6ZDQ6MDU6MjU6NzY6M2Q6\nNWE6OGQ6MTY6OGQ6Njc6NWU6MmU6YTA6MzQ6N2Q6ZGM6ZmYwagYDVR0jBGMwYYBf\nZDE6MTE6MTE6YWM6MmE6YmE6OTc6YjI6M2Y6YWM6N2I6YmQ6ZGE6YmU6YjE6OGE6\nZmM6OWE6YmE6YjU6YmM6ODM6ZTc6NWU6NDE6NmY6ZjI6NzM6OTU6NTg6MGM6ZGIw\nWQYDVR0RBFIwUIZOc3BpZmZlOi8vMTExMTExMTEtMjIyMi0zMzMzLTQ0NDQtNTU1\nNTU1NTU1NTU1LmNvbnN1bC9ucy9kZWZhdWx0L2RjL2RjMS9zdmMvd2ViMAoGCCqG\nSM49BAMCA0gAMEUCIGC3TTvvjj76KMrguVyFf4tjOqaSCRie3nmHMRNNRav7AiEA\npY0heYeK9A6iOLrzqxSerkXXQyj5e9bE4VgUnxgPU6g=\n-----END CERTIFICATE-----\n" }, - "privateKey": { - "inlineString": "-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEIMoTkpRggp3fqZzFKh82yS4LjtJI+XY+qX/7DefHFrtdoAoGCCqGSM49\nAwEHoUQDQgAEADPv1RHVNRfa2VKRAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Fav\nq5E0ivpNtv1QnFhxtPd7d5k4e+T7SkW1TQ==\n-----END EC PRIVATE KEY-----\n" + "privateKey": { + "inlineString": "-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEIMoTkpRggp3fqZzFKh82yS4LjtJI+XY+qX/7DefHFrtdoAoGCCqGSM49\nAwEHoUQDQgAEADPv1RHVNRfa2VKRAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Fav\nq5E0ivpNtv1QnFhxtPd7d5k4e+T7SkW1TQ==\n-----END EC PRIVATE KEY-----\n" } } ], - "validationContext": { - "trustedCa": { - "inlineString": "-----BEGIN CERTIFICATE-----\nMIICXDCCAgKgAwIBAgIICpZq70Z9LyUwCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowFDESMBAG\nA1UEAxMJVGVzdCBDQSAyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEIhywH1gx\nAsMwuF3ukAI5YL2jFxH6Usnma1HFSfVyxbXX1/uoZEYrj8yCAtdU2yoHETyd+Zx2\nThhRLP79pYegCaOCATwwggE4MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTAD\nAQH/MGgGA1UdDgRhBF9kMToxMToxMTphYzoyYTpiYTo5NzpiMjozZjphYzo3Yjpi\nZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1ZTo0MTo2ZjpmMjo3\nMzo5NTo1ODowYzpkYjBqBgNVHSMEYzBhgF9kMToxMToxMTphYzoyYTpiYTo5Nzpi\nMjozZjphYzo3YjpiZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1\nZTo0MTo2ZjpmMjo3Mzo5NTo1ODowYzpkYjA/BgNVHREEODA2hjRzcGlmZmU6Ly8x\nMTExMTExMS0yMjIyLTMzMzMtNDQ0NC01NTU1NTU1NTU1NTUuY29uc3VsMAoGCCqG\nSM49BAMCA0gAMEUCICOY0i246rQHJt8o8Oya0D5PLL1FnmsQmQqIGCi31RwnAiEA\noR5f6Ku+cig2Il8T8LJujOp2/2A72QcHZA57B13y+8o=\n-----END CERTIFICATE-----\n" + "validationContext": { + "trustedCa": { + "inlineString": "-----BEGIN CERTIFICATE-----\nMIICXDCCAgKgAwIBAgIICpZq70Z9LyUwCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowFDESMBAG\nA1UEAxMJVGVzdCBDQSAyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEIhywH1gx\nAsMwuF3ukAI5YL2jFxH6Usnma1HFSfVyxbXX1/uoZEYrj8yCAtdU2yoHETyd+Zx2\nThhRLP79pYegCaOCATwwggE4MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTAD\nAQH/MGgGA1UdDgRhBF9kMToxMToxMTphYzoyYTpiYTo5NzpiMjozZjphYzo3Yjpi\nZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1ZTo0MTo2ZjpmMjo3\nMzo5NTo1ODowYzpkYjBqBgNVHSMEYzBhgF9kMToxMToxMTphYzoyYTpiYTo5Nzpi\nMjozZjphYzo3YjpiZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1\nZTo0MTo2ZjpmMjo3Mzo5NTo1ODowYzpkYjA/BgNVHREEODA2hjRzcGlmZmU6Ly8x\nMTExMTExMS0yMjIyLTMzMzMtNDQ0NC01NTU1NTU1NTU1NTUuY29uc3VsMAoGCCqG\nSM49BAMCA0gAMEUCICOY0i246rQHJt8o8Oya0D5PLL1FnmsQmQqIGCi31RwnAiEA\noR5f6Ku+cig2Il8T8LJujOp2/2A72QcHZA57B13y+8o=\n-----END CERTIFICATE-----\n" }, - "matchSubjectAltNames": [ + "matchSubjectAltNames": [ { - "exact": "spiffe://11111111-2222-3333-4444-555555555555.consul/ns/default/dc/dc2/svc/db" + "exact": "spiffe://11111111-2222-3333-4444-555555555555.consul/ns/default/dc/dc2/svc/db" } ] } }, - "sni": "db.default.dc2.internal.11111111-2222-3333-4444-555555555555.consul" + "sni": "db.default.dc2.internal.11111111-2222-3333-4444-555555555555.consul" } } }, { - "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", - "name": "failover-target~db.default.dc3.internal.11111111-2222-3333-4444-555555555555.consul", - "altStatName": "failover-target~db.default.dc3.internal.11111111-2222-3333-4444-555555555555.consul", - "type": "EDS", - "edsClusterConfig": { - "edsConfig": { - "ads": { - - }, - "resourceApiVersion": "V3" + "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", + "name": "failover-target~2~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "altStatName": "failover-target~2~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "type": "EDS", + "edsClusterConfig": { + "edsConfig": { + "ads": {}, + "resourceApiVersion": "V3" } }, - "connectTimeout": "33s", - "circuitBreakers": { - - }, - "outlierDetection": { - - }, - "commonLbConfig": { - "healthyPanicThreshold": { - - } - }, - "transportSocket": { - "name": "tls", - "typedConfig": { - "@type": "type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext", - "commonTlsContext": { - "tlsParams": { - - }, - "tlsCertificates": [ + "connectTimeout": "33s", + "circuitBreakers": {}, + "outlierDetection": {}, + "commonLbConfig": { + "healthyPanicThreshold": {} + }, + "transportSocket": { + "name": "tls", + "typedConfig": { + "@type": "type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext", + "commonTlsContext": { + "tlsParams": {}, + "tlsCertificates": [ { - "certificateChain": { - "inlineString": "-----BEGIN CERTIFICATE-----\nMIICjDCCAjKgAwIBAgIIC5llxGV1gB8wCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowDjEMMAoG\nA1UEAxMDd2ViMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEADPv1RHVNRfa2VKR\nAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Favq5E0ivpNtv1QnFhxtPd7d5k4e+T7\nSkW1TaOCAXIwggFuMA4GA1UdDwEB/wQEAwIDuDAdBgNVHSUEFjAUBggrBgEFBQcD\nAgYIKwYBBQUHAwEwDAYDVR0TAQH/BAIwADBoBgNVHQ4EYQRfN2Q6MDc6ODc6M2E6\nNDA6MTk6NDc6YzM6NWE6YzA6YmE6NjI6ZGY6YWY6NGI6ZDQ6MDU6MjU6NzY6M2Q6\nNWE6OGQ6MTY6OGQ6Njc6NWU6MmU6YTA6MzQ6N2Q6ZGM6ZmYwagYDVR0jBGMwYYBf\nZDE6MTE6MTE6YWM6MmE6YmE6OTc6YjI6M2Y6YWM6N2I6YmQ6ZGE6YmU6YjE6OGE6\nZmM6OWE6YmE6YjU6YmM6ODM6ZTc6NWU6NDE6NmY6ZjI6NzM6OTU6NTg6MGM6ZGIw\nWQYDVR0RBFIwUIZOc3BpZmZlOi8vMTExMTExMTEtMjIyMi0zMzMzLTQ0NDQtNTU1\nNTU1NTU1NTU1LmNvbnN1bC9ucy9kZWZhdWx0L2RjL2RjMS9zdmMvd2ViMAoGCCqG\nSM49BAMCA0gAMEUCIGC3TTvvjj76KMrguVyFf4tjOqaSCRie3nmHMRNNRav7AiEA\npY0heYeK9A6iOLrzqxSerkXXQyj5e9bE4VgUnxgPU6g=\n-----END CERTIFICATE-----\n" + "certificateChain": { + "inlineString": "-----BEGIN CERTIFICATE-----\nMIICjDCCAjKgAwIBAgIIC5llxGV1gB8wCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowDjEMMAoG\nA1UEAxMDd2ViMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEADPv1RHVNRfa2VKR\nAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Favq5E0ivpNtv1QnFhxtPd7d5k4e+T7\nSkW1TaOCAXIwggFuMA4GA1UdDwEB/wQEAwIDuDAdBgNVHSUEFjAUBggrBgEFBQcD\nAgYIKwYBBQUHAwEwDAYDVR0TAQH/BAIwADBoBgNVHQ4EYQRfN2Q6MDc6ODc6M2E6\nNDA6MTk6NDc6YzM6NWE6YzA6YmE6NjI6ZGY6YWY6NGI6ZDQ6MDU6MjU6NzY6M2Q6\nNWE6OGQ6MTY6OGQ6Njc6NWU6MmU6YTA6MzQ6N2Q6ZGM6ZmYwagYDVR0jBGMwYYBf\nZDE6MTE6MTE6YWM6MmE6YmE6OTc6YjI6M2Y6YWM6N2I6YmQ6ZGE6YmU6YjE6OGE6\nZmM6OWE6YmE6YjU6YmM6ODM6ZTc6NWU6NDE6NmY6ZjI6NzM6OTU6NTg6MGM6ZGIw\nWQYDVR0RBFIwUIZOc3BpZmZlOi8vMTExMTExMTEtMjIyMi0zMzMzLTQ0NDQtNTU1\nNTU1NTU1NTU1LmNvbnN1bC9ucy9kZWZhdWx0L2RjL2RjMS9zdmMvd2ViMAoGCCqG\nSM49BAMCA0gAMEUCIGC3TTvvjj76KMrguVyFf4tjOqaSCRie3nmHMRNNRav7AiEA\npY0heYeK9A6iOLrzqxSerkXXQyj5e9bE4VgUnxgPU6g=\n-----END CERTIFICATE-----\n" }, - "privateKey": { - "inlineString": "-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEIMoTkpRggp3fqZzFKh82yS4LjtJI+XY+qX/7DefHFrtdoAoGCCqGSM49\nAwEHoUQDQgAEADPv1RHVNRfa2VKRAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Fav\nq5E0ivpNtv1QnFhxtPd7d5k4e+T7SkW1TQ==\n-----END EC PRIVATE KEY-----\n" + "privateKey": { + "inlineString": "-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEIMoTkpRggp3fqZzFKh82yS4LjtJI+XY+qX/7DefHFrtdoAoGCCqGSM49\nAwEHoUQDQgAEADPv1RHVNRfa2VKRAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Fav\nq5E0ivpNtv1QnFhxtPd7d5k4e+T7SkW1TQ==\n-----END EC PRIVATE KEY-----\n" } } ], - "validationContext": { - "trustedCa": { - "inlineString": "-----BEGIN CERTIFICATE-----\nMIICXDCCAgKgAwIBAgIICpZq70Z9LyUwCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowFDESMBAG\nA1UEAxMJVGVzdCBDQSAyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEIhywH1gx\nAsMwuF3ukAI5YL2jFxH6Usnma1HFSfVyxbXX1/uoZEYrj8yCAtdU2yoHETyd+Zx2\nThhRLP79pYegCaOCATwwggE4MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTAD\nAQH/MGgGA1UdDgRhBF9kMToxMToxMTphYzoyYTpiYTo5NzpiMjozZjphYzo3Yjpi\nZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1ZTo0MTo2ZjpmMjo3\nMzo5NTo1ODowYzpkYjBqBgNVHSMEYzBhgF9kMToxMToxMTphYzoyYTpiYTo5Nzpi\nMjozZjphYzo3YjpiZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1\nZTo0MTo2ZjpmMjo3Mzo5NTo1ODowYzpkYjA/BgNVHREEODA2hjRzcGlmZmU6Ly8x\nMTExMTExMS0yMjIyLTMzMzMtNDQ0NC01NTU1NTU1NTU1NTUuY29uc3VsMAoGCCqG\nSM49BAMCA0gAMEUCICOY0i246rQHJt8o8Oya0D5PLL1FnmsQmQqIGCi31RwnAiEA\noR5f6Ku+cig2Il8T8LJujOp2/2A72QcHZA57B13y+8o=\n-----END CERTIFICATE-----\n" + "validationContext": { + "trustedCa": { + "inlineString": "-----BEGIN CERTIFICATE-----\nMIICXDCCAgKgAwIBAgIICpZq70Z9LyUwCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowFDESMBAG\nA1UEAxMJVGVzdCBDQSAyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEIhywH1gx\nAsMwuF3ukAI5YL2jFxH6Usnma1HFSfVyxbXX1/uoZEYrj8yCAtdU2yoHETyd+Zx2\nThhRLP79pYegCaOCATwwggE4MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTAD\nAQH/MGgGA1UdDgRhBF9kMToxMToxMTphYzoyYTpiYTo5NzpiMjozZjphYzo3Yjpi\nZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1ZTo0MTo2ZjpmMjo3\nMzo5NTo1ODowYzpkYjBqBgNVHSMEYzBhgF9kMToxMToxMTphYzoyYTpiYTo5Nzpi\nMjozZjphYzo3YjpiZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1\nZTo0MTo2ZjpmMjo3Mzo5NTo1ODowYzpkYjA/BgNVHREEODA2hjRzcGlmZmU6Ly8x\nMTExMTExMS0yMjIyLTMzMzMtNDQ0NC01NTU1NTU1NTU1NTUuY29uc3VsMAoGCCqG\nSM49BAMCA0gAMEUCICOY0i246rQHJt8o8Oya0D5PLL1FnmsQmQqIGCi31RwnAiEA\noR5f6Ku+cig2Il8T8LJujOp2/2A72QcHZA57B13y+8o=\n-----END CERTIFICATE-----\n" }, - "matchSubjectAltNames": [ + "matchSubjectAltNames": [ { - "exact": "spiffe://11111111-2222-3333-4444-555555555555.consul/ns/default/dc/dc3/svc/db" + "exact": "spiffe://11111111-2222-3333-4444-555555555555.consul/ns/default/dc/dc3/svc/db" } ] } }, - "sni": "db.default.dc3.internal.11111111-2222-3333-4444-555555555555.consul" + "sni": "db.default.dc3.internal.11111111-2222-3333-4444-555555555555.consul" } } }, { - "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", - "name": "geo-cache.default.dc1.query.11111111-2222-3333-4444-555555555555.consul", - "type": "EDS", - "edsClusterConfig": { - "edsConfig": { - "ads": { - - }, - "resourceApiVersion": "V3" + "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", + "name": "geo-cache.default.dc1.query.11111111-2222-3333-4444-555555555555.consul", + "type": "EDS", + "edsClusterConfig": { + "edsConfig": { + "ads": {}, + "resourceApiVersion": "V3" } }, - "connectTimeout": "5s", - "circuitBreakers": { - - }, - "outlierDetection": { - - }, - "transportSocket": { - "name": "tls", - "typedConfig": { - "@type": "type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext", - "commonTlsContext": { - "tlsParams": { - - }, - "tlsCertificates": [ + "connectTimeout": "5s", + "circuitBreakers": {}, + "outlierDetection": {}, + "transportSocket": { + "name": "tls", + "typedConfig": { + "@type": "type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext", + "commonTlsContext": { + "tlsParams": {}, + "tlsCertificates": [ { - "certificateChain": { - "inlineString": "-----BEGIN CERTIFICATE-----\nMIICjDCCAjKgAwIBAgIIC5llxGV1gB8wCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowDjEMMAoG\nA1UEAxMDd2ViMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEADPv1RHVNRfa2VKR\nAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Favq5E0ivpNtv1QnFhxtPd7d5k4e+T7\nSkW1TaOCAXIwggFuMA4GA1UdDwEB/wQEAwIDuDAdBgNVHSUEFjAUBggrBgEFBQcD\nAgYIKwYBBQUHAwEwDAYDVR0TAQH/BAIwADBoBgNVHQ4EYQRfN2Q6MDc6ODc6M2E6\nNDA6MTk6NDc6YzM6NWE6YzA6YmE6NjI6ZGY6YWY6NGI6ZDQ6MDU6MjU6NzY6M2Q6\nNWE6OGQ6MTY6OGQ6Njc6NWU6MmU6YTA6MzQ6N2Q6ZGM6ZmYwagYDVR0jBGMwYYBf\nZDE6MTE6MTE6YWM6MmE6YmE6OTc6YjI6M2Y6YWM6N2I6YmQ6ZGE6YmU6YjE6OGE6\nZmM6OWE6YmE6YjU6YmM6ODM6ZTc6NWU6NDE6NmY6ZjI6NzM6OTU6NTg6MGM6ZGIw\nWQYDVR0RBFIwUIZOc3BpZmZlOi8vMTExMTExMTEtMjIyMi0zMzMzLTQ0NDQtNTU1\nNTU1NTU1NTU1LmNvbnN1bC9ucy9kZWZhdWx0L2RjL2RjMS9zdmMvd2ViMAoGCCqG\nSM49BAMCA0gAMEUCIGC3TTvvjj76KMrguVyFf4tjOqaSCRie3nmHMRNNRav7AiEA\npY0heYeK9A6iOLrzqxSerkXXQyj5e9bE4VgUnxgPU6g=\n-----END CERTIFICATE-----\n" + "certificateChain": { + "inlineString": "-----BEGIN CERTIFICATE-----\nMIICjDCCAjKgAwIBAgIIC5llxGV1gB8wCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowDjEMMAoG\nA1UEAxMDd2ViMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEADPv1RHVNRfa2VKR\nAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Favq5E0ivpNtv1QnFhxtPd7d5k4e+T7\nSkW1TaOCAXIwggFuMA4GA1UdDwEB/wQEAwIDuDAdBgNVHSUEFjAUBggrBgEFBQcD\nAgYIKwYBBQUHAwEwDAYDVR0TAQH/BAIwADBoBgNVHQ4EYQRfN2Q6MDc6ODc6M2E6\nNDA6MTk6NDc6YzM6NWE6YzA6YmE6NjI6ZGY6YWY6NGI6ZDQ6MDU6MjU6NzY6M2Q6\nNWE6OGQ6MTY6OGQ6Njc6NWU6MmU6YTA6MzQ6N2Q6ZGM6ZmYwagYDVR0jBGMwYYBf\nZDE6MTE6MTE6YWM6MmE6YmE6OTc6YjI6M2Y6YWM6N2I6YmQ6ZGE6YmU6YjE6OGE6\nZmM6OWE6YmE6YjU6YmM6ODM6ZTc6NWU6NDE6NmY6ZjI6NzM6OTU6NTg6MGM6ZGIw\nWQYDVR0RBFIwUIZOc3BpZmZlOi8vMTExMTExMTEtMjIyMi0zMzMzLTQ0NDQtNTU1\nNTU1NTU1NTU1LmNvbnN1bC9ucy9kZWZhdWx0L2RjL2RjMS9zdmMvd2ViMAoGCCqG\nSM49BAMCA0gAMEUCIGC3TTvvjj76KMrguVyFf4tjOqaSCRie3nmHMRNNRav7AiEA\npY0heYeK9A6iOLrzqxSerkXXQyj5e9bE4VgUnxgPU6g=\n-----END CERTIFICATE-----\n" }, - "privateKey": { - "inlineString": "-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEIMoTkpRggp3fqZzFKh82yS4LjtJI+XY+qX/7DefHFrtdoAoGCCqGSM49\nAwEHoUQDQgAEADPv1RHVNRfa2VKRAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Fav\nq5E0ivpNtv1QnFhxtPd7d5k4e+T7SkW1TQ==\n-----END EC PRIVATE KEY-----\n" + "privateKey": { + "inlineString": "-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEIMoTkpRggp3fqZzFKh82yS4LjtJI+XY+qX/7DefHFrtdoAoGCCqGSM49\nAwEHoUQDQgAEADPv1RHVNRfa2VKRAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Fav\nq5E0ivpNtv1QnFhxtPd7d5k4e+T7SkW1TQ==\n-----END EC PRIVATE KEY-----\n" } } ], - "validationContext": { - "trustedCa": { - "inlineString": "-----BEGIN CERTIFICATE-----\nMIICXDCCAgKgAwIBAgIICpZq70Z9LyUwCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowFDESMBAG\nA1UEAxMJVGVzdCBDQSAyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEIhywH1gx\nAsMwuF3ukAI5YL2jFxH6Usnma1HFSfVyxbXX1/uoZEYrj8yCAtdU2yoHETyd+Zx2\nThhRLP79pYegCaOCATwwggE4MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTAD\nAQH/MGgGA1UdDgRhBF9kMToxMToxMTphYzoyYTpiYTo5NzpiMjozZjphYzo3Yjpi\nZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1ZTo0MTo2ZjpmMjo3\nMzo5NTo1ODowYzpkYjBqBgNVHSMEYzBhgF9kMToxMToxMTphYzoyYTpiYTo5Nzpi\nMjozZjphYzo3YjpiZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1\nZTo0MTo2ZjpmMjo3Mzo5NTo1ODowYzpkYjA/BgNVHREEODA2hjRzcGlmZmU6Ly8x\nMTExMTExMS0yMjIyLTMzMzMtNDQ0NC01NTU1NTU1NTU1NTUuY29uc3VsMAoGCCqG\nSM49BAMCA0gAMEUCICOY0i246rQHJt8o8Oya0D5PLL1FnmsQmQqIGCi31RwnAiEA\noR5f6Ku+cig2Il8T8LJujOp2/2A72QcHZA57B13y+8o=\n-----END CERTIFICATE-----\n" + "validationContext": { + "trustedCa": { + "inlineString": "-----BEGIN CERTIFICATE-----\nMIICXDCCAgKgAwIBAgIICpZq70Z9LyUwCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowFDESMBAG\nA1UEAxMJVGVzdCBDQSAyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEIhywH1gx\nAsMwuF3ukAI5YL2jFxH6Usnma1HFSfVyxbXX1/uoZEYrj8yCAtdU2yoHETyd+Zx2\nThhRLP79pYegCaOCATwwggE4MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTAD\nAQH/MGgGA1UdDgRhBF9kMToxMToxMTphYzoyYTpiYTo5NzpiMjozZjphYzo3Yjpi\nZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1ZTo0MTo2ZjpmMjo3\nMzo5NTo1ODowYzpkYjBqBgNVHSMEYzBhgF9kMToxMToxMTphYzoyYTpiYTo5Nzpi\nMjozZjphYzo3YjpiZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1\nZTo0MTo2ZjpmMjo3Mzo5NTo1ODowYzpkYjA/BgNVHREEODA2hjRzcGlmZmU6Ly8x\nMTExMTExMS0yMjIyLTMzMzMtNDQ0NC01NTU1NTU1NTU1NTUuY29uc3VsMAoGCCqG\nSM49BAMCA0gAMEUCICOY0i246rQHJt8o8Oya0D5PLL1FnmsQmQqIGCi31RwnAiEA\noR5f6Ku+cig2Il8T8LJujOp2/2A72QcHZA57B13y+8o=\n-----END CERTIFICATE-----\n" }, - "matchSubjectAltNames": [ + "matchSubjectAltNames": [ { - "exact": "spiffe://11111111-2222-3333-4444-555555555555.consul/ns/default/dc/dc1/svc/geo-cache-target" + "exact": "spiffe://11111111-2222-3333-4444-555555555555.consul/ns/default/dc/dc1/svc/geo-cache-target" }, { - "exact": "spiffe://11111111-2222-3333-4444-555555555555.consul/ns/default/dc/dc2/svc/geo-cache-target" + "exact": "spiffe://11111111-2222-3333-4444-555555555555.consul/ns/default/dc/dc2/svc/geo-cache-target" } ] } }, - "sni": "geo-cache.default.dc1.query.11111111-2222-3333-4444-555555555555.consul" + "sni": "geo-cache.default.dc1.query.11111111-2222-3333-4444-555555555555.consul" } } }, { - "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", - "name": "local_app", - "type": "STATIC", - "connectTimeout": "5s", - "loadAssignment": { - "clusterName": "local_app", - "endpoints": [ + "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", + "name": "local_app", + "type": "STATIC", + "connectTimeout": "5s", + "loadAssignment": { + "clusterName": "local_app", + "endpoints": [ { - "lbEndpoints": [ + "lbEndpoints": [ { - "endpoint": { - "address": { - "socketAddress": { - "address": "127.0.0.1", - "portValue": 8080 + "endpoint": { + "address": { + "socketAddress": { + "address": "127.0.0.1", + "portValue": 8080 } } } @@ -274,6 +236,6 @@ } } ], - "typeUrl": "type.googleapis.com/envoy.config.cluster.v3.Cluster", - "nonce": "00000001" + "typeUrl": "type.googleapis.com/envoy.config.cluster.v3.Cluster", + "nonce": "00000001" } \ No newline at end of file diff --git a/agent/xds/testdata/clusters/connect-proxy-with-tcp-chain-double-failover-through-remote-gateway.latest.golden b/agent/xds/testdata/clusters/connect-proxy-with-tcp-chain-double-failover-through-remote-gateway.latest.golden index e434b71c10f..35a149b7261 100644 --- a/agent/xds/testdata/clusters/connect-proxy-with-tcp-chain-double-failover-through-remote-gateway.latest.golden +++ b/agent/xds/testdata/clusters/connect-proxy-with-tcp-chain-double-failover-through-remote-gateway.latest.golden @@ -1,269 +1,231 @@ { - "versionInfo": "00000001", - "resources": [ + "versionInfo": "00000001", + "resources": [ { - "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", - "name": "db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", - "altStatName": "db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", - "clusterType": { - "name": "envoy.clusters.aggregate", - "typedConfig": { - "@type": "type.googleapis.com/envoy.extensions.clusters.aggregate.v3.ClusterConfig", - "clusters": [ - "failover-target~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", - "failover-target~db.default.dc2.internal.11111111-2222-3333-4444-555555555555.consul", - "failover-target~db.default.dc3.internal.11111111-2222-3333-4444-555555555555.consul" + "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", + "name": "db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "altStatName": "db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "clusterType": { + "name": "envoy.clusters.aggregate", + "typedConfig": { + "@type": "type.googleapis.com/envoy.extensions.clusters.aggregate.v3.ClusterConfig", + "clusters": [ + "failover-target~0~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "failover-target~1~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "failover-target~2~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul" ] } }, - "connectTimeout": "33s", - "lbPolicy": "CLUSTER_PROVIDED" + "connectTimeout": "33s", + "lbPolicy": "CLUSTER_PROVIDED" }, { - "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", - "name": "failover-target~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", - "altStatName": "failover-target~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", - "type": "EDS", - "edsClusterConfig": { - "edsConfig": { - "ads": { - - }, - "resourceApiVersion": "V3" - } - }, - "connectTimeout": "33s", - "circuitBreakers": { - - }, - "outlierDetection": { - - }, - "commonLbConfig": { - "healthyPanicThreshold": { - + "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", + "name": "failover-target~0~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "altStatName": "failover-target~0~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "type": "EDS", + "edsClusterConfig": { + "edsConfig": { + "ads": {}, + "resourceApiVersion": "V3" } }, - "transportSocket": { - "name": "tls", - "typedConfig": { - "@type": "type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext", - "commonTlsContext": { - "tlsParams": { - - }, - "tlsCertificates": [ + "connectTimeout": "33s", + "circuitBreakers": {}, + "outlierDetection": {}, + "commonLbConfig": { + "healthyPanicThreshold": {} + }, + "transportSocket": { + "name": "tls", + "typedConfig": { + "@type": "type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext", + "commonTlsContext": { + "tlsParams": {}, + "tlsCertificates": [ { - "certificateChain": { - "inlineString": "-----BEGIN CERTIFICATE-----\nMIICjDCCAjKgAwIBAgIIC5llxGV1gB8wCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowDjEMMAoG\nA1UEAxMDd2ViMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEADPv1RHVNRfa2VKR\nAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Favq5E0ivpNtv1QnFhxtPd7d5k4e+T7\nSkW1TaOCAXIwggFuMA4GA1UdDwEB/wQEAwIDuDAdBgNVHSUEFjAUBggrBgEFBQcD\nAgYIKwYBBQUHAwEwDAYDVR0TAQH/BAIwADBoBgNVHQ4EYQRfN2Q6MDc6ODc6M2E6\nNDA6MTk6NDc6YzM6NWE6YzA6YmE6NjI6ZGY6YWY6NGI6ZDQ6MDU6MjU6NzY6M2Q6\nNWE6OGQ6MTY6OGQ6Njc6NWU6MmU6YTA6MzQ6N2Q6ZGM6ZmYwagYDVR0jBGMwYYBf\nZDE6MTE6MTE6YWM6MmE6YmE6OTc6YjI6M2Y6YWM6N2I6YmQ6ZGE6YmU6YjE6OGE6\nZmM6OWE6YmE6YjU6YmM6ODM6ZTc6NWU6NDE6NmY6ZjI6NzM6OTU6NTg6MGM6ZGIw\nWQYDVR0RBFIwUIZOc3BpZmZlOi8vMTExMTExMTEtMjIyMi0zMzMzLTQ0NDQtNTU1\nNTU1NTU1NTU1LmNvbnN1bC9ucy9kZWZhdWx0L2RjL2RjMS9zdmMvd2ViMAoGCCqG\nSM49BAMCA0gAMEUCIGC3TTvvjj76KMrguVyFf4tjOqaSCRie3nmHMRNNRav7AiEA\npY0heYeK9A6iOLrzqxSerkXXQyj5e9bE4VgUnxgPU6g=\n-----END CERTIFICATE-----\n" + "certificateChain": { + "inlineString": "-----BEGIN CERTIFICATE-----\nMIICjDCCAjKgAwIBAgIIC5llxGV1gB8wCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowDjEMMAoG\nA1UEAxMDd2ViMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEADPv1RHVNRfa2VKR\nAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Favq5E0ivpNtv1QnFhxtPd7d5k4e+T7\nSkW1TaOCAXIwggFuMA4GA1UdDwEB/wQEAwIDuDAdBgNVHSUEFjAUBggrBgEFBQcD\nAgYIKwYBBQUHAwEwDAYDVR0TAQH/BAIwADBoBgNVHQ4EYQRfN2Q6MDc6ODc6M2E6\nNDA6MTk6NDc6YzM6NWE6YzA6YmE6NjI6ZGY6YWY6NGI6ZDQ6MDU6MjU6NzY6M2Q6\nNWE6OGQ6MTY6OGQ6Njc6NWU6MmU6YTA6MzQ6N2Q6ZGM6ZmYwagYDVR0jBGMwYYBf\nZDE6MTE6MTE6YWM6MmE6YmE6OTc6YjI6M2Y6YWM6N2I6YmQ6ZGE6YmU6YjE6OGE6\nZmM6OWE6YmE6YjU6YmM6ODM6ZTc6NWU6NDE6NmY6ZjI6NzM6OTU6NTg6MGM6ZGIw\nWQYDVR0RBFIwUIZOc3BpZmZlOi8vMTExMTExMTEtMjIyMi0zMzMzLTQ0NDQtNTU1\nNTU1NTU1NTU1LmNvbnN1bC9ucy9kZWZhdWx0L2RjL2RjMS9zdmMvd2ViMAoGCCqG\nSM49BAMCA0gAMEUCIGC3TTvvjj76KMrguVyFf4tjOqaSCRie3nmHMRNNRav7AiEA\npY0heYeK9A6iOLrzqxSerkXXQyj5e9bE4VgUnxgPU6g=\n-----END CERTIFICATE-----\n" }, - "privateKey": { - "inlineString": "-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEIMoTkpRggp3fqZzFKh82yS4LjtJI+XY+qX/7DefHFrtdoAoGCCqGSM49\nAwEHoUQDQgAEADPv1RHVNRfa2VKRAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Fav\nq5E0ivpNtv1QnFhxtPd7d5k4e+T7SkW1TQ==\n-----END EC PRIVATE KEY-----\n" + "privateKey": { + "inlineString": "-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEIMoTkpRggp3fqZzFKh82yS4LjtJI+XY+qX/7DefHFrtdoAoGCCqGSM49\nAwEHoUQDQgAEADPv1RHVNRfa2VKRAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Fav\nq5E0ivpNtv1QnFhxtPd7d5k4e+T7SkW1TQ==\n-----END EC PRIVATE KEY-----\n" } } ], - "validationContext": { - "trustedCa": { - "inlineString": "-----BEGIN CERTIFICATE-----\nMIICXDCCAgKgAwIBAgIICpZq70Z9LyUwCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowFDESMBAG\nA1UEAxMJVGVzdCBDQSAyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEIhywH1gx\nAsMwuF3ukAI5YL2jFxH6Usnma1HFSfVyxbXX1/uoZEYrj8yCAtdU2yoHETyd+Zx2\nThhRLP79pYegCaOCATwwggE4MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTAD\nAQH/MGgGA1UdDgRhBF9kMToxMToxMTphYzoyYTpiYTo5NzpiMjozZjphYzo3Yjpi\nZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1ZTo0MTo2ZjpmMjo3\nMzo5NTo1ODowYzpkYjBqBgNVHSMEYzBhgF9kMToxMToxMTphYzoyYTpiYTo5Nzpi\nMjozZjphYzo3YjpiZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1\nZTo0MTo2ZjpmMjo3Mzo5NTo1ODowYzpkYjA/BgNVHREEODA2hjRzcGlmZmU6Ly8x\nMTExMTExMS0yMjIyLTMzMzMtNDQ0NC01NTU1NTU1NTU1NTUuY29uc3VsMAoGCCqG\nSM49BAMCA0gAMEUCICOY0i246rQHJt8o8Oya0D5PLL1FnmsQmQqIGCi31RwnAiEA\noR5f6Ku+cig2Il8T8LJujOp2/2A72QcHZA57B13y+8o=\n-----END CERTIFICATE-----\n" + "validationContext": { + "trustedCa": { + "inlineString": "-----BEGIN CERTIFICATE-----\nMIICXDCCAgKgAwIBAgIICpZq70Z9LyUwCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowFDESMBAG\nA1UEAxMJVGVzdCBDQSAyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEIhywH1gx\nAsMwuF3ukAI5YL2jFxH6Usnma1HFSfVyxbXX1/uoZEYrj8yCAtdU2yoHETyd+Zx2\nThhRLP79pYegCaOCATwwggE4MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTAD\nAQH/MGgGA1UdDgRhBF9kMToxMToxMTphYzoyYTpiYTo5NzpiMjozZjphYzo3Yjpi\nZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1ZTo0MTo2ZjpmMjo3\nMzo5NTo1ODowYzpkYjBqBgNVHSMEYzBhgF9kMToxMToxMTphYzoyYTpiYTo5Nzpi\nMjozZjphYzo3YjpiZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1\nZTo0MTo2ZjpmMjo3Mzo5NTo1ODowYzpkYjA/BgNVHREEODA2hjRzcGlmZmU6Ly8x\nMTExMTExMS0yMjIyLTMzMzMtNDQ0NC01NTU1NTU1NTU1NTUuY29uc3VsMAoGCCqG\nSM49BAMCA0gAMEUCICOY0i246rQHJt8o8Oya0D5PLL1FnmsQmQqIGCi31RwnAiEA\noR5f6Ku+cig2Il8T8LJujOp2/2A72QcHZA57B13y+8o=\n-----END CERTIFICATE-----\n" }, - "matchSubjectAltNames": [ + "matchSubjectAltNames": [ { - "exact": "spiffe://11111111-2222-3333-4444-555555555555.consul/ns/default/dc/dc1/svc/db" + "exact": "spiffe://11111111-2222-3333-4444-555555555555.consul/ns/default/dc/dc1/svc/db" } ] } }, - "sni": "db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul" + "sni": "db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul" } } }, { - "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", - "name": "failover-target~db.default.dc2.internal.11111111-2222-3333-4444-555555555555.consul", - "altStatName": "failover-target~db.default.dc2.internal.11111111-2222-3333-4444-555555555555.consul", - "type": "EDS", - "edsClusterConfig": { - "edsConfig": { - "ads": { - - }, - "resourceApiVersion": "V3" - } - }, - "connectTimeout": "33s", - "circuitBreakers": { - - }, - "outlierDetection": { - - }, - "commonLbConfig": { - "healthyPanicThreshold": { - + "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", + "name": "failover-target~1~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "altStatName": "failover-target~1~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "type": "EDS", + "edsClusterConfig": { + "edsConfig": { + "ads": {}, + "resourceApiVersion": "V3" } }, - "transportSocket": { - "name": "tls", - "typedConfig": { - "@type": "type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext", - "commonTlsContext": { - "tlsParams": { - - }, - "tlsCertificates": [ + "connectTimeout": "33s", + "circuitBreakers": {}, + "outlierDetection": {}, + "commonLbConfig": { + "healthyPanicThreshold": {} + }, + "transportSocket": { + "name": "tls", + "typedConfig": { + "@type": "type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext", + "commonTlsContext": { + "tlsParams": {}, + "tlsCertificates": [ { - "certificateChain": { - "inlineString": "-----BEGIN CERTIFICATE-----\nMIICjDCCAjKgAwIBAgIIC5llxGV1gB8wCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowDjEMMAoG\nA1UEAxMDd2ViMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEADPv1RHVNRfa2VKR\nAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Favq5E0ivpNtv1QnFhxtPd7d5k4e+T7\nSkW1TaOCAXIwggFuMA4GA1UdDwEB/wQEAwIDuDAdBgNVHSUEFjAUBggrBgEFBQcD\nAgYIKwYBBQUHAwEwDAYDVR0TAQH/BAIwADBoBgNVHQ4EYQRfN2Q6MDc6ODc6M2E6\nNDA6MTk6NDc6YzM6NWE6YzA6YmE6NjI6ZGY6YWY6NGI6ZDQ6MDU6MjU6NzY6M2Q6\nNWE6OGQ6MTY6OGQ6Njc6NWU6MmU6YTA6MzQ6N2Q6ZGM6ZmYwagYDVR0jBGMwYYBf\nZDE6MTE6MTE6YWM6MmE6YmE6OTc6YjI6M2Y6YWM6N2I6YmQ6ZGE6YmU6YjE6OGE6\nZmM6OWE6YmE6YjU6YmM6ODM6ZTc6NWU6NDE6NmY6ZjI6NzM6OTU6NTg6MGM6ZGIw\nWQYDVR0RBFIwUIZOc3BpZmZlOi8vMTExMTExMTEtMjIyMi0zMzMzLTQ0NDQtNTU1\nNTU1NTU1NTU1LmNvbnN1bC9ucy9kZWZhdWx0L2RjL2RjMS9zdmMvd2ViMAoGCCqG\nSM49BAMCA0gAMEUCIGC3TTvvjj76KMrguVyFf4tjOqaSCRie3nmHMRNNRav7AiEA\npY0heYeK9A6iOLrzqxSerkXXQyj5e9bE4VgUnxgPU6g=\n-----END CERTIFICATE-----\n" + "certificateChain": { + "inlineString": "-----BEGIN CERTIFICATE-----\nMIICjDCCAjKgAwIBAgIIC5llxGV1gB8wCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowDjEMMAoG\nA1UEAxMDd2ViMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEADPv1RHVNRfa2VKR\nAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Favq5E0ivpNtv1QnFhxtPd7d5k4e+T7\nSkW1TaOCAXIwggFuMA4GA1UdDwEB/wQEAwIDuDAdBgNVHSUEFjAUBggrBgEFBQcD\nAgYIKwYBBQUHAwEwDAYDVR0TAQH/BAIwADBoBgNVHQ4EYQRfN2Q6MDc6ODc6M2E6\nNDA6MTk6NDc6YzM6NWE6YzA6YmE6NjI6ZGY6YWY6NGI6ZDQ6MDU6MjU6NzY6M2Q6\nNWE6OGQ6MTY6OGQ6Njc6NWU6MmU6YTA6MzQ6N2Q6ZGM6ZmYwagYDVR0jBGMwYYBf\nZDE6MTE6MTE6YWM6MmE6YmE6OTc6YjI6M2Y6YWM6N2I6YmQ6ZGE6YmU6YjE6OGE6\nZmM6OWE6YmE6YjU6YmM6ODM6ZTc6NWU6NDE6NmY6ZjI6NzM6OTU6NTg6MGM6ZGIw\nWQYDVR0RBFIwUIZOc3BpZmZlOi8vMTExMTExMTEtMjIyMi0zMzMzLTQ0NDQtNTU1\nNTU1NTU1NTU1LmNvbnN1bC9ucy9kZWZhdWx0L2RjL2RjMS9zdmMvd2ViMAoGCCqG\nSM49BAMCA0gAMEUCIGC3TTvvjj76KMrguVyFf4tjOqaSCRie3nmHMRNNRav7AiEA\npY0heYeK9A6iOLrzqxSerkXXQyj5e9bE4VgUnxgPU6g=\n-----END CERTIFICATE-----\n" }, - "privateKey": { - "inlineString": "-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEIMoTkpRggp3fqZzFKh82yS4LjtJI+XY+qX/7DefHFrtdoAoGCCqGSM49\nAwEHoUQDQgAEADPv1RHVNRfa2VKRAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Fav\nq5E0ivpNtv1QnFhxtPd7d5k4e+T7SkW1TQ==\n-----END EC PRIVATE KEY-----\n" + "privateKey": { + "inlineString": "-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEIMoTkpRggp3fqZzFKh82yS4LjtJI+XY+qX/7DefHFrtdoAoGCCqGSM49\nAwEHoUQDQgAEADPv1RHVNRfa2VKRAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Fav\nq5E0ivpNtv1QnFhxtPd7d5k4e+T7SkW1TQ==\n-----END EC PRIVATE KEY-----\n" } } ], - "validationContext": { - "trustedCa": { - "inlineString": "-----BEGIN CERTIFICATE-----\nMIICXDCCAgKgAwIBAgIICpZq70Z9LyUwCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowFDESMBAG\nA1UEAxMJVGVzdCBDQSAyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEIhywH1gx\nAsMwuF3ukAI5YL2jFxH6Usnma1HFSfVyxbXX1/uoZEYrj8yCAtdU2yoHETyd+Zx2\nThhRLP79pYegCaOCATwwggE4MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTAD\nAQH/MGgGA1UdDgRhBF9kMToxMToxMTphYzoyYTpiYTo5NzpiMjozZjphYzo3Yjpi\nZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1ZTo0MTo2ZjpmMjo3\nMzo5NTo1ODowYzpkYjBqBgNVHSMEYzBhgF9kMToxMToxMTphYzoyYTpiYTo5Nzpi\nMjozZjphYzo3YjpiZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1\nZTo0MTo2ZjpmMjo3Mzo5NTo1ODowYzpkYjA/BgNVHREEODA2hjRzcGlmZmU6Ly8x\nMTExMTExMS0yMjIyLTMzMzMtNDQ0NC01NTU1NTU1NTU1NTUuY29uc3VsMAoGCCqG\nSM49BAMCA0gAMEUCICOY0i246rQHJt8o8Oya0D5PLL1FnmsQmQqIGCi31RwnAiEA\noR5f6Ku+cig2Il8T8LJujOp2/2A72QcHZA57B13y+8o=\n-----END CERTIFICATE-----\n" + "validationContext": { + "trustedCa": { + "inlineString": "-----BEGIN CERTIFICATE-----\nMIICXDCCAgKgAwIBAgIICpZq70Z9LyUwCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowFDESMBAG\nA1UEAxMJVGVzdCBDQSAyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEIhywH1gx\nAsMwuF3ukAI5YL2jFxH6Usnma1HFSfVyxbXX1/uoZEYrj8yCAtdU2yoHETyd+Zx2\nThhRLP79pYegCaOCATwwggE4MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTAD\nAQH/MGgGA1UdDgRhBF9kMToxMToxMTphYzoyYTpiYTo5NzpiMjozZjphYzo3Yjpi\nZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1ZTo0MTo2ZjpmMjo3\nMzo5NTo1ODowYzpkYjBqBgNVHSMEYzBhgF9kMToxMToxMTphYzoyYTpiYTo5Nzpi\nMjozZjphYzo3YjpiZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1\nZTo0MTo2ZjpmMjo3Mzo5NTo1ODowYzpkYjA/BgNVHREEODA2hjRzcGlmZmU6Ly8x\nMTExMTExMS0yMjIyLTMzMzMtNDQ0NC01NTU1NTU1NTU1NTUuY29uc3VsMAoGCCqG\nSM49BAMCA0gAMEUCICOY0i246rQHJt8o8Oya0D5PLL1FnmsQmQqIGCi31RwnAiEA\noR5f6Ku+cig2Il8T8LJujOp2/2A72QcHZA57B13y+8o=\n-----END CERTIFICATE-----\n" }, - "matchSubjectAltNames": [ + "matchSubjectAltNames": [ { - "exact": "spiffe://11111111-2222-3333-4444-555555555555.consul/ns/default/dc/dc2/svc/db" + "exact": "spiffe://11111111-2222-3333-4444-555555555555.consul/ns/default/dc/dc2/svc/db" } ] } }, - "sni": "db.default.dc2.internal.11111111-2222-3333-4444-555555555555.consul" + "sni": "db.default.dc2.internal.11111111-2222-3333-4444-555555555555.consul" } } }, { - "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", - "name": "failover-target~db.default.dc3.internal.11111111-2222-3333-4444-555555555555.consul", - "altStatName": "failover-target~db.default.dc3.internal.11111111-2222-3333-4444-555555555555.consul", - "type": "EDS", - "edsClusterConfig": { - "edsConfig": { - "ads": { - - }, - "resourceApiVersion": "V3" + "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", + "name": "failover-target~2~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "altStatName": "failover-target~2~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "type": "EDS", + "edsClusterConfig": { + "edsConfig": { + "ads": {}, + "resourceApiVersion": "V3" } }, - "connectTimeout": "33s", - "circuitBreakers": { - - }, - "outlierDetection": { - - }, - "commonLbConfig": { - "healthyPanicThreshold": { - - } - }, - "transportSocket": { - "name": "tls", - "typedConfig": { - "@type": "type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext", - "commonTlsContext": { - "tlsParams": { - - }, - "tlsCertificates": [ + "connectTimeout": "33s", + "circuitBreakers": {}, + "outlierDetection": {}, + "commonLbConfig": { + "healthyPanicThreshold": {} + }, + "transportSocket": { + "name": "tls", + "typedConfig": { + "@type": "type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext", + "commonTlsContext": { + "tlsParams": {}, + "tlsCertificates": [ { - "certificateChain": { - "inlineString": "-----BEGIN CERTIFICATE-----\nMIICjDCCAjKgAwIBAgIIC5llxGV1gB8wCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowDjEMMAoG\nA1UEAxMDd2ViMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEADPv1RHVNRfa2VKR\nAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Favq5E0ivpNtv1QnFhxtPd7d5k4e+T7\nSkW1TaOCAXIwggFuMA4GA1UdDwEB/wQEAwIDuDAdBgNVHSUEFjAUBggrBgEFBQcD\nAgYIKwYBBQUHAwEwDAYDVR0TAQH/BAIwADBoBgNVHQ4EYQRfN2Q6MDc6ODc6M2E6\nNDA6MTk6NDc6YzM6NWE6YzA6YmE6NjI6ZGY6YWY6NGI6ZDQ6MDU6MjU6NzY6M2Q6\nNWE6OGQ6MTY6OGQ6Njc6NWU6MmU6YTA6MzQ6N2Q6ZGM6ZmYwagYDVR0jBGMwYYBf\nZDE6MTE6MTE6YWM6MmE6YmE6OTc6YjI6M2Y6YWM6N2I6YmQ6ZGE6YmU6YjE6OGE6\nZmM6OWE6YmE6YjU6YmM6ODM6ZTc6NWU6NDE6NmY6ZjI6NzM6OTU6NTg6MGM6ZGIw\nWQYDVR0RBFIwUIZOc3BpZmZlOi8vMTExMTExMTEtMjIyMi0zMzMzLTQ0NDQtNTU1\nNTU1NTU1NTU1LmNvbnN1bC9ucy9kZWZhdWx0L2RjL2RjMS9zdmMvd2ViMAoGCCqG\nSM49BAMCA0gAMEUCIGC3TTvvjj76KMrguVyFf4tjOqaSCRie3nmHMRNNRav7AiEA\npY0heYeK9A6iOLrzqxSerkXXQyj5e9bE4VgUnxgPU6g=\n-----END CERTIFICATE-----\n" + "certificateChain": { + "inlineString": "-----BEGIN CERTIFICATE-----\nMIICjDCCAjKgAwIBAgIIC5llxGV1gB8wCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowDjEMMAoG\nA1UEAxMDd2ViMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEADPv1RHVNRfa2VKR\nAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Favq5E0ivpNtv1QnFhxtPd7d5k4e+T7\nSkW1TaOCAXIwggFuMA4GA1UdDwEB/wQEAwIDuDAdBgNVHSUEFjAUBggrBgEFBQcD\nAgYIKwYBBQUHAwEwDAYDVR0TAQH/BAIwADBoBgNVHQ4EYQRfN2Q6MDc6ODc6M2E6\nNDA6MTk6NDc6YzM6NWE6YzA6YmE6NjI6ZGY6YWY6NGI6ZDQ6MDU6MjU6NzY6M2Q6\nNWE6OGQ6MTY6OGQ6Njc6NWU6MmU6YTA6MzQ6N2Q6ZGM6ZmYwagYDVR0jBGMwYYBf\nZDE6MTE6MTE6YWM6MmE6YmE6OTc6YjI6M2Y6YWM6N2I6YmQ6ZGE6YmU6YjE6OGE6\nZmM6OWE6YmE6YjU6YmM6ODM6ZTc6NWU6NDE6NmY6ZjI6NzM6OTU6NTg6MGM6ZGIw\nWQYDVR0RBFIwUIZOc3BpZmZlOi8vMTExMTExMTEtMjIyMi0zMzMzLTQ0NDQtNTU1\nNTU1NTU1NTU1LmNvbnN1bC9ucy9kZWZhdWx0L2RjL2RjMS9zdmMvd2ViMAoGCCqG\nSM49BAMCA0gAMEUCIGC3TTvvjj76KMrguVyFf4tjOqaSCRie3nmHMRNNRav7AiEA\npY0heYeK9A6iOLrzqxSerkXXQyj5e9bE4VgUnxgPU6g=\n-----END CERTIFICATE-----\n" }, - "privateKey": { - "inlineString": "-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEIMoTkpRggp3fqZzFKh82yS4LjtJI+XY+qX/7DefHFrtdoAoGCCqGSM49\nAwEHoUQDQgAEADPv1RHVNRfa2VKRAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Fav\nq5E0ivpNtv1QnFhxtPd7d5k4e+T7SkW1TQ==\n-----END EC PRIVATE KEY-----\n" + "privateKey": { + "inlineString": "-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEIMoTkpRggp3fqZzFKh82yS4LjtJI+XY+qX/7DefHFrtdoAoGCCqGSM49\nAwEHoUQDQgAEADPv1RHVNRfa2VKRAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Fav\nq5E0ivpNtv1QnFhxtPd7d5k4e+T7SkW1TQ==\n-----END EC PRIVATE KEY-----\n" } } ], - "validationContext": { - "trustedCa": { - "inlineString": "-----BEGIN CERTIFICATE-----\nMIICXDCCAgKgAwIBAgIICpZq70Z9LyUwCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowFDESMBAG\nA1UEAxMJVGVzdCBDQSAyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEIhywH1gx\nAsMwuF3ukAI5YL2jFxH6Usnma1HFSfVyxbXX1/uoZEYrj8yCAtdU2yoHETyd+Zx2\nThhRLP79pYegCaOCATwwggE4MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTAD\nAQH/MGgGA1UdDgRhBF9kMToxMToxMTphYzoyYTpiYTo5NzpiMjozZjphYzo3Yjpi\nZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1ZTo0MTo2ZjpmMjo3\nMzo5NTo1ODowYzpkYjBqBgNVHSMEYzBhgF9kMToxMToxMTphYzoyYTpiYTo5Nzpi\nMjozZjphYzo3YjpiZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1\nZTo0MTo2ZjpmMjo3Mzo5NTo1ODowYzpkYjA/BgNVHREEODA2hjRzcGlmZmU6Ly8x\nMTExMTExMS0yMjIyLTMzMzMtNDQ0NC01NTU1NTU1NTU1NTUuY29uc3VsMAoGCCqG\nSM49BAMCA0gAMEUCICOY0i246rQHJt8o8Oya0D5PLL1FnmsQmQqIGCi31RwnAiEA\noR5f6Ku+cig2Il8T8LJujOp2/2A72QcHZA57B13y+8o=\n-----END CERTIFICATE-----\n" + "validationContext": { + "trustedCa": { + "inlineString": "-----BEGIN CERTIFICATE-----\nMIICXDCCAgKgAwIBAgIICpZq70Z9LyUwCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowFDESMBAG\nA1UEAxMJVGVzdCBDQSAyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEIhywH1gx\nAsMwuF3ukAI5YL2jFxH6Usnma1HFSfVyxbXX1/uoZEYrj8yCAtdU2yoHETyd+Zx2\nThhRLP79pYegCaOCATwwggE4MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTAD\nAQH/MGgGA1UdDgRhBF9kMToxMToxMTphYzoyYTpiYTo5NzpiMjozZjphYzo3Yjpi\nZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1ZTo0MTo2ZjpmMjo3\nMzo5NTo1ODowYzpkYjBqBgNVHSMEYzBhgF9kMToxMToxMTphYzoyYTpiYTo5Nzpi\nMjozZjphYzo3YjpiZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1\nZTo0MTo2ZjpmMjo3Mzo5NTo1ODowYzpkYjA/BgNVHREEODA2hjRzcGlmZmU6Ly8x\nMTExMTExMS0yMjIyLTMzMzMtNDQ0NC01NTU1NTU1NTU1NTUuY29uc3VsMAoGCCqG\nSM49BAMCA0gAMEUCICOY0i246rQHJt8o8Oya0D5PLL1FnmsQmQqIGCi31RwnAiEA\noR5f6Ku+cig2Il8T8LJujOp2/2A72QcHZA57B13y+8o=\n-----END CERTIFICATE-----\n" }, - "matchSubjectAltNames": [ + "matchSubjectAltNames": [ { - "exact": "spiffe://11111111-2222-3333-4444-555555555555.consul/ns/default/dc/dc3/svc/db" + "exact": "spiffe://11111111-2222-3333-4444-555555555555.consul/ns/default/dc/dc3/svc/db" } ] } }, - "sni": "db.default.dc3.internal.11111111-2222-3333-4444-555555555555.consul" + "sni": "db.default.dc3.internal.11111111-2222-3333-4444-555555555555.consul" } } }, { - "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", - "name": "geo-cache.default.dc1.query.11111111-2222-3333-4444-555555555555.consul", - "type": "EDS", - "edsClusterConfig": { - "edsConfig": { - "ads": { - - }, - "resourceApiVersion": "V3" + "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", + "name": "geo-cache.default.dc1.query.11111111-2222-3333-4444-555555555555.consul", + "type": "EDS", + "edsClusterConfig": { + "edsConfig": { + "ads": {}, + "resourceApiVersion": "V3" } }, - "connectTimeout": "5s", - "circuitBreakers": { - - }, - "outlierDetection": { - - }, - "transportSocket": { - "name": "tls", - "typedConfig": { - "@type": "type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext", - "commonTlsContext": { - "tlsParams": { - - }, - "tlsCertificates": [ + "connectTimeout": "5s", + "circuitBreakers": {}, + "outlierDetection": {}, + "transportSocket": { + "name": "tls", + "typedConfig": { + "@type": "type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext", + "commonTlsContext": { + "tlsParams": {}, + "tlsCertificates": [ { - "certificateChain": { - "inlineString": "-----BEGIN CERTIFICATE-----\nMIICjDCCAjKgAwIBAgIIC5llxGV1gB8wCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowDjEMMAoG\nA1UEAxMDd2ViMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEADPv1RHVNRfa2VKR\nAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Favq5E0ivpNtv1QnFhxtPd7d5k4e+T7\nSkW1TaOCAXIwggFuMA4GA1UdDwEB/wQEAwIDuDAdBgNVHSUEFjAUBggrBgEFBQcD\nAgYIKwYBBQUHAwEwDAYDVR0TAQH/BAIwADBoBgNVHQ4EYQRfN2Q6MDc6ODc6M2E6\nNDA6MTk6NDc6YzM6NWE6YzA6YmE6NjI6ZGY6YWY6NGI6ZDQ6MDU6MjU6NzY6M2Q6\nNWE6OGQ6MTY6OGQ6Njc6NWU6MmU6YTA6MzQ6N2Q6ZGM6ZmYwagYDVR0jBGMwYYBf\nZDE6MTE6MTE6YWM6MmE6YmE6OTc6YjI6M2Y6YWM6N2I6YmQ6ZGE6YmU6YjE6OGE6\nZmM6OWE6YmE6YjU6YmM6ODM6ZTc6NWU6NDE6NmY6ZjI6NzM6OTU6NTg6MGM6ZGIw\nWQYDVR0RBFIwUIZOc3BpZmZlOi8vMTExMTExMTEtMjIyMi0zMzMzLTQ0NDQtNTU1\nNTU1NTU1NTU1LmNvbnN1bC9ucy9kZWZhdWx0L2RjL2RjMS9zdmMvd2ViMAoGCCqG\nSM49BAMCA0gAMEUCIGC3TTvvjj76KMrguVyFf4tjOqaSCRie3nmHMRNNRav7AiEA\npY0heYeK9A6iOLrzqxSerkXXQyj5e9bE4VgUnxgPU6g=\n-----END CERTIFICATE-----\n" + "certificateChain": { + "inlineString": "-----BEGIN CERTIFICATE-----\nMIICjDCCAjKgAwIBAgIIC5llxGV1gB8wCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowDjEMMAoG\nA1UEAxMDd2ViMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEADPv1RHVNRfa2VKR\nAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Favq5E0ivpNtv1QnFhxtPd7d5k4e+T7\nSkW1TaOCAXIwggFuMA4GA1UdDwEB/wQEAwIDuDAdBgNVHSUEFjAUBggrBgEFBQcD\nAgYIKwYBBQUHAwEwDAYDVR0TAQH/BAIwADBoBgNVHQ4EYQRfN2Q6MDc6ODc6M2E6\nNDA6MTk6NDc6YzM6NWE6YzA6YmE6NjI6ZGY6YWY6NGI6ZDQ6MDU6MjU6NzY6M2Q6\nNWE6OGQ6MTY6OGQ6Njc6NWU6MmU6YTA6MzQ6N2Q6ZGM6ZmYwagYDVR0jBGMwYYBf\nZDE6MTE6MTE6YWM6MmE6YmE6OTc6YjI6M2Y6YWM6N2I6YmQ6ZGE6YmU6YjE6OGE6\nZmM6OWE6YmE6YjU6YmM6ODM6ZTc6NWU6NDE6NmY6ZjI6NzM6OTU6NTg6MGM6ZGIw\nWQYDVR0RBFIwUIZOc3BpZmZlOi8vMTExMTExMTEtMjIyMi0zMzMzLTQ0NDQtNTU1\nNTU1NTU1NTU1LmNvbnN1bC9ucy9kZWZhdWx0L2RjL2RjMS9zdmMvd2ViMAoGCCqG\nSM49BAMCA0gAMEUCIGC3TTvvjj76KMrguVyFf4tjOqaSCRie3nmHMRNNRav7AiEA\npY0heYeK9A6iOLrzqxSerkXXQyj5e9bE4VgUnxgPU6g=\n-----END CERTIFICATE-----\n" }, - "privateKey": { - "inlineString": "-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEIMoTkpRggp3fqZzFKh82yS4LjtJI+XY+qX/7DefHFrtdoAoGCCqGSM49\nAwEHoUQDQgAEADPv1RHVNRfa2VKRAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Fav\nq5E0ivpNtv1QnFhxtPd7d5k4e+T7SkW1TQ==\n-----END EC PRIVATE KEY-----\n" + "privateKey": { + "inlineString": "-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEIMoTkpRggp3fqZzFKh82yS4LjtJI+XY+qX/7DefHFrtdoAoGCCqGSM49\nAwEHoUQDQgAEADPv1RHVNRfa2VKRAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Fav\nq5E0ivpNtv1QnFhxtPd7d5k4e+T7SkW1TQ==\n-----END EC PRIVATE KEY-----\n" } } ], - "validationContext": { - "trustedCa": { - "inlineString": "-----BEGIN CERTIFICATE-----\nMIICXDCCAgKgAwIBAgIICpZq70Z9LyUwCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowFDESMBAG\nA1UEAxMJVGVzdCBDQSAyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEIhywH1gx\nAsMwuF3ukAI5YL2jFxH6Usnma1HFSfVyxbXX1/uoZEYrj8yCAtdU2yoHETyd+Zx2\nThhRLP79pYegCaOCATwwggE4MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTAD\nAQH/MGgGA1UdDgRhBF9kMToxMToxMTphYzoyYTpiYTo5NzpiMjozZjphYzo3Yjpi\nZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1ZTo0MTo2ZjpmMjo3\nMzo5NTo1ODowYzpkYjBqBgNVHSMEYzBhgF9kMToxMToxMTphYzoyYTpiYTo5Nzpi\nMjozZjphYzo3YjpiZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1\nZTo0MTo2ZjpmMjo3Mzo5NTo1ODowYzpkYjA/BgNVHREEODA2hjRzcGlmZmU6Ly8x\nMTExMTExMS0yMjIyLTMzMzMtNDQ0NC01NTU1NTU1NTU1NTUuY29uc3VsMAoGCCqG\nSM49BAMCA0gAMEUCICOY0i246rQHJt8o8Oya0D5PLL1FnmsQmQqIGCi31RwnAiEA\noR5f6Ku+cig2Il8T8LJujOp2/2A72QcHZA57B13y+8o=\n-----END CERTIFICATE-----\n" + "validationContext": { + "trustedCa": { + "inlineString": "-----BEGIN CERTIFICATE-----\nMIICXDCCAgKgAwIBAgIICpZq70Z9LyUwCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowFDESMBAG\nA1UEAxMJVGVzdCBDQSAyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEIhywH1gx\nAsMwuF3ukAI5YL2jFxH6Usnma1HFSfVyxbXX1/uoZEYrj8yCAtdU2yoHETyd+Zx2\nThhRLP79pYegCaOCATwwggE4MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTAD\nAQH/MGgGA1UdDgRhBF9kMToxMToxMTphYzoyYTpiYTo5NzpiMjozZjphYzo3Yjpi\nZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1ZTo0MTo2ZjpmMjo3\nMzo5NTo1ODowYzpkYjBqBgNVHSMEYzBhgF9kMToxMToxMTphYzoyYTpiYTo5Nzpi\nMjozZjphYzo3YjpiZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1\nZTo0MTo2ZjpmMjo3Mzo5NTo1ODowYzpkYjA/BgNVHREEODA2hjRzcGlmZmU6Ly8x\nMTExMTExMS0yMjIyLTMzMzMtNDQ0NC01NTU1NTU1NTU1NTUuY29uc3VsMAoGCCqG\nSM49BAMCA0gAMEUCICOY0i246rQHJt8o8Oya0D5PLL1FnmsQmQqIGCi31RwnAiEA\noR5f6Ku+cig2Il8T8LJujOp2/2A72QcHZA57B13y+8o=\n-----END CERTIFICATE-----\n" }, - "matchSubjectAltNames": [ + "matchSubjectAltNames": [ { - "exact": "spiffe://11111111-2222-3333-4444-555555555555.consul/ns/default/dc/dc1/svc/geo-cache-target" + "exact": "spiffe://11111111-2222-3333-4444-555555555555.consul/ns/default/dc/dc1/svc/geo-cache-target" }, { - "exact": "spiffe://11111111-2222-3333-4444-555555555555.consul/ns/default/dc/dc2/svc/geo-cache-target" + "exact": "spiffe://11111111-2222-3333-4444-555555555555.consul/ns/default/dc/dc2/svc/geo-cache-target" } ] } }, - "sni": "geo-cache.default.dc1.query.11111111-2222-3333-4444-555555555555.consul" + "sni": "geo-cache.default.dc1.query.11111111-2222-3333-4444-555555555555.consul" } } }, { - "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", - "name": "local_app", - "type": "STATIC", - "connectTimeout": "5s", - "loadAssignment": { - "clusterName": "local_app", - "endpoints": [ + "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", + "name": "local_app", + "type": "STATIC", + "connectTimeout": "5s", + "loadAssignment": { + "clusterName": "local_app", + "endpoints": [ { - "lbEndpoints": [ + "lbEndpoints": [ { - "endpoint": { - "address": { - "socketAddress": { - "address": "127.0.0.1", - "portValue": 8080 + "endpoint": { + "address": { + "socketAddress": { + "address": "127.0.0.1", + "portValue": 8080 } } } @@ -274,6 +236,6 @@ } } ], - "typeUrl": "type.googleapis.com/envoy.config.cluster.v3.Cluster", - "nonce": "00000001" + "typeUrl": "type.googleapis.com/envoy.config.cluster.v3.Cluster", + "nonce": "00000001" } \ No newline at end of file diff --git a/agent/xds/testdata/clusters/connect-proxy-with-tcp-chain-failover-through-local-gateway-triggered.latest.golden b/agent/xds/testdata/clusters/connect-proxy-with-tcp-chain-failover-through-local-gateway-triggered.latest.golden index 8a032b32112..e6d7abfe32d 100644 --- a/agent/xds/testdata/clusters/connect-proxy-with-tcp-chain-failover-through-local-gateway-triggered.latest.golden +++ b/agent/xds/testdata/clusters/connect-proxy-with-tcp-chain-failover-through-local-gateway-triggered.latest.golden @@ -1,210 +1,182 @@ { - "versionInfo": "00000001", - "resources": [ + "versionInfo": "00000001", + "resources": [ { - "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", - "name": "db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", - "altStatName": "db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", - "clusterType": { - "name": "envoy.clusters.aggregate", - "typedConfig": { - "@type": "type.googleapis.com/envoy.extensions.clusters.aggregate.v3.ClusterConfig", - "clusters": [ - "failover-target~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", - "failover-target~db.default.dc2.internal.11111111-2222-3333-4444-555555555555.consul" + "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", + "name": "db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "altStatName": "db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "clusterType": { + "name": "envoy.clusters.aggregate", + "typedConfig": { + "@type": "type.googleapis.com/envoy.extensions.clusters.aggregate.v3.ClusterConfig", + "clusters": [ + "failover-target~0~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "failover-target~1~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul" ] } }, - "connectTimeout": "33s", - "lbPolicy": "CLUSTER_PROVIDED" + "connectTimeout": "33s", + "lbPolicy": "CLUSTER_PROVIDED" }, { - "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", - "name": "failover-target~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", - "altStatName": "failover-target~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", - "type": "EDS", - "edsClusterConfig": { - "edsConfig": { - "ads": { - - }, - "resourceApiVersion": "V3" + "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", + "name": "failover-target~0~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "altStatName": "failover-target~0~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "type": "EDS", + "edsClusterConfig": { + "edsConfig": { + "ads": {}, + "resourceApiVersion": "V3" } }, - "connectTimeout": "33s", - "circuitBreakers": { - - }, - "outlierDetection": { - - }, - "commonLbConfig": { - "healthyPanicThreshold": { - - } + "connectTimeout": "33s", + "circuitBreakers": {}, + "outlierDetection": {}, + "commonLbConfig": { + "healthyPanicThreshold": {} }, - "transportSocket": { - "name": "tls", - "typedConfig": { - "@type": "type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext", - "commonTlsContext": { - "tlsParams": { - - }, - "tlsCertificates": [ + "transportSocket": { + "name": "tls", + "typedConfig": { + "@type": "type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext", + "commonTlsContext": { + "tlsParams": {}, + "tlsCertificates": [ { - "certificateChain": { - "inlineString": "-----BEGIN CERTIFICATE-----\nMIICjDCCAjKgAwIBAgIIC5llxGV1gB8wCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowDjEMMAoG\nA1UEAxMDd2ViMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEADPv1RHVNRfa2VKR\nAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Favq5E0ivpNtv1QnFhxtPd7d5k4e+T7\nSkW1TaOCAXIwggFuMA4GA1UdDwEB/wQEAwIDuDAdBgNVHSUEFjAUBggrBgEFBQcD\nAgYIKwYBBQUHAwEwDAYDVR0TAQH/BAIwADBoBgNVHQ4EYQRfN2Q6MDc6ODc6M2E6\nNDA6MTk6NDc6YzM6NWE6YzA6YmE6NjI6ZGY6YWY6NGI6ZDQ6MDU6MjU6NzY6M2Q6\nNWE6OGQ6MTY6OGQ6Njc6NWU6MmU6YTA6MzQ6N2Q6ZGM6ZmYwagYDVR0jBGMwYYBf\nZDE6MTE6MTE6YWM6MmE6YmE6OTc6YjI6M2Y6YWM6N2I6YmQ6ZGE6YmU6YjE6OGE6\nZmM6OWE6YmE6YjU6YmM6ODM6ZTc6NWU6NDE6NmY6ZjI6NzM6OTU6NTg6MGM6ZGIw\nWQYDVR0RBFIwUIZOc3BpZmZlOi8vMTExMTExMTEtMjIyMi0zMzMzLTQ0NDQtNTU1\nNTU1NTU1NTU1LmNvbnN1bC9ucy9kZWZhdWx0L2RjL2RjMS9zdmMvd2ViMAoGCCqG\nSM49BAMCA0gAMEUCIGC3TTvvjj76KMrguVyFf4tjOqaSCRie3nmHMRNNRav7AiEA\npY0heYeK9A6iOLrzqxSerkXXQyj5e9bE4VgUnxgPU6g=\n-----END CERTIFICATE-----\n" + "certificateChain": { + "inlineString": "-----BEGIN CERTIFICATE-----\nMIICjDCCAjKgAwIBAgIIC5llxGV1gB8wCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowDjEMMAoG\nA1UEAxMDd2ViMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEADPv1RHVNRfa2VKR\nAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Favq5E0ivpNtv1QnFhxtPd7d5k4e+T7\nSkW1TaOCAXIwggFuMA4GA1UdDwEB/wQEAwIDuDAdBgNVHSUEFjAUBggrBgEFBQcD\nAgYIKwYBBQUHAwEwDAYDVR0TAQH/BAIwADBoBgNVHQ4EYQRfN2Q6MDc6ODc6M2E6\nNDA6MTk6NDc6YzM6NWE6YzA6YmE6NjI6ZGY6YWY6NGI6ZDQ6MDU6MjU6NzY6M2Q6\nNWE6OGQ6MTY6OGQ6Njc6NWU6MmU6YTA6MzQ6N2Q6ZGM6ZmYwagYDVR0jBGMwYYBf\nZDE6MTE6MTE6YWM6MmE6YmE6OTc6YjI6M2Y6YWM6N2I6YmQ6ZGE6YmU6YjE6OGE6\nZmM6OWE6YmE6YjU6YmM6ODM6ZTc6NWU6NDE6NmY6ZjI6NzM6OTU6NTg6MGM6ZGIw\nWQYDVR0RBFIwUIZOc3BpZmZlOi8vMTExMTExMTEtMjIyMi0zMzMzLTQ0NDQtNTU1\nNTU1NTU1NTU1LmNvbnN1bC9ucy9kZWZhdWx0L2RjL2RjMS9zdmMvd2ViMAoGCCqG\nSM49BAMCA0gAMEUCIGC3TTvvjj76KMrguVyFf4tjOqaSCRie3nmHMRNNRav7AiEA\npY0heYeK9A6iOLrzqxSerkXXQyj5e9bE4VgUnxgPU6g=\n-----END CERTIFICATE-----\n" }, - "privateKey": { - "inlineString": "-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEIMoTkpRggp3fqZzFKh82yS4LjtJI+XY+qX/7DefHFrtdoAoGCCqGSM49\nAwEHoUQDQgAEADPv1RHVNRfa2VKRAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Fav\nq5E0ivpNtv1QnFhxtPd7d5k4e+T7SkW1TQ==\n-----END EC PRIVATE KEY-----\n" + "privateKey": { + "inlineString": "-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEIMoTkpRggp3fqZzFKh82yS4LjtJI+XY+qX/7DefHFrtdoAoGCCqGSM49\nAwEHoUQDQgAEADPv1RHVNRfa2VKRAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Fav\nq5E0ivpNtv1QnFhxtPd7d5k4e+T7SkW1TQ==\n-----END EC PRIVATE KEY-----\n" } } ], - "validationContext": { - "trustedCa": { - "inlineString": "-----BEGIN CERTIFICATE-----\nMIICXDCCAgKgAwIBAgIICpZq70Z9LyUwCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowFDESMBAG\nA1UEAxMJVGVzdCBDQSAyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEIhywH1gx\nAsMwuF3ukAI5YL2jFxH6Usnma1HFSfVyxbXX1/uoZEYrj8yCAtdU2yoHETyd+Zx2\nThhRLP79pYegCaOCATwwggE4MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTAD\nAQH/MGgGA1UdDgRhBF9kMToxMToxMTphYzoyYTpiYTo5NzpiMjozZjphYzo3Yjpi\nZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1ZTo0MTo2ZjpmMjo3\nMzo5NTo1ODowYzpkYjBqBgNVHSMEYzBhgF9kMToxMToxMTphYzoyYTpiYTo5Nzpi\nMjozZjphYzo3YjpiZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1\nZTo0MTo2ZjpmMjo3Mzo5NTo1ODowYzpkYjA/BgNVHREEODA2hjRzcGlmZmU6Ly8x\nMTExMTExMS0yMjIyLTMzMzMtNDQ0NC01NTU1NTU1NTU1NTUuY29uc3VsMAoGCCqG\nSM49BAMCA0gAMEUCICOY0i246rQHJt8o8Oya0D5PLL1FnmsQmQqIGCi31RwnAiEA\noR5f6Ku+cig2Il8T8LJujOp2/2A72QcHZA57B13y+8o=\n-----END CERTIFICATE-----\n" + "validationContext": { + "trustedCa": { + "inlineString": "-----BEGIN CERTIFICATE-----\nMIICXDCCAgKgAwIBAgIICpZq70Z9LyUwCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowFDESMBAG\nA1UEAxMJVGVzdCBDQSAyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEIhywH1gx\nAsMwuF3ukAI5YL2jFxH6Usnma1HFSfVyxbXX1/uoZEYrj8yCAtdU2yoHETyd+Zx2\nThhRLP79pYegCaOCATwwggE4MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTAD\nAQH/MGgGA1UdDgRhBF9kMToxMToxMTphYzoyYTpiYTo5NzpiMjozZjphYzo3Yjpi\nZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1ZTo0MTo2ZjpmMjo3\nMzo5NTo1ODowYzpkYjBqBgNVHSMEYzBhgF9kMToxMToxMTphYzoyYTpiYTo5Nzpi\nMjozZjphYzo3YjpiZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1\nZTo0MTo2ZjpmMjo3Mzo5NTo1ODowYzpkYjA/BgNVHREEODA2hjRzcGlmZmU6Ly8x\nMTExMTExMS0yMjIyLTMzMzMtNDQ0NC01NTU1NTU1NTU1NTUuY29uc3VsMAoGCCqG\nSM49BAMCA0gAMEUCICOY0i246rQHJt8o8Oya0D5PLL1FnmsQmQqIGCi31RwnAiEA\noR5f6Ku+cig2Il8T8LJujOp2/2A72QcHZA57B13y+8o=\n-----END CERTIFICATE-----\n" }, - "matchSubjectAltNames": [ + "matchSubjectAltNames": [ { - "exact": "spiffe://11111111-2222-3333-4444-555555555555.consul/ns/default/dc/dc1/svc/db" + "exact": "spiffe://11111111-2222-3333-4444-555555555555.consul/ns/default/dc/dc1/svc/db" } ] } }, - "sni": "db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul" + "sni": "db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul" } } }, { - "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", - "name": "failover-target~db.default.dc2.internal.11111111-2222-3333-4444-555555555555.consul", - "altStatName": "failover-target~db.default.dc2.internal.11111111-2222-3333-4444-555555555555.consul", - "type": "EDS", - "edsClusterConfig": { - "edsConfig": { - "ads": { - - }, - "resourceApiVersion": "V3" + "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", + "name": "failover-target~1~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "altStatName": "failover-target~1~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "type": "EDS", + "edsClusterConfig": { + "edsConfig": { + "ads": {}, + "resourceApiVersion": "V3" } }, - "connectTimeout": "33s", - "circuitBreakers": { - - }, - "outlierDetection": { - + "connectTimeout": "33s", + "circuitBreakers": {}, + "outlierDetection": {}, + "commonLbConfig": { + "healthyPanicThreshold": {} }, - "commonLbConfig": { - "healthyPanicThreshold": { - - } - }, - "transportSocket": { - "name": "tls", - "typedConfig": { - "@type": "type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext", - "commonTlsContext": { - "tlsParams": { - - }, - "tlsCertificates": [ + "transportSocket": { + "name": "tls", + "typedConfig": { + "@type": "type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext", + "commonTlsContext": { + "tlsParams": {}, + "tlsCertificates": [ { - "certificateChain": { - "inlineString": "-----BEGIN CERTIFICATE-----\nMIICjDCCAjKgAwIBAgIIC5llxGV1gB8wCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowDjEMMAoG\nA1UEAxMDd2ViMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEADPv1RHVNRfa2VKR\nAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Favq5E0ivpNtv1QnFhxtPd7d5k4e+T7\nSkW1TaOCAXIwggFuMA4GA1UdDwEB/wQEAwIDuDAdBgNVHSUEFjAUBggrBgEFBQcD\nAgYIKwYBBQUHAwEwDAYDVR0TAQH/BAIwADBoBgNVHQ4EYQRfN2Q6MDc6ODc6M2E6\nNDA6MTk6NDc6YzM6NWE6YzA6YmE6NjI6ZGY6YWY6NGI6ZDQ6MDU6MjU6NzY6M2Q6\nNWE6OGQ6MTY6OGQ6Njc6NWU6MmU6YTA6MzQ6N2Q6ZGM6ZmYwagYDVR0jBGMwYYBf\nZDE6MTE6MTE6YWM6MmE6YmE6OTc6YjI6M2Y6YWM6N2I6YmQ6ZGE6YmU6YjE6OGE6\nZmM6OWE6YmE6YjU6YmM6ODM6ZTc6NWU6NDE6NmY6ZjI6NzM6OTU6NTg6MGM6ZGIw\nWQYDVR0RBFIwUIZOc3BpZmZlOi8vMTExMTExMTEtMjIyMi0zMzMzLTQ0NDQtNTU1\nNTU1NTU1NTU1LmNvbnN1bC9ucy9kZWZhdWx0L2RjL2RjMS9zdmMvd2ViMAoGCCqG\nSM49BAMCA0gAMEUCIGC3TTvvjj76KMrguVyFf4tjOqaSCRie3nmHMRNNRav7AiEA\npY0heYeK9A6iOLrzqxSerkXXQyj5e9bE4VgUnxgPU6g=\n-----END CERTIFICATE-----\n" + "certificateChain": { + "inlineString": "-----BEGIN CERTIFICATE-----\nMIICjDCCAjKgAwIBAgIIC5llxGV1gB8wCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowDjEMMAoG\nA1UEAxMDd2ViMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEADPv1RHVNRfa2VKR\nAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Favq5E0ivpNtv1QnFhxtPd7d5k4e+T7\nSkW1TaOCAXIwggFuMA4GA1UdDwEB/wQEAwIDuDAdBgNVHSUEFjAUBggrBgEFBQcD\nAgYIKwYBBQUHAwEwDAYDVR0TAQH/BAIwADBoBgNVHQ4EYQRfN2Q6MDc6ODc6M2E6\nNDA6MTk6NDc6YzM6NWE6YzA6YmE6NjI6ZGY6YWY6NGI6ZDQ6MDU6MjU6NzY6M2Q6\nNWE6OGQ6MTY6OGQ6Njc6NWU6MmU6YTA6MzQ6N2Q6ZGM6ZmYwagYDVR0jBGMwYYBf\nZDE6MTE6MTE6YWM6MmE6YmE6OTc6YjI6M2Y6YWM6N2I6YmQ6ZGE6YmU6YjE6OGE6\nZmM6OWE6YmE6YjU6YmM6ODM6ZTc6NWU6NDE6NmY6ZjI6NzM6OTU6NTg6MGM6ZGIw\nWQYDVR0RBFIwUIZOc3BpZmZlOi8vMTExMTExMTEtMjIyMi0zMzMzLTQ0NDQtNTU1\nNTU1NTU1NTU1LmNvbnN1bC9ucy9kZWZhdWx0L2RjL2RjMS9zdmMvd2ViMAoGCCqG\nSM49BAMCA0gAMEUCIGC3TTvvjj76KMrguVyFf4tjOqaSCRie3nmHMRNNRav7AiEA\npY0heYeK9A6iOLrzqxSerkXXQyj5e9bE4VgUnxgPU6g=\n-----END CERTIFICATE-----\n" }, - "privateKey": { - "inlineString": "-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEIMoTkpRggp3fqZzFKh82yS4LjtJI+XY+qX/7DefHFrtdoAoGCCqGSM49\nAwEHoUQDQgAEADPv1RHVNRfa2VKRAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Fav\nq5E0ivpNtv1QnFhxtPd7d5k4e+T7SkW1TQ==\n-----END EC PRIVATE KEY-----\n" + "privateKey": { + "inlineString": "-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEIMoTkpRggp3fqZzFKh82yS4LjtJI+XY+qX/7DefHFrtdoAoGCCqGSM49\nAwEHoUQDQgAEADPv1RHVNRfa2VKRAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Fav\nq5E0ivpNtv1QnFhxtPd7d5k4e+T7SkW1TQ==\n-----END EC PRIVATE KEY-----\n" } } ], - "validationContext": { - "trustedCa": { - "inlineString": "-----BEGIN CERTIFICATE-----\nMIICXDCCAgKgAwIBAgIICpZq70Z9LyUwCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowFDESMBAG\nA1UEAxMJVGVzdCBDQSAyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEIhywH1gx\nAsMwuF3ukAI5YL2jFxH6Usnma1HFSfVyxbXX1/uoZEYrj8yCAtdU2yoHETyd+Zx2\nThhRLP79pYegCaOCATwwggE4MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTAD\nAQH/MGgGA1UdDgRhBF9kMToxMToxMTphYzoyYTpiYTo5NzpiMjozZjphYzo3Yjpi\nZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1ZTo0MTo2ZjpmMjo3\nMzo5NTo1ODowYzpkYjBqBgNVHSMEYzBhgF9kMToxMToxMTphYzoyYTpiYTo5Nzpi\nMjozZjphYzo3YjpiZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1\nZTo0MTo2ZjpmMjo3Mzo5NTo1ODowYzpkYjA/BgNVHREEODA2hjRzcGlmZmU6Ly8x\nMTExMTExMS0yMjIyLTMzMzMtNDQ0NC01NTU1NTU1NTU1NTUuY29uc3VsMAoGCCqG\nSM49BAMCA0gAMEUCICOY0i246rQHJt8o8Oya0D5PLL1FnmsQmQqIGCi31RwnAiEA\noR5f6Ku+cig2Il8T8LJujOp2/2A72QcHZA57B13y+8o=\n-----END CERTIFICATE-----\n" + "validationContext": { + "trustedCa": { + "inlineString": "-----BEGIN CERTIFICATE-----\nMIICXDCCAgKgAwIBAgIICpZq70Z9LyUwCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowFDESMBAG\nA1UEAxMJVGVzdCBDQSAyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEIhywH1gx\nAsMwuF3ukAI5YL2jFxH6Usnma1HFSfVyxbXX1/uoZEYrj8yCAtdU2yoHETyd+Zx2\nThhRLP79pYegCaOCATwwggE4MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTAD\nAQH/MGgGA1UdDgRhBF9kMToxMToxMTphYzoyYTpiYTo5NzpiMjozZjphYzo3Yjpi\nZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1ZTo0MTo2ZjpmMjo3\nMzo5NTo1ODowYzpkYjBqBgNVHSMEYzBhgF9kMToxMToxMTphYzoyYTpiYTo5Nzpi\nMjozZjphYzo3YjpiZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1\nZTo0MTo2ZjpmMjo3Mzo5NTo1ODowYzpkYjA/BgNVHREEODA2hjRzcGlmZmU6Ly8x\nMTExMTExMS0yMjIyLTMzMzMtNDQ0NC01NTU1NTU1NTU1NTUuY29uc3VsMAoGCCqG\nSM49BAMCA0gAMEUCICOY0i246rQHJt8o8Oya0D5PLL1FnmsQmQqIGCi31RwnAiEA\noR5f6Ku+cig2Il8T8LJujOp2/2A72QcHZA57B13y+8o=\n-----END CERTIFICATE-----\n" }, - "matchSubjectAltNames": [ + "matchSubjectAltNames": [ { - "exact": "spiffe://11111111-2222-3333-4444-555555555555.consul/ns/default/dc/dc2/svc/db" + "exact": "spiffe://11111111-2222-3333-4444-555555555555.consul/ns/default/dc/dc2/svc/db" } ] } }, - "sni": "db.default.dc2.internal.11111111-2222-3333-4444-555555555555.consul" + "sni": "db.default.dc2.internal.11111111-2222-3333-4444-555555555555.consul" } } }, { - "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", - "name": "geo-cache.default.dc1.query.11111111-2222-3333-4444-555555555555.consul", - "type": "EDS", - "edsClusterConfig": { - "edsConfig": { - "ads": { - - }, - "resourceApiVersion": "V3" + "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", + "name": "geo-cache.default.dc1.query.11111111-2222-3333-4444-555555555555.consul", + "type": "EDS", + "edsClusterConfig": { + "edsConfig": { + "ads": {}, + "resourceApiVersion": "V3" } }, - "connectTimeout": "5s", - "circuitBreakers": { - - }, - "outlierDetection": { - - }, - "transportSocket": { - "name": "tls", - "typedConfig": { - "@type": "type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext", - "commonTlsContext": { - "tlsParams": { - - }, - "tlsCertificates": [ + "connectTimeout": "5s", + "circuitBreakers": {}, + "outlierDetection": {}, + "transportSocket": { + "name": "tls", + "typedConfig": { + "@type": "type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext", + "commonTlsContext": { + "tlsParams": {}, + "tlsCertificates": [ { - "certificateChain": { - "inlineString": "-----BEGIN CERTIFICATE-----\nMIICjDCCAjKgAwIBAgIIC5llxGV1gB8wCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowDjEMMAoG\nA1UEAxMDd2ViMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEADPv1RHVNRfa2VKR\nAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Favq5E0ivpNtv1QnFhxtPd7d5k4e+T7\nSkW1TaOCAXIwggFuMA4GA1UdDwEB/wQEAwIDuDAdBgNVHSUEFjAUBggrBgEFBQcD\nAgYIKwYBBQUHAwEwDAYDVR0TAQH/BAIwADBoBgNVHQ4EYQRfN2Q6MDc6ODc6M2E6\nNDA6MTk6NDc6YzM6NWE6YzA6YmE6NjI6ZGY6YWY6NGI6ZDQ6MDU6MjU6NzY6M2Q6\nNWE6OGQ6MTY6OGQ6Njc6NWU6MmU6YTA6MzQ6N2Q6ZGM6ZmYwagYDVR0jBGMwYYBf\nZDE6MTE6MTE6YWM6MmE6YmE6OTc6YjI6M2Y6YWM6N2I6YmQ6ZGE6YmU6YjE6OGE6\nZmM6OWE6YmE6YjU6YmM6ODM6ZTc6NWU6NDE6NmY6ZjI6NzM6OTU6NTg6MGM6ZGIw\nWQYDVR0RBFIwUIZOc3BpZmZlOi8vMTExMTExMTEtMjIyMi0zMzMzLTQ0NDQtNTU1\nNTU1NTU1NTU1LmNvbnN1bC9ucy9kZWZhdWx0L2RjL2RjMS9zdmMvd2ViMAoGCCqG\nSM49BAMCA0gAMEUCIGC3TTvvjj76KMrguVyFf4tjOqaSCRie3nmHMRNNRav7AiEA\npY0heYeK9A6iOLrzqxSerkXXQyj5e9bE4VgUnxgPU6g=\n-----END CERTIFICATE-----\n" + "certificateChain": { + "inlineString": "-----BEGIN CERTIFICATE-----\nMIICjDCCAjKgAwIBAgIIC5llxGV1gB8wCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowDjEMMAoG\nA1UEAxMDd2ViMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEADPv1RHVNRfa2VKR\nAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Favq5E0ivpNtv1QnFhxtPd7d5k4e+T7\nSkW1TaOCAXIwggFuMA4GA1UdDwEB/wQEAwIDuDAdBgNVHSUEFjAUBggrBgEFBQcD\nAgYIKwYBBQUHAwEwDAYDVR0TAQH/BAIwADBoBgNVHQ4EYQRfN2Q6MDc6ODc6M2E6\nNDA6MTk6NDc6YzM6NWE6YzA6YmE6NjI6ZGY6YWY6NGI6ZDQ6MDU6MjU6NzY6M2Q6\nNWE6OGQ6MTY6OGQ6Njc6NWU6MmU6YTA6MzQ6N2Q6ZGM6ZmYwagYDVR0jBGMwYYBf\nZDE6MTE6MTE6YWM6MmE6YmE6OTc6YjI6M2Y6YWM6N2I6YmQ6ZGE6YmU6YjE6OGE6\nZmM6OWE6YmE6YjU6YmM6ODM6ZTc6NWU6NDE6NmY6ZjI6NzM6OTU6NTg6MGM6ZGIw\nWQYDVR0RBFIwUIZOc3BpZmZlOi8vMTExMTExMTEtMjIyMi0zMzMzLTQ0NDQtNTU1\nNTU1NTU1NTU1LmNvbnN1bC9ucy9kZWZhdWx0L2RjL2RjMS9zdmMvd2ViMAoGCCqG\nSM49BAMCA0gAMEUCIGC3TTvvjj76KMrguVyFf4tjOqaSCRie3nmHMRNNRav7AiEA\npY0heYeK9A6iOLrzqxSerkXXQyj5e9bE4VgUnxgPU6g=\n-----END CERTIFICATE-----\n" }, - "privateKey": { - "inlineString": "-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEIMoTkpRggp3fqZzFKh82yS4LjtJI+XY+qX/7DefHFrtdoAoGCCqGSM49\nAwEHoUQDQgAEADPv1RHVNRfa2VKRAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Fav\nq5E0ivpNtv1QnFhxtPd7d5k4e+T7SkW1TQ==\n-----END EC PRIVATE KEY-----\n" + "privateKey": { + "inlineString": "-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEIMoTkpRggp3fqZzFKh82yS4LjtJI+XY+qX/7DefHFrtdoAoGCCqGSM49\nAwEHoUQDQgAEADPv1RHVNRfa2VKRAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Fav\nq5E0ivpNtv1QnFhxtPd7d5k4e+T7SkW1TQ==\n-----END EC PRIVATE KEY-----\n" } } ], - "validationContext": { - "trustedCa": { - "inlineString": "-----BEGIN CERTIFICATE-----\nMIICXDCCAgKgAwIBAgIICpZq70Z9LyUwCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowFDESMBAG\nA1UEAxMJVGVzdCBDQSAyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEIhywH1gx\nAsMwuF3ukAI5YL2jFxH6Usnma1HFSfVyxbXX1/uoZEYrj8yCAtdU2yoHETyd+Zx2\nThhRLP79pYegCaOCATwwggE4MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTAD\nAQH/MGgGA1UdDgRhBF9kMToxMToxMTphYzoyYTpiYTo5NzpiMjozZjphYzo3Yjpi\nZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1ZTo0MTo2ZjpmMjo3\nMzo5NTo1ODowYzpkYjBqBgNVHSMEYzBhgF9kMToxMToxMTphYzoyYTpiYTo5Nzpi\nMjozZjphYzo3YjpiZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1\nZTo0MTo2ZjpmMjo3Mzo5NTo1ODowYzpkYjA/BgNVHREEODA2hjRzcGlmZmU6Ly8x\nMTExMTExMS0yMjIyLTMzMzMtNDQ0NC01NTU1NTU1NTU1NTUuY29uc3VsMAoGCCqG\nSM49BAMCA0gAMEUCICOY0i246rQHJt8o8Oya0D5PLL1FnmsQmQqIGCi31RwnAiEA\noR5f6Ku+cig2Il8T8LJujOp2/2A72QcHZA57B13y+8o=\n-----END CERTIFICATE-----\n" + "validationContext": { + "trustedCa": { + "inlineString": "-----BEGIN CERTIFICATE-----\nMIICXDCCAgKgAwIBAgIICpZq70Z9LyUwCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowFDESMBAG\nA1UEAxMJVGVzdCBDQSAyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEIhywH1gx\nAsMwuF3ukAI5YL2jFxH6Usnma1HFSfVyxbXX1/uoZEYrj8yCAtdU2yoHETyd+Zx2\nThhRLP79pYegCaOCATwwggE4MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTAD\nAQH/MGgGA1UdDgRhBF9kMToxMToxMTphYzoyYTpiYTo5NzpiMjozZjphYzo3Yjpi\nZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1ZTo0MTo2ZjpmMjo3\nMzo5NTo1ODowYzpkYjBqBgNVHSMEYzBhgF9kMToxMToxMTphYzoyYTpiYTo5Nzpi\nMjozZjphYzo3YjpiZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1\nZTo0MTo2ZjpmMjo3Mzo5NTo1ODowYzpkYjA/BgNVHREEODA2hjRzcGlmZmU6Ly8x\nMTExMTExMS0yMjIyLTMzMzMtNDQ0NC01NTU1NTU1NTU1NTUuY29uc3VsMAoGCCqG\nSM49BAMCA0gAMEUCICOY0i246rQHJt8o8Oya0D5PLL1FnmsQmQqIGCi31RwnAiEA\noR5f6Ku+cig2Il8T8LJujOp2/2A72QcHZA57B13y+8o=\n-----END CERTIFICATE-----\n" }, - "matchSubjectAltNames": [ + "matchSubjectAltNames": [ { - "exact": "spiffe://11111111-2222-3333-4444-555555555555.consul/ns/default/dc/dc1/svc/geo-cache-target" + "exact": "spiffe://11111111-2222-3333-4444-555555555555.consul/ns/default/dc/dc1/svc/geo-cache-target" }, { - "exact": "spiffe://11111111-2222-3333-4444-555555555555.consul/ns/default/dc/dc2/svc/geo-cache-target" + "exact": "spiffe://11111111-2222-3333-4444-555555555555.consul/ns/default/dc/dc2/svc/geo-cache-target" } ] } }, - "sni": "geo-cache.default.dc1.query.11111111-2222-3333-4444-555555555555.consul" + "sni": "geo-cache.default.dc1.query.11111111-2222-3333-4444-555555555555.consul" } } }, { - "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", - "name": "local_app", - "type": "STATIC", - "connectTimeout": "5s", - "loadAssignment": { - "clusterName": "local_app", - "endpoints": [ + "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", + "name": "local_app", + "type": "STATIC", + "connectTimeout": "5s", + "loadAssignment": { + "clusterName": "local_app", + "endpoints": [ { - "lbEndpoints": [ + "lbEndpoints": [ { - "endpoint": { - "address": { - "socketAddress": { - "address": "127.0.0.1", - "portValue": 8080 + "endpoint": { + "address": { + "socketAddress": { + "address": "127.0.0.1", + "portValue": 8080 } } } @@ -215,6 +187,6 @@ } } ], - "typeUrl": "type.googleapis.com/envoy.config.cluster.v3.Cluster", - "nonce": "00000001" + "typeUrl": "type.googleapis.com/envoy.config.cluster.v3.Cluster", + "nonce": "00000001" } \ No newline at end of file diff --git a/agent/xds/testdata/clusters/connect-proxy-with-tcp-chain-failover-through-local-gateway.latest.golden b/agent/xds/testdata/clusters/connect-proxy-with-tcp-chain-failover-through-local-gateway.latest.golden index 8a032b32112..e6d7abfe32d 100644 --- a/agent/xds/testdata/clusters/connect-proxy-with-tcp-chain-failover-through-local-gateway.latest.golden +++ b/agent/xds/testdata/clusters/connect-proxy-with-tcp-chain-failover-through-local-gateway.latest.golden @@ -1,210 +1,182 @@ { - "versionInfo": "00000001", - "resources": [ + "versionInfo": "00000001", + "resources": [ { - "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", - "name": "db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", - "altStatName": "db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", - "clusterType": { - "name": "envoy.clusters.aggregate", - "typedConfig": { - "@type": "type.googleapis.com/envoy.extensions.clusters.aggregate.v3.ClusterConfig", - "clusters": [ - "failover-target~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", - "failover-target~db.default.dc2.internal.11111111-2222-3333-4444-555555555555.consul" + "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", + "name": "db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "altStatName": "db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "clusterType": { + "name": "envoy.clusters.aggregate", + "typedConfig": { + "@type": "type.googleapis.com/envoy.extensions.clusters.aggregate.v3.ClusterConfig", + "clusters": [ + "failover-target~0~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "failover-target~1~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul" ] } }, - "connectTimeout": "33s", - "lbPolicy": "CLUSTER_PROVIDED" + "connectTimeout": "33s", + "lbPolicy": "CLUSTER_PROVIDED" }, { - "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", - "name": "failover-target~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", - "altStatName": "failover-target~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", - "type": "EDS", - "edsClusterConfig": { - "edsConfig": { - "ads": { - - }, - "resourceApiVersion": "V3" + "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", + "name": "failover-target~0~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "altStatName": "failover-target~0~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "type": "EDS", + "edsClusterConfig": { + "edsConfig": { + "ads": {}, + "resourceApiVersion": "V3" } }, - "connectTimeout": "33s", - "circuitBreakers": { - - }, - "outlierDetection": { - - }, - "commonLbConfig": { - "healthyPanicThreshold": { - - } + "connectTimeout": "33s", + "circuitBreakers": {}, + "outlierDetection": {}, + "commonLbConfig": { + "healthyPanicThreshold": {} }, - "transportSocket": { - "name": "tls", - "typedConfig": { - "@type": "type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext", - "commonTlsContext": { - "tlsParams": { - - }, - "tlsCertificates": [ + "transportSocket": { + "name": "tls", + "typedConfig": { + "@type": "type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext", + "commonTlsContext": { + "tlsParams": {}, + "tlsCertificates": [ { - "certificateChain": { - "inlineString": "-----BEGIN CERTIFICATE-----\nMIICjDCCAjKgAwIBAgIIC5llxGV1gB8wCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowDjEMMAoG\nA1UEAxMDd2ViMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEADPv1RHVNRfa2VKR\nAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Favq5E0ivpNtv1QnFhxtPd7d5k4e+T7\nSkW1TaOCAXIwggFuMA4GA1UdDwEB/wQEAwIDuDAdBgNVHSUEFjAUBggrBgEFBQcD\nAgYIKwYBBQUHAwEwDAYDVR0TAQH/BAIwADBoBgNVHQ4EYQRfN2Q6MDc6ODc6M2E6\nNDA6MTk6NDc6YzM6NWE6YzA6YmE6NjI6ZGY6YWY6NGI6ZDQ6MDU6MjU6NzY6M2Q6\nNWE6OGQ6MTY6OGQ6Njc6NWU6MmU6YTA6MzQ6N2Q6ZGM6ZmYwagYDVR0jBGMwYYBf\nZDE6MTE6MTE6YWM6MmE6YmE6OTc6YjI6M2Y6YWM6N2I6YmQ6ZGE6YmU6YjE6OGE6\nZmM6OWE6YmE6YjU6YmM6ODM6ZTc6NWU6NDE6NmY6ZjI6NzM6OTU6NTg6MGM6ZGIw\nWQYDVR0RBFIwUIZOc3BpZmZlOi8vMTExMTExMTEtMjIyMi0zMzMzLTQ0NDQtNTU1\nNTU1NTU1NTU1LmNvbnN1bC9ucy9kZWZhdWx0L2RjL2RjMS9zdmMvd2ViMAoGCCqG\nSM49BAMCA0gAMEUCIGC3TTvvjj76KMrguVyFf4tjOqaSCRie3nmHMRNNRav7AiEA\npY0heYeK9A6iOLrzqxSerkXXQyj5e9bE4VgUnxgPU6g=\n-----END CERTIFICATE-----\n" + "certificateChain": { + "inlineString": "-----BEGIN CERTIFICATE-----\nMIICjDCCAjKgAwIBAgIIC5llxGV1gB8wCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowDjEMMAoG\nA1UEAxMDd2ViMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEADPv1RHVNRfa2VKR\nAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Favq5E0ivpNtv1QnFhxtPd7d5k4e+T7\nSkW1TaOCAXIwggFuMA4GA1UdDwEB/wQEAwIDuDAdBgNVHSUEFjAUBggrBgEFBQcD\nAgYIKwYBBQUHAwEwDAYDVR0TAQH/BAIwADBoBgNVHQ4EYQRfN2Q6MDc6ODc6M2E6\nNDA6MTk6NDc6YzM6NWE6YzA6YmE6NjI6ZGY6YWY6NGI6ZDQ6MDU6MjU6NzY6M2Q6\nNWE6OGQ6MTY6OGQ6Njc6NWU6MmU6YTA6MzQ6N2Q6ZGM6ZmYwagYDVR0jBGMwYYBf\nZDE6MTE6MTE6YWM6MmE6YmE6OTc6YjI6M2Y6YWM6N2I6YmQ6ZGE6YmU6YjE6OGE6\nZmM6OWE6YmE6YjU6YmM6ODM6ZTc6NWU6NDE6NmY6ZjI6NzM6OTU6NTg6MGM6ZGIw\nWQYDVR0RBFIwUIZOc3BpZmZlOi8vMTExMTExMTEtMjIyMi0zMzMzLTQ0NDQtNTU1\nNTU1NTU1NTU1LmNvbnN1bC9ucy9kZWZhdWx0L2RjL2RjMS9zdmMvd2ViMAoGCCqG\nSM49BAMCA0gAMEUCIGC3TTvvjj76KMrguVyFf4tjOqaSCRie3nmHMRNNRav7AiEA\npY0heYeK9A6iOLrzqxSerkXXQyj5e9bE4VgUnxgPU6g=\n-----END CERTIFICATE-----\n" }, - "privateKey": { - "inlineString": "-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEIMoTkpRggp3fqZzFKh82yS4LjtJI+XY+qX/7DefHFrtdoAoGCCqGSM49\nAwEHoUQDQgAEADPv1RHVNRfa2VKRAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Fav\nq5E0ivpNtv1QnFhxtPd7d5k4e+T7SkW1TQ==\n-----END EC PRIVATE KEY-----\n" + "privateKey": { + "inlineString": "-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEIMoTkpRggp3fqZzFKh82yS4LjtJI+XY+qX/7DefHFrtdoAoGCCqGSM49\nAwEHoUQDQgAEADPv1RHVNRfa2VKRAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Fav\nq5E0ivpNtv1QnFhxtPd7d5k4e+T7SkW1TQ==\n-----END EC PRIVATE KEY-----\n" } } ], - "validationContext": { - "trustedCa": { - "inlineString": "-----BEGIN CERTIFICATE-----\nMIICXDCCAgKgAwIBAgIICpZq70Z9LyUwCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowFDESMBAG\nA1UEAxMJVGVzdCBDQSAyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEIhywH1gx\nAsMwuF3ukAI5YL2jFxH6Usnma1HFSfVyxbXX1/uoZEYrj8yCAtdU2yoHETyd+Zx2\nThhRLP79pYegCaOCATwwggE4MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTAD\nAQH/MGgGA1UdDgRhBF9kMToxMToxMTphYzoyYTpiYTo5NzpiMjozZjphYzo3Yjpi\nZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1ZTo0MTo2ZjpmMjo3\nMzo5NTo1ODowYzpkYjBqBgNVHSMEYzBhgF9kMToxMToxMTphYzoyYTpiYTo5Nzpi\nMjozZjphYzo3YjpiZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1\nZTo0MTo2ZjpmMjo3Mzo5NTo1ODowYzpkYjA/BgNVHREEODA2hjRzcGlmZmU6Ly8x\nMTExMTExMS0yMjIyLTMzMzMtNDQ0NC01NTU1NTU1NTU1NTUuY29uc3VsMAoGCCqG\nSM49BAMCA0gAMEUCICOY0i246rQHJt8o8Oya0D5PLL1FnmsQmQqIGCi31RwnAiEA\noR5f6Ku+cig2Il8T8LJujOp2/2A72QcHZA57B13y+8o=\n-----END CERTIFICATE-----\n" + "validationContext": { + "trustedCa": { + "inlineString": "-----BEGIN CERTIFICATE-----\nMIICXDCCAgKgAwIBAgIICpZq70Z9LyUwCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowFDESMBAG\nA1UEAxMJVGVzdCBDQSAyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEIhywH1gx\nAsMwuF3ukAI5YL2jFxH6Usnma1HFSfVyxbXX1/uoZEYrj8yCAtdU2yoHETyd+Zx2\nThhRLP79pYegCaOCATwwggE4MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTAD\nAQH/MGgGA1UdDgRhBF9kMToxMToxMTphYzoyYTpiYTo5NzpiMjozZjphYzo3Yjpi\nZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1ZTo0MTo2ZjpmMjo3\nMzo5NTo1ODowYzpkYjBqBgNVHSMEYzBhgF9kMToxMToxMTphYzoyYTpiYTo5Nzpi\nMjozZjphYzo3YjpiZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1\nZTo0MTo2ZjpmMjo3Mzo5NTo1ODowYzpkYjA/BgNVHREEODA2hjRzcGlmZmU6Ly8x\nMTExMTExMS0yMjIyLTMzMzMtNDQ0NC01NTU1NTU1NTU1NTUuY29uc3VsMAoGCCqG\nSM49BAMCA0gAMEUCICOY0i246rQHJt8o8Oya0D5PLL1FnmsQmQqIGCi31RwnAiEA\noR5f6Ku+cig2Il8T8LJujOp2/2A72QcHZA57B13y+8o=\n-----END CERTIFICATE-----\n" }, - "matchSubjectAltNames": [ + "matchSubjectAltNames": [ { - "exact": "spiffe://11111111-2222-3333-4444-555555555555.consul/ns/default/dc/dc1/svc/db" + "exact": "spiffe://11111111-2222-3333-4444-555555555555.consul/ns/default/dc/dc1/svc/db" } ] } }, - "sni": "db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul" + "sni": "db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul" } } }, { - "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", - "name": "failover-target~db.default.dc2.internal.11111111-2222-3333-4444-555555555555.consul", - "altStatName": "failover-target~db.default.dc2.internal.11111111-2222-3333-4444-555555555555.consul", - "type": "EDS", - "edsClusterConfig": { - "edsConfig": { - "ads": { - - }, - "resourceApiVersion": "V3" + "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", + "name": "failover-target~1~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "altStatName": "failover-target~1~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "type": "EDS", + "edsClusterConfig": { + "edsConfig": { + "ads": {}, + "resourceApiVersion": "V3" } }, - "connectTimeout": "33s", - "circuitBreakers": { - - }, - "outlierDetection": { - + "connectTimeout": "33s", + "circuitBreakers": {}, + "outlierDetection": {}, + "commonLbConfig": { + "healthyPanicThreshold": {} }, - "commonLbConfig": { - "healthyPanicThreshold": { - - } - }, - "transportSocket": { - "name": "tls", - "typedConfig": { - "@type": "type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext", - "commonTlsContext": { - "tlsParams": { - - }, - "tlsCertificates": [ + "transportSocket": { + "name": "tls", + "typedConfig": { + "@type": "type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext", + "commonTlsContext": { + "tlsParams": {}, + "tlsCertificates": [ { - "certificateChain": { - "inlineString": "-----BEGIN CERTIFICATE-----\nMIICjDCCAjKgAwIBAgIIC5llxGV1gB8wCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowDjEMMAoG\nA1UEAxMDd2ViMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEADPv1RHVNRfa2VKR\nAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Favq5E0ivpNtv1QnFhxtPd7d5k4e+T7\nSkW1TaOCAXIwggFuMA4GA1UdDwEB/wQEAwIDuDAdBgNVHSUEFjAUBggrBgEFBQcD\nAgYIKwYBBQUHAwEwDAYDVR0TAQH/BAIwADBoBgNVHQ4EYQRfN2Q6MDc6ODc6M2E6\nNDA6MTk6NDc6YzM6NWE6YzA6YmE6NjI6ZGY6YWY6NGI6ZDQ6MDU6MjU6NzY6M2Q6\nNWE6OGQ6MTY6OGQ6Njc6NWU6MmU6YTA6MzQ6N2Q6ZGM6ZmYwagYDVR0jBGMwYYBf\nZDE6MTE6MTE6YWM6MmE6YmE6OTc6YjI6M2Y6YWM6N2I6YmQ6ZGE6YmU6YjE6OGE6\nZmM6OWE6YmE6YjU6YmM6ODM6ZTc6NWU6NDE6NmY6ZjI6NzM6OTU6NTg6MGM6ZGIw\nWQYDVR0RBFIwUIZOc3BpZmZlOi8vMTExMTExMTEtMjIyMi0zMzMzLTQ0NDQtNTU1\nNTU1NTU1NTU1LmNvbnN1bC9ucy9kZWZhdWx0L2RjL2RjMS9zdmMvd2ViMAoGCCqG\nSM49BAMCA0gAMEUCIGC3TTvvjj76KMrguVyFf4tjOqaSCRie3nmHMRNNRav7AiEA\npY0heYeK9A6iOLrzqxSerkXXQyj5e9bE4VgUnxgPU6g=\n-----END CERTIFICATE-----\n" + "certificateChain": { + "inlineString": "-----BEGIN CERTIFICATE-----\nMIICjDCCAjKgAwIBAgIIC5llxGV1gB8wCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowDjEMMAoG\nA1UEAxMDd2ViMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEADPv1RHVNRfa2VKR\nAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Favq5E0ivpNtv1QnFhxtPd7d5k4e+T7\nSkW1TaOCAXIwggFuMA4GA1UdDwEB/wQEAwIDuDAdBgNVHSUEFjAUBggrBgEFBQcD\nAgYIKwYBBQUHAwEwDAYDVR0TAQH/BAIwADBoBgNVHQ4EYQRfN2Q6MDc6ODc6M2E6\nNDA6MTk6NDc6YzM6NWE6YzA6YmE6NjI6ZGY6YWY6NGI6ZDQ6MDU6MjU6NzY6M2Q6\nNWE6OGQ6MTY6OGQ6Njc6NWU6MmU6YTA6MzQ6N2Q6ZGM6ZmYwagYDVR0jBGMwYYBf\nZDE6MTE6MTE6YWM6MmE6YmE6OTc6YjI6M2Y6YWM6N2I6YmQ6ZGE6YmU6YjE6OGE6\nZmM6OWE6YmE6YjU6YmM6ODM6ZTc6NWU6NDE6NmY6ZjI6NzM6OTU6NTg6MGM6ZGIw\nWQYDVR0RBFIwUIZOc3BpZmZlOi8vMTExMTExMTEtMjIyMi0zMzMzLTQ0NDQtNTU1\nNTU1NTU1NTU1LmNvbnN1bC9ucy9kZWZhdWx0L2RjL2RjMS9zdmMvd2ViMAoGCCqG\nSM49BAMCA0gAMEUCIGC3TTvvjj76KMrguVyFf4tjOqaSCRie3nmHMRNNRav7AiEA\npY0heYeK9A6iOLrzqxSerkXXQyj5e9bE4VgUnxgPU6g=\n-----END CERTIFICATE-----\n" }, - "privateKey": { - "inlineString": "-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEIMoTkpRggp3fqZzFKh82yS4LjtJI+XY+qX/7DefHFrtdoAoGCCqGSM49\nAwEHoUQDQgAEADPv1RHVNRfa2VKRAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Fav\nq5E0ivpNtv1QnFhxtPd7d5k4e+T7SkW1TQ==\n-----END EC PRIVATE KEY-----\n" + "privateKey": { + "inlineString": "-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEIMoTkpRggp3fqZzFKh82yS4LjtJI+XY+qX/7DefHFrtdoAoGCCqGSM49\nAwEHoUQDQgAEADPv1RHVNRfa2VKRAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Fav\nq5E0ivpNtv1QnFhxtPd7d5k4e+T7SkW1TQ==\n-----END EC PRIVATE KEY-----\n" } } ], - "validationContext": { - "trustedCa": { - "inlineString": "-----BEGIN CERTIFICATE-----\nMIICXDCCAgKgAwIBAgIICpZq70Z9LyUwCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowFDESMBAG\nA1UEAxMJVGVzdCBDQSAyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEIhywH1gx\nAsMwuF3ukAI5YL2jFxH6Usnma1HFSfVyxbXX1/uoZEYrj8yCAtdU2yoHETyd+Zx2\nThhRLP79pYegCaOCATwwggE4MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTAD\nAQH/MGgGA1UdDgRhBF9kMToxMToxMTphYzoyYTpiYTo5NzpiMjozZjphYzo3Yjpi\nZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1ZTo0MTo2ZjpmMjo3\nMzo5NTo1ODowYzpkYjBqBgNVHSMEYzBhgF9kMToxMToxMTphYzoyYTpiYTo5Nzpi\nMjozZjphYzo3YjpiZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1\nZTo0MTo2ZjpmMjo3Mzo5NTo1ODowYzpkYjA/BgNVHREEODA2hjRzcGlmZmU6Ly8x\nMTExMTExMS0yMjIyLTMzMzMtNDQ0NC01NTU1NTU1NTU1NTUuY29uc3VsMAoGCCqG\nSM49BAMCA0gAMEUCICOY0i246rQHJt8o8Oya0D5PLL1FnmsQmQqIGCi31RwnAiEA\noR5f6Ku+cig2Il8T8LJujOp2/2A72QcHZA57B13y+8o=\n-----END CERTIFICATE-----\n" + "validationContext": { + "trustedCa": { + "inlineString": "-----BEGIN CERTIFICATE-----\nMIICXDCCAgKgAwIBAgIICpZq70Z9LyUwCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowFDESMBAG\nA1UEAxMJVGVzdCBDQSAyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEIhywH1gx\nAsMwuF3ukAI5YL2jFxH6Usnma1HFSfVyxbXX1/uoZEYrj8yCAtdU2yoHETyd+Zx2\nThhRLP79pYegCaOCATwwggE4MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTAD\nAQH/MGgGA1UdDgRhBF9kMToxMToxMTphYzoyYTpiYTo5NzpiMjozZjphYzo3Yjpi\nZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1ZTo0MTo2ZjpmMjo3\nMzo5NTo1ODowYzpkYjBqBgNVHSMEYzBhgF9kMToxMToxMTphYzoyYTpiYTo5Nzpi\nMjozZjphYzo3YjpiZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1\nZTo0MTo2ZjpmMjo3Mzo5NTo1ODowYzpkYjA/BgNVHREEODA2hjRzcGlmZmU6Ly8x\nMTExMTExMS0yMjIyLTMzMzMtNDQ0NC01NTU1NTU1NTU1NTUuY29uc3VsMAoGCCqG\nSM49BAMCA0gAMEUCICOY0i246rQHJt8o8Oya0D5PLL1FnmsQmQqIGCi31RwnAiEA\noR5f6Ku+cig2Il8T8LJujOp2/2A72QcHZA57B13y+8o=\n-----END CERTIFICATE-----\n" }, - "matchSubjectAltNames": [ + "matchSubjectAltNames": [ { - "exact": "spiffe://11111111-2222-3333-4444-555555555555.consul/ns/default/dc/dc2/svc/db" + "exact": "spiffe://11111111-2222-3333-4444-555555555555.consul/ns/default/dc/dc2/svc/db" } ] } }, - "sni": "db.default.dc2.internal.11111111-2222-3333-4444-555555555555.consul" + "sni": "db.default.dc2.internal.11111111-2222-3333-4444-555555555555.consul" } } }, { - "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", - "name": "geo-cache.default.dc1.query.11111111-2222-3333-4444-555555555555.consul", - "type": "EDS", - "edsClusterConfig": { - "edsConfig": { - "ads": { - - }, - "resourceApiVersion": "V3" + "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", + "name": "geo-cache.default.dc1.query.11111111-2222-3333-4444-555555555555.consul", + "type": "EDS", + "edsClusterConfig": { + "edsConfig": { + "ads": {}, + "resourceApiVersion": "V3" } }, - "connectTimeout": "5s", - "circuitBreakers": { - - }, - "outlierDetection": { - - }, - "transportSocket": { - "name": "tls", - "typedConfig": { - "@type": "type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext", - "commonTlsContext": { - "tlsParams": { - - }, - "tlsCertificates": [ + "connectTimeout": "5s", + "circuitBreakers": {}, + "outlierDetection": {}, + "transportSocket": { + "name": "tls", + "typedConfig": { + "@type": "type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext", + "commonTlsContext": { + "tlsParams": {}, + "tlsCertificates": [ { - "certificateChain": { - "inlineString": "-----BEGIN CERTIFICATE-----\nMIICjDCCAjKgAwIBAgIIC5llxGV1gB8wCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowDjEMMAoG\nA1UEAxMDd2ViMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEADPv1RHVNRfa2VKR\nAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Favq5E0ivpNtv1QnFhxtPd7d5k4e+T7\nSkW1TaOCAXIwggFuMA4GA1UdDwEB/wQEAwIDuDAdBgNVHSUEFjAUBggrBgEFBQcD\nAgYIKwYBBQUHAwEwDAYDVR0TAQH/BAIwADBoBgNVHQ4EYQRfN2Q6MDc6ODc6M2E6\nNDA6MTk6NDc6YzM6NWE6YzA6YmE6NjI6ZGY6YWY6NGI6ZDQ6MDU6MjU6NzY6M2Q6\nNWE6OGQ6MTY6OGQ6Njc6NWU6MmU6YTA6MzQ6N2Q6ZGM6ZmYwagYDVR0jBGMwYYBf\nZDE6MTE6MTE6YWM6MmE6YmE6OTc6YjI6M2Y6YWM6N2I6YmQ6ZGE6YmU6YjE6OGE6\nZmM6OWE6YmE6YjU6YmM6ODM6ZTc6NWU6NDE6NmY6ZjI6NzM6OTU6NTg6MGM6ZGIw\nWQYDVR0RBFIwUIZOc3BpZmZlOi8vMTExMTExMTEtMjIyMi0zMzMzLTQ0NDQtNTU1\nNTU1NTU1NTU1LmNvbnN1bC9ucy9kZWZhdWx0L2RjL2RjMS9zdmMvd2ViMAoGCCqG\nSM49BAMCA0gAMEUCIGC3TTvvjj76KMrguVyFf4tjOqaSCRie3nmHMRNNRav7AiEA\npY0heYeK9A6iOLrzqxSerkXXQyj5e9bE4VgUnxgPU6g=\n-----END CERTIFICATE-----\n" + "certificateChain": { + "inlineString": "-----BEGIN CERTIFICATE-----\nMIICjDCCAjKgAwIBAgIIC5llxGV1gB8wCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowDjEMMAoG\nA1UEAxMDd2ViMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEADPv1RHVNRfa2VKR\nAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Favq5E0ivpNtv1QnFhxtPd7d5k4e+T7\nSkW1TaOCAXIwggFuMA4GA1UdDwEB/wQEAwIDuDAdBgNVHSUEFjAUBggrBgEFBQcD\nAgYIKwYBBQUHAwEwDAYDVR0TAQH/BAIwADBoBgNVHQ4EYQRfN2Q6MDc6ODc6M2E6\nNDA6MTk6NDc6YzM6NWE6YzA6YmE6NjI6ZGY6YWY6NGI6ZDQ6MDU6MjU6NzY6M2Q6\nNWE6OGQ6MTY6OGQ6Njc6NWU6MmU6YTA6MzQ6N2Q6ZGM6ZmYwagYDVR0jBGMwYYBf\nZDE6MTE6MTE6YWM6MmE6YmE6OTc6YjI6M2Y6YWM6N2I6YmQ6ZGE6YmU6YjE6OGE6\nZmM6OWE6YmE6YjU6YmM6ODM6ZTc6NWU6NDE6NmY6ZjI6NzM6OTU6NTg6MGM6ZGIw\nWQYDVR0RBFIwUIZOc3BpZmZlOi8vMTExMTExMTEtMjIyMi0zMzMzLTQ0NDQtNTU1\nNTU1NTU1NTU1LmNvbnN1bC9ucy9kZWZhdWx0L2RjL2RjMS9zdmMvd2ViMAoGCCqG\nSM49BAMCA0gAMEUCIGC3TTvvjj76KMrguVyFf4tjOqaSCRie3nmHMRNNRav7AiEA\npY0heYeK9A6iOLrzqxSerkXXQyj5e9bE4VgUnxgPU6g=\n-----END CERTIFICATE-----\n" }, - "privateKey": { - "inlineString": "-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEIMoTkpRggp3fqZzFKh82yS4LjtJI+XY+qX/7DefHFrtdoAoGCCqGSM49\nAwEHoUQDQgAEADPv1RHVNRfa2VKRAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Fav\nq5E0ivpNtv1QnFhxtPd7d5k4e+T7SkW1TQ==\n-----END EC PRIVATE KEY-----\n" + "privateKey": { + "inlineString": "-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEIMoTkpRggp3fqZzFKh82yS4LjtJI+XY+qX/7DefHFrtdoAoGCCqGSM49\nAwEHoUQDQgAEADPv1RHVNRfa2VKRAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Fav\nq5E0ivpNtv1QnFhxtPd7d5k4e+T7SkW1TQ==\n-----END EC PRIVATE KEY-----\n" } } ], - "validationContext": { - "trustedCa": { - "inlineString": "-----BEGIN CERTIFICATE-----\nMIICXDCCAgKgAwIBAgIICpZq70Z9LyUwCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowFDESMBAG\nA1UEAxMJVGVzdCBDQSAyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEIhywH1gx\nAsMwuF3ukAI5YL2jFxH6Usnma1HFSfVyxbXX1/uoZEYrj8yCAtdU2yoHETyd+Zx2\nThhRLP79pYegCaOCATwwggE4MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTAD\nAQH/MGgGA1UdDgRhBF9kMToxMToxMTphYzoyYTpiYTo5NzpiMjozZjphYzo3Yjpi\nZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1ZTo0MTo2ZjpmMjo3\nMzo5NTo1ODowYzpkYjBqBgNVHSMEYzBhgF9kMToxMToxMTphYzoyYTpiYTo5Nzpi\nMjozZjphYzo3YjpiZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1\nZTo0MTo2ZjpmMjo3Mzo5NTo1ODowYzpkYjA/BgNVHREEODA2hjRzcGlmZmU6Ly8x\nMTExMTExMS0yMjIyLTMzMzMtNDQ0NC01NTU1NTU1NTU1NTUuY29uc3VsMAoGCCqG\nSM49BAMCA0gAMEUCICOY0i246rQHJt8o8Oya0D5PLL1FnmsQmQqIGCi31RwnAiEA\noR5f6Ku+cig2Il8T8LJujOp2/2A72QcHZA57B13y+8o=\n-----END CERTIFICATE-----\n" + "validationContext": { + "trustedCa": { + "inlineString": "-----BEGIN CERTIFICATE-----\nMIICXDCCAgKgAwIBAgIICpZq70Z9LyUwCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowFDESMBAG\nA1UEAxMJVGVzdCBDQSAyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEIhywH1gx\nAsMwuF3ukAI5YL2jFxH6Usnma1HFSfVyxbXX1/uoZEYrj8yCAtdU2yoHETyd+Zx2\nThhRLP79pYegCaOCATwwggE4MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTAD\nAQH/MGgGA1UdDgRhBF9kMToxMToxMTphYzoyYTpiYTo5NzpiMjozZjphYzo3Yjpi\nZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1ZTo0MTo2ZjpmMjo3\nMzo5NTo1ODowYzpkYjBqBgNVHSMEYzBhgF9kMToxMToxMTphYzoyYTpiYTo5Nzpi\nMjozZjphYzo3YjpiZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1\nZTo0MTo2ZjpmMjo3Mzo5NTo1ODowYzpkYjA/BgNVHREEODA2hjRzcGlmZmU6Ly8x\nMTExMTExMS0yMjIyLTMzMzMtNDQ0NC01NTU1NTU1NTU1NTUuY29uc3VsMAoGCCqG\nSM49BAMCA0gAMEUCICOY0i246rQHJt8o8Oya0D5PLL1FnmsQmQqIGCi31RwnAiEA\noR5f6Ku+cig2Il8T8LJujOp2/2A72QcHZA57B13y+8o=\n-----END CERTIFICATE-----\n" }, - "matchSubjectAltNames": [ + "matchSubjectAltNames": [ { - "exact": "spiffe://11111111-2222-3333-4444-555555555555.consul/ns/default/dc/dc1/svc/geo-cache-target" + "exact": "spiffe://11111111-2222-3333-4444-555555555555.consul/ns/default/dc/dc1/svc/geo-cache-target" }, { - "exact": "spiffe://11111111-2222-3333-4444-555555555555.consul/ns/default/dc/dc2/svc/geo-cache-target" + "exact": "spiffe://11111111-2222-3333-4444-555555555555.consul/ns/default/dc/dc2/svc/geo-cache-target" } ] } }, - "sni": "geo-cache.default.dc1.query.11111111-2222-3333-4444-555555555555.consul" + "sni": "geo-cache.default.dc1.query.11111111-2222-3333-4444-555555555555.consul" } } }, { - "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", - "name": "local_app", - "type": "STATIC", - "connectTimeout": "5s", - "loadAssignment": { - "clusterName": "local_app", - "endpoints": [ + "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", + "name": "local_app", + "type": "STATIC", + "connectTimeout": "5s", + "loadAssignment": { + "clusterName": "local_app", + "endpoints": [ { - "lbEndpoints": [ + "lbEndpoints": [ { - "endpoint": { - "address": { - "socketAddress": { - "address": "127.0.0.1", - "portValue": 8080 + "endpoint": { + "address": { + "socketAddress": { + "address": "127.0.0.1", + "portValue": 8080 } } } @@ -215,6 +187,6 @@ } } ], - "typeUrl": "type.googleapis.com/envoy.config.cluster.v3.Cluster", - "nonce": "00000001" + "typeUrl": "type.googleapis.com/envoy.config.cluster.v3.Cluster", + "nonce": "00000001" } \ No newline at end of file diff --git a/agent/xds/testdata/clusters/connect-proxy-with-tcp-chain-failover-through-remote-gateway-triggered.latest.golden b/agent/xds/testdata/clusters/connect-proxy-with-tcp-chain-failover-through-remote-gateway-triggered.latest.golden index 8a032b32112..e6d7abfe32d 100644 --- a/agent/xds/testdata/clusters/connect-proxy-with-tcp-chain-failover-through-remote-gateway-triggered.latest.golden +++ b/agent/xds/testdata/clusters/connect-proxy-with-tcp-chain-failover-through-remote-gateway-triggered.latest.golden @@ -1,210 +1,182 @@ { - "versionInfo": "00000001", - "resources": [ + "versionInfo": "00000001", + "resources": [ { - "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", - "name": "db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", - "altStatName": "db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", - "clusterType": { - "name": "envoy.clusters.aggregate", - "typedConfig": { - "@type": "type.googleapis.com/envoy.extensions.clusters.aggregate.v3.ClusterConfig", - "clusters": [ - "failover-target~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", - "failover-target~db.default.dc2.internal.11111111-2222-3333-4444-555555555555.consul" + "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", + "name": "db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "altStatName": "db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "clusterType": { + "name": "envoy.clusters.aggregate", + "typedConfig": { + "@type": "type.googleapis.com/envoy.extensions.clusters.aggregate.v3.ClusterConfig", + "clusters": [ + "failover-target~0~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "failover-target~1~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul" ] } }, - "connectTimeout": "33s", - "lbPolicy": "CLUSTER_PROVIDED" + "connectTimeout": "33s", + "lbPolicy": "CLUSTER_PROVIDED" }, { - "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", - "name": "failover-target~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", - "altStatName": "failover-target~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", - "type": "EDS", - "edsClusterConfig": { - "edsConfig": { - "ads": { - - }, - "resourceApiVersion": "V3" + "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", + "name": "failover-target~0~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "altStatName": "failover-target~0~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "type": "EDS", + "edsClusterConfig": { + "edsConfig": { + "ads": {}, + "resourceApiVersion": "V3" } }, - "connectTimeout": "33s", - "circuitBreakers": { - - }, - "outlierDetection": { - - }, - "commonLbConfig": { - "healthyPanicThreshold": { - - } + "connectTimeout": "33s", + "circuitBreakers": {}, + "outlierDetection": {}, + "commonLbConfig": { + "healthyPanicThreshold": {} }, - "transportSocket": { - "name": "tls", - "typedConfig": { - "@type": "type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext", - "commonTlsContext": { - "tlsParams": { - - }, - "tlsCertificates": [ + "transportSocket": { + "name": "tls", + "typedConfig": { + "@type": "type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext", + "commonTlsContext": { + "tlsParams": {}, + "tlsCertificates": [ { - "certificateChain": { - "inlineString": "-----BEGIN CERTIFICATE-----\nMIICjDCCAjKgAwIBAgIIC5llxGV1gB8wCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowDjEMMAoG\nA1UEAxMDd2ViMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEADPv1RHVNRfa2VKR\nAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Favq5E0ivpNtv1QnFhxtPd7d5k4e+T7\nSkW1TaOCAXIwggFuMA4GA1UdDwEB/wQEAwIDuDAdBgNVHSUEFjAUBggrBgEFBQcD\nAgYIKwYBBQUHAwEwDAYDVR0TAQH/BAIwADBoBgNVHQ4EYQRfN2Q6MDc6ODc6M2E6\nNDA6MTk6NDc6YzM6NWE6YzA6YmE6NjI6ZGY6YWY6NGI6ZDQ6MDU6MjU6NzY6M2Q6\nNWE6OGQ6MTY6OGQ6Njc6NWU6MmU6YTA6MzQ6N2Q6ZGM6ZmYwagYDVR0jBGMwYYBf\nZDE6MTE6MTE6YWM6MmE6YmE6OTc6YjI6M2Y6YWM6N2I6YmQ6ZGE6YmU6YjE6OGE6\nZmM6OWE6YmE6YjU6YmM6ODM6ZTc6NWU6NDE6NmY6ZjI6NzM6OTU6NTg6MGM6ZGIw\nWQYDVR0RBFIwUIZOc3BpZmZlOi8vMTExMTExMTEtMjIyMi0zMzMzLTQ0NDQtNTU1\nNTU1NTU1NTU1LmNvbnN1bC9ucy9kZWZhdWx0L2RjL2RjMS9zdmMvd2ViMAoGCCqG\nSM49BAMCA0gAMEUCIGC3TTvvjj76KMrguVyFf4tjOqaSCRie3nmHMRNNRav7AiEA\npY0heYeK9A6iOLrzqxSerkXXQyj5e9bE4VgUnxgPU6g=\n-----END CERTIFICATE-----\n" + "certificateChain": { + "inlineString": "-----BEGIN CERTIFICATE-----\nMIICjDCCAjKgAwIBAgIIC5llxGV1gB8wCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowDjEMMAoG\nA1UEAxMDd2ViMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEADPv1RHVNRfa2VKR\nAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Favq5E0ivpNtv1QnFhxtPd7d5k4e+T7\nSkW1TaOCAXIwggFuMA4GA1UdDwEB/wQEAwIDuDAdBgNVHSUEFjAUBggrBgEFBQcD\nAgYIKwYBBQUHAwEwDAYDVR0TAQH/BAIwADBoBgNVHQ4EYQRfN2Q6MDc6ODc6M2E6\nNDA6MTk6NDc6YzM6NWE6YzA6YmE6NjI6ZGY6YWY6NGI6ZDQ6MDU6MjU6NzY6M2Q6\nNWE6OGQ6MTY6OGQ6Njc6NWU6MmU6YTA6MzQ6N2Q6ZGM6ZmYwagYDVR0jBGMwYYBf\nZDE6MTE6MTE6YWM6MmE6YmE6OTc6YjI6M2Y6YWM6N2I6YmQ6ZGE6YmU6YjE6OGE6\nZmM6OWE6YmE6YjU6YmM6ODM6ZTc6NWU6NDE6NmY6ZjI6NzM6OTU6NTg6MGM6ZGIw\nWQYDVR0RBFIwUIZOc3BpZmZlOi8vMTExMTExMTEtMjIyMi0zMzMzLTQ0NDQtNTU1\nNTU1NTU1NTU1LmNvbnN1bC9ucy9kZWZhdWx0L2RjL2RjMS9zdmMvd2ViMAoGCCqG\nSM49BAMCA0gAMEUCIGC3TTvvjj76KMrguVyFf4tjOqaSCRie3nmHMRNNRav7AiEA\npY0heYeK9A6iOLrzqxSerkXXQyj5e9bE4VgUnxgPU6g=\n-----END CERTIFICATE-----\n" }, - "privateKey": { - "inlineString": "-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEIMoTkpRggp3fqZzFKh82yS4LjtJI+XY+qX/7DefHFrtdoAoGCCqGSM49\nAwEHoUQDQgAEADPv1RHVNRfa2VKRAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Fav\nq5E0ivpNtv1QnFhxtPd7d5k4e+T7SkW1TQ==\n-----END EC PRIVATE KEY-----\n" + "privateKey": { + "inlineString": "-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEIMoTkpRggp3fqZzFKh82yS4LjtJI+XY+qX/7DefHFrtdoAoGCCqGSM49\nAwEHoUQDQgAEADPv1RHVNRfa2VKRAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Fav\nq5E0ivpNtv1QnFhxtPd7d5k4e+T7SkW1TQ==\n-----END EC PRIVATE KEY-----\n" } } ], - "validationContext": { - "trustedCa": { - "inlineString": "-----BEGIN CERTIFICATE-----\nMIICXDCCAgKgAwIBAgIICpZq70Z9LyUwCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowFDESMBAG\nA1UEAxMJVGVzdCBDQSAyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEIhywH1gx\nAsMwuF3ukAI5YL2jFxH6Usnma1HFSfVyxbXX1/uoZEYrj8yCAtdU2yoHETyd+Zx2\nThhRLP79pYegCaOCATwwggE4MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTAD\nAQH/MGgGA1UdDgRhBF9kMToxMToxMTphYzoyYTpiYTo5NzpiMjozZjphYzo3Yjpi\nZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1ZTo0MTo2ZjpmMjo3\nMzo5NTo1ODowYzpkYjBqBgNVHSMEYzBhgF9kMToxMToxMTphYzoyYTpiYTo5Nzpi\nMjozZjphYzo3YjpiZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1\nZTo0MTo2ZjpmMjo3Mzo5NTo1ODowYzpkYjA/BgNVHREEODA2hjRzcGlmZmU6Ly8x\nMTExMTExMS0yMjIyLTMzMzMtNDQ0NC01NTU1NTU1NTU1NTUuY29uc3VsMAoGCCqG\nSM49BAMCA0gAMEUCICOY0i246rQHJt8o8Oya0D5PLL1FnmsQmQqIGCi31RwnAiEA\noR5f6Ku+cig2Il8T8LJujOp2/2A72QcHZA57B13y+8o=\n-----END CERTIFICATE-----\n" + "validationContext": { + "trustedCa": { + "inlineString": "-----BEGIN CERTIFICATE-----\nMIICXDCCAgKgAwIBAgIICpZq70Z9LyUwCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowFDESMBAG\nA1UEAxMJVGVzdCBDQSAyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEIhywH1gx\nAsMwuF3ukAI5YL2jFxH6Usnma1HFSfVyxbXX1/uoZEYrj8yCAtdU2yoHETyd+Zx2\nThhRLP79pYegCaOCATwwggE4MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTAD\nAQH/MGgGA1UdDgRhBF9kMToxMToxMTphYzoyYTpiYTo5NzpiMjozZjphYzo3Yjpi\nZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1ZTo0MTo2ZjpmMjo3\nMzo5NTo1ODowYzpkYjBqBgNVHSMEYzBhgF9kMToxMToxMTphYzoyYTpiYTo5Nzpi\nMjozZjphYzo3YjpiZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1\nZTo0MTo2ZjpmMjo3Mzo5NTo1ODowYzpkYjA/BgNVHREEODA2hjRzcGlmZmU6Ly8x\nMTExMTExMS0yMjIyLTMzMzMtNDQ0NC01NTU1NTU1NTU1NTUuY29uc3VsMAoGCCqG\nSM49BAMCA0gAMEUCICOY0i246rQHJt8o8Oya0D5PLL1FnmsQmQqIGCi31RwnAiEA\noR5f6Ku+cig2Il8T8LJujOp2/2A72QcHZA57B13y+8o=\n-----END CERTIFICATE-----\n" }, - "matchSubjectAltNames": [ + "matchSubjectAltNames": [ { - "exact": "spiffe://11111111-2222-3333-4444-555555555555.consul/ns/default/dc/dc1/svc/db" + "exact": "spiffe://11111111-2222-3333-4444-555555555555.consul/ns/default/dc/dc1/svc/db" } ] } }, - "sni": "db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul" + "sni": "db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul" } } }, { - "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", - "name": "failover-target~db.default.dc2.internal.11111111-2222-3333-4444-555555555555.consul", - "altStatName": "failover-target~db.default.dc2.internal.11111111-2222-3333-4444-555555555555.consul", - "type": "EDS", - "edsClusterConfig": { - "edsConfig": { - "ads": { - - }, - "resourceApiVersion": "V3" + "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", + "name": "failover-target~1~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "altStatName": "failover-target~1~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "type": "EDS", + "edsClusterConfig": { + "edsConfig": { + "ads": {}, + "resourceApiVersion": "V3" } }, - "connectTimeout": "33s", - "circuitBreakers": { - - }, - "outlierDetection": { - + "connectTimeout": "33s", + "circuitBreakers": {}, + "outlierDetection": {}, + "commonLbConfig": { + "healthyPanicThreshold": {} }, - "commonLbConfig": { - "healthyPanicThreshold": { - - } - }, - "transportSocket": { - "name": "tls", - "typedConfig": { - "@type": "type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext", - "commonTlsContext": { - "tlsParams": { - - }, - "tlsCertificates": [ + "transportSocket": { + "name": "tls", + "typedConfig": { + "@type": "type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext", + "commonTlsContext": { + "tlsParams": {}, + "tlsCertificates": [ { - "certificateChain": { - "inlineString": "-----BEGIN CERTIFICATE-----\nMIICjDCCAjKgAwIBAgIIC5llxGV1gB8wCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowDjEMMAoG\nA1UEAxMDd2ViMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEADPv1RHVNRfa2VKR\nAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Favq5E0ivpNtv1QnFhxtPd7d5k4e+T7\nSkW1TaOCAXIwggFuMA4GA1UdDwEB/wQEAwIDuDAdBgNVHSUEFjAUBggrBgEFBQcD\nAgYIKwYBBQUHAwEwDAYDVR0TAQH/BAIwADBoBgNVHQ4EYQRfN2Q6MDc6ODc6M2E6\nNDA6MTk6NDc6YzM6NWE6YzA6YmE6NjI6ZGY6YWY6NGI6ZDQ6MDU6MjU6NzY6M2Q6\nNWE6OGQ6MTY6OGQ6Njc6NWU6MmU6YTA6MzQ6N2Q6ZGM6ZmYwagYDVR0jBGMwYYBf\nZDE6MTE6MTE6YWM6MmE6YmE6OTc6YjI6M2Y6YWM6N2I6YmQ6ZGE6YmU6YjE6OGE6\nZmM6OWE6YmE6YjU6YmM6ODM6ZTc6NWU6NDE6NmY6ZjI6NzM6OTU6NTg6MGM6ZGIw\nWQYDVR0RBFIwUIZOc3BpZmZlOi8vMTExMTExMTEtMjIyMi0zMzMzLTQ0NDQtNTU1\nNTU1NTU1NTU1LmNvbnN1bC9ucy9kZWZhdWx0L2RjL2RjMS9zdmMvd2ViMAoGCCqG\nSM49BAMCA0gAMEUCIGC3TTvvjj76KMrguVyFf4tjOqaSCRie3nmHMRNNRav7AiEA\npY0heYeK9A6iOLrzqxSerkXXQyj5e9bE4VgUnxgPU6g=\n-----END CERTIFICATE-----\n" + "certificateChain": { + "inlineString": "-----BEGIN CERTIFICATE-----\nMIICjDCCAjKgAwIBAgIIC5llxGV1gB8wCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowDjEMMAoG\nA1UEAxMDd2ViMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEADPv1RHVNRfa2VKR\nAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Favq5E0ivpNtv1QnFhxtPd7d5k4e+T7\nSkW1TaOCAXIwggFuMA4GA1UdDwEB/wQEAwIDuDAdBgNVHSUEFjAUBggrBgEFBQcD\nAgYIKwYBBQUHAwEwDAYDVR0TAQH/BAIwADBoBgNVHQ4EYQRfN2Q6MDc6ODc6M2E6\nNDA6MTk6NDc6YzM6NWE6YzA6YmE6NjI6ZGY6YWY6NGI6ZDQ6MDU6MjU6NzY6M2Q6\nNWE6OGQ6MTY6OGQ6Njc6NWU6MmU6YTA6MzQ6N2Q6ZGM6ZmYwagYDVR0jBGMwYYBf\nZDE6MTE6MTE6YWM6MmE6YmE6OTc6YjI6M2Y6YWM6N2I6YmQ6ZGE6YmU6YjE6OGE6\nZmM6OWE6YmE6YjU6YmM6ODM6ZTc6NWU6NDE6NmY6ZjI6NzM6OTU6NTg6MGM6ZGIw\nWQYDVR0RBFIwUIZOc3BpZmZlOi8vMTExMTExMTEtMjIyMi0zMzMzLTQ0NDQtNTU1\nNTU1NTU1NTU1LmNvbnN1bC9ucy9kZWZhdWx0L2RjL2RjMS9zdmMvd2ViMAoGCCqG\nSM49BAMCA0gAMEUCIGC3TTvvjj76KMrguVyFf4tjOqaSCRie3nmHMRNNRav7AiEA\npY0heYeK9A6iOLrzqxSerkXXQyj5e9bE4VgUnxgPU6g=\n-----END CERTIFICATE-----\n" }, - "privateKey": { - "inlineString": "-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEIMoTkpRggp3fqZzFKh82yS4LjtJI+XY+qX/7DefHFrtdoAoGCCqGSM49\nAwEHoUQDQgAEADPv1RHVNRfa2VKRAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Fav\nq5E0ivpNtv1QnFhxtPd7d5k4e+T7SkW1TQ==\n-----END EC PRIVATE KEY-----\n" + "privateKey": { + "inlineString": "-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEIMoTkpRggp3fqZzFKh82yS4LjtJI+XY+qX/7DefHFrtdoAoGCCqGSM49\nAwEHoUQDQgAEADPv1RHVNRfa2VKRAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Fav\nq5E0ivpNtv1QnFhxtPd7d5k4e+T7SkW1TQ==\n-----END EC PRIVATE KEY-----\n" } } ], - "validationContext": { - "trustedCa": { - "inlineString": "-----BEGIN CERTIFICATE-----\nMIICXDCCAgKgAwIBAgIICpZq70Z9LyUwCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowFDESMBAG\nA1UEAxMJVGVzdCBDQSAyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEIhywH1gx\nAsMwuF3ukAI5YL2jFxH6Usnma1HFSfVyxbXX1/uoZEYrj8yCAtdU2yoHETyd+Zx2\nThhRLP79pYegCaOCATwwggE4MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTAD\nAQH/MGgGA1UdDgRhBF9kMToxMToxMTphYzoyYTpiYTo5NzpiMjozZjphYzo3Yjpi\nZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1ZTo0MTo2ZjpmMjo3\nMzo5NTo1ODowYzpkYjBqBgNVHSMEYzBhgF9kMToxMToxMTphYzoyYTpiYTo5Nzpi\nMjozZjphYzo3YjpiZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1\nZTo0MTo2ZjpmMjo3Mzo5NTo1ODowYzpkYjA/BgNVHREEODA2hjRzcGlmZmU6Ly8x\nMTExMTExMS0yMjIyLTMzMzMtNDQ0NC01NTU1NTU1NTU1NTUuY29uc3VsMAoGCCqG\nSM49BAMCA0gAMEUCICOY0i246rQHJt8o8Oya0D5PLL1FnmsQmQqIGCi31RwnAiEA\noR5f6Ku+cig2Il8T8LJujOp2/2A72QcHZA57B13y+8o=\n-----END CERTIFICATE-----\n" + "validationContext": { + "trustedCa": { + "inlineString": "-----BEGIN CERTIFICATE-----\nMIICXDCCAgKgAwIBAgIICpZq70Z9LyUwCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowFDESMBAG\nA1UEAxMJVGVzdCBDQSAyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEIhywH1gx\nAsMwuF3ukAI5YL2jFxH6Usnma1HFSfVyxbXX1/uoZEYrj8yCAtdU2yoHETyd+Zx2\nThhRLP79pYegCaOCATwwggE4MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTAD\nAQH/MGgGA1UdDgRhBF9kMToxMToxMTphYzoyYTpiYTo5NzpiMjozZjphYzo3Yjpi\nZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1ZTo0MTo2ZjpmMjo3\nMzo5NTo1ODowYzpkYjBqBgNVHSMEYzBhgF9kMToxMToxMTphYzoyYTpiYTo5Nzpi\nMjozZjphYzo3YjpiZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1\nZTo0MTo2ZjpmMjo3Mzo5NTo1ODowYzpkYjA/BgNVHREEODA2hjRzcGlmZmU6Ly8x\nMTExMTExMS0yMjIyLTMzMzMtNDQ0NC01NTU1NTU1NTU1NTUuY29uc3VsMAoGCCqG\nSM49BAMCA0gAMEUCICOY0i246rQHJt8o8Oya0D5PLL1FnmsQmQqIGCi31RwnAiEA\noR5f6Ku+cig2Il8T8LJujOp2/2A72QcHZA57B13y+8o=\n-----END CERTIFICATE-----\n" }, - "matchSubjectAltNames": [ + "matchSubjectAltNames": [ { - "exact": "spiffe://11111111-2222-3333-4444-555555555555.consul/ns/default/dc/dc2/svc/db" + "exact": "spiffe://11111111-2222-3333-4444-555555555555.consul/ns/default/dc/dc2/svc/db" } ] } }, - "sni": "db.default.dc2.internal.11111111-2222-3333-4444-555555555555.consul" + "sni": "db.default.dc2.internal.11111111-2222-3333-4444-555555555555.consul" } } }, { - "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", - "name": "geo-cache.default.dc1.query.11111111-2222-3333-4444-555555555555.consul", - "type": "EDS", - "edsClusterConfig": { - "edsConfig": { - "ads": { - - }, - "resourceApiVersion": "V3" + "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", + "name": "geo-cache.default.dc1.query.11111111-2222-3333-4444-555555555555.consul", + "type": "EDS", + "edsClusterConfig": { + "edsConfig": { + "ads": {}, + "resourceApiVersion": "V3" } }, - "connectTimeout": "5s", - "circuitBreakers": { - - }, - "outlierDetection": { - - }, - "transportSocket": { - "name": "tls", - "typedConfig": { - "@type": "type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext", - "commonTlsContext": { - "tlsParams": { - - }, - "tlsCertificates": [ + "connectTimeout": "5s", + "circuitBreakers": {}, + "outlierDetection": {}, + "transportSocket": { + "name": "tls", + "typedConfig": { + "@type": "type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext", + "commonTlsContext": { + "tlsParams": {}, + "tlsCertificates": [ { - "certificateChain": { - "inlineString": "-----BEGIN CERTIFICATE-----\nMIICjDCCAjKgAwIBAgIIC5llxGV1gB8wCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowDjEMMAoG\nA1UEAxMDd2ViMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEADPv1RHVNRfa2VKR\nAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Favq5E0ivpNtv1QnFhxtPd7d5k4e+T7\nSkW1TaOCAXIwggFuMA4GA1UdDwEB/wQEAwIDuDAdBgNVHSUEFjAUBggrBgEFBQcD\nAgYIKwYBBQUHAwEwDAYDVR0TAQH/BAIwADBoBgNVHQ4EYQRfN2Q6MDc6ODc6M2E6\nNDA6MTk6NDc6YzM6NWE6YzA6YmE6NjI6ZGY6YWY6NGI6ZDQ6MDU6MjU6NzY6M2Q6\nNWE6OGQ6MTY6OGQ6Njc6NWU6MmU6YTA6MzQ6N2Q6ZGM6ZmYwagYDVR0jBGMwYYBf\nZDE6MTE6MTE6YWM6MmE6YmE6OTc6YjI6M2Y6YWM6N2I6YmQ6ZGE6YmU6YjE6OGE6\nZmM6OWE6YmE6YjU6YmM6ODM6ZTc6NWU6NDE6NmY6ZjI6NzM6OTU6NTg6MGM6ZGIw\nWQYDVR0RBFIwUIZOc3BpZmZlOi8vMTExMTExMTEtMjIyMi0zMzMzLTQ0NDQtNTU1\nNTU1NTU1NTU1LmNvbnN1bC9ucy9kZWZhdWx0L2RjL2RjMS9zdmMvd2ViMAoGCCqG\nSM49BAMCA0gAMEUCIGC3TTvvjj76KMrguVyFf4tjOqaSCRie3nmHMRNNRav7AiEA\npY0heYeK9A6iOLrzqxSerkXXQyj5e9bE4VgUnxgPU6g=\n-----END CERTIFICATE-----\n" + "certificateChain": { + "inlineString": "-----BEGIN CERTIFICATE-----\nMIICjDCCAjKgAwIBAgIIC5llxGV1gB8wCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowDjEMMAoG\nA1UEAxMDd2ViMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEADPv1RHVNRfa2VKR\nAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Favq5E0ivpNtv1QnFhxtPd7d5k4e+T7\nSkW1TaOCAXIwggFuMA4GA1UdDwEB/wQEAwIDuDAdBgNVHSUEFjAUBggrBgEFBQcD\nAgYIKwYBBQUHAwEwDAYDVR0TAQH/BAIwADBoBgNVHQ4EYQRfN2Q6MDc6ODc6M2E6\nNDA6MTk6NDc6YzM6NWE6YzA6YmE6NjI6ZGY6YWY6NGI6ZDQ6MDU6MjU6NzY6M2Q6\nNWE6OGQ6MTY6OGQ6Njc6NWU6MmU6YTA6MzQ6N2Q6ZGM6ZmYwagYDVR0jBGMwYYBf\nZDE6MTE6MTE6YWM6MmE6YmE6OTc6YjI6M2Y6YWM6N2I6YmQ6ZGE6YmU6YjE6OGE6\nZmM6OWE6YmE6YjU6YmM6ODM6ZTc6NWU6NDE6NmY6ZjI6NzM6OTU6NTg6MGM6ZGIw\nWQYDVR0RBFIwUIZOc3BpZmZlOi8vMTExMTExMTEtMjIyMi0zMzMzLTQ0NDQtNTU1\nNTU1NTU1NTU1LmNvbnN1bC9ucy9kZWZhdWx0L2RjL2RjMS9zdmMvd2ViMAoGCCqG\nSM49BAMCA0gAMEUCIGC3TTvvjj76KMrguVyFf4tjOqaSCRie3nmHMRNNRav7AiEA\npY0heYeK9A6iOLrzqxSerkXXQyj5e9bE4VgUnxgPU6g=\n-----END CERTIFICATE-----\n" }, - "privateKey": { - "inlineString": "-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEIMoTkpRggp3fqZzFKh82yS4LjtJI+XY+qX/7DefHFrtdoAoGCCqGSM49\nAwEHoUQDQgAEADPv1RHVNRfa2VKRAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Fav\nq5E0ivpNtv1QnFhxtPd7d5k4e+T7SkW1TQ==\n-----END EC PRIVATE KEY-----\n" + "privateKey": { + "inlineString": "-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEIMoTkpRggp3fqZzFKh82yS4LjtJI+XY+qX/7DefHFrtdoAoGCCqGSM49\nAwEHoUQDQgAEADPv1RHVNRfa2VKRAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Fav\nq5E0ivpNtv1QnFhxtPd7d5k4e+T7SkW1TQ==\n-----END EC PRIVATE KEY-----\n" } } ], - "validationContext": { - "trustedCa": { - "inlineString": "-----BEGIN CERTIFICATE-----\nMIICXDCCAgKgAwIBAgIICpZq70Z9LyUwCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowFDESMBAG\nA1UEAxMJVGVzdCBDQSAyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEIhywH1gx\nAsMwuF3ukAI5YL2jFxH6Usnma1HFSfVyxbXX1/uoZEYrj8yCAtdU2yoHETyd+Zx2\nThhRLP79pYegCaOCATwwggE4MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTAD\nAQH/MGgGA1UdDgRhBF9kMToxMToxMTphYzoyYTpiYTo5NzpiMjozZjphYzo3Yjpi\nZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1ZTo0MTo2ZjpmMjo3\nMzo5NTo1ODowYzpkYjBqBgNVHSMEYzBhgF9kMToxMToxMTphYzoyYTpiYTo5Nzpi\nMjozZjphYzo3YjpiZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1\nZTo0MTo2ZjpmMjo3Mzo5NTo1ODowYzpkYjA/BgNVHREEODA2hjRzcGlmZmU6Ly8x\nMTExMTExMS0yMjIyLTMzMzMtNDQ0NC01NTU1NTU1NTU1NTUuY29uc3VsMAoGCCqG\nSM49BAMCA0gAMEUCICOY0i246rQHJt8o8Oya0D5PLL1FnmsQmQqIGCi31RwnAiEA\noR5f6Ku+cig2Il8T8LJujOp2/2A72QcHZA57B13y+8o=\n-----END CERTIFICATE-----\n" + "validationContext": { + "trustedCa": { + "inlineString": "-----BEGIN CERTIFICATE-----\nMIICXDCCAgKgAwIBAgIICpZq70Z9LyUwCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowFDESMBAG\nA1UEAxMJVGVzdCBDQSAyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEIhywH1gx\nAsMwuF3ukAI5YL2jFxH6Usnma1HFSfVyxbXX1/uoZEYrj8yCAtdU2yoHETyd+Zx2\nThhRLP79pYegCaOCATwwggE4MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTAD\nAQH/MGgGA1UdDgRhBF9kMToxMToxMTphYzoyYTpiYTo5NzpiMjozZjphYzo3Yjpi\nZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1ZTo0MTo2ZjpmMjo3\nMzo5NTo1ODowYzpkYjBqBgNVHSMEYzBhgF9kMToxMToxMTphYzoyYTpiYTo5Nzpi\nMjozZjphYzo3YjpiZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1\nZTo0MTo2ZjpmMjo3Mzo5NTo1ODowYzpkYjA/BgNVHREEODA2hjRzcGlmZmU6Ly8x\nMTExMTExMS0yMjIyLTMzMzMtNDQ0NC01NTU1NTU1NTU1NTUuY29uc3VsMAoGCCqG\nSM49BAMCA0gAMEUCICOY0i246rQHJt8o8Oya0D5PLL1FnmsQmQqIGCi31RwnAiEA\noR5f6Ku+cig2Il8T8LJujOp2/2A72QcHZA57B13y+8o=\n-----END CERTIFICATE-----\n" }, - "matchSubjectAltNames": [ + "matchSubjectAltNames": [ { - "exact": "spiffe://11111111-2222-3333-4444-555555555555.consul/ns/default/dc/dc1/svc/geo-cache-target" + "exact": "spiffe://11111111-2222-3333-4444-555555555555.consul/ns/default/dc/dc1/svc/geo-cache-target" }, { - "exact": "spiffe://11111111-2222-3333-4444-555555555555.consul/ns/default/dc/dc2/svc/geo-cache-target" + "exact": "spiffe://11111111-2222-3333-4444-555555555555.consul/ns/default/dc/dc2/svc/geo-cache-target" } ] } }, - "sni": "geo-cache.default.dc1.query.11111111-2222-3333-4444-555555555555.consul" + "sni": "geo-cache.default.dc1.query.11111111-2222-3333-4444-555555555555.consul" } } }, { - "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", - "name": "local_app", - "type": "STATIC", - "connectTimeout": "5s", - "loadAssignment": { - "clusterName": "local_app", - "endpoints": [ + "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", + "name": "local_app", + "type": "STATIC", + "connectTimeout": "5s", + "loadAssignment": { + "clusterName": "local_app", + "endpoints": [ { - "lbEndpoints": [ + "lbEndpoints": [ { - "endpoint": { - "address": { - "socketAddress": { - "address": "127.0.0.1", - "portValue": 8080 + "endpoint": { + "address": { + "socketAddress": { + "address": "127.0.0.1", + "portValue": 8080 } } } @@ -215,6 +187,6 @@ } } ], - "typeUrl": "type.googleapis.com/envoy.config.cluster.v3.Cluster", - "nonce": "00000001" + "typeUrl": "type.googleapis.com/envoy.config.cluster.v3.Cluster", + "nonce": "00000001" } \ No newline at end of file diff --git a/agent/xds/testdata/clusters/connect-proxy-with-tcp-chain-failover-through-remote-gateway.latest.golden b/agent/xds/testdata/clusters/connect-proxy-with-tcp-chain-failover-through-remote-gateway.latest.golden index 8a032b32112..e6d7abfe32d 100644 --- a/agent/xds/testdata/clusters/connect-proxy-with-tcp-chain-failover-through-remote-gateway.latest.golden +++ b/agent/xds/testdata/clusters/connect-proxy-with-tcp-chain-failover-through-remote-gateway.latest.golden @@ -1,210 +1,182 @@ { - "versionInfo": "00000001", - "resources": [ + "versionInfo": "00000001", + "resources": [ { - "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", - "name": "db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", - "altStatName": "db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", - "clusterType": { - "name": "envoy.clusters.aggregate", - "typedConfig": { - "@type": "type.googleapis.com/envoy.extensions.clusters.aggregate.v3.ClusterConfig", - "clusters": [ - "failover-target~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", - "failover-target~db.default.dc2.internal.11111111-2222-3333-4444-555555555555.consul" + "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", + "name": "db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "altStatName": "db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "clusterType": { + "name": "envoy.clusters.aggregate", + "typedConfig": { + "@type": "type.googleapis.com/envoy.extensions.clusters.aggregate.v3.ClusterConfig", + "clusters": [ + "failover-target~0~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "failover-target~1~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul" ] } }, - "connectTimeout": "33s", - "lbPolicy": "CLUSTER_PROVIDED" + "connectTimeout": "33s", + "lbPolicy": "CLUSTER_PROVIDED" }, { - "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", - "name": "failover-target~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", - "altStatName": "failover-target~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", - "type": "EDS", - "edsClusterConfig": { - "edsConfig": { - "ads": { - - }, - "resourceApiVersion": "V3" + "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", + "name": "failover-target~0~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "altStatName": "failover-target~0~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "type": "EDS", + "edsClusterConfig": { + "edsConfig": { + "ads": {}, + "resourceApiVersion": "V3" } }, - "connectTimeout": "33s", - "circuitBreakers": { - - }, - "outlierDetection": { - - }, - "commonLbConfig": { - "healthyPanicThreshold": { - - } + "connectTimeout": "33s", + "circuitBreakers": {}, + "outlierDetection": {}, + "commonLbConfig": { + "healthyPanicThreshold": {} }, - "transportSocket": { - "name": "tls", - "typedConfig": { - "@type": "type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext", - "commonTlsContext": { - "tlsParams": { - - }, - "tlsCertificates": [ + "transportSocket": { + "name": "tls", + "typedConfig": { + "@type": "type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext", + "commonTlsContext": { + "tlsParams": {}, + "tlsCertificates": [ { - "certificateChain": { - "inlineString": "-----BEGIN CERTIFICATE-----\nMIICjDCCAjKgAwIBAgIIC5llxGV1gB8wCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowDjEMMAoG\nA1UEAxMDd2ViMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEADPv1RHVNRfa2VKR\nAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Favq5E0ivpNtv1QnFhxtPd7d5k4e+T7\nSkW1TaOCAXIwggFuMA4GA1UdDwEB/wQEAwIDuDAdBgNVHSUEFjAUBggrBgEFBQcD\nAgYIKwYBBQUHAwEwDAYDVR0TAQH/BAIwADBoBgNVHQ4EYQRfN2Q6MDc6ODc6M2E6\nNDA6MTk6NDc6YzM6NWE6YzA6YmE6NjI6ZGY6YWY6NGI6ZDQ6MDU6MjU6NzY6M2Q6\nNWE6OGQ6MTY6OGQ6Njc6NWU6MmU6YTA6MzQ6N2Q6ZGM6ZmYwagYDVR0jBGMwYYBf\nZDE6MTE6MTE6YWM6MmE6YmE6OTc6YjI6M2Y6YWM6N2I6YmQ6ZGE6YmU6YjE6OGE6\nZmM6OWE6YmE6YjU6YmM6ODM6ZTc6NWU6NDE6NmY6ZjI6NzM6OTU6NTg6MGM6ZGIw\nWQYDVR0RBFIwUIZOc3BpZmZlOi8vMTExMTExMTEtMjIyMi0zMzMzLTQ0NDQtNTU1\nNTU1NTU1NTU1LmNvbnN1bC9ucy9kZWZhdWx0L2RjL2RjMS9zdmMvd2ViMAoGCCqG\nSM49BAMCA0gAMEUCIGC3TTvvjj76KMrguVyFf4tjOqaSCRie3nmHMRNNRav7AiEA\npY0heYeK9A6iOLrzqxSerkXXQyj5e9bE4VgUnxgPU6g=\n-----END CERTIFICATE-----\n" + "certificateChain": { + "inlineString": "-----BEGIN CERTIFICATE-----\nMIICjDCCAjKgAwIBAgIIC5llxGV1gB8wCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowDjEMMAoG\nA1UEAxMDd2ViMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEADPv1RHVNRfa2VKR\nAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Favq5E0ivpNtv1QnFhxtPd7d5k4e+T7\nSkW1TaOCAXIwggFuMA4GA1UdDwEB/wQEAwIDuDAdBgNVHSUEFjAUBggrBgEFBQcD\nAgYIKwYBBQUHAwEwDAYDVR0TAQH/BAIwADBoBgNVHQ4EYQRfN2Q6MDc6ODc6M2E6\nNDA6MTk6NDc6YzM6NWE6YzA6YmE6NjI6ZGY6YWY6NGI6ZDQ6MDU6MjU6NzY6M2Q6\nNWE6OGQ6MTY6OGQ6Njc6NWU6MmU6YTA6MzQ6N2Q6ZGM6ZmYwagYDVR0jBGMwYYBf\nZDE6MTE6MTE6YWM6MmE6YmE6OTc6YjI6M2Y6YWM6N2I6YmQ6ZGE6YmU6YjE6OGE6\nZmM6OWE6YmE6YjU6YmM6ODM6ZTc6NWU6NDE6NmY6ZjI6NzM6OTU6NTg6MGM6ZGIw\nWQYDVR0RBFIwUIZOc3BpZmZlOi8vMTExMTExMTEtMjIyMi0zMzMzLTQ0NDQtNTU1\nNTU1NTU1NTU1LmNvbnN1bC9ucy9kZWZhdWx0L2RjL2RjMS9zdmMvd2ViMAoGCCqG\nSM49BAMCA0gAMEUCIGC3TTvvjj76KMrguVyFf4tjOqaSCRie3nmHMRNNRav7AiEA\npY0heYeK9A6iOLrzqxSerkXXQyj5e9bE4VgUnxgPU6g=\n-----END CERTIFICATE-----\n" }, - "privateKey": { - "inlineString": "-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEIMoTkpRggp3fqZzFKh82yS4LjtJI+XY+qX/7DefHFrtdoAoGCCqGSM49\nAwEHoUQDQgAEADPv1RHVNRfa2VKRAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Fav\nq5E0ivpNtv1QnFhxtPd7d5k4e+T7SkW1TQ==\n-----END EC PRIVATE KEY-----\n" + "privateKey": { + "inlineString": "-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEIMoTkpRggp3fqZzFKh82yS4LjtJI+XY+qX/7DefHFrtdoAoGCCqGSM49\nAwEHoUQDQgAEADPv1RHVNRfa2VKRAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Fav\nq5E0ivpNtv1QnFhxtPd7d5k4e+T7SkW1TQ==\n-----END EC PRIVATE KEY-----\n" } } ], - "validationContext": { - "trustedCa": { - "inlineString": "-----BEGIN CERTIFICATE-----\nMIICXDCCAgKgAwIBAgIICpZq70Z9LyUwCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowFDESMBAG\nA1UEAxMJVGVzdCBDQSAyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEIhywH1gx\nAsMwuF3ukAI5YL2jFxH6Usnma1HFSfVyxbXX1/uoZEYrj8yCAtdU2yoHETyd+Zx2\nThhRLP79pYegCaOCATwwggE4MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTAD\nAQH/MGgGA1UdDgRhBF9kMToxMToxMTphYzoyYTpiYTo5NzpiMjozZjphYzo3Yjpi\nZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1ZTo0MTo2ZjpmMjo3\nMzo5NTo1ODowYzpkYjBqBgNVHSMEYzBhgF9kMToxMToxMTphYzoyYTpiYTo5Nzpi\nMjozZjphYzo3YjpiZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1\nZTo0MTo2ZjpmMjo3Mzo5NTo1ODowYzpkYjA/BgNVHREEODA2hjRzcGlmZmU6Ly8x\nMTExMTExMS0yMjIyLTMzMzMtNDQ0NC01NTU1NTU1NTU1NTUuY29uc3VsMAoGCCqG\nSM49BAMCA0gAMEUCICOY0i246rQHJt8o8Oya0D5PLL1FnmsQmQqIGCi31RwnAiEA\noR5f6Ku+cig2Il8T8LJujOp2/2A72QcHZA57B13y+8o=\n-----END CERTIFICATE-----\n" + "validationContext": { + "trustedCa": { + "inlineString": "-----BEGIN CERTIFICATE-----\nMIICXDCCAgKgAwIBAgIICpZq70Z9LyUwCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowFDESMBAG\nA1UEAxMJVGVzdCBDQSAyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEIhywH1gx\nAsMwuF3ukAI5YL2jFxH6Usnma1HFSfVyxbXX1/uoZEYrj8yCAtdU2yoHETyd+Zx2\nThhRLP79pYegCaOCATwwggE4MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTAD\nAQH/MGgGA1UdDgRhBF9kMToxMToxMTphYzoyYTpiYTo5NzpiMjozZjphYzo3Yjpi\nZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1ZTo0MTo2ZjpmMjo3\nMzo5NTo1ODowYzpkYjBqBgNVHSMEYzBhgF9kMToxMToxMTphYzoyYTpiYTo5Nzpi\nMjozZjphYzo3YjpiZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1\nZTo0MTo2ZjpmMjo3Mzo5NTo1ODowYzpkYjA/BgNVHREEODA2hjRzcGlmZmU6Ly8x\nMTExMTExMS0yMjIyLTMzMzMtNDQ0NC01NTU1NTU1NTU1NTUuY29uc3VsMAoGCCqG\nSM49BAMCA0gAMEUCICOY0i246rQHJt8o8Oya0D5PLL1FnmsQmQqIGCi31RwnAiEA\noR5f6Ku+cig2Il8T8LJujOp2/2A72QcHZA57B13y+8o=\n-----END CERTIFICATE-----\n" }, - "matchSubjectAltNames": [ + "matchSubjectAltNames": [ { - "exact": "spiffe://11111111-2222-3333-4444-555555555555.consul/ns/default/dc/dc1/svc/db" + "exact": "spiffe://11111111-2222-3333-4444-555555555555.consul/ns/default/dc/dc1/svc/db" } ] } }, - "sni": "db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul" + "sni": "db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul" } } }, { - "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", - "name": "failover-target~db.default.dc2.internal.11111111-2222-3333-4444-555555555555.consul", - "altStatName": "failover-target~db.default.dc2.internal.11111111-2222-3333-4444-555555555555.consul", - "type": "EDS", - "edsClusterConfig": { - "edsConfig": { - "ads": { - - }, - "resourceApiVersion": "V3" + "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", + "name": "failover-target~1~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "altStatName": "failover-target~1~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "type": "EDS", + "edsClusterConfig": { + "edsConfig": { + "ads": {}, + "resourceApiVersion": "V3" } }, - "connectTimeout": "33s", - "circuitBreakers": { - - }, - "outlierDetection": { - + "connectTimeout": "33s", + "circuitBreakers": {}, + "outlierDetection": {}, + "commonLbConfig": { + "healthyPanicThreshold": {} }, - "commonLbConfig": { - "healthyPanicThreshold": { - - } - }, - "transportSocket": { - "name": "tls", - "typedConfig": { - "@type": "type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext", - "commonTlsContext": { - "tlsParams": { - - }, - "tlsCertificates": [ + "transportSocket": { + "name": "tls", + "typedConfig": { + "@type": "type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext", + "commonTlsContext": { + "tlsParams": {}, + "tlsCertificates": [ { - "certificateChain": { - "inlineString": "-----BEGIN CERTIFICATE-----\nMIICjDCCAjKgAwIBAgIIC5llxGV1gB8wCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowDjEMMAoG\nA1UEAxMDd2ViMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEADPv1RHVNRfa2VKR\nAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Favq5E0ivpNtv1QnFhxtPd7d5k4e+T7\nSkW1TaOCAXIwggFuMA4GA1UdDwEB/wQEAwIDuDAdBgNVHSUEFjAUBggrBgEFBQcD\nAgYIKwYBBQUHAwEwDAYDVR0TAQH/BAIwADBoBgNVHQ4EYQRfN2Q6MDc6ODc6M2E6\nNDA6MTk6NDc6YzM6NWE6YzA6YmE6NjI6ZGY6YWY6NGI6ZDQ6MDU6MjU6NzY6M2Q6\nNWE6OGQ6MTY6OGQ6Njc6NWU6MmU6YTA6MzQ6N2Q6ZGM6ZmYwagYDVR0jBGMwYYBf\nZDE6MTE6MTE6YWM6MmE6YmE6OTc6YjI6M2Y6YWM6N2I6YmQ6ZGE6YmU6YjE6OGE6\nZmM6OWE6YmE6YjU6YmM6ODM6ZTc6NWU6NDE6NmY6ZjI6NzM6OTU6NTg6MGM6ZGIw\nWQYDVR0RBFIwUIZOc3BpZmZlOi8vMTExMTExMTEtMjIyMi0zMzMzLTQ0NDQtNTU1\nNTU1NTU1NTU1LmNvbnN1bC9ucy9kZWZhdWx0L2RjL2RjMS9zdmMvd2ViMAoGCCqG\nSM49BAMCA0gAMEUCIGC3TTvvjj76KMrguVyFf4tjOqaSCRie3nmHMRNNRav7AiEA\npY0heYeK9A6iOLrzqxSerkXXQyj5e9bE4VgUnxgPU6g=\n-----END CERTIFICATE-----\n" + "certificateChain": { + "inlineString": "-----BEGIN CERTIFICATE-----\nMIICjDCCAjKgAwIBAgIIC5llxGV1gB8wCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowDjEMMAoG\nA1UEAxMDd2ViMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEADPv1RHVNRfa2VKR\nAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Favq5E0ivpNtv1QnFhxtPd7d5k4e+T7\nSkW1TaOCAXIwggFuMA4GA1UdDwEB/wQEAwIDuDAdBgNVHSUEFjAUBggrBgEFBQcD\nAgYIKwYBBQUHAwEwDAYDVR0TAQH/BAIwADBoBgNVHQ4EYQRfN2Q6MDc6ODc6M2E6\nNDA6MTk6NDc6YzM6NWE6YzA6YmE6NjI6ZGY6YWY6NGI6ZDQ6MDU6MjU6NzY6M2Q6\nNWE6OGQ6MTY6OGQ6Njc6NWU6MmU6YTA6MzQ6N2Q6ZGM6ZmYwagYDVR0jBGMwYYBf\nZDE6MTE6MTE6YWM6MmE6YmE6OTc6YjI6M2Y6YWM6N2I6YmQ6ZGE6YmU6YjE6OGE6\nZmM6OWE6YmE6YjU6YmM6ODM6ZTc6NWU6NDE6NmY6ZjI6NzM6OTU6NTg6MGM6ZGIw\nWQYDVR0RBFIwUIZOc3BpZmZlOi8vMTExMTExMTEtMjIyMi0zMzMzLTQ0NDQtNTU1\nNTU1NTU1NTU1LmNvbnN1bC9ucy9kZWZhdWx0L2RjL2RjMS9zdmMvd2ViMAoGCCqG\nSM49BAMCA0gAMEUCIGC3TTvvjj76KMrguVyFf4tjOqaSCRie3nmHMRNNRav7AiEA\npY0heYeK9A6iOLrzqxSerkXXQyj5e9bE4VgUnxgPU6g=\n-----END CERTIFICATE-----\n" }, - "privateKey": { - "inlineString": "-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEIMoTkpRggp3fqZzFKh82yS4LjtJI+XY+qX/7DefHFrtdoAoGCCqGSM49\nAwEHoUQDQgAEADPv1RHVNRfa2VKRAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Fav\nq5E0ivpNtv1QnFhxtPd7d5k4e+T7SkW1TQ==\n-----END EC PRIVATE KEY-----\n" + "privateKey": { + "inlineString": "-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEIMoTkpRggp3fqZzFKh82yS4LjtJI+XY+qX/7DefHFrtdoAoGCCqGSM49\nAwEHoUQDQgAEADPv1RHVNRfa2VKRAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Fav\nq5E0ivpNtv1QnFhxtPd7d5k4e+T7SkW1TQ==\n-----END EC PRIVATE KEY-----\n" } } ], - "validationContext": { - "trustedCa": { - "inlineString": "-----BEGIN CERTIFICATE-----\nMIICXDCCAgKgAwIBAgIICpZq70Z9LyUwCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowFDESMBAG\nA1UEAxMJVGVzdCBDQSAyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEIhywH1gx\nAsMwuF3ukAI5YL2jFxH6Usnma1HFSfVyxbXX1/uoZEYrj8yCAtdU2yoHETyd+Zx2\nThhRLP79pYegCaOCATwwggE4MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTAD\nAQH/MGgGA1UdDgRhBF9kMToxMToxMTphYzoyYTpiYTo5NzpiMjozZjphYzo3Yjpi\nZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1ZTo0MTo2ZjpmMjo3\nMzo5NTo1ODowYzpkYjBqBgNVHSMEYzBhgF9kMToxMToxMTphYzoyYTpiYTo5Nzpi\nMjozZjphYzo3YjpiZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1\nZTo0MTo2ZjpmMjo3Mzo5NTo1ODowYzpkYjA/BgNVHREEODA2hjRzcGlmZmU6Ly8x\nMTExMTExMS0yMjIyLTMzMzMtNDQ0NC01NTU1NTU1NTU1NTUuY29uc3VsMAoGCCqG\nSM49BAMCA0gAMEUCICOY0i246rQHJt8o8Oya0D5PLL1FnmsQmQqIGCi31RwnAiEA\noR5f6Ku+cig2Il8T8LJujOp2/2A72QcHZA57B13y+8o=\n-----END CERTIFICATE-----\n" + "validationContext": { + "trustedCa": { + "inlineString": "-----BEGIN CERTIFICATE-----\nMIICXDCCAgKgAwIBAgIICpZq70Z9LyUwCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowFDESMBAG\nA1UEAxMJVGVzdCBDQSAyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEIhywH1gx\nAsMwuF3ukAI5YL2jFxH6Usnma1HFSfVyxbXX1/uoZEYrj8yCAtdU2yoHETyd+Zx2\nThhRLP79pYegCaOCATwwggE4MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTAD\nAQH/MGgGA1UdDgRhBF9kMToxMToxMTphYzoyYTpiYTo5NzpiMjozZjphYzo3Yjpi\nZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1ZTo0MTo2ZjpmMjo3\nMzo5NTo1ODowYzpkYjBqBgNVHSMEYzBhgF9kMToxMToxMTphYzoyYTpiYTo5Nzpi\nMjozZjphYzo3YjpiZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1\nZTo0MTo2ZjpmMjo3Mzo5NTo1ODowYzpkYjA/BgNVHREEODA2hjRzcGlmZmU6Ly8x\nMTExMTExMS0yMjIyLTMzMzMtNDQ0NC01NTU1NTU1NTU1NTUuY29uc3VsMAoGCCqG\nSM49BAMCA0gAMEUCICOY0i246rQHJt8o8Oya0D5PLL1FnmsQmQqIGCi31RwnAiEA\noR5f6Ku+cig2Il8T8LJujOp2/2A72QcHZA57B13y+8o=\n-----END CERTIFICATE-----\n" }, - "matchSubjectAltNames": [ + "matchSubjectAltNames": [ { - "exact": "spiffe://11111111-2222-3333-4444-555555555555.consul/ns/default/dc/dc2/svc/db" + "exact": "spiffe://11111111-2222-3333-4444-555555555555.consul/ns/default/dc/dc2/svc/db" } ] } }, - "sni": "db.default.dc2.internal.11111111-2222-3333-4444-555555555555.consul" + "sni": "db.default.dc2.internal.11111111-2222-3333-4444-555555555555.consul" } } }, { - "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", - "name": "geo-cache.default.dc1.query.11111111-2222-3333-4444-555555555555.consul", - "type": "EDS", - "edsClusterConfig": { - "edsConfig": { - "ads": { - - }, - "resourceApiVersion": "V3" + "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", + "name": "geo-cache.default.dc1.query.11111111-2222-3333-4444-555555555555.consul", + "type": "EDS", + "edsClusterConfig": { + "edsConfig": { + "ads": {}, + "resourceApiVersion": "V3" } }, - "connectTimeout": "5s", - "circuitBreakers": { - - }, - "outlierDetection": { - - }, - "transportSocket": { - "name": "tls", - "typedConfig": { - "@type": "type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext", - "commonTlsContext": { - "tlsParams": { - - }, - "tlsCertificates": [ + "connectTimeout": "5s", + "circuitBreakers": {}, + "outlierDetection": {}, + "transportSocket": { + "name": "tls", + "typedConfig": { + "@type": "type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext", + "commonTlsContext": { + "tlsParams": {}, + "tlsCertificates": [ { - "certificateChain": { - "inlineString": "-----BEGIN CERTIFICATE-----\nMIICjDCCAjKgAwIBAgIIC5llxGV1gB8wCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowDjEMMAoG\nA1UEAxMDd2ViMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEADPv1RHVNRfa2VKR\nAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Favq5E0ivpNtv1QnFhxtPd7d5k4e+T7\nSkW1TaOCAXIwggFuMA4GA1UdDwEB/wQEAwIDuDAdBgNVHSUEFjAUBggrBgEFBQcD\nAgYIKwYBBQUHAwEwDAYDVR0TAQH/BAIwADBoBgNVHQ4EYQRfN2Q6MDc6ODc6M2E6\nNDA6MTk6NDc6YzM6NWE6YzA6YmE6NjI6ZGY6YWY6NGI6ZDQ6MDU6MjU6NzY6M2Q6\nNWE6OGQ6MTY6OGQ6Njc6NWU6MmU6YTA6MzQ6N2Q6ZGM6ZmYwagYDVR0jBGMwYYBf\nZDE6MTE6MTE6YWM6MmE6YmE6OTc6YjI6M2Y6YWM6N2I6YmQ6ZGE6YmU6YjE6OGE6\nZmM6OWE6YmE6YjU6YmM6ODM6ZTc6NWU6NDE6NmY6ZjI6NzM6OTU6NTg6MGM6ZGIw\nWQYDVR0RBFIwUIZOc3BpZmZlOi8vMTExMTExMTEtMjIyMi0zMzMzLTQ0NDQtNTU1\nNTU1NTU1NTU1LmNvbnN1bC9ucy9kZWZhdWx0L2RjL2RjMS9zdmMvd2ViMAoGCCqG\nSM49BAMCA0gAMEUCIGC3TTvvjj76KMrguVyFf4tjOqaSCRie3nmHMRNNRav7AiEA\npY0heYeK9A6iOLrzqxSerkXXQyj5e9bE4VgUnxgPU6g=\n-----END CERTIFICATE-----\n" + "certificateChain": { + "inlineString": "-----BEGIN CERTIFICATE-----\nMIICjDCCAjKgAwIBAgIIC5llxGV1gB8wCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowDjEMMAoG\nA1UEAxMDd2ViMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEADPv1RHVNRfa2VKR\nAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Favq5E0ivpNtv1QnFhxtPd7d5k4e+T7\nSkW1TaOCAXIwggFuMA4GA1UdDwEB/wQEAwIDuDAdBgNVHSUEFjAUBggrBgEFBQcD\nAgYIKwYBBQUHAwEwDAYDVR0TAQH/BAIwADBoBgNVHQ4EYQRfN2Q6MDc6ODc6M2E6\nNDA6MTk6NDc6YzM6NWE6YzA6YmE6NjI6ZGY6YWY6NGI6ZDQ6MDU6MjU6NzY6M2Q6\nNWE6OGQ6MTY6OGQ6Njc6NWU6MmU6YTA6MzQ6N2Q6ZGM6ZmYwagYDVR0jBGMwYYBf\nZDE6MTE6MTE6YWM6MmE6YmE6OTc6YjI6M2Y6YWM6N2I6YmQ6ZGE6YmU6YjE6OGE6\nZmM6OWE6YmE6YjU6YmM6ODM6ZTc6NWU6NDE6NmY6ZjI6NzM6OTU6NTg6MGM6ZGIw\nWQYDVR0RBFIwUIZOc3BpZmZlOi8vMTExMTExMTEtMjIyMi0zMzMzLTQ0NDQtNTU1\nNTU1NTU1NTU1LmNvbnN1bC9ucy9kZWZhdWx0L2RjL2RjMS9zdmMvd2ViMAoGCCqG\nSM49BAMCA0gAMEUCIGC3TTvvjj76KMrguVyFf4tjOqaSCRie3nmHMRNNRav7AiEA\npY0heYeK9A6iOLrzqxSerkXXQyj5e9bE4VgUnxgPU6g=\n-----END CERTIFICATE-----\n" }, - "privateKey": { - "inlineString": "-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEIMoTkpRggp3fqZzFKh82yS4LjtJI+XY+qX/7DefHFrtdoAoGCCqGSM49\nAwEHoUQDQgAEADPv1RHVNRfa2VKRAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Fav\nq5E0ivpNtv1QnFhxtPd7d5k4e+T7SkW1TQ==\n-----END EC PRIVATE KEY-----\n" + "privateKey": { + "inlineString": "-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEIMoTkpRggp3fqZzFKh82yS4LjtJI+XY+qX/7DefHFrtdoAoGCCqGSM49\nAwEHoUQDQgAEADPv1RHVNRfa2VKRAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Fav\nq5E0ivpNtv1QnFhxtPd7d5k4e+T7SkW1TQ==\n-----END EC PRIVATE KEY-----\n" } } ], - "validationContext": { - "trustedCa": { - "inlineString": "-----BEGIN CERTIFICATE-----\nMIICXDCCAgKgAwIBAgIICpZq70Z9LyUwCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowFDESMBAG\nA1UEAxMJVGVzdCBDQSAyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEIhywH1gx\nAsMwuF3ukAI5YL2jFxH6Usnma1HFSfVyxbXX1/uoZEYrj8yCAtdU2yoHETyd+Zx2\nThhRLP79pYegCaOCATwwggE4MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTAD\nAQH/MGgGA1UdDgRhBF9kMToxMToxMTphYzoyYTpiYTo5NzpiMjozZjphYzo3Yjpi\nZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1ZTo0MTo2ZjpmMjo3\nMzo5NTo1ODowYzpkYjBqBgNVHSMEYzBhgF9kMToxMToxMTphYzoyYTpiYTo5Nzpi\nMjozZjphYzo3YjpiZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1\nZTo0MTo2ZjpmMjo3Mzo5NTo1ODowYzpkYjA/BgNVHREEODA2hjRzcGlmZmU6Ly8x\nMTExMTExMS0yMjIyLTMzMzMtNDQ0NC01NTU1NTU1NTU1NTUuY29uc3VsMAoGCCqG\nSM49BAMCA0gAMEUCICOY0i246rQHJt8o8Oya0D5PLL1FnmsQmQqIGCi31RwnAiEA\noR5f6Ku+cig2Il8T8LJujOp2/2A72QcHZA57B13y+8o=\n-----END CERTIFICATE-----\n" + "validationContext": { + "trustedCa": { + "inlineString": "-----BEGIN CERTIFICATE-----\nMIICXDCCAgKgAwIBAgIICpZq70Z9LyUwCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowFDESMBAG\nA1UEAxMJVGVzdCBDQSAyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEIhywH1gx\nAsMwuF3ukAI5YL2jFxH6Usnma1HFSfVyxbXX1/uoZEYrj8yCAtdU2yoHETyd+Zx2\nThhRLP79pYegCaOCATwwggE4MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTAD\nAQH/MGgGA1UdDgRhBF9kMToxMToxMTphYzoyYTpiYTo5NzpiMjozZjphYzo3Yjpi\nZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1ZTo0MTo2ZjpmMjo3\nMzo5NTo1ODowYzpkYjBqBgNVHSMEYzBhgF9kMToxMToxMTphYzoyYTpiYTo5Nzpi\nMjozZjphYzo3YjpiZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1\nZTo0MTo2ZjpmMjo3Mzo5NTo1ODowYzpkYjA/BgNVHREEODA2hjRzcGlmZmU6Ly8x\nMTExMTExMS0yMjIyLTMzMzMtNDQ0NC01NTU1NTU1NTU1NTUuY29uc3VsMAoGCCqG\nSM49BAMCA0gAMEUCICOY0i246rQHJt8o8Oya0D5PLL1FnmsQmQqIGCi31RwnAiEA\noR5f6Ku+cig2Il8T8LJujOp2/2A72QcHZA57B13y+8o=\n-----END CERTIFICATE-----\n" }, - "matchSubjectAltNames": [ + "matchSubjectAltNames": [ { - "exact": "spiffe://11111111-2222-3333-4444-555555555555.consul/ns/default/dc/dc1/svc/geo-cache-target" + "exact": "spiffe://11111111-2222-3333-4444-555555555555.consul/ns/default/dc/dc1/svc/geo-cache-target" }, { - "exact": "spiffe://11111111-2222-3333-4444-555555555555.consul/ns/default/dc/dc2/svc/geo-cache-target" + "exact": "spiffe://11111111-2222-3333-4444-555555555555.consul/ns/default/dc/dc2/svc/geo-cache-target" } ] } }, - "sni": "geo-cache.default.dc1.query.11111111-2222-3333-4444-555555555555.consul" + "sni": "geo-cache.default.dc1.query.11111111-2222-3333-4444-555555555555.consul" } } }, { - "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", - "name": "local_app", - "type": "STATIC", - "connectTimeout": "5s", - "loadAssignment": { - "clusterName": "local_app", - "endpoints": [ + "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", + "name": "local_app", + "type": "STATIC", + "connectTimeout": "5s", + "loadAssignment": { + "clusterName": "local_app", + "endpoints": [ { - "lbEndpoints": [ + "lbEndpoints": [ { - "endpoint": { - "address": { - "socketAddress": { - "address": "127.0.0.1", - "portValue": 8080 + "endpoint": { + "address": { + "socketAddress": { + "address": "127.0.0.1", + "portValue": 8080 } } } @@ -215,6 +187,6 @@ } } ], - "typeUrl": "type.googleapis.com/envoy.config.cluster.v3.Cluster", - "nonce": "00000001" + "typeUrl": "type.googleapis.com/envoy.config.cluster.v3.Cluster", + "nonce": "00000001" } \ No newline at end of file diff --git a/agent/xds/testdata/clusters/ingress-with-chain-and-failover-to-cluster-peer.latest.golden b/agent/xds/testdata/clusters/ingress-with-chain-and-failover-to-cluster-peer.latest.golden index f0f79211fa8..f46b909b240 100644 --- a/agent/xds/testdata/clusters/ingress-with-chain-and-failover-to-cluster-peer.latest.golden +++ b/agent/xds/testdata/clusters/ingress-with-chain-and-failover-to-cluster-peer.latest.golden @@ -1,142 +1,121 @@ { - "versionInfo": "00000001", - "resources": [ + "versionInfo": "00000001", + "resources": [ { - "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", - "name": "db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", - "altStatName": "db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", - "clusterType": { - "name": "envoy.clusters.aggregate", - "typedConfig": { - "@type": "type.googleapis.com/envoy.extensions.clusters.aggregate.v3.ClusterConfig", - "clusters": [ - "failover-target~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", - "failover-target~db.default.cluster-01.external.peer1.domain" + "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", + "name": "db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "altStatName": "db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "clusterType": { + "name": "envoy.clusters.aggregate", + "typedConfig": { + "@type": "type.googleapis.com/envoy.extensions.clusters.aggregate.v3.ClusterConfig", + "clusters": [ + "failover-target~0~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "failover-target~1~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul" ] } }, - "connectTimeout": "33s", - "lbPolicy": "CLUSTER_PROVIDED", - "outlierDetection": { - - } + "connectTimeout": "33s", + "lbPolicy": "CLUSTER_PROVIDED", + "outlierDetection": {} }, { - "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", - "name": "failover-target~db.default.cluster-01.external.peer1.domain", - "type": "EDS", - "edsClusterConfig": { - "edsConfig": { - "ads": { - - }, - "resourceApiVersion": "V3" + "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", + "name": "failover-target~0~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "altStatName": "failover-target~0~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "type": "EDS", + "edsClusterConfig": { + "edsConfig": { + "ads": {}, + "resourceApiVersion": "V3" } }, - "connectTimeout": "33s", - "circuitBreakers": { - - }, - "outlierDetection": { - "maxEjectionPercent": 100 - }, - "commonLbConfig": { - "healthyPanicThreshold": { - - } + "connectTimeout": "33s", + "circuitBreakers": {}, + "outlierDetection": {}, + "commonLbConfig": { + "healthyPanicThreshold": {} }, - "transportSocket": { - "name": "tls", - "typedConfig": { - "@type": "type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext", - "commonTlsContext": { - "tlsParams": { - - }, - "tlsCertificates": [ + "transportSocket": { + "name": "tls", + "typedConfig": { + "@type": "type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext", + "commonTlsContext": { + "tlsParams": {}, + "tlsCertificates": [ { - "certificateChain": { - "inlineString": "-----BEGIN CERTIFICATE-----\nMIICjDCCAjKgAwIBAgIIC5llxGV1gB8wCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowDjEMMAoG\nA1UEAxMDd2ViMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEADPv1RHVNRfa2VKR\nAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Favq5E0ivpNtv1QnFhxtPd7d5k4e+T7\nSkW1TaOCAXIwggFuMA4GA1UdDwEB/wQEAwIDuDAdBgNVHSUEFjAUBggrBgEFBQcD\nAgYIKwYBBQUHAwEwDAYDVR0TAQH/BAIwADBoBgNVHQ4EYQRfN2Q6MDc6ODc6M2E6\nNDA6MTk6NDc6YzM6NWE6YzA6YmE6NjI6ZGY6YWY6NGI6ZDQ6MDU6MjU6NzY6M2Q6\nNWE6OGQ6MTY6OGQ6Njc6NWU6MmU6YTA6MzQ6N2Q6ZGM6ZmYwagYDVR0jBGMwYYBf\nZDE6MTE6MTE6YWM6MmE6YmE6OTc6YjI6M2Y6YWM6N2I6YmQ6ZGE6YmU6YjE6OGE6\nZmM6OWE6YmE6YjU6YmM6ODM6ZTc6NWU6NDE6NmY6ZjI6NzM6OTU6NTg6MGM6ZGIw\nWQYDVR0RBFIwUIZOc3BpZmZlOi8vMTExMTExMTEtMjIyMi0zMzMzLTQ0NDQtNTU1\nNTU1NTU1NTU1LmNvbnN1bC9ucy9kZWZhdWx0L2RjL2RjMS9zdmMvd2ViMAoGCCqG\nSM49BAMCA0gAMEUCIGC3TTvvjj76KMrguVyFf4tjOqaSCRie3nmHMRNNRav7AiEA\npY0heYeK9A6iOLrzqxSerkXXQyj5e9bE4VgUnxgPU6g=\n-----END CERTIFICATE-----\n" + "certificateChain": { + "inlineString": "-----BEGIN CERTIFICATE-----\nMIICjDCCAjKgAwIBAgIIC5llxGV1gB8wCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowDjEMMAoG\nA1UEAxMDd2ViMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEADPv1RHVNRfa2VKR\nAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Favq5E0ivpNtv1QnFhxtPd7d5k4e+T7\nSkW1TaOCAXIwggFuMA4GA1UdDwEB/wQEAwIDuDAdBgNVHSUEFjAUBggrBgEFBQcD\nAgYIKwYBBQUHAwEwDAYDVR0TAQH/BAIwADBoBgNVHQ4EYQRfN2Q6MDc6ODc6M2E6\nNDA6MTk6NDc6YzM6NWE6YzA6YmE6NjI6ZGY6YWY6NGI6ZDQ6MDU6MjU6NzY6M2Q6\nNWE6OGQ6MTY6OGQ6Njc6NWU6MmU6YTA6MzQ6N2Q6ZGM6ZmYwagYDVR0jBGMwYYBf\nZDE6MTE6MTE6YWM6MmE6YmE6OTc6YjI6M2Y6YWM6N2I6YmQ6ZGE6YmU6YjE6OGE6\nZmM6OWE6YmE6YjU6YmM6ODM6ZTc6NWU6NDE6NmY6ZjI6NzM6OTU6NTg6MGM6ZGIw\nWQYDVR0RBFIwUIZOc3BpZmZlOi8vMTExMTExMTEtMjIyMi0zMzMzLTQ0NDQtNTU1\nNTU1NTU1NTU1LmNvbnN1bC9ucy9kZWZhdWx0L2RjL2RjMS9zdmMvd2ViMAoGCCqG\nSM49BAMCA0gAMEUCIGC3TTvvjj76KMrguVyFf4tjOqaSCRie3nmHMRNNRav7AiEA\npY0heYeK9A6iOLrzqxSerkXXQyj5e9bE4VgUnxgPU6g=\n-----END CERTIFICATE-----\n" }, - "privateKey": { - "inlineString": "-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEIMoTkpRggp3fqZzFKh82yS4LjtJI+XY+qX/7DefHFrtdoAoGCCqGSM49\nAwEHoUQDQgAEADPv1RHVNRfa2VKRAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Fav\nq5E0ivpNtv1QnFhxtPd7d5k4e+T7SkW1TQ==\n-----END EC PRIVATE KEY-----\n" + "privateKey": { + "inlineString": "-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEIMoTkpRggp3fqZzFKh82yS4LjtJI+XY+qX/7DefHFrtdoAoGCCqGSM49\nAwEHoUQDQgAEADPv1RHVNRfa2VKRAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Fav\nq5E0ivpNtv1QnFhxtPd7d5k4e+T7SkW1TQ==\n-----END EC PRIVATE KEY-----\n" } } ], - "validationContext": { - "trustedCa": { - "inlineString": "peer1-root-1\n" + "validationContext": { + "trustedCa": { + "inlineString": "-----BEGIN CERTIFICATE-----\nMIICXDCCAgKgAwIBAgIICpZq70Z9LyUwCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowFDESMBAG\nA1UEAxMJVGVzdCBDQSAyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEIhywH1gx\nAsMwuF3ukAI5YL2jFxH6Usnma1HFSfVyxbXX1/uoZEYrj8yCAtdU2yoHETyd+Zx2\nThhRLP79pYegCaOCATwwggE4MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTAD\nAQH/MGgGA1UdDgRhBF9kMToxMToxMTphYzoyYTpiYTo5NzpiMjozZjphYzo3Yjpi\nZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1ZTo0MTo2ZjpmMjo3\nMzo5NTo1ODowYzpkYjBqBgNVHSMEYzBhgF9kMToxMToxMTphYzoyYTpiYTo5Nzpi\nMjozZjphYzo3YjpiZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1\nZTo0MTo2ZjpmMjo3Mzo5NTo1ODowYzpkYjA/BgNVHREEODA2hjRzcGlmZmU6Ly8x\nMTExMTExMS0yMjIyLTMzMzMtNDQ0NC01NTU1NTU1NTU1NTUuY29uc3VsMAoGCCqG\nSM49BAMCA0gAMEUCICOY0i246rQHJt8o8Oya0D5PLL1FnmsQmQqIGCi31RwnAiEA\noR5f6Ku+cig2Il8T8LJujOp2/2A72QcHZA57B13y+8o=\n-----END CERTIFICATE-----\n" }, - "matchSubjectAltNames": [ + "matchSubjectAltNames": [ { - "exact": "spiffe://1c053652-8512-4373-90cf-5a7f6263a994.consul/ns/default/dc/cluster-01-dc/svc/db" + "exact": "spiffe://11111111-2222-3333-4444-555555555555.consul/ns/default/dc/dc1/svc/db" } ] } }, - "sni": "db.default.default.cluster-01.external.1c053652-8512-4373-90cf-5a7f6263a994.consul" + "sni": "db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul" } } }, { - "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", - "name": "failover-target~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", - "altStatName": "failover-target~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", - "type": "EDS", - "edsClusterConfig": { - "edsConfig": { - "ads": { - - }, - "resourceApiVersion": "V3" + "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", + "name": "failover-target~1~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "altStatName": "failover-target~1~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "type": "EDS", + "edsClusterConfig": { + "edsConfig": { + "ads": {}, + "resourceApiVersion": "V3" } }, - "connectTimeout": "33s", - "circuitBreakers": { - - }, - "outlierDetection": { - - }, - "commonLbConfig": { - "healthyPanicThreshold": { - - } + "connectTimeout": "33s", + "circuitBreakers": {}, + "outlierDetection": {}, + "commonLbConfig": { + "healthyPanicThreshold": {} }, - "transportSocket": { - "name": "tls", - "typedConfig": { - "@type": "type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext", - "commonTlsContext": { - "tlsParams": { - - }, - "tlsCertificates": [ + "transportSocket": { + "name": "tls", + "typedConfig": { + "@type": "type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext", + "commonTlsContext": { + "tlsParams": {}, + "tlsCertificates": [ { - "certificateChain": { - "inlineString": "-----BEGIN CERTIFICATE-----\nMIICjDCCAjKgAwIBAgIIC5llxGV1gB8wCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowDjEMMAoG\nA1UEAxMDd2ViMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEADPv1RHVNRfa2VKR\nAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Favq5E0ivpNtv1QnFhxtPd7d5k4e+T7\nSkW1TaOCAXIwggFuMA4GA1UdDwEB/wQEAwIDuDAdBgNVHSUEFjAUBggrBgEFBQcD\nAgYIKwYBBQUHAwEwDAYDVR0TAQH/BAIwADBoBgNVHQ4EYQRfN2Q6MDc6ODc6M2E6\nNDA6MTk6NDc6YzM6NWE6YzA6YmE6NjI6ZGY6YWY6NGI6ZDQ6MDU6MjU6NzY6M2Q6\nNWE6OGQ6MTY6OGQ6Njc6NWU6MmU6YTA6MzQ6N2Q6ZGM6ZmYwagYDVR0jBGMwYYBf\nZDE6MTE6MTE6YWM6MmE6YmE6OTc6YjI6M2Y6YWM6N2I6YmQ6ZGE6YmU6YjE6OGE6\nZmM6OWE6YmE6YjU6YmM6ODM6ZTc6NWU6NDE6NmY6ZjI6NzM6OTU6NTg6MGM6ZGIw\nWQYDVR0RBFIwUIZOc3BpZmZlOi8vMTExMTExMTEtMjIyMi0zMzMzLTQ0NDQtNTU1\nNTU1NTU1NTU1LmNvbnN1bC9ucy9kZWZhdWx0L2RjL2RjMS9zdmMvd2ViMAoGCCqG\nSM49BAMCA0gAMEUCIGC3TTvvjj76KMrguVyFf4tjOqaSCRie3nmHMRNNRav7AiEA\npY0heYeK9A6iOLrzqxSerkXXQyj5e9bE4VgUnxgPU6g=\n-----END CERTIFICATE-----\n" + "certificateChain": { + "inlineString": "-----BEGIN CERTIFICATE-----\nMIICjDCCAjKgAwIBAgIIC5llxGV1gB8wCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowDjEMMAoG\nA1UEAxMDd2ViMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEADPv1RHVNRfa2VKR\nAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Favq5E0ivpNtv1QnFhxtPd7d5k4e+T7\nSkW1TaOCAXIwggFuMA4GA1UdDwEB/wQEAwIDuDAdBgNVHSUEFjAUBggrBgEFBQcD\nAgYIKwYBBQUHAwEwDAYDVR0TAQH/BAIwADBoBgNVHQ4EYQRfN2Q6MDc6ODc6M2E6\nNDA6MTk6NDc6YzM6NWE6YzA6YmE6NjI6ZGY6YWY6NGI6ZDQ6MDU6MjU6NzY6M2Q6\nNWE6OGQ6MTY6OGQ6Njc6NWU6MmU6YTA6MzQ6N2Q6ZGM6ZmYwagYDVR0jBGMwYYBf\nZDE6MTE6MTE6YWM6MmE6YmE6OTc6YjI6M2Y6YWM6N2I6YmQ6ZGE6YmU6YjE6OGE6\nZmM6OWE6YmE6YjU6YmM6ODM6ZTc6NWU6NDE6NmY6ZjI6NzM6OTU6NTg6MGM6ZGIw\nWQYDVR0RBFIwUIZOc3BpZmZlOi8vMTExMTExMTEtMjIyMi0zMzMzLTQ0NDQtNTU1\nNTU1NTU1NTU1LmNvbnN1bC9ucy9kZWZhdWx0L2RjL2RjMS9zdmMvd2ViMAoGCCqG\nSM49BAMCA0gAMEUCIGC3TTvvjj76KMrguVyFf4tjOqaSCRie3nmHMRNNRav7AiEA\npY0heYeK9A6iOLrzqxSerkXXQyj5e9bE4VgUnxgPU6g=\n-----END CERTIFICATE-----\n" }, - "privateKey": { - "inlineString": "-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEIMoTkpRggp3fqZzFKh82yS4LjtJI+XY+qX/7DefHFrtdoAoGCCqGSM49\nAwEHoUQDQgAEADPv1RHVNRfa2VKRAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Fav\nq5E0ivpNtv1QnFhxtPd7d5k4e+T7SkW1TQ==\n-----END EC PRIVATE KEY-----\n" + "privateKey": { + "inlineString": "-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEIMoTkpRggp3fqZzFKh82yS4LjtJI+XY+qX/7DefHFrtdoAoGCCqGSM49\nAwEHoUQDQgAEADPv1RHVNRfa2VKRAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Fav\nq5E0ivpNtv1QnFhxtPd7d5k4e+T7SkW1TQ==\n-----END EC PRIVATE KEY-----\n" } } ], - "validationContext": { - "trustedCa": { - "inlineString": "-----BEGIN CERTIFICATE-----\nMIICXDCCAgKgAwIBAgIICpZq70Z9LyUwCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowFDESMBAG\nA1UEAxMJVGVzdCBDQSAyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEIhywH1gx\nAsMwuF3ukAI5YL2jFxH6Usnma1HFSfVyxbXX1/uoZEYrj8yCAtdU2yoHETyd+Zx2\nThhRLP79pYegCaOCATwwggE4MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTAD\nAQH/MGgGA1UdDgRhBF9kMToxMToxMTphYzoyYTpiYTo5NzpiMjozZjphYzo3Yjpi\nZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1ZTo0MTo2ZjpmMjo3\nMzo5NTo1ODowYzpkYjBqBgNVHSMEYzBhgF9kMToxMToxMTphYzoyYTpiYTo5Nzpi\nMjozZjphYzo3YjpiZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1\nZTo0MTo2ZjpmMjo3Mzo5NTo1ODowYzpkYjA/BgNVHREEODA2hjRzcGlmZmU6Ly8x\nMTExMTExMS0yMjIyLTMzMzMtNDQ0NC01NTU1NTU1NTU1NTUuY29uc3VsMAoGCCqG\nSM49BAMCA0gAMEUCICOY0i246rQHJt8o8Oya0D5PLL1FnmsQmQqIGCi31RwnAiEA\noR5f6Ku+cig2Il8T8LJujOp2/2A72QcHZA57B13y+8o=\n-----END CERTIFICATE-----\n" + "validationContext": { + "trustedCa": { + "inlineString": "peer1-root-1\n" }, - "matchSubjectAltNames": [ + "matchSubjectAltNames": [ { - "exact": "spiffe://11111111-2222-3333-4444-555555555555.consul/ns/default/dc/dc1/svc/db" + "exact": "spiffe://1c053652-8512-4373-90cf-5a7f6263a994.consul/ns/default/dc/cluster-01-dc/svc/db" } ] } }, - "sni": "db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul" + "sni": "db.default.default.cluster-01.external.1c053652-8512-4373-90cf-5a7f6263a994.consul" } } } ], - "typeUrl": "type.googleapis.com/envoy.config.cluster.v3.Cluster", - "nonce": "00000001" + "typeUrl": "type.googleapis.com/envoy.config.cluster.v3.Cluster", + "nonce": "00000001" } \ No newline at end of file diff --git a/agent/xds/testdata/clusters/ingress-with-chain-and-failover.latest.golden b/agent/xds/testdata/clusters/ingress-with-chain-and-failover.latest.golden index b677b081cd6..44f5bdab676 100644 --- a/agent/xds/testdata/clusters/ingress-with-chain-and-failover.latest.golden +++ b/agent/xds/testdata/clusters/ingress-with-chain-and-failover.latest.golden @@ -1,143 +1,121 @@ { - "versionInfo": "00000001", - "resources": [ + "versionInfo": "00000001", + "resources": [ { - "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", - "name": "db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", - "altStatName": "db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", - "clusterType": { - "name": "envoy.clusters.aggregate", - "typedConfig": { - "@type": "type.googleapis.com/envoy.extensions.clusters.aggregate.v3.ClusterConfig", - "clusters": [ - "failover-target~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", - "failover-target~fail.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul" + "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", + "name": "db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "altStatName": "db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "clusterType": { + "name": "envoy.clusters.aggregate", + "typedConfig": { + "@type": "type.googleapis.com/envoy.extensions.clusters.aggregate.v3.ClusterConfig", + "clusters": [ + "failover-target~0~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "failover-target~1~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul" ] } }, - "connectTimeout": "33s", - "lbPolicy": "CLUSTER_PROVIDED", - "outlierDetection": { - - } + "connectTimeout": "33s", + "lbPolicy": "CLUSTER_PROVIDED", + "outlierDetection": {} }, { - "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", - "name": "failover-target~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", - "altStatName": "failover-target~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", - "type": "EDS", - "edsClusterConfig": { - "edsConfig": { - "ads": { - - }, - "resourceApiVersion": "V3" + "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", + "name": "failover-target~0~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "altStatName": "failover-target~0~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "type": "EDS", + "edsClusterConfig": { + "edsConfig": { + "ads": {}, + "resourceApiVersion": "V3" } }, - "connectTimeout": "33s", - "circuitBreakers": { - - }, - "outlierDetection": { - - }, - "commonLbConfig": { - "healthyPanicThreshold": { - - } + "connectTimeout": "33s", + "circuitBreakers": {}, + "outlierDetection": {}, + "commonLbConfig": { + "healthyPanicThreshold": {} }, - "transportSocket": { - "name": "tls", - "typedConfig": { - "@type": "type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext", - "commonTlsContext": { - "tlsParams": { - - }, - "tlsCertificates": [ + "transportSocket": { + "name": "tls", + "typedConfig": { + "@type": "type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext", + "commonTlsContext": { + "tlsParams": {}, + "tlsCertificates": [ { - "certificateChain": { - "inlineString": "-----BEGIN CERTIFICATE-----\nMIICjDCCAjKgAwIBAgIIC5llxGV1gB8wCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowDjEMMAoG\nA1UEAxMDd2ViMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEADPv1RHVNRfa2VKR\nAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Favq5E0ivpNtv1QnFhxtPd7d5k4e+T7\nSkW1TaOCAXIwggFuMA4GA1UdDwEB/wQEAwIDuDAdBgNVHSUEFjAUBggrBgEFBQcD\nAgYIKwYBBQUHAwEwDAYDVR0TAQH/BAIwADBoBgNVHQ4EYQRfN2Q6MDc6ODc6M2E6\nNDA6MTk6NDc6YzM6NWE6YzA6YmE6NjI6ZGY6YWY6NGI6ZDQ6MDU6MjU6NzY6M2Q6\nNWE6OGQ6MTY6OGQ6Njc6NWU6MmU6YTA6MzQ6N2Q6ZGM6ZmYwagYDVR0jBGMwYYBf\nZDE6MTE6MTE6YWM6MmE6YmE6OTc6YjI6M2Y6YWM6N2I6YmQ6ZGE6YmU6YjE6OGE6\nZmM6OWE6YmE6YjU6YmM6ODM6ZTc6NWU6NDE6NmY6ZjI6NzM6OTU6NTg6MGM6ZGIw\nWQYDVR0RBFIwUIZOc3BpZmZlOi8vMTExMTExMTEtMjIyMi0zMzMzLTQ0NDQtNTU1\nNTU1NTU1NTU1LmNvbnN1bC9ucy9kZWZhdWx0L2RjL2RjMS9zdmMvd2ViMAoGCCqG\nSM49BAMCA0gAMEUCIGC3TTvvjj76KMrguVyFf4tjOqaSCRie3nmHMRNNRav7AiEA\npY0heYeK9A6iOLrzqxSerkXXQyj5e9bE4VgUnxgPU6g=\n-----END CERTIFICATE-----\n" + "certificateChain": { + "inlineString": "-----BEGIN CERTIFICATE-----\nMIICjDCCAjKgAwIBAgIIC5llxGV1gB8wCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowDjEMMAoG\nA1UEAxMDd2ViMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEADPv1RHVNRfa2VKR\nAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Favq5E0ivpNtv1QnFhxtPd7d5k4e+T7\nSkW1TaOCAXIwggFuMA4GA1UdDwEB/wQEAwIDuDAdBgNVHSUEFjAUBggrBgEFBQcD\nAgYIKwYBBQUHAwEwDAYDVR0TAQH/BAIwADBoBgNVHQ4EYQRfN2Q6MDc6ODc6M2E6\nNDA6MTk6NDc6YzM6NWE6YzA6YmE6NjI6ZGY6YWY6NGI6ZDQ6MDU6MjU6NzY6M2Q6\nNWE6OGQ6MTY6OGQ6Njc6NWU6MmU6YTA6MzQ6N2Q6ZGM6ZmYwagYDVR0jBGMwYYBf\nZDE6MTE6MTE6YWM6MmE6YmE6OTc6YjI6M2Y6YWM6N2I6YmQ6ZGE6YmU6YjE6OGE6\nZmM6OWE6YmE6YjU6YmM6ODM6ZTc6NWU6NDE6NmY6ZjI6NzM6OTU6NTg6MGM6ZGIw\nWQYDVR0RBFIwUIZOc3BpZmZlOi8vMTExMTExMTEtMjIyMi0zMzMzLTQ0NDQtNTU1\nNTU1NTU1NTU1LmNvbnN1bC9ucy9kZWZhdWx0L2RjL2RjMS9zdmMvd2ViMAoGCCqG\nSM49BAMCA0gAMEUCIGC3TTvvjj76KMrguVyFf4tjOqaSCRie3nmHMRNNRav7AiEA\npY0heYeK9A6iOLrzqxSerkXXQyj5e9bE4VgUnxgPU6g=\n-----END CERTIFICATE-----\n" }, - "privateKey": { - "inlineString": "-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEIMoTkpRggp3fqZzFKh82yS4LjtJI+XY+qX/7DefHFrtdoAoGCCqGSM49\nAwEHoUQDQgAEADPv1RHVNRfa2VKRAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Fav\nq5E0ivpNtv1QnFhxtPd7d5k4e+T7SkW1TQ==\n-----END EC PRIVATE KEY-----\n" + "privateKey": { + "inlineString": "-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEIMoTkpRggp3fqZzFKh82yS4LjtJI+XY+qX/7DefHFrtdoAoGCCqGSM49\nAwEHoUQDQgAEADPv1RHVNRfa2VKRAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Fav\nq5E0ivpNtv1QnFhxtPd7d5k4e+T7SkW1TQ==\n-----END EC PRIVATE KEY-----\n" } } ], - "validationContext": { - "trustedCa": { - "inlineString": "-----BEGIN CERTIFICATE-----\nMIICXDCCAgKgAwIBAgIICpZq70Z9LyUwCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowFDESMBAG\nA1UEAxMJVGVzdCBDQSAyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEIhywH1gx\nAsMwuF3ukAI5YL2jFxH6Usnma1HFSfVyxbXX1/uoZEYrj8yCAtdU2yoHETyd+Zx2\nThhRLP79pYegCaOCATwwggE4MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTAD\nAQH/MGgGA1UdDgRhBF9kMToxMToxMTphYzoyYTpiYTo5NzpiMjozZjphYzo3Yjpi\nZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1ZTo0MTo2ZjpmMjo3\nMzo5NTo1ODowYzpkYjBqBgNVHSMEYzBhgF9kMToxMToxMTphYzoyYTpiYTo5Nzpi\nMjozZjphYzo3YjpiZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1\nZTo0MTo2ZjpmMjo3Mzo5NTo1ODowYzpkYjA/BgNVHREEODA2hjRzcGlmZmU6Ly8x\nMTExMTExMS0yMjIyLTMzMzMtNDQ0NC01NTU1NTU1NTU1NTUuY29uc3VsMAoGCCqG\nSM49BAMCA0gAMEUCICOY0i246rQHJt8o8Oya0D5PLL1FnmsQmQqIGCi31RwnAiEA\noR5f6Ku+cig2Il8T8LJujOp2/2A72QcHZA57B13y+8o=\n-----END CERTIFICATE-----\n" + "validationContext": { + "trustedCa": { + "inlineString": "-----BEGIN CERTIFICATE-----\nMIICXDCCAgKgAwIBAgIICpZq70Z9LyUwCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowFDESMBAG\nA1UEAxMJVGVzdCBDQSAyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEIhywH1gx\nAsMwuF3ukAI5YL2jFxH6Usnma1HFSfVyxbXX1/uoZEYrj8yCAtdU2yoHETyd+Zx2\nThhRLP79pYegCaOCATwwggE4MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTAD\nAQH/MGgGA1UdDgRhBF9kMToxMToxMTphYzoyYTpiYTo5NzpiMjozZjphYzo3Yjpi\nZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1ZTo0MTo2ZjpmMjo3\nMzo5NTo1ODowYzpkYjBqBgNVHSMEYzBhgF9kMToxMToxMTphYzoyYTpiYTo5Nzpi\nMjozZjphYzo3YjpiZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1\nZTo0MTo2ZjpmMjo3Mzo5NTo1ODowYzpkYjA/BgNVHREEODA2hjRzcGlmZmU6Ly8x\nMTExMTExMS0yMjIyLTMzMzMtNDQ0NC01NTU1NTU1NTU1NTUuY29uc3VsMAoGCCqG\nSM49BAMCA0gAMEUCICOY0i246rQHJt8o8Oya0D5PLL1FnmsQmQqIGCi31RwnAiEA\noR5f6Ku+cig2Il8T8LJujOp2/2A72QcHZA57B13y+8o=\n-----END CERTIFICATE-----\n" }, - "matchSubjectAltNames": [ + "matchSubjectAltNames": [ { - "exact": "spiffe://11111111-2222-3333-4444-555555555555.consul/ns/default/dc/dc1/svc/db" + "exact": "spiffe://11111111-2222-3333-4444-555555555555.consul/ns/default/dc/dc1/svc/db" } ] } }, - "sni": "db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul" + "sni": "db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul" } } }, { - "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", - "name": "failover-target~fail.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", - "altStatName": "failover-target~fail.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", - "type": "EDS", - "edsClusterConfig": { - "edsConfig": { - "ads": { - - }, - "resourceApiVersion": "V3" + "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", + "name": "failover-target~1~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "altStatName": "failover-target~1~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "type": "EDS", + "edsClusterConfig": { + "edsConfig": { + "ads": {}, + "resourceApiVersion": "V3" } }, - "connectTimeout": "33s", - "circuitBreakers": { - - }, - "outlierDetection": { - - }, - "commonLbConfig": { - "healthyPanicThreshold": { - - } + "connectTimeout": "33s", + "circuitBreakers": {}, + "outlierDetection": {}, + "commonLbConfig": { + "healthyPanicThreshold": {} }, - "transportSocket": { - "name": "tls", - "typedConfig": { - "@type": "type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext", - "commonTlsContext": { - "tlsParams": { - - }, - "tlsCertificates": [ + "transportSocket": { + "name": "tls", + "typedConfig": { + "@type": "type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext", + "commonTlsContext": { + "tlsParams": {}, + "tlsCertificates": [ { - "certificateChain": { - "inlineString": "-----BEGIN CERTIFICATE-----\nMIICjDCCAjKgAwIBAgIIC5llxGV1gB8wCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowDjEMMAoG\nA1UEAxMDd2ViMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEADPv1RHVNRfa2VKR\nAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Favq5E0ivpNtv1QnFhxtPd7d5k4e+T7\nSkW1TaOCAXIwggFuMA4GA1UdDwEB/wQEAwIDuDAdBgNVHSUEFjAUBggrBgEFBQcD\nAgYIKwYBBQUHAwEwDAYDVR0TAQH/BAIwADBoBgNVHQ4EYQRfN2Q6MDc6ODc6M2E6\nNDA6MTk6NDc6YzM6NWE6YzA6YmE6NjI6ZGY6YWY6NGI6ZDQ6MDU6MjU6NzY6M2Q6\nNWE6OGQ6MTY6OGQ6Njc6NWU6MmU6YTA6MzQ6N2Q6ZGM6ZmYwagYDVR0jBGMwYYBf\nZDE6MTE6MTE6YWM6MmE6YmE6OTc6YjI6M2Y6YWM6N2I6YmQ6ZGE6YmU6YjE6OGE6\nZmM6OWE6YmE6YjU6YmM6ODM6ZTc6NWU6NDE6NmY6ZjI6NzM6OTU6NTg6MGM6ZGIw\nWQYDVR0RBFIwUIZOc3BpZmZlOi8vMTExMTExMTEtMjIyMi0zMzMzLTQ0NDQtNTU1\nNTU1NTU1NTU1LmNvbnN1bC9ucy9kZWZhdWx0L2RjL2RjMS9zdmMvd2ViMAoGCCqG\nSM49BAMCA0gAMEUCIGC3TTvvjj76KMrguVyFf4tjOqaSCRie3nmHMRNNRav7AiEA\npY0heYeK9A6iOLrzqxSerkXXQyj5e9bE4VgUnxgPU6g=\n-----END CERTIFICATE-----\n" + "certificateChain": { + "inlineString": "-----BEGIN CERTIFICATE-----\nMIICjDCCAjKgAwIBAgIIC5llxGV1gB8wCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowDjEMMAoG\nA1UEAxMDd2ViMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEADPv1RHVNRfa2VKR\nAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Favq5E0ivpNtv1QnFhxtPd7d5k4e+T7\nSkW1TaOCAXIwggFuMA4GA1UdDwEB/wQEAwIDuDAdBgNVHSUEFjAUBggrBgEFBQcD\nAgYIKwYBBQUHAwEwDAYDVR0TAQH/BAIwADBoBgNVHQ4EYQRfN2Q6MDc6ODc6M2E6\nNDA6MTk6NDc6YzM6NWE6YzA6YmE6NjI6ZGY6YWY6NGI6ZDQ6MDU6MjU6NzY6M2Q6\nNWE6OGQ6MTY6OGQ6Njc6NWU6MmU6YTA6MzQ6N2Q6ZGM6ZmYwagYDVR0jBGMwYYBf\nZDE6MTE6MTE6YWM6MmE6YmE6OTc6YjI6M2Y6YWM6N2I6YmQ6ZGE6YmU6YjE6OGE6\nZmM6OWE6YmE6YjU6YmM6ODM6ZTc6NWU6NDE6NmY6ZjI6NzM6OTU6NTg6MGM6ZGIw\nWQYDVR0RBFIwUIZOc3BpZmZlOi8vMTExMTExMTEtMjIyMi0zMzMzLTQ0NDQtNTU1\nNTU1NTU1NTU1LmNvbnN1bC9ucy9kZWZhdWx0L2RjL2RjMS9zdmMvd2ViMAoGCCqG\nSM49BAMCA0gAMEUCIGC3TTvvjj76KMrguVyFf4tjOqaSCRie3nmHMRNNRav7AiEA\npY0heYeK9A6iOLrzqxSerkXXQyj5e9bE4VgUnxgPU6g=\n-----END CERTIFICATE-----\n" }, - "privateKey": { - "inlineString": "-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEIMoTkpRggp3fqZzFKh82yS4LjtJI+XY+qX/7DefHFrtdoAoGCCqGSM49\nAwEHoUQDQgAEADPv1RHVNRfa2VKRAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Fav\nq5E0ivpNtv1QnFhxtPd7d5k4e+T7SkW1TQ==\n-----END EC PRIVATE KEY-----\n" + "privateKey": { + "inlineString": "-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEIMoTkpRggp3fqZzFKh82yS4LjtJI+XY+qX/7DefHFrtdoAoGCCqGSM49\nAwEHoUQDQgAEADPv1RHVNRfa2VKRAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Fav\nq5E0ivpNtv1QnFhxtPd7d5k4e+T7SkW1TQ==\n-----END EC PRIVATE KEY-----\n" } } ], - "validationContext": { - "trustedCa": { - "inlineString": "-----BEGIN CERTIFICATE-----\nMIICXDCCAgKgAwIBAgIICpZq70Z9LyUwCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowFDESMBAG\nA1UEAxMJVGVzdCBDQSAyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEIhywH1gx\nAsMwuF3ukAI5YL2jFxH6Usnma1HFSfVyxbXX1/uoZEYrj8yCAtdU2yoHETyd+Zx2\nThhRLP79pYegCaOCATwwggE4MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTAD\nAQH/MGgGA1UdDgRhBF9kMToxMToxMTphYzoyYTpiYTo5NzpiMjozZjphYzo3Yjpi\nZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1ZTo0MTo2ZjpmMjo3\nMzo5NTo1ODowYzpkYjBqBgNVHSMEYzBhgF9kMToxMToxMTphYzoyYTpiYTo5Nzpi\nMjozZjphYzo3YjpiZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1\nZTo0MTo2ZjpmMjo3Mzo5NTo1ODowYzpkYjA/BgNVHREEODA2hjRzcGlmZmU6Ly8x\nMTExMTExMS0yMjIyLTMzMzMtNDQ0NC01NTU1NTU1NTU1NTUuY29uc3VsMAoGCCqG\nSM49BAMCA0gAMEUCICOY0i246rQHJt8o8Oya0D5PLL1FnmsQmQqIGCi31RwnAiEA\noR5f6Ku+cig2Il8T8LJujOp2/2A72QcHZA57B13y+8o=\n-----END CERTIFICATE-----\n" + "validationContext": { + "trustedCa": { + "inlineString": "-----BEGIN CERTIFICATE-----\nMIICXDCCAgKgAwIBAgIICpZq70Z9LyUwCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowFDESMBAG\nA1UEAxMJVGVzdCBDQSAyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEIhywH1gx\nAsMwuF3ukAI5YL2jFxH6Usnma1HFSfVyxbXX1/uoZEYrj8yCAtdU2yoHETyd+Zx2\nThhRLP79pYegCaOCATwwggE4MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTAD\nAQH/MGgGA1UdDgRhBF9kMToxMToxMTphYzoyYTpiYTo5NzpiMjozZjphYzo3Yjpi\nZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1ZTo0MTo2ZjpmMjo3\nMzo5NTo1ODowYzpkYjBqBgNVHSMEYzBhgF9kMToxMToxMTphYzoyYTpiYTo5Nzpi\nMjozZjphYzo3YjpiZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1\nZTo0MTo2ZjpmMjo3Mzo5NTo1ODowYzpkYjA/BgNVHREEODA2hjRzcGlmZmU6Ly8x\nMTExMTExMS0yMjIyLTMzMzMtNDQ0NC01NTU1NTU1NTU1NTUuY29uc3VsMAoGCCqG\nSM49BAMCA0gAMEUCICOY0i246rQHJt8o8Oya0D5PLL1FnmsQmQqIGCi31RwnAiEA\noR5f6Ku+cig2Il8T8LJujOp2/2A72QcHZA57B13y+8o=\n-----END CERTIFICATE-----\n" }, - "matchSubjectAltNames": [ + "matchSubjectAltNames": [ { - "exact": "spiffe://11111111-2222-3333-4444-555555555555.consul/ns/default/dc/dc1/svc/fail" + "exact": "spiffe://11111111-2222-3333-4444-555555555555.consul/ns/default/dc/dc1/svc/fail" } ] } }, - "sni": "fail.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul" + "sni": "fail.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul" } } } ], - "typeUrl": "type.googleapis.com/envoy.config.cluster.v3.Cluster", - "nonce": "00000001" + "typeUrl": "type.googleapis.com/envoy.config.cluster.v3.Cluster", + "nonce": "00000001" } \ No newline at end of file diff --git a/agent/xds/testdata/clusters/ingress-with-tcp-chain-double-failover-through-local-gateway-triggered.latest.golden b/agent/xds/testdata/clusters/ingress-with-tcp-chain-double-failover-through-local-gateway-triggered.latest.golden index 5c4efef3d72..316328604f5 100644 --- a/agent/xds/testdata/clusters/ingress-with-tcp-chain-double-failover-through-local-gateway-triggered.latest.golden +++ b/agent/xds/testdata/clusters/ingress-with-tcp-chain-double-failover-through-local-gateway-triggered.latest.golden @@ -1,202 +1,170 @@ { - "versionInfo": "00000001", - "resources": [ + "versionInfo": "00000001", + "resources": [ { - "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", - "name": "db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", - "altStatName": "db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", - "clusterType": { - "name": "envoy.clusters.aggregate", - "typedConfig": { - "@type": "type.googleapis.com/envoy.extensions.clusters.aggregate.v3.ClusterConfig", - "clusters": [ - "failover-target~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", - "failover-target~db.default.dc2.internal.11111111-2222-3333-4444-555555555555.consul", - "failover-target~db.default.dc3.internal.11111111-2222-3333-4444-555555555555.consul" + "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", + "name": "db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "altStatName": "db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "clusterType": { + "name": "envoy.clusters.aggregate", + "typedConfig": { + "@type": "type.googleapis.com/envoy.extensions.clusters.aggregate.v3.ClusterConfig", + "clusters": [ + "failover-target~0~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "failover-target~1~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "failover-target~2~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul" ] } }, - "connectTimeout": "33s", - "lbPolicy": "CLUSTER_PROVIDED", - "outlierDetection": { - - } + "connectTimeout": "33s", + "lbPolicy": "CLUSTER_PROVIDED", + "outlierDetection": {} }, { - "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", - "name": "failover-target~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", - "altStatName": "failover-target~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", - "type": "EDS", - "edsClusterConfig": { - "edsConfig": { - "ads": { - - }, - "resourceApiVersion": "V3" + "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", + "name": "failover-target~0~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "altStatName": "failover-target~0~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "type": "EDS", + "edsClusterConfig": { + "edsConfig": { + "ads": {}, + "resourceApiVersion": "V3" } }, - "connectTimeout": "33s", - "circuitBreakers": { - + "connectTimeout": "33s", + "circuitBreakers": {}, + "outlierDetection": {}, + "commonLbConfig": { + "healthyPanicThreshold": {} }, - "outlierDetection": { - - }, - "commonLbConfig": { - "healthyPanicThreshold": { - - } - }, - "transportSocket": { - "name": "tls", - "typedConfig": { - "@type": "type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext", - "commonTlsContext": { - "tlsParams": { - - }, - "tlsCertificates": [ + "transportSocket": { + "name": "tls", + "typedConfig": { + "@type": "type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext", + "commonTlsContext": { + "tlsParams": {}, + "tlsCertificates": [ { - "certificateChain": { - "inlineString": "-----BEGIN CERTIFICATE-----\nMIICjDCCAjKgAwIBAgIIC5llxGV1gB8wCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowDjEMMAoG\nA1UEAxMDd2ViMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEADPv1RHVNRfa2VKR\nAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Favq5E0ivpNtv1QnFhxtPd7d5k4e+T7\nSkW1TaOCAXIwggFuMA4GA1UdDwEB/wQEAwIDuDAdBgNVHSUEFjAUBggrBgEFBQcD\nAgYIKwYBBQUHAwEwDAYDVR0TAQH/BAIwADBoBgNVHQ4EYQRfN2Q6MDc6ODc6M2E6\nNDA6MTk6NDc6YzM6NWE6YzA6YmE6NjI6ZGY6YWY6NGI6ZDQ6MDU6MjU6NzY6M2Q6\nNWE6OGQ6MTY6OGQ6Njc6NWU6MmU6YTA6MzQ6N2Q6ZGM6ZmYwagYDVR0jBGMwYYBf\nZDE6MTE6MTE6YWM6MmE6YmE6OTc6YjI6M2Y6YWM6N2I6YmQ6ZGE6YmU6YjE6OGE6\nZmM6OWE6YmE6YjU6YmM6ODM6ZTc6NWU6NDE6NmY6ZjI6NzM6OTU6NTg6MGM6ZGIw\nWQYDVR0RBFIwUIZOc3BpZmZlOi8vMTExMTExMTEtMjIyMi0zMzMzLTQ0NDQtNTU1\nNTU1NTU1NTU1LmNvbnN1bC9ucy9kZWZhdWx0L2RjL2RjMS9zdmMvd2ViMAoGCCqG\nSM49BAMCA0gAMEUCIGC3TTvvjj76KMrguVyFf4tjOqaSCRie3nmHMRNNRav7AiEA\npY0heYeK9A6iOLrzqxSerkXXQyj5e9bE4VgUnxgPU6g=\n-----END CERTIFICATE-----\n" + "certificateChain": { + "inlineString": "-----BEGIN CERTIFICATE-----\nMIICjDCCAjKgAwIBAgIIC5llxGV1gB8wCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowDjEMMAoG\nA1UEAxMDd2ViMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEADPv1RHVNRfa2VKR\nAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Favq5E0ivpNtv1QnFhxtPd7d5k4e+T7\nSkW1TaOCAXIwggFuMA4GA1UdDwEB/wQEAwIDuDAdBgNVHSUEFjAUBggrBgEFBQcD\nAgYIKwYBBQUHAwEwDAYDVR0TAQH/BAIwADBoBgNVHQ4EYQRfN2Q6MDc6ODc6M2E6\nNDA6MTk6NDc6YzM6NWE6YzA6YmE6NjI6ZGY6YWY6NGI6ZDQ6MDU6MjU6NzY6M2Q6\nNWE6OGQ6MTY6OGQ6Njc6NWU6MmU6YTA6MzQ6N2Q6ZGM6ZmYwagYDVR0jBGMwYYBf\nZDE6MTE6MTE6YWM6MmE6YmE6OTc6YjI6M2Y6YWM6N2I6YmQ6ZGE6YmU6YjE6OGE6\nZmM6OWE6YmE6YjU6YmM6ODM6ZTc6NWU6NDE6NmY6ZjI6NzM6OTU6NTg6MGM6ZGIw\nWQYDVR0RBFIwUIZOc3BpZmZlOi8vMTExMTExMTEtMjIyMi0zMzMzLTQ0NDQtNTU1\nNTU1NTU1NTU1LmNvbnN1bC9ucy9kZWZhdWx0L2RjL2RjMS9zdmMvd2ViMAoGCCqG\nSM49BAMCA0gAMEUCIGC3TTvvjj76KMrguVyFf4tjOqaSCRie3nmHMRNNRav7AiEA\npY0heYeK9A6iOLrzqxSerkXXQyj5e9bE4VgUnxgPU6g=\n-----END CERTIFICATE-----\n" }, - "privateKey": { - "inlineString": "-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEIMoTkpRggp3fqZzFKh82yS4LjtJI+XY+qX/7DefHFrtdoAoGCCqGSM49\nAwEHoUQDQgAEADPv1RHVNRfa2VKRAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Fav\nq5E0ivpNtv1QnFhxtPd7d5k4e+T7SkW1TQ==\n-----END EC PRIVATE KEY-----\n" + "privateKey": { + "inlineString": "-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEIMoTkpRggp3fqZzFKh82yS4LjtJI+XY+qX/7DefHFrtdoAoGCCqGSM49\nAwEHoUQDQgAEADPv1RHVNRfa2VKRAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Fav\nq5E0ivpNtv1QnFhxtPd7d5k4e+T7SkW1TQ==\n-----END EC PRIVATE KEY-----\n" } } ], - "validationContext": { - "trustedCa": { - "inlineString": "-----BEGIN CERTIFICATE-----\nMIICXDCCAgKgAwIBAgIICpZq70Z9LyUwCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowFDESMBAG\nA1UEAxMJVGVzdCBDQSAyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEIhywH1gx\nAsMwuF3ukAI5YL2jFxH6Usnma1HFSfVyxbXX1/uoZEYrj8yCAtdU2yoHETyd+Zx2\nThhRLP79pYegCaOCATwwggE4MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTAD\nAQH/MGgGA1UdDgRhBF9kMToxMToxMTphYzoyYTpiYTo5NzpiMjozZjphYzo3Yjpi\nZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1ZTo0MTo2ZjpmMjo3\nMzo5NTo1ODowYzpkYjBqBgNVHSMEYzBhgF9kMToxMToxMTphYzoyYTpiYTo5Nzpi\nMjozZjphYzo3YjpiZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1\nZTo0MTo2ZjpmMjo3Mzo5NTo1ODowYzpkYjA/BgNVHREEODA2hjRzcGlmZmU6Ly8x\nMTExMTExMS0yMjIyLTMzMzMtNDQ0NC01NTU1NTU1NTU1NTUuY29uc3VsMAoGCCqG\nSM49BAMCA0gAMEUCICOY0i246rQHJt8o8Oya0D5PLL1FnmsQmQqIGCi31RwnAiEA\noR5f6Ku+cig2Il8T8LJujOp2/2A72QcHZA57B13y+8o=\n-----END CERTIFICATE-----\n" + "validationContext": { + "trustedCa": { + "inlineString": "-----BEGIN CERTIFICATE-----\nMIICXDCCAgKgAwIBAgIICpZq70Z9LyUwCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowFDESMBAG\nA1UEAxMJVGVzdCBDQSAyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEIhywH1gx\nAsMwuF3ukAI5YL2jFxH6Usnma1HFSfVyxbXX1/uoZEYrj8yCAtdU2yoHETyd+Zx2\nThhRLP79pYegCaOCATwwggE4MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTAD\nAQH/MGgGA1UdDgRhBF9kMToxMToxMTphYzoyYTpiYTo5NzpiMjozZjphYzo3Yjpi\nZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1ZTo0MTo2ZjpmMjo3\nMzo5NTo1ODowYzpkYjBqBgNVHSMEYzBhgF9kMToxMToxMTphYzoyYTpiYTo5Nzpi\nMjozZjphYzo3YjpiZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1\nZTo0MTo2ZjpmMjo3Mzo5NTo1ODowYzpkYjA/BgNVHREEODA2hjRzcGlmZmU6Ly8x\nMTExMTExMS0yMjIyLTMzMzMtNDQ0NC01NTU1NTU1NTU1NTUuY29uc3VsMAoGCCqG\nSM49BAMCA0gAMEUCICOY0i246rQHJt8o8Oya0D5PLL1FnmsQmQqIGCi31RwnAiEA\noR5f6Ku+cig2Il8T8LJujOp2/2A72QcHZA57B13y+8o=\n-----END CERTIFICATE-----\n" }, - "matchSubjectAltNames": [ + "matchSubjectAltNames": [ { - "exact": "spiffe://11111111-2222-3333-4444-555555555555.consul/ns/default/dc/dc1/svc/db" + "exact": "spiffe://11111111-2222-3333-4444-555555555555.consul/ns/default/dc/dc1/svc/db" } ] } }, - "sni": "db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul" + "sni": "db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul" } } }, { - "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", - "name": "failover-target~db.default.dc2.internal.11111111-2222-3333-4444-555555555555.consul", - "altStatName": "failover-target~db.default.dc2.internal.11111111-2222-3333-4444-555555555555.consul", - "type": "EDS", - "edsClusterConfig": { - "edsConfig": { - "ads": { - - }, - "resourceApiVersion": "V3" + "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", + "name": "failover-target~1~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "altStatName": "failover-target~1~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "type": "EDS", + "edsClusterConfig": { + "edsConfig": { + "ads": {}, + "resourceApiVersion": "V3" } }, - "connectTimeout": "33s", - "circuitBreakers": { - - }, - "outlierDetection": { - + "connectTimeout": "33s", + "circuitBreakers": {}, + "outlierDetection": {}, + "commonLbConfig": { + "healthyPanicThreshold": {} }, - "commonLbConfig": { - "healthyPanicThreshold": { - - } - }, - "transportSocket": { - "name": "tls", - "typedConfig": { - "@type": "type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext", - "commonTlsContext": { - "tlsParams": { - - }, - "tlsCertificates": [ + "transportSocket": { + "name": "tls", + "typedConfig": { + "@type": "type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext", + "commonTlsContext": { + "tlsParams": {}, + "tlsCertificates": [ { - "certificateChain": { - "inlineString": "-----BEGIN CERTIFICATE-----\nMIICjDCCAjKgAwIBAgIIC5llxGV1gB8wCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowDjEMMAoG\nA1UEAxMDd2ViMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEADPv1RHVNRfa2VKR\nAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Favq5E0ivpNtv1QnFhxtPd7d5k4e+T7\nSkW1TaOCAXIwggFuMA4GA1UdDwEB/wQEAwIDuDAdBgNVHSUEFjAUBggrBgEFBQcD\nAgYIKwYBBQUHAwEwDAYDVR0TAQH/BAIwADBoBgNVHQ4EYQRfN2Q6MDc6ODc6M2E6\nNDA6MTk6NDc6YzM6NWE6YzA6YmE6NjI6ZGY6YWY6NGI6ZDQ6MDU6MjU6NzY6M2Q6\nNWE6OGQ6MTY6OGQ6Njc6NWU6MmU6YTA6MzQ6N2Q6ZGM6ZmYwagYDVR0jBGMwYYBf\nZDE6MTE6MTE6YWM6MmE6YmE6OTc6YjI6M2Y6YWM6N2I6YmQ6ZGE6YmU6YjE6OGE6\nZmM6OWE6YmE6YjU6YmM6ODM6ZTc6NWU6NDE6NmY6ZjI6NzM6OTU6NTg6MGM6ZGIw\nWQYDVR0RBFIwUIZOc3BpZmZlOi8vMTExMTExMTEtMjIyMi0zMzMzLTQ0NDQtNTU1\nNTU1NTU1NTU1LmNvbnN1bC9ucy9kZWZhdWx0L2RjL2RjMS9zdmMvd2ViMAoGCCqG\nSM49BAMCA0gAMEUCIGC3TTvvjj76KMrguVyFf4tjOqaSCRie3nmHMRNNRav7AiEA\npY0heYeK9A6iOLrzqxSerkXXQyj5e9bE4VgUnxgPU6g=\n-----END CERTIFICATE-----\n" + "certificateChain": { + "inlineString": "-----BEGIN CERTIFICATE-----\nMIICjDCCAjKgAwIBAgIIC5llxGV1gB8wCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowDjEMMAoG\nA1UEAxMDd2ViMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEADPv1RHVNRfa2VKR\nAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Favq5E0ivpNtv1QnFhxtPd7d5k4e+T7\nSkW1TaOCAXIwggFuMA4GA1UdDwEB/wQEAwIDuDAdBgNVHSUEFjAUBggrBgEFBQcD\nAgYIKwYBBQUHAwEwDAYDVR0TAQH/BAIwADBoBgNVHQ4EYQRfN2Q6MDc6ODc6M2E6\nNDA6MTk6NDc6YzM6NWE6YzA6YmE6NjI6ZGY6YWY6NGI6ZDQ6MDU6MjU6NzY6M2Q6\nNWE6OGQ6MTY6OGQ6Njc6NWU6MmU6YTA6MzQ6N2Q6ZGM6ZmYwagYDVR0jBGMwYYBf\nZDE6MTE6MTE6YWM6MmE6YmE6OTc6YjI6M2Y6YWM6N2I6YmQ6ZGE6YmU6YjE6OGE6\nZmM6OWE6YmE6YjU6YmM6ODM6ZTc6NWU6NDE6NmY6ZjI6NzM6OTU6NTg6MGM6ZGIw\nWQYDVR0RBFIwUIZOc3BpZmZlOi8vMTExMTExMTEtMjIyMi0zMzMzLTQ0NDQtNTU1\nNTU1NTU1NTU1LmNvbnN1bC9ucy9kZWZhdWx0L2RjL2RjMS9zdmMvd2ViMAoGCCqG\nSM49BAMCA0gAMEUCIGC3TTvvjj76KMrguVyFf4tjOqaSCRie3nmHMRNNRav7AiEA\npY0heYeK9A6iOLrzqxSerkXXQyj5e9bE4VgUnxgPU6g=\n-----END CERTIFICATE-----\n" }, - "privateKey": { - "inlineString": "-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEIMoTkpRggp3fqZzFKh82yS4LjtJI+XY+qX/7DefHFrtdoAoGCCqGSM49\nAwEHoUQDQgAEADPv1RHVNRfa2VKRAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Fav\nq5E0ivpNtv1QnFhxtPd7d5k4e+T7SkW1TQ==\n-----END EC PRIVATE KEY-----\n" + "privateKey": { + "inlineString": "-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEIMoTkpRggp3fqZzFKh82yS4LjtJI+XY+qX/7DefHFrtdoAoGCCqGSM49\nAwEHoUQDQgAEADPv1RHVNRfa2VKRAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Fav\nq5E0ivpNtv1QnFhxtPd7d5k4e+T7SkW1TQ==\n-----END EC PRIVATE KEY-----\n" } } ], - "validationContext": { - "trustedCa": { - "inlineString": "-----BEGIN CERTIFICATE-----\nMIICXDCCAgKgAwIBAgIICpZq70Z9LyUwCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowFDESMBAG\nA1UEAxMJVGVzdCBDQSAyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEIhywH1gx\nAsMwuF3ukAI5YL2jFxH6Usnma1HFSfVyxbXX1/uoZEYrj8yCAtdU2yoHETyd+Zx2\nThhRLP79pYegCaOCATwwggE4MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTAD\nAQH/MGgGA1UdDgRhBF9kMToxMToxMTphYzoyYTpiYTo5NzpiMjozZjphYzo3Yjpi\nZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1ZTo0MTo2ZjpmMjo3\nMzo5NTo1ODowYzpkYjBqBgNVHSMEYzBhgF9kMToxMToxMTphYzoyYTpiYTo5Nzpi\nMjozZjphYzo3YjpiZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1\nZTo0MTo2ZjpmMjo3Mzo5NTo1ODowYzpkYjA/BgNVHREEODA2hjRzcGlmZmU6Ly8x\nMTExMTExMS0yMjIyLTMzMzMtNDQ0NC01NTU1NTU1NTU1NTUuY29uc3VsMAoGCCqG\nSM49BAMCA0gAMEUCICOY0i246rQHJt8o8Oya0D5PLL1FnmsQmQqIGCi31RwnAiEA\noR5f6Ku+cig2Il8T8LJujOp2/2A72QcHZA57B13y+8o=\n-----END CERTIFICATE-----\n" + "validationContext": { + "trustedCa": { + "inlineString": "-----BEGIN CERTIFICATE-----\nMIICXDCCAgKgAwIBAgIICpZq70Z9LyUwCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowFDESMBAG\nA1UEAxMJVGVzdCBDQSAyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEIhywH1gx\nAsMwuF3ukAI5YL2jFxH6Usnma1HFSfVyxbXX1/uoZEYrj8yCAtdU2yoHETyd+Zx2\nThhRLP79pYegCaOCATwwggE4MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTAD\nAQH/MGgGA1UdDgRhBF9kMToxMToxMTphYzoyYTpiYTo5NzpiMjozZjphYzo3Yjpi\nZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1ZTo0MTo2ZjpmMjo3\nMzo5NTo1ODowYzpkYjBqBgNVHSMEYzBhgF9kMToxMToxMTphYzoyYTpiYTo5Nzpi\nMjozZjphYzo3YjpiZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1\nZTo0MTo2ZjpmMjo3Mzo5NTo1ODowYzpkYjA/BgNVHREEODA2hjRzcGlmZmU6Ly8x\nMTExMTExMS0yMjIyLTMzMzMtNDQ0NC01NTU1NTU1NTU1NTUuY29uc3VsMAoGCCqG\nSM49BAMCA0gAMEUCICOY0i246rQHJt8o8Oya0D5PLL1FnmsQmQqIGCi31RwnAiEA\noR5f6Ku+cig2Il8T8LJujOp2/2A72QcHZA57B13y+8o=\n-----END CERTIFICATE-----\n" }, - "matchSubjectAltNames": [ + "matchSubjectAltNames": [ { - "exact": "spiffe://11111111-2222-3333-4444-555555555555.consul/ns/default/dc/dc2/svc/db" + "exact": "spiffe://11111111-2222-3333-4444-555555555555.consul/ns/default/dc/dc2/svc/db" } ] } }, - "sni": "db.default.dc2.internal.11111111-2222-3333-4444-555555555555.consul" + "sni": "db.default.dc2.internal.11111111-2222-3333-4444-555555555555.consul" } } }, { - "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", - "name": "failover-target~db.default.dc3.internal.11111111-2222-3333-4444-555555555555.consul", - "altStatName": "failover-target~db.default.dc3.internal.11111111-2222-3333-4444-555555555555.consul", - "type": "EDS", - "edsClusterConfig": { - "edsConfig": { - "ads": { - - }, - "resourceApiVersion": "V3" + "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", + "name": "failover-target~2~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "altStatName": "failover-target~2~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "type": "EDS", + "edsClusterConfig": { + "edsConfig": { + "ads": {}, + "resourceApiVersion": "V3" } }, - "connectTimeout": "33s", - "circuitBreakers": { - - }, - "outlierDetection": { - - }, - "commonLbConfig": { - "healthyPanicThreshold": { - - } + "connectTimeout": "33s", + "circuitBreakers": {}, + "outlierDetection": {}, + "commonLbConfig": { + "healthyPanicThreshold": {} }, - "transportSocket": { - "name": "tls", - "typedConfig": { - "@type": "type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext", - "commonTlsContext": { - "tlsParams": { - - }, - "tlsCertificates": [ + "transportSocket": { + "name": "tls", + "typedConfig": { + "@type": "type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext", + "commonTlsContext": { + "tlsParams": {}, + "tlsCertificates": [ { - "certificateChain": { - "inlineString": "-----BEGIN CERTIFICATE-----\nMIICjDCCAjKgAwIBAgIIC5llxGV1gB8wCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowDjEMMAoG\nA1UEAxMDd2ViMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEADPv1RHVNRfa2VKR\nAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Favq5E0ivpNtv1QnFhxtPd7d5k4e+T7\nSkW1TaOCAXIwggFuMA4GA1UdDwEB/wQEAwIDuDAdBgNVHSUEFjAUBggrBgEFBQcD\nAgYIKwYBBQUHAwEwDAYDVR0TAQH/BAIwADBoBgNVHQ4EYQRfN2Q6MDc6ODc6M2E6\nNDA6MTk6NDc6YzM6NWE6YzA6YmE6NjI6ZGY6YWY6NGI6ZDQ6MDU6MjU6NzY6M2Q6\nNWE6OGQ6MTY6OGQ6Njc6NWU6MmU6YTA6MzQ6N2Q6ZGM6ZmYwagYDVR0jBGMwYYBf\nZDE6MTE6MTE6YWM6MmE6YmE6OTc6YjI6M2Y6YWM6N2I6YmQ6ZGE6YmU6YjE6OGE6\nZmM6OWE6YmE6YjU6YmM6ODM6ZTc6NWU6NDE6NmY6ZjI6NzM6OTU6NTg6MGM6ZGIw\nWQYDVR0RBFIwUIZOc3BpZmZlOi8vMTExMTExMTEtMjIyMi0zMzMzLTQ0NDQtNTU1\nNTU1NTU1NTU1LmNvbnN1bC9ucy9kZWZhdWx0L2RjL2RjMS9zdmMvd2ViMAoGCCqG\nSM49BAMCA0gAMEUCIGC3TTvvjj76KMrguVyFf4tjOqaSCRie3nmHMRNNRav7AiEA\npY0heYeK9A6iOLrzqxSerkXXQyj5e9bE4VgUnxgPU6g=\n-----END CERTIFICATE-----\n" + "certificateChain": { + "inlineString": "-----BEGIN CERTIFICATE-----\nMIICjDCCAjKgAwIBAgIIC5llxGV1gB8wCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowDjEMMAoG\nA1UEAxMDd2ViMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEADPv1RHVNRfa2VKR\nAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Favq5E0ivpNtv1QnFhxtPd7d5k4e+T7\nSkW1TaOCAXIwggFuMA4GA1UdDwEB/wQEAwIDuDAdBgNVHSUEFjAUBggrBgEFBQcD\nAgYIKwYBBQUHAwEwDAYDVR0TAQH/BAIwADBoBgNVHQ4EYQRfN2Q6MDc6ODc6M2E6\nNDA6MTk6NDc6YzM6NWE6YzA6YmE6NjI6ZGY6YWY6NGI6ZDQ6MDU6MjU6NzY6M2Q6\nNWE6OGQ6MTY6OGQ6Njc6NWU6MmU6YTA6MzQ6N2Q6ZGM6ZmYwagYDVR0jBGMwYYBf\nZDE6MTE6MTE6YWM6MmE6YmE6OTc6YjI6M2Y6YWM6N2I6YmQ6ZGE6YmU6YjE6OGE6\nZmM6OWE6YmE6YjU6YmM6ODM6ZTc6NWU6NDE6NmY6ZjI6NzM6OTU6NTg6MGM6ZGIw\nWQYDVR0RBFIwUIZOc3BpZmZlOi8vMTExMTExMTEtMjIyMi0zMzMzLTQ0NDQtNTU1\nNTU1NTU1NTU1LmNvbnN1bC9ucy9kZWZhdWx0L2RjL2RjMS9zdmMvd2ViMAoGCCqG\nSM49BAMCA0gAMEUCIGC3TTvvjj76KMrguVyFf4tjOqaSCRie3nmHMRNNRav7AiEA\npY0heYeK9A6iOLrzqxSerkXXQyj5e9bE4VgUnxgPU6g=\n-----END CERTIFICATE-----\n" }, - "privateKey": { - "inlineString": "-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEIMoTkpRggp3fqZzFKh82yS4LjtJI+XY+qX/7DefHFrtdoAoGCCqGSM49\nAwEHoUQDQgAEADPv1RHVNRfa2VKRAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Fav\nq5E0ivpNtv1QnFhxtPd7d5k4e+T7SkW1TQ==\n-----END EC PRIVATE KEY-----\n" + "privateKey": { + "inlineString": "-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEIMoTkpRggp3fqZzFKh82yS4LjtJI+XY+qX/7DefHFrtdoAoGCCqGSM49\nAwEHoUQDQgAEADPv1RHVNRfa2VKRAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Fav\nq5E0ivpNtv1QnFhxtPd7d5k4e+T7SkW1TQ==\n-----END EC PRIVATE KEY-----\n" } } ], - "validationContext": { - "trustedCa": { - "inlineString": "-----BEGIN CERTIFICATE-----\nMIICXDCCAgKgAwIBAgIICpZq70Z9LyUwCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowFDESMBAG\nA1UEAxMJVGVzdCBDQSAyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEIhywH1gx\nAsMwuF3ukAI5YL2jFxH6Usnma1HFSfVyxbXX1/uoZEYrj8yCAtdU2yoHETyd+Zx2\nThhRLP79pYegCaOCATwwggE4MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTAD\nAQH/MGgGA1UdDgRhBF9kMToxMToxMTphYzoyYTpiYTo5NzpiMjozZjphYzo3Yjpi\nZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1ZTo0MTo2ZjpmMjo3\nMzo5NTo1ODowYzpkYjBqBgNVHSMEYzBhgF9kMToxMToxMTphYzoyYTpiYTo5Nzpi\nMjozZjphYzo3YjpiZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1\nZTo0MTo2ZjpmMjo3Mzo5NTo1ODowYzpkYjA/BgNVHREEODA2hjRzcGlmZmU6Ly8x\nMTExMTExMS0yMjIyLTMzMzMtNDQ0NC01NTU1NTU1NTU1NTUuY29uc3VsMAoGCCqG\nSM49BAMCA0gAMEUCICOY0i246rQHJt8o8Oya0D5PLL1FnmsQmQqIGCi31RwnAiEA\noR5f6Ku+cig2Il8T8LJujOp2/2A72QcHZA57B13y+8o=\n-----END CERTIFICATE-----\n" + "validationContext": { + "trustedCa": { + "inlineString": "-----BEGIN CERTIFICATE-----\nMIICXDCCAgKgAwIBAgIICpZq70Z9LyUwCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowFDESMBAG\nA1UEAxMJVGVzdCBDQSAyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEIhywH1gx\nAsMwuF3ukAI5YL2jFxH6Usnma1HFSfVyxbXX1/uoZEYrj8yCAtdU2yoHETyd+Zx2\nThhRLP79pYegCaOCATwwggE4MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTAD\nAQH/MGgGA1UdDgRhBF9kMToxMToxMTphYzoyYTpiYTo5NzpiMjozZjphYzo3Yjpi\nZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1ZTo0MTo2ZjpmMjo3\nMzo5NTo1ODowYzpkYjBqBgNVHSMEYzBhgF9kMToxMToxMTphYzoyYTpiYTo5Nzpi\nMjozZjphYzo3YjpiZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1\nZTo0MTo2ZjpmMjo3Mzo5NTo1ODowYzpkYjA/BgNVHREEODA2hjRzcGlmZmU6Ly8x\nMTExMTExMS0yMjIyLTMzMzMtNDQ0NC01NTU1NTU1NTU1NTUuY29uc3VsMAoGCCqG\nSM49BAMCA0gAMEUCICOY0i246rQHJt8o8Oya0D5PLL1FnmsQmQqIGCi31RwnAiEA\noR5f6Ku+cig2Il8T8LJujOp2/2A72QcHZA57B13y+8o=\n-----END CERTIFICATE-----\n" }, - "matchSubjectAltNames": [ + "matchSubjectAltNames": [ { - "exact": "spiffe://11111111-2222-3333-4444-555555555555.consul/ns/default/dc/dc3/svc/db" + "exact": "spiffe://11111111-2222-3333-4444-555555555555.consul/ns/default/dc/dc3/svc/db" } ] } }, - "sni": "db.default.dc3.internal.11111111-2222-3333-4444-555555555555.consul" + "sni": "db.default.dc3.internal.11111111-2222-3333-4444-555555555555.consul" } } } ], - "typeUrl": "type.googleapis.com/envoy.config.cluster.v3.Cluster", - "nonce": "00000001" + "typeUrl": "type.googleapis.com/envoy.config.cluster.v3.Cluster", + "nonce": "00000001" } \ No newline at end of file diff --git a/agent/xds/testdata/clusters/ingress-with-tcp-chain-double-failover-through-local-gateway.latest.golden b/agent/xds/testdata/clusters/ingress-with-tcp-chain-double-failover-through-local-gateway.latest.golden index 5c4efef3d72..316328604f5 100644 --- a/agent/xds/testdata/clusters/ingress-with-tcp-chain-double-failover-through-local-gateway.latest.golden +++ b/agent/xds/testdata/clusters/ingress-with-tcp-chain-double-failover-through-local-gateway.latest.golden @@ -1,202 +1,170 @@ { - "versionInfo": "00000001", - "resources": [ + "versionInfo": "00000001", + "resources": [ { - "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", - "name": "db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", - "altStatName": "db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", - "clusterType": { - "name": "envoy.clusters.aggregate", - "typedConfig": { - "@type": "type.googleapis.com/envoy.extensions.clusters.aggregate.v3.ClusterConfig", - "clusters": [ - "failover-target~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", - "failover-target~db.default.dc2.internal.11111111-2222-3333-4444-555555555555.consul", - "failover-target~db.default.dc3.internal.11111111-2222-3333-4444-555555555555.consul" + "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", + "name": "db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "altStatName": "db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "clusterType": { + "name": "envoy.clusters.aggregate", + "typedConfig": { + "@type": "type.googleapis.com/envoy.extensions.clusters.aggregate.v3.ClusterConfig", + "clusters": [ + "failover-target~0~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "failover-target~1~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "failover-target~2~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul" ] } }, - "connectTimeout": "33s", - "lbPolicy": "CLUSTER_PROVIDED", - "outlierDetection": { - - } + "connectTimeout": "33s", + "lbPolicy": "CLUSTER_PROVIDED", + "outlierDetection": {} }, { - "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", - "name": "failover-target~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", - "altStatName": "failover-target~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", - "type": "EDS", - "edsClusterConfig": { - "edsConfig": { - "ads": { - - }, - "resourceApiVersion": "V3" + "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", + "name": "failover-target~0~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "altStatName": "failover-target~0~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "type": "EDS", + "edsClusterConfig": { + "edsConfig": { + "ads": {}, + "resourceApiVersion": "V3" } }, - "connectTimeout": "33s", - "circuitBreakers": { - + "connectTimeout": "33s", + "circuitBreakers": {}, + "outlierDetection": {}, + "commonLbConfig": { + "healthyPanicThreshold": {} }, - "outlierDetection": { - - }, - "commonLbConfig": { - "healthyPanicThreshold": { - - } - }, - "transportSocket": { - "name": "tls", - "typedConfig": { - "@type": "type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext", - "commonTlsContext": { - "tlsParams": { - - }, - "tlsCertificates": [ + "transportSocket": { + "name": "tls", + "typedConfig": { + "@type": "type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext", + "commonTlsContext": { + "tlsParams": {}, + "tlsCertificates": [ { - "certificateChain": { - "inlineString": "-----BEGIN CERTIFICATE-----\nMIICjDCCAjKgAwIBAgIIC5llxGV1gB8wCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowDjEMMAoG\nA1UEAxMDd2ViMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEADPv1RHVNRfa2VKR\nAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Favq5E0ivpNtv1QnFhxtPd7d5k4e+T7\nSkW1TaOCAXIwggFuMA4GA1UdDwEB/wQEAwIDuDAdBgNVHSUEFjAUBggrBgEFBQcD\nAgYIKwYBBQUHAwEwDAYDVR0TAQH/BAIwADBoBgNVHQ4EYQRfN2Q6MDc6ODc6M2E6\nNDA6MTk6NDc6YzM6NWE6YzA6YmE6NjI6ZGY6YWY6NGI6ZDQ6MDU6MjU6NzY6M2Q6\nNWE6OGQ6MTY6OGQ6Njc6NWU6MmU6YTA6MzQ6N2Q6ZGM6ZmYwagYDVR0jBGMwYYBf\nZDE6MTE6MTE6YWM6MmE6YmE6OTc6YjI6M2Y6YWM6N2I6YmQ6ZGE6YmU6YjE6OGE6\nZmM6OWE6YmE6YjU6YmM6ODM6ZTc6NWU6NDE6NmY6ZjI6NzM6OTU6NTg6MGM6ZGIw\nWQYDVR0RBFIwUIZOc3BpZmZlOi8vMTExMTExMTEtMjIyMi0zMzMzLTQ0NDQtNTU1\nNTU1NTU1NTU1LmNvbnN1bC9ucy9kZWZhdWx0L2RjL2RjMS9zdmMvd2ViMAoGCCqG\nSM49BAMCA0gAMEUCIGC3TTvvjj76KMrguVyFf4tjOqaSCRie3nmHMRNNRav7AiEA\npY0heYeK9A6iOLrzqxSerkXXQyj5e9bE4VgUnxgPU6g=\n-----END CERTIFICATE-----\n" + "certificateChain": { + "inlineString": "-----BEGIN CERTIFICATE-----\nMIICjDCCAjKgAwIBAgIIC5llxGV1gB8wCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowDjEMMAoG\nA1UEAxMDd2ViMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEADPv1RHVNRfa2VKR\nAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Favq5E0ivpNtv1QnFhxtPd7d5k4e+T7\nSkW1TaOCAXIwggFuMA4GA1UdDwEB/wQEAwIDuDAdBgNVHSUEFjAUBggrBgEFBQcD\nAgYIKwYBBQUHAwEwDAYDVR0TAQH/BAIwADBoBgNVHQ4EYQRfN2Q6MDc6ODc6M2E6\nNDA6MTk6NDc6YzM6NWE6YzA6YmE6NjI6ZGY6YWY6NGI6ZDQ6MDU6MjU6NzY6M2Q6\nNWE6OGQ6MTY6OGQ6Njc6NWU6MmU6YTA6MzQ6N2Q6ZGM6ZmYwagYDVR0jBGMwYYBf\nZDE6MTE6MTE6YWM6MmE6YmE6OTc6YjI6M2Y6YWM6N2I6YmQ6ZGE6YmU6YjE6OGE6\nZmM6OWE6YmE6YjU6YmM6ODM6ZTc6NWU6NDE6NmY6ZjI6NzM6OTU6NTg6MGM6ZGIw\nWQYDVR0RBFIwUIZOc3BpZmZlOi8vMTExMTExMTEtMjIyMi0zMzMzLTQ0NDQtNTU1\nNTU1NTU1NTU1LmNvbnN1bC9ucy9kZWZhdWx0L2RjL2RjMS9zdmMvd2ViMAoGCCqG\nSM49BAMCA0gAMEUCIGC3TTvvjj76KMrguVyFf4tjOqaSCRie3nmHMRNNRav7AiEA\npY0heYeK9A6iOLrzqxSerkXXQyj5e9bE4VgUnxgPU6g=\n-----END CERTIFICATE-----\n" }, - "privateKey": { - "inlineString": "-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEIMoTkpRggp3fqZzFKh82yS4LjtJI+XY+qX/7DefHFrtdoAoGCCqGSM49\nAwEHoUQDQgAEADPv1RHVNRfa2VKRAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Fav\nq5E0ivpNtv1QnFhxtPd7d5k4e+T7SkW1TQ==\n-----END EC PRIVATE KEY-----\n" + "privateKey": { + "inlineString": "-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEIMoTkpRggp3fqZzFKh82yS4LjtJI+XY+qX/7DefHFrtdoAoGCCqGSM49\nAwEHoUQDQgAEADPv1RHVNRfa2VKRAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Fav\nq5E0ivpNtv1QnFhxtPd7d5k4e+T7SkW1TQ==\n-----END EC PRIVATE KEY-----\n" } } ], - "validationContext": { - "trustedCa": { - "inlineString": "-----BEGIN CERTIFICATE-----\nMIICXDCCAgKgAwIBAgIICpZq70Z9LyUwCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowFDESMBAG\nA1UEAxMJVGVzdCBDQSAyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEIhywH1gx\nAsMwuF3ukAI5YL2jFxH6Usnma1HFSfVyxbXX1/uoZEYrj8yCAtdU2yoHETyd+Zx2\nThhRLP79pYegCaOCATwwggE4MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTAD\nAQH/MGgGA1UdDgRhBF9kMToxMToxMTphYzoyYTpiYTo5NzpiMjozZjphYzo3Yjpi\nZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1ZTo0MTo2ZjpmMjo3\nMzo5NTo1ODowYzpkYjBqBgNVHSMEYzBhgF9kMToxMToxMTphYzoyYTpiYTo5Nzpi\nMjozZjphYzo3YjpiZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1\nZTo0MTo2ZjpmMjo3Mzo5NTo1ODowYzpkYjA/BgNVHREEODA2hjRzcGlmZmU6Ly8x\nMTExMTExMS0yMjIyLTMzMzMtNDQ0NC01NTU1NTU1NTU1NTUuY29uc3VsMAoGCCqG\nSM49BAMCA0gAMEUCICOY0i246rQHJt8o8Oya0D5PLL1FnmsQmQqIGCi31RwnAiEA\noR5f6Ku+cig2Il8T8LJujOp2/2A72QcHZA57B13y+8o=\n-----END CERTIFICATE-----\n" + "validationContext": { + "trustedCa": { + "inlineString": "-----BEGIN CERTIFICATE-----\nMIICXDCCAgKgAwIBAgIICpZq70Z9LyUwCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowFDESMBAG\nA1UEAxMJVGVzdCBDQSAyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEIhywH1gx\nAsMwuF3ukAI5YL2jFxH6Usnma1HFSfVyxbXX1/uoZEYrj8yCAtdU2yoHETyd+Zx2\nThhRLP79pYegCaOCATwwggE4MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTAD\nAQH/MGgGA1UdDgRhBF9kMToxMToxMTphYzoyYTpiYTo5NzpiMjozZjphYzo3Yjpi\nZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1ZTo0MTo2ZjpmMjo3\nMzo5NTo1ODowYzpkYjBqBgNVHSMEYzBhgF9kMToxMToxMTphYzoyYTpiYTo5Nzpi\nMjozZjphYzo3YjpiZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1\nZTo0MTo2ZjpmMjo3Mzo5NTo1ODowYzpkYjA/BgNVHREEODA2hjRzcGlmZmU6Ly8x\nMTExMTExMS0yMjIyLTMzMzMtNDQ0NC01NTU1NTU1NTU1NTUuY29uc3VsMAoGCCqG\nSM49BAMCA0gAMEUCICOY0i246rQHJt8o8Oya0D5PLL1FnmsQmQqIGCi31RwnAiEA\noR5f6Ku+cig2Il8T8LJujOp2/2A72QcHZA57B13y+8o=\n-----END CERTIFICATE-----\n" }, - "matchSubjectAltNames": [ + "matchSubjectAltNames": [ { - "exact": "spiffe://11111111-2222-3333-4444-555555555555.consul/ns/default/dc/dc1/svc/db" + "exact": "spiffe://11111111-2222-3333-4444-555555555555.consul/ns/default/dc/dc1/svc/db" } ] } }, - "sni": "db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul" + "sni": "db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul" } } }, { - "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", - "name": "failover-target~db.default.dc2.internal.11111111-2222-3333-4444-555555555555.consul", - "altStatName": "failover-target~db.default.dc2.internal.11111111-2222-3333-4444-555555555555.consul", - "type": "EDS", - "edsClusterConfig": { - "edsConfig": { - "ads": { - - }, - "resourceApiVersion": "V3" + "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", + "name": "failover-target~1~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "altStatName": "failover-target~1~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "type": "EDS", + "edsClusterConfig": { + "edsConfig": { + "ads": {}, + "resourceApiVersion": "V3" } }, - "connectTimeout": "33s", - "circuitBreakers": { - - }, - "outlierDetection": { - + "connectTimeout": "33s", + "circuitBreakers": {}, + "outlierDetection": {}, + "commonLbConfig": { + "healthyPanicThreshold": {} }, - "commonLbConfig": { - "healthyPanicThreshold": { - - } - }, - "transportSocket": { - "name": "tls", - "typedConfig": { - "@type": "type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext", - "commonTlsContext": { - "tlsParams": { - - }, - "tlsCertificates": [ + "transportSocket": { + "name": "tls", + "typedConfig": { + "@type": "type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext", + "commonTlsContext": { + "tlsParams": {}, + "tlsCertificates": [ { - "certificateChain": { - "inlineString": "-----BEGIN CERTIFICATE-----\nMIICjDCCAjKgAwIBAgIIC5llxGV1gB8wCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowDjEMMAoG\nA1UEAxMDd2ViMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEADPv1RHVNRfa2VKR\nAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Favq5E0ivpNtv1QnFhxtPd7d5k4e+T7\nSkW1TaOCAXIwggFuMA4GA1UdDwEB/wQEAwIDuDAdBgNVHSUEFjAUBggrBgEFBQcD\nAgYIKwYBBQUHAwEwDAYDVR0TAQH/BAIwADBoBgNVHQ4EYQRfN2Q6MDc6ODc6M2E6\nNDA6MTk6NDc6YzM6NWE6YzA6YmE6NjI6ZGY6YWY6NGI6ZDQ6MDU6MjU6NzY6M2Q6\nNWE6OGQ6MTY6OGQ6Njc6NWU6MmU6YTA6MzQ6N2Q6ZGM6ZmYwagYDVR0jBGMwYYBf\nZDE6MTE6MTE6YWM6MmE6YmE6OTc6YjI6M2Y6YWM6N2I6YmQ6ZGE6YmU6YjE6OGE6\nZmM6OWE6YmE6YjU6YmM6ODM6ZTc6NWU6NDE6NmY6ZjI6NzM6OTU6NTg6MGM6ZGIw\nWQYDVR0RBFIwUIZOc3BpZmZlOi8vMTExMTExMTEtMjIyMi0zMzMzLTQ0NDQtNTU1\nNTU1NTU1NTU1LmNvbnN1bC9ucy9kZWZhdWx0L2RjL2RjMS9zdmMvd2ViMAoGCCqG\nSM49BAMCA0gAMEUCIGC3TTvvjj76KMrguVyFf4tjOqaSCRie3nmHMRNNRav7AiEA\npY0heYeK9A6iOLrzqxSerkXXQyj5e9bE4VgUnxgPU6g=\n-----END CERTIFICATE-----\n" + "certificateChain": { + "inlineString": "-----BEGIN CERTIFICATE-----\nMIICjDCCAjKgAwIBAgIIC5llxGV1gB8wCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowDjEMMAoG\nA1UEAxMDd2ViMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEADPv1RHVNRfa2VKR\nAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Favq5E0ivpNtv1QnFhxtPd7d5k4e+T7\nSkW1TaOCAXIwggFuMA4GA1UdDwEB/wQEAwIDuDAdBgNVHSUEFjAUBggrBgEFBQcD\nAgYIKwYBBQUHAwEwDAYDVR0TAQH/BAIwADBoBgNVHQ4EYQRfN2Q6MDc6ODc6M2E6\nNDA6MTk6NDc6YzM6NWE6YzA6YmE6NjI6ZGY6YWY6NGI6ZDQ6MDU6MjU6NzY6M2Q6\nNWE6OGQ6MTY6OGQ6Njc6NWU6MmU6YTA6MzQ6N2Q6ZGM6ZmYwagYDVR0jBGMwYYBf\nZDE6MTE6MTE6YWM6MmE6YmE6OTc6YjI6M2Y6YWM6N2I6YmQ6ZGE6YmU6YjE6OGE6\nZmM6OWE6YmE6YjU6YmM6ODM6ZTc6NWU6NDE6NmY6ZjI6NzM6OTU6NTg6MGM6ZGIw\nWQYDVR0RBFIwUIZOc3BpZmZlOi8vMTExMTExMTEtMjIyMi0zMzMzLTQ0NDQtNTU1\nNTU1NTU1NTU1LmNvbnN1bC9ucy9kZWZhdWx0L2RjL2RjMS9zdmMvd2ViMAoGCCqG\nSM49BAMCA0gAMEUCIGC3TTvvjj76KMrguVyFf4tjOqaSCRie3nmHMRNNRav7AiEA\npY0heYeK9A6iOLrzqxSerkXXQyj5e9bE4VgUnxgPU6g=\n-----END CERTIFICATE-----\n" }, - "privateKey": { - "inlineString": "-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEIMoTkpRggp3fqZzFKh82yS4LjtJI+XY+qX/7DefHFrtdoAoGCCqGSM49\nAwEHoUQDQgAEADPv1RHVNRfa2VKRAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Fav\nq5E0ivpNtv1QnFhxtPd7d5k4e+T7SkW1TQ==\n-----END EC PRIVATE KEY-----\n" + "privateKey": { + "inlineString": "-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEIMoTkpRggp3fqZzFKh82yS4LjtJI+XY+qX/7DefHFrtdoAoGCCqGSM49\nAwEHoUQDQgAEADPv1RHVNRfa2VKRAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Fav\nq5E0ivpNtv1QnFhxtPd7d5k4e+T7SkW1TQ==\n-----END EC PRIVATE KEY-----\n" } } ], - "validationContext": { - "trustedCa": { - "inlineString": "-----BEGIN CERTIFICATE-----\nMIICXDCCAgKgAwIBAgIICpZq70Z9LyUwCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowFDESMBAG\nA1UEAxMJVGVzdCBDQSAyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEIhywH1gx\nAsMwuF3ukAI5YL2jFxH6Usnma1HFSfVyxbXX1/uoZEYrj8yCAtdU2yoHETyd+Zx2\nThhRLP79pYegCaOCATwwggE4MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTAD\nAQH/MGgGA1UdDgRhBF9kMToxMToxMTphYzoyYTpiYTo5NzpiMjozZjphYzo3Yjpi\nZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1ZTo0MTo2ZjpmMjo3\nMzo5NTo1ODowYzpkYjBqBgNVHSMEYzBhgF9kMToxMToxMTphYzoyYTpiYTo5Nzpi\nMjozZjphYzo3YjpiZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1\nZTo0MTo2ZjpmMjo3Mzo5NTo1ODowYzpkYjA/BgNVHREEODA2hjRzcGlmZmU6Ly8x\nMTExMTExMS0yMjIyLTMzMzMtNDQ0NC01NTU1NTU1NTU1NTUuY29uc3VsMAoGCCqG\nSM49BAMCA0gAMEUCICOY0i246rQHJt8o8Oya0D5PLL1FnmsQmQqIGCi31RwnAiEA\noR5f6Ku+cig2Il8T8LJujOp2/2A72QcHZA57B13y+8o=\n-----END CERTIFICATE-----\n" + "validationContext": { + "trustedCa": { + "inlineString": "-----BEGIN CERTIFICATE-----\nMIICXDCCAgKgAwIBAgIICpZq70Z9LyUwCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowFDESMBAG\nA1UEAxMJVGVzdCBDQSAyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEIhywH1gx\nAsMwuF3ukAI5YL2jFxH6Usnma1HFSfVyxbXX1/uoZEYrj8yCAtdU2yoHETyd+Zx2\nThhRLP79pYegCaOCATwwggE4MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTAD\nAQH/MGgGA1UdDgRhBF9kMToxMToxMTphYzoyYTpiYTo5NzpiMjozZjphYzo3Yjpi\nZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1ZTo0MTo2ZjpmMjo3\nMzo5NTo1ODowYzpkYjBqBgNVHSMEYzBhgF9kMToxMToxMTphYzoyYTpiYTo5Nzpi\nMjozZjphYzo3YjpiZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1\nZTo0MTo2ZjpmMjo3Mzo5NTo1ODowYzpkYjA/BgNVHREEODA2hjRzcGlmZmU6Ly8x\nMTExMTExMS0yMjIyLTMzMzMtNDQ0NC01NTU1NTU1NTU1NTUuY29uc3VsMAoGCCqG\nSM49BAMCA0gAMEUCICOY0i246rQHJt8o8Oya0D5PLL1FnmsQmQqIGCi31RwnAiEA\noR5f6Ku+cig2Il8T8LJujOp2/2A72QcHZA57B13y+8o=\n-----END CERTIFICATE-----\n" }, - "matchSubjectAltNames": [ + "matchSubjectAltNames": [ { - "exact": "spiffe://11111111-2222-3333-4444-555555555555.consul/ns/default/dc/dc2/svc/db" + "exact": "spiffe://11111111-2222-3333-4444-555555555555.consul/ns/default/dc/dc2/svc/db" } ] } }, - "sni": "db.default.dc2.internal.11111111-2222-3333-4444-555555555555.consul" + "sni": "db.default.dc2.internal.11111111-2222-3333-4444-555555555555.consul" } } }, { - "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", - "name": "failover-target~db.default.dc3.internal.11111111-2222-3333-4444-555555555555.consul", - "altStatName": "failover-target~db.default.dc3.internal.11111111-2222-3333-4444-555555555555.consul", - "type": "EDS", - "edsClusterConfig": { - "edsConfig": { - "ads": { - - }, - "resourceApiVersion": "V3" + "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", + "name": "failover-target~2~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "altStatName": "failover-target~2~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "type": "EDS", + "edsClusterConfig": { + "edsConfig": { + "ads": {}, + "resourceApiVersion": "V3" } }, - "connectTimeout": "33s", - "circuitBreakers": { - - }, - "outlierDetection": { - - }, - "commonLbConfig": { - "healthyPanicThreshold": { - - } + "connectTimeout": "33s", + "circuitBreakers": {}, + "outlierDetection": {}, + "commonLbConfig": { + "healthyPanicThreshold": {} }, - "transportSocket": { - "name": "tls", - "typedConfig": { - "@type": "type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext", - "commonTlsContext": { - "tlsParams": { - - }, - "tlsCertificates": [ + "transportSocket": { + "name": "tls", + "typedConfig": { + "@type": "type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext", + "commonTlsContext": { + "tlsParams": {}, + "tlsCertificates": [ { - "certificateChain": { - "inlineString": "-----BEGIN CERTIFICATE-----\nMIICjDCCAjKgAwIBAgIIC5llxGV1gB8wCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowDjEMMAoG\nA1UEAxMDd2ViMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEADPv1RHVNRfa2VKR\nAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Favq5E0ivpNtv1QnFhxtPd7d5k4e+T7\nSkW1TaOCAXIwggFuMA4GA1UdDwEB/wQEAwIDuDAdBgNVHSUEFjAUBggrBgEFBQcD\nAgYIKwYBBQUHAwEwDAYDVR0TAQH/BAIwADBoBgNVHQ4EYQRfN2Q6MDc6ODc6M2E6\nNDA6MTk6NDc6YzM6NWE6YzA6YmE6NjI6ZGY6YWY6NGI6ZDQ6MDU6MjU6NzY6M2Q6\nNWE6OGQ6MTY6OGQ6Njc6NWU6MmU6YTA6MzQ6N2Q6ZGM6ZmYwagYDVR0jBGMwYYBf\nZDE6MTE6MTE6YWM6MmE6YmE6OTc6YjI6M2Y6YWM6N2I6YmQ6ZGE6YmU6YjE6OGE6\nZmM6OWE6YmE6YjU6YmM6ODM6ZTc6NWU6NDE6NmY6ZjI6NzM6OTU6NTg6MGM6ZGIw\nWQYDVR0RBFIwUIZOc3BpZmZlOi8vMTExMTExMTEtMjIyMi0zMzMzLTQ0NDQtNTU1\nNTU1NTU1NTU1LmNvbnN1bC9ucy9kZWZhdWx0L2RjL2RjMS9zdmMvd2ViMAoGCCqG\nSM49BAMCA0gAMEUCIGC3TTvvjj76KMrguVyFf4tjOqaSCRie3nmHMRNNRav7AiEA\npY0heYeK9A6iOLrzqxSerkXXQyj5e9bE4VgUnxgPU6g=\n-----END CERTIFICATE-----\n" + "certificateChain": { + "inlineString": "-----BEGIN CERTIFICATE-----\nMIICjDCCAjKgAwIBAgIIC5llxGV1gB8wCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowDjEMMAoG\nA1UEAxMDd2ViMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEADPv1RHVNRfa2VKR\nAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Favq5E0ivpNtv1QnFhxtPd7d5k4e+T7\nSkW1TaOCAXIwggFuMA4GA1UdDwEB/wQEAwIDuDAdBgNVHSUEFjAUBggrBgEFBQcD\nAgYIKwYBBQUHAwEwDAYDVR0TAQH/BAIwADBoBgNVHQ4EYQRfN2Q6MDc6ODc6M2E6\nNDA6MTk6NDc6YzM6NWE6YzA6YmE6NjI6ZGY6YWY6NGI6ZDQ6MDU6MjU6NzY6M2Q6\nNWE6OGQ6MTY6OGQ6Njc6NWU6MmU6YTA6MzQ6N2Q6ZGM6ZmYwagYDVR0jBGMwYYBf\nZDE6MTE6MTE6YWM6MmE6YmE6OTc6YjI6M2Y6YWM6N2I6YmQ6ZGE6YmU6YjE6OGE6\nZmM6OWE6YmE6YjU6YmM6ODM6ZTc6NWU6NDE6NmY6ZjI6NzM6OTU6NTg6MGM6ZGIw\nWQYDVR0RBFIwUIZOc3BpZmZlOi8vMTExMTExMTEtMjIyMi0zMzMzLTQ0NDQtNTU1\nNTU1NTU1NTU1LmNvbnN1bC9ucy9kZWZhdWx0L2RjL2RjMS9zdmMvd2ViMAoGCCqG\nSM49BAMCA0gAMEUCIGC3TTvvjj76KMrguVyFf4tjOqaSCRie3nmHMRNNRav7AiEA\npY0heYeK9A6iOLrzqxSerkXXQyj5e9bE4VgUnxgPU6g=\n-----END CERTIFICATE-----\n" }, - "privateKey": { - "inlineString": "-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEIMoTkpRggp3fqZzFKh82yS4LjtJI+XY+qX/7DefHFrtdoAoGCCqGSM49\nAwEHoUQDQgAEADPv1RHVNRfa2VKRAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Fav\nq5E0ivpNtv1QnFhxtPd7d5k4e+T7SkW1TQ==\n-----END EC PRIVATE KEY-----\n" + "privateKey": { + "inlineString": "-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEIMoTkpRggp3fqZzFKh82yS4LjtJI+XY+qX/7DefHFrtdoAoGCCqGSM49\nAwEHoUQDQgAEADPv1RHVNRfa2VKRAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Fav\nq5E0ivpNtv1QnFhxtPd7d5k4e+T7SkW1TQ==\n-----END EC PRIVATE KEY-----\n" } } ], - "validationContext": { - "trustedCa": { - "inlineString": "-----BEGIN CERTIFICATE-----\nMIICXDCCAgKgAwIBAgIICpZq70Z9LyUwCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowFDESMBAG\nA1UEAxMJVGVzdCBDQSAyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEIhywH1gx\nAsMwuF3ukAI5YL2jFxH6Usnma1HFSfVyxbXX1/uoZEYrj8yCAtdU2yoHETyd+Zx2\nThhRLP79pYegCaOCATwwggE4MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTAD\nAQH/MGgGA1UdDgRhBF9kMToxMToxMTphYzoyYTpiYTo5NzpiMjozZjphYzo3Yjpi\nZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1ZTo0MTo2ZjpmMjo3\nMzo5NTo1ODowYzpkYjBqBgNVHSMEYzBhgF9kMToxMToxMTphYzoyYTpiYTo5Nzpi\nMjozZjphYzo3YjpiZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1\nZTo0MTo2ZjpmMjo3Mzo5NTo1ODowYzpkYjA/BgNVHREEODA2hjRzcGlmZmU6Ly8x\nMTExMTExMS0yMjIyLTMzMzMtNDQ0NC01NTU1NTU1NTU1NTUuY29uc3VsMAoGCCqG\nSM49BAMCA0gAMEUCICOY0i246rQHJt8o8Oya0D5PLL1FnmsQmQqIGCi31RwnAiEA\noR5f6Ku+cig2Il8T8LJujOp2/2A72QcHZA57B13y+8o=\n-----END CERTIFICATE-----\n" + "validationContext": { + "trustedCa": { + "inlineString": "-----BEGIN CERTIFICATE-----\nMIICXDCCAgKgAwIBAgIICpZq70Z9LyUwCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowFDESMBAG\nA1UEAxMJVGVzdCBDQSAyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEIhywH1gx\nAsMwuF3ukAI5YL2jFxH6Usnma1HFSfVyxbXX1/uoZEYrj8yCAtdU2yoHETyd+Zx2\nThhRLP79pYegCaOCATwwggE4MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTAD\nAQH/MGgGA1UdDgRhBF9kMToxMToxMTphYzoyYTpiYTo5NzpiMjozZjphYzo3Yjpi\nZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1ZTo0MTo2ZjpmMjo3\nMzo5NTo1ODowYzpkYjBqBgNVHSMEYzBhgF9kMToxMToxMTphYzoyYTpiYTo5Nzpi\nMjozZjphYzo3YjpiZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1\nZTo0MTo2ZjpmMjo3Mzo5NTo1ODowYzpkYjA/BgNVHREEODA2hjRzcGlmZmU6Ly8x\nMTExMTExMS0yMjIyLTMzMzMtNDQ0NC01NTU1NTU1NTU1NTUuY29uc3VsMAoGCCqG\nSM49BAMCA0gAMEUCICOY0i246rQHJt8o8Oya0D5PLL1FnmsQmQqIGCi31RwnAiEA\noR5f6Ku+cig2Il8T8LJujOp2/2A72QcHZA57B13y+8o=\n-----END CERTIFICATE-----\n" }, - "matchSubjectAltNames": [ + "matchSubjectAltNames": [ { - "exact": "spiffe://11111111-2222-3333-4444-555555555555.consul/ns/default/dc/dc3/svc/db" + "exact": "spiffe://11111111-2222-3333-4444-555555555555.consul/ns/default/dc/dc3/svc/db" } ] } }, - "sni": "db.default.dc3.internal.11111111-2222-3333-4444-555555555555.consul" + "sni": "db.default.dc3.internal.11111111-2222-3333-4444-555555555555.consul" } } } ], - "typeUrl": "type.googleapis.com/envoy.config.cluster.v3.Cluster", - "nonce": "00000001" + "typeUrl": "type.googleapis.com/envoy.config.cluster.v3.Cluster", + "nonce": "00000001" } \ No newline at end of file diff --git a/agent/xds/testdata/clusters/ingress-with-tcp-chain-double-failover-through-remote-gateway-triggered.latest.golden b/agent/xds/testdata/clusters/ingress-with-tcp-chain-double-failover-through-remote-gateway-triggered.latest.golden index 5c4efef3d72..316328604f5 100644 --- a/agent/xds/testdata/clusters/ingress-with-tcp-chain-double-failover-through-remote-gateway-triggered.latest.golden +++ b/agent/xds/testdata/clusters/ingress-with-tcp-chain-double-failover-through-remote-gateway-triggered.latest.golden @@ -1,202 +1,170 @@ { - "versionInfo": "00000001", - "resources": [ + "versionInfo": "00000001", + "resources": [ { - "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", - "name": "db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", - "altStatName": "db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", - "clusterType": { - "name": "envoy.clusters.aggregate", - "typedConfig": { - "@type": "type.googleapis.com/envoy.extensions.clusters.aggregate.v3.ClusterConfig", - "clusters": [ - "failover-target~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", - "failover-target~db.default.dc2.internal.11111111-2222-3333-4444-555555555555.consul", - "failover-target~db.default.dc3.internal.11111111-2222-3333-4444-555555555555.consul" + "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", + "name": "db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "altStatName": "db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "clusterType": { + "name": "envoy.clusters.aggregate", + "typedConfig": { + "@type": "type.googleapis.com/envoy.extensions.clusters.aggregate.v3.ClusterConfig", + "clusters": [ + "failover-target~0~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "failover-target~1~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "failover-target~2~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul" ] } }, - "connectTimeout": "33s", - "lbPolicy": "CLUSTER_PROVIDED", - "outlierDetection": { - - } + "connectTimeout": "33s", + "lbPolicy": "CLUSTER_PROVIDED", + "outlierDetection": {} }, { - "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", - "name": "failover-target~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", - "altStatName": "failover-target~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", - "type": "EDS", - "edsClusterConfig": { - "edsConfig": { - "ads": { - - }, - "resourceApiVersion": "V3" + "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", + "name": "failover-target~0~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "altStatName": "failover-target~0~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "type": "EDS", + "edsClusterConfig": { + "edsConfig": { + "ads": {}, + "resourceApiVersion": "V3" } }, - "connectTimeout": "33s", - "circuitBreakers": { - + "connectTimeout": "33s", + "circuitBreakers": {}, + "outlierDetection": {}, + "commonLbConfig": { + "healthyPanicThreshold": {} }, - "outlierDetection": { - - }, - "commonLbConfig": { - "healthyPanicThreshold": { - - } - }, - "transportSocket": { - "name": "tls", - "typedConfig": { - "@type": "type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext", - "commonTlsContext": { - "tlsParams": { - - }, - "tlsCertificates": [ + "transportSocket": { + "name": "tls", + "typedConfig": { + "@type": "type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext", + "commonTlsContext": { + "tlsParams": {}, + "tlsCertificates": [ { - "certificateChain": { - "inlineString": "-----BEGIN CERTIFICATE-----\nMIICjDCCAjKgAwIBAgIIC5llxGV1gB8wCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowDjEMMAoG\nA1UEAxMDd2ViMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEADPv1RHVNRfa2VKR\nAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Favq5E0ivpNtv1QnFhxtPd7d5k4e+T7\nSkW1TaOCAXIwggFuMA4GA1UdDwEB/wQEAwIDuDAdBgNVHSUEFjAUBggrBgEFBQcD\nAgYIKwYBBQUHAwEwDAYDVR0TAQH/BAIwADBoBgNVHQ4EYQRfN2Q6MDc6ODc6M2E6\nNDA6MTk6NDc6YzM6NWE6YzA6YmE6NjI6ZGY6YWY6NGI6ZDQ6MDU6MjU6NzY6M2Q6\nNWE6OGQ6MTY6OGQ6Njc6NWU6MmU6YTA6MzQ6N2Q6ZGM6ZmYwagYDVR0jBGMwYYBf\nZDE6MTE6MTE6YWM6MmE6YmE6OTc6YjI6M2Y6YWM6N2I6YmQ6ZGE6YmU6YjE6OGE6\nZmM6OWE6YmE6YjU6YmM6ODM6ZTc6NWU6NDE6NmY6ZjI6NzM6OTU6NTg6MGM6ZGIw\nWQYDVR0RBFIwUIZOc3BpZmZlOi8vMTExMTExMTEtMjIyMi0zMzMzLTQ0NDQtNTU1\nNTU1NTU1NTU1LmNvbnN1bC9ucy9kZWZhdWx0L2RjL2RjMS9zdmMvd2ViMAoGCCqG\nSM49BAMCA0gAMEUCIGC3TTvvjj76KMrguVyFf4tjOqaSCRie3nmHMRNNRav7AiEA\npY0heYeK9A6iOLrzqxSerkXXQyj5e9bE4VgUnxgPU6g=\n-----END CERTIFICATE-----\n" + "certificateChain": { + "inlineString": "-----BEGIN CERTIFICATE-----\nMIICjDCCAjKgAwIBAgIIC5llxGV1gB8wCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowDjEMMAoG\nA1UEAxMDd2ViMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEADPv1RHVNRfa2VKR\nAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Favq5E0ivpNtv1QnFhxtPd7d5k4e+T7\nSkW1TaOCAXIwggFuMA4GA1UdDwEB/wQEAwIDuDAdBgNVHSUEFjAUBggrBgEFBQcD\nAgYIKwYBBQUHAwEwDAYDVR0TAQH/BAIwADBoBgNVHQ4EYQRfN2Q6MDc6ODc6M2E6\nNDA6MTk6NDc6YzM6NWE6YzA6YmE6NjI6ZGY6YWY6NGI6ZDQ6MDU6MjU6NzY6M2Q6\nNWE6OGQ6MTY6OGQ6Njc6NWU6MmU6YTA6MzQ6N2Q6ZGM6ZmYwagYDVR0jBGMwYYBf\nZDE6MTE6MTE6YWM6MmE6YmE6OTc6YjI6M2Y6YWM6N2I6YmQ6ZGE6YmU6YjE6OGE6\nZmM6OWE6YmE6YjU6YmM6ODM6ZTc6NWU6NDE6NmY6ZjI6NzM6OTU6NTg6MGM6ZGIw\nWQYDVR0RBFIwUIZOc3BpZmZlOi8vMTExMTExMTEtMjIyMi0zMzMzLTQ0NDQtNTU1\nNTU1NTU1NTU1LmNvbnN1bC9ucy9kZWZhdWx0L2RjL2RjMS9zdmMvd2ViMAoGCCqG\nSM49BAMCA0gAMEUCIGC3TTvvjj76KMrguVyFf4tjOqaSCRie3nmHMRNNRav7AiEA\npY0heYeK9A6iOLrzqxSerkXXQyj5e9bE4VgUnxgPU6g=\n-----END CERTIFICATE-----\n" }, - "privateKey": { - "inlineString": "-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEIMoTkpRggp3fqZzFKh82yS4LjtJI+XY+qX/7DefHFrtdoAoGCCqGSM49\nAwEHoUQDQgAEADPv1RHVNRfa2VKRAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Fav\nq5E0ivpNtv1QnFhxtPd7d5k4e+T7SkW1TQ==\n-----END EC PRIVATE KEY-----\n" + "privateKey": { + "inlineString": "-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEIMoTkpRggp3fqZzFKh82yS4LjtJI+XY+qX/7DefHFrtdoAoGCCqGSM49\nAwEHoUQDQgAEADPv1RHVNRfa2VKRAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Fav\nq5E0ivpNtv1QnFhxtPd7d5k4e+T7SkW1TQ==\n-----END EC PRIVATE KEY-----\n" } } ], - "validationContext": { - "trustedCa": { - "inlineString": "-----BEGIN CERTIFICATE-----\nMIICXDCCAgKgAwIBAgIICpZq70Z9LyUwCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowFDESMBAG\nA1UEAxMJVGVzdCBDQSAyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEIhywH1gx\nAsMwuF3ukAI5YL2jFxH6Usnma1HFSfVyxbXX1/uoZEYrj8yCAtdU2yoHETyd+Zx2\nThhRLP79pYegCaOCATwwggE4MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTAD\nAQH/MGgGA1UdDgRhBF9kMToxMToxMTphYzoyYTpiYTo5NzpiMjozZjphYzo3Yjpi\nZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1ZTo0MTo2ZjpmMjo3\nMzo5NTo1ODowYzpkYjBqBgNVHSMEYzBhgF9kMToxMToxMTphYzoyYTpiYTo5Nzpi\nMjozZjphYzo3YjpiZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1\nZTo0MTo2ZjpmMjo3Mzo5NTo1ODowYzpkYjA/BgNVHREEODA2hjRzcGlmZmU6Ly8x\nMTExMTExMS0yMjIyLTMzMzMtNDQ0NC01NTU1NTU1NTU1NTUuY29uc3VsMAoGCCqG\nSM49BAMCA0gAMEUCICOY0i246rQHJt8o8Oya0D5PLL1FnmsQmQqIGCi31RwnAiEA\noR5f6Ku+cig2Il8T8LJujOp2/2A72QcHZA57B13y+8o=\n-----END CERTIFICATE-----\n" + "validationContext": { + "trustedCa": { + "inlineString": "-----BEGIN CERTIFICATE-----\nMIICXDCCAgKgAwIBAgIICpZq70Z9LyUwCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowFDESMBAG\nA1UEAxMJVGVzdCBDQSAyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEIhywH1gx\nAsMwuF3ukAI5YL2jFxH6Usnma1HFSfVyxbXX1/uoZEYrj8yCAtdU2yoHETyd+Zx2\nThhRLP79pYegCaOCATwwggE4MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTAD\nAQH/MGgGA1UdDgRhBF9kMToxMToxMTphYzoyYTpiYTo5NzpiMjozZjphYzo3Yjpi\nZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1ZTo0MTo2ZjpmMjo3\nMzo5NTo1ODowYzpkYjBqBgNVHSMEYzBhgF9kMToxMToxMTphYzoyYTpiYTo5Nzpi\nMjozZjphYzo3YjpiZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1\nZTo0MTo2ZjpmMjo3Mzo5NTo1ODowYzpkYjA/BgNVHREEODA2hjRzcGlmZmU6Ly8x\nMTExMTExMS0yMjIyLTMzMzMtNDQ0NC01NTU1NTU1NTU1NTUuY29uc3VsMAoGCCqG\nSM49BAMCA0gAMEUCICOY0i246rQHJt8o8Oya0D5PLL1FnmsQmQqIGCi31RwnAiEA\noR5f6Ku+cig2Il8T8LJujOp2/2A72QcHZA57B13y+8o=\n-----END CERTIFICATE-----\n" }, - "matchSubjectAltNames": [ + "matchSubjectAltNames": [ { - "exact": "spiffe://11111111-2222-3333-4444-555555555555.consul/ns/default/dc/dc1/svc/db" + "exact": "spiffe://11111111-2222-3333-4444-555555555555.consul/ns/default/dc/dc1/svc/db" } ] } }, - "sni": "db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul" + "sni": "db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul" } } }, { - "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", - "name": "failover-target~db.default.dc2.internal.11111111-2222-3333-4444-555555555555.consul", - "altStatName": "failover-target~db.default.dc2.internal.11111111-2222-3333-4444-555555555555.consul", - "type": "EDS", - "edsClusterConfig": { - "edsConfig": { - "ads": { - - }, - "resourceApiVersion": "V3" + "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", + "name": "failover-target~1~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "altStatName": "failover-target~1~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "type": "EDS", + "edsClusterConfig": { + "edsConfig": { + "ads": {}, + "resourceApiVersion": "V3" } }, - "connectTimeout": "33s", - "circuitBreakers": { - - }, - "outlierDetection": { - + "connectTimeout": "33s", + "circuitBreakers": {}, + "outlierDetection": {}, + "commonLbConfig": { + "healthyPanicThreshold": {} }, - "commonLbConfig": { - "healthyPanicThreshold": { - - } - }, - "transportSocket": { - "name": "tls", - "typedConfig": { - "@type": "type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext", - "commonTlsContext": { - "tlsParams": { - - }, - "tlsCertificates": [ + "transportSocket": { + "name": "tls", + "typedConfig": { + "@type": "type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext", + "commonTlsContext": { + "tlsParams": {}, + "tlsCertificates": [ { - "certificateChain": { - "inlineString": "-----BEGIN CERTIFICATE-----\nMIICjDCCAjKgAwIBAgIIC5llxGV1gB8wCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowDjEMMAoG\nA1UEAxMDd2ViMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEADPv1RHVNRfa2VKR\nAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Favq5E0ivpNtv1QnFhxtPd7d5k4e+T7\nSkW1TaOCAXIwggFuMA4GA1UdDwEB/wQEAwIDuDAdBgNVHSUEFjAUBggrBgEFBQcD\nAgYIKwYBBQUHAwEwDAYDVR0TAQH/BAIwADBoBgNVHQ4EYQRfN2Q6MDc6ODc6M2E6\nNDA6MTk6NDc6YzM6NWE6YzA6YmE6NjI6ZGY6YWY6NGI6ZDQ6MDU6MjU6NzY6M2Q6\nNWE6OGQ6MTY6OGQ6Njc6NWU6MmU6YTA6MzQ6N2Q6ZGM6ZmYwagYDVR0jBGMwYYBf\nZDE6MTE6MTE6YWM6MmE6YmE6OTc6YjI6M2Y6YWM6N2I6YmQ6ZGE6YmU6YjE6OGE6\nZmM6OWE6YmE6YjU6YmM6ODM6ZTc6NWU6NDE6NmY6ZjI6NzM6OTU6NTg6MGM6ZGIw\nWQYDVR0RBFIwUIZOc3BpZmZlOi8vMTExMTExMTEtMjIyMi0zMzMzLTQ0NDQtNTU1\nNTU1NTU1NTU1LmNvbnN1bC9ucy9kZWZhdWx0L2RjL2RjMS9zdmMvd2ViMAoGCCqG\nSM49BAMCA0gAMEUCIGC3TTvvjj76KMrguVyFf4tjOqaSCRie3nmHMRNNRav7AiEA\npY0heYeK9A6iOLrzqxSerkXXQyj5e9bE4VgUnxgPU6g=\n-----END CERTIFICATE-----\n" + "certificateChain": { + "inlineString": "-----BEGIN CERTIFICATE-----\nMIICjDCCAjKgAwIBAgIIC5llxGV1gB8wCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowDjEMMAoG\nA1UEAxMDd2ViMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEADPv1RHVNRfa2VKR\nAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Favq5E0ivpNtv1QnFhxtPd7d5k4e+T7\nSkW1TaOCAXIwggFuMA4GA1UdDwEB/wQEAwIDuDAdBgNVHSUEFjAUBggrBgEFBQcD\nAgYIKwYBBQUHAwEwDAYDVR0TAQH/BAIwADBoBgNVHQ4EYQRfN2Q6MDc6ODc6M2E6\nNDA6MTk6NDc6YzM6NWE6YzA6YmE6NjI6ZGY6YWY6NGI6ZDQ6MDU6MjU6NzY6M2Q6\nNWE6OGQ6MTY6OGQ6Njc6NWU6MmU6YTA6MzQ6N2Q6ZGM6ZmYwagYDVR0jBGMwYYBf\nZDE6MTE6MTE6YWM6MmE6YmE6OTc6YjI6M2Y6YWM6N2I6YmQ6ZGE6YmU6YjE6OGE6\nZmM6OWE6YmE6YjU6YmM6ODM6ZTc6NWU6NDE6NmY6ZjI6NzM6OTU6NTg6MGM6ZGIw\nWQYDVR0RBFIwUIZOc3BpZmZlOi8vMTExMTExMTEtMjIyMi0zMzMzLTQ0NDQtNTU1\nNTU1NTU1NTU1LmNvbnN1bC9ucy9kZWZhdWx0L2RjL2RjMS9zdmMvd2ViMAoGCCqG\nSM49BAMCA0gAMEUCIGC3TTvvjj76KMrguVyFf4tjOqaSCRie3nmHMRNNRav7AiEA\npY0heYeK9A6iOLrzqxSerkXXQyj5e9bE4VgUnxgPU6g=\n-----END CERTIFICATE-----\n" }, - "privateKey": { - "inlineString": "-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEIMoTkpRggp3fqZzFKh82yS4LjtJI+XY+qX/7DefHFrtdoAoGCCqGSM49\nAwEHoUQDQgAEADPv1RHVNRfa2VKRAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Fav\nq5E0ivpNtv1QnFhxtPd7d5k4e+T7SkW1TQ==\n-----END EC PRIVATE KEY-----\n" + "privateKey": { + "inlineString": "-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEIMoTkpRggp3fqZzFKh82yS4LjtJI+XY+qX/7DefHFrtdoAoGCCqGSM49\nAwEHoUQDQgAEADPv1RHVNRfa2VKRAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Fav\nq5E0ivpNtv1QnFhxtPd7d5k4e+T7SkW1TQ==\n-----END EC PRIVATE KEY-----\n" } } ], - "validationContext": { - "trustedCa": { - "inlineString": "-----BEGIN CERTIFICATE-----\nMIICXDCCAgKgAwIBAgIICpZq70Z9LyUwCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowFDESMBAG\nA1UEAxMJVGVzdCBDQSAyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEIhywH1gx\nAsMwuF3ukAI5YL2jFxH6Usnma1HFSfVyxbXX1/uoZEYrj8yCAtdU2yoHETyd+Zx2\nThhRLP79pYegCaOCATwwggE4MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTAD\nAQH/MGgGA1UdDgRhBF9kMToxMToxMTphYzoyYTpiYTo5NzpiMjozZjphYzo3Yjpi\nZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1ZTo0MTo2ZjpmMjo3\nMzo5NTo1ODowYzpkYjBqBgNVHSMEYzBhgF9kMToxMToxMTphYzoyYTpiYTo5Nzpi\nMjozZjphYzo3YjpiZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1\nZTo0MTo2ZjpmMjo3Mzo5NTo1ODowYzpkYjA/BgNVHREEODA2hjRzcGlmZmU6Ly8x\nMTExMTExMS0yMjIyLTMzMzMtNDQ0NC01NTU1NTU1NTU1NTUuY29uc3VsMAoGCCqG\nSM49BAMCA0gAMEUCICOY0i246rQHJt8o8Oya0D5PLL1FnmsQmQqIGCi31RwnAiEA\noR5f6Ku+cig2Il8T8LJujOp2/2A72QcHZA57B13y+8o=\n-----END CERTIFICATE-----\n" + "validationContext": { + "trustedCa": { + "inlineString": "-----BEGIN CERTIFICATE-----\nMIICXDCCAgKgAwIBAgIICpZq70Z9LyUwCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowFDESMBAG\nA1UEAxMJVGVzdCBDQSAyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEIhywH1gx\nAsMwuF3ukAI5YL2jFxH6Usnma1HFSfVyxbXX1/uoZEYrj8yCAtdU2yoHETyd+Zx2\nThhRLP79pYegCaOCATwwggE4MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTAD\nAQH/MGgGA1UdDgRhBF9kMToxMToxMTphYzoyYTpiYTo5NzpiMjozZjphYzo3Yjpi\nZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1ZTo0MTo2ZjpmMjo3\nMzo5NTo1ODowYzpkYjBqBgNVHSMEYzBhgF9kMToxMToxMTphYzoyYTpiYTo5Nzpi\nMjozZjphYzo3YjpiZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1\nZTo0MTo2ZjpmMjo3Mzo5NTo1ODowYzpkYjA/BgNVHREEODA2hjRzcGlmZmU6Ly8x\nMTExMTExMS0yMjIyLTMzMzMtNDQ0NC01NTU1NTU1NTU1NTUuY29uc3VsMAoGCCqG\nSM49BAMCA0gAMEUCICOY0i246rQHJt8o8Oya0D5PLL1FnmsQmQqIGCi31RwnAiEA\noR5f6Ku+cig2Il8T8LJujOp2/2A72QcHZA57B13y+8o=\n-----END CERTIFICATE-----\n" }, - "matchSubjectAltNames": [ + "matchSubjectAltNames": [ { - "exact": "spiffe://11111111-2222-3333-4444-555555555555.consul/ns/default/dc/dc2/svc/db" + "exact": "spiffe://11111111-2222-3333-4444-555555555555.consul/ns/default/dc/dc2/svc/db" } ] } }, - "sni": "db.default.dc2.internal.11111111-2222-3333-4444-555555555555.consul" + "sni": "db.default.dc2.internal.11111111-2222-3333-4444-555555555555.consul" } } }, { - "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", - "name": "failover-target~db.default.dc3.internal.11111111-2222-3333-4444-555555555555.consul", - "altStatName": "failover-target~db.default.dc3.internal.11111111-2222-3333-4444-555555555555.consul", - "type": "EDS", - "edsClusterConfig": { - "edsConfig": { - "ads": { - - }, - "resourceApiVersion": "V3" + "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", + "name": "failover-target~2~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "altStatName": "failover-target~2~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "type": "EDS", + "edsClusterConfig": { + "edsConfig": { + "ads": {}, + "resourceApiVersion": "V3" } }, - "connectTimeout": "33s", - "circuitBreakers": { - - }, - "outlierDetection": { - - }, - "commonLbConfig": { - "healthyPanicThreshold": { - - } + "connectTimeout": "33s", + "circuitBreakers": {}, + "outlierDetection": {}, + "commonLbConfig": { + "healthyPanicThreshold": {} }, - "transportSocket": { - "name": "tls", - "typedConfig": { - "@type": "type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext", - "commonTlsContext": { - "tlsParams": { - - }, - "tlsCertificates": [ + "transportSocket": { + "name": "tls", + "typedConfig": { + "@type": "type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext", + "commonTlsContext": { + "tlsParams": {}, + "tlsCertificates": [ { - "certificateChain": { - "inlineString": "-----BEGIN CERTIFICATE-----\nMIICjDCCAjKgAwIBAgIIC5llxGV1gB8wCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowDjEMMAoG\nA1UEAxMDd2ViMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEADPv1RHVNRfa2VKR\nAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Favq5E0ivpNtv1QnFhxtPd7d5k4e+T7\nSkW1TaOCAXIwggFuMA4GA1UdDwEB/wQEAwIDuDAdBgNVHSUEFjAUBggrBgEFBQcD\nAgYIKwYBBQUHAwEwDAYDVR0TAQH/BAIwADBoBgNVHQ4EYQRfN2Q6MDc6ODc6M2E6\nNDA6MTk6NDc6YzM6NWE6YzA6YmE6NjI6ZGY6YWY6NGI6ZDQ6MDU6MjU6NzY6M2Q6\nNWE6OGQ6MTY6OGQ6Njc6NWU6MmU6YTA6MzQ6N2Q6ZGM6ZmYwagYDVR0jBGMwYYBf\nZDE6MTE6MTE6YWM6MmE6YmE6OTc6YjI6M2Y6YWM6N2I6YmQ6ZGE6YmU6YjE6OGE6\nZmM6OWE6YmE6YjU6YmM6ODM6ZTc6NWU6NDE6NmY6ZjI6NzM6OTU6NTg6MGM6ZGIw\nWQYDVR0RBFIwUIZOc3BpZmZlOi8vMTExMTExMTEtMjIyMi0zMzMzLTQ0NDQtNTU1\nNTU1NTU1NTU1LmNvbnN1bC9ucy9kZWZhdWx0L2RjL2RjMS9zdmMvd2ViMAoGCCqG\nSM49BAMCA0gAMEUCIGC3TTvvjj76KMrguVyFf4tjOqaSCRie3nmHMRNNRav7AiEA\npY0heYeK9A6iOLrzqxSerkXXQyj5e9bE4VgUnxgPU6g=\n-----END CERTIFICATE-----\n" + "certificateChain": { + "inlineString": "-----BEGIN CERTIFICATE-----\nMIICjDCCAjKgAwIBAgIIC5llxGV1gB8wCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowDjEMMAoG\nA1UEAxMDd2ViMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEADPv1RHVNRfa2VKR\nAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Favq5E0ivpNtv1QnFhxtPd7d5k4e+T7\nSkW1TaOCAXIwggFuMA4GA1UdDwEB/wQEAwIDuDAdBgNVHSUEFjAUBggrBgEFBQcD\nAgYIKwYBBQUHAwEwDAYDVR0TAQH/BAIwADBoBgNVHQ4EYQRfN2Q6MDc6ODc6M2E6\nNDA6MTk6NDc6YzM6NWE6YzA6YmE6NjI6ZGY6YWY6NGI6ZDQ6MDU6MjU6NzY6M2Q6\nNWE6OGQ6MTY6OGQ6Njc6NWU6MmU6YTA6MzQ6N2Q6ZGM6ZmYwagYDVR0jBGMwYYBf\nZDE6MTE6MTE6YWM6MmE6YmE6OTc6YjI6M2Y6YWM6N2I6YmQ6ZGE6YmU6YjE6OGE6\nZmM6OWE6YmE6YjU6YmM6ODM6ZTc6NWU6NDE6NmY6ZjI6NzM6OTU6NTg6MGM6ZGIw\nWQYDVR0RBFIwUIZOc3BpZmZlOi8vMTExMTExMTEtMjIyMi0zMzMzLTQ0NDQtNTU1\nNTU1NTU1NTU1LmNvbnN1bC9ucy9kZWZhdWx0L2RjL2RjMS9zdmMvd2ViMAoGCCqG\nSM49BAMCA0gAMEUCIGC3TTvvjj76KMrguVyFf4tjOqaSCRie3nmHMRNNRav7AiEA\npY0heYeK9A6iOLrzqxSerkXXQyj5e9bE4VgUnxgPU6g=\n-----END CERTIFICATE-----\n" }, - "privateKey": { - "inlineString": "-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEIMoTkpRggp3fqZzFKh82yS4LjtJI+XY+qX/7DefHFrtdoAoGCCqGSM49\nAwEHoUQDQgAEADPv1RHVNRfa2VKRAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Fav\nq5E0ivpNtv1QnFhxtPd7d5k4e+T7SkW1TQ==\n-----END EC PRIVATE KEY-----\n" + "privateKey": { + "inlineString": "-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEIMoTkpRggp3fqZzFKh82yS4LjtJI+XY+qX/7DefHFrtdoAoGCCqGSM49\nAwEHoUQDQgAEADPv1RHVNRfa2VKRAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Fav\nq5E0ivpNtv1QnFhxtPd7d5k4e+T7SkW1TQ==\n-----END EC PRIVATE KEY-----\n" } } ], - "validationContext": { - "trustedCa": { - "inlineString": "-----BEGIN CERTIFICATE-----\nMIICXDCCAgKgAwIBAgIICpZq70Z9LyUwCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowFDESMBAG\nA1UEAxMJVGVzdCBDQSAyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEIhywH1gx\nAsMwuF3ukAI5YL2jFxH6Usnma1HFSfVyxbXX1/uoZEYrj8yCAtdU2yoHETyd+Zx2\nThhRLP79pYegCaOCATwwggE4MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTAD\nAQH/MGgGA1UdDgRhBF9kMToxMToxMTphYzoyYTpiYTo5NzpiMjozZjphYzo3Yjpi\nZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1ZTo0MTo2ZjpmMjo3\nMzo5NTo1ODowYzpkYjBqBgNVHSMEYzBhgF9kMToxMToxMTphYzoyYTpiYTo5Nzpi\nMjozZjphYzo3YjpiZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1\nZTo0MTo2ZjpmMjo3Mzo5NTo1ODowYzpkYjA/BgNVHREEODA2hjRzcGlmZmU6Ly8x\nMTExMTExMS0yMjIyLTMzMzMtNDQ0NC01NTU1NTU1NTU1NTUuY29uc3VsMAoGCCqG\nSM49BAMCA0gAMEUCICOY0i246rQHJt8o8Oya0D5PLL1FnmsQmQqIGCi31RwnAiEA\noR5f6Ku+cig2Il8T8LJujOp2/2A72QcHZA57B13y+8o=\n-----END CERTIFICATE-----\n" + "validationContext": { + "trustedCa": { + "inlineString": "-----BEGIN CERTIFICATE-----\nMIICXDCCAgKgAwIBAgIICpZq70Z9LyUwCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowFDESMBAG\nA1UEAxMJVGVzdCBDQSAyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEIhywH1gx\nAsMwuF3ukAI5YL2jFxH6Usnma1HFSfVyxbXX1/uoZEYrj8yCAtdU2yoHETyd+Zx2\nThhRLP79pYegCaOCATwwggE4MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTAD\nAQH/MGgGA1UdDgRhBF9kMToxMToxMTphYzoyYTpiYTo5NzpiMjozZjphYzo3Yjpi\nZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1ZTo0MTo2ZjpmMjo3\nMzo5NTo1ODowYzpkYjBqBgNVHSMEYzBhgF9kMToxMToxMTphYzoyYTpiYTo5Nzpi\nMjozZjphYzo3YjpiZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1\nZTo0MTo2ZjpmMjo3Mzo5NTo1ODowYzpkYjA/BgNVHREEODA2hjRzcGlmZmU6Ly8x\nMTExMTExMS0yMjIyLTMzMzMtNDQ0NC01NTU1NTU1NTU1NTUuY29uc3VsMAoGCCqG\nSM49BAMCA0gAMEUCICOY0i246rQHJt8o8Oya0D5PLL1FnmsQmQqIGCi31RwnAiEA\noR5f6Ku+cig2Il8T8LJujOp2/2A72QcHZA57B13y+8o=\n-----END CERTIFICATE-----\n" }, - "matchSubjectAltNames": [ + "matchSubjectAltNames": [ { - "exact": "spiffe://11111111-2222-3333-4444-555555555555.consul/ns/default/dc/dc3/svc/db" + "exact": "spiffe://11111111-2222-3333-4444-555555555555.consul/ns/default/dc/dc3/svc/db" } ] } }, - "sni": "db.default.dc3.internal.11111111-2222-3333-4444-555555555555.consul" + "sni": "db.default.dc3.internal.11111111-2222-3333-4444-555555555555.consul" } } } ], - "typeUrl": "type.googleapis.com/envoy.config.cluster.v3.Cluster", - "nonce": "00000001" + "typeUrl": "type.googleapis.com/envoy.config.cluster.v3.Cluster", + "nonce": "00000001" } \ No newline at end of file diff --git a/agent/xds/testdata/clusters/ingress-with-tcp-chain-double-failover-through-remote-gateway.latest.golden b/agent/xds/testdata/clusters/ingress-with-tcp-chain-double-failover-through-remote-gateway.latest.golden index 5c4efef3d72..316328604f5 100644 --- a/agent/xds/testdata/clusters/ingress-with-tcp-chain-double-failover-through-remote-gateway.latest.golden +++ b/agent/xds/testdata/clusters/ingress-with-tcp-chain-double-failover-through-remote-gateway.latest.golden @@ -1,202 +1,170 @@ { - "versionInfo": "00000001", - "resources": [ + "versionInfo": "00000001", + "resources": [ { - "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", - "name": "db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", - "altStatName": "db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", - "clusterType": { - "name": "envoy.clusters.aggregate", - "typedConfig": { - "@type": "type.googleapis.com/envoy.extensions.clusters.aggregate.v3.ClusterConfig", - "clusters": [ - "failover-target~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", - "failover-target~db.default.dc2.internal.11111111-2222-3333-4444-555555555555.consul", - "failover-target~db.default.dc3.internal.11111111-2222-3333-4444-555555555555.consul" + "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", + "name": "db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "altStatName": "db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "clusterType": { + "name": "envoy.clusters.aggregate", + "typedConfig": { + "@type": "type.googleapis.com/envoy.extensions.clusters.aggregate.v3.ClusterConfig", + "clusters": [ + "failover-target~0~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "failover-target~1~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "failover-target~2~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul" ] } }, - "connectTimeout": "33s", - "lbPolicy": "CLUSTER_PROVIDED", - "outlierDetection": { - - } + "connectTimeout": "33s", + "lbPolicy": "CLUSTER_PROVIDED", + "outlierDetection": {} }, { - "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", - "name": "failover-target~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", - "altStatName": "failover-target~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", - "type": "EDS", - "edsClusterConfig": { - "edsConfig": { - "ads": { - - }, - "resourceApiVersion": "V3" + "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", + "name": "failover-target~0~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "altStatName": "failover-target~0~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "type": "EDS", + "edsClusterConfig": { + "edsConfig": { + "ads": {}, + "resourceApiVersion": "V3" } }, - "connectTimeout": "33s", - "circuitBreakers": { - + "connectTimeout": "33s", + "circuitBreakers": {}, + "outlierDetection": {}, + "commonLbConfig": { + "healthyPanicThreshold": {} }, - "outlierDetection": { - - }, - "commonLbConfig": { - "healthyPanicThreshold": { - - } - }, - "transportSocket": { - "name": "tls", - "typedConfig": { - "@type": "type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext", - "commonTlsContext": { - "tlsParams": { - - }, - "tlsCertificates": [ + "transportSocket": { + "name": "tls", + "typedConfig": { + "@type": "type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext", + "commonTlsContext": { + "tlsParams": {}, + "tlsCertificates": [ { - "certificateChain": { - "inlineString": "-----BEGIN CERTIFICATE-----\nMIICjDCCAjKgAwIBAgIIC5llxGV1gB8wCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowDjEMMAoG\nA1UEAxMDd2ViMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEADPv1RHVNRfa2VKR\nAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Favq5E0ivpNtv1QnFhxtPd7d5k4e+T7\nSkW1TaOCAXIwggFuMA4GA1UdDwEB/wQEAwIDuDAdBgNVHSUEFjAUBggrBgEFBQcD\nAgYIKwYBBQUHAwEwDAYDVR0TAQH/BAIwADBoBgNVHQ4EYQRfN2Q6MDc6ODc6M2E6\nNDA6MTk6NDc6YzM6NWE6YzA6YmE6NjI6ZGY6YWY6NGI6ZDQ6MDU6MjU6NzY6M2Q6\nNWE6OGQ6MTY6OGQ6Njc6NWU6MmU6YTA6MzQ6N2Q6ZGM6ZmYwagYDVR0jBGMwYYBf\nZDE6MTE6MTE6YWM6MmE6YmE6OTc6YjI6M2Y6YWM6N2I6YmQ6ZGE6YmU6YjE6OGE6\nZmM6OWE6YmE6YjU6YmM6ODM6ZTc6NWU6NDE6NmY6ZjI6NzM6OTU6NTg6MGM6ZGIw\nWQYDVR0RBFIwUIZOc3BpZmZlOi8vMTExMTExMTEtMjIyMi0zMzMzLTQ0NDQtNTU1\nNTU1NTU1NTU1LmNvbnN1bC9ucy9kZWZhdWx0L2RjL2RjMS9zdmMvd2ViMAoGCCqG\nSM49BAMCA0gAMEUCIGC3TTvvjj76KMrguVyFf4tjOqaSCRie3nmHMRNNRav7AiEA\npY0heYeK9A6iOLrzqxSerkXXQyj5e9bE4VgUnxgPU6g=\n-----END CERTIFICATE-----\n" + "certificateChain": { + "inlineString": "-----BEGIN CERTIFICATE-----\nMIICjDCCAjKgAwIBAgIIC5llxGV1gB8wCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowDjEMMAoG\nA1UEAxMDd2ViMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEADPv1RHVNRfa2VKR\nAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Favq5E0ivpNtv1QnFhxtPd7d5k4e+T7\nSkW1TaOCAXIwggFuMA4GA1UdDwEB/wQEAwIDuDAdBgNVHSUEFjAUBggrBgEFBQcD\nAgYIKwYBBQUHAwEwDAYDVR0TAQH/BAIwADBoBgNVHQ4EYQRfN2Q6MDc6ODc6M2E6\nNDA6MTk6NDc6YzM6NWE6YzA6YmE6NjI6ZGY6YWY6NGI6ZDQ6MDU6MjU6NzY6M2Q6\nNWE6OGQ6MTY6OGQ6Njc6NWU6MmU6YTA6MzQ6N2Q6ZGM6ZmYwagYDVR0jBGMwYYBf\nZDE6MTE6MTE6YWM6MmE6YmE6OTc6YjI6M2Y6YWM6N2I6YmQ6ZGE6YmU6YjE6OGE6\nZmM6OWE6YmE6YjU6YmM6ODM6ZTc6NWU6NDE6NmY6ZjI6NzM6OTU6NTg6MGM6ZGIw\nWQYDVR0RBFIwUIZOc3BpZmZlOi8vMTExMTExMTEtMjIyMi0zMzMzLTQ0NDQtNTU1\nNTU1NTU1NTU1LmNvbnN1bC9ucy9kZWZhdWx0L2RjL2RjMS9zdmMvd2ViMAoGCCqG\nSM49BAMCA0gAMEUCIGC3TTvvjj76KMrguVyFf4tjOqaSCRie3nmHMRNNRav7AiEA\npY0heYeK9A6iOLrzqxSerkXXQyj5e9bE4VgUnxgPU6g=\n-----END CERTIFICATE-----\n" }, - "privateKey": { - "inlineString": "-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEIMoTkpRggp3fqZzFKh82yS4LjtJI+XY+qX/7DefHFrtdoAoGCCqGSM49\nAwEHoUQDQgAEADPv1RHVNRfa2VKRAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Fav\nq5E0ivpNtv1QnFhxtPd7d5k4e+T7SkW1TQ==\n-----END EC PRIVATE KEY-----\n" + "privateKey": { + "inlineString": "-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEIMoTkpRggp3fqZzFKh82yS4LjtJI+XY+qX/7DefHFrtdoAoGCCqGSM49\nAwEHoUQDQgAEADPv1RHVNRfa2VKRAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Fav\nq5E0ivpNtv1QnFhxtPd7d5k4e+T7SkW1TQ==\n-----END EC PRIVATE KEY-----\n" } } ], - "validationContext": { - "trustedCa": { - "inlineString": "-----BEGIN CERTIFICATE-----\nMIICXDCCAgKgAwIBAgIICpZq70Z9LyUwCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowFDESMBAG\nA1UEAxMJVGVzdCBDQSAyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEIhywH1gx\nAsMwuF3ukAI5YL2jFxH6Usnma1HFSfVyxbXX1/uoZEYrj8yCAtdU2yoHETyd+Zx2\nThhRLP79pYegCaOCATwwggE4MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTAD\nAQH/MGgGA1UdDgRhBF9kMToxMToxMTphYzoyYTpiYTo5NzpiMjozZjphYzo3Yjpi\nZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1ZTo0MTo2ZjpmMjo3\nMzo5NTo1ODowYzpkYjBqBgNVHSMEYzBhgF9kMToxMToxMTphYzoyYTpiYTo5Nzpi\nMjozZjphYzo3YjpiZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1\nZTo0MTo2ZjpmMjo3Mzo5NTo1ODowYzpkYjA/BgNVHREEODA2hjRzcGlmZmU6Ly8x\nMTExMTExMS0yMjIyLTMzMzMtNDQ0NC01NTU1NTU1NTU1NTUuY29uc3VsMAoGCCqG\nSM49BAMCA0gAMEUCICOY0i246rQHJt8o8Oya0D5PLL1FnmsQmQqIGCi31RwnAiEA\noR5f6Ku+cig2Il8T8LJujOp2/2A72QcHZA57B13y+8o=\n-----END CERTIFICATE-----\n" + "validationContext": { + "trustedCa": { + "inlineString": "-----BEGIN CERTIFICATE-----\nMIICXDCCAgKgAwIBAgIICpZq70Z9LyUwCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowFDESMBAG\nA1UEAxMJVGVzdCBDQSAyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEIhywH1gx\nAsMwuF3ukAI5YL2jFxH6Usnma1HFSfVyxbXX1/uoZEYrj8yCAtdU2yoHETyd+Zx2\nThhRLP79pYegCaOCATwwggE4MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTAD\nAQH/MGgGA1UdDgRhBF9kMToxMToxMTphYzoyYTpiYTo5NzpiMjozZjphYzo3Yjpi\nZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1ZTo0MTo2ZjpmMjo3\nMzo5NTo1ODowYzpkYjBqBgNVHSMEYzBhgF9kMToxMToxMTphYzoyYTpiYTo5Nzpi\nMjozZjphYzo3YjpiZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1\nZTo0MTo2ZjpmMjo3Mzo5NTo1ODowYzpkYjA/BgNVHREEODA2hjRzcGlmZmU6Ly8x\nMTExMTExMS0yMjIyLTMzMzMtNDQ0NC01NTU1NTU1NTU1NTUuY29uc3VsMAoGCCqG\nSM49BAMCA0gAMEUCICOY0i246rQHJt8o8Oya0D5PLL1FnmsQmQqIGCi31RwnAiEA\noR5f6Ku+cig2Il8T8LJujOp2/2A72QcHZA57B13y+8o=\n-----END CERTIFICATE-----\n" }, - "matchSubjectAltNames": [ + "matchSubjectAltNames": [ { - "exact": "spiffe://11111111-2222-3333-4444-555555555555.consul/ns/default/dc/dc1/svc/db" + "exact": "spiffe://11111111-2222-3333-4444-555555555555.consul/ns/default/dc/dc1/svc/db" } ] } }, - "sni": "db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul" + "sni": "db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul" } } }, { - "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", - "name": "failover-target~db.default.dc2.internal.11111111-2222-3333-4444-555555555555.consul", - "altStatName": "failover-target~db.default.dc2.internal.11111111-2222-3333-4444-555555555555.consul", - "type": "EDS", - "edsClusterConfig": { - "edsConfig": { - "ads": { - - }, - "resourceApiVersion": "V3" + "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", + "name": "failover-target~1~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "altStatName": "failover-target~1~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "type": "EDS", + "edsClusterConfig": { + "edsConfig": { + "ads": {}, + "resourceApiVersion": "V3" } }, - "connectTimeout": "33s", - "circuitBreakers": { - - }, - "outlierDetection": { - + "connectTimeout": "33s", + "circuitBreakers": {}, + "outlierDetection": {}, + "commonLbConfig": { + "healthyPanicThreshold": {} }, - "commonLbConfig": { - "healthyPanicThreshold": { - - } - }, - "transportSocket": { - "name": "tls", - "typedConfig": { - "@type": "type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext", - "commonTlsContext": { - "tlsParams": { - - }, - "tlsCertificates": [ + "transportSocket": { + "name": "tls", + "typedConfig": { + "@type": "type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext", + "commonTlsContext": { + "tlsParams": {}, + "tlsCertificates": [ { - "certificateChain": { - "inlineString": "-----BEGIN CERTIFICATE-----\nMIICjDCCAjKgAwIBAgIIC5llxGV1gB8wCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowDjEMMAoG\nA1UEAxMDd2ViMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEADPv1RHVNRfa2VKR\nAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Favq5E0ivpNtv1QnFhxtPd7d5k4e+T7\nSkW1TaOCAXIwggFuMA4GA1UdDwEB/wQEAwIDuDAdBgNVHSUEFjAUBggrBgEFBQcD\nAgYIKwYBBQUHAwEwDAYDVR0TAQH/BAIwADBoBgNVHQ4EYQRfN2Q6MDc6ODc6M2E6\nNDA6MTk6NDc6YzM6NWE6YzA6YmE6NjI6ZGY6YWY6NGI6ZDQ6MDU6MjU6NzY6M2Q6\nNWE6OGQ6MTY6OGQ6Njc6NWU6MmU6YTA6MzQ6N2Q6ZGM6ZmYwagYDVR0jBGMwYYBf\nZDE6MTE6MTE6YWM6MmE6YmE6OTc6YjI6M2Y6YWM6N2I6YmQ6ZGE6YmU6YjE6OGE6\nZmM6OWE6YmE6YjU6YmM6ODM6ZTc6NWU6NDE6NmY6ZjI6NzM6OTU6NTg6MGM6ZGIw\nWQYDVR0RBFIwUIZOc3BpZmZlOi8vMTExMTExMTEtMjIyMi0zMzMzLTQ0NDQtNTU1\nNTU1NTU1NTU1LmNvbnN1bC9ucy9kZWZhdWx0L2RjL2RjMS9zdmMvd2ViMAoGCCqG\nSM49BAMCA0gAMEUCIGC3TTvvjj76KMrguVyFf4tjOqaSCRie3nmHMRNNRav7AiEA\npY0heYeK9A6iOLrzqxSerkXXQyj5e9bE4VgUnxgPU6g=\n-----END CERTIFICATE-----\n" + "certificateChain": { + "inlineString": "-----BEGIN CERTIFICATE-----\nMIICjDCCAjKgAwIBAgIIC5llxGV1gB8wCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowDjEMMAoG\nA1UEAxMDd2ViMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEADPv1RHVNRfa2VKR\nAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Favq5E0ivpNtv1QnFhxtPd7d5k4e+T7\nSkW1TaOCAXIwggFuMA4GA1UdDwEB/wQEAwIDuDAdBgNVHSUEFjAUBggrBgEFBQcD\nAgYIKwYBBQUHAwEwDAYDVR0TAQH/BAIwADBoBgNVHQ4EYQRfN2Q6MDc6ODc6M2E6\nNDA6MTk6NDc6YzM6NWE6YzA6YmE6NjI6ZGY6YWY6NGI6ZDQ6MDU6MjU6NzY6M2Q6\nNWE6OGQ6MTY6OGQ6Njc6NWU6MmU6YTA6MzQ6N2Q6ZGM6ZmYwagYDVR0jBGMwYYBf\nZDE6MTE6MTE6YWM6MmE6YmE6OTc6YjI6M2Y6YWM6N2I6YmQ6ZGE6YmU6YjE6OGE6\nZmM6OWE6YmE6YjU6YmM6ODM6ZTc6NWU6NDE6NmY6ZjI6NzM6OTU6NTg6MGM6ZGIw\nWQYDVR0RBFIwUIZOc3BpZmZlOi8vMTExMTExMTEtMjIyMi0zMzMzLTQ0NDQtNTU1\nNTU1NTU1NTU1LmNvbnN1bC9ucy9kZWZhdWx0L2RjL2RjMS9zdmMvd2ViMAoGCCqG\nSM49BAMCA0gAMEUCIGC3TTvvjj76KMrguVyFf4tjOqaSCRie3nmHMRNNRav7AiEA\npY0heYeK9A6iOLrzqxSerkXXQyj5e9bE4VgUnxgPU6g=\n-----END CERTIFICATE-----\n" }, - "privateKey": { - "inlineString": "-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEIMoTkpRggp3fqZzFKh82yS4LjtJI+XY+qX/7DefHFrtdoAoGCCqGSM49\nAwEHoUQDQgAEADPv1RHVNRfa2VKRAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Fav\nq5E0ivpNtv1QnFhxtPd7d5k4e+T7SkW1TQ==\n-----END EC PRIVATE KEY-----\n" + "privateKey": { + "inlineString": "-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEIMoTkpRggp3fqZzFKh82yS4LjtJI+XY+qX/7DefHFrtdoAoGCCqGSM49\nAwEHoUQDQgAEADPv1RHVNRfa2VKRAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Fav\nq5E0ivpNtv1QnFhxtPd7d5k4e+T7SkW1TQ==\n-----END EC PRIVATE KEY-----\n" } } ], - "validationContext": { - "trustedCa": { - "inlineString": "-----BEGIN CERTIFICATE-----\nMIICXDCCAgKgAwIBAgIICpZq70Z9LyUwCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowFDESMBAG\nA1UEAxMJVGVzdCBDQSAyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEIhywH1gx\nAsMwuF3ukAI5YL2jFxH6Usnma1HFSfVyxbXX1/uoZEYrj8yCAtdU2yoHETyd+Zx2\nThhRLP79pYegCaOCATwwggE4MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTAD\nAQH/MGgGA1UdDgRhBF9kMToxMToxMTphYzoyYTpiYTo5NzpiMjozZjphYzo3Yjpi\nZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1ZTo0MTo2ZjpmMjo3\nMzo5NTo1ODowYzpkYjBqBgNVHSMEYzBhgF9kMToxMToxMTphYzoyYTpiYTo5Nzpi\nMjozZjphYzo3YjpiZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1\nZTo0MTo2ZjpmMjo3Mzo5NTo1ODowYzpkYjA/BgNVHREEODA2hjRzcGlmZmU6Ly8x\nMTExMTExMS0yMjIyLTMzMzMtNDQ0NC01NTU1NTU1NTU1NTUuY29uc3VsMAoGCCqG\nSM49BAMCA0gAMEUCICOY0i246rQHJt8o8Oya0D5PLL1FnmsQmQqIGCi31RwnAiEA\noR5f6Ku+cig2Il8T8LJujOp2/2A72QcHZA57B13y+8o=\n-----END CERTIFICATE-----\n" + "validationContext": { + "trustedCa": { + "inlineString": "-----BEGIN CERTIFICATE-----\nMIICXDCCAgKgAwIBAgIICpZq70Z9LyUwCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowFDESMBAG\nA1UEAxMJVGVzdCBDQSAyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEIhywH1gx\nAsMwuF3ukAI5YL2jFxH6Usnma1HFSfVyxbXX1/uoZEYrj8yCAtdU2yoHETyd+Zx2\nThhRLP79pYegCaOCATwwggE4MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTAD\nAQH/MGgGA1UdDgRhBF9kMToxMToxMTphYzoyYTpiYTo5NzpiMjozZjphYzo3Yjpi\nZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1ZTo0MTo2ZjpmMjo3\nMzo5NTo1ODowYzpkYjBqBgNVHSMEYzBhgF9kMToxMToxMTphYzoyYTpiYTo5Nzpi\nMjozZjphYzo3YjpiZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1\nZTo0MTo2ZjpmMjo3Mzo5NTo1ODowYzpkYjA/BgNVHREEODA2hjRzcGlmZmU6Ly8x\nMTExMTExMS0yMjIyLTMzMzMtNDQ0NC01NTU1NTU1NTU1NTUuY29uc3VsMAoGCCqG\nSM49BAMCA0gAMEUCICOY0i246rQHJt8o8Oya0D5PLL1FnmsQmQqIGCi31RwnAiEA\noR5f6Ku+cig2Il8T8LJujOp2/2A72QcHZA57B13y+8o=\n-----END CERTIFICATE-----\n" }, - "matchSubjectAltNames": [ + "matchSubjectAltNames": [ { - "exact": "spiffe://11111111-2222-3333-4444-555555555555.consul/ns/default/dc/dc2/svc/db" + "exact": "spiffe://11111111-2222-3333-4444-555555555555.consul/ns/default/dc/dc2/svc/db" } ] } }, - "sni": "db.default.dc2.internal.11111111-2222-3333-4444-555555555555.consul" + "sni": "db.default.dc2.internal.11111111-2222-3333-4444-555555555555.consul" } } }, { - "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", - "name": "failover-target~db.default.dc3.internal.11111111-2222-3333-4444-555555555555.consul", - "altStatName": "failover-target~db.default.dc3.internal.11111111-2222-3333-4444-555555555555.consul", - "type": "EDS", - "edsClusterConfig": { - "edsConfig": { - "ads": { - - }, - "resourceApiVersion": "V3" + "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", + "name": "failover-target~2~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "altStatName": "failover-target~2~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "type": "EDS", + "edsClusterConfig": { + "edsConfig": { + "ads": {}, + "resourceApiVersion": "V3" } }, - "connectTimeout": "33s", - "circuitBreakers": { - - }, - "outlierDetection": { - - }, - "commonLbConfig": { - "healthyPanicThreshold": { - - } + "connectTimeout": "33s", + "circuitBreakers": {}, + "outlierDetection": {}, + "commonLbConfig": { + "healthyPanicThreshold": {} }, - "transportSocket": { - "name": "tls", - "typedConfig": { - "@type": "type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext", - "commonTlsContext": { - "tlsParams": { - - }, - "tlsCertificates": [ + "transportSocket": { + "name": "tls", + "typedConfig": { + "@type": "type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext", + "commonTlsContext": { + "tlsParams": {}, + "tlsCertificates": [ { - "certificateChain": { - "inlineString": "-----BEGIN CERTIFICATE-----\nMIICjDCCAjKgAwIBAgIIC5llxGV1gB8wCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowDjEMMAoG\nA1UEAxMDd2ViMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEADPv1RHVNRfa2VKR\nAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Favq5E0ivpNtv1QnFhxtPd7d5k4e+T7\nSkW1TaOCAXIwggFuMA4GA1UdDwEB/wQEAwIDuDAdBgNVHSUEFjAUBggrBgEFBQcD\nAgYIKwYBBQUHAwEwDAYDVR0TAQH/BAIwADBoBgNVHQ4EYQRfN2Q6MDc6ODc6M2E6\nNDA6MTk6NDc6YzM6NWE6YzA6YmE6NjI6ZGY6YWY6NGI6ZDQ6MDU6MjU6NzY6M2Q6\nNWE6OGQ6MTY6OGQ6Njc6NWU6MmU6YTA6MzQ6N2Q6ZGM6ZmYwagYDVR0jBGMwYYBf\nZDE6MTE6MTE6YWM6MmE6YmE6OTc6YjI6M2Y6YWM6N2I6YmQ6ZGE6YmU6YjE6OGE6\nZmM6OWE6YmE6YjU6YmM6ODM6ZTc6NWU6NDE6NmY6ZjI6NzM6OTU6NTg6MGM6ZGIw\nWQYDVR0RBFIwUIZOc3BpZmZlOi8vMTExMTExMTEtMjIyMi0zMzMzLTQ0NDQtNTU1\nNTU1NTU1NTU1LmNvbnN1bC9ucy9kZWZhdWx0L2RjL2RjMS9zdmMvd2ViMAoGCCqG\nSM49BAMCA0gAMEUCIGC3TTvvjj76KMrguVyFf4tjOqaSCRie3nmHMRNNRav7AiEA\npY0heYeK9A6iOLrzqxSerkXXQyj5e9bE4VgUnxgPU6g=\n-----END CERTIFICATE-----\n" + "certificateChain": { + "inlineString": "-----BEGIN CERTIFICATE-----\nMIICjDCCAjKgAwIBAgIIC5llxGV1gB8wCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowDjEMMAoG\nA1UEAxMDd2ViMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEADPv1RHVNRfa2VKR\nAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Favq5E0ivpNtv1QnFhxtPd7d5k4e+T7\nSkW1TaOCAXIwggFuMA4GA1UdDwEB/wQEAwIDuDAdBgNVHSUEFjAUBggrBgEFBQcD\nAgYIKwYBBQUHAwEwDAYDVR0TAQH/BAIwADBoBgNVHQ4EYQRfN2Q6MDc6ODc6M2E6\nNDA6MTk6NDc6YzM6NWE6YzA6YmE6NjI6ZGY6YWY6NGI6ZDQ6MDU6MjU6NzY6M2Q6\nNWE6OGQ6MTY6OGQ6Njc6NWU6MmU6YTA6MzQ6N2Q6ZGM6ZmYwagYDVR0jBGMwYYBf\nZDE6MTE6MTE6YWM6MmE6YmE6OTc6YjI6M2Y6YWM6N2I6YmQ6ZGE6YmU6YjE6OGE6\nZmM6OWE6YmE6YjU6YmM6ODM6ZTc6NWU6NDE6NmY6ZjI6NzM6OTU6NTg6MGM6ZGIw\nWQYDVR0RBFIwUIZOc3BpZmZlOi8vMTExMTExMTEtMjIyMi0zMzMzLTQ0NDQtNTU1\nNTU1NTU1NTU1LmNvbnN1bC9ucy9kZWZhdWx0L2RjL2RjMS9zdmMvd2ViMAoGCCqG\nSM49BAMCA0gAMEUCIGC3TTvvjj76KMrguVyFf4tjOqaSCRie3nmHMRNNRav7AiEA\npY0heYeK9A6iOLrzqxSerkXXQyj5e9bE4VgUnxgPU6g=\n-----END CERTIFICATE-----\n" }, - "privateKey": { - "inlineString": "-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEIMoTkpRggp3fqZzFKh82yS4LjtJI+XY+qX/7DefHFrtdoAoGCCqGSM49\nAwEHoUQDQgAEADPv1RHVNRfa2VKRAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Fav\nq5E0ivpNtv1QnFhxtPd7d5k4e+T7SkW1TQ==\n-----END EC PRIVATE KEY-----\n" + "privateKey": { + "inlineString": "-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEIMoTkpRggp3fqZzFKh82yS4LjtJI+XY+qX/7DefHFrtdoAoGCCqGSM49\nAwEHoUQDQgAEADPv1RHVNRfa2VKRAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Fav\nq5E0ivpNtv1QnFhxtPd7d5k4e+T7SkW1TQ==\n-----END EC PRIVATE KEY-----\n" } } ], - "validationContext": { - "trustedCa": { - "inlineString": "-----BEGIN CERTIFICATE-----\nMIICXDCCAgKgAwIBAgIICpZq70Z9LyUwCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowFDESMBAG\nA1UEAxMJVGVzdCBDQSAyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEIhywH1gx\nAsMwuF3ukAI5YL2jFxH6Usnma1HFSfVyxbXX1/uoZEYrj8yCAtdU2yoHETyd+Zx2\nThhRLP79pYegCaOCATwwggE4MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTAD\nAQH/MGgGA1UdDgRhBF9kMToxMToxMTphYzoyYTpiYTo5NzpiMjozZjphYzo3Yjpi\nZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1ZTo0MTo2ZjpmMjo3\nMzo5NTo1ODowYzpkYjBqBgNVHSMEYzBhgF9kMToxMToxMTphYzoyYTpiYTo5Nzpi\nMjozZjphYzo3YjpiZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1\nZTo0MTo2ZjpmMjo3Mzo5NTo1ODowYzpkYjA/BgNVHREEODA2hjRzcGlmZmU6Ly8x\nMTExMTExMS0yMjIyLTMzMzMtNDQ0NC01NTU1NTU1NTU1NTUuY29uc3VsMAoGCCqG\nSM49BAMCA0gAMEUCICOY0i246rQHJt8o8Oya0D5PLL1FnmsQmQqIGCi31RwnAiEA\noR5f6Ku+cig2Il8T8LJujOp2/2A72QcHZA57B13y+8o=\n-----END CERTIFICATE-----\n" + "validationContext": { + "trustedCa": { + "inlineString": "-----BEGIN CERTIFICATE-----\nMIICXDCCAgKgAwIBAgIICpZq70Z9LyUwCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowFDESMBAG\nA1UEAxMJVGVzdCBDQSAyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEIhywH1gx\nAsMwuF3ukAI5YL2jFxH6Usnma1HFSfVyxbXX1/uoZEYrj8yCAtdU2yoHETyd+Zx2\nThhRLP79pYegCaOCATwwggE4MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTAD\nAQH/MGgGA1UdDgRhBF9kMToxMToxMTphYzoyYTpiYTo5NzpiMjozZjphYzo3Yjpi\nZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1ZTo0MTo2ZjpmMjo3\nMzo5NTo1ODowYzpkYjBqBgNVHSMEYzBhgF9kMToxMToxMTphYzoyYTpiYTo5Nzpi\nMjozZjphYzo3YjpiZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1\nZTo0MTo2ZjpmMjo3Mzo5NTo1ODowYzpkYjA/BgNVHREEODA2hjRzcGlmZmU6Ly8x\nMTExMTExMS0yMjIyLTMzMzMtNDQ0NC01NTU1NTU1NTU1NTUuY29uc3VsMAoGCCqG\nSM49BAMCA0gAMEUCICOY0i246rQHJt8o8Oya0D5PLL1FnmsQmQqIGCi31RwnAiEA\noR5f6Ku+cig2Il8T8LJujOp2/2A72QcHZA57B13y+8o=\n-----END CERTIFICATE-----\n" }, - "matchSubjectAltNames": [ + "matchSubjectAltNames": [ { - "exact": "spiffe://11111111-2222-3333-4444-555555555555.consul/ns/default/dc/dc3/svc/db" + "exact": "spiffe://11111111-2222-3333-4444-555555555555.consul/ns/default/dc/dc3/svc/db" } ] } }, - "sni": "db.default.dc3.internal.11111111-2222-3333-4444-555555555555.consul" + "sni": "db.default.dc3.internal.11111111-2222-3333-4444-555555555555.consul" } } } ], - "typeUrl": "type.googleapis.com/envoy.config.cluster.v3.Cluster", - "nonce": "00000001" + "typeUrl": "type.googleapis.com/envoy.config.cluster.v3.Cluster", + "nonce": "00000001" } \ No newline at end of file diff --git a/agent/xds/testdata/clusters/ingress-with-tcp-chain-failover-through-local-gateway-triggered.latest.golden b/agent/xds/testdata/clusters/ingress-with-tcp-chain-failover-through-local-gateway-triggered.latest.golden index 7bec8f6fe7d..52a3fdcc9d0 100644 --- a/agent/xds/testdata/clusters/ingress-with-tcp-chain-failover-through-local-gateway-triggered.latest.golden +++ b/agent/xds/testdata/clusters/ingress-with-tcp-chain-failover-through-local-gateway-triggered.latest.golden @@ -1,143 +1,121 @@ { - "versionInfo": "00000001", - "resources": [ + "versionInfo": "00000001", + "resources": [ { - "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", - "name": "db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", - "altStatName": "db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", - "clusterType": { - "name": "envoy.clusters.aggregate", - "typedConfig": { - "@type": "type.googleapis.com/envoy.extensions.clusters.aggregate.v3.ClusterConfig", - "clusters": [ - "failover-target~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", - "failover-target~db.default.dc2.internal.11111111-2222-3333-4444-555555555555.consul" + "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", + "name": "db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "altStatName": "db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "clusterType": { + "name": "envoy.clusters.aggregate", + "typedConfig": { + "@type": "type.googleapis.com/envoy.extensions.clusters.aggregate.v3.ClusterConfig", + "clusters": [ + "failover-target~0~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "failover-target~1~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul" ] } }, - "connectTimeout": "33s", - "lbPolicy": "CLUSTER_PROVIDED", - "outlierDetection": { - - } + "connectTimeout": "33s", + "lbPolicy": "CLUSTER_PROVIDED", + "outlierDetection": {} }, { - "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", - "name": "failover-target~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", - "altStatName": "failover-target~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", - "type": "EDS", - "edsClusterConfig": { - "edsConfig": { - "ads": { - - }, - "resourceApiVersion": "V3" + "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", + "name": "failover-target~0~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "altStatName": "failover-target~0~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "type": "EDS", + "edsClusterConfig": { + "edsConfig": { + "ads": {}, + "resourceApiVersion": "V3" } }, - "connectTimeout": "33s", - "circuitBreakers": { - - }, - "outlierDetection": { - - }, - "commonLbConfig": { - "healthyPanicThreshold": { - - } + "connectTimeout": "33s", + "circuitBreakers": {}, + "outlierDetection": {}, + "commonLbConfig": { + "healthyPanicThreshold": {} }, - "transportSocket": { - "name": "tls", - "typedConfig": { - "@type": "type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext", - "commonTlsContext": { - "tlsParams": { - - }, - "tlsCertificates": [ + "transportSocket": { + "name": "tls", + "typedConfig": { + "@type": "type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext", + "commonTlsContext": { + "tlsParams": {}, + "tlsCertificates": [ { - "certificateChain": { - "inlineString": "-----BEGIN CERTIFICATE-----\nMIICjDCCAjKgAwIBAgIIC5llxGV1gB8wCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowDjEMMAoG\nA1UEAxMDd2ViMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEADPv1RHVNRfa2VKR\nAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Favq5E0ivpNtv1QnFhxtPd7d5k4e+T7\nSkW1TaOCAXIwggFuMA4GA1UdDwEB/wQEAwIDuDAdBgNVHSUEFjAUBggrBgEFBQcD\nAgYIKwYBBQUHAwEwDAYDVR0TAQH/BAIwADBoBgNVHQ4EYQRfN2Q6MDc6ODc6M2E6\nNDA6MTk6NDc6YzM6NWE6YzA6YmE6NjI6ZGY6YWY6NGI6ZDQ6MDU6MjU6NzY6M2Q6\nNWE6OGQ6MTY6OGQ6Njc6NWU6MmU6YTA6MzQ6N2Q6ZGM6ZmYwagYDVR0jBGMwYYBf\nZDE6MTE6MTE6YWM6MmE6YmE6OTc6YjI6M2Y6YWM6N2I6YmQ6ZGE6YmU6YjE6OGE6\nZmM6OWE6YmE6YjU6YmM6ODM6ZTc6NWU6NDE6NmY6ZjI6NzM6OTU6NTg6MGM6ZGIw\nWQYDVR0RBFIwUIZOc3BpZmZlOi8vMTExMTExMTEtMjIyMi0zMzMzLTQ0NDQtNTU1\nNTU1NTU1NTU1LmNvbnN1bC9ucy9kZWZhdWx0L2RjL2RjMS9zdmMvd2ViMAoGCCqG\nSM49BAMCA0gAMEUCIGC3TTvvjj76KMrguVyFf4tjOqaSCRie3nmHMRNNRav7AiEA\npY0heYeK9A6iOLrzqxSerkXXQyj5e9bE4VgUnxgPU6g=\n-----END CERTIFICATE-----\n" + "certificateChain": { + "inlineString": "-----BEGIN CERTIFICATE-----\nMIICjDCCAjKgAwIBAgIIC5llxGV1gB8wCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowDjEMMAoG\nA1UEAxMDd2ViMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEADPv1RHVNRfa2VKR\nAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Favq5E0ivpNtv1QnFhxtPd7d5k4e+T7\nSkW1TaOCAXIwggFuMA4GA1UdDwEB/wQEAwIDuDAdBgNVHSUEFjAUBggrBgEFBQcD\nAgYIKwYBBQUHAwEwDAYDVR0TAQH/BAIwADBoBgNVHQ4EYQRfN2Q6MDc6ODc6M2E6\nNDA6MTk6NDc6YzM6NWE6YzA6YmE6NjI6ZGY6YWY6NGI6ZDQ6MDU6MjU6NzY6M2Q6\nNWE6OGQ6MTY6OGQ6Njc6NWU6MmU6YTA6MzQ6N2Q6ZGM6ZmYwagYDVR0jBGMwYYBf\nZDE6MTE6MTE6YWM6MmE6YmE6OTc6YjI6M2Y6YWM6N2I6YmQ6ZGE6YmU6YjE6OGE6\nZmM6OWE6YmE6YjU6YmM6ODM6ZTc6NWU6NDE6NmY6ZjI6NzM6OTU6NTg6MGM6ZGIw\nWQYDVR0RBFIwUIZOc3BpZmZlOi8vMTExMTExMTEtMjIyMi0zMzMzLTQ0NDQtNTU1\nNTU1NTU1NTU1LmNvbnN1bC9ucy9kZWZhdWx0L2RjL2RjMS9zdmMvd2ViMAoGCCqG\nSM49BAMCA0gAMEUCIGC3TTvvjj76KMrguVyFf4tjOqaSCRie3nmHMRNNRav7AiEA\npY0heYeK9A6iOLrzqxSerkXXQyj5e9bE4VgUnxgPU6g=\n-----END CERTIFICATE-----\n" }, - "privateKey": { - "inlineString": "-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEIMoTkpRggp3fqZzFKh82yS4LjtJI+XY+qX/7DefHFrtdoAoGCCqGSM49\nAwEHoUQDQgAEADPv1RHVNRfa2VKRAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Fav\nq5E0ivpNtv1QnFhxtPd7d5k4e+T7SkW1TQ==\n-----END EC PRIVATE KEY-----\n" + "privateKey": { + "inlineString": "-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEIMoTkpRggp3fqZzFKh82yS4LjtJI+XY+qX/7DefHFrtdoAoGCCqGSM49\nAwEHoUQDQgAEADPv1RHVNRfa2VKRAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Fav\nq5E0ivpNtv1QnFhxtPd7d5k4e+T7SkW1TQ==\n-----END EC PRIVATE KEY-----\n" } } ], - "validationContext": { - "trustedCa": { - "inlineString": "-----BEGIN CERTIFICATE-----\nMIICXDCCAgKgAwIBAgIICpZq70Z9LyUwCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowFDESMBAG\nA1UEAxMJVGVzdCBDQSAyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEIhywH1gx\nAsMwuF3ukAI5YL2jFxH6Usnma1HFSfVyxbXX1/uoZEYrj8yCAtdU2yoHETyd+Zx2\nThhRLP79pYegCaOCATwwggE4MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTAD\nAQH/MGgGA1UdDgRhBF9kMToxMToxMTphYzoyYTpiYTo5NzpiMjozZjphYzo3Yjpi\nZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1ZTo0MTo2ZjpmMjo3\nMzo5NTo1ODowYzpkYjBqBgNVHSMEYzBhgF9kMToxMToxMTphYzoyYTpiYTo5Nzpi\nMjozZjphYzo3YjpiZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1\nZTo0MTo2ZjpmMjo3Mzo5NTo1ODowYzpkYjA/BgNVHREEODA2hjRzcGlmZmU6Ly8x\nMTExMTExMS0yMjIyLTMzMzMtNDQ0NC01NTU1NTU1NTU1NTUuY29uc3VsMAoGCCqG\nSM49BAMCA0gAMEUCICOY0i246rQHJt8o8Oya0D5PLL1FnmsQmQqIGCi31RwnAiEA\noR5f6Ku+cig2Il8T8LJujOp2/2A72QcHZA57B13y+8o=\n-----END CERTIFICATE-----\n" + "validationContext": { + "trustedCa": { + "inlineString": "-----BEGIN CERTIFICATE-----\nMIICXDCCAgKgAwIBAgIICpZq70Z9LyUwCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowFDESMBAG\nA1UEAxMJVGVzdCBDQSAyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEIhywH1gx\nAsMwuF3ukAI5YL2jFxH6Usnma1HFSfVyxbXX1/uoZEYrj8yCAtdU2yoHETyd+Zx2\nThhRLP79pYegCaOCATwwggE4MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTAD\nAQH/MGgGA1UdDgRhBF9kMToxMToxMTphYzoyYTpiYTo5NzpiMjozZjphYzo3Yjpi\nZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1ZTo0MTo2ZjpmMjo3\nMzo5NTo1ODowYzpkYjBqBgNVHSMEYzBhgF9kMToxMToxMTphYzoyYTpiYTo5Nzpi\nMjozZjphYzo3YjpiZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1\nZTo0MTo2ZjpmMjo3Mzo5NTo1ODowYzpkYjA/BgNVHREEODA2hjRzcGlmZmU6Ly8x\nMTExMTExMS0yMjIyLTMzMzMtNDQ0NC01NTU1NTU1NTU1NTUuY29uc3VsMAoGCCqG\nSM49BAMCA0gAMEUCICOY0i246rQHJt8o8Oya0D5PLL1FnmsQmQqIGCi31RwnAiEA\noR5f6Ku+cig2Il8T8LJujOp2/2A72QcHZA57B13y+8o=\n-----END CERTIFICATE-----\n" }, - "matchSubjectAltNames": [ + "matchSubjectAltNames": [ { - "exact": "spiffe://11111111-2222-3333-4444-555555555555.consul/ns/default/dc/dc1/svc/db" + "exact": "spiffe://11111111-2222-3333-4444-555555555555.consul/ns/default/dc/dc1/svc/db" } ] } }, - "sni": "db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul" + "sni": "db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul" } } }, { - "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", - "name": "failover-target~db.default.dc2.internal.11111111-2222-3333-4444-555555555555.consul", - "altStatName": "failover-target~db.default.dc2.internal.11111111-2222-3333-4444-555555555555.consul", - "type": "EDS", - "edsClusterConfig": { - "edsConfig": { - "ads": { - - }, - "resourceApiVersion": "V3" + "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", + "name": "failover-target~1~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "altStatName": "failover-target~1~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "type": "EDS", + "edsClusterConfig": { + "edsConfig": { + "ads": {}, + "resourceApiVersion": "V3" } }, - "connectTimeout": "33s", - "circuitBreakers": { - - }, - "outlierDetection": { - - }, - "commonLbConfig": { - "healthyPanicThreshold": { - - } + "connectTimeout": "33s", + "circuitBreakers": {}, + "outlierDetection": {}, + "commonLbConfig": { + "healthyPanicThreshold": {} }, - "transportSocket": { - "name": "tls", - "typedConfig": { - "@type": "type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext", - "commonTlsContext": { - "tlsParams": { - - }, - "tlsCertificates": [ + "transportSocket": { + "name": "tls", + "typedConfig": { + "@type": "type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext", + "commonTlsContext": { + "tlsParams": {}, + "tlsCertificates": [ { - "certificateChain": { - "inlineString": "-----BEGIN CERTIFICATE-----\nMIICjDCCAjKgAwIBAgIIC5llxGV1gB8wCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowDjEMMAoG\nA1UEAxMDd2ViMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEADPv1RHVNRfa2VKR\nAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Favq5E0ivpNtv1QnFhxtPd7d5k4e+T7\nSkW1TaOCAXIwggFuMA4GA1UdDwEB/wQEAwIDuDAdBgNVHSUEFjAUBggrBgEFBQcD\nAgYIKwYBBQUHAwEwDAYDVR0TAQH/BAIwADBoBgNVHQ4EYQRfN2Q6MDc6ODc6M2E6\nNDA6MTk6NDc6YzM6NWE6YzA6YmE6NjI6ZGY6YWY6NGI6ZDQ6MDU6MjU6NzY6M2Q6\nNWE6OGQ6MTY6OGQ6Njc6NWU6MmU6YTA6MzQ6N2Q6ZGM6ZmYwagYDVR0jBGMwYYBf\nZDE6MTE6MTE6YWM6MmE6YmE6OTc6YjI6M2Y6YWM6N2I6YmQ6ZGE6YmU6YjE6OGE6\nZmM6OWE6YmE6YjU6YmM6ODM6ZTc6NWU6NDE6NmY6ZjI6NzM6OTU6NTg6MGM6ZGIw\nWQYDVR0RBFIwUIZOc3BpZmZlOi8vMTExMTExMTEtMjIyMi0zMzMzLTQ0NDQtNTU1\nNTU1NTU1NTU1LmNvbnN1bC9ucy9kZWZhdWx0L2RjL2RjMS9zdmMvd2ViMAoGCCqG\nSM49BAMCA0gAMEUCIGC3TTvvjj76KMrguVyFf4tjOqaSCRie3nmHMRNNRav7AiEA\npY0heYeK9A6iOLrzqxSerkXXQyj5e9bE4VgUnxgPU6g=\n-----END CERTIFICATE-----\n" + "certificateChain": { + "inlineString": "-----BEGIN CERTIFICATE-----\nMIICjDCCAjKgAwIBAgIIC5llxGV1gB8wCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowDjEMMAoG\nA1UEAxMDd2ViMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEADPv1RHVNRfa2VKR\nAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Favq5E0ivpNtv1QnFhxtPd7d5k4e+T7\nSkW1TaOCAXIwggFuMA4GA1UdDwEB/wQEAwIDuDAdBgNVHSUEFjAUBggrBgEFBQcD\nAgYIKwYBBQUHAwEwDAYDVR0TAQH/BAIwADBoBgNVHQ4EYQRfN2Q6MDc6ODc6M2E6\nNDA6MTk6NDc6YzM6NWE6YzA6YmE6NjI6ZGY6YWY6NGI6ZDQ6MDU6MjU6NzY6M2Q6\nNWE6OGQ6MTY6OGQ6Njc6NWU6MmU6YTA6MzQ6N2Q6ZGM6ZmYwagYDVR0jBGMwYYBf\nZDE6MTE6MTE6YWM6MmE6YmE6OTc6YjI6M2Y6YWM6N2I6YmQ6ZGE6YmU6YjE6OGE6\nZmM6OWE6YmE6YjU6YmM6ODM6ZTc6NWU6NDE6NmY6ZjI6NzM6OTU6NTg6MGM6ZGIw\nWQYDVR0RBFIwUIZOc3BpZmZlOi8vMTExMTExMTEtMjIyMi0zMzMzLTQ0NDQtNTU1\nNTU1NTU1NTU1LmNvbnN1bC9ucy9kZWZhdWx0L2RjL2RjMS9zdmMvd2ViMAoGCCqG\nSM49BAMCA0gAMEUCIGC3TTvvjj76KMrguVyFf4tjOqaSCRie3nmHMRNNRav7AiEA\npY0heYeK9A6iOLrzqxSerkXXQyj5e9bE4VgUnxgPU6g=\n-----END CERTIFICATE-----\n" }, - "privateKey": { - "inlineString": "-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEIMoTkpRggp3fqZzFKh82yS4LjtJI+XY+qX/7DefHFrtdoAoGCCqGSM49\nAwEHoUQDQgAEADPv1RHVNRfa2VKRAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Fav\nq5E0ivpNtv1QnFhxtPd7d5k4e+T7SkW1TQ==\n-----END EC PRIVATE KEY-----\n" + "privateKey": { + "inlineString": "-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEIMoTkpRggp3fqZzFKh82yS4LjtJI+XY+qX/7DefHFrtdoAoGCCqGSM49\nAwEHoUQDQgAEADPv1RHVNRfa2VKRAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Fav\nq5E0ivpNtv1QnFhxtPd7d5k4e+T7SkW1TQ==\n-----END EC PRIVATE KEY-----\n" } } ], - "validationContext": { - "trustedCa": { - "inlineString": "-----BEGIN CERTIFICATE-----\nMIICXDCCAgKgAwIBAgIICpZq70Z9LyUwCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowFDESMBAG\nA1UEAxMJVGVzdCBDQSAyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEIhywH1gx\nAsMwuF3ukAI5YL2jFxH6Usnma1HFSfVyxbXX1/uoZEYrj8yCAtdU2yoHETyd+Zx2\nThhRLP79pYegCaOCATwwggE4MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTAD\nAQH/MGgGA1UdDgRhBF9kMToxMToxMTphYzoyYTpiYTo5NzpiMjozZjphYzo3Yjpi\nZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1ZTo0MTo2ZjpmMjo3\nMzo5NTo1ODowYzpkYjBqBgNVHSMEYzBhgF9kMToxMToxMTphYzoyYTpiYTo5Nzpi\nMjozZjphYzo3YjpiZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1\nZTo0MTo2ZjpmMjo3Mzo5NTo1ODowYzpkYjA/BgNVHREEODA2hjRzcGlmZmU6Ly8x\nMTExMTExMS0yMjIyLTMzMzMtNDQ0NC01NTU1NTU1NTU1NTUuY29uc3VsMAoGCCqG\nSM49BAMCA0gAMEUCICOY0i246rQHJt8o8Oya0D5PLL1FnmsQmQqIGCi31RwnAiEA\noR5f6Ku+cig2Il8T8LJujOp2/2A72QcHZA57B13y+8o=\n-----END CERTIFICATE-----\n" + "validationContext": { + "trustedCa": { + "inlineString": "-----BEGIN CERTIFICATE-----\nMIICXDCCAgKgAwIBAgIICpZq70Z9LyUwCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowFDESMBAG\nA1UEAxMJVGVzdCBDQSAyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEIhywH1gx\nAsMwuF3ukAI5YL2jFxH6Usnma1HFSfVyxbXX1/uoZEYrj8yCAtdU2yoHETyd+Zx2\nThhRLP79pYegCaOCATwwggE4MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTAD\nAQH/MGgGA1UdDgRhBF9kMToxMToxMTphYzoyYTpiYTo5NzpiMjozZjphYzo3Yjpi\nZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1ZTo0MTo2ZjpmMjo3\nMzo5NTo1ODowYzpkYjBqBgNVHSMEYzBhgF9kMToxMToxMTphYzoyYTpiYTo5Nzpi\nMjozZjphYzo3YjpiZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1\nZTo0MTo2ZjpmMjo3Mzo5NTo1ODowYzpkYjA/BgNVHREEODA2hjRzcGlmZmU6Ly8x\nMTExMTExMS0yMjIyLTMzMzMtNDQ0NC01NTU1NTU1NTU1NTUuY29uc3VsMAoGCCqG\nSM49BAMCA0gAMEUCICOY0i246rQHJt8o8Oya0D5PLL1FnmsQmQqIGCi31RwnAiEA\noR5f6Ku+cig2Il8T8LJujOp2/2A72QcHZA57B13y+8o=\n-----END CERTIFICATE-----\n" }, - "matchSubjectAltNames": [ + "matchSubjectAltNames": [ { - "exact": "spiffe://11111111-2222-3333-4444-555555555555.consul/ns/default/dc/dc2/svc/db" + "exact": "spiffe://11111111-2222-3333-4444-555555555555.consul/ns/default/dc/dc2/svc/db" } ] } }, - "sni": "db.default.dc2.internal.11111111-2222-3333-4444-555555555555.consul" + "sni": "db.default.dc2.internal.11111111-2222-3333-4444-555555555555.consul" } } } ], - "typeUrl": "type.googleapis.com/envoy.config.cluster.v3.Cluster", - "nonce": "00000001" + "typeUrl": "type.googleapis.com/envoy.config.cluster.v3.Cluster", + "nonce": "00000001" } \ No newline at end of file diff --git a/agent/xds/testdata/clusters/ingress-with-tcp-chain-failover-through-local-gateway.latest.golden b/agent/xds/testdata/clusters/ingress-with-tcp-chain-failover-through-local-gateway.latest.golden index 7bec8f6fe7d..52a3fdcc9d0 100644 --- a/agent/xds/testdata/clusters/ingress-with-tcp-chain-failover-through-local-gateway.latest.golden +++ b/agent/xds/testdata/clusters/ingress-with-tcp-chain-failover-through-local-gateway.latest.golden @@ -1,143 +1,121 @@ { - "versionInfo": "00000001", - "resources": [ + "versionInfo": "00000001", + "resources": [ { - "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", - "name": "db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", - "altStatName": "db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", - "clusterType": { - "name": "envoy.clusters.aggregate", - "typedConfig": { - "@type": "type.googleapis.com/envoy.extensions.clusters.aggregate.v3.ClusterConfig", - "clusters": [ - "failover-target~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", - "failover-target~db.default.dc2.internal.11111111-2222-3333-4444-555555555555.consul" + "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", + "name": "db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "altStatName": "db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "clusterType": { + "name": "envoy.clusters.aggregate", + "typedConfig": { + "@type": "type.googleapis.com/envoy.extensions.clusters.aggregate.v3.ClusterConfig", + "clusters": [ + "failover-target~0~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "failover-target~1~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul" ] } }, - "connectTimeout": "33s", - "lbPolicy": "CLUSTER_PROVIDED", - "outlierDetection": { - - } + "connectTimeout": "33s", + "lbPolicy": "CLUSTER_PROVIDED", + "outlierDetection": {} }, { - "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", - "name": "failover-target~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", - "altStatName": "failover-target~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", - "type": "EDS", - "edsClusterConfig": { - "edsConfig": { - "ads": { - - }, - "resourceApiVersion": "V3" + "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", + "name": "failover-target~0~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "altStatName": "failover-target~0~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "type": "EDS", + "edsClusterConfig": { + "edsConfig": { + "ads": {}, + "resourceApiVersion": "V3" } }, - "connectTimeout": "33s", - "circuitBreakers": { - - }, - "outlierDetection": { - - }, - "commonLbConfig": { - "healthyPanicThreshold": { - - } + "connectTimeout": "33s", + "circuitBreakers": {}, + "outlierDetection": {}, + "commonLbConfig": { + "healthyPanicThreshold": {} }, - "transportSocket": { - "name": "tls", - "typedConfig": { - "@type": "type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext", - "commonTlsContext": { - "tlsParams": { - - }, - "tlsCertificates": [ + "transportSocket": { + "name": "tls", + "typedConfig": { + "@type": "type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext", + "commonTlsContext": { + "tlsParams": {}, + "tlsCertificates": [ { - "certificateChain": { - "inlineString": "-----BEGIN CERTIFICATE-----\nMIICjDCCAjKgAwIBAgIIC5llxGV1gB8wCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowDjEMMAoG\nA1UEAxMDd2ViMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEADPv1RHVNRfa2VKR\nAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Favq5E0ivpNtv1QnFhxtPd7d5k4e+T7\nSkW1TaOCAXIwggFuMA4GA1UdDwEB/wQEAwIDuDAdBgNVHSUEFjAUBggrBgEFBQcD\nAgYIKwYBBQUHAwEwDAYDVR0TAQH/BAIwADBoBgNVHQ4EYQRfN2Q6MDc6ODc6M2E6\nNDA6MTk6NDc6YzM6NWE6YzA6YmE6NjI6ZGY6YWY6NGI6ZDQ6MDU6MjU6NzY6M2Q6\nNWE6OGQ6MTY6OGQ6Njc6NWU6MmU6YTA6MzQ6N2Q6ZGM6ZmYwagYDVR0jBGMwYYBf\nZDE6MTE6MTE6YWM6MmE6YmE6OTc6YjI6M2Y6YWM6N2I6YmQ6ZGE6YmU6YjE6OGE6\nZmM6OWE6YmE6YjU6YmM6ODM6ZTc6NWU6NDE6NmY6ZjI6NzM6OTU6NTg6MGM6ZGIw\nWQYDVR0RBFIwUIZOc3BpZmZlOi8vMTExMTExMTEtMjIyMi0zMzMzLTQ0NDQtNTU1\nNTU1NTU1NTU1LmNvbnN1bC9ucy9kZWZhdWx0L2RjL2RjMS9zdmMvd2ViMAoGCCqG\nSM49BAMCA0gAMEUCIGC3TTvvjj76KMrguVyFf4tjOqaSCRie3nmHMRNNRav7AiEA\npY0heYeK9A6iOLrzqxSerkXXQyj5e9bE4VgUnxgPU6g=\n-----END CERTIFICATE-----\n" + "certificateChain": { + "inlineString": "-----BEGIN CERTIFICATE-----\nMIICjDCCAjKgAwIBAgIIC5llxGV1gB8wCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowDjEMMAoG\nA1UEAxMDd2ViMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEADPv1RHVNRfa2VKR\nAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Favq5E0ivpNtv1QnFhxtPd7d5k4e+T7\nSkW1TaOCAXIwggFuMA4GA1UdDwEB/wQEAwIDuDAdBgNVHSUEFjAUBggrBgEFBQcD\nAgYIKwYBBQUHAwEwDAYDVR0TAQH/BAIwADBoBgNVHQ4EYQRfN2Q6MDc6ODc6M2E6\nNDA6MTk6NDc6YzM6NWE6YzA6YmE6NjI6ZGY6YWY6NGI6ZDQ6MDU6MjU6NzY6M2Q6\nNWE6OGQ6MTY6OGQ6Njc6NWU6MmU6YTA6MzQ6N2Q6ZGM6ZmYwagYDVR0jBGMwYYBf\nZDE6MTE6MTE6YWM6MmE6YmE6OTc6YjI6M2Y6YWM6N2I6YmQ6ZGE6YmU6YjE6OGE6\nZmM6OWE6YmE6YjU6YmM6ODM6ZTc6NWU6NDE6NmY6ZjI6NzM6OTU6NTg6MGM6ZGIw\nWQYDVR0RBFIwUIZOc3BpZmZlOi8vMTExMTExMTEtMjIyMi0zMzMzLTQ0NDQtNTU1\nNTU1NTU1NTU1LmNvbnN1bC9ucy9kZWZhdWx0L2RjL2RjMS9zdmMvd2ViMAoGCCqG\nSM49BAMCA0gAMEUCIGC3TTvvjj76KMrguVyFf4tjOqaSCRie3nmHMRNNRav7AiEA\npY0heYeK9A6iOLrzqxSerkXXQyj5e9bE4VgUnxgPU6g=\n-----END CERTIFICATE-----\n" }, - "privateKey": { - "inlineString": "-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEIMoTkpRggp3fqZzFKh82yS4LjtJI+XY+qX/7DefHFrtdoAoGCCqGSM49\nAwEHoUQDQgAEADPv1RHVNRfa2VKRAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Fav\nq5E0ivpNtv1QnFhxtPd7d5k4e+T7SkW1TQ==\n-----END EC PRIVATE KEY-----\n" + "privateKey": { + "inlineString": "-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEIMoTkpRggp3fqZzFKh82yS4LjtJI+XY+qX/7DefHFrtdoAoGCCqGSM49\nAwEHoUQDQgAEADPv1RHVNRfa2VKRAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Fav\nq5E0ivpNtv1QnFhxtPd7d5k4e+T7SkW1TQ==\n-----END EC PRIVATE KEY-----\n" } } ], - "validationContext": { - "trustedCa": { - "inlineString": "-----BEGIN CERTIFICATE-----\nMIICXDCCAgKgAwIBAgIICpZq70Z9LyUwCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowFDESMBAG\nA1UEAxMJVGVzdCBDQSAyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEIhywH1gx\nAsMwuF3ukAI5YL2jFxH6Usnma1HFSfVyxbXX1/uoZEYrj8yCAtdU2yoHETyd+Zx2\nThhRLP79pYegCaOCATwwggE4MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTAD\nAQH/MGgGA1UdDgRhBF9kMToxMToxMTphYzoyYTpiYTo5NzpiMjozZjphYzo3Yjpi\nZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1ZTo0MTo2ZjpmMjo3\nMzo5NTo1ODowYzpkYjBqBgNVHSMEYzBhgF9kMToxMToxMTphYzoyYTpiYTo5Nzpi\nMjozZjphYzo3YjpiZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1\nZTo0MTo2ZjpmMjo3Mzo5NTo1ODowYzpkYjA/BgNVHREEODA2hjRzcGlmZmU6Ly8x\nMTExMTExMS0yMjIyLTMzMzMtNDQ0NC01NTU1NTU1NTU1NTUuY29uc3VsMAoGCCqG\nSM49BAMCA0gAMEUCICOY0i246rQHJt8o8Oya0D5PLL1FnmsQmQqIGCi31RwnAiEA\noR5f6Ku+cig2Il8T8LJujOp2/2A72QcHZA57B13y+8o=\n-----END CERTIFICATE-----\n" + "validationContext": { + "trustedCa": { + "inlineString": "-----BEGIN CERTIFICATE-----\nMIICXDCCAgKgAwIBAgIICpZq70Z9LyUwCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowFDESMBAG\nA1UEAxMJVGVzdCBDQSAyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEIhywH1gx\nAsMwuF3ukAI5YL2jFxH6Usnma1HFSfVyxbXX1/uoZEYrj8yCAtdU2yoHETyd+Zx2\nThhRLP79pYegCaOCATwwggE4MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTAD\nAQH/MGgGA1UdDgRhBF9kMToxMToxMTphYzoyYTpiYTo5NzpiMjozZjphYzo3Yjpi\nZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1ZTo0MTo2ZjpmMjo3\nMzo5NTo1ODowYzpkYjBqBgNVHSMEYzBhgF9kMToxMToxMTphYzoyYTpiYTo5Nzpi\nMjozZjphYzo3YjpiZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1\nZTo0MTo2ZjpmMjo3Mzo5NTo1ODowYzpkYjA/BgNVHREEODA2hjRzcGlmZmU6Ly8x\nMTExMTExMS0yMjIyLTMzMzMtNDQ0NC01NTU1NTU1NTU1NTUuY29uc3VsMAoGCCqG\nSM49BAMCA0gAMEUCICOY0i246rQHJt8o8Oya0D5PLL1FnmsQmQqIGCi31RwnAiEA\noR5f6Ku+cig2Il8T8LJujOp2/2A72QcHZA57B13y+8o=\n-----END CERTIFICATE-----\n" }, - "matchSubjectAltNames": [ + "matchSubjectAltNames": [ { - "exact": "spiffe://11111111-2222-3333-4444-555555555555.consul/ns/default/dc/dc1/svc/db" + "exact": "spiffe://11111111-2222-3333-4444-555555555555.consul/ns/default/dc/dc1/svc/db" } ] } }, - "sni": "db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul" + "sni": "db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul" } } }, { - "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", - "name": "failover-target~db.default.dc2.internal.11111111-2222-3333-4444-555555555555.consul", - "altStatName": "failover-target~db.default.dc2.internal.11111111-2222-3333-4444-555555555555.consul", - "type": "EDS", - "edsClusterConfig": { - "edsConfig": { - "ads": { - - }, - "resourceApiVersion": "V3" + "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", + "name": "failover-target~1~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "altStatName": "failover-target~1~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "type": "EDS", + "edsClusterConfig": { + "edsConfig": { + "ads": {}, + "resourceApiVersion": "V3" } }, - "connectTimeout": "33s", - "circuitBreakers": { - - }, - "outlierDetection": { - - }, - "commonLbConfig": { - "healthyPanicThreshold": { - - } + "connectTimeout": "33s", + "circuitBreakers": {}, + "outlierDetection": {}, + "commonLbConfig": { + "healthyPanicThreshold": {} }, - "transportSocket": { - "name": "tls", - "typedConfig": { - "@type": "type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext", - "commonTlsContext": { - "tlsParams": { - - }, - "tlsCertificates": [ + "transportSocket": { + "name": "tls", + "typedConfig": { + "@type": "type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext", + "commonTlsContext": { + "tlsParams": {}, + "tlsCertificates": [ { - "certificateChain": { - "inlineString": "-----BEGIN CERTIFICATE-----\nMIICjDCCAjKgAwIBAgIIC5llxGV1gB8wCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowDjEMMAoG\nA1UEAxMDd2ViMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEADPv1RHVNRfa2VKR\nAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Favq5E0ivpNtv1QnFhxtPd7d5k4e+T7\nSkW1TaOCAXIwggFuMA4GA1UdDwEB/wQEAwIDuDAdBgNVHSUEFjAUBggrBgEFBQcD\nAgYIKwYBBQUHAwEwDAYDVR0TAQH/BAIwADBoBgNVHQ4EYQRfN2Q6MDc6ODc6M2E6\nNDA6MTk6NDc6YzM6NWE6YzA6YmE6NjI6ZGY6YWY6NGI6ZDQ6MDU6MjU6NzY6M2Q6\nNWE6OGQ6MTY6OGQ6Njc6NWU6MmU6YTA6MzQ6N2Q6ZGM6ZmYwagYDVR0jBGMwYYBf\nZDE6MTE6MTE6YWM6MmE6YmE6OTc6YjI6M2Y6YWM6N2I6YmQ6ZGE6YmU6YjE6OGE6\nZmM6OWE6YmE6YjU6YmM6ODM6ZTc6NWU6NDE6NmY6ZjI6NzM6OTU6NTg6MGM6ZGIw\nWQYDVR0RBFIwUIZOc3BpZmZlOi8vMTExMTExMTEtMjIyMi0zMzMzLTQ0NDQtNTU1\nNTU1NTU1NTU1LmNvbnN1bC9ucy9kZWZhdWx0L2RjL2RjMS9zdmMvd2ViMAoGCCqG\nSM49BAMCA0gAMEUCIGC3TTvvjj76KMrguVyFf4tjOqaSCRie3nmHMRNNRav7AiEA\npY0heYeK9A6iOLrzqxSerkXXQyj5e9bE4VgUnxgPU6g=\n-----END CERTIFICATE-----\n" + "certificateChain": { + "inlineString": "-----BEGIN CERTIFICATE-----\nMIICjDCCAjKgAwIBAgIIC5llxGV1gB8wCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowDjEMMAoG\nA1UEAxMDd2ViMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEADPv1RHVNRfa2VKR\nAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Favq5E0ivpNtv1QnFhxtPd7d5k4e+T7\nSkW1TaOCAXIwggFuMA4GA1UdDwEB/wQEAwIDuDAdBgNVHSUEFjAUBggrBgEFBQcD\nAgYIKwYBBQUHAwEwDAYDVR0TAQH/BAIwADBoBgNVHQ4EYQRfN2Q6MDc6ODc6M2E6\nNDA6MTk6NDc6YzM6NWE6YzA6YmE6NjI6ZGY6YWY6NGI6ZDQ6MDU6MjU6NzY6M2Q6\nNWE6OGQ6MTY6OGQ6Njc6NWU6MmU6YTA6MzQ6N2Q6ZGM6ZmYwagYDVR0jBGMwYYBf\nZDE6MTE6MTE6YWM6MmE6YmE6OTc6YjI6M2Y6YWM6N2I6YmQ6ZGE6YmU6YjE6OGE6\nZmM6OWE6YmE6YjU6YmM6ODM6ZTc6NWU6NDE6NmY6ZjI6NzM6OTU6NTg6MGM6ZGIw\nWQYDVR0RBFIwUIZOc3BpZmZlOi8vMTExMTExMTEtMjIyMi0zMzMzLTQ0NDQtNTU1\nNTU1NTU1NTU1LmNvbnN1bC9ucy9kZWZhdWx0L2RjL2RjMS9zdmMvd2ViMAoGCCqG\nSM49BAMCA0gAMEUCIGC3TTvvjj76KMrguVyFf4tjOqaSCRie3nmHMRNNRav7AiEA\npY0heYeK9A6iOLrzqxSerkXXQyj5e9bE4VgUnxgPU6g=\n-----END CERTIFICATE-----\n" }, - "privateKey": { - "inlineString": "-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEIMoTkpRggp3fqZzFKh82yS4LjtJI+XY+qX/7DefHFrtdoAoGCCqGSM49\nAwEHoUQDQgAEADPv1RHVNRfa2VKRAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Fav\nq5E0ivpNtv1QnFhxtPd7d5k4e+T7SkW1TQ==\n-----END EC PRIVATE KEY-----\n" + "privateKey": { + "inlineString": "-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEIMoTkpRggp3fqZzFKh82yS4LjtJI+XY+qX/7DefHFrtdoAoGCCqGSM49\nAwEHoUQDQgAEADPv1RHVNRfa2VKRAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Fav\nq5E0ivpNtv1QnFhxtPd7d5k4e+T7SkW1TQ==\n-----END EC PRIVATE KEY-----\n" } } ], - "validationContext": { - "trustedCa": { - "inlineString": "-----BEGIN CERTIFICATE-----\nMIICXDCCAgKgAwIBAgIICpZq70Z9LyUwCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowFDESMBAG\nA1UEAxMJVGVzdCBDQSAyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEIhywH1gx\nAsMwuF3ukAI5YL2jFxH6Usnma1HFSfVyxbXX1/uoZEYrj8yCAtdU2yoHETyd+Zx2\nThhRLP79pYegCaOCATwwggE4MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTAD\nAQH/MGgGA1UdDgRhBF9kMToxMToxMTphYzoyYTpiYTo5NzpiMjozZjphYzo3Yjpi\nZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1ZTo0MTo2ZjpmMjo3\nMzo5NTo1ODowYzpkYjBqBgNVHSMEYzBhgF9kMToxMToxMTphYzoyYTpiYTo5Nzpi\nMjozZjphYzo3YjpiZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1\nZTo0MTo2ZjpmMjo3Mzo5NTo1ODowYzpkYjA/BgNVHREEODA2hjRzcGlmZmU6Ly8x\nMTExMTExMS0yMjIyLTMzMzMtNDQ0NC01NTU1NTU1NTU1NTUuY29uc3VsMAoGCCqG\nSM49BAMCA0gAMEUCICOY0i246rQHJt8o8Oya0D5PLL1FnmsQmQqIGCi31RwnAiEA\noR5f6Ku+cig2Il8T8LJujOp2/2A72QcHZA57B13y+8o=\n-----END CERTIFICATE-----\n" + "validationContext": { + "trustedCa": { + "inlineString": "-----BEGIN CERTIFICATE-----\nMIICXDCCAgKgAwIBAgIICpZq70Z9LyUwCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowFDESMBAG\nA1UEAxMJVGVzdCBDQSAyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEIhywH1gx\nAsMwuF3ukAI5YL2jFxH6Usnma1HFSfVyxbXX1/uoZEYrj8yCAtdU2yoHETyd+Zx2\nThhRLP79pYegCaOCATwwggE4MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTAD\nAQH/MGgGA1UdDgRhBF9kMToxMToxMTphYzoyYTpiYTo5NzpiMjozZjphYzo3Yjpi\nZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1ZTo0MTo2ZjpmMjo3\nMzo5NTo1ODowYzpkYjBqBgNVHSMEYzBhgF9kMToxMToxMTphYzoyYTpiYTo5Nzpi\nMjozZjphYzo3YjpiZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1\nZTo0MTo2ZjpmMjo3Mzo5NTo1ODowYzpkYjA/BgNVHREEODA2hjRzcGlmZmU6Ly8x\nMTExMTExMS0yMjIyLTMzMzMtNDQ0NC01NTU1NTU1NTU1NTUuY29uc3VsMAoGCCqG\nSM49BAMCA0gAMEUCICOY0i246rQHJt8o8Oya0D5PLL1FnmsQmQqIGCi31RwnAiEA\noR5f6Ku+cig2Il8T8LJujOp2/2A72QcHZA57B13y+8o=\n-----END CERTIFICATE-----\n" }, - "matchSubjectAltNames": [ + "matchSubjectAltNames": [ { - "exact": "spiffe://11111111-2222-3333-4444-555555555555.consul/ns/default/dc/dc2/svc/db" + "exact": "spiffe://11111111-2222-3333-4444-555555555555.consul/ns/default/dc/dc2/svc/db" } ] } }, - "sni": "db.default.dc2.internal.11111111-2222-3333-4444-555555555555.consul" + "sni": "db.default.dc2.internal.11111111-2222-3333-4444-555555555555.consul" } } } ], - "typeUrl": "type.googleapis.com/envoy.config.cluster.v3.Cluster", - "nonce": "00000001" + "typeUrl": "type.googleapis.com/envoy.config.cluster.v3.Cluster", + "nonce": "00000001" } \ No newline at end of file diff --git a/agent/xds/testdata/clusters/ingress-with-tcp-chain-failover-through-remote-gateway-triggered.latest.golden b/agent/xds/testdata/clusters/ingress-with-tcp-chain-failover-through-remote-gateway-triggered.latest.golden index 7bec8f6fe7d..52a3fdcc9d0 100644 --- a/agent/xds/testdata/clusters/ingress-with-tcp-chain-failover-through-remote-gateway-triggered.latest.golden +++ b/agent/xds/testdata/clusters/ingress-with-tcp-chain-failover-through-remote-gateway-triggered.latest.golden @@ -1,143 +1,121 @@ { - "versionInfo": "00000001", - "resources": [ + "versionInfo": "00000001", + "resources": [ { - "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", - "name": "db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", - "altStatName": "db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", - "clusterType": { - "name": "envoy.clusters.aggregate", - "typedConfig": { - "@type": "type.googleapis.com/envoy.extensions.clusters.aggregate.v3.ClusterConfig", - "clusters": [ - "failover-target~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", - "failover-target~db.default.dc2.internal.11111111-2222-3333-4444-555555555555.consul" + "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", + "name": "db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "altStatName": "db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "clusterType": { + "name": "envoy.clusters.aggregate", + "typedConfig": { + "@type": "type.googleapis.com/envoy.extensions.clusters.aggregate.v3.ClusterConfig", + "clusters": [ + "failover-target~0~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "failover-target~1~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul" ] } }, - "connectTimeout": "33s", - "lbPolicy": "CLUSTER_PROVIDED", - "outlierDetection": { - - } + "connectTimeout": "33s", + "lbPolicy": "CLUSTER_PROVIDED", + "outlierDetection": {} }, { - "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", - "name": "failover-target~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", - "altStatName": "failover-target~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", - "type": "EDS", - "edsClusterConfig": { - "edsConfig": { - "ads": { - - }, - "resourceApiVersion": "V3" + "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", + "name": "failover-target~0~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "altStatName": "failover-target~0~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "type": "EDS", + "edsClusterConfig": { + "edsConfig": { + "ads": {}, + "resourceApiVersion": "V3" } }, - "connectTimeout": "33s", - "circuitBreakers": { - - }, - "outlierDetection": { - - }, - "commonLbConfig": { - "healthyPanicThreshold": { - - } + "connectTimeout": "33s", + "circuitBreakers": {}, + "outlierDetection": {}, + "commonLbConfig": { + "healthyPanicThreshold": {} }, - "transportSocket": { - "name": "tls", - "typedConfig": { - "@type": "type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext", - "commonTlsContext": { - "tlsParams": { - - }, - "tlsCertificates": [ + "transportSocket": { + "name": "tls", + "typedConfig": { + "@type": "type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext", + "commonTlsContext": { + "tlsParams": {}, + "tlsCertificates": [ { - "certificateChain": { - "inlineString": "-----BEGIN CERTIFICATE-----\nMIICjDCCAjKgAwIBAgIIC5llxGV1gB8wCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowDjEMMAoG\nA1UEAxMDd2ViMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEADPv1RHVNRfa2VKR\nAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Favq5E0ivpNtv1QnFhxtPd7d5k4e+T7\nSkW1TaOCAXIwggFuMA4GA1UdDwEB/wQEAwIDuDAdBgNVHSUEFjAUBggrBgEFBQcD\nAgYIKwYBBQUHAwEwDAYDVR0TAQH/BAIwADBoBgNVHQ4EYQRfN2Q6MDc6ODc6M2E6\nNDA6MTk6NDc6YzM6NWE6YzA6YmE6NjI6ZGY6YWY6NGI6ZDQ6MDU6MjU6NzY6M2Q6\nNWE6OGQ6MTY6OGQ6Njc6NWU6MmU6YTA6MzQ6N2Q6ZGM6ZmYwagYDVR0jBGMwYYBf\nZDE6MTE6MTE6YWM6MmE6YmE6OTc6YjI6M2Y6YWM6N2I6YmQ6ZGE6YmU6YjE6OGE6\nZmM6OWE6YmE6YjU6YmM6ODM6ZTc6NWU6NDE6NmY6ZjI6NzM6OTU6NTg6MGM6ZGIw\nWQYDVR0RBFIwUIZOc3BpZmZlOi8vMTExMTExMTEtMjIyMi0zMzMzLTQ0NDQtNTU1\nNTU1NTU1NTU1LmNvbnN1bC9ucy9kZWZhdWx0L2RjL2RjMS9zdmMvd2ViMAoGCCqG\nSM49BAMCA0gAMEUCIGC3TTvvjj76KMrguVyFf4tjOqaSCRie3nmHMRNNRav7AiEA\npY0heYeK9A6iOLrzqxSerkXXQyj5e9bE4VgUnxgPU6g=\n-----END CERTIFICATE-----\n" + "certificateChain": { + "inlineString": "-----BEGIN CERTIFICATE-----\nMIICjDCCAjKgAwIBAgIIC5llxGV1gB8wCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowDjEMMAoG\nA1UEAxMDd2ViMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEADPv1RHVNRfa2VKR\nAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Favq5E0ivpNtv1QnFhxtPd7d5k4e+T7\nSkW1TaOCAXIwggFuMA4GA1UdDwEB/wQEAwIDuDAdBgNVHSUEFjAUBggrBgEFBQcD\nAgYIKwYBBQUHAwEwDAYDVR0TAQH/BAIwADBoBgNVHQ4EYQRfN2Q6MDc6ODc6M2E6\nNDA6MTk6NDc6YzM6NWE6YzA6YmE6NjI6ZGY6YWY6NGI6ZDQ6MDU6MjU6NzY6M2Q6\nNWE6OGQ6MTY6OGQ6Njc6NWU6MmU6YTA6MzQ6N2Q6ZGM6ZmYwagYDVR0jBGMwYYBf\nZDE6MTE6MTE6YWM6MmE6YmE6OTc6YjI6M2Y6YWM6N2I6YmQ6ZGE6YmU6YjE6OGE6\nZmM6OWE6YmE6YjU6YmM6ODM6ZTc6NWU6NDE6NmY6ZjI6NzM6OTU6NTg6MGM6ZGIw\nWQYDVR0RBFIwUIZOc3BpZmZlOi8vMTExMTExMTEtMjIyMi0zMzMzLTQ0NDQtNTU1\nNTU1NTU1NTU1LmNvbnN1bC9ucy9kZWZhdWx0L2RjL2RjMS9zdmMvd2ViMAoGCCqG\nSM49BAMCA0gAMEUCIGC3TTvvjj76KMrguVyFf4tjOqaSCRie3nmHMRNNRav7AiEA\npY0heYeK9A6iOLrzqxSerkXXQyj5e9bE4VgUnxgPU6g=\n-----END CERTIFICATE-----\n" }, - "privateKey": { - "inlineString": "-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEIMoTkpRggp3fqZzFKh82yS4LjtJI+XY+qX/7DefHFrtdoAoGCCqGSM49\nAwEHoUQDQgAEADPv1RHVNRfa2VKRAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Fav\nq5E0ivpNtv1QnFhxtPd7d5k4e+T7SkW1TQ==\n-----END EC PRIVATE KEY-----\n" + "privateKey": { + "inlineString": "-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEIMoTkpRggp3fqZzFKh82yS4LjtJI+XY+qX/7DefHFrtdoAoGCCqGSM49\nAwEHoUQDQgAEADPv1RHVNRfa2VKRAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Fav\nq5E0ivpNtv1QnFhxtPd7d5k4e+T7SkW1TQ==\n-----END EC PRIVATE KEY-----\n" } } ], - "validationContext": { - "trustedCa": { - "inlineString": "-----BEGIN CERTIFICATE-----\nMIICXDCCAgKgAwIBAgIICpZq70Z9LyUwCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowFDESMBAG\nA1UEAxMJVGVzdCBDQSAyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEIhywH1gx\nAsMwuF3ukAI5YL2jFxH6Usnma1HFSfVyxbXX1/uoZEYrj8yCAtdU2yoHETyd+Zx2\nThhRLP79pYegCaOCATwwggE4MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTAD\nAQH/MGgGA1UdDgRhBF9kMToxMToxMTphYzoyYTpiYTo5NzpiMjozZjphYzo3Yjpi\nZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1ZTo0MTo2ZjpmMjo3\nMzo5NTo1ODowYzpkYjBqBgNVHSMEYzBhgF9kMToxMToxMTphYzoyYTpiYTo5Nzpi\nMjozZjphYzo3YjpiZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1\nZTo0MTo2ZjpmMjo3Mzo5NTo1ODowYzpkYjA/BgNVHREEODA2hjRzcGlmZmU6Ly8x\nMTExMTExMS0yMjIyLTMzMzMtNDQ0NC01NTU1NTU1NTU1NTUuY29uc3VsMAoGCCqG\nSM49BAMCA0gAMEUCICOY0i246rQHJt8o8Oya0D5PLL1FnmsQmQqIGCi31RwnAiEA\noR5f6Ku+cig2Il8T8LJujOp2/2A72QcHZA57B13y+8o=\n-----END CERTIFICATE-----\n" + "validationContext": { + "trustedCa": { + "inlineString": "-----BEGIN CERTIFICATE-----\nMIICXDCCAgKgAwIBAgIICpZq70Z9LyUwCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowFDESMBAG\nA1UEAxMJVGVzdCBDQSAyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEIhywH1gx\nAsMwuF3ukAI5YL2jFxH6Usnma1HFSfVyxbXX1/uoZEYrj8yCAtdU2yoHETyd+Zx2\nThhRLP79pYegCaOCATwwggE4MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTAD\nAQH/MGgGA1UdDgRhBF9kMToxMToxMTphYzoyYTpiYTo5NzpiMjozZjphYzo3Yjpi\nZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1ZTo0MTo2ZjpmMjo3\nMzo5NTo1ODowYzpkYjBqBgNVHSMEYzBhgF9kMToxMToxMTphYzoyYTpiYTo5Nzpi\nMjozZjphYzo3YjpiZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1\nZTo0MTo2ZjpmMjo3Mzo5NTo1ODowYzpkYjA/BgNVHREEODA2hjRzcGlmZmU6Ly8x\nMTExMTExMS0yMjIyLTMzMzMtNDQ0NC01NTU1NTU1NTU1NTUuY29uc3VsMAoGCCqG\nSM49BAMCA0gAMEUCICOY0i246rQHJt8o8Oya0D5PLL1FnmsQmQqIGCi31RwnAiEA\noR5f6Ku+cig2Il8T8LJujOp2/2A72QcHZA57B13y+8o=\n-----END CERTIFICATE-----\n" }, - "matchSubjectAltNames": [ + "matchSubjectAltNames": [ { - "exact": "spiffe://11111111-2222-3333-4444-555555555555.consul/ns/default/dc/dc1/svc/db" + "exact": "spiffe://11111111-2222-3333-4444-555555555555.consul/ns/default/dc/dc1/svc/db" } ] } }, - "sni": "db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul" + "sni": "db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul" } } }, { - "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", - "name": "failover-target~db.default.dc2.internal.11111111-2222-3333-4444-555555555555.consul", - "altStatName": "failover-target~db.default.dc2.internal.11111111-2222-3333-4444-555555555555.consul", - "type": "EDS", - "edsClusterConfig": { - "edsConfig": { - "ads": { - - }, - "resourceApiVersion": "V3" + "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", + "name": "failover-target~1~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "altStatName": "failover-target~1~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "type": "EDS", + "edsClusterConfig": { + "edsConfig": { + "ads": {}, + "resourceApiVersion": "V3" } }, - "connectTimeout": "33s", - "circuitBreakers": { - - }, - "outlierDetection": { - - }, - "commonLbConfig": { - "healthyPanicThreshold": { - - } + "connectTimeout": "33s", + "circuitBreakers": {}, + "outlierDetection": {}, + "commonLbConfig": { + "healthyPanicThreshold": {} }, - "transportSocket": { - "name": "tls", - "typedConfig": { - "@type": "type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext", - "commonTlsContext": { - "tlsParams": { - - }, - "tlsCertificates": [ + "transportSocket": { + "name": "tls", + "typedConfig": { + "@type": "type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext", + "commonTlsContext": { + "tlsParams": {}, + "tlsCertificates": [ { - "certificateChain": { - "inlineString": "-----BEGIN CERTIFICATE-----\nMIICjDCCAjKgAwIBAgIIC5llxGV1gB8wCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowDjEMMAoG\nA1UEAxMDd2ViMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEADPv1RHVNRfa2VKR\nAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Favq5E0ivpNtv1QnFhxtPd7d5k4e+T7\nSkW1TaOCAXIwggFuMA4GA1UdDwEB/wQEAwIDuDAdBgNVHSUEFjAUBggrBgEFBQcD\nAgYIKwYBBQUHAwEwDAYDVR0TAQH/BAIwADBoBgNVHQ4EYQRfN2Q6MDc6ODc6M2E6\nNDA6MTk6NDc6YzM6NWE6YzA6YmE6NjI6ZGY6YWY6NGI6ZDQ6MDU6MjU6NzY6M2Q6\nNWE6OGQ6MTY6OGQ6Njc6NWU6MmU6YTA6MzQ6N2Q6ZGM6ZmYwagYDVR0jBGMwYYBf\nZDE6MTE6MTE6YWM6MmE6YmE6OTc6YjI6M2Y6YWM6N2I6YmQ6ZGE6YmU6YjE6OGE6\nZmM6OWE6YmE6YjU6YmM6ODM6ZTc6NWU6NDE6NmY6ZjI6NzM6OTU6NTg6MGM6ZGIw\nWQYDVR0RBFIwUIZOc3BpZmZlOi8vMTExMTExMTEtMjIyMi0zMzMzLTQ0NDQtNTU1\nNTU1NTU1NTU1LmNvbnN1bC9ucy9kZWZhdWx0L2RjL2RjMS9zdmMvd2ViMAoGCCqG\nSM49BAMCA0gAMEUCIGC3TTvvjj76KMrguVyFf4tjOqaSCRie3nmHMRNNRav7AiEA\npY0heYeK9A6iOLrzqxSerkXXQyj5e9bE4VgUnxgPU6g=\n-----END CERTIFICATE-----\n" + "certificateChain": { + "inlineString": "-----BEGIN CERTIFICATE-----\nMIICjDCCAjKgAwIBAgIIC5llxGV1gB8wCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowDjEMMAoG\nA1UEAxMDd2ViMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEADPv1RHVNRfa2VKR\nAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Favq5E0ivpNtv1QnFhxtPd7d5k4e+T7\nSkW1TaOCAXIwggFuMA4GA1UdDwEB/wQEAwIDuDAdBgNVHSUEFjAUBggrBgEFBQcD\nAgYIKwYBBQUHAwEwDAYDVR0TAQH/BAIwADBoBgNVHQ4EYQRfN2Q6MDc6ODc6M2E6\nNDA6MTk6NDc6YzM6NWE6YzA6YmE6NjI6ZGY6YWY6NGI6ZDQ6MDU6MjU6NzY6M2Q6\nNWE6OGQ6MTY6OGQ6Njc6NWU6MmU6YTA6MzQ6N2Q6ZGM6ZmYwagYDVR0jBGMwYYBf\nZDE6MTE6MTE6YWM6MmE6YmE6OTc6YjI6M2Y6YWM6N2I6YmQ6ZGE6YmU6YjE6OGE6\nZmM6OWE6YmE6YjU6YmM6ODM6ZTc6NWU6NDE6NmY6ZjI6NzM6OTU6NTg6MGM6ZGIw\nWQYDVR0RBFIwUIZOc3BpZmZlOi8vMTExMTExMTEtMjIyMi0zMzMzLTQ0NDQtNTU1\nNTU1NTU1NTU1LmNvbnN1bC9ucy9kZWZhdWx0L2RjL2RjMS9zdmMvd2ViMAoGCCqG\nSM49BAMCA0gAMEUCIGC3TTvvjj76KMrguVyFf4tjOqaSCRie3nmHMRNNRav7AiEA\npY0heYeK9A6iOLrzqxSerkXXQyj5e9bE4VgUnxgPU6g=\n-----END CERTIFICATE-----\n" }, - "privateKey": { - "inlineString": "-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEIMoTkpRggp3fqZzFKh82yS4LjtJI+XY+qX/7DefHFrtdoAoGCCqGSM49\nAwEHoUQDQgAEADPv1RHVNRfa2VKRAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Fav\nq5E0ivpNtv1QnFhxtPd7d5k4e+T7SkW1TQ==\n-----END EC PRIVATE KEY-----\n" + "privateKey": { + "inlineString": "-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEIMoTkpRggp3fqZzFKh82yS4LjtJI+XY+qX/7DefHFrtdoAoGCCqGSM49\nAwEHoUQDQgAEADPv1RHVNRfa2VKRAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Fav\nq5E0ivpNtv1QnFhxtPd7d5k4e+T7SkW1TQ==\n-----END EC PRIVATE KEY-----\n" } } ], - "validationContext": { - "trustedCa": { - "inlineString": "-----BEGIN CERTIFICATE-----\nMIICXDCCAgKgAwIBAgIICpZq70Z9LyUwCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowFDESMBAG\nA1UEAxMJVGVzdCBDQSAyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEIhywH1gx\nAsMwuF3ukAI5YL2jFxH6Usnma1HFSfVyxbXX1/uoZEYrj8yCAtdU2yoHETyd+Zx2\nThhRLP79pYegCaOCATwwggE4MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTAD\nAQH/MGgGA1UdDgRhBF9kMToxMToxMTphYzoyYTpiYTo5NzpiMjozZjphYzo3Yjpi\nZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1ZTo0MTo2ZjpmMjo3\nMzo5NTo1ODowYzpkYjBqBgNVHSMEYzBhgF9kMToxMToxMTphYzoyYTpiYTo5Nzpi\nMjozZjphYzo3YjpiZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1\nZTo0MTo2ZjpmMjo3Mzo5NTo1ODowYzpkYjA/BgNVHREEODA2hjRzcGlmZmU6Ly8x\nMTExMTExMS0yMjIyLTMzMzMtNDQ0NC01NTU1NTU1NTU1NTUuY29uc3VsMAoGCCqG\nSM49BAMCA0gAMEUCICOY0i246rQHJt8o8Oya0D5PLL1FnmsQmQqIGCi31RwnAiEA\noR5f6Ku+cig2Il8T8LJujOp2/2A72QcHZA57B13y+8o=\n-----END CERTIFICATE-----\n" + "validationContext": { + "trustedCa": { + "inlineString": "-----BEGIN CERTIFICATE-----\nMIICXDCCAgKgAwIBAgIICpZq70Z9LyUwCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowFDESMBAG\nA1UEAxMJVGVzdCBDQSAyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEIhywH1gx\nAsMwuF3ukAI5YL2jFxH6Usnma1HFSfVyxbXX1/uoZEYrj8yCAtdU2yoHETyd+Zx2\nThhRLP79pYegCaOCATwwggE4MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTAD\nAQH/MGgGA1UdDgRhBF9kMToxMToxMTphYzoyYTpiYTo5NzpiMjozZjphYzo3Yjpi\nZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1ZTo0MTo2ZjpmMjo3\nMzo5NTo1ODowYzpkYjBqBgNVHSMEYzBhgF9kMToxMToxMTphYzoyYTpiYTo5Nzpi\nMjozZjphYzo3YjpiZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1\nZTo0MTo2ZjpmMjo3Mzo5NTo1ODowYzpkYjA/BgNVHREEODA2hjRzcGlmZmU6Ly8x\nMTExMTExMS0yMjIyLTMzMzMtNDQ0NC01NTU1NTU1NTU1NTUuY29uc3VsMAoGCCqG\nSM49BAMCA0gAMEUCICOY0i246rQHJt8o8Oya0D5PLL1FnmsQmQqIGCi31RwnAiEA\noR5f6Ku+cig2Il8T8LJujOp2/2A72QcHZA57B13y+8o=\n-----END CERTIFICATE-----\n" }, - "matchSubjectAltNames": [ + "matchSubjectAltNames": [ { - "exact": "spiffe://11111111-2222-3333-4444-555555555555.consul/ns/default/dc/dc2/svc/db" + "exact": "spiffe://11111111-2222-3333-4444-555555555555.consul/ns/default/dc/dc2/svc/db" } ] } }, - "sni": "db.default.dc2.internal.11111111-2222-3333-4444-555555555555.consul" + "sni": "db.default.dc2.internal.11111111-2222-3333-4444-555555555555.consul" } } } ], - "typeUrl": "type.googleapis.com/envoy.config.cluster.v3.Cluster", - "nonce": "00000001" + "typeUrl": "type.googleapis.com/envoy.config.cluster.v3.Cluster", + "nonce": "00000001" } \ No newline at end of file diff --git a/agent/xds/testdata/clusters/ingress-with-tcp-chain-failover-through-remote-gateway.latest.golden b/agent/xds/testdata/clusters/ingress-with-tcp-chain-failover-through-remote-gateway.latest.golden index 7bec8f6fe7d..52a3fdcc9d0 100644 --- a/agent/xds/testdata/clusters/ingress-with-tcp-chain-failover-through-remote-gateway.latest.golden +++ b/agent/xds/testdata/clusters/ingress-with-tcp-chain-failover-through-remote-gateway.latest.golden @@ -1,143 +1,121 @@ { - "versionInfo": "00000001", - "resources": [ + "versionInfo": "00000001", + "resources": [ { - "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", - "name": "db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", - "altStatName": "db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", - "clusterType": { - "name": "envoy.clusters.aggregate", - "typedConfig": { - "@type": "type.googleapis.com/envoy.extensions.clusters.aggregate.v3.ClusterConfig", - "clusters": [ - "failover-target~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", - "failover-target~db.default.dc2.internal.11111111-2222-3333-4444-555555555555.consul" + "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", + "name": "db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "altStatName": "db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "clusterType": { + "name": "envoy.clusters.aggregate", + "typedConfig": { + "@type": "type.googleapis.com/envoy.extensions.clusters.aggregate.v3.ClusterConfig", + "clusters": [ + "failover-target~0~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "failover-target~1~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul" ] } }, - "connectTimeout": "33s", - "lbPolicy": "CLUSTER_PROVIDED", - "outlierDetection": { - - } + "connectTimeout": "33s", + "lbPolicy": "CLUSTER_PROVIDED", + "outlierDetection": {} }, { - "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", - "name": "failover-target~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", - "altStatName": "failover-target~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", - "type": "EDS", - "edsClusterConfig": { - "edsConfig": { - "ads": { - - }, - "resourceApiVersion": "V3" + "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", + "name": "failover-target~0~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "altStatName": "failover-target~0~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "type": "EDS", + "edsClusterConfig": { + "edsConfig": { + "ads": {}, + "resourceApiVersion": "V3" } }, - "connectTimeout": "33s", - "circuitBreakers": { - - }, - "outlierDetection": { - - }, - "commonLbConfig": { - "healthyPanicThreshold": { - - } + "connectTimeout": "33s", + "circuitBreakers": {}, + "outlierDetection": {}, + "commonLbConfig": { + "healthyPanicThreshold": {} }, - "transportSocket": { - "name": "tls", - "typedConfig": { - "@type": "type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext", - "commonTlsContext": { - "tlsParams": { - - }, - "tlsCertificates": [ + "transportSocket": { + "name": "tls", + "typedConfig": { + "@type": "type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext", + "commonTlsContext": { + "tlsParams": {}, + "tlsCertificates": [ { - "certificateChain": { - "inlineString": "-----BEGIN CERTIFICATE-----\nMIICjDCCAjKgAwIBAgIIC5llxGV1gB8wCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowDjEMMAoG\nA1UEAxMDd2ViMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEADPv1RHVNRfa2VKR\nAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Favq5E0ivpNtv1QnFhxtPd7d5k4e+T7\nSkW1TaOCAXIwggFuMA4GA1UdDwEB/wQEAwIDuDAdBgNVHSUEFjAUBggrBgEFBQcD\nAgYIKwYBBQUHAwEwDAYDVR0TAQH/BAIwADBoBgNVHQ4EYQRfN2Q6MDc6ODc6M2E6\nNDA6MTk6NDc6YzM6NWE6YzA6YmE6NjI6ZGY6YWY6NGI6ZDQ6MDU6MjU6NzY6M2Q6\nNWE6OGQ6MTY6OGQ6Njc6NWU6MmU6YTA6MzQ6N2Q6ZGM6ZmYwagYDVR0jBGMwYYBf\nZDE6MTE6MTE6YWM6MmE6YmE6OTc6YjI6M2Y6YWM6N2I6YmQ6ZGE6YmU6YjE6OGE6\nZmM6OWE6YmE6YjU6YmM6ODM6ZTc6NWU6NDE6NmY6ZjI6NzM6OTU6NTg6MGM6ZGIw\nWQYDVR0RBFIwUIZOc3BpZmZlOi8vMTExMTExMTEtMjIyMi0zMzMzLTQ0NDQtNTU1\nNTU1NTU1NTU1LmNvbnN1bC9ucy9kZWZhdWx0L2RjL2RjMS9zdmMvd2ViMAoGCCqG\nSM49BAMCA0gAMEUCIGC3TTvvjj76KMrguVyFf4tjOqaSCRie3nmHMRNNRav7AiEA\npY0heYeK9A6iOLrzqxSerkXXQyj5e9bE4VgUnxgPU6g=\n-----END CERTIFICATE-----\n" + "certificateChain": { + "inlineString": "-----BEGIN CERTIFICATE-----\nMIICjDCCAjKgAwIBAgIIC5llxGV1gB8wCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowDjEMMAoG\nA1UEAxMDd2ViMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEADPv1RHVNRfa2VKR\nAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Favq5E0ivpNtv1QnFhxtPd7d5k4e+T7\nSkW1TaOCAXIwggFuMA4GA1UdDwEB/wQEAwIDuDAdBgNVHSUEFjAUBggrBgEFBQcD\nAgYIKwYBBQUHAwEwDAYDVR0TAQH/BAIwADBoBgNVHQ4EYQRfN2Q6MDc6ODc6M2E6\nNDA6MTk6NDc6YzM6NWE6YzA6YmE6NjI6ZGY6YWY6NGI6ZDQ6MDU6MjU6NzY6M2Q6\nNWE6OGQ6MTY6OGQ6Njc6NWU6MmU6YTA6MzQ6N2Q6ZGM6ZmYwagYDVR0jBGMwYYBf\nZDE6MTE6MTE6YWM6MmE6YmE6OTc6YjI6M2Y6YWM6N2I6YmQ6ZGE6YmU6YjE6OGE6\nZmM6OWE6YmE6YjU6YmM6ODM6ZTc6NWU6NDE6NmY6ZjI6NzM6OTU6NTg6MGM6ZGIw\nWQYDVR0RBFIwUIZOc3BpZmZlOi8vMTExMTExMTEtMjIyMi0zMzMzLTQ0NDQtNTU1\nNTU1NTU1NTU1LmNvbnN1bC9ucy9kZWZhdWx0L2RjL2RjMS9zdmMvd2ViMAoGCCqG\nSM49BAMCA0gAMEUCIGC3TTvvjj76KMrguVyFf4tjOqaSCRie3nmHMRNNRav7AiEA\npY0heYeK9A6iOLrzqxSerkXXQyj5e9bE4VgUnxgPU6g=\n-----END CERTIFICATE-----\n" }, - "privateKey": { - "inlineString": "-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEIMoTkpRggp3fqZzFKh82yS4LjtJI+XY+qX/7DefHFrtdoAoGCCqGSM49\nAwEHoUQDQgAEADPv1RHVNRfa2VKRAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Fav\nq5E0ivpNtv1QnFhxtPd7d5k4e+T7SkW1TQ==\n-----END EC PRIVATE KEY-----\n" + "privateKey": { + "inlineString": "-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEIMoTkpRggp3fqZzFKh82yS4LjtJI+XY+qX/7DefHFrtdoAoGCCqGSM49\nAwEHoUQDQgAEADPv1RHVNRfa2VKRAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Fav\nq5E0ivpNtv1QnFhxtPd7d5k4e+T7SkW1TQ==\n-----END EC PRIVATE KEY-----\n" } } ], - "validationContext": { - "trustedCa": { - "inlineString": "-----BEGIN CERTIFICATE-----\nMIICXDCCAgKgAwIBAgIICpZq70Z9LyUwCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowFDESMBAG\nA1UEAxMJVGVzdCBDQSAyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEIhywH1gx\nAsMwuF3ukAI5YL2jFxH6Usnma1HFSfVyxbXX1/uoZEYrj8yCAtdU2yoHETyd+Zx2\nThhRLP79pYegCaOCATwwggE4MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTAD\nAQH/MGgGA1UdDgRhBF9kMToxMToxMTphYzoyYTpiYTo5NzpiMjozZjphYzo3Yjpi\nZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1ZTo0MTo2ZjpmMjo3\nMzo5NTo1ODowYzpkYjBqBgNVHSMEYzBhgF9kMToxMToxMTphYzoyYTpiYTo5Nzpi\nMjozZjphYzo3YjpiZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1\nZTo0MTo2ZjpmMjo3Mzo5NTo1ODowYzpkYjA/BgNVHREEODA2hjRzcGlmZmU6Ly8x\nMTExMTExMS0yMjIyLTMzMzMtNDQ0NC01NTU1NTU1NTU1NTUuY29uc3VsMAoGCCqG\nSM49BAMCA0gAMEUCICOY0i246rQHJt8o8Oya0D5PLL1FnmsQmQqIGCi31RwnAiEA\noR5f6Ku+cig2Il8T8LJujOp2/2A72QcHZA57B13y+8o=\n-----END CERTIFICATE-----\n" + "validationContext": { + "trustedCa": { + "inlineString": "-----BEGIN CERTIFICATE-----\nMIICXDCCAgKgAwIBAgIICpZq70Z9LyUwCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowFDESMBAG\nA1UEAxMJVGVzdCBDQSAyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEIhywH1gx\nAsMwuF3ukAI5YL2jFxH6Usnma1HFSfVyxbXX1/uoZEYrj8yCAtdU2yoHETyd+Zx2\nThhRLP79pYegCaOCATwwggE4MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTAD\nAQH/MGgGA1UdDgRhBF9kMToxMToxMTphYzoyYTpiYTo5NzpiMjozZjphYzo3Yjpi\nZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1ZTo0MTo2ZjpmMjo3\nMzo5NTo1ODowYzpkYjBqBgNVHSMEYzBhgF9kMToxMToxMTphYzoyYTpiYTo5Nzpi\nMjozZjphYzo3YjpiZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1\nZTo0MTo2ZjpmMjo3Mzo5NTo1ODowYzpkYjA/BgNVHREEODA2hjRzcGlmZmU6Ly8x\nMTExMTExMS0yMjIyLTMzMzMtNDQ0NC01NTU1NTU1NTU1NTUuY29uc3VsMAoGCCqG\nSM49BAMCA0gAMEUCICOY0i246rQHJt8o8Oya0D5PLL1FnmsQmQqIGCi31RwnAiEA\noR5f6Ku+cig2Il8T8LJujOp2/2A72QcHZA57B13y+8o=\n-----END CERTIFICATE-----\n" }, - "matchSubjectAltNames": [ + "matchSubjectAltNames": [ { - "exact": "spiffe://11111111-2222-3333-4444-555555555555.consul/ns/default/dc/dc1/svc/db" + "exact": "spiffe://11111111-2222-3333-4444-555555555555.consul/ns/default/dc/dc1/svc/db" } ] } }, - "sni": "db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul" + "sni": "db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul" } } }, { - "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", - "name": "failover-target~db.default.dc2.internal.11111111-2222-3333-4444-555555555555.consul", - "altStatName": "failover-target~db.default.dc2.internal.11111111-2222-3333-4444-555555555555.consul", - "type": "EDS", - "edsClusterConfig": { - "edsConfig": { - "ads": { - - }, - "resourceApiVersion": "V3" + "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", + "name": "failover-target~1~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "altStatName": "failover-target~1~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "type": "EDS", + "edsClusterConfig": { + "edsConfig": { + "ads": {}, + "resourceApiVersion": "V3" } }, - "connectTimeout": "33s", - "circuitBreakers": { - - }, - "outlierDetection": { - - }, - "commonLbConfig": { - "healthyPanicThreshold": { - - } + "connectTimeout": "33s", + "circuitBreakers": {}, + "outlierDetection": {}, + "commonLbConfig": { + "healthyPanicThreshold": {} }, - "transportSocket": { - "name": "tls", - "typedConfig": { - "@type": "type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext", - "commonTlsContext": { - "tlsParams": { - - }, - "tlsCertificates": [ + "transportSocket": { + "name": "tls", + "typedConfig": { + "@type": "type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext", + "commonTlsContext": { + "tlsParams": {}, + "tlsCertificates": [ { - "certificateChain": { - "inlineString": "-----BEGIN CERTIFICATE-----\nMIICjDCCAjKgAwIBAgIIC5llxGV1gB8wCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowDjEMMAoG\nA1UEAxMDd2ViMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEADPv1RHVNRfa2VKR\nAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Favq5E0ivpNtv1QnFhxtPd7d5k4e+T7\nSkW1TaOCAXIwggFuMA4GA1UdDwEB/wQEAwIDuDAdBgNVHSUEFjAUBggrBgEFBQcD\nAgYIKwYBBQUHAwEwDAYDVR0TAQH/BAIwADBoBgNVHQ4EYQRfN2Q6MDc6ODc6M2E6\nNDA6MTk6NDc6YzM6NWE6YzA6YmE6NjI6ZGY6YWY6NGI6ZDQ6MDU6MjU6NzY6M2Q6\nNWE6OGQ6MTY6OGQ6Njc6NWU6MmU6YTA6MzQ6N2Q6ZGM6ZmYwagYDVR0jBGMwYYBf\nZDE6MTE6MTE6YWM6MmE6YmE6OTc6YjI6M2Y6YWM6N2I6YmQ6ZGE6YmU6YjE6OGE6\nZmM6OWE6YmE6YjU6YmM6ODM6ZTc6NWU6NDE6NmY6ZjI6NzM6OTU6NTg6MGM6ZGIw\nWQYDVR0RBFIwUIZOc3BpZmZlOi8vMTExMTExMTEtMjIyMi0zMzMzLTQ0NDQtNTU1\nNTU1NTU1NTU1LmNvbnN1bC9ucy9kZWZhdWx0L2RjL2RjMS9zdmMvd2ViMAoGCCqG\nSM49BAMCA0gAMEUCIGC3TTvvjj76KMrguVyFf4tjOqaSCRie3nmHMRNNRav7AiEA\npY0heYeK9A6iOLrzqxSerkXXQyj5e9bE4VgUnxgPU6g=\n-----END CERTIFICATE-----\n" + "certificateChain": { + "inlineString": "-----BEGIN CERTIFICATE-----\nMIICjDCCAjKgAwIBAgIIC5llxGV1gB8wCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowDjEMMAoG\nA1UEAxMDd2ViMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEADPv1RHVNRfa2VKR\nAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Favq5E0ivpNtv1QnFhxtPd7d5k4e+T7\nSkW1TaOCAXIwggFuMA4GA1UdDwEB/wQEAwIDuDAdBgNVHSUEFjAUBggrBgEFBQcD\nAgYIKwYBBQUHAwEwDAYDVR0TAQH/BAIwADBoBgNVHQ4EYQRfN2Q6MDc6ODc6M2E6\nNDA6MTk6NDc6YzM6NWE6YzA6YmE6NjI6ZGY6YWY6NGI6ZDQ6MDU6MjU6NzY6M2Q6\nNWE6OGQ6MTY6OGQ6Njc6NWU6MmU6YTA6MzQ6N2Q6ZGM6ZmYwagYDVR0jBGMwYYBf\nZDE6MTE6MTE6YWM6MmE6YmE6OTc6YjI6M2Y6YWM6N2I6YmQ6ZGE6YmU6YjE6OGE6\nZmM6OWE6YmE6YjU6YmM6ODM6ZTc6NWU6NDE6NmY6ZjI6NzM6OTU6NTg6MGM6ZGIw\nWQYDVR0RBFIwUIZOc3BpZmZlOi8vMTExMTExMTEtMjIyMi0zMzMzLTQ0NDQtNTU1\nNTU1NTU1NTU1LmNvbnN1bC9ucy9kZWZhdWx0L2RjL2RjMS9zdmMvd2ViMAoGCCqG\nSM49BAMCA0gAMEUCIGC3TTvvjj76KMrguVyFf4tjOqaSCRie3nmHMRNNRav7AiEA\npY0heYeK9A6iOLrzqxSerkXXQyj5e9bE4VgUnxgPU6g=\n-----END CERTIFICATE-----\n" }, - "privateKey": { - "inlineString": "-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEIMoTkpRggp3fqZzFKh82yS4LjtJI+XY+qX/7DefHFrtdoAoGCCqGSM49\nAwEHoUQDQgAEADPv1RHVNRfa2VKRAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Fav\nq5E0ivpNtv1QnFhxtPd7d5k4e+T7SkW1TQ==\n-----END EC PRIVATE KEY-----\n" + "privateKey": { + "inlineString": "-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEIMoTkpRggp3fqZzFKh82yS4LjtJI+XY+qX/7DefHFrtdoAoGCCqGSM49\nAwEHoUQDQgAEADPv1RHVNRfa2VKRAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Fav\nq5E0ivpNtv1QnFhxtPd7d5k4e+T7SkW1TQ==\n-----END EC PRIVATE KEY-----\n" } } ], - "validationContext": { - "trustedCa": { - "inlineString": "-----BEGIN CERTIFICATE-----\nMIICXDCCAgKgAwIBAgIICpZq70Z9LyUwCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowFDESMBAG\nA1UEAxMJVGVzdCBDQSAyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEIhywH1gx\nAsMwuF3ukAI5YL2jFxH6Usnma1HFSfVyxbXX1/uoZEYrj8yCAtdU2yoHETyd+Zx2\nThhRLP79pYegCaOCATwwggE4MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTAD\nAQH/MGgGA1UdDgRhBF9kMToxMToxMTphYzoyYTpiYTo5NzpiMjozZjphYzo3Yjpi\nZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1ZTo0MTo2ZjpmMjo3\nMzo5NTo1ODowYzpkYjBqBgNVHSMEYzBhgF9kMToxMToxMTphYzoyYTpiYTo5Nzpi\nMjozZjphYzo3YjpiZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1\nZTo0MTo2ZjpmMjo3Mzo5NTo1ODowYzpkYjA/BgNVHREEODA2hjRzcGlmZmU6Ly8x\nMTExMTExMS0yMjIyLTMzMzMtNDQ0NC01NTU1NTU1NTU1NTUuY29uc3VsMAoGCCqG\nSM49BAMCA0gAMEUCICOY0i246rQHJt8o8Oya0D5PLL1FnmsQmQqIGCi31RwnAiEA\noR5f6Ku+cig2Il8T8LJujOp2/2A72QcHZA57B13y+8o=\n-----END CERTIFICATE-----\n" + "validationContext": { + "trustedCa": { + "inlineString": "-----BEGIN CERTIFICATE-----\nMIICXDCCAgKgAwIBAgIICpZq70Z9LyUwCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowFDESMBAG\nA1UEAxMJVGVzdCBDQSAyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEIhywH1gx\nAsMwuF3ukAI5YL2jFxH6Usnma1HFSfVyxbXX1/uoZEYrj8yCAtdU2yoHETyd+Zx2\nThhRLP79pYegCaOCATwwggE4MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTAD\nAQH/MGgGA1UdDgRhBF9kMToxMToxMTphYzoyYTpiYTo5NzpiMjozZjphYzo3Yjpi\nZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1ZTo0MTo2ZjpmMjo3\nMzo5NTo1ODowYzpkYjBqBgNVHSMEYzBhgF9kMToxMToxMTphYzoyYTpiYTo5Nzpi\nMjozZjphYzo3YjpiZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1\nZTo0MTo2ZjpmMjo3Mzo5NTo1ODowYzpkYjA/BgNVHREEODA2hjRzcGlmZmU6Ly8x\nMTExMTExMS0yMjIyLTMzMzMtNDQ0NC01NTU1NTU1NTU1NTUuY29uc3VsMAoGCCqG\nSM49BAMCA0gAMEUCICOY0i246rQHJt8o8Oya0D5PLL1FnmsQmQqIGCi31RwnAiEA\noR5f6Ku+cig2Il8T8LJujOp2/2A72QcHZA57B13y+8o=\n-----END CERTIFICATE-----\n" }, - "matchSubjectAltNames": [ + "matchSubjectAltNames": [ { - "exact": "spiffe://11111111-2222-3333-4444-555555555555.consul/ns/default/dc/dc2/svc/db" + "exact": "spiffe://11111111-2222-3333-4444-555555555555.consul/ns/default/dc/dc2/svc/db" } ] } }, - "sni": "db.default.dc2.internal.11111111-2222-3333-4444-555555555555.consul" + "sni": "db.default.dc2.internal.11111111-2222-3333-4444-555555555555.consul" } } } ], - "typeUrl": "type.googleapis.com/envoy.config.cluster.v3.Cluster", - "nonce": "00000001" + "typeUrl": "type.googleapis.com/envoy.config.cluster.v3.Cluster", + "nonce": "00000001" } \ No newline at end of file diff --git a/agent/xds/testdata/endpoints/connect-proxy-with-chain-and-failover-to-cluster-peer.latest.golden b/agent/xds/testdata/endpoints/connect-proxy-with-chain-and-failover-to-cluster-peer.latest.golden index 5b767ac8615..c12175fbb3b 100644 --- a/agent/xds/testdata/endpoints/connect-proxy-with-chain-and-failover-to-cluster-peer.latest.golden +++ b/agent/xds/testdata/endpoints/connect-proxy-with-chain-and-failover-to-cluster-peer.latest.golden @@ -1,97 +1,97 @@ { - "versionInfo": "00000001", - "resources": [ + "versionInfo": "00000001", + "resources": [ { - "@type": "type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment", - "clusterName": "failover-target~db.default.cluster-01.external.peer1.domain", - "endpoints": [ + "@type": "type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment", + "clusterName": "failover-target~0~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "endpoints": [ { - "lbEndpoints": [ + "lbEndpoints": [ { - "endpoint": { - "address": { - "socketAddress": { - "address": "10.40.1.1", - "portValue": 8080 + "endpoint": { + "address": { + "socketAddress": { + "address": "10.10.1.1", + "portValue": 8080 } } }, - "healthStatus": "HEALTHY", - "loadBalancingWeight": 1 + "healthStatus": "HEALTHY", + "loadBalancingWeight": 1 + }, + { + "endpoint": { + "address": { + "socketAddress": { + "address": "10.10.1.2", + "portValue": 8080 + } + } + }, + "healthStatus": "HEALTHY", + "loadBalancingWeight": 1 } ] } ] }, { - "@type": "type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment", - "clusterName": "failover-target~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", - "endpoints": [ + "@type": "type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment", + "clusterName": "failover-target~1~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "endpoints": [ { - "lbEndpoints": [ - { - "endpoint": { - "address": { - "socketAddress": { - "address": "10.10.1.1", - "portValue": 8080 - } - } - }, - "healthStatus": "HEALTHY", - "loadBalancingWeight": 1 - }, + "lbEndpoints": [ { - "endpoint": { - "address": { - "socketAddress": { - "address": "10.10.1.2", - "portValue": 8080 + "endpoint": { + "address": { + "socketAddress": { + "address": "10.40.1.1", + "portValue": 8080 } } }, - "healthStatus": "HEALTHY", - "loadBalancingWeight": 1 + "healthStatus": "HEALTHY", + "loadBalancingWeight": 1 } ] } ] }, { - "@type": "type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment", - "clusterName": "geo-cache.default.dc1.query.11111111-2222-3333-4444-555555555555.consul", - "endpoints": [ + "@type": "type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment", + "clusterName": "geo-cache.default.dc1.query.11111111-2222-3333-4444-555555555555.consul", + "endpoints": [ { - "lbEndpoints": [ + "lbEndpoints": [ { - "endpoint": { - "address": { - "socketAddress": { - "address": "10.10.1.1", - "portValue": 8080 + "endpoint": { + "address": { + "socketAddress": { + "address": "10.10.1.1", + "portValue": 8080 } } }, - "healthStatus": "HEALTHY", - "loadBalancingWeight": 1 + "healthStatus": "HEALTHY", + "loadBalancingWeight": 1 }, { - "endpoint": { - "address": { - "socketAddress": { - "address": "10.20.1.2", - "portValue": 8080 + "endpoint": { + "address": { + "socketAddress": { + "address": "10.20.1.2", + "portValue": 8080 } } }, - "healthStatus": "HEALTHY", - "loadBalancingWeight": 1 + "healthStatus": "HEALTHY", + "loadBalancingWeight": 1 } ] } ] } ], - "typeUrl": "type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment", - "nonce": "00000001" + "typeUrl": "type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment", + "nonce": "00000001" } \ No newline at end of file diff --git a/agent/xds/testdata/endpoints/connect-proxy-with-chain-and-failover.latest.golden b/agent/xds/testdata/endpoints/connect-proxy-with-chain-and-failover.latest.golden index c3e5de80750..49a84f09b24 100644 --- a/agent/xds/testdata/endpoints/connect-proxy-with-chain-and-failover.latest.golden +++ b/agent/xds/testdata/endpoints/connect-proxy-with-chain-and-failover.latest.golden @@ -1,109 +1,109 @@ { - "versionInfo": "00000001", - "resources": [ + "versionInfo": "00000001", + "resources": [ { - "@type": "type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment", - "clusterName": "failover-target~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", - "endpoints": [ + "@type": "type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment", + "clusterName": "failover-target~0~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "endpoints": [ { - "lbEndpoints": [ + "lbEndpoints": [ { - "endpoint": { - "address": { - "socketAddress": { - "address": "10.10.1.1", - "portValue": 8080 + "endpoint": { + "address": { + "socketAddress": { + "address": "10.10.1.1", + "portValue": 8080 } } }, - "healthStatus": "HEALTHY", - "loadBalancingWeight": 1 + "healthStatus": "HEALTHY", + "loadBalancingWeight": 1 }, { - "endpoint": { - "address": { - "socketAddress": { - "address": "10.10.1.2", - "portValue": 8080 + "endpoint": { + "address": { + "socketAddress": { + "address": "10.10.1.2", + "portValue": 8080 } } }, - "healthStatus": "HEALTHY", - "loadBalancingWeight": 1 + "healthStatus": "HEALTHY", + "loadBalancingWeight": 1 } ] } ] }, { - "@type": "type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment", - "clusterName": "failover-target~fail.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", - "endpoints": [ + "@type": "type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment", + "clusterName": "failover-target~1~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "endpoints": [ { - "lbEndpoints": [ + "lbEndpoints": [ { - "endpoint": { - "address": { - "socketAddress": { - "address": "10.20.1.1", - "portValue": 8080 + "endpoint": { + "address": { + "socketAddress": { + "address": "10.20.1.1", + "portValue": 8080 } } }, - "healthStatus": "HEALTHY", - "loadBalancingWeight": 1 + "healthStatus": "HEALTHY", + "loadBalancingWeight": 1 }, { - "endpoint": { - "address": { - "socketAddress": { - "address": "10.20.1.2", - "portValue": 8080 + "endpoint": { + "address": { + "socketAddress": { + "address": "10.20.1.2", + "portValue": 8080 } } }, - "healthStatus": "HEALTHY", - "loadBalancingWeight": 1 + "healthStatus": "HEALTHY", + "loadBalancingWeight": 1 } ] } ] }, { - "@type": "type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment", - "clusterName": "geo-cache.default.dc1.query.11111111-2222-3333-4444-555555555555.consul", - "endpoints": [ + "@type": "type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment", + "clusterName": "geo-cache.default.dc1.query.11111111-2222-3333-4444-555555555555.consul", + "endpoints": [ { - "lbEndpoints": [ + "lbEndpoints": [ { - "endpoint": { - "address": { - "socketAddress": { - "address": "10.10.1.1", - "portValue": 8080 + "endpoint": { + "address": { + "socketAddress": { + "address": "10.10.1.1", + "portValue": 8080 } } }, - "healthStatus": "HEALTHY", - "loadBalancingWeight": 1 + "healthStatus": "HEALTHY", + "loadBalancingWeight": 1 }, { - "endpoint": { - "address": { - "socketAddress": { - "address": "10.20.1.2", - "portValue": 8080 + "endpoint": { + "address": { + "socketAddress": { + "address": "10.20.1.2", + "portValue": 8080 } } }, - "healthStatus": "HEALTHY", - "loadBalancingWeight": 1 + "healthStatus": "HEALTHY", + "loadBalancingWeight": 1 } ] } ] } ], - "typeUrl": "type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment", - "nonce": "00000001" + "typeUrl": "type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment", + "nonce": "00000001" } \ No newline at end of file diff --git a/agent/xds/testdata/endpoints/connect-proxy-with-tcp-chain-double-failover-through-local-gateway-triggered.latest.golden b/agent/xds/testdata/endpoints/connect-proxy-with-tcp-chain-double-failover-through-local-gateway-triggered.latest.golden index d8c936d61b6..b98fbf6d4e4 100644 --- a/agent/xds/testdata/endpoints/connect-proxy-with-tcp-chain-double-failover-through-local-gateway-triggered.latest.golden +++ b/agent/xds/testdata/endpoints/connect-proxy-with-tcp-chain-double-failover-through-local-gateway-triggered.latest.golden @@ -1,143 +1,143 @@ { - "versionInfo": "00000001", - "resources": [ + "versionInfo": "00000001", + "resources": [ { - "@type": "type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment", - "clusterName": "failover-target~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", - "endpoints": [ + "@type": "type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment", + "clusterName": "failover-target~0~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "endpoints": [ { - "lbEndpoints": [ + "lbEndpoints": [ { - "endpoint": { - "address": { - "socketAddress": { - "address": "10.10.1.1", - "portValue": 8080 + "endpoint": { + "address": { + "socketAddress": { + "address": "10.10.1.1", + "portValue": 8080 } } }, - "healthStatus": "UNHEALTHY", - "loadBalancingWeight": 1 + "healthStatus": "UNHEALTHY", + "loadBalancingWeight": 1 }, { - "endpoint": { - "address": { - "socketAddress": { - "address": "10.10.1.2", - "portValue": 8080 + "endpoint": { + "address": { + "socketAddress": { + "address": "10.10.1.2", + "portValue": 8080 } } }, - "healthStatus": "UNHEALTHY", - "loadBalancingWeight": 1 + "healthStatus": "UNHEALTHY", + "loadBalancingWeight": 1 } ] } ] }, { - "@type": "type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment", - "clusterName": "failover-target~db.default.dc2.internal.11111111-2222-3333-4444-555555555555.consul", - "endpoints": [ + "@type": "type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment", + "clusterName": "failover-target~1~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "endpoints": [ { - "lbEndpoints": [ + "lbEndpoints": [ { - "endpoint": { - "address": { - "socketAddress": { - "address": "10.10.1.1", - "portValue": 8443 + "endpoint": { + "address": { + "socketAddress": { + "address": "10.10.1.1", + "portValue": 8443 } } }, - "healthStatus": "UNHEALTHY", - "loadBalancingWeight": 1 + "healthStatus": "UNHEALTHY", + "loadBalancingWeight": 1 }, { - "endpoint": { - "address": { - "socketAddress": { - "address": "10.10.1.2", - "portValue": 8443 + "endpoint": { + "address": { + "socketAddress": { + "address": "10.10.1.2", + "portValue": 8443 } } }, - "healthStatus": "UNHEALTHY", - "loadBalancingWeight": 1 + "healthStatus": "UNHEALTHY", + "loadBalancingWeight": 1 } ] } ] }, { - "@type": "type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment", - "clusterName": "failover-target~db.default.dc3.internal.11111111-2222-3333-4444-555555555555.consul", - "endpoints": [ + "@type": "type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment", + "clusterName": "failover-target~2~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "endpoints": [ { - "lbEndpoints": [ + "lbEndpoints": [ { - "endpoint": { - "address": { - "socketAddress": { - "address": "10.10.1.1", - "portValue": 8443 + "endpoint": { + "address": { + "socketAddress": { + "address": "10.10.1.1", + "portValue": 8443 } } }, - "healthStatus": "HEALTHY", - "loadBalancingWeight": 1 + "healthStatus": "HEALTHY", + "loadBalancingWeight": 1 }, { - "endpoint": { - "address": { - "socketAddress": { - "address": "10.10.1.2", - "portValue": 8443 + "endpoint": { + "address": { + "socketAddress": { + "address": "10.10.1.2", + "portValue": 8443 } } }, - "healthStatus": "HEALTHY", - "loadBalancingWeight": 1 + "healthStatus": "HEALTHY", + "loadBalancingWeight": 1 } ] } ] }, { - "@type": "type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment", - "clusterName": "geo-cache.default.dc1.query.11111111-2222-3333-4444-555555555555.consul", - "endpoints": [ + "@type": "type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment", + "clusterName": "geo-cache.default.dc1.query.11111111-2222-3333-4444-555555555555.consul", + "endpoints": [ { - "lbEndpoints": [ + "lbEndpoints": [ { - "endpoint": { - "address": { - "socketAddress": { - "address": "10.10.1.1", - "portValue": 8080 + "endpoint": { + "address": { + "socketAddress": { + "address": "10.10.1.1", + "portValue": 8080 } } }, - "healthStatus": "HEALTHY", - "loadBalancingWeight": 1 + "healthStatus": "HEALTHY", + "loadBalancingWeight": 1 }, { - "endpoint": { - "address": { - "socketAddress": { - "address": "10.20.1.2", - "portValue": 8080 + "endpoint": { + "address": { + "socketAddress": { + "address": "10.20.1.2", + "portValue": 8080 } } }, - "healthStatus": "HEALTHY", - "loadBalancingWeight": 1 + "healthStatus": "HEALTHY", + "loadBalancingWeight": 1 } ] } ] } ], - "typeUrl": "type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment", - "nonce": "00000001" + "typeUrl": "type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment", + "nonce": "00000001" } \ No newline at end of file diff --git a/agent/xds/testdata/endpoints/connect-proxy-with-tcp-chain-double-failover-through-local-gateway.latest.golden b/agent/xds/testdata/endpoints/connect-proxy-with-tcp-chain-double-failover-through-local-gateway.latest.golden index 40ae7a08973..e830304436c 100644 --- a/agent/xds/testdata/endpoints/connect-proxy-with-tcp-chain-double-failover-through-local-gateway.latest.golden +++ b/agent/xds/testdata/endpoints/connect-proxy-with-tcp-chain-double-failover-through-local-gateway.latest.golden @@ -1,109 +1,109 @@ { - "versionInfo": "00000001", - "resources": [ + "versionInfo": "00000001", + "resources": [ { - "@type": "type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment", - "clusterName": "failover-target~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", - "endpoints": [ + "@type": "type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment", + "clusterName": "failover-target~0~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "endpoints": [ { - "lbEndpoints": [ + "lbEndpoints": [ { - "endpoint": { - "address": { - "socketAddress": { - "address": "10.10.1.1", - "portValue": 8080 + "endpoint": { + "address": { + "socketAddress": { + "address": "10.10.1.1", + "portValue": 8080 } } }, - "healthStatus": "HEALTHY", - "loadBalancingWeight": 1 + "healthStatus": "HEALTHY", + "loadBalancingWeight": 1 }, { - "endpoint": { - "address": { - "socketAddress": { - "address": "10.10.1.2", - "portValue": 8080 + "endpoint": { + "address": { + "socketAddress": { + "address": "10.10.1.2", + "portValue": 8080 } } }, - "healthStatus": "HEALTHY", - "loadBalancingWeight": 1 + "healthStatus": "HEALTHY", + "loadBalancingWeight": 1 } ] } ] }, { - "@type": "type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment", - "clusterName": "failover-target~db.default.dc3.internal.11111111-2222-3333-4444-555555555555.consul", - "endpoints": [ + "@type": "type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment", + "clusterName": "failover-target~2~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "endpoints": [ { - "lbEndpoints": [ + "lbEndpoints": [ { - "endpoint": { - "address": { - "socketAddress": { - "address": "10.10.1.1", - "portValue": 8443 + "endpoint": { + "address": { + "socketAddress": { + "address": "10.10.1.1", + "portValue": 8443 } } }, - "healthStatus": "HEALTHY", - "loadBalancingWeight": 1 + "healthStatus": "HEALTHY", + "loadBalancingWeight": 1 }, { - "endpoint": { - "address": { - "socketAddress": { - "address": "10.10.1.2", - "portValue": 8443 + "endpoint": { + "address": { + "socketAddress": { + "address": "10.10.1.2", + "portValue": 8443 } } }, - "healthStatus": "HEALTHY", - "loadBalancingWeight": 1 + "healthStatus": "HEALTHY", + "loadBalancingWeight": 1 } ] } ] }, { - "@type": "type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment", - "clusterName": "geo-cache.default.dc1.query.11111111-2222-3333-4444-555555555555.consul", - "endpoints": [ + "@type": "type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment", + "clusterName": "geo-cache.default.dc1.query.11111111-2222-3333-4444-555555555555.consul", + "endpoints": [ { - "lbEndpoints": [ + "lbEndpoints": [ { - "endpoint": { - "address": { - "socketAddress": { - "address": "10.10.1.1", - "portValue": 8080 + "endpoint": { + "address": { + "socketAddress": { + "address": "10.10.1.1", + "portValue": 8080 } } }, - "healthStatus": "HEALTHY", - "loadBalancingWeight": 1 + "healthStatus": "HEALTHY", + "loadBalancingWeight": 1 }, { - "endpoint": { - "address": { - "socketAddress": { - "address": "10.20.1.2", - "portValue": 8080 + "endpoint": { + "address": { + "socketAddress": { + "address": "10.20.1.2", + "portValue": 8080 } } }, - "healthStatus": "HEALTHY", - "loadBalancingWeight": 1 + "healthStatus": "HEALTHY", + "loadBalancingWeight": 1 } ] } ] } ], - "typeUrl": "type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment", - "nonce": "00000001" + "typeUrl": "type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment", + "nonce": "00000001" } \ No newline at end of file diff --git a/agent/xds/testdata/endpoints/connect-proxy-with-tcp-chain-double-failover-through-remote-gateway-triggered.latest.golden b/agent/xds/testdata/endpoints/connect-proxy-with-tcp-chain-double-failover-through-remote-gateway-triggered.latest.golden index 356b5b84765..3450b9128ad 100644 --- a/agent/xds/testdata/endpoints/connect-proxy-with-tcp-chain-double-failover-through-remote-gateway-triggered.latest.golden +++ b/agent/xds/testdata/endpoints/connect-proxy-with-tcp-chain-double-failover-through-remote-gateway-triggered.latest.golden @@ -1,143 +1,143 @@ { - "versionInfo": "00000001", - "resources": [ + "versionInfo": "00000001", + "resources": [ { - "@type": "type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment", - "clusterName": "failover-target~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", - "endpoints": [ + "@type": "type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment", + "clusterName": "failover-target~0~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "endpoints": [ { - "lbEndpoints": [ + "lbEndpoints": [ { - "endpoint": { - "address": { - "socketAddress": { - "address": "10.10.1.1", - "portValue": 8080 + "endpoint": { + "address": { + "socketAddress": { + "address": "10.10.1.1", + "portValue": 8080 } } }, - "healthStatus": "UNHEALTHY", - "loadBalancingWeight": 1 + "healthStatus": "UNHEALTHY", + "loadBalancingWeight": 1 }, { - "endpoint": { - "address": { - "socketAddress": { - "address": "10.10.1.2", - "portValue": 8080 + "endpoint": { + "address": { + "socketAddress": { + "address": "10.10.1.2", + "portValue": 8080 } } }, - "healthStatus": "UNHEALTHY", - "loadBalancingWeight": 1 + "healthStatus": "UNHEALTHY", + "loadBalancingWeight": 1 } ] } ] }, { - "@type": "type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment", - "clusterName": "failover-target~db.default.dc2.internal.11111111-2222-3333-4444-555555555555.consul", - "endpoints": [ + "@type": "type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment", + "clusterName": "failover-target~1~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "endpoints": [ { - "lbEndpoints": [ + "lbEndpoints": [ { - "endpoint": { - "address": { - "socketAddress": { - "address": "198.18.1.1", - "portValue": 443 + "endpoint": { + "address": { + "socketAddress": { + "address": "198.18.1.1", + "portValue": 443 } } }, - "healthStatus": "UNHEALTHY", - "loadBalancingWeight": 1 + "healthStatus": "UNHEALTHY", + "loadBalancingWeight": 1 }, { - "endpoint": { - "address": { - "socketAddress": { - "address": "198.18.1.2", - "portValue": 443 + "endpoint": { + "address": { + "socketAddress": { + "address": "198.18.1.2", + "portValue": 443 } } }, - "healthStatus": "UNHEALTHY", - "loadBalancingWeight": 1 + "healthStatus": "UNHEALTHY", + "loadBalancingWeight": 1 } ] } ] }, { - "@type": "type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment", - "clusterName": "failover-target~db.default.dc3.internal.11111111-2222-3333-4444-555555555555.consul", - "endpoints": [ + "@type": "type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment", + "clusterName": "failover-target~2~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "endpoints": [ { - "lbEndpoints": [ + "lbEndpoints": [ { - "endpoint": { - "address": { - "socketAddress": { - "address": "198.38.1.1", - "portValue": 443 + "endpoint": { + "address": { + "socketAddress": { + "address": "198.38.1.1", + "portValue": 443 } } }, - "healthStatus": "HEALTHY", - "loadBalancingWeight": 1 + "healthStatus": "HEALTHY", + "loadBalancingWeight": 1 }, { - "endpoint": { - "address": { - "socketAddress": { - "address": "198.38.1.2", - "portValue": 443 + "endpoint": { + "address": { + "socketAddress": { + "address": "198.38.1.2", + "portValue": 443 } } }, - "healthStatus": "HEALTHY", - "loadBalancingWeight": 1 + "healthStatus": "HEALTHY", + "loadBalancingWeight": 1 } ] } ] }, { - "@type": "type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment", - "clusterName": "geo-cache.default.dc1.query.11111111-2222-3333-4444-555555555555.consul", - "endpoints": [ + "@type": "type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment", + "clusterName": "geo-cache.default.dc1.query.11111111-2222-3333-4444-555555555555.consul", + "endpoints": [ { - "lbEndpoints": [ + "lbEndpoints": [ { - "endpoint": { - "address": { - "socketAddress": { - "address": "10.10.1.1", - "portValue": 8080 + "endpoint": { + "address": { + "socketAddress": { + "address": "10.10.1.1", + "portValue": 8080 } } }, - "healthStatus": "HEALTHY", - "loadBalancingWeight": 1 + "healthStatus": "HEALTHY", + "loadBalancingWeight": 1 }, { - "endpoint": { - "address": { - "socketAddress": { - "address": "10.20.1.2", - "portValue": 8080 + "endpoint": { + "address": { + "socketAddress": { + "address": "10.20.1.2", + "portValue": 8080 } } }, - "healthStatus": "HEALTHY", - "loadBalancingWeight": 1 + "healthStatus": "HEALTHY", + "loadBalancingWeight": 1 } ] } ] } ], - "typeUrl": "type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment", - "nonce": "00000001" + "typeUrl": "type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment", + "nonce": "00000001" } \ No newline at end of file diff --git a/agent/xds/testdata/endpoints/connect-proxy-with-tcp-chain-double-failover-through-remote-gateway.latest.golden b/agent/xds/testdata/endpoints/connect-proxy-with-tcp-chain-double-failover-through-remote-gateway.latest.golden index 1f88cfbb3f8..d2922125cb9 100644 --- a/agent/xds/testdata/endpoints/connect-proxy-with-tcp-chain-double-failover-through-remote-gateway.latest.golden +++ b/agent/xds/testdata/endpoints/connect-proxy-with-tcp-chain-double-failover-through-remote-gateway.latest.golden @@ -1,109 +1,109 @@ { - "versionInfo": "00000001", - "resources": [ + "versionInfo": "00000001", + "resources": [ { - "@type": "type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment", - "clusterName": "failover-target~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", - "endpoints": [ + "@type": "type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment", + "clusterName": "failover-target~0~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "endpoints": [ { - "lbEndpoints": [ + "lbEndpoints": [ { - "endpoint": { - "address": { - "socketAddress": { - "address": "10.10.1.1", - "portValue": 8080 + "endpoint": { + "address": { + "socketAddress": { + "address": "10.10.1.1", + "portValue": 8080 } } }, - "healthStatus": "HEALTHY", - "loadBalancingWeight": 1 + "healthStatus": "HEALTHY", + "loadBalancingWeight": 1 }, { - "endpoint": { - "address": { - "socketAddress": { - "address": "10.10.1.2", - "portValue": 8080 + "endpoint": { + "address": { + "socketAddress": { + "address": "10.10.1.2", + "portValue": 8080 } } }, - "healthStatus": "HEALTHY", - "loadBalancingWeight": 1 + "healthStatus": "HEALTHY", + "loadBalancingWeight": 1 } ] } ] }, { - "@type": "type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment", - "clusterName": "failover-target~db.default.dc3.internal.11111111-2222-3333-4444-555555555555.consul", - "endpoints": [ + "@type": "type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment", + "clusterName": "failover-target~2~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "endpoints": [ { - "lbEndpoints": [ + "lbEndpoints": [ { - "endpoint": { - "address": { - "socketAddress": { - "address": "198.38.1.1", - "portValue": 443 + "endpoint": { + "address": { + "socketAddress": { + "address": "198.38.1.1", + "portValue": 443 } } }, - "healthStatus": "HEALTHY", - "loadBalancingWeight": 1 + "healthStatus": "HEALTHY", + "loadBalancingWeight": 1 }, { - "endpoint": { - "address": { - "socketAddress": { - "address": "198.38.1.2", - "portValue": 443 + "endpoint": { + "address": { + "socketAddress": { + "address": "198.38.1.2", + "portValue": 443 } } }, - "healthStatus": "HEALTHY", - "loadBalancingWeight": 1 + "healthStatus": "HEALTHY", + "loadBalancingWeight": 1 } ] } ] }, { - "@type": "type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment", - "clusterName": "geo-cache.default.dc1.query.11111111-2222-3333-4444-555555555555.consul", - "endpoints": [ + "@type": "type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment", + "clusterName": "geo-cache.default.dc1.query.11111111-2222-3333-4444-555555555555.consul", + "endpoints": [ { - "lbEndpoints": [ + "lbEndpoints": [ { - "endpoint": { - "address": { - "socketAddress": { - "address": "10.10.1.1", - "portValue": 8080 + "endpoint": { + "address": { + "socketAddress": { + "address": "10.10.1.1", + "portValue": 8080 } } }, - "healthStatus": "HEALTHY", - "loadBalancingWeight": 1 + "healthStatus": "HEALTHY", + "loadBalancingWeight": 1 }, { - "endpoint": { - "address": { - "socketAddress": { - "address": "10.20.1.2", - "portValue": 8080 + "endpoint": { + "address": { + "socketAddress": { + "address": "10.20.1.2", + "portValue": 8080 } } }, - "healthStatus": "HEALTHY", - "loadBalancingWeight": 1 + "healthStatus": "HEALTHY", + "loadBalancingWeight": 1 } ] } ] } ], - "typeUrl": "type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment", - "nonce": "00000001" + "typeUrl": "type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment", + "nonce": "00000001" } \ No newline at end of file diff --git a/agent/xds/testdata/endpoints/connect-proxy-with-tcp-chain-failover-through-local-gateway-triggered.latest.golden b/agent/xds/testdata/endpoints/connect-proxy-with-tcp-chain-failover-through-local-gateway-triggered.latest.golden index dd6083fa244..9a8ebe10321 100644 --- a/agent/xds/testdata/endpoints/connect-proxy-with-tcp-chain-failover-through-local-gateway-triggered.latest.golden +++ b/agent/xds/testdata/endpoints/connect-proxy-with-tcp-chain-failover-through-local-gateway-triggered.latest.golden @@ -1,109 +1,109 @@ { - "versionInfo": "00000001", - "resources": [ + "versionInfo": "00000001", + "resources": [ { - "@type": "type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment", - "clusterName": "failover-target~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", - "endpoints": [ + "@type": "type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment", + "clusterName": "failover-target~0~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "endpoints": [ { - "lbEndpoints": [ + "lbEndpoints": [ { - "endpoint": { - "address": { - "socketAddress": { - "address": "10.10.1.1", - "portValue": 8080 + "endpoint": { + "address": { + "socketAddress": { + "address": "10.10.1.1", + "portValue": 8080 } } }, - "healthStatus": "UNHEALTHY", - "loadBalancingWeight": 1 + "healthStatus": "UNHEALTHY", + "loadBalancingWeight": 1 }, { - "endpoint": { - "address": { - "socketAddress": { - "address": "10.10.1.2", - "portValue": 8080 + "endpoint": { + "address": { + "socketAddress": { + "address": "10.10.1.2", + "portValue": 8080 } } }, - "healthStatus": "UNHEALTHY", - "loadBalancingWeight": 1 + "healthStatus": "UNHEALTHY", + "loadBalancingWeight": 1 } ] } ] }, { - "@type": "type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment", - "clusterName": "failover-target~db.default.dc2.internal.11111111-2222-3333-4444-555555555555.consul", - "endpoints": [ + "@type": "type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment", + "clusterName": "failover-target~1~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "endpoints": [ { - "lbEndpoints": [ + "lbEndpoints": [ { - "endpoint": { - "address": { - "socketAddress": { - "address": "10.10.1.1", - "portValue": 8443 + "endpoint": { + "address": { + "socketAddress": { + "address": "10.10.1.1", + "portValue": 8443 } } }, - "healthStatus": "HEALTHY", - "loadBalancingWeight": 1 + "healthStatus": "HEALTHY", + "loadBalancingWeight": 1 }, { - "endpoint": { - "address": { - "socketAddress": { - "address": "10.10.1.2", - "portValue": 8443 + "endpoint": { + "address": { + "socketAddress": { + "address": "10.10.1.2", + "portValue": 8443 } } }, - "healthStatus": "HEALTHY", - "loadBalancingWeight": 1 + "healthStatus": "HEALTHY", + "loadBalancingWeight": 1 } ] } ] }, { - "@type": "type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment", - "clusterName": "geo-cache.default.dc1.query.11111111-2222-3333-4444-555555555555.consul", - "endpoints": [ + "@type": "type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment", + "clusterName": "geo-cache.default.dc1.query.11111111-2222-3333-4444-555555555555.consul", + "endpoints": [ { - "lbEndpoints": [ + "lbEndpoints": [ { - "endpoint": { - "address": { - "socketAddress": { - "address": "10.10.1.1", - "portValue": 8080 + "endpoint": { + "address": { + "socketAddress": { + "address": "10.10.1.1", + "portValue": 8080 } } }, - "healthStatus": "HEALTHY", - "loadBalancingWeight": 1 + "healthStatus": "HEALTHY", + "loadBalancingWeight": 1 }, { - "endpoint": { - "address": { - "socketAddress": { - "address": "10.20.1.2", - "portValue": 8080 + "endpoint": { + "address": { + "socketAddress": { + "address": "10.20.1.2", + "portValue": 8080 } } }, - "healthStatus": "HEALTHY", - "loadBalancingWeight": 1 + "healthStatus": "HEALTHY", + "loadBalancingWeight": 1 } ] } ] } ], - "typeUrl": "type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment", - "nonce": "00000001" + "typeUrl": "type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment", + "nonce": "00000001" } \ No newline at end of file diff --git a/agent/xds/testdata/endpoints/connect-proxy-with-tcp-chain-failover-through-local-gateway.latest.golden b/agent/xds/testdata/endpoints/connect-proxy-with-tcp-chain-failover-through-local-gateway.latest.golden index 5e45cbd43ee..5cc24cc5e95 100644 --- a/agent/xds/testdata/endpoints/connect-proxy-with-tcp-chain-failover-through-local-gateway.latest.golden +++ b/agent/xds/testdata/endpoints/connect-proxy-with-tcp-chain-failover-through-local-gateway.latest.golden @@ -1,109 +1,109 @@ { - "versionInfo": "00000001", - "resources": [ + "versionInfo": "00000001", + "resources": [ { - "@type": "type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment", - "clusterName": "failover-target~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", - "endpoints": [ + "@type": "type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment", + "clusterName": "failover-target~0~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "endpoints": [ { - "lbEndpoints": [ + "lbEndpoints": [ { - "endpoint": { - "address": { - "socketAddress": { - "address": "10.10.1.1", - "portValue": 8080 + "endpoint": { + "address": { + "socketAddress": { + "address": "10.10.1.1", + "portValue": 8080 } } }, - "healthStatus": "HEALTHY", - "loadBalancingWeight": 1 + "healthStatus": "HEALTHY", + "loadBalancingWeight": 1 }, { - "endpoint": { - "address": { - "socketAddress": { - "address": "10.10.1.2", - "portValue": 8080 + "endpoint": { + "address": { + "socketAddress": { + "address": "10.10.1.2", + "portValue": 8080 } } }, - "healthStatus": "HEALTHY", - "loadBalancingWeight": 1 + "healthStatus": "HEALTHY", + "loadBalancingWeight": 1 } ] } ] }, { - "@type": "type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment", - "clusterName": "failover-target~db.default.dc2.internal.11111111-2222-3333-4444-555555555555.consul", - "endpoints": [ + "@type": "type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment", + "clusterName": "failover-target~1~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "endpoints": [ { - "lbEndpoints": [ + "lbEndpoints": [ { - "endpoint": { - "address": { - "socketAddress": { - "address": "10.10.1.1", - "portValue": 8443 + "endpoint": { + "address": { + "socketAddress": { + "address": "10.10.1.1", + "portValue": 8443 } } }, - "healthStatus": "HEALTHY", - "loadBalancingWeight": 1 + "healthStatus": "HEALTHY", + "loadBalancingWeight": 1 }, { - "endpoint": { - "address": { - "socketAddress": { - "address": "10.10.1.2", - "portValue": 8443 + "endpoint": { + "address": { + "socketAddress": { + "address": "10.10.1.2", + "portValue": 8443 } } }, - "healthStatus": "HEALTHY", - "loadBalancingWeight": 1 + "healthStatus": "HEALTHY", + "loadBalancingWeight": 1 } ] } ] }, { - "@type": "type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment", - "clusterName": "geo-cache.default.dc1.query.11111111-2222-3333-4444-555555555555.consul", - "endpoints": [ + "@type": "type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment", + "clusterName": "geo-cache.default.dc1.query.11111111-2222-3333-4444-555555555555.consul", + "endpoints": [ { - "lbEndpoints": [ + "lbEndpoints": [ { - "endpoint": { - "address": { - "socketAddress": { - "address": "10.10.1.1", - "portValue": 8080 + "endpoint": { + "address": { + "socketAddress": { + "address": "10.10.1.1", + "portValue": 8080 } } }, - "healthStatus": "HEALTHY", - "loadBalancingWeight": 1 + "healthStatus": "HEALTHY", + "loadBalancingWeight": 1 }, { - "endpoint": { - "address": { - "socketAddress": { - "address": "10.20.1.2", - "portValue": 8080 + "endpoint": { + "address": { + "socketAddress": { + "address": "10.20.1.2", + "portValue": 8080 } } }, - "healthStatus": "HEALTHY", - "loadBalancingWeight": 1 + "healthStatus": "HEALTHY", + "loadBalancingWeight": 1 } ] } ] } ], - "typeUrl": "type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment", - "nonce": "00000001" + "typeUrl": "type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment", + "nonce": "00000001" } \ No newline at end of file diff --git a/agent/xds/testdata/endpoints/connect-proxy-with-tcp-chain-failover-through-remote-gateway-triggered.latest.golden b/agent/xds/testdata/endpoints/connect-proxy-with-tcp-chain-failover-through-remote-gateway-triggered.latest.golden index 6a840c993dd..1e390a85c82 100644 --- a/agent/xds/testdata/endpoints/connect-proxy-with-tcp-chain-failover-through-remote-gateway-triggered.latest.golden +++ b/agent/xds/testdata/endpoints/connect-proxy-with-tcp-chain-failover-through-remote-gateway-triggered.latest.golden @@ -1,109 +1,109 @@ { - "versionInfo": "00000001", - "resources": [ + "versionInfo": "00000001", + "resources": [ { - "@type": "type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment", - "clusterName": "failover-target~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", - "endpoints": [ + "@type": "type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment", + "clusterName": "failover-target~0~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "endpoints": [ { - "lbEndpoints": [ + "lbEndpoints": [ { - "endpoint": { - "address": { - "socketAddress": { - "address": "10.10.1.1", - "portValue": 8080 + "endpoint": { + "address": { + "socketAddress": { + "address": "10.10.1.1", + "portValue": 8080 } } }, - "healthStatus": "UNHEALTHY", - "loadBalancingWeight": 1 + "healthStatus": "UNHEALTHY", + "loadBalancingWeight": 1 }, { - "endpoint": { - "address": { - "socketAddress": { - "address": "10.10.1.2", - "portValue": 8080 + "endpoint": { + "address": { + "socketAddress": { + "address": "10.10.1.2", + "portValue": 8080 } } }, - "healthStatus": "UNHEALTHY", - "loadBalancingWeight": 1 + "healthStatus": "UNHEALTHY", + "loadBalancingWeight": 1 } ] } ] }, { - "@type": "type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment", - "clusterName": "failover-target~db.default.dc2.internal.11111111-2222-3333-4444-555555555555.consul", - "endpoints": [ + "@type": "type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment", + "clusterName": "failover-target~1~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "endpoints": [ { - "lbEndpoints": [ + "lbEndpoints": [ { - "endpoint": { - "address": { - "socketAddress": { - "address": "198.18.1.1", - "portValue": 443 + "endpoint": { + "address": { + "socketAddress": { + "address": "198.18.1.1", + "portValue": 443 } } }, - "healthStatus": "HEALTHY", - "loadBalancingWeight": 1 + "healthStatus": "HEALTHY", + "loadBalancingWeight": 1 }, { - "endpoint": { - "address": { - "socketAddress": { - "address": "198.18.1.2", - "portValue": 443 + "endpoint": { + "address": { + "socketAddress": { + "address": "198.18.1.2", + "portValue": 443 } } }, - "healthStatus": "HEALTHY", - "loadBalancingWeight": 1 + "healthStatus": "HEALTHY", + "loadBalancingWeight": 1 } ] } ] }, { - "@type": "type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment", - "clusterName": "geo-cache.default.dc1.query.11111111-2222-3333-4444-555555555555.consul", - "endpoints": [ + "@type": "type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment", + "clusterName": "geo-cache.default.dc1.query.11111111-2222-3333-4444-555555555555.consul", + "endpoints": [ { - "lbEndpoints": [ + "lbEndpoints": [ { - "endpoint": { - "address": { - "socketAddress": { - "address": "10.10.1.1", - "portValue": 8080 + "endpoint": { + "address": { + "socketAddress": { + "address": "10.10.1.1", + "portValue": 8080 } } }, - "healthStatus": "HEALTHY", - "loadBalancingWeight": 1 + "healthStatus": "HEALTHY", + "loadBalancingWeight": 1 }, { - "endpoint": { - "address": { - "socketAddress": { - "address": "10.20.1.2", - "portValue": 8080 + "endpoint": { + "address": { + "socketAddress": { + "address": "10.20.1.2", + "portValue": 8080 } } }, - "healthStatus": "HEALTHY", - "loadBalancingWeight": 1 + "healthStatus": "HEALTHY", + "loadBalancingWeight": 1 } ] } ] } ], - "typeUrl": "type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment", - "nonce": "00000001" + "typeUrl": "type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment", + "nonce": "00000001" } \ No newline at end of file diff --git a/agent/xds/testdata/endpoints/connect-proxy-with-tcp-chain-failover-through-remote-gateway.latest.golden b/agent/xds/testdata/endpoints/connect-proxy-with-tcp-chain-failover-through-remote-gateway.latest.golden index 29f1a8c59c3..c90fef8a1ba 100644 --- a/agent/xds/testdata/endpoints/connect-proxy-with-tcp-chain-failover-through-remote-gateway.latest.golden +++ b/agent/xds/testdata/endpoints/connect-proxy-with-tcp-chain-failover-through-remote-gateway.latest.golden @@ -1,109 +1,109 @@ { - "versionInfo": "00000001", - "resources": [ + "versionInfo": "00000001", + "resources": [ { - "@type": "type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment", - "clusterName": "failover-target~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", - "endpoints": [ + "@type": "type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment", + "clusterName": "failover-target~0~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "endpoints": [ { - "lbEndpoints": [ + "lbEndpoints": [ { - "endpoint": { - "address": { - "socketAddress": { - "address": "10.10.1.1", - "portValue": 8080 + "endpoint": { + "address": { + "socketAddress": { + "address": "10.10.1.1", + "portValue": 8080 } } }, - "healthStatus": "HEALTHY", - "loadBalancingWeight": 1 + "healthStatus": "HEALTHY", + "loadBalancingWeight": 1 }, { - "endpoint": { - "address": { - "socketAddress": { - "address": "10.10.1.2", - "portValue": 8080 + "endpoint": { + "address": { + "socketAddress": { + "address": "10.10.1.2", + "portValue": 8080 } } }, - "healthStatus": "HEALTHY", - "loadBalancingWeight": 1 + "healthStatus": "HEALTHY", + "loadBalancingWeight": 1 } ] } ] }, { - "@type": "type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment", - "clusterName": "failover-target~db.default.dc2.internal.11111111-2222-3333-4444-555555555555.consul", - "endpoints": [ + "@type": "type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment", + "clusterName": "failover-target~1~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "endpoints": [ { - "lbEndpoints": [ + "lbEndpoints": [ { - "endpoint": { - "address": { - "socketAddress": { - "address": "198.18.1.1", - "portValue": 443 + "endpoint": { + "address": { + "socketAddress": { + "address": "198.18.1.1", + "portValue": 443 } } }, - "healthStatus": "HEALTHY", - "loadBalancingWeight": 1 + "healthStatus": "HEALTHY", + "loadBalancingWeight": 1 }, { - "endpoint": { - "address": { - "socketAddress": { - "address": "198.18.1.2", - "portValue": 443 + "endpoint": { + "address": { + "socketAddress": { + "address": "198.18.1.2", + "portValue": 443 } } }, - "healthStatus": "HEALTHY", - "loadBalancingWeight": 1 + "healthStatus": "HEALTHY", + "loadBalancingWeight": 1 } ] } ] }, { - "@type": "type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment", - "clusterName": "geo-cache.default.dc1.query.11111111-2222-3333-4444-555555555555.consul", - "endpoints": [ + "@type": "type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment", + "clusterName": "geo-cache.default.dc1.query.11111111-2222-3333-4444-555555555555.consul", + "endpoints": [ { - "lbEndpoints": [ + "lbEndpoints": [ { - "endpoint": { - "address": { - "socketAddress": { - "address": "10.10.1.1", - "portValue": 8080 + "endpoint": { + "address": { + "socketAddress": { + "address": "10.10.1.1", + "portValue": 8080 } } }, - "healthStatus": "HEALTHY", - "loadBalancingWeight": 1 + "healthStatus": "HEALTHY", + "loadBalancingWeight": 1 }, { - "endpoint": { - "address": { - "socketAddress": { - "address": "10.20.1.2", - "portValue": 8080 + "endpoint": { + "address": { + "socketAddress": { + "address": "10.20.1.2", + "portValue": 8080 } } }, - "healthStatus": "HEALTHY", - "loadBalancingWeight": 1 + "healthStatus": "HEALTHY", + "loadBalancingWeight": 1 } ] } ] } ], - "typeUrl": "type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment", - "nonce": "00000001" + "typeUrl": "type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment", + "nonce": "00000001" } \ No newline at end of file diff --git a/agent/xds/testdata/endpoints/ingress-with-chain-and-failover-to-cluster-peer.latest.golden b/agent/xds/testdata/endpoints/ingress-with-chain-and-failover-to-cluster-peer.latest.golden index d919f819528..3635a4779da 100644 --- a/agent/xds/testdata/endpoints/ingress-with-chain-and-failover-to-cluster-peer.latest.golden +++ b/agent/xds/testdata/endpoints/ingress-with-chain-and-failover-to-cluster-peer.latest.golden @@ -1,63 +1,63 @@ { - "versionInfo": "00000001", - "resources": [ + "versionInfo": "00000001", + "resources": [ { - "@type": "type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment", - "clusterName": "failover-target~db.default.cluster-01.external.peer1.domain", - "endpoints": [ + "@type": "type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment", + "clusterName": "failover-target~0~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "endpoints": [ { - "lbEndpoints": [ + "lbEndpoints": [ { - "endpoint": { - "address": { - "socketAddress": { - "address": "10.40.1.1", - "portValue": 8080 + "endpoint": { + "address": { + "socketAddress": { + "address": "10.10.1.1", + "portValue": 8080 } } }, - "healthStatus": "HEALTHY", - "loadBalancingWeight": 1 + "healthStatus": "HEALTHY", + "loadBalancingWeight": 1 + }, + { + "endpoint": { + "address": { + "socketAddress": { + "address": "10.10.1.2", + "portValue": 8080 + } + } + }, + "healthStatus": "HEALTHY", + "loadBalancingWeight": 1 } ] } ] }, { - "@type": "type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment", - "clusterName": "failover-target~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", - "endpoints": [ + "@type": "type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment", + "clusterName": "failover-target~1~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "endpoints": [ { - "lbEndpoints": [ - { - "endpoint": { - "address": { - "socketAddress": { - "address": "10.10.1.1", - "portValue": 8080 - } - } - }, - "healthStatus": "HEALTHY", - "loadBalancingWeight": 1 - }, + "lbEndpoints": [ { - "endpoint": { - "address": { - "socketAddress": { - "address": "10.10.1.2", - "portValue": 8080 + "endpoint": { + "address": { + "socketAddress": { + "address": "10.40.1.1", + "portValue": 8080 } } }, - "healthStatus": "HEALTHY", - "loadBalancingWeight": 1 + "healthStatus": "HEALTHY", + "loadBalancingWeight": 1 } ] } ] } ], - "typeUrl": "type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment", - "nonce": "00000001" + "typeUrl": "type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment", + "nonce": "00000001" } \ No newline at end of file diff --git a/agent/xds/testdata/endpoints/ingress-with-chain-and-failover.latest.golden b/agent/xds/testdata/endpoints/ingress-with-chain-and-failover.latest.golden index 1ef4d0329b0..7aa8a3f569c 100644 --- a/agent/xds/testdata/endpoints/ingress-with-chain-and-failover.latest.golden +++ b/agent/xds/testdata/endpoints/ingress-with-chain-and-failover.latest.golden @@ -1,75 +1,75 @@ { - "versionInfo": "00000001", - "resources": [ + "versionInfo": "00000001", + "resources": [ { - "@type": "type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment", - "clusterName": "failover-target~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", - "endpoints": [ + "@type": "type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment", + "clusterName": "failover-target~0~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "endpoints": [ { - "lbEndpoints": [ + "lbEndpoints": [ { - "endpoint": { - "address": { - "socketAddress": { - "address": "10.10.1.1", - "portValue": 8080 + "endpoint": { + "address": { + "socketAddress": { + "address": "10.10.1.1", + "portValue": 8080 } } }, - "healthStatus": "HEALTHY", - "loadBalancingWeight": 1 + "healthStatus": "HEALTHY", + "loadBalancingWeight": 1 }, { - "endpoint": { - "address": { - "socketAddress": { - "address": "10.10.1.2", - "portValue": 8080 + "endpoint": { + "address": { + "socketAddress": { + "address": "10.10.1.2", + "portValue": 8080 } } }, - "healthStatus": "HEALTHY", - "loadBalancingWeight": 1 + "healthStatus": "HEALTHY", + "loadBalancingWeight": 1 } ] } ] }, { - "@type": "type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment", - "clusterName": "failover-target~fail.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", - "endpoints": [ + "@type": "type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment", + "clusterName": "failover-target~1~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "endpoints": [ { - "lbEndpoints": [ + "lbEndpoints": [ { - "endpoint": { - "address": { - "socketAddress": { - "address": "10.20.1.1", - "portValue": 8080 + "endpoint": { + "address": { + "socketAddress": { + "address": "10.20.1.1", + "portValue": 8080 } } }, - "healthStatus": "HEALTHY", - "loadBalancingWeight": 1 + "healthStatus": "HEALTHY", + "loadBalancingWeight": 1 }, { - "endpoint": { - "address": { - "socketAddress": { - "address": "10.20.1.2", - "portValue": 8080 + "endpoint": { + "address": { + "socketAddress": { + "address": "10.20.1.2", + "portValue": 8080 } } }, - "healthStatus": "HEALTHY", - "loadBalancingWeight": 1 + "healthStatus": "HEALTHY", + "loadBalancingWeight": 1 } ] } ] } ], - "typeUrl": "type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment", - "nonce": "00000001" + "typeUrl": "type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment", + "nonce": "00000001" } \ No newline at end of file diff --git a/agent/xds/testdata/endpoints/ingress-with-tcp-chain-double-failover-through-local-gateway-triggered.latest.golden b/agent/xds/testdata/endpoints/ingress-with-tcp-chain-double-failover-through-local-gateway-triggered.latest.golden index f38f82acfb9..5d356df4408 100644 --- a/agent/xds/testdata/endpoints/ingress-with-tcp-chain-double-failover-through-local-gateway-triggered.latest.golden +++ b/agent/xds/testdata/endpoints/ingress-with-tcp-chain-double-failover-through-local-gateway-triggered.latest.golden @@ -1,109 +1,109 @@ { - "versionInfo": "00000001", - "resources": [ + "versionInfo": "00000001", + "resources": [ { - "@type": "type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment", - "clusterName": "failover-target~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", - "endpoints": [ + "@type": "type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment", + "clusterName": "failover-target~0~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "endpoints": [ { - "lbEndpoints": [ + "lbEndpoints": [ { - "endpoint": { - "address": { - "socketAddress": { - "address": "10.10.1.1", - "portValue": 8080 + "endpoint": { + "address": { + "socketAddress": { + "address": "10.10.1.1", + "portValue": 8080 } } }, - "healthStatus": "UNHEALTHY", - "loadBalancingWeight": 1 + "healthStatus": "UNHEALTHY", + "loadBalancingWeight": 1 }, { - "endpoint": { - "address": { - "socketAddress": { - "address": "10.10.1.2", - "portValue": 8080 + "endpoint": { + "address": { + "socketAddress": { + "address": "10.10.1.2", + "portValue": 8080 } } }, - "healthStatus": "UNHEALTHY", - "loadBalancingWeight": 1 + "healthStatus": "UNHEALTHY", + "loadBalancingWeight": 1 } ] } ] }, { - "@type": "type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment", - "clusterName": "failover-target~db.default.dc2.internal.11111111-2222-3333-4444-555555555555.consul", - "endpoints": [ + "@type": "type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment", + "clusterName": "failover-target~1~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "endpoints": [ { - "lbEndpoints": [ + "lbEndpoints": [ { - "endpoint": { - "address": { - "socketAddress": { - "address": "10.10.1.1", - "portValue": 8443 + "endpoint": { + "address": { + "socketAddress": { + "address": "10.10.1.1", + "portValue": 8443 } } }, - "healthStatus": "UNHEALTHY", - "loadBalancingWeight": 1 + "healthStatus": "UNHEALTHY", + "loadBalancingWeight": 1 }, { - "endpoint": { - "address": { - "socketAddress": { - "address": "10.10.1.2", - "portValue": 8443 + "endpoint": { + "address": { + "socketAddress": { + "address": "10.10.1.2", + "portValue": 8443 } } }, - "healthStatus": "UNHEALTHY", - "loadBalancingWeight": 1 + "healthStatus": "UNHEALTHY", + "loadBalancingWeight": 1 } ] } ] }, { - "@type": "type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment", - "clusterName": "failover-target~db.default.dc3.internal.11111111-2222-3333-4444-555555555555.consul", - "endpoints": [ + "@type": "type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment", + "clusterName": "failover-target~2~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "endpoints": [ { - "lbEndpoints": [ + "lbEndpoints": [ { - "endpoint": { - "address": { - "socketAddress": { - "address": "10.10.1.1", - "portValue": 8443 + "endpoint": { + "address": { + "socketAddress": { + "address": "10.10.1.1", + "portValue": 8443 } } }, - "healthStatus": "HEALTHY", - "loadBalancingWeight": 1 + "healthStatus": "HEALTHY", + "loadBalancingWeight": 1 }, { - "endpoint": { - "address": { - "socketAddress": { - "address": "10.10.1.2", - "portValue": 8443 + "endpoint": { + "address": { + "socketAddress": { + "address": "10.10.1.2", + "portValue": 8443 } } }, - "healthStatus": "HEALTHY", - "loadBalancingWeight": 1 + "healthStatus": "HEALTHY", + "loadBalancingWeight": 1 } ] } ] } ], - "typeUrl": "type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment", - "nonce": "00000001" + "typeUrl": "type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment", + "nonce": "00000001" } \ No newline at end of file diff --git a/agent/xds/testdata/endpoints/ingress-with-tcp-chain-double-failover-through-local-gateway.latest.golden b/agent/xds/testdata/endpoints/ingress-with-tcp-chain-double-failover-through-local-gateway.latest.golden index b55f5458689..243c8205085 100644 --- a/agent/xds/testdata/endpoints/ingress-with-tcp-chain-double-failover-through-local-gateway.latest.golden +++ b/agent/xds/testdata/endpoints/ingress-with-tcp-chain-double-failover-through-local-gateway.latest.golden @@ -1,75 +1,75 @@ { - "versionInfo": "00000001", - "resources": [ + "versionInfo": "00000001", + "resources": [ { - "@type": "type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment", - "clusterName": "failover-target~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", - "endpoints": [ + "@type": "type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment", + "clusterName": "failover-target~0~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "endpoints": [ { - "lbEndpoints": [ + "lbEndpoints": [ { - "endpoint": { - "address": { - "socketAddress": { - "address": "10.10.1.1", - "portValue": 8080 + "endpoint": { + "address": { + "socketAddress": { + "address": "10.10.1.1", + "portValue": 8080 } } }, - "healthStatus": "HEALTHY", - "loadBalancingWeight": 1 + "healthStatus": "HEALTHY", + "loadBalancingWeight": 1 }, { - "endpoint": { - "address": { - "socketAddress": { - "address": "10.10.1.2", - "portValue": 8080 + "endpoint": { + "address": { + "socketAddress": { + "address": "10.10.1.2", + "portValue": 8080 } } }, - "healthStatus": "HEALTHY", - "loadBalancingWeight": 1 + "healthStatus": "HEALTHY", + "loadBalancingWeight": 1 } ] } ] }, { - "@type": "type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment", - "clusterName": "failover-target~db.default.dc3.internal.11111111-2222-3333-4444-555555555555.consul", - "endpoints": [ + "@type": "type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment", + "clusterName": "failover-target~2~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "endpoints": [ { - "lbEndpoints": [ + "lbEndpoints": [ { - "endpoint": { - "address": { - "socketAddress": { - "address": "10.10.1.1", - "portValue": 8443 + "endpoint": { + "address": { + "socketAddress": { + "address": "10.10.1.1", + "portValue": 8443 } } }, - "healthStatus": "HEALTHY", - "loadBalancingWeight": 1 + "healthStatus": "HEALTHY", + "loadBalancingWeight": 1 }, { - "endpoint": { - "address": { - "socketAddress": { - "address": "10.10.1.2", - "portValue": 8443 + "endpoint": { + "address": { + "socketAddress": { + "address": "10.10.1.2", + "portValue": 8443 } } }, - "healthStatus": "HEALTHY", - "loadBalancingWeight": 1 + "healthStatus": "HEALTHY", + "loadBalancingWeight": 1 } ] } ] } ], - "typeUrl": "type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment", - "nonce": "00000001" + "typeUrl": "type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment", + "nonce": "00000001" } \ No newline at end of file diff --git a/agent/xds/testdata/endpoints/ingress-with-tcp-chain-double-failover-through-remote-gateway-triggered.latest.golden b/agent/xds/testdata/endpoints/ingress-with-tcp-chain-double-failover-through-remote-gateway-triggered.latest.golden index 9d5d1c1faff..e7e9eb4196b 100644 --- a/agent/xds/testdata/endpoints/ingress-with-tcp-chain-double-failover-through-remote-gateway-triggered.latest.golden +++ b/agent/xds/testdata/endpoints/ingress-with-tcp-chain-double-failover-through-remote-gateway-triggered.latest.golden @@ -1,109 +1,109 @@ { - "versionInfo": "00000001", - "resources": [ + "versionInfo": "00000001", + "resources": [ { - "@type": "type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment", - "clusterName": "failover-target~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", - "endpoints": [ + "@type": "type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment", + "clusterName": "failover-target~0~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "endpoints": [ { - "lbEndpoints": [ + "lbEndpoints": [ { - "endpoint": { - "address": { - "socketAddress": { - "address": "10.10.1.1", - "portValue": 8080 + "endpoint": { + "address": { + "socketAddress": { + "address": "10.10.1.1", + "portValue": 8080 } } }, - "healthStatus": "UNHEALTHY", - "loadBalancingWeight": 1 + "healthStatus": "UNHEALTHY", + "loadBalancingWeight": 1 }, { - "endpoint": { - "address": { - "socketAddress": { - "address": "10.10.1.2", - "portValue": 8080 + "endpoint": { + "address": { + "socketAddress": { + "address": "10.10.1.2", + "portValue": 8080 } } }, - "healthStatus": "UNHEALTHY", - "loadBalancingWeight": 1 + "healthStatus": "UNHEALTHY", + "loadBalancingWeight": 1 } ] } ] }, { - "@type": "type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment", - "clusterName": "failover-target~db.default.dc2.internal.11111111-2222-3333-4444-555555555555.consul", - "endpoints": [ + "@type": "type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment", + "clusterName": "failover-target~1~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "endpoints": [ { - "lbEndpoints": [ + "lbEndpoints": [ { - "endpoint": { - "address": { - "socketAddress": { - "address": "198.18.1.1", - "portValue": 443 + "endpoint": { + "address": { + "socketAddress": { + "address": "198.18.1.1", + "portValue": 443 } } }, - "healthStatus": "UNHEALTHY", - "loadBalancingWeight": 1 + "healthStatus": "UNHEALTHY", + "loadBalancingWeight": 1 }, { - "endpoint": { - "address": { - "socketAddress": { - "address": "198.18.1.2", - "portValue": 443 + "endpoint": { + "address": { + "socketAddress": { + "address": "198.18.1.2", + "portValue": 443 } } }, - "healthStatus": "UNHEALTHY", - "loadBalancingWeight": 1 + "healthStatus": "UNHEALTHY", + "loadBalancingWeight": 1 } ] } ] }, { - "@type": "type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment", - "clusterName": "failover-target~db.default.dc3.internal.11111111-2222-3333-4444-555555555555.consul", - "endpoints": [ + "@type": "type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment", + "clusterName": "failover-target~2~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "endpoints": [ { - "lbEndpoints": [ + "lbEndpoints": [ { - "endpoint": { - "address": { - "socketAddress": { - "address": "198.38.1.1", - "portValue": 443 + "endpoint": { + "address": { + "socketAddress": { + "address": "198.38.1.1", + "portValue": 443 } } }, - "healthStatus": "HEALTHY", - "loadBalancingWeight": 1 + "healthStatus": "HEALTHY", + "loadBalancingWeight": 1 }, { - "endpoint": { - "address": { - "socketAddress": { - "address": "198.38.1.2", - "portValue": 443 + "endpoint": { + "address": { + "socketAddress": { + "address": "198.38.1.2", + "portValue": 443 } } }, - "healthStatus": "HEALTHY", - "loadBalancingWeight": 1 + "healthStatus": "HEALTHY", + "loadBalancingWeight": 1 } ] } ] } ], - "typeUrl": "type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment", - "nonce": "00000001" + "typeUrl": "type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment", + "nonce": "00000001" } \ No newline at end of file diff --git a/agent/xds/testdata/endpoints/ingress-with-tcp-chain-double-failover-through-remote-gateway.latest.golden b/agent/xds/testdata/endpoints/ingress-with-tcp-chain-double-failover-through-remote-gateway.latest.golden index ebbf0281e17..9a62663e8e2 100644 --- a/agent/xds/testdata/endpoints/ingress-with-tcp-chain-double-failover-through-remote-gateway.latest.golden +++ b/agent/xds/testdata/endpoints/ingress-with-tcp-chain-double-failover-through-remote-gateway.latest.golden @@ -1,75 +1,75 @@ { - "versionInfo": "00000001", - "resources": [ + "versionInfo": "00000001", + "resources": [ { - "@type": "type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment", - "clusterName": "failover-target~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", - "endpoints": [ + "@type": "type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment", + "clusterName": "failover-target~0~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "endpoints": [ { - "lbEndpoints": [ + "lbEndpoints": [ { - "endpoint": { - "address": { - "socketAddress": { - "address": "10.10.1.1", - "portValue": 8080 + "endpoint": { + "address": { + "socketAddress": { + "address": "10.10.1.1", + "portValue": 8080 } } }, - "healthStatus": "HEALTHY", - "loadBalancingWeight": 1 + "healthStatus": "HEALTHY", + "loadBalancingWeight": 1 }, { - "endpoint": { - "address": { - "socketAddress": { - "address": "10.10.1.2", - "portValue": 8080 + "endpoint": { + "address": { + "socketAddress": { + "address": "10.10.1.2", + "portValue": 8080 } } }, - "healthStatus": "HEALTHY", - "loadBalancingWeight": 1 + "healthStatus": "HEALTHY", + "loadBalancingWeight": 1 } ] } ] }, { - "@type": "type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment", - "clusterName": "failover-target~db.default.dc3.internal.11111111-2222-3333-4444-555555555555.consul", - "endpoints": [ + "@type": "type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment", + "clusterName": "failover-target~2~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "endpoints": [ { - "lbEndpoints": [ + "lbEndpoints": [ { - "endpoint": { - "address": { - "socketAddress": { - "address": "198.38.1.1", - "portValue": 443 + "endpoint": { + "address": { + "socketAddress": { + "address": "198.38.1.1", + "portValue": 443 } } }, - "healthStatus": "HEALTHY", - "loadBalancingWeight": 1 + "healthStatus": "HEALTHY", + "loadBalancingWeight": 1 }, { - "endpoint": { - "address": { - "socketAddress": { - "address": "198.38.1.2", - "portValue": 443 + "endpoint": { + "address": { + "socketAddress": { + "address": "198.38.1.2", + "portValue": 443 } } }, - "healthStatus": "HEALTHY", - "loadBalancingWeight": 1 + "healthStatus": "HEALTHY", + "loadBalancingWeight": 1 } ] } ] } ], - "typeUrl": "type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment", - "nonce": "00000001" + "typeUrl": "type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment", + "nonce": "00000001" } \ No newline at end of file diff --git a/agent/xds/testdata/endpoints/ingress-with-tcp-chain-failover-through-local-gateway-triggered.latest.golden b/agent/xds/testdata/endpoints/ingress-with-tcp-chain-failover-through-local-gateway-triggered.latest.golden index 0aad49182a5..61e7ed645f6 100644 --- a/agent/xds/testdata/endpoints/ingress-with-tcp-chain-failover-through-local-gateway-triggered.latest.golden +++ b/agent/xds/testdata/endpoints/ingress-with-tcp-chain-failover-through-local-gateway-triggered.latest.golden @@ -1,75 +1,75 @@ { - "versionInfo": "00000001", - "resources": [ + "versionInfo": "00000001", + "resources": [ { - "@type": "type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment", - "clusterName": "failover-target~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", - "endpoints": [ + "@type": "type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment", + "clusterName": "failover-target~0~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "endpoints": [ { - "lbEndpoints": [ + "lbEndpoints": [ { - "endpoint": { - "address": { - "socketAddress": { - "address": "10.10.1.1", - "portValue": 8080 + "endpoint": { + "address": { + "socketAddress": { + "address": "10.10.1.1", + "portValue": 8080 } } }, - "healthStatus": "UNHEALTHY", - "loadBalancingWeight": 1 + "healthStatus": "UNHEALTHY", + "loadBalancingWeight": 1 }, { - "endpoint": { - "address": { - "socketAddress": { - "address": "10.10.1.2", - "portValue": 8080 + "endpoint": { + "address": { + "socketAddress": { + "address": "10.10.1.2", + "portValue": 8080 } } }, - "healthStatus": "UNHEALTHY", - "loadBalancingWeight": 1 + "healthStatus": "UNHEALTHY", + "loadBalancingWeight": 1 } ] } ] }, { - "@type": "type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment", - "clusterName": "failover-target~db.default.dc2.internal.11111111-2222-3333-4444-555555555555.consul", - "endpoints": [ + "@type": "type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment", + "clusterName": "failover-target~1~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "endpoints": [ { - "lbEndpoints": [ + "lbEndpoints": [ { - "endpoint": { - "address": { - "socketAddress": { - "address": "10.10.1.1", - "portValue": 8443 + "endpoint": { + "address": { + "socketAddress": { + "address": "10.10.1.1", + "portValue": 8443 } } }, - "healthStatus": "HEALTHY", - "loadBalancingWeight": 1 + "healthStatus": "HEALTHY", + "loadBalancingWeight": 1 }, { - "endpoint": { - "address": { - "socketAddress": { - "address": "10.10.1.2", - "portValue": 8443 + "endpoint": { + "address": { + "socketAddress": { + "address": "10.10.1.2", + "portValue": 8443 } } }, - "healthStatus": "HEALTHY", - "loadBalancingWeight": 1 + "healthStatus": "HEALTHY", + "loadBalancingWeight": 1 } ] } ] } ], - "typeUrl": "type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment", - "nonce": "00000001" + "typeUrl": "type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment", + "nonce": "00000001" } \ No newline at end of file diff --git a/agent/xds/testdata/endpoints/ingress-with-tcp-chain-failover-through-local-gateway.latest.golden b/agent/xds/testdata/endpoints/ingress-with-tcp-chain-failover-through-local-gateway.latest.golden index c5ee31d458f..eedd23fc1ef 100644 --- a/agent/xds/testdata/endpoints/ingress-with-tcp-chain-failover-through-local-gateway.latest.golden +++ b/agent/xds/testdata/endpoints/ingress-with-tcp-chain-failover-through-local-gateway.latest.golden @@ -1,75 +1,75 @@ { - "versionInfo": "00000001", - "resources": [ + "versionInfo": "00000001", + "resources": [ { - "@type": "type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment", - "clusterName": "failover-target~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", - "endpoints": [ + "@type": "type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment", + "clusterName": "failover-target~0~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "endpoints": [ { - "lbEndpoints": [ + "lbEndpoints": [ { - "endpoint": { - "address": { - "socketAddress": { - "address": "10.10.1.1", - "portValue": 8080 + "endpoint": { + "address": { + "socketAddress": { + "address": "10.10.1.1", + "portValue": 8080 } } }, - "healthStatus": "HEALTHY", - "loadBalancingWeight": 1 + "healthStatus": "HEALTHY", + "loadBalancingWeight": 1 }, { - "endpoint": { - "address": { - "socketAddress": { - "address": "10.10.1.2", - "portValue": 8080 + "endpoint": { + "address": { + "socketAddress": { + "address": "10.10.1.2", + "portValue": 8080 } } }, - "healthStatus": "HEALTHY", - "loadBalancingWeight": 1 + "healthStatus": "HEALTHY", + "loadBalancingWeight": 1 } ] } ] }, { - "@type": "type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment", - "clusterName": "failover-target~db.default.dc2.internal.11111111-2222-3333-4444-555555555555.consul", - "endpoints": [ + "@type": "type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment", + "clusterName": "failover-target~1~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "endpoints": [ { - "lbEndpoints": [ + "lbEndpoints": [ { - "endpoint": { - "address": { - "socketAddress": { - "address": "10.10.1.1", - "portValue": 8443 + "endpoint": { + "address": { + "socketAddress": { + "address": "10.10.1.1", + "portValue": 8443 } } }, - "healthStatus": "HEALTHY", - "loadBalancingWeight": 1 + "healthStatus": "HEALTHY", + "loadBalancingWeight": 1 }, { - "endpoint": { - "address": { - "socketAddress": { - "address": "10.10.1.2", - "portValue": 8443 + "endpoint": { + "address": { + "socketAddress": { + "address": "10.10.1.2", + "portValue": 8443 } } }, - "healthStatus": "HEALTHY", - "loadBalancingWeight": 1 + "healthStatus": "HEALTHY", + "loadBalancingWeight": 1 } ] } ] } ], - "typeUrl": "type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment", - "nonce": "00000001" + "typeUrl": "type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment", + "nonce": "00000001" } \ No newline at end of file diff --git a/agent/xds/testdata/endpoints/ingress-with-tcp-chain-failover-through-remote-gateway-triggered.latest.golden b/agent/xds/testdata/endpoints/ingress-with-tcp-chain-failover-through-remote-gateway-triggered.latest.golden index 324a48430d9..583a49bd3e2 100644 --- a/agent/xds/testdata/endpoints/ingress-with-tcp-chain-failover-through-remote-gateway-triggered.latest.golden +++ b/agent/xds/testdata/endpoints/ingress-with-tcp-chain-failover-through-remote-gateway-triggered.latest.golden @@ -1,75 +1,75 @@ { - "versionInfo": "00000001", - "resources": [ + "versionInfo": "00000001", + "resources": [ { - "@type": "type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment", - "clusterName": "failover-target~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", - "endpoints": [ + "@type": "type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment", + "clusterName": "failover-target~0~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "endpoints": [ { - "lbEndpoints": [ + "lbEndpoints": [ { - "endpoint": { - "address": { - "socketAddress": { - "address": "10.10.1.1", - "portValue": 8080 + "endpoint": { + "address": { + "socketAddress": { + "address": "10.10.1.1", + "portValue": 8080 } } }, - "healthStatus": "UNHEALTHY", - "loadBalancingWeight": 1 + "healthStatus": "UNHEALTHY", + "loadBalancingWeight": 1 }, { - "endpoint": { - "address": { - "socketAddress": { - "address": "10.10.1.2", - "portValue": 8080 + "endpoint": { + "address": { + "socketAddress": { + "address": "10.10.1.2", + "portValue": 8080 } } }, - "healthStatus": "UNHEALTHY", - "loadBalancingWeight": 1 + "healthStatus": "UNHEALTHY", + "loadBalancingWeight": 1 } ] } ] }, { - "@type": "type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment", - "clusterName": "failover-target~db.default.dc2.internal.11111111-2222-3333-4444-555555555555.consul", - "endpoints": [ + "@type": "type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment", + "clusterName": "failover-target~1~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "endpoints": [ { - "lbEndpoints": [ + "lbEndpoints": [ { - "endpoint": { - "address": { - "socketAddress": { - "address": "198.18.1.1", - "portValue": 443 + "endpoint": { + "address": { + "socketAddress": { + "address": "198.18.1.1", + "portValue": 443 } } }, - "healthStatus": "HEALTHY", - "loadBalancingWeight": 1 + "healthStatus": "HEALTHY", + "loadBalancingWeight": 1 }, { - "endpoint": { - "address": { - "socketAddress": { - "address": "198.18.1.2", - "portValue": 443 + "endpoint": { + "address": { + "socketAddress": { + "address": "198.18.1.2", + "portValue": 443 } } }, - "healthStatus": "HEALTHY", - "loadBalancingWeight": 1 + "healthStatus": "HEALTHY", + "loadBalancingWeight": 1 } ] } ] } ], - "typeUrl": "type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment", - "nonce": "00000001" + "typeUrl": "type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment", + "nonce": "00000001" } \ No newline at end of file diff --git a/agent/xds/testdata/endpoints/ingress-with-tcp-chain-failover-through-remote-gateway.latest.golden b/agent/xds/testdata/endpoints/ingress-with-tcp-chain-failover-through-remote-gateway.latest.golden index 2021f8fab5a..879669138a4 100644 --- a/agent/xds/testdata/endpoints/ingress-with-tcp-chain-failover-through-remote-gateway.latest.golden +++ b/agent/xds/testdata/endpoints/ingress-with-tcp-chain-failover-through-remote-gateway.latest.golden @@ -1,75 +1,75 @@ { - "versionInfo": "00000001", - "resources": [ + "versionInfo": "00000001", + "resources": [ { - "@type": "type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment", - "clusterName": "failover-target~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", - "endpoints": [ + "@type": "type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment", + "clusterName": "failover-target~0~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "endpoints": [ { - "lbEndpoints": [ + "lbEndpoints": [ { - "endpoint": { - "address": { - "socketAddress": { - "address": "10.10.1.1", - "portValue": 8080 + "endpoint": { + "address": { + "socketAddress": { + "address": "10.10.1.1", + "portValue": 8080 } } }, - "healthStatus": "HEALTHY", - "loadBalancingWeight": 1 + "healthStatus": "HEALTHY", + "loadBalancingWeight": 1 }, { - "endpoint": { - "address": { - "socketAddress": { - "address": "10.10.1.2", - "portValue": 8080 + "endpoint": { + "address": { + "socketAddress": { + "address": "10.10.1.2", + "portValue": 8080 } } }, - "healthStatus": "HEALTHY", - "loadBalancingWeight": 1 + "healthStatus": "HEALTHY", + "loadBalancingWeight": 1 } ] } ] }, { - "@type": "type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment", - "clusterName": "failover-target~db.default.dc2.internal.11111111-2222-3333-4444-555555555555.consul", - "endpoints": [ + "@type": "type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment", + "clusterName": "failover-target~1~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "endpoints": [ { - "lbEndpoints": [ + "lbEndpoints": [ { - "endpoint": { - "address": { - "socketAddress": { - "address": "198.18.1.1", - "portValue": 443 + "endpoint": { + "address": { + "socketAddress": { + "address": "198.18.1.1", + "portValue": 443 } } }, - "healthStatus": "HEALTHY", - "loadBalancingWeight": 1 + "healthStatus": "HEALTHY", + "loadBalancingWeight": 1 }, { - "endpoint": { - "address": { - "socketAddress": { - "address": "198.18.1.2", - "portValue": 443 + "endpoint": { + "address": { + "socketAddress": { + "address": "198.18.1.2", + "portValue": 443 } } }, - "healthStatus": "HEALTHY", - "loadBalancingWeight": 1 + "healthStatus": "HEALTHY", + "loadBalancingWeight": 1 } ] } ] } ], - "typeUrl": "type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment", - "nonce": "00000001" + "typeUrl": "type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment", + "nonce": "00000001" } \ No newline at end of file diff --git a/test/integration/connect/envoy/case-cfg-resolver-cluster-peering-failover/primary/verify.bats b/test/integration/connect/envoy/case-cfg-resolver-cluster-peering-failover/primary/verify.bats index b673be8cfe2..45b4177fdbe 100644 --- a/test/integration/connect/envoy/case-cfg-resolver-cluster-peering-failover/primary/verify.bats +++ b/test/integration/connect/envoy/case-cfg-resolver-cluster-peering-failover/primary/verify.bats @@ -18,10 +18,6 @@ load helpers retry_default curl localhost:19000/config_dump } -@test "s1 proxy listener should be up and have right cert" { - assert_proxy_presents_cert_uri localhost:21000 s1 -} - @test "s2 proxies should be healthy in primary" { assert_service_has_healthy_instances s2 1 primary } @@ -34,6 +30,11 @@ load helpers retry_long nc -z consul-alpha-client:4432 } +@test "s1 proxy listener should be up and have right cert" { + assert_proxy_presents_cert_uri localhost:21000 s1 +} + + @test "peer the two clusters together" { retry_default create_peering primary alpha } @@ -45,8 +46,8 @@ load helpers # Failover @test "s1 upstream should have healthy endpoints for s2 in both primary and failover" { - assert_upstream_has_endpoints_in_status 127.0.0.1:19000 failover-target~s2.default.primary.internal HEALTHY 1 - assert_upstream_has_endpoints_in_status 127.0.0.1:19000 failover-target~s2.default.primary-to-alpha.external HEALTHY 1 + assert_upstream_has_endpoints_in_status 127.0.0.1:19000 failover-target~0~s2.default.primary.internal HEALTHY 1 + assert_upstream_has_endpoints_in_status 127.0.0.1:19000 failover-target~1~s2.default.primary.internal HEALTHY 1 } @test "s1 upstream should be able to connect to s2" { @@ -56,7 +57,7 @@ load helpers } @test "s1 upstream made 1 connection" { - assert_envoy_metric_at_least 127.0.0.1:19000 "cluster.failover-target~s2.default.primary.internal.*cx_total" 1 + assert_envoy_metric_at_least 127.0.0.1:19000 "cluster.failover-target~0~s2.default.primary.internal.*cx_total" 1 } @test "terminate instance of s2 primary envoy which should trigger failover to s2 alpha when the tcp check fails" { @@ -68,8 +69,8 @@ load helpers } @test "s1 upstream should have healthy endpoints for s2 in the failover cluster peer" { - assert_upstream_has_endpoints_in_status 127.0.0.1:19000 failover-target~s2.default.primary.internal UNHEALTHY 1 - assert_upstream_has_endpoints_in_status 127.0.0.1:19000 failover-target~s2.default.primary-to-alpha.external HEALTHY 1 + assert_upstream_has_endpoints_in_status 127.0.0.1:19000 failover-target~0~s2.default.primary.internal UNHEALTHY 1 + assert_upstream_has_endpoints_in_status 127.0.0.1:19000 failover-target~1~s2.default.primary.internal HEALTHY 1 } @test "reset envoy statistics for failover" { @@ -87,7 +88,7 @@ load helpers } @test "s1 upstream made 1 connection to s2 through the cluster peer" { - assert_envoy_metric_at_least 127.0.0.1:19000 "cluster.failover-target~s2.default.primary-to-alpha.external.*cx_total" 1 + assert_envoy_metric_at_least 127.0.0.1:19000 "cluster.failover-target~1~s2.default.primary.internal.*cx_total" 1 } # Redirect diff --git a/test/integration/connect/envoy/case-cfg-resolver-dc-failover-gateways-none/primary/verify.bats b/test/integration/connect/envoy/case-cfg-resolver-dc-failover-gateways-none/primary/verify.bats index a87c31261f9..9556a0658d5 100644 --- a/test/integration/connect/envoy/case-cfg-resolver-dc-failover-gateways-none/primary/verify.bats +++ b/test/integration/connect/envoy/case-cfg-resolver-dc-failover-gateways-none/primary/verify.bats @@ -40,8 +40,8 @@ load helpers # Note: when failover is configured the cluster is named for the original # service not any destination related to failover. @test "s1 upstream should have healthy endpoints for s2 in both primary and failover" { - assert_upstream_has_endpoints_in_status 127.0.0.1:19000 failover-target~s2.default.primary HEALTHY 1 - assert_upstream_has_endpoints_in_status 127.0.0.1:19000 failover-target~s2.default.secondary HEALTHY 1 + assert_upstream_has_endpoints_in_status 127.0.0.1:19000 failover-target~0~s2.default.primary HEALTHY 1 + assert_upstream_has_endpoints_in_status 127.0.0.1:19000 failover-target~1~s2.default.primary HEALTHY 1 } @test "s1 upstream should be able to connect to s2 via upstream s2 to start" { @@ -49,7 +49,7 @@ load helpers } @test "s1 upstream made 1 connection" { - assert_envoy_metric_at_least 127.0.0.1:19000 "cluster.failover-target~s2.default.primary.*cx_total" 1 + assert_envoy_metric_at_least 127.0.0.1:19000 "cluster.failover-target~0~s2.default.primary.*cx_total" 1 } ################ @@ -64,8 +64,8 @@ load helpers } @test "s1 upstream should have healthy endpoints for s2 secondary and unhealthy endpoints for s2 primary" { - assert_upstream_has_endpoints_in_status 127.0.0.1:19000 failover-target~s2.default.primary UNHEALTHY 1 - assert_upstream_has_endpoints_in_status 127.0.0.1:19000 failover-target~s2.default.secondary HEALTHY 1 + assert_upstream_has_endpoints_in_status 127.0.0.1:19000 failover-target~0~s2.default.primary UNHEALTHY 1 + assert_upstream_has_endpoints_in_status 127.0.0.1:19000 failover-target~1~s2.default.primary HEALTHY 1 } @test "reset envoy statistics" { @@ -77,5 +77,5 @@ load helpers } @test "s1 upstream made 1 connection again" { - assert_envoy_metric_at_least 127.0.0.1:19000 "cluster.failover-target~s2.default.secondary.*cx_total" 1 + assert_envoy_metric_at_least 127.0.0.1:19000 "cluster.failover-target~1~s2.default.primary.*cx_total" 1 } diff --git a/test/integration/connect/envoy/case-cfg-resolver-dc-failover-gateways-remote/primary/verify.bats b/test/integration/connect/envoy/case-cfg-resolver-dc-failover-gateways-remote/primary/verify.bats index d46c7364015..7fdc8a4a558 100644 --- a/test/integration/connect/envoy/case-cfg-resolver-dc-failover-gateways-remote/primary/verify.bats +++ b/test/integration/connect/envoy/case-cfg-resolver-dc-failover-gateways-remote/primary/verify.bats @@ -41,8 +41,8 @@ load helpers # service not any destination related to failover. @test "s1 upstream should have healthy endpoints for s2 in both primary and failover" { # in mesh gateway remote or local mode only the current leg of failover manifests in the load assignments - assert_upstream_has_endpoints_in_status 127.0.0.1:19000 failover-target~s2.default.primary HEALTHY 1 - assert_upstream_has_endpoints_in_status 127.0.0.1:19000 failover-target~s2.default.primary UNHEALTHY 0 + assert_upstream_has_endpoints_in_status 127.0.0.1:19000 failover-target~0~s2.default.primary HEALTHY 1 + assert_upstream_has_endpoints_in_status 127.0.0.1:19000 failover-target~0~s2.default.primary UNHEALTHY 0 } @test "s1 upstream should be able to connect to s2 via upstream s2 to start" { @@ -50,7 +50,7 @@ load helpers } @test "s1 upstream made 1 connection" { - assert_envoy_metric_at_least 127.0.0.1:19000 "cluster.failover-target~s2.default.primary.*cx_total" 1 + assert_envoy_metric_at_least 127.0.0.1:19000 "cluster.failover-target~0~s2.default.primary.*cx_total" 1 } ################ @@ -66,9 +66,9 @@ load helpers @test "s1 upstream should have healthy endpoints for s2 secondary" { # in mesh gateway remote or local mode only the current leg of failover manifests in the load assignments - assert_upstream_has_endpoints_in_status 127.0.0.1:19000 failover-target~s2.default.primary HEALTHY 0 - assert_upstream_has_endpoints_in_status 127.0.0.1:19000 failover-target~s2.default.secondary HEALTHY 1 - assert_upstream_has_endpoints_in_status 127.0.0.1:19000 failover-target~s2.default.secondary UNHEALTHY 0 + assert_upstream_has_endpoints_in_status 127.0.0.1:19000 failover-target~0~s2.default.primary HEALTHY 0 + assert_upstream_has_endpoints_in_status 127.0.0.1:19000 failover-target~1~s2.default.primary HEALTHY 1 + assert_upstream_has_endpoints_in_status 127.0.0.1:19000 failover-target~1~s2.default.primary UNHEALTHY 0 } @test "reset envoy statistics" { @@ -80,5 +80,5 @@ load helpers } @test "s1 upstream made 1 connection again" { - assert_envoy_metric_at_least 127.0.0.1:19000 "cluster.failover-target~s2.default.secondary.*cx_total" 1 + assert_envoy_metric_at_least 127.0.0.1:19000 "cluster.failover-target~1~s2.default.primary.*cx_total" 1 } diff --git a/test/integration/connect/envoy/case-cfg-resolver-svc-failover/verify.bats b/test/integration/connect/envoy/case-cfg-resolver-svc-failover/verify.bats index 6f684e71230..89a2c08b8fb 100644 --- a/test/integration/connect/envoy/case-cfg-resolver-svc-failover/verify.bats +++ b/test/integration/connect/envoy/case-cfg-resolver-svc-failover/verify.bats @@ -53,7 +53,7 @@ load helpers # Note: when failover is configured the cluster is named for the original # service not any destination related to failover. @test "s1 upstream should have healthy endpoints for s2 and s3 together" { - assert_upstream_has_endpoints_in_status 127.0.0.1:19000 failover-target~s2.default.primary HEALTHY 1 + assert_upstream_has_endpoints_in_status 127.0.0.1:19000 failover-target~1~s2.default.primary HEALTHY 1 } @test "s1 upstream should be able to connect to s2 via upstream s2 to start" { @@ -65,8 +65,8 @@ load helpers } @test "s1 upstream should have healthy endpoints for s3-v1 and unhealthy endpoints for s2" { - assert_upstream_has_endpoints_in_status 127.0.0.1:19000 failover-target~v1.s3.default.primary HEALTHY 1 - assert_upstream_has_endpoints_in_status 127.0.0.1:19000 failover-target~s2.default.primary UNHEALTHY 1 + assert_upstream_has_endpoints_in_status 127.0.0.1:19000 failover-target~1~s2.default.primary HEALTHY 1 + assert_upstream_has_endpoints_in_status 127.0.0.1:19000 failover-target~0~s2.default.primary UNHEALTHY 1 } @test "s1 upstream should be able to connect to s3-v1 now" { diff --git a/test/integration/connect/envoy/case-ingress-gateway-peering-failover/primary/verify.bats b/test/integration/connect/envoy/case-ingress-gateway-peering-failover/primary/verify.bats index 630a4d4ec22..d7fb87bb0ee 100644 --- a/test/integration/connect/envoy/case-ingress-gateway-peering-failover/primary/verify.bats +++ b/test/integration/connect/envoy/case-ingress-gateway-peering-failover/primary/verify.bats @@ -33,8 +33,8 @@ load helpers # Failover @test "s1 upstream should have healthy endpoints for s2 in both primary and failover" { - assert_upstream_has_endpoints_in_status 127.0.0.1:20000 failover-target~s2.default.primary.internal HEALTHY 1 - assert_upstream_has_endpoints_in_status 127.0.0.1:20000 failover-target~s2.default.primary-to-alpha.external HEALTHY 1 + assert_upstream_has_endpoints_in_status 127.0.0.1:20000 failover-target~0~s2.default.primary.internal HEALTHY 1 + assert_upstream_has_endpoints_in_status 127.0.0.1:20000 failover-target~1~s2.default.primary.internal HEALTHY 1 } @test "ingress-gateway should be able to connect to s2" { @@ -42,7 +42,7 @@ load helpers } @test "s1 upstream made 1 connection" { - assert_envoy_metric_at_least 127.0.0.1:20000 "cluster.failover-target~s2.default.primary.internal.*cx_total" 1 + assert_envoy_metric_at_least 127.0.0.1:20000 "cluster.failover-target~0~s2.default.primary.internal.*cx_total" 1 } @test "terminate instance of s2 primary envoy which should trigger failover to s2 alpha when the tcp check fails" { @@ -54,8 +54,8 @@ load helpers } @test "s1 upstream should have healthy endpoints for s2 in the failover cluster peer" { - assert_upstream_has_endpoints_in_status 127.0.0.1:20000 failover-target~s2.default.primary.internal UNHEALTHY 1 - assert_upstream_has_endpoints_in_status 127.0.0.1:20000 failover-target~s2.default.primary-to-alpha.external HEALTHY 1 + assert_upstream_has_endpoints_in_status 127.0.0.1:20000 failover-target~0~s2.default.primary.internal UNHEALTHY 1 + assert_upstream_has_endpoints_in_status 127.0.0.1:20000 failover-target~1~s2.default.primary.internal HEALTHY 1 } @test "reset envoy statistics for failover" { @@ -71,5 +71,5 @@ load helpers } @test "s1 upstream made 1 connection to s2 through the cluster peer" { - assert_envoy_metric_at_least 127.0.0.1:20000 "cluster.failover-target~s2.default.primary-to-alpha.external.*cx_total" 1 + assert_envoy_metric_at_least 127.0.0.1:20000 "cluster.failover-target~1~s2.default.primary.internal.*cx_total" 1 } From 27af33e6ed18aee3b399e40ee5f7c9042ecf154d Mon Sep 17 00:00:00 2001 From: Tu Nguyen Date: Thu, 23 Feb 2023 09:41:30 -0800 Subject: [PATCH 050/262] Add envoy extension docs (#16376) * Add envoy extension docs * Update message about envoy extensions with proxy defaults * fix tab error * Update website/content/docs/connect/proxies/envoy-extensions/usage/lua.mdx * fix operator prerender issue * Apply suggestions from code review Co-authored-by: trujillo-adam <47586768+trujillo-adam@users.noreply.github.com> * update envoyextension warning in proxy defaults so its inline * Update website/content/docs/connect/proxies/envoy-extensions/index.mdx --------- Co-authored-by: trujillo-adam <47586768+trujillo-adam@users.noreply.github.com> --- website/content/api-docs/operator/usage.mdx | 4 + .../connect/config-entries/proxy-defaults.mdx | 3 +- .../proxies/envoy-extensions/index.mdx | 32 +++ .../proxies/envoy-extensions/usage/lambda.mdx | 161 +++++++++++++++ .../proxies/envoy-extensions/usage/lua.mdx | 185 ++++++++++++++++++ website/data/docs-nav-data.json | 22 +++ 6 files changed, 406 insertions(+), 1 deletion(-) create mode 100644 website/content/docs/connect/proxies/envoy-extensions/index.mdx create mode 100644 website/content/docs/connect/proxies/envoy-extensions/usage/lambda.mdx create mode 100644 website/content/docs/connect/proxies/envoy-extensions/usage/lua.mdx diff --git a/website/content/api-docs/operator/usage.mdx b/website/content/api-docs/operator/usage.mdx index 82202b13fb8..1d7e2f023a6 100644 --- a/website/content/api-docs/operator/usage.mdx +++ b/website/content/api-docs/operator/usage.mdx @@ -49,6 +49,7 @@ $ curl \ + ```json { "Usage": { @@ -74,8 +75,10 @@ $ curl \ "ResultsFilteredByACLs": false } ``` + + ```json { "Usage": { @@ -127,6 +130,7 @@ $ curl \ "ResultsFilteredByACLs": false } ``` + diff --git a/website/content/docs/connect/config-entries/proxy-defaults.mdx b/website/content/docs/connect/config-entries/proxy-defaults.mdx index 5ac09c102f0..cb9b9991712 100644 --- a/website/content/docs/connect/config-entries/proxy-defaults.mdx +++ b/website/content/docs/connect/config-entries/proxy-defaults.mdx @@ -351,7 +351,8 @@ spec: { name: 'EnvoyExtensions', type: 'array: []', - description: `A list of extensions to modify Envoy proxy configuration.`, + description: `A list of extensions to modify Envoy proxy configuration.

    + Applying \`EnvoyExtensions\` to \`ProxyDefaults\` may produce unintended consequences. We recommend enabling \`EnvoyExtensions\` with [\`ServiceDefaults\`](/consul/docs/connect/config-entries/service-defaults#envoyextensions) in most cases.`, children: [ { name: 'Name', diff --git a/website/content/docs/connect/proxies/envoy-extensions/index.mdx b/website/content/docs/connect/proxies/envoy-extensions/index.mdx new file mode 100644 index 00000000000..b4876c78e45 --- /dev/null +++ b/website/content/docs/connect/proxies/envoy-extensions/index.mdx @@ -0,0 +1,32 @@ +--- +layout: docs +page_title: Envoy Extensions +description: >- + Learn how Envoy extensions enables you to add support for additional Envoy features without modifying the Consul codebase. +--- + +# Envoy extensions overview + +This topic provides an overview of Envoy extensions in Consul service mesh deployments. You can modify Consul-generated Envoy resources to add additional functionality without modifying the Consul codebase. + +## Introduction + +Consul supports two methods for modifying Envoy behavior. You can either modify the Envoy resources Consul generates through [escape hatches](/consul/docs/connect/proxies/envoy#escape-hatch-overrides) or configure your services to use Envoy extensions using the `EnvoyExtension` parameter. Implementing escape hatches requires rewriting the Envoy resources so that they are compatible with Consul, a task that also requires understanding how Consul names Envoy resources and enforces intentions. + +Instead of modifying Consul code, you can configure your services to use Envoy extensions through the `EnvoyExtensions` field. This field is definable in [`proxy-defaults`](/consul/docs/connect/config-entries/proxy-defaults#envoyextensions) and [`service-defaults`](/consul/docs/connect/config-entries/service-defaults#envoyextensions) configuration entries. + + +## Supported extensions + +Envoy extensions enable additional service mesh functionality in Consul by changing how the sidecar proxies behave. Extensions invoke custom code when traffic passes through an Envoy proxy. Consul supports the following extensions: + +- Lua +- Lambda + +### Lua + +The `lua` Envoy extension enables HTTP Lua filters in your Consul Envoy proxies. It allows you to run Lua scripts during Envoy requests and responses from Consul-generated Envoy resources. Refer to the [`lua`](/consul/docs/proxies/envoy-extensions/usage/lua) documentation for more information. + +### Lambda + +The `lambda` Envoy extension enables services to make requests to AWS Lambda functions through the mesh as if they are a normal part of the Consul catalog. Refer to the [`lambda`](/consul/docs/proxies/envoy-extensions/usage/lambda) documentation for more information. diff --git a/website/content/docs/connect/proxies/envoy-extensions/usage/lambda.mdx b/website/content/docs/connect/proxies/envoy-extensions/usage/lambda.mdx new file mode 100644 index 00000000000..c06bf3bd220 --- /dev/null +++ b/website/content/docs/connect/proxies/envoy-extensions/usage/lambda.mdx @@ -0,0 +1,161 @@ +--- +layout: docs +page_title: Lambda Envoy Extension +description: >- + Learn how the `lambda` Envoy extension enables Consul to join AWS Lambda functions to its service mesh. +--- + +# Invoke Lambda functions in Envoy proxy + +The Lambda Envoy extension configures outbound traffic on upstream dependencies allowing mesh services to properly invoke AWS Lambda functions. Lambda functions appear in the catalog as any other Consul service. + +You can only enable the Lambda extension through `service-defaults`. This is because the Consul uses the `service-defaults` configuration entry name as the catalog name for the Lambda functions. + +## Specification + +The Lambda Envoy extension has the following arguments: + +| Arguments | Description | +| -------------------- | ------------------------------------------------------------------------------------------------ | +| `ARN` | Specifies the [AWS ARN](https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html) for the service's Lambda. | +| `InvocationMode` | Determines if Consul configures the Lambda to be invoked using the synchronous or asynchronous [invocation mode](https://docs.aws.amazon.com/lambda/latest/operatorguide/invocation-modes.html). | +| `PayloadPassthrough` | Determines if the body Envoy receives is converted to JSON or directly passed to Lambda. | + +Be aware that unlike [manual lambda registration](/consul/docs/lambda/registration/manual#supported-meta-fields), region is inferred from the ARN when specified through an Envoy extension. + +## Workflow + +There are two steps to configure the Lambda Envoy extension: + +1. Configure EnvoyExtensions through `service-defaults`. +1. Apply the configuration entry. + +### Configure `EnvoyExtensions` + +To use the Lambda Envoy extension, you must configure and apply a `service-defaults` configuration entry. Consul uses the name of the entry as the Consul service name for the Lambdas in the catalog. Downstream services also use the name to invoke the Lambda. + +The following example configures the Lambda Envoy extension to create a service named `lambda` in the mesh that can invoke the associated Lambda function. + + + + + +```hcl +Kind = "service-defaults" +Name = "lambdaInvokingApp" +Protocol = "http" +EnvoyExtensions { + Name = "builtin/aws/lambda" + Arguments = { + ARN = "arn:aws:lambda:us-west-2:111111111111:function:lambda-1234" + } +} +``` + + + + + + +```hcl +{ + "kind": "service-defaults", + "name": "lambdaInvokingApp", + "protocol": "http", + "envoy_extensions": [{ + "name": "builtin/aws/lambda", + "arguments": { + "arn": "arn:aws:lambda:us-west-2:111111111111:function:lambda-1234" + } + }] +} + +``` + + + + + + + +```yaml +apiVersion: consul.hashicorp.com/v1alpha1 +kind: ServiceDefaults +metadata: + name: lambda +spec: + protocol: http + envoyExtensions: + name = "builtin/aws/lambda" + arguments: + arn: arn:aws:lambda:us-west-2:111111111111:function:lambda-1234 +``` + + + + + + +For a full list of parameters for `EnvoyExtensions`, refer to the [`service-defaults`](/consul/docs/connect/config-entries/service-defaults#envoyextensions) and [`proxy-defaults`](/consul/docs/connect/config-entries/proxy-defaults#envoyextensions) configuration entries reference documentation. + +~> **Note:** You can only enable the Lambda extension through `service-defaults`. + +Refer to [Configuration specification](#configuration-specification) section to find a full list of arguments for the Lambda Envoy extension. + +### Apply the configuration entry + +Apply the `service-defaults` configuration entry. + + + + +```shell-session +$ consul config write lambda-envoy-extension.hcl +``` + + + + +```shell-session +$ consul config write lambda-envoy-extension.json +``` + + + + +```shell-session +$ kubectl apply lambda-envoy-extension.yaml +``` + + + + +## Examples + +In the following example, the Lambda Envoy extension adds a single Lambda function running in two regions into the mesh. Then, you can use the `lambda` service name to invoke it, as if it was any other service in the mesh. + + + +```hcl +Kind = "service-defaults" +Name = "lambda" +Protocol = "http" +EnvoyExtensions { + Name = "builtin/aws/lambda" + + Arguments = { + payloadPassthrough: false + arn: arn:aws:lambda:us-west-2:111111111111:function:lambda-1234 + } +} +EnvoyExtensions { + Name = "builtin/aws/lambda" + + Arguments = { + payloadPassthrough: false + arn: arn:aws:lambda:us-east-1:111111111111:function:lambda-1234 + } +} +``` + + \ No newline at end of file diff --git a/website/content/docs/connect/proxies/envoy-extensions/usage/lua.mdx b/website/content/docs/connect/proxies/envoy-extensions/usage/lua.mdx new file mode 100644 index 00000000000..a68e7a82251 --- /dev/null +++ b/website/content/docs/connect/proxies/envoy-extensions/usage/lua.mdx @@ -0,0 +1,185 @@ +--- +layout: docs +page_title: Lua Envoy Extension +description: >- + Learn how the `lua` Envoy extension enables Consul to run Lua scripts during Envoy requests and responses from Consul-generated Envoy resources. +--- + +# Run Lua scripts in Envoy proxy + +The Lua Envoy extension enables the [HTTP Lua filter](https://www.envoyproxy.io/docs/envoy/latest/configuration/http/http_filters/lua_filter) in your Consul Envoy proxies, letting you run Lua scripts when requests and responses pass through Consul-generated Envoy resources. + +Envoy filters support setting and getting dynamic metadata, allowing a filter to share state information with subsequent filters. To set dynamic metadata, configure the HTTP Lua filter. Users can call `streamInfo:dynamicMetadata()` from Lua scripts to get the request's dynamic metadata. + +## Configuration specifications + +To use the Lua Envoy extension, configure the following arguments in the `EnvoyExtensions` block: + +| Arguments | Description | +| -------------- | ------------------------------------------------------------------------------------------------ | +| `ProxyType` | Determines the proxy type the extension applies to. The only supported value is `connect-proxy`. | +| `ListenerType` | Specifies if the extension is applied to the `inbound` or `outbound` listener. | +| `Script` | The Lua script that is configured to run by the HTTP Lua filter. | + +## Workflow + +There are two steps to configure the Lua Envoy extension: + +1. Configure EnvoyExtensions through `service-defaults` or `proxy-defaults`. +1. Apply the configuration entry. + +### Configure `EnvoyExtensions` + +To use Envoy extensions, you must configure and apply a `proxy-defaults` or `service-defaults` configuration entry with the Envoy extension. + +- When you configure Envoy extensions on `proxy-defaults`, they apply to every service. +- When you configure Envoy extensions on `service-defaults`, they apply to a specific service. + +Consul applies Envoy extensions configured in `proxy-defaults` before it applies extensions in `service-defaults`. As a result, the Envoy extension configuration in `service-defaults` may override configurations in `proxy-defaults`. + +The following example configures the Lua Envoy extension on every service by using the `proxy-defaults`. + + + + + +```hcl +Kind = "proxy-defaults" +Name = "global" +Protocol = "http" +EnvoyExtensions { + Name = "builtin/lua" + + Arguments = { + ProxyType = "connect-proxy" + Listener = "inbound" + Script = <<-EOS +function envoy_on_request(request_handle) + meta = request_handle:streamInfo():dynamicMetadata() + m = meta:get("consul") + request_handle:headers():add("x-consul-service", m["service"]) + request_handle:headers():add("x-consul-namespace", m["namespace"]) + request_handle:headers():add("x-consul-datacenter", m["datacenter"]) + request_handle:headers():add("x-consul-trust-domain", m["trust-domain"]) +end +EOS + } +} +``` + + + + + + +```hcl +{ + "kind": "proxy-defaults", + "name": "global", + "protocol": "http", + "envoy_extensions": [{ + "name": "builtin/lua", + "arguments": { + "proxy_type": "connect-proxy", + "listener": "inbound", + "script": "function envoy_on_request(request_handle)\nmeta = request_handle:streamInfo():dynamicMetadata()\nm = \nmeta:get("consul")\nrequest_handle:headers():add("x-consul-service", m["service"])\nrequest_handle:headers():add("x-consul-namespace", m["namespace"])\nrequest_handle:headers():add("x-consul-datacenter", m["datacenter"])\nrequest_handle:headers():add("x-consul-trust-domain", m["trust-domain"])\nend" + } + }] +} +``` + + + + + + +```yaml +apiVersion: consul.hashicorp.com/v1alpha1 +kind: ProxyDefaults +metadata: + name: global +spec: + protocol: http + envoyExtensions: + name = "builtin/lua" + arguments: + proxyType: "connect-proxy" + listener: "inbound" + script: |- +function envoy_on_request(request_handle) + meta = request_handle:streamInfo():dynamicMetadata() + m = meta:get("consul") + request_handle:headers():add("x-consul-service", m["service"]) + request_handle:headers():add("x-consul-namespace", m["namespace"]) + request_handle:headers():add("x-consul-datacenter", m["datacenter"]) + request_handle:headers():add("x-consul-trust-domain", m["trust-domain"]) +end +``` + + + + + +For a full list of parameters for `EnvoyExtensions`, refer to the [`service-defaults`](/consul/docs/connect/config-entries/service-defaults#envoyextensions) and [`proxy-defaults`](/consul/docs/connect/config-entries/proxy-defaults#envoyextensions) configuration entries reference documentation. + +!> **Warning:** Applying `EnvoyExtensions` to `ProxyDefaults` may produce unintended consequences. We recommend enabling `EnvoyExtensions` with `ServiceDefaults` in most cases. + +Refer to [Configuration specification](#configuration-specification) section to find a full list of arguments for the Lua Envoy extension. + +### Apply the configuration entry + +Apply the `proxy-defaults` or `service-defaults` configuration entry. + + + + +```shell-session +$ consul config write lua-envoy-extension-proxy-defaults.hcl +``` + + + + +```shell-session +$ consul config write lua-envoy-extension-proxy-defaults.json + +``` + + + + +```shell-session +$ kubectl apply lua-envoy-extension-proxy-defaults.yaml +``` + + + + +## Examples + +In the following example, the `service-defaults` configure the Lua Envoy extension to insert the HTTP Lua filter for service `myservice` and add the Consul service name to the`x-consul-service` header for all inbound requests. The `ListenerType` makes it so that the extension applies only on the inbound listener of the service's connect proxy. + + + +```hcl +Kind = "service-defaults" +Name = "myservice" +EnvoyExtensions { + Name = "builtin/lua" + + Arguments = { + ProxyType = "connect-proxy" + Listener = "inbound" + Script = < + +Alternatively, you can apply the same extension configuration to [`proxy-defaults`](/consul/docs/connect/config-entries/proxy-defaults#envoyextensions) configuration entries. diff --git a/website/data/docs-nav-data.json b/website/data/docs-nav-data.json index a15b5169ac2..3f86b2e8b69 100644 --- a/website/data/docs-nav-data.json +++ b/website/data/docs-nav-data.json @@ -394,6 +394,28 @@ "title": "Envoy", "path": "connect/proxies/envoy" }, + { + "title": "Envoy Extensions", + "routes": [ + { + "title": "Overview", + "path": "connect/proxies/envoy-extensions" + }, + { + "title": "Usage", + "routes": [ + { + "title": "Run Lua scripts in Envoy proxies", + "path": "connect/proxies/envoy-extensions/usage/lua" + }, + { + "title": "Invoke Lambda functions in Envoy proxies", + "path": "connect/proxies/envoy-extensions/usage/lambda" + } + ] + } + ] + }, { "title": "Built-in Proxy", "path": "connect/proxies/built-in" From 3de9f7fc177d0bf8c58443e777a100f8d2534356 Mon Sep 17 00:00:00 2001 From: cskh Date: Thu, 23 Feb 2023 12:53:56 -0500 Subject: [PATCH 051/262] upgrade test: peering with resolver and failover (#16391) --- .../resolver_default_subset_test.go | 5 +- .../test/upgrade/peering_http_test.go | 110 +++++++++++++++++- 2 files changed, 106 insertions(+), 9 deletions(-) diff --git a/test/integration/consul-container/test/upgrade/l7_traffic_management/resolver_default_subset_test.go b/test/integration/consul-container/test/upgrade/l7_traffic_management/resolver_default_subset_test.go index 8c84067b2c4..bcf4093f651 100644 --- a/test/integration/consul-container/test/upgrade/l7_traffic_management/resolver_default_subset_test.go +++ b/test/integration/consul-container/test/upgrade/l7_traffic_management/resolver_default_subset_test.go @@ -11,7 +11,6 @@ import ( libcluster "github.com/hashicorp/consul/test/integration/consul-container/libs/cluster" libservice "github.com/hashicorp/consul/test/integration/consul-container/libs/service" "github.com/hashicorp/consul/test/integration/consul-container/libs/topology" - "github.com/hashicorp/consul/test/integration/consul-container/libs/utils" libutils "github.com/hashicorp/consul/test/integration/consul-container/libs/utils" "github.com/hashicorp/go-version" "github.com/stretchr/testify/require" @@ -38,11 +37,11 @@ func TestTrafficManagement_ServiceResolverDefaultSubset(t *testing.T) { tcs := []testcase{ { oldversion: "1.13", - targetVersion: utils.TargetVersion, + targetVersion: libutils.TargetVersion, }, { oldversion: "1.14", - targetVersion: utils.TargetVersion, + targetVersion: libutils.TargetVersion, }, } diff --git a/test/integration/consul-container/test/upgrade/peering_http_test.go b/test/integration/consul-container/test/upgrade/peering_http_test.go index e799cf59a8a..f1d52777a7d 100644 --- a/test/integration/consul-container/test/upgrade/peering_http_test.go +++ b/test/integration/consul-container/test/upgrade/peering_http_test.go @@ -129,7 +129,9 @@ func TestPeering_UpgradeToTarget_fromLatest(t *testing.T) { return nil, nil, nil, err } - clientConnectProxy, err := createAndRegisterStaticClientSidecarWithSplittingUpstreams(dialing) + clientConnectProxy, err := createAndRegisterStaticClientSidecarWith2Upstreams(dialing, + []string{"split-static-server", "peer-static-server"}, + ) if err != nil { return nil, nil, nil, fmt.Errorf("error creating client connect proxy in cluster %s", dialing.NetworkName) } @@ -218,6 +220,100 @@ func TestPeering_UpgradeToTarget_fromLatest(t *testing.T) { }, extraAssertion: func(clientUpstreamPort int) {}, }, + { + oldversion: "1.14", + targetVersion: utils.TargetVersion, + name: "http resolver and failover", + // Verify resolver and failover can direct traffic to server in peered cluster + // In addtional to the basic topology, this case provisions the following + // services in the dialing cluster: + // + // - a new static-client at server_0 that has two upstreams: static-server (5000) + // and peer-static-server (5001) + // - a local static-server service at client_0 + // - service-resolved named static-server with failover to static-server in accepting cluster + // - service-resolved named peer-static-server to static-server in accepting cluster + create: func(accepting *cluster.Cluster, dialing *cluster.Cluster) (libservice.Service, libservice.Service, func(), error) { + err := dialing.ConfigEntryWrite(&api.ProxyConfigEntry{ + Kind: api.ProxyDefaults, + Name: "global", + Config: map[string]interface{}{ + "protocol": "http", + }, + }) + if err != nil { + return nil, nil, nil, err + } + + clientConnectProxy, err := createAndRegisterStaticClientSidecarWith2Upstreams(dialing, + []string{"static-server", "peer-static-server"}, + ) + if err != nil { + return nil, nil, nil, fmt.Errorf("error creating client connect proxy in cluster %s", dialing.NetworkName) + } + + // make a resolver for service peer-static-server + resolverConfigEntry := &api.ServiceResolverConfigEntry{ + Kind: api.ServiceResolver, + Name: "peer-static-server", + Redirect: &api.ServiceResolverRedirect{ + Service: libservice.StaticServerServiceName, + Peer: libtopology.DialingPeerName, + }, + } + err = dialing.ConfigEntryWrite(resolverConfigEntry) + if err != nil { + return nil, nil, nil, fmt.Errorf("error writing resolver config entry for %s", resolverConfigEntry.Name) + } + + // make a resolver for service static-server + resolverConfigEntry = &api.ServiceResolverConfigEntry{ + Kind: api.ServiceResolver, + Name: "static-server", + Failover: map[string]api.ServiceResolverFailover{ + "*": { + Targets: []api.ServiceResolverFailoverTarget{ + { + Peer: libtopology.DialingPeerName, + }, + }, + }, + }, + } + err = dialing.ConfigEntryWrite(resolverConfigEntry) + if err != nil { + return nil, nil, nil, fmt.Errorf("error writing resolver config entry for %s", resolverConfigEntry.Name) + } + + // Make a static-server in dialing cluster + serviceOpts := &libservice.ServiceOpts{ + Name: libservice.StaticServerServiceName, + ID: "static-server-dialing", + HTTPPort: 8081, + GRPCPort: 8078, + } + _, serverConnectProxy, err := libservice.CreateAndRegisterStaticServerAndSidecar(dialing.Clients()[0], serviceOpts) + libassert.CatalogServiceExists(t, dialing.Clients()[0].GetClient(), libservice.StaticServerServiceName) + if err != nil { + return nil, nil, nil, err + } + + _, appPorts := clientConnectProxy.GetAddrs() + assertionFn := func() { + // assert traffic can fail-over to static-server in peered cluster and restor to local static-server + libassert.AssertFortioName(t, fmt.Sprintf("http://localhost:%d", appPorts[0]), "static-server-dialing") + require.NoError(t, serverConnectProxy.Stop()) + libassert.AssertFortioName(t, fmt.Sprintf("http://localhost:%d", appPorts[0]), "static-server") + require.NoError(t, serverConnectProxy.Start()) + libassert.AssertFortioName(t, fmt.Sprintf("http://localhost:%d", appPorts[0]), "static-server-dialing") + + // assert peer-static-server resolves to static-server in peered cluster + libassert.AssertFortioName(t, fmt.Sprintf("http://localhost:%d", appPorts[1]), "static-server") + } + return serverConnectProxy, clientConnectProxy, assertionFn, nil + }, + extraAssertion: func(clientUpstreamPort int) {}, + }, } run := func(t *testing.T, tc testcase) { @@ -239,6 +335,7 @@ func TestPeering_UpgradeToTarget_fromLatest(t *testing.T) { _, appPort := dialing.Container.GetAddr() _, secondClientProxy, assertionAdditionalResources, err := tc.create(acceptingCluster, dialingCluster) require.NoError(t, err) + assertionAdditionalResources() tc.extraAssertion(appPort) // Upgrade the accepting cluster and assert peering is still ACTIVE @@ -294,9 +391,10 @@ func TestPeering_UpgradeToTarget_fromLatest(t *testing.T) { } } -// createAndRegisterStaticClientSidecarWithSplittingUpstreams creates a static-client-1 that -// has two upstreams: split-static-server (5000) and peer-static-server (5001) -func createAndRegisterStaticClientSidecarWithSplittingUpstreams(c *cluster.Cluster) (*libservice.ConnectContainer, error) { +// createAndRegisterStaticClientSidecarWith2Upstreams creates a static-client that +// has two upstreams connecting to destinationNames: local bind addresses are 5000 +// and 5001. +func createAndRegisterStaticClientSidecarWith2Upstreams(c *cluster.Cluster, destinationNames []string) (*libservice.ConnectContainer, error) { // Do some trickery to ensure that partial completion is correctly torn // down, but successful execution is not. var deferClean utils.ResettableDefer @@ -315,7 +413,7 @@ func createAndRegisterStaticClientSidecarWithSplittingUpstreams(c *cluster.Clust Proxy: &api.AgentServiceConnectProxyConfig{ Upstreams: []api.Upstream{ { - DestinationName: "split-static-server", + DestinationName: destinationNames[0], LocalBindAddress: "0.0.0.0", LocalBindPort: cluster.ServiceUpstreamLocalBindPort, MeshGateway: api.MeshGatewayConfig{ @@ -323,7 +421,7 @@ func createAndRegisterStaticClientSidecarWithSplittingUpstreams(c *cluster.Clust }, }, { - DestinationName: "peer-static-server", + DestinationName: destinationNames[1], LocalBindAddress: "0.0.0.0", LocalBindPort: cluster.ServiceUpstreamLocalBindPort2, MeshGateway: api.MeshGatewayConfig{ From d1294cf14e1a7c100a77bac80653af91d2637e62 Mon Sep 17 00:00:00 2001 From: Jeff Boruszak <104028618+boruszak@users.noreply.github.com> Date: Thu, 23 Feb 2023 11:57:12 -0600 Subject: [PATCH 052/262] Troubleshoot service to service comms (#16385) * Troubleshoot service to service comms * adjustments * breaking fix * api-docs breaking fix * Links added to CLI pages * Update website/content/docs/troubleshoot/troubleshoot-services.mdx Co-authored-by: Eric Haberkorn * Update website/content/docs/troubleshoot/troubleshoot-services.mdx Co-authored-by: Tu Nguyen * Update website/content/docs/troubleshoot/troubleshoot-services.mdx Co-authored-by: Tu Nguyen * nav re-ordering * Edits recommended in code review --------- Co-authored-by: Eric Haberkorn Co-authored-by: Tu Nguyen --- .../content/commands/troubleshoot/index.mdx | 2 +- .../content/commands/troubleshoot/proxy.mdx | 2 +- .../commands/troubleshoot/upstreams.mdx | 2 +- .../troubleshoot/troubleshoot-services.mdx | 150 ++++++++++++++++++ website/data/docs-nav-data.json | 4 + 5 files changed, 157 insertions(+), 3 deletions(-) create mode 100644 website/content/docs/troubleshoot/troubleshoot-services.mdx diff --git a/website/content/commands/troubleshoot/index.mdx b/website/content/commands/troubleshoot/index.mdx index 521981a77e0..0c992aab15c 100644 --- a/website/content/commands/troubleshoot/index.mdx +++ b/website/content/commands/troubleshoot/index.mdx @@ -9,7 +9,7 @@ description: >- Command: `consul troubleshoot` -Use the `troubleshoot` command to diagnose Consul service mesh configuration or network issues. +Use the `troubleshoot` command to diagnose Consul service mesh configuration or network issues. For additional information about using the `troubleshoot` command, including explanations, requirements, usage instructions, refer to the [service-to-service troubleshooting overview](/consul/docs/troubleshoot/troubleshoot-services). ## Usage diff --git a/website/content/commands/troubleshoot/proxy.mdx b/website/content/commands/troubleshoot/proxy.mdx index 7a11983ae74..fcd9552247d 100644 --- a/website/content/commands/troubleshoot/proxy.mdx +++ b/website/content/commands/troubleshoot/proxy.mdx @@ -9,7 +9,7 @@ description: >- Command: `consul troubleshoot proxy` -The `troubleshoot proxy` command diagnoses Consul service mesh configuration and network issues to an upstream. +The `troubleshoot proxy` command diagnoses Consul service mesh configuration and network issues to an upstream. For additional information about using the `troubleshoot proxy` command, including explanations, requirements, usage instructions, refer to the [service-to-service troubleshooting overview](/consul/docs/troubleshoot/troubleshoot-services). ## Usage diff --git a/website/content/commands/troubleshoot/upstreams.mdx b/website/content/commands/troubleshoot/upstreams.mdx index 5cbeb232ff7..f04a8beedc0 100644 --- a/website/content/commands/troubleshoot/upstreams.mdx +++ b/website/content/commands/troubleshoot/upstreams.mdx @@ -9,7 +9,7 @@ description: >- Command: `consul troubleshoot upstreams` -The `troubleshoot upstreams` lists the available upstreams in the Consul service mesh from the current service. +The `troubleshoot upstreams` lists the available upstreams in the Consul service mesh from the current service. For additional information about using the `troubleshoot upstreams` command, including explanations, requirements, usage instructions, refer to the [service-to-service troubleshooting overview](/consul/docs/troubleshoot/troubleshoot-services). ## Usage diff --git a/website/content/docs/troubleshoot/troubleshoot-services.mdx b/website/content/docs/troubleshoot/troubleshoot-services.mdx new file mode 100644 index 00000000000..3451d2e5067 --- /dev/null +++ b/website/content/docs/troubleshoot/troubleshoot-services.mdx @@ -0,0 +1,150 @@ +--- +layout: docs +page_title: Service-to-service troubleshooting overview +description: >- + Consul includes a built-in tool for troubleshooting communication between services in a service mesh. Learn how to use the `consul troubleshoot` command to validate communication between upstream and downstream Envoy proxies on VM and Kubernetes deployments. +--- + +# Service-to-service troubleshooting overview + +This topic provides an overview of Consul’s built-in service-to-service troubleshooting capabilities. When communication between an upstream service and a downstream service in a service mesh fails, you can run the `consul troubleshoot` command to initiate a series of automated validation tests. + +For more information, refer to the [`consul troubleshoot` CLI documentation](/consul/commands/troubleshoot) or the [`consul-k8s troubleshoot` CLI reference](/consul/docs/k8s/k8s-cli#troubleshoot). + +## Introduction + +When communication between upstream and downstream services in a service mesh fails, you can diagnose the cause manually with one or more of Consul’s built-in features, including [health check queries](/consul/docs/discovery/checks), [the UI topology view](/consul/docs/connect/observability/ui-visualization), and [agent telemetry metrics](/consul/docs/agent/telemetry#metrics-reference). + +The `consul troubleshoot` command performs several checks in sequence that enable you to discover issues that impede service-to-service communication. The process systematically queries the [Envoy administration interface API](https://www.envoyproxy.io/docs/envoy/latest/operations/admin) and the Consul API to determine the cause of the communication failure. + +The troubleshooting command validates service-to-service communication by checking for the following common issues: + +- Upstream service does not exist +- One or both hosts are unhealthy +- A filter affects the upstream service +- The CA has expired mTLS certificates +- The services have expired mTLS certificates + +Consul outputs the results of these validation checks to the terminal along with suggested actions to resolve the service communication failure. When it detects rejected configurations or connection failures, Consul also outputs Envoy metrics for services. + +### Envoy proxies in a service mesh + +Consul validates communication in a service mesh by checking the Envoy proxies that are deployed as sidecars for the upstream and downstream services. As a result, troubleshooting requires that [Consul’s service mesh features are enabled](/consul/docs/connect/configuration). + +For more information about using Envoy proxies with Consul, refer to [Envoy proxy configuration for service mesh](/consul/docs/connect/proxies/envoy). + +## Requirements + +- Consul v1.15 or later. +- For Kubernetes, the `consul-k8s` CLI must be installed. + +### Technical constraints + +When troubleshooting service-to-service communication issues, be aware of the following constraints: + +- The troubleshooting tool does not check service intentions. For more information about intentions, including precedence and match order, refer to [service mesh intentions](/consul/docs/connect/intentions). +- The troubleshooting tool validates one direct connection between a downstream service and an upstream service. You must run the `consul troubleshoot` command with the Envoy ID for an individual upstream service. It does support validating multiple connections simultaneously. +- The troubleshooting tool only validates Envoy configurations for sidecar proxies. As a result, the troubleshooting tool does not validate Envoy configurations on upstream proxies such as mesh gateways and terminating gateways. + +## Usage + +Using the service-to-service troubleshooting tool is a two-step process: + +1. Find the identifier for the upstream service. +1. Use the upstream’s identifier to validate communication. + +In deployments without transparent proxies, the identifier is the _Envoy ID for the upstream service’s sidecar proxy_. If you use transparent proxies, the identifier is the _upstream service’s IP address_. For more information about using transparent proxies, refer to [Enable transparent proxy mode](/consul/docs/connect/transparent-proxy). + +### Troubleshoot on VMs + +To troubleshoot service-to-service communication issues in deployments that use VMs or bare-metal servers: + +1. Run the `consul troubleshoot upstreams` command to retrieve the upstream information for the service that is experiencing communication failures. Depending on your network’s configuration, the upstream information is either an Envoy ID or an IP address. + + ```shell-session + $ consul troubleshoot upstreams + ==> Upstreams (explicit upstreams only) (0) + ==> Upstreams IPs (transparent proxy only) (1) + [10.4.6.160 240.0.0.3] true map[backend.default.dc1.internal.e08fa6d6-e91e-dfe0-f6e1-ba097a828e31.consul backend2.default.dc1.internal.e08fa6d6-e91e-dfe0-f6e1-ba097a828e31.consul] + If you cannot find the upstream address or cluster for a transparent proxy upstream: + - Check intentions: Tproxy upstreams are configured based on intentions. Make sure you have configured intentions to allow traffic to your upstream. + - To check that the right cluster is being dialed, run a DNS lookup for the upstream you are dialing. For example, run `dig backend.svc.consul` to return the IP address for the `backend` service. If the address you get from that is missing from the upstream IPs, it means that your proxy may be misconfigured. + ``` + +1. Run the `consul troubleshoot proxy` command and specify the Envoy ID or IP address with the `-upstream-ip` flag to identify the proxy you want to perform the troubleshooting process on. The following example uses the upstream IP to validate communication with the upstream service `backend`: + + ```shell-session + $ consul troubleshoot proxy -upstream-ip 10.4.6.160 + ==> Validation + ✓ Certificates are valid + ✓ Envoy has 0 rejected configurations + ✓ Envoy has detected 0 connection failure(s) + ✓ Listener for upstream "backend" found + ✓ Route for upstream "backend" found + ✓ Cluster "backend.default.dc1.internal.e08fa6d6-e91e-dfe0-f6e1-ba097a828e31.consul" for upstream "backend" found + ✓ Healthy endpoints for cluster "backend.default.dc1.internal.e08fa6d6-e91e-dfe0-f6e1-ba097a828e31.consul" for upstream "backend" found + ✓ Cluster "backend2.default.dc1.internal.e08fa6d6-e91e-dfe0-f6e1-ba097a828e31.consul" for upstream "backend" found + ! No healthy endpoints for cluster "backend2.default.dc1.internal.e08fa6d6-e91e-dfe0-f6e1-ba097a828e31.consul" for upstream "backend" found + -> Check that your upstream service is healthy and running + -> Check that your upstream service is registered with Consul + -> Check that the upstream proxy is healthy and running + -> If you are explicitly configuring upstreams, ensure the name of the upstream is correct + ``` + +In the example output, troubleshooting upstream communication reveals that the `backend` service has two service instances running in datacenter `dc1`. One of the services is healthy, but Consul cannot detect healthy endpoints for the second service instance. This information appears in the following lines of the example: + +```text hideClipboard + ✓ Cluster "backend.default.dc1.internal.e08fa6d6-e91e-dfe0-f6e1-ba097a828e31.consul" for upstream "backend" found + ✓ Healthy endpoints for cluster "backend.default.dc1.internal.e08fa6d6-e91e-dfe0-f6e1-ba097a828e31.consul" for upstream "backend" found + ✓ Cluster "backend2.default.dc1.internal.e08fa6d6-e91e-dfe0-f6e1-ba097a828e31.consul" for upstream "backend" found + ! No healthy endpoints for cluster "backend2.default.dc1.internal.e08fa6d6-e91e-dfe0-f6e1-ba097a828e31.consul" for upstream "backend" found +``` + +The output from the troubleshooting process identifies service instances according to their [Consul DNS address](/consul/docs/discovery/dns#standard-lookup). Use the DNS information for failing services to diagnose the specific issues affecting the service instance. + +For more information, refer to the [`consul troubleshoot` CLI documentation](/consul/commands/troubleshoot). + +### Troubleshoot on Kubernetes + +To troubleshoot service-to-service communication issues in deployments that use Kubernetes, retrieve the upstream information for the pod that is experiencing communication failures and use the upstream information to identify the proxy you want to perform the troubleshooting process on. + +1. Run the `consul-k8s troubleshoot upstreams` command and specify the pod ID with the `-pod` flag to retrieve upstream information. Depending on your network’s configuration, the upstream information is either an Envoy ID or an IP address. The following example displays all transparent proxy upstreams in Consul service mesh from the given pod. + + ```shell-session + $ consul-k8s troubleshoot upstreams -pod frontend-767ccfc8f9-6f6gx + ==> Upstreams (explicit upstreams only) (0) + ==> Upstreams IPs (transparent proxy only) (1) + [10.4.6.160 240.0.0.3] true map[backend.default.dc1.internal.e08fa6d6-e91e-dfe0-f6e1-ba097a828e31.consul backend2.default.dc1.internal.e08fa6d6-e91e-dfe0-f6e1-ba097a828e31.consul] + If you cannot find the upstream address or cluster for a transparent proxy upstream: + - Check intentions: Tproxy upstreams are configured based on intentions. Make sure you have configured intentions to allow traffic to your upstream. + - To check that the right cluster is being dialed, run a DNS lookup for the upstream you are dialing. For example, run `dig backend.svc.consul` to return the IP address for the `backend` service. If the address you get from that is missing from the upstream IPs, it means that your proxy may be misconfigured. + ``` + +1. Run the `consul-k8s troubleshoot proxy` command and specify the pod ID and upstream IP address to identify the proxy you want to troubleshoot. The following example uses the upstream IP to validate communication with the upstream service `backend`: + + ```shell-session + $ consul-k8s troubleshoot proxy -pod frontend-767ccfc8f9-6f6gx -upstream-ip 10.4.6.160 + ==> Validation + ✓ certificates are valid + ✓ Envoy has 0 rejected configurations + ✓ Envoy has detected 0 connection failure(s) + ✓ listener for upstream "backend" found + ✓ route for upstream "backend" found + ✓ cluster "backend.default.dc1.internal..consul" for upstream "backend" found + ✓ healthy endpoints for cluster "backend.default.dc1.internal.e08fa6d6-e91e-dfe0-f6e1-ba097a828e31.consul" for upstream "backend" found + ✓ cluster "backend2.default.dc1.internal..consul" for upstream "backend" found + ! no healthy endpoints for cluster "backend2.default.dc1.internal.e08fa6d6-e91e-dfe0-f6e1-ba097a828e31.consul" for upstream "backend" found + ``` + +In the example output, troubleshooting upstream communication reveals that the `backend` service has two clusters in datacenter `dc1`. One of the clusters returns healthy endpoints, but Consul cannot detect healthy endpoints for the second cluster. This information appears in the following lines of the example: + + ```text hideClipboard + ✓ cluster "backend.default.dc1.internal..consul" for upstream "backend" found + ✓ healthy endpoints for cluster "backend.default.dc1.internal.e08fa6d6-e91e-dfe0-f6e1-ba097a828e31.consul" for upstream "backend" found + ✓ cluster "backend2.default.dc1.internal..consul" for upstream "backend" found + ! no healthy endpoints for cluster "backend2.default.dc1.internal.e08fa6d6-e91e-dfe0-f6e1-ba097a828e31.consul" for upstream "backend" found +``` + +The output from the troubleshooting process identifies service instances according to their [Consul DNS address](/consul/docs/k8s/dns). Use the DNS information for failing services to diagnose the specific issues affecting the service instance. + +For more information, refer to the [`consul-k8s troubleshoot` CLI reference](/consul/docs/k8s/k8s-cli#troubleshoot). \ No newline at end of file diff --git a/website/data/docs-nav-data.json b/website/data/docs-nav-data.json index 3f86b2e8b69..77acac9792b 100644 --- a/website/data/docs-nav-data.json +++ b/website/data/docs-nav-data.json @@ -820,6 +820,10 @@ { "title": "Troubleshoot", "routes": [ + { + "title": "Service-to-Service Troubleshooting", + "path": "troubleshoot/troubleshoot-services" + }, { "title": "Common Error Messages", "path": "troubleshoot/common-errors" From cddf86f337500da2c0db3a1b6c266b653ed0f63d Mon Sep 17 00:00:00 2001 From: Jeff Boruszak <104028618+boruszak@users.noreply.github.com> Date: Thu, 23 Feb 2023 11:58:39 -0600 Subject: [PATCH 053/262] Docs/cluster peering 1.15 updates (#16291) * initial commit * initial commit * Overview updates * Overview page improvements * More Overview improvements * improvements * Small fixes/updates * Updates * Overview updates * Nav data * More nav updates * Fix * updates * Updates + tip test * Directory test * refining * Create restructure w/ k8s * Single usage page * Technical Specification * k8s pages * typo * L7 traffic management * Manage connections * k8s page fix * Create page tab corrections * link to k8s * intentions * corrections * Add-on intention descriptions * adjustments * Missing * Diagram improvements * Final diagram update * Apply suggestions from code review Co-authored-by: trujillo-adam <47586768+trujillo-adam@users.noreply.github.com> Co-authored-by: Tu Nguyen Co-authored-by: David Yu * diagram name fix * Fixes * Updates to index.mdx * Tech specs page corrections * Tech specs page rename * update link to tech specs * K8s - new pages + tech specs * k8s - manage peering connections * k8s L7 traffic management * Separated establish connection pages * Directory fixes * Usage clean up * k8s docs edits * Updated nav data * CodeBlock Component fix * filename * CodeBlockConfig removal * Redirects * Update k8s filenames * Reshuffle k8s tech specs for clarity, fmt yaml files * Update general cluster peering docs, reorder CLI > API > UI, cross link to kubernetes * Fix config rendering in k8s usage docs, cross link to general usage from k8s docs * fix legacy link * update k8s docs * fix nested list rendering * redirect fix * page error --------- Co-authored-by: trujillo-adam <47586768+trujillo-adam@users.noreply.github.com> Co-authored-by: Tu Nguyen Co-authored-by: David Yu Co-authored-by: Tu Nguyen --- website/content/api-docs/operator/usage.mdx | 2 + .../cluster-peering/create-manage-peering.mdx | 537 ---------------- .../docs/connect/cluster-peering/index.mdx | 74 ++- .../docs/connect/cluster-peering/k8s.mdx | 593 ------------------ .../connect/cluster-peering/tech-specs.mdx | 69 ++ .../usage/establish-cluster-peering.mdx | 271 ++++++++ .../usage/manage-connections.mdx | 137 ++++ .../usage/peering-traffic-management.mdx | 168 +++++ .../config-entries/service-intentions.mdx | 51 ++ .../service-to-service-traffic-peers.mdx | 60 -- .../connect/cluster-peering/tech-specs.mdx | 180 ++++++ .../usage/establish-peering.mdx | 453 +++++++++++++ .../cluster-peering/usage/l7-traffic.mdx | 75 +++ .../cluster-peering/usage/manage-peering.mdx | 121 ++++ website/data/docs-nav-data.json | 57 +- .../public/img/cluster-peering-diagram.png | Bin 0 -> 129219 bytes website/redirects.js | 14 +- 17 files changed, 1642 insertions(+), 1220 deletions(-) delete mode 100644 website/content/docs/connect/cluster-peering/create-manage-peering.mdx delete mode 100644 website/content/docs/connect/cluster-peering/k8s.mdx create mode 100644 website/content/docs/connect/cluster-peering/tech-specs.mdx create mode 100644 website/content/docs/connect/cluster-peering/usage/establish-cluster-peering.mdx create mode 100644 website/content/docs/connect/cluster-peering/usage/manage-connections.mdx create mode 100644 website/content/docs/connect/cluster-peering/usage/peering-traffic-management.mdx delete mode 100644 website/content/docs/connect/gateways/mesh-gateway/service-to-service-traffic-peers.mdx create mode 100644 website/content/docs/k8s/connect/cluster-peering/tech-specs.mdx create mode 100644 website/content/docs/k8s/connect/cluster-peering/usage/establish-peering.mdx create mode 100644 website/content/docs/k8s/connect/cluster-peering/usage/l7-traffic.mdx create mode 100644 website/content/docs/k8s/connect/cluster-peering/usage/manage-peering.mdx create mode 100644 website/public/img/cluster-peering-diagram.png diff --git a/website/content/api-docs/operator/usage.mdx b/website/content/api-docs/operator/usage.mdx index 1d7e2f023a6..ae1e9d87ccb 100644 --- a/website/content/api-docs/operator/usage.mdx +++ b/website/content/api-docs/operator/usage.mdx @@ -48,6 +48,7 @@ $ curl \ ### Sample Response + ```json @@ -77,6 +78,7 @@ $ curl \ ``` + ```json diff --git a/website/content/docs/connect/cluster-peering/create-manage-peering.mdx b/website/content/docs/connect/cluster-peering/create-manage-peering.mdx deleted file mode 100644 index dbbf0d4fc3a..00000000000 --- a/website/content/docs/connect/cluster-peering/create-manage-peering.mdx +++ /dev/null @@ -1,537 +0,0 @@ ---- -layout: docs -page_title: Cluster Peering - Create and Manage Connections -description: >- - Generate a peering token to establish communication, export services, and authorize requests for cluster peering connections. Learn how to create, list, read, check, and delete peering connections. ---- - - -# Create and Manage Cluster Peering Connections - -A peering token enables cluster peering between different datacenters. Once you generate a peering token, you can use it to establish a connection between clusters. Then you can export services and create intentions so that peered clusters can call those services. - -## Create a peering connection - -Cluster peering is enabled by default on Consul servers as of v1.14. For additional information, including options to disable cluster peering, refer to [Configuration Files](/consul/docs/agent/config/config-files). - -The process to create a peering connection is a sequence with multiple steps: - -1. Create a peering token -1. Establish a connection between clusters -1. Export services between clusters -1. Authorize services for peers - -You can generate peering tokens and initiate connections on any available agent using either the API, CLI, or the Consul UI. If you use the API or CLI, we recommend performing these operations through a client agent in the partition you want to connect. - -The UI does not currently support exporting services between clusters or authorizing services for peers. - -### Create a peering token - -To begin the cluster peering process, generate a peering token in one of your clusters. The other cluster uses this token to establish the peering connection. - -Every time you generate a peering token, a single-use establishment secret is embedded in the token. Because regenerating a peering token invalidates the previously generated secret, you must use the most recently created token to establish peering connections. - - - - -In `cluster-01`, use the [`/peering/token` endpoint](/consul/api-docs/peering#generate-a-peering-token) to issue a request for a peering token. - -```shell-session -$ curl --request POST --data '{"Peer":"cluster-02"}' --url http://localhost:8500/v1/peering/token -``` - -The CLI outputs the peering token, which is a base64-encoded string containing the token details. - -Create a JSON file that contains the first cluster's name and the peering token. - - - -```json -{ - "Peer": "cluster-01", - "PeeringToken": "eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJhZG1pbiIsImF1ZCI6IlNvbHIifQ.5T7L_L1MPfQ_5FjKGa1fTPqrzwK4bNSM812nW6oyjb8" -} -``` - - - - - - -In `cluster-01`, use the [`consul peering generate-token` command](/consul/commands/peering/generate-token) to issue a request for a peering token. - -```shell-session -$ consul peering generate-token -name cluster-02 -``` - -The CLI outputs the peering token, which is a base64-encoded string containing the token details. -Save this value to a file or clipboard to be used in the next step on `cluster-02`. - - - - - -1. In the Consul UI for the datacenter associated with `cluster-01`, click **Peers**. -1. Click **Add peer connection**. -1. In the **Generate token** tab, enter `cluster-02` in the **Name of peer** field. -1. Click the **Generate token** button. -1. Copy the token before you proceed. You cannot view it again after leaving this screen. If you lose your token, you must generate a new one. - - - - -### Establish a connection between clusters - -Next, use the peering token to establish a secure connection between the clusters. - - - - -In one of the client agents in "cluster-02," use `peering_token.json` and the [`/peering/establish` endpoint](/consul/api-docs/peering#establish-a-peering-connection) to establish the peering connection. This endpoint does not generate an output unless there is an error. - -```shell-session -$ curl --request POST --data @peering_token.json http://127.0.0.1:8500/v1/peering/establish -``` - -When you connect server agents through cluster peering, their default behavior is to peer to the `default` partition. To establish peering connections for other partitions through server agents, you must add the `Partition` field to `peering_token.json` and specify the partitions you want to peer. For additional configuration information, refer to [Cluster Peering - HTTP API](/consul/api-docs/peering). - -You can dial the `peering/establish` endpoint once per peering token. Peering tokens cannot be reused after being used to establish a connection. If you need to re-establish a connection, you must generate a new peering token. - - - - - -In one of the client agents in "cluster-02," issue the [`consul peering establish` command](/consul/commands/peering/establish) and specify the token generated in the previous step. The command establishes the peering connection. -The commands prints "Successfully established peering connection with cluster-01" after the connection is established. - -```shell-session -$ consul peering establish -name cluster-01 -peering-token token-from-generate -``` - -When you connect server agents through cluster peering, they peer their default partitions. -To establish peering connections for other partitions through server agents, you must add the `-partition` flag to the `establish` command and specify the partitions you want to peer. -For additional configuration information, refer to [`consul peering establish` command](/consul/commands/peering/establish) . - -You can run the `peering establish` command once per peering token. -Peering tokens cannot be reused after being used to establish a connection. -If you need to re-establish a connection, you must generate a new peering token. - - - - - -1. In the Consul UI for the datacenter associated with `cluster 02`, click **Peers** and then **Add peer connection**. -1. Click **Establish peering**. -1. In the **Name of peer** field, enter `cluster-01`. Then paste the peering token in the **Token** field. -1. Click **Add peer**. - - - - -### Export services between clusters - -After you establish a connection between the clusters, you need to create a configuration entry that defines the services that are available for other clusters. Consul uses this configuration entry to advertise service information and support service mesh connections across clusters. - -First, create a configuration entry and specify the `Kind` as `"exported-services"`. - - - -```hcl -Kind = "exported-services" -Name = "default" -Services = [ - { - ## The name and namespace of the service to export. - Name = "service-name" - Namespace = "default" - - ## The list of peer clusters to export the service to. - Consumers = [ - { - ## The peer name to reference in config is the one set - ## during the peering process. - Peer = "cluster-02" - } - ] - } -] -``` - - - -Then, add the configuration entry to your cluster. - -```shell-session -$ consul config write peering-config.hcl -``` - -Before you proceed, wait for the clusters to sync and make services available to their peers. You can issue an endpoint query to [check the peered cluster status](#check-peered-cluster-status). - -### Authorize services for peers - -Before you can call services from peered clusters, you must set service intentions that authorize those clusters to use specific services. Consul prevents services from being exported to unauthorized clusters. - -First, create a configuration entry and specify the `Kind` as `"service-intentions"`. Declare the service on "cluster-02" that can access the service in "cluster-01." The following example sets service intentions so that "frontend-service" can access "backend-service." - - - -```hcl -Kind = "service-intentions" -Name = "backend-service" - -Sources = [ - { - Name = "frontend-service" - Peer = "cluster-02" - Action = "allow" - } -] -``` - - - -If the peer's name is not specified in `Peer`, then Consul assumes that the service is in the local cluster. - -Then, add the configuration entry to your cluster. - -```shell-session -$ consul config write peering-intentions.hcl -``` - -### Authorize Service Reads with ACLs - -If ACLs are enabled on a Consul cluster, sidecar proxies that access exported services as an upstream must have an ACL token that grants read access. -Read access to all imported services is granted using either of the following rules associated with an ACL token: -- `service:write` permissions for any service in the sidecar's partition. -- `service:read` and `node:read` for all services and nodes, respectively, in sidecar's namespace and partition. -For Consul Enterprise, access is granted to all imported services in the service's partition. -These permissions are satisfied when using a [service identity](/consul/docs/security/acl/acl-roles#service-identities). - -Example rule files can be found in [Reading Servers](/consul/docs/connect/config-entries/exported-services#reading-services) in the `exported-services` config entry documentation. - -Refer to [ACLs System Overview](/consul/docs/security/acl) for more information on ACLs and their setup. - -## Manage peering connections - -After you establish a peering connection, you can get a list of all active peering connections, read a specific peering connection's information, check peering connection health, and delete peering connections. - -### List all peering connections - -You can list all active peering connections in a cluster. - - - - -After you establish a peering connection, [query the `/peerings/` endpoint](/consul/api-docs/peering#list-all-peerings) to get a list of all peering connections. For example, the following command requests a list of all peering connections on `localhost` and returns the information as a series of JSON objects: - -```shell-session -$ curl http://127.0.0.1:8500/v1/peerings - -[ - { - "ID": "462c45e8-018e-f19d-85eb-1fc1bcc2ef12", - "Name": "cluster-02", - "State": "ACTIVE", - "Partition": "default", - "PeerID": "e83a315c-027e-bcb1-7c0c-a46650904a05", - "PeerServerName": "server.dc1.consul", - "PeerServerAddresses": [ - "10.0.0.1:8300" - ], - "CreateIndex": 89, - "ModifyIndex": 89 - }, - { - "ID": "1460ada9-26d2-f30d-3359-2968aa7dc47d", - "Name": "cluster-03", - "State": "INITIAL", - "Partition": "default", - "Meta": { - "env": "production" - }, - "CreateIndex": 109, - "ModifyIndex": 119 - }, -] -``` - - - - -After you establish a peering connection, run the [`consul peering list`](/consul/commands/peering/list) command to get a list of all peering connections. -For example, the following command requests a list of all peering connections and returns the information in a table: - -```shell-session -$ consul peering list - -Name State Imported Svcs Exported Svcs Meta -cluster-02 ACTIVE 0 2 env=production -cluster-03 PENDING 0 0 - ``` - - - - -In the Consul UI, click **Peers**. The UI lists peering connections you created for clusters in a datacenter. - -The name that appears in the list is the name of the cluster in a different datacenter with an established peering connection. - - - -### Read a peering connection - -You can get information about individual peering connections between clusters. - - - - -After you establish a peering connection, [query the `/peering/` endpoint](/consul/api-docs/peering#read-a-peering-connection) to get peering information about for a specific cluster. For example, the following command requests peering connection information for "cluster-02" and returns the info as a JSON object: - -```shell-session -$ curl http://127.0.0.1:8500/v1/peering/cluster-02 - -{ - "ID": "462c45e8-018e-f19d-85eb-1fc1bcc2ef12", - "Name": "cluster-02", - "State": "INITIAL", - "PeerID": "e83a315c-027e-bcb1-7c0c-a46650904a05", - "PeerServerName": "server.dc1.consul", - "PeerServerAddresses": [ - "10.0.0.1:8300" - ], - "CreateIndex": 89, - "ModifyIndex": 89 -} -``` - - - - -After you establish a peering connection, run the [`consul peering read`](/consul/commands/peering/list) command to get peering information about for a specific cluster. -For example, the following command requests peering connection information for "cluster-02": - -```shell-session -$ consul peering read -name cluster-02 - -Name: cluster-02 -ID: 3b001063-8079-b1a6-764c-738af5a39a97 -State: ACTIVE -Meta: - env=production - -Peer ID: e83a315c-027e-bcb1-7c0c-a46650904a05 -Peer Server Name: server.dc1.consul -Peer CA Pems: 0 -Peer Server Addresses: - 10.0.0.1:8300 - -Imported Services: 0 -Exported Services: 2 - -Create Index: 89 -Modify Index: 89 - -``` - - - - -In the Consul UI, click **Peers**. The UI lists peering connections you created for clusters in that datacenter. Click the name of a peered cluster to view additional details about the peering connection. - - - -### Check peering connection health - -You can check the status of your peering connection to perform health checks. - -To confirm that the peering connection between your clusters remains healthy, query the [`health/service` endpoint](/consul/api-docs/health) of one cluster from the other cluster. For example, in "cluster-02," query the endpoint and add the `peer=cluster-01` query parameter to the end of the URL. - -```shell-session -$ curl \ - "http://127.0.0.1:8500/v1/health/service/?peer=cluster-01" -``` - -A successful query includes service information in the output. - -### Delete peering connections - -You can disconnect the peered clusters by deleting their connection. Deleting a peering connection stops data replication to the peer and deletes imported data, including services and CA certificates. - - - - -In "cluster-01," request the deletion through the [`/peering/ endpoint`](/consul/api-docs/peering#delete-a-peering-connection). - -```shell-session -$ curl --request DELETE http://127.0.0.1:8500/v1/peering/cluster-02 -``` - - - - -In "cluster-01," request the deletion through the [`consul peering delete`](/consul/commands/peering/list) command. - -```shell-session -$ consul peering delete -name cluster-02 - -Successfully submitted peering connection, cluster-02, for deletion -``` - - - - -In the Consul UI, click **Peers**. The UI lists peering connections you created for clusters in that datacenter. - -Next to the name of the peer, click **More** (three horizontal dots) and then **Delete**. Click **Delete** to confirm and remove the peering connection. - - - - -## L7 traffic management between peers - -The following sections describe how to enable L7 traffic management features between peered clusters. - -### Service resolvers for redirects and failover - -As of Consul v1.14, you can use [dynamic traffic management](/consul/docs/connect/l7-traffic) to configure your service mesh so that services automatically failover and redirect between peers. The following examples update the [`service-resolver` config entry](/consul/docs/connect/config-entries/) in `cluster-01` so that Consul redirects traffic intended for the `frontend` service to a backup instance in peer `cluster-02` when it detects multiple connection failures. - - - -```hcl -Kind = "service-resolver" -Name = "frontend" -ConnectTimeout = "15s" -Failover = { - "*" = { - Targets = [ - {Peer = "cluster-02"} - ] - } -} -``` - -```yaml -apiVersion: consul.hashicorp.com/v1alpha1 -kind: ServiceResolver -metadata: - name: frontend -spec: - connectTimeout: 15s - failover: - '*': - targets: - - peer: 'cluster-02' - service: 'frontend' - namespace: 'default' -``` - -```json -{ - "ConnectTimeout": "15s", - "Kind": "service-resolver", - "Name": "frontend", - "Failover": { - "*": { - "Targets": [ - { - "Peer": "cluster-02" - } - ] - } - }, - "CreateIndex": 250, - "ModifyIndex": 250 -} -``` - - - -### Service splitters and custom routes - -The `service-splitter` and `service-router` configuration entry kinds do not support directly targeting a service instance hosted on a peer. To split or route traffic to a service on a peer, you must combine the definition with a `service-resolver` configuration entry that defines the service hosted on the peer as an upstream service. For example, to split traffic evenly between `frontend` services hosted on peers, first define the desired behavior locally: - - - -```hcl -Kind = "service-splitter" -Name = "frontend" -Splits = [ - { - Weight = 50 - ## defaults to service with same name as configuration entry ("frontend") - }, - { - Weight = 50 - Service = "frontend-peer" - }, -] -``` - -```yaml -apiVersion: consul.hashicorp.com/v1alpha1 -kind: ServiceSplitter -metadata: - name: frontend -spec: - splits: - - weight: 50 - ## defaults to service with same name as configuration entry ("web") - - weight: 50 - service: frontend-peer -``` - -```json -{ - "Kind": "service-splitter", - "Name": "frontend", - "Splits": [ - { - "Weight": 50 - }, - { - "Weight": 50, - "Service": "frontend-peer" - } - ] -} -``` - - - -Then, create a local `service-resolver` configuration entry named `frontend-peer` and define a redirect targeting the peer and its service: - - - -```hcl -Kind = "service-resolver" -Name = "frontend-peer" -Redirect { - Service = frontend - Peer = "cluster-02" -} -``` - -```yaml -apiVersion: consul.hashicorp.com/v1alpha1 -kind: ServiceResolver -metadata: - name: frontend-peer -spec: - redirect: - peer: 'cluster-02' - service: 'frontend' -``` - -```json -{ - "Kind": "service-resolver", - "Name": "frontend-peer", - "Redirect": { - "Service": "frontend", - "Peer": "cluster-02" - } -} -``` - - - diff --git a/website/content/docs/connect/cluster-peering/index.mdx b/website/content/docs/connect/cluster-peering/index.mdx index 77f4b8f4c73..aeb940d638c 100644 --- a/website/content/docs/connect/cluster-peering/index.mdx +++ b/website/content/docs/connect/cluster-peering/index.mdx @@ -1,32 +1,37 @@ --- layout: docs -page_title: Service Mesh - What is Cluster Peering? +page_title: Cluster Peering Overview description: >- - Cluster peering establishes communication between independent clusters in Consul, allowing services to interact across datacenters. Learn about the cluster peering process, differences with WAN federation for multi-datacenter deployments, and technical constraints. + Cluster peering establishes communication between independent clusters in Consul, allowing services to interact across datacenters. Learn how cluster peering works, its differences with WAN federation for multi-datacenter deployments, and how to troubleshoot common issues. --- -# What is Cluster Peering? +# Cluster peering overview -You can create peering connections between two or more independent clusters so that services deployed to different partitions or datacenters can communicate. +This topic provides an overview of cluster peering, which lets you connect two or more independent Consul clusters so that services deployed to different partitions or datacenters can communicate. +Cluster peering is enabled in Consul by default. For specific information about cluster peering configuration and usage, refer to following pages. -## Overview +## What is cluster peering? -Cluster peering is a process that allows Consul clusters to communicate with each other. The cluster peering process consists of the following steps: +Consul supports cluster peering connections between two [admin partitions](/consul/docs/enterprise/admin-partitions) _in different datacenters_. Deployments without an Enterprise license can still use cluster peering because every datacenter automatically includes a default partition. Meanwhile, admin partitions _in the same datacenter_ do not require cluster peering connections because you can export services between them without generating or exchanging a peering token. -1. Create a peering token in one cluster. -1. Use the peering token to establish peering with a second cluster. -1. Export services between clusters. -1. Create intentions to authorize services for peers. +The following diagram describes Consul's cluster peering architecture. -This process establishes cluster peering between two [admin partitions](/consul/docs/enterprise/admin-partitions). Deployments without an Enterprise license can still use cluster peering because every datacenter automatically includes a `default` partition. +![Diagram of cluster peering with admin partitions](/img/cluster-peering-diagram.png) -For detailed instructions on establishing cluster peering connections, refer to [Create and Manage Peering Connections](/consul/docs/connect/cluster-peering/create-manage-peering). +In this diagram, the `default` partition in Consul DC 1 has a cluster peering connection with the `web` partition in Consul DC 2. Enforced by their respective mesh gateways, this cluster peering connection enables `Service B` to communicate with `Service C` as a service upstream. -> To learn how to peer clusters and connect services across peers in AWS Elastic Kubernetes Service (EKS) environments, complete the [Consul Cluster Peering on Kubernetes tutorial](/consul/tutorials/developer-mesh/cluster-peering-aws?utm_source=docs). +Cluster peering leverages several components of Consul's architecture to enforce secure communication between services: -### Differences between WAN federation and cluster peering +- A _peering token_ contains an embedded secret that securely establishes communication when shared symetrically between datacenters. Sharing this token enables each datacenter's server agents to recognize requests from authorized peers, similar to how the [gossip encryption key secures agent LAN gossip](/consul/docs/security/encryption#gossip-encryption). +- A _mesh gateway_ encrypts outgoing traffic, decrypts incoming traffic, and directs traffic to healthy services. Consul's service mesh features must be enabled in order to use mesh gateways. Mesh gateways support the specific admin partitions they are deployed on. Refer to [Mesh gateways](/consul/docs/connect/gateways/mesh-gateway) for more information. +- An _exported service_ communicates with downstreams deployed in other admin partitions. They are explicitly defined in an [`exported-services` configuration entry](/consul/docs/connect/config-entries/exported-services). +- A _service intention_ secures [service-to-service communication in a service mesh](/consul/docs/connect/intentions). Intentions enable identity-based access between services by exchanging TLS certificates, which the service's sidecar proxy verifies upon each request. -WAN federation and cluster peering are different ways to connect Consul deployments. WAN federation connects multiple datacenters to make them function as if they were a single cluster, while cluster peering treats each datacenter as a separate cluster. As a result, WAN federation requires a primary datacenter to maintain and replicate global states such as ACLs and configuration entries, but cluster peering does not. +### Compared with WAN federation + +WAN federation and cluster peering are different ways to connect services through mesh gateways so that they can communicate across datacenters. WAN federation connects multiple datacenters to make them function as if they were a single cluster, while cluster peering treats each datacenter as a separate cluster. As a result, WAN federation requires a primary datacenter to maintain and replicate global states such as ACLs and configuration entries, but cluster peering does not. + +WAN federation and cluster peering also treat encrypted traffic differently. While mesh gateways between WAN federated datacenters use mTLS to keep data encrypted, mesh gateways between peers terminate mTLS sessions, decrypt data to HTTP services, and then re-encrypt traffic to send to services. Data must be decrypted in order to evaluate and apply dynamic routing rules at the destination cluster, which reduces coupling between peers. Regardless of whether you connect your clusters through WAN federation or cluster peering, human and machine users can use either method to discover services in other clusters or dial them through the service mesh. @@ -42,11 +47,40 @@ Regardless of whether you connect your clusters through WAN federation or cluste | Shares key/value stores | ✅ | ❌ | | Can replicate ACL tokens, policies, and roles | ✅ | ❌ | -## Important Cluster Peering Constraints +## Guidance + +The following resources are available to help you use Consul's cluster peering features. + +**Tutorials:** + +- To learn how to peer clusters and connect services across peers in AWS Elastic Kubernetes Service (EKS) and Google Kubernetes Engine (GKE) environments, complete the [Consul Cluster Peering on Kubernetes tutorial](/consul/tutorials/developer-mesh/cluster-peering). + +**Usage documentation:** + +- [Establish cluster peering connections](/consul/docs/connect/cluster-peering/usage/establish-peering) +- [Manage cluster peering connections](/consul/docs/connect/cluster-peering/usage/manage-connections) +- [Manage L7 traffic with cluster peering](/consul/docs/connect/cluster-peering/usage/peering-traffic-management) + +**Kubernetes-specific documentation:** + +- [Cluster peering on Kubernetes technical specifications](/consul/docs/k8s/connect/cluster-peering/tech-specs) +- [Establish cluster peering connections on Kubernetes](/consul/docs/k8s/connect/cluster-peering/usage/establish-peering) +- [Manage cluster peering connections on Kubernetes](/consul/docs/k8s/connect/cluster-peering/usage/manage-peering) +- [Manage L7 traffic with cluster peering on Kubernetes](/consul/docs/k8s/connect/cluster-peering/usage/l7-traffic) + +**Reference documentation:** + +- [Cluster peering technical specifications](/consul/docs/connect/cluster-peering/tech-specs) +- [HTTP API reference: `/peering/` endpoint](/consul/api-docs/peering) +- [CLI reference: `peering` command](/consul/commands/peering). + +## Basic troubleshooting -Consider the following technical constraints: +If you experience errors when using Consul's cluster peering features, refer to the following list of technical constraints. +- Peer names can only contain lowercase characters. - Services with node, instance, and check definitions totaling more than 8MB cannot be exported to a peer. -- Two admin partitions in the same datacenter cannot be peered. Use [`exported-services`](/consul/docs/connect/config-entries/exported-services#exporting-services-to-peered-clusters) directly. -- The `consul intention` CLI command is not supported. To manage intentions that specify services in peered clusters, use [configuration entries](/consul/docs/connect/config-entries/service-intentions). -- Accessing key/value stores across peers is not supported. +- Two admin partitions in the same datacenter cannot be peered. Use the [`exported-services` configuration entry](/consul/docs/connect/config-entries/exported-services#exporting-services-to-peered-clusters) instead. +- To manage intentions that specify services in peered clusters, use [configuration entries](/consul/docs/connect/config-entries/service-intentions). The `consul intention` CLI command is not supported. +- The Consul UI does not support exporting services between clusters or creating service intentions. Use either the API or the CLI to complete these required steps when establishing new cluster peering connections. +- Accessing key/value stores across peers is not supported. \ No newline at end of file diff --git a/website/content/docs/connect/cluster-peering/k8s.mdx b/website/content/docs/connect/cluster-peering/k8s.mdx deleted file mode 100644 index 570442fd4a7..00000000000 --- a/website/content/docs/connect/cluster-peering/k8s.mdx +++ /dev/null @@ -1,593 +0,0 @@ ---- -layout: docs -page_title: Cluster Peering on Kubernetes -description: >- - If you use Consul on Kubernetes, learn how to enable cluster peering, create peering CRDs, and then manage peering connections in consul-k8s. ---- - -# Cluster Peering on Kubernetes - -To establish a cluster peering connection on Kubernetes, you need to enable several pre-requisite values in the Helm chart and create custom resource definitions (CRDs) for each side of the peering. - -The following Helm values are mandatory for cluster peering: -- [`global.tls.enabled = true`](/consul/docs/k8s/helm#v-global-tls-enabled) -- [`meshGateway.enabled = true`](/consul/docs/k8s/helm#v-meshgateway-enabled) - -The following CRDs are used to create and manage a peering connection: - -- `PeeringAcceptor`: Generates a peering token and accepts an incoming peering connection. -- `PeeringDialer`: Uses a peering token to make an outbound peering connection with the cluster that generated the token. - -Peering connections, including both data plane and control plane traffic, is routed through mesh gateways. -As of Consul v1.14, you can also [implement service failovers and redirects to control traffic](/consul/docs/connect/l7-traffic) between peers. - -> To learn how to peer clusters and connect services across peers in AWS Elastic Kubernetes Service (EKS) environments, complete the [Consul Cluster Peering on Kubernetes tutorial](/consul/tutorials/developer-mesh/cluster-peering-aws?utm_source=docs). - -## Prerequisites - -You must implement the following requirements to create and use cluster peering connections with Kubernetes: - -- Consul v1.14.0 or later -- At least two Kubernetes clusters -- The installation must be running on Consul on Kubernetes version 1.0.0 or later - -### Prepare for installation - -Complete the following procedure after you have provisioned a Kubernetes cluster and set up your kubeconfig file to manage access to multiple Kubernetes clusters. - -1. Use the `kubectl` command to export the Kubernetes context names and then set them to variables for future use. For more information on how to use kubeconfig and contexts, refer to the [Kubernetes docs on configuring access to multiple clusters](https://kubernetes.io/docs/tasks/access-application-cluster/configure-access-multiple-clusters/). - - You can use the following methods to get the context names for your clusters: - - - Use the `kubectl config current-context` command to get the context for the cluster you are currently in. - - Use the `kubectl config get-contexts` command to get all configured contexts in your kubeconfig file. - - ```shell-session - $ export CLUSTER1_CONTEXT= - $ export CLUSTER2_CONTEXT= - ``` - -1. To establish cluster peering through Kubernetes, create a `values.yaml` file with the following Helm values. **NOTE:** Mesh Gateway replicas are defaulted to 1 replica, and could be adjusted using the `meshGateway.replicas` value for higher availability. - - - - ```yaml - global: - name: consul - image: "hashicorp/consul:1.14.1" - peering: - enabled: true - tls: - enabled: true - meshGateway: - enabled: true - ``` - - - -### Install Consul on Kubernetes - -Install Consul on Kubernetes by using the CLI to apply `values.yaml` to each cluster. - - 1. In `cluster-01`, run the following commands: - - ```shell-session - $ export HELM_RELEASE_NAME=cluster-01 - ``` - - ```shell-session - $ helm install ${HELM_RELEASE_NAME} hashicorp/consul --create-namespace --namespace consul --version "1.0.1" --values values.yaml --set global.datacenter=dc1 --kube-context $CLUSTER1_CONTEXT - ``` - - 1. In `cluster-02`, run the following commands: - - ```shell-session - $ export HELM_RELEASE_NAME=cluster-02 - ``` - - ```shell-session - $ helm install ${HELM_RELEASE_NAME} hashicorp/consul --create-namespace --namespace consul --version "1.0.1" --values values.yaml --set global.datacenter=dc2 --kube-context $CLUSTER2_CONTEXT - ``` - -## Create a peering connection for Consul on Kubernetes - -To peer Kubernetes clusters running Consul, you need to create a peering token on one cluster (`cluster-01`) and share -it with the other cluster (`cluster-02`). The generated peering token from `cluster-01` will include the addresses of -the servers for that cluster. The servers for `cluster-02` will use that information to dial the servers in -`cluster-01`. Complete the following steps to create the peer connection. - -### Using mesh gateways for the peering connection -If the servers in `cluster-01` are not directly routable from the dialing cluster `cluster-02`, then you'll need to set up peering through mesh gateways. - -1. In `cluster-01` apply the `Mesh` custom resource so the generated token will have the mesh gateway addresses which will be routable from the other cluster. - - - - ```yaml - apiVersion: consul.hashicorp.com/v1alpha1 - kind: Mesh - metadata: - name: mesh - spec: - peering: - peerThroughMeshGateways: true - ``` - - - - ```shell-session - $ kubectl --context $CLUSTER1_CONTEXT apply -f mesh.yaml - ``` - -1. In `cluster-02` apply the `Mesh` custom resource so that the servers for `cluster-02` will use their local mesh gateway to dial the servers for `cluster-01`. - - - - ```yaml - apiVersion: consul.hashicorp.com/v1alpha1 - kind: Mesh - metadata: - name: mesh - spec: - peering: - peerThroughMeshGateways: true - ``` - - - - ```shell-session - $ kubectl --context $CLUSTER2_CONTEXT apply -f mesh.yaml - ``` - -### Create a peering token - -Peers identify each other using the `metadata.name` values you establish when creating the `PeeringAcceptor` and `PeeringDialer` CRDs. - -1. In `cluster-01`, create the `PeeringAcceptor` custom resource. - - - - ```yaml - apiVersion: consul.hashicorp.com/v1alpha1 - kind: PeeringAcceptor - metadata: - name: cluster-02 ## The name of the peer you want to connect to - spec: - peer: - secret: - name: "peering-token" - key: "data" - backend: "kubernetes" - ``` - - - -1. Apply the `PeeringAcceptor` resource to the first cluster. - - ```shell-session - $ kubectl --context $CLUSTER1_CONTEXT apply --filename acceptor.yaml - ```` - -1. Save your peering token so that you can export it to the other cluster. - - ```shell-session - $ kubectl --context $CLUSTER1_CONTEXT get secret peering-token --output yaml > peering-token.yaml - ``` - -### Establish a peering connection between clusters - -1. Apply the peering token to the second cluster. - - ```shell-session - $ kubectl --context $CLUSTER2_CONTEXT apply --filename peering-token.yaml - ``` - -1. In `cluster-02`, create the `PeeringDialer` custom resource. - - - - ```yaml - apiVersion: consul.hashicorp.com/v1alpha1 - kind: PeeringDialer - metadata: - name: cluster-01 ## The name of the peer you want to connect to - spec: - peer: - secret: - name: "peering-token" - key: "data" - backend: "kubernetes" - ``` - - - -1. Apply the `PeeringDialer` resource to the second cluster. - - ```shell-session - $ kubectl --context $CLUSTER2_CONTEXT apply --filename dialer.yaml - ``` - -### Configure the mesh gateway mode for traffic between services -Mesh gateways are required for service-to-service traffic between peered clusters. By default, this will mean that a -service dialing another service in a remote peer will dial the remote mesh gateway to reach that service. If you would -like to configure the mesh gateway mode such that this traffic always leaves through the local mesh gateway, you can use the `ProxyDefaults` CRD. - -1. In `cluster-01` apply the following `ProxyDefaults` CRD to configure the mesh gateway mode. - - - - ```yaml - apiVersion: consul.hashicorp.com/v1alpha1 - kind: ProxyDefaults - metadata: - name: global - spec: - meshGateway: - mode: local - ``` - - - - ```shell-session - $ kubectl --context $CLUSTER1_CONTEXT apply -f proxy-defaults.yaml - ``` - -1. In `cluster-02` apply the following `ProxyDefaults` CRD to configure the mesh gateway mode. - - - - ```yaml - apiVersion: consul.hashicorp.com/v1alpha1 - kind: ProxyDefaults - metadata: - name: global - spec: - meshGateway: - mode: local - ``` - - - - ```shell-session - $ kubectl --context $CLUSTER2_CONTEXT apply -f proxy-defaults.yaml - ``` - -### Export services between clusters - -The examples described in this section demonstrate how to export a service named `backend`. You should change instances of `backend` in the example code to the name of the service you want to export. - -1. For the service in `cluster-02` that you want to export, add the `"consul.hashicorp.com/connect-inject": "true"` annotation to your service's pods prior to deploying. The annotation allows the workload to join the mesh. It is highlighted in the following example: - - - - ```yaml - # Service to expose backend - apiVersion: v1 - kind: Service - metadata: - name: backend - spec: - selector: - app: backend - ports: - - name: http - protocol: TCP - port: 80 - targetPort: 9090 - --- - apiVersion: v1 - kind: ServiceAccount - metadata: - name: backend - --- - # Deployment for backend - apiVersion: apps/v1 - kind: Deployment - metadata: - name: backend - labels: - app: backend - spec: - replicas: 1 - selector: - matchLabels: - app: backend - template: - metadata: - labels: - app: backend - annotations: - "consul.hashicorp.com/connect-inject": "true" - spec: - serviceAccountName: backend - containers: - - name: backend - image: nicholasjackson/fake-service:v0.22.4 - ports: - - containerPort: 9090 - env: - - name: "LISTEN_ADDR" - value: "0.0.0.0:9090" - - name: "NAME" - value: "backend" - - name: "MESSAGE" - value: "Response from backend" - ``` - - - -1. Deploy the `backend` service to the second cluster. - - ```shell-session - $ kubectl --context $CLUSTER2_CONTEXT apply --filename backend.yaml - ``` - -1. In `cluster-02`, create an `ExportedServices` custom resource. - - - - ```yaml - apiVersion: consul.hashicorp.com/v1alpha1 - kind: ExportedServices - metadata: - name: default ## The name of the partition containing the service - spec: - services: - - name: backend ## The name of the service you want to export - consumers: - - peer: cluster-01 ## The name of the peer that receives the service - ``` - - - -1. Apply the `ExportedServices` resource to the second cluster. - - ```shell-session - $ kubectl --context $CLUSTER2_CONTEXT apply --filename exported-service.yaml - ``` - -### Authorize services for peers - -1. Create service intentions for the second cluster. - - - - ```yaml - apiVersion: consul.hashicorp.com/v1alpha1 - kind: ServiceIntentions - metadata: - name: backend-deny - spec: - destination: - name: backend - sources: - - name: "*" - action: deny - - name: frontend - action: allow - peer: cluster-01 ## The peer of the source service - ``` - - - -1. Apply the intentions to the second cluster. - - - - ```shell-session - $ kubectl --context $CLUSTER2_CONTEXT apply --filename intention.yaml - ``` - - - -1. Add the `"consul.hashicorp.com/connect-inject": "true"` annotation to your service's pods before deploying the workload so that the services in `cluster-01` can dial `backend` in `cluster-02`. To dial the upstream service from an application, configure the application so that that requests are sent to the correct DNS name as specified in [Service Virtual IP Lookups](/consul/docs/discovery/dns#service-virtual-ip-lookups). In the following example, the annotation that allows the workload to join the mesh and the configuration provided to the workload that enables the workload to dial the upstream service using the correct DNS name is highlighted. [Service Virtual IP Lookups for Consul Enterprise](/consul/docs/discovery/dns#service-virtual-ip-lookups-for-consul-enterprise) details how you would similarly format a DNS name including partitions and namespaces. - - - - ```yaml - # Service to expose frontend - apiVersion: v1 - kind: Service - metadata: - name: frontend - spec: - selector: - app: frontend - ports: - - name: http - protocol: TCP - port: 9090 - targetPort: 9090 - --- - apiVersion: v1 - kind: ServiceAccount - metadata: - name: frontend - --- - apiVersion: apps/v1 - kind: Deployment - metadata: - name: frontend - labels: - app: frontend - spec: - replicas: 1 - selector: - matchLabels: - app: frontend - template: - metadata: - labels: - app: frontend - annotations: - "consul.hashicorp.com/connect-inject": "true" - spec: - serviceAccountName: frontend - containers: - - name: frontend - image: nicholasjackson/fake-service:v0.22.4 - securityContext: - capabilities: - add: ["NET_ADMIN"] - ports: - - containerPort: 9090 - env: - - name: "LISTEN_ADDR" - value: "0.0.0.0:9090" - - name: "UPSTREAM_URIS" - value: "http://backend.virtual.cluster-02.consul" - - name: "NAME" - value: "frontend" - - name: "MESSAGE" - value: "Hello World" - - name: "HTTP_CLIENT_KEEP_ALIVES" - value: "false" - ``` - - - -1. Apply the service file to the first cluster. - - ```shell-session - $ kubectl --context $CLUSTER1_CONTEXT apply --filename frontend.yaml - ``` - -1. Run the following command in `frontend` and then check the output to confirm that you peered your clusters successfully. - - - - ```shell-session - $ kubectl --context $CLUSTER1_CONTEXT exec -it $(kubectl --context $CLUSTER1_CONTEXT get pod -l app=frontend -o name) -- curl localhost:9090 - - { - "name": "frontend", - "uri": "/", - "type": "HTTP", - "ip_addresses": [ - "10.16.2.11" - ], - "start_time": "2022-08-26T23:40:01.167199", - "end_time": "2022-08-26T23:40:01.226951", - "duration": "59.752279ms", - "body": "Hello World", - "upstream_calls": { - "http://backend.virtual.cluster-02.consul": { - "name": "backend", - "uri": "http://backend.virtual.cluster-02.consul", - "type": "HTTP", - "ip_addresses": [ - "10.32.2.10" - ], - "start_time": "2022-08-26T23:40:01.223503", - "end_time": "2022-08-26T23:40:01.224653", - "duration": "1.149666ms", - "headers": { - "Content-Length": "266", - "Content-Type": "text/plain; charset=utf-8", - "Date": "Fri, 26 Aug 2022 23:40:01 GMT" - }, - "body": "Response from backend", - "code": 200 - } - }, - "code": 200 - } - ``` - - - -## End a peering connection - -To end a peering connection, delete both the `PeeringAcceptor` and `PeeringDialer` resources. - -1. Delete the `PeeringDialer` resource from the second cluster. - - ```shell-session - $ kubectl --context $CLUSTER2_CONTEXT delete --filename dialer.yaml - ``` - -1. Delete the `PeeringAcceptor` resource from the first cluster. - - ```shell-session - $ kubectl --context $CLUSTER1_CONTEXT delete --filename acceptor.yaml - ```` - -1. Confirm that you deleted your peering connection in `cluster-01` by querying the the `/health` HTTP endpoint. The peered services should no longer appear. - - 1. Exec into the server pod for the first cluster. - - ```shell-session - $ kubectl exec -it consul-server-0 --context $CLUSTER1_CONTEXT -- /bin/sh - ``` - - 1. If you've enabled ACLs, export an ACL token to access the `/health` HTP endpoint for services. The bootstrap token may be used if an ACL token is not already provisioned. - - ```shell-session - $ export CONSUL_HTTP_TOKEN= - ``` - - 1. Query the the `/health` HTTP endpoint. The peered services should no longer appear. - - ```shell-session - $ curl "localhost:8500/v1/health/connect/backend?peer=cluster-02" - ``` - -## Recreate or reset a peering connection - -To recreate or reset the peering connection, you need to generate a new peering token from the cluster where you created the `PeeringAcceptor`. - -1. In the `PeeringAcceptor` CRD, add the annotation `consul.hashicorp.com/peering-version`. If the annotation already exists, update its value to a higher version. - - - - ```yaml - apiVersion: consul.hashicorp.com/v1alpha1 - kind: PeeringAcceptor - metadata: - name: cluster-02 - annotations: - consul.hashicorp.com/peering-version: "1" ## The peering version you want to set, must be in quotes - spec: - peer: - secret: - name: "peering-token" - key: "data" - backend: "kubernetes" - ``` - - - -1. After updating `PeeringAcceptor`, repeat the following steps to create a peering connection: - 1. [Create a peering token](#create-a-peering-token) - 1. [Establish a peering connection between clusters](#establish-a-peering-connection-between-clusters) - 1. [Export services between clusters](#export-services-between-clusters) - 1. [Authorize services for peers](#authorize-services-for-peers) - - Your peering connection is re-established with the updated token. - -~> **Note:** The only way to create or set a new peering token is to manually adjust the value of the annotation `consul.hashicorp.com/peering-version`. Creating a new token causes the previous token to expire. - -## Traffic management between peers - -As of Consul v1.14, you can use [dynamic traffic management](/consul/docs/connect/l7-traffic) to configure your service mesh so that services automatically failover and redirect between peers. - -To configure automatic service failovers and redirect, edit the `ServiceResolver` CRD so that traffic resolves to a backup service instance on a peer. The following example updates the `ServiceResolver` CRD in `cluster-01` so that Consul redirects traffic intended for the `frontend` service to a backup instance in `cluster-02` when it detects multiple connection failures to the primary instance. - - - -```yaml -apiVersion: consul.hashicorp.com/v1alpha1 -kind: ServiceResolver -metadata: - name: frontend -spec: - connectTimeout: 15s - failover: - '*': - targets: - - peer: 'cluster-02' - service: 'backup' - namespace: 'default' -``` - - diff --git a/website/content/docs/connect/cluster-peering/tech-specs.mdx b/website/content/docs/connect/cluster-peering/tech-specs.mdx new file mode 100644 index 00000000000..3e00d6a48b5 --- /dev/null +++ b/website/content/docs/connect/cluster-peering/tech-specs.mdx @@ -0,0 +1,69 @@ +--- +layout: docs +page_title: Cluster Peering Technical Specifications +description: >- + Cluster peering connections in Consul interact with mesh gateways, sidecar proxies, exported services, and ACLs. Learn about the configuration requirements for these components. +--- + +# Cluster peering technical specifications + +This reference topic describes the technical specifications associated with using cluster peering in your deployments. These specifications include required Consul components and their configurations. + +## Requirements + +To use cluster peering features, make sure your Consul environment meets the following prerequisites: + +- Consul v1.14 or higher. +- A local Consul agent is required to manage mesh gateway configuration. +- Use [Envoy proxies](/consul/docs/connect/proxies/envoy). Envoy is the only proxy with mesh gateway capabilities in Consul. + +In addition, the following service mesh components are required in order to establish cluster peering connections: + +- [Mesh gateways](#mesh-gateway-requirements) +- [Sidecar proxies](#sidecar-proxy-requirements) +- [Exported services](#exported-service-requirements) +- [ACLs](#acl-requirements) + +### Mesh gateway requirements + +Mesh gateways are required for routing service mesh traffic between partitions with cluster peering connections. Consider the following general requirements for mesh gateways when using cluster peering: + +- A cluster requires a registered mesh gateway in order to export services to peers. +- For Enterprise, this mesh gateway must also be registered in the same partition as the exported services and their `exported-services` configuration entry. +- To use the `local` mesh gateway mode, you must register a mesh gateway in the importing cluster. + +In addition, you must define the `Proxy.Config` settings using opaque parameters compatible with your proxy. Refer to the [Gateway options](/consul/docs/connect/proxies/envoy#gateway-options) and [Escape-hatch Overrides](/consul/docs/connect/proxies/envoy#escape-hatch-overrides) documentation for additional Envoy proxy configuration information. + +#### Mesh gateway modes + +By default, all cluster peering connections use mesh gateways in [remote mode](/consul/docs/connect/gateways/mesh-gateway/service-to-service-traffic-wan-datacenters#remote). Be aware of these additional requirements when changing a mesh gateway's mode. + +- For mesh gateways that connect peered clusters, you can set the `mode` as either `remote` or `local`. +- The `none` mode is invalid for mesh gateways with cluster peering connections. + +Refer to [mesh gateway modes](/consul/docs/connect/gateways/mesh-gateway#modes) for more information. + +## Sidecar proxy requirements + +The Envoy proxies that function as sidecars in your service mesh require configuration in order to properly route traffic to peers. Sidecar proxies are defined in the [service definition](/consul/docs/discovery/services). + +- Configure the `proxy.upstreams` parameters to route traffic to the correct service, namespace, and peer. Refer to the [`upstreams`](/consul/docs/connect/registration/service-registration#upstream-configuration-reference) documentation for details. +- The `proxy.upstreams.destination_name` parameter is always required. +- The `proxy.upstreams.destination_peer` parameter must be configured to enable cross-cluster traffic. +- The `proxy.upstream/destination_namespace` configuration is only necessary if the destination service is in a non-default namespace. + +## Exported service requirements + +The `exported-services` configuration entry is required in order for services to communicate across partitions with cluster peering connections. + +Basic guidance on using the `exported-services` configuration entry is included in [Establish cluster peering connections](/consul/docs/connect/cluster-peering/usage/create-cluster-peering). + +Refer to the [`exported-services` configuration entry](/consul/docs/connect/config-entries/exported-services) reference for more information. + +## ACL requirements + +If ACLs are enabled, you must add tokens to grant the following permissions: + +- Grant `service:write` permissions to services that define mesh gateways in their server definition. +- Grant `service:read` permissions for all services on the partition. +- Grant `mesh:write` permissions to the mesh gateways that participate in cluster peering connections. This permission allows a leaf certificate to be issued for mesh gateways to terminate TLS sessions for HTTP requests. \ No newline at end of file diff --git a/website/content/docs/connect/cluster-peering/usage/establish-cluster-peering.mdx b/website/content/docs/connect/cluster-peering/usage/establish-cluster-peering.mdx new file mode 100644 index 00000000000..29259ccf2e5 --- /dev/null +++ b/website/content/docs/connect/cluster-peering/usage/establish-cluster-peering.mdx @@ -0,0 +1,271 @@ +--- +layout: docs +page_title: Establish Cluster Peering Connections +description: >- + Generate a peering token to establish communication, export services, and authorize requests for cluster peering connections. Learn how to establish peering connections with Consul's HTTP API, CLI or UI. +--- + +# Establish cluster peering connections + +This page details the process for establishing a cluster peering connection between services deployed to different datacenters. You can interact with Consul's cluster peering features using the CLI, the HTTP API, or the UI. The overall process for establishing a cluster peering connection consists of the following steps: + +1. Create a peering token in one cluster. +1. Use the peering token to establish peering with a second cluster. +1. Export services between clusters. +1. Create intentions to authorize services for peers. + +Cluster peering between services cannot be established until all four steps are complete. + +For Kubernetes-specific guidance for establishing cluster peering connections, refer to [Establish cluster peering connections on Kubernetes](/consul/docs/k8s/connect/cluster-peering/usage/establish-peering). + +## Requirements + +You must meet the following requirements to use cluster peering: + +- Consul v1.14.1 or higher +- Services hosted in admin partitions on separate datacenters + +If you need to make services available to an admin partition in the same datacenter, do not use cluster peering. Instead, use the [`exported-services` configuration entry](/consul/docs/connect/config-entries/exported-services) to make service upstreams available to other admin partitions in a single datacenter. + +### Mesh gateway requirements + +Mesh gateways are required for all cluster peering connections. Consider the following architectural requirements when creating mesh gateways: + +- A registered mesh gateway is required in order to export services to peers. +- For Enterprise, the mesh gateway that exports services must be registered in the same partition as the exported services and their `exported-services` configuration entry. +- To use the `local` mesh gateway mode, you must register a mesh gateway in the importing cluster. + +## Create a peering token + +To begin the cluster peering process, generate a peering token in one of your clusters. The other cluster uses this token to establish the peering connection. + +Every time you generate a peering token, a single-use secret for establishing the secret is embedded in the token. Because regenerating a peering token invalidates the previously generated secret, you must use the most recently created token to establish peering connections. + + + + +1. In `cluster-01`, use the [`consul peering generate-token` command](/consul/commands/peering/generate-token) to issue a request for a peering token. + + ```shell-session + $ consul peering generate-token -name cluster-02 + ``` + + The CLI outputs the peering token, which is a base64-encoded string containing the token details. + +1. Save this value to a file or clipboard to use in the next step on `cluster-02`. + + + + +1. In `cluster-01`, use the [`/peering/token` endpoint](/consul/api-docs/peering#generate-a-peering-token) to issue a request for a peering token. + + ```shell-session + $ curl --request POST --data '{"Peer":"cluster-02"}' --url http://localhost:8500/v1/peering/token + ``` + + The CLI outputs the peering token, which is a base64-encoded string containing the token details. + +1. Create a JSON file that contains the first cluster's name and the peering token. + + + + ```json + { + "Peer": "cluster-01", + "PeeringToken": "eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJhZG1pbiIsImF1ZCI6IlNvbHIifQ.5T7L_L1MPfQ_5FjKGa1fTPqrzwK4bNSM812nW6oyjb8" + } + ``` + + + + + + +To begin the cluster peering process, generate a peering token in one of your clusters. The other cluster uses this token to establish the peering connection. + +Every time you generate a peering token, a single-use secret for establishing the secret is embedded in the token. Because regenerating a peering token invalidates the previously generated secret, you must use the most recently created token to establish peering connections. + +1. In the Consul UI for the datacenter associated with `cluster-01`, click **Peers**. +1. Click **Add peer connection**. +1. In the **Generate token** tab, enter `cluster-02` in the **Name of peer** field. +1. Click the **Generate token** button. +1. Copy the token before you proceed. You cannot view it again after leaving this screen. If you lose your token, you must generate a new one. + + + + +## Establish a connection between clusters + +Next, use the peering token to establish a secure connection between the clusters. + + + + +1. In one of the client agents deployed to "cluster-02," issue the [`consul peering establish` command](/consul/commands/peering/establish) and specify the token generated in the previous step. + + ```shell-session + $ consul peering establish -name cluster-01 -peering-token token-from-generate + "Successfully established peering connection with cluster-01" + ``` + +When you connect server agents through cluster peering, they peer their default partitions. To establish peering connections for other partitions through server agents, you must add the `-partition` flag to the `establish` command and specify the partitions you want to peer. For additional configuration information, refer to [`consul peering establish` command](/consul/commands/peering/establish). + +You can run the `peering establish` command once per peering token. Peering tokens cannot be reused after being used to establish a connection. If you need to re-establish a connection, you must generate a new peering token. + + + + +1. In one of the client agents in "cluster-02," use `peering_token.json` and the [`/peering/establish` endpoint](/consul/api-docs/peering#establish-a-peering-connection) to establish the peering connection. This endpoint does not generate an output unless there is an error. + + ```shell-session + $ curl --request POST --data @peering_token.json http://127.0.0.1:8500/v1/peering/establish + ``` + +When you connect server agents through cluster peering, their default behavior is to peer to the `default` partition. To establish peering connections for other partitions through server agents, you must add the `Partition` field to `peering_token.json` and specify the partitions you want to peer. For additional configuration information, refer to [Cluster Peering - HTTP API](/consul/api-docs/peering). + +You can dial the `peering/establish` endpoint once per peering token. Peering tokens cannot be reused after being used to establish a connection. If you need to re-establish a connection, you must generate a new peering token. + + + + + +1. In the Consul UI for the datacenter associated with `cluster 02`, click **Peers** and then **Add peer connection**. +1. Click **Establish peering**. +1. In the **Name of peer** field, enter `cluster-01`. Then paste the peering token in the **Token** field. +1. Click **Add peer**. + + + + +## Export services between clusters + +After you establish a connection between the clusters, you need to create an `exported-services` configuration entry that defines the services that are available for other clusters. Consul uses this configuration entry to advertise service information and support service mesh connections across clusters. + +An `exported-services` configuration entry makes services available to another admin partition. While it can target admin partitions either locally or remotely. Clusters peers always export services to remote partitions. Refer to [exported service consumers](/consul/docs/connect/config-entries/exported-services#consumers-1) for more information. + +You must use the Consul CLI to complete this step. The HTTP API and the Consul UI do not support `exported-services` configuration entries. + + + + +1. Create a configuration entry and specify the `Kind` as `"exported-services"`. + + + + ```hcl + Kind = "exported-services" + Name = "default" + Services = [ + { + ## The name and namespace of the service to export. + Name = "service-name" + Namespace = "default" + + ## The list of peer clusters to export the service to. + Consumers = [ + { + ## The peer name to reference in config is the one set + ## during the peering process. + Peer = "cluster-02" + } + ] + } + ] + ``` + + + +1. Add the configuration entry to your cluster. + + ```shell-session + $ consul config write peering-config.hcl + ``` + +Before you proceed, wait for the clusters to sync and make services available to their peers. To check the peered cluster status, [read the cluster peering connection](/consul/docs/connect/cluster-peering/usage/manage-connections#read-a-peering-connection). + + + + +## Authorize services for peers + +Before you can call services from peered clusters, you must set service intentions that authorize those clusters to use specific services. Consul prevents services from being exported to unauthorized clusters. + +You must use the HTTP API or the Consul CLI to complete this step. The Consul UI supports intentions for local clusters only. + + + + +1. Create a configuration entry and specify the `Kind` as `"service-intentions"`. Declare the service on "cluster-02" that can access the service in "cluster-01." In the following example, the service intentions configuration entry authorizes the `backend-service` to communicate with the `frontend-service` that is hosted on remote peer `cluster-02`: + + + + ```hcl + Kind = "service-intentions" + Name = "backend-service" + + Sources = [ + { + Name = "frontend-service" + Peer = "cluster-02" + Action = "allow" + } + ] + ``` + + + + If the peer's name is not specified in `Peer`, then Consul assumes that the service is in the local cluster. + +1. Add the configuration entry to your cluster. + + ```shell-session + $ consul config write peering-intentions.hcl + ``` + + + + +1. Create a configuration entry and specify the `Kind` as `"service-intentions"`. Declare the service on "cluster-02" that can access the service in "cluster-01." In the following example, the service intentions configuration entry authorizes the `backend-service` to communicate with the `frontend-service` that is hosted on remote peer `cluster-02`: + + + + ```hcl + Kind = "service-intentions" + Name = "backend-service" + + Sources = [ + { + Name = "frontend-service" + Peer = "cluster-02" + Action = "allow" + } + ] + ``` + + + + If the peer's name is not specified in `Peer`, then Consul assumes that the service is in the local cluster. + +1. Add the configuration entry to your cluster. + + ```shell-session + $ curl --request PUT --data @peering-intentions.hcl http://127.0.0.1:8500/v1/config + ``` + + + + +### Authorize service reads with ACLs + +If ACLs are enabled on a Consul cluster, sidecar proxies that access exported services as an upstream must have an ACL token that grants read access. + +Read access to all imported services is granted using either of the following rules associated with an ACL token: + +- `service:write` permissions for any service in the sidecar's partition. +- `service:read` and `node:read` for all services and nodes, respectively, in sidecar's namespace and partition. + +For Consul Enterprise, the permissions apply to all imported services in the service's partition. These permissions are satisfied when using a [service identity](/consul/docs/security/acl/acl-roles#service-identities). + +Refer to [Reading servers](/consul/docs/connect/config-entries/exported-services#reading-services) in the `exported-services` configuration entry documentation for example rules. + +For additional information about how to configure and use ACLs, refer to [ACLs system overview](/consul/docs/security/acl). \ No newline at end of file diff --git a/website/content/docs/connect/cluster-peering/usage/manage-connections.mdx b/website/content/docs/connect/cluster-peering/usage/manage-connections.mdx new file mode 100644 index 00000000000..d2e3b77181f --- /dev/null +++ b/website/content/docs/connect/cluster-peering/usage/manage-connections.mdx @@ -0,0 +1,137 @@ +--- +layout: docs +page_title: Manage Cluster Peering Connections +description: >- + Learn how to list, read, and delete cluster peering connections using Consul. You can use the HTTP API, the CLI, or the Consul UI to manage cluster peering connections. +--- + +# Manage cluster peering connections + +This usage topic describes how to manage cluster peering connections using the CLI, the HTTP API, and the UI. + +After you establish a cluster peering connection, you can get a list of all active peering connections, read a specific peering connection's information, and delete peering connections. + +For Kubernetes-specific guidance for managing cluster peering connections, refer to [Manage cluster peering connections on Kubernetes](/consul/docs/k8s/connect/cluster-peering/usage/manage-peering). + +## List all peering connections + +You can list all active peering connections in a cluster. + + + + + ```shell-session + $ consul peering list + Name State Imported Svcs Exported Svcs Meta + cluster-02 ACTIVE 0 2 env=production + cluster-03 PENDING 0 0 + ``` + +For more information, including optional flags and parameters, refer to the [`consul peering list` CLI command reference](/consul/commands/peering/list). + + + + +The following example shows how to format an API request to list peering connections: + + ```shell-session + $ curl --header "X-Consul-Token: 0137db51-5895-4c25-b6cd-d9ed992f4a52" http://127.0.0.1:8500/v1/peerings + ``` + +For more information, including optional parameters and sample responses, refer to the [`/peering` endpoint reference](/consul/api-docs/peering#list-all-peerings). + + + + +In the Consul UI, click **Peers**. + +The UI lists peering connections you created for clusters in a datacenter. The name that appears in the list is the name of the cluster in a different datacenter with an established peering connection. + + + + +## Read a peering connection + +You can get information about individual peering connections between clusters. + + + + + +The following example outputs information about a peering connection locally referred to as "cluster-02": + + ```shell-session + $ consul peering read -name cluster-02 + Name: cluster-02 + ID: 3b001063-8079-b1a6-764c-738af5a39a97 + State: ACTIVE + Meta: + env=production + + Peer ID: e83a315c-027e-bcb1-7c0c-a46650904a05 + Peer Server Name: server.dc1.consul + Peer CA Pems: 0 + Peer Server Addresses: + 10.0.0.1:8300 + + Imported Services: 0 + Exported Services: 2 + + Create Index: 89 + Modify Index: 89 + ``` + +For more information, including optional flags and parameters, refer to the [`consul peering read` CLI command reference](/consul/commands/peering/read). + + + + + ```shell-session + $ curl --header "X-Consul-Token: b23b3cad-5ea1-4413-919e-c76884b9ad60" http://127.0.0.1:8500/v1/peering/cluster-02 + ``` + +For more information, including optional parameters and sample responses, refer to the [`/peering` endpoint reference](/consul/api-docs/peering#read-a-peering-connection). + + + + +1. In the Consul UI, click **Peers**. + +1. Click the name of a peered cluster to view additional details about the peering connection. + + + + +## Delete peering connections + +You can disconnect the peered clusters by deleting their connection. Deleting a peering connection stops data replication to the peer and deletes imported data, including services and CA certificates. + + + + + The following examples deletes a peering connection to a cluster locally referred to as "cluster-02": + + ```shell-session + $ consul peering delete -name cluster-02 + Successfully submitted peering connection, cluster-02, for deletion + ``` + +For more information, including optional flags and parameters, refer to the [`consul peering delete` CLI command reference](/consul/commands/peering/delete). + + + + + ```shell-session + $ curl --request DELETE --header "X-Consul-Token: b23b3cad-5ea1-4413-919e-c76884b9ad60" http://127.0.0.1:8500/v1/peering/cluster-02 + ``` + +This endpoint does not return a response. For more information, including optional parameters, refer to the [`/peering` endpoint reference](/consul/api-docs/peering/consul/api-docs/peering#delete-a-peering-connection). + + + +1. In the Consul UI, click **Peers**. The UI lists peering connections you created for clusters in that datacenter. +1. Next to the name of the peer, click **More** (three horizontal dots) and then **Delete**. +1. Click **Delete** to confirm and remove the peering connection. + + + \ No newline at end of file diff --git a/website/content/docs/connect/cluster-peering/usage/peering-traffic-management.mdx b/website/content/docs/connect/cluster-peering/usage/peering-traffic-management.mdx new file mode 100644 index 00000000000..240b56dc974 --- /dev/null +++ b/website/content/docs/connect/cluster-peering/usage/peering-traffic-management.mdx @@ -0,0 +1,168 @@ +--- +layout: docs +page_title: Cluster Peering L7 Traffic Management +description: >- + Combine service resolver configurations with splitter and router configurations to manage L7 traffic in Consul deployments with cluster peering connections. Learn how to define dynamic traffic rules to target peers for redirects and failover. +--- + +# Manage L7 traffic with cluster peering + +This usage topic describes how to configure and apply the [`service-resolver` configuration entry](/consul/docs/connect/config-entries/service-resolver) to set up redirects and failovers between services that have an existing cluster peering connection. + +For Kubernetes-specific guidance for managing L7 traffic with cluster peering, refer to [Manage L7 traffic with cluster peering on Kubernetes](/consul/docs/k8s/connect/cluster-peering/usage/l7-traffic). + +## Service resolvers for redirects and failover + +When you use cluster peering to connect datacenters through their admin partitions, you can use [dynamic traffic management](/consul/docs/connect/l7-traffic) to configure your service mesh so that services automatically forward traffic to services hosted on peer clusters. + +However, the `service-splitter` and `service-router` configuration entry kinds do not natively support directly targeting a service instance hosted on a peer. Before you can split or route traffic to a service on a peer, you must define the service hosted on the peer as an upstream service by configuring a failover in the `service-resolver` configuration entry. Then, you can set up a redirect in a second service resolver to interact with the peer service by name. + +For more information about formatting, updating, and managing configuration entries in Consul, refer to [How to use configuration entries](/consul/docs/agent/config-entries). + +## Configure dynamic traffic between peers + +To configure L7 traffic management behavior in deployments with cluster peering connections, complete the following steps in order: + +1. Define the peer cluster as a failover target in the service resolver configuration. + + The following examples update the [`service-resolver` configuration entry](/consul/docs/connect/config-entries/service-resolver) in `cluster-01` so that Consul redirects traffic intended for the `frontend` service to a backup instance in peer `cluster-02` when it detects multiple connection failures. + + + + ```hcl + Kind = "service-resolver" + Name = "frontend" + ConnectTimeout = "15s" + Failover = { + "*" = { + Targets = [ + {Peer = "cluster-02"} + ] + } + } + ``` + + ```json + { + "ConnectTimeout": "15s", + "Kind": "service-resolver", + "Name": "frontend", + "Failover": { + "*": { + "Targets": [ + { + "Peer": "cluster-02" + } + ] + } + }, + "CreateIndex": 250, + "ModifyIndex": 250 + } + ``` + + ```yaml + apiVersion: consul.hashicorp.com/v1alpha1 + kind: ServiceResolver + metadata: + name: frontend + spec: + connectTimeout: 15s + failover: + '*': + targets: + - peer: 'cluster-02' + service: 'frontend' + namespace: 'default' + ``` + + + +1. Define the desired behavior in `service-splitter` or `service-router` configuration entries. + + The following example splits traffic evenly between `frontend` services hosted on peers by defining the desired behavior locally: + + + + ```hcl + Kind = "service-splitter" + Name = "frontend" + Splits = [ + { + Weight = 50 + ## defaults to service with same name as configuration entry ("frontend") + }, + { + Weight = 50 + Service = "frontend-peer" + }, + ] + ``` + + ```json + { + "Kind": "service-splitter", + "Name": "frontend", + "Splits": [ + { + "Weight": 50 + }, + { + "Weight": 50, + "Service": "frontend-peer" + } + ] + } + ``` + + ```yaml + apiVersion: consul.hashicorp.com/v1alpha1 + kind: ServiceSplitter + metadata: + name: frontend + spec: + splits: + - weight: 50 + ## defaults to service with same name as configuration entry ("frontend") + - weight: 50 + service: frontend-peer + ``` + + + +1. Create a local `service-resolver` configuration entry named `frontend-peer` and define a redirect targeting the peer and its service: + + + + ```hcl + Kind = "service-resolver" + Name = "frontend-peer" + Redirect { + Service = frontend + Peer = "cluster-02" + } + ``` + + ```json + { + "Kind": "service-resolver", + "Name": "frontend-peer", + "Redirect": { + "Service": "frontend", + "Peer": "cluster-02" + } + } + ``` + + ```yaml + apiVersion: consul.hashicorp.com/v1alpha1 + kind: ServiceResolver + metadata: + name: frontend-peer + spec: + redirect: + peer: 'cluster-02' + service: 'frontend' + ``` + + \ No newline at end of file diff --git a/website/content/docs/connect/config-entries/service-intentions.mdx b/website/content/docs/connect/config-entries/service-intentions.mdx index 619b4fb9fed..34c948ac1ef 100644 --- a/website/content/docs/connect/config-entries/service-intentions.mdx +++ b/website/content/docs/connect/config-entries/service-intentions.mdx @@ -335,6 +335,57 @@ spec: ``` +### Cluster peering + +When using cluster peering connections, intentions secure your deployments with authorized service-to-service communication between remote datacenters. In the following example, the service intentions configuration entry authorizes the `backend-service` to communicate with the `frontend-service` that is hosted on remote peer `cluster-02`: + + + + ```hcl + Kind = "service-intentions" + Name = "backend-service" + + Sources = [ + { + Name = "frontend-service" + Peer = "cluster-02" + Action = "allow" + } + ] + ``` + + ```yaml + ```yaml + apiVersion: consul.hashicorp.com/v1alpha1 + kind: ServiceIntentions + metadata: + name: backend-deny + spec: + destination: + name: backend + sources: + - name: "*" + action: deny + - name: frontend + action: allow + peer: cluster-01 ## The peer of the source service + ``` + + ```json + { + "Kind": "service-intentions", + "Name": "backend-service", + "Sources": [ + { + "Name": "frontend-service", + "Peer": "cluster-02", + "Action": "allow" + } + ] + } + ``` + + ## Available Fields - - Mesh gateways are specialized proxies that route data between services that cannot communicate directly. Learn how to enable service-to-service traffic across clusters in different datacenters or admin partitions that have an established peering connection. ---- - -# Enabling Service-to-service Traffic Across Peered Clusters - -Mesh gateways are required for you to route service mesh traffic between peered Consul clusters. Clusters can reside in different clouds or runtime environments where general interconnectivity between all services in all clusters is not feasible. - -At a minimum, a peered cluster exporting a service must have a mesh gateway registered. -For Enterprise, this mesh gateway must also be registered in the same partition as the exported service(s). -To use the `local` mesh gateway mode, there must also be a mesh gateway regsitered in the importing cluster. - -Unlike mesh gateways for WAN-federated datacenters and partitions, mesh gateways between peers terminate mTLS sessions to decrypt data to HTTP services and then re-encrypt traffic to send to services. Data must be decrypted in order to evaluate and apply dynamic routing rules at the destination cluster, which reduces coupling between peers. - -## Prerequisites - -To configure mesh gateways for cluster peering, make sure your Consul environment meets the following requirements: - -- Consul version 1.14.0 or newer. -- A local Consul agent is required to manage mesh gateway configuration. -- Use [Envoy proxies](/consul/docs/connect/proxies/envoy). Envoy is the only proxy with mesh gateway capabilities in Consul. - -## Configuration - -Configure the following settings to register and use the mesh gateway as a service in Consul. - -### Gateway registration - -- Specify `mesh-gateway` in the `kind` field to register the gateway with Consul. -- Define the `Proxy.Config` settings using opaque parameters compatible with your proxy. For Envoy, refer to the [Gateway Options](/consul/docs/connect/proxies/envoy#gateway-options) and [Escape-hatch Overrides](/consul/docs/connect/proxies/envoy#escape-hatch-overrides) documentation for additional configuration information. - -Alternatively, you can also use the CLI to spin up and register a gateway in Consul. For additional information, refer to the [`consul connect envoy` command](/consul/commands/connect/envoy#mesh-gateways). - -### Sidecar registration - -- Configure the `proxy.upstreams` parameters to route traffic to the correct service, namespace, and peer. Refer to the [`upstreams` documentation](/consul/docs/connect/registration/service-registration#upstream-configuration-reference) for details. -- The service `proxy.upstreams.destination_name` is always required. -- The `proxy.upstreams.destination_peer` must be configured to enable cross-cluster traffic. -- The `proxy.upstream/destination_namespace` configuration is only necessary if the destination service is in a non-default namespace. - -### Service exports - -- Include the `exported-services` configuration entry to enable Consul to export services contained in a cluster to one or more additional clusters. For additional information, refer to the [Exported Services documentation](/consul/docs/connect/config-entries/exported-services). - -### ACL configuration - -If ACLs are enabled, you must add a token granting `service:write` for the gateway's service name and `service:read` for all services in the Enterprise admin partition or OSS datacenter to the gateway's service definition. -These permissions authorize the token to route communications for other Consul service mesh services. - -You must also grant `mesh:write` to mesh gateways routing peering traffic in the data plane. -This permission allows a leaf certificate to be issued for mesh gateways to terminate TLS sessions for HTTP requests. - -### Modes - -Modes are configurable as either `remote` or `local` for mesh gateways that connect peered clusters. -The `none` setting is invalid for mesh gateways in peered clusters and will be ignored by the gateway. -By default, all proxies connecting to peered clusters use mesh gateways in [remote mode](/consul/docs/connect/gateways/mesh-gateway/service-to-service-traffic-wan-datacenters#remote). diff --git a/website/content/docs/k8s/connect/cluster-peering/tech-specs.mdx b/website/content/docs/k8s/connect/cluster-peering/tech-specs.mdx new file mode 100644 index 00000000000..b984e9abde0 --- /dev/null +++ b/website/content/docs/k8s/connect/cluster-peering/tech-specs.mdx @@ -0,0 +1,180 @@ +--- +layout: docs +page_title: Cluster Peering on Kubernetes Technical Specifications +description: >- + In Kubernetes deployments, cluster peering connections interact with mesh gateways, sidecar proxies, exported services, and ACLs. Learn about requirements specific to k8s, including required Helm values and CRDs. +--- + +# Cluster peering on Kubernetes technical specifications + +This reference topic describes the technical specifications associated with using cluster peering in your Kubernetes deployments. These specifications include [required Helm values](#helm-requirements) and [required custom resource definitions (CRDs)](#crd-requirements), as well as required Consul components and their configurations. + +For cluster peering requirements in non-Kubernetes deployments, refer to [cluster peering technical specifications](/consul/docs/connect/cluster-peering/tech-specs). + +## General Requirements + +To use cluster peering features, make sure your Consul environment meets the following prerequisites: + +- Consul v1.14 or higher +- Consul on Kubernetes v1.0.0 or higher +- At least two Kubernetes clusters + +In addition, the following service mesh components are required in order to establish cluster peering connections: + +- [Helm](#helm-requirements) +- [Custom resource definitions (CRD)](#crd-requirements) +- [Mesh gateways](#mesh-gateway-requirements) +- [Exported services](#exported-service-requirements) +- [ACLs](#acl-requirements) + +## Helm requirements + + Mesh gateways are required when establishing cluster peering connections. The following values must be set in the Helm chart to enable mesh gateways: + +- [`global.tls.enabled = true`](/consul/docs/k8s/helm#v-global-tls-enabled) +- [`meshGateway.enabled = true`](/consul/docs/k8s/helm#v-meshgateway-enabled) + +Refer to the following example Helm configuration: + + + +```yaml +global: + name: consul + image: "hashicorp/consul:1.14.1" + peering: + enabled: true + tls: + enabled: true +meshGateway: + enabled: true +``` + + + +After mesh gateways are enabled in the Helm chart, you can separately [configure Mesh CRDs](#mesh-gateway-configuration-for-kubernetes). + +## CRD requirements + +You must create the following CRDs in order to establish a peering connection: + +- `PeeringAcceptor`: Generates a peering token and accepts an incoming peering connection. +- `PeeringDialer`: Uses a peering token to make an outbound peering connection with the cluster that generated the token. + +Refer to the following example CRDs: + + + + + +```yaml +apiVersion: consul.hashicorp.com/v1alpha1 +kind: PeeringAcceptor +metadata: + name: cluster-02 ## The name of the peer you want to connect to +spec: + peer: + secret: + name: "peering-token" + key: "data" + backend: "kubernetes" +``` + + + + + +```yaml +apiVersion: consul.hashicorp.com/v1alpha1 +kind: PeeringDialer +metadata: + name: cluster-01 ## The name of the peer you want to connect to +spec: + peer: + secret: + name: "peering-token" + key: "data" + backend: "kubernetes" +``` + + + + +## Mesh gateway requirements + +Mesh gateways are required for routing service mesh traffic between partitions with cluster peering connections. Consider the following general requirements for mesh gateways when using cluster peering: + +- A cluster requires a registered mesh gateway in order to export services to peers. +- For Enterprise, this mesh gateway must also be registered in the same partition as the exported services and their `exported-services` configuration entry. +- To use the `local` mesh gateway mode, you must register a mesh gateway in the importing cluster. + +In addition, you must define the `Proxy.Config` settings using opaque parameters compatible with your proxy. Refer to the [Gateway options](/consul/docs/connect/proxies/envoy#gateway-options) and [Escape-hatch Overrides](/consul/docs/connect/proxies/envoy#escape-hatch-overrides) documentation for additional Envoy proxy configuration information. + +### Mesh gateway modes + +By default, all cluster peering connections use mesh gateways in [remote mode](/consul/docs/connect/gateways/mesh-gateway/service-to-service-traffic-wan-datacenters#remote). Be aware of these additional requirements when changing a mesh gateway's mode. + +- For mesh gateways that connect peered clusters, you can set the `mode` as either `remote` or `local`. +- The `none` mode is invalid for mesh gateways with cluster peering connections. + +Refer to [mesh gateway modes](/consul/docs/connect/gateways/mesh-gateway#modes) for more information. + +### Mesh gateway configuration for Kubernetes + +Mesh gateways are required for cluster peering connections. Complete the following steps to add mesh gateways to your deployment so that you can establish cluster peering connections: + +1. In `cluster-01` create the `Mesh` custom resource with `peeringThroughMeshGateways` set to `true`. + + + + ```yaml + apiVersion: consul.hashicorp.com/v1alpha1 + kind: Mesh + metadata: + name: mesh + spec: + peering: + peerThroughMeshGateways: true + ``` + + + +1. Apply the mesh gateway to `cluster-01`. Replace `CLUSTER1_CONTEXT` to target the first Consul cluster. + + ```shell-session + $ kubectl --context $CLUSTER1_CONTEXT apply -f mesh.yaml + ``` + +1. Repeat the process to create and apply a mesh gateway with cluster peering enabled to `cluster-02`. Replace `CLUSTER2_CONTEXT` to target the second Consul cluster. + + + + ```yaml + apiVersion: consul.hashicorp.com/v1alpha1 + kind: Mesh + metadata: + name: mesh + spec: + peering: + peerThroughMeshGateways: true + ``` + + + + ```shell-session + $ kubectl --context $CLUSTER2_CONTEXT apply -f mesh.yaml + ``` + +## Exported service requirements + +The `exported-services` CRD is required in order for services to communicate across partitions with cluster peering connections. + +Refer to the [`exported-services` configuration entry](/consul/docs/connect/config-entries/exported-services) reference for more information. + +## ACL requirements + +If ACLs are enabled, you must add tokens to grant the following permissions: + +- Grant `service:write` permissions to services that define mesh gateways in their server definition. +- Grant `service:read` permissions for all services on the partition. +- Grant `mesh:write` permissions to the mesh gateways that participate in cluster peering connections. This permission allows a leaf certificate to be issued for mesh gateways to terminate TLS sessions for HTTP requests. \ No newline at end of file diff --git a/website/content/docs/k8s/connect/cluster-peering/usage/establish-peering.mdx b/website/content/docs/k8s/connect/cluster-peering/usage/establish-peering.mdx new file mode 100644 index 00000000000..71e0d46638e --- /dev/null +++ b/website/content/docs/k8s/connect/cluster-peering/usage/establish-peering.mdx @@ -0,0 +1,453 @@ +--- +layout: docs +page_title: Establish Cluster Peering Connections on Kubernetes +description: >- + To establish a cluster peering connection on Kubernetes, generate a peering token to establish communication. Then export services and authorize requests with service intentions. +--- + +# Establish cluster peering connections on Kubernetes + +This page details the process for establishing a cluster peering connection between services in a Consul on Kubernetes deployment. + +The overall process for establishing a cluster peering connection consists of the following steps: + +1. Create a peering token in one cluster. +1. Use the peering token to establish peering with a second cluster. +1. Export services between clusters. +1. Create intentions to authorize services for peers. + +Cluster peering between services cannot be established until all four steps are complete. + +For general guidance for establishing cluster peering connections, refer to [Establish cluster peering connections](/consul/docs/connect/cluster-peering/usage/establish-peering). + +## Prerequisites + +You must meet the following requirements to use Consul's cluster peering features with Kubernetes: + +- Consul v1.14.1 or higher +- Consul on Kubernetes v1.0.0 or higher +- At least two Kubernetes clusters + +In Consul on Kubernetes, peers identify each other using the `metadata.name` values you establish when creating the `PeeringAcceptor` and `PeeringDialer` CRDs. For additional information about requirements for cluster peering on Kubernetes deployments, refer to [Cluster peering on Kubernetes technical specifications](/consul/docs/k8s/connect/cluster-peering/tech-specs). + +### Assign cluster IDs to environmental variables + +After you provision a Kubernetes cluster and set up your kubeconfig file to manage access to multiple Kubernetes clusters, you can assign your clusters to environmental variables for future use. + +1. Get the context names for your Kubernetes clusters using one of these methods: + + - Run the `kubectl config current-context` command to get the context for the cluster you are currently in. + - Run the `kubectl config get-contexts` command to get all configured contexts in your kubeconfig file. + +1. Use the `kubectl` command to export the Kubernetes context names and then set them to variables. For more information on how to use kubeconfig and contexts, refer to the [Kubernetes docs on configuring access to multiple clusters](https://kubernetes.io/docs/tasks/access-application-cluster/configure-access-multiple-clusters/). + + ```shell-session + $ export CLUSTER1_CONTEXT= + $ export CLUSTER2_CONTEXT= + ``` + +### Update the Helm chart + +To use cluster peering with Consul on Kubernetes deployments, update the Helm chart with [the required values](/consul/docs/k8s/connect/cluster-peering/tech-specs#helm-requirements). After updating the Helm chart, you can use the `consul-k8s` CLI to apply `values.yaml` to each cluster. + +1. In `cluster-01`, run the following commands: + + ```shell-session + $ export HELM_RELEASE_NAME1=cluster-01 + ``` + + ```shell-session + $ helm install ${HELM_RELEASE_NAME1} hashicorp/consul --create-namespace --namespace consul --version "1.0.1" --values values.yaml --set global.datacenter=dc1 --kube-context $CLUSTER1_CONTEXT + ``` + +1. In `cluster-02`, run the following commands: + + ```shell-session + $ export HELM_RELEASE_NAME2=cluster-02 + ``` + + ```shell-session + $ helm install ${HELM_RELEASE_NAME2} hashicorp/consul --create-namespace --namespace consul --version "1.0.1" --values values.yaml --set global.datacenter=dc2 --kube-context $CLUSTER2_CONTEXT + ``` + +### Configure the mesh gateway mode for traffic between services + +In Kubernetes deployments, you can configure mesh gateways to use `local` mode so that a service dialing a service in a remote peer dials the remote mesh gateway instead of the local mesh gateway. To configure the mesh gateway mode so that this traffic always leaves through the local mesh gateway, you can use the `ProxyDefaults` CRD. + +1. In `cluster-01` apply the following `ProxyDefaults` CRD to configure the mesh gateway mode. + + + + ```yaml + apiVersion: consul.hashicorp.com/v1alpha1 + kind: ProxyDefaults + metadata: + name: global + spec: + meshGateway: + mode: local + ``` + + + + ```shell-session + $ kubectl --context $CLUSTER1_CONTEXT apply -f proxy-defaults.yaml + ``` + +1. In `cluster-02` apply the following `ProxyDefaults` CRD to configure the mesh gateway mode. + + + + ```yaml + apiVersion: consul.hashicorp.com/v1alpha1 + kind: ProxyDefaults + metadata: + name: global + spec: + meshGateway: + mode: local + ``` + + + + ```shell-session + $ kubectl --context $CLUSTER2_CONTEXT apply -f proxy-defaults.yaml + ``` + +## Create a peering token + +To begin the cluster peering process, generate a peering token in one of your clusters. The other cluster uses this token to establish the peering connection. + +Every time you generate a peering token, a single-use secret for establishing the secret is embedded in the token. Because regenerating a peering token invalidates the previously generated secret, you must use the most recently created token to establish peering connections. + +1. In `cluster-01`, create the `PeeringAcceptor` custom resource. To ensure cluster peering connections are secure, the `metadata.name` field cannot be duplicated. Refer to the peer by a specific name. + + + + ```yaml + apiVersion: consul.hashicorp.com/v1alpha1 + kind: PeeringAcceptor + metadata: + name: cluster-02 ## The name of the peer you want to connect to + spec: + peer: + secret: + name: "peering-token" + key: "data" + backend: "kubernetes" + ``` + + + +1. Apply the `PeeringAcceptor` resource to the first cluster. + + ```shell-session + $ kubectl --context $CLUSTER1_CONTEXT apply --filename acceptor.yaml + ``` + +1. Save your peering token so that you can export it to the other cluster. + + ```shell-session + $ kubectl --context $CLUSTER1_CONTEXT get secret peering-token --output yaml > peering-token.yaml + ``` + +## Establish a connection between clusters + +Next, use the peering token to establish a secure connection between the clusters. + +1. Apply the peering token to the second cluster. + + ```shell-session + $ kubectl --context $CLUSTER2_CONTEXT apply --filename peering-token.yaml + ``` + +1. In `cluster-02`, create the `PeeringDialer` custom resource. To ensure cluster peering connections are secure, the `metadata.name` field cannot be duplicated. Refer to the peer by a specific name. + + + + ```yaml + apiVersion: consul.hashicorp.com/v1alpha1 + kind: PeeringDialer + metadata: + name: cluster-01 ## The name of the peer you want to connect to + spec: + peer: + secret: + name: "peering-token" + key: "data" + backend: "kubernetes" + ``` + + + +1. Apply the `PeeringDialer` resource to the second cluster. + + ```shell-session + $ kubectl --context $CLUSTER2_CONTEXT apply --filename dialer.yaml + ``` + +## Export services between clusters + +After you establish a connection between the clusters, you need to create an `exported-services` CRD that defines the services that are available to another admin partition. + +While the CRD can target admin partitions either locally or remotely, clusters peering always exports services to remote admin partitions. Refer to [exported service consumers](/consul/docs/connect/config-entries/exported-services#consumers-1) for more information. + + +1. For the service in `cluster-02` that you want to export, add the `"consul.hashicorp.com/connect-inject": "true"` annotation to your service's pods prior to deploying. The annotation allows the workload to join the mesh. It is highlighted in the following example: + + + + ```yaml + # Service to expose backend + apiVersion: v1 + kind: Service + metadata: + name: backend + spec: + selector: + app: backend + ports: + - name: http + protocol: TCP + port: 80 + targetPort: 9090 + --- + apiVersion: v1 + kind: ServiceAccount + metadata: + name: backend + --- + # Deployment for backend + apiVersion: apps/v1 + kind: Deployment + metadata: + name: backend + labels: + app: backend + spec: + replicas: 1 + selector: + matchLabels: + app: backend + template: + metadata: + labels: + app: backend + annotations: + "consul.hashicorp.com/connect-inject": "true" + spec: + serviceAccountName: backend + containers: + - name: backend + image: nicholasjackson/fake-service:v0.22.4 + ports: + - containerPort: 9090 + env: + - name: "LISTEN_ADDR" + value: "0.0.0.0:9090" + - name: "NAME" + value: "backend" + - name: "MESSAGE" + value: "Response from backend" + ``` + + + +1. Deploy the `backend` service to the second cluster. + + ```shell-session + $ kubectl --context $CLUSTER2_CONTEXT apply --filename backend.yaml + ``` + +1. In `cluster-02`, create an `ExportedServices` custom resource. The name of the peer that consumes the service should be identical to the name set in the `PeeringDialer` CRD. + + + + ```yaml + apiVersion: consul.hashicorp.com/v1alpha1 + kind: ExportedServices + metadata: + name: default ## The name of the partition containing the service + spec: + services: + - name: backend ## The name of the service you want to export + consumers: + - peer: cluster-01 ## The name of the peer that receives the service + ``` + + + +1. Apply the `ExportedServices` resource to the second cluster. + + ```shell-session + $ kubectl --context $CLUSTER2_CONTEXT apply --filename exported-service.yaml + ``` + +## Authorize services for peers + +Before you can call services from peered clusters, you must set service intentions that authorize those clusters to use specific services. Consul prevents services from being exported to unauthorized clusters. + +1. Create service intentions for the second cluster. The name of the peer should match the name set in the `PeeringDialer` CRD. + + + + ```yaml + apiVersion: consul.hashicorp.com/v1alpha1 + kind: ServiceIntentions + metadata: + name: backend-deny + spec: + destination: + name: backend + sources: + - name: "*" + action: deny + - name: frontend + action: allow + peer: cluster-01 ## The peer of the source service + ``` + + + +1. Apply the intentions to the second cluster. + + + + ```shell-session + $ kubectl --context $CLUSTER2_CONTEXT apply --filename intention.yaml + ``` + + + +1. Add the `"consul.hashicorp.com/connect-inject": "true"` annotation to your service's pods before deploying the workload so that the services in `cluster-01` can dial `backend` in `cluster-02`. To dial the upstream service from an application, configure the application so that that requests are sent to the correct DNS name as specified in [Service Virtual IP Lookups](/consul/docs/discovery/dns#service-virtual-ip-lookups). In the following example, the annotation that allows the workload to join the mesh and the configuration provided to the workload that enables the workload to dial the upstream service using the correct DNS name is highlighted. [Service Virtual IP Lookups for Consul Enterprise](/consul/docs/discovery/dns#service-virtual-ip-lookups-for-consul-enterprise) details how you would similarly format a DNS name including partitions and namespaces. + + + + ```yaml + # Service to expose frontend + apiVersion: v1 + kind: Service + metadata: + name: frontend + spec: + selector: + app: frontend + ports: + - name: http + protocol: TCP + port: 9090 + targetPort: 9090 + --- + apiVersion: v1 + kind: ServiceAccount + metadata: + name: frontend + --- + apiVersion: apps/v1 + kind: Deployment + metadata: + name: frontend + labels: + app: frontend + spec: + replicas: 1 + selector: + matchLabels: + app: frontend + template: + metadata: + labels: + app: frontend + annotations: + "consul.hashicorp.com/connect-inject": "true" + spec: + serviceAccountName: frontend + containers: + - name: frontend + image: nicholasjackson/fake-service:v0.22.4 + securityContext: + capabilities: + add: ["NET_ADMIN"] + ports: + - containerPort: 9090 + env: + - name: "LISTEN_ADDR" + value: "0.0.0.0:9090" + - name: "UPSTREAM_URIS" + value: "http://backend.virtual.cluster-02.consul" + - name: "NAME" + value: "frontend" + - name: "MESSAGE" + value: "Hello World" + - name: "HTTP_CLIENT_KEEP_ALIVES" + value: "false" + ``` + + + +1. Apply the service file to the first cluster. + + ```shell-session + $ kubectl --context $CLUSTER1_CONTEXT apply --filename frontend.yaml + ``` + +1. Run the following command in `frontend` and then check the output to confirm that you peered your clusters successfully. + + ```shell-session + $ kubectl --context $CLUSTER1_CONTEXT exec -it $(kubectl --context $CLUSTER1_CONTEXT get pod -l app=frontend -o name) -- curl localhost:9090 + ``` + + + + ```json + { + "name": "frontend", + "uri": "/", + "type": "HTTP", + "ip_addresses": [ + "10.16.2.11" + ], + "start_time": "2022-08-26T23:40:01.167199", + "end_time": "2022-08-26T23:40:01.226951", + "duration": "59.752279ms", + "body": "Hello World", + "upstream_calls": { + "http://backend.virtual.cluster-02.consul": { + "name": "backend", + "uri": "http://backend.virtual.cluster-02.consul", + "type": "HTTP", + "ip_addresses": [ + "10.32.2.10" + ], + "start_time": "2022-08-26T23:40:01.223503", + "end_time": "2022-08-26T23:40:01.224653", + "duration": "1.149666ms", + "headers": { + "Content-Length": "266", + "Content-Type": "text/plain; charset=utf-8", + "Date": "Fri, 26 Aug 2022 23:40:01 GMT" + }, + "body": "Response from backend", + "code": 200 + } + }, + "code": 200 + } + ``` + + + +### Authorize service reads with ACLs + +If ACLs are enabled on a Consul cluster, sidecar proxies that access exported services as an upstream must have an ACL token that grants read access. + +Read access to all imported services is granted using either of the following rules associated with an ACL token: + +- `service:write` permissions for any service in the sidecar's partition. +- `service:read` and `node:read` for all services and nodes, respectively, in sidecar's namespace and partition. + +For Consul Enterprise, the permissions apply to all imported services in the service's partition. These permissions are satisfied when using a [service identity](/consul/docs/security/acl/acl-roles#service-identities). + +Refer to [Reading servers](/consul/docs/connect/config-entries/exported-services#reading-services) in the `exported-services` configuration entry documentation for example rules. + +For additional information about how to configure and use ACLs, refer to [ACLs system overview](/consul/docs/security/acl). \ No newline at end of file diff --git a/website/content/docs/k8s/connect/cluster-peering/usage/l7-traffic.mdx b/website/content/docs/k8s/connect/cluster-peering/usage/l7-traffic.mdx new file mode 100644 index 00000000000..956298fe3cd --- /dev/null +++ b/website/content/docs/k8s/connect/cluster-peering/usage/l7-traffic.mdx @@ -0,0 +1,75 @@ +--- +layout: docs +page_title: Manage L7 Traffic With Cluster Peering on Kubernetes +description: >- + Combine service resolver configurations with splitter and router configurations to manage L7 traffic in Consul on Kubernetes deployments with cluster peering connections. Learn how to define dynamic traffic rules to target peers for redirects in k8s. +--- + +# Manage L7 traffic with cluster peering on Kubernetes + +This usage topic describes how to configure the `service-resolver` custom resource definition (CRD) to set up and manage L7 traffic between services that have an existing cluster peering connection in Consul on Kubernetes deployments. + +For general guidance for managing L7 traffic with cluster peering, refer to [Manage L7 traffic with cluster peering](/consul/docs/connect/cluster-peering/usage/peering-traffic-management). + +## Service resolvers for redirects and failover + +When you use cluster peering to connect datacenters through their admin partitions, you can use [dynamic traffic management](/consul/docs/connect/l7-traffic) to configure your service mesh so that services automatically forward traffic to services hosted on peer clusters. + +However, the `service-splitter` and `service-router` CRDs do not natively support directly targeting a service instance hosted on a peer. Before you can split or route traffic to a service on a peer, you must define the service hosted on the peer as an upstream service by configuring a failover in a `service-resolver` CRD. Then, you can set up a redirect in a second service resolver to interact with the peer service by name. + +For more information about formatting, updating, and managing configuration entries in Consul, refer to [How to use configuration entries](/consul/docs/agent/config-entries). + +## Configure dynamic traffic between peers + +To configure L7 traffic management behavior in deployments with cluster peering connections, complete the following steps in order: + +1. Define the peer cluster as a failover target in the service resolver configuration. + + The following example updates the [`service-resolver` CRD](/consul/docs/connect/config-entries/) in `cluster-01` so that Consul redirects traffic intended for the `frontend` service to a backup instance in peer `cluster-02` when it detects multiple connection failures. + + ```yaml + apiVersion: consul.hashicorp.com/v1alpha1 + kind: ServiceResolver + metadata: + name: frontend + spec: + connectTimeout: 15s + failover: + '*': + targets: + - peer: 'cluster-02' + service: 'frontend' + namespace: 'default' + ``` + +1. Define the desired behavior in `service-splitter` or `service-router` CRD. + + The following example splits traffic evenly between `frontend` and `frontend-peer`: + + ```yaml + apiVersion: consul.hashicorp.com/v1alpha1 + kind: ServiceSplitter + metadata: + name: frontend + spec: + splits: + - weight: 50 + ## defaults to service with same name as configuration entry ("frontend") + - weight: 50 + service: frontend-peer + ``` + +1. Create a second `service-resolver` configuration entry on the local cluster that resolves the name of the peer service you used when splitting or routing the traffic. + + The following example uses the name `frontend-peer` to define a redirect targeting the `frontend` service on the peer `cluster-02`: + + ```yaml + apiVersion: consul.hashicorp.com/v1alpha1 + kind: ServiceResolver + metadata: + name: frontend-peer + spec: + redirect: + peer: 'cluster-02' + service: 'frontend' + ``` \ No newline at end of file diff --git a/website/content/docs/k8s/connect/cluster-peering/usage/manage-peering.mdx b/website/content/docs/k8s/connect/cluster-peering/usage/manage-peering.mdx new file mode 100644 index 00000000000..bc622fe15d3 --- /dev/null +++ b/website/content/docs/k8s/connect/cluster-peering/usage/manage-peering.mdx @@ -0,0 +1,121 @@ +--- +layout: docs +page_title: Manage Cluster Peering Connections on Kubernetes +description: >- + Learn how to list, read, and delete cluster peering connections using Consul on Kubernetes. You can also reset cluster peering connections on k8s deployments. +--- + +# Manage cluster peering connections on Kubernetes + +This usage topic describes how to manage cluster peering connections on Kubernetes deployments. + +After you establish a cluster peering connection, you can get a list of all active peering connections, read a specific peering connection's information, and delete peering connections. + +For general guidance for managing cluster peering connections, refer to [Manage L7 traffic with cluster peering](/consul/docs/connect/cluster-peering/usage/peering-traffic-management). + +## Reset a peering connection + +To reset the cluster peering connection, you need to generate a new peering token from the cluster where you created the `PeeringAcceptor` CRD. The only way to create or set a new peering token is to manually adjust the value of the annotation `consul.hashicorp.com/peering-version`. Creating a new token causes the previous token to expire. + +1. In the `PeeringAcceptor` CRD, add the annotation `consul.hashicorp.com/peering-version`. If the annotation already exists, update its value to a higher version. + + + + ```yaml + apiVersion: consul.hashicorp.com/v1alpha1 + kind: PeeringAcceptor + metadata: + name: cluster-02 + annotations: + consul.hashicorp.com/peering-version: "1" ## The peering version you want to set, must be in quotes + spec: + peer: + secret: + name: "peering-token" + key: "data" + backend: "kubernetes" + ``` + + + +1. After updating `PeeringAcceptor`, repeat all of the steps to [establish a new peering connection](/consul/docs/k8s/connect/cluster-peering/usage/establish-peering). + +## List all peering connections + +In Consul on Kubernetes deployments, you can list all active peering connections in a cluster using the Consul CLI. + +1. If necessary, [configure your CLI to interact with the Consul cluster](/consul/tutorials/get-started-kubernetes/kubernetes-gs-deploy#configure-your-cli-to-interact-with-consul-cluster). + +1. Run the [`consul peering list` CLI command](/consul/commands/peering/list). + + ```shell-session + $ consul peering list + Name State Imported Svcs Exported Svcs Meta + cluster-02 ACTIVE 0 2 env=production + cluster-03 PENDING 0 0 + ``` + +## Read a peering connection + +In Consul on Kubernetes deployments, you can get information about individual peering connections between clusters using the Consul CLI. + +1. If necessary, [configure your CLI to interact with the Consul cluster](/consul/tutorials/get-started-kubernetes/kubernetes-gs-deploy#configure-your-cli-to-interact-with-consul-cluster). + +1. Run the [`consul peering read` CLI command](/consul/commands/peering/read). + + ```shell-session + $ consul peering read -name cluster-02 + Name: cluster-02 + ID: 3b001063-8079-b1a6-764c-738af5a39a97 + State: ACTIVE + Meta: + env=production + + Peer ID: e83a315c-027e-bcb1-7c0c-a46650904a05 + Peer Server Name: server.dc1.consul + Peer CA Pems: 0 + Peer Server Addresses: + 10.0.0.1:8300 + + Imported Services: 0 + Exported Services: 2 + + Create Index: 89 + Modify Index: 89 + ``` + +## Delete peering connections + +To end a peering connection in Kubernetes deployments, delete both the `PeeringAcceptor` and `PeeringDialer` resources. + +1. Delete the `PeeringDialer` resource from the second cluster. + + ```shell-session + $ kubectl --context $CLUSTER2_CONTEXT delete --filename dialer.yaml + ``` + +1. Delete the `PeeringAcceptor` resource from the first cluster. + + ```shell-session + $ kubectl --context $CLUSTER1_CONTEXT delete --filename acceptor.yaml + ```` + +To confirm that you deleted your peering connection in `cluster-01`, query the the `/health` HTTP endpoint: + +1. Exec into the server pod for the first cluster. + + ```shell-session + $ kubectl exec -it consul-server-0 --context $CLUSTER1_CONTEXT -- /bin/sh + ``` + +1. If you've enabled ACLs, export an ACL token to access the `/health` HTP endpoint for services. The bootstrap token may be used if an ACL token is not already provisioned. + + ```shell-session + $ export CONSUL_HTTP_TOKEN= + ``` + +1. Query the the `/health` HTTP endpoint. Peered services with deleted connections should no longe appear. + + ```shell-session + $ curl "localhost:8500/v1/health/connect/backend?peer=cluster-02" + ``` \ No newline at end of file diff --git a/website/data/docs-nav-data.json b/website/data/docs-nav-data.json index 77acac9792b..ff88f64d16d 100644 --- a/website/data/docs-nav-data.json +++ b/website/data/docs-nav-data.json @@ -527,10 +527,6 @@ { "title": "Enabling Peering Control Plane Traffic", "path": "connect/gateways/mesh-gateway/peering-via-mesh-gateways" - }, - { - "title": "Enabling Service-to-service Traffic Across Peered Clusters", - "path": "connect/gateways/mesh-gateway/service-to-service-traffic-peers" } ] }, @@ -548,16 +544,29 @@ "title": "Cluster Peering", "routes": [ { - "title": "What is Cluster Peering?", + "title": "Overview", "path": "connect/cluster-peering" }, { - "title": "Create and Manage Peering Connections", - "path": "connect/cluster-peering/create-manage-peering" + "title": "Technical Specifications", + "path": "connect/cluster-peering/tech-specs" }, { - "title": "Cluster Peering on Kubernetes", - "path": "connect/cluster-peering/k8s" + "title": "Usage", + "routes": [ + { + "title": "Establish Cluster Peering Connections", + "path": "connect/cluster-peering/usage/establish-cluster-peering" + }, + { + "title": "Manage Cluster Peering Connections", + "path": "connect/cluster-peering/usage/manage-connections" + }, + { + "title": "Manage L7 Traffic With Cluster Peering", + "path": "connect/cluster-peering/usage/peering-traffic-management" + } + ] } ] }, @@ -1006,6 +1015,36 @@ "title": "Admin Partitions", "href": "/docs/enterprise/admin-partitions" }, + { + "title": "Cluster Peering", + "routes": [ + { + "title": "Overview", + "href": "/docs/connect/cluster-peering" + }, + { + "title": "Technical Specifications", + "path": "k8s/connect/cluster-peering/tech-specs" + }, + { + "title": "Usage", + "routes": [ + { + "title": "Establish Cluster Peering Connections", + "path": "k8s/connect/cluster-peering/usage/establish-peering" + }, + { + "title": "Manage Cluster Peering Connections", + "path": "k8s/connect/cluster-peering/usage/manage-peering" + }, + { + "title": "Manage L7 Traffic With Cluster Peering", + "path": "k8s/connect/cluster-peering/usage/l7-traffic" + } + ] + } + ] + }, { "title": "Transparent Proxy", "href": "/docs/connect/transparent-proxy" diff --git a/website/public/img/cluster-peering-diagram.png b/website/public/img/cluster-peering-diagram.png new file mode 100644 index 0000000000000000000000000000000000000000..d00aa3eb0f3bbad88b0e13d6d905fbc346f2cab7 GIT binary patch literal 129219 zcmeFZXIN9+);3BI{&_p>&nU^S#xF1F~=NZ-1iuBg=?rOQjjr|;o;#?C_Q_k ziHAobi-$+}<_Zb!lXF#c7VZt-T~qNfUTOc$4ctFIR{BcTs;YQAxbrJ`MEJ~j#Fv-g zUO;@7f1NAf-^U~T{W$?1UYH#o(O=i7;odL*KH^@NZT`FyX5#;KHSV)ag1@gOkyI#;a!>dFF$fcTO6N&LuV)6P4+)_$fP%snFAVtsS7Ky(fIXhdDa zY5I}FY<)#Z-JDEa zU6(;1SC-;*B^IOV%q{xk*9uoA<1cTxXA*i%23x_cm3J3D6fL=9J7MCT?o`z$qO>M7 z=(&|=bWf!0_Q2t2p%$W|i>(UKde#O+uHQ)og8V+N?ZBI6ZrG%mr%QTAuSCTb z-NCI<+5Q#wzzg%Po9>Y<=c}nVR`kupVq`G&V})8=*(=bI$Mo0nl#XTtv1mlUUAQ%E94r8~Ko0p#do& z^t)sua{`^jZ(e9Hw4SfB z%=quNIL$Ttu6(>BVql2hqBrfgRT4Vxpjl!xv}W+u-+S6FKmHrlidIR*tk;awNm(G8 zSEn}F^eaKKcYwxMQiC4`dPblwR`0aFG;tv>rWU{BhY5pv!a}*~!1E60`b83>@|SY; zv!GKrqqdyn`Ep#l-L+*?*&z>51Mdd8mJT`W;y}fy@|BXK4LPGgb#}BwPb(JV?=YOB z^8dq_(%*9()6paDqkVchftymvy|09!rvgsX)fFx< zw8;Hj8S}O`u7WM0;+V4~#FPz$B46;MKfbVcE`wTtrn_ObLR6)=`|6p}w|qaN`mpWkBus_k%k>*Vq4H%}B+@@}R zc{(x%hS$Gdy0{Nf6ti%M{l?~z=Bc6fivfjLPwF4f zWe4;y1}dj@9_-1!iNmZfmG+GlB?5j&nr!H3grqO!6H^K?!Dt`Zsxz zQZoA;v|dL;iecxPu-5i>6jcgQ%)}!M{DyQ#Ml^jWdOc%vJu{GJy_zq@&kSkF`_D{F zX9iw1`6V6%Hu%J(cLRAXlS4}Ivx=OMTJdV4tLKT+H4b{Kc<*n=`WdjP7EydUtAr2e zaVY>=jx-026CruiBuJI<*ckAGBl#=<0F6GGagoc1Z`MC!_1;psWxy=vnu)$R99ZP5 ziOmoDVw2(93B1^AU+8s0)J%xfpz`md8H^mS3$UMP7tB& zE$vh?vyC1bG$!|$T93z#EX}CNWbbkkgG@okW3H9aO0jDnlqD!ZLxCq#HnnRR{?nxF z0n|IlL?h=43>uXReiPq=k_wZIzE+Soh}wm*Cu?Ft8x`ns?)>qzA60_=jyH*^9u%1r zYTDtVxgVyor)wB-6$qK%$KOl1s4OUiot_>~d@ar0;u}?q(2J3$6wHtAdl8Iw*CLY# zn;2SD4mP4h=dKXk0ZSnZIlC33Z{BFeGD~_n?x`sNj*k0_T;^L7^?&GZ@nq6aR2I-P zv;efKj6zANC{N0~CH&TMQYeewX8Di2QhKYdBmcAy;?U#=$o3Ai7cc>7**1myJ`2F+ zVZgMg#IfBP!=U}brx6Ttzzd(J0h`hpbAX}|p6v4Q-Y(=W?-;k_v49nxd713XoA77%hwikZb}VZ2R|g<2sGTO4VW41j zDR{ZGX-7g5Q9TmU-<~Z)Kt{H)_%r_%KDADGBuPxa*is}JMbKIEMuhwe%LKzcC0{)R zH9H>nz~T03G5~UZuq$LH^@H>>jFjCVrqhU-BP}3&ir!e%qIytbR3|V#`fB5}jroc; z0AJc@;|6cV6ucm0r^|gmk`~U{{@azD^J}~q*yG_l$2p&l2S=q`27B#*92D?)B9n3u zq&&X)rnbcUF`#)b#EkDu+l(HQ>%BYIg1|YBYa!Q%-j0SmJA!|*Cs}XR!jD^zaA;ZA zlU?2KVy7a&510F(0%&>U17m>KzSHs13r@xvdr{k8DqUH4@6^M0=WF3!GZy&NEuxXD zuR|$B3ij~cA3*)zs0cK4kX&PWX-_c6MNAujmm@V$HE;H7OoHpvt%3K56%BDLf?r2a8_U?k8$GLV{#|gKJ2r%Cx(+GIJ(>g1 zs{s^bMye0Fv#^d|7^mC7%3eV}^i#0|r9`%xc3Z3B)Fik?_>=DV*^W~QUi}@@23L}; zV;%z>j~6ynpwMJC9dkWy*)bvmr<$>0;G-mAs^S<~9qPf*QUdls^s!#?Xvt3BaawMm zN~^&e+u)oc*X^5xzx4of<%yXluby9B{xs#id%~f)Fl{CLYxH#ElHWa)h_#OA6oj7~ zIrHfFtt9A$v^5STbq-nSG|9j9-ECOQa6Mr4p1n>EUVmGcg4E2&QvJlMk=e?1WKggx zGNzq8#|sCe5R3b~gUedJxM87RLHu;}afT?=z>hJp_}rMDCWfAEtMQSx_ zuq87CdQlZ$sxl9&PFWv@gt%=6=2wOa+fn7bNfuW53}LMDlrIf4cxsSv^w^j&T;lO? zdx`T;dOYq?zx(dg8;b2*=pWD1C4_B(4%5|kCu4eM-&;TK zG#~aauxFXIQp@O+JWP3o(DF^Qfg!XZNYU(1ghMiDytqF>%zYw!xJ|(ZVN0e?IR9AD zC}9+MKHg)bl)1dooapnaP%J}KmgK!3MalUTGm&G2xrNwMYB z@32oaloL*y8WXtwCCma1DVp+z9QhZu^wV z?Af+ch+a!^&_uoUW75=w&>ITutNdJhiXZ7c4-(xze6^PDO$mOG#Y*z@PAl@;dyrM!H6e!UM56Nh|hV${^nyWu6NtP%=O>u*y$wBei3= zC7+C`;A5dZmm(@oWCj)_=F%C-AJjCRz{Ab_ zQHZhXeVwF*FoC<+l?_0Vv9_=#MU-vhUK@G)LKvhJz$*8Li-Qq*Aw>in^k$U)>KA)xV@ zfQ|u%4MmnAbXi4o}6+iafR7$OR4h&KtXQ_V%?>(C~y1hvGZjHl4Y32-b?`qaF z$4}2OuMVV#n7DB-ou#7glFgz^I`R1@BMdQdkH_Lt#3 z(;k!a{80M7JcRWUIPTqxKU-lkDhyJfnGug{TtiARQj;4z{Y_uRk7*F_j9-TU`>9w=RodxB3L#P0TwPzBlhr-4qUPUf)~(PF>dBrPrtq!#Hq ztMS!-T!1-9lf40+dVK!;8b_g%6~qmcf%ZCo@<(VA15gk4eZjB%UMs% zJ-t>Y$@OHhlmR7&;Zp(ij#Xajj3VD*jYBJNGMpUG916#veU1)4@RnWyyOgz@ z7#h{PntSMKe8S*>stB5!U3AtpG~ILDpu&pG>23ui#x}4Mr+z9++0EPwbo@6?O5TlFve`Y0;Xi~XU2E=M(^;#_ugN> z6Vj@ag~JA0+7XXV=K}*Pyz@3{bxhVa49BYy02+Dzy^ocA8S#cxeCMIf)7^&!ZwXR* z1B#LhI-X7Az+ajdV|y4?U5D)!4&*ZyXM?q~SPP*_CE8~3t^AK+Rkj`D>b>9d53>7n zkJ|ITCP|R$t!c0I2WSI-vmYiZ&y@@b^XXD}{$W9X64hzrMb{eMulK=LdmPX;QNqar9FA zeCex(amk!6_CP5S6|~)1{N$|9FMk18n!O^DfFNZ&TaikJHy^@tr5Gc7*rh3rNdOPwmMfyGNn65q-^ zm9y_rh5!r8BH`ZiaO=L56|T1svQ4Nd_gN zPbxy6=d3rj-p}T)$R5VgoIGhIhIfX3;6S693-Z>XlfdTZY#E-#4=ax{r@4nHH|g=m zs1kAPi?B?!zfPITHlE6eJ1C<@mF91CrqhVBfEyKEZcX7Z2)pl)jrImoDNW7v?WacvxI))MyMrY_V>7s240(l{n z(nlIi+m*c`{xYgseGzjl{-pRnnym;LBNPtgp zL)yxs=h#F&ho#bOuBM!XM$QdZjvyzQIGIy<<7IG~=FaVjHSv{b&7Vx-Zm+h*j6J{7 zsXV;#2l%zoy1sP`K|O~%G?MnUN#eOh$|e$&s<$jmdlP$A&JsZX5H%Wt1S5H>yl#LW zmb;t}edm9rwDP$1>C^Y-_;;H)8kOR?4heSMq}^8B&CZ&Et)@6w%(x1RSsa=~#ZLyv zWO=I%A?m>oE{bpKxr&Pn5Q}|?FT<^erga>o6>$3&IT^rMaCO2Ht<$k;$LS^7atx@$6luW3VcJSb>mZOU!{%je0-Mc*&$xse6*m6>8?{wER@>hXA)F#Si>-Ov~`T!>Wh?>MngL<=ZQMp`zxv)#Z=W3^8lSTVqM5?du z^$&cnFJj#!Hv%Qzm1IE3I}sOgm#!zl@_4bhq(gYkoq`Qz`=u8%s@qZyE3+R^FyrG; zoOiC9!r2iAd#&NIU)+L(4N?R5b|Q)YpyUFa7hrSW|Mh)r`-k}KCJ(ifZtd%(&as5x zC56i{?>@&R)tHL~Oe2?AFqtdiHvY?0kfSk1naTKC{AbsO_+S zwKKet7^OL4)M|IU{?Lk5*NmN~92(Mt1Fp{-#anurAG{2b#>FS!3B>Ka;A0QC8K^ZE zf7w7liRrK&*5vOx+9n#U zOT&uNx2*kic35fBr5Jn8J#X@=)w9J_Z#YRFx9WtI2p6S@A7Z7Pv|N$COW9soy-2W2tF0`;getYi(2yo}@Qzrj?{ zlEbLw099XFycY>~C#>}sa#G#lIe!r$zcbQ562AUS778U`6IZBjh ze>4bpXOpkVECU|H&kgseJW@E$oUP3ZLRS*saHL@b-5+^7nx* zD=3gjr%>u|A9;D_2D&|b>f`d*fww=e1T7yFSMmR=dzS{7gNo>gqtW8~2M(@LyzWri z#|(e}Trdyk0wIS4AFga*d)ZCwk9GLd*GoI`kF$^S1h}@lhw?jrxBYF}|NX#0jw?Vg z$gCjyx2FGor{y|aeZd7#W|{Ke+x|vYe;+ETIq*IaGeiH;fq%aXjtvHrQ~%!%{r@1L z;Aw;6cAjpc4DfCZxzs%#`m7l%C=VJEi$-sR_sUm;Hy!i;0nOtAfJjb*YBqHf~H#a^n=7f@YcaW_g@ ze4D@>biGu482NHf)#mj#J_sO9h^lkKwa5^ z9^(n*1cDo{HZQ*ODs*gP z_2u>ZoYY52XWr~`->o0w|7+<4h1_28r@$?QwmK531A~HpEj?{Td|`k2$9Tb;yyYRg zL7V;u;%Vjy3r@Y40Z*Y@2rXCcC8rw~C@A%7# zd`ytlSjY&uV=$FaO@sgO)0@vRe^2P2n``*tPk7({ha`pY$)c@RwWo2NjMt4^`OQQ9 zkMU8a%cQmpf5P`KyYPglK%D*Ck0}oPk7+L|Z~dDE{M)YlY5s!|XQs~GIRB)T{=FCf zy4~{gAiQV&_ox0_1=DhbEFz%$%K86PG5s)pnGg4>fnhFqjTf^Q+4ZyEMYX;D_u``9 zO+MGD1ieY#vQ`F~S)m1its2z<*RaYSm0D=BwFOvXPH2-*iYHx>zP-JH{DCcHUIPYi=uFA)!w~GT;so76N9Jv zQU~JR7yH|N#bVpajP|5g=(NpfoH6R90bG@ACBakgz1wH9wgZ&~X>_PBS9 zbnzicdi!gNpK0Q~rXaL1%Kk`CE{=KPfEb-j4%g0uB^_o9UOW0mT?;tBmn!z! zLJa+LM6FK3bMy1b>7HfG)MuB@$=6+MmNw~Nh5F}8gyf8T)f00!Ey}2T;hbnB6bkto5=6%?dhKjg51QR=w(`@oqJ(jfH^i?*K8Ax@JzoGo2;gU%@DYwSJcA zB`ms373<(v4o+|MMEulJS7|IU_NAkzpQ;*=abX7^#eyU@wH$U!Q=>$ue^5?(%WUDG zX#FmG7xq=CneRO&NZm_0F%v>>3Z|FGv*!gm(8P35XYyk6Q*y>>7WsLvEsEN3*oB1_ z7z3|H?XQdd$p z-RbAl66J}QzGqkJ(sW39*!R8Gq@{!vy#A%uXWznqwP9`hZIWrV66|?pocgv4IUH1_ z&f>XY-*mjOq}V>d9*7(wfg$b1TBq_-r~4(*cWzF|iVR$VL^E5p%iO%~Y=Z@zR7JB& zPM*pHxOmTdLqNYWjK&e8-5KCtu*HY>DCinE-4p|kzDRZ^Js-G^tAR2qSKb;gQSGX0 z^2aGb7i*|ZqxQ_O&oCH3 z^OSH(YAf%+r&oHS`EaM{q_tNo^c{s$Rg`E2PQWv*{x}7*Y3$!=#kRh@zy+6A^Boq> z8A+!_OS#Q++bP9I$Mv(F9`He9WLWJ0*KXQc!q{!%;6hr6lp4npTv^zRb!wv(YU&*e zC#*GuVh`5LP_W2WA8~Li45|1CR|mtvn?5VEjspQJ^0l8<&A+#OSIQT9@}1+3q( zhiJJOQMR!CX!(36*3oIEwE5O($Cuq}RoO8z{g}@ZV`Vg`+4^3ElMhV|xcqO8<;bb{ z%Rv7zVxEAM{jNt^HXf%JAg!Veo2G>>e$lyQMkQ1s3!()s!g!Ymk48^o=dstB)p7@3#CjO0 zjsn>N*Ucr1=f7|#ac@O3dv57R877$R`}C)Yi%b#s#y5H_;^!5wB^)0b$;S9zGUyMd z`lXvi?S^yOgqkgeXsRxJW{dYMZNh$gq}Rcfb4mSPr>_}JJz}MgChzQ1V5Rfcl2V<| z>eAg;4Zg2V*v&q;7UWoUJT9{SmeC19cp4)eXyQMnMBASEZqO&q zz+6m^XCLlOtyuu(t3V3%=u$~UbD$~H&Kmz|p8T%C-OtrePx-fV*D~sA#*Kw)-)A@h8jon2`c`-i{LWfQ9n;9^ zW<6#~7Pp78fmCF#-_p*?)($j=v$-@z|5R+?7_!ncqlX8G1^kRvoCXo@TqT?4#vAi1 z(HW>%e0-HKTOojsP9zofvK8UICnvIjYeziE14%!__yIl=4b_jw!t8*9Wrk`~E3`<>(^F2BLnRNG^ZX-^)HEVbMQzhKGJS z1A7bE4AdfwH<;n?6-Ky9zPuaFcya#YKawXaQE47o>ye!gw z)e2g9{<}@03>VKDUVgf<8@LyYsMVX--;)<+^K%?(m$*x0%J#ZO#kuu3aZ*>Cxxi)@ z@rgvHI@1|kH{;8N@*VD&^b5b!a5U+U1;ydMP*2d7T-vVMX4G@fuD0u+Z5a2@XSMtm zQ(LM#JZ|JJ;m|F|uI*`#4K`f*F(kU)VM1(jZ0C^EHfY{59Im%vK3(rrBe|Yxg zZL~~7poTxE@vUxI0f;96w%LOd7Xm4$7iuPaQKh7K6Xd~n_QmENanE#p%EO@?f`Fuk zfRAMAxDaPCUC8ZsD)gfwfqh7~UcPQE8))GcY6n{8G#bV}m1Z}Bcw-q&?k?$#F=jd1 z>{*R?^rG)Uy3YZwp087f28)DZtss=x9}3N=jC62M;bMe6VyQz*T?BrSuY4-y8pxD6 zSlj5aj2HD5&zxBnO5{K6@M(^OWw2~ znONZ)gQ9qc7A8n~F#THqVT=BZJ`vLl13TS`- z$4g|LS;;loC^yx3RrH}c?1m&}(lXRgn!Od(+9ZOl4BKgvNy{hw7RCm8bkpV^;b*Y% z)%fF9Z2)X69;(iR!1lAaOie&Q<`bsA2{qortf0nuVd7%zRL$H0Aa>RiY^5RAlny=5 zTn%O!g}NxRUZ)~z#;m3;x-m0JdKqsU{8}KSykfuQU|I^fUfPOjeDE<_HX_B((4nNJ z8cH(~5o%UDZ%nHOL@cDdN21r1M5b9$dfC9LG9a37{GdOq)R%WGWp9Ibg71J9i-NFI z0I|Mv=il6mGQ^$F2cq%}*JRYwn2b0jK5f~UNDCD{z&Reu@;Wni3#wW7vciP7wwid# zN&`xmWIIT!zanD=>23=kZDK6_wBc~I(~x(t=7H5PK;&2Y>2u*@*iCUBFK0K+lT$+E(adjs9185 z;+YDq2QZZ+3MYV`(DKVVSTF#_^ju5JlpTB#d+dg2=Tzy*M~e7ve+x5qwMIYi`Q$jY z{%CBD>13z8TnS1d;PX1T>3YnGq}vZU(y7;6=}dl5-H4O?fGvgNqBlGv_J-T+k~?%e z)-$FvB*NY#7ofwN{qL_WPs@u=`2}gg?ko2U9IW)JQb_|rhY0U)nbDqT&k6E(TlJP7 z^3=AxDmkO{gkK*PI&g`lOgDnn0z7dciv6_U4*qVOxEOJZ9|2s`>(*8^pb0*afypjvO;{5XSCf zW8;lF(3i$ot$C&)&h*iw#Ri*n*8V{Fu^f{sDI!oqEM?1vXhn;7Ame;qt2W(VVd(IA zo*gdHwkQ-g-msk&5sKkPBR3s1gl`7KedTdIPKWl*L)Us%6I|Xu+RybI9X&`W{g|kp z>QrkmXtVe&EZ6z5=)^#ypYHh?da+_PQPOLjx;lR0a0PW|s46@YUbVJ+kt zIHOZBiiw_gaPo(6;7w58G_H1F+nRANwoskc82?*G>qE2@@K7t$8f+b5{8yfViNHZo znT5NH^kmBh`x@<3aN~Z4vUaOCzX zY3M+=7H3zd&luLNZP7)VHZde`?zHTZ#kXiWw;o` zcukgi|Fj;;dMe_A>1m~=J&d!Ln%=HTe4!c#Kiy&R@Q^|8wnf;~C*HU?YzAHh=M4Xx z-$)LlIy`0iapMmMnZW7VVIDRUxAVOMX0FXnlT=UHdYqqX0e^ow<;%F$w3bovRW6p- z>TrtD?9I99g7df^qFP>zjrD!)P!Z#qy?mWroR1O%e_7FxBKzwn9%HWcmR*!`B@wZK z6J%$YF!t>(2>6=)%WI(1bPoL`#vSj4qSZ36YwsCe$SRdP>zC76^Rf1~W{O?3s`J=0 zEssYc#dz|e@1V%c_kBNIpMXAJ>@A(19M{cH-_<)tDo(^+*py0~t_#lR%(e~C>I#E$ z-_~vq-Px$z+|y8XFYK=D&}L&xAK&;~&%zjF$S>lw8hN8)|G9z}+$xDfb~#mbM7U_! z9XS&EJZ1-85@V$BEwQ9-mM2cN^4dRG*<6PEy`T--i6e(ctOyC>GLt5sD65vym^`J@ z8`;``q5-kv(e z$x`wi0wfnSOlTRk-_9o_|uaZ4EUz_MaK)DxW^3|!hpkK{+^@8{X3lqPKly+is z%pj_1RxA6(O&Gr|hMAayOv9a_)z;PiWJZTunUl&_X~*4bw(7RVdfx?}nTxIQ>&?gq zDzntD=6HLdn~$b^^|q?E1iq7%zU3ACIDuo)4v z`Fg^ToZJqE?oq(m(b)$poG0_%Sbe-F!Z+yfUU1w^p`6Bkb*+}lxZdbe z>sya@B*_3_#G5el*b2c?JLoH=0Z?}chmg(BNPgT_mHmY?W=UKlBWmGe^`Q@F&8aRbRD&-GrR;cp#dfiSM^o;3Oy;qO zCh&CMLtRD3f~S$<-9I?VXZJoLKz2~w63cX_Q#go9j|}Eq1b;J$wgTm zeuRn@bE#4l^#naBc94l?XaDI37bcaO@QjzX-78v+INq*ZqLh3CP3#hC+bp$~ueA%> zayTe<9|$igwbX>Mvp5e!DOLV|vC`E>tX=$n=1TIW}bNJ%;+!vtGcsHw@&oyhjykJ>mA5SVX6v zpm1I-{xEt<>W_)gQIbs`MpU;)e}hPjXbI`;)+hDV&An~{oee22egPhDSBWe{ONKJv zMBrd*ajDUOXArtgXy8q+m5>J18VT|AJj*K@#ep)p^7HEgW`t&bLkxWS)H`bF?-k>a z8}IWncJj`{71<)xc#d65QocirZ7O49famuaF7(T^xcr^=cxz4beLQWCTR!pCILr%( z`0nwR5!ZNRfr@Q|V-&$O&tv#6PM`Vu+?`P`%`ZeYWBMggX_-Q2v5@HME)2@d|0ukx z-30x}{IQ1odm7bSSO2j!Q=H*G0<^K3>SzxEVGKS;u#~~(B)rv3Lhl$q=#y0fjKoM> zTxq&6(<3#~uvrFBF+0l7`3cSbGABKa7@HJ`v3ZkHQ|WK5$xF0m>I(j>cPuP6d2Cbx zbx0IX*xFETbtf+V^*wDlApsl9V;=%b4Roq`y1z=vY#o=Vmaj&YEmZ><9Os>7f_M zOl@64ol>37K-WaPPHxzcEH!S-c$c*}?MfpJ*HlF-ua>sx+#4f12OTUgj88jrb%;!^4nn|XXQ9+S7wZFujUH~Ym<#jaYLc>XbP zFRCu#^8RT=XsW;PQ0~zVYL|L*uB$Irf0Nttn? z>GRU58YS2TGv9cQ(jEWh;II&LX(Fc?hnWTSb}Ff6w?=EV=eCmK`oY+LM6((sm(i?q zvr_Z<>|!akUM1cS+|DPfT?#XUK@|h(lXc5s5#Q7uSDZ1Ne}I>@GCEs9a0|%l^A!Vr zaP~9b=8d3bYt%7LyZzZzuYvE6%wr!2cwHNcZEf1Mqmn*(CbrSmD^T%m0LFB(R6t>wQ^4awA1W6^um8ToNK%0mVBFC-JC~UjW;@@z^*u|(Tf5z?yjoJ z4*of`_;3je7NO#L@bQ#D_z)QOiuyOfA1p<$@zHX-es}x39Dq1b^kQxPJF-i^Ho&0x z-PPE#K$@9n&r)fywyAe8VALj+~TI?;-WF+;_JbUS3OJz>W$u^5e z5TfqO*9i4SapyUyx#a|9MU&V2_rS54hcK10`q=>4CqfJY`nHS>slP^M_s;^xp++Y_ zzP5CXboufwM>Rv-Tx_#gT50f>iCu;XYR9~8)(eV0{1j1w z<2Wqt{j?x&iVZjz+iXb}s3t-i2j^_zYFQbx{7F z^d2s8D?r@iW>!RC?6-5U(G~%ybm@%T&&F{H-qTJKdj_vQZY@19!PQqL#6=cpOm~`y zkgYv|B&R&Gw`i%G0jA{#2ly%IH+xup6NY@-5c-AYuy3??mS?P!`}H0T~V=2Kac8x!0LlzZ4!x>Y``TVbPfBTyYhD?%YU*>%&3o*r<8c`TJr%e zS7Jk~dap42Zte`}Ed8UWV^ubQiTrL0J=TjT{gMcT-!WOrG#NwxB35L^qiS-z^tI@` z=hk=)uKaX%6tgY4+hU1T8IGKMtVdzo%Y7_)_HqsFQ>?XTzFXfaI15qVTzZ8(vNJz? z1#ZOtWQQDMO}^viLGBJ1mVlXZLXyLs(Yl8*vv-}m<>*}RErDkYn}AIN@< z-I)vGm4c|6Fs*$#^q581UVBf9v9IYJBgQ1otlfTi3$m8(f^9wLj3U`+dcCyW#Nxb{ zohPeNx06abL&c>)!n0%`T8VPi0A)Oh%V0dt|N7$xmBOUgPO|a9hgSMvmD1+6PW7`X zFWf#42Ypzu!)>2egG9O>EG>0#0f`=0eB2WZxP#)JF#L`J4)hj=BLpf0=c8+q%nYXD z6H@d(i15<)H53ibA&}Vjd8rssHf{^=3`t94rIz$@*M84d*;B@=@8~aluq9u{B~-&e z-*uG*zsv`dGG1=e%KC^f#D4hAhIuWgrSM?Zj{@t{voyC<{c1B^zdPDl1r2hTQb z%k>5_%pp8Q8?HkuN#DJ4S@w|>o8Rq!{Y()T;=|9g^gSG#Ko~RLuiyPfYO!Vi1eDW! zw0&4RQreVrEoeES3+TT~OCEF|TZH)K(7b&RlaA=zaw#V_>0`KOVx(u{?erk+42Ij~ zH#t+*a-B$>W=$~qf4EOs1EL;3Grwi?u!f{znTF{ZQ4&=$s6uzsZcEZ56{-8(){iqxDFi-#*NVxL#w^ov6LJ`q;*4<3yzOv}_lAxhgCvQGys}>_ zc;uL3%BD;@l;eFy?&yVH_0{tAlbx0=XWRsY(EV_2X443MmE!oPBL!ZVf;`j@i2|YUuZM1kl5PL>@nXLP@ zUEGPNO>Yw98CeIH-?j&caWoRYJE(yxp;TAgamr z7my~7uhb5k(N;a|T5UQhT;g*9dtxgc7+g?YcelkkV0CQcymx@Y1A*Du=K2n#Ka)5q z$VM!kh8e}M8Fj2)LjAvMd1On8F0C(TUTNzu9@JUOV(qc65xsxn3pP&}>SRlPTWsP~ zQQ#Ajc{a=c0;4}5HIvVchENS$kvM@0z;649Xx+;1$eBi(fso0E%@0LXO0M7KG{A`a zegHl2(BGT=ViR+Hx79|bks!#V(a}~bUp1;^xWGJn(#J|_tMlQ4!l>a_D4@krx^9Z| zwXRqz+G}Qtt5oEDMnpg_{^CyEFxDkcD4Ftb2qO{Mv^a)0qO4P?)I zggITplT5<6WSK8_7X9IEgjT;L$>r!|j~PBMOT=Q@Jv-2AkP&#q5oayZ-l^EKOO4wl zho)wftDR~d`*H-E;*8tal;^oVcx!ys>DNJmFwk@Q(S#jJOpBchF>cr^Q9SbHabQzT zpyxFi|8d8O7bpp5?ADv~gIuBW#V&SZqq5%irxHy(Lw=bb@&xC>4yow*qA=DmGT$y@ zui@ODlh2}o8GRYjTvv#=UuHAQhby6bpJNbp3&>)vy67emy*ke{qiWTa4o^2>({@Ce zLP@=QX{|{L;^%8s&gU6Y;`+HbUz%%>V0Hbz7{2uChQDE9`qs}Xr5yCp2Z_&FPgU9s z?dWUNPeOnD9xQ=X3qZ&HsSNtj94Go=_jI+hC1R$oYRshMO@K-QI`V<{oH1&n3u3%j zDidPJ;wRuVbbD^i@?q8dEc&3i!M)AEVFQ@8Uj){FB+vS#&a|rJDT>Z`!B9lQyh^*U z65`3&kQZx%t8C9OPik7S+fGRrFfCWN#ywR4>Tiu~PvkTGm65C~#0mrQ-X1G3nvoX$ zj`AyhkG5`#Sw{toF)7o__IRNh3}ZOU-R^aJ{VBn4CGh)F40DV#RbYIq6adH59aVk# zu-EZ4@Y_?yDX6?Dm8kEQs_2YCemYyU!@}{8fT-Om8&Ob>>eMP1LP15a>UDN!9?Zk8 zM#SlP;6ESG!=sg1e46XmjoZ?mv{3diCOZeDcOn!L!f?5Z)%l*)BXbNnfbyC|{At|j zMpGR{z{!+;*Lsl^I|cY?%5$O`_xJ}WZp>rP4Q6Vc(B}8h@yRKrz?!A!B{cJy494pq))}`~ZX`v=C)xQB0)YY8KgN}pIatVFKmxn*1ZwSO=^NtR{e!#9)DSypEZioMl) zKp93X%w^q|VO7?$nDYOy_m*){DBmBjuAl-U3IZ395b0F9OOftoN$FU+I|LLYq?TSp zx@&1z5s>bVW$A{MjwPN|@BRJnFFyC>^X7TpE$n=DX3m^B=giFad=IJMV*3I~5Bt$n zFrE&|ZTE@+qJy13;qw*;Q^&4QLNlUe(0;lyXS`>0hWVV#EI($nUGYzpO{M_W(}^;O z?~g?X;tdZLK3mM!s;&>_b6st`PrCC)P9jy)clb2_b{p|1{{pbxkXt#H>~o{0goP6- ze9^v~3v16Np0Azrh&!GWaHS;su>B%ROcF=k&!msgw|xiiFR)8VfZY(~9}Y@GR=#;r zq^Q%ytej{gp>6jQ{Q*sdFLG4BUtXB+>rbpQ3`Z`=N)5Dn{*5O!W6`%|KSPW^8I*li3|>_@j`WZEA5+YJA$ z#UloFG&(B8Ypsj-Uryt{d(3`YJLYUBaFXh3f=f9xi z|GUS)c(f2zM_%0dhc(64K+paESD?Qw(Z35T^Z!?%|F;xKY*(V6@0UI^p_5_4WoKPm zcj}1tkAwKNOrQMws{CB8{4BI~7jAqg`Phc`lsKv9I}Xgc<<%T+hRUeo>HJb|(ab#V zX{eO=YGZ?i+j-hK&(*vZsFhw+!#x~78g~7C*B0u0TC2;N5?{xHvjYCQ0~W0&iH3m< zlY6S>s)fAn+0@vV3H1_Ai~px~1inUZ&=1rfEojRv=gN3|zs3|#lteL?B*CVdrTs@q zLGW>F9*{OU7WP4sh0q00YxIM`xvZD4>A7cLiqDM&&Fbz(tVY~wjgB3B_i@X& zqB3HT)5X=7^+a<}?Jfnxo3+q>({iPDga(sbKoECMTpp3zX48S$=5(;s znw;i=0Og^S4|wwYxwD2L+E$H=c0PUf@6JUmb{I}GKzl`d?3~&qD+ILTKzH0dg*Ft53 zRsx;T3hI9!%)i;}l_Io9@Db)*!TE3f{g=)D|M-B=DCqt_&LybG0z+?V?aFn7`vvYo zj(K(I=lZhj=|kH5g}Jz%n%@ePz<+PBJiHC;eAN7%IO=+u=p(72bl4k%$M-Q@BI!{N zC;K+I2Tu8j|Nc_>dqLxA(7ux9+1h$@fI%XZ&o+z-a@<&q?LlKMBv5u9ID4v zOeo=cdFy>b1kK3R-d6!OO+xC^<|0_}o!kTN9wO<+2fvQ^G0}kQQ!P*C{;GIC zlY~op%uc|=Yj7UG2JYq)Q#GQutgGp-x9sVq+O5g30PB=<_O&td2W`h0Nq2RNapR-I znn*=A4Zbl=`kkkKj^N4tGs?Tv%d50~ZlhQZk$I!W1{#kTkT!aVMW#*O!-7-GnM@|V z7k{$yC}KFBqlyr^H~5hjxoK$>Jh69fm+n8Ms{GJI)HTk%hwwZPUiF@n`=OJ7o}Bt> z6|f^pftFvEY;_9YR6SV>%M%|!NUJ{N_bJvPfvC*T|(Wd zIkONZ@Ip=X)~oa+#)3mm$R%zArP7HEW3DNaJTrUX$ov>hwECfQ%AdTlE1x!!D<~&cSEWqZvxXqM3>*+~=o>9JB~)!ZiGv%;TK{{#G#K6P*Y+ zG2AHdllO4^9-{RLP*B=t>M89WX>-2eTDq@3OLz8+TvZY)yWwHnt|0=pNx^c(U5a!B zX?4RK_Ggy`(Tn#BsHLor+4H3!K9=SDidE+QdHoXxxgTxBbiGHy!GpYm$_7D$;g1;l zIn}vDuP-L5(R$|-CPhe68vav8OFC#7#cvY($*_m0Ic{L4_%Q&R3CzUi7 zs2U!?U@Ewwy+E-^(_D79tKJ25Oxgsk@g!AN6MxZUmK&j0v}(q>o>-aD4r%}hg7~s(W=z(N^r=q&?ap`io-ZJ0W9XJx4hZX zdH#^SjI-PAPys!{mh{I51ot=OVA=7#?AABIF}9FlN-DVY@Jn?L+S~+9u}KXXS}@Zx z>H1w*wMFdeC|3NFu7OqVj4j%zAj%fTM*^pE?lr%MrQ8J=wn%j8R7pe_2y;pr;)BhA zn+IJ&7^+zDF7^e-Jx=;`2FpTZIRXUo?CgPPRZno=&11RI?Abn>W&^C!qRnxW>9pMh zAbGAyYl7HShP}8-#8R`^4L}Q@QeWYwDEW}Jg(xtf(Q1rqzYUfVL#%G9N*XMSP;P0b z|4#N2(|E$LIj`E8R)jEUreP~EcZ_IrdvUdAt%DD!fAsS!RDQnA94|Mx)T%`9Dd%jy z0f5jo5+!EHq)$k-EGU%la1`hF*{9w*4XFnoGnLIx^`>p6nZSLBg=QOzcQN^r@`mud zJbzm^5Kn)ZupUtv?*xKiF^|531x0zn!+lWI7<#3M9R;FU>+)RUI2QUlKEHo)=J; zITC6fii@O>K1R%wIe5t}Eyw;2DX180O>m*eeHbvgSi=beDH|DjU*g zW?~_JwVsq8D>_6KBlp-=9d>K_^}2Hmc>K?5OLa06uBgXAh!I^1SP^S7*SNXRg8GaPm9h+=_l zoHY%LbjqR>8qHz|>plOxK`d+#v&w)tS*hrt`d43;ms~#TqUq8a=BNFkGQ6bW@89xW zvhumc?aFXPy=6kyf$JV1S^}OpRadH5*%4kvqz1VK{nNfBn|8p^2;Lb#H5*r3%G9fo z`>B36z{Ml=JD@VYcGBZHh9u$RhCJK(AC40j+4{xPezTaP*4$Q>YW9C5S-YZduT;f+ zLD_Q2A}pnD*CG?9>#W}txOZw=xJC18`$-N8t~@)7e*WApQn1Z>qRgiM!VUyW^T}gP z=Ywm)c9e^@0ilsKd)Cb6?BzP_QSwlM(Z^l7RB<*UbWA7v{b3=Lw4QDskMO=!acb=B`Lhokro06THoAA$I2{lw|Toe(@Cb>=--w+2pA7`{*Z5-1<+(~mbNKy>+j&w$;7IQj;@)^s81;$&NA{>4lD zN1IYHJj?OXEgc@$H;--&AFVnQolO%S)O&Q}r*gY1+8Qd5@z&fu-s;RXRfgPC{Ul<-KgT)~Dt zafqibG4~Hg8$5A}(79lP=HDR~^Ju8Rbm8iH$6#wANiyDQR-)Q=oI5&K;BwyeArMjt z?!Q_90$tv@J7zE)k;e?u zXtlxgoGG-+9o0bf9_0fmpf)p-KysM(hubj)ytpnZXCkHipS$<&nY=C+mV`$Tu|rdE zx2BKo$(BmS@(}nBrU_d_vF0}l)mYZBALk9GJf2nDUSqAo4q!O@R9A8WntTru9DUrZ zry)k0;^gXsy;og10(-CNhyFagT-ddUU*>pfPo;m$wBxelq!X4=y>`#u{&4H3dWtZZrq3sK{1rI}`u_r%n{@V_)uTVQ5bORi%*C0A~{O5h75)~BSl|W!?WMc$58QLX8(_>Eh#a<&oZ`*mtD1Es8P`+QE^6Q}RHPG)3r-YG4GfBe%Em zMQ)WUC}Q(Z`*>QXM*#5Uc zt$D)%Pn&A)>&`Xt$brnS3J-%QBlN^eko2X+`b(TyLAujpUN^_lj2+n4u6sk>_BHB| z51y)im5gG!LApI!TpBsc5foavZM5S~JuA~WDucM;n4(!I`*Ht4{5w>Kq8B{H=|VSc z$e?ixVZk|4WSysSmEW2g@-?r{v$kb_REMj3Ez|wjUDsO6eQK0h53)k2)@r&(w*jD; zqfoeiJz0DfaiX|815BTBm2G59T{)=s*o<{(ZgAbw?u5>SEhj%@apm5p=PRU{M zLlShV=#p8q+?&Ti-Dg%EvM&xLEZ>R`v`)cLc6lP|FSWs0fHa^qUW4CQ#S6a;C=y7*qJ7b6i}FO+lxX(8 zsquMZj(mn++sg-_#WEcs@r)zqm1`s!-;UxJ=rce)o#m32VLJYX#-t3!VfiT zuU-UEe!hPvghlz{?l8`|Ww*CDj;U&)Ht(~D@7d8YgEwcu$#{+IeiRK;Nz{Dn3?5(q z1i2FwePyXp{u=J8J1d}+W<#D)Kcs=V6JyFs_e{A`j1DR^0+M8RS&x=R2#xz_S%1kM zJE;sV*=Ml~v76N4Hoc(>0+%qI4t2ujRHM^2j`+r39~O;Tkl(rEQX@TP<7>OCpT zSUkae@aSzxg~moj=*ek@U8HxJZR{&?kUnC&#VLe)W4@KW=T8Pa^a{%?CdWQ3Rcz#; zWnGfR1UL0%Rm7RJ;=xo>nh)@OG!w<(HLS98uDdm~yd_PRePzZ!o;Qf2BMID4=2w~K zaiLc3Mdn>k^5wumrw=}%kN~7zxo}4VIh2!t}xm!(84oPRPyIiK#jh z+2rKXLTj0V>Fe2$2rjs{++;H1k&WlhfTlMzf%i>G6k;6un|Ey|`}lhFuvhL*I0w8qXpT8P}AG3A-ml6b3I zVf3lrL%>%JguTW+<7Q?BL)*I5nWH(Hjl;H6R@E|RZyV34lhXe6T6|tZyJcK`1nG7e zx&1}{o5-EFMija&NnW*PI%n+v<|O_JJaq63tP{^|XK9ygp*_+tfb z8zLA{)}b11*{B=VkX04{Zo0ttP*5S3nE;{r2NBWfH6-`U15IzkYieS8Oo((CV;!Bh`aI zrkltP9lmQddekexyruaX9g(Gb2&LX?-_Z~p&HynYfc4$dY+b5|mQ>3~ty!Vf39UZ# zdpm26x%X-L8)4qcNDkV7TI#+#$WGdR^5jgDroI3zXluvrg2{9mfkt}*So4}q9 z4?h&q)_@Aa-DFd=V0OYq+Xh|h)Mle6AhwfU9$ESrv@L0VIhb4 zj^$k|wZ6P@W8Wt@R84*dtRp4I(T7a-eXRp}C)4LU&8PF; z_EX0M%tT`0@1-A$7X)RFWanox1dRZ@c#+?1-Pqm1jlKF#tD=KFEbo3C)?;Q`aHC*=u#-^)w8-eyg@uTf7m zcJS5Nfb&4GVD32PYscPY4eXkG`8%t_da#1JXhHfIUtU;Mp=~;8bI;OC z_ja!7)s?7cc(rExlxrdOXMmWQ$rBz#oTlK33Z0y$h@eE_Q_q+kw=0=}%DKC)E7A8v zusuJ%F3#7j5BD5n{o@YJ|b{iUff3#X|*R(hrQn@nQ*>AM2L0hW=$}6zuQc%#paT?SiY!dPhVRaF^z&DP!g$lfWL38S5jBmp2TB0RtuTRfH z3nJv3By$C8uwzXOvTSuOwc4Xn*KgS56g{Vi{o9T@Dp!uA`s_V)rY}86|@O zNe|q8;B`6&gPn106as_Qk1C9}!^vTz{M}EaSgx%Dd8A~7P7$?A!fb2Qi z-W?37i={p$5U}FSks(Vf@XWXtVQW24@Q5KQK%_m)oByemmOT%yKt?1e%Ni_svB`Q_ zK5Kii&nwtX55Ri-zWPm}@R?g&!4!VpN6C4_HqGE((w{upBYIS^GyAeXPK&;nl@wfR zKy93dErxv#V{O`2>JJ9#<7h?8GDAHXO8rHW7<6(qn`*AlP~+tK`PM}~APvLSe9g*> z<+AL$5X#R{{Re$S?~ks&ismj&&Qw(8%)DgH@fi&r@NgzG?*nr`r?xr1p2T@hYrlIp z52tt>so*lC1w%niwaQrPkGH!Fufi-&LKb!i=pJnf?_EYkXPEgprzT^^x|;Rc`*$~B zIlsn{3daT#T`|HC=c1#_G6bWT6MXaynhdDz^JitL}QtUA2Y$LIhmpvuPgiE7w%NRawfum?{V3Uk!@52KtovS?-03U);*&AJUM$H!u* zsg(5s9Zu`^8ncm(VzNPK)a=A+uYj zEo{}hg|#sJD=D!|K7cWEbn@w)Pj`18za5{QX@*`$h!m45pBWgOUv_P{w-epRxc{zK zP;!(Yd~F>{MU$8rG7-4UQc5DAe?)mZ(B;t!@*ILk(rmY{_VI|1#9L@yt+FYkU)yXq zdxWU(PG`~J^;dAH8-WR;9liq?3q}#gS$3-HrB&JUsgttjcTQLe+MLq3h{{8zKPy(y zARSrfX1D9*%%V{@HW&VOluR-#zqqKysAw^dRvq$<4AVk%2c0lf#WV9y@90*928c1? zyjD$0?^&0cc`SYRHnv#oB2&y=h?olc9-j)f9=Co`BeNnuZYOw8kn>)_%+=6qif~_x z_hKsSVF{mUa4wiA9m|;w3*gs#Tm<)@NM+{tS?BL(ggf^c&1wp{h`KxG@XR6D?h^bu z;8;CV9z)E=`s7w;YBX|l65^4r(Z&tR>9@~?S$1=fR@ebBQs5)9%tVpe)Bzo^*_F%}*x|S-OK-wr=?43y+26nQE-4UG4a3)06nYs!tfUuEb>E z%d1=C@w!^a2~LqGF*Cdw)YIHcocX?tBTkkWPtgld_c&Hn48_W_^-Rjft9^Sld5?aq z#U)^~!x%VAIu#CJh^SwXObjtzbU}pyToT z>=%M#f<;SDc^zg!{w0js)vQV`J5K?CO)B&%3Fvij35R7-tQ=QIpbq2>6F22J;YuC*Yn9o7_+@yhu%X2DkMXDO_SS){0#0;QRv zJBl)ukVs{eE~jy5!QSm9v${j0C{Q7~>1Z>W(>RY7)|E_JYR6qj`Ac6crUYXqYWY4-^;~ zTG`9Z7M-SFTv^2;_;6?T9?usS)*>8(ND^CuQKD`9oYEUV;?)e<2EVn_wWtMXDsVAcvV{3JL-1g%s z5~s%HciO$8@A>(=7{Ig^Tb{Q@QTA3k;abb&)F`~2jt9xgP}#4N>Y!GO>nQY*+*kVJ zh)IWMBi?%cZM}OsZRg}=eombdsBy$`|DoUGE3()w<EyqL}H=fIk7Sa1tg z1KUK%Cn2>hgzi;pv7^bApw*%31ux$i=jw#vP2#cPjcHUB+r%hVgZ??4w`_=c2+;d( zWZySc;whn1t!X|RnYoe2-JCh6o*WaGQS-}+n3XTib6F!a+mGj1RF7|V^2bcp&*l9B zU6)~CkpCqa_}v!LN##7(V{UmSHruJwe8Bs?(Rpsu__kSFJZ2@lIy+jcYZ@A^&R;0m zb^BlFJ~1Gw>Afk`DsUs(ExN!kf*aZ>q4ed_z3T48y}=EMfX+7?3C{m63q6TDn|PD zmGJn4+b0Zf|CvGUJ;(m)ty5W;A;#~A7!L8TH4WANqOa1cMA)|wG9?O>{Z*MQPbNe* zng>%)w1;=-)f=> zdO5^Y%NR3@bpyveTFbJgHeS?03XE)hSa>ReYzgWvXMtm&9eFKtO76M|CC^TqluTM~ z|NZ#(3ckAlujuVNo<{u*uX`|hZ_ylh>)l8 zEKco_Dkv+k)Pc-1X&Tvf8P~wEO?8&>92x%#%p>DhHr^hMuNY4hgLlME%Q_bq>Fz&_ zz-P+D6PVfRnoyP&^ksRl2Pnom;YirrGjJ1F4==JKexDyvc0>1 zKmJ|7+BiYF1-200-oDu5H3CK>oC|!<2gnxaBN~G{#onjAT!3zBF`O9Fdi?C?)VHsm zXWj%I>;EzQF#LTsp2`!SCxPu-?{GYjt=iTO?_@KHd@P-Hu|*`XDw?t}>N@3QQnmz?5x`cy6&t0+eP^Ki`q_Ie@%y4DBo3q5Q;b`}d$=9lO$T515=;ej(7na2 z%EtV9SqyX`9D+eFg0xWq>;qM%e3TiSZJXt6!vNilT>awj+s$I-M+c=;N!Y!zs$#%n z+AWH8-X@wdnocGKw9AuKgP0HlzY@K(bl%Ro>wZ8X@4w>u5w9Qp`rggl=2D3@1#Z76 zz!N5=?*2M+k0f$XxD@-HDdGE7ib)jk4r@y6abYam&wUkW`gmwv3|VDFGx+IKHeAHU z>y*6PtzDezG2o2e+@{6|)PJigN{e3z4!eC5DO#?Kv`iO8B0zoRq_gc7;}kx1%60ZX3kYeoQ2% z|8(or6JP&9Z0w`kd;9OoE7g8Y;sIef=Ccbc;4pJY3yYhGd&`R&_8`~f7M9Vk2-C2@ z8&$Ed^Xn<3eHs0~an%7*0f0w%cjNw{ zO$^1)^Gv7f3d^7U{wEOg=M&V|=VG_t-wT%cZ4LitLuov;YK$xkI1&9rXA6%rZ?y-v z()6Oguvhxl76?@drYng$0UT-pZ z>C;I7gu1)wB=jlf7Rj>??$dm6K58mpZg)eb8zQszi}s&JOB?ZVrmBDC zT2}_mRbBF;(s4j_n$Pzo&Exy(qWeGYzkN(QjZp}hk*v9Helrn$!#EwA$hBE8W-MCZ zckxLkjsib68NF_%Yp(0Xzr*Q&Z9!R?Oo<3zQ{<^#Jg8_QQ59QtyL`HF1ny+5UqN0_ z;yi0rkYqdZQEUakZ)RFsbRm1)0ep_2YkO?+#kYbp^LBEcFaE>+c_fSeS!IqtkBR?lr``&T zC(OJ>W5!O7_4_ROzZ)r|C;l$hnE!vO{O(})mFyRYg-}$STkzx#iMu;$F zM>Su5M3Fiy2y+v5INwNHYrUF(BYd*5j48;tHdeXX>)UDXXUUA9z_ax$x4#M}WcJxk z{x59&ZH%R#-l<7a&B5RBBgL*aBjKi8^%rkSvdJpkQ>UGt?b7`m#~tRhS-9=Y4%}G`1|Fu7)HP9nhJ?^39 zgVR4nXfdgG;d;m4IkCrg6K4LUxw2A5h|tIt|FUKkfqU!u|1m-IpJK6Sw-if5Og$Yt zd{e)kZ5~P5oyaosYZ%G^0J;uIoX<=1>b?wgic>1T96FbfjrE}&odTXMlW!D~Rf9=O zMw_X|cA7dk^g$xhVlXkess(J;3+`^c$DLq)kDMip(ygvqHy7-+t3@m zGp3WmYri+J-TtnOzAN5pbk3}G$w$zvQa+8VJ94zpOm5TVwUoO7y=K|9RA}TMb|XA$ zbV{jAtG!@w+YB^rBCI;`c@&=>lUCtQL>VV#s-0{ii_Q`oY-yx78(r9o!+cKLbGM(@ zY+#4qX}}-VodDL~`)>Tp9a6bsoPfrp(J8I^ra|r{I#peKuYYYh2G77YL6?||<1IqZ zh2moBFFz$7tBkf@G))Wz8QFyX*Nl*dWOUAcNzXaW{pe?F>=KCjfzs$g7pqBj!r9`% z7g)j_?441c&}G}ZzUuNAc@c_MC;aVEHUUks_!b$7Zkd zkvflk{BzSTDtDc7J{T*Ij?#y3C{oR4QrBsM#G>v{;PV|D+?yTF19%X$w7=2i}?E zlc$OP8U!KkAx4)+Iz@z8m?dQr>LjA9kKc3mX zW8p?W$E11}zYPgjwW-w|nV92*H@bq|Kr>#vj9kKQmwd^5j#)n3R#~=lbt+LC4oNP^ z8HFgm%O4VsuUOx&hOnQ482VQXTC7ItJXb2DR_DVg;&;s*H0=N2bSvicM(MkE*|5W? zrCj+(8U@%!Is1@H{KN)SRs9G&`=N99d4GhC%kVjI*Bvx@+jyad^A{GKCT+WxWjFWh zCcpJAIrgRnv=Tj65_{SYJFaY+q&x#7U#|Wg3_E>@IAjB#qIWumxevl z>lx4ei?tVlB5reh7A;nBcg!|2#Z}p<4v!`RZgcecM1%Oy?DDHMWTjwY1FvDWSVO<_ zj&$?idIQDqqV!G^y8IekkYK6$t8%~swx0Vqbfjqg<(?4w0y4(nXIwgY%yL{sayA_1 zw3q{a|Bz`Fw`O7&y4utI1y7g-oaX;IzWapuwa0QN#}&FlS{LD@-m`NOz{?)=f5r3hZk7KAeK7Vo&qOPJ^QO&waq>o`-#TQwC3CLM zxY-`k7vB=_FzRGZ?rJqO)jqZ)_t8*jGGZ`Z9P-f3T#0|v)U)J9PWAI!%*L6kv7m@$ z#SLaM9$N>nCw;Z@>ij**c;}1bI17kJPeI6@epzP|-2!G&Ddec1_aMfz_3ErG+T%-D zTGa7REs!3`*8dC((f6jWJR|A_ zW)zPlPUJv3j;_DZ>0Rwm@)G*_dMhr_E~+REIo=vBxy`^hPx-@EY6U+y;W zi1>ZZs)>+B7U-Bnd$UN-u2j!&pSFc&lV2DW)V;9tpgtG6Vn(cQYmq+aqc*%$u%2;z z1&1Adi^%rDym77&QB&k7;mku5_4Pq`m2|5u*+8?^aSuVW-M8;??eC5b2%Yzh?)hzx zl|Ijdcoo{tH|fk%@+pgu9(`cBGAj_WXA-u=KI^I0k^z{qc8LPRhMR2fJrjcBc#=VC^SsjiMfy%>>`D|J5$uA$F zO!F(j z=-V!~zJUQZUDcAyZ6%$h0>+aKMrF|^^+81#Wx^}nn%EH08y0)mO{tHqLH>rj|M=Fp)8@EV z&!oxs`u#ifdre3Kca;QL4SD94=5*MrJ&E5L>>LtQ6N%CLUq3*{^F*rV-6qppeEKV- zPLH4m5VPw&FJ=cTuV~&9)2$TPCQsk>;=THT!`fr2(f&24mOe;J(6frnu0h5C&B^Yb ztk{>r37qF*WroJKeZdo<(K2+*v2PyOr~t`LxPfM6@eZ3tQ0*-(;gYkH_50ipF^R-gdp1?&C4r8 zzwVWyP&o*?l=@N(u*-EC>Cq^fTLwKm6lslYfBgYF z-kf$p+rKle8UF<$48J*qbIoYKBna}-cGEwLSkI^85dC0~iHYL<=CZtkdl7?L_!8X^ zaTIv8H){vBmltpQXiwKm5G_KtD!+|KcGQ6^U&Mq5POVn>Su42PFLpjFdH5+1*+TD( zhE+YI^jjJ`Do0JE?60S4GM%)(F=T;w_4w~tua5#3K0}pTUcfUjLha>2G-TCphNYE2 zZ+$tzjpLWG##jR{tEU$2=nG}8-NKw4VEXC8m0I;gp zp#o9xZ+P6Gi6g4%(YWOMQ1V_mMKQ{zX8l|%Vhe~Lm$Vy~fPWTo|*npYJPbV_Hsei?#>^B(6K_AVrEDY}})fzcR5ej6fmA4!<2auvZA z3X!#XYCwD6q{LUP24~ibb7`BLl8u-G6-X?*T`$zP$<)xV=qClSPwfLXfrZxtp{P@& z=uO>+p&7HuWQmt#PEJmyOH*YlbAC6j)>_uMTvz0i2v@SBK-7ewT~$@bh0mOeQVy$} z?S}hW^1)hBnIPPj+pY-CsA-SBnEL6fVtU z(^-!S{I!nU#rz30Q|+GTDP>T*d)VTDz5;$8Dgvtsh7zMeQGCV9wb6m}g{+jo8h-VO zl$4!)>>BhIflLPl8KG)QL=63Qx!s{Px}w*7HxUc_1eXaN)hFIYNl$*bJML&L`>LSp z4`8?(K+yHpM6#6^!^m3YEpzU$iq)@#_rjY#xi_azc%;sWQ9}HBVHgnBuHu_+n zF4=xAz}?0L8@Prb7tb|DOQI*FCtIzdWHHSB0cFoacQ!(M?A+00QFS2zHysv;z*?si zoM6k?>1eB&UswnjudLh zSzLzZQTj_zyo7>nhrY#Y86LtGYPOHm4AZQ3mxm#d@la;1?vIRWW-H1!I1ctcxpJCf zjsA^CJ^scmYPDt$_J?M7^4#(6DDcWl~))Tm6_;k}y~157rlc*@s^M*vZhZ1K!cw zel8!g<%HoDmgeqDwU{9f<~7|(5h$_iaV<>PWQlwcF4=caY?(J7FXq^YSo8PHzxNDh zn(X_SH_TOv>;X;L*9E08 zj1n$$=GbF2C!FEZE2z(<&y>UYeq(ahIi@|c!tB9tZQR>F44dPE1Q&B9l;ZbfHa9Nh z8t%-NnqkcJ(0W~vETF;mC@H8ZZXlWr$v!t^HvjV@N9X?C-GPzNSp^&d`v{AYKRyo* zB9u~}ox(lAWyhOxx!##y?bvqxj+|$XHnTi|WJfu5HBb9lfdgzyRq>eNK;s|YafX!K z4GR=w5)G8*KJ;?LY_aw&7rK6i2N7ykLm9bisdS1g9--)<6ew)cZPm2wbrQRno6w@E zIb6YWI%@$bPv~?>^_Z_^Ptv4!>*M!j1C7*G?3jGN8ncpki$URa`KcVX94&hO4*4}l zAFGZJwp^fzm4pmNPMFZWx!v$J{Bcx2HpbEId7#=Cw-Q~a?^bz)uc!FO>rLqMG~Pvt zXD+&Pns-uJgkM!`TNd`Sr1fn?VW`gU&?hxWfG3+%mpb!bBNR1 z#p_o}ywFsrH=*~X6otRMUEQ8nW1|G*OQ=6ljsLj>S$SqVM)eB`$}CXbQYABXVL{McKu&Qlsb4;GlxL&Beha*-q1*O%Tb^++E>`4q|;% z3;1A^)KlXNCA;T{6t;1|D=v1Q<~wh;aS%rR-MiQI_9d^EM4=iwlhk(^%T!Ai+z;qS z^J;iq_Qs|Kw-s$5Z6Nv9n&!^x1w~X-N%O3oU796*HQo=T`G5=W=r?iD@ne>!#(Th* zPz}%-y1w{M_ET%!Yb(fre~I2E%c!QOZl)ejUa^meSA3N`XXNR;W1iXiRvD9m~2)icVF+EUZeF$2exHXv=eKjB?Xo-p0 zh>#X}1--Bx$zHH8tGOJ5b=LI0>HlI`G+1lkKg$1l@_C~G`&-cVr_XI~__)`Pb5bT` zA5M79r@D_=^s{$HI>r^jvC&1|#Ro3q3)Ccm%~KBOqfN47Cw9Za*f$(j7As@jj;SBz z-Gb!P^%3dEzB95C4G?dIQ^*OjksY5ihv`xAw*`Mikq!m5MjlXqm9a_vWg&CASgs~$o~#Kl7;|kYlSppl2>;-58D&FjgtRZw1c)GEg4o+_ z8UPW`byTq>^KGfa^oQ9)2*(z@K&C#apLd_tZ%ObC@7=@EV$KzBz9?<~762B4qsy>U z63s~q(l=0g#+OB(*W(bKQ78hIr8q>r2clan!`wF(QfoPP`-9_n`_j03)5q`S5}=Mg z)w=WKjo+i%#WQGRAQ8Q0=ABQkoui}Aa0?%uG1-r$J?Jfi$u>8i#2P=xvA$U$N&mOkf+d{;|U&eK0m9DxoP_un|?9(TCbwYs9ifFOLrv(`fi zO}tBVt&uJ=`(_;mT$?`blTg|nLnw`AIJ4EKOV1{@F+_l(qC-#@bPRvv{xwykn}G(baxChbV=s`Lp;~`Rd2t)`+a_YzH7Z}z00-q!Wph}&OUqZ zv(Jvt)(q&d9LQL-ZS#`Oglzk-_94g!tkJ_c%$ymnCF?@`^kQ;FNvW;QgjxOx-aPrzReNk2_4`!R<}IkV&a5PJBv{Z+YT{^^gFoivWd5uwZgy+I$@ zRmXH{u*9VUs_YF+wcU;1Oz8MV3 z$^76fI+?|ZY5tRN(PF()ewNMfvigHnaIu&h7@o&vV1V}NU|L$%_6~GfQGa2kd~sfN z>mHQ)-7#$`vZ`1*?IH>N(heUVRK8lQ@`-E4tv5{m+bsJPfj-)Bh2DX@0E;T?jq{W2 zW+?{QC7d@~OWDG->UfELSh|_&S^Jkf#+vs_rRSP$;Szb*xZQecU*o=?%Fgwto`_lN#apVQszmM*+zUlU6iZecuF7}t4iUEV9~7J$T+xH)p4dS zo3tc-HrK~2?~cvqzt^XD;WeuTEU@n9C97hkG5QAJ#N^jf}m6Nh91OZRDEw z;mcq14)zaTad2v@Y-EX=y)eAiXzIHbRZTKP<1S4mJsAv4t0j3N_hBZUqS-)t*FUK zIgB<9++x8nGd7!lJOmR_uT`1!HA~M%_I36m&>QAjJltphb|_k;TtU7t%O*m6f{Z0Ue$hh zGmbe2dp1YjZndu*j1DKKkCp)E!j`RgK;61UU4`|K1DJlixjsK>oQ47D4W?4!VYCUF zKZh0V%(#op7hA0u5I?+K;+`iVc{^5v&X@!{Up18(ku2)?0-d+PO-Z! z3i9&fkf_(-S41(Xg_K4d^B4D2@9r-P8oSR>?`VwwC@U;Mu}X zG>{Mtzjz`-U8^K?gOEB$<4jx|*rxOjV6|lavpW^ufG=PDOT1CQZ z;r`HCyXL@ew`aSrTM}INLO=c*MvG1TW(ujU=LtK{3dW`WsJ62R!yqcAcbRP^tarBS zd$HA{jVn-9^JZMr-?hcSAuU_E@4ST+Ev!mp^iCk2^THbDn4yO6wCMd**vZI?*52^8 z$NhFBl~-2ADNxX^-Wh-!KKniK`j#TcWcB$$Y4Z{cG3&Z$(?hp4G9_ve0RT|rCD7=e ze58;=#%ymtUwuumsSDQT(0g%Q`iM8iBzf9nTCGBG4f7mHOK`~PlJ7mgp>EduI*L8V z)HH%xuwQu9J1@Lt!?EER4QTB}Es@#jPIHgm>M8C)N%KlW9l4SBlsS*rTGXrp3RW5Cmr#xGH%yiJ*A@{+ zf>R~6q7r!>+#bWHy*$^TfNX}(_)MhtH;T;obZqUnG$HCkB&Yc&(h+bD5vgK)(gr#m#)MhzN#~9RBtTOu%zl8itX%_WUsTfElp3<0R?%$-mQRITlmo)#IdsHP7ciXZeE-WUD>{_ zf(}O1#Ew^iCg5d{xr+c5bJFG5#Q{x~=wC(|69ktyfhJxY?jhEv*O3Hskht zg5!plf$Iq`Cro%ftM;tbUgj#%BsLlw^b!b2l(P79)WW^Pz{<81Mnq;(rNIP5*U)e-Z1>Hz`MP>$1v;_5{`3BAZVCO_|G;}sjjwH?sSQXC)(FQPr)PxmE zn)a|)XK7ciQPF#2^@DdYP6v`LUti>Nh4Zh4FL9=eg5L%pf(e&`17Bg=e+pRml3zE0 z6gYUPWjka&`Lg}(UTA=J@qWL^$Uw912|65#4~?9dorA6vxt^WcY&pUjwECNNze#iX zZ#_8&F_%SCxqPEG=wP$%+LQB%Yb(KKUrx$(DBLhQfr@&?+jYUIq?1@o# z0WtHNrpKaXZ_|9nlZO#Yak=d@)u0gCu+(n}Ez)vej?8~z=vF;)RD78^9JIk9pY$cL zp?ROpgSfV<#_|!u!w$3xg##IKwD#GenI0`3>E!{Q{Ip{uRSRYF8920MajK7BsiMcb zrO=Fy8kOF@&8)KD2Te}qwd~daI)q-1jI+ERy)$?-SYYyIum>FZg#>%+$R7x1r)f>M zw#p8Oe+sdmFmWy3N!DiIG_K12^wBfGqrn{aYSIC-*YlpP7b5sow{6fyy(8x1VPCj5 zMvbL4J37=Gnfw_z*UqUY6k7!DXx-3Ve5`+Ca+`O0rwSIOhDy#TcWHdg>lUD6;vJ9Y zwPS=>PLg=NS?>uFuF$YNxW_heSSm4X&Hci=s%7CLlC}zP-;Pr53`kx?q@_A%!J7d-X&c&?|5nHpZc^2x4nfzX+Fd6$4Hr)yDbVRsvUBf{lF! z6<2*wIW>9I`VfQD`@7@w5A(}9Ji2&ZEXb}t{xq#ws6FOZ$^Y$3h@IeQSPd>$-C+NI zG8TqMQJ|B8_4JaIhJkS!M%8MDpCSQIaL$xNfvPC-fj7`mCfEDGqN2qOGapvy&6^^a z66OYt5O6~4^99;7cqc;}y<#oUdI3xd7eRI-^}zMZ%AK`FFDk?e8EoY|(5CG5*Pb`iQkKwa-1uEzJ>aS*T{8 zTU5MgzvXSuG!xxBEiN1 z8dh4t4TH7G&pX8?(k<9BCdEd@Yj-}+d>#lF7|3<5mU0fJxUHFqV}AlPDf4R*SaSi> zrb7+Xi<^w&j6tXrrm5sat2&WUF( zYcdBhE-BVy+^hMtcQG!W9eU`zG^)CScwQkA*5;P?Zsw=pEMLPV6*AJE`r3EM6c2i~ zEZ%=@HDi_U?GfjJYUcAZphO6*oIlA<4Ae=0SFG|v>3OY*KtB-RzgMVp#V!*H`te{` zl1)Z@F?`ZX|AgCr)aoEM#owk_fz4k)zzEzVIA?!aYHeehi&C5_y)ZP7We5hBAMSgz@2?i4#Z_05xp^HLjx0uawoGenWqkL~ zkf2lwy4~}u42Ee+&WuO6=>K;A*Y?Drox*lh;>j} zDOyeuMZkJYf~fx9RHq!)oi}Uy#(8s$nuBCq8Z7<{gkt+Kjk^osAvcNnE3+w1mAD|9 z1v;}#qYl4P)%jMd!8(bZE3fwn^_hf6)zPC@5gb~~o|t4dFbDaO&WwJv;uYynb`d z%NfqSD4qKR7oYD={;&MX?r;#~5P~q(XxcZQN~D=XHoEQQXMjj}P^67Ylkg6KO5{xje)oy@J+h z14UIhVyst|Kai?gSyv0L%`Np2I&hjqog1D>A`L%&wQX|tO$p0vA<}i#HGz!H+H#oy zc;rGuf;;I$&W|K0gq{MCk|%>?o+%20%7cfFkoW`++?4OWh_7xoH`1K^Xp;qzIKrpj z<7S*O8Z8HNoK3xRufq5D4=zB6Ldep^ZaN}OTgJ!4H@JTTR56#InNvE|EQrd~^3>+T z6t^F)9d0rZtTlfVIXH=Dc(L`mv{zSnYx7f9=5feQu^@acB9Vw(!Q=!Ef^PBnEZx7k zh2gB|bqNP=Cp6-x&IIu0DMt!ltM-Jdz`d6F^=e(>A7qHm-pRv{b8J_O(P}P@F$pk! zK$h~V>3Ik(&?7I**H5J0`IF=x42Rozc9OT{}tv@z7q}Bw$<_iOcVv4=(&~{Y=Q@F_1ElI2JC++8~DRJGX#$ z&TdK`PVEYhOpEJYE7HAYU#M10WEyOL^u?&&3s>@;&C%3BQiccFcK%8_n`RM^ue9e; zs?m`?aicHOU3CBcERU$`igkXMy&!Dq`;fW*R~7bstBs|Wo40`0o%Svzk{kD&1l!)0$oI!$^I7*gu{17sRVbteZKyF(5S1b3scp=Uc&}}B z7@Az!Om-n*Gat6n>Oin&F-fJ9|Hm>I&!Dp_iw~5f;OVq)%iE~BHI>gSNi^`=ObDW< z`56+#$qNB0Tj*oVQ-qg0Oy$~OVaFWJR+h~X_*4RTXWz=|I^IkiLj})}Yta+_BleQ| zqM*xjZ=eD;%c{}Q)H5PDR!FUwzu9VNzyfV8SA7C+xCB(Y5ngC^V>-w8vhlQHek;Ox5OY_o>M${FkYAj&LB%1NUYS#nW`X9j~7iUI(qp$~^4|sO1qinYNYBN=kwjbiYQpIGu9TF=n)R z%osC|SSriyT19t!e9`7^vp3WGZ~S@8dllwAX)^pkV|PY^E^eax{OElv>$CRwXJUqJ zZjTIx=>tYcO>}sfKGQ)a501hiKji%IW{N;j2{ z=ChiUb1`g5vYWoOt~wI$_#F3E@x#fTh{~nu!qV7_-mK-IN6mzSFqg{G-KUGA{N7uu z89w6?BVJ{jFfS9&O6{Jkv1zO5h(H%>@{0fQap&$3k~Znp9=!jDQ}dpO z??pt%&dG4DQtn5Jogpd+=COASXGW?#>*sgmVK9$Pa`!!({39>3g_*v!+{le6s_FnBoY_C>!hBEBw@qOeSV z(q7ReS9?XT4)9K%^{8tEHzaHVeybZ}u~m#CZRNLEh?GJe6=Qutba6Fb-it5PObErN zR7@AC&ZenU4G<->F;^Uk*D=+Y{8Su@X|N*avNBWq{(i1b+Het8+Gg`&xnKUs#`c?Y zyZdNwXV_Ab?gYwaSMzdSqvOshzws-#-3*oNPT{*Qyr+IA3oYl)o-p63@IxC$IQ_rJx6WK$ZM3ao&E5su%eyG5zmv z23Y}#>~Eih|KscX-?_%9kz;P5QY62d-+TZ6{Q1v(b)raM`a@R4WdGNpfTk1DKw|EP zI%UTHR#5W^sNG=%s-*s-$mH+BBPm5x0`#rKx3d53OMJkrWwRd}{@<1kOjP~`Di?c! z=e_)Y`O=#wz^tvR-u%oS{daEupGmQzs&^C(nQ#5K5}zSp*0&-_o&Q^X0uz>t`n~v{ z1nPVq7{M>S*PqjTlOge66NWi$aP&(?7D9>sgQ+~O%chhLizTiUcj`E= zqUO8K4%93jHr1p7U6^x{qz2$kxFkMSk&O7YsbTwXZ?lMun6^hE+D33Zj0F5Ti7dtc z?&=8qelnXBgiWJVY!%fL1&ge+Taf;wAl9e>xGCyYS-p2148^BXbZ~I!Vy1hSZ9iKl z{BBYfB@*vQulvbQaF)FL0avu;x1J9ZT(X~BN;juOZTiiiA{TQecJLt;O{rexlLQWf zl_WmvVMbOvc`S^#w+8LtGxe_Nu!&*=odV4-v7co^W*jf`IAR&6`eLljfI6?7M5)Go zt=lTsc-yZll==o&KB6PR`l-(}JlGh=6tWQ@|LiA`IfnHv3dzUA18M*>J}Wg}2L?j%M_{ z%}HSmgB_bs;1K}Ejxnp6you-Gp!50%L~+r2kXuT`ZH=fRP!?yqGKd+f{R)5!0ZX(rMu$%G7eQ-P5;Hiq%O43>1qRKaivJ)=|CX=y2XlQ? zZ44&vV9T_}`&#RMt4JrmSj`}y5p$Oyl5DS+AW zMh>EQU>xMl0?gLQ(}@6((iQ?hz0{!qj)K%l2c5+mzaohoZ5gJ5hN^Sl)E2Tk8tzEA zO+(wX=S2SVb+_)TLf8y-be0N-*E#16fmq&cpuDN;dttvYL!gxUjmdBLsh_z;JNDOx zs(n9}l=DTkPq@ifqc^>{U@Gl9MiUaNc~~M$?e`+o zQ6-F{b*edlS{_zzk&uPH!rNJoJYR6#v720f?i{?uyQ!-CZ_SpIg?3tSr_qX$0+6Wt zFMxF_lBczzYUqrE7D%64k?93}-L6!M;g-f&OUVMk(^3QKC+TNV8Z);0L-UEDW5rgN$_QMHyUShq@zD%lOFB-~(@5 zNw=qNj=K_v8#N8-wO9I%hJcL;?E7y)4ALYmJ7pBdp)Q(9Mchaz9rkKa;X7qB;O2O^ zlZ*VPFp;qtjYBH-it@cQAR#j7JHho5emJ2}Pg1`%mwdWbH_NfF=Le+zSR0p$hz+9> zs2A>IjOd?S`G*>GF$EZKfE5!cgHG8}Yu^c&++UCvE4e)uE+L!60e2= zT>l^@-cgz-ZEmG6)qDuZLszF1u)AMhU*8o|lw~~$adsVCet1xL#vCVePupf4vK5847jyl$KHY#7{nDptFXNb1ZaEih z-VVwk{-sb4NB>c%>I>FAvsI5{8NqrBtNrMJVZVf>C}NTu--mHv%;Z^f7bvY7)}t#l zjOr3J&+ldRnOzmM8I|vjXHWcKJpk!>Z6>d0Y@AVK+%&DAc=Th8iG{^GjHPQfAra3k z2PpqhH_Y13aL;vVd$-?~#Ffsg2if!#z8KXA&WLXx3-~GxT$7!Txy`#ZXOFj_)dyQw zM}o5-wvE7{Giqg^N<4t*Z^8g%CCm7(cO50~stG|-CSZ@^%4q#+8xmU+y9g<^>qUn3 z!wMEaaf?#^D~i)R%{mo%1`JlNr^Bagea+Sqss{!rKnJ=E41Mbdh05zXcf$|U8g~wC zM?cd~Dd>B}iF|tBeH+#AOr9RSSa`|4BHgImZxqxsyggsIn3k)hhmXjU3`` zv{hI)6o9NaqWesM8vJleEUeE9ct9D_Xc!bsz>Ev54(uu1xrOwAbt?c$kh`3up4c?- zj)JBT2Jnx-3&3{0V?yWDO8}O$ryp+P)$Szc)qc~Db1b?6Gp?nOFna?FIaoI;#U;P} zy`vRq*}?cUkX!23o1PNl>+~(;bo9@4BhWCcxrmZ>%30Dr`;nNw(tQDd0A|%;M4+o1 zew~8?>by>AGPertMo%jsvu~cY)GT%O_d6Q|ua#73g^hDoTy6S2Z?5$4jg(W0A?LzK zr4N*n#CDQhIC-ojU6j)>5TnAV&6hpv7Q~i`p|5eVs%6C@!r;5O53V33GWnHI^ zb_yf~50IQH5ClQ8p;GL$`cwy2jylqTg62 zmjss?aT00}_9|lBpBhQg5Kz*$SXKi8O)9mAbx1D}D@_!6TZrI|xXWCt2q62R|C0Sq ztRSm>Eq!hd-Rr$N*7VoodtND&qnP`?I7(R$WH6uYBdWW2bTE@RLh>2bBy<5MP%-z`qzKOf`6+{9<4w>tvqAzen5Tk zJf>sO02<1pbjt9v7KtKTGHuGLt|RgRa(bg)mz%=Fd)=<8f1M3fzlqm(Q0L0C8(0!WzBp?m)*M7P_(|n8aqjW_eXP*M5CMePDWfC=+(C z77Yz}Ccrp;AwF4eMK2H7pTWg10bBHMxoS}bhMc*H8t@D?p#Q`NUTL%-Jd(k%BVY^t zu4wA7(B*=qWAK_-h3x+(&l^QxshWneC`go8V_<)Bnq?VLJ-y!;Np)Oh5ixp5*8KbK z1=z)esIkAW1A_6zcS{~s8BO#)kQ&PfN4}Qhk(-m-uOPthDN30EtGefUj}%38J75DC zp(OO;sL5hrVbG3O)4c{>_xsDJC!%`bWbQ0}gF3Gn!vR~5sVAO}8ubgW0MHVcM_Bxv zOu6sh%aEeuxCZROXUOos!j#P)=+#VK|w)^SQ0*bsGtKu zLt4oH3>fmuDKlK^S!vNn2}Ed;<64+iQtqhUS0a*U06a2%>7oRqLNPlHY$I75V)XFpJHS>%$=0_Z!>vY)7z7}l#RDb-;n`m6F8{?PrW zkH)`O`)BdrQNeXMTiQ=W@qZZ!pri{fz$Y^kVWa;v zi}*8%zu8I(57?~lf$hxyF^Ru_jF~}gDB_6T{qO(%kJtTj4E*sS{5{C;DKgdqc2gG! zBv1V>UikN${$D52t=6Ni?(TOl*nw*XO2Ywv@n{6f<@Yvjr}6)5qEDw$#B#aT-9m~> z1^u-`snDCdn;$-sWsLm99QtFNDe43Yo^qd9#(xA(K0DOO_mg@Q_haJI(}OJgSQ!EX z8KfX@ss2=7ztN>*57#*&HhoM?Ja)fq=CiQbk`eCjo}g$!P8d^S4xx)Ls8J@;4d8AtuC$yKa^trJcZvm3!p3 zV&v6N{)<|lNavDSZ7Spiv(OmTztHVfxb)oQc=W2J?D}tV>Pwk;C9s;PzGj}G0MR<_ zU;ivcT1`>^=Qx{B3W-HahlgGu-TNS<@?|yS!PDS8|e$4|8i`(A#fTJ#~ z#Cp2;8hy&TpvJvBufEH~gMM#f!SyxF7zskujDntH)C^D7h)p?M{?7!J$(-0Cm)DZs z-tlKVGX@q){Ebgf@iiOrZ_OE`Niry{K62~(y7c6oS4*p@2?zSl5fvkvO`m?6$tZe$ zB7L}+z3yweO3R=j+efyD4RF-;4vT*z3nUTn`8O889|7XNKACX9ZP)#`hysqaXBz*% zW9{F5qJL>8ssE2U)&O*nw>`4={&mUwB}TvGk&ZGb&FbE5L5!etzpmK~+DEdV{_u+R zy%?t0c=I1)NouGQn&_?6C^^4Zc$ra1xKdk#tky3o8tR5N{}wezl7tC)4qzi zaz@uuDkF>N?Hh{cXWv)N12#Uv*p2Une|d4NwsV z06gwJ_ov*iP4>Hejn;YIjOEu(#!O@Av&vqX+ryaEIXmuzJ|&9nWbY=YYa8sFtqS=T z{qm$7xPkv%d`@YL$HBv$(PPzFjip||K#&eP=P+PBe>3>b>i64(F{UYBcOSiNh66HZ zQCxGciZdggaDTdAe`=|+0 zzSAj)Ndq`v=wz;Sc3Q55tXBQndOCgdeU+hik7+V7Vmgawl1}dg){!dz+39(#G)|dx zHkJ98_G(P=Vx5Yw(Je@h$DM>LB3 z>mNV8dx9?i%hLQsRY2qY>nTVRaC(Hu#yQ{p>g2Z?e;w0p!0-HCa+W@5^ZRcNj2@ z2$d%u>$Y9R(LuQ=@~B3-bl zFXO_dS$0-A=fI(2mgnK zzHsffrU_TLjIkkPYf@>jKjHTzaK#BrUd%bv_=65Z?r*m%(-EQA_MuP_$}tRZDQS=n z+^gy7yqvan0;7ST?tK3i?TC6C@?pb%sbuS8wN&>#p&hSH274)C;=i}JQ$7fR)5t(2 z=;$)g1cb@A-Ewa4P0HnT+%rBypU1=r2HxKTId@9z@Eae+PMI zp*;E}%PZ=fM!*1N4Y&cQ92C{fZYK!_lyE5k_z5YR1-f0e5y_(@lldYL7xD z07}85#&IIg{^ORUfT=8}Ud4AK|281X9FJ&^pkgm=I?d}%7MF|K8q=_2k8;oRwRH44 zu3wccRq^nsF?2sA=`YYx8Mtm^-ujr#kZwxPeCagN*o_o)bzukYK0V)!i#D%W*H;3P zztY%%#A~@%TMW8z{hhc+GT1$cO3R*Jz1eV&Qup0QD!EgSaC+v$sJADDMF~zEyGOqO zsd_-j2hxP>g!>A{Jj-s5;Wq8)KDl9{5b};BS8pUZ$Fw8L<-EM3-Z@#GI_SX&wVXc> zqbC4#QDHT7kA)QwiVubd*@;CjknMe4DSX2}ng2PKfc-RMYcJ-k*+JRKQO?_njgso6 zGLNks$4rTeQg0#qvApWuw2LO&ql4%J6!gw^WBMR^PZ)p|M3ZIFy=1MC+vuG&a#1Cb zQ+?O@`#dBJ3ZN48ATcGK1e&fs;w;bd+ip56)ucMa7HAcAae_DR0XU_lU_+M6^9`;c zoTeKl0UXU7NEPjrQyZ{mqWF)|_p0e4UEJb6osh`mJ^RXY#O!htA>1=@tWZZy^@r~( zQAZZYiA&W1n$@Z=HK>XYC}ig?>^L8w$cJjVO0x+>VyPI{omsmBH7r$oK zZHUr1zdqb_uHp@N?Hwp~7$Y;|{*n2WxNNCWttwm~Iiw4~5}L{Mk4-4nS4@>LP@3SB zQ@l6}DGl0F5NE^(d zN?)p|r(BR9tie53G5%XK$)1pE9camMI#wMf87fLP{!_JoH<9X)FRGWL&W~x`7Juj{ z;6BY~?fd4So69`Mf9!wr@JiMSHQruNPw5t%tgow@_{dlz;o~T&wQeUx= z;r?ywo1Wm&hQe@#xzdfA=$7#V0H`U(m9tUG;;JlrmvOS6OXLc}doIH_7jPm&#?-`- z5r)2t_}di&Vfcw(@}4f$fOlK~h@P`_@4Uv78QdEiQ}qA%zkLalM@Qg@(@08wo{3sR z^}IwxV|4Vq1?FCRVRNpTaA&wj!aT)Sn1s5i88ElJc6CUhK>Y{g+5i=~+Uvkw!`K<<9IMAHQ zu$9FQ&JXeeUs$xLzemBwoR5&`KfR@Z-f58cunkEBGAuQA`4*u1p4R_-2-Zw0+vH$# zM~ko8M#BFJbKOHz$1^>B5Th6XJYoU9@!m*tx8CWa-@#Vx{x%M+y!*jJ(WSUY!yk=& zJ)6e&_l*-*`cmF2EU`dfVgmRWX}9Ccspjo*gto$CJ51qf+I;)Hox6RWW9BtDlb*v_MW3i zh+wAQ!>7kHri9>ke>+$KpkMDmAOV*HQ}S$3JZikoad1uk1ow&pl8cXhF3EOF8x z$GklCSyUxHX1Pojj1?{qdf1x**(E0nUY1qEE$)J_`?$*Rh12{@V!)?KqMxFDXG7(Z zUUx9@f*MT26u#1zXkrW|kxE^LSuQdOdfGIhEm$d~Q=47wPkjQ^YvR7Ly|>1=R{1=@6t^`h-?5f_B3X~BhpZ1*YcUQq1)mmLh?lbe!_3L~~7BUKiI z+6?fl@`N#N>Wo@gw3A;`2rV2xPbHI?FbPBYZ)YnL>)@(TK%#WEN{^)@ zxggx6?&C(gTGCwPz3eBT`P3b2eYVLguBs-kt7`14r1#lNNNe6Di0DpilQO#km9fte z$q;Aew`&~dLYI?po^COdfn*5{W1q`wU*^_rlqP0DvrY3J#2&EeBirC%XXdoQXzWYO9?nuy&!~Ajp?%ksB%nbkBUUi91828q-O2%s>B)#wE zdxLn>grAG-Z7->cUmW)84LGsARLyz=0IHy2p+9<$cQ3Ye`y1z`{}H9nT1I*@@JH+l zfy9Ry8O@J1zuPMCA*rG{KiCFiJ}GRE&Rg+oXQA;{mZ0L*&hTDPu>F+I8xuuF*Yy|; zQ{E+>Y+4!(gD6l64I?_W>4m%0Bq^*yQAe%!+#$t%?oegIh)blbhswp6SzYpl zsZusJ{!*J|W-VpyPNcs<6}`>Cb@kw$_=z2T=3;zlF#SZH7Q1Mj`$hNNcO^R#r%pNy z8kWlujjJ??nSv&?OjNx*i=`}nthU-Eu`kGsH+`1ubf-50ZsgIg<%rmAEkJ1IZ{M}=J#HeEdIs-gtu$m(SLWwp_)=R22Q+Ha5Lhv-SrzV(y4M_{mH zY3v0z?;MGGB>=HhLq1|oA;>5pckVuFb>u6I(H2TKL^Kr0ZEP7aY*&e>>towUxpW_J zT~1WXl^#$dhyu~D=+Mxw1H>bGgB|opjv%(TSG+Zj)}OEaN2Rs?v?sE+s27o-CP}sG zJj}}_k$Dobs)tXBJYIVtzTr_Paxj~q#6`gj)P)qS9YbKfXh{3o88+I+t&G4UN8V=~ zF?S`s-b4TZI>Ih<#1=|p{XCnW!i$4kER$F=z4f(yw;1RAOkhnJGJ9uArMiWS?zoEw z1L8VWYU^p|N6ix^f>0%ns!!9}Hss1DGtG{&CJUk1Nmk)iX?rmlfUl!ZT{_b*v7xrVe8MG*JggDh1x`grcnOEJz2K_W z#=d|L(A4Ytnm6^8|1SDKC6E{$ zDX}6YYH$bv&_x!~`d&6ymQKLDvMte!5nSmnEqdLoCg48B_=e&@YskuhQP?oB@r5PbuDK?GEz|cn)6jR+-_l~O zLwb{=DJ7{Dkv9DK1*Y0%+V;np!WV0mY7+6GV5+Qi5sz4gX!84E02YHKl9l@VgsVh9 ze}tABc0%QzFI1&9*L79gQgE%FEkBiMyK<%X_%qK&hn~wOcZXL-y5Mxo1orM{9h10A z5b|w8xrR;bj(oWR*de|8D7iTC$H~#_(jtO{t-MulzRxDJ8i`|{5fh?2F^MK#L&xgN zXWaoNd{A_}qq>cH_P*(wW4pJxJ)4OSjBNU^O-(F@QT=4ZUpy%rCv|alv}9$9b-Glk zR&3^W?R81T!~yL}5@xwl-yGy!#s>G!>gjma#R8L(S+ejPxO&~h@8F^~<1+P3bmNd$ z4D({~Zs;wLXP?PT+?!FANG2PiA&wkPiK_)%S4hXeIB9J{@PuS79<9UCL|VVk=aVdk z=nn%Dv*txZH*|cSyg}%Z^gj&Rb`$`q^WPDAj8r8{4+vUgBOyr_J3b}5EsIa!GYQU^ zB9@o9*yJ6MeF)7I=kE3QFs>drJWW#TL!Y~*y860-cGdjuh!)qe*<*ttz~}(LNloZQ zh*cjSoF55l7=qZLrN(Mv+gJkv6E(=d%P@nBCtFGdR z&cXgAsN_Mk78i5YcWraz@b0eh_)p$2@@|XwCwwq6C1ctL$*NhiA%vd10Iwevu$MSV zbdN;oJuV^hr*UIe**lBOm_6b49Ui3<8L^I74777Ukie9N#j2DD6q4F4h82SaC>T2(wr%$Ml&g+-BwaGE*~N>8UCehn1V)nKQ5@24;&_K3SBLZ z#;NkypR|g@^S1phGb1gVh34zTp(cGig}do4LBcp?1A(mt=l%k#HbUm>!{+^R15G6a zLWfy0VgvoDk1W&^HAo+vkDZbqHmUlH>;_``ozc2|5RGI~BGuW`DX)}X8OUVG?mKxU#a6R7 zAd7Hn!-2D`_Ro2~Tgxu972bs#$zk7_=Q56yCL2Cc|D!`&xPn5$XCj-k`!+pHKJi8z z^WwZficD@Mnvm65wD~z$e6YftGN>wF{*X!bdZKPj$gO^Vv)c`5-PlsU%P&B8_EKVu)@d>$D#B+FvkUaLWPhkQjr6?XX;t}EoOPYQgZ7)XQ~Iy( z`nP{rcT2v1Oeo;iEme6qo%k7jF(#NGR>35|zDe73(56zX>8;M9p@|1i&uEhl__J@g zMc>f^aU^EY|7ia}sRuXkB+hhoTr!j5sRUED!kf?c*`s~0E-!Mmx27|+NPP%8lP#({ zlFEIV)z)ju!&1h`Yt|Tr^OZBXVW(>d|Gw#JiP`Fht3*Dfy=CG*6fyH37}nYPvgI2* zL~tmJ!3)VZo%&K5bk;?YEz_lbOM4wlmseu<8?-8GtH-Y&{{{t z=g9^ws(~hi%HoqqBh|`)lnoybi4)OAW0nu}T}r^ozn?&zB7-{l1A|+D+Y`0g%LFPg zRak!_FbEE4%d=s0igkMTXyU~E47pVs-`|n7ty5&kihu`XiXmpn43%oOT13E~8{+Y5 zX3gpa9A-N63#RGZS3EDd4va1#f;dAk^MnV{&P906K2D+T4akPsW=k%U{u|2zv*fL5 z!#U-?HSZ6Mc)2j!OD*z}xiCA8Rs1^Mn>@XMH}oIYh5b$2oEv<$@;pE zs3YZZQtZDUZ&YVaN!L~01$`%Wc|I#qVsu+912l880Y2TOB+CbUe+|PN0tWe~w_)pF zStFI3c3CJwsbYPw9tP$ZC&x0N^s===)-wiA28#pjEBvfJ13{#jW~qaCqA$3{K6e5# zMwn!|`ubQ{E4%xB2Odw@ILCfYKF&1$!@}DQo?8|KOB>96se*A|Su*ClY1i_2vWHhU zV%0qvX7cmNMH0@2@{1aK%{RMvAJ`2A;}X)k<*cUNbf1v9h$8pOaa*71Dq2}H*A9O0 ze!doFgLA{{$o%egaykMoDgh_Y1jU+qs!i2+#dqQ9(V>x|MHf80rfPD79*Z~sQJ6mu zlptC9EGQuqn+SI6M9+0RBm?KuaIG3GE8Bw#ZI=yYKO=OA*%XiWI)EMhBh#%Bd^K9w z0pYPf%c#7w14cSDLmBJu?H^>F6&W-`x@#amKwn>(7=9E<;T8Qx%zq95A`eZMjEkPf zGHoja98-MI=uIY7UF?8wL3=uA{jAan7b0ZpvDx*K-@*bu8x_{9QN$_r={;og8Pj^` zL-Vfof&LFT$0xao61cIKsx!vN$jKZbyb7G33+PgkBBb=}R+GF~@;jW_s4&@~I6hVq z*X?Ho_0BH^5yX3(;V)mF0{%`4NmcRnJKo!0@^eZkCTq>}OeHm-eGm&vFjcngL`kJd zeF=MC#hh&H5o})p*<2-mYj$}vj1GL72ZDIbUD=;N zR@EYS(;$cRl5L^>q6M#!G{=uF6XKo*Iu|U!T`T43it|H3nD6Gg&Szu}tA^jPT-6T0 z^RP}v7MYRL$2AXq$kNe}W2e^2Q~Uh2Zakx@oexc-ZcY-RZdc>rozAjw&XQXz@e?NQ z_3l5a3a>=$+wl^S{5mEYZ71bEM>aam-6V7vga);D!YP?-?itiL;Ip3iHytC$rMkPj zml!HdTLv{$i*I!lmNu=pY`jAM-o`*p!!tr3w?qtR7BnpNOsQ2)WF61xr)2!9u8#eA zM+g!C)Vu`ulwJ(xxw99}+exaO>?=*Y7_9+wa{G7p%KNMh$ra7k?ST_4pgV=&%1(GH*#Ch{+Fe2rE^QL~OTt~C+ApDnxuOOZTgK*a8g*?A`_nS0BF2tsUyX}_El)fbIIrad4 z2Tk+it0~J2CU>BxMa_(zcH}??Z-;+X$(i5xa=D(!+8MhG_|=+Bb2}lv6O=k2-mw|k ze>?10kF)s)*LZ?ajj5dJ`PyiC_67O=QRsZ@W9XUcX)_LO%-g&Gn{bD6_w#Mc*`B+W zFV>Ke7V+lt37)0b7R3uMFE7K5FC;dwIP)8?z9RQKQusev zI@n}_Me2_W3Jr}*8qe601qYhacUu9c3~eO!;$FVF>*ljyv4NQ!9CS|=rD(A@rJtsx z{3DEpbHr=<4sVw{oKNZQaN!cniU7gTXeCbY=wb)*2?E)8Py+?9Sc~2xz$RMGg4Q zIcjIOyTKQnlZBq9nutlGIFZ4rK5p^J&u&A~)>7(oFT;$y-jgUNT8SoF zZxqq&Y-J^s>eAb6x+tnp?!WK!R9PI9nZ_X?pX(YPXge$q#g;V8_A!$d(0$tpt zI_^!Xgw_4L@cueq==83q3A`Z)`l-?{T^OKkR+=TUFb)x4;%Q3erkQND2r@H*5sy?(UZEh7C$c zw=~iX0@5wDk?uxHy1UuJ8dv5qJ9e920y z(iZD^HaCHzsIoU|HY;n+ZvMj#?f3`p!PXdnEvY3bM``570cGHrWo5VK^m6D?>i6}- zo4A7f0{ZI7@&6>up?}D9WgZUcIE=DfaVEHD= zFHjTNBaw)_x{sQ?7nUqc0!uk=!e=g2`- zu22ss-*~6*$igy!bh<$YbW?Dm>)<=6SvK;vS55m^V!Xb}QK@O7l47$-ogvZI<#iY| zd$i}CeTRXdN%$01W$6=g&cJ6;@U|a{^`V-@s_RUi@+O?-gQ%EGW!g(zF6+YoRm^8+(^?;xl070wJ87(|211 zSP@}-hcDxkZfsIF9?#ou73<5$7rZWfOevZC^3L;uVu&wHA=UGc8qekYL2mR`lgSy8 z-83v$eeKz%D@AGJf&cnNnDoWb+xYGwKXahcZRfkvis5ssX_oIb`f2uhx%LMip7pGL zyS3m~kIp?##@29Xn=U5XjWCem(5A1wmY4hXW+!8Mi8s<}*&o#@BBGQk0f&7)%a3m9Z=D-9Z^G=l_;2a!;M`36@$BQn(dFIPYia)0`32{J#&O+7e7fX} zn+l}8JAT*kB7GYx&%(Nfi_NY3GJZ-MSf<1RDq^obvCByFUSOLzWXuQ#(5hTt$X^WH z@sa>}^^e&fZHyJhdmQh&59d1Xl`ZF~l%{S(her*SHqzHM##X;1n4{L;MXL~U6dsNS z`2P5nvmNR^-y0#X>)9^z5s{fE1Gi|lLWo&CJZ@pR!ws%SJ{J@IXJ#!K2R4 zC9RN#5e{x`yTEvNFb=cPvd=rukH3C38}-&}+uX#k9zvYH$!XkgrJ9c>6_a|{|2mJt^fYu%G){4r@>pQw|ROJnW( z%%eqvo{U?cFQd_h%J5x_#@*D3#xZEVn$X_hJ8P3J6^o`kY)HWVI=o_X_&(_HpnmT= zP)^+Fd*aFAF_w&KA%E)Y=)PnNpn5k7cTK|`U_&|wJohMDOKB!Z`BA02%QIDJTrARz z+I+WoaC?-TrfFLcHg8wS8E!DVhE-&zR%;scN~=tEyi|Q>3Wwwq2TT7*h^@)(c5NK} zh@_78_tp4Xezn!(c@66;)=^E9Cn3&EwFh-ujY^fNYd0KStEFnpXEfw#P#Z~Hcsye> zc_UKO%&S<2Y0p42_llFik*EalC8uNF%eh^T6{26JAZCmY5s1(Jr{s|oEZ)laiqbuN zRCY|O7PIkqK91py2X|--9vm>5;Ea z@8=LlBVzj>u3E&MoF>yj4r!4|WO!<06A7kU4O81!4R)*IvnO92o~WK(vT zW-S`J&@T;D%jlD;)XKHRy{^&7q z800#4>0vHa(|_~uUf%ts?;wMKCkqOF6#h>~<(~t7k0pN$SJfgO7xhNwpKSGKGrwL& zk_|3WJJ1kc4d?}0)`E2(h*e?=5dR(x`H1dvvKntBa`8mQYRUFNDV43&-z)et0SOfF zwJFk-^FUA_100Uru_r3|&-*byLW(ogk+acy{yE|Ag9LibfH)Ay8+(#w|7rXEdHB~Z zAAp8^0dZLQ(wGVPAD-|3_fwPs9v3oP*Z`yZuM_&mVg30@LU+HtV13Hy|LxGA$E3hE z{%>LT-{AjF?7yf8ps}fqSS>pO6sRKsyZXF%RV?B%AwMJeV3{^AbuUAp-pBle(eWst zUnE`ZAtARsv!7UEVZ*FuzLqLEkX>(_tq(AXcaf6{M$U(7Y?t4UF%#m@ z($mLbGA|3O{9G4NQ}HADj4|2ZSlD$gCo4 zV{TaKa~;*0)I^cUs|5{7ol!Qg!SIi`Qg;Ue@!4G$NHU9%LP5+@s z6F;uMW$#koWZ>`~{0`VYN49X=d#83c+|FSR8EyibCa^TGdBC=2dnVq^`jV7=bx`3K z4<)vosX`?MY3qwYs3Pe!YX%b~bAT=Y50F!C4;NHw;Teg3wqcwhQ6h9Tf}^zIP)Njd z-VebZcyDKZ`Go0eo(zyC&ipnC!WKV#q%_J63O{}>v` z2pk_HqO{%rCh+0FLTLc2tus?T{GXKMZ?&W^`2ayQ1RDMPUtINHy6VqbhNuAjaTy{8 z_se4VpB4zk#cFwgY4C&mHzN8!Ef8{ytotB{&p;lK2>;Woet*{2KJB<1FoEAo{U3(@ z-?9B6*uN}-PJrj7qVbWvk? z^=2jEu;?a41n zcHRq~XKGd`*eU{kf>G%EO3gcUUPpcG!Q-}@&QaKu=KnSc8DBv7X(&I5kqdxLJ*%le z%zP0fAAIp`DO#SY+IGk+MUtm`{|G?ABlWyIJ}|o;taR{E^*&qhZaxV%ylj66HN^zy zc)hz+Z)Rp<%3BzEg|ZYz4Sjl7D|D>lA{+22M?(KM_dy*f(idi*q|F-LoZsfWqZ3W> z7zr0oDJQ3bB2PMMbs;!t_7dHdcOf}EM}b1>Fk2o(l~AO;xv0A9zGCt~A>x@##3)tC zog{`wc_B?ROGOIZ+^p8>YIN*EUy^#iW=NjyAAU`5S)@}D`Aioi*7-)r=qxoyl zctDqO^OY{r4)Cp`j;x0dnGriVR5Rk)F5ljJ1fsI!VV}^!6Z?zB&qE2UNqMLqL3QyN zoA9^iFBQ5PgZ7gpLGXC|+a9mM2GKwMM9uOzp_?JZPLF==6)W_?O`Z@f#&OV7sLiIE z<1&IIVwkcShBYY$aLA(BP?6% z&hSuc&s8~@z3M)VO;=;|PCws22_KNj`(wQAaD6%Di6c#^Hbh>W=&PyJkhM@iDwD6Ipz*MxqrV3(*`hN>6f5KgT zG6)wxtQNc@vQ>9@xmJkMR>QOZm;Ql>f*jsJ>CCSOt&6K&yuG*5cw1&351llB0*#^`AqYKaR;-76w$=>|nGF3A~^`%7Lq?S~@cye8;n1Za(-{*)|z+uuvuj zR)}`%s4XiGDS99h^xDdj2Uc(ZWcqzbHCYQiBMJFOw$*!)mb8O!VSN`jb8OB7A0@AN zRlx0lUiXR#!&!GlnqCX41dW8t&!K~bK0?y#h}LcrOsw3iB4OuE6U7qAGbL=-^nNQsH{7F0#2mWMOtG1(Wdg0c!OwHRL7o zHqRpPxyH#NttX)eaz}G1hmGGK1q69>nR>XB-P!I39F}56D9-DIS46Djtiz*qnFjg? ziRjzbD3TjYPvY<$U!~YX;mA`Y_*)Nm3qQZM`O)%;fUn`p@z#WlL&P-orGUQAq}cl_ zUGRBg2gV-P?!Z2i-AcD^`TIZ4{NMJ297ROn%}Z~*)Yp2x%_=p5K$eFP)8Pg4`*jZ7 zXz0z;7Yvxm0E>Yb(jDXnR0IVGxDM2_tVSZ#Y`OGQENKOZ4KCsJ@EJ%RD84ST_ex-kBWg&NZ+N7tVjjl zX_BG_5aOK7n&V&6^5hAQj*$LkW0PVHTI&@xH9K*6cxS4TF)GlibM`TLn(V)TbLn5Sf;#gHja=fp$VK^>Z#C?pf_bQL4IE{a3O<3OD&hDIP zzK93}m1D_KJNWuw4z4;~jzD#9GWW1O$J3sW7N#Wz-a;pKiac&GCOSj#dAAWJ#~9$D zqUif2)%{$%4HK0OH~xuUFCBSCYYvEgAa6gMlsg=jW;FNuo@KAs++^86&|o{$Y><{w zk8D5E3$1C@WKRMHc|$Sq7PZDJXE&3MAbf< zJ

    kHk(>-ZEBYL_R3hihU##qA};urjfY41(WOI#@3(r1))#Z+71Gcy8Jc;Qv(RKu zssVazdz^aSGvn#ZuphnQXnIl=zu0Vtoe zUd88pILD%uxP0-z_HafGt-G%N)`TmcUtIXZjP4SxCR3d&0l&jr;Yy>`lL2NhmSuN4 z+Am5&mS~wd|Lh-RT5?+^uz&MaOy~f=9V~rtUR(at+PeEA)}5JhKm+Ye?hWSK4@<jx*i@SeT?Sj4rgZSNFl zW^!9;5?fUI8n*p&Tf}T(p87a5nWaXC4Sq2UdeK8=fY_AxBksvP7D*`1`S!?^-Nu)b ztUaEXK%(+gwsLvx5!42(sM5T{F_y-r@5|fO`J{^#5#;1wm654`#5Q%<$v)0d{f?O$ ze^lYo)k#FJzoUM-#Y*%(o7bd<_4{%{C4m7aqK?D*ugI>ng{Y-cF_$K2WvAp5fezfS z`auUItBAk0BOl^Z4bVmILYr(;m zn&3c-U;$N1Q8(f*W@0{8POyB;7nwm;FTU8~Nzp7*z3EHQ>u$XqKm+6>Ob0{(zOS^ER2%{%~RDRpItnf`u(M_{&V9rv_3r^}>FJ34YLUvdb4iXnRK)kcpu?$*N z1b5s+m#a?i=-(prEp7xj#TNZU{T9mf;+xV$_+c&!ptKBaWU%4K#w>GRfWC=j#NfNN zCjs)=CH}#NNC+f7+=n^Rkln-3f;x8lVPTfT+aP9*StJ3Hci*^R`9`Yy!yxeKdy6bcmlF?D*L1CWdKW(zmU>9DG|)Nr6Ouqtm|Iif^t)8%9M>)}r>-}# zx8f%ia30EbV0asA3s0Vf1PBd&?oVsG zYIprNPawB754pdI@-(2-7wI=}1O4C1x$RWPLaY;jZe)WFc;ELX#E z_tNs{SB5M!3hHr1PV9VdGCl4V%&)F%9j%lq!cjw5E zYt7v1tVWptFU9e2TEng+W<#k;acaR3J#qgfrm>rT&R?wt1uuq-<`GQi0z8NUvi7SipsV4A znF)md5f~)@!DoC88H=(TFsF-Op+4t`*eUVAE*UvrTz2f1?ms_tdq||24|}RQMqTB3 z`e-PP=llyc;fTS+Q#B;#5_;9%`BHZ)6_I%}&`>MZ46o|jWcP#stfs}XOdbS|#GEHh z?+XOW>in0iyUJPRnXIH=3S3{Jn*0zZJ0h|;NP@63jK0JTd%`tYzZfY~5X4(EaZ<|3 z_6i{opPw{au)?GiEUm_%L!g7tkRAQZrPlupcQ@TR3m5x%3pWmqd~EYg%_@3+T}1C{ zx_^M^jpZ=hij5G`*OY}z*`;nPg1a5RZR_Ntt3ubZIlsQ}qpSQi*Y{kuEqK}^k}-RG z#V6^*=5-mS1pi21q*dW28rE(iD zx9UY()ATMJ!o&}X&T#w|vX{Tclk>t|ali9+-YMK6Dn>cH34N+o>f(5nMmS_?sveMu zwrOVR7dw?6W}#-J+;6e4n+*;}79kPFD#N5-h?Ez-vwi_wP!hj~K%zRtbL3MX7pNlQ z!IXXSyh#`X3!5iDS7Hti1G^;NM^eZ-6>V6YY?GX9jiI^|TWMsvsnn=EUr+t9`0?mE zTz9EE(5_3-v5YGhp)RRHtWI3{NK3)C$8L~vWJGb*?OuM z7>_uwe*^9X==%V}&t*i4%vCXIH8n%~eICaaS4jz486*l!n-+C-7if^Y6?79@)VmVz z=c5zsdvuEhn5tKebh9-B|?^ z7)U7YArhEAg+jh$dbtxc#@U+A)p91+jx95)`s2dKtcIdjG`3h~?~xtM>1$C5F8CiX zb+5E>Cbg)HP7k4;>^l@1EYgddjqq*KqNw+@!+o;@_sm_Fe6+D$@NEuK z&emdakok4@-iVTUnuBTH)W^I#o3pO)7)&=)*P1nBA#o($LIJeCu=nrn!Sy*Bd+-%X zNf#XoOIlCzm7lfIeRrAoAoLRH#(2Uo!#CQq24U1K;_Gc&WHFX^jODTy3YF<-8%J~V zrDaGg`Q};mc*G6G+Q(Lm*1^r-NQ@w=WVRe3m&ZkIWOb@*Fr4EZqDUSLv1@S5nJL}F zw_mf;53~;yNRwm6GIE9SSSMXVnCnqE;_APBivH}6S3!}4uW*WM7y@VFJgJ39jP=>5 zh0%7GZ94GVrwUqWDT(DNvyKYm;wfQOG&vC<(lvh(`DW_QDZf6 z*o0;wL^pL}RugO(A6cu0)=5Hm(Xn=7RJ89J)+I+x3DnJ_!flY&%%gIcEgD8twAxtl zIgaE;u3Waz_l~Ipcv)Z08)57nW987}E<5sMQ+g9rcxhwEjNRlA7VedL**_z4&(-0@ zTzu;^V;nV8t3;Y7Pe#Z@`dTz;B0B+FT|*Nv`h*?Lv(TU~WDVf!_TN;eG4ZeAqpW#` zj^t7L;z&GITK1a&xP=J-{G)oa19pF*jS*!a2VprW@(L1>N8wW{kFK1e8xXk0$qOn` zlDa#?D_@~A-Ddzj0IWlZA^3eQJb8uF{4QOITcXl9%o_X=MNWdst*i(LF z&62#|w{hgifcKf32I2lTvlAdMO?&{s{PM$%Gof*+94&v!mq_Qo02biOKtR5e@U+zm zSkzo~xe1CRf`I&a_L6P>Pb5M<6)@0Z81$Kb$BGU}BINp>s$N`GN4CLruInkgm7Uq~ zhzGL#oyi9|#OU6yc&KcwS2D^~0$5;8r7Pqc3AQj5d{dNPCjx^2kP%Z1CfDyB4`bxb zs-2)jH1tbl>;5Q-C7Plmpwdds$hY~XCnDDPIRMsK-BfT|=5Ugkja;qk})Ryhp||Jl|jZ3~IGz!kqL(6m{CV%u$#Y1YFhFZ3;Hn`FS6N2+ZtcPN*cGvRy71gledWQ{0Qd8OUvvR{pBiLrqS4l)In>pwLa!Uo z+&SufY*cu>1iYwvX9H?{!~T=?1;O$pwm@MfWIU>yy!Wr3#`ps8PQ*U2L~;*|>~LRm zSzKV=lG>lL8rh0_!6wU9eD4OCL~l#T+C? zF6XJppb_=?h4EGo>n$i56~uasipNBLE6&L>DD0lb=gC7~WOJAfzRKBM?aEbJW3iB} zN7$5<&lM0v(%S^^O{`)*ZX{#hDVpzCpZ>mT=Ye^z6jY4NAKW}Wx;Y7=w+h=}tM&I% zoGrjd?t->-N0Kc^n4gGIPM>R@;4dSq=;V zuZ|Rug36dXKP%Wm487W|A2<>ZB?*#k9^3!ii3>cAHT)2rn^zO`0&Y(L*Zpl^^&?z< z0KxrDsp#M|Ncvvskw)(syGQ5yB0K`IAE5yvU{t0T&(|d8p_yq=B zyE+9B{_=o_&bE~4h##mGastnKk6iHH0O%KX21q;&O z0vb<}`xNhp%Wq<({N5EIyP&nXzzsX#o(AIqo-dH?35 z@8Lu{Nd(Hx%MjuqIh826$An1s_yR0wU+~HHf8v<-`W(PptMmLlb58DD&4CG6j_hq# z{6j=0k4c1YET+Rnq{7to>ftoBvz4j8y9}HqMgrC2k_l>aVgFiB} z8+3l_9}@C_ksJsf`Im{&`~)rW;&FUpMCg31uT3ZV`VFX@3>$3-0-(VSp{V9JRUNLS zR`Xt#-mRJ^;SEGAtGoo--!@yycDuTXFLXths1)JVtxs}0+4s1L2QCXY3dlB{^Rj*K zghDRif_&J!JoaT_$T+Kdiwr?aQ;vTx~LNT;&En7N5l(3&E-eZe5`X(lX%b0(7^#d z_9&9yxVsvY&o29CO6#WDK7Eq%eaCfgc7|oAlDd|Z*e<8^@p)dlaNBl@;E-~VV?t#& zIZP(W~igSZfw1aN1h>eoCBgzvB-uw zc0ao{+|UQZAx1{oj;ao2oa1;0e?o0GEv{vQ`_I_n7e{R^+hv=Vl?}=Nu)5E0fW18d zQgic?P-maWBFtV{ln9;(UY-3U*VD^dPB5^VQHTn`z21xiRYvQKvfIAkekTPKN&Xj) za%}w;$xvy99~p6e;*ut#{O~Bb=&vsT=mg*=DN!fN9wT9z8@kKc& zLp-L6&%{|`hp1rp5ukE-!MV{FWd)bLlLl0JY*wl3c$!Sv&t)Z8s1mM!RoH~Vl4UT z;t?lONuxS!`4*w%ij`msmwmda>z~egBF*-v*5#K4CfT>BU1G({XsFyo@c&MIKo@-q zPjGuwWkGafIk~xe?G#jWc`9e-uqI25JIK840tN%w4KMNd1=)D6@~6fv1!Z9|3~E$r zm+mHU7WL_A*xELdvWxp5H~=R7g~hf9LSQu;o#zL_Lh`h?ra6j5bEK$uwk3uu`wN_; zvO!s$pz+%sBWj{&*F8B9WGfe0m53P8l!|chN~rVSOm**-JOD){LddV=-tDT)f5E->=uRO^6OrZ}}q$t}- zN+UJCE;E?O_9fW${_eH%2wH=w>bwbfnBV*c zfmm!~Wpe;uiaNrOQV&@%ZYP4@%Bw`U6OG$`#-uo6Ooflkh@b9jO3fP*62PW`JJ`pB zk0g`*VijFP$jN1g!KF__#II7-aFPA(g9f-gwPoCy3Kr*_`<7zy#F#>K>Uvc!C`t4` z1VVf8{VIPD`CVF`2CP2yg zVd#4=&|kn4=-^UuPs9totST6?0IB%dQ9wx(>PFgb6Uhu{w0b7IiTfJ5~M`A&0yLpi}*tw<#YE?ZcxUXbO-U3ft&qY(}VYu zQaq=*2)jY|7yg&xP!qGkP{QvM?JQJA&9_7&$D%0kMvs*{u-{xnjWJ4vxBpG`zjq>( z*mA04FdMFZDw0(J@jwTQ>dsVtfLjnbG@6=S$kO-RrX&`TcV7C)2N3*_iR2?QXGJaTI=#|0%)oM}!L{xAZTt3-k0tFm^SYIS1d( z3jp?U)gA8496?V!(+iHJ51&Xe^dE>t`jQg_Nu-zau$hoef@o-Iwlzx71CgO0`?49u zx}>wp4eLF>|0mZ~DNq+!_Q z1mm_mwvYdVYA(Qr)mGRF*%h15I#_ryCG6p+Y+u(H8E0`il<$QD5*3I?1wh^dqdr<@ zQdWCLgUzH_(1AM~RsoaawcE;}ehMf${~w^!MM0iFNq{Yy>(h*SKjGMyRbwJX{t*(IX{VZC9vVjs<`wF?%va(7(%%MY|xXZ zP>v!IUylsTm%R+=H?bD9v8?aLMQv?uGYS$N+>D4U5Cgkalt-`7Ppa3 z$;-bof1p-w7__pwN@2i;DYG{2Xpo~|b@nuBjI^q-KtHY)OcB$l!V9yUQ0;kI8YCMc zgk=WrO1R-6oJf7}2S9?yc*#Lhh2;dl5f!p${_JVb&teTBRFdGQbWzvW*M_~qOB=Io z7V#L_Q{;EzB!GZgBzKp;aFAeti4OV%A;{4 z;fe#RyZd{bzc&%NdDfd>3{CPCyuRs+_zWfDgh5KOI3yclHF_@RZF+~@Ep}a=js?RX zEvDLHw~X1Dsn%#dH;Y!MULzb5E9Xmib|Q&GB*jmIz9M{r-#s0=#TyL`{-|FaEJD&4 zb))t6nL&h$wVPzQoQu#iShwCMZpyOg*BIu)m`~MNl&X}WEOTEU8O{kCAPbNRrrQ(1 zUZW=UFn9$?dU)yQJF4^ZTiaA2vzSeaK6)%k$X*fO)+S-M8)78Wp-&V6{h&S zUB!PgPBC>!5Vn??LpZ`TZt*`Y?f%-4Di;$VcR%R)j(1u!1NLuiz?P@vJezS&3sYg*V6x8 zI%c8STal(pXbsJK?(vgo&3<7U^fPabnO@ytVoU*esl=Y2M_%z#rIKN~S-W|gXx!@L zeic}=itzlaHo6|VkiYy1p`Zr{dvfp+m9`YJhLlkoXn^B25>C@}iK}+Eo{JGON~km! zj95$PQt$@iEJ)owfaOkFW`!Cq< zT|T0|GIET;M9+6`jg$*c3RLie7@HgVX+lUi!Fg}%7K^FgDo$M^OpAX@8VEE^7D9yD z0A%c%x8f9LflzNMDwEG`VN*kc@#J3$59mCEmFGQTmVre;Mh%4clplpJZHJ38QIzb1 zN1HFt_u&yS3g(SOM70N=2%NV|aNR@T{n;|}%Wu;6*AcRZ7D8J|;WaMSKd*%fr&8g) zy|9G=-2q#YAjW=N!{=#hVz;e34LToAG~L%*hkxXJ*84z#{vYx`izFg}I`r1IX_QN^ zIWTW#KMpHZrfU0Bc4=FC~&=0nQl@@@V6^D)st|R#ns0SM2a4tQZ>e^E}>T^n6coVwi<0d){l8 zdr}> zn90kq@tj7+^j+~Er^RLktZOCku+$0VLD+jJLtBl%}h#82~O0N{^Ev zq!F*aa_GW7=gQ-jTV{uQlCN#*D|&~dk6?1d*-DAvd62&j)`ojnB9QOeiiK8-e^ zsg4!%bzslzN$kG2=z&^n7x4Bz#{)nBpJ^mqy;_Z?I$pxK7#?ONuVXjO8ar!cN&fvf zA014N1ufo_jOxp5ic5JH?5A9RN{u95{P~8WUd=E48+lR}3iFdsk+HEX=J&To9o9)| zYZr^PgPr`<;4m%Q+R>mS$m<`&e7)w1bs_}z5usTx(oyZS{QKm$v#6P{{|#PX`aq<+ z;xhO_@cBaNYY$mlablSA#6>ZUdMaGWgrS^|u3#EC4chpwL~G-u9Z_B!`m%@}um_I$X*Oz!Kl7TzRD8uL*Dsn{DRNLKMmtxobOg9eRj zZSAl7)0RfT4aj(=-Y)m+fxg*GSko3UyMUX=?f^__vQqqtKTt5 zolespU<>~$XT?Yfk>T%b!J??m2Wr6Q0_Bq{HzozbI8IG#R}Ljsd)}4AVFjd;A{}!o zs#jUlIxo0~1APOz2Wkyeb||lx%wqHHKtlB<@~gM&+x_{6*<#D3j4mQ4~I8v5be0$*X700xdqRn z6VgUr&@I~`vC{4Q`a((*0@}>Tap_LDsPc^4}c3LfKEoaLt4)=6~jHQn(Un?=j&!cP-9UI;MY&os$ULAkqPE2}VokG)d?yKEm8bhQP0+Q%aRq<+fYnQ6$QVZk3Q$YPe z%^y(I~GaBz@;0dG0-nTQ)CY3JKBsN%J{q2h@hdp}!q$y(2Yvgr{{Ma* z58lp#;$ErIu+Q^oCMF>2=!^vMT=^cYP7{>GGxy&{ALH44VtF?rUQz?p0=gQJ+4T`S zt~{(>&_q4cMk0(5nhriE(5&XZIQ^O@z`Idy?fhN$s#Szo3=qBYtIRmDH$W*8wFVcl zmZHWZBL68LAD2HjrooXdKsAm{d!sPMG6_Sck%}N zw#?C*Ml==Db7s-1r`9K1;m?Ms_JQ!BhHwEv$fA90?HLtT^Y!p1R+|0d!{clx!Rac? zq~1hUiTSI2gm)P$Th<{_V$oDEpiIDxo+OR)9_#}wtDyvPG`?`9hUyIly`cb%ZAE>t zT^)iB_IY_n3L&6z<;u#6B5W>hiO#O~pbJ)@bjzOy1Ow1<;DPEwFPpDaBbiS}WLBz` z3NxaNnS?J-MyZEuO`KiVzldZP74@1tJw~_;VWiw~|8YD1iYhJDMiLA^&2h6jp(C|? z?8&(r^4V@O5+OS)i~NOygb4*a-k_uKkNP4>iM36E`Cq^e$s^Exy`qsEnKObT_66@G zro!YK12m2UfcDB&Z3_JOAsf2=a;KWXBY>YXb@&?s8Q=)_5)QthxZXD3;b_5)<-b#T_b{vUsA8#* zI-d#?+RhQg5*e6PMlTUhAB$r=^IXG$vg;i~GpVEbL{&=Bx4v7pCF!Yh$HMC_)lSO< z7Nd`zNh}kcq4+_!@&d=bAKB;KzDMKmb`M^3-PAryjo&J1>OA7pvLJ(5vy~X@l@g(2+IQX%b775|m zt}4Z%GlE5_Y6tU^zZ4%x>c^_e9o5}smnf{)ZopvF3vNc|VJJqpHYmr7du(<1YEW=h z$2s)4#>{g|ud36l&!TbmYX93xKmxzZyr*@)4W7e_TRBMy`Sd56+^x?jU7Sg92JlI2IDwulNzRJb+(Lk~P zUGlUR=%D8zYKrno&{U1}DcW7nT{YuJZN#OhYraI(u? z?l2{fXM43%ZZT!Y9XMK`q(M)>)_Y{JuJ;; z4`uxJ@Mxesjgw_}P|!_6hk1Yg>$_*+%{JB!Rq_4DWvc_vbV%z?VoUnv5=@4Z`8@rf z+qB$P#aA|Xad{=vE)4LUR37h)Oe`x`OB3D~y~+x!O?CUZLFBCUrsyOu{k3ZdxXv;K z-%0-Msrl&SCHD_negx;VW&LJ_<*_!3;OM$#{WXe&(!Itzuh=J0EACwHF3X`Y6>~!r z;bZIBE`zSbDV~wlD?DbyooUD6fnG!Il^=fD-p#ke4QkBIL+h_foJ0AR`>IV>3u4Q? z=D5s;vw|wwga?lQ_Wga9Eyg9dkZcXxLP4#C|Wg6qbe;O_3h zHtz0h+}(NmeCM3+fA`)eRb5@Xs;g^v&$ZUm4C=9@_7y4V-!0e-CyR!*oI5Oa z&K6xhe9r-$8XdM|lu_^7j%D(5;CTOVy&^rs<%+WQ{q1nA>$0C}+J;$%V4l)itI3|v zX3DSz*`WzeN(%KDqR>-{DVKa=Z)T_ZdQ6Dw^SIWM5Ei5=yga z%t~i;Od5SR=`>%Pee%8vBL{Z(!8N~l@X!9XKE_LaE&oDn+j7bVW+m2hdV{?>Z#%bd zSwdOH_c5FOHV=8%n2satqj?eGbhJ3^BK3F-mI~PAS`jsQQ zQQ1=*MKbq;)?N1DTTZ4&bP_@mAm@wK^#I^Z6;J6AmL}7P1$nk5lB&BJ26(IVoj>Iq zz>Bdrnp`P0gD$78>k~Ya>Itv$R}o)P^kA~HgSyEQmf*3<7dSSMmuXwRE;l7;qHFzfsBa-vuEtT6jiOQZzr#YlB)a_3b*+Sj`&SAAr<(%!p@Q z`+6;JX;!-D!rpFou&ys=+3tlWbIoxt*Xy3ViXB`>4fSk(2N1>g;??dmd-#0g>G@+c zq`HsweT)ocpE99Q$~|J;I5K;iqIxWc<4Lnfsu-Q+ziH~rWDs&0nT?-tI^-^SNShsV zs$U^7Gdms4R~#dlZ5#;RAJ13S5rD3w=^MZf=X%utGGGs%^g=UvWVNlgMMzCVmXn-G2H|ynk5O3EcTXyYYUJ z=_=a9c9RqXW(zBNJw!^5(|A2tVx+2y#v#2OdoM%C_O=<*tH*tPxsK*+6G3@*!m;jr zIihyo4I2dYUXLdfjW%^Jh(Pd9ZT*92C}xB_KR@R_@6_&xxXQ&|b(E^!&}Ze)u^aAJ z9mmdKu+Kx+y{B8-6;9AQp0CK9(!M8_;Xkzj_bXv!rhqBM^iyaPvuns0y2kJY=DF(BTPBzEy4x31aV>b#>326b*X^b8{)XQ*Y*)A8^Gq6;CV2d?YZRl3 zT{n3-8j9~Dan`zTvyc+*Bk#1WC2bTbPPj?p2l+>mxF2lqx|oLciS;M(x-#hZceYO> zb)z!TMj!C3$C7NPR_}9azQp*zkFx}doVUMM&a?nuznPY$kxC~IiJy1Ue|pi#WUZ90 zYR&_8t7mc6ZOPO$cG>Q`n(=6_|G zz;)vo+bJta?VoCL)h}Z_VDaNIyW?;7+~t4Ga^4Cf6t#7dE?yRG(EZfAa^5bSp&TKwqPA7VmVE-e})e6)Mc~CzZv~j{)<1F5rWNy%boxl3N95pg?dbH(s6GL ztU!gl31-(T0JC;w&2BtzLQiz8gXIgc=Wql%AJ4S0&5`kDQ`O%@P&x@%jH}xpPOd8f zLaiRhiOiuMZ@%Ua-lIny-Rn5AV%f58H z7AtCZC72=cu05mw1N`(a{>))@fSniGyS!19Jlf*NwW6)=zIfHjxe8VQxqg4>5iWgw zwrVEnpAVDQAfGwAi5*YmDEp&B{U8HZmbIqUf@u|k{8lZ>!GLcIHc5V2)sEz!Rr9Q>&ND4+hZ{z|CG)G&+?UTubGGmG$J`YTU}c~X06SQ?5nK@DJMkmwdbXlvc6yNuV@^N66GPBw13W5CBys&mOt1q-SpiZv(r3cIWXN@{DFPI+P zIN|Z#C_*lW2F#C5z^lFnyVJ)=5O(&9X)UAVas{Y5U1KDE*e*}b`M&B{#u^{YtT~(D z_Q}>s=s43gGWONul%71>K8+l#8`(Il>-w&o<^CcW^Nk%<0V>r%f&gln!F%h_tkhWJ zUErX5JbRp9Uh8~Kuk~a_*M=pqf$O0R`k`}Ib|%FRhySMUxkvjP$WsS%hh4|s#kZ38 zDNuZjFX7ENO;hPaG@k?-lv3(>q2a|rcx{3Y<|%M;?M~v36!XIWqI*iCf@$QU3Fcq$)_?< z&}dMTMTy|3%f$a`v(h+Ley2fDvK^WRL|MxboiX*8(;ClWUQrY?tZ`_Yht^BfZZZ!G zmS;M6=Sw7`P4lGSAI)U!_P096)c3Yf(|&(eaJW+#-dL3cjfE&UsFf?KGAxFf_t-B` z#00#1ucX;FqkYyTDW{pQZii(5HO+D`W@>iV9oB+3{@b$udZJM zAQ+Opo$3|@)BI^^cKmE{@;-HzwvX9+;P+#ie5o8$4Hvt9H@dm!2cA`|nCzrAI2^9J zAI??=dP``GjNM%E7k(p*!~beU9DS z#SJ-afQUhCQZL4Qrq;p{w3aQve&5RDv|D|nCZ?sOL}_b)g>8V#Vl=ISj!~FfQQdvn zdUH^jt|c7_+pxLRAsvi5Q0F>vmwDBcCJ@*Yje+G5d{Y^DDzVOEbAv_geoY97LG!lk zar7Cb=Rf|Q46cy~_(NT#Aztq!&6tf3nOR0Ebl6x+0{AN0RdO?4vYB#LTaNu1Bind^ zpE|qBu)Iu^6Z-782NVIRMd<#qlVXT7fX}7W{QEDm+!X^(rB`~lgwFF$tES`UGj1u#M}w2A zCCu!V+r@Vvh#J35_)xK2hSCcEVrSyRh){v~;LC@+mYj?>0UwK*T-|C%gcSNwZHBJ; z<5k6w;zvG;)J@(8u)?79X~=Cs;?*iYen3t2AVP3WUSnFFJ$12KIlPiVaE)>4vf-x+ z{pg;t#&J>wPdwC7;~tuK`&?6#ZZKwP|Mi~sI%&13O-^qk;qbS3bE_VE13V=EJ$#!r zExWV)&Sybj5~UHP?bEHdwyA7pCA;>B{G2dFeE@<1g}jW#PdE5_#RV%w9+VeNJ{*?G zOK-@JNNKV3pa%9OIse9pfgj9b-~=WE=Z}*xv=4lP>*`mG{u&4 z#fMm%vdWxDIk7Azg`b-+Zk<)zHT7XQ?f71Hjl`9ky zhf}^by0Oz}X<+FycoH&zsCVOf{^@Bw>eT|gk6s%@+*i-juz!4tpf{;TBrb+UY$FhV zEsm&Fq8yTuOlOPI6)_(ag#I95ee3%{TEmO37;Cx*Aq)CA5thI~wrBeDM6IM0woN#< zSYu1nF^K@wUk55!!~Sjl>#oc!)3a+4q-?@~ob8Xbah=X3>Y;Af;U5d77YsuQq4ua` z31rdVss@Aw^=?xZwd!mt=3v)V4L1v6#a!h1GnFuDt9*khrYH1hP|AKm^dKN@T-Yq@ zV1H1h(HC4-Juf@&TAP^i8l>C*U1dc4@w3oo*#w^}R&+CWe+uFTbfnc4CMC(I#N_j- z{6XBY?;eqn?ojR7JshAsrk_hKCg~?DE!s*&Qly`b+3j$@>75sj>M~5wcwnhPSZApA1$w(T~US%CDjzDL7t!#Ya&vb9w=Sc#2PIV9&1 zu`cUa4oaam&0%wrh_bkS1+m2LBv3VlCDKUfN{szpbj3@`aO;kWamD=HnSxy?{`Po5 zdPNQo_k*svewSV>BOQ=|izUilG4x`CVRKqZ(7i1^OQLms#bGN?RH@n6UcB>*D>qj3 z_e48s*1LH}msVL3oQNa7zPgh)2BgljomeHG59|y1D|UyzFvSp;U7mDR&OVyR=S$=r zswZ+m%7~J&BY6&EM@j6zY(fb%9plTi7i{nilNl7lI1;ojAQ)(aojUZkVLf-*`(O+s zWd!-hqA-0lu;?`#XKk2V-*i0jsL$Ynjq(-!3O)Xah&gcxU?ug^|XMWkp?Y2}8u0lU^(IL-Kx@NG_F znnw?1yQ7coqv@Q|o1$Mc{K)kzwHs{7Q)|ss5esvMRXXI|J_NU-IEG<8qEJ>hhs4Kr-dfY~ zyokHnGDO9nKv$HgE&~a(y_i1tL@I49F>3lKV)1CLHbS#xpSvFjJGGm?>zGI!_ZLdl z8q)F~hiAy~OfbG@L7ert5{nIGAJ3OntB8+~nmW!|qmzvIHrCfKpd1B?WrdYoQ>P1CGJRee8%o*QC1jOCw|lbMJ|?-g(sC@g+{0pXOdD8_&*B63#GJ+!sq5cBWvJ*bUp7l zy1hAfrEdc{1{6bkNrij-uBP(EYc8m4+uvFjJXF}!=t21^J|Ah}zx>wEBbP;R=n`um z_z@g&U`j+M%WlsS)D*^Ek{3_Evy)^^HxkhZ%qNt~SUfXzkRion1})a?@W~q(bum&6 zR8hkFnjn@dT!DtExmD;8;K}01sgj*2e!i&cQQgL$tkg(%s@u~KMq(2yY{QbL{PgY6 zR_A=b=Nwr^Iu&B3$gm80@5!lF35(Z53C8?I>WB&N5Yr4xPvsbedAhMb-hft}i?wA9+En&g{0kZm>HahD_(L8bqdF~y#{V0i z-h5%%s<5(e`tH{07tKMFE;*jwb%9WClyZ`))>7#C8#nZmHUW}LZct^ZPoLFX`JuDJ zAddvN$UBzT5N#J|p^BXQWx!dd(@7MKTkb zvx6va_r7+X*y!EsJsQLDly!<8)lV`|aTE2R80ZSU<1FMIvPtAmTSc3^D|U;^-RXv{Ix!3;XbL9w z{YN2FxaE9nLAh?z_%Sj=XP+@YAN=QE)g$lsJpzNSgXy92b!4)qZ<{??%Ged(T|bL> zR(Xyzg`K8Y_38B3?)UZAiyVVK1BSf;P z{KF@~q1Nu+iOb+ty_foUD~|CDC5d zyOn~XtZ`Salys;dcA^$$D{D{vWz>4_Nt1OLH-pFaPndI)KkR3+Rwwuh%9$cxoM)Xt?@Zo+v$B42l-SsMj z?O12jPAZ3*Ky4BUiJ$RCa>d?4Nut-}^-vf()b>fT?o|RZpUoyUa`1++7X#mS8#qF)!B#c&)n{zNd+H^VR0d$j`ox;&3C*_Jo=XJLkXD( zV9)PVWJP1T*N0xAUbt@68_#A|Rxv_bv!u}oA^$quGGGi? zjQ034@_48nK;s~e;E+!^9Kdx%n;54^c`xkz3@-HD;LCOHb1l7Z??qSjsS^&kDBiDy z@wGb%3LOdWwv(Ym(Xv@`sl7Wa!iWneQz__iLJ&r9K`{Mh2Ja~4L8A|E9Yt3LX?n{F z-94KiO^`pql+o_VQmthC9~7kec3tB@k59OWsBZcKkWiw(D5JjdaM5JgboH6=BoDw> zm9D@vMgDSK*?gM6b$0~COSa}DajRk(>Kp%Nn%8c1N?ogWD3GFpaTjkpL7{$#uGDE) zF{P}!we@|F6Xn#jj4@kXh_OFV-#`L%NG-952LG8eve4)C$`P0fiM-H5k%J7_0e=#* z02_1O$hVdYfTqY7ri4N{0LnUn0jqGpwJ1tHdk)n7mlh=NI16Soj?bV9NytoCR(e_aMc6Ov0Gux30! zggbqwG=Wr>YUm5psr@?UHFqMRggFfCua$7PT<_^3+4F-zZ6fJH0oyq>T}$-?>N=uT zdqWU7m((|nJ5RxN5^i%GEn9WmL2D@c19+RhFt$y+0B*D^&^d};K1E$&tCU)PqmWD^ zIm}O6T=~4BF8^>O6?Ep2NN7KoM5|3xFrUBt)ORn9;-_e8pkCKNeN*=gw*2Dn#>_p3zoEZMvwnv$k%&vTg z(}&WVde>d4W(2}=6+k!u@Wax74wL5BQ~Scilr6Z9h-YF8t5KH*B`Q28r8-(_uyDTK zWo28YT$VJepyx%cUR8^BPDDh&BR#qy-z?ada8alf-d#GCe$loYg?RjTdLR$cp9-B? zGeJRXi@|3bCe)0xeM|Z)?cLA}YlrU?hoeDGiezTsF+^BVL-*6$DW5lp)daRn1RERN zHTnZxc5`#9uQjaUPs`oOYf{=Dxt|>o+-!U_e-JOm{Ki%~%Rll%Mt%cph)TB+yLBNG zFwGhXu>|7CcN^4t04(F16d>Dp)zqk~oP#FA4j7p_XNVAlgv}<>R5$%$QpGfM^ zn9as&UHhI*9vwg@SNUpaewC?upc&oXa24>qmg-EB`>AN!*>e7Lj^R9FydheTxwBy5^bs!8rqDm%EgQ7QGu(U_CCA*C;OnF-o|Pq zMCWXeR4!+#jw9zVV}KT9zz6uSf;}r*lV9t(1wiY~vOf_!Dg(OA^!B2dau<*!+R9`=$)9fbHBGa!9E#&t} z_p85WE34#nRKu_KHvqOnfvR};fzoq9qsc&JbFeg~OLCW721Q>dK29EM?pg}cs$%^?4c5H`bL+Ht7gxYTsp@LzBiWZ7n0FbZ1nzdqi|>j7+arw$w?*P1=^=S#eWsK z#606sOX`6#?S93^fl8=|$==BG?Y9M9c&XuZs*3cv@!7;8ywD5ZuRNjO-F53m3stla2ACIo&KMOMLPkbUZ3qhKYEV{${ zE;?KigFO#o1ys+_x}L4utJl1wz!N%sOGL&pZ-wm|?3CIP5}h^pQ8V{DDBW0D}L(vr!-W3 zs3d{B<4tb`&;H*OY#xO_*{5$yh^Y6JKXmpZjDZgstYVXfkx7(Q<{B->sPwHUBFGOu zHxwW@G~9;D7%6_3oWg81IXnd z5Kili$A5NFZw2wG5_vM@o>_anX5%oQDt(5NnM!Dm;}v6zDOvb7TV_Trpb%PJy!UL8 zAJX}%fADq%a*nieK@}(+cxZk{{6LKoWAS@hxw!x zN3{&$Eyg>p*>b$+>#jUflt>Vqp?UPa)k;a_)2+ zRD@R0Xu#kvjCLdz%k|mDcG1yp7b;494N{kr#c453Rj-mnw%CYdI?h%^*$3(qjf;LL zC~$TVNsR9EF7K3$j~%(l>I3CW;qqV)%&jyEcD?zs%v0Gz5f{B=wvVlJ&3Dm?(86`Y z!SPI`TrKoxoe_#E==(smCTIFFS zjIb>~){mw}q{e^FAKylWzaN#T1_GI3pc&tUPf za@{4zG8iXw75ts~^nA8jZ4l$deIM*&t&X2xpET3g5PJu6cUdMzI-(&TVyL|0C@p43 z-W{=-QdD((BViaIimS>CWMFIfyk5CFsgFIJJcU7f?l}-WZ&jUBs${QE>3Dq@_ddW# zi|IUBtLJ;`$>-M!VZq@VvvZrJx^w^i1)wT54K*c+{u~r(ss$*>Uy99yRg~yIu`{9n zfkaOEm6&|4kVLO}cj8aYS_w#WzBx?)eeZXl^Px6N8fgEbfwtF;CNkBA%dgw*C=Yfy zUb#G!4K$hWgjG=MT{06UJZ97-B2&LOa{8^Cl{$aAcZ7{lNI)c%54q-m_U(6euRvwf z%A^iHMEZP!P!_BEtU!S)TJ$HGeOQ5KlCXFQ8^8z(+LDp+F<~V?L&k7AbquRdFWI#( z^nS>D>Lk3wDOf!dE{{Bq+D3%C2u9zjOOXqdec)`yS7T2M^?_61)>c zSz*bSkPsGnXp`C!h@J*L_3(g5sv`+-V&;$1wGI)&!1*tOnjawO{N*{|g-ama@XoG zl`xTVwVUGc*4Grq1avsn!S4+?#r&_TwF3Gu7^M6!EWoK7#jTiWs!!~RO24|wKxQTg z+wzF9X#L^bWUoCnc}fDG6cP$jVr8qaD4EHqT}PTPcXs>a1IXTb%5_?5F5n10S z>Atc5{7EfPUG;diu0y#hM2zKkcRDwsX0z$rs@leO)#iXO2=M_5cFio?ckiIF)Wa}@ z2Z3~-^VWfNFIgXV-|>E3m$OK3oUAO!wov>l4$;&%&@h_${O_<(C>Z(!8&PcuGlYm% zmkRBVGz)}f^W|~nz#sK_h^#3zno88GxsP2CumjZeT|Zox6eyA3&lBX!nRsBNlV~ew zF4pU}1+&$|A3j^!73*J26^k_-K?QUD_e((x8RTeP771invOw(B4;EWLnO{p|nC9f3 zB#11LDy`;Vw_Q~s3ff!A8a`-pDp8u}fIG%=?dA|4ED)C%rE0K}2xYSdVVjI0_0`JH z{Vt;fP^q#+=*0Yh;lpK6cw1~1WC&S+B289vO3ga*;7&@xOvxLV(6Yx!H8Q?#KD!0u zOr;1+Mh}vbXw$TJgk8NQOmI_^z0IJ~BL6XK>Eny9pEFk0z>B(WmW_Dw2@$w%mS2BjD91$nCR#2jp$y!(Cv zozbe{6(G0G^n+sF&wU-9MlA+K%EWT|&JSw!8ZFm#)*WTn_ebND$s+N{Pr03ID~K5c z53_!Y5V%#hU*AEGIINjzB=xJn)BV|C*%{8uo~NSwp#d}h{me>WV;OPdq|WgrABd60tju(qt_3e+KWMY!ZD>DAb7d2oq?Y?z__?j2UJ&#wq`ZGNTt4jQ>xa2jN zEFNO4X4ga#7y>w)ze+_gXX~_tY*in&!#+MNb)gfpSx>a9;u9L-vnJJS5 zv8aOPT8x0dCbdyx-^mU^vHF?N4)=d&B!y3a2CKxQT?qHzysv6Zw9^# z{@3NpyC8q zvDWGg4pt2)zF=77_qP1Vc&}l)m^Bi&b;L_z?{C_O;6@X4TetS+-N+LSAF8ZaDVVXU z(t0E&Xdviyx;y&z$PE{uV4y7{{`oU|E?6nJ!>HLt>``*b{) z?9J_hKql8P7rLZQXF}v3_I@53bJNV@C=CWb+)EM3ch!70aeS~ir!PHo02#|hFy5Q} z1ay~H3l)xTZla0t%GqWT(mE5poY(DS#7GwWHW6-6579)}Wf(7Svj~B;$Xl32vS}nn zzBtzXIrFcFq#qVDmz`tBj^8e@40^v`s)IOLR5Xta4R&NF`5h=|vzoedc`oOZod4ZW z&LMnNH+20RBKnbLrUNuFy%MPXef@QS^|;)OM5wnJb|=RFyn{YM^?-Wj0pc|F*k~@^ zWWLjF+~W&R@}<|CqAY6qR!w_@$yx%r-zu6myG>Hb7jj8M6C(T!1HRm2tE!P)-sj(7 zw51121bE60`bUO?!yl>KfZ#}+nt=)UYdnk|R-^#+(eOE?JU9C)qmkBzqoKPf-_nb+ zF<#`)S+3eK<3h!LO+Xp|w*$DASaGrLM(^@*eS*=y%kesUo^`8ZnZV>}momxBuhV7p zBa&JRgJT&ynS6l+8A3d%;y?g)IXnT^3-%qG# znGmPxc4unO@{>Egh38;XguwaDJOUQ$RSFheP3zqHpDU$+4uVLr>tfVPfTc>p5wMKH zsF9}89vg>fTT0vnwH$UJ55BD!7C(sdYBzq5%Ge$nooMs$#sXK-Oa?`$L*6{O&L`VQ z6kp)M#7nJG3#9ruwG(C2d!e3NaLj)SohVu#{_B1hcFPi(fbVCf1jg;et~Jxsa5gBA zx!LvARD}~@mpv#7db=d%ph$^9=q5C6A-;1yNen0dChVCw28d>rK zvNv0h0+P{yJLG;OCd8e1l)~ajm@kcPUntlO@F1){wC{R+A@P1OzaTHIvc)^=H;)iB zl)t?=ztX~#jQieVbl*y~w4UMac-q=9qOO$-brNo%7VBCl)&Vz<-a5=+QWGs=X2V%h zeskfF2OI96soi*(*AXN>OrGsc)h8Bt(fk3)g&+4O7rmCSd1G~^XhLG5vxC;vmR%aR zZa}*J*b8JtM*a93=CmG<0<5>$rZaNm|b?|qWvNc&96cO zF9ZD;e;0-aZnuLRCYKdb`<*|4jHNow^PZllYoQre8S@C8&vS`Aze_gZ4_k9yQgXkN z7pRyEDCaO7+yJQ??^|2ObQac+3qvPS0aiuo8+7&e|e~ zoX-oARRgu0*L#h`f;q1x#Dlnw%DF8cu;lm0Prb~0^&C<(hS1zzsV(;ht|=%rT=R7L0epyHLM2z}G=9hN z%0s$D4OmL=o~(IqJD1###yfpUU0;5ET7kj7*dpZqnqvb^{|yWN?&z|xIUyue6%r~~ zG;Kf2S)|^4HYXPml24CdzQ!vNN`(E*dRoNYcM}eO0YbitT@^oSy<;759^B+UkoUCM zL+h>RN21c={yDhd*VPNKs@D}jsY@m%`YQ*Dq}f*d;iv=x0h*smpcf*l?eAvLk->?YD1(R)e?_6Dk z$)sQcLRokq==EBQ9r9qPkg>h5AZGW!eu)&lZ4e12MJJ4N#C&0fFxag&uKLH_|Bb2n zU(bq(5Ind{rIY6miByVAI%Z)C9l;;D9Vdgz`pB!9+x5cHX>s<5g)M?mf?@KQ{K*L- zIjLs0TH^j=<^R6N|M>$vyefVoBP#<5WPk61|KHE>Vc~Ag! zt_PaCueeSBf4tG(mxw-t?M}kAD)t{7(f|6+|I5v&vyDoBJ-PU2fj)IV@V2|^Dvuoh^@&((TG zxeOl4{r6Y(=>l2mr8?6D@Jf={775GW7riW({QEx%!@o4!ZSfyJdOnR}w|L!#8xMaq z=k;WUGfi^4+!np8+durDp%NG+7J!u)Z7XX3{ADvTYiTbZq2|jpSpwii_lLGp~hkl)R-j=>}BdoPJig!ME z{DRpVBKtxvA71a6!RVQ^ORqBYhJ?q+GacO@{m#MP^_vHp!0f%iW{AmBtOfD(IPm+Th(&m6db zhsqy_Oj2)iL2%jb?|81zZu+hI>=I8Vi$keiSnlcAJn~+GO2~Z=BYTnY{;bpdYz+6$ zt*8L_)h=Isu8ybLzmkLdGhEJ3^(tk$%53GDsf&eGF zW$DUg@saKfyi|FAH_MOpY;@I=$O=C$cvxcM$)_ zM6m*YzJS;8c51EoKM(2l6Gp8Hbb?qJjM&g-NsfIHs6I3d6R7=%LzL%(Kj!aM?4L$mfk34<) z<_u`i>9EQ4V%(*+>KK(SD3I9djXoWcy?SnUzuHe4tG%4y2faM{?iQet{??evQ_^a1 z4Mj+0aSngEUC?(SKpz1lLjh;{zg90*TO{a$D#i%D&5xut2wqNsOFswj2rl5B({jBw zu|k<_Ite?^?LP=*T`EUu*SkR4xiS?1I5E3|V4eHxNesj-sPUEdRHb(%QJ%jd;?5zT zs|j#~+ps&5pkAs{Ssnr29sOk_5kn|_UuG55aVhC?jT+;}y#9DzZ5LgThKoB$HI>b% zl}5j&w^Do@)fO>!lF!pdr^|*?WAf7Fww=x7s=lPwXkV_ZRCH!9o=#WGu}(*UhtH^m(#Vsl6MQq-PcTBCp6 zWgf3T1giiFPA-4XNQ?V*AugZSB3B>{I6wOGaGAZi6y$Z_xnLWz>Zkqh`e*#?cYC_I!oSBG$55Z6-S9a*ZFBnnI2L zEs-Q+Dwj@IAeC63hEAoYLn+-DQXk>_AG|~gv$|jOT@Iy zD5XW}gYR1^coB52l`FR)U#WE2c&Q>F59iDj4%^!miG2#ys$VTc8XSCC)7Rtdb(zJEyuMelL(|VMGtJBpM z%BhT=g}S`f+r}kjWPU&LVE#lhLlSqEQw$pp=bQO00CKk0-xN!YZ-UJL77|HT}KB3z*hirX=obJKp3fmlZsTC;6ncvEk}UCR;fn~3&_*|C}h-lx+q9VJ$^(r$Yfi| z!=#N3VLX~LRavD}76N9}n5ByW1Agnx=U3_aPzk}XVVE6H+6yV`>FPK-;98q2smXG^ z!{d=j8M0xw93C&-#BVukKws}BaE=3jOoNmQNE9Xy>q8{mMe;JH3Bhypw+Ys99(F$sT`O(OY!yj+`GYYP8H~ z<6r03hj6lpmuQZg{B$%z&wo__{pI$Z-7fYOo5dhU_|ado?nxHMor0gK_%)nr;*)ZV z!`8NFi9$oTj#?Ix;b%94UFwG))j*V+Fa~0Pl}Zzh)Gedsyj#xiNzhW)go~SQcfRrA z6(K3iGOb3v0((CGXtl2%0r5tTW>VQV1Xv00<}+O7#MPD1JHr z_-X+pGO+JQ>TGFe`H!>pPmwpc-W!XK7>(mC%EwLWy~E=+-rDZJtGwu51h*S-7SfO` zROrwa0RX0N?T;s?3T)+yVLC)JP#-}+r>h13I_k#$2s*AFOurs zKR(~oDgbjMNzw}oddWdlL9j3gE8Jagr7xaa0jlE(+)c)cNp)J|Z?8>+I>{J+R6{W% zC_`g#=HufiuE6Yibx@Dz{?oLk`v|6M81~~Z_OKuLu^+hu% zaE$!a4CrMKzAf*2I+09bDS3^o&@PMKxd3M}=hu_8dAW%~XCLo<+N#!&*Yk~hut>St zZPDF?*eoX})oylLRtm&j+pME3=T4l<1&00XRJGLJFE_mfl53p45z=U5fBk^8@@*bP zsWb=x`D8Koedr4;2;mF)k1f9%X5%naen+2dt8=)CFc<{1MQ{b~HfcW_1ralm$KAnVwK{hV zpL(T{zZzLI1?kU)T*3gh)OS^2QH94(Y4GN~;rzl@oQsDBRV?53oKLA(L6B0hyxHru zKbh%aNB(4|JMU&tk$)Lv8kN3ytf6VCky80)lxdVsSI&Ht+`=PrwD2j7MXUU)09oMu z`dLvWWz?D2)!r~MsY)|Ft-|DqT2d{lMsB0cx{_@z+3;TJ3t8c)g1fqmppMJmpL>BD z!s_>KqL?qv`||?OSYLUL9<8YMzylCgAcVC27%pFHJg#8oMnAc7p%d7?RF;g6hu`TtI4_*-{%}vV<}^{~9f=s*XLcVW4$j*Tbrf(g^wo ztEoKEyG8)D`qJ^xRIW)&E=j7DOn3M5?{G#0Chx1S&rdyhUP}(GAFbR^78#eSr&15r zj5iyFGFeC|k`Z~7V^wseD>FC??6z_oXK(+F7i6KD&bhL?;3LfUrl!rJ6r_oGJ!?+q ztpVhq+@SlV{AUCU_t$0T)Fy+@HJEjLO=h#25sw0J4)0La>TwNaV+BM;M+|>D<-dv_ zk;HdF*zefzSI3d}JfBJqAZmN%875&fV=La1m$%%*?)$Y)w!?t07nJ)4`Ql# zu*1#4XAr1bJc(ig;X1{T^Fy!6&!=m7&jl+fN`+D(&bFVGDUWOh7KpGiN`TR(U$p|V znN$GYR7QQ!gI}`5Du=yE&o-3&L$EQWq?)%U`W*lZrnWKyA42RlZ0 ztXgfc84Me4ldZsE{XM}gIPm!+CSClQZYxj@gpjv^5{^kt=A4)dwN6AxJzG~*aD8t1CVZ7TNA3S>Ba{cpS=8t~?Fa!x+ z<@d&2Lu{t4b2Q*3A#+w>n?!s*F~5KKih0cb6TY$~|1JCaT?1U^crmXe;|ht!vauGI zi<3=fmjnkUrwCX1295`lCB`nSZB7EI$vGIw)-2e+x&U zg+n2@Qt*Q@MY?f&yYt-FW&GlI{Cdm8Gl9P*E-~T_HUwKAaqmsI-A@+8BDu_ZX->!8 z#0*Y{q0Z2ATBQxFb z^w@^nq3Dwl63CWA$Kz?-Xp`1dS$6Cu>kYDb10YN8V9 zU-5pDYInQD#nL-|smA}}l@Q>kgDi3uzvgkZIJX=+E1 zx$8xe5lM~Kl=Ljtwj2cK(v!d}Op|p4J5So%2YEpKjxhaaO)@d`op9p`HpX6lu%f^} zHX~yUm>>-X%w$2Qe|4!UUMLv~By?A3f+=$ODomYFLz}fzvhDR7&+aX>w!YyFPoQyz zLr;5kqBoCFhnr5pucRxIs4;^G@+D%+e||zo#h6tPPdX6(;FfW|pAq5xccW8v`(kN% z2ci))KsA%cS0&?l2I^z2r{05)n`IAx3eZVmH5=2Cbcrw;QD3c&;SXNXg26UQv60dk zV9p_qZjG#Y4x|&oK*c>U-+-@N(z-9aooQy$j>4OkJ8}}7_xT-9 z|5p|*Q~yl;;L(fEmxrES$^CzEF`%%|Iyv1n2U(DP4(wN*XK}JOL&!Bej35kF^ z8D_{#G+!5!gdVariZc)Gd+uNngD!n%bs*p50be6CCZO7UEuT@pEd6pO6E+k2kMuo% z0~3~X*6Ok-|INc}kpdMO$e_Zf^CdxZ9Jzpmuc)Vo`WdYC@=DqvZ+2(kIq8-{g zxaDfG#|3N2x>%|?j(5K+X6W*>B*ox_(1$j!&OCPTH1lNyX;Hk?4RhDW>Qtwe zchaTj)B@W8EbcAPDt=DBEmQj4HTGaeDN_2R-#!0gNV(0eRNsajqX3Uo_|=XefLWM0HHEm5N@Qk`lS1r!w&C0*QwW6D41&TMWevdrrm*?LFRr zi_ELA;D?pRt!@kd)6vy>a&5=$Z!CQL7K}Uo3);hb((*p3k^H&Ug7O!za)v9*z7g#m zxNwBTJC}0BneQgwAs|R>PSvfwJNG`AFT;DP5H^AWfwTr(eC+jnaGL-xgy;ii%camA zQv{%(AE;RRpt8z$U9Hqjje<@0&iOht@x)*ZXmQxkcInO}FEIrw^%B%Q_r6pKGQj=? ze~(-;UrpgYeeT+ZlJ`L7q8$H3t;=4Mm$zHbmD7~85G=;ibS&D{0I6*%m1N);>Cu3a zsdQc1v-5r1$KSm1^2Iqw6cXvi(bJ`n^zV#{(>AvuoEFOXO4jBMqK3aBnkV z50TZ9kKnO-&S$4JR)b#2I-l4dZII(qntBy>4z)FSB zZLZb7fK63wzdzZKxkiGLPgszG3{$BpN~3uEUC(reY-$M52{kre2vGGG#T;z9!orWv zm*qy2pYoS}F)t`lF*`{YHE9b%z8e_iu;l0X`Jr(Q>6i#ot_IOSbK1* z?Xi!+M4CvM_(UoYP;kiD-PO*uf?671bY5N0?o-o&;2;Kxk*yds70`n5XtCByeV9Z zSTcWgBn8q4`x!#A@nSK!svj%&rM`NdndK5#P1qUP6&ov<|1Hodzzh*WsQhO|$X-BQ+9>IGCG1@mEa%?*>lZB?8kHgO<24%*i9IrbqQzarg$a)?7 zKZ%no7-tj-2rxDxMo`PE^ks-qN^QRbU7Ge_SaA*i6ToqY(;|dj!V~^n!>fVzPpI!0 z9xAcHrG$YeGO*!)zCVc~QxL>#9XVwN6xkhQm#Gz5radtk<$uMJNx60Rym1$%J))nZ z$@21?FUV!LVf!`9&P=8pyzJ9ACW$UgN~=TJ+H7y&SBxWwZ6-Vr34fMtlsm$|WJOKy zpj(8yQ!XzDnV9S=wa~VUkf|pRbFDjLUv<0B(@}j13_R%62j(0&v{x!$Iepb^<*ojb zEhtv^ivF#2xlYlnZS>zhI~dd(3=@FpdU`4RfXy)gYiL_q5k~MbCaseKl1xr0PPRHK zTct(u6hWloU5_ReZ2CDX#FFo-cJdBK6)G==7Y3)@EmrKdqt}B&rUtp;R2uxKrX85` z$h0zn6bDAG7RbQIfN>RLkcLJ~pBf%r!FM=3%2kaG^FQdI`CcgHJt(BCnpwCa&R zPGmI9{v6NJT4d6Tu5WBkMG;A-^62jBke$bp<$5X-0+dml!i4Co-vCPKugdVYFH8OQ zXzeCS=c~aw^{BPsyE4g1_k0zRaUP`to$X9sg4t72o&K|M6KM_Pe>?*s6CHY{^uyR0%Nrj380{Q_#RqT z#Y;pKA@18aJ(|md$1o=5>f(4TP1$t1qEV4>h!|tKxs4_Lm{c!1?pIZPHbH9wA1UU& zVga^SmHOGOAF{*U4Glr6sCY}*Q%ndU=mUznc}b=@CPEXM{KC{h(s8Er0ltIAH$#uy z{F&$1krKOt4*4QQrfkG$=MFy%4BUDoOB;M{dy$|k8#Q!F$RlM?iO5)~A>2^hdo+*U zQ%TQaex(qPS2E;jGLFRL5o}e~C&la26`I{wRvLY@x?)MY;pVDQj^p&jtB-*$klQHu z;lKTUV50l9!!djw&q;s{x$}TY1U)M4a<1|a$Y(o9hU~N7yMzn2_}c7N zY;+`XaDFc4pgfO$KINh3jEB}ksCF5M$2Q+^bs5G*)1VmI;!B6pI#UP~?{uHmPgFSx zUq>V0^pNfha@-y^Q(7Z?-IPq>pQf@wEQvvtac^T3XPrw#sVCy>pJWtR;5z3n92m>Z z!$FpP<+Iru*VB`oEM0l`iuBa} zGqm-Tka?jqBJ88p(iz%aG$4_>YP+YEf^eOBYYUt)m+qajtd@%D?kdK9AwFJ_b>+J=TcC z8!qUKce10fNN(v}7;s4V0rguEzylKT=*<6#y(lo?^}rGRKwIM+SqSmV=2klfLf?N> zvIubp#*2F)RBrzEuYWx1-!9%?18(43#PfYA|CU_^hf@M~hBpXuKmESMzt{0=Zt|aN z=ofS#%~aYllJFg(@A-)z`}EHR04Z>1$24gI@&EDt2G?0-6)j`Q@4Nql48U8oqqyH^ z0sQ`7)P?I`EtsK6em7Wdg75=0;!?n&N2Fsc|F%E>V_o0Z>$7|9`tMfwP=0g$e**IR z%YpAvRjw1tNV*&s|Q4znGlM8T9h=3SlV6K39LO*PAfWrjHp)k7a{Bv)8$X^`^!utd^ zA4Qx!(b*-yR{iD)0rwoUz^b^P9c(OpJmZ3ObUQg?b07Y(w=-l=clII|<95A&2sG;u zNZ%mmMK{9){Zi~f1Y6&BHqEny73Tgh>Cpp@cf$;oKhX!BL1dVf+BR;k@dTtF`W+t} zwg4wfwjW49-$nt!?#xnkqE&aFwoU?Gn!6n+66DeF*VNa-$e*-}301P-F!lRP55gjT zndV<;yfcU7z5f!v?cxXCwU}T#wG|w?t|ifV984{kJ@aUf9+p1w`%{S7K|@aHb&GF4 zV2~V$)(IdoLzRliiC;Ru9k-jmjIVjQ>BaQ}H6h^VBriM>15>8nW}f>{SA-8g1$}+! z9&!)1XwEm2v7aX(c5@oVE^++_@w&q$Gs7CydRTE126mm)o&JfQd+gr42%U0ylcnh z;<+rDLHkK(GwrBgr7zyvlwL@#&J}=k^3lq>b&f7ZAsn1}IfC+&i2S7WXX}3nYyTka062=LM z>u}TlvPhuiX6A5Xe8^B17M);=uqXN^cKIc*-*3L^$RG+YvTR0v^c^YJ4?&1-1QMBf zw@%}k=Z7Xl|5ys@B%%N{yvS=f#77B=`D(tKY7Upb?uvAPyKC#fR-E+uzCGu!|M+%| z_MBLh8jMaUVXO{JEFKn6T^8IvDCYVFd{{p67xkK}b`pFojbeY)Pc@LDreP8T0oJ0g zn)S}38b3YWziG_F+ugMy0FN!7{P{ZuZgmUIUmyJUHPnEgSVE3dlAPaLkgyr!{NiXj zl-pr9)7p{yr_2R}rh&-JP@d}UR>PHwe!>&OJ_CDrZe4Vrr*ND86AgBfpv@etADSJI zkR;HvA}t6w7lyBPm(r?TS`-!pmnD-{j7cow;d*)QkaMo{Wjpg%d@w>`rl?7Z2Eb&x z9pQ{$L+$U9qi!I8S4iwO+b@6}u*x_k8=K@$VE9e~U;%U~q!5^eJH!?P-so9y$#Mvf z)TsH<4SG=Qp=!V!R2kSpt6$a&eJ3^pR0zCAf%9VBW={u*np*>Ov^5cN#%4C&5!~uz zP57hm3J^+!(6gh>&bo2C0j@r}PA=Bf_?MqKQm8UuU{#bBoA^;IR|lvc3RH+}{~|g< zzy=77A-A?dLx9xVmou^_+ar;1q<%2rM6b*xe`+9D^lfq&L7xfN8IrZC2o|)b#G*7{ z05r-T-m_dA7oSn*-FXPjQ_@+}5|p0{*v0^{nNAc&5HaLJ5_#(q)i~(G;F7Unl~{io zk$`Y`O}R}hM-@Tbgn=|2Nd@#*QII@v1e}e$oEo6=2%pC>{A*#eT|pJwcRT{S1rP0v zqVEKF2+r#X>iwaXV4`XI{CFG)NZQYR_wsvQ_-~5hj%mE8q0z*pkU-5W_14uK1_7G^u+8+gpIChdFxn^B^SDm(yCZ=59DaB7E zl+b0!%%w{@XK;dDkiPhL4%@CoRMH@Jw)4YWw;)X$Mp)lp$w*AuKiDil?r5_aBb8Tlm9O#OL|vl-a!EXLx(XejUQ0mUh8jntdjdtV=-rf`Fs#orM8 zs#|Yd3vfb-gs#Z1b8zhUnl+Oez*= z+&x(M@qEDJsYEOO>!KJ_2}Qa@zh` z44cWTM7yAMj&&PNMbcyx&ESu=j8WG?rlYCdj&Ef2KR$^?(MKxW3g&86Sj|X)K>2*8 zHpwY^TO>u!3l$_Z;}tIdn(0J5kbE)zDn_`1@bl@ln|MQb2g?9Y=R1{*EQOTajVp-@E6vPTr zNV8!X676PT4^>>WC&Miof}&C(VUXSV_B8F9!^MZA6=ns`6=`308^~{l1_pKI4CjT>dpYY4MmS`ZVoKj3q>$Br9+e^-Jl0ihvqA&Z zq`$Sma4oY;S)VKsM#83{`sjxl(Sb!H`p~AUsr|y~DA$QY_td({g~MXjWAI6YRv4wC zX_iJ>wj7nF20FRO%yRQMM@t}{V&r4Zhd|}(+juTp(KQ7+c#;m{@j(}c>(V|2bfm1rLPe*hy`L#zDVmheA#qCzkmP9iR;!T z&x6BBk(HFtchf+Ds;PcH(6S>S6nHLy&KvP1`%?RZBei^f?r4iPk8rthvHqDv4xwm_ zZ9G@|e3mTtSTq)OC`DLwf4V9Xjym6b?EAhPGa~iyzndba)?Y>)i00$$b^w#UY@{Xd zIbVs-q|62qnsop*%VibfCnm`Q1+t1rSoHbfjH(-sX0)2FhgH^!9Rb3SNw2$)1j9`$ z6sd7=S&e9FY`2Ew57CeGvN^qJB51~K92br?-5_1nWx7WnmKyTy=z;oBa-eJ~Qolc= zf~~6O>ooHcoNsrRkz1Oq{>f%5(YniP)zM1FJj_Q*4E!VTt<&6xz%dW0syzuzHlLo9 zj1_65TN|FZwuoF8V5YeCr+3K!<5p|(-5Tstb=pH^geSvPD+Zhb#E@`k9`!$zuq?D< zK~!V}S~L)S2)NW-xVz)crfR8yc^>8W5ItpqfDPf&R~KG|5Tv0c^^yMwL=bbLA0IWt zQ>zqL0+rbLOJik5GF5suqfRf}3ZrfdI>|1eeVNPCXrkdO+yf>KrfLOdclcfM7rMY# zz_w;ir@r;xC3_Q7>22rBG3xkFG2U)mCBB+nZ+gA)MZo7wQbJ2~6&Orl8Vw>XQF)ICl513*)g`2=D1WMy^cqwR@A?+clf@uihHi9^noV zqngD1uNkQKR$@ssJBRMZ>J0Yj?nds0RyrN!H=dEQLxn$;Mn4VPMxbLc>aZRK${ckK z&Aeh%3YyVfnAh=ga;~dm>S*H7d7~4Yx_d7~BQOaL_Vlkz2h9}U2Vg(eFs^_eeaPpl zXe)Z-tvlHxXl}?4D{6vNQ z>}Yz(=7QC<_M;WhG)j}Igy?kSMDtm`fVYmoFT=1zkA2hddzGBYp57=>CTC;T^+nt$ ze5nT>YmA!x!L}RGSZpY{C~2jcp-e`3L7r(I=b>%xIm521lj`O~6~Xv~r;pCCtVN|W zi^vK*N+6^`0@c3va~yXUQeb*83Vm9)x<*C)cy)K3hayU|^IgY=hR?Aqs^%z3#?0^} z{f}up@hDDFfneXVRe^o_uU5xz*Qk1+cl($7o%Hx;^f6qLqSz=gFIpXenDfUtI5xXV zAWm+*GS!ve0i3o_Y<CP|r0sg#+i^R^%5Ay4 zJ(S~_k)Hjba$*5j@(9UND`td~0CK%Ia>Q-n;#5c;&3sXoOjRh7zWj8D^qUU8igRjh zV0!FZZJ{IR!bq=nD&&KZE!J*+D)MIo@0Qo33(G~?H1uuAws`phCZK&7-?1Zaec|sm z_V0c;fOs_i7oFvFmKUcsHT2{ytPw~~B zY6CjAM82NKl8M|O7vc04IwMOeUM{?gDHN8mm*v-r5T(|P{H#taRbLrFq(>xa=@KC- zW!e$DdImhBn($@c>As^FP98AXu#-Ty1cpB4md#qUJV;RW<1QAy&C(_B5>*Lm8RD0} z$X`tpCH&H3anrOyfIjmMWm+s2)_R(!fi zlDN--D}9`lE(hh4HSridXDEaNvHWTYci#-23#GX~*zdj4$^W|Xf{U(rIKn~Q@p~DhWH#CQ zwF#E5JrLm&2vn5I?XFyD-Tc^4GW7f4hJ`@|E+tHks7WAl#|g>=il6S$jZN_I2WQK5 zw;zZpzOK+|uwDoq*5-*P^-LkGBJI1K@`w>n59nXQCaMYw5!aiI3h~^< zq8Q%eAP4GPI`HN*_cxCY$BVng_ZoZKy;PUD~oma~qOTEED zT}H$*ShlKQ^STvi{Zs%E10HXRP62FOL!hX24^R|Z-F5R3H&*rYPjDezh`|JA1)KMj z7i6x^DW33_qw3=b!k53rbZi$CtPxOCX#-R`^Y58GcS2wwsv-2J=Q zD1wG-%#FwRT?)PoiEVCX0RmML<_kTaax$7HDyP;f+>h4)o9A`vrV0|)<4nb>eGJg^ z*PE1VF;RaSYTv}e%rsm=PeecLi_asP^U1V|w{g#lUe?9&T7BwOz_H{@6f02aoCy_8 zJUcUcu-hedR-zwl=joSH;tl^?sX)1AXvzas2rw)ysrU+a+P;3U#XAy>8OS1#AGcjM z50^gHo^$k8^b~$0rJz=eSt}e^pnkz=@p?F2HeJGIV5uv4S`vx@kFqA-BcfiTNO3R$14?gbLN+^I-)9a+~V1LJNRBIW=1sh zBt{8!#flcxyX5vb5#0#^P85g{=T~d>sOQKEMim;C^C6QBS;s@dmz}9frs!fe+|MqH zYcPlAs?>Glf3T@Pu+^-=kHnfEWYC3jetJ)a63$d%HqFX*Qp@|YkNm`9Uoz;hQ{hq6 zQ{X77%(YZ*Gh#NgY3qT+tE1YKfad0p{yIJNEC>KdFL@VPoa^&z9%M#!2>s%L59 z0cJ^@9QRA6T6j;4TP_b+$5%A*m7qaEBJrMeLn}C*L ziQ%d>6SYrjK*+yk!l{#%>|c@s#IU!a$)b$gliO%oDl?ijwq2qjcXbhJ=`vjOMV^o)3?LLw#47o#e8aU~~6mh>^bBh<~c;X8n zq?j2<6|_28&!ML?!zCAFTbM?^iuov&r+}HMQH}(%R5gFV&>D(&K&3zJk@hMLd(WEt*suuMH2e4lz}_M_Fnob$A6PQ^L?A#o!UybGCJtk zrsj{AbIj^3@LMgv)YzGwnD0CF6_`ycnOdpgp>UbhuszUCJnh09bt;eu2irH4E~8{xP)5B26Mg z&0!4XLi6{ZtV>uvbWv^`cQ1nX;5w@d=N2aHj-a#WWC~Zzbkc+hP$Q&PUMYxu&O%rbmh$ zIIrRI11(U<`X#Z9&20n*&m+z;U?34O#6-Vfj@TU>2Z!L^f*7iU3WfpDBvJ^LhYf+_ zia|PA{-a`H+vvmOa4R{3ifvFJ8n>YXS zTj)D@Toz-@J)Q{wwq9fgc!hlhwcm;7cUTG0h+$^m`jN)|$AVGoU|>U*^D5E*gz*Q+ z+@xTb7BVbB*8f;Au_G*qxL4JJ;#XS!9UKIE0e2W5VH!VU(*Hp2KCl7F6|mm)kl2fi3gbKFNBbXZZzKa? z=9ZDx!T1j(CgTvppx0q3{>R$gg#p5{Pfc!n_#a3Vpa;W{JJRO=$J$|o5l~@vLU;4fi|3!Nu^RogF$rmZ7*liFh=4 z(LowPM^8_5ZILcbT0#O-(F$S%x}LRH%aW5*6VS6JlBC{E2!kQ`$Y?Rx z{t-9s)M>Pj)1e%PNHkXBLIrrFD}e)rcL2uuwd>KBblH-rQt?>m zP&28}PMRK_1EnGyxK>ti9`koLA{K<}c=q00f{BSqhFniq}H660QrD=Le-zpv*vWneD~h^vfj|Ih!y zvfwAz;!1iJ_xH{CZ2{ZifVh&B$B7pF4{>Dxu)aV_3s9E$ud;E58h|+=`!SRMZ(#oZ zgI<93eT96D{zZpe1J)>eEw1F%b+CT}^QU~hzDfpk2YMj-@b6Fm4LbLXYjKrb-S+4| zkSIU~h$~!*{HOoEc34S7KwQb$yaf)J`W=X0{`3(7#MKi~wKxB<_5^f5-({_mmiz|h z?>|5d1oWLjc;&7CSo{AYp#MQY+f|L>)UpB%Bd7?kVN7@s%J6fU`qJOXPlvPqo9eGe z|8lPc`qyo*24I>E_W_k+aNusVOG;}o07WQgtuWNk-nt!D4XbT zwgbc&dZ&Btm%aa+C^C&;OZuO4L0bdya4w6N43D?JCTqg+uhXnM$u~|;O)h*XmmqG* zYqp?41|&K$5`=sFrDCEiY`88EpF@WKz0|ST(LrZD8bXm#Vd5%C z-Uc1zJ_GonWWu_^*5)oMf`z}i+Ayeer8*xrVM`a_VvT&B-JstI(;dtL>V@O=x{Ifm zmV9=)aPRdp{2|!KwylUHL=@C(jUG(ErEq$}}w=oZzLm z^%wy0*U+SaZ?0Cv{vv2q$a&;1BGZypPA?l=y1V&>BvQj5mKAc_rK;*f0Bv-iEJ)!E z`h5o|Hj)6WA*uw*YTRH(P2?8N*%Zz@oL)H?vwPL(KEjkmTwA4f6$q{Em`UQ4va$N` zf&h<7y^68CAux|sh^L?^Y}f=JOwoeYM2XSjTQ-ZoOihyFQ_8rr#*3);-Kz$;GN}Tl zBlvfu%oxIMu;&+W^WT ztuenT)u7=x_u0*pmR0aKyY4tw;yBxCD#p$kaC((l1>c3*BN(XmmGhcTunSwZ8?2o+ zu8wi7ePz$~d_x5%QzyPQjl&9eP7Ej%lroVAH)s+>nG`Q;Gx)%`H9uSXooC;M%=)k# z_zm(VShE;Jw8^bFGzDbx9$Vk9DPzxn-gw8gl8=bPGL@Xke8V+?P;n^zU<=uVGxYva z?L*)NMl3?EH#8QAK8c`tbEXw&8wi`S&?`VF!4T(4--xxnQ$iwz2WyAd#~Qf~Q0`?} z-C9qaOMfCn==F%;NWpVr88AI25^z>z#AMj=UPPJUYhvF>$_oL&mW7lutlV^NQ1xMf z^MD>|4yVxV2QG@F$UHGSeSimILG!_s`T~BF?}V{Z62nb4?JU>QhaHj&-v9;Dg+gVoA@Bsymywv+OFcPUF4Q8LP>4io-*bvM+m; z@l7^v?QuHA4jroDn5Zn+z(w5pOa{;UMDlR@Yf~<@=mrkJo~~Jt4(RWch$;eWwGpUe zlPuW(Aa{*ZzaO-4<12Pbp&X0P5EV)I;cL_5UH1Qmyn!BQMZ`fQ*63$tW%j^Xqwq(iaAWD(>Px; z-SP1n7ft4c`k~JTsfieSCE2bLpN)=#z})Z?8v~O;8?Bp0UCv+9#S!aos{?}Liz>{5 z@b6Z_cA2|v(28PeH^YWNKfTj!dMJt}+igvp?nyM`E%Nd$+Sd*ysfoxK?UzU~PvU+loOc5il}zKnNnrZj2NK9kS+~FpU>EH5A)+ zZEeeCi|>XS!w$hf%GrCK{k{Y+5D6$HqXU?c%VBcV{5D@{f56ACNl|E`zz-`$|IquV0VwvGA$9qfa>K%l)5@nFI&CR^*Jfr;czNr!-TzXF{#rDwB(&`U~ zZDIW#ofLbuE&?iLyCOmHqXVoariZ=6iyRH5h9%t2!bz;xRGQLScauu()f(4Dn7MjO z=Zt|dWQ6n)bZ78*X%n_>rsnXU!EKGuzw+1?E?6h!sTxE&UaNkD(mJ4ySPJ9*>0;C1;12NapS?33nX09OjpL z|Bt84U{Y=LO6b%C^%bQED{k3hXLJYcF81V<=lZz$bgC^mCCbJ~_=>K5 z8bN=f8`=>N$xzt8ZYfpWXL%J~mPo@DlkxR~x9aF9KuCEmwx~XWjZ@0G1jSh+Q@8Ko z8(2Ssy`%Q&+PUdsoY?;PM+ftJ>QB;Aw_k2!=YzsM$?hui_Kro0czm4^oH6CeW z?3}>VtpBiqO^z6(0la7SqY7Eijje=Y-)A*`S2_KppcCvfYB*G&$tSE|XuIpl{~kPy zU%Gz_w{AmSVvJaC0+mwi1nJ-<^clZck!eNF5LVdCtqBqGta%Au>ktyOm#0tk7>M`w;=ma zLbwR2=p*S2V1w3;rFVfv9vKeqtBhHTFI4u30dk>MPIVsZrUMo0{s7J*_*So2DTa7P zifBtIjl4~aA!S*8k>vIV1?lxqg5YsET@#+S{f&bCQx8tiqG;}^k(RDB%5%Wy{{>K} zje9rQ%`Ntca<{Ejz((kGnCPnTokK(LO(#?0+MifsZOO?^edAtkLvS}V0F1B^e;9cO zFa(*x9fU#vLjB z62s~ab_O7584eq`Nm3$+(6L+m)~O;5t``Csy_RNxA7SXT|G*d_^)=XpGZ4`^mH%$& z?Ftx^F}h|(5DSI~^JNoy_GsRO=dV%$fjGnublTv+tlxb{Kku3Mz0la$*nQ(joCu%Z zX9@dD57(fySITrb!})J>b04h$wTH!osyRyr;Aa`lex)np8*f1bn?@|#Un7!QR|j)+ zPj(kVqu-KDa@tzrc+TC2)9XsasjrsJkO&P6!}t(yV`nJ8F`1ClF;<^I1aPSSP)RhS zwos)KT`X%9ws`EAf14{Dv>}Qv;&n2=;b3+|DG=gm#>%pz8Dmvf?yeh3$9V(&7^)^Td+K5S z_bzx>Y5EB${m0?qQ|;|T3kgD1jf@RqtnD|1ljM!T)Pv4>MFY z1e9n^dqE}gB>n! zQL7h=?$=!MO7^ghS$BSlb@k4$9cqtny^dPtHn%R+`3@#*AhdS?Sng`>~^{>kMy7P zyj|yU6sgM>*VQiQMl1MA4$2~xsy6pDK0c?Uj@$Rf>`}sIR9(5dhG*hv1evbSYr984 zs__8=r*$1|^T!_kLx+Ro5ptc3LUSEnz23RyY!T5j%;t;SkU*#9tgEjpvYZ(&(7htJ zz~k%#ra=t9tdkky=6lK-5U*fT-l2fgc8cN}>G&xkIzCqP#KOr3zu2kl$O0BHlc_Yz z6o%>eW+()4Mdu z1j+b92bm*9N|5hGmEOX|e)%lP6dtMJR9sf-4vp%3S5f)m3#CPmM0;YV?!lXs zxrE1vq*C$VozkjMyVjaPb?m(*UD~0})ic9>#t-o4w?M?OW-ypUH>v3%ZjwTaCQIeB=2VYGn~T;4Ml1z>PYAaPw9L$z zT9I^ zklG0*!Jo?**_O7PQqa8mdX%MLy^FyBm6GLM zfIbnTj~5eOJ+8h^G2}k(s!7L79K{x{me|yqS36IR<~W3ilL1xa^C<3zW&HgGP#xs( z&q`F)Lc+!6vznKpLn-$6Kv-~ou5q$o)siK`&#Of`_7ILKI-;!E5HTOXhUl2+cJAo{ zQm5S!zh|cq2!^025-Q*Dn8A&bAPOsN$};wLR}C5D)(5vVnZYDJvF9)?i3g%t-vRrM)9pC$Xy_oM%W9=>o|it$bM9pp9V!x} zJq`l8A4wCfs_eS!78I(?n}9_G=%F18a;%#sEb4ZQ`wliQ z9>|6)B=Wp9(@et)h1t z^c7Z%0p`C4Lh91Piaa9{gRSE;bt4!Uwh)NGQ#r&eQS>rIozm_y0t#2Q`01~{!iP;5 zK!7U=of>pg8oHup4(B___`ezUg%kE zD)wVo6xAwAU69OO)6lz)rqKh5$Y*s(hV8{|D#50bXU{!BW9Us$) za{7xjFFDD6%E|1tJ9T8<~!|g!t z!UxR=%`VC!geS|xf=pA1gq?IO)#YEIA!`-aV#!9@kMOGqi)c#-;v-Q+0lw@=RPi$=Voc$p#N0!&^1HW@veKd1K z2KY#1k7qX#lZe94a+p= zA1H6Kha7d18QNNugy%b^P1bI;grwU( zPdKbJ+YKfk0iwIG0kD9Mb9kw5BtO9f2nU3>y&tIn&h6EJway8Laz>L%wAe2 z5TGAfzX?yO=jp+wg#Ey@(f5IT%WHTpJc&6v?xG^X%X@Q?yImR{@WJ3iRpQ%fw;7aO zcbLmWQ;K6tY^P*!6HDE6iL3~rNPwj(5B0#fi3DOGBhgjBEwpOZ|1f{F%^;GFE}ui8 zub7Qai)gq7atDfwq;oW`5ut+&YRuJAV6*7oO;cpG3#cdgyw zp8@)tVKrLjrV%&80S$;0*YSU=FPf6_s>0o>yPhZY;4gi#y3Gw9eX!RXvJj_<`o3Am zxsAhsF`Ho){1LJ8%CkGYiA1b$t1?Mn-6vBA<0(aj_Tp4@$(#!E(z>24p*7}5XqlTy zAU{ww_m^z{ouRG}m#-GP;y9Sq3hxncikO<3_8}{4$dNW*nLeDH>_K^SYU?%MzzXqm zQ^mAlT(dDH36vaBwY)dMvFcQb3a!SbQm+=>)r_XX`*evet590U#^IpZzB$d6epY!O zDu5hbpiaLQz#4ybc*MvbTh$eH42#=7($RmjL=s{E-8~0Ut6m0& z7to_pBSTbdT_9!&w9zKYC?vgysfqWYU%W`ERm)X60?O$=ZS9ucItXB$6k!^#5dHiY zPY4ZcNQ<0|o>nM@{7q?u3MOs>eNsVOp~Dq3pF)u+q-@W~1v}2+_tFE2DbkQ31~I0Z zG7Qd)3z?KG)q9tLA=Ng|x^L?8UtC3?bPx#aBD9+P!GJ%#ypU?(9+?W$Hel%JO?&&t zT?0}8z2E&>dH1`)@XJfSJJ2$Uz&)!&cR6lG#lPPG0D8^XL)*NjH*X=90{LUpM*@A+ z9h!SfV$zTzYvbXkV--fUc`V$nOgrYnXkp$TtKx1Lw;<(){1iG>9O z+$o{Ls`ut6p{Av^iaQc@Ac$W4{?2T`J(ZzD!@03CIOP`|cGDeoN0anhE({MzpIwgv z^%J8HW0vH5rcz-_uoEN4cXH^IvT*#KQhBs?zuAAjUiwI-HLJP=I6i8${wS!JiN2>p zs~jyLhR4OL)MWeF7I4ze@u+5dC)JGn9^mi=(_J$M3;cx$3lJ zrgegj`|H#tmvLD3B|4x|gDJHHms#poGGt`rh1InJi#TSKbcqY;O}5p6`bq1_1311* zc;(nc`mseWv$}}&2|G3py|(|ay)Tc4vitj&C6!9<7P3wWEtW)fgOnwqvTun&mXK{^ z-?DVuNs?tqwrtsVQz=AdFftfs?2IupvJNxDb9F!8yZfu(^Zfq$y?%dv{lScxbFOpF zb*^(h=lywq-X9N7{OR=Gew2P{5WB+N=JiE!rbLAs!hxG5i;Fy!Zrsu?{f)^Rb%EQf zFC=bzczDQ-JVN^RLS5}PRQ3!rw!Y%@s(PHT0Rsi;#(s%7@DONIQawtmh%{jbS3jO2 zg;dlOZ=JQ3w_O2^7T`#Oc`lEd)<`X%*@(H-%>$r%Gx!euolBGn)Tt*saY%z`U*d-2 z@7HVkl$`hC1OV&)@m*E;w@2Z=?&Np0b?TMMijn6-xoS)$K-_lZas}qS-f{5qU9)Cy zvq+>|vRqgg(?PC$cRgRF$uzWeIuibBQLe#bMnirfeC;MqMyBC`vTxFq$uTK*Cc2ek zi0^0+`blO(VzEbl;I-gZUQddRC*H`US!G%-jM2=@Y_*>$Q&SwDzY2sTTe!i?2aA>r z-8rqHO*3mz^2g@tE!;e^*47TFJyt=B+pB{V0P}Z1-sANCr%&|*b4A;fzvgpR-oTh| zv<=xylt<;K%B@7$9FS=|m2C)*K3wdXuRvC8lH5XMM9>yivwbJ<&4$ku3+K~w7-N3T z3BQI~7tFB2aQ2!+^Ih-DB3=P2Q_-{Ocz8zi8v|?Qy>B)5;lV)!%e%g{fgvoC})Z5(9U3cua45+b#yidh6Wxz7J)OIWQzKFo8 z{7%IuJn`SD60utu(2Pw`x_IeQvbJ@IkjYU2VffyU=vxH`Qh;Q=H)&1p#czMi2Gljo zj>O8ccI_;;#y(=S0VKj-@GEW}ML*YW(S!%D&OJlkBy@}eiE+dx{MS$LWjMICaLv&+ zdn+#}3v!XweaGIFikeq{7HxMtK@ApU7z!#SO?fp7cS|9`f(=-oBA;ctp1tw1 ziim=pu!OPK%8%;PbgdHKS)^ACdt4?j4ki0yy?pD;Xv7A50;t}vgCGGv-^Cvk=eLL_ z|Go9v_m^zX_hoV-+#B2`?r&~gJa7Ujed*eMukK9|z!+C3dRO7U*THVz?-5b1BfXNx z*S2|FW39toI7Bd-*Q3$zqFLuDGo5*fI62+n`fA-?~ue> zHt~W1>qJhEb7*QjOH1#bm3y8pLB@0Nut*G4p>=mYb9Hmk*FLQ3?nVruA~lk2uYR?^ z_+CX;z_8hHRg;0~-HVCfCckI5r63*zDLv)BL$CUh62ZG8t#|y1jrqLqal6A+K?`VH zaH>T6>kDw&HQnG{zt_@kgQoRZf0xmK#J1VSj}fIrhLY!D^lc-eb>O!B>f*`F-Xb<- zec9EgAB8x37f#CRKd&<&XWR9pr=B0aXN0G2)U1iO-p%nRoh^N;P>nC-kTvg`N2CY%mn{$>j6J@FoAAj{``J<*lRf5k# zi#ARR25ylfz4DnkJi)g^RsXj6l-7Piu&DR&on2xCcdLR{g^u2>A6o5nVMK z@Zgsyx3$l;Ltxo_hw-+f9hI%OtE+4H7V_mUN?b{ghCRI#WgQR?ITcRFp6lWlL2|iI zJX(-LRiZC;9SL2Z2=YCY^&A_0B#%9UzSInCFYZ?PiUJ|4 z&v_LVwFu+(oK~WHeDb%k{#$(V!He3%+d2}hS|pyiEUcEM{?)U=#iIjCx124bq(#o9F2d(E$t3bp?>hL{`_|1)g2NwEA95dLHaMp#ZLAwy`^Ys{ zF%nvvrJJ`aO)>iv!scN{$ag5P2*sR$NeJX~Sr@<4bY z+bdyljEkhp6eSQxzbn1CHG@?7n({@bAYhABt(#ar_aaZ-ohSZ(;IuN#i5>)ESiY6ly3<=V z52Xi|UmuH=h&+SH;56F4Eqf{|0qmJ1$miQUUo{}lYu@yPdBSyeZ_+rGoho&@v z$sa^+{o$}Uds5#!D`YxZlMnA0#Fd?!;36Ef=||y)9O3Bl12CRO-tBJa5!-$AfI)#LB^PLrYSxfgPdPF4pyz(Iri>;$xke!#MU3SRl z1WgyTP!Cu;o6qMV!Mks7>~tPt=~C|0dhrAd2$zuLLWu9D5@yzr@(nl4%}oHJS&dJ& zr2m!Lr&!vGkA)A>IU5})w(X)8Ne$U0MJI6>dRRV^h$!?O{LvM?x@K(DXach`h;YP= zbO{8So^wZAUKf3<;?fzz+x4jFn3sC*-UD7q*Z>&mf~G5Mh(w1CXLEc$?rOTBAJ4n) zJ4xT#m9@LWZgS45#)?aAxqqkiPdp|hnt=TB=PjMfv_Rm0NmcyGg06xwR_7`O;`wJ9 zI}h1LSC)``8;4<4P@~0pg8LyS%=NY9T{q?`b%9o?=1*Q5!H`pSi)AQ8@%jVZEo=+< z`BQgYOk%U<4z&cHzj{U@mQdsTy6Y*{ozTGsdimTROty2h^qpV`YWs` zeOm`NmUz5!1zfVx*<08UoJX19Rcs(tj9^JHE`Lj|XtC%rBDPX`dROP(Y7Yx(M8D%Y za3*7SM%s@6#ESKEXqv(B7GzC!dA)VN`7`=VQhhz`gqW}^5^bW>T|rR1V7kew*=HU` z&uWE) z`u!$kaR(sG3@r5YhddDaNx>N6#lnOKE(7i5S$?F^DO_Z%DGRAo{ds){ot0m-)HOeK9PMbnkQEXf2}?ZKX|AXqcZr#Z>6%fg5{TMT;i4wbj1NQ{ zlux*#*pKUC6$maK59}hQ?UoM)_?#NfJ=fJ^()n6tQ@6Kvts-a^zW}R)L6==dE1Kt* zR$fFj3nUWfG438T`jE6w?J#RTF4dv$b>|GnTMh=mtUOR`_vc>>n_uTR(217NAI7ap zkMEpCeK1AkR}+yyVvYlX4?R|FqI<+!h~{}Sk|7fcO)G;sWtawxL*@!2KAJllt`LOC zD9YvsySbHpv2oklB_9}|o_BT7B*;I?5$fcbsD6l0lEiwyJP^%$o=Qer$H@}PF`Xd_ zYQysj7F{Ydx$gs#zN^~m`Q}H>P>oAVHpU9gAX?E3_+^crihBJ7lt+H2JAd{&r}Yax zK1Fl15UnOkUtUAhg$tRp`eHpx1NXk$ZTnAidJb%J znr06+SM-f?W-U0Tl5PqFtsXYpB-conyT3B_osV|sc z1?v&mD*44yI`g1B5>B~MRq6Exg^J&EEaS?z{WK@3@zzw^DSF*YgDTtbl;;&*V+Xuc z(Zc6KD#p9|PRunLqB#{@7cV7vsmXz2h-GtQ2dgy415+W+YLE+d6!-L9dK0}cvj7r( ze3%J#wXhV0UvO?|+u3pP>{8y6OBuj1k>S*ex}>%l_2VasZ{|+J4_ z4|?9tS1Blb854(Bovn)IuUOG&DD?W2)E5hKVI={!c0JL*FYu|%>b$&xpGfe1@ zhJsI46J6V$b+Gaq+nlq9ES>Qi=i+$d68*}WC6Z<8#UD14J+_g+r{k?pTIuRR>fm*9 z`0D1G8V)V{uB(-v(5M+cVikwijoY{iPU)>^y`kXRmd0_4NBmY~BJIl7hzf6%mtre@`CYa4BOts2mndJCKp zr&i-ydq*!RLdWM}Ay=?DT2SY(=O=Zl-G-AwEnrx(jak4eBpV%kbJoq0a* z?nVpD{wR`3j2U8}N$D#Ib=JmAam4&QkF@R~=I!~a(A8Ejo z!+~>K(I-DW(A_iucY5bdIl3QT0j)49xFRNe$1las?+O{fGtTb}ZvZDT&`wlU0O~lV z;~<|Rf={}eZFw}9=L!i?(j^DUP%6J(y(@_By>JPR#IMk1lAR_w8z3Xk2cd>U4Z_v?%f*cV+Xk=arF$iF%Cr z)`d?WZYzC4-0Eap@AN;!0p@6$9AC3r$o5U3nBCR;~Of0@ymsN#*o)y%2R? z{CkBi#?h^&Li<@*TBD1m=7p@_%?u-iN67a3D{~+S{h7FxLJMjBuI5o*Kg!gU1Ygto zm$wqPA~Xa7*KMBa9&6}t)Ca%JbZ@!N3mQtkZV)ooIZBv4HoUwicqbg_+eP1Uq!g8|BZ@k^MX0BYyV$|vfx6Or z+jD5^@?L5E9Vs$a+InjopXGeJ5@;uNlmy9sqhGXya-u9-q;|&7&2z|(>9as_M{RLF z7-Hv8AiVo#zLh>@*#Pov{HCVjJ&;t4a>(%V%4^AF#ztftC6J{z5OYzU{$56H`4J%6 zblW;&M4>O&?du_17Z9e6zKZegDlv%1Rb^zHwr1%65E*3g{$bwwNOLsZu#URZGN}c5 zr%WwYZ^I`su_sWZOkBe)LqpH0GCXtmXD|HkSE0J9oUv^y)jGVfm#yvZP*H6dW5L|0>XiqOY1nS@ zxyW<9nfy$>qU+n3OSa^p?`xa4dN&&1=_&>gEo`d1#ssO4k~dG8uoJfqS)jPVF`R5Z;*ko@r2RfgziXkIHV=L(S zggaHi1{+b996t$2cASXc{3FbUszoi^*r%m|WA2$aW}FXt&+t&_E2ZX@M)8y~g3c?< z&PL`LN!;*tb9GK-bmiFN@A2dPA7alk3@ijnL(2kXH&_YD&8AHiUr!K+y{I_}It$-& zh;lOQyA()N>oy{DK5w}VjjhJD(}g$=4y!*_G$`7==!;YAfogn0owD-AZdZSJb$=NQ zu{z;}V)%X%0Am)ijXV#D)>5x zggp5Tn`n;w+WglW5N1PEp>DZXbG`~EtH6__8B2Rs`@HHH0lcBBk*g*@w9(RY+kRLm zAIBr6FgKt`cFpN@p8OcC#fEt^H~fVIy3`aN#B)UEX5+h61Kl_$__Br4(Pg|*9V{8Y zJl*S@Wb}QmeK!tNU*qq>^Vx0SO##iGcKmun$HAj7{5P_~Jl3SBTb)hu#OUuN+>^EV zYx5mjeCRouZ)uX`gfm;nmow)93qj+^9f_jfEi$bZ8w&+rhywaI21$T|vQC zBrZXe;@@M(ssjr_qet8_`&^h7SpaP1)@O$9Khv(v0Z3}iV1ELH7*p}J9ss}w2NzfR zEZP(TsZvOlN4n1oMD%3NB-ZPz8BR!z+drL}OaH{C)`Du>s8HmMZ3tNZ{?WuX=Ai_Rok4q&}1rK{&o)v z>HdK87Mk>gRdxB+cNkLu!%dYd(u^$4AYWDp9|s>xo&^&`dJt0y=f_s!L#_>$lIoZG z+k>7?gh`0#9#NSld`+Fp9v~}dcpR0lpH{e#HmAuXk@fGp4 z;z_T1qVna^RpTgRk@joL5Tei2J<%UB#VZf>46mr3z-Sv{Ku|It^k}7^ZK1*{La{(I z@ijf@8tO?%$d9@7E23Ey`3>N!!8t8H_@(wN2(#@UF>arbuTo}hfA{vZiap7#(s&j` zh0Na>CFe5DDMOMUS@EdJW?$JAf%HY3)RQ+8*3YnoTW&64Bm&1vO(aGuLqZ5OCV*fl z_Nu}(F;nm4HOjMdo^#(jI;>>@GxDb!B3SzlwONjONnO95G*EZ@8y>c9CyKJhZzz(7 zEToHV-I^1gR|EimhQkxiKc!Ce#oi_GbOi_xOdVp@_CH&10ct_0}u`$`XGaqYyHV+UiXO#B5k@?ye?tmkkIWn@@3^S zz^^gJC)Wdt8uCZi-Swq0vYoHZ9%YBPMe4u;*Cj_?kbqj?0yAS3KrVT16i4{Y#S$oy z%cf@SB_vQf%0&c%Ki`WA5NNbkfD+D&z=Ge^k_WYqt2iVHc6;KA1B9*wpe)v&%k-C2lDOxx zc9!B$dZ~0OdEw&VhXYKrBanlNh#+8cu2Q7*6%i~%Rn2>k;S*~jb@D^hcmV%ePJ#2$!9yIhyG|AB>Xh=U!>kDI&kKGim4`h;C#ekFj@DYkw zO?;1JW$YYvDwa^_Zf#0aDCg|`k$K@lS1|ZkUAFr&M=VC{@?owa-c;I|s z+rb(rCV-vr;8;bVv_qVa#_gs?}UQIfFIk4RKJjLi#`I|J@)%Whb{U>&mNGxCvk2Ogq8 zg5crE_Dutht@KJ$AXmNn*&j8I`lJ>lcy+W<|4o}xL8VS9?2=PGr|^A+8jbnC`0H@E zP76R^Cv7;~7uw5IpDjrdT>UL@FjV!(A;+Qx9b_8_r@JGp*8^!epdhpQPro6f=#YR%qu^W;w|f!>>GB(#4-HBH$-FO(zjb6^HNf6pa;ryjCe- zH=AFWX%;n;$n!_lQRRk-2VibxVcQjTm=jh&KcYngOFR_3=*2IkQEFJfSO=v{kdG{1 zJ^k|8!pNTEH|p>Unx0)-=mO2a}@UM>PNGJw_gEMw5 z5Xm16+}kr?$L? z1a~EqzKY~rl(qDVzdm-msA~{*I9pslLUmJj@8zwNwD-6UFyr%651F;j`)Kp*vv!J^ z4iMvPn6+qAKD!h+r&vm4=cn#5o3{jS?=epu{74>zBDUoSE6$gimoVkZF)jk+l=7LH zB9iqq2XZ4#WU_k}DL9#M{-Y0AKSxnaCV#GmBiIzp%v(Pysqk8IV zu2;x}4MjoK%bX~v4|$KoUTI**ZahNn2W^VUj$Z_@ROQQ9Phx6u9r4?=F z8i{_DH_l4O1SM8|*gnTNITPF&Q|TzH5h_=} zbzpiu2F-CG>8WIzf?&n~S<&<~{=X5_pvFB1_%U*KmP2elo zIAihoR9UZegWhh|M$v3}Pb#$2(2QHOrcz{*<-FB5vxpv-HS}#x!95G;__gVa#XUXK ztPwpu^95_nRkCPfSKzD|?tsW@s(v`dD0pb(wgPl{@|A|$TIxvbfAg*ftabheT^%Lh zeE9j~_nX4M_In*b6yz2MnvWb;8Shf1{Tn*-H^<~J)&WfvD2%Mr8U2le@NaJcEa5;> zsIk%)jeRBm?Hj5ekihWJEL&du??juhP{1lV?Dz!;JpA{P`>Om;WBvzz(qE(X|7K)z zg&Fhi77I5B(fJuc+9C^K`|u%ETNWUW@PeSAAT0@a@fjR9^lL^jGm1RilP%mPBMfi; zPqBz$=0^bWp(ulqMh}RX!Mjl+_cNP+TtG4RKS1`N*O)+fJbpM<_TEeBl5`FR?aQ+4 z|9t0X&r<{+9#rk==}B2r-7>gF!Rg8#?)tllK%9q@2I!+s=2-^Gy}pchep@e{-(60T z*f*O%UznHBl>&%+Ha0dBv!dA?ARi{A!M}R(!G+N&BePI^<9>VWpMQQD6=Ik!Fc;jf zdIUt;a?3pC64&agJVuXaq{I*>@u)aFzLsDeSJ3bL}Y1z*k{ zNE!UDKEH2ThrK>5?L4IQ%}4Iro?5xt?YhR^2zROBH?`xx2o9e`bMsYNW$0KwW`_bq65b;5*oUq3VG_fZAZ{0(}CoS`kJ znM>Sh?7>lz@asAeLq}6u{?&{R0*swHm$@lg$ZNwcYm<(n;o*#uOdue=qVBfBj|WdL z&1ruH?W;YBn^8ferh=u~rsJSlopajI+}_)$2!Sa|^bdGmro$brV;4Ms*&r8mKCnuJ zmsvJlEBg+xot%L7RL?roc!A*R!WoUfyZ6^Z0oq_OuYY{@c<754FS`FceZ?+TtiG6f zhdLRuOW;rD{l%91dYZBT3%RKox;XsiR_rXeHA)|Hq>THM$9_wDk|iuFi&wJf)8IXj z&-K$UIm@~QfAvGv?tm2~5D*caV)uDgwN38rHYq}wF@j1AIA@vnZPZ#Zsx46BO{R0r zVph#V{$3L2*ah$X({Ag-i&{YD9?s}q!^#KB10fdv_JDsn?e%%s-*cPc=S5Y;0IT0n zN=mjby!GKnMza>EtJwV+<6rdv(8r>==h^}?eRXy9i3f47aQ((M>PF{$WL(N`akOD$ zhZnQ@V$X=BR99C&xzP;PDm5;5PQU2;51WZ{UlmQeTGTek=)BT##lSk_^bLm3FDCcL zqn=eEZ{G}TC^EMxf2^IIQ z*aO$Wo#SZ#T=(bQ_V~lJ!7aPYysn4)n5}TB+6g+$%1Y`c zj?&xR4Z3JMz49ykW~DK-{iuPtxpNS{`{A+RSA;;vA3xU$exdPNCj_wUc{YBD-GIZc)5U8hWK#WTd(B6@51CH}uJ@jKqkz^L{!^z^fN(YJjie_iEg0g5GHc_6R6n*P5u<|g3b zRV(x9iQ8B5*P{zm{-4JDZ#UsTBlDk;**5|w{_`~L8;^fht^c1RGr6~<^q4K8vU-96 P_|d+lceCQg!|?wC_y&s& literal 0 HcmV?d00001 diff --git a/website/redirects.js b/website/redirects.js index 8e31b56f340..74caeb5e388 100644 --- a/website/redirects.js +++ b/website/redirects.js @@ -4,4 +4,16 @@ // modify or delete existing redirects without first verifying internally. // Next.js redirect documentation: https://nextjs.org/docs/api-reference/next.config.js/redirects -module.exports = [] +module.exports = [ + { + source: '/docs/connect/cluster-peering/create-manage-peering', + destination: + '/docs/connect/cluster-peering/usage/establish-cluster-peering', + permanent: true, + }, + { + source: '/docs/connect/cluster-peering/k8s', + destination: '/docs/k8s/connect/cluster-peering/k8s-tech-specs', + permanent: true, + }, +] From 7c9801ecf6f9e1a2e9f71ddc8b655a7fd6704fc2 Mon Sep 17 00:00:00 2001 From: Nathan Coleman Date: Thu, 23 Feb 2023 13:02:03 -0500 Subject: [PATCH 054/262] Fix rendering error on new operator usage docs (#16393) --- website/content/api-docs/operator/usage.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/content/api-docs/operator/usage.mdx b/website/content/api-docs/operator/usage.mdx index ae1e9d87ccb..75298e32b20 100644 --- a/website/content/api-docs/operator/usage.mdx +++ b/website/content/api-docs/operator/usage.mdx @@ -164,4 +164,4 @@ $ curl \ - `PartitionNamespaceConnectServiceInstances` is the total number of Connect service instances registered in the datacenter, - by partition and namespace. \ No newline at end of file + by partition and namespace. From 4653d82ccc005699033c6cd583624e94b6b7d066 Mon Sep 17 00:00:00 2001 From: skpratt Date: Thu, 23 Feb 2023 13:06:09 -0600 Subject: [PATCH 055/262] add missing field to oss struct (#16401) --- api/operator_license.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/api/operator_license.go b/api/operator_license.go index 14c548b1a35..74eed3baa4d 100644 --- a/api/operator_license.go +++ b/api/operator_license.go @@ -30,6 +30,9 @@ type License struct { // no longer be used in any capacity TerminationTime time.Time `json:"termination_time"` + // Whether the license will ignore termination + IgnoreTermination bool `json:"ignore_termination"` + // The product the license is valid for Product string `json:"product"` From 6b5e48b2d93e9dd04a2f2f925f601ef8361d49d1 Mon Sep 17 00:00:00 2001 From: Poonam Jadhav Date: Thu, 23 Feb 2023 14:35:29 -0500 Subject: [PATCH 056/262] fix(docs): correct rate limit metrics (#16400) --- website/content/docs/agent/limits/init-rate-limits.mdx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/website/content/docs/agent/limits/init-rate-limits.mdx b/website/content/docs/agent/limits/init-rate-limits.mdx index 35708571433..7dbabbe6c72 100644 --- a/website/content/docs/agent/limits/init-rate-limits.mdx +++ b/website/content/docs/agent/limits/init-rate-limits.mdx @@ -26,7 +26,7 @@ Because each network has different needs and application, you need to find out w 1. Observe the logs and metrics for your application's typical cycle, such as a 24 hour period. Refer to [`log_file`](/consul/docs/agent/config/config-files#log_file) for information about where to retrieve logs. Call the [`/agent/metrics`](/consul/api-docs/agent#view-metrics) HTTP API endpoint and check the data for the following metrics: - - `rpc.rate_limit.exceeded.read` - - `rpc.rate_limit.exceeded.write` + - `rpc.rate_limit.exceeded` with value `global/read` for label `limit_type` + - `rpc.rate_limit.exceeded` with value `global/write` for label `limit_type` 1. If the limits are not reached, set the `mode` configuration to `enforcing`. Otherwise, continue to adjust and iterate until you find your network's unique limits. \ No newline at end of file From a5188936853c3aeb38e4dc287d810e6ad09c8fd9 Mon Sep 17 00:00:00 2001 From: "Chris S. Kim" Date: Thu, 23 Feb 2023 14:52:18 -0500 Subject: [PATCH 057/262] Fix various flaky tests (#16396) --- .../services/peerstream/stream_test.go | 4 +- .../services/peerstream/testing.go | 10 ++++ agent/xds/delta_test.go | 47 +++++++++++-------- agent/xds/xds_protocol_helpers_test.go | 4 +- command/debug/debug.go | 3 +- 5 files changed, 43 insertions(+), 25 deletions(-) diff --git a/agent/grpc-external/services/peerstream/stream_test.go b/agent/grpc-external/services/peerstream/stream_test.go index 904c2c28b15..055d2ff97cd 100644 --- a/agent/grpc-external/services/peerstream/stream_test.go +++ b/agent/grpc-external/services/peerstream/stream_test.go @@ -1252,8 +1252,8 @@ func TestStreamResources_Server_DisconnectsOnHeartbeatTimeout(t *testing.T) { }) testutil.RunStep(t, "stream is disconnected due to heartbeat timeout", func(t *testing.T) { - disconnectTime := ptr(it.FutureNow(1)) retry.Run(t, func(r *retry.R) { + disconnectTime := ptr(it.StaticNow()) status, ok := srv.StreamStatus(testPeerID) require.True(r, ok) require.False(r, status.Connected) @@ -1423,7 +1423,7 @@ func makeClient(t *testing.T, srv *testServer, peerID string) *MockClient { }, })) - // Receive a services and roots subscription request pair from server + // Receive ExportedService, ExportedServiceList, and PeeringTrustBundle subscription requests from server receivedSub1, err := client.Recv() require.NoError(t, err) receivedSub2, err := client.Recv() diff --git a/agent/grpc-external/services/peerstream/testing.go b/agent/grpc-external/services/peerstream/testing.go index 676aba46f23..2e6e614e9a0 100644 --- a/agent/grpc-external/services/peerstream/testing.go +++ b/agent/grpc-external/services/peerstream/testing.go @@ -150,6 +150,16 @@ func (t *incrementalTime) Now() time.Time { return t.base.Add(dur) } +// StaticNow returns the current internal clock without advancing it. +func (t *incrementalTime) StaticNow() time.Time { + t.mu.Lock() + defer t.mu.Unlock() + + dur := time.Duration(t.next) * time.Second + + return t.base.Add(dur) +} + // FutureNow will return a given future value of the Now() function. // The numerical argument indicates which future Now value you wanted. The // value must be > 0. diff --git a/agent/xds/delta_test.go b/agent/xds/delta_test.go index 23d60198bbf..a61050f8457 100644 --- a/agent/xds/delta_test.go +++ b/agent/xds/delta_test.go @@ -10,7 +10,6 @@ import ( "github.com/armon/go-metrics" envoy_discovery_v3 "github.com/envoyproxy/go-control-plane/envoy/service/discovery/v3" - "github.com/hashicorp/consul/api" "github.com/stretchr/testify/require" rpcstatus "google.golang.org/genproto/googleapis/rpc/status" "google.golang.org/grpc/codes" @@ -21,8 +20,10 @@ import ( "github.com/hashicorp/consul/agent/grpc-external/limiter" "github.com/hashicorp/consul/agent/proxycfg" "github.com/hashicorp/consul/agent/structs" + "github.com/hashicorp/consul/api" "github.com/hashicorp/consul/envoyextensions/xdscommon" "github.com/hashicorp/consul/sdk/testutil" + "github.com/hashicorp/consul/sdk/testutil/retry" "github.com/hashicorp/consul/version" ) @@ -1057,19 +1058,23 @@ func TestServer_DeltaAggregatedResources_v3_ACLEnforcement(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { + // aclResolve may be called in a goroutine even after a + // testcase tt returns. Capture the variable as tc so the + // values don't swap in the next iteration. + tc := tt aclResolve := func(id string) (acl.Authorizer, error) { - if !tt.defaultDeny { + if !tc.defaultDeny { // Allow all return acl.RootAuthorizer("allow"), nil } - if tt.acl == "" { + if tc.acl == "" { // No token and defaultDeny is denied return acl.RootAuthorizer("deny"), nil } // Ensure the correct token was passed - require.Equal(t, tt.token, id) + require.Equal(t, tc.token, id) // Parse the ACL and enforce it - policy, err := acl.NewPolicyFromSource(tt.acl, nil, nil) + policy, err := acl.NewPolicyFromSource(tc.acl, nil, nil) require.NoError(t, err) return acl.NewPolicyAuthorizerWithDefaults(acl.RootAuthorizer("deny"), []*acl.Policy{policy}, nil) } @@ -1095,13 +1100,15 @@ func TestServer_DeltaAggregatedResources_v3_ACLEnforcement(t *testing.T) { // If there is no token, check that we increment the gauge if tt.token == "" { - data := scenario.sink.Data() - require.Len(t, data, 1) - - item := data[0] - val, ok := item.Gauges["consul.xds.test.xds.server.streamsUnauthenticated"] - require.True(t, ok) - require.Equal(t, float32(1), val.Value) + retry.Run(t, func(r *retry.R) { + data := scenario.sink.Data() + require.Len(r, data, 1) + + item := data[0] + val, ok := item.Gauges["consul.xds.test.xds.server.streamsUnauthenticated"] + require.True(r, ok) + require.Equal(r, float32(1), val.Value) + }) } if !tt.wantDenied { @@ -1138,13 +1145,15 @@ func TestServer_DeltaAggregatedResources_v3_ACLEnforcement(t *testing.T) { // If there is no token, check that we decrement the gauge if tt.token == "" { - data := scenario.sink.Data() - require.Len(t, data, 1) - - item := data[0] - val, ok := item.Gauges["consul.xds.test.xds.server.streamsUnauthenticated"] - require.True(t, ok) - require.Equal(t, float32(0), val.Value) + retry.Run(t, func(r *retry.R) { + data := scenario.sink.Data() + require.Len(r, data, 1) + + item := data[0] + val, ok := item.Gauges["consul.xds.test.xds.server.streamsUnauthenticated"] + require.True(r, ok) + require.Equal(r, float32(0), val.Value) + }) } }) } diff --git a/agent/xds/xds_protocol_helpers_test.go b/agent/xds/xds_protocol_helpers_test.go index 8c4481515c8..2edd05b9fb2 100644 --- a/agent/xds/xds_protocol_helpers_test.go +++ b/agent/xds/xds_protocol_helpers_test.go @@ -166,9 +166,6 @@ func newTestServerDeltaScenario( ) *testServerScenario { mgr := newTestManager(t) envoy := NewTestEnvoy(t, proxyID, token) - t.Cleanup(func() { - envoy.Close() - }) sink := metrics.NewInmemSink(1*time.Minute, 1*time.Minute) cfg := metrics.DefaultConfig("consul.xds.test") @@ -177,6 +174,7 @@ func newTestServerDeltaScenario( metrics.NewGlobal(cfg, sink) t.Cleanup(func() { + envoy.Close() sink := &metrics.BlackholeSink{} metrics.NewGlobal(cfg, sink) }) diff --git a/command/debug/debug.go b/command/debug/debug.go index 017f42b77a2..dd03286d68f 100644 --- a/command/debug/debug.go +++ b/command/debug/debug.go @@ -270,7 +270,8 @@ func (c *cmd) prepare() (version string, err error) { // If none are specified we will collect information from // all by default if len(c.capture) == 0 { - c.capture = defaultTargets + c.capture = make([]string, len(defaultTargets)) + copy(c.capture, defaultTargets) } // If EnableDebug is not true, skip collecting pprof From 3c77a89414ed92131b55bf0b29190ca1fd1c866b Mon Sep 17 00:00:00 2001 From: Thomas Eckert Date: Thu, 23 Feb 2023 16:01:47 -0500 Subject: [PATCH 058/262] Native API Gateway Docs (#16365) * Create empty files * Copy over content for overview * Copy over content for usage * Copy over content for api-gateway config * Copy over content for http-route config * Copy over content for tcp-route config * Copy over content for inline-certificate config * Add docs to the sidebar * Clean up overview. Start cleaning up usage * Add BETA badge to API Gateways portion of nav * Fix header * Fix up usage * Fix up API Gateway config * Update paths to be consistent w/ other gateway docs * Fix up http-route * Fix up inline-certificate * rename path * Fix up tcp-route * Add CodeTabs * Add headers to config pages * Fix configuration model for http route and inline certificate * Add version callout to API gateway overview page * Fix values for inline certificate * Fix values for api gateway configuration * Fix values for TCP Route config * Fix values for HTTP Route config * Adds link from k8s gateway to vm gateway page * Remove versioning warning * Serve overview page at ../api-gateway, consistent w/ mesh-gateway * Remove weight field from tcp-route docs * Linking to usage instead of overview from k8s api-gateway to vm api-gateway * Fix issues in usage page * Fix links in usage * Capitalize Kubernetes * Apply suggestions from code review Co-authored-by: trujillo-adam <47586768+trujillo-adam@users.noreply.github.com> * remove optional callout * Apply suggestions from code review Co-authored-by: trujillo-adam <47586768+trujillo-adam@users.noreply.github.com> * Apply suggestions from code review Co-authored-by: trujillo-adam <47586768+trujillo-adam@users.noreply.github.com> * Apply suggestions from code review * Update website/content/docs/connect/gateways/api-gateway/configuration/api-gateway.mdx * Fix formatting of Hostnames * Update website/content/docs/api-gateway/index.mdx * Update website/content/docs/connect/gateways/api-gateway/configuration/http-route.mdx Co-authored-by: Andrew Stucki * Add cross-linking of config entries * Fix rendering error on new operator usage docs * Update website/content/docs/connect/gateways/api-gateway/configuration/http-route.mdx Co-authored-by: trujillo-adam <47586768+trujillo-adam@users.noreply.github.com> * Update website/content/docs/connect/gateways/api-gateway/configuration/http-route.mdx Co-authored-by: trujillo-adam <47586768+trujillo-adam@users.noreply.github.com> * Apply suggestions from code review * Apply suggestions from code review * Add BETA badges to config entry links * http route updates * Add Enterprise keys * Use map instead of list for meta field, use consistent formatting * Convert spaces to tabs * Add all Enterprise info to TCP Route * Use pascal case for JSON api-gateway example * Add enterprise to HCL api-gw cfg * Use pascal case for missed JSON config fields * Add enterprise to JSON api-gw cfg * Add enterprise to api-gw values * adds enterprise to http route * Update website/content/docs/connect/gateways/api-gateway/index.mdx Co-authored-by: danielehc <40759828+danielehc@users.noreply.github.com> * Add enterprise to api-gw spec * Add missing namespace, partition + meta to specification * fixes for http route * Fix ordering of API Gatetway cfg spec items * whitespace * Add linking of values to tcp * Apply suggestions from code review Co-authored-by: Jeff Boruszak <104028618+boruszak@users.noreply.github.com> * Fix comma in wrong place * Apply suggestions from code review Co-authored-by: Jeff Boruszak <104028618+boruszak@users.noreply.github.com> * Move Certificates down * Apply suggestions from code review Co-authored-by: Jeff Boruszak <104028618+boruszak@users.noreply.github.com> * Tabs to spaces in httproute * Use configuration entry instead of config entry * Fix indentations on api-gateway and tcp-route * Add whitespace between code block and prose * Apply suggestions from code review Co-authored-by: trujillo-adam <47586768+trujillo-adam@users.noreply.github.com> * adds <> to http route --------- Co-authored-by: Nathan Coleman Co-authored-by: Melisa Griffin Co-authored-by: Tu Nguyen Co-authored-by: trujillo-adam <47586768+trujillo-adam@users.noreply.github.com> Co-authored-by: Tu Nguyen Co-authored-by: Melisa Griffin Co-authored-by: Andrew Stucki Co-authored-by: danielehc <40759828+danielehc@users.noreply.github.com> Co-authored-by: Jeff Boruszak <104028618+boruszak@users.noreply.github.com> --- website/content/docs/api-gateway/index.mdx | 4 +- .../api-gateway/configuration/api-gateway.mdx | 331 +++++++++ .../api-gateway/configuration/http-route.mdx | 678 ++++++++++++++++++ .../configuration/inline-certificate.mdx | 127 ++++ .../api-gateway/configuration/tcp-route.mdx | 256 +++++++ .../connect/gateways/api-gateway/index.mdx | 28 + .../connect/gateways/api-gateway/usage.mdx | 211 ++++++ website/data/docs-nav-data.json | 76 +- 8 files changed, 1708 insertions(+), 3 deletions(-) create mode 100644 website/content/docs/connect/gateways/api-gateway/configuration/api-gateway.mdx create mode 100644 website/content/docs/connect/gateways/api-gateway/configuration/http-route.mdx create mode 100644 website/content/docs/connect/gateways/api-gateway/configuration/inline-certificate.mdx create mode 100644 website/content/docs/connect/gateways/api-gateway/configuration/tcp-route.mdx create mode 100644 website/content/docs/connect/gateways/api-gateway/index.mdx create mode 100644 website/content/docs/connect/gateways/api-gateway/usage.mdx diff --git a/website/content/docs/api-gateway/index.mdx b/website/content/docs/api-gateway/index.mdx index 462c286e508..83372546ac4 100644 --- a/website/content/docs/api-gateway/index.mdx +++ b/website/content/docs/api-gateway/index.mdx @@ -5,9 +5,9 @@ description: >- Consul API Gateway enables external network client access to a service mesh on Kubernetes and forwards requests based on path or header information. Learn about how the k8s Gateway API specification configures Consul API Gateway so you can control access and simplify traffic management. --- -# API Gateway for Kubernetes Overview +# API Gateway for Kubernetes overview -This topic provides an overview of the Consul API Gateway. +This topic provides an overview of the Consul API Gateway for deploying on Kubernetes. If you would like to deploy on virtual machines, refer to [API Gateways on Virtual Machines](/consul/docs/connect/gateways/api-gateway/usage). ## What is Consul API Gateway? diff --git a/website/content/docs/connect/gateways/api-gateway/configuration/api-gateway.mdx b/website/content/docs/connect/gateways/api-gateway/configuration/api-gateway.mdx new file mode 100644 index 00000000000..11ad78f2d27 --- /dev/null +++ b/website/content/docs/connect/gateways/api-gateway/configuration/api-gateway.mdx @@ -0,0 +1,331 @@ +--- +layout: docs +page_title: API Gateway Configuration Entry Reference +description: Learn how to configure a Consul API Gateway on VMs. +--- + +# API gateway configuration entry reference + +This topic provides reference information for the API gateway configuration entry that you can deploy to networks in virtual machine (VM) environments. For reference information about configuring Consul API gateways on Kubernetes, refer to [Gateway Resource Configuration](/consul/docs/api-gateway/configuration/gateway). + +## Introduction + +A gateway is a type of network infrastructure that determines how service traffic should be handled. Gateways contain one or more listeners that bind to a set of hosts and ports. An HTTP Route or TCP Route can then attach to a gateway listener to direct traffic from the gateway to a service. + +## Configuration model + +The following list outlines field hierarchy, language-specific data types, and requirements in an `api-gateway` configuration entry. Click on a property name to view additional details, including default values. + +- [`Kind`](#kind): string | must be `"api-gateway"` +- [`Name`](#name): string | no default +- [`Namespace`](#namespace): string | no default +- [`Partition`](#partition): string | no default +- [`Meta`](#meta): map | no default +- [`Listeners`](#listeners): list of objects | no default + - [`Name`](#listeners-name): string | no default + - [`Port`](#listeners-port): number | no default + - [`Hostname`](#listeners-hostname): string | `"*"` + - [`Protocol`](#listeners-protocol): string | `"tcp"` + - [`TLS`](#listeners-tls): map | none + - [`MinVersion`](#listeners-tls-minversion): string | no default + - [`MaxVersion`](#listeners-tls-maxversion): string | no default + - [`CipherSuites`](#listeners-tls-ciphersuites): list of strings | Envoy default cipher suites + - [`Certificates`](#listeners-tls-certificates): list of objects | no default + - [`Kind`](#listeners-tls-certificates-kind): string | must be `"inline-certificate"` + - [`Name`](#listeners-tls-certificates-name): string | no default + - [`Namespace`](#listeners-tls-certificates-namespace): string | no default + - [`Partition`](#listeners-tls-certificates-partition): string | no default + +## Complete configuration + +When every field is defined, an `api-gateway` configuration entry has the following form: + + + +```hcl +Kind = "api-gateway" +Name = "" +Namespace = "" +Partition = "" + +Meta = { + = "" +} + +Listeners = [ + { + Port = + Name = "" + Protocol = "" + TLS = { + MaxVersion = "" + MinVersion = "" + CipherSuites = [ + "" + ] + Certificates = [ + { + Kind = "inline-certificate" + Name = "" + Namespace = "" + Partition = "" + } + ] + } + } +] +``` + +```json +{ + "Kind": "api-gateway", + "Name": "", + "Namespace": "", + "Partition": "", + "Meta": { + "": "" + }, + "Listeners": [ + { + "Name": "", + "Port": , + "Protocol": "", + "TLS": { + "MaxVersion": "", + "MinVersion": "", + "CipherSuites": [ + "" + ], + "Certificates": [ + { + "Kind": "inline-certificate", + "Name": "", + "Namespace": "", + "Partition": "" + } + ] + } + } + ] +} +``` + + + +## Specification + +This section provides details about the fields you can configure in the +`api-gateway` configuration entry. + +### `Kind` + +Specifies the type of configuration entry to implement. This must be +`api-gateway`. + +#### Values + +- Default: none +- This field is required. +- Data type: string value that must be set to `"api-gateway"`. + +### `Name` + +Specifies a name for the configuration entry. The name is metadata that you can +use to reference the configuration entry when performing Consul operations, +such as applying a configuration entry to a specific cluster. + +#### Values + +- Default: none +- This field is required. +- Data type: string + +### `Namespace` + +Specifies the Enterprise [namespace](/consul/docs/enterprise/namespaces) to apply to the configuration entry. + +#### Values + +- Default: `"default"` in Enterprise +- Data type: string + +### `Partition` + +Specifies the Enterprise [admin partition](/consul/docs/enterprise/admin-partitions) to apply to the configuration entry. + +#### Values + +- Default: `"default"` in Enterprise +- Data type: string + +### `Meta` + +Specifies an arbitrary set of key-value pairs to associate with the gateway. + +#### Values + +- Default: none +- Data type: map containing one or more keys and string values. + +### `Listeners[]` + +Specifies a list of listeners that gateway should set up. Listeners are +uniquely identified by their port number. + +#### Values + +- Default: none +- This field is required. +- Data type: List of maps. Each member of the list contains the following fields: + - [`Name`](#listeners-name) + - [`Port`](#listeners-port) + - [`Hostname`](#listeners-hostname) + - [`Protocol`](#listeners-protocol) + - [`TLS`](#listeners-tls) + +### `Listeners[].Name` + +Specifies the unique name for the listener. This field accepts letters, numbers, and hyphens. + +#### Values + +- Default: none +- This field is required. +- Data type: string + +### `Listeners[].Port` + +Specifies the port number that the listener receives traffic on. + +#### Values + +- Default: `0` +- This field is required. +- Data type: integer + +### `Listeners[].Hostname` + +Specifies the hostname that the listener receives traffic on. + +#### Values + +- Default: `"*"` +- This field is optional. +- Data type: string + +### `Listeners[].Protocol` + +Specifies the protocol associated with the listener. + +#### Values + +- Default: none +- This field is required. +- The data type is one of the following string values: `"tcp"` or `"http"`. + +### `Listeners[].TLS` + +Specifies the TLS configurations for the listener. + +#### Values + +- Default: none +- Map that contains the following fields: + - [`MaxVersion`](#listeners-tls-maxversion) + - [`MinVersion`](#listeners-tls-minversion) + - [`CipherSuites`](#listeners-tls-ciphersuites) + - [`Certificates`](#listeners-tls-certificates) + +### `Listeners[].TLS.MaxVersion` + +Specifies the maximum TLS version supported for the listener. + +#### Values + +- Default depends on the version of Envoy: + - Envoy 1.22.0 and later default to `TLSv1_2` + - Older versions of Envoy default to `TLSv1_0` +- Data type is one of the following string values: + - `TLS_AUTO` + - `TLSv1_0` + - `TLSv1_1` + - `TLSv1_2` + - `TLSv1_3` + +### `Listeners[].TLS.MinVersion` + +Specifies the minimum TLS version supported for the listener. + +#### Values + +- Default: none +- Data type is one of the following string values: + - `TLS_AUTO` + - `TLSv1_0` + - `TLSv1_1` + - `TLSv1_2` + - `TLSv1_3` + +### `Listeners[].TLS.CipherSuites[]` + +Specifies a list of cipher suites that the listener supports when negotiating connections using TLS 1.2 or older. + +#### Values + +- Defaults to the ciphers supported by the version of Envoy in use. Refer to the + [Envoy documentation](https://www.envoyproxy.io/docs/envoy/latest/api-v3/extensions/transport_sockets/tls/v3/common.proto#envoy-v3-api-field-extensions-transport-sockets-tls-v3-tlsparameters-cipher-suites) + for details. +- Data type: List of string values. Refer to the + [Consul repository](https://github.com/hashicorp/consul/blob/v1.11.2/types/tls.go#L154-L169) + for a list of supported ciphers. + +### `Listeners[].TLS.Certificates[]` + +The list of references to inline certificates that the listener uses for TLS termination. + +#### Values + +- Default: None +- Data type: List of maps. Each member of the list has the following fields: + - [`Kind`](#listeners-tls-certificates-kind) + - [`Name`](#listeners-tls-certificates-name) + - [`Namespace`](#listeners-tls-certificates-namespace) + - [`Partition`](#listeners-tls-certificates-partition) + +### `Listeners[].TLS.Certificates[].Kind` + +The list of references to inline-certificates that the listener uses for TLS termination. + +#### Values + +- Default: None +- This field is required and must be set to `"inline-certificate"`. +- Data type: string + +### `Listeners[].TLS.Certificates[].Name` + +The list of references to inline certificates that the listener uses for TLS termination. + +#### Values + +- Default: None +- This field is required. +- Data type: string + +### `Listeners[].TLS.Certificates[].Namespace` + +Specifies the Enterprise [namespace](/consul/docs/enterprise/namespaces) where the certificate can be found. + +#### Values + +- Default: `"default"` in Enterprise +- Data type: string + +### `Listeners[].TLS.Certificates[].Partition` + +Specifies the Enterprise [admin partition](/consul/docs/enterprise/admin-partitions) where the certificate can be found. + +#### Values + +- Default: `"default"` in Enterprise +- Data type: string diff --git a/website/content/docs/connect/gateways/api-gateway/configuration/http-route.mdx b/website/content/docs/connect/gateways/api-gateway/configuration/http-route.mdx new file mode 100644 index 00000000000..c492e331e2a --- /dev/null +++ b/website/content/docs/connect/gateways/api-gateway/configuration/http-route.mdx @@ -0,0 +1,678 @@ +--- +layout: docs +page_title: HTTP Route Configuration +description: Learn how to configure an HTTP Route bound to an API Gateway on VMs. +--- + +# HTTP route configuration reference + +This topic provides reference information for the gateway routes configuration entry. Refer to [Route Resource Configuration](/consul/docs/api-gateway/configuration/routes) for information about configuring API gateway routes in Kubernetes environments. + +## Configuration model + +The following list outlines field hierarchy, language-specific data types, and +requirements in an `http-route` configuration entry. Click on a property name +to view additional details, including default values. + +- [`Kind`](#kind): string | must be `http-route` +- [`Name`](#name): string | no default +- [`Namespace`](#namespace): string | no default +- [`Partition`](#partition): string | no default +- [`Meta`](#meta): map | no default +- [`Hostnames`](#hostnames): list | no default +- [`Parents`](#parents): list | no default + - [`Kind`](#parents-kind): string | must be `api-gateway` + - [`Name`](#parents-name): string | no default + - [`Namespace`](#parents-namespace): string | no default + - [`Partition`](#parents-partition): string | no default + - [`SectionName`](#parents-sectionname): string | no default +- [`Rules`](#rules): list | no default + - [`Filters`](#rules-filters): map | no default + - [`Headers`](#rules-filters-headers): list | no default + - [`Add`](#rules-filters-headers-add): map | no default + - [`Remove`](#rules-filters-headers-remove): list | no default + - [`Set`](#rules-filters-headers-set): map | no default + - [`URLRewrite`](#rules-filters-urlrewrite): map | no default + - [`Path`](#rules-filters-urlrewrite-path): string | no default + - [`Matches`](#rules-matches): list | no default + - [`Headers`](#rules-matches-headers): list | no default + - [`Match`](#rules-matches-headers-match): string | no default + - [`Name`](#rules-matches-headers-name): string | no default + - [`Value`](#rules-matches-headers-value): string | no default + - [`Method`](#rules-matches-method): string | no default + - [`Path`](#rules-matches-path): map | no default + - [`Match`](#rules-matches-path-match): string | no default + - [`Value`](#rules-matches-path-value): string | no default + - [`Query`](#rules-matches-query): list | no default + - [`Match`](#rules-matches-query-match): string | no default + - [`Name`](#rules-matches-query-name): string | no default + - [`Value`](#rules-matches-query-value): string | no default + - [`Services`](#rules-services): list | no default + - [`Name`](#rules-services-name): string | no default + - [`Namespace`](#rules-services-namespace): string + - [`Partition`](#rules-services-partition): string + - [`Weight`](#rules-services-weight): number | `1` + - [`Filters`](#rules-services-filters): map | no default + - [`Headers`](#rules-services-filters-headers): list | no default + - [`Add`](#rules-services-filters-headers-add): map | no default + - [`Remove`](#rules-services-filters-headers-remove): list | no default + - [`Set`](#rules-services-filters-headers-set): map | no default + - [`URLRewrite`](#rules-services-filters-urlrewrite): map | no default + - [`Path`](#rules-services-filters-urlrewrite-path): string | no default + +## Complete configuration + +When every field is defined, an `http-route` configuration entry has the following form: + + + +```hcl +Kind = "http-route" +Name = "" +Namespace = "" +Partition = "" +Meta = { + "" = "" +} +Hostnames = [""] + +Parents = [ + { + Kind = "api-gateway" + Name = "" + Namespace = "" + Partition = "" + SectionName = "" + } +] + +Rules = [ + { + Filters = { + Headers = [ + { + Add = { + "" = "" + } + Remove = [ + "" + ] + Set = { + "" = "" + } + } + ] + URLRewrite = { + Path = "" + } + } + Matches = [ + { + Headers = [ + { + Match = "" + Name = "" + Value = "" + } + ] + Method = "" + Path = { + Match = "" + Value = "" + } + Query = [ + { + Match = "" + Name = "" + Value = "" + } + ] + } + ] + Services = [ + { + Name = "" + Namespace = "" + Partition = "" + Weight = "" + Filters = { + Headers = [ + { + Add = { + "" = "" + } + Remove = [ + "" + ] + Set = { + "" = "" + } + } + ] + URLRewrite = { + Path = "" + } + } + } + ] + } +] + +``` + +```json +{ + "Kind": "http-route", + "Name": "", + "Namespace": "", + "Partition": "", + "Meta": { + "": "" + }, + "Hostnames": [ + "" + ], + "Parents": [ + { + "Kind": "api-gateway", + "Name": "", + "Namespace": "", + "Partition": "", + "SectionName": "" + } + ], + "Rules": [ + { + "Filters": [ + { + "Headers": [ + { + "Add": [ + { + "": "" + } + ], + "Remove": ["

    "], + "Set": [ + { + "": "" + } + ] + } + ], + "URLRewrite": [ + { + "Path": "" + } + ] + } + ], + "Matches": [ + { + "Headers": [ + { + "Match": "", + "Name": "", + "Value": "" + } + ], + "Method": "", + "Path": [ + { + "Match": "", + "Value": "" + } + ], + "Query": [ + { + "Match": "", + "Name": "", + "Value": "" + } + ] + } + ], + "Services": [ + { + "Name": "", + "Namespace": "", + "Partition": "", + "Weight": "", + "Filters": [ + { + "Headers": [ + { + "Add": [ + { + "" + } + ], + "Remove": ["
    "], + "Set": [ + { + "" + } + ] + } + ], + "URLRewrite": [ + { + "Path": "" + } + ] + } + ] + } + ] + } + ] +} +``` + + + +## Specification + +This section provides details about the fields you can configure in the `http-route` configuration entry. + +### `Kind` + +Specifies the type of configuration entry to implement. For HTTP routes, this must be `http-route`. + +#### Values + +- Default: none +- This field is required. +- Data type: string value that must be set to `"http-route"`. + +### `Name` + +Specifies a name for the configuration entry. The name is metadata that you can +use to reference the configuration entry when performing Consul operations, +such as applying a configuration entry to a specific cluster. + +#### Values + +- Default: Defaults to the name of the node after writing the entry to the Consul server. +- This field is required. +- Data type: string + +### `Namespace` + +Specifies the Enterprise [namespace](/consul/docs/enterprise/namespaces) to apply to the configuration entry. + +#### Values + +- Default: `"default"` in Enterprise +- Data type: string + +### `Partition` + +Specifies the Enterprise [admin partition](/consul/docs/enterprise/admin-partitions) to apply to the configuration entry. + +#### Values + +- Default: `"default"` in Enterprise +- Data type: string + +### `Meta` + +Specifies an arbitrary set of key-value pairs to associate with the route. + +#### Values + +- Default: none +- Data type: map containing one or more keys and string values. + +### `Parents[]` + +Specifies the list of gateways that this route binds to. + +#### Values + +- Default: none +- Data type: List of map. Each member of the list contains the following fields: + - `Kind` + - `Name` + - `Namespace` + - `Partition` + - `SectionName` + +### `Parents[].Kind` + +Specifies the type of resource to bind to. This field is required and must be +set to `"api-gateway"` + +#### Values + +- Default: none +- This field is required. +- Data type: string value set to `"api-gateway"` + +### `Parents[].Name` + +Specifies the name of the api-gateway to bind to. + +#### Values + +- Default: none +- This field is required. +- Data type: string + +### `Parents[].Namespace` + +Specifies the Enterprise [namespace](/consul/docs/enterprise/namespaces) to apply to the configuration entry. + +#### Values + +- Default: `"default"` in Enterprise +- Data type: string + +### `Parents[].Partition` + +Specifies the Enterprise [admin partition](/consul/docs/enterprise/admin-partitions) to apply to the configuration entry. + +#### Values + +- Default: `"default"` in Enterprise +- Data type: string + +### `Parents[].SectionName` + +Specifies the name of the listener to bind to on the `api-gateway`. If left +empty, this route binds to _all listeners_ on the parent gateway. + +#### Values + +- Default: "" +- Data type: string + +### `Rules[]` + +Specifies the list of HTTP-based routing rules that this route uses to construct a route table. + +#### Values + +- Default: +- Data type: List of maps. Each member of the list contains the following fields: + - `Filters` + - `Matches` + - `Services` + +### `Rules[].Filters` + +Specifies the list of HTTP-based filters used to modify a request prior to routing it to the upstream service. + +#### Values + +- Default: none +- Data type: Map that contains the following fields: + - `Headers` + - `UrlRewrite` + +### `Rules[].Filters.Headers[]` + +Defines operations to perform on matching request headers when an incoming request matches the `Rules.Matches` configuration. + +#### Values + +This field contains the following configuration objects: + +| Parameter | Description | Type | +| --------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------- | +| `set` | Configure this field to rewrite the HTTP request header. It specifies the name of an HTTP header to overwrite and the new value to set. Any existing values associated with the header name are overwritten. You can specify the following configurations:
    • `name`: Required string that specifies the name of the HTTP header to set.
    • `value`: Required string that specifies the value of the HTTP header to set.
    | List of maps | +| `add` | Configure this field to append the request header with a new value. It specifies the name of an HTTP header to append and the values to add. You can specify the following configurations:
    • `name`: Required string that specifies the name of the HTTP header to append.
    • `value`: Required string that specifies the value of the HTTP header to add.
    | List of maps | +| `remove` | Configure this field to specify an array of header names to remove from the request header. | List of strings | + +### `Rules[].Filters.URLRewrite` + +Specifies rule for rewriting the URL of incoming requests when an incoming request matches the `Rules.Matches` configuration. + +#### Values + +- Default: none +- This field is a map that contains a `Path` field. + +### Rules[].Filters.URLRewrite.Path + +Specifies a path that determines how Consul API Gateway rewrites a URL path. Refer to [Reroute HTTP requests](/consul/docs/api-gateway/usage#reroute-http-requests) for additional information. + +#### Values + +The following table describes the parameters for `path`: + +| Parameter | Description | Type | +| -------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------ | +| `replacePrefixMatch` | Specifies a value that replaces the path prefix for incoming HTTP requests. The operation only affects the path prefix. The rest of the path is unchanged. | String | +| `type` | Specifies the type of replacement to use for the URL path. You can specify the following values:
    • `ReplacePrefixMatch`: Replaces the matched prefix of the URL path (default).
    | String | + +### `Rules[].Matches[]` + +Specifies the matching criteria used in the routing table. When an incoming +request matches the given HTTPMatch configuration, traffic routes to +services specified in the [`Rules.Services`](#rules-services) field. + +#### Values + +- Default: none +- Data type: List containing maps. Each member of the list contains the following fields: + - `Headers` + - `Method` + - `Path` + - `Query` + +### `Rules[].Matches[].Headers[]` + +Specifies rules for matching incoming request headers. You can specify multiple rules in a list, as well as multiple lists of rules. If all rules in a single list are satisfied, then the route forwards the request to the appropriate service defined in the [`Rules.Services`](#rules-services) configuration. You can create multiple `Header[]` lists to create a range of matching criteria. When at least one list of matching rules are satisfied, the route forwards the request to the appropriate service defined in the [`Rules.Services`](#rules-services) configuration. + +#### Values + +- Default: none +- Data type: List containing maps with the following fields: + - `Match` + - `Name` + - `Value` + +### `Rules.Matches.Headers.Match` + +Specifies type of match for headers: `"exact"`, `"prefix"`, or `"regex"`. + +#### Values + +- Default: none +- Data type: string + +### `Rules.Matches.Headers.Name` + +Specifies the name of the header to match. + +#### Values + +- Default: none +- Data type: string + +### `Rules[].Matches.Headers.Value` + +Specifies the value of the header to match. + +#### Values + +- Default: none +- Data type: string + +### `Rules[].Matches[].Method` + +Specifies a list of strings that define matches based on HTTP request method. + +#### Values + +Specify one of the following string values: + +- `HEAD` +- `POST` +- `PUT` +- `PATCH` +- `GET` +- `DELETE` +- `OPTIONS` +- `TRACE` +- `CONNECT` + +### `Rules[].Matches[].Path` + +Specifies the HTTP method to match. + +#### Values + +- Default: none +- Data type: map containing the following fields: + - `Match` + - `Value` + +### `Rules[].Matches[].Path.Match` + +Specifies type of match for the path: `"exact"`, `"prefix"`, or `"regex"`. + +#### Values + +- Default: none +- Data type: string + +### `Rules[].Matches[].Path.Value` + +Specifies the value of the path to match. + +#### Values + +- Default: none +- Data type: string + +### `Rules[].Matches[].Query[]` + +Specifies how a match is completed on a request’s query parameters. + +#### Values + +- Default: none +- Data type: List of map that contains the following fields: + - `Match` + - `Name` + - `Value` + +### `Rules[].Matches[].Query[].Match` + +Specifies type of match for query parameters: `"exact"`, `"prefix"`, or `"regex"`. + +#### Values + +- Default: none +- Data type: string + +### `Rules[].Matches[].Query[].Name` + +Specifies the name of the query parameter to match. + +#### Values + +- Default: none +- Data type: string + +### `Rules[].Matches[].Query[].Value` + +Specifies the value of the query parameter to match. + +#### Values + +- Default: none +- Data type: string + +### `Rules[].Services[]` + +Specifies the service that the API gateway routes incoming requests to when the +requests match the `Rules.Matches` configuration. + +#### Values + +- Default: none +- This field contains a list of maps. Each member of the list contains the following fields: + - `Name` + - `Weight` + - `Filters` + - `Namespace` + - `Partition` + +### `Rules[].Services[].Name` + +Specifies the name of an HTTP-based service to route to. + +#### Values + +- Default: none +- Data type: string + +### `Rules[].Services[].Namespace` + +Specifies the Enterprise [namespace](/consul/docs/enterprise/namespaces) to apply to the configuration entry. + +#### Values + +- Default: `"default"` in Enterprise +- Data type: string + +### `Rules[].Services.Partition` + +Specifies the Enterprise [admin partition](/consul/docs/enterprise/admin-partitions) to apply to the configuration entry. + +#### Values + +- Default: `"default"` in Enterprise +- Data type: string + +### `Rules[].Services[].Weight` + +Specifies the proportion of requests forwarded to the specified service. The +proportion is determined by dividing the value of the weight by the sum of all +weights in the service list. For non-zero values, there may be some deviation +from the exact proportion depending on the precision an implementation +supports. Weight is not a percentage and the sum of weights does not need to +equal 100. + +#### Values + +- Default: none +- Data type: integer + +### `Rules[].Services[].Filters` + +Specifies the list of HTTP-based filters used to modify a request prior to +routing it to this upstream service. + +#### Values + +- Default: none +- Data type: Map that contains the following fields: + - `Headers` + - `UrlRewrite` + +### `Rules[].Services[].Filters.Headers[]` + +Defines operations to perform on matching request headers. + +#### Values + +This field contains the following configuration objects: + +| Parameter | Description | Type | +| --------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------- | +| `set` | Configure this field to rewrite the HTTP request header. It specifies the name of an HTTP header to overwrite and the new value to set. Any existing values associated with the header name are overwritten. You can specify the following configurations:
    • `name`: Required string that specifies the name of the HTTP header to set.
    • `value`: Required string that specifies the value of the HTTP header to set.
    | List of maps | +| `add` | Configure this field to append the request header with a new value. It specifies the name of an HTTP header to append and the values to add. You can specify the following configurations:
    • `name`: Required string that specifies the name of the HTTP header to append.
    • `value`: Required string that specifies the value of the HTTP header to add.
    | List of maps | +| `remove` | Configure this field to specify an array of header names to remove from the request header. | List of strings | + +### `Rules[].Services[].Filters.URLRewrite` + +Specifies rule for rewriting the URL of incoming requests. + +#### Values + +- Default: none +- This field is a map that contains a `Path` field. diff --git a/website/content/docs/connect/gateways/api-gateway/configuration/inline-certificate.mdx b/website/content/docs/connect/gateways/api-gateway/configuration/inline-certificate.mdx new file mode 100644 index 00000000000..4fca7c54ee6 --- /dev/null +++ b/website/content/docs/connect/gateways/api-gateway/configuration/inline-certificate.mdx @@ -0,0 +1,127 @@ +--- +layout: docs +page_title: Inline Certificate Configuration Reference +description: Learn how to configure an inline certificate bound to an API Gateway on VMs. +--- + +# Inline certificate configuration reference + +This topic provides reference information for the gateway inline certificate +configuration entry. For information about certificate configuration for Kubernetes environments, refer to [Gateway Resource Configuration](/consul/docs/api-gateway/configuration/gateway). + +## Configuration model + +The following list outlines field hierarchy, language-specific data types, and +requirements in an `inline-certificate` configuration entry. Click on a property name +to view additional details, including default values. + +- [`Kind`](#kind): string | must be `"inline-certificate"` +- [`Name`](#name): string | no default +- [`Namespace`](#namespace): string | no default +- [`Partition`](#partition): string | no default +- [`Meta`](#meta): map | no default +- [`Certificate`](#certificate): string | no default +- [`PrivateKey`](#privatekey): string | no default + +## Complete configuration + +When every field is defined, an `inline-certificate` configuration entry has the following form: + + + +```HCL +Kind = "inline-certificate" +Name = "" + +Meta = { + "" = "" +} + +Certificate = "" +PrivateKey = "" +``` + +```JSON +{ + "Kind": "inline-certificate", + "Name": "", + "Meta": { + "any key": "any value" + } + "Certificate": "", + "PrivateKey": "" +} +``` + + + +## Specification + +### `Kind` + +Specifies the type of configuration entry to implement. + +#### Values + +- Default: none +- This field is required. +- Data type: string that must equal `"inline-certificate"` + +### `Name` + +Specifies a name for the configuration entry. The name is metadata that you can +use to reference the configuration entry when performing Consul operations, such +as applying a configuration entry to a specific cluster. + +#### Values + +- Default: none +- This field is required. +- Data type: string + +### `Namespace` + +Specifies the Enterprise [namespace](/consul/docs/enterprise/namespaces) to apply to the configuration entry. + +#### Values + +- Default: `"default"` in Enterprise +- Data type: string + +### `Partition` + +Specifies the Enterprise [admin partition](/consul/docs/enterprise/admin-partitions) to apply to the configuration entry. + +#### Values + +- Default: `"default"` in Enterprise +- Data type: string + +### `Meta` + +Specifies an arbitrary set of key-value pairs to associate with the gateway. + +#### Values + +- Default: none +- Data type: map containing one or more keys and string values. + +### `Certificate` + +Specifies the inline public certificate to use for TLS. + +#### Values + +- Default: none +- This field is required. +- Data type: string value of the public certificate + +### `PrivateKey` + +Specifies the inline private key to use for TLS. + +#### Values + +- Default: none +- This field is required. +- Data type: string value of the private key diff --git a/website/content/docs/connect/gateways/api-gateway/configuration/tcp-route.mdx b/website/content/docs/connect/gateways/api-gateway/configuration/tcp-route.mdx new file mode 100644 index 00000000000..23b32662d92 --- /dev/null +++ b/website/content/docs/connect/gateways/api-gateway/configuration/tcp-route.mdx @@ -0,0 +1,256 @@ +--- +layout: docs +page_title: TCP Route Configuration Reference +description: Learn how to configure a TCP Route that is bound to an API gateway on VMs. +--- + +# TCP route configuration Reference + +This topic provides reference information for the gateway TCP routes configuration +entry. Refer to [Route Resource Configuration](/consul/docs/api-gateway/configuration/routes) for information +about configuring API gateways in Kubernetes environments. + +## Configuration model + +The following list outlines field hierarchy, language-specific data types, and +requirements in an `tcp-route` configuration entry. Click on a property name to +view additional details, including default values. + +- [`Kind`](#kind): string | must be `"tcp-route"` +- [`Name`](#name): string | no default +- [`Namespace`](#namespace): string | no default +- [`Partition`](#partition): string | no default +- [`Meta`](#meta): map | no default +- [`Services`](#services): list | no default + - [`Name`](#services-name): string | no default + - [`Namespace`](#services-namespace): string | no default + - [`Partition`](#services-partition): string | no default +- [`Parents`](#parents): list | no default + - [`Kind`](#parents-kind): string | must be `"api-gateway"` + - [`Name`](#parents-name): string | no default + - [`Namespace`](#parents-namespace): string | no default + - [`Partition`](#parents-partition): string | no default + - [`SectionName`](#parents-sectionname): string | no default + +## Complete configuration + +When every field is defined, a `tcp-route` configuration entry has the following form: + + + +```HCL +Kind = "tcp-route" +Name = "" +Namespace = "" +Partition = "" + +Meta = { + "" = "" +} + +Services = [ + { + Name = "" + Namespace = "" + Partition = "" + } +] + + +Parents = [ + { + Kind = "api-gateway" + Name = "" + Namespace = "" + Partition = "" + SectionName = "" + } +] +``` + +```JSON +{ + "Kind": "tcp-route", + "Name": "", + "Namespace": "", + "Partition": "", + "Meta": { + "": "" + }, + "Services": [ + { + "Name": "" + "Namespace": "", + "Partition": "", + } + ], + "Parents": [ + { + "Kind": "api-gateway", + "Name": "", + "Namespace": "", + "Partition": "", + "SectionName": "" + } + ] +} +``` + + + +## Specification + +This section provides details about the fields you can configure in the +`tcp-route` configuration entry. + +### `Kind` + +Specifies the type of configuration entry to implement. This must be set to +`"tcp-route"`. + +#### Values + +- Default: none +- This field is required. +- Data type: string value that must be set to`tcp-route`. + +### `Name` + +Specifies a name for the configuration entry. The name is metadata that you can +use to reference the configuration entry when performing Consul operations, +such as applying a configuration entry to a specific cluster. + +#### Values + +- Default: Defaults to the name of the node after writing the entry to the Consul server. +- This field is required. +- Data type: string + +### `Namespace` + +Specifies the Enterprise [namespace](/consul/docs/enterprise/namespaces) to apply to the configuration entry. + +#### Values + +- Default: `"default"` in Enterprise +- Data type: string + +### `Partition` + +Specifies the Enterprise [admin partition](/consul/docs/enterprise/admin-partitions) to apply to the configuration entry. + +#### Values + +- Default: `"default"` in Enterprise +- Data type: string + +### `Meta` + +Specifies an arbitrary set of key-value pairs to associate with the gateway. + +#### Values + +- Default: none +- Data type: map containing one or more keys and string values. + +### `Services` + +Specifies a TCP-based service the API gateway routes incoming requests +to. You can only specify one service. + +#### Values + +- Default: none +- The data type is a list of maps. Each member of the list contains the following fields: + - [`Name`](#services-name) + - [`Namespace`](#services-namespace) + - [`Partition`](#services-partition) + +### `Services.Name` + +Specifies the list of TCP-based services to route to. You can specify a maximum of one service. + +#### Values + +- Default: none +- Data type: string + +### `Services.Namespace` + +Specifies the Enterprise [namespace](/consul/docs/enterprise/namespaces) where the service is located. + +#### Values + +- Default: `"default"` in Enterprise +- Data type: string + +### `Services.Partition` + +Specifies the Enterprise [admin partition](/consul/docs/enterprise/admin-partitions) where the service is located. + +#### Values + +- Default: `"default"` in Enterprise +- Data type: string + +### `Parents` + +Specifies the list of gateways that the route is bound to. + +#### Values + +- Default: none +- Data type: List of map. Each member of the list contains the following fields: + - [`Kind`](#parents-kind) + - [`Name`](#parents-name) + - [`Namespace`](#parents-namespace) + - [`Partition`](#parents-partition) + - [`SectionName`](#parents-sectionname) + +### `Parents.Kind` + +Specifies the type of resource to bind to. This field is required and must be +set to `"api-gateway"` + +#### Values + +- Default: none +- This field is required. +- Data type: string + +### `Parents.Name` + +Specifies the name of the API gateway to bind to. + +#### Values + +- Default: none +- This field is required. +- Data type: string + +### `Parents.Namespace` + +Specifies the Enterprise [namespace](/consul/docs/enterprise/namespaces) where the parent is located. + +#### Values + +- Default: `"default"` in Enterprise +- Data type: string + +### `Parents.Partition` + +Specifies the Enterprise [admin partition](/consul/docs/enterprise/admin-partitions) where the parent is located. + +#### Values + +- Default: `"default"` in Enterprise +- Data type: string + +### `Parents.SectionName` + +Specifies the name of the listener defined in the [`api-gateway` configuration](/consul/docs/connect/gateways/api-gateway/configuration/api-gateway) that the route binds to. If the field is configured to an empty string, the route binds to all listeners on the parent gateway. + +#### Values + +- Default: `""` +- Data type: string diff --git a/website/content/docs/connect/gateways/api-gateway/index.mdx b/website/content/docs/connect/gateways/api-gateway/index.mdx new file mode 100644 index 00000000000..832fd943b2e --- /dev/null +++ b/website/content/docs/connect/gateways/api-gateway/index.mdx @@ -0,0 +1,28 @@ +--- +layout: docs +page_title: API Gateways Overview +description: API gateways are objects in Consul that enable ingress requests to services in your service mesh. Learn about API gateways for VMs in this overview. +--- + +# API gateway overview + +API gateways enable external network clients to access applications and services +running in a Consul datacenter. This type of network traffic is commonly +called _north-south_ network traffic because it refers to the flow of +data into and out of a specific environment. API gateways can also forward +requests from clients to specific destinations based on path or request +protocol. + +API gateways solve the following primary use cases: + +- **Control access at the point of entry**: Set the protocols of external connection + requests and secure inbound connections with TLS certificates from trusted + providers, such as Verisign and Let's Encrypt. +- **Simplify traffic management**: Load balance requests across services and route + traffic to the appropriate service by matching one or more criteria, such as + hostname, path, header presence or value, and HTTP method. + +Consul supports API +gateways for virtual machines and Kubernetes networks. Refer to the following documentation for next steps: +- [API Gateways on VMs](/consul/docs/connect/gateways/api-gateway/usage) +- [API Gateways for Kubernetes](/consul/docs/api-gateway). diff --git a/website/content/docs/connect/gateways/api-gateway/usage.mdx b/website/content/docs/connect/gateways/api-gateway/usage.mdx new file mode 100644 index 00000000000..a5fea6e8176 --- /dev/null +++ b/website/content/docs/connect/gateways/api-gateway/usage.mdx @@ -0,0 +1,211 @@ +--- +layout: docs +page_title: API Gateways on Virtual Machines +description: Learn how to configure and Consul API gateways and gateway routes on virtual machines so that you can enable ingress requests to services in your service mesh in VM environments. +--- + +# API gateways on virtual machines + +This topic describes how to deploy Consul API gateways to networks that operate +in virtual machine (VM) environments. If you want to implement an API gateway +in a Kubernetes environment, refer to [API Gateway for Kubernetes](/consul/docs/api-gateway). + +## Introduction + +Consul API gateways provide a configurable ingress points for requests into a Consul network. Usethe following configuration entries to set up API gateways: + +- [API gateway](/consul/docs/connect/gateways/api-gateway/configuration/api-gateway): Provides an endpoint for requests to enter the network. Define listeners that expose ports on the endpoint for ingress. +- [HTTP routes](/consul/docs/connect/gateways/api-gateway/configuration/http-route) and [TCP routes](/consul/docs/connect/gateways/api-gateway/configuration/tcp-route): The routes attach to listeners defined in the gateway and control how requests route to services in the network. +- [Inline certificates](/consul/docs/connect/gateways/api-gateway/configuration/inline-certificate): Makes TLS certificates available to gateways so that requests between the user and the gateway endpoint are encrypted. + +You can configure and reuse configuration entries separately. You can define and attach routes and inline certificates to multiple gateways. + +The following steps describe the general workflow for deploying a Consul API +gateway to a VM environment: + +1. Create an API gateway configuration entry. The configuration entry includes + listener configurations and references to TLS certificates. +1. Deploy the API gateway configuration entry to create the listeners. +1. Create and deploy routes to bind to the gateway. + +Refer to [API Gateway for Kubernetes](/consul/docs/api-gateway) for information +about using Consul API gateway on Kubernetes. + +## Requirements + +The following requirements must be satisfied to use API gateways on VMs: + +- Consul 1.15 or later +- A Consul cluster with service mesh enabled. Refer to [`connect`](/consul/docs/agent/config/config-files#connect) +- Network connectivity between the machine deploying the API Gateway and a + Consul cluster agent or server + +If ACLs are enabled, you must present a token with the following permissions to +configure Consul and deploy API gateways: + +- `mesh: read` +- `mesh: write` + +Refer [Mesh Rules](/consul/docs/security/acl/acl-rules#mesh-rules) for +additional information about configuring policies that enable you to interact +with Consul API gateway configurations. + +## Create the API gateway configuration + +Create an API gateway configuration that defines listeners and TLS certificates +in the mesh. In the following example, the API gateway specifies an HTTP +listener on port `8443` that routes can use to connect external traffic to +services in the mesh. + +```hcl +Kind = "api-gateway" +Name = "my-gateway" + +// Each listener configures a port which can be used to access the Consul cluster +Listeners = [ + { + Port = 8443 + Name = "my-http-listener" + Protocol = "http" + TLS = { + Certificates = [ + { + Kind = "inline-certificate" + Name = "my-certificate" + } + ] + } + } +] +``` + +Refer to [API Gateway Configuration Reference](/consul/docs/connect/gateways/api-gateway/configuration/api-gateway) for +information about all configuration fields. + +Gateways and routes are eventually-consistent objects that provide feedback +about their current state through a series of status conditions. As a result, +you must manually check the route status to determine if the route +bound to the gateway successfully. + +## Deploy the API gateway + +Use the `consul config write` command to implement the API gateway +configuration entries. The following command applies the configuration entry +for the main gateway object: + +```shell-session +$ consul config write gateways.hcl +``` + +Run the following command to deploy an API gateway instance: + +```shell-session +$ consul connect envoy -gateway api -register -service my-api-gateway +``` + +The command directs Consul to configure Envoy as an API gateway. + +## Route requests + +Define route configurations and bind them to listeners configured on the +gateway so that Consul can route incoming requests to services in the mesh. +Create HTTP or TCP routes by setting the `Kind` parameter to `http-route` or +`tcp-route` and configuring rules that define request traffic flows. + +The following example routes requests from the listener on the API gateway at +port `8443` to services in Consul based on the path of the request. When an +incoming request starts at path `/`, Consul forwards 90 percent of the requests +to the `ui` service and 10 percent to `experimental-ui`. Consul also forwards +requests starting with `/api` to `api`. + +```hcl +Kind = "http-route" +Name = "my-http-route" + +// Rules define how requests will be routed +Rules = [ + // Send all requests to UI services with 10% going to the "experimental" UI + { + Matches = [ + { + Path = { + Match = "prefix" + Value = "/" + } + } + ] + Services = [ + { + Name = "ui" + Weight = 90 + }, + { + Name = "experimental-ui" + Weight = 10 + } + ] + }, + // Send all requests that start with the path `/api` to the API service + { + Matches = [ + { + Path = { + Match = "prefix" + Value = "/api" + } + } + ] + Services = [ + { + Name = "api" + } + ] + } +] + +Parents = [ + { + Kind = "api-gateway" + Name = "my-gateway" + SectionName = "my-http-listener" + } +] +``` + +Create this configuration by saving it to a file called `my-http-route.hcl` and using the command + +```shell-session +$ consul config write my-http-route.hcl +``` + +Refer to [HTTP Route Configuration Entry Reference](/consul/docs/connect/gateways/api-gateway/configuration/http-route) +and [TCP Route Configuration Entry Reference](/consul/docs/connect/gateways/api-gateway/configuration/tcp-route) for details about route configurations. + +## Add a TLS certificate + +Define an [`inline-certificate` configuration entry](/consul/docs/connect/gateways/api-gateway/configuration/inline-certificate) with a name matching the name in the [API gateway listener configuration](/consul/docs/connect/gateways/api-gateway/configuration/api-gateway#listeners) to bind the certificate to that listener. The inline certificate configuration entry takes a public certificate and private key in plaintext. + +The following example defines a certificate named `my-certificate`. API gateway configurations that specify `inline-certificate` in the `Certificate.Kind` field and `my-certificate` in the `Certificate.Name` field are able to use the certificate. + +```hcl +Kind = "inline-certificate" +Name = "my-certificate" + +Certificate = < Date: Thu, 23 Feb 2023 17:28:42 -0500 Subject: [PATCH 059/262] NET-2286: Add tests to verify traffic redirects between services (#16390) --- .../libs/cluster/container.go | 2 + .../resolver_subset_redirect_test.go | 230 ++++++++++++++++++ 2 files changed, 232 insertions(+) create mode 100644 test/integration/consul-container/test/upgrade/l7_traffic_management/resolver_subset_redirect_test.go diff --git a/test/integration/consul-container/libs/cluster/container.go b/test/integration/consul-container/libs/cluster/container.go index bd4416a35bf..5aa3f023eeb 100644 --- a/test/integration/consul-container/libs/cluster/container.go +++ b/test/integration/consul-container/libs/cluster/container.go @@ -518,10 +518,12 @@ func newContainerRequest(config Config, opts containerOpts) (podRequest, consulR "8079/tcp", // Envoy App Listener - grpc port used by static-server "8078/tcp", // Envoy App Listener - grpc port used by static-server-v1 "8077/tcp", // Envoy App Listener - grpc port used by static-server-v2 + "8076/tcp", // Envoy App Listener - grpc port used by static-server-v3 "8080/tcp", // Envoy App Listener - http port used by static-server "8081/tcp", // Envoy App Listener - http port used by static-server-v1 "8082/tcp", // Envoy App Listener - http port used by static-server-v2 + "8083/tcp", // Envoy App Listener - http port used by static-server-v3 "9998/tcp", // Envoy App Listener "9999/tcp", // Envoy App Listener }, diff --git a/test/integration/consul-container/test/upgrade/l7_traffic_management/resolver_subset_redirect_test.go b/test/integration/consul-container/test/upgrade/l7_traffic_management/resolver_subset_redirect_test.go new file mode 100644 index 00000000000..3ba808057ac --- /dev/null +++ b/test/integration/consul-container/test/upgrade/l7_traffic_management/resolver_subset_redirect_test.go @@ -0,0 +1,230 @@ +package upgrade + +import ( + "context" + "fmt" + "net/http" + "testing" + "time" + + "github.com/hashicorp/consul/api" + libassert "github.com/hashicorp/consul/test/integration/consul-container/libs/assert" + libcluster "github.com/hashicorp/consul/test/integration/consul-container/libs/cluster" + libservice "github.com/hashicorp/consul/test/integration/consul-container/libs/service" + "github.com/hashicorp/consul/test/integration/consul-container/libs/topology" + "github.com/hashicorp/consul/test/integration/consul-container/libs/utils" + "github.com/hashicorp/go-version" + "github.com/stretchr/testify/require" + "gotest.tools/assert" +) + +// TestTrafficManagement_ServiceResolverSubsetRedirect Summary +// This test starts up 4 servers and 1 client in the same datacenter. +// +// Steps: +// - Create a single agent cluster. +// - Create 2 static-servers, 2 subset servers and 1 client and sidecars for all services, then register them with Consul +// - Validate traffic is successfully redirected from server 1 to sever2-v2 as defined in the service resolver +func TestTrafficManagement_ServiceResolverSubsetRedirect(t *testing.T) { + t.Parallel() + + type testcase struct { + oldversion string + targetVersion string + } + tcs := []testcase{ + { + oldversion: "1.13", + targetVersion: utils.TargetVersion, + }, + { + oldversion: "1.14", + targetVersion: utils.TargetVersion, + }, + } + + run := func(t *testing.T, tc testcase) { + buildOpts := &libcluster.BuildOptions{ + ConsulVersion: tc.oldversion, + Datacenter: "dc1", + InjectAutoEncryption: true, + } + // If version < 1.14 disable AutoEncryption + oldVersion, _ := version.NewVersion(tc.oldversion) + if oldVersion.LessThan(utils.Version_1_14) { + buildOpts.InjectAutoEncryption = false + } + cluster, _, _ := topology.NewPeeringCluster(t, 1, buildOpts) + node := cluster.Agents[0] + + // Register static-server service resolver + serviceResolver := &api.ServiceResolverConfigEntry{ + Kind: api.ServiceResolver, + Name: libservice.StaticServer2ServiceName, + Subsets: map[string]api.ServiceResolverSubset{ + "v1": { + Filter: "Service.Meta.version == v1", + }, + "v2": { + Filter: "Service.Meta.version == v2", + }, + }, + } + err := cluster.ConfigEntryWrite(serviceResolver) + require.NoError(t, err) + + // Register static-server-2 service resolver to redirect traffic + // from static-server to static-server-2-v2 + service2Resolver := &api.ServiceResolverConfigEntry{ + Kind: api.ServiceResolver, + Name: libservice.StaticServerServiceName, + Redirect: &api.ServiceResolverRedirect{ + Service: libservice.StaticServer2ServiceName, + ServiceSubset: "v2", + }, + } + err = cluster.ConfigEntryWrite(service2Resolver) + require.NoError(t, err) + + // register agent services + agentServices := setupServiceAndSubsets(t, cluster) + assertionFn, proxyRestartFn := agentServices.validateAgentServices(t) + _, port := agentServices.client.GetAddr() + _, adminPort := agentServices.client.GetAdminAddr() + + // validate static-client is up and running + libassert.AssertContainerState(t, agentServices.client, "running") + libassert.HTTPServiceEchoes(t, "localhost", port, "") + libassert.AssertFortioName(t, fmt.Sprintf("http://localhost:%d", port), "static-server-2-v2") + assertionFn() + + // Upgrade cluster, restart sidecars then begin service traffic validation + require.NoError(t, cluster.StandardUpgrade(t, context.Background(), tc.targetVersion)) + proxyRestartFn() + + libassert.AssertContainerState(t, agentServices.client, "running") + libassert.HTTPServiceEchoes(t, "localhost", port, "") + libassert.AssertFortioName(t, fmt.Sprintf("http://localhost:%d", port), "static-server-2-v2") + assertionFn() + + // assert 3 static-server instances are healthy + libassert.AssertServiceHasHealthyInstances(t, node, libservice.StaticServer2ServiceName, false, 3) + libassert.AssertUpstreamEndpointStatus(t, adminPort, "v2.static-server-2.default", "HEALTHY", 1) + } + + for _, tc := range tcs { + t.Run(fmt.Sprintf("upgrade from %s to %s", tc.oldversion, tc.targetVersion), + func(t *testing.T) { + run(t, tc) + }) + // test sometimes fails with error: could not start or join all agents: could not add container index 0: port not found + time.Sleep(1 * time.Second) + } +} + +func (s *registeredServices) validateAgentServices(t *testing.T) (func(), func()) { + var ( + responseFormat = map[string]string{"format": "json"} + servicePort = make(map[string]int) + proxyRestartFn func() + assertionFn func() + ) + + for serviceName, proxies := range s.services { + for _, proxy := range proxies { + _, adminPort := proxy.GetAdminAddr() + servicePort[serviceName] = adminPort + } + } + + assertionFn = func() { + // validate services proxy admin is up + for serviceName, adminPort := range servicePort { + _, statusCode, err := libassert.GetEnvoyOutput(adminPort, "stats", responseFormat) + require.NoError(t, err) + assert.Equal(t, http.StatusOK, statusCode, fmt.Sprintf("%s cannot be reached %v", serviceName, statusCode)) + + // certs are valid + libassert.AssertEnvoyPresentsCertURI(t, adminPort, serviceName) + } + } + + for _, serviceConnectProxy := range s.services { + for _, proxy := range serviceConnectProxy { + proxyRestartFn = func() { require.NoErrorf(t, proxy.Restart(), "%s", proxy.GetName()) } + } + } + return assertionFn, proxyRestartFn +} + +type registeredServices struct { + client libservice.Service + services map[string][]libservice.Service +} + +// create 3 servers and 1 client +func setupServiceAndSubsets(t *testing.T, cluster *libcluster.Cluster) *registeredServices { + node := cluster.Agents[0] + client := node.GetClient() + + // create static-servers and subsets + serviceOpts := &libservice.ServiceOpts{ + Name: libservice.StaticServerServiceName, + ID: "static-server", + HTTPPort: 8080, + GRPCPort: 8079, + } + _, serverConnectProxy, err := libservice.CreateAndRegisterStaticServerAndSidecar(node, serviceOpts) + require.NoError(t, err) + libassert.CatalogServiceExists(t, client, libservice.StaticServerServiceName) + + serviceOpts2 := &libservice.ServiceOpts{ + Name: libservice.StaticServer2ServiceName, + ID: "static-server-2", + HTTPPort: 8081, + GRPCPort: 8078, + } + _, server2ConnectProxy, err := libservice.CreateAndRegisterStaticServerAndSidecar(node, serviceOpts2) + require.NoError(t, err) + libassert.CatalogServiceExists(t, client, libservice.StaticServer2ServiceName) + + serviceOptsV1 := &libservice.ServiceOpts{ + Name: libservice.StaticServer2ServiceName, + ID: "static-server-2-v1", + Meta: map[string]string{"version": "v1"}, + HTTPPort: 8082, + GRPCPort: 8077, + } + _, server2ConnectProxyV1, err := libservice.CreateAndRegisterStaticServerAndSidecar(node, serviceOptsV1) + require.NoError(t, err) + libassert.CatalogServiceExists(t, client, libservice.StaticServer2ServiceName) + + serviceOptsV2 := &libservice.ServiceOpts{ + Name: libservice.StaticServer2ServiceName, + ID: "static-server-2-v2", + Meta: map[string]string{"version": "v2"}, + HTTPPort: 8083, + GRPCPort: 8076, + } + _, server2ConnectProxyV2, err := libservice.CreateAndRegisterStaticServerAndSidecar(node, serviceOptsV2) + require.NoError(t, err) + libassert.CatalogServiceExists(t, client, libservice.StaticServer2ServiceName) + + // Create a client proxy instance with the server as an upstream + clientConnectProxy, err := libservice.CreateAndRegisterStaticClientSidecar(node, "", false) + require.NoError(t, err) + libassert.CatalogServiceExists(t, client, fmt.Sprintf("%s-sidecar-proxy", libservice.StaticClientServiceName)) + + // return a map of all services created + tmpServices := map[string][]libservice.Service{} + tmpServices[libservice.StaticClientServiceName] = append(tmpServices[libservice.StaticClientServiceName], clientConnectProxy) + tmpServices[libservice.StaticServerServiceName] = append(tmpServices[libservice.StaticServerServiceName], serverConnectProxy) + tmpServices[libservice.StaticServer2ServiceName] = append(tmpServices[libservice.StaticServer2ServiceName], server2ConnectProxy) + tmpServices[libservice.StaticServer2ServiceName] = append(tmpServices[libservice.StaticServer2ServiceName], server2ConnectProxyV1) + tmpServices[libservice.StaticServer2ServiceName] = append(tmpServices[libservice.StaticServer2ServiceName], server2ConnectProxyV2) + + return ®isteredServices{ + client: clientConnectProxy, + services: tmpServices, + } +} From d4dee315036ebf7c011375f10a98a09fa2ac29b5 Mon Sep 17 00:00:00 2001 From: Semir Patel Date: Thu, 23 Feb 2023 16:51:20 -0600 Subject: [PATCH 060/262] Try DRYing up createCluster in integration tests (#16199) --- .../consul-container/libs/cluster/cluster.go | 6 +- .../libs/cluster/container.go | 2 +- .../test/basic/connect_service_test.go | 43 +++--------- .../consul-container/test/common.go | 68 +++++++++++++++++++ .../test/ratelimit/ratelimit_test.go | 55 ++------------- 5 files changed, 89 insertions(+), 85 deletions(-) create mode 100644 test/integration/consul-container/test/common.go diff --git a/test/integration/consul-container/libs/cluster/cluster.go b/test/integration/consul-container/libs/cluster/cluster.go index c569a21a38e..082f080c4d3 100644 --- a/test/integration/consul-container/libs/cluster/cluster.go +++ b/test/integration/consul-container/libs/cluster/cluster.go @@ -66,7 +66,7 @@ func NewN(t TestingT, conf Config, count int) (*Cluster, error) { func New(t TestingT, configs []Config) (*Cluster, error) { id, err := shortid.Generate() if err != nil { - return nil, fmt.Errorf("could not cluster id: %w", err) + return nil, fmt.Errorf("could not generate cluster id: %w", err) } name := fmt.Sprintf("consul-int-cluster-%s", id) @@ -114,7 +114,7 @@ func (c *Cluster) AddN(conf Config, count int, join bool) error { return c.Add(configs, join) } -// Add starts an agent with the given configuration and joins it with the existing cluster +// Add starts agents with the given configurations and joins them to the existing cluster func (c *Cluster) Add(configs []Config, serfJoin bool) (xe error) { if c.Index == 0 && !serfJoin { return fmt.Errorf("the first call to Cluster.Add must have serfJoin=true") @@ -160,9 +160,11 @@ func (c *Cluster) Add(configs []Config, serfJoin bool) (xe error) { func (c *Cluster) Join(agents []Agent) error { return c.join(agents, false) } + func (c *Cluster) JoinExternally(agents []Agent) error { return c.join(agents, true) } + func (c *Cluster) join(agents []Agent, skipSerfJoin bool) error { if len(agents) == 0 { return nil // no change diff --git a/test/integration/consul-container/libs/cluster/container.go b/test/integration/consul-container/libs/cluster/container.go index 5aa3f023eeb..9c8ec6023c0 100644 --- a/test/integration/consul-container/libs/cluster/container.go +++ b/test/integration/consul-container/libs/cluster/container.go @@ -489,7 +489,7 @@ func startContainer(ctx context.Context, req testcontainers.ContainerRequest) (t }) } -const pauseImage = "k8s.gcr.io/pause:3.3" +const pauseImage = "registry.k8s.io/pause:3.3" type containerOpts struct { configFile string diff --git a/test/integration/consul-container/test/basic/connect_service_test.go b/test/integration/consul-container/test/basic/connect_service_test.go index 90a80c84c6d..419c28c11ef 100644 --- a/test/integration/consul-container/test/basic/connect_service_test.go +++ b/test/integration/consul-container/test/basic/connect_service_test.go @@ -9,7 +9,7 @@ import ( libassert "github.com/hashicorp/consul/test/integration/consul-container/libs/assert" libcluster "github.com/hashicorp/consul/test/integration/consul-container/libs/cluster" libservice "github.com/hashicorp/consul/test/integration/consul-container/libs/service" - "github.com/hashicorp/consul/test/integration/consul-container/libs/utils" + "github.com/hashicorp/consul/test/integration/consul-container/test" ) // TestBasicConnectService Summary @@ -23,7 +23,14 @@ import ( // - Make sure a call to the client sidecar local bind port returns a response from the upstream, static-server func TestBasicConnectService(t *testing.T) { t.Parallel() - cluster := createCluster(t) + + buildOptions := &libcluster.BuildOptions{ + InjectAutoEncryption: true, + InjectGossipEncryption: true, + // TODO(rb): fix the test to not need the service/envoy stack to use :8500 + AllowHTTPAnyway: true, + } + cluster := test.CreateCluster(t, "", nil, buildOptions, true) clientService := createServices(t, cluster) _, port := clientService.GetAddr() @@ -37,38 +44,6 @@ func TestBasicConnectService(t *testing.T) { libassert.AssertFortioName(t, fmt.Sprintf("http://localhost:%d", port), "static-server") } -func createCluster(t *testing.T) *libcluster.Cluster { - opts := libcluster.BuildOptions{ - InjectAutoEncryption: true, - InjectGossipEncryption: true, - // TODO: fix the test to not need the service/envoy stack to use :8500 - AllowHTTPAnyway: true, - } - ctx := libcluster.NewBuildContext(t, opts) - - conf := libcluster.NewConfigBuilder(ctx). - ToAgentConfig(t) - t.Logf("Cluster config:\n%s", conf.JSON) - - configs := []libcluster.Config{*conf} - - cluster, err := libcluster.New(t, configs) - require.NoError(t, err) - - node := cluster.Agents[0] - client := node.GetClient() - - libcluster.WaitForLeader(t, cluster, client) - libcluster.WaitForMembers(t, client, 1) - - // Default Proxy Settings - ok, err := utils.ApplyDefaultProxySettings(client) - require.NoError(t, err) - require.True(t, ok) - - return cluster -} - func createServices(t *testing.T, cluster *libcluster.Cluster) libservice.Service { node := cluster.Agents[0] client := node.GetClient() diff --git a/test/integration/consul-container/test/common.go b/test/integration/consul-container/test/common.go new file mode 100644 index 00000000000..00390bab26c --- /dev/null +++ b/test/integration/consul-container/test/common.go @@ -0,0 +1,68 @@ +package test + +import ( + "testing" + + libcluster "github.com/hashicorp/consul/test/integration/consul-container/libs/cluster" + "github.com/hashicorp/consul/test/integration/consul-container/libs/utils" + "github.com/stretchr/testify/require" + "github.com/testcontainers/testcontainers-go" +) + +type TestLogConsumer struct { + Msgs []string +} + +func (g *TestLogConsumer) Accept(l testcontainers.Log) { + g.Msgs = append(g.Msgs, string(l.Content)) +} + +// Creates a cluster with options for basic customization. All args except t +// are optional and will use sensible defaults when not provided. +func CreateCluster( + t *testing.T, + cmd string, + logConsumer *TestLogConsumer, + buildOptions *libcluster.BuildOptions, + applyDefaultProxySettings bool) *libcluster.Cluster { + + // optional + if buildOptions == nil { + buildOptions = &libcluster.BuildOptions{ + InjectAutoEncryption: true, + InjectGossipEncryption: true, + } + } + ctx := libcluster.NewBuildContext(t, *buildOptions) + + conf := libcluster.NewConfigBuilder(ctx).ToAgentConfig(t) + + // optional + if logConsumer != nil { + conf.LogConsumer = logConsumer + } + + t.Logf("Cluster config:\n%s", conf.JSON) + + // optional custom cmd + if cmd != "" { + conf.Cmd = append(conf.Cmd, cmd) + } + + cluster, err := libcluster.New(t, []libcluster.Config{*conf}) + require.NoError(t, err) + + client, err := cluster.GetClient(nil, true) + + require.NoError(t, err) + libcluster.WaitForLeader(t, cluster, client) + libcluster.WaitForMembers(t, client, 1) + + if applyDefaultProxySettings { + ok, err := utils.ApplyDefaultProxySettings(client) + require.NoError(t, err) + require.True(t, ok) + } + + return cluster +} diff --git a/test/integration/consul-container/test/ratelimit/ratelimit_test.go b/test/integration/consul-container/test/ratelimit/ratelimit_test.go index cb5c259eefe..1c34512493a 100644 --- a/test/integration/consul-container/test/ratelimit/ratelimit_test.go +++ b/test/integration/consul-container/test/ratelimit/ratelimit_test.go @@ -7,11 +7,11 @@ import ( "time" "github.com/stretchr/testify/require" - "github.com/testcontainers/testcontainers-go" "github.com/hashicorp/consul/api" "github.com/hashicorp/consul/sdk/testutil/retry" libcluster "github.com/hashicorp/consul/test/integration/consul-container/libs/cluster" + "github.com/hashicorp/consul/test/integration/consul-container/test" ) const ( @@ -25,7 +25,7 @@ const ( // - read_rate - returns 429 - was blocked and returns retryable error // - write_rate - returns 503 - was blocked and is not retryable // - on each -// - fires metrics forexceeding +// - fires metrics for exceeding // - logs for exceeding func TestServerRequestRateLimit(t *testing.T) { @@ -69,7 +69,7 @@ func TestServerRequestRateLimit(t *testing.T) { testCases := []testCase{ // HTTP & net/RPC { - description: "HTTP & net/RPC / Mode: disabled - errors: no / exceeded logs: no / metrics: no", + description: "HTTP & net-RPC | Mode: disabled - errors: no | exceeded logs: no | metrics: no", cmd: `-hcl=limits { request_limits { mode = "disabled" read_rate = 0 write_rate = 0 }}`, mode: "disabled", operations: []operation{ @@ -88,7 +88,7 @@ func TestServerRequestRateLimit(t *testing.T) { }, }, { - description: "HTTP & net/RPC / Mode: permissive - errors: no / exceeded logs: yes / metrics: yes", + description: "HTTP & net-RPC | Mode: permissive - errors: no | exceeded logs: yes | metrics: yes", cmd: `-hcl=limits { request_limits { mode = "permissive" read_rate = 0 write_rate = 0 }}`, mode: "permissive", operations: []operation{ @@ -107,7 +107,7 @@ func TestServerRequestRateLimit(t *testing.T) { }, }, { - description: "HTTP & net/RPC / Mode: enforcing - errors: yes / exceeded logs: yes / metrics: yes", + description: "HTTP & net-RPC | Mode: enforcing - errors: yes | exceeded logs: yes | metrics: yes", cmd: `-hcl=limits { request_limits { mode = "enforcing" read_rate = 0 write_rate = 0 }}`, mode: "enforcing", operations: []operation{ @@ -128,8 +128,8 @@ func TestServerRequestRateLimit(t *testing.T) { for _, tc := range testCases { t.Run(tc.description, func(t *testing.T) { - logConsumer := &TestLogConsumer{} - cluster := createCluster(t, tc.cmd, logConsumer) + logConsumer := &test.TestLogConsumer{} + cluster := test.CreateCluster(t, tc.cmd, logConsumer, nil, false) defer terminate(t, cluster) client, err := cluster.GetClient(nil, true) @@ -218,44 +218,3 @@ func terminate(t *testing.T, cluster *libcluster.Cluster) { err := cluster.Terminate() require.NoError(t, err) } - -type TestLogConsumer struct { - Msgs []string -} - -func (g *TestLogConsumer) Accept(l testcontainers.Log) { - g.Msgs = append(g.Msgs, string(l.Content)) -} - -// createCluster -func createCluster(t *testing.T, cmd string, logConsumer *TestLogConsumer) *libcluster.Cluster { - opts := libcluster.BuildOptions{ - InjectAutoEncryption: true, - InjectGossipEncryption: true, - } - ctx := libcluster.NewBuildContext(t, opts) - - conf := libcluster.NewConfigBuilder(ctx).ToAgentConfig(t) - conf.LogConsumer = logConsumer - - t.Logf("Cluster config:\n%s", conf.JSON) - - parsedConfigs := []libcluster.Config{*conf} - - cfgs := []libcluster.Config{} - for _, cfg := range parsedConfigs { - // add command - cfg.Cmd = append(cfg.Cmd, cmd) - cfgs = append(cfgs, cfg) - } - cluster, err := libcluster.New(t, cfgs) - require.NoError(t, err) - - client, err := cluster.GetClient(nil, true) - - require.NoError(t, err) - libcluster.WaitForLeader(t, cluster, client) - libcluster.WaitForMembers(t, client, 1) - - return cluster -} From ab0d43e7f442f63108a69afcd83fbe4c911d52dd Mon Sep 17 00:00:00 2001 From: claire labry Date: Thu, 23 Feb 2023 19:39:40 -0600 Subject: [PATCH 061/262] add back staging bits (#16411) --- .release/ci.hcl | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/.release/ci.hcl b/.release/ci.hcl index 084450dd4cd..25f64e4c6b7 100644 --- a/.release/ci.hcl +++ b/.release/ci.hcl @@ -38,6 +38,41 @@ event "prepare" { } } +## These are promotion and post-publish events +## they should be added to the end of the file after the verify event stanza. + +event "trigger-staging" { +// This event is dispatched by the bob trigger-promotion command +// and is required - do not delete. +} + +event "promote-staging" { + depends = ["trigger-staging"] + action "promote-staging" { + organization = "hashicorp" + repository = "crt-workflows-common" + workflow = "promote-staging" + config = "release-metadata.hcl" + } + + notification { + on = "always" + } +} + +event "promote-staging-docker" { + depends = ["promote-staging"] + action "promote-staging-docker" { + organization = "hashicorp" + repository = "crt-workflows-common" + workflow = "promote-staging-docker" + } + + notification { + on = "always" + } +} + event "trigger-production" { // This event is dispatched by the bob trigger-promotion command // and is required - do not delete. From dca7c18ec4ae46142055b097b0b580ce0bd84de3 Mon Sep 17 00:00:00 2001 From: Kyle Havlovitz Date: Fri, 24 Feb 2023 09:51:09 -0800 Subject: [PATCH 062/262] Fix a couple inconsistencies in `operator usage instances` command (#16260) --- .../usage/instances/usage_instances.go | 19 +++++--- .../usage/instances/usage_instances_test.go | 44 +++++++++++++++---- 2 files changed, 48 insertions(+), 15 deletions(-) diff --git a/command/operator/usage/instances/usage_instances.go b/command/operator/usage/instances/usage_instances.go index df997022ae0..c1c94caa69b 100644 --- a/command/operator/usage/instances/usage_instances.go +++ b/command/operator/usage/instances/usage_instances.go @@ -33,8 +33,10 @@ type cmd struct { func (c *cmd) init() { c.flags = flag.NewFlagSet("", flag.ContinueOnError) - c.flags.BoolVar(&c.onlyBillable, "billable", false, "Display only billable service info.") - c.flags.BoolVar(&c.onlyConnect, "connect", false, "Display only Connect service info.") + c.flags.BoolVar(&c.onlyBillable, "billable", false, "Display only billable service info. "+ + "Cannot be used with -connect.") + c.flags.BoolVar(&c.onlyConnect, "connect", false, "Display only Connect service info."+ + "Cannot be used with -billable.") c.flags.BoolVar(&c.allDatacenters, "all-datacenters", false, "Display service counts from "+ "all datacenters.") @@ -54,6 +56,11 @@ func (c *cmd) Run(args []string) int { return 1 } + if c.onlyBillable && c.onlyConnect { + c.UI.Error("Cannot specify both -billable and -connect flags") + return 1 + } + // Create and test the HTTP client client, err := c.http.APIClient() if err != nil { @@ -219,22 +226,22 @@ func (c *cmd) Help() string { const ( synopsis = "Display service instance usage information" help = ` -Usage: consul usage instances [options] +Usage: consul operator usage instances [options] Retrieves usage information about the number of services registered in a given datacenter. By default, the datacenter of the local agent is queried. To retrieve the service usage data: - $ consul usage instances + $ consul operator usage instances To show only billable service instance counts: - $ consul usage instances -billable + $ consul operator usage instances -billable To show only connect service instance counts: - $ consul usage instances -connect + $ consul operator usage instances -connect For a full list of options and examples, please see the Consul documentation. ` diff --git a/command/operator/usage/instances/usage_instances_test.go b/command/operator/usage/instances/usage_instances_test.go index 7aabf030e27..0f41b79aa0b 100644 --- a/command/operator/usage/instances/usage_instances_test.go +++ b/command/operator/usage/instances/usage_instances_test.go @@ -1,6 +1,7 @@ package instances import ( + "errors" "testing" "github.com/hashicorp/consul/agent" @@ -36,15 +37,40 @@ func TestUsageInstancesCommand(t *testing.T) { t.Fatal(err) } - ui := cli.NewMockUi() - c := New(ui) - args := []string{ - "-http-addr=" + a.HTTPAddr(), + cases := []struct { + name string + extraArgs []string + output string + err error + }{ + { + name: "basic output", + output: "Billable Service Instances Total: 2", + }, + { + name: "billable and connect flags together are invalid", + extraArgs: []string{"-billable", "-connect"}, + err: errors.New("Cannot specify both -billable and -connect"), + }, } - code := c.Run(args) - if code != 0 { - t.Fatalf("bad exit code %d: %s", code, ui.ErrorWriter.String()) + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + ui := cli.NewMockUi() + c := New(ui) + args := []string{ + "-http-addr=" + a.HTTPAddr(), + } + args = append(args, tc.extraArgs...) + + code := c.Run(args) + if tc.err != nil { + require.Equal(t, 1, code) + require.Contains(t, ui.ErrorWriter.String(), tc.err.Error()) + } else { + require.Equal(t, 0, code) + require.Contains(t, ui.OutputWriter.String(), tc.output) + } + }) } - output := ui.OutputWriter.String() - require.Contains(t, output, "Billable Service Instances Total: 2") } From 94b378998fa7178f714322bb552d20b6dcb7d529 Mon Sep 17 00:00:00 2001 From: Anita Akaeze Date: Fri, 24 Feb 2023 14:34:14 -0500 Subject: [PATCH 063/262] NO_JIRA: refactor validate function in traffic mgt tests (#16422) --- .../resolver_subset_redirect_test.go | 28 ++++++++----------- 1 file changed, 11 insertions(+), 17 deletions(-) diff --git a/test/integration/consul-container/test/upgrade/l7_traffic_management/resolver_subset_redirect_test.go b/test/integration/consul-container/test/upgrade/l7_traffic_management/resolver_subset_redirect_test.go index 3ba808057ac..30462cc1ad3 100644 --- a/test/integration/consul-container/test/upgrade/l7_traffic_management/resolver_subset_redirect_test.go +++ b/test/integration/consul-container/test/upgrade/l7_traffic_management/resolver_subset_redirect_test.go @@ -125,27 +125,21 @@ func TestTrafficManagement_ServiceResolverSubsetRedirect(t *testing.T) { func (s *registeredServices) validateAgentServices(t *testing.T) (func(), func()) { var ( responseFormat = map[string]string{"format": "json"} - servicePort = make(map[string]int) proxyRestartFn func() assertionFn func() ) - - for serviceName, proxies := range s.services { - for _, proxy := range proxies { - _, adminPort := proxy.GetAdminAddr() - servicePort[serviceName] = adminPort - } - } - + // validate services proxy admin is up assertionFn = func() { - // validate services proxy admin is up - for serviceName, adminPort := range servicePort { - _, statusCode, err := libassert.GetEnvoyOutput(adminPort, "stats", responseFormat) - require.NoError(t, err) - assert.Equal(t, http.StatusOK, statusCode, fmt.Sprintf("%s cannot be reached %v", serviceName, statusCode)) - - // certs are valid - libassert.AssertEnvoyPresentsCertURI(t, adminPort, serviceName) + for serviceName, proxies := range s.services { + for _, proxy := range proxies { + _, adminPort := proxy.GetAdminAddr() + _, statusCode, err := libassert.GetEnvoyOutput(adminPort, "stats", responseFormat) + require.NoError(t, err) + assert.Equal(t, http.StatusOK, statusCode, fmt.Sprintf("%s cannot be reached %v", serviceName, statusCode)) + + // certs are valid + libassert.AssertEnvoyPresentsCertURI(t, adminPort, serviceName) + } } } From d99dcd48c24814e672f318030507a5efa8a51fbd Mon Sep 17 00:00:00 2001 From: sarahalsmiller <100602640+sarahalsmiller@users.noreply.github.com> Date: Fri, 24 Feb 2023 14:57:44 -0600 Subject: [PATCH 064/262] Basic gobased API gateway spinup test (#16278) * wip, proof of concept, gateway service being registered, don't know how to hit it * checkpoint * Fix up API Gateway go tests (#16297) * checkpoint, getting InvalidDiscoveryChain route protocol does not match targeted service protocol * checkpoint * httproute hittable * tests working, one header test failing * differentiate services by status code, minor cleanup * working tests * updated GetPort interface * fix getport --------- Co-authored-by: Andrew Stucki --- .../consul-container/libs/cluster/agent.go | 1 + .../consul-container/libs/cluster/cluster.go | 7 +- .../libs/cluster/container.go | 14 +- .../consul-container/libs/service/connect.go | 5 + .../consul-container/libs/service/examples.go | 24 +- .../consul-container/libs/service/gateway.go | 52 +++- .../consul-container/libs/service/helpers.go | 8 +- .../consul-container/libs/service/service.go | 2 + .../test/gateways/gateway_endpoint_test.go | 250 +++++++++++++++++ .../test/gateways/http_route_test.go | 258 ++++++++++++++++++ 10 files changed, 588 insertions(+), 33 deletions(-) create mode 100644 test/integration/consul-container/test/gateways/gateway_endpoint_test.go create mode 100644 test/integration/consul-container/test/gateways/http_route_test.go diff --git a/test/integration/consul-container/libs/cluster/agent.go b/test/integration/consul-container/libs/cluster/agent.go index 24c5b37bd5f..3c4eeafc13c 100644 --- a/test/integration/consul-container/libs/cluster/agent.go +++ b/test/integration/consul-container/libs/cluster/agent.go @@ -22,6 +22,7 @@ type Agent interface { GetConfig() Config GetInfo() AgentInfo GetDatacenter() string + GetNetwork() string IsServer() bool RegisterTermination(func() error) Terminate() error diff --git a/test/integration/consul-container/libs/cluster/cluster.go b/test/integration/consul-container/libs/cluster/cluster.go index 082f080c4d3..aed81396b73 100644 --- a/test/integration/consul-container/libs/cluster/cluster.go +++ b/test/integration/consul-container/libs/cluster/cluster.go @@ -63,7 +63,7 @@ func NewN(t TestingT, conf Config, count int) (*Cluster, error) { // // The provided TestingT is used to register a cleanup function to terminate // the cluster. -func New(t TestingT, configs []Config) (*Cluster, error) { +func New(t TestingT, configs []Config, ports ...int) (*Cluster, error) { id, err := shortid.Generate() if err != nil { return nil, fmt.Errorf("could not generate cluster id: %w", err) @@ -99,7 +99,7 @@ func New(t TestingT, configs []Config) (*Cluster, error) { _ = cluster.Terminate() }) - if err := cluster.Add(configs, true); err != nil { + if err := cluster.Add(configs, true, ports...); err != nil { return nil, fmt.Errorf("could not start or join all agents: %w", err) } @@ -115,7 +115,7 @@ func (c *Cluster) AddN(conf Config, count int, join bool) error { } // Add starts agents with the given configurations and joins them to the existing cluster -func (c *Cluster) Add(configs []Config, serfJoin bool) (xe error) { +func (c *Cluster) Add(configs []Config, serfJoin bool, ports ...int) (xe error) { if c.Index == 0 && !serfJoin { return fmt.Errorf("the first call to Cluster.Add must have serfJoin=true") } @@ -135,6 +135,7 @@ func (c *Cluster) Add(configs []Config, serfJoin bool) (xe error) { context.Background(), conf, c, + ports..., ) if err != nil { return fmt.Errorf("could not add container index %d: %w", idx, err) diff --git a/test/integration/consul-container/libs/cluster/container.go b/test/integration/consul-container/libs/cluster/container.go index 9c8ec6023c0..80f572ba5e1 100644 --- a/test/integration/consul-container/libs/cluster/container.go +++ b/test/integration/consul-container/libs/cluster/container.go @@ -73,7 +73,7 @@ func (c *consulContainerNode) ClaimAdminPort() (int, error) { } // NewConsulContainer starts a Consul agent in a container with the given config. -func NewConsulContainer(ctx context.Context, config Config, cluster *Cluster) (Agent, error) { +func NewConsulContainer(ctx context.Context, config Config, cluster *Cluster, ports ...int) (Agent, error) { network := cluster.NetworkName index := cluster.Index if config.ScratchDir == "" { @@ -128,7 +128,7 @@ func NewConsulContainer(ctx context.Context, config Config, cluster *Cluster) (A addtionalNetworks: []string{"bridge", network}, hostname: fmt.Sprintf("agent-%d", index), } - podReq, consulReq := newContainerRequest(config, opts) + podReq, consulReq := newContainerRequest(config, opts, ports...) // Do some trickery to ensure that partial completion is correctly torn // down, but successful execution is not. @@ -291,6 +291,10 @@ func NewConsulContainer(ctx context.Context, config Config, cluster *Cluster) (A return node, nil } +func (c *consulContainerNode) GetNetwork() string { + return c.network +} + func (c *consulContainerNode) GetName() string { if c.container == nil { return c.consulReq.Name // TODO: is this safe to do all the time? @@ -501,7 +505,7 @@ type containerOpts struct { addtionalNetworks []string } -func newContainerRequest(config Config, opts containerOpts) (podRequest, consulRequest testcontainers.ContainerRequest) { +func newContainerRequest(config Config, opts containerOpts, ports ...int) (podRequest, consulRequest testcontainers.ContainerRequest) { skipReaper := isRYUKDisabled() pod := testcontainers.ContainerRequest{ @@ -541,6 +545,10 @@ func newContainerRequest(config Config, opts containerOpts) (podRequest, consulR pod.ExposedPorts = append(pod.ExposedPorts, fmt.Sprintf("%d/tcp", basePort+i)) } + for _, port := range ports { + pod.ExposedPorts = append(pod.ExposedPorts, fmt.Sprintf("%d/tcp", port)) + } + // For handshakes like auto-encrypt, it can take 10's of seconds for the agent to become "ready". // If we only wait until the log stream starts, subsequent commands to agents will fail. // TODO: optimize the wait strategy diff --git a/test/integration/consul-container/libs/service/connect.go b/test/integration/consul-container/libs/service/connect.go index 49a340bd2a1..b7f617c0df0 100644 --- a/test/integration/consul-container/libs/service/connect.go +++ b/test/integration/consul-container/libs/service/connect.go @@ -2,6 +2,7 @@ package service import ( "context" + "errors" "fmt" "io" "path/filepath" @@ -58,6 +59,10 @@ func (g ConnectContainer) GetAddrs() (string, []int) { return g.ip, g.appPort } +func (g ConnectContainer) GetPort(port int) (int, error) { + return 0, errors.New("not implemented") +} + func (g ConnectContainer) Restart() error { _, err := g.GetStatus() if err != nil { diff --git a/test/integration/consul-container/libs/service/examples.go b/test/integration/consul-container/libs/service/examples.go index 3d6258eaa9b..0c28a152625 100644 --- a/test/integration/consul-container/libs/service/examples.go +++ b/test/integration/consul-container/libs/service/examples.go @@ -68,6 +68,10 @@ func (g exampleContainer) GetAddrs() (string, []int) { return "", nil } +func (g exampleContainer) GetPort(port int) (int, error) { + return 0, nil +} + func (g exampleContainer) Restart() error { return fmt.Errorf("Restart Unimplemented by ConnectContainer") } @@ -121,7 +125,7 @@ func (c exampleContainer) GetStatus() (string, error) { return state.Status, err } -func NewExampleService(ctx context.Context, name string, httpPort int, grpcPort int, node libcluster.Agent) (Service, error) { +func NewExampleService(ctx context.Context, name string, httpPort int, grpcPort int, node libcluster.Agent, containerArgs ...string) (Service, error) { namePrefix := fmt.Sprintf("%s-service-example-%s", node.GetDatacenter(), name) containerName := utils.RandName(namePrefix) @@ -135,18 +139,22 @@ func NewExampleService(ctx context.Context, name string, httpPort int, grpcPort grpcPortStr = strconv.Itoa(grpcPort) ) + command := []string{ + "server", + "-http-port", httpPortStr, + "-grpc-port", grpcPortStr, + "-redirect-port", "-disabled", + } + + command = append(command, containerArgs...) + req := testcontainers.ContainerRequest{ Image: hashicorpDockerProxy + "/fortio/fortio", WaitingFor: wait.ForLog("").WithStartupTimeout(10 * time.Second), AutoRemove: false, Name: containerName, - Cmd: []string{ - "server", - "-http-port", httpPortStr, - "-grpc-port", grpcPortStr, - "-redirect-port", "-disabled", - }, - Env: map[string]string{"FORTIO_NAME": name}, + Cmd: command, + Env: map[string]string{"FORTIO_NAME": name}, } info, err := cluster.LaunchContainerOnNode(ctx, node, req, []string{httpPortStr, grpcPortStr}) diff --git a/test/integration/consul-container/libs/service/gateway.go b/test/integration/consul-container/libs/service/gateway.go index 7028a612928..8a9b87aa196 100644 --- a/test/integration/consul-container/libs/service/gateway.go +++ b/test/integration/consul-container/libs/service/gateway.go @@ -20,12 +20,13 @@ import ( // gatewayContainer type gatewayContainer struct { - ctx context.Context - container testcontainers.Container - ip string - port int - adminPort int - serviceName string + ctx context.Context + container testcontainers.Container + ip string + port int + adminPort int + serviceName string + portMappings map[int]int } var _ Service = (*gatewayContainer)(nil) @@ -105,6 +106,15 @@ func (g gatewayContainer) GetAdminAddr() (string, int) { return "localhost", g.adminPort } +func (g gatewayContainer) GetPort(port int) (int, error) { + p, ok := g.portMappings[port] + if !ok { + return 0, fmt.Errorf("port does not exist") + } + return p, nil + +} + func (g gatewayContainer) Restart() error { _, err := g.container.State(g.ctx) if err != nil { @@ -130,7 +140,7 @@ func (g gatewayContainer) GetStatus() (string, error) { return state.Status, err } -func NewGatewayService(ctx context.Context, name string, kind string, node libcluster.Agent) (Service, error) { +func NewGatewayService(ctx context.Context, name string, kind string, node libcluster.Agent, ports ...int) (Service, error) { nodeConfig := node.GetConfig() if nodeConfig.ScratchDir == "" { return nil, fmt.Errorf("node ScratchDir is required") @@ -207,21 +217,33 @@ func NewGatewayService(ctx context.Context, name string, kind string, node libcl adminPortStr = strconv.Itoa(adminPort) ) - info, err := cluster.LaunchContainerOnNode(ctx, node, req, []string{ + extraPorts := []string{} + for _, port := range ports { + extraPorts = append(extraPorts, strconv.Itoa(port)) + } + + info, err := cluster.LaunchContainerOnNode(ctx, node, req, append( + extraPorts, portStr, adminPortStr, - }) + )) if err != nil { return nil, err } + portMappings := make(map[int]int) + for _, port := range ports { + portMappings[port] = info.MappedPorts[strconv.Itoa(port)].Int() + } + out := &gatewayContainer{ - ctx: ctx, - container: info.Container, - ip: info.IP, - port: info.MappedPorts[portStr].Int(), - adminPort: info.MappedPorts[adminPortStr].Int(), - serviceName: name, + ctx: ctx, + container: info.Container, + ip: info.IP, + port: info.MappedPorts[portStr].Int(), + adminPort: info.MappedPorts[adminPortStr].Int(), + serviceName: name, + portMappings: portMappings, } return out, nil diff --git a/test/integration/consul-container/libs/service/helpers.go b/test/integration/consul-container/libs/service/helpers.go index f7b963ff5a0..47a8c136425 100644 --- a/test/integration/consul-container/libs/service/helpers.go +++ b/test/integration/consul-container/libs/service/helpers.go @@ -35,7 +35,7 @@ type ServiceOpts struct { } // createAndRegisterStaticServerAndSidecar register the services and launch static-server containers -func createAndRegisterStaticServerAndSidecar(node libcluster.Agent, grpcPort int, svc *api.AgentServiceRegistration) (Service, Service, error) { +func createAndRegisterStaticServerAndSidecar(node libcluster.Agent, grpcPort int, svc *api.AgentServiceRegistration, containerArgs ...string) (Service, Service, error) { // Do some trickery to ensure that partial completion is correctly torn // down, but successful execution is not. var deferClean utils.ResettableDefer @@ -46,7 +46,7 @@ func createAndRegisterStaticServerAndSidecar(node libcluster.Agent, grpcPort int } // Create a service and proxy instance - serverService, err := NewExampleService(context.Background(), svc.ID, svc.Port, grpcPort, node) + serverService, err := NewExampleService(context.Background(), svc.ID, svc.Port, grpcPort, node, containerArgs...) if err != nil { return nil, nil, err } @@ -68,7 +68,7 @@ func createAndRegisterStaticServerAndSidecar(node libcluster.Agent, grpcPort int return serverService, serverConnectProxy, nil } -func CreateAndRegisterStaticServerAndSidecar(node libcluster.Agent, serviceOpts *ServiceOpts) (Service, Service, error) { +func CreateAndRegisterStaticServerAndSidecar(node libcluster.Agent, serviceOpts *ServiceOpts, containerArgs ...string) (Service, Service, error) { // Register the static-server service and sidecar first to prevent race with sidecar // trying to get xDS before it's ready req := &api.AgentServiceRegistration{ @@ -88,7 +88,7 @@ func CreateAndRegisterStaticServerAndSidecar(node libcluster.Agent, serviceOpts }, Meta: serviceOpts.Meta, } - return createAndRegisterStaticServerAndSidecar(node, serviceOpts.GRPCPort, req) + return createAndRegisterStaticServerAndSidecar(node, serviceOpts.GRPCPort, req, containerArgs...) } func CreateAndRegisterStaticServerAndSidecarWithChecks(node libcluster.Agent, serviceOpts *ServiceOpts) (Service, Service, error) { diff --git a/test/integration/consul-container/libs/service/service.go b/test/integration/consul-container/libs/service/service.go index f32bd67ff8b..f4efa4f909c 100644 --- a/test/integration/consul-container/libs/service/service.go +++ b/test/integration/consul-container/libs/service/service.go @@ -2,6 +2,7 @@ package service import ( "context" + "github.com/hashicorp/consul/api" ) @@ -13,6 +14,7 @@ type Service interface { Export(partition, peer string, client *api.Client) error GetAddr() (string, int) GetAddrs() (string, []int) + GetPort(port int) (int, error) // GetAdminAddr returns the external admin address GetAdminAddr() (string, int) GetLogs() (string, error) diff --git a/test/integration/consul-container/test/gateways/gateway_endpoint_test.go b/test/integration/consul-container/test/gateways/gateway_endpoint_test.go new file mode 100644 index 00000000000..e750a5b1fdc --- /dev/null +++ b/test/integration/consul-container/test/gateways/gateway_endpoint_test.go @@ -0,0 +1,250 @@ +package gateways + +import ( + "context" + "fmt" + "github.com/hashicorp/consul/api" + "github.com/hashicorp/consul/sdk/testutil/retry" + libassert "github.com/hashicorp/consul/test/integration/consul-container/libs/assert" + libcluster "github.com/hashicorp/consul/test/integration/consul-container/libs/cluster" + libservice "github.com/hashicorp/consul/test/integration/consul-container/libs/service" + "github.com/hashicorp/consul/test/integration/consul-container/libs/utils" + "github.com/hashicorp/go-cleanhttp" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "io" + "net/http" + "strings" + "testing" + "time" +) + +var ( + checkTimeout = 1 * time.Minute + checkInterval = 1 * time.Second +) + +// Creates a gateway service and tests to see if it is routable +func TestAPIGatewayCreate(t *testing.T) { + t.Skip() + if testing.Short() { + t.Skip("too slow for testing.Short") + } + + t.Parallel() + + listenerPortOne := 6000 + + cluster := createCluster(t, listenerPortOne) + + client := cluster.APIClient(0) + + //setup + apiGateway := &api.APIGatewayConfigEntry{ + Kind: "api-gateway", + Name: "api-gateway", + Listeners: []api.APIGatewayListener{ + { + Port: listenerPortOne, + Protocol: "tcp", + }, + }, + } + _, _, err := client.ConfigEntries().Set(apiGateway, nil) + assert.NoError(t, err) + + tcpRoute := &api.TCPRouteConfigEntry{ + Kind: "tcp-route", + Name: "api-gateway-route", + Parents: []api.ResourceReference{ + { + Kind: "api-gateway", + Name: "api-gateway", + }, + }, + Services: []api.TCPService{ + { + Name: libservice.StaticServerServiceName, + }, + }, + } + + _, _, err = client.ConfigEntries().Set(tcpRoute, nil) + assert.NoError(t, err) + + // Create a client proxy instance with the server as an upstream + _, gatewayService := createServices(t, cluster, listenerPortOne) + + //check statuses + gatewayReady := false + routeReady := false + + //make sure the gateway/route come online + require.Eventually(t, func() bool { + entry, _, err := client.ConfigEntries().Get("api-gateway", "api-gateway", nil) + assert.NoError(t, err) + apiEntry := entry.(*api.APIGatewayConfigEntry) + gatewayReady = isAccepted(apiEntry.Status.Conditions) + + e, _, err := client.ConfigEntries().Get("tcp-route", "api-gateway-route", nil) + assert.NoError(t, err) + routeEntry := e.(*api.TCPRouteConfigEntry) + routeReady = isBound(routeEntry.Status.Conditions) + + return gatewayReady && routeReady + }, time.Second*10, time.Second*1) + + port, err := gatewayService.GetPort(listenerPortOne) + assert.NoError(t, err) + libassert.HTTPServiceEchoes(t, "localhost", port, "") +} + +func isAccepted(conditions []api.Condition) bool { + return conditionStatusIsValue("Accepted", "True", conditions) +} + +func isBound(conditions []api.Condition) bool { + return conditionStatusIsValue("Bound", "True", conditions) +} + +func conditionStatusIsValue(typeName string, statusValue string, conditions []api.Condition) bool { + for _, c := range conditions { + if c.Type == typeName && c.Status == statusValue { + return true + } + } + return false +} + +// TODO this code is just copy pasted from elsewhere, it is likely we will need to modify it some +func createCluster(t *testing.T, ports ...int) *libcluster.Cluster { + opts := libcluster.BuildOptions{ + InjectAutoEncryption: true, + InjectGossipEncryption: true, + AllowHTTPAnyway: true, + } + ctx := libcluster.NewBuildContext(t, opts) + + conf := libcluster.NewConfigBuilder(ctx). + ToAgentConfig(t) + t.Logf("Cluster config:\n%s", conf.JSON) + + configs := []libcluster.Config{*conf} + + cluster, err := libcluster.New(t, configs, ports...) + require.NoError(t, err) + + node := cluster.Agents[0] + client := node.GetClient() + + libcluster.WaitForLeader(t, cluster, client) + libcluster.WaitForMembers(t, client, 1) + + // Default Proxy Settings + ok, err := utils.ApplyDefaultProxySettings(client) + require.NoError(t, err) + require.True(t, ok) + + require.NoError(t, err) + + return cluster +} + +func createService(t *testing.T, cluster *libcluster.Cluster, serviceOpts *libservice.ServiceOpts, containerArgs []string) libservice.Service { + node := cluster.Agents[0] + client := node.GetClient() + // Create a service and proxy instance + service, _, err := libservice.CreateAndRegisterStaticServerAndSidecar(node, serviceOpts, containerArgs...) + assert.NoError(t, err) + + libassert.CatalogServiceExists(t, client, serviceOpts.Name+"-sidecar-proxy") + libassert.CatalogServiceExists(t, client, serviceOpts.Name) + + return service + +} +func createServices(t *testing.T, cluster *libcluster.Cluster, ports ...int) (libservice.Service, libservice.Service) { + node := cluster.Agents[0] + client := node.GetClient() + // Create a service and proxy instance + serviceOpts := &libservice.ServiceOpts{ + Name: libservice.StaticServerServiceName, + ID: "static-server", + HTTPPort: 8080, + GRPCPort: 8079, + } + + clientConnectProxy := createService(t, cluster, serviceOpts, nil) + + gatewayService, err := libservice.NewGatewayService(context.Background(), "api-gateway", "api", cluster.Agents[0], ports...) + require.NoError(t, err) + libassert.CatalogServiceExists(t, client, "api-gateway") + + return clientConnectProxy, gatewayService +} + +// checkRoute, customized version of libassert.RouteEchos to allow for headers/distinguishing between the server instances + +type checkOptions struct { + debug bool + statusCode int + testName string +} + +func checkRoute(t *testing.T, ip string, port int, path string, headers map[string]string, expected checkOptions) { + const phrase = "hello" + + failer := func() *retry.Timer { + return &retry.Timer{Timeout: time.Second * 60, Wait: time.Second * 60} + } + + client := cleanhttp.DefaultClient() + url := fmt.Sprintf("http://%s:%d", ip, port) + + if path != "" { + url += "/" + path + } + + retry.RunWith(failer(), t, func(r *retry.R) { + t.Logf("making call to %s", url) + reader := strings.NewReader(phrase) + req, err := http.NewRequest("POST", url, reader) + assert.NoError(t, err) + headers["content-type"] = "text/plain" + + for k, v := range headers { + req.Header.Set(k, v) + + if k == "Host" { + req.Host = v + } + } + res, err := client.Do(req) + if err != nil { + t.Log(err) + r.Fatal("could not make call to service ", url) + } + defer res.Body.Close() + + body, err := io.ReadAll(res.Body) + if err != nil { + r.Fatal("could not read response body ", url) + } + + assert.Equal(t, expected.statusCode, res.StatusCode) + if expected.statusCode != res.StatusCode { + r.Fatal("unexpected response code returned") + } + + //if debug is expected, debug should be in the response body + assert.Equal(t, expected.debug, strings.Contains(string(body), "debug")) + if expected.statusCode != res.StatusCode { + r.Fatal("unexpected response body returned") + } + + if !strings.Contains(string(body), phrase) { + r.Fatal("received an incorrect response ", string(body)) + } + + }) +} diff --git a/test/integration/consul-container/test/gateways/http_route_test.go b/test/integration/consul-container/test/gateways/http_route_test.go new file mode 100644 index 00000000000..26f83ae92ec --- /dev/null +++ b/test/integration/consul-container/test/gateways/http_route_test.go @@ -0,0 +1,258 @@ +package gateways + +import ( + "context" + "crypto/rand" + "encoding/hex" + "fmt" + "github.com/hashicorp/consul/api" + libassert "github.com/hashicorp/consul/test/integration/consul-container/libs/assert" + libservice "github.com/hashicorp/consul/test/integration/consul-container/libs/service" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "testing" + "time" +) + +func getNamespace() string { + return "" +} + +// randomName generates a random name of n length with the provided +// prefix. If prefix is omitted, the then entire name is random char. +func randomName(prefix string, n int) string { + if n == 0 { + n = 32 + } + if len(prefix) >= n { + return prefix + } + p := make([]byte, n) + rand.Read(p) + return fmt.Sprintf("%s-%s", prefix, hex.EncodeToString(p))[:n] +} + +func TestHTTPRouteFlattening(t *testing.T) { + if testing.Short() { + t.Skip("too slow for testing.Short") + } + t.Parallel() + + //infrastructure set up + listenerPort := 6000 + //create cluster + cluster := createCluster(t, listenerPort) + client := cluster.Agents[0].GetClient() + service1ResponseCode := 200 + service2ResponseCode := 418 + serviceOne := createService(t, cluster, &libservice.ServiceOpts{ + Name: "service1", + ID: "service1", + HTTPPort: 8080, + GRPCPort: 8079, + }, []string{ + //customizes response code so we can distinguish between which service is responding + "-echo-server-default-params", fmt.Sprintf("status=%d", service1ResponseCode), + }) + serviceTwo := createService(t, cluster, &libservice.ServiceOpts{ + Name: "service2", + ID: "service2", + HTTPPort: 8081, + GRPCPort: 8082, + }, []string{ + "-echo-server-default-params", fmt.Sprintf("status=%d", service2ResponseCode), + }, + ) + + //TODO this should only matter in consul enterprise I believe? + namespace := getNamespace() + gatewayName := randomName("gw", 16) + routeOneName := randomName("route", 16) + routeTwoName := randomName("route", 16) + path1 := "/" + path2 := "/v2" + + //write config entries + proxyDefaults := &api.ProxyConfigEntry{ + Kind: api.ProxyDefaults, + Name: api.ProxyConfigGlobal, + Namespace: namespace, + Config: map[string]interface{}{ + "protocol": "http", + }, + } + + _, _, err := client.ConfigEntries().Set(proxyDefaults, nil) + assert.NoError(t, err) + + apiGateway := &api.APIGatewayConfigEntry{ + Kind: "api-gateway", + Name: gatewayName, + Listeners: []api.APIGatewayListener{ + { + Name: "listener", + Port: listenerPort, + Protocol: "http", + }, + }, + } + + routeOne := &api.HTTPRouteConfigEntry{ + Kind: api.HTTPRoute, + Name: routeOneName, + Parents: []api.ResourceReference{ + { + Kind: api.APIGateway, + Name: gatewayName, + Namespace: namespace, + }, + }, + Hostnames: []string{ + "test.foo", + "test.example", + }, + Namespace: namespace, + Rules: []api.HTTPRouteRule{ + { + Services: []api.HTTPService{ + { + Name: serviceOne.GetServiceName(), + Namespace: namespace, + }, + }, + Matches: []api.HTTPMatch{ + { + Path: api.HTTPPathMatch{ + Match: api.HTTPPathMatchPrefix, + Value: path1, + }, + }, + }, + }, + }, + } + + routeTwo := &api.HTTPRouteConfigEntry{ + Kind: api.HTTPRoute, + Name: routeTwoName, + Parents: []api.ResourceReference{ + { + Kind: api.APIGateway, + Name: gatewayName, + Namespace: namespace, + }, + }, + Hostnames: []string{ + "test.foo", + }, + Namespace: namespace, + Rules: []api.HTTPRouteRule{ + { + Services: []api.HTTPService{ + { + Name: serviceTwo.GetServiceName(), + Namespace: namespace, + }, + }, + Matches: []api.HTTPMatch{ + { + Path: api.HTTPPathMatch{ + Match: api.HTTPPathMatchPrefix, + Value: path2, + }, + }, + { + Headers: []api.HTTPHeaderMatch{{ + Match: api.HTTPHeaderMatchExact, + Name: "x-v2", + Value: "v2", + }}, + }, + }, + }, + }, + } + + _, _, err = client.ConfigEntries().Set(apiGateway, nil) + assert.NoError(t, err) + _, _, err = client.ConfigEntries().Set(routeOne, nil) + assert.NoError(t, err) + _, _, err = client.ConfigEntries().Set(routeTwo, nil) + assert.NoError(t, err) + + //create gateway service + gatewayService, err := libservice.NewGatewayService(context.Background(), gatewayName, "api", cluster.Agents[0], listenerPort) + require.NoError(t, err) + libassert.CatalogServiceExists(t, client, gatewayName) + + //make sure config entries have been properly created + require.Eventually(t, func() bool { + entry, _, err := client.ConfigEntries().Get(api.APIGateway, gatewayName, &api.QueryOptions{Namespace: namespace}) + assert.NoError(t, err) + if entry == nil { + return false + } + apiEntry := entry.(*api.APIGatewayConfigEntry) + t.Log(entry) + return isAccepted(apiEntry.Status.Conditions) + }, time.Second*10, time.Second*1) + + require.Eventually(t, func() bool { + entry, _, err := client.ConfigEntries().Get(api.HTTPRoute, routeOneName, &api.QueryOptions{Namespace: namespace}) + assert.NoError(t, err) + if entry == nil { + return false + } + + apiEntry := entry.(*api.HTTPRouteConfigEntry) + t.Log(entry) + return isBound(apiEntry.Status.Conditions) + }, time.Second*10, time.Second*1) + + require.Eventually(t, func() bool { + entry, _, err := client.ConfigEntries().Get(api.HTTPRoute, routeTwoName, nil) + assert.NoError(t, err) + if entry == nil { + return false + } + + apiEntry := entry.(*api.HTTPRouteConfigEntry) + return isBound(apiEntry.Status.Conditions) + }, time.Second*10, time.Second*1) + + //gateway resolves routes + ip := "localhost" + gatewayPort, err := gatewayService.GetPort(listenerPort) + assert.NoError(t, err) + + //Same v2 path with and without header + checkRoute(t, ip, gatewayPort, "v2", map[string]string{ + "Host": "test.foo", + "x-v2": "v2", + }, checkOptions{statusCode: service2ResponseCode, testName: "service2 header and path"}) + checkRoute(t, ip, gatewayPort, "v2", map[string]string{ + "Host": "test.foo", + }, checkOptions{statusCode: service2ResponseCode, testName: "service2 just path match"}) + + ////v1 path with the header + checkRoute(t, ip, gatewayPort, "check", map[string]string{ + "Host": "test.foo", + "x-v2": "v2", + }, checkOptions{statusCode: service2ResponseCode, testName: "service2 just header match"}) + + checkRoute(t, ip, gatewayPort, "v2/path/value", map[string]string{ + "Host": "test.foo", + "x-v2": "v2", + }, checkOptions{statusCode: service2ResponseCode, testName: "service2 v2 with path"}) + + //hit service 1 by hitting root path + checkRoute(t, ip, gatewayPort, "", map[string]string{ + "Host": "test.foo", + }, checkOptions{debug: false, statusCode: service1ResponseCode, testName: "service1 root prefix"}) + + //hit service 1 by hitting v2 path with v1 hostname + checkRoute(t, ip, gatewayPort, "v2", map[string]string{ + "Host": "test.example", + }, checkOptions{debug: false, statusCode: service1ResponseCode, testName: "service1, v2 path with v2 hostname"}) + +} From 801a17329e3261a621376440aa2483e2571eadbd Mon Sep 17 00:00:00 2001 From: Andrew Stucki Date: Fri, 24 Feb 2023 17:00:31 -0500 Subject: [PATCH 065/262] Fix attempt for test fail panics in xDS (#16319) * Fix attempt for test fail panics in xDS * switch to a mutex pointer --- agent/xds/delta_test.go | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/agent/xds/delta_test.go b/agent/xds/delta_test.go index a61050f8457..20ee2887dd7 100644 --- a/agent/xds/delta_test.go +++ b/agent/xds/delta_test.go @@ -4,6 +4,7 @@ import ( "errors" "strconv" "strings" + "sync" "sync/atomic" "testing" "time" @@ -1058,6 +1059,15 @@ func TestServer_DeltaAggregatedResources_v3_ACLEnforcement(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { + var stopped bool + lock := &sync.RWMutex{} + + defer func() { + lock.Lock() + stopped = true + lock.Unlock() + }() + // aclResolve may be called in a goroutine even after a // testcase tt returns. Capture the variable as tc so the // values don't swap in the next iteration. @@ -1071,6 +1081,14 @@ func TestServer_DeltaAggregatedResources_v3_ACLEnforcement(t *testing.T) { // No token and defaultDeny is denied return acl.RootAuthorizer("deny"), nil } + + lock.RLock() + defer lock.RUnlock() + + if stopped { + return acl.DenyAll().ToAllowAuthorizer(), nil + } + // Ensure the correct token was passed require.Equal(t, tc.token, id) // Parse the ACL and enforce it From 1ba5e3672be46f5a471b9cefe820a67e8f3720d3 Mon Sep 17 00:00:00 2001 From: malizz Date: Fri, 24 Feb 2023 15:29:07 -0800 Subject: [PATCH 066/262] update changelog (#16426) * update changelog * fix changelog formatting --- CHANGELOG.md | 82 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 82 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 975050ecf3e..1a9c4751426 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,85 @@ +## 1.15.0 (February 23, 2023) + +BREAKING CHANGES: + +* acl errors: Delete and get requests now return descriptive errors when the specified resource cannot be found. Other ACL request errors provide more information about when a resource is missing. Add error for when the ACL system has not been bootstrapped. + + Delete Token/Policy/AuthMethod/Role/BindingRule endpoints now return 404 when the resource cannot be found. + - New error formats: "Requested * does not exist: ACL not found", "* not found in namespace $NAMESPACE: ACL not found" + + Read Token/Policy/Role endpoints now return 404 when the resource cannot be found. + - New error format: "Cannot find * to delete" + + Logout now returns a 401 error when the supplied token cannot be found + - New error format: "Supplied token does not exist" + + Token Self endpoint now returns 404 when the token cannot be found. + - New error format: "Supplied token does not exist" [[GH-16105](https://github.com/hashicorp/consul/issues/16105)] +* acl: remove all acl migration functionality and references to the legacy acl system. [[GH-15947](https://github.com/hashicorp/consul/issues/15947)] +* acl: remove all functionality and references for legacy acl policies. [[GH-15922](https://github.com/hashicorp/consul/issues/15922)] +* config: Deprecate `-join`, `-join-wan`, `start_join`, and `start_join_wan`. +These options are now aliases of `-retry-join`, `-retry-join-wan`, `retry_join`, and `retry_join_wan`, respectively. [[GH-15598](https://github.com/hashicorp/consul/issues/15598)] +* connect: Add `peer` field to service-defaults upstream overrides. The addition of this field makes it possible to apply upstream overrides only to peer services. Prior to this change, overrides would be applied based on matching the `namespace` and `name` fields only, which means users could not have different configuration for local versus peer services. With this change, peer upstreams are only affected if the `peer` field matches the destination peer name. [[GH-15956](https://github.com/hashicorp/consul/issues/15956)] +* connect: Consul will now error and exit when using the `consul connect envoy` command if the Envoy version is incompatible. To ignore this check use flag `--ignore-envoy-compatibility` [[GH-15818](https://github.com/hashicorp/consul/issues/15818)] +* extensions: Refactor Lambda integration to get configured with the Envoy extensions field on service-defaults configuration entries. [[GH-15817](https://github.com/hashicorp/consul/issues/15817)] +* ingress-gateway: upstream cluster will have empty outlier_detection if passive health check is unspecified [[GH-15614](https://github.com/hashicorp/consul/issues/15614)] +* xds: Remove the `connect.enable_serverless_plugin` agent configuration option. Now +Lambda integration is enabled by default. [[GH-15710](https://github.com/hashicorp/consul/issues/15710)] + +SECURITY: + +* Upgrade to use Go 1.20.1. +This resolves vulnerabilities [CVE-2022-41724](https://go.dev/issue/58001) in `crypto/tls` and [CVE-2022-41723](https://go.dev/issue/57855) in `net/http`. [[GH-16263](https://github.com/hashicorp/consul/issues/16263)] + +FEATURES: + +* **API Gateway (Beta)** This version adds support for API gateway on VMs. API gateway provides a highly-configurable ingress for requests coming into a Consul network. For more information, refer to the [API gateway](https://developer.hashicorp.com/consul/docs/connect/gateways/api-gateway) documentation. [[GH-16369](https://github.com/hashicorp/consul/issues/16369)] +* acl: Add new `acl.tokens.config_file_registration` config field which specifies the token used +to register services and checks that are defined in config files. [[GH-15828](https://github.com/hashicorp/consul/issues/15828)] +* acl: anonymous token is logged as 'anonymous token' instead of its accessor ID [[GH-15884](https://github.com/hashicorp/consul/issues/15884)] +* cli: adds new CLI commands `consul troubleshoot upstreams` and `consul troubleshoot proxy` to troubleshoot Consul's service mesh configuration and network issues. [[GH-16284](https://github.com/hashicorp/consul/issues/16284)] +* command: Adds the `operator usage instances` subcommand for displaying total services, connect service instances and billable service instances in the local datacenter or globally. [[GH-16205](https://github.com/hashicorp/consul/issues/16205)] +* config-entry(ingress-gateway): support outlier detection (passive health check) for upstream cluster [[GH-15614](https://github.com/hashicorp/consul/issues/15614)] +* connect: adds support for Envoy [access logging](https://developer.hashicorp.com/consul/docs/connect/observability/access-logs). Access logging can be enabled using the [`proxy-defaults`](https://developer.hashicorp.com/consul/docs/connect/config-entries/proxy-defaults#accesslogs) config entry. [[GH-15864](https://github.com/hashicorp/consul/issues/15864)] +* xds: Add a built-in Envoy extension that inserts Lua HTTP filters. [[GH-15906](https://github.com/hashicorp/consul/issues/15906)] +* xds: Insert originator service identity into Envoy's dynamic metadata under the `consul` namespace. [[GH-15906](https://github.com/hashicorp/consul/issues/15906)] + +IMPROVEMENTS: + +* connect: for early awareness of Envoy incompatibilities, when using the `consul connect envoy` command the Envoy version will now be checked for compatibility. If incompatible Consul will error and exit. [[GH-15818](https://github.com/hashicorp/consul/issues/15818)] +* grpc: client agents will switch server on error, and automatically retry on `RESOURCE_EXHAUSTED` responses [[GH-15892](https://github.com/hashicorp/consul/issues/15892)] +* raft: add an operator api endpoint and a command to initiate raft leadership transfer. [[GH-14132](https://github.com/hashicorp/consul/issues/14132)] +* acl: Added option to allow for an operator-generated bootstrap token to be passed to the `acl bootstrap` command. [[GH-14437](https://github.com/hashicorp/consul/issues/14437)] +* agent: Give better error when client specifies wrong datacenter when auto-encrypt is enabled. [[GH-14832](https://github.com/hashicorp/consul/issues/14832)] +* api: updated the go module directive to 1.18. [[GH-15297](https://github.com/hashicorp/consul/issues/15297)] +* ca: support Vault agent auto-auth config for Vault CA provider using AWS/GCP authentication. [[GH-15970](https://github.com/hashicorp/consul/issues/15970)] +* cli: always use name "global" for proxy-defaults config entries [[GH-14833](https://github.com/hashicorp/consul/issues/14833)] +* cli: connect envoy command errors if grpc ports are not open [[GH-15794](https://github.com/hashicorp/consul/issues/15794)] +* client: add support for RemoveEmptyTags in Prepared Queries templates. [[GH-14244](https://github.com/hashicorp/consul/issues/14244)] +* connect: Warn if ACLs are enabled but a token is not provided to envoy [[GH-15967](https://github.com/hashicorp/consul/issues/15967)] +* container: Upgrade container image to use to Alpine 3.17. [[GH-16358](https://github.com/hashicorp/consul/issues/16358)] +* dns: support RFC 2782 SRV lookups for prepared queries using format `_._tcp.query[.].`. [[GH-14465](https://github.com/hashicorp/consul/issues/14465)] +* ingress-gateways: Don't log error when gateway is registered without a config entry [[GH-15001](https://github.com/hashicorp/consul/issues/15001)] +* licensing: **(Enterprise Only)** Consul Enterprise non-terminating production licenses do not degrade or terminate Consul upon expiration. They will only fail when trying to upgrade to a newer version of Consul. Evaluation licenses still terminate. +* raft: Added experimental `wal` backend for log storage. [[GH-16176](https://github.com/hashicorp/consul/issues/16176)] +* sdk: updated the go module directive to 1.18. [[GH-15297](https://github.com/hashicorp/consul/issues/15297)] +* telemetry: Added a `consul.xds.server.streamsUnauthenticated` metric to track +the number of active xDS streams handled by the server that are unauthenticated +because ACLs are not enabled or ACL tokens were missing. [[GH-15967](https://github.com/hashicorp/consul/issues/15967)] +* ui: Update sidebar width to 280px [[GH-16204](https://github.com/hashicorp/consul/issues/16204)] +* ui: update Ember version to 3.27; [[GH-16227](https://github.com/hashicorp/consul/issues/16227)] + +DEPRECATIONS: + +* acl: Deprecate the `token` query parameter and warn when it is used for authentication. [[GH-16009](https://github.com/hashicorp/consul/issues/16009)] +* cli: The `-id` flag on acl token operations has been changed to `-accessor-id` for clarity in documentation. The `-id` flag will continue to work, but operators should use `-accessor-id` in the future. [[GH-16044](https://github.com/hashicorp/consul/issues/16044)] + +BUG FIXES: + +* agent configuration: Fix issue of using unix socket when https is used. [[GH-16301](https://github.com/hashicorp/consul/issues/16301)] +* cache: refactor agent cache fetching to prevent unnecessary fetches on error [[GH-14956](https://github.com/hashicorp/consul/issues/14956)] +* cli: fatal error if config file does not have HCL or JSON extension, instead of warn and skip [[GH-15107](https://github.com/hashicorp/consul/issues/15107)] +* cli: fix ACL token processing unexpected precedence [[GH-15274](https://github.com/hashicorp/consul/issues/15274)] +* peering: Fix bug where services were incorrectly imported as connect-enabled. [[GH-16339](https://github.com/hashicorp/consul/issues/16339)] +* peering: Fix issue where mesh gateways would use the wrong address when contacting a remote peer with the same datacenter name. [[GH-16257](https://github.com/hashicorp/consul/issues/16257)] +* peering: Fix issue where secondary wan-federated datacenters could not be used as peering acceptors. [[GH-16230](https://github.com/hashicorp/consul/issues/16230)] + ## 1.14.4 (January 26, 2023) BREAKING CHANGES: From d9e6748738a0291cb1359329c14e938f49a49ac0 Mon Sep 17 00:00:00 2001 From: Valeriia Ruban Date: Fri, 24 Feb 2023 20:07:12 -0800 Subject: [PATCH 067/262] feat: update alerts to Hds::Alert component (CC-4035) (#16412) --- .changelog/16412.txt | 3 + .../lock-session/notifications/index.hbs | 18 ++-- .../consul/peer/form/generate/index.hbs | 12 +-- .../consul/peer/form/initiate/index.hbs | 12 +-- .../app/components/auth-form/index.hbs | 76 ++++++++------- .../consul/intention/form/index.hbs | 49 +++------- .../notice/custom-resource/index.hbs | 36 ++----- .../intention/notice/permissions/index.hbs | 31 ++---- .../consul/node/agentless-notice/index.hbs | 31 +++--- .../consul/node/agentless-notice/index.scss | 2 +- .../app/templates/dc/acls/policies/edit.hbs | 21 ++--- .../app/templates/dc/acls/tokens/edit.hbs | 20 ++-- .../app/templates/dc/acls/tokens/index.hbs | 18 ++-- .../consul-ui/app/templates/dc/kv/index.hbs | 2 +- .../templates/dc/nodes/show/healthchecks.hbs | 20 +--- .../dc/services/instance/healthchecks.hbs | 20 ++-- .../dc/services/instance/upstreams.hbs | 38 +++----- .../templates/dc/services/show/topology.hbs | 94 ++++++++++--------- .../consul-ui/app/templates/settings.hbs | 16 +--- .../consul-ui/translations/routes/en-us.yaml | 52 ++++------ 20 files changed, 231 insertions(+), 340 deletions(-) create mode 100644 .changelog/16412.txt diff --git a/.changelog/16412.txt b/.changelog/16412.txt new file mode 100644 index 00000000000..9b405be61eb --- /dev/null +++ b/.changelog/16412.txt @@ -0,0 +1,3 @@ +```release-note:improvement +ui: Update alerts to Hds::Alert component +``` diff --git a/ui/packages/consul-lock-sessions/app/components/consul/lock-session/notifications/index.hbs b/ui/packages/consul-lock-sessions/app/components/consul/lock-session/notifications/index.hbs index 8cf81c45e2a..132749f8b0a 100644 --- a/ui/packages/consul-lock-sessions/app/components/consul/lock-session/notifications/index.hbs +++ b/ui/packages/consul-lock-sessions/app/components/consul/lock-session/notifications/index.hbs @@ -34,14 +34,12 @@ {{/if}} {{else if (eq @type 'kv')}} - - -

    - Warning. This KV has a lock session. You can edit KV's with lock sessions, but we recommend doing so with care, or not doing so at all. It may negatively impact the active node it's associated with. See below for more details on the Lock Session and see our documentation for more information. -

    - - + + Warning + This KV has a lock session. You can edit KV's with lock sessions, but we recommend doing so with care, or not doing so at all. It may negatively impact the active node it's associated with. See below for more details on the Lock Session. + + {{/if}} diff --git a/ui/packages/consul-peerings/app/components/consul/peer/form/generate/index.hbs b/ui/packages/consul-peerings/app/components/consul/peer/form/generate/index.hbs index de818b1b5fe..039875eb46b 100644 --- a/ui/packages/consul-peerings/app/components/consul/peer/form/generate/index.hbs +++ b/ui/packages/consul-peerings/app/components/consul/peer/form/generate/index.hbs @@ -13,14 +13,10 @@ - - -

    - Error
    - {{fsm.state.context.error.message}} -

    -
    -
    + + Error + {{fsm.state.context.error.message}} +
    {{yield (hash diff --git a/ui/packages/consul-peerings/app/components/consul/peer/form/initiate/index.hbs b/ui/packages/consul-peerings/app/components/consul/peer/form/initiate/index.hbs index f7daf88cf40..ecdc2b8b8c9 100644 --- a/ui/packages/consul-peerings/app/components/consul/peer/form/initiate/index.hbs +++ b/ui/packages/consul-peerings/app/components/consul/peer/form/initiate/index.hbs @@ -14,14 +14,10 @@ as |writer| > - - -

    - Error
    - {{error.message}} -

    -
    -
    + + Error + {{error.message}} +
    {{#let (unique-id) as |id|}} diff --git a/ui/packages/consul-ui/app/components/auth-form/index.hbs b/ui/packages/consul-ui/app/components/auth-form/index.hbs index 3d6e14c54e1..561f3ce33ab 100644 --- a/ui/packages/consul-ui/app/components/auth-form/index.hbs +++ b/ui/packages/consul-ui/app/components/auth-form/index.hbs @@ -37,40 +37,52 @@ {{/if}} {{#if this.error.status}} - - -

    - {{#if this.value.Name}} - {{#if (eq this.error.status '403')}} - Consul login failed
    - We received a token from your OIDC provider but could not log in to Consul - with it. - {{else if (eq this.error.status '401')}} - Could not log in to provider
    - The OIDC provider has rejected this access token. Please have an - administrator check your auth method configuration. - {{else if (eq this.error.status '499')}} - SSO log in window closed
    - The OIDC provider window was closed. Please try again. - {{else}} - Error
    - {{this.error.detail}} - {{/if}} + + + {{#if this.value.Name}} + {{#if (eq this.error.status '403')}} + Consul login failed + {{else if (eq this.error.status '401')}} + Could not log in to provider + {{else if (eq this.error.status '499')}} + SSO log in window closed {{else}} - {{#if (eq this.error.status '403')}} - Invalid token
    - The token entered does not exist. Please enter a valid token to log in. - {{else if (eq this.error.status '404')}} - No providers
    - No SSO providers are configured for that Partition. - {{else}} - Error
    - {{this.error.detail}} - {{/if}} + Error {{/if}} -

    -
    -
    + {{else}} + {{#if (eq this.error.status '403')}} + Invalid token + {{else if (eq this.error.status '404')}} + No providers + {{else}} + Error + {{/if}} + {{/if}} + + + {{#if this.value.Name}} + {{#if (eq this.error.status '403')}} + We received a token from your OIDC provider but could not log in to Consul + with it. + {{else if (eq this.error.status '401')}} + The OIDC provider has rejected this access token. Please have an + administrator check your auth method configuration. + {{else if (eq this.error.status '499')}} + The OIDC provider window was closed. Please try again. + {{else}} + {{this.error.detail}} + {{/if}} + {{else}} + {{#if (eq this.error.status '403')}} + The token entered does not exist. Please enter a valid token to log in. + {{else if (eq this.error.status '404')}} + No SSO providers are configured for that Partition. + {{else}} + {{this.error.detail}} + {{/if}} + {{/if}} + + {{/if}}
    diff --git a/ui/packages/consul-ui/app/components/consul/intention/form/index.hbs b/ui/packages/consul-ui/app/components/consul/intention/form/index.hbs index 9334293a5c0..cfd3b4db473 100644 --- a/ui/packages/consul-ui/app/components/consul/intention/form/index.hbs +++ b/ui/packages/consul-ui/app/components/consul/intention/form/index.hbs @@ -133,20 +133,10 @@ as |item readonly|}} {{#if api.isCreate}} {{#if (and (can 'use partitions') (not (can 'choose partitions' dc=@dc)))}} - - -

    - Cross-partition communication not supported -

    -
    - -

    - Cross-partition communication is not supported outside of the primary datacenter. You will only be able to select namespaces for source and destination services. -

    -
    -
    + + Cross-partition communication not supported + Cross-partition communication is not supported outside of the primary datacenter. You will only be able to select namespaces for source and destination services. + {{/if}} {{#if this.isManagedByCRDs}} @@ -213,29 +203,14 @@ as |item readonly|}} {{else}} {{#if item.IsManagedByCRD}} - - -

    - Intention Custom Resource -

    -
    - -

    - This Intention is view only because it is managed through an Intention Custom Resource in your Kubernetes cluster. -

    -
    - - - -
    + + Intention Custom Resource + This Intention is view only because it is managed through an Intention Custom Resource in your Kubernetes cluster. + + {{/if}} - -

    - Intention Custom Resource -

    -
    - -

    - Some of your intentions are being managed through an Intention Custom Resource in your Kubernetes cluster. Those managed intentions will be view only in the UI. Any intentions created in the UI will work but will not be synced to the Custom Resource Definition (CRD) datastore. -

    -
    - -

    - -

    -
    - \ No newline at end of file + + Intention Custom Resource + Some of your intentions are being managed through an Intention Custom Resource in your Kubernetes cluster. Those managed intentions will be view only in the UI. Any intentions created in the UI will work but will not be synced to the Custom Resource Definition (CRD) datastore. + + \ No newline at end of file diff --git a/ui/packages/consul-ui/app/components/consul/intention/notice/permissions/index.hbs b/ui/packages/consul-ui/app/components/consul/intention/notice/permissions/index.hbs index 33d8233bfe0..8afe559e350 100644 --- a/ui/packages/consul-ui/app/components/consul/intention/notice/permissions/index.hbs +++ b/ui/packages/consul-ui/app/components/consul/intention/notice/permissions/index.hbs @@ -1,21 +1,10 @@ - - -

    - {{t "components.consul.intention.notice.permissions.body"}} -

    -
    - -

    - -

    -
    -
    - + + {{t "components.consul.intention.notice.permissions.body"}} + + \ No newline at end of file diff --git a/ui/packages/consul-ui/app/components/consul/node/agentless-notice/index.hbs b/ui/packages/consul-ui/app/components/consul/node/agentless-notice/index.hbs index 069dff276a4..92ac0ce145b 100644 --- a/ui/packages/consul-ui/app/components/consul/node/agentless-notice/index.hbs +++ b/ui/packages/consul-ui/app/components/consul/node/agentless-notice/index.hbs @@ -1,29 +1,20 @@ {{#if isVisible}} - - -

    - {{t 'routes.dc.nodes.index.agentless.notice.header'}} -

    + + + {{t 'routes.dc.nodes.index.agentless.notice.header'}} -
    - -

    - {{t 'routes.dc.nodes.index.agentless.notice.body'}} -

    -
    - - - -
    + + {{t 'routes.dc.nodes.index.agentless.notice.body'}} + + {{/if}} diff --git a/ui/packages/consul-ui/app/components/consul/node/agentless-notice/index.scss b/ui/packages/consul-ui/app/components/consul/node/agentless-notice/index.scss index fc4b21ac93b..a77be5a2322 100644 --- a/ui/packages/consul-ui/app/components/consul/node/agentless-notice/index.scss +++ b/ui/packages/consul-ui/app/components/consul/node/agentless-notice/index.scss @@ -1,4 +1,4 @@ -.agentless-node-notice header { +.agentless-node-notice .hds-alert__title { display: flex; justify-content: space-between; } diff --git a/ui/packages/consul-ui/app/templates/dc/acls/policies/edit.hbs b/ui/packages/consul-ui/app/templates/dc/acls/policies/edit.hbs index 63cc8ea667b..4a4d6df8fed 100644 --- a/ui/packages/consul-ui/app/templates/dc/acls/policies/edit.hbs +++ b/ui/packages/consul-ui/app/templates/dc/acls/policies/edit.hbs @@ -71,19 +71,14 @@ as |dc partition nspace id item create|}} {{/if}} {{#if (eq (policy/typeof item) 'policy-management')}} - - -

    Management

    -
    - -

    - This global-management token is built into Consul's policy system. You can apply this special policy to tokens for full access. This policy is not editable or removeable, but can be ignored by not applying it to any tokens. Learn more in our documentation. -

    -
    -
    + + Management + This global-management token is built into Consul's policy system. You can apply this special policy to tokens for full access. This policy is not editable or removeable, but can be ignored by not applying it to any tokens. + +
    Name
    diff --git a/ui/packages/consul-ui/app/templates/dc/acls/tokens/edit.hbs b/ui/packages/consul-ui/app/templates/dc/acls/tokens/edit.hbs index f525ce2d396..583a0976187 100644 --- a/ui/packages/consul-ui/app/templates/dc/acls/tokens/edit.hbs +++ b/ui/packages/consul-ui/app/templates/dc/acls/tokens/edit.hbs @@ -96,18 +96,14 @@ as |dc partition nspace item create|}} {{#if (token/is-legacy item)}} - - -

    Update

    -
    - -

    - We have upgraded our ACL system by allowing you to create reusable policies which you can then apply to tokens. Don't worry, even though this token was written in the old style, it is still valid. However, we do recommend upgrading your old tokens to the new style. Learn how in our documentation. -

    -
    -
    + + Update + We have upgraded our ACL system by allowing you to create reusable policies which you can then apply to tokens. Don't worry, even though this token was written in the old style, it is still valid. However, we do recommend upgrading your old tokens to the new style. + + {{/if}} {{#if (not create) }}
    diff --git a/ui/packages/consul-ui/app/templates/dc/acls/tokens/index.hbs b/ui/packages/consul-ui/app/templates/dc/acls/tokens/index.hbs index 25c1b4a9d8f..34a5bdfe3aa 100644 --- a/ui/packages/consul-ui/app/templates/dc/acls/tokens/index.hbs +++ b/ui/packages/consul-ui/app/templates/dc/acls/tokens/index.hbs @@ -80,16 +80,14 @@ as |route|> {{#if (token/is-legacy items)}} - - -

    Update

    -
    - -

    We have upgraded our ACL System to allow the creation of reusable policies that can be applied to tokens. Read more about the changes and how to upgrade legacy tokens in our documentation.

    -
    -
    + + Update + We have upgraded our ACL System to allow the creation of reusable policies that can be applied to tokens. Read more about the changes and how to upgrade legacy tokens. + + {{/if}} {{#if (can 'create kvs')}} - {{#if (not-eq parent.Key '/') }} + {{#if (and parent.Key (not-eq parent.Key '/')) }} {{/if}} {{#let (find-by "Type" "serf" items) as |serf|}} {{#if (and serf (eq serf.Status "critical"))}} - - -

    - {{t "routes.dc.nodes.show.healthchecks.critical-serf-notice.header"}} -

    -
    - - {{t - "routes.dc.nodes.show.healthchecks.critical-serf-notice.body" - htmlSafe=true - }} - -
    + + {{t "routes.dc.nodes.show.healthchecks.critical-serf-notice.header"}} + {{t "routes.dc.nodes.show.healthchecks.critical-serf-notice.body"}} + {{/if}} {{/let}} - -

    - {{t 'routes.dc.services.instance.healthchecks.critical-serf-notice.header'}} -

    -
    - - {{t - 'routes.dc.services.instance.healthchecks.critical-serf-notice.body' - htmlSafe=true - }} - - + + {{t 'routes.dc.services.instance.healthchecks.critical-serf-notice.header'}} + {{t + 'routes.dc.services.instance.healthchecks.critical-serf-notice.body' + htmlSafe=true + }} + {{/if}} {{/let}} {{! TODO: Looks like we can get this straight from item.Proxy.Mode }} {{! the less we need `proxy` and `meta` the better }} {{#if (eq meta.ServiceProxy.Mode 'transparent')}} - - -

    - {{t "routes.dc.services.instance.upstreams.tproxy-mode.header"}} -

    -
    - - {{t "routes.dc.services.instance.upstreams.tproxy-mode.body" - htmlSafe=true - }} - - -

    - -

    -
    -
    + + {{t "routes.dc.services.instance.upstreams.tproxy-mode.header"}} + + {{t "routes.dc.services.instance.upstreams.tproxy-mode.body"}} + + + {{/if}} - - -

    - {{compute (fn route.t 'notice.${prop}.header' - (hash - prop=prop - ) - )}} -

    -
    + + + {{compute (fn route.t 'notice.${prop}.header' + (hash + prop=prop + )) + }} + {{#if disclosure.expanded}} - -

    - {{compute (fn route.t 'notice.${prop}.body' - (hash - prop=prop - ) - )}} -

    -
    + + {{compute (fn route.t 'notice.${prop}.body' + (hash + prop=prop + )) + }} + {{/if}} - {{#let - (compute (fn route.t 'notice.${prop}.footer' - (hash - route_intentions=(href-to 'dc.services.show.intentions') - prop=prop - htmlSafe=true - ) - )) - as |footer|}} - {{#if (and disclosure.expanded (not-eq prop 'filtered-by-acls'))}} - - {{footer}} - + {{#if (and disclosure.expanded (not-eq prop 'filtered-by-acls'))}} + {{#if (includes prop (array 'wildcard-intention' 'default-allow' 'no-intentions'))}} + + {{else}} + {{/if}} - {{/let}} -
    + {{/if}} + {{/if}} {{/each-in}} diff --git a/ui/packages/consul-ui/app/templates/settings.hbs b/ui/packages/consul-ui/app/templates/settings.hbs index 4493bb936e2..ef86beab793 100644 --- a/ui/packages/consul-ui/app/templates/settings.hbs +++ b/ui/packages/consul-ui/app/templates/settings.hbs @@ -26,18 +26,10 @@ as |item|}}
    - - -

    Local Storage

    -
    - -

    - These settings are immediately saved to local storage and persisted through browser usage. -

    -
    -
    + + Local Storage + These settings are immediately saved to local storage and persisted through browser usage. +
    {{#if (not (env 'CONSUL_UI_DISABLE_REALTIME'))}} diff --git a/ui/packages/consul-ui/translations/routes/en-us.yaml b/ui/packages/consul-ui/translations/routes/en-us.yaml index 33d618ac4ab..fd2d797c92f 100644 --- a/ui/packages/consul-ui/translations/routes/en-us.yaml +++ b/ui/packages/consul-ui/translations/routes/en-us.yaml @@ -245,17 +245,11 @@ dc:

    critical-serf-notice: header: Failing serf check - body: | -

    - This instance has a failing serf node check. The health statuses shown on this page are the statuses as they were known before the node became unreachable. -

    + body: This instance has a failing serf node check. The health statuses shown on this page are the statuses as they were known before the node became unreachable. upstreams: tproxy-mode: header: Transparent proxy mode - body: | -

    - The upstreams listed on this page have been defined in a proxy registration. There may be more upstreams, though, as "transparent" mode is enabled on this proxy. -

    + body: The upstreams listed on this page have been defined in a proxy registration. There may be more upstreams, though, as "transparent" mode is enabled on this proxy. footer: link: "/connect/transparent-proxy" text: Read the documentation @@ -278,45 +272,39 @@ dc: default-allow: header: Restrict which services can connect body: Your current ACL settings allow all services to connect to each other. Either create a deny intention between all services, or set your default ACL policy to deny to improve your security posture and make this topology view reflect the actual upstreams and downstreams of this service. - footer: | -

    - Create a wildcard deny Intention -

    + footer: + link-text: Create a wildcard deny Intention + icon: plus wildcard-intention: header: Restrict which services can connect body: There is currently a wildcard Intention that allows all services to connect to each other. Change the action of that Intention to deny to improve your security posture and have this topology view reflect the actual upstreams and downstreams of this service. - footer: | -

    - Edit wildcard intentions -

    + footer: + link-text: Edit wildcard intentions + icon: edit not-defined-intention: header: Add upstream to allow traffic body: An Intention was defined that allows traffic between services, but those services are unable to communicate. Define an explicit upstream in the service definition or enable transparent proxy to fix this. - footer: | -

    - Learn how to add upstreams -

    + footer: + link: '{CONSUL_DOCS_URL}/connect/registration/service-registration#upstreams' + link-text: Learn how to add upstreams no-dependencies: header: No dependencies body: The service you are viewing currently has no dependencies. You will only see metrics for the current service until dependencies are added. - footer: | -

    - Read the documentation -

    + footer: + link: '{CONSUL_DOCS_URL}/connect/registration/service-registration#upstream-configuration-reference' + link-text: Read the documentation acls-disabled: header: Restrict which services can connect body: Your current ACL settings allow all services to connect to each other. Either create a deny intention between all services, or enable ACLs and set your default ACL policy to deny to improve your security posture and make this topology view reflect the actual upstreams and downstreams of this service. - footer: | -

    - Read the documentation -

    + footer: + link: '{ CONSUL_DOCS_URL }/security/acl/acl-system#configuring-acls' + link-text: Read the documentation no-intentions: header: Add Intention to allow traffic body: There is an upstream registered for this service, but that upstream cannot receive traffic without creating an allow intention. - footer: | -

    - Edit Intentions -

    + footer: + link-text: Edit Intentions + icon: edit intentions: index: empty: From 859abf8a34dc158088573571c37f33ff3725e317 Mon Sep 17 00:00:00 2001 From: Valeriia Ruban Date: Fri, 24 Feb 2023 23:46:45 -0800 Subject: [PATCH 068/262] fix: ui tests run is fixed (applying class attribute twice to the hbs element caused the issue (#16428) --- .changelog/16428.txt | 3 +++ .../consul/intention/notice/custom-resource/index.hbs | 2 +- .../app/components/consul/node/agentless-notice/index.hbs | 2 +- 3 files changed, 5 insertions(+), 2 deletions(-) create mode 100644 .changelog/16428.txt diff --git a/.changelog/16428.txt b/.changelog/16428.txt new file mode 100644 index 00000000000..30f9206de09 --- /dev/null +++ b/.changelog/16428.txt @@ -0,0 +1,3 @@ +```release-note:bug +ui: fixes ui tests run on CI +``` \ No newline at end of file diff --git a/ui/packages/consul-ui/app/components/consul/intention/notice/custom-resource/index.hbs b/ui/packages/consul-ui/app/components/consul/intention/notice/custom-resource/index.hbs index 680b8c42f2c..f0e03ef4931 100644 --- a/ui/packages/consul-ui/app/components/consul/intention/notice/custom-resource/index.hbs +++ b/ui/packages/consul-ui/app/components/consul/intention/notice/custom-resource/index.hbs @@ -1,4 +1,4 @@ - + Intention Custom Resource Some of your intentions are being managed through an Intention Custom Resource in your Kubernetes cluster. Those managed intentions will be view only in the UI. Any intentions created in the UI will work but will not be synced to the Custom Resource Definition (CRD) datastore. + {{t 'routes.dc.nodes.index.agentless.notice.header'}} Date: Sun, 26 Feb 2023 19:21:35 -0800 Subject: [PATCH 069/262] Refactor and move wal docs (#16387) * Add WAL documentation. Also fix some minor metrics registration details * Add tests to verify metrics are registered correctly * refactor and move wal docs * Updates to the WAL overview page * updates to enable WAL usage topic * updates to the monitoring WAL backend topic * updates for revert WAL topic * a few tweaks to overview and udpated metadescriptions * Apply suggestions from code review Co-authored-by: Paul Banks * make revert docs consistent with enable * Apply suggestions from code review Co-authored-by: Paul Banks * address feedback * address final feedback * Apply suggestions from code review Co-authored-by: Jeff Boruszak <104028618+boruszak@users.noreply.github.com> --------- Co-authored-by: Paul Banks Co-authored-by: trujillo-adam Co-authored-by: trujillo-adam <47586768+trujillo-adam@users.noreply.github.com> Co-authored-by: Jeff Boruszak <104028618+boruszak@users.noreply.github.com> --- .../docs/agent/config/config-files.mdx | 92 +++++++++-- website/content/docs/agent/telemetry.mdx | 31 +++- .../docs/agent/wal-logstore/enable.mdx | 143 ++++++++++++++++++ .../content/docs/agent/wal-logstore/index.mdx | 48 ++++++ .../docs/agent/wal-logstore/monitoring.mdx | 85 +++++++++++ .../agent/wal-logstore/revert-to-boltdb.mdx | 76 ++++++++++ website/data/docs-nav-data.json | 21 +++ 7 files changed, 481 insertions(+), 15 deletions(-) create mode 100644 website/content/docs/agent/wal-logstore/enable.mdx create mode 100644 website/content/docs/agent/wal-logstore/index.mdx create mode 100644 website/content/docs/agent/wal-logstore/monitoring.mdx create mode 100644 website/content/docs/agent/wal-logstore/revert-to-boltdb.mdx diff --git a/website/content/docs/agent/config/config-files.mdx b/website/content/docs/agent/config/config-files.mdx index 92047ce897e..2992f562af0 100644 --- a/website/content/docs/agent/config/config-files.mdx +++ b/website/content/docs/agent/config/config-files.mdx @@ -1586,15 +1586,89 @@ Valid time units are 'ns', 'us' (or 'µs'), 'ms', 's', 'm', 'h'." ## Raft Parameters -- `raft_boltdb` ((#raft_boltdb)) This is a nested object that allows configuring - options for Raft's BoltDB based log store. - - - `NoFreelistSync` ((#NoFreelistSync)) Setting this to `true` will disable - syncing the BoltDB freelist to disk within the raft.db file. Not syncing - the freelist to disk will reduce disk IO required for write operations - at the expense of potentially increasing start up time due to needing - to scan the db to discover where the free space resides within the file. - +- `raft_boltdb` ((#raft_boltdb)) **These fields are deprecated in Consul v1.15.0. + Use [`raft_logstore`](#raft_logstore) instead.** This is a nested + object that allows configuring options for Raft's BoltDB-based log store. + + - `NoFreelistSync` **This field is deprecated in Consul v1.15.0. Use the + [`raft_logstore.boltdb.no_freelist_sync`](#raft_logstore_boltdb_no_freelist_sync) field + instead.** Setting this to `true` disables syncing the BoltDB freelist + to disk within the raft.db file. Not syncing the freelist to disk + reduces disk IO required for write operations at the expense of potentially + increasing start up time due to needing to scan the db to discover where the + free space resides within the file. + +- `raft_logstore` ((#raft_logstore)) This is a nested object that allows + configuring options for Raft's LogStore component which is used to persist + logs and crucial Raft state on disk during writes. This was added in Consul + v1.15.0. + + - `backend` ((#raft_logstore_backend)) Specifies which storage + engine to use to persist logs. Valid options are `boltdb` or `wal`. Default + is `boltdb`. The `wal` option specifies an experimental backend that + should be used with caution. Refer to + [Experimental WAL LogStore backend](/consul/docs/agent/wal-logstore) + for more information. + + - `disable_log_cache` ((#raft_logstore_disable_log_cache)) Disables the in-memory cache for recent logs. We recommend using it for performance testing purposes, as no significant improvement has been measured when the cache is disabled. While the in-memory log cache theoretically prevents disk reads for recent logs, recent logs are also stored in the OS page cache, which does not slow either the `boltdb` or `wal` backend's ability to read them. + + - `verification` ((#raft_logstore_verification)) This is a nested object that + allows configuring the online verification of the LogStore. Verification + provides additional assurances that LogStore backends are correctly storing + data. It imposes low overhead on servers and is safe to run in + production. It is most useful when evaluating a new backend + implementation. + + Verification must be enabled on the leader to have any effect and can be + used with any backend. When enabled, the leader periodically writes a + special "checkpoint" log message that includes the checksums of all log entries + written to Raft since the last checkpoint. Followers that have verification + enabled run a background task for each checkpoint that reads all logs + directly from the LogStore and then recomputes the checksum. A report is output + as an INFO level log for each checkpoint. + + Checksum failure should never happen and indicate unrecoverable corruption + on that server. The only correct response is to stop the server, remove its + data directory, and restart so it can be caught back up with a correct + server again. Please report verification failures including details about + your hardware and workload via GitHub issues. Refer to + [Experimental WAL LogStore backend](/consul/docs/agent/wal-logstore) + for more information. + + - `enabled` ((#raft_logstore_verification_enabled)) - Set to `true` to + allow this Consul server to write and verify log verification checkpoints + when elected leader. + + - `interval` ((#raft_logstore_verification_interval)) - Specifies the time + interval between checkpoints. There is no default value. You must + configure the `interval` and set [`enabled`](#raft_logstore_verification_enabled) + to `true` to correctly enable intervals. We recommend using an interval + between `30s` and `5m`. The performance overhead is insignificant when the + interval is set to `5m` or less. + + - `boltdb` ((#raft_logstore_boltdb)) - Object that configures options for + Raft's `boltdb` backend. It has no effect if the `backend` is not `boltdb`. + + - `no_freelist_sync` ((#raft_logstore_boltdb_no_freelist_sync)) - Set to + `true` to disable storing BoltDB's freelist to disk within the + `raft.db` file. Disabling freelist syncs reduces the disk IO required + for write operations, but could potentially increase start up time + because Consul must scan the database to find free space + within the file. + + - - `wal` ((#raft_logstore_wal)) - Object that configures the `wal` backend. + Refer to [Experimental WAL LogStore backend](/consul/docs/agent/wal-logstore) + for more information. + + - `segment_size_mb` ((#raft_logstore_wal_segment_size_mb)) - Integer value + that represents the target size in MB for each segment file before + rolling to a new segment. The default value is `64` and is suitable for + most deployments. While a smaller value may use less disk space because you + can reclaim space by deleting old segments sooner, the smaller segment that results + may affect performance because safely rotating to a new file more + frequently can impact tail latencies. Larger values are unlikely + to improve performance significantly. We recommend using this + configuration for performance testing purposes. - `raft_protocol` ((#raft_protocol)) Equivalent to the [`-raft-protocol` command-line flag](/consul/docs/agent/config/cli-flags#_raft_protocol). diff --git a/website/content/docs/agent/telemetry.mdx b/website/content/docs/agent/telemetry.mdx index 194f0d86d3b..df8fdef15dc 100644 --- a/website/content/docs/agent/telemetry.mdx +++ b/website/content/docs/agent/telemetry.mdx @@ -294,7 +294,7 @@ This metric should be monitored to ensure that the license doesn't expire to pre | Metric Name | Description | Unit | Type | | :-------------------------------- | :--------------------------------------------------------------- | :---- | :---- | -| `consul.raft.boltdb.freelistBytes` | Represents the number of bytes necessary to encode the freelist metadata. When [`raft_boltdb.NoFreelistSync`](/consul/docs/agent/config/config-files#NoFreelistSync) is set to `false` these metadata bytes must also be written to disk for each committed log. | bytes | gauge | +| `consul.raft.boltdb.freelistBytes` | Represents the number of bytes necessary to encode the freelist metadata. When [`raft_logstore.boltdb.no_freelist_sync`](/consul/docs/agent/config/config-files#raft_logstore_boltdb_no_freelist_sync) is set to `false` these metadata bytes must also be written to disk for each committed log. | bytes | gauge | | `consul.raft.boltdb.logsPerBatch` | Measures the number of logs being written per batch to the db. | logs | sample | | `consul.raft.boltdb.storeLogs` | Measures the amount of time spent writing logs to the db. | ms | timer | | `consul.raft.boltdb.writeCapacity` | Theoretical write capacity in terms of the number of logs that can be written per second. Each sample outputs what the capacity would be if future batched log write operations were similar to this one. This similarity encompasses 4 things: batch size, byte size, disk performance and boltdb performance. While none of these will be static and its highly likely individual samples of this metric will vary, aggregating this metric over a larger time window should provide a decent picture into how this BoltDB store can perform | logs/second | sample | @@ -337,11 +337,12 @@ indicator of an actual issue, this metric can be used to diagnose why the `consu is high. If Bolt DB log storage performance becomes an issue and is caused by free list management then setting -[`raft_boltdb.NoFreelistSync`](/consul/docs/agent/config/config-files#NoFreelistSync) to `true` in the server's configuration +[`raft_logstore.boltdb.no_freelist_sync`](/consul/docs/agent/config/config-files#raft_logstore_boltdb_no_freelist_sync) to `true` in the server's configuration may help to reduce disk IO and log storage operation times. Disabling free list syncing will however increase the startup time for a server as it must scan the raft.db file for free space instead of loading the already populated free list structure. +Consul includes an experiment backend configuration that you can use instead of BoldDB. Refer to [Experimental WAL LogStore backend](/consul/docs/agent/wal-logstore) for more information. ## Metrics Reference @@ -418,7 +419,7 @@ These metrics are used to monitor the health of the Consul servers. | `consul.raft.applied_index` | Represents the raft applied index. | index | gauge | | `consul.raft.apply` | Counts the number of Raft transactions occurring over the interval, which is a general indicator of the write load on the Consul servers. | raft transactions / interval | counter | | `consul.raft.barrier` | Counts the number of times the agent has started the barrier i.e the number of times it has issued a blocking call, to ensure that the agent has all the pending operations that were queued, to be applied to the agent's FSM. | blocks / interval | counter | -| `consul.raft.boltdb.freelistBytes` | Represents the number of bytes necessary to encode the freelist metadata. When [`raft_boltdb.NoFreelistSync`](/consul/docs/agent/config/config-files#NoFreelistSync) is set to `false` these metadata bytes must also be written to disk for each committed log. | bytes | gauge | +| `consul.raft.boltdb.freelistBytes` | Represents the number of bytes necessary to encode the freelist metadata. When [`raft_logstore.boltdb.no_freelist_sync`](/consul/docs/agent/config/config-files#raft_logstore_boltdb_no_freelist_sync) is set to `false` these metadata bytes must also be written to disk for each committed log. | bytes | gauge | | `consul.raft.boltdb.freePageBytes` | Represents the number of bytes of free space within the raft.db file. | bytes | gauge | | `consul.raft.boltdb.getLog` | Measures the amount of time spent reading logs from the db. | ms | timer | | `consul.raft.boltdb.logBatchSize` | Measures the total size in bytes of logs being written to the db in a single batch. | bytes | sample | @@ -452,6 +453,13 @@ These metrics are used to monitor the health of the Consul servers. | `consul.raft.last_index` | Represents the raft applied index. | index | gauge | | `consul.raft.leader.dispatchLog` | Measures the time it takes for the leader to write log entries to disk. | ms | timer | | `consul.raft.leader.dispatchNumLogs` | Measures the number of logs committed to disk in a batch. | logs | gauge | +| `consul.raft.logstore.verifier.checkpoints_written` | Counts the number of checkpoint entries written to the LogStore. | checkpoints | counter | +| `consul.raft.logstore.verifier.dropped_reports` | Counts how many times the verifier routine was still busy when the next checksum came in and so verification for a range was skipped. If you see this happen, consider increasing the interval between checkpoints with [`raft_logstore.verification.interval`](/consul/docs/agent/config/config-files#raft_logstore_verification) | reports dropped | counter | +| `consul.raft.logstore.verifier.ranges_verified` | Counts the number of log ranges for which a verification report has been completed. Refer to [Monitor Raft metrics and logs for WAL +](/consul/docs/agent/wal-logstore/monitoring) for more information. | log ranges verifications | counter | +| `consul.raft.logstore.verifier.read_checksum_failures` | Counts the number of times a range of logs between two check points contained at least one disk corruption. Refer to [Monitor Raft metrics and logs for WAL +](/consul/docs/agent/wal-logstore/monitoring) for more information. | disk corruptions | counter | +| `consul.raft.logstore.verifier.write_checksum_failures` | Counts the number of times a follower has a different checksum to the leader at the point where it writes to the log. This could be caused by either a disk-corruption on the leader (unlikely) or some other corruption of the log entries in-flight. | in-flight corruptions | counter | | `consul.raft.leader.lastContact` | Measures the time since the leader was last able to contact the follower nodes when checking its leader lease. It can be used as a measure for how stable the Raft timing is and how close the leader is to timing out its lease.The lease timeout is 500 ms times the [`raft_multiplier` configuration](/consul/docs/agent/config/config-files#raft_multiplier), so this telemetry value should not be getting close to that configured value, otherwise the Raft timing is marginal and might need to be tuned, or more powerful servers might be needed. See the [Server Performance](/consul/docs/install/performance) guide for more details. | ms | timer | | `consul.raft.leader.oldestLogAge` | The number of milliseconds since the _oldest_ log in the leader's log store was written. This can be important for replication health where write rate is high and the snapshot is large as followers may be unable to recover from a restart if restoring takes longer than the minimum value for the current leader. Compare this with `consul.raft.fsm.lastRestoreDuration` and `consul.raft.rpc.installSnapshot` to monitor. In normal usage this gauge value will grow linearly over time until a snapshot completes on the leader and the log is truncated. Note: this metric won't be emitted until the leader writes a snapshot. After an upgrade to Consul 1.10.0 it won't be emitted until the oldest log was written after the upgrade. | ms | gauge | | `consul.raft.replication.heartbeat` | Measures the time taken to invoke appendEntries on a peer, so that it doesn't timeout on a periodic basis. | ms | timer | @@ -476,9 +484,20 @@ These metrics are used to monitor the health of the Consul servers. | `consul.raft.state.follower` | Counts the number of times an agent has entered the follower mode. This happens when a new agent joins the cluster or after the end of a leader election. | follower state entered / interval | counter | | `consul.raft.transition.heartbeat_timeout` | The number of times an agent has transitioned to the Candidate state, after receive no heartbeat messages from the last known leader. | timeouts / interval | counter | | `consul.raft.verify_leader` | This metric doesn't have a direct correlation to the leader change. It just counts the number of times an agent checks if it is still the leader or not. For example, during every consistent read, the check is done. Depending on the load in the system, this metric count can be high as it is incremented each time a consistent read is completed. | checks / interval | Counter | -| `consul.rpc.accept_conn` | Increments when a server accepts an RPC connection. | connections | counter | -| `consul.rpc.rate_limit.exceeded` | Number of rate limited requests. Only increments when `rate_limits.mode` is set to `permissive` or `enforcing`. | requests | counter | -| `consul.rpc.rate_limit.log_dropped` | Number of logs for rate limited requests dropped for performance reasons. Only increments when `rate_limits.mode` is set to `permissive` or `enforcing` and the log is unable to print the number of excessive requests. | log lines | counter | +| `consul.raft.wal.head_truncations` | Counts how many log entries have been truncated from the head - i.e. the oldest entries. by graphing the rate of change over time you can see individual truncate calls as spikes. | logs entries truncated | counter | +| `consul.raft.wal.last_segment_age_seconds` | A gauge that is set each time we rotate a segment and describes the number of seconds between when that segment file was first created and when it was sealed. this gives a rough estimate how quickly writes are filling the disk. | seconds | gauge | +| `consul.raft.wal.log_appends` | Counts the number of calls to StoreLog(s) i.e. number of batches of entries appended. | calls | counter | +| `consul.raft.wal.log_entries_read` | Counts the number of log entries read. | log entries read | counter | +| `consul.raft.wal.log_entries_written` | Counts the number of log entries written. | log entries written | counter | +| `consul.raft.wal.log_entry_bytes_read` | Counts the bytes of log entry read from segments before decoding. actual bytes read from disk might be higher as it includes headers and index entries and possible secondary reads for large entries that don't fit in buffers. | bytes | counter | +| `consul.raft.wal.log_entry_bytes_written` | Counts the bytes of log entry after encoding with Codec. Actual bytes written to disk might be slightly higher as it includes headers and index entries. | bytes | counter | +| `consul.raft.wal.segment_rotations` | Counts how many times we move to a new segment file. | rotations | counter | +| `consul.raft.wal.stable_gets` | Counts how many calls to StableStore.Get or GetUint64. | calls | counter | +| `consul.raft.wal.stable_sets` | Counts how many calls to StableStore.Set or SetUint64. | calls | counter | +| `consul.raft.wal.tail_truncations` | Counts how many log entries have been truncated from the head - i.e. the newest entries. by graphing the rate of change over time you can see individual truncate calls as spikes. | logs entries truncated | counter | +| `consul.rpc.accept_conn` | Increments when a server accepts an RPC connection. | connections | counter | +| `consul.rpc.rate_limit.exceeded` | Increments whenever an RPC is over a configured rate limit. In permissive mode, the RPC is still allowed to proceed. | RPCs | counter | +| `consul.rpc.rate_limit.log_dropped` | Increments whenever a log that is emitted because an RPC exceeded a rate limit gets dropped because the output buffer is full. | log messages dropped | counter | | `consul.catalog.register` | Measures the time it takes to complete a catalog register operation. | ms | timer | | `consul.catalog.deregister` | Measures the time it takes to complete a catalog deregister operation. | ms | timer | | `consul.server.isLeader` | Track if a server is a leader(1) or not(0) | 1 or 0 | gauge | diff --git a/website/content/docs/agent/wal-logstore/enable.mdx b/website/content/docs/agent/wal-logstore/enable.mdx new file mode 100644 index 00000000000..a4a89f70c86 --- /dev/null +++ b/website/content/docs/agent/wal-logstore/enable.mdx @@ -0,0 +1,143 @@ +--- +layout: docs +page_title: Enable the experimental WAL LogStore backend +description: >- + Learn how to safely configure and test the experimental WAL backend in your Consul deployment. +--- + +# Enable the experimental WAL LogStore backend + +This topic describes how to safely configure and test the WAL backend in your Consul deployment. + +The overall process for enabling the WAL LogStore backend for one server consists of the following steps. In production environments, we recommend starting by enabling the backend on a single server . If you eventually choose to expand the test to further servers, you must repeat these steps for each one. + +1. Enable log verification. +1. Select target server to enable WAL. +1. Stop target server gracefully. +1. Remove data directory from target server. +1. Update target server's configuration. +1. Start the target server. +1. Monitor target server raft metrics and logs. + +!> **Experimental feature:** The WAL LogStore backend is experimental. + +## Requirements + +- Consul v1.15 or later is required for all servers in the datacenter. Refer to the [standard upgrade procedure](/consul/docs/upgrading/general-process) and the [1.15 upgrade notes](/consul/docs/upgrading/upgrade-specific#consul-1-15-x) for additional information. +- A Consul cluster with at least three nodes are required to safely test the WAL backend without downtime. + +We recommend taking the following additional measures: + +- Take a snapshot prior to testing. +- Monitor Consul server metrics and logs, and set an alert on specific log events that occur when WAL is enabled. Refer to [Monitor Raft metrics and logs for WAL](/consul/docs/agent/wal-logstore/monitoring) for more information. +- Enable WAL in a pre-production environment and run it for a several days before enabling it in production. + +## Risks + +While their likelihood remains low to very low, be aware of the following risks before implementing the WAL backend: + + - If WAL corrupts data on a Consul server agent, the server data cannot be recovered. Restart the server with an empty data directory and reload its state from the leader to resolve the issue. + - WAL may corrupt data or contain a defect that causes the server to panic and crash. WAL may not restart if the defect recurs when WAL reads from the logs on startup. Restart the server with an empty data directory and reload its state from the leader to resolve the issue. + - If WAL corrupts data, clients may read corrupted data from the Consul server, such as invalid IP addresses or unmatched tokens. This outcome is unlikely even if a recurring defect causes WAL to corrupt data because replication uses objects cached in memory instead of reads from disk. Restart the server with an empty data directory and reload its state from the leader to resolve the issue. + - If you enable a Consul OSS server to use WAL or enable WAL on a voting server with Consul Enterprise, WAL may corrupt the server's state, become the leader, and replicate the corrupted state to all other servers. In this case, restoring from backup is required to recover a completely uncorrupted state. Test WAL on a non-voting server in Enterprise to prevent this outcome. You can add a new non-voting server to the cluster to test with if there are no existing ones. + +## Enable log verification + +You must enable log verification on all voting servers in Enterprise and all servers in OSS because the leader writes verification checkpoints. + +1. On each voting server, add the following to the server's configuration file: + + ```hcl + raft_logstore { + verification { + enabled = true + interval = "60s" + } + } + ``` + +1. Restart the server to apply the changes. The `consul reload` command is not sufficient to apply `raft_logstore` configuration changes. +1. Run the `consul operator raft list-peers` command to wait for each server to become a healthy voter before moving on to the next. This may take a few minutes for large snapshots. + +When complete, the server's logs should contain verifier reports that appear like the following example: + +```log hideClipboard +2023-01-31T14:44:31.174Z [INFO] agent.server.raft.logstore.verifier: verification checksum OK: elapsed=488.463268ms leaderChecksum=f15db83976f2328c rangeEnd=357802 rangeStart=298132 readChecksum=f15db83976f2328c +``` + +## Select target server to enable WAL + +If you are using Consul OSS or Consul Enterprise without non-voting servers, select a follower server to enable WAL. As noted in [Risks](#risks), Consul Enterprise users with non-voting servers should first select a non-voting server, or consider adding another server as a non-voter to test on. + +Retrieve the current state of the servers by running the following command: + +```shell-session +$ consul operator raft list-peers +``` + +## Stop target server + +Stop the target server gracefully. For example, if you are using `systemd`, +run the following command: + +```shell-session +$ systemctl stop consul +``` + +If your environment uses configuration management automation that might interfere with this process, such as Chef or Puppet, you must disable them until you have completely enabled WAL as a storage backend. + +## Remove data directory from target server + +Temporarily moving the data directory to a different location is less destructive than deleting it. We recommend moving it in cases where you unsuccessfully enable WAL. Do not use the old data directory (`/data-dir/raft.bak`) for recovery after restarting the server. We recommend eventually deleting the old directory. + +The following example assumes the `data_dir` in the server's configuration is `/data-dir` and renames it to `/data-dir.bak`. + +```shell-session +$ mv /data-dir/raft /data-dir/raft.bak +``` + +When switching backends, you must always remove _the entire raft directory_, not just the `raft.db` file or `wal` directory. The log must always be consistent with the snapshots to avoid undefined behavior or data loss. + +## Update target server configuration + +Add the following to the target server's configuration file: + +```hcl +raft_logstore { + backend = "wal" + verification { + enabled = true + interval = "60s" + } +} +``` + +## Start target server + +Start the target server. For example, if you are using `systemd`, run the following command: + +```shell-session +$ systemctl start consul +``` + +Watch for the server to become a healthy voter again. + +```shell-session +$ consul operator raft list-peers +``` + +## Monitor target server Raft metrics and logs + +Refer to [Monitor Raft metrics and logs for WAL](/consul/docs/agent/wal-logstore/monitoring) for details. + +We recommend leaving the cluster in the test configuration for several days or weeks, as long as you observe no errors. An extended test provides more confidence that WAL operates correctly under varied workloads and during routine server restarts. If you observe any errors, end the test immediately and report them. + +If you disabled configuration management automation, consider reenabling it during the testing phase to pick up other updates for the host. You must ensure that it does not revert the Consul configuration file and remove the altered backend configuration. One way to do this is add the `raft_logstore` block to a separate file that is not managed by your automation. This file can either be added to the directory if [`-config-dir`](/consul/docs/agent/config/cli-flags#_config_dir) is used or as an additional [`-config-file`](/consul/docs/agent/config/cli-flags#_config_file) argument. + +## Next steps + +- If you observe any verification errors, performance anomalies, or other suspicious behavior from the target server during the test, you should immediately follow [the procedure to revert back to BoltDB](/consul/docs/agent/wal-logstore/revert-to-boltdb). Report failures through GitHub. + +- If you do not see errors and would like to expand the test further, you can repeat the above procedure on another target server. We suggest waiting after each test expansion and slowly rolling WAL out to other parts of your environment. Once the majority of your servers use WAL, any bugs not yet discovered may result in cluster unavailability. + +- If you wish to permanently enable WAL on all servers, repeat the steps described in this topic for each server. Even if `backend = "wal"` is set in logs, servers continue to use BoltDB if they find an existing raft.db file in the data directory. \ No newline at end of file diff --git a/website/content/docs/agent/wal-logstore/index.mdx b/website/content/docs/agent/wal-logstore/index.mdx new file mode 100644 index 00000000000..914d6602a9e --- /dev/null +++ b/website/content/docs/agent/wal-logstore/index.mdx @@ -0,0 +1,48 @@ +--- +layout: docs +page_title: WAL LogStore Backend Overview +description: >- + The experimental WAL (write-ahead log) LogStore backend shipped in Consul 1.15 is intended to replace the BoltDB backend, improving performance and log storage issues. +--- + +# Experimental WAL LogStore backend overview + +This topic provides an overview of the experimental WAL (write-ahead log) LogStore backend. + +!> **Experimental feature:** The WAL LogStore backend is experimental. + +## WAL versus BoltDB + +WAL implements a traditional log with rotating, append-only log files. WAL resolves many issues with the existing `LogStore` provided by the BoltDB backend. The BoltDB `LogStore` is a copy-on-write BTree, which is not optimized for append-only, write-heavy workloads. + +### BoltDB storage scalability issues + +The existing BoltDB log store inefficiently stores append-only logs to disk because it was designed as a full key-value database. It is a single file that only ever grows. Deleting the oldest logs, which Consul does regularly when it makes new snapshots of the state, leaves free space in the file. The free space must be tracked in a `freelist` so that BoltDB can reuse it on future writes. By contrast, a simple segmented log can delete the oldest log files from disk. + +A burst of writes at double or triple the normal volume can suddenly cause the log file to grow to several times its steady-state size. After Consul takes the next snapshot and truncates the oldest logs, the resulting file is mostly empty space. + +To track the free space, Consul must write extra metadata to disk with every write. The metadata is proportional to the amount of free pages, so after a large burst write latencies tend to increase. In some cases, the latencies cause serious performance degradation to the cluster. + +To mitigate risks associated with sudden bursts of log data, Consul tries to limit lots of logs from accumulating in the LogStore. Significantly larger BoltDB files are slower to append to because the tree is deeper and freelist larger. For this reason, Consul's default options associated with snapshots, truncating logs, and keeping the log history have been aggressively set toward keeping BoltDB small rather than using disk IO optimally. + +But the larger the file, the more likely it is to have a large freelist or suddenly form one after a burst of writes. For this reason, the many of Consul's default options asssociated with snapshots, truncating logs, and keeping the log history aggressively keep BoltDT small rather than uisng disk IO more efficiently. + +Other reliability issues, such as [raft replication capacity issues](/consul/docs/agent/telemetry#raft-replication-capacity-issues), are much simpler to solve without the performance concerns caused by storing more logs in BoltDB. + +### WAL approaches storage issues differently + +When directly measured, WAL is more performant than BoltDB because it solves a simpler storage problem. Despite this, some users may not notice a significant performance improvement from the upgrade with the same configuration and workload. In this case, the benefit of WAL is that retaining more logs does not affect write performance. As a result, strategies for reducing disk IO with slower snapshots or for keeping logs to permit slower followers to catch up with cluster state are all possible, increasing the reliability of the deployment. + +## WAL quality assurance + +The WAL backend has been tested thoroughly during development: + +- Every component in the WAL, such as [metadata management](https://github.com/hashicorp/raft-wal/blob/main/types/meta.go), [log file encoding](https://github.com/hashicorp/raft-wal/blob/main/types/segment.go) to actual [file-system interaction](https://github.com/hashicorp/raft-wal/blob/main/types/vfs.go) are abstracted so unit tests can simulate difficult-to-reproduce disk failures. + +- We used the [application-level intelligent crash explorer (ALICE)](https://github.com/hashicorp/raft-wal/blob/main/alice/README.md) to exhaustively simulate thousands of possible crash failure scenarios. WAL correctly recovered from all scenarios. + +- We ran hundreds of tests in a performance testing cluster with checksum verification enabled and did not detect data loss or corruption. We will continue testing before making WAL the default backend. + +We are aware of how complex and critical disk-persistence is for your data. + +We hope that many users at different scales will try WAL in their environments after upgrading to 1.15 or later and report success or failure so that we can confidently replace BoltDB as the default for new clusters in a future release. \ No newline at end of file diff --git a/website/content/docs/agent/wal-logstore/monitoring.mdx b/website/content/docs/agent/wal-logstore/monitoring.mdx new file mode 100644 index 00000000000..5be765cf408 --- /dev/null +++ b/website/content/docs/agent/wal-logstore/monitoring.mdx @@ -0,0 +1,85 @@ +--- +layout: docs +page_title: Monitor Raft metrics and logs for WAL +description: >- + Learn how to monitor Raft metrics emitted the experimental WAL (write-ahead log) LogStore backend shipped in Consul 1.15. +--- + +# Monitor Raft metrics and logs for WAL + +This topic describes how to monitor Raft metrics and logs if you are testing the WAL backend. We strongly recommend monitoring the Consul cluster, especially the target server, for evidence that the WAL backend is not functioning correctly. Refer to [Enable the experimental WAL LogStore backend](/consul/docs/agent/wal-logstore/index) for additional information about the WAL backend. + +!> **Upgrade warning:** The WAL LogStore backend is experimental. + +## Monitor for checksum failures + +Log store verification failures on any server, regardless of whether you are running the BoltDB or WAL backed, are unrecoverable errors. Consul may report the following errors in logs. + +### Read failures: Disk Corruption + +```log hideClipboard +2022-11-15T22:41:23.546Z [ERROR] agent.raft.logstore: verification checksum FAILED: storage corruption rangeStart=1234 rangeEnd=3456 leaderChecksum=0xc1... readChecksum=0x45... +``` + +This indicates that the server read back data that is different from what it wrote to disk. This indicates corruption in the storage backend or filesystem. + +For convenience, Consul also increments a metric `consul.raft.logstore.verifier.read_checksum_failures` when this occurs. + +### Write failures: In-flight Corruption + +The following error indicates that the checksum on the follower did not match the leader when the follower received the logs. The error implies that the corruption happened in the network or software and not the log store: + +```log hideClipboard +2022-11-15T22:41:23.546Z [ERROR] agent.raft.logstore: verification checksum FAILED: in-flight corruption rangeStart=1234 rangeEnd=3456 leaderChecksum=0xc1... followerWriteChecksum=0x45... +``` + +It is unlikely that this error indicates an issue with the storage backend, but you should take the same steps to resolve and report it. + +The `consul.raft.logstore.verifier.write_checksum_failures` metric increments when this error occurs. + +## Resolve checksum failures + +If either type of corruption is detected, complete the instructions for [reverting to BoltDB](/consul/docs/agent/wal-logstore/revert-to-boltdb). If the server already uses BoltDB, the errors likely indicate a latent bug in BoltDB or a bug in the verification code. In both cases, you should follow the revert instructions. + +Report all verification failures as a [GitHub +issue](https://github.com/hashicorp/consul/issues/new?assignees=&labels=&template=bug_report.md&title=WAL:%20Checksum%20Failure). + +In your report, include the following: + - Details of your server cluster configuration and hardware + - Logs around the failure message + - Context for how long they have been running the configuration + - Any metrics or description of the workload you have. For example, how many raft + commits per second. Also include the performance metrics described on this page. + +We recommend setting up an alert on Consul server logs containing `verification checksum FAILED` or on the `consul.raft.logstore.verifier.{read|write}_checksum_failures` metrics. The sooner you respond to a corrupt server, the lower the chance of any of the [potential risks](/consul/docs/agent/wal-logstore/enable#risks) causing problems in your cluster. + +## Performance metrics + +The key performance metrics to watch are: + +- `consul.raft.commitTime` measures the time to commit new writes on a quorum of + servers. It should be the same or lower after deploying WAL. Even if WAL is + faster for your workload and hardware, it may not be reflected in `commitTime` + until enough followers are using WAL that the leader does not have to wait for + two slower followers in a cluster of five to catch up. + +- `consul.raft.rpc.appendEntries.storeLogs` measures the time spent persisting + logs to disk on each _follower_. It should be the same or lower for + WAL-enabled followers. + +- `consul.raft.replication.appendEntries.rpc` measures the time taken for each + `AppendEntries` RPC from the leader's perspective. If this is significantly + higher than `consul.raft.rpc.appendEntries` on the follower, it indicates a + known queuing issue in the Raft library and is unrelated to the backend. + Followers with WAL enabled should not be slower than the others. You can + determine which follower is associated with which metric by running the + `consul operator raft list-peers` command and matching the + `peer_id` label value to the server IDs listed. + +- `consul.raft.compactLogs` measures the time take to truncate the logs after a + snapshot. WAL-enabled servers should not be slower than BoltDB servers. + +- `consul.raft.leader.dispatchLog` measures the time spent persisting logs to + disk on the _leader_. It is only relevant if a WAL-enabled server becomes a + leader. It should be the same or lower than before when the leader was using + BoltDB. \ No newline at end of file diff --git a/website/content/docs/agent/wal-logstore/revert-to-boltdb.mdx b/website/content/docs/agent/wal-logstore/revert-to-boltdb.mdx new file mode 100644 index 00000000000..2bd0638b7cd --- /dev/null +++ b/website/content/docs/agent/wal-logstore/revert-to-boltdb.mdx @@ -0,0 +1,76 @@ +--- +layout: docs +page_title: Revert to BoltDB +description: >- + Learn how to revert Consul to the BoltDB backend after enabled the WAL (write-ahead log) LogStore backend shipped in Consul 1.15. +--- + +# Revert storage backend to BoltDB from WAL + +This topic describes how to revert your Consul storage backend from the experimental WAL LogStore backend to the default BoltDB. + +The overall process for reverting to BoltDB consists of the following steps. Repeat the steps for all Consul servers that you need to revert. + +1. Stop target server gracefully. +1. Remove data directory from target server. +1. Update target server's configuration. +1. Start target server. + +## Stop target server gracefully + +Stop the target server gracefully. For example, if you are using `systemd`, +run the following command: + +```shell-session +$ systemctl stop consul +``` + +If your environment uses configuration management automation that might interfere with this process, such as Chef or Puppet, you must disable them until you have completely revereted the storage backend. + +## Remove data directory from target server + +Temporarily moving the data directory to a different location is less destructive than deleting it. We recommend moving the data directory instead of deleted it in cases where you unsuccessfully enable WAL. Do not use the old data directory (`/data-dir/raft.bak`) for recovery after restarting the server. We recommend eventually deleting the old directory. + +The following example assumes the `data_dir` in the server's configuration is `/data-dir` and renames it to `/data-dir.wal.bak`. + +```shell-session +$ mv /data-dir/raft /data-dir/raft.wal.bak +``` + +When switching backend, you must always remove _the entire raft directory_ not just the `raft.db` file or `wal` directory. This is because the log must always be consistent with the snapshots to avoid undefined behavior or data loss. + +## Update target server's configuration + +Modify the `backend` in the target server's configuration file: + +```hcl +raft_logstore { + backend = "boltdb" + verification { + enabled = true + interval = "60s" + } +} +``` + +## Start target server + +Start the target server. For example, if you are using `systemd`, run the following command: + +```shell-session +$ systemctl start consul +``` + +Watch for the server to become a healthy voter again. + +```shell-session +$ consul operator raft list-peers +``` + +### Clean up old data directories + +If necessary, clean up any `raft.wal.bak` directories. Replace `/data-dir` with the value you specified in your configuration file. + +```shell-session +$ rm /data-dir/raft.bak +``` \ No newline at end of file diff --git a/website/data/docs-nav-data.json b/website/data/docs-nav-data.json index 5551306536b..23cc2d5d1aa 100644 --- a/website/data/docs-nav-data.json +++ b/website/data/docs-nav-data.json @@ -873,6 +873,27 @@ "title": "RPC", "path": "agent/rpc", "hidden": true + }, + { + "title": "Experimental WAL LogStore", + "routes": [ + { + "title": "Overview", + "path": "agent/wal-logstore" + }, + { + "title": "Enable WAL LogStore backend", + "path": "agent/wal-logstore/enable" + }, + { + "title": "Monitor Raft metrics and logs for WAL", + "path": "agent/wal-logstore/monitoring" + }, + { + "title": "Revert to BoltDB", + "path": "agent/wal-logstore/revert-to-boltdb" + } + ] } ] }, From 06ff4228b415067ac5e4f542e622dd633231f068 Mon Sep 17 00:00:00 2001 From: Ella Cai Date: Mon, 27 Feb 2023 11:30:12 -0500 Subject: [PATCH 070/262] UI: Update Consul UI colors to use HDS colors (#16111) * update red color variables to hds * change background red to be one step lighter * map oranges * map greens * map blues * map greys * delete themes, colours: lemon, magenta, strawberry, and vault color aliases * add unmapped rainbow colours * replace white and transparent vars, remove unused semantic vars and frame placeholders * small tweaks to improve contrast, change node health status x/check colours for non-voters to match design doc, replace semantic colour action w hds colour * add unmapped grays, remove dark theme, manually set nav bar to use dark colours * map consul pink colour * map yellows * add unmapped oranges, delete light theme * remove readme, base variables, clean up dangling colours * Start working on the nav disclosure menus * Update main-nav-horizontal dropdowns * Format template * Update box-shadow tokens * Replace --tone- usage with tokens * Update nav disabled state and panel border colour * Replace rgb usage on tile * Fix permissions modal overlay * More fixes * Replace orange-500 with amber-200 * Update badge colors * Update vertical sidebar colors * Remove top border on consul peer list ul --------- Co-authored-by: wenincode --- .../consul/partition/selector/index.hbs | 128 ++++++------ .../components/consul/peer/components.scss | 42 ++-- .../components/consul/peer/form/index.scss | 8 +- .../app/components/anchors/index.scss | 4 +- .../app/components/anchors/skin.scss | 4 +- .../app/components/app-view/index.scss | 2 +- .../app/components/app-view/skin.scss | 8 +- .../consul-ui/app/components/app/index.scss | 2 +- .../app/components/auth-form/skin.scss | 4 +- .../app/components/auth-modal/layout.scss | 2 +- .../app/components/auth-profile/index.scss | 4 +- .../consul-ui/app/components/badge/index.scss | 4 +- .../app/components/breadcrumbs/skin.scss | 8 +- .../app/components/buttons/skin.scss | 19 +- .../consul-ui/app/components/card/skin.scss | 6 +- .../app/components/code-editor/layout.scss | 2 +- .../app/components/code-editor/skin.scss | 32 +-- .../app/components/composite-row/index.scss | 4 +- .../components/confirmation-dialog/skin.scss | 4 +- .../components/consul/auth-method/index.scss | 10 +- .../consul/discovery-chain/index.hbs | 151 +++++++------- .../consul/discovery-chain/skin.scss | 22 +- .../consul/exposed-path/list/index.scss | 2 +- .../consul/external-source/index.hbs | 2 +- .../consul/health-check/list/skin.scss | 24 +-- .../consul/instance-checks/index.scss | 8 +- .../consul/intention/components.scss | 8 +- .../consul/intention/list/skin.scss | 2 +- .../intention/permission/form/skin.scss | 2 +- .../app/components/consul/loader/skin.scss | 2 +- .../components/consul/peer/info/index.scss | 4 +- .../components/consul/server/card/skin.scss | 17 +- .../components/consul/server/list/index.scss | 4 +- .../components/consul/service/list/index.hbs | 2 +- .../consul/tomography/graph/index.scss | 18 +- .../app/components/copy-button/skin.scss | 16 +- .../app/components/copyable-code/index.scss | 14 +- .../app/components/disclosure-menu/README.mdx | 2 +- .../app/components/empty-state/skin.scss | 4 +- .../expanded-single-select/skin.scss | 6 +- .../app/components/filter-bar/skin.scss | 8 +- .../app/components/form-elements/skin.scss | 16 +- .../app/components/freetext-filter/skin.scss | 14 +- .../components/hashicorp-consul/index.scss | 16 +- .../components/horizontal-kv-list/README.mdx | 4 +- .../components/horizontal-kv-list/debug.scss | 6 +- .../app/components/icon-definition/index.scss | 12 +- .../app/components/informed-action/skin.scss | 28 +-- .../app/components/inline-alert/skin.scss | 10 +- .../app/components/inline-code/skin.scss | 6 +- .../app/components/list-collection/skin.scss | 6 +- .../app/components/list-row/skin.scss | 21 +- .../main-header-horizontal/skin.scss | 2 +- .../components/main-nav-horizontal/index.scss | 2 +- .../main-nav-horizontal/layout.scss | 2 - .../components/main-nav-horizontal/skin.scss | 16 +- .../components/main-nav-vertical/README.mdx | 2 +- .../components/main-nav-vertical/debug.scss | 2 +- .../components/main-nav-vertical/skin.scss | 60 ++++-- .../app/components/menu-panel/skin.scss | 8 +- .../app/components/modal-dialog/skin.scss | 17 +- .../components/more-popover-menu/index.scss | 8 +- .../consul-ui/app/components/notice/skin.scss | 42 ++-- .../app/components/overlay/none.scss | 4 +- .../app/components/overlay/square-tail.scss | 4 +- .../components/paged-collection/README.mdx | 4 +- .../consul-ui/app/components/panel/README.mdx | 67 ++---- .../app/components/panel/index.css.js | 10 +- .../consul-ui/app/components/panel/skin.scss | 10 +- .../app/components/peerings/badge/index.scss | 28 +-- .../app/components/popover-select/index.scss | 12 +- .../app/components/progress/skin.scss | 2 +- .../app/components/radio-card/skin.scss | 14 +- .../app/components/search-bar/index.scss | 8 +- .../app/components/skip-links/skin.scss | 6 +- .../app/components/sliding-toggle/skin.scss | 8 +- .../app/components/tab-nav/skin.scss | 12 +- .../consul-ui/app/components/table/index.scss | 6 +- .../app/components/table/layout.scss | 2 +- .../consul-ui/app/components/table/skin.scss | 10 +- .../app/components/tabular-details/skin.scss | 8 +- .../app/components/tabular-dl/skin.scss | 10 +- .../app/components/tag-list/index.scss | 2 +- .../consul-ui/app/components/tile/index.scss | 13 +- .../app/components/toggle-button/skin.scss | 4 +- .../app/components/tooltip-panel/skin.scss | 6 +- .../app/components/tooltip/index.scss | 8 +- .../topology-metrics/card/index.scss | 20 +- .../topology-metrics/popover/index.scss | 8 +- .../topology-metrics/series/skin.scss | 18 +- .../app/components/topology-metrics/skin.scss | 36 ++-- .../topology-metrics/stats/index.scss | 4 +- .../topology-metrics/status/index.scss | 4 +- .../consul-ui/app/modifiers/aria-menu.mdx | 4 +- .../consul-ui/app/modifiers/css-prop.mdx | 4 +- .../app/styles/base/color/README.mdx | 81 -------- .../app/styles/base/color/base-variables.scss | 190 ------------------ .../app/styles/base/color/hex-variables.scss | 178 ---------------- .../app/styles/base/color/index.scss | 5 - .../base/color/lemon/frame-placeholders.scss | 0 .../app/styles/base/color/lemon/index.scss | 5 - .../lemon/themes/dark-high-contrast.scss | 17 -- .../styles/base/color/lemon/themes/dark.scss | 17 -- .../lemon/themes/light-high-contrast.scss | 17 -- .../styles/base/color/lemon/themes/light.scss | 17 -- .../color/magenta/frame-placeholders.scss | 13 -- .../app/styles/base/color/magenta/index.scss | 6 - .../magenta/themes/dark-high-contrast.scss | 18 -- .../base/color/magenta/themes/dark.scss | 18 -- .../magenta/themes/light-high-contrast.scss | 18 -- .../base/color/magenta/themes/light.scss | 18 -- .../styles/base/color/semantic-variables.scss | 27 +-- .../color/strawberry/frame-placeholders.scss | 13 -- .../styles/base/color/strawberry/index.scss | 6 - .../strawberry/themes/dark-high-contrast.scss | 18 -- .../base/color/strawberry/themes/dark.scss | 18 -- .../themes/light-high-contrast.scss | 18 -- .../base/color/strawberry/themes/light.scss | 18 -- .../styles/base/color/theme-placeholders.scss | 91 --------- .../base/color/ui/frame-placeholders.scss | 174 +++++++--------- .../app/styles/base/color/ui/index.scss | 5 - .../color/ui/themes/dark-high-contrast.scss | 99 --------- .../app/styles/base/color/ui/themes/dark.scss | 99 --------- .../color/ui/themes/light-high-contrast.scss | 99 --------- .../styles/base/color/ui/themes/light.scss | 99 --------- .../base/color/vault/frame-placeholders.scss | 0 .../app/styles/base/color/vault/index.scss | 6 - .../vault/themes/dark-high-contrast.scss | 3 - .../styles/base/color/vault/themes/dark.scss | 3 - .../vault/themes/light-high-contrast.scss | 3 - .../styles/base/color/vault/themes/light.scss | 3 - .../base/decoration/base-variables.scss | 9 - .../app/styles/base/icons/README.mdx | 10 +- .../styles/base/icons/base-placeholders.scss | 10 +- .../app/styles/base/icons/icons/index.scss | 1 - .../base/icons/icons/vault/keyframes.scss | 6 +- .../app/styles/base/icons/overrides.scss | 2 +- .../app/styles/base/reset/system.scss | 9 +- ui/packages/consul-ui/app/styles/debug.scss | 21 +- ui/packages/consul-ui/app/styles/icons.scss | 20 +- ui/packages/consul-ui/app/styles/layout.scss | 1 + .../consul-ui/app/styles/layouts/index.scss | 2 +- .../app/styles/routes/dc/kv/index.scss | 2 +- .../styles/routes/dc/overview/license.scss | 10 +- .../routes/dc/overview/serverstatus.scss | 22 +- .../app/styles/routes/dc/services/index.scss | 2 +- ui/packages/consul-ui/app/styles/themes.scss | 19 +- .../consul-ui/app/styles/variables/skin.scss | 30 +-- 148 files changed, 756 insertions(+), 2111 deletions(-) delete mode 100644 ui/packages/consul-ui/app/styles/base/color/README.mdx delete mode 100644 ui/packages/consul-ui/app/styles/base/color/base-variables.scss delete mode 100644 ui/packages/consul-ui/app/styles/base/color/hex-variables.scss delete mode 100644 ui/packages/consul-ui/app/styles/base/color/lemon/frame-placeholders.scss delete mode 100644 ui/packages/consul-ui/app/styles/base/color/lemon/index.scss delete mode 100644 ui/packages/consul-ui/app/styles/base/color/lemon/themes/dark-high-contrast.scss delete mode 100644 ui/packages/consul-ui/app/styles/base/color/lemon/themes/dark.scss delete mode 100644 ui/packages/consul-ui/app/styles/base/color/lemon/themes/light-high-contrast.scss delete mode 100644 ui/packages/consul-ui/app/styles/base/color/lemon/themes/light.scss delete mode 100644 ui/packages/consul-ui/app/styles/base/color/magenta/frame-placeholders.scss delete mode 100644 ui/packages/consul-ui/app/styles/base/color/magenta/index.scss delete mode 100644 ui/packages/consul-ui/app/styles/base/color/magenta/themes/dark-high-contrast.scss delete mode 100644 ui/packages/consul-ui/app/styles/base/color/magenta/themes/dark.scss delete mode 100644 ui/packages/consul-ui/app/styles/base/color/magenta/themes/light-high-contrast.scss delete mode 100644 ui/packages/consul-ui/app/styles/base/color/magenta/themes/light.scss delete mode 100644 ui/packages/consul-ui/app/styles/base/color/strawberry/frame-placeholders.scss delete mode 100644 ui/packages/consul-ui/app/styles/base/color/strawberry/index.scss delete mode 100644 ui/packages/consul-ui/app/styles/base/color/strawberry/themes/dark-high-contrast.scss delete mode 100644 ui/packages/consul-ui/app/styles/base/color/strawberry/themes/dark.scss delete mode 100644 ui/packages/consul-ui/app/styles/base/color/strawberry/themes/light-high-contrast.scss delete mode 100644 ui/packages/consul-ui/app/styles/base/color/strawberry/themes/light.scss delete mode 100644 ui/packages/consul-ui/app/styles/base/color/theme-placeholders.scss delete mode 100644 ui/packages/consul-ui/app/styles/base/color/ui/themes/dark-high-contrast.scss delete mode 100644 ui/packages/consul-ui/app/styles/base/color/ui/themes/dark.scss delete mode 100644 ui/packages/consul-ui/app/styles/base/color/ui/themes/light-high-contrast.scss delete mode 100644 ui/packages/consul-ui/app/styles/base/color/ui/themes/light.scss delete mode 100644 ui/packages/consul-ui/app/styles/base/color/vault/frame-placeholders.scss delete mode 100644 ui/packages/consul-ui/app/styles/base/color/vault/index.scss delete mode 100644 ui/packages/consul-ui/app/styles/base/color/vault/themes/dark-high-contrast.scss delete mode 100644 ui/packages/consul-ui/app/styles/base/color/vault/themes/dark.scss delete mode 100644 ui/packages/consul-ui/app/styles/base/color/vault/themes/light-high-contrast.scss delete mode 100644 ui/packages/consul-ui/app/styles/base/color/vault/themes/light.scss diff --git a/ui/packages/consul-partitions/app/components/consul/partition/selector/index.hbs b/ui/packages/consul-partitions/app/components/consul/partition/selector/index.hbs index eae8faf0f2a..f005c6aca0b 100644 --- a/ui/packages/consul-partitions/app/components/consul/partition/selector/index.hbs +++ b/ui/packages/consul-partitions/app/components/consul/partition/selector/index.hbs @@ -1,79 +1,69 @@ {{#let - (or @partition 'default') - (is-href 'dc.partitions' @dc.Name) -as |partition isManaging|}} + (or @partition "default") + (is-href "dc.partitions" @dc.Name) + as |partition isManaging| +}} {{#if (can "choose partitions" dc=@dc)}} -
  • + - - - {{if isManaging 'Manage Partition' partition}} - - - - - {{#each menu.items as |item|}} - + {{if isManaging "Manage Partition" partition}} + + + + + {{#each menu.items as |item|}} + + - - {{item.Name}} - - - {{/each}} - - - -
  • + {{item.Name}} + + + {{/each}} + + + + {{else}} -
  • - {{'default'}} +
  • + {{"default"}}
  • {{/if}} {{/let}} diff --git a/ui/packages/consul-peerings/app/components/consul/peer/components.scss b/ui/packages/consul-peerings/app/components/consul/peer/components.scss index d4fdbe08134..aefbcc434b9 100644 --- a/ui/packages/consul-peerings/app/components/consul/peer/components.scss +++ b/ui/packages/consul-peerings/app/components/consul/peer/components.scss @@ -5,7 +5,7 @@ %pill-terminated::before, %pill-deleting::before { --icon-size: icon-000; - content: ''; + content: ""; } %pill-pending, %pill-establishing, @@ -19,58 +19,54 @@ %pill-pending::before { --icon-name: icon-running; - --icon-color: rgb(var(--tone-gray-800)); + --icon-color: var(--token-color-palette-neutral-600); } %pill-pending { - background-color: rgb(var(--tone-strawberry-050)); - color: rgb(var(--tone-strawberry-500)); + background-color: var(--token-color-consul-surface); + color: var(--token-color-consul-foreground); } %pill-establishing::before { --icon-name: icon-running; - --icon-color: rgb(var(--tone-gray-800)); + --icon-color: var(--token-color-palette-neutral-600); } %pill-establishing { - background-color: rgb(var(--tone-blue-050)); - color: rgb(var(--tone-blue-500)); + background-color: var(--token-color-palette-blue-50); + color: var(--token-color-palette-blue-200); } %pill-active::before { --icon-name: icon-check; - --icon-color: rgb(var(--tone-green-800)); + --icon-color: var(--token-color-palette-green-400); } %pill-active { - background-color: rgb(var(--tone-green-050)); - color: rgb(var(--tone-green-600)); + background-color: var(--token-color-palette-green-50); + color: var(--token-color-palette-green-200); } %pill-failing::before { --icon-name: icon-x; - --icon-color: rgb(var(--tone-red-500)); + --icon-color: var(--token-color-palette-red-200); } %pill-failing { - background-color: rgb(var(--tone-red-050)); - color: rgb(var(--tone-red-500)); + background-color: var(--token-color-palette-red-50); + color: var(--token-color-palette-red-200); } %pill-terminated::before { --icon-name: icon-x-square; - --icon-color: rgb(var(--tone-gray-800)); + --icon-color: var(--token-color-palette-neutral-600); } %pill-terminated { - background-color: rgb(var(--tone-gray-150)); - color: rgb(var(--tone-gray-800)); + background-color: var(--token-color-palette-neutral-200); + color: var(--token-color-palette-neutral-600); } - %pill-deleting::before { --icon-name: icon-loading; - --icon-color: rgb(var(--tone-green-800)); + --icon-color: var(--token-color-foreground-warning-on-surface); } %pill-deleting { - background-color: rgb(var(--tone-yellow-050)); - color: rgb(var(--tone-yellow-800)); + background-color: var(--token-color-surface-warning); + color: var(--token-color-foreground-warning-on-surface); } - - - diff --git a/ui/packages/consul-peerings/app/components/consul/peer/form/index.scss b/ui/packages/consul-peerings/app/components/consul/peer/form/index.scss index 1a3653c6828..bae0e8c738b 100644 --- a/ui/packages/consul-peerings/app/components/consul/peer/form/index.scss +++ b/ui/packages/consul-peerings/app/components/consul/peer/form/index.scss @@ -19,9 +19,9 @@ position: relative; } ol::before { - content: ''; + content: ""; border-left: var(--decor-border-100); - border-color: rgb(var(--tone-gray-300)); + border-color: var(--token-color-palette-neutral-300); height: 100%; position: absolute; left: 2rem; @@ -38,7 +38,7 @@ li::before { --icon-name: icon-hexagon; --icon-size: icon-600; - content: ''; + content: ""; position: absolute; z-index: 2; } @@ -48,7 +48,7 @@ top: 0px; font-size: 14px; font-weight: var(--typo-weight-bold); - background-color: rgb(var(--tone-gray-000)); + background-color: var(--token-color-palette-neutral-0); z-index: 1; text-align: center; } diff --git a/ui/packages/consul-ui/app/components/anchors/index.scss b/ui/packages/consul-ui/app/components/anchors/index.scss index 08d06e65ab7..4f352ca6daa 100644 --- a/ui/packages/consul-ui/app/components/anchors/index.scss +++ b/ui/packages/consul-ui/app/components/anchors/index.scss @@ -4,14 +4,14 @@ a[rel*='external']::after { margin-left: 8px; } %main-content label a[rel*='help'] { - color: rgb(var(--tone-gray-400)); + color: var(--token-color-foreground-disabled); } %main-content a[rel*='help']::after { @extend %with-info-circle-outline-icon, %as-pseudo; opacity: 0.4; } %main-content h2 a { - color: rgb(var(--tone-gray-900)); + color: var(--token-color-foreground-strong); } %main-content h2 a[rel*='help']::after { font-size: 0.65em; diff --git a/ui/packages/consul-ui/app/components/anchors/skin.scss b/ui/packages/consul-ui/app/components/anchors/skin.scss index 1181335335b..952a8a74269 100644 --- a/ui/packages/consul-ui/app/components/anchors/skin.scss +++ b/ui/packages/consul-ui/app/components/anchors/skin.scss @@ -8,7 +8,7 @@ %anchor, %anchor-intent, %anchor-active { - color: rgb(var(--color-action)); + color: var(--token-color-foreground-action); } %anchor-decoration:hover, %anchor-decoration:focus { @@ -20,7 +20,7 @@ %anchor { @extend %anchor-decoration; cursor: pointer; - background-color: var(--transparent); + background-color: transparent; } %anchor:hover, %anchor:focus { diff --git a/ui/packages/consul-ui/app/components/app-view/index.scss b/ui/packages/consul-ui/app/components/app-view/index.scss index fb561339d07..cf28adecbce 100644 --- a/ui/packages/consul-ui/app/components/app-view/index.scss +++ b/ui/packages/consul-ui/app/components/app-view/index.scss @@ -32,7 +32,7 @@ width: 26px; height: 26px; cursor: pointer; - color: rgb(var(--tone-blue-500)); + color: var(--token-color-foreground-action); } #toolbar-toggle { display: none; diff --git a/ui/packages/consul-ui/app/components/app-view/skin.scss b/ui/packages/consul-ui/app/components/app-view/skin.scss index d9c4c3d4511..293b127fac9 100644 --- a/ui/packages/consul-ui/app/components/app-view/skin.scss +++ b/ui/packages/consul-ui/app/components/app-view/skin.scss @@ -8,15 +8,15 @@ border-bottom: var(--decor-border-200); } %app-view-header h1 > em { - color: rgb(var(--tone-gray-600)); + color: var(--token-color-foreground-faint); } %app-view-header dd > a { - color: rgb(var(--tone-gray-999)); + color: var(--token-color-hashicorp-brand); } %app-view-content div > dl > dd { - color: rgb(var(--tone-gray-400)); + color: var(--token-color-foreground-disabled); } %app-view-title, %app-view-content form:not(.filter-bar) fieldset { - border-color: rgb(var(--tone-gray-200)); + border-color: var(--token-color-surface-interactive-active); } diff --git a/ui/packages/consul-ui/app/components/app/index.scss b/ui/packages/consul-ui/app/components/app/index.scss index 386687a81cf..5892387482e 100644 --- a/ui/packages/consul-ui/app/components/app/index.scss +++ b/ui/packages/consul-ui/app/components/app/index.scss @@ -80,7 +80,7 @@ main { position: fixed; z-index: 50; - color: rgb(var(--tone-gray-400)); + color: var(--token-color-foreground-disabled); font-size: var(--typo-size-800); width: 250px; diff --git a/ui/packages/consul-ui/app/components/auth-form/skin.scss b/ui/packages/consul-ui/app/components/auth-form/skin.scss index 42d6af7f9e0..9a07073bd80 100644 --- a/ui/packages/consul-ui/app/components/auth-form/skin.scss +++ b/ui/packages/consul-ui/app/components/auth-form/skin.scss @@ -1,5 +1,5 @@ %auth-form em { @extend %p3; - color: rgb(var(--tone-gray-500)); + color: var(--token-color-foreground-faint); font-style: normal; -} \ No newline at end of file +} diff --git a/ui/packages/consul-ui/app/components/auth-modal/layout.scss b/ui/packages/consul-ui/app/components/auth-modal/layout.scss index 6c0d0c137ad..ee6e8d5ee96 100644 --- a/ui/packages/consul-ui/app/components/auth-modal/layout.scss +++ b/ui/packages/consul-ui/app/components/auth-modal/layout.scss @@ -6,7 +6,7 @@ padding-right: 42px; } %auth-modal footer { - background-color: var(--transparent); + background-color: transparent; } %auth-modal > div > div > div { padding-bottom: 0; diff --git a/ui/packages/consul-ui/app/components/auth-profile/index.scss b/ui/packages/consul-ui/app/components/auth-profile/index.scss index ebc4837a35f..33208f9121b 100644 --- a/ui/packages/consul-ui/app/components/auth-profile/index.scss +++ b/ui/packages/consul-ui/app/components/auth-profile/index.scss @@ -12,8 +12,8 @@ } .auth-profile dt, .auth-profile dd { - color: rgb(var(--tone-gray-800)); + color: var(--token-color-paletter-neutral-300); } .auth-profile dt span { - color: rgb(var(--tone-gray-600)); + color: var(--token-color-foreground-faint); } diff --git a/ui/packages/consul-ui/app/components/badge/index.scss b/ui/packages/consul-ui/app/components/badge/index.scss index 22c42b3b9e6..04a5a168b73 100644 --- a/ui/packages/consul-ui/app/components/badge/index.scss +++ b/ui/packages/consul-ui/app/components/badge/index.scss @@ -8,8 +8,8 @@ %badge, %badge + dd { @extend %pill; - background-color: rgb(var(--tone-gray-100)); - color: rgb(var(--tone-gray-500)); + background-color: var(--token-color-surface-strong); + color: var(--token-color-foreground-faint); } %badge::after, %badge-reversed::after, diff --git a/ui/packages/consul-ui/app/components/breadcrumbs/skin.scss b/ui/packages/consul-ui/app/components/breadcrumbs/skin.scss index 966cf886e6f..634cfa26347 100644 --- a/ui/packages/consul-ui/app/components/breadcrumbs/skin.scss +++ b/ui/packages/consul-ui/app/components/breadcrumbs/skin.scss @@ -1,9 +1,9 @@ %crumbs { - color: rgb(var(--tone-gray-500)); + color: var(--token-color-foreground-faint); text-decoration: none; } %crumbs:hover { - color: rgb(var(--tone-blue-500)); + color: var(--token-color-foreground-action); text-decoration: underline; } %crumbs::before { @@ -11,9 +11,9 @@ } %breadcrumb-milestone::before { @extend %with-chevron-left-mask, %as-pseudo; - background-color: rgb(var(--tone-gray-500)); + background-color: var(--token-color-foreground-faint); } %breadcrumb::before { content: '/'; - color: rgb(var(--tone-gray-500)); + color: var(--token-color-foreground-faint); } diff --git a/ui/packages/consul-ui/app/components/buttons/skin.scss b/ui/packages/consul-ui/app/components/buttons/skin.scss index 2f9eaef91b3..f2c86979189 100644 --- a/ui/packages/consul-ui/app/components/buttons/skin.scss +++ b/ui/packages/consul-ui/app/components/buttons/skin.scss @@ -16,7 +16,7 @@ @extend %button; border-width: 1px; border-radius: var(--decor-radius-100); - box-shadow: var(--decor-elevation-300); + box-shadow: var(--token-elevation-high-box-shadow); } /**/ %secondary-button:hover:not(:disabled):not(:active), @@ -27,14 +27,13 @@ @extend %frame-gray-400; } %secondary-button:disabled { - color: rgb(var(--tone-gray-600)); + color: var(--token-color-foreground-faint); } %secondary-button:active { - /* %frame-gray-something */ @extend %frame-gray-700; - background-color: rgb(var(--tone-gray-200)); - color: rgb(var(--tone-gray-800)); - border-color: rgb(var(--tone-gray-700)); + background-color: var(--token-color-surface-interactive-active); + color: var(--token-color-foreground-primary); + border-color: var(--token-color-foreground-faint); } /**/ %dangerous-button { @@ -52,8 +51,8 @@ } %internal-button { - color: rgb(var(--tone-gray-900)); - background-color: rgb(var(--tone-gray-000)); + color: var(--token-color-foreground-strong); + background-color: var(--token-color-surface-primary); } %internal-button-dangerous { @extend %frame-red-300; @@ -62,7 +61,7 @@ @extend %frame-red-700; } %internal-button-intent { - background-color: rgb(var(--tone-gray-050)); + background-color: var(--token-color-surface-strong); } %internal-button:focus, %internal-button:hover { @@ -80,7 +79,7 @@ top: 0; height: 100%; margin-left: 8px; - background-color: rgb(var(--tone-gray-300)); + background-color: var(--token-color-palette-neutral-300); } %sort-button::before { @extend %with-sort-mask, %as-pseudo; diff --git a/ui/packages/consul-ui/app/components/card/skin.scss b/ui/packages/consul-ui/app/components/card/skin.scss index de730cf5bfc..4192901ac87 100644 --- a/ui/packages/consul-ui/app/components/card/skin.scss +++ b/ui/packages/consul-ui/app/components/card/skin.scss @@ -5,7 +5,7 @@ %card { border: var(--decor-border-100); border-radius: var(--decor-radius-100); - background-color: rgb(var(--tone-gray-000) / 90%); + background-color: var(--token-color-surface-faint); } %card > section, %card > ul > li { @@ -14,12 +14,12 @@ %card, %card > section, %card > ul > li { - border-color: rgb(var(--tone-gray-200)); + border-color: var(--token-color-surface-interactive-active); } %card ul { /*TODO: %list-style-none?*/ list-style-type: none; } %card-intent { - box-shadow: var(--decor-elevation-400); + box-shadow: var(--token-surface-mid-box-shadow); } diff --git a/ui/packages/consul-ui/app/components/code-editor/layout.scss b/ui/packages/consul-ui/app/components/code-editor/layout.scss index 2200042322e..e71683948e0 100644 --- a/ui/packages/consul-ui/app/components/code-editor/layout.scss +++ b/ui/packages/consul-ui/app/components/code-editor/layout.scss @@ -11,7 +11,7 @@ bottom: 0px; width: 100%; height: 25px; - background-color: rgb(var(--tone-gray-999)); + background-color: var(--token-color-hashicorp-brand); content: ''; display: block; } diff --git a/ui/packages/consul-ui/app/components/code-editor/skin.scss b/ui/packages/consul-ui/app/components/code-editor/skin.scss index 6ba316787a4..3c2089e9217 100644 --- a/ui/packages/consul-ui/app/components/code-editor/skin.scss +++ b/ui/packages/consul-ui/app/components/code-editor/skin.scss @@ -21,7 +21,7 @@ $syntax-dark-gray: #535f73; --syntax-dark-gray: #{$syntax-dark-gray}; --syntax-gutter-grey: #2a2f36; - --syntax-yellow: rgb(var(--tone-yellow-500)); + --syntax-yellow: var(--token-color-vault-brand); } .CodeMirror { max-width: 1260px; @@ -46,7 +46,7 @@ $syntax-dark-gray: #535f73; .cm-s-hashi { &.CodeMirror { width: 100%; - background-color: rgb(var(--tone-gray-999)) !important; + background-color: var(--token-color-hashicorp-brand) !important; color: #cfd2d1 !important; border: none; font-family: var(--typo-family-mono); @@ -81,7 +81,7 @@ $syntax-dark-gray: #535f73; .CodeMirror-line::-moz-selection, .CodeMirror-line > span::-moz-selection, .CodeMirror-line > span > span::-moz-selection { - background: rgb(var(--tone-gray-000) / 10%); + background: var(--token-color-surface-interactive); } span.cm-comment { @@ -158,7 +158,7 @@ $syntax-dark-gray: #535f73; .CodeMirror-matchingbracket { text-decoration: underline; - color: rgb(var(--tone-gray-000)) !important; + color: var(--token-color-surface-primary) !important; } } @@ -182,7 +182,7 @@ $syntax-dark-gray: #535f73; } span.cm-property { - color: rgb(var(--tone-gray-000)); + color: var(--token-color-surface-primary); } span.cm-variable-2 { @@ -193,32 +193,32 @@ $syntax-dark-gray: #535f73; %code-editor { .toolbar-container { - background: rgb(var(--tone-gray-050)); + background: var(--token-color-surface-strong); background: linear-gradient( 180deg, - rgb(var(--tone-gray-050)) 50%, - rgb(var(--tone-gray-150)) 100% + var(--token-color-surface-strong) 50%, + var(--token-color-surface-interactive-active) 100% ); - border: 1px solid rgb(var(--tone-gray-150)); - border-bottom-color: rgb(var(--tone-gray-600)); - border-top-color: rgb(var(--tone-gray-400)); + border: 1px solid var(--token-color-surface-interactive-active); + border-bottom-color: var(--token-color-foreground-faint); + border-top-color: var(--token-color-foreground-disabled); .toolbar { .title { - color: rgb(var(--tone-gray-900)); + color: var(--token-color-foreground-strong); font-size: 14px; font-weight: 700; } .toolbar-separator { - border-right: 1px solid rgb(var(--tone-gray-300)); + border-right: 1px solid var(--token-color-palette-neutral-300); } } .ember-power-select-trigger { - background-color: rgb(var(--tone-gray-000)); - color: rgb(var(--tone-gray-999)); + background-color: var(--token-color-surface-primary); + color: var(--token-color-hashicorp-brand); border-radius: var(--decor-radius-100); border: var(--decor-border-100); - border-color: rgb(var(--tone-gray-700)); + border-color: var(--token-color-foreground-faint); } } } diff --git a/ui/packages/consul-ui/app/components/composite-row/index.scss b/ui/packages/consul-ui/app/components/composite-row/index.scss index 1dce70e4bbd..a411dc6f542 100644 --- a/ui/packages/consul-ui/app/components/composite-row/index.scss +++ b/ui/packages/consul-ui/app/components/composite-row/index.scss @@ -56,7 +56,7 @@ overflow-x: visible !important; } .consul-intention-permission-list > ul { - border-top: 1px solid rgb(var(--tone-gray-200)); + border-top: 1px solid var(--token-color-surface-interactive-active); } .consul-service-instance-list .port dt, .consul-service-instance-list .port dt::before { @@ -108,5 +108,5 @@ %composite-row-header .policy-management dd::before, %composite-row-detail .policy-management::before { @extend %with-star-fill-mask, %as-pseudo; - --icon-color: rgb(var(--tone-brand-600)); + --icon-color: var(--token-color-consul-brand); } diff --git a/ui/packages/consul-ui/app/components/confirmation-dialog/skin.scss b/ui/packages/consul-ui/app/components/confirmation-dialog/skin.scss index ded503dcfa7..d13103f58f1 100644 --- a/ui/packages/consul-ui/app/components/confirmation-dialog/skin.scss +++ b/ui/packages/consul-ui/app/components/confirmation-dialog/skin.scss @@ -1,6 +1,6 @@ table div.with-confirmation.confirming { - background-color: rgb(var(--tone-gray-000)); + background-color: var(--token-color-surface-primary); } %confirmation-dialog-inline p { - color: rgb(var(--tone-gray-400)); + color: var(--token-color-foreground-disabled); } diff --git a/ui/packages/consul-ui/app/components/consul/auth-method/index.scss b/ui/packages/consul-ui/app/components/consul/auth-method/index.scss index beff18a6520..500168a36bd 100644 --- a/ui/packages/consul-ui/app/components/consul/auth-method/index.scss +++ b/ui/packages/consul-ui/app/components/consul/auth-method/index.scss @@ -20,14 +20,14 @@ } table { thead td { - color: rgb(var(--tone-gray-500)); + color: var(--token-color-foreground-faint); font-weight: var(--typo-weight-semibold); font-size: var(--typo-size-700); } tbody { td { font-size: var(--typo-size-600); - color: rgb(var(--tone-gray-999)); + color: var(--token-color-hashicorp-brand); } tr { cursor: default; @@ -63,7 +63,7 @@ @extend %tabular-dl; } code { - background-color: rgb(var(--tone-gray-050)); + background-color: var(--token-color-surface-strong); padding: 0 12px; } } @@ -72,7 +72,7 @@ .consul-auth-method-nspace-list { thead { td { - color: rgb(var(--tone-gray-500)) !important; + color: var(--token-color-foreground-faint) !important; font-weight: var(--typo-weight-semibold) !important; font-size: var(--typo-size-700) !important; } @@ -80,7 +80,7 @@ tbody { td { font-size: var(--typo-size-600); - color: rgb(var(--tone-gray-999)); + color: var(--token-color-hashicorp-brand); } tr { cursor: default; diff --git a/ui/packages/consul-ui/app/components/consul/discovery-chain/index.hbs b/ui/packages/consul-ui/app/components/consul/discovery-chain/index.hbs index fca6c4a23e5..d41a594d031 100644 --- a/ui/packages/consul-ui/app/components/consul/discovery-chain/index.hbs +++ b/ui/packages/consul-ui/app/components/consul/discovery-chain/index.hbs @@ -1,81 +1,82 @@ -
    +

    - {{chain.ServiceName}} Router + {{chain.ServiceName}} + Router

    -
    +
    {{#each routes as |item|}} {{/each}}
    -
    +

    Splitters

    -
    +
    {{#each (sort-by 'Name' splitters) as |item|}} {{/each}}
    -
    +

    Resolvers

    -
    +
    {{#each (sort-by 'Name' resolvers) as |item|}} {{/each}}
    @@ -83,31 +84,28 @@ {{nodes}} - {{#each routes as |item|}} {{#if item.rect}} {{#let item.rect item.NextItem.rect as |src destRect|}} - {{#let (tween-to (hash - x=destRect.x - y=(add destRect.y (div destRect.height 2)) - ) (concat item.ID)) as |dest|}} + {{#let + (tween-to (hash x=destRect.x y=(add destRect.y (div destRect.height 2))) (concat item.ID)) + as |dest| + }} - ' item.NextNode}} - d={{ - svg-curve (hash - x=dest.x - y=(sub dest.y 0) - ) src=(hash - x=src.right - y=(add src.y (div src.height 2)) - )}} - /> + ' item.NextNode}} + d={{svg-curve + (hash x=dest.x y=(sub dest.y 0)) + src=(hash x=src.right y=(add src.y (div src.height 2))) + }} + > {{/let}} {{/let}} @@ -119,27 +117,26 @@ {{#let splitter.rect as |src|}} {{#each splitter.Splits as |item index|}} {{#let item.NextItem.rect as |destRect|}} - {{#let (tween-to (hash - x=destRect.x - y=(add destRect.y (div destRect.height 2)) - ) (concat splitter.ID '-' index)) as |dest|}} + {{#let + (tween-to + (hash x=destRect.x y=(add destRect.y (div destRect.height 2))) + (concat splitter.ID '-' index) + ) + as |dest| + }} - ' item.NextNode}} - class="split" - d={{ - svg-curve (hash - x=dest.x - y=dest.y - ) src=(hash - x=src.right - y=(add src.y (div src.height 2)) - )}} - /> + ' item.NextNode}} + class='split' + d={{svg-curve + (hash x=dest.x y=dest.y) + src=(hash x=src.right y=(add src.y (div src.height 2))) + }} + > {{/let}} {{/let}} @@ -150,28 +147,28 @@ - + {{#each routes as |item|}} - {{#if (string-starts-with item.NextNode 'resolver:') }} + {{#if (string-starts-with item.NextNode 'resolver:')}} {{#let (or item.NextItem.rect (hash y=0 height=0)) as |dest|}} - + {{/let}} {{/if}} {{/each}} {{#each splitters as |item|}} - {{#each item.Splits as |item|}} - {{#let (or item.NextItem.rect (hash y=0 height=0)) as |dest|}} - - {{/let}} - {{/each}} + {{#each item.Splits as |item|}} + {{#let (or item.NextItem.rect (hash y=0 height=0)) as |dest|}} + + {{/let}} + {{/each}} {{/each}} - + {{#each routes as |item|}} - {{#if (string-starts-with item.NextNode 'splitter:') }} + {{#if (string-starts-with item.NextNode 'splitter:')}} {{#let (or item.NextItem.rect (hash y=0 height=0)) as |dest|}} - + {{/let}} {{/if}} {{/each}} diff --git a/ui/packages/consul-ui/app/components/consul/discovery-chain/skin.scss b/ui/packages/consul-ui/app/components/consul/discovery-chain/skin.scss index f99e29173fc..897a242ef23 100644 --- a/ui/packages/consul-ui/app/components/consul/discovery-chain/skin.scss +++ b/ui/packages/consul-ui/app/components/consul/discovery-chain/skin.scss @@ -19,7 +19,7 @@ transition-property: stroke; fill: none; - stroke: rgb(var(--tone-gray-400)); + stroke: var(--token-color-foreground-disabled); stroke-width: 2; vector-effect: non-scaling-stroke; } @@ -30,18 +30,18 @@ } %chain-node, %chain-node a { - color: rgb(var(--tone-gray-900)) !important; + color: var(--token-color-foreground-strong) !important; } %discovery-chain-edge-active { - stroke: rgb(var(--tone-gray-900)); + stroke: var(--token-color-foreground-strong); } %chain-group { border-radius: var(--decor-radius-100); border: 1px solid; /* TODO: If this color is combined with the above */ /* border property then the compressor removes the color */ - border-color: rgb(var(--tone-gray-200)); - background-color: rgb(var(--tone-gray-100)); + border-color: var(--token-color-surface-interactive-active); + background-color: var(--token-color-surface-strong); pointer-events: none; } @@ -66,8 +66,8 @@ } %chain-node-active { opacity: 1; - background-color: rgb(var(--tone-gray-000)); - border-color: rgb(var(--tone-gray-500)); + background-color: var(--token-color-surface-primary); + border-color: var(--token-color-foreground-faint); } /* TODO: More text truncation, centralize */ %route-card header:not(.short) dd { @@ -105,16 +105,16 @@ /**/ %with-chain-outlet::before { @extend %as-pseudo; - background-color: rgb(var(--tone-gray-000)); + background-color: var(--token-color-surface-primary); border-radius: var(--decor-radius-full); border: 2px solid; /* TODO: If this color is combined with the above */ /* border property then the compressor removes the color */ - border-color: rgb(var(--tone-gray-400)); + border-color: var(--token-color-foreground-disabled); } %discovery-chain circle { stroke-width: 2; - stroke: rgb(var(--tone-gray-400)); - fill: rgb(var(--tone-gray-000)); + stroke: var(--token-color-foreground-disabled); + fill: var(--token-color-surface-primary); } diff --git a/ui/packages/consul-ui/app/components/consul/exposed-path/list/index.scss b/ui/packages/consul-ui/app/components/consul/exposed-path/list/index.scss index 15a5f170f1a..0926f7fe47a 100644 --- a/ui/packages/consul-ui/app/components/consul/exposed-path/list/index.scss +++ b/ui/packages/consul-ui/app/components/consul/exposed-path/list/index.scss @@ -1,6 +1,6 @@ .consul-exposed-path-list { > ul { - border-top: 1px solid rgb(var(--tone-gray-200)); + border-top: 1px solid var(--token-color-surface-interactive-active); } > ul > li { @extend %composite-row; diff --git a/ui/packages/consul-ui/app/components/consul/external-source/index.hbs b/ui/packages/consul-ui/app/components/consul/external-source/index.hbs index 19d33a8ab6c..21f158ba403 100644 --- a/ui/packages/consul-ui/app/components/consul/external-source/index.hbs +++ b/ui/packages/consul-ui/app/components/consul/external-source/index.hbs @@ -36,7 +36,7 @@ class="consul-external-source" ...attributes > - + {{#if @label}} {{@label}} {{else}} diff --git a/ui/packages/consul-ui/app/components/consul/health-check/list/skin.scss b/ui/packages/consul-ui/app/components/consul/health-check/list/skin.scss index 17b3ad7b0e7..dfd7141ea2e 100644 --- a/ui/packages/consul-ui/app/components/consul/health-check/list/skin.scss +++ b/ui/packages/consul-ui/app/components/consul/health-check/list/skin.scss @@ -19,7 +19,7 @@ } %healthcheck-output dd em { @extend %pill; - background-color: rgb(var(--tone-gray-100)); + background-color: var(--token-color-surface-strong); /*TODO: Should this be merged into %pill? */ cursor: default; font-style: normal; @@ -28,41 +28,41 @@ } %healthcheck-output.passing::before { @extend %with-check-circle-fill-mask; - color: rgb(var(--tone-green-500)); + color: var(--token-color-foreground-success); } %healthcheck-output.warning::before { @extend %with-alert-triangle-mask; - color: rgb(var(--tone-orange-500)); + color: var(--token-color-foreground-warning); } %healthcheck-output.critical::before { @extend %with-cancel-square-fill-mask; - color: rgb(var(--tone-red-500)); + color: var(--token-color-foreground-critical); } %healthcheck-output, %healthcheck-output pre { border-radius: var(--decor-radius-100); } %healthcheck-output dd:first-of-type { - color: rgb(var(--tone-gray-400)); + color: var(--token-color-foreground-disabled); } %healthcheck-output pre { - background-color: rgb(var(--tone-gray-050)); - color: rgb(var(--tone-gray-600)); + background-color: var(--token-color-surface-strong); + color: var(--token-color-foreground-faint); } %healthcheck-output { /* TODO: this should be a frame-gray */ - color: rgb(var(--tone-gray-900)); - border-color: rgb(var(--tone-gray-200)); + color: var(--token-color-foreground-strong); + border-color: var(--token-color-surface-interactive-active); border-style: solid; border-left-width: 4px; } %healthcheck-output.passing { - border-left-color: rgb(var(--tone-green-500)); + border-left-color: var(--token-color-foreground-success); } %healthcheck-output.warning { - border-left-color: rgb(var(--tone-yellow-500)); + border-left-color: var(--token-color-vault-brand); } %healthcheck-output.critical { - border-left-color: rgb(var(--tone-red-500)); + border-left-color: var(--token-color-foreground-critical); } diff --git a/ui/packages/consul-ui/app/components/consul/instance-checks/index.scss b/ui/packages/consul-ui/app/components/consul/instance-checks/index.scss index d97fe7b1f3e..602f951068c 100644 --- a/ui/packages/consul-ui/app/components/consul/instance-checks/index.scss +++ b/ui/packages/consul-ui/app/components/consul/instance-checks/index.scss @@ -7,18 +7,18 @@ } &.passing dt::before { @extend %with-check-circle-fill-mask; - color: rgb(var(--tone-green-500)); + color: var(--token-color-foreground-success); } &.warning dt::before { @extend %with-alert-triangle-mask; - color: rgb(var(--tone-orange-500)); + color: var(--token-color-foreground-warning); } &.critical dt::before { @extend %with-cancel-square-fill-mask; - color: rgb(var(--tone-red-500)); + color: var(--token-color-foreground-critical); } &.empty dt::before { @extend %with-minus-square-fill-mask; - color: rgb(var(--tone-gray-500)); + color: var(--token-color-foreground-faint); } } diff --git a/ui/packages/consul-ui/app/components/consul/intention/components.scss b/ui/packages/consul-ui/app/components/consul/intention/components.scss index ed98c849947..12bcdb31b46 100644 --- a/ui/packages/consul-ui/app/components/consul/intention/components.scss +++ b/ui/packages/consul-ui/app/components/consul/intention/components.scss @@ -11,12 +11,12 @@ font-size: var(--typo-size-600); } %pill-allow { - color: rgb(var(--tone-green-800)); - background-color: rgb(var(--tone-green-100)); + color: var(--token-color-foreground-success-on-surface); + background-color: var(--token-color-border-success); } %pill-deny { - color: rgb(var(--tone-red-800)); - background-color: rgb(var(--tone-red-100)); + color: var(--token-color-foreground-critical-on-surface); + background-color: var(--token-color-border-critical); } %pill-l7 { @extend %frame-gray-900; diff --git a/ui/packages/consul-ui/app/components/consul/intention/list/skin.scss b/ui/packages/consul-ui/app/components/consul/intention/list/skin.scss index 8a66540e89a..05d9ebcd3e3 100644 --- a/ui/packages/consul-ui/app/components/consul/intention/list/skin.scss +++ b/ui/packages/consul-ui/app/components/consul/intention/list/skin.scss @@ -1,5 +1,5 @@ %consul-intention-list td.permissions { - color: rgb(var(--tone-blue-500)); + color: var(--token-color-foreground-action); } %consul-intention-list em { --word-spacing: 0.25rem; diff --git a/ui/packages/consul-ui/app/components/consul/intention/permission/form/skin.scss b/ui/packages/consul-ui/app/components/consul/intention/permission/form/skin.scss index 1085802d4e9..292532f9d62 100644 --- a/ui/packages/consul-ui/app/components/consul/intention/permission/form/skin.scss +++ b/ui/packages/consul-ui/app/components/consul/intention/permission/form/skin.scss @@ -1,6 +1,6 @@ .consul-intention-permission-form { h2 { - border-top: 1px solid rgb(var(--tone-blue-500)); + border-top: 1px solid var(--token-color-foreground-action); @extend %h200; } button.type-submit { diff --git a/ui/packages/consul-ui/app/components/consul/loader/skin.scss b/ui/packages/consul-ui/app/components/consul/loader/skin.scss index a7a7f432201..ce4ceed2b04 100644 --- a/ui/packages/consul-ui/app/components/consul/loader/skin.scss +++ b/ui/packages/consul-ui/app/components/consul/loader/skin.scss @@ -1,5 +1,5 @@ %loader circle { - fill: rgb(var(--tone-brand-100)); + fill: var(--token-color-consul-gradient-faint-stop); } %loader circle { animation: loader-animation 1.5s infinite ease-in-out; diff --git a/ui/packages/consul-ui/app/components/consul/peer/info/index.scss b/ui/packages/consul-ui/app/components/consul/peer/info/index.scss index a9d57b1635a..1c1d15d14a4 100644 --- a/ui/packages/consul-ui/app/components/consul/peer/info/index.scss +++ b/ui/packages/consul-ui/app/components/consul/peer/info/index.scss @@ -1,6 +1,6 @@ .consul-peer-info { - background: rgb(var(--gray-100)); - color: rgb(var(--gray-600)); + background: var(--token-color-surface-faint); + color: var(--token-color-foreground-faint); padding: 0px 8px; border-radius: 2px; diff --git a/ui/packages/consul-ui/app/components/consul/server/card/skin.scss b/ui/packages/consul-ui/app/components/consul/server/card/skin.scss index 1478ac3face..e841794a2e9 100644 --- a/ui/packages/consul-ui/app/components/consul/server/card/skin.scss +++ b/ui/packages/consul-ui/app/components/consul/server/card/skin.scss @@ -6,7 +6,7 @@ } %consul-server-card .name + dd { @extend %h300; - color: rgb(var(--tone-gray-999)); + color: var(--token-color-hashicorp-brand); animation-name: typo-truncate; } %consul-server-card .health-status + dd { @@ -14,16 +14,16 @@ font-size: var(--typo-size-700); } %consul-server-card.voting-status-non-voter .health-status + dd { - background-color: rgb(var(--tone-gray-100)); - color: rgb(var(--tone-gray-600)); + background-color: var(--token-color-surface-strong); + color: var(--token-color-foreground-faint); } %consul-server-card:not(.voting-status-non-voter) .health-status.healthy + dd { - background-color: rgb(var(--tone-green-050)); - color: rgb(var(--tone-green-800)); + background-color: var(--token-color-surface-success); + color: var(--token-color-palette-green-400); } %consul-server-card:not(.voting-status-non-voter) .health-status:not(.healthy) + dd { - background-color: rgb(var(--tone-red-050)); - color: rgb(var(--tone-red-500)); + background-color: var(--token-color-surface-critical); + color: var(--token-color-foreground-critical); } %consul-server-card .health-status + dd::before { --icon-size: icon-000; @@ -31,10 +31,7 @@ } %consul-server-card .health-status.healthy + dd::before { --icon-name: icon-check; - --icon-color: rgb(var(--tone-green-800)); } %consul-server-card .health-status:not(.healthy) + dd::before { --icon-name: icon-x; - --icon-color: rgb(var(--tone-red-500)); } - diff --git a/ui/packages/consul-ui/app/components/consul/server/list/index.scss b/ui/packages/consul-ui/app/components/consul/server/list/index.scss index 0ec7a33ec4c..c3c3e5a8523 100644 --- a/ui/packages/consul-ui/app/components/consul/server/list/index.scss +++ b/ui/packages/consul-ui/app/components/consul/server/list/index.scss @@ -9,6 +9,6 @@ } %consul-server-list a:hover div { - box-shadow: var(--decor-elevation-800); - --tone-border: var(--tone-gray-500); + box-shadow: var(--token-elevation-overlay-box-shadow); + --tone-border: var(--token-color-foreground-faint); } diff --git a/ui/packages/consul-ui/app/components/consul/service/list/index.hbs b/ui/packages/consul-ui/app/components/consul/service/list/index.hbs index 7991a112430..ae06f4e477a 100644 --- a/ui/packages/consul-ui/app/components/consul/service/list/index.hbs +++ b/ui/packages/consul-ui/app/components/consul/service/list/index.hbs @@ -86,4 +86,4 @@ {{/if}} - \ No newline at end of file + diff --git a/ui/packages/consul-ui/app/components/consul/tomography/graph/index.scss b/ui/packages/consul-ui/app/components/consul/tomography/graph/index.scss index 2cb37451976..93fae93eb2a 100644 --- a/ui/packages/consul-ui/app/components/consul/tomography/graph/index.scss +++ b/ui/packages/consul-ui/app/components/consul/tomography/graph/index.scss @@ -1,36 +1,36 @@ .tomography-graph { .background { - fill: rgb(var(--tone-gray-050)); + fill: var(--token-color-surface-strong); } .axis { fill: none; - stroke: rgb(var(--tone-gray-300)); + stroke: var(--token-color-palette-neutral-300); stroke-dasharray: 4 4; } .border { fill: none; - stroke: rgb(var(--tone-gray-300)); + stroke: var(--token-color-palette-neutral-300); } .point { - stroke: rgb(var(--tone-gray-400)); - fill: rgb(var(--tone-magenta-600)); + stroke: var(--token-color-foreground-disabled); + fill: var(--token-color-consul-foreground); } .lines rect { - fill: rgb(var(--tone-magenta-600)); + fill: var(--token-color-consul-foreground); stroke: transparent; stroke-width: 5px; } .lines rect:hover { - fill: rgb(var(--tone-gray-300)); + fill: var(--token-color-palette-neutral-300); height: 3px; y: -1px; } .tick line { - stroke: rgb(var(--tone-gray-300)); + stroke: var(--token-color-palette-neutral-300); } .tick text { font-size: var(--typo-size-600); text-anchor: start; - color: rgb(var(--tone-gray-900)); + color: var(--token-color-foreground-strong); } } diff --git a/ui/packages/consul-ui/app/components/copy-button/skin.scss b/ui/packages/consul-ui/app/components/copy-button/skin.scss index 89988852c3b..18864ed7414 100644 --- a/ui/packages/consul-ui/app/components/copy-button/skin.scss +++ b/ui/packages/consul-ui/app/components/copy-button/skin.scss @@ -1,22 +1,22 @@ %copy-button { - color: rgb(var(--tone-blue-500)); - --icon-color: var(--transparent); + color: var(--token-color-foreground-action); + --icon-color: transparent; } %copy-button::before { @extend %with-copy-action-mask, %as-pseudo; - --icon-color: rgb(var(--tone-gray-500)); + --icon-color: var(--token-color-foreground-faint); } %copy-button::after { - --icon-color: rgb(var(--tone-gray-050)); + --icon-color: var(--token-color-surface-strong); } %copy-button:hover:not(:disabled):not(:active), %copy-button:focus { - color: rgb(var(--tone-blue-500)); - --icon-color: rgb(var(--tone-gray-050)); + color: var(--token-color-foreground-action); + --icon-color: var(--token-color-surface-strong); } %copy-button:hover::before { - --icon-color: rgb(var(--tone-blue-500)); + --icon-color: var(--token-color-foreground-action); } %copy-button:active { - --icon-color: rgb(var(--tone-gray-200)); + --icon-color: var(--token-color-surface-interactive-active); } diff --git a/ui/packages/consul-ui/app/components/copyable-code/index.scss b/ui/packages/consul-ui/app/components/copyable-code/index.scss index 7fcf8211937..a0eb5f3a6bf 100644 --- a/ui/packages/consul-ui/app/components/copyable-code/index.scss +++ b/ui/packages/consul-ui/app/components/copyable-code/index.scss @@ -8,7 +8,7 @@ padding-bottom: 3px; border: var(--decor-border-100); - border-color: rgb(var(--tone-gray-200)); + border-color: var(--token-color-surface-interactive-active); border-radius: var(--decor-radius-200); } &.obfuscated { @@ -22,7 +22,7 @@ height: 100%; display: block; content: ''; - background-color: rgb(var(--tone-gray-050)); + background-color: var(--token-color-surface-strong); } .copy-button { position: absolute; @@ -45,12 +45,12 @@ button[aria-expanded]::before { content: ''; --icon-size: icon-000; - --icon-color: rgb(var(--tone-gray-500)); + --icon-color: var(--token-color-foreground-faint); } - button[aria-expanded=true]::before { + button[aria-expanded='true']::before { --icon-name: icon-eye-off; } - button[aria-expanded=false]::before { + button[aria-expanded='false']::before { --icon-name: icon-eye; } pre { @@ -67,7 +67,7 @@ margin: 0; margin-top: 8px; margin-bottom: 13px; - border: 3px dashed rgb(var(--tone-gray-300)); - background-color: rgb(var(--tone-gray-000)); + border: 3px dashed var(--token-color-palette-neutral-300); + background-color: var(--token-color-surface-primary); } } diff --git a/ui/packages/consul-ui/app/components/disclosure-menu/README.mdx b/ui/packages/consul-ui/app/components/disclosure-menu/README.mdx index 9817282a8b8..dc8d9b3e2b1 100644 --- a/ui/packages/consul-ui/app/components/disclosure-menu/README.mdx +++ b/ui/packages/consul-ui/app/components/disclosure-menu/README.mdx @@ -44,7 +44,7 @@ common usecase of having a floating menu. diff --git a/ui/packages/consul-ui/app/components/empty-state/skin.scss b/ui/packages/consul-ui/app/components/empty-state/skin.scss index 22d9fcae4c2..20583b42264 100644 --- a/ui/packages/consul-ui/app/components/empty-state/skin.scss +++ b/ui/packages/consul-ui/app/components/empty-state/skin.scss @@ -1,6 +1,6 @@ %empty-state { - color: rgb(var(--tone-gray-500)); - background-color: rgb(var(--tone-gray-010)); + color: var(--token-color-foreground-faint); + background-color: var(--token-color-surface-faint); } %empty-state-header { border-bottom: none; diff --git a/ui/packages/consul-ui/app/components/expanded-single-select/skin.scss b/ui/packages/consul-ui/app/components/expanded-single-select/skin.scss index 76c2f471964..d6a33d0d536 100644 --- a/ui/packages/consul-ui/app/components/expanded-single-select/skin.scss +++ b/ui/packages/consul-ui/app/components/expanded-single-select/skin.scss @@ -1,6 +1,6 @@ %expanded-single-select { border: var(--decor-border-100); - border-color: rgb(var(--tone-gray-300)); + border-color: var(--token-color-palette-neutral-300); border-radius: var(--decor-radius-100); } %expanded-single-select label { @@ -9,10 +9,10 @@ %expanded-single-select input[type='radio']:checked + *, %expanded-single-select input[type='radio']:hover + *, %expanded-single-select input[type='radio']:focus + * { - box-shadow: var(--decor-elevation-300); + box-shadow: var(--token-elevation-high-box-shadow); } %expanded-single-select input[type='radio']:checked + *, %expanded-single-select input[type='radio']:hover + *, %expanded-single-select input[type='radio']:focus + * { - background-color: rgb(var(--tone-gray-000)); + background-color: var(--token-color-surface-primary); } diff --git a/ui/packages/consul-ui/app/components/filter-bar/skin.scss b/ui/packages/consul-ui/app/components/filter-bar/skin.scss index ba9429903c0..ce5a1e93af7 100644 --- a/ui/packages/consul-ui/app/components/filter-bar/skin.scss +++ b/ui/packages/consul-ui/app/components/filter-bar/skin.scss @@ -1,14 +1,14 @@ .filter-bar { & { - background-color: rgb(var(--tone-gray-010)); + background-color: var(--token-color-foreground-high-contrast); border-bottom: var(--decor-border-100); - border-color: rgb(var(--tone-gray-200)); + border-color: var(--token-color-surface-interactive-active); } .filters, .sort { .popover-menu > [type='checkbox']:checked + label button { - color: rgb(var(--tone-blue-500)); - background-color: rgb(var(--tone-gray-100)); + color: var(--token-color-foreground-action); + background-color: var(--token-color-foreground-high-contrast); } } } diff --git a/ui/packages/consul-ui/app/components/form-elements/skin.scss b/ui/packages/consul-ui/app/components/form-elements/skin.scss index 8528e121d88..1c2dcff297b 100644 --- a/ui/packages/consul-ui/app/components/form-elements/skin.scss +++ b/ui/packages/consul-ui/app/components/form-elements/skin.scss @@ -1,7 +1,7 @@ %form-element-text-input { -moz-appearance: none; -webkit-appearance: none; - box-shadow: inset var(--decor-elevation-100); + box-shadow: var(--token-surface-inset-box-shadow); border-radius: var(--decor-radius-100); border: var(--decor-border-100); outline: none; @@ -14,22 +14,22 @@ textarea:disabled + .CodeMirror, %form fieldset > p, %form-element-note, %form-element-text-input::placeholder { - color: rgb(var(--tone-gray-400)); + color: var(--token-color-foreground-disabled); } %form-element-error > input, %form-element-error > textarea { - border-color: var(--decor-error-500, rgb(var(--tone-red-500))) !important; + border-color: var(--decor-error, var(--token-color-foreground-critical)) !important; } %form-element-text-input { - color: rgb(var(--tone-gray-500)); - border-color: rgb(var(--tone-gray-300)); + color: var(--token-color-foreground-faint); + border-color: var(--token-color-palette-neutral-300); } %form-element-text-input-hover { - border-color: rgb(var(--tone-gray-500)); + border-color: var(--token-color-foreground-faint); } %form-element-text-input-focus { - border-color: var(--typo-action-500, rgb(var(--tone-blue-500))); + border-color: var(--typo-action, var(--token-color-foreground-action)); } %form-element-label { - color: var(--typo-contrast-999, inherit); + color: var(--typo-contrast, inherit); } diff --git a/ui/packages/consul-ui/app/components/freetext-filter/skin.scss b/ui/packages/consul-ui/app/components/freetext-filter/skin.scss index c26ea34d9c6..e78a30837a8 100644 --- a/ui/packages/consul-ui/app/components/freetext-filter/skin.scss +++ b/ui/packages/consul-ui/app/components/freetext-filter/skin.scss @@ -3,13 +3,13 @@ border: var(--decor-border-100); border-radius: var(--decor-radius-100); - background-color: rgb(var(--tone-gray-000)); - border-color: rgb(var(--tone-gray-200)); - color: rgb(var(--tone-gray-400)); + background-color: var(--token-color-surface-primary); + border-color: var(--token-color-surface-interactive-active); + color: var(--token-color-foreground-disabled); } &:hover, &:hover * { - border-color: rgb(var(--tone-gray-400)); + border-color: var(--token-color-foreground-disabled); } & *, &_input::placeholder { @@ -35,14 +35,14 @@ margin-top: -8px; } .popover-menu { - background-color: rgb(var(--tone-gray-050)); - color: rgb(var(--tone-gray-800)); + background-color: var(--token-color-surface-strong); + color: var(--token-color-foreground-primary); } .popover-menu { border-left: 1px solid; border-color: inherit; } .popover-menu > [type='checkbox']:checked + label button { - background-color: rgb(var(--tone-gray-200)); + background-color: var(--token-color-surface-interactive-active); } } diff --git a/ui/packages/consul-ui/app/components/hashicorp-consul/index.scss b/ui/packages/consul-ui/app/components/hashicorp-consul/index.scss index fe989b06ca0..78e376ae6d6 100644 --- a/ui/packages/consul-ui/app/components/hashicorp-consul/index.scss +++ b/ui/packages/consul-ui/app/components/hashicorp-consul/index.scss @@ -5,8 +5,10 @@ .dcs-message { padding: 8px 12px; - border-bottom: 1px solid rgb(var(--tone-gray-400)); + border-bottom: 1px solid var(--token-color-foreground-disabled); max-width: fit-content; + background-color: var(--token-color-hashicorp-brand); + color: var(--token-color-palette-neutral-300); } } nav .dcs li.is-primary span, @@ -14,15 +16,15 @@ @extend %menu-panel-badge; } nav .dcs .dc-name { - color: rgb(var(--tone-gray-600)); + color: var(--token-color-foreground-faint); padding: 3.25px 0px; - font-weight: var(--typo-weight-semibold) + font-weight: var(--typo-weight-semibold); } nav .dcs .dc-name span { @extend %pill-200; margin-left: 1rem; - background-color: rgb(var(--tone-gray-300)); - color: rgb(var(--tone-gray-999)); + background-color: var(--token-color-palette-neutral-300); + color: var(--token-color-hashicorp-brand); } nav li.partitions, nav li.nspaces { @@ -42,7 +44,7 @@ } [role='banner'] a svg { - fill: rgb(var(--tone-brand-600)); + fill: var(--token-color-consul-brand); } .docs-link a::after { @extend %with-docs-mask, %as-pseudo; @@ -55,7 +57,7 @@ } .acls-separator span { @extend %led-icon; - color: rgb(var(--tone-red-500)); + color: var(--token-color-foreground-critical); display: inline-block; position: relative; top: 2px; diff --git a/ui/packages/consul-ui/app/components/horizontal-kv-list/README.mdx b/ui/packages/consul-ui/app/components/horizontal-kv-list/README.mdx index 2cf875988d0..1def2a4b51d 100644 --- a/ui/packages/consul-ui/app/components/horizontal-kv-list/README.mdx +++ b/ui/packages/consul-ui/app/components/horizontal-kv-list/README.mdx @@ -202,11 +202,11 @@ dl { } .lock-delay::before { @extend %with-delay-mask, %as-pseudo; - color: rgb(var(--tone-gray-700)); + color: var(--token-color-foreground-faint); } .ttl::before { @extend %with-history-mask, %as-pseudo; - color: rgb(var(--tone-blue-500)); + color: var(--token-color-foreground-action); } .service-identity { @extend %badge; diff --git a/ui/packages/consul-ui/app/components/horizontal-kv-list/debug.scss b/ui/packages/consul-ui/app/components/horizontal-kv-list/debug.scss index 22efa4535dc..01c1650e326 100644 --- a/ui/packages/consul-ui/app/components/horizontal-kv-list/debug.scss +++ b/ui/packages/consul-ui/app/components/horizontal-kv-list/debug.scss @@ -1,14 +1,14 @@ -[id^=docfy-demo-preview-horizontal-kv-list] { +[id^='docfy-demo-preview-horizontal-kv-list'] { dl { @extend %horizontal-kv-list; } .lock-delay::before { @extend %with-delay-mask, %as-pseudo; - color: rgb(var(--tone-gray-700)); + color: var(--token-color-foreground-faint); } .ttl::before { @extend %with-history-mask, %as-pseudo; - color: rgb(var(--tone-blue-500)); + color: var(--token-color-foreground-action); } .service-identity { @extend %badge; diff --git a/ui/packages/consul-ui/app/components/icon-definition/index.scss b/ui/packages/consul-ui/app/components/icon-definition/index.scss index 262412ef229..4d3a5d3b538 100644 --- a/ui/packages/consul-ui/app/components/icon-definition/index.scss +++ b/ui/packages/consul-ui/app/components/icon-definition/index.scss @@ -8,32 +8,32 @@ %icon-definition.passing dt::before, %composite-row-header .passing dd::before { @extend %with-check-circle-fill-mask, %as-pseudo; - color: rgb(var(--tone-green-500)); + color: var(--token-color-foreground-success); } %icon-definition.warning dt::before, %composite-row-header .warning dd::before { @extend %with-alert-triangle-mask, %as-pseudo; - color: rgb(var(--tone-orange-500)); + color: var(--token-color-foreground-warning); } %icon-definition.critical dt::before, %composite-row-header .critical dd::before { @extend %with-cancel-square-fill-mask, %as-pseudo; - color: rgb(var(--tone-red-500)); + color: var(--token-color-foreground-critical); } %icon-definition.empty dt::before, %composite-row-header .empty dd::before { @extend %with-minus-square-fill-mask, %as-pseudo; - color: rgb(var(--tone-gray-500)); + color: var(--token-color-foreground-faint); } %icon-definition.unknown dt::before, %composite-row-header .unknown dd::before { @extend %with-help-circle-outline-mask, %as-pseudo; - color: rgb(var(--tone-gray-500)); + color: var(--token-color-foreground-faint); } %composite-row-header [rel='me'] dd::before { @extend %with-check-circle-fill-mask, %as-pseudo; - color: rgb(var(--tone-blue-500)); + color: var(--token-color-foreground-action); } %icon-definition.node dt::before { diff --git a/ui/packages/consul-ui/app/components/informed-action/skin.scss b/ui/packages/consul-ui/app/components/informed-action/skin.scss index 25b7fba8d8e..b9dc0875d77 100644 --- a/ui/packages/consul-ui/app/components/informed-action/skin.scss +++ b/ui/packages/consul-ui/app/components/informed-action/skin.scss @@ -2,8 +2,8 @@ & { border-radius: var(--decor-radius-200); border: var(--decor-border-100); - border-color: rgb(var(--tone-gray-300)); - background-color: rgb(var(--tone-gray-000)); + border-color: var(--token-color-palette-neutral-300); + background-color: var(--token-color-surface-primary); } > div { border-top-left-radius: var(--decor-radius-200); @@ -18,57 +18,57 @@ } p { @extend %p2; - color: rgb(var(--tone-gray-999)); + color: var(--token-color-hashicorp-brand); } > ul { list-style: none; } > ul > li > *:hover, > ul > li > *:focus { - background-color: rgb(var(--tone-gray-100)); + background-color: var(--token-color-surface-strong); } /* variants */ &.info { header { - color: rgb(var(--tone-blue-700)); + color: var(--token-color-foreground-action-active); } header::before { @extend %with-info-circle-fill-mask, %as-pseudo; - background-color: rgb(var(--tone-blue-500)); + background-color: var(--token-color-foreground-action); margin-right: 5px; } > div { - background-color: rgb(var(--tone-blue-010)); + background-color: var(--token-color-surface-action); } } &.dangerous { header { - color: rgb(var(--tone-red-700)); + color: var(--token-color-palette-red-400); } header::before { @extend %with-alert-triangle-mask, %as-pseudo; - background-color: rgb(var(--tone-red-500)); + background-color: var(--token-color-foreground-critical); } > div { - background-color: rgb(var(--tone-red-010)); + background-color: var(--token-color-surface-critical); } } &.warning { header { - color: rgb(var(--tone-orange-700)); + color: var(--token-color-foreground-warning-on-surface); } header::before { @extend %with-alert-triangle-mask, %as-pseudo; - background-color: rgb(var(--tone-yellow-500)); + background-color: var(--token-color-vault-brand); margin-right: 5px; } > div { - background-color: rgb(var(--tone-yellow-050)); + background-color: var(--token-color-vault-gradient-faint-start); } } /**/ > ul > .action > * { - color: rgb(var(--tone-blue-500)); + color: var(--token-color-foreground-action); } > ul > .dangerous > * { @extend %frame-red-300; diff --git a/ui/packages/consul-ui/app/components/inline-alert/skin.scss b/ui/packages/consul-ui/app/components/inline-alert/skin.scss index a2bf0d9826e..40bd1665034 100644 --- a/ui/packages/consul-ui/app/components/inline-alert/skin.scss +++ b/ui/packages/consul-ui/app/components/inline-alert/skin.scss @@ -12,7 +12,7 @@ color: inherit; } %inline-alert-error { - color: rgb(var(--color-failure)); + color: var(--token-color-foreground-critical); } %inline-alert::before { font-size: 14px; @@ -22,15 +22,15 @@ } %inline-alert-success::before { @extend %with-check-circle-fill-mask; - color: rgb(var(--tone-green-500)); + color: var(--token-color-foreground-success); } %inline-alert-error::before { @extend %with-cancel-square-fill-mask; - color: rgb(var(--tone-red-500)); + color: var(--token-color-foreground-critical); } %inline-alert-warning::before { @extend %with-alert-triangle-mask; - color: rgb(var(--tone-orange-500)); + color: var(--token-color-foreground-warning); /* the warning triangle always looks */ /* too low just because its a triangle */ /* this tweak make it look better */ @@ -38,5 +38,5 @@ } %inline-alert-info::before { @extend %with-info-circle-fill-mask; - color: rgb(var(--tone-blue-500)); + color: var(--token-color-foreground-action); } diff --git a/ui/packages/consul-ui/app/components/inline-code/skin.scss b/ui/packages/consul-ui/app/components/inline-code/skin.scss index 3fb061925ae..72da1b34823 100644 --- a/ui/packages/consul-ui/app/components/inline-code/skin.scss +++ b/ui/packages/consul-ui/app/components/inline-code/skin.scss @@ -1,7 +1,7 @@ %block-code, %inline-code { border: 1px solid; - color: rgb(var(--tone-brand-600)); - background-color: rgb(var(--tone-gray-050)); - border-color: rgb(var(--tone-gray-200)); + color: var(--token-color-consul-brand); + background-color: var(--token-color-surface-strong); + border-color: var(--token-color-surface-interactive-active); } diff --git a/ui/packages/consul-ui/app/components/list-collection/skin.scss b/ui/packages/consul-ui/app/components/list-collection/skin.scss index e6e1632c492..5da7bfb15ca 100644 --- a/ui/packages/consul-ui/app/components/list-collection/skin.scss +++ b/ui/packages/consul-ui/app/components/list-collection/skin.scss @@ -1,11 +1,11 @@ %list-collection > ul { border-top: 1px solid; - border-color: rgb(var(--tone-gray-200)); + border-color: var(--token-color-surface-interactive-active); } %list-collection-partial-button { cursor: pointer; - background-color: rgb(var(--tone-gray-050)); - color: rgb(var(--tone-blue-500)); + background-color: var(--token-color-surface-strong); + color: var(--token-color-foreground-action); } %list-collection-partial-button::after { @extend %with-chevron-up-mask, %as-pseudo; diff --git a/ui/packages/consul-ui/app/components/list-row/skin.scss b/ui/packages/consul-ui/app/components/list-row/skin.scss index 654e6e8947c..9f71af4074f 100644 --- a/ui/packages/consul-ui/app/components/list-row/skin.scss +++ b/ui/packages/consul-ui/app/components/list-row/skin.scss @@ -1,31 +1,30 @@ %list-row { list-style-type: none; border: var(--decor-border-100); - border-top-color: var(--transparent); - border-bottom-color: rgb(var(--tone-gray-200)); - border-right-color: var(--transparent); - border-left-color: var(--transparent); + border-top-color: transparent; + border-bottom-color: var(--token-color-surface-interactive-active); + border-right-color: transparent; + border-left-color: transparent; } %list-row-intent { - border-color: rgb(var(--tone-gray-200)); - /*TODO: This should use a shared/CSS prop shadow*/ - box-shadow: 0 2px 4px rgb(var(--black) / 10%); - border-top-color: var(--transparent); + border-color: var(--token-color-surface-interactive-active); + box-shadow: var(--token-elevation-high-box-shadow); + border-top-color: transparent; cursor: pointer; } %list-row-header { - color: rgb(var(--tone-gray-999)); + color: var(--token-color-hashicorp-brand); } %list-row-header * { color: inherit; } %list-row-detail { - color: rgb(var(--tone-gray-500)); + color: var(--token-color-foreground-faint); } %list-row-detail a { color: inherit; } %list-row-detail a:hover { - color: rgb(var(--color-action)); + color: var(--token-color-foreground-action); text-decoration: underline; } diff --git a/ui/packages/consul-ui/app/components/main-header-horizontal/skin.scss b/ui/packages/consul-ui/app/components/main-header-horizontal/skin.scss index 2b789d42e34..bfb5178e054 100644 --- a/ui/packages/consul-ui/app/components/main-header-horizontal/skin.scss +++ b/ui/packages/consul-ui/app/components/main-header-horizontal/skin.scss @@ -1,3 +1,3 @@ %main-header-horizontal::before { - background-color: rgb(var(--tone-gray-000)); + background-color: var(--token-color-hashicorp-brand); } diff --git a/ui/packages/consul-ui/app/components/main-nav-horizontal/index.scss b/ui/packages/consul-ui/app/components/main-nav-horizontal/index.scss index bcc7a01b372..6ebed8a7dab 100644 --- a/ui/packages/consul-ui/app/components/main-nav-horizontal/index.scss +++ b/ui/packages/consul-ui/app/components/main-nav-horizontal/index.scss @@ -26,6 +26,6 @@ /**/ /* menu-panels in the main navigation are treated slightly differently */ -%main-nav-horizontal label + div { +%main-nav-horizontal .disclosure-menu button + * { @extend %main-nav-horizontal-menu-panel; } diff --git a/ui/packages/consul-ui/app/components/main-nav-horizontal/layout.scss b/ui/packages/consul-ui/app/components/main-nav-horizontal/layout.scss index ba9a3027fd3..c8fb07dd6a9 100644 --- a/ui/packages/consul-ui/app/components/main-nav-horizontal/layout.scss +++ b/ui/packages/consul-ui/app/components/main-nav-horizontal/layout.scss @@ -16,8 +16,6 @@ %main-nav-horizontal-menu-panel { z-index: 400; /* TODO: We should probably make menu-panel default to left hand side*/ - left: 0; - right: auto; top: 28px !important; } %main-nav-horizontal-action { diff --git a/ui/packages/consul-ui/app/components/main-nav-horizontal/skin.scss b/ui/packages/consul-ui/app/components/main-nav-horizontal/skin.scss index ab564cbb047..8dbf1ce63ed 100644 --- a/ui/packages/consul-ui/app/components/main-nav-horizontal/skin.scss +++ b/ui/packages/consul-ui/app/components/main-nav-horizontal/skin.scss @@ -13,18 +13,28 @@ transform: scaleY(-100%); } +%main-nav-horizontal-menu-panel, +%main-nav-horizontal-menu-panel > ul[role='menu'], +%main-nav-horizontal-menu-panel > ul[role='menu'] > li > [role='menuitem'] { + background-color: var(--token-color-hashicorp-brand); + color: var(--token-color-palette-neutral-300); +} + +%main-nav-horizontal-menu-panel > ul[role='menu'] > li > [role='menuitem']:hover { + background-color: var(--token-color-palette-neutral-600); +} + %main-nav-horizontal-toggle { display: none; } %main-nav-horizontal-toggle-button::before { --icon-name: icon-menu; - --icon-color: rgb(var(--tone-gray-800)); + --icon-color: var(--token-color-palette-neutral-300); content: ''; cursor: pointer; } %main-nav-horizontal-action, %main-nav-horizontal-action-intent, %main-nav-horizontal-action-active { - color: rgb(var(--tone-gray-600)); + color: var(--token-color-palette-neutral-300); } -/**/ diff --git a/ui/packages/consul-ui/app/components/main-nav-vertical/README.mdx b/ui/packages/consul-ui/app/components/main-nav-vertical/README.mdx index 12039d3bb45..a079e76e412 100644 --- a/ui/packages/consul-ui/app/components/main-nav-vertical/README.mdx +++ b/ui/packages/consul-ui/app/components/main-nav-vertical/README.mdx @@ -65,7 +65,7 @@ you need to define a different ancestor for a containing block you can use /* a transform is required to mark this element as the containing block */ /* for hoisting, otherwise the viewport is the containing block */ transform: translate(0, 0); - background-color: rgb(var(--tone-gray-600)); + background-color: var(--token-color-foreground-faint); padding-top: 64px; } ``` diff --git a/ui/packages/consul-ui/app/components/main-nav-vertical/debug.scss b/ui/packages/consul-ui/app/components/main-nav-vertical/debug.scss index 8d8a8e3a348..8f25d328224 100644 --- a/ui/packages/consul-ui/app/components/main-nav-vertical/debug.scss +++ b/ui/packages/consul-ui/app/components/main-nav-vertical/debug.scss @@ -15,7 +15,7 @@ /* a transform is required to mark this element as the containing block */ /* for hoisting, otherwise the viewport is the containing block */ transform: translate(0, 0); - background-color: rgb(var(--tone-gray-600)); + background-color: var(--token-color-foreground-faint); padding-top: 64px; } // TODO: Reduce the need for these debug overrides diff --git a/ui/packages/consul-ui/app/components/main-nav-vertical/skin.scss b/ui/packages/consul-ui/app/components/main-nav-vertical/skin.scss index e1930d8bf72..4564ff17a5c 100644 --- a/ui/packages/consul-ui/app/components/main-nav-vertical/skin.scss +++ b/ui/packages/consul-ui/app/components/main-nav-vertical/skin.scss @@ -2,7 +2,7 @@ @extend %p1; cursor: pointer; border-right: var(--decor-border-400); - border-color: var(--transparent); + border-color: transparent; } %main-nav-vertical-action > a { color: inherit; @@ -20,29 +20,31 @@ text-decoration: none; } %main-nav-vertical { - background-color: rgb(var(--tone-gray-050)); - color: rgb(var(--tone-gray-700)); + background-color: var(--token-color-foreground-strong); + color: var(--token-color-foreground-faint); } %main-nav-vertical li:not([role='separator']) > span { - color: rgb(var(--tone-gray-300)); + color: var(--token-color-palette-neutral-300); } -%main-nav-vertical [role='separator'] { - color: rgb(var(--tone-gray-600)); +%main-nav-vertical [role='separator'], +%main-nav-vertical-hoisted [role='separator'] { + color: var(--token-color-palette-neutral-400); + background-color: var(--token-color-foreground-strong); } %main-nav-vertical-action { - color: rgb(var(--tone-gray-800)); + color: var(--token-color-palette-neutral-300); } %main-nav-vertical-item, %main-nav-vertical-action-intent, %main-nav-vertical-action-active { - color: rgb(var(--tone-gray-999)); + color: var(--token-color-palette-neutral-0); } %main-nav-vertical-action-active { - background-color: rgb(var(--tone-gray-150)); - border-color: rgb(var(--tone-gray-999)); + background-color: var(--token-color-palette-neutral-500); + border-color: var(--token-color-palette-neutral-0); } %main-nav-vertical [aria-label]::before { - color: rgb(var(--tone-gray-700)); + color: var(--token-color-palette-neutral-400); content: attr(aria-label); display: block; margin-top: -0.5rem; @@ -50,18 +52,42 @@ } %main-nav-vertical-popover-menu-trigger { border: var(--decor-border-100); - border-color: rgb(var(--tone-gray-500)); + border-color: var(--token-color-foreground-faint); border-radius: var(--decor-radius-100); font-weight: inherit; - background-color: rgb(var(--tone-gray-050)); - color: rgb(var(--tone-gray-999)); + background-color: var(--token-color-foreground-strong); + color: var(--token-color-palette-neutral-200); +} + +%main-nav-vertical-popover-menu-trigger:hover, +%main-nav-vertical-popover-menu-trigger:focus { + color: var(--token-color-palette-neutral-300); + background-color: var(--token-color-foreground-strong); +} + +%main-nav-vertical ul[role='menu'] li a[role='menuitem'] { + color: var(--token-color-palette-neutral-300); + background-color: var(--token-color-foreground-strong); +} + +%main-nav-vertical ul[role='menu']li a[role='menuitem']:hover { + background-color: var(--token-color-palette-neutral-600); } + %main-nav-vertical-popover-menu-trigger[aria-expanded='true'] { border-bottom-left-radius: var(--decor-radius-000); border-bottom-right-radius: var(--decor-radius-000); } + +%main-nav-horizontal %panel, +%main-nav-horizontal %panel-separator, +%main-nav-vertical %panel, +%main-nav-vertical %panel-separator { + border-color: var(--token-color-foreground-faint); +} + %main-nav-vertical-popover-menu-trigger::after { @extend %with-chevron-down-mask, %as-pseudo; width: 16px; @@ -75,4 +101,10 @@ border-top-left-radius: var(--decor-radius-000); border-top-right-radius: var(--decor-radius-000); border-top: var(--decor-border-000); + color: var(--token-color-palette-neutral-300); + background-color: var(--token-color-foreground-strong); +} + +%main-nav-vertical-hoisted ul[role='menu'] { + background-color: var(--token-color-hashicorp-brand); } diff --git a/ui/packages/consul-ui/app/components/menu-panel/skin.scss b/ui/packages/consul-ui/app/components/menu-panel/skin.scss index e1aa9075131..e47b2df0f4b 100644 --- a/ui/packages/consul-ui/app/components/menu-panel/skin.scss +++ b/ui/packages/consul-ui/app/components/menu-panel/skin.scss @@ -6,7 +6,7 @@ } %menu-panel-header + ul { border-top: var(--decor-border-100); - border-color: rgb(var(--tone-border, var(--tone-gray-300))); + border-color: var(--token-form--base-border-color-default); } /* if the first item is a separator and it */ /* contains text don't add a line */ @@ -17,15 +17,15 @@ @extend %p3; text-transform: uppercase; font-weight: var(--typo-weight-medium); - color: rgb(var(--tone-gray-600)); + color: var(--token-color-foreground-faint); } %menu-panel-item { list-style-type: none; } %menu-panel-badge { @extend %pill; - color: rgb(var(--tone-gray-000)); - background-color: rgb(var(--tone-gray-500)); + color: var(--token-color-surface-primary); + background-color: var(--token-color-foreground-faint); } %menu-panel-body .informed-action { border: 0 !important; diff --git a/ui/packages/consul-ui/app/components/modal-dialog/skin.scss b/ui/packages/consul-ui/app/components/modal-dialog/skin.scss index f22a2111165..92e7e5e45d1 100644 --- a/ui/packages/consul-ui/app/components/modal-dialog/skin.scss +++ b/ui/packages/consul-ui/app/components/modal-dialog/skin.scss @@ -1,7 +1,7 @@ %modal-dialog.warning header { - background-color: rgb(var(--tone-yellow-050)); - border-color: rgb(var(--tone-yellow-500)); - color: rgb(var(--tone-yellow-800)); + background-color: var(--token-color-vault-gradient-faint-start); + border-color: var(--token-color-vault-brand); + color: var(--token-color-vault-foreground); } %modal-dialog.warning header > *:not(label) { font-size: var(--typo-size-500); @@ -9,20 +9,21 @@ } %modal-dialog.warning header::before { @extend %with-alert-triangle-mask, %as-pseudo; - color: rgb(var(--tone-yellow-500)); + color: var(--token-color-vault-brand); float: left; margin-top: 2px; margin-right: 3px; } %modal-dialog-overlay { - background-color: rgb(var(--tone-gray-000) / 90%); + background-color: var(--token-color-surface-interactive); + opacity: 0.9; } %modal-window { - box-shadow: var(--decor-elevation-800); + box-shadow: var(--token-elevation-overlay-box-shadow); } %modal-window { /*%frame-gray-000*/ - background-color: rgb(var(--tone-gray-000)); + background-color: var(--token-color-surface-primary); } %modal-window > footer, %modal-window > header { @@ -35,7 +36,7 @@ .modal-dialog-body, %modal-window > footer, %modal-window > header { - border-color: rgb(var(--tone-gray-300)); + border-color: var(--token-color-palette-neutral-300); } .modal-dialog-body { border-style: solid; diff --git a/ui/packages/consul-ui/app/components/more-popover-menu/index.scss b/ui/packages/consul-ui/app/components/more-popover-menu/index.scss index 7b7f419cc45..808bde12bd1 100644 --- a/ui/packages/consul-ui/app/components/more-popover-menu/index.scss +++ b/ui/packages/consul-ui/app/components/more-popover-menu/index.scss @@ -14,7 +14,7 @@ padding: 7px; } %more-popover-menu-trigger > * { - background-color: var(--transparent); + background-color: transparent; border-radius: var(--decor-radius-100); width: 30px; height: 30px; @@ -22,7 +22,7 @@ } %more-popover-menu-trigger > *::after { --icon-name: icon-more-horizontal; - --icon-color: rgb(var(--tone-gray-900)); + --icon-color: var(--token-color-foreground-strong); --icon-size: icon-300; content: ''; position: absolute; @@ -32,9 +32,9 @@ margin-left: -8px; } %more-popover-menu-trigger > *:active { - background-color: rgb(var(--tone-gray-100)); + background-color: var(--token-color-surface-strong); } %more-popover-menu-trigger > *:hover, %more-popover-menu-trigger > *:focus { - background-color: rgb(var(--tone-gray-050)); + background-color: var(--token-color-surface-strong); } diff --git a/ui/packages/consul-ui/app/components/notice/skin.scss b/ui/packages/consul-ui/app/components/notice/skin.scss index 3ecae0e8678..b8c2dc4dca9 100644 --- a/ui/packages/consul-ui/app/components/notice/skin.scss +++ b/ui/packages/consul-ui/app/components/notice/skin.scss @@ -1,7 +1,7 @@ %notice { border-radius: var(--decor-radius-100); border: var(--decor-border-100); - color: rgb(var(--tone-gray-999)); + color: var(--token-color-hashicorp-brand); } %notice::before { @extend %as-pseudo; @@ -21,57 +21,57 @@ @extend %notice; } %notice-success { - background-color: rgb(var(--tone-green-050)); - border-color: rgb(var(--tone-green-500)); + background-color: var(--token-color-surface-success); + border-color: var(--token-color-foreground-success); } %notice-success header * { - color: rgb(var(--tone-green-800)); + color: var(--token-color-palette-green-400); } %notice-info { - border-color: rgb(var(--tone-blue-100)); - background-color: rgb(var(--tone-blue-010)); + border-color: var(--token-color-border-action); + background-color: var(--token-color-surface-action); } %notice-info header * { - color: rgb(var(--tone-blue-700)); + color: var(--token-color-foreground-action-active); } %notice-highlight { - background-color: rgb(var(--tone-gray-050)); - border-color: rgb(var(--tone-gray-300)); + background-color: var(--token-color-surface-strong); + border-color: var(--token-color-palette-neutral-300); } %notice-info header * { - color: rgb(var(--tone-blue-700)); + color: var(--token-color-foreground-action-active); } %notice-warning { - border-color: rgb(var(--tone-yellow-100)); - background-color: rgb(var(--tone-yellow-050)); + border-color: var(--token-color-vault-border); + background-color: var(--token-color-vault-gradient-faint-start); } %notice-warning header * { - color: rgb(var(--tone-yellow-800)); + color: var(--token-color-vault-foreground); } %notice-error { - background-color: rgb(var(--tone-red-050)); - border-color: rgb(var(--tone-red-500)); + background-color: var(--token-color-surface-critical); + border-color: var(--token-color-foreground-critical); } %notice-error header * { - color: rgb(var(--tone-red-500)); + color: var(--token-color-foreground-critical); } %notice-success::before { @extend %with-check-circle-fill-mask; - color: rgb(var(--tone-green-500)); + color: var(--token-color-foreground-success); } %notice-info::before { @extend %with-info-circle-fill-mask; - color: rgb(var(--tone-blue-500)); + color: var(--token-color-foreground-action); } %notice-highlight::before { @extend %with-star-fill-mask; - color: rgb(var(--tone-yellow-500)); + color: var(--token-color-vault-brand); } %notice-warning::before { @extend %with-alert-triangle-mask; - color: rgb(var(--tone-orange-500)); + color: var(--token-color-foreground-warning); } %notice-error::before { @extend %with-cancel-square-fill-mask; - color: rgb(var(--tone-red-500)); + color: var(--token-color-foreground-critical); } diff --git a/ui/packages/consul-ui/app/components/overlay/none.scss b/ui/packages/consul-ui/app/components/overlay/none.scss index 951343b7703..3baccd8ae5f 100644 --- a/ui/packages/consul-ui/app/components/overlay/none.scss +++ b/ui/packages/consul-ui/app/components/overlay/none.scss @@ -26,9 +26,9 @@ transition-timing-function: cubic-bezier(0.54, 1.5, 0.38, 1.11); } & { - background-color: rgb(var(--tone-gray-000)); + background-color: var(--token-color-surface-primary); border-radius: var(--decor-radius-100); - box-shadow: var(--decor-elevation-400); + box-shadow: var(--token-surface-mid-box-shadow); } .tippy-arrow { @extend %overlay-tail; diff --git a/ui/packages/consul-ui/app/components/overlay/square-tail.scss b/ui/packages/consul-ui/app/components/overlay/square-tail.scss index 286ababa3ae..c99480aeb03 100644 --- a/ui/packages/consul-ui/app/components/overlay/square-tail.scss +++ b/ui/packages/consul-ui/app/components/overlay/square-tail.scss @@ -4,11 +4,11 @@ left: calc(0px - (var(--size) / 2)) !important; } .tippy-arrow::before { - background-color: rgb(var(--tone-gray-000)); + background-color: var(--token-color-surface-primary); width: calc(1px + var(--size)); height: calc(1px + var(--size)); border: var(--decor-border-100); - border-color: rgb(var(--tone-gray-300)); + border-color: var(--token-color-palette-neutral-300); } // potential icon .tippy-arrow::after { diff --git a/ui/packages/consul-ui/app/components/paged-collection/README.mdx b/ui/packages/consul-ui/app/components/paged-collection/README.mdx index c50b393b973..0572b48f8e2 100644 --- a/ui/packages/consul-ui/app/components/paged-collection/README.mdx +++ b/ui/packages/consul-ui/app/components/paged-collection/README.mdx @@ -29,7 +29,7 @@ A renderless component to act as a helper for different types of pagination. as |pager|>
    {{item.Node}} diff --git a/ui/packages/consul-ui/app/components/panel/README.mdx b/ui/packages/consul-ui/app/components/panel/README.mdx index 21f9590ec35..b2d9e9cf922 100644 --- a/ui/packages/consul-ui/app/components/panel/README.mdx +++ b/ui/packages/consul-ui/app/components/panel/README.mdx @@ -12,17 +12,10 @@ properties available to help maintain consistency within the panel. below is only for illustrative purposes. Please use this CSS component as a building block for other CSS instead. - ```hbs preview-template
    Panel with no padding (in dark mode)
    -
    +

    Some text purposefully with no padding

    @@ -34,34 +27,21 @@ building block for other CSS instead.
    Panel using inherited padding for consistency
    -
    +
    Full Width Button -
    +

    Some text with padding


    -
    +

    Along with a separator ^ again with padding

    @@ -69,45 +49,34 @@ building block for other CSS instead.
    Panel using larger padding and different color borders
    Full Width Button -
    +

    Some text with padding


    -
    +

    Along with a separator ^ again with padding

    ``` - ```css .panel { @extend %panel; @@ -119,8 +88,8 @@ building block for other CSS instead. ## CSS Properties -| Property | Type | Default | Description | -| --- | --- | --- | --- | -| `--tone-border` | `color` | --tone-gray-300 | Default color for all borders | -| `--padding-x` | `length` | 14px | Default x padding to be used for padding values within the component | -| `--padding-y` | `length` | 14px | Default y padding to be used for padding values within the component | +| Property | Type | Default | Description | +| --------------- | -------- | --------------------------------- | -------------------------------------------------------------------- | +| `--tone-border` | `color` | --token-color-palette-neutral-300 | Default color for all borders | +| `--padding-x` | `length` | 14px | Default x padding to be used for padding values within the component | +| `--padding-y` | `length` | 14px | Default y padding to be used for padding values within the component | diff --git a/ui/packages/consul-ui/app/components/panel/index.css.js b/ui/packages/consul-ui/app/components/panel/index.css.js index 68179f056c4..795a3f25115 100644 --- a/ui/packages/consul-ui/app/components/panel/index.css.js +++ b/ui/packages/consul-ui/app/components/panel/index.css.js @@ -11,21 +11,21 @@ export default (css) => css` } .panel { - --tone-border: var(--tone-gray-300); + --tone-border: var(--token-color-palette-neutral-300); border: var(--decor-border-100); border-radius: var(--decor-radius-200); - box-shadow: var(--decor-elevation-600); + box-shadow: var(--token-surface-high-box-shadow); } .panel-separator { border: 0; border-top: var(--decor-border-100); } .panel { - color: rgb(var(--tone-gray-900)); - background-color: rgb(var(--tone-gray-000)); + color: var(--token-color-foreground-strong); + background-color: var(--token-color-surface-primary); } .panel, .panel-separator { - border-color: rgb(var(--tone-border)); + border-color: var(--tone-border); } `; diff --git a/ui/packages/consul-ui/app/components/panel/skin.scss b/ui/packages/consul-ui/app/components/panel/skin.scss index 30d859a97e9..23f09151f72 100644 --- a/ui/packages/consul-ui/app/components/panel/skin.scss +++ b/ui/packages/consul-ui/app/components/panel/skin.scss @@ -1,17 +1,17 @@ %panel { - --tone-border: var(--tone-gray-300); + --tone-border: var(--token-color-palette-neutral-300); border: var(--decor-border-100); border-radius: var(--decor-radius-200); - box-shadow: var(--decor-elevation-600); + box-shadow: var(--token-surface-high-box-shadow); } %panel-separator { border-top: var(--decor-border-100); } %panel { - color: rgb(var(--tone-gray-900)); - background-color: rgb(var(--tone-gray-000)); + color: var(--token-color-foreground-strong); + background-color: var(--token-color-surface-primary); } %panel, %panel-separator { - border-color: rgb(var(--tone-border)); + border-color: var(--tone-border); } diff --git a/ui/packages/consul-ui/app/components/peerings/badge/index.scss b/ui/packages/consul-ui/app/components/peerings/badge/index.scss index e61a222229b..5a79ae19c98 100644 --- a/ui/packages/consul-ui/app/components/peerings/badge/index.scss +++ b/ui/packages/consul-ui/app/components/peerings/badge/index.scss @@ -7,32 +7,32 @@ gap: 4px; &.active { - background: rgb(var(--tone-green-050)); - color: rgb(var(--tone-green-600)); + background: var(--token-color-surface-success); + color: var(--token-color-foreground-success); } &.pending { - background: rgb(var(--tone-strawberry-050)); - color: rgb(var(--tone-strawberry-500)); + background: var(--token-color-consul-surface); + color: var(--token-color-consul-brand); } &.establishing { - background: rgb(var(--tone-blue-050)); - color: rgb(var(--tone-blue-500)); + background: var(--token-color-surface-action); + color: var(--token-color-foreground-action); } &.failing { - background: rgb(var(--tone-red-050)); - color: rgb(var(--tone-red-500)); + background: var(--token-color-surface-critical); + color: var(--token-color-foreground-critical); } &.deleting { - background: rgb(var(--tone-yellow-050)); - color: rgb(var(--tone-yellow-800)); + background: var(--token-color-surface-warning); + color: var(--token-color-foreground-warning-on-surface); } &.terminated { - background: rgb(var(--tone-gray-150)); - color: rgb(var(--tone-gray-800)); + background: var(--token-color-surface-interactive-active); + color: var(--token-color-foreground-primary); } &.undefined { - background: rgb(var(--tone-gray-150)); - color: rgb(var(--tone-gray-800)); + background: var(--token-color-surface-interactive-active); + color: var(--token-color-foreground-primary); } .peerings-badge__text { diff --git a/ui/packages/consul-ui/app/components/popover-select/index.scss b/ui/packages/consul-ui/app/components/popover-select/index.scss index ac455554340..01f38ae5c6a 100644 --- a/ui/packages/consul-ui/app/components/popover-select/index.scss +++ b/ui/packages/consul-ui/app/components/popover-select/index.scss @@ -28,23 +28,23 @@ /* even their own search bar sub menu components */ %popover-select .value-passing button::before { @extend %with-check-circle-fill-mask, %as-pseudo; - color: rgb(var(--tone-green-500)); + color: var(--token-color-foreground-success); } %popover-select .value-warning button::before { @extend %with-alert-triangle-mask, %as-pseudo; - color: rgb(var(--tone-orange-500)); + color: var(--token-color-foreground-warning); } %popover-select .value-critical button::before { @extend %with-cancel-square-fill-mask, %as-pseudo; - color: rgb(var(--tone-red-500)); + color: var(--token-color-foreground-critical); } %popover-select .value-empty button::before { @extend %with-minus-square-fill-mask, %as-pseudo; - color: rgb(var(--tone-gray-400)); + color: var(--token-color-foreground-disabled); } %popover-select .value-unknown button::before { @extend %with-help-circle-outline-mask, %as-pseudo; - color: rgb(var(--tone-gray-500)); + color: var(--token-color-foreground-faint); } %popover-select.type-source li:not(.partition) button { text-transform: capitalize; @@ -54,7 +54,7 @@ } %popover-select.type-source li.partition button::before { @extend %with-user-team-mask, %as-pseudo; - color: rgb(var(--tone-gray-500)); + color: var(--token-color-foreground-faint); } %popover-select .jwt button::before { @extend %with-logo-jwt-color-icon, %as-pseudo; diff --git a/ui/packages/consul-ui/app/components/progress/skin.scss b/ui/packages/consul-ui/app/components/progress/skin.scss index fb9f433d0bc..07411cf0bbe 100644 --- a/ui/packages/consul-ui/app/components/progress/skin.scss +++ b/ui/packages/consul-ui/app/components/progress/skin.scss @@ -5,7 +5,7 @@ justify-content: center; --icon-size: icon-700; /* 24px */ --icon-name: var(--icon-loading); - --icon-color: rgb(var(--tone-gray-500)); + --icon-color: var(--token-color-foreground-faint); } %progress-indeterminate::before { content: ''; diff --git a/ui/packages/consul-ui/app/components/radio-card/skin.scss b/ui/packages/consul-ui/app/components/radio-card/skin.scss index 03320aa5e69..2350c740d3e 100644 --- a/ui/packages/consul-ui/app/components/radio-card/skin.scss +++ b/ui/packages/consul-ui/app/components/radio-card/skin.scss @@ -1,25 +1,25 @@ %radio-card { border: var(--decor-border-100); border-radius: var(--decor-radius-100); - border-color: rgb(var(--tone-gray-200)); - box-shadow: var(--decor-elevation-400); - color: rgb(var(--tone-gray-500)); + border-color: var(--token-color-surface-interactive-active); + box-shadow: var(--token-surface-mid-box-shadow); + color: var(--token-color-foreground-faint); cursor: pointer; } %radio-card.checked { - border-color: rgb(var(--tone-blue-500)); + border-color: var(--token-color-foreground-action); } %radio-card > :first-child { - background-color: rgb(var(--tone-gray-050)); + background-color: var(--token-color-surface-strong); } %radio-card.checked > :first-child { - background-color: rgb(var(--tone-blue-050)); + background-color: var(--token-color-surface-action); } %radio-card header { margin-bottom: 0.5em; } %radio-card header { - color: rgb(var(--tone-gray-999)); + color: var(--token-color-hashicorp-brand); } %radio-card-with-icon > :last-child { padding-left: 47px; diff --git a/ui/packages/consul-ui/app/components/search-bar/index.scss b/ui/packages/consul-ui/app/components/search-bar/index.scss index 99ec3cff0f8..e0f52145bbc 100644 --- a/ui/packages/consul-ui/app/components/search-bar/index.scss +++ b/ui/packages/consul-ui/app/components/search-bar/index.scss @@ -2,7 +2,7 @@ &-status { & { border-bottom: var(--decor-border-100); - border-bottom-color: rgb(var(--tone-gray-200)); + border-bottom-color: var(--token-color-surface-interactive-active); } .remove-all button { @extend %anchor; @@ -11,15 +11,15 @@ & { @extend %pill-200; border: var(--decor-border-100); - border-color: rgb(var(--tone-gray-200)); - color: rgb(var(--tone-gray-600)); + border-color: var(--token-color-surface-interactive-active); + color: var(--token-color-foreground-faint); } button { cursor: pointer; } button::before { @extend %with-cancel-plain-mask, %as-pseudo; - color: rgb(var(--tone-gray-600)); + color: var(--token-color-foreground-faint); margin-top: 1px; margin-right: 0.2rem; } diff --git a/ui/packages/consul-ui/app/components/skip-links/skin.scss b/ui/packages/consul-ui/app/components/skip-links/skin.scss index 808731d8d54..630bbde3692 100644 --- a/ui/packages/consul-ui/app/components/skip-links/skin.scss +++ b/ui/packages/consul-ui/app/components/skip-links/skin.scss @@ -1,7 +1,7 @@ %skip-links { - outline: 1px solid rgb(var(--tone-gray-000)); - color: rgb(var(--tone-gray-000)); - background-color: rgb(var(--tone-blue-500)); + outline: 1px solid var(--token-color-surface-primary); + color: var(--token-color-surface-primary); + background-color: var(--token-color-foreground-action); } %skip-links button, %skip-links a { diff --git a/ui/packages/consul-ui/app/components/sliding-toggle/skin.scss b/ui/packages/consul-ui/app/components/sliding-toggle/skin.scss index 6a3e38cf773..2d5327dc6a6 100644 --- a/ui/packages/consul-ui/app/components/sliding-toggle/skin.scss +++ b/ui/packages/consul-ui/app/components/sliding-toggle/skin.scss @@ -15,16 +15,16 @@ @extend %sliding-toggle-negative; } %sliding-toggle label span { - color: rgb(var(--tone-gray-900)); + color: var(--token-color-foreground-strong); } %sliding-toggle label span::after { - background-color: rgb(var(--tone-gray-000)); + background-color: var(--token-color-surface-primary); } %sliding-toggle label input:checked + span::before, %sliding-toggle-negative label input + span::before { - background-color: rgb(var(--tone-blue-500)); + background-color: var(--token-color-foreground-action); } %sliding-toggle label span::before, %sliding-toggle-negative label input:checked + span::before { - background-color: rgb(var(--tone-gray-300)); + background-color: var(--token-color-palette-neutral-300); } diff --git a/ui/packages/consul-ui/app/components/tab-nav/skin.scss b/ui/packages/consul-ui/app/components/tab-nav/skin.scss index 19561a54a9e..b0604b11116 100644 --- a/ui/packages/consul-ui/app/components/tab-nav/skin.scss +++ b/ui/packages/consul-ui/app/components/tab-nav/skin.scss @@ -18,22 +18,22 @@ } %tab-nav { /* %frame-transparent-something */ - border-color: rgb(var(--tone-gray-200)); + border-color: var(--token-color-surface-interactive-active); } %tab-button { @extend %with-transition-500; transition-property: background-color, border-color; - border-color: var(--transparent); - color: rgb(var(--tone-gray-500)); + border-color: transparent; + color: var(--token-color-foreground-faint); } %tab-button-intent, %tab-button-active { /* %frame-gray-something */ - background-color: rgb(var(--tone-gray-100)); + background-color: var(--token-color-surface-strong); } %tab-button-intent { - border-color: rgb(var(--tone-gray-300)); + border-color: var(--token-color-palette-neutral-300); } %tab-nav.animatable .selected a { - border-color: var(--transparent) !important; + border-color: transparent !important; } diff --git a/ui/packages/consul-ui/app/components/table/index.scss b/ui/packages/consul-ui/app/components/table/index.scss index 23a57f0a198..331cb9dcf94 100644 --- a/ui/packages/consul-ui/app/components/table/index.scss +++ b/ui/packages/consul-ui/app/components/table/index.scss @@ -21,7 +21,7 @@ table.consul-metadata-list tbody tr:hover { %table th span::after { @extend %with-info-circle-outline-mask, %as-pseudo; - color: rgb(var(--tone-gray-500)); + color: var(--token-color-foreground-faint); margin-left: 4px; } %table tbody tr { @@ -31,12 +31,12 @@ table.consul-metadata-list tbody tr:hover { padding: 0; } %table tbody tr:hover { - box-shadow: var(--decor-elevation-300); + box-shadow: var(--token-elevation-high-box-shadow); } %table td.folder::before { @extend %with-folder-outline-mask, %as-pseudo; - background-color: rgb(var(--tone-gray-300)); + background-color: var(--token-color-palette-neutral-300); margin-top: 1px; margin-right: 5px; } diff --git a/ui/packages/consul-ui/app/components/table/layout.scss b/ui/packages/consul-ui/app/components/table/layout.scss index 4858bce801a..c19d48b3ce6 100644 --- a/ui/packages/consul-ui/app/components/table/layout.scss +++ b/ui/packages/consul-ui/app/components/table/layout.scss @@ -59,5 +59,5 @@ font-weight: normal; } %table tbody td em { - color: rgb(var(--tone-gray-500)); + color: var(--token-color-foreground-faint); } diff --git a/ui/packages/consul-ui/app/components/table/skin.scss b/ui/packages/consul-ui/app/components/table/skin.scss index 6e8ff93d7ab..8cd8b5f4fa4 100644 --- a/ui/packages/consul-ui/app/components/table/skin.scss +++ b/ui/packages/consul-ui/app/components/table/skin.scss @@ -3,15 +3,15 @@ border-bottom: var(--decor-border-100); } %table th { - border-color: rgb(var(--tone-gray-300)); + border-color: var(--token-color-palette-neutral-300); } %table td { - border-color: rgb(var(--tone-gray-200)); - color: rgb(var(--tone-gray-500)); + border-color: var(--token-color-surface-interactive-active); + color: var(--token-color-foreground-faint); } %table th, %table td strong { - color: rgb(var(--tone-gray-600)); + color: var(--token-color-foreground-faint); } /* TODO: Add to native selector `tbody th` - will involve moving all * current th's to `thead th` and changing the templates @@ -19,7 +19,7 @@ */ %table a, %tbody-th { - color: rgb(var(--tone-gray-900)); + color: var(--token-color-foreground-strong); } %table td:first-child { @extend %tbody-th; diff --git a/ui/packages/consul-ui/app/components/tabular-details/skin.scss b/ui/packages/consul-ui/app/components/tabular-details/skin.scss index 0bd53b99ada..0ff486379cb 100644 --- a/ui/packages/consul-ui/app/components/tabular-details/skin.scss +++ b/ui/packages/consul-ui/app/components/tabular-details/skin.scss @@ -6,22 +6,22 @@ border: 0; } %tabular-detail { - border: 1px solid rgb(var(--tone-gray-300)); + border: 1px solid var(--token-color-palette-neutral-300); border-radius: var(--decor-radius-100); - box-shadow: var(--decor-elevation-600); + box-shadow: var(--token-surface-high-box-shadow); margin-bottom: 20px; } %tabular-detail::before, %tabular-detail > div, %tabular-detail > label { - background-color: rgb(var(--tone-gray-000)); + background-color: var(--token-color-surface-primary); } %tabular-detail > label::before { transform: rotate(180deg); } // this is here as its a fake border %tabular-detail::before { - background: rgb(var(--tone-gray-200)); + background: var(--token-color-surface-interactive-active); content: ''; display: block; height: 1px; diff --git a/ui/packages/consul-ui/app/components/tabular-dl/skin.scss b/ui/packages/consul-ui/app/components/tabular-dl/skin.scss index a48931cb3c5..53e5c8cb6cf 100644 --- a/ui/packages/consul-ui/app/components/tabular-dl/skin.scss +++ b/ui/packages/consul-ui/app/components/tabular-dl/skin.scss @@ -1,21 +1,21 @@ %tabular-dl { > dt:last-of-type, > dd:last-of-type { - border-color: rgb(var(--tone-gray-300)) !important; + border-color: var(--token-color-palette-neutral-300) !important; } dt, dd { - border-color: rgb(var(--tone-gray-300)) !important; - color: rgb(var(--tone-gray-999)) !important; + border-color: var(--token-color-palette-neutral-300) !important; + color: var(--token-color-hashicorp-brand) !important; } dt { font-weight: var(--typo-weight-bold); } dd .copy-button button::before { - background-color: rgb(var(--tone-gray-999)); + background-color: var(--token-color-hashicorp-brand); } dt.type + dd span::before { @extend %with-info-circle-outline-mask, %as-pseudo; - background-color: rgb(var(--tone-gray-500)); + background-color: var(--token-color-foreground-faint); } } diff --git a/ui/packages/consul-ui/app/components/tag-list/index.scss b/ui/packages/consul-ui/app/components/tag-list/index.scss index 6ded1d9a3bf..dc5346f14a2 100644 --- a/ui/packages/consul-ui/app/components/tag-list/index.scss +++ b/ui/packages/consul-ui/app/components/tag-list/index.scss @@ -8,7 +8,7 @@ td.tags { %tag-list dt::before { @extend %with-tag-mask, %as-pseudo; color: inherit; - color: rgb(var(--tone-gray-500)); + color: var(--token-color-foreground-faint); } %tag-list dd { @extend %csv-list; diff --git a/ui/packages/consul-ui/app/components/tile/index.scss b/ui/packages/consul-ui/app/components/tile/index.scss index 55ceb7b4004..779349b0311 100644 --- a/ui/packages/consul-ui/app/components/tile/index.scss +++ b/ui/packages/consul-ui/app/components/tile/index.scss @@ -1,4 +1,3 @@ - %with-tile { position: relative; width: var(--tile-size, 3rem); @@ -23,15 +22,15 @@ @extend %with-tile; } %with-leader-tile::before { - background-image: linear-gradient(135deg, - rgb(var(--strawberry-010)) 0%, - rgb(var(--strawberry-200)) 100% + background-image: linear-gradient( + 135deg, + var(--token-color-consul-surface) 0%, + var(--token-color-consul-border) 100% ); - border-color: rgb(var(--tone-gray-999) / 10%); + border-color: var(--token-color-border-faint); } %with-leader-tile::after { --icon-name: icon-star-fill; --icon-size: icon-700; - color: rgb(var(--strawberry-500)); + color: var(--token-color-consul-brand); } - diff --git a/ui/packages/consul-ui/app/components/toggle-button/skin.scss b/ui/packages/consul-ui/app/components/toggle-button/skin.scss index 7a05618ed3b..eac488af2eb 100644 --- a/ui/packages/consul-ui/app/components/toggle-button/skin.scss +++ b/ui/packages/consul-ui/app/components/toggle-button/skin.scss @@ -3,10 +3,10 @@ cursor: pointer; } %toggle-button-intent { - background-color: rgb(var(--tone-gray-050)); + background-color: var(--token-color-surface-strong); } %toggle-button-active { - background-color: rgb(var(--tone-gray-100)); + background-color: var(--token-color-surface-strong); } %toggle-button:hover, %toggle-button:focus { diff --git a/ui/packages/consul-ui/app/components/tooltip-panel/skin.scss b/ui/packages/consul-ui/app/components/tooltip-panel/skin.scss index 7e65c62926b..31cb584a31d 100644 --- a/ui/packages/consul-ui/app/components/tooltip-panel/skin.scss +++ b/ui/packages/consul-ui/app/components/tooltip-panel/skin.scss @@ -6,9 +6,9 @@ @extend %as-pseudo; width: 12px; height: 12px; - background-color: rgb(var(--tone-gray-000)); - border-top: 1px solid rgb(var(--tone-gray-300)); - border-right: 1px solid rgb(var(--tone-gray-300)); + background-color: var(--token-color-surface-primary); + border-top: 1px solid var(--token-color-palette-neutral-300); + border-right: 1px solid var(--token-color-palette-neutral-300); transform: rotate(-45deg); position: absolute; left: 16px; diff --git a/ui/packages/consul-ui/app/components/tooltip/index.scss b/ui/packages/consul-ui/app/components/tooltip/index.scss index 333faed35fe..034aa343bbb 100644 --- a/ui/packages/consul-ui/app/components/tooltip/index.scss +++ b/ui/packages/consul-ui/app/components/tooltip/index.scss @@ -31,19 +31,19 @@ %tooltip-bubble { & { - background-color: rgb(var(--tone-gray-700)); - color: rgb(var(--tone-gray-000)); + background-color: var(--token-color-foreground-faint); + color: var(--token-color-surface-primary); } } %tooltip-tail { --size: 5px; & { - color: rgb(var(--tone-gray-700)); + color: var(--token-color-foreground-faint); width: calc(var(--size) * 2); height: calc(var(--size) * 2); } &::before { - border-color: var(--transparent); + border-color: transparent; border-style: solid; } } diff --git a/ui/packages/consul-ui/app/components/topology-metrics/card/index.scss b/ui/packages/consul-ui/app/components/topology-metrics/card/index.scss index 6148f41a75d..5566f2b428f 100644 --- a/ui/packages/consul-ui/app/components/topology-metrics/card/index.scss +++ b/ui/packages/consul-ui/app/components/topology-metrics/card/index.scss @@ -5,14 +5,14 @@ #upstream-container .topology-metrics-card, #downstream-container .topology-metrics-card { display: block; - color: rgb(var(--tone-gray-700)); + color: var(--token-color-foreground-faint); overflow: hidden; - background-color: rgb(var(--tone-gray-000)); + background-color: var(--token-color-surface-primary); border-radius: var(--decor-radius-100); border: 1px solid; /* TODO: If this color is combined with the above */ /* border property then the compressor removes the color */ - border-color: rgb(var(--tone-gray-200)); + border-color: var(--token-color-surface-interactive-active); p { padding: 12px 12px 0 12px; font-size: var(--typo-size-500); @@ -28,7 +28,7 @@ margin-right: 8px; } dd { - color: rgb(var(--tone-gray-700)); + color: var(--token-color-foreground-faint); } span { margin-right: 8px; @@ -56,23 +56,23 @@ .partition dt::before, .nspace dt::before, .health dt::before { - --icon-color: rgb(var(--tone-gray-500)); + --icon-color: var(--token-color-foreground-faint); } .passing::before { @extend %with-check-circle-fill-mask, %as-pseudo; - --icon-color: rgb(var(--tone-green-500)); + --icon-color: var(--token-color-foreground-success); } .warning::before { @extend %with-alert-triangle-mask, %as-pseudo; - --icon-color: rgb(var(--tone-orange-500)); + --icon-color: var(--token-color-foreground-warning); } .critical::before { @extend %with-cancel-square-fill-mask, %as-pseudo; - --icon-color: rgb(var(--tone-red-500)); + --icon-color: var(--token-color-foreground-critical); } .empty::before { @extend %with-minus-square-fill-mask, %as-pseudo; - --icon-color: rgb(var(--tone-gray-500)); + --icon-color: var(--token-color-foreground-faint); } } .details { @@ -96,7 +96,7 @@ span::before { margin-right: 0px; @extend %with-union-mask, %as-pseudo; - --icon-color: rgb(var(--tone-gray-500)); + --icon-color: var(--token-color-foreground-faint); } dl:first-child { grid-area: partition; diff --git a/ui/packages/consul-ui/app/components/topology-metrics/popover/index.scss b/ui/packages/consul-ui/app/components/topology-metrics/popover/index.scss index 230bfa11448..2468d4f4a63 100644 --- a/ui/packages/consul-ui/app/components/topology-metrics/popover/index.scss +++ b/ui/packages/consul-ui/app/components/topology-metrics/popover/index.scss @@ -2,7 +2,7 @@ > button { position: absolute; transform: translate(-50%, -50%); - background-color: rgb(var(--tone-gray-000)); + background-color: var(--token-color-surface-primary); padding: 1px 1px; &:hover { cursor: pointer; @@ -21,16 +21,16 @@ &.deny > button::before, &.deny .tippy-arrow::after { @extend %with-cancel-square-fill-mask, %as-pseudo; - --icon-color: rgb(var(--tone-red-500)); + --icon-color: var(--token-color-foreground-critical); } &.l7 > button::before, &.l7 .tippy-arrow::after { @extend %with-layers-mask, %as-pseudo; - --icon-color: rgb(var(--tone-gray-300)); + --icon-color: var(--token-color-palette-neutral-300); } &.not-defined > button::before, &.not-defined .tippy-arrow::after { @extend %with-alert-triangle-mask, %as-pseudo; - --icon-color: rgb(var(--tone-yellow-500)); + --icon-color: var(--token-color-vault-brand); } } diff --git a/ui/packages/consul-ui/app/components/topology-metrics/series/skin.scss b/ui/packages/consul-ui/app/components/topology-metrics/series/skin.scss index abd3ed5f2e9..9c111bccf3f 100644 --- a/ui/packages/consul-ui/app/components/topology-metrics/series/skin.scss +++ b/ui/packages/consul-ui/app/components/topology-metrics/series/skin.scss @@ -8,18 +8,18 @@ font-size: 0.875em; line-height: 1.5em; font-weight: normal; - border: 1px solid rgb(var(--tone-gray-300)); + border: 1px solid var(--token-color-palette-neutral-300); background: #fff; border-radius: 2px; box-sizing: border-box; - box-shadow: 0px 4px 8px rgba(0, 0, 0, 0.05), 0px 4px 4px rgba(0, 0, 0, 0.1); + box-shadow: var(--token-elevation-higher-box-shadow); .sparkline-time { padding: 8px 10px; font-weight: bold; font-size: 14px; color: #000; - border-bottom: 1px solid rgb(var(--tone-gray-200)); + border-bottom: 1px solid var(--token-color-surface-interactive-active); margin-bottom: 4px; text-align: center; } @@ -31,7 +31,7 @@ } .sparkline-tt-sum { - border-top: 1px solid rgb(var(--tone-gray-200)); + border-top: 1px solid var(--token-color-surface-interactive-active); margin-top: 4px; padding: 8px 10px 0 10px; } @@ -58,7 +58,7 @@ height: 12px; left: 15px; bottom: -7px; - border: 1px solid rgb(var(--tone-gray-300)); + border: 1px solid var(--token-color-palette-neutral-300); border-top: 0; border-left: 0; background: #fff; @@ -75,7 +75,7 @@ } h3 { - color: rgb(var(--tone-gray-900)); + color: var(--token-color-foreground-strong); font-size: 16px; } @@ -84,16 +84,16 @@ font-weight: 600; } dd { - color: rgb(var(--tone-gray-500)); + color: var(--token-color-foreground-faint); } } } .sparkline-key-link { - color: rgb(var(--tone-gray-500)); + color: var(--token-color-foreground-faint); } .sparkline-key-link:hover { - color: rgb(var(--tone-blue-500)); + color: var(--token-color-foreground-action); } #metrics-container:hover .sparkline-key-link::before { @extend %with-info-circle-fill-mask, %as-pseudo; diff --git a/ui/packages/consul-ui/app/components/topology-metrics/skin.scss b/ui/packages/consul-ui/app/components/topology-metrics/skin.scss index fc819a6300f..c40c6c43fa9 100644 --- a/ui/packages/consul-ui/app/components/topology-metrics/skin.scss +++ b/ui/packages/consul-ui/app/components/topology-metrics/skin.scss @@ -1,7 +1,7 @@ .topology-notices { button { @extend %button; - color: rgb(var(--tone-blue-500)); + color: var(--token-color-foreground-action); } button::before { @extend %as-pseudo; @@ -12,7 +12,7 @@ } } .topology-container { - color: rgb(var(--tone-gray-700)); + color: var(--token-color-foreground-faint); } // Columns/Containers & Lines @@ -23,35 +23,35 @@ border: 1px solid; /* TODO: If this color is combined with the above */ /* border property then the compressor removes the color */ - border-color: rgb(var(--tone-gray-200)); + border-color: var(--token-color-surface-interactive-active); } #downstream-container, #upstream-container { - background-color: rgb(var(--tone-gray-100)); + background-color: var(--token-color-surface-strong); } #downstream-container > div:first-child { display: inline-flex; span::before { @extend %with-info-circle-outline-mask, %as-pseudo; - background-color: rgb(var(--tone-gray-500)); + background-color: var(--token-color-foreground-faint); } } // Metrics Container #metrics-container { div:first-child { - background-color: rgb(var(--tone-gray-000)); + background-color: var(--token-color-surface-primary); } .link { - background-color: rgb(var(--tone-gray-100)); + background-color: var(--token-color-surface-strong); a { - color: rgb(var(--tone-gray-700)); + color: var(--token-color-foreground-faint); } a::before { - background-color: rgb(var(--tone-gray-500)); + background-color: var(--token-color-foreground-faint); } a:hover { - color: rgb(var(--color-action)); + color: var(--token-color-foreground-action); } .metrics-link::before { @extend %with-exit-mask, %as-pseudo; @@ -66,19 +66,19 @@ #downstream-lines svg, #upstream-lines svg { path { - fill: var(--transparent); + fill: transparent; } circle { - fill: rgb(var(--tone-gray-000)); + fill: var(--token-color-surface-primary); } .allow-arrow { - fill: rgb(var(--tone-gray-300)); + fill: var(--token-color-palette-neutral-300); stroke-linejoin: round; } path, .allow-dot, .allow-arrow { - stroke: rgb(var(--tone-gray-300)); + stroke: var(--token-color-palette-neutral-300); stroke-width: 2; } path[data-permission='not-defined'], @@ -86,15 +86,15 @@ stroke-dasharray: 4; } path[data-permission='deny'] { - stroke: rgb(var(--tone-red-500)); + stroke: var(--token-color-foreground-critical); } .deny-dot { - stroke: rgb(var(--tone-red-500)); + stroke: var(--token-color-foreground-critical); stroke-width: 2; } .deny-arrow { - fill: rgb(var(--tone-red-500)); - stroke: rgb(var(--tone-red-500)); + fill: var(--token-color-foreground-critical); + stroke: var(--token-color-foreground-critical); stroke-linejoin: round; } } diff --git a/ui/packages/consul-ui/app/components/topology-metrics/stats/index.scss b/ui/packages/consul-ui/app/components/topology-metrics/stats/index.scss index 58943e19270..9005502e3cd 100644 --- a/ui/packages/consul-ui/app/components/topology-metrics/stats/index.scss +++ b/ui/packages/consul-ui/app/components/topology-metrics/stats/index.scss @@ -5,7 +5,7 @@ justify-content: space-between; align-items: stretch; width: 100%; - border-top: 1px solid rgb(var(--tone-gray-200)); + border-top: 1px solid var(--token-color-surface-interactive-active); dl { display: flex; padding-bottom: 12px; @@ -15,7 +15,7 @@ line-height: 1.5em !important; } dd { - color: rgb(var(--tone-gray-400)) !important; + color: var(--token-color-foreground-disabled) !important; } span { padding-bottom: 12px; diff --git a/ui/packages/consul-ui/app/components/topology-metrics/status/index.scss b/ui/packages/consul-ui/app/components/topology-metrics/status/index.scss index fdf7f23fbf0..b9f87fdab66 100644 --- a/ui/packages/consul-ui/app/components/topology-metrics/status/index.scss +++ b/ui/packages/consul-ui/app/components/topology-metrics/status/index.scss @@ -2,14 +2,14 @@ .topology-metrics-status-loader { font-weight: normal; font-size: 0.875rem; - color: rgb(var(--tone-gray-500)); + color: var(--token-color-foreground-faint); text-align: center; margin: 0 auto !important; display: block; span::before { @extend %with-info-circle-outline-mask, %as-pseudo; - background-color: rgb(var(--tone-gray-500)); + background-color: var(--token-color-foreground-faint); } } diff --git a/ui/packages/consul-ui/app/modifiers/aria-menu.mdx b/ui/packages/consul-ui/app/modifiers/aria-menu.mdx index 753922f7f58..167e71cf6b9 100644 --- a/ui/packages/consul-ui/app/modifiers/aria-menu.mdx +++ b/ui/packages/consul-ui/app/modifiers/aria-menu.mdx @@ -56,9 +56,9 @@ In the example below, the Before Trigger and After Trigger don't do anything, th style={{style-map (array 'position' 'absolute') (array 'padding' '1rem') - (array 'border' '1px solid rgb(var(--tone-gray-500))') + (array 'border' '1px solid var(--token-color-foreground-faint)') (array 'top' '2rem') - (array 'background-color' 'rgb(var(--tone-gray-000))') + (array 'background-color' 'var(--token-color-surface-primary)') }} role="menu" aria-labelledby="trigger" diff --git a/ui/packages/consul-ui/app/modifiers/css-prop.mdx b/ui/packages/consul-ui/app/modifiers/css-prop.mdx index 2ddf1bead52..f638fb6e1e4 100644 --- a/ui/packages/consul-ui/app/modifiers/css-prop.mdx +++ b/ui/packages/consul-ui/app/modifiers/css-prop.mdx @@ -5,9 +5,9 @@ Get the value for a single specific CSS Property from the modified element. ```hbs preview-template
    - --red-500: {{this.red}} + --token-color-foreground-critical: {{this.red}}
    ``` diff --git a/ui/packages/consul-ui/app/styles/base/color/README.mdx b/ui/packages/consul-ui/app/styles/base/color/README.mdx deleted file mode 100644 index 414514316d8..00000000000 --- a/ui/packages/consul-ui/app/styles/base/color/README.mdx +++ /dev/null @@ -1,81 +0,0 @@ -# Colors - -All colors for the immediate future should _mostly_ use the following `tone` -CSS properties, unless: - -1. We get around to eventually adding semantic colors names (or adding something else) in which case these docs should be updated. -2. You are absolutely sure the color you want should never be changed by a theme. These should be very very few and far between so even if we get that wrong it should be easy to update. - -`tones` should always using the following form: - -```css -property: rgb(var(--tone-gray-500)); -``` - -In other words always use `rgb` this gives us the flexibility to easily use these variables with alpha if we ever need to. - -```css -property: rgb(var(--tone-gray-500) / 50); -``` - -Currently, alphas are mainly used for shadows. Please avoid the use of alphas for adjusting hues as they can produce unpredictable results. We should be utilizing our pre-defined color palette or adding new colors to it with proper RGB values. If you do need to add a color with alpha, please include a code comment or a self-comment explaining the use case. - -Lastly, there is currently one non-color alias group which is `--tone-brand` which is a group of our current brand colors. - - -## %theme-light (default) - -```hbs preview-template -
      -{{#each-in this.tones as |prop value|}} -
    • - {{#each-in value as |prop value|}} -
      -
      {{prop}}
      -
      - {{/each-in}} -
    • -{{/each-in}} -
    -``` - -## %theme-dark - -If you need to build something (like a component or view) which begins in 'dark mode', you will need to switch your coloring and use - -```css -%component-name { - @extend %theme-dark; -} -``` - -```hbs preview-template -
      -{{#each-in this.tones as |prop value|}} -
    • - {{#each-in value as |prop value|}} -
      -
      {{prop}}
      -
      - {{/each-in}} -
    • -{{/each-in}} -
    -``` - diff --git a/ui/packages/consul-ui/app/styles/base/color/base-variables.scss b/ui/packages/consul-ui/app/styles/base/color/base-variables.scss deleted file mode 100644 index e88817cda7c..00000000000 --- a/ui/packages/consul-ui/app/styles/base/color/base-variables.scss +++ /dev/null @@ -1,190 +0,0 @@ -:root { - /* vault */ - --steel-050: 245 246 247; - --steel-100: 225 228 231; - --steel-200: 205 211 215; - --steel-300: 185 193 199; - --steel-400: 165 176 183; - --steel-500: 145 159 168; - --steel-600: 119 131 138; - --steel-700: 93 102 107; - --steel-800: 66 73 77; - --steel-900: 40 44 46; - - /* vault refresh */ - --lemon-050: 255 216 20; - --lemon-100: 255 216 20; - --lemon-200: 255 216 20; - --lemon-300: 255 216 20; - --lemon-400: 255 216 20; - --lemon-500: 255 216 20; - --lemon-600: 255 216 20; - --lemon-700: 255 216 20; - --lemon-800: 255 216 20; - --lemon-900: 255 216 20; - - /* consul */ - --magenta-050: 249 235 242; - --magenta-100: 239 196 216; - --magenta-200: 229 158 190; - --magenta-300: 218 119 164; - --magenta-400: 208 80 138; - --magenta-500: 198 42 113; - --magenta-600: 158 33 89; - --magenta-700: 125 26 71; - --magenta-800: 90 20 52; - --magenta-900: 54 12 31; - - /* consul refresh */ - --strawberry-010: 255 242 248; - --strawberry-050: 255 242 248; - --strawberry-100: 248 217 231; - --strawberry-200: 248 217 231; - --strawberry-300: 224 126 172; - --strawberry-400: 224 126 172; - --strawberry-500: 202 33 113; - --strawberry-600: 142 19 74; - --strawberry-700: 142 19 74; - --strawberry-800: 101 13 52; - --strawberry-900: 101 13 52; - - /* vagrant */ - --cobalt-050: 240 245 255; - --cobalt-100: 191 212 255; - --cobalt-200: 138 177 255; - --cobalt-300: 91 146 255; - --cobalt-400: 56 122 255; - --cobalt-500: 21 99 255; - --cobalt-600: 15 79 209; - --cobalt-700: 14 64 163; - --cobalt-800: 10 45 116; - --cobalt-900: 6 27 70; - - /* terraform */ - --indigo-050: 238 237 252; - --indigo-100: 213 210 247; - --indigo-200: 174 167 242; - --indigo-300: 141 131 237; - --indigo-400: 117 104 232; - --indigo-500: 92 78 229; - --indigo-600: 76 64 188; - --indigo-700: 59 50 146; - --indigo-800: 42 36 105; - --indigo-900: 26 22 63; - - /* nomad */ - --teal-050: 235 248 243; /*#c3ecdc*/ - --teal-100: 195 236 220; /*#e1e4e7*/ - --teal-200: 155 223 197; - --teal-300: 116 211 174; - --teal-400: 76 198 151; - --teal-500: 37 186 129; - --teal-600: 31 153 106; - --teal-700: 24 119 83; - --teal-800: 17 85 59; - --teal-900: 11 51 36; - - /* packer */ - --cyan-050: 231 248 255; - --cyan-100: 185 236 255; - --cyan-200: 139 224 255; - --cyan-300: 92 211 255; - --cyan-400: 46 199 255; - --cyan-500: 0 187 255; - --cyan-600: 0 159 217; - --cyan-700: 0 119 163; - --cyan-800: 0 85 116; - --cyan-900: 0 51 70; - - /* ui */ - - /* removed to prevent confusion - --gray-1: #191a1c; - --gray-2: #323538; - --gray-3: #4c4f54; - --gray-4: #656a70; - --gray-5: #7f858d; - --gray-6: #9a9ea5; - --gray-7: #b4b8bc; - --gray-8: #d0d2d5; - --gray-9: #ebecee; - --gray-10: #f3f4f6; -*/ - - --gray-010: 251 251 252; - --gray-050: 247 248 250; - --gray-100: 235 238 242; - --gray-150: 235 238 242; - --gray-200: 220 224 230; - --gray-300: 186 193 204; - --gray-400: 142 150 163; - --gray-500: 111 118 130; - --gray-600: 98 104 115; - --gray-700: 82 87 97; - --gray-800: 55 58 66; - --gray-850: 44 46 51; - --gray-900: 31 33 36; - --gray-950: 21 23 28; - - /* status */ - --green-050: 236 247 237; - --green-100: 198 233 201; - --green-200: 160 219 165; - --green-300: 122 204 129; - --green-400: 84 190 93; - --green-500: 46 176 57; - --green-600: 38 145 47; - --green-700: 30 113 37; - --green-800: 21 80 26; - --green-900: 13 48 16; - - --blue-010: 251 252 255; - --blue-050: 240 245 255; - --blue-100: 191 212 255; - --blue-200: 138 177 255; - --blue-300: 91 146 255; - --blue-400: 56 122 255; - --blue-500: 21 99 255; - --blue-600: 15 79 209; - --blue-700: 14 64 163; - --blue-800: 10 45 116; - --blue-900: 6 27 70; - - --red-010: 253 250 251; - --red-050: 249 236 238; - --red-100: 239 199 204; - --red-200: 229 162 170; - --red-300: 219 125 136; - --red-400: 209 88 102; - --red-500: 199 52 69; - --red-600: 163 43 57; - --red-700: 127 34 44; - --red-800: 91 24 32; - --red-900: 55 15 19; - - --orange-050: 254 244 236; /*#fa8f37*/ - --orange-100: 253 224 200; - --orange-200: 252 204 164; - --orange-300: 251 183 127; - --orange-400: 250 163 91; - --orange-500: 250 143 55; - --orange-600: 205 118 46; - --orange-700: 160 92 35; - --orange-800: 114 65 25; - --orange-900: 69 39 15; - - --yellow-050: 255 251 237; /*#fa8f37;*/ - --yellow-100: 253 238 186; - --yellow-200: 252 228 140; - --yellow-300: 251 217 94; - --yellow-400: 250 206 48; - --yellow-500: 250 196 2; - --yellow-600: 205 161 2; - --yellow-700: 160 125 2; - --yellow-800: 114 90 1; - --yellow-900: 69 54 1; - - --transparent: transparent; - --white: 255 255 255; - --black: 0 0 0; -} diff --git a/ui/packages/consul-ui/app/styles/base/color/hex-variables.scss b/ui/packages/consul-ui/app/styles/base/color/hex-variables.scss deleted file mode 100644 index d2f7659e10f..00000000000 --- a/ui/packages/consul-ui/app/styles/base/color/hex-variables.scss +++ /dev/null @@ -1,178 +0,0 @@ -:root { - /* vault */ - --steel-050: #f5f6f7; - --steel-100: #e1e4e7; - --steel-200: #cdd3d7; - --steel-300: #b9c1c7; - --steel-400: #a5b0b7; - --steel-500: #919fa8; - --steel-600: #77838a; - --steel-700: #5d666b; - --steel-800: #42494d; - --steel-900: #282c2e; - - /* consul */ - --magenta-050: #f9ebf2; - --magenta-100: #efc4d8; - --magenta-200: #e59ebe; - --magenta-300: #da77a4; - --magenta-400: #d0508a; - --magenta-500: #c62a71; - --magenta-600: #9e2159; - --magenta-700: #7d1a47; - --magenta-800: #5a1434; - --magenta-900: #360c1f; - - /* consul refresh */ - --strawberry-010: #fff2f8; - --strawberry-050: #fff2f8; - --strawberry-100: #f8d9e7; - --strawberry-200: #f8d9e7; - --strawberry-300: #e07eac; - --strawberry-400: #e07eac; - --strawberry-500: #ca2171; - --strawberry-600: #8e134a; - --strawberry-700: #8e134a; - --strawberry-800: #650d34; - --strawberry-900: #650d34; - - /* vagrant */ - --cobalt-050: #f0f5ff; - --cobalt-100: #bfd4ff; - --cobalt-200: #8ab1ff; - --cobalt-300: #5b92ff; - --cobalt-400: #387aff; - --cobalt-500: #1563ff; - --cobalt-600: #0f4fd1; - --cobalt-700: #0e40a3; - --cobalt-800: #0a2d74; - --cobalt-900: #061b46; - - /* terraform */ - --indigo-050: #eeedfc; - --indigo-100: #d5d2f7; - --indigo-200: #aea7f2; - --indigo-300: #8d83ed; - --indigo-400: #7568e8; - --indigo-500: #5c4ee5; - --indigo-600: #4c40bc; - --indigo-700: #3b3292; - --indigo-800: #2a2469; - --indigo-900: #1a163f; - - /* nomad */ - --teal-050: #ebf8f3;/*#c3ecdc*/; - --teal-100: #c3ecdc;/*#e1e4e7*/; - --teal-200: #9bdfc5; - --teal-300: #74d3ae; - --teal-400: #4cc697; - --teal-500: #25ba81; - --teal-600: #1f996a; - --teal-700: #187753; - --teal-800: #11553b; - --teal-900: #0b3324; - - /* packer */ - --cyan-050: #e7f8ff; - --cyan-100: #b9ecff; - --cyan-200: #8be0ff; - --cyan-300: #5cd3ff; - --cyan-400: #2ec7ff; - --cyan-500: #00bbff; - --cyan-600: #009fd9; - --cyan-700: #0077a3; - --cyan-800: #005574; - --cyan-900: #003346; - -/* ui */ - -/* removed to prevent confusion - --gray-1: #191a1c; - --gray-2: #323538; - --gray-3: #4c4f54; - --gray-4: #656a70; - --gray-5: #7f858d; - --gray-6: #9a9ea5; - --gray-7: #b4b8bc; - --gray-8: #d0d2d5; - --gray-9: #ebecee; - --gray-10: #f3f4f6; -*/ - - --gray-010: #fbfbfc; - --gray-050: #f7f8fa; - --gray-100: #ebeef2; - --gray-150: #ebeef2; - --gray-200: #dce0e6; - --gray-300: #bac1cc; - --gray-400: #8e96a3; - --gray-500: #6f7682; - --gray-600: #626873; - --gray-700: #525761; - --gray-800: #373a42; - --gray-850: #2c2e33; - --gray-900: #1f2124; - --gray-950: #15171c; - -/* status */ - --green-050: #ecf7ed; - --green-100: #c6e9c9; - --green-200: #a0dba5; - --green-300: #7acc81; - --green-400: #54be5d; - --green-500: #2eb039; - --green-600: #26912f; - --green-700: #1e7125; - --green-800: #15501a; - --green-900: #0d3010; - - --blue-010: #fbfcff; - --blue-050: #f0f5ff; - --blue-100: #bfd4ff; - --blue-200: #8ab1ff; - --blue-300: #5b92ff; - --blue-400: #387aff; - --blue-500: #1563ff; - --blue-600: #0f4fd1; - --blue-700: #0e40a3; - --blue-800: #0a2d74; - --blue-900: #061b46; - - --red-010: #fdfafb; - --red-050: #f9ecee; - --red-100: #efc7cc; - --red-200: #e5a2aa; - --red-300: #db7d88; - --red-400: #d15866; - --red-500: #c73445; - --red-600: #a32b39; - --red-700: #7f222c; - --red-800: #5b1820; - --red-900: #370f13; - - --orange-050: #fef4ec;/*#fa8f37*/; - --orange-100: #fde0c8; - --orange-200: #fccca4; - --orange-300: #fbb77f; - --orange-400: #faa35b; - --orange-500: #fa8f37; - --orange-600: #cd762e; - --orange-700: #a05c23; - --orange-800: #724119; - --orange-900: #45270f; - - --yellow-050: #fffbed;/*#fa8f37;*/ - --yellow-100: #fdeeba; - --yellow-200: #fce48c; - --yellow-300: #fbd95e; - --yellow-400: #face30; - --yellow-500: #fac402; - --yellow-600: #cda102; - --yellow-700: #a07d02; - --yellow-800: #725a01; - --yellow-900: #453601; - - --transparent: transparent; - --white: #fff; - --black: #000; -} diff --git a/ui/packages/consul-ui/app/styles/base/color/index.scss b/ui/packages/consul-ui/app/styles/base/color/index.scss index decc200b41b..ba12227c0a1 100644 --- a/ui/packages/consul-ui/app/styles/base/color/index.scss +++ b/ui/packages/consul-ui/app/styles/base/color/index.scss @@ -1,7 +1,2 @@ -/*@import './hex-variables';*/ -@import './base-variables'; -/* load in the ui theme */ @import './ui/index'; -/* other themes should be added at a project level */ @import './semantic-variables'; -/*@import './theme-placeholders';*/ diff --git a/ui/packages/consul-ui/app/styles/base/color/lemon/frame-placeholders.scss b/ui/packages/consul-ui/app/styles/base/color/lemon/frame-placeholders.scss deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/ui/packages/consul-ui/app/styles/base/color/lemon/index.scss b/ui/packages/consul-ui/app/styles/base/color/lemon/index.scss deleted file mode 100644 index e62440c7cbb..00000000000 --- a/ui/packages/consul-ui/app/styles/base/color/lemon/index.scss +++ /dev/null @@ -1,5 +0,0 @@ -@import './themes/light'; -@import './themes/dark'; -@import './themes/light-high-contrast'; -@import './themes/dark-high-contrast'; -@import './frame-placeholders'; diff --git a/ui/packages/consul-ui/app/styles/base/color/lemon/themes/dark-high-contrast.scss b/ui/packages/consul-ui/app/styles/base/color/lemon/themes/dark-high-contrast.scss deleted file mode 100644 index d57568f4a9f..00000000000 --- a/ui/packages/consul-ui/app/styles/base/color/lemon/themes/dark-high-contrast.scss +++ /dev/null @@ -1,17 +0,0 @@ -%theme-dark-high-contrast { - --tone-lemon-000: var(--white); - --tone-lemon-050: var(--lemon-050); - --tone-lemon-100: var(--lemon-100); - --tone-lemon-150: var(--lemon-150); - --tone-lemon-200: var(--lemon-200); - --tone-lemon-300: var(--lemon-300); - --tone-lemon-400: var(--lemon-400); - --tone-lemon-500: var(--lemon-500); - --tone-lemon-600: var(--lemon-600); - --tone-lemon-700: var(--lemon-700); - --tone-lemon-800: var(--lemon-800); - --tone-lemon-850: var(--lemon-850); - --tone-lemon-900: var(--lemon-900); - --tone-lemon-950: var(--lemon-950); - --tone-lemon-999: var(--black); -} diff --git a/ui/packages/consul-ui/app/styles/base/color/lemon/themes/dark.scss b/ui/packages/consul-ui/app/styles/base/color/lemon/themes/dark.scss deleted file mode 100644 index be9f8551e51..00000000000 --- a/ui/packages/consul-ui/app/styles/base/color/lemon/themes/dark.scss +++ /dev/null @@ -1,17 +0,0 @@ -%theme-dark { - --tone-lemon-000: var(--white); - --tone-lemon-050: var(--lemon-050); - --tone-lemon-100: var(--lemon-100); - --tone-lemon-150: var(--lemon-150); - --tone-lemon-200: var(--lemon-200); - --tone-lemon-300: var(--lemon-300); - --tone-lemon-400: var(--lemon-400); - --tone-lemon-500: var(--lemon-500); - --tone-lemon-600: var(--lemon-600); - --tone-lemon-700: var(--lemon-700); - --tone-lemon-800: var(--lemon-800); - --tone-lemon-850: var(--lemon-850); - --tone-lemon-900: var(--lemon-900); - --tone-lemon-950: var(--lemon-950); - --tone-lemon-999: var(--black); -} diff --git a/ui/packages/consul-ui/app/styles/base/color/lemon/themes/light-high-contrast.scss b/ui/packages/consul-ui/app/styles/base/color/lemon/themes/light-high-contrast.scss deleted file mode 100644 index 5a7fac0f046..00000000000 --- a/ui/packages/consul-ui/app/styles/base/color/lemon/themes/light-high-contrast.scss +++ /dev/null @@ -1,17 +0,0 @@ -%theme-light-high-contrast { - --tone-lemon-000: var(--white); - --tone-lemon-050: var(--lemon-050); - --tone-lemon-100: var(--lemon-100); - --tone-lemon-150: var(--lemon-150); - --tone-lemon-200: var(--lemon-200); - --tone-lemon-300: var(--lemon-300); - --tone-lemon-400: var(--lemon-400); - --tone-lemon-500: var(--lemon-500); - --tone-lemon-600: var(--lemon-600); - --tone-lemon-700: var(--lemon-700); - --tone-lemon-800: var(--lemon-800); - --tone-lemon-850: var(--lemon-850); - --tone-lemon-900: var(--lemon-900); - --tone-lemon-950: var(--lemon-950); - --tone-lemon-999: var(--black); -} diff --git a/ui/packages/consul-ui/app/styles/base/color/lemon/themes/light.scss b/ui/packages/consul-ui/app/styles/base/color/lemon/themes/light.scss deleted file mode 100644 index 4e937d5cf5c..00000000000 --- a/ui/packages/consul-ui/app/styles/base/color/lemon/themes/light.scss +++ /dev/null @@ -1,17 +0,0 @@ -%theme-light { - --tone-lemon-000: var(--white); - --tone-lemon-050: var(--lemon-050); - --tone-lemon-100: var(--lemon-100); - --tone-lemon-150: var(--lemon-150); - --tone-lemon-200: var(--lemon-200); - --tone-lemon-300: var(--lemon-300); - --tone-lemon-400: var(--lemon-400); - --tone-lemon-500: var(--lemon-500); - --tone-lemon-600: var(--lemon-600); - --tone-lemon-700: var(--lemon-700); - --tone-lemon-800: var(--lemon-800); - --tone-lemon-850: var(--lemon-850); - --tone-lemon-900: var(--lemon-900); - --tone-lemon-950: var(--lemon-950); - --tone-lemon-999: var(--black); -} diff --git a/ui/packages/consul-ui/app/styles/base/color/magenta/frame-placeholders.scss b/ui/packages/consul-ui/app/styles/base/color/magenta/frame-placeholders.scss deleted file mode 100644 index 9e380b4b325..00000000000 --- a/ui/packages/consul-ui/app/styles/base/color/magenta/frame-placeholders.scss +++ /dev/null @@ -1,13 +0,0 @@ -%frame-magenta-300 { - @extend %frame-border-000; - background-color: rgb(var(--tone-gray-000)); - border-color: rgb(var(--tone-magenta-600)); - color: rgb(var(--tone-magenta-600)); -} -%frame-magenta-800 { - @extend %frame-border-000; - background-color: rgb(var(--tone-magenta-500)); - border-color: rgb(var(--tone-magenta-800)); - color: rgb(var(--tone-gray-000)); -} - diff --git a/ui/packages/consul-ui/app/styles/base/color/magenta/index.scss b/ui/packages/consul-ui/app/styles/base/color/magenta/index.scss deleted file mode 100644 index 3948997e771..00000000000 --- a/ui/packages/consul-ui/app/styles/base/color/magenta/index.scss +++ /dev/null @@ -1,6 +0,0 @@ -@import './themes/light'; -@import './themes/dark'; -@import './themes/light-high-contrast'; -@import './themes/dark-high-contrast'; -@import './frame-placeholders'; - diff --git a/ui/packages/consul-ui/app/styles/base/color/magenta/themes/dark-high-contrast.scss b/ui/packages/consul-ui/app/styles/base/color/magenta/themes/dark-high-contrast.scss deleted file mode 100644 index 53a1d2077f6..00000000000 --- a/ui/packages/consul-ui/app/styles/base/color/magenta/themes/dark-high-contrast.scss +++ /dev/null @@ -1,18 +0,0 @@ -%theme-dark-low-contrast { - --tone-magenta-000: var(--white); - --tone-magenta-050: var(--magenta-050); - --tone-magenta-100: var(--magenta-100); - --tone-magenta-150: var(--magenta-150); - --tone-magenta-200: var(--magenta-200); - --tone-magenta-300: var(--magenta-300); - --tone-magenta-400: var(--magenta-400); - --tone-magenta-500: var(--magenta-500); - --tone-magenta-600: var(--magenta-600); - --tone-magenta-700: var(--magenta-700); - --tone-magenta-800: var(--magenta-800); - --tone-magenta-850: var(--magenta-850); - --tone-magenta-900: var(--magenta-900); - --tone-magenta-950: var(--magenta-950); - --tone-magenta-999: var(--black); -} - diff --git a/ui/packages/consul-ui/app/styles/base/color/magenta/themes/dark.scss b/ui/packages/consul-ui/app/styles/base/color/magenta/themes/dark.scss deleted file mode 100644 index 85a300e4a93..00000000000 --- a/ui/packages/consul-ui/app/styles/base/color/magenta/themes/dark.scss +++ /dev/null @@ -1,18 +0,0 @@ -%theme-dark { - --tone-magenta-000: var(--white); - --tone-magenta-050: var(--magenta-050); - --tone-magenta-100: var(--magenta-100); - --tone-magenta-150: var(--magenta-150); - --tone-magenta-200: var(--magenta-200); - --tone-magenta-300: var(--magenta-300); - --tone-magenta-400: var(--magenta-400); - --tone-magenta-500: var(--magenta-500); - --tone-magenta-600: var(--magenta-600); - --tone-magenta-700: var(--magenta-700); - --tone-magenta-800: var(--magenta-800); - --tone-magenta-850: var(--magenta-850); - --tone-magenta-900: var(--magenta-900); - --tone-magenta-950: var(--magenta-950); - --tone-magenta-999: var(--black); -} - diff --git a/ui/packages/consul-ui/app/styles/base/color/magenta/themes/light-high-contrast.scss b/ui/packages/consul-ui/app/styles/base/color/magenta/themes/light-high-contrast.scss deleted file mode 100644 index bc0d03a80c4..00000000000 --- a/ui/packages/consul-ui/app/styles/base/color/magenta/themes/light-high-contrast.scss +++ /dev/null @@ -1,18 +0,0 @@ -%theme-light { - --tone-magenta-000: var(--white); - --tone-magenta-050: var(--magenta-050); - --tone-magenta-100: var(--magenta-100); - --tone-magenta-150: var(--magenta-150); - --tone-magenta-200: var(--magenta-200); - --tone-magenta-300: var(--magenta-300); - --tone-magenta-400: var(--magenta-400); - --tone-magenta-500: var(--magenta-500); - --tone-magenta-600: var(--magenta-600); - --tone-magenta-700: var(--magenta-700); - --tone-magenta-800: var(--magenta-800); - --tone-magenta-850: var(--magenta-850); - --tone-magenta-900: var(--magenta-900); - --tone-magenta-950: var(--magenta-950); - --tone-magenta-999: var(--black); -} - diff --git a/ui/packages/consul-ui/app/styles/base/color/magenta/themes/light.scss b/ui/packages/consul-ui/app/styles/base/color/magenta/themes/light.scss deleted file mode 100644 index 9c589e09ed0..00000000000 --- a/ui/packages/consul-ui/app/styles/base/color/magenta/themes/light.scss +++ /dev/null @@ -1,18 +0,0 @@ -%theme-light-high-contrast { - --tone-magenta-000: var(--white); - --tone-magenta-050: var(--magenta-050); - --tone-magenta-100: var(--magenta-100); - --tone-magenta-150: var(--magenta-150); - --tone-magenta-200: var(--magenta-200); - --tone-magenta-300: var(--magenta-300); - --tone-magenta-400: var(--magenta-400); - --tone-magenta-500: var(--magenta-500); - --tone-magenta-600: var(--magenta-600); - --tone-magenta-700: var(--magenta-700); - --tone-magenta-800: var(--magenta-800); - --tone-magenta-850: var(--magenta-850); - --tone-magenta-900: var(--magenta-900); - --tone-magenta-950: var(--magenta-950); - --tone-magenta-999: var(--black); -} - diff --git a/ui/packages/consul-ui/app/styles/base/color/semantic-variables.scss b/ui/packages/consul-ui/app/styles/base/color/semantic-variables.scss index 0681962e451..cbe413d8b34 100644 --- a/ui/packages/consul-ui/app/styles/base/color/semantic-variables.scss +++ b/ui/packages/consul-ui/app/styles/base/color/semantic-variables.scss @@ -1,27 +1,4 @@ :root { - --color-primary: var(--tone-blue-500); - --color-dangerous: var(--tone-red-500); - --color-primary-disabled: var(--tone-blue-500); - - --color-neutral: var(--tone-gray-500); - --color-action: var(--tone-blue-500); - --color-info: var(--tone-blue-500); - /*--color-active: var(--tone-blue-500); ?? form pre-focus*/ - --color-success: var(--tone-green-500); - --color-failure: var(--tone-red-500); - --color-danger: var(--tone-red-500); - --color-warning: var(--tone-yellow-500); - --color-alert: var(--tone-orange-500); - - /* --color-keyline-000: var(--white); */ - /* --color-keyline-050: var(); */ - /* --color-keyline-100: var(--gray-100); */ - /* --color-keyline-200: var(--gray-200); */ - /* --color-keyline-300: var(--gray-300); */ - /* --color-keyline-400: var(--gray-400); */ - /* --color-keyline-500: var(--gray-500); */ - /* --color-keyline-600: var(--gray-600); */ - /* --color-keyline-700: var(); */ - /* --color-keyline-800: var(); */ - /* --color-keyline-900: var(--black); */ + --color-info: var(--token-color-foreground-action); + --color-alert: var(--token-color-palette-amber-200); } diff --git a/ui/packages/consul-ui/app/styles/base/color/strawberry/frame-placeholders.scss b/ui/packages/consul-ui/app/styles/base/color/strawberry/frame-placeholders.scss deleted file mode 100644 index 589850244c7..00000000000 --- a/ui/packages/consul-ui/app/styles/base/color/strawberry/frame-placeholders.scss +++ /dev/null @@ -1,13 +0,0 @@ -%frame-strawberry-300 { - @extend %frame-border-000; - background-color: rgb(var(--tone-gray-000)); - border-color: rgb(var(--tone-strawberry-600)); - color: rgb(var(--tone-strawberry-600)); -} -%frame-strawberry-800 { - @extend %frame-border-000; - background-color: rgb(var(--tone-strawberry-500)); - border-color: rgb(var(--tone-strawberry-800)); - color: rgb(var(--tone-gray-000)); -} - diff --git a/ui/packages/consul-ui/app/styles/base/color/strawberry/index.scss b/ui/packages/consul-ui/app/styles/base/color/strawberry/index.scss deleted file mode 100644 index 3948997e771..00000000000 --- a/ui/packages/consul-ui/app/styles/base/color/strawberry/index.scss +++ /dev/null @@ -1,6 +0,0 @@ -@import './themes/light'; -@import './themes/dark'; -@import './themes/light-high-contrast'; -@import './themes/dark-high-contrast'; -@import './frame-placeholders'; - diff --git a/ui/packages/consul-ui/app/styles/base/color/strawberry/themes/dark-high-contrast.scss b/ui/packages/consul-ui/app/styles/base/color/strawberry/themes/dark-high-contrast.scss deleted file mode 100644 index 8a86b9d9c52..00000000000 --- a/ui/packages/consul-ui/app/styles/base/color/strawberry/themes/dark-high-contrast.scss +++ /dev/null @@ -1,18 +0,0 @@ -%theme-dark-high-contrast { - --tone-strawberry-000: var(--white); - --tone-strawberry-050: var(--strawberry-050); - --tone-strawberry-100: var(--strawberry-100); - --tone-strawberry-150: var(--strawberry-150); - --tone-strawberry-200: var(--strawberry-200); - --tone-strawberry-300: var(--strawberry-300); - --tone-strawberry-400: var(--strawberry-400); - --tone-strawberry-500: var(--strawberry-500); - --tone-strawberry-600: var(--strawberry-600); - --tone-strawberry-700: var(--strawberry-700); - --tone-strawberry-800: var(--strawberry-800); - --tone-strawberry-850: var(--strawberry-850); - --tone-strawberry-900: var(--strawberry-900); - --tone-strawberry-950: var(--strawberry-950); - --tone-strawberry-999: var(--black); -} - diff --git a/ui/packages/consul-ui/app/styles/base/color/strawberry/themes/dark.scss b/ui/packages/consul-ui/app/styles/base/color/strawberry/themes/dark.scss deleted file mode 100644 index ff204b2adca..00000000000 --- a/ui/packages/consul-ui/app/styles/base/color/strawberry/themes/dark.scss +++ /dev/null @@ -1,18 +0,0 @@ -%theme-dark { - --tone-strawberry-000: var(--white); - --tone-strawberry-050: var(--strawberry-050); - --tone-strawberry-100: var(--strawberry-100); - --tone-strawberry-150: var(--strawberry-150); - --tone-strawberry-200: var(--strawberry-200); - --tone-strawberry-300: var(--strawberry-300); - --tone-strawberry-400: var(--strawberry-400); - --tone-strawberry-500: var(--strawberry-500); - --tone-strawberry-600: var(--strawberry-600); - --tone-strawberry-700: var(--strawberry-700); - --tone-strawberry-800: var(--strawberry-800); - --tone-strawberry-850: var(--strawberry-850); - --tone-strawberry-900: var(--strawberry-900); - --tone-strawberry-950: var(--strawberry-950); - --tone-strawberry-999: var(--black); -} - diff --git a/ui/packages/consul-ui/app/styles/base/color/strawberry/themes/light-high-contrast.scss b/ui/packages/consul-ui/app/styles/base/color/strawberry/themes/light-high-contrast.scss deleted file mode 100644 index ccd2b783b5e..00000000000 --- a/ui/packages/consul-ui/app/styles/base/color/strawberry/themes/light-high-contrast.scss +++ /dev/null @@ -1,18 +0,0 @@ -%theme-light-high-contrast { - --tone-strawberry-000: var(--white); - --tone-strawberry-050: var(--strawberry-050); - --tone-strawberry-100: var(--strawberry-100); - --tone-strawberry-150: var(--strawberry-150); - --tone-strawberry-200: var(--strawberry-200); - --tone-strawberry-300: var(--strawberry-300); - --tone-strawberry-400: var(--strawberry-400); - --tone-strawberry-500: var(--strawberry-500); - --tone-strawberry-600: var(--strawberry-600); - --tone-strawberry-700: var(--strawberry-700); - --tone-strawberry-800: var(--strawberry-800); - --tone-strawberry-850: var(--strawberry-850); - --tone-strawberry-900: var(--strawberry-900); - --tone-strawberry-950: var(--strawberry-950); - --tone-strawberry-999: var(--black); -} - diff --git a/ui/packages/consul-ui/app/styles/base/color/strawberry/themes/light.scss b/ui/packages/consul-ui/app/styles/base/color/strawberry/themes/light.scss deleted file mode 100644 index 4efb00acd9b..00000000000 --- a/ui/packages/consul-ui/app/styles/base/color/strawberry/themes/light.scss +++ /dev/null @@ -1,18 +0,0 @@ -%theme-light { - --tone-strawberry-000: var(--white); - --tone-strawberry-050: var(--strawberry-050); - --tone-strawberry-100: var(--strawberry-100); - --tone-strawberry-150: var(--strawberry-150); - --tone-strawberry-200: var(--strawberry-200); - --tone-strawberry-300: var(--strawberry-300); - --tone-strawberry-400: var(--strawberry-400); - --tone-strawberry-500: var(--strawberry-500); - --tone-strawberry-600: var(--strawberry-600); - --tone-strawberry-700: var(--strawberry-700); - --tone-strawberry-800: var(--strawberry-800); - --tone-strawberry-850: var(--strawberry-850); - --tone-strawberry-900: var(--strawberry-900); - --tone-strawberry-950: var(--strawberry-950); - --tone-strawberry-999: var(--black); -} - diff --git a/ui/packages/consul-ui/app/styles/base/color/theme-placeholders.scss b/ui/packages/consul-ui/app/styles/base/color/theme-placeholders.scss deleted file mode 100644 index 6dfb551affa..00000000000 --- a/ui/packages/consul-ui/app/styles/base/color/theme-placeholders.scss +++ /dev/null @@ -1,91 +0,0 @@ -%theme-light { - --tone-gray-000: var(--white); - --tone-gray-050: var(--gray-050); - --tone-gray-100: var(--gray-100); - --tone-gray-150: var(--gray-150); - --tone-gray-200: var(--gray-200); - --tone-gray-300: var(--gray-300); - --tone-gray-400: var(--gray-400); - --tone-gray-500: var(--gray-500); - --tone-gray-600: var(--gray-600); - --tone-gray-700: var(--gray-700); - --tone-gray-800: var(--gray-800); - --tone-gray-850: var(--gray-850); - --tone-gray-900: var(--gray-900); - --tone-gray-950: var(--gray-950); - --tone-gray-999: var(--black); - - --tone-blue-500: var(--blue-500); - - --tone-transparent: var(--transparent); -} - -%theme-high-contrast { - --tone-transparent: var(--transparent); -} -%theme-low-contrast { - --tone-transparent: var(--transparent); -} -%theme-light-low-contrast { - --tone-transparent: var(--transparent); -} -%theme-dark-low-contrast { - --tone-transparent: var(--transparent); -} -%theme-light-high-contrast { - --tone-gray-000: var(--white); - --tone-gray-050: var(--white); - --tone-gray-100: var(--white); - --tone-gray-150: var(--white); - --tone-gray-200: var(--white); - --tone-gray-300: var(--white); - --tone-gray-400: var(--white); - --tone-gray-500: var(--gray-500); - --tone-gray-600: var(--black); - --tone-gray-700: var(--black); - --tone-gray-800: var(--black); - --tone-gray-850: var(--black); - --tone-gray-900: var(--black); - --tone-gray-950: var(--black); - --tone-gray-999: var(--black); - - --tone-transparent: var(--transparent); -} -%theme-dark-high-contrast { - --tone-gray-000: var(--black); - --tone-gray-050: var(--black); - --tone-gray-100: var(--black); - --tone-gray-150: var(--black); - --tone-gray-200: var(--black); - --tone-gray-300: var(--black); - --tone-gray-400: var(--black); - --tone-gray-500: var(--gray-500); - --tone-gray-600: var(--white); - --tone-gray-700: var(--white); - --tone-gray-800: var(--white); - --tone-gray-850: var(--white); - --tone-gray-900: var(--white); - --tone-gray-950: var(--white); - --tone-gray-999: var(--white); - - --tone-transparent: var(--transparent); -} -%theme-dark { - --tone-gray-000: var(--$black); - --tone-gray-050: var(--$gray-950); - --tone-gray-100: var(--$gray-900); - --tone-gray-150: var(--$gray-850); - --tone-gray-200: var(--$gray-800); - --tone-gray-300: var(--$gray-700); - --tone-gray-400: var(--$gray-600); - --tone-gray-500: var(--$gray-500); - --tone-gray-600: var(--$gray-400); - --tone-gray-700: var(--$gray-300); - --tone-gray-800: var(--$gray-200); - --tone-gray-850: var(--$gray-150); - --tone-gray-900: var(--$gray-100); - --tone-gray-950: var(--$gray-050); - --tone-gray-999: var(--$white); - - --tone-transparent: var(--transparent); -} diff --git a/ui/packages/consul-ui/app/styles/base/color/ui/frame-placeholders.scss b/ui/packages/consul-ui/app/styles/base/color/ui/frame-placeholders.scss index 4f0cf22e0fb..e82ba9d33f0 100644 --- a/ui/packages/consul-ui/app/styles/base/color/ui/frame-placeholders.scss +++ b/ui/packages/consul-ui/app/styles/base/color/ui/frame-placeholders.scss @@ -6,182 +6,156 @@ /* same as decor-border-000 - but need to think about being able to import color on its own*/ border-style: solid; } -%frame-brand-300 { - @extend %frame-border-000; - background-color: var(--transparent); - border-color: rgb(var(--decor-brand-600)); - color: rgb(var(--typo-brand-600)); -} /* possibly filter bar */ /* modal close button */ %frame-gray-050 { @extend %frame-border-000; - background-color: rgb(var(--tone-gray-050)); - border-color: rgb(var(--tone-gray-300)); - color: rgb(var(--tone-gray-400)); -} -/* modal main content */ -%frame-gray-100 { - @extend %frame-border-000; - background-color: rgb(var(--tone-gray-000)); - border-color: rgb(var(--tone-gray-300)); - color: rgb(var(--tone-gray-600)); /* wasn't set */ -} -/* hover */ -%frame-gray-200 { - @extend %frame-border-000; - background-color: var(--transparent); - border-color: rgb(var(--tone-gray-700)); - color: rgb(var(--tone-gray-800)); + background-color: var(--token-color-surface-strong); + border-color: var(--token-color-palette-neutral-300); + color: var(--token-color-foreground-disabled); } +/* button focus */ %frame-gray-300 { @extend %frame-border-000; - background-color: rgb(var(--tone-gray-000)); - border-color: rgb(var(--tone-gray-700)); - color: rgb(var(--tone-gray-800)); + background-color: var(--token-color-surface-primary); + border-color: var(--token-color-foreground-faint); + color: var(--token-color-foreground-primary); } -/* button */ -/**/ +/* button secondary*/ %frame-gray-400 { @extend %frame-border-000; - background-color: rgb(var(--tone-gray-050)); - border-color: rgb(var(--tone-gray-300)); - color: rgb(var(--tone-gray-800)); -} -%frame-gray-500 { - @extend %frame-border-000; - background-color: rgb(var(--tone-gray-050)); - border-color: rgb(var(--tone-gray-300)); - color: rgb(var(--tone-gray-400)); + background-color: var(--token-color-surface-strong); + border-color: var(--token-color-palette-neutral-300); + color: var(--token-color-foreground-primary); } /* tabs */ %frame-gray-600 { @extend %frame-border-000; - background-color: rgb(var(--tone-gray-100)); - border-color: rgb(var(--tone-gray-500)); - color: rgb(var(--tone-gray-500)); + background-color: var(--token-color-surface-strong); + border-color: var(--token-color-foreground-faint); + color: var(--token-color-foreground-primary); } -/* active */ +/* button active */ %frame-gray-700 { @extend %frame-border-000; - background-color: rgb(var(--tone-gray-200)); - border-color: rgb(var(--tone-gray-700)); - color: rgb(var(--tone-gray-800)); + background-color: var(--token-color-surface-interactive-active); + border-color: var(--token-color-foreground-faint); + color: var(--token-color-foreground-primary); } /* modal bars */ %frame-gray-800 { @extend %frame-border-000; - background-color: rgb(var(--tone-gray-050)); - border-color: rgb(var(--tone-gray-300)); - color: rgb(var(--tone-gray-900)); + background-color: var(--token-color-surface-strong); + border-color: var(--token-color-palette-neutral-300); + color: var(--token-color-foreground-strong); } %frame-gray-900 { @extend %frame-border-000; - background-color: rgb(var(--tone-gray-100)); - border-color: rgb(var(--tone-gray-300)); - color: rgb(var(--tone-gray-900)); + background-color: var(--token-color-surface-strong); + border-color: var(--token-color-palette-neutral-300); + color: var(--token-color-foreground-strong); } %frame-yellow-500 { @extend %frame-border-000; - background-color: rgb(var(--tone-yellow-050)); - border-color: rgb(var(--tone-yellow-500)); + background-color: var(--token-color-vault-gradient-faint-start); + border-color: var(--token-color-vault-brand); } %frame-yellow-800 { @extend %frame-border-000; - background-color: rgb(var(--tone-yellow-500)); - border-color: rgb(var(--tone-yellow-800)); - color: rgb(var(--tone-gray-000)); + background-color: var(--token-color-vault-brand); + border-color: var(--token-color-vault-foreground); + color: var(--token-color-surface-primary); } %frame-green-500 { @extend %frame-border-000; - background-color: rgb(var(--tone-green-050)); - border-color: rgb(var(--tone-green-500)); - color: rgb(var(--tone-green-500)); + background-color: var(--token-color-surface-success); + border-color: var(--token-color-foreground-success); + color: var(--token-color-foreground-success); } %frame-green-800 { @extend %frame-border-000; - background-color: rgb(var(--tone-green-500)); - border-color: rgb(var(--tone-green-800)); - color: rgb(var(--tone-gray-000)); + background-color: var(--token-color-foreground-success); + border-color: var(--token-color-palette-green-400); + color: var(--token-color-surface-primary); } %frame-blue-200 { @extend %frame-border-000; - background-color: rgb(var(--tone-gray-000)); - border-color: rgb(var(--tone-blue-300)); - color: rgb(var(--tone-blue-300)); + background-color: var(--token-color-surface-primary); + border-color: var(--token-color-foreground-action); + color: var(--token-color-foreground-action); } %frame-blue-300 { @extend %frame-border-000; - background-color: rgb(var(--tone-gray-000)); - border-color: rgb(var(--tone-blue-500)); - color: rgb(var(--tone-blue-500)); + background-color: var(--token-color-surface-primary); + border-color: var(--token-color-foreground-action); + color: var(--token-color-foreground-action); } %frame-blue-500 { @extend %frame-border-000; - background-color: rgb(var(--tone-blue-050)); - border-color: rgb(var(--tone-blue-500)); - color: rgb(var(--tone-blue-800)); + background-color: var(--token-color-surface-action); + border-color: var(--token-color-foreground-action); + color: var(--token-color-palette-blue-500); } %frame-blue-600 { @extend %frame-border-000; - background-color: rgb(var(--tone-blue-200)); - border-color: rgb(var(--tone-gray-400)); - color: rgb(var(--tone-blue-050)); + background-color: var(--token-color-border-action); + border-color: var(--token-color-foreground-disabled); + color: var(--token-color-surface-action); } %frame-blue-700 { @extend %frame-border-000; - background-color: rgb(var(--tone-blue-400)); - border-color: rgb(var(--tone-blue-800)); - color: rgb(var(--tone-gray-000)); + background-color: var(--token-color-foreground-action); + border-color: var(--token-color-palette-blue-500); + color: var(--token-color-surface-primary); } %frame-blue-800 { @extend %frame-border-000; - background-color: rgb(var(--tone-blue-500)); - border-color: rgb(var(--tone-blue-800)); - color: rgb(var(--tone-gray-000)); + background-color: var(--token-color-foreground-action); + border-color: var(--token-color-palette-blue-500); + color: var(--token-color-surface-primary); } %frame-blue-900 { @extend %frame-border-000; - background-color: rgb(var(--tone-blue-700)); - border-color: rgb(var(--tone-blue-800)); - color: rgb(var(--tone-gray-000)); + background-color: var(--token-color-foreground-action-active); + border-color: var(--token-color-palette-blue-500); + color: var(--token-color-surface-primary); } %frame-red-300 { @extend %frame-border-000; - background-color: var(--transparent); - border-color: rgb(var(--tone-red-500)); - color: rgb(var(--tone-red-500)); + background-color: transparent; + border-color: var(--token-color-foreground-critical); + color: var(--token-color-foreground-critical); } %frame-red-500 { @extend %frame-border-000; - background-color: rgb(var(--tone-red-050)); - border-color: rgb(var(--tone-red-500)); - color: rgb(var(--tone-red-800)); + background-color: var(--token-color-surface-critical); + border-color: var(--token-color-foreground-critical); + color: var(--token-color-foreground-critical-high-contrast); } %frame-red-600 { @extend %frame-border-000; - background-color: rgb(var(--tone-red-200)); - border-color: rgb(var(--tone-gray-400)); - color: rgb(var(--tone-gray-000)); + background-color: var(--token-color-border-critical); + border-color: var(--token-color-foreground-disabled); + color: var(--token-color-surface-primary); } %frame-red-700 { @extend %frame-border-000; - background-color: rgb(var(--tone-red-500)); - border-color: rgb(var(--tone-red-800)); - color: rgb(var(--tone-gray-000)); + background-color: var(--token-color-foreground-critical); + border-color: var(--token-color-foreground-critical-high-contrast); + color: var(--token-color-surface-primary); } %frame-red-800 { @extend %frame-border-000; - background-color: rgb(var(--tone-red-500)); - border-color: rgb(var(--tone-red-800)); - color: rgb(var(--tone-gray-000)); + background-color: var(--token-color-foreground-critical); + border-color: var(--token-color-foreground-critical-high-contrast); + color: var(--token-color-surface-primary); } %frame-red-900 { @extend %frame-border-000; - background-color: rgb(var(--tone-red-700)); - border-color: rgb(var(--tone-red-800)); - color: rgb(var(--tone-gray-000)); + background-color: var(--token-color-palette-red-400); + border-color: var(--token-color-foreground-critical-high-contrast); + color: var(--token-color-surface-primary); } diff --git a/ui/packages/consul-ui/app/styles/base/color/ui/index.scss b/ui/packages/consul-ui/app/styles/base/color/ui/index.scss index 3948997e771..b76ccea196d 100644 --- a/ui/packages/consul-ui/app/styles/base/color/ui/index.scss +++ b/ui/packages/consul-ui/app/styles/base/color/ui/index.scss @@ -1,6 +1 @@ -@import './themes/light'; -@import './themes/dark'; -@import './themes/light-high-contrast'; -@import './themes/dark-high-contrast'; @import './frame-placeholders'; - diff --git a/ui/packages/consul-ui/app/styles/base/color/ui/themes/dark-high-contrast.scss b/ui/packages/consul-ui/app/styles/base/color/ui/themes/dark-high-contrast.scss deleted file mode 100644 index 0c815c10f7c..00000000000 --- a/ui/packages/consul-ui/app/styles/base/color/ui/themes/dark-high-contrast.scss +++ /dev/null @@ -1,99 +0,0 @@ -%theme-dark-high-contrast { - --tone-gray-000: var(--black); - --tone-gray-050: var(--black); - --tone-gray-100: var(--black); - --tone-gray-150: var(--black); - --tone-gray-200: var(--black); - --tone-gray-300: var(--black); - --tone-gray-400: var(--black); - --tone-gray-500: var(--gray-500); - --tone-gray-600: var(--white); - --tone-gray-700: var(--white); - --tone-gray-800: var(--white); - --tone-gray-850: var(--white); - --tone-gray-900: var(--white); - --tone-gray-950: var(--white); - --tone-gray-999: var(--white); - - --tone-green-000: var(--white); - --tone-green-050: var(--green-050); - --tone-green-100: var(--green-100); - --tone-green-150: var(--green-150); - --tone-green-200: var(--green-200); - --tone-green-300: var(--green-300); - --tone-green-400: var(--green-400); - --tone-green-500: var(--green-500); - --tone-green-600: var(--green-600); - --tone-green-700: var(--green-700); - --tone-green-800: var(--green-800); - --tone-green-850: var(--green-850); - --tone-green-900: var(--green-900); - --tone-green-950: var(--green-950); - --tone-green-999: var(--black); - - --tone-blue-000: var(--white); - --tone-blue-050: var(--blue-050); - --tone-blue-100: var(--blue-100); - --tone-blue-150: var(--blue-150); - --tone-blue-200: var(--blue-200); - --tone-blue-300: var(--blue-300); - --tone-blue-400: var(--blue-400); - --tone-blue-500: var(--blue-500); - --tone-blue-600: var(--blue-600); - --tone-blue-700: var(--blue-700); - --tone-blue-800: var(--blue-800); - --tone-blue-850: var(--blue-850); - --tone-blue-900: var(--blue-900); - --tone-blue-950: var(--blue-950); - --tone-blue-999: var(--black); - - --tone-red-000: var(--white); - --tone-red-050: var(--red-050); - --tone-red-100: var(--red-100); - --tone-red-150: var(--red-150); - --tone-red-200: var(--red-200); - --tone-red-300: var(--red-300); - --tone-red-400: var(--red-400); - --tone-red-500: var(--red-500); - --tone-red-600: var(--red-600); - --tone-red-700: var(--red-700); - --tone-red-800: var(--red-800); - --tone-red-850: var(--red-850); - --tone-red-900: var(--red-900); - --tone-red-950: var(--red-950); - --tone-red-999: var(--black); - - --tone-orange-000: var(--white); - --tone-orange-050: var(--orange-050); - --tone-orange-100: var(--orange-100); - --tone-orange-150: var(--orange-150); - --tone-orange-200: var(--orange-200); - --tone-orange-300: var(--orange-300); - --tone-orange-400: var(--orange-400); - --tone-orange-500: var(--orange-500); - --tone-orange-600: var(--orange-600); - --tone-orange-700: var(--orange-700); - --tone-orange-800: var(--orange-800); - --tone-orange-850: var(--orange-850); - --tone-orange-900: var(--orange-900); - --tone-orange-950: var(--orange-950); - --tone-orange-999: var(--black); - - --tone-yellow-000: var(--white); - --tone-yellow-050: var(--yellow-050); - --tone-yellow-100: var(--yellow-100); - --tone-yellow-150: var(--yellow-150); - --tone-yellow-200: var(--yellow-200); - --tone-yellow-300: var(--yellow-300); - --tone-yellow-400: var(--yellow-400); - --tone-yellow-500: var(--yellow-500); - --tone-yellow-600: var(--yellow-600); - --tone-yellow-700: var(--yellow-700); - --tone-yellow-800: var(--yellow-800); - --tone-yellow-850: var(--yellow-850); - --tone-yellow-900: var(--yellow-900); - --tone-yellow-950: var(--yellow-950); - --tone-yellow-999: var(--black); - - --tone-transparent: var(--transparent); -} diff --git a/ui/packages/consul-ui/app/styles/base/color/ui/themes/dark.scss b/ui/packages/consul-ui/app/styles/base/color/ui/themes/dark.scss deleted file mode 100644 index 27f809fc1bf..00000000000 --- a/ui/packages/consul-ui/app/styles/base/color/ui/themes/dark.scss +++ /dev/null @@ -1,99 +0,0 @@ -%theme-dark { - --tone-gray-000: var(--black); - --tone-gray-050: var(--gray-950); - --tone-gray-100: var(--gray-900); - --tone-gray-150: var(--gray-850); - --tone-gray-200: var(--gray-800); - --tone-gray-300: var(--gray-700); - --tone-gray-400: var(--gray-600); - --tone-gray-500: var(--gray-500); - --tone-gray-600: var(--gray-400); - --tone-gray-700: var(--gray-300); - --tone-gray-800: var(--gray-200); - --tone-gray-850: var(--gray-250); - --tone-gray-900: var(--gray-100); - --tone-gray-950: var(--gray-050); - --tone-gray-999: var(--white); - - --tone-green-000: var(--white); - --tone-green-050: var(--green-050); - --tone-green-100: var(--green-100); - --tone-green-150: var(--green-150); - --tone-green-200: var(--green-200); - --tone-green-300: var(--green-300); - --tone-green-400: var(--green-400); - --tone-green-500: var(--green-500); - --tone-green-600: var(--green-600); - --tone-green-700: var(--green-700); - --tone-green-800: var(--green-800); - --tone-green-850: var(--green-850); - --tone-green-900: var(--green-900); - --tone-green-950: var(--green-950); - --tone-green-999: var(--black); - - --tone-blue-000: var(--white); - --tone-blue-050: var(--blue-050); - --tone-blue-100: var(--blue-100); - --tone-blue-150: var(--blue-150); - --tone-blue-200: var(--blue-200); - --tone-blue-300: var(--blue-300); - --tone-blue-400: var(--blue-400); - --tone-blue-500: var(--blue-500); - --tone-blue-600: var(--blue-600); - --tone-blue-700: var(--blue-700); - --tone-blue-800: var(--blue-800); - --tone-blue-850: var(--blue-850); - --tone-blue-900: var(--blue-900); - --tone-blue-950: var(--blue-950); - --tone-blue-999: var(--black); - - --tone-red-000: var(--white); - --tone-red-050: var(--red-050); - --tone-red-100: var(--red-100); - --tone-red-150: var(--red-150); - --tone-red-200: var(--red-200); - --tone-red-300: var(--red-300); - --tone-red-400: var(--red-400); - --tone-red-500: var(--red-500); - --tone-red-600: var(--red-600); - --tone-red-700: var(--red-700); - --tone-red-800: var(--red-800); - --tone-red-850: var(--red-850); - --tone-red-900: var(--red-900); - --tone-red-950: var(--red-950); - --tone-red-999: var(--black); - - --tone-orange-000: var(--white); - --tone-orange-050: var(--orange-050); - --tone-orange-100: var(--orange-100); - --tone-orange-150: var(--orange-150); - --tone-orange-200: var(--orange-200); - --tone-orange-300: var(--orange-300); - --tone-orange-400: var(--orange-400); - --tone-orange-500: var(--orange-500); - --tone-orange-600: var(--orange-600); - --tone-orange-700: var(--orange-700); - --tone-orange-800: var(--orange-800); - --tone-orange-850: var(--orange-850); - --tone-orange-900: var(--orange-900); - --tone-orange-950: var(--orange-950); - --tone-orange-999: var(--black); - - --tone-yellow-000: var(--black); - --tone-yellow-050: var(--blue-950); - --tone-yellow-100: var(--yellow-900); - --tone-yellow-150: var(--yellow-850); - --tone-yellow-200: var(--yellow-800); - --tone-yellow-300: var(--yellow-700); - --tone-yellow-400: var(--yellow-600); - --tone-yellow-500: var(--yellow-500); - --tone-yellow-600: var(--yellow-400); - --tone-yellow-700: var(--yellow-300); - --tone-yellow-800: var(--yellow-200); - --tone-yellow-850: var(--yellow-250); - --tone-yellow-900: var(--yellow-100); - --tone-yellow-950: var(--yellow-050); - --tone-yellow-999: var(--white); - - --tone-transparent: var(--transparent); -} diff --git a/ui/packages/consul-ui/app/styles/base/color/ui/themes/light-high-contrast.scss b/ui/packages/consul-ui/app/styles/base/color/ui/themes/light-high-contrast.scss deleted file mode 100644 index 676de6b15f2..00000000000 --- a/ui/packages/consul-ui/app/styles/base/color/ui/themes/light-high-contrast.scss +++ /dev/null @@ -1,99 +0,0 @@ -%theme-light-high-contrast { - --tone-gray-000: var(--white); - --tone-gray-050: var(--white); - --tone-gray-100: var(--white); - --tone-gray-150: var(--white); - --tone-gray-200: var(--white); - --tone-gray-300: var(--white); - --tone-gray-400: var(--white); - --tone-gray-500: var(--gray-500); - --tone-gray-600: var(--black); - --tone-gray-700: var(--black); - --tone-gray-800: var(--black); - --tone-gray-850: var(--black); - --tone-gray-900: var(--black); - --tone-gray-950: var(--black); - --tone-gray-999: var(--black); - - --tone-green-000: var(--white); - --tone-green-050: var(--green-050); - --tone-green-100: var(--green-100); - --tone-green-150: var(--green-150); - --tone-green-200: var(--green-200); - --tone-green-300: var(--green-300); - --tone-green-400: var(--green-400); - --tone-green-500: var(--green-500); - --tone-green-600: var(--green-600); - --tone-green-700: var(--green-700); - --tone-green-800: var(--green-800); - --tone-green-850: var(--green-850); - --tone-green-900: var(--green-900); - --tone-green-950: var(--green-950); - --tone-green-999: var(--black); - - --tone-blue-000: var(--white); - --tone-blue-050: var(--blue-050); - --tone-blue-100: var(--blue-100); - --tone-blue-150: var(--blue-150); - --tone-blue-200: var(--blue-200); - --tone-blue-300: var(--blue-300); - --tone-blue-400: var(--blue-400); - --tone-blue-500: var(--blue-500); - --tone-blue-600: var(--blue-600); - --tone-blue-700: var(--blue-700); - --tone-blue-800: var(--blue-800); - --tone-blue-850: var(--blue-850); - --tone-blue-900: var(--blue-900); - --tone-blue-950: var(--blue-950); - --tone-blue-999: var(--black); - - --tone-red-000: var(--white); - --tone-red-050: var(--red-050); - --tone-red-100: var(--red-100); - --tone-red-150: var(--red-150); - --tone-red-200: var(--red-200); - --tone-red-300: var(--red-300); - --tone-red-400: var(--red-400); - --tone-red-500: var(--red-500); - --tone-red-600: var(--red-600); - --tone-red-700: var(--red-700); - --tone-red-800: var(--red-800); - --tone-red-850: var(--red-850); - --tone-red-900: var(--red-900); - --tone-red-950: var(--red-950); - --tone-red-999: var(--black); - - --tone-orange-000: var(--white); - --tone-orange-050: var(--orange-050); - --tone-orange-100: var(--orange-100); - --tone-orange-150: var(--orange-150); - --tone-orange-200: var(--orange-200); - --tone-orange-300: var(--orange-300); - --tone-orange-400: var(--orange-400); - --tone-orange-500: var(--orange-500); - --tone-orange-600: var(--orange-600); - --tone-orange-700: var(--orange-700); - --tone-orange-800: var(--orange-800); - --tone-orange-850: var(--orange-850); - --tone-orange-900: var(--orange-900); - --tone-orange-950: var(--orange-950); - --tone-orange-999: var(--black); - - --tone-yellow-000: var(--white); - --tone-yellow-050: var(--yellow-050); - --tone-yellow-100: var(--yellow-100); - --tone-yellow-150: var(--yellow-150); - --tone-yellow-200: var(--yellow-200); - --tone-yellow-300: var(--yellow-300); - --tone-yellow-400: var(--yellow-400); - --tone-yellow-500: var(--yellow-500); - --tone-yellow-600: var(--yellow-600); - --tone-yellow-700: var(--yellow-700); - --tone-yellow-800: var(--yellow-800); - --tone-yellow-850: var(--yellow-850); - --tone-yellow-900: var(--yellow-900); - --tone-yellow-950: var(--yellow-950); - --tone-yellow-999: var(--black); - - --tone-transparent: var(--transparent); -} diff --git a/ui/packages/consul-ui/app/styles/base/color/ui/themes/light.scss b/ui/packages/consul-ui/app/styles/base/color/ui/themes/light.scss deleted file mode 100644 index 7497280ba09..00000000000 --- a/ui/packages/consul-ui/app/styles/base/color/ui/themes/light.scss +++ /dev/null @@ -1,99 +0,0 @@ -%theme-light { - --tone-gray-000: var(--white); - --tone-gray-050: var(--gray-050); - --tone-gray-100: var(--gray-100); - --tone-gray-150: var(--gray-150); - --tone-gray-200: var(--gray-200); - --tone-gray-300: var(--gray-300); - --tone-gray-400: var(--gray-400); - --tone-gray-500: var(--gray-500); - --tone-gray-600: var(--gray-600); - --tone-gray-700: var(--gray-700); - --tone-gray-800: var(--gray-800); - --tone-gray-850: var(--gray-850); - --tone-gray-900: var(--gray-900); - --tone-gray-950: var(--gray-950); - --tone-gray-999: var(--black); - - --tone-green-000: var(--white); - --tone-green-050: var(--green-050); - --tone-green-100: var(--green-100); - --tone-green-150: var(--green-150); - --tone-green-200: var(--green-200); - --tone-green-300: var(--green-300); - --tone-green-400: var(--green-400); - --tone-green-500: var(--green-500); - --tone-green-600: var(--green-600); - --tone-green-700: var(--green-700); - --tone-green-800: var(--green-800); - --tone-green-850: var(--green-850); - --tone-green-900: var(--green-900); - --tone-green-950: var(--green-950); - --tone-green-999: var(--black); - - --tone-blue-000: var(--white); - --tone-blue-050: var(--blue-050); - --tone-blue-100: var(--blue-100); - --tone-blue-150: var(--blue-150); - --tone-blue-200: var(--blue-200); - --tone-blue-300: var(--blue-300); - --tone-blue-400: var(--blue-400); - --tone-blue-500: var(--blue-500); - --tone-blue-600: var(--blue-600); - --tone-blue-700: var(--blue-700); - --tone-blue-800: var(--blue-800); - --tone-blue-850: var(--blue-850); - --tone-blue-900: var(--blue-900); - --tone-blue-950: var(--blue-950); - --tone-blue-999: var(--black); - - --tone-red-000: var(--white); - --tone-red-050: var(--red-050); - --tone-red-100: var(--red-100); - --tone-red-150: var(--red-150); - --tone-red-200: var(--red-200); - --tone-red-300: var(--red-300); - --tone-red-400: var(--red-400); - --tone-red-500: var(--red-500); - --tone-red-600: var(--red-600); - --tone-red-700: var(--red-700); - --tone-red-800: var(--red-800); - --tone-red-850: var(--red-850); - --tone-red-900: var(--red-900); - --tone-red-950: var(--red-950); - --tone-red-999: var(--black); - - --tone-orange-000: var(--white); - --tone-orange-050: var(--orange-050); - --tone-orange-100: var(--orange-100); - --tone-orange-150: var(--orange-150); - --tone-orange-200: var(--orange-200); - --tone-orange-300: var(--orange-300); - --tone-orange-400: var(--orange-400); - --tone-orange-500: var(--orange-500); - --tone-orange-600: var(--orange-600); - --tone-orange-700: var(--orange-700); - --tone-orange-800: var(--orange-800); - --tone-orange-850: var(--orange-850); - --tone-orange-900: var(--orange-900); - --tone-orange-950: var(--orange-950); - --tone-orange-999: var(--black); - - --tone-yellow-000: var(--white); - --tone-yellow-050: var(--yellow-050); - --tone-yellow-100: var(--yellow-100); - --tone-yellow-150: var(--yellow-150); - --tone-yellow-200: var(--yellow-200); - --tone-yellow-300: var(--yellow-300); - --tone-yellow-400: var(--yellow-400); - --tone-yellow-500: var(--yellow-500); - --tone-yellow-600: var(--yellow-600); - --tone-yellow-700: var(--yellow-700); - --tone-yellow-800: var(--yellow-800); - --tone-yellow-850: var(--yellow-850); - --tone-yellow-900: var(--yellow-900); - --tone-yellow-950: var(--yellow-950); - --tone-yellow-999: var(--black); - - --tone-transparent: var(--transparent); -} diff --git a/ui/packages/consul-ui/app/styles/base/color/vault/frame-placeholders.scss b/ui/packages/consul-ui/app/styles/base/color/vault/frame-placeholders.scss deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/ui/packages/consul-ui/app/styles/base/color/vault/index.scss b/ui/packages/consul-ui/app/styles/base/color/vault/index.scss deleted file mode 100644 index 74aa4c7b113..00000000000 --- a/ui/packages/consul-ui/app/styles/base/color/vault/index.scss +++ /dev/null @@ -1,6 +0,0 @@ -@import '../lemon'; -@import './themes/light'; -@import './themes/dark'; -@import './themes/light-high-contrast'; -@import './themes/dark-high-contrast'; -@import './frame-placeholders'; diff --git a/ui/packages/consul-ui/app/styles/base/color/vault/themes/dark-high-contrast.scss b/ui/packages/consul-ui/app/styles/base/color/vault/themes/dark-high-contrast.scss deleted file mode 100644 index 00bcce3c6ce..00000000000 --- a/ui/packages/consul-ui/app/styles/base/color/vault/themes/dark-high-contrast.scss +++ /dev/null @@ -1,3 +0,0 @@ -%theme-dark-high-contrast { - --tone-vault-500: var(--lemon-500); -} diff --git a/ui/packages/consul-ui/app/styles/base/color/vault/themes/dark.scss b/ui/packages/consul-ui/app/styles/base/color/vault/themes/dark.scss deleted file mode 100644 index d873db15903..00000000000 --- a/ui/packages/consul-ui/app/styles/base/color/vault/themes/dark.scss +++ /dev/null @@ -1,3 +0,0 @@ -%theme-dark { - --tone-vault-500: var(--lemon-500); -} diff --git a/ui/packages/consul-ui/app/styles/base/color/vault/themes/light-high-contrast.scss b/ui/packages/consul-ui/app/styles/base/color/vault/themes/light-high-contrast.scss deleted file mode 100644 index cac38c06a04..00000000000 --- a/ui/packages/consul-ui/app/styles/base/color/vault/themes/light-high-contrast.scss +++ /dev/null @@ -1,3 +0,0 @@ -%theme-light-high-contrast { - --tone-vault-500: var(--black); -} diff --git a/ui/packages/consul-ui/app/styles/base/color/vault/themes/light.scss b/ui/packages/consul-ui/app/styles/base/color/vault/themes/light.scss deleted file mode 100644 index 669ed33f7e5..00000000000 --- a/ui/packages/consul-ui/app/styles/base/color/vault/themes/light.scss +++ /dev/null @@ -1,3 +0,0 @@ -%theme-light { - --tone-vault-500: var(--black); -} diff --git a/ui/packages/consul-ui/app/styles/base/decoration/base-variables.scss b/ui/packages/consul-ui/app/styles/base/decoration/base-variables.scss index d2ee83711ce..83f83098797 100644 --- a/ui/packages/consul-ui/app/styles/base/decoration/base-variables.scss +++ b/ui/packages/consul-ui/app/styles/base/decoration/base-variables.scss @@ -13,13 +13,4 @@ --decor-border-200: 2px solid; --decor-border-300: 3px solid; --decor-border-400: 4px solid; - - /* box-shadowing*/ - --decor-elevation-000: none; - --decor-elevation-100: 0 3px 2px rgb(var(--black) / 6%); - --decor-elevation-200: 0 2px 4px rgb(var(--black) / 10%); - --decor-elevation-300: 0 5px 1px -2px rgb(var(--black) / 12%); - --decor-elevation-400: 0 6px 8px -2px rgb(var(--black) / 5%), 0 8px 4px -4px rgb(var(--black) / 10%); - --decor-elevation-600: 0 12px 5px -7px rgb(var(--black) / 8%), 0 11px 10px -3px rgb(var(--black) / 10%); - --decor-elevation-800: 0 16px 6px -10px rgb(var(--black) / 6%), 0 16px 16px -4px rgb(var(--black) / 20%); } diff --git a/ui/packages/consul-ui/app/styles/base/icons/README.mdx b/ui/packages/consul-ui/app/styles/base/icons/README.mdx index 4193e40fc30..9b7681b747f 100644 --- a/ui/packages/consul-ui/app/styles/base/icons/README.mdx +++ b/ui/packages/consul-ui/app/styles/base/icons/README.mdx @@ -44,7 +44,7 @@ selectors. ```css .selector::after { --icon-name: icon-alert-circle; - --icon-color: rgb(var(---white)); + --icon-color: var(--token-color-surface-primary); content: ''; } ``` @@ -56,9 +56,9 @@ icons in HTML using these CSS properties.

    Header Name @@ -105,7 +105,7 @@ also use `background-color`. ```css .selector::before { @extend %with-alert-circle-fill-mask, %as-pseudo; - color: rgb(var(--tone-strawberry-500)); + color: var(--token-color-consul-brand); } ``` @@ -141,7 +141,7 @@ use `-mask`, use `-icon` instead: {{css-props (set this 'icons') prefix='icon-'}} class={{class-map (concat 'theme-' (or this.theme 'light'))}} style={{style-map - (array '--icon-color' (if (eq this.type 'monochrome') 'rgb(var(--black))')) + (array '--icon-color' (if (eq this.type 'monochrome') 'var(--token-color-hashicorp-brand)')) (array '--icon-size' (concat 'icon-' (or this.size '500'))) (array '--icon-resolution' (if (gt this.size 500) '.5' '1')) }} diff --git a/ui/packages/consul-ui/app/styles/base/icons/base-placeholders.scss b/ui/packages/consul-ui/app/styles/base/icons/base-placeholders.scss index 2e101b44a48..216b81abc69 100644 --- a/ui/packages/consul-ui/app/styles/base/icons/base-placeholders.scss +++ b/ui/packages/consul-ui/app/styles/base/icons/base-placeholders.scss @@ -1,14 +1,6 @@ -%theme-light { - --theme-dark-none: ; - --theme-light-none: initial; -} -%theme-dark { - --theme-dark-none: initial; - --theme-light-none: ; -} %with-glyph-icon { font-weight: var(--typo-weight-normal); - background-color: rgb(var(--tone-gray-100)); + background-color: var(--token-color-surface-strong); visibility: visible; padding: 0 4px; } diff --git a/ui/packages/consul-ui/app/styles/base/icons/icons/index.scss b/ui/packages/consul-ui/app/styles/base/icons/icons/index.scss index 149e3e7f684..d1671cad01c 100644 --- a/ui/packages/consul-ui/app/styles/base/icons/icons/index.scss +++ b/ui/packages/consul-ui/app/styles/base/icons/icons/index.scss @@ -583,7 +583,6 @@ // @import './users/index.scss'; // @import './vagrant/index.scss'; // @import './vagrant-color/index.scss'; -@import './vault/index.scss'; // @import './vault-color/index.scss'; // @import './verified/index.scss'; // @import './video/index.scss'; diff --git a/ui/packages/consul-ui/app/styles/base/icons/icons/vault/keyframes.scss b/ui/packages/consul-ui/app/styles/base/icons/icons/vault/keyframes.scss index 89c1ccfc4e6..38ca7831352 100644 --- a/ui/packages/consul-ui/app/styles/base/icons/icons/vault/keyframes.scss +++ b/ui/packages/consul-ui/app/styles/base/icons/icons/vault/keyframes.scss @@ -1,9 +1,7 @@ @keyframes icon-vault { 100% { - -webkit-mask-image: var(--icon-vault-color-16); mask-image: var(--icon-vault-color-16); - background-color: var(--icon-color, var(--color-vault-500, currentColor)); - + background-color: var(--icon-color, var(--color-vault, currentColor)); } -} \ No newline at end of file +} diff --git a/ui/packages/consul-ui/app/styles/base/icons/overrides.scss b/ui/packages/consul-ui/app/styles/base/icons/overrides.scss index b0cccf32187..dd8570339a1 100644 --- a/ui/packages/consul-ui/app/styles/base/icons/overrides.scss +++ b/ui/packages/consul-ui/app/styles/base/icons/overrides.scss @@ -1,5 +1,5 @@ %without-mask { -webkit-mask-image: none; mask-image: none; - background-color: var(--transparent) !important; + background-color: transparent !important; } diff --git a/ui/packages/consul-ui/app/styles/base/reset/system.scss b/ui/packages/consul-ui/app/styles/base/reset/system.scss index 23954385d8d..3d69534286e 100644 --- a/ui/packages/consul-ui/app/styles/base/reset/system.scss +++ b/ui/packages/consul-ui/app/styles/base/reset/system.scss @@ -9,19 +9,18 @@ strong { } /* %typo-body */ body { - color: rgb(var(--tone-gray-900)); + color: var(--token-color-foreground-strong); } /* TODO: Consider changing this to 'p a, dd a, td a' etc etc */ a { - color: rgb(var(--color-action)); + color: var(--token-color-foreground-action); } html { - background-color: rgb(var(--tone-gray-000)); + background-color: var(--token-color-surface-primary); } hr { - background-color: rgb(var(--tone-gray-200)); + background-color: var(--token-color-surface-interactive-active); } - html { font-size: var(--typo-size-000); } diff --git a/ui/packages/consul-ui/app/styles/debug.scss b/ui/packages/consul-ui/app/styles/debug.scss index 718ae65ace5..c168da2cb31 100644 --- a/ui/packages/consul-ui/app/styles/debug.scss +++ b/ui/packages/consul-ui/app/styles/debug.scss @@ -11,9 +11,6 @@ @import 'consul-ui/components/inline-alert/debug'; @import 'consul-ui/components/definition-table/debug'; -.theme-dark { - @extend %theme-dark; -} %debug-grid { display: flex; flex-wrap: wrap; @@ -43,7 +40,7 @@ [id^='docfy-demo-preview-typography'] figure, [id^='docfy-demo-preview-icons'] figure { border: var(--decor-border-100); - border-color: rgb(var(--tone-gray-300)); + border-color: var(--token-color-palette-neutral-300); height: 80px; } @@ -55,12 +52,10 @@ height: 40px; } #docfy-demo-preview-color0 { - @extend %theme-light; - background-color: rgb(var(--white)); + background-color: var(--token-color-surface-primary); } #docfy-demo-preview-color1 { - background-color: rgb(var(--black)); - @extend %theme-dark; + background-color: var(--token-color-hashicorp-brand); } [id^='docfy-demo-preview-typography'] { @@ -140,7 +135,7 @@ html.with-route-announcer .route-title { } .docs { & { - background-color: rgb(var(--tone-gray-000)); + background-color: var(--token-color-surface-primary); } .tabular-collection, .list-collection { @@ -235,7 +230,7 @@ html.with-route-announcer .route-title { border-top: 1px solid; border-left: 1px solid; border-right: 1px solid; - border-color: rgb(var(--tone-gray-200)); + border-color: var(--token-color-surface-interactive-active); padding: 1rem; margin-bottom: 0; } @@ -248,19 +243,19 @@ html.with-route-announcer .route-title { } figcaption { margin-bottom: 0.5rem; - color: rgb(var(--tone-gray-400)); + color: var(--token-color-foreground-disabled); font-style: italic; } figcaption code { @extend %inline-code; } figure > [type='text'] { - border: 1px solid rgb(var(--tone-gray-999)); + border: 1px solid var(--token-color-hashicorp-brand); width: 100%; padding: 0.5rem; } figure > select { - border: 1px solid rgb(var(--tone-gray-999)); + border: 1px solid var(--token-color-hashicorp-brand); padding: 0.5rem; } } diff --git a/ui/packages/consul-ui/app/styles/icons.scss b/ui/packages/consul-ui/app/styles/icons.scss index ca277f1d74d..7aa53243bf4 100644 --- a/ui/packages/consul-ui/app/styles/icons.scss +++ b/ui/packages/consul-ui/app/styles/icons.scss @@ -10,18 +10,6 @@ } } -%theme-light { - --icon-aws: icon-aws-color; - --icon-vault: icon-vault; - --color-vault-500: rgb(var(--black)); -} -%theme-dark { - --icon-aws: icon-aws; - --icon-vault: icon-vault; - --color-aws-500: rgb(var(--white)); - --color-vault-500: rgb(var(--tone-lemon-500)); -} - %with-vault-100, %with-vault-300 { --icon-name: icon-vault; @@ -29,7 +17,7 @@ } %with-aws-100, %with-aws-300 { - --icon-name: var(--icon-aws); + --icon-name: icon-aws-color; content: ''; } %with-allow-100, @@ -47,12 +35,12 @@ %with-allow-300, %with-allow-500 { --icon-name: icon-arrow-right; - --icon-color: rgb(var(--tone-green-500)); + --icon-color: var(--token-color-foreground-success-on-surface); } %with-deny-300, %with-deny-500 { --icon-name: icon-skip; - --icon-color: rgb(var(--tone-red-500)); + --icon-color: var(--token-color-foreground-critical-on-surface); } %with-l7-300, %with-l7-500 { @@ -61,7 +49,7 @@ %with-allow-500, %with-deny-500, %with-l7-500 { - --icon-resolution: .5; + --icon-resolution: 0.5; } %with-allow-300, %with-allow-500, diff --git a/ui/packages/consul-ui/app/styles/layout.scss b/ui/packages/consul-ui/app/styles/layout.scss index 1fe6db81fa8..5221f6d0884 100644 --- a/ui/packages/consul-ui/app/styles/layout.scss +++ b/ui/packages/consul-ui/app/styles/layout.scss @@ -75,6 +75,7 @@ html[data-route='dc.services.index'] .consul-service-list ul, .consul-role-list ul, .consul-policy-list ul, .consul-token-list ul, +.consul-peer-list ul, .consul-auth-method-list ul { @extend %list-after-filter-bar; } diff --git a/ui/packages/consul-ui/app/styles/layouts/index.scss b/ui/packages/consul-ui/app/styles/layouts/index.scss index f9405fbd43a..5a05d888863 100644 --- a/ui/packages/consul-ui/app/styles/layouts/index.scss +++ b/ui/packages/consul-ui/app/styles/layouts/index.scss @@ -26,7 +26,7 @@ fieldset [role='group'] { [role='group'] fieldset:not(:first-of-type) { padding-left: 20px; border-left: 1px solid; - border-left: rgb(var(--tone-gray-500)); + border-left: var(--token-color-foreground-faint); } [role='group'] fieldset:not(:last-of-type) { padding-right: 20px; diff --git a/ui/packages/consul-ui/app/styles/routes/dc/kv/index.scss b/ui/packages/consul-ui/app/styles/routes/dc/kv/index.scss index 47f238569a9..5dd632a4989 100644 --- a/ui/packages/consul-ui/app/styles/routes/dc/kv/index.scss +++ b/ui/packages/consul-ui/app/styles/routes/dc/kv/index.scss @@ -5,7 +5,7 @@ html[data-route^='dc.kv'] .type-toggle { html[data-route^='dc.kv.edit'] h2 { @extend %h200; border-bottom: var(--decor-border-200); - border-color: rgb(var(--tone-gray-200)); + border-color: var(--token-color-surface-interactive-active); padding-bottom: 0.2em; margin-bottom: 0.5em; } diff --git a/ui/packages/consul-ui/app/styles/routes/dc/overview/license.scss b/ui/packages/consul-ui/app/styles/routes/dc/overview/license.scss index 5969bde7176..26399d74f12 100644 --- a/ui/packages/consul-ui/app/styles/routes/dc/overview/license.scss +++ b/ui/packages/consul-ui/app/styles/routes/dc/overview/license.scss @@ -13,7 +13,7 @@ section[data-route='dc.show.license'] { } %license-validity p { - color: rgb(var(--tone-gray-700)); + color: var(--token-color-foreground-faint); } %license-validity dl { @extend %horizontal-kv-list; @@ -28,20 +28,20 @@ section[data-route='dc.show.license'] { } %license-validity dl .expired::before { --icon-name: icon-x-circle; - --icon-color: rgb(var(--red-500)); + --icon-color: var(--token-color-foreground-critical); } %license-validity dl .warning::before { --icon-name: icon-alert-circle; - --icon-color: rgb(var(--orange-500)); + --icon-color: var(--token-color-foreground-warning); } %license-validity dl .valid:not(.warning)::before { --icon-name: icon-check-circle; - --icon-color: rgb(var(--green-500)); + --icon-color: var(--token-color-foreground-success); } %license-route-learn-more { @extend %panel; - box-shadow: var(--decor-elevation-000); + box-shadow: none; padding: var(--padding-y) var(--padding-x); width: 40%; min-width: 413px; diff --git a/ui/packages/consul-ui/app/styles/routes/dc/overview/serverstatus.scss b/ui/packages/consul-ui/app/styles/routes/dc/overview/serverstatus.scss index 0267d352c4c..9a9d6fe64e1 100644 --- a/ui/packages/consul-ui/app/styles/routes/dc/overview/serverstatus.scss +++ b/ui/packages/consul-ui/app/styles/routes/dc/overview/serverstatus.scss @@ -20,7 +20,7 @@ section[data-route='dc.show.serverstatus'] { %server-failure-tolerance { @extend %panel; - box-shadow: var(--decor-elevation-000); + box-shadow: none; padding: var(--padding-y) var(--padding-x); max-width: 770px; display: flex; @@ -35,13 +35,13 @@ section[data-route='dc.show.serverstatus'] { padding-bottom: 0.5rem; /* 8px */ margin-bottom: 1rem; /* 16px */ border-bottom: var(--decor-border-100); - border-color: rgb(var(--tone-border)); + border-color: var(--tone-border); } %server-failure-tolerance header em { @extend %pill-200; font-size: 0.812rem; /* 13px */ - background-color: rgb(var(--tone-gray-200)); + background-color: var(--token-color-surface-interactive-active); text-transform: uppercase; font-style: normal; @@ -65,7 +65,7 @@ section[data-route='dc.show.serverstatus'] { %server-failure-tolerance dl.warning dd::before { --icon-name: icon-alert-circle; --icon-size: icon-800; - --icon-color: rgb(var(--tone-orange-400)); + --icon-color: var(--token-color-foreground-warning); content: ''; margin-right: 0.5rem; /* 8px */ } @@ -74,16 +74,16 @@ section[data-route='dc.show.serverstatus'] { } %server-failure-tolerance dt { @extend %p2; - color: rgb(var(--tone-gray-700)); + color: var(--token-color-foreground-faint); } %server-failure-tolerance dd { font-size: var(--typo-size-250); - color: rgb(var(--tone-gray-999)); + color: var(--token-color-hashicorp-brand); } %server-failure-tolerance header span::before { --icon-name: icon-info; --icon-size: icon-300; - --icon-color: rgb(var(--tone-gray-500)); + --icon-color: var(--token-color-foreground-faint); vertical-align: unset; content: ''; } @@ -116,11 +116,11 @@ section[data-route='dc.show.serverstatus'] { @extend %visually-unhidden; } %redundancy-zone header dl:not(.warning) { - background-color: rgb(var(--tone-gray-100)); + background-color: var(--token-color-surface-strong); } %redundancy-zone header dl.warning { - background-color: rgb(var(--tone-orange-100)); - color: rgb(var(--tone-orange-800)); + background-color: var(--token-color-border-warning); + color: var(--token-color-palette-amber-400); } %redundancy-zone header dl.warning::before { --icon-name: icon-alert-circle; @@ -132,5 +132,5 @@ section[data-route='dc.show.serverstatus'] { content: ':'; display: inline-block; vertical-align: revert; - background-color: var(--transparent); + background-color: transparent; } diff --git a/ui/packages/consul-ui/app/styles/routes/dc/services/index.scss b/ui/packages/consul-ui/app/styles/routes/dc/services/index.scss index ed24d44f41d..9989110cb2f 100644 --- a/ui/packages/consul-ui/app/styles/routes/dc/services/index.scss +++ b/ui/packages/consul-ui/app/styles/routes/dc/services/index.scss @@ -24,7 +24,7 @@ html[data-route^='dc.services.instance'] .tab-section section:not(:last-child) { } html[data-route^='dc.services.instance'] .tab-nav, html[data-route^='dc.services.instance'] .tab-section section:not(:last-child) { - border-color: rgb(var(--tone-gray-200)); + border-color: var(--token-color-surface-interactive-active); } html[data-route^='dc.services.instance'] .tab-section section:not(:last-child) { padding-bottom: 24px; diff --git a/ui/packages/consul-ui/app/styles/themes.scss b/ui/packages/consul-ui/app/styles/themes.scss index 69282b79e7e..c652c846575 100644 --- a/ui/packages/consul-ui/app/styles/themes.scss +++ b/ui/packages/consul-ui/app/styles/themes.scss @@ -1,26 +1,11 @@ @import './base/color/ui/index'; -@import './base/color/magenta/index'; -@import './base/color/strawberry/index'; -@import './base/color/vault/index'; -:root:not(.prefers-color-scheme-dark) { - @extend %theme-light; -} -:root.prefers-color-scheme-dark { - @extend %theme-dark; -} - -%main-header-horizontal, -%main-nav-vertical, -%main-nav-horizontal { - @extend %theme-dark; -} %main-nav-horizontal .dangerous button:hover, %main-nav-horizontal .dangerous button:focus { - color: rgb(var(--white)) !important; + color: var(--token-color-surface-primary) !important; } %main-nav-vertical .menu-panel a:hover, %main-nav-vertical .menu-panel a:focus { - background-color: rgb(var(--tone-blue-500)); + background-color: var(--token-color-foreground-action); } diff --git a/ui/packages/consul-ui/app/styles/variables/skin.scss b/ui/packages/consul-ui/app/styles/variables/skin.scss index cece201ac01..2d15e63aa35 100644 --- a/ui/packages/consul-ui/app/styles/variables/skin.scss +++ b/ui/packages/consul-ui/app/styles/variables/skin.scss @@ -1,31 +1,7 @@ @import './custom-query'; -// TODO: Setup only the CSS props we actually need here -// potentially see if our compiler can automatically remove -// unused CSS props :root { - /* base brand colors */ - --tone-brand-050: var(--tone-magenta-050); - --tone-brand-100: var(--tone-strawberry-100); - /* --tone-brand-200: var(--tone-strawberry-200) */ - /* --tone-brand-300: var(--tone-strawberry-300) */ - /* --tone-brand-400: var(--tone-strawberry-400) */ - /* --tone-brand-500: var(--tone-strawberry-500) */ - /* temporary strawberry-like color until its replaced by a numbered one */ - --tone-brand-600: 224 56 117; - /* --tone-brand-700: var(--tone-strawberry-700) */ - --tone-brand-800: var(--tone-magenta-800); - /* --tone-brand-900: var(--tone-strawberry-900) */ - - /* themeable ui colors */ - --typo-action-500: rgb(var(--tone-blue-500)); - --decor-error-500: rgb(var(--tone-red-500)); - --typo-contrast-999: rgb(var(--tone-gray-999)); - - /* themeable brand colors */ - --typo-brand-050: rgb(var(--tone-brand-050)); - --typo-brand-600: rgb(var(--tone-brand-600)); - --decor-brand-600: rgb(var(--tone-brand-600)); - --swatch-brand-600: rgb(var(--tone-brand-600)); - --swatch-brand-800: rgb(var(--tone-brand-800)); + --typo-action: var(--token-color-foreground-action); + --decor-error: var(--token-color-foreground-critical); + --typo-contrast: var(--token-color-hashicorp-brand); } From 378f01736e8b6f565fedfb0958e6dc0431a6024f Mon Sep 17 00:00:00 2001 From: Tu Nguyen Date: Mon, 27 Feb 2023 09:27:50 -0800 Subject: [PATCH 071/262] Add missing link (#16437) --- .../docs/agent/limits/set-global-traffic-rate-limits.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/content/docs/agent/limits/set-global-traffic-rate-limits.mdx b/website/content/docs/agent/limits/set-global-traffic-rate-limits.mdx index 466e0a25b01..5d4fc43df02 100644 --- a/website/content/docs/agent/limits/set-global-traffic-rate-limits.mdx +++ b/website/content/docs/agent/limits/set-global-traffic-rate-limits.mdx @@ -14,7 +14,7 @@ Rate limits apply to each Consul server separately and limit the number of read Because all requests coming to a Consul server eventually perform an RPC or an internal gRPC request, global rate limits apply to Consul's user interfaces, such as the HTTP API interface, the CLI, and the external gRPC endpoint for services in the service mesh. -Refer to [Initialize Rate Limit Settings]() for additional information about right-sizing your gRPC request configurations. +Refer to [Initialize Rate Limit Settings](/consul/docs/agent/limits/init-rate-limits) for additional information about right-sizing your gRPC request configurations. ## Set a global rate limit for a Consul server From 344411b718128c3803eb18e94f5fffebcc06a423 Mon Sep 17 00:00:00 2001 From: Bryce Kalow Date: Mon, 27 Feb 2023 11:57:47 -0600 Subject: [PATCH 072/262] docs: remove extra whitespace in frontmatter (#16436) --- .../content/docs/connect/config-entries/service-splitter.mdx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/website/content/docs/connect/config-entries/service-splitter.mdx b/website/content/docs/connect/config-entries/service-splitter.mdx index 34ea9597e21..5d94a4e38a2 100644 --- a/website/content/docs/connect/config-entries/service-splitter.mdx +++ b/website/content/docs/connect/config-entries/service-splitter.mdx @@ -1,4 +1,4 @@ ---- +--- layout: docs page_title: Service Splitter Configuration Entry Reference description: >- @@ -784,4 +784,4 @@ spec: - \ No newline at end of file + From 16064723040740b641987ff32fd60f80acffeb97 Mon Sep 17 00:00:00 2001 From: David Yu Date: Mon, 27 Feb 2023 11:10:49 -0800 Subject: [PATCH 073/262] Delete Vagrantfile (#16442) --- Vagrantfile | 66 ----------------------------------------------------- 1 file changed, 66 deletions(-) delete mode 100644 Vagrantfile diff --git a/Vagrantfile b/Vagrantfile deleted file mode 100644 index 43752be80de..00000000000 --- a/Vagrantfile +++ /dev/null @@ -1,66 +0,0 @@ -# -*- mode: ruby -*- -# vi: set ft=ruby : -# - -LINUX_BASE_BOX = "bento/ubuntu-16.04" - -Vagrant.configure(2) do |config| - config.vm.define "linux", autostart: true, primary: true do |vmCfg| - vmCfg.vm.box = LINUX_BASE_BOX - vmCfg.vm.hostname = "linux" - vmCfg = configureProviders vmCfg, - cpus: suggestedCPUCores() - - vmCfg = configureLinuxProvisioners(vmCfg) - - vmCfg.vm.synced_folder '.', - '/opt/gopath/src/github.com/hashicorp/consul' - - vmCfg.vm.network "forwarded_port", guest: 8500, host: 8500, auto_correct: true - end -end - -def configureLinuxProvisioners(vmCfg) - vmCfg.vm.provision "shell", - privileged: true, - inline: 'rm -f /home/vagrant/linux.iso' - - vmCfg.vm.provision "shell", - privileged: true, - path: './scripts/vagrant-linux-priv-go.sh' - - return vmCfg -end - -def configureProviders(vmCfg, cpus: "2", memory: "2048") - vmCfg.vm.provider "virtualbox" do |v| - v.memory = memory - v.cpus = cpus - end - - ["vmware_fusion", "vmware_workstation"].each do |p| - vmCfg.vm.provider p do |v| - v.enable_vmrun_ip_lookup = false - v.vmx["memsize"] = memory - v.vmx["numvcpus"] = cpus - end - end - - vmCfg.vm.provider "virtualbox" do |v| - v.memory = memory - v.cpus = cpus - end - - return vmCfg -end - -def suggestedCPUCores() - case RbConfig::CONFIG['host_os'] - when /darwin/ - Integer(`sysctl -n hw.ncpu`) / 2 - when /linux/ - Integer(`cat /proc/cpuinfo | grep processor | wc -l`) / 2 - else - 2 - end -end From c7713462ca2450ff240a55d78610684ea127d77f Mon Sep 17 00:00:00 2001 From: cskh Date: Mon, 27 Feb 2023 15:38:31 -0500 Subject: [PATCH 074/262] upgrade test: consolidate resolver test cases (#16443) --- .../consul-container/libs/assert/envoy.go | 33 +- .../resolver_default_subset_test.go | 467 +++++++++++++----- .../resolver_subset_onlypassing_test.go | 196 -------- .../resolver_subset_redirect_test.go | 224 --------- .../consul-container/test/upgrade/upgrade.go | 3 + 5 files changed, 381 insertions(+), 542 deletions(-) delete mode 100644 test/integration/consul-container/test/upgrade/l7_traffic_management/resolver_subset_onlypassing_test.go delete mode 100644 test/integration/consul-container/test/upgrade/l7_traffic_management/resolver_subset_redirect_test.go create mode 100644 test/integration/consul-container/test/upgrade/upgrade.go diff --git a/test/integration/consul-container/libs/assert/envoy.go b/test/integration/consul-container/libs/assert/envoy.go index 72c0ba990fb..1fdf61feae3 100644 --- a/test/integration/consul-container/libs/assert/envoy.go +++ b/test/integration/consul-container/libs/assert/envoy.go @@ -218,6 +218,23 @@ func AssertEnvoyPresentsCertURI(t *testing.T, port int, serviceName string) { } } +// AssertEnvoyRunning assert the envoy is running by querying its stats page +func AssertEnvoyRunning(t *testing.T, port int) { + var ( + err error + ) + failer := func() *retry.Timer { + return &retry.Timer{Timeout: 10 * time.Second, Wait: 500 * time.Millisecond} + } + + retry.RunWith(failer(), t, func(r *retry.R) { + _, _, err = GetEnvoyOutput(port, "stats", nil) + if err != nil { + r.Fatal("could not fetch envoy stats") + } + }) +} + func GetEnvoyOutput(port int, path string, query map[string]string) (string, int, error) { client := cleanhttp.DefaultClient() var u url.URL @@ -260,10 +277,16 @@ func sanitizeResult(s string) []string { // AssertServiceHasHealthyInstances asserts the number of instances of service equals count for a given service. // https://developer.hashicorp.com/consul/docs/connect/config-entries/service-resolver#onlypassing func AssertServiceHasHealthyInstances(t *testing.T, node libcluster.Agent, service string, onlypassing bool, count int) { - services, _, err := node.GetClient().Health().Service(service, "", onlypassing, nil) - require.NoError(t, err) - for _, v := range services { - fmt.Printf("%s service status: %s\n", v.Service.ID, v.Checks.AggregatedStatus()) + failer := func() *retry.Timer { + return &retry.Timer{Timeout: 10 * time.Second, Wait: 500 * time.Millisecond} } - require.Equal(t, count, len(services)) + + retry.RunWith(failer(), t, func(r *retry.R) { + services, _, err := node.GetClient().Health().Service(service, "", onlypassing, nil) + require.NoError(r, err) + for _, v := range services { + fmt.Printf("%s service status: %s\n", v.Service.ID, v.Checks.AggregatedStatus()) + } + require.Equal(r, count, len(services)) + }) } diff --git a/test/integration/consul-container/test/upgrade/l7_traffic_management/resolver_default_subset_test.go b/test/integration/consul-container/test/upgrade/l7_traffic_management/resolver_default_subset_test.go index bcf4093f651..2203954a44d 100644 --- a/test/integration/consul-container/test/upgrade/l7_traffic_management/resolver_default_subset_test.go +++ b/test/integration/consul-container/test/upgrade/l7_traffic_management/resolver_default_subset_test.go @@ -3,8 +3,8 @@ package upgrade import ( "context" "fmt" - "net/http" "testing" + "time" "github.com/hashicorp/consul/api" libassert "github.com/hashicorp/consul/test/integration/consul-container/libs/assert" @@ -12,141 +12,394 @@ import ( libservice "github.com/hashicorp/consul/test/integration/consul-container/libs/service" "github.com/hashicorp/consul/test/integration/consul-container/libs/topology" libutils "github.com/hashicorp/consul/test/integration/consul-container/libs/utils" + upgrade "github.com/hashicorp/consul/test/integration/consul-container/test/upgrade" "github.com/hashicorp/go-version" "github.com/stretchr/testify/require" - "gotest.tools/assert" ) -// TestTrafficManagement_ServiceResolverDefaultSubset Summary -// This test starts up 3 servers and 1 client in the same datacenter. +// TestTrafficManagement_ServiceResolver tests that upgraded cluster inherits and interpret +// the resolver config entry correctly. // -// Steps: -// - Create a single agent cluster. -// - Create one static-server and 2 subsets and 1 client and sidecar, then register them with Consul -// - Validate static-server and 2 subsets are and proxy admin endpoint is healthy - 3 instances -// - Validate static servers proxy listeners should be up and have right certs -func TestTrafficManagement_ServiceResolverDefaultSubset(t *testing.T) { +// The basic topology is a cluster with one static-client and one static-server. Addtional +// services and resolver can be added to the create func() for each test cases. +func TestTrafficManagement_ServiceResolver(t *testing.T) { t.Parallel() - var responseFormat = map[string]string{"format": "json"} - type testcase struct { - oldversion string - targetVersion string + name string + // create creates addtional resources in the cluster depending on cases, e.g., static-client, + // static server, and config-entries. It returns the proxy services of the client, an assertation + // function to be called to verify the resources, and a restartFn to be called after upgrade. + create func(*libcluster.Cluster, libservice.Service) (libservice.Service, func(), func(), error) + // extraAssertion adds additional assertion function to the common resources across cases. + // common resources includes static-client in dialing cluster, and static-server in accepting cluster. + // + // extraAssertion needs to be run before and after upgrade + extraAssertion func(libservice.Service) } tcs := []testcase{ { - oldversion: "1.13", - targetVersion: libutils.TargetVersion, + // Test resolver directs traffic to default subset + // - Create 2 additional static-server instances: one in V1 subset and the other in V2 subset + // - resolver directs traffic to the default subset, which is V2. + name: "resolver default subset", + create: func(cluster *libcluster.Cluster, clientConnectProxy libservice.Service) (libservice.Service, func(), func(), error) { + node := cluster.Agents[0] + client := node.GetClient() + + // Create static-server-v1 and static-server-v2 + serviceOptsV1 := &libservice.ServiceOpts{ + Name: libservice.StaticServerServiceName, + ID: "static-server-v1", + Meta: map[string]string{"version": "v1"}, + HTTPPort: 8081, + GRPCPort: 8078, + } + _, serverConnectProxyV1, err := libservice.CreateAndRegisterStaticServerAndSidecar(node, serviceOptsV1) + require.NoError(t, err) + + serviceOptsV2 := &libservice.ServiceOpts{ + Name: libservice.StaticServerServiceName, + ID: "static-server-v2", + Meta: map[string]string{"version": "v2"}, + HTTPPort: 8082, + GRPCPort: 8077, + } + _, serverConnectProxyV2, err := libservice.CreateAndRegisterStaticServerAndSidecar(node, serviceOptsV2) + require.NoError(t, err) + libassert.CatalogServiceExists(t, client, "static-server") + + // TODO: verify the number of instance of static-server is 3 + libassert.AssertServiceHasHealthyInstances(t, node, libservice.StaticServerServiceName, true, 3) + + // Register service resolver + serviceResolver := &api.ServiceResolverConfigEntry{ + Kind: api.ServiceResolver, + Name: libservice.StaticServerServiceName, + DefaultSubset: "v2", + Subsets: map[string]api.ServiceResolverSubset{ + "v1": { + Filter: "Service.Meta.version == v1", + }, + "v2": { + Filter: "Service.Meta.version == v2", + }, + }, + } + err = cluster.ConfigEntryWrite(serviceResolver) + if err != nil { + return nil, nil, nil, fmt.Errorf("error writing config entry %s", err) + } + + _, serverAdminPortV1 := serverConnectProxyV1.GetAdminAddr() + _, serverAdminPortV2 := serverConnectProxyV2.GetAdminAddr() + + restartFn := func() { + require.NoError(t, serverConnectProxyV1.Restart()) + require.NoError(t, serverConnectProxyV2.Restart()) + } + + _, adminPort := clientConnectProxy.GetAdminAddr() + assertionFn := func() { + libassert.AssertEnvoyRunning(t, serverAdminPortV1) + libassert.AssertEnvoyRunning(t, serverAdminPortV2) + + libassert.AssertEnvoyPresentsCertURI(t, serverAdminPortV1, "static-server") + libassert.AssertEnvoyPresentsCertURI(t, serverAdminPortV2, "static-server") + + libassert.AssertUpstreamEndpointStatus(t, adminPort, "v2.static-server.default", "HEALTHY", 1) + + // assert static-server proxies should be healthy + libassert.AssertServiceHasHealthyInstances(t, node, libservice.StaticServerServiceName, true, 3) + } + return nil, assertionFn, restartFn, nil + }, + extraAssertion: func(clientConnectProxy libservice.Service) { + _, port := clientConnectProxy.GetAddr() + _, adminPort := clientConnectProxy.GetAdminAddr() + + libassert.AssertUpstreamEndpointStatus(t, adminPort, "v2.static-server.default", "HEALTHY", 1) + + // static-client upstream should connect to static-server-v2 because the default subset value is to v2 set in the service resolver + libassert.AssertFortioName(t, fmt.Sprintf("http://localhost:%d", port), "static-server-v2") + }, }, { - oldversion: "1.14", - targetVersion: libutils.TargetVersion, + // Test resolver resolves service instance based on their check status + // - Create one addtional static-server with checks and V1 subset + // - resolver directs traffic to "test" service + name: "resolver default onlypassing", + create: func(cluster *libcluster.Cluster, clientConnectProxy libservice.Service) (libservice.Service, func(), func(), error) { + node := cluster.Agents[0] + + serviceOptsV1 := &libservice.ServiceOpts{ + Name: libservice.StaticServerServiceName, + ID: "static-server-v1", + Meta: map[string]string{"version": "v1"}, + HTTPPort: 8081, + GRPCPort: 8078, + Checks: libservice.Checks{ + Name: "main", + TTL: "30m", + }, + Connect: libservice.SidecarService{ + Port: 21011, + }, + } + _, serverConnectProxyV1, err := libservice.CreateAndRegisterStaticServerAndSidecarWithChecks(node, serviceOptsV1) + require.NoError(t, err) + + // Register service resolver + serviceResolver := &api.ServiceResolverConfigEntry{ + Kind: api.ServiceResolver, + Name: libservice.StaticServerServiceName, + DefaultSubset: "test", + Subsets: map[string]api.ServiceResolverSubset{ + "test": { + OnlyPassing: true, + }, + }, + ConnectTimeout: 120 * time.Second, + } + _, serverAdminPortV1 := serverConnectProxyV1.GetAdminAddr() + + restartFn := func() { + require.NoError(t, serverConnectProxyV1.Restart()) + } + + _, port := clientConnectProxy.GetAddr() + _, adminPort := clientConnectProxy.GetAdminAddr() + assertionFn := func() { + // force static-server-v1 into a warning state + err = node.GetClient().Agent().UpdateTTL("service:static-server-v1", "", "warn") + require.NoError(t, err) + + // ########################### + // ## with onlypassing=true + // assert only one static-server proxy is healthy + err = cluster.ConfigEntryWrite(serviceResolver) + require.NoError(t, err) + libassert.AssertServiceHasHealthyInstances(t, node, libservice.StaticServerServiceName, true, 1) + + libassert.AssertEnvoyRunning(t, serverAdminPortV1) + libassert.AssertEnvoyPresentsCertURI(t, serverAdminPortV1, "static-server") + + // assert static-server proxies should be healthy + libassert.AssertServiceHasHealthyInstances(t, node, libservice.StaticServerServiceName, true, 1) + + // static-client upstream should have 1 healthy endpoint for test.static-server + libassert.AssertUpstreamEndpointStatus(t, adminPort, "test.static-server.default", "HEALTHY", 1) + + // static-client upstream should have 1 unhealthy endpoint for test.static-server + libassert.AssertUpstreamEndpointStatus(t, adminPort, "test.static-server.default", "UNHEALTHY", 1) + + // static-client upstream should connect to static-server since it is passing + libassert.AssertFortioName(t, fmt.Sprintf("http://localhost:%d", port), libservice.StaticServerServiceName) + + // ########################### + // ## with onlypassing=false + // revert to OnlyPassing=false by deleting the config + err = cluster.ConfigEntryDelete(serviceResolver) + require.NoError(t, err) + + // Consul health check assert only one static-server proxy is healthy when onlyPassing is false + libassert.AssertServiceHasHealthyInstances(t, node, libservice.StaticServerServiceName, false, 2) + + // Although the service status is in warning state, when onlypassing is set to false Envoy + // health check returns all service instances with "warning" or "passing" state as Healthy enpoints + libassert.AssertUpstreamEndpointStatus(t, adminPort, "static-server.default", "HEALTHY", 2) + + // static-client upstream should have 0 unhealthy endpoint for static-server + libassert.AssertUpstreamEndpointStatus(t, adminPort, "static-server.default", "UNHEALTHY", 0) + + } + return nil, assertionFn, restartFn, nil + }, + extraAssertion: func(clientConnectProxy libservice.Service) { + }, + }, + { + // Test resolver directs traffic to default subset + // - Create 3 static-server-2 server instances: one in V1, one in V2, one without any version + // - service2Resolver directs traffic to static-server-2-v2 + name: "resolver subset redirect", + create: func(cluster *libcluster.Cluster, clientConnectProxy libservice.Service) (libservice.Service, func(), func(), error) { + node := cluster.Agents[0] + client := node.GetClient() + + serviceOpts2 := &libservice.ServiceOpts{ + Name: libservice.StaticServer2ServiceName, + ID: "static-server-2", + HTTPPort: 8081, + GRPCPort: 8078, + } + _, server2ConnectProxy, err := libservice.CreateAndRegisterStaticServerAndSidecar(node, serviceOpts2) + require.NoError(t, err) + libassert.CatalogServiceExists(t, client, libservice.StaticServer2ServiceName) + + serviceOptsV1 := &libservice.ServiceOpts{ + Name: libservice.StaticServer2ServiceName, + ID: "static-server-2-v1", + Meta: map[string]string{"version": "v1"}, + HTTPPort: 8082, + GRPCPort: 8077, + } + _, server2ConnectProxyV1, err := libservice.CreateAndRegisterStaticServerAndSidecar(node, serviceOptsV1) + require.NoError(t, err) + + serviceOptsV2 := &libservice.ServiceOpts{ + Name: libservice.StaticServer2ServiceName, + ID: "static-server-2-v2", + Meta: map[string]string{"version": "v2"}, + HTTPPort: 8083, + GRPCPort: 8076, + } + _, server2ConnectProxyV2, err := libservice.CreateAndRegisterStaticServerAndSidecar(node, serviceOptsV2) + require.NoError(t, err) + libassert.CatalogServiceExists(t, client, libservice.StaticServer2ServiceName) + + // Register static-server service resolver + serviceResolver := &api.ServiceResolverConfigEntry{ + Kind: api.ServiceResolver, + Name: libservice.StaticServer2ServiceName, + Subsets: map[string]api.ServiceResolverSubset{ + "v1": { + Filter: "Service.Meta.version == v1", + }, + "v2": { + Filter: "Service.Meta.version == v2", + }, + }, + } + err = cluster.ConfigEntryWrite(serviceResolver) + require.NoError(t, err) + + // Register static-server-2 service resolver to redirect traffic + // from static-server to static-server-2-v2 + service2Resolver := &api.ServiceResolverConfigEntry{ + Kind: api.ServiceResolver, + Name: libservice.StaticServerServiceName, + Redirect: &api.ServiceResolverRedirect{ + Service: libservice.StaticServer2ServiceName, + ServiceSubset: "v2", + }, + } + err = cluster.ConfigEntryWrite(service2Resolver) + require.NoError(t, err) + + _, server2AdminPort := server2ConnectProxy.GetAdminAddr() + _, server2AdminPortV1 := server2ConnectProxyV1.GetAdminAddr() + _, server2AdminPortV2 := server2ConnectProxyV2.GetAdminAddr() + + restartFn := func() { + require.NoErrorf(t, server2ConnectProxy.Restart(), "%s", server2ConnectProxy.GetName()) + require.NoErrorf(t, server2ConnectProxyV1.Restart(), "%s", server2ConnectProxyV1.GetName()) + require.NoErrorf(t, server2ConnectProxyV2.Restart(), "%s", server2ConnectProxyV2.GetName()) + } + + assertionFn := func() { + // assert 3 static-server-2 instances are healthy + libassert.AssertServiceHasHealthyInstances(t, node, libservice.StaticServer2ServiceName, false, 3) + + libassert.AssertEnvoyRunning(t, server2AdminPort) + libassert.AssertEnvoyRunning(t, server2AdminPortV1) + libassert.AssertEnvoyRunning(t, server2AdminPortV2) + + libassert.AssertEnvoyPresentsCertURI(t, server2AdminPort, libservice.StaticServer2ServiceName) + libassert.AssertEnvoyPresentsCertURI(t, server2AdminPortV1, libservice.StaticServer2ServiceName) + libassert.AssertEnvoyPresentsCertURI(t, server2AdminPortV2, libservice.StaticServer2ServiceName) + + // assert static-server proxies should be healthy + libassert.AssertServiceHasHealthyInstances(t, node, libservice.StaticServer2ServiceName, true, 3) + } + return nil, assertionFn, restartFn, nil + }, + extraAssertion: func(clientConnectProxy libservice.Service) { + _, appPort := clientConnectProxy.GetAddr() + _, adminPort := clientConnectProxy.GetAdminAddr() + + libassert.AssertFortioName(t, fmt.Sprintf("http://localhost:%d", appPort), "static-server-2-v2") + libassert.AssertUpstreamEndpointStatus(t, adminPort, "v2.static-server-2.default", "HEALTHY", 1) + }, }, } - run := func(t *testing.T, tc testcase) { + run := func(t *testing.T, tc testcase, oldVersion, targetVersion string) { buildOpts := &libcluster.BuildOptions{ - ConsulVersion: tc.oldversion, + ConsulVersion: oldVersion, Datacenter: "dc1", InjectAutoEncryption: true, } // If version < 1.14 disable AutoEncryption - oldVersion, _ := version.NewVersion(tc.oldversion) - if oldVersion.LessThan(libutils.Version_1_14) { + oldVersionTmp, _ := version.NewVersion(oldVersion) + if oldVersionTmp.LessThan(libutils.Version_1_14) { buildOpts.InjectAutoEncryption = false } cluster, _, _ := topology.NewPeeringCluster(t, 1, buildOpts) node := cluster.Agents[0] + client := node.GetClient() - // Register service resolver - serviceResolver := &api.ServiceResolverConfigEntry{ - Kind: api.ServiceResolver, - Name: libservice.StaticServerServiceName, - DefaultSubset: "v2", - Subsets: map[string]api.ServiceResolverSubset{ - "v1": { - Filter: "Service.Meta.version == v1", - }, - "v2": { - Filter: "Service.Meta.version == v2", - }, - }, - } - err := cluster.ConfigEntryWrite(serviceResolver) + staticClientProxy, staticServerProxy, err := createStaticClientAndServer(cluster) require.NoError(t, err) + libassert.CatalogServiceExists(t, client, libservice.StaticServerServiceName) + libassert.CatalogServiceExists(t, client, fmt.Sprintf("%s-sidecar-proxy", libservice.StaticClientServiceName)) - serverConnectProxy, serverConnectProxyV1, serverConnectProxyV2, clientConnectProxy := createService(t, cluster) + err = cluster.ConfigEntryWrite(&api.ProxyConfigEntry{ + Kind: api.ProxyDefaults, + Name: "global", + Config: map[string]interface{}{ + "protocol": "http", + }, + }) + require.NoError(t, err) - _, port := clientConnectProxy.GetAddr() - _, adminPort := clientConnectProxy.GetAdminAddr() - _, serverAdminPort := serverConnectProxy.GetAdminAddr() - _, serverAdminPortV1 := serverConnectProxyV1.GetAdminAddr() - _, serverAdminPortV2 := serverConnectProxyV2.GetAdminAddr() + _, port := staticClientProxy.GetAddr() + _, adminPort := staticClientProxy.GetAdminAddr() + _, serverAdminPort := staticServerProxy.GetAdminAddr() + libassert.HTTPServiceEchoes(t, "localhost", port, "") + libassert.AssertEnvoyPresentsCertURI(t, adminPort, libservice.StaticClientServiceName) + libassert.AssertEnvoyPresentsCertURI(t, serverAdminPort, libservice.StaticServerServiceName) + _, assertionAdditionalResources, restartFn, err := tc.create(cluster, staticClientProxy) + require.NoError(t, err) // validate client and proxy is up and running - libassert.AssertContainerState(t, clientConnectProxy, "running") - - libassert.HTTPServiceEchoes(t, "localhost", port, "") - libassert.AssertUpstreamEndpointStatus(t, adminPort, "v2.static-server.default", "HEALTHY", 1) + libassert.AssertContainerState(t, staticClientProxy, "running") + assertionAdditionalResources() + tc.extraAssertion(staticClientProxy) // Upgrade cluster, restart sidecars then begin service traffic validation - require.NoError(t, cluster.StandardUpgrade(t, context.Background(), tc.targetVersion)) - require.NoError(t, clientConnectProxy.Restart()) - require.NoError(t, serverConnectProxy.Restart()) - require.NoError(t, serverConnectProxyV1.Restart()) - require.NoError(t, serverConnectProxyV2.Restart()) + require.NoError(t, cluster.StandardUpgrade(t, context.Background(), targetVersion)) + require.NoError(t, staticClientProxy.Restart()) + require.NoError(t, staticServerProxy.Restart()) + restartFn() // POST upgrade validation; repeat client & proxy validation libassert.HTTPServiceEchoes(t, "localhost", port, "") - libassert.AssertUpstreamEndpointStatus(t, adminPort, "v2.static-server.default", "HEALTHY", 1) - - // validate static-client proxy admin is up - _, statusCode, err := libassert.GetEnvoyOutput(adminPort, "stats", responseFormat) - require.NoError(t, err) - assert.Equal(t, http.StatusOK, statusCode, fmt.Sprintf("service cannot be reached %v", statusCode)) - - // validate static-server proxy admin is up - _, statusCode1, err := libassert.GetEnvoyOutput(serverAdminPort, "stats", responseFormat) - require.NoError(t, err) - assert.Equal(t, http.StatusOK, statusCode1, fmt.Sprintf("service cannot be reached %v", statusCode1)) - - // validate static-server-v1 proxy admin is up - _, statusCode2, err := libassert.GetEnvoyOutput(serverAdminPortV1, "stats", responseFormat) - require.NoError(t, err) - assert.Equal(t, http.StatusOK, statusCode2, fmt.Sprintf("service cannot be reached %v", statusCode2)) - - // validate static-server-v2 proxy admin is up - _, statusCode3, err := libassert.GetEnvoyOutput(serverAdminPortV2, "stats", responseFormat) - require.NoError(t, err) - assert.Equal(t, http.StatusOK, statusCode3, fmt.Sprintf("service cannot be reached %v", statusCode3)) + libassert.AssertEnvoyRunning(t, adminPort) + libassert.AssertEnvoyRunning(t, serverAdminPort) // certs are valid - libassert.AssertEnvoyPresentsCertURI(t, adminPort, "static-client") - libassert.AssertEnvoyPresentsCertURI(t, serverAdminPort, "static-server") - libassert.AssertEnvoyPresentsCertURI(t, serverAdminPortV1, "static-server") - libassert.AssertEnvoyPresentsCertURI(t, serverAdminPortV2, "static-server") + libassert.AssertEnvoyPresentsCertURI(t, adminPort, libservice.StaticClientServiceName) + libassert.AssertEnvoyPresentsCertURI(t, serverAdminPort, libservice.StaticServerServiceName) - // assert static-server proxies should be healthy - libassert.AssertServiceHasHealthyInstances(t, node, libservice.StaticServerServiceName, true, 3) - - // static-client upstream should connect to static-server-v2 because the default subset value is to v2 set in the service resolver - libassert.AssertFortioName(t, fmt.Sprintf("http://localhost:%d", port), "static-server-v2") + assertionAdditionalResources() + tc.extraAssertion(staticClientProxy) } - for _, tc := range tcs { - t.Run(fmt.Sprintf("upgrade from %s to %s", tc.oldversion, tc.targetVersion), - func(t *testing.T) { - run(t, tc) - }) + targetVersion := libutils.TargetVersion + for _, oldVersion := range upgrade.UpgradeFromVersions { + for _, tc := range tcs { + t.Run(fmt.Sprintf("%s upgrade from %s to %s", tc.name, oldVersion, targetVersion), + func(t *testing.T) { + run(t, tc, oldVersion, targetVersion) + }) + } } } -// create 3 servers and 1 client -func createService(t *testing.T, cluster *libcluster.Cluster) (libservice.Service, libservice.Service, libservice.Service, libservice.Service) { +// createStaticClientAndServer creates a static-client and a static-server in the cluster +func createStaticClientAndServer(cluster *libcluster.Cluster) (libservice.Service, libservice.Service, error) { node := cluster.Agents[0] - client := node.GetClient() - serviceOpts := &libservice.ServiceOpts{ Name: libservice.StaticServerServiceName, ID: "static-server", @@ -154,35 +407,15 @@ func createService(t *testing.T, cluster *libcluster.Cluster) (libservice.Servic GRPCPort: 8079, } _, serverConnectProxy, err := libservice.CreateAndRegisterStaticServerAndSidecar(node, serviceOpts) - require.NoError(t, err) - libassert.CatalogServiceExists(t, client, "static-server") - - serviceOptsV1 := &libservice.ServiceOpts{ - Name: libservice.StaticServerServiceName, - ID: "static-server-v1", - Meta: map[string]string{"version": "v1"}, - HTTPPort: 8081, - GRPCPort: 8078, + if err != nil { + return nil, nil, err } - _, serverConnectProxyV1, err := libservice.CreateAndRegisterStaticServerAndSidecar(node, serviceOptsV1) - require.NoError(t, err) - libassert.CatalogServiceExists(t, client, "static-server") - - serviceOptsV2 := &libservice.ServiceOpts{ - Name: libservice.StaticServerServiceName, - ID: "static-server-v2", - Meta: map[string]string{"version": "v2"}, - HTTPPort: 8082, - GRPCPort: 8077, - } - _, serverConnectProxyV2, err := libservice.CreateAndRegisterStaticServerAndSidecar(node, serviceOptsV2) - require.NoError(t, err) - libassert.CatalogServiceExists(t, client, "static-server") // Create a client proxy instance with the server as an upstream clientConnectProxy, err := libservice.CreateAndRegisterStaticClientSidecar(node, "", false) - require.NoError(t, err) - libassert.CatalogServiceExists(t, client, fmt.Sprintf("%s-sidecar-proxy", libservice.StaticClientServiceName)) + if err != nil { + return nil, nil, err + } - return serverConnectProxy, serverConnectProxyV1, serverConnectProxyV2, clientConnectProxy + return clientConnectProxy, serverConnectProxy, nil } diff --git a/test/integration/consul-container/test/upgrade/l7_traffic_management/resolver_subset_onlypassing_test.go b/test/integration/consul-container/test/upgrade/l7_traffic_management/resolver_subset_onlypassing_test.go deleted file mode 100644 index f33d74d6c1d..00000000000 --- a/test/integration/consul-container/test/upgrade/l7_traffic_management/resolver_subset_onlypassing_test.go +++ /dev/null @@ -1,196 +0,0 @@ -package upgrade - -import ( - "context" - "fmt" - "net/http" - "testing" - "time" - - "github.com/hashicorp/consul/api" - libassert "github.com/hashicorp/consul/test/integration/consul-container/libs/assert" - libcluster "github.com/hashicorp/consul/test/integration/consul-container/libs/cluster" - libservice "github.com/hashicorp/consul/test/integration/consul-container/libs/service" - "github.com/hashicorp/consul/test/integration/consul-container/libs/topology" - "github.com/hashicorp/consul/test/integration/consul-container/libs/utils" - libutils "github.com/hashicorp/consul/test/integration/consul-container/libs/utils" - "github.com/hashicorp/go-version" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" -) - -// TestTrafficManagement_ServiceResolverSubsetOnlyPassing Summary -// This test starts up 2 servers and 1 client in the same datacenter. -// -// Steps: -// - Create a single agent cluster. -// - Create one static-server, 1 subset server 1 client and sidecars for all services, then register them with Consul -func TestTrafficManagement_ServiceResolverSubsetOnlyPassing(t *testing.T) { - t.Parallel() - - responseFormat := map[string]string{"format": "json"} - - type testcase struct { - oldversion string - targetVersion string - } - tcs := []testcase{ - { - oldversion: "1.13", - targetVersion: utils.TargetVersion, - }, - { - oldversion: "1.14", - targetVersion: utils.TargetVersion, - }, - } - - run := func(t *testing.T, tc testcase) { - buildOpts := &libcluster.BuildOptions{ - ConsulVersion: tc.oldversion, - Datacenter: "dc1", - InjectAutoEncryption: true, - } - // If version < 1.14 disable AutoEncryption - oldVersion, _ := version.NewVersion(tc.oldversion) - if oldVersion.LessThan(libutils.Version_1_14) { - buildOpts.InjectAutoEncryption = false - } - cluster, _, _ := topology.NewPeeringCluster(t, 1, buildOpts) - node := cluster.Agents[0] - - // Register service resolver - serviceResolver := &api.ServiceResolverConfigEntry{ - Kind: api.ServiceResolver, - Name: libservice.StaticServerServiceName, - DefaultSubset: "test", - Subsets: map[string]api.ServiceResolverSubset{ - "test": { - OnlyPassing: true, - }, - }, - ConnectTimeout: 120 * time.Second, - } - err := cluster.ConfigEntryWrite(serviceResolver) - require.NoError(t, err) - - serverConnectProxy, serverConnectProxyV1, clientConnectProxy := createServiceAndSubset(t, cluster) - - _, port := clientConnectProxy.GetAddr() - _, adminPort := clientConnectProxy.GetAdminAddr() - _, serverAdminPort := serverConnectProxy.GetAdminAddr() - _, serverAdminPortV1 := serverConnectProxyV1.GetAdminAddr() - - // Upgrade cluster, restart sidecars then begin service traffic validation - require.NoError(t, cluster.StandardUpgrade(t, context.Background(), tc.targetVersion)) - require.NoError(t, clientConnectProxy.Restart()) - require.NoError(t, serverConnectProxy.Restart()) - require.NoError(t, serverConnectProxyV1.Restart()) - - // force static-server-v1 into a warning state - err = node.GetClient().Agent().UpdateTTL("service:static-server-v1", "", "warn") - assert.NoError(t, err) - - // validate static-client is up and running - libassert.AssertContainerState(t, clientConnectProxy, "running") - libassert.HTTPServiceEchoes(t, "localhost", port, "") - - // validate static-client proxy admin is up - _, clientStatusCode, err := libassert.GetEnvoyOutput(adminPort, "stats", responseFormat) - require.NoError(t, err) - assert.Equal(t, http.StatusOK, clientStatusCode, fmt.Sprintf("service cannot be reached %v", clientStatusCode)) - - // validate static-server proxy admin is up - _, serverStatusCode, err := libassert.GetEnvoyOutput(serverAdminPort, "stats", responseFormat) - require.NoError(t, err) - assert.Equal(t, http.StatusOK, serverStatusCode, fmt.Sprintf("service cannot be reached %v", serverStatusCode)) - - // validate static-server-v1 proxy admin is up - _, serverStatusCodeV1, err := libassert.GetEnvoyOutput(serverAdminPortV1, "stats", responseFormat) - require.NoError(t, err) - assert.Equal(t, http.StatusOK, serverStatusCodeV1, fmt.Sprintf("service cannot be reached %v", serverStatusCodeV1)) - - // certs are valid - libassert.AssertEnvoyPresentsCertURI(t, adminPort, libservice.StaticClientServiceName) - libassert.AssertEnvoyPresentsCertURI(t, serverAdminPort, libservice.StaticServerServiceName) - libassert.AssertEnvoyPresentsCertURI(t, serverAdminPortV1, libservice.StaticServerServiceName) - - // ########################### - // ## with onlypassing=true - // assert only one static-server proxy is healthy - libassert.AssertServiceHasHealthyInstances(t, node, libservice.StaticServerServiceName, true, 1) - - // static-client upstream should have 1 healthy endpoint for test.static-server - libassert.AssertUpstreamEndpointStatus(t, adminPort, "test.static-server.default", "HEALTHY", 1) - - // static-client upstream should have 1 unhealthy endpoint for test.static-server - libassert.AssertUpstreamEndpointStatus(t, adminPort, "test.static-server.default", "UNHEALTHY", 1) - - // static-client upstream should connect to static-server-v2 because the default subset value is to v2 set in the service resolver - libassert.AssertFortioName(t, fmt.Sprintf("http://localhost:%d", port), libservice.StaticServerServiceName) - - // ########################### - // ## with onlypassing=false - // revert to OnlyPassing=false by deleting the config - err = cluster.ConfigEntryDelete(serviceResolver) - require.NoError(t, err) - - // Consul health check assert only one static-server proxy is healthy when onlyPassing is false - libassert.AssertServiceHasHealthyInstances(t, node, libservice.StaticServerServiceName, false, 2) - - // Although the service status is in warning state, when onlypassing is set to false Envoy - // health check returns all service instances with "warning" or "passing" state as Healthy enpoints - libassert.AssertUpstreamEndpointStatus(t, adminPort, "static-server.default", "HEALTHY", 2) - - // static-client upstream should have 0 unhealthy endpoint for static-server - libassert.AssertUpstreamEndpointStatus(t, adminPort, "static-server.default", "UNHEALTHY", 0) - } - - for _, tc := range tcs { - t.Run(fmt.Sprintf("upgrade from %s to %s", tc.oldversion, tc.targetVersion), - func(t *testing.T) { - run(t, tc) - }) - } -} - -// create 2 servers and 1 client -func createServiceAndSubset(t *testing.T, cluster *libcluster.Cluster) (libservice.Service, libservice.Service, libservice.Service) { - node := cluster.Agents[0] - client := node.GetClient() - - serviceOpts := &libservice.ServiceOpts{ - Name: libservice.StaticServerServiceName, - ID: libservice.StaticServerServiceName, - HTTPPort: 8080, - GRPCPort: 8079, - } - _, serverConnectProxy, err := libservice.CreateAndRegisterStaticServerAndSidecar(node, serviceOpts) - require.NoError(t, err) - libassert.CatalogServiceExists(t, client, libservice.StaticServerServiceName) - - serviceOptsV1 := &libservice.ServiceOpts{ - Name: libservice.StaticServerServiceName, - ID: "static-server-v1", - Meta: map[string]string{"version": "v1"}, - HTTPPort: 8081, - GRPCPort: 8078, - Checks: libservice.Checks{ - Name: "main", - TTL: "30m", - }, - Connect: libservice.SidecarService{ - Port: 21011, - }, - } - _, serverConnectProxyV1, err := libservice.CreateAndRegisterStaticServerAndSidecarWithChecks(node, serviceOptsV1) - require.NoError(t, err) - libassert.CatalogServiceExists(t, client, libservice.StaticServerServiceName) - - // Create a client proxy instance with the server as an upstream - clientConnectProxy, err := libservice.CreateAndRegisterStaticClientSidecar(node, "", false) - require.NoError(t, err) - libassert.CatalogServiceExists(t, client, fmt.Sprintf("%s-sidecar-proxy", libservice.StaticClientServiceName)) - - return serverConnectProxy, serverConnectProxyV1, clientConnectProxy -} diff --git a/test/integration/consul-container/test/upgrade/l7_traffic_management/resolver_subset_redirect_test.go b/test/integration/consul-container/test/upgrade/l7_traffic_management/resolver_subset_redirect_test.go deleted file mode 100644 index 30462cc1ad3..00000000000 --- a/test/integration/consul-container/test/upgrade/l7_traffic_management/resolver_subset_redirect_test.go +++ /dev/null @@ -1,224 +0,0 @@ -package upgrade - -import ( - "context" - "fmt" - "net/http" - "testing" - "time" - - "github.com/hashicorp/consul/api" - libassert "github.com/hashicorp/consul/test/integration/consul-container/libs/assert" - libcluster "github.com/hashicorp/consul/test/integration/consul-container/libs/cluster" - libservice "github.com/hashicorp/consul/test/integration/consul-container/libs/service" - "github.com/hashicorp/consul/test/integration/consul-container/libs/topology" - "github.com/hashicorp/consul/test/integration/consul-container/libs/utils" - "github.com/hashicorp/go-version" - "github.com/stretchr/testify/require" - "gotest.tools/assert" -) - -// TestTrafficManagement_ServiceResolverSubsetRedirect Summary -// This test starts up 4 servers and 1 client in the same datacenter. -// -// Steps: -// - Create a single agent cluster. -// - Create 2 static-servers, 2 subset servers and 1 client and sidecars for all services, then register them with Consul -// - Validate traffic is successfully redirected from server 1 to sever2-v2 as defined in the service resolver -func TestTrafficManagement_ServiceResolverSubsetRedirect(t *testing.T) { - t.Parallel() - - type testcase struct { - oldversion string - targetVersion string - } - tcs := []testcase{ - { - oldversion: "1.13", - targetVersion: utils.TargetVersion, - }, - { - oldversion: "1.14", - targetVersion: utils.TargetVersion, - }, - } - - run := func(t *testing.T, tc testcase) { - buildOpts := &libcluster.BuildOptions{ - ConsulVersion: tc.oldversion, - Datacenter: "dc1", - InjectAutoEncryption: true, - } - // If version < 1.14 disable AutoEncryption - oldVersion, _ := version.NewVersion(tc.oldversion) - if oldVersion.LessThan(utils.Version_1_14) { - buildOpts.InjectAutoEncryption = false - } - cluster, _, _ := topology.NewPeeringCluster(t, 1, buildOpts) - node := cluster.Agents[0] - - // Register static-server service resolver - serviceResolver := &api.ServiceResolverConfigEntry{ - Kind: api.ServiceResolver, - Name: libservice.StaticServer2ServiceName, - Subsets: map[string]api.ServiceResolverSubset{ - "v1": { - Filter: "Service.Meta.version == v1", - }, - "v2": { - Filter: "Service.Meta.version == v2", - }, - }, - } - err := cluster.ConfigEntryWrite(serviceResolver) - require.NoError(t, err) - - // Register static-server-2 service resolver to redirect traffic - // from static-server to static-server-2-v2 - service2Resolver := &api.ServiceResolverConfigEntry{ - Kind: api.ServiceResolver, - Name: libservice.StaticServerServiceName, - Redirect: &api.ServiceResolverRedirect{ - Service: libservice.StaticServer2ServiceName, - ServiceSubset: "v2", - }, - } - err = cluster.ConfigEntryWrite(service2Resolver) - require.NoError(t, err) - - // register agent services - agentServices := setupServiceAndSubsets(t, cluster) - assertionFn, proxyRestartFn := agentServices.validateAgentServices(t) - _, port := agentServices.client.GetAddr() - _, adminPort := agentServices.client.GetAdminAddr() - - // validate static-client is up and running - libassert.AssertContainerState(t, agentServices.client, "running") - libassert.HTTPServiceEchoes(t, "localhost", port, "") - libassert.AssertFortioName(t, fmt.Sprintf("http://localhost:%d", port), "static-server-2-v2") - assertionFn() - - // Upgrade cluster, restart sidecars then begin service traffic validation - require.NoError(t, cluster.StandardUpgrade(t, context.Background(), tc.targetVersion)) - proxyRestartFn() - - libassert.AssertContainerState(t, agentServices.client, "running") - libassert.HTTPServiceEchoes(t, "localhost", port, "") - libassert.AssertFortioName(t, fmt.Sprintf("http://localhost:%d", port), "static-server-2-v2") - assertionFn() - - // assert 3 static-server instances are healthy - libassert.AssertServiceHasHealthyInstances(t, node, libservice.StaticServer2ServiceName, false, 3) - libassert.AssertUpstreamEndpointStatus(t, adminPort, "v2.static-server-2.default", "HEALTHY", 1) - } - - for _, tc := range tcs { - t.Run(fmt.Sprintf("upgrade from %s to %s", tc.oldversion, tc.targetVersion), - func(t *testing.T) { - run(t, tc) - }) - // test sometimes fails with error: could not start or join all agents: could not add container index 0: port not found - time.Sleep(1 * time.Second) - } -} - -func (s *registeredServices) validateAgentServices(t *testing.T) (func(), func()) { - var ( - responseFormat = map[string]string{"format": "json"} - proxyRestartFn func() - assertionFn func() - ) - // validate services proxy admin is up - assertionFn = func() { - for serviceName, proxies := range s.services { - for _, proxy := range proxies { - _, adminPort := proxy.GetAdminAddr() - _, statusCode, err := libassert.GetEnvoyOutput(adminPort, "stats", responseFormat) - require.NoError(t, err) - assert.Equal(t, http.StatusOK, statusCode, fmt.Sprintf("%s cannot be reached %v", serviceName, statusCode)) - - // certs are valid - libassert.AssertEnvoyPresentsCertURI(t, adminPort, serviceName) - } - } - } - - for _, serviceConnectProxy := range s.services { - for _, proxy := range serviceConnectProxy { - proxyRestartFn = func() { require.NoErrorf(t, proxy.Restart(), "%s", proxy.GetName()) } - } - } - return assertionFn, proxyRestartFn -} - -type registeredServices struct { - client libservice.Service - services map[string][]libservice.Service -} - -// create 3 servers and 1 client -func setupServiceAndSubsets(t *testing.T, cluster *libcluster.Cluster) *registeredServices { - node := cluster.Agents[0] - client := node.GetClient() - - // create static-servers and subsets - serviceOpts := &libservice.ServiceOpts{ - Name: libservice.StaticServerServiceName, - ID: "static-server", - HTTPPort: 8080, - GRPCPort: 8079, - } - _, serverConnectProxy, err := libservice.CreateAndRegisterStaticServerAndSidecar(node, serviceOpts) - require.NoError(t, err) - libassert.CatalogServiceExists(t, client, libservice.StaticServerServiceName) - - serviceOpts2 := &libservice.ServiceOpts{ - Name: libservice.StaticServer2ServiceName, - ID: "static-server-2", - HTTPPort: 8081, - GRPCPort: 8078, - } - _, server2ConnectProxy, err := libservice.CreateAndRegisterStaticServerAndSidecar(node, serviceOpts2) - require.NoError(t, err) - libassert.CatalogServiceExists(t, client, libservice.StaticServer2ServiceName) - - serviceOptsV1 := &libservice.ServiceOpts{ - Name: libservice.StaticServer2ServiceName, - ID: "static-server-2-v1", - Meta: map[string]string{"version": "v1"}, - HTTPPort: 8082, - GRPCPort: 8077, - } - _, server2ConnectProxyV1, err := libservice.CreateAndRegisterStaticServerAndSidecar(node, serviceOptsV1) - require.NoError(t, err) - libassert.CatalogServiceExists(t, client, libservice.StaticServer2ServiceName) - - serviceOptsV2 := &libservice.ServiceOpts{ - Name: libservice.StaticServer2ServiceName, - ID: "static-server-2-v2", - Meta: map[string]string{"version": "v2"}, - HTTPPort: 8083, - GRPCPort: 8076, - } - _, server2ConnectProxyV2, err := libservice.CreateAndRegisterStaticServerAndSidecar(node, serviceOptsV2) - require.NoError(t, err) - libassert.CatalogServiceExists(t, client, libservice.StaticServer2ServiceName) - - // Create a client proxy instance with the server as an upstream - clientConnectProxy, err := libservice.CreateAndRegisterStaticClientSidecar(node, "", false) - require.NoError(t, err) - libassert.CatalogServiceExists(t, client, fmt.Sprintf("%s-sidecar-proxy", libservice.StaticClientServiceName)) - - // return a map of all services created - tmpServices := map[string][]libservice.Service{} - tmpServices[libservice.StaticClientServiceName] = append(tmpServices[libservice.StaticClientServiceName], clientConnectProxy) - tmpServices[libservice.StaticServerServiceName] = append(tmpServices[libservice.StaticServerServiceName], serverConnectProxy) - tmpServices[libservice.StaticServer2ServiceName] = append(tmpServices[libservice.StaticServer2ServiceName], server2ConnectProxy) - tmpServices[libservice.StaticServer2ServiceName] = append(tmpServices[libservice.StaticServer2ServiceName], server2ConnectProxyV1) - tmpServices[libservice.StaticServer2ServiceName] = append(tmpServices[libservice.StaticServer2ServiceName], server2ConnectProxyV2) - - return ®isteredServices{ - client: clientConnectProxy, - services: tmpServices, - } -} diff --git a/test/integration/consul-container/test/upgrade/upgrade.go b/test/integration/consul-container/test/upgrade/upgrade.go new file mode 100644 index 00000000000..30bbdcc627c --- /dev/null +++ b/test/integration/consul-container/test/upgrade/upgrade.go @@ -0,0 +1,3 @@ +package upgrade + +var UpgradeFromVersions = []string{"1.13", "1.14"} From a0862e64a5fd3b023f814b29c8f30048f109739b Mon Sep 17 00:00:00 2001 From: Tyler Wendlandt Date: Mon, 27 Feb 2023 16:31:47 -0700 Subject: [PATCH 075/262] UI: Fix rendering issue in search and lists (#16444) * Upgrade ember-cli-string-helpers * add extra lock change --- .changelog/16444.txt | 3 + ui/packages/consul-ui/package.json | 2 +- ui/yarn.lock | 146 +++++++++++++++++++++++++++-- 3 files changed, 143 insertions(+), 8 deletions(-) create mode 100644 .changelog/16444.txt diff --git a/.changelog/16444.txt b/.changelog/16444.txt new file mode 100644 index 00000000000..542f0560fec --- /dev/null +++ b/.changelog/16444.txt @@ -0,0 +1,3 @@ +```release-note:bug +ui: Fix issue with lists and filters not rendering properly +``` diff --git a/ui/packages/consul-ui/package.json b/ui/packages/consul-ui/package.json index 2d7a4a849ba..5786593c178 100644 --- a/ui/packages/consul-ui/package.json +++ b/ui/packages/consul-ui/package.json @@ -120,7 +120,7 @@ "ember-cli-page-object": "^1.17.11", "ember-cli-postcss": "^8.1.0", "ember-cli-sri": "^2.1.1", - "ember-cli-string-helpers": "^5.0.0", + "ember-cli-string-helpers": "^6.1.0", "ember-cli-template-lint": "^2.0.1", "ember-cli-terser": "^4.0.2", "ember-cli-yadda": "^0.7.0", diff --git a/ui/yarn.lock b/ui/yarn.lock index 13f277c65f0..dd29b32ed1e 100644 --- a/ui/yarn.lock +++ b/ui/yarn.lock @@ -2,7 +2,7 @@ # yarn lockfile v1 -"@ampproject/remapping@^2.1.0": +"@ampproject/remapping@^2.1.0", "@ampproject/remapping@^2.2.0": version "2.2.0" resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.0.tgz#56c133824780de3174aed5ab6834f3026790154d" integrity sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w== @@ -58,6 +58,11 @@ resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.20.1.tgz#f2e6ef7790d8c8dbf03d379502dcc246dcce0b30" integrity sha512-EWZ4mE2diW3QALKvDMiXnbZpRvlj+nayZ112nK93SnhqOtpdsbVD4W+2tEoT3YNBAG9RBR0ISY758ZkOgsn6pQ== +"@babel/compat-data@^7.20.5": + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.21.0.tgz#c241dc454e5b5917e40d37e525e2f4530c399298" + integrity sha512-gMuZsmsgxk/ENC3O/fRw5QY8A9/uxQbbCEypnLIiYYc/qVJtEV7ouxC3EllIIwNzMqAQee5tanFabWsUOutS7g== + "@babel/core@^7.0.0", "@babel/core@^7.1.6", "@babel/core@^7.12.0", "@babel/core@^7.12.3", "@babel/core@^7.2.2", "@babel/core@^7.3.4", "@babel/core@^7.7.5": version "7.13.10" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.13.10.tgz#07de050bbd8193fcd8a3c27918c0890613a94559" @@ -80,6 +85,27 @@ semver "^6.3.0" source-map "^0.5.0" +"@babel/core@^7.13.10": + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.21.0.tgz#1341aefdcc14ccc7553fcc688dd8986a2daffc13" + integrity sha512-PuxUbxcW6ZYe656yL3EAhpy7qXKq0DmYsrJLpbB8XrsCP9Nm+XCg9XFMb5vIDliPD7+U/+M+QJlH17XOcB7eXA== + dependencies: + "@ampproject/remapping" "^2.2.0" + "@babel/code-frame" "^7.18.6" + "@babel/generator" "^7.21.0" + "@babel/helper-compilation-targets" "^7.20.7" + "@babel/helper-module-transforms" "^7.21.0" + "@babel/helpers" "^7.21.0" + "@babel/parser" "^7.21.0" + "@babel/template" "^7.20.7" + "@babel/traverse" "^7.21.0" + "@babel/types" "^7.21.0" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.2" + semver "^6.3.0" + "@babel/core@^7.13.8": version "7.20.2" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.20.2.tgz#8dc9b1620a673f92d3624bd926dc49a52cf25b92" @@ -158,6 +184,16 @@ "@jridgewell/gen-mapping" "^0.3.2" jsesc "^2.5.1" +"@babel/generator@^7.21.0", "@babel/generator@^7.21.1": + version "7.21.1" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.21.1.tgz#951cc626057bc0af2c35cd23e9c64d384dea83dd" + integrity sha512-1lT45bAYlQhFn/BHivJs43AiW2rg3/UbLyShGfF3C0KmHvO5fSghWd5kBJy30kpRRucGzXStvnnCFniCR2kXAA== + dependencies: + "@babel/types" "^7.21.0" + "@jridgewell/gen-mapping" "^0.3.2" + "@jridgewell/trace-mapping" "^0.3.17" + jsesc "^2.5.1" + "@babel/helper-annotate-as-pure@^7.12.13": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.12.13.tgz#0f58e86dfc4bb3b1fcd7db806570e177d439b6ab" @@ -251,6 +287,17 @@ browserslist "^4.21.3" semver "^6.3.0" +"@babel/helper-compilation-targets@^7.20.7": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz#a6cd33e93629f5eb473b021aac05df62c4cd09bb" + integrity sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ== + dependencies: + "@babel/compat-data" "^7.20.5" + "@babel/helper-validator-option" "^7.18.6" + browserslist "^4.21.3" + lru-cache "^5.1.1" + semver "^6.3.0" + "@babel/helper-create-class-features-plugin@^7.13.0", "@babel/helper-create-class-features-plugin@^7.5.5", "@babel/helper-create-class-features-plugin@^7.8.3": version "7.13.11" resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.13.11.tgz#30d30a005bca2c953f5653fc25091a492177f4f6" @@ -419,6 +466,14 @@ "@babel/template" "^7.18.10" "@babel/types" "^7.19.0" +"@babel/helper-function-name@^7.21.0": + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz#d552829b10ea9f120969304023cd0645fa00b1b4" + integrity sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg== + dependencies: + "@babel/template" "^7.20.7" + "@babel/types" "^7.21.0" + "@babel/helper-get-function-arity@^7.12.13": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz#bc63451d403a3b3082b97e1d8b3fe5bd4091e583" @@ -554,6 +609,20 @@ "@babel/traverse" "^7.20.1" "@babel/types" "^7.20.2" +"@babel/helper-module-transforms@^7.21.0": + version "7.21.2" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.21.2.tgz#160caafa4978ac8c00ac66636cb0fa37b024e2d2" + integrity sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ== + dependencies: + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-module-imports" "^7.18.6" + "@babel/helper-simple-access" "^7.20.2" + "@babel/helper-split-export-declaration" "^7.18.6" + "@babel/helper-validator-identifier" "^7.19.1" + "@babel/template" "^7.20.7" + "@babel/traverse" "^7.21.2" + "@babel/types" "^7.21.2" + "@babel/helper-optimise-call-expression@^7.12.13": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz#5c02d171b4c8615b1e7163f888c1c81c30a2aaea" @@ -822,6 +891,15 @@ "@babel/traverse" "^7.20.1" "@babel/types" "^7.20.0" +"@babel/helpers@^7.21.0": + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.21.0.tgz#9dd184fb5599862037917cdc9eecb84577dc4e7e" + integrity sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA== + dependencies: + "@babel/template" "^7.20.7" + "@babel/traverse" "^7.21.0" + "@babel/types" "^7.21.0" + "@babel/highlight@^7.10.4", "@babel/highlight@^7.12.13": version "7.13.10" resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.13.10.tgz#a8b2a66148f5b27d666b15d81774347a731d52d1" @@ -869,6 +947,11 @@ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.20.2.tgz#9aeb9b92f64412b5f81064d46f6a1ac0881337f4" integrity sha512-afk318kh2uKbo7BEj2QtEi8HVCGrwHUffrYDy7dgVcSa2j9lY3LDjPzcyGdpX7xgm35aWqvciZJ4WKmdF/SxYg== +"@babel/parser@^7.20.7", "@babel/parser@^7.21.0", "@babel/parser@^7.21.2": + version "7.21.2" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.21.2.tgz#dacafadfc6d7654c3051a66d6fe55b6cb2f2a0b3" + integrity sha512-URpaIJQwEkEC2T9Kn+Ai6Xe/02iNaVCuT/PtoRz3GPVJVDpPd7mLo+VddTbhCRU9TXqW5mSrQfXZyi8kDKOVpQ== + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.16.7.tgz#4eda6d6c2a0aa79c70fa7b6da67763dfe2141050" @@ -2530,6 +2613,15 @@ "@babel/parser" "^7.18.10" "@babel/types" "^7.18.10" +"@babel/template@^7.20.7": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.20.7.tgz#a15090c2839a83b02aa996c0b4994005841fd5a8" + integrity sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw== + dependencies: + "@babel/code-frame" "^7.18.6" + "@babel/parser" "^7.20.7" + "@babel/types" "^7.20.7" + "@babel/traverse@^7.1.6", "@babel/traverse@^7.12.1", "@babel/traverse@^7.13.0", "@babel/traverse@^7.4.5", "@babel/traverse@^7.7.0": version "7.13.0" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.13.0.tgz#6d95752475f86ee7ded06536de309a65fc8966cc" @@ -2593,6 +2685,22 @@ debug "^4.1.0" globals "^11.1.0" +"@babel/traverse@^7.21.0", "@babel/traverse@^7.21.2": + version "7.21.2" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.21.2.tgz#ac7e1f27658750892e815e60ae90f382a46d8e75" + integrity sha512-ts5FFU/dSUPS13tv8XiEObDu9K+iagEKME9kAbaP7r0Y9KtZJZ+NGndDvWoRAYNpeWafbpFeki3q9QoMD6gxyw== + dependencies: + "@babel/code-frame" "^7.18.6" + "@babel/generator" "^7.21.1" + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-function-name" "^7.21.0" + "@babel/helper-hoist-variables" "^7.18.6" + "@babel/helper-split-export-declaration" "^7.18.6" + "@babel/parser" "^7.21.2" + "@babel/types" "^7.21.2" + debug "^4.1.0" + globals "^11.1.0" + "@babel/types@^7.1.6", "@babel/types@^7.12.1", "@babel/types@^7.12.13", "@babel/types@^7.13.0", "@babel/types@^7.4.4", "@babel/types@^7.7.0", "@babel/types@^7.7.2": version "7.13.0" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.13.0.tgz#74424d2816f0171b4100f0ab34e9a374efdf7f80" @@ -2628,6 +2736,15 @@ "@babel/helper-validator-identifier" "^7.19.1" to-fast-properties "^2.0.0" +"@babel/types@^7.20.7", "@babel/types@^7.21.0", "@babel/types@^7.21.2": + version "7.21.2" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.21.2.tgz#92246f6e00f91755893c2876ad653db70c8310d1" + integrity sha512-3wRZSs7jiFaB8AjxiiD+VqN5DTG2iRvJGQ+qYFrs/654lg6kGTQWIOFjlBo5RaXuAZjBmP3+OQH4dmhqiiyYxw== + dependencies: + "@babel/helper-string-parser" "^7.19.4" + "@babel/helper-validator-identifier" "^7.19.1" + to-fast-properties "^2.0.0" + "@cnakazawa/watch@^1.0.3": version "1.0.4" resolved "https://registry.yarnpkg.com/@cnakazawa/watch/-/watch-1.0.4.tgz#f864ae85004d0fcab6f50be9141c4da368d1656a" @@ -3544,7 +3661,7 @@ "@jridgewell/sourcemap-codec" "^1.4.10" "@jridgewell/trace-mapping" "^0.3.9" -"@jridgewell/resolve-uri@^3.0.3": +"@jridgewell/resolve-uri@3.1.0", "@jridgewell/resolve-uri@^3.0.3": version "3.1.0" resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== @@ -3562,7 +3679,7 @@ "@jridgewell/gen-mapping" "^0.3.0" "@jridgewell/trace-mapping" "^0.3.9" -"@jridgewell/sourcemap-codec@^1.4.10": +"@jridgewell/sourcemap-codec@1.4.14", "@jridgewell/sourcemap-codec@^1.4.10": version "1.4.14" resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== @@ -3575,6 +3692,14 @@ "@jridgewell/resolve-uri" "^3.0.3" "@jridgewell/sourcemap-codec" "^1.4.10" +"@jridgewell/trace-mapping@^0.3.17": + version "0.3.17" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz#793041277af9073b0951a7fe0f0d8c4c98c36985" + integrity sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g== + dependencies: + "@jridgewell/resolve-uri" "3.1.0" + "@jridgewell/sourcemap-codec" "1.4.14" + "@lit/reactive-element@^1.2.1": version "1.2.1" resolved "https://registry.yarnpkg.com/@lit/reactive-element/-/reactive-element-1.2.1.tgz#8620d7f0baf63e12821fa93c34d21e23477736f7" @@ -8481,13 +8606,15 @@ ember-cli-sri@^2.1.1: dependencies: broccoli-sri-hash "^2.1.0" -ember-cli-string-helpers@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/ember-cli-string-helpers/-/ember-cli-string-helpers-5.0.0.tgz#b1e08ec3ca1c9a457f9fd9aafff60b5939fbf91d" - integrity sha512-PodD3Uf7BkOXIu95E6cWEC0ERroTiUOAwOr828Vb+fPFtV7WYNSC27C9Ds1ggCyyRqnXmpS0JSqCTN1gPZfkWQ== +ember-cli-string-helpers@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/ember-cli-string-helpers/-/ember-cli-string-helpers-6.1.0.tgz#aeb96112bb91c540b869ed8b9c680f7fd5859cb6" + integrity sha512-Lw8B6MJx2n8CNF2TSIKs+hWLw0FqSYjr2/NRPyquyYA05qsl137WJSYW3ZqTsLgoinHat0DGF2qaCXocLhLmyA== dependencies: + "@babel/core" "^7.13.10" broccoli-funnel "^3.0.3" ember-cli-babel "^7.7.3" + resolve "^1.20.0" ember-cli-string-utils@^1.0.0, ember-cli-string-utils@^1.1.0: version "1.1.0" @@ -12322,6 +12449,11 @@ json5@^2.2.1: resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.1.tgz#655d50ed1e6f95ad1a3caababd2b0efda10b395c" integrity sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA== +json5@^2.2.2: + version "2.2.3" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" + integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== + jsonfile@^2.1.0: version "2.4.0" resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8" From afbc56622a5e345bb0fcdf10457baf2d084164be Mon Sep 17 00:00:00 2001 From: Curt Bushko Date: Mon, 27 Feb 2023 19:50:01 -0500 Subject: [PATCH 076/262] Update docs for consul-k8s 1.1.0 (#16447) --- .../content/docs/connect/proxies/envoy.mdx | 12 +- website/content/docs/k8s/compatibility.mdx | 2 +- website/content/docs/k8s/helm.mdx | 196 +++++++++--------- 3 files changed, 98 insertions(+), 112 deletions(-) diff --git a/website/content/docs/connect/proxies/envoy.mdx b/website/content/docs/connect/proxies/envoy.mdx index b47639dc765..3186b645c2f 100644 --- a/website/content/docs/connect/proxies/envoy.mdx +++ b/website/content/docs/connect/proxies/envoy.mdx @@ -42,19 +42,15 @@ Consul supports **four major Envoy releases** at the beginning of each major Con | 1.15.x | 1.25.1, 1.24.2, 1.23.4, 1.22.5 | | 1.14.x | 1.24.0, 1.23.1, 1.22.5, 1.21.5 | | 1.13.x | 1.23.1, 1.22.5, 1.21.5, 1.20.7 | -| 1.12.x | 1.22.5, 1.21.5, 1.20.7, 1.19.5 | - -1. Envoy 1.20.1 and earlier are vulnerable to [CVE-2022-21654](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2022-21654) and [CVE-2022-21655](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2022-21655). Both CVEs were patched in Envoy versions 1.18.6, 1.19.3, and 1.20.2. -Envoy 1.16.x and older releases are no longer supported (see [HCSEC-2022-07](https://discuss.hashicorp.com/t/hcsec-2022-07-consul-s-connect-service-mesh-affected-by-recent-envoy-security-releases/36332)). Consul 1.9.x clusters should be upgraded to 1.10.x and Envoy upgraded to the latest supported Envoy version for that release, 1.18.6. ### Envoy and Consul Dataplane Consul Dataplane is a feature introduced in Consul v1.14. Because each version of Consul Dataplane supports one specific version of Envoy, you must use the following versions of Consul, Consul Dataplane, and Envoy together. -| Consul Version | Consul Dataplane Version | Bundled Envoy Version | -| ------------------- | ------------------------ | ---------------------- | -| 1.15.x | 1.1.x | 1.25.x | -| 1.14.x | 1.0.x | 1.24.x | +| Consul Version | Consul Dataplane Version (Bundled Envoy Version) | +| ------------------- | ------------------------------------------------- | +| 1.15.x | 1.1.x (Envoy 1.25.x), 1.0.x (Envoy 1.24.x) | +| 1.14.x | 1.0.x (Envoy 1.24.x) | ## Getting Started diff --git a/website/content/docs/k8s/compatibility.mdx b/website/content/docs/k8s/compatibility.mdx index 60f71bdcb85..343387156df 100644 --- a/website/content/docs/k8s/compatibility.mdx +++ b/website/content/docs/k8s/compatibility.mdx @@ -15,9 +15,9 @@ Consul Kubernetes versions all of its components (`consul-k8s` CLI, `consul-k8s- | Consul Version | Compatible consul-k8s Versions | Compatible Kubernetes Versions | | -------------- | -------------------------------- | -------------------------------| +| 1.15.x | 1.1.x | 1.23.x - 1.26.x | | 1.14.x | 1.0.x | 1.22.x - 1.25.x | | 1.13.x | 0.49.x | 1.21.x - 1.24.x | -| 1.12.x | 0.43.0 - 0.49.x | 1.19.x - 1.22.x | ## Supported Envoy versions diff --git a/website/content/docs/k8s/helm.mdx b/website/content/docs/k8s/helm.mdx index b5eb83c0df0..602efba9e6d 100644 --- a/website/content/docs/k8s/helm.mdx +++ b/website/content/docs/k8s/helm.mdx @@ -58,7 +58,7 @@ Use these links to navigate to a particular top-level stanza. the prefix will be `-consul`. - `domain` ((#v-global-domain)) (`string: consul`) - The domain Consul will answer DNS queries for - (see `-domain` (https://www.consul.io/docs/agent/config/cli-flags#_domain)) and the domain services synced from + (Refer to [`-domain`](https://developer.hashicorp.com/consul/docs/agent/config/cli-flags#_domain)) and the domain services synced from Consul into Kubernetes will have, e.g. `service-name.service.consul`. - `peering` ((#v-global-peering)) - Configures the Cluster Peering feature. Requires Consul v1.14+ and Consul-K8s v1.0.0+. @@ -94,7 +94,7 @@ Use these links to navigate to a particular top-level stanza. - `imagePullSecrets` ((#v-global-imagepullsecrets)) (`array`) - Array of objects containing image pull secret names that will be applied to each service account. This can be used to reference image pull secrets if using a custom consul or consul-k8s-control-plane Docker image. - See https://kubernetes.io/docs/concepts/containers/images/#using-a-private-registry for reference. + Refer to https://kubernetes.io/docs/concepts/containers/images/#using-a-private-registry. Example: @@ -114,12 +114,13 @@ Use these links to navigate to a particular top-level stanza. https://github.com/hashicorp/consul/issues/1858. - `enablePodSecurityPolicies` ((#v-global-enablepodsecuritypolicies)) (`boolean: false`) - Controls whether pod security policies are created for the Consul components - created by this chart. See https://kubernetes.io/docs/concepts/policy/pod-security-policy/. + created by this chart. Refer to https://kubernetes.io/docs/concepts/policy/pod-security-policy/. - `secretsBackend` ((#v-global-secretsbackend)) - secretsBackend is used to configure Vault as the secrets backend for the Consul on Kubernetes installation. The Vault cluster needs to have the Kubernetes Auth Method, KV2 and PKI secrets engines enabled and have necessary secrets, policies and roles created prior to installing Consul. - See https://www.consul.io/docs/k8s/installation/vault for full instructions. + Refer to [Vault as the Secrets Backend](https://developer.hashicorp.com/consul/docs/k8s/deployment-configurations/vault) + documentation for full instructions. The Vault cluster _must_ not have the Consul cluster installed by this Helm chart as its storage backend as that would cause a circular dependency. @@ -177,11 +178,6 @@ Use these links to navigate to a particular top-level stanza. ``` and check the name of `metadata.name`. - - `controllerRole` ((#v-global-secretsbackend-vault-controllerrole)) (`string: ""`) - The Vault role to read Consul controller's webhook's - CA and issue a certificate and private key. - A Vault policy must be created which grants issue capabilities to - `global.secretsBackend.vault.controller.tlsCert.secretName`. - - `connectInjectRole` ((#v-global-secretsbackend-vault-connectinjectrole)) (`string: ""`) - The Vault role to read Consul connect-injector webhook's CA and issue a certificate and private key. A Vault policy must be created which grants issue capabilities to @@ -214,21 +210,21 @@ Use these links to navigate to a particular top-level stanza. The provider will be configured to use the Vault Kubernetes auth method and therefore requires the role provided by `global.secretsBackend.vault.consulServerRole` to have permissions to the root and intermediate PKI paths. - Please see https://www.consul.io/docs/connect/ca/vault#vault-acl-policies - for information on how to configure the Vault policies. + Please refer to [Vault ACL policies](https://developer.hashicorp.com/consul/docs/connect/ca/vault#vault-acl-policies) + documentation for information on how to configure the Vault policies. - `address` ((#v-global-secretsbackend-vault-connectca-address)) (`string: ""`) - The address of the Vault server. - `authMethodPath` ((#v-global-secretsbackend-vault-connectca-authmethodpath)) (`string: kubernetes`) - The mount path of the Kubernetes auth method in Vault. - `rootPKIPath` ((#v-global-secretsbackend-vault-connectca-rootpkipath)) (`string: ""`) - The path to a PKI secrets engine for the root certificate. - For more details, please refer to [Vault Connect CA configuration](https://www.consul.io/docs/connect/ca/vault#rootpkipath). + For more details, please refer to [Vault Connect CA configuration](https://developer.hashicorp.com/consul/docs/connect/ca/vault#rootpkipath). - `intermediatePKIPath` ((#v-global-secretsbackend-vault-connectca-intermediatepkipath)) (`string: ""`) - The path to a PKI secrets engine for the generated intermediate certificate. - For more details, please refer to [Vault Connect CA configuration](https://www.consul.io/docs/connect/ca/vault#intermediatepkipath). + For more details, please refer to [Vault Connect CA configuration](https://developer.hashicorp.com/consul/docs/connect/ca/vault#intermediatepkipath). - `additionalConfig` ((#v-global-secretsbackend-vault-connectca-additionalconfig)) (`string: {}`) - Additional Connect CA configuration in JSON format. - Please refer to [Vault Connect CA configuration](https://www.consul.io/docs/connect/ca/vault#configuration) + Please refer to [Vault Connect CA configuration](https://developer.hashicorp.com/consul/docs/connect/ca/vault#configuration) for all configuration options available for that provider. Example: @@ -245,22 +241,6 @@ Use these links to navigate to a particular top-level stanza. } ``` - - `controller` ((#v-global-secretsbackend-vault-controller)) - - - `tlsCert` ((#v-global-secretsbackend-vault-controller-tlscert)) - Configuration to the Vault Secret that Kubernetes will use on - Kubernetes CRD creation, deletion, and update, to get TLS certificates - used issued from vault to send webhooks to the controller. - - - `secretName` ((#v-global-secretsbackend-vault-controller-tlscert-secretname)) (`string: null`) - The Vault secret path that issues TLS certificates for controller - webhooks. - - - `caCert` ((#v-global-secretsbackend-vault-controller-cacert)) - Configuration to the Vault Secret that Kubernetes will use on - Kubernetes CRD creation, deletion, and update, to get CA certificates - used issued from vault to send webhooks to the controller. - - - `secretName` ((#v-global-secretsbackend-vault-controller-cacert-secretname)) (`string: null`) - The Vault secret path that contains the CA certificate for controller - webhooks. - - `connectInject` ((#v-global-secretsbackend-vault-connectinject)) - `caCert` ((#v-global-secretsbackend-vault-connectinject-cacert)) - Configuration to the Vault Secret that Kubernetes uses on @@ -278,7 +258,7 @@ Use these links to navigate to a particular top-level stanza. inject webhooks. - `gossipEncryption` ((#v-global-gossipencryption)) - Configures Consul's gossip encryption key. - (see `-encrypt` (https://www.consul.io/docs/agent/config/cli-flags#_encrypt)). + (Refer to [`-encrypt`](https://developer.hashicorp.com/consul/docs/agent/config/cli-flags#_encrypt)). By default, gossip encryption is not enabled. The gossip encryption key may be set automatically or manually. The recommended method is to automatically generate the key. To automatically generate and set a gossip encryption key, set autoGenerate to true. @@ -286,7 +266,7 @@ Use these links to navigate to a particular top-level stanza. To manually generate a gossip encryption key, set secretName and secretKey and use Consul to generate a key, saving this as a Kubernetes secret or Vault secret path and key. If `global.secretsBackend.vault.enabled=true`, be sure to add the "data" component of the secretName path as required by - the Vault KV-2 secrets engine [see example]. + the Vault KV-2 secrets engine [refer to example]. ```shell-session $ kubectl create secret generic consul-gossip-encryption-key --from-literal=key=$(consul keygen) @@ -309,10 +289,10 @@ Use these links to navigate to a particular top-level stanza. - `recursors` ((#v-global-recursors)) (`array: []`) - A list of addresses of upstream DNS servers that are used to recursively resolve DNS queries. These values are given as `-recursor` flags to Consul servers and clients. - See https://www.consul.io/docs/agent/config/cli-flags#_recursor for more details. + Refer to [`-recursor`](https://developer.hashicorp.com/consul/docs/agent/config/cli-flags#_recursor) for more details. If this is an empty array (the default), then Consul DNS will only resolve queries for the Consul top level domain (by default `.consul`). - - `tls` ((#v-global-tls)) - Enables TLS (https://learn.hashicorp.com/tutorials/consul/tls-encryption-secure) + - `tls` ((#v-global-tls)) - Enables [TLS](https://developer.hashicorp.com/consul/tutorials/security/tls-encryption-secure) across the cluster to verify authenticity of the Consul servers and clients. Requires Consul v1.4.1+. @@ -336,7 +316,7 @@ Use these links to navigate to a particular top-level stanza. - `verify` ((#v-global-tls-verify)) (`boolean: true`) - If true, `verify_outgoing`, `verify_server_hostname`, and `verify_incoming` for internal RPC communication will be set to `true` for Consul servers and clients. Set this to false to incrementally roll out TLS on an existing Consul cluster. - Please see https://consul.io/docs/k8s/operations/tls-on-existing-cluster + Please refer to [TLS on existing clusters](https://developer.hashicorp.com/consul/docs/k8s/operations/tls-on-existing-cluster) for more details. - `httpsOnly` ((#v-global-tls-httpsonly)) (`boolean: true`) - If true, the Helm chart will configure Consul to disable the HTTP port on @@ -372,8 +352,9 @@ Use these links to navigate to a particular top-level stanza. Note that we need the CA key so that we can generate server and client certificates. It is particularly important for the client certificates since they need to have host IPs - as Subject Alternative Names. In the future, we may support bringing your own server - certificates. + as Subject Alternative Names. If you are setting server certs yourself via `server.serverCert` + and you are not enabling clients (or clients are enabled with autoEncrypt) then you do not + need to provide the CA key. - `secretName` ((#v-global-tls-cakey-secretname)) (`string: null`) - The name of the Kubernetes or Vault secret that holds the CA key. @@ -430,9 +411,9 @@ Use these links to navigate to a particular top-level stanza. - `tolerations` ((#v-global-acls-tolerations)) (`string: ""`) - tolerations configures the taints and tolerations for the server-acl-init and server-acl-init-cleanup jobs. This should be a multi-line string matching the - Tolerations (https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/) array in a Pod spec. + [Tolerations](https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/) array in a Pod spec. - - `nodeSelector` ((#v-global-acls-nodeselector)) (`string: null`) - This value defines `nodeSelector` (https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#nodeselector) + - `nodeSelector` ((#v-global-acls-nodeselector)) (`string: null`) - This value defines [`nodeSelector`](https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#nodeselector) labels for the server-acl-init and server-acl-init-cleanup jobs pod assignment, formatted as a multi-line string. Example: @@ -482,7 +463,7 @@ Use these links to navigate to a particular top-level stanza. This address must be reachable from the Consul servers in the primary datacenter. This auth method will be used to provision ACL tokens for Consul components and is different from the one used by the Consul Service Mesh. - Please see the [Kubernetes Auth Method documentation](https://consul.io/docs/acl/auth-methods/kubernetes). + Please refer to the [Kubernetes Auth Method documentation](https://developer.hashicorp.com/consul/docs/security/acl/auth-methods/kubernetes). You can retrieve this value from your `kubeconfig` by running: @@ -593,7 +574,7 @@ Use these links to navigate to a particular top-level stanza. Consul server agents. - `replicas` ((#v-server-replicas)) (`integer: 1`) - The number of server agents to run. This determines the fault tolerance of - the cluster. Please see the deployment table (https://consul.io/docs/internals/consensus#deployment-table) + the cluster. Please refer to the [deployment table](https://developer.hashicorp.com/consul/docs/architecture/consensus#deployment-table) for more information. - `bootstrapExpect` ((#v-server-bootstrapexpect)) (`int: null`) - The number of servers that are expected to be running. @@ -632,8 +613,8 @@ Use these links to navigate to a particular top-level stanza. Vault Secrets backend: If you are using Vault as a secrets backend, a Vault Policy must be created which allows `["create", "update"]` capabilities on the PKI issuing endpoint, which is usually of the form `pki/issue/consul-server`. - Please see the following guide for steps to generate a compatible certificate: - https://learn.hashicorp.com/tutorials/consul/vault-pki-consul-secure-tls + Complete [this tutorial](https://developer.hashicorp.com/consul/tutorials/vault-secure/vault-pki-consul-secure-tls) + to learn how to generate a compatible certificate. Note: when using TLS, both the `server.serverCert` and `global.tls.caCert` which points to the CA endpoint of this PKI engine must be provided. @@ -672,15 +653,15 @@ Use these links to navigate to a particular top-level stanza. storage classes, the PersistentVolumeClaims would need to be manually created. A `null` value will use the Kubernetes cluster's default StorageClass. If a default StorageClass does not exist, you will need to create one. - Refer to the [Read/Write Tuning](https://www.consul.io/docs/install/performance#read-write-tuning) + Refer to the [Read/Write Tuning](https://developer.hashicorp.com/consul/docs/install/performance#read-write-tuning) section of the Server Performance Requirements documentation for considerations around choosing a performant storage class. - ~> **Note:** The [Reference Architecture](https://learn.hashicorp.com/tutorials/consul/reference-architecture#hardware-sizing-for-consul-servers) + ~> **Note:** The [Reference Architecture](https://developer.hashicorp.com/consul/tutorials/production-deploy/reference-architecture#hardware-sizing-for-consul-servers) contains best practices and recommendations for selecting suitable hardware sizes for your Consul servers. - - `connect` ((#v-server-connect)) (`boolean: true`) - This will enable/disable Connect (https://consul.io/docs/connect). Setting this to true + - `connect` ((#v-server-connect)) (`boolean: true`) - This will enable/disable [Connect](https://developer.hashicorp.com/consul/docs/connect). Setting this to true _will not_ automatically secure pod communication, this setting will only enable usage of the feature. Consul will automatically initialize a new CA and set of certificates. Additional Connect settings can be configured @@ -699,7 +680,7 @@ Use these links to navigate to a particular top-level stanza. - `resources` ((#v-server-resources)) (`map`) - The resource requests (CPU, memory, etc.) for each of the server agents. This should be a YAML map corresponding to a Kubernetes - ResourceRequirements (https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.24/#resourcerequirements-v1-core) + [`ResourceRequirements``](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.24/#resourcerequirements-v1-core) object. NOTE: The use of a YAML string is deprecated. Example: @@ -730,11 +711,12 @@ Use these links to navigate to a particular top-level stanza. - `updatePartition` ((#v-server-updatepartition)) (`integer: 0`) - This value is used to carefully control a rolling update of Consul server agents. This value specifies the - partition (https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/#partitions) - for performing a rolling update. Please read the linked Kubernetes documentation - and https://www.consul.io/docs/k8s/upgrade#upgrading-consul-servers for more information. + [partition](https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/#partitions) + for performing a rolling update. Please read the linked Kubernetes + and [Upgrade Consul](https://developer.hashicorp.com/consul/docs/k8s/upgrade#upgrading-consul-servers) + documentation for more information. - - `disruptionBudget` ((#v-server-disruptionbudget)) - This configures the PodDisruptionBudget (https://kubernetes.io/docs/tasks/run-application/configure-pdb/) + - `disruptionBudget` ((#v-server-disruptionbudget)) - This configures the [`PodDisruptionBudget`](https://kubernetes.io/docs/tasks/run-application/configure-pdb/) for the server cluster. - `enabled` ((#v-server-disruptionbudget-enabled)) (`boolean: true`) - Enables registering a PodDisruptionBudget for the server @@ -747,7 +729,7 @@ Use these links to navigate to a particular top-level stanza. --set 'server.disruptionBudget.maxUnavailable=0'` flag to the helm chart installation command because of a limitation in the Helm templating language. - - `extraConfig` ((#v-server-extraconfig)) (`string: {}`) - A raw string of extra JSON configuration (https://consul.io/docs/agent/options) for Consul + - `extraConfig` ((#v-server-extraconfig)) (`string: {}`) - A raw string of extra [JSON configuration](https://developer.hashicorp.com/consul/docs/agent/config/config-files) for Consul servers. This will be saved as-is into a ConfigMap that is read by the Consul server agents. This can be used to add additional configuration that isn't directly exposed by the chart. @@ -803,7 +785,7 @@ Use these links to navigate to a particular top-level stanza. - ... ``` - - `affinity` ((#v-server-affinity)) (`string`) - This value defines the affinity (https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#affinity-and-anti-affinity) + - `affinity` ((#v-server-affinity)) (`string`) - This value defines the [affinity](https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#affinity-and-anti-affinity) for server pods. It defaults to allowing only a single server pod on each node, which minimizes risk of the cluster becoming unusable if a node is lost. If you need to run more pods per node (for example, testing on Minikube), set this value @@ -824,12 +806,14 @@ Use these links to navigate to a particular top-level stanza. ``` - `tolerations` ((#v-server-tolerations)) (`string: ""`) - Toleration settings for server pods. This - should be a multi-line string matching the Tolerations - (https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/) array in a Pod spec. + should be a multi-line string matching the + [Tolerations](https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/) + array in a Pod spec. - `topologySpreadConstraints` ((#v-server-topologyspreadconstraints)) (`string: ""`) - Pod topology spread constraints for server pods. - This should be a multi-line YAML string matching the `topologySpreadConstraints` array - (https://kubernetes.io/docs/concepts/workloads/pods/pod-topology-spread-constraints/) in a Pod Spec. + This should be a multi-line YAML string matching the + [`topologySpreadConstraints`](https://kubernetes.io/docs/concepts/workloads/pods/pod-topology-spread-constraints/) + array in a Pod Spec. This requires K8S >= 1.18 (beta) or 1.19 (stable). @@ -847,7 +831,7 @@ Use these links to navigate to a particular top-level stanza. component: server ``` - - `nodeSelector` ((#v-server-nodeselector)) (`string: null`) - This value defines `nodeSelector` (https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#nodeselector) + - `nodeSelector` ((#v-server-nodeselector)) (`string: null`) - This value defines [`nodeSelector`](https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#nodeselector) labels for server pod assignment, formatted as a multi-line string. Example: @@ -858,7 +842,7 @@ Use these links to navigate to a particular top-level stanza. ``` - `priorityClassName` ((#v-server-priorityclassname)) (`string: ""`) - This value references an existing - Kubernetes `priorityClassName` (https://kubernetes.io/docs/concepts/configuration/pod-priority-preemption/#pod-priority) + Kubernetes [`priorityClassName`](https://kubernetes.io/docs/concepts/configuration/pod-priority-preemption/#pod-priority) that can be assigned to server pods. - `extraLabels` ((#v-server-extralabels)) (`map`) - Extra labels to attach to the server pods. This should be a YAML map. @@ -921,19 +905,19 @@ Use these links to navigate to a particular top-level stanza. feature, in case kubernetes cluster is behind egress http proxies. Additionally, it could be used to configure custom consul parameters. - - `snapshotAgent` ((#v-server-snapshotagent)) - Values for setting up and running snapshot agents - (https://consul.io/commands/snapshot/agent) + - `snapshotAgent` ((#v-server-snapshotagent)) - Values for setting up and running + [snapshot agents](https://developer.hashicorp.com/consul/commands/snapshot/agent) within the Consul clusters. They run as a sidecar with Consul servers. - `enabled` ((#v-server-snapshotagent-enabled)) (`boolean: false`) - If true, the chart will install resources necessary to run the snapshot agent. - `interval` ((#v-server-snapshotagent-interval)) (`string: 1h`) - Interval at which to perform snapshots. - See https://www.consul.io/commands/snapshot/agent#interval + Refer to [`interval`](https://developer.hashicorp.com/consul/commands/snapshot/agent#interval) - `configSecret` ((#v-server-snapshotagent-configsecret)) - A Kubernetes or Vault secret that should be manually created to contain the entire config to be used on the snapshot agent. This is the preferred method of configuration since there are usually storage - credentials present. Please see Snapshot agent config (https://consul.io/commands/snapshot/agent#config-file-options) + credentials present. Please refer to the [Snapshot agent config](https://developer.hashicorp.com/consul/commands/snapshot/agent#config-file-options) for details. - `secretName` ((#v-server-snapshotagent-configsecret-secretname)) (`string: null`) - The name of the Kubernetes secret or Vault secret path that holds the snapshot agent config. @@ -991,7 +975,7 @@ Use these links to navigate to a particular top-level stanza. - `k8sAuthMethodHost` ((#v-externalservers-k8sauthmethodhost)) (`string: null`) - If you are setting `global.acls.manageSystemACLs` and `connectInject.enabled` to true, set `k8sAuthMethodHost` to the address of the Kubernetes API server. This address must be reachable from the Consul servers. - Please see the Kubernetes Auth Method documentation (https://consul.io/docs/acl/auth-methods/kubernetes). + Please refer to the [Kubernetes Auth Method documentation](https://developer.hashicorp.com/consul/docs/security/acl/auth-methods/kubernetes). You could retrieve this value from your `kubeconfig` by running: @@ -1014,7 +998,7 @@ Use these links to navigate to a particular top-level stanza. - `image` ((#v-client-image)) (`string: null`) - The name of the Docker image (including any tag) for the containers running Consul client agents. - - `join` ((#v-client-join)) (`array: null`) - A list of valid `-retry-join` values (https://www.consul.io/docs/agent/config/cli-flags#_retry_join). + - `join` ((#v-client-join)) (`array: null`) - A list of valid [`-retry-join` values](https://developer.hashicorp.com/consul/docs/agent/config/cli-flags#_retry_join). If this is `null` (default), then the clients will attempt to automatically join the server cluster running within Kubernetes. This means that with `server.enabled` set to true, clients will automatically @@ -1035,7 +1019,7 @@ Use these links to navigate to a particular top-level stanza. required for Connect. - `nodeMeta` ((#v-client-nodemeta)) - nodeMeta specifies an arbitrary metadata key/value pair to associate with the node - (see https://www.consul.io/docs/agent/config/cli-flags#_node_meta) + (refer to [`-node-meta`](https://developer.hashicorp.com/consul/docs/agent/config/cli-flags#_node_meta)) - `pod-name` ((#v-client-nodemeta-pod-name)) (`string: ${HOSTNAME}`) @@ -1079,7 +1063,7 @@ Use these links to navigate to a particular top-level stanza. - `tlsInit` ((#v-client-containersecuritycontext-tlsinit)) (`map`) - The tls-init initContainer - - `extraConfig` ((#v-client-extraconfig)) (`string: {}`) - A raw string of extra JSON configuration (https://consul.io/docs/agent/options) for Consul + - `extraConfig` ((#v-client-extraconfig)) (`string: {}`) - A raw string of extra [JSON configuration](https://developer.hashicorp.com/consul/docs/agent/config/config-files) for Consul clients. This will be saved as-is into a ConfigMap that is read by the Consul client agents. This can be used to add additional configuration that isn't directly exposed by the chart. @@ -1172,7 +1156,7 @@ Use these links to navigate to a particular top-level stanza. ``` - `priorityClassName` ((#v-client-priorityclassname)) (`string: ""`) - This value references an existing - Kubernetes `priorityClassName` (https://kubernetes.io/docs/concepts/configuration/pod-priority-preemption/#pod-priority) + Kubernetes [`priorityClassName`](https://kubernetes.io/docs/concepts/configuration/pod-priority-preemption/#pod-priority) that can be assigned to client pods. - `annotations` ((#v-client-annotations)) (`string: null`) - This value defines additional annotations for @@ -1199,7 +1183,7 @@ Use these links to navigate to a particular top-level stanza. feature, in case kubernetes cluster is behind egress http proxies. Additionally, it could be used to configure custom consul parameters. - - `dnsPolicy` ((#v-client-dnspolicy)) (`string: null`) - This value defines the Pod DNS policy (https://kubernetes.io/docs/concepts/services-networking/dns-pod-service/#pod-s-dns-policy) + - `dnsPolicy` ((#v-client-dnspolicy)) (`string: null`) - This value defines the [Pod DNS policy](https://kubernetes.io/docs/concepts/services-networking/dns-pod-service/#pod-s-dns-policy) for client pods to use. - `hostNetwork` ((#v-client-hostnetwork)) (`boolean: false`) - hostNetwork defines whether or not we use host networking instead of hostPort in the event @@ -1209,7 +1193,8 @@ Use these links to navigate to a particular top-level stanza. combined with `dnsPolicy: ClusterFirstWithHostNet` - `updateStrategy` ((#v-client-updatestrategy)) (`string: null`) - updateStrategy for the DaemonSet. - See https://kubernetes.io/docs/tasks/manage-daemon/update-daemon-set/#daemonset-update-strategy. + Refer to the Kubernetes [Daemonset upgrade strategy](https://kubernetes.io/docs/tasks/manage-daemon/update-daemon-set/#daemonset-update-strategy) + documentation. This should be a multi-line string mapping directly to the updateStrategy Example: @@ -1307,7 +1292,7 @@ Use these links to navigate to a particular top-level stanza. - `ingressClassName` ((#v-ui-ingress-ingressclassname)) (`string: ""`) - Optionally set the ingressClassName. - - `pathType` ((#v-ui-ingress-pathtype)) (`string: Prefix`) - pathType override - see: https://kubernetes.io/docs/concepts/services-networking/ingress/#path-types + - `pathType` ((#v-ui-ingress-pathtype)) (`string: Prefix`) - pathType override - refer to: https://kubernetes.io/docs/concepts/services-networking/ingress/#path-types - `hosts` ((#v-ui-ingress-hosts)) (`array`) - hosts is a list of host name to create Ingress rules. @@ -1343,16 +1328,17 @@ Use these links to navigate to a particular top-level stanza. - `enabled` ((#v-ui-metrics-enabled)) (`boolean: global.metrics.enabled`) - Enable displaying metrics in the UI. The default value of "-" will inherit from `global.metrics.enabled` value. - - `provider` ((#v-ui-metrics-provider)) (`string: prometheus`) - Provider for metrics. See - https://www.consul.io/docs/agent/options#ui_config_metrics_provider + - `provider` ((#v-ui-metrics-provider)) (`string: prometheus`) - Provider for metrics. Refer to + [`metrics_provider`](https://developer.hashicorp.com/consul/docs/agent/config/config-files#ui_config_metrics_provider) This value is only used if `ui.enabled` is set to true. - `baseURL` ((#v-ui-metrics-baseurl)) (`string: http://prometheus-server`) - baseURL is the URL of the prometheus server, usually the service URL. This value is only used if `ui.enabled` is set to true. - - `dashboardURLTemplates` ((#v-ui-dashboardurltemplates)) - Corresponds to https://www.consul.io/docs/agent/options#ui_config_dashboard_url_templates configuration. + - `dashboardURLTemplates` ((#v-ui-dashboardurltemplates)) - Corresponds to [`dashboard_url_templates`](https://developer.hashicorp.com/consul/docs/agent/config/config-files#ui_config_dashboard_url_templates) + configuration. - - `service` ((#v-ui-dashboardurltemplates-service)) (`string: ""`) - Sets https://www.consul.io/docs/agent/options#ui_config_dashboard_url_templates_service. + - `service` ((#v-ui-dashboardurltemplates-service)) (`string: ""`) - Sets [`dashboardURLTemplates.service`](https://developer.hashicorp.com/consul/docs/agent/config/config-files#ui_config_dashboard_url_templates_service). ### syncCatalog ((#h-synccatalog)) @@ -1372,8 +1358,8 @@ Use these links to navigate to a particular top-level stanza. to run the sync program. - `default` ((#v-synccatalog-default)) (`boolean: true`) - If true, all valid services in K8S are - synced by default. If false, the service must be annotated - (https://consul.io/docs/k8s/service-sync#sync-enable-disable) properly to sync. + synced by default. If false, the service must be [annotated](https://developer.hashicorp.com/consul/docs/k8s/service-sync#enable-and-disable-sync) + properly to sync. In either case an annotation can override the default. - `priorityClassName` ((#v-synccatalog-priorityclassname)) (`string: ""`) - Optional priorityClassName. @@ -1486,7 +1472,7 @@ Use these links to navigate to a particular top-level stanza. - `secretKey` ((#v-synccatalog-aclsynctoken-secretkey)) (`string: null`) - The key within the Kubernetes secret that holds the acl sync token. - - `nodeSelector` ((#v-synccatalog-nodeselector)) (`string: null`) - This value defines `nodeSelector` (https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#nodeselector) + - `nodeSelector` ((#v-synccatalog-nodeselector)) (`string: null`) - This value defines [`nodeSelector`](https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#nodeselector) labels for catalog sync pod assignment, formatted as a multi-line string. Example: @@ -1552,7 +1538,7 @@ Use these links to navigate to a particular top-level stanza. - `default` ((#v-connectinject-default)) (`boolean: false`) - If true, the injector will inject the Connect sidecar into all pods by default. Otherwise, pods must specify the - injection annotation (https://consul.io/docs/k8s/connect#consul-hashicorp-com-connect-inject) + [injection annotation](https://developer.hashicorp.com/consul/docs/k8s/connect#consul-hashicorp-com-connect-inject) to opt-in to Connect injection. If this is true, pods can use the same annotation to explicitly opt-out of injection. @@ -1570,7 +1556,7 @@ Use these links to navigate to a particular top-level stanza. This value is also overridable via the "consul.hashicorp.com/transparent-proxy-overwrite-probes" annotation. Note: This value has no effect if transparent proxy is disabled on the pod. - - `disruptionBudget` ((#v-connectinject-disruptionbudget)) - This configures the PodDisruptionBudget (https://kubernetes.io/docs/tasks/run-application/configure-pdb/) + - `disruptionBudget` ((#v-connectinject-disruptionbudget)) - This configures the [`PodDisruptionBudget`](https://kubernetes.io/docs/tasks/run-application/configure-pdb/) for the service mesh sidecar injector. - `enabled` ((#v-connectinject-disruptionbudget-enabled)) (`boolean: true`) - This will enable/disable registering a PodDisruptionBudget for the @@ -1629,7 +1615,8 @@ Use these links to navigate to a particular top-level stanza. by the OpenShift platform. - `updateStrategy` ((#v-connectinject-cni-updatestrategy)) (`string: null`) - updateStrategy for the CNI installer DaemonSet. - See https://kubernetes.io/docs/tasks/manage-daemon/update-daemon-set/#daemonset-update-strategy. + Refer to the Kubernetes [Daemonset upgrade strategy](https://kubernetes.io/docs/tasks/manage-daemon/update-daemon-set/#daemonset-update-strategy) + documentation. This should be a multi-line string mapping directly to the updateStrategy Example: @@ -1742,12 +1729,12 @@ Use these links to navigate to a particular top-level stanza. - `namespaceSelector` ((#v-connectinject-namespaceselector)) (`string`) - Selector for restricting the webhook to only specific namespaces. Use with `connectInject.default: true` to automatically inject all pods in namespaces that match the selector. This should be set to a multiline string. - See https://kubernetes.io/docs/reference/access-authn-authz/extensible-admission-controllers/#matching-requests-namespaceselector + Refer to https://kubernetes.io/docs/reference/access-authn-authz/extensible-admission-controllers/#matching-requests-namespaceselector for more details. - By default, we exclude the kube-system namespace since usually users won't - want those pods injected and also the local-path-storage namespace so that - Kind (Kubernetes In Docker) can provision Pods used to create PVCs. + By default, we exclude kube-system since usually users won't + want those pods injected and local-path-storage and openebs so that + Kind (Kubernetes In Docker) and [OpenEBS](https://openebs.io/) respectively can provision Pods used to create PVCs. Note that this exclusion is only supported in Kubernetes v1.21.1+. Example: @@ -1829,8 +1816,8 @@ Use these links to navigate to a particular top-level stanza. If set to an empty string all service accounts can log in. This only has effect if ACLs are enabled. - See https://www.consul.io/docs/acl/acl-auth-methods.html#binding-rules - and https://www.consul.io/docs/acl/auth-methods/kubernetes.html#trusted-identity-attributes + Refer to Auth methods [Binding rules](https://developer.hashicorp.com/consul/docs/security/acl/auth-methods#binding-rules) + and [Trusted identiy attributes](https://developer.hashicorp.com/consul/docs/security/acl/auth-methods/kubernetes#trusted-identity-attributes) for more details. Requires Consul >= v1.5. @@ -1856,7 +1843,7 @@ Use these links to navigate to a particular top-level stanza. leads to unnecessary thread and memory usage and leaves unnecessary idle connections open. It is advised to keep this number low for sidecars and high for edge proxies. This will control the `--concurrency` flag to Envoy. - For additional information see also: https://blog.envoyproxy.io/envoy-threading-model-a8d44b922310 + For additional information, refer to https://blog.envoyproxy.io/envoy-threading-model-a8d44b922310 This setting can be overridden on a per-pod basis via this annotation: - `consul.hashicorp.com/consul-envoy-proxy-concurrency` @@ -1924,7 +1911,7 @@ Use these links to navigate to a particular top-level stanza. - `port` ((#v-meshgateway-wanaddress-port)) (`integer: 443`) - Port that gets registered for WAN traffic. If source is set to "Service" then this setting will have no effect. - See the documentation for source as to which port will be used in that + Refer to the documentation for source as to which port will be used in that case. - `static` ((#v-meshgateway-wanaddress-static)) (`string: ""`) - If source is set to "Static" then this value will be used as the WAN @@ -1989,7 +1976,7 @@ Use these links to navigate to a particular top-level stanza. - `initServiceInitContainer` ((#v-meshgateway-initserviceinitcontainer)) (`map`) - The resource settings for the `service-init` init container. - - `affinity` ((#v-meshgateway-affinity)) (`string: null`) - This value defines the affinity (https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#affinity-and-anti-affinity) + - `affinity` ((#v-meshgateway-affinity)) (`string: null`) - This value defines the [affinity](https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#affinity-and-anti-affinity) for mesh gateway pods. It defaults to `null` thereby allowing multiple gateway pods on each node. But if one would prefer a mode which minimizes risk of the cluster becoming unusable if a node is lost, set this value to the value in the example below. @@ -2011,8 +1998,9 @@ Use these links to navigate to a particular top-level stanza. - `tolerations` ((#v-meshgateway-tolerations)) (`string: null`) - Optional YAML string to specify tolerations. - `topologySpreadConstraints` ((#v-meshgateway-topologyspreadconstraints)) (`string: ""`) - Pod topology spread constraints for mesh gateway pods. - This should be a multi-line YAML string matching the `topologySpreadConstraints` array - (https://kubernetes.io/docs/concepts/workloads/pods/pod-topology-spread-constraints/) in a Pod Spec. + This should be a multi-line YAML string matching the + [`topologySpreadConstraints`](https://kubernetes.io/docs/concepts/workloads/pods/pod-topology-spread-constraints/) + array in a Pod Spec. This requires K8S >= 1.18 (beta) or 1.19 (stable). @@ -2102,7 +2090,7 @@ Use these links to navigate to a particular top-level stanza. - `resources` ((#v-ingressgateways-defaults-resources)) (`map`) - Resource limits for all ingress gateway pods - - `affinity` ((#v-ingressgateways-defaults-affinity)) (`string: null`) - This value defines the affinity (https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#affinity-and-anti-affinity) + - `affinity` ((#v-ingressgateways-defaults-affinity)) (`string: null`) - This value defines the [affinity](https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#affinity-and-anti-affinity) for ingress gateway pods. It defaults to `null` thereby allowing multiple gateway pods on each node. But if one would prefer a mode which minimizes risk of the cluster becoming unusable if a node is lost, set this value to the value in the example below. @@ -2124,8 +2112,9 @@ Use these links to navigate to a particular top-level stanza. - `tolerations` ((#v-ingressgateways-defaults-tolerations)) (`string: null`) - Optional YAML string to specify tolerations. - `topologySpreadConstraints` ((#v-ingressgateways-defaults-topologyspreadconstraints)) (`string: ""`) - Pod topology spread constraints for ingress gateway pods. - This should be a multi-line YAML string matching the `topologySpreadConstraints` array - (https://kubernetes.io/docs/concepts/workloads/pods/pod-topology-spread-constraints/) in a Pod Spec. + This should be a multi-line YAML string matching the + [`topologySpreadConstraints`](https://kubernetes.io/docs/concepts/workloads/pods/pod-topology-spread-constraints/) + array in a Pod Spec. This requires K8S >= 1.18 (beta) or 1.19 (stable). @@ -2208,7 +2197,7 @@ Use these links to navigate to a particular top-level stanza. - `resources` ((#v-terminatinggateways-defaults-resources)) (`map`) - Resource limits for all terminating gateway pods - - `affinity` ((#v-terminatinggateways-defaults-affinity)) (`string: null`) - This value defines the affinity (https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#affinity-and-anti-affinity) + - `affinity` ((#v-terminatinggateways-defaults-affinity)) (`string: null`) - This value defines the [affinity](https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#affinity-and-anti-affinity) for terminating gateway pods. It defaults to `null` thereby allowing multiple gateway pods on each node. But if one would prefer a mode which minimizes risk of the cluster becoming unusable if a node is lost, set this value to the value in the example below. @@ -2230,8 +2219,9 @@ Use these links to navigate to a particular top-level stanza. - `tolerations` ((#v-terminatinggateways-defaults-tolerations)) (`string: null`) - Optional YAML string to specify tolerations. - `topologySpreadConstraints` ((#v-terminatinggateways-defaults-topologyspreadconstraints)) (`string: ""`) - Pod topology spread constraints for terminating gateway pods. - This should be a multi-line YAML string matching the `topologySpreadConstraints` array - (https://kubernetes.io/docs/concepts/workloads/pods/pod-topology-spread-constraints/) in a Pod Spec. + This should be a multi-line YAML string matching the + [`topologySpreadConstraints`](https://kubernetes.io/docs/concepts/workloads/pods/pod-topology-spread-constraints/) + array in a Pod Spec. This requires K8S >= 1.18 (beta) or 1.19 (stable). @@ -2306,7 +2296,7 @@ Use these links to navigate to a particular top-level stanza. - `enabled` ((#v-apigateway-managedgatewayclass-enabled)) (`boolean: true`) - When true a GatewayClass is configured to automatically work with Consul as installed by helm. - - `nodeSelector` ((#v-apigateway-managedgatewayclass-nodeselector)) (`string: null`) - This value defines `nodeSelector` (https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#nodeselector) + - `nodeSelector` ((#v-apigateway-managedgatewayclass-nodeselector)) (`string: null`) - This value defines [`nodeSelector`](https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#nodeselector) labels for gateway pod assignment, formatted as a multi-line string. Example: @@ -2370,10 +2360,10 @@ Use these links to navigate to a particular top-level stanza. ``` - `priorityClassName` ((#v-apigateway-controller-priorityclassname)) (`string: ""`) - This value references an existing - Kubernetes `priorityClassName` (https://kubernetes.io/docs/concepts/configuration/pod-priority-preemption/#pod-priority) + Kubernetes [`priorityClassName`](https://kubernetes.io/docs/concepts/configuration/pod-priority-preemption/#pod-priority) that can be assigned to api-gateway-controller pods. - - `nodeSelector` ((#v-apigateway-controller-nodeselector)) (`string: null`) - This value defines `nodeSelector` (https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#nodeselector) + - `nodeSelector` ((#v-apigateway-controller-nodeselector)) (`string: null`) - This value defines [`nodeSelector`](https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#nodeselector) labels for api-gateway-controller pod assignment, formatted as a multi-line string. Example: @@ -2384,7 +2374,7 @@ Use these links to navigate to a particular top-level stanza. ``` - `tolerations` ((#v-apigateway-controller-tolerations)) (`string: null`) - This value defines the tolerations for api-gateway-controller pod, this should be a multi-line string matching the - Tolerations (https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/) array in a Pod spec. + [Tolerations](https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/) array in a Pod spec. - `service` ((#v-apigateway-controller-service)) - Configuration for the Service created for the api-gateway-controller @@ -2408,7 +2398,7 @@ Use these links to navigate to a particular top-level stanza. This should be a multi-line string matching the Toleration array in a PodSpec. - - `nodeSelector` ((#v-webhookcertmanager-nodeselector)) (`string: null`) - This value defines `nodeSelector` (https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#nodeselector) + - `nodeSelector` ((#v-webhookcertmanager-nodeselector)) (`string: null`) - This value defines [`nodeSelector`](https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#nodeselector) labels for the webhook-cert-manager pod assignment, formatted as a multi-line string. Example: From 3cbbd63ba22ce35ae9f2d9e429fa5027e85c7fa1 Mon Sep 17 00:00:00 2001 From: amitchahalgits <109494649+amitchahalgits@users.noreply.github.com> Date: Tue, 28 Feb 2023 13:43:12 +1100 Subject: [PATCH 077/262] Update ingress-gateways.mdx (#16330) * Update ingress-gateways.mdx Added an example of running the HELM install for the ingress gateways using values.yaml * Apply suggestions from code review * Update ingress-gateways.mdx Adds closing back ticks on example command. The suggesting UI strips them out. --------- Co-authored-by: trujillo-adam <47586768+trujillo-adam@users.noreply.github.com> --- website/content/docs/k8s/connect/ingress-gateways.mdx | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/website/content/docs/k8s/connect/ingress-gateways.mdx b/website/content/docs/k8s/connect/ingress-gateways.mdx index 1d2072ae3a0..b971484ecc1 100644 --- a/website/content/docs/k8s/connect/ingress-gateways.mdx +++ b/website/content/docs/k8s/connect/ingress-gateways.mdx @@ -62,6 +62,12 @@ Ensure you have the latest consul-helm chart and install Consul via helm using t [guide](/consul/docs/k8s/installation/install#installing-consul) while being sure to provide the yaml configuration as previously discussed. +The following example installs Consul 1.0.4 using the `values.yaml` configuration: + +```shell-session +$ helm install consul -f values.yaml hashicorp/consul --version 1.0.4 --wait --debug +``` + ## Configuring the gateway Now that Consul has been installed with ingress gateways enabled, From 73b9b407ba357f99cd02b5387fa15e159ab24327 Mon Sep 17 00:00:00 2001 From: Dan Upton Date: Tue, 28 Feb 2023 10:18:38 +0000 Subject: [PATCH 078/262] grpc: fix data race in balancer registration (#16229) Registering gRPC balancers is thread-unsafe because they are stored in a global map variable that is accessed without holding a lock. Therefore, it's expected that balancers are registered _once_ at the beginning of your program (e.g. in a package `init` function) and certainly not after you've started dialing connections, etc. > NOTE: this function must only be called during initialization time > (i.e. in an init() function), and is not thread-safe. While this is fine for us in production, it's challenging for tests that spin up multiple agents in-memory. We currently register a balancer per- agent which holds agent-specific state that cannot safely be shared. This commit introduces our own registry that _is_ thread-safe, and implements the Builder interface such that we can call gRPC's `Register` method once, on start-up. It uses the same pattern as our resolver registry where we use the dial target's host (aka "authority"), which is unique per-agent, to determine which builder to use. --- agent/agent.go | 5 +- agent/consul/client_test.go | 5 +- agent/consul/rpc_test.go | 3 +- agent/consul/subscribe_backend_test.go | 15 ++-- agent/grpc-internal/balancer/balancer.go | 40 +++++------ agent/grpc-internal/balancer/balancer_test.go | 41 ++++++----- agent/grpc-internal/balancer/registry.go | 69 +++++++++++++++++++ agent/grpc-internal/client.go | 34 ++++----- agent/grpc-internal/client_test.go | 38 ++++------ agent/grpc-internal/handler_test.go | 6 +- agent/rpc/peering/service_test.go | 4 +- agent/setup.go | 23 ++++++- 12 files changed, 179 insertions(+), 104 deletions(-) create mode 100644 agent/grpc-internal/balancer/registry.go diff --git a/agent/agent.go b/agent/agent.go index ec148637421..7b218174a48 100644 --- a/agent/agent.go +++ b/agent/agent.go @@ -1599,10 +1599,7 @@ func (a *Agent) ShutdownAgent() error { a.stopLicenseManager() - // this would be cancelled anyways (by the closing of the shutdown ch) but - // this should help them to be stopped more quickly - a.baseDeps.AutoConfig.Stop() - a.baseDeps.MetricsConfig.Cancel() + a.baseDeps.Close() a.stateLock.Lock() defer a.stateLock.Unlock() diff --git a/agent/consul/client_test.go b/agent/consul/client_test.go index 15af5550946..97958b48662 100644 --- a/agent/consul/client_test.go +++ b/agent/consul/client_test.go @@ -522,9 +522,13 @@ func newDefaultDeps(t *testing.T, c *Config) Deps { resolverBuilder := resolver.NewServerResolverBuilder(newTestResolverConfig(t, c.NodeName+"-"+c.Datacenter)) resolver.Register(resolverBuilder) + t.Cleanup(func() { + resolver.Deregister(resolverBuilder.Authority()) + }) balancerBuilder := balancer.NewBuilder(resolverBuilder.Authority(), testutil.Logger(t)) balancerBuilder.Register() + t.Cleanup(balancerBuilder.Deregister) r := router.NewRouter( logger, @@ -559,7 +563,6 @@ func newDefaultDeps(t *testing.T, c *Config) Deps { UseTLSForDC: tls.UseTLS, DialingFromServer: true, DialingFromDatacenter: c.Datacenter, - BalancerBuilder: balancerBuilder, }), LeaderForwarder: resolverBuilder, NewRequestRecorderFunc: middleware.NewRequestRecorder, diff --git a/agent/consul/rpc_test.go b/agent/consul/rpc_test.go index 0eff59b2beb..fa0107dd188 100644 --- a/agent/consul/rpc_test.go +++ b/agent/consul/rpc_test.go @@ -1165,7 +1165,7 @@ func TestRPC_LocalTokenStrippedOnForward_GRPC(t *testing.T) { var conn *grpc.ClientConn { - client, resolverBuilder, balancerBuilder := newClientWithGRPCPlumbing(t, func(c *Config) { + client, resolverBuilder := newClientWithGRPCPlumbing(t, func(c *Config) { c.Datacenter = "dc2" c.PrimaryDatacenter = "dc1" c.RPCConfig.EnableStreaming = true @@ -1177,7 +1177,6 @@ func TestRPC_LocalTokenStrippedOnForward_GRPC(t *testing.T) { Servers: resolverBuilder, DialingFromServer: false, DialingFromDatacenter: "dc2", - BalancerBuilder: balancerBuilder, }) conn, err = pool.ClientConn("dc2") diff --git a/agent/consul/subscribe_backend_test.go b/agent/consul/subscribe_backend_test.go index a0d07e6480c..b0ae2366e7a 100644 --- a/agent/consul/subscribe_backend_test.go +++ b/agent/consul/subscribe_backend_test.go @@ -39,7 +39,7 @@ func TestSubscribeBackend_IntegrationWithServer_TLSEnabled(t *testing.T) { require.NoError(t, err) defer server.Shutdown() - client, resolverBuilder, balancerBuilder := newClientWithGRPCPlumbing(t, configureTLS, clientConfigVerifyOutgoing) + client, resolverBuilder := newClientWithGRPCPlumbing(t, configureTLS, clientConfigVerifyOutgoing) // Try to join testrpc.WaitForLeader(t, server.RPC, "dc1") @@ -71,7 +71,6 @@ func TestSubscribeBackend_IntegrationWithServer_TLSEnabled(t *testing.T) { UseTLSForDC: client.tlsConfigurator.UseTLS, DialingFromServer: true, DialingFromDatacenter: "dc1", - BalancerBuilder: balancerBuilder, }) conn, err := pool.ClientConn("dc1") require.NoError(t, err) @@ -116,7 +115,6 @@ func TestSubscribeBackend_IntegrationWithServer_TLSEnabled(t *testing.T) { UseTLSForDC: client.tlsConfigurator.UseTLS, DialingFromServer: true, DialingFromDatacenter: "dc1", - BalancerBuilder: balancerBuilder, }) conn, err := pool.ClientConn("dc1") require.NoError(t, err) @@ -191,7 +189,7 @@ func TestSubscribeBackend_IntegrationWithServer_TLSReload(t *testing.T) { defer server.Shutdown() // Set up a client with valid certs and verify_outgoing = true - client, resolverBuilder, balancerBuilder := newClientWithGRPCPlumbing(t, configureTLS, clientConfigVerifyOutgoing) + client, resolverBuilder := newClientWithGRPCPlumbing(t, configureTLS, clientConfigVerifyOutgoing) testrpc.WaitForLeader(t, server.RPC, "dc1") @@ -204,7 +202,6 @@ func TestSubscribeBackend_IntegrationWithServer_TLSReload(t *testing.T) { UseTLSForDC: client.tlsConfigurator.UseTLS, DialingFromServer: true, DialingFromDatacenter: "dc1", - BalancerBuilder: balancerBuilder, }) conn, err := pool.ClientConn("dc1") require.NoError(t, err) @@ -284,7 +281,7 @@ func TestSubscribeBackend_IntegrationWithServer_DeliversAllMessages(t *testing.T codec := rpcClient(t, server) defer codec.Close() - client, resolverBuilder, balancerBuilder := newClientWithGRPCPlumbing(t) + client, resolverBuilder := newClientWithGRPCPlumbing(t) // Try to join testrpc.WaitForLeader(t, server.RPC, "dc1") @@ -346,7 +343,6 @@ func TestSubscribeBackend_IntegrationWithServer_DeliversAllMessages(t *testing.T UseTLSForDC: client.tlsConfigurator.UseTLS, DialingFromServer: true, DialingFromDatacenter: "dc1", - BalancerBuilder: balancerBuilder, }) conn, err := pool.ClientConn("dc1") require.NoError(t, err) @@ -376,7 +372,7 @@ func TestSubscribeBackend_IntegrationWithServer_DeliversAllMessages(t *testing.T "at least some of the subscribers should have received non-snapshot updates") } -func newClientWithGRPCPlumbing(t *testing.T, ops ...func(*Config)) (*Client, *resolver.ServerResolverBuilder, *balancer.Builder) { +func newClientWithGRPCPlumbing(t *testing.T, ops ...func(*Config)) (*Client, *resolver.ServerResolverBuilder) { _, config := testClientConfig(t) for _, op := range ops { op(config) @@ -392,6 +388,7 @@ func newClientWithGRPCPlumbing(t *testing.T, ops ...func(*Config)) (*Client, *re balancerBuilder := balancer.NewBuilder(resolverBuilder.Authority(), testutil.Logger(t)) balancerBuilder.Register() + t.Cleanup(balancerBuilder.Deregister) deps := newDefaultDeps(t, config) deps.Router = router.NewRouter( @@ -406,7 +403,7 @@ func newClientWithGRPCPlumbing(t *testing.T, ops ...func(*Config)) (*Client, *re t.Cleanup(func() { client.Shutdown() }) - return client, resolverBuilder, balancerBuilder + return client, resolverBuilder } type testLogger interface { diff --git a/agent/grpc-internal/balancer/balancer.go b/agent/grpc-internal/balancer/balancer.go index efd349c82c9..64521d4567f 100644 --- a/agent/grpc-internal/balancer/balancer.go +++ b/agent/grpc-internal/balancer/balancer.go @@ -65,21 +65,25 @@ import ( "google.golang.org/grpc/status" ) -// NewBuilder constructs a new Builder with the given name. -func NewBuilder(name string, logger hclog.Logger) *Builder { +// NewBuilder constructs a new Builder. Calling Register will add the Builder +// to our global registry under the given "authority" such that it will be used +// when dialing targets in the form "consul-internal:///...", this +// allows us to add and remove balancers for different in-memory agents during +// tests. +func NewBuilder(authority string, logger hclog.Logger) *Builder { return &Builder{ - name: name, - logger: logger, - byTarget: make(map[string]*list.List), - shuffler: randomShuffler(), + authority: authority, + logger: logger, + byTarget: make(map[string]*list.List), + shuffler: randomShuffler(), } } // Builder implements gRPC's balancer.Builder interface to construct balancers. type Builder struct { - name string - logger hclog.Logger - shuffler shuffler + authority string + logger hclog.Logger + shuffler shuffler mu sync.Mutex byTarget map[string]*list.List @@ -129,19 +133,15 @@ func (b *Builder) removeBalancer(targetURL string, elem *list.Element) { } } -// Name implements the gRPC Balancer interface by returning its given name. -func (b *Builder) Name() string { return b.name } - -// gRPC's balancer.Register method is not thread-safe, so we guard our calls -// with a global lock (as it may be called from parallel tests). -var registerLock sync.Mutex - -// Register the Builder in gRPC's global registry using its given name. +// Register the Builder in our global registry. Users should call Deregister +// when finished using the Builder to clean-up global state. func (b *Builder) Register() { - registerLock.Lock() - defer registerLock.Unlock() + globalRegistry.register(b.authority, b) +} - gbalancer.Register(b) +// Deregister the Builder from our global registry to clean up state. +func (b *Builder) Deregister() { + globalRegistry.deregister(b.authority) } // Rebalance randomizes the priority order of servers for the given target to diff --git a/agent/grpc-internal/balancer/balancer_test.go b/agent/grpc-internal/balancer/balancer_test.go index 830092ab3cb..8406e7c7b70 100644 --- a/agent/grpc-internal/balancer/balancer_test.go +++ b/agent/grpc-internal/balancer/balancer_test.go @@ -21,6 +21,8 @@ import ( "google.golang.org/grpc/stats" "google.golang.org/grpc/status" + "github.com/hashicorp/go-uuid" + "github.com/hashicorp/consul/agent/grpc-middleware/testutil/testservice" "github.com/hashicorp/consul/sdk/testutil" "github.com/hashicorp/consul/sdk/testutil/retry" @@ -34,12 +36,13 @@ func TestBalancer(t *testing.T) { server1 := runServer(t, "server1") server2 := runServer(t, "server2") - target, _ := stubResolver(t, server1, server2) + target, authority, _ := stubResolver(t, server1, server2) - balancerBuilder := NewBuilder(t.Name(), testutil.Logger(t)) + balancerBuilder := NewBuilder(authority, testutil.Logger(t)) balancerBuilder.Register() + t.Cleanup(balancerBuilder.Deregister) - conn := dial(t, target, balancerBuilder) + conn := dial(t, target) client := testservice.NewSimpleClient(conn) var serverName string @@ -78,12 +81,13 @@ func TestBalancer(t *testing.T) { server1 := runServer(t, "server1") server2 := runServer(t, "server2") - target, _ := stubResolver(t, server1, server2) + target, authority, _ := stubResolver(t, server1, server2) - balancerBuilder := NewBuilder(t.Name(), testutil.Logger(t)) + balancerBuilder := NewBuilder(authority, testutil.Logger(t)) balancerBuilder.Register() + t.Cleanup(balancerBuilder.Deregister) - conn := dial(t, target, balancerBuilder) + conn := dial(t, target) client := testservice.NewSimpleClient(conn) // Figure out which server we're talking to now, and which we should switch to. @@ -123,10 +127,11 @@ func TestBalancer(t *testing.T) { server1 := runServer(t, "server1") server2 := runServer(t, "server2") - target, _ := stubResolver(t, server1, server2) + target, authority, _ := stubResolver(t, server1, server2) - balancerBuilder := NewBuilder(t.Name(), testutil.Logger(t)) + balancerBuilder := NewBuilder(authority, testutil.Logger(t)) balancerBuilder.Register() + t.Cleanup(balancerBuilder.Deregister) // Provide a custom prioritizer that causes Rebalance to choose whichever // server didn't get our first request. @@ -137,7 +142,7 @@ func TestBalancer(t *testing.T) { }) } - conn := dial(t, target, balancerBuilder) + conn := dial(t, target) client := testservice.NewSimpleClient(conn) // Figure out which server we're talking to now. @@ -177,12 +182,13 @@ func TestBalancer(t *testing.T) { server1 := runServer(t, "server1") server2 := runServer(t, "server2") - target, res := stubResolver(t, server1, server2) + target, authority, res := stubResolver(t, server1, server2) - balancerBuilder := NewBuilder(t.Name(), testutil.Logger(t)) + balancerBuilder := NewBuilder(authority, testutil.Logger(t)) balancerBuilder.Register() + t.Cleanup(balancerBuilder.Deregister) - conn := dial(t, target, balancerBuilder) + conn := dial(t, target) client := testservice.NewSimpleClient(conn) // Figure out which server we're talking to now. @@ -233,7 +239,7 @@ func TestBalancer(t *testing.T) { }) } -func stubResolver(t *testing.T, servers ...*server) (string, *manual.Resolver) { +func stubResolver(t *testing.T, servers ...*server) (string, string, *manual.Resolver) { t.Helper() addresses := make([]resolver.Address, len(servers)) @@ -249,7 +255,10 @@ func stubResolver(t *testing.T, servers ...*server) (string, *manual.Resolver) { resolver.Register(r) t.Cleanup(func() { resolver.UnregisterForTesting(scheme) }) - return fmt.Sprintf("%s://", scheme), r + authority, err := uuid.GenerateUUID() + require.NoError(t, err) + + return fmt.Sprintf("%s://%s", scheme, authority), authority, r } func runServer(t *testing.T, name string) *server { @@ -309,12 +318,12 @@ func (s *server) Something(context.Context, *testservice.Req) (*testservice.Resp return &testservice.Resp{ServerName: s.name}, nil } -func dial(t *testing.T, target string, builder *Builder) *grpc.ClientConn { +func dial(t *testing.T, target string) *grpc.ClientConn { conn, err := grpc.Dial( target, grpc.WithTransportCredentials(insecure.NewCredentials()), grpc.WithDefaultServiceConfig( - fmt.Sprintf(`{"loadBalancingConfig":[{"%s":{}}]}`, builder.Name()), + fmt.Sprintf(`{"loadBalancingConfig":[{"%s":{}}]}`, BuilderName), ), ) t.Cleanup(func() { diff --git a/agent/grpc-internal/balancer/registry.go b/agent/grpc-internal/balancer/registry.go new file mode 100644 index 00000000000..778b2c31c5f --- /dev/null +++ b/agent/grpc-internal/balancer/registry.go @@ -0,0 +1,69 @@ +package balancer + +import ( + "fmt" + "sync" + + gbalancer "google.golang.org/grpc/balancer" +) + +// BuilderName should be given in gRPC service configuration to enable our +// custom balancer. It refers to this package's global registry, rather than +// an instance of Builder to enable us to add and remove builders at runtime, +// specifically during tests. +const BuilderName = "consul-internal" + +// gRPC's balancer.Register method is thread-unsafe because it mutates a global +// map without holding a lock. As such, it's expected that you register custom +// balancers once at the start of your program (e.g. a package init function). +// +// In production, this is fine. Agents register a single instance of our builder +// and use it for the duration. Tests are where this becomes problematic, as we +// spin up several agents in-memory and register/deregister a builder for each, +// with its own agent-specific state, logger, etc. +// +// To avoid data races, we call gRPC's Register method once, on-package init, +// with a global registry struct that implements the Builder interface but +// delegates the building to N instances of our Builder that are registered and +// deregistered at runtime. We the dial target's host (aka "authority") which +// is unique per-agent to pick the correct builder. +func init() { + gbalancer.Register(globalRegistry) +} + +var globalRegistry = ®istry{ + byAuthority: make(map[string]*Builder), +} + +type registry struct { + mu sync.RWMutex + byAuthority map[string]*Builder +} + +func (r *registry) Build(cc gbalancer.ClientConn, opts gbalancer.BuildOptions) gbalancer.Balancer { + r.mu.RLock() + defer r.mu.RUnlock() + + auth := opts.Target.URL.Host + builder, ok := r.byAuthority[auth] + if !ok { + panic(fmt.Sprintf("no gRPC balancer builder registered for authority: %q", auth)) + } + return builder.Build(cc, opts) +} + +func (r *registry) Name() string { return BuilderName } + +func (r *registry) register(auth string, builder *Builder) { + r.mu.Lock() + defer r.mu.Unlock() + + r.byAuthority[auth] = builder +} + +func (r *registry) deregister(auth string) { + r.mu.Lock() + defer r.mu.Unlock() + + delete(r.byAuthority, auth) +} diff --git a/agent/grpc-internal/client.go b/agent/grpc-internal/client.go index 36431f2488a..38010ac2452 100644 --- a/agent/grpc-internal/client.go +++ b/agent/grpc-internal/client.go @@ -8,12 +8,12 @@ import ( "time" "google.golang.org/grpc" - gbalancer "google.golang.org/grpc/balancer" "google.golang.org/grpc/credentials/insecure" "google.golang.org/grpc/keepalive" "github.com/armon/go-metrics" + "github.com/hashicorp/consul/agent/grpc-internal/balancer" agentmiddleware "github.com/hashicorp/consul/agent/grpc-middleware" "github.com/hashicorp/consul/agent/metadata" "github.com/hashicorp/consul/agent/pool" @@ -22,8 +22,8 @@ import ( // grpcServiceConfig is provided as the default service config. // -// It configures our custom balancer (via the %s directive to interpolate its -// name) which will automatically switch servers on error. +// It configures our custom balancer which will automatically switch servers +// on error. // // It also enables gRPC's built-in automatic retries for RESOURCE_EXHAUSTED // errors *only*, as this is the status code servers will return for an @@ -41,7 +41,7 @@ import ( // but we're working on generating them automatically from the protobuf files const grpcServiceConfig = ` { - "loadBalancingConfig": [{"%s":{}}], + "loadBalancingConfig": [{"` + balancer.BuilderName + `":{}}], "methodConfig": [ { "name": [{}], @@ -131,12 +131,11 @@ const grpcServiceConfig = ` // ClientConnPool creates and stores a connection for each datacenter. type ClientConnPool struct { - dialer dialer - servers ServerLocator - gwResolverDep gatewayResolverDep - conns map[string]*grpc.ClientConn - connsLock sync.Mutex - balancerBuilder gbalancer.Builder + dialer dialer + servers ServerLocator + gwResolverDep gatewayResolverDep + conns map[string]*grpc.ClientConn + connsLock sync.Mutex } type ServerLocator interface { @@ -198,21 +197,14 @@ type ClientConnPoolConfig struct { // DialingFromDatacenter is the datacenter of the consul agent using this // pool. DialingFromDatacenter string - - // BalancerBuilder is a builder for the gRPC balancer that will be used. - BalancerBuilder gbalancer.Builder } // NewClientConnPool create new GRPC client pool to connect to servers using // GRPC over RPC. func NewClientConnPool(cfg ClientConnPoolConfig) *ClientConnPool { - if cfg.BalancerBuilder == nil { - panic("missing required BalancerBuilder") - } c := &ClientConnPool{ - servers: cfg.Servers, - conns: make(map[string]*grpc.ClientConn), - balancerBuilder: cfg.BalancerBuilder, + servers: cfg.Servers, + conns: make(map[string]*grpc.ClientConn), } c.dialer = newDialer(cfg, &c.gwResolverDep) return c @@ -251,9 +243,7 @@ func (c *ClientConnPool) dial(datacenter string, serverType string) (*grpc.Clien grpc.WithTransportCredentials(insecure.NewCredentials()), grpc.WithContextDialer(c.dialer), grpc.WithStatsHandler(agentmiddleware.NewStatsHandler(metrics.Default(), metricsLabels)), - grpc.WithDefaultServiceConfig( - fmt.Sprintf(grpcServiceConfig, c.balancerBuilder.Name()), - ), + grpc.WithDefaultServiceConfig(grpcServiceConfig), // Keep alive parameters are based on the same default ones we used for // Yamux. These are somewhat arbitrary but we did observe in scale testing // that the gRPC defaults (servers send keepalives only every 2 hours, diff --git a/agent/grpc-internal/client_test.go b/agent/grpc-internal/client_test.go index ebd0601ad4c..65e08feace7 100644 --- a/agent/grpc-internal/client_test.go +++ b/agent/grpc-internal/client_test.go @@ -13,7 +13,6 @@ import ( "github.com/hashicorp/go-hclog" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - gbalancer "google.golang.org/grpc/balancer" "github.com/hashicorp/consul/agent/grpc-internal/balancer" "github.com/hashicorp/consul/agent/grpc-internal/resolver" @@ -143,7 +142,8 @@ func TestNewDialer_IntegrationWithTLSEnabledHandler(t *testing.T) { // if this test is failing because of expired certificates // use the procedure in test/CA-GENERATION.md res := resolver.NewServerResolverBuilder(newConfig(t)) - registerWithGRPC(t, res) + bb := balancer.NewBuilder(res.Authority(), testutil.Logger(t)) + registerWithGRPC(t, res, bb) tlsConf, err := tlsutil.NewConfigurator(tlsutil.Config{ InternalRPC: tlsutil.ProtocolConfig{ @@ -168,7 +168,6 @@ func TestNewDialer_IntegrationWithTLSEnabledHandler(t *testing.T) { UseTLSForDC: tlsConf.UseTLS, DialingFromServer: true, DialingFromDatacenter: "dc1", - BalancerBuilder: balancerBuilder(t, res.Authority()), }) conn, err := pool.ClientConn("dc1") @@ -191,7 +190,8 @@ func TestNewDialer_IntegrationWithTLSEnabledHandler_viaMeshGateway(t *testing.T) gwAddr := ipaddr.FormatAddressPort("127.0.0.1", freeport.GetOne(t)) res := resolver.NewServerResolverBuilder(newConfig(t)) - registerWithGRPC(t, res) + bb := balancer.NewBuilder(res.Authority(), testutil.Logger(t)) + registerWithGRPC(t, res, bb) tlsConf, err := tlsutil.NewConfigurator(tlsutil.Config{ InternalRPC: tlsutil.ProtocolConfig{ @@ -244,7 +244,6 @@ func TestNewDialer_IntegrationWithTLSEnabledHandler_viaMeshGateway(t *testing.T) UseTLSForDC: tlsConf.UseTLS, DialingFromServer: true, DialingFromDatacenter: "dc2", - BalancerBuilder: balancerBuilder(t, res.Authority()), }) pool.SetGatewayResolver(func(addr string) string { return gwAddr @@ -267,13 +266,13 @@ func TestNewDialer_IntegrationWithTLSEnabledHandler_viaMeshGateway(t *testing.T) func TestClientConnPool_IntegrationWithGRPCResolver_Failover(t *testing.T) { count := 4 res := resolver.NewServerResolverBuilder(newConfig(t)) - registerWithGRPC(t, res) + bb := balancer.NewBuilder(res.Authority(), testutil.Logger(t)) + registerWithGRPC(t, res, bb) pool := NewClientConnPool(ClientConnPoolConfig{ Servers: res, UseTLSForDC: useTLSForDcAlwaysTrue, DialingFromServer: true, DialingFromDatacenter: "dc1", - BalancerBuilder: balancerBuilder(t, res.Authority()), }) for i := 0; i < count; i++ { @@ -303,13 +302,13 @@ func TestClientConnPool_IntegrationWithGRPCResolver_Failover(t *testing.T) { func TestClientConnPool_ForwardToLeader_Failover(t *testing.T) { count := 3 res := resolver.NewServerResolverBuilder(newConfig(t)) - registerWithGRPC(t, res) + bb := balancer.NewBuilder(res.Authority(), testutil.Logger(t)) + registerWithGRPC(t, res, bb) pool := NewClientConnPool(ClientConnPoolConfig{ Servers: res, UseTLSForDC: useTLSForDcAlwaysTrue, DialingFromServer: true, DialingFromDatacenter: "dc1", - BalancerBuilder: balancerBuilder(t, res.Authority()), }) var servers []testServer @@ -356,13 +355,13 @@ func TestClientConnPool_IntegrationWithGRPCResolver_MultiDC(t *testing.T) { dcs := []string{"dc1", "dc2", "dc3"} res := resolver.NewServerResolverBuilder(newConfig(t)) - registerWithGRPC(t, res) + bb := balancer.NewBuilder(res.Authority(), testutil.Logger(t)) + registerWithGRPC(t, res, bb) pool := NewClientConnPool(ClientConnPoolConfig{ Servers: res, UseTLSForDC: useTLSForDcAlwaysTrue, DialingFromServer: true, DialingFromDatacenter: "dc1", - BalancerBuilder: balancerBuilder(t, res.Authority()), }) for _, dc := range dcs { @@ -386,18 +385,11 @@ func TestClientConnPool_IntegrationWithGRPCResolver_MultiDC(t *testing.T) { } } -func registerWithGRPC(t *testing.T, b *resolver.ServerResolverBuilder) { - resolver.Register(b) +func registerWithGRPC(t *testing.T, rb *resolver.ServerResolverBuilder, bb *balancer.Builder) { + resolver.Register(rb) + bb.Register() t.Cleanup(func() { - resolver.Deregister(b.Authority()) + resolver.Deregister(rb.Authority()) + bb.Deregister() }) } - -func balancerBuilder(t *testing.T, name string) gbalancer.Builder { - t.Helper() - - bb := balancer.NewBuilder(name, testutil.Logger(t)) - bb.Register() - - return bb -} diff --git a/agent/grpc-internal/handler_test.go b/agent/grpc-internal/handler_test.go index 96f6f036e0e..080aaa93878 100644 --- a/agent/grpc-internal/handler_test.go +++ b/agent/grpc-internal/handler_test.go @@ -6,6 +6,7 @@ import ( "testing" "time" + "github.com/hashicorp/consul/sdk/testutil" "github.com/hashicorp/consul/types" "github.com/hashicorp/go-hclog" @@ -13,6 +14,7 @@ import ( "google.golang.org/grpc/codes" "google.golang.org/grpc/status" + "github.com/hashicorp/consul/agent/grpc-internal/balancer" "github.com/hashicorp/consul/agent/grpc-internal/resolver" "github.com/hashicorp/consul/agent/grpc-middleware/testutil/testservice" ) @@ -27,7 +29,8 @@ func TestHandler_PanicRecoveryInterceptor(t *testing.T) { }) res := resolver.NewServerResolverBuilder(newConfig(t)) - registerWithGRPC(t, res) + bb := balancer.NewBuilder(res.Authority(), testutil.Logger(t)) + registerWithGRPC(t, res, bb) srv := newPanicTestServer(t, logger, "server-1", "dc1", nil) res.AddServer(types.AreaWAN, srv.Metadata()) @@ -38,7 +41,6 @@ func TestHandler_PanicRecoveryInterceptor(t *testing.T) { UseTLSForDC: useTLSForDcAlwaysTrue, DialingFromServer: true, DialingFromDatacenter: "dc1", - BalancerBuilder: balancerBuilder(t, res.Authority()), }) conn, err := pool.ClientConn("dc1") diff --git a/agent/rpc/peering/service_test.go b/agent/rpc/peering/service_test.go index ced1e286c76..1699cb5ac21 100644 --- a/agent/rpc/peering/service_test.go +++ b/agent/rpc/peering/service_test.go @@ -1693,8 +1693,9 @@ func newDefaultDeps(t *testing.T, c *consul.Config) consul.Deps { Datacenter: c.Datacenter, } - balancerBuilder := balancer.NewBuilder(t.Name(), testutil.Logger(t)) + balancerBuilder := balancer.NewBuilder(builder.Authority(), testutil.Logger(t)) balancerBuilder.Register() + t.Cleanup(balancerBuilder.Deregister) return consul.Deps{ EventPublisher: stream.NewEventPublisher(10 * time.Second), @@ -1709,7 +1710,6 @@ func newDefaultDeps(t *testing.T, c *consul.Config) consul.Deps { UseTLSForDC: tls.UseTLS, DialingFromServer: true, DialingFromDatacenter: c.Datacenter, - BalancerBuilder: balancerBuilder, }), LeaderForwarder: builder, EnterpriseDeps: newDefaultDepsEnterprise(t, logger, c), diff --git a/agent/setup.go b/agent/setup.go index 8dc5e5e18c0..4600f40160a 100644 --- a/agent/setup.go +++ b/agent/setup.go @@ -53,6 +53,8 @@ type BaseDeps struct { Cache *cache.Cache ViewStore *submatview.Store WatchedFiles []string + + deregisterBalancer, deregisterResolver func() } type ConfigLoader func(source config.Source) (config.LoadResult, error) @@ -122,14 +124,16 @@ func NewBaseDeps(configLoader ConfigLoader, logOut io.Writer, providedLogger hcl Authority: cfg.Datacenter + "." + string(cfg.NodeID), }) resolver.Register(resolverBuilder) + d.deregisterResolver = func() { + resolver.Deregister(resolverBuilder.Authority()) + } balancerBuilder := balancer.NewBuilder( - // Balancer name doesn't really matter, we set it to the resolver authority - // to keep it unique for tests. resolverBuilder.Authority(), d.Logger.Named("grpc.balancer"), ) balancerBuilder.Register() + d.deregisterBalancer = balancerBuilder.Deregister d.GRPCConnPool = grpcInt.NewClientConnPool(grpcInt.ClientConnPoolConfig{ Servers: resolverBuilder, @@ -139,7 +143,6 @@ func NewBaseDeps(configLoader ConfigLoader, logOut io.Writer, providedLogger hcl UseTLSForDC: d.TLSConfigurator.UseTLS, DialingFromServer: cfg.ServerMode, DialingFromDatacenter: cfg.Datacenter, - BalancerBuilder: balancerBuilder, }) d.LeaderForwarder = resolverBuilder @@ -189,6 +192,20 @@ func NewBaseDeps(configLoader ConfigLoader, logOut io.Writer, providedLogger hcl return d, nil } +// Close cleans up any state and goroutines associated to bd's members not +// handled by something else (e.g. the agent stop channel). +func (bd BaseDeps) Close() { + bd.AutoConfig.Stop() + bd.MetricsConfig.Cancel() + + if fn := bd.deregisterBalancer; fn != nil { + fn() + } + if fn := bd.deregisterResolver; fn != nil { + fn() + } +} + // grpcLogInitOnce because the test suite will call NewBaseDeps in many tests and // causes data races when it is re-initialized. var grpcLogInitOnce sync.Once From 26820219cd7b448b10dc5d7f567b1a8857102f60 Mon Sep 17 00:00:00 2001 From: "R.B. Boyer" <4903+rboyer@users.noreply.github.com> Date: Tue, 28 Feb 2023 10:58:29 -0600 Subject: [PATCH 079/262] cli: ensure acl token read -self works (#16445) Fixes a regression in #16044 The consul acl token read -self cli command should not require an -accessor-id because typically the persona invoking this would not already know the accessor id of their own token. --- .changelog/16445.txt | 3 ++ command/acl/token/read/token_read.go | 22 +++++------ command/acl/token/read/token_read_test.go | 47 +++++++++++++++++++++++ 3 files changed, 61 insertions(+), 11 deletions(-) create mode 100644 .changelog/16445.txt diff --git a/.changelog/16445.txt b/.changelog/16445.txt new file mode 100644 index 00000000000..19745c6df99 --- /dev/null +++ b/.changelog/16445.txt @@ -0,0 +1,3 @@ +```release-note:bug +cli: ensure acl token read -self works +``` diff --git a/command/acl/token/read/token_read.go b/command/acl/token/read/token_read.go index 79ee10f4f70..0554ccaccb5 100644 --- a/command/acl/token/read/token_read.go +++ b/command/acl/token/read/token_read.go @@ -67,17 +67,6 @@ func (c *cmd) Run(args []string) int { return 1 } - tokenAccessor := c.tokenAccessorID - if tokenAccessor == "" { - if c.tokenID == "" { - c.UI.Error("Must specify the -accessor-id parameter") - return 1 - } else { - tokenAccessor = c.tokenID - c.UI.Warn("Use the -accessor-id parameter to specify token by Accessor ID") - } - } - client, err := c.http.APIClient() if err != nil { c.UI.Error(fmt.Sprintf("Error connecting to Consul agent: %s", err)) @@ -87,6 +76,17 @@ func (c *cmd) Run(args []string) int { var t *api.ACLToken var expanded *api.ACLTokenExpanded if !c.self { + tokenAccessor := c.tokenAccessorID + if tokenAccessor == "" { + if c.tokenID == "" { + c.UI.Error("Must specify the -accessor-id parameter") + return 1 + } else { + tokenAccessor = c.tokenID + c.UI.Warn("Use the -accessor-id parameter to specify token by Accessor ID") + } + } + tok, err := acl.GetTokenAccessorIDFromPartial(client, tokenAccessor) if err != nil { c.UI.Error(fmt.Sprintf("Error determining token ID: %v", err)) diff --git a/command/acl/token/read/token_read_test.go b/command/acl/token/read/token_read_test.go index 505b15b02fa..7988f9772ac 100644 --- a/command/acl/token/read/token_read_test.go +++ b/command/acl/token/read/token_read_test.go @@ -116,3 +116,50 @@ func TestTokenReadCommand_JSON(t *testing.T) { err = json.Unmarshal([]byte(ui.OutputWriter.String()), &jsonOutput) require.NoError(t, err, "token unmarshalling error") } + +func TestTokenReadCommand_Self(t *testing.T) { + if testing.Short() { + t.Skip("too slow for testing.Short") + } + + t.Parallel() + + a := agent.NewTestAgent(t, ` + primary_datacenter = "dc1" + acl { + enabled = true + tokens { + initial_management = "root" + } + }`) + + defer a.Shutdown() + testrpc.WaitForLeader(t, a.RPC, "dc1") + + ui := cli.NewMockUi() + cmd := New(ui) + + // Create a token + client := a.Client() + + token, _, err := client.ACL().TokenCreate( + &api.ACLToken{Description: "test"}, + &api.WriteOptions{Token: "root"}, + ) + assert.NoError(t, err) + + args := []string{ + "-http-addr=" + a.HTTPAddr(), + "-token=" + token.SecretID, + "-self", + } + + code := cmd.Run(args) + assert.Equal(t, code, 0) + assert.Empty(t, ui.ErrorWriter.String()) + + output := ui.OutputWriter.String() + assert.Contains(t, output, fmt.Sprintf("test")) + assert.Contains(t, output, token.AccessorID) + assert.Contains(t, output, token.SecretID) +} From 04f9c6bb745a2f8041dc662f51439ef6dd863c9a Mon Sep 17 00:00:00 2001 From: David Yu Date: Tue, 28 Feb 2023 10:38:29 -0800 Subject: [PATCH 080/262] docs: Add backwards compatibility for Consul 1.14.x and consul-dataplane in the Envoy compat matrix (#16462) * Update envoy.mdx --- website/content/docs/connect/proxies/envoy.mdx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/website/content/docs/connect/proxies/envoy.mdx b/website/content/docs/connect/proxies/envoy.mdx index 3186b645c2f..61ea0bf738c 100644 --- a/website/content/docs/connect/proxies/envoy.mdx +++ b/website/content/docs/connect/proxies/envoy.mdx @@ -45,12 +45,12 @@ Consul supports **four major Envoy releases** at the beginning of each major Con ### Envoy and Consul Dataplane -Consul Dataplane is a feature introduced in Consul v1.14. Because each version of Consul Dataplane supports one specific version of Envoy, you must use the following versions of Consul, Consul Dataplane, and Envoy together. +The Consul dataplane component was introduced in Consul v1.14 as a way to manage Envoy proxies without the use of Consul clients. Each new minor version of Consul is released with a new minor version of Consul dataplane, which packages both Envoy and the `consul-dataplane` binary in a single container image. For backwards compatability reasons, each new minor version of Consul will also support the previous minor version of Consul dataplane to allow for seamless upgrades. In addition, each minor version of Consul will support the next minor version of Consul dataplane to allow for extended dataplane support via newer versions of Envoy. | Consul Version | Consul Dataplane Version (Bundled Envoy Version) | | ------------------- | ------------------------------------------------- | | 1.15.x | 1.1.x (Envoy 1.25.x), 1.0.x (Envoy 1.24.x) | -| 1.14.x | 1.0.x (Envoy 1.24.x) | +| 1.14.x | 1.1.x (Envoy 1.25.x), 1.0.x (Envoy 1.24.x) | ## Getting Started From 29db217a0e9d2d31f7d7e1f59f2d442b8222073d Mon Sep 17 00:00:00 2001 From: Mike Morris Date: Tue, 28 Feb 2023 13:57:29 -0500 Subject: [PATCH 081/262] gateways: add e2e test for API Gateway HTTPRoute ParentRef change (#16408) * test(gateways): add API Gateway HTTPRoute ParentRef change test * test(gateways): add checkRouteError helper * test(gateways): remove EOF check in CI this seems to sometimes be 'connection reset by peer' instead * Update test/integration/consul-container/test/gateways/http_route_test.go --- .../test/gateways/gateway_endpoint_test.go | 33 +++ .../test/gateways/http_route_test.go | 210 ++++++++++++++++++ 2 files changed, 243 insertions(+) diff --git a/test/integration/consul-container/test/gateways/gateway_endpoint_test.go b/test/integration/consul-container/test/gateways/gateway_endpoint_test.go index e750a5b1fdc..05fb3d8961a 100644 --- a/test/integration/consul-container/test/gateways/gateway_endpoint_test.go +++ b/test/integration/consul-container/test/gateways/gateway_endpoint_test.go @@ -248,3 +248,36 @@ func checkRoute(t *testing.T, ip string, port int, path string, headers map[stri }) } + +func checkRouteError(t *testing.T, ip string, port int, path string, headers map[string]string, expected string) { + failer := func() *retry.Timer { + return &retry.Timer{Timeout: time.Second * 60, Wait: time.Second * 60} + } + + client := cleanhttp.DefaultClient() + url := fmt.Sprintf("http://%s:%d", ip, port) + + if path != "" { + url += "/" + path + } + + retry.RunWith(failer(), t, func(r *retry.R) { + t.Logf("making call to %s", url) + req, err := http.NewRequest("GET", url, nil) + assert.NoError(t, err) + + for k, v := range headers { + req.Header.Set(k, v) + + if k == "Host" { + req.Host = v + } + } + _, err = client.Do(req) + assert.Error(t, err) + + if expected != "" { + assert.ErrorContains(t, err, expected) + } + }) +} diff --git a/test/integration/consul-container/test/gateways/http_route_test.go b/test/integration/consul-container/test/gateways/http_route_test.go index 26f83ae92ec..943d93d8607 100644 --- a/test/integration/consul-container/test/gateways/http_route_test.go +++ b/test/integration/consul-container/test/gateways/http_route_test.go @@ -256,3 +256,213 @@ func TestHTTPRouteFlattening(t *testing.T) { }, checkOptions{debug: false, statusCode: service1ResponseCode, testName: "service1, v2 path with v2 hostname"}) } + +func TestHTTPRouteParentRefChange(t *testing.T) { + if testing.Short() { + t.Skip("too slow for testing.Short") + } + t.Parallel() + + // infrastructure set up + address := "localhost" + + listenerOnePort := 6000 + listenerTwoPort := 6001 + + // create cluster and service + cluster := createCluster(t, listenerOnePort, listenerTwoPort) + client := cluster.Agents[0].GetClient() + service := createService(t, cluster, &libservice.ServiceOpts{ + Name: "service", + ID: "service", + HTTPPort: 8080, + GRPCPort: 8079, + }, []string{}) + + // getNamespace() should always return an empty string in Consul OSS + namespace := getNamespace() + gatewayOneName := randomName("gw1", 16) + gatewayTwoName := randomName("gw2", 16) + routeName := randomName("route", 16) + + // write config entries + proxyDefaults := &api.ProxyConfigEntry{ + Kind: api.ProxyDefaults, + Name: api.ProxyConfigGlobal, + Namespace: namespace, + Config: map[string]interface{}{ + "protocol": "http", + }, + } + _, _, err := client.ConfigEntries().Set(proxyDefaults, nil) + assert.NoError(t, err) + + // create gateway config entry + gatewayOne := &api.APIGatewayConfigEntry{ + Kind: "api-gateway", + Name: gatewayOneName, + Listeners: []api.APIGatewayListener{ + { + Name: "listener", + Port: listenerOnePort, + Protocol: "http", + Hostname: "test.foo", + }, + }, + } + _, _, err = client.ConfigEntries().Set(gatewayOne, nil) + assert.NoError(t, err) + require.Eventually(t, func() bool { + entry, _, err := client.ConfigEntries().Get(api.APIGateway, gatewayOneName, &api.QueryOptions{Namespace: namespace}) + assert.NoError(t, err) + if entry == nil { + return false + } + apiEntry := entry.(*api.APIGatewayConfigEntry) + t.Log(entry) + return isAccepted(apiEntry.Status.Conditions) + }, time.Second*10, time.Second*1) + + // create gateway service + gatewayOneService, err := libservice.NewGatewayService(context.Background(), gatewayOneName, "api", cluster.Agents[0], listenerOnePort) + require.NoError(t, err) + libassert.CatalogServiceExists(t, client, gatewayOneName) + + // create gateway config entry + gatewayTwo := &api.APIGatewayConfigEntry{ + Kind: "api-gateway", + Name: gatewayTwoName, + Listeners: []api.APIGatewayListener{ + { + Name: "listener", + Port: listenerTwoPort, + Protocol: "http", + Hostname: "test.example", + }, + }, + } + _, _, err = client.ConfigEntries().Set(gatewayTwo, nil) + assert.NoError(t, err) + require.Eventually(t, func() bool { + entry, _, err := client.ConfigEntries().Get(api.APIGateway, gatewayTwoName, &api.QueryOptions{Namespace: namespace}) + assert.NoError(t, err) + if entry == nil { + return false + } + apiEntry := entry.(*api.APIGatewayConfigEntry) + t.Log(entry) + return isAccepted(apiEntry.Status.Conditions) + }, time.Second*10, time.Second*1) + + // create gateway service + gatewayTwoService, err := libservice.NewGatewayService(context.Background(), gatewayTwoName, "api", cluster.Agents[0], listenerTwoPort) + require.NoError(t, err) + libassert.CatalogServiceExists(t, client, gatewayTwoName) + + // create route to service, targeting first gateway + route := &api.HTTPRouteConfigEntry{ + Kind: api.HTTPRoute, + Name: routeName, + Parents: []api.ResourceReference{ + { + Kind: api.APIGateway, + Name: gatewayOneName, + Namespace: namespace, + }, + }, + Hostnames: []string{ + "test.foo", + "test.example", + }, + Namespace: namespace, + Rules: []api.HTTPRouteRule{ + { + Services: []api.HTTPService{ + { + Name: service.GetServiceName(), + Namespace: namespace, + }, + }, + Matches: []api.HTTPMatch{ + { + Path: api.HTTPPathMatch{ + Match: api.HTTPPathMatchPrefix, + Value: "/", + }, + }, + }, + }, + }, + } + _, _, err = client.ConfigEntries().Set(route, nil) + assert.NoError(t, err) + require.Eventually(t, func() bool { + entry, _, err := client.ConfigEntries().Get(api.HTTPRoute, routeName, &api.QueryOptions{Namespace: namespace}) + assert.NoError(t, err) + if entry == nil { + return false + } + + apiEntry := entry.(*api.HTTPRouteConfigEntry) + t.Log(entry) + + // check if bound only to correct gateway + return len(apiEntry.Parents) == 1 && + apiEntry.Parents[0].Name == gatewayOneName && + isBound(apiEntry.Status.Conditions) + }, time.Second*10, time.Second*1) + + // fetch gateway listener ports + gatewayOnePort, err := gatewayOneService.GetPort(listenerOnePort) + assert.NoError(t, err) + gatewayTwoPort, err := gatewayTwoService.GetPort(listenerTwoPort) + assert.NoError(t, err) + + // hit service by requesting root path + // TODO: testName field in checkOptions struct looked to be unused, is it needed? + checkRoute(t, address, gatewayOnePort, "", map[string]string{ + "Host": "test.foo", + }, checkOptions{debug: false, statusCode: 200}) + + // check that second gateway does not resolve service + checkRouteError(t, address, gatewayTwoPort, "", map[string]string{ + "Host": "test.example", + }, "") + + // swtich route target to second gateway + route.Parents = []api.ResourceReference{ + { + Kind: api.APIGateway, + Name: gatewayTwoName, + Namespace: namespace, + }, + } + _, _, err = client.ConfigEntries().Set(route, nil) + assert.NoError(t, err) + require.Eventually(t, func() bool { + entry, _, err := client.ConfigEntries().Get(api.HTTPRoute, routeName, &api.QueryOptions{Namespace: namespace}) + assert.NoError(t, err) + if entry == nil { + return false + } + + apiEntry := entry.(*api.HTTPRouteConfigEntry) + t.Log(apiEntry) + t.Log(fmt.Sprintf("%#v", apiEntry)) + + // check if bound only to correct gateway + return len(apiEntry.Parents) == 1 && + apiEntry.Parents[0].Name == gatewayTwoName && + isBound(apiEntry.Status.Conditions) + }, time.Second*10, time.Second*1) + + // hit service by requesting root path on other gateway with different hostname + checkRoute(t, address, gatewayTwoPort, "", map[string]string{ + "Host": "test.example", + }, checkOptions{debug: false, statusCode: 200}) + + // check that first gateway has stopped resolving service + checkRouteError(t, address, gatewayOnePort, "", map[string]string{ + "Host": "test.foo", + }, "") +} From 6db445ba29173176491349e477b52fe1470fae01 Mon Sep 17 00:00:00 2001 From: sarahalsmiller <100602640+sarahalsmiller@users.noreply.github.com> Date: Tue, 28 Feb 2023 14:15:40 -0600 Subject: [PATCH 082/262] Gateway Test HTTPPathRewrite (#16418) * add http url path rewrite * add Mike's test back in * update kind to use api.APIGateway --- .../test/gateways/gateway_endpoint_test.go | 97 +++++-- .../test/gateways/http_route_test.go | 250 ++++++++++++++---- 2 files changed, 271 insertions(+), 76 deletions(-) diff --git a/test/integration/consul-container/test/gateways/gateway_endpoint_test.go b/test/integration/consul-container/test/gateways/gateway_endpoint_test.go index 05fb3d8961a..2aa81954f8d 100644 --- a/test/integration/consul-container/test/gateways/gateway_endpoint_test.go +++ b/test/integration/consul-container/test/gateways/gateway_endpoint_test.go @@ -51,7 +51,7 @@ func TestAPIGatewayCreate(t *testing.T) { }, } _, _, err := client.ConfigEntries().Set(apiGateway, nil) - assert.NoError(t, err) + require.NoError(t, err) tcpRoute := &api.TCPRouteConfigEntry{ Kind: "tcp-route", @@ -70,32 +70,18 @@ func TestAPIGatewayCreate(t *testing.T) { } _, _, err = client.ConfigEntries().Set(tcpRoute, nil) - assert.NoError(t, err) + require.NoError(t, err) // Create a client proxy instance with the server as an upstream _, gatewayService := createServices(t, cluster, listenerPortOne) - //check statuses - gatewayReady := false - routeReady := false - //make sure the gateway/route come online - require.Eventually(t, func() bool { - entry, _, err := client.ConfigEntries().Get("api-gateway", "api-gateway", nil) - assert.NoError(t, err) - apiEntry := entry.(*api.APIGatewayConfigEntry) - gatewayReady = isAccepted(apiEntry.Status.Conditions) - - e, _, err := client.ConfigEntries().Get("tcp-route", "api-gateway-route", nil) - assert.NoError(t, err) - routeEntry := e.(*api.TCPRouteConfigEntry) - routeReady = isBound(routeEntry.Status.Conditions) - - return gatewayReady && routeReady - }, time.Second*10, time.Second*1) + //make sure config entries have been properly created + checkGatewayConfigEntry(t, client, "api-gateway", "") + checkTCPRouteConfigEntry(t, client, "api-gateway-route", "") port, err := gatewayService.GetPort(listenerPortOne) - assert.NoError(t, err) + require.NoError(t, err) libassert.HTTPServiceEchoes(t, "localhost", port, "") } @@ -150,12 +136,64 @@ func createCluster(t *testing.T, ports ...int) *libcluster.Cluster { return cluster } +func createGateway(gatewayName string, protocol string, listenerPort int) *api.APIGatewayConfigEntry { + return &api.APIGatewayConfigEntry{ + Kind: api.APIGateway, + Name: gatewayName, + Listeners: []api.APIGatewayListener{ + { + Name: "listener", + Port: listenerPort, + Protocol: protocol, + }, + }, + } +} + +func checkGatewayConfigEntry(t *testing.T, client *api.Client, gatewayName string, namespace string) { + require.Eventually(t, func() bool { + entry, _, err := client.ConfigEntries().Get(api.APIGateway, gatewayName, &api.QueryOptions{Namespace: namespace}) + require.NoError(t, err) + if entry == nil { + return false + } + apiEntry := entry.(*api.APIGatewayConfigEntry) + return isAccepted(apiEntry.Status.Conditions) + }, time.Second*10, time.Second*1) +} + +func checkHTTPRouteConfigEntry(t *testing.T, client *api.Client, routeName string, namespace string) { + require.Eventually(t, func() bool { + entry, _, err := client.ConfigEntries().Get(api.HTTPRoute, routeName, &api.QueryOptions{Namespace: namespace}) + require.NoError(t, err) + if entry == nil { + return false + } + + apiEntry := entry.(*api.HTTPRouteConfigEntry) + return isBound(apiEntry.Status.Conditions) + }, time.Second*10, time.Second*1) +} + +func checkTCPRouteConfigEntry(t *testing.T, client *api.Client, routeName string, namespace string) { + require.Eventually(t, func() bool { + entry, _, err := client.ConfigEntries().Get(api.TCPRoute, routeName, &api.QueryOptions{Namespace: namespace}) + require.NoError(t, err) + if entry == nil { + return false + } + + apiEntry := entry.(*api.TCPRouteConfigEntry) + return isBound(apiEntry.Status.Conditions) + }, time.Second*10, time.Second*1) +} + func createService(t *testing.T, cluster *libcluster.Cluster, serviceOpts *libservice.ServiceOpts, containerArgs []string) libservice.Service { node := cluster.Agents[0] client := node.GetClient() // Create a service and proxy instance service, _, err := libservice.CreateAndRegisterStaticServerAndSidecar(node, serviceOpts, containerArgs...) - assert.NoError(t, err) + require.NoError(t, err) libassert.CatalogServiceExists(t, client, serviceOpts.Name+"-sidecar-proxy") libassert.CatalogServiceExists(t, client, serviceOpts.Name) @@ -183,15 +221,18 @@ func createServices(t *testing.T, cluster *libcluster.Cluster, ports ...int) (li return clientConnectProxy, gatewayService } -// checkRoute, customized version of libassert.RouteEchos to allow for headers/distinguishing between the server instances - type checkOptions struct { debug bool statusCode int testName string } -func checkRoute(t *testing.T, ip string, port int, path string, headers map[string]string, expected checkOptions) { +// checkRoute, customized version of libassert.RouteEchos to allow for headers/distinguishing between the server instances +func checkRoute(t *testing.T, port int, path string, headers map[string]string, expected checkOptions) { + ip := "localhost" + if expected.testName != "" { + t.Log("running " + expected.testName) + } const phrase = "hello" failer := func() *retry.Timer { @@ -199,17 +240,15 @@ func checkRoute(t *testing.T, ip string, port int, path string, headers map[stri } client := cleanhttp.DefaultClient() - url := fmt.Sprintf("http://%s:%d", ip, port) - if path != "" { - url += "/" + path - } + path = strings.TrimPrefix(path, "/") + url := fmt.Sprintf("http://%s:%d/%s", ip, port, path) retry.RunWith(failer(), t, func(r *retry.R) { t.Logf("making call to %s", url) reader := strings.NewReader(phrase) req, err := http.NewRequest("POST", url, reader) - assert.NoError(t, err) + require.NoError(t, err) headers["content-type"] = "text/plain" for k, v := range headers { diff --git a/test/integration/consul-container/test/gateways/http_route_test.go b/test/integration/consul-container/test/gateways/http_route_test.go index 943d93d8607..61343f34950 100644 --- a/test/integration/consul-container/test/gateways/http_route_test.go +++ b/test/integration/consul-container/test/gateways/http_route_test.go @@ -83,7 +83,7 @@ func TestHTTPRouteFlattening(t *testing.T) { } _, _, err := client.ConfigEntries().Set(proxyDefaults, nil) - assert.NoError(t, err) + require.NoError(t, err) apiGateway := &api.APIGatewayConfigEntry{ Kind: "api-gateway", @@ -174,11 +174,11 @@ func TestHTTPRouteFlattening(t *testing.T) { } _, _, err = client.ConfigEntries().Set(apiGateway, nil) - assert.NoError(t, err) + require.NoError(t, err) _, _, err = client.ConfigEntries().Set(routeOne, nil) - assert.NoError(t, err) + require.NoError(t, err) _, _, err = client.ConfigEntries().Set(routeTwo, nil) - assert.NoError(t, err) + require.NoError(t, err) //create gateway service gatewayService, err := libservice.NewGatewayService(context.Background(), gatewayName, "api", cluster.Agents[0], listenerPort) @@ -186,77 +186,233 @@ func TestHTTPRouteFlattening(t *testing.T) { libassert.CatalogServiceExists(t, client, gatewayName) //make sure config entries have been properly created - require.Eventually(t, func() bool { - entry, _, err := client.ConfigEntries().Get(api.APIGateway, gatewayName, &api.QueryOptions{Namespace: namespace}) - assert.NoError(t, err) - if entry == nil { - return false - } - apiEntry := entry.(*api.APIGatewayConfigEntry) - t.Log(entry) - return isAccepted(apiEntry.Status.Conditions) - }, time.Second*10, time.Second*1) - - require.Eventually(t, func() bool { - entry, _, err := client.ConfigEntries().Get(api.HTTPRoute, routeOneName, &api.QueryOptions{Namespace: namespace}) - assert.NoError(t, err) - if entry == nil { - return false - } - - apiEntry := entry.(*api.HTTPRouteConfigEntry) - t.Log(entry) - return isBound(apiEntry.Status.Conditions) - }, time.Second*10, time.Second*1) - - require.Eventually(t, func() bool { - entry, _, err := client.ConfigEntries().Get(api.HTTPRoute, routeTwoName, nil) - assert.NoError(t, err) - if entry == nil { - return false - } - - apiEntry := entry.(*api.HTTPRouteConfigEntry) - return isBound(apiEntry.Status.Conditions) - }, time.Second*10, time.Second*1) + checkGatewayConfigEntry(t, client, gatewayName, namespace) + checkHTTPRouteConfigEntry(t, client, routeOneName, namespace) + checkHTTPRouteConfigEntry(t, client, routeTwoName, namespace) //gateway resolves routes - ip := "localhost" gatewayPort, err := gatewayService.GetPort(listenerPort) - assert.NoError(t, err) + require.NoError(t, err) + + //route 2 with headers //Same v2 path with and without header - checkRoute(t, ip, gatewayPort, "v2", map[string]string{ + checkRoute(t, gatewayPort, "/v2", map[string]string{ "Host": "test.foo", "x-v2": "v2", }, checkOptions{statusCode: service2ResponseCode, testName: "service2 header and path"}) - checkRoute(t, ip, gatewayPort, "v2", map[string]string{ + checkRoute(t, gatewayPort, "/v2", map[string]string{ "Host": "test.foo", }, checkOptions{statusCode: service2ResponseCode, testName: "service2 just path match"}) ////v1 path with the header - checkRoute(t, ip, gatewayPort, "check", map[string]string{ + checkRoute(t, gatewayPort, "/check", map[string]string{ "Host": "test.foo", "x-v2": "v2", }, checkOptions{statusCode: service2ResponseCode, testName: "service2 just header match"}) - checkRoute(t, ip, gatewayPort, "v2/path/value", map[string]string{ + checkRoute(t, gatewayPort, "/v2/path/value", map[string]string{ "Host": "test.foo", "x-v2": "v2", }, checkOptions{statusCode: service2ResponseCode, testName: "service2 v2 with path"}) //hit service 1 by hitting root path - checkRoute(t, ip, gatewayPort, "", map[string]string{ + checkRoute(t, gatewayPort, "", map[string]string{ "Host": "test.foo", }, checkOptions{debug: false, statusCode: service1ResponseCode, testName: "service1 root prefix"}) //hit service 1 by hitting v2 path with v1 hostname - checkRoute(t, ip, gatewayPort, "v2", map[string]string{ + checkRoute(t, gatewayPort, "/v2", map[string]string{ "Host": "test.example", }, checkOptions{debug: false, statusCode: service1ResponseCode, testName: "service1, v2 path with v2 hostname"}) } +func TestHTTPRoutePathRewrite(t *testing.T) { + if testing.Short() { + t.Skip("too slow for testing.Short") + } + + t.Parallel() + + //infrastructure set up + listenerPort := 6001 + //create cluster + cluster := createCluster(t, listenerPort) + client := cluster.Agents[0].GetClient() + fooStatusCode := 400 + barStatusCode := 201 + fooPath := "/v1/foo" + barPath := "/v1/bar" + + fooService := createService(t, cluster, &libservice.ServiceOpts{ + Name: "foo", + ID: "foo", + HTTPPort: 8080, + GRPCPort: 8081, + }, []string{ + //customizes response code so we can distinguish between which service is responding + "-echo-debug-path", fooPath, + "-echo-server-default-params", fmt.Sprintf("status=%d", fooStatusCode), + }) + barService := createService(t, cluster, &libservice.ServiceOpts{ + Name: "bar", + ID: "bar", + //TODO we can potentially get conflicts if these ports are the same + HTTPPort: 8079, + GRPCPort: 8078, + }, []string{ + "-echo-debug-path", barPath, + "-echo-server-default-params", fmt.Sprintf("status=%d", barStatusCode), + }, + ) + + namespace := getNamespace() + gatewayName := randomName("gw", 16) + invalidRouteName := randomName("route", 16) + validRouteName := randomName("route", 16) + fooUnrewritten := "/foo" + barUnrewritten := "/bar" + + //write config entries + proxyDefaults := &api.ProxyConfigEntry{ + Kind: api.ProxyDefaults, + Name: api.ProxyConfigGlobal, + Namespace: namespace, + Config: map[string]interface{}{ + "protocol": "http", + }, + } + + _, _, err := client.ConfigEntries().Set(proxyDefaults, nil) + require.NoError(t, err) + + apiGateway := createGateway(gatewayName, "http", listenerPort) + + fooRoute := &api.HTTPRouteConfigEntry{ + Kind: api.HTTPRoute, + Name: invalidRouteName, + Parents: []api.ResourceReference{ + { + Kind: api.APIGateway, + Name: gatewayName, + Namespace: namespace, + }, + }, + Hostnames: []string{ + "test.foo", + }, + Namespace: namespace, + Rules: []api.HTTPRouteRule{ + { + Filters: api.HTTPFilters{ + URLRewrite: &api.URLRewrite{ + Path: fooPath, + }, + }, + Services: []api.HTTPService{ + { + Name: fooService.GetServiceName(), + Namespace: namespace, + }, + }, + Matches: []api.HTTPMatch{ + { + Path: api.HTTPPathMatch{ + Match: api.HTTPPathMatchPrefix, + Value: fooUnrewritten, + }, + }, + }, + }, + }, + } + + barRoute := &api.HTTPRouteConfigEntry{ + Kind: api.HTTPRoute, + Name: validRouteName, + Parents: []api.ResourceReference{ + { + Kind: api.APIGateway, + Name: gatewayName, + Namespace: namespace, + }, + }, + Hostnames: []string{ + "test.foo", + }, + Namespace: namespace, + Rules: []api.HTTPRouteRule{ + { + Filters: api.HTTPFilters{ + URLRewrite: &api.URLRewrite{ + Path: barPath, + }, + }, + Services: []api.HTTPService{ + { + Name: barService.GetServiceName(), + Namespace: namespace, + }, + }, + Matches: []api.HTTPMatch{ + { + Path: api.HTTPPathMatch{ + Match: api.HTTPPathMatchPrefix, + Value: barUnrewritten, + }, + }, + }, + }, + }, + } + + _, _, err = client.ConfigEntries().Set(apiGateway, nil) + require.NoError(t, err) + _, _, err = client.ConfigEntries().Set(fooRoute, nil) + require.NoError(t, err) + _, _, err = client.ConfigEntries().Set(barRoute, nil) + require.NoError(t, err) + + //create gateway service + gatewayService, err := libservice.NewGatewayService(context.Background(), gatewayName, "api", cluster.Agents[0], listenerPort) + require.NoError(t, err) + libassert.CatalogServiceExists(t, client, gatewayName) + + //make sure config entries have been properly created + checkGatewayConfigEntry(t, client, gatewayName, namespace) + checkHTTPRouteConfigEntry(t, client, invalidRouteName, namespace) + checkHTTPRouteConfigEntry(t, client, validRouteName, namespace) + + gatewayPort, err := gatewayService.GetPort(listenerPort) + require.NoError(t, err) + + //TODO these were the assertions we had in the original test. potentially would want more test cases + + //NOTE: Hitting the debug path code overrides default expected value + debugExpectedStatusCode := 200 + + //hit foo, making sure path is being rewritten by hitting the debug page + checkRoute(t, gatewayPort, fooUnrewritten, map[string]string{ + "Host": "test.foo", + }, checkOptions{debug: true, statusCode: debugExpectedStatusCode, testName: "foo service"}) + //make sure foo is being sent to proper service + checkRoute(t, gatewayPort, fooUnrewritten+"/foo", map[string]string{ + "Host": "test.foo", + }, checkOptions{debug: false, statusCode: fooStatusCode, testName: "foo service"}) + + //hit bar, making sure its been rewritten + checkRoute(t, gatewayPort, barUnrewritten, map[string]string{ + "Host": "test.foo", + }, checkOptions{debug: true, statusCode: debugExpectedStatusCode, testName: "bar service"}) + + //hit bar, making sure its being sent to the proper service + checkRoute(t, gatewayPort, barUnrewritten+"/bar", map[string]string{ + "Host": "test.foo", + }, checkOptions{debug: false, statusCode: barStatusCode, testName: "bar service"}) + +} + func TestHTTPRouteParentRefChange(t *testing.T) { if testing.Short() { t.Skip("too slow for testing.Short") @@ -420,7 +576,7 @@ func TestHTTPRouteParentRefChange(t *testing.T) { // hit service by requesting root path // TODO: testName field in checkOptions struct looked to be unused, is it needed? - checkRoute(t, address, gatewayOnePort, "", map[string]string{ + checkRoute(t, gatewayOnePort, "", map[string]string{ "Host": "test.foo", }, checkOptions{debug: false, statusCode: 200}) @@ -457,7 +613,7 @@ func TestHTTPRouteParentRefChange(t *testing.T) { }, time.Second*10, time.Second*1) // hit service by requesting root path on other gateway with different hostname - checkRoute(t, address, gatewayTwoPort, "", map[string]string{ + checkRoute(t, gatewayTwoPort, "", map[string]string{ "Host": "test.example", }, checkOptions{debug: false, statusCode: 200}) From ec593c2b9b506ebc0535f21838c6794ce7fe5877 Mon Sep 17 00:00:00 2001 From: "R.B. Boyer" <4903+rboyer@users.noreply.github.com> Date: Tue, 28 Feb 2023 14:37:52 -0600 Subject: [PATCH 083/262] cli: remove stray whitespace when loading the consul version from the VERSION file (#16467) Fixes a regression from #15631 in the output of `consul version` from: Consul v1.16.0-dev +ent Revision 56b86acbe5+CHANGES to Consul v1.16.0-dev+ent Revision 56b86acbe5+CHANGES --- version/version.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version/version.go b/version/version.go index 175f3ef55c0..36b2eacfa5a 100644 --- a/version/version.go +++ b/version/version.go @@ -20,7 +20,7 @@ var ( //go:embed VERSION fullVersion string - Version, VersionPrerelease, _ = strings.Cut(fullVersion, "-") + Version, VersionPrerelease, _ = strings.Cut(strings.TrimSpace(fullVersion), "-") // https://semver.org/#spec-item-10 VersionMetadata = "" From 23e247d765c7af37b81217ff58ec4ea17283ce9a Mon Sep 17 00:00:00 2001 From: trujillo-adam <47586768+trujillo-adam@users.noreply.github.com> Date: Tue, 28 Feb 2023 14:09:56 -0800 Subject: [PATCH 084/262] Docs/services refactor docs day 122022 (#16103) * converted main services page to services overview page * set up services usage dirs * added Define Services usage page * converted health checks everything page to Define Health Checks usage page * added Register Services and Nodes usage page * converted Query with DNS to Discover Services and Nodes Overview page * added Configure DNS Behavior usage page * added Enable Static DNS Lookups usage page * added the Enable Dynamic Queries DNS Queries usage page * added the Configuration dir and overview page - may not need the overview, tho * fixed the nav from previous commit * added the Services Configuration Reference page * added Health Checks Configuration Reference page * updated service defaults configuraiton entry to new configuration ref format * fixed some bad links found by checker * more bad links found by checker * another bad link found by checker * converted main services page to services overview page * set up services usage dirs * added Define Services usage page * converted health checks everything page to Define Health Checks usage page * added Register Services and Nodes usage page * converted Query with DNS to Discover Services and Nodes Overview page * added Configure DNS Behavior usage page * added Enable Static DNS Lookups usage page * added the Enable Dynamic Queries DNS Queries usage page * added the Configuration dir and overview page - may not need the overview, tho * fixed the nav from previous commit * added the Services Configuration Reference page * added Health Checks Configuration Reference page * updated service defaults configuraiton entry to new configuration ref format * fixed some bad links found by checker * more bad links found by checker * another bad link found by checker * fixed cross-links between new topics * updated links to the new services pages * fixed bad links in scale file * tweaks to titles and phrasing * fixed typo in checks.mdx * started updating the conf ref to latest template * update SD conf ref to match latest CT standard * Apply suggestions from code review Co-authored-by: Eddie Rowe <74205376+eddie-rowe@users.noreply.github.com> * remove previous version of the checks page * fixed cross-links * Apply suggestions from code review Co-authored-by: Eddie Rowe <74205376+eddie-rowe@users.noreply.github.com> --------- Co-authored-by: Eddie Rowe <74205376+eddie-rowe@users.noreply.github.com> --- website/content/api-docs/agent/check.mdx | 3 +- website/content/api-docs/agent/service.mdx | 40 +- website/content/api-docs/api-structure.mdx | 2 +- website/content/api-docs/catalog.mdx | 22 +- .../content/api-docs/features/consistency.mdx | 2 +- website/content/api-docs/query.mdx | 7 +- .../content/commands/services/deregister.mdx | 16 +- .../content/commands/services/register.mdx | 20 +- .../content/docs/agent/config/cli-flags.mdx | 2 +- .../docs/agent/config/config-files.mdx | 46 +- website/content/docs/agent/index.mdx | 2 +- .../docs/architecture/anti-entropy.mdx | 11 +- website/content/docs/architecture/index.mdx | 2 +- website/content/docs/architecture/scale.mdx | 6 +- .../connect/cluster-peering/tech-specs.mdx | 2 +- .../config-entries/ingress-gateway.mdx | 7 +- .../config-entries/service-defaults.mdx | 1194 ++++++++++++++++- .../content/docs/connect/configuration.mdx | 21 +- .../docs/connect/gateways/ingress-gateway.mdx | 4 +- website/content/docs/connect/native/index.mdx | 10 +- .../docs/connect/observability/index.mdx | 20 +- .../content/docs/connect/proxies/index.mdx | 28 +- .../connect/proxies/managed-deprecated.mdx | 278 ---- .../docs/connect/registration/index.mdx | 7 +- .../registration/service-registration.mdx | 18 +- .../connect/registration/sidecar-service.mdx | 28 +- .../consul-vs-other/dns-tools-compare.mdx | 2 +- website/content/docs/discovery/checks.mdx | 885 ------------ website/content/docs/discovery/dns.mdx | 594 -------- website/content/docs/discovery/services.mdx | 701 ---------- .../docs/ecs/configuration-reference.mdx | 2 +- website/content/docs/ecs/manual/install.mdx | 10 +- .../docs/enterprise/admin-partitions.mdx | 2 +- website/content/docs/intro/index.mdx | 2 +- .../usage/establish-peering.mdx | 2 +- website/content/docs/k8s/dns.mdx | 2 +- website/content/docs/k8s/service-sync.mdx | 2 +- website/content/docs/nia/configuration.mdx | 2 +- .../docs/release-notes/consul/v1_13_x.mdx | 2 +- .../content/docs/security/acl/acl-rules.mdx | 13 +- .../content/docs/security/acl/acl-tokens.mdx | 2 +- .../checks-configuration-reference.mdx | 55 + .../services-configuration-overview.mdx | 28 + .../services-configuration-reference.mdx | 654 +++++++++ .../services/discovery/dns-configuration.mdx | 76 ++ .../discovery/dns-dynamic-lookups.mdx | 100 ++ .../docs/services/discovery/dns-overview.mdx | 41 + .../services/discovery/dns-static-lookups.mdx | 357 +++++ website/content/docs/services/services.mdx | 39 + .../content/docs/services/usage/checks.mdx | 592 ++++++++ .../docs/services/usage/define-services.mdx | 366 +++++ .../usage/register-services-checks.mdx | 67 + .../troubleshoot/troubleshoot-services.mdx | 4 +- .../docs/upgrading/upgrade-specific.mdx | 6 +- website/data/docs-nav-data.json | 70 +- 55 files changed, 3767 insertions(+), 2709 deletions(-) delete mode 100644 website/content/docs/connect/proxies/managed-deprecated.mdx delete mode 100644 website/content/docs/discovery/checks.mdx delete mode 100644 website/content/docs/discovery/dns.mdx delete mode 100644 website/content/docs/discovery/services.mdx create mode 100644 website/content/docs/services/configuration/checks-configuration-reference.mdx create mode 100644 website/content/docs/services/configuration/services-configuration-overview.mdx create mode 100644 website/content/docs/services/configuration/services-configuration-reference.mdx create mode 100644 website/content/docs/services/discovery/dns-configuration.mdx create mode 100644 website/content/docs/services/discovery/dns-dynamic-lookups.mdx create mode 100644 website/content/docs/services/discovery/dns-overview.mdx create mode 100644 website/content/docs/services/discovery/dns-static-lookups.mdx create mode 100644 website/content/docs/services/services.mdx create mode 100644 website/content/docs/services/usage/checks.mdx create mode 100644 website/content/docs/services/usage/define-services.mdx create mode 100644 website/content/docs/services/usage/register-services-checks.mdx diff --git a/website/content/api-docs/agent/check.mdx b/website/content/api-docs/agent/check.mdx index d29f0de8fc6..03364b6aeb3 100644 --- a/website/content/api-docs/agent/check.mdx +++ b/website/content/api-docs/agent/check.mdx @@ -6,8 +6,7 @@ description: The /agent/check endpoints interact with checks on the local agent # Check - Agent HTTP API -Consul's health check capabilities are described in the -[health checks overview](/consul/docs/discovery/checks). +Refer to [Define Health Checks](/consul/docs/services/usage/checks) for information about Consul health check capabilities. The `/agent/check` endpoints interact with health checks managed by the local agent in Consul. These should not be confused with checks in the catalog. diff --git a/website/content/api-docs/agent/service.mdx b/website/content/api-docs/agent/service.mdx index a232c4491a3..38eedad3536 100644 --- a/website/content/api-docs/agent/service.mdx +++ b/website/content/api-docs/agent/service.mdx @@ -170,6 +170,8 @@ The table below shows this endpoint's support for ### Sample Request +The following example request calls the `web-sidecar-proxy` service: + ```shell-session $ curl \ http://127.0.0.1:8500/v1/agent/service/web-sidecar-proxy @@ -177,6 +179,11 @@ $ curl \ ### Sample Response +The response contains the fields specified in the [service +definition](/consul/docs/services/configuration/services-configuration-reference), but it includes an extra `ContentHash` field that contains the [hash-based blocking +query](/consul/api-docs/features/blocking#hash-based-blocking-queries) hash for the result. The +same hash is also present in `X-Consul-ContentHash`. + ```json { "Kind": "connect-proxy", @@ -227,12 +234,6 @@ $ curl \ } ``` -The response has the same structure as the [service -definition](/consul/docs/discovery/services) with one extra field `ContentHash` which -contains the [hash-based blocking -query](/consul/api-docs/features/blocking#hash-based-blocking-queries) hash for the result. The -same hash is also present in `X-Consul-ContentHash`. - ## Get local service health Retrieve an aggregated state of service(s) on the local agent by name. @@ -599,21 +600,18 @@ The corresponding CLI command is [`consul services register`](/consul/commands/s ### JSON Request Body Schema -Note that this endpoint, unlike most also [supports `snake_case`](/consul/docs/discovery/services#service-definition-parameter-case) -service definition keys for compatibility with the config file format. +The `/agent/service/register` endpoint supports camel case and _snake case_ for service definition keys. Snake case is a convention in which keys with two or more words have underscores between them. Snake case ensures compatibility with the agent configuration file format. - `Name` `(string: )` - Specifies the logical name of the service. Many service instances may share the same logical service name. We recommend using - [valid DNS labels](https://en.wikipedia.org/wiki/Hostname#Restrictions_on_valid_hostnames) - for [compatibility with external DNS](/consul/docs/discovery/services#service-and-tag-names-with-dns). + valid DNS labels for service definition names. Refer to the Internet Engineering Task Force's [RFC 1123](https://datatracker.ietf.org/doc/html/rfc1123#page-72) for additional information. Service names that conform to standard usage ensures compatibility with external DNSs. Refer to [Services Configuration Reference](/consul/docs/services/configuration/services-configuration-reference#name) for additional information. - `ID` `(string: "")` - Specifies a unique ID for this service. This must be unique per _agent_. This defaults to the `Name` parameter if not provided. - `Tags` `(array: nil)` - Specifies a list of tags to assign to the - service. These tags can be used for later filtering and are exposed via the APIs. - We recommend using [valid DNS labels](https://en.wikipedia.org/wiki/Hostname#Restrictions_on_valid_hostnames) - for [compatibility with external DNS](/consul/docs/discovery/services#service-and-tag-names-with-dns) + service. Tags enable you to filter when querying for the services and are exposed in Consul APIs. We recommend using + valid DNS labels for tags. Refer to the Internet Engineering Task Force's [RFC 1123](https://datatracker.ietf.org/doc/html/rfc1123#page-72) for additional information. Tags that conform to standard usage ensures compatibility with external DNSs. Refer to [Services Configuration Reference](/consul/docs/services/configuration/services-configuration-reference#tags) for additional information. - `Address` `(string: "")` - Specifies the address of the service. If not provided, the agent's address is used as the address for the service during @@ -676,19 +674,15 @@ service definition keys for compatibility with the config file format. service's port _and_ the tags would revert to the original value and all modifications would be lost. -- `Weights` `(Weights: nil)` - Specifies weights for the service. Please see the - [service documentation](/consul/docs/discovery/services) for more information about - weights. If this field is not provided weights will default to +- `Weights` `(Weights: nil)` - Specifies weights for the service. Refer to + [Services Configuration Reference](/consul/docs/services/configuraiton/services-configuration-reference#weights) for additional information. Default is `{"Passing": 1, "Warning": 1}`. - It is important to note that this applies only to the locally registered - service. If you have multiple nodes all registering the same service their - `EnableTagOverride` configuration and all other service configuration items - are independent of one another. Updating the tags for the service registered - on one node is independent of the same service (by name) registered on - another node. If `EnableTagOverride` is not specified the default value is + Weights only apply to the locally registered service. + If multiple nodes register the same service, each node implements `EnableTagOverride` and other service configuration items independently. Updating the tags for the service registered + on one node does not necessarily update the same tags on services with the same name registered on another node. If `EnableTagOverride` is not specified the default value is `false`. See [anti-entropy syncs](/consul/docs/architecture/anti-entropy) for - more info. + additional information. #### Connect Structure diff --git a/website/content/api-docs/api-structure.mdx b/website/content/api-docs/api-structure.mdx index 655399e7932..7a190894129 100644 --- a/website/content/api-docs/api-structure.mdx +++ b/website/content/api-docs/api-structure.mdx @@ -89,7 +89,7 @@ However, we generally recommend using resource names that don't require URL-enco Depending on the validation that Consul applies to a resource name, Consul may still reject a request if it considers the resource name invalid for that endpoint. And even if Consul considers the resource name valid, it may degrade other functionality, -such as failed [DNS lookups](/consul/docs/discovery/dns) +such as failed [DNS lookups](/consul/docs/services/discovery/dns-overview) for nodes or services with names containing invalid DNS characters. This HTTP API capability also allows the diff --git a/website/content/api-docs/catalog.mdx b/website/content/api-docs/catalog.mdx index b9a8c7bbd74..2b470dd5788 100644 --- a/website/content/api-docs/catalog.mdx +++ b/website/content/api-docs/catalog.mdx @@ -55,15 +55,16 @@ The table below shows this endpoint's support for - `NodeMeta` `(map: nil)` - Specifies arbitrary KV metadata pairs for filtering purposes. -- `Service` `(Service: nil)` - Specifies to register a service. If `ID` is not - provided, it will be defaulted to the value of the `Service.Service` property. - Only one service with a given `ID` may be present per node. We recommend using - [valid DNS labels](https://en.wikipedia.org/wiki/Hostname#Restrictions_on_valid_hostnames) - for service definition names for [compatibility with external DNS](/consul/docs/discovery/services#service-and-tag-names-with-dns). - The service `Tags`, `Address`, `Meta`, and `Port` fields are all optional. For more - information about these fields and the implications of setting them, - see the [Service - Agent API](/consul/api-docs/agent/service) page - as registering services differs between using this or the Services Agent endpoint. +- `Service` `(Service: nil)` - Contains an object the specifies the service to register. The the `Service.Service` field is required. If `Service.ID` is not provided, the default is the `Service.Service`. + You can only specify one service with a given `ID` per node. We recommend using + valid DNS labels for service definition names. Refer to the Internet Engineering Task Force's [RFC 1123](https://datatracker.ietf.org/doc/html/rfc1123#page-72) for additional information. Service names that conform to standard usage ensures compatibility with external DNSs. Refer to [Services Configuration Reference](/consul/docs/services/configuration/services-configuration-reference#name) for additional information. + The following fields are optional: + - `Tags` + - `Address` + - `Meta` + - `Port` + + For additional information configuring services, refer to [Service - Agent API](/consul/api-docs/agent/service). The `/catalog` endpoint had different behaviors than the `/services` endpoint. - `Check` `(Check: nil)` - Specifies to register a check. The register API manipulates the health check entry in the Catalog, but it does not setup the @@ -78,8 +79,7 @@ The table below shows this endpoint's support for treated as a service level health check, instead of a node level health check. The `Status` must be one of `passing`, `warning`, or `critical`. - The `Definition` field can be provided with details for a TCP or HTTP health - check. For more information, see the [Health Checks](/consul/docs/discovery/checks) page. + You can provide defaults for TCP and HTTP health checks to the `Definition` field. Refer to [Health Checks](/consul/docs/services/usage/checks) for additional information. Multiple checks can be provided by replacing `Check` with `Checks` and sending an array of `Check` objects. diff --git a/website/content/api-docs/features/consistency.mdx b/website/content/api-docs/features/consistency.mdx index bcd7d621d65..746b062ab4c 100644 --- a/website/content/api-docs/features/consistency.mdx +++ b/website/content/api-docs/features/consistency.mdx @@ -131,7 +131,7 @@ The following diagrams show the cross-datacenter request paths when Consul serve ### Consul DNS Queries -When DNS queries are issued to [Consul's DNS interface](/consul/docs/discovery/dns), +When DNS queries are issued to [Consul's DNS interface](/consul/docs/services/discovery/dns-overview), Consul uses the `stale` consistency mode by default when interfacing with its underlying Consul service discovery HTTP APIs ([Catalog](/consul/api-docs/catalog), [Health](/consul/api-docs/health), and [Prepared Query](/consul/api-docs/query)). diff --git a/website/content/api-docs/query.mdx b/website/content/api-docs/query.mdx index b3e2dcc2525..09aa867c479 100644 --- a/website/content/api-docs/query.mdx +++ b/website/content/api-docs/query.mdx @@ -9,10 +9,9 @@ description: The /query endpoints manage and execute prepared queries in Consul. The `/query` endpoints create, update, destroy, and execute prepared queries. Prepared queries allow you to register a complex service query and then execute -it later via its ID or name to get a set of healthy nodes that provide a given -service. This is particularly useful in combination with Consul's -[DNS Interface](/consul/docs/discovery/dns#prepared-query-lookups) as it allows for much richer queries than -would be possible given the limited entry points exposed by DNS. +it later by specifying the query ID or name. Consul returns a set of healthy nodes that provide a given +service. Refer to +[Enable Dynamic DNS Queries](/consul/docs/services/discovery/dns-dynamic-lookups) for additional information. Check the [Geo Failover tutorial](/consul/tutorials/developer-discovery/automate-geo-failover) for details and examples for using prepared queries to implement geo failover for services. diff --git a/website/content/commands/services/deregister.mdx b/website/content/commands/services/deregister.mdx index 5cc774422c0..79ea7cba27b 100644 --- a/website/content/commands/services/deregister.mdx +++ b/website/content/commands/services/deregister.mdx @@ -13,23 +13,19 @@ Corresponding HTTP API Endpoint: [\[PUT\] /v1/agent/service/deregister/:service_ The `services deregister` command deregisters a service with the local agent. Note that this command can only deregister services that were registered -with the agent specified (defaults to the local agent) and is meant to -be paired with `services register`. +with the agent specified and is intended to be paired with `services register`. +By default, the command deregisters services on the local agent. -This is just one method for service deregistration. If the service was -registered with a configuration file, then deleting that file and -[reloading](/consul/commands/reload) Consul is the correct method to -deregister. See [Service Definition](/consul/docs/discovery/services) for more -information about registering services generally. +We recommend deregistering services registered with a configuration file by deleting the file and [reloading](/consul/commands/reload) Consul. Refer to [Services Overview](/consul/docs/services/services) for additional information about services. -The table below shows this command's [required ACLs](/consul/api-docs/api-structure#authentication). Configuration of -[blocking queries](/consul/api-docs/features/blocking) and [agent caching](/consul/api-docs/features/caching) -are not supported from commands, but may be from the corresponding HTTP endpoint. +The following table shows the [ACLs](/consul/api-docs/api-structure#authentication) required to run the `consul services deregister` command: | ACL Required | | --------------- | | `service:write` | +You cannot use the Consul command line to configure [blocking queries](/consul/api-docs/features/blocking) and [agent caching](/consul/api-docs/features/caching), you can configure them from the corresponding HTTP endpoint. + ## Usage Usage: `consul services deregister [options] [FILE...]` diff --git a/website/content/commands/services/register.mdx b/website/content/commands/services/register.mdx index 8e3a9d1333e..cefa2359230 100644 --- a/website/content/commands/services/register.mdx +++ b/website/content/commands/services/register.mdx @@ -14,24 +14,16 @@ Corresponding HTTP API Endpoint: [\[PUT\] /v1/agent/service/register](/consul/ap The `services register` command registers a service with the local agent. This command returns after registration and must be paired with explicit service deregistration. This command simplifies service registration from -scripts, in dev mode, etc. +scripts. Refer to [Register Services and Health Checks](/consul/docs/services/usage/register-services-checks) for information about other service registeration methods. -This is just one method of service registration. Services can also be -registered by placing a [service definition](/consul/docs/discovery/services) -in the Consul agent configuration directory and issuing a -[reload](/consul/commands/reload). This approach is easiest for -configuration management systems that other systems that have access to -the configuration directory. Clients may also use the -[HTTP API](/consul/api-docs/agent/service) directly. - -The table below shows this command's [required ACLs](/consul/api-docs/api-structure#authentication). Configuration of -[blocking queries](/consul/api-docs/features/blocking) and [agent caching](/consul/api-docs/features/caching) -are not supported from commands, but may be from the corresponding HTTP endpoint. +The following table shows the [ACLs](/consul/api-docs/api-structure#authentication) required to use the `consul services register` command: | ACL Required | | --------------- | | `service:write` | +You cannot use the Consul command line to configure [blocking queries](/consul/api-docs/features/blocking) and [agent caching](/consul/api-docs/features/caching), you can configure them from the corresponding HTTP endpoint. + ## Usage Usage: `consul services register [options] [FILE...]` @@ -65,9 +57,7 @@ The flags below should only be set if _no arguments_ are given. If no arguments are given, the flags below can be used to register a single service. -Note that the behavior of each of the fields below is exactly the same -as when constructing a standard [service definition](/consul/docs/discovery/services). -Please refer to that documentation for full details. +The following fields specify identical parameters in a standard service definition file. Refer to [Services Configuration Reference](/consul/docs/services/configuration/services-configuration-reference) for details about each configuration option. - `-id` - The ID of the service. This will default to `-name` if not set. diff --git a/website/content/docs/agent/config/cli-flags.mdx b/website/content/docs/agent/config/cli-flags.mdx index ebcdb4c0764..3cdfd6fe91b 100644 --- a/website/content/docs/agent/config/cli-flags.mdx +++ b/website/content/docs/agent/config/cli-flags.mdx @@ -92,7 +92,7 @@ information. only the given `-encrypt` key will be available on startup. This defaults to false. - `-enable-script-checks` ((#\_enable_script_checks)) This controls whether - [health checks that execute scripts](/consul/docs/discovery/checks) are enabled on this + [health checks that execute scripts](/consul/docs/services/usage/checks) are enabled on this agent, and defaults to `false` so operators must opt-in to allowing these. This was added in Consul 0.9.0. diff --git a/website/content/docs/agent/config/config-files.mdx b/website/content/docs/agent/config/config-files.mdx index 2992f562af0..705d0e83780 100644 --- a/website/content/docs/agent/config/config-files.mdx +++ b/website/content/docs/agent/config/config-files.mdx @@ -7,6 +7,10 @@ description: >- # Agents Configuration File Reference ((#configuration_files)) +This topic describes the parameters for configuring Consul agents. For information about how to start Consul agents, refer to [Starting the Consul Agent](/consul/docs/agent#starting-the-consul-agent). + +## Overview + You can create one or more files to configure the Consul agent on startup. We recommend grouping similar configurations into separate files, such as ACL parameters, to make it easier to manage configuration changes. Using external files may be easier than @@ -18,13 +22,6 @@ easily readable and editable by both humans and computers. JSON formatted configuration consists of a single JSON object with multiple configuration keys specified within it. -Configuration files are used for more than just setting up the agent. -They are also used to provide check and service definitions that -announce the availability of system servers to the rest of the cluster. -These definitions are documented separately under [check configuration](/consul/docs/discovery/checks) and -[service configuration](/consul/docs/discovery/services) respectively. Service and check -definitions support being updated during a reload. - ```hcl @@ -66,15 +63,27 @@ telemetry { -# Configuration Key Reference ((#config_key_reference)) +### Time-to-live values + +Consul uses the Go `time` package to parse all time-to-live (TTL) values used in Consul agent configuration files. Specify integer and float values as a string and include one or more of the following units of time: + +- `ns` +- `us` +- `µs` +- `ms` +- `s` +- `m` +- `h` + +Examples: + +- `'300ms'` +- `'1.5h'` +- `'2h45m'` --> **Note:** All the TTL values described below are parsed by Go's `time` package, and have the following -[formatting specification](https://golang.org/pkg/time/#ParseDuration): "A -duration string is a possibly signed sequence of decimal numbers, each with -optional fraction and a unit suffix, such as '300ms', '-1.5h' or '2h45m'. -Valid time units are 'ns', 'us' (or 'µs'), 'ms', 's', 'm', 'h'." +Refer to the [formatting specification](https://golang.org/pkg/time/#ParseDuration) for additional information. -## General +## General parameters - `addresses` - This is a nested object that allows setting bind addresses. In Consul 1.0 and later these can be set to a space-separated list @@ -914,10 +923,9 @@ Valid time units are 'ns', 'us' (or 'µs'), 'ms', 's', 'm', 'h'." - `agent_master` ((#acl_tokens_agent_master)) **Renamed in Consul 1.11 to [`acl.tokens.agent_recovery`](#acl_tokens_agent_recovery).** - - `config_file_service_registration` ((#acl_tokens_config_file_service_registration)) - The ACL - token this agent uses to register services and checks from [service - definitions](/consul/docs/discovery/services) and [check definitions](/consul/docs/discovery/checks) found - in configuration files or in configuration fragments passed to the agent using the `-hcl` + - `config_file_service_registration` ((#acl_tokens_config_file_service_registration)) - Specifies the ACL + token the agent uses to register services and checks from [service](/consul/docs/services/usage/define-services) and [check](/consul/docs/usage/checks) definitions + specified in configuration files or fragments passed to the agent using the `-hcl` flag. If the `token` field is defined in the service or check definition, then that token is used to @@ -1367,7 +1375,7 @@ Valid time units are 'ns', 'us' (or 'µs'), 'ms', 's', 'm', 'h'." of `1ns` instead of 0. - `prefer_namespace` ((#dns_prefer_namespace)) **Deprecated in Consul 1.11. - Use the [canonical DNS format for enterprise service lookups](/consul/docs/discovery/dns#service-lookups-for-consul-enterprise) instead.** - + Use the [canonical DNS format for enterprise service lookups](/consul/docs/services/discovery/dns-static-lookups#service-lookups-for-consul-enterprise) instead.** - When set to `true`, in a DNS query for a service, a single label between the domain and the `service` label is treated as a namespace name instead of a datacenter. When set to `false`, the default, the behavior is the same as non-Enterprise diff --git a/website/content/docs/agent/index.mdx b/website/content/docs/agent/index.mdx index 3ad41480035..80cfb7f0430 100644 --- a/website/content/docs/agent/index.mdx +++ b/website/content/docs/agent/index.mdx @@ -319,7 +319,7 @@ tls { ### Client node registering a service Using Consul as a central service registry is a common use case. -The following example configuration includes common settings to register a service with a Consul agent and enable health checks (see [Checks](/consul/docs/discovery/checks) to learn more about health checks): +The following example configuration includes common settings to register a service with a Consul agent and enable health checks. Refer to [Define Health Checks](/consul/docs/services/usage/checks) to learn more about health checks. diff --git a/website/content/docs/architecture/anti-entropy.mdx b/website/content/docs/architecture/anti-entropy.mdx index 8c2b9bb9675..39d2a08156c 100644 --- a/website/content/docs/architecture/anti-entropy.mdx +++ b/website/content/docs/architecture/anti-entropy.mdx @@ -26,7 +26,7 @@ health checks and updating their local state. Services and checks within the context of an agent have a rich set of configuration options available. This is because the agent is responsible for generating information about its services and their health through the use of -[health checks](/consul/docs/discovery/checks). +[health checks](/consul/docs/services/usage/checks). #### Catalog @@ -117,8 +117,7 @@ the source of truth for tag information. For example, the Redis database and its monitoring service Redis Sentinel have this kind of relationship. Redis instances are responsible for much of their configuration, but Sentinels determine whether the Redis instance is a -primary or a secondary. Using the Consul service configuration item -[enable_tag_override](/consul/docs/discovery/services) you can instruct the -Consul agent on which the Redis database is running to NOT update the -tags during anti-entropy synchronization. For more information see -[Services](/consul/docs/discovery/services#enable-tag-override-and-anti-entropy) page. +primary or a secondary. Enable the +[`enable_tag_override`](/consul/docs/services/configuration/services-configuration-reference#enable_tag_override) parameter in your service definition file to tell the Consul agent where the Redis database is running to bypass +tags during anti-entropy synchronization. Refer to +[Modify anti-entropy synchronozation](/consul/docs/services/usage/define-services#modify-anti-entropy-synchronization) for additional information. diff --git a/website/content/docs/architecture/index.mdx b/website/content/docs/architecture/index.mdx index a36fa644b6b..a4656a7718b 100644 --- a/website/content/docs/architecture/index.mdx +++ b/website/content/docs/architecture/index.mdx @@ -55,7 +55,7 @@ You can also run Consul with an alternate service mesh configuration that deploy ## LAN gossip pool -Client and server agents participate in a LAN gossip pool so that they can distribute and perform node [health checks](/consul/docs/discovery/checks). Agents in the pool propagate the health check information across the cluster. Agent gossip communication occurs on port `8301` using UDP. Agent gossip falls back to TCP if UDP is not available. Refer to [Gossip Protocol](/consul/docs/architecture/gossip) for additional information. +Client and server agents participate in a LAN gossip pool so that they can distribute and perform node [health checks](/consul/docs/services/usage/checks). Agents in the pool propagate the health check information across the cluster. Agent gossip communication occurs on port `8301` using UDP. Agent gossip falls back to TCP if UDP is not available. Refer to [Gossip Protocol](/consul/docs/architecture/gossip) for additional information. The following simplified diagram shows the interactions between servers and clients. diff --git a/website/content/docs/architecture/scale.mdx b/website/content/docs/architecture/scale.mdx index 47176c60afd..ecf5035f98b 100644 --- a/website/content/docs/architecture/scale.mdx +++ b/website/content/docs/architecture/scale.mdx @@ -236,7 +236,7 @@ Several factors influence Consul performance at scale when used primarily for it - Rate of catalog updates, which is affected by the following events: - A service instance’s health check status changes - A service instance’s node loses connectivity to Consul servers - - The contents of the [service definition file](/consul/docs/discovery/services#service-definition) changes + - The contents of the [service definition file](/consul/docs/services/configuration/services-configuration-reference) changes - Service instances are registered or deregistered - Orchestrators such as Kubernetes or Nomad move a service to a new node @@ -280,4 +280,8 @@ At scale, using Consul as a backend for Vault results in increased memory and CP In situations where Consul handles large amounts of data and has high write throughput, we recommend adding monitoring for the [capacity and health of raft replication on servers](/consul/docs/agent/telemetry#raft-replication-capacity-issues). If the server experiences heavy load when the size of its stored data is large enough, a follower may be unable to catch up on replication and become a voter after restarting. This situation occurs when the time it takes for a server to restore from disk takes longer than it takes for the leader to write a new snapshot and truncate its logs. Refer to [Raft snapshots](#raft-snapshots) for more information. +<<<<<<< HEAD Vault v1.4 and higher provides [integrated storage](/vault/docs/concepts/integrated-storage) as its recommended storage option. If you currently use Consul as a storage backend for Vault, we recommend switching to integrated storage. For a comparison between Vault's integrated storage and Consul as a backend for Vault, refer to [storage backends in the Vault documentation](/vault/docs/configuration/storage#integrated-storage-vs-consul-as-vault-storage). For detailed guidance on migrating the Vault backend from Consul to Vault's integrated storage, refer to the [storage migration tutorial](/vault/docs/configuration/storage#integrated-storage-vs-consul-as-vault-storage). Integrated storage improves resiliency by preventing a Consul outage from also affecting Vault functionality. +======= +Vault v1.4 and higher provides [integrated storage](/vault/docs/concepts/integrated-storage) as its recommended storage option. If you currently use Consul as a storage backend for Vault, we recommend switching to integrated storage. For a comparison between Vault's integrated storage and Consul as a backend for Vault, refer to [storage backends in the Vault documentation](/vault/docs/configuration/storage#integrated-storage-vs-consul-as-vault-storage). For detailed guidance on migrating the Vault backend from Consul to Vault's integrated storage, refer to the [storage migration tutorial](/vault/docs/configuration/storage#integrated-storage-vs-consul-as-vault-storage). Integrated storage improves resiliency by preventing a Consul outage from also affecting Vault functionality. +>>>>>>> main diff --git a/website/content/docs/connect/cluster-peering/tech-specs.mdx b/website/content/docs/connect/cluster-peering/tech-specs.mdx index 3e00d6a48b5..e34c0d19093 100644 --- a/website/content/docs/connect/cluster-peering/tech-specs.mdx +++ b/website/content/docs/connect/cluster-peering/tech-specs.mdx @@ -45,7 +45,7 @@ Refer to [mesh gateway modes](/consul/docs/connect/gateways/mesh-gateway#modes) ## Sidecar proxy requirements -The Envoy proxies that function as sidecars in your service mesh require configuration in order to properly route traffic to peers. Sidecar proxies are defined in the [service definition](/consul/docs/discovery/services). +The Envoy proxies that function as sidecars in your service mesh require configuration in order to properly route traffic to peers. Sidecar proxies are defined in the [service definition](/consul/docs/services/usage/defin-services). - Configure the `proxy.upstreams` parameters to route traffic to the correct service, namespace, and peer. Refer to the [`upstreams`](/consul/docs/connect/registration/service-registration#upstream-configuration-reference) documentation for details. - The `proxy.upstreams.destination_name` parameter is always required. diff --git a/website/content/docs/connect/config-entries/ingress-gateway.mdx b/website/content/docs/connect/config-entries/ingress-gateway.mdx index ee94412661c..b1cb5c87ab4 100644 --- a/website/content/docs/connect/config-entries/ingress-gateway.mdx +++ b/website/content/docs/connect/config-entries/ingress-gateway.mdx @@ -172,10 +172,9 @@ gateway: - All services with the same [protocol](/consul/docs/connect/config-entries/ingress-gateway#protocol) as the listener will be routable. -- The ingress gateway will route traffic based on the host/authority header, - expecting a value matching `.ingress.*`, or if using namespaces, - `.ingress..*`. This matches the [Consul DNS - ingress subdomain](/consul/docs/discovery/dns#ingress-service-lookups). +- The ingress gateway routes traffic based on the host or authority header and expects a value matching either `.ingress.*` or + `.ingress..*`. The query matches the [Consul DNS + ingress subdomain](/consul/docs/services/discovery/dns-static-lookups#ingress-service-lookups). A wildcard specifier cannot be set on a listener of protocol `tcp`. diff --git a/website/content/docs/connect/config-entries/service-defaults.mdx b/website/content/docs/connect/config-entries/service-defaults.mdx index 9245d8112c9..3dd9812d3c0 100644 --- a/website/content/docs/connect/config-entries/service-defaults.mdx +++ b/website/content/docs/connect/config-entries/service-defaults.mdx @@ -1,25 +1,1165 @@ --- layout: docs -page_title: Service Defaults - Configuration Entry Reference -description: >- - The service defaults configuration entry kind defines sets of default configurations that apply to all services in the mesh. Use the examples learn how to define a default protocol, default upstream configuration, and default terminating gateway. +page_title: Service Defaults Configuration Reference +description: -> + Use the service-defaults configuration entry to set default configurations for services, such as upstreams, protocols, and namespaces. Learn how to configure service-defaults. --- -# Service Defaults Configuration Entry -The `service-defaults` config entry kind (`ServiceDefaults` on Kubernetes) controls default global values for a -service, such as its protocol. +# Service Defaults Configuration Reference +This topic describes how to configure service defaults configuration entries. The service defaults configuration entry contains common configuration settings for service mesh services, such as upstreams and gateways. Refer to [Define service defaults](/consul/docs/services/usage/define-services#define-service-defaults) for usage information. -## Sample Config Entries +## Configuration model -### Default protocol +The following outline shows how to format the service splitter configuration entry. Click on a property name to view details about the configuration. --> **NOTE**: The default protocol can also be configured globally for all proxies -using the [proxy defaults](/consul/docs/connect/config-entries/proxy-defaults#default-protocol) -config entry. However, if the protocol value is specified in a service defaults -config entry for a given service, that value will take precedence over the -globally configured value from proxy defaults. + + + +- [`Kind`](#kind): string | required +- [`Name`](#name): string | required +- [`Namespace`](#namespace): string +- [`Partition`](#partition): string +- [`Meta`](#meta): map | no default +- [`Protocol`](#protocol): string | default: `tcp` +- [`BalanceInboundConnections`](#balanceinboundconnections): string | no default +- [`Mode`](#mode): string | no default +- [`UpstreamConfig`](#upstreamconfig): map | no default + - [`Overrides`](#upstreamconfig-overrides): map | no default + - [`Name`](#upstreamconfig-overrides-name): string | no default + - [`Namespace`](#upstreamconfig-overrides-namespace): string | no default + - [`Protocol`](#upstreamconfig-overrides-protocol): string | no default + - [`ConnectTimeoutMs`](#upstreamconfig-overrides-connecttimeoutms): int | default: `5000` + - [`MeshGateway`](#upstreamconfig-overrides-meshgateway): map | no default + - [`mode`](#upstreamconfig-overrides-meshgateway): string | no default + - [`BalanceOutboundConnections`](#upstreamconfig-overrides-balanceoutboundconnections): string | no default + - [`Limits`](#upstreamconfig-overrides-limits): map | optional + - [`MaxConnections`](#upstreamconfig-overrides-limits): integer | `0` + - [`MaxPendingRequests`](#upstreamconfig-overrides-limits): integer | `0` + - [`MaxConcurrentRequests`](#upstreamconfig-overrides-limits): integer | `0` + - [`PassiveHealthCheck`](#upstreamconfig-overrides-passivehealthcheck): map | optional + - [`Interval`](#upstreamconfig-overrides-passivehealthcheck): string | `0s` + - [`MaxFailures`](#upstreamconfig-overrides-passivehealthcheck): integer | `0` + - [`EnforcingConsecutive5xx`](#upstreamconfig-overrides-passivehealthcheck): integer | `100` + - [`Defaults`](#upstreamconfig-defaults): map | no default + - [`Protocol`](#upstreamconfig-defaults-protocol): string | no default + - [`ConnectTimeoutMs`](#upstreamconfig-defaults-connecttimeoutms): int | default: `5000` + - [`MeshGateway`](#upstreamconfig-defaults-meshgateway): map | no default + - [`mode`](#upstreamconfig-defaults-meshgateway): string | no default + - [`BalanceOutboundConnections`](#upstreamconfig-defaults-balanceoutboundconnections): string | no default + - [`Limits`](#upstreamconfig-defaults-limits): map | optional + - [`MaxConnections`](#upstreamconfig-defaults-limits): integer | `0` + - [`MaxPendingRequests`](#upstreamconfig-defaults-limits): integer | `0` + - [`MaxConcurrentRequests`](#upstreamconfig-defaults-limits): integer | `0` + - [`PassiveHealthCheck`](#upstreamconfig-defaults-passivehealthcheck): map | optional + - [`Interval`](#upstreamconfig-defaults-passivehealthcheck): string | `0s` + - [`MaxFailures`](#upstreamconfig-defaults-passivehealthcheck): integer | `0` + - [`EnforcingConsecutive5xx`](#upstreamconfig-defaults-passivehealthcheck): integer | +- [`TransparentProxy`](#transparentproxy): map | no default + - [`OutboundListenerPort`](#transparentproxy): integer | `15001` + - [`DialedDirectly`](#transparentproxy ): boolean | `false` +- [`Destination`](#destination): map | no default + - [`Addresses`](#destination): list | no default + - [`Port`](#destination): integer | `0` +- [`MaxInboundConnections`](#maxinboundconnections): integer | `0` +- [`LocalConnectTimeoutMs`](#localconnecttimeoutms): integer | `0` +- [`LocalRequestTiimeoutMs`](#localrequesttimeoutms): integer | `0` +- [`MeshGateway`](#meshgateway): map | no default + - [`Mode`](#meshgateway): string | no default +- [`ExternalSNI`](#externalsni): string | no default +- [`Expose`](#expose): map | no default + - [`Checks`](#expose-checks): boolean | `false` + - [`Paths`](#expose-paths): list | no default + - [`Path`](#expose-paths): string | no default + - [`LocalPathPort`](#expose-paths): integer | `0` + - [`ListenerPort`](#expose-paths): integer | `0` + - [`Protocol`](#expose-paths): string | `http` + + + + +- [`apiVersion`](#apiversion): string | must be set to `consul.hashicorp.com/v1alpha1` +- [`kind`](#kind): string | no default +- [`metadata`](#metadata): map | no default + - [`name`](#name): string | no default + - [`namespace`](#namespace): string | no default | + - [`partition`](#partition): string | no default | +- [`spec`](#spec): map | no default + - [`protocol`](#protocol): string | default: `tcp` + - [`balanceInboundConnections`](#balanceinboundconnections): string | no default + - [`mode`](#mode): string | no default + - [`upstreamConfig`](#upstreamconfig): map | no default + - [`overrides`](#upstreamconfig-overrides): list | no default + - [`name`](#upstreamconfig-overrides-name): string | no default + - [`namespace`](#upstreamconfig-overrides-namespace): string | no default + - [`protocol`](#upstreamconfig-overrides-protocol): string | no default + - [`connectTimeoutMs`](#upstreamconfig-overrides-connecttimeoutms): int | default: `5000` + - [`meshGateway`](#upstreamconfig-overrides-meshgateway): map | no default + - [`mode`](#upstreamconfig-overrides-meshgateway): string | no default + - [`balanceOutboundConnections`](#overrides-balanceoutboundconnections): string | no default + - [`limits`](#upstreamconfig-overrides-limits): map | optional + - [`maxConnections`](#upstreamconfig-overrides-limits): integer | `0` + - [`maxPendingRequests`](#upstreamconfig-overrides-limits): integer | `0` + - [`maxConcurrentRequests`](#upstreamconfig-overrides-limits): integer | `0` + - [`passiveHealthCheck`](#upstreamconfig-overrides-passivehealthcheck): map | optional + - [`interval`](#upstreamconfig-overrides-passivehealthcheck): string | `0s` + - [`maxFailures`](#upstreamconfig-overrides-passivehealthcheck): integer | `0` + - [`mnforcingConsecutive5xx`](#upstreamconfig-overrides-passivehealthcheck): integer | `100` + - [`defaults`](#upstreamconfig-defaults): map | no default + - [`protocol`](#upstreamconfig-defaults-protocol): string | no default + - [`connectTimeoutMs`](#upstreamconfig-defaults-connecttimeoutms): int | default: `5000` + - [`meshGateway`](#upstreamconfig-defaults-meshgateway): map | no default + - [`mode`](#upstreamconfig-defaults-meshgateway): string | no default + - [`balanceOutboundConnections`](#upstreamconfig-defaults-balanceoutboundconnections): string | no default + - [`limits`](#upstreamconfig-defaults-limits): map | optional + - [`maxConnections`](#upstreamconfig-defaults-limits): integer | `0` + - [`maxPendingRequests`](#upstreamconfig-defaults-limits): integer | `0` + - [`maxConcurrentRequests`](#upstreamconfig-defaults-limits): integer | `0` + - [`passiveHealthCheck`](#upstreamconfig-defaults-passivehealthcheck): map | optional + - [`interval`](#upstreamconfig-defaults-passivehealthcheck): string | `0s` + - [`maxFailures`](#upstreamconfig-defaults-passivehealthcheck): integer | `0` + - [`enforcingConsecutive5xx`](#upstreamconfig-defaults-passivehealthcheck): integer | + - [`transparentProxy`](#transparentproxy): map | no default + - [`outboundListenerPort`](#transparentproxy): integer | `15001` + - [`dialedDirectly`](#transparentproxy): boolean | `false` + - [`destination`](#destination): map | no default + - [`addresses`](#destination): list | no default + - [`port`](#destination): integer | `0` + - [`maxInboundConnections`](#maxinboundconnections): integer | `0` + - [`localConnectTimeoutMs`](#localconnecttimeoutms): integer | `0` + - [`localRequestTiimeoutMs`](#localrequesttimeoutms): integer | `0` + - [`meshGateway`](#meshgateway): map | no default + - [`mode`](#meshgateway): string | no default + - [`externalSNI`](#externalsni): string | no defaiult + - [`expose`](#expose): map | no default + - [`checks`](#expose-checks): boolean | `false` + - [`paths`](#expose-paths): list | no default + - [`path`](#expose-paths): string | no default + - [`localPathPort`](#expose-paths): integer | `0` + - [`listenerPort`](#expose-paths): integer | `0` + - [`protocol`](#expose-paths): string | `http` + + + + +## Complete configuration + +When every field is defined, a service splitter configuration entry has the following form: + + + + +```hcl +Kind = "service-defaults" +Name = "service_name" +Namespace = "namespace" +Partition = "partition" +Meta = { + Key = "value" +} +Protocol = "tcp" +BalanceInboundConnections = "exact_balance" +Mode = "transparent" +UpstreamConfig = { + Overrides = { + Name = "name-of-upstreams-to-override" + Namespace = "namespace-containing-upstreams-to-override" + Protocol = "http" + ConnectTimeoutMs = 100 + MeshGateway = { + mode = "remote" + } + BalanceOutboundConnections = "exact_balance" + Limits = { + MaxConnections = 10 + MaxPendingRequests = 50 + MaxConcurrentRequests = 100 + } + PassiveHealthCheck = { + Interval = "5s" + MaxFailures = 5 + EnforcingConsecutive5xx = 99 + } + } + Defaults = { + Protocol = "http2" + ConnectTimeoutMs = 2000 + MeshGateway = { + mode = "local" + } + BalanceOutboundConnections = "exact_balance" + Limits = { + MaxConnections = 100 + MaxPendingRequests = 500 + MaxConcurrentRequests = 1000 + } + PassiveHealthCheck = { + Interval = "1s" + MaxFailures = 1 + EnforcingConsecutive5xx = 89 + } + } +} +TransparentProxy = { + OutboundListenerPort = 15002 + DialedDirectly = true +} +Destination = { + Addresses = [ + "First IP address", + "Second IP address" + ] + Port = 88 +} +MaxInboundConnections = 100 +LocalConnectTimeoutMs = 10 +LocalRequestTimeoutMs = 10 +MeshGateway = { + Mode = "remote" +} +ExternalSNI = "sni-server-host" +Expose = { + Checks = true + Paths = [ + { + Path = "/local/dir" + LocalPathPort = 99 + LocalListenerPort = 98 + Protocol = "http2" + } + ] +} +``` + + + + +```yaml +apiVersion: consul.hashicorp.com/v1alpha1 +kind: ServiceDefaults +metadata: + name: + namespace: + partition: +spec: + protocol: tcp + balanceInboundConnnections: exact_balance + mode: transparent + upstreamConfig: + overrides: + - name: + namespace: + protocol: + connectTimeoutMs: 5000 + meshGateway: + mode: + balanceOutboundConnections: exact_balance + limits: + maxConnections: 0 + maxPendingRequests: 0 + maxConcurrentRequests: 0 + passiveHealthCheck: + interval: 0s + maxFailures: 0 + enforcingConsecutive5xx: 100 + defaults: + protocol: + connectTimeoutMs: 5000 + meshGateway: + mode: + balanceOutboundConnections: exact_balance + limits: + maxConnections: 0 + maxPendingRequests: 0 + maxConcurrentRequests: 0 + passiveHealthCheck: + interval: 0s + maxFailures: 0 + enforcingConsecutive5xx: 100 + transparentProxy: + outboundListenerPort: 15001 + dialedDirectly: false + destination: + addresses: + - + + port: 0 + maxInboundConnections: 0 + meshGateway: + mode: + externalSNI: + expose: + checks: false + paths: + - path: + localPathPort: 0 + listenerPort: 0 + protocol: http +``` + + + + + +```json +{ + "apiVersion": "consul.hashicorp.com/v1alpha1", + "kind": "ServiceDefaults", + "metadata": { + "name": "", + "namespace": "", + "partition": "" + }, + "spec": { + "protocol": "tcp", + "balanceInboundConnnections": "exact_balance", + "mode": "transparent", + "upstreamConfig": { + "overrides": [ + { + "name": "", + "namespace": "", + "protocol": "", + "connectTimeoutMs": 5000, + "meshGateway": { + "mode": "" + }, + "balanceOutboundConnections": "exact_balance", + "limits": { + "maxConnections": 0, + "maxPendingRequests": 0, + "maxConcurrentRequests": 0 + }, + "passiveHealthCheck": { + "interval": "0s", + "maxFailures": 0, + "enforcingConsecutive5xx": 100 + } + } + ], + "defaults": { + "protocol": "", + "connectTimeoutMs": 5000, + "meshGateway": { + "mode": "" + }, + "balanceOutboundConnections": "exact_balance", + "limits": { + "maxConnections": 0, + "maxPendingRequests": 0, + "maxConcurrentRequests": 0 + }, + "passiveHealthCheck": { + "interval": "0s", + "maxFailures": 0, + "enforcingConsecutive5xx": 100 + } + } + }, + "transparentProxy": { + "outboundListenerPort": 15001, + "dialedDirectly": false + }, + "destination": { + "addresses": [ + "", + "" + ], + "port": 0 + }, + "maxInboundConnections": 0, + "meshGateway": { + "mode": "" + }, + "externalSNI": "", + "expose": { + "checks": false, + "paths": [ + { + "path": "", + "localPathPort": 0, + "listenerPort": 0, + "protocol": "http" + } + ] + } + } +} +``` + + + + + +## Specification + +This section provides details about the fields you can configure in the service defaults configuration entry. + + + + +### `Kind` + +Specifies the configuration entry type. + +#### Values + +- Default: none +- This field is required. +- Data type: String value that must be set to `service-defaults`. + +### `Name` + +Specifies the name of the service you are setting the defaults for. + +#### Values + +- Default: none +- This field is required. +- Data type: string + +### `Namespace` + +Specifies the Consul namespace that the configuration entry applies to. + +#### Values + +- Default: `default` +- Data type: string + +### `Partition` + +Specifies the name of the name of the Consul admin partition that the configuration entry applies to. Refer to [Admin Partitions](/consul/docs/enterprise/admin-partitions) for additional information. + +#### Values + +- Default: `default` +- Data type: string + +### `Meta` + +Specifies a set of custom key-value pairs to add to the [Consul KV](/consul/docs/dynamic-app-config/kv) store. + +#### Values + +- Default: none +- Data type: Map of one or more key-value pairs. + - keys: string + - values: string, integer, or float + +### `Protocol` + +Specifies the default protocol for the service. In service mesh use cases, the `protocol` configuration is required to enable the following features and components: + +- [observability](/consul/docs/connect/observability) +- [service splitter configuration entry](/consul/docs/connect/config-entries/service-splitter) +- [service router configuration entry](/consul/docs/connect/config-entries/service-router) +- [L7 intentions](/consul/docs/connect/intentions) + +You can set the global protocol for proxies in the [`proxy-defaults`](/consul/docs/connect/config-entries/proxy-defaults#default-protocol) configuration entry, but the protocol specified in the `service-defaults` configuration entry overrides the `proxy-defaults` configuration. + +#### Values + +- Default: `tcp` +- You can speciyf one of the following string values: + - `tcp` (default) + - `http` + - `http2` + - `grpc` + +Refer to [Set the default protocol](#set-the-default-protocol) for an example configuration. + +### `BalanceInboundConnections` + +Specifies the strategy for allocating inbound connections to the service across Envoy proxy threads. The only supported value is `exact_balance`. By default, no connections are balanced. Refer to the [Envoy documentation](https://cloudnative.to/envoy/api-v3/config/listener/v3/listener.proto.html#config-listener-v3-listener-connectionbalanceconfig) for details. + +#### Values + +- Default: none +- Data type: string + +### `Mode` + +Specifies a mode for how the service directs inbound and outbound traffic. + +- Default: none +- You can specify the following string values: + - `direct`: The proxy's listeners must be dialed directly by the local application and other proxies. + - `transparent`: The service captures inbound and outbound traffic and redirects it through the proxy. The mode does not enable the traffic redirection. It instructs Consul to configure Envoy as if traffic is already being redirected. + + +### `UpstreamConfig` + +Controls default upstream connection settings and custom overrides for individual upstream services. If your network contains federated datacenters, individual upstream configurations apply to all pairs of source and upstream destination services in the network. Refer to the following fields for details: + +- [`UpstreamConfig.Overrides`](#upstreamconfig-overrides) +- [`UpstreamConfig.Defaults`](#upstreamconfig-defaults) + +#### Values + +- Default: none +- Data type: map + +### `UpstreamConfig.Overrides[]` + +Specifies options that override the [default upstream configurations](#upstreamconfig-defaults) for individual upstreams. + +#### Values + +- Default: none +- Data type: list + +### `UpstreamConfig.Overrides[].Name` + +Specifies the name of the upstream service that the configuration applies to. We recommend that you do not use the `*` wildcard to avoid applying the configuration to unintended upstreams. + +#### Values + +- Default: none +- Data type: string + +### `UpstreamConfig.Overrides[].Namespace` + +Specifies the namespace containing the upstream service that the configuration applies to. Do not use the `*` wildcard to prevent the configuration from appling to unintended upstreams. + +#### Values + +- Default: none +- Data type: string + +### `UpstreamConfig.Overrides[].Protocol` +Specifies the protocol to use for requests to the upstream listener. + +We recommend configuring the protocol in the main [`Protocol`](#protocol) field of the configuration entry so that you can leverage [L7 features](/consul/docs/connect/l7-traffic). Setting the protocol in an upstream configuration limits L7 management functionality. + +#### Values + +- Default: none +- Data type: string + + +### `UpstreamConfig.Overrides[].ConnectTimeoutMs` + +Specifies how long in milliseconds that the service should attempt to establish an upstream connection before timing out. + +We recommend configuring the upstream timeout in the [`connection_timeout`](/consul/docs/connect/config-entries/service-resolver#connecttimeout) field of the `service-resolver` configuration entry for the upstream destination service. Doing so enables you to leverage [L7 features](/consul/docs/connect/l7-traffic). Configuring the timeout in the `service-defaults` upstream configuration limits L7 management functionality. + +#### Values + +- Default: `5000` +- Data type: integer + +### `UpstreamConfig.Overrides[].MeshGateway` + +Map that contains the default mesh gateway `mode` field for the upstream. Refer to [Connect Proxy Configuration](/consul/docs/connect/gateways/mesh-gateway#connect-proxy-configuration) in the mesh gateway documentation for additional information. + +#### Values + +- Default: `none` +- You can specify the following string values for the `mode` field: + - `none`: The service does not make outbound connections through a mesh gateway. Instead, the service makes outbound connections directly to the destination services. + - `local`: The service mesh proxy makes an outbound connection to a gateway running in the same datacenter. + - `remote`: The service mesh proxy makes an outbound connection to a gateway running in the destination datacenter. + + +### `UpstreamConfig.Overrides[].BalanceOutboundConnections` + +Sets the strategy for allocating outbound connections from the upstream across Envoy proxy threads. + +#### Values + +The only supported value is `exact_balance`. By default, no connections are balanced. Refer to the [Envoy documentation](https://cloudnative.to/envoy/api-v3/config/listener/v3/listener.proto.html#config-listener-v3-listener-connectionbalanceconfig) for details. + +- Default: none +- Data type: string + +### `UpstreamConfig.Overrides[].Limits` + +Map that specifies a set of limits to apply to when connecting to individual upstream services. + +#### Values + +The following table describes limits you can configure: + +| Limit | Description | Data type | Default | +| --- | --- | --- | --- | +| `MaxConnections` | Specifies the maximum number of connections a service instance can establish against the upstream. Define this limit for HTTP/1.1 traffic. | integer | `0` | +| `MaxPendingRequests` | Specifies the maximum number of requests that are queued while waiting for a connection to establish. An L7 protocol must be defined in the [`protocol`](#protocol) field for this limit to take effect. | integer | `0` | +| `MaxConcurrentRequests` | Specifies the maximum number of concurrent requests. Define this limit for HTTP/2 traffic. An L7 protocol must be defined in the [`protocol`](#protocol) field for this limit to take effect. | integer | `0` | + +Refer to the [upstream configuration example](#upstream-configuration) for additional guidance. + +### `UpstreamConfig.Overrides[].PassiveHealthCheck` + +Map that specifies a set of rules that enable Consul to remove hosts from the upstream cluster that are unreachable or that return errors. + +#### Values + +The following table describes passive health check parameters you can configure: + +| Limit | Description | Data type | Default | +| --- | --- | --- | --- | +| `Interval` | Specifies the time between checks. | string | `0s` | +| `MaxFailures` | Specifies the number of consecutive failures allowed per check interval. If exceeded, Consul removes the host from the load balancer. | integer | `0` | +| `EnforcingConsecutive5xx ` | Specifies a percentage that indicates how many times out of 100 that Consul ejects the host when it detects an outlier status. The outlier status is determined by consecutive errors in the 500-599 response range. | integer | `100` | + +### `UpstreamConfig.Defaults` + +Specifies configurations that set default upstream settings. For information about overriding the default configurations for in for individual upstreams, refer to [`UpstreamConfig.Overrides`](#upstreamconfig-overrides). + +#### Values + +- Default: none +- Data type: map + +### `UpstreamConfig.Defaults.Protocol` + +Specifies default protocol for upstream listeners. + +We recommend configuring the protocol in the main [`Protocol`](#protocol) field of the configuration entry so that you can leverage [L7 features](/consul/docs/connect/l7-traffic). Setting the protocol in an upstream configuration limits L7 management functionality. + +- Default: none +- Data type: string + +### `UpstreamConfig.Defaults.ConnectTimeoutMs` + +Specifies how long in milliseconds that all services should continue attempting to establish an upstream connection before timing out. + +For non-Kubernetes environments, we recommend configuring the upstream timeout in the [`connection_timeout`](/consul/docs/connect/config-entries/service-resolver#connecttimeout) field of the `service-resolver` configuration entry for the upstream destination service. Doing so enables you to leverage [L7 features](/consul/docs/connect/l7-traffic). Configuring the timeout in the `service-defaults` upstream configuration limits L7 management functionality. + +- Default: `5000` +- Data type: integer + +### `UpstreamConfig.Defaults.MeshGateway` + +Specifies the default mesh gateway `mode` field for all upstreams. Refer to [Connect Proxy Configuration](/consul/docs/connect/gateways/mesh-gateway#connect-proxy-configuration) in the mesh gateway documentation for additional information. + +You can specify the following string values for the `mode` field: + +- `none`: The service does not make outbound connections through a mesh gateway. Instead, the service makes outbound connections directly to the destination services. +- `local`: The service mesh proxy makes an outbound connection to a gateway running in the same datacenter. +- `remote`: The service mesh proxy makes an outbound connection to a gateway running in the destination datacenter. + +### `UpstreamConfig.Defaults.BalanceOutboundConnections` + +Sets the strategy for allocating outbound connections from upstreams across Envoy proxy threads. The only supported value is `exact_balance`. By default, no connections are balanced. Refer to the [Envoy documentation](https://cloudnative.to/envoy/api-v3/config/listener/v3/listener.proto.html#config-listener-v3-listener-connectionbalanceconfig) for details. + +- Default: none +- Data type: string + +### `UpstreamConfig.Defaults.Limits` + +Map that specifies a set of limits to apply to when connecting upstream services. The following table describes limits you can configure: + +| Limit | Description | Data type | Default | +| --- | --- | --- | --- | +| `MaxConnections` | Specifies the maximum number of connections a service instance can establish against the upstream. Define this limit for HTTP/1.1 traffic. | integer | `0` | +| `MaxPendingRequests` | Specifies the maximum number of requests that are queued while waiting for a connection to establish. An L7 protocol must be defined in the [`protocol`](#protocol) field for this limit to take effect. | integer | `0` | +| `MaxConcurrentRequests` | Specifies the maximum number of concurrent requests. Define this limit for HTTP/2 traffic. An L7 protocol must be defined in the [`protocol`](#protocol) field for this limit to take effect. | integer | `0` | + +### `UpstreamConfig.Defaults.PassiveHealthCheck` + +Map that specifies a set of rules that enable Consul to remove hosts from the upstream cluster that are unreachable or that return errors. The following table describes the health check parameters you can configure: + +| Limit | Description | Data type | Default | +| --- | --- | --- | --- | +| `Interval` | Specifies the time between checks. | string | `0s` | +| `MaxFailures` | Specifies the number of consecutive failures allowed per check interval. If exceeded, Consul removes the host from the load balancer. | integer | `0` | +| `EnforcingConsecutive5xx ` | Specifies a percentage that indicates how many times out of 100 that Consul ejects the host when it detects an outlier status. The outlier status is determined by consecutive errors in the 500-599 response range. | integer | `100` | + +### `TransparentProxy` + +Controls configurations specific to proxies in transparent mode. Refer to [Transparent Proxy](/consul/docs/connect/transparent-proxy) for additional information. + +You can configure the following parameters in the `TransparentProxy` block: + +| Parameter | Description | Data type | Default | +| --- | --- | --- | --- | +| `OutboundListenerPort` | Specifies the port that the proxy listens on for outbound traffic. This must be the same port number where outbound application traffic is redirected. | integer | `15001` | +| `DialedDirectly` | Enables transparent proxies to dial the proxy instance's IP address directly when set to `true`. Transparent proxies commonly dial upstreams at the `"virtual"` tagged address, which load balances across instances. Dialing individual instances can be helpful for stateful services, such as a database cluster with a leader. | boolean | `false` | + +### `Destination[]` -Set the default protocol for a service in the default namespace to HTTP: +Configures the destination for service traffic through terminating gateways. Refer to [Terminating Gateway](/consul/docs/connect/terminating-gateway) for additional information. + +You can configure the following parameters in the `Destination` block: + +| Parameter | Description | Data type | Default | +| --- | --- | --- | --- | +| `Address` | Specifies a list of addresses for the destination. You can configure a list of hostnames and IP addresses. Wildcards are not supported. | list | none | +| `Port` | Specifies the port number of the destination. | integer | `0` | + +### `MaxInboundConnections` + +Specifies the maximum number of concurrent inbound connections to each service instance. + +- Default: `0` +- Data type: integer + +### `LocalConnectTimeoutMs` + +Specifies the number of milliseconds allowed for establishing connections to the local application instance before timing out. + +- Default: `5000` +- Data type: integer + +### `LocalRequestTimeoutMs` + +Specifies the timeout for HTTP requests to the local application instance. Applies to HTTP-based protocols only. If not specified, inherits the Envoy default for route timeouts. + +- Default: Inherits `15s` from Envoy as the default +- Data type: string + +### `MeshGateway` + +Specifies the default mesh gateway `mode` field for the service. Refer to [Connect Proxy Configuration](/consul/docs/connect/gateways/mesh-gateway#connect-proxy-configuration) in the mesh gateway documentation for additional information. + +You can specify the following string values for the `mode` field: + +- `none`: The service does not make outbound connections through a mesh gateway. Instead, the service makes outbound connections directly to the destination services. +- `local`: The service mesh proxy makes an outbound connection to a gateway running in the same datacenter. +- `remote`: The service mesh proxy makes an outbound connection to a gateway running in the destination datacenter. + +### `ExternalSNI` + +Specifies the TLS server name indication (SNI) when federating with an external system. + +- Default: none +- Data type: string + +### `Expose` + +Specifies default configurations for exposing HTTP paths through Envoy. Exposing paths through Envoy enables services to listen on localhost only. Applications that are not Consul service mesh-enabled can still contact an HTTP endpoint. Refer to [Expose Paths Configuration Reference](/consul/docs/connect/registration/service-registration#expose-paths-configuration-reference) for additional information and example configurations. + +- Default: none +- Data type: map + +### `Expose.Checks` + +Exposes all HTTP and gRPC checks registered with the agent if set to `true`. Envoy exposes listeners for the checks and only accepts connections originating from localhost or Consul's [`advertise_addr`](/consul/docs/agent/config/config-files#advertise_addr). The ports for the listeners are dynamically allocated from the agent's [`expose_min_port`](/consul/docs/agent/config/config-files#expose_min_port) and [`expose_max_port`](/consul/docs/agent/config/config-files#expose_max_port) configurations. + +We recommend enabling the `Checks` configuration when a Consul client cannot reach registered services over localhost, such as when Consul agents run in their own pods in Kubernetes. + +- Default: `false` +- Data type: boolean + +### `Expose.Paths[]` + +Specifies a list of configuration maps that define paths to expose through Envoy when `Expose.Checks` is set to `true`. You can configure the following parameters for each map in the list: + +| Parameter | Description | Data type | Default | +| --- | --- | --- | --- | +| `Path` | Specifies the HTTP path to expose. You must prepend the path with a forward slash (`/`). | string | none | +| `LocalPathPort` | Specifies the port where the local service listens for connections to the path. | integer | `0` | +| `ListenPort` | Specifies the port where the proxy listens for connections. The port must be available. If the port is unavailable, Envoy does not expose a listener for the path and the proxy registration still succeeds. | integer | `0` | +| `Protocol` | Specifies the protocol of the listener. You can configure one of the following values:
  • `http`
  • `http2`: Use with gRPC traffic
  • | integer | `http` | + +
    + + + +### `apiVersion` + +Specifies the version of the Consul API for integrating with Kubernetes. The value must be `consul.hashicorp.com/v1alpha1`. The `apiVersion` field is not supported for non-Kubernetes deployments. + +- Default: none +- This field is required. +- String value that must be set to `consul.hashicorp.com/v1alpha1`. + +### `kind` + +Specifies the configuration entry type. Must be ` ServiceDefaults`. + +- Required: required +- String value that must be set to `ServiceDefaults`. + +### `metadata` + +Map that contains the service name, namespace, and admin partition that the configuration entry applies to. + +#### Values + +- Default: none +- Map containing the following strings: + - [`name`](#name) + - [`namespace`](#namespace) + - [`partition`](#partition) + + +### `metadata.name` + +Specifies the name of the service you are setting the defaults for. + +#### Values + +- Default: none +- This field is required +- Data type: string + +### `metadata.namespace` + +Specifies the Consul namespace that the configuration entry applies to. Refer to [Consul Enterprise](/consul/docs/k8s/crds#consul-enterprise) for information about how Consul namespaces map to Kubernetes Namespaces. Open source Consul distributions (Consul OSS) ignore the `metadata.namespace` configuration. + +- Default: `default` +- Data type: string + +### `metadata.partition` + +Specifies the name of the name of the Consul admin partition that the configuration entry applies to. Refer to [Consul Enterprise](/consul/docs/k8s/crds#consul-enterprise) for information about how Consul Enterprise on Kubernetes. Consul OSS distributions ignore the `metadata.partition` configuration. + +- Default: `default` +- Data type: string + +### `spec` + +Map that contains the details about the `ServiceDefaults` configuration entry. The `apiVersion`, `kind`, and `metadata` fields are siblings of the `spec` field. All other configurations are children. + +### `spec.protocol` + +Specifies the default protocol for the service. In service service mesh use cases, the `protocol` configuration is required to enable the following features and components: + +- [observability](/consul/docs/connect/observability) +- [`service-splitter` configuration entry](/consul/docs/connect/config-entries/service-splitter) +- [`service-router` configuration entry](/consul/docs/connect/config-entries/service-router) +- [L7 intentions](/consul/docs/connect/intentions) + +You can set the global protocol for proxies in the [`ProxyDefaults` configuration entry](/consul/docs/connect/config-entries/proxy-defaults#default-protocol), but the protocol specified in the `ServiceDefaults` configuration entry overrides the `ProxyDefaults` configuration. + +#### Values + +- Default: `tcp` +- You can specify one of the following string values: + - `tcp` + - `http` + - `http2` + - `grpc` + +Refer to [Set the default protocol](#set-the-default-protocol) for an example configuration. + +### `spec.balanceInboundConnections` + +Specifies the strategy for allocating inbound connections to the service across Envoy proxy threads. The only supported value is `exact_balance`. By default, no connections are balanced. Refer to the [Envoy documentation](https://cloudnative.to/envoy/api-v3/config/listener/v3/listener.proto.html#config-listener-v3-listener-connectionbalanceconfig) for details. + +#### Values + +- Default: none +- Data type: string + +### `spec.mode` + +Specifies a mode for how the service directs inbound and outbound traffic. + +#### Values + +- Default: none +- Required: optional +- You can specified the following string values: + +- `direct`: The proxy's listeners must be dialed directly by the local application and other proxies. +- `transparent`: The service captures inbound and outbound traffic and redirects it through the proxy. The mode does not enable the traffic redirection. It instructs Consul to configure Envoy as if traffic is already being redirected. + +### `spec.upstreamConfig` + +Specifies a map that controls default upstream connection settings and custom overrides for individual upstream services. If your network contains federated datacenters, individual upstream configurations apply to all pairs of source and upstream destination services in the network. + +#### Values + +- Default: none +- Map that contains the following configurations: + - [`UpstreamConfig.Overrides`](#upstreamconfig-overrides) + - [`UpstreamConfig.Defaults`](#upstreamconfig-defaults) + +### `spec.upstreamConfig.overrides[]` + +Specifies options that override the [default upstream configurations](#spec-upstreamconfig-defaults) for individual upstreams. + +#### Values + +- Default: none +- Data type: list + +### `spec.upstreamConfig.overrides[].name` + +Specifies the name of the upstream service that the configuration applies to. Do not use the `*` wildcard to prevent the configuration from applying to unintended upstreams. + +#### Values + +- Default: none +- Data type: string + +### `spec.upstreamConfig.overrides[].namespace` + +Specifies the namespace containing the upstream service that the configuration applies to. Do not use the `*` wildcard to prevent the configuration from applying to unintended upstreams. + +#### Values + +- Default: none +- Data type: string + +### `spec.upstreamConfig.overrides[].protocol` + +Specifies the protocol to use for requests to the upstream listener. We recommend configuring the protocol in the main [`protocol`](#protocol) field of the configuration entry so that you can leverage [L7 features](/consul/docs/connect/l7-traffic). Setting the protocol in an upstream configuration limits L7 management functionality. + +#### Values + +- Default: inherits the main [`protocol`](#protocol) configuration +- Data type: string + + +### `spec.upstreamConfig.overrides[].connectTimeoutMs` + +Specifies how long in milliseconds that the service should attempt to establish an upstream connection before timing out. + +We recommend configuring the upstream timeout in the [`connectTimeout`](/consul/docs/connect/config-entries/service-resolver#connecttimeout) field of the `ServiceResolver` CRD for the upstream destination service. Doing so enables you to leverage [L7 features](/consul/docs/connect/l7-traffic). Configuring the timeout in the `ServiceDefaults` upstream configuration limits L7 management functionality. + +#### Values + +- Default: `5000` +- Data type: integer + +### `spec.upstreamConfig.overrides[].meshGateway.mode` + +Map that contains the default mesh gateway `mode` field for the upstream. Refer to [Connect Proxy Configuration](/consul/docs/connect/gateways/mesh-gateway#connect-proxy-configuration) in the mesh gateway documentation for additional information. + +#### Values + +You can specify the following string values for the `mode` field: + +- `none`: The service does not make outbound connections through a mesh gateway. Instead, the service makes outbound connections directly to the destination services. +- `local`: The service mesh proxy makes an outbound connection to a gateway running in the same datacenter. +- `remote`: The service mesh proxy makes an outbound connection to a gateway running in the destination datacenter. + +### `spec.upstreamConfig.overrides[].balanceInboundConnections` + +Sets the strategy for allocating outbound connections from the upstream across Envoy proxy threads. The only supported value is `exact_balance`. By default, no connections are balanced. Refer to the [Envoy documentation](https://cloudnative.to/envoy/api-v3/config/listener/v3/listener.proto.html#config-listener-v3-listener-connectionbalanceconfig) for details. + +#### Values + +- Default: none +- Data type: string + +### `spec.upstreamConfig.overrides[].limits` + +Map that specifies a set of limits to apply to when connecting to individual upstream services. + +#### Values + +The following table describes limits you can configure: + +| Limit | Description | Data type | Default | +| --- | --- | --- | --- | +| `maxConnections` | Specifies the maximum number of connections a service instance can establish against the upstream. Define this limit for HTTP/1.1 traffic. | integer | `0` | +| `maxPendingRequests` | Specifies the maximum number of requests that are queued while waiting for a connection to establish. An L7 protocol must be defined in the [`protocol`](#protocol) field for this limit to take effect. | integer | `0` | +| `maxConcurrentRequests` | Specifies the maximum number of concurrent requests. Define this limit for HTTP/2 traffic. An L7 protocol must be defined in the [`protocol`](#protocol) field for this limit to take effect. | integer | `0` | + +### `spec.upstreamConfig.overrides[].passiveHealthCheck` + +Map that specifies a set of rules that enable Consul to remove hosts from the upstream cluster that are unreachable or that return errors. + +#### Values + +The following table describes passive health check parameters you can configure: + +| Limit | Description | Data type | Default | +| --- | --- | --- | --- | +| `interval` | Specifies the time between checks. | string | `0s` | +| `maxFailures` | Specifies the number of consecutive failures allowed per check interval. If exceeded, Consul removes the host from the load balancer. | integer | `0` | +| `enforcingConsecutive5xx ` | Specifies a percentage that indicates how many times out of 100 that Consul ejects the host when it detects an outlier status. The outlier status is determined by consecutive errors in the 500-599 response range. | integer | `100` | + +### `spec.upstreamConfig.defaults` + +Map of configurations that set default upstream configurations for the service. For information about overriding the default configurations for in for individual upstreams, refer to [`spec.upstreamConfig.overrides`](#spec-upstreamconfig-overrides). + +#### Values + +- Default: none +- Data type: list + +### `spec.upstreamConfig.defaults.protocol` + +Specifies default protocol for upstream listeners. We recommend configuring the protocol in the main [`Protocol`](#protocol) field of the configuration entry so that you can leverage [L7 features](/consul/docs/connect/l7-traffic). Setting the protocol in an upstream configuration limits L7 management functionality. + +#### Values + +- Default: none +- Data type: string + +### `spec.upstreamConfig.default.connectTimeoutMs` + +Specifies how long in milliseconds that all services should continue attempting to establish an upstream connection before timing out. + +We recommend configuring the upstream timeout in the [`connectTimeout`](/consul/docs/connect/config-entries/service-resolver#connecttimeout) field of the `ServiceResolver` CRD for upstream destination services. Doing so enables you to leverage [L7 features](/consul/docs/connect/l7-traffic). Configuring the timeout in the `ServiceDefaults` upstream configuration limits L7 management functionality. + +#### Values + +- Default: `5000` +- Data type: integer + +### `spec.upstreamConfig.defaults.meshGateway.mode` + +Specifies the default mesh gateway `mode` field for all upstreams. Refer to [Connect Proxy Configuration](/consul/docs/connect/gateways/mesh-gateway#connect-proxy-configuration) in the mesh gateway documentation for additional information. + +#### Values + +You can specify the following string values for the `mode` field: + +- `none`: The service does not make outbound connections through a mesh gateway. Instead, the service makes outbound connections directly to the destination services. +- `local`: The service mesh proxy makes an outbound connection to a gateway running in the same datacenter. +- `remote`: The service mesh proxy makes an outbound connection to a gateway running in the destination datacenter. + +### `spec.upstreamConfig.defaults.balanceInboundConnections` + +Sets the strategy for allocating outbound connections from upstreams across Envoy proxy threads. The only supported value is `exact_balance`. By default, no connections are balanced. Refer to the [Envoy documentation](https://cloudnative.to/envoy/api-v3/config/listener/v3/listener.proto.html#config-listener-v3-listener-connectionbalanceconfig) for details. + +#### Values + +- Default: none +- Data type: string + +### `spec.upstreamConfig.defaults.limits` + +Map that specifies a set of limits to apply to when connecting upstream services. + +#### Values + +The following table describes limits you can configure: + +| Limit | Description | Data type | Default | +| --- | --- | --- | --- | +| `maxConnections` | Specifies the maximum number of connections a service instance can establish against the upstream. Define this limit for HTTP/1.1 traffic. | integer | `0` | +| `maxPendingRequests` | Specifies the maximum number of requests that are queued while waiting for a connection to establish. An L7 protocol must be defined in the [`protocol`](#protocol) field for this limit to take effect. | integer | `0` | +| `maxConcurrentRequests` | Specifies the maximum number of concurrent requests. Define this limit for HTTP/2 traffic. An L7 protocol must be defined in the [`protocol`](#protocol) field for this limit to take effect. | integer | `0` | + +### `spec.upstreamConfig.defaults.passiveHealthCheck` +Map that specifies a set of rules that enable Consul to remove hosts from the upstream cluster that are unreachable or that return errors. + +#### Values + +The following table describes the health check parameters you can configure: + +| Limit | Description | Data type | Default | +| --- | --- | --- | --- | +| `interval` | Specifies the time between checks. | string | `0s` | +| `maxFailures` | Specifies the number of consecutive failures allowed per check interval. If exceeded, Consul removes the host from the load balancer. | integer | `0` | +| `enforcingConsecutive5xx ` | Specifies a percentage that indicates how many times out of 100 that Consul ejects the host when it detects an outlier status. The outlier status is determined by consecutive errors in the 500-599 response range. | integer | `100` | + +### `spec.transparentProxy` + +Map of configurations specific to proxies in transparent mode. Refer to [Transparent Proxy](/consul/docs/connect/transparent-proxy) for additional information. + +#### Values + +You can configure the following parameters in the `TransparentProxy` block: + +| Parameter | Description | Data type | Default | +| --- | --- | --- | --- | +| `outboundListenerPort` | Specifies the port that the proxy listens on for outbound traffic. This must be the same port number where outbound application traffic is redirected. | integer | `15001` | +| `dialedDirectly` | Enables transparent proxies to dial the proxy instance's IP address directly when set to `true`. Transparent proxies commonly dial upstreams at the `"virtual"` tagged address, which load balances across instances. Dialing individual instances can be helpful for stateful services, such as a database cluster with a leader. | boolean | `false` | + +### `spec.destination` + +Map of configurations that specify one or more destinations for service traffic routed through terminating gateways. Refer to [Terminating Gateway](/consul/docs/connect/terminating-gateway) for additional information. + +#### Values + +You can configure the following parameters in the `Destination` block: + +| Parameter | Description | Data type | Default | +| --- | --- | --- | --- | +| `address` | Specifies a list of addresses for the destination. You can configure a list of hostnames and IP addresses. Wildcards are not supported. | list | none | +| `port` | Specifies the port number of the destination. | integer | `0` | + +### `spec.maxInboundConnections` + +Specifies the maximum number of concurrent inbound connections to each service instance. + +#### Values + +- Default: `0` +- Data type: integer + +### `spec.localConnectTimeoutMs` + +Specifies the number of milliseconds allowed for establishing connections to the local application instance before timing out. + +#### Values + +- Default: `5000` +- Data type: integer + +### `spec.localRequestTimeoutMs` + +Specifies the timeout for HTTP requests to the local application instance. Applies to HTTP-based protocols only. If not specified, inherits the Envoy default for route timeouts. + +#### Values + +- Default of `15s` is inherited from Envoy +- Data type: string + +### `spec.meshGateway.mode` +Specifies the default mesh gateway `mode` field for the service. Refer to [Connect Proxy Configuration](/consul/docs/connect/gateways/mesh-gateway#connect-proxy-configuration) in the mesh gateway documentation for additional information. + +#### Values + +You can specify the following string values for the `mode` field: + +- `none`: The service does not make outbound connections through a mesh gateway. Instead, the service makes outbound connections directly to the destination services. +- `local`: The service mesh proxy makes an outbound connection to a gateway running in the same datacenter. +- `remote`: The service mesh proxy makes an outbound connection to a gateway running in the destination datacenter. + +### `spec.externalSNI` + +Specifies the TLS server name indication (SNI) when federating with an external system. + +#### Values + +- Default: none +- Data type: string + +### `spec.expose` + +Specifies default configurations for exposing HTTP paths through Envoy. Exposing paths through Envoy enables services to listen on localhost only. Applications that are not Consul service mesh-enabled can still contact an HTTP endpoint. Refer to [Expose Paths Configuration Reference](/consul/docs/connect/registration/service-registration#expose-paths-configuration-reference) for additional information and example configurations. + +#### Values + +- Default: none +- Data type: string + +### `spec.expose.checks` + +Exposes all HTTP and gRPC checks registered with the agent if set to `true`. Envoy exposes listeners for the checks and only accepts connections originating from localhost or Consul's [`advertise_addr`](/consul/docs/agent/config/config-files#advertise_addr). The ports for the listeners are dynamically allocated from the agent's [`expose_min_port`](/consul/docs/agent/config/config-files#expose_min_port) and [`expose_max_port`](/consul/docs/agent/config/config-files#expose_max_port) configurations. + +We recommend enabling the `Checks` configuration when a Consul client cannot reach registered services over localhost, such as when Consul agents run in their own pods in Kubernetes. + +#### Values + +- Default: `false` +- Data type: boolean + +### `spec.expose.paths[]` + +Specifies an list of maps that define paths to expose through Envoy when `spec.expose.checks` is set to `true`. + +#### Values + +The following table describes the parameters for each map: + +| Parameter | Description | Data type | Default | +| --- | --- | --- | --- | +| `path` | Specifies the HTTP path to expose. You must prepend the path with a forward slash (`/`). | string | none | +| `localPathPort` | Specifies the port where the local service listens for connections to the path. | integer | `0` | +| `listenPort` | Specifies the port where the proxy listens for connections. The port must be available. If the port is unavailable, Envoy does not expose a listener for the path and the proxy registration still succeeds. | integer | `0` | +| `protocol` | Specifies the protocol of the listener. You can configure one of the following values:
  • `http`
  • `http2`: Use with gRPC traffic
  • | integer | `http` | + +
    +
    + +## Example configurations + +The following examples describe common `service-defaults` configurations. + +### Set the default protocol + +In the following example, protocol for the `web` service in the `default` namespace is set to `http`: @@ -50,14 +1190,15 @@ spec: +You can also set the global default protocol for all proxies in the [`proxy-defaults` configuration entry](/consul/docs/connect/config-entries/proxy-defaults#default-protocol), but the protocol specified for individual service instances in the `service-defaults` configuration entry takes precedence over the globally-configured value set in the `proxy-defaults`. + ### Upstream configuration -Set default connection limits and mesh gateway mode across all upstreams -of "dashboard", and also override the mesh gateway mode used when dialing -its upstream "counting" service. +The following example sets default connection limits and mesh gateway mode across all upstreams of the `dashboard` service. +It also overrides the mesh gateway mode used when dialing its `counting` upstream service. @@ -140,10 +1281,7 @@ spec: -Set default connection limits and mesh gateway mode across all upstreams -of "dashboard" in the "product" namespace, -and also override the mesh gateway mode used when dialing -its upstream "counting" service in the "backend" namespace. +The following example configures the default connection limits and mesh gateway mode for all of the `counting` service's upstreams. It also overrides the mesh gateway mode used when dialing the `dashboard` service in the `frontend` namespace. @@ -234,8 +1372,8 @@ spec: ### Terminating gateway destination -Create a default destination that will be assigned to a terminating gateway. A destination -represents a location outside the Consul cluster. They can be dialed directly when transparent proxy mode is enabled. +The following examples creates a default destination assigned to a terminating gateway. A destination +represents a location outside the Consul cluster. Services can dial destinations dialed directly when transparent proxy mode is enabled. @@ -276,6 +1414,7 @@ represents a location outside the Consul cluster. They can be dialed directly wh + \ No newline at end of file diff --git a/website/content/docs/connect/configuration.mdx b/website/content/docs/connect/configuration.mdx index 8fbd88fa325..e3369468859 100644 --- a/website/content/docs/connect/configuration.mdx +++ b/website/content/docs/connect/configuration.mdx @@ -9,14 +9,11 @@ description: >- There are many configuration options exposed for Consul service mesh. The only option that must be set is the `connect.enabled` option on Consul servers to enable Consul service mesh. -All other configurations are optional and have reasonable defaults. +All other configurations are optional and have defaults suitable for many environments. -Consul Connect is the component shipped with Consul that enables service mesh functionality. The terms _Consul Connect_ and _Consul service mesh_ are used interchangeably throughout this documentation. +The terms _Consul Connect_ and _Consul service mesh_ are used interchangeably throughout this documentation. --> **Tip:** Service mesh is enabled by default when running Consul in -dev mode with `consul agent -dev`. - -## Agent Configuration +## Agent configuration Begin by enabling Connect for your Consul cluster. By default, Connect is disabled. Enabling Connect requires changing @@ -75,18 +72,12 @@ automatically ensure complete security. Please read the [Connect production tutorial](/consul/tutorials/developer-mesh/service-mesh-production-checklist) to understand the additional steps needed for a secure deployment. -## Centralized Proxy and Service Configuration - -To account for common Connect use cases where you have many instances of the -same service, and many colocated sidecar proxies, Consul allows you to customize -the settings for all of your proxies or all the instances of a given service at -once using [Configuration Entries](/consul/docs/agent/config-entries). +## Centralized proxy and service configuration -You can override centralized configurations for individual proxy instances in -their +If your network contains many instances of the same service and many colocated sidecar proxies, you can specify global settings for proxies or services in [Configuration Entries](/consul/docs/agent/config-entries). You can override the centralized configurations for individual proxy instances in their [sidecar service definitions](/consul/docs/connect/registration/sidecar-service), and the default protocols for service instances in their [service -registrations](/consul/docs/discovery/services). +definitions](/consul/docs/services/usage/define-services). ## Schedulers diff --git a/website/content/docs/connect/gateways/ingress-gateway.mdx b/website/content/docs/connect/gateways/ingress-gateway.mdx index d75dbd5ebc0..2ba36b3d79b 100644 --- a/website/content/docs/connect/gateways/ingress-gateway.mdx +++ b/website/content/docs/connect/gateways/ingress-gateway.mdx @@ -20,7 +20,7 @@ to a set of backing [services](/consul/docs/connect/config-entries/ingress-gateway#services). To enable easier service discovery, a new Consul [DNS -subdomain](/consul/docs/discovery/dns#ingress-service-lookups) is provided, on +subdomain](/consul/docs/services/discovery/dns-static-lookups#ingress-service-lookups) is provided, on `.ingress.`. For listeners with a @@ -29,7 +29,7 @@ For listeners with a case, the ingress gateway relies on host/authority headers to decide the service that should receive the traffic. The host used to match traffic defaults to the [Consul DNS ingress -subdomain](/consul/docs/discovery/dns#ingress-service-lookups), but can be changed using +subdomain](/consul/docs/services/discovery/dns-static-lookups#ingress-service-lookups), but can be changed using the [hosts](/consul/docs/connect/config-entries/ingress-gateway#hosts) field. ![Ingress Gateway Architecture](/img/ingress-gateways.png) diff --git a/website/content/docs/connect/native/index.mdx b/website/content/docs/connect/native/index.mdx index ffeb720f8bf..6dee2160465 100644 --- a/website/content/docs/connect/native/index.mdx +++ b/website/content/docs/connect/native/index.mdx @@ -54,7 +54,7 @@ Details on the steps are below: - **Service discovery** - This is normal service discovery using Consul, a static IP, or any other mechanism. If you're using Consul DNS, the - [`.connect`](/consul/docs/discovery/dns#connect-capable-service-lookups) + [`.connect`](/consul/docs/services/discovery/dns-static-lookups#service-mesh-enabled-service-lookups) syntax to find Connect-capable endpoints for a service. After service discovery, choose one address from the list of **service addresses**. @@ -94,7 +94,7 @@ Details on the steps are below: HTTP) aware it can safely enforce intentions per _request_ instead of the coarser per _connection_ model. -## Updating Certificates and Certificate Roots +## Update certificates and certificate roots The leaf certificate and CA roots can be updated at any time and the natively integrated application must react to this relatively quickly @@ -129,14 +129,14 @@ Some language libraries such as the [Go library](/consul/docs/connect/native/go) automatically handle updating and locally caching the certificates. -## Service Registration +## Service registration Connect-native applications must tell Consul that they support Connect natively. This enables the service to be returned as part of service -discovery for Connect-capable services, used by other Connect-native applications +discovery for service mesh-capable services used by other Connect-native applications and client [proxies](/consul/docs/connect/proxies). -This can be specified directly in the [service definition](/consul/docs/discovery/services): +You can enable native service mesh support directly in the [service definition](/consul/docs/services/configuration/services-configuration-reference#connect) by configuring the `connect` block. In the following example, the `redis` service is configured to support service mesh natively: ```json { diff --git a/website/content/docs/connect/observability/index.mdx b/website/content/docs/connect/observability/index.mdx index 3da463b389b..23dfd81b19e 100644 --- a/website/content/docs/connect/observability/index.mdx +++ b/website/content/docs/connect/observability/index.mdx @@ -26,7 +26,7 @@ configuration](/consul/docs/agent/config/config-files#enable_central_service_con If you are using Kubernetes, the Helm chart can simplify much of the configuration needed to enable observability. See our [Kubernetes observability docs](/consul/docs/k8s/connect/observability/metrics) for more information. -### Metrics Destination +### Metrics destination For Envoy the metrics destination can be configured in the proxy configuration entry's `config` section. @@ -41,18 +41,18 @@ config { Find other possible metrics syncs in the [Connect Envoy documentation](/consul/docs/connect/proxies/envoy#bootstrap-configuration). -### Service Protocol +### Service protocol -You can specify the [service protocol](/consul/docs/connect/config-entries/service-defaults#protocol) -in the `service-defaults` configuration entry. You can override it in the -[service registration](/consul/docs/discovery/services). By default, proxies only give -you L4 metrics. This protocol allows proxies to handle requests at the right L7 -protocol and emit richer L7 metrics. It also allows proxies to make per-request +You can specify the [`protocol`](/consul/docs/connect/config-entries/service-defaults#protocol) +for all service instances in the `service-defaults` configuration entry. You can also override the default protocol when defining and registering proxies in a service definition file. Refer to [Expose Paths Configuration Reference](/consul/docs/connect/registration/service-registration#expose-paths-configuration-reference) for additional information. + +By default, proxies only provide L4 metrics. +Defining the protocol allows proxies to handle requests at the L7 +protocol and emit L7 metrics. It also allows proxies to make per-request load balancing and routing decisions. -### Service Upstreams +### Service upstreams You can set the upstream for each service using the proxy's [`upstreams`](/consul/docs/connect/registration/service-registration#upstreams) -sidecar parameter, which can be defined in a service's [sidecar -registration](/consul/docs/connect/registration/sidecar-service). +sidecar parameter, which can be defined in a service's [sidecar registration](/consul/docs/connect/registration/sidecar-service). diff --git a/website/content/docs/connect/proxies/index.mdx b/website/content/docs/connect/proxies/index.mdx index 799daebd4ed..f47aad3f5dc 100644 --- a/website/content/docs/connect/proxies/index.mdx +++ b/website/content/docs/connect/proxies/index.mdx @@ -7,29 +7,23 @@ description: >- # Service Mesh Proxy Overview -A Connect-aware proxy enables unmodified applications to use Connect. A +Proxies enable unmodified applications to connect to other services in the service mesh. A per-service proxy sidecar transparently handles inbound and outbound service connections, automatically wrapping and verifying TLS connections. Consul -includes its own built-in L4 proxy and has first class support for Envoy. You -can choose other proxies to plug in as well. This section describes how to +ships with a built-in L4 proxy and has first class support for Envoy. You +can plug other proxies into your environment as well. This section describes how to configure Envoy or the built-in proxy using Connect, and how to integrate the proxy of your choice. -To ensure that services only allow external connections established via -the Connect protocol, you should configure all services to only accept connections on a loopback address. +To ensure that services only allow external connections established through +the service mesh protocol, you should configure all services to only accept connections on a loopback address. -~> **Deprecation Note:** Managed Proxies are a deprecated method for deploying -sidecar proxies, and have been removed in Consul 1.6. See [managed proxy -deprecation](/consul/docs/connect/proxies/managed-deprecated) for more -information. If you are using managed proxies we strongly recommend that you -switch service definitions for registering proxies. +## Dynamic upstreams require native integration -## Dynamic Upstreams Require Native Integration +Service mesh proxies do not support dynamic upstreams. If an application requires dynamic dependencies that are only available -at runtime, it must [natively integrate](/consul/docs/connect/native) -with Connect. After natively integrating, the HTTP API or -[DNS interface](/consul/docs/discovery/dns#connect-capable-service-lookups) -can be used. - -!> Connect proxies do not currently support dynamic upstreams. +at runtime, you must [natively integrate](/consul/docs/connect/native) +the application with Consul service mesh. After natively integrating, the HTTP API or +[DNS interface](/consul/docs/services/discovery/dns-static-lookups#service-mesh-enabled-service-lookups) +can be used. \ No newline at end of file diff --git a/website/content/docs/connect/proxies/managed-deprecated.mdx b/website/content/docs/connect/proxies/managed-deprecated.mdx deleted file mode 100644 index 4ac7adeb3a8..00000000000 --- a/website/content/docs/connect/proxies/managed-deprecated.mdx +++ /dev/null @@ -1,278 +0,0 @@ ---- -layout: docs -page_title: Managed Proxy for Connect (Legacy) -description: >- - Consul's service mesh originally included a proxy manager that was deprecated in version 1.6. Learn about the reasons for its deprecation and how it worked with this legacy documentation. ---- - -# Managed Proxy for Connect Legacy Documentation - -Consul Connect was first released as a beta feature in Consul 1.2.0. The initial -release included a feature called "Managed Proxies". Managed proxies were -Connect proxies where the proxy process was started, configured, and stopped by -Consul. They were enabled via basic configurations within the service -definition. - -!> **Consul 1.6.0 removes Managed Proxies completely.** -This documentation is provided for prior versions only. You may consider using -[sidecar service -registrations](/consul/docs/connect/registration/sidecar-service) instead. - -Managed proxies have been deprecated since Consul 1.3 and have been fully removed -in Consul 1.6. Anyone using Managed Proxies should aim to change their workflow -as soon as possible to avoid issues with a later upgrade. - -After transitioning away from all managed proxy usage, the `proxy` subdirectory inside [`data_dir`](/consul/docs/agent/config/cli-flags#_data_dir) (specified in Consul config) can be deleted to remove extraneous configuration files and free up disk space. - -**new and known issues will not be fixed**. - -## Deprecation Rationale - -Originally managed proxies traded higher implementation complexity for an easier -"getting started" user experience. After seeing how Connect was investigated and -adopted during beta it became obvious that they were not the best trade off. - -Managed proxies only really helped in local testing or VM-per-service based -models whereas a lot of users jumped straight to containers where they are not -helpful. They also add only targeted fairly basic supervisor features which -meant most people would want to use something else in production for consistency -with other workloads. So the high implementation cost of building robust process -supervision didn't actually benefit most real use-cases. - -Instead of this Connect 1.3.0 introduces the concept of [sidecar service -registrations](/consul/docs/connect/registration/sidecar-service) which -have almost all of the benefits of simpler configuration but without any of the -additional process management complexity. As a result they can be used to -simplify configuration in both container-based and realistic production -supervisor settings. - -## Managed Proxy Documentation - -As the managed proxy features continue to be supported for now, the rest of this -page will document how they work in the interim. - --> **Deprecation Note:** It's _strongly_ recommended you do not build anything -using Managed proxies and consider using [sidecar service -registrations](/consul/docs/connect/registration/sidecar-service) instead. - -Managed proxies are given -a unique proxy-specific ACL token that allows read-only access to Connect -information for the specific service the proxy is representing. This ACL -token is more restrictive than can be currently expressed manually in -an ACL policy. - -The default managed proxy is a basic proxy built-in to Consul and written -in Go. Having a basic built-in proxy allows Consul to have a reasonable default -with performance that is good enough for most workloads. In some basic -benchmarks, the service-to-service communication over the built-in proxy -could sustain 5 Gbps with sub-millisecond latency. Therefore, -the performance impact of even the basic built-in proxy is minimal. - -Consul will be integrating with advanced proxies in the near future to support -more complex configurations and higher performance. The configuration below is -all for the built-in proxy. - --> **Security Note:** 1.) Managed proxies can only be configured -via agent configuration files. They _cannot_ be registered via the HTTP API. -And 2.) Managed proxies are not started at all if Consul is running as root. -Both of these default configurations help prevent arbitrary process -execution or privilege escalation. This behavior can be configured -[per-agent](/consul/docs/agent/config). - -### Lifecycle - -The Consul agent starts managed proxies on demand and supervises them, -restarting them if they crash. The lifecycle of the proxy process is decoupled -from the agent so if the agent crashes or is restarted for an upgrade, the -managed proxy instances will _not_ be stopped. - -Note that this behavior while desirable in production might leave proxy -processes running indefinitely if you manually stop the agent and clear its -data dir during testing. - -To terminate a managed proxy cleanly you need to deregister the service that -requested it. If the agent is already stopped and will not be restarted again, -you may choose to locate the proxy processes and kill them manually. - -While in `-dev` mode, unless a `-data-dir` is explicitly set, managed proxies -switch to being killed when the agent exits since it can't store state in order -to re-adopt them on restart. - -### Minimal Configuration - -Managed proxies are configured within a -[service definition](/consul/docs/discovery/services). The simplest possible -managed proxy configuration is an empty configuration. This enables the -default managed proxy and starts a listener for that service: - -```json -{ - "service": { - "name": "redis", - "port": 6379, - "connect": { "proxy": {} } - } -} -``` - -The listener is started on random port within the configured Connect -port range. It can be discovered using the -[DNS interface](/consul/docs/discovery/dns#connect-capable-service-lookups) -or -[Catalog API](#). -In most cases, service-to-service communication is established by -a proxy configured with upstreams (described below), which handle the -discovery transparently. - -### Upstream Configuration - -To transparently discover and establish Connect-based connections to -dependencies, they must be configured with a static port on the managed -proxy configuration: - -```json -{ - "service": { - "name": "web", - "port": 8080, - "connect": { - "proxy": { - "upstreams": [ - { - "destination_name": "redis", - "local_bind_port": 1234 - } - ] - } - } - } -} -``` - -In the example above, -"redis" is configured as an upstream with static port 1234 for service "web". -When a TCP connection is established on port 1234, the proxy -will find Connect-compatible "redis" services via Consul service discovery -and establish a TLS connection identifying as "web". - -~> **Security:** Any application that can communicate to the configured -static port will be able to masquerade as the source service ("web" in the -example above). You must either trust any loopback access on that port or -use namespacing techniques provided by your operating system. - --> **Deprecation Note:** versions 1.2.0 to 1.3.0 required specifying `upstreams` -as part of the opaque `config` that is passed to the proxy. However, since -1.3.0, the `upstreams` configuration is now specified directly under the -`proxy` key. Old service definitions using the nested config will continue to -work and have the values copied into the new location. This allows the upstreams -to be registered centrally rather than being part of the local-only config -passed to the proxy instance. - -For full details of the additional configurable options available when using the -built-in proxy see the [built-in proxy configuration -reference](/consul/docs/connect/configuration). - -### Prepared Query Upstreams - -The upstream destination may also be a -[prepared query](/consul/api-docs/query). -This allows complex service discovery behavior such as connecting to -the nearest neighbor or filtering by tags. - -For example, given a prepared query named "nearest-redis" that is -configured to route to the nearest Redis instance, an upstream can be -configured to route to this query. In the example below, any TCP connection -to port 1234 will attempt a Connect-based connection to the nearest Redis -service. - -```json -{ - "service": { - "name": "web", - "port": 8080, - "connect": { - "proxy": { - "upstreams": [ - { - "destination_name": "redis", - "destination_type": "prepared_query", - "local_bind_port": 1234 - } - ] - } - } - } -} -``` - -For full details of the additional configurable options available when using the -built-in proxy see the [built-in proxy configuration -reference](/consul/docs/connect/configuration). - -### Custom Managed Proxy - -[Custom proxies](/consul/docs/connect/proxies/integrate) can also be -configured to run as a managed proxy. To configure custom proxies, specify -an alternate command to execute for the proxy: - -```json -{ - "service": { - "name": "web", - "port": 8080, - "connect": { - "proxy": { - "exec_mode": "daemon", - "command": ["/usr/bin/my-proxy", "-flag-example"], - "config": { - "foo": "bar" - } - } - } - } -} -``` - -The `exec_mode` value specifies how the proxy is executed. The only -supported value at this time is "daemon". The command is the binary and -any arguments to execute. -The "daemon" mode expects a proxy to run as a long-running, blocking -process. It should not double-fork into the background. The custom -proxy should retrieve its configuration (such as the port to run on) -via the [custom proxy integration APIs](/consul/docs/connect/proxies/integrate). - -The default proxy command can be changed at an agent-global level -in the agent configuration. An example in HCL format is shown below. - -``` -connect { - proxy_defaults { - command = ["/usr/bin/my-proxy"] - } -} -``` - -With this configuration, all services registered without an explicit -proxy command will use `my-proxy` instead of the default built-in proxy. - -The `config` key is an optional opaque JSON object which will be passed through -to the proxy via the proxy configuration endpoint to allow any configuration -options the proxy needs to be specified. See the [built-in proxy -configuration reference](/consul/docs/connect/configuration) -for details of config options that can be passed when using the built-in proxy. - -### Managed Proxy Logs - -Managed proxies have both stdout and stderr captured in log files in the agent's -`data_dir`. They can be found in -`/proxy/logs/-std{err,out}.log`. - -The built-in proxy will inherit its log level from the agent so if the agent is -configured with `log_level = DEBUG`, a proxy it starts will also output `DEBUG` -level logs showing service discovery, certificate and authorization information. - -~> **Note:** In `-dev` mode there is no `data_dir` unless one is explicitly -configured so logging is disabled. You can access logs by providing the -[`-data-dir`](/consul/docs/agent/config/cli-flags#_data_dir) CLI option. If a data dir is -configured, this will also cause proxy processes to stay running when the agent -terminates as described in [Lifecycle](#lifecycle). diff --git a/website/content/docs/connect/registration/index.mdx b/website/content/docs/connect/registration/index.mdx index 24c7a812519..96db3278877 100644 --- a/website/content/docs/connect/registration/index.mdx +++ b/website/content/docs/connect/registration/index.mdx @@ -7,14 +7,13 @@ description: >- # Service Mesh Proxy Overview -To make Connect aware of proxies you will need to register them in a [service -definition](/consul/docs/discovery/services), just like you would register any other service with Consul. This section outlines your options for registering Connect proxies, either using independent registrations, or in nested sidecar registrations. +To enable service mesh proxies, you must define and register them with Consul. Proxies are a type of service in Consul that facilitate highly secure communication between services in a service mesh. The topics in the section outline your options for registering service mesh proxies. You can register proxies independently or nested inside a sidecar service registration. -## Proxy Service Registration +## Proxy service registration To register proxies with independent proxy service registrations, you can define them in either in config files or via the API just like any other service. Learn more about all of the options you can define when registering your proxy service in the [proxy registration documentation](/consul/docs/connect/registration/service-registration). -## Sidecar Service Registration +## Sidecar service registration To reduce the amount of boilerplate needed for a sidecar proxy, application service definitions may define an inline sidecar service block. This is an opinionated diff --git a/website/content/docs/connect/registration/service-registration.mdx b/website/content/docs/connect/registration/service-registration.mdx index 2bfe409b5b8..666f739fa17 100644 --- a/website/content/docs/connect/registration/service-registration.mdx +++ b/website/content/docs/connect/registration/service-registration.mdx @@ -9,6 +9,7 @@ description: >- This topic describes how to declare a proxy as a `connect-proxy` in service definitions. The `kind` must be declared and information about the service they represent must be provided to function as a Consul service mesh proxy. + ## Configuration Configure a service mesh proxy using the following syntax: @@ -178,9 +179,7 @@ You can configure the service mesh proxy to create listeners for upstream servic ### Upstream Configuration Examples -Upstreams support multiple destination types. The following examples include information about each implementation. - --> **Snake case**: The examples in this topic use `snake_case` because the syntax is supported in configuration files and API registrations. See [Service Definition Parameter Case](/consul/docs/discovery/services#service-definition-parameter-case) for additional information. +Upstreams support multiple destination types. The following examples include information about each implementation. Note that the examples in this topic use snake case, which is a convention that separates words with underscores, because the format is supported in configuration files and API registrations. @@ -300,10 +299,7 @@ The proxy will default to `direct` mode if a mode cannot be determined from the The following examples show additional configuration for transparent proxies. -Added in v1.10.0. - --> Note that `snake_case` is used here as it works in both [config file and API -registrations](/consul/docs/discovery/services#service-definition-parameter-case). +Note that the examples in this topic use snake case, which is a convention that separates words with underscores, because the format is supported in configuration files and API registrations. #### Configure a proxy listener for outbound traffic on port 22500 @@ -328,8 +324,7 @@ registrations](/consul/docs/discovery/services#service-definition-parameter-case The following examples show all possible mesh gateway configurations. --> Note that `snake_case` is used here as it works in both [config file and API -registrations](/consul/docs/discovery/services#service-definition-parameter-case). + Note that the examples in this topic use snake case, which is a convention that separates words with underscores, because the format is supported in configuration files and API registrations. #### Using a Local/Egress Gateway in the Local Datacenter @@ -385,9 +380,8 @@ The following examples show possible configurations to expose HTTP paths through Exposing paths through Envoy enables a service to protect itself by only listening on localhost, while still allowing non-Connect-enabled applications to contact an HTTP endpoint. Some examples include: exposing a `/metrics` path for Prometheus or `/healthz` for kubelet liveness checks. - --> Note that `snake_case` is used here as it works in both [config file and API -registrations](/consul/docs/discovery/services#service-definition-parameter-case). + +Note that the examples in this topic use snake case, which is a convention that separates words with underscores, because the format is supported in configuration files and API registrations. #### Expose listeners in Envoy for HTTP and GRPC checks registered with the local Consul agent diff --git a/website/content/docs/connect/registration/sidecar-service.mdx b/website/content/docs/connect/registration/sidecar-service.mdx index adf5ef20f03..cfda3b22ab7 100644 --- a/website/content/docs/connect/registration/sidecar-service.mdx +++ b/website/content/docs/connect/registration/sidecar-service.mdx @@ -7,20 +7,16 @@ description: >- # Register a Service Mesh Proxy in a Service Registration -Connect proxies are typically deployed as "sidecars" that run on the same node -as the single service instance that they handle traffic for. They might be on -the same VM or running as a separate container in the same network namespace. +This topic describes how to declare a proxy as a _sidecar_ proxy. +Sidecar proxies run on the same node as the single service instance that they handle traffic for. +They may be on the same VM or running as a separate container in the same network namespace. -To simplify the configuration experience when deploying a sidecar for a service -instance, Consul 1.3 introduced a new field in the Connect block of the [service -definition](/consul/docs/discovery/services). +## Configuration -The `connect.sidecar_service` field is a complete nested service definition on -which almost any regular service definition field can be set. The exceptions are -[noted below](#limitations). If used, the service definition is treated -identically to another top-level service definition. The value of the nested -definition is that _all fields are optional_ with some opinionated defaults -applied that make setting up a sidecar proxy much simpler. +Add the `connect.sidecar_service` block to your service definition file and specify the parameters to configure sidecar proxy behavior. The `sidecar_service` block is a service definition that can contain most regular service definition fields. Refer to [Limitations](#limitations) for information about unsupported service definition fields for sidecar proxies. + +Consul treats sidecar proxy service definitions as a root-level service definition. All fields are optional in nested +definitions, which default to opinionated settings that are intended to reduce burden of setting up a sidecar proxy. ## Minimal Example @@ -134,7 +130,7 @@ proxy. - `kind` - Defaults to `connect-proxy`. This can't be overridden currently. - `check`, `checks` - By default we add a TCP check on the local address and port for the proxy, and a [service alias - check](/consul/docs/discovery/checks#alias) for the parent service. If either + check](/consul/docs/services/usage/checks#alias-checks) for the parent service. If either `check` or `checks` fields are set, only the provided checks are registered. - `proxy.destination_service_name` - Defaults to the parent service name. - `proxy.destination_service_id` - Defaults to the parent service ID. @@ -143,8 +139,7 @@ proxy. ## Limitations -Almost all fields in a [service definition](/consul/docs/discovery/services) may be -set on the `connect.sidecar_service` except for the following: +The following fields are not supported in the `connect.sidecar_service` block: - `id` - Sidecar services get an ID assigned and it is an error to override this. This ensures the agent can correctly deregister the sidecar service @@ -153,9 +148,6 @@ set on the `connect.sidecar_service` except for the following: unset this to make the registration be for a regular non-connect-proxy service. - `connect.sidecar_service` - Service definitions can't be nested recursively. -- `connect.proxy` - (Deprecated) [Managed - proxies](/consul/docs/connect/proxies/managed-deprecated) can't be defined on a - sidecar. - `connect.native` - Currently the `kind` is fixed to `connect-proxy` and it's an error to register a `connect-proxy` that is also Connect-native. diff --git a/website/content/docs/consul-vs-other/dns-tools-compare.mdx b/website/content/docs/consul-vs-other/dns-tools-compare.mdx index 6aab1440668..f4d27de8ab4 100644 --- a/website/content/docs/consul-vs-other/dns-tools-compare.mdx +++ b/website/content/docs/consul-vs-other/dns-tools-compare.mdx @@ -12,5 +12,5 @@ description: >- Consul was originally designed as a centralized service registry for any cloud environment that dynamically tracks services as they are added, changed, or removed within a compute infrastructure. Consul maintains a catalog of these registered services and their attributes, such as IP addresses or service name. For more information, refer to [What is Service Discovery?](/consul/docs/concepts/service-discovery). -As a result, Consul can also provide basic DNS functionality, including [lookups, alternate domains, and access controls](/consul/docs/discovery/dns). Since Consul is platform agnostic, you can retrieve service information across both cloud and on-premises data centers. Consul does not natively support some advanced DNS capabilities, such as filters or advanced routing logic. However, you can integrate Consul with existing DNS solutions, such as [NS1](https://help.ns1.com/hc/en-us/articles/360039417093-NS1-Consul-Integration-Overview) and [DNSimple](https://blog.dnsimple.com/2022/05/consul-integration/), to support these advanced capabilities. +As a result, Consul can also provide basic DNS functionality, including [lookups, alternate domains, and access controls](/consul/docs/services/discovery/dns-overview). Since Consul is platform agnostic, you can retrieve service information across both cloud and on-premises data centers. Consul does not natively support some advanced DNS capabilities, such as filters or advanced routing logic. However, you can integrate Consul with existing DNS solutions, such as [NS1](https://help.ns1.com/hc/en-us/articles/360039417093-NS1-Consul-Integration-Overview) and [DNSimple](https://blog.dnsimple.com/2022/05/consul-integration/), to support these advanced capabilities. diff --git a/website/content/docs/discovery/checks.mdx b/website/content/docs/discovery/checks.mdx deleted file mode 100644 index 0c2945602a2..00000000000 --- a/website/content/docs/discovery/checks.mdx +++ /dev/null @@ -1,885 +0,0 @@ ---- -layout: docs -page_title: Configure Health Checks -description: >- - Agents can be configured to periodically perform custom checks on the health of a service instance or node. Learn about the types of health checks and how to define them in agent and service configuration files. ---- - -# Health Checks - -One of the primary roles of the agent is management of system-level and application-level health -checks. A health check is considered to be application-level if it is associated with a -service. If not associated with a service, the check monitors the health of the entire node. - -Review the [health checks tutorial](/consul/tutorials/developer-discovery/service-registration-health-checks) -to get a more complete example on how to leverage health check capabilities in Consul. - -A check is defined in a configuration file or added at runtime over the HTTP interface. Checks -created via the HTTP interface persist with that node. - -There are several types of checks: - -- [`Script + Interval`](#script-check) - These checks invoke an external application - that performs the health check. - -- [`HTTP + Interval`](#http-check) - These checks make an HTTP `GET` request to the specified URL - in the health check definition. - -- [`TCP + Interval`](#tcp-check) - These checks attempt a TCP connection to the specified - address and port in the health check definition. - -- [`UDP + Interval`](#udp-check) - These checks direct the client to periodically send UDP datagrams - to the specified address and port in the health check definition. - -- [`OSService + Interval`](#osservice-check) - These checks periodically direct the Consul agent to monitor - the health of a service running on the host operating system. - -- [`Time to Live (TTL)`](#time-to-live-ttl-check) - These checks attempt an HTTP connection after a given TTL elapses. - -- [`Docker + Interval`](#docker-check) - These checks invoke an external application that - is packaged within a Docker container. - -- [`gRPC + Interval`](#grpc-check) - These checks are intended for applications that support the standard - [gRPC health checking protocol](https://github.com/grpc/grpc/blob/master/doc/health-checking.md). - -- [`H2ping + Interval`](#h2ping-check) - These checks test an endpoint that uses HTTP/2 - by connecting to the endpoint and sending a ping frame. - -- [`Alias`](#alias-check) - These checks alias the health state of another registered - node or service. - - -## Registering a health check - -There are three ways to register a service with health checks: - -1. Start or reload a Consul agent with a service definition file in the - [agent's configuration directory](/consul/docs/agent#configuring-consul-agents). -1. Call the - [`/agent/service/register`](/consul/api-docs/agent/service#register-service) - HTTP API endpoint to register the service. -1. Use the - [`consul services register`](/consul/commands/services/register) - CLI command to register the service. - -When a service is registered using the HTTP API endpoint or CLI command, -the checks persist in the Consul data folder across Consul agent restarts. - -## Types of checks - -This section describes the available types of health checks you can use to -automatically monitor the health of a service instance or node. - --> **To manually mark a service unhealthy:** Use the maintenance mode - [CLI command](/consul/commands/maint) or - [HTTP API endpoint](/consul/api-docs/agent#enable-maintenance-mode) - to temporarily remove one or all service instances on a node - from service discovery DNS and HTTP API query results. - -### Script check - -Script checks periodically invoke an external application that performs the health check, -exits with an appropriate exit code, and potentially generates some output. -The specified `interval` determines the time between check invocations. -The output of a script check is limited to 4KB. -Larger outputs are truncated. - -By default, script checks are configured with a timeout equal to 30 seconds. -To configure a custom script check timeout value, -specify the `timeout` field in the check definition. -After reaching the timeout on a Windows system, -Consul waits for any child processes spawned by the script to finish. -After reaching the timeout on other systems, -Consul attempts to force-kill the script and any child processes it spawned. - -Script checks are not enabled by default. -To enable a Consul agent to perform script checks, -use one of the following agent configuration options: - -- [`enable_local_script_checks`](/consul/docs/agent/config/cli-flags#_enable_local_script_checks): - Enable script checks defined in local config files. - Script checks registered using the HTTP API are not allowed. -- [`enable_script_checks`](/consul/docs/agent/config/cli-flags#_enable_script_checks): - Enable script checks no matter how they are registered. - - ~> **Security Warning:** - Enabling non-local script checks in some configurations may introduce - a remote execution vulnerability known to be targeted by malware. - We strongly recommend `enable_local_script_checks` instead. - For more information, refer to - [this blog post](https://www.hashicorp.com/blog/protecting-consul-from-rce-risk-in-specific-configurations). - -The following service definition file snippet is an example -of a script check definition: - - - -```hcl -check = { - id = "mem-util" - name = "Memory utilization" - args = ["/usr/local/bin/check_mem.py", "-limit", "256MB"] - interval = "10s" - timeout = "1s" -} -``` - -```json -{ - "check": { - "id": "mem-util", - "name": "Memory utilization", - "args": ["/usr/local/bin/check_mem.py", "-limit", "256MB"], - "interval": "10s", - "timeout": "1s" - } -} -``` - - - -#### Check script conventions - -A check script's exit code is used to determine the health check status: - -- Exit code 0 - Check is passing -- Exit code 1 - Check is warning -- Any other code - Check is failing - -Any output of the script is captured and made available in the -`Output` field of checks included in HTTP API responses, -as in this example from the [local service health endpoint](/consul/api-docs/agent/service#by-name-json). - -### HTTP check - -HTTP checks periodically make an HTTP `GET` request to the specified URL, -waiting the specified `interval` amount of time between requests. -The status of the service depends on the HTTP response code: any `2xx` code is -considered passing, a `429 Too ManyRequests` is a warning, and anything else is -a failure. This type of check -should be preferred over a script that uses `curl` or another external process -to check a simple HTTP operation. By default, HTTP checks are `GET` requests -unless the `method` field specifies a different method. Additional request -headers can be set through the `header` field which is a map of lists of -strings, such as `{"x-foo": ["bar", "baz"]}`. - -By default, HTTP checks are configured with a request timeout equal to 10 seconds. -To configure a custom HTTP check timeout value, -specify the `timeout` field in the check definition. -The output of an HTTP check is limited to approximately 4KB. -Larger outputs are truncated. -HTTP checks also support TLS. By default, a valid TLS certificate is expected. -Certificate verification can be turned off by setting the `tls_skip_verify` -field to `true` in the check definition. When using TLS, the SNI is implicitly -determined from the URL if it uses a hostname instead of an IP address. -You can explicitly set the SNI value by setting `tls_server_name`. - -Consul follows HTTP redirects by default. -To disable redirects, set the `disable_redirects` field to `true`. - -The following service definition file snippet is an example -of an HTTP check definition: - - - -```hcl -check = { - id = "api" - name = "HTTP API on port 5000" - http = "https://localhost:5000/health" - tls_server_name = "" - tls_skip_verify = false - method = "POST" - header = { - Content-Type = ["application/json"] - } - body = "{\"method\":\"health\"}" - disable_redirects = true - interval = "10s" - timeout = "1s" -} -``` - -```json -{ - "check": { - "id": "api", - "name": "HTTP API on port 5000", - "http": "https://localhost:5000/health", - "tls_server_name": "", - "tls_skip_verify": false, - "method": "POST", - "header": { "Content-Type": ["application/json"] }, - "body": "{\"method\":\"health\"}", - "interval": "10s", - "timeout": "1s" - } -} -``` - - - -### TCP check - -TCP checks periodically make a TCP connection attempt to the specified IP/hostname and port, waiting `interval` amount of time between attempts. -If no hostname is specified, it defaults to "localhost". -The health check status is `success` if the target host accepts the connection attempt, -otherwise the status is `critical`. In the case of a hostname that -resolves to both IPv4 and IPv6 addresses, an attempt is made to both -addresses, and the first successful connection attempt results in a -successful check. This type of check should be preferred over a script that -uses `netcat` or another external process to check a simple socket operation. - -By default, TCP checks are configured with a request timeout equal to 10 seconds. -To configure a custom TCP check timeout value, -specify the `timeout` field in the check definition. - -The following service definition file snippet is an example -of a TCP check definition: - - - -```hcl -check = { - id = "ssh" - name = "SSH TCP on port 22" - tcp = "localhost:22" - interval = "10s" - timeout = "1s" -} -``` - -```json -{ - "check": { - "id": "ssh", - "name": "SSH TCP on port 22", - "tcp": "localhost:22", - "interval": "10s", - "timeout": "1s" - } -} -``` - - - -### UDP check - -UDP checks periodically direct the Consul agent to send UDP datagrams -to the specified IP/hostname and port, -waiting `interval` amount of time between attempts. -The check status is set to `success` if any response is received from the targeted UDP server. -Any other result sets the status to `critical`. - -By default, UDP checks are configured with a request timeout equal to 10 seconds. -To configure a custom UDP check timeout value, -specify the `timeout` field in the check definition. -If any timeout on read exists, the check is still considered healthy. - -The following service definition file snippet is an example -of a UDP check definition: - - - -```hcl -check = { - id = "dns" - name = "DNS UDP on port 53" - udp = "localhost:53" - interval = "10s" - timeout = "1s" -} -``` - -```json -{ - "check": { - "id": "dns", - "name": "DNS UDP on port 53", - "udp": "localhost:53", - "interval": "10s", - "timeout": "1s" - } -} -``` - - - -### OSService check - -OSService checks periodically direct the Consul agent to monitor the health of a service running on -the host operating system as either a Windows service (Windows) or a SystemD service (Unix). -The check is logged as `healthy` if the service is running. -If it is stopped or not running, the status is `critical`. All other results set -the status to `warning`, which indicates that the check is not reliable because -an issue is preventing the check from determining the health of the service. - -The following service definition file snippet is an example -of an OSService check definition: - - - -```hcl -check = { - id = "myco-svctype-svcname-001" - name = "svcname-001 Windows Service Health" - service_id = "flash_pnl_1" - os_service = "myco-svctype-svcname-001" - interval = "10s" -} -``` - -```json -{ - "check": { - "id": "myco-svctype-svcname-001", - "name": "svcname-001 Windows Service Health", - "service_id": "flash_pnl_1", - "os_service": "myco-svctype-svcname-001", - "interval": "10s" - } -} -``` - - - -### Time to live (TTL) check - -TTL checks retain their last known state for the specified `ttl` duration. -The state of the check updates periodically over the HTTP interface. -If the `ttl` duration elapses before a new check update -is provided over the HTTP interface, -the check is set to `critical` state. - -This mechanism relies on the application to directly report its health. -For example, a healthy app can periodically `PUT` a status update to the HTTP endpoint. -Then, if the app is disrupted and unable to perform this update -before the TTL expires, the health check enters the `critical` state. -The endpoints used to update health information for a given check are: [pass](/consul/api-docs/agent/check#ttl-check-pass), -[warn](/consul/api-docs/agent/check#ttl-check-warn), [fail](/consul/api-docs/agent/check#ttl-check-fail), -and [update](/consul/api-docs/agent/check#ttl-check-update). TTL checks also persist their -last known status to disk. This persistence allows the Consul agent to restore the last known -status of the check across agent restarts. Persisted check status is valid through the -end of the TTL from the time of the last check. - -To manually mark a service unhealthy, -it is far more convenient to use the maintenance mode -[CLI command](/consul/commands/maint) or -[HTTP API endpoint](/consul/api-docs/agent#enable-maintenance-mode) -rather than a TTL health check with arbitrarily high `ttl`. - -The following service definition file snippet is an example -of a TTL check definition: - - - -```hcl -check = { - id = "web-app" - name = "Web App Status" - notes = "Web app does a curl internally every 10 seconds" - ttl = "30s" -} -``` - -```json -{ - "check": { - "id": "web-app", - "name": "Web App Status", - "notes": "Web app does a curl internally every 10 seconds", - "ttl": "30s" - } -} -``` - - - -### Docker check - -These checks depend on periodically invoking an external application that -is packaged within a Docker Container. The application is triggered within the running -container through the Docker Exec API. We expect that the Consul agent user has access -to either the Docker HTTP API or the unix socket. Consul uses `$DOCKER_HOST` to -determine the Docker API endpoint. The application is expected to run, perform a health -check of the service running inside the container, and exit with an appropriate exit code. -The check should be paired with an invocation interval. The shell on which the check -has to be performed is configurable, making it possible to run containers which -have different shells on the same host. -The output of a Docker check is limited to 4KB. -Larger outputs are truncated. - -Docker checks are not enabled by default. -To enable a Consul agent to perform Docker checks, -use one of the following agent configuration options: - -- [`enable_local_script_checks`](/consul/docs/agent/config/cli-flags#_enable_local_script_checks): - Enable script checks defined in local config files. - Script checks registered using the HTTP API are not allowed. - -- [`enable_script_checks`](/consul/docs/agent/config/cli-flags#_enable_script_checks): - Enable script checks no matter how they are registered. - - !> **Security Warning:** - We recommend using `enable_local_script_checks` instead of `enable_script_checks` in production - environments, as remote script checks are more vulnerable to malware attacks. Learn more about how [script checks can be exploited](https://www.hashicorp.com/blog/protecting-consul-from-rce-risk-in-specific-configurations#how-script-checks-can-be-exploited). - -The following service definition file snippet is an example -of a Docker check definition: - - - -```hcl -check = { - id = "mem-util" - name = "Memory utilization" - docker_container_id = "f972c95ebf0e" - shell = "/bin/bash" - args = ["/usr/local/bin/check_mem.py"] - interval = "10s" -} -``` - -```json -{ - "check": { - "id": "mem-util", - "name": "Memory utilization", - "docker_container_id": "f972c95ebf0e", - "shell": "/bin/bash", - "args": ["/usr/local/bin/check_mem.py"], - "interval": "10s" - } -} -``` - - - -### gRPC check - -gRPC checks are intended for applications that support the standard -[gRPC health checking protocol](https://github.com/grpc/grpc/blob/master/doc/health-checking.md). -The state of the check will be updated by periodically probing the configured endpoint, -waiting `interval` amount of time between attempts. - -By default, gRPC checks are configured with a timeout equal to 10 seconds. -To configure a custom Docker check timeout value, -specify the `timeout` field in the check definition. - -gRPC checks default to not using TLS. -To enable TLS, set `grpc_use_tls` in the check definition. -If TLS is enabled, then by default, a valid TLS certificate is expected. -Certificate verification can be turned off by setting the -`tls_skip_verify` field to `true` in the check definition. -To check on a specific service instead of the whole gRPC server, -add the service identifier after the `gRPC` check's endpoint. - -The following example shows a gRPC check for a whole application: - - - -```hcl -check = { - id = "mem-util" - name = "Service health status" - grpc = "127.0.0.1:12345" - grpc_use_tls = true - interval = "10s" -} -``` - -```json -{ - "check": { - "id": "mem-util", - "name": "Service health status", - "grpc": "127.0.0.1:12345", - "grpc_use_tls": true, - "interval": "10s" - } -} -``` - - - -The following example shows a gRPC check for the specific `my_service` service: - - - -```hcl -check = { - id = "mem-util" - name = "Service health status" - grpc = "127.0.0.1:12345/my_service" - grpc_use_tls = true - interval = "10s" -} -``` - -```json -{ - "check": { - "id": "mem-util", - "name": "Service health status", - "grpc": "127.0.0.1:12345/my_service", - "grpc_use_tls": true, - "interval": "10s" - } -} -``` - - - -### H2ping check - -H2ping checks test an endpoint that uses http2 by connecting to the endpoint -and sending a ping frame, waiting `interval` amount of time between attempts. -If the ping is successful within a specified timeout, -then the check status is set to `success`. - -By default, h2ping checks are configured with a request timeout equal to 10 seconds. -To configure a custom h2ping check timeout value, -specify the `timeout` field in the check definition. - -TLS is enabled by default. -To disable TLS and use h2c, set `h2ping_use_tls` to `false`. -If TLS is not disabled, a valid certificate is required unless `tls_skip_verify` is set to `true`. - -The following service definition file snippet is an example -of an h2ping check definition: - - - -```hcl -check = { - id = "h2ping-check" - name = "h2ping" - h2ping = "localhost:22222" - interval = "10s" - h2ping_use_tls = false -} -``` - -```json -{ - "check": { - "id": "h2ping-check", - "name": "h2ping", - "h2ping": "localhost:22222", - "interval": "10s", - "h2ping_use_tls": false - } -} -``` - - - -### Alias check - -These checks alias the health state of another registered -node or service. The state of the check updates asynchronously, but is -nearly instant. For aliased services on the same agent, the local state is monitored -and no additional network resources are consumed. For other services and nodes, -the check maintains a blocking query over the agent's connection with a current -server and allows stale requests. If there are any errors in watching the aliased -node or service, the check state is set to `critical`. -For the blocking query, the check uses the ACL token set on the service or check definition. -If no ACL token is set in the service or check definition, -the blocking query uses the agent's default ACL token -([`acl.tokens.default`](/consul/docs/agent/config/config-files#acl_tokens_default)). - -~> **Configuration info**: The alias check configuration expects the alias to be -registered on the same agent as the one you are aliasing. If the service is -not registered with the same agent, `"alias_node": ""` must also be -specified. When using `alias_node`, if no service is specified, the check will -alias the health of the node. If a service is specified, the check will alias -the specified service on this particular node. - -The following service definition file snippet is an example -of an alias check for a local service: - - - -```hcl -check = { - id = "web-alias" - alias_service = "web" -} -``` - -```json -{ - "check": { - "id": "web-alias", - "alias_service": "web" - } -} -``` - - - -## Check definition - -This section covers some of the most common options for check definitions. -For a complete list of all check options, refer to the -[Register Check HTTP API endpoint documentation](/consul/api-docs/agent/check#json-request-body-schema). - --> **Casing for check options:** - The correct casing for an option depends on whether the check is defined in - a service definition file or an HTTP API JSON request body. - For example, the option `deregister_critical_service_after` in a service - definition file is instead named `DeregisterCriticalServiceAfter` in an - HTTP API JSON request body. - -#### General options - -- `name` `(string: )` - Specifies the name of the check. - -- `id` `(string: "")` - Specifies a unique ID for this check on this node. - - If unspecified, Consul defines the check id by: - - If the check definition is embedded within a service definition file, - a unique check id is auto-generated. - - Otherwise, the `id` is set to the value of `name`. - If names might conflict, you must provide unique IDs to avoid - overwriting existing checks with the same id on this node. - -- `interval` `(string: )` - Specifies - the frequency at which to run this check. - Required for all check types except TTL and alias checks. - - The value is parsed by Go's `time` package, and has the following - [formatting specification](https://golang.org/pkg/time/#ParseDuration): - - > A duration string is a possibly signed sequence of decimal numbers, each with - > optional fraction and a unit suffix, such as "300ms", "-1.5h" or "2h45m". - > Valid time units are "ns", "us" (or "µs"), "ms", "s", "m", "h". - -- `service_id` `(string: )` - Specifies - the ID of a service instance to associate this check with. - That service instance must be on this node. - If not specified, this check is treated as a node-level check. - For more information, refer to the - [service-bound checks](#service-bound-checks) section. - -- `status` `(string: "")` - Specifies the initial status of the health check as - "critical" (default), "warning", or "passing". For more details, refer to - the [initial health check status](#initial-health-check-status) section. - - -> **Health defaults to critical:** If health status it not initially specified, - it defaults to "critical" to protect against including a service - in discovery results before it is ready. - -- `deregister_critical_service_after` `(string: "")` - If specified, - the associated service and all its checks are deregistered - after this check is in the critical state for more than the specified value. - The value has the same formatting specification as the [`interval`](#interval) field. - - The minimum timeout is 1 minute, - and the process that reaps critical services runs every 30 seconds, - so it may take slightly longer than the configured timeout to trigger the deregistration. - This field should generally be configured with a timeout that's significantly longer than - any expected recoverable outage for the given service. - -- `notes` `(string: "")` - Provides a human-readable description of the check. - This field is opaque to Consul and can be used however is useful to the user. - For example, it could be used to describe the current state of the check. - -- `token` `(string: "")` - Specifies an ACL token used for any interaction - with the catalog for the check, including - [anti-entropy syncs](/consul/docs/architecture/anti-entropy) and deregistration. - - For alias checks, this token is used if a remote blocking query is necessary to watch the state of the aliased node or service. - -#### Success/failures before passing/warning/critical - -To prevent flapping health checks and limit the load they cause on the cluster, -a health check may be configured to become passing/warning/critical only after a -specified number of consecutive checks return as passing/critical. -The status does not transition states until the configured threshold is reached. - -- `success_before_passing` - Number of consecutive successful results required - before check status transitions to passing. Defaults to `0`. Added in Consul 1.7.0. - -- `failures_before_warning` - Number of consecutive unsuccessful results required - before check status transitions to warning. Defaults to the same value as that of - `failures_before_critical` to maintain the expected behavior of not changing the - status of service checks to `warning` before `critical` unless configured to do so. - Values higher than `failures_before_critical` are invalid. Added in Consul 1.11.0. - -- `failures_before_critical` - Number of consecutive unsuccessful results required - before check status transitions to critical. Defaults to `0`. Added in Consul 1.7.0. - -This feature is available for all check types except TTL and alias checks. -By default, both passing and critical thresholds are set to 0 so the check -status always reflects the last check result. - - - -```hcl -checks = [ - { - name = "HTTP TCP on port 80" - tcp = "localhost:80" - interval = "10s" - timeout = "1s" - success_before_passing = 3 - failures_before_warning = 1 - failures_before_critical = 3 - } -] -``` - -```json -{ - "checks": [ - { - "name": "HTTP TCP on port 80", - "tcp": "localhost:80", - "interval": "10s", - "timeout": "1s", - "success_before_passing": 3, - "failures_before_warning": 1, - "failures_before_critical": 3 - } - ] -} -``` - - - -## Initial health check status - -By default, when checks are registered against a Consul agent, the state is set -immediately to "critical". This is useful to prevent services from being -registered as "passing" and entering the service pool before they are confirmed -to be healthy. In certain cases, it may be desirable to specify the initial -state of a health check. This can be done by specifying the `status` field in a -health check definition, like so: - - - -```hcl -check = { - id = "mem" - args = ["/bin/check_mem", "-limit", "256MB"] - interval = "10s" - status = "passing" -} -``` - -```json -{ - "check": { - "id": "mem", - "args": ["/bin/check_mem", "-limit", "256MB"], - "interval": "10s", - "status": "passing" - } -} -``` - - - -The above service definition would cause the new "mem" check to be -registered with its initial state set to "passing". - -## Service-bound checks - -Health checks may optionally be bound to a specific service. This ensures -that the status of the health check will only affect the health status of the -given service instead of the entire node. Service-bound health checks may be -provided by adding a `service_id` field to a check configuration: - - - -```hcl -check = { - id = "web-app" - name = "Web App Status" - service_id = "web-app" - ttl = "30s" -} -``` - -```json -{ - "check": { - "id": "web-app", - "name": "Web App Status", - "service_id": "web-app", - "ttl": "30s" - } -} -``` - - - -In the above configuration, if the web-app health check begins failing, it will -only affect the availability of the web-app service. All other services -provided by the node will remain unchanged. - -## Agent certificates for TLS checks - -The [enable_agent_tls_for_checks](/consul/docs/agent/config/config-files#enable_agent_tls_for_checks) -agent configuration option can be utilized to have HTTP or gRPC health checks -to use the agent's credentials when configured for TLS. - -## Multiple check definitions - -Multiple check definitions can be defined using the `checks` (plural) -key in your configuration file. - - - -```hcl -checks = [ - { - id = "chk1" - name = "mem" - args = ["/bin/check_mem", "-limit", "256MB"] - interval = "5s" - }, - { - id = "chk2" - name = "/health" - http = "http://localhost:5000/health" - interval = "15s" - }, - { - id = "chk3" - name = "cpu" - args = ["/bin/check_cpu"] - interval = "10s" - }, - ... -] -``` - -```json -{ - "checks": [ - { - "id": "chk1", - "name": "mem", - "args": ["/bin/check_mem", "-limit", "256MB"], - "interval": "5s" - }, - { - "id": "chk2", - "name": "/health", - "http": "http://localhost:5000/health", - "interval": "15s" - }, - { - "id": "chk3", - "name": "cpu", - "args": ["/bin/check_cpu"], - "interval": "10s" - }, - ... - ] -} -``` - - diff --git a/website/content/docs/discovery/dns.mdx b/website/content/docs/discovery/dns.mdx deleted file mode 100644 index 90038ae2955..00000000000 --- a/website/content/docs/discovery/dns.mdx +++ /dev/null @@ -1,594 +0,0 @@ ---- -layout: docs -page_title: Find services with DNS -description: >- - For service discovery use cases, Domain Name Service (DNS) is the main interface to look up, query, and address Consul nodes and services. Learn how a Consul DNS lookup can help you find services by tag, name, namespace, partition, datacenter, or domain. ---- - -# Query services with DNS - -One of the primary query interfaces for Consul is DNS. -The DNS interface allows applications to make use of service -discovery without any high-touch integration with Consul. - -For example, instead of making HTTP API requests to Consul, -a host can use the DNS server directly via name lookups -like `redis.service.us-east-1.consul`. This query automatically -translates to a lookup of nodes that provide the `redis` service, -are located in the `us-east-1` datacenter, and have no failing health checks. -It's that simple! - -There are a number of configuration options that are important for the DNS interface, -specifically [`client_addr`](/consul/docs/agent/config/config-files#client_addr),[`ports.dns`](/consul/docs/agent/config/config-files#dns_port), -[`recursors`](/consul/docs/agent/config/config-files#recursors),[`domain`](/consul/docs/agent/config/config-files#domain), -[`alt_domain`](/consul/docs/agent/config/config-files#alt_domain), and [`dns_config`](/consul/docs/agent/config/config-files#dns_config). -By default, Consul will listen on 127.0.0.1:8600 for DNS queries in the `consul.` -domain, without support for further DNS recursion. Please consult the -[documentation on configuration options](/consul/docs/agent/config), -specifically the configuration items linked above, for more details. - -There are a few ways to use the DNS interface. One option is to use a custom -DNS resolver library and point it at Consul. Another option is to set Consul -as the DNS server for a node and provide a -[`recursors`](/consul/docs/agent/config/config-files#recursors) configuration so that non-Consul queries -can also be resolved. The last method is to forward all queries for the "consul." -domain to a Consul agent from the existing DNS server. Review the -[DNS Forwarding tutorial](/consul/tutorials/networking/dns-forwarding?utm_source=docs) for examples. - -You can experiment with Consul's DNS server on the command line using tools such as `dig`: - -```shell-session -$ dig @127.0.0.1 -p 8600 redis.service.dc1.consul. ANY -``` - --> **Note:** In DNS, all queries are case-insensitive. A lookup of `PostgreSQL.node.dc1.consul` will find all nodes named `postgresql`. - -## Node Lookups - -To resolve names, Consul relies on a very specific format for queries. -There are fundamentally two types of queries: node lookups and service lookups. -A node lookup, a simple query for the address of a named node, looks like this: - -```text -.node[.]. -``` - -For example, if we have a `foo` node with default settings, we could -look for `foo.node.dc1.consul.` The datacenter is an optional part of -the FQDN: if not provided, it defaults to the datacenter of the agent. -If we know `foo` is running in the same datacenter as our local agent, -we can instead use `foo.node.consul.` This convention allows for terse -syntax where appropriate while supporting queries of nodes in remote -datacenters as necessary. - -For a node lookup, the only records returned are A and AAAA records -containing the IP address, and TXT records containing the -`node_meta` values of the node. - -```shell-session -$ dig @127.0.0.1 -p 8600 foo.node.consul ANY - -; <<>> DiG 9.8.3-P1 <<>> @127.0.0.1 -p 8600 foo.node.consul ANY -; (1 server found) -;; global options: +cmd -;; Got answer: -;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 24355 -;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 0 -;; WARNING: recursion requested but not available - -;; QUESTION SECTION: -;foo.node.consul. IN ANY - -;; ANSWER SECTION: -foo.node.consul. 0 IN A 10.1.10.12 -foo.node.consul. 0 IN TXT "meta_key=meta_value" -foo.node.consul. 0 IN TXT "value only" - - -;; AUTHORITY SECTION: -consul. 0 IN SOA ns.consul. postmaster.consul. 1392836399 3600 600 86400 0 -``` - -By default the TXT records value will match the node's metadata key-value -pairs according to [RFC1464](https://www.ietf.org/rfc/rfc1464.txt). -Alternatively, the TXT record will only include the node's metadata value when the -node's metadata key starts with `rfc1035-`. - - -### Node Lookups for Consul Enterprise - -Consul nodes exist at the admin partition level within a datacenter. -By default, the partition and datacenter used in a [node lookup](#node-lookups) are -the partition and datacenter of the Consul agent that received the DNS query. - -Use the following query format to specify a partition for a node lookup: -```text -.node..ap..dc. -``` - -Consul server agents are in the `default` partition. -If DNS queries are addressed to Consul server agents, -node lookups to non-`default` partitions must explicitly specify -the partition of the target node. - -## Service Lookups - -A service lookup is used to query for service providers. Service queries support -two lookup methods: standard and strict [RFC 2782](https://tools.ietf.org/html/rfc2782). - -By default, SRV weights are all set at 1, but changing weights is supported using the -`Weights` attribute of the [service definition](/consul/docs/discovery/services). - -Note that DNS is limited in size per request, even when performing DNS TCP -queries. - -For services having many instances (more than 500), it might not be possible to -retrieve the complete list of instances for the service. - -When DNS SRV response are sent, order is randomized, but weights are not -taken into account. In the case of truncation different clients using weighted SRV -responses will have partial and inconsistent views of instances weights so the -request distribution could be skewed from the intended weights. In that case, -it is recommended to use the HTTP API to retrieve the list of nodes. - -### Standard Lookup - -The format of a standard service lookup is: - -```text -[.].service[.]. -``` - -The `tag` is optional, and, as with node lookups, the `datacenter` is as -well. If no tag is provided, no filtering is done on tag. If no -datacenter is provided, the datacenter of this Consul agent is assumed. - -If we want to find any redis service providers in our local datacenter, -we could query `redis.service.consul.` If we want to find the PostgreSQL -primary in a particular datacenter, we could query -`primary.postgresql.service.dc2.consul.` - -The DNS query system makes use of health check information to prevent routing -to unhealthy nodes. When a service query is made, any services failing their health -check or failing a node system check will be omitted from the results. To allow -for simple load balancing, the set of nodes returned is also randomized each time. -These mechanisms make it easy to use DNS along with application-level retries -as the foundation for an auto-healing service oriented architecture. - -For standard services queries, both A and SRV records are supported. SRV records -provide the port that a service is registered on, enabling clients to avoid relying -on well-known ports. SRV records are only served if the client specifically requests -them, like so: - -```shell-session -$ dig @127.0.0.1 -p 8600 consul.service.consul SRV - -; <<>> DiG 9.8.3-P1 <<>> @127.0.0.1 -p 8600 consul.service.consul ANY -; (1 server found) -;; global options: +cmd -;; Got answer: -;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 50483 -;; flags: qr aa rd; QUERY: 1, ANSWER: 3, AUTHORITY: 1, ADDITIONAL: 1 -;; WARNING: recursion requested but not available - -;; QUESTION SECTION: -;consul.service.consul. IN SRV - -;; ANSWER SECTION: -consul.service.consul. 0 IN SRV 1 1 8300 foobar.node.dc1.consul. - -;; ADDITIONAL SECTION: -foobar.node.dc1.consul. 0 IN A 10.1.10.12 -``` - -### RFC 2782 Lookup - -Valid formats for RFC 2782 SRV lookups depend on -whether you want to filter results based on a service tag: - -- No filtering on service tag: - - ```text - _._tcp[.service][.]. - ``` - -- Filtering on service tag specified in the RFC 2782 protocol field: - - ```text - _._[.service][.]. - ``` - -Per [RFC 2782](https://tools.ietf.org/html/rfc2782), SRV queries must -prepend an underscore (`_`) to the `service` and `protocol` values in a query to -prevent DNS collisions. -To perform no tag-based filtering, specify `tcp` in the RFC 2782 protocol field. -To filter results on a service tag, specify the tag in the RFC 2782 protocol field. - -Other than the query format and default `tcp` protocol/tag value, the behavior -of the RFC style lookup is the same as the standard style of lookup. - -If you registered the service `rabbitmq` on port 5672 and tagged it with `amqp`, -you could make an RFC 2782 query for its SRV record as `_rabbitmq._amqp.service.consul`: - -```shell-session -$ dig @127.0.0.1 -p 8600 _rabbitmq._amqp.service.consul SRV - -; <<>> DiG 9.8.3-P1 <<>> @127.0.0.1 -p 8600 _rabbitmq._amqp.service.consul ANY -; (1 server found) -;; global options: +cmd -;; Got answer: -;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 52838 -;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1 -;; WARNING: recursion requested but not available - -;; QUESTION SECTION: -;_rabbitmq._amqp.service.consul. IN SRV - -;; ANSWER SECTION: -_rabbitmq._amqp.service.consul. 0 IN SRV 1 1 5672 rabbitmq.node1.dc1.consul. - -;; ADDITIONAL SECTION: -rabbitmq.node1.dc1.consul. 0 IN A 10.1.11.20 -``` - -Again, note that the SRV record returns the port of the service as well as its IP. - -#### SRV response for hosts in the .addr subdomain - -If a service registered to Consul has an explicit IP [`address`](/consul/api-docs/agent/service#address) -or tagged address(es) defined on the service registration, the hostname returned -in the target field of the answer section for the DNS SRV query for the service -will be in the format of `.addr..consul`. - - - - - -In the example below, the `rabbitmq` service has been registered with an explicit -IPv4 address of `192.0.2.10`. - - - -```hcl -node_name = "node1" - -services { - name = "rabbitmq" - address = "192.0.2.10" - port = 5672 -} -``` - -```json -{ - "node_name": "node1", - "services": [ - { - "name": "rabbitmq", - "address": "192.0.2.10", - "port": 5672 - } - ] -} -``` - - - -When performing an SRV query for this service, the SRV response contains a single -record with a hostname in the format of `.addr..consul`. - -```shell-session -$ dig @127.0.0.1 -p 8600 -t srv _rabbitmq._tcp.service.consul +short -1 1 5672 c000020a.addr.dc1.consul. -``` - -In this example, the hex-encoded IP from the returned hostname is `c000020a`. -Converting each hex octet to decimal reveals the IP address that was specified -in the service registration. - -```shell-session -$ echo -n "c000020a" | perl -ne 'printf("%vd\n", pack("H*", $_))' -192.0.2.10 -``` - - - - - -In the example below, the `rabbitmq` service has been registered with an explicit -IPv6 address of `2001:db8:1:2:cafe::1337`. - - - -```hcl -node_name = "node1" - -services { - name = "rabbitmq" - address = "2001:db8:1:2:cafe::1337" - port = 5672 -} -``` - -```json -{ - "node_name": "node1", - "services": [ - { - "name": "rabbitmq", - "address": "2001:db8:1:2:cafe::1337", - "port": 5672 - } - ] -} -``` - - - -When performing an SRV query for this service, the SRV response contains a single -record with a hostname in the format of `.addr..consul`. - -```shell-session -$ dig @127.0.0.1 -p 8600 -t srv _rabbitmq._tcp.service.consul +short -1 1 5672 20010db800010002cafe000000001337.addr.dc1.consul. -``` - -In this example, the hex-encoded IP from the returned hostname is -`20010db800010002cafe000000001337`. This is the fully expanded IPv6 address with -colon separators removed. - -The following command re-adds the colon separators to display the fully expanded -IPv6 address that was specified in the service registration. - -```shell-session -$ echo -n "20010db800010002cafe000000001337" | perl -ne 'printf join(":", unpack("(A4)*", $_))."\n"' -2001:0db8:0001:0002:cafe:0000:0000:1337 -``` - - - - - -### Service Lookups for Consul Enterprise - -By default, all service lookups use the `default` namespace -within the partition and datacenter of the Consul agent that received the DNS query. -To lookup services in another namespace, partition, and/or datacenter, -use the [canonical format](#canonical-format). - -Consul server agents are in the `default` partition. -If DNS queries are addressed to Consul server agents, -service lookups to non-`default` partitions must explicitly specify -the partition of the target service. - -To lookup services imported from a cluster peer, -refer to [service virtual IP lookups for Consul Enterprise](#service-virtual-ip-lookups-for-consul-enterprise) instead. - -#### Canonical format - -Use the following query format to specify namespace, partition, and/or datacenter -for `.service`, `.connect`, `.virtual`, and `.ingress` service lookup types. -All three fields (`namespace`, `partition`, `datacenter`) are optional. -```text -[.].service[..ns][..ap][..dc] -``` - -#### Alternative formats for specifying namespace - -Though the [canonical format](#canonical-format) is recommended for readability, -you can use the following query formats specify namespace but not partition: - -- Specify both namespace and datacenter: - - ```text - [.].service... - ``` - -- **Deprecated in Consul 1.11:** - Specify namespace without a datacenter, - which requires that DNS queries are addressed to a Consul agent with - [`dns_config.prefer_namespace`](/consul/docs/agent/config/config-files#dns_prefer_namespace) - set to `true`: - - ```text - [.].service.. - ``` - -### Prepared Query Lookups - -The following formats are valid for prepared query lookups: - -- Standard lookup - - ```text - .query[.]. - ``` - -- [RFC 2782](https://tools.ietf.org/html/rfc2782) SRV lookup - - ```text - _._tcp.query[.]. - ``` - -The `datacenter` is optional, and if not provided, the datacenter of this Consul -agent is assumed. - -The `query name or id` is the given name or ID of an existing -[Prepared Query](/consul/api-docs/query). These behave like standard service -queries but provide a much richer set of features, such as filtering by multiple -tags and automatically failing over to look for services in remote datacenters if -no healthy nodes are available in the local datacenter. Consul 0.6.4 and later also -added support for [prepared query templates](/consul/api-docs/query#prepared-query-templates) -which can match names using a prefix match, allowing one template to apply to -potentially many services. - -To allow for simple load balancing, the set of nodes returned is randomized each time. -Both A and SRV records are supported. SRV records provide the port that a service is -registered on, enabling clients to avoid relying on well-known ports. SRV records are -only served if the client specifically requests them. - -### Connect-Capable Service Lookups - -To find Connect-capable services: - -```text -.connect. -``` - -This will find all [Connect-capable](/consul/docs/connect) -endpoints for the given `service`. A Connect-capable endpoint may be -both a proxy for a service or a natively integrated Connect application. -The DNS interface does not differentiate the two. - -Most services will use a [proxy](/consul/docs/connect/proxies) that handles -service discovery automatically and therefore won't use this DNS format. -This DNS format is primarily useful for [Connect-native](/consul/docs/connect/native) -applications. - -This endpoint currently only finds services within the same datacenter -and doesn't support tags. This DNS interface will be expanded over time. -If you need more complex behavior, please use the -[catalog API](/consul/api-docs/catalog). - -### Service Virtual IP Lookups - -To find the unique virtual IP allocated for a service: - -```text -.virtual[.]. -``` - -This will return the unique virtual IP for any [Connect-capable](/consul/docs/connect) -service. Each Connect service has a virtual IP assigned to it by Consul - this is used -by sidecar proxies for the [Transparent Proxy](/consul/docs/connect/transparent-proxy) feature. -The peer name is an optional part of the FQDN, and it is used to query for the virtual IP -of a service imported from that peer. - -The virtual IP is also added to the service's [Tagged Addresses](/consul/docs/discovery/services#tagged-addresses) -under the `consul-virtual` tag. - -#### Service Virtual IP Lookups for Consul Enterprise - -By default, a service virtual IP lookup uses the `default` namespace -within the partition and datacenter of the Consul agent that received the DNS query. - -To lookup services imported from a cluster peered partition or open-source datacenter, -specify the namespace and peer name in the lookup: -```text -.virtual[.].. -``` - -To lookup services not imported from a cluster peer, -refer to [service lookups for Consul Enterprise](#service-lookups-for-consul-enterprise) instead. - -### Ingress Service Lookups - -To find ingress-enabled services: - -```text -.ingress. -``` - -This will find all [ingress gateway](/consul/docs/connect/gateways/ingress-gateway) -endpoints for the given `service`. - -This endpoint currently only finds services within the same datacenter -and doesn't support tags. This DNS interface will be expanded over time. -If you need more complex behavior, please use the -[catalog API](/consul/api-docs/catalog). - -### UDP Based DNS Queries - -When the DNS query is performed using UDP, Consul will truncate the results -without setting the truncate bit. This is to prevent a redundant lookup over -TCP that generates additional load. If the lookup is done over TCP, the results -are not truncated. - -## Alternative Domain - -By default, Consul responds to DNS queries in the `consul` domain, -but you can set a specific domain for responding to DNS queries by configuring the [`domain`](/consul/docs/agent/config/config-files#domain) parameter. - -In some instances, Consul may need to respond to queries in more than one domain, -such as during a DNS migration or to distinguish between internal and external queries. - -Consul versions 1.5.2+ can be configured to respond to DNS queries on an alternative domain -through the [`alt_domain`](/consul/docs/agent/config/config-files#alt_domain) agent configuration -option. As of Consul versions 1.11.0+, Consul's DNS response will use the same domain as was used in the query; -in prior versions, the response may use the primary [`domain`](/consul/docs/agent/config/config-files#domain) no matter which -domain was used in the query. - -In the following example, the `alt_domain` parameter is set to `test-domain`: - -```hcl - alt_domain = "test-domain" -``` - -```shell-session -$ dig @127.0.0.1 -p 8600 consul.service.test-domain SRV -``` - -The following responses are returned: - -``` -;; QUESTION SECTION: -;consul.service.test-domain. IN SRV - -;; ANSWER SECTION: -consul.service.test-domain. 0 IN SRV 1 1 8300 machine.node.dc1.test-domain. - -;; ADDITIONAL SECTION: -machine.node.dc1.test-domain. 0 IN A 127.0.0.1 -machine.node.dc1.test-domain. 0 IN TXT "consul-network-segment=" -``` - --> **PTR queries:** Responses to PTR queries (`.in-addr.arpa.`) will always use the -[primary domain](/consul/docs/agent/config/config-files#domain) (not the alternative domain), -as there is no way for the query to specify a domain. - -## Caching - -By default, all DNS results served by Consul set a 0 TTL value. This disables -caching of DNS results. However, there are many situations in which caching is -desirable for performance and scalability. This is discussed more in the tutorial -for [DNS caching](/consul/tutorials/networking/dns-caching). - -## WAN Address Translation - -By default, Consul DNS queries will return a node's local address, even when -being queried from a remote datacenter. If you need to use a different address -to reach a node from outside its datacenter, you can configure this behavior -using the [`advertise-wan`](/consul/docs/agent/config/cli-flags#_advertise-wan) and -[`translate_wan_addrs`](/consul/docs/agent/config/config-files#translate_wan_addrs) configuration -options. - -## DNS with ACLs - -In order to use the DNS interface when -[Access Control Lists (ACLs)](/consul/docs/security/acl) -are enabled, you must first create ACL tokens with the necessary policies. - -Consul agents resolve DNS requests using one of the preconfigured tokens below, -listed in order of precedence: - -1. The agent's [`default` token](/consul/docs/agent/config/config-files#acl_tokens_default). -2. The built-in [`anonymous` token](/consul/docs/security/acl/acl-tokens#built-in-tokens). - Because the anonymous token is used when any request is made to Consul without - explicitly specifying a token, production deployments should not apply policies - needed for DNS to this token. - -Consul will either accept or deny the request depending on whether the token -has the appropriate authorization. The following table describes the available -DNS lookups and required policies when ACLs are enabled: - -| Lookup | Type | Description | ACLs Required | -| ------------------------------------------------------------------------------ | -------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `*.node.consul` | [Node](#node-lookups) | Allow resolving DNS requests for the target node (i.e., `.node.consul`) | [`node:read`](/consul/docs/security/acl/acl-rules#node-rules) | -| `*.service.consul`, `*.connect.consul`, `*.ingress.consul`, `*.virtual.consul` | [Service: standard](#service-lookups) | Allow resolving DNS requests for target service (e.g., `.service.consul`) instances running on ACL-authorized nodes | [`service:read`](/consul/docs/security/acl/acl-rules#service-rules), [`node:read`](/consul/docs/security/acl/acl-rules#node-rules) | -| `*.query.consul` | [Service: prepared query](#prepared-query-lookups) | Allow resolving DNS requests for [service instances specified](/consul/api-docs/query#service-1) by the target prepared query (i.e., `.query.consul`) running on ACL-authorized nodes | [`query:read`](/consul/docs/security/acl/acl-rules#prepared-query-rules), [`service:read`](/consul/docs/security/acl/acl-rules#service-rules), [`node:read`](/consul/docs/security/acl/acl-rules#node-rules) | - -For guidance on how to configure an appropriate token for DNS, refer to the -securing Consul with ACLs guides for: - -- [Production Environments](/consul/tutorials/security/access-control-setup-production#token-for-dns) -- [Development Environments](/consul/tutorials/day-0/access-control-setup?utm_source=docs#enable-acls-on-consul-clients) diff --git a/website/content/docs/discovery/services.mdx b/website/content/docs/discovery/services.mdx deleted file mode 100644 index 9eba2e85bb5..00000000000 --- a/website/content/docs/discovery/services.mdx +++ /dev/null @@ -1,701 +0,0 @@ ---- -layout: docs -page_title: Register Services with Service Definitions -description: >- - Define and register services and their health checks with Consul to make a service available for service discovery or service mesh access. Learn how to format service definitions with this reference page and sample code. ---- - -# Register Services with Service Definitions - -One of the main goals of service discovery is to provide a catalog of available -services. To that end, the agent provides a simple service definition format -to declare the availability of a service and to potentially associate it with -a health check. A health check associated with a service is considered to be an -application-level check. Define services in a configuration file or add it at -runtime using the HTTP interface. - -Complete the [Getting Started tutorials](/consul/tutorials/get-started-vms/virtual-machine-gs-service-discovery) to get hands-on experience registering a simple service with a health check on your local machine. - -## Service Definition - -Configure a service by providing the service definition to the agent. You can -either specify the configuration file using the `-config-file` option, or specify -the directory containing the service definition file with the `-config-dir` option. -Consul can load service definitions saved as `.json` or `.hcl` files. - -Send a `SIGHUP` to the running agent or use [`consul reload`](/consul/commands/reload) to check for new service definitions or to -update existing services. Alternatively, the service can be [registered dynamically](/consul/api-docs/agent/service#register-service) -using the [HTTP API](/consul/api-docs). - -A service definition contains a set of parameters that specify various aspects of the service, including how it is discovered by other services in the network. -All possible parameters are included in the following example, but only the top-level `service` parameter and its `name` parameter child are required by default. - - - -```hcl -service { - name = "redis" - id = "redis" - port = 80 - tags = ["primary"] - - meta = { - custom_meta_key = "custom_meta_value" - } - - tagged_addresses = { - lan = { - address = "192.168.0.55" - port = 8000 - } - - wan = { - address = "198.18.0.23" - port = 80 - } - } - - port = 8000 - socket_path = "/tmp/redis.sock" - enable_tag_override = false - - checks = [ - { - args = ["/usr/local/bin/check_redis.py"] - interval = "10s" - } - ] - - kind = "connect-proxy" - proxy_destination = "redis" - - proxy = { - destination_service_name = "redis" - destination_service_id = "redis1" - local_service_address = "127.0.0.1" - local_service_port = 9090 - local_service_socket_path = "/tmp/redis.sock" - mode = "transparent" - - transparent_proxy { - outbound_listener_port = 22500 - } - - mesh_gateway = { - mode = "local" - } - - expose = { - checks = true - - paths = [ - { - path = "/healthz" - local_path_port = 8080 - listener_port = 21500 - protocol = "http2" - } - ] - } - } - - connect = { - native = false - } - - weights = { - passing = 5 - warning = 1 - } - - token = "233b604b-b92e-48c8-a253-5f11514e4b50" - namespace = "foo" -} -``` - -```json -{ - "service": { - "id": "redis", - "name": "redis", - "tags": ["primary"], - "address": "", - "meta": { - "meta": "for my service" - }, - "tagged_addresses": { - "lan": { - "address": "192.168.0.55", - "port": 8000, - }, - "wan": { - "address": "198.18.0.23", - "port": 80 - } - }, - "port": 8000, - "socket_path": "/tmp/redis.sock", - "enable_tag_override": false, - "checks": [ - { - "args": ["/usr/local/bin/check_redis.py"], - "interval": "10s" - } - ], - "kind": "connect-proxy", - "proxy_destination": "redis", // Deprecated - "proxy": { - "destination_service_name": "redis", - "destination_service_id": "redis1", - "local_service_address": "127.0.0.1", - "local_service_port": 9090, - "local_service_socket_path": "/tmp/redis.sock", - "mode": "transparent", - "transparent_proxy": { - "outbound_listener_port": 22500 - }, - "config": {}, - "upstreams": [], - "mesh_gateway": { - "mode": "local" - }, - "expose": { - "checks": true, - "paths": [ - { - "path": "/healthz", - "local_path_port": 8080, - "listener_port": 21500, - "protocol": "http2" - } - ] - } - }, - "connect": { - "native": false, - "sidecar_service": {} - "proxy": { // Deprecated - "command": [], - "config": {} - } - }, - "weights": { - "passing": 5, - "warning": 1 - }, - "token": "233b604b-b92e-48c8-a253-5f11514e4b50", - "namespace": "foo" - } -} -``` - - - -The following table describes the available parameters for service definitions. - -### `service` - -This is the root-level parameter that defines the service. You can specify the parameters to configure the service. - -| Parameter | Description | Default | Required | -| --------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------- | ---------------------------- | -| `id` | String value that specifies the service ID.

    If not specified, the value of the `name` field will be used.

    Services must have unique IDs per node, so you should specify unique values if the default `name` will conflict with other services.

    | Value of the `name` parameter | Optional | -| `name` | Specifies the name of the service.
    The value for this parameter is used as the ID if the `id` parameter is not specified.
    We recommend using valid DNS labels for service definition names for compatibility with external DNSs. | None | Required | -| `tags` | List of string values that can be used to add service-level labels.
    For example, you can define tags that distinguish between `primary` and `secondary` nodes or service versions.
    We recommend using valid DNS labels for service definition IDs for compatibility with external DNSs.
    Tag values are opaque to Consul.
    | None | Optional | -| `address` | String value that specifies a service-specific IP address or hostname.
    If no value is specified, the IP address of the agent node is used by default.
    There is no service-side validation of this parameter. | IP address of the agent node | Optional | -| `meta` | Object that defines a map of the max 64 key/value pairs.
    The meta object has the same limitations as the node meta object in the node definition.
    Meta data can be retrieved per individual instance of the service. All instances of a given service have their own copy of the meta data.
    See [Adding Meta Data](#adding-meta-data) for supported parameters.
    | None | Optional | -| `tagged_addresses` | Tagged addresses are additional addresses that may be defined for a node or service. See [Tagged Addresses](#tagged-addresses) for details. | None | Optional | -| `port` | Integer value that specifies a service-specific port number. The port number should be specified when the `address` parameter is defined to improve service discoverability. | Optional | -| `socket_path` | String value that specifies the path to the service socket.
    Specify this parameter to expose the service to the mesh if the service listens on a Unix Domain socket. | None | Optional | -| `enable_tag_override` | Boolean value that determines if the anti-entropy feature for the service is enabled.
    If set to `true`, then external agents can update this service in the catalog and modify the tags.
    Subsequent local sync operations by this agent will ignore the updated tags.
    This parameter only applies to the locally-registered service. If multiple nodes register the same service, the `enable_tag_override` configuration, and all other service configuration items, operate independently.
    Updating the tags for services registered on one node is independent from the same service (by name) registered on another node.
    See [anti-entropy syncs](/consul/docs/architecture/anti-entropy) for additional information.
    | False | Optional | -| `checks` | Array of objects that define health checks for the service. See [Health Checks](#health-checks) for details. | None | Optional | -| `kind` | String value that identifies the service as a Connect proxy. See [Connect](#connect) for details. | None | Optional | -| `proxy_destination` | String value that specifies the _name_ of the destination service that the service currently being configured proxies to.
    This parameter is deprecated. Use `proxy.destination_service` instead.
    See [Connect](#connect) for additional information. | None | Optional | -| `proxy` | Object that defines the destination services that the service currently being configured proxies to. See [Proxy](#proxy) for additional information. | None | Optional | -| `connect` | Object that configures a Consul Connect service mesh connection. See [Connect](#connect) for details. | None | Optional | -| `weights` | Object that configures the weight of the service in terms of its DNS service (SRV) response. See [DNS SRV Weights](#dns-srv-weights) for details. | None | Optional | -| `token` | String value specifying the ACL token to be used to register the service (if the ACL system is enabled). The token is required for the service to interact with the service catalog. See [Security Configurations](#security-configurations) for details. | None | Required if ACLs are enabled | -| `namespace` | String value specifying the Consul Namespace where the service should be registered. See [Security Configurations](#security-configurations) for details. | None | Optional | - -### Adding Meta Data - -You can add semantic meta data to the service using the `meta` parameter. This parameter defines a map of max 64 key/value pairs. You can specify the following parameters to define meta data for the service. - -| Parameter | Description | Default | Required | -| --------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------- | -------- | -| `KEY` | String value that adds semantic metadata to the service.
    Keys can only have ASCII characters (`A` - `Z`, `a` - `z`, `0` - `9`, `_`, and `-`).
    Keys can not have special characters.
    Keys are limited to 128 characters.
    Values are limited to 512 characters. | None | Optional | - -### Security Configurations - -If the ACL system is enabled, specify a value for the `token` parameter to provide an ACL token. This token is -used for any interaction with the catalog for the service, including [anti-entropy syncs](/consul/docs/architecture/anti-entropy) and deregistration. - -Services registered in Consul clusters where both [Consul Namespaces](/consul/docs/enterprise/namespaces) -and the ACL system are enabled can be registered to specific namespaces that are associated with -ACL tokens scoped to the namespace. Services registered with a service definition -will not inherit the namespace associated with the ACL token specified in the `token` -field. The `namespace` _and_ the `token` parameters must be included in the service definition for the service to be registered to the -namespace that the ACL token is scoped to. - -### Health Checks - -You can add health checks to your service definition. Health checks perform several safety functions, such as allowing a web balancer to gracefully remove failing nodes and allowing a database -to replace a failed secondary. The health check functionality is strongly integrated into the DNS interface, as well. If a service is failing its health check or a node has any failing system-level check, the DNS interface will omit that -node from any service query. - -The health check name is automatically generated as `service:`. If there are multiple service checks -registered, the ID will be generated as `service::` where -`` is an incrementing number starting from `1`. - -Consul includes several check types with different options. Refer to the [health checks documentation](/consul/docs/discovery/checks) for details. - -### Proxy - -Service definitions allow for an optional proxy registration. Proxies used with Connect -are registered as services in Consul's catalog. -See the [Proxy Service Registration](/consul/docs/connect/registration/service-registration) reference -for the available configuration options. - -### Connect - -The `kind` parameter determines the service's role. Services can be configured to perform several roles, but you must omit the `kind` parameter for typical non-proxy instances. - -The following roles are supported for service entries: - -- `connect-proxy`: Defines the configuration for a connect proxy -- `ingress-gateway`: Defines the configuration for an [ingress gateway](/consul/docs/connect/config-entries/ingress-gateway) -- `mesh-gateway`: Defines the configuration for a [mesh gateway](/consul/docs/connect/gateways/mesh-gateway) -- `terminating-gateway`: Defines the configuration for a [terminating gateway](/consul/docs/connect/config-entries/terminating-gateway#terminating-gateway) - -In the service definition example described above, the service is registered as a proxy because the `kind` property is set to `connect-proxy`. -The `proxy` parameter is also required for Connect proxy registrations and is only valid if `kind` is `connect-proxy`. -Refer to the [Proxy Service Registration](/consul/docs/connect/registration/service-registration) documentation for details about this type. - -When the `kind` parameter is set to `connect-proxy`, the only required parameter for the `proxy` configuration is `destination_service_name`. -Refer to the [complete proxy configuration example](/consul/docs/connect/registration/service-registration#complete-configuration-example) for additional information. - -The `connect` field can be specified to configure [Connect](/consul/docs/connect) for a service. This field is available in Consul 1.2.0 and later. The following parameters are available. - -| Parameter | Description | Default | Required | -| ----------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------- | -------- | -| `native` | Boolean value that advertises the service as [Connect-native](/consul/docs/connect/native).
    If set to `true`, do not configure a `sidecar_service`. | `false` | Optional | -| `sidecar_service` | Object that defines a nested service definition.
    Do not configure if `native` is set to `true`. | See [Sidecar Service Registration](/consul/docs/connect/registration/sidecar-service) for default configurations. | Optional | - --> **Non-service registration roles**: The `kind` values supported for configuration entries are different than what is supported for service registrations. Refer to the [Configuration Entries](/consul/docs/connect/config-entries) documentation for information about non-service registration types. - -#### Deprecated parameters - -Different Consul Connect parameters are supported for different Consul versions. The following table describes changes applicable to service discovery. - -| Parameter | Description | Consul version | Status | -| ------------------- | ---------------------------------------------------------------------------------------------------- | ---------------------------- | --------------------------------------------------------------------------- | -| `proxy_destination` | Specified the proxy destination **in the root level** of the definition file. | 1.2.0 to 1.3.0 | Deprecated since 1.5.0.
    Use `proxy.destination_service_name` instead. | -| `connect.proxy` | Specified "managed" proxies, [which have been deprecated](/consul/docs/connect/proxies/managed-deprecated). | 1.2.0 (beta) to 1.3.0 (beta) | Deprecated. | - -### DNS SRV Weights - -You can configure how the service responds to DNS SRV requests by specifying a set of states/weights in the `weights` field. - -#### `weights` - -When DNS SRV requests are made, the response will include the weights specified for the given state of the service. -This allows some instances to be given higher weight if they have more capacity. It also allows load reduction on -services with checks in `warning` status by giving passing instances a higher weight. - -| Parameter | Description | Default | Required | -| --------- | --------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------- | -------- | -| `STATE` | Integer value indicating its weight. A higher number indicates more weight. | If not specified, the following weights are used:
    `"passing" : 1`
    `"warning" : 1` | Optional | - -If a service is `critical`, it is excluded from DNS responses. -Services with warning checks are included in responses by default, but excluded if the optional param `only_passing = true` -is present in the agent DNS configuration or the `passing` query parameter is used via the API. - -### Enable Tag Override and Anti-Entropy - -Services may also contain a `token` field to provide an ACL token. This token is -used for any interaction with the catalog for the service, including -[anti-entropy syncs](/consul/docs/architecture/anti-entropy) and deregistration. - -You can optionally disable the anti-entropy feature for this service using the -`enable_tag_override` flag. External agents can modify tags on services in the -catalog, so subsequent sync operations can either maintain tag modifications or -revert them. If `enable_tag_override` is set to `TRUE`, the next sync cycle may -revert some service properties, **but** the tags would maintain the updated value. -If `enable_tag_override` is set to `FALSE`, the next sync cycle will revert any -updated service properties, **including** tags, to their original value. - -It's important to note that this applies only to the locally registered -service. If you have multiple nodes all registering the same service -their `enable_tag_override` configuration and all other service -configuration items are independent of one another. Updating the tags -for the service registered on one node is independent of the same -service (by name) registered on another node. If `enable_tag_override` is -not specified the default value is false. See [anti-entropy -syncs](/consul/docs/architecture/anti-entropy) for more info. - -For Consul 0.9.3 and earlier you need to use `enableTagOverride`. Consul 1.0 -supports both `enable_tag_override` and `enableTagOverride` but the latter is -deprecated and has been removed as of Consul 1.1. - -### Tagged Addresses - -Tagged addresses are additional addresses that may be defined for a node or -service. Tagged addresses can be used by remote agents and services as alternative -addresses for communicating with the given node or service. Multiple tagged -addresses may be configured on a node or service. - -The following example describes the syntax for defining a tagged address. - - - -```hcl -service { - name = "redis" - port = 80 - tagged_addresses { - = { - address = "
    " - port = port - } - } -} -``` - -```json -{ - "service": { - "name": "redis", - "port": 80, - "tagged_addresses": { - "": { - "address": "
    ", - "port": port - } - } - } -} -``` - - - -The following table provides an overview of the various tagged address types supported by Consul. - -| Type | Description | Tags | -| ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | --------------------------------------- | -| LAN | LAN addresses are intended to be directly accessible only from services within the same Consul data center. See [LAN tags](#lan-tags) for details. | `lan`
    `lan_ipv4`
    `lan_ipv6` | -| Virtual | Virtual tagged addresses are logical address types that can be configured on [Connect](/consul/docs/connect)-enabled services. The virtual address provides a fixed IP address that can be used by downstream services when connecting to an upstream service. See [Virtual tags](#virtual-tags) for details. | `virtual` | -| WAN | Define a WAN address for the service or node when it should be accessed at an alternate address by services in a remote datacenter. See [WAN tags](#wan-tags) for details. | `wan`
    `wan_ipv4`
    `wan_ipv6` | - -#### LAN tags - -- `lan` - The IPv4 LAN address at which the node or service is accessible. -- `lan_ipv4` - The IPv4 LAN address at which the node or service is accessible. -- `lan_ipv6` - The IPv6 LAN address at which the node or service is accessible. - - - - - -```hcl -service { - name = "redis" - address = "192.0.2.10" - port = 80 - tagged_addresses { - lan = { - address = "192.0.2.10" - port = 80 - } - lan_ipv4 = { - address = "192.0.2.10" - port = 80 - } - lan_ipv6 = { - address = "2001:db8:1:2:cafe::1337" - port = 80 - } - } -} -``` - - - - - -```json -{ - "service": { - "name": "redis", - "address": "192.0.2.10", - "port": 80, - "tagged_addresses": { - "lan": { - "address": "192.0.2.10", - "port": 80 - }, - "lan_ipv4": { - "address": "192.0.2.10", - "port": 80 - }, - "lan_ipv6": { - "address": "2001:db8:1:2:cafe::1337", - "port": 80 - } - } - } -} -``` - - - - -#### Virtual tags - -Connections to virtual addresses are load balanced across available instances of a service, provided the following conditions are satisfied: - -1. [Transparent proxy](/consul/docs/connect/transparent-proxy) is enabled for the - downstream and upstream services. -1. The upstream service is not configured for individual instances to be - [dialed directly](/consul/docs/connect/config-entries/service-defaults#dialeddirectly). - -Virtual addresses are not required to be routable IPs within the -network. They are strictly a control plane construct used to provide a fixed -address for the instances of a given logical service. Egress connections from -the proxy to an upstream service will be destined to the IP address of an -individual service instance, not the virtual address of the logical service. - -Use the following address tag to specify the logical address at which the -service can be reached by other services in the mesh. - -- `virtual` - The virtual IP address at which a logical service is reachable. - - - - - -```hcl -service { - name = "redis" - address = "192.0.2.10" - port = 80 - tagged_addresses { - virtual = { - address = "203.0.113.50" - port = 80 - } - } -} -``` - - - - - -```json -{ - "service": { - "name": "redis", - "address": "192.0.2.10", - "port": 80, - "tagged_addresses": { - "virtual": { - "address": "203.0.113.50", - "port": 80 - } - } - } -} -``` - - - - -#### WAN tags - -One or more of the following address tags can be configured for a node or service -to advertise how it should be accessed over the WAN. - -- `wan` - The IPv4 WAN address at which the node or service is accessible when - being dialed from a remote data center. -- `wan_ipv4` - The IPv4 WAN address at which the node or service is accessible - when being dialed from a remote data center. -- `wan_ipv6` - The IPv6 WAN address at which the node or service is accessible - when being dialed from a remote data center. - - - - - -```hcl -service { - name = "redis" - address = "192.0.2.10" - port = 80 - tagged_addresses { - wan = { - address = "198.51.100.200" - port = 80 - } - wan_ipv4 = { - address = "198.51.100.200" - port = 80 - } - wan_ipv6 = { - address = "2001:db8:5:6:1337::1eaf" - port = 80 - } - } -} -``` - - - - - -```json -{ - "service": { - "name": "redis", - "address": "192.0.2.10", - "port": 80, - "tagged_addresses": { - "wan": { - "address": "198.51.100.200", - "port": 80 - }, - "wan_ipv4": { - "address": "198.51.100.200", - "port": 80 - }, - "wan_ipv6": { - "address": "2001:db8:5:6:1337::1eaf", - "port": 80 - } - } - } -} -``` - - - - -## Multiple Service Definitions - -Multiple services definitions can be provided at once when registering services -via the agent configuration by using the plural `services` key (registering -multiple services in this manner is not supported using the HTTP API). - - - - - -```hcl -services { - id = "red0" - name = "redis" - tags = [ - "primary" - ] - address = "" - port = 6000 - checks = [ - { - args = ["/bin/check_redis", "-p", "6000"] - interval = "5s" - timeout = "20s" - } - ] -} -services { - id = "red1" - name = "redis" - tags = [ - "delayed", - "secondary" - ] - address = "" - port = 7000 - checks = [ - { - args = ["/bin/check_redis", "-p", "7000"] - interval = "30s" - timeout = "60s" - } - ] -} - -``` - - - - - -```json -{ - "services": [ - { - "id": "red0", - "name": "redis", - "tags": [ - "primary" - ], - "address": "", - "port": 6000, - "checks": [ - { - "args": ["/bin/check_redis", "-p", "6000"], - "interval": "5s", - "timeout": "20s" - } - ] - }, - { - "id": "red1", - "name": "redis", - "tags": [ - "delayed", - "secondary" - ], - "address": "", - "port": 7000, - "checks": [ - { - "args": ["/bin/check_redis", "-p", "7000"], - "interval": "30s", - "timeout": "60s" - } - ] - }, - ... - ] -} -``` - - - - -## Service and Tag Names with DNS - -Consul exposes service definitions and tags over the [DNS](/consul/docs/discovery/dns) -interface. DNS queries have a strict set of allowed characters and a -well-defined format that Consul cannot override. While it is possible to -register services or tags with names that don't match the conventions, those -services and tags will not be discoverable via the DNS interface. It is -recommended to always use DNS-compliant service and tag names. - -DNS-compliant service and tag names may contain any alpha-numeric characters, as -well as dashes. Dots are not supported because Consul internally uses them to -delimit service tags. - -## Service Definition Parameter Case - -For historical reasons Consul's API uses `CamelCased` parameter names in -responses, however its configuration file uses `snake_case` for both HCL and -JSON representations. For this reason the registration _HTTP APIs_ accept both -name styles for service definition parameters although APIs will return the -listings using `CamelCase`. - -Note though that **all config file formats require -`snake_case` fields**. We always document service definition examples using -`snake_case` and JSON since this format works in both config files and API -calls. diff --git a/website/content/docs/ecs/configuration-reference.mdx b/website/content/docs/ecs/configuration-reference.mdx index da0ee28f681..fed887bc835 100644 --- a/website/content/docs/ecs/configuration-reference.mdx +++ b/website/content/docs/ecs/configuration-reference.mdx @@ -185,7 +185,7 @@ Defines the Consul checks for the service. Each `check` object may contain the f | `method` | `string` | optional | Specifies the HTTP method to be used for an HTTP check. When no value is specified, `GET` is used. | | `name` | `string` | optional | The name of the check. | | `notes` | `string` | optional | Specifies arbitrary information for humans. This is not used by Consul internally. | -| `os_service` | `string` | optional | Specifies the name of a service on which to perform an [OS service check](/consul/docs/discovery/checks#osservice-check). The check runs according the frequency specified in the `interval` parameter. | +| `os_service` | `string` | optional | Specifies the name of a service on which to perform an [OS service check](/consul/docs/services/usage/checks#osservice-check). The check runs according the frequency specified in the `interval` parameter. | | `status` | `string` | optional | Specifies the initial status the health check. Must be one of `passing`, `warning`, `critical`, `maintenance`, or `null`. | | `successBeforePassing` | `integer` | optional | Specifies the number of consecutive successful results required before check status transitions to passing. | | `tcp` | `string` | optional | Specifies this is a TCP check. Must be an IP/hostname plus port to which a TCP connection is made every `interval`. | diff --git a/website/content/docs/ecs/manual/install.mdx b/website/content/docs/ecs/manual/install.mdx index e648c6cf3ea..dddb9b310e5 100644 --- a/website/content/docs/ecs/manual/install.mdx +++ b/website/content/docs/ecs/manual/install.mdx @@ -373,11 +373,11 @@ configuration to a shared volume. ### `CONSUL_ECS_CONFIG_JSON` -Configuration is passed to the `consul-ecs` binary in JSON format using the `CONSUL_ECS_CONFIG_JSON` environment variable. +Consul uses the `CONSUL_ECS_CONFIG_JSON` environment variable to passed configurations to the `consul-ecs` binary in JSON format. -The following is an example of the configuration that might be used for a service named `example-client-app` with one upstream -service name `example-server-app`. The `proxy` and `service` blocks include information used by `consul-ecs-mesh-init` to perform -[service registration](/consul/docs/discovery/services) with Consul during task startup. The same configuration format is used for +The following example configures a service named `example-client-app` with one upstream +service name `example-server-app`. The `proxy` and `service` blocks include information used by `consul-ecs-mesh-init` to register the service with Consul during task start up. +The same configuration format is used for the `consul-ecs-health-sync` container. ```json @@ -409,7 +409,7 @@ the `consul-ecs-health-sync` container. | `proxy.upstreams` | list | The upstream services that your application calls over the service mesh, if any. The `destinationName` and `localBindPort` fields are required. | | `service.name` | string | The name used to register this service into the Consul service catalog. | | `service.port` | integer | The port your application listens on. Set to `0` if your application does not listen on any port. | -| `service.checks` | list | Consul [checks](/consul/docs/discovery/checks) to include so that Consul can run health checks against your application. | +| `service.checks` | list | Consul [checks](/consul/docs/services/usage/checks) to include so that Consul can run health checks against your application. | See the [Configuration Reference](/consul/docs/ecs/configuration-reference) for a complete reference of fields. diff --git a/website/content/docs/enterprise/admin-partitions.mdx b/website/content/docs/enterprise/admin-partitions.mdx index e5fdea32cfa..e4a07104931 100644 --- a/website/content/docs/enterprise/admin-partitions.mdx +++ b/website/content/docs/enterprise/admin-partitions.mdx @@ -61,7 +61,7 @@ The partition in which [`proxy-defaults`](/consul/docs/connect/config-entries/pr ### Cross-partition Networking -You can configure services to be discoverable by downstream services in any partition within the datacenter. Specify the upstream services that you want to be available for discovery by configuring the `exported-services` configuration entry in the partition where the services are registered. Refer to the [`exported-services` documentation](/consul/docs/connect/config-entries/exported-services) for details. Additionally, the requests made by downstream applications must have the correct DNS name for the Virtual IP Service lookup to occur. Service Virtual IP lookups allow for communications across Admin Partitions when using Transparent Proxy. Refer to the [Service Virtual IP Lookups for Consul Enterprise](/consul/docs/discovery/dns#service-virtual-ip-lookups-for-consul-enterprise) for additional information. +You can configure services to be discoverable by downstream services in any partition within the datacenter. Specify the upstream services that you want to be available for discovery by configuring the `exported-services` configuration entry in the partition where the services are registered. Refer to the [`exported-services` documentation](/consul/docs/connect/config-entries/exported-services) for details. Additionally, the requests made by downstream applications must have the correct DNS name for the Virtual IP Service lookup to occur. Service Virtual IP lookups allow for communications across Admin Partitions when using Transparent Proxy. Refer to the [Service Virtual IP Lookups for Consul Enterprise](/consul/docs/services/discovery/dns-static-lookups#service-virtual-ip-lookups-for-consul-enterprise) for additional information. ### Cluster Peering diff --git a/website/content/docs/intro/index.mdx b/website/content/docs/intro/index.mdx index 50834137b4e..90a1759fe23 100644 --- a/website/content/docs/intro/index.mdx +++ b/website/content/docs/intro/index.mdx @@ -24,7 +24,7 @@ Consul interacts with the _data plane_ through proxies. The data plane is the pa The core Consul workflow consists of the following stages: -- **Register**: Teams add services to the Consul catalog, which is a central registry that lets services automatically discover each other without requiring a human operator to modify application code, deploy additional load balancers, or hardcode IP addresses. It is the runtime source of truth for all services and their addresses. Teams can manually [define and register services](/consul/docs/discovery/services) using the CLI or the API, or you can automate the process in Kubernetes with [service sync](/consul/docs/k8s/service-sync). Services can also include health checks so that Consul can monitor for unhealthy services. +- **Register**: Teams add services to the Consul catalog, which is a central registry that lets services automatically discover each other without requiring a human operator to modify application code, deploy additional load balancers, or hardcode IP addresses. It is the runtime source of truth for all services and their addresses. Teams can manually [define](/consul/docs/services/usage/define-services) and [register](/consul/docs/services/usage/register-services-checks) using the CLI or the API, or you can automate the process in Kubernetes with [service sync](/consul/docs/k8s/service-sync). Services can also include health checks so that Consul can monitor for unhealthy services. - **Query**: Consul’s identity-based DNS lets you find healthy services in the Consul catalog. Services registered with Consul provide health information, access points, and other data that help you control the flow of data through your network. Your services only access other services through their local proxy according to the identity-based policies you define. - **Secure**: After services locate upstreams, Consul ensures that service-to-service communication is authenticated, authorized, and encrypted. Consul service mesh secures microservice architectures with mTLS and can allow or restrict access based on service identities, regardless of differences in compute environments and runtimes. diff --git a/website/content/docs/k8s/connect/cluster-peering/usage/establish-peering.mdx b/website/content/docs/k8s/connect/cluster-peering/usage/establish-peering.mdx index 71e0d46638e..3c85706cc62 100644 --- a/website/content/docs/k8s/connect/cluster-peering/usage/establish-peering.mdx +++ b/website/content/docs/k8s/connect/cluster-peering/usage/establish-peering.mdx @@ -319,7 +319,7 @@ Before you can call services from peered clusters, you must set service intentio -1. Add the `"consul.hashicorp.com/connect-inject": "true"` annotation to your service's pods before deploying the workload so that the services in `cluster-01` can dial `backend` in `cluster-02`. To dial the upstream service from an application, configure the application so that that requests are sent to the correct DNS name as specified in [Service Virtual IP Lookups](/consul/docs/discovery/dns#service-virtual-ip-lookups). In the following example, the annotation that allows the workload to join the mesh and the configuration provided to the workload that enables the workload to dial the upstream service using the correct DNS name is highlighted. [Service Virtual IP Lookups for Consul Enterprise](/consul/docs/discovery/dns#service-virtual-ip-lookups-for-consul-enterprise) details how you would similarly format a DNS name including partitions and namespaces. +1. Add the `"consul.hashicorp.com/connect-inject": "true"` annotation to your service's pods before deploying the workload so that the services in `cluster-01` can dial `backend` in `cluster-02`. To dial the upstream service from an application, configure the application so that that requests are sent to the correct DNS name as specified in [Service Virtual IP Lookups](/consul/docs/services/discovery/dns-static-lookups#service-virtual-ip-lookups). In the following example, the annotation that allows the workload to join the mesh and the configuration provided to the workload that enables the workload to dial the upstream service using the correct DNS name is highlighted. [Service Virtual IP Lookups for Consul Enterprise](/consul/docs/services/discovery/dns-static-lookups#service-virtual-ip-lookups-for-consul-enterprise) details how you would similarly format a DNS name including partitions and namespaces. diff --git a/website/content/docs/k8s/dns.mdx b/website/content/docs/k8s/dns.mdx index 5082919bd1d..4262523a83d 100644 --- a/website/content/docs/k8s/dns.mdx +++ b/website/content/docs/k8s/dns.mdx @@ -8,7 +8,7 @@ description: >- # Resolve Consul DNS Requests in Kubernetes One of the primary query interfaces to Consul is the -[DNS interface](/consul/docs/discovery/dns). You can configure Consul DNS in +[DNS interface](/consul/docs/services/discovery/dns-overview). You can configure Consul DNS in Kubernetes using a [stub-domain configuration](https://kubernetes.io/docs/tasks/administer-cluster/dns-custom-nameservers/#configure-stub-domain-and-upstream-dns-servers) if using KubeDNS or a [proxy configuration](https://coredns.io/plugins/proxy/) if using CoreDNS. diff --git a/website/content/docs/k8s/service-sync.mdx b/website/content/docs/k8s/service-sync.mdx index 0cd6cb7c382..db3e2bc9d83 100644 --- a/website/content/docs/k8s/service-sync.mdx +++ b/website/content/docs/k8s/service-sync.mdx @@ -20,7 +20,7 @@ automatically installed and configured using the Consul catalog enable Kubernetes services to be accessed by any node that is part of the Consul cluster, including other distinct Kubernetes clusters. For non-Kubernetes nodes, they can access services using the standard -[Consul DNS](/consul/docs/discovery/dns) or HTTP API. +[Consul DNS](/consul/docs/services/discovery/dns-overview) or HTTP API. **Why sync Consul services to Kubernetes?** Syncing Consul services to Kubernetes services enables non-Kubernetes services to be accessed using kube-dns and Kubernetes-specific diff --git a/website/content/docs/nia/configuration.mdx b/website/content/docs/nia/configuration.mdx index 4d4e8113f8e..bd67ef5c07e 100644 --- a/website/content/docs/nia/configuration.mdx +++ b/website/content/docs/nia/configuration.mdx @@ -197,7 +197,7 @@ Service registration requires that the [Consul token](/consul/docs/nia/configura | `default_check.enabled` | Optional | boolean | Enables CTS to create the default health check. | `true` | | `default_check.address` | Optional | string | The address to use for the default HTTP health check. Needs to include the scheme (`http`/`https`) and the port, if applicable. | `http://localhost:` or `https://localhost:`. Determined from the [port configuration](/consul/docs/nia/configuration#port) and whether [TLS is enabled](/consul/docs/nia/configuration#enabled-2) on the CTS API. | -The default health check is an [HTTP check](/consul/docs/discovery/checks#http-interval) that calls the [Health API](/consul/docs/nia/api/health). The following table describes the values CTS sets for this default check, corresponding to the [Consul register check API](/consul/api-docs/agent/check#register-check). If an option is not listed in this table, then CTS is using the default value. +The default health check is an [HTTP check](/consul/docs/services/usage/checks#http-checks) that calls the [Health API](/consul/docs/nia/api/health). The following table describes the values CTS sets for this default check, corresponding to the [Consul register check API](/consul/api-docs/agent/check#register-check). If an option is not listed in this table, then CTS is using the default value. | Parameter | Value | | --------- | ----- | diff --git a/website/content/docs/release-notes/consul/v1_13_x.mdx b/website/content/docs/release-notes/consul/v1_13_x.mdx index 736e84f9db5..dd3f7cfe309 100644 --- a/website/content/docs/release-notes/consul/v1_13_x.mdx +++ b/website/content/docs/release-notes/consul/v1_13_x.mdx @@ -15,7 +15,7 @@ description: >- - **Enables TLS on the Envoy Prometheus endpoint**: The Envoy prometheus endpoint can be enabled when `envoy_prometheus_bind_addr` is set and then secured over TLS using new CLI flags for the `consul connect envoy` command. These commands are: `-prometheus-ca-file`, `-prometheus-ca-path`, `-prometheus-cert-file` and `-prometheus-key-file`. The CA, cert, and key can be provided to Envoy by a Kubernetes mounted volume so that Envoy can watch the files and dynamically reload the certs when the volume is updated. -- **UDP Health Checks**: Adds the ability to register service discovery health checks that periodically send UDP datagrams to the specified IP/hostname and port. Refer to [UDP checks](/consul/docs/discovery/checks#udp-interval). +- **UDP Health Checks**: Adds the ability to register service discovery health checks that periodically send UDP datagrams to the specified IP/hostname and port. Refer to [UDP checks](/consul/docs//services/usage/checks#udp-checks). ## What's Changed diff --git a/website/content/docs/security/acl/acl-rules.mdx b/website/content/docs/security/acl/acl-rules.mdx index e9cd5c8b128..3b63e327a20 100644 --- a/website/content/docs/security/acl/acl-rules.mdx +++ b/website/content/docs/security/acl/acl-rules.mdx @@ -586,8 +586,7 @@ These actions may required an ACL token to complete. Use the following methods t This allows a single token to be used during all check registration operations. * Provide an ACL token with `service` and `check` definitions at registration time. This allows for greater flexibility and enables the use of multiple tokens on the same agent. - Refer to the [services](/consul/docs/discovery/services) and [checks](/consul/docs/discovery/checks) documentation for examples. - Tokens may also be passed to the [HTTP API](/consul/api-docs) for operations that require them. + Refer to the [services](/consul/docs/services/usage/define-services) and [checks](/consul/docs/services/usage/checks) documentation for examples. You can also pass tokens to the [HTTP API](/consul/api-docs) for operations that require them. ### Reading Imported Nodes @@ -815,12 +814,12 @@ to use for registration events: 2. Providing an ACL token with service and check definitions at registration time. This allows for greater flexibility and enables the use of multiple tokens on the same agent. Examples of what this looks like are available for - both [services](/consul/docs/discovery/services) and - [checks](/consul/docs/discovery/checks). Tokens may also be passed to the [HTTP - API](/consul/api-docs) for operations that require them. **Note:** all tokens + both [services](/consul/docs/services/usage/define-services) and + [checks](/consul/docs/services/usage/checks). Tokens may also be passed to the [HTTP + API](/consul/api-docs) for operations that require them. Note that all tokens passed to an agent are persisted on local disk to allow recovery from - restarts. See [`-data-dir` flag - documentation](/consul/docs/agent/config/cli-flags#_data_dir) for notes on securing + restarts. Refer to [`-data-dir` flag + documentation](/consul/docs/agent/config/cli-flags#_data_dir) for information about securing access. In addition to ACLs, in Consul 0.9.0 and later, the agent must be configured with diff --git a/website/content/docs/security/acl/acl-tokens.mdx b/website/content/docs/security/acl/acl-tokens.mdx index da14d52d88a..068d8efa50e 100644 --- a/website/content/docs/security/acl/acl-tokens.mdx +++ b/website/content/docs/security/acl/acl-tokens.mdx @@ -66,7 +66,7 @@ service = { -Refer to the [service definitions documentation](/consul/docs/discovery/services#service-definition) for additional information. +Refer to [Services Configuration Reference](/consul/docs/services/configuration/services-configuration-reference) for additional information. ### Agent Requests diff --git a/website/content/docs/services/configuration/checks-configuration-reference.mdx b/website/content/docs/services/configuration/checks-configuration-reference.mdx new file mode 100644 index 00000000000..3159c977a20 --- /dev/null +++ b/website/content/docs/services/configuration/checks-configuration-reference.mdx @@ -0,0 +1,55 @@ +--- +layout: docs +page_title: Health Check Configuration Reference +description: -> + Use the health checks to direct safety functions, such as removing failing nodes and replacing secondary services. Learn how to configure health checks. +--- + +# Health Check Configuration Reference + +This topic provides configuration reference information for health checks. For information about the different kinds of health checks and guidance on defining them, refer to [Define Health Checks]. + +## Introduction +Health checks perform several safety functions, such as allowing a web balancer to gracefully remove failing nodes and allowing a database to replace a failed secondary. You can configure health checks to monitor the health of the entire node. Refer to [Define Health Checks](/consul/docs/services/usage/checks) for information about how to define the differnet types of health checks available in Consul. + +## Check block +Specify health check options in the `check` block. To register two or more heath checks in the same configuration, use the [`checks` block](#checks-block). The following table describes the configuration options contained in the `check` block. + +| Parameter | Description | Check types | +| --- | --- | --- | +| `name` | Required string value that specifies the name of the check. Default is `service:`. If multiple service checks are registered, the autogenerated default is appended with colon and incrementing number starting with `1`. |
  • Script
  • HTTP
  • TCP
  • UDP
  • OSService
  • TTL
  • Docker
  • gRPC
  • H2ping
  • Alias
  • | +| `id` | A unique string value that specifies an ID for the check. Default to the `name` value. If `name` values conflict, specify a unique ID to avoid overwriting existing checks with same ID on the same node. Consul auto-generates an ID if the check is defined in a service definition file. |
  • Script
  • HTTP
  • TCP
  • UDP
  • OSService
  • TTL
  • Docker
  • gRPC
  • H2ping
  • Alias
  • | +| `notes` | String value that provides a human-readabiole description of the check. The contents are not visible to Consul. |
  • Script
  • HTTP
  • TCP
  • UDP
  • OSService
  • TTL
  • Docker
  • gRPC
  • H2ping
  • Alias
  • | +| `interval` | Required string value that specifies how frequently to run the check. The `interval` parameter is required for supported check types. The value is parsed by the golang [time package formatting specification](https://golang.org/pkg/time/#ParseDuration). |
  • Script
  • HTTP
  • TCP
  • UDP
  • OSService
  • Docker
  • gRPC
  • H2ping
  • | +| `timeout` | String value that specifies how long unsuccessful requests take to end with a timeout. The `timeout` is optional for the supported check types and has the following defaults:
  • Script: `30s`
  • HTTP: `10s`
  • TCP: `10s`
  • UDP: `10s`
  • gRPC: `10s`
  • H2ping: `10s`
  • |
  • Script
  • HTTP
  • TCP
  • UDP
  • gRPC
  • H2ping
  • | +| `status` | Optional string value that specifies the initial status of the health check. You can specify the following values:
  • `critical` (default)
  • `warning`
  • `passing`
  • |
  • Script
  • HTTP
  • TCP
  • UDP
  • OSService
  • TTL
  • Docker
  • gRPC
  • H2ping
  • Alias
  • | +| `deregister_critical_service_after` | String value that specifies how long a service and its associated checks are allowed to be in a `critical` state. Consul deregisters services if they are `critical` for the specified amount of time. The value is parsed by the golang [time package formatting specification](https://golang.org/pkg/time/#ParseDuration) |
  • Script
  • HTTP
  • TCP
  • UDP
  • OSService
  • TTL
  • Docker
  • gRPC
  • H2ping
  • Alias
  • | +| `success_before_passing` | Integer value that specifies how many consecutive times the check must pass before Consul marks the service or node as `passing`. Default is `0`. |
  • Script
  • HTTP
  • TCP
  • UDP
  • OSService
  • TTL
  • Docker
  • gRPC
  • H2ping
  • Alias
  • | +| `failures_before_warning` | Integer value that specifies how many consecutive times the check must fail before Consul marks the service or node as `warning`. The value cannot be more than `failures_before_critical`. Defaults to the value specified for `failures_before_critical`. |
  • Script
  • HTTP
  • TCP
  • UDP
  • OSService
  • TTL
  • Docker
  • gRPC
  • H2ping
  • Alias
  • | +| `failures_before_critical` | Integer value that specifies how many consecutive times the check must fail before Consul marks the service or node as `critical`. Default is `0`. |
  • Script
  • HTTP
  • TCP
  • UDP
  • OSService
  • TTL
  • Docker
  • gRPC
  • H2ping
  • Alias
  • | +| `args` | Specifies a list of arguments strings to pass to the command line. The list of values includes the path to a script file or external application to invoke and any additional parameters for running the script or application. |
  • Script
  • Docker
  • | +| `docker_container_id` | Specifies the Docker container ID in which to run an external health check application. Specify the external application with the `args` parameter. |
  • Docker
  • | +| `shell` | String value that specifies the type of command line shell to use for running the health check application. Specify the external application with the `args` parameter. |
  • Docker
  • | +| `grpc` | String value that specifies the gRPC endpoint, including port number, to send requests to. Append the endpoint with `:/` and a service identifier to check a specific service. The endpoint must support the [gRPC health checking protocol](https://github.com/grpc/grpc/blob/master/doc/health-checking.md). |
  • gRPC
  • | +| `grpc_use_tls` | Boolean value that enables TLS for gRPC checks when set to `true`. |
  • gRPC
  • | +| `h2ping` | String value that specifies the HTTP2 endpoint, including port number, to send HTTP2 requests to. |
  • H2ping
  • | +| `h2ping_use_tls` | Boolean value that enables TLS for H2ping checks when set to `true`. |
  • H2ping
  • | +| `http` | String value that specifies an HTTP endpoint to send requests to. |
  • HTTP
  • | +| `tls_server_name` | String value that specifies the name of the TLS server that issues certificates. Defaults to the SNI determined by the address specified in the `http` field. Set the `tls_skip_verify` to `false` to disable this field. |
  • HTTP
  • | +| `tls_skip_verify` | Boolean value that disbles TLS for HTTP checks when set to `true`. Default is `false`. |
  • HTTP
  • | +| `method` | String value that specifies the request method to send during HTTP checks. Default is `GET`. |
  • HTTP
  • | +| `header` | Object that specifies header fields to send in HTTP check requests. Each header specified in `header` object contains a list of string values. |
  • HTTP
  • | +| `body` | String value that contains JSON attributes to send in HTTP check requests. You must escap the quotation marks around the keys and values for each attribute. |
  • HTTP
  • | +| `disable_redirects` | Boolean value that prevents HTTP checks from following redirects if set to `true`. Default is `false`. |
  • HTTP
  • | +| `os_service` | String value that specifies the name of the name of a service to check during an OSService check. |
  • OSService
  • | +| `service_id` | String value that specifies the ID of a service instance to associate with an OSService check. That service instance must be on the same node as the check. If not specified, the check verifies the health of the node. |
  • OSService
  • | +| `tcp` | String value that specifies an IP address or host and port number for the check establish a TCP connection with. |
  • TCP
  • | +| `udp` | String value that specifies an IP address or host and port number for the check to send UDP datagrams to. |
  • UDP
  • | +| `ttl` | String value that specifies how long to wait for an update from an external process during a TTL check. |
  • TTL
  • | +| `alias_service` | String value that specifies a service or node that the service associated with the health check aliases. |
  • Alias
  • | + + + +## Checks block +You can define multiple health checks in a single `checks` block. The `checks` block is an array of objects that contain the configuration options described in the [`check` block configuration reference](#check-block). + diff --git a/website/content/docs/services/configuration/services-configuration-overview.mdx b/website/content/docs/services/configuration/services-configuration-overview.mdx new file mode 100644 index 00000000000..55be8df3242 --- /dev/null +++ b/website/content/docs/services/configuration/services-configuration-overview.mdx @@ -0,0 +1,28 @@ +--- +layout: docs +page_title: Services Configuration Overview +description: -> + This topic provides introduces the configuration items that enable you to register services with Consul so that they can connect to other services and nodes registered with Consul. +--- +# Services Configuration Overview + +This topic provides introduces the configuration items that enable you to register services with Consul so that they can connect to other services and nodes registered with Consul. + +## Service definitions +A service definition contains a set of parameters that specify various aspects of the service, including how it is discovered by other services in the network. The service definition may also contain health check configurations. Refer to [Health Check Configuration Reference](/consul/docs/services/configuration/checks-configuration-reference) for configuration details about health checks. + +Configure individual services and health checks by specifying parameters in the `service` block of a service definition file. Refer to [Define Services](/consul/docs/services/usage/define-services) for information about defining services. + +To register a service, provide the service definition to the Consul agent. Refer to [Register Services and Health Checks](/consul/docs/services/usage/register-services-checks) for information about registering services. + +Consul supports service definitions written in JSON and HCL. + +## Service defaults +Use the `service-defaults` configuration entry to define the default parameters for service definitions. This enables you to configure common settings, such as namespace or partition for Consul Enterprise deployments, in a single definition. + +You can use `service-defaults` configuration entries on virtual machines and in Kubernetes environments. + +## ACLs +Services registered in Consul clusters where both Consul Namespaces and the ACL system are enabled can be registered to specific namespaces that are associated with ACL tokens scoped to the namespace. Services registered with a service definition will not inherit the namespace associated with the ACL token specified in the token field. The namespace and the token parameters must be included in the service definition for the service to be registered to the namespace that the ACL token is scoped to. + + diff --git a/website/content/docs/services/configuration/services-configuration-reference.mdx b/website/content/docs/services/configuration/services-configuration-reference.mdx new file mode 100644 index 00000000000..d3ee69e0373 --- /dev/null +++ b/website/content/docs/services/configuration/services-configuration-reference.mdx @@ -0,0 +1,654 @@ +--- +page_title: Service Configuration Reference +description: Use the service definition to configure and register services to the Consul catalog, including services used as proxies in a Consul service mesh +--- + +# Services Configuration Reference + +This topic describes the options you can use to define services for registering them with Consul. Refer to the following topics for usage information: + +- [Define Services](/consul/docs/services/usage/define-services) +- [Register Services and Health Checks](/consul/docs/services/usage/register-services-checks) + +## Configuration model +The following outline shows how to format the configurations in the root `service` block. Click on a property name to view details about the configuration. + +- [`name`](#name): string | required +- [`id`](#id): string | optional +- [`address`](#address): string | optional +- [`port`](#port): integer | optional +- [`tags`](#tags): list of strings | optional +- [`meta`](#meta): object | optional + - [_`custom_meta_key`_](#meta): string | optional +- [`tagged_addresses`](#tagged_addresses): object | optional + - [`lan`](#tagged_addresses-lan): object | optional + - [`address`](#tagged_addresses-lan): string | optional + - [`port`](#tagged_addresses-lan): integer | optional + - [`wan`](#tagged_addresses-wan): object | optional + - [`address`](#tagged_addresses-wan): string | optional + - [`port`](#tagged_addresses-wan): integer | optional +- [`socket_path`](#socket_path): string | optional +- [`enable_tag_override`](#enable_tag_override): boolean | optional +- [`checks`](#checks) : list of objects | optional +- [`kind`](#kind): string | optional +- [`proxy`](#proxy): object | optional +- [`connect`](#connect): object | optional + - [`native`](#connect): boolean | optional + - [`sidecar_service`](#connect): object | optional +- [`weights`](#weights): object | optional + - [`passing`](#weights): integer | optional + - [`warning`](#weights): integer | optional +- [`token`](#token): string | required if ACLs are enabled +- [`namespace`](#namespace): string | optional | + +## Specification +This topic provides details about the configuration parameters. + +### name +Required value that specifies a name for the service. We recommend using valid DNS labels for service definition names for compatibility with external DNSs. The value for this parameter is used as the ID if the `id` parameter is not specified. + +- Type: string +- Default: none + +### id +Specifies an ID for the service. Services on the same node must have unique IDs. We recommend specifying unique values if the default name conflicts with other services. + +- Type: string +- Default: Value of the `name` field. + +### address +String value that specifies a service-specific IP address or hostname. +If no value is specified, the IP address of the agent node is used by default. +There is no service-side validation of this parameter. + +- Type: string +- Default: IP address of the agent node + +### port +Specifies a port number for the service. To improve service discoverability, we recommend specifying the port number, as well as an address in the [`tagged_addresses`](#tagged_addresses) parameter. + +- Type: integer +- Default: Port number of the agent + +### tags +Specifies a list of string values that add service-level labels. Tag values are opaque to Consul. We recommend using valid DNS labels for service definition IDs for compatibility with external DNSs. In the following example, the service is tagged as `v2` and `primary`: + +```hcl +tags = ["v2", "primary"] +``` + +Consul uses tags as an anti-entropy mechanism to maintain the state of the cluster. You can disable the anti-entropy feature for a service using the [`enable_tag_override`](#enable_tag_override) setting, which enables external agents to modify tags on services in the catalog. Refer to [Modify anti-entropy synchronization](/consul/docs/services/usage/define-services#modify-anti-entropy-synchronization) for additional usage information. + +### meta +The `meta` field contains custom key-value pairs that associate semantic metadata with the service. You can specify up to 64 pairs that meet the following requirements: + +- Keys and values must be strings. +- Keys can only contain ASCII characters (`A` -` Z`, `a`- `z`, `0` - `9`, `_`, and `-`). +- Keys can not have special characters. +- Keys are limited to 128 characters. +- Values are limited to 512 characters. + +In the following example, the `env` key is set to `prod`: + + + +```hcl +meta = { + env = "prod" +} +``` + +```json +"meta" : { + "env" : "prod" +} +``` + + + +### tagged_addresses +The `tagged_address` field is an object that configures additional addresses for a node or service. Remote agents and services can communicate with the service using a tagged address as an alternative to the address specified in the [`address`](#address) field. You can configure multiple addresses for a node or service. The following tags are supported: + +- [`lan`](#tagged_addresses-lan): IPv4 LAN address where the node or service is accessible. +- [`lan_ipv4`](#tagged_addresses-lan): IPv4 LAN address where the node or service is accessible. +- [`lan_ipv6`](#tagged_addresses-lan): IPv6 LAN address where the node or service is accessible. +- [`virtual`](#tagged_addresses-virtual): A fixed address for the instances of a given logical service. +- [`wan`](#tagged_addresses-wan): IPv4 WAN address where the node or service is accessible when dialed from a remote data center. +- [`wan_ipv4`](#tagged_addresses-wan): IPv4 WAN address where the node or service is accessible when dialed from a remote data center. +- [`wan_ipv6`](#tagged_addresses-lan): IPv6 WAN address at which the node or service is accessible when being dialed from a remote data center. + +### tagged_addresses.lan +Object that specifies either an IPv4 or IPv6 LAN address and port number where the service or node is accessible. You can specify one or more of the following fields: + +- `lan` +- `lan_ipv4` +- `lan_ipv6` + +The field contains the following parameters: + +- `address` +- `port` + +In the following example, the `redis` service has an IPv4 LAN address of `192.0.2.10:80` and IPv6 LAN address of `[2001:db8:1:2:cafe::1337]:80`: + + + +```hcl +service { + name = "redis" + address = "192.0.2.10" + port = 80 + tagged_addresses { + lan = { + address = "192.0.2.10" + port = 80 + } + lan_ipv4 = { + address = "192.0.2.10" + port = 80 + } + lan_ipv6 = { + address = "2001:db8:1:2:cafe::1337" + port = 80 + } + } +} +``` + +```json +{ + "service": { + "name": "redis", + "address": "192.0.2.10", + "port": 80, + "tagged_addresses": { + "lan": { + "address": "192.0.2.10", + "port": 80 + }, + "lan_ipv4": { + "address": "192.0.2.10", + "port": 80 + }, + "lan_ipv6": { + "address": "2001:db8:1:2:cafe::1337", + "port": 80 + } + } + } +} +``` + + + +### tagged_addresses.virtual +Object that specifies a fixed IP address and port number that downstream services in a service mesh can use to connect to the service. The `virtual` field contains the following parameters: + +- `address` +- `port` + +Virtual addresses are not required to be routable IPs within the network. They are strictly a control plane construct used to provide a fixed address for the instances of a logical service. Egress connections from the proxy to an upstream service go to the IP address of an individual service instance and not the virtual address of the logical service. + +If the following conditions are met, connections to virtual addresses are load balanced across available instances of a service, provided the following conditions are satisfied: + +1. [Transparent proxy](/consul/docs/connect/transparent-proxy) is enabled for the downstream and upstream services. +1. The upstream service is not configured for individual instances to be [dialed directly](/consul/docs/connect/config-entries/service-defaults#dialeddirectly). + +In the following example, the downstream services in the mesh can connect to the `redis` service at `203.0.113.50` on port `80`: + + + +```hcl +service { + name = "redis" + address = "192.0.2.10" + port = 80 + tagged_addresses { + virtual = { + address = "203.0.113.50" + port = 80 + } + } +} +``` + +```json +{ + "service": { + "name": "redis", + "address": "192.0.2.10", + "port": 80, + "tagged_addresses": { + "virtual": { + "address": "203.0.113.50", + "port": 80 + } + } + } +} +``` + + + +### tagged_addresses.wan +Object that specifies either an IPv4 or IPv6 WAN address and port number where the service or node is accessible from a remote datacenter. You can specify one or more of the following fields: + +- `wan` +- `wan_ipv4` +- `wan_ipv6` + +The field contains the following parameters: + +- `address` +- `port` + +In the following example, services or nodes in remote datacenters can reach the `redis` service at `198.51.100.200:80` and `[2001:db8:5:6:1337::1eaf]:80`: + + + +```hcl +service { + name = "redis" + address = "192.0.2.10" + port = 80 + tagged_addresses { + wan = { + address = "198.51.100.200" + port = 80 + } + wan_ipv4 = { + address = "198.51.100.200" + port = 80 + } + wan_ipv6 = { + address = "2001:db8:5:6:1337::1eaf" + port = 80 + } + } +} +``` + +```json +{ + "service": { + "name": "redis", + "address": "192.0.2.10", + "port": 80, + "tagged_addresses": { + "wan": { + "address": "198.51.100.200", + "port": 80 + }, + "wan_ipv4": { + "address": "198.51.100.200", + "port": 80 + }, + "wan_ipv6": { + "address": "2001:db8:5:6:1337::1eaf", + "port": 80 + } + } + } +} +``` + + + +### socket_path +String value that specifies the path to the service socket. Specify this parameter to expose the service to the mesh if the service listens on a Unix Domain socket. + +- Type: string +- Default: none + +### enable_tag_override +Boolean value that determines if the anti-entropy feature for the service is enabled. +Set to `true` to allow external Consul agents modify tags on the services in the Consul catalog. The local Consul agent ignores updated tags during subsequent sync operations. + +This parameter only applies to the locally-registered service. If multiple nodes register a service with the same `name`, the `enable_tag_override` configuration, and all other service configuration items, operate independently. + +Refer to [Modify anti-entropy synchronization](/consul/docs/services/usage/define-services#modify-anti-entropy-synchronization) for additional usage information. + +- Type: boolean +- Default: `false` + +### checks +The `checks` block contains an array of objects that define health checks for the service. Health checks perform several safety functions, such as allowing a web balancer to gracefully remove failing nodes and allowing a database to replace a failed secondary. Refer to [Health Check Configuration Reference](/consul/docs/services/configuration/checks-configuration-reference) for information about configuring health checks. + +### kind +String value that identifies the service as a proxy and determines its role in the service mesh. Do not configure the `kind` parameter for non-proxy service instances. Refer to [Consul Service Mesh](/consul/docs/connect) for additional information. + +You can specify the following values: + +- `connect-proxy`: Defines the configuration for a service mesh proxy. Refer to [Register a Service Mesh Proxy Outside of a Service Registration](/consul/docs/connect/registration/service-registration) for details about registering a service as a service mesh proxy. +- `ingress-gateway`: Defines the configuration for an [ingress gateway](/consul/docs/connect/config-entries/ingress-gateway) +- `mesh-gateway`: Defines the configuration for a [mesh gateway](/consul/docs/connect/gateways/mesh-gateway) +- `terminating-gateway`: Defines the configuration for a [terminating gateway](/consul/docs/connect/gateways/terminating-gateway) + +For non-service registration roles, the `kind` field has a different context when used to define configuration entries, such as `service-defaults`. Refer to the documentation for the configuration entry you want to implement for additional information. + +### proxy +Object that specifies proxy configurations when the service is configured to operate as a proxy in a service mesh. Do not configure the `proxy` parameter for non-proxy service instances. Refer to [Register a Service Mesh Proxy Outside of a Service Registration](/consul/docs/connect/registration/service-registration) for details about registering your service as a service mesh proxy. Refer to [`kind`](#kind) for information about the types of proxies you can define. Services that you assign proxy roles to are registered as services in the catalog. + +### connect +Object that configures a Consul service mesh connection. You should only configure the `connect` block of parameters if you are using Consul service mesh. Refer to [Consul Service Mesh](/consul/docs/connect) for additional information. + +The following table describes the parameters that you can place in the `connect` block: + +| Parameter | Description | Default | +| --- | --- | --- | +| `native` | Boolean value that advertises the service as a native service mesh proxy. Use this parameter to integrate your application with the `connect` API. Refer to [Service Mesh Native App Integration Overview](/consul/docs/connect/native) for additional information. If set to `true`, do not configure a `sidecar_service`. | `false` | +| `sidecar_service` | Object that defines a sidecar proxy for the service. Do not configure if `native` is set to `true`. Refer to [Register a Service Mesh Proxy in a Service Registration](/consul/docs/connect/registration/sidecar-service) for usage and configuration details. | Refer to [Register a Service Mesh Proxy in a Service Registration](/consul/docs/connect/registration/sidecar-service) for default configurations. | + +### weights +Object that configures how the service responds to DNS SRV requests based on the service's health status. Configuring allows service instances with more capacity to respond to DNS SRV requests. It also reduces the load on services with checks in `warning` status by giving passing instances a higher weight. + +You can specify one or more of the following states and configure an integer value indicating its weight: + +- `passing` +- `warning` +- `critical` + +Larger integer values increase the weight state. Services have the following default weights: + +- `"passing" : 1` +- `"warning" : 1` + +Services in a `critical` state are excluded from DNS responses by default. Services with `warning` checks are included in responses by default. Refer to [Perform Static DNS Queries](/consul/docs/services/discovery/dns-static-lookups) for additional information. + +In the following example, service instances in a `passing` state respond to DNS SRV requests, while instances in a `critical` instance can still respond at a lower frequency: + + + +```hcl +service { + ## ... + weights = { + passing = 3 + warning = 2 + critical = 1 + } + ## ... +} +``` + +```json +"service": { + ## ... + "weights": { + "passing": 3, + "warning": 2, + "critical": 1 + }, + ## ... +} +``` + + + +### token +String value that specifies the ACL token to present when registering the service if ACLs are enabled. The token is required for the service to interact with the service catalog. + +If [ACLs](/consul/docs/security/acl) and [namespaces](/consul/docs/enterprise/namespaces) are enabled, you can register services scoped to the specific [`namespace`](#namespace) associated with the ACL token in a Consul cluster. + +Services registered with a service definition do not inherit the namespace associated with the ACL token specified in the token field. The `namespace` and `token` parameters must be included in the service definition for the service to be registered to the namespace that the ACL token is scoped to. + +- Type: string +- Default: none + +### namespace +String value that specifies the namespace in which to register the service. Refer [Namespaces](/consul/docs/enterprise/namespaces) for additional information. + +- Type: string +- Default: none + +## Multiple service definitions + +You can define multiple services in a single definition file in the `servcies` block. This enables you register multiple services in a single command. Note that the HTTP API does not support the `services` block. + + + +```hcl +services { + id = "red0" + name = "redis" + tags = [ + "primary" + ] + address = "" + port = 6000 + checks = [ + { + args = ["/bin/check_redis", "-p", "6000"] + interval = "5s" + timeout = "20s" + } + ] +} +services { + id = "red1" + name = "redis" + tags = [ + "delayed", + "secondary" + ] + address = "" + port = 7000 + checks = [ + { + args = ["/bin/check_redis", "-p", "7000"] + interval = "30s" + timeout = "60s" + } + ] +} +``` + +```json +{ + "services": [ + { + "id": "red0", + "name": "redis", + "tags": [ + "primary" + ], + "address": "", + "port": 6000, + "checks": [ + { + "args": ["/bin/check_redis", "-p", "6000"], + "interval": "5s", + "timeout": "20s" + } + ] + }, + { + "id": "red1", + "name": "redis", + "tags": [ + "delayed", + "secondary" + ], + "address": "", + "port": 7000, + "checks": [ + { + "args": ["/bin/check_redis", "-p", "7000"], + "interval": "30s", + "timeout": "60s" + } + ] + } + ] +} +``` + + + +## Example definition +The following example includes all possible parameters, but only the top-level `service` parameter and its `name` parameter are required by default. + + + +```hcl +service { + name = "redis" + id = "redis" + port = 80 + tags = ["primary"] + + meta = { + custom_meta_key = "custom_meta_value" + } + + tagged_addresses = { + lan = { + address = "192.168.0.55" + port = 8000 + } + + wan = { + address = "198.18.0.23" + port = 80 + } + } + + port = 8000 + socket_path = "/tmp/redis.sock" + enable_tag_override = false + + checks = [ + { + args = ["/usr/local/bin/check_redis.py"] + interval = "10s" + } + ] + + kind = "connect-proxy" + proxy_destination = "redis" + + proxy = { + destination_service_name = "redis" + destination_service_id = "redis1" + local_service_address = "127.0.0.1" + local_service_port = 9090 + local_service_socket_path = "/tmp/redis.sock" + mode = "transparent" + + transparent_proxy { + outbound_listener_port = 22500 + } + + mesh_gateway = { + mode = "local" + } + + expose = { + checks = true + + paths = [ + { + path = "/healthz" + local_path_port = 8080 + listener_port = 21500 + protocol = "http2" + } + ] + } + } + + connect = { + native = false + } + + weights = { + passing = 5 + warning = 1 + } + + token = "233b604b-b92e-48c8-a253-5f11514e4b50" + namespace = "foo" +} +``` + +```json +{ + "service": { + "id": "redis", + "name": "redis", + "tags": ["primary"], + "address": "", + "meta": { + "meta": "for my service" + }, + "tagged_addresses": { + "lan": { + "address": "192.168.0.55", + "port": 8000, + }, + "wan": { + "address": "198.18.0.23", + "port": 80 + } + }, + "port": 8000, + "socket_path": "/tmp/redis.sock", + "enable_tag_override": false, + "checks": [ + { + "args": ["/usr/local/bin/check_redis.py"], + "interval": "10s" + } + ], + "kind": "connect-proxy", + "proxy_destination": "redis", // Deprecated + "proxy": { + "destination_service_name": "redis", + "destination_service_id": "redis1", + "local_service_address": "127.0.0.1", + "local_service_port": 9090, + "local_service_socket_path": "/tmp/redis.sock", + "mode": "transparent", + "transparent_proxy": { + "outbound_listener_port": 22500 + }, + "config": {}, + "upstreams": [], + "mesh_gateway": { + "mode": "local" + }, + "expose": { + "checks": true, + "paths": [ + { + "path": "/healthz", + "local_path_port": 8080, + "listener_port": 21500, + "protocol": "http2" + } + ] + } + }, + "connect": { + "native": false, + "sidecar_service": {} + "proxy": { // Deprecated + "command": [], + "config": {} + } + }, + "weights": { + "passing": 5, + "warning": 1 + }, + "token": "233b604b-b92e-48c8-a253-5f11514e4b50", + "namespace": "foo" + } +} +``` + + + + + + diff --git a/website/content/docs/services/discovery/dns-configuration.mdx b/website/content/docs/services/discovery/dns-configuration.mdx new file mode 100644 index 00000000000..7e43e7b75bb --- /dev/null +++ b/website/content/docs/services/discovery/dns-configuration.mdx @@ -0,0 +1,76 @@ +--- +layout: docs +page_title: Configure Consul DNS Behavior +description: -> + Learn how to modify the default DNS behavior so that services and nodes can easily discover other services and nodes in your network. +--- + +# Configure Consul DNS Behavior + +This topic describes the default behavior of the Consul DNS functionality and how to customize how Consul performs queries. + +## Introduction +The Consul DNS is the primary interface for querying records when Consul service mesh is disabled and your network runs in a non-Kubernetes environment. The DNS enables you to look up services and nodes registered with Consul using terminal commands instead of making HTTP API requests to Consul. Refer to the [Discover Consul Nodes and Services Overview](/consul/docs/services/discovery/dns-overview) for additional information. + +## Configure DNS behaviors +By default, the Consul DNS listens for queries at `127.0.0.1:8600` and uses the `consul` domain. Specify the following parameters in the agent configuration to determine DNS behavior when querying services: + +- [`client_addr`](/consul/docs/agent/config/config-files#client_addr) +- [`ports.dns`](/consul/docs/agent/config/config-files#dns_port) +- [`recursors`](/consul/docs/agent/config/config-files#recursors) +- [`domain`](/consul/docs/agent/config/config-files#domain) +- [`alt_domain`](/consul/docs/agent/config/config-files#alt_domain) +- [`dns_config`](/consul/docs/agent/config/config-files#dns_config) + +### Configure WAN address translation +By default, Consul DNS queries return a node's local address, even when being queried from a remote datacenter. You can configure the DNS to reach a node from outside its datacenter by specifying the address in the following configuration fields in the Consul agent: + +- [advertise-wan](/consul/docs/agent/config/cli-flags#_advertise-wan) +- [translate_wan_addrs](/consul//docs/agent/config/config-files#translate_wan_addrs) + +### Use a custom DNS resolver library +You can specify a list of addresses in the agent's [`recursors`](/consul/docs/agent/config/config-files#recursors) field to provide upstream DNS servers that recursively resolve queries that are outside the service domain for Consul. + +Nodes that query records outside the `consul.` domain resolve to an upstream DNS. You can specify IP addresses or use `go-sockaddr` templates. Consul resolves IP addresses in the specified order and ignores duplicates. + +### Enable non-Consul queries +You enable non-Consul queries to be resolved by setting Consul as the DNS server for a node and providing a [`recursors`](/consul/docs/agent/config/config-files#recursors) configuration. + +### Forward queries to an agent +You can forward all queries sent to the `consul.` domain from the existing DNS server to a Consul agent. Refer to [Forward DNS for Consul Service Discovery](/consul/tutorials/networking/dns-forwarding) for instructions. + +### Query an alternate domain +By default, Consul responds to DNS queries in the `consul` domain, but you can set a specific domain for responding to DNS queries by configuring the [`domain`](/consul/docs/agent/config/config-files#domain) parameter. + +You can also specify an additional domain in the [`alt_domain`](/consul/docs/agent/config/config-files#alt_domain) agent configuration option, which configures Consul to respond to queries in a secondary domain. Configuring an alternate domain may be useful during a DNS migration or to distinguish between internal and external queries, for example. + +Consul's DNS response uses the same domain as the query. + +In the following example, the `alt_domain` parameter in the agent configuration is set to `test-domain`, which enables operators to query the domain: + +```shell-session +$ dig @127.0.0.1 -p 8600 consul.service.test-domain SRV + +;; QUESTION SECTION: +;consul.service.test-domain. IN SRV + +;; ANSWER SECTION: +consul.service.test-domain. 0 IN SRV 1 1 8300 machine.node.dc1.test-domain. + +;; ADDITIONAL SECTION: +machine.node.dc1.test-domain. 0 IN A 127.0.0.1 +machine.node.dc1.test-domain. 0 IN TXT "consul-network-segment=" +``` +#### PTR queries +Responses to pointer record (PTR) queries, such as `.in-addr.arpa.`, always use the [primary domain](/consul/docs/agent/config/config-files#domain) and not the alternative domain. + +### Caching +By default, DNS results served by Consul are not cached. Refer to the [DNS Caching tutorial](/consul/tutorials/networking/dns-caching) for instructions on how to enable caching. + + + + + + + + diff --git a/website/content/docs/services/discovery/dns-dynamic-lookups.mdx b/website/content/docs/services/discovery/dns-dynamic-lookups.mdx new file mode 100644 index 00000000000..d19f41c9ea6 --- /dev/null +++ b/website/content/docs/services/discovery/dns-dynamic-lookups.mdx @@ -0,0 +1,100 @@ +--- +layout: docs +page_title: Enable Dynamic DNS Queries +description: -> + Learn how to dynamically query the Consul DNS using prepared queries, which enable robust service and node lookups. +--- + +# Enable Dynamic DNS Queries +This topic describes how to dynamically query the Consul catalog using prepared queries. Prepared queries are configurations that enable you to register a complex service query and execute it on demand. For information about how to perform standard node and service lookups, refer to [Perform Static DNS Queries](/consul/docs/services/discovery/dns-static-lookups). + +## Introduction +Prepared queries provide a rich set of lookup features, such as filtering by multiple tags and automatically failing over to look for services in remote datacenters if no healthy nodes are available in the local datacenter. You can also create prepared query templates that match names using a prefix match, allowing a single template to apply to potentially many services. Refer to [Query Consul Nodes and Services Overview](/consul/docs/services/discovery/dns-overview) for additional information about DNS query behaviors. + +## Requirements +Consul 0.6.4 or later is required to create prepared query templates. + +### ACLs +If ACLs are enabled, the querying service must present a token linked to permissions that enable read access for query, service, and node resources. Refer to the following documentation for information about creating policies to enable read access to the necessary resources: + +- [Prepared query rules](/consul/docs/security/acl/acl-rules#prepared-query-rules) +- [Service rules](/consul/docs/security/acl/acl-rules#service-rules) +- [Node rules](/consul/docs/security/acl/acl-rules#node-rules) + +## Create prepared queries +Refer to the [prepared query reference](/consul/api-docs/query#create-prepared-query) for usage information. + +1. Specify the prepared query options in JSON format. The following prepared query targets all instances of the `redis` service in `dc1` and `dc2`: + + ```json + { + "Name": "my-query", + "Session": "adf4238a-882b-9ddc-4a9d-5b6758e4159e", + "Token": "", + "Service": { + "Service": "redis", + "Failover": { + "NearestN": 3, + "Datacenters": ["dc1", "dc2"] + }, + "Near": "node1", + "OnlyPassing": false, + "Tags": ["primary", "!experimental"], + "NodeMeta": { + "instance_type": "m3.large" + }, + "ServiceMeta": { + "environment": "production" + } + }, + "DNS": { + "TTL": "10s" + } + } + ``` + + Refer to the [prepared query configuration reference](/consul/api-docs/query#create-prepared-query) for information about all available options. + +1. Send the query in a POST request to the [`/query` API endpoint](/consul/api-docs/query). If the request is successful, Consul prints an ID for the prepared query. + + In the following example, the prepared query configuration is stored in the `payload.json` file: + + ```shell-session + $ curl --request POST --data @payload.json http://127.0.0.1:8500/v1/query + {"ID":"014af5ff-29e6-e972-dcf8-6ee602137127"}% + ``` +1. To run the query, send a GET request to the endpoint and specify the ID returned from the POST call. + + ```shell-session + $ curl http://127.0.0.1:8500/v1/query/14af5ff-29e6-e972-dcf8-6ee602137127/execute\?near\=_agent + ``` + +## Execute prepared queries +You can execute a prepared query using the standard lookup format or the strict RFC 2782 SRV lookup. + +### Standard lookup + +Use the following format to execute a prepared query using the standard lookup format: + +``` +.query[.]. +``` + +Refer [Standard lookups](/consul/docs/services/discovery/dns-static-lookups#standard-lookups) for additional information about the standard lookup format in Consul. + +### RFC 2782 SRV lookup +Use the following format to execute a prepared query using the RFC 2782 lookup format: + +``` +_._tcp.query[.]. +``` + +For additional information about following the RFC 2782 SRV lookup format in Consul, refer to [RFC 2782 Lookup](/consul/docs/services/discovery/dns-static-lookups#rfc-2782-lookup). For general information about the RFC 2782 specification, refer to [A DNS RR for specifying the location of services \(DNS SRV\)](https://tools.ietf.org/html/rfc2782). + +### Lookup options +The `datacenter` subdomain is optional. By default, the lookup queries the datacenter of this Consul agent. + +The `query name` or `id` subdomain is the name or ID of an existing prepared query. + +## Results +To allow for simple load balancing, Consul returns the set of nodes in random order for each query. Prepared queries support A and SRV records. SRV records provide the port that a service is registered. Consul only serves SRV records if the client specifically requests them. \ No newline at end of file diff --git a/website/content/docs/services/discovery/dns-overview.mdx b/website/content/docs/services/discovery/dns-overview.mdx new file mode 100644 index 00000000000..53baac080e7 --- /dev/null +++ b/website/content/docs/services/discovery/dns-overview.mdx @@ -0,0 +1,41 @@ +--- +layout: docs +page_title: DNS Usage Overview +description: >- + For service discovery use cases, Domain Name Service (DNS) is the main interface to look up, query, and address Consul nodes and services. Learn how a Consul DNS lookup can help you find services by tag, name, namespace, partition, datacenter, or domain. +--- + +# DNS Usage Overview + +This topic provides overview information about how to look up Consul nodes and services using the Consul DNS. + +## Consul DNS +The Consul DNS is the primary interface for discovering services registered in the Consul catalog. The DNS enables you to look up services and nodes registered with Consul using terminal commands instead of making HTTP API requests to Consul. + +We recommend using the DNS for service discovery in virtual machine (VM) environments because it removes the need to modify native applications so that they can consume the Consul service discovery APIs. + +The DNS has several default configurations, but you can customize how the server processes lookups. Refer to [Configure DNS Behaviors](/consul/docs/services/discovery/dns-configuration) for additional information. + +### DNS versus native app integration +You can use DNS to reach services registered with Consul or modify your application to natively consume the Consul service discovery HTTP APIs. + +We recommend using the DNS because it is less invasive. You do not have to modify your application with Consul to retrieve the service’s connection information. Instead, you can use a DNS fully qualified domain (FQDN) that conforms to Consul's lookup format to retreive the relevant information. + +Refer to [ Native App Integration](/consul/docs/connect/native) and its [Go package](/consul/docs/connect/native/go) for additional information. + +### DNS versus upstreams +If you are using Consul for service discovery and have not enabled service mesh features, then use the DNS to discover services and nodes in the Consul catalog. + +If you are using Consul for service mesh on VMs, you can use upstreams or DNS. We recommend using upstreams because you can query services and nodes without modifying the application code or environment variables. Refer to [Upstream Configuration Reference](/consul/docs/connect/registration/service-registration#upstream-configuration-reference) for additional information. + +If you are using Consul on Kubernetes, refer to [the upstreams annotation documentation](/consul/docs/k8s/annotations-and-labels#consul-hashicorp-com-connect-service-upstreams) for additional information. + +## Static queries +Node lookups and service lookups are the fundamental types of static queries. Depending on your use case, you may need to use different query methods and syntaxes to query the DNS for services and nodes. + +Consul relies on a very specific format for queries to resolve names. Note that all queries are case-sensitive. + +Refer to [Perform Static DNS Lookups](/consul/docs/services/discovery/dns-static-lookups) for details about how to perform node and service lookups. + +## Prepared queries +Prepared queries are configurations that enable you to register complex DNS queries. They provide lookup features that extend Consul's service discovery capabilities, such as filtering by multiple tags and automatically querying remote datacenters for services if no healthy nodes are available in the local datacenter. You can also create prepared query templates that match names using a prefix match, allowing a single template to apply to potentially many services. Refer to [Enable Dynamic DNS Queries](/consul/docs/services/discovery/dns-dynamic-lookups) for additional information. diff --git a/website/content/docs/services/discovery/dns-static-lookups.mdx b/website/content/docs/services/discovery/dns-static-lookups.mdx new file mode 100644 index 00000000000..d95987671ef --- /dev/null +++ b/website/content/docs/services/discovery/dns-static-lookups.mdx @@ -0,0 +1,357 @@ +--- +layout: docs +page_title: Perform Static DNS Queries +description: -> + Learn how to use standard Consul DNS lookup formats to enable service discovery for services and nodes. +--- + +# Perform Static DNS Queries +This topic describes how to query the Consul DNS to look up nodes and services registered with Consul. Refer to [Enable Dynamic DNS Queries](/consul/docs/services/discovery/dns-dynamic-lookups) for information about using prepared queries. + +## Introduction +Node lookups and service lookups are the fundamental types of queries you can perform using the Consul DNS. Node lookups interrogate the catalog for named Consul agents. Service lookups interrogate the catalog for services registered with Consul. Refer to [DNS Usage Overivew](/consul/docs/services/discovery/dns-overview) for additional background information. + +## Requirements +All versions of Consul support DNS lookup features. + +### ACLs +If ACLs are enabled, you must present a token linked with the necessary policies. We recommend using a separate token in production deployments for querying the DNS. By default, Consul agents resolve DNS requests using the preconfigured tokens in order of precedence: + +The agent's [`default` token](/consul/docs/agent/config/config-files#acl_tokens_default) +The built-in [`anonymous` token](/consul/docs/security/acl/acl-tokens#built-in-tokens). + + +The following table describes the available DNS lookups and required policies when ACLs are enabled: + +| Lookup | Type | Description | ACLs Required | +| --- | --- | --- | --- | +| `*.node.consul` | Node | Allows Consul to resolve DNS requests for the target node. Example: `.node.consul` | `node:read` | +| `*.service.consul`
    `*.connect.consul`
    `*.ingress.consul`
    `*.virtual.consul` |Service: standard | Allows Consul to resolve DNS requests for target service instances running on ACL-authorized nodes. Example: `.service.consul` | `service:read`
    `node:read` | + +> **Tutorials**: For hands-on guidance on how to configure an appropriate token for DNS, refer to the tutorial for [Production Environments](/consul/tutorials/security/access-control-setup-production#token-for-dns) and [Development Environments](/consul/tutorials/day-0/access-control-setup#enable-acls-on-consul-clients). + +## Node lookups +Specify the name of the node, datacenter, and domain using the following FQDN syntax: + +```text +.node[..dc]. +``` + +The `datacenter` subdomain is optional. By default, the lookup queries the datacenter of the agent. + +By default, the domain is `consul`. Refer to [Configure DNS Behaviors]() for information about using alternate domains. + +### Node lookup results + +Node lookups return A and AAAA records that contain the IP address and TXT records containing the `node_meta` values of the node. + +By default, TXT record values match the node's metadata key-value pairs according to [RFC1464](https://www.ietf.org/rfc/rfc1464.txt). If the metadata key starts with `rfc1035-`, the TXT record only includes the node's metadata value. + +The following example lookup queries the `foo` node in the `default` datacenter: + +```shell-session +$ dig @127.0.0.1 -p 8600 foo.node.consul ANY + +; <<>> DiG 9.8.3-P1 <<>> @127.0.0.1 -p 8600 foo.node.consul ANY +; (1 server found) +;; global options: +cmd +;; Got answer: +;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 24355 +;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 0 +;; WARNING: recursion requested but not available + +;; QUESTION SECTION: +;foo.node.consul. IN ANY + +;; ANSWER SECTION: +foo.node.consul. 0 IN A 10.1.10.12 +foo.node.consul. 0 IN TXT "meta_key=meta_value" +foo.node.consul. 0 IN TXT "value only" + + +;; AUTHORITY SECTION: +consul. 0 IN SOA ns.consul. postmaster.consul. 1392836399 3600 600 86400 0 +``` + +### Node lookups for Consul Enterprise + +Consul Enterprise includes the admin partition concept, which is an abstraction that lets you define isolated administrative network areas. Refer to [Admin Partitions](/consul/docs/enterprise/admin-partitions) for additional information. + +Consul nodes reside in admin partitions within a datacenter. By default, node lookups query the same partition and datacenter of the Consul agent that received the DNS query. + +Use the following query format to specify a partition for a node lookup: + +``` +.node[..ap][..dc]. +``` + +Consul server agents are in the `default` partition. If you send a DNS query to Consul server agents, you must explicitly specify the partition of the target node if it is not `default`. + +## Service lookups +You can query the network for service providers using either the [standard lookup](#standard-lookup) method or [strict RFC 2782 lookup](#rfc-2782-lookup) method. + +By default, all SRV records are weighted equally in service lookup responses, but you can configure the weights using the [`Weights`](/consul/docs/services/configuration/services-configuration-reference#weights) attribute of the service definition. Refer to [Define Services](/consul/docs/services/usage/define-services) for additional information. + +The DNS protocol limits the size of requests, even when performing DNS TCP queries, which may affect your experience querying for services. For services with more than 500 instances, you may not be able to retrieve the complete list of instances for the service. Refer to [RFC 1035, Domain Names - Implementation and Specification](https://datatracker.ietf.org/doc/html/rfc1035#section-2.3.4) for additional information. + +Consul randomizes DNS SRV records and ignores weights specified in service configurations when printing responses. If records are truncated, each client using weighted SRV responses may have partial and inconsistent views of instance weights. As a result, the request distribution may be skewed from the intended weights. We recommend calling the [`/catalog/nodes` API endpoint](/consul/api-docs/catalog#list-nodes) to retrieve the complete list of nodes. You can apply query parameters to API calls to sort and filter the results. + +### Standard lookups +To perform standard service lookups, specify tags, the name of the service, datacenter, and domain using the following syntax to query for service providers: + +```text +[.].service[.].dc. +``` + +The `tag` subdomain is optional. It filters responses so that only service providers containing the tag appear. + +The `datacenter` subdomain is optional. By default, Consul interrogates the querying agent's datacenter. + +By default, the lookups query in the `consul` domain. Refer to [Configure DNS Behaviors](/consul/docs/services/discovery/dns-configuration) for information about using alternate domains. + +#### Standard lookup results +Standard services queries return A and SRV records. SRV records include the port that the service is registered on. SRV records are only served if the client specifically requests them. + +Services that fail their health check or that fail a node system check are omitted from the results. As a load balancing measure, Consul randomizes the set of nodes returned in the response. These mechanisms help you use DNS with application-level retries as the foundation for a self-healing service-oriented architecture. + +The following example retrieves the SRV records for any `redis` service registered in Consul. + +```shell-session +$ dig @127.0.0.1 -p 8600 consul.service.consul SRV + +; <<>> DiG 9.8.3-P1 <<>> @127.0.0.1 -p 8600 consul.service.consul ANY +; (1 server found) +;; global options: +cmd +;; Got answer: +;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 50483 +;; flags: qr aa rd; QUERY: 1, ANSWER: 3, AUTHORITY: 1, ADDITIONAL: 1 +;; WARNING: recursion requested but not available + +;; QUESTION SECTION: +;consul.service.consul. IN SRV + +;; ANSWER SECTION: +consul.service.consul. 0 IN SRV 1 1 8300 foobar.node.dc1.consul. + +;; ADDITIONAL SECTION: +foobar.node.dc1.consul. 0 IN A 10.1.10.12 +``` + +The following example command and FQDN retrieves the SRV records for the primary Postgres service in the secondary datacenter: + +```shell-session hideClipboard +$ dig @127.0.0.1 -p 8600 primary.postgresql.service.dc2.consul SRV + +; <<>> DiG 9.8.3-P1 <<>> @127.0.0.1 -p 8600 primary.postgresql.service.dc2.consul ANY +; (1 server found) +;; global options: +cmd +;; Got answer: +;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 50483 +;; flags: qr aa rd; QUERY: 1, ANSWER: 3, AUTHORITY: 1, ADDITIONAL: 1 +;; WARNING: recursion requested but not available + +;; QUESTION SECTION: +;consul.service.consul. IN SRV + +;; ANSWER SECTION: +consul.service.consul. 0 IN SRV 1 1 5432 primary.postgresql.service.dc2.consul. + +;; ADDITIONAL SECTION: +primary.postgresql.service.dc2.consul. 0 IN A 10.1.10.12 +``` + +### RFC 2782 lookup +Per [RFC 2782](https://tools.ietf.org/html/rfc2782), SRV queries must prepend `service` and `protocol` values with an underscore (`_`) to prevent DNS collisions. Use the following syntax to perform RFC 2782 lookups: + +```text +_._[.service][.]. +``` + +You can create lookups that filter results by placing service tags in the `protocol` field. Use the following syntax to create RFC 2782 lookups that filter results based on service tags: + +```text +_._[.service][.]. +``` + +The following example queries the `rabbitmq` service tagged with `amqp`, which returns an instance at `rabbitmq.node1.dc1.consul` on port `5672`: + +```shell-session +$ dig @127.0.0.1 -p 8600 _rabbitmq._amqp.service.consul SRV + +; <<>> DiG 9.8.3-P1 <<>> @127.0.0.1 -p 8600 _rabbitmq._amqp.service.consul ANY +; (1 server found) +;; global options: +cmd +;; Got answer: +;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 52838 +;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1 +;; WARNING: recursion requested but not available + +;; QUESTION SECTION: +;_rabbitmq._amqp.service.consul. IN SRV + +;; ANSWER SECTION: +_rabbitmq._amqp.service.consul. 0 IN SRV 1 1 5672 rabbitmq.node1.dc1.consul. + +;; ADDITIONAL SECTION: +rabbitmq.node1.dc1.consul. 0 IN A 10.1.11.20 +``` +#### SRV responses for hosts in the .addr subdomain + +If a service registered with Consul is configured with an explicit IP address or addresses in the [`address`](/consul/docs/services/configuration/services-configuration-reference#address) or [`tagged_address`](/consul/docs/services/configuration/services-configuration-reference#tagged_address) parameter, then Consul returns the hostname in the target field of the answer section for the DNS SRV query according to the following format: + +```text +.addr..consul`. +``` + +In the following example, the `rabbitmq` service is registered with an explicit IPv4 address of `192.0.2.10`. + +```hcl +node_name = "node1" + +services { + name = "rabbitmq" + address = "192.0.2.10" + port = 5672 +} +{ + "node_name": "node1", + "services": [ + { + "name": "rabbitmq", + "address": "192.0.2.10", + "port": 5672 + } + ] +} +``` + +The following example SRV query response contains a single record with a hostname written as a hexadecimal value: + +```shell-session +$ dig @127.0.0.1 -p 8600 -t srv _rabbitmq._tcp.service.consul +short +1 1 5672 c000020a.addr.dc1.consul. +``` + +You can convert hex octets to decimals to reveal the IP address. The following example command converts the hostname expressed as `c000020a` into the IPv4 address specified in the service registration. + +``` +$ echo -n "c000020a" | perl -ne 'printf("%vd\n", pack("H*", $_))' +192.0.2.10 +``` + +In the following example, the `rabbitmq` service is registered with an explicit IPv6 address of `2001:db8:1:2:cafe::1337`. + +```hcl +node_name = "node1" + +services { + name = "rabbitmq" + address = "2001:db8:1:2:cafe::1337" + port = 5672 +} +{ + "node_name": "node1", + "services": [ + { + "name": "rabbitmq", + "address": "2001:db8:1:2:cafe::1337", + "port": 5672 + } + ] +} +``` + +The following example SRV query response contains a single record with a hostname written as a hexadecimal value: + +```shell-session +$ dig @127.0.0.1 -p 8600 -t SRV _rabbitmq._tcp.service.consul +short +1 1 5672 20010db800010002cafe000000001337.addr.dc1.consul. +``` + +The response contains the fully-expanded IPv6 address with colon separators removed. The following command re-adds the colon separators to display the fully expanded IPv6 address that was specified in the service registration. + +```shell-session +$ echo -n "20010db800010002cafe000000001337" | perl -ne 'printf join(":", unpack("(A4)*", $_))."\n"' +2001:0db8:0001:0002:cafe:0000:0000:1337 +``` + +### Service lookups for Consul Enterprise +You can perform the following types of service lookups to query for services in another namespace, partition, and datacenter: + +- `.service` +- `.connect` +- `.virtual` +- `.ingress` + +Use the following query format to specify namespace, partition, or datacenter: +``` +[.].service[..ns][..ap][..dc] +``` + +The `namespace`, `partition`, and `datacenter` are optional. By default, all service lookups use the `default` namespace within the partition and datacenter of the Consul agent that received the DNS query. + +Consul server agents reside in the `default` partition. If DNS queries are addressed to Consul server agents, you must explicitly specify the partition of the target service when querying for services in partitions other than `default`. + +To lookup services imported from a cluster peer, refer to [Service virtual IP lookups for Consul Enterprise](#service-virtual-ip-lookups-for-consul-enterprise). + +#### Alternative formats for specifying namespace + +Although we recommend using the format described in [Service lookups for Consul Enterprise](#service-lookups-for-consul-enterprise) for readability, you can use the alternate query format to specify namespaces but not partitions: + +``` +[.].service... +``` + +### Service mesh-enabled service lookups + +Add the `.connect` subdomain to query for service mesh-enabled services: + +```text +.connect. +``` + +This finds all service mesh-capable endpoints for the service. A service mesh-capable endpoint may be a proxy for a service or a natively integrated service mesh application. The DNS interface does not differentiate the two. + +Many services use a proxy that handles service discovery automatically. As a result, they may not use the DNS format, which is primarily for service mesh-native applications. +This endpoint only finds services within the same datacenter and does not support tags. Refer to the [`catalog` API endpoint](/consul/api-docs/catalog) for more complex behaviors. + +### Service virtual IP lookups + +Add the `.virtual` subdomain to queries to find the unique virtual IP allocated for a service: + +```text +.virtual[.]. +``` + +This returns the unique virtual IP for any service mesh-capable service. Each service mesh service has a virtual IP assigned to it by Consul. Sidecar proxies use the virtual IP to enable the [transparent proxy](/consul/docs/connect/transparent-proxy) feature. + +The peer name is an optional. The DNS uses it to query for the virtual IP of a service imported from the specified peer. + +Consul adds virtual IPs to the [`tagged_addresses`](/consul/services/configuration/services-configuration-reference#tagged-addresses) field in the service definition under the `consul-virtual` tag. + +#### Service virtual IP lookups for Consul Enterprise + +By default, a service virtual IP lookup checks the `default` namespace within the partition and datacenter of the Consul agent that received the DNS query. +To lookup services imported from a partition in another cluster peered to the querying cluster or open-source datacenter, specify the namespace and peer name in the lookup: + +```text +.virtual[.].. +``` + +To lookup services in a cluster peer that have not been imported, refer to [Service lookups for Consul Enterprise](#service-lookups-for-consul-enterprise). + +### Ingress Service Lookups + +Add the `.ingress` subdomain to your DNS FQDN to find ingress-enabled services: + +```text +.ingress. +``` + +This finds all ingress gateway endpoints for the service. + +This endpoint finds services within the same datacenter and does not support tags. Refer to the [`catalog` API endpoint](/consul/api-docs/catalog) for more complex behaviors. + +### UDP-based DNS queries + +When the DNS query is performed using UDP, Consul truncateß the results without setting the truncate bit. This prevents a redundant lookup over TCP that generates additional load. If the lookup is done over TCP, the results are not truncated. \ No newline at end of file diff --git a/website/content/docs/services/services.mdx b/website/content/docs/services/services.mdx new file mode 100644 index 00000000000..3a2f2153890 --- /dev/null +++ b/website/content/docs/services/services.mdx @@ -0,0 +1,39 @@ +--- +layout: docs +page_title: Services Overview +description: >- + Learn about services and service discovery workflows and concepts for virtual machine environments. +--- + +# Services Overview +This topic provides overview information about services and how to make them discoverable in Consul when your network operates on virtual machines. If service mesh is enabled in your network, refer to the topics in [Consul Service Mesh](/consul/docs/connect/). If your network is running in Kubernetes, refer to the topics in [Consul on Kubernetes](/consul/docs/k8s). + +## Introduction +A _service_ is an entity in your network that performs a specialized operation or set of related operations. In many contexts, a service is software that you want to make available to users or other programs with access to your network. Services can also refer to native Consul functionality, such as _service mesh proxies_ and _gateways_, that enable you to establish connections between different parts of your network. + +You can define and register services with Consul, which makes them discoverable to other services in the network. You can also define various types of health checks that perform several safety functions, such as allowing a web balancer to gracefully remove failing nodes and allowing a database to replace a failed secondary. + +## Workflow +For service discovery, the core Consul workflow for services consists of three stages: + +1. **Define services and health checks**: A service definition lets you define various aspects of the service, including how it is discovered by other services in the network. You can define health checks in the service definitions to verify the health of the service. Refer to [Define Services](/consul/docs/services/usage/define-services) and [Define Health Checks](/consul/docs/services/usage/checks) for additional information. + +1. **Register services and health checks**: After defining your services and health checks, you must register them with a Consul agent. Refer to [Register Services and Health Checks](/consul/docs/services/usage/register-services-checks) for additional information. + +1. **Query for services**: After registering your services and health checks, other services in your network can use the DNS to perform static or dynamic lookups to access your service. Refer to [DNS Usage Overview](/consul/docs/services/discovery/dns-overview) for additional information about the different ways to discover services in your datacenters. + + +## Service mesh use cases +Consul redirects service traffic through sidecar proxies if you use Consul service mesh. As a result, you must specify upstream configurations in service definitions. The service mesh experience is different for virtual machine (VM) and Kubernetes environments. + +### Virtual machines +You must define upstream services in the service definition. Consul uses the upstream configuration to bind the service with its upstreams. After registering the service, you must start a sidecar proxy on the VM to enable mesh connectivity. Refer to [Register a Service Mesh Proxy in a Service Registration](/consul/docs/connect/registration/sidecar-service) for details. + +### Kubernetes +If you use Consul on Kubernetes, enable the service mesh injector in your Consul Helm chart and Consul automatically adds a sidecar to each of your pods using the Kubernetes `Service` definition as a reference. You can specify upstream annotations in the `Deployment` definition to bind upstream services to the pods. +Refer to [`connectInject`](/consul/docs/k8s/connect#installation-and-configuration) and [the upstreams annotation documentation](/consul/docs/k8s/annotations-and-labels#consul-hashicorp-com-connect-service-upstreams) for additional information. + +### Multiple services +You can define common characteristics for services in your mesh, such as the admin partition, namespace, or upstreams, by creating and applying a `service-defaults` configuration entry. You can also define override configurations for specific upstreams or service instances. To use `service-defaults` configuraiton entries, you must enable Consul service mesh in your network. + +Refer to [Define Service Defaults](/consul/docs/services/usage/define-services#define-service-defaults) for additional information. \ No newline at end of file diff --git a/website/content/docs/services/usage/checks.mdx b/website/content/docs/services/usage/checks.mdx new file mode 100644 index 00000000000..99d26c72229 --- /dev/null +++ b/website/content/docs/services/usage/checks.mdx @@ -0,0 +1,592 @@ +--- +layout: docs +page_title: Define Health Checks +description: -> + Learn how to configure different types of health checks for services you register with Consul. +--- + +# Define Health Checks +This topic describes how to create different types of health checks for your services. + + +## Overview +Health checks are configurations that verifies the health of a service or node. Health checks configurations are nested in the `service` block. Refer to [Define Services](/consul/docs/services/usage/define-services) for information about specifying other service parameters. + +You can define individual health checks for your service in separate `check` blocks or define multiple checks in a `checks` block. Refer to [Define multiple checks](#define-multiple-checks) for additional information. + +You can create several different kinds of checks: + +- _Script_ checks invoke an external application that performs the health check, exits with an appropriate exit code, and potentially generates output. Script checks are one of the most common types of checks. +- _HTTP_ checks make an HTTP GET request to the specified URL and wait for the specified amount of time. HTTP checks are one of the most common types of checks. +- _TCP_ checks attempt to connect to an IP or hostname and port over TCP and wait for the specified amount of time. +- _UDP_ checks send UDP datagrams to the specified IP or hostname and port and wait for the specified amount of time. +- _Time-to-live (TTL)_ checks are passive checks that await updates from the service. If the check does not receive a status update before the specified duration, the health check enters a `critical`state. +- _Docker_ checks are dependent on external applications packaged with a Docker container that are triggered by calls to the Docker `exec` API endpoint. +- _gRPC_ checks probe applications that support the standard gRPC health checking protocol. +- _H2ping_ checks test an endpoint that uses http2. The check connects to the endpoint and sends a ping frame. +- _Alias_ checks represent the health state of another registered node or service. + +If your network runs in a Kubernetes environment, you can sync service health information with Kubernetes health checks. Refer to [Configure Health Checks for Consul on Kubernetes](/consul/docs/k8s/connect/health) for details. + +### Registration + +After defining health checks, you must register the service containing the checks with Consul. Refer to [Register Services and Health Checks](/consul/docs/services/usage/register-services-checks) for additional information. If the service is already registered, you can reload the service configuration file to implement your health check. Refer to [Reload](/consul/commands/reload) for additional information. + +## Define multiple checks + +You can define multiple checks for a service in a single `checks` block. The `checks` block contains an array of objects. The objects contain the configuration for each health check you want to implement. The following example includes two script checks named `mem` and `cpu` and an HTTP check that calls the `/health` API endpoint. + + + +```hcl +checks = [ + { + id = "chk1" + name = "mem" + args = ["/bin/check_mem", "-limit", "256MB"] + interval = "5s" + }, + { + id = "chk2" + name = "/health" + http = "http://localhost:5000/health" + interval = "15s" + }, + { + id = "chk3" + name = "cpu" + args = ["/bin/check_cpu"] + interval = "10s" + }, + ... +] +``` + +```json +{ + "checks": [ + { + "id": "chk1", + "name": "mem", + "args": ["/bin/check_mem", "-limit", "256MB"], + "interval": "5s" + }, + { + "id": "chk2", + "name": "/health", + "http": "http://localhost:5000/health", + "interval": "15s" + }, + { + "id": "chk3", + "name": "cpu", + "args": ["/bin/check_cpu"], + "interval": "10s" + }, + ... + ] +} +``` + + + +## Define initial health check status +When checks are registered against a Consul agent, they are assigned a `critical` status by default. This prevents services from registering as `passing` and entering the service pool before their health is verified. You can add the `status` parameter to the check definition to specify the initial state. In the following example, the check registers in a `passing` state: + + + +```hcl +check = { + id = "mem" + args = ["/bin/check_mem", "-limit", "256MB"] + interval = "10s" + status = "passing" +} +``` + +```json +{ + "check": [ + { + "args": [ + "/bin/check_mem", + "-limit", + "256MB" + ], + "id": "mem", + "interval": "10s", + "status": "passing" + } + ] +} +``` + + + +## Script checks +Script checks invoke an external application that performs the health check, exits with an appropriate exit code, and potentially generates output data. The output of a script check is limited to 4KB. Outputs that exceed the limit are truncated. + +Script checks timeout after 30 seconds by default, but you can configure a custom script check timeout value by specifying the `timeout` field in the check definition. When the timeout is reached on Windows, Consul waits for any child processes spawned by the script to finish. For any other system, Consul attempts to force-kill the script and any child processes it has spawned once the timeout has passed. + +### Script check configuration +To enable script checks, you must first enable the agent to send external requests, then configure the health check settings in the service definition: + +1. Add one of the following configurations to your agent configuration file to enable a script check: + - [`enable_local_script_checks`](/consul/docs/agent/config/cli-flags#enable_local_script_checks): Enable script checks defined in local configuration files. Script checks registered using the HTTP API are not allowed. + - [`enable_script_checks`](/consul/docs/agent/config/cli-flags#enable_script_checks): Enable script checks no matter how they are registered. + + !> **Security warning:** Enabling non-local script checks in some configurations may introduce a known remote execution vulnerability targeted by malware. We strongly recommend `enable_local_script_checks` instead. + +1. Specify the script to run in the `args` of the `check` block in your service configuration file. In the following example, a check named `Memory utilization` invokes the `check_mem.py` script every 10 seconds and times out if a response takes longer than one second: + + + + ```hcl + service { + ## ... + check = { + id = "mem-util" + name = "Memory utilization" + args = ["/usr/local/bin/check_mem.py", "-limit", "256MB"] + interval = "10s" + timeout = "1s" + } + } + ``` + + ```json + { + "service": [ + { + "check": { + "id": "mem-util", + "name": "Memory utilization", + "args": ["/usr/local/bin/check_mem.py", "-limit", "256MB"], + "interval": "10s", + "timeout": "1s" + } + } ] + } + ``` + + +Refer to [Health Checks Configuration Reference](/consul/docs/services/configuration/checks-configuration-reference) for information about all health check configurations. + +### Script check exit codes +The following exit codes returned by the script check determine the health check status: + +- Exit code 0 - Check is passing +- Exit code 1 - Check is warning +- Any other code - Check is failing + +Any output of the script is captured and made available in the `Output` field of checks included in HTTP API responses. Refer to the example described in the [local service health endpoint](/consul/api-docs/agent/service#by-name-json). + +## HTTP checks +_HTTP_ checks send an HTTP request to the specified URL and report the service health based on the [HTTP response code](#http-check-response-codes). We recommend using HTTP checks over [script checks](#script-checks) that use cURL or another external process to check an HTTP operation. + +### HTTP check configuration +Add an `http` field to the `check` block in your service definition file and specify the HTTP address, including port number, for the check to call. All other fields are optional. Refer to [Health Checks Configuration Reference](/consul/docs/services/configuration/checks-configuration-reference) for information about all health check configurations. + +In the following example, an HTTP check named `HTTP API on port 5000` sends a `POST` request to the `health` endpoint every 10 seconds: + + + +```hcl +check = { + id = "api" + name = "HTTP API on port 5000" + http = "https://localhost:5000/health" + tls_server_name = "" + tls_skip_verify = false + method = "POST" + header = { + Content-Type = ["application/json"] + } + body = "{\"method\":\"health\"}" + disable_redirects = true + interval = "10s" + timeout = "1s" +} +``` + +```json +{ + "check": { + "id": "api", + "name": "HTTP API on port 5000", + "http": "https://localhost:5000/health", + "tls_server_name": "", + "tls_skip_verify": false, + "method": "POST", + "header": { "Content-Type": ["application/json"] }, + "body": "{\"method\":\"health\"}", + "interval": "10s", + "timeout": "1s" + } +} +``` + + +HTTP checks send GET requests by default, but you can specify another request method in the `method` field. You can send additional headers in the `header` block. The `header` block contains a key and an array of strings, such as `{"x-foo": ["bar", "baz"]}`. By default, HTTP checks timeout at 10 seconds, but you can specify a custom timeout value in the `timeout` field. + +HTTP checks expect a valid TLS certificate by default. You can disable certificate verification by setting the `tls_skip_verify` field to `true`. When using TLS and a host name is specified in the `http` field, the check automatically determines the SNI from the URL. If the `http` field is configured with an IP address or if you want to explicitly set the SNI, specify the name in the `tls_server_name` field. + +The check follows HTTP redirects configured in the network by default. Set the `disable_redirects` field to `true` to disable redirects. + +### HTTP check response codes +Responses larger than 4KB are truncated. The HTTP response determines the status of the service: + +- A `200`-`299` response code is healthy. +- A `429` response code indicating too many requests is a warning. +- All other response codes indicate a failure. + + +## TCP checks +TCP checks establish connections to the specified IPs or hosts. If the check successfully establishes a connection, the service status is reported as `success`. If the IP or host does not accept the connection, the service status is reported as `critical`. We recommend TCP checks over [script checks](#script-checks) that use netcat or another external process to check a socket operation. + +### TCP check configuration +Add a `tcp` field to the `check` block in your service definition file and specify the address, including port number, for the check to call. All other fields are optional. Refer to [Health Checks Configuration Reference](/consul/docs/services/configuration/health-checks-configuration) for information about all health check configurations. + +In the following example, a TCP check named `SSH TCP on port 22` attempts to connect to `localhost:22` every 10 seconds: + + + + +```hcl +check = { + id = "ssh" + name = "SSH TCP on port 22" + tcp = "localhost:22" + interval = "10s" + timeout = "1s" +} +``` + +```json +{ + "check": { + "id": "ssh", + "name": "SSH TCP on port 22", + "tcp": "localhost:22", + "interval": "10s", + "timeout": "1s" + } +} +``` + + + +If a hostname resolves to an IPv4 and an IPv6 address, Consul attempts to connect to both addresses. The first successful connection attempt results in a successful check. + +By default, TCP check requests timeout at 10 seconds, but you can specify a custom timeout in the `timeout` field. + +## UDP checks +UDP checks direct the Consul agent to send UDP datagrams to the specified IP or hostname and port. The check status is set to `success` if any response is received from the targeted UDP server. Any other result sets the status to `critical`. + +### UDP check configuration +Add a `udp` field to the `check` block in your service definition file and specify the address, including port number, for sending datagrams. All other fields are optional. Refer to [Health Checks Configuration Reference](/consul/docs/services/configuration/checks-configuration-reference) for information about all health check configurations. + +In the following example, a UDP check named `DNS UDP on port 53` sends datagrams to `localhost:53` every 10 seconds: + + + +```hcl +check = { + id = "dns" + name = "DNS UDP on port 53" + udp = "localhost:53" + interval = "10s" + timeout = "1s" +} +``` + +```json +{ + "check": { + "id": "dns", + "name": "DNS UDP on port 53", + "udp": "localhost:53", + "interval": "10s", + "timeout": "1s" + } +} +``` + + + +By default, UDP checks timeout at 10 seconds, but you can specify a custom timeout in the `timeout` field. If any timeout on read exists, the check is still considered healthy. + +## OSService check +OSService checks if an OS service is running on the host. OSService checks support Windows services on Windows hosts or SystemD services on Unix hosts. The check logs the service as `healthy` if it is running. If the service is not running, the status is logged as `critical`. All other results are logged with `warning`. A `warning` status indicates that the check is not reliable because an issue is preventing it from determining the health of the service. + +### OSService check configurations +Add an `os_service` field to the `check` block in your service definition file and specify the name of the service to check. All other fields are optional. Refer to [Health Checks Configuration Reference](/consul/docs/services/configuration/checks-configuration-reference] for information about all health check configurations. + +In the following example, an OSService check named `svcname-001 Windows Service Health` verifies that the `myco-svctype-svcname-001` service is running every 10 seconds: + + + +```hcl +check = { + id = "myco-svctype-svcname-001" + name = "svcname-001 Windows Service Health" + service_id = "flash_pnl_1" + os_service = "myco-svctype-svcname-001" + interval = "10s" +} +``` + +```json +{ + "check": { + "id": "myco-svctype-svcname-001", + "name": "svcname-001 Windows Service Health", + "service_id": "flash_pnl_1", + "os_service": "myco-svctype-svcname-001", + "interval": "10s" + } +} +``` + + + +## TTL checks +Time-to-live (TTL) checks wait for an external process to report the service's state to a Consul [`/agent/check` HTTP endpoint](/consul/api-docs/agent/check). If the check does not receive an update before the specified `ttl` duration, the check logs the service as `critical`. For example, if a healthy application is configured to periodically send a `PUT` request a status update to the HTTP endpoint, then the health check logs a `critical` state if the application is unable to send the update before the TTL expires. The check uses the following endpoints to update health information: + +- [pass](/consul/api-docs/agent/check#ttl-check-pass) +- [warn] (/consul/api-docs/agent/check#ttl-check-warn) +- [fail](/consul/api-docs/agent/check#ttl-check-fail) +- [update](/consul/api-docs/agent/check#ttl-check-update) + +TTL checks also persist their last known status to disk so that the Consul agent can restore the last known status of the check across restarts. Persisted check status is valid through the end of the TTL from the time of the last check. + +You can manually mark a service as unhealthy using the [`consul maint` CLI command](/consul/commands/maint) or [`agent/maintenance` HTTP API endpoint](/consul/api-docs/agent#enable-maintenance-mode), rather than waiting for a TTL health check if the `ttl` duration is high. + +### TTL check configuration +Add a `ttl` field to the `check` block in your service definition file and specify how long to wait for an update from the external process. All other fields are optional. Refer to [Health Checks Configuration Reference](/consul/docs/services/configuration/checks-configuration-reference] for information about all health check configurations. + +In the following example, a TTL check named `Web App Status` logs the application as `critical` if a status update is not received every 30 seconds: + + + + +```hcl +check = { + id = "web-app" + name = "Web App Status" + notes = "Web app does a curl internally every 10 seconds" + ttl = "30s" +} +``` + +```json +{ + "check": { + "id": "web-app", + "name": "Web App Status", + "notes": "Web app does a curl internally every 10 seconds", + "ttl": "30s" + } +} +``` + + + +## Docker checks +Docker checks invoke an application packaged within a Docker container. The application should perform a health check and exit with an appropriate exit code. + +The application is triggered within the running container through the Docker `exec` API. You should have access to either the Docker HTTP API or the Unix socket. Consul uses the `$DOCKER_HOST` environment variable to determine the Docker API endpoint. + +The output of a Docker check is limited to 4KB. Larger outputs are truncated. + +### Docker check configuration +To enable Docker checks, you must first enable the agent to send external requests, then configure the health check settings in the service definition: + +1. Add one of the following configurations to your agent configuration file to enable a Docker check: + + - [`enable_local_script_checks`](/consul/docs/agent/config/cli-flags#enable_local_script_checks): Enable script checks defined in local config files. Script checks registered using the HTTP API are not allowed. + + - [`enable_script_checks`](/consul/docs/agent/config/cli-flags#enable_script_checks): Enable script checks no matter how they are registered. + + !> **Security warning**: Enabling non-local script checks in some configurations may introduce a known remote execution vulnerability targeted by malware. We strongly recommend `enable_local_script_checks` instead. +1. Configure the following fields in the `check` block in your service definition file: + - `docker_container_id`: The `docker ps` command is a common way to get the ID. + - `shell`: Specifies the shell to use for performing the check. Different containers can run different shells on the same host. + - `args`: Specifies the external application to invoke. + - `interval`: Specifies the interval for running the check. + +In the following example, a Docker check named `Memory utilization` invokes the `check_mem.py` application in container `f972c95ebf0e` every 10 seconds: + + + + +```hcl +check = { + id = "mem-util" + name = "Memory utilization" + docker_container_id = "f972c95ebf0e" + shell = "/bin/bash" + args = ["/usr/local/bin/check_mem.py"] + interval = "10s" +} +``` + +```json +{ + "check": { + "id": "mem-util", + "name": "Memory utilization", + "docker_container_id": "f972c95ebf0e", + "shell": "/bin/bash", + "args": ["/usr/local/bin/check_mem.py"], + "interval": "10s" + } +} +``` + + + +## gRPC checks +gRPC checks send a request to the specified endpoint. These checks are intended for applications that support the standard [gRPC health checking protocol](https://github.com/grpc/grpc/blob/master/doc/health-checking.md). + +### gRPC check configuration +Add a `grpc` field to the `check` block in your service definition file and specify the endpoint, including port number, for sending requests. All other fields are optional. Refer to [Health Checks Configuration Reference](/consul/docs/services/configuration/checks-configuration-reference] for information about all health check configurations. + +In the following example, a gRPC check named `Service health status` probes the entire application by sending requests to `127.0.0.1:12345` every 10 seconds: + + + +```hcl +check = { + id = "mem-util" + name = "Service health status" + grpc = "127.0.0.1:12345" + grpc_use_tls = true + interval = "10s" +} +``` + +```json +{ + "check": { + "id": "mem-util", + "name": "Service health status", + "grpc": "127.0.0.1:12345", + "grpc_use_tls": true, + "interval": "10s" + } +} +``` + + + +gRPC checks probe the entire gRPC server, but you can check on a specific service by adding the service identifier after the gRPC check's endpoint using the following format: `/:service_identifier`. + +In the following example, a gRPC check probes `my_service` in the application at `127.0.0.1:12345` every 10 seconds: + + + + +```hcl +check = { + id = "mem-util" + name = "Service health status" + grpc = "127.0.0.1:12345/my_service" + grpc_use_tls = true + interval = "10s" +} +``` + +```json +{ + "check": { + "id": "mem-util", + "name": "Service health status", + "grpc": "127.0.0.1:12345/my_service", + "grpc_use_tls": true, + "interval": "10s" + } +} +``` + + + +TLS is disabled for gRPC checks by default. You can enable TLS by setting `grpc_use_tls` to `true`. If TLS is enabled, you must either provide a valid TLS certificate or disable certificate verification by setting the `tls_skip_verify` field to `true`. + +By default, gRPC checks timeout after 10 seconds, but you can specify a custom duration in the `timeout` field. + +## H2ping checks +H2ping checks test an endpoint that uses HTTP2 by connecting to the endpoint and sending a ping frame. If the endpoint sends a response within the specified interval, the check status is set to `success`. + +### H2ping check configuration +Add an `h2ping` field to the `check` block in your service definition file and specify the HTTP2 endpoint, including port number, for the check to ping. All other fields are optional. Refer to [Health Checks Configuration Reference](/consul/docs/services/configuration/checks-configuration-reference) for information about all health check configurations. + +In the following example, an H2ping check named `h2ping` pings the endpoint at `localhost:22222` every 10 seconds: + + + + +```hcl +check = { + id = "h2ping-check" + name = "h2ping" + h2ping = "localhost:22222" + interval = "10s" + h2ping_use_tls = false +} +``` + +```json +{ + "check": { + "id": "h2ping-check", + "name": "h2ping", + "h2ping": "localhost:22222", + "interval": "10s", + "h2ping_use_tls": false + } +} +``` + + + +TLS is enabled by default, but you can disable TLS by setting `h2ping_use_tls` to `false`. When TLS is disabled, the Consul sends pings over h2c. When TLS is enabled, a valid certificate is required unless `tls_skip_verify` is set to `true`. + +By default, H2ping checks timeout at 10 seconds, but you can specify a custom duration in the `timeout` field. + + +## Alias checks +Alias checks continuously report the health state of another registered node or service. If the alias experiences errors while watching the actual node or service, the check reports a`critical` state. Consul updates the alias and actual node or service state asynchronously but nearly instantaneously. + +For aliased services on the same agent, the check monitors the local state without consuming additional network resources. For services and nodes on different agents, the check maintains a blocking query over the agent's connection with a current server and allows stale requests. + +### ACLs +For the blocking query, the alias check presents the ACL token set on the actual service or the token configured in the check definition. If neither are available, the alias check falls back to the default ACL token set for the agent. Refer to [`acl.tokens.default`](/consul/docs/agent/config/config-files#acl_tokens_default) for additional information about the default ACL token. + +### Alias checks configuration +Add an `alias_service` field to the `check` block in your service definition file and specify the name of the service or node to alias. All other fields are optional. Refer to [Health Checks Configuration Reference](/consul/docs/services/configuration/checks-configuration-reference] for information about all health check configurations. + +In the following example, an alias check with the ID `web-alias` reports the health state of the `web` service: + + + + +```hcl +check = { + id = "web-alias" + alias_service = "web" +} +``` + +```json +{ + "check": { + "id": "web-alias", + "alias_service": "web" + } +} +``` + + + +By default, the alias must be registered with the same Consul agent as the alias check. If the service is not registered with the same agent, you must specify `"alias_node": ""` in the `check` configuration. If no service is specified and the `alias_node` field is enabled, the check aliases the health of the node. If a service is specified, the check will alias the specified service on this particular node. \ No newline at end of file diff --git a/website/content/docs/services/usage/define-services.mdx b/website/content/docs/services/usage/define-services.mdx new file mode 100644 index 00000000000..35df236668d --- /dev/null +++ b/website/content/docs/services/usage/define-services.mdx @@ -0,0 +1,366 @@ +--- +layout: docs +page_title: Define Services +description: >- + Learn how to define services so that they are discoverable in your network. +--- + +# Define Services + +This topic describes how to define services so that they can be discovered by other services. Refer to [Services Overview](/consul/docs/services/services) for additional information. + +## Overview + +You must tell Consul about the services deployed to your network if you want them to be discoverable. You can define services in a configuration file or send the service definition parameters as a payload to the `/agent/service/register` API endpoint. Refer to [Register Services and Health Checks](/consul/docs/services/usage/register-services-checks) for details about how to register services with Consul. + +You can define multiple services individually using `service` blocks or group multiple services into the same `services` configuration block. Refer to [Define multiple services in a single file](#define-multiple-services-in-a-single-file) for additional information. + +If Consul service mesh is enabled in your network, you can use the `service-defaults` configuration entry to specify default global values for services. The configuraiton entry lets you define common service parameter, such as upstreams, namespaces, and partitions. Refer to [Define service defaults](#define-service-defaults) for additional information. + +## Requirements + +The core service discovery features are available in all versions of Consul. + +### Service defaults +To use the [service defaults configuration entry](#define-service-defaults), verify that your installation meets the following requirements: + +- Consul 1.5.0+ +- Consul 1.8.4+ is required to use the `ServiceDefaults` custom resource on Kubernetes + +### ACLs +If ACLs are enabled, resources in your network must present a token with `service:read` access to read a service defaults configuration entry. + +You must also present a token with `service:write` access to create, update, or delete a service defaults configuration entry. + +Service configurations must also contain and present an ACL token to perform anti-entropy syncs and deregistration operations. Refer to [Modify anti-entropy synchronozation](#modify-anti-entropy-synchronization) for additional information. + +On Consul Enterprise, you can register services with specific namespaces if the services' ACL tokens are scoped to the namespace. Services registered with a service definition do not inherit the namespace associated with the ACL token specified in the `token` field. The `namespace` and the `token` parameters must be included in the service definition for the service to be registered to the namespace that the ACL token is scoped to. + +## Define a service +Create a file for your service configurations and add a `service` block. The `service` block contains the parameters that configure various aspects of the service, including how it is discovered by other services in the network. The only required parameter is `name`. Refer to [Service Definition Reference](/consul/docs/services/configuration/services-configuration-reference) for details about the configuration options. + +For Kubernetes environments, you can enable the [`connectInject`](/consul/docs/k8s/connect#installation-and-configuration) configuration in your Consul Helm chart so that Consul automatically adds a sidecar to each of your pods. Consul uses the Kubernetes `Service` definition as a reference. + +The following example defines a service named `redis` that is available on port `80`. By default, the service has the IP address of the agent node. + + + + +```hcl +service { + name = "redis" + id = "redis" + port = 80 + tags = ["primary"] + + meta = { + custom_meta_key = "custom_meta_value" + } + + tagged_addresses = { + lan = { + address = "192.168.0.55" + port = 8000 + } + + wan = { + address = "198.18.0.23" + port = 80 + } + } +} +``` + + + + +```json +{ + "service": [ + { + "id": "redis", + "meta": [ + { + "custom_meta_key": "custom_meta_value" + } + ], + "name": "redis", + "port": 80, + "tagged_addresses": [ + { + "lan": [ + { + "address": "192.168.0.55", + "port": 8000 + } + ], + "wan": [ + { + "address": "198.18.0.23", + "port": 80 + } + ] + } + ], + "tags": [ + "primary" + ] + } + ] +} +``` + + + +```yaml +service: +- id: redis + meta: + - custom_meta_key: custom_meta_value + name: redis + port: 80 + tagged_addresses: + - lan: + - address: 192.168.0.55 + port: 8000 + wan: + - address: 198.18.0.23 + port: 80 + tags: + - primary +``` + + + +### Health checks + +You can add a `check` or `checks` block to your service configuration to define one or more health checks that monitor the health of your services. Refer to [Define Health Checks](/consul/docs/services/usage/checks) for additional information. + +### Register a service + +You can register your service using the [`consul services` command](/consul/commands/services) or by calling the [`/agent/services` API endpoint](/consul/api-docs/agent/services). Refer to [Register Services and Health Checks](/consul/docs/services/usage/register-services-checks) for details. + +## Define service defaults +If Consul service mesh is enabled in your network, you can define default values for services in your mesh by creating and applying a `service-defaults` configuration entry containing. Refer to [Service Mesh Configuration Overview](/consul/docs/connect/configuration) for additional information. + +Create a file for the configuration entry and specify the required fields. If you are authoring `service-defaults` in HCL or JSON, the `Kind` and `Name` fields are required. On Kubernetes, the `apiVersion`, `kind`, and `metadata.name` fields are required. Refer to [Service Defaults Reference](/consul/docs/connect/config-entries/service-defaults) for details about the configuration options. + +The following example instructs services named `counting` to send up to `512` concurrent requests to a mesh gateway: + + + +```hcl +Kind = "service-defaults" +Name = "counting" + +UpstreamConfig = { + Defaults = { + MeshGateway = { + Mode = "local" + } + Limits = { + MaxConnections = 512 + MaxPendingRequests = 512 + MaxConcurrentRequests = 512 + } + } + + Overrides = [ + { + Name = "dashboard" + MeshGateway = { + Mode = "remote" + } + } + ] +} +``` +```yaml +apiVersion: consul.hashicorp.com/v1alpha1 +kind: ServiceDefaults +metadata: + name: counting +spec: + upstreamConfig: + defaults: + meshGateway: + mode: local + limits: + maxConnections: 512 + maxPendingRequests: 512 + maxConcurrentRequests: 512 + overrides: + - name: dashboard + meshGateway: + mode: remote +``` +```json +{ + "Kind": "service-defaults", + "Name": "counting", + "UpstreamConfig": { + "Defaults": { + "MeshGateway": { + "Mode": "local" + }, + "Limits": { + "MaxConnections": 512, + "MaxPendingRequests": 512, + "MaxConcurrentRequests": 512 + } + }, + "Overrides": [ + { + "Name": "dashboard", + "MeshGateway": { + "Mode": "remote" + } + } + ] + } +} +``` + + +### Apply service defaults + +You can apply your `service-defaults` configuration entry using the [`consul config` command](/consul/commands/config) or by calling the [`/config` API endpoint](/consul/api-docs/config). In Kubernetes environments, apply the `service-defaults` custom resource definitions (CRD) to implement and manage Consul configuration entries. + +Refer to the following topics for details about applying configuration entries: +- [How to Use Configuration Entries](/consul/docs/agent/config-entries) +- [Custom Resource Definitions for Consul on Kubernetes](/consul/docs/k8s/crds) + +## Define multiple services in a single file + +The `services` block contains an array of `service` objects. It is a wrapper that enables you to define multiple services in the service definition and instruct Consul to expect more than just a single service configuration. As a result, you can register multiple services in a single `consul services register` command. Note that the `/agent/service/register` API endpoint does not support the `services` parameter. + +In the following example, the service definition configures an instance of the `redis` service tagged as `primary` running on port `6000`. It also configures an instance of the service tagged as `secondary` running on port `7000`. + + + + + +```hcl +services { + id = "red0" + name = "redis" + tags = [ + "primary" + ] + address = "" + port = 6000 + checks = [ + { + args = ["/bin/check_redis", "-p", "6000"] + interval = "5s" + timeout = "20s" + } + ] +} +services { + id = "red1" + name = "redis" + tags = [ + "delayed", + "secondary" + ] + address = "" + port = 7000 + checks = [ + { + args = ["/bin/check_redis", "-p", "7000"] + interval = "30s" + timeout = "60s" + } + ] +} + +``` + + + + + +```json +{ + "services": [ + { + "id": "red0", + "name": "redis", + "tags": [ + "primary" + ], + "address": "", + "port": 6000, + "checks": [ + { + "args": ["/bin/check_redis", "-p", "6000"], + "interval": "5s", + "timeout": "20s" + } + ] + }, + { + "id": "red1", + "name": "redis", + "tags": [ + "delayed", + "secondary" + ], + "address": "", + "port": 7000, + "checks": [ + { + "args": ["/bin/check_redis", "-p", "7000"], + "interval": "30s", + "timeout": "60s" + } + ] + }, + ... + ] +} +``` + + + + +## Modify anti-entropy synchronization + +By default, the Consul agent uses anti-entropy mechanisms to maintain information about services and service health, and synchronize local states with the Consul catalog. You can enable the `enable_tag_override` option in the service configuration, which lets external agents change the tags for a service. This can be useful in situations where an external monitoring service needs to be the source of truth for tag information. Refer [Anti-entropy](/consul/docs/architecture/anti-entropy) for details. + +Add the `enable_tag_override` option to the `service` block and set the value to `true`: + + + + +```hcl +service { + ## ... + enable_tag_override = true + ## ... +} +``` + +```json +"service": { + ## ... + "enable_tag_override": true, + ## ... +} +``` + + + +This configuration only applies to the locally registered service. Nodes that register the same service apply the `enable_tag_override` and other service configurations independently. The tags for a service registered on one node update are not affected by operations performed on services with the same name registered on other nodes. + +Refer to [`enable_tag_override`](/consul/docs/services/configuration/services-configuration-reference#enable_tag_override) for additional configuration information. + +## Services in service mesh environments +Defining services for service mesh environments on virtual machines and in Kubernetes requires a different workflow. + +### Define service mesh proxies +You can register services to function as service mesh or sidecar proxies so that they can facilitate communication between other services across your network. Refer to [Service Mesh Proxy Overview](/consul/docs/connect/registration) for additional information. + +### Define services in Kubernetes +You can enable the services running in Kubernetes and Consul to sync automatically. Doing so ensures that Kubernetes services are available to Consul agents and services in Consul can be available as first-class Kubernetes services. Refer to [Service Sync for Consul on Kubernetes](/consul/docs/k8s/service-sync) for details. \ No newline at end of file diff --git a/website/content/docs/services/usage/register-services-checks.mdx b/website/content/docs/services/usage/register-services-checks.mdx new file mode 100644 index 00000000000..fca829a00e1 --- /dev/null +++ b/website/content/docs/services/usage/register-services-checks.mdx @@ -0,0 +1,67 @@ +--- +layout: docs +page_title: Register Services and Health Checks +description: -> + Learn how to register services and health checks with Consul agents. +--- + +# Register Services and Health Checks +This topic describes how to register services and health checks with Consul in networks running on virtual machines (VM). Refer to [Define Services](/consul/usage/services/usage/define-services) and [Define Health Checks](/consul/usage/services/usage/checks) for information about how to define services and health checks. + +## Overview +Register services and health checks in VM environments by providing the service definition to a Consul agent. You can use several different methods to register services and health checks. + +- Start a Consul agent and pass the service definition in the [agent's configuration directory](/consul/docs/agent#configuring-consul-agents). +- Reload the a running Consul agent and pass the service definition in the [agent's configuration directory](/consul/docs/agent#configuring-consul-agents). Use this method when implementing changes to an existing service or health check definition. +- Use the [`consul services register` command](/consul/commands/services/register) to register new service and health checks with a running Consul agent. +- Call the [`/agent/service/register`](/consul/api-docs/agent/service#register-service) HTTP API endpoint to to register new service and health checks with a running Consul agent. +- Call the [`/agent/check/register`](/consul/api-docs/agent/check#register-check) HTTP API endpoint to register a health check independent from the service. + +When a service is registered using the HTTP API endpoint or CLI command, the checks persist in the Consul data folder. If the agent restarts, Consul uses the service and check configurations in the configuration directory to start the services. + +Note that health checks associated with a service are application-level checks. + +## Start an agent +We recommend registering services on startup because the service persists if the agent fails. Specify the directory containing the service definition with the `-config-dir` option on startup. When the Consul agent starts, it processes all configurations in the directory and registers any services contained in the configurations. In the following example, the Consul agent starts and loads the configurations contained in the `configs` directory: + +```shell-session +$ consul agent -config-dir configs +``` + +Refer to [Starting the Consul Agent](/consul/docs/agent#starting-the-consul-agent) for additional information. + +## Reload an agent +Store your service definition file in the directory containing your Consul configuration files and either send a `SIGHUP` signal to the Consul agent service or run the `consul reload` command. Refer to [Consul Reload](/consul/commands/reload) for additional information. + +## Register using the CLI +Run the `consul services register` command and specify the service definition file to register the services and health checks defined in the file. In the following example, a service named `web` is registered: + +```shell-session +$ consul services register -name=web services.hcl +``` + +Refer to [Consul Agent Service Registration](/consul/commands/services/register) for additional information about using the command. + +## Register using the API + +Use the following methods to register services and health checks using the HTTP API. + +### Register services +Send a `PUT` request to the `/agent/service/register` API endpoint to dynamically register a service and its associated health checks. To register health checks independently, [call the checks API endpoint](#call-the-checks-http-api-endpoint). + +The following example request registers the service defined in the `service.json` file. + +```shell-session +$ curl --request PUT --data @service.json http://localhost:8500/v1/agent/service/register +``` + +Refer to [Service - Agent HTTP API](/consul/api-docs/agent/service) for additional information about the `services` endpoint. + +### Register health checks +Send a `PUT` request to the `/agent/check/register` API endpoint to dynamically register a health check to the local Consul agent. The following example request registers a health check defined in a `payload.json` file. + +```shell-session +$ curl --request PUT --data @payload.json http://localhost:8500/v1/agent/check/register +``` + +Refer to [Check - Agent HTTP API](/consul/api-docs/check/service) for additional information about the `check` endpoint. diff --git a/website/content/docs/troubleshoot/troubleshoot-services.mdx b/website/content/docs/troubleshoot/troubleshoot-services.mdx index 3451d2e5067..92a66881475 100644 --- a/website/content/docs/troubleshoot/troubleshoot-services.mdx +++ b/website/content/docs/troubleshoot/troubleshoot-services.mdx @@ -13,7 +13,7 @@ For more information, refer to the [`consul troubleshoot` CLI documentation](/co ## Introduction -When communication between upstream and downstream services in a service mesh fails, you can diagnose the cause manually with one or more of Consul’s built-in features, including [health check queries](/consul/docs/discovery/checks), [the UI topology view](/consul/docs/connect/observability/ui-visualization), and [agent telemetry metrics](/consul/docs/agent/telemetry#metrics-reference). +When communication between upstream and downstream services in a service mesh fails, you can diagnose the cause manually with one or more of Consul’s built-in features, including [health check queries](/consul/docs/services/usage/checks), [the UI topology view](/consul/docs/connect/observability/ui-visualization), and [agent telemetry metrics](/consul/docs/agent/telemetry#metrics-reference). The `consul troubleshoot` command performs several checks in sequence that enable you to discover issues that impede service-to-service communication. The process systematically queries the [Envoy administration interface API](https://www.envoyproxy.io/docs/envoy/latest/operations/admin) and the Consul API to determine the cause of the communication failure. @@ -100,7 +100,7 @@ In the example output, troubleshooting upstream communication reveals that the ` ! No healthy endpoints for cluster "backend2.default.dc1.internal.e08fa6d6-e91e-dfe0-f6e1-ba097a828e31.consul" for upstream "backend" found ``` -The output from the troubleshooting process identifies service instances according to their [Consul DNS address](/consul/docs/discovery/dns#standard-lookup). Use the DNS information for failing services to diagnose the specific issues affecting the service instance. +The output from the troubleshooting process identifies service instances according to their [Consul DNS address](/consul/docs/services/discovery/dns-static-lookups#standard-lookup). Use the DNS information for failing services to diagnose the specific issues affecting the service instance. For more information, refer to the [`consul troubleshoot` CLI documentation](/consul/commands/troubleshoot). diff --git a/website/content/docs/upgrading/upgrade-specific.mdx b/website/content/docs/upgrading/upgrade-specific.mdx index 07d456ad816..06997760e35 100644 --- a/website/content/docs/upgrading/upgrade-specific.mdx +++ b/website/content/docs/upgrading/upgrade-specific.mdx @@ -990,11 +990,9 @@ config files loaded by Consul, even when using the [`-config-file`](/consul/docs/agent/config/cli-flags#_config_file) argument to specify a file directly. -#### Service Definition Parameter Case changed +#### Use Snake Case for Service Definition Parameters -All config file formats now require snake_case fields, so all CamelCased parameter -names should be changed before upgrading. -See [Service Definition Parameter Case](/consul/docs/discovery/services#service-definition-parameter-case) documentation for details. +Snake case, which is a convention that uses underscores between words in a configuration key, is required for all configuration file formats. Change any camel cased parameter to snake case equivalents before upgrading. #### Deprecated Options Have Been Removed diff --git a/website/data/docs-nav-data.json b/website/data/docs-nav-data.json index 23cc2d5d1aa..9b53bd05117 100644 --- a/website/data/docs-nav-data.json +++ b/website/data/docs-nav-data.json @@ -303,19 +303,70 @@ "divider": true }, { - "title": "Service Discovery", + "title": "Services", "routes": [ { - "title": "Register Services - Service Definitions", - "path": "discovery/services" + "title": "Services Overview", + "path": "services/services" }, { - "title": "Find Services - DNS Interface", - "path": "discovery/dns" + "title": "Define and Register", + "routes": [ + { + "title": "Define Services", + "path": "services/usage/define-services" + }, + { + "title": "Define Health Checks", + "path": "services/usage/checks" + }, + { + "title": "Register Services and Health Checks", + "path": "services/usage/register-services-checks" + } + ] + }, + { + "title": "Service Discovery", + "routes": [ + { + "title": "DNS Usage Overview", + "path": "services/discovery/dns-overview" + }, + { + "title": "Configure Consul DNS Behavior", + "path": "services/discovery/dns-configuration" + }, + { + "title": "Perform Static DNS Lookups", + "path": "services/discovery/dns-static-lookups" + }, + { + "title": "Enable Dynamic DNS Lookups", + "path": "services/discovery/dns-dynamic-lookups" + } + ] }, { - "title": "Monitor Services - Check Definitions", - "path": "discovery/checks" + "title": "Configuration", + "routes": [ + { + "title": "Services Configuration Overview", + "path": "services/configuration/services-configuration-overview" + }, + { + "title": "Services Configuration Reference", + "path": "services/configuration/services-configuration-reference" + }, + { + "title": "Health Checks Configuration Reference", + "path": "services/configuration/checks-configuration-reference" + }, + { + "title": "Service Defaults Configuration Reference", + "href": "connect/config-entries/service-defaults" + } + ] } ] }, @@ -459,11 +510,6 @@ { "title": "Proxy Integration", "path": "connect/proxies/integrate" - }, - { - "title": "Managed (Deprecated)", - "path": "connect/proxies/managed-deprecated", - "hidden": true } ] }, From be800f02776e5d98e41beafe38dcb42449a4576d Mon Sep 17 00:00:00 2001 From: skpratt Date: Tue, 28 Feb 2023 16:46:03 -0600 Subject: [PATCH 085/262] docs: clarify license expiration upgrade behavior (#16464) --- website/content/docs/enterprise/license/faq.mdx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/website/content/docs/enterprise/license/faq.mdx b/website/content/docs/enterprise/license/faq.mdx index 02841e9c6cf..4221762b2df 100644 --- a/website/content/docs/enterprise/license/faq.mdx +++ b/website/content/docs/enterprise/license/faq.mdx @@ -74,6 +74,8 @@ after license expiration and is defined in ~> **Starting with Consul 1.14, and patch releases 1.13.3 and 1.12.6, Consul will support non-terminating licenses**: Please contact your support representative for more details on non-terminating licenses. + An expired license will not allow Consul versions released after the expiration date to run. + It will not be possible to upgrade to a new version of Consul released after license expiration. ## Q: Does this affect client agents? From 4f2d9a91e515b2a54063d398054ca60a04d968e6 Mon Sep 17 00:00:00 2001 From: John Eikenberry Date: Wed, 1 Mar 2023 00:07:33 +0000 Subject: [PATCH 086/262] add provider ca auth-method support for azure Does the required dance with the local HTTP endpoint to get the required data for the jwt based auth setup in Azure. Keeps support for 'legacy' mode where all login data is passed on via the auth methods parameters. Refactored check for hardcoded /login fields. --- .changelog/16298.txt | 3 + agent/connect/ca/provider_vault.go | 3 +- agent/connect/ca/provider_vault_auth.go | 15 +- agent/connect/ca/provider_vault_auth_aws.go | 2 +- agent/connect/ca/provider_vault_auth_azure.go | 142 ++++++++++++++++++ agent/connect/ca/provider_vault_auth_gcp.go | 2 +- agent/connect/ca/provider_vault_auth_test.go | 127 ++++++++++++++++ agent/connect/ca/provider_vault_test.go | 2 +- 8 files changed, 285 insertions(+), 11 deletions(-) create mode 100644 .changelog/16298.txt create mode 100644 agent/connect/ca/provider_vault_auth_azure.go diff --git a/.changelog/16298.txt b/.changelog/16298.txt new file mode 100644 index 00000000000..6d79987eff0 --- /dev/null +++ b/.changelog/16298.txt @@ -0,0 +1,3 @@ +```release-note:improvement +ca: support Vault agent auto-auth config for Vault CA provider using Azure MSI authentication. +``` diff --git a/agent/connect/ca/provider_vault.go b/agent/connect/ca/provider_vault.go index c069e5aa9b3..7954e7ea032 100644 --- a/agent/connect/ca/provider_vault.go +++ b/agent/connect/ca/provider_vault.go @@ -931,6 +931,8 @@ func configureVaultAuthMethod(authMethod *structs.VaultAuthMethod) (VaultAuthent switch authMethod.Type { case VaultAuthMethodTypeAWS: return NewAWSAuthClient(authMethod), nil + case VaultAuthMethodTypeAzure: + return NewAzureAuthClient(authMethod) case VaultAuthMethodTypeGCP: return NewGCPAuthClient(authMethod) case VaultAuthMethodTypeKubernetes: @@ -968,7 +970,6 @@ func configureVaultAuthMethod(authMethod *structs.VaultAuthMethod) (VaultAuthent // The rest of the auth methods use auth/ login API path. case VaultAuthMethodTypeAliCloud, VaultAuthMethodTypeAppRole, - VaultAuthMethodTypeAzure, VaultAuthMethodTypeCloudFoundry, VaultAuthMethodTypeGitHub, VaultAuthMethodTypeJWT, diff --git a/agent/connect/ca/provider_vault_auth.go b/agent/connect/ca/provider_vault_auth.go index 51b9a1b0912..f00e90b7298 100644 --- a/agent/connect/ca/provider_vault_auth.go +++ b/agent/connect/ca/provider_vault_auth.go @@ -76,13 +76,14 @@ func toMapStringString(in map[string]interface{}) (map[string]string, error) { return out, nil } -// containsVaultLoginParams indicates if the provided auth method contains the -// config parameters needed to call the auth//login API directly. -// It compares the keys in the authMethod.Params struct to the provided slice of -// keys and if any of the keys match it returns true. -func containsVaultLoginParams(authMethod *structs.VaultAuthMethod, keys ...string) bool { - for _, key := range keys { - if _, exists := authMethod.Params[key]; exists { +// legacyCheck is used to see if all the parameters needed to /login have been +// hardcoded in the auth-method's config Parameters field. +// Note it returns true if any /login specific fields are found (vs. all). This +// is because the AWS client has multiple possible ways to call /login with +// different parameters. +func legacyCheck(params map[string]any, expectedKeys ...string) bool { + for _, key := range expectedKeys { + if v, ok := params[key]; ok && v != "" { return true } } diff --git a/agent/connect/ca/provider_vault_auth_aws.go b/agent/connect/ca/provider_vault_auth_aws.go index 6188b2cf2e2..6ef19f72791 100644 --- a/agent/connect/ca/provider_vault_auth_aws.go +++ b/agent/connect/ca/provider_vault_auth_aws.go @@ -26,7 +26,7 @@ func NewAWSAuthClient(authMethod *structs.VaultAuthMethod) *VaultAuthClient { "pkcs7", // EC2 PKCS7 "iam_http_request_method", // IAM } - if containsVaultLoginParams(authMethod, keys...) { + if legacyCheck(authMethod.Params, keys...) { return authClient } diff --git a/agent/connect/ca/provider_vault_auth_azure.go b/agent/connect/ca/provider_vault_auth_azure.go new file mode 100644 index 00000000000..e7f7853884e --- /dev/null +++ b/agent/connect/ca/provider_vault_auth_azure.go @@ -0,0 +1,142 @@ +package ca + +import ( + "fmt" + "io" + "net/http" + "strings" + + "github.com/hashicorp/consul/agent/structs" + "github.com/hashicorp/go-cleanhttp" + "github.com/hashicorp/vault/sdk/helper/jsonutil" +) + +func NewAzureAuthClient(authMethod *structs.VaultAuthMethod) (*VaultAuthClient, error) { + params := authMethod.Params + authClient := NewVaultAPIAuthClient(authMethod, "") + // check for login data already in params (for backwards compability) + legacyKeys := []string{ + "vm_name", "vmss_name", "resource_group_name", "subscription_id", "jwt", + } + if legacyCheck(params, legacyKeys...) { + return authClient, nil + } + + role, ok := params["role"].(string) + if !ok || strings.TrimSpace(role) == "" { + return nil, fmt.Errorf("missing 'role' value") + } + resource, ok := params["resource"].(string) + if !ok || strings.TrimSpace(resource) == "" { + return nil, fmt.Errorf("missing 'resource' value") + } + + authClient.LoginDataGen = AzureLoginDataGen + return authClient, nil +} + +var ( // use variables so we can change these in tests + instanceEndpoint = "http://169.254.169.254/metadata/instance" + identityEndpoint = "http://169.254.169.254/metadata/identity/oauth2/token" + // minimum version 2018-02-01 needed for identity metadata + apiVersion = "2018-02-01" +) + +type instanceData struct { + Compute Compute +} +type Compute struct { + Name string + ResourceGroupName string + SubscriptionID string + VMScaleSetName string +} +type identityData struct { + AccessToken string `json:"access_token"` +} + +func AzureLoginDataGen(authMethod *structs.VaultAuthMethod) (map[string]any, error) { + params := authMethod.Params + role := params["role"].(string) + metaConf := map[string]string{ + "role": role, + "resource": params["resource"].(string), + } + if objectID, ok := params["object_id"].(string); ok { + metaConf["object_id"] = objectID + } + if clientID, ok := params["client_id"].(string); ok { + metaConf["client_id"] = clientID + } + + // Fetch instance data + var instance instanceData + body, err := getMetadataInfo(instanceEndpoint, nil) + if err != nil { + return nil, err + } + err = jsonutil.DecodeJSON(body, &instance) + if err != nil { + return nil, fmt.Errorf("error parsing instance metadata response: %w", err) + } + + // Fetch JWT + var identity identityData + body, err = getMetadataInfo(identityEndpoint, metaConf) + if err != nil { + return nil, err + } + err = jsonutil.DecodeJSON(body, &identity) + if err != nil { + return nil, fmt.Errorf("error parsing instance metadata response: %w", err) + } + + data := map[string]interface{}{ + "role": role, + "vm_name": instance.Compute.Name, + "vmss_name": instance.Compute.VMScaleSetName, + "resource_group_name": instance.Compute.ResourceGroupName, + "subscription_id": instance.Compute.SubscriptionID, + "jwt": identity.AccessToken, + } + + return data, nil +} + +func getMetadataInfo(endpoint string, query map[string]string) ([]byte, error) { + req, err := http.NewRequest("GET", endpoint, nil) + if err != nil { + return nil, err + } + + q := req.URL.Query() + q.Add("api-version", apiVersion) + for k, v := range query { + q.Add(k, v) + } + req.URL.RawQuery = q.Encode() + req.Header.Set("Metadata", "true") + req.Header.Set("User-Agent", "Consul") + + client := cleanhttp.DefaultClient() + resp, err := client.Do(req) + if err != nil { + return nil, fmt.Errorf("error fetching metadata from %s: %w", endpoint, err) + } + + if resp == nil { + return nil, fmt.Errorf("empty response fetching metadata from %s", endpoint) + } + + defer resp.Body.Close() + body, err := io.ReadAll(resp.Body) + if err != nil { + return nil, fmt.Errorf("error reading metadata from %s: %w", endpoint, err) + } + + if resp.StatusCode != http.StatusOK { + return nil, fmt.Errorf("error response in metadata from %s: %s", endpoint, body) + } + + return body, nil +} diff --git a/agent/connect/ca/provider_vault_auth_gcp.go b/agent/connect/ca/provider_vault_auth_gcp.go index 38e544d48b6..d498a9830d5 100644 --- a/agent/connect/ca/provider_vault_auth_gcp.go +++ b/agent/connect/ca/provider_vault_auth_gcp.go @@ -16,7 +16,7 @@ func NewGCPAuthClient(authMethod *structs.VaultAuthMethod) (VaultAuthenticator, // perform a direct request to the login API with the config that is provided. // This supports the Vault CA config in a backwards compatible way so that we don't // break existing configurations. - if containsVaultLoginParams(authMethod, "jwt") { + if legacyCheck(authMethod.Params, "jwt") { return NewVaultAPIAuthClient(authMethod, ""), nil } diff --git a/agent/connect/ca/provider_vault_auth_test.go b/agent/connect/ca/provider_vault_auth_test.go index e1398eeb3bb..2b0a04a46fa 100644 --- a/agent/connect/ca/provider_vault_auth_test.go +++ b/agent/connect/ca/provider_vault_auth_test.go @@ -1,7 +1,10 @@ package ca import ( + "encoding/json" "fmt" + "net/http" + "net/http/httptest" "os" "strconv" "testing" @@ -10,6 +13,7 @@ import ( "github.com/hashicorp/consul/agent/structs" "github.com/hashicorp/go-secure-stdlib/awsutil" "github.com/hashicorp/vault/api/auth/gcp" + "github.com/hashicorp/vault/sdk/helper/jsonutil" "github.com/stretchr/testify/require" ) @@ -301,3 +305,126 @@ func TestVaultCAProvider_AWSLoginDataGenerator(t *testing.T) { }) } } + +func TestVaultCAProvider_AzureAuthClient(t *testing.T) { + instance := instanceData{Compute: Compute{ + Name: "a", ResourceGroupName: "b", SubscriptionID: "c", VMScaleSetName: "d", + }} + instanceJSON, err := json.Marshal(instance) + require.NoError(t, err) + identity := identityData{AccessToken: "a-jwt-token"} + identityJSON, err := json.Marshal(identity) + require.NoError(t, err) + + msi := httptest.NewServer(http.HandlerFunc( + func(w http.ResponseWriter, r *http.Request) { + url := r.URL.Path + switch url { + case "/metadata/instance": + w.Write(instanceJSON) + case "/metadata/identity/oauth2/token": + w.Write(identityJSON) + default: + t.Errorf("unexpected testing URL: %s", url) + } + })) + + origIn, origId := instanceEndpoint, identityEndpoint + instanceEndpoint = msi.URL + "/metadata/instance" + identityEndpoint = msi.URL + "/metadata/identity/oauth2/token" + defer func() { + instanceEndpoint, identityEndpoint = origIn, origId + }() + + t.Run("get-metadata-instance-info", func(t *testing.T) { + md, err := getMetadataInfo(instanceEndpoint, nil) + require.NoError(t, err) + var testInstance instanceData + err = jsonutil.DecodeJSON(md, &testInstance) + require.NoError(t, err) + require.Equal(t, testInstance, instance) + }) + + t.Run("get-metadata-identity-info", func(t *testing.T) { + md, err := getMetadataInfo(identityEndpoint, nil) + require.NoError(t, err) + var testIdentity identityData + err = jsonutil.DecodeJSON(md, &testIdentity) + require.NoError(t, err) + require.Equal(t, testIdentity, identity) + }) + + cases := map[string]struct { + authMethod *structs.VaultAuthMethod + expData map[string]any + expErr error + }{ + "legacy-case": { + authMethod: &structs.VaultAuthMethod{ + Type: "azure", + Params: map[string]interface{}{ + "role": "a", + "vm_name": "b", + "vmss_name": "c", + "resource_group_name": "d", + "subscription_id": "e", + "jwt": "f", + }, + }, + expData: map[string]any{ + "role": "a", + "vm_name": "b", + "vmss_name": "c", + "resource_group_name": "d", + "subscription_id": "e", + "jwt": "f", + }, + }, + "base-case": { + authMethod: &structs.VaultAuthMethod{ + Type: "azure", + Params: map[string]interface{}{ + "role": "a-role", + "resource": "b-resource", + }, + }, + expData: map[string]any{ + "role": "a-role", + "jwt": "a-jwt-token", + }, + }, + "no-role": { + authMethod: &structs.VaultAuthMethod{ + Type: "azure", + Params: map[string]interface{}{ + "resource": "b-resource", + }, + }, + expErr: fmt.Errorf("missing 'role' value"), + }, + "no-resource": { + authMethod: &structs.VaultAuthMethod{ + Type: "azure", + Params: map[string]interface{}{ + "role": "a-role", + }, + }, + expErr: fmt.Errorf("missing 'resource' value"), + }, + } + for name, c := range cases { + t.Run(name, func(t *testing.T) { + auth, err := NewAzureAuthClient(c.authMethod) + if c.expErr != nil { + require.EqualError(t, err, c.expErr.Error()) + return + } + require.NoError(t, err) + if auth.LoginDataGen != nil { + data, err := auth.LoginDataGen(c.authMethod) + require.NoError(t, err) + require.Subset(t, data, c.expData) + } + }) + } +} diff --git a/agent/connect/ca/provider_vault_test.go b/agent/connect/ca/provider_vault_test.go index f7375a01760..173d2c5549a 100644 --- a/agent/connect/ca/provider_vault_test.go +++ b/agent/connect/ca/provider_vault_test.go @@ -107,7 +107,7 @@ func TestVaultCAProvider_configureVaultAuthMethod(t *testing.T) { "alicloud": {expLoginPath: "auth/alicloud/login"}, "approle": {expLoginPath: "auth/approle/login"}, "aws": {expLoginPath: "auth/aws/login", params: map[string]interface{}{"type": "iam"}, hasLDG: true}, - "azure": {expLoginPath: "auth/azure/login"}, + "azure": {expLoginPath: "auth/azure/login", params: map[string]interface{}{"role": "test-role", "resource": "test-resource"}, hasLDG: true}, "cf": {expLoginPath: "auth/cf/login"}, "github": {expLoginPath: "auth/github/login"}, "gcp": {expLoginPath: "auth/gcp/login", params: map[string]interface{}{"type": "iam", "role": "test-role"}}, From 1f422f3df3eb6af225c509d49d34281ac0205843 Mon Sep 17 00:00:00 2001 From: trujillo-adam <47586768+trujillo-adam@users.noreply.github.com> Date: Tue, 28 Feb 2023 19:56:18 -0800 Subject: [PATCH 087/262] Changed titles for services pages to sentence style cap (#16477) * Changed titles for services pages to sentence style cap * missed a meta title --- .../configuration/checks-configuration-reference.mdx | 4 ++-- .../configuration/services-configuration-overview.mdx | 5 +++-- .../configuration/services-configuration-reference.mdx | 5 +++-- .../content/docs/services/discovery/dns-configuration.mdx | 4 ++-- .../content/docs/services/discovery/dns-dynamic-lookups.mdx | 5 +++-- website/content/docs/services/discovery/dns-overview.mdx | 4 ++-- .../content/docs/services/discovery/dns-static-lookups.mdx | 4 ++-- website/content/docs/services/services.mdx | 4 ++-- website/content/docs/services/usage/checks.mdx | 4 ++-- website/content/docs/services/usage/define-services.mdx | 4 ++-- .../content/docs/services/usage/register-services-checks.mdx | 5 +++-- 11 files changed, 26 insertions(+), 22 deletions(-) diff --git a/website/content/docs/services/configuration/checks-configuration-reference.mdx b/website/content/docs/services/configuration/checks-configuration-reference.mdx index 3159c977a20..fee071de51b 100644 --- a/website/content/docs/services/configuration/checks-configuration-reference.mdx +++ b/website/content/docs/services/configuration/checks-configuration-reference.mdx @@ -1,11 +1,11 @@ --- layout: docs -page_title: Health Check Configuration Reference +page_title: Health check configuration reference description: -> Use the health checks to direct safety functions, such as removing failing nodes and replacing secondary services. Learn how to configure health checks. --- -# Health Check Configuration Reference +# Health check configuration reference This topic provides configuration reference information for health checks. For information about the different kinds of health checks and guidance on defining them, refer to [Define Health Checks]. diff --git a/website/content/docs/services/configuration/services-configuration-overview.mdx b/website/content/docs/services/configuration/services-configuration-overview.mdx index 55be8df3242..3c01f05ae7c 100644 --- a/website/content/docs/services/configuration/services-configuration-overview.mdx +++ b/website/content/docs/services/configuration/services-configuration-overview.mdx @@ -1,10 +1,11 @@ --- layout: docs -page_title: Services Configuration Overview +page_title: Services configuration overview description: -> This topic provides introduces the configuration items that enable you to register services with Consul so that they can connect to other services and nodes registered with Consul. --- -# Services Configuration Overview + +# Services configuration overview This topic provides introduces the configuration items that enable you to register services with Consul so that they can connect to other services and nodes registered with Consul. diff --git a/website/content/docs/services/configuration/services-configuration-reference.mdx b/website/content/docs/services/configuration/services-configuration-reference.mdx index d3ee69e0373..95f01e16ff7 100644 --- a/website/content/docs/services/configuration/services-configuration-reference.mdx +++ b/website/content/docs/services/configuration/services-configuration-reference.mdx @@ -1,9 +1,10 @@ --- -page_title: Service Configuration Reference +layout: docs +page_title: Service configuration reference description: Use the service definition to configure and register services to the Consul catalog, including services used as proxies in a Consul service mesh --- -# Services Configuration Reference +# Services configuration reference This topic describes the options you can use to define services for registering them with Consul. Refer to the following topics for usage information: diff --git a/website/content/docs/services/discovery/dns-configuration.mdx b/website/content/docs/services/discovery/dns-configuration.mdx index 7e43e7b75bb..794be43a206 100644 --- a/website/content/docs/services/discovery/dns-configuration.mdx +++ b/website/content/docs/services/discovery/dns-configuration.mdx @@ -1,11 +1,11 @@ --- layout: docs -page_title: Configure Consul DNS Behavior +page_title: Configure Consul DNS behavior description: -> Learn how to modify the default DNS behavior so that services and nodes can easily discover other services and nodes in your network. --- -# Configure Consul DNS Behavior +# Configure Consul DNS behavior This topic describes the default behavior of the Consul DNS functionality and how to customize how Consul performs queries. diff --git a/website/content/docs/services/discovery/dns-dynamic-lookups.mdx b/website/content/docs/services/discovery/dns-dynamic-lookups.mdx index d19f41c9ea6..d4c8a3fa9ea 100644 --- a/website/content/docs/services/discovery/dns-dynamic-lookups.mdx +++ b/website/content/docs/services/discovery/dns-dynamic-lookups.mdx @@ -1,11 +1,12 @@ --- layout: docs -page_title: Enable Dynamic DNS Queries +page_title: Enable dynamic DNS queries description: -> Learn how to dynamically query the Consul DNS using prepared queries, which enable robust service and node lookups. --- -# Enable Dynamic DNS Queries +# Enable dynamic DNS aueries + This topic describes how to dynamically query the Consul catalog using prepared queries. Prepared queries are configurations that enable you to register a complex service query and execute it on demand. For information about how to perform standard node and service lookups, refer to [Perform Static DNS Queries](/consul/docs/services/discovery/dns-static-lookups). ## Introduction diff --git a/website/content/docs/services/discovery/dns-overview.mdx b/website/content/docs/services/discovery/dns-overview.mdx index 53baac080e7..37eda715de2 100644 --- a/website/content/docs/services/discovery/dns-overview.mdx +++ b/website/content/docs/services/discovery/dns-overview.mdx @@ -1,11 +1,11 @@ --- layout: docs -page_title: DNS Usage Overview +page_title: DNS usage overview description: >- For service discovery use cases, Domain Name Service (DNS) is the main interface to look up, query, and address Consul nodes and services. Learn how a Consul DNS lookup can help you find services by tag, name, namespace, partition, datacenter, or domain. --- -# DNS Usage Overview +# DNS usage overview This topic provides overview information about how to look up Consul nodes and services using the Consul DNS. diff --git a/website/content/docs/services/discovery/dns-static-lookups.mdx b/website/content/docs/services/discovery/dns-static-lookups.mdx index d95987671ef..68191104a2a 100644 --- a/website/content/docs/services/discovery/dns-static-lookups.mdx +++ b/website/content/docs/services/discovery/dns-static-lookups.mdx @@ -1,11 +1,11 @@ --- layout: docs -page_title: Perform Static DNS Queries +page_title: Perform static DNS queries description: -> Learn how to use standard Consul DNS lookup formats to enable service discovery for services and nodes. --- -# Perform Static DNS Queries +# Perform static DNS queries This topic describes how to query the Consul DNS to look up nodes and services registered with Consul. Refer to [Enable Dynamic DNS Queries](/consul/docs/services/discovery/dns-dynamic-lookups) for information about using prepared queries. ## Introduction diff --git a/website/content/docs/services/services.mdx b/website/content/docs/services/services.mdx index 3a2f2153890..b24562e64e3 100644 --- a/website/content/docs/services/services.mdx +++ b/website/content/docs/services/services.mdx @@ -1,11 +1,11 @@ --- layout: docs -page_title: Services Overview +page_title: Services overview description: >- Learn about services and service discovery workflows and concepts for virtual machine environments. --- -# Services Overview +# Services overview This topic provides overview information about services and how to make them discoverable in Consul when your network operates on virtual machines. If service mesh is enabled in your network, refer to the topics in [Consul Service Mesh](/consul/docs/connect/). If your network is running in Kubernetes, refer to the topics in [Consul on Kubernetes](/consul/docs/k8s). ## Introduction diff --git a/website/content/docs/services/usage/checks.mdx b/website/content/docs/services/usage/checks.mdx index 99d26c72229..8f86b228397 100644 --- a/website/content/docs/services/usage/checks.mdx +++ b/website/content/docs/services/usage/checks.mdx @@ -1,11 +1,11 @@ --- layout: docs -page_title: Define Health Checks +page_title: Define health checks description: -> Learn how to configure different types of health checks for services you register with Consul. --- -# Define Health Checks +# Define health checks This topic describes how to create different types of health checks for your services. diff --git a/website/content/docs/services/usage/define-services.mdx b/website/content/docs/services/usage/define-services.mdx index 35df236668d..a4b6eaa1596 100644 --- a/website/content/docs/services/usage/define-services.mdx +++ b/website/content/docs/services/usage/define-services.mdx @@ -1,11 +1,11 @@ --- layout: docs -page_title: Define Services +page_title: Define services description: >- Learn how to define services so that they are discoverable in your network. --- -# Define Services +# Define services This topic describes how to define services so that they can be discovered by other services. Refer to [Services Overview](/consul/docs/services/services) for additional information. diff --git a/website/content/docs/services/usage/register-services-checks.mdx b/website/content/docs/services/usage/register-services-checks.mdx index fca829a00e1..89c96a1f2e7 100644 --- a/website/content/docs/services/usage/register-services-checks.mdx +++ b/website/content/docs/services/usage/register-services-checks.mdx @@ -1,11 +1,12 @@ --- layout: docs -page_title: Register Services and Health Checks +page_title: Register services and health checks description: -> Learn how to register services and health checks with Consul agents. --- -# Register Services and Health Checks +# Register services and health checks + This topic describes how to register services and health checks with Consul in networks running on virtual machines (VM). Refer to [Define Services](/consul/usage/services/usage/define-services) and [Define Health Checks](/consul/usage/services/usage/checks) for information about how to define services and health checks. ## Overview From 66de1def3bb3f9e70089d3a22692c207b582a495 Mon Sep 17 00:00:00 2001 From: David Yu Date: Wed, 1 Mar 2023 00:09:11 -0800 Subject: [PATCH 088/262] docs: Consul 1.15.0 and Consul K8s 1.0 release notes (#16481) * add new release notes --------- Co-authored-by: Tu Nguyen --- .../docs/release-notes/consul-k8s/v0_49_x.mdx | 4 + .../docs/release-notes/consul-k8s/v1_0_x.mdx | 4 + .../docs/release-notes/consul-k8s/v1_1_x.mdx | 56 +++++++++++++ .../docs/release-notes/consul/v1_15_x.mdx | 82 +++++++++++++++++++ website/data/docs-nav-data.json | 8 ++ 5 files changed, 154 insertions(+) create mode 100644 website/content/docs/release-notes/consul-k8s/v1_1_x.mdx create mode 100644 website/content/docs/release-notes/consul/v1_15_x.mdx diff --git a/website/content/docs/release-notes/consul-k8s/v0_49_x.mdx b/website/content/docs/release-notes/consul-k8s/v0_49_x.mdx index 57a66e5c3e5..cb03589e1cf 100644 --- a/website/content/docs/release-notes/consul-k8s/v0_49_x.mdx +++ b/website/content/docs/release-notes/consul-k8s/v0_49_x.mdx @@ -44,3 +44,7 @@ The changelogs for this major release version and any maintenance versions are l ~> **Note:** The following link takes you to the changelogs on the GitHub website. - [0.49.0](https://github.com/hashicorp/consul-k8s/releases/tag/v0.49.0) +- [0.49.1](https://github.com/hashicorp/consul-k8s/releases/tag/v0.49.1) +- [0.49.2](https://github.com/hashicorp/consul-k8s/releases/tag/v0.49.2) +- [0.49.3](https://github.com/hashicorp/consul-k8s/releases/tag/v0.49.3) +- [0.49.4](https://github.com/hashicorp/consul-k8s/releases/tag/v0.49.4) diff --git a/website/content/docs/release-notes/consul-k8s/v1_0_x.mdx b/website/content/docs/release-notes/consul-k8s/v1_0_x.mdx index f34e2397c27..b9236898dd5 100644 --- a/website/content/docs/release-notes/consul-k8s/v1_0_x.mdx +++ b/website/content/docs/release-notes/consul-k8s/v1_0_x.mdx @@ -61,3 +61,7 @@ The changelogs for this major release version and any maintenance versions are l ~> **Note:** The following link takes you to the changelogs on the GitHub website. - [1.0.0](https://github.com/hashicorp/consul-k8s/releases/tag/v1.0.0) +- [1.0.1](https://github.com/hashicorp/consul-k8s/releases/tag/v1.0.1) +- [1.0.2](https://github.com/hashicorp/consul-k8s/releases/tag/v1.0.2) +- [1.0.3](https://github.com/hashicorp/consul-k8s/releases/tag/v1.0.3) +- [1.0.4](https://github.com/hashicorp/consul-k8s/releases/tag/v1.0.4) diff --git a/website/content/docs/release-notes/consul-k8s/v1_1_x.mdx b/website/content/docs/release-notes/consul-k8s/v1_1_x.mdx new file mode 100644 index 00000000000..6931aecd705 --- /dev/null +++ b/website/content/docs/release-notes/consul-k8s/v1_1_x.mdx @@ -0,0 +1,56 @@ +--- +layout: docs +page_title: 1.1.x +description: >- + Consul on Kubernetes release notes for version 1.1.x +--- + +# Consul on Kubernetes 1.1.0 + +## Release Highlights + +- **Enhanced Envoy Access Logging:** Envoy access logs are now centrally managed via the `accessLogs` field within the ProxyDefaults CRD to allow operators to easily turn on access logs for all proxies within the service mesh. Refer to [Access logs overview](/consul/docs/connect/observability/access-logs) for more information. + +- **Consul Envoy Extensions:** The new Envoy extension system enables you to modify Consul-generated Envoy resources outside of the Consul binary. This will allow extensions to add, delete, and modify Envoy listeners, routes, clusters, and endpoints, enabling support for additional Envoy features without changes to the Consul codebase. +The new `envoyExtensions` field in the ProxyDefaults and ServiceDefaults CRDs enable built-in Envoy extensions. Refer to [Envoy extensions overview](/consul/docs/connect/proxies/envoy-extensions) for more information on how to use these extensions. + +## What's Changed + +- Connect inject now excludes the `openebs` namespace from sidecar injection by default. If you previously had pods in that namespace +that you wanted to be injected, you must now set namespaceSelector as follows: + + ```yaml + connectInject: + namespaceSelector: | + matchExpressions: + - key: "kubernetes.io/metadata.name" + operator: "NotIn" + values: ["kube-system","local-path-storage"] + ``` + +## Supported Software + +~> **Note:** Consul 1.14.x and 1.13.x are not supported. Please refer to [Supported Consul and Kubernetes versions](/consul/docs/k8s/compatibility#supported-consul-and-kubernetes-versions) for more detail on choosing the correct `consul-k8s` version. +- Consul 1.15.x. +- Consul Dataplane v1.1.x. Refer to [Envoy and Consul Dataplane](/consul/docs/connect/proxies/envoy#envoy-and-consul-dataplane) for details about Consul Dataplane versions and the available packaged Envoy version. +- Kubernetes 1.23.x - 1.26.x +- `kubectl` 1.23.x - 1.26.x +- Helm 3.6+ + +## Upgrading + +For detailed information on upgrading, please refer to the [Upgrades page](/consul/docs/k8s/upgrade) + +## Known Issues + +The following issues are known to exist in the v1.1.0 release: + +- Pod Security Standards that are configured for the [Pod Security Admission controller](https://kubernetes.io/blog/2022/08/25/pod-security-admission-stable/) are currently not supported by Consul K8s. OpenShift 4.11.x enables Pod Security Standards on Kubernetes 1.25 [by default](https://connect.redhat.com/en/blog/important-openshift-changes-pod-security-standards) and is also not supported. Support will be added in a future Consul K8s 1.0.x patch release. + +## Changelogs + +The changelogs for this major release version and any maintenance versions are listed below. + +~> **Note:** The following link takes you to the changelogs on the GitHub website. + +- [1.1.0](https://github.com/hashicorp/consul-k8s/releases/tag/v1.1.0) diff --git a/website/content/docs/release-notes/consul/v1_15_x.mdx b/website/content/docs/release-notes/consul/v1_15_x.mdx new file mode 100644 index 00000000000..319deb16f65 --- /dev/null +++ b/website/content/docs/release-notes/consul/v1_15_x.mdx @@ -0,0 +1,82 @@ +--- +layout: docs +page_title: 1.15.x +description: >- + Consul release notes for version 1.15.x +--- + +# Consul 1.15.0 + +## Release Highlights + +- **Enhanced Envoy Access Logging:** Envoy access logs are now centrally managed via config entries and CRDs to allow operators to easily turn on access logs for all proxies within the service mesh. Refer to [Access logs overview](/consul/docs/connect/observability/access-logs) for more information. Additionally, the [Proxy default configuration entry](/consul/docs/connect/config-entries/proxy-defaults) shows you how to enable access logs centrally via the ProxyDefaults config entry or CRD. + +- **Consul Envoy Extensions:** The new Envoy extension system enables you to modify Consul-generated Envoy resources outside of the Consul binary. This will allow extensions to add, delete, and modify Envoy listeners, routes, clusters, and endpoints, enabling support for additional Envoy features without changes to the Consul codebase. +Current supported extensions include the [Lua](/consul/docs/connect/proxies/envoy-extensions#lua) and [AWS Lambda](/consul/docs/connect/proxies/envoy-extensions#lambda) extensions. Refer to [Envoy extensions overview](/consul/docs/connect/proxies/envoy-extensions) for more information on how to use these extensions for Consul service mesh. + +- **API Gateway support on Linux VM runtimes:** You can now deploy Consul API Gateway on Linux VM runtimes. API Gateway is built into Consul and, when deploying on Linux VM runtimes, is not separately installed software. Refer to [API gateway overview](/consul/docs/connect/gateways/api-gateway) for more information on API Gateway specifically for VM. + + ~> **Note:** Support for API Gateway on Linux VM runtimes is considered a "Beta" feature in Consul v1.15.0. HashiCorp expects to change it to a GA feature as part of a v1.15 patch release in the near future. + +- **Limit traffic rates to Consul servers:** You can now configure global RPC rate limits to mitigate the risks to Consul servers when clients send excessive read or write requests to Consul resources. Refer to [Limit traffic rates overview](/consul/docs/agent/limits) for more details on how to use the new troubleshooting commands. + +- **Service-to-service troubleshooting:** Consul includes a built-in tool for troubleshooting communication between services in a service mesh. The `consul troubleshoot` command enables you to validate communication between upstream and downstream Envoy proxies on VM and Kubernetes deployments. Refer to [Service-to-service troubleshooting overview](/consul/docs/troubleshoot/troubleshoot-services) for more details on how to use the new troubleshooting commands. +Refer to [Service-to-service troubleshooting overview](/consul/docs/troubleshoot/troubleshoot-services) for more details on how to use the new troubleshooting commands. + +- **Raft write-ahead log (Experimental):** Consul provides an experimental storage backend called write-ahead log (WAL). WAL implements a traditional log with rotating, append-only log files which resolves a number of performance issues with the current BoltDB storage backend. Refer to [Experimental WAL LogStore backend overview](/consul/docs/agent/wal-logstore) for more details. + + ~> **Note:** The new Raft write-ahead log storage backend is not recommended for production use cases yet, but is ready for testing by the general community. + +## What's Changed + +- ACL errors have now been ehanced to return descriptive errors when the specified resource cannot be found. Other ACL request errors provide more information about when a resource is missing. In addition, errors are now gracefully thrown when interacting with the ACL system before the ACL system been bootstrapped. + - The Delete Token/Policy/AuthMethod/Role/BindingRule endpoints now return 404 when the resource cannot be found. The new error format is as follows: + + ```log hideClipboard + Requested * does not exist: ACL not found", "* not found in namespace $NAMESPACE: ACL not found` + ``` + + - The Read Token/Policy/Role endpoints now return 404 when the resource cannot be found. The new error format is as follows: + + ```log hideClipboard + Cannot find * to delete + ``` + + - The Logout endpoint now returns a 401 error when the supplied token cannot be found. The new error format is as follows: + + ```log hideClipboard + Supplied token does not exist + ``` + + - The Token Self endpoint now returns 404 when the token cannot be found. The new error format is as follows: + + ```log hideClipboard + Supplied token does not exist + ``` + +- Consul v1.15.0 formally removes all uses of legacy ACLs and ACL policies from Consul. The legacy ACL system was deprecated in Consul v1.4.0 and removed in Consul v1.11.0. The documentation for the new ACL system can be found [here](/consul/docs/v1.14.x/security/acl). For information on how to migrate to the new ACL System, please read the [Migrate Legacy ACL Tokens tutorial](/consul/tutorials/security-operations/access-control-token-migration). +- The following agent flags are now deprecated: `-join`, `-join-wan`, `start_join`, and `start_join_wan`. These options are now aliases of `-retry-join`, `-retry-join-wan`, `retry_join`, and `retry_join_wan`, respectively. +- A `peer` field has been added to ServiceDefaults upstream overrides to make it possible to apply upstream overrides only to peer services. Prior to this change, overrides would be applied based on matching the namespace and name fields only, which means users could not have different configuration for local versus peer services. With this change, peer upstreams are only affected if the peer field matches the destination peer name. +- If you run the `consul connect envoy` command with an incompatible Envoy version, Consul will now error and exit. To ignore this check, use flag `--ignore-envoy-compatibility`. +- Ingress Gateway upstream clusters will have empty `outlier_detection` if passive health check is unspecified. + +## Upgrading + +For more detailed information, please refer to the [upgrade details page](/consul/docs/upgrading/upgrade-specific#consul-1-15-0) and the changelogs. + +## Known Issues + +The following issues are known to exist in the v1.15.0 release: + +- For v1.15.0, there is a known issue where `consul acl token read -self` requires an `-accessor-id`. This is resolved in the uppcoming Consul v1.15.1 patch release. + +- For v1.15.0, there is a known issue where search filters produced errors and resulted in lists not showing full results until being interacted with. This is resolved in the upcoming Consul v1.15.1 patch release. + + +## Changelogs + +The changelogs for this major release version and any maintenance versions are listed below. + +~> **Note:** These links take you to the changelogs on the GitHub website. + +- [1.15.0](https://github.com/hashicorp/consul/releases/tag/v1.15.0) diff --git a/website/data/docs-nav-data.json b/website/data/docs-nav-data.json index 9b53bd05117..1c264644740 100644 --- a/website/data/docs-nav-data.json +++ b/website/data/docs-nav-data.json @@ -145,6 +145,10 @@ { "title": "Consul", "routes": [ + { + "title": "v1.15.x", + "path": "release-notes/consul/v1_15_x" + }, { "title": "v1.14.x", "path": "release-notes/consul/v1_14_x" @@ -174,6 +178,10 @@ { "title": "Consul K8s", "routes": [ + { + "title": "v1.1.x", + "path": "release-notes/consul-k8s/v1_1_x" + }, { "title": "v1.0.x", "path": "release-notes/consul-k8s/v1_0_x" From 397011575301c8f3e36f5f94f4a32ebbac10ccc3 Mon Sep 17 00:00:00 2001 From: cskh Date: Wed, 1 Mar 2023 14:50:03 -0500 Subject: [PATCH 089/262] fix (cli): return error msg if acl policy not found (#16485) * fix: return error msg if acl policy not found * changelog * add test --- .changelog/16485.txt | 3 +++ command/acl/policy/read/policy_read.go | 5 +++++ command/acl/policy/read/policy_read_test.go | 11 +++++++++++ 3 files changed, 19 insertions(+) create mode 100644 .changelog/16485.txt diff --git a/.changelog/16485.txt b/.changelog/16485.txt new file mode 100644 index 00000000000..7e1938b00ea --- /dev/null +++ b/.changelog/16485.txt @@ -0,0 +1,3 @@ +```release-note:bug +cli: fix panic read non-existent acl policy +``` diff --git a/command/acl/policy/read/policy_read.go b/command/acl/policy/read/policy_read.go index 455f5e5f7d6..57e9397b2a4 100644 --- a/command/acl/policy/read/policy_read.go +++ b/command/acl/policy/read/policy_read.go @@ -92,6 +92,11 @@ func (c *cmd) Run(args []string) int { return 1 } + if pol == nil { + c.UI.Error(fmt.Sprintf("Error policy not found: %s", c.policyName)) + return 1 + } + formatter, err := policy.NewFormatter(c.format, c.showMeta) if err != nil { c.UI.Error(err.Error()) diff --git a/command/acl/policy/read/policy_read_test.go b/command/acl/policy/read/policy_read_test.go index af5bf1c843f..bd8d99dd837 100644 --- a/command/acl/policy/read/policy_read_test.go +++ b/command/acl/policy/read/policy_read_test.go @@ -82,6 +82,17 @@ func TestPolicyReadCommand(t *testing.T) { output = ui.OutputWriter.String() assert.Contains(t, output, fmt.Sprintf("test-policy")) assert.Contains(t, output, policy.ID) + + // Test querying non-existent policy + argsName = []string{ + "-http-addr=" + a.HTTPAddr(), + "-token=root", + "-name=test-policy-not-exist", + } + + cmd = New(ui) + code = cmd.Run(argsName) + assert.Equal(t, code, 1) } func TestPolicyReadCommand_JSON(t *testing.T) { From 5ac1bdd3db0f7598dea77fe3c21b7a6eca2a17c8 Mon Sep 17 00:00:00 2001 From: trujillo-adam <47586768+trujillo-adam@users.noreply.github.com> Date: Wed, 1 Mar 2023 11:52:13 -0800 Subject: [PATCH 090/262] update services nav titles (#16484) --- website/data/docs-nav-data.json | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/website/data/docs-nav-data.json b/website/data/docs-nav-data.json index 1c264644740..f66afc94c5f 100644 --- a/website/data/docs-nav-data.json +++ b/website/data/docs-nav-data.json @@ -314,43 +314,43 @@ "title": "Services", "routes": [ { - "title": "Services Overview", + "title": "Overview", "path": "services/services" }, { - "title": "Define and Register", + "title": "Usage", "routes": [ { - "title": "Define Services", + "title": "Define services", "path": "services/usage/define-services" }, { - "title": "Define Health Checks", + "title": "Define health checks", "path": "services/usage/checks" }, { - "title": "Register Services and Health Checks", + "title": "Register services and health checks", "path": "services/usage/register-services-checks" } ] }, { - "title": "Service Discovery", + "title": "Discover services with DNS", "routes": [ { - "title": "DNS Usage Overview", + "title": "Overview", "path": "services/discovery/dns-overview" }, { - "title": "Configure Consul DNS Behavior", + "title": "Configure DNS behavior", "path": "services/discovery/dns-configuration" }, { - "title": "Perform Static DNS Lookups", + "title": "Perform static DNS lookups", "path": "services/discovery/dns-static-lookups" }, { - "title": "Enable Dynamic DNS Lookups", + "title": "Enable dynamic DNS lookups", "path": "services/discovery/dns-dynamic-lookups" } ] @@ -359,19 +359,19 @@ "title": "Configuration", "routes": [ { - "title": "Services Configuration Overview", + "title": "Overview", "path": "services/configuration/services-configuration-overview" }, { - "title": "Services Configuration Reference", + "title": "Services", "path": "services/configuration/services-configuration-reference" }, { - "title": "Health Checks Configuration Reference", + "title": "Health checks", "path": "services/configuration/checks-configuration-reference" }, { - "title": "Service Defaults Configuration Reference", + "title": "Service defaults", "href": "connect/config-entries/service-defaults" } ] From 4f8594b28f796a0645643fdd4375b3a4360b1c0a Mon Sep 17 00:00:00 2001 From: Ronald Date: Wed, 1 Mar 2023 21:00:37 +0100 Subject: [PATCH 091/262] Improve ux to help users avoid overwriting fields of ACL tokens, roles and policies (#16288) * Deprecate merge-policies and add options add-policy-name/add-policy-id to improve CLI token update command * deprecate merge-roles fields * Fix potential flakey tests and update ux to remove 'completely' + typo fixes --- .changelog/16288.txt | 8 ++ command/acl/token/update/token_update.go | 91 +++++++++++++++---- command/acl/token/update/token_update_test.go | 89 ++++++++++++++++++ website/content/commands/acl/token/update.mdx | 30 ++++-- 4 files changed, 193 insertions(+), 25 deletions(-) create mode 100644 .changelog/16288.txt diff --git a/.changelog/16288.txt b/.changelog/16288.txt new file mode 100644 index 00000000000..5e2820ec27d --- /dev/null +++ b/.changelog/16288.txt @@ -0,0 +1,8 @@ +```release-note:deprecation +cli: Deprecate the `-merge-policies` and `-merge-roles` flags from the `consul token update` command in favor of: `-append-policy-id`, `-append-policy-name`, `-append-role-name`, and `-append-role-id`. +``` + +```release-note:improvement +cli: added `-append-policy-id`, `-append-policy-name`, `-append-role-name`, and `-append-role-id` flags to the `consul token update` command. +These flags allow updates to a token's policies/roles without having to override them completely. +``` \ No newline at end of file diff --git a/command/acl/token/update/token_update.go b/command/acl/token/update/token_update.go index 4f168e927b8..6cb529edd45 100644 --- a/command/acl/token/update/token_update.go +++ b/command/acl/token/update/token_update.go @@ -27,30 +27,31 @@ type cmd struct { tokenAccessorID string policyIDs []string + appendPolicyIDs []string policyNames []string + appendPolicyNames []string roleIDs []string + appendRoleIDs []string roleNames []string + appendRoleNames []string serviceIdents []string nodeIdents []string description string - mergePolicies bool - mergeRoles bool mergeServiceIdents bool mergeNodeIdents bool showMeta bool format string - tokenID string // DEPRECATED + // DEPRECATED + mergeRoles bool + mergePolicies bool + tokenID string } func (c *cmd) init() { c.flags = flag.NewFlagSet("", flag.ContinueOnError) c.flags.BoolVar(&c.showMeta, "meta", false, "Indicates that token metadata such "+ "as the content hash and raft indices should be shown for each entry") - c.flags.BoolVar(&c.mergePolicies, "merge-policies", false, "Merge the new policies "+ - "with the existing policies") - c.flags.BoolVar(&c.mergeRoles, "merge-roles", false, "Merge the new roles "+ - "with the existing roles") c.flags.BoolVar(&c.mergeServiceIdents, "merge-service-identities", false, "Merge the new service identities "+ "with the existing service identities") c.flags.BoolVar(&c.mergeNodeIdents, "merge-node-identities", false, "Merge the new node identities "+ @@ -60,13 +61,21 @@ func (c *cmd) init() { "matches multiple token Accessor IDs") c.flags.StringVar(&c.description, "description", "", "A description of the token") c.flags.Var((*flags.AppendSliceValue)(&c.policyIDs), "policy-id", "ID of a "+ - "policy to use for this token. May be specified multiple times") + "policy to use for this token. Overwrites existing policies. May be specified multiple times") + c.flags.Var((*flags.AppendSliceValue)(&c.appendPolicyIDs), "append-policy-id", "ID of a "+ + "policy to use for this token. The token retains existing policies. May be specified multiple times") c.flags.Var((*flags.AppendSliceValue)(&c.policyNames), "policy-name", "Name of a "+ - "policy to use for this token. May be specified multiple times") + "policy to use for this token. Overwrites existing policies. May be specified multiple times") + c.flags.Var((*flags.AppendSliceValue)(&c.appendPolicyNames), "append-policy-name", "Name of a "+ + "policy to add to this token. The token retains existing policies. May be specified multiple times") c.flags.Var((*flags.AppendSliceValue)(&c.roleIDs), "role-id", "ID of a "+ - "role to use for this token. May be specified multiple times") + "role to use for this token. Overwrites existing roles. May be specified multiple times") c.flags.Var((*flags.AppendSliceValue)(&c.roleNames), "role-name", "Name of a "+ - "role to use for this token. May be specified multiple times") + "role to use for this token. Overwrites existing roles. May be specified multiple times") + c.flags.Var((*flags.AppendSliceValue)(&c.appendRoleIDs), "append-role-id", "ID of a "+ + "role to add to this token. The token retains existing roles. May be specified multiple times") + c.flags.Var((*flags.AppendSliceValue)(&c.appendRoleNames), "append-role-name", "Name of a "+ + "role to add to this token. The token retains existing roles. May be specified multiple times") c.flags.Var((*flags.AppendSliceValue)(&c.serviceIdents), "service-identity", "Name of a "+ "service identity to use for this token. May be specified multiple times. Format is "+ "the SERVICENAME or SERVICENAME:DATACENTER1,DATACENTER2,...") @@ -87,8 +96,11 @@ func (c *cmd) init() { c.help = flags.Usage(help, c.flags) // Deprecations - c.flags.StringVar(&c.tokenID, "id", "", - "DEPRECATED. Use -accessor-id instead.") + c.flags.StringVar(&c.tokenID, "id", "", "DEPRECATED. Use -accessor-id instead.") + c.flags.BoolVar(&c.mergePolicies, "merge-policies", false, "DEPRECATED. "+ + "Use -append-policy-id or -append-policy-name instead.") + c.flags.BoolVar(&c.mergeRoles, "merge-roles", false, "DEPRECATED. "+ + "Use -append-role-id or -append-role-name instead.") } func (c *cmd) Run(args []string) int { @@ -148,6 +160,9 @@ func (c *cmd) Run(args []string) int { } if c.mergePolicies { + c.UI.Warn("merge-policies is deprecated and will be removed in a future Consul version. " + + "Use `append-policy-name` or `append-policy-id` instead.") + for _, policyName := range c.policyNames { found := false for _, link := range t.Policies { @@ -184,15 +199,33 @@ func (c *cmd) Run(args []string) int { } } } else { - t.Policies = nil - for _, policyName := range c.policyNames { + hasAddPolicyFields := len(c.appendPolicyNames) > 0 || len(c.appendPolicyIDs) > 0 + hasPolicyFields := len(c.policyIDs) > 0 || len(c.policyNames) > 0 + + if hasPolicyFields && hasAddPolicyFields { + c.UI.Error("Cannot combine the use of policy-id/policy-name flags with append- variants. " + + "To set or overwrite existing policies, use -policy-id or -policy-name. " + + "To append to existing policies, use -append-policy-id or -append-policy-name.") + return 1 + } + + policyIDs := c.appendPolicyIDs + policyNames := c.appendPolicyNames + + if hasPolicyFields { + policyIDs = c.policyIDs + policyNames = c.policyNames + t.Policies = nil + } + + for _, policyName := range policyNames { // We could resolve names to IDs here but there isn't any reason why its would be better // than allowing the agent to do it. t.Policies = append(t.Policies, &api.ACLTokenPolicyLink{Name: policyName}) } - for _, policyID := range c.policyIDs { + for _, policyID := range policyIDs { policyID, err := acl.GetPolicyIDFromPartial(client, policyID) if err != nil { c.UI.Error(fmt.Sprintf("Error resolving policy ID %s: %v", policyID, err)) @@ -203,6 +236,9 @@ func (c *cmd) Run(args []string) int { } if c.mergeRoles { + c.UI.Warn("merge-roles is deprecated and will be removed in a future Consul version. " + + "Use `append-role-name` or `append-role-id` instead.") + for _, roleName := range c.roleNames { found := false for _, link := range t.Roles { @@ -239,15 +275,32 @@ func (c *cmd) Run(args []string) int { } } } else { - t.Roles = nil + hasAddRoleFields := len(c.appendRoleNames) > 0 || len(c.appendRoleIDs) > 0 + hasRoleFields := len(c.roleIDs) > 0 || len(c.roleNames) > 0 - for _, roleName := range c.roleNames { + if hasRoleFields && hasAddRoleFields { + c.UI.Error("Cannot combine the use of role-id/role-name flags with append- variants. " + + "To set or overwrite existing roles, use -role-id or -role-name. " + + "To append to existing roles, use -append-role-id or -append-role-name.") + return 1 + } + + roleNames := c.appendRoleNames + roleIDs := c.appendRoleIDs + + if hasRoleFields { + roleNames = c.roleNames + roleIDs = c.roleIDs + t.Roles = nil + } + + for _, roleName := range roleNames { // We could resolve names to IDs here but there isn't any reason why its would be better // than allowing the agent to do it. t.Roles = append(t.Roles, &api.ACLTokenRoleLink{Name: roleName}) } - for _, roleID := range c.roleIDs { + for _, roleID := range roleIDs { roleID, err := acl.GetRoleIDFromPartial(client, roleID) if err != nil { c.UI.Error(fmt.Sprintf("Error resolving role ID %s: %v", roleID, err)) diff --git a/command/acl/token/update/token_update_test.go b/command/acl/token/update/token_update_test.go index 541d1e22539..bd11d1d8e3f 100644 --- a/command/acl/token/update/token_update_test.go +++ b/command/acl/token/update/token_update_test.go @@ -148,6 +148,95 @@ func TestTokenUpdateCommand(t *testing.T) { }) } +func TestTokenUpdateCommandWithAppend(t *testing.T) { + if testing.Short() { + t.Skip("too slow for testing.Short") + } + + t.Parallel() + + a := agent.NewTestAgent(t, ` + primary_datacenter = "dc1" + acl { + enabled = true + tokens { + initial_management = "root" + } + }`) + + defer a.Shutdown() + testrpc.WaitForLeader(t, a.RPC, "dc1") + + // Create a policy + client := a.Client() + + policy, _, err := client.ACL().PolicyCreate( + &api.ACLPolicy{Name: "test-policy"}, + &api.WriteOptions{Token: "root"}, + ) + require.NoError(t, err) + + // create a token + token, _, err := client.ACL().TokenCreate( + &api.ACLToken{Description: "test", Policies: []*api.ACLTokenPolicyLink{{Name: policy.Name}}}, + &api.WriteOptions{Token: "root"}, + ) + require.NoError(t, err) + + //secondary policy + secondPolicy, _, policyErr := client.ACL().PolicyCreate( + &api.ACLPolicy{Name: "secondary-policy"}, + &api.WriteOptions{Token: "root"}, + ) + require.NoError(t, policyErr) + + //third policy + thirdPolicy, _, policyErr := client.ACL().PolicyCreate( + &api.ACLPolicy{Name: "third-policy"}, + &api.WriteOptions{Token: "root"}, + ) + require.NoError(t, policyErr) + + run := func(t *testing.T, args []string) *api.ACLToken { + ui := cli.NewMockUi() + cmd := New(ui) + + code := cmd.Run(append(args, "-format=json")) + require.Equal(t, 0, code) + require.Empty(t, ui.ErrorWriter.String()) + + var token api.ACLToken + require.NoError(t, json.Unmarshal(ui.OutputWriter.Bytes(), &token)) + return &token + } + + // update with append-policy-name + t.Run("append-policy-name", func(t *testing.T) { + token := run(t, []string{ + "-http-addr=" + a.HTTPAddr(), + "-accessor-id=" + token.AccessorID, + "-token=root", + "-append-policy-name=" + secondPolicy.Name, + "-description=test token", + }) + + require.Len(t, token.Policies, 2) + }) + + // update with append-policy-id + t.Run("append-policy-id", func(t *testing.T) { + token := run(t, []string{ + "-http-addr=" + a.HTTPAddr(), + "-accessor-id=" + token.AccessorID, + "-token=root", + "-append-policy-id=" + thirdPolicy.ID, + "-description=test token", + }) + + require.Len(t, token.Policies, 3) + }) +} + func TestTokenUpdateCommand_JSON(t *testing.T) { if testing.Short() { t.Skip("too slow for testing.Short") diff --git a/website/content/commands/acl/token/update.mdx b/website/content/commands/acl/token/update.mdx index 28158e6db79..19441e1020b 100644 --- a/website/content/commands/acl/token/update.mdx +++ b/website/content/commands/acl/token/update.mdx @@ -36,9 +36,15 @@ Usage: `consul acl token update [options]` - `merge-node-identities` - Merge the new node identities with the existing node identities. -- `-merge-policies` - Merge the new policies with the existing policies. +- `-merge-policies` - Deprecated. Merge the new policies with the existing policies. -- `-merge-roles` - Merge the new roles with the existing roles. +~> This is deprecated and will be removed in a future Consul version. Use `append-policy-id` or `append-policy-name` +instead. + +- `-merge-roles` - Deprecated. Merge the new roles with the existing roles. + +~> This is deprecated and will be removed in a future Consul version. Use `append-role-id` or `append-role-name` +instead. - `-merge-service-identities` - Merge the new service identities with the existing service identities. @@ -49,13 +55,25 @@ Usage: `consul acl token update [options]` be specified multiple times. Format is `NODENAME:DATACENTER`. Added in Consul 1.8.1. -- `-policy-id=` - ID of a policy to use for this token. May be specified multiple times. +- `-policy-id=` - ID of a policy to use for this token. Overwrites existing policies. May be specified multiple times. + +- `-policy-name=` - Name of a policy to use for this token. Overwrites existing policies. May be specified multiple times. + +~> `-policy-id` and `-policy-name` will overwrite existing token policies. Use `-append-policy-id` or `-append-policy-name` to retain existing policies. + +- `-append-policy-id=` - ID of policy to be added for this token. The token retains existing policies. May be specified multiple times. + +- `-append-policy-name=` - Name of a policy to be added for this token. The token retains existing policies. May be specified multiple times. + +- `-role-id=` - ID of a role to use for this token. Overwrites existing roles. May be specified multiple times. + +- `-role-name=` - Name of a role to use for this token. Overwrites existing roles. May be specified multiple times. -- `-policy-name=` - Name of a policy to use for this token. May be specified multiple times. +~> `-role-id` and `-role-name` will overwrite existing roles. Use `-append-role-id` or `-append-role-name` to retain the existing roles. -- `-role-id=` - ID of a role to use for this token. May be specified multiple times. +- `-append-role-id=` - ID of a role to add to this token. The token retains existing roles. May be specified multiple times. -- `-role-name=` - Name of a role to use for this token. May be specified multiple times. +- `-append-role-name=` - Name of a role to add to this token. The token retains existing roles. May be specified multiple times. - `-service-identity=` - Name of a service identity to use for this token. May be specified multiple times. Format is the `SERVICENAME` or From 367a64f059c3c073f74b89b1dc45a18d66bb1159 Mon Sep 17 00:00:00 2001 From: Nick Irvine <115657443+nfi-hashicorp@users.noreply.github.com> Date: Wed, 1 Mar 2023 12:45:27 -0800 Subject: [PATCH 092/262] NET-2292: port ingress-gateway test case "http" from BATS addendum (#16490) --- .../consul-container/libs/assert/service.go | 8 +- .../consul-container/libs/cluster/cluster.go | 6 +- .../libs/topology/peering_topology.go | 13 +- .../test/basic/connect_service_test.go | 2 +- .../test/observability/access_logs_test.go | 6 +- .../rotate_server_and_ca_then_fail_test.go | 6 +- .../test/troubleshoot/troubleshoot_test.go | 2 +- .../test/upgrade/acl_node_test.go | 2 +- .../test/upgrade/ingress_gateway_test.go | 324 ++++++++++++++++++ .../resolver_default_subset_test.go | 8 +- .../upgrade/peering_control_plane_mgw_test.go | 2 +- .../test/upgrade/peering_http_test.go | 12 +- 12 files changed, 360 insertions(+), 31 deletions(-) create mode 100644 test/integration/consul-container/test/upgrade/ingress_gateway_test.go diff --git a/test/integration/consul-container/libs/assert/service.go b/test/integration/consul-container/libs/assert/service.go index 15a03be3b61..5f793f2d6fd 100644 --- a/test/integration/consul-container/libs/assert/service.go +++ b/test/integration/consul-container/libs/assert/service.go @@ -122,8 +122,10 @@ func ServiceLogContains(t *testing.T, service libservice.Service, target string) // has a `FORTIO_NAME` env variable set. This validates that the client is sending // traffic to the right envoy proxy. // +// If reqHost is set, the Host field of the HTTP request will be set to its value. +// // It retries with timeout defaultHTTPTimeout and wait defaultHTTPWait. -func AssertFortioName(t *testing.T, urlbase string, name string) { +func AssertFortioName(t *testing.T, urlbase string, name string, reqHost string) { t.Helper() var fortioNameRE = regexp.MustCompile(("\nFORTIO_NAME=(.+)\n")) client := &http.Client{ @@ -133,11 +135,13 @@ func AssertFortioName(t *testing.T, urlbase string, name string) { } retry.RunWith(&retry.Timer{Timeout: defaultHTTPTimeout, Wait: defaultHTTPWait}, t, func(r *retry.R) { fullurl := fmt.Sprintf("%s/debug?env=dump", urlbase) - t.Logf("making call to %s", fullurl) req, err := http.NewRequest("GET", fullurl, nil) if err != nil { r.Fatal("could not make request to service ", fullurl) } + if reqHost != "" { + req.Host = reqHost + } resp, err := client.Do(req) if err != nil { diff --git a/test/integration/consul-container/libs/cluster/cluster.go b/test/integration/consul-container/libs/cluster/cluster.go index aed81396b73..f78ee01d3d1 100644 --- a/test/integration/consul-container/libs/cluster/cluster.go +++ b/test/integration/consul-container/libs/cluster/cluster.go @@ -125,10 +125,10 @@ func (c *Cluster) Add(configs []Config, serfJoin bool, ports ...int) (xe error) // Each agent gets it's own area in the cluster scratch. conf.ScratchDir = filepath.Join(c.ScratchDir, strconv.Itoa(c.Index)) if err := os.MkdirAll(conf.ScratchDir, 0777); err != nil { - return err + return fmt.Errorf("container %d: %w", idx, err) } if err := os.Chmod(conf.ScratchDir, 0777); err != nil { - return err + return fmt.Errorf("container %d: %w", idx, err) } n, err := NewConsulContainer( @@ -138,7 +138,7 @@ func (c *Cluster) Add(configs []Config, serfJoin bool, ports ...int) (xe error) ports..., ) if err != nil { - return fmt.Errorf("could not add container index %d: %w", idx, err) + return fmt.Errorf("container %d: %w", idx, err) } agents = append(agents, n) c.Index++ diff --git a/test/integration/consul-container/libs/topology/peering_topology.go b/test/integration/consul-container/libs/topology/peering_topology.go index ba36978c72f..595828e8885 100644 --- a/test/integration/consul-container/libs/topology/peering_topology.go +++ b/test/integration/consul-container/libs/topology/peering_topology.go @@ -44,12 +44,12 @@ func BasicPeeringTwoClustersSetup( peeringThroughMeshgateway bool, ) (*BuiltCluster, *BuiltCluster) { // acceptingCluster, acceptingCtx, acceptingClient := NewPeeringCluster(t, "dc1", 3, consulVersion, true) - acceptingCluster, acceptingCtx, acceptingClient := NewPeeringCluster(t, 3, &libcluster.BuildOptions{ + acceptingCluster, acceptingCtx, acceptingClient := NewPeeringCluster(t, 3, 1, &libcluster.BuildOptions{ Datacenter: "dc1", ConsulVersion: consulVersion, InjectAutoEncryption: true, }) - dialingCluster, dialingCtx, dialingClient := NewPeeringCluster(t, 1, &libcluster.BuildOptions{ + dialingCluster, dialingCtx, dialingClient := NewPeeringCluster(t, 1, 1, &libcluster.BuildOptions{ Datacenter: "dc2", ConsulVersion: consulVersion, InjectAutoEncryption: true, @@ -133,7 +133,7 @@ func BasicPeeringTwoClustersSetup( libassert.AssertUpstreamEndpointStatus(t, adminPort, fmt.Sprintf("static-server.default.%s.external", DialingPeerName), "HEALTHY", 1) _, port := clientSidecarService.GetAddr() libassert.HTTPServiceEchoes(t, "localhost", port, "") - libassert.AssertFortioName(t, fmt.Sprintf("http://localhost:%d", port), "static-server") + libassert.AssertFortioName(t, fmt.Sprintf("http://localhost:%d", port), "static-server", "") return &BuiltCluster{ Cluster: acceptingCluster, @@ -210,6 +210,7 @@ func NewDialingCluster( func NewPeeringCluster( t *testing.T, numServers int, + numClients int, buildOpts *libcluster.BuildOptions, ) (*libcluster.Cluster, *libcluster.BuildContext, *api.Client) { require.NotEmpty(t, buildOpts.Datacenter) @@ -239,7 +240,7 @@ func NewPeeringCluster( retryJoin = append(retryJoin, fmt.Sprintf("agent-%d", i)) } - // Add a stable client to register the service + // Add numClients static clients to register the service configbuiilder := libcluster.NewConfigBuilder(ctx). Client(). Peering(true). @@ -247,13 +248,13 @@ func NewPeeringCluster( clientConf := configbuiilder.ToAgentConfig(t) t.Logf("%s client config: \n%s", opts.Datacenter, clientConf.JSON) - require.NoError(t, cluster.AddN(*clientConf, 1, true)) + require.NoError(t, cluster.AddN(*clientConf, numClients, true)) // Use the client agent as the HTTP endpoint since we will not rotate it in many tests. clientNode := cluster.Agents[numServers] client := clientNode.GetClient() libcluster.WaitForLeader(t, cluster, client) - libcluster.WaitForMembers(t, client, numServers+1) + libcluster.WaitForMembers(t, client, numServers+numClients) // Default Proxy Settings ok, err := utils.ApplyDefaultProxySettings(client) diff --git a/test/integration/consul-container/test/basic/connect_service_test.go b/test/integration/consul-container/test/basic/connect_service_test.go index 419c28c11ef..6c2e0117af0 100644 --- a/test/integration/consul-container/test/basic/connect_service_test.go +++ b/test/integration/consul-container/test/basic/connect_service_test.go @@ -41,7 +41,7 @@ func TestBasicConnectService(t *testing.T) { libassert.AssertContainerState(t, clientService, "running") libassert.HTTPServiceEchoes(t, "localhost", port, "") - libassert.AssertFortioName(t, fmt.Sprintf("http://localhost:%d", port), "static-server") + libassert.AssertFortioName(t, fmt.Sprintf("http://localhost:%d", port), "static-server", "") } func createServices(t *testing.T, cluster *libcluster.Cluster) libservice.Service { diff --git a/test/integration/consul-container/test/observability/access_logs_test.go b/test/integration/consul-container/test/observability/access_logs_test.go index 6c173e7c035..e0dba8aaf98 100644 --- a/test/integration/consul-container/test/observability/access_logs_test.go +++ b/test/integration/consul-container/test/observability/access_logs_test.go @@ -45,7 +45,7 @@ func TestAccessLogs(t *testing.T) { t.Skip() } - cluster, _, _ := topology.NewPeeringCluster(t, 1, &libcluster.BuildOptions{ + cluster, _, _ := topology.NewPeeringCluster(t, 1, 1, &libcluster.BuildOptions{ Datacenter: "dc1", InjectAutoEncryption: true, }) @@ -70,7 +70,7 @@ func TestAccessLogs(t *testing.T) { // Validate Custom JSON require.Eventually(t, func() bool { libassert.HTTPServiceEchoes(t, "localhost", port, "banana") - libassert.AssertFortioName(t, fmt.Sprintf("http://localhost:%d", port), "static-server") + libassert.AssertFortioName(t, fmt.Sprintf("http://localhost:%d", port), "static-server", "") client := libassert.ServiceLogContains(t, clientService, "\"banana_path\":\"/banana\"") server := libassert.ServiceLogContains(t, serverService, "\"banana_path\":\"/banana\"") return client && server @@ -112,7 +112,7 @@ func TestAccessLogs(t *testing.T) { _, port = clientService.GetAddr() require.Eventually(t, func() bool { libassert.HTTPServiceEchoes(t, "localhost", port, "orange") - libassert.AssertFortioName(t, fmt.Sprintf("http://localhost:%d", port), "static-server") + libassert.AssertFortioName(t, fmt.Sprintf("http://localhost:%d", port), "static-server", "") client := libassert.ServiceLogContains(t, clientService, "Orange you glad I didn't say banana: /orange, -") server := libassert.ServiceLogContains(t, serverService, "Orange you glad I didn't say banana: /orange, -") return client && server diff --git a/test/integration/consul-container/test/peering/rotate_server_and_ca_then_fail_test.go b/test/integration/consul-container/test/peering/rotate_server_and_ca_then_fail_test.go index bbac9cc0340..5081433e249 100644 --- a/test/integration/consul-container/test/peering/rotate_server_and_ca_then_fail_test.go +++ b/test/integration/consul-container/test/peering/rotate_server_and_ca_then_fail_test.go @@ -94,7 +94,7 @@ func TestPeering_RotateServerAndCAThenFail_(t *testing.T) { _, port := clientSidecarService.GetAddr() libassert.HTTPServiceEchoes(t, "localhost", port, "") - libassert.AssertFortioName(t, fmt.Sprintf("http://localhost:%d", port), "static-server") + libassert.AssertFortioName(t, fmt.Sprintf("http://localhost:%d", port), "static-server", "") } testutil.RunStep(t, "rotate exporting cluster's root CA", func(t *testing.T) { @@ -144,7 +144,7 @@ func TestPeering_RotateServerAndCAThenFail_(t *testing.T) { // Connectivity should still be contained _, port := clientSidecarService.GetAddr() libassert.HTTPServiceEchoes(t, "localhost", port, "") - libassert.AssertFortioName(t, fmt.Sprintf("http://localhost:%d", port), "static-server") + libassert.AssertFortioName(t, fmt.Sprintf("http://localhost:%d", port), "static-server", "") verifySidecarHasTwoRootCAs(t, clientSidecarService) }) @@ -166,7 +166,7 @@ func TestPeering_RotateServerAndCAThenFail_(t *testing.T) { _, port := clientSidecarService.GetAddr() libassert.HTTPServiceEchoes(t, "localhost", port, "") - libassert.AssertFortioName(t, fmt.Sprintf("http://localhost:%d", port), "static-server") + libassert.AssertFortioName(t, fmt.Sprintf("http://localhost:%d", port), "static-server", "") }) } diff --git a/test/integration/consul-container/test/troubleshoot/troubleshoot_test.go b/test/integration/consul-container/test/troubleshoot/troubleshoot_test.go index 3470e738922..1f7a1405db4 100644 --- a/test/integration/consul-container/test/troubleshoot/troubleshoot_test.go +++ b/test/integration/consul-container/test/troubleshoot/troubleshoot_test.go @@ -18,7 +18,7 @@ import ( func TestTroubleshootProxy(t *testing.T) { t.Parallel() - cluster, _, _ := topology.NewPeeringCluster(t, 1, &libcluster.BuildOptions{ + cluster, _, _ := topology.NewPeeringCluster(t, 1, 1, &libcluster.BuildOptions{ Datacenter: "dc1", InjectAutoEncryption: true, }) diff --git a/test/integration/consul-container/test/upgrade/acl_node_test.go b/test/integration/consul-container/test/upgrade/acl_node_test.go index 26095cf1748..7c12bb8dfc3 100644 --- a/test/integration/consul-container/test/upgrade/acl_node_test.go +++ b/test/integration/consul-container/test/upgrade/acl_node_test.go @@ -36,7 +36,7 @@ func TestACL_Upgrade_Node_Token(t *testing.T) { run := func(t *testing.T, tc testcase) { // NOTE: Disable auto.encrypt due to its conflict with ACL token during bootstrap - cluster, _, _ := libtopology.NewPeeringCluster(t, 1, &libcluster.BuildOptions{ + cluster, _, _ := libtopology.NewPeeringCluster(t, 1, 1, &libcluster.BuildOptions{ Datacenter: "dc1", ConsulVersion: tc.oldversion, InjectAutoEncryption: false, diff --git a/test/integration/consul-container/test/upgrade/ingress_gateway_test.go b/test/integration/consul-container/test/upgrade/ingress_gateway_test.go new file mode 100644 index 00000000000..2345e98ec2e --- /dev/null +++ b/test/integration/consul-container/test/upgrade/ingress_gateway_test.go @@ -0,0 +1,324 @@ +package upgrade + +import ( + "context" + "fmt" + "io" + "net/http" + "net/url" + "testing" + "time" + + "github.com/docker/go-connections/nat" + "github.com/hashicorp/consul/api" + "github.com/hashicorp/consul/sdk/testutil/retry" + libassert "github.com/hashicorp/consul/test/integration/consul-container/libs/assert" + libcluster "github.com/hashicorp/consul/test/integration/consul-container/libs/cluster" + libservice "github.com/hashicorp/consul/test/integration/consul-container/libs/service" + "github.com/hashicorp/consul/test/integration/consul-container/libs/topology" + libutils "github.com/hashicorp/consul/test/integration/consul-container/libs/utils" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +// These tests adapt BATS-based tests from test/integration/connect/case-ingress-gateway* + +// TestIngressGateway_UpgradeToTarget_fromLatest: +// - starts a cluster with 2 static services, +// - configures an ingress gateway + router +// - performs tests to ensure our routing rules work (namely header manipulation) +// - upgrades the cluster +// - performs these tests again +func TestIngressGateway_UpgradeToTarget_fromLatest(t *testing.T) { + t.Parallel() + type testcase struct { + oldversion string + targetVersion string + } + tcs := []testcase{ + { + oldversion: "1.13", + targetVersion: libutils.TargetVersion, + }, + { + oldversion: "1.14", + targetVersion: libutils.TargetVersion, + }, + } + + run := func(t *testing.T, oldVersion, targetVersion string) { + // setup + // TODO? we don't need a peering cluster, so maybe this is overkill + cluster, _, client := topology.NewPeeringCluster(t, 1, 2, &libcluster.BuildOptions{ + Datacenter: "dc1", + ConsulVersion: oldVersion, + // TODO? InjectAutoEncryption: true, + }) + + // upsert config entry making http default protocol for global + require.NoError(t, cluster.ConfigEntryWrite(&api.ProxyConfigEntry{ + Name: api.ProxyConfigGlobal, + Kind: api.ProxyDefaults, + Config: map[string]interface{}{ + "protocol": "http", + }, + })) + + const ( + nameIG = "ingress-gateway" + nameRouter = "router" + ) + + // upsert config entry for `service-router` `router`: + // - prefix matching `/$nameS1` goes to service s1 + // - prefix matching `/$nameS2` goes to service s2 + const nameS1 = libservice.StaticServerServiceName + const nameS2 = libservice.StaticServer2ServiceName + require.NoError(t, cluster.ConfigEntryWrite(&api.ServiceRouterConfigEntry{ + Kind: api.ServiceRouter, + // This is a "virtual" service name and will not have a backing + // service definition. It must match the name defined in the ingress + // configuration. + Name: nameRouter, + Routes: []api.ServiceRoute{ + { + Match: &api.ServiceRouteMatch{ + HTTP: &api.ServiceRouteHTTPMatch{ + PathPrefix: fmt.Sprintf("/%s/", nameS1), + }, + }, + Destination: &api.ServiceRouteDestination{ + Service: nameS1, + PrefixRewrite: "/", + }, + }, + { + Match: &api.ServiceRouteMatch{ + HTTP: &api.ServiceRouteHTTPMatch{ + PathPrefix: fmt.Sprintf("/%s/", nameS2), + }, + }, + Destination: &api.ServiceRouteDestination{ + Service: nameS2, + PrefixRewrite: "/", + }, + }, + }, + })) + + igw, err := libservice.NewGatewayService(context.Background(), nameIG, "ingress", cluster.Servers()[0]) + require.NoError(t, err) + t.Logf("created gateway: %#v", igw) + + // upsert config entry for ingress-gateway ig1, protocol http, service s1 + // - listener points at service `router` + // - add request headers: 1 new, 1 existing + // - set request headers: 1 existing, 1 new, to client IP + // - add response headers: 1 new, 1 existing + // - set response headers: 1 existing + // - remove response header: 1 existing + + // this must be one of the externally-mapped ports from + // https://github.com/hashicorp/consul/blob/c5e729e86576771c4c22c6da1e57aaa377319323/test/integration/consul-container/libs/cluster/container.go#L521-L525 + const portRouter = 8080 + require.NoError(t, cluster.ConfigEntryWrite(&api.IngressGatewayConfigEntry{ + Kind: api.IngressGateway, + Name: nameIG, + Listeners: []api.IngressListener{ + { + Port: portRouter, + Protocol: "http", + Services: []api.IngressService{ + { + Name: nameRouter, + // TODO: extract these header values to consts to test + RequestHeaders: &api.HTTPHeaderModifiers{ + Add: map[string]string{ + "x-foo": "bar-req", + "x-existing-1": "appended-req", + }, + Set: map[string]string{ + "x-existing-2": "replaced-req", + "x-client-ip": "%DOWNSTREAM_REMOTE_ADDRESS_WITHOUT_PORT%", + }, + Remove: []string{"x-bad-req"}, + }, + ResponseHeaders: &api.HTTPHeaderModifiers{ + Add: map[string]string{ + "x-foo": "bar-resp", + "x-existing-1": "appended-resp", + }, + Set: map[string]string{ + "x-existing-2": "replaced-resp", + }, + Remove: []string{"x-bad-resp"}, + }, + }, + }, + }, + }, + })) + + // create s1 + _, _, err = libservice.CreateAndRegisterStaticServerAndSidecar( + cluster.Clients()[0], + &libservice.ServiceOpts{ + Name: nameS1, + ID: nameS1, + HTTPPort: 8080, + GRPCPort: 8079, + }, + ) + require.NoError(t, err) + libassert.CatalogServiceExists(t, client, nameS1) + + // create s2 + _, _, err = libservice.CreateAndRegisterStaticServerAndSidecar( + cluster.Clients()[1], + &libservice.ServiceOpts{ + Name: nameS2, + ID: nameS2, + HTTPPort: 8080, + GRPCPort: 8079, + }, + ) + require.NoError(t, err) + libassert.CatalogServiceExists(t, client, nameS2) + + // checks + // TODO: other checks from verify.bats + // ingress-gateway proxy admin up + // s1 proxy admin up + // s2 proxy admin up + // s1 proxy listener has right cert + // s2 proxy listener has right cert + // ig1 has healthy endpoints for s1 + // ig1 has healthy endpoints for s2 + // TODO ^ ??? s1 and s2 aren't direct listeners, only in `router`, so why are they endpoints? + + // tests + tests := func(t *testing.T) { + // fortio name should be $nameS for /$nameS prefix on router + portRouterMapped, _ := cluster.Servers()[0].GetPod().MappedPort( + context.Background(), + nat.Port(fmt.Sprintf("%d/tcp", portRouter)), + ) + reqHost := fmt.Sprintf("router.ingress.consul:%d", portRouter) + libassert.AssertFortioName(t, + fmt.Sprintf("http://localhost:%d/%s", portRouterMapped.Int(), nameS1), nameS1, reqHost) + libassert.AssertFortioName(t, + fmt.Sprintf("http://localhost:%d/%s", portRouterMapped.Int(), nameS2), nameS2, reqHost) + urlbaseS2 := fmt.Sprintf("http://%s/%s", reqHost, nameS2) + + t.Run("request header manipulation", func(t *testing.T) { + resp := mappedHTTPGET(t, fmt.Sprintf("%s/debug?env=dump", urlbaseS2), portRouterMapped.Int(), http.Header(map[string][]string{ + "X-Existing-1": {"original"}, + "X-Existing-2": {"original"}, + "X-Bad-Req": {"true"}, + })) + defer resp.Body.Close() + body, err := io.ReadAll(resp.Body) + require.NoError(t, err) + + // The following check the body, which should echo the headers received + // by the fortio container + assert.Contains(t, string(body), "X-Foo: bar-req", + "Ingress should have added the new request header") + assert.Contains(t, string(body), "X-Existing-1: original,appended-req", + "Ingress should have appended the first existing header - both should be present") + assert.Contains(t, string(body), "X-Existing-2: replaced-req", + "Ingress should have replaced the second existing header") + // TODO: This 172. is the prefix of the IP for the gateway for our docker network. + // Perhaps there's some way to look this up. + // This is a deviation from BATS, because their tests run inside Docker, and ours run outside. + assert.Contains(t, string(body), "X-Client-Ip: 172.", + "Ingress should have set the client ip from dynamic Envoy variable") + assert.NotContains(t, string(body), "X-Bad-Req: true", + "Ingress should have removed the bad request header") + + }) + t.Run("response header manipulation", func(t *testing.T) { + const params = "?header=x-bad-resp:true&header=x-existing-1:original&header=x-existing-2:original" + resp := mappedHTTPGET(t, + fmt.Sprintf("%s/echo%s", urlbaseS2, params), + portRouterMapped.Int(), + nil, + ) + defer resp.Body.Close() + + assert.Contains(t, resp.Header.Values("x-foo"), "bar-resp", + "Ingress should have added the new response header") + assert.Contains(t, resp.Header.Values("x-existing-1"), "original", + "Ingress should have appended the first existing header - both should be present") + assert.Contains(t, resp.Header.Values("x-existing-1"), "appended-resp", + "Ingress should have appended the first existing header - both should be present") + assert.Contains(t, resp.Header.Values("x-existing-2"), "replaced-resp", + "Ingress should have replaced the second existing header") + assert.NotContains(t, resp.Header.Values("x-existing-2"), "original", + "x-existing-2 response header should have been overridden") + assert.NotContains(t, resp.Header.Values("x-bad-resp"), "true", + "X-Bad-Resp response header should have been stripped") + }) + } + t.Run(fmt.Sprintf("pre-upgrade from %s to %s", oldVersion, targetVersion), func(t *testing.T) { + tests(t) + }) + + if t.Failed() { + t.Fatal("failing fast: failed assertions pre-upgrade") + } + + // Upgrade the cluster to targetVersion + t.Logf("Upgrade to version %s", targetVersion) + err = cluster.StandardUpgrade(t, context.Background(), targetVersion) + require.NoError(t, err) + require.NoError(t, igw.Restart()) + + t.Run(fmt.Sprintf("post-upgrade from %s to %s", oldVersion, targetVersion), func(t *testing.T) { + tests(t) + }) + } + for _, tc := range tcs { + // copy to avoid lint loopclosure + tc := tc + t.Run(fmt.Sprintf("upgrade from %s to %s", tc.oldversion, tc.targetVersion), + func(t *testing.T) { + t.Parallel() + run(t, tc.oldversion, tc.targetVersion) + }) + time.Sleep(3 * time.Second) + } +} + +func mappedHTTPGET(t *testing.T, uri string, mappedPort int, header http.Header) *http.Response { + t.Helper() + var hostHdr string + u, _ := url.Parse(uri) + hostHdr = u.Host + u.Host = fmt.Sprintf("localhost:%d", mappedPort) + uri = u.String() + client := &http.Client{ + Transport: &http.Transport{ + DisableKeepAlives: true, + }, + } + var resp *http.Response + retry.RunWith(&retry.Timer{Timeout: 1 * time.Minute, Wait: 50 * time.Millisecond}, t, func(r *retry.R) { + req, err := http.NewRequest("GET", uri, nil) + if header != nil { + req.Header = header + } + if err != nil { + r.Fatal("could not make request to service ", uri) + } + if hostHdr != "" { + req.Host = hostHdr + } + + resp, err = client.Do(req) + if err != nil { + r.Fatal("could not make call to service ", uri) + } + }) + return resp +} diff --git a/test/integration/consul-container/test/upgrade/l7_traffic_management/resolver_default_subset_test.go b/test/integration/consul-container/test/upgrade/l7_traffic_management/resolver_default_subset_test.go index 2203954a44d..6d69cf57f04 100644 --- a/test/integration/consul-container/test/upgrade/l7_traffic_management/resolver_default_subset_test.go +++ b/test/integration/consul-container/test/upgrade/l7_traffic_management/resolver_default_subset_test.go @@ -121,7 +121,7 @@ func TestTrafficManagement_ServiceResolver(t *testing.T) { libassert.AssertUpstreamEndpointStatus(t, adminPort, "v2.static-server.default", "HEALTHY", 1) // static-client upstream should connect to static-server-v2 because the default subset value is to v2 set in the service resolver - libassert.AssertFortioName(t, fmt.Sprintf("http://localhost:%d", port), "static-server-v2") + libassert.AssertFortioName(t, fmt.Sprintf("http://localhost:%d", port), "static-server-v2", "") }, }, { @@ -194,7 +194,7 @@ func TestTrafficManagement_ServiceResolver(t *testing.T) { libassert.AssertUpstreamEndpointStatus(t, adminPort, "test.static-server.default", "UNHEALTHY", 1) // static-client upstream should connect to static-server since it is passing - libassert.AssertFortioName(t, fmt.Sprintf("http://localhost:%d", port), libservice.StaticServerServiceName) + libassert.AssertFortioName(t, fmt.Sprintf("http://localhost:%d", port), libservice.StaticServerServiceName, "") // ########################### // ## with onlypassing=false @@ -318,7 +318,7 @@ func TestTrafficManagement_ServiceResolver(t *testing.T) { _, appPort := clientConnectProxy.GetAddr() _, adminPort := clientConnectProxy.GetAdminAddr() - libassert.AssertFortioName(t, fmt.Sprintf("http://localhost:%d", appPort), "static-server-2-v2") + libassert.AssertFortioName(t, fmt.Sprintf("http://localhost:%d", appPort), "static-server-2-v2", "") libassert.AssertUpstreamEndpointStatus(t, adminPort, "v2.static-server-2.default", "HEALTHY", 1) }, }, @@ -335,7 +335,7 @@ func TestTrafficManagement_ServiceResolver(t *testing.T) { if oldVersionTmp.LessThan(libutils.Version_1_14) { buildOpts.InjectAutoEncryption = false } - cluster, _, _ := topology.NewPeeringCluster(t, 1, buildOpts) + cluster, _, _ := topology.NewPeeringCluster(t, 1, 1, buildOpts) node := cluster.Agents[0] client := node.GetClient() diff --git a/test/integration/consul-container/test/upgrade/peering_control_plane_mgw_test.go b/test/integration/consul-container/test/upgrade/peering_control_plane_mgw_test.go index 5ccba956773..f9407d60055 100644 --- a/test/integration/consul-container/test/upgrade/peering_control_plane_mgw_test.go +++ b/test/integration/consul-container/test/upgrade/peering_control_plane_mgw_test.go @@ -102,7 +102,7 @@ func TestPeering_Upgrade_ControlPlane_MGW(t *testing.T) { require.NoError(t, clientSidecarService.Restart()) libassert.AssertUpstreamEndpointStatus(t, adminPort, fmt.Sprintf("static-server.default.%s.external", libtopology.DialingPeerName), "HEALTHY", 1) libassert.HTTPServiceEchoes(t, "localhost", port, "") - libassert.AssertFortioName(t, fmt.Sprintf("http://localhost:%d", port), "static-server") + libassert.AssertFortioName(t, fmt.Sprintf("http://localhost:%d", port), "static-server", "") } for _, tc := range tcs { diff --git a/test/integration/consul-container/test/upgrade/peering_http_test.go b/test/integration/consul-container/test/upgrade/peering_http_test.go index f1d52777a7d..04a93638a85 100644 --- a/test/integration/consul-container/test/upgrade/peering_http_test.go +++ b/test/integration/consul-container/test/upgrade/peering_http_test.go @@ -100,7 +100,7 @@ func TestPeering_UpgradeToTarget_fromLatest(t *testing.T) { return serverConnectProxy, nil, func() {}, err }, extraAssertion: func(clientUpstreamPort int) { - libassert.AssertFortioName(t, fmt.Sprintf("http://localhost:%d/static-server-2", clientUpstreamPort), "static-server-2") + libassert.AssertFortioName(t, fmt.Sprintf("http://localhost:%d/static-server-2", clientUpstreamPort), "static-server-2", "") }, }, { @@ -301,14 +301,14 @@ func TestPeering_UpgradeToTarget_fromLatest(t *testing.T) { _, appPorts := clientConnectProxy.GetAddrs() assertionFn := func() { // assert traffic can fail-over to static-server in peered cluster and restor to local static-server - libassert.AssertFortioName(t, fmt.Sprintf("http://localhost:%d", appPorts[0]), "static-server-dialing") + libassert.AssertFortioName(t, fmt.Sprintf("http://localhost:%d", appPorts[0]), "static-server-dialing", "") require.NoError(t, serverConnectProxy.Stop()) - libassert.AssertFortioName(t, fmt.Sprintf("http://localhost:%d", appPorts[0]), "static-server") + libassert.AssertFortioName(t, fmt.Sprintf("http://localhost:%d", appPorts[0]), "static-server", "") require.NoError(t, serverConnectProxy.Start()) - libassert.AssertFortioName(t, fmt.Sprintf("http://localhost:%d", appPorts[0]), "static-server-dialing") + libassert.AssertFortioName(t, fmt.Sprintf("http://localhost:%d", appPorts[0]), "static-server-dialing", "") // assert peer-static-server resolves to static-server in peered cluster - libassert.AssertFortioName(t, fmt.Sprintf("http://localhost:%d", appPorts[1]), "static-server") + libassert.AssertFortioName(t, fmt.Sprintf("http://localhost:%d", appPorts[1]), "static-server", "") } return serverConnectProxy, clientConnectProxy, assertionFn, nil }, @@ -376,7 +376,7 @@ func TestPeering_UpgradeToTarget_fromLatest(t *testing.T) { _, adminPort := clientSidecarService.GetAdminAddr() libassert.AssertUpstreamEndpointStatus(t, adminPort, fmt.Sprintf("static-server.default.%s.external", libtopology.DialingPeerName), "HEALTHY", 1) libassert.HTTPServiceEchoes(t, "localhost", port, "") - libassert.AssertFortioName(t, fmt.Sprintf("http://localhost:%d", port), "static-server") + libassert.AssertFortioName(t, fmt.Sprintf("http://localhost:%d", port), "static-server", "") // TODO: restart static-server-2's sidecar tc.extraAssertion(appPort) From 21c30958cc89ba4a14a099d758002bc0a0ecc454 Mon Sep 17 00:00:00 2001 From: David Yu Date: Wed, 1 Mar 2023 14:21:32 -0800 Subject: [PATCH 093/262] docs: Update release notes with Envoy compat issue (#16494) * Update v1_15_x.mdx --------- Co-authored-by: Tu Nguyen --- .../content/docs/release-notes/consul/v1_15_x.mdx | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/website/content/docs/release-notes/consul/v1_15_x.mdx b/website/content/docs/release-notes/consul/v1_15_x.mdx index 319deb16f65..dbd6392467c 100644 --- a/website/content/docs/release-notes/consul/v1_15_x.mdx +++ b/website/content/docs/release-notes/consul/v1_15_x.mdx @@ -68,6 +68,18 @@ For more detailed information, please refer to the [upgrade details page](/consu The following issues are known to exist in the v1.15.0 release: +- For v1.15.0, Consul is reporting newer releases of Envoy (for example, v1.25.1) as not supported, even though these versions are listed as valid in the [Envoy compatilibity matrix](/consul/docs/connect/proxies/envoy#envoy-and-consul-client-agent). The following error would result for newer versions of Envoy: + + ```log hideClipboard + Envoy version 1.25.1 is not supported. If there is a reason you need to use this version of envoy use the ignore-envoy-compatibility flag. Using an unsupported version of Envoy is not recommended and your experience may vary. + ``` + + The workaround to resolve this issue until Consul v1.15.1 would be to run the client agents with the new `ingore-envoy-compatiblity` flag: + + ```shell-session + $ consul connect envoy --ignore-envoy-compatibility + ``` + - For v1.15.0, there is a known issue where `consul acl token read -self` requires an `-accessor-id`. This is resolved in the uppcoming Consul v1.15.1 patch release. - For v1.15.0, there is a known issue where search filters produced errors and resulted in lists not showing full results until being interacted with. This is resolved in the upcoming Consul v1.15.1 patch release. From b177dc4e2b2703cee260b77d37ac551544f12344 Mon Sep 17 00:00:00 2001 From: "Chris S. Kim" Date: Thu, 2 Mar 2023 12:08:03 -0500 Subject: [PATCH 094/262] Suppress AlreadyRegisteredError to fix test retries (#16501) * Suppress AlreadyRegisteredError to fix test retries * Remove duplicate sink --- lib/telemetry.go | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/lib/telemetry.go b/lib/telemetry.go index b5815ff64e6..d07dea96d54 100644 --- a/lib/telemetry.go +++ b/lib/telemetry.go @@ -14,6 +14,7 @@ import ( "github.com/armon/go-metrics/prometheus" "github.com/hashicorp/go-hclog" "github.com/hashicorp/go-multierror" + prometheuscore "github.com/prometheus/client_golang/prometheus" "github.com/hashicorp/consul/lib/retry" ) @@ -258,7 +259,7 @@ func dogstatdSink(cfg TelemetryConfig, hostname string) (metrics.MetricSink, err return sink, nil } -func prometheusSink(cfg TelemetryConfig, hostname string) (metrics.MetricSink, error) { +func prometheusSink(cfg TelemetryConfig, _ string) (metrics.MetricSink, error) { if cfg.PrometheusOpts.Expiration.Nanoseconds() < 1 { return nil, nil @@ -266,12 +267,19 @@ func prometheusSink(cfg TelemetryConfig, hostname string) (metrics.MetricSink, e sink, err := prometheus.NewPrometheusSinkFrom(cfg.PrometheusOpts) if err != nil { + // During testing we may try to register the same metrics collector + // multiple times in a single run (e.g. a metrics test fails and + // we attempt a retry), resulting in an AlreadyRegisteredError. + // Suppress this and move on. + if errors.As(err, &prometheuscore.AlreadyRegisteredError{}) { + return nil, nil + } return nil, err } return sink, nil } -func circonusSink(cfg TelemetryConfig, hostname string) (metrics.MetricSink, error) { +func circonusSink(cfg TelemetryConfig, _ string) (metrics.MetricSink, error) { token := cfg.CirconusAPIToken url := cfg.CirconusSubmissionURL if token == "" && url == "" { @@ -337,7 +345,6 @@ func configureSinks(cfg TelemetryConfig, memSink metrics.MetricSink) (metrics.Fa addSink(statsdSink) addSink(dogstatdSink) addSink(circonusSink) - addSink(circonusSink) addSink(prometheusSink) if len(sinks) > 0 { From 321439f5a79bfd450a43556bce9304ed38674e6d Mon Sep 17 00:00:00 2001 From: "Chris S. Kim" Date: Thu, 2 Mar 2023 14:36:44 -0500 Subject: [PATCH 095/262] Speed up test by registering services concurrently (#16509) --- agent/dns_test.go | 32 +++++++++++++++++++------------- 1 file changed, 19 insertions(+), 13 deletions(-) diff --git a/agent/dns_test.go b/agent/dns_test.go index 501564c66c2..1cc74213890 100644 --- a/agent/dns_test.go +++ b/agent/dns_test.go @@ -16,6 +16,7 @@ import ( "github.com/hashicorp/serf/coordinate" "github.com/miekg/dns" "github.com/stretchr/testify/require" + "golang.org/x/sync/errgroup" "github.com/hashicorp/consul/agent/config" "github.com/hashicorp/consul/agent/consul" @@ -4883,21 +4884,26 @@ func TestDNS_TCP_and_UDP_Truncate(t *testing.T) { services := []string{"normal", "truncated"} for index, service := range services { numServices := (index * 5000) + 2 + var eg errgroup.Group for i := 1; i < numServices; i++ { - args := &structs.RegisterRequest{ - Datacenter: "dc1", - Node: fmt.Sprintf("%s-%d.acme.com", service, i), - Address: fmt.Sprintf("127.%d.%d.%d", 0, (i / 255), i%255), - Service: &structs.NodeService{ - Service: service, - Port: 8000, - }, - } + j := i + eg.Go(func() error { + args := &structs.RegisterRequest{ + Datacenter: "dc1", + Node: fmt.Sprintf("%s-%d.acme.com", service, j), + Address: fmt.Sprintf("127.%d.%d.%d", 0, (j / 255), j%255), + Service: &structs.NodeService{ + Service: service, + Port: 8000, + }, + } - var out struct{} - if err := a.RPC(context.Background(), "Catalog.Register", args, &out); err != nil { - t.Fatalf("err: %v", err) - } + var out struct{} + return a.RPC(context.Background(), "Catalog.Register", args, &out) + }) + } + if err := eg.Wait(); err != nil { + t.Fatalf("error registering: %v", err) } // Register an equivalent prepared query. From 421106908072325ae05bb2a22c0da63592c35c09 Mon Sep 17 00:00:00 2001 From: John Eikenberry Date: Thu, 2 Mar 2023 20:33:06 +0000 Subject: [PATCH 096/262] add provider ca support for jwt file base auth Adds support for a jwt token in a file. Simply reads the file and sends the read in jwt along to the vault login. It also supports a legacy mode with the jwt string being passed directly. In which case the path is made optional. --- .changelog/16266.txt | 3 + agent/connect/ca/provider_vault.go | 3 +- agent/connect/ca/provider_vault_auth_jwt.go | 50 +++++++++++++ agent/connect/ca/provider_vault_auth_test.go | 74 ++++++++++++++++++++ agent/connect/ca/provider_vault_test.go | 2 +- 5 files changed, 130 insertions(+), 2 deletions(-) create mode 100644 .changelog/16266.txt create mode 100644 agent/connect/ca/provider_vault_auth_jwt.go diff --git a/.changelog/16266.txt b/.changelog/16266.txt new file mode 100644 index 00000000000..72dbc398007 --- /dev/null +++ b/.changelog/16266.txt @@ -0,0 +1,3 @@ +```release-note:improvement +ca: support Vault agent auto-auth config for Vault CA provider using JWT authentication. +``` diff --git a/agent/connect/ca/provider_vault.go b/agent/connect/ca/provider_vault.go index 7954e7ea032..1244c79455c 100644 --- a/agent/connect/ca/provider_vault.go +++ b/agent/connect/ca/provider_vault.go @@ -935,6 +935,8 @@ func configureVaultAuthMethod(authMethod *structs.VaultAuthMethod) (VaultAuthent return NewAzureAuthClient(authMethod) case VaultAuthMethodTypeGCP: return NewGCPAuthClient(authMethod) + case VaultAuthMethodTypeJWT: + return NewJwtAuthClient(authMethod) case VaultAuthMethodTypeKubernetes: // For the Kubernetes Auth method, we will try to read the JWT token // from the default service account file location if jwt was not provided. @@ -972,7 +974,6 @@ func configureVaultAuthMethod(authMethod *structs.VaultAuthMethod) (VaultAuthent VaultAuthMethodTypeAppRole, VaultAuthMethodTypeCloudFoundry, VaultAuthMethodTypeGitHub, - VaultAuthMethodTypeJWT, VaultAuthMethodTypeKerberos, VaultAuthMethodTypeTLS: return NewVaultAPIAuthClient(authMethod, loginPath), nil diff --git a/agent/connect/ca/provider_vault_auth_jwt.go b/agent/connect/ca/provider_vault_auth_jwt.go new file mode 100644 index 00000000000..e95481b55c8 --- /dev/null +++ b/agent/connect/ca/provider_vault_auth_jwt.go @@ -0,0 +1,50 @@ +package ca + +import ( + "fmt" + "os" + "strings" + + "github.com/hashicorp/consul/agent/structs" +) + +func NewJwtAuthClient(authMethod *structs.VaultAuthMethod) (*VaultAuthClient, error) { + params := authMethod.Params + + role, ok := params["role"].(string) + if !ok || strings.TrimSpace(role) == "" { + return nil, fmt.Errorf("missing 'role' value") + } + + authClient := NewVaultAPIAuthClient(authMethod, "") + if legacyCheck(params, "jwt") { + return authClient, nil + } + + // The path is required for the auto-auth config, but this auth provider + // seems to be used for jwt based auth by directly passing the jwt token. + // So we only require the token file path if the token string isn't + // present. + tokenPath, ok := params["path"].(string) + if !ok || strings.TrimSpace(tokenPath) == "" { + return nil, fmt.Errorf("missing 'path' value") + } + authClient.LoginDataGen = JwtLoginDataGen + return authClient, nil +} + +func JwtLoginDataGen(authMethod *structs.VaultAuthMethod) (map[string]any, error) { + params := authMethod.Params + role := params["role"].(string) + + tokenPath := params["path"].(string) + rawToken, err := os.ReadFile(tokenPath) + if err != nil { + return nil, err + } + + return map[string]any{ + "role": role, + "jwt": strings.TrimSpace(string(rawToken)), + }, nil +} diff --git a/agent/connect/ca/provider_vault_auth_test.go b/agent/connect/ca/provider_vault_auth_test.go index 2b0a04a46fa..7a38729307c 100644 --- a/agent/connect/ca/provider_vault_auth_test.go +++ b/agent/connect/ca/provider_vault_auth_test.go @@ -428,3 +428,77 @@ func TestVaultCAProvider_AzureAuthClient(t *testing.T) { }) } } + +func TestVaultCAProvider_JwtAuthClient(t *testing.T) { + tokenF, err := os.CreateTemp("", "token-path") + require.NoError(t, err) + defer func() { os.Remove(tokenF.Name()) }() + _, err = tokenF.WriteString("test-token") + require.NoError(t, err) + err = tokenF.Close() + require.NoError(t, err) + + cases := map[string]struct { + authMethod *structs.VaultAuthMethod + expData map[string]any + expErr error + }{ + "base-case": { + authMethod: &structs.VaultAuthMethod{ + Type: "jwt", + Params: map[string]any{ + "role": "test-role", + "path": tokenF.Name(), + }, + }, + expData: map[string]any{ + "role": "test-role", + "jwt": "test-token", + }, + }, + "no-role": { + authMethod: &structs.VaultAuthMethod{ + Type: "jwt", + Params: map[string]any{}, + }, + expErr: fmt.Errorf("missing 'role' value"), + }, + "no-path": { + authMethod: &structs.VaultAuthMethod{ + Type: "jwt", + Params: map[string]any{ + "role": "test-role", + }, + }, + expErr: fmt.Errorf("missing 'path' value"), + }, + "no-path-but-jwt": { + authMethod: &structs.VaultAuthMethod{ + Type: "jwt", + Params: map[string]any{ + "role": "test-role", + "jwt": "test-jwt", + }, + }, + expData: map[string]any{ + "role": "test-role", + "jwt": "test-jwt", + }, + }, + } + for name, c := range cases { + t.Run(name, func(t *testing.T) { + auth, err := NewJwtAuthClient(c.authMethod) + if c.expErr != nil { + require.EqualError(t, c.expErr, err.Error()) + return + } + require.NoError(t, err) + if auth.LoginDataGen != nil { + data, err := auth.LoginDataGen(c.authMethod) + require.NoError(t, err) + require.Equal(t, c.expData, data) + } + }) + } +} diff --git a/agent/connect/ca/provider_vault_test.go b/agent/connect/ca/provider_vault_test.go index 173d2c5549a..a834c718771 100644 --- a/agent/connect/ca/provider_vault_test.go +++ b/agent/connect/ca/provider_vault_test.go @@ -111,7 +111,7 @@ func TestVaultCAProvider_configureVaultAuthMethod(t *testing.T) { "cf": {expLoginPath: "auth/cf/login"}, "github": {expLoginPath: "auth/github/login"}, "gcp": {expLoginPath: "auth/gcp/login", params: map[string]interface{}{"type": "iam", "role": "test-role"}}, - "jwt": {expLoginPath: "auth/jwt/login"}, + "jwt": {expLoginPath: "auth/jwt/login", params: map[string]any{"role": "test-role", "path": "test-path"}, hasLDG: true}, "kerberos": {expLoginPath: "auth/kerberos/login"}, "kubernetes": {expLoginPath: "auth/kubernetes/login", params: map[string]interface{}{"jwt": "fake"}}, "ldap": {expLoginPath: "auth/ldap/login/foo", params: map[string]interface{}{"username": "foo"}}, From bbbdc5f4e56ed75fd4579f5b1ff211bfa8c4e2c1 Mon Sep 17 00:00:00 2001 From: Michael Hofer Date: Thu, 2 Mar 2023 22:02:52 +0100 Subject: [PATCH 097/262] docs(architecture): remove merge conflict leftovers (#16507) --- website/content/docs/architecture/scale.mdx | 4 ---- 1 file changed, 4 deletions(-) diff --git a/website/content/docs/architecture/scale.mdx b/website/content/docs/architecture/scale.mdx index ecf5035f98b..f05c4b094cf 100644 --- a/website/content/docs/architecture/scale.mdx +++ b/website/content/docs/architecture/scale.mdx @@ -280,8 +280,4 @@ At scale, using Consul as a backend for Vault results in increased memory and CP In situations where Consul handles large amounts of data and has high write throughput, we recommend adding monitoring for the [capacity and health of raft replication on servers](/consul/docs/agent/telemetry#raft-replication-capacity-issues). If the server experiences heavy load when the size of its stored data is large enough, a follower may be unable to catch up on replication and become a voter after restarting. This situation occurs when the time it takes for a server to restore from disk takes longer than it takes for the leader to write a new snapshot and truncate its logs. Refer to [Raft snapshots](#raft-snapshots) for more information. -<<<<<<< HEAD Vault v1.4 and higher provides [integrated storage](/vault/docs/concepts/integrated-storage) as its recommended storage option. If you currently use Consul as a storage backend for Vault, we recommend switching to integrated storage. For a comparison between Vault's integrated storage and Consul as a backend for Vault, refer to [storage backends in the Vault documentation](/vault/docs/configuration/storage#integrated-storage-vs-consul-as-vault-storage). For detailed guidance on migrating the Vault backend from Consul to Vault's integrated storage, refer to the [storage migration tutorial](/vault/docs/configuration/storage#integrated-storage-vs-consul-as-vault-storage). Integrated storage improves resiliency by preventing a Consul outage from also affecting Vault functionality. -======= -Vault v1.4 and higher provides [integrated storage](/vault/docs/concepts/integrated-storage) as its recommended storage option. If you currently use Consul as a storage backend for Vault, we recommend switching to integrated storage. For a comparison between Vault's integrated storage and Consul as a backend for Vault, refer to [storage backends in the Vault documentation](/vault/docs/configuration/storage#integrated-storage-vs-consul-as-vault-storage). For detailed guidance on migrating the Vault backend from Consul to Vault's integrated storage, refer to the [storage migration tutorial](/vault/docs/configuration/storage#integrated-storage-vs-consul-as-vault-storage). Integrated storage improves resiliency by preventing a Consul outage from also affecting Vault functionality. ->>>>>>> main From e8eec1fa8068c3a0a1d34a13eb5a1704491cfffb Mon Sep 17 00:00:00 2001 From: John Eikenberry Date: Thu, 2 Mar 2023 22:05:40 +0000 Subject: [PATCH 098/262] add provider ca auth support for kubernetes Adds support for Kubernetes jwt/token file based auth. Only needs to read the file and save the contents as the jwt/token. --- .changelog/16262.txt | 3 + agent/connect/ca/provider_vault.go | 21 +++---- agent/connect/ca/provider_vault_auth_k8s.go | 47 ++++++++++++++ agent/connect/ca/provider_vault_auth_test.go | 66 ++++++++++++++++++++ agent/connect/ca/provider_vault_test.go | 2 +- 5 files changed, 126 insertions(+), 13 deletions(-) create mode 100644 .changelog/16262.txt create mode 100644 agent/connect/ca/provider_vault_auth_k8s.go diff --git a/.changelog/16262.txt b/.changelog/16262.txt new file mode 100644 index 00000000000..3a53c5b2c11 --- /dev/null +++ b/.changelog/16262.txt @@ -0,0 +1,3 @@ +```release-note:improvement +ca: support Vault agent auto-auth config for Vault CA provider using Kubernetes authentication. +``` diff --git a/agent/connect/ca/provider_vault.go b/agent/connect/ca/provider_vault.go index 1244c79455c..e8b14e412b1 100644 --- a/agent/connect/ca/provider_vault.go +++ b/agent/connect/ca/provider_vault.go @@ -8,7 +8,6 @@ import ( "fmt" "io" "net/http" - "os" "strings" "sync" "time" @@ -922,6 +921,14 @@ func vaultLogin(client *vaultapi.Client, authMethod *structs.VaultAuthMethod) (* return resp, nil } +// Note the authMethod's parameters (Params) is populated from a freeform map +// in the configuration where they could hardcode values to be passed directly +// to the `auth/*/login` endpoint. Each auth method's authentication code +// needs to handle two cases: +// - The legacy case (which should be deprecated) where the user has +// hardcoded login values directly (eg. a `jwt` string) +// - The case where they use the configuration option used in the +// vault agent's auth methods. func configureVaultAuthMethod(authMethod *structs.VaultAuthMethod) (VaultAuthenticator, error) { if authMethod.MountPath == "" { authMethod.MountPath = authMethod.Type @@ -938,17 +945,7 @@ func configureVaultAuthMethod(authMethod *structs.VaultAuthMethod) (VaultAuthent case VaultAuthMethodTypeJWT: return NewJwtAuthClient(authMethod) case VaultAuthMethodTypeKubernetes: - // For the Kubernetes Auth method, we will try to read the JWT token - // from the default service account file location if jwt was not provided. - if jwt, ok := authMethod.Params["jwt"]; !ok || jwt == "" { - serviceAccountToken, err := os.ReadFile(defaultK8SServiceAccountTokenPath) - if err != nil { - return nil, err - } - - authMethod.Params["jwt"] = string(serviceAccountToken) - } - return NewVaultAPIAuthClient(authMethod, loginPath), nil + return NewK8sAuthClient(authMethod) // These auth methods require a username for the login API path. case VaultAuthMethodTypeLDAP, VaultAuthMethodTypeUserpass, VaultAuthMethodTypeOkta, VaultAuthMethodTypeRadius: // Get username from the params. diff --git a/agent/connect/ca/provider_vault_auth_k8s.go b/agent/connect/ca/provider_vault_auth_k8s.go new file mode 100644 index 00000000000..983750cd54d --- /dev/null +++ b/agent/connect/ca/provider_vault_auth_k8s.go @@ -0,0 +1,47 @@ +package ca + +import ( + "fmt" + "os" + "strings" + + "github.com/hashicorp/consul/agent/structs" +) + +func NewK8sAuthClient(authMethod *structs.VaultAuthMethod) (*VaultAuthClient, error) { + params := authMethod.Params + role, ok := params["role"].(string) + if !ok || strings.TrimSpace(role) == "" { + return nil, fmt.Errorf("missing 'role' value") + } + // don't check for `token_path` as it is optional + + authClient := NewVaultAPIAuthClient(authMethod, "") + // Note the `jwt` can be passed directly in the authMethod as a Param value + // is a freeform map in the config where they could hardcode it. + if legacyCheck(params, "jwt") { + return authClient, nil + } + + authClient.LoginDataGen = K8sLoginDataGen + return authClient, nil +} + +func K8sLoginDataGen(authMethod *structs.VaultAuthMethod) (map[string]any, error) { + params := authMethod.Params + role := params["role"].(string) + + // read token from file on path + tokenPath, ok := params["token_path"].(string) + if !ok || strings.TrimSpace(tokenPath) == "" { + tokenPath = defaultK8SServiceAccountTokenPath + } + rawToken, err := os.ReadFile(tokenPath) + if err != nil { + return nil, err + } + return map[string]any{ + "role": role, + "jwt": strings.TrimSpace(string(rawToken)), + }, nil +} diff --git a/agent/connect/ca/provider_vault_auth_test.go b/agent/connect/ca/provider_vault_auth_test.go index 7a38729307c..6601f9f4b0e 100644 --- a/agent/connect/ca/provider_vault_auth_test.go +++ b/agent/connect/ca/provider_vault_auth_test.go @@ -502,3 +502,69 @@ func TestVaultCAProvider_JwtAuthClient(t *testing.T) { }) } } + +func TestVaultCAProvider_K8sAuthClient(t *testing.T) { + tokenF, err := os.CreateTemp("", "token-path") + require.NoError(t, err) + defer func() { os.Remove(tokenF.Name()) }() + _, err = tokenF.WriteString("test-token") + require.NoError(t, err) + err = tokenF.Close() + require.NoError(t, err) + + cases := map[string]struct { + authMethod *structs.VaultAuthMethod + expData map[string]any + expErr error + }{ + "base-case": { + authMethod: &structs.VaultAuthMethod{ + Type: "kubernetes", + Params: map[string]any{ + "role": "test-role", + "token_path": tokenF.Name(), + }, + }, + expData: map[string]any{ + "role": "test-role", + "jwt": "test-token", + }, + }, + "legacy-case": { + authMethod: &structs.VaultAuthMethod{ + Type: "kubernetes", + Params: map[string]any{ + "role": "test-role", + "jwt": "test-token", + }, + }, + expData: map[string]any{ + "role": "test-role", + "jwt": "test-token", + }, + }, + "no-role": { + authMethod: &structs.VaultAuthMethod{ + Type: "kubernetes", + Params: map[string]any{}, + }, + expErr: fmt.Errorf("missing 'role' value"), + }, + } + for name, c := range cases { + t.Run(name, func(t *testing.T) { + auth, err := NewK8sAuthClient(c.authMethod) + if c.expErr != nil { + require.Error(t, err) + require.EqualError(t, c.expErr, err.Error()) + return + } + require.NoError(t, err) + if auth.LoginDataGen != nil { + data, err := auth.LoginDataGen(c.authMethod) + require.NoError(t, err) + require.Equal(t, c.expData, data) + } + }) + } +} diff --git a/agent/connect/ca/provider_vault_test.go b/agent/connect/ca/provider_vault_test.go index a834c718771..80fbff45c7e 100644 --- a/agent/connect/ca/provider_vault_test.go +++ b/agent/connect/ca/provider_vault_test.go @@ -113,7 +113,7 @@ func TestVaultCAProvider_configureVaultAuthMethod(t *testing.T) { "gcp": {expLoginPath: "auth/gcp/login", params: map[string]interface{}{"type": "iam", "role": "test-role"}}, "jwt": {expLoginPath: "auth/jwt/login", params: map[string]any{"role": "test-role", "path": "test-path"}, hasLDG: true}, "kerberos": {expLoginPath: "auth/kerberos/login"}, - "kubernetes": {expLoginPath: "auth/kubernetes/login", params: map[string]interface{}{"jwt": "fake"}}, + "kubernetes": {expLoginPath: "auth/kubernetes/login", params: map[string]interface{}{"role": "test-role"}, hasLDG: true}, "ldap": {expLoginPath: "auth/ldap/login/foo", params: map[string]interface{}{"username": "foo"}}, "oci": {expLoginPath: "auth/oci/login/foo", params: map[string]interface{}{"role": "foo"}}, "okta": {expLoginPath: "auth/okta/login/foo", params: map[string]interface{}{"username": "foo"}}, From 2b6d35fa8fac32ee2405bf498a80391d22b7607e Mon Sep 17 00:00:00 2001 From: Anita Akaeze Date: Thu, 2 Mar 2023 17:40:07 -0500 Subject: [PATCH 099/262] Merge pull request #4538 from hashicorp/NET-2396 (#16516) NET-2396: refactor test to reduce duplication --- .../consul-container/libs/assert/service.go | 4 +- .../consul-container/libs/service/helpers.go | 58 ++++ .../libs/topology/peering_topology.go | 12 +- .../libs/topology/service_topology.go | 6 +- .../test/basic/connect_service_test.go | 11 +- .../consul-container/test/common.go | 10 +- .../test/gateways/gateway_endpoint_test.go | 49 ++-- .../test/gateways/http_route_test.go | 69 ++--- .../test/observability/access_logs_test.go | 4 +- .../rotate_server_and_ca_then_fail_test.go | 6 +- .../test/upgrade/fullstopupgrade_test.go | 6 +- .../test/upgrade/healthcheck_test.go | 34 ++- .../test/upgrade/helper_test.go | 92 ------- .../test/upgrade/ingress_gateway_test.go | 4 +- .../resolver_default_subset_test.go | 16 +- .../upgrade/peering_control_plane_mgw_test.go | 3 +- .../test/upgrade/peering_http_test.go | 16 +- .../test/upgrade/tenancy_ent_test.go | 258 ++++++++++++++++++ .../test/wanfed/wanfed_peering_test.go | 21 +- 19 files changed, 459 insertions(+), 220 deletions(-) delete mode 100644 test/integration/consul-container/test/upgrade/helper_test.go create mode 100644 test/integration/consul-container/test/upgrade/tenancy_ent_test.go diff --git a/test/integration/consul-container/libs/assert/service.go b/test/integration/consul-container/libs/assert/service.go index 5f793f2d6fd..ac05cef739e 100644 --- a/test/integration/consul-container/libs/assert/service.go +++ b/test/integration/consul-container/libs/assert/service.go @@ -24,9 +24,9 @@ const ( ) // CatalogServiceExists verifies the service name exists in the Consul catalog -func CatalogServiceExists(t *testing.T, c *api.Client, svc string) { +func CatalogServiceExists(t *testing.T, c *api.Client, svc string, opts *api.QueryOptions) { retry.Run(t, func(r *retry.R) { - services, _, err := c.Catalog().Service(svc, "", nil) + services, _, err := c.Catalog().Service(svc, "", opts) if err != nil { r.Fatal("error reading service data") } diff --git a/test/integration/consul-container/libs/service/helpers.go b/test/integration/consul-container/libs/service/helpers.go index 47a8c136425..7d468a652ac 100644 --- a/test/integration/consul-container/libs/service/helpers.go +++ b/test/integration/consul-container/libs/service/helpers.go @@ -3,10 +3,12 @@ package service import ( "context" "fmt" + "testing" "github.com/hashicorp/consul/api" libcluster "github.com/hashicorp/consul/test/integration/consul-container/libs/cluster" "github.com/hashicorp/consul/test/integration/consul-container/libs/utils" + "github.com/stretchr/testify/require" ) const ( @@ -171,3 +173,59 @@ func CreateAndRegisterStaticClientSidecar( return clientConnectProxy, nil } + +func ClientsCreate(t *testing.T, numClients int, image, version string, cluster *libcluster.Cluster) { + opts := libcluster.BuildOptions{ + ConsulImageName: image, + ConsulVersion: version, + } + ctx := libcluster.NewBuildContext(t, opts) + + conf := libcluster.NewConfigBuilder(ctx). + Client(). + ToAgentConfig(t) + t.Logf("Cluster client config:\n%s", conf.JSON) + + require.NoError(t, cluster.AddN(*conf, numClients, true)) +} + +func ServiceCreate(t *testing.T, client *api.Client, serviceName string) uint64 { + require.NoError(t, client.Agent().ServiceRegister(&api.AgentServiceRegistration{ + Name: serviceName, + Port: 9999, + Connect: &api.AgentServiceConnect{ + SidecarService: &api.AgentServiceRegistration{ + Port: 22005, + }, + }, + })) + + service, meta, err := client.Catalog().Service(serviceName, "", &api.QueryOptions{}) + require.NoError(t, err) + require.Len(t, service, 1) + require.Equal(t, serviceName, service[0].ServiceName) + require.Equal(t, 9999, service[0].ServicePort) + + return meta.LastIndex +} + +func ServiceHealthBlockingQuery(client *api.Client, serviceName string, waitIndex uint64) (chan []*api.ServiceEntry, chan error) { + var ( + ch = make(chan []*api.ServiceEntry, 1) + errCh = make(chan error, 1) + ) + go func() { + opts := &api.QueryOptions{WaitIndex: waitIndex} + service, q, err := client.Health().Service(serviceName, "", false, opts) + if err == nil && q.QueryBackend != api.QueryBackendStreaming { + err = fmt.Errorf("invalid backend for this test %s", q.QueryBackend) + } + if err != nil { + errCh <- err + } else { + ch <- service + } + }() + + return ch, errCh +} diff --git a/test/integration/consul-container/libs/topology/peering_topology.go b/test/integration/consul-container/libs/topology/peering_topology.go index 595828e8885..bc9c92550ba 100644 --- a/test/integration/consul-container/libs/topology/peering_topology.go +++ b/test/integration/consul-container/libs/topology/peering_topology.go @@ -69,7 +69,7 @@ func BasicPeeringTwoClustersSetup( }, } configCluster := func(cli *api.Client) error { - libassert.CatalogServiceExists(t, cli, "mesh") + libassert.CatalogServiceExists(t, cli, "mesh", nil) ok, _, err := cli.ConfigEntries().Set(req, &api.WriteOptions{}) if !ok { return fmt.Errorf("config entry is not set") @@ -109,8 +109,8 @@ func BasicPeeringTwoClustersSetup( serverService, serverSidecarService, err = libservice.CreateAndRegisterStaticServerAndSidecar(clientNode, &serviceOpts) require.NoError(t, err) - libassert.CatalogServiceExists(t, acceptingClient, libservice.StaticServerServiceName) - libassert.CatalogServiceExists(t, acceptingClient, "static-server-sidecar-proxy") + libassert.CatalogServiceExists(t, acceptingClient, libservice.StaticServerServiceName, nil) + libassert.CatalogServiceExists(t, acceptingClient, "static-server-sidecar-proxy", nil) require.NoError(t, serverService.Export("default", AcceptingPeerName, acceptingClient)) } @@ -125,7 +125,7 @@ func BasicPeeringTwoClustersSetup( clientSidecarService, err = libservice.CreateAndRegisterStaticClientSidecar(clientNode, DialingPeerName, true) require.NoError(t, err) - libassert.CatalogServiceExists(t, dialingClient, "static-client-sidecar-proxy") + libassert.CatalogServiceExists(t, dialingClient, "static-client-sidecar-proxy", nil) } @@ -133,7 +133,7 @@ func BasicPeeringTwoClustersSetup( libassert.AssertUpstreamEndpointStatus(t, adminPort, fmt.Sprintf("static-server.default.%s.external", DialingPeerName), "HEALTHY", 1) _, port := clientSidecarService.GetAddr() libassert.HTTPServiceEchoes(t, "localhost", port, "") - libassert.AssertFortioName(t, fmt.Sprintf("http://localhost:%d", port), "static-server", "") + libassert.AssertFortioName(t, fmt.Sprintf("http://localhost:%d", port), libservice.StaticServerServiceName, "") return &BuiltCluster{ Cluster: acceptingCluster, @@ -198,7 +198,7 @@ func NewDialingCluster( clientProxyService, err := libservice.CreateAndRegisterStaticClientSidecar(node, dialingPeerName, true) require.NoError(t, err) - libassert.CatalogServiceExists(t, client, "static-client-sidecar-proxy") + libassert.CatalogServiceExists(t, client, "static-client-sidecar-proxy", nil) return cluster, client, clientProxyService } diff --git a/test/integration/consul-container/libs/topology/service_topology.go b/test/integration/consul-container/libs/topology/service_topology.go index 1cacd1a84c4..25ef6179ec7 100644 --- a/test/integration/consul-container/libs/topology/service_topology.go +++ b/test/integration/consul-container/libs/topology/service_topology.go @@ -38,14 +38,14 @@ func CreateServices(t *testing.T, cluster *libcluster.Cluster) (libservice.Servi _, serverConnectProxy, err := libservice.CreateAndRegisterStaticServerAndSidecar(node, serviceOpts) require.NoError(t, err) - libassert.CatalogServiceExists(t, client, fmt.Sprintf("%s-sidecar-proxy", libservice.StaticServerServiceName)) - libassert.CatalogServiceExists(t, client, libservice.StaticServerServiceName) + libassert.CatalogServiceExists(t, client, fmt.Sprintf("%s-sidecar-proxy", libservice.StaticServerServiceName), nil) + libassert.CatalogServiceExists(t, client, libservice.StaticServerServiceName, nil) // Create a client proxy instance with the server as an upstream clientConnectProxy, err := libservice.CreateAndRegisterStaticClientSidecar(node, "", false) require.NoError(t, err) - libassert.CatalogServiceExists(t, client, fmt.Sprintf("%s-sidecar-proxy", libservice.StaticClientServiceName)) + libassert.CatalogServiceExists(t, client, fmt.Sprintf("%s-sidecar-proxy", libservice.StaticClientServiceName), nil) return serverConnectProxy, clientConnectProxy } diff --git a/test/integration/consul-container/test/basic/connect_service_test.go b/test/integration/consul-container/test/basic/connect_service_test.go index 6c2e0117af0..ed48990da87 100644 --- a/test/integration/consul-container/test/basic/connect_service_test.go +++ b/test/integration/consul-container/test/basic/connect_service_test.go @@ -9,7 +9,7 @@ import ( libassert "github.com/hashicorp/consul/test/integration/consul-container/libs/assert" libcluster "github.com/hashicorp/consul/test/integration/consul-container/libs/cluster" libservice "github.com/hashicorp/consul/test/integration/consul-container/libs/service" - "github.com/hashicorp/consul/test/integration/consul-container/test" + "github.com/hashicorp/consul/test/integration/consul-container/libs/topology" ) // TestBasicConnectService Summary @@ -25,12 +25,13 @@ func TestBasicConnectService(t *testing.T) { t.Parallel() buildOptions := &libcluster.BuildOptions{ + Datacenter: "dc1", InjectAutoEncryption: true, InjectGossipEncryption: true, // TODO(rb): fix the test to not need the service/envoy stack to use :8500 AllowHTTPAnyway: true, } - cluster := test.CreateCluster(t, "", nil, buildOptions, true) + cluster, _, _ := topology.NewPeeringCluster(t, 1, 1, buildOptions) clientService := createServices(t, cluster) _, port := clientService.GetAddr() @@ -59,14 +60,14 @@ func createServices(t *testing.T, cluster *libcluster.Cluster) libservice.Servic _, _, err := libservice.CreateAndRegisterStaticServerAndSidecar(node, serviceOpts) require.NoError(t, err) - libassert.CatalogServiceExists(t, client, "static-server-sidecar-proxy") - libassert.CatalogServiceExists(t, client, libservice.StaticServerServiceName) + libassert.CatalogServiceExists(t, client, "static-server-sidecar-proxy", nil) + libassert.CatalogServiceExists(t, client, libservice.StaticServerServiceName, nil) // Create a client proxy instance with the server as an upstream clientConnectProxy, err := libservice.CreateAndRegisterStaticClientSidecar(node, "", false) require.NoError(t, err) - libassert.CatalogServiceExists(t, client, "static-client-sidecar-proxy") + libassert.CatalogServiceExists(t, client, "static-client-sidecar-proxy", nil) return clientConnectProxy } diff --git a/test/integration/consul-container/test/common.go b/test/integration/consul-container/test/common.go index 00390bab26c..ef217fe9e49 100644 --- a/test/integration/consul-container/test/common.go +++ b/test/integration/consul-container/test/common.go @@ -24,7 +24,9 @@ func CreateCluster( cmd string, logConsumer *TestLogConsumer, buildOptions *libcluster.BuildOptions, - applyDefaultProxySettings bool) *libcluster.Cluster { + applyDefaultProxySettings bool, + ports ...int, +) *libcluster.Cluster { // optional if buildOptions == nil { @@ -49,12 +51,12 @@ func CreateCluster( conf.Cmd = append(conf.Cmd, cmd) } - cluster, err := libcluster.New(t, []libcluster.Config{*conf}) + cluster, err := libcluster.New(t, []libcluster.Config{*conf}, ports...) require.NoError(t, err) - client, err := cluster.GetClient(nil, true) + node := cluster.Agents[0] + client := node.GetClient() - require.NoError(t, err) libcluster.WaitForLeader(t, cluster, client) libcluster.WaitForMembers(t, client, 1) diff --git a/test/integration/consul-container/test/gateways/gateway_endpoint_test.go b/test/integration/consul-container/test/gateways/gateway_endpoint_test.go index 2aa81954f8d..e438ac88643 100644 --- a/test/integration/consul-container/test/gateways/gateway_endpoint_test.go +++ b/test/integration/consul-container/test/gateways/gateway_endpoint_test.go @@ -3,25 +3,22 @@ package gateways import ( "context" "fmt" + "io" + "net/http" + "strings" + "testing" + "time" + "github.com/hashicorp/consul/api" "github.com/hashicorp/consul/sdk/testutil/retry" libassert "github.com/hashicorp/consul/test/integration/consul-container/libs/assert" libcluster "github.com/hashicorp/consul/test/integration/consul-container/libs/cluster" libservice "github.com/hashicorp/consul/test/integration/consul-container/libs/service" "github.com/hashicorp/consul/test/integration/consul-container/libs/utils" + "github.com/hashicorp/consul/test/integration/consul-container/test" "github.com/hashicorp/go-cleanhttp" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - "io" - "net/http" - "strings" - "testing" - "time" -) - -var ( - checkTimeout = 1 * time.Minute - checkInterval = 1 * time.Second ) // Creates a gateway service and tests to see if it is routable @@ -32,33 +29,38 @@ func TestAPIGatewayCreate(t *testing.T) { } t.Parallel() - listenerPortOne := 6000 - cluster := createCluster(t, listenerPortOne) - + buildOpts := &libcluster.BuildOptions{ + Datacenter: "dc1", + InjectAutoEncryption: true, + InjectGossipEncryption: true, + AllowHTTPAnyway: true, + } + cluster := test.CreateCluster(t, "", nil, buildOpts, true, listenerPortOne) client := cluster.APIClient(0) - //setup + // add api gateway config apiGateway := &api.APIGatewayConfigEntry{ - Kind: "api-gateway", + Kind: api.APIGateway, Name: "api-gateway", Listeners: []api.APIGatewayListener{ { + Name: "listener", Port: listenerPortOne, Protocol: "tcp", }, }, } - _, _, err := client.ConfigEntries().Set(apiGateway, nil) - require.NoError(t, err) + + require.NoError(t, cluster.ConfigEntryWrite(apiGateway)) tcpRoute := &api.TCPRouteConfigEntry{ - Kind: "tcp-route", + Kind: api.TCPRoute, Name: "api-gateway-route", Parents: []api.ResourceReference{ { - Kind: "api-gateway", + Kind: api.APIGateway, Name: "api-gateway", }, }, @@ -69,8 +71,7 @@ func TestAPIGatewayCreate(t *testing.T) { }, } - _, _, err = client.ConfigEntries().Set(tcpRoute, nil) - require.NoError(t, err) + require.NoError(t, cluster.ConfigEntryWrite(tcpRoute)) // Create a client proxy instance with the server as an upstream _, gatewayService := createServices(t, cluster, listenerPortOne) @@ -195,8 +196,8 @@ func createService(t *testing.T, cluster *libcluster.Cluster, serviceOpts *libse service, _, err := libservice.CreateAndRegisterStaticServerAndSidecar(node, serviceOpts, containerArgs...) require.NoError(t, err) - libassert.CatalogServiceExists(t, client, serviceOpts.Name+"-sidecar-proxy") - libassert.CatalogServiceExists(t, client, serviceOpts.Name) + libassert.CatalogServiceExists(t, client, serviceOpts.Name+"-sidecar-proxy", nil) + libassert.CatalogServiceExists(t, client, serviceOpts.Name, nil) return service @@ -216,7 +217,7 @@ func createServices(t *testing.T, cluster *libcluster.Cluster, ports ...int) (li gatewayService, err := libservice.NewGatewayService(context.Background(), "api-gateway", "api", cluster.Agents[0], ports...) require.NoError(t, err) - libassert.CatalogServiceExists(t, client, "api-gateway") + libassert.CatalogServiceExists(t, client, "api-gateway", nil) return clientConnectProxy, gatewayService } diff --git a/test/integration/consul-container/test/gateways/http_route_test.go b/test/integration/consul-container/test/gateways/http_route_test.go index 61343f34950..d81a562fa19 100644 --- a/test/integration/consul-container/test/gateways/http_route_test.go +++ b/test/integration/consul-container/test/gateways/http_route_test.go @@ -5,13 +5,16 @@ import ( "crypto/rand" "encoding/hex" "fmt" + "testing" + "time" + "github.com/hashicorp/consul/api" libassert "github.com/hashicorp/consul/test/integration/consul-container/libs/assert" + libcluster "github.com/hashicorp/consul/test/integration/consul-container/libs/cluster" libservice "github.com/hashicorp/consul/test/integration/consul-container/libs/service" + "github.com/hashicorp/consul/test/integration/consul-container/test" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - "testing" - "time" ) func getNamespace() string { @@ -41,8 +44,15 @@ func TestHTTPRouteFlattening(t *testing.T) { //infrastructure set up listenerPort := 6000 //create cluster - cluster := createCluster(t, listenerPort) + buildOpts := &libcluster.BuildOptions{ + Datacenter: "dc1", + InjectAutoEncryption: true, + InjectGossipEncryption: true, + AllowHTTPAnyway: true, + } + cluster := test.CreateCluster(t, "", nil, buildOpts, true, listenerPort) client := cluster.Agents[0].GetClient() + service1ResponseCode := 200 service2ResponseCode := 418 serviceOne := createService(t, cluster, &libservice.ServiceOpts{ @@ -82,8 +92,7 @@ func TestHTTPRouteFlattening(t *testing.T) { }, } - _, _, err := client.ConfigEntries().Set(proxyDefaults, nil) - require.NoError(t, err) + require.NoError(t, cluster.ConfigEntryWrite(proxyDefaults)) apiGateway := &api.APIGatewayConfigEntry{ Kind: "api-gateway", @@ -173,17 +182,14 @@ func TestHTTPRouteFlattening(t *testing.T) { }, } - _, _, err = client.ConfigEntries().Set(apiGateway, nil) - require.NoError(t, err) - _, _, err = client.ConfigEntries().Set(routeOne, nil) - require.NoError(t, err) - _, _, err = client.ConfigEntries().Set(routeTwo, nil) - require.NoError(t, err) + require.NoError(t, cluster.ConfigEntryWrite(apiGateway)) + require.NoError(t, cluster.ConfigEntryWrite(routeOne)) + require.NoError(t, cluster.ConfigEntryWrite(routeTwo)) //create gateway service gatewayService, err := libservice.NewGatewayService(context.Background(), gatewayName, "api", cluster.Agents[0], listenerPort) require.NoError(t, err) - libassert.CatalogServiceExists(t, client, gatewayName) + libassert.CatalogServiceExists(t, client, gatewayName, nil) //make sure config entries have been properly created checkGatewayConfigEntry(t, client, gatewayName, namespace) @@ -284,8 +290,7 @@ func TestHTTPRoutePathRewrite(t *testing.T) { }, } - _, _, err := client.ConfigEntries().Set(proxyDefaults, nil) - require.NoError(t, err) + require.NoError(t, cluster.ConfigEntryWrite(proxyDefaults)) apiGateway := createGateway(gatewayName, "http", listenerPort) @@ -367,17 +372,14 @@ func TestHTTPRoutePathRewrite(t *testing.T) { }, } - _, _, err = client.ConfigEntries().Set(apiGateway, nil) - require.NoError(t, err) - _, _, err = client.ConfigEntries().Set(fooRoute, nil) - require.NoError(t, err) - _, _, err = client.ConfigEntries().Set(barRoute, nil) - require.NoError(t, err) + require.NoError(t, cluster.ConfigEntryWrite(apiGateway)) + require.NoError(t, cluster.ConfigEntryWrite(fooRoute)) + require.NoError(t, cluster.ConfigEntryWrite(barRoute)) //create gateway service gatewayService, err := libservice.NewGatewayService(context.Background(), gatewayName, "api", cluster.Agents[0], listenerPort) require.NoError(t, err) - libassert.CatalogServiceExists(t, client, gatewayName) + libassert.CatalogServiceExists(t, client, gatewayName, nil) //make sure config entries have been properly created checkGatewayConfigEntry(t, client, gatewayName, namespace) @@ -450,8 +452,8 @@ func TestHTTPRouteParentRefChange(t *testing.T) { "protocol": "http", }, } - _, _, err := client.ConfigEntries().Set(proxyDefaults, nil) - assert.NoError(t, err) + + require.NoError(t, cluster.ConfigEntryWrite(proxyDefaults)) // create gateway config entry gatewayOne := &api.APIGatewayConfigEntry{ @@ -466,8 +468,7 @@ func TestHTTPRouteParentRefChange(t *testing.T) { }, }, } - _, _, err = client.ConfigEntries().Set(gatewayOne, nil) - assert.NoError(t, err) + require.NoError(t, cluster.ConfigEntryWrite(gatewayOne)) require.Eventually(t, func() bool { entry, _, err := client.ConfigEntries().Get(api.APIGateway, gatewayOneName, &api.QueryOptions{Namespace: namespace}) assert.NoError(t, err) @@ -482,7 +483,7 @@ func TestHTTPRouteParentRefChange(t *testing.T) { // create gateway service gatewayOneService, err := libservice.NewGatewayService(context.Background(), gatewayOneName, "api", cluster.Agents[0], listenerOnePort) require.NoError(t, err) - libassert.CatalogServiceExists(t, client, gatewayOneName) + libassert.CatalogServiceExists(t, client, gatewayOneName, nil) // create gateway config entry gatewayTwo := &api.APIGatewayConfigEntry{ @@ -497,8 +498,9 @@ func TestHTTPRouteParentRefChange(t *testing.T) { }, }, } - _, _, err = client.ConfigEntries().Set(gatewayTwo, nil) - assert.NoError(t, err) + + require.NoError(t, cluster.ConfigEntryWrite(gatewayTwo)) + require.Eventually(t, func() bool { entry, _, err := client.ConfigEntries().Get(api.APIGateway, gatewayTwoName, &api.QueryOptions{Namespace: namespace}) assert.NoError(t, err) @@ -513,7 +515,7 @@ func TestHTTPRouteParentRefChange(t *testing.T) { // create gateway service gatewayTwoService, err := libservice.NewGatewayService(context.Background(), gatewayTwoName, "api", cluster.Agents[0], listenerTwoPort) require.NoError(t, err) - libassert.CatalogServiceExists(t, client, gatewayTwoName) + libassert.CatalogServiceExists(t, client, gatewayTwoName, nil) // create route to service, targeting first gateway route := &api.HTTPRouteConfigEntry{ @@ -550,8 +552,9 @@ func TestHTTPRouteParentRefChange(t *testing.T) { }, }, } - _, _, err = client.ConfigEntries().Set(route, nil) - assert.NoError(t, err) + + require.NoError(t, cluster.ConfigEntryWrite(route)) + require.Eventually(t, func() bool { entry, _, err := client.ConfigEntries().Get(api.HTTPRoute, routeName, &api.QueryOptions{Namespace: namespace}) assert.NoError(t, err) @@ -593,8 +596,8 @@ func TestHTTPRouteParentRefChange(t *testing.T) { Namespace: namespace, }, } - _, _, err = client.ConfigEntries().Set(route, nil) - assert.NoError(t, err) + + require.NoError(t, cluster.ConfigEntryWrite(route)) require.Eventually(t, func() bool { entry, _, err := client.ConfigEntries().Get(api.HTTPRoute, routeName, &api.QueryOptions{Namespace: namespace}) assert.NoError(t, err) diff --git a/test/integration/consul-container/test/observability/access_logs_test.go b/test/integration/consul-container/test/observability/access_logs_test.go index e0dba8aaf98..7bb340ce147 100644 --- a/test/integration/consul-container/test/observability/access_logs_test.go +++ b/test/integration/consul-container/test/observability/access_logs_test.go @@ -70,7 +70,7 @@ func TestAccessLogs(t *testing.T) { // Validate Custom JSON require.Eventually(t, func() bool { libassert.HTTPServiceEchoes(t, "localhost", port, "banana") - libassert.AssertFortioName(t, fmt.Sprintf("http://localhost:%d", port), "static-server", "") + libassert.AssertFortioName(t, fmt.Sprintf("http://localhost:%d", port), libservice.StaticServerServiceName, "") client := libassert.ServiceLogContains(t, clientService, "\"banana_path\":\"/banana\"") server := libassert.ServiceLogContains(t, serverService, "\"banana_path\":\"/banana\"") return client && server @@ -112,7 +112,7 @@ func TestAccessLogs(t *testing.T) { _, port = clientService.GetAddr() require.Eventually(t, func() bool { libassert.HTTPServiceEchoes(t, "localhost", port, "orange") - libassert.AssertFortioName(t, fmt.Sprintf("http://localhost:%d", port), "static-server", "") + libassert.AssertFortioName(t, fmt.Sprintf("http://localhost:%d", port), libservice.StaticServerServiceName, "") client := libassert.ServiceLogContains(t, clientService, "Orange you glad I didn't say banana: /orange, -") server := libassert.ServiceLogContains(t, serverService, "Orange you glad I didn't say banana: /orange, -") return client && server diff --git a/test/integration/consul-container/test/peering/rotate_server_and_ca_then_fail_test.go b/test/integration/consul-container/test/peering/rotate_server_and_ca_then_fail_test.go index 5081433e249..17a591a7eb2 100644 --- a/test/integration/consul-container/test/peering/rotate_server_and_ca_then_fail_test.go +++ b/test/integration/consul-container/test/peering/rotate_server_and_ca_then_fail_test.go @@ -94,7 +94,7 @@ func TestPeering_RotateServerAndCAThenFail_(t *testing.T) { _, port := clientSidecarService.GetAddr() libassert.HTTPServiceEchoes(t, "localhost", port, "") - libassert.AssertFortioName(t, fmt.Sprintf("http://localhost:%d", port), "static-server", "") + libassert.AssertFortioName(t, fmt.Sprintf("http://localhost:%d", port), libservice.StaticServerServiceName, "") } testutil.RunStep(t, "rotate exporting cluster's root CA", func(t *testing.T) { @@ -144,7 +144,7 @@ func TestPeering_RotateServerAndCAThenFail_(t *testing.T) { // Connectivity should still be contained _, port := clientSidecarService.GetAddr() libassert.HTTPServiceEchoes(t, "localhost", port, "") - libassert.AssertFortioName(t, fmt.Sprintf("http://localhost:%d", port), "static-server", "") + libassert.AssertFortioName(t, fmt.Sprintf("http://localhost:%d", port), libservice.StaticServerServiceName, "") verifySidecarHasTwoRootCAs(t, clientSidecarService) }) @@ -166,7 +166,7 @@ func TestPeering_RotateServerAndCAThenFail_(t *testing.T) { _, port := clientSidecarService.GetAddr() libassert.HTTPServiceEchoes(t, "localhost", port, "") - libassert.AssertFortioName(t, fmt.Sprintf("http://localhost:%d", port), "static-server", "") + libassert.AssertFortioName(t, fmt.Sprintf("http://localhost:%d", port), libservice.StaticServerServiceName, "") }) } diff --git a/test/integration/consul-container/test/upgrade/fullstopupgrade_test.go b/test/integration/consul-container/test/upgrade/fullstopupgrade_test.go index 1082dfb8afe..426a5560051 100644 --- a/test/integration/consul-container/test/upgrade/fullstopupgrade_test.go +++ b/test/integration/consul-container/test/upgrade/fullstopupgrade_test.go @@ -11,6 +11,7 @@ import ( "github.com/hashicorp/consul/api" "github.com/hashicorp/consul/sdk/testutil/retry" libcluster "github.com/hashicorp/consul/test/integration/consul-container/libs/cluster" + libservice "github.com/hashicorp/consul/test/integration/consul-container/libs/service" "github.com/hashicorp/consul/test/integration/consul-container/libs/utils" ) @@ -67,9 +68,9 @@ func TestStandardUpgradeToTarget_fromLatest(t *testing.T) { // Create a service to be stored in the snapshot const serviceName = "api" - index := serviceCreate(t, client, serviceName) + index := libservice.ServiceCreate(t, client, serviceName) - ch, errCh := serviceHealthBlockingQuery(client, serviceName, index) + ch, errCh := libservice.ServiceHealthBlockingQuery(client, serviceName, index) require.NoError(t, client.Agent().ServiceRegister( &api.AgentServiceRegistration{Name: serviceName, Port: 9998}, )) @@ -111,6 +112,5 @@ func TestStandardUpgradeToTarget_fromLatest(t *testing.T) { func(t *testing.T) { run(t, tc) }) - // time.Sleep(5 * time.Second) } } diff --git a/test/integration/consul-container/test/upgrade/healthcheck_test.go b/test/integration/consul-container/test/upgrade/healthcheck_test.go index ac6da2dbb55..635515662d1 100644 --- a/test/integration/consul-container/test/upgrade/healthcheck_test.go +++ b/test/integration/consul-container/test/upgrade/healthcheck_test.go @@ -8,6 +8,7 @@ import ( "github.com/hashicorp/consul/api" libcluster "github.com/hashicorp/consul/test/integration/consul-container/libs/cluster" + libservice "github.com/hashicorp/consul/test/integration/consul-container/libs/service" "github.com/hashicorp/consul/test/integration/consul-container/libs/utils" ) @@ -22,7 +23,7 @@ func TestTargetServersWithLatestGAClients(t *testing.T) { cluster := serversCluster(t, numServers, utils.TargetImageName, utils.TargetVersion) - clientsCreate(t, numClients, utils.LatestImageName, utils.LatestVersion, cluster) + libservice.ClientsCreate(t, numClients, utils.LatestImageName, utils.LatestVersion, cluster) client := cluster.APIClient(0) @@ -30,9 +31,9 @@ func TestTargetServersWithLatestGAClients(t *testing.T) { libcluster.WaitForMembers(t, client, 4) const serviceName = "api" - index := serviceCreate(t, client, serviceName) + index := libservice.ServiceCreate(t, client, serviceName) - ch, errCh := serviceHealthBlockingQuery(client, serviceName, index) + ch, errCh := libservice.ServiceHealthBlockingQuery(client, serviceName, index) require.NoError(t, client.Agent().ServiceRegister( &api.AgentServiceRegistration{Name: serviceName, Port: 9998}, )) @@ -120,7 +121,7 @@ func testMixedServersGAClient(t *testing.T, majorityIsTarget bool) { cluster, err := libcluster.New(t, configs) require.NoError(t, err) - clientsCreate(t, numClients, utils.LatestImageName, utils.LatestVersion, cluster) + libservice.ClientsCreate(t, numClients, utils.LatestImageName, utils.LatestVersion, cluster) client := cluster.APIClient(0) @@ -128,9 +129,9 @@ func testMixedServersGAClient(t *testing.T, majorityIsTarget bool) { libcluster.WaitForMembers(t, client, 4) // TODO(rb): why 4? const serviceName = "api" - index := serviceCreate(t, client, serviceName) + index := libservice.ServiceCreate(t, client, serviceName) - ch, errCh := serviceHealthBlockingQuery(client, serviceName, index) + ch, errCh := libservice.ServiceHealthBlockingQuery(client, serviceName, index) require.NoError(t, client.Agent().ServiceRegister( &api.AgentServiceRegistration{Name: serviceName, Port: 9998}, )) @@ -147,3 +148,24 @@ func testMixedServersGAClient(t *testing.T, majorityIsTarget bool) { t.Fatalf("test timeout") } } + +func serversCluster(t *testing.T, numServers int, image, version string) *libcluster.Cluster { + opts := libcluster.BuildOptions{ + ConsulImageName: image, + ConsulVersion: version, + } + ctx := libcluster.NewBuildContext(t, opts) + + conf := libcluster.NewConfigBuilder(ctx). + Bootstrap(numServers). + ToAgentConfig(t) + t.Logf("Cluster server config:\n%s", conf.JSON) + + cluster, err := libcluster.NewN(t, *conf, numServers) + require.NoError(t, err) + + libcluster.WaitForLeader(t, cluster, nil) + libcluster.WaitForMembers(t, cluster.APIClient(0), numServers) + + return cluster +} diff --git a/test/integration/consul-container/test/upgrade/helper_test.go b/test/integration/consul-container/test/upgrade/helper_test.go deleted file mode 100644 index c8627f37477..00000000000 --- a/test/integration/consul-container/test/upgrade/helper_test.go +++ /dev/null @@ -1,92 +0,0 @@ -package upgrade - -import ( - "fmt" - "testing" - - "github.com/hashicorp/consul/api" - "github.com/stretchr/testify/require" - - libcluster "github.com/hashicorp/consul/test/integration/consul-container/libs/cluster" -) - -func serversCluster(t *testing.T, numServers int, image, version string) *libcluster.Cluster { - t.Helper() - - opts := libcluster.BuildOptions{ - ConsulImageName: image, - ConsulVersion: version, - } - ctx := libcluster.NewBuildContext(t, opts) - - conf := libcluster.NewConfigBuilder(ctx). - Bootstrap(numServers). - ToAgentConfig(t) - t.Logf("Cluster server config:\n%s", conf.JSON) - - cluster, err := libcluster.NewN(t, *conf, numServers) - require.NoError(t, err) - - libcluster.WaitForLeader(t, cluster, nil) - libcluster.WaitForMembers(t, cluster.APIClient(0), numServers) - - return cluster -} - -func clientsCreate(t *testing.T, numClients int, image, version string, cluster *libcluster.Cluster) { - t.Helper() - - opts := libcluster.BuildOptions{ - ConsulImageName: image, - ConsulVersion: version, - } - ctx := libcluster.NewBuildContext(t, opts) - - conf := libcluster.NewConfigBuilder(ctx). - Client(). - ToAgentConfig(t) - t.Logf("Cluster client config:\n%s", conf.JSON) - - require.NoError(t, cluster.AddN(*conf, numClients, true)) -} - -func serviceCreate(t *testing.T, client *api.Client, serviceName string) uint64 { - require.NoError(t, client.Agent().ServiceRegister(&api.AgentServiceRegistration{ - Name: serviceName, - Port: 9999, - Connect: &api.AgentServiceConnect{ - SidecarService: &api.AgentServiceRegistration{ - Port: 22005, - }, - }, - })) - - service, meta, err := client.Catalog().Service(serviceName, "", &api.QueryOptions{}) - require.NoError(t, err) - require.Len(t, service, 1) - require.Equal(t, serviceName, service[0].ServiceName) - require.Equal(t, 9999, service[0].ServicePort) - - return meta.LastIndex -} - -func serviceHealthBlockingQuery(client *api.Client, serviceName string, waitIndex uint64) (chan []*api.ServiceEntry, chan error) { - var ( - ch = make(chan []*api.ServiceEntry, 1) - errCh = make(chan error, 1) - ) - go func() { - opts := &api.QueryOptions{WaitIndex: waitIndex} - service, q, err := client.Health().Service(serviceName, "", false, opts) - if err == nil && q.QueryBackend != api.QueryBackendStreaming { - err = fmt.Errorf("invalid backend for this test %s", q.QueryBackend) - } - if err != nil { - errCh <- err - } else { - ch <- service - } - }() - - return ch, errCh -} diff --git a/test/integration/consul-container/test/upgrade/ingress_gateway_test.go b/test/integration/consul-container/test/upgrade/ingress_gateway_test.go index 2345e98ec2e..129fdef4bc8 100644 --- a/test/integration/consul-container/test/upgrade/ingress_gateway_test.go +++ b/test/integration/consul-container/test/upgrade/ingress_gateway_test.go @@ -170,7 +170,7 @@ func TestIngressGateway_UpgradeToTarget_fromLatest(t *testing.T) { }, ) require.NoError(t, err) - libassert.CatalogServiceExists(t, client, nameS1) + libassert.CatalogServiceExists(t, client, nameS1, nil) // create s2 _, _, err = libservice.CreateAndRegisterStaticServerAndSidecar( @@ -183,7 +183,7 @@ func TestIngressGateway_UpgradeToTarget_fromLatest(t *testing.T) { }, ) require.NoError(t, err) - libassert.CatalogServiceExists(t, client, nameS2) + libassert.CatalogServiceExists(t, client, nameS2, nil) // checks // TODO: other checks from verify.bats diff --git a/test/integration/consul-container/test/upgrade/l7_traffic_management/resolver_default_subset_test.go b/test/integration/consul-container/test/upgrade/l7_traffic_management/resolver_default_subset_test.go index 6d69cf57f04..e30b3638799 100644 --- a/test/integration/consul-container/test/upgrade/l7_traffic_management/resolver_default_subset_test.go +++ b/test/integration/consul-container/test/upgrade/l7_traffic_management/resolver_default_subset_test.go @@ -67,7 +67,7 @@ func TestTrafficManagement_ServiceResolver(t *testing.T) { } _, serverConnectProxyV2, err := libservice.CreateAndRegisterStaticServerAndSidecar(node, serviceOptsV2) require.NoError(t, err) - libassert.CatalogServiceExists(t, client, "static-server") + libassert.CatalogServiceExists(t, client, libservice.StaticServerServiceName, nil) // TODO: verify the number of instance of static-server is 3 libassert.AssertServiceHasHealthyInstances(t, node, libservice.StaticServerServiceName, true, 3) @@ -104,8 +104,8 @@ func TestTrafficManagement_ServiceResolver(t *testing.T) { libassert.AssertEnvoyRunning(t, serverAdminPortV1) libassert.AssertEnvoyRunning(t, serverAdminPortV2) - libassert.AssertEnvoyPresentsCertURI(t, serverAdminPortV1, "static-server") - libassert.AssertEnvoyPresentsCertURI(t, serverAdminPortV2, "static-server") + libassert.AssertEnvoyPresentsCertURI(t, serverAdminPortV1, libservice.StaticServerServiceName) + libassert.AssertEnvoyPresentsCertURI(t, serverAdminPortV2, libservice.StaticServerServiceName) libassert.AssertUpstreamEndpointStatus(t, adminPort, "v2.static-server.default", "HEALTHY", 1) @@ -182,7 +182,7 @@ func TestTrafficManagement_ServiceResolver(t *testing.T) { libassert.AssertServiceHasHealthyInstances(t, node, libservice.StaticServerServiceName, true, 1) libassert.AssertEnvoyRunning(t, serverAdminPortV1) - libassert.AssertEnvoyPresentsCertURI(t, serverAdminPortV1, "static-server") + libassert.AssertEnvoyPresentsCertURI(t, serverAdminPortV1, libservice.StaticServerServiceName) // assert static-server proxies should be healthy libassert.AssertServiceHasHealthyInstances(t, node, libservice.StaticServerServiceName, true, 1) @@ -235,7 +235,7 @@ func TestTrafficManagement_ServiceResolver(t *testing.T) { } _, server2ConnectProxy, err := libservice.CreateAndRegisterStaticServerAndSidecar(node, serviceOpts2) require.NoError(t, err) - libassert.CatalogServiceExists(t, client, libservice.StaticServer2ServiceName) + libassert.CatalogServiceExists(t, client, libservice.StaticServer2ServiceName, nil) serviceOptsV1 := &libservice.ServiceOpts{ Name: libservice.StaticServer2ServiceName, @@ -256,7 +256,7 @@ func TestTrafficManagement_ServiceResolver(t *testing.T) { } _, server2ConnectProxyV2, err := libservice.CreateAndRegisterStaticServerAndSidecar(node, serviceOptsV2) require.NoError(t, err) - libassert.CatalogServiceExists(t, client, libservice.StaticServer2ServiceName) + libassert.CatalogServiceExists(t, client, libservice.StaticServer2ServiceName, nil) // Register static-server service resolver serviceResolver := &api.ServiceResolverConfigEntry{ @@ -341,8 +341,8 @@ func TestTrafficManagement_ServiceResolver(t *testing.T) { staticClientProxy, staticServerProxy, err := createStaticClientAndServer(cluster) require.NoError(t, err) - libassert.CatalogServiceExists(t, client, libservice.StaticServerServiceName) - libassert.CatalogServiceExists(t, client, fmt.Sprintf("%s-sidecar-proxy", libservice.StaticClientServiceName)) + libassert.CatalogServiceExists(t, client, libservice.StaticServerServiceName, nil) + libassert.CatalogServiceExists(t, client, fmt.Sprintf("%s-sidecar-proxy", libservice.StaticClientServiceName), nil) err = cluster.ConfigEntryWrite(&api.ProxyConfigEntry{ Kind: api.ProxyDefaults, diff --git a/test/integration/consul-container/test/upgrade/peering_control_plane_mgw_test.go b/test/integration/consul-container/test/upgrade/peering_control_plane_mgw_test.go index f9407d60055..fceec52cfa7 100644 --- a/test/integration/consul-container/test/upgrade/peering_control_plane_mgw_test.go +++ b/test/integration/consul-container/test/upgrade/peering_control_plane_mgw_test.go @@ -102,7 +102,7 @@ func TestPeering_Upgrade_ControlPlane_MGW(t *testing.T) { require.NoError(t, clientSidecarService.Restart()) libassert.AssertUpstreamEndpointStatus(t, adminPort, fmt.Sprintf("static-server.default.%s.external", libtopology.DialingPeerName), "HEALTHY", 1) libassert.HTTPServiceEchoes(t, "localhost", port, "") - libassert.AssertFortioName(t, fmt.Sprintf("http://localhost:%d", port), "static-server", "") + libassert.AssertFortioName(t, fmt.Sprintf("http://localhost:%d", port), libservice.StaticServerServiceName, "") } for _, tc := range tcs { @@ -110,6 +110,5 @@ func TestPeering_Upgrade_ControlPlane_MGW(t *testing.T) { func(t *testing.T) { run(t, tc) }) - // time.Sleep(3 * time.Second) } } diff --git a/test/integration/consul-container/test/upgrade/peering_http_test.go b/test/integration/consul-container/test/upgrade/peering_http_test.go index 04a93638a85..7c0e5a9cee1 100644 --- a/test/integration/consul-container/test/upgrade/peering_http_test.go +++ b/test/integration/consul-container/test/upgrade/peering_http_test.go @@ -67,7 +67,7 @@ func TestPeering_UpgradeToTarget_fromLatest(t *testing.T) { if err != nil { return nil, nil, nil, err } - libassert.CatalogServiceExists(t, c.Clients()[0].GetClient(), libservice.StaticServer2ServiceName) + libassert.CatalogServiceExists(t, c.Clients()[0].GetClient(), libservice.StaticServer2ServiceName, nil) err = c.ConfigEntryWrite(&api.ProxyConfigEntry{ Kind: api.ProxyDefaults, @@ -201,7 +201,7 @@ func TestPeering_UpgradeToTarget_fromLatest(t *testing.T) { GRPCPort: 8078, } _, serverConnectProxy, err := libservice.CreateAndRegisterStaticServerAndSidecar(dialing.Clients()[0], serviceOpts) - libassert.CatalogServiceExists(t, dialing.Clients()[0].GetClient(), libservice.StaticServerServiceName) + libassert.CatalogServiceExists(t, dialing.Clients()[0].GetClient(), libservice.StaticServerServiceName, nil) if err != nil { return nil, nil, nil, err } @@ -246,7 +246,7 @@ func TestPeering_UpgradeToTarget_fromLatest(t *testing.T) { } clientConnectProxy, err := createAndRegisterStaticClientSidecarWith2Upstreams(dialing, - []string{"static-server", "peer-static-server"}, + []string{libservice.StaticServerServiceName, "peer-static-server"}, ) if err != nil { return nil, nil, nil, fmt.Errorf("error creating client connect proxy in cluster %s", dialing.NetworkName) @@ -269,7 +269,7 @@ func TestPeering_UpgradeToTarget_fromLatest(t *testing.T) { // make a resolver for service static-server resolverConfigEntry = &api.ServiceResolverConfigEntry{ Kind: api.ServiceResolver, - Name: "static-server", + Name: libservice.StaticServerServiceName, Failover: map[string]api.ServiceResolverFailover{ "*": { Targets: []api.ServiceResolverFailoverTarget{ @@ -293,7 +293,7 @@ func TestPeering_UpgradeToTarget_fromLatest(t *testing.T) { GRPCPort: 8078, } _, serverConnectProxy, err := libservice.CreateAndRegisterStaticServerAndSidecar(dialing.Clients()[0], serviceOpts) - libassert.CatalogServiceExists(t, dialing.Clients()[0].GetClient(), libservice.StaticServerServiceName) + libassert.CatalogServiceExists(t, dialing.Clients()[0].GetClient(), libservice.StaticServerServiceName, nil) if err != nil { return nil, nil, nil, err } @@ -303,12 +303,12 @@ func TestPeering_UpgradeToTarget_fromLatest(t *testing.T) { // assert traffic can fail-over to static-server in peered cluster and restor to local static-server libassert.AssertFortioName(t, fmt.Sprintf("http://localhost:%d", appPorts[0]), "static-server-dialing", "") require.NoError(t, serverConnectProxy.Stop()) - libassert.AssertFortioName(t, fmt.Sprintf("http://localhost:%d", appPorts[0]), "static-server", "") + libassert.AssertFortioName(t, fmt.Sprintf("http://localhost:%d", appPorts[0]), libservice.StaticServerServiceName, "") require.NoError(t, serverConnectProxy.Start()) libassert.AssertFortioName(t, fmt.Sprintf("http://localhost:%d", appPorts[0]), "static-server-dialing", "") // assert peer-static-server resolves to static-server in peered cluster - libassert.AssertFortioName(t, fmt.Sprintf("http://localhost:%d", appPorts[1]), "static-server", "") + libassert.AssertFortioName(t, fmt.Sprintf("http://localhost:%d", appPorts[1]), libservice.StaticServerServiceName, "") } return serverConnectProxy, clientConnectProxy, assertionFn, nil }, @@ -376,7 +376,7 @@ func TestPeering_UpgradeToTarget_fromLatest(t *testing.T) { _, adminPort := clientSidecarService.GetAdminAddr() libassert.AssertUpstreamEndpointStatus(t, adminPort, fmt.Sprintf("static-server.default.%s.external", libtopology.DialingPeerName), "HEALTHY", 1) libassert.HTTPServiceEchoes(t, "localhost", port, "") - libassert.AssertFortioName(t, fmt.Sprintf("http://localhost:%d", port), "static-server", "") + libassert.AssertFortioName(t, fmt.Sprintf("http://localhost:%d", port), libservice.StaticServerServiceName, "") // TODO: restart static-server-2's sidecar tc.extraAssertion(appPort) diff --git a/test/integration/consul-container/test/upgrade/tenancy_ent_test.go b/test/integration/consul-container/test/upgrade/tenancy_ent_test.go new file mode 100644 index 00000000000..55c14ebfb9c --- /dev/null +++ b/test/integration/consul-container/test/upgrade/tenancy_ent_test.go @@ -0,0 +1,258 @@ +//go:build consulent +// +build consulent + +package upgrade + +import ( + "context" + "encoding/json" + "fmt" + "io" + "testing" + + "github.com/hashicorp/consul/api" + "github.com/hashicorp/consul/sdk/testutil" + "github.com/hashicorp/consul/sdk/testutil/retry" + "github.com/stretchr/testify/require" + + libcluster "github.com/hashicorp/consul/test/integration/consul-container/libs/cluster" + libservice "github.com/hashicorp/consul/test/integration/consul-container/libs/service" + "github.com/hashicorp/consul/test/integration/consul-container/libs/utils" +) + +// Test partition crud using Current Clients and Latest GA Servers +func TestLatestGAServersWithCurrentClients_PartitionCRUD(t *testing.T) { + testLatestGAServersWithCurrentClients_TenancyCRUD(t, "Partitions", + func(t *testing.T, client *api.Client) { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + // CRUD partitions + partition, _, err := client.Partitions().Read(ctx, "default", nil) + require.NoError(t, err) + fmt.Printf("%+v\n", partition) + require.NotNil(t, partition) + require.Equal(t, "default", partition.Name) + + fooPartReq := api.Partition{Name: "foo-part"} + fooPart, _, err := client.Partitions().Create(ctx, &api.Partition{Name: "foo-part"}, nil) + require.NoError(t, err) + require.NotNil(t, fooPart) + require.Equal(t, "foo-part", fooPart.Name) + + partition, _, err = client.Partitions().Read(ctx, "foo-part", nil) + require.NoError(t, err) + require.NotNil(t, partition) + require.Equal(t, "foo-part", partition.Name) + + fooPartReq.Description = "foo-part part" + partition, _, err = client.Partitions().Update(ctx, &fooPartReq, nil) + require.NoError(t, err) + require.NotNil(t, partition) + require.Equal(t, "foo-part", partition.Name) + require.Equal(t, "foo-part part", partition.Description) + }, + func(t *testing.T, client *api.Client) { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + //Read partition again + retry.RunWith(libcluster.LongFailer(), t, func(r *retry.R) { + partition, _, err := client.Partitions().Read(ctx, "default", nil) + require.NoError(r, err) + require.NotNil(r, partition) + require.Equal(r, "default", partition.Name) + }) + + retry.RunWith(libcluster.LongFailer(), t, func(r *retry.R) { + partition, _, err := client.Partitions().Read(ctx, "foo-part", nil) + require.NoError(r, err) + require.NotNil(r, partition) + require.Equal(r, "foo-part", partition.Name) + require.Equal(r, "foo-part part", partition.Description) + }) + }, + ) +} + +// Test namespace crud using Current Clients and Latest GA Servers +func TestLatestGAServersWithCurrentClients_NamespaceCRUD(t *testing.T) { + testLatestGAServersWithCurrentClients_TenancyCRUD(t, "Namespaces", + func(t *testing.T, client *api.Client) { + // CRUD namespaces + namespace, _, err := client.Namespaces().Read("default", nil) + require.NoError(t, err) + require.NotNil(t, namespace, "default namespace does not exist yet") + require.Equal(t, "default", namespace.Name) + + fooNsReq := api.Namespace{Name: "foo-ns"} + fooNs, _, err := client.Namespaces().Create(&api.Namespace{Name: "foo-ns"}, nil) + require.NoError(t, err) + require.NotNil(t, fooNs) + require.Equal(t, "foo-ns", fooNs.Name) + + namespace, _, err = client.Namespaces().Read("foo-ns", nil) + require.NoError(t, err) + require.NotNil(t, namespace) + require.Equal(t, "foo-ns", namespace.Name) + + fooNsReq.Description = "foo-ns ns" + namespace, _, err = client.Namespaces().Update(&fooNsReq, nil) + require.NoError(t, err) + require.NotNil(t, namespace) + require.Equal(t, "foo-ns", namespace.Name) + require.Equal(t, "foo-ns ns", namespace.Description) + }, + func(t *testing.T, client *api.Client) { + retry.RunWith(libcluster.LongFailer(), t, func(r *retry.R) { + namespace, _, err := client.Namespaces().Read("default", nil) + require.NoError(r, err) + require.NotNil(r, namespace) + require.Equal(r, "default", namespace.Name) + }) + retry.RunWith(libcluster.LongFailer(), t, func(r *retry.R) { + namespace, _, err := client.Namespaces().Read("foo-ns", nil) + require.NoError(r, err) + require.NotNil(r, namespace) + require.Equal(r, "foo-ns", namespace.Name) + require.Equal(r, "foo-ns ns", namespace.Description) + }) + }, + ) +} + +func testLatestGAServersWithCurrentClients_TenancyCRUD( + t *testing.T, + tenancyName string, + createFn func(t *testing.T, client *api.Client), + readFn func(t *testing.T, client *api.Client), +) { + const ( + numServers = 3 + numClients = 2 + ) + + // Create initial cluster + cluster := serversCluster(t, numServers, utils.LatestImageName, utils.LatestVersion) + libservice.ClientsCreate(t, numClients, utils.LatestImageName, utils.LatestVersion, cluster) + + client := cluster.APIClient(0) + libcluster.WaitForLeader(t, cluster, client) + libcluster.WaitForMembers(t, client, 5) + + testutil.RunStep(t, "Create "+tenancyName, func(t *testing.T) { + fmt.Println("!!!!!!!") + createFn(t, client) + fmt.Println("!!!!DONE!!!!") + }) + + ctx := context.Background() + + var snapshot io.ReadCloser + testutil.RunStep(t, "Save snapshot", func(t *testing.T) { + var err error + snapshot, _, err = client.Snapshot().Save(nil) + require.NoError(t, err) + }) + + testutil.RunStep(t, "Check "+tenancyName+" after upgrade", func(t *testing.T) { + // Upgrade nodes + leader, err := cluster.Leader() + require.NoError(t, err) + + // upgrade things in the following order: + // + // 1. follower servers + // 2. leader server + // 3. clients + var upgradeOrder []libcluster.Agent + + followers, err := cluster.Followers() + require.NoError(t, err) + upgradeOrder = append(upgradeOrder, followers...) + upgradeOrder = append(upgradeOrder, leader) + upgradeOrder = append(upgradeOrder, cluster.Clients()...) + + for _, n := range upgradeOrder { + conf := n.GetConfig() + + // TODO: ensure this makes sense again, it was doing an apples/orange version!=image comparison + if conf.Version == utils.TargetVersion { + return + } + + conf.Version = utils.TargetVersion + + if n.IsServer() { + // You only ever need bootstrap settings the FIRST time, so we do not need + // them again. + conf.ConfigBuilder.Unset("bootstrap") + } else { + // If we upgrade the clients fast enough + // membership might not be gossiped to all of + // the clients to persist into their serf + // snapshot, so force them to rejoin the + // normal way on restart. + conf.ConfigBuilder.Set("retry_join", []string{"agent-0"}) + } + + newJSON, err := json.MarshalIndent(conf.ConfigBuilder, "", " ") + require.NoError(t, err) + conf.JSON = string(newJSON) + t.Logf("Upgraded cluster config for %q:\n%s", n.GetName(), conf.JSON) + + selfBefore, err := n.GetClient().Agent().Self() + require.NoError(t, err) + + require.NoError(t, n.Upgrade(ctx, conf)) + + selfAfter, err := n.GetClient().Agent().Self() + require.NoError(t, err) + require.Truef(t, + (selfBefore["Config"]["Version"] != selfAfter["Config"]["Version"]) || (selfBefore["Config"]["Revision"] != selfAfter["Config"]["Revision"]), + fmt.Sprintf("upgraded version must be different (%s, %s), (%s, %s)", selfBefore["Config"]["Version"], selfBefore["Config"]["Revision"], selfAfter["Config"]["Version"], selfAfter["Config"]["Revision"]), + ) + + client := n.GetClient() + + libcluster.WaitForLeader(t, cluster, nil) + libcluster.WaitForMembers(t, client, 5) + } + + //get the client again as it changed after upgrade. + client := cluster.APIClient(0) + libcluster.WaitForLeader(t, cluster, client) + + // Read data again + readFn(t, client) + }) + + // Terminate the cluster for the snapshot test + testutil.RunStep(t, "Terminate the cluster", func(t *testing.T) { + require.NoError(t, cluster.Terminate()) + }) + + { // Clear these so they super break if you tried to use them. + cluster = nil + client = nil + } + + // Create a fresh cluster from scratch + cluster2 := serversCluster(t, numServers, utils.TargetImageName, utils.TargetVersion) + libservice.ClientsCreate(t, numClients, utils.LatestImageName, utils.LatestVersion, cluster2) + + client2 := cluster2.APIClient(0) + + testutil.RunStep(t, "Restore saved snapshot", func(t *testing.T) { + libcluster.WaitForLeader(t, cluster2, client2) + libcluster.WaitForMembers(t, client2, 5) + + // Restore the saved snapshot + require.NoError(t, client2.Snapshot().Restore(nil, snapshot)) + + libcluster.WaitForLeader(t, cluster2, client2) + + // make sure we still have the right data + readFn(t, client2) + }) +} diff --git a/test/integration/consul-container/test/wanfed/wanfed_peering_test.go b/test/integration/consul-container/test/wanfed/wanfed_peering_test.go index 10b00874534..1355c7ede4d 100644 --- a/test/integration/consul-container/test/wanfed/wanfed_peering_test.go +++ b/test/integration/consul-container/test/wanfed/wanfed_peering_test.go @@ -5,7 +5,6 @@ import ( "testing" "github.com/hashicorp/consul/api" - "github.com/hashicorp/consul/sdk/testutil/retry" libassert "github.com/hashicorp/consul/test/integration/consul-container/libs/assert" libcluster "github.com/hashicorp/consul/test/integration/consul-container/libs/cluster" libservice "github.com/hashicorp/consul/test/integration/consul-container/libs/service" @@ -32,7 +31,7 @@ func TestPeering_WanFedSecondaryDC(t *testing.T) { t.Run("secondary dc services are visible in primary dc", func(t *testing.T) { createConnectService(t, c2) - assertCatalogService(t, c1Agent.GetClient(), "static-server", &api.QueryOptions{Datacenter: "secondary"}) + libassert.CatalogServiceExists(t, c1Agent.GetClient(), libservice.StaticServerServiceName, &api.QueryOptions{Datacenter: "secondary"}) }) t.Run("secondary dc can peer to alpha dc", func(t *testing.T) { @@ -52,7 +51,7 @@ func TestPeering_WanFedSecondaryDC(t *testing.T) { // Create a testing sidecar to proxy requests through clientConnectProxy, err := libservice.CreateAndRegisterStaticClientSidecar(c2Agent, "secondary-to-alpha", false) require.NoError(t, err) - assertCatalogService(t, c2Agent.GetClient(), "static-client-sidecar-proxy", nil) + libassert.CatalogServiceExists(t, c2Agent.GetClient(), "static-client-sidecar-proxy", nil) // Ensure envoy is configured for the peer service and healthy. _, adminPort := clientConnectProxy.GetAdminAddr() @@ -68,18 +67,6 @@ func TestPeering_WanFedSecondaryDC(t *testing.T) { }) } -func assertCatalogService(t *testing.T, c *api.Client, svc string, opts *api.QueryOptions) { - retry.Run(t, func(r *retry.R) { - services, _, err := c.Catalog().Service(svc, "", opts) - if err != nil { - r.Fatal("error reading catalog data", err) - } - if len(services) == 0 { - r.Fatal("did not find catalog entry for ", svc) - } - }) -} - func createCluster(t *testing.T, dc string, f func(c *libcluster.ConfigBuilder)) (*libcluster.Cluster, libcluster.Agent) { ctx := libcluster.NewBuildContext(t, libcluster.BuildOptions{Datacenter: dc}) conf := libcluster.NewConfigBuilder(ctx).Advanced(f) @@ -111,8 +98,8 @@ func createConnectService(t *testing.T, cluster *libcluster.Cluster) libservice. serverConnectProxy, _, err := libservice.CreateAndRegisterStaticServerAndSidecar(node, &opts) require.NoError(t, err) - assertCatalogService(t, client, "static-server-sidecar-proxy", nil) - assertCatalogService(t, client, "static-server", nil) + libassert.CatalogServiceExists(t, client, libservice.StaticServerServiceName, nil) + libassert.CatalogServiceExists(t, client, "static-server-sidecar-proxy", nil) return serverConnectProxy } From 358c35ef708567032f8bdcc216db95dff6d5b71b Mon Sep 17 00:00:00 2001 From: Anita Akaeze Date: Thu, 2 Mar 2023 18:21:25 -0500 Subject: [PATCH 100/262] Merge pull request #4584 from hashicorp/refactor_cluster_config (#16517) NET-2841: PART 1 - refactor NewPeeringCluster to support custom config --- .../libs/topology/peering_topology.go | 162 +++++++++--------- .../test/basic/connect_service_test.go | 20 ++- .../consul-container/test/common.go | 70 -------- .../test/gateways/gateway_endpoint_test.go | 21 ++- .../test/gateways/http_route_test.go | 28 +-- .../test/observability/access_logs_test.go | 11 +- .../test/ratelimit/ratelimit_test.go | 22 ++- .../test/troubleshoot/troubleshoot_test.go | 11 +- .../test/upgrade/acl_node_test.go | 15 +- .../test/upgrade/healthcheck_test.go | 19 +- .../test/upgrade/ingress_gateway_test.go | 13 +- .../resolver_default_subset_test.go | 7 +- 12 files changed, 200 insertions(+), 199 deletions(-) delete mode 100644 test/integration/consul-container/test/common.go diff --git a/test/integration/consul-container/libs/topology/peering_topology.go b/test/integration/consul-container/libs/topology/peering_topology.go index bc9c92550ba..52df1b88f47 100644 --- a/test/integration/consul-container/libs/topology/peering_topology.go +++ b/test/integration/consul-container/libs/topology/peering_topology.go @@ -6,6 +6,7 @@ import ( "testing" "github.com/stretchr/testify/require" + "github.com/testcontainers/testcontainers-go" "github.com/hashicorp/consul/api" @@ -43,16 +44,26 @@ func BasicPeeringTwoClustersSetup( consulVersion string, peeringThroughMeshgateway bool, ) (*BuiltCluster, *BuiltCluster) { - // acceptingCluster, acceptingCtx, acceptingClient := NewPeeringCluster(t, "dc1", 3, consulVersion, true) - acceptingCluster, acceptingCtx, acceptingClient := NewPeeringCluster(t, 3, 1, &libcluster.BuildOptions{ - Datacenter: "dc1", - ConsulVersion: consulVersion, - InjectAutoEncryption: true, + acceptingCluster, acceptingCtx, acceptingClient := NewCluster(t, &ClusterConfig{ + NumServers: 3, + NumClients: 1, + BuildOpts: &libcluster.BuildOptions{ + Datacenter: "dc1", + ConsulVersion: consulVersion, + InjectAutoEncryption: true, + }, + ApplyDefaultProxySettings: true, }) - dialingCluster, dialingCtx, dialingClient := NewPeeringCluster(t, 1, 1, &libcluster.BuildOptions{ - Datacenter: "dc2", - ConsulVersion: consulVersion, - InjectAutoEncryption: true, + + dialingCluster, dialingCtx, dialingClient := NewCluster(t, &ClusterConfig{ + NumServers: 1, + NumClients: 1, + BuildOpts: &libcluster.BuildOptions{ + Datacenter: "dc2", + ConsulVersion: consulVersion, + InjectAutoEncryption: true, + }, + ApplyDefaultProxySettings: true, }) // Create the mesh gateway for dataplane traffic and peering control plane traffic (if enabled) @@ -151,92 +162,68 @@ func BasicPeeringTwoClustersSetup( } } -// NewDialingCluster creates a cluster for peering with a single dev agent -// TODO: note: formerly called CreatingPeeringClusterAndSetup -// -// Deprecated: use NewPeeringCluster mostly -func NewDialingCluster( - t *testing.T, - version string, - dialingPeerName string, -) (*libcluster.Cluster, *api.Client, libservice.Service) { - t.Helper() - t.Logf("creating the dialing cluster") - - opts := libcluster.BuildOptions{ - Datacenter: "dc2", - InjectAutoEncryption: true, - InjectGossipEncryption: true, - AllowHTTPAnyway: true, - ConsulVersion: version, - } - ctx := libcluster.NewBuildContext(t, opts) - - conf := libcluster.NewConfigBuilder(ctx). - Peering(true). - ToAgentConfig(t) - t.Logf("dc2 server config: \n%s", conf.JSON) - - cluster, err := libcluster.NewN(t, *conf, 1) - require.NoError(t, err) - - node := cluster.Agents[0] - client := node.GetClient() - libcluster.WaitForLeader(t, cluster, client) - libcluster.WaitForMembers(t, client, 1) - - // Default Proxy Settings - ok, err := utils.ApplyDefaultProxySettings(client) - require.NoError(t, err) - require.True(t, ok) - - // Create the mesh gateway for dataplane traffic - _, err = libservice.NewGatewayService(context.Background(), "mesh", "mesh", node) - require.NoError(t, err) - - // Create a service and proxy instance - clientProxyService, err := libservice.CreateAndRegisterStaticClientSidecar(node, dialingPeerName, true) - require.NoError(t, err) - - libassert.CatalogServiceExists(t, client, "static-client-sidecar-proxy", nil) - - return cluster, client, clientProxyService +type ClusterConfig struct { + NumServers int + NumClients int + ApplyDefaultProxySettings bool + BuildOpts *libcluster.BuildOptions + Cmd string + LogConsumer *TestLogConsumer + Ports []int } -// NewPeeringCluster creates a cluster with peering enabled. It also creates +// NewCluster creates a cluster with peering enabled. It also creates // and registers a mesh-gateway at the client agent. The API client returned is // pointed at the client agent. // - proxy-defaults.protocol = tcp -func NewPeeringCluster( +func NewCluster( t *testing.T, - numServers int, - numClients int, - buildOpts *libcluster.BuildOptions, + config *ClusterConfig, ) (*libcluster.Cluster, *libcluster.BuildContext, *api.Client) { - require.NotEmpty(t, buildOpts.Datacenter) - require.True(t, numServers > 0) + var ( + cluster *libcluster.Cluster + err error + ) + require.NotEmpty(t, config.BuildOpts.Datacenter) + require.True(t, config.NumServers > 0) opts := libcluster.BuildOptions{ - Datacenter: buildOpts.Datacenter, - InjectAutoEncryption: buildOpts.InjectAutoEncryption, + Datacenter: config.BuildOpts.Datacenter, + InjectAutoEncryption: config.BuildOpts.InjectAutoEncryption, InjectGossipEncryption: true, AllowHTTPAnyway: true, - ConsulVersion: buildOpts.ConsulVersion, - ACLEnabled: buildOpts.ACLEnabled, + ConsulVersion: config.BuildOpts.ConsulVersion, + ACLEnabled: config.BuildOpts.ACLEnabled, } ctx := libcluster.NewBuildContext(t, opts) serverConf := libcluster.NewConfigBuilder(ctx). - Bootstrap(numServers). + Bootstrap(config.NumServers). Peering(true). ToAgentConfig(t) t.Logf("%s server config: \n%s", opts.Datacenter, serverConf.JSON) - cluster, err := libcluster.NewN(t, *serverConf, numServers) + // optional + if config.LogConsumer != nil { + serverConf.LogConsumer = config.LogConsumer + } + + t.Logf("Cluster config:\n%s", serverConf.JSON) + + // optional custom cmd + if config.Cmd != "" { + serverConf.Cmd = append(serverConf.Cmd, config.Cmd) + } + + if config.Ports != nil { + cluster, err = libcluster.New(t, []libcluster.Config{*serverConf}, config.Ports...) + } else { + cluster, err = libcluster.NewN(t, *serverConf, config.NumServers) + } require.NoError(t, err) var retryJoin []string - for i := 0; i < numServers; i++ { + for i := 0; i < config.NumServers; i++ { retryJoin = append(retryJoin, fmt.Sprintf("agent-%d", i)) } @@ -248,18 +235,33 @@ func NewPeeringCluster( clientConf := configbuiilder.ToAgentConfig(t) t.Logf("%s client config: \n%s", opts.Datacenter, clientConf.JSON) - require.NoError(t, cluster.AddN(*clientConf, numClients, true)) + require.NoError(t, cluster.AddN(*clientConf, config.NumClients, true)) // Use the client agent as the HTTP endpoint since we will not rotate it in many tests. - clientNode := cluster.Agents[numServers] - client := clientNode.GetClient() + var client *api.Client + if config.NumClients > 0 { + clientNode := cluster.Agents[config.NumServers] + client = clientNode.GetClient() + } else { + client = cluster.Agents[0].GetClient() + } libcluster.WaitForLeader(t, cluster, client) - libcluster.WaitForMembers(t, client, numServers+numClients) + libcluster.WaitForMembers(t, client, config.NumServers+config.NumClients) // Default Proxy Settings - ok, err := utils.ApplyDefaultProxySettings(client) - require.NoError(t, err) - require.True(t, ok) + if config.ApplyDefaultProxySettings { + ok, err := utils.ApplyDefaultProxySettings(client) + require.NoError(t, err) + require.True(t, ok) + } return cluster, ctx, client } + +type TestLogConsumer struct { + Msgs []string +} + +func (g *TestLogConsumer) Accept(l testcontainers.Log) { + g.Msgs = append(g.Msgs, string(l.Content)) +} diff --git a/test/integration/consul-container/test/basic/connect_service_test.go b/test/integration/consul-container/test/basic/connect_service_test.go index ed48990da87..a9ee720b034 100644 --- a/test/integration/consul-container/test/basic/connect_service_test.go +++ b/test/integration/consul-container/test/basic/connect_service_test.go @@ -24,14 +24,18 @@ import ( func TestBasicConnectService(t *testing.T) { t.Parallel() - buildOptions := &libcluster.BuildOptions{ - Datacenter: "dc1", - InjectAutoEncryption: true, - InjectGossipEncryption: true, - // TODO(rb): fix the test to not need the service/envoy stack to use :8500 - AllowHTTPAnyway: true, - } - cluster, _, _ := topology.NewPeeringCluster(t, 1, 1, buildOptions) + cluster, _, _ := topology.NewCluster(t, &topology.ClusterConfig{ + NumServers: 1, + NumClients: 1, + ApplyDefaultProxySettings: true, + BuildOpts: &libcluster.BuildOptions{ + Datacenter: "dc1", + InjectAutoEncryption: true, + InjectGossipEncryption: true, + // TODO(rb): fix the test to not need the service/envoy stack to use :8500 + AllowHTTPAnyway: true, + }, + }) clientService := createServices(t, cluster) _, port := clientService.GetAddr() diff --git a/test/integration/consul-container/test/common.go b/test/integration/consul-container/test/common.go deleted file mode 100644 index ef217fe9e49..00000000000 --- a/test/integration/consul-container/test/common.go +++ /dev/null @@ -1,70 +0,0 @@ -package test - -import ( - "testing" - - libcluster "github.com/hashicorp/consul/test/integration/consul-container/libs/cluster" - "github.com/hashicorp/consul/test/integration/consul-container/libs/utils" - "github.com/stretchr/testify/require" - "github.com/testcontainers/testcontainers-go" -) - -type TestLogConsumer struct { - Msgs []string -} - -func (g *TestLogConsumer) Accept(l testcontainers.Log) { - g.Msgs = append(g.Msgs, string(l.Content)) -} - -// Creates a cluster with options for basic customization. All args except t -// are optional and will use sensible defaults when not provided. -func CreateCluster( - t *testing.T, - cmd string, - logConsumer *TestLogConsumer, - buildOptions *libcluster.BuildOptions, - applyDefaultProxySettings bool, - ports ...int, -) *libcluster.Cluster { - - // optional - if buildOptions == nil { - buildOptions = &libcluster.BuildOptions{ - InjectAutoEncryption: true, - InjectGossipEncryption: true, - } - } - ctx := libcluster.NewBuildContext(t, *buildOptions) - - conf := libcluster.NewConfigBuilder(ctx).ToAgentConfig(t) - - // optional - if logConsumer != nil { - conf.LogConsumer = logConsumer - } - - t.Logf("Cluster config:\n%s", conf.JSON) - - // optional custom cmd - if cmd != "" { - conf.Cmd = append(conf.Cmd, cmd) - } - - cluster, err := libcluster.New(t, []libcluster.Config{*conf}, ports...) - require.NoError(t, err) - - node := cluster.Agents[0] - client := node.GetClient() - - libcluster.WaitForLeader(t, cluster, client) - libcluster.WaitForMembers(t, client, 1) - - if applyDefaultProxySettings { - ok, err := utils.ApplyDefaultProxySettings(client) - require.NoError(t, err) - require.True(t, ok) - } - - return cluster -} diff --git a/test/integration/consul-container/test/gateways/gateway_endpoint_test.go b/test/integration/consul-container/test/gateways/gateway_endpoint_test.go index e438ac88643..e088222c50c 100644 --- a/test/integration/consul-container/test/gateways/gateway_endpoint_test.go +++ b/test/integration/consul-container/test/gateways/gateway_endpoint_test.go @@ -14,8 +14,8 @@ import ( libassert "github.com/hashicorp/consul/test/integration/consul-container/libs/assert" libcluster "github.com/hashicorp/consul/test/integration/consul-container/libs/cluster" libservice "github.com/hashicorp/consul/test/integration/consul-container/libs/service" + libtopology "github.com/hashicorp/consul/test/integration/consul-container/libs/topology" "github.com/hashicorp/consul/test/integration/consul-container/libs/utils" - "github.com/hashicorp/consul/test/integration/consul-container/test" "github.com/hashicorp/go-cleanhttp" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -31,13 +31,20 @@ func TestAPIGatewayCreate(t *testing.T) { t.Parallel() listenerPortOne := 6000 - buildOpts := &libcluster.BuildOptions{ - Datacenter: "dc1", - InjectAutoEncryption: true, - InjectGossipEncryption: true, - AllowHTTPAnyway: true, + clusterConfig := &libtopology.ClusterConfig{ + NumServers: 1, + NumClients: 1, + BuildOpts: &libcluster.BuildOptions{ + Datacenter: "dc1", + InjectAutoEncryption: true, + InjectGossipEncryption: true, + AllowHTTPAnyway: true, + }, + Ports: []int{listenerPortOne}, + ApplyDefaultProxySettings: true, } - cluster := test.CreateCluster(t, "", nil, buildOpts, true, listenerPortOne) + + cluster, _, _ := libtopology.NewCluster(t, clusterConfig) client := cluster.APIClient(0) // add api gateway config diff --git a/test/integration/consul-container/test/gateways/http_route_test.go b/test/integration/consul-container/test/gateways/http_route_test.go index d81a562fa19..ef05f8c3f0b 100644 --- a/test/integration/consul-container/test/gateways/http_route_test.go +++ b/test/integration/consul-container/test/gateways/http_route_test.go @@ -5,16 +5,15 @@ import ( "crypto/rand" "encoding/hex" "fmt" - "testing" - "time" - "github.com/hashicorp/consul/api" libassert "github.com/hashicorp/consul/test/integration/consul-container/libs/assert" libcluster "github.com/hashicorp/consul/test/integration/consul-container/libs/cluster" libservice "github.com/hashicorp/consul/test/integration/consul-container/libs/service" - "github.com/hashicorp/consul/test/integration/consul-container/test" + libtopology "github.com/hashicorp/consul/test/integration/consul-container/libs/topology" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + "testing" + "time" ) func getNamespace() string { @@ -43,14 +42,21 @@ func TestHTTPRouteFlattening(t *testing.T) { //infrastructure set up listenerPort := 6000 - //create cluster - buildOpts := &libcluster.BuildOptions{ - Datacenter: "dc1", - InjectAutoEncryption: true, - InjectGossipEncryption: true, - AllowHTTPAnyway: true, + + clusterConfig := &libtopology.ClusterConfig{ + NumServers: 1, + NumClients: 1, + BuildOpts: &libcluster.BuildOptions{ + Datacenter: "dc1", + InjectAutoEncryption: true, + InjectGossipEncryption: true, + AllowHTTPAnyway: true, + }, + Ports: []int{listenerPort}, + ApplyDefaultProxySettings: true, } - cluster := test.CreateCluster(t, "", nil, buildOpts, true, listenerPort) + + cluster, _, _ := libtopology.NewCluster(t, clusterConfig) client := cluster.Agents[0].GetClient() service1ResponseCode := 200 diff --git a/test/integration/consul-container/test/observability/access_logs_test.go b/test/integration/consul-container/test/observability/access_logs_test.go index 7bb340ce147..4acd3a39eb6 100644 --- a/test/integration/consul-container/test/observability/access_logs_test.go +++ b/test/integration/consul-container/test/observability/access_logs_test.go @@ -45,9 +45,14 @@ func TestAccessLogs(t *testing.T) { t.Skip() } - cluster, _, _ := topology.NewPeeringCluster(t, 1, 1, &libcluster.BuildOptions{ - Datacenter: "dc1", - InjectAutoEncryption: true, + cluster, _, _ := topology.NewCluster(t, &topology.ClusterConfig{ + NumServers: 1, + NumClients: 1, + ApplyDefaultProxySettings: true, + BuildOpts: &libcluster.BuildOptions{ + Datacenter: "dc1", + InjectAutoEncryption: true, + }, }) // Turn on access logs. Do this before starting the sidecars so that they inherit the configuration diff --git a/test/integration/consul-container/test/ratelimit/ratelimit_test.go b/test/integration/consul-container/test/ratelimit/ratelimit_test.go index 1c34512493a..198920b8fa2 100644 --- a/test/integration/consul-container/test/ratelimit/ratelimit_test.go +++ b/test/integration/consul-container/test/ratelimit/ratelimit_test.go @@ -11,7 +11,7 @@ import ( "github.com/hashicorp/consul/api" "github.com/hashicorp/consul/sdk/testutil/retry" libcluster "github.com/hashicorp/consul/test/integration/consul-container/libs/cluster" - "github.com/hashicorp/consul/test/integration/consul-container/test" + libtopology "github.com/hashicorp/consul/test/integration/consul-container/libs/topology" ) const ( @@ -128,8 +128,20 @@ func TestServerRequestRateLimit(t *testing.T) { for _, tc := range testCases { t.Run(tc.description, func(t *testing.T) { - logConsumer := &test.TestLogConsumer{} - cluster := test.CreateCluster(t, tc.cmd, logConsumer, nil, false) + clusterConfig := &libtopology.ClusterConfig{ + NumServers: 1, + NumClients: 0, + Cmd: tc.cmd, + LogConsumer: &libtopology.TestLogConsumer{}, + BuildOpts: &libcluster.BuildOptions{ + Datacenter: "dc1", + InjectAutoEncryption: true, + InjectGossipEncryption: true, + }, + ApplyDefaultProxySettings: false, + } + + cluster, _, _ := libtopology.NewCluster(t, clusterConfig) defer terminate(t, cluster) client, err := cluster.GetClient(nil, true) @@ -137,7 +149,7 @@ func TestServerRequestRateLimit(t *testing.T) { // perform actions and validate returned errors to client for _, op := range tc.operations { - err = op.action.function(client) + err := op.action.function(client) if len(op.expectedErrorMsg) > 0 { require.Error(t, err) require.Equal(t, op.expectedErrorMsg, err.Error()) @@ -165,7 +177,7 @@ func TestServerRequestRateLimit(t *testing.T) { // validate logs // putting this last as there are cases where logs // were not present in consumer when assertion was made. - checkLogsForMessage(r, logConsumer.Msgs, + checkLogsForMessage(r, clusterConfig.LogConsumer.Msgs, fmt.Sprintf("[DEBUG] agent.server.rpc-rate-limit: RPC exceeded allowed rate limit: rpc=%s", op.action.rateLimitOperation), op.action.rateLimitOperation, "exceeded", op.expectExceededLog) diff --git a/test/integration/consul-container/test/troubleshoot/troubleshoot_test.go b/test/integration/consul-container/test/troubleshoot/troubleshoot_test.go index 1f7a1405db4..92f5583381f 100644 --- a/test/integration/consul-container/test/troubleshoot/troubleshoot_test.go +++ b/test/integration/consul-container/test/troubleshoot/troubleshoot_test.go @@ -18,9 +18,14 @@ import ( func TestTroubleshootProxy(t *testing.T) { t.Parallel() - cluster, _, _ := topology.NewPeeringCluster(t, 1, 1, &libcluster.BuildOptions{ - Datacenter: "dc1", - InjectAutoEncryption: true, + cluster, _, _ := topology.NewCluster(t, &topology.ClusterConfig{ + NumServers: 1, + NumClients: 1, + BuildOpts: &libcluster.BuildOptions{ + Datacenter: "dc1", + InjectAutoEncryption: true, + }, + ApplyDefaultProxySettings: true, }) serverService, clientService := topology.CreateServices(t, cluster) diff --git a/test/integration/consul-container/test/upgrade/acl_node_test.go b/test/integration/consul-container/test/upgrade/acl_node_test.go index 7c12bb8dfc3..2ad304c5278 100644 --- a/test/integration/consul-container/test/upgrade/acl_node_test.go +++ b/test/integration/consul-container/test/upgrade/acl_node_test.go @@ -36,11 +36,16 @@ func TestACL_Upgrade_Node_Token(t *testing.T) { run := func(t *testing.T, tc testcase) { // NOTE: Disable auto.encrypt due to its conflict with ACL token during bootstrap - cluster, _, _ := libtopology.NewPeeringCluster(t, 1, 1, &libcluster.BuildOptions{ - Datacenter: "dc1", - ConsulVersion: tc.oldversion, - InjectAutoEncryption: false, - ACLEnabled: true, + cluster, _, _ := libtopology.NewCluster(t, &libtopology.ClusterConfig{ + NumServers: 1, + NumClients: 1, + BuildOpts: &libcluster.BuildOptions{ + Datacenter: "dc1", + ConsulVersion: tc.oldversion, + InjectAutoEncryption: false, + ACLEnabled: true, + }, + ApplyDefaultProxySettings: true, }) agentToken, err := cluster.CreateAgentToken("dc1", diff --git a/test/integration/consul-container/test/upgrade/healthcheck_test.go b/test/integration/consul-container/test/upgrade/healthcheck_test.go index 635515662d1..78fb586d6b0 100644 --- a/test/integration/consul-container/test/upgrade/healthcheck_test.go +++ b/test/integration/consul-container/test/upgrade/healthcheck_test.go @@ -1,6 +1,7 @@ package upgrade import ( + "context" "testing" "time" @@ -9,6 +10,7 @@ import ( "github.com/hashicorp/consul/api" libcluster "github.com/hashicorp/consul/test/integration/consul-container/libs/cluster" libservice "github.com/hashicorp/consul/test/integration/consul-container/libs/service" + libtopology "github.com/hashicorp/consul/test/integration/consul-container/libs/topology" "github.com/hashicorp/consul/test/integration/consul-container/libs/utils" ) @@ -21,9 +23,22 @@ func TestTargetServersWithLatestGAClients(t *testing.T) { numClients = 1 ) - cluster := serversCluster(t, numServers, utils.TargetImageName, utils.TargetVersion) + clusterConfig := &libtopology.ClusterConfig{ + NumServers: numServers, + NumClients: numClients, + BuildOpts: &libcluster.BuildOptions{ + Datacenter: "dc1", + ConsulVersion: utils.TargetVersion, + }, + ApplyDefaultProxySettings: true, + } - libservice.ClientsCreate(t, numClients, utils.LatestImageName, utils.LatestVersion, cluster) + cluster, _, _ := libtopology.NewCluster(t, clusterConfig) + + // change the version of Client agent to latest version + config := cluster.Agents[3].GetConfig() + config.Version = utils.LatestVersion + cluster.Agents[3].Upgrade(context.Background(), config) client := cluster.APIClient(0) diff --git a/test/integration/consul-container/test/upgrade/ingress_gateway_test.go b/test/integration/consul-container/test/upgrade/ingress_gateway_test.go index 129fdef4bc8..a5c5a465058 100644 --- a/test/integration/consul-container/test/upgrade/ingress_gateway_test.go +++ b/test/integration/consul-container/test/upgrade/ingress_gateway_test.go @@ -49,10 +49,15 @@ func TestIngressGateway_UpgradeToTarget_fromLatest(t *testing.T) { run := func(t *testing.T, oldVersion, targetVersion string) { // setup // TODO? we don't need a peering cluster, so maybe this is overkill - cluster, _, client := topology.NewPeeringCluster(t, 1, 2, &libcluster.BuildOptions{ - Datacenter: "dc1", - ConsulVersion: oldVersion, - // TODO? InjectAutoEncryption: true, + cluster, _, client := topology.NewCluster(t, &topology.ClusterConfig{ + NumServers: 1, + NumClients: 2, + BuildOpts: &libcluster.BuildOptions{ + Datacenter: "dc1", + ConsulVersion: oldVersion, + // TODO? InjectAutoEncryption: true, + }, + ApplyDefaultProxySettings: true, }) // upsert config entry making http default protocol for global diff --git a/test/integration/consul-container/test/upgrade/l7_traffic_management/resolver_default_subset_test.go b/test/integration/consul-container/test/upgrade/l7_traffic_management/resolver_default_subset_test.go index e30b3638799..4ee98e66f49 100644 --- a/test/integration/consul-container/test/upgrade/l7_traffic_management/resolver_default_subset_test.go +++ b/test/integration/consul-container/test/upgrade/l7_traffic_management/resolver_default_subset_test.go @@ -335,7 +335,12 @@ func TestTrafficManagement_ServiceResolver(t *testing.T) { if oldVersionTmp.LessThan(libutils.Version_1_14) { buildOpts.InjectAutoEncryption = false } - cluster, _, _ := topology.NewPeeringCluster(t, 1, 1, buildOpts) + cluster, _, _ := topology.NewCluster(t, &topology.ClusterConfig{ + NumServers: 1, + NumClients: 1, + BuildOpts: buildOpts, + ApplyDefaultProxySettings: true, + }) node := cluster.Agents[0] client := node.GetClient() From 4b661d1e0c3ebcaf4d1e27590c572f7159401cc1 Mon Sep 17 00:00:00 2001 From: Andrew Stucki Date: Fri, 3 Mar 2023 09:37:12 -0500 Subject: [PATCH 101/262] Add ServiceResolver RequestTimeout for route timeouts to make TerminatingGateway upstream timeouts configurable (#16495) * Leverage ServiceResolver ConnectTimeout for route timeouts to make TerminatingGateway upstream timeouts configurable * Regenerate golden files * Add RequestTimeout field * Add changelog entry --- .changelog/16495.txt | 3 + agent/consul/discoverychain/compile.go | 1 + agent/proxycfg/testing_ingress_gateway.go | 6 + agent/proxycfg/testing_mesh_gateway.go | 2 + agent/proxycfg/testing_upstreams.go | 12 + agent/structs/config_entry_discoverychain.go | 21 + agent/structs/discovery_chain.go | 1 + agent/xds/routes.go | 13 +- ...and-failover-to-cluster-peer.latest.golden | 31 +- ...oxy-with-chain-and-overrides.latest.golden | 3 +- ...and-redirect-to-cluster-peer.latest.golden | 31 +- ...roxy-with-chain-external-sni.latest.golden | 31 +- .../connect-proxy-with-chain.latest.golden | 31 +- ...gress-grpc-multiple-services.latest.golden | 46 +- ...gress-http-multiple-services.latest.golden | 6 +- ...-sds-listener-level-wildcard.latest.golden | 46 +- ...ress-with-sds-listener-level.latest.golden | 46 +- ...-sds-service-level-mixed-tls.latest.golden | 54 +- ...gress-with-sds-service-level.latest.golden | 54 +- api/config_entry_discoverychain.go | 1 + .../private/pbconfigentry/config_entry.gen.go | 2 + .../private/pbconfigentry/config_entry.pb.go | 2006 +++++++++-------- .../private/pbconfigentry/config_entry.proto | 2 + .../config-entries/service-resolver.mdx | 6 + 24 files changed, 1275 insertions(+), 1180 deletions(-) create mode 100644 .changelog/16495.txt diff --git a/.changelog/16495.txt b/.changelog/16495.txt new file mode 100644 index 00000000000..4b8ee933ed0 --- /dev/null +++ b/.changelog/16495.txt @@ -0,0 +1,3 @@ +```release-note:improvement +mesh: Add ServiceResolver RequestTimeout for route timeouts to make request timeouts configurable +``` diff --git a/agent/consul/discoverychain/compile.go b/agent/consul/discoverychain/compile.go index 7af98bc06a1..ead109d419e 100644 --- a/agent/consul/discoverychain/compile.go +++ b/agent/consul/discoverychain/compile.go @@ -978,6 +978,7 @@ RESOLVE_AGAIN: Default: resolver.IsDefault(), Target: target.ID, ConnectTimeout: connectTimeout, + RequestTimeout: resolver.RequestTimeout, }, LoadBalancer: resolver.LoadBalancer, } diff --git a/agent/proxycfg/testing_ingress_gateway.go b/agent/proxycfg/testing_ingress_gateway.go index f2f5ab67f77..bca283f1850 100644 --- a/agent/proxycfg/testing_ingress_gateway.go +++ b/agent/proxycfg/testing_ingress_gateway.go @@ -700,11 +700,13 @@ func TestConfigSnapshotIngress_HTTPMultipleServices(t testing.T) *ConfigSnapshot Kind: structs.ServiceResolver, Name: "foo", ConnectTimeout: 22 * time.Second, + RequestTimeout: 22 * time.Second, }, &structs.ServiceResolverConfigEntry{ Kind: structs.ServiceResolver, Name: "bar", ConnectTimeout: 22 * time.Second, + RequestTimeout: 22 * time.Second, }, } @@ -855,11 +857,13 @@ func TestConfigSnapshotIngress_GRPCMultipleServices(t testing.T) *ConfigSnapshot Kind: structs.ServiceResolver, Name: "foo", ConnectTimeout: 22 * time.Second, + RequestTimeout: 22 * time.Second, }, &structs.ServiceResolverConfigEntry{ Kind: structs.ServiceResolver, Name: "bar", ConnectTimeout: 22 * time.Second, + RequestTimeout: 22 * time.Second, }, } @@ -1213,12 +1217,14 @@ func TestConfigSnapshotIngressGatewayWithChain( Name: "web", EnterpriseMeta: *webEntMeta, ConnectTimeout: 22 * time.Second, + RequestTimeout: 22 * time.Second, }, &structs.ServiceResolverConfigEntry{ Kind: structs.ServiceResolver, Name: "foo", EnterpriseMeta: *fooEntMeta, ConnectTimeout: 22 * time.Second, + RequestTimeout: 22 * time.Second, }, } diff --git a/agent/proxycfg/testing_mesh_gateway.go b/agent/proxycfg/testing_mesh_gateway.go index c968189de32..8f3cce57ff8 100644 --- a/agent/proxycfg/testing_mesh_gateway.go +++ b/agent/proxycfg/testing_mesh_gateway.go @@ -182,6 +182,7 @@ func TestConfigSnapshotMeshGateway(t testing.T, variant string, nsFn func(ns *st Kind: structs.ServiceResolver, Name: "bar", ConnectTimeout: 10 * time.Second, + RequestTimeout: 10 * time.Second, Subsets: map[string]structs.ServiceResolverSubset{ "v1": { Filter: "Service.Meta.Version == 1", @@ -687,6 +688,7 @@ func TestConfigSnapshotPeeredMeshGateway(t testing.T, variant string, nsFn func( Kind: structs.ServiceResolver, Name: "db", ConnectTimeout: 33 * time.Second, + RequestTimeout: 33 * time.Second, }, &structs.ServiceResolverConfigEntry{ Kind: structs.ServiceResolver, diff --git a/agent/proxycfg/testing_upstreams.go b/agent/proxycfg/testing_upstreams.go index 84a18733cc7..15e591edf42 100644 --- a/agent/proxycfg/testing_upstreams.go +++ b/agent/proxycfg/testing_upstreams.go @@ -250,6 +250,7 @@ func setupTestVariationDiscoveryChain( Kind: structs.ServiceResolver, Name: "db", ConnectTimeout: 33 * time.Second, + RequestTimeout: 33 * time.Second, }, ) case "external-sni": @@ -263,6 +264,7 @@ func setupTestVariationDiscoveryChain( Kind: structs.ServiceResolver, Name: "db", ConnectTimeout: 33 * time.Second, + RequestTimeout: 33 * time.Second, }, ) case "failover": @@ -271,6 +273,7 @@ func setupTestVariationDiscoveryChain( Kind: structs.ServiceResolver, Name: "db", ConnectTimeout: 33 * time.Second, + RequestTimeout: 33 * time.Second, Failover: map[string]structs.ServiceResolverFailover{ "*": { Service: "fail", @@ -293,6 +296,7 @@ func setupTestVariationDiscoveryChain( Kind: structs.ServiceResolver, Name: "db", ConnectTimeout: 33 * time.Second, + RequestTimeout: 33 * time.Second, Failover: map[string]structs.ServiceResolverFailover{ "*": { Datacenters: []string{"dc2"}, @@ -306,6 +310,7 @@ func setupTestVariationDiscoveryChain( Kind: structs.ServiceResolver, Name: "db", ConnectTimeout: 33 * time.Second, + RequestTimeout: 33 * time.Second, Failover: map[string]structs.ServiceResolverFailover{ "*": { Targets: []structs.ServiceResolverFailoverTarget{ @@ -321,6 +326,7 @@ func setupTestVariationDiscoveryChain( Kind: structs.ServiceResolver, Name: "db", ConnectTimeout: 33 * time.Second, + RequestTimeout: 33 * time.Second, Redirect: &structs.ServiceResolverRedirect{ Peer: "cluster-01", }, @@ -341,6 +347,7 @@ func setupTestVariationDiscoveryChain( Kind: structs.ServiceResolver, Name: "db", ConnectTimeout: 33 * time.Second, + RequestTimeout: 33 * time.Second, Failover: map[string]structs.ServiceResolverFailover{ "*": { Datacenters: []string{"dc2", "dc3"}, @@ -363,6 +370,7 @@ func setupTestVariationDiscoveryChain( Kind: structs.ServiceResolver, Name: "db", ConnectTimeout: 33 * time.Second, + RequestTimeout: 33 * time.Second, Failover: map[string]structs.ServiceResolverFailover{ "*": { Datacenters: []string{"dc2"}, @@ -385,6 +393,7 @@ func setupTestVariationDiscoveryChain( Kind: structs.ServiceResolver, Name: "db", ConnectTimeout: 33 * time.Second, + RequestTimeout: 33 * time.Second, Failover: map[string]structs.ServiceResolverFailover{ "*": { Datacenters: []string{"dc2", "dc3"}, @@ -446,6 +455,7 @@ func setupTestVariationDiscoveryChain( Kind: structs.ServiceResolver, Name: "db", ConnectTimeout: 33 * time.Second, + RequestTimeout: 33 * time.Second, }, &structs.ProxyConfigEntry{ Kind: structs.ProxyDefaults, @@ -497,6 +507,7 @@ func setupTestVariationDiscoveryChain( Kind: structs.ServiceResolver, Name: "db", ConnectTimeout: 33 * time.Second, + RequestTimeout: 33 * time.Second, }, &structs.ProxyConfigEntry{ Kind: structs.ProxyDefaults, @@ -528,6 +539,7 @@ func setupTestVariationDiscoveryChain( Kind: structs.ServiceResolver, Name: "db", ConnectTimeout: 33 * time.Second, + RequestTimeout: 33 * time.Second, }, &structs.ProxyConfigEntry{ Kind: structs.ProxyDefaults, diff --git a/agent/structs/config_entry_discoverychain.go b/agent/structs/config_entry_discoverychain.go index 2444e90101c..9f80acf682b 100644 --- a/agent/structs/config_entry_discoverychain.go +++ b/agent/structs/config_entry_discoverychain.go @@ -857,6 +857,11 @@ type ServiceResolverConfigEntry struct { // to this service. ConnectTimeout time.Duration `json:",omitempty" alias:"connect_timeout"` + // RequestTimeout is the timeout for an HTTP request to complete before + // the connection is automatically terminated. If unspecified, defaults + // to 15 seconds. + RequestTimeout time.Duration `json:",omitempty" alias:"request_timeout"` + // LoadBalancer determines the load balancing policy and configuration for services // issuing requests to this upstream service. LoadBalancer *LoadBalancer `json:",omitempty" alias:"load_balancer"` @@ -870,14 +875,19 @@ func (e *ServiceResolverConfigEntry) MarshalJSON() ([]byte, error) { type Alias ServiceResolverConfigEntry exported := &struct { ConnectTimeout string `json:",omitempty"` + RequestTimeout string `json:",omitempty"` *Alias }{ ConnectTimeout: e.ConnectTimeout.String(), + RequestTimeout: e.RequestTimeout.String(), Alias: (*Alias)(e), } if e.ConnectTimeout == 0 { exported.ConnectTimeout = "" } + if e.RequestTimeout == 0 { + exported.RequestTimeout = "" + } return json.Marshal(exported) } @@ -886,6 +896,7 @@ func (e *ServiceResolverConfigEntry) UnmarshalJSON(data []byte) error { type Alias ServiceResolverConfigEntry aux := &struct { ConnectTimeout string + RequestTimeout string *Alias }{ Alias: (*Alias)(e), @@ -899,6 +910,11 @@ func (e *ServiceResolverConfigEntry) UnmarshalJSON(data []byte) error { return err } } + if aux.RequestTimeout != "" { + if e.RequestTimeout, err = time.ParseDuration(aux.RequestTimeout); err != nil { + return err + } + } return nil } @@ -919,6 +935,7 @@ func (e *ServiceResolverConfigEntry) IsDefault() bool { e.Redirect == nil && len(e.Failover) == 0 && e.ConnectTimeout == 0 && + e.RequestTimeout == 0 && e.LoadBalancer == nil } @@ -1117,6 +1134,10 @@ func (e *ServiceResolverConfigEntry) Validate() error { return fmt.Errorf("Bad ConnectTimeout '%s', must be >= 0", e.ConnectTimeout) } + if e.RequestTimeout < 0 { + return fmt.Errorf("Bad RequestTimeout '%s', must be >= 0", e.RequestTimeout) + } + if e.LoadBalancer != nil { lb := e.LoadBalancer diff --git a/agent/structs/discovery_chain.go b/agent/structs/discovery_chain.go index 6de1cd36c46..dc737e7479d 100644 --- a/agent/structs/discovery_chain.go +++ b/agent/structs/discovery_chain.go @@ -116,6 +116,7 @@ func (s *DiscoveryGraphNode) MapKey() string { type DiscoveryResolver struct { Default bool `json:",omitempty"` ConnectTimeout time.Duration `json:",omitempty"` + RequestTimeout time.Duration `json:",omitempty"` Target string `json:",omitempty"` Failover *DiscoveryFailover `json:",omitempty"` } diff --git a/agent/xds/routes.go b/agent/xds/routes.go index f0edd5c93d5..6eae88854d2 100644 --- a/agent/xds/routes.go +++ b/agent/xds/routes.go @@ -218,7 +218,7 @@ func (s *ResourceGenerator) makeRoutes( if resolver.LoadBalancer != nil { lb = resolver.LoadBalancer } - route, err := makeNamedDefaultRouteWithLB(clusterName, lb, autoHostRewrite) + route, err := makeNamedDefaultRouteWithLB(clusterName, lb, resolver.RequestTimeout, autoHostRewrite) if err != nil { s.Logger.Error("failed to make route", "cluster", clusterName, "error", err) return nil, err @@ -228,7 +228,7 @@ func (s *ResourceGenerator) makeRoutes( // If there is a service-resolver for this service then also setup routes for each subset for name := range resolver.Subsets { clusterName = connect.ServiceSNI(svc.Name, name, svc.NamespaceOrDefault(), svc.PartitionOrDefault(), cfgSnap.Datacenter, cfgSnap.Roots.TrustDomain) - route, err := makeNamedDefaultRouteWithLB(clusterName, lb, true) + route, err := makeNamedDefaultRouteWithLB(clusterName, lb, resolver.RequestTimeout, true) if err != nil { s.Logger.Error("failed to make route", "cluster", clusterName, "error", err) return nil, err @@ -282,7 +282,7 @@ func (s *ResourceGenerator) routesForMeshGateway(cfgSnap *proxycfg.ConfigSnapsho return resources, nil } -func makeNamedDefaultRouteWithLB(clusterName string, lb *structs.LoadBalancer, autoHostRewrite bool) (*envoy_route_v3.RouteConfiguration, error) { +func makeNamedDefaultRouteWithLB(clusterName string, lb *structs.LoadBalancer, timeout time.Duration, autoHostRewrite bool) (*envoy_route_v3.RouteConfiguration, error) { action := makeRouteActionFromName(clusterName) if err := injectLBToRouteAction(lb, action.Route); err != nil { @@ -296,6 +296,10 @@ func makeNamedDefaultRouteWithLB(clusterName string, lb *structs.LoadBalancer, a } } + if timeout != 0 { + action.Route.Timeout = durationpb.New(timeout) + } + return &envoy_route_v3.RouteConfiguration{ Name: clusterName, VirtualHosts: []*envoy_route_v3.VirtualHost{ @@ -637,6 +641,9 @@ func (s *ResourceGenerator) makeUpstreamRouteForDiscoveryChain( return nil, fmt.Errorf("failed to apply load balancer configuration to route action: %v", err) } + if startNode.Resolver.RequestTimeout > 0 { + routeAction.Route.Timeout = durationpb.New(startNode.Resolver.RequestTimeout) + } defaultRoute := &envoy_route_v3.Route{ Match: makeDefaultRouteMatch(), Action: routeAction, diff --git a/agent/xds/testdata/routes/connect-proxy-with-chain-and-failover-to-cluster-peer.latest.golden b/agent/xds/testdata/routes/connect-proxy-with-chain-and-failover-to-cluster-peer.latest.golden index 547b923b0d6..095330c6840 100644 --- a/agent/xds/testdata/routes/connect-proxy-with-chain-and-failover-to-cluster-peer.latest.golden +++ b/agent/xds/testdata/routes/connect-proxy-with-chain-and-failover-to-cluster-peer.latest.golden @@ -1,30 +1,31 @@ { - "versionInfo": "00000001", - "resources": [ + "versionInfo": "00000001", + "resources": [ { - "@type": "type.googleapis.com/envoy.config.route.v3.RouteConfiguration", - "name": "db", - "virtualHosts": [ + "@type": "type.googleapis.com/envoy.config.route.v3.RouteConfiguration", + "name": "db", + "virtualHosts": [ { - "name": "db", - "domains": [ + "name": "db", + "domains": [ "*" ], - "routes": [ + "routes": [ { - "match": { - "prefix": "/" + "match": { + "prefix": "/" }, - "route": { - "cluster": "db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul" + "route": { + "cluster": "db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "timeout": "33s" } } ] } ], - "validateClusters": true + "validateClusters": true } ], - "typeUrl": "type.googleapis.com/envoy.config.route.v3.RouteConfiguration", - "nonce": "00000001" + "typeUrl": "type.googleapis.com/envoy.config.route.v3.RouteConfiguration", + "nonce": "00000001" } \ No newline at end of file diff --git a/agent/xds/testdata/routes/connect-proxy-with-chain-and-overrides.latest.golden b/agent/xds/testdata/routes/connect-proxy-with-chain-and-overrides.latest.golden index f5b65496101..c40cfe9e90e 100644 --- a/agent/xds/testdata/routes/connect-proxy-with-chain-and-overrides.latest.golden +++ b/agent/xds/testdata/routes/connect-proxy-with-chain-and-overrides.latest.golden @@ -16,7 +16,8 @@ "prefix": "/" }, "route": { - "cluster": "78ebd528~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul" + "cluster": "78ebd528~db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "timeout": "33s" } } ] diff --git a/agent/xds/testdata/routes/connect-proxy-with-chain-and-redirect-to-cluster-peer.latest.golden b/agent/xds/testdata/routes/connect-proxy-with-chain-and-redirect-to-cluster-peer.latest.golden index e63a643ef7d..cf29d6729a0 100644 --- a/agent/xds/testdata/routes/connect-proxy-with-chain-and-redirect-to-cluster-peer.latest.golden +++ b/agent/xds/testdata/routes/connect-proxy-with-chain-and-redirect-to-cluster-peer.latest.golden @@ -1,30 +1,31 @@ { - "versionInfo": "00000001", - "resources": [ + "versionInfo": "00000001", + "resources": [ { - "@type": "type.googleapis.com/envoy.config.route.v3.RouteConfiguration", - "name": "db", - "virtualHosts": [ + "@type": "type.googleapis.com/envoy.config.route.v3.RouteConfiguration", + "name": "db", + "virtualHosts": [ { - "name": "db", - "domains": [ + "name": "db", + "domains": [ "*" ], - "routes": [ + "routes": [ { - "match": { - "prefix": "/" + "match": { + "prefix": "/" }, - "route": { - "cluster": "db.default.cluster-01.external.peer1.domain" + "route": { + "cluster": "db.default.cluster-01.external.peer1.domain", + "timeout": "33s" } } ] } ], - "validateClusters": true + "validateClusters": true } ], - "typeUrl": "type.googleapis.com/envoy.config.route.v3.RouteConfiguration", - "nonce": "00000001" + "typeUrl": "type.googleapis.com/envoy.config.route.v3.RouteConfiguration", + "nonce": "00000001" } \ No newline at end of file diff --git a/agent/xds/testdata/routes/connect-proxy-with-chain-external-sni.latest.golden b/agent/xds/testdata/routes/connect-proxy-with-chain-external-sni.latest.golden index 547b923b0d6..095330c6840 100644 --- a/agent/xds/testdata/routes/connect-proxy-with-chain-external-sni.latest.golden +++ b/agent/xds/testdata/routes/connect-proxy-with-chain-external-sni.latest.golden @@ -1,30 +1,31 @@ { - "versionInfo": "00000001", - "resources": [ + "versionInfo": "00000001", + "resources": [ { - "@type": "type.googleapis.com/envoy.config.route.v3.RouteConfiguration", - "name": "db", - "virtualHosts": [ + "@type": "type.googleapis.com/envoy.config.route.v3.RouteConfiguration", + "name": "db", + "virtualHosts": [ { - "name": "db", - "domains": [ + "name": "db", + "domains": [ "*" ], - "routes": [ + "routes": [ { - "match": { - "prefix": "/" + "match": { + "prefix": "/" }, - "route": { - "cluster": "db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul" + "route": { + "cluster": "db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "timeout": "33s" } } ] } ], - "validateClusters": true + "validateClusters": true } ], - "typeUrl": "type.googleapis.com/envoy.config.route.v3.RouteConfiguration", - "nonce": "00000001" + "typeUrl": "type.googleapis.com/envoy.config.route.v3.RouteConfiguration", + "nonce": "00000001" } \ No newline at end of file diff --git a/agent/xds/testdata/routes/connect-proxy-with-chain.latest.golden b/agent/xds/testdata/routes/connect-proxy-with-chain.latest.golden index 547b923b0d6..095330c6840 100644 --- a/agent/xds/testdata/routes/connect-proxy-with-chain.latest.golden +++ b/agent/xds/testdata/routes/connect-proxy-with-chain.latest.golden @@ -1,30 +1,31 @@ { - "versionInfo": "00000001", - "resources": [ + "versionInfo": "00000001", + "resources": [ { - "@type": "type.googleapis.com/envoy.config.route.v3.RouteConfiguration", - "name": "db", - "virtualHosts": [ + "@type": "type.googleapis.com/envoy.config.route.v3.RouteConfiguration", + "name": "db", + "virtualHosts": [ { - "name": "db", - "domains": [ + "name": "db", + "domains": [ "*" ], - "routes": [ + "routes": [ { - "match": { - "prefix": "/" + "match": { + "prefix": "/" }, - "route": { - "cluster": "db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul" + "route": { + "cluster": "db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "timeout": "33s" } } ] } ], - "validateClusters": true + "validateClusters": true } ], - "typeUrl": "type.googleapis.com/envoy.config.route.v3.RouteConfiguration", - "nonce": "00000001" + "typeUrl": "type.googleapis.com/envoy.config.route.v3.RouteConfiguration", + "nonce": "00000001" } \ No newline at end of file diff --git a/agent/xds/testdata/routes/ingress-grpc-multiple-services.latest.golden b/agent/xds/testdata/routes/ingress-grpc-multiple-services.latest.golden index 2822f903d7c..006bf5157b0 100644 --- a/agent/xds/testdata/routes/ingress-grpc-multiple-services.latest.golden +++ b/agent/xds/testdata/routes/ingress-grpc-multiple-services.latest.golden @@ -1,50 +1,52 @@ { - "versionInfo": "00000001", - "resources": [ + "versionInfo": "00000001", + "resources": [ { - "@type": "type.googleapis.com/envoy.config.route.v3.RouteConfiguration", - "name": "8080", - "virtualHosts": [ + "@type": "type.googleapis.com/envoy.config.route.v3.RouteConfiguration", + "name": "8080", + "virtualHosts": [ { - "name": "foo", - "domains": [ + "name": "foo", + "domains": [ "test1.example.com", "test2.example.com", "test2.example.com:8080", "test1.example.com:8080" ], - "routes": [ + "routes": [ { - "match": { - "prefix": "/" + "match": { + "prefix": "/" }, - "route": { - "cluster": "foo.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul" + "route": { + "cluster": "foo.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "timeout": "22s" } } ] }, { - "name": "bar", - "domains": [ + "name": "bar", + "domains": [ "bar.ingress.*", "bar.ingress.*:8080" ], - "routes": [ + "routes": [ { - "match": { - "prefix": "/" + "match": { + "prefix": "/" }, - "route": { - "cluster": "bar.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul" + "route": { + "cluster": "bar.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "timeout": "22s" } } ] } ], - "validateClusters": true + "validateClusters": true } ], - "typeUrl": "type.googleapis.com/envoy.config.route.v3.RouteConfiguration", - "nonce": "00000001" + "typeUrl": "type.googleapis.com/envoy.config.route.v3.RouteConfiguration", + "nonce": "00000001" } \ No newline at end of file diff --git a/agent/xds/testdata/routes/ingress-http-multiple-services.latest.golden b/agent/xds/testdata/routes/ingress-http-multiple-services.latest.golden index 4e7cfc422dc..507c66a46d5 100644 --- a/agent/xds/testdata/routes/ingress-http-multiple-services.latest.golden +++ b/agent/xds/testdata/routes/ingress-http-multiple-services.latest.golden @@ -60,7 +60,8 @@ "prefix": "/" }, "route": { - "cluster": "foo.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul" + "cluster": "foo.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "timeout": "22s" } } ] @@ -77,7 +78,8 @@ "prefix": "/" }, "route": { - "cluster": "bar.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul" + "cluster": "bar.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "timeout": "22s" } } ] diff --git a/agent/xds/testdata/routes/ingress-with-sds-listener-level-wildcard.latest.golden b/agent/xds/testdata/routes/ingress-with-sds-listener-level-wildcard.latest.golden index 3c251942ec1..cedfc99f655 100644 --- a/agent/xds/testdata/routes/ingress-with-sds-listener-level-wildcard.latest.golden +++ b/agent/xds/testdata/routes/ingress-with-sds-listener-level-wildcard.latest.golden @@ -1,48 +1,50 @@ { - "versionInfo": "00000001", - "resources": [ + "versionInfo": "00000001", + "resources": [ { - "@type": "type.googleapis.com/envoy.config.route.v3.RouteConfiguration", - "name": "9191", - "virtualHosts": [ + "@type": "type.googleapis.com/envoy.config.route.v3.RouteConfiguration", + "name": "9191", + "virtualHosts": [ { - "name": "web", - "domains": [ + "name": "web", + "domains": [ "web.ingress.*", "web.ingress.*:9191" ], - "routes": [ + "routes": [ { - "match": { - "prefix": "/" + "match": { + "prefix": "/" }, - "route": { - "cluster": "web.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul" + "route": { + "cluster": "web.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "timeout": "22s" } } ] }, { - "name": "foo", - "domains": [ + "name": "foo", + "domains": [ "foo.ingress.*", "foo.ingress.*:9191" ], - "routes": [ + "routes": [ { - "match": { - "prefix": "/" + "match": { + "prefix": "/" }, - "route": { - "cluster": "foo.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul" + "route": { + "cluster": "foo.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "timeout": "22s" } } ] } ], - "validateClusters": true + "validateClusters": true } ], - "typeUrl": "type.googleapis.com/envoy.config.route.v3.RouteConfiguration", - "nonce": "00000001" + "typeUrl": "type.googleapis.com/envoy.config.route.v3.RouteConfiguration", + "nonce": "00000001" } \ No newline at end of file diff --git a/agent/xds/testdata/routes/ingress-with-sds-listener-level.latest.golden b/agent/xds/testdata/routes/ingress-with-sds-listener-level.latest.golden index 0dc02c50569..3f2631217da 100644 --- a/agent/xds/testdata/routes/ingress-with-sds-listener-level.latest.golden +++ b/agent/xds/testdata/routes/ingress-with-sds-listener-level.latest.golden @@ -1,48 +1,50 @@ { - "versionInfo": "00000001", - "resources": [ + "versionInfo": "00000001", + "resources": [ { - "@type": "type.googleapis.com/envoy.config.route.v3.RouteConfiguration", - "name": "9191", - "virtualHosts": [ + "@type": "type.googleapis.com/envoy.config.route.v3.RouteConfiguration", + "name": "9191", + "virtualHosts": [ { - "name": "web", - "domains": [ + "name": "web", + "domains": [ "www.example.com", "www.example.com:9191" ], - "routes": [ + "routes": [ { - "match": { - "prefix": "/" + "match": { + "prefix": "/" }, - "route": { - "cluster": "web.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul" + "route": { + "cluster": "web.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "timeout": "22s" } } ] }, { - "name": "foo", - "domains": [ + "name": "foo", + "domains": [ "foo.example.com", "foo.example.com:9191" ], - "routes": [ + "routes": [ { - "match": { - "prefix": "/" + "match": { + "prefix": "/" }, - "route": { - "cluster": "foo.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul" + "route": { + "cluster": "foo.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "timeout": "22s" } } ] } ], - "validateClusters": true + "validateClusters": true } ], - "typeUrl": "type.googleapis.com/envoy.config.route.v3.RouteConfiguration", - "nonce": "00000001" + "typeUrl": "type.googleapis.com/envoy.config.route.v3.RouteConfiguration", + "nonce": "00000001" } \ No newline at end of file diff --git a/agent/xds/testdata/routes/ingress-with-sds-service-level-mixed-tls.latest.golden b/agent/xds/testdata/routes/ingress-with-sds-service-level-mixed-tls.latest.golden index 44ab48e588b..7539ad4feb1 100644 --- a/agent/xds/testdata/routes/ingress-with-sds-service-level-mixed-tls.latest.golden +++ b/agent/xds/testdata/routes/ingress-with-sds-service-level-mixed-tls.latest.golden @@ -1,55 +1,57 @@ { - "versionInfo": "00000001", - "resources": [ + "versionInfo": "00000001", + "resources": [ { - "@type": "type.googleapis.com/envoy.config.route.v3.RouteConfiguration", - "name": "9191", - "virtualHosts": [ + "@type": "type.googleapis.com/envoy.config.route.v3.RouteConfiguration", + "name": "9191", + "virtualHosts": [ { - "name": "foo", - "domains": [ + "name": "foo", + "domains": [ "foo.example.com", "foo.example.com:9191" ], - "routes": [ + "routes": [ { - "match": { - "prefix": "/" + "match": { + "prefix": "/" }, - "route": { - "cluster": "foo.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul" + "route": { + "cluster": "foo.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "timeout": "22s" } } ] } ], - "validateClusters": true + "validateClusters": true }, { - "@type": "type.googleapis.com/envoy.config.route.v3.RouteConfiguration", - "name": "9191_web", - "virtualHosts": [ + "@type": "type.googleapis.com/envoy.config.route.v3.RouteConfiguration", + "name": "9191_web", + "virtualHosts": [ { - "name": "web", - "domains": [ + "name": "web", + "domains": [ "www.example.com", "www.example.com:9191" ], - "routes": [ + "routes": [ { - "match": { - "prefix": "/" + "match": { + "prefix": "/" }, - "route": { - "cluster": "web.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul" + "route": { + "cluster": "web.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "timeout": "22s" } } ] } ], - "validateClusters": true + "validateClusters": true } ], - "typeUrl": "type.googleapis.com/envoy.config.route.v3.RouteConfiguration", - "nonce": "00000001" + "typeUrl": "type.googleapis.com/envoy.config.route.v3.RouteConfiguration", + "nonce": "00000001" } \ No newline at end of file diff --git a/agent/xds/testdata/routes/ingress-with-sds-service-level.latest.golden b/agent/xds/testdata/routes/ingress-with-sds-service-level.latest.golden index 1e207d6efca..6009fac7231 100644 --- a/agent/xds/testdata/routes/ingress-with-sds-service-level.latest.golden +++ b/agent/xds/testdata/routes/ingress-with-sds-service-level.latest.golden @@ -1,55 +1,57 @@ { - "versionInfo": "00000001", - "resources": [ + "versionInfo": "00000001", + "resources": [ { - "@type": "type.googleapis.com/envoy.config.route.v3.RouteConfiguration", - "name": "9191_foo", - "virtualHosts": [ + "@type": "type.googleapis.com/envoy.config.route.v3.RouteConfiguration", + "name": "9191_foo", + "virtualHosts": [ { - "name": "foo", - "domains": [ + "name": "foo", + "domains": [ "foo.example.com", "foo.example.com:9191" ], - "routes": [ + "routes": [ { - "match": { - "prefix": "/" + "match": { + "prefix": "/" }, - "route": { - "cluster": "foo.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul" + "route": { + "cluster": "foo.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "timeout": "22s" } } ] } ], - "validateClusters": true + "validateClusters": true }, { - "@type": "type.googleapis.com/envoy.config.route.v3.RouteConfiguration", - "name": "9191_web", - "virtualHosts": [ + "@type": "type.googleapis.com/envoy.config.route.v3.RouteConfiguration", + "name": "9191_web", + "virtualHosts": [ { - "name": "web", - "domains": [ + "name": "web", + "domains": [ "www.example.com", "www.example.com:9191" ], - "routes": [ + "routes": [ { - "match": { - "prefix": "/" + "match": { + "prefix": "/" }, - "route": { - "cluster": "web.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul" + "route": { + "cluster": "web.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "timeout": "22s" } } ] } ], - "validateClusters": true + "validateClusters": true } ], - "typeUrl": "type.googleapis.com/envoy.config.route.v3.RouteConfiguration", - "nonce": "00000001" + "typeUrl": "type.googleapis.com/envoy.config.route.v3.RouteConfiguration", + "nonce": "00000001" } \ No newline at end of file diff --git a/api/config_entry_discoverychain.go b/api/config_entry_discoverychain.go index ff92125dcdc..acc05e13e1f 100644 --- a/api/config_entry_discoverychain.go +++ b/api/config_entry_discoverychain.go @@ -167,6 +167,7 @@ type ServiceResolverConfigEntry struct { Redirect *ServiceResolverRedirect `json:",omitempty"` Failover map[string]ServiceResolverFailover `json:",omitempty"` ConnectTimeout time.Duration `json:",omitempty" alias:"connect_timeout"` + RequestTimeout time.Duration `json:",omitempty" alias:"request_timeout"` // LoadBalancer determines the load balancing policy and configuration for services // issuing requests to this upstream service. diff --git a/proto/private/pbconfigentry/config_entry.gen.go b/proto/private/pbconfigentry/config_entry.gen.go index d4f2404b1f2..00846d3be7c 100644 --- a/proto/private/pbconfigentry/config_entry.gen.go +++ b/proto/private/pbconfigentry/config_entry.gen.go @@ -1343,6 +1343,7 @@ func ServiceResolverToStructs(s *ServiceResolver, t *structs.ServiceResolverConf } } t.ConnectTimeout = structs.DurationFromProto(s.ConnectTimeout) + t.RequestTimeout = structs.DurationFromProto(s.RequestTimeout) if s.LoadBalancer != nil { var x structs.LoadBalancer LoadBalancerToStructs(s.LoadBalancer, &x) @@ -1385,6 +1386,7 @@ func ServiceResolverFromStructs(t *structs.ServiceResolverConfigEntry, s *Servic } } s.ConnectTimeout = structs.DurationToProto(t.ConnectTimeout) + s.RequestTimeout = structs.DurationToProto(t.RequestTimeout) if t.LoadBalancer != nil { var x LoadBalancer LoadBalancerFromStructs(t.LoadBalancer, &x) diff --git a/proto/private/pbconfigentry/config_entry.pb.go b/proto/private/pbconfigentry/config_entry.pb.go index 841a14f0261..3299cc6e301 100644 --- a/proto/private/pbconfigentry/config_entry.pb.go +++ b/proto/private/pbconfigentry/config_entry.pb.go @@ -1171,6 +1171,8 @@ type ServiceResolver struct { ConnectTimeout *durationpb.Duration `protobuf:"bytes,5,opt,name=ConnectTimeout,proto3" json:"ConnectTimeout,omitempty"` LoadBalancer *LoadBalancer `protobuf:"bytes,6,opt,name=LoadBalancer,proto3" json:"LoadBalancer,omitempty"` Meta map[string]string `protobuf:"bytes,7,rep,name=Meta,proto3" json:"Meta,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + // mog: func-to=structs.DurationFromProto func-from=structs.DurationToProto + RequestTimeout *durationpb.Duration `protobuf:"bytes,8,opt,name=RequestTimeout,proto3" json:"RequestTimeout,omitempty"` } func (x *ServiceResolver) Reset() { @@ -1254,6 +1256,13 @@ func (x *ServiceResolver) GetMeta() map[string]string { return nil } +func (x *ServiceResolver) GetRequestTimeout() *durationpb.Duration { + if x != nil { + return x.RequestTimeout + } + return nil +} + // mog annotation: // // target=github.com/hashicorp/consul/agent/structs.ServiceResolverSubset @@ -5460,7 +5469,7 @@ var file_private_pbconfigentry_config_entry_proto_rawDesc = []byte{ 0x6f, 0x75, 0x67, 0x68, 0x4d, 0x65, 0x73, 0x68, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x17, 0x50, 0x65, 0x65, 0x72, 0x54, 0x68, 0x72, 0x6f, 0x75, 0x67, 0x68, 0x4d, 0x65, 0x73, 0x68, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x73, 0x22, - 0xf6, 0x06, 0x0a, 0x0f, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x6c, + 0xb9, 0x07, 0x0a, 0x0f, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x12, 0x24, 0x0a, 0x0d, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x53, 0x75, 0x62, 0x73, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x53, 0x75, 0x62, 0x73, 0x65, 0x74, 0x12, 0x5d, 0x0a, 0x07, 0x53, 0x75, 0x62, @@ -5496,959 +5505,963 @@ var file_private_pbconfigentry_config_entry_proto_rawDesc = []byte{ 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x52, 0x04, 0x4d, 0x65, 0x74, 0x61, 0x1a, 0x78, 0x0a, 0x0c, 0x53, 0x75, 0x62, 0x73, - 0x65, 0x74, 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, 0x52, 0x0a, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3c, 0x2e, 0x68, 0x61, 0x73, 0x68, + 0x72, 0x79, 0x52, 0x04, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x41, 0x0a, 0x0e, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x08, 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, 0x52, 0x0e, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x1a, 0x78, 0x0a, 0x0c, 0x53, + 0x75, 0x62, 0x73, 0x65, 0x74, 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, 0x52, 0x0a, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3c, 0x2e, 0x68, + 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, + 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, + 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x6f, + 0x6c, 0x76, 0x65, 0x72, 0x53, 0x75, 0x62, 0x73, 0x65, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x7b, 0x0a, 0x0d, 0x46, 0x61, 0x69, 0x6c, 0x6f, 0x76, 0x65, + 0x72, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x54, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3e, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, + 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, + 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x46, + 0x61, 0x69, 0x6c, 0x6f, 0x76, 0x65, 0x72, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, + 0x38, 0x01, 0x1a, 0x37, 0x0a, 0x09, 0x4d, 0x65, 0x74, 0x61, 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, 0x22, 0x51, 0x0a, 0x15, 0x53, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x53, 0x75, + 0x62, 0x73, 0x65, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x20, 0x0a, 0x0b, + 0x4f, 0x6e, 0x6c, 0x79, 0x50, 0x61, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x0b, 0x4f, 0x6e, 0x6c, 0x79, 0x50, 0x61, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x22, 0xc9, + 0x01, 0x0a, 0x17, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, + 0x65, 0x72, 0x52, 0x65, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x53, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x53, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, + 0x75, 0x62, 0x73, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x53, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x53, 0x75, 0x62, 0x73, 0x65, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x4e, 0x61, + 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x4e, + 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x50, 0x61, 0x72, 0x74, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x50, 0x61, 0x72, + 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x44, 0x61, 0x74, 0x61, 0x63, 0x65, + 0x6e, 0x74, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x44, 0x61, 0x74, 0x61, + 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x65, 0x65, 0x72, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x50, 0x65, 0x65, 0x72, 0x22, 0xf9, 0x01, 0x0a, 0x17, 0x53, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x46, 0x61, + 0x69, 0x6c, 0x6f, 0x76, 0x65, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x12, 0x24, 0x0a, 0x0d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x75, 0x62, 0x73, 0x65, + 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x53, 0x75, 0x62, 0x73, 0x65, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x4e, 0x61, 0x6d, 0x65, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x44, 0x61, 0x74, 0x61, 0x63, 0x65, 0x6e, 0x74, + 0x65, 0x72, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0b, 0x44, 0x61, 0x74, 0x61, 0x63, + 0x65, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x12, 0x5e, 0x0a, 0x07, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, + 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x44, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, + 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, + 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x46, + 0x61, 0x69, 0x6c, 0x6f, 0x76, 0x65, 0x72, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x07, 0x54, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x22, 0xcf, 0x01, 0x0a, 0x1d, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x46, 0x61, 0x69, 0x6c, 0x6f, 0x76, + 0x65, 0x72, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x53, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x75, 0x62, + 0x73, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x53, 0x75, 0x62, 0x73, 0x65, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x50, 0x61, 0x72, 0x74, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x50, 0x61, 0x72, + 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x4e, 0x61, 0x6d, 0x65, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x44, 0x61, 0x74, 0x61, 0x63, 0x65, 0x6e, 0x74, + 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x44, 0x61, 0x74, 0x61, 0x63, 0x65, + 0x6e, 0x74, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x65, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x50, 0x65, 0x65, 0x72, 0x22, 0xc7, 0x02, 0x0a, 0x0c, 0x4c, 0x6f, 0x61, + 0x64, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x50, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x50, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x12, 0x5d, 0x0a, 0x0e, 0x52, 0x69, 0x6e, 0x67, 0x48, 0x61, 0x73, 0x68, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, - 0x79, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, - 0x72, 0x53, 0x75, 0x62, 0x73, 0x65, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, - 0x38, 0x01, 0x1a, 0x7b, 0x0a, 0x0d, 0x46, 0x61, 0x69, 0x6c, 0x6f, 0x76, 0x65, 0x72, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x54, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, + 0x79, 0x2e, 0x52, 0x69, 0x6e, 0x67, 0x48, 0x61, 0x73, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x52, 0x0e, 0x52, 0x69, 0x6e, 0x67, 0x48, 0x61, 0x73, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x12, 0x69, 0x0a, 0x12, 0x4c, 0x65, 0x61, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x68, + 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, + 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, + 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x4c, 0x65, 0x61, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x12, 0x4c, 0x65, 0x61, 0x73, 0x74, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x55, 0x0a, 0x0c, 0x48, + 0x61, 0x73, 0x68, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x31, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, + 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x48, 0x61, 0x73, 0x68, 0x50, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x52, 0x0c, 0x48, 0x61, 0x73, 0x68, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, + 0x65, 0x73, 0x22, 0x64, 0x0a, 0x0e, 0x52, 0x69, 0x6e, 0x67, 0x48, 0x61, 0x73, 0x68, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x12, 0x28, 0x0a, 0x0f, 0x4d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x52, + 0x69, 0x6e, 0x67, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0f, 0x4d, + 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x52, 0x69, 0x6e, 0x67, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x28, + 0x0a, 0x0f, 0x4d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x52, 0x69, 0x6e, 0x67, 0x53, 0x69, 0x7a, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0f, 0x4d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, + 0x52, 0x69, 0x6e, 0x67, 0x53, 0x69, 0x7a, 0x65, 0x22, 0x36, 0x0a, 0x12, 0x4c, 0x65, 0x61, 0x73, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x20, + 0x0a, 0x0b, 0x43, 0x68, 0x6f, 0x69, 0x63, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x43, 0x68, 0x6f, 0x69, 0x63, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, + 0x22, 0xd3, 0x01, 0x0a, 0x0a, 0x48, 0x61, 0x73, 0x68, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, + 0x14, 0x0a, 0x05, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x56, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x46, 0x69, 0x65, 0x6c, 0x64, + 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x57, 0x0a, 0x0c, 0x43, 0x6f, 0x6f, 0x6b, 0x69, 0x65, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x68, 0x61, + 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, + 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, + 0x74, 0x72, 0x79, 0x2e, 0x43, 0x6f, 0x6f, 0x6b, 0x69, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x52, 0x0c, 0x43, 0x6f, 0x6f, 0x6b, 0x69, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x1a, + 0x0a, 0x08, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x50, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x08, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x50, 0x12, 0x1a, 0x0a, 0x08, 0x54, 0x65, + 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x54, 0x65, + 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x6c, 0x22, 0x69, 0x0a, 0x0c, 0x43, 0x6f, 0x6f, 0x6b, 0x69, 0x65, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x18, 0x0a, 0x07, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, + 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, + 0x12, 0x2b, 0x0a, 0x03, 0x54, 0x54, 0x4c, 0x18, 0x02, 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, 0x52, 0x03, 0x54, 0x54, 0x4c, 0x12, 0x12, 0x0a, + 0x04, 0x50, 0x61, 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x50, 0x61, 0x74, + 0x68, 0x22, 0x98, 0x03, 0x0a, 0x0e, 0x49, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x47, 0x61, 0x74, + 0x65, 0x77, 0x61, 0x79, 0x12, 0x49, 0x0a, 0x03, 0x54, 0x4c, 0x53, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x37, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, + 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, + 0x79, 0x54, 0x4c, 0x53, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x03, 0x54, 0x4c, 0x53, 0x12, + 0x54, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, + 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x49, 0x6e, 0x67, 0x72, 0x65, + 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x09, 0x4c, 0x69, 0x73, 0x74, + 0x65, 0x6e, 0x65, 0x72, 0x73, 0x12, 0x53, 0x0a, 0x04, 0x4d, 0x65, 0x74, 0x61, 0x18, 0x03, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x3f, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, + 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, + 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x49, 0x6e, 0x67, 0x72, + 0x65, 0x73, 0x73, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x57, 0x0a, 0x08, 0x44, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3b, 0x2e, 0x68, + 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, + 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, + 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x49, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x53, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x08, 0x44, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x73, 0x1a, 0x37, 0x0a, 0x09, 0x4d, 0x65, 0x74, 0x61, 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, 0x22, 0x8f, 0x02, 0x0a, + 0x14, 0x49, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x26, 0x0a, 0x0e, 0x4d, 0x61, 0x78, 0x43, 0x6f, 0x6e, 0x6e, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0e, 0x4d, + 0x61, 0x78, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2e, 0x0a, + 0x12, 0x4d, 0x61, 0x78, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x12, 0x4d, 0x61, 0x78, 0x50, 0x65, + 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x12, 0x34, 0x0a, + 0x15, 0x4d, 0x61, 0x78, 0x43, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x15, 0x4d, 0x61, + 0x78, 0x43, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x73, 0x12, 0x69, 0x0a, 0x12, 0x50, 0x61, 0x73, 0x73, 0x69, 0x76, 0x65, 0x48, 0x65, + 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x39, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, + 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x50, 0x61, 0x73, 0x73, 0x69, 0x76, 0x65, 0x48, + 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x12, 0x50, 0x61, 0x73, 0x73, + 0x69, 0x76, 0x65, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x22, 0xea, + 0x01, 0x0a, 0x10, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x54, 0x4c, 0x53, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x12, 0x18, 0x0a, 0x07, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x4c, 0x0a, + 0x03, 0x53, 0x44, 0x53, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x68, 0x61, 0x73, + 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, + 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, + 0x72, 0x79, 0x2e, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x54, 0x4c, 0x53, 0x53, 0x44, 0x53, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x03, 0x53, 0x44, 0x53, 0x12, 0x24, 0x0a, 0x0d, 0x54, + 0x4c, 0x53, 0x4d, 0x69, 0x6e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0d, 0x54, 0x4c, 0x53, 0x4d, 0x69, 0x6e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x12, 0x24, 0x0a, 0x0d, 0x54, 0x4c, 0x53, 0x4d, 0x61, 0x78, 0x56, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x54, 0x4c, 0x53, 0x4d, 0x61, 0x78, + 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x22, 0x0a, 0x0c, 0x43, 0x69, 0x70, 0x68, 0x65, + 0x72, 0x53, 0x75, 0x69, 0x74, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x43, + 0x69, 0x70, 0x68, 0x65, 0x72, 0x53, 0x75, 0x69, 0x74, 0x65, 0x73, 0x22, 0x5b, 0x0a, 0x13, 0x47, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x54, 0x4c, 0x53, 0x53, 0x44, 0x53, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x12, 0x20, 0x0a, 0x0b, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x61, 0x6d, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, + 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x43, 0x65, 0x72, 0x74, 0x52, 0x65, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x43, 0x65, 0x72, 0x74, + 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x22, 0xdf, 0x01, 0x0a, 0x0f, 0x49, 0x6e, 0x67, + 0x72, 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, + 0x50, 0x6f, 0x72, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x50, 0x6f, 0x72, 0x74, + 0x12, 0x1a, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x51, 0x0a, 0x08, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x35, + 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, + 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x49, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x53, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x08, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, + 0x49, 0x0a, 0x03, 0x54, 0x4c, 0x53, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x68, + 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, + 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, + 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x54, 0x4c, 0x53, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x03, 0x54, 0x4c, 0x53, 0x22, 0xb7, 0x06, 0x0a, 0x0e, 0x49, + 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x12, 0x0a, + 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, + 0x65, 0x12, 0x14, 0x0a, 0x05, 0x48, 0x6f, 0x73, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, + 0x52, 0x05, 0x48, 0x6f, 0x73, 0x74, 0x73, 0x12, 0x50, 0x0a, 0x03, 0x54, 0x4c, 0x53, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3e, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, - 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x53, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x46, 0x61, 0x69, 0x6c, - 0x6f, 0x76, 0x65, 0x72, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, - 0x37, 0x0a, 0x09, 0x4d, 0x65, 0x74, 0x61, 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, 0x22, 0x51, 0x0a, 0x15, 0x53, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x53, 0x75, 0x62, 0x73, 0x65, - 0x74, 0x12, 0x16, 0x0a, 0x06, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x06, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x20, 0x0a, 0x0b, 0x4f, 0x6e, 0x6c, - 0x79, 0x50, 0x61, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, - 0x4f, 0x6e, 0x6c, 0x79, 0x50, 0x61, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x22, 0xc9, 0x01, 0x0a, 0x17, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x52, - 0x65, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x75, 0x62, 0x73, - 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x53, 0x75, 0x62, 0x73, 0x65, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x4e, 0x61, 0x6d, 0x65, 0x73, - 0x70, 0x61, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x4e, 0x61, 0x6d, 0x65, - 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, - 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x44, 0x61, 0x74, 0x61, 0x63, 0x65, 0x6e, 0x74, 0x65, - 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x44, 0x61, 0x74, 0x61, 0x63, 0x65, 0x6e, - 0x74, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x65, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x50, 0x65, 0x65, 0x72, 0x22, 0xf9, 0x01, 0x0a, 0x17, 0x53, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x46, 0x61, 0x69, 0x6c, 0x6f, - 0x76, 0x65, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x24, 0x0a, - 0x0d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x75, 0x62, 0x73, 0x65, 0x74, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x75, 0x62, - 0x73, 0x65, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, - 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x44, 0x61, 0x74, 0x61, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x73, - 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0b, 0x44, 0x61, 0x74, 0x61, 0x63, 0x65, 0x6e, 0x74, - 0x65, 0x72, 0x73, 0x12, 0x5e, 0x0a, 0x07, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x18, 0x05, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x44, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, - 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, - 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x53, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x46, 0x61, 0x69, 0x6c, - 0x6f, 0x76, 0x65, 0x72, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x07, 0x54, 0x61, 0x72, 0x67, - 0x65, 0x74, 0x73, 0x22, 0xcf, 0x01, 0x0a, 0x1d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, - 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x46, 0x61, 0x69, 0x6c, 0x6f, 0x76, 0x65, 0x72, 0x54, - 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, - 0x24, 0x0a, 0x0d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x75, 0x62, 0x73, 0x65, 0x74, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, - 0x75, 0x62, 0x73, 0x65, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, - 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, - 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x44, 0x61, 0x74, 0x61, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x44, 0x61, 0x74, 0x61, 0x63, 0x65, 0x6e, 0x74, 0x65, - 0x72, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x65, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x50, 0x65, 0x65, 0x72, 0x22, 0xc7, 0x02, 0x0a, 0x0c, 0x4c, 0x6f, 0x61, 0x64, 0x42, 0x61, - 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x5d, - 0x0a, 0x0e, 0x52, 0x69, 0x6e, 0x67, 0x48, 0x61, 0x73, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, + 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x47, 0x61, 0x74, + 0x65, 0x77, 0x61, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x54, 0x4c, 0x53, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x52, 0x03, 0x54, 0x4c, 0x53, 0x12, 0x62, 0x0a, 0x0e, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x3a, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, + 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x48, 0x65, + 0x61, 0x64, 0x65, 0x72, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x52, 0x0e, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x12, 0x64, 0x0a, + 0x0f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, - 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x52, - 0x69, 0x6e, 0x67, 0x48, 0x61, 0x73, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x0e, 0x52, - 0x69, 0x6e, 0x67, 0x48, 0x61, 0x73, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x69, 0x0a, - 0x12, 0x4c, 0x65, 0x61, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x68, 0x61, 0x73, 0x68, - 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, - 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, - 0x79, 0x2e, 0x4c, 0x65, 0x61, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x43, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x52, 0x12, 0x4c, 0x65, 0x61, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x55, 0x0a, 0x0c, 0x48, 0x61, 0x73, 0x68, - 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x31, - 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, - 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x48, 0x61, 0x73, 0x68, 0x50, 0x6f, 0x6c, 0x69, 0x63, - 0x79, 0x52, 0x0c, 0x48, 0x61, 0x73, 0x68, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x22, - 0x64, 0x0a, 0x0e, 0x52, 0x69, 0x6e, 0x67, 0x48, 0x61, 0x73, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x12, 0x28, 0x0a, 0x0f, 0x4d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x52, 0x69, 0x6e, 0x67, - 0x53, 0x69, 0x7a, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0f, 0x4d, 0x69, 0x6e, 0x69, - 0x6d, 0x75, 0x6d, 0x52, 0x69, 0x6e, 0x67, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x4d, - 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x52, 0x69, 0x6e, 0x67, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x04, 0x52, 0x0f, 0x4d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x52, 0x69, 0x6e, - 0x67, 0x53, 0x69, 0x7a, 0x65, 0x22, 0x36, 0x0a, 0x12, 0x4c, 0x65, 0x61, 0x73, 0x74, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x20, 0x0a, 0x0b, 0x43, - 0x68, 0x6f, 0x69, 0x63, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x0b, 0x43, 0x68, 0x6f, 0x69, 0x63, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0xd3, 0x01, - 0x0a, 0x0a, 0x48, 0x61, 0x73, 0x68, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x14, 0x0a, 0x05, - 0x46, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x46, 0x69, 0x65, - 0x6c, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x56, 0x61, 0x6c, - 0x75, 0x65, 0x12, 0x57, 0x0a, 0x0c, 0x43, 0x6f, 0x6f, 0x6b, 0x69, 0x65, 0x43, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, - 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, - 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, - 0x2e, 0x43, 0x6f, 0x6f, 0x6b, 0x69, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x0c, 0x43, - 0x6f, 0x6f, 0x6b, 0x69, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x1a, 0x0a, 0x08, 0x53, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x50, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x53, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x50, 0x12, 0x1a, 0x0a, 0x08, 0x54, 0x65, 0x72, 0x6d, 0x69, - 0x6e, 0x61, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x54, 0x65, 0x72, 0x6d, 0x69, - 0x6e, 0x61, 0x6c, 0x22, 0x69, 0x0a, 0x0c, 0x43, 0x6f, 0x6f, 0x6b, 0x69, 0x65, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x12, 0x18, 0x0a, 0x07, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2b, 0x0a, - 0x03, 0x54, 0x54, 0x4c, 0x18, 0x02, 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, 0x52, 0x03, 0x54, 0x54, 0x4c, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x61, - 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x50, 0x61, 0x74, 0x68, 0x22, 0x98, - 0x03, 0x0a, 0x0e, 0x49, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, - 0x79, 0x12, 0x49, 0x0a, 0x03, 0x54, 0x4c, 0x53, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x37, - 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, - 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x54, 0x4c, - 0x53, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x03, 0x54, 0x4c, 0x53, 0x12, 0x54, 0x0a, 0x09, - 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x36, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, - 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x49, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x4c, - 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, - 0x72, 0x73, 0x12, 0x53, 0x0a, 0x04, 0x4d, 0x65, 0x74, 0x61, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x3f, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, - 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x49, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, - 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x04, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x57, 0x0a, 0x08, 0x44, 0x65, 0x66, 0x61, 0x75, - 0x6c, 0x74, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3b, 0x2e, 0x68, 0x61, 0x73, 0x68, - 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, - 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, - 0x79, 0x2e, 0x49, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x08, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, - 0x1a, 0x37, 0x0a, 0x09, 0x4d, 0x65, 0x74, 0x61, 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, 0x22, 0x8f, 0x02, 0x0a, 0x14, 0x49, 0x6e, - 0x67, 0x72, 0x65, 0x73, 0x73, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x12, 0x26, 0x0a, 0x0e, 0x4d, 0x61, 0x78, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0e, 0x4d, 0x61, 0x78, 0x43, + 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x48, + 0x54, 0x54, 0x50, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, + 0x72, 0x73, 0x52, 0x0f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x65, 0x61, 0x64, + 0x65, 0x72, 0x73, 0x12, 0x53, 0x0a, 0x04, 0x4d, 0x65, 0x74, 0x61, 0x18, 0x06, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x3f, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, + 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x49, 0x6e, 0x67, 0x72, 0x65, 0x73, + 0x73, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x52, 0x04, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x58, 0x0a, 0x0e, 0x45, 0x6e, 0x74, 0x65, + 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x30, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, + 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6d, + 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x4d, 0x65, + 0x74, 0x61, 0x52, 0x0e, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x4d, 0x65, + 0x74, 0x61, 0x12, 0x26, 0x0a, 0x0e, 0x4d, 0x61, 0x78, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0e, 0x4d, 0x61, 0x78, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2e, 0x0a, 0x12, 0x4d, 0x61, 0x78, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x12, 0x4d, 0x61, 0x78, 0x50, 0x65, 0x6e, 0x64, 0x69, + 0x18, 0x09, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x12, 0x4d, 0x61, 0x78, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x4d, 0x61, 0x78, 0x43, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x15, 0x4d, 0x61, 0x78, 0x43, 0x6f, + 0x73, 0x74, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x15, 0x4d, 0x61, 0x78, 0x43, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x12, 0x69, 0x0a, 0x12, 0x50, 0x61, 0x73, 0x73, 0x69, 0x76, 0x65, 0x48, 0x65, 0x61, 0x6c, 0x74, - 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x68, + 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x50, 0x61, 0x73, 0x73, 0x69, 0x76, 0x65, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x12, 0x50, 0x61, 0x73, 0x73, 0x69, 0x76, 0x65, - 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x22, 0xea, 0x01, 0x0a, 0x10, - 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x54, 0x4c, 0x53, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x12, 0x18, 0x0a, 0x07, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x07, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x4c, 0x0a, 0x03, 0x53, 0x44, - 0x53, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, - 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, - 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, - 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x54, 0x4c, 0x53, 0x53, 0x44, 0x53, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x52, 0x03, 0x53, 0x44, 0x53, 0x12, 0x24, 0x0a, 0x0d, 0x54, 0x4c, 0x53, 0x4d, - 0x69, 0x6e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0d, 0x54, 0x4c, 0x53, 0x4d, 0x69, 0x6e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x24, - 0x0a, 0x0d, 0x54, 0x4c, 0x53, 0x4d, 0x61, 0x78, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x54, 0x4c, 0x53, 0x4d, 0x61, 0x78, 0x56, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x22, 0x0a, 0x0c, 0x43, 0x69, 0x70, 0x68, 0x65, 0x72, 0x53, 0x75, - 0x69, 0x74, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x43, 0x69, 0x70, 0x68, - 0x65, 0x72, 0x53, 0x75, 0x69, 0x74, 0x65, 0x73, 0x22, 0x5b, 0x0a, 0x13, 0x47, 0x61, 0x74, 0x65, - 0x77, 0x61, 0x79, 0x54, 0x4c, 0x53, 0x53, 0x44, 0x53, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, - 0x20, 0x0a, 0x0b, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x61, 0x6d, - 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x43, 0x65, 0x72, 0x74, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x43, 0x65, 0x72, 0x74, 0x52, 0x65, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x22, 0xdf, 0x01, 0x0a, 0x0f, 0x49, 0x6e, 0x67, 0x72, 0x65, 0x73, - 0x73, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x6f, 0x72, - 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x1a, 0x0a, - 0x08, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x51, 0x0a, 0x08, 0x53, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x68, 0x61, - 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, - 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, - 0x74, 0x72, 0x79, 0x2e, 0x49, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x52, 0x08, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x49, 0x0a, 0x03, - 0x54, 0x4c, 0x53, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x68, 0x61, 0x73, 0x68, + 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x1a, 0x37, 0x0a, 0x09, 0x4d, + 0x65, 0x74, 0x61, 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, 0x22, 0x67, 0x0a, 0x17, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x53, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x54, 0x4c, 0x53, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, + 0x4c, 0x0a, 0x03, 0x53, 0x44, 0x53, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x68, + 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, + 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, + 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x54, 0x4c, 0x53, 0x53, + 0x44, 0x53, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x03, 0x53, 0x44, 0x53, 0x22, 0xcb, 0x02, + 0x0a, 0x13, 0x48, 0x54, 0x54, 0x50, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x4d, 0x6f, 0x64, 0x69, + 0x66, 0x69, 0x65, 0x72, 0x73, 0x12, 0x55, 0x0a, 0x03, 0x41, 0x64, 0x64, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x43, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, + 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x48, + 0x65, 0x61, 0x64, 0x65, 0x72, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x2e, 0x41, + 0x64, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x03, 0x41, 0x64, 0x64, 0x12, 0x55, 0x0a, 0x03, + 0x53, 0x65, 0x74, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x43, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, - 0x79, 0x2e, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x54, 0x4c, 0x53, 0x43, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x52, 0x03, 0x54, 0x4c, 0x53, 0x22, 0xb7, 0x06, 0x0a, 0x0e, 0x49, 0x6e, 0x67, 0x72, - 0x65, 0x73, 0x73, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, - 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x14, - 0x0a, 0x05, 0x48, 0x6f, 0x73, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x48, - 0x6f, 0x73, 0x74, 0x73, 0x12, 0x50, 0x0a, 0x03, 0x54, 0x4c, 0x53, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x3e, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, + 0x79, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x4d, 0x6f, 0x64, 0x69, + 0x66, 0x69, 0x65, 0x72, 0x73, 0x2e, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x03, + 0x53, 0x65, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x18, 0x03, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x06, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x1a, 0x36, 0x0a, 0x08, 0x41, + 0x64, 0x64, 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, 0x36, 0x0a, 0x08, 0x53, 0x65, 0x74, 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, 0x22, 0xf6, 0x01, 0x0a, 0x11, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x12, 0x50, 0x0a, 0x07, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, + 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x53, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x53, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x73, 0x12, 0x56, 0x0a, 0x04, 0x4d, 0x65, 0x74, 0x61, 0x18, 0x02, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x42, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, - 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x54, 0x4c, 0x53, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x52, 0x03, 0x54, 0x4c, 0x53, 0x12, 0x62, 0x0a, 0x0e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3a, - 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, - 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x48, 0x65, 0x61, 0x64, 0x65, - 0x72, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x52, 0x0e, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x12, 0x64, 0x0a, 0x0f, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, + 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4d, 0x65, 0x74, 0x61, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x4d, 0x65, 0x74, 0x61, 0x1a, 0x37, 0x0a, 0x09, 0x4d, + 0x65, 0x74, 0x61, 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, 0x22, 0xa6, 0x06, 0x0a, 0x0f, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, + 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x4e, 0x0a, 0x06, + 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x36, 0x2e, 0x68, + 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, + 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, + 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x06, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x5c, 0x0a, 0x0b, + 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x3a, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, + 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x74, + 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x50, + 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x50, 0x72, + 0x65, 0x63, 0x65, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, + 0x50, 0x72, 0x65, 0x63, 0x65, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x4c, 0x65, + 0x67, 0x61, 0x63, 0x79, 0x49, 0x44, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x4c, 0x65, + 0x67, 0x61, 0x63, 0x79, 0x49, 0x44, 0x12, 0x4e, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x3a, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, + 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, + 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x49, 0x6e, 0x74, + 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, + 0x52, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x44, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x66, 0x0a, 0x0a, 0x4c, 0x65, 0x67, 0x61, + 0x63, 0x79, 0x4d, 0x65, 0x74, 0x61, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x46, 0x2e, 0x68, + 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, + 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, + 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x74, 0x65, 0x6e, + 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x4c, 0x65, 0x67, 0x61, 0x63, 0x79, 0x4d, 0x65, 0x74, 0x61, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x4c, 0x65, 0x67, 0x61, 0x63, 0x79, 0x4d, 0x65, 0x74, 0x61, + 0x12, 0x46, 0x0a, 0x10, 0x4c, 0x65, 0x67, 0x61, 0x63, 0x79, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x54, 0x69, 0x6d, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, + 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x10, 0x4c, 0x65, 0x67, 0x61, 0x63, 0x79, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x46, 0x0a, 0x10, 0x4c, 0x65, 0x67, 0x61, + 0x63, 0x79, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x18, 0x0a, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x10, + 0x4c, 0x65, 0x67, 0x61, 0x63, 0x79, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, + 0x12, 0x58, 0x0a, 0x0e, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x4d, 0x65, + 0x74, 0x61, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, + 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, + 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x74, 0x65, + 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x52, 0x0e, 0x45, 0x6e, 0x74, 0x65, + 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x65, + 0x65, 0x72, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x50, 0x65, 0x65, 0x72, 0x1a, 0x3d, + 0x0a, 0x0f, 0x4c, 0x65, 0x67, 0x61, 0x63, 0x79, 0x4d, 0x65, 0x74, 0x61, 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, 0x22, 0xb9, 0x01, + 0x0a, 0x13, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x72, 0x6d, 0x69, + 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x4e, 0x0a, 0x06, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x36, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, + 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, + 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x49, 0x6e, + 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x06, 0x41, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x52, 0x0a, 0x04, 0x48, 0x54, 0x54, 0x50, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x3e, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, - 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x48, 0x54, 0x54, 0x50, - 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x52, - 0x0f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, - 0x12, 0x53, 0x0a, 0x04, 0x4d, 0x65, 0x74, 0x61, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3f, - 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, - 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x49, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x53, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, - 0x04, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x58, 0x0a, 0x0e, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, - 0x69, 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, - 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, - 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, - 0x2e, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x52, - 0x0e, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x12, - 0x26, 0x0a, 0x0e, 0x4d, 0x61, 0x78, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0e, 0x4d, 0x61, 0x78, 0x43, 0x6f, 0x6e, 0x6e, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2e, 0x0a, 0x12, 0x4d, 0x61, 0x78, 0x50, 0x65, - 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x18, 0x09, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x12, 0x4d, 0x61, 0x78, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x4d, 0x61, 0x78, 0x43, 0x6f, - 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, - 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x15, 0x4d, 0x61, 0x78, 0x43, 0x6f, 0x6e, 0x63, 0x75, - 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x12, 0x69, 0x0a, - 0x12, 0x50, 0x61, 0x73, 0x73, 0x69, 0x76, 0x65, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, - 0x65, 0x63, 0x6b, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x68, 0x61, 0x73, 0x68, - 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, - 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, - 0x79, 0x2e, 0x50, 0x61, 0x73, 0x73, 0x69, 0x76, 0x65, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, - 0x68, 0x65, 0x63, 0x6b, 0x52, 0x12, 0x50, 0x61, 0x73, 0x73, 0x69, 0x76, 0x65, 0x48, 0x65, 0x61, - 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x1a, 0x37, 0x0a, 0x09, 0x4d, 0x65, 0x74, 0x61, - 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, 0x22, 0x67, 0x0a, 0x17, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x53, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x54, 0x4c, 0x53, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x4c, 0x0a, 0x03, - 0x53, 0x44, 0x53, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x68, 0x61, 0x73, 0x68, - 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, - 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, - 0x79, 0x2e, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x54, 0x4c, 0x53, 0x53, 0x44, 0x53, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x03, 0x53, 0x44, 0x53, 0x22, 0xcb, 0x02, 0x0a, 0x13, 0x48, - 0x54, 0x54, 0x50, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, - 0x72, 0x73, 0x12, 0x55, 0x0a, 0x03, 0x41, 0x64, 0x64, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x43, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, - 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x48, 0x65, 0x61, 0x64, - 0x65, 0x72, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x2e, 0x41, 0x64, 0x64, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x52, 0x03, 0x41, 0x64, 0x64, 0x12, 0x55, 0x0a, 0x03, 0x53, 0x65, 0x74, - 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x43, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, - 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, - 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x48, - 0x54, 0x54, 0x50, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, - 0x72, 0x73, 0x2e, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x03, 0x53, 0x65, 0x74, - 0x12, 0x16, 0x0a, 0x06, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, - 0x52, 0x06, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x1a, 0x36, 0x0a, 0x08, 0x41, 0x64, 0x64, 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, 0x36, 0x0a, 0x08, 0x53, 0x65, 0x74, 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, 0x22, 0xf6, 0x01, 0x0a, 0x11, 0x53, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x50, - 0x0a, 0x07, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x36, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, - 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, - 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, - 0x12, 0x56, 0x0a, 0x04, 0x4d, 0x65, 0x74, 0x61, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x42, - 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, - 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, - 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x52, 0x04, 0x4d, 0x65, 0x74, 0x61, 0x1a, 0x37, 0x0a, 0x09, 0x4d, 0x65, 0x74, 0x61, - 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, 0x22, 0xa6, 0x06, 0x0a, 0x0f, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x74, 0x65, - 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x4e, 0x0a, 0x06, 0x41, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x36, 0x2e, 0x68, 0x61, 0x73, 0x68, - 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, - 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, - 0x79, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x52, 0x06, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x5c, 0x0a, 0x0b, 0x50, 0x65, 0x72, - 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3a, - 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, - 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, - 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x50, 0x65, 0x72, 0x6d, - 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x50, 0x72, 0x65, 0x63, 0x65, - 0x64, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x50, 0x72, 0x65, - 0x63, 0x65, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x4c, 0x65, 0x67, 0x61, 0x63, - 0x79, 0x49, 0x44, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x4c, 0x65, 0x67, 0x61, 0x63, - 0x79, 0x49, 0x44, 0x12, 0x4e, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x0e, 0x32, 0x3a, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, + 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x49, 0x6e, 0x74, 0x65, + 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x54, 0x54, 0x50, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, + 0x69, 0x6f, 0x6e, 0x52, 0x04, 0x48, 0x54, 0x54, 0x50, 0x22, 0xed, 0x01, 0x0a, 0x17, 0x49, 0x6e, + 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x54, 0x54, 0x50, 0x50, 0x65, 0x72, 0x6d, 0x69, + 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x50, 0x61, 0x74, 0x68, 0x45, 0x78, 0x61, + 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x50, 0x61, 0x74, 0x68, 0x45, 0x78, + 0x61, 0x63, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x50, 0x61, 0x74, 0x68, 0x50, 0x72, 0x65, 0x66, 0x69, + 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x50, 0x61, 0x74, 0x68, 0x50, 0x72, 0x65, + 0x66, 0x69, 0x78, 0x12, 0x1c, 0x0a, 0x09, 0x50, 0x61, 0x74, 0x68, 0x52, 0x65, 0x67, 0x65, 0x78, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x50, 0x61, 0x74, 0x68, 0x52, 0x65, 0x67, 0x65, + 0x78, 0x12, 0x5c, 0x0a, 0x06, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x04, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x44, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x74, - 0x69, 0x6f, 0x6e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x54, - 0x79, 0x70, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x66, 0x0a, 0x0a, 0x4c, 0x65, 0x67, 0x61, 0x63, 0x79, 0x4d, - 0x65, 0x74, 0x61, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x46, 0x2e, 0x68, 0x61, 0x73, 0x68, + 0x69, 0x6f, 0x6e, 0x48, 0x54, 0x54, 0x50, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x50, 0x65, 0x72, + 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x06, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, + 0x18, 0x0a, 0x07, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, + 0x52, 0x07, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x73, 0x22, 0xc1, 0x01, 0x0a, 0x1d, 0x49, 0x6e, + 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x54, 0x54, 0x50, 0x48, 0x65, 0x61, 0x64, 0x65, + 0x72, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x4e, + 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, + 0x18, 0x0a, 0x07, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x07, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x45, 0x78, 0x61, + 0x63, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x45, 0x78, 0x61, 0x63, 0x74, 0x12, + 0x16, 0x0a, 0x06, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x06, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x12, 0x16, 0x0a, 0x06, 0x53, 0x75, 0x66, 0x66, 0x69, + 0x78, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x53, 0x75, 0x66, 0x66, 0x69, 0x78, 0x12, + 0x14, 0x0a, 0x05, 0x52, 0x65, 0x67, 0x65, 0x78, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x52, 0x65, 0x67, 0x65, 0x78, 0x12, 0x16, 0x0a, 0x06, 0x49, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x18, + 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x49, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x22, 0xb6, 0x08, + 0x0a, 0x0f, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x44, 0x0a, + 0x04, 0x4d, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x30, 0x2e, 0x68, 0x61, + 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, + 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, + 0x74, 0x72, 0x79, 0x2e, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x04, 0x4d, + 0x6f, 0x64, 0x65, 0x12, 0x69, 0x0a, 0x10, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x61, 0x72, 0x65, + 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3d, 0x2e, + 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, + 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x61, 0x72, 0x65, 0x6e, + 0x74, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x10, 0x54, 0x72, + 0x61, 0x6e, 0x73, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x12, 0x5a, + 0x0a, 0x0b, 0x4d, 0x65, 0x73, 0x68, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, + 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, + 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x4d, 0x65, 0x73, 0x68, + 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x0b, 0x4d, + 0x65, 0x73, 0x68, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x12, 0x4b, 0x0a, 0x06, 0x45, 0x78, + 0x70, 0x6f, 0x73, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x68, 0x61, 0x73, + 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, + 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, + 0x72, 0x79, 0x2e, 0x45, 0x78, 0x70, 0x6f, 0x73, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, + 0x06, 0x45, 0x78, 0x70, 0x6f, 0x73, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x45, 0x78, 0x74, 0x65, 0x72, + 0x6e, 0x61, 0x6c, 0x53, 0x4e, 0x49, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x45, 0x78, + 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x53, 0x4e, 0x49, 0x12, 0x64, 0x0a, 0x0e, 0x55, 0x70, 0x73, + 0x74, 0x72, 0x65, 0x61, 0x6d, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x07, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x3c, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, + 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x55, 0x70, 0x73, 0x74, 0x72, 0x65, + 0x61, 0x6d, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x0e, 0x55, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, + 0x5a, 0x0a, 0x0b, 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x08, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, + 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, + 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x44, 0x65, 0x73, + 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x0b, + 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x34, 0x0a, 0x15, 0x4d, + 0x61, 0x78, 0x49, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x52, 0x15, 0x4d, 0x61, 0x78, 0x49, + 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x12, 0x34, 0x0a, 0x15, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, + 0x74, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x4d, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x15, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x54, 0x69, + 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x4d, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x4c, 0x6f, 0x63, 0x61, 0x6c, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x4d, 0x73, + 0x18, 0x0b, 0x20, 0x01, 0x28, 0x05, 0x52, 0x15, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x4d, 0x73, 0x12, 0x3c, 0x0a, + 0x19, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, + 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x19, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, + 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x54, 0x0a, 0x04, 0x4d, + 0x65, 0x74, 0x61, 0x18, 0x0d, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x40, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, - 0x79, 0x2e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, - 0x6e, 0x2e, 0x4c, 0x65, 0x67, 0x61, 0x63, 0x79, 0x4d, 0x65, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x0a, 0x4c, 0x65, 0x67, 0x61, 0x63, 0x79, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x46, 0x0a, - 0x10, 0x4c, 0x65, 0x67, 0x61, 0x63, 0x79, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, - 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, - 0x61, 0x6d, 0x70, 0x52, 0x10, 0x4c, 0x65, 0x67, 0x61, 0x63, 0x79, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x46, 0x0a, 0x10, 0x4c, 0x65, 0x67, 0x61, 0x63, 0x79, 0x55, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x10, 0x4c, 0x65, 0x67, - 0x61, 0x63, 0x79, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x58, 0x0a, - 0x0e, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x18, - 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, - 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, - 0x6c, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, - 0x69, 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x52, 0x0e, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, - 0x69, 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x65, 0x65, 0x72, 0x18, - 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x50, 0x65, 0x65, 0x72, 0x1a, 0x3d, 0x0a, 0x0f, 0x4c, - 0x65, 0x67, 0x61, 0x63, 0x79, 0x4d, 0x65, 0x74, 0x61, 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, 0x22, 0xb9, 0x01, 0x0a, 0x13, 0x49, - 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, - 0x6f, 0x6e, 0x12, 0x4e, 0x0a, 0x06, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0e, 0x32, 0x36, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, - 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x6e, - 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x06, 0x41, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x12, 0x52, 0x0a, 0x04, 0x48, 0x54, 0x54, 0x50, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x3e, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, - 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x69, - 0x6f, 0x6e, 0x48, 0x54, 0x54, 0x50, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, - 0x52, 0x04, 0x48, 0x54, 0x54, 0x50, 0x22, 0xed, 0x01, 0x0a, 0x17, 0x49, 0x6e, 0x74, 0x65, 0x6e, - 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x54, 0x54, 0x50, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, - 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x50, 0x61, 0x74, 0x68, 0x45, 0x78, 0x61, 0x63, 0x74, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x50, 0x61, 0x74, 0x68, 0x45, 0x78, 0x61, 0x63, 0x74, - 0x12, 0x1e, 0x0a, 0x0a, 0x50, 0x61, 0x74, 0x68, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x50, 0x61, 0x74, 0x68, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, - 0x12, 0x1c, 0x0a, 0x09, 0x50, 0x61, 0x74, 0x68, 0x52, 0x65, 0x67, 0x65, 0x78, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x09, 0x50, 0x61, 0x74, 0x68, 0x52, 0x65, 0x67, 0x65, 0x78, 0x12, 0x5c, - 0x0a, 0x06, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x44, - 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, - 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, - 0x48, 0x54, 0x54, 0x50, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, - 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x06, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x18, 0x0a, 0x07, - 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x4d, - 0x65, 0x74, 0x68, 0x6f, 0x64, 0x73, 0x22, 0xc1, 0x01, 0x0a, 0x1d, 0x49, 0x6e, 0x74, 0x65, 0x6e, - 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x54, 0x54, 0x50, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x50, 0x65, - 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, - 0x50, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x50, - 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x45, 0x78, 0x61, 0x63, 0x74, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x45, 0x78, 0x61, 0x63, 0x74, 0x12, 0x16, 0x0a, 0x06, - 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x50, 0x72, - 0x65, 0x66, 0x69, 0x78, 0x12, 0x16, 0x0a, 0x06, 0x53, 0x75, 0x66, 0x66, 0x69, 0x78, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x53, 0x75, 0x66, 0x66, 0x69, 0x78, 0x12, 0x14, 0x0a, 0x05, - 0x52, 0x65, 0x67, 0x65, 0x78, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x52, 0x65, 0x67, - 0x65, 0x78, 0x12, 0x16, 0x0a, 0x06, 0x49, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x18, 0x07, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x06, 0x49, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x22, 0xb6, 0x08, 0x0a, 0x0f, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x1a, - 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x44, 0x0a, 0x04, 0x4d, 0x6f, - 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x30, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, - 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, - 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, - 0x2e, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x04, 0x4d, 0x6f, 0x64, 0x65, - 0x12, 0x69, 0x0a, 0x10, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x50, - 0x72, 0x6f, 0x78, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3d, 0x2e, 0x68, 0x61, 0x73, + 0x79, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x73, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x4d, 0x65, 0x74, + 0x61, 0x12, 0x5a, 0x0a, 0x0f, 0x45, 0x6e, 0x76, 0x6f, 0x79, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, + 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x0e, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, - 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, - 0x72, 0x79, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x50, 0x72, - 0x6f, 0x78, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x10, 0x54, 0x72, 0x61, 0x6e, 0x73, - 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x12, 0x5a, 0x0a, 0x0b, 0x4d, - 0x65, 0x73, 0x68, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x38, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, - 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x4d, 0x65, 0x73, 0x68, 0x47, 0x61, 0x74, - 0x65, 0x77, 0x61, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x0b, 0x4d, 0x65, 0x73, 0x68, - 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x12, 0x4b, 0x0a, 0x06, 0x45, 0x78, 0x70, 0x6f, 0x73, - 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, - 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, - 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, - 0x45, 0x78, 0x70, 0x6f, 0x73, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x06, 0x45, 0x78, - 0x70, 0x6f, 0x73, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, - 0x53, 0x4e, 0x49, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x45, 0x78, 0x74, 0x65, 0x72, - 0x6e, 0x61, 0x6c, 0x53, 0x4e, 0x49, 0x12, 0x64, 0x0a, 0x0e, 0x55, 0x70, 0x73, 0x74, 0x72, 0x65, - 0x61, 0x6d, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3c, + 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6e, + 0x76, 0x6f, 0x79, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x0f, 0x45, 0x6e, + 0x76, 0x6f, 0x79, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x37, 0x0a, + 0x09, 0x4d, 0x65, 0x74, 0x61, 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, 0x22, 0x74, 0x0a, 0x16, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, + 0x61, 0x72, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x12, 0x32, 0x0a, 0x14, 0x4f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x4c, 0x69, 0x73, 0x74, + 0x65, 0x6e, 0x65, 0x72, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x14, + 0x4f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, + 0x50, 0x6f, 0x72, 0x74, 0x12, 0x26, 0x0a, 0x0e, 0x44, 0x69, 0x61, 0x6c, 0x65, 0x64, 0x44, 0x69, + 0x72, 0x65, 0x63, 0x74, 0x6c, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x44, 0x69, + 0x61, 0x6c, 0x65, 0x64, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6c, 0x79, 0x22, 0x5f, 0x0a, 0x11, + 0x4d, 0x65, 0x73, 0x68, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x12, 0x4a, 0x0a, 0x04, 0x4d, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x36, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, + 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x4d, 0x65, 0x73, 0x68, 0x47, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x04, 0x4d, 0x6f, 0x64, 0x65, 0x22, 0x6f, 0x0a, + 0x0c, 0x45, 0x78, 0x70, 0x6f, 0x73, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x16, 0x0a, + 0x06, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x43, + 0x68, 0x65, 0x63, 0x6b, 0x73, 0x12, 0x47, 0x0a, 0x05, 0x50, 0x61, 0x74, 0x68, 0x73, 0x18, 0x02, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, + 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, + 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x45, 0x78, 0x70, + 0x6f, 0x73, 0x65, 0x50, 0x61, 0x74, 0x68, 0x52, 0x05, 0x50, 0x61, 0x74, 0x68, 0x73, 0x22, 0xb0, + 0x01, 0x0a, 0x0a, 0x45, 0x78, 0x70, 0x6f, 0x73, 0x65, 0x50, 0x61, 0x74, 0x68, 0x12, 0x22, 0x0a, + 0x0c, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x0c, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x50, 0x6f, 0x72, + 0x74, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x50, 0x61, 0x74, 0x68, 0x12, 0x24, 0x0a, 0x0d, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x50, 0x61, + 0x74, 0x68, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x4c, 0x6f, + 0x63, 0x61, 0x6c, 0x50, 0x61, 0x74, 0x68, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x50, + 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x50, + 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x28, 0x0a, 0x0f, 0x50, 0x61, 0x72, 0x73, 0x65, + 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x0f, 0x50, 0x61, 0x72, 0x73, 0x65, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x43, 0x68, 0x65, 0x63, + 0x6b, 0x22, 0xbf, 0x01, 0x0a, 0x15, 0x55, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x53, 0x0a, 0x09, 0x4f, + 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x55, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0e, 0x55, 0x70, - 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x5a, 0x0a, 0x0b, - 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x38, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, - 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x0b, 0x44, 0x65, 0x73, - 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x34, 0x0a, 0x15, 0x4d, 0x61, 0x78, 0x49, - 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x52, 0x15, 0x4d, 0x61, 0x78, 0x49, 0x6e, 0x62, 0x6f, - 0x75, 0x6e, 0x64, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x34, - 0x0a, 0x15, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x54, 0x69, - 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x4d, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x52, 0x15, 0x4c, - 0x6f, 0x63, 0x61, 0x6c, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x6f, - 0x75, 0x74, 0x4d, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x4d, 0x73, 0x18, 0x0b, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x15, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x4d, 0x73, 0x12, 0x3c, 0x0a, 0x19, 0x42, 0x61, - 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x6f, 0x6e, 0x6e, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x19, 0x42, - 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x6f, 0x6e, - 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x54, 0x0a, 0x04, 0x4d, 0x65, 0x74, 0x61, - 0x18, 0x0d, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x40, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x09, 0x4f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x73, + 0x12, 0x51, 0x0a, 0x08, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, + 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x55, 0x70, 0x73, 0x74, 0x72, + 0x65, 0x61, 0x6d, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x08, 0x44, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x73, 0x22, 0x8a, 0x05, 0x0a, 0x0e, 0x55, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x58, 0x0a, 0x0e, 0x45, 0x6e, + 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, + 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, + 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, + 0x4d, 0x65, 0x74, 0x61, 0x52, 0x0e, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, + 0x4d, 0x65, 0x74, 0x61, 0x12, 0x2c, 0x0a, 0x11, 0x45, 0x6e, 0x76, 0x6f, 0x79, 0x4c, 0x69, 0x73, + 0x74, 0x65, 0x6e, 0x65, 0x72, 0x4a, 0x53, 0x4f, 0x4e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x11, 0x45, 0x6e, 0x76, 0x6f, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x4a, 0x53, + 0x4f, 0x4e, 0x12, 0x2a, 0x0a, 0x10, 0x45, 0x6e, 0x76, 0x6f, 0x79, 0x43, 0x6c, 0x75, 0x73, 0x74, + 0x65, 0x72, 0x4a, 0x53, 0x4f, 0x4e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x45, 0x6e, + 0x76, 0x6f, 0x79, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4a, 0x53, 0x4f, 0x4e, 0x12, 0x1a, + 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x2a, 0x0a, 0x10, 0x43, 0x6f, + 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x4d, 0x73, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x10, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x54, 0x69, 0x6d, + 0x65, 0x6f, 0x75, 0x74, 0x4d, 0x73, 0x12, 0x4d, 0x0a, 0x06, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, + 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, - 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x2e, 0x4d, - 0x65, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x5a, - 0x0a, 0x0f, 0x45, 0x6e, 0x76, 0x6f, 0x79, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, - 0x73, 0x18, 0x0e, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, - 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, - 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x76, 0x6f, 0x79, - 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x0f, 0x45, 0x6e, 0x76, 0x6f, 0x79, - 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x37, 0x0a, 0x09, 0x4d, 0x65, - 0x74, 0x61, 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, 0x22, 0x74, 0x0a, 0x16, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x61, 0x72, 0x65, - 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x32, 0x0a, - 0x14, 0x4f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, - 0x72, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x14, 0x4f, 0x75, 0x74, - 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x50, 0x6f, 0x72, - 0x74, 0x12, 0x26, 0x0a, 0x0e, 0x44, 0x69, 0x61, 0x6c, 0x65, 0x64, 0x44, 0x69, 0x72, 0x65, 0x63, - 0x74, 0x6c, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x44, 0x69, 0x61, 0x6c, 0x65, - 0x64, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6c, 0x79, 0x22, 0x5f, 0x0a, 0x11, 0x4d, 0x65, 0x73, - 0x68, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x4a, - 0x0a, 0x04, 0x4d, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x36, 0x2e, 0x68, - 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, - 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, - 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x4d, 0x65, 0x73, 0x68, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, - 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x04, 0x4d, 0x6f, 0x64, 0x65, 0x22, 0x6f, 0x0a, 0x0c, 0x45, 0x78, - 0x70, 0x6f, 0x73, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x16, 0x0a, 0x06, 0x43, 0x68, - 0x65, 0x63, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x43, 0x68, 0x65, 0x63, - 0x6b, 0x73, 0x12, 0x47, 0x0a, 0x05, 0x50, 0x61, 0x74, 0x68, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x31, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, + 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x55, + 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x52, 0x06, 0x4c, + 0x69, 0x6d, 0x69, 0x74, 0x73, 0x12, 0x69, 0x0a, 0x12, 0x50, 0x61, 0x73, 0x73, 0x69, 0x76, 0x65, + 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x18, 0x08, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x39, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x45, 0x78, 0x70, 0x6f, 0x73, 0x65, - 0x50, 0x61, 0x74, 0x68, 0x52, 0x05, 0x50, 0x61, 0x74, 0x68, 0x73, 0x22, 0xb0, 0x01, 0x0a, 0x0a, - 0x45, 0x78, 0x70, 0x6f, 0x73, 0x65, 0x50, 0x61, 0x74, 0x68, 0x12, 0x22, 0x0a, 0x0c, 0x4c, 0x69, - 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x0c, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x12, - 0x0a, 0x04, 0x50, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x50, 0x61, - 0x74, 0x68, 0x12, 0x24, 0x0a, 0x0d, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x50, 0x61, 0x74, 0x68, 0x50, - 0x6f, 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x4c, 0x6f, 0x63, 0x61, 0x6c, - 0x50, 0x61, 0x74, 0x68, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x74, - 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x50, 0x72, 0x6f, 0x74, - 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x28, 0x0a, 0x0f, 0x50, 0x61, 0x72, 0x73, 0x65, 0x64, 0x46, 0x72, - 0x6f, 0x6d, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x50, - 0x61, 0x72, 0x73, 0x65, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x22, 0xbf, - 0x01, 0x0a, 0x15, 0x55, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x53, 0x0a, 0x09, 0x4f, 0x76, 0x65, 0x72, - 0x72, 0x69, 0x64, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x68, 0x61, + 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x50, 0x61, 0x73, 0x73, 0x69, 0x76, + 0x65, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x12, 0x50, 0x61, + 0x73, 0x73, 0x69, 0x76, 0x65, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, + 0x12, 0x5a, 0x0a, 0x0b, 0x4d, 0x65, 0x73, 0x68, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x18, + 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, + 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, + 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x4d, 0x65, + 0x73, 0x68, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, + 0x0b, 0x4d, 0x65, 0x73, 0x68, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x12, 0x3e, 0x0a, 0x1a, + 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x4f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, + 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x1a, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x4f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, + 0x64, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x12, 0x0a, 0x04, + 0x50, 0x65, 0x65, 0x72, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x50, 0x65, 0x65, 0x72, + 0x22, 0x9e, 0x01, 0x0a, 0x0e, 0x55, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x4c, 0x69, 0x6d, + 0x69, 0x74, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x4d, 0x61, 0x78, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x4d, 0x61, 0x78, + 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2e, 0x0a, 0x12, 0x4d, + 0x61, 0x78, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x12, 0x4d, 0x61, 0x78, 0x50, 0x65, 0x6e, 0x64, + 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x4d, + 0x61, 0x78, 0x43, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x15, 0x4d, 0x61, 0x78, 0x43, + 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x73, 0x22, 0xa7, 0x01, 0x0a, 0x12, 0x50, 0x61, 0x73, 0x73, 0x69, 0x76, 0x65, 0x48, 0x65, 0x61, + 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x12, 0x35, 0x0a, 0x08, 0x49, 0x6e, 0x74, 0x65, + 0x72, 0x76, 0x61, 0x6c, 0x18, 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, 0x52, 0x08, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x12, + 0x20, 0x0a, 0x0b, 0x4d, 0x61, 0x78, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x73, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x4d, 0x61, 0x78, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, + 0x73, 0x12, 0x38, 0x0a, 0x17, 0x45, 0x6e, 0x66, 0x6f, 0x72, 0x63, 0x69, 0x6e, 0x67, 0x43, 0x6f, + 0x6e, 0x73, 0x65, 0x63, 0x75, 0x74, 0x69, 0x76, 0x65, 0x35, 0x78, 0x78, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x17, 0x45, 0x6e, 0x66, 0x6f, 0x72, 0x63, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6e, + 0x73, 0x65, 0x63, 0x75, 0x74, 0x69, 0x76, 0x65, 0x35, 0x78, 0x78, 0x22, 0x45, 0x0a, 0x11, 0x44, + 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x12, 0x1c, 0x0a, 0x09, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x09, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x12, 0x12, + 0x0a, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x50, 0x6f, + 0x72, 0x74, 0x22, 0xb6, 0x02, 0x0a, 0x0a, 0x41, 0x50, 0x49, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, + 0x79, 0x12, 0x4f, 0x0a, 0x04, 0x4d, 0x65, 0x74, 0x61, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x3b, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, + 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x41, 0x50, 0x49, 0x47, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x4d, 0x65, + 0x74, 0x61, 0x12, 0x57, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x73, 0x18, + 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, + 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, + 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x41, 0x50, + 0x49, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, + 0x52, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x73, 0x12, 0x45, 0x0a, 0x06, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, - 0x74, 0x72, 0x79, 0x2e, 0x55, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x43, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x52, 0x09, 0x4f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x73, 0x12, 0x51, 0x0a, - 0x08, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x35, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, - 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x55, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x08, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, - 0x22, 0x8a, 0x05, 0x0a, 0x0e, 0x55, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x58, 0x0a, 0x0e, 0x45, 0x6e, 0x74, 0x65, 0x72, - 0x70, 0x72, 0x69, 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x30, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, - 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, - 0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x4d, 0x65, 0x74, - 0x61, 0x52, 0x0e, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x4d, 0x65, 0x74, - 0x61, 0x12, 0x2c, 0x0a, 0x11, 0x45, 0x6e, 0x76, 0x6f, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, - 0x65, 0x72, 0x4a, 0x53, 0x4f, 0x4e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x45, 0x6e, - 0x76, 0x6f, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x4a, 0x53, 0x4f, 0x4e, 0x12, - 0x2a, 0x0a, 0x10, 0x45, 0x6e, 0x76, 0x6f, 0x79, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4a, - 0x53, 0x4f, 0x4e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x45, 0x6e, 0x76, 0x6f, 0x79, - 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4a, 0x53, 0x4f, 0x4e, 0x12, 0x1a, 0x0a, 0x08, 0x50, - 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x50, - 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x2a, 0x0a, 0x10, 0x43, 0x6f, 0x6e, 0x6e, 0x65, - 0x63, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x4d, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x10, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, - 0x74, 0x4d, 0x73, 0x12, 0x4d, 0x0a, 0x06, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x18, 0x07, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, - 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, - 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x55, 0x70, 0x73, 0x74, - 0x72, 0x65, 0x61, 0x6d, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x52, 0x06, 0x4c, 0x69, 0x6d, 0x69, - 0x74, 0x73, 0x12, 0x69, 0x0a, 0x12, 0x50, 0x61, 0x73, 0x73, 0x69, 0x76, 0x65, 0x48, 0x65, 0x61, - 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x39, - 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, - 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x50, 0x61, 0x73, 0x73, 0x69, 0x76, 0x65, 0x48, 0x65, - 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x12, 0x50, 0x61, 0x73, 0x73, 0x69, - 0x76, 0x65, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x12, 0x5a, 0x0a, - 0x0b, 0x4d, 0x65, 0x73, 0x68, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x18, 0x09, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, + 0x74, 0x72, 0x79, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x1a, 0x37, 0x0a, 0x09, 0x4d, 0x65, 0x74, 0x61, 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, 0x22, 0x5a, 0x0a, 0x06, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x50, 0x0a, 0x0a, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x68, 0x61, 0x73, 0x68, + 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, + 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, + 0x79, 0x2e, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x43, 0x6f, 0x6e, + 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x8b, 0x02, 0x0a, 0x09, 0x43, 0x6f, 0x6e, 0x64, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x12, 0x16, 0x0a, 0x06, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x06, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x4d, 0x65, 0x73, + 0x73, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x4d, 0x65, 0x73, 0x73, + 0x61, 0x67, 0x65, 0x12, 0x54, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, + 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, + 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x52, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, + 0x08, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x4a, 0x0a, 0x12, 0x4c, 0x61, 0x73, + 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, + 0x70, 0x52, 0x12, 0x4c, 0x61, 0x73, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, + 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x22, 0x8c, 0x02, 0x0a, 0x12, 0x41, 0x50, 0x49, 0x47, 0x61, 0x74, + 0x65, 0x77, 0x61, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, + 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, + 0x12, 0x1a, 0x0a, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, + 0x50, 0x6f, 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x50, 0x6f, 0x72, 0x74, + 0x12, 0x5d, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x41, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x4d, 0x65, 0x73, 0x68, 0x47, - 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x0b, 0x4d, 0x65, - 0x73, 0x68, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x12, 0x3e, 0x0a, 0x1a, 0x42, 0x61, 0x6c, - 0x61, 0x6e, 0x63, 0x65, 0x4f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x6f, 0x6e, 0x6e, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x1a, 0x42, - 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x4f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x6f, - 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x65, 0x65, - 0x72, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x50, 0x65, 0x65, 0x72, 0x22, 0x9e, 0x01, - 0x0a, 0x0e, 0x55, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, - 0x12, 0x26, 0x0a, 0x0e, 0x4d, 0x61, 0x78, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x4d, 0x61, 0x78, 0x43, 0x6f, 0x6e, - 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2e, 0x0a, 0x12, 0x4d, 0x61, 0x78, 0x50, - 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x12, 0x4d, 0x61, 0x78, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x4d, 0x61, 0x78, 0x43, - 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x15, 0x4d, 0x61, 0x78, 0x43, 0x6f, 0x6e, 0x63, - 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x22, 0xa7, - 0x01, 0x0a, 0x12, 0x50, 0x61, 0x73, 0x73, 0x69, 0x76, 0x65, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, - 0x43, 0x68, 0x65, 0x63, 0x6b, 0x12, 0x35, 0x0a, 0x08, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, - 0x6c, 0x18, 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, 0x52, 0x08, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x12, 0x20, 0x0a, 0x0b, - 0x4d, 0x61, 0x78, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0d, 0x52, 0x0b, 0x4d, 0x61, 0x78, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x73, 0x12, 0x38, - 0x0a, 0x17, 0x45, 0x6e, 0x66, 0x6f, 0x72, 0x63, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6e, 0x73, 0x65, - 0x63, 0x75, 0x74, 0x69, 0x76, 0x65, 0x35, 0x78, 0x78, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x17, 0x45, 0x6e, 0x66, 0x6f, 0x72, 0x63, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6e, 0x73, 0x65, 0x63, - 0x75, 0x74, 0x69, 0x76, 0x65, 0x35, 0x78, 0x78, 0x22, 0x45, 0x0a, 0x11, 0x44, 0x65, 0x73, 0x74, - 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x1c, 0x0a, - 0x09, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, - 0x52, 0x09, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x50, - 0x6f, 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x22, - 0xb6, 0x02, 0x0a, 0x0a, 0x41, 0x50, 0x49, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x12, 0x4f, - 0x0a, 0x04, 0x4d, 0x65, 0x74, 0x61, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3b, 0x2e, 0x68, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x41, 0x50, 0x49, 0x47, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x50, 0x72, 0x6f, + 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x52, 0x08, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, + 0x53, 0x0a, 0x03, 0x54, 0x4c, 0x53, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x41, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, - 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x41, 0x50, 0x49, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, - 0x4d, 0x65, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x4d, 0x65, 0x74, 0x61, 0x12, - 0x57, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, - 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x41, 0x50, 0x49, 0x47, 0x61, - 0x74, 0x65, 0x77, 0x61, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x09, 0x4c, - 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x73, 0x12, 0x45, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, - 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, - 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, - 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x1a, - 0x37, 0x0a, 0x09, 0x4d, 0x65, 0x74, 0x61, 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, 0x22, 0x5a, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x12, 0x50, 0x0a, 0x0a, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, - 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, - 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x43, - 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x8b, 0x02, 0x0a, 0x09, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, - 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x16, - 0x0a, 0x06, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, - 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, - 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, - 0x12, 0x54, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, - 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x08, 0x52, 0x65, - 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x4a, 0x0a, 0x12, 0x4c, 0x61, 0x73, 0x74, 0x54, 0x72, - 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x12, - 0x4c, 0x61, 0x73, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, - 0x6d, 0x65, 0x22, 0x8c, 0x02, 0x0a, 0x12, 0x41, 0x50, 0x49, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, - 0x79, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, - 0x08, 0x48, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x48, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x6f, 0x72, - 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x5d, 0x0a, - 0x08, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, - 0x41, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, - 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x41, 0x50, 0x49, 0x47, 0x61, 0x74, 0x65, 0x77, - 0x61, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, - 0x6f, 0x6c, 0x52, 0x08, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x53, 0x0a, 0x03, - 0x54, 0x4c, 0x53, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x41, 0x2e, 0x68, 0x61, 0x73, 0x68, + 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x41, 0x50, 0x49, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x54, + 0x4c, 0x53, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x03, 0x54, 0x4c, 0x53, 0x22, 0xde, 0x01, 0x0a, 0x1a, 0x41, 0x50, 0x49, 0x47, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x54, 0x4c, 0x53, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x5c, 0x0a, 0x0c, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, + 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, - 0x79, 0x2e, 0x41, 0x50, 0x49, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x54, 0x4c, 0x53, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x03, 0x54, 0x4c, - 0x53, 0x22, 0xde, 0x01, 0x0a, 0x1a, 0x41, 0x50, 0x49, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, - 0x54, 0x4c, 0x53, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x79, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, + 0x6e, 0x63, 0x65, 0x52, 0x0c, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, + 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x4d, 0x69, 0x6e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x4d, 0x69, 0x6e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x4d, 0x61, 0x78, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x4d, 0x61, 0x78, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x12, 0x22, 0x0a, 0x0c, 0x43, 0x69, 0x70, 0x68, 0x65, 0x72, 0x53, 0x75, 0x69, 0x74, 0x65, + 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x43, 0x69, 0x70, 0x68, 0x65, 0x72, 0x53, + 0x75, 0x69, 0x74, 0x65, 0x73, 0x22, 0xb7, 0x01, 0x0a, 0x11, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x4b, + 0x69, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4b, 0x69, 0x6e, 0x64, 0x12, + 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, + 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x53, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, + 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x53, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x58, 0x0a, 0x0e, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, + 0x69, 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, + 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, + 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, + 0x2e, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x52, + 0x0e, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x22, + 0xfe, 0x01, 0x0a, 0x0f, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x41, 0x50, 0x49, 0x47, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x12, 0x54, 0x0a, 0x04, 0x4d, 0x65, 0x74, 0x61, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x40, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, + 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x41, + 0x50, 0x49, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x52, 0x04, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x5c, 0x0a, 0x09, 0x4c, 0x69, 0x73, + 0x74, 0x65, 0x6e, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3e, 0x2e, 0x68, + 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, + 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, + 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x41, 0x50, 0x49, 0x47, 0x61, 0x74, + 0x65, 0x77, 0x61, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x09, 0x4c, 0x69, + 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x73, 0x1a, 0x37, 0x0a, 0x09, 0x4d, 0x65, 0x74, 0x61, 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, + 0x22, 0xdd, 0x01, 0x0a, 0x17, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x41, 0x50, 0x49, 0x47, 0x61, 0x74, + 0x65, 0x77, 0x61, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, + 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x5c, 0x0a, 0x0c, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, + 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, - 0x52, 0x0c, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, 0x12, 0x1e, - 0x0a, 0x0a, 0x4d, 0x69, 0x6e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0a, 0x4d, 0x69, 0x6e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1e, - 0x0a, 0x0a, 0x4d, 0x61, 0x78, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0a, 0x4d, 0x61, 0x78, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x22, - 0x0a, 0x0c, 0x43, 0x69, 0x70, 0x68, 0x65, 0x72, 0x53, 0x75, 0x69, 0x74, 0x65, 0x73, 0x18, 0x04, - 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x43, 0x69, 0x70, 0x68, 0x65, 0x72, 0x53, 0x75, 0x69, 0x74, - 0x65, 0x73, 0x22, 0xb7, 0x01, 0x0a, 0x11, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, - 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x4b, 0x69, 0x6e, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x12, 0x0a, 0x04, - 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, - 0x12, 0x20, 0x0a, 0x0b, 0x53, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x53, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, - 0x6d, 0x65, 0x12, 0x58, 0x0a, 0x0e, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, - 0x4d, 0x65, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x68, 0x61, 0x73, - 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, - 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6e, - 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x52, 0x0e, 0x45, 0x6e, - 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x22, 0xfe, 0x01, 0x0a, - 0x0f, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x41, 0x50, 0x49, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, - 0x12, 0x54, 0x0a, 0x04, 0x4d, 0x65, 0x74, 0x61, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x40, + 0x52, 0x0c, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, 0x12, 0x50, + 0x0a, 0x06, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x41, 0x50, 0x49, 0x47, - 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x52, 0x04, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x5c, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, - 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3e, 0x2e, 0x68, 0x61, 0x73, 0x68, - 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, - 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, - 0x79, 0x2e, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x41, 0x50, 0x49, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, - 0x79, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x65, - 0x6e, 0x65, 0x72, 0x73, 0x1a, 0x37, 0x0a, 0x09, 0x4d, 0x65, 0x74, 0x61, 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, 0x22, 0xdd, 0x01, - 0x0a, 0x17, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x41, 0x50, 0x49, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, - 0x79, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x5c, 0x0a, - 0x0c, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, 0x18, 0x02, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, + 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, + 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x06, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x73, + 0x22, 0xe6, 0x01, 0x0a, 0x11, 0x49, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x43, 0x65, 0x72, 0x74, 0x69, + 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x12, 0x56, 0x0a, 0x04, 0x4d, 0x65, 0x74, 0x61, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x42, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, + 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, + 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x49, 0x6e, 0x6c, + 0x69, 0x6e, 0x65, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x2e, 0x4d, + 0x65, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x20, + 0x0a, 0x0b, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0b, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, + 0x12, 0x1e, 0x0a, 0x0a, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, + 0x1a, 0x37, 0x0a, 0x09, 0x4d, 0x65, 0x74, 0x61, 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, 0x22, 0x99, 0x03, 0x0a, 0x09, 0x48, 0x54, + 0x54, 0x50, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x12, 0x4e, 0x0a, 0x04, 0x4d, 0x65, 0x74, 0x61, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, + 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, + 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x48, 0x54, + 0x54, 0x50, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x04, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x52, 0x0a, 0x07, 0x50, 0x61, 0x72, 0x65, 0x6e, + 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, + 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, + 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, + 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x63, 0x65, 0x52, 0x07, 0x50, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x4a, 0x0a, 0x05, 0x52, + 0x75, 0x6c, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x68, 0x61, 0x73, + 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, + 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, + 0x72, 0x79, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, + 0x52, 0x05, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x48, 0x6f, 0x73, 0x74, 0x6e, + 0x61, 0x6d, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x48, 0x6f, 0x73, 0x74, + 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x45, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, + 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, + 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x1a, 0x37, 0x0a, 0x09, + 0x4d, 0x65, 0x74, 0x61, 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, 0x22, 0xf9, 0x01, 0x0a, 0x0d, 0x48, 0x54, 0x54, 0x50, 0x52, 0x6f, + 0x75, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x4c, 0x0a, 0x07, 0x46, 0x69, 0x6c, 0x74, 0x65, + 0x72, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, + 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, + 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, + 0x2e, 0x48, 0x54, 0x54, 0x50, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x52, 0x07, 0x46, 0x69, + 0x6c, 0x74, 0x65, 0x72, 0x73, 0x12, 0x4a, 0x0a, 0x07, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, + 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, + 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, + 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x48, + 0x54, 0x54, 0x50, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x52, 0x07, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, + 0x73, 0x12, 0x4e, 0x0a, 0x08, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x03, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, - 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x52, 0x65, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x0c, 0x43, - 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, 0x12, 0x50, 0x0a, 0x06, 0x52, - 0x6f, 0x75, 0x74, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x68, 0x61, + 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x48, 0x54, 0x54, 0x50, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x08, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x73, 0x22, 0xc4, 0x02, 0x0a, 0x09, 0x48, 0x54, 0x54, 0x50, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x12, + 0x50, 0x0a, 0x07, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x36, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, + 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x48, 0x65, 0x61, + 0x64, 0x65, 0x72, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x52, 0x07, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, + 0x73, 0x12, 0x4e, 0x0a, 0x06, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x36, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, + 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x4d, 0x61, + 0x74, 0x63, 0x68, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x52, 0x06, 0x4d, 0x65, 0x74, 0x68, 0x6f, + 0x64, 0x12, 0x48, 0x0a, 0x04, 0x50, 0x61, 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x34, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, + 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x50, 0x61, 0x74, 0x68, + 0x4d, 0x61, 0x74, 0x63, 0x68, 0x52, 0x04, 0x50, 0x61, 0x74, 0x68, 0x12, 0x4b, 0x0a, 0x05, 0x51, + 0x75, 0x65, 0x72, 0x79, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x68, 0x61, 0x73, + 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, + 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, + 0x72, 0x79, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4d, 0x61, 0x74, 0x63, + 0x68, 0x52, 0x05, 0x51, 0x75, 0x65, 0x72, 0x79, 0x22, 0x8d, 0x01, 0x0a, 0x0f, 0x48, 0x54, 0x54, + 0x50, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x12, 0x50, 0x0a, 0x05, + 0x4d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x3a, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, - 0x74, 0x72, 0x79, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x66, 0x65, - 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x06, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x22, 0xe6, 0x01, - 0x0a, 0x11, 0x49, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, - 0x61, 0x74, 0x65, 0x12, 0x56, 0x0a, 0x04, 0x4d, 0x65, 0x74, 0x61, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x42, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, + 0x74, 0x72, 0x79, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x4d, 0x61, + 0x74, 0x63, 0x68, 0x54, 0x79, 0x70, 0x65, 0x52, 0x05, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x12, 0x12, + 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, + 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x75, 0x0a, 0x0d, 0x48, 0x54, 0x54, 0x50, + 0x50, 0x61, 0x74, 0x68, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x12, 0x4e, 0x0a, 0x05, 0x4d, 0x61, 0x74, + 0x63, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x38, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, + 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, + 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, + 0x2e, 0x48, 0x54, 0x54, 0x50, 0x50, 0x61, 0x74, 0x68, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x54, 0x79, + 0x70, 0x65, 0x52, 0x05, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x56, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x22, + 0x8b, 0x01, 0x0a, 0x0e, 0x48, 0x54, 0x54, 0x50, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4d, 0x61, 0x74, + 0x63, 0x68, 0x12, 0x4f, 0x0a, 0x05, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x39, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x49, 0x6e, 0x6c, 0x69, 0x6e, 0x65, - 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x2e, 0x4d, 0x65, 0x74, 0x61, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x20, 0x0a, 0x0b, 0x43, - 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0b, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x12, 0x1e, 0x0a, - 0x0a, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0a, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x1a, 0x37, 0x0a, - 0x09, 0x4d, 0x65, 0x74, 0x61, 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, 0x22, 0x99, 0x03, 0x0a, 0x09, 0x48, 0x54, 0x54, 0x50, 0x52, - 0x6f, 0x75, 0x74, 0x65, 0x12, 0x4e, 0x0a, 0x04, 0x4d, 0x65, 0x74, 0x61, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, - 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x52, - 0x6f, 0x75, 0x74, 0x65, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, - 0x4d, 0x65, 0x74, 0x61, 0x12, 0x52, 0x0a, 0x07, 0x50, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x73, 0x18, - 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, - 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, - 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x52, 0x65, - 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, - 0x07, 0x50, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x4a, 0x0a, 0x05, 0x52, 0x75, 0x6c, 0x65, - 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, + 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x51, 0x75, + 0x65, 0x72, 0x79, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x54, 0x79, 0x70, 0x65, 0x52, 0x05, 0x4d, 0x61, + 0x74, 0x63, 0x68, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x56, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x22, 0xb3, 0x01, + 0x0a, 0x0b, 0x48, 0x54, 0x54, 0x50, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x12, 0x51, 0x0a, + 0x07, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x37, + 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, + 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x48, 0x65, 0x61, 0x64, 0x65, + 0x72, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x52, 0x07, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, + 0x12, 0x51, 0x0a, 0x0a, 0x55, 0x52, 0x4c, 0x52, 0x65, 0x77, 0x72, 0x69, 0x74, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, + 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, + 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x55, 0x52, 0x4c, + 0x52, 0x65, 0x77, 0x72, 0x69, 0x74, 0x65, 0x52, 0x0a, 0x55, 0x52, 0x4c, 0x52, 0x65, 0x77, 0x72, + 0x69, 0x74, 0x65, 0x22, 0x20, 0x0a, 0x0a, 0x55, 0x52, 0x4c, 0x52, 0x65, 0x77, 0x72, 0x69, 0x74, + 0x65, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x50, 0x61, 0x74, 0x68, 0x22, 0xc2, 0x02, 0x0a, 0x10, 0x48, 0x54, 0x54, 0x50, 0x48, 0x65, + 0x61, 0x64, 0x65, 0x72, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x52, 0x0a, 0x03, 0x41, 0x64, + 0x64, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x40, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, - 0x48, 0x54, 0x54, 0x50, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x05, 0x52, - 0x75, 0x6c, 0x65, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x48, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, - 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x48, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, - 0x65, 0x73, 0x12, 0x45, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, - 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x52, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x1a, 0x37, 0x0a, 0x09, 0x4d, 0x65, 0x74, - 0x61, 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, 0x22, 0xf9, 0x01, 0x0a, 0x0d, 0x48, 0x54, 0x54, 0x50, 0x52, 0x6f, 0x75, 0x74, 0x65, - 0x52, 0x75, 0x6c, 0x65, 0x12, 0x4c, 0x0a, 0x07, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, - 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, - 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x48, 0x54, - 0x54, 0x50, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x52, 0x07, 0x46, 0x69, 0x6c, 0x74, 0x65, - 0x72, 0x73, 0x12, 0x4a, 0x0a, 0x07, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x18, 0x02, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, + 0x48, 0x54, 0x54, 0x50, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, + 0x2e, 0x41, 0x64, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x03, 0x41, 0x64, 0x64, 0x12, 0x16, + 0x0a, 0x06, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, + 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x12, 0x52, 0x0a, 0x03, 0x53, 0x65, 0x74, 0x18, 0x03, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x40, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x48, 0x54, 0x54, 0x50, - 0x4d, 0x61, 0x74, 0x63, 0x68, 0x52, 0x07, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x12, 0x4e, - 0x0a, 0x08, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x32, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, - 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x53, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x52, 0x08, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x22, 0xc4, - 0x02, 0x0a, 0x09, 0x48, 0x54, 0x54, 0x50, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x12, 0x50, 0x0a, 0x07, - 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x36, 0x2e, - 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, - 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, - 0x4d, 0x61, 0x74, 0x63, 0x68, 0x52, 0x07, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x12, 0x4e, - 0x0a, 0x06, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x36, - 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, - 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x4d, 0x61, 0x74, 0x63, 0x68, - 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x52, 0x06, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, 0x48, - 0x0a, 0x04, 0x50, 0x61, 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x68, - 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, - 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, - 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x50, 0x61, 0x74, 0x68, 0x4d, 0x61, 0x74, - 0x63, 0x68, 0x52, 0x04, 0x50, 0x61, 0x74, 0x68, 0x12, 0x4b, 0x0a, 0x05, 0x51, 0x75, 0x65, 0x72, - 0x79, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, + 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x2e, 0x53, 0x65, 0x74, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x03, 0x53, 0x65, 0x74, 0x1a, 0x36, 0x0a, 0x08, 0x41, 0x64, + 0x64, 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, 0x36, 0x0a, 0x08, 0x53, 0x65, 0x74, 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, 0x22, 0xe1, 0x01, 0x0a, 0x0b, 0x48, + 0x54, 0x54, 0x50, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, + 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x16, + 0x0a, 0x06, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, + 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x4c, 0x0a, 0x07, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, + 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, - 0x48, 0x54, 0x54, 0x50, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x52, 0x05, - 0x51, 0x75, 0x65, 0x72, 0x79, 0x22, 0x8d, 0x01, 0x0a, 0x0f, 0x48, 0x54, 0x54, 0x50, 0x48, 0x65, - 0x61, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x12, 0x50, 0x0a, 0x05, 0x4d, 0x61, 0x74, - 0x63, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x3a, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, - 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, - 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, - 0x2e, 0x48, 0x54, 0x54, 0x50, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x74, 0x63, 0x68, - 0x54, 0x79, 0x70, 0x65, 0x52, 0x05, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x12, 0x12, 0x0a, 0x04, 0x4e, - 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, - 0x14, 0x0a, 0x05, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x56, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x75, 0x0a, 0x0d, 0x48, 0x54, 0x54, 0x50, 0x50, 0x61, 0x74, - 0x68, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x12, 0x4e, 0x0a, 0x05, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x38, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, - 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, - 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x48, 0x54, - 0x54, 0x50, 0x50, 0x61, 0x74, 0x68, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x54, 0x79, 0x70, 0x65, 0x52, - 0x05, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x8b, 0x01, 0x0a, - 0x0e, 0x48, 0x54, 0x54, 0x50, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x12, - 0x4f, 0x0a, 0x05, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x39, - 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, - 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x51, 0x75, 0x65, 0x72, 0x79, - 0x4d, 0x61, 0x74, 0x63, 0x68, 0x54, 0x79, 0x70, 0x65, 0x52, 0x05, 0x4d, 0x61, 0x74, 0x63, 0x68, - 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x22, 0xb3, 0x01, 0x0a, 0x0b, 0x48, - 0x54, 0x54, 0x50, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x12, 0x51, 0x0a, 0x07, 0x48, 0x65, - 0x61, 0x64, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x68, 0x61, + 0x48, 0x54, 0x54, 0x50, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x52, 0x07, 0x46, 0x69, 0x6c, + 0x74, 0x65, 0x72, 0x73, 0x12, 0x58, 0x0a, 0x0e, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, + 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x68, + 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, + 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, + 0x45, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x52, 0x0e, + 0x45, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x22, 0xfc, + 0x02, 0x0a, 0x08, 0x54, 0x43, 0x50, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x12, 0x4d, 0x0a, 0x04, 0x4d, + 0x65, 0x74, 0x61, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x68, 0x61, 0x73, 0x68, + 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, + 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, + 0x79, 0x2e, 0x54, 0x43, 0x50, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x52, 0x0a, 0x07, 0x50, 0x61, + 0x72, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, - 0x74, 0x72, 0x79, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x46, 0x69, - 0x6c, 0x74, 0x65, 0x72, 0x52, 0x07, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x12, 0x51, 0x0a, - 0x0a, 0x55, 0x52, 0x4c, 0x52, 0x65, 0x77, 0x72, 0x69, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x31, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, - 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x55, 0x52, 0x4c, 0x52, 0x65, 0x77, - 0x72, 0x69, 0x74, 0x65, 0x52, 0x0a, 0x55, 0x52, 0x4c, 0x52, 0x65, 0x77, 0x72, 0x69, 0x74, 0x65, - 0x22, 0x20, 0x0a, 0x0a, 0x55, 0x52, 0x4c, 0x52, 0x65, 0x77, 0x72, 0x69, 0x74, 0x65, 0x12, 0x12, - 0x0a, 0x04, 0x50, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x50, 0x61, - 0x74, 0x68, 0x22, 0xc2, 0x02, 0x0a, 0x10, 0x48, 0x54, 0x54, 0x50, 0x48, 0x65, 0x61, 0x64, 0x65, - 0x72, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x52, 0x0a, 0x03, 0x41, 0x64, 0x64, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x40, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, - 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, - 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x48, 0x54, 0x54, - 0x50, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x2e, 0x41, 0x64, - 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x03, 0x41, 0x64, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x52, - 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x52, 0x65, 0x6d, - 0x6f, 0x76, 0x65, 0x12, 0x52, 0x0a, 0x03, 0x53, 0x65, 0x74, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x40, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x79, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x07, 0x50, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x4d, + 0x0a, 0x08, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x31, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x48, 0x65, 0x61, - 0x64, 0x65, 0x72, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x2e, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x52, 0x03, 0x53, 0x65, 0x74, 0x1a, 0x36, 0x0a, 0x08, 0x41, 0x64, 0x64, 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, - 0x36, 0x0a, 0x08, 0x53, 0x65, 0x74, 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, 0x22, 0xe1, 0x01, 0x0a, 0x0b, 0x48, 0x54, 0x54, 0x50, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x57, - 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x57, 0x65, 0x69, - 0x67, 0x68, 0x74, 0x12, 0x4c, 0x0a, 0x07, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, - 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, - 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x48, 0x54, 0x54, - 0x50, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x52, 0x07, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, - 0x73, 0x12, 0x58, 0x0a, 0x0e, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x4d, - 0x65, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x68, 0x61, 0x73, 0x68, - 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, - 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x74, - 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x52, 0x0e, 0x45, 0x6e, 0x74, - 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x22, 0xfc, 0x02, 0x0a, 0x08, - 0x54, 0x43, 0x50, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x12, 0x4d, 0x0a, 0x04, 0x4d, 0x65, 0x74, 0x61, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, - 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, - 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x54, - 0x43, 0x50, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x04, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x52, 0x0a, 0x07, 0x50, 0x61, 0x72, 0x65, 0x6e, - 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, - 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, - 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, - 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x52, 0x07, 0x50, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x4d, 0x0a, 0x08, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, + 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x54, 0x43, 0x50, 0x53, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x52, 0x08, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x45, 0x0a, + 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x54, 0x43, 0x50, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x52, 0x08, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x45, 0x0a, 0x06, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x68, 0x61, 0x73, - 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, - 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, - 0x72, 0x79, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x1a, 0x37, 0x0a, 0x09, 0x4d, 0x65, 0x74, 0x61, 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, 0x22, 0x7a, 0x0a, 0x0a, 0x54, 0x43, - 0x50, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x58, 0x0a, 0x0e, - 0x45, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, - 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, - 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, - 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x52, 0x0e, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, - 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x2a, 0xfd, 0x01, 0x0a, 0x04, 0x4b, 0x69, 0x6e, 0x64, 0x12, - 0x0f, 0x0a, 0x0b, 0x4b, 0x69, 0x6e, 0x64, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, - 0x12, 0x12, 0x0a, 0x0e, 0x4b, 0x69, 0x6e, 0x64, 0x4d, 0x65, 0x73, 0x68, 0x43, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x10, 0x01, 0x12, 0x17, 0x0a, 0x13, 0x4b, 0x69, 0x6e, 0x64, 0x53, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x10, 0x02, 0x12, 0x16, 0x0a, - 0x12, 0x4b, 0x69, 0x6e, 0x64, 0x49, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x47, 0x61, 0x74, 0x65, - 0x77, 0x61, 0x79, 0x10, 0x03, 0x12, 0x19, 0x0a, 0x15, 0x4b, 0x69, 0x6e, 0x64, 0x53, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x10, 0x04, - 0x12, 0x17, 0x0a, 0x13, 0x4b, 0x69, 0x6e, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x44, - 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x10, 0x05, 0x12, 0x19, 0x0a, 0x15, 0x4b, 0x69, 0x6e, - 0x64, 0x49, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, - 0x74, 0x65, 0x10, 0x06, 0x12, 0x12, 0x0a, 0x0e, 0x4b, 0x69, 0x6e, 0x64, 0x41, 0x50, 0x49, 0x47, - 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x10, 0x07, 0x12, 0x17, 0x0a, 0x13, 0x4b, 0x69, 0x6e, 0x64, - 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x41, 0x50, 0x49, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x10, - 0x08, 0x12, 0x11, 0x0a, 0x0d, 0x4b, 0x69, 0x6e, 0x64, 0x48, 0x54, 0x54, 0x50, 0x52, 0x6f, 0x75, - 0x74, 0x65, 0x10, 0x09, 0x12, 0x10, 0x0a, 0x0c, 0x4b, 0x69, 0x6e, 0x64, 0x54, 0x43, 0x50, 0x52, - 0x6f, 0x75, 0x74, 0x65, 0x10, 0x0a, 0x2a, 0x26, 0x0a, 0x0f, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x74, - 0x69, 0x6f, 0x6e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x08, 0x0a, 0x04, 0x44, 0x65, 0x6e, - 0x79, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x10, 0x01, 0x2a, 0x21, - 0x0a, 0x13, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x10, - 0x00, 0x2a, 0x50, 0x0a, 0x09, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x14, - 0x0a, 0x10, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x4d, 0x6f, 0x64, 0x65, 0x44, 0x65, 0x66, 0x61, 0x75, - 0x6c, 0x74, 0x10, 0x00, 0x12, 0x18, 0x0a, 0x14, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x4d, 0x6f, 0x64, - 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x10, 0x01, 0x12, 0x13, - 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x4d, 0x6f, 0x64, 0x65, 0x44, 0x69, 0x72, 0x65, 0x63, - 0x74, 0x10, 0x02, 0x2a, 0x7b, 0x0a, 0x0f, 0x4d, 0x65, 0x73, 0x68, 0x47, 0x61, 0x74, 0x65, 0x77, - 0x61, 0x79, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x1a, 0x0a, 0x16, 0x4d, 0x65, 0x73, 0x68, 0x47, 0x61, - 0x74, 0x65, 0x77, 0x61, 0x79, 0x4d, 0x6f, 0x64, 0x65, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, - 0x10, 0x00, 0x12, 0x17, 0x0a, 0x13, 0x4d, 0x65, 0x73, 0x68, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, - 0x79, 0x4d, 0x6f, 0x64, 0x65, 0x4e, 0x6f, 0x6e, 0x65, 0x10, 0x01, 0x12, 0x18, 0x0a, 0x14, 0x4d, - 0x65, 0x73, 0x68, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x4d, 0x6f, 0x64, 0x65, 0x4c, 0x6f, - 0x63, 0x61, 0x6c, 0x10, 0x02, 0x12, 0x19, 0x0a, 0x15, 0x4d, 0x65, 0x73, 0x68, 0x47, 0x61, 0x74, - 0x65, 0x77, 0x61, 0x79, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x10, 0x03, - 0x2a, 0x4f, 0x0a, 0x1a, 0x41, 0x50, 0x49, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x4c, 0x69, - 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x18, - 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, - 0x6f, 0x6c, 0x48, 0x54, 0x54, 0x50, 0x10, 0x00, 0x12, 0x17, 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, - 0x65, 0x6e, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x54, 0x43, 0x50, 0x10, - 0x01, 0x2a, 0x92, 0x02, 0x0a, 0x0f, 0x48, 0x54, 0x54, 0x50, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x4d, - 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, 0x16, 0x0a, 0x12, 0x48, 0x54, 0x54, 0x50, 0x4d, 0x61, 0x74, - 0x63, 0x68, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x41, 0x6c, 0x6c, 0x10, 0x00, 0x12, 0x1a, 0x0a, - 0x16, 0x48, 0x54, 0x54, 0x50, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, - 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x10, 0x01, 0x12, 0x19, 0x0a, 0x15, 0x48, 0x54, 0x54, - 0x50, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x44, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x10, 0x02, 0x12, 0x16, 0x0a, 0x12, 0x48, 0x54, 0x54, 0x50, 0x4d, 0x61, 0x74, 0x63, - 0x68, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x47, 0x65, 0x74, 0x10, 0x03, 0x12, 0x17, 0x0a, 0x13, - 0x48, 0x54, 0x54, 0x50, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x48, - 0x65, 0x61, 0x64, 0x10, 0x04, 0x12, 0x1a, 0x0a, 0x16, 0x48, 0x54, 0x54, 0x50, 0x4d, 0x61, 0x74, - 0x63, 0x68, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x10, - 0x05, 0x12, 0x18, 0x0a, 0x14, 0x48, 0x54, 0x54, 0x50, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x4d, 0x65, - 0x74, 0x68, 0x6f, 0x64, 0x50, 0x61, 0x74, 0x63, 0x68, 0x10, 0x06, 0x12, 0x17, 0x0a, 0x13, 0x48, - 0x54, 0x54, 0x50, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x50, 0x6f, - 0x73, 0x74, 0x10, 0x07, 0x12, 0x16, 0x0a, 0x12, 0x48, 0x54, 0x54, 0x50, 0x4d, 0x61, 0x74, 0x63, - 0x68, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x50, 0x75, 0x74, 0x10, 0x08, 0x12, 0x18, 0x0a, 0x14, - 0x48, 0x54, 0x54, 0x50, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x54, - 0x72, 0x61, 0x63, 0x65, 0x10, 0x09, 0x2a, 0xa7, 0x01, 0x0a, 0x13, 0x48, 0x54, 0x54, 0x50, 0x48, - 0x65, 0x61, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x54, 0x79, 0x70, 0x65, 0x12, 0x18, - 0x0a, 0x14, 0x48, 0x54, 0x54, 0x50, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x74, 0x63, - 0x68, 0x45, 0x78, 0x61, 0x63, 0x74, 0x10, 0x00, 0x12, 0x19, 0x0a, 0x15, 0x48, 0x54, 0x54, 0x50, - 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x50, 0x72, 0x65, 0x66, 0x69, - 0x78, 0x10, 0x01, 0x12, 0x1a, 0x0a, 0x16, 0x48, 0x54, 0x54, 0x50, 0x48, 0x65, 0x61, 0x64, 0x65, - 0x72, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x10, 0x02, 0x12, - 0x24, 0x0a, 0x20, 0x48, 0x54, 0x54, 0x50, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x74, - 0x63, 0x68, 0x52, 0x65, 0x67, 0x75, 0x6c, 0x61, 0x72, 0x45, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, - 0x69, 0x6f, 0x6e, 0x10, 0x03, 0x12, 0x19, 0x0a, 0x15, 0x48, 0x54, 0x54, 0x50, 0x48, 0x65, 0x61, - 0x64, 0x65, 0x72, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x53, 0x75, 0x66, 0x66, 0x69, 0x78, 0x10, 0x04, - 0x2a, 0x68, 0x0a, 0x11, 0x48, 0x54, 0x54, 0x50, 0x50, 0x61, 0x74, 0x68, 0x4d, 0x61, 0x74, 0x63, - 0x68, 0x54, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x12, 0x48, 0x54, 0x54, 0x50, 0x50, 0x61, 0x74, - 0x68, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x45, 0x78, 0x61, 0x63, 0x74, 0x10, 0x00, 0x12, 0x17, 0x0a, - 0x13, 0x48, 0x54, 0x54, 0x50, 0x50, 0x61, 0x74, 0x68, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x50, 0x72, - 0x65, 0x66, 0x69, 0x78, 0x10, 0x01, 0x12, 0x22, 0x0a, 0x1e, 0x48, 0x54, 0x54, 0x50, 0x50, 0x61, - 0x74, 0x68, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x52, 0x65, 0x67, 0x75, 0x6c, 0x61, 0x72, 0x45, 0x78, - 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x10, 0x03, 0x2a, 0x6d, 0x0a, 0x12, 0x48, 0x54, - 0x54, 0x50, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x54, 0x79, 0x70, 0x65, - 0x12, 0x17, 0x0a, 0x13, 0x48, 0x54, 0x54, 0x50, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4d, 0x61, 0x74, - 0x63, 0x68, 0x45, 0x78, 0x61, 0x63, 0x74, 0x10, 0x00, 0x12, 0x19, 0x0a, 0x15, 0x48, 0x54, 0x54, - 0x50, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x50, 0x72, 0x65, 0x73, 0x65, - 0x6e, 0x74, 0x10, 0x01, 0x12, 0x23, 0x0a, 0x1f, 0x48, 0x54, 0x54, 0x50, 0x51, 0x75, 0x65, 0x72, - 0x79, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x52, 0x65, 0x67, 0x75, 0x6c, 0x61, 0x72, 0x45, 0x78, 0x70, - 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x10, 0x03, 0x42, 0xae, 0x02, 0x0a, 0x29, 0x63, 0x6f, - 0x6d, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, - 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x42, 0x10, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x37, 0x67, 0x69, 0x74, - 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, - 0x70, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x70, - 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2f, 0x70, 0x62, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, - 0x6e, 0x74, 0x72, 0x79, 0xa2, 0x02, 0x04, 0x48, 0x43, 0x49, 0x43, 0xaa, 0x02, 0x25, 0x48, 0x61, - 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x49, - 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, - 0x74, 0x72, 0x79, 0xca, 0x02, 0x25, 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x5c, - 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x5c, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5c, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0xe2, 0x02, 0x31, 0x48, 0x61, - 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x5c, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x5c, 0x49, - 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5c, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, - 0x74, 0x72, 0x79, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, - 0x02, 0x28, 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x3a, 0x3a, 0x43, 0x6f, 0x6e, - 0x73, 0x75, 0x6c, 0x3a, 0x3a, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x3a, 0x3a, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x33, + 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x1a, 0x37, 0x0a, 0x09, 0x4d, 0x65, 0x74, 0x61, 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, 0x22, 0x7a, 0x0a, + 0x0a, 0x54, 0x43, 0x50, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x4e, + 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, + 0x58, 0x0a, 0x0e, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x4d, 0x65, 0x74, + 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, + 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, + 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x74, 0x65, 0x72, + 0x70, 0x72, 0x69, 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x52, 0x0e, 0x45, 0x6e, 0x74, 0x65, 0x72, + 0x70, 0x72, 0x69, 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x2a, 0xfd, 0x01, 0x0a, 0x04, 0x4b, 0x69, + 0x6e, 0x64, 0x12, 0x0f, 0x0a, 0x0b, 0x4b, 0x69, 0x6e, 0x64, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, + 0x6e, 0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e, 0x4b, 0x69, 0x6e, 0x64, 0x4d, 0x65, 0x73, 0x68, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x10, 0x01, 0x12, 0x17, 0x0a, 0x13, 0x4b, 0x69, 0x6e, 0x64, 0x53, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x10, 0x02, + 0x12, 0x16, 0x0a, 0x12, 0x4b, 0x69, 0x6e, 0x64, 0x49, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x47, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x10, 0x03, 0x12, 0x19, 0x0a, 0x15, 0x4b, 0x69, 0x6e, 0x64, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x10, 0x04, 0x12, 0x17, 0x0a, 0x13, 0x4b, 0x69, 0x6e, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x10, 0x05, 0x12, 0x19, 0x0a, 0x15, + 0x4b, 0x69, 0x6e, 0x64, 0x49, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, + 0x69, 0x63, 0x61, 0x74, 0x65, 0x10, 0x06, 0x12, 0x12, 0x0a, 0x0e, 0x4b, 0x69, 0x6e, 0x64, 0x41, + 0x50, 0x49, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x10, 0x07, 0x12, 0x17, 0x0a, 0x13, 0x4b, + 0x69, 0x6e, 0x64, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x41, 0x50, 0x49, 0x47, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x10, 0x08, 0x12, 0x11, 0x0a, 0x0d, 0x4b, 0x69, 0x6e, 0x64, 0x48, 0x54, 0x54, 0x50, + 0x52, 0x6f, 0x75, 0x74, 0x65, 0x10, 0x09, 0x12, 0x10, 0x0a, 0x0c, 0x4b, 0x69, 0x6e, 0x64, 0x54, + 0x43, 0x50, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x10, 0x0a, 0x2a, 0x26, 0x0a, 0x0f, 0x49, 0x6e, 0x74, + 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x08, 0x0a, 0x04, + 0x44, 0x65, 0x6e, 0x79, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x10, + 0x01, 0x2a, 0x21, 0x0a, 0x13, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x73, + 0x75, 0x6c, 0x10, 0x00, 0x2a, 0x50, 0x0a, 0x09, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x4d, 0x6f, 0x64, + 0x65, 0x12, 0x14, 0x0a, 0x10, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x4d, 0x6f, 0x64, 0x65, 0x44, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x10, 0x00, 0x12, 0x18, 0x0a, 0x14, 0x50, 0x72, 0x6f, 0x78, 0x79, + 0x4d, 0x6f, 0x64, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x10, + 0x01, 0x12, 0x13, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x4d, 0x6f, 0x64, 0x65, 0x44, 0x69, + 0x72, 0x65, 0x63, 0x74, 0x10, 0x02, 0x2a, 0x7b, 0x0a, 0x0f, 0x4d, 0x65, 0x73, 0x68, 0x47, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x1a, 0x0a, 0x16, 0x4d, 0x65, 0x73, + 0x68, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x4d, 0x6f, 0x64, 0x65, 0x44, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x10, 0x00, 0x12, 0x17, 0x0a, 0x13, 0x4d, 0x65, 0x73, 0x68, 0x47, 0x61, 0x74, + 0x65, 0x77, 0x61, 0x79, 0x4d, 0x6f, 0x64, 0x65, 0x4e, 0x6f, 0x6e, 0x65, 0x10, 0x01, 0x12, 0x18, + 0x0a, 0x14, 0x4d, 0x65, 0x73, 0x68, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x4d, 0x6f, 0x64, + 0x65, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x10, 0x02, 0x12, 0x19, 0x0a, 0x15, 0x4d, 0x65, 0x73, 0x68, + 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x6d, 0x6f, 0x74, + 0x65, 0x10, 0x03, 0x2a, 0x4f, 0x0a, 0x1a, 0x41, 0x50, 0x49, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, + 0x79, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, + 0x6c, 0x12, 0x18, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x50, 0x72, 0x6f, + 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x48, 0x54, 0x54, 0x50, 0x10, 0x00, 0x12, 0x17, 0x0a, 0x13, 0x4c, + 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x54, + 0x43, 0x50, 0x10, 0x01, 0x2a, 0x92, 0x02, 0x0a, 0x0f, 0x48, 0x54, 0x54, 0x50, 0x4d, 0x61, 0x74, + 0x63, 0x68, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, 0x16, 0x0a, 0x12, 0x48, 0x54, 0x54, 0x50, + 0x4d, 0x61, 0x74, 0x63, 0x68, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x41, 0x6c, 0x6c, 0x10, 0x00, + 0x12, 0x1a, 0x0a, 0x16, 0x48, 0x54, 0x54, 0x50, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x4d, 0x65, 0x74, + 0x68, 0x6f, 0x64, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x10, 0x01, 0x12, 0x19, 0x0a, 0x15, + 0x48, 0x54, 0x54, 0x50, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x44, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x10, 0x02, 0x12, 0x16, 0x0a, 0x12, 0x48, 0x54, 0x54, 0x50, 0x4d, + 0x61, 0x74, 0x63, 0x68, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x47, 0x65, 0x74, 0x10, 0x03, 0x12, + 0x17, 0x0a, 0x13, 0x48, 0x54, 0x54, 0x50, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x4d, 0x65, 0x74, 0x68, + 0x6f, 0x64, 0x48, 0x65, 0x61, 0x64, 0x10, 0x04, 0x12, 0x1a, 0x0a, 0x16, 0x48, 0x54, 0x54, 0x50, + 0x4d, 0x61, 0x74, 0x63, 0x68, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x10, 0x05, 0x12, 0x18, 0x0a, 0x14, 0x48, 0x54, 0x54, 0x50, 0x4d, 0x61, 0x74, 0x63, + 0x68, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x50, 0x61, 0x74, 0x63, 0x68, 0x10, 0x06, 0x12, 0x17, + 0x0a, 0x13, 0x48, 0x54, 0x54, 0x50, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x4d, 0x65, 0x74, 0x68, 0x6f, + 0x64, 0x50, 0x6f, 0x73, 0x74, 0x10, 0x07, 0x12, 0x16, 0x0a, 0x12, 0x48, 0x54, 0x54, 0x50, 0x4d, + 0x61, 0x74, 0x63, 0x68, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x50, 0x75, 0x74, 0x10, 0x08, 0x12, + 0x18, 0x0a, 0x14, 0x48, 0x54, 0x54, 0x50, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x4d, 0x65, 0x74, 0x68, + 0x6f, 0x64, 0x54, 0x72, 0x61, 0x63, 0x65, 0x10, 0x09, 0x2a, 0xa7, 0x01, 0x0a, 0x13, 0x48, 0x54, + 0x54, 0x50, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x54, 0x79, 0x70, + 0x65, 0x12, 0x18, 0x0a, 0x14, 0x48, 0x54, 0x54, 0x50, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x4d, + 0x61, 0x74, 0x63, 0x68, 0x45, 0x78, 0x61, 0x63, 0x74, 0x10, 0x00, 0x12, 0x19, 0x0a, 0x15, 0x48, + 0x54, 0x54, 0x50, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x50, 0x72, + 0x65, 0x66, 0x69, 0x78, 0x10, 0x01, 0x12, 0x1a, 0x0a, 0x16, 0x48, 0x54, 0x54, 0x50, 0x48, 0x65, + 0x61, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, + 0x10, 0x02, 0x12, 0x24, 0x0a, 0x20, 0x48, 0x54, 0x54, 0x50, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, + 0x4d, 0x61, 0x74, 0x63, 0x68, 0x52, 0x65, 0x67, 0x75, 0x6c, 0x61, 0x72, 0x45, 0x78, 0x70, 0x72, + 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x10, 0x03, 0x12, 0x19, 0x0a, 0x15, 0x48, 0x54, 0x54, 0x50, + 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x53, 0x75, 0x66, 0x66, 0x69, + 0x78, 0x10, 0x04, 0x2a, 0x68, 0x0a, 0x11, 0x48, 0x54, 0x54, 0x50, 0x50, 0x61, 0x74, 0x68, 0x4d, + 0x61, 0x74, 0x63, 0x68, 0x54, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x12, 0x48, 0x54, 0x54, 0x50, + 0x50, 0x61, 0x74, 0x68, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x45, 0x78, 0x61, 0x63, 0x74, 0x10, 0x00, + 0x12, 0x17, 0x0a, 0x13, 0x48, 0x54, 0x54, 0x50, 0x50, 0x61, 0x74, 0x68, 0x4d, 0x61, 0x74, 0x63, + 0x68, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x10, 0x01, 0x12, 0x22, 0x0a, 0x1e, 0x48, 0x54, 0x54, + 0x50, 0x50, 0x61, 0x74, 0x68, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x52, 0x65, 0x67, 0x75, 0x6c, 0x61, + 0x72, 0x45, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x10, 0x03, 0x2a, 0x6d, 0x0a, + 0x12, 0x48, 0x54, 0x54, 0x50, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x54, + 0x79, 0x70, 0x65, 0x12, 0x17, 0x0a, 0x13, 0x48, 0x54, 0x54, 0x50, 0x51, 0x75, 0x65, 0x72, 0x79, + 0x4d, 0x61, 0x74, 0x63, 0x68, 0x45, 0x78, 0x61, 0x63, 0x74, 0x10, 0x00, 0x12, 0x19, 0x0a, 0x15, + 0x48, 0x54, 0x54, 0x50, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x50, 0x72, + 0x65, 0x73, 0x65, 0x6e, 0x74, 0x10, 0x01, 0x12, 0x23, 0x0a, 0x1f, 0x48, 0x54, 0x54, 0x50, 0x51, + 0x75, 0x65, 0x72, 0x79, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x52, 0x65, 0x67, 0x75, 0x6c, 0x61, 0x72, + 0x45, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x10, 0x03, 0x42, 0xae, 0x02, 0x0a, + 0x29, 0x63, 0x6f, 0x6d, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, + 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x42, 0x10, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x37, + 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x68, 0x61, 0x73, 0x68, 0x69, + 0x63, 0x6f, 0x72, 0x70, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2f, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x2f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2f, 0x70, 0x62, 0x63, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0xa2, 0x02, 0x04, 0x48, 0x43, 0x49, 0x43, 0xaa, 0x02, + 0x25, 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x43, 0x6f, 0x6e, 0x73, 0x75, + 0x6c, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0xca, 0x02, 0x25, 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, + 0x72, 0x70, 0x5c, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x5c, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, + 0x61, 0x6c, 0x5c, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0xe2, 0x02, + 0x31, 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x5c, 0x43, 0x6f, 0x6e, 0x73, 0x75, + 0x6c, 0x5c, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5c, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, + 0x74, 0x61, 0xea, 0x02, 0x28, 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x3a, 0x3a, + 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x3a, 0x3a, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, + 0x3a, 0x3a, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x62, 0x06, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -6588,105 +6601,106 @@ var file_private_pbconfigentry_config_entry_proto_depIdxs = []int32{ 91, // 23: hashicorp.consul.internal.configentry.ServiceResolver.ConnectTimeout:type_name -> google.protobuf.Duration 22, // 24: hashicorp.consul.internal.configentry.ServiceResolver.LoadBalancer:type_name -> hashicorp.consul.internal.configentry.LoadBalancer 74, // 25: hashicorp.consul.internal.configentry.ServiceResolver.Meta:type_name -> hashicorp.consul.internal.configentry.ServiceResolver.MetaEntry - 21, // 26: hashicorp.consul.internal.configentry.ServiceResolverFailover.Targets:type_name -> hashicorp.consul.internal.configentry.ServiceResolverFailoverTarget - 23, // 27: hashicorp.consul.internal.configentry.LoadBalancer.RingHashConfig:type_name -> hashicorp.consul.internal.configentry.RingHashConfig - 24, // 28: hashicorp.consul.internal.configentry.LoadBalancer.LeastRequestConfig:type_name -> hashicorp.consul.internal.configentry.LeastRequestConfig - 25, // 29: hashicorp.consul.internal.configentry.LoadBalancer.HashPolicies:type_name -> hashicorp.consul.internal.configentry.HashPolicy - 26, // 30: hashicorp.consul.internal.configentry.HashPolicy.CookieConfig:type_name -> hashicorp.consul.internal.configentry.CookieConfig - 91, // 31: hashicorp.consul.internal.configentry.CookieConfig.TTL:type_name -> google.protobuf.Duration - 29, // 32: hashicorp.consul.internal.configentry.IngressGateway.TLS:type_name -> hashicorp.consul.internal.configentry.GatewayTLSConfig - 31, // 33: hashicorp.consul.internal.configentry.IngressGateway.Listeners:type_name -> hashicorp.consul.internal.configentry.IngressListener - 75, // 34: hashicorp.consul.internal.configentry.IngressGateway.Meta:type_name -> hashicorp.consul.internal.configentry.IngressGateway.MetaEntry - 28, // 35: hashicorp.consul.internal.configentry.IngressGateway.Defaults:type_name -> hashicorp.consul.internal.configentry.IngressServiceConfig - 48, // 36: hashicorp.consul.internal.configentry.IngressServiceConfig.PassiveHealthCheck:type_name -> hashicorp.consul.internal.configentry.PassiveHealthCheck - 30, // 37: hashicorp.consul.internal.configentry.GatewayTLSConfig.SDS:type_name -> hashicorp.consul.internal.configentry.GatewayTLSSDSConfig - 32, // 38: hashicorp.consul.internal.configentry.IngressListener.Services:type_name -> hashicorp.consul.internal.configentry.IngressService - 29, // 39: hashicorp.consul.internal.configentry.IngressListener.TLS:type_name -> hashicorp.consul.internal.configentry.GatewayTLSConfig - 33, // 40: hashicorp.consul.internal.configentry.IngressService.TLS:type_name -> hashicorp.consul.internal.configentry.GatewayServiceTLSConfig - 34, // 41: hashicorp.consul.internal.configentry.IngressService.RequestHeaders:type_name -> hashicorp.consul.internal.configentry.HTTPHeaderModifiers - 34, // 42: hashicorp.consul.internal.configentry.IngressService.ResponseHeaders:type_name -> hashicorp.consul.internal.configentry.HTTPHeaderModifiers - 76, // 43: hashicorp.consul.internal.configentry.IngressService.Meta:type_name -> hashicorp.consul.internal.configentry.IngressService.MetaEntry - 89, // 44: hashicorp.consul.internal.configentry.IngressService.EnterpriseMeta:type_name -> hashicorp.consul.internal.common.EnterpriseMeta - 48, // 45: hashicorp.consul.internal.configentry.IngressService.PassiveHealthCheck:type_name -> hashicorp.consul.internal.configentry.PassiveHealthCheck - 30, // 46: hashicorp.consul.internal.configentry.GatewayServiceTLSConfig.SDS:type_name -> hashicorp.consul.internal.configentry.GatewayTLSSDSConfig - 77, // 47: hashicorp.consul.internal.configentry.HTTPHeaderModifiers.Add:type_name -> hashicorp.consul.internal.configentry.HTTPHeaderModifiers.AddEntry - 78, // 48: hashicorp.consul.internal.configentry.HTTPHeaderModifiers.Set:type_name -> hashicorp.consul.internal.configentry.HTTPHeaderModifiers.SetEntry - 36, // 49: hashicorp.consul.internal.configentry.ServiceIntentions.Sources:type_name -> hashicorp.consul.internal.configentry.SourceIntention - 79, // 50: hashicorp.consul.internal.configentry.ServiceIntentions.Meta:type_name -> hashicorp.consul.internal.configentry.ServiceIntentions.MetaEntry - 1, // 51: hashicorp.consul.internal.configentry.SourceIntention.Action:type_name -> hashicorp.consul.internal.configentry.IntentionAction - 37, // 52: hashicorp.consul.internal.configentry.SourceIntention.Permissions:type_name -> hashicorp.consul.internal.configentry.IntentionPermission - 2, // 53: hashicorp.consul.internal.configentry.SourceIntention.Type:type_name -> hashicorp.consul.internal.configentry.IntentionSourceType - 80, // 54: hashicorp.consul.internal.configentry.SourceIntention.LegacyMeta:type_name -> hashicorp.consul.internal.configentry.SourceIntention.LegacyMetaEntry - 92, // 55: hashicorp.consul.internal.configentry.SourceIntention.LegacyCreateTime:type_name -> google.protobuf.Timestamp - 92, // 56: hashicorp.consul.internal.configentry.SourceIntention.LegacyUpdateTime:type_name -> google.protobuf.Timestamp - 89, // 57: hashicorp.consul.internal.configentry.SourceIntention.EnterpriseMeta:type_name -> hashicorp.consul.internal.common.EnterpriseMeta - 1, // 58: hashicorp.consul.internal.configentry.IntentionPermission.Action:type_name -> hashicorp.consul.internal.configentry.IntentionAction - 38, // 59: hashicorp.consul.internal.configentry.IntentionPermission.HTTP:type_name -> hashicorp.consul.internal.configentry.IntentionHTTPPermission - 39, // 60: hashicorp.consul.internal.configentry.IntentionHTTPPermission.Header:type_name -> hashicorp.consul.internal.configentry.IntentionHTTPHeaderPermission - 3, // 61: hashicorp.consul.internal.configentry.ServiceDefaults.Mode:type_name -> hashicorp.consul.internal.configentry.ProxyMode - 41, // 62: hashicorp.consul.internal.configentry.ServiceDefaults.TransparentProxy:type_name -> hashicorp.consul.internal.configentry.TransparentProxyConfig - 42, // 63: hashicorp.consul.internal.configentry.ServiceDefaults.MeshGateway:type_name -> hashicorp.consul.internal.configentry.MeshGatewayConfig - 43, // 64: hashicorp.consul.internal.configentry.ServiceDefaults.Expose:type_name -> hashicorp.consul.internal.configentry.ExposeConfig - 45, // 65: hashicorp.consul.internal.configentry.ServiceDefaults.UpstreamConfig:type_name -> hashicorp.consul.internal.configentry.UpstreamConfiguration - 49, // 66: hashicorp.consul.internal.configentry.ServiceDefaults.Destination:type_name -> hashicorp.consul.internal.configentry.DestinationConfig - 81, // 67: hashicorp.consul.internal.configentry.ServiceDefaults.Meta:type_name -> hashicorp.consul.internal.configentry.ServiceDefaults.MetaEntry - 93, // 68: hashicorp.consul.internal.configentry.ServiceDefaults.EnvoyExtensions:type_name -> hashicorp.consul.internal.common.EnvoyExtension - 4, // 69: hashicorp.consul.internal.configentry.MeshGatewayConfig.Mode:type_name -> hashicorp.consul.internal.configentry.MeshGatewayMode - 44, // 70: hashicorp.consul.internal.configentry.ExposeConfig.Paths:type_name -> hashicorp.consul.internal.configentry.ExposePath - 46, // 71: hashicorp.consul.internal.configentry.UpstreamConfiguration.Overrides:type_name -> hashicorp.consul.internal.configentry.UpstreamConfig - 46, // 72: hashicorp.consul.internal.configentry.UpstreamConfiguration.Defaults:type_name -> hashicorp.consul.internal.configentry.UpstreamConfig - 89, // 73: hashicorp.consul.internal.configentry.UpstreamConfig.EnterpriseMeta:type_name -> hashicorp.consul.internal.common.EnterpriseMeta - 47, // 74: hashicorp.consul.internal.configentry.UpstreamConfig.Limits:type_name -> hashicorp.consul.internal.configentry.UpstreamLimits - 48, // 75: hashicorp.consul.internal.configentry.UpstreamConfig.PassiveHealthCheck:type_name -> hashicorp.consul.internal.configentry.PassiveHealthCheck - 42, // 76: hashicorp.consul.internal.configentry.UpstreamConfig.MeshGateway:type_name -> hashicorp.consul.internal.configentry.MeshGatewayConfig - 91, // 77: hashicorp.consul.internal.configentry.PassiveHealthCheck.Interval:type_name -> google.protobuf.Duration - 82, // 78: hashicorp.consul.internal.configentry.APIGateway.Meta:type_name -> hashicorp.consul.internal.configentry.APIGateway.MetaEntry - 53, // 79: hashicorp.consul.internal.configentry.APIGateway.Listeners:type_name -> hashicorp.consul.internal.configentry.APIGatewayListener - 51, // 80: hashicorp.consul.internal.configentry.APIGateway.Status:type_name -> hashicorp.consul.internal.configentry.Status - 52, // 81: hashicorp.consul.internal.configentry.Status.Conditions:type_name -> hashicorp.consul.internal.configentry.Condition - 55, // 82: hashicorp.consul.internal.configentry.Condition.Resource:type_name -> hashicorp.consul.internal.configentry.ResourceReference - 92, // 83: hashicorp.consul.internal.configentry.Condition.LastTransitionTime:type_name -> google.protobuf.Timestamp - 5, // 84: hashicorp.consul.internal.configentry.APIGatewayListener.Protocol:type_name -> hashicorp.consul.internal.configentry.APIGatewayListenerProtocol - 54, // 85: hashicorp.consul.internal.configentry.APIGatewayListener.TLS:type_name -> hashicorp.consul.internal.configentry.APIGatewayTLSConfiguration - 55, // 86: hashicorp.consul.internal.configentry.APIGatewayTLSConfiguration.Certificates:type_name -> hashicorp.consul.internal.configentry.ResourceReference - 89, // 87: hashicorp.consul.internal.configentry.ResourceReference.EnterpriseMeta:type_name -> hashicorp.consul.internal.common.EnterpriseMeta - 83, // 88: hashicorp.consul.internal.configentry.BoundAPIGateway.Meta:type_name -> hashicorp.consul.internal.configentry.BoundAPIGateway.MetaEntry - 57, // 89: hashicorp.consul.internal.configentry.BoundAPIGateway.Listeners:type_name -> hashicorp.consul.internal.configentry.BoundAPIGatewayListener - 55, // 90: hashicorp.consul.internal.configentry.BoundAPIGatewayListener.Certificates:type_name -> hashicorp.consul.internal.configentry.ResourceReference - 55, // 91: hashicorp.consul.internal.configentry.BoundAPIGatewayListener.Routes:type_name -> hashicorp.consul.internal.configentry.ResourceReference - 84, // 92: hashicorp.consul.internal.configentry.InlineCertificate.Meta:type_name -> hashicorp.consul.internal.configentry.InlineCertificate.MetaEntry - 85, // 93: hashicorp.consul.internal.configentry.HTTPRoute.Meta:type_name -> hashicorp.consul.internal.configentry.HTTPRoute.MetaEntry - 55, // 94: hashicorp.consul.internal.configentry.HTTPRoute.Parents:type_name -> hashicorp.consul.internal.configentry.ResourceReference - 60, // 95: hashicorp.consul.internal.configentry.HTTPRoute.Rules:type_name -> hashicorp.consul.internal.configentry.HTTPRouteRule - 51, // 96: hashicorp.consul.internal.configentry.HTTPRoute.Status:type_name -> hashicorp.consul.internal.configentry.Status - 65, // 97: hashicorp.consul.internal.configentry.HTTPRouteRule.Filters:type_name -> hashicorp.consul.internal.configentry.HTTPFilters - 61, // 98: hashicorp.consul.internal.configentry.HTTPRouteRule.Matches:type_name -> hashicorp.consul.internal.configentry.HTTPMatch - 68, // 99: hashicorp.consul.internal.configentry.HTTPRouteRule.Services:type_name -> hashicorp.consul.internal.configentry.HTTPService - 62, // 100: hashicorp.consul.internal.configentry.HTTPMatch.Headers:type_name -> hashicorp.consul.internal.configentry.HTTPHeaderMatch - 6, // 101: hashicorp.consul.internal.configentry.HTTPMatch.Method:type_name -> hashicorp.consul.internal.configentry.HTTPMatchMethod - 63, // 102: hashicorp.consul.internal.configentry.HTTPMatch.Path:type_name -> hashicorp.consul.internal.configentry.HTTPPathMatch - 64, // 103: hashicorp.consul.internal.configentry.HTTPMatch.Query:type_name -> hashicorp.consul.internal.configentry.HTTPQueryMatch - 7, // 104: hashicorp.consul.internal.configentry.HTTPHeaderMatch.Match:type_name -> hashicorp.consul.internal.configentry.HTTPHeaderMatchType - 8, // 105: hashicorp.consul.internal.configentry.HTTPPathMatch.Match:type_name -> hashicorp.consul.internal.configentry.HTTPPathMatchType - 9, // 106: hashicorp.consul.internal.configentry.HTTPQueryMatch.Match:type_name -> hashicorp.consul.internal.configentry.HTTPQueryMatchType - 67, // 107: hashicorp.consul.internal.configentry.HTTPFilters.Headers:type_name -> hashicorp.consul.internal.configentry.HTTPHeaderFilter - 66, // 108: hashicorp.consul.internal.configentry.HTTPFilters.URLRewrite:type_name -> hashicorp.consul.internal.configentry.URLRewrite - 86, // 109: hashicorp.consul.internal.configentry.HTTPHeaderFilter.Add:type_name -> hashicorp.consul.internal.configentry.HTTPHeaderFilter.AddEntry - 87, // 110: hashicorp.consul.internal.configentry.HTTPHeaderFilter.Set:type_name -> hashicorp.consul.internal.configentry.HTTPHeaderFilter.SetEntry - 65, // 111: hashicorp.consul.internal.configentry.HTTPService.Filters:type_name -> hashicorp.consul.internal.configentry.HTTPFilters - 89, // 112: hashicorp.consul.internal.configentry.HTTPService.EnterpriseMeta:type_name -> hashicorp.consul.internal.common.EnterpriseMeta - 88, // 113: hashicorp.consul.internal.configentry.TCPRoute.Meta:type_name -> hashicorp.consul.internal.configentry.TCPRoute.MetaEntry - 55, // 114: hashicorp.consul.internal.configentry.TCPRoute.Parents:type_name -> hashicorp.consul.internal.configentry.ResourceReference - 70, // 115: hashicorp.consul.internal.configentry.TCPRoute.Services:type_name -> hashicorp.consul.internal.configentry.TCPService - 51, // 116: hashicorp.consul.internal.configentry.TCPRoute.Status:type_name -> hashicorp.consul.internal.configentry.Status - 89, // 117: hashicorp.consul.internal.configentry.TCPService.EnterpriseMeta:type_name -> hashicorp.consul.internal.common.EnterpriseMeta - 18, // 118: hashicorp.consul.internal.configentry.ServiceResolver.SubsetsEntry.value:type_name -> hashicorp.consul.internal.configentry.ServiceResolverSubset - 20, // 119: hashicorp.consul.internal.configentry.ServiceResolver.FailoverEntry.value:type_name -> hashicorp.consul.internal.configentry.ServiceResolverFailover - 120, // [120:120] is the sub-list for method output_type - 120, // [120:120] is the sub-list for method input_type - 120, // [120:120] is the sub-list for extension type_name - 120, // [120:120] is the sub-list for extension extendee - 0, // [0:120] is the sub-list for field type_name + 91, // 26: hashicorp.consul.internal.configentry.ServiceResolver.RequestTimeout:type_name -> google.protobuf.Duration + 21, // 27: hashicorp.consul.internal.configentry.ServiceResolverFailover.Targets:type_name -> hashicorp.consul.internal.configentry.ServiceResolverFailoverTarget + 23, // 28: hashicorp.consul.internal.configentry.LoadBalancer.RingHashConfig:type_name -> hashicorp.consul.internal.configentry.RingHashConfig + 24, // 29: hashicorp.consul.internal.configentry.LoadBalancer.LeastRequestConfig:type_name -> hashicorp.consul.internal.configentry.LeastRequestConfig + 25, // 30: hashicorp.consul.internal.configentry.LoadBalancer.HashPolicies:type_name -> hashicorp.consul.internal.configentry.HashPolicy + 26, // 31: hashicorp.consul.internal.configentry.HashPolicy.CookieConfig:type_name -> hashicorp.consul.internal.configentry.CookieConfig + 91, // 32: hashicorp.consul.internal.configentry.CookieConfig.TTL:type_name -> google.protobuf.Duration + 29, // 33: hashicorp.consul.internal.configentry.IngressGateway.TLS:type_name -> hashicorp.consul.internal.configentry.GatewayTLSConfig + 31, // 34: hashicorp.consul.internal.configentry.IngressGateway.Listeners:type_name -> hashicorp.consul.internal.configentry.IngressListener + 75, // 35: hashicorp.consul.internal.configentry.IngressGateway.Meta:type_name -> hashicorp.consul.internal.configentry.IngressGateway.MetaEntry + 28, // 36: hashicorp.consul.internal.configentry.IngressGateway.Defaults:type_name -> hashicorp.consul.internal.configentry.IngressServiceConfig + 48, // 37: hashicorp.consul.internal.configentry.IngressServiceConfig.PassiveHealthCheck:type_name -> hashicorp.consul.internal.configentry.PassiveHealthCheck + 30, // 38: hashicorp.consul.internal.configentry.GatewayTLSConfig.SDS:type_name -> hashicorp.consul.internal.configentry.GatewayTLSSDSConfig + 32, // 39: hashicorp.consul.internal.configentry.IngressListener.Services:type_name -> hashicorp.consul.internal.configentry.IngressService + 29, // 40: hashicorp.consul.internal.configentry.IngressListener.TLS:type_name -> hashicorp.consul.internal.configentry.GatewayTLSConfig + 33, // 41: hashicorp.consul.internal.configentry.IngressService.TLS:type_name -> hashicorp.consul.internal.configentry.GatewayServiceTLSConfig + 34, // 42: hashicorp.consul.internal.configentry.IngressService.RequestHeaders:type_name -> hashicorp.consul.internal.configentry.HTTPHeaderModifiers + 34, // 43: hashicorp.consul.internal.configentry.IngressService.ResponseHeaders:type_name -> hashicorp.consul.internal.configentry.HTTPHeaderModifiers + 76, // 44: hashicorp.consul.internal.configentry.IngressService.Meta:type_name -> hashicorp.consul.internal.configentry.IngressService.MetaEntry + 89, // 45: hashicorp.consul.internal.configentry.IngressService.EnterpriseMeta:type_name -> hashicorp.consul.internal.common.EnterpriseMeta + 48, // 46: hashicorp.consul.internal.configentry.IngressService.PassiveHealthCheck:type_name -> hashicorp.consul.internal.configentry.PassiveHealthCheck + 30, // 47: hashicorp.consul.internal.configentry.GatewayServiceTLSConfig.SDS:type_name -> hashicorp.consul.internal.configentry.GatewayTLSSDSConfig + 77, // 48: hashicorp.consul.internal.configentry.HTTPHeaderModifiers.Add:type_name -> hashicorp.consul.internal.configentry.HTTPHeaderModifiers.AddEntry + 78, // 49: hashicorp.consul.internal.configentry.HTTPHeaderModifiers.Set:type_name -> hashicorp.consul.internal.configentry.HTTPHeaderModifiers.SetEntry + 36, // 50: hashicorp.consul.internal.configentry.ServiceIntentions.Sources:type_name -> hashicorp.consul.internal.configentry.SourceIntention + 79, // 51: hashicorp.consul.internal.configentry.ServiceIntentions.Meta:type_name -> hashicorp.consul.internal.configentry.ServiceIntentions.MetaEntry + 1, // 52: hashicorp.consul.internal.configentry.SourceIntention.Action:type_name -> hashicorp.consul.internal.configentry.IntentionAction + 37, // 53: hashicorp.consul.internal.configentry.SourceIntention.Permissions:type_name -> hashicorp.consul.internal.configentry.IntentionPermission + 2, // 54: hashicorp.consul.internal.configentry.SourceIntention.Type:type_name -> hashicorp.consul.internal.configentry.IntentionSourceType + 80, // 55: hashicorp.consul.internal.configentry.SourceIntention.LegacyMeta:type_name -> hashicorp.consul.internal.configentry.SourceIntention.LegacyMetaEntry + 92, // 56: hashicorp.consul.internal.configentry.SourceIntention.LegacyCreateTime:type_name -> google.protobuf.Timestamp + 92, // 57: hashicorp.consul.internal.configentry.SourceIntention.LegacyUpdateTime:type_name -> google.protobuf.Timestamp + 89, // 58: hashicorp.consul.internal.configentry.SourceIntention.EnterpriseMeta:type_name -> hashicorp.consul.internal.common.EnterpriseMeta + 1, // 59: hashicorp.consul.internal.configentry.IntentionPermission.Action:type_name -> hashicorp.consul.internal.configentry.IntentionAction + 38, // 60: hashicorp.consul.internal.configentry.IntentionPermission.HTTP:type_name -> hashicorp.consul.internal.configentry.IntentionHTTPPermission + 39, // 61: hashicorp.consul.internal.configentry.IntentionHTTPPermission.Header:type_name -> hashicorp.consul.internal.configentry.IntentionHTTPHeaderPermission + 3, // 62: hashicorp.consul.internal.configentry.ServiceDefaults.Mode:type_name -> hashicorp.consul.internal.configentry.ProxyMode + 41, // 63: hashicorp.consul.internal.configentry.ServiceDefaults.TransparentProxy:type_name -> hashicorp.consul.internal.configentry.TransparentProxyConfig + 42, // 64: hashicorp.consul.internal.configentry.ServiceDefaults.MeshGateway:type_name -> hashicorp.consul.internal.configentry.MeshGatewayConfig + 43, // 65: hashicorp.consul.internal.configentry.ServiceDefaults.Expose:type_name -> hashicorp.consul.internal.configentry.ExposeConfig + 45, // 66: hashicorp.consul.internal.configentry.ServiceDefaults.UpstreamConfig:type_name -> hashicorp.consul.internal.configentry.UpstreamConfiguration + 49, // 67: hashicorp.consul.internal.configentry.ServiceDefaults.Destination:type_name -> hashicorp.consul.internal.configentry.DestinationConfig + 81, // 68: hashicorp.consul.internal.configentry.ServiceDefaults.Meta:type_name -> hashicorp.consul.internal.configentry.ServiceDefaults.MetaEntry + 93, // 69: hashicorp.consul.internal.configentry.ServiceDefaults.EnvoyExtensions:type_name -> hashicorp.consul.internal.common.EnvoyExtension + 4, // 70: hashicorp.consul.internal.configentry.MeshGatewayConfig.Mode:type_name -> hashicorp.consul.internal.configentry.MeshGatewayMode + 44, // 71: hashicorp.consul.internal.configentry.ExposeConfig.Paths:type_name -> hashicorp.consul.internal.configentry.ExposePath + 46, // 72: hashicorp.consul.internal.configentry.UpstreamConfiguration.Overrides:type_name -> hashicorp.consul.internal.configentry.UpstreamConfig + 46, // 73: hashicorp.consul.internal.configentry.UpstreamConfiguration.Defaults:type_name -> hashicorp.consul.internal.configentry.UpstreamConfig + 89, // 74: hashicorp.consul.internal.configentry.UpstreamConfig.EnterpriseMeta:type_name -> hashicorp.consul.internal.common.EnterpriseMeta + 47, // 75: hashicorp.consul.internal.configentry.UpstreamConfig.Limits:type_name -> hashicorp.consul.internal.configentry.UpstreamLimits + 48, // 76: hashicorp.consul.internal.configentry.UpstreamConfig.PassiveHealthCheck:type_name -> hashicorp.consul.internal.configentry.PassiveHealthCheck + 42, // 77: hashicorp.consul.internal.configentry.UpstreamConfig.MeshGateway:type_name -> hashicorp.consul.internal.configentry.MeshGatewayConfig + 91, // 78: hashicorp.consul.internal.configentry.PassiveHealthCheck.Interval:type_name -> google.protobuf.Duration + 82, // 79: hashicorp.consul.internal.configentry.APIGateway.Meta:type_name -> hashicorp.consul.internal.configentry.APIGateway.MetaEntry + 53, // 80: hashicorp.consul.internal.configentry.APIGateway.Listeners:type_name -> hashicorp.consul.internal.configentry.APIGatewayListener + 51, // 81: hashicorp.consul.internal.configentry.APIGateway.Status:type_name -> hashicorp.consul.internal.configentry.Status + 52, // 82: hashicorp.consul.internal.configentry.Status.Conditions:type_name -> hashicorp.consul.internal.configentry.Condition + 55, // 83: hashicorp.consul.internal.configentry.Condition.Resource:type_name -> hashicorp.consul.internal.configentry.ResourceReference + 92, // 84: hashicorp.consul.internal.configentry.Condition.LastTransitionTime:type_name -> google.protobuf.Timestamp + 5, // 85: hashicorp.consul.internal.configentry.APIGatewayListener.Protocol:type_name -> hashicorp.consul.internal.configentry.APIGatewayListenerProtocol + 54, // 86: hashicorp.consul.internal.configentry.APIGatewayListener.TLS:type_name -> hashicorp.consul.internal.configentry.APIGatewayTLSConfiguration + 55, // 87: hashicorp.consul.internal.configentry.APIGatewayTLSConfiguration.Certificates:type_name -> hashicorp.consul.internal.configentry.ResourceReference + 89, // 88: hashicorp.consul.internal.configentry.ResourceReference.EnterpriseMeta:type_name -> hashicorp.consul.internal.common.EnterpriseMeta + 83, // 89: hashicorp.consul.internal.configentry.BoundAPIGateway.Meta:type_name -> hashicorp.consul.internal.configentry.BoundAPIGateway.MetaEntry + 57, // 90: hashicorp.consul.internal.configentry.BoundAPIGateway.Listeners:type_name -> hashicorp.consul.internal.configentry.BoundAPIGatewayListener + 55, // 91: hashicorp.consul.internal.configentry.BoundAPIGatewayListener.Certificates:type_name -> hashicorp.consul.internal.configentry.ResourceReference + 55, // 92: hashicorp.consul.internal.configentry.BoundAPIGatewayListener.Routes:type_name -> hashicorp.consul.internal.configentry.ResourceReference + 84, // 93: hashicorp.consul.internal.configentry.InlineCertificate.Meta:type_name -> hashicorp.consul.internal.configentry.InlineCertificate.MetaEntry + 85, // 94: hashicorp.consul.internal.configentry.HTTPRoute.Meta:type_name -> hashicorp.consul.internal.configentry.HTTPRoute.MetaEntry + 55, // 95: hashicorp.consul.internal.configentry.HTTPRoute.Parents:type_name -> hashicorp.consul.internal.configentry.ResourceReference + 60, // 96: hashicorp.consul.internal.configentry.HTTPRoute.Rules:type_name -> hashicorp.consul.internal.configentry.HTTPRouteRule + 51, // 97: hashicorp.consul.internal.configentry.HTTPRoute.Status:type_name -> hashicorp.consul.internal.configentry.Status + 65, // 98: hashicorp.consul.internal.configentry.HTTPRouteRule.Filters:type_name -> hashicorp.consul.internal.configentry.HTTPFilters + 61, // 99: hashicorp.consul.internal.configentry.HTTPRouteRule.Matches:type_name -> hashicorp.consul.internal.configentry.HTTPMatch + 68, // 100: hashicorp.consul.internal.configentry.HTTPRouteRule.Services:type_name -> hashicorp.consul.internal.configentry.HTTPService + 62, // 101: hashicorp.consul.internal.configentry.HTTPMatch.Headers:type_name -> hashicorp.consul.internal.configentry.HTTPHeaderMatch + 6, // 102: hashicorp.consul.internal.configentry.HTTPMatch.Method:type_name -> hashicorp.consul.internal.configentry.HTTPMatchMethod + 63, // 103: hashicorp.consul.internal.configentry.HTTPMatch.Path:type_name -> hashicorp.consul.internal.configentry.HTTPPathMatch + 64, // 104: hashicorp.consul.internal.configentry.HTTPMatch.Query:type_name -> hashicorp.consul.internal.configentry.HTTPQueryMatch + 7, // 105: hashicorp.consul.internal.configentry.HTTPHeaderMatch.Match:type_name -> hashicorp.consul.internal.configentry.HTTPHeaderMatchType + 8, // 106: hashicorp.consul.internal.configentry.HTTPPathMatch.Match:type_name -> hashicorp.consul.internal.configentry.HTTPPathMatchType + 9, // 107: hashicorp.consul.internal.configentry.HTTPQueryMatch.Match:type_name -> hashicorp.consul.internal.configentry.HTTPQueryMatchType + 67, // 108: hashicorp.consul.internal.configentry.HTTPFilters.Headers:type_name -> hashicorp.consul.internal.configentry.HTTPHeaderFilter + 66, // 109: hashicorp.consul.internal.configentry.HTTPFilters.URLRewrite:type_name -> hashicorp.consul.internal.configentry.URLRewrite + 86, // 110: hashicorp.consul.internal.configentry.HTTPHeaderFilter.Add:type_name -> hashicorp.consul.internal.configentry.HTTPHeaderFilter.AddEntry + 87, // 111: hashicorp.consul.internal.configentry.HTTPHeaderFilter.Set:type_name -> hashicorp.consul.internal.configentry.HTTPHeaderFilter.SetEntry + 65, // 112: hashicorp.consul.internal.configentry.HTTPService.Filters:type_name -> hashicorp.consul.internal.configentry.HTTPFilters + 89, // 113: hashicorp.consul.internal.configentry.HTTPService.EnterpriseMeta:type_name -> hashicorp.consul.internal.common.EnterpriseMeta + 88, // 114: hashicorp.consul.internal.configentry.TCPRoute.Meta:type_name -> hashicorp.consul.internal.configentry.TCPRoute.MetaEntry + 55, // 115: hashicorp.consul.internal.configentry.TCPRoute.Parents:type_name -> hashicorp.consul.internal.configentry.ResourceReference + 70, // 116: hashicorp.consul.internal.configentry.TCPRoute.Services:type_name -> hashicorp.consul.internal.configentry.TCPService + 51, // 117: hashicorp.consul.internal.configentry.TCPRoute.Status:type_name -> hashicorp.consul.internal.configentry.Status + 89, // 118: hashicorp.consul.internal.configentry.TCPService.EnterpriseMeta:type_name -> hashicorp.consul.internal.common.EnterpriseMeta + 18, // 119: hashicorp.consul.internal.configentry.ServiceResolver.SubsetsEntry.value:type_name -> hashicorp.consul.internal.configentry.ServiceResolverSubset + 20, // 120: hashicorp.consul.internal.configentry.ServiceResolver.FailoverEntry.value:type_name -> hashicorp.consul.internal.configentry.ServiceResolverFailover + 121, // [121:121] is the sub-list for method output_type + 121, // [121:121] is the sub-list for method input_type + 121, // [121:121] is the sub-list for extension type_name + 121, // [121:121] is the sub-list for extension extendee + 0, // [0:121] is the sub-list for field type_name } func init() { file_private_pbconfigentry_config_entry_proto_init() } diff --git a/proto/private/pbconfigentry/config_entry.proto b/proto/private/pbconfigentry/config_entry.proto index a43b2d8c979..6b7767b2b4c 100644 --- a/proto/private/pbconfigentry/config_entry.proto +++ b/proto/private/pbconfigentry/config_entry.proto @@ -121,6 +121,8 @@ message ServiceResolver { google.protobuf.Duration ConnectTimeout = 5; LoadBalancer LoadBalancer = 6; map Meta = 7; + // mog: func-to=structs.DurationFromProto func-from=structs.DurationToProto + google.protobuf.Duration RequestTimeout = 8; } // mog annotation: diff --git a/website/content/docs/connect/config-entries/service-resolver.mdx b/website/content/docs/connect/config-entries/service-resolver.mdx index 9730beb132e..89147a24af3 100644 --- a/website/content/docs/connect/config-entries/service-resolver.mdx +++ b/website/content/docs/connect/config-entries/service-resolver.mdx @@ -440,6 +440,12 @@ spec: description: 'The timeout for establishing new network connections to this service. The default unit of time is `ns`.', }, + { + name: 'RequestTimeout', + type: 'duration: 0s', + description: + 'The timeout for receiving an HTTP response from this service before the connection is terminated. If unspecified or 0, the default of 15s is used. The default unit of time is `ns`.', + }, { name: 'DefaultSubset', type: 'string: ""', From 5deffbd95bca0bd57187aceacffbd0a7cc0f972b Mon Sep 17 00:00:00 2001 From: Andrew Stucki Date: Fri, 3 Mar 2023 09:56:57 -0500 Subject: [PATCH 102/262] Fix issue where terminating gateway service resolvers weren't properly cleaned up (#16498) * Fix issue where terminating gateway service resolvers weren't properly cleaned up * Add integration test for cleaning up resolvers * Add changelog entry * Use state test and drop integration test --- .changelog/16498.txt | 3 +++ agent/proxycfg/state_test.go | 22 +++++++++++++++++++++ agent/proxycfg/terminating_gateway.go | 7 ++++++- test/integration/connect/envoy/helpers.bash | 18 +++++++++++++++-- 4 files changed, 47 insertions(+), 3 deletions(-) create mode 100644 .changelog/16498.txt diff --git a/.changelog/16498.txt b/.changelog/16498.txt new file mode 100644 index 00000000000..cdb045d67c9 --- /dev/null +++ b/.changelog/16498.txt @@ -0,0 +1,3 @@ +```release-note:bug +proxycfg: fix a bug where terminating gateways were not cleaning up deleted service resolvers for their referenced services +``` diff --git a/agent/proxycfg/state_test.go b/agent/proxycfg/state_test.go index b3cf47a42f0..da4de7960fd 100644 --- a/agent/proxycfg/state_test.go +++ b/agent/proxycfg/state_test.go @@ -2093,6 +2093,28 @@ func TestState_WatchesAndUpdates(t *testing.T) { require.Equal(t, dbResolver.Entry, snap.TerminatingGateway.ServiceResolvers[db]) }, }, + { + requiredWatches: map[string]verifyWatchRequest{ + "service-resolver:" + db.String(): genVerifyResolverWatch("db", "dc1", structs.ServiceResolver), + }, + events: []UpdateEvent{ + { + CorrelationID: "service-resolver:" + db.String(), + Result: &structs.ConfigEntryResponse{ + Entry: nil, + }, + Err: nil, + }, + }, + verifySnapshot: func(t testing.TB, snap *ConfigSnapshot) { + require.True(t, snap.Valid(), "gateway with service list is valid") + // Finally ensure we cleaned up the resolver + require.Equal(t, []structs.ServiceName{db}, snap.TerminatingGateway.ValidServices()) + + require.False(t, snap.TerminatingGateway.ServiceResolversSet[db]) + require.Nil(t, snap.TerminatingGateway.ServiceResolvers[db]) + }, + }, { events: []UpdateEvent{ { diff --git a/agent/proxycfg/terminating_gateway.go b/agent/proxycfg/terminating_gateway.go index cb371ae2bf0..483c79f91dd 100644 --- a/agent/proxycfg/terminating_gateway.go +++ b/agent/proxycfg/terminating_gateway.go @@ -354,8 +354,13 @@ func (s *handlerTerminatingGateway) handleUpdate(ctx context.Context, u UpdateEv // There should only ever be one entry for a service resolver within a namespace if resolver, ok := resp.Entry.(*structs.ServiceResolverConfigEntry); ok { snap.TerminatingGateway.ServiceResolvers[sn] = resolver + snap.TerminatingGateway.ServiceResolversSet[sn] = true + } else { + // we likely have a deleted service resolver, and our cast is a nil + // cast, so clear this out + delete(snap.TerminatingGateway.ServiceResolvers, sn) + snap.TerminatingGateway.ServiceResolversSet[sn] = false } - snap.TerminatingGateway.ServiceResolversSet[sn] = true case strings.HasPrefix(u.CorrelationID, serviceIntentionsIDPrefix): resp, ok := u.Result.(structs.Intentions) diff --git a/test/integration/connect/envoy/helpers.bash b/test/integration/connect/envoy/helpers.bash index c7746d9260d..65bbe3b0070 100755 --- a/test/integration/connect/envoy/helpers.bash +++ b/test/integration/connect/envoy/helpers.bash @@ -383,15 +383,27 @@ function assert_upstream_has_endpoints_in_status_once { GOT_COUNT=$(get_upstream_endpoint_in_status_count $HOSTPORT $CLUSTER_NAME $HEALTH_STATUS) + echo "GOT: $GOT_COUNT" [ "$GOT_COUNT" -eq $EXPECT_COUNT ] } +function assert_upstream_missing_once { + local HOSTPORT=$1 + local CLUSTER_NAME=$2 + + run get_upstream_endpoint $HOSTPORT $CLUSTER_NAME + [ "$status" -eq 0 ] + echo "$output" + [ "" == "$output" ] +} + function assert_upstream_missing { local HOSTPORT=$1 local CLUSTER_NAME=$2 - run retry_default get_upstream_endpoint $HOSTPORT $CLUSTER_NAME + run retry_long assert_upstream_missing_once $HOSTPORT $CLUSTER_NAME echo "OUTPUT: $output $status" - [ "" == "$output" ] + + [ "$status" -eq 0 ] } function assert_upstream_has_endpoints_in_status { @@ -400,6 +412,8 @@ function assert_upstream_has_endpoints_in_status { local HEALTH_STATUS=$3 local EXPECT_COUNT=$4 run retry_long assert_upstream_has_endpoints_in_status_once $HOSTPORT $CLUSTER_NAME $HEALTH_STATUS $EXPECT_COUNT + echo "$output" + [ "$status" -eq 0 ] } From 5f81662066e00dd065f7725664023e52b30690ff Mon Sep 17 00:00:00 2001 From: Eric Haberkorn Date: Fri, 3 Mar 2023 11:12:38 -0500 Subject: [PATCH 103/262] Add support for failover policies (#16505) --- agent/consul/discoverychain/compile.go | 9 + agent/structs/config_entry.go | 17 +- agent/structs/config_entry_discoverychain.go | 41 +- .../config_entry_discoverychain_oss.go | 14 + .../config_entry_discoverychain_oss_test.go | 11 + agent/structs/config_entry_test.go | 19 + agent/structs/discovery_chain.go | 3 +- agent/structs/structs.deepcopy.go | 8 + api/config_entry_discoverychain.go | 5 + api/discovery_chain.go | 1 + .../private/pbconfigentry/config_entry.gen.go | 22 + .../pbconfigentry/config_entry.pb.binary.go | 10 + .../private/pbconfigentry/config_entry.pb.go | 2553 +++++++++-------- .../private/pbconfigentry/config_entry.proto | 10 + 14 files changed, 1477 insertions(+), 1246 deletions(-) diff --git a/agent/consul/discoverychain/compile.go b/agent/consul/discoverychain/compile.go index ead109d419e..0158fc90161 100644 --- a/agent/consul/discoverychain/compile.go +++ b/agent/consul/discoverychain/compile.go @@ -1110,6 +1110,15 @@ RESOLVE_AGAIN: df := &structs.DiscoveryFailover{} node.Resolver.Failover = df + if failover.Policy == nil || failover.Policy.Mode == "" { + proxyDefault := c.entries.GetProxyDefaults(targetID.PartitionOrDefault()) + if proxyDefault != nil { + df.Policy = proxyDefault.FailoverPolicy + } + } else { + df.Policy = failover.Policy + } + // Take care of doing any redirects or configuration loading // related to targets by cheating a bit and recursing into // ourselves. diff --git a/agent/structs/config_entry.go b/agent/structs/config_entry.go index b3bedaa38b8..7d8bf1d62fe 100644 --- a/agent/structs/config_entry.go +++ b/agent/structs/config_entry.go @@ -362,12 +362,13 @@ type ProxyConfigEntry struct { Kind string Name string Config map[string]interface{} - Mode ProxyMode `json:",omitempty"` - TransparentProxy TransparentProxyConfig `json:",omitempty" alias:"transparent_proxy"` - MeshGateway MeshGatewayConfig `json:",omitempty" alias:"mesh_gateway"` - Expose ExposeConfig `json:",omitempty"` - AccessLogs AccessLogsConfig `json:",omitempty" alias:"access_logs"` - EnvoyExtensions EnvoyExtensions `json:",omitempty" alias:"envoy_extensions"` + Mode ProxyMode `json:",omitempty"` + TransparentProxy TransparentProxyConfig `json:",omitempty" alias:"transparent_proxy"` + MeshGateway MeshGatewayConfig `json:",omitempty" alias:"mesh_gateway"` + Expose ExposeConfig `json:",omitempty"` + AccessLogs AccessLogsConfig `json:",omitempty" alias:"access_logs"` + EnvoyExtensions EnvoyExtensions `json:",omitempty" alias:"envoy_extensions"` + FailoverPolicy *ServiceResolverFailoverPolicy `json:",omitempty" alias:"failover_policy"` Meta map[string]string `json:",omitempty"` acl.EnterpriseMeta `hcl:",squash" mapstructure:",squash"` @@ -434,6 +435,10 @@ func (e *ProxyConfigEntry) Validate() error { return err } + if !e.FailoverPolicy.isValid() { + return fmt.Errorf("Failover policy must be one of '', 'default', or 'order-by-locality'") + } + return e.validateEnterpriseMeta() } diff --git a/agent/structs/config_entry_discoverychain.go b/agent/structs/config_entry_discoverychain.go index 9f80acf682b..7b655475c7e 100644 --- a/agent/structs/config_entry_discoverychain.go +++ b/agent/structs/config_entry_discoverychain.go @@ -1079,6 +1079,14 @@ func (e *ServiceResolverConfigEntry) Validate() error { return fmt.Errorf(errorPrefix + "one of Service, ServiceSubset, Namespace, Targets, or Datacenters is required") } + if err := f.Policy.ValidateEnterprise(); err != nil { + return fmt.Errorf("Bad Failover[%q]: %s", subset, err) + } + + if !f.Policy.isValid() { + return fmt.Errorf("Bad Failover[%q]: Policy must be one of '', 'default', or 'order-by-locality'", subset) + } + if f.ServiceSubset != "" { if f.Service == "" || f.Service == e.Name { if !isSubset(f.ServiceSubset) { @@ -1368,13 +1376,22 @@ type ServiceResolverFailover struct { // // This is a DESTINATION during failover. Targets []ServiceResolverFailoverTarget `json:",omitempty"` + + // Policy specifies the exact mechanism used for failover. + Policy *ServiceResolverFailoverPolicy `json:",omitempty"` } -func (t *ServiceResolverFailover) ToDiscoveryTargetOpts() DiscoveryTargetOpts { +type ServiceResolverFailoverPolicy struct { + // Mode specifies the type of failover that will be performed. Valid values are + // "default", "" (equivalent to "default") and "order-by-locality". + Mode string `json:",omitempty"` +} + +func (f *ServiceResolverFailover) ToDiscoveryTargetOpts() DiscoveryTargetOpts { return DiscoveryTargetOpts{ - Service: t.Service, - ServiceSubset: t.ServiceSubset, - Namespace: t.Namespace, + Service: f.Service, + ServiceSubset: f.ServiceSubset, + Namespace: f.Namespace, } } @@ -1382,6 +1399,22 @@ func (f *ServiceResolverFailover) isEmpty() bool { return f.Service == "" && f.ServiceSubset == "" && f.Namespace == "" && len(f.Datacenters) == 0 && len(f.Targets) == 0 } +func (fp *ServiceResolverFailoverPolicy) isValid() bool { + if fp == nil { + return true + } + + switch fp.Mode { + case "": + case "default": + case "order-by-locality": + default: + return false + } + + return true +} + type ServiceResolverFailoverTarget struct { // Service specifies the name of the service to try during failover. Service string `json:",omitempty"` diff --git a/agent/structs/config_entry_discoverychain_oss.go b/agent/structs/config_entry_discoverychain_oss.go index ef00e39922c..3e07c218a72 100644 --- a/agent/structs/config_entry_discoverychain_oss.go +++ b/agent/structs/config_entry_discoverychain_oss.go @@ -88,3 +88,17 @@ func (req *DiscoveryChainRequest) GetEnterpriseMeta() *acl.EnterpriseMeta { func (req *DiscoveryChainRequest) WithEnterpriseMeta(_ *acl.EnterpriseMeta) { // do nothing } + +// ValidateEnterprise validates that enterprise fields are only set +// with enterprise binaries. +func (f *ServiceResolverFailoverPolicy) ValidateEnterprise() error { + if f == nil { + return nil + } + + if f.Mode != "" { + return fmt.Errorf("Setting failover policies requires Consul Enterprise") + } + + return nil +} diff --git a/agent/structs/config_entry_discoverychain_oss_test.go b/agent/structs/config_entry_discoverychain_oss_test.go index 9f962c8bd41..654c2ba703a 100644 --- a/agent/structs/config_entry_discoverychain_oss_test.go +++ b/agent/structs/config_entry_discoverychain_oss_test.go @@ -72,6 +72,17 @@ func TestServiceResolverConfigEntry_OSS(t *testing.T) { }, validateErr: `Bad Failover["*"]: Setting Namespace requires Consul Enterprise`, }, + { + name: "setting failover Namespace on OSS", + entry: &ServiceResolverConfigEntry{ + Kind: ServiceResolver, + Name: "test", + Failover: map[string]ServiceResolverFailover{ + "*": {Service: "s1", Policy: &ServiceResolverFailoverPolicy{Mode: "something"}}, + }, + }, + validateErr: `Bad Failover["*"]: Setting failover policies requires Consul Enterprise`, + }, { name: "setting redirect Namespace on OSS", entry: &ServiceResolverConfigEntry{ diff --git a/agent/structs/config_entry_test.go b/agent/structs/config_entry_test.go index 4cff6e9e568..b470abcaef9 100644 --- a/agent/structs/config_entry_test.go +++ b/agent/structs/config_entry_test.go @@ -3195,6 +3195,25 @@ func TestProxyConfigEntry(t *testing.T) { EnterpriseMeta: *acl.DefaultEnterpriseMeta(), }, }, + "proxy config has invalid failover policy": { + entry: &ProxyConfigEntry{ + Name: "global", + FailoverPolicy: &ServiceResolverFailoverPolicy{Mode: "bad"}, + }, + validateErr: `Failover policy must be one of '', 'default', or 'order-by-locality'`, + }, + "proxy config with valid failover policy": { + entry: &ProxyConfigEntry{ + Name: "global", + FailoverPolicy: &ServiceResolverFailoverPolicy{Mode: "order-by-locality"}, + }, + expected: &ProxyConfigEntry{ + Name: ProxyConfigGlobal, + Kind: ProxyDefaults, + FailoverPolicy: &ServiceResolverFailoverPolicy{Mode: "order-by-locality"}, + EnterpriseMeta: *acl.DefaultEnterpriseMeta(), + }, + }, "proxy config has invalid access log type": { entry: &ProxyConfigEntry{ Name: "global", diff --git a/agent/structs/discovery_chain.go b/agent/structs/discovery_chain.go index dc737e7479d..67abde33b17 100644 --- a/agent/structs/discovery_chain.go +++ b/agent/structs/discovery_chain.go @@ -178,7 +178,8 @@ type DiscoverySplit struct { // compiled form of ServiceResolverFailover type DiscoveryFailover struct { - Targets []string `json:",omitempty"` + Targets []string `json:",omitempty"` + Policy *ServiceResolverFailoverPolicy `json:",omitempty"` } // DiscoveryTarget represents all of the inputs necessary to use a resolver diff --git a/agent/structs/structs.deepcopy.go b/agent/structs/structs.deepcopy.go index 43f94674c5f..3adcdaa8a7e 100644 --- a/agent/structs/structs.deepcopy.go +++ b/agent/structs/structs.deepcopy.go @@ -177,6 +177,10 @@ func (o *DiscoveryFailover) DeepCopy() *DiscoveryFailover { cp.Targets = make([]string, len(o.Targets)) copy(cp.Targets, o.Targets) } + if o.Policy != nil { + cp.Policy = new(ServiceResolverFailoverPolicy) + *cp.Policy = *o.Policy + } return &cp } @@ -894,6 +898,10 @@ func (o *ServiceResolverFailover) DeepCopy() *ServiceResolverFailover { cp.Targets = make([]ServiceResolverFailoverTarget, len(o.Targets)) copy(cp.Targets, o.Targets) } + if o.Policy != nil { + cp.Policy = new(ServiceResolverFailoverPolicy) + *cp.Policy = *o.Policy + } return &cp } diff --git a/api/config_entry_discoverychain.go b/api/config_entry_discoverychain.go index acc05e13e1f..a1980ff5ce4 100644 --- a/api/config_entry_discoverychain.go +++ b/api/config_entry_discoverychain.go @@ -243,6 +243,7 @@ type ServiceResolverFailover struct { Namespace string `json:",omitempty"` Datacenters []string `json:",omitempty"` Targets []ServiceResolverFailoverTarget `json:",omitempty"` + Policy *ServiceResolverFailoverPolicy `json:",omitempty"` } type ServiceResolverFailoverTarget struct { @@ -254,6 +255,10 @@ type ServiceResolverFailoverTarget struct { Peer string `json:",omitempty"` } +type ServiceResolverFailoverPolicy struct { + Mode string `json:",omitempty"` +} + // LoadBalancer determines the load balancing policy and configuration for services // issuing requests to this upstream service. type LoadBalancer struct { diff --git a/api/discovery_chain.go b/api/discovery_chain.go index 4217603cf9f..c7853d70e62 100644 --- a/api/discovery_chain.go +++ b/api/discovery_chain.go @@ -221,6 +221,7 @@ func (r *DiscoveryResolver) UnmarshalJSON(data []byte) error { // compiled form of ServiceResolverFailover type DiscoveryFailover struct { Targets []string + Policy ServiceResolverFailoverPolicy `json:",omitempty"` } // DiscoveryTarget represents all of the inputs necessary to use a resolver diff --git a/proto/private/pbconfigentry/config_entry.gen.go b/proto/private/pbconfigentry/config_entry.gen.go index 00846d3be7c..7beeb9df418 100644 --- a/proto/private/pbconfigentry/config_entry.gen.go +++ b/proto/private/pbconfigentry/config_entry.gen.go @@ -1410,6 +1410,11 @@ func ServiceResolverFailoverToStructs(s *ServiceResolverFailover, t *structs.Ser } } } + if s.Policy != nil { + var x structs.ServiceResolverFailoverPolicy + ServiceResolverFailoverPolicyToStructs(s.Policy, &x) + t.Policy = &x + } } func ServiceResolverFailoverFromStructs(t *structs.ServiceResolverFailover, s *ServiceResolverFailover) { if s == nil { @@ -1429,6 +1434,23 @@ func ServiceResolverFailoverFromStructs(t *structs.ServiceResolverFailover, s *S } } } + if t.Policy != nil { + var x ServiceResolverFailoverPolicy + ServiceResolverFailoverPolicyFromStructs(t.Policy, &x) + s.Policy = &x + } +} +func ServiceResolverFailoverPolicyToStructs(s *ServiceResolverFailoverPolicy, t *structs.ServiceResolverFailoverPolicy) { + if s == nil { + return + } + t.Mode = s.Mode +} +func ServiceResolverFailoverPolicyFromStructs(t *structs.ServiceResolverFailoverPolicy, s *ServiceResolverFailoverPolicy) { + if s == nil { + return + } + s.Mode = t.Mode } func ServiceResolverFailoverTargetToStructs(s *ServiceResolverFailoverTarget, t *structs.ServiceResolverFailoverTarget) { if s == nil { diff --git a/proto/private/pbconfigentry/config_entry.pb.binary.go b/proto/private/pbconfigentry/config_entry.pb.binary.go index 1916e6df0a8..96d75916337 100644 --- a/proto/private/pbconfigentry/config_entry.pb.binary.go +++ b/proto/private/pbconfigentry/config_entry.pb.binary.go @@ -117,6 +117,16 @@ func (msg *ServiceResolverFailover) UnmarshalBinary(b []byte) error { return proto.Unmarshal(b, msg) } +// MarshalBinary implements encoding.BinaryMarshaler +func (msg *ServiceResolverFailoverPolicy) MarshalBinary() ([]byte, error) { + return proto.Marshal(msg) +} + +// UnmarshalBinary implements encoding.BinaryUnmarshaler +func (msg *ServiceResolverFailoverPolicy) UnmarshalBinary(b []byte) error { + return proto.Unmarshal(b, msg) +} + // MarshalBinary implements encoding.BinaryMarshaler func (msg *ServiceResolverFailoverTarget) MarshalBinary() ([]byte, error) { return proto.Marshal(msg) diff --git a/proto/private/pbconfigentry/config_entry.pb.go b/proto/private/pbconfigentry/config_entry.pb.go index 3299cc6e301..06057080465 100644 --- a/proto/private/pbconfigentry/config_entry.pb.go +++ b/proto/private/pbconfigentry/config_entry.pb.go @@ -1430,6 +1430,7 @@ type ServiceResolverFailover struct { Namespace string `protobuf:"bytes,3,opt,name=Namespace,proto3" json:"Namespace,omitempty"` Datacenters []string `protobuf:"bytes,4,rep,name=Datacenters,proto3" json:"Datacenters,omitempty"` Targets []*ServiceResolverFailoverTarget `protobuf:"bytes,5,rep,name=Targets,proto3" json:"Targets,omitempty"` + Policy *ServiceResolverFailoverPolicy `protobuf:"bytes,6,opt,name=Policy,proto3" json:"Policy,omitempty"` } func (x *ServiceResolverFailover) Reset() { @@ -1499,6 +1500,65 @@ func (x *ServiceResolverFailover) GetTargets() []*ServiceResolverFailoverTarget return nil } +func (x *ServiceResolverFailover) GetPolicy() *ServiceResolverFailoverPolicy { + if x != nil { + return x.Policy + } + return nil +} + +// mog annotation: +// +// target=github.com/hashicorp/consul/agent/structs.ServiceResolverFailoverPolicy +// output=config_entry.gen.go +// name=Structs +type ServiceResolverFailoverPolicy struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Mode string `protobuf:"bytes,1,opt,name=Mode,proto3" json:"Mode,omitempty"` +} + +func (x *ServiceResolverFailoverPolicy) Reset() { + *x = ServiceResolverFailoverPolicy{} + if protoimpl.UnsafeEnabled { + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[11] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ServiceResolverFailoverPolicy) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ServiceResolverFailoverPolicy) ProtoMessage() {} + +func (x *ServiceResolverFailoverPolicy) ProtoReflect() protoreflect.Message { + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[11] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ServiceResolverFailoverPolicy.ProtoReflect.Descriptor instead. +func (*ServiceResolverFailoverPolicy) Descriptor() ([]byte, []int) { + return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{11} +} + +func (x *ServiceResolverFailoverPolicy) GetMode() string { + if x != nil { + return x.Mode + } + return "" +} + // mog annotation: // // target=github.com/hashicorp/consul/agent/structs.ServiceResolverFailoverTarget @@ -1520,7 +1580,7 @@ type ServiceResolverFailoverTarget struct { func (x *ServiceResolverFailoverTarget) Reset() { *x = ServiceResolverFailoverTarget{} if protoimpl.UnsafeEnabled { - mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[11] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1533,7 +1593,7 @@ func (x *ServiceResolverFailoverTarget) String() string { func (*ServiceResolverFailoverTarget) ProtoMessage() {} func (x *ServiceResolverFailoverTarget) ProtoReflect() protoreflect.Message { - mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[11] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[12] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1546,7 +1606,7 @@ func (x *ServiceResolverFailoverTarget) ProtoReflect() protoreflect.Message { // Deprecated: Use ServiceResolverFailoverTarget.ProtoReflect.Descriptor instead. func (*ServiceResolverFailoverTarget) Descriptor() ([]byte, []int) { - return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{11} + return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{12} } func (x *ServiceResolverFailoverTarget) GetService() string { @@ -1610,7 +1670,7 @@ type LoadBalancer struct { func (x *LoadBalancer) Reset() { *x = LoadBalancer{} if protoimpl.UnsafeEnabled { - mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[12] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1623,7 +1683,7 @@ func (x *LoadBalancer) String() string { func (*LoadBalancer) ProtoMessage() {} func (x *LoadBalancer) ProtoReflect() protoreflect.Message { - mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[12] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[13] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1636,7 +1696,7 @@ func (x *LoadBalancer) ProtoReflect() protoreflect.Message { // Deprecated: Use LoadBalancer.ProtoReflect.Descriptor instead. func (*LoadBalancer) Descriptor() ([]byte, []int) { - return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{12} + return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{13} } func (x *LoadBalancer) GetPolicy() string { @@ -1684,7 +1744,7 @@ type RingHashConfig struct { func (x *RingHashConfig) Reset() { *x = RingHashConfig{} if protoimpl.UnsafeEnabled { - mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[13] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1697,7 +1757,7 @@ func (x *RingHashConfig) String() string { func (*RingHashConfig) ProtoMessage() {} func (x *RingHashConfig) ProtoReflect() protoreflect.Message { - mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[13] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[14] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1710,7 +1770,7 @@ func (x *RingHashConfig) ProtoReflect() protoreflect.Message { // Deprecated: Use RingHashConfig.ProtoReflect.Descriptor instead. func (*RingHashConfig) Descriptor() ([]byte, []int) { - return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{13} + return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{14} } func (x *RingHashConfig) GetMinimumRingSize() uint64 { @@ -1743,7 +1803,7 @@ type LeastRequestConfig struct { func (x *LeastRequestConfig) Reset() { *x = LeastRequestConfig{} if protoimpl.UnsafeEnabled { - mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[14] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[15] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1756,7 +1816,7 @@ func (x *LeastRequestConfig) String() string { func (*LeastRequestConfig) ProtoMessage() {} func (x *LeastRequestConfig) ProtoReflect() protoreflect.Message { - mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[14] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[15] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1769,7 +1829,7 @@ func (x *LeastRequestConfig) ProtoReflect() protoreflect.Message { // Deprecated: Use LeastRequestConfig.ProtoReflect.Descriptor instead. func (*LeastRequestConfig) Descriptor() ([]byte, []int) { - return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{14} + return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{15} } func (x *LeastRequestConfig) GetChoiceCount() uint32 { @@ -1799,7 +1859,7 @@ type HashPolicy struct { func (x *HashPolicy) Reset() { *x = HashPolicy{} if protoimpl.UnsafeEnabled { - mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[15] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[16] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1812,7 +1872,7 @@ func (x *HashPolicy) String() string { func (*HashPolicy) ProtoMessage() {} func (x *HashPolicy) ProtoReflect() protoreflect.Message { - mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[15] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[16] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1825,7 +1885,7 @@ func (x *HashPolicy) ProtoReflect() protoreflect.Message { // Deprecated: Use HashPolicy.ProtoReflect.Descriptor instead. func (*HashPolicy) Descriptor() ([]byte, []int) { - return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{15} + return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{16} } func (x *HashPolicy) GetField() string { @@ -1882,7 +1942,7 @@ type CookieConfig struct { func (x *CookieConfig) Reset() { *x = CookieConfig{} if protoimpl.UnsafeEnabled { - mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[16] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[17] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1895,7 +1955,7 @@ func (x *CookieConfig) String() string { func (*CookieConfig) ProtoMessage() {} func (x *CookieConfig) ProtoReflect() protoreflect.Message { - mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[16] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[17] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1908,7 +1968,7 @@ func (x *CookieConfig) ProtoReflect() protoreflect.Message { // Deprecated: Use CookieConfig.ProtoReflect.Descriptor instead. func (*CookieConfig) Descriptor() ([]byte, []int) { - return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{16} + return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{17} } func (x *CookieConfig) GetSession() bool { @@ -1952,7 +2012,7 @@ type IngressGateway struct { func (x *IngressGateway) Reset() { *x = IngressGateway{} if protoimpl.UnsafeEnabled { - mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[17] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[18] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1965,7 +2025,7 @@ func (x *IngressGateway) String() string { func (*IngressGateway) ProtoMessage() {} func (x *IngressGateway) ProtoReflect() protoreflect.Message { - mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[17] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[18] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1978,7 +2038,7 @@ func (x *IngressGateway) ProtoReflect() protoreflect.Message { // Deprecated: Use IngressGateway.ProtoReflect.Descriptor instead. func (*IngressGateway) Descriptor() ([]byte, []int) { - return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{17} + return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{18} } func (x *IngressGateway) GetTLS() *GatewayTLSConfig { @@ -2028,7 +2088,7 @@ type IngressServiceConfig struct { func (x *IngressServiceConfig) Reset() { *x = IngressServiceConfig{} if protoimpl.UnsafeEnabled { - mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[18] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[19] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2041,7 +2101,7 @@ func (x *IngressServiceConfig) String() string { func (*IngressServiceConfig) ProtoMessage() {} func (x *IngressServiceConfig) ProtoReflect() protoreflect.Message { - mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[18] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[19] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2054,7 +2114,7 @@ func (x *IngressServiceConfig) ProtoReflect() protoreflect.Message { // Deprecated: Use IngressServiceConfig.ProtoReflect.Descriptor instead. func (*IngressServiceConfig) Descriptor() ([]byte, []int) { - return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{18} + return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{19} } func (x *IngressServiceConfig) GetMaxConnections() uint32 { @@ -2108,7 +2168,7 @@ type GatewayTLSConfig struct { func (x *GatewayTLSConfig) Reset() { *x = GatewayTLSConfig{} if protoimpl.UnsafeEnabled { - mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[19] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[20] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2121,7 +2181,7 @@ func (x *GatewayTLSConfig) String() string { func (*GatewayTLSConfig) ProtoMessage() {} func (x *GatewayTLSConfig) ProtoReflect() protoreflect.Message { - mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[19] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[20] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2134,7 +2194,7 @@ func (x *GatewayTLSConfig) ProtoReflect() protoreflect.Message { // Deprecated: Use GatewayTLSConfig.ProtoReflect.Descriptor instead. func (*GatewayTLSConfig) Descriptor() ([]byte, []int) { - return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{19} + return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{20} } func (x *GatewayTLSConfig) GetEnabled() bool { @@ -2189,7 +2249,7 @@ type GatewayTLSSDSConfig struct { func (x *GatewayTLSSDSConfig) Reset() { *x = GatewayTLSSDSConfig{} if protoimpl.UnsafeEnabled { - mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[20] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[21] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2202,7 +2262,7 @@ func (x *GatewayTLSSDSConfig) String() string { func (*GatewayTLSSDSConfig) ProtoMessage() {} func (x *GatewayTLSSDSConfig) ProtoReflect() protoreflect.Message { - mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[20] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[21] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2215,7 +2275,7 @@ func (x *GatewayTLSSDSConfig) ProtoReflect() protoreflect.Message { // Deprecated: Use GatewayTLSSDSConfig.ProtoReflect.Descriptor instead. func (*GatewayTLSSDSConfig) Descriptor() ([]byte, []int) { - return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{20} + return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{21} } func (x *GatewayTLSSDSConfig) GetClusterName() string { @@ -2252,7 +2312,7 @@ type IngressListener struct { func (x *IngressListener) Reset() { *x = IngressListener{} if protoimpl.UnsafeEnabled { - mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[21] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[22] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2265,7 +2325,7 @@ func (x *IngressListener) String() string { func (*IngressListener) ProtoMessage() {} func (x *IngressListener) ProtoReflect() protoreflect.Message { - mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[21] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[22] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2278,7 +2338,7 @@ func (x *IngressListener) ProtoReflect() protoreflect.Message { // Deprecated: Use IngressListener.ProtoReflect.Descriptor instead. func (*IngressListener) Descriptor() ([]byte, []int) { - return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{21} + return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{22} } func (x *IngressListener) GetPort() int32 { @@ -2336,7 +2396,7 @@ type IngressService struct { func (x *IngressService) Reset() { *x = IngressService{} if protoimpl.UnsafeEnabled { - mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[22] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[23] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2349,7 +2409,7 @@ func (x *IngressService) String() string { func (*IngressService) ProtoMessage() {} func (x *IngressService) ProtoReflect() protoreflect.Message { - mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[22] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[23] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2362,7 +2422,7 @@ func (x *IngressService) ProtoReflect() protoreflect.Message { // Deprecated: Use IngressService.ProtoReflect.Descriptor instead. func (*IngressService) Descriptor() ([]byte, []int) { - return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{22} + return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{23} } func (x *IngressService) GetName() string { @@ -2458,7 +2518,7 @@ type GatewayServiceTLSConfig struct { func (x *GatewayServiceTLSConfig) Reset() { *x = GatewayServiceTLSConfig{} if protoimpl.UnsafeEnabled { - mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[23] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[24] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2471,7 +2531,7 @@ func (x *GatewayServiceTLSConfig) String() string { func (*GatewayServiceTLSConfig) ProtoMessage() {} func (x *GatewayServiceTLSConfig) ProtoReflect() protoreflect.Message { - mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[23] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[24] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2484,7 +2544,7 @@ func (x *GatewayServiceTLSConfig) ProtoReflect() protoreflect.Message { // Deprecated: Use GatewayServiceTLSConfig.ProtoReflect.Descriptor instead. func (*GatewayServiceTLSConfig) Descriptor() ([]byte, []int) { - return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{23} + return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{24} } func (x *GatewayServiceTLSConfig) GetSDS() *GatewayTLSSDSConfig { @@ -2512,7 +2572,7 @@ type HTTPHeaderModifiers struct { func (x *HTTPHeaderModifiers) Reset() { *x = HTTPHeaderModifiers{} if protoimpl.UnsafeEnabled { - mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[24] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[25] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2525,7 +2585,7 @@ func (x *HTTPHeaderModifiers) String() string { func (*HTTPHeaderModifiers) ProtoMessage() {} func (x *HTTPHeaderModifiers) ProtoReflect() protoreflect.Message { - mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[24] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[25] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2538,7 +2598,7 @@ func (x *HTTPHeaderModifiers) ProtoReflect() protoreflect.Message { // Deprecated: Use HTTPHeaderModifiers.ProtoReflect.Descriptor instead. func (*HTTPHeaderModifiers) Descriptor() ([]byte, []int) { - return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{24} + return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{25} } func (x *HTTPHeaderModifiers) GetAdd() map[string]string { @@ -2580,7 +2640,7 @@ type ServiceIntentions struct { func (x *ServiceIntentions) Reset() { *x = ServiceIntentions{} if protoimpl.UnsafeEnabled { - mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[25] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[26] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2593,7 +2653,7 @@ func (x *ServiceIntentions) String() string { func (*ServiceIntentions) ProtoMessage() {} func (x *ServiceIntentions) ProtoReflect() protoreflect.Message { - mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[25] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[26] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2606,7 +2666,7 @@ func (x *ServiceIntentions) ProtoReflect() protoreflect.Message { // Deprecated: Use ServiceIntentions.ProtoReflect.Descriptor instead. func (*ServiceIntentions) Descriptor() ([]byte, []int) { - return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{25} + return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{26} } func (x *ServiceIntentions) GetSources() []*SourceIntention { @@ -2656,7 +2716,7 @@ type SourceIntention struct { func (x *SourceIntention) Reset() { *x = SourceIntention{} if protoimpl.UnsafeEnabled { - mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[26] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[27] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2669,7 +2729,7 @@ func (x *SourceIntention) String() string { func (*SourceIntention) ProtoMessage() {} func (x *SourceIntention) ProtoReflect() protoreflect.Message { - mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[26] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[27] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2682,7 +2742,7 @@ func (x *SourceIntention) ProtoReflect() protoreflect.Message { // Deprecated: Use SourceIntention.ProtoReflect.Descriptor instead. func (*SourceIntention) Descriptor() ([]byte, []int) { - return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{26} + return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{27} } func (x *SourceIntention) GetName() string { @@ -2787,7 +2847,7 @@ type IntentionPermission struct { func (x *IntentionPermission) Reset() { *x = IntentionPermission{} if protoimpl.UnsafeEnabled { - mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[27] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[28] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2800,7 +2860,7 @@ func (x *IntentionPermission) String() string { func (*IntentionPermission) ProtoMessage() {} func (x *IntentionPermission) ProtoReflect() protoreflect.Message { - mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[27] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[28] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2813,7 +2873,7 @@ func (x *IntentionPermission) ProtoReflect() protoreflect.Message { // Deprecated: Use IntentionPermission.ProtoReflect.Descriptor instead. func (*IntentionPermission) Descriptor() ([]byte, []int) { - return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{27} + return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{28} } func (x *IntentionPermission) GetAction() IntentionAction { @@ -2850,7 +2910,7 @@ type IntentionHTTPPermission struct { func (x *IntentionHTTPPermission) Reset() { *x = IntentionHTTPPermission{} if protoimpl.UnsafeEnabled { - mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[28] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[29] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2863,7 +2923,7 @@ func (x *IntentionHTTPPermission) String() string { func (*IntentionHTTPPermission) ProtoMessage() {} func (x *IntentionHTTPPermission) ProtoReflect() protoreflect.Message { - mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[28] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[29] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2876,7 +2936,7 @@ func (x *IntentionHTTPPermission) ProtoReflect() protoreflect.Message { // Deprecated: Use IntentionHTTPPermission.ProtoReflect.Descriptor instead. func (*IntentionHTTPPermission) Descriptor() ([]byte, []int) { - return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{28} + return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{29} } func (x *IntentionHTTPPermission) GetPathExact() string { @@ -2936,7 +2996,7 @@ type IntentionHTTPHeaderPermission struct { func (x *IntentionHTTPHeaderPermission) Reset() { *x = IntentionHTTPHeaderPermission{} if protoimpl.UnsafeEnabled { - mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[29] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[30] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2949,7 +3009,7 @@ func (x *IntentionHTTPHeaderPermission) String() string { func (*IntentionHTTPHeaderPermission) ProtoMessage() {} func (x *IntentionHTTPHeaderPermission) ProtoReflect() protoreflect.Message { - mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[29] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[30] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2962,7 +3022,7 @@ func (x *IntentionHTTPHeaderPermission) ProtoReflect() protoreflect.Message { // Deprecated: Use IntentionHTTPHeaderPermission.ProtoReflect.Descriptor instead. func (*IntentionHTTPHeaderPermission) Descriptor() ([]byte, []int) { - return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{29} + return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{30} } func (x *IntentionHTTPHeaderPermission) GetName() string { @@ -3049,7 +3109,7 @@ type ServiceDefaults struct { func (x *ServiceDefaults) Reset() { *x = ServiceDefaults{} if protoimpl.UnsafeEnabled { - mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[30] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[31] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3062,7 +3122,7 @@ func (x *ServiceDefaults) String() string { func (*ServiceDefaults) ProtoMessage() {} func (x *ServiceDefaults) ProtoReflect() protoreflect.Message { - mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[30] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[31] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3075,7 +3135,7 @@ func (x *ServiceDefaults) ProtoReflect() protoreflect.Message { // Deprecated: Use ServiceDefaults.ProtoReflect.Descriptor instead. func (*ServiceDefaults) Descriptor() ([]byte, []int) { - return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{30} + return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{31} } func (x *ServiceDefaults) GetProtocol() string { @@ -3194,7 +3254,7 @@ type TransparentProxyConfig struct { func (x *TransparentProxyConfig) Reset() { *x = TransparentProxyConfig{} if protoimpl.UnsafeEnabled { - mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[31] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[32] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3207,7 +3267,7 @@ func (x *TransparentProxyConfig) String() string { func (*TransparentProxyConfig) ProtoMessage() {} func (x *TransparentProxyConfig) ProtoReflect() protoreflect.Message { - mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[31] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[32] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3220,7 +3280,7 @@ func (x *TransparentProxyConfig) ProtoReflect() protoreflect.Message { // Deprecated: Use TransparentProxyConfig.ProtoReflect.Descriptor instead. func (*TransparentProxyConfig) Descriptor() ([]byte, []int) { - return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{31} + return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{32} } func (x *TransparentProxyConfig) GetOutboundListenerPort() int32 { @@ -3254,7 +3314,7 @@ type MeshGatewayConfig struct { func (x *MeshGatewayConfig) Reset() { *x = MeshGatewayConfig{} if protoimpl.UnsafeEnabled { - mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[32] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[33] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3267,7 +3327,7 @@ func (x *MeshGatewayConfig) String() string { func (*MeshGatewayConfig) ProtoMessage() {} func (x *MeshGatewayConfig) ProtoReflect() protoreflect.Message { - mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[32] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[33] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3280,7 +3340,7 @@ func (x *MeshGatewayConfig) ProtoReflect() protoreflect.Message { // Deprecated: Use MeshGatewayConfig.ProtoReflect.Descriptor instead. func (*MeshGatewayConfig) Descriptor() ([]byte, []int) { - return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{32} + return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{33} } func (x *MeshGatewayConfig) GetMode() MeshGatewayMode { @@ -3307,7 +3367,7 @@ type ExposeConfig struct { func (x *ExposeConfig) Reset() { *x = ExposeConfig{} if protoimpl.UnsafeEnabled { - mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[33] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[34] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3320,7 +3380,7 @@ func (x *ExposeConfig) String() string { func (*ExposeConfig) ProtoMessage() {} func (x *ExposeConfig) ProtoReflect() protoreflect.Message { - mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[33] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[34] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3333,7 +3393,7 @@ func (x *ExposeConfig) ProtoReflect() protoreflect.Message { // Deprecated: Use ExposeConfig.ProtoReflect.Descriptor instead. func (*ExposeConfig) Descriptor() ([]byte, []int) { - return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{33} + return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{34} } func (x *ExposeConfig) GetChecks() bool { @@ -3372,7 +3432,7 @@ type ExposePath struct { func (x *ExposePath) Reset() { *x = ExposePath{} if protoimpl.UnsafeEnabled { - mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[34] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[35] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3385,7 +3445,7 @@ func (x *ExposePath) String() string { func (*ExposePath) ProtoMessage() {} func (x *ExposePath) ProtoReflect() protoreflect.Message { - mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[34] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[35] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3398,7 +3458,7 @@ func (x *ExposePath) ProtoReflect() protoreflect.Message { // Deprecated: Use ExposePath.ProtoReflect.Descriptor instead. func (*ExposePath) Descriptor() ([]byte, []int) { - return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{34} + return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{35} } func (x *ExposePath) GetListenerPort() int32 { @@ -3453,7 +3513,7 @@ type UpstreamConfiguration struct { func (x *UpstreamConfiguration) Reset() { *x = UpstreamConfiguration{} if protoimpl.UnsafeEnabled { - mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[35] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[36] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3466,7 +3526,7 @@ func (x *UpstreamConfiguration) String() string { func (*UpstreamConfiguration) ProtoMessage() {} func (x *UpstreamConfiguration) ProtoReflect() protoreflect.Message { - mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[35] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[36] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3479,7 +3539,7 @@ func (x *UpstreamConfiguration) ProtoReflect() protoreflect.Message { // Deprecated: Use UpstreamConfiguration.ProtoReflect.Descriptor instead. func (*UpstreamConfiguration) Descriptor() ([]byte, []int) { - return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{35} + return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{36} } func (x *UpstreamConfiguration) GetOverrides() []*UpstreamConfig { @@ -3524,7 +3584,7 @@ type UpstreamConfig struct { func (x *UpstreamConfig) Reset() { *x = UpstreamConfig{} if protoimpl.UnsafeEnabled { - mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[36] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[37] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3537,7 +3597,7 @@ func (x *UpstreamConfig) String() string { func (*UpstreamConfig) ProtoMessage() {} func (x *UpstreamConfig) ProtoReflect() protoreflect.Message { - mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[36] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[37] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3550,7 +3610,7 @@ func (x *UpstreamConfig) ProtoReflect() protoreflect.Message { // Deprecated: Use UpstreamConfig.ProtoReflect.Descriptor instead. func (*UpstreamConfig) Descriptor() ([]byte, []int) { - return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{36} + return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{37} } func (x *UpstreamConfig) GetName() string { @@ -3651,7 +3711,7 @@ type UpstreamLimits struct { func (x *UpstreamLimits) Reset() { *x = UpstreamLimits{} if protoimpl.UnsafeEnabled { - mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[37] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[38] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3664,7 +3724,7 @@ func (x *UpstreamLimits) String() string { func (*UpstreamLimits) ProtoMessage() {} func (x *UpstreamLimits) ProtoReflect() protoreflect.Message { - mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[37] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[38] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3677,7 +3737,7 @@ func (x *UpstreamLimits) ProtoReflect() protoreflect.Message { // Deprecated: Use UpstreamLimits.ProtoReflect.Descriptor instead. func (*UpstreamLimits) Descriptor() ([]byte, []int) { - return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{37} + return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{38} } func (x *UpstreamLimits) GetMaxConnections() int32 { @@ -3721,7 +3781,7 @@ type PassiveHealthCheck struct { func (x *PassiveHealthCheck) Reset() { *x = PassiveHealthCheck{} if protoimpl.UnsafeEnabled { - mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[38] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[39] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3734,7 +3794,7 @@ func (x *PassiveHealthCheck) String() string { func (*PassiveHealthCheck) ProtoMessage() {} func (x *PassiveHealthCheck) ProtoReflect() protoreflect.Message { - mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[38] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[39] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3747,7 +3807,7 @@ func (x *PassiveHealthCheck) ProtoReflect() protoreflect.Message { // Deprecated: Use PassiveHealthCheck.ProtoReflect.Descriptor instead. func (*PassiveHealthCheck) Descriptor() ([]byte, []int) { - return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{38} + return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{39} } func (x *PassiveHealthCheck) GetInterval() *durationpb.Duration { @@ -3789,7 +3849,7 @@ type DestinationConfig struct { func (x *DestinationConfig) Reset() { *x = DestinationConfig{} if protoimpl.UnsafeEnabled { - mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[39] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[40] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3802,7 +3862,7 @@ func (x *DestinationConfig) String() string { func (*DestinationConfig) ProtoMessage() {} func (x *DestinationConfig) ProtoReflect() protoreflect.Message { - mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[39] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[40] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3815,7 +3875,7 @@ func (x *DestinationConfig) ProtoReflect() protoreflect.Message { // Deprecated: Use DestinationConfig.ProtoReflect.Descriptor instead. func (*DestinationConfig) Descriptor() ([]byte, []int) { - return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{39} + return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{40} } func (x *DestinationConfig) GetAddresses() []string { @@ -3851,7 +3911,7 @@ type APIGateway struct { func (x *APIGateway) Reset() { *x = APIGateway{} if protoimpl.UnsafeEnabled { - mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[40] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[41] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3864,7 +3924,7 @@ func (x *APIGateway) String() string { func (*APIGateway) ProtoMessage() {} func (x *APIGateway) ProtoReflect() protoreflect.Message { - mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[40] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[41] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3877,7 +3937,7 @@ func (x *APIGateway) ProtoReflect() protoreflect.Message { // Deprecated: Use APIGateway.ProtoReflect.Descriptor instead. func (*APIGateway) Descriptor() ([]byte, []int) { - return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{40} + return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{41} } func (x *APIGateway) GetMeta() map[string]string { @@ -3917,7 +3977,7 @@ type Status struct { func (x *Status) Reset() { *x = Status{} if protoimpl.UnsafeEnabled { - mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[41] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[42] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3930,7 +3990,7 @@ func (x *Status) String() string { func (*Status) ProtoMessage() {} func (x *Status) ProtoReflect() protoreflect.Message { - mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[41] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[42] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3943,7 +4003,7 @@ func (x *Status) ProtoReflect() protoreflect.Message { // Deprecated: Use Status.ProtoReflect.Descriptor instead. func (*Status) Descriptor() ([]byte, []int) { - return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{41} + return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{42} } func (x *Status) GetConditions() []*Condition { @@ -3975,7 +4035,7 @@ type Condition struct { func (x *Condition) Reset() { *x = Condition{} if protoimpl.UnsafeEnabled { - mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[42] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[43] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3988,7 +4048,7 @@ func (x *Condition) String() string { func (*Condition) ProtoMessage() {} func (x *Condition) ProtoReflect() protoreflect.Message { - mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[42] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[43] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4001,7 +4061,7 @@ func (x *Condition) ProtoReflect() protoreflect.Message { // Deprecated: Use Condition.ProtoReflect.Descriptor instead. func (*Condition) Descriptor() ([]byte, []int) { - return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{42} + return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{43} } func (x *Condition) GetType() string { @@ -4068,7 +4128,7 @@ type APIGatewayListener struct { func (x *APIGatewayListener) Reset() { *x = APIGatewayListener{} if protoimpl.UnsafeEnabled { - mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[43] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[44] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4081,7 +4141,7 @@ func (x *APIGatewayListener) String() string { func (*APIGatewayListener) ProtoMessage() {} func (x *APIGatewayListener) ProtoReflect() protoreflect.Message { - mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[43] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[44] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4094,7 +4154,7 @@ func (x *APIGatewayListener) ProtoReflect() protoreflect.Message { // Deprecated: Use APIGatewayListener.ProtoReflect.Descriptor instead. func (*APIGatewayListener) Descriptor() ([]byte, []int) { - return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{43} + return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{44} } func (x *APIGatewayListener) GetName() string { @@ -4154,7 +4214,7 @@ type APIGatewayTLSConfiguration struct { func (x *APIGatewayTLSConfiguration) Reset() { *x = APIGatewayTLSConfiguration{} if protoimpl.UnsafeEnabled { - mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[44] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[45] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4167,7 +4227,7 @@ func (x *APIGatewayTLSConfiguration) String() string { func (*APIGatewayTLSConfiguration) ProtoMessage() {} func (x *APIGatewayTLSConfiguration) ProtoReflect() protoreflect.Message { - mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[44] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[45] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4180,7 +4240,7 @@ func (x *APIGatewayTLSConfiguration) ProtoReflect() protoreflect.Message { // Deprecated: Use APIGatewayTLSConfiguration.ProtoReflect.Descriptor instead. func (*APIGatewayTLSConfiguration) Descriptor() ([]byte, []int) { - return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{44} + return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{45} } func (x *APIGatewayTLSConfiguration) GetCertificates() []*ResourceReference { @@ -4231,7 +4291,7 @@ type ResourceReference struct { func (x *ResourceReference) Reset() { *x = ResourceReference{} if protoimpl.UnsafeEnabled { - mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[45] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[46] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4244,7 +4304,7 @@ func (x *ResourceReference) String() string { func (*ResourceReference) ProtoMessage() {} func (x *ResourceReference) ProtoReflect() protoreflect.Message { - mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[45] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[46] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4257,7 +4317,7 @@ func (x *ResourceReference) ProtoReflect() protoreflect.Message { // Deprecated: Use ResourceReference.ProtoReflect.Descriptor instead. func (*ResourceReference) Descriptor() ([]byte, []int) { - return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{45} + return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{46} } func (x *ResourceReference) GetKind() string { @@ -4306,7 +4366,7 @@ type BoundAPIGateway struct { func (x *BoundAPIGateway) Reset() { *x = BoundAPIGateway{} if protoimpl.UnsafeEnabled { - mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[46] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[47] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4319,7 +4379,7 @@ func (x *BoundAPIGateway) String() string { func (*BoundAPIGateway) ProtoMessage() {} func (x *BoundAPIGateway) ProtoReflect() protoreflect.Message { - mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[46] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[47] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4332,7 +4392,7 @@ func (x *BoundAPIGateway) ProtoReflect() protoreflect.Message { // Deprecated: Use BoundAPIGateway.ProtoReflect.Descriptor instead. func (*BoundAPIGateway) Descriptor() ([]byte, []int) { - return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{46} + return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{47} } func (x *BoundAPIGateway) GetMeta() map[string]string { @@ -4367,7 +4427,7 @@ type BoundAPIGatewayListener struct { func (x *BoundAPIGatewayListener) Reset() { *x = BoundAPIGatewayListener{} if protoimpl.UnsafeEnabled { - mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[47] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[48] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4380,7 +4440,7 @@ func (x *BoundAPIGatewayListener) String() string { func (*BoundAPIGatewayListener) ProtoMessage() {} func (x *BoundAPIGatewayListener) ProtoReflect() protoreflect.Message { - mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[47] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[48] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4393,7 +4453,7 @@ func (x *BoundAPIGatewayListener) ProtoReflect() protoreflect.Message { // Deprecated: Use BoundAPIGatewayListener.ProtoReflect.Descriptor instead. func (*BoundAPIGatewayListener) Descriptor() ([]byte, []int) { - return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{47} + return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{48} } func (x *BoundAPIGatewayListener) GetName() string { @@ -4436,7 +4496,7 @@ type InlineCertificate struct { func (x *InlineCertificate) Reset() { *x = InlineCertificate{} if protoimpl.UnsafeEnabled { - mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[48] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[49] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4449,7 +4509,7 @@ func (x *InlineCertificate) String() string { func (*InlineCertificate) ProtoMessage() {} func (x *InlineCertificate) ProtoReflect() protoreflect.Message { - mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[48] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[49] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4462,7 +4522,7 @@ func (x *InlineCertificate) ProtoReflect() protoreflect.Message { // Deprecated: Use InlineCertificate.ProtoReflect.Descriptor instead. func (*InlineCertificate) Descriptor() ([]byte, []int) { - return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{48} + return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{49} } func (x *InlineCertificate) GetMeta() map[string]string { @@ -4507,7 +4567,7 @@ type HTTPRoute struct { func (x *HTTPRoute) Reset() { *x = HTTPRoute{} if protoimpl.UnsafeEnabled { - mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[49] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[50] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4520,7 +4580,7 @@ func (x *HTTPRoute) String() string { func (*HTTPRoute) ProtoMessage() {} func (x *HTTPRoute) ProtoReflect() protoreflect.Message { - mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[49] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[50] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4533,7 +4593,7 @@ func (x *HTTPRoute) ProtoReflect() protoreflect.Message { // Deprecated: Use HTTPRoute.ProtoReflect.Descriptor instead. func (*HTTPRoute) Descriptor() ([]byte, []int) { - return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{49} + return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{50} } func (x *HTTPRoute) GetMeta() map[string]string { @@ -4589,7 +4649,7 @@ type HTTPRouteRule struct { func (x *HTTPRouteRule) Reset() { *x = HTTPRouteRule{} if protoimpl.UnsafeEnabled { - mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[50] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[51] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4602,7 +4662,7 @@ func (x *HTTPRouteRule) String() string { func (*HTTPRouteRule) ProtoMessage() {} func (x *HTTPRouteRule) ProtoReflect() protoreflect.Message { - mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[50] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[51] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4615,7 +4675,7 @@ func (x *HTTPRouteRule) ProtoReflect() protoreflect.Message { // Deprecated: Use HTTPRouteRule.ProtoReflect.Descriptor instead. func (*HTTPRouteRule) Descriptor() ([]byte, []int) { - return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{50} + return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{51} } func (x *HTTPRouteRule) GetFilters() *HTTPFilters { @@ -4659,7 +4719,7 @@ type HTTPMatch struct { func (x *HTTPMatch) Reset() { *x = HTTPMatch{} if protoimpl.UnsafeEnabled { - mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[51] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[52] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4672,7 +4732,7 @@ func (x *HTTPMatch) String() string { func (*HTTPMatch) ProtoMessage() {} func (x *HTTPMatch) ProtoReflect() protoreflect.Message { - mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[51] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[52] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4685,7 +4745,7 @@ func (x *HTTPMatch) ProtoReflect() protoreflect.Message { // Deprecated: Use HTTPMatch.ProtoReflect.Descriptor instead. func (*HTTPMatch) Descriptor() ([]byte, []int) { - return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{51} + return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{52} } func (x *HTTPMatch) GetHeaders() []*HTTPHeaderMatch { @@ -4735,7 +4795,7 @@ type HTTPHeaderMatch struct { func (x *HTTPHeaderMatch) Reset() { *x = HTTPHeaderMatch{} if protoimpl.UnsafeEnabled { - mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[52] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[53] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4748,7 +4808,7 @@ func (x *HTTPHeaderMatch) String() string { func (*HTTPHeaderMatch) ProtoMessage() {} func (x *HTTPHeaderMatch) ProtoReflect() protoreflect.Message { - mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[52] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[53] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4761,7 +4821,7 @@ func (x *HTTPHeaderMatch) ProtoReflect() protoreflect.Message { // Deprecated: Use HTTPHeaderMatch.ProtoReflect.Descriptor instead. func (*HTTPHeaderMatch) Descriptor() ([]byte, []int) { - return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{52} + return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{53} } func (x *HTTPHeaderMatch) GetMatch() HTTPHeaderMatchType { @@ -4803,7 +4863,7 @@ type HTTPPathMatch struct { func (x *HTTPPathMatch) Reset() { *x = HTTPPathMatch{} if protoimpl.UnsafeEnabled { - mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[53] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[54] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4816,7 +4876,7 @@ func (x *HTTPPathMatch) String() string { func (*HTTPPathMatch) ProtoMessage() {} func (x *HTTPPathMatch) ProtoReflect() protoreflect.Message { - mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[53] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[54] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4829,7 +4889,7 @@ func (x *HTTPPathMatch) ProtoReflect() protoreflect.Message { // Deprecated: Use HTTPPathMatch.ProtoReflect.Descriptor instead. func (*HTTPPathMatch) Descriptor() ([]byte, []int) { - return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{53} + return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{54} } func (x *HTTPPathMatch) GetMatch() HTTPPathMatchType { @@ -4865,7 +4925,7 @@ type HTTPQueryMatch struct { func (x *HTTPQueryMatch) Reset() { *x = HTTPQueryMatch{} if protoimpl.UnsafeEnabled { - mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[54] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[55] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4878,7 +4938,7 @@ func (x *HTTPQueryMatch) String() string { func (*HTTPQueryMatch) ProtoMessage() {} func (x *HTTPQueryMatch) ProtoReflect() protoreflect.Message { - mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[54] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[55] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4891,7 +4951,7 @@ func (x *HTTPQueryMatch) ProtoReflect() protoreflect.Message { // Deprecated: Use HTTPQueryMatch.ProtoReflect.Descriptor instead. func (*HTTPQueryMatch) Descriptor() ([]byte, []int) { - return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{54} + return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{55} } func (x *HTTPQueryMatch) GetMatch() HTTPQueryMatchType { @@ -4932,7 +4992,7 @@ type HTTPFilters struct { func (x *HTTPFilters) Reset() { *x = HTTPFilters{} if protoimpl.UnsafeEnabled { - mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[55] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[56] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4945,7 +5005,7 @@ func (x *HTTPFilters) String() string { func (*HTTPFilters) ProtoMessage() {} func (x *HTTPFilters) ProtoReflect() protoreflect.Message { - mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[55] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[56] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4958,7 +5018,7 @@ func (x *HTTPFilters) ProtoReflect() protoreflect.Message { // Deprecated: Use HTTPFilters.ProtoReflect.Descriptor instead. func (*HTTPFilters) Descriptor() ([]byte, []int) { - return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{55} + return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{56} } func (x *HTTPFilters) GetHeaders() []*HTTPHeaderFilter { @@ -4991,7 +5051,7 @@ type URLRewrite struct { func (x *URLRewrite) Reset() { *x = URLRewrite{} if protoimpl.UnsafeEnabled { - mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[56] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[57] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5004,7 +5064,7 @@ func (x *URLRewrite) String() string { func (*URLRewrite) ProtoMessage() {} func (x *URLRewrite) ProtoReflect() protoreflect.Message { - mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[56] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[57] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5017,7 +5077,7 @@ func (x *URLRewrite) ProtoReflect() protoreflect.Message { // Deprecated: Use URLRewrite.ProtoReflect.Descriptor instead. func (*URLRewrite) Descriptor() ([]byte, []int) { - return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{56} + return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{57} } func (x *URLRewrite) GetPath() string { @@ -5045,7 +5105,7 @@ type HTTPHeaderFilter struct { func (x *HTTPHeaderFilter) Reset() { *x = HTTPHeaderFilter{} if protoimpl.UnsafeEnabled { - mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[57] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[58] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5058,7 +5118,7 @@ func (x *HTTPHeaderFilter) String() string { func (*HTTPHeaderFilter) ProtoMessage() {} func (x *HTTPHeaderFilter) ProtoReflect() protoreflect.Message { - mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[57] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[58] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5071,7 +5131,7 @@ func (x *HTTPHeaderFilter) ProtoReflect() protoreflect.Message { // Deprecated: Use HTTPHeaderFilter.ProtoReflect.Descriptor instead. func (*HTTPHeaderFilter) Descriptor() ([]byte, []int) { - return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{57} + return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{58} } func (x *HTTPHeaderFilter) GetAdd() map[string]string { @@ -5116,7 +5176,7 @@ type HTTPService struct { func (x *HTTPService) Reset() { *x = HTTPService{} if protoimpl.UnsafeEnabled { - mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[58] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[59] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5129,7 +5189,7 @@ func (x *HTTPService) String() string { func (*HTTPService) ProtoMessage() {} func (x *HTTPService) ProtoReflect() protoreflect.Message { - mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[58] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[59] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5142,7 +5202,7 @@ func (x *HTTPService) ProtoReflect() protoreflect.Message { // Deprecated: Use HTTPService.ProtoReflect.Descriptor instead. func (*HTTPService) Descriptor() ([]byte, []int) { - return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{58} + return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{59} } func (x *HTTPService) GetName() string { @@ -5193,7 +5253,7 @@ type TCPRoute struct { func (x *TCPRoute) Reset() { *x = TCPRoute{} if protoimpl.UnsafeEnabled { - mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[59] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[60] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5206,7 +5266,7 @@ func (x *TCPRoute) String() string { func (*TCPRoute) ProtoMessage() {} func (x *TCPRoute) ProtoReflect() protoreflect.Message { - mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[59] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[60] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5219,7 +5279,7 @@ func (x *TCPRoute) ProtoReflect() protoreflect.Message { // Deprecated: Use TCPRoute.ProtoReflect.Descriptor instead. func (*TCPRoute) Descriptor() ([]byte, []int) { - return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{59} + return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{60} } func (x *TCPRoute) GetMeta() map[string]string { @@ -5268,7 +5328,7 @@ type TCPService struct { func (x *TCPService) Reset() { *x = TCPService{} if protoimpl.UnsafeEnabled { - mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[60] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[61] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5281,7 +5341,7 @@ func (x *TCPService) String() string { func (*TCPService) ProtoMessage() {} func (x *TCPService) ProtoReflect() protoreflect.Message { - mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[60] + mi := &file_private_pbconfigentry_config_entry_proto_msgTypes[61] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5294,7 +5354,7 @@ func (x *TCPService) ProtoReflect() protoreflect.Message { // Deprecated: Use TCPService.ProtoReflect.Descriptor instead. func (*TCPService) Descriptor() ([]byte, []int) { - return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{60} + return file_private_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{61} } func (x *TCPService) GetName() string { @@ -5546,7 +5606,7 @@ var file_private_pbconfigentry_config_entry_proto_rawDesc = []byte{ 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x44, 0x61, 0x74, 0x61, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x44, 0x61, 0x74, 0x61, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x65, 0x65, 0x72, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x50, 0x65, 0x65, 0x72, 0x22, 0xf9, 0x01, 0x0a, 0x17, 0x53, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x50, 0x65, 0x65, 0x72, 0x22, 0xd7, 0x02, 0x0a, 0x17, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x46, 0x61, 0x69, 0x6c, 0x6f, 0x76, 0x65, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, @@ -5562,906 +5622,915 @@ var file_private_pbconfigentry_config_entry_proto_rawDesc = []byte{ 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x46, 0x61, 0x69, 0x6c, 0x6f, 0x76, 0x65, 0x72, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x07, 0x54, - 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x22, 0xcf, 0x01, 0x0a, 0x1d, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x46, 0x61, 0x69, 0x6c, 0x6f, 0x76, - 0x65, 0x72, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x53, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x75, 0x62, - 0x73, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x53, 0x75, 0x62, 0x73, 0x65, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x50, 0x61, 0x72, 0x74, - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x50, 0x61, 0x72, - 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x4e, 0x61, 0x6d, 0x65, 0x73, - 0x70, 0x61, 0x63, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x44, 0x61, 0x74, 0x61, 0x63, 0x65, 0x6e, 0x74, - 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x44, 0x61, 0x74, 0x61, 0x63, 0x65, - 0x6e, 0x74, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x65, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x50, 0x65, 0x65, 0x72, 0x22, 0xc7, 0x02, 0x0a, 0x0c, 0x4c, 0x6f, 0x61, - 0x64, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x50, 0x6f, 0x6c, - 0x69, 0x63, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x50, 0x6f, 0x6c, 0x69, 0x63, - 0x79, 0x12, 0x5d, 0x0a, 0x0e, 0x52, 0x69, 0x6e, 0x67, 0x48, 0x61, 0x73, 0x68, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x68, 0x61, 0x73, 0x68, - 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, - 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, - 0x79, 0x2e, 0x52, 0x69, 0x6e, 0x67, 0x48, 0x61, 0x73, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x52, 0x0e, 0x52, 0x69, 0x6e, 0x67, 0x48, 0x61, 0x73, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x12, 0x69, 0x0a, 0x12, 0x4c, 0x65, 0x61, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x68, - 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, - 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, - 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x4c, 0x65, 0x61, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x12, 0x4c, 0x65, 0x61, 0x73, 0x74, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x55, 0x0a, 0x0c, 0x48, - 0x61, 0x73, 0x68, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x31, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, - 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x48, 0x61, 0x73, 0x68, 0x50, 0x6f, - 0x6c, 0x69, 0x63, 0x79, 0x52, 0x0c, 0x48, 0x61, 0x73, 0x68, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, - 0x65, 0x73, 0x22, 0x64, 0x0a, 0x0e, 0x52, 0x69, 0x6e, 0x67, 0x48, 0x61, 0x73, 0x68, 0x43, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x12, 0x28, 0x0a, 0x0f, 0x4d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x52, - 0x69, 0x6e, 0x67, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0f, 0x4d, - 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x52, 0x69, 0x6e, 0x67, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x28, - 0x0a, 0x0f, 0x4d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x52, 0x69, 0x6e, 0x67, 0x53, 0x69, 0x7a, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0f, 0x4d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, - 0x52, 0x69, 0x6e, 0x67, 0x53, 0x69, 0x7a, 0x65, 0x22, 0x36, 0x0a, 0x12, 0x4c, 0x65, 0x61, 0x73, - 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x20, - 0x0a, 0x0b, 0x43, 0x68, 0x6f, 0x69, 0x63, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x43, 0x68, 0x6f, 0x69, 0x63, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, - 0x22, 0xd3, 0x01, 0x0a, 0x0a, 0x48, 0x61, 0x73, 0x68, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, - 0x14, 0x0a, 0x05, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x56, 0x61, - 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x46, 0x69, 0x65, 0x6c, 0x64, - 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x57, 0x0a, 0x0c, 0x43, 0x6f, 0x6f, 0x6b, 0x69, 0x65, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x68, 0x61, - 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, - 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, - 0x74, 0x72, 0x79, 0x2e, 0x43, 0x6f, 0x6f, 0x6b, 0x69, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x52, 0x0c, 0x43, 0x6f, 0x6f, 0x6b, 0x69, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x1a, - 0x0a, 0x08, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x50, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x08, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x50, 0x12, 0x1a, 0x0a, 0x08, 0x54, 0x65, - 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x54, 0x65, - 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x6c, 0x22, 0x69, 0x0a, 0x0c, 0x43, 0x6f, 0x6f, 0x6b, 0x69, 0x65, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x18, 0x0a, 0x07, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, - 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, - 0x12, 0x2b, 0x0a, 0x03, 0x54, 0x54, 0x4c, 0x18, 0x02, 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, 0x52, 0x03, 0x54, 0x54, 0x4c, 0x12, 0x12, 0x0a, - 0x04, 0x50, 0x61, 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x50, 0x61, 0x74, - 0x68, 0x22, 0x98, 0x03, 0x0a, 0x0e, 0x49, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x47, 0x61, 0x74, - 0x65, 0x77, 0x61, 0x79, 0x12, 0x49, 0x0a, 0x03, 0x54, 0x4c, 0x53, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x37, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, - 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, - 0x79, 0x54, 0x4c, 0x53, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x03, 0x54, 0x4c, 0x53, 0x12, - 0x54, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, - 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x49, 0x6e, 0x67, 0x72, 0x65, - 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x09, 0x4c, 0x69, 0x73, 0x74, - 0x65, 0x6e, 0x65, 0x72, 0x73, 0x12, 0x53, 0x0a, 0x04, 0x4d, 0x65, 0x74, 0x61, 0x18, 0x03, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x3f, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, - 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, - 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x49, 0x6e, 0x67, 0x72, - 0x65, 0x73, 0x73, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x57, 0x0a, 0x08, 0x44, 0x65, - 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3b, 0x2e, 0x68, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x12, 0x5c, 0x0a, 0x06, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x44, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, + 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, + 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x53, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x46, 0x61, + 0x69, 0x6c, 0x6f, 0x76, 0x65, 0x72, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x06, 0x50, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x22, 0x33, 0x0a, 0x1d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, + 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x46, 0x61, 0x69, 0x6c, 0x6f, 0x76, 0x65, 0x72, 0x50, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x4d, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x4d, 0x6f, 0x64, 0x65, 0x22, 0xcf, 0x01, 0x0a, 0x1d, 0x53, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x46, 0x61, 0x69, + 0x6c, 0x6f, 0x76, 0x65, 0x72, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x53, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x53, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x53, 0x75, 0x62, 0x73, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x53, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x75, 0x62, 0x73, 0x65, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x50, + 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, + 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x4e, 0x61, 0x6d, + 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x4e, 0x61, + 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x44, 0x61, 0x74, 0x61, 0x63, + 0x65, 0x6e, 0x74, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x44, 0x61, 0x74, + 0x61, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x65, 0x65, 0x72, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x50, 0x65, 0x65, 0x72, 0x22, 0xc7, 0x02, 0x0a, 0x0c, + 0x4c, 0x6f, 0x61, 0x64, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x72, 0x12, 0x16, 0x0a, 0x06, + 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x50, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x12, 0x5d, 0x0a, 0x0e, 0x52, 0x69, 0x6e, 0x67, 0x48, 0x61, 0x73, 0x68, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, - 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x49, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x53, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x08, 0x44, 0x65, 0x66, 0x61, 0x75, - 0x6c, 0x74, 0x73, 0x1a, 0x37, 0x0a, 0x09, 0x4d, 0x65, 0x74, 0x61, 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, 0x22, 0x8f, 0x02, 0x0a, - 0x14, 0x49, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x26, 0x0a, 0x0e, 0x4d, 0x61, 0x78, 0x43, 0x6f, 0x6e, 0x6e, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0e, 0x4d, - 0x61, 0x78, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2e, 0x0a, - 0x12, 0x4d, 0x61, 0x78, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x12, 0x4d, 0x61, 0x78, 0x50, 0x65, - 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x12, 0x34, 0x0a, - 0x15, 0x4d, 0x61, 0x78, 0x43, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x15, 0x4d, 0x61, - 0x78, 0x43, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x73, 0x12, 0x69, 0x0a, 0x12, 0x50, 0x61, 0x73, 0x73, 0x69, 0x76, 0x65, 0x48, 0x65, - 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x52, 0x69, 0x6e, 0x67, 0x48, 0x61, 0x73, 0x68, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x52, 0x0e, 0x52, 0x69, 0x6e, 0x67, 0x48, 0x61, 0x73, 0x68, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x12, 0x69, 0x0a, 0x12, 0x4c, 0x65, 0x61, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x50, 0x61, 0x73, 0x73, 0x69, 0x76, 0x65, 0x48, - 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x12, 0x50, 0x61, 0x73, 0x73, - 0x69, 0x76, 0x65, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x22, 0xea, - 0x01, 0x0a, 0x10, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x54, 0x4c, 0x53, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x12, 0x18, 0x0a, 0x07, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x4c, 0x0a, - 0x03, 0x53, 0x44, 0x53, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x68, 0x61, 0x73, - 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, - 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, - 0x72, 0x79, 0x2e, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x54, 0x4c, 0x53, 0x53, 0x44, 0x53, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x03, 0x53, 0x44, 0x53, 0x12, 0x24, 0x0a, 0x0d, 0x54, - 0x4c, 0x53, 0x4d, 0x69, 0x6e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0d, 0x54, 0x4c, 0x53, 0x4d, 0x69, 0x6e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x12, 0x24, 0x0a, 0x0d, 0x54, 0x4c, 0x53, 0x4d, 0x61, 0x78, 0x56, 0x65, 0x72, 0x73, 0x69, - 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x54, 0x4c, 0x53, 0x4d, 0x61, 0x78, - 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x22, 0x0a, 0x0c, 0x43, 0x69, 0x70, 0x68, 0x65, - 0x72, 0x53, 0x75, 0x69, 0x74, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x43, - 0x69, 0x70, 0x68, 0x65, 0x72, 0x53, 0x75, 0x69, 0x74, 0x65, 0x73, 0x22, 0x5b, 0x0a, 0x13, 0x47, - 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x54, 0x4c, 0x53, 0x53, 0x44, 0x53, 0x43, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x12, 0x20, 0x0a, 0x0b, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x61, 0x6d, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, - 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x43, 0x65, 0x72, 0x74, 0x52, 0x65, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x43, 0x65, 0x72, 0x74, - 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x22, 0xdf, 0x01, 0x0a, 0x0f, 0x49, 0x6e, 0x67, - 0x72, 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, - 0x50, 0x6f, 0x72, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x50, 0x6f, 0x72, 0x74, - 0x12, 0x1a, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x51, 0x0a, 0x08, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x35, + 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x4c, 0x65, 0x61, 0x73, 0x74, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x12, 0x4c, 0x65, 0x61, 0x73, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x55, + 0x0a, 0x0c, 0x48, 0x61, 0x73, 0x68, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x18, 0x04, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, + 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, + 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x48, 0x61, 0x73, + 0x68, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x0c, 0x48, 0x61, 0x73, 0x68, 0x50, 0x6f, 0x6c, + 0x69, 0x63, 0x69, 0x65, 0x73, 0x22, 0x64, 0x0a, 0x0e, 0x52, 0x69, 0x6e, 0x67, 0x48, 0x61, 0x73, + 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x28, 0x0a, 0x0f, 0x4d, 0x69, 0x6e, 0x69, 0x6d, + 0x75, 0x6d, 0x52, 0x69, 0x6e, 0x67, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x0f, 0x4d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x52, 0x69, 0x6e, 0x67, 0x53, 0x69, 0x7a, + 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x4d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x52, 0x69, 0x6e, 0x67, + 0x53, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0f, 0x4d, 0x61, 0x78, 0x69, + 0x6d, 0x75, 0x6d, 0x52, 0x69, 0x6e, 0x67, 0x53, 0x69, 0x7a, 0x65, 0x22, 0x36, 0x0a, 0x12, 0x4c, + 0x65, 0x61, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x12, 0x20, 0x0a, 0x0b, 0x43, 0x68, 0x6f, 0x69, 0x63, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x43, 0x68, 0x6f, 0x69, 0x63, 0x65, 0x43, 0x6f, + 0x75, 0x6e, 0x74, 0x22, 0xd3, 0x01, 0x0a, 0x0a, 0x48, 0x61, 0x73, 0x68, 0x50, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x46, 0x69, 0x65, 0x6c, + 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x46, 0x69, + 0x65, 0x6c, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x57, 0x0a, 0x0c, 0x43, 0x6f, 0x6f, 0x6b, + 0x69, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x49, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x53, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x08, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, - 0x49, 0x0a, 0x03, 0x54, 0x4c, 0x53, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x68, - 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, - 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, - 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x54, 0x4c, 0x53, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x03, 0x54, 0x4c, 0x53, 0x22, 0xb7, 0x06, 0x0a, 0x0e, 0x49, - 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x12, 0x0a, - 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, - 0x65, 0x12, 0x14, 0x0a, 0x05, 0x48, 0x6f, 0x73, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, - 0x52, 0x05, 0x48, 0x6f, 0x73, 0x74, 0x73, 0x12, 0x50, 0x0a, 0x03, 0x54, 0x4c, 0x53, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3e, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, + 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x43, 0x6f, 0x6f, 0x6b, 0x69, 0x65, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x52, 0x0c, 0x43, 0x6f, 0x6f, 0x6b, 0x69, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x12, 0x1a, 0x0a, 0x08, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x50, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x08, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x50, 0x12, 0x1a, 0x0a, + 0x08, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x08, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x6c, 0x22, 0x69, 0x0a, 0x0c, 0x43, 0x6f, 0x6f, + 0x6b, 0x69, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x18, 0x0a, 0x07, 0x53, 0x65, 0x73, + 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x53, 0x65, 0x73, 0x73, + 0x69, 0x6f, 0x6e, 0x12, 0x2b, 0x0a, 0x03, 0x54, 0x54, 0x4c, 0x18, 0x02, 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, 0x52, 0x03, 0x54, 0x54, 0x4c, + 0x12, 0x12, 0x0a, 0x04, 0x50, 0x61, 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x50, 0x61, 0x74, 0x68, 0x22, 0x98, 0x03, 0x0a, 0x0e, 0x49, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, + 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x12, 0x49, 0x0a, 0x03, 0x54, 0x4c, 0x53, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x47, 0x61, 0x74, - 0x65, 0x77, 0x61, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x54, 0x4c, 0x53, 0x43, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x52, 0x03, 0x54, 0x4c, 0x53, 0x12, 0x62, 0x0a, 0x0e, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x3a, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, - 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x48, 0x65, - 0x61, 0x64, 0x65, 0x72, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x52, 0x0e, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x12, 0x64, 0x0a, - 0x0f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, + 0x65, 0x77, 0x61, 0x79, 0x54, 0x4c, 0x53, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x03, 0x54, + 0x4c, 0x53, 0x12, 0x54, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x73, 0x18, + 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, + 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, + 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x49, 0x6e, + 0x67, 0x72, 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x09, 0x4c, + 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x73, 0x12, 0x53, 0x0a, 0x04, 0x4d, 0x65, 0x74, 0x61, + 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3f, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, - 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x48, - 0x54, 0x54, 0x50, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, - 0x72, 0x73, 0x52, 0x0f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x65, 0x61, 0x64, - 0x65, 0x72, 0x73, 0x12, 0x53, 0x0a, 0x04, 0x4d, 0x65, 0x74, 0x61, 0x18, 0x06, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x3f, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, - 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x49, 0x6e, 0x67, 0x72, 0x65, 0x73, - 0x73, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x52, 0x04, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x58, 0x0a, 0x0e, 0x45, 0x6e, 0x74, 0x65, - 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x30, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, - 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6d, - 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x4d, 0x65, - 0x74, 0x61, 0x52, 0x0e, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x4d, 0x65, - 0x74, 0x61, 0x12, 0x26, 0x0a, 0x0e, 0x4d, 0x61, 0x78, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0e, 0x4d, 0x61, 0x78, 0x43, - 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2e, 0x0a, 0x12, 0x4d, 0x61, + 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x49, + 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4d, 0x65, + 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x57, 0x0a, + 0x08, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x3b, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, + 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x49, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x53, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x08, 0x44, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x1a, 0x37, 0x0a, 0x09, 0x4d, 0x65, 0x74, 0x61, 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, 0x22, + 0x8f, 0x02, 0x0a, 0x14, 0x49, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x26, 0x0a, 0x0e, 0x4d, 0x61, 0x78, 0x43, + 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x0e, 0x4d, 0x61, 0x78, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x12, 0x2e, 0x0a, 0x12, 0x4d, 0x61, 0x78, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x12, 0x4d, 0x61, 0x78, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, - 0x18, 0x09, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x12, 0x4d, 0x61, 0x78, 0x50, 0x65, 0x6e, 0x64, 0x69, - 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x4d, 0x61, - 0x78, 0x43, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x15, 0x4d, 0x61, 0x78, 0x43, 0x6f, - 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, - 0x12, 0x69, 0x0a, 0x12, 0x50, 0x61, 0x73, 0x73, 0x69, 0x76, 0x65, 0x48, 0x65, 0x61, 0x6c, 0x74, - 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x68, - 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, - 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, - 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x50, 0x61, 0x73, 0x73, 0x69, 0x76, 0x65, 0x48, 0x65, 0x61, 0x6c, - 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x12, 0x50, 0x61, 0x73, 0x73, 0x69, 0x76, 0x65, - 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x1a, 0x37, 0x0a, 0x09, 0x4d, - 0x65, 0x74, 0x61, 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, 0x22, 0x67, 0x0a, 0x17, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x54, 0x4c, 0x53, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, - 0x4c, 0x0a, 0x03, 0x53, 0x44, 0x53, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x68, - 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, - 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, - 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x54, 0x4c, 0x53, 0x53, - 0x44, 0x53, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x03, 0x53, 0x44, 0x53, 0x22, 0xcb, 0x02, - 0x0a, 0x13, 0x48, 0x54, 0x54, 0x50, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x4d, 0x6f, 0x64, 0x69, - 0x66, 0x69, 0x65, 0x72, 0x73, 0x12, 0x55, 0x0a, 0x03, 0x41, 0x64, 0x64, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x43, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, + 0x12, 0x34, 0x0a, 0x15, 0x4d, 0x61, 0x78, 0x43, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x15, 0x4d, 0x61, 0x78, 0x43, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x12, 0x69, 0x0a, 0x12, 0x50, 0x61, 0x73, 0x73, 0x69, 0x76, + 0x65, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x48, - 0x65, 0x61, 0x64, 0x65, 0x72, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x2e, 0x41, - 0x64, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x03, 0x41, 0x64, 0x64, 0x12, 0x55, 0x0a, 0x03, - 0x53, 0x65, 0x74, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x43, 0x2e, 0x68, 0x61, 0x73, 0x68, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x50, 0x61, 0x73, 0x73, 0x69, + 0x76, 0x65, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x12, 0x50, + 0x61, 0x73, 0x73, 0x69, 0x76, 0x65, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, + 0x6b, 0x22, 0xea, 0x01, 0x0a, 0x10, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x54, 0x4c, 0x53, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x18, 0x0a, 0x07, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, + 0x12, 0x4c, 0x0a, 0x03, 0x53, 0x44, 0x53, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3a, 0x2e, + 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, + 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x54, 0x4c, 0x53, + 0x53, 0x44, 0x53, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x03, 0x53, 0x44, 0x53, 0x12, 0x24, + 0x0a, 0x0d, 0x54, 0x4c, 0x53, 0x4d, 0x69, 0x6e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x54, 0x4c, 0x53, 0x4d, 0x69, 0x6e, 0x56, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x0a, 0x0d, 0x54, 0x4c, 0x53, 0x4d, 0x61, 0x78, 0x56, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x54, 0x4c, 0x53, + 0x4d, 0x61, 0x78, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x22, 0x0a, 0x0c, 0x43, 0x69, + 0x70, 0x68, 0x65, 0x72, 0x53, 0x75, 0x69, 0x74, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, + 0x52, 0x0c, 0x43, 0x69, 0x70, 0x68, 0x65, 0x72, 0x53, 0x75, 0x69, 0x74, 0x65, 0x73, 0x22, 0x5b, + 0x0a, 0x13, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x54, 0x4c, 0x53, 0x53, 0x44, 0x53, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x20, 0x0a, 0x0b, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, + 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x43, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x43, 0x65, 0x72, 0x74, 0x52, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x43, + 0x65, 0x72, 0x74, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x22, 0xdf, 0x01, 0x0a, 0x0f, + 0x49, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, + 0x12, 0x0a, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x50, + 0x6f, 0x72, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, + 0x51, 0x0a, 0x08, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x35, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, + 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x49, 0x6e, 0x67, 0x72, 0x65, 0x73, + 0x73, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x08, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x73, 0x12, 0x49, 0x0a, 0x03, 0x54, 0x4c, 0x53, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x37, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, + 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x54, + 0x4c, 0x53, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x03, 0x54, 0x4c, 0x53, 0x22, 0xb7, 0x06, + 0x0a, 0x0e, 0x49, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x48, 0x6f, 0x73, 0x74, 0x73, 0x18, 0x02, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x05, 0x48, 0x6f, 0x73, 0x74, 0x73, 0x12, 0x50, 0x0a, 0x03, 0x54, 0x4c, + 0x53, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3e, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, + 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, + 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, + 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x54, 0x4c, + 0x53, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x03, 0x54, 0x4c, 0x53, 0x12, 0x62, 0x0a, 0x0e, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, + 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, + 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x48, 0x54, 0x54, + 0x50, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, + 0x52, 0x0e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, + 0x12, 0x64, 0x0a, 0x0f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x65, 0x61, 0x64, + 0x65, 0x72, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x4d, 0x6f, 0x64, 0x69, - 0x66, 0x69, 0x65, 0x72, 0x73, 0x2e, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x03, - 0x53, 0x65, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x18, 0x03, 0x20, - 0x03, 0x28, 0x09, 0x52, 0x06, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x1a, 0x36, 0x0a, 0x08, 0x41, - 0x64, 0x64, 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, 0x36, 0x0a, 0x08, 0x53, 0x65, 0x74, 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, 0x22, 0xf6, 0x01, 0x0a, 0x11, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x12, 0x50, 0x0a, 0x07, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, - 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x53, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x53, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x73, 0x12, 0x56, 0x0a, 0x04, 0x4d, 0x65, 0x74, 0x61, 0x18, 0x02, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x42, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, - 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4d, 0x65, 0x74, 0x61, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x4d, 0x65, 0x74, 0x61, 0x1a, 0x37, 0x0a, 0x09, 0x4d, - 0x65, 0x74, 0x61, 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, 0x22, 0xa6, 0x06, 0x0a, 0x0f, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, - 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x4e, 0x0a, 0x06, - 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x36, 0x2e, 0x68, - 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, - 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, - 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x06, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x5c, 0x0a, 0x0b, - 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x3a, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, - 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x74, - 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x50, - 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x50, 0x72, - 0x65, 0x63, 0x65, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, - 0x50, 0x72, 0x65, 0x63, 0x65, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x4c, 0x65, - 0x67, 0x61, 0x63, 0x79, 0x49, 0x44, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x4c, 0x65, - 0x67, 0x61, 0x63, 0x79, 0x49, 0x44, 0x12, 0x4e, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x0e, 0x32, 0x3a, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, + 0x66, 0x69, 0x65, 0x72, 0x73, 0x52, 0x0f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, + 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x12, 0x53, 0x0a, 0x04, 0x4d, 0x65, 0x74, 0x61, 0x18, 0x06, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3f, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, - 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x49, 0x6e, 0x74, - 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, - 0x52, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x44, 0x65, 0x73, - 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x66, 0x0a, 0x0a, 0x4c, 0x65, 0x67, 0x61, - 0x63, 0x79, 0x4d, 0x65, 0x74, 0x61, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x46, 0x2e, 0x68, + 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x49, 0x6e, 0x67, + 0x72, 0x65, 0x73, 0x73, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x4d, 0x65, 0x74, 0x61, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x58, 0x0a, 0x0e, 0x45, + 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x18, 0x07, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, + 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, + 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, + 0x65, 0x4d, 0x65, 0x74, 0x61, 0x52, 0x0e, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, + 0x65, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x26, 0x0a, 0x0e, 0x4d, 0x61, 0x78, 0x43, 0x6f, 0x6e, 0x6e, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0e, 0x4d, + 0x61, 0x78, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2e, 0x0a, + 0x12, 0x4d, 0x61, 0x78, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x12, 0x4d, 0x61, 0x78, 0x50, 0x65, + 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x12, 0x34, 0x0a, + 0x15, 0x4d, 0x61, 0x78, 0x43, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x15, 0x4d, 0x61, + 0x78, 0x43, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x73, 0x12, 0x69, 0x0a, 0x12, 0x50, 0x61, 0x73, 0x73, 0x69, 0x76, 0x65, 0x48, 0x65, + 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x39, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, + 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x50, 0x61, 0x73, 0x73, 0x69, 0x76, 0x65, 0x48, + 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x12, 0x50, 0x61, 0x73, 0x73, + 0x69, 0x76, 0x65, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x1a, 0x37, + 0x0a, 0x09, 0x4d, 0x65, 0x74, 0x61, 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, 0x22, 0x67, 0x0a, 0x17, 0x47, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x54, 0x4c, 0x53, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x12, 0x4c, 0x0a, 0x03, 0x53, 0x44, 0x53, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x3a, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, + 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x54, + 0x4c, 0x53, 0x53, 0x44, 0x53, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x03, 0x53, 0x44, 0x53, + 0x22, 0xcb, 0x02, 0x0a, 0x13, 0x48, 0x54, 0x54, 0x50, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x4d, + 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x12, 0x55, 0x0a, 0x03, 0x41, 0x64, 0x64, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x43, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, + 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, + 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x48, 0x54, + 0x54, 0x50, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x72, + 0x73, 0x2e, 0x41, 0x64, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x03, 0x41, 0x64, 0x64, 0x12, + 0x55, 0x0a, 0x03, 0x53, 0x65, 0x74, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x43, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, - 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x74, 0x65, 0x6e, - 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x4c, 0x65, 0x67, 0x61, 0x63, 0x79, 0x4d, 0x65, 0x74, 0x61, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x4c, 0x65, 0x67, 0x61, 0x63, 0x79, 0x4d, 0x65, 0x74, 0x61, - 0x12, 0x46, 0x0a, 0x10, 0x4c, 0x65, 0x67, 0x61, 0x63, 0x79, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x54, 0x69, 0x6d, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, - 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x10, 0x4c, 0x65, 0x67, 0x61, 0x63, 0x79, 0x43, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x46, 0x0a, 0x10, 0x4c, 0x65, 0x67, 0x61, - 0x63, 0x79, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x18, 0x0a, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x10, - 0x4c, 0x65, 0x67, 0x61, 0x63, 0x79, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, - 0x12, 0x58, 0x0a, 0x0e, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x4d, 0x65, - 0x74, 0x61, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, - 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, - 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x74, 0x65, - 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x52, 0x0e, 0x45, 0x6e, 0x74, 0x65, - 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x65, - 0x65, 0x72, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x50, 0x65, 0x65, 0x72, 0x1a, 0x3d, - 0x0a, 0x0f, 0x4c, 0x65, 0x67, 0x61, 0x63, 0x79, 0x4d, 0x65, 0x74, 0x61, 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, 0x22, 0xb9, 0x01, - 0x0a, 0x13, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x72, 0x6d, 0x69, - 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x4e, 0x0a, 0x06, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x36, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, + 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x4d, + 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x2e, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x03, 0x53, 0x65, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, + 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x1a, 0x36, + 0x0a, 0x08, 0x41, 0x64, 0x64, 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, 0x36, 0x0a, 0x08, 0x53, 0x65, 0x74, 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, 0x22, 0xf6, + 0x01, 0x0a, 0x11, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x50, 0x0a, 0x07, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, - 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x49, 0x6e, - 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x06, 0x41, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x52, 0x0a, 0x04, 0x48, 0x54, 0x54, 0x50, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x3e, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, - 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, - 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x49, 0x6e, 0x74, 0x65, - 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x54, 0x54, 0x50, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, - 0x69, 0x6f, 0x6e, 0x52, 0x04, 0x48, 0x54, 0x54, 0x50, 0x22, 0xed, 0x01, 0x0a, 0x17, 0x49, 0x6e, - 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x54, 0x54, 0x50, 0x50, 0x65, 0x72, 0x6d, 0x69, - 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x50, 0x61, 0x74, 0x68, 0x45, 0x78, 0x61, - 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x50, 0x61, 0x74, 0x68, 0x45, 0x78, - 0x61, 0x63, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x50, 0x61, 0x74, 0x68, 0x50, 0x72, 0x65, 0x66, 0x69, - 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x50, 0x61, 0x74, 0x68, 0x50, 0x72, 0x65, - 0x66, 0x69, 0x78, 0x12, 0x1c, 0x0a, 0x09, 0x50, 0x61, 0x74, 0x68, 0x52, 0x65, 0x67, 0x65, 0x78, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x50, 0x61, 0x74, 0x68, 0x52, 0x65, 0x67, 0x65, - 0x78, 0x12, 0x5c, 0x0a, 0x06, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x04, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x44, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, - 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x74, - 0x69, 0x6f, 0x6e, 0x48, 0x54, 0x54, 0x50, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x50, 0x65, 0x72, - 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x06, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, - 0x18, 0x0a, 0x07, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, - 0x52, 0x07, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x73, 0x22, 0xc1, 0x01, 0x0a, 0x1d, 0x49, 0x6e, - 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x54, 0x54, 0x50, 0x48, 0x65, 0x61, 0x64, 0x65, - 0x72, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x4e, + 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x53, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x53, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x12, 0x56, 0x0a, 0x04, 0x4d, 0x65, 0x74, 0x61, 0x18, 0x02, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x42, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, + 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, + 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x53, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4d, + 0x65, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x4d, 0x65, 0x74, 0x61, 0x1a, 0x37, + 0x0a, 0x09, 0x4d, 0x65, 0x74, 0x61, 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, 0x22, 0xa6, 0x06, 0x0a, 0x0f, 0x53, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, - 0x18, 0x0a, 0x07, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x07, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x45, 0x78, 0x61, - 0x63, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x45, 0x78, 0x61, 0x63, 0x74, 0x12, - 0x16, 0x0a, 0x06, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x06, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x12, 0x16, 0x0a, 0x06, 0x53, 0x75, 0x66, 0x66, 0x69, - 0x78, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x53, 0x75, 0x66, 0x66, 0x69, 0x78, 0x12, - 0x14, 0x0a, 0x05, 0x52, 0x65, 0x67, 0x65, 0x78, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x52, 0x65, 0x67, 0x65, 0x78, 0x12, 0x16, 0x0a, 0x06, 0x49, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x18, - 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x49, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x22, 0xb6, 0x08, - 0x0a, 0x0f, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, - 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x44, 0x0a, - 0x04, 0x4d, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x30, 0x2e, 0x68, 0x61, + 0x4e, 0x0a, 0x06, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x36, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, + 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, + 0x6e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x06, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x5c, 0x0a, 0x0b, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, + 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, + 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x49, 0x6e, 0x74, + 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, + 0x52, 0x0b, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1e, 0x0a, + 0x0a, 0x50, 0x72, 0x65, 0x63, 0x65, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x0a, 0x50, 0x72, 0x65, 0x63, 0x65, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x1a, 0x0a, + 0x08, 0x4c, 0x65, 0x67, 0x61, 0x63, 0x79, 0x49, 0x44, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x4c, 0x65, 0x67, 0x61, 0x63, 0x79, 0x49, 0x44, 0x12, 0x4e, 0x0a, 0x04, 0x54, 0x79, 0x70, + 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x3a, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, + 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, + 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, + 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, + 0x79, 0x70, 0x65, 0x52, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x44, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, + 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x66, 0x0a, 0x0a, 0x4c, + 0x65, 0x67, 0x61, 0x63, 0x79, 0x4d, 0x65, 0x74, 0x61, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x46, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, + 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, + 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x4c, 0x65, 0x67, 0x61, 0x63, 0x79, 0x4d, 0x65, + 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x4c, 0x65, 0x67, 0x61, 0x63, 0x79, 0x4d, + 0x65, 0x74, 0x61, 0x12, 0x46, 0x0a, 0x10, 0x4c, 0x65, 0x67, 0x61, 0x63, 0x79, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x10, 0x4c, 0x65, 0x67, 0x61, 0x63, + 0x79, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x46, 0x0a, 0x10, 0x4c, + 0x65, 0x67, 0x61, 0x63, 0x79, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x18, + 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, + 0x70, 0x52, 0x10, 0x4c, 0x65, 0x67, 0x61, 0x63, 0x79, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, + 0x69, 0x6d, 0x65, 0x12, 0x58, 0x0a, 0x0e, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, + 0x65, 0x4d, 0x65, 0x74, 0x61, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, - 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, - 0x74, 0x72, 0x79, 0x2e, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x04, 0x4d, - 0x6f, 0x64, 0x65, 0x12, 0x69, 0x0a, 0x10, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x61, 0x72, 0x65, - 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3d, 0x2e, + 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, + 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x52, 0x0e, 0x45, + 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x12, 0x0a, + 0x04, 0x50, 0x65, 0x65, 0x72, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x50, 0x65, 0x65, + 0x72, 0x1a, 0x3d, 0x0a, 0x0f, 0x4c, 0x65, 0x67, 0x61, 0x63, 0x79, 0x4d, 0x65, 0x74, 0x61, 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, + 0x22, 0xb9, 0x01, 0x0a, 0x13, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, + 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x4e, 0x0a, 0x06, 0x41, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x36, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, + 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, + 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, + 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x52, 0x06, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x52, 0x0a, 0x04, 0x48, 0x54, 0x54, 0x50, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3e, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, + 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, + 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x49, + 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x54, 0x54, 0x50, 0x50, 0x65, 0x72, 0x6d, + 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x04, 0x48, 0x54, 0x54, 0x50, 0x22, 0xed, 0x01, 0x0a, + 0x17, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x54, 0x54, 0x50, 0x50, 0x65, + 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x50, 0x61, 0x74, 0x68, + 0x45, 0x78, 0x61, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x50, 0x61, 0x74, + 0x68, 0x45, 0x78, 0x61, 0x63, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x50, 0x61, 0x74, 0x68, 0x50, 0x72, + 0x65, 0x66, 0x69, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x50, 0x61, 0x74, 0x68, + 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x12, 0x1c, 0x0a, 0x09, 0x50, 0x61, 0x74, 0x68, 0x52, 0x65, + 0x67, 0x65, 0x78, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x50, 0x61, 0x74, 0x68, 0x52, + 0x65, 0x67, 0x65, 0x78, 0x12, 0x5c, 0x0a, 0x06, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x04, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x44, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, + 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, + 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x49, 0x6e, 0x74, + 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x54, 0x54, 0x50, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, + 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x06, 0x48, 0x65, 0x61, 0x64, + 0x65, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x73, 0x18, 0x05, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x07, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x73, 0x22, 0xc1, 0x01, 0x0a, + 0x1d, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x54, 0x54, 0x50, 0x48, 0x65, + 0x61, 0x64, 0x65, 0x72, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x12, + 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, + 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x07, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x12, 0x14, 0x0a, 0x05, + 0x45, 0x78, 0x61, 0x63, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x45, 0x78, 0x61, + 0x63, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x06, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x12, 0x16, 0x0a, 0x06, 0x53, 0x75, + 0x66, 0x66, 0x69, 0x78, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x53, 0x75, 0x66, 0x66, + 0x69, 0x78, 0x12, 0x14, 0x0a, 0x05, 0x52, 0x65, 0x67, 0x65, 0x78, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x52, 0x65, 0x67, 0x65, 0x78, 0x12, 0x16, 0x0a, 0x06, 0x49, 0x6e, 0x76, 0x65, + 0x72, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x49, 0x6e, 0x76, 0x65, 0x72, 0x74, + 0x22, 0xb6, 0x08, 0x0a, 0x0f, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x44, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, + 0x12, 0x44, 0x0a, 0x04, 0x4d, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x30, + 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, + 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x4d, 0x6f, 0x64, 0x65, + 0x52, 0x04, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x69, 0x0a, 0x10, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, + 0x61, 0x72, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x3d, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, + 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x61, + 0x72, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, + 0x10, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x78, + 0x79, 0x12, 0x5a, 0x0a, 0x0b, 0x4d, 0x65, 0x73, 0x68, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, + 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, + 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x4d, + 0x65, 0x73, 0x68, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x52, 0x0b, 0x4d, 0x65, 0x73, 0x68, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x12, 0x4b, 0x0a, + 0x06, 0x45, 0x78, 0x70, 0x6f, 0x73, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x61, 0x72, 0x65, 0x6e, - 0x74, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x10, 0x54, 0x72, - 0x61, 0x6e, 0x73, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x12, 0x5a, - 0x0a, 0x0b, 0x4d, 0x65, 0x73, 0x68, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, - 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, - 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x4d, 0x65, 0x73, 0x68, - 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x0b, 0x4d, - 0x65, 0x73, 0x68, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x12, 0x4b, 0x0a, 0x06, 0x45, 0x78, - 0x70, 0x6f, 0x73, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x68, 0x61, 0x73, - 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, - 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, - 0x72, 0x79, 0x2e, 0x45, 0x78, 0x70, 0x6f, 0x73, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, - 0x06, 0x45, 0x78, 0x70, 0x6f, 0x73, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x45, 0x78, 0x74, 0x65, 0x72, - 0x6e, 0x61, 0x6c, 0x53, 0x4e, 0x49, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x45, 0x78, - 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x53, 0x4e, 0x49, 0x12, 0x64, 0x0a, 0x0e, 0x55, 0x70, 0x73, - 0x74, 0x72, 0x65, 0x61, 0x6d, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x07, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x3c, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, - 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x55, 0x70, 0x73, 0x74, 0x72, 0x65, - 0x61, 0x6d, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x0e, 0x55, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, - 0x5a, 0x0a, 0x0b, 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x08, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, + 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x45, 0x78, 0x70, 0x6f, 0x73, 0x65, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x52, 0x06, 0x45, 0x78, 0x70, 0x6f, 0x73, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x45, 0x78, + 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x53, 0x4e, 0x49, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0b, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x53, 0x4e, 0x49, 0x12, 0x64, 0x0a, 0x0e, + 0x55, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x07, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3c, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, - 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x44, 0x65, 0x73, - 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x0b, - 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x34, 0x0a, 0x15, 0x4d, + 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x55, 0x70, 0x73, + 0x74, 0x72, 0x65, 0x61, 0x6d, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x0e, 0x55, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x12, 0x5a, 0x0a, 0x0b, 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, + 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, + 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, + 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x52, 0x0b, 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x34, + 0x0a, 0x15, 0x4d, 0x61, 0x78, 0x49, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x6f, 0x6e, 0x6e, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x52, 0x15, 0x4d, 0x61, 0x78, 0x49, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x52, 0x15, 0x4d, 0x61, 0x78, 0x49, - 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x12, 0x34, 0x0a, 0x15, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, - 0x74, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x4d, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x15, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x54, 0x69, - 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x4d, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x4c, 0x6f, 0x63, 0x61, 0x6c, + 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x43, 0x6f, 0x6e, + 0x6e, 0x65, 0x63, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x4d, 0x73, 0x18, 0x0a, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x15, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, + 0x74, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x4d, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x4c, 0x6f, + 0x63, 0x61, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, + 0x74, 0x4d, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x05, 0x52, 0x15, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x4d, 0x73, - 0x18, 0x0b, 0x20, 0x01, 0x28, 0x05, 0x52, 0x15, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x4d, 0x73, 0x12, 0x3c, 0x0a, - 0x19, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, - 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x19, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, - 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x54, 0x0a, 0x04, 0x4d, - 0x65, 0x74, 0x61, 0x18, 0x0d, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x40, 0x2e, 0x68, 0x61, 0x73, 0x68, - 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, - 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, - 0x79, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, - 0x73, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x4d, 0x65, 0x74, - 0x61, 0x12, 0x5a, 0x0a, 0x0f, 0x45, 0x6e, 0x76, 0x6f, 0x79, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, - 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x0e, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x68, 0x61, 0x73, - 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, - 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6e, - 0x76, 0x6f, 0x79, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x0f, 0x45, 0x6e, - 0x76, 0x6f, 0x79, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x37, 0x0a, - 0x09, 0x4d, 0x65, 0x74, 0x61, 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, 0x22, 0x74, 0x0a, 0x16, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, - 0x61, 0x72, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x12, 0x32, 0x0a, 0x14, 0x4f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x4c, 0x69, 0x73, 0x74, - 0x65, 0x6e, 0x65, 0x72, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x14, - 0x4f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, - 0x50, 0x6f, 0x72, 0x74, 0x12, 0x26, 0x0a, 0x0e, 0x44, 0x69, 0x61, 0x6c, 0x65, 0x64, 0x44, 0x69, - 0x72, 0x65, 0x63, 0x74, 0x6c, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x44, 0x69, - 0x61, 0x6c, 0x65, 0x64, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6c, 0x79, 0x22, 0x5f, 0x0a, 0x11, - 0x4d, 0x65, 0x73, 0x68, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x12, 0x4a, 0x0a, 0x04, 0x4d, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, - 0x36, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, - 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x4d, 0x65, 0x73, 0x68, 0x47, 0x61, 0x74, 0x65, - 0x77, 0x61, 0x79, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x04, 0x4d, 0x6f, 0x64, 0x65, 0x22, 0x6f, 0x0a, - 0x0c, 0x45, 0x78, 0x70, 0x6f, 0x73, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x16, 0x0a, - 0x06, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x43, - 0x68, 0x65, 0x63, 0x6b, 0x73, 0x12, 0x47, 0x0a, 0x05, 0x50, 0x61, 0x74, 0x68, 0x73, 0x18, 0x02, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, - 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, - 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x45, 0x78, 0x70, - 0x6f, 0x73, 0x65, 0x50, 0x61, 0x74, 0x68, 0x52, 0x05, 0x50, 0x61, 0x74, 0x68, 0x73, 0x22, 0xb0, - 0x01, 0x0a, 0x0a, 0x45, 0x78, 0x70, 0x6f, 0x73, 0x65, 0x50, 0x61, 0x74, 0x68, 0x12, 0x22, 0x0a, - 0x0c, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x0c, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x50, 0x6f, 0x72, - 0x74, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x50, 0x61, 0x74, 0x68, 0x12, 0x24, 0x0a, 0x0d, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x50, 0x61, - 0x74, 0x68, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x4c, 0x6f, - 0x63, 0x61, 0x6c, 0x50, 0x61, 0x74, 0x68, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x50, - 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x50, - 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x28, 0x0a, 0x0f, 0x50, 0x61, 0x72, 0x73, 0x65, - 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x0f, 0x50, 0x61, 0x72, 0x73, 0x65, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x43, 0x68, 0x65, 0x63, - 0x6b, 0x22, 0xbf, 0x01, 0x0a, 0x15, 0x55, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x43, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x53, 0x0a, 0x09, 0x4f, - 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x35, - 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, - 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x55, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x09, 0x4f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x73, - 0x12, 0x51, 0x0a, 0x08, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, - 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x55, 0x70, 0x73, 0x74, 0x72, - 0x65, 0x61, 0x6d, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x08, 0x44, 0x65, 0x66, 0x61, 0x75, - 0x6c, 0x74, 0x73, 0x22, 0x8a, 0x05, 0x0a, 0x0e, 0x55, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x58, 0x0a, 0x0e, 0x45, 0x6e, - 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, + 0x12, 0x3c, 0x0a, 0x19, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x6e, 0x62, 0x6f, 0x75, + 0x6e, 0x64, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x0c, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x19, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x6e, 0x62, 0x6f, + 0x75, 0x6e, 0x64, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x54, + 0x0a, 0x04, 0x4d, 0x65, 0x74, 0x61, 0x18, 0x0d, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x40, 0x2e, 0x68, + 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, + 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, + 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x44, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x73, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, + 0x4d, 0x65, 0x74, 0x61, 0x12, 0x5a, 0x0a, 0x0f, 0x45, 0x6e, 0x76, 0x6f, 0x79, 0x45, 0x78, 0x74, + 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x0e, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x30, 0x2e, + 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, + 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, + 0x2e, 0x45, 0x6e, 0x76, 0x6f, 0x79, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x52, + 0x0f, 0x45, 0x6e, 0x76, 0x6f, 0x79, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, + 0x1a, 0x37, 0x0a, 0x09, 0x4d, 0x65, 0x74, 0x61, 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, 0x22, 0x74, 0x0a, 0x16, 0x54, 0x72, 0x61, + 0x6e, 0x73, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x12, 0x32, 0x0a, 0x14, 0x4f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x4c, + 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x14, 0x4f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x65, + 0x6e, 0x65, 0x72, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x26, 0x0a, 0x0e, 0x44, 0x69, 0x61, 0x6c, 0x65, + 0x64, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6c, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x0e, 0x44, 0x69, 0x61, 0x6c, 0x65, 0x64, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6c, 0x79, 0x22, + 0x5f, 0x0a, 0x11, 0x4d, 0x65, 0x73, 0x68, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x12, 0x4a, 0x0a, 0x04, 0x4d, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x36, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, - 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, - 0x4d, 0x65, 0x74, 0x61, 0x52, 0x0e, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, - 0x4d, 0x65, 0x74, 0x61, 0x12, 0x2c, 0x0a, 0x11, 0x45, 0x6e, 0x76, 0x6f, 0x79, 0x4c, 0x69, 0x73, - 0x74, 0x65, 0x6e, 0x65, 0x72, 0x4a, 0x53, 0x4f, 0x4e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x11, 0x45, 0x6e, 0x76, 0x6f, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x4a, 0x53, - 0x4f, 0x4e, 0x12, 0x2a, 0x0a, 0x10, 0x45, 0x6e, 0x76, 0x6f, 0x79, 0x43, 0x6c, 0x75, 0x73, 0x74, - 0x65, 0x72, 0x4a, 0x53, 0x4f, 0x4e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x45, 0x6e, - 0x76, 0x6f, 0x79, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4a, 0x53, 0x4f, 0x4e, 0x12, 0x1a, - 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x2a, 0x0a, 0x10, 0x43, 0x6f, - 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x4d, 0x73, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x10, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x54, 0x69, 0x6d, - 0x65, 0x6f, 0x75, 0x74, 0x4d, 0x73, 0x12, 0x4d, 0x0a, 0x06, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, - 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, - 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, - 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x55, - 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x52, 0x06, 0x4c, - 0x69, 0x6d, 0x69, 0x74, 0x73, 0x12, 0x69, 0x0a, 0x12, 0x50, 0x61, 0x73, 0x73, 0x69, 0x76, 0x65, - 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x18, 0x08, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x39, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x4d, 0x65, 0x73, 0x68, 0x47, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x04, 0x4d, 0x6f, 0x64, 0x65, + 0x22, 0x6f, 0x0a, 0x0c, 0x45, 0x78, 0x70, 0x6f, 0x73, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x12, 0x16, 0x0a, 0x06, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x06, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x12, 0x47, 0x0a, 0x05, 0x50, 0x61, 0x74, 0x68, + 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, + 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, + 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, + 0x45, 0x78, 0x70, 0x6f, 0x73, 0x65, 0x50, 0x61, 0x74, 0x68, 0x52, 0x05, 0x50, 0x61, 0x74, 0x68, + 0x73, 0x22, 0xb0, 0x01, 0x0a, 0x0a, 0x45, 0x78, 0x70, 0x6f, 0x73, 0x65, 0x50, 0x61, 0x74, 0x68, + 0x12, 0x22, 0x0a, 0x0c, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x50, 0x6f, 0x72, 0x74, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, + 0x50, 0x6f, 0x72, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x50, 0x61, 0x74, 0x68, 0x12, 0x24, 0x0a, 0x0d, 0x4c, 0x6f, 0x63, 0x61, + 0x6c, 0x50, 0x61, 0x74, 0x68, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x0d, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x50, 0x61, 0x74, 0x68, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x1a, + 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x28, 0x0a, 0x0f, 0x50, 0x61, + 0x72, 0x73, 0x65, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x0f, 0x50, 0x61, 0x72, 0x73, 0x65, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x43, + 0x68, 0x65, 0x63, 0x6b, 0x22, 0xbf, 0x01, 0x0a, 0x15, 0x55, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, + 0x6d, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x53, + 0x0a, 0x09, 0x4f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x35, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x50, 0x61, 0x73, 0x73, 0x69, 0x76, - 0x65, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x12, 0x50, 0x61, - 0x73, 0x73, 0x69, 0x76, 0x65, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, - 0x12, 0x5a, 0x0a, 0x0b, 0x4d, 0x65, 0x73, 0x68, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x18, - 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, + 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x55, 0x70, 0x73, 0x74, 0x72, 0x65, + 0x61, 0x6d, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x09, 0x4f, 0x76, 0x65, 0x72, 0x72, 0x69, + 0x64, 0x65, 0x73, 0x12, 0x51, 0x0a, 0x08, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, - 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x4d, 0x65, - 0x73, 0x68, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, - 0x0b, 0x4d, 0x65, 0x73, 0x68, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x12, 0x3e, 0x0a, 0x1a, - 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x4f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, - 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x1a, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x4f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, - 0x64, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x12, 0x0a, 0x04, - 0x50, 0x65, 0x65, 0x72, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x50, 0x65, 0x65, 0x72, - 0x22, 0x9e, 0x01, 0x0a, 0x0e, 0x55, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x4c, 0x69, 0x6d, - 0x69, 0x74, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x4d, 0x61, 0x78, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x4d, 0x61, 0x78, - 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2e, 0x0a, 0x12, 0x4d, - 0x61, 0x78, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x12, 0x4d, 0x61, 0x78, 0x50, 0x65, 0x6e, 0x64, - 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x4d, - 0x61, 0x78, 0x43, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x15, 0x4d, 0x61, 0x78, 0x43, - 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x73, 0x22, 0xa7, 0x01, 0x0a, 0x12, 0x50, 0x61, 0x73, 0x73, 0x69, 0x76, 0x65, 0x48, 0x65, 0x61, - 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x12, 0x35, 0x0a, 0x08, 0x49, 0x6e, 0x74, 0x65, - 0x72, 0x76, 0x61, 0x6c, 0x18, 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, 0x52, 0x08, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x12, - 0x20, 0x0a, 0x0b, 0x4d, 0x61, 0x78, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x73, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x4d, 0x61, 0x78, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, - 0x73, 0x12, 0x38, 0x0a, 0x17, 0x45, 0x6e, 0x66, 0x6f, 0x72, 0x63, 0x69, 0x6e, 0x67, 0x43, 0x6f, - 0x6e, 0x73, 0x65, 0x63, 0x75, 0x74, 0x69, 0x76, 0x65, 0x35, 0x78, 0x78, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x17, 0x45, 0x6e, 0x66, 0x6f, 0x72, 0x63, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6e, - 0x73, 0x65, 0x63, 0x75, 0x74, 0x69, 0x76, 0x65, 0x35, 0x78, 0x78, 0x22, 0x45, 0x0a, 0x11, 0x44, - 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x12, 0x1c, 0x0a, 0x09, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x09, 0x52, 0x09, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x12, 0x12, - 0x0a, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x50, 0x6f, - 0x72, 0x74, 0x22, 0xb6, 0x02, 0x0a, 0x0a, 0x41, 0x50, 0x49, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, - 0x79, 0x12, 0x4f, 0x0a, 0x04, 0x4d, 0x65, 0x74, 0x61, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x3b, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, - 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x41, 0x50, 0x49, 0x47, 0x61, 0x74, 0x65, 0x77, - 0x61, 0x79, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x4d, 0x65, - 0x74, 0x61, 0x12, 0x57, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x73, 0x18, - 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, + 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x55, 0x70, + 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x08, 0x44, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x22, 0x8a, 0x05, 0x0a, 0x0e, 0x55, 0x70, 0x73, 0x74, 0x72, + 0x65, 0x61, 0x6d, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x58, 0x0a, + 0x0e, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, - 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x41, 0x50, - 0x49, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, - 0x52, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x73, 0x12, 0x45, 0x0a, 0x06, 0x53, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x68, 0x61, - 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, - 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, - 0x74, 0x72, 0x79, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x1a, 0x37, 0x0a, 0x09, 0x4d, 0x65, 0x74, 0x61, 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, 0x22, 0x5a, 0x0a, 0x06, 0x53, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x50, 0x0a, 0x0a, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x68, 0x61, 0x73, 0x68, + 0x6c, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, + 0x69, 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x52, 0x0e, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, + 0x69, 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x2c, 0x0a, 0x11, 0x45, 0x6e, 0x76, 0x6f, 0x79, + 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x4a, 0x53, 0x4f, 0x4e, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x11, 0x45, 0x6e, 0x76, 0x6f, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, + 0x72, 0x4a, 0x53, 0x4f, 0x4e, 0x12, 0x2a, 0x0a, 0x10, 0x45, 0x6e, 0x76, 0x6f, 0x79, 0x43, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x4a, 0x53, 0x4f, 0x4e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x10, 0x45, 0x6e, 0x76, 0x6f, 0x79, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4a, 0x53, 0x4f, + 0x4e, 0x12, 0x1a, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x2a, 0x0a, + 0x10, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x4d, + 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x10, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, + 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x4d, 0x73, 0x12, 0x4d, 0x0a, 0x06, 0x4c, 0x69, 0x6d, + 0x69, 0x74, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, - 0x79, 0x2e, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x43, 0x6f, 0x6e, - 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x8b, 0x02, 0x0a, 0x09, 0x43, 0x6f, 0x6e, 0x64, - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x12, 0x16, 0x0a, 0x06, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x06, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x4d, 0x65, 0x73, - 0x73, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x4d, 0x65, 0x73, 0x73, - 0x61, 0x67, 0x65, 0x12, 0x54, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, - 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, - 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x52, 0x65, - 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, - 0x08, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x4a, 0x0a, 0x12, 0x4c, 0x61, 0x73, - 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, - 0x70, 0x52, 0x12, 0x4c, 0x61, 0x73, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, - 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x22, 0x8c, 0x02, 0x0a, 0x12, 0x41, 0x50, 0x49, 0x47, 0x61, 0x74, - 0x65, 0x77, 0x61, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, - 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, - 0x12, 0x1a, 0x0a, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, - 0x50, 0x6f, 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x50, 0x6f, 0x72, 0x74, - 0x12, 0x5d, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x0e, 0x32, 0x41, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, + 0x79, 0x2e, 0x55, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, + 0x52, 0x06, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x12, 0x69, 0x0a, 0x12, 0x50, 0x61, 0x73, 0x73, + 0x69, 0x76, 0x65, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x18, 0x08, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, + 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, + 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x50, 0x61, 0x73, + 0x73, 0x69, 0x76, 0x65, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, + 0x12, 0x50, 0x61, 0x73, 0x73, 0x69, 0x76, 0x65, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, + 0x65, 0x63, 0x6b, 0x12, 0x5a, 0x0a, 0x0b, 0x4d, 0x65, 0x73, 0x68, 0x47, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, + 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, + 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, + 0x2e, 0x4d, 0x65, 0x73, 0x68, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x52, 0x0b, 0x4d, 0x65, 0x73, 0x68, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x12, + 0x3e, 0x0a, 0x1a, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x4f, 0x75, 0x74, 0x62, 0x6f, 0x75, + 0x6e, 0x64, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x0a, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x1a, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x4f, 0x75, 0x74, 0x62, + 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, + 0x12, 0x0a, 0x04, 0x50, 0x65, 0x65, 0x72, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x50, + 0x65, 0x65, 0x72, 0x22, 0x9e, 0x01, 0x0a, 0x0e, 0x55, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, + 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x4d, 0x61, 0x78, 0x43, 0x6f, 0x6e, + 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, + 0x4d, 0x61, 0x78, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2e, + 0x0a, 0x12, 0x4d, 0x61, 0x78, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x12, 0x4d, 0x61, 0x78, 0x50, + 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x12, 0x34, + 0x0a, 0x15, 0x4d, 0x61, 0x78, 0x43, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x15, 0x4d, + 0x61, 0x78, 0x43, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x73, 0x22, 0xa7, 0x01, 0x0a, 0x12, 0x50, 0x61, 0x73, 0x73, 0x69, 0x76, 0x65, + 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x12, 0x35, 0x0a, 0x08, 0x49, + 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 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, 0x52, 0x08, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, + 0x61, 0x6c, 0x12, 0x20, 0x0a, 0x0b, 0x4d, 0x61, 0x78, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, + 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x4d, 0x61, 0x78, 0x46, 0x61, 0x69, 0x6c, + 0x75, 0x72, 0x65, 0x73, 0x12, 0x38, 0x0a, 0x17, 0x45, 0x6e, 0x66, 0x6f, 0x72, 0x63, 0x69, 0x6e, + 0x67, 0x43, 0x6f, 0x6e, 0x73, 0x65, 0x63, 0x75, 0x74, 0x69, 0x76, 0x65, 0x35, 0x78, 0x78, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x17, 0x45, 0x6e, 0x66, 0x6f, 0x72, 0x63, 0x69, 0x6e, 0x67, + 0x43, 0x6f, 0x6e, 0x73, 0x65, 0x63, 0x75, 0x74, 0x69, 0x76, 0x65, 0x35, 0x78, 0x78, 0x22, 0x45, + 0x0a, 0x11, 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x12, 0x1c, 0x0a, 0x09, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, + 0x73, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x04, 0x50, 0x6f, 0x72, 0x74, 0x22, 0xb6, 0x02, 0x0a, 0x0a, 0x41, 0x50, 0x49, 0x47, 0x61, 0x74, + 0x65, 0x77, 0x61, 0x79, 0x12, 0x4f, 0x0a, 0x04, 0x4d, 0x65, 0x74, 0x61, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x3b, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x41, 0x50, 0x49, 0x47, 0x61, - 0x74, 0x65, 0x77, 0x61, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x50, 0x72, 0x6f, - 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x52, 0x08, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, - 0x53, 0x0a, 0x03, 0x54, 0x4c, 0x53, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x41, 0x2e, 0x68, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, + 0x04, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x57, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, + 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, + 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, + 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, + 0x2e, 0x41, 0x50, 0x49, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x65, + 0x6e, 0x65, 0x72, 0x52, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x73, 0x12, 0x45, + 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, + 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, + 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x1a, 0x37, 0x0a, 0x09, 0x4d, 0x65, 0x74, 0x61, 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, 0x22, 0x5a, + 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x50, 0x0a, 0x0a, 0x43, 0x6f, 0x6e, 0x64, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, - 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x41, 0x50, 0x49, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x54, - 0x4c, 0x53, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x03, 0x54, 0x4c, 0x53, 0x22, 0xde, 0x01, 0x0a, 0x1a, 0x41, 0x50, 0x49, 0x47, 0x61, 0x74, 0x65, - 0x77, 0x61, 0x79, 0x54, 0x4c, 0x53, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0x5c, 0x0a, 0x0c, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, - 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x68, 0x61, 0x73, 0x68, + 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, + 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x8b, 0x02, 0x0a, 0x09, 0x43, + 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, + 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x4d, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x54, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, + 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, + 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, + 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x63, 0x65, 0x52, 0x08, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x4a, 0x0a, 0x12, + 0x4c, 0x61, 0x73, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, + 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, + 0x74, 0x61, 0x6d, 0x70, 0x52, 0x12, 0x4c, 0x61, 0x73, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x22, 0x8c, 0x02, 0x0a, 0x12, 0x41, 0x50, 0x49, + 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, + 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, + 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, + 0x12, 0x0a, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x50, + 0x6f, 0x72, 0x74, 0x12, 0x5d, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x41, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, + 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, + 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x41, 0x50, + 0x49, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, + 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x52, 0x08, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, + 0x6f, 0x6c, 0x12, 0x53, 0x0a, 0x03, 0x54, 0x4c, 0x53, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x41, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, + 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x41, 0x50, 0x49, 0x47, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x54, 0x4c, 0x53, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x03, 0x54, 0x4c, 0x53, 0x22, 0xde, 0x01, 0x0a, 0x1a, 0x41, 0x50, 0x49, 0x47, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x54, 0x4c, 0x53, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x5c, 0x0a, 0x0c, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, + 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x68, + 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, + 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, + 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x0c, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, + 0x61, 0x74, 0x65, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x4d, 0x69, 0x6e, 0x56, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x4d, 0x69, 0x6e, 0x56, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x4d, 0x61, 0x78, 0x56, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x4d, 0x61, 0x78, 0x56, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x22, 0x0a, 0x0c, 0x43, 0x69, 0x70, 0x68, 0x65, 0x72, 0x53, 0x75, + 0x69, 0x74, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x43, 0x69, 0x70, 0x68, + 0x65, 0x72, 0x53, 0x75, 0x69, 0x74, 0x65, 0x73, 0x22, 0xb7, 0x01, 0x0a, 0x11, 0x52, 0x65, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x12, + 0x0a, 0x04, 0x4b, 0x69, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4b, 0x69, + 0x6e, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x53, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x53, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x58, 0x0a, 0x0e, 0x45, 0x6e, 0x74, 0x65, + 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x30, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, + 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6d, + 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x4d, 0x65, + 0x74, 0x61, 0x52, 0x0e, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x4d, 0x65, + 0x74, 0x61, 0x22, 0xfe, 0x01, 0x0a, 0x0f, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x41, 0x50, 0x49, 0x47, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x12, 0x54, 0x0a, 0x04, 0x4d, 0x65, 0x74, 0x61, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x40, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, + 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, + 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x42, 0x6f, 0x75, + 0x6e, 0x64, 0x41, 0x50, 0x49, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4d, 0x65, 0x74, + 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x5c, 0x0a, 0x09, + 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x3e, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, + 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x41, 0x50, 0x49, + 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, + 0x09, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x73, 0x1a, 0x37, 0x0a, 0x09, 0x4d, 0x65, + 0x74, 0x61, 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, 0x22, 0xdd, 0x01, 0x0a, 0x17, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x41, 0x50, 0x49, + 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, + 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, + 0x61, 0x6d, 0x65, 0x12, 0x5c, 0x0a, 0x0c, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, + 0x74, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x0c, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, - 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x4d, 0x69, 0x6e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x4d, 0x69, 0x6e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x4d, 0x61, 0x78, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x4d, 0x61, 0x78, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x12, 0x22, 0x0a, 0x0c, 0x43, 0x69, 0x70, 0x68, 0x65, 0x72, 0x53, 0x75, 0x69, 0x74, 0x65, - 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x43, 0x69, 0x70, 0x68, 0x65, 0x72, 0x53, - 0x75, 0x69, 0x74, 0x65, 0x73, 0x22, 0xb7, 0x01, 0x0a, 0x11, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x4b, - 0x69, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4b, 0x69, 0x6e, 0x64, 0x12, - 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, - 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x53, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, - 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x53, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x58, 0x0a, 0x0e, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, - 0x69, 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, - 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, - 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, - 0x2e, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x52, - 0x0e, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x22, - 0xfe, 0x01, 0x0a, 0x0f, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x41, 0x50, 0x49, 0x47, 0x61, 0x74, 0x65, - 0x77, 0x61, 0x79, 0x12, 0x54, 0x0a, 0x04, 0x4d, 0x65, 0x74, 0x61, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x40, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, + 0x73, 0x12, 0x50, 0x0a, 0x06, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x38, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x41, - 0x50, 0x49, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x52, 0x04, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x5c, 0x0a, 0x09, 0x4c, 0x69, 0x73, - 0x74, 0x65, 0x6e, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3e, 0x2e, 0x68, - 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, - 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, - 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x41, 0x50, 0x49, 0x47, 0x61, 0x74, - 0x65, 0x77, 0x61, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x09, 0x4c, 0x69, - 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x73, 0x1a, 0x37, 0x0a, 0x09, 0x4d, 0x65, 0x74, 0x61, 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, - 0x22, 0xdd, 0x01, 0x0a, 0x17, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x41, 0x50, 0x49, 0x47, 0x61, 0x74, - 0x65, 0x77, 0x61, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, - 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, - 0x12, 0x5c, 0x0a, 0x0c, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, - 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, - 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, - 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x52, - 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, - 0x52, 0x0c, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, 0x12, 0x50, - 0x0a, 0x06, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x38, - 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, - 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, - 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x06, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x73, - 0x22, 0xe6, 0x01, 0x0a, 0x11, 0x49, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x43, 0x65, 0x72, 0x74, 0x69, - 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x12, 0x56, 0x0a, 0x04, 0x4d, 0x65, 0x74, 0x61, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x42, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, - 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, - 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x49, 0x6e, 0x6c, - 0x69, 0x6e, 0x65, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x2e, 0x4d, - 0x65, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x20, - 0x0a, 0x0b, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0b, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, - 0x12, 0x1e, 0x0a, 0x0a, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, - 0x1a, 0x37, 0x0a, 0x09, 0x4d, 0x65, 0x74, 0x61, 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, 0x22, 0x99, 0x03, 0x0a, 0x09, 0x48, 0x54, - 0x54, 0x50, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x12, 0x4e, 0x0a, 0x04, 0x4d, 0x65, 0x74, 0x61, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, - 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, - 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x48, 0x54, - 0x54, 0x50, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x04, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x52, 0x0a, 0x07, 0x50, 0x61, 0x72, 0x65, 0x6e, - 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, + 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x06, 0x52, 0x6f, 0x75, + 0x74, 0x65, 0x73, 0x22, 0xe6, 0x01, 0x0a, 0x11, 0x49, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x43, 0x65, + 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x12, 0x56, 0x0a, 0x04, 0x4d, 0x65, 0x74, + 0x61, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x42, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, + 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, + 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, + 0x49, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, + 0x65, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x4d, 0x65, 0x74, + 0x61, 0x12, 0x20, 0x0a, 0x0b, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, + 0x61, 0x74, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x4b, 0x65, + 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, + 0x4b, 0x65, 0x79, 0x1a, 0x37, 0x0a, 0x09, 0x4d, 0x65, 0x74, 0x61, 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, 0x22, 0x99, 0x03, 0x0a, + 0x09, 0x48, 0x54, 0x54, 0x50, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x12, 0x4e, 0x0a, 0x04, 0x4d, 0x65, + 0x74, 0x61, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, - 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x52, 0x07, 0x50, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x4a, 0x0a, 0x05, 0x52, - 0x75, 0x6c, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x68, 0x61, 0x73, - 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, - 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, - 0x72, 0x79, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, - 0x52, 0x05, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x48, 0x6f, 0x73, 0x74, 0x6e, - 0x61, 0x6d, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x48, 0x6f, 0x73, 0x74, - 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x45, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, - 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, - 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x1a, 0x37, 0x0a, 0x09, - 0x4d, 0x65, 0x74, 0x61, 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, 0x22, 0xf9, 0x01, 0x0a, 0x0d, 0x48, 0x54, 0x54, 0x50, 0x52, 0x6f, - 0x75, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x4c, 0x0a, 0x07, 0x46, 0x69, 0x6c, 0x74, 0x65, - 0x72, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, + 0x2e, 0x48, 0x54, 0x54, 0x50, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x52, 0x0a, 0x07, 0x50, 0x61, + 0x72, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x68, 0x61, + 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, + 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, + 0x74, 0x72, 0x79, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x07, 0x50, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x4a, + 0x0a, 0x05, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, + 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, + 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x52, + 0x75, 0x6c, 0x65, 0x52, 0x05, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x48, 0x6f, + 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x48, + 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x45, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, - 0x2e, 0x48, 0x54, 0x54, 0x50, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x52, 0x07, 0x46, 0x69, - 0x6c, 0x74, 0x65, 0x72, 0x73, 0x12, 0x4a, 0x0a, 0x07, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, - 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, + 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x1a, + 0x37, 0x0a, 0x09, 0x4d, 0x65, 0x74, 0x61, 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, 0x22, 0xf9, 0x01, 0x0a, 0x0d, 0x48, 0x54, 0x54, + 0x50, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x4c, 0x0a, 0x07, 0x46, 0x69, + 0x6c, 0x74, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x68, 0x61, + 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, + 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, + 0x74, 0x72, 0x79, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x52, + 0x07, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x12, 0x4a, 0x0a, 0x07, 0x4d, 0x61, 0x74, 0x63, + 0x68, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x68, 0x61, 0x73, 0x68, + 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, + 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, + 0x79, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x52, 0x07, 0x4d, 0x61, 0x74, + 0x63, 0x68, 0x65, 0x73, 0x12, 0x4e, 0x0a, 0x08, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, + 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x48, - 0x54, 0x54, 0x50, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x52, 0x07, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, - 0x73, 0x12, 0x4e, 0x0a, 0x08, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x03, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, + 0x54, 0x54, 0x50, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x08, 0x53, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x73, 0x22, 0xc4, 0x02, 0x0a, 0x09, 0x48, 0x54, 0x54, 0x50, 0x4d, 0x61, 0x74, + 0x63, 0x68, 0x12, 0x50, 0x0a, 0x07, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x48, 0x54, 0x54, 0x50, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x08, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x73, 0x22, 0xc4, 0x02, 0x0a, 0x09, 0x48, 0x54, 0x54, 0x50, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x12, - 0x50, 0x0a, 0x07, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x36, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, - 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x48, 0x65, 0x61, - 0x64, 0x65, 0x72, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x52, 0x07, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, - 0x73, 0x12, 0x4e, 0x0a, 0x06, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0e, 0x32, 0x36, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, - 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x4d, 0x61, - 0x74, 0x63, 0x68, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x52, 0x06, 0x4d, 0x65, 0x74, 0x68, 0x6f, - 0x64, 0x12, 0x48, 0x0a, 0x04, 0x50, 0x61, 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x34, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, - 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x50, 0x61, 0x74, 0x68, - 0x4d, 0x61, 0x74, 0x63, 0x68, 0x52, 0x04, 0x50, 0x61, 0x74, 0x68, 0x12, 0x4b, 0x0a, 0x05, 0x51, - 0x75, 0x65, 0x72, 0x79, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x68, 0x61, 0x73, - 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, - 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, - 0x72, 0x79, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4d, 0x61, 0x74, 0x63, - 0x68, 0x52, 0x05, 0x51, 0x75, 0x65, 0x72, 0x79, 0x22, 0x8d, 0x01, 0x0a, 0x0f, 0x48, 0x54, 0x54, - 0x50, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x12, 0x50, 0x0a, 0x05, - 0x4d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x3a, 0x2e, 0x68, 0x61, - 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, - 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, - 0x74, 0x72, 0x79, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x4d, 0x61, - 0x74, 0x63, 0x68, 0x54, 0x79, 0x70, 0x65, 0x52, 0x05, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x12, 0x12, - 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, - 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x75, 0x0a, 0x0d, 0x48, 0x54, 0x54, 0x50, - 0x50, 0x61, 0x74, 0x68, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x12, 0x4e, 0x0a, 0x05, 0x4d, 0x61, 0x74, - 0x63, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x38, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, - 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, - 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, - 0x2e, 0x48, 0x54, 0x54, 0x50, 0x50, 0x61, 0x74, 0x68, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x54, 0x79, - 0x70, 0x65, 0x52, 0x05, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x56, 0x61, 0x6c, - 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x22, - 0x8b, 0x01, 0x0a, 0x0e, 0x48, 0x54, 0x54, 0x50, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4d, 0x61, 0x74, - 0x63, 0x68, 0x12, 0x4f, 0x0a, 0x05, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0e, 0x32, 0x39, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, - 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x51, 0x75, - 0x65, 0x72, 0x79, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x54, 0x79, 0x70, 0x65, 0x52, 0x05, 0x4d, 0x61, - 0x74, 0x63, 0x68, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x56, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x22, 0xb3, 0x01, - 0x0a, 0x0b, 0x48, 0x54, 0x54, 0x50, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x12, 0x51, 0x0a, - 0x07, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x37, + 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x52, 0x07, 0x48, 0x65, 0x61, + 0x64, 0x65, 0x72, 0x73, 0x12, 0x4e, 0x0a, 0x06, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x36, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, + 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, + 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x48, 0x54, 0x54, + 0x50, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x52, 0x06, 0x4d, 0x65, + 0x74, 0x68, 0x6f, 0x64, 0x12, 0x48, 0x0a, 0x04, 0x50, 0x61, 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, + 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x50, + 0x61, 0x74, 0x68, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x52, 0x04, 0x50, 0x61, 0x74, 0x68, 0x12, 0x4b, + 0x0a, 0x05, 0x51, 0x75, 0x65, 0x72, 0x79, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x35, 0x2e, + 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, + 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4d, + 0x61, 0x74, 0x63, 0x68, 0x52, 0x05, 0x51, 0x75, 0x65, 0x72, 0x79, 0x22, 0x8d, 0x01, 0x0a, 0x0f, + 0x48, 0x54, 0x54, 0x50, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x12, + 0x50, 0x0a, 0x05, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x3a, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x48, 0x65, 0x61, 0x64, 0x65, - 0x72, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x52, 0x07, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, - 0x12, 0x51, 0x0a, 0x0a, 0x55, 0x52, 0x4c, 0x52, 0x65, 0x77, 0x72, 0x69, 0x74, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, + 0x72, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x54, 0x79, 0x70, 0x65, 0x52, 0x05, 0x4d, 0x61, 0x74, 0x63, + 0x68, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x75, 0x0a, 0x0d, 0x48, + 0x54, 0x54, 0x50, 0x50, 0x61, 0x74, 0x68, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x12, 0x4e, 0x0a, 0x05, + 0x4d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x38, 0x2e, 0x68, 0x61, + 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, + 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, + 0x74, 0x72, 0x79, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x50, 0x61, 0x74, 0x68, 0x4d, 0x61, 0x74, 0x63, + 0x68, 0x54, 0x79, 0x70, 0x65, 0x52, 0x05, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x12, 0x14, 0x0a, 0x05, + 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x56, 0x61, 0x6c, + 0x75, 0x65, 0x22, 0x8b, 0x01, 0x0a, 0x0e, 0x48, 0x54, 0x54, 0x50, 0x51, 0x75, 0x65, 0x72, 0x79, + 0x4d, 0x61, 0x74, 0x63, 0x68, 0x12, 0x4f, 0x0a, 0x05, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x39, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, - 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x55, 0x52, 0x4c, - 0x52, 0x65, 0x77, 0x72, 0x69, 0x74, 0x65, 0x52, 0x0a, 0x55, 0x52, 0x4c, 0x52, 0x65, 0x77, 0x72, - 0x69, 0x74, 0x65, 0x22, 0x20, 0x0a, 0x0a, 0x55, 0x52, 0x4c, 0x52, 0x65, 0x77, 0x72, 0x69, 0x74, - 0x65, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x50, 0x61, 0x74, 0x68, 0x22, 0xc2, 0x02, 0x0a, 0x10, 0x48, 0x54, 0x54, 0x50, 0x48, 0x65, - 0x61, 0x64, 0x65, 0x72, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x52, 0x0a, 0x03, 0x41, 0x64, - 0x64, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x40, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, - 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, - 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, - 0x48, 0x54, 0x54, 0x50, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, - 0x2e, 0x41, 0x64, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x03, 0x41, 0x64, 0x64, 0x12, 0x16, - 0x0a, 0x06, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, - 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x12, 0x52, 0x0a, 0x03, 0x53, 0x65, 0x74, 0x18, 0x03, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x40, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, - 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, - 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x48, 0x54, 0x54, 0x50, - 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x2e, 0x53, 0x65, 0x74, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x03, 0x53, 0x65, 0x74, 0x1a, 0x36, 0x0a, 0x08, 0x41, 0x64, - 0x64, 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, 0x36, 0x0a, 0x08, 0x53, 0x65, 0x74, 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, 0x22, 0xe1, 0x01, 0x0a, 0x0b, 0x48, - 0x54, 0x54, 0x50, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, - 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x16, - 0x0a, 0x06, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, - 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x4c, 0x0a, 0x07, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, - 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, + 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x48, 0x54, 0x54, + 0x50, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x54, 0x79, 0x70, 0x65, 0x52, + 0x05, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x56, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x56, 0x61, 0x6c, 0x75, 0x65, + 0x22, 0xb3, 0x01, 0x0a, 0x0b, 0x48, 0x54, 0x54, 0x50, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, + 0x12, 0x51, 0x0a, 0x07, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x37, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, + 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x48, 0x65, + 0x61, 0x64, 0x65, 0x72, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x52, 0x07, 0x48, 0x65, 0x61, 0x64, + 0x65, 0x72, 0x73, 0x12, 0x51, 0x0a, 0x0a, 0x55, 0x52, 0x4c, 0x52, 0x65, 0x77, 0x72, 0x69, 0x74, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, - 0x48, 0x54, 0x54, 0x50, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x52, 0x07, 0x46, 0x69, 0x6c, - 0x74, 0x65, 0x72, 0x73, 0x12, 0x58, 0x0a, 0x0e, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, - 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x68, - 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, - 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, - 0x45, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x52, 0x0e, - 0x45, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x22, 0xfc, - 0x02, 0x0a, 0x08, 0x54, 0x43, 0x50, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x12, 0x4d, 0x0a, 0x04, 0x4d, - 0x65, 0x74, 0x61, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x68, 0x61, 0x73, 0x68, - 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, - 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, - 0x79, 0x2e, 0x54, 0x43, 0x50, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x52, 0x0a, 0x07, 0x50, 0x61, - 0x72, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x68, 0x61, - 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, - 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, - 0x74, 0x72, 0x79, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x66, 0x65, - 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x07, 0x50, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x4d, - 0x0a, 0x08, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x31, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, - 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x54, 0x43, 0x50, 0x53, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x52, 0x08, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x45, 0x0a, - 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, - 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, - 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x1a, 0x37, 0x0a, 0x09, 0x4d, 0x65, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, + 0x55, 0x52, 0x4c, 0x52, 0x65, 0x77, 0x72, 0x69, 0x74, 0x65, 0x52, 0x0a, 0x55, 0x52, 0x4c, 0x52, + 0x65, 0x77, 0x72, 0x69, 0x74, 0x65, 0x22, 0x20, 0x0a, 0x0a, 0x55, 0x52, 0x4c, 0x52, 0x65, 0x77, + 0x72, 0x69, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x50, 0x61, 0x74, 0x68, 0x22, 0xc2, 0x02, 0x0a, 0x10, 0x48, 0x54, 0x54, + 0x50, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x52, 0x0a, + 0x03, 0x41, 0x64, 0x64, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x40, 0x2e, 0x68, 0x61, 0x73, + 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, + 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, + 0x72, 0x79, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x46, 0x69, 0x6c, + 0x74, 0x65, 0x72, 0x2e, 0x41, 0x64, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x03, 0x41, 0x64, + 0x64, 0x12, 0x16, 0x0a, 0x06, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x18, 0x02, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x06, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x12, 0x52, 0x0a, 0x03, 0x53, 0x65, 0x74, + 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x40, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, + 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, + 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x48, + 0x54, 0x54, 0x50, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x2e, + 0x53, 0x65, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x03, 0x53, 0x65, 0x74, 0x1a, 0x36, 0x0a, + 0x08, 0x41, 0x64, 0x64, 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, 0x36, 0x0a, 0x08, 0x53, 0x65, 0x74, 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, 0x22, 0x7a, 0x0a, - 0x0a, 0x54, 0x43, 0x50, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x4e, - 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, - 0x58, 0x0a, 0x0e, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x4d, 0x65, 0x74, - 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, - 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, - 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x74, 0x65, 0x72, - 0x70, 0x72, 0x69, 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x52, 0x0e, 0x45, 0x6e, 0x74, 0x65, 0x72, - 0x70, 0x72, 0x69, 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x2a, 0xfd, 0x01, 0x0a, 0x04, 0x4b, 0x69, - 0x6e, 0x64, 0x12, 0x0f, 0x0a, 0x0b, 0x4b, 0x69, 0x6e, 0x64, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, - 0x6e, 0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e, 0x4b, 0x69, 0x6e, 0x64, 0x4d, 0x65, 0x73, 0x68, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x10, 0x01, 0x12, 0x17, 0x0a, 0x13, 0x4b, 0x69, 0x6e, 0x64, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x10, 0x02, - 0x12, 0x16, 0x0a, 0x12, 0x4b, 0x69, 0x6e, 0x64, 0x49, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x47, - 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x10, 0x03, 0x12, 0x19, 0x0a, 0x15, 0x4b, 0x69, 0x6e, 0x64, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x10, 0x04, 0x12, 0x17, 0x0a, 0x13, 0x4b, 0x69, 0x6e, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x10, 0x05, 0x12, 0x19, 0x0a, 0x15, - 0x4b, 0x69, 0x6e, 0x64, 0x49, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, - 0x69, 0x63, 0x61, 0x74, 0x65, 0x10, 0x06, 0x12, 0x12, 0x0a, 0x0e, 0x4b, 0x69, 0x6e, 0x64, 0x41, - 0x50, 0x49, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x10, 0x07, 0x12, 0x17, 0x0a, 0x13, 0x4b, - 0x69, 0x6e, 0x64, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x41, 0x50, 0x49, 0x47, 0x61, 0x74, 0x65, 0x77, - 0x61, 0x79, 0x10, 0x08, 0x12, 0x11, 0x0a, 0x0d, 0x4b, 0x69, 0x6e, 0x64, 0x48, 0x54, 0x54, 0x50, - 0x52, 0x6f, 0x75, 0x74, 0x65, 0x10, 0x09, 0x12, 0x10, 0x0a, 0x0c, 0x4b, 0x69, 0x6e, 0x64, 0x54, - 0x43, 0x50, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x10, 0x0a, 0x2a, 0x26, 0x0a, 0x0f, 0x49, 0x6e, 0x74, - 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x08, 0x0a, 0x04, - 0x44, 0x65, 0x6e, 0x79, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x10, - 0x01, 0x2a, 0x21, 0x0a, 0x13, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x73, - 0x75, 0x6c, 0x10, 0x00, 0x2a, 0x50, 0x0a, 0x09, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x4d, 0x6f, 0x64, - 0x65, 0x12, 0x14, 0x0a, 0x10, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x4d, 0x6f, 0x64, 0x65, 0x44, 0x65, - 0x66, 0x61, 0x75, 0x6c, 0x74, 0x10, 0x00, 0x12, 0x18, 0x0a, 0x14, 0x50, 0x72, 0x6f, 0x78, 0x79, - 0x4d, 0x6f, 0x64, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x10, - 0x01, 0x12, 0x13, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x4d, 0x6f, 0x64, 0x65, 0x44, 0x69, - 0x72, 0x65, 0x63, 0x74, 0x10, 0x02, 0x2a, 0x7b, 0x0a, 0x0f, 0x4d, 0x65, 0x73, 0x68, 0x47, 0x61, - 0x74, 0x65, 0x77, 0x61, 0x79, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x1a, 0x0a, 0x16, 0x4d, 0x65, 0x73, - 0x68, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x4d, 0x6f, 0x64, 0x65, 0x44, 0x65, 0x66, 0x61, - 0x75, 0x6c, 0x74, 0x10, 0x00, 0x12, 0x17, 0x0a, 0x13, 0x4d, 0x65, 0x73, 0x68, 0x47, 0x61, 0x74, - 0x65, 0x77, 0x61, 0x79, 0x4d, 0x6f, 0x64, 0x65, 0x4e, 0x6f, 0x6e, 0x65, 0x10, 0x01, 0x12, 0x18, - 0x0a, 0x14, 0x4d, 0x65, 0x73, 0x68, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x4d, 0x6f, 0x64, - 0x65, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x10, 0x02, 0x12, 0x19, 0x0a, 0x15, 0x4d, 0x65, 0x73, 0x68, - 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x6d, 0x6f, 0x74, - 0x65, 0x10, 0x03, 0x2a, 0x4f, 0x0a, 0x1a, 0x41, 0x50, 0x49, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, - 0x79, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, - 0x6c, 0x12, 0x18, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x50, 0x72, 0x6f, - 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x48, 0x54, 0x54, 0x50, 0x10, 0x00, 0x12, 0x17, 0x0a, 0x13, 0x4c, - 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x54, - 0x43, 0x50, 0x10, 0x01, 0x2a, 0x92, 0x02, 0x0a, 0x0f, 0x48, 0x54, 0x54, 0x50, 0x4d, 0x61, 0x74, - 0x63, 0x68, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, 0x16, 0x0a, 0x12, 0x48, 0x54, 0x54, 0x50, - 0x4d, 0x61, 0x74, 0x63, 0x68, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x41, 0x6c, 0x6c, 0x10, 0x00, - 0x12, 0x1a, 0x0a, 0x16, 0x48, 0x54, 0x54, 0x50, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x4d, 0x65, 0x74, - 0x68, 0x6f, 0x64, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x10, 0x01, 0x12, 0x19, 0x0a, 0x15, - 0x48, 0x54, 0x54, 0x50, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x44, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x10, 0x02, 0x12, 0x16, 0x0a, 0x12, 0x48, 0x54, 0x54, 0x50, 0x4d, - 0x61, 0x74, 0x63, 0x68, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x47, 0x65, 0x74, 0x10, 0x03, 0x12, - 0x17, 0x0a, 0x13, 0x48, 0x54, 0x54, 0x50, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x4d, 0x65, 0x74, 0x68, - 0x6f, 0x64, 0x48, 0x65, 0x61, 0x64, 0x10, 0x04, 0x12, 0x1a, 0x0a, 0x16, 0x48, 0x54, 0x54, 0x50, - 0x4d, 0x61, 0x74, 0x63, 0x68, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x10, 0x05, 0x12, 0x18, 0x0a, 0x14, 0x48, 0x54, 0x54, 0x50, 0x4d, 0x61, 0x74, 0x63, - 0x68, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x50, 0x61, 0x74, 0x63, 0x68, 0x10, 0x06, 0x12, 0x17, - 0x0a, 0x13, 0x48, 0x54, 0x54, 0x50, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x4d, 0x65, 0x74, 0x68, 0x6f, - 0x64, 0x50, 0x6f, 0x73, 0x74, 0x10, 0x07, 0x12, 0x16, 0x0a, 0x12, 0x48, 0x54, 0x54, 0x50, 0x4d, - 0x61, 0x74, 0x63, 0x68, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x50, 0x75, 0x74, 0x10, 0x08, 0x12, - 0x18, 0x0a, 0x14, 0x48, 0x54, 0x54, 0x50, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x4d, 0x65, 0x74, 0x68, - 0x6f, 0x64, 0x54, 0x72, 0x61, 0x63, 0x65, 0x10, 0x09, 0x2a, 0xa7, 0x01, 0x0a, 0x13, 0x48, 0x54, - 0x54, 0x50, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x54, 0x79, 0x70, - 0x65, 0x12, 0x18, 0x0a, 0x14, 0x48, 0x54, 0x54, 0x50, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x4d, - 0x61, 0x74, 0x63, 0x68, 0x45, 0x78, 0x61, 0x63, 0x74, 0x10, 0x00, 0x12, 0x19, 0x0a, 0x15, 0x48, - 0x54, 0x54, 0x50, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x50, 0x72, - 0x65, 0x66, 0x69, 0x78, 0x10, 0x01, 0x12, 0x1a, 0x0a, 0x16, 0x48, 0x54, 0x54, 0x50, 0x48, 0x65, - 0x61, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, - 0x10, 0x02, 0x12, 0x24, 0x0a, 0x20, 0x48, 0x54, 0x54, 0x50, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, - 0x4d, 0x61, 0x74, 0x63, 0x68, 0x52, 0x65, 0x67, 0x75, 0x6c, 0x61, 0x72, 0x45, 0x78, 0x70, 0x72, - 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x10, 0x03, 0x12, 0x19, 0x0a, 0x15, 0x48, 0x54, 0x54, 0x50, - 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x53, 0x75, 0x66, 0x66, 0x69, - 0x78, 0x10, 0x04, 0x2a, 0x68, 0x0a, 0x11, 0x48, 0x54, 0x54, 0x50, 0x50, 0x61, 0x74, 0x68, 0x4d, - 0x61, 0x74, 0x63, 0x68, 0x54, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x12, 0x48, 0x54, 0x54, 0x50, - 0x50, 0x61, 0x74, 0x68, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x45, 0x78, 0x61, 0x63, 0x74, 0x10, 0x00, - 0x12, 0x17, 0x0a, 0x13, 0x48, 0x54, 0x54, 0x50, 0x50, 0x61, 0x74, 0x68, 0x4d, 0x61, 0x74, 0x63, - 0x68, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x10, 0x01, 0x12, 0x22, 0x0a, 0x1e, 0x48, 0x54, 0x54, - 0x50, 0x50, 0x61, 0x74, 0x68, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x52, 0x65, 0x67, 0x75, 0x6c, 0x61, - 0x72, 0x45, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x10, 0x03, 0x2a, 0x6d, 0x0a, - 0x12, 0x48, 0x54, 0x54, 0x50, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x54, - 0x79, 0x70, 0x65, 0x12, 0x17, 0x0a, 0x13, 0x48, 0x54, 0x54, 0x50, 0x51, 0x75, 0x65, 0x72, 0x79, - 0x4d, 0x61, 0x74, 0x63, 0x68, 0x45, 0x78, 0x61, 0x63, 0x74, 0x10, 0x00, 0x12, 0x19, 0x0a, 0x15, - 0x48, 0x54, 0x54, 0x50, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x50, 0x72, - 0x65, 0x73, 0x65, 0x6e, 0x74, 0x10, 0x01, 0x12, 0x23, 0x0a, 0x1f, 0x48, 0x54, 0x54, 0x50, 0x51, - 0x75, 0x65, 0x72, 0x79, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x52, 0x65, 0x67, 0x75, 0x6c, 0x61, 0x72, - 0x45, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x10, 0x03, 0x42, 0xae, 0x02, 0x0a, - 0x29, 0x63, 0x6f, 0x6d, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, - 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x42, 0x10, 0x43, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x37, - 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x68, 0x61, 0x73, 0x68, 0x69, - 0x63, 0x6f, 0x72, 0x70, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2f, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x2f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2f, 0x70, 0x62, 0x63, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0xa2, 0x02, 0x04, 0x48, 0x43, 0x49, 0x43, 0xaa, 0x02, - 0x25, 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x43, 0x6f, 0x6e, 0x73, 0x75, - 0x6c, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0xca, 0x02, 0x25, 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, - 0x72, 0x70, 0x5c, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x5c, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, - 0x61, 0x6c, 0x5c, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0xe2, 0x02, - 0x31, 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x5c, 0x43, 0x6f, 0x6e, 0x73, 0x75, - 0x6c, 0x5c, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5c, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, - 0x74, 0x61, 0xea, 0x02, 0x28, 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x3a, 0x3a, - 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x3a, 0x3a, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, - 0x3a, 0x3a, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x62, 0x06, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xe1, 0x01, + 0x0a, 0x0b, 0x48, 0x54, 0x54, 0x50, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x12, 0x0a, + 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, + 0x65, 0x12, 0x16, 0x0a, 0x06, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x06, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x4c, 0x0a, 0x07, 0x46, 0x69, 0x6c, + 0x74, 0x65, 0x72, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x68, 0x61, 0x73, + 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, + 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, + 0x72, 0x79, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x52, 0x07, + 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x12, 0x58, 0x0a, 0x0e, 0x45, 0x6e, 0x74, 0x65, 0x72, + 0x70, 0x72, 0x69, 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x30, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, + 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, + 0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x4d, 0x65, 0x74, + 0x61, 0x52, 0x0e, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x4d, 0x65, 0x74, + 0x61, 0x22, 0xfc, 0x02, 0x0a, 0x08, 0x54, 0x43, 0x50, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x12, 0x4d, + 0x0a, 0x04, 0x4d, 0x65, 0x74, 0x61, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x68, + 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, + 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, + 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x54, 0x43, 0x50, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x2e, 0x4d, 0x65, + 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x52, 0x0a, + 0x07, 0x50, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x38, + 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, + 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, + 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x07, 0x50, 0x61, 0x72, 0x65, 0x6e, 0x74, + 0x73, 0x12, 0x4d, 0x0a, 0x08, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x03, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, + 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, + 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x54, 0x43, 0x50, 0x53, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x08, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, + 0x12, 0x45, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x2d, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, + 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, + 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x1a, 0x37, 0x0a, 0x09, 0x4d, 0x65, 0x74, 0x61, 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, + 0x22, 0x7a, 0x0a, 0x0a, 0x54, 0x43, 0x50, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x12, + 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, + 0x6d, 0x65, 0x12, 0x58, 0x0a, 0x0e, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, + 0x4d, 0x65, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x68, 0x61, 0x73, + 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, + 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6e, + 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x52, 0x0e, 0x45, 0x6e, + 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x2a, 0xfd, 0x01, 0x0a, + 0x04, 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x0f, 0x0a, 0x0b, 0x4b, 0x69, 0x6e, 0x64, 0x55, 0x6e, 0x6b, + 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e, 0x4b, 0x69, 0x6e, 0x64, 0x4d, 0x65, + 0x73, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x10, 0x01, 0x12, 0x17, 0x0a, 0x13, 0x4b, 0x69, + 0x6e, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, + 0x72, 0x10, 0x02, 0x12, 0x16, 0x0a, 0x12, 0x4b, 0x69, 0x6e, 0x64, 0x49, 0x6e, 0x67, 0x72, 0x65, + 0x73, 0x73, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x10, 0x03, 0x12, 0x19, 0x0a, 0x15, 0x4b, + 0x69, 0x6e, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x10, 0x04, 0x12, 0x17, 0x0a, 0x13, 0x4b, 0x69, 0x6e, 0x64, 0x53, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x10, 0x05, 0x12, + 0x19, 0x0a, 0x15, 0x4b, 0x69, 0x6e, 0x64, 0x49, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x43, 0x65, 0x72, + 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x10, 0x06, 0x12, 0x12, 0x0a, 0x0e, 0x4b, 0x69, + 0x6e, 0x64, 0x41, 0x50, 0x49, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x10, 0x07, 0x12, 0x17, + 0x0a, 0x13, 0x4b, 0x69, 0x6e, 0x64, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x41, 0x50, 0x49, 0x47, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x10, 0x08, 0x12, 0x11, 0x0a, 0x0d, 0x4b, 0x69, 0x6e, 0x64, 0x48, + 0x54, 0x54, 0x50, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x10, 0x09, 0x12, 0x10, 0x0a, 0x0c, 0x4b, 0x69, + 0x6e, 0x64, 0x54, 0x43, 0x50, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x10, 0x0a, 0x2a, 0x26, 0x0a, 0x0f, + 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x08, 0x0a, 0x04, 0x44, 0x65, 0x6e, 0x79, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x41, 0x6c, 0x6c, + 0x6f, 0x77, 0x10, 0x01, 0x2a, 0x21, 0x0a, 0x13, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, + 0x6e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x43, + 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x10, 0x00, 0x2a, 0x50, 0x0a, 0x09, 0x50, 0x72, 0x6f, 0x78, 0x79, + 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x14, 0x0a, 0x10, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x4d, 0x6f, 0x64, + 0x65, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x10, 0x00, 0x12, 0x18, 0x0a, 0x14, 0x50, 0x72, + 0x6f, 0x78, 0x79, 0x4d, 0x6f, 0x64, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x61, 0x72, 0x65, + 0x6e, 0x74, 0x10, 0x01, 0x12, 0x13, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x4d, 0x6f, 0x64, + 0x65, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x10, 0x02, 0x2a, 0x7b, 0x0a, 0x0f, 0x4d, 0x65, 0x73, + 0x68, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x1a, 0x0a, 0x16, + 0x4d, 0x65, 0x73, 0x68, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x4d, 0x6f, 0x64, 0x65, 0x44, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x10, 0x00, 0x12, 0x17, 0x0a, 0x13, 0x4d, 0x65, 0x73, 0x68, + 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x4d, 0x6f, 0x64, 0x65, 0x4e, 0x6f, 0x6e, 0x65, 0x10, + 0x01, 0x12, 0x18, 0x0a, 0x14, 0x4d, 0x65, 0x73, 0x68, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, + 0x4d, 0x6f, 0x64, 0x65, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x10, 0x02, 0x12, 0x19, 0x0a, 0x15, 0x4d, + 0x65, 0x73, 0x68, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x65, + 0x6d, 0x6f, 0x74, 0x65, 0x10, 0x03, 0x2a, 0x4f, 0x0a, 0x1a, 0x41, 0x50, 0x49, 0x47, 0x61, 0x74, + 0x65, 0x77, 0x61, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x74, + 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x18, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, + 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x48, 0x54, 0x54, 0x50, 0x10, 0x00, 0x12, 0x17, + 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, + 0x6f, 0x6c, 0x54, 0x43, 0x50, 0x10, 0x01, 0x2a, 0x92, 0x02, 0x0a, 0x0f, 0x48, 0x54, 0x54, 0x50, + 0x4d, 0x61, 0x74, 0x63, 0x68, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, 0x16, 0x0a, 0x12, 0x48, + 0x54, 0x54, 0x50, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x41, 0x6c, + 0x6c, 0x10, 0x00, 0x12, 0x1a, 0x0a, 0x16, 0x48, 0x54, 0x54, 0x50, 0x4d, 0x61, 0x74, 0x63, 0x68, + 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x10, 0x01, 0x12, + 0x19, 0x0a, 0x15, 0x48, 0x54, 0x54, 0x50, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x4d, 0x65, 0x74, 0x68, + 0x6f, 0x64, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x10, 0x02, 0x12, 0x16, 0x0a, 0x12, 0x48, 0x54, + 0x54, 0x50, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x47, 0x65, 0x74, + 0x10, 0x03, 0x12, 0x17, 0x0a, 0x13, 0x48, 0x54, 0x54, 0x50, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x4d, + 0x65, 0x74, 0x68, 0x6f, 0x64, 0x48, 0x65, 0x61, 0x64, 0x10, 0x04, 0x12, 0x1a, 0x0a, 0x16, 0x48, + 0x54, 0x54, 0x50, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x10, 0x05, 0x12, 0x18, 0x0a, 0x14, 0x48, 0x54, 0x54, 0x50, 0x4d, + 0x61, 0x74, 0x63, 0x68, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x50, 0x61, 0x74, 0x63, 0x68, 0x10, + 0x06, 0x12, 0x17, 0x0a, 0x13, 0x48, 0x54, 0x54, 0x50, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x4d, 0x65, + 0x74, 0x68, 0x6f, 0x64, 0x50, 0x6f, 0x73, 0x74, 0x10, 0x07, 0x12, 0x16, 0x0a, 0x12, 0x48, 0x54, + 0x54, 0x50, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x50, 0x75, 0x74, + 0x10, 0x08, 0x12, 0x18, 0x0a, 0x14, 0x48, 0x54, 0x54, 0x50, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x4d, + 0x65, 0x74, 0x68, 0x6f, 0x64, 0x54, 0x72, 0x61, 0x63, 0x65, 0x10, 0x09, 0x2a, 0xa7, 0x01, 0x0a, + 0x13, 0x48, 0x54, 0x54, 0x50, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x74, 0x63, 0x68, + 0x54, 0x79, 0x70, 0x65, 0x12, 0x18, 0x0a, 0x14, 0x48, 0x54, 0x54, 0x50, 0x48, 0x65, 0x61, 0x64, + 0x65, 0x72, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x45, 0x78, 0x61, 0x63, 0x74, 0x10, 0x00, 0x12, 0x19, + 0x0a, 0x15, 0x48, 0x54, 0x54, 0x50, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x74, 0x63, + 0x68, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x10, 0x01, 0x12, 0x1a, 0x0a, 0x16, 0x48, 0x54, 0x54, + 0x50, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x50, 0x72, 0x65, 0x73, + 0x65, 0x6e, 0x74, 0x10, 0x02, 0x12, 0x24, 0x0a, 0x20, 0x48, 0x54, 0x54, 0x50, 0x48, 0x65, 0x61, + 0x64, 0x65, 0x72, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x52, 0x65, 0x67, 0x75, 0x6c, 0x61, 0x72, 0x45, + 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x10, 0x03, 0x12, 0x19, 0x0a, 0x15, 0x48, + 0x54, 0x54, 0x50, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x53, 0x75, + 0x66, 0x66, 0x69, 0x78, 0x10, 0x04, 0x2a, 0x68, 0x0a, 0x11, 0x48, 0x54, 0x54, 0x50, 0x50, 0x61, + 0x74, 0x68, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x54, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x12, 0x48, + 0x54, 0x54, 0x50, 0x50, 0x61, 0x74, 0x68, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x45, 0x78, 0x61, 0x63, + 0x74, 0x10, 0x00, 0x12, 0x17, 0x0a, 0x13, 0x48, 0x54, 0x54, 0x50, 0x50, 0x61, 0x74, 0x68, 0x4d, + 0x61, 0x74, 0x63, 0x68, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x10, 0x01, 0x12, 0x22, 0x0a, 0x1e, + 0x48, 0x54, 0x54, 0x50, 0x50, 0x61, 0x74, 0x68, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x52, 0x65, 0x67, + 0x75, 0x6c, 0x61, 0x72, 0x45, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x10, 0x03, + 0x2a, 0x6d, 0x0a, 0x12, 0x48, 0x54, 0x54, 0x50, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4d, 0x61, 0x74, + 0x63, 0x68, 0x54, 0x79, 0x70, 0x65, 0x12, 0x17, 0x0a, 0x13, 0x48, 0x54, 0x54, 0x50, 0x51, 0x75, + 0x65, 0x72, 0x79, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x45, 0x78, 0x61, 0x63, 0x74, 0x10, 0x00, 0x12, + 0x19, 0x0a, 0x15, 0x48, 0x54, 0x54, 0x50, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4d, 0x61, 0x74, 0x63, + 0x68, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x10, 0x01, 0x12, 0x23, 0x0a, 0x1f, 0x48, 0x54, + 0x54, 0x50, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x52, 0x65, 0x67, 0x75, + 0x6c, 0x61, 0x72, 0x45, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x10, 0x03, 0x42, + 0xae, 0x02, 0x0a, 0x29, 0x63, 0x6f, 0x6d, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, + 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, + 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x42, 0x10, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, + 0x01, 0x5a, 0x37, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x68, 0x61, + 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2f, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2f, 0x70, 0x62, 0x63, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0xa2, 0x02, 0x04, 0x48, 0x43, 0x49, + 0x43, 0xaa, 0x02, 0x25, 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x43, 0x6f, + 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0xca, 0x02, 0x25, 0x48, 0x61, 0x73, 0x68, + 0x69, 0x63, 0x6f, 0x72, 0x70, 0x5c, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x5c, 0x49, 0x6e, 0x74, + 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5c, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, + 0x79, 0xe2, 0x02, 0x31, 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x5c, 0x43, 0x6f, + 0x6e, 0x73, 0x75, 0x6c, 0x5c, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5c, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, + 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x28, 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, + 0x70, 0x3a, 0x3a, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x3a, 0x3a, 0x49, 0x6e, 0x74, 0x65, 0x72, + 0x6e, 0x61, 0x6c, 0x3a, 0x3a, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, + 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -6477,7 +6546,7 @@ func file_private_pbconfigentry_config_entry_proto_rawDescGZIP() []byte { } var file_private_pbconfigentry_config_entry_proto_enumTypes = make([]protoimpl.EnumInfo, 10) -var file_private_pbconfigentry_config_entry_proto_msgTypes = make([]protoimpl.MessageInfo, 79) +var file_private_pbconfigentry_config_entry_proto_msgTypes = make([]protoimpl.MessageInfo, 80) var file_private_pbconfigentry_config_entry_proto_goTypes = []interface{}{ (Kind)(0), // 0: hashicorp.consul.internal.configentry.Kind (IntentionAction)(0), // 1: hashicorp.consul.internal.configentry.IntentionAction @@ -6500,207 +6569,209 @@ var file_private_pbconfigentry_config_entry_proto_goTypes = []interface{}{ (*ServiceResolverSubset)(nil), // 18: hashicorp.consul.internal.configentry.ServiceResolverSubset (*ServiceResolverRedirect)(nil), // 19: hashicorp.consul.internal.configentry.ServiceResolverRedirect (*ServiceResolverFailover)(nil), // 20: hashicorp.consul.internal.configentry.ServiceResolverFailover - (*ServiceResolverFailoverTarget)(nil), // 21: hashicorp.consul.internal.configentry.ServiceResolverFailoverTarget - (*LoadBalancer)(nil), // 22: hashicorp.consul.internal.configentry.LoadBalancer - (*RingHashConfig)(nil), // 23: hashicorp.consul.internal.configentry.RingHashConfig - (*LeastRequestConfig)(nil), // 24: hashicorp.consul.internal.configentry.LeastRequestConfig - (*HashPolicy)(nil), // 25: hashicorp.consul.internal.configentry.HashPolicy - (*CookieConfig)(nil), // 26: hashicorp.consul.internal.configentry.CookieConfig - (*IngressGateway)(nil), // 27: hashicorp.consul.internal.configentry.IngressGateway - (*IngressServiceConfig)(nil), // 28: hashicorp.consul.internal.configentry.IngressServiceConfig - (*GatewayTLSConfig)(nil), // 29: hashicorp.consul.internal.configentry.GatewayTLSConfig - (*GatewayTLSSDSConfig)(nil), // 30: hashicorp.consul.internal.configentry.GatewayTLSSDSConfig - (*IngressListener)(nil), // 31: hashicorp.consul.internal.configentry.IngressListener - (*IngressService)(nil), // 32: hashicorp.consul.internal.configentry.IngressService - (*GatewayServiceTLSConfig)(nil), // 33: hashicorp.consul.internal.configentry.GatewayServiceTLSConfig - (*HTTPHeaderModifiers)(nil), // 34: hashicorp.consul.internal.configentry.HTTPHeaderModifiers - (*ServiceIntentions)(nil), // 35: hashicorp.consul.internal.configentry.ServiceIntentions - (*SourceIntention)(nil), // 36: hashicorp.consul.internal.configentry.SourceIntention - (*IntentionPermission)(nil), // 37: hashicorp.consul.internal.configentry.IntentionPermission - (*IntentionHTTPPermission)(nil), // 38: hashicorp.consul.internal.configentry.IntentionHTTPPermission - (*IntentionHTTPHeaderPermission)(nil), // 39: hashicorp.consul.internal.configentry.IntentionHTTPHeaderPermission - (*ServiceDefaults)(nil), // 40: hashicorp.consul.internal.configentry.ServiceDefaults - (*TransparentProxyConfig)(nil), // 41: hashicorp.consul.internal.configentry.TransparentProxyConfig - (*MeshGatewayConfig)(nil), // 42: hashicorp.consul.internal.configentry.MeshGatewayConfig - (*ExposeConfig)(nil), // 43: hashicorp.consul.internal.configentry.ExposeConfig - (*ExposePath)(nil), // 44: hashicorp.consul.internal.configentry.ExposePath - (*UpstreamConfiguration)(nil), // 45: hashicorp.consul.internal.configentry.UpstreamConfiguration - (*UpstreamConfig)(nil), // 46: hashicorp.consul.internal.configentry.UpstreamConfig - (*UpstreamLimits)(nil), // 47: hashicorp.consul.internal.configentry.UpstreamLimits - (*PassiveHealthCheck)(nil), // 48: hashicorp.consul.internal.configentry.PassiveHealthCheck - (*DestinationConfig)(nil), // 49: hashicorp.consul.internal.configentry.DestinationConfig - (*APIGateway)(nil), // 50: hashicorp.consul.internal.configentry.APIGateway - (*Status)(nil), // 51: hashicorp.consul.internal.configentry.Status - (*Condition)(nil), // 52: hashicorp.consul.internal.configentry.Condition - (*APIGatewayListener)(nil), // 53: hashicorp.consul.internal.configentry.APIGatewayListener - (*APIGatewayTLSConfiguration)(nil), // 54: hashicorp.consul.internal.configentry.APIGatewayTLSConfiguration - (*ResourceReference)(nil), // 55: hashicorp.consul.internal.configentry.ResourceReference - (*BoundAPIGateway)(nil), // 56: hashicorp.consul.internal.configentry.BoundAPIGateway - (*BoundAPIGatewayListener)(nil), // 57: hashicorp.consul.internal.configentry.BoundAPIGatewayListener - (*InlineCertificate)(nil), // 58: hashicorp.consul.internal.configentry.InlineCertificate - (*HTTPRoute)(nil), // 59: hashicorp.consul.internal.configentry.HTTPRoute - (*HTTPRouteRule)(nil), // 60: hashicorp.consul.internal.configentry.HTTPRouteRule - (*HTTPMatch)(nil), // 61: hashicorp.consul.internal.configentry.HTTPMatch - (*HTTPHeaderMatch)(nil), // 62: hashicorp.consul.internal.configentry.HTTPHeaderMatch - (*HTTPPathMatch)(nil), // 63: hashicorp.consul.internal.configentry.HTTPPathMatch - (*HTTPQueryMatch)(nil), // 64: hashicorp.consul.internal.configentry.HTTPQueryMatch - (*HTTPFilters)(nil), // 65: hashicorp.consul.internal.configentry.HTTPFilters - (*URLRewrite)(nil), // 66: hashicorp.consul.internal.configentry.URLRewrite - (*HTTPHeaderFilter)(nil), // 67: hashicorp.consul.internal.configentry.HTTPHeaderFilter - (*HTTPService)(nil), // 68: hashicorp.consul.internal.configentry.HTTPService - (*TCPRoute)(nil), // 69: hashicorp.consul.internal.configentry.TCPRoute - (*TCPService)(nil), // 70: hashicorp.consul.internal.configentry.TCPService - nil, // 71: hashicorp.consul.internal.configentry.MeshConfig.MetaEntry - nil, // 72: hashicorp.consul.internal.configentry.ServiceResolver.SubsetsEntry - nil, // 73: hashicorp.consul.internal.configentry.ServiceResolver.FailoverEntry - nil, // 74: hashicorp.consul.internal.configentry.ServiceResolver.MetaEntry - nil, // 75: hashicorp.consul.internal.configentry.IngressGateway.MetaEntry - nil, // 76: hashicorp.consul.internal.configentry.IngressService.MetaEntry - nil, // 77: hashicorp.consul.internal.configentry.HTTPHeaderModifiers.AddEntry - nil, // 78: hashicorp.consul.internal.configentry.HTTPHeaderModifiers.SetEntry - nil, // 79: hashicorp.consul.internal.configentry.ServiceIntentions.MetaEntry - nil, // 80: hashicorp.consul.internal.configentry.SourceIntention.LegacyMetaEntry - nil, // 81: hashicorp.consul.internal.configentry.ServiceDefaults.MetaEntry - nil, // 82: hashicorp.consul.internal.configentry.APIGateway.MetaEntry - nil, // 83: hashicorp.consul.internal.configentry.BoundAPIGateway.MetaEntry - nil, // 84: hashicorp.consul.internal.configentry.InlineCertificate.MetaEntry - nil, // 85: hashicorp.consul.internal.configentry.HTTPRoute.MetaEntry - nil, // 86: hashicorp.consul.internal.configentry.HTTPHeaderFilter.AddEntry - nil, // 87: hashicorp.consul.internal.configentry.HTTPHeaderFilter.SetEntry - nil, // 88: hashicorp.consul.internal.configentry.TCPRoute.MetaEntry - (*pbcommon.EnterpriseMeta)(nil), // 89: hashicorp.consul.internal.common.EnterpriseMeta - (*pbcommon.RaftIndex)(nil), // 90: hashicorp.consul.internal.common.RaftIndex - (*durationpb.Duration)(nil), // 91: google.protobuf.Duration - (*timestamppb.Timestamp)(nil), // 92: google.protobuf.Timestamp - (*pbcommon.EnvoyExtension)(nil), // 93: hashicorp.consul.internal.common.EnvoyExtension + (*ServiceResolverFailoverPolicy)(nil), // 21: hashicorp.consul.internal.configentry.ServiceResolverFailoverPolicy + (*ServiceResolverFailoverTarget)(nil), // 22: hashicorp.consul.internal.configentry.ServiceResolverFailoverTarget + (*LoadBalancer)(nil), // 23: hashicorp.consul.internal.configentry.LoadBalancer + (*RingHashConfig)(nil), // 24: hashicorp.consul.internal.configentry.RingHashConfig + (*LeastRequestConfig)(nil), // 25: hashicorp.consul.internal.configentry.LeastRequestConfig + (*HashPolicy)(nil), // 26: hashicorp.consul.internal.configentry.HashPolicy + (*CookieConfig)(nil), // 27: hashicorp.consul.internal.configentry.CookieConfig + (*IngressGateway)(nil), // 28: hashicorp.consul.internal.configentry.IngressGateway + (*IngressServiceConfig)(nil), // 29: hashicorp.consul.internal.configentry.IngressServiceConfig + (*GatewayTLSConfig)(nil), // 30: hashicorp.consul.internal.configentry.GatewayTLSConfig + (*GatewayTLSSDSConfig)(nil), // 31: hashicorp.consul.internal.configentry.GatewayTLSSDSConfig + (*IngressListener)(nil), // 32: hashicorp.consul.internal.configentry.IngressListener + (*IngressService)(nil), // 33: hashicorp.consul.internal.configentry.IngressService + (*GatewayServiceTLSConfig)(nil), // 34: hashicorp.consul.internal.configentry.GatewayServiceTLSConfig + (*HTTPHeaderModifiers)(nil), // 35: hashicorp.consul.internal.configentry.HTTPHeaderModifiers + (*ServiceIntentions)(nil), // 36: hashicorp.consul.internal.configentry.ServiceIntentions + (*SourceIntention)(nil), // 37: hashicorp.consul.internal.configentry.SourceIntention + (*IntentionPermission)(nil), // 38: hashicorp.consul.internal.configentry.IntentionPermission + (*IntentionHTTPPermission)(nil), // 39: hashicorp.consul.internal.configentry.IntentionHTTPPermission + (*IntentionHTTPHeaderPermission)(nil), // 40: hashicorp.consul.internal.configentry.IntentionHTTPHeaderPermission + (*ServiceDefaults)(nil), // 41: hashicorp.consul.internal.configentry.ServiceDefaults + (*TransparentProxyConfig)(nil), // 42: hashicorp.consul.internal.configentry.TransparentProxyConfig + (*MeshGatewayConfig)(nil), // 43: hashicorp.consul.internal.configentry.MeshGatewayConfig + (*ExposeConfig)(nil), // 44: hashicorp.consul.internal.configentry.ExposeConfig + (*ExposePath)(nil), // 45: hashicorp.consul.internal.configentry.ExposePath + (*UpstreamConfiguration)(nil), // 46: hashicorp.consul.internal.configentry.UpstreamConfiguration + (*UpstreamConfig)(nil), // 47: hashicorp.consul.internal.configentry.UpstreamConfig + (*UpstreamLimits)(nil), // 48: hashicorp.consul.internal.configentry.UpstreamLimits + (*PassiveHealthCheck)(nil), // 49: hashicorp.consul.internal.configentry.PassiveHealthCheck + (*DestinationConfig)(nil), // 50: hashicorp.consul.internal.configentry.DestinationConfig + (*APIGateway)(nil), // 51: hashicorp.consul.internal.configentry.APIGateway + (*Status)(nil), // 52: hashicorp.consul.internal.configentry.Status + (*Condition)(nil), // 53: hashicorp.consul.internal.configentry.Condition + (*APIGatewayListener)(nil), // 54: hashicorp.consul.internal.configentry.APIGatewayListener + (*APIGatewayTLSConfiguration)(nil), // 55: hashicorp.consul.internal.configentry.APIGatewayTLSConfiguration + (*ResourceReference)(nil), // 56: hashicorp.consul.internal.configentry.ResourceReference + (*BoundAPIGateway)(nil), // 57: hashicorp.consul.internal.configentry.BoundAPIGateway + (*BoundAPIGatewayListener)(nil), // 58: hashicorp.consul.internal.configentry.BoundAPIGatewayListener + (*InlineCertificate)(nil), // 59: hashicorp.consul.internal.configentry.InlineCertificate + (*HTTPRoute)(nil), // 60: hashicorp.consul.internal.configentry.HTTPRoute + (*HTTPRouteRule)(nil), // 61: hashicorp.consul.internal.configentry.HTTPRouteRule + (*HTTPMatch)(nil), // 62: hashicorp.consul.internal.configentry.HTTPMatch + (*HTTPHeaderMatch)(nil), // 63: hashicorp.consul.internal.configentry.HTTPHeaderMatch + (*HTTPPathMatch)(nil), // 64: hashicorp.consul.internal.configentry.HTTPPathMatch + (*HTTPQueryMatch)(nil), // 65: hashicorp.consul.internal.configentry.HTTPQueryMatch + (*HTTPFilters)(nil), // 66: hashicorp.consul.internal.configentry.HTTPFilters + (*URLRewrite)(nil), // 67: hashicorp.consul.internal.configentry.URLRewrite + (*HTTPHeaderFilter)(nil), // 68: hashicorp.consul.internal.configentry.HTTPHeaderFilter + (*HTTPService)(nil), // 69: hashicorp.consul.internal.configentry.HTTPService + (*TCPRoute)(nil), // 70: hashicorp.consul.internal.configentry.TCPRoute + (*TCPService)(nil), // 71: hashicorp.consul.internal.configentry.TCPService + nil, // 72: hashicorp.consul.internal.configentry.MeshConfig.MetaEntry + nil, // 73: hashicorp.consul.internal.configentry.ServiceResolver.SubsetsEntry + nil, // 74: hashicorp.consul.internal.configentry.ServiceResolver.FailoverEntry + nil, // 75: hashicorp.consul.internal.configentry.ServiceResolver.MetaEntry + nil, // 76: hashicorp.consul.internal.configentry.IngressGateway.MetaEntry + nil, // 77: hashicorp.consul.internal.configentry.IngressService.MetaEntry + nil, // 78: hashicorp.consul.internal.configentry.HTTPHeaderModifiers.AddEntry + nil, // 79: hashicorp.consul.internal.configentry.HTTPHeaderModifiers.SetEntry + nil, // 80: hashicorp.consul.internal.configentry.ServiceIntentions.MetaEntry + nil, // 81: hashicorp.consul.internal.configentry.SourceIntention.LegacyMetaEntry + nil, // 82: hashicorp.consul.internal.configentry.ServiceDefaults.MetaEntry + nil, // 83: hashicorp.consul.internal.configentry.APIGateway.MetaEntry + nil, // 84: hashicorp.consul.internal.configentry.BoundAPIGateway.MetaEntry + nil, // 85: hashicorp.consul.internal.configentry.InlineCertificate.MetaEntry + nil, // 86: hashicorp.consul.internal.configentry.HTTPRoute.MetaEntry + nil, // 87: hashicorp.consul.internal.configentry.HTTPHeaderFilter.AddEntry + nil, // 88: hashicorp.consul.internal.configentry.HTTPHeaderFilter.SetEntry + nil, // 89: hashicorp.consul.internal.configentry.TCPRoute.MetaEntry + (*pbcommon.EnterpriseMeta)(nil), // 90: hashicorp.consul.internal.common.EnterpriseMeta + (*pbcommon.RaftIndex)(nil), // 91: hashicorp.consul.internal.common.RaftIndex + (*durationpb.Duration)(nil), // 92: google.protobuf.Duration + (*timestamppb.Timestamp)(nil), // 93: google.protobuf.Timestamp + (*pbcommon.EnvoyExtension)(nil), // 94: hashicorp.consul.internal.common.EnvoyExtension } var file_private_pbconfigentry_config_entry_proto_depIdxs = []int32{ 0, // 0: hashicorp.consul.internal.configentry.ConfigEntry.Kind:type_name -> hashicorp.consul.internal.configentry.Kind - 89, // 1: hashicorp.consul.internal.configentry.ConfigEntry.EnterpriseMeta:type_name -> hashicorp.consul.internal.common.EnterpriseMeta - 90, // 2: hashicorp.consul.internal.configentry.ConfigEntry.RaftIndex:type_name -> hashicorp.consul.internal.common.RaftIndex + 90, // 1: hashicorp.consul.internal.configentry.ConfigEntry.EnterpriseMeta:type_name -> hashicorp.consul.internal.common.EnterpriseMeta + 91, // 2: hashicorp.consul.internal.configentry.ConfigEntry.RaftIndex:type_name -> hashicorp.consul.internal.common.RaftIndex 11, // 3: hashicorp.consul.internal.configentry.ConfigEntry.MeshConfig:type_name -> hashicorp.consul.internal.configentry.MeshConfig 17, // 4: hashicorp.consul.internal.configentry.ConfigEntry.ServiceResolver:type_name -> hashicorp.consul.internal.configentry.ServiceResolver - 27, // 5: hashicorp.consul.internal.configentry.ConfigEntry.IngressGateway:type_name -> hashicorp.consul.internal.configentry.IngressGateway - 35, // 6: hashicorp.consul.internal.configentry.ConfigEntry.ServiceIntentions:type_name -> hashicorp.consul.internal.configentry.ServiceIntentions - 40, // 7: hashicorp.consul.internal.configentry.ConfigEntry.ServiceDefaults:type_name -> hashicorp.consul.internal.configentry.ServiceDefaults - 50, // 8: hashicorp.consul.internal.configentry.ConfigEntry.APIGateway:type_name -> hashicorp.consul.internal.configentry.APIGateway - 56, // 9: hashicorp.consul.internal.configentry.ConfigEntry.BoundAPIGateway:type_name -> hashicorp.consul.internal.configentry.BoundAPIGateway - 69, // 10: hashicorp.consul.internal.configentry.ConfigEntry.TCPRoute:type_name -> hashicorp.consul.internal.configentry.TCPRoute - 59, // 11: hashicorp.consul.internal.configentry.ConfigEntry.HTTPRoute:type_name -> hashicorp.consul.internal.configentry.HTTPRoute - 58, // 12: hashicorp.consul.internal.configentry.ConfigEntry.InlineCertificate:type_name -> hashicorp.consul.internal.configentry.InlineCertificate + 28, // 5: hashicorp.consul.internal.configentry.ConfigEntry.IngressGateway:type_name -> hashicorp.consul.internal.configentry.IngressGateway + 36, // 6: hashicorp.consul.internal.configentry.ConfigEntry.ServiceIntentions:type_name -> hashicorp.consul.internal.configentry.ServiceIntentions + 41, // 7: hashicorp.consul.internal.configentry.ConfigEntry.ServiceDefaults:type_name -> hashicorp.consul.internal.configentry.ServiceDefaults + 51, // 8: hashicorp.consul.internal.configentry.ConfigEntry.APIGateway:type_name -> hashicorp.consul.internal.configentry.APIGateway + 57, // 9: hashicorp.consul.internal.configentry.ConfigEntry.BoundAPIGateway:type_name -> hashicorp.consul.internal.configentry.BoundAPIGateway + 70, // 10: hashicorp.consul.internal.configentry.ConfigEntry.TCPRoute:type_name -> hashicorp.consul.internal.configentry.TCPRoute + 60, // 11: hashicorp.consul.internal.configentry.ConfigEntry.HTTPRoute:type_name -> hashicorp.consul.internal.configentry.HTTPRoute + 59, // 12: hashicorp.consul.internal.configentry.ConfigEntry.InlineCertificate:type_name -> hashicorp.consul.internal.configentry.InlineCertificate 12, // 13: hashicorp.consul.internal.configentry.MeshConfig.TransparentProxy:type_name -> hashicorp.consul.internal.configentry.TransparentProxyMeshConfig 13, // 14: hashicorp.consul.internal.configentry.MeshConfig.TLS:type_name -> hashicorp.consul.internal.configentry.MeshTLSConfig 15, // 15: hashicorp.consul.internal.configentry.MeshConfig.HTTP:type_name -> hashicorp.consul.internal.configentry.MeshHTTPConfig - 71, // 16: hashicorp.consul.internal.configentry.MeshConfig.Meta:type_name -> hashicorp.consul.internal.configentry.MeshConfig.MetaEntry + 72, // 16: hashicorp.consul.internal.configentry.MeshConfig.Meta:type_name -> hashicorp.consul.internal.configentry.MeshConfig.MetaEntry 16, // 17: hashicorp.consul.internal.configentry.MeshConfig.Peering:type_name -> hashicorp.consul.internal.configentry.PeeringMeshConfig 14, // 18: hashicorp.consul.internal.configentry.MeshTLSConfig.Incoming:type_name -> hashicorp.consul.internal.configentry.MeshDirectionalTLSConfig 14, // 19: hashicorp.consul.internal.configentry.MeshTLSConfig.Outgoing:type_name -> hashicorp.consul.internal.configentry.MeshDirectionalTLSConfig - 72, // 20: hashicorp.consul.internal.configentry.ServiceResolver.Subsets:type_name -> hashicorp.consul.internal.configentry.ServiceResolver.SubsetsEntry + 73, // 20: hashicorp.consul.internal.configentry.ServiceResolver.Subsets:type_name -> hashicorp.consul.internal.configentry.ServiceResolver.SubsetsEntry 19, // 21: hashicorp.consul.internal.configentry.ServiceResolver.Redirect:type_name -> hashicorp.consul.internal.configentry.ServiceResolverRedirect - 73, // 22: hashicorp.consul.internal.configentry.ServiceResolver.Failover:type_name -> hashicorp.consul.internal.configentry.ServiceResolver.FailoverEntry - 91, // 23: hashicorp.consul.internal.configentry.ServiceResolver.ConnectTimeout:type_name -> google.protobuf.Duration - 22, // 24: hashicorp.consul.internal.configentry.ServiceResolver.LoadBalancer:type_name -> hashicorp.consul.internal.configentry.LoadBalancer - 74, // 25: hashicorp.consul.internal.configentry.ServiceResolver.Meta:type_name -> hashicorp.consul.internal.configentry.ServiceResolver.MetaEntry - 91, // 26: hashicorp.consul.internal.configentry.ServiceResolver.RequestTimeout:type_name -> google.protobuf.Duration - 21, // 27: hashicorp.consul.internal.configentry.ServiceResolverFailover.Targets:type_name -> hashicorp.consul.internal.configentry.ServiceResolverFailoverTarget - 23, // 28: hashicorp.consul.internal.configentry.LoadBalancer.RingHashConfig:type_name -> hashicorp.consul.internal.configentry.RingHashConfig - 24, // 29: hashicorp.consul.internal.configentry.LoadBalancer.LeastRequestConfig:type_name -> hashicorp.consul.internal.configentry.LeastRequestConfig - 25, // 30: hashicorp.consul.internal.configentry.LoadBalancer.HashPolicies:type_name -> hashicorp.consul.internal.configentry.HashPolicy - 26, // 31: hashicorp.consul.internal.configentry.HashPolicy.CookieConfig:type_name -> hashicorp.consul.internal.configentry.CookieConfig - 91, // 32: hashicorp.consul.internal.configentry.CookieConfig.TTL:type_name -> google.protobuf.Duration - 29, // 33: hashicorp.consul.internal.configentry.IngressGateway.TLS:type_name -> hashicorp.consul.internal.configentry.GatewayTLSConfig - 31, // 34: hashicorp.consul.internal.configentry.IngressGateway.Listeners:type_name -> hashicorp.consul.internal.configentry.IngressListener - 75, // 35: hashicorp.consul.internal.configentry.IngressGateway.Meta:type_name -> hashicorp.consul.internal.configentry.IngressGateway.MetaEntry - 28, // 36: hashicorp.consul.internal.configentry.IngressGateway.Defaults:type_name -> hashicorp.consul.internal.configentry.IngressServiceConfig - 48, // 37: hashicorp.consul.internal.configentry.IngressServiceConfig.PassiveHealthCheck:type_name -> hashicorp.consul.internal.configentry.PassiveHealthCheck - 30, // 38: hashicorp.consul.internal.configentry.GatewayTLSConfig.SDS:type_name -> hashicorp.consul.internal.configentry.GatewayTLSSDSConfig - 32, // 39: hashicorp.consul.internal.configentry.IngressListener.Services:type_name -> hashicorp.consul.internal.configentry.IngressService - 29, // 40: hashicorp.consul.internal.configentry.IngressListener.TLS:type_name -> hashicorp.consul.internal.configentry.GatewayTLSConfig - 33, // 41: hashicorp.consul.internal.configentry.IngressService.TLS:type_name -> hashicorp.consul.internal.configentry.GatewayServiceTLSConfig - 34, // 42: hashicorp.consul.internal.configentry.IngressService.RequestHeaders:type_name -> hashicorp.consul.internal.configentry.HTTPHeaderModifiers - 34, // 43: hashicorp.consul.internal.configentry.IngressService.ResponseHeaders:type_name -> hashicorp.consul.internal.configentry.HTTPHeaderModifiers - 76, // 44: hashicorp.consul.internal.configentry.IngressService.Meta:type_name -> hashicorp.consul.internal.configentry.IngressService.MetaEntry - 89, // 45: hashicorp.consul.internal.configentry.IngressService.EnterpriseMeta:type_name -> hashicorp.consul.internal.common.EnterpriseMeta - 48, // 46: hashicorp.consul.internal.configentry.IngressService.PassiveHealthCheck:type_name -> hashicorp.consul.internal.configentry.PassiveHealthCheck - 30, // 47: hashicorp.consul.internal.configentry.GatewayServiceTLSConfig.SDS:type_name -> hashicorp.consul.internal.configentry.GatewayTLSSDSConfig - 77, // 48: hashicorp.consul.internal.configentry.HTTPHeaderModifiers.Add:type_name -> hashicorp.consul.internal.configentry.HTTPHeaderModifiers.AddEntry - 78, // 49: hashicorp.consul.internal.configentry.HTTPHeaderModifiers.Set:type_name -> hashicorp.consul.internal.configentry.HTTPHeaderModifiers.SetEntry - 36, // 50: hashicorp.consul.internal.configentry.ServiceIntentions.Sources:type_name -> hashicorp.consul.internal.configentry.SourceIntention - 79, // 51: hashicorp.consul.internal.configentry.ServiceIntentions.Meta:type_name -> hashicorp.consul.internal.configentry.ServiceIntentions.MetaEntry - 1, // 52: hashicorp.consul.internal.configentry.SourceIntention.Action:type_name -> hashicorp.consul.internal.configentry.IntentionAction - 37, // 53: hashicorp.consul.internal.configentry.SourceIntention.Permissions:type_name -> hashicorp.consul.internal.configentry.IntentionPermission - 2, // 54: hashicorp.consul.internal.configentry.SourceIntention.Type:type_name -> hashicorp.consul.internal.configentry.IntentionSourceType - 80, // 55: hashicorp.consul.internal.configentry.SourceIntention.LegacyMeta:type_name -> hashicorp.consul.internal.configentry.SourceIntention.LegacyMetaEntry - 92, // 56: hashicorp.consul.internal.configentry.SourceIntention.LegacyCreateTime:type_name -> google.protobuf.Timestamp - 92, // 57: hashicorp.consul.internal.configentry.SourceIntention.LegacyUpdateTime:type_name -> google.protobuf.Timestamp - 89, // 58: hashicorp.consul.internal.configentry.SourceIntention.EnterpriseMeta:type_name -> hashicorp.consul.internal.common.EnterpriseMeta - 1, // 59: hashicorp.consul.internal.configentry.IntentionPermission.Action:type_name -> hashicorp.consul.internal.configentry.IntentionAction - 38, // 60: hashicorp.consul.internal.configentry.IntentionPermission.HTTP:type_name -> hashicorp.consul.internal.configentry.IntentionHTTPPermission - 39, // 61: hashicorp.consul.internal.configentry.IntentionHTTPPermission.Header:type_name -> hashicorp.consul.internal.configentry.IntentionHTTPHeaderPermission - 3, // 62: hashicorp.consul.internal.configentry.ServiceDefaults.Mode:type_name -> hashicorp.consul.internal.configentry.ProxyMode - 41, // 63: hashicorp.consul.internal.configentry.ServiceDefaults.TransparentProxy:type_name -> hashicorp.consul.internal.configentry.TransparentProxyConfig - 42, // 64: hashicorp.consul.internal.configentry.ServiceDefaults.MeshGateway:type_name -> hashicorp.consul.internal.configentry.MeshGatewayConfig - 43, // 65: hashicorp.consul.internal.configentry.ServiceDefaults.Expose:type_name -> hashicorp.consul.internal.configentry.ExposeConfig - 45, // 66: hashicorp.consul.internal.configentry.ServiceDefaults.UpstreamConfig:type_name -> hashicorp.consul.internal.configentry.UpstreamConfiguration - 49, // 67: hashicorp.consul.internal.configentry.ServiceDefaults.Destination:type_name -> hashicorp.consul.internal.configentry.DestinationConfig - 81, // 68: hashicorp.consul.internal.configentry.ServiceDefaults.Meta:type_name -> hashicorp.consul.internal.configentry.ServiceDefaults.MetaEntry - 93, // 69: hashicorp.consul.internal.configentry.ServiceDefaults.EnvoyExtensions:type_name -> hashicorp.consul.internal.common.EnvoyExtension - 4, // 70: hashicorp.consul.internal.configentry.MeshGatewayConfig.Mode:type_name -> hashicorp.consul.internal.configentry.MeshGatewayMode - 44, // 71: hashicorp.consul.internal.configentry.ExposeConfig.Paths:type_name -> hashicorp.consul.internal.configentry.ExposePath - 46, // 72: hashicorp.consul.internal.configentry.UpstreamConfiguration.Overrides:type_name -> hashicorp.consul.internal.configentry.UpstreamConfig - 46, // 73: hashicorp.consul.internal.configentry.UpstreamConfiguration.Defaults:type_name -> hashicorp.consul.internal.configentry.UpstreamConfig - 89, // 74: hashicorp.consul.internal.configentry.UpstreamConfig.EnterpriseMeta:type_name -> hashicorp.consul.internal.common.EnterpriseMeta - 47, // 75: hashicorp.consul.internal.configentry.UpstreamConfig.Limits:type_name -> hashicorp.consul.internal.configentry.UpstreamLimits - 48, // 76: hashicorp.consul.internal.configentry.UpstreamConfig.PassiveHealthCheck:type_name -> hashicorp.consul.internal.configentry.PassiveHealthCheck - 42, // 77: hashicorp.consul.internal.configentry.UpstreamConfig.MeshGateway:type_name -> hashicorp.consul.internal.configentry.MeshGatewayConfig - 91, // 78: hashicorp.consul.internal.configentry.PassiveHealthCheck.Interval:type_name -> google.protobuf.Duration - 82, // 79: hashicorp.consul.internal.configentry.APIGateway.Meta:type_name -> hashicorp.consul.internal.configentry.APIGateway.MetaEntry - 53, // 80: hashicorp.consul.internal.configentry.APIGateway.Listeners:type_name -> hashicorp.consul.internal.configentry.APIGatewayListener - 51, // 81: hashicorp.consul.internal.configentry.APIGateway.Status:type_name -> hashicorp.consul.internal.configentry.Status - 52, // 82: hashicorp.consul.internal.configentry.Status.Conditions:type_name -> hashicorp.consul.internal.configentry.Condition - 55, // 83: hashicorp.consul.internal.configentry.Condition.Resource:type_name -> hashicorp.consul.internal.configentry.ResourceReference - 92, // 84: hashicorp.consul.internal.configentry.Condition.LastTransitionTime:type_name -> google.protobuf.Timestamp - 5, // 85: hashicorp.consul.internal.configentry.APIGatewayListener.Protocol:type_name -> hashicorp.consul.internal.configentry.APIGatewayListenerProtocol - 54, // 86: hashicorp.consul.internal.configentry.APIGatewayListener.TLS:type_name -> hashicorp.consul.internal.configentry.APIGatewayTLSConfiguration - 55, // 87: hashicorp.consul.internal.configentry.APIGatewayTLSConfiguration.Certificates:type_name -> hashicorp.consul.internal.configentry.ResourceReference - 89, // 88: hashicorp.consul.internal.configentry.ResourceReference.EnterpriseMeta:type_name -> hashicorp.consul.internal.common.EnterpriseMeta - 83, // 89: hashicorp.consul.internal.configentry.BoundAPIGateway.Meta:type_name -> hashicorp.consul.internal.configentry.BoundAPIGateway.MetaEntry - 57, // 90: hashicorp.consul.internal.configentry.BoundAPIGateway.Listeners:type_name -> hashicorp.consul.internal.configentry.BoundAPIGatewayListener - 55, // 91: hashicorp.consul.internal.configentry.BoundAPIGatewayListener.Certificates:type_name -> hashicorp.consul.internal.configentry.ResourceReference - 55, // 92: hashicorp.consul.internal.configentry.BoundAPIGatewayListener.Routes:type_name -> hashicorp.consul.internal.configentry.ResourceReference - 84, // 93: hashicorp.consul.internal.configentry.InlineCertificate.Meta:type_name -> hashicorp.consul.internal.configentry.InlineCertificate.MetaEntry - 85, // 94: hashicorp.consul.internal.configentry.HTTPRoute.Meta:type_name -> hashicorp.consul.internal.configentry.HTTPRoute.MetaEntry - 55, // 95: hashicorp.consul.internal.configentry.HTTPRoute.Parents:type_name -> hashicorp.consul.internal.configentry.ResourceReference - 60, // 96: hashicorp.consul.internal.configentry.HTTPRoute.Rules:type_name -> hashicorp.consul.internal.configentry.HTTPRouteRule - 51, // 97: hashicorp.consul.internal.configentry.HTTPRoute.Status:type_name -> hashicorp.consul.internal.configentry.Status - 65, // 98: hashicorp.consul.internal.configentry.HTTPRouteRule.Filters:type_name -> hashicorp.consul.internal.configentry.HTTPFilters - 61, // 99: hashicorp.consul.internal.configentry.HTTPRouteRule.Matches:type_name -> hashicorp.consul.internal.configentry.HTTPMatch - 68, // 100: hashicorp.consul.internal.configentry.HTTPRouteRule.Services:type_name -> hashicorp.consul.internal.configentry.HTTPService - 62, // 101: hashicorp.consul.internal.configentry.HTTPMatch.Headers:type_name -> hashicorp.consul.internal.configentry.HTTPHeaderMatch - 6, // 102: hashicorp.consul.internal.configentry.HTTPMatch.Method:type_name -> hashicorp.consul.internal.configentry.HTTPMatchMethod - 63, // 103: hashicorp.consul.internal.configentry.HTTPMatch.Path:type_name -> hashicorp.consul.internal.configentry.HTTPPathMatch - 64, // 104: hashicorp.consul.internal.configentry.HTTPMatch.Query:type_name -> hashicorp.consul.internal.configentry.HTTPQueryMatch - 7, // 105: hashicorp.consul.internal.configentry.HTTPHeaderMatch.Match:type_name -> hashicorp.consul.internal.configentry.HTTPHeaderMatchType - 8, // 106: hashicorp.consul.internal.configentry.HTTPPathMatch.Match:type_name -> hashicorp.consul.internal.configentry.HTTPPathMatchType - 9, // 107: hashicorp.consul.internal.configentry.HTTPQueryMatch.Match:type_name -> hashicorp.consul.internal.configentry.HTTPQueryMatchType - 67, // 108: hashicorp.consul.internal.configentry.HTTPFilters.Headers:type_name -> hashicorp.consul.internal.configentry.HTTPHeaderFilter - 66, // 109: hashicorp.consul.internal.configentry.HTTPFilters.URLRewrite:type_name -> hashicorp.consul.internal.configentry.URLRewrite - 86, // 110: hashicorp.consul.internal.configentry.HTTPHeaderFilter.Add:type_name -> hashicorp.consul.internal.configentry.HTTPHeaderFilter.AddEntry - 87, // 111: hashicorp.consul.internal.configentry.HTTPHeaderFilter.Set:type_name -> hashicorp.consul.internal.configentry.HTTPHeaderFilter.SetEntry - 65, // 112: hashicorp.consul.internal.configentry.HTTPService.Filters:type_name -> hashicorp.consul.internal.configentry.HTTPFilters - 89, // 113: hashicorp.consul.internal.configentry.HTTPService.EnterpriseMeta:type_name -> hashicorp.consul.internal.common.EnterpriseMeta - 88, // 114: hashicorp.consul.internal.configentry.TCPRoute.Meta:type_name -> hashicorp.consul.internal.configentry.TCPRoute.MetaEntry - 55, // 115: hashicorp.consul.internal.configentry.TCPRoute.Parents:type_name -> hashicorp.consul.internal.configentry.ResourceReference - 70, // 116: hashicorp.consul.internal.configentry.TCPRoute.Services:type_name -> hashicorp.consul.internal.configentry.TCPService - 51, // 117: hashicorp.consul.internal.configentry.TCPRoute.Status:type_name -> hashicorp.consul.internal.configentry.Status - 89, // 118: hashicorp.consul.internal.configentry.TCPService.EnterpriseMeta:type_name -> hashicorp.consul.internal.common.EnterpriseMeta - 18, // 119: hashicorp.consul.internal.configentry.ServiceResolver.SubsetsEntry.value:type_name -> hashicorp.consul.internal.configentry.ServiceResolverSubset - 20, // 120: hashicorp.consul.internal.configentry.ServiceResolver.FailoverEntry.value:type_name -> hashicorp.consul.internal.configentry.ServiceResolverFailover - 121, // [121:121] is the sub-list for method output_type - 121, // [121:121] is the sub-list for method input_type - 121, // [121:121] is the sub-list for extension type_name - 121, // [121:121] is the sub-list for extension extendee - 0, // [0:121] is the sub-list for field type_name + 74, // 22: hashicorp.consul.internal.configentry.ServiceResolver.Failover:type_name -> hashicorp.consul.internal.configentry.ServiceResolver.FailoverEntry + 92, // 23: hashicorp.consul.internal.configentry.ServiceResolver.ConnectTimeout:type_name -> google.protobuf.Duration + 23, // 24: hashicorp.consul.internal.configentry.ServiceResolver.LoadBalancer:type_name -> hashicorp.consul.internal.configentry.LoadBalancer + 75, // 25: hashicorp.consul.internal.configentry.ServiceResolver.Meta:type_name -> hashicorp.consul.internal.configentry.ServiceResolver.MetaEntry + 92, // 26: hashicorp.consul.internal.configentry.ServiceResolver.RequestTimeout:type_name -> google.protobuf.Duration + 22, // 27: hashicorp.consul.internal.configentry.ServiceResolverFailover.Targets:type_name -> hashicorp.consul.internal.configentry.ServiceResolverFailoverTarget + 21, // 28: hashicorp.consul.internal.configentry.ServiceResolverFailover.Policy:type_name -> hashicorp.consul.internal.configentry.ServiceResolverFailoverPolicy + 24, // 29: hashicorp.consul.internal.configentry.LoadBalancer.RingHashConfig:type_name -> hashicorp.consul.internal.configentry.RingHashConfig + 25, // 30: hashicorp.consul.internal.configentry.LoadBalancer.LeastRequestConfig:type_name -> hashicorp.consul.internal.configentry.LeastRequestConfig + 26, // 31: hashicorp.consul.internal.configentry.LoadBalancer.HashPolicies:type_name -> hashicorp.consul.internal.configentry.HashPolicy + 27, // 32: hashicorp.consul.internal.configentry.HashPolicy.CookieConfig:type_name -> hashicorp.consul.internal.configentry.CookieConfig + 92, // 33: hashicorp.consul.internal.configentry.CookieConfig.TTL:type_name -> google.protobuf.Duration + 30, // 34: hashicorp.consul.internal.configentry.IngressGateway.TLS:type_name -> hashicorp.consul.internal.configentry.GatewayTLSConfig + 32, // 35: hashicorp.consul.internal.configentry.IngressGateway.Listeners:type_name -> hashicorp.consul.internal.configentry.IngressListener + 76, // 36: hashicorp.consul.internal.configentry.IngressGateway.Meta:type_name -> hashicorp.consul.internal.configentry.IngressGateway.MetaEntry + 29, // 37: hashicorp.consul.internal.configentry.IngressGateway.Defaults:type_name -> hashicorp.consul.internal.configentry.IngressServiceConfig + 49, // 38: hashicorp.consul.internal.configentry.IngressServiceConfig.PassiveHealthCheck:type_name -> hashicorp.consul.internal.configentry.PassiveHealthCheck + 31, // 39: hashicorp.consul.internal.configentry.GatewayTLSConfig.SDS:type_name -> hashicorp.consul.internal.configentry.GatewayTLSSDSConfig + 33, // 40: hashicorp.consul.internal.configentry.IngressListener.Services:type_name -> hashicorp.consul.internal.configentry.IngressService + 30, // 41: hashicorp.consul.internal.configentry.IngressListener.TLS:type_name -> hashicorp.consul.internal.configentry.GatewayTLSConfig + 34, // 42: hashicorp.consul.internal.configentry.IngressService.TLS:type_name -> hashicorp.consul.internal.configentry.GatewayServiceTLSConfig + 35, // 43: hashicorp.consul.internal.configentry.IngressService.RequestHeaders:type_name -> hashicorp.consul.internal.configentry.HTTPHeaderModifiers + 35, // 44: hashicorp.consul.internal.configentry.IngressService.ResponseHeaders:type_name -> hashicorp.consul.internal.configentry.HTTPHeaderModifiers + 77, // 45: hashicorp.consul.internal.configentry.IngressService.Meta:type_name -> hashicorp.consul.internal.configentry.IngressService.MetaEntry + 90, // 46: hashicorp.consul.internal.configentry.IngressService.EnterpriseMeta:type_name -> hashicorp.consul.internal.common.EnterpriseMeta + 49, // 47: hashicorp.consul.internal.configentry.IngressService.PassiveHealthCheck:type_name -> hashicorp.consul.internal.configentry.PassiveHealthCheck + 31, // 48: hashicorp.consul.internal.configentry.GatewayServiceTLSConfig.SDS:type_name -> hashicorp.consul.internal.configentry.GatewayTLSSDSConfig + 78, // 49: hashicorp.consul.internal.configentry.HTTPHeaderModifiers.Add:type_name -> hashicorp.consul.internal.configentry.HTTPHeaderModifiers.AddEntry + 79, // 50: hashicorp.consul.internal.configentry.HTTPHeaderModifiers.Set:type_name -> hashicorp.consul.internal.configentry.HTTPHeaderModifiers.SetEntry + 37, // 51: hashicorp.consul.internal.configentry.ServiceIntentions.Sources:type_name -> hashicorp.consul.internal.configentry.SourceIntention + 80, // 52: hashicorp.consul.internal.configentry.ServiceIntentions.Meta:type_name -> hashicorp.consul.internal.configentry.ServiceIntentions.MetaEntry + 1, // 53: hashicorp.consul.internal.configentry.SourceIntention.Action:type_name -> hashicorp.consul.internal.configentry.IntentionAction + 38, // 54: hashicorp.consul.internal.configentry.SourceIntention.Permissions:type_name -> hashicorp.consul.internal.configentry.IntentionPermission + 2, // 55: hashicorp.consul.internal.configentry.SourceIntention.Type:type_name -> hashicorp.consul.internal.configentry.IntentionSourceType + 81, // 56: hashicorp.consul.internal.configentry.SourceIntention.LegacyMeta:type_name -> hashicorp.consul.internal.configentry.SourceIntention.LegacyMetaEntry + 93, // 57: hashicorp.consul.internal.configentry.SourceIntention.LegacyCreateTime:type_name -> google.protobuf.Timestamp + 93, // 58: hashicorp.consul.internal.configentry.SourceIntention.LegacyUpdateTime:type_name -> google.protobuf.Timestamp + 90, // 59: hashicorp.consul.internal.configentry.SourceIntention.EnterpriseMeta:type_name -> hashicorp.consul.internal.common.EnterpriseMeta + 1, // 60: hashicorp.consul.internal.configentry.IntentionPermission.Action:type_name -> hashicorp.consul.internal.configentry.IntentionAction + 39, // 61: hashicorp.consul.internal.configentry.IntentionPermission.HTTP:type_name -> hashicorp.consul.internal.configentry.IntentionHTTPPermission + 40, // 62: hashicorp.consul.internal.configentry.IntentionHTTPPermission.Header:type_name -> hashicorp.consul.internal.configentry.IntentionHTTPHeaderPermission + 3, // 63: hashicorp.consul.internal.configentry.ServiceDefaults.Mode:type_name -> hashicorp.consul.internal.configentry.ProxyMode + 42, // 64: hashicorp.consul.internal.configentry.ServiceDefaults.TransparentProxy:type_name -> hashicorp.consul.internal.configentry.TransparentProxyConfig + 43, // 65: hashicorp.consul.internal.configentry.ServiceDefaults.MeshGateway:type_name -> hashicorp.consul.internal.configentry.MeshGatewayConfig + 44, // 66: hashicorp.consul.internal.configentry.ServiceDefaults.Expose:type_name -> hashicorp.consul.internal.configentry.ExposeConfig + 46, // 67: hashicorp.consul.internal.configentry.ServiceDefaults.UpstreamConfig:type_name -> hashicorp.consul.internal.configentry.UpstreamConfiguration + 50, // 68: hashicorp.consul.internal.configentry.ServiceDefaults.Destination:type_name -> hashicorp.consul.internal.configentry.DestinationConfig + 82, // 69: hashicorp.consul.internal.configentry.ServiceDefaults.Meta:type_name -> hashicorp.consul.internal.configentry.ServiceDefaults.MetaEntry + 94, // 70: hashicorp.consul.internal.configentry.ServiceDefaults.EnvoyExtensions:type_name -> hashicorp.consul.internal.common.EnvoyExtension + 4, // 71: hashicorp.consul.internal.configentry.MeshGatewayConfig.Mode:type_name -> hashicorp.consul.internal.configentry.MeshGatewayMode + 45, // 72: hashicorp.consul.internal.configentry.ExposeConfig.Paths:type_name -> hashicorp.consul.internal.configentry.ExposePath + 47, // 73: hashicorp.consul.internal.configentry.UpstreamConfiguration.Overrides:type_name -> hashicorp.consul.internal.configentry.UpstreamConfig + 47, // 74: hashicorp.consul.internal.configentry.UpstreamConfiguration.Defaults:type_name -> hashicorp.consul.internal.configentry.UpstreamConfig + 90, // 75: hashicorp.consul.internal.configentry.UpstreamConfig.EnterpriseMeta:type_name -> hashicorp.consul.internal.common.EnterpriseMeta + 48, // 76: hashicorp.consul.internal.configentry.UpstreamConfig.Limits:type_name -> hashicorp.consul.internal.configentry.UpstreamLimits + 49, // 77: hashicorp.consul.internal.configentry.UpstreamConfig.PassiveHealthCheck:type_name -> hashicorp.consul.internal.configentry.PassiveHealthCheck + 43, // 78: hashicorp.consul.internal.configentry.UpstreamConfig.MeshGateway:type_name -> hashicorp.consul.internal.configentry.MeshGatewayConfig + 92, // 79: hashicorp.consul.internal.configentry.PassiveHealthCheck.Interval:type_name -> google.protobuf.Duration + 83, // 80: hashicorp.consul.internal.configentry.APIGateway.Meta:type_name -> hashicorp.consul.internal.configentry.APIGateway.MetaEntry + 54, // 81: hashicorp.consul.internal.configentry.APIGateway.Listeners:type_name -> hashicorp.consul.internal.configentry.APIGatewayListener + 52, // 82: hashicorp.consul.internal.configentry.APIGateway.Status:type_name -> hashicorp.consul.internal.configentry.Status + 53, // 83: hashicorp.consul.internal.configentry.Status.Conditions:type_name -> hashicorp.consul.internal.configentry.Condition + 56, // 84: hashicorp.consul.internal.configentry.Condition.Resource:type_name -> hashicorp.consul.internal.configentry.ResourceReference + 93, // 85: hashicorp.consul.internal.configentry.Condition.LastTransitionTime:type_name -> google.protobuf.Timestamp + 5, // 86: hashicorp.consul.internal.configentry.APIGatewayListener.Protocol:type_name -> hashicorp.consul.internal.configentry.APIGatewayListenerProtocol + 55, // 87: hashicorp.consul.internal.configentry.APIGatewayListener.TLS:type_name -> hashicorp.consul.internal.configentry.APIGatewayTLSConfiguration + 56, // 88: hashicorp.consul.internal.configentry.APIGatewayTLSConfiguration.Certificates:type_name -> hashicorp.consul.internal.configentry.ResourceReference + 90, // 89: hashicorp.consul.internal.configentry.ResourceReference.EnterpriseMeta:type_name -> hashicorp.consul.internal.common.EnterpriseMeta + 84, // 90: hashicorp.consul.internal.configentry.BoundAPIGateway.Meta:type_name -> hashicorp.consul.internal.configentry.BoundAPIGateway.MetaEntry + 58, // 91: hashicorp.consul.internal.configentry.BoundAPIGateway.Listeners:type_name -> hashicorp.consul.internal.configentry.BoundAPIGatewayListener + 56, // 92: hashicorp.consul.internal.configentry.BoundAPIGatewayListener.Certificates:type_name -> hashicorp.consul.internal.configentry.ResourceReference + 56, // 93: hashicorp.consul.internal.configentry.BoundAPIGatewayListener.Routes:type_name -> hashicorp.consul.internal.configentry.ResourceReference + 85, // 94: hashicorp.consul.internal.configentry.InlineCertificate.Meta:type_name -> hashicorp.consul.internal.configentry.InlineCertificate.MetaEntry + 86, // 95: hashicorp.consul.internal.configentry.HTTPRoute.Meta:type_name -> hashicorp.consul.internal.configentry.HTTPRoute.MetaEntry + 56, // 96: hashicorp.consul.internal.configentry.HTTPRoute.Parents:type_name -> hashicorp.consul.internal.configentry.ResourceReference + 61, // 97: hashicorp.consul.internal.configentry.HTTPRoute.Rules:type_name -> hashicorp.consul.internal.configentry.HTTPRouteRule + 52, // 98: hashicorp.consul.internal.configentry.HTTPRoute.Status:type_name -> hashicorp.consul.internal.configentry.Status + 66, // 99: hashicorp.consul.internal.configentry.HTTPRouteRule.Filters:type_name -> hashicorp.consul.internal.configentry.HTTPFilters + 62, // 100: hashicorp.consul.internal.configentry.HTTPRouteRule.Matches:type_name -> hashicorp.consul.internal.configentry.HTTPMatch + 69, // 101: hashicorp.consul.internal.configentry.HTTPRouteRule.Services:type_name -> hashicorp.consul.internal.configentry.HTTPService + 63, // 102: hashicorp.consul.internal.configentry.HTTPMatch.Headers:type_name -> hashicorp.consul.internal.configentry.HTTPHeaderMatch + 6, // 103: hashicorp.consul.internal.configentry.HTTPMatch.Method:type_name -> hashicorp.consul.internal.configentry.HTTPMatchMethod + 64, // 104: hashicorp.consul.internal.configentry.HTTPMatch.Path:type_name -> hashicorp.consul.internal.configentry.HTTPPathMatch + 65, // 105: hashicorp.consul.internal.configentry.HTTPMatch.Query:type_name -> hashicorp.consul.internal.configentry.HTTPQueryMatch + 7, // 106: hashicorp.consul.internal.configentry.HTTPHeaderMatch.Match:type_name -> hashicorp.consul.internal.configentry.HTTPHeaderMatchType + 8, // 107: hashicorp.consul.internal.configentry.HTTPPathMatch.Match:type_name -> hashicorp.consul.internal.configentry.HTTPPathMatchType + 9, // 108: hashicorp.consul.internal.configentry.HTTPQueryMatch.Match:type_name -> hashicorp.consul.internal.configentry.HTTPQueryMatchType + 68, // 109: hashicorp.consul.internal.configentry.HTTPFilters.Headers:type_name -> hashicorp.consul.internal.configentry.HTTPHeaderFilter + 67, // 110: hashicorp.consul.internal.configentry.HTTPFilters.URLRewrite:type_name -> hashicorp.consul.internal.configentry.URLRewrite + 87, // 111: hashicorp.consul.internal.configentry.HTTPHeaderFilter.Add:type_name -> hashicorp.consul.internal.configentry.HTTPHeaderFilter.AddEntry + 88, // 112: hashicorp.consul.internal.configentry.HTTPHeaderFilter.Set:type_name -> hashicorp.consul.internal.configentry.HTTPHeaderFilter.SetEntry + 66, // 113: hashicorp.consul.internal.configentry.HTTPService.Filters:type_name -> hashicorp.consul.internal.configentry.HTTPFilters + 90, // 114: hashicorp.consul.internal.configentry.HTTPService.EnterpriseMeta:type_name -> hashicorp.consul.internal.common.EnterpriseMeta + 89, // 115: hashicorp.consul.internal.configentry.TCPRoute.Meta:type_name -> hashicorp.consul.internal.configentry.TCPRoute.MetaEntry + 56, // 116: hashicorp.consul.internal.configentry.TCPRoute.Parents:type_name -> hashicorp.consul.internal.configentry.ResourceReference + 71, // 117: hashicorp.consul.internal.configentry.TCPRoute.Services:type_name -> hashicorp.consul.internal.configentry.TCPService + 52, // 118: hashicorp.consul.internal.configentry.TCPRoute.Status:type_name -> hashicorp.consul.internal.configentry.Status + 90, // 119: hashicorp.consul.internal.configentry.TCPService.EnterpriseMeta:type_name -> hashicorp.consul.internal.common.EnterpriseMeta + 18, // 120: hashicorp.consul.internal.configentry.ServiceResolver.SubsetsEntry.value:type_name -> hashicorp.consul.internal.configentry.ServiceResolverSubset + 20, // 121: hashicorp.consul.internal.configentry.ServiceResolver.FailoverEntry.value:type_name -> hashicorp.consul.internal.configentry.ServiceResolverFailover + 122, // [122:122] is the sub-list for method output_type + 122, // [122:122] is the sub-list for method input_type + 122, // [122:122] is the sub-list for extension type_name + 122, // [122:122] is the sub-list for extension extendee + 0, // [0:122] is the sub-list for field type_name } func init() { file_private_pbconfigentry_config_entry_proto_init() } @@ -6842,7 +6913,7 @@ func file_private_pbconfigentry_config_entry_proto_init() { } } file_private_pbconfigentry_config_entry_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ServiceResolverFailoverTarget); i { + switch v := v.(*ServiceResolverFailoverPolicy); i { case 0: return &v.state case 1: @@ -6854,7 +6925,7 @@ func file_private_pbconfigentry_config_entry_proto_init() { } } file_private_pbconfigentry_config_entry_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*LoadBalancer); i { + switch v := v.(*ServiceResolverFailoverTarget); i { case 0: return &v.state case 1: @@ -6866,7 +6937,7 @@ func file_private_pbconfigentry_config_entry_proto_init() { } } file_private_pbconfigentry_config_entry_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RingHashConfig); i { + switch v := v.(*LoadBalancer); i { case 0: return &v.state case 1: @@ -6878,7 +6949,7 @@ func file_private_pbconfigentry_config_entry_proto_init() { } } file_private_pbconfigentry_config_entry_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*LeastRequestConfig); i { + switch v := v.(*RingHashConfig); i { case 0: return &v.state case 1: @@ -6890,7 +6961,7 @@ func file_private_pbconfigentry_config_entry_proto_init() { } } file_private_pbconfigentry_config_entry_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*HashPolicy); i { + switch v := v.(*LeastRequestConfig); i { case 0: return &v.state case 1: @@ -6902,7 +6973,7 @@ func file_private_pbconfigentry_config_entry_proto_init() { } } file_private_pbconfigentry_config_entry_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CookieConfig); i { + switch v := v.(*HashPolicy); i { case 0: return &v.state case 1: @@ -6914,7 +6985,7 @@ func file_private_pbconfigentry_config_entry_proto_init() { } } file_private_pbconfigentry_config_entry_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*IngressGateway); i { + switch v := v.(*CookieConfig); i { case 0: return &v.state case 1: @@ -6926,7 +6997,7 @@ func file_private_pbconfigentry_config_entry_proto_init() { } } file_private_pbconfigentry_config_entry_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*IngressServiceConfig); i { + switch v := v.(*IngressGateway); i { case 0: return &v.state case 1: @@ -6938,7 +7009,7 @@ func file_private_pbconfigentry_config_entry_proto_init() { } } file_private_pbconfigentry_config_entry_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GatewayTLSConfig); i { + switch v := v.(*IngressServiceConfig); i { case 0: return &v.state case 1: @@ -6950,7 +7021,7 @@ func file_private_pbconfigentry_config_entry_proto_init() { } } file_private_pbconfigentry_config_entry_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GatewayTLSSDSConfig); i { + switch v := v.(*GatewayTLSConfig); i { case 0: return &v.state case 1: @@ -6962,7 +7033,7 @@ func file_private_pbconfigentry_config_entry_proto_init() { } } file_private_pbconfigentry_config_entry_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*IngressListener); i { + switch v := v.(*GatewayTLSSDSConfig); i { case 0: return &v.state case 1: @@ -6974,7 +7045,7 @@ func file_private_pbconfigentry_config_entry_proto_init() { } } file_private_pbconfigentry_config_entry_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*IngressService); i { + switch v := v.(*IngressListener); i { case 0: return &v.state case 1: @@ -6986,7 +7057,7 @@ func file_private_pbconfigentry_config_entry_proto_init() { } } file_private_pbconfigentry_config_entry_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GatewayServiceTLSConfig); i { + switch v := v.(*IngressService); i { case 0: return &v.state case 1: @@ -6998,7 +7069,7 @@ func file_private_pbconfigentry_config_entry_proto_init() { } } file_private_pbconfigentry_config_entry_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*HTTPHeaderModifiers); i { + switch v := v.(*GatewayServiceTLSConfig); i { case 0: return &v.state case 1: @@ -7010,7 +7081,7 @@ func file_private_pbconfigentry_config_entry_proto_init() { } } file_private_pbconfigentry_config_entry_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ServiceIntentions); i { + switch v := v.(*HTTPHeaderModifiers); i { case 0: return &v.state case 1: @@ -7022,7 +7093,7 @@ func file_private_pbconfigentry_config_entry_proto_init() { } } file_private_pbconfigentry_config_entry_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SourceIntention); i { + switch v := v.(*ServiceIntentions); i { case 0: return &v.state case 1: @@ -7034,7 +7105,7 @@ func file_private_pbconfigentry_config_entry_proto_init() { } } file_private_pbconfigentry_config_entry_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*IntentionPermission); i { + switch v := v.(*SourceIntention); i { case 0: return &v.state case 1: @@ -7046,7 +7117,7 @@ func file_private_pbconfigentry_config_entry_proto_init() { } } file_private_pbconfigentry_config_entry_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*IntentionHTTPPermission); i { + switch v := v.(*IntentionPermission); i { case 0: return &v.state case 1: @@ -7058,7 +7129,7 @@ func file_private_pbconfigentry_config_entry_proto_init() { } } file_private_pbconfigentry_config_entry_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*IntentionHTTPHeaderPermission); i { + switch v := v.(*IntentionHTTPPermission); i { case 0: return &v.state case 1: @@ -7070,7 +7141,7 @@ func file_private_pbconfigentry_config_entry_proto_init() { } } file_private_pbconfigentry_config_entry_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ServiceDefaults); i { + switch v := v.(*IntentionHTTPHeaderPermission); i { case 0: return &v.state case 1: @@ -7082,7 +7153,7 @@ func file_private_pbconfigentry_config_entry_proto_init() { } } file_private_pbconfigentry_config_entry_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TransparentProxyConfig); i { + switch v := v.(*ServiceDefaults); i { case 0: return &v.state case 1: @@ -7094,7 +7165,7 @@ func file_private_pbconfigentry_config_entry_proto_init() { } } file_private_pbconfigentry_config_entry_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MeshGatewayConfig); i { + switch v := v.(*TransparentProxyConfig); i { case 0: return &v.state case 1: @@ -7106,7 +7177,7 @@ func file_private_pbconfigentry_config_entry_proto_init() { } } file_private_pbconfigentry_config_entry_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ExposeConfig); i { + switch v := v.(*MeshGatewayConfig); i { case 0: return &v.state case 1: @@ -7118,7 +7189,7 @@ func file_private_pbconfigentry_config_entry_proto_init() { } } file_private_pbconfigentry_config_entry_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ExposePath); i { + switch v := v.(*ExposeConfig); i { case 0: return &v.state case 1: @@ -7130,7 +7201,7 @@ func file_private_pbconfigentry_config_entry_proto_init() { } } file_private_pbconfigentry_config_entry_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpstreamConfiguration); i { + switch v := v.(*ExposePath); i { case 0: return &v.state case 1: @@ -7142,7 +7213,7 @@ func file_private_pbconfigentry_config_entry_proto_init() { } } file_private_pbconfigentry_config_entry_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpstreamConfig); i { + switch v := v.(*UpstreamConfiguration); i { case 0: return &v.state case 1: @@ -7154,7 +7225,7 @@ func file_private_pbconfigentry_config_entry_proto_init() { } } file_private_pbconfigentry_config_entry_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpstreamLimits); i { + switch v := v.(*UpstreamConfig); i { case 0: return &v.state case 1: @@ -7166,7 +7237,7 @@ func file_private_pbconfigentry_config_entry_proto_init() { } } file_private_pbconfigentry_config_entry_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PassiveHealthCheck); i { + switch v := v.(*UpstreamLimits); i { case 0: return &v.state case 1: @@ -7178,7 +7249,7 @@ func file_private_pbconfigentry_config_entry_proto_init() { } } file_private_pbconfigentry_config_entry_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DestinationConfig); i { + switch v := v.(*PassiveHealthCheck); i { case 0: return &v.state case 1: @@ -7190,7 +7261,7 @@ func file_private_pbconfigentry_config_entry_proto_init() { } } file_private_pbconfigentry_config_entry_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*APIGateway); i { + switch v := v.(*DestinationConfig); i { case 0: return &v.state case 1: @@ -7202,7 +7273,7 @@ func file_private_pbconfigentry_config_entry_proto_init() { } } file_private_pbconfigentry_config_entry_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Status); i { + switch v := v.(*APIGateway); i { case 0: return &v.state case 1: @@ -7214,7 +7285,7 @@ func file_private_pbconfigentry_config_entry_proto_init() { } } file_private_pbconfigentry_config_entry_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Condition); i { + switch v := v.(*Status); i { case 0: return &v.state case 1: @@ -7226,7 +7297,7 @@ func file_private_pbconfigentry_config_entry_proto_init() { } } file_private_pbconfigentry_config_entry_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*APIGatewayListener); i { + switch v := v.(*Condition); i { case 0: return &v.state case 1: @@ -7238,7 +7309,7 @@ func file_private_pbconfigentry_config_entry_proto_init() { } } file_private_pbconfigentry_config_entry_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*APIGatewayTLSConfiguration); i { + switch v := v.(*APIGatewayListener); i { case 0: return &v.state case 1: @@ -7250,7 +7321,7 @@ func file_private_pbconfigentry_config_entry_proto_init() { } } file_private_pbconfigentry_config_entry_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ResourceReference); i { + switch v := v.(*APIGatewayTLSConfiguration); i { case 0: return &v.state case 1: @@ -7262,7 +7333,7 @@ func file_private_pbconfigentry_config_entry_proto_init() { } } file_private_pbconfigentry_config_entry_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BoundAPIGateway); i { + switch v := v.(*ResourceReference); i { case 0: return &v.state case 1: @@ -7274,7 +7345,7 @@ func file_private_pbconfigentry_config_entry_proto_init() { } } file_private_pbconfigentry_config_entry_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BoundAPIGatewayListener); i { + switch v := v.(*BoundAPIGateway); i { case 0: return &v.state case 1: @@ -7286,7 +7357,7 @@ func file_private_pbconfigentry_config_entry_proto_init() { } } file_private_pbconfigentry_config_entry_proto_msgTypes[48].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*InlineCertificate); i { + switch v := v.(*BoundAPIGatewayListener); i { case 0: return &v.state case 1: @@ -7298,7 +7369,7 @@ func file_private_pbconfigentry_config_entry_proto_init() { } } file_private_pbconfigentry_config_entry_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*HTTPRoute); i { + switch v := v.(*InlineCertificate); i { case 0: return &v.state case 1: @@ -7310,7 +7381,7 @@ func file_private_pbconfigentry_config_entry_proto_init() { } } file_private_pbconfigentry_config_entry_proto_msgTypes[50].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*HTTPRouteRule); i { + switch v := v.(*HTTPRoute); i { case 0: return &v.state case 1: @@ -7322,7 +7393,7 @@ func file_private_pbconfigentry_config_entry_proto_init() { } } file_private_pbconfigentry_config_entry_proto_msgTypes[51].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*HTTPMatch); i { + switch v := v.(*HTTPRouteRule); i { case 0: return &v.state case 1: @@ -7334,7 +7405,7 @@ func file_private_pbconfigentry_config_entry_proto_init() { } } file_private_pbconfigentry_config_entry_proto_msgTypes[52].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*HTTPHeaderMatch); i { + switch v := v.(*HTTPMatch); i { case 0: return &v.state case 1: @@ -7346,7 +7417,7 @@ func file_private_pbconfigentry_config_entry_proto_init() { } } file_private_pbconfigentry_config_entry_proto_msgTypes[53].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*HTTPPathMatch); i { + switch v := v.(*HTTPHeaderMatch); i { case 0: return &v.state case 1: @@ -7358,7 +7429,7 @@ func file_private_pbconfigentry_config_entry_proto_init() { } } file_private_pbconfigentry_config_entry_proto_msgTypes[54].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*HTTPQueryMatch); i { + switch v := v.(*HTTPPathMatch); i { case 0: return &v.state case 1: @@ -7370,7 +7441,7 @@ func file_private_pbconfigentry_config_entry_proto_init() { } } file_private_pbconfigentry_config_entry_proto_msgTypes[55].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*HTTPFilters); i { + switch v := v.(*HTTPQueryMatch); i { case 0: return &v.state case 1: @@ -7382,7 +7453,7 @@ func file_private_pbconfigentry_config_entry_proto_init() { } } file_private_pbconfigentry_config_entry_proto_msgTypes[56].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*URLRewrite); i { + switch v := v.(*HTTPFilters); i { case 0: return &v.state case 1: @@ -7394,7 +7465,7 @@ func file_private_pbconfigentry_config_entry_proto_init() { } } file_private_pbconfigentry_config_entry_proto_msgTypes[57].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*HTTPHeaderFilter); i { + switch v := v.(*URLRewrite); i { case 0: return &v.state case 1: @@ -7406,7 +7477,7 @@ func file_private_pbconfigentry_config_entry_proto_init() { } } file_private_pbconfigentry_config_entry_proto_msgTypes[58].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*HTTPService); i { + switch v := v.(*HTTPHeaderFilter); i { case 0: return &v.state case 1: @@ -7418,7 +7489,7 @@ func file_private_pbconfigentry_config_entry_proto_init() { } } file_private_pbconfigentry_config_entry_proto_msgTypes[59].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TCPRoute); i { + switch v := v.(*HTTPService); i { case 0: return &v.state case 1: @@ -7430,6 +7501,18 @@ func file_private_pbconfigentry_config_entry_proto_init() { } } file_private_pbconfigentry_config_entry_proto_msgTypes[60].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TCPRoute); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_private_pbconfigentry_config_entry_proto_msgTypes[61].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*TCPService); i { case 0: return &v.state @@ -7460,7 +7543,7 @@ func file_private_pbconfigentry_config_entry_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_private_pbconfigentry_config_entry_proto_rawDesc, NumEnums: 10, - NumMessages: 79, + NumMessages: 80, NumExtensions: 0, NumServices: 0, }, diff --git a/proto/private/pbconfigentry/config_entry.proto b/proto/private/pbconfigentry/config_entry.proto index 6b7767b2b4c..65ea77e8381 100644 --- a/proto/private/pbconfigentry/config_entry.proto +++ b/proto/private/pbconfigentry/config_entry.proto @@ -160,6 +160,16 @@ message ServiceResolverFailover { string Namespace = 3; repeated string Datacenters = 4; repeated ServiceResolverFailoverTarget Targets = 5; + ServiceResolverFailoverPolicy Policy = 6; +} + +// mog annotation: +// +// target=github.com/hashicorp/consul/agent/structs.ServiceResolverFailoverPolicy +// output=config_entry.gen.go +// name=Structs +message ServiceResolverFailoverPolicy { + string Mode = 1; } // mog annotation: From c517f07ecaf6428e12a06976e426d91becca7197 Mon Sep 17 00:00:00 2001 From: Michael Wilkerson <62034708+wilkermichael@users.noreply.github.com> Date: Fri, 3 Mar 2023 10:29:34 -0800 Subject: [PATCH 104/262] modified unsupported envoy version error (#16518) - When an envoy version is out of a supported range, we now return the envoy version being used as `major.minor.x` to indicate that it is the minor version at most that is incompatible - When an envoy version is in the list of unsupported envoy versions we return back the envoy version in the error message as `major.minor.patch` as now the exact version matters. --- command/connect/envoy/envoy.go | 69 ++++++++++++++++++++++------- command/connect/envoy/envoy_test.go | 33 ++++++++++---- 2 files changed, 78 insertions(+), 24 deletions(-) diff --git a/command/connect/envoy/envoy.go b/command/connect/envoy/envoy.go index c265c0ba9cd..102c16494db 100644 --- a/command/connect/envoy/envoy.go +++ b/command/connect/envoy/envoy.go @@ -503,15 +503,15 @@ func (c *cmd) run(args []string) int { return 1 } - ok, err := checkEnvoyVersionCompatibility(v, xdscommon.UnsupportedEnvoyVersions) + ec, err := checkEnvoyVersionCompatibility(v, xdscommon.UnsupportedEnvoyVersions) if err != nil { c.UI.Warn("There was an error checking the compatibility of the envoy version: " + err.Error()) - } else if !ok { + } else if !ec.isCompatible { c.UI.Error(fmt.Sprintf("Envoy version %s is not supported. If there is a reason you need to use "+ "this version of envoy use the ignore-envoy-compatibility flag. Using an unsupported version of Envoy "+ "is not recommended and your experience may vary. For more information on compatibility "+ - "see https://developer.hashicorp.com/consul/docs/connect/proxies/envoy#envoy-and-consul-client-agent", v)) + "see https://developer.hashicorp.com/consul/docs/connect/proxies/envoy#envoy-and-consul-client-agent", ec.versionIncompatible)) return 1 } } @@ -976,34 +976,73 @@ Usage: consul connect envoy [options] [-- pass-through options] ` ) -func checkEnvoyVersionCompatibility(envoyVersion string, unsupportedList []string) (bool, error) { - // Now compare the versions to the list of supported versions +type envoyCompat struct { + isCompatible bool + versionIncompatible string +} + +func checkEnvoyVersionCompatibility(envoyVersion string, unsupportedList []string) (envoyCompat, error) { v, err := version.NewVersion(envoyVersion) if err != nil { - return false, err + return envoyCompat{}, err } var cs strings.Builder - // Add one to the max minor version so that we accept all patches + // If there is a list of unsupported versions, build the constraint string, + // this will detect exactly unsupported versions + if len(unsupportedList) > 0 { + for i, s := range unsupportedList { + if i == 0 { + cs.WriteString(fmt.Sprintf("!= %s", s)) + } else { + cs.WriteString(fmt.Sprintf(", != %s", s)) + } + } + + constraints, err := version.NewConstraint(cs.String()) + if err != nil { + return envoyCompat{}, err + } + + if c := constraints.Check(v); !c { + return envoyCompat{ + isCompatible: c, + versionIncompatible: envoyVersion, + }, nil + } + } + + // Next build the constraint string using the bounds, make sure that we are less than but not equal to + // maxSupported since we will add 1. Need to add one to the max minor version so that we accept all patches splitS := strings.Split(xdscommon.GetMaxEnvoyMinorVersion(), ".") minor, err := strconv.Atoi(splitS[1]) if err != nil { - return false, err + return envoyCompat{}, err } minor++ maxSupported := fmt.Sprintf("%s.%d", splitS[0], minor) - // Build the constraint string, make sure that we are less than but not equal to maxSupported since we added 1 + cs.Reset() cs.WriteString(fmt.Sprintf(">= %s, < %s", xdscommon.GetMinEnvoyMinorVersion(), maxSupported)) - for _, s := range unsupportedList { - cs.WriteString(fmt.Sprintf(", != %s", s)) - } - constraints, err := version.NewConstraint(cs.String()) if err != nil { - return false, err + return envoyCompat{}, err } - return constraints.Check(v), nil + if c := constraints.Check(v); !c { + return envoyCompat{ + isCompatible: c, + versionIncompatible: replacePatchVersionWithX(envoyVersion), + }, nil + } + + return envoyCompat{isCompatible: true}, nil +} + +func replacePatchVersionWithX(version string) string { + // Strip off the patch and append x to convey that the constraint is on the minor version and not the patch + // itself + a := strings.Split(version, ".") + return fmt.Sprintf("%s.%s.x", a[0], a[1]) } diff --git a/command/connect/envoy/envoy_test.go b/command/connect/envoy/envoy_test.go index 223eb2e130c..09c02c91c09 100644 --- a/command/connect/envoy/envoy_test.go +++ b/command/connect/envoy/envoy_test.go @@ -1696,50 +1696,65 @@ func TestCheckEnvoyVersionCompatibility(t *testing.T) { name string envoyVersion string unsupportedList []string - expectedSupport bool + expectedCompat envoyCompat isErrorExpected bool }{ { name: "supported-using-proxy-support-defined", envoyVersion: xdscommon.EnvoyVersions[1], unsupportedList: xdscommon.UnsupportedEnvoyVersions, - expectedSupport: true, + expectedCompat: envoyCompat{ + isCompatible: true, + }, }, { name: "supported-at-max", envoyVersion: xdscommon.GetMaxEnvoyMinorVersion(), unsupportedList: xdscommon.UnsupportedEnvoyVersions, - expectedSupport: true, + expectedCompat: envoyCompat{ + isCompatible: true, + }, }, { name: "supported-patch-higher", envoyVersion: addNPatchVersion(xdscommon.EnvoyVersions[0], 1), unsupportedList: xdscommon.UnsupportedEnvoyVersions, - expectedSupport: true, + expectedCompat: envoyCompat{ + isCompatible: true, + }, }, { name: "not-supported-minor-higher", envoyVersion: addNMinorVersion(xdscommon.EnvoyVersions[0], 1), unsupportedList: xdscommon.UnsupportedEnvoyVersions, - expectedSupport: false, + expectedCompat: envoyCompat{ + isCompatible: false, + versionIncompatible: replacePatchVersionWithX(addNMinorVersion(xdscommon.EnvoyVersions[0], 1)), + }, }, { name: "not-supported-minor-lower", envoyVersion: addNMinorVersion(xdscommon.EnvoyVersions[len(xdscommon.EnvoyVersions)-1], -1), unsupportedList: xdscommon.UnsupportedEnvoyVersions, - expectedSupport: false, + expectedCompat: envoyCompat{ + isCompatible: false, + versionIncompatible: replacePatchVersionWithX(addNMinorVersion(xdscommon.EnvoyVersions[len(xdscommon.EnvoyVersions)-1], -1)), + }, }, { name: "not-supported-explicitly-unsupported-version", envoyVersion: addNPatchVersion(xdscommon.EnvoyVersions[0], 1), unsupportedList: []string{"1.23.1", addNPatchVersion(xdscommon.EnvoyVersions[0], 1)}, - expectedSupport: false, + expectedCompat: envoyCompat{ + isCompatible: false, + versionIncompatible: addNPatchVersion(xdscommon.EnvoyVersions[0], 1), + }, }, { name: "error-bad-input", envoyVersion: "1.abc.3", unsupportedList: xdscommon.UnsupportedEnvoyVersions, - expectedSupport: false, + expectedCompat: envoyCompat{}, isErrorExpected: true, }, } @@ -1752,7 +1767,7 @@ func TestCheckEnvoyVersionCompatibility(t *testing.T) { } else { assert.NoError(t, err) } - assert.Equal(t, tc.expectedSupport, actual) + assert.Equal(t, tc.expectedCompat, actual) }) } } From 84156afe8786d20e9ac8a91ebda627a525aa6f5b Mon Sep 17 00:00:00 2001 From: Matt Keeler Date: Fri, 3 Mar 2023 14:05:14 -0500 Subject: [PATCH 105/262] Remove private prefix from proto-gen-rpc-glue e2e test (#16433) --- internal/tools/proto-gen-rpc-glue/e2e/source.pb.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/tools/proto-gen-rpc-glue/e2e/source.pb.go b/internal/tools/proto-gen-rpc-glue/e2e/source.pb.go index c0f01a6690c..f90deb2067d 100644 --- a/internal/tools/proto-gen-rpc-glue/e2e/source.pb.go +++ b/internal/tools/proto-gen-rpc-glue/e2e/source.pb.go @@ -3,7 +3,7 @@ package e2e -import "github.com/hashicorp/consul/proto/private/pbcommon" +import "github.com/hashicorp/consul/proto/pbcommon" // @consul-rpc-glue: WriteRequest,TargetDatacenter type ExampleWriteRequest struct { From cc0765b87dc8e6628dedcfc2d2742b550c4e1321 Mon Sep 17 00:00:00 2001 From: Andrew Stucki Date: Fri, 3 Mar 2023 14:17:11 -0500 Subject: [PATCH 106/262] Fix resolution of service resolvers with subsets for external upstreams (#16499) * Fix resolution of service resolvers with subsets for external upstreams * Add tests * Add changelog entry * Update view filter logic --- .changelog/16499.txt | 3 ++ agent/rpcclient/health/view.go | 24 ++++++++++--- agent/rpcclient/health/view_test.go | 36 +++++++++++++++++++ .../capture.sh | 1 + .../service_s3.hcl | 17 +++++++++ .../case-terminating-gateway-subsets/setup.sh | 1 + .../case-terminating-gateway-subsets/vars.sh | 1 + .../verify.bats | 4 +++ test/integration/connect/envoy/helpers.bash | 33 +++++++++++++++++ 9 files changed, 116 insertions(+), 4 deletions(-) create mode 100644 .changelog/16499.txt create mode 100644 test/integration/connect/envoy/case-terminating-gateway-subsets/service_s3.hcl diff --git a/.changelog/16499.txt b/.changelog/16499.txt new file mode 100644 index 00000000000..4bd50db47e8 --- /dev/null +++ b/.changelog/16499.txt @@ -0,0 +1,3 @@ +```release-note:bug +mesh: Fix resolution of service resolvers with subsets for external upstreams +``` diff --git a/agent/rpcclient/health/view.go b/agent/rpcclient/health/view.go index 1684382de72..4dabc5e695a 100644 --- a/agent/rpcclient/health/view.go +++ b/agent/rpcclient/health/view.go @@ -50,8 +50,10 @@ func NewHealthView(req structs.ServiceSpecificRequest) (*HealthView, error) { return nil, err } return &HealthView{ - state: make(map[string]structs.CheckServiceNode), - filter: fe, + state: make(map[string]structs.CheckServiceNode), + filter: fe, + connect: req.Connect, + kind: req.ServiceKind, }, nil } @@ -61,8 +63,10 @@ func NewHealthView(req structs.ServiceSpecificRequest) (*HealthView, error) { // (IndexedCheckServiceNodes) and update it in place for each event - that // involves re-sorting each time etc. though. type HealthView struct { - state map[string]structs.CheckServiceNode - filter filterEvaluator + connect bool + kind structs.ServiceKind + state map[string]structs.CheckServiceNode + filter filterEvaluator } // Update implements View @@ -84,6 +88,13 @@ func (s *HealthView) Update(events []*pbsubscribe.Event) error { if csn == nil { return errors.New("check service node was unexpectedly nil") } + + // check if we intentionally need to skip the filter + if s.skipFilter(csn) { + s.state[id] = *csn + continue + } + passed, err := s.filter.Evaluate(*csn) if err != nil { return err @@ -100,6 +111,11 @@ func (s *HealthView) Update(events []*pbsubscribe.Event) error { return nil } +func (s *HealthView) skipFilter(csn *structs.CheckServiceNode) bool { + // we only do this for connect-enabled services that need to be routed through a terminating gateway + return s.kind == "" && s.connect && csn.Service.Kind == structs.ServiceKindTerminatingGateway +} + type filterEvaluator interface { Evaluate(datum interface{}) (bool, error) } diff --git a/agent/rpcclient/health/view_test.go b/agent/rpcclient/health/view_test.go index b419bc1ceab..0d199243b2c 100644 --- a/agent/rpcclient/health/view_test.go +++ b/agent/rpcclient/health/view_test.go @@ -941,3 +941,39 @@ func TestNewFilterEvaluator(t *testing.T) { }) } } + +func TestHealthView_SkipFilteringTerminatingGateways(t *testing.T) { + view, err := NewHealthView(structs.ServiceSpecificRequest{ + ServiceName: "name", + Connect: true, + QueryOptions: structs.QueryOptions{ + Filter: "Service.Meta.version == \"v1\"", + }, + }) + require.NoError(t, err) + + err = view.Update([]*pbsubscribe.Event{{ + Index: 1, + Payload: &pbsubscribe.Event_ServiceHealth{ + ServiceHealth: &pbsubscribe.ServiceHealthUpdate{ + Op: pbsubscribe.CatalogOp_Register, + CheckServiceNode: &pbservice.CheckServiceNode{ + Service: &pbservice.NodeService{ + Kind: structs.TerminatingGateway, + Service: "name", + Address: "127.0.0.1", + Port: 8443, + }, + }, + }, + }, + }}) + require.NoError(t, err) + + node, ok := (view.Result(1)).(*structs.IndexedCheckServiceNodes) + require.True(t, ok) + + require.Len(t, node.Nodes, 1) + require.Equal(t, "127.0.0.1", node.Nodes[0].Service.Address) + require.Equal(t, 8443, node.Nodes[0].Service.Port) +} diff --git a/test/integration/connect/envoy/case-terminating-gateway-subsets/capture.sh b/test/integration/connect/envoy/case-terminating-gateway-subsets/capture.sh index 2ef0c41a215..261bf4e29a6 100644 --- a/test/integration/connect/envoy/case-terminating-gateway-subsets/capture.sh +++ b/test/integration/connect/envoy/case-terminating-gateway-subsets/capture.sh @@ -2,3 +2,4 @@ snapshot_envoy_admin localhost:20000 terminating-gateway primary || true snapshot_envoy_admin localhost:19000 s1 primary || true +snapshot_envoy_admin localhost:19001 s3 primary || true diff --git a/test/integration/connect/envoy/case-terminating-gateway-subsets/service_s3.hcl b/test/integration/connect/envoy/case-terminating-gateway-subsets/service_s3.hcl new file mode 100644 index 00000000000..eb84c578ee9 --- /dev/null +++ b/test/integration/connect/envoy/case-terminating-gateway-subsets/service_s3.hcl @@ -0,0 +1,17 @@ +services { + id = "s3" + name = "s3" + port = 8184 + connect { + sidecar_service { + proxy { + upstreams = [ + { + destination_name = "s2" + local_bind_port = 8185 + } + ] + } + } + } +} diff --git a/test/integration/connect/envoy/case-terminating-gateway-subsets/setup.sh b/test/integration/connect/envoy/case-terminating-gateway-subsets/setup.sh index fdd49572ba8..57b85c74a6b 100644 --- a/test/integration/connect/envoy/case-terminating-gateway-subsets/setup.sh +++ b/test/integration/connect/envoy/case-terminating-gateway-subsets/setup.sh @@ -38,4 +38,5 @@ register_services primary # terminating gateway will act as s2's proxy gen_envoy_bootstrap s1 19000 +gen_envoy_bootstrap s3 19001 gen_envoy_bootstrap terminating-gateway 20000 primary true diff --git a/test/integration/connect/envoy/case-terminating-gateway-subsets/vars.sh b/test/integration/connect/envoy/case-terminating-gateway-subsets/vars.sh index 9e52629b8be..d4a4d75bdd8 100644 --- a/test/integration/connect/envoy/case-terminating-gateway-subsets/vars.sh +++ b/test/integration/connect/envoy/case-terminating-gateway-subsets/vars.sh @@ -4,5 +4,6 @@ export REQUIRED_SERVICES=" s1 s1-sidecar-proxy s2-v1 +s3 s3-sidecar-proxy terminating-gateway-primary " diff --git a/test/integration/connect/envoy/case-terminating-gateway-subsets/verify.bats b/test/integration/connect/envoy/case-terminating-gateway-subsets/verify.bats index 64a2499e357..028ddea85ad 100644 --- a/test/integration/connect/envoy/case-terminating-gateway-subsets/verify.bats +++ b/test/integration/connect/envoy/case-terminating-gateway-subsets/verify.bats @@ -38,3 +38,7 @@ load helpers assert_envoy_metric_at_least 127.0.0.1:20000 "v1.s2.default.primary.*cx_total" 1 } +@test "terminating-gateway is used for the upstream connection of the proxy" { + # make sure we resolve the terminating gateway as endpoint for the upstream + assert_upstream_has_endpoint_port 127.0.0.1:19001 "v1.s2" 8443 +} diff --git a/test/integration/connect/envoy/helpers.bash b/test/integration/connect/envoy/helpers.bash index 65bbe3b0070..a650f4ee29c 100755 --- a/test/integration/connect/envoy/helpers.bash +++ b/test/integration/connect/envoy/helpers.bash @@ -361,6 +361,39 @@ function get_upstream_endpoint { | select(.name|startswith(\"${CLUSTER_NAME}\"))" } +function get_upstream_endpoint_port { + local HOSTPORT=$1 + local CLUSTER_NAME=$2 + local PORT_VALUE=$3 + run curl -s -f "http://${HOSTPORT}/clusters?format=json" + [ "$status" -eq 0 ] + echo "$output" | jq --raw-output " +.cluster_statuses[] +| select(.name|startswith(\"${CLUSTER_NAME}\")) +| [.host_statuses[].address.socket_address.port_value] +| [select(.[] == ${PORT_VALUE})] +| length" +} + +function assert_upstream_has_endpoint_port_once { + local HOSTPORT=$1 + local CLUSTER_NAME=$2 + local PORT_VALUE=$3 + + GOT_COUNT=$(get_upstream_endpoint_port $HOSTPORT $CLUSTER_NAME $PORT_VALUE) + + [ "$GOT_COUNT" -eq 1 ] +} + +function assert_upstream_has_endpoint_port { + local HOSTPORT=$1 + local CLUSTER_NAME=$2 + local PORT_VALUE=$3 + + run retry_long assert_upstream_has_endpoint_port_once $HOSTPORT $CLUSTER_NAME $PORT_VALUE + [ "$status" -eq 0 ] +} + function get_upstream_endpoint_in_status_count { local HOSTPORT=$1 local CLUSTER_NAME=$2 From 43bd3512f0571214dd32da4b079c3a842d7b11eb Mon Sep 17 00:00:00 2001 From: trujillo-adam <47586768+trujillo-adam@users.noreply.github.com> Date: Fri, 3 Mar 2023 11:17:26 -0800 Subject: [PATCH 107/262] fixed broken links associated with cluster peering updates (#16523) * fixed broken links associated with cluster peering updates * additional links to fix * typos * fixed redirect file --- .../api-gateway/usage/route-to-peered-services.mdx | 4 ++-- .../content/docs/connect/cluster-peering/index.mdx | 2 +- .../content/docs/k8s/annotations-and-labels.mdx | 4 ++-- .../cluster-peering/usage/establish-peering.mdx | 2 +- website/content/docs/k8s/crds/index.mdx | 4 ++-- .../docs/release-notes/consul-k8s/v0_47_x.mdx | 2 +- website/redirects.js | 14 ++++++++++---- 7 files changed, 19 insertions(+), 13 deletions(-) diff --git a/website/content/docs/api-gateway/usage/route-to-peered-services.mdx b/website/content/docs/api-gateway/usage/route-to-peered-services.mdx index 33bc54cdb48..fe8ca69732c 100644 --- a/website/content/docs/api-gateway/usage/route-to-peered-services.mdx +++ b/website/content/docs/api-gateway/usage/route-to-peered-services.mdx @@ -12,8 +12,8 @@ This topic describes how to configure Consul API Gateway to route traffic to ser 1. Consul 1.14 or later 1. Verify that the [requirements](/consul/docs/api-gateway/tech-specs) have been met. 1. Verify that the Consul API Gateway CRDs and controller have been installed and applied. Refer to [Installation](/consul/docs/api-gateway/install) for details. -1. A peering connection must already be established between Consul clusters. Refer to [Cluster Peering on Kubernetes](/consul/docs/connect/cluster-peering/k8s) for instructions. -1. The Consul service that you want to route traffic to must be exported to the cluster containing your `Gateway`. Refer to [Cluster Peering on Kubernetes](/consul/docs/connect/cluster-peering/k8s) for instructions. +1. A peering connection must already be established between Consul clusters. Refer to [Cluster Peering on Kubernetes](/consul/docs/k8s/connect/cluster-peering/tech-specs) for instructions. +1. The Consul service that you want to route traffic to must be exported to the cluster containing your `Gateway`. Refer to [Cluster Peering on Kubernetes](/consul/docs/k8s/connect/cluster-peering/tech-specs) for instructions. 1. A `ServiceResolver` for the Consul service you want to route traffic to must be created in the cluster that contains your `Gateway`. Refer to [Service Resolver Configuration Entry](/consul/docs/connect/config-entries/service-resolver) for instructions. ## Configuration diff --git a/website/content/docs/connect/cluster-peering/index.mdx b/website/content/docs/connect/cluster-peering/index.mdx index aeb940d638c..f8e1c18caf3 100644 --- a/website/content/docs/connect/cluster-peering/index.mdx +++ b/website/content/docs/connect/cluster-peering/index.mdx @@ -57,7 +57,7 @@ The following resources are available to help you use Consul's cluster peering f **Usage documentation:** -- [Establish cluster peering connections](/consul/docs/connect/cluster-peering/usage/establish-peering) +- [Establish cluster peering connections](/consul/docs/connect/cluster-peering/usage/establish-cluster-peering) - [Manage cluster peering connections](/consul/docs/connect/cluster-peering/usage/manage-connections) - [Manage L7 traffic with cluster peering](/consul/docs/connect/cluster-peering/usage/peering-traffic-management) diff --git a/website/content/docs/k8s/annotations-and-labels.mdx b/website/content/docs/k8s/annotations-and-labels.mdx index d6ea11d4f1d..f28f6dd5fa6 100644 --- a/website/content/docs/k8s/annotations-and-labels.mdx +++ b/website/content/docs/k8s/annotations-and-labels.mdx @@ -75,7 +75,7 @@ The following Kubernetes resource annotations could be used on a pod to control - Unlabeled: Use the unlabeled annotation format to specify a service name, Consul Enterprise namespaces and partitions, and - datacenters. To use [cluster peering](/consul/docs/connect/cluster-peering/k8s) with upstreams, use the following + datacenters. To use [cluster peering](/consul/docs/k8s/connect/cluster-peering/tech-specs) with upstreams, use the following labeled format. - Service name: Place the service name at the beginning of the annotation to specify the upstream service. You can also append the datacenter where the service is deployed (optional). @@ -98,7 +98,7 @@ The following Kubernetes resource annotations could be used on a pod to control - Admin partitions (requires Consul Enterprise 1.11+): Upstream services may be running in a different partition. You must specify the namespace when specifying a partition. Place the partition name after the namespace. If you specify the name of the datacenter (optional), it must be the local datacenter. Communicating across partitions using this method is only supported within a datacenter. For cross partition communication across datacenters, refer to [cluster - peering](/consul/docs/connect/cluster-peering/k8s). + peering](/consul/docs/k8s/connect/cluster-peering/tech-specs). ```yaml annotations: "consul.hashicorp.com/connect-service-upstreams":"[service-name].[service-namespace].[service-partition]:[port]:[optional datacenter]" diff --git a/website/content/docs/k8s/connect/cluster-peering/usage/establish-peering.mdx b/website/content/docs/k8s/connect/cluster-peering/usage/establish-peering.mdx index 3c85706cc62..19e504b95d6 100644 --- a/website/content/docs/k8s/connect/cluster-peering/usage/establish-peering.mdx +++ b/website/content/docs/k8s/connect/cluster-peering/usage/establish-peering.mdx @@ -18,7 +18,7 @@ The overall process for establishing a cluster peering connection consists of th Cluster peering between services cannot be established until all four steps are complete. -For general guidance for establishing cluster peering connections, refer to [Establish cluster peering connections](/consul/docs/connect/cluster-peering/usage/establish-peering). +For general guidance for establishing cluster peering connections, refer to [Establish cluster peering connections](/consul/docs/connect/cluster-peering/usage/establish-cluster-peering). ## Prerequisites diff --git a/website/content/docs/k8s/crds/index.mdx b/website/content/docs/k8s/crds/index.mdx index 342fe1aaa4c..6a68960a04d 100644 --- a/website/content/docs/k8s/crds/index.mdx +++ b/website/content/docs/k8s/crds/index.mdx @@ -16,8 +16,8 @@ You can specify the following values in the `kind` field. Click on a configurati - [`Mesh`](/consul/docs/connect/config-entries/mesh) - [`ExportedServices`](/consul/docs/connect/config-entries/exported-services) -- [`PeeringAcceptor`](/consul/docs/connect/cluster-peering/k8s#peeringacceptor) -- [`PeeringDialer`](/consul/docs/connect/cluster-peering/k8s#peeringdialer) +- [`PeeringAcceptor`](/consul/docs/k8s/connect/cluster-peering/tech-specs#peeringacceptor) +- [`PeeringDialer`](/consul/docs/k8s/connect/cluster-peering/tech-specs#peeringdialer) - [`ProxyDefaults`](/consul/docs/connect/config-entries/proxy-defaults) - [`ServiceDefaults`](/consul/docs/connect/config-entries/service-defaults) - [`ServiceSplitter`](/consul/docs/connect/config-entries/service-splitter) diff --git a/website/content/docs/release-notes/consul-k8s/v0_47_x.mdx b/website/content/docs/release-notes/consul-k8s/v0_47_x.mdx index 3d266b13350..8f185bb6f37 100644 --- a/website/content/docs/release-notes/consul-k8s/v0_47_x.mdx +++ b/website/content/docs/release-notes/consul-k8s/v0_47_x.mdx @@ -9,7 +9,7 @@ description: >- ## Release Highlights -- **Cluster Peering (Beta)**: This release introduces support for Cluster Peering, which allows service connectivity between two independent clusters. Enabling peering will deploy the peering controllers and PeeringAcceptor and PeeringDialer CRDs. The new CRDs are used to establish a peering connection between two clusters. Refer to [Cluster Peering on Kubernetes](/consul/docs/connect/cluster-peering/k8s) for full instructions on using Cluster Peering on Kubernetes. +- **Cluster Peering (Beta)**: This release introduces support for cluster peering, which allows service connectivity between two independent clusters. When you enable cluster peering, Consul deploys the peering controllers and `PeeringAcceptor` and `PeeringDialer` CRDs. The new CRDs are used to establish a peering connection between two clusters. Refer to [Cluster Peering Overview](/consul/docs/connect/cluster-peering) for full instructions on using Cluster Peering on Kubernetes. - **Envoy Proxy Debugging CLI Commands**: This release introduces new commands to quickly identify proxies and troubleshoot Envoy proxies for sidecars and gateways. * Add `consul-k8s proxy list` command for displaying pods running Envoy managed by Consul. diff --git a/website/redirects.js b/website/redirects.js index 74caeb5e388..3e462501650 100644 --- a/website/redirects.js +++ b/website/redirects.js @@ -6,14 +6,20 @@ module.exports = [ { - source: '/docs/connect/cluster-peering/create-manage-peering', + source: '/consul/docs/connect/cluster-peering/create-manage-peering', destination: - '/docs/connect/cluster-peering/usage/establish-cluster-peering', + '/consul/docs/connect/cluster-peering/usage/establish-cluster-peering', permanent: true, }, { - source: '/docs/connect/cluster-peering/k8s', - destination: '/docs/k8s/connect/cluster-peering/k8s-tech-specs', + source: '/consul/docs/connect/cluster-peering/usage/establish-peering', + destination: + '/consul/docs/connect/cluster-peering/usage/establish-cluster-peering', + permanent: true, + }, + { + source: '/consul/docs/connect/cluster-peering/k8s', + destination: '/consul/docs/k8s/connect/cluster-peering/tech-specs', permanent: true, }, ] From 56ffee6d423c327e00824277590cb49344341f99 Mon Sep 17 00:00:00 2001 From: John Eikenberry Date: Fri, 3 Mar 2023 19:29:53 +0000 Subject: [PATCH 108/262] add provider ca support for approle auth-method Adds support for the approle auth-method. Only handles using the approle role/secret to auth and it doesn't support the agent's extra management configuration options (wrap and delete after read) as they are not required as part of the auth (ie. they are vault agent things). --- .changelog/16259.txt | 3 + agent/connect/ca/provider_vault.go | 3 +- .../connect/ca/provider_vault_auth_approle.go | 66 +++++++++++++ agent/connect/ca/provider_vault_auth_test.go | 94 +++++++++++++++++++ agent/connect/ca/provider_vault_test.go | 2 +- 5 files changed, 166 insertions(+), 2 deletions(-) create mode 100644 .changelog/16259.txt create mode 100644 agent/connect/ca/provider_vault_auth_approle.go diff --git a/.changelog/16259.txt b/.changelog/16259.txt new file mode 100644 index 00000000000..dd73aaf6e66 --- /dev/null +++ b/.changelog/16259.txt @@ -0,0 +1,3 @@ +```release-note:improvement +ca: support Vault agent auto-auth config for Vault CA provider using AppRole authentication. +``` diff --git a/agent/connect/ca/provider_vault.go b/agent/connect/ca/provider_vault.go index e8b14e412b1..d14fd0a4d2d 100644 --- a/agent/connect/ca/provider_vault.go +++ b/agent/connect/ca/provider_vault.go @@ -944,6 +944,8 @@ func configureVaultAuthMethod(authMethod *structs.VaultAuthMethod) (VaultAuthent return NewGCPAuthClient(authMethod) case VaultAuthMethodTypeJWT: return NewJwtAuthClient(authMethod) + case VaultAuthMethodTypeAppRole: + return NewAppRoleAuthClient(authMethod) case VaultAuthMethodTypeKubernetes: return NewK8sAuthClient(authMethod) // These auth methods require a username for the login API path. @@ -968,7 +970,6 @@ func configureVaultAuthMethod(authMethod *structs.VaultAuthMethod) (VaultAuthent "please provide the token with the 'token' parameter in the CA configuration") // The rest of the auth methods use auth/ login API path. case VaultAuthMethodTypeAliCloud, - VaultAuthMethodTypeAppRole, VaultAuthMethodTypeCloudFoundry, VaultAuthMethodTypeGitHub, VaultAuthMethodTypeKerberos, diff --git a/agent/connect/ca/provider_vault_auth_approle.go b/agent/connect/ca/provider_vault_auth_approle.go new file mode 100644 index 00000000000..fad6011fcb3 --- /dev/null +++ b/agent/connect/ca/provider_vault_auth_approle.go @@ -0,0 +1,66 @@ +package ca + +import ( + "bytes" + "fmt" + "os" + "strings" + + "github.com/hashicorp/consul/agent/structs" +) + +// left out 2 config options as we are re-using vault agent's auth config. +// Why? +// remove_secret_id_file_after_reading - don't remove what we don't own +// secret_id_response_wrapping_path - wrapping the secret before writing to disk +// (which we don't need to do) + +func NewAppRoleAuthClient(authMethod *structs.VaultAuthMethod) (*VaultAuthClient, error) { + authClient := NewVaultAPIAuthClient(authMethod, "") + // check for hardcoded /login params + if legacyCheck(authMethod.Params, "role_id", "secret_id") { + return authClient, nil + } + + // check for required config params + key := "role_id_file_path" + if val, ok := authMethod.Params[key].(string); !ok { + return nil, fmt.Errorf("missing '%s' value", key) + } else if strings.TrimSpace(val) == "" { + return nil, fmt.Errorf("'%s' value is empty", key) + } + authClient.LoginDataGen = ArLoginDataGen + + return authClient, nil +} + +func ArLoginDataGen(authMethod *structs.VaultAuthMethod) (map[string]any, error) { + // don't need to check for legacy params as this func isn't used in that case + params := authMethod.Params + // role_id is required + roleIdFilePath := params["role_id_file_path"].(string) + // secret_id is optional (secret_ok is used in check below) + // secretIdFilePath, secret_ok := params["secret_id_file_path"].(string) + secretIdFilePath, hasSecret := params["secret_id_file_path"].(string) + if hasSecret && strings.TrimSpace(secretIdFilePath) == "" { + hasSecret = false + } + + var err error + var rawRoleID, rawSecretID []byte + data := make(map[string]any) + if rawRoleID, err = os.ReadFile(roleIdFilePath); err != nil { + return nil, err + } + data["role_id"] = string(rawRoleID) + if hasSecret { + switch rawSecretID, err = os.ReadFile(secretIdFilePath); { + case err != nil: + return nil, err + case len(bytes.TrimSpace(rawSecretID)) > 0: + data["secret_id"] = strings.TrimSpace(string(rawSecretID)) + } + } + + return data, nil +} diff --git a/agent/connect/ca/provider_vault_auth_test.go b/agent/connect/ca/provider_vault_auth_test.go index 6601f9f4b0e..45377b03ac2 100644 --- a/agent/connect/ca/provider_vault_auth_test.go +++ b/agent/connect/ca/provider_vault_auth_test.go @@ -568,3 +568,97 @@ func TestVaultCAProvider_K8sAuthClient(t *testing.T) { }) } } + +func TestVaultCAProvider_AppRoleAuthClient(t *testing.T) { + roleID, secretID := "test_role_id", "test_secret_id" + + roleFd, err := os.CreateTemp("", "role") + require.NoError(t, err) + _, err = roleFd.WriteString(roleID) + require.NoError(t, err) + err = roleFd.Close() + require.NoError(t, err) + + secretFd, err := os.CreateTemp("", "secret") + require.NoError(t, err) + _, err = secretFd.WriteString(secretID) + require.NoError(t, err) + err = secretFd.Close() + require.NoError(t, err) + + roleIdPath := roleFd.Name() + secretIdPath := secretFd.Name() + + defer func() { + os.Remove(secretFd.Name()) + os.Remove(roleFd.Name()) + }() + + cases := map[string]struct { + authMethod *structs.VaultAuthMethod + expData map[string]any + expErr error + }{ + "base-case": { + authMethod: &structs.VaultAuthMethod{ + Type: "approle", + Params: map[string]any{ + "role_id_file_path": roleIdPath, + "secret_id_file_path": secretIdPath, + }, + }, + expData: map[string]any{ + "role_id": roleID, + "secret_id": secretID, + }, + }, + "optional-secret-left-out": { + authMethod: &structs.VaultAuthMethod{ + Type: "approle", + Params: map[string]any{ + "role_id_file_path": roleIdPath, + }, + }, + expData: map[string]any{ + "role_id": roleID, + }, + }, + "missing-role-id-file-path": { + authMethod: &structs.VaultAuthMethod{ + Type: "approle", + Params: map[string]any{}, + }, + expErr: fmt.Errorf("missing '%s' value", "role_id_file_path"), + }, + "legacy-direct-values": { + authMethod: &structs.VaultAuthMethod{ + Type: "approle", + Params: map[string]any{ + "role_id": "test-role", + "secret_id": "test-secret", + }, + }, + expData: map[string]any{ + "role_id": "test-role", + "secret_id": "test-secret", + }, + }, + } + + for k, c := range cases { + t.Run(k, func(t *testing.T) { + auth, err := NewAppRoleAuthClient(c.authMethod) + if c.expErr != nil { + require.Error(t, err) + require.EqualError(t, c.expErr, err.Error()) + return + } + require.NoError(t, err) + if auth.LoginDataGen != nil { + data, err := auth.LoginDataGen(c.authMethod) + require.NoError(t, err) + require.Equal(t, c.expData, data) + } + }) + } +} diff --git a/agent/connect/ca/provider_vault_test.go b/agent/connect/ca/provider_vault_test.go index 80fbff45c7e..7242dda9944 100644 --- a/agent/connect/ca/provider_vault_test.go +++ b/agent/connect/ca/provider_vault_test.go @@ -105,7 +105,7 @@ func TestVaultCAProvider_configureVaultAuthMethod(t *testing.T) { hasLDG bool }{ "alicloud": {expLoginPath: "auth/alicloud/login"}, - "approle": {expLoginPath: "auth/approle/login"}, + "approle": {expLoginPath: "auth/approle/login", params: map[string]any{"role_id_file_path": "test-path"}, hasLDG: true}, "aws": {expLoginPath: "auth/aws/login", params: map[string]interface{}{"type": "iam"}, hasLDG: true}, "azure": {expLoginPath: "auth/azure/login", params: map[string]interface{}{"role": "test-role", "resource": "test-resource"}, hasLDG: true}, "cf": {expLoginPath: "auth/cf/login"}, From 8910002e8fcf2249533b6f2320f3332177057366 Mon Sep 17 00:00:00 2001 From: John Eikenberry Date: Fri, 3 Mar 2023 19:32:21 +0000 Subject: [PATCH 109/262] update connect/ca's vault AuthMethod conf section (#16346) Updated Params field to re-frame as supporting arguments specific to the supported vault-agent auth-auth methods with links to each methods "#configuration" section. Included a call out limits on parameters supported. --- website/content/docs/connect/ca/vault.mdx | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/website/content/docs/connect/ca/vault.mdx b/website/content/docs/connect/ca/vault.mdx index 54fe5f4b674..708e3e8dd2e 100644 --- a/website/content/docs/connect/ca/vault.mdx +++ b/website/content/docs/connect/ca/vault.mdx @@ -94,17 +94,14 @@ The key after the slash refers to the corresponding option name in the agent con on how to configure individual auth methods. If auth method is provided, Consul will obtain a new token from Vault when the token can no longer be renewed. - - `Type`/ `type` (`string: ""`) - The type of Vault auth method. + - `Type`/ `type` (`string: ""`) - The type of Vault auth method. Valid options are "approle", "aws", "azure", "gcp", "jwt" and "kubernetes". - `MountPath`/ `mount_path` (`string: `) - The mount path of the auth method. If not provided the auth method type will be used as the mount path. - - `Params`/`params` (`map: nil`) - The parameters to configure the auth method. Please see - [Vault Auth Methods](/vault/docs/auth) for information on how to configure the - auth method you wish to use. If using the Kubernetes auth method, - Consul will read the service account token from the - default mount path `/var/run/secrets/kubernetes.io/serviceaccount/token` if the `jwt` parameter - is not provided. + - `Params`/`params` (`map: nil`) - The parameters to configure the auth method. The configuration parameters needed will depend on which auth type you are using. Please refer to the Vault Agent auto-auth method documentation for details on their configuration options: [AppRole](/vault/docs/agent/autoauth/methods/approle#configuration), [AWS](/vault/docs/agent/autoauth/methods/aws#configuration), [Azure](/vault/docs/agent/autoauth/methods/azure#configuration), [GCP](/vault/docs/agent/autoauth/methods/gcp#configuration), [JWT](/vault/docs/agent/autoauth/methods/jwt#configuration), [Kubernetes](/vault/docs/agent/autoauth/methods/kubernetes#configuration). + + Only the authentication related fields (for example, JWT's `path` and `role`) are supported. The optional management fields (for example: `remove_jwt_after_reading`) are not supported. - `RootPKIPath` / `root_pki_path` (`string: `) - The path to a PKI secrets engine for the root certificate. From 9a485cdb49fa3f56606493eb0746a51217e849ad Mon Sep 17 00:00:00 2001 From: "R.B. Boyer" <4903+rboyer@users.noreply.github.com> Date: Fri, 3 Mar 2023 14:27:53 -0600 Subject: [PATCH 110/262] proxycfg: ensure that an irrecoverable error in proxycfg closes the xds session and triggers a replacement proxycfg watcher (#16497) Receiving an "acl not found" error from an RPC in the agent cache and the streaming/event components will cause any request loops to cease under the assumption that they will never work again if the token was destroyed. This prevents log spam (#14144, #9738). Unfortunately due to things like: - authz requests going to stale servers that may not have witnessed the token creation yet - authz requests in a secondary datacenter happening before the tokens get replicated to that datacenter - authz requests from a primary TO a secondary datacenter happening before the tokens get replicated to that datacenter The caller will get an "acl not found" *before* the token exists, rather than just after. The machinery added above in the linked PRs will kick in and prevent the request loop from looping around again once the tokens actually exist. For `consul-dataplane` usages, where xDS is served by the Consul servers rather than the clients ultimately this is not a problem because in that scenario the `agent/proxycfg` machinery is on-demand and launched by a new xDS stream needing data for a specific service in the catalog. If the watching goroutines are terminated it ripples down and terminates the xDS stream, which CDP will eventually re-establish and restart everything. For Consul client usages, the `agent/proxycfg` machinery is ahead-of-time launched at service registration time (called "local" in some of the proxycfg machinery) so when the xDS stream comes in the data is already ready to go. If the watching goroutines terminate it should terminate the xDS stream, but there's no mechanism to re-spawn the watching goroutines. If the xDS stream reconnects it will see no `ConfigSnapshot` and will not get one again until the client agent is restarted, or the service is re-registered with something changed in it. This PR fixes a few things in the machinery: - there was an inadvertent deadlock in fetching snapshot from the proxycfg machinery by xDS, such that when the watching goroutine terminated the snapshots would never be fetched. This caused some of the xDS machinery to get indefinitely paused and not finish the teardown properly. - Every 30s we now attempt to re-insert all locally registered services into the proxycfg machinery. - When services are re-inserted into the proxycfg machinery we special case "dead" ones such that we unilaterally replace them rather that doing that conditionally. --- .changelog/16497.txt | 3 + agent/agent.go | 11 +- agent/config/builder.go | 1 + agent/config/runtime.go | 4 + agent/config/runtime_test.go | 13 +- .../TestRuntimeConfig_Sanitize.golden | 1 + agent/proxycfg-sources/local/sync.go | 14 ++ agent/proxycfg/manager.go | 2 +- agent/proxycfg/state.go | 32 +++- agent/proxycfg_test.go | 138 ++++++++++++++++++ agent/testagent.go | 3 + 11 files changed, 208 insertions(+), 14 deletions(-) create mode 100644 .changelog/16497.txt create mode 100644 agent/proxycfg_test.go diff --git a/.changelog/16497.txt b/.changelog/16497.txt new file mode 100644 index 00000000000..3aa3633ac3a --- /dev/null +++ b/.changelog/16497.txt @@ -0,0 +1,3 @@ +```release-note:bug +proxycfg: ensure that an irrecoverable error in proxycfg closes the xds session and triggers a replacement proxycfg watcher +``` diff --git a/agent/agent.go b/agent/agent.go index 7b218174a48..0d11e462d18 100644 --- a/agent/agent.go +++ b/agent/agent.go @@ -721,11 +721,12 @@ func (a *Agent) Start(ctx context.Context) error { go localproxycfg.Sync( &lib.StopChannelContext{StopCh: a.shutdownCh}, localproxycfg.SyncConfig{ - Manager: a.proxyConfig, - State: a.State, - Logger: a.proxyConfig.Logger.Named("agent-state"), - Tokens: a.baseDeps.Tokens, - NodeName: a.config.NodeName, + Manager: a.proxyConfig, + State: a.State, + Logger: a.proxyConfig.Logger.Named("agent-state"), + Tokens: a.baseDeps.Tokens, + NodeName: a.config.NodeName, + ResyncFrequency: a.config.LocalProxyConfigResyncInterval, }, ) diff --git a/agent/config/builder.go b/agent/config/builder.go index f682bf7b142..5d697b027ee 100644 --- a/agent/config/builder.go +++ b/agent/config/builder.go @@ -1091,6 +1091,7 @@ func (b *builder) build() (rt RuntimeConfig, err error) { Watches: c.Watches, XDSUpdateRateLimit: limitVal(c.XDS.UpdateMaxPerSecond), AutoReloadConfigCoalesceInterval: 1 * time.Second, + LocalProxyConfigResyncInterval: 30 * time.Second, } rt.TLS, err = b.buildTLSConfig(rt, c.TLS) diff --git a/agent/config/runtime.go b/agent/config/runtime.go index 627c1e56440..b0d9cf436e5 100644 --- a/agent/config/runtime.go +++ b/agent/config/runtime.go @@ -1475,6 +1475,10 @@ type RuntimeConfig struct { // AutoReloadConfigCoalesceInterval Coalesce Interval for auto reload config AutoReloadConfigCoalesceInterval time.Duration + // LocalProxyConfigResyncInterval is not a user-configurable value and exists + // here so that tests can use a smaller value. + LocalProxyConfigResyncInterval time.Duration + EnterpriseRuntimeConfig } diff --git a/agent/config/runtime_test.go b/agent/config/runtime_test.go index 2844dd3a7f3..a8208f0eccf 100644 --- a/agent/config/runtime_test.go +++ b/agent/config/runtime_test.go @@ -5995,12 +5995,13 @@ func TestLoad_FullConfig(t *testing.T) { nodeEntMeta := structs.NodeEnterpriseMetaInDefaultPartition() expected := &RuntimeConfig{ // non-user configurable values - AEInterval: time.Minute, - CheckDeregisterIntervalMin: time.Minute, - CheckReapInterval: 30 * time.Second, - SegmentNameLimit: 64, - SyncCoordinateIntervalMin: 15 * time.Second, - SyncCoordinateRateTarget: 64, + AEInterval: time.Minute, + CheckDeregisterIntervalMin: time.Minute, + CheckReapInterval: 30 * time.Second, + SegmentNameLimit: 64, + SyncCoordinateIntervalMin: 15 * time.Second, + SyncCoordinateRateTarget: 64, + LocalProxyConfigResyncInterval: 30 * time.Second, Revision: "JNtPSav3", Version: "R909Hblt", diff --git a/agent/config/testdata/TestRuntimeConfig_Sanitize.golden b/agent/config/testdata/TestRuntimeConfig_Sanitize.golden index 75d216fabdb..2c5b91c98a5 100644 --- a/agent/config/testdata/TestRuntimeConfig_Sanitize.golden +++ b/agent/config/testdata/TestRuntimeConfig_Sanitize.golden @@ -233,6 +233,7 @@ "KVMaxValueSize": 1234567800000000, "LeaveDrainTime": "0s", "LeaveOnTerm": false, + "LocalProxyConfigResyncInterval": "0s", "Logging": { "EnableSyslog": false, "LogFilePath": "", diff --git a/agent/proxycfg-sources/local/sync.go b/agent/proxycfg-sources/local/sync.go index c6cee8c61d1..5702d2f3684 100644 --- a/agent/proxycfg-sources/local/sync.go +++ b/agent/proxycfg-sources/local/sync.go @@ -2,6 +2,7 @@ package local import ( "context" + "time" "github.com/hashicorp/go-hclog" @@ -11,6 +12,8 @@ import ( "github.com/hashicorp/consul/agent/token" ) +const resyncFrequency = 30 * time.Second + const source proxycfg.ProxySource = "local" // SyncConfig contains the dependencies required by Sync. @@ -30,6 +33,10 @@ type SyncConfig struct { // Logger will be used to write log messages. Logger hclog.Logger + + // ResyncFrequency is how often to do a resync and recreate any terminated + // watches. + ResyncFrequency time.Duration } // Sync watches the agent's local state and registers/deregisters services with @@ -50,12 +57,19 @@ func Sync(ctx context.Context, cfg SyncConfig) { cfg.State.Notify(stateCh) defer cfg.State.StopNotify(stateCh) + var resyncCh <-chan time.Time for { sync(cfg) + if resyncCh == nil && cfg.ResyncFrequency > 0 { + resyncCh = time.After(cfg.ResyncFrequency) + } + select { case <-stateCh: // Wait for a state change. + case <-resyncCh: + resyncCh = nil case <-ctx.Done(): return } diff --git a/agent/proxycfg/manager.go b/agent/proxycfg/manager.go index c58268e7e03..d21ff4f1ea5 100644 --- a/agent/proxycfg/manager.go +++ b/agent/proxycfg/manager.go @@ -158,7 +158,7 @@ func (m *Manager) Register(id ProxyID, ns *structs.NodeService, source ProxySour func (m *Manager) register(id ProxyID, ns *structs.NodeService, source ProxySource, token string, overwrite bool) error { state, ok := m.proxies[id] - if ok { + if ok && !state.stoppedRunning() { if state.source != source && !overwrite { // Registered by a different source, leave as-is. return nil diff --git a/agent/proxycfg/state.go b/agent/proxycfg/state.go index d312c3b4c10..2347b04cc53 100644 --- a/agent/proxycfg/state.go +++ b/agent/proxycfg/state.go @@ -83,10 +83,20 @@ type state struct { ch chan UpdateEvent snapCh chan ConfigSnapshot reqCh chan chan *ConfigSnapshot + doneCh chan struct{} rateLimiter *rate.Limiter } +func (s *state) stoppedRunning() bool { + select { + case <-s.doneCh: + return true + default: + return false + } +} + // failed returns whether run exited because a data source is in an // irrecoverable state. func (s *state) failed() bool { @@ -182,6 +192,7 @@ func newState(id ProxyID, ns *structs.NodeService, source ProxySource, token str ch: ch, snapCh: make(chan ConfigSnapshot, 1), reqCh: make(chan chan *ConfigSnapshot, 1), + doneCh: make(chan struct{}), rateLimiter: rateLimiter, }, nil } @@ -265,6 +276,9 @@ func (s *state) Watch() (<-chan ConfigSnapshot, error) { // Close discards the state and stops any long-running watches. func (s *state) Close(failed bool) error { + if s.stoppedRunning() { + return nil + } if s.cancel != nil { s.cancel() } @@ -314,6 +328,9 @@ func (s *state) run(ctx context.Context, snap *ConfigSnapshot) { } func (s *state) unsafeRun(ctx context.Context, snap *ConfigSnapshot) { + // Closing the done channel signals that this entire state is no longer + // going to be updated. + defer close(s.doneCh) // Close the channel we return from Watch when we stop so consumers can stop // watching and clean up their goroutines. It's important we do this here and // not in Close since this routine sends on this chan and so might panic if it @@ -429,9 +446,20 @@ func (s *state) unsafeRun(ctx context.Context, snap *ConfigSnapshot) { func (s *state) CurrentSnapshot() *ConfigSnapshot { // Make a chan for the response to be sent on ch := make(chan *ConfigSnapshot, 1) - s.reqCh <- ch + + select { + case <-s.doneCh: + return nil + case s.reqCh <- ch: + } + // Wait for the response - return <-ch + select { + case <-s.doneCh: + return nil + case resp := <-ch: + return resp + } } // Changed returns whether or not the passed NodeService has had any of the diff --git a/agent/proxycfg_test.go b/agent/proxycfg_test.go new file mode 100644 index 00000000000..18a5c586245 --- /dev/null +++ b/agent/proxycfg_test.go @@ -0,0 +1,138 @@ +package agent + +import ( + "encoding/json" + "net/http" + "net/http/httptest" + "testing" + "time" + + "github.com/stretchr/testify/require" + + "github.com/hashicorp/consul/agent/grpc-external/limiter" + "github.com/hashicorp/consul/agent/proxycfg" + "github.com/hashicorp/consul/agent/structs" + "github.com/hashicorp/consul/api" + "github.com/hashicorp/consul/testrpc" +) + +func TestAgent_local_proxycfg(t *testing.T) { + a := NewTestAgent(t, TestACLConfig()) + defer a.Shutdown() + + testrpc.WaitForLeader(t, a.RPC, "dc1") + + token := generateUUID() + + svc := &structs.NodeService{ + ID: "db", + Service: "db", + Port: 5000, + EnterpriseMeta: *structs.DefaultEnterpriseMetaInDefaultPartition(), + } + require.NoError(t, a.State.AddServiceWithChecks(svc, nil, token, true)) + + proxy := &structs.NodeService{ + Kind: structs.ServiceKindConnectProxy, + ID: "db-sidecar-proxy", + Service: "db-sidecar-proxy", + Port: 5000, + // Set this internal state that we expect sidecar registrations to have. + LocallyRegisteredAsSidecar: true, + Proxy: structs.ConnectProxyConfig{ + DestinationServiceName: "db", + Upstreams: structs.TestUpstreams(t), + }, + EnterpriseMeta: *structs.DefaultEnterpriseMetaInDefaultPartition(), + } + require.NoError(t, a.State.AddServiceWithChecks(proxy, nil, token, true)) + + // This is a little gross, but this gives us the layered pair of + // local/catalog sources for now. + cfg := a.xdsServer.CfgSrc + + var ( + timer = time.After(100 * time.Millisecond) + timerFired = false + finalTimer <-chan time.Time + ) + + var ( + firstTime = true + ch <-chan *proxycfg.ConfigSnapshot + stc limiter.SessionTerminatedChan + cancel proxycfg.CancelFunc + ) + defer func() { + if cancel != nil { + cancel() + } + }() + for { + if ch == nil { + // Sign up for a stream of config snapshots, in the same manner as the xds server. + sid := proxy.CompoundServiceID() + + if firstTime { + firstTime = false + } else { + t.Logf("re-creating watch") + } + + // Prior to fixes in https://github.com/hashicorp/consul/pull/16497 + // this call to Watch() would deadlock. + var err error + ch, stc, cancel, err = cfg.Watch(sid, a.config.NodeName, token) + require.NoError(t, err) + } + select { + case <-stc: + t.Fatal("session unexpectedly terminated") + case snap, ok := <-ch: + if !ok { + t.Logf("channel is closed") + cancel() + ch, stc, cancel = nil, nil, nil + continue + } + require.NotNil(t, snap) + if !timerFired { + t.Fatal("should not have gotten snapshot until after we manifested the token") + } + return + case <-timer: + timerFired = true + finalTimer = time.After(1 * time.Second) + + // This simulates the eventual consistency of a token + // showing up on a server after it's creation by + // pre-creating the UUID and later using that as the + // initial SecretID for a real token. + gotToken := testWriteToken(t, a, &api.ACLToken{ + AccessorID: generateUUID(), + SecretID: token, + Description: "my token", + ServiceIdentities: []*api.ACLServiceIdentity{{ + ServiceName: "db", + }}, + }) + require.Equal(t, token, gotToken) + case <-finalTimer: + t.Fatal("did not receive a snapshot after the token manifested") + } + } + +} + +func testWriteToken(t *testing.T, a *TestAgent, tok *api.ACLToken) string { + req, _ := http.NewRequest("PUT", "/v1/acl/token", jsonReader(tok)) + req.Header.Add("X-Consul-Token", "root") + resp := httptest.NewRecorder() + a.srv.h.ServeHTTP(resp, req) + require.Equal(t, http.StatusOK, resp.Code) + + dec := json.NewDecoder(resp.Body) + aclResp := &structs.ACLToken{} + require.NoError(t, dec.Decode(aclResp)) + return aclResp.SecretID +} diff --git a/agent/testagent.go b/agent/testagent.go index 54db5c72ba4..76d82a2f84d 100644 --- a/agent/testagent.go +++ b/agent/testagent.go @@ -214,6 +214,9 @@ func (a *TestAgent) Start(t *testing.T) error { // Lower the maximum backoff period of a cache refresh just for // tests see #14956 for more. result.RuntimeConfig.Cache.CacheRefreshMaxWait = 1 * time.Second + + // Lower the resync interval for tests. + result.RuntimeConfig.LocalProxyConfigResyncInterval = 250 * time.Millisecond } return result, err } From 129eca8fdb7d984235097a9345265d1fd842b77e Mon Sep 17 00:00:00 2001 From: Melisa Griffin Date: Fri, 3 Mar 2023 16:39:59 -0500 Subject: [PATCH 111/262] NET-2903 Normalize weight for http routes (#16512) * NET-2903 Normalize weight for http routes * Update website/content/docs/connect/gateways/api-gateway/configuration/http-route.mdx Co-authored-by: trujillo-adam <47586768+trujillo-adam@users.noreply.github.com> --- .changelog/16512.txt | 3 +++ agent/structs/config_entry_routes.go | 4 +++- agent/structs/config_entry_routes_test.go | 22 +++++++++++++++++++ .../api-gateway/configuration/http-route.mdx | 3 ++- 4 files changed, 30 insertions(+), 2 deletions(-) create mode 100644 .changelog/16512.txt diff --git a/.changelog/16512.txt b/.changelog/16512.txt new file mode 100644 index 00000000000..288ff8aa45e --- /dev/null +++ b/.changelog/16512.txt @@ -0,0 +1,3 @@ +```release-note:bug +gateways: fix HTTPRoute bug where service weights could be less than or equal to 0 and result in a downstream envoy protocol error +``` \ No newline at end of file diff --git a/agent/structs/config_entry_routes.go b/agent/structs/config_entry_routes.go index 801e22f18cb..1235723f89f 100644 --- a/agent/structs/config_entry_routes.go +++ b/agent/structs/config_entry_routes.go @@ -100,7 +100,9 @@ func (e *HTTPRouteConfigEntry) Normalize() error { func normalizeHTTPService(service HTTPService) HTTPService { service.EnterpriseMeta.Normalize() - + if service.Weight <= 0 { + service.Weight = 1 + } return service } diff --git a/agent/structs/config_entry_routes_test.go b/agent/structs/config_entry_routes_test.go index 83ab8c4d79e..37c20390a31 100644 --- a/agent/structs/config_entry_routes_test.go +++ b/agent/structs/config_entry_routes_test.go @@ -262,6 +262,28 @@ func TestHTTPRoute(t *testing.T) { }}, }, }, + "rule normalizes service weight": { + entry: &HTTPRouteConfigEntry{ + Kind: HTTPRoute, + Name: "route-one", + Rules: []HTTPRouteRule{{ + Services: []HTTPService{ + { + Name: "test", + Weight: 0, + }, + { + Name: "test2", + Weight: -1, + }}, + }}, + }, + check: func(t *testing.T, entry ConfigEntry) { + route := entry.(*HTTPRouteConfigEntry) + require.Equal(t, 1, route.Rules[0].Services[0].Weight) + require.Equal(t, 1, route.Rules[0].Services[1].Weight) + }, + }, } testConfigEntryNormalizeAndValidate(t, cases) } diff --git a/website/content/docs/connect/gateways/api-gateway/configuration/http-route.mdx b/website/content/docs/connect/gateways/api-gateway/configuration/http-route.mdx index c492e331e2a..7ab1a506d46 100644 --- a/website/content/docs/connect/gateways/api-gateway/configuration/http-route.mdx +++ b/website/content/docs/connect/gateways/api-gateway/configuration/http-route.mdx @@ -630,7 +630,8 @@ Specifies the Enterprise [admin partition](/consul/docs/enterprise/admin-partiti ### `Rules[].Services[].Weight` -Specifies the proportion of requests forwarded to the specified service. The +Specifies the proportion of requests forwarded to the specified service. If no weight is specified, or if the specified +weight is set to less than or equal to `0`, the weight is normalized to `1`. The proportion is determined by dividing the value of the weight by the sum of all weights in the service list. For non-zero values, there may be some deviation from the exact proportion depending on the precision an implementation From 897e5ef2d3a7796bf06be7b2854cbd98562a5771 Mon Sep 17 00:00:00 2001 From: Andrew Stucki Date: Fri, 3 Mar 2023 16:59:04 -0500 Subject: [PATCH 112/262] Add some basic UI improvements for api-gateway services (#16508) * Add some basic ui improvements for api-gateway services * Add changelog entry * Use ternary for null check * Update gateway doc links * rename changelog entry for new PR * Fix test --- .changelog/16508.txt | 3 + .../app/components/consul/kind/index.hbs | 182 +++++++++--------- .../app/components/consul/kind/index.js | 14 ++ .../consul/service/search-bar/index.hbs | 2 +- .../app/filter/predicates/service.js | 1 + .../consul-ui/app/models/service-instance.js | 10 +- .../mock-api/v1/internal/ui/exported-services | 2 +- .../mock-api/v1/internal/ui/services | 2 +- .../acceptance/dc/services/index.feature | 10 +- .../dc/services/show/services.feature | 1 + .../consul-ui/translations/common/en-us.yaml | 1 + 11 files changed, 134 insertions(+), 94 deletions(-) create mode 100644 .changelog/16508.txt diff --git a/.changelog/16508.txt b/.changelog/16508.txt new file mode 100644 index 00000000000..4732ed553c6 --- /dev/null +++ b/.changelog/16508.txt @@ -0,0 +1,3 @@ +```release-note:improvement +ui: support filtering API gateways in the ui and displaying their documentation links +``` diff --git a/ui/packages/consul-ui/app/components/consul/kind/index.hbs b/ui/packages/consul-ui/app/components/consul/kind/index.hbs index e5bfc6d4423..58b98154561 100644 --- a/ui/packages/consul-ui/app/components/consul/kind/index.hbs +++ b/ui/packages/consul-ui/app/components/consul/kind/index.hbs @@ -1,89 +1,99 @@ {{#if item.Kind}} - {{#let (titleize (humanize item.Kind)) as |Name|}} - {{#if withInfo}} -
    -
    - - {{Name}} - -
    -
    - - - {{#if (eq item.Kind 'ingress-gateway')}} - Ingress gateways enable ingress traffic from services outside the Consul service mesh to services inside the Consul service mesh. - {{else if (eq item.Kind 'terminating-gateway')}} - Terminating gateways allow connect-enabled services in Consul service mesh to communicate with services outside the service mesh. - {{else}} - Mesh gateways enable routing of Connect traffic between different Consul datacenters. - {{/if}} - - -
  • - {{#if (eq item.Kind 'ingress-gateway')}} - About Ingress gateways - {{else if (eq item.Kind 'terminating-gateway')}} - About Terminating gateways - {{else}} - About Mesh gateways - {{/if}} -
  • - {{#let (from-entries (array - (array 'ingress-gateway' '/consul/developer-mesh/ingress-gateways') - (array 'terminating-gateway' '/consul/developer-mesh/understand-terminating-gateways') - (array 'mesh-gateway' '/consul/developer-mesh/connect-gateways') - ) - ) as |link|}} - - {{/let}} - {{#let (from-entries (array - (array 'ingress-gateway' '/connect/ingress-gateway') - (array 'terminating-gateway' '/connect/terminating-gateway') - (array 'mesh-gateway' '/connect/mesh-gateway') - ) - ) as |link|}} - -
  • - Other gateway types -
  • - {{#if (not-eq item.Kind 'mesh-gateway')}} - + {{#if withInfo}} +
    +
    + + {{Name}} + +
    +
    + + + {{#if (eq item.Kind 'ingress-gateway')}} + Ingress gateways enable ingress traffic from services outside the Consul service mesh to services inside the Consul service mesh. + {{else if (eq item.Kind 'terminating-gateway')}} + Terminating gateways allow connect-enabled services in Consul service mesh to communicate with services outside the service mesh. + {{else if (eq item.Kind 'api-gateway')}} + API gateways enable ingress traffic from services outside the Consul service mesh to services inside the Consul service mesh. + {{else}} + Mesh gateways enable routing of Connect traffic between different Consul datacenters. + {{/if}} + + +
  • + {{#if (eq item.Kind 'ingress-gateway')}} + About Ingress gateways + {{else if (eq item.Kind 'terminating-gateway')}} + About Terminating gateways + {{else if (eq item.Kind 'api-gateway')}} + About API gateways + {{else}} + About Mesh gateways {{/if}} - {{#if (not-eq item.Kind 'terminating-gateway')}} -
  • - {{/if}} - {{#if (not-eq item.Kind 'ingress-gateway')}} - - {{/if}} - {{/let}} -
    -
    -
    -
    - {{else}} - - {{Name}} - - {{/if}} - {{/let}} + + {{#let (from-entries (array + (array 'ingress-gateway' '/consul/developer-mesh/ingress-gateways') + (array 'terminating-gateway' '/consul/developer-mesh/understand-terminating-gateways') + (array 'mesh-gateway' '/consul/developer-mesh/connect-gateways') + ) + ) as |link|}} + + {{/let}} + {{#let (from-entries (array + (array 'ingress-gateway' '/connect/gateways/ingress-gateway') + (array 'terminating-gateway' '/connect/gateways/terminating-gateway') + (array 'api-gateway' '/connect/gateways/api-gateway') + (array 'mesh-gateway' '/connect/gateways/mesh-gateway') + ) + ) as |link|}} + +
  • + Other gateway types +
  • + {{#if (not-eq item.Kind 'mesh-gateway')}} + + {{/if}} + {{#if (not-eq item.Kind 'terminating-gateway')}} + + {{/if}} + {{#if (not-eq item.Kind 'ingress-gateway')}} + + {{/if}} + {{#if (not-eq item.Kind 'api-gateway')}} + + {{/if}} + {{/let}} +
    +
    +
    +
    + {{else}} + + {{Name}} + + {{/if}} {{/if}} diff --git a/ui/packages/consul-ui/app/components/consul/kind/index.js b/ui/packages/consul-ui/app/components/consul/kind/index.js index 4798652642b..63117c19fe4 100644 --- a/ui/packages/consul-ui/app/components/consul/kind/index.js +++ b/ui/packages/consul-ui/app/components/consul/kind/index.js @@ -1,5 +1,19 @@ import Component from '@ember/component'; +import { computed } from '@ember/object'; +import { titleize } from 'ember-cli-string-helpers/helpers/titleize'; +import { humanize } from 'ember-cli-string-helpers/helpers/humanize'; + +const normalizedGatewayLabels = { + 'api-gateway': 'API Gateway', + 'mesh-gateway': 'Mesh Gateway', + 'ingress-gateway': 'Ingress Gateway', + 'terminating-gateway': 'Terminating Gateway', +}; export default Component.extend({ tagName: '', + Name: computed('item.Kind', function () { + const name = normalizedGatewayLabels[this.item.Kind]; + return name ? name : titleize(humanize(this.item.Kind)); + }), }); diff --git a/ui/packages/consul-ui/app/components/consul/service/search-bar/index.hbs b/ui/packages/consul-ui/app/components/consul/service/search-bar/index.hbs index 5c76cf501ca..bda5097c9c2 100644 --- a/ui/packages/consul-ui/app/components/consul/service/search-bar/index.hbs +++ b/ui/packages/consul-ui/app/components/consul/service/search-bar/index.hbs @@ -102,7 +102,7 @@ {{t 'common.consul.service'}} - {{#each (array 'ingress-gateway' 'terminating-gateway' 'mesh-gateway') as |kind|}} + {{#each (array 'api-gateway' 'ingress-gateway' 'terminating-gateway' 'mesh-gateway') as |kind|}} diff --git a/ui/packages/consul-ui/app/filter/predicates/service.js b/ui/packages/consul-ui/app/filter/predicates/service.js index 14bae438467..a5030e34ed2 100644 --- a/ui/packages/consul-ui/app/filter/predicates/service.js +++ b/ui/packages/consul-ui/app/filter/predicates/service.js @@ -2,6 +2,7 @@ import setHelpers from 'mnemonist/set'; export default { kind: { + 'api-gateway': (item, value) => item.Kind === value, 'ingress-gateway': (item, value) => item.Kind === value, 'terminating-gateway': (item, value) => item.Kind === value, 'mesh-gateway': (item, value) => item.Kind === value, diff --git a/ui/packages/consul-ui/app/models/service-instance.js b/ui/packages/consul-ui/app/models/service-instance.js index 1863dd6bbab..51f98e25b53 100644 --- a/ui/packages/consul-ui/app/models/service-instance.js +++ b/ui/packages/consul-ui/app/models/service-instance.js @@ -64,9 +64,13 @@ export default class ServiceInstance extends Model { @computed('Service.Kind') get IsProxy() { - return ['connect-proxy', 'mesh-gateway', 'ingress-gateway', 'terminating-gateway'].includes( - this.Service.Kind - ); + return [ + 'connect-proxy', + 'mesh-gateway', + 'ingress-gateway', + 'terminating-gateway', + 'api-gateway', + ].includes(this.Service.Kind); } // IsOrigin means that the service can have associated up or down streams, diff --git a/ui/packages/consul-ui/mock-api/v1/internal/ui/exported-services b/ui/packages/consul-ui/mock-api/v1/internal/ui/exported-services index 8bfe712541b..f138a28d9f6 100644 --- a/ui/packages/consul-ui/mock-api/v1/internal/ui/exported-services +++ b/ui/packages/consul-ui/mock-api/v1/internal/ui/exported-services @@ -3,7 +3,7 @@ ${[0].map( () => { let prevKind; let name; - const gateways = ['mesh-gateway', 'ingress-gateway', 'terminating-gateway']; + const gateways = ['mesh-gateway', 'ingress-gateway', 'terminating-gateway', 'api-gateway']; return ` [ ${ diff --git a/ui/packages/consul-ui/mock-api/v1/internal/ui/services b/ui/packages/consul-ui/mock-api/v1/internal/ui/services index f44e59d179c..e29f7feefb7 100644 --- a/ui/packages/consul-ui/mock-api/v1/internal/ui/services +++ b/ui/packages/consul-ui/mock-api/v1/internal/ui/services @@ -2,7 +2,7 @@ ${[0].map( () => { let prevKind; let name; - const gateways = ['mesh-gateway', 'ingress-gateway', 'terminating-gateway']; + const gateways = ['mesh-gateway', 'ingress-gateway', 'terminating-gateway', 'api-gateway']; return ` [ ${ diff --git a/ui/packages/consul-ui/tests/acceptance/dc/services/index.feature b/ui/packages/consul-ui/tests/acceptance/dc/services/index.feature index ecfbc803230..df0ebc2dde3 100644 --- a/ui/packages/consul-ui/tests/acceptance/dc/services/index.feature +++ b/ui/packages/consul-ui/tests/acceptance/dc/services/index.feature @@ -71,7 +71,7 @@ Feature: dc / services / index: List Services --- Scenario: Viewing the service list page with gateways Given 1 datacenter model with the value "dc-1" - And 3 service models from yaml + And 4 service models from yaml --- - Name: Service-0-proxy Kind: 'connect-proxy' @@ -88,6 +88,11 @@ Feature: dc / services / index: List Services ChecksPassing: 0 ChecksWarning: 0 ChecksCritical: 1 + - Name: Service-3-api-gateway + Kind: 'api-gateway' + ChecksPassing: 0 + ChecksWarning: 0 + ChecksCritical: 1 --- When I visit the services page for yaml @@ -96,11 +101,12 @@ Feature: dc / services / index: List Services --- Then the url should be /dc-1/services And the title should be "Services - Consul" - Then I see 2 service models + Then I see 3 service models And I see kind on the services like yaml --- - ingress-gateway - terminating-gateway + - api-gateway --- Scenario: View a Service in mesh Given 1 datacenter model with the value "dc-1" diff --git a/ui/packages/consul-ui/tests/acceptance/dc/services/show/services.feature b/ui/packages/consul-ui/tests/acceptance/dc/services/show/services.feature index 3b19a699593..b6819558d84 100644 --- a/ui/packages/consul-ui/tests/acceptance/dc/services/show/services.feature +++ b/ui/packages/consul-ui/tests/acceptance/dc/services/show/services.feature @@ -50,6 +50,7 @@ Feature: dc / services / show / services | Name | Kind | | service | ~ | | ingress-gateway | ingress-gateway | + | api-gateway | api-gateway | | mesh-gateway | mesh-gateway | --------------------------------------------- diff --git a/ui/packages/consul-ui/translations/common/en-us.yaml b/ui/packages/consul-ui/translations/common/en-us.yaml index 5c584540eda..18180f2073a 100644 --- a/ui/packages/consul-ui/translations/common/en-us.yaml +++ b/ui/packages/consul-ui/translations/common/en-us.yaml @@ -32,6 +32,7 @@ consul: ingress-gateway: Ingress Gateway terminating-gateway: Terminating Gateway mesh-gateway: Mesh Gateway + api-gateway: API Gateway status: Health Status service.meta: Service Meta node.meta: Node Meta From 9e93a30f4d3ca16de7468197842e6227b9cfec46 Mon Sep 17 00:00:00 2001 From: trujillo-adam <47586768+trujillo-adam@users.noreply.github.com> Date: Fri, 3 Mar 2023 15:04:05 -0800 Subject: [PATCH 113/262] fixes empty link in DNS usage page (#16534) --- website/content/docs/services/discovery/dns-static-lookups.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/content/docs/services/discovery/dns-static-lookups.mdx b/website/content/docs/services/discovery/dns-static-lookups.mdx index 68191104a2a..aa2524ec457 100644 --- a/website/content/docs/services/discovery/dns-static-lookups.mdx +++ b/website/content/docs/services/discovery/dns-static-lookups.mdx @@ -39,7 +39,7 @@ Specify the name of the node, datacenter, and domain using the following FQDN sy The `datacenter` subdomain is optional. By default, the lookup queries the datacenter of the agent. -By default, the domain is `consul`. Refer to [Configure DNS Behaviors]() for information about using alternate domains. +By default, the domain is `consul`. Refer to [Configure DNS Behaviors](/consul/docs/services/discovery/dns-configuration) for information about using alternate domains. ### Node lookup results From fc232326a08795f8e5dc68f1e435f28e640fb20f Mon Sep 17 00:00:00 2001 From: Melisa Griffin Date: Mon, 6 Mar 2023 08:41:57 -0500 Subject: [PATCH 114/262] NET-2904 Fixes API Gateway Route Service Weight Division Error --- .changelog/16531.txt | 3 +++ agent/xds/routes.go | 14 ++++++++++++-- .../envoy/case-api-gateway-http-simple/setup.sh | 4 ++++ .../envoy/case-api-gateway-http-simple/verify.bats | 4 ++-- 4 files changed, 21 insertions(+), 4 deletions(-) create mode 100644 .changelog/16531.txt diff --git a/.changelog/16531.txt b/.changelog/16531.txt new file mode 100644 index 00000000000..71f83ad2acc --- /dev/null +++ b/.changelog/16531.txt @@ -0,0 +1,3 @@ +```release-note:bug +gateways: fix HTTPRoute bug where services with a weight not divisible by 10000 are never registered properly +``` \ No newline at end of file diff --git a/agent/xds/routes.go b/agent/xds/routes.go index 6eae88854d2..4588f39d617 100644 --- a/agent/xds/routes.go +++ b/agent/xds/routes.go @@ -863,6 +863,7 @@ func (s *ResourceGenerator) makeRouteActionForSplitter( forMeshGateway bool, ) (*envoy_route_v3.Route_Route, error) { clusters := make([]*envoy_route_v3.WeightedCluster_ClusterWeight, 0, len(splits)) + totalWeight := 0 for _, split := range splits { nextNode := chain.Nodes[split.NextNode] @@ -878,8 +879,10 @@ func (s *ResourceGenerator) makeRouteActionForSplitter( // The smallest representable weight is 1/10000 or .01% but envoy // deals with integers so scale everything up by 100x. + weight := int(split.Weight * 100) + totalWeight += weight cw := &envoy_route_v3.WeightedCluster_ClusterWeight{ - Weight: makeUint32Value(int(split.Weight * 100)), + Weight: makeUint32Value(weight), Name: clusterName, } if err := injectHeaderManipToWeightedCluster(split.Definition, cw); err != nil { @@ -893,12 +896,19 @@ func (s *ResourceGenerator) makeRouteActionForSplitter( return nil, fmt.Errorf("number of clusters in splitter must be > 0; got %d", len(clusters)) } + envoyWeightScale := 10000 + if envoyWeightScale < totalWeight { + clusters[0].Weight.Value += uint32(totalWeight - envoyWeightScale) + } else { + clusters[0].Weight.Value += uint32(envoyWeightScale - totalWeight) + } + return &envoy_route_v3.Route_Route{ Route: &envoy_route_v3.RouteAction{ ClusterSpecifier: &envoy_route_v3.RouteAction_WeightedClusters{ WeightedClusters: &envoy_route_v3.WeightedCluster{ Clusters: clusters, - TotalWeight: makeUint32Value(10000), // scaled up 100% + TotalWeight: makeUint32Value(envoyWeightScale), // scaled up 100% }, }, }, diff --git a/test/integration/connect/envoy/case-api-gateway-http-simple/setup.sh b/test/integration/connect/envoy/case-api-gateway-http-simple/setup.sh index 8d0513553de..6dab478e203 100644 --- a/test/integration/connect/envoy/case-api-gateway-http-simple/setup.sh +++ b/test/integration/connect/envoy/case-api-gateway-http-simple/setup.sh @@ -35,6 +35,10 @@ rules = [ services = [ { name = "s1" + }, + { + name = "s2" + weight = 2 } ] } diff --git a/test/integration/connect/envoy/case-api-gateway-http-simple/verify.bats b/test/integration/connect/envoy/case-api-gateway-http-simple/verify.bats index c7378e55bfe..72686b3c4f2 100644 --- a/test/integration/connect/envoy/case-api-gateway-http-simple/verify.bats +++ b/test/integration/connect/envoy/case-api-gateway-http-simple/verify.bats @@ -22,9 +22,9 @@ load helpers } @test "api gateway should be able to connect to s1 via configured port" { - run retry_long curl -s -f -d hello localhost:9999 + run retry_long curl -s -d hello localhost:9999 [ "$status" -eq 0 ] - [[ "$output" == *"hello"* ]] + [[ ! -z "$output" ]] } @test "api gateway should get an intentions error connecting to s2 via configured port" { From bf501a337bde2241a22228def3a20ac726074a46 Mon Sep 17 00:00:00 2001 From: Ronald Date: Mon, 6 Mar 2023 16:00:39 +0100 Subject: [PATCH 115/262] Improve ux around ACL token to help users avoid overwriting node/service identities (#16506) * Deprecate merge-node-identities and merge-service-identities flags * added tests for node identities changes * added changelog file and docs --- .changelog/16506.txt | 8 ++ command/acl/token/update/token_update.go | 83 +++++++++++++------ command/acl/token/update/token_update_test.go | 43 ++++++++++ .../content/commands/acl/policy/update.mdx | 2 + website/content/commands/acl/token/update.mdx | 18 +++- 5 files changed, 125 insertions(+), 29 deletions(-) create mode 100644 .changelog/16506.txt diff --git a/.changelog/16506.txt b/.changelog/16506.txt new file mode 100644 index 00000000000..2560c247466 --- /dev/null +++ b/.changelog/16506.txt @@ -0,0 +1,8 @@ +```release-note:deprecation +cli: Deprecate the `-merge-node-identites` and `-merge-service-identities` flags from the `consul token update` command in favor of: `-append-node-identity` and `-append-service-identity`. +``` + +```release-note:improvement +cli: added `-append-service-identity` and `-append-node-identity` flags to the `consul token update` command. +These flags allow updates to a token's node identities/service identities without having to override them. +``` \ No newline at end of file diff --git a/command/acl/token/update/token_update.go b/command/acl/token/update/token_update.go index 6cb529edd45..519a3da8d4e 100644 --- a/command/acl/token/update/token_update.go +++ b/command/acl/token/update/token_update.go @@ -25,37 +25,35 @@ type cmd struct { http *flags.HTTPFlags help string - tokenAccessorID string - policyIDs []string - appendPolicyIDs []string - policyNames []string - appendPolicyNames []string - roleIDs []string - appendRoleIDs []string - roleNames []string - appendRoleNames []string - serviceIdents []string - nodeIdents []string - description string - mergeServiceIdents bool - mergeNodeIdents bool - showMeta bool - format string + tokenAccessorID string + policyIDs []string + appendPolicyIDs []string + policyNames []string + appendPolicyNames []string + roleIDs []string + appendRoleIDs []string + roleNames []string + appendRoleNames []string + serviceIdents []string + nodeIdents []string + appendNodeIdents []string + appendServiceIdents []string + description string + showMeta bool + format string // DEPRECATED - mergeRoles bool - mergePolicies bool - tokenID string + mergeServiceIdents bool + mergeNodeIdents bool + mergeRoles bool + mergePolicies bool + tokenID string } func (c *cmd) init() { c.flags = flag.NewFlagSet("", flag.ContinueOnError) c.flags.BoolVar(&c.showMeta, "meta", false, "Indicates that token metadata such "+ "as the content hash and raft indices should be shown for each entry") - c.flags.BoolVar(&c.mergeServiceIdents, "merge-service-identities", false, "Merge the new service identities "+ - "with the existing service identities") - c.flags.BoolVar(&c.mergeNodeIdents, "merge-node-identities", false, "Merge the new node identities "+ - "with the existing node identities") c.flags.StringVar(&c.tokenAccessorID, "accessor-id", "", "The Accessor ID of the token to update. "+ "It may be specified as a unique ID prefix but will error if the prefix "+ "matches multiple token Accessor IDs") @@ -79,9 +77,15 @@ func (c *cmd) init() { c.flags.Var((*flags.AppendSliceValue)(&c.serviceIdents), "service-identity", "Name of a "+ "service identity to use for this token. May be specified multiple times. Format is "+ "the SERVICENAME or SERVICENAME:DATACENTER1,DATACENTER2,...") + c.flags.Var((*flags.AppendSliceValue)(&c.appendServiceIdents), "append-service-identity", "Name of a "+ + "service identity to use for this token. This token retains existing service identities. May be specified"+ + "multiple times. Format is the SERVICENAME or SERVICENAME:DATACENTER1,DATACENTER2,...") c.flags.Var((*flags.AppendSliceValue)(&c.nodeIdents), "node-identity", "Name of a "+ "node identity to use for this token. May be specified multiple times. Format is "+ "NODENAME:DATACENTER") + c.flags.Var((*flags.AppendSliceValue)(&c.appendNodeIdents), "append-node-identity", "Name of a "+ + "node identity to use for this token. This token retains existing node identities. May be "+ + "specified multiple times. Format is NODENAME:DATACENTER") c.flags.StringVar( &c.format, "format", @@ -101,6 +105,10 @@ func (c *cmd) init() { "Use -append-policy-id or -append-policy-name instead.") c.flags.BoolVar(&c.mergeRoles, "merge-roles", false, "DEPRECATED. "+ "Use -append-role-id or -append-role-name instead.") + c.flags.BoolVar(&c.mergeServiceIdents, "merge-service-identities", false, "DEPRECATED. "+ + "Use -append-service-identity instead.") + c.flags.BoolVar(&c.mergeNodeIdents, "merge-node-identities", false, "DEPRECATED. "+ + "Use -append-node-identity instead.") } func (c *cmd) Run(args []string) int { @@ -147,13 +155,38 @@ func (c *cmd) Run(args []string) int { t.Description = c.description } + hasAppendServiceFields := len(c.appendServiceIdents) > 0 + hasServiceFields := len(c.serviceIdents) > 0 + if hasAppendServiceFields && hasServiceFields { + c.UI.Error("Cannot combine the use of service-identity flag with append-service-identity. " + + "To set or overwrite existing service identities, use -service-identity. " + + "To append to existing service identities, use -append-service-identity.") + return 1 + } + parsedServiceIdents, err := acl.ExtractServiceIdentities(c.serviceIdents) + if hasAppendServiceFields { + parsedServiceIdents, err = acl.ExtractServiceIdentities(c.appendServiceIdents) + } if err != nil { c.UI.Error(err.Error()) return 1 } + hasAppendNodeFields := len(c.appendNodeIdents) > 0 + hasNodeFields := len(c.nodeIdents) > 0 + + if hasAppendNodeFields && hasNodeFields { + c.UI.Error("Cannot combine the use of node-identity flag with append-node-identity. " + + "To set or overwrite existing node identities, use -node-identity. " + + "To append to existing node identities, use -append-node-identity.") + return 1 + } + parsedNodeIdents, err := acl.ExtractNodeIdentities(c.nodeIdents) + if hasAppendNodeFields { + parsedNodeIdents, err = acl.ExtractNodeIdentities(c.appendNodeIdents) + } if err != nil { c.UI.Error(err.Error()) return 1 @@ -310,7 +343,7 @@ func (c *cmd) Run(args []string) int { } } - if c.mergeServiceIdents { + if c.mergeServiceIdents || hasAppendServiceFields { for _, svcid := range parsedServiceIdents { found := -1 for i, link := range t.ServiceIdentities { @@ -330,7 +363,7 @@ func (c *cmd) Run(args []string) int { t.ServiceIdentities = parsedServiceIdents } - if c.mergeNodeIdents { + if c.mergeNodeIdents || hasAppendNodeFields { for _, nodeid := range parsedNodeIdents { found := false for _, link := range t.NodeIdentities { diff --git a/command/acl/token/update/token_update_test.go b/command/acl/token/update/token_update_test.go index bd11d1d8e3f..81570284104 100644 --- a/command/acl/token/update/token_update_test.go +++ b/command/acl/token/update/token_update_test.go @@ -109,6 +109,22 @@ func TestTokenUpdateCommand(t *testing.T) { require.ElementsMatch(t, expected, token.NodeIdentities) }) + // update with append-node-identity + t.Run("append-node-identity", func(t *testing.T) { + + token := run(t, []string{ + "-http-addr=" + a.HTTPAddr(), + "-accessor-id=" + token.AccessorID, + "-token=root", + "-append-node-identity=third:node", + "-description=test token", + }) + + require.Len(t, token.NodeIdentities, 3) + require.Equal(t, "third", token.NodeIdentities[2].NodeName) + require.Equal(t, "node", token.NodeIdentities[2].Datacenter) + }) + // update with policy by name t.Run("policy-name", func(t *testing.T) { token := run(t, []string{ @@ -135,6 +151,33 @@ func TestTokenUpdateCommand(t *testing.T) { require.Len(t, token.Policies, 1) }) + // update with service-identity + t.Run("service-identity", func(t *testing.T) { + token := run(t, []string{ + "-http-addr=" + a.HTTPAddr(), + "-accessor-id=" + token.AccessorID, + "-token=root", + "-service-identity=service:datapalace", + "-description=test token", + }) + + require.Len(t, token.ServiceIdentities, 1) + require.Equal(t, "service", token.ServiceIdentities[0].ServiceName) + }) + + // update with append-service-identity + t.Run("append-service-identity", func(t *testing.T) { + token := run(t, []string{ + "-http-addr=" + a.HTTPAddr(), + "-accessor-id=" + token.AccessorID, + "-token=root", + "-append-service-identity=web", + "-description=test token", + }) + require.Len(t, token.ServiceIdentities, 2) + require.Equal(t, "web", token.ServiceIdentities[1].ServiceName) + }) + // update with no description shouldn't delete the current description t.Run("merge-description", func(t *testing.T) { token := run(t, []string{ diff --git a/website/content/commands/acl/policy/update.mdx b/website/content/commands/acl/policy/update.mdx index e62dfa72d99..f64a1f79068 100644 --- a/website/content/commands/acl/policy/update.mdx +++ b/website/content/commands/acl/policy/update.mdx @@ -49,6 +49,8 @@ Usage: `consul acl policy update [options] [args]` the value is a file path to load the rules from. `-` may also be given to indicate that the rules are available on stdin. +~> Specifying `-rules` will overwrite existing rules. + - `-valid-datacenter=` - Datacenter that the policy should be valid within. This flag may be specified multiple times. diff --git a/website/content/commands/acl/token/update.mdx b/website/content/commands/acl/token/update.mdx index 19441e1020b..1a1703cb143 100644 --- a/website/content/commands/acl/token/update.mdx +++ b/website/content/commands/acl/token/update.mdx @@ -33,8 +33,9 @@ Usage: `consul acl token update [options]` - `-id=` - The Accessor ID of the token to read. It may be specified as a unique ID prefix but will error if the prefix matches multiple token Accessor IDs -- `merge-node-identities` - Merge the new node identities with the existing node +- `-merge-node-identities` - Deprecated. Merge the new node identities with the existing node identities. +~> This is deprecated and will be removed in a future Consul version. Use `append-node-identity` instead. - `-merge-policies` - Deprecated. Merge the new policies with the existing policies. @@ -46,15 +47,20 @@ instead. ~> This is deprecated and will be removed in a future Consul version. Use `append-role-id` or `append-role-name` instead. -- `-merge-service-identities` - Merge the new service identities with the existing service identities. +- `-merge-service-identities` - Deprecated. Merge the new service identities with the existing service identities. + +~> This is deprecated and will be removed in a future Consul version. Use `append-service-identity` instead. - `-meta` - Indicates that token metadata such as the content hash and Raft indices should be shown for each entry. -- `-node-identity=` - Name of a node identity to use for this role. May +- `-node-identity=` - Name of a node identity to use for this role. Overwrites existing node identity. May be specified multiple times. Format is `NODENAME:DATACENTER`. Added in Consul 1.8.1. +- `-append-node-identity=` - Name of a node identity to add to this role. May + be specified multiple times. The token retains existing node identities. Format is `NODENAME:DATACENTER`. + - `-policy-id=` - ID of a policy to use for this token. Overwrites existing policies. May be specified multiple times. - `-policy-name=` - Name of a policy to use for this token. Overwrites existing policies. May be specified multiple times. @@ -76,9 +82,13 @@ instead. - `-append-role-name=` - Name of a role to add to this token. The token retains existing roles. May be specified multiple times. - `-service-identity=` - Name of a service identity to use for this - token. May be specified multiple times. Format is the `SERVICENAME` or + token. Overwrites existing service identities. May be specified multiple times. Format is the `SERVICENAME` or `SERVICENAME:DATACENTER1,DATACENTER2,...` +- `-append-service-identity=` - Name of a service identity to add to this + token. May be specified multiple times. The token retains existing service identities. + Format is the `SERVICENAME` or `SERVICENAME:DATACENTER1,DATACENTER2,...` + - `-format={pretty|json}` - Command output format. The default value is `pretty`. #### Enterprise Options From 8daddff08d483afc9a191528dbbf2b9cbc6cc41f Mon Sep 17 00:00:00 2001 From: "Chris S. Kim" Date: Mon, 6 Mar 2023 10:32:06 -0500 Subject: [PATCH 116/262] Follow-up fixes to consul connect envoy command (#16530) --- .changelog/16530.txt | 7 +++++++ command/connect/envoy/envoy.go | 31 +++++++++++++++++++---------- command/connect/envoy/envoy_test.go | 28 ++++++++++++++++---------- 3 files changed, 46 insertions(+), 20 deletions(-) create mode 100644 .changelog/16530.txt diff --git a/.changelog/16530.txt b/.changelog/16530.txt new file mode 100644 index 00000000000..38d98036ab9 --- /dev/null +++ b/.changelog/16530.txt @@ -0,0 +1,7 @@ +```release-note:bug +cli: Fixes an issue with `consul connect envoy` where a log to STDOUT could malform JSON when used with `-bootstrap`. +``` + +```release-note:bug +cli: Fixes an issue with `consul connect envoy` where grpc-disabled agents were not error-handled correctly. +``` diff --git a/command/connect/envoy/envoy.go b/command/connect/envoy/envoy.go index 102c16494db..0864ecc1997 100644 --- a/command/connect/envoy/envoy.go +++ b/command/connect/envoy/envoy.go @@ -11,7 +11,6 @@ import ( "strings" "time" - "github.com/hashicorp/consul/api" "github.com/hashicorp/go-hclog" "github.com/hashicorp/go-version" "github.com/mitchellh/cli" @@ -22,6 +21,7 @@ import ( "github.com/hashicorp/consul/agent/structs" "github.com/hashicorp/consul/agent/xds" "github.com/hashicorp/consul/agent/xds/accesslogs" + "github.com/hashicorp/consul/api" proxyCmd "github.com/hashicorp/consul/command/connect/proxy" "github.com/hashicorp/consul/command/flags" "github.com/hashicorp/consul/envoyextensions/xdscommon" @@ -810,8 +810,7 @@ func (c *cmd) xdsAddress() (GRPC, error) { port, protocol, err := c.lookupXDSPort() if err != nil { if strings.Contains(err.Error(), "Permission denied") { - // Token did not have agent:read. Log and proceed with defaults. - c.UI.Info(fmt.Sprintf("Could not query /v1/agent/self for xDS ports: %s", err)) + // Token did not have agent:read. Suppress and proceed with defaults. } else { // If not a permission denied error, gRPC is explicitly disabled // or something went fatally wrong. @@ -822,7 +821,7 @@ func (c *cmd) xdsAddress() (GRPC, error) { // This is the dev mode default and recommended production setting if // enabled. port = 8502 - c.UI.Info("-grpc-addr not provided and unable to discover a gRPC address for xDS. Defaulting to localhost:8502") + c.UI.Warn("-grpc-addr not provided and unable to discover a gRPC address for xDS. Defaulting to localhost:8502") } addr = fmt.Sprintf("%vlocalhost:%v", protocol, port) } @@ -887,9 +886,12 @@ func (c *cmd) lookupXDSPort() (int, string, error) { var resp response if err := mapstructure.Decode(self, &resp); err == nil { - if resp.XDS.Ports.TLS < 0 && resp.XDS.Ports.Plaintext < 0 { - return 0, "", fmt.Errorf("agent has grpc disabled") - } + // When we get rid of the 1.10 compatibility code below we can uncomment + // this check: + // + // if resp.XDS.Ports.TLS <= 0 && resp.XDS.Ports.Plaintext <= 0 { + // return 0, "", fmt.Errorf("agent has grpc disabled") + // } if resp.XDS.Ports.TLS > 0 { return resp.XDS.Ports.TLS, "https://", nil } @@ -898,9 +900,12 @@ func (c *cmd) lookupXDSPort() (int, string, error) { } } - // If above TLS and Plaintext ports are both 0, fallback to - // old API for the case where a new consul CLI is being used - // with an older API version. + // If above TLS and Plaintext ports are both 0, it could mean + // gRPC is disabled on the agent or we are using an older API. + // In either case, fallback to reading from the DebugConfig. + // + // Next major version we should get rid of this below code. + // It exists for compatibility reasons for 1.10 and below. cfg, ok := self["DebugConfig"] if !ok { return 0, "", fmt.Errorf("unexpected agent response: no debug config") @@ -914,6 +919,12 @@ func (c *cmd) lookupXDSPort() (int, string, error) { return 0, "", fmt.Errorf("invalid grpc port in agent response") } + // This works for both <1.10 and later but we should prefer + // reading from resp.XDS instead. + if portN < 0 { + return 0, "", fmt.Errorf("agent has grpc disabled") + } + return int(portN), "", nil } diff --git a/command/connect/envoy/envoy_test.go b/command/connect/envoy/envoy_test.go index 09c02c91c09..e2692c77d7c 100644 --- a/command/connect/envoy/envoy_test.go +++ b/command/connect/envoy/envoy_test.go @@ -13,7 +13,6 @@ import ( "strings" "testing" - "github.com/hashicorp/consul/envoyextensions/xdscommon" "github.com/mitchellh/cli" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -22,6 +21,7 @@ import ( "github.com/hashicorp/consul/agent" "github.com/hashicorp/consul/agent/xds" "github.com/hashicorp/consul/api" + "github.com/hashicorp/consul/envoyextensions/xdscommon" "github.com/hashicorp/consul/sdk/testutil" ) @@ -123,6 +123,7 @@ type generateConfigTestCase struct { NamespacesEnabled bool XDSPorts agent.GRPCPorts // used to mock an agent's configured gRPC ports. Plaintext defaults to 8502 and TLS defaults to 8503. AgentSelf110 bool // fake the agent API from versions v1.10 and earlier + GRPCDisabled bool WantArgs BootstrapTplArgs WantErr string WantWarn string @@ -146,13 +147,10 @@ func TestGenerateConfig(t *testing.T) { WantErr: "'-node-name' requires '-proxy-id'", }, { - Name: "gRPC disabled", - Flags: []string{"-proxy-id", "test-proxy"}, - XDSPorts: agent.GRPCPorts{ - Plaintext: -1, - TLS: -1, - }, - WantErr: "agent has grpc disabled", + Name: "gRPC disabled", + Flags: []string{"-proxy-id", "test-proxy"}, + GRPCDisabled: true, + WantErr: "agent has grpc disabled", }, { Name: "defaults", @@ -1387,7 +1385,7 @@ func testMockAgent(tc generateConfigTestCase) http.HandlerFunc { case strings.Contains(r.URL.Path, "/agent/service"): testMockAgentProxyConfig(tc.ProxyConfig, tc.NamespacesEnabled)(w, r) case strings.Contains(r.URL.Path, "/agent/self"): - testMockAgentSelf(tc.XDSPorts, tc.AgentSelf110)(w, r) + testMockAgentSelf(tc.XDSPorts, tc.AgentSelf110, tc.GRPCDisabled)(w, r) case strings.Contains(r.URL.Path, "/catalog/node-services"): testMockCatalogNodeServiceList()(w, r) case strings.Contains(r.URL.Path, "/config/proxy-defaults/global"): @@ -1658,7 +1656,11 @@ func TestEnvoyCommand_canBindInternal(t *testing.T) { // testMockAgentSelf returns an empty /v1/agent/self response except GRPC // port is filled in to match the given wantXDSPort argument. -func testMockAgentSelf(wantXDSPorts agent.GRPCPorts, agentSelf110 bool) http.HandlerFunc { +func testMockAgentSelf( + wantXDSPorts agent.GRPCPorts, + agentSelf110 bool, + grpcDisabled bool, +) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { resp := agent.Self{ Config: map[string]interface{}{ @@ -1670,6 +1672,12 @@ func testMockAgentSelf(wantXDSPorts agent.GRPCPorts, agentSelf110 bool) http.Han resp.DebugConfig = map[string]interface{}{ "GRPCPort": wantXDSPorts.Plaintext, } + } else if grpcDisabled { + resp.DebugConfig = map[string]interface{}{ + "GRPCPort": -1, + } + // the real agent does not populate XDS if grpc or + // grpc-tls ports are < 0 } else { resp.XDS = &agent.XDSSelf{ // The deprecated Port field should default to TLS if it's available. From 9d8e00db24be126815aaa84bda23f0e559b7568d Mon Sep 17 00:00:00 2001 From: Anita Akaeze Date: Mon, 6 Mar 2023 11:40:33 -0500 Subject: [PATCH 117/262] Merge pull request #4573 from hashicorp/NET-2841 (#16544) * Merge pull request #4573 from hashicorp/NET-2841 NET-2841: PART 2 refactor upgrade tests to include version 1.15 * update upgrade versions --- .../healthcheck_test.go | 21 --------- .../test/upgrade/acl_node_test.go | 28 +++--------- .../test/upgrade/fullstopupgrade_test.go | 45 +++++++++++-------- .../test/upgrade/ingress_gateway_test.go | 28 ++++-------- .../resolver_default_subset_test.go | 16 +++---- .../upgrade/peering_control_plane_mgw_test.go | 31 +++---------- .../test/upgrade/peering_http_test.go | 41 +++++++---------- .../test/upgrade/tenancy_ent_test.go | 27 ++++++++--- .../consul-container/test/upgrade/upgrade.go | 2 +- 9 files changed, 89 insertions(+), 150 deletions(-) rename test/integration/consul-container/test/{upgrade => healthcheck}/healthcheck_test.go (88%) diff --git a/test/integration/consul-container/test/upgrade/healthcheck_test.go b/test/integration/consul-container/test/healthcheck/healthcheck_test.go similarity index 88% rename from test/integration/consul-container/test/upgrade/healthcheck_test.go rename to test/integration/consul-container/test/healthcheck/healthcheck_test.go index 78fb586d6b0..140f0dfd6cc 100644 --- a/test/integration/consul-container/test/upgrade/healthcheck_test.go +++ b/test/integration/consul-container/test/healthcheck/healthcheck_test.go @@ -163,24 +163,3 @@ func testMixedServersGAClient(t *testing.T, majorityIsTarget bool) { t.Fatalf("test timeout") } } - -func serversCluster(t *testing.T, numServers int, image, version string) *libcluster.Cluster { - opts := libcluster.BuildOptions{ - ConsulImageName: image, - ConsulVersion: version, - } - ctx := libcluster.NewBuildContext(t, opts) - - conf := libcluster.NewConfigBuilder(ctx). - Bootstrap(numServers). - ToAgentConfig(t) - t.Logf("Cluster server config:\n%s", conf.JSON) - - cluster, err := libcluster.NewN(t, *conf, numServers) - require.NoError(t, err) - - libcluster.WaitForLeader(t, cluster, nil) - libcluster.WaitForMembers(t, cluster.APIClient(0), numServers) - - return cluster -} diff --git a/test/integration/consul-container/test/upgrade/acl_node_test.go b/test/integration/consul-container/test/upgrade/acl_node_test.go index 2ad304c5278..f38d0993415 100644 --- a/test/integration/consul-container/test/upgrade/acl_node_test.go +++ b/test/integration/consul-container/test/upgrade/acl_node_test.go @@ -19,29 +19,14 @@ import ( func TestACL_Upgrade_Node_Token(t *testing.T) { t.Parallel() - type testcase struct { - oldversion string - targetVersion string - } - tcs := []testcase{ - { - oldversion: "1.13", - targetVersion: utils.TargetVersion, - }, - { - oldversion: "1.14", - targetVersion: utils.TargetVersion, - }, - } - - run := func(t *testing.T, tc testcase) { + run := func(t *testing.T, oldVersion, targetVersion string) { // NOTE: Disable auto.encrypt due to its conflict with ACL token during bootstrap cluster, _, _ := libtopology.NewCluster(t, &libtopology.ClusterConfig{ NumServers: 1, NumClients: 1, BuildOpts: &libcluster.BuildOptions{ Datacenter: "dc1", - ConsulVersion: tc.oldversion, + ConsulVersion: oldVersion, InjectAutoEncryption: false, ACLEnabled: true, }, @@ -52,7 +37,7 @@ func TestACL_Upgrade_Node_Token(t *testing.T) { cluster.Agents[1].GetAgentName()) require.NoError(t, err) - err = cluster.StandardUpgrade(t, context.Background(), tc.targetVersion) + err = cluster.StandardUpgrade(t, context.Background(), targetVersion) require.NoError(t, err) // Post upgrade validation: agent token can be used to query the node @@ -61,11 +46,10 @@ func TestACL_Upgrade_Node_Token(t *testing.T) { require.NoError(t, err) libassert.CatalogNodeExists(t, client, cluster.Agents[1].GetAgentName()) } - - for _, tc := range tcs { - t.Run(fmt.Sprintf("upgrade from %s to %s", tc.oldversion, tc.targetVersion), + for _, oldVersion := range UpgradeFromVersions { + t.Run(fmt.Sprintf("Upgrade from %s to %s", oldVersion, utils.TargetVersion), func(t *testing.T) { - run(t, tc) + run(t, oldVersion, utils.TargetVersion) }) } } diff --git a/test/integration/consul-container/test/upgrade/fullstopupgrade_test.go b/test/integration/consul-container/test/upgrade/fullstopupgrade_test.go index 426a5560051..c90692b5df9 100644 --- a/test/integration/consul-container/test/upgrade/fullstopupgrade_test.go +++ b/test/integration/consul-container/test/upgrade/fullstopupgrade_test.go @@ -15,37 +15,42 @@ import ( "github.com/hashicorp/consul/test/integration/consul-container/libs/utils" ) +type testcase struct { + oldVersion string + targetVersion string + expectErr bool +} + +var ( + tcs []testcase +) + // Test upgrade a cluster of latest version to the target version func TestStandardUpgradeToTarget_fromLatest(t *testing.T) { t.Parallel() - type testcase struct { - oldversion string - targetVersion string - expectErr bool - } - tcs := []testcase{ - // Use the case of "1.12.3" ==> "1.13.0" to verify the test can - // catch the upgrade bug found in snapshot of 1.13.0 - { - oldversion: "1.12.3", + tcs = append(tcs, + testcase{ + // Use the case of "1.12.3" ==> "1.13.0" to verify the test can + // catch the upgrade bug found in snapshot of 1.13.0 + oldVersion: "1.12.3", targetVersion: "1.13.0", expectErr: true, }, - { - oldversion: "1.13", - targetVersion: utils.TargetVersion, - }, - { - oldversion: "1.14", + ) + + for _, oldVersion := range UpgradeFromVersions { + tcs = append(tcs, testcase{ + oldVersion: oldVersion, targetVersion: utils.TargetVersion, }, + ) } run := func(t *testing.T, tc testcase) { configCtx := libcluster.NewBuildContext(t, libcluster.BuildOptions{ ConsulImageName: utils.TargetImageName, - ConsulVersion: tc.oldversion, + ConsulVersion: tc.oldVersion, }) const ( @@ -56,7 +61,7 @@ func TestStandardUpgradeToTarget_fromLatest(t *testing.T) { Bootstrap(numServers). ToAgentConfig(t) t.Logf("Cluster config:\n%s", serverConf.JSON) - require.Equal(t, tc.oldversion, serverConf.Version) // TODO: remove + require.Equal(t, tc.oldVersion, serverConf.Version) // TODO: remove cluster, err := libcluster.NewN(t, *serverConf, numServers) require.NoError(t, err) @@ -90,6 +95,7 @@ func TestStandardUpgradeToTarget_fromLatest(t *testing.T) { // upgrade the cluster to the Target version t.Logf("initiating standard upgrade to version=%q", tc.targetVersion) err = cluster.StandardUpgrade(t, context.Background(), tc.targetVersion) + if !tc.expectErr { require.NoError(t, err) libcluster.WaitForLeader(t, cluster, client) @@ -108,9 +114,10 @@ func TestStandardUpgradeToTarget_fromLatest(t *testing.T) { } for _, tc := range tcs { - t.Run(fmt.Sprintf("upgrade from %s to %s", tc.oldversion, tc.targetVersion), + t.Run(fmt.Sprintf("upgrade from %s to %s", tc.oldVersion, tc.targetVersion), func(t *testing.T) { run(t, tc) }) + time.Sleep(1 * time.Second) } } diff --git a/test/integration/consul-container/test/upgrade/ingress_gateway_test.go b/test/integration/consul-container/test/upgrade/ingress_gateway_test.go index a5c5a465058..814854cd275 100644 --- a/test/integration/consul-container/test/upgrade/ingress_gateway_test.go +++ b/test/integration/consul-container/test/upgrade/ingress_gateway_test.go @@ -16,7 +16,7 @@ import ( libcluster "github.com/hashicorp/consul/test/integration/consul-container/libs/cluster" libservice "github.com/hashicorp/consul/test/integration/consul-container/libs/service" "github.com/hashicorp/consul/test/integration/consul-container/libs/topology" - libutils "github.com/hashicorp/consul/test/integration/consul-container/libs/utils" + "github.com/hashicorp/consul/test/integration/consul-container/libs/utils" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) @@ -31,20 +31,6 @@ import ( // - performs these tests again func TestIngressGateway_UpgradeToTarget_fromLatest(t *testing.T) { t.Parallel() - type testcase struct { - oldversion string - targetVersion string - } - tcs := []testcase{ - { - oldversion: "1.13", - targetVersion: libutils.TargetVersion, - }, - { - oldversion: "1.14", - targetVersion: libutils.TargetVersion, - }, - } run := func(t *testing.T, oldVersion, targetVersion string) { // setup @@ -283,15 +269,17 @@ func TestIngressGateway_UpgradeToTarget_fromLatest(t *testing.T) { tests(t) }) } - for _, tc := range tcs { + + for _, oldVersion := range UpgradeFromVersions { // copy to avoid lint loopclosure - tc := tc - t.Run(fmt.Sprintf("upgrade from %s to %s", tc.oldversion, tc.targetVersion), + oldVersion := oldVersion + + t.Run(fmt.Sprintf("Upgrade from %s to %s", oldVersion, utils.TargetVersion), func(t *testing.T) { t.Parallel() - run(t, tc.oldversion, tc.targetVersion) + run(t, oldVersion, utils.TargetVersion) }) - time.Sleep(3 * time.Second) + time.Sleep(1 * time.Second) } } diff --git a/test/integration/consul-container/test/upgrade/l7_traffic_management/resolver_default_subset_test.go b/test/integration/consul-container/test/upgrade/l7_traffic_management/resolver_default_subset_test.go index 4ee98e66f49..ffffd9f1a83 100644 --- a/test/integration/consul-container/test/upgrade/l7_traffic_management/resolver_default_subset_test.go +++ b/test/integration/consul-container/test/upgrade/l7_traffic_management/resolver_default_subset_test.go @@ -11,9 +11,8 @@ import ( libcluster "github.com/hashicorp/consul/test/integration/consul-container/libs/cluster" libservice "github.com/hashicorp/consul/test/integration/consul-container/libs/service" "github.com/hashicorp/consul/test/integration/consul-container/libs/topology" - libutils "github.com/hashicorp/consul/test/integration/consul-container/libs/utils" - upgrade "github.com/hashicorp/consul/test/integration/consul-container/test/upgrade" - "github.com/hashicorp/go-version" + "github.com/hashicorp/consul/test/integration/consul-container/libs/utils" + "github.com/hashicorp/consul/test/integration/consul-container/test/upgrade" "github.com/stretchr/testify/require" ) @@ -330,11 +329,7 @@ func TestTrafficManagement_ServiceResolver(t *testing.T) { Datacenter: "dc1", InjectAutoEncryption: true, } - // If version < 1.14 disable AutoEncryption - oldVersionTmp, _ := version.NewVersion(oldVersion) - if oldVersionTmp.LessThan(libutils.Version_1_14) { - buildOpts.InjectAutoEncryption = false - } + cluster, _, _ := topology.NewCluster(t, &topology.ClusterConfig{ NumServers: 1, NumClients: 1, @@ -391,12 +386,11 @@ func TestTrafficManagement_ServiceResolver(t *testing.T) { tc.extraAssertion(staticClientProxy) } - targetVersion := libutils.TargetVersion for _, oldVersion := range upgrade.UpgradeFromVersions { for _, tc := range tcs { - t.Run(fmt.Sprintf("%s upgrade from %s to %s", tc.name, oldVersion, targetVersion), + t.Run(fmt.Sprintf("%s upgrade from %s to %s", tc.name, oldVersion, utils.TargetVersion), func(t *testing.T) { - run(t, tc, oldVersion, targetVersion) + run(t, tc, oldVersion, utils.TargetVersion) }) } } diff --git a/test/integration/consul-container/test/upgrade/peering_control_plane_mgw_test.go b/test/integration/consul-container/test/upgrade/peering_control_plane_mgw_test.go index fceec52cfa7..2cc14676ba0 100644 --- a/test/integration/consul-container/test/upgrade/peering_control_plane_mgw_test.go +++ b/test/integration/consul-container/test/upgrade/peering_control_plane_mgw_test.go @@ -24,25 +24,8 @@ import ( func TestPeering_Upgrade_ControlPlane_MGW(t *testing.T) { t.Parallel() - type testcase struct { - oldversion string - targetVersion string - } - tcs := []testcase{ - // { - // TODO: API changed from 1.13 to 1.14 in , PeerName to Peer - // exportConfigEntry - // oldversion: "1.13", - // targetVersion: *utils.TargetVersion, - // }, - { - oldversion: "1.14", - targetVersion: utils.TargetVersion, - }, - } - - run := func(t *testing.T, tc testcase) { - accepting, dialing := libtopology.BasicPeeringTwoClustersSetup(t, tc.oldversion, true) + run := func(t *testing.T, oldVersion, targetVersion string) { + accepting, dialing := libtopology.BasicPeeringTwoClustersSetup(t, oldVersion, true) var ( acceptingCluster = accepting.Cluster dialingCluster = dialing.Cluster @@ -66,11 +49,11 @@ func TestPeering_Upgrade_ControlPlane_MGW(t *testing.T) { "upstream_cx_total", 1) // Upgrade the accepting cluster and assert peering is still ACTIVE - require.NoError(t, acceptingCluster.StandardUpgrade(t, context.Background(), tc.targetVersion)) + require.NoError(t, acceptingCluster.StandardUpgrade(t, context.Background(), targetVersion)) libassert.PeeringStatus(t, acceptingClient, libtopology.AcceptingPeerName, api.PeeringStateActive) libassert.PeeringStatus(t, dialingClient, libtopology.DialingPeerName, api.PeeringStateActive) - require.NoError(t, dialingCluster.StandardUpgrade(t, context.Background(), tc.targetVersion)) + require.NoError(t, dialingCluster.StandardUpgrade(t, context.Background(), targetVersion)) libassert.PeeringStatus(t, acceptingClient, libtopology.AcceptingPeerName, api.PeeringStateActive) libassert.PeeringStatus(t, dialingClient, libtopology.DialingPeerName, api.PeeringStateActive) @@ -105,10 +88,10 @@ func TestPeering_Upgrade_ControlPlane_MGW(t *testing.T) { libassert.AssertFortioName(t, fmt.Sprintf("http://localhost:%d", port), libservice.StaticServerServiceName, "") } - for _, tc := range tcs { - t.Run(fmt.Sprintf("upgrade from %s to %s", tc.oldversion, tc.targetVersion), + for _, oldVersion := range UpgradeFromVersions { + t.Run(fmt.Sprintf("Upgrade from %s to %s", oldVersion, utils.TargetVersion), func(t *testing.T) { - run(t, tc) + run(t, oldVersion, utils.TargetVersion) }) } } diff --git a/test/integration/consul-container/test/upgrade/peering_http_test.go b/test/integration/consul-container/test/upgrade/peering_http_test.go index 7c0e5a9cee1..14fc66ccd05 100644 --- a/test/integration/consul-container/test/upgrade/peering_http_test.go +++ b/test/integration/consul-container/test/upgrade/peering_http_test.go @@ -21,9 +21,7 @@ func TestPeering_UpgradeToTarget_fromLatest(t *testing.T) { t.Parallel() type testcase struct { - oldversion string - targetVersion string - name string + name string // create creates addtional resources in peered clusters depending on cases, e.g., static-client, // static server, and config-entries. It returns the proxy services, an assertation function to // be called to verify the resources. @@ -40,18 +38,14 @@ func TestPeering_UpgradeToTarget_fromLatest(t *testing.T) { // targetVersion: *utils.TargetVersion, // }, { - oldversion: "1.14", - targetVersion: utils.TargetVersion, - name: "basic", + name: "basic", create: func(accepting *cluster.Cluster, dialing *cluster.Cluster) (libservice.Service, libservice.Service, func(), error) { return nil, nil, func() {}, nil }, extraAssertion: func(clientUpstreamPort int) {}, }, { - oldversion: "1.14", - targetVersion: utils.TargetVersion, - name: "http_router", + name: "http_router", // Create a second static-service at the client agent of accepting cluster and // a service-router that routes /static-server-2 to static-server-2 create: func(accepting *cluster.Cluster, dialing *cluster.Cluster) (libservice.Service, libservice.Service, func(), error) { @@ -104,9 +98,7 @@ func TestPeering_UpgradeToTarget_fromLatest(t *testing.T) { }, }, { - oldversion: "1.14", - targetVersion: utils.TargetVersion, - name: "http splitter and resolver", + name: "http splitter and resolver", // In addtional to the basic topology, this case provisions the following // services in the dialing cluster: // @@ -221,9 +213,7 @@ func TestPeering_UpgradeToTarget_fromLatest(t *testing.T) { extraAssertion: func(clientUpstreamPort int) {}, }, { - oldversion: "1.14", - targetVersion: utils.TargetVersion, - name: "http resolver and failover", + name: "http resolver and failover", // Verify resolver and failover can direct traffic to server in peered cluster // In addtional to the basic topology, this case provisions the following // services in the dialing cluster: @@ -316,8 +306,8 @@ func TestPeering_UpgradeToTarget_fromLatest(t *testing.T) { }, } - run := func(t *testing.T, tc testcase) { - accepting, dialing := libtopology.BasicPeeringTwoClustersSetup(t, tc.oldversion, false) + run := func(t *testing.T, tc testcase, oldVersion, targetVersion string) { + accepting, dialing := libtopology.BasicPeeringTwoClustersSetup(t, oldVersion, false) var ( acceptingCluster = accepting.Cluster dialingCluster = dialing.Cluster @@ -339,11 +329,11 @@ func TestPeering_UpgradeToTarget_fromLatest(t *testing.T) { tc.extraAssertion(appPort) // Upgrade the accepting cluster and assert peering is still ACTIVE - require.NoError(t, acceptingCluster.StandardUpgrade(t, context.Background(), tc.targetVersion)) + require.NoError(t, acceptingCluster.StandardUpgrade(t, context.Background(), targetVersion)) libassert.PeeringStatus(t, acceptingClient, libtopology.AcceptingPeerName, api.PeeringStateActive) libassert.PeeringStatus(t, dialingClient, libtopology.DialingPeerName, api.PeeringStateActive) - require.NoError(t, dialingCluster.StandardUpgrade(t, context.Background(), tc.targetVersion)) + require.NoError(t, dialingCluster.StandardUpgrade(t, context.Background(), targetVersion)) libassert.PeeringStatus(t, acceptingClient, libtopology.AcceptingPeerName, api.PeeringStateActive) libassert.PeeringStatus(t, dialingClient, libtopology.DialingPeerName, api.PeeringStateActive) @@ -382,12 +372,13 @@ func TestPeering_UpgradeToTarget_fromLatest(t *testing.T) { tc.extraAssertion(appPort) } - for _, tc := range tcs { - t.Run(fmt.Sprintf("%s upgrade from %s to %s", tc.name, tc.oldversion, tc.targetVersion), - func(t *testing.T) { - run(t, tc) - }) - // time.Sleep(3 * time.Second) + for _, oldVersion := range UpgradeFromVersions { + for _, tc := range tcs { + t.Run(fmt.Sprintf("%s upgrade from %s to %s", tc.name, oldVersion, utils.TargetVersion), + func(t *testing.T) { + run(t, tc, oldVersion, utils.TargetVersion) + }) + } } } diff --git a/test/integration/consul-container/test/upgrade/tenancy_ent_test.go b/test/integration/consul-container/test/upgrade/tenancy_ent_test.go index 55c14ebfb9c..e28664e0b3c 100644 --- a/test/integration/consul-container/test/upgrade/tenancy_ent_test.go +++ b/test/integration/consul-container/test/upgrade/tenancy_ent_test.go @@ -133,17 +133,23 @@ func testLatestGAServersWithCurrentClients_TenancyCRUD( ) // Create initial cluster - cluster := serversCluster(t, numServers, utils.LatestImageName, utils.LatestVersion) - libservice.ClientsCreate(t, numClients, utils.LatestImageName, utils.LatestVersion, cluster) + cluster, _, _ := libtopology.NewCluster(t, &libtopology.ClusterConfig{ + NumServers: numServers, + NumClients: numClients, + BuildOpts: &libcluster.BuildOptions{ + Datacenter: "dc1", + ConsulImageName: utils.LatestImageName, + ConsulVersion: utils.LatestVersion, + }, + ApplyDefaultProxySettings: true, + }) client := cluster.APIClient(0) libcluster.WaitForLeader(t, cluster, client) libcluster.WaitForMembers(t, client, 5) testutil.RunStep(t, "Create "+tenancyName, func(t *testing.T) { - fmt.Println("!!!!!!!") createFn(t, client) - fmt.Println("!!!!DONE!!!!") }) ctx := context.Background() @@ -238,9 +244,16 @@ func testLatestGAServersWithCurrentClients_TenancyCRUD( } // Create a fresh cluster from scratch - cluster2 := serversCluster(t, numServers, utils.TargetImageName, utils.TargetVersion) - libservice.ClientsCreate(t, numClients, utils.LatestImageName, utils.LatestVersion, cluster2) - + cluster2, _, _ := libtopology.NewCluster(t, &libtopology.ClusterConfig{ + NumServers: numServers, + NumClients: numClients, + BuildOpts: &libcluster.BuildOptions{ + Datacenter: "dc1", + ConsulImageName: utils.LatestImageName, + ConsulVersion: utils.LatestVersion, + }, + ApplyDefaultProxySettings: true, + }) client2 := cluster2.APIClient(0) testutil.RunStep(t, "Restore saved snapshot", func(t *testing.T) { diff --git a/test/integration/consul-container/test/upgrade/upgrade.go b/test/integration/consul-container/test/upgrade/upgrade.go index 30bbdcc627c..3dc3a227392 100644 --- a/test/integration/consul-container/test/upgrade/upgrade.go +++ b/test/integration/consul-container/test/upgrade/upgrade.go @@ -1,3 +1,3 @@ package upgrade -var UpgradeFromVersions = []string{"1.13", "1.14"} +var UpgradeFromVersions = []string{"1.14", "1.15"} From 94ecb9c5d55c7006c4491c43a34fa86698609234 Mon Sep 17 00:00:00 2001 From: cskh Date: Mon, 6 Mar 2023 13:28:02 -0500 Subject: [PATCH 118/262] upgrade test: discovery chain across partition (#16543) --- .../consul-container/libs/assert/service.go | 6 +--- .../consul-container/libs/cluster/agent.go | 1 + .../consul-container/libs/cluster/builder.go | 5 +++ .../consul-container/libs/cluster/cluster.go | 34 +++++++++++++++++-- .../libs/cluster/container.go | 7 ++++ .../test/upgrade/peering_http_test.go | 21 +++++++----- 6 files changed, 57 insertions(+), 17 deletions(-) diff --git a/test/integration/consul-container/libs/assert/service.go b/test/integration/consul-container/libs/assert/service.go index ac05cef739e..d12c3eb0fda 100644 --- a/test/integration/consul-container/libs/assert/service.go +++ b/test/integration/consul-container/libs/assert/service.go @@ -128,11 +128,7 @@ func ServiceLogContains(t *testing.T, service libservice.Service, target string) func AssertFortioName(t *testing.T, urlbase string, name string, reqHost string) { t.Helper() var fortioNameRE = regexp.MustCompile(("\nFORTIO_NAME=(.+)\n")) - client := &http.Client{ - Transport: &http.Transport{ - DisableKeepAlives: true, - }, - } + client := cleanhttp.DefaultClient() retry.RunWith(&retry.Timer{Timeout: defaultHTTPTimeout, Wait: defaultHTTPWait}, t, func(r *retry.R) { fullurl := fmt.Sprintf("%s/debug?env=dump", urlbase) req, err := http.NewRequest("GET", fullurl, nil) diff --git a/test/integration/consul-container/libs/cluster/agent.go b/test/integration/consul-container/libs/cluster/agent.go index 3c4eeafc13c..8dfa496d8bf 100644 --- a/test/integration/consul-container/libs/cluster/agent.go +++ b/test/integration/consul-container/libs/cluster/agent.go @@ -17,6 +17,7 @@ type Agent interface { NewClient(string, bool) (*api.Client, error) GetName() string GetAgentName() string + GetPartition() string GetPod() testcontainers.Container ClaimAdminPort() (int, error) GetConfig() Config diff --git a/test/integration/consul-container/libs/cluster/builder.go b/test/integration/consul-container/libs/cluster/builder.go index f08b727d04b..9ce5bf5c8c3 100644 --- a/test/integration/consul-container/libs/cluster/builder.go +++ b/test/integration/consul-container/libs/cluster/builder.go @@ -245,6 +245,11 @@ func (b *Builder) Peering(enable bool) *Builder { return b } +func (b *Builder) Partition(name string) *Builder { + b.conf.Set("partition", name) + return b +} + func (b *Builder) RetryJoin(names ...string) *Builder { b.conf.Set("retry_join", names) return b diff --git a/test/integration/consul-container/libs/cluster/cluster.go b/test/integration/consul-container/libs/cluster/cluster.go index f78ee01d3d1..9f80ee573fe 100644 --- a/test/integration/consul-container/libs/cluster/cluster.go +++ b/test/integration/consul-container/libs/cluster/cluster.go @@ -315,6 +315,16 @@ func (c *Cluster) StandardUpgrade(t *testing.T, ctx context.Context, targetVersi } t.Logf("The number of followers = %d", len(followers)) + // NOTE: we only assert the number of agents in default partition + // TODO: add partition to the cluster struct to assert partition size + clusterSize := 0 + for _, agent := range c.Agents { + if agent.GetPartition() == "" || agent.GetPartition() == "default" { + clusterSize++ + } + } + t.Logf("The number of agents in default partition = %d", clusterSize) + upgradeFn := func(agent Agent, clientFactory func() (*api.Client, error)) error { config := agent.GetConfig() config.Version = targetVersion @@ -349,8 +359,10 @@ func (c *Cluster) StandardUpgrade(t *testing.T, ctx context.Context, targetVersi return err } - // wait until the agent rejoin and leader is elected - WaitForMembers(t, client, len(c.Agents)) + // wait until the agent rejoin and leader is elected; skip non-default agent + if agent.GetPartition() == "" || agent.GetPartition() == "default" { + WaitForMembers(t, client, clusterSize) + } WaitForLeader(t, c, client) return nil @@ -478,7 +490,23 @@ func (c *Cluster) Servers() []Agent { return servers } -// Clients returns the handle to client agents +// Clients returns the handle to client agents in provided partition +func (c *Cluster) ClientsInPartition(partition string) []Agent { + var clients []Agent + + for _, n := range c.Agents { + if n.IsServer() { + continue + } + + if n.GetPartition() == partition { + clients = append(clients, n) + } + } + return clients +} + +// Clients returns the handle to client agents in all partitions func (c *Cluster) Clients() []Agent { var clients []Agent diff --git a/test/integration/consul-container/libs/cluster/container.go b/test/integration/consul-container/libs/cluster/container.go index 80f572ba5e1..3ad1b2d3516 100644 --- a/test/integration/consul-container/libs/cluster/container.go +++ b/test/integration/consul-container/libs/cluster/container.go @@ -38,6 +38,7 @@ type consulContainerNode struct { container testcontainers.Container serverMode bool datacenter string + partition string config Config podReq testcontainers.ContainerRequest consulReq testcontainers.ContainerRequest @@ -228,6 +229,7 @@ func NewConsulContainer(ctx context.Context, config Config, cluster *Cluster, po container: consulContainer, serverMode: pc.Server, datacenter: pc.Datacenter, + partition: pc.Partition, ctx: ctx, podReq: podReq, consulReq: consulReq, @@ -318,6 +320,10 @@ func (c *consulContainerNode) GetDatacenter() string { return c.datacenter } +func (c *consulContainerNode) GetPartition() string { + return c.partition +} + func (c *consulContainerNode) IsServer() bool { return c.serverMode } @@ -641,6 +647,7 @@ type parsedConfig struct { Datacenter string `json:"datacenter"` Server bool `json:"server"` Ports parsedPorts `json:"ports"` + Partition string `json:"partition"` } type parsedPorts struct { diff --git a/test/integration/consul-container/test/upgrade/peering_http_test.go b/test/integration/consul-container/test/upgrade/peering_http_test.go index 14fc66ccd05..53f48ea95c5 100644 --- a/test/integration/consul-container/test/upgrade/peering_http_test.go +++ b/test/integration/consul-container/test/upgrade/peering_http_test.go @@ -122,7 +122,7 @@ func TestPeering_UpgradeToTarget_fromLatest(t *testing.T) { } clientConnectProxy, err := createAndRegisterStaticClientSidecarWith2Upstreams(dialing, - []string{"split-static-server", "peer-static-server"}, + []string{"split-static-server", "peer-static-server"}, true, ) if err != nil { return nil, nil, nil, fmt.Errorf("error creating client connect proxy in cluster %s", dialing.NetworkName) @@ -236,7 +236,7 @@ func TestPeering_UpgradeToTarget_fromLatest(t *testing.T) { } clientConnectProxy, err := createAndRegisterStaticClientSidecarWith2Upstreams(dialing, - []string{libservice.StaticServerServiceName, "peer-static-server"}, + []string{libservice.StaticServerServiceName, "peer-static-server"}, true, ) if err != nil { return nil, nil, nil, fmt.Errorf("error creating client connect proxy in cluster %s", dialing.NetworkName) @@ -385,7 +385,8 @@ func TestPeering_UpgradeToTarget_fromLatest(t *testing.T) { // createAndRegisterStaticClientSidecarWith2Upstreams creates a static-client that // has two upstreams connecting to destinationNames: local bind addresses are 5000 // and 5001. -func createAndRegisterStaticClientSidecarWith2Upstreams(c *cluster.Cluster, destinationNames []string) (*libservice.ConnectContainer, error) { +// - crossCluster: true if upstream is in another cluster +func createAndRegisterStaticClientSidecarWith2Upstreams(c *cluster.Cluster, destinationNames []string, crossCluster bool) (*libservice.ConnectContainer, error) { // Do some trickery to ensure that partial completion is correctly torn // down, but successful execution is not. var deferClean utils.ResettableDefer @@ -407,17 +408,11 @@ func createAndRegisterStaticClientSidecarWith2Upstreams(c *cluster.Cluster, dest DestinationName: destinationNames[0], LocalBindAddress: "0.0.0.0", LocalBindPort: cluster.ServiceUpstreamLocalBindPort, - MeshGateway: api.MeshGatewayConfig{ - Mode: mgwMode, - }, }, { DestinationName: destinationNames[1], LocalBindAddress: "0.0.0.0", LocalBindPort: cluster.ServiceUpstreamLocalBindPort2, - MeshGateway: api.MeshGatewayConfig{ - Mode: mgwMode, - }, }, }, }, @@ -425,6 +420,14 @@ func createAndRegisterStaticClientSidecarWith2Upstreams(c *cluster.Cluster, dest }, } + if crossCluster { + for _, upstream := range req.Connect.SidecarService.Proxy.Upstreams { + upstream.MeshGateway = api.MeshGatewayConfig{ + Mode: mgwMode, + } + } + } + if err := node.GetClient().Agent().ServiceRegister(req); err != nil { return nil, err } From 6166889d446a920503bf58570b712cbad29743e5 Mon Sep 17 00:00:00 2001 From: John Maguire Date: Mon, 6 Mar 2023 15:43:36 -0500 Subject: [PATCH 119/262] Update the consul-k8s cli docs for the new `proxy log` subcommand (#16458) * Update the consul-k8s cli docs for the new `proxy log` subcommand * Updated consul-k8s docs from PR feedback * Added proxy log command to release notes --- website/content/docs/k8s/k8s-cli.mdx | 286 ++++++++++++++++++ .../docs/release-notes/consul-k8s/v1_1_x.mdx | 23 +- 2 files changed, 300 insertions(+), 9 deletions(-) diff --git a/website/content/docs/k8s/k8s-cli.mdx b/website/content/docs/k8s/k8s-cli.mdx index b3e6f76bc4e..bb45986e11e 100644 --- a/website/content/docs/k8s/k8s-cli.mdx +++ b/website/content/docs/k8s/k8s-cli.mdx @@ -32,6 +32,7 @@ You can use the following commands with `consul-k8s`. - [`proxy`](#proxy): Inspect Envoy proxies managed by Consul. - [`proxy list`](#proxy-list): List all Pods running proxies managed by Consul. - [`proxy read`](#proxy-read): Inspect the Envoy configuration for a given Pod. + - [`proxy log`](#proxy-log): Inspect and modify the Envoy logging configuration for a given Pod. - [`status`](#status): Check the status of a Consul installation on Kubernetes. - [`troubleshoot`](#troubleshoot): Troubleshoot Consul service mesh and networking issues from a given pod. - [`uninstall`](#uninstall): Uninstall Consul deployment. @@ -101,6 +102,7 @@ Consul in your Kubernetes Cluster. - [`proxy list`](#proxy-list): List all Pods running proxies managed by Consul. - [`proxy read`](#proxy-read): Inspect the Envoy configuration for a given Pod. +- [`proxy log`](#proxy-log): Inspect and modify the Envoy logging configuration for a given Pod. ### `proxy list` @@ -448,6 +450,290 @@ $ consul-k8s proxy read backend-658b679b45-d5xlb -o raw } ``` +### `proxy log` + +The `proxy log` command allows you to inspect and modify the logging configuration of Envoy proxies running on a given Pod. + +```shell-session +$ consul-k8s proxy log +``` + +The command takes a required value, ``. This should be the full name +of a Kubernetes Pod. If a Pod is running more than one Envoy proxy managed by +Consul, as in the [Multiport configuration](/consul/docs/k8s/connect#kubernetes-pods-with-multiple-ports), +the terminal displays configuration information for all proxies in the pod. + +The following options are available. + +| Flag | Description | Default | +| ---------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------- | +| `-namespace`, `-n` | `String` Specifies the namespace containing the target Pod. | Current [kubeconfig](https://kubernetes.io/docs/concepts/configuration/organize-cluster-access-kubeconfig/) namespace. | +| `-update-level`, `-u` | `String` Specifies the logger (optional) and the level to update.

    Use the following format to configure the same level for loggers: `-update-level `.

    You can also specify a comma-delineated list to configure levels for specific loggers, for example: `-update-level grpc:warning,http:info`.

    | none | +| `-reset`, `-r` | `String` Reset the log levels for all loggers back to the default of `info` | `info` | + +#### Example commands +In the following example, Consul returns the log levels for all of an Envoy proxy's loggers in a pod with the ID `server-697458b9f8-4vr29`: + +```shell-session +$ consul-k8s proxy log server-697458b9f8-4vr29 +Envoy log configuration for server-697458b9f8-4vr29 in namespace default: + +==> Log Levels for server-697458b9f8-4vr29 +Name Level +rds info +backtrace info +hc info +http info +io info +jwt info +rocketmq info +matcher info +runtime info +redis info +stats info +tap info +alternate_protocols_cache info +grpc info +init info +quic info +thrift info +wasm info +aws info +conn_handler info +ext_proc info +hystrix info +tracing info +dns info +oauth2 info +connection info +health_checker info +kafka info +mongo info +config info +admin info +forward_proxy info +misc info +websocket info +dubbo info +happy_eyeballs info +main info +client info +lua info +udp info +cache_filter info +filter info +multi_connection info +quic_stream info +router info +http2 info +key_value_store info +secret info +testing info +upstream info +assert info +ext_authz info +rbac info +decompression info +envoy_bug info +file info +pool info +``` + +The following command updates the log levels for all loggers of an Envoy proxy to `warning`. +```shell-session +$ consul-k8s proxy log server-697458b9f8-4vr29 -update-level warning +Envoy log configuration for server-697458b9f8-4vr29 in namespace default: + +==> Log Levels for server-697458b9f8-4vr29 +Name Level +pool warning +rbac warning +tracing warning +aws warning +cache_filter warning +decompression warning +init warning +assert warning +client warning +misc warning +udp warning +config warning +hystrix warning +key_value_store warning +runtime warning +admin warning +dns warning +jwt warning +redis warning +quic warning +alternate_protocols_cache warning +conn_handler warning +ext_proc warning +http warning +oauth2 warning +ext_authz warning +http2 warning +kafka warning +mongo warning +router warning +thrift warning +grpc warning +matcher warning +hc warning +multi_connection warning +wasm warning +dubbo warning +filter warning +upstream warning +backtrace warning +connection warning +io warning +main warning +happy_eyeballs warning +rds warning +tap warning +envoy_bug warning +rocketmq warning +file warning +forward_proxy warning +stats warning +health_checker warning +lua warning +secret warning +quic_stream warning +testing warning +websocket warning +``` +The following command updates the `grpc` log level to `error`, the `http` log level to `critical`, and the `runtime` log level to `debug` for pod ID `server-697458b9f8-4vr29` +```shell-session +$ consul-k8s proxy log server-697458b9f8-4vr29 -update-level grpc:error,http:critical,runtime:debug +Envoy log configuration for server-697458b9f8-4vr29 in namespace default: + +==> Log Levels for server-697458b9f8-4vr29 +Name Level +assert info +dns info +http critical +pool info +thrift info +udp info +grpc error +hc info +stats info +wasm info +alternate_protocols_cache info +ext_authz info +filter info +http2 info +key_value_store info +tracing info +cache_filter info +quic_stream info +aws info +io info +matcher info +rbac info +tap info +connection info +conn_handler info +rocketmq info +hystrix info +oauth2 info +redis info +backtrace info +file info +forward_proxy info +kafka info +config info +router info +runtime debug +testing info +happy_eyeballs info +ext_proc info +init info +lua info +health_checker info +misc info +envoy_bug info +jwt info +main info +quic info +upstream info +websocket info +client info +decompression info +mongo info +multi_connection info +rds info +secret info +admin info +dubbo info +``` +The following command resets the log levels for all loggers of an Envoy proxy in pod `server-697458b9f8-4vr29` to the default level of `info`. +```shell-session +$ consul-k8s proxy log server-697458b9f8-4vr29 -r +Envoy log configuration for server-697458b9f8-4vr29 in namespace default: + +==> Log Levels for server-697458b9f8-4vr29 +Name Level +ext_proc info +secret info +thrift info +tracing info +dns info +rocketmq info +happy_eyeballs info +hc info +io info +misc info +conn_handler info +key_value_store info +rbac info +hystrix info +wasm info +admin info +cache_filter info +client info +health_checker info +oauth2 info +runtime info +testing info +grpc info +upstream info +forward_proxy info +matcher info +pool info +aws info +decompression info +jwt info +tap info +assert info +redis info +http info +quic info +rds info +connection info +envoy_bug info +stats info +alternate_protocols_cache info +backtrace info +filter info +http2 info +init info +multi_connection info +quic_stream info +dubbo info +ext_authz info +main info +udp info +websocket info +config info +mongo info +router info +file info +kafka info +lua info +``` ### `status` The `status` command provides an overall status summary of the Consul on Kubernetes installation. It also provides the configuration that was used to deploy Consul K8s and information about the health of Consul servers and clients. This command does not take in any flags. diff --git a/website/content/docs/release-notes/consul-k8s/v1_1_x.mdx b/website/content/docs/release-notes/consul-k8s/v1_1_x.mdx index 6931aecd705..5c3b8a5619c 100644 --- a/website/content/docs/release-notes/consul-k8s/v1_1_x.mdx +++ b/website/content/docs/release-notes/consul-k8s/v1_1_x.mdx @@ -10,9 +10,14 @@ description: >- ## Release Highlights - **Enhanced Envoy Access Logging:** Envoy access logs are now centrally managed via the `accessLogs` field within the ProxyDefaults CRD to allow operators to easily turn on access logs for all proxies within the service mesh. Refer to [Access logs overview](/consul/docs/connect/observability/access-logs) for more information. - -- **Consul Envoy Extensions:** The new Envoy extension system enables you to modify Consul-generated Envoy resources outside of the Consul binary. This will allow extensions to add, delete, and modify Envoy listeners, routes, clusters, and endpoints, enabling support for additional Envoy features without changes to the Consul codebase. -The new `envoyExtensions` field in the ProxyDefaults and ServiceDefaults CRDs enable built-in Envoy extensions. Refer to [Envoy extensions overview](/consul/docs/connect/proxies/envoy-extensions) for more information on how to use these extensions. + +- **Consul Envoy Extensions:** The new Envoy extension system enables you to modify Consul-generated Envoy resources outside of the Consul binary. This will allow extensions to add, delete, and modify Envoy listeners, routes, clusters, and endpoints, enabling support for additional Envoy features without changes to the Consul codebase. +The new `envoyExtensions` field in the ProxyDefaults and ServiceDefaults CRDs enable built-in Envoy extensions. Refer to [Envoy extensions overview](/consul/docs/connect/proxies/envoy-extensions) for more information on how to use these extensions. + +- **Envoy Proxy Debugging CLI Commands**: This release adds a new command to quickly modify the log level of Envoy proxies for sidecars and gateways for easier debugging. +Refer to [consul-k8s CLI proxy log command](/consul/docs/k8s/k8s-cli#proxy-log) docs for more information. + * Add `consul-k8s proxy log podname` command for displaying current log levels or updating log levels for Envoy in a given pod. + ## What's Changed @@ -27,14 +32,14 @@ that you wanted to be injected, you must now set namespaceSelector as follows: operator: "NotIn" values: ["kube-system","local-path-storage"] ``` - + ## Supported Software ~> **Note:** Consul 1.14.x and 1.13.x are not supported. Please refer to [Supported Consul and Kubernetes versions](/consul/docs/k8s/compatibility#supported-consul-and-kubernetes-versions) for more detail on choosing the correct `consul-k8s` version. -- Consul 1.15.x. -- Consul Dataplane v1.1.x. Refer to [Envoy and Consul Dataplane](/consul/docs/connect/proxies/envoy#envoy-and-consul-dataplane) for details about Consul Dataplane versions and the available packaged Envoy version. +- Consul 1.15.x. +- Consul Dataplane v1.1.x. Refer to [Envoy and Consul Dataplane](/consul/docs/connect/proxies/envoy#envoy-and-consul-dataplane) for details about Consul Dataplane versions and the available packaged Envoy version. - Kubernetes 1.23.x - 1.26.x -- `kubectl` 1.23.x - 1.26.x +- `kubectl` 1.23.x - 1.26.x - Helm 3.6+ ## Upgrading @@ -43,9 +48,9 @@ For detailed information on upgrading, please refer to the [Upgrades page](/cons ## Known Issues -The following issues are known to exist in the v1.1.0 release: +The following issues are known to exist in the v1.1.0 release: -- Pod Security Standards that are configured for the [Pod Security Admission controller](https://kubernetes.io/blog/2022/08/25/pod-security-admission-stable/) are currently not supported by Consul K8s. OpenShift 4.11.x enables Pod Security Standards on Kubernetes 1.25 [by default](https://connect.redhat.com/en/blog/important-openshift-changes-pod-security-standards) and is also not supported. Support will be added in a future Consul K8s 1.0.x patch release. +- Pod Security Standards that are configured for the [Pod Security Admission controller](https://kubernetes.io/blog/2022/08/25/pod-security-admission-stable/) are currently not supported by Consul K8s. OpenShift 4.11.x enables Pod Security Standards on Kubernetes 1.25 [by default](https://connect.redhat.com/en/blog/important-openshift-changes-pod-security-standards) and is also not supported. Support will be added in a future Consul K8s 1.0.x patch release. ## Changelogs From 7ea2bd67316c02d7e5d4173a9992eeba9803ab07 Mon Sep 17 00:00:00 2001 From: Ashlee M Boyer <43934258+ashleemboyer@users.noreply.github.com> Date: Mon, 6 Mar 2023 17:07:25 -0500 Subject: [PATCH 120/262] Delete test-link-rewrites.yml (#16546) --- .github/workflows/test-link-rewrites.yml | 16 ---------------- 1 file changed, 16 deletions(-) delete mode 100644 .github/workflows/test-link-rewrites.yml diff --git a/.github/workflows/test-link-rewrites.yml b/.github/workflows/test-link-rewrites.yml deleted file mode 100644 index b189c6d79ca..00000000000 --- a/.github/workflows/test-link-rewrites.yml +++ /dev/null @@ -1,16 +0,0 @@ -name: Test Link Rewrites - -on: [deployment_status] - -jobs: - test-link-rewrites: - if: github.event.deployment_status.state == 'success' - uses: hashicorp/dev-portal/.github/workflows/docs-content-link-rewrites-e2e.yml@2aceb60125f6c15f4c8dbe2e4d79148047bfa437 - with: - repo-owner: "hashicorp" - repo-name: "consul" - commit-sha: ${{ github.sha }} - main-branch-preview-url: "https://consul-git-main-hashicorp.vercel.app/" - # Workflow is only intended to run for one single migration PR - # This variable does not need to be updated - pr-branch-preview-url: "https://consul-git-docs-ambmigrate-link-formats-hashicorp.vercel.app/" From 63204b5183ea7e8b0f577511b20c5f7e9b832abb Mon Sep 17 00:00:00 2001 From: Valeriia Ruban Date: Mon, 6 Mar 2023 14:10:09 -0800 Subject: [PATCH 121/262] feat: update notification to use hds toast component (#16519) --- .changelog/16519.txt | 3 + .../lock-session/notifications/index.hbs | 46 +++----- .../consul/nspace/notifications/index.hbs | 20 +--- .../consul/partition/notifications/index.hbs | 21 ++-- .../consul/peer/notifications/index.hbs | 21 ++-- .../consul-ui/app/components/app/index.scss | 11 +- .../app/components/app/notification/index.hbs | 2 +- .../consul/intention/form/index.hbs | 60 +++++----- .../consul/intention/list/components.scss | 9 -- .../app/components/data-loader/index.hbs | 19 +--- .../app/components/data-writer/index.hbs | 71 ++++-------- .../app/components/hashicorp-consul/index.hbs | 106 ++++++++---------- .../app/components/notice/README.mdx | 50 --------- .../consul-ui/app/components/notice/index.hbs | 10 -- .../app/components/notice/index.scss | 31 ----- .../app/components/notice/layout.scss | 24 ---- .../consul-ui/app/components/notice/skin.scss | 77 ------------- .../consul-ui/app/modifiers/notification.mdx | 27 ++--- .../consul-ui/app/styles/components.scss | 1 - ui/packages/consul-ui/app/styles/layout.scss | 3 - .../consul-ui/app/templates/dc/kv/index.hbs | 75 +++++-------- .../consul-ui/app/templates/dc/nodes/show.hbs | 60 +++------- .../app/templates/dc/services/instance.hbs | 60 +++++----- .../app/templates/dc/services/show.hbs | 60 +++------- .../app/templates/dc/show/license.hbs | 57 +++------- .../app/templates/dc/show/serverstatus.hbs | 60 +++------- .../policies/as-many/add-existing.feature | 4 +- .../dc/acls/policies/as-many/add-new.feature | 12 +- .../dc/acls/policies/create.feature | 8 +- .../dc/acls/policies/delete.feature | 12 +- .../dc/acls/policies/update.feature | 12 +- .../acls/roles/as-many/add-existing.feature | 4 +- .../dc/acls/roles/as-many/add-new.feature | 16 +-- .../acceptance/dc/acls/roles/create.feature | 9 +- .../acceptance/dc/acls/roles/update.feature | 12 +- .../acceptance/dc/acls/tokens/clone.feature | 8 +- .../acceptance/dc/acls/tokens/create.feature | 8 +- .../dc/acls/tokens/own-no-delete.feature | 4 +- .../acceptance/dc/acls/tokens/update.feature | 12 +- .../acceptance/dc/acls/tokens/use.feature | 8 +- .../acceptance/dc/intentions/create.feature | 8 +- .../acceptance/dc/intentions/delete.feature | 17 ++- .../acceptance/dc/intentions/update.feature | 8 +- .../tests/acceptance/dc/kvs/create.feature | 8 +- .../tests/acceptance/dc/kvs/delete.feature | 12 +- .../dc/kvs/sessions/invalidate.feature | 8 +- .../tests/acceptance/dc/kvs/update.feature | 20 ++-- .../dc/nodes/sessions/invalidate.feature | 8 +- .../acceptance/dc/nspaces/delete.feature | 12 +- .../acceptance/dc/nspaces/update.feature | 8 +- .../tests/acceptance/dc/peers/delete.feature | 8 +- .../acceptance/dc/peers/establish.feature | 4 +- .../tests/acceptance/dc/services/show.feature | 3 +- .../services/show/intentions/create.feature | 8 +- .../dc/services/show/intentions/index.feature | 4 +- .../services/show/topology/intentions.feature | 6 +- .../tests/acceptance/deleting.feature | 12 +- .../consul-ui/tests/acceptance/login.feature | 4 +- .../tests/acceptance/settings/update.feature | 4 +- 59 files changed, 428 insertions(+), 847 deletions(-) create mode 100644 .changelog/16519.txt delete mode 100644 ui/packages/consul-ui/app/components/notice/README.mdx delete mode 100644 ui/packages/consul-ui/app/components/notice/index.hbs delete mode 100644 ui/packages/consul-ui/app/components/notice/index.scss delete mode 100644 ui/packages/consul-ui/app/components/notice/layout.scss delete mode 100644 ui/packages/consul-ui/app/components/notice/skin.scss diff --git a/.changelog/16519.txt b/.changelog/16519.txt new file mode 100644 index 00000000000..758d4cb11a2 --- /dev/null +++ b/.changelog/16519.txt @@ -0,0 +1,3 @@ +```release-note:improvement +ui: Update to use Hds::Toast component to show notifications +``` \ No newline at end of file diff --git a/ui/packages/consul-lock-sessions/app/components/consul/lock-session/notifications/index.hbs b/ui/packages/consul-lock-sessions/app/components/consul/lock-session/notifications/index.hbs index 132749f8b0a..8b37123b9bc 100644 --- a/ui/packages/consul-lock-sessions/app/components/consul/lock-session/notifications/index.hbs +++ b/ui/packages/consul-lock-sessions/app/components/consul/lock-session/notifications/index.hbs @@ -1,37 +1,27 @@ {{#if (eq @type 'remove')}} {{#if @error}} - - - Error! - - -

    - There was an error invalidating the Lock Session. - {{#if (and @error.status @error.detail)}} + as |T|> + Error! + + There was an error invalidating the Lock Session. + {{#if (and @error.status @error.detail)}}
    {{@error.status}}: {{@error.detail}} - {{/if}} -

    -
    -
    + {{/if}} + + {{else}} - - - Success! - - -

    - Your Lock Session has been invalidated. -

    -
    -
    + as |T|> + Success! + + Your Lock Session has been invalidated. + + {{/if}} {{else if (eq @type 'kv')}} diff --git a/ui/packages/consul-nspaces/app/components/consul/nspace/notifications/index.hbs b/ui/packages/consul-nspaces/app/components/consul/nspace/notifications/index.hbs index c373a535b31..9ed7dfd3efd 100644 --- a/ui/packages/consul-nspaces/app/components/consul/nspace/notifications/index.hbs +++ b/ui/packages/consul-nspaces/app/components/consul/nspace/notifications/index.hbs @@ -1,16 +1,8 @@ {{#if (eq @type 'remove')}} - - - Success! - - -

    - Your Namespace has been marked for deletion. -

    -
    -
    + + Success! + Your Namespace has been marked for deletion. + {{/if}} diff --git a/ui/packages/consul-partitions/app/components/consul/partition/notifications/index.hbs b/ui/packages/consul-partitions/app/components/consul/partition/notifications/index.hbs index 5b50a2f6614..5db208cb26d 100644 --- a/ui/packages/consul-partitions/app/components/consul/partition/notifications/index.hbs +++ b/ui/packages/consul-partitions/app/components/consul/partition/notifications/index.hbs @@ -1,16 +1,11 @@ {{#if (eq @type 'remove')}} - - - Success! - - -

    - Your Partition has been marked for deletion. -

    -
    -
    + as |T|> + Success! + + Your Partition has been marked for deletion. + + {{/if}} diff --git a/ui/packages/consul-peerings/app/components/consul/peer/notifications/index.hbs b/ui/packages/consul-peerings/app/components/consul/peer/notifications/index.hbs index 972c5c10e8d..4e2ebfdfdad 100644 --- a/ui/packages/consul-peerings/app/components/consul/peer/notifications/index.hbs +++ b/ui/packages/consul-peerings/app/components/consul/peer/notifications/index.hbs @@ -1,16 +1,11 @@ {{#if (eq @type 'remove')}} - - - Success! - - -

    - Your Peer has been marked for deletion. -

    -
    -
    + as |T|> + Success! + + Your Peer has been marked for deletion. + + {{/if}} diff --git a/ui/packages/consul-ui/app/components/app/index.scss b/ui/packages/consul-ui/app/components/app/index.scss index 5892387482e..10300a85c18 100644 --- a/ui/packages/consul-ui/app/components/app/index.scss +++ b/ui/packages/consul-ui/app/components/app/index.scss @@ -5,14 +5,10 @@ @extend %app-notifications; } %app-notifications { - display: flex; - flex-direction: column; - align-items: center; - position: fixed; - z-index: 50; - top: -45px; - left: 0; + z-index: 100; + bottom: 2rem; + left: 1.5rem; pointer-events: none; } @@ -125,7 +121,6 @@ main { %main-nav-horizontal-toggle:checked + header > div > nav:first-of-type { left: calc(var(--chrome-width, 280px) * -1); } - %main-nav-horizontal-toggle ~ main .notifications, %main-nav-horizontal-toggle ~ main { margin-left: var(--chrome-width, 280px); } diff --git a/ui/packages/consul-ui/app/components/app/notification/index.hbs b/ui/packages/consul-ui/app/components/app/notification/index.hbs index e6653d30211..1009ddb115a 100644 --- a/ui/packages/consul-ui/app/components/app/notification/index.hbs +++ b/ui/packages/consul-ui/app/components/app/notification/index.hbs @@ -1,5 +1,5 @@
    {{#if (string-starts-with api.error.detail 'duplicate intention found:')}} - - - Intention exists! - - -

    - An intention already exists for this Source-Destination pair. Please enter a different combination of Services, or search the intentions to edit an existing intention. -

    -
    -
    + + Intention exists! + + An intention already exists for this Source-Destination pair. Please enter a different combination of Services, or search the intentions to edit an existing intention. + + {{else}} - - - Error! - - -

    - There was an error saving your intention. - {{#if (and api.error.status api.error.detail)}} -
    {{api.error.status}}: {{api.error.detail}} - {{/if}} -

    -
    -
    + + Error! + + There was an error saving your intention. + {{#if (and api.error.status api.error.detail)}} +
    {{api.error.status}}: {{api.error.detail}} + {{/if}} +
    +
    {{/if}}
    diff --git a/ui/packages/consul-ui/app/components/consul/intention/list/components.scss b/ui/packages/consul-ui/app/components/consul/intention/list/components.scss index b7a0760b8c5..796bd81136a 100644 --- a/ui/packages/consul-ui/app/components/consul/intention/list/components.scss +++ b/ui/packages/consul-ui/app/components/consul/intention/list/components.scss @@ -15,13 +15,4 @@ td.intent- strong { @extend %pill-l7; } - .notice.allow { - @extend %notice-success; - } - .notice.deny { - @extend %notice-error; - } - .notice.permissions { - @extend %notice-info; - } } diff --git a/ui/packages/consul-ui/app/components/data-loader/index.hbs b/ui/packages/consul-ui/app/components/data-loader/index.hbs index 6be3fd61c6a..e207e44811d 100644 --- a/ui/packages/consul-ui/app/components/data-loader/index.hbs +++ b/ui/packages/consul-ui/app/components/data-loader/index.hbs @@ -56,22 +56,13 @@ {{#yield-slot name="disconnected" params=(block-params (action dispatch "RESET"))}} {{yield api}} {{else}} - - - Warning! - - -

    - An error was returned whilst loading this data, refresh to try again. -

    -
    -
    + }} as |T|> + Warning! + An error was returned whilst loading this data, refresh to try again. + {{/yield-slot}} {{/if}} diff --git a/ui/packages/consul-ui/app/components/data-writer/index.hbs b/ui/packages/consul-ui/app/components/data-writer/index.hbs index 36f418459be..a042fd6c2ac 100644 --- a/ui/packages/consul-ui/app/components/data-writer/index.hbs +++ b/ui/packages/consul-ui/app/components/data-writer/index.hbs @@ -39,22 +39,14 @@ as |after|}} {{#yield-slot name="removed" params=(block-params after)}} {{yield api}} {{else}} - - - Success! - - -

    - Your {{or label type}} has been deleted. -

    -
    -
    + + Success! + Your {{or label type}} has been deleted. + {{/yield-slot}} {{/let}} @@ -66,22 +58,14 @@ as |after|}} {{#yield-slot name="persisted" params=(block-params after)}} {{yield api}} {{else}} - - - Success! - - -

    - Your {{or label type}} has been saved. -

    -
    -
    + }} as |T|> + Success! + Your {{or label type}} has been saved. + {{/yield-slot}} {{/let}} @@ -93,27 +77,20 @@ as |after|}} {{#yield-slot name="error" params=(block-params after api.error)}} {{yield api}} {{else}} - - - Error! - - -

    - There was an error saving your {{or label type}}. - {{#if (and api.error.status api.error.detail)}} + }} as |T|> + Error! + There was an error saving your {{or label type}}. + {{#if (and api.error.status api.error.detail)}}
    {{api.error.status}}: {{api.error.detail}} - {{else if api.error.message}} + {{else if api.error.message}}
    {{api.error.message}} - {{/if}} -

    -
    -
    + {{/if}} + + {{/yield-slot}} {{/let}} diff --git a/ui/packages/consul-ui/app/components/hashicorp-consul/index.hbs b/ui/packages/consul-ui/app/components/hashicorp-consul/index.hbs index 6942abded6b..5d1e5a24713 100644 --- a/ui/packages/consul-ui/app/components/hashicorp-consul/index.hbs +++ b/ui/packages/consul-ui/app/components/hashicorp-consul/index.hbs @@ -7,66 +7,58 @@ {{{flash.dom}}} {{else}} {{#let (lowercase flash.type) (lowercase flash.action) as |status type|}} - - - - {{capitalize status}}! - - - -

    - {{#if (eq type 'logout')}} - {{#if (eq status 'success')}} - You are now logged out. - {{else}} - There was an error logging out. - {{/if}} - {{else if (eq type 'authorize')}} - {{#if (eq status 'success')}} - You are now logged in. - {{else}} - There was an error, please check your SecretID/Token - {{/if}} + as |T|> + {{capitalize status}}! + + {{#if (eq type 'logout')}} + {{#if (eq status 'success')}} + You are now logged out. {{else}} - {{#if (or (eq type 'use') (eq flash.model 'token'))}} - - {{else if (eq flash.model 'intention')}} - - {{else if (eq flash.model 'role')}} - - {{else if (eq flash.model 'policy')}} - - {{/if}} + There was an error logging out. {{/if}} -

    -
    -
    + {{else if (eq type 'authorize')}} + {{#if (eq status 'success')}} + You are now logged in. + {{else}} + There was an error, please check your SecretID/Token + {{/if}} + {{else}} + {{#if (or (eq type 'use') (eq flash.model 'token'))}} + + {{else if (eq flash.model 'intention')}} + + {{else if (eq flash.model 'role')}} + + {{else if (eq flash.model 'policy')}} + + {{/if}} + {{/if}} + + + {{/let}} {{/if}} diff --git a/ui/packages/consul-ui/app/components/notice/README.mdx b/ui/packages/consul-ui/app/components/notice/README.mdx deleted file mode 100644 index ed05cb8a219..00000000000 --- a/ui/packages/consul-ui/app/components/notice/README.mdx +++ /dev/null @@ -1,50 +0,0 @@ -# Notice - -Presentational component for informational/warning/error banners/notices. - - -```hbs preview-template - - -

    Header

    -
    - -

    - Body -

    -
    - -

    - Footer link -

    -
    -
    - -
    -
    Provide a widget to change the @type
    - - - -
    -``` - -## Arguments - -| Argument/Attribute | Type | Default | Description | -| --- | --- | --- | --- | -| `type` | `String` | `info` | Type of notice [info\|warning\|error] | - -## See - -- [Template Source Code](./index.hbs) - ---- diff --git a/ui/packages/consul-ui/app/components/notice/index.hbs b/ui/packages/consul-ui/app/components/notice/index.hbs deleted file mode 100644 index 59448aed0d4..00000000000 --- a/ui/packages/consul-ui/app/components/notice/index.hbs +++ /dev/null @@ -1,10 +0,0 @@ -
    -{{yield (hash - Header=(component 'anonymous' tagName="header") - Body=(component 'anonymous') - Footer=(component 'anonymous' tagName="footer") -)}} -
    diff --git a/ui/packages/consul-ui/app/components/notice/index.scss b/ui/packages/consul-ui/app/components/notice/index.scss deleted file mode 100644 index a965188ec3f..00000000000 --- a/ui/packages/consul-ui/app/components/notice/index.scss +++ /dev/null @@ -1,31 +0,0 @@ -@import './skin'; -@import './layout'; - -%notice { - margin: 1em 0; -} -/**/ -.notice.success { - @extend %notice-success; -} -.notice.warning { - @extend %notice-warning; -} -.notice.error { - @extend %notice-error; -} -.notice.info { - @extend %notice-info; -} -.notice.highlight { - @extend %notice-highlight; -} -.notice.policy-management { - @extend %notice-highlight; -} -.notice.crd::before { - -webkit-mask-image: none; - mask-image: none; - background-color: transparent; - @extend %with-logo-kubernetes-color-icon; -} diff --git a/ui/packages/consul-ui/app/components/notice/layout.scss b/ui/packages/consul-ui/app/components/notice/layout.scss deleted file mode 100644 index f7f49a9d430..00000000000 --- a/ui/packages/consul-ui/app/components/notice/layout.scss +++ /dev/null @@ -1,24 +0,0 @@ -%notice { - position: relative; - padding: 0.8rem; -} -%notice header { - margin-bottom: 0.1rem; -} -%notice header > * { - margin-bottom: 0; -} -%notice p { - margin-bottom: 0.3rem; - line-height: 1.4; -} -/* this is probably skin */ -%notice { - padding-left: calc(0.8rem + 1.4rem); -} -%notice::before { - position: absolute; - top: 0.8rem; - left: 0.6rem; - font-size: 1rem; -} diff --git a/ui/packages/consul-ui/app/components/notice/skin.scss b/ui/packages/consul-ui/app/components/notice/skin.scss deleted file mode 100644 index b8c2dc4dca9..00000000000 --- a/ui/packages/consul-ui/app/components/notice/skin.scss +++ /dev/null @@ -1,77 +0,0 @@ -%notice { - border-radius: var(--decor-radius-100); - border: var(--decor-border-100); - color: var(--token-color-hashicorp-brand); -} -%notice::before { - @extend %as-pseudo; -} -%notice header > * { - @extend %h300; -} -%notice footer * { - @extend %p3; - font-weight: var(--typo-weight-bold); -} -%notice-success, -%notice-info, -%notice-highlight, -%notice-error, -%notice-warning { - @extend %notice; -} -%notice-success { - background-color: var(--token-color-surface-success); - border-color: var(--token-color-foreground-success); -} -%notice-success header * { - color: var(--token-color-palette-green-400); -} -%notice-info { - border-color: var(--token-color-border-action); - background-color: var(--token-color-surface-action); -} -%notice-info header * { - color: var(--token-color-foreground-action-active); -} -%notice-highlight { - background-color: var(--token-color-surface-strong); - border-color: var(--token-color-palette-neutral-300); -} -%notice-info header * { - color: var(--token-color-foreground-action-active); -} -%notice-warning { - border-color: var(--token-color-vault-border); - background-color: var(--token-color-vault-gradient-faint-start); -} -%notice-warning header * { - color: var(--token-color-vault-foreground); -} -%notice-error { - background-color: var(--token-color-surface-critical); - border-color: var(--token-color-foreground-critical); -} -%notice-error header * { - color: var(--token-color-foreground-critical); -} -%notice-success::before { - @extend %with-check-circle-fill-mask; - color: var(--token-color-foreground-success); -} -%notice-info::before { - @extend %with-info-circle-fill-mask; - color: var(--token-color-foreground-action); -} -%notice-highlight::before { - @extend %with-star-fill-mask; - color: var(--token-color-vault-brand); -} -%notice-warning::before { - @extend %with-alert-triangle-mask; - color: var(--token-color-foreground-warning); -} -%notice-error::before { - @extend %with-cancel-square-fill-mask; - color: var(--token-color-foreground-critical); -} diff --git a/ui/packages/consul-ui/app/modifiers/notification.mdx b/ui/packages/consul-ui/app/modifiers/notification.mdx index c888c096fbe..3b16c826b97 100644 --- a/ui/packages/consul-ui/app/modifiers/notification.mdx +++ b/ui/packages/consul-ui/app/modifiers/notification.mdx @@ -7,24 +7,17 @@ like the below: ```hbs preview-template
    Attach a Warning notice to the top of the app ^^^
    - - - - Warning! - - -

    + + Warning! + This service has been deregistered and no longer exists in the catalog. -

    -
    -
    - + +
    ``` diff --git a/ui/packages/consul-ui/app/styles/components.scss b/ui/packages/consul-ui/app/styles/components.scss index 656b05cf1ca..6af53eb8411 100644 --- a/ui/packages/consul-ui/app/styles/components.scss +++ b/ui/packages/consul-ui/app/styles/components.scss @@ -66,7 +66,6 @@ @import 'consul-ui/components/inline-code'; @import 'consul-ui/components/overlay'; @import 'consul-ui/components/tooltip'; -@import 'consul-ui/components/notice'; @import 'consul-ui/components/modal-dialog'; @import 'consul-ui/components/list-collection'; @import 'consul-ui/components/filter-bar'; diff --git a/ui/packages/consul-ui/app/styles/layout.scss b/ui/packages/consul-ui/app/styles/layout.scss index 5221f6d0884..99c84a0d1c7 100644 --- a/ui/packages/consul-ui/app/styles/layout.scss +++ b/ui/packages/consul-ui/app/styles/layout.scss @@ -79,9 +79,6 @@ html[data-route='dc.services.index'] .consul-service-list ul, .consul-auth-method-list ul { @extend %list-after-filter-bar; } -.notice + .consul-token-list ul { - border-top-width: 1px !important; -} // TODO: This shouldn't be done here, decide the best way to do this // %main-decoration ? %main-skin ? %content-skin ? diff --git a/ui/packages/consul-ui/app/templates/dc/kv/index.hbs b/ui/packages/consul-ui/app/templates/dc/kv/index.hbs index bd0b135e31e..d9de97440fa 100644 --- a/ui/packages/consul-ui/app/templates/dc/kv/index.hbs +++ b/ui/packages/consul-ui/app/templates/dc/kv/index.hbs @@ -30,56 +30,35 @@ as |route|> {{#if (eq loader.error.status "404")}} - - - Warning! - - -

    - This KV or parent of this KV was deleted. -

    -
    -
    + + Warning! + + This KV or parent of this KV was deleted. + + {{else if (eq loader.error.status "403")}} - - - Error! - - -

    - You no longer have access to this KV. -

    -
    -
    + + Error! + + You no longer have access to this KV. + + {{else}} - - - Warning! - - -

    - An error was returned whilst loading this data, refresh to try again. -

    -
    -
    + + Warning! + + An error was returned whilst loading this data, refresh to try again. + + {{/if}}
    diff --git a/ui/packages/consul-ui/app/templates/dc/nodes/show.hbs b/ui/packages/consul-ui/app/templates/dc/nodes/show.hbs index ec7f4649399..647c750736d 100644 --- a/ui/packages/consul-ui/app/templates/dc/nodes/show.hbs +++ b/ui/packages/consul-ui/app/templates/dc/nodes/show.hbs @@ -29,56 +29,32 @@ as |route|> {{#if (eq loader.error.status "404")}} - - - Warning! - - -

    - This node no longer exists in the catalog. -

    -
    -
    + }} as |T|> + Warning! + This node no longer exists in the catalog. + {{else if (eq loader.error.status "403")}} - - - Error! - - -

    - You no longer have access to this node -

    -
    -
    + }} as |T|> + Error! + You no longer have access to this node. + {{else}} - - - Warning! - - -

    - An error was returned whilst loading this data, refresh to try again. -

    -
    -
    + }} as |T|> + Warning! + An error was returned whilst loading this data, refresh to try again. + {{/if}}
    diff --git a/ui/packages/consul-ui/app/templates/dc/services/instance.hbs b/ui/packages/consul-ui/app/templates/dc/services/instance.hbs index dcbb0a3ddb5..b032d51259a 100644 --- a/ui/packages/consul-ui/app/templates/dc/services/instance.hbs +++ b/ui/packages/consul-ui/app/templates/dc/services/instance.hbs @@ -21,43 +21,35 @@ {{#if (eq loader.error.status '404')}} - - - Warning! - - -

    - This service has been deregistered and no longer exists in the catalog. -

    -
    -
    + as |T|> + Warning! + + This service has been deregistered and no longer exists in the catalog. + + {{else if (eq loader.error.status '403')}} - - - Error! - - -

    - You no longer have access to this service -

    -
    -
    + + Error! + + You no longer have access to this service. + + {{else}} - - - Warning! - - -

    - An error was returned whilst loading this data, refresh to try again. -

    -
    -
    + + Warning! + + An error was returned whilst loading this data, refresh to try again. + + {{/if}}
    diff --git a/ui/packages/consul-ui/app/templates/dc/services/show.hbs b/ui/packages/consul-ui/app/templates/dc/services/show.hbs index e8c0044e65a..9a9810632b8 100644 --- a/ui/packages/consul-ui/app/templates/dc/services/show.hbs +++ b/ui/packages/consul-ui/app/templates/dc/services/show.hbs @@ -22,56 +22,32 @@ as |route|> {{#if (eq loader.error.status "404")}} - - - Warning! - - -

    - This service has been deregistered and no longer exists in the catalog. -

    -
    -
    + }} as |T|> + Warning! + This service has been deregistered and no longer exists in the catalog. + {{else if (eq loader.error.status "403")}} - - - Error! - - -

    - You no longer have access to this service -

    -
    -
    + }} as |T|> + Error! + You no longer have access to this service. + {{else}} - - - Warning! - - -

    - An error was returned whilst loading this data, refresh to try again. -

    -
    -
    + }} as |T|> + Warning! + An error was returned whilst loading this data, refresh to try again. + {{/if}}
    diff --git a/ui/packages/consul-ui/app/templates/dc/show/license.hbs b/ui/packages/consul-ui/app/templates/dc/show/license.hbs index db009690751..53c1fbe7332 100644 --- a/ui/packages/consul-ui/app/templates/dc/show/license.hbs +++ b/ui/packages/consul-ui/app/templates/dc/show/license.hbs @@ -24,56 +24,29 @@ as |item|}} {{#if (eq loader.error.status "404")}} - - - Warning! - - -

    - This service has been deregistered and no longer exists in the catalog. -

    -
    -
    + }} as |T|> + Warning! + This service has been deregistered and no longer exists in the catalog. + {{else if (eq loader.error.status "403")}} - - - Error! - - -

    - You no longer have access to this service -

    -
    -
    + }} as |T|> + Error! + You no longer have access to this service. + {{else}} - - - Warning! - - -

    - An error was returned whilst loading this data, refresh to try again. -

    -
    -
    + }} as |T|> + Warning! + An error was returned whilst loading this data, refresh to try again. + {{/if}}
    diff --git a/ui/packages/consul-ui/app/templates/dc/show/serverstatus.hbs b/ui/packages/consul-ui/app/templates/dc/show/serverstatus.hbs index 6e8adf89986..75e166fe11c 100644 --- a/ui/packages/consul-ui/app/templates/dc/show/serverstatus.hbs +++ b/ui/packages/consul-ui/app/templates/dc/show/serverstatus.hbs @@ -24,56 +24,32 @@ as |item|}} {{#if (eq loader.error.status "404")}} - - - Warning! - - -

    - This service has been deregistered and no longer exists in the catalog. -

    -
    -
    + }} as |T|> + Warning! + This service has been deregistered and no longer exists in the catalog. + {{else if (eq loader.error.status "403")}} - - - Error! - - -

    - You no longer have access to this service -

    -
    -
    + }} as |T|> + Error! + You no longer have access to this service. + {{else}} - - - Warning! - - -

    - An error was returned whilst loading this data, refresh to try again. -

    -
    -
    + }} as |T|> + Warning! + An error was returned whilst loading this data, refresh to try again. + {{/if}}
    diff --git a/ui/packages/consul-ui/tests/acceptance/dc/acls/policies/as-many/add-existing.feature b/ui/packages/consul-ui/tests/acceptance/dc/acls/policies/as-many/add-existing.feature index 54e64f8b474..bf9464e5070 100644 --- a/ui/packages/consul-ui/tests/acceptance/dc/acls/policies/as-many/add-existing.feature +++ b/ui/packages/consul-ui/tests/acceptance/dc/acls/policies/as-many/add-existing.feature @@ -41,8 +41,8 @@ Feature: dc / acls / policies / as many / add existing: Add existing policy Name: Policy 2 --- Then the url should be /datacenter/acls/[Model]s - And "[data-notification]" has the "notification-update" class - And "[data-notification]" has the "success" class + And "[data-notification]" has the "hds-toast" class + And "[data-notification]" has the "hds-alert--color-success" class Where: ------------- | Model | diff --git a/ui/packages/consul-ui/tests/acceptance/dc/acls/policies/as-many/add-new.feature b/ui/packages/consul-ui/tests/acceptance/dc/acls/policies/as-many/add-new.feature index 367ae9221d8..599fc69e752 100644 --- a/ui/packages/consul-ui/tests/acceptance/dc/acls/policies/as-many/add-new.feature +++ b/ui/packages/consul-ui/tests/acceptance/dc/acls/policies/as-many/add-new.feature @@ -39,8 +39,8 @@ Feature: dc / acls / policies / as many / add new: Add new policy Name: New-Policy --- Then the url should be /datacenter/acls/[Model]s - And "[data-notification]" has the "notification-update" class - And "[data-notification]" has the "success" class + And "[data-notification]" has the "hds-toast" class + And "[data-notification]" has the "hds-alert--color-success" class Where: ------------- | Model | @@ -62,8 +62,8 @@ Feature: dc / acls / policies / as many / add new: Add new policy - ServiceName: New-Service-Identity --- Then the url should be /datacenter/acls/[Model]s - And "[data-notification]" has the "notification-update" class - And "[data-notification]" has the "success" class + And "[data-notification]" has the "hds-toast" class + And "[data-notification]" has the "hds-alert--color-success" class Where: ------------- | Model | @@ -86,8 +86,8 @@ Feature: dc / acls / policies / as many / add new: Add new policy Datacenter: datacenter --- Then the url should be /datacenter/acls/[Model]s - And "[data-notification]" has the "notification-update" class - And "[data-notification]" has the "success" class + And "[data-notification]" has the "hds-toast" class + And "[data-notification]" has the "hds-alert--color-success" class Where: ------------- | Model | diff --git a/ui/packages/consul-ui/tests/acceptance/dc/acls/policies/create.feature b/ui/packages/consul-ui/tests/acceptance/dc/acls/policies/create.feature index 0e9f6a21d15..85589fcfeca 100644 --- a/ui/packages/consul-ui/tests/acceptance/dc/acls/policies/create.feature +++ b/ui/packages/consul-ui/tests/acceptance/dc/acls/policies/create.feature @@ -24,8 +24,8 @@ Feature: dc / acls / policies / create Description: [Description] --- Then the url should be /datacenter/acls/policies - And "[data-notification]" has the "notification-create" class - And "[data-notification]" has the "success" class + And "[data-notification]" has the "hds-toast" class + And "[data-notification]" has the "hds-alert--color-success" class Where: --------------------------- | Description | @@ -46,5 +46,5 @@ Feature: dc / acls / policies / create - Namespace --- Then the url should be /datacenter/acls/policies - And "[data-notification]" has the "notification-create" class - And "[data-notification]" has the "success" class + And "[data-notification]" has the "hds-toast" class + And "[data-notification]" has the "hds-alert--color-success" class diff --git a/ui/packages/consul-ui/tests/acceptance/dc/acls/policies/delete.feature b/ui/packages/consul-ui/tests/acceptance/dc/acls/policies/delete.feature index c75b75c896a..87a6be3e1e6 100644 --- a/ui/packages/consul-ui/tests/acceptance/dc/acls/policies/delete.feature +++ b/ui/packages/consul-ui/tests/acceptance/dc/acls/policies/delete.feature @@ -15,8 +15,8 @@ Feature: dc / acls / policies / delete: Policy Delete And I click delete on the policies And I click confirmDelete on the policies Then a DELETE request was made to "/v1/acl/policy/1981f51d-301a-497b-89a0-05112ef02b4b?dc=datacenter&ns=@!namespace" - And "[data-notification]" has the "notification-delete" class - And "[data-notification]" has the "success" class + And "[data-notification]" has the "hds-toast" class + And "[data-notification]" has the "hds-alert--color-success" class Scenario: Deleting a policy model from the policies listing page errors Given the url "/v1/acl/policy/1981f51d-301a-497b-89a0-05112ef02b4b?dc=datacenter&ns=@namespace" responds with a 500 status And 1 policy model from yaml @@ -30,8 +30,8 @@ Feature: dc / acls / policies / delete: Policy Delete And I click actions on the policies And I click delete on the policies And I click confirmDelete on the policies - And "[data-notification]" has the "notification-delete" class - And "[data-notification]" has the "error" class + And "[data-notification]" has the "hds-toast" class + And "[data-notification]" has the "hds-alert--color-critical" class Scenario: Deleting a policy from the policy detail page When I visit the policy page for yaml --- @@ -41,8 +41,8 @@ Feature: dc / acls / policies / delete: Policy Delete And I click delete And I click confirmDelete on the deleteModal Then a DELETE request was made to "/v1/acl/policy/1981f51d-301a-497b-89a0-05112ef02b4b?dc=datacenter&ns=@!namespace" - And "[data-notification]" has the "notification-delete" class - And "[data-notification]" has the "success" class + And "[data-notification]" has the "hds-toast" class + And "[data-notification]" has the "hds-alert--color-success" class # FIXME # Scenario: Deleting a policy from the policy detail page errors # Given the url "/v1/acl/policy/1981f51d-301a-497b-89a0-05112ef02b4b?dc=datacenter&ns=@namespace" responds with a 500 status diff --git a/ui/packages/consul-ui/tests/acceptance/dc/acls/policies/update.feature b/ui/packages/consul-ui/tests/acceptance/dc/acls/policies/update.feature index e0857d14ed9..f207a078dd5 100644 --- a/ui/packages/consul-ui/tests/acceptance/dc/acls/policies/update.feature +++ b/ui/packages/consul-ui/tests/acceptance/dc/acls/policies/update.feature @@ -37,8 +37,8 @@ Feature: dc / acls / policies / update: ACL Policy Update --- Then the url should be /datacenter/acls/policies - And "[data-notification]" has the "notification-update" class - And "[data-notification]" has the "success" class + And "[data-notification]" has the "hds-toast" class + And "[data-notification]" has the "hds-alert--color-success" class Where: ------------------------------------------------------------------------------ | Name | Rules | Description | @@ -50,8 +50,8 @@ Feature: dc / acls / policies / update: ACL Policy Update Given the url "/v1/acl/policy/policy-id" responds with a 500 status And I submit Then the url should be /datacenter/acls/policies/policy-id - Then "[data-notification]" has the "notification-update" class - And "[data-notification]" has the "error" class + And "[data-notification]" has the "hds-toast" class + And "[data-notification]" has the "hds-alert--color-critical" class @notNamespaceable Scenario: Updating a simple ACL policy when Namespaces are disabled does not send Namespace @@ -65,5 +65,5 @@ Feature: dc / acls / policies / update: ACL Policy Update - Namespace --- Then the url should be /datacenter/acls/policies - And "[data-notification]" has the "notification-update" class - And "[data-notification]" has the "success" class + And "[data-notification]" has the "hds-toast" class + And "[data-notification]" has the "hds-alert--color-success" class diff --git a/ui/packages/consul-ui/tests/acceptance/dc/acls/roles/as-many/add-existing.feature b/ui/packages/consul-ui/tests/acceptance/dc/acls/roles/as-many/add-existing.feature index 6f22975753d..acf4e16a2c4 100644 --- a/ui/packages/consul-ui/tests/acceptance/dc/acls/roles/as-many/add-existing.feature +++ b/ui/packages/consul-ui/tests/acceptance/dc/acls/roles/as-many/add-existing.feature @@ -46,5 +46,5 @@ Feature: dc / acls / roles / as many / add existing: Add existing Name: Role 2 --- Then the url should be /datacenter/acls/tokens - And "[data-notification]" has the "notification-update" class - And "[data-notification]" has the "success" class + And "[data-notification]" has the "hds-toast" class + And "[data-notification]" has the "hds-alert--color-success" class diff --git a/ui/packages/consul-ui/tests/acceptance/dc/acls/roles/as-many/add-new.feature b/ui/packages/consul-ui/tests/acceptance/dc/acls/roles/as-many/add-new.feature index 45249a8e4a5..601c17bb73f 100644 --- a/ui/packages/consul-ui/tests/acceptance/dc/acls/roles/as-many/add-new.feature +++ b/ui/packages/consul-ui/tests/acceptance/dc/acls/roles/as-many/add-new.feature @@ -46,8 +46,8 @@ Feature: dc / acls / roles / as-many / add-new: Add new ID: ee52203d-989f-4f7a-ab5a-2bef004164ca-1 --- Then the url should be /datacenter/acls/tokens - And "[data-notification]" has the "notification-update" class - And "[data-notification]" has the "success" class + And "[data-notification]" has the "hds-toast" class + And "[data-notification]" has the "hds-alert--color-success" class Scenario: Add Role that has an existing Policy And I click "#new-role .ember-power-select-trigger" And I click ".ember-power-select-option:first-child" @@ -71,8 +71,8 @@ Feature: dc / acls / roles / as-many / add-new: Add new ID: ee52203d-989f-4f7a-ab5a-2bef004164ca-1 --- Then the url should be /datacenter/acls/tokens - And "[data-notification]" has the "notification-update" class - And "[data-notification]" has the "success" class + And "[data-notification]" has the "hds-toast" class + And "[data-notification]" has the "hds-alert--color-success" class Scenario: Add Role and add a new Policy And I click roles.form.policies.create Then I fill in the roles.form.policies.form with yaml @@ -111,8 +111,8 @@ Feature: dc / acls / roles / as-many / add-new: Add new ID: ee52203d-989f-4f7a-ab5a-2bef004164ca-1 --- Then the url should be /datacenter/acls/tokens - And "[data-notification]" has the "notification-update" class - And "[data-notification]" has the "success" class + And "[data-notification]" has the "hds-toast" class + And "[data-notification]" has the "hds-alert--color-success" class Scenario: Add Role and add a new Service Identity And I click roles.form.policies.create Then I fill in the roles.form.policies.form with yaml @@ -141,8 +141,8 @@ Feature: dc / acls / roles / as-many / add-new: Add new ID: ee52203d-989f-4f7a-ab5a-2bef004164ca-1 --- Then the url should be /datacenter/acls/tokens - And "[data-notification]" has the "notification-update" class - And "[data-notification]" has the "success" class + And "[data-notification]" has the "hds-toast" class + And "[data-notification]" has the "hds-alert--color-success" class @ignore: Scenario: Click the cancel form Then ok diff --git a/ui/packages/consul-ui/tests/acceptance/dc/acls/roles/create.feature b/ui/packages/consul-ui/tests/acceptance/dc/acls/roles/create.feature index ce63a93df59..0c5a511015c 100644 --- a/ui/packages/consul-ui/tests/acceptance/dc/acls/roles/create.feature +++ b/ui/packages/consul-ui/tests/acceptance/dc/acls/roles/create.feature @@ -24,8 +24,8 @@ Feature: dc / acls / roles / create Description: [Description] --- Then the url should be /datacenter/acls/roles - And "[data-notification]" has the "notification-create" class - And "[data-notification]" has the "success" class + And "[data-notification]" has the "hds-toast" class + And "[data-notification]" has the "hds-alert--color-success" class Where: --------------------------- | Description | @@ -45,6 +45,5 @@ Feature: dc / acls / roles / create - Namespace --- Then the url should be /datacenter/acls/roles - And "[data-notification]" has the "notification-create" class - And "[data-notification]" has the "success" class - + And "[data-notification]" has the "hds-toast" class + And "[data-notification]" has the "hds-alert--color-success" class diff --git a/ui/packages/consul-ui/tests/acceptance/dc/acls/roles/update.feature b/ui/packages/consul-ui/tests/acceptance/dc/acls/roles/update.feature index 795fd7908f2..081dc174cd9 100644 --- a/ui/packages/consul-ui/tests/acceptance/dc/acls/roles/update.feature +++ b/ui/packages/consul-ui/tests/acceptance/dc/acls/roles/update.feature @@ -29,8 +29,8 @@ Feature: dc / acls / roles / update: ACL Role Update Description: [Description] --- Then the url should be /datacenter/acls/roles - And "[data-notification]" has the "notification-update" class - And "[data-notification]" has the "success" class + And "[data-notification]" has the "hds-toast" class + And "[data-notification]" has the "hds-alert--color-success" class Where: ------------------------------------------ | Name | Description | @@ -42,8 +42,8 @@ Feature: dc / acls / roles / update: ACL Role Update Given the url "/v1/acl/role/role-id" responds with a 500 status And I submit Then the url should be /datacenter/acls/roles/role-id - Then "[data-notification]" has the "notification-update" class - And "[data-notification]" has the "error" class + And "[data-notification]" has the "hds-toast" class + And "[data-notification]" has the "hds-alert--color-critical" class @notNamespaceable Scenario: Updating a simple ACL role when Namespaces are disabled does not send Namespace @@ -57,5 +57,5 @@ Feature: dc / acls / roles / update: ACL Role Update - Namespace --- Then the url should be /datacenter/acls/roles - And "[data-notification]" has the "notification-update" class - And "[data-notification]" has the "success" class + And "[data-notification]" has the "hds-toast" class + And "[data-notification]" has the "hds-alert--color-success" class diff --git a/ui/packages/consul-ui/tests/acceptance/dc/acls/tokens/clone.feature b/ui/packages/consul-ui/tests/acceptance/dc/acls/tokens/clone.feature index dba4efc39e0..c03c5ef35b9 100644 --- a/ui/packages/consul-ui/tests/acceptance/dc/acls/tokens/clone.feature +++ b/ui/packages/consul-ui/tests/acceptance/dc/acls/tokens/clone.feature @@ -16,8 +16,8 @@ Feature: dc / acls / tokens / clone: Cloning an ACL token And I click actions on the tokens And I click clone on the tokens Then a PUT request was made to "/v1/acl/token/token/clone?dc=datacenter&ns=@!namespace" - Then "[data-notification]" has the "notification-clone" class - And "[data-notification]" has the "success" class + And "[data-notification]" has the "hds-toast" class + And "[data-notification]" has the "hds-alert--color-success" class Scenario: Using an ACL token from the detail page When I visit the token page for yaml --- @@ -26,5 +26,5 @@ Feature: dc / acls / tokens / clone: Cloning an ACL token --- And I click clone Then the url should be /datacenter/acls/tokens - Then "[data-notification]" has the "notification-clone" class - And "[data-notification]" has the "success" class + And "[data-notification]" has the "hds-toast" class + And "[data-notification]" has the "hds-alert--color-success" class diff --git a/ui/packages/consul-ui/tests/acceptance/dc/acls/tokens/create.feature b/ui/packages/consul-ui/tests/acceptance/dc/acls/tokens/create.feature index 351b21aa397..c330e4f07c3 100644 --- a/ui/packages/consul-ui/tests/acceptance/dc/acls/tokens/create.feature +++ b/ui/packages/consul-ui/tests/acceptance/dc/acls/tokens/create.feature @@ -21,8 +21,8 @@ Feature: dc / acls / tokens / create Description: [Description] --- Then the url should be /datacenter/acls/tokens - And "[data-notification]" has the "notification-create" class - And "[data-notification]" has the "success" class + And "[data-notification]" has the "hds-toast" class + And "[data-notification]" has the "hds-alert--color-success" class Where: --------------------------- | Description | @@ -41,5 +41,5 @@ Feature: dc / acls / tokens / create - Namespace --- Then the url should be /datacenter/acls/tokens - And "[data-notification]" has the "notification-create" class - And "[data-notification]" has the "success" class + And "[data-notification]" has the "hds-toast" class + And "[data-notification]" has the "hds-alert--color-success" class diff --git a/ui/packages/consul-ui/tests/acceptance/dc/acls/tokens/own-no-delete.feature b/ui/packages/consul-ui/tests/acceptance/dc/acls/tokens/own-no-delete.feature index b3e05853c1d..b5e5484f413 100644 --- a/ui/packages/consul-ui/tests/acceptance/dc/acls/tokens/own-no-delete.feature +++ b/ui/packages/consul-ui/tests/acceptance/dc/acls/tokens/own-no-delete.feature @@ -25,8 +25,8 @@ Feature: dc / acls / tokens / own-no-delete: Your current token has no delete bu And I click actions on the tokens And I click use on the tokens And I click confirmUse on the tokens - Then "[data-notification]" has the "notification-use" class - And "[data-notification]" has the "success" class + And "[data-notification]" has the "hds-toast" class + And "[data-notification]" has the "hds-alert--color-success" class Then I have settings like yaml --- consul:token: "{\"AccessorID\":\"token\",\"SecretID\":\"ee52203d-989f-4f7a-ab5a-2bef004164ca\",\"Namespace\":\"@namespace\",\"Partition\":\"default\"}" diff --git a/ui/packages/consul-ui/tests/acceptance/dc/acls/tokens/update.feature b/ui/packages/consul-ui/tests/acceptance/dc/acls/tokens/update.feature index 4770cedf585..74552145648 100644 --- a/ui/packages/consul-ui/tests/acceptance/dc/acls/tokens/update.feature +++ b/ui/packages/consul-ui/tests/acceptance/dc/acls/tokens/update.feature @@ -26,8 +26,8 @@ Feature: dc / acls / tokens / update: ACL Token Update Description: [Description] --- Then the url should be /datacenter/acls/tokens - And "[data-notification]" has the "notification-update" class - And "[data-notification]" has the "success" class + And "[data-notification]" has the "hds-toast" class + And "[data-notification]" has the "hds-alert--color-success" class Where: --------------------------- | Description | @@ -38,8 +38,8 @@ Feature: dc / acls / tokens / update: ACL Token Update Given the url "/v1/acl/token/key" responds with a 500 status And I submit Then the url should be /datacenter/acls/tokens/key - Then "[data-notification]" has the "notification-update" class - And "[data-notification]" has the "error" class + And "[data-notification]" has the "hds-toast" class + And "[data-notification]" has the "hds-alert--color-critical" class @notNamespaceable Scenario: Updating a simple ACL token when Namespaces are disabled does not send Namespace @@ -53,5 +53,5 @@ Feature: dc / acls / tokens / update: ACL Token Update - Namespace --- Then the url should be /datacenter/acls/tokens - And "[data-notification]" has the "notification-update" class - And "[data-notification]" has the "success" class + And "[data-notification]" has the "hds-toast" class + And "[data-notification]" has the "hds-alert--color-success" class diff --git a/ui/packages/consul-ui/tests/acceptance/dc/acls/tokens/use.feature b/ui/packages/consul-ui/tests/acceptance/dc/acls/tokens/use.feature index 1e354f4045c..52c9b973d8e 100644 --- a/ui/packages/consul-ui/tests/acceptance/dc/acls/tokens/use.feature +++ b/ui/packages/consul-ui/tests/acceptance/dc/acls/tokens/use.feature @@ -24,8 +24,8 @@ Feature: dc / acls / tokens / use: Using an ACL token And I click actions on the tokens And I click use on the tokens And I click confirmUse on the tokens - Then "[data-notification]" has the "notification-use" class - And "[data-notification]" has the "success" class + And "[data-notification]" has the "hds-toast" class + And "[data-notification]" has the "hds-alert--color-success" class Then I have settings like yaml --- consul:token: "{\"AccessorID\":\"token\",\"SecretID\":\"ee52203d-989f-4f7a-ab5a-2bef004164ca\",\"Namespace\":\"@namespace\",\"Partition\":\"default\"}" @@ -40,8 +40,8 @@ Feature: dc / acls / tokens / use: Using an ACL token --- And I click use And I click confirmUse - Then "[data-notification]" has the "notification-use" class - And "[data-notification]" has the "success" class + And "[data-notification]" has the "hds-toast" class + And "[data-notification]" has the "hds-alert--color-success" class Then I have settings like yaml --- consul:token: "{\"AccessorID\":\"token\",\"SecretID\":\"ee52203d-989f-4f7a-ab5a-2bef004164ca\",\"Namespace\":\"@namespace\",\"Partition\":\"default\"}" diff --git a/ui/packages/consul-ui/tests/acceptance/dc/intentions/create.feature b/ui/packages/consul-ui/tests/acceptance/dc/intentions/create.feature index 0b4c6baa658..2d074876ec9 100644 --- a/ui/packages/consul-ui/tests/acceptance/dc/intentions/create.feature +++ b/ui/packages/consul-ui/tests/acceptance/dc/intentions/create.feature @@ -59,8 +59,8 @@ Feature: dc / intentions / create: Intention Create --- Then the url should be /datacenter/intentions And the title should be "Intentions - Consul" - And "[data-notification]" has the "notification-update" class - And "[data-notification]" has the "success" class + And "[data-notification]" has the "hds-toast" class + And "[data-notification]" has the "hds-alert--color-success" class @notNamespaceable Scenario: with namespaces disabled Given 1 datacenter model with the value "datacenter" @@ -101,5 +101,5 @@ Feature: dc / intentions / create: Intention Create --- Then the url should be /datacenter/intentions And the title should be "Intentions - Consul" - And "[data-notification]" has the "notification-update" class - And "[data-notification]" has the "success" class + And "[data-notification]" has the "hds-toast" class + And "[data-notification]" has the "hds-alert--color-success" class diff --git a/ui/packages/consul-ui/tests/acceptance/dc/intentions/delete.feature b/ui/packages/consul-ui/tests/acceptance/dc/intentions/delete.feature index 84b2e295af8..f85b0b2b689 100644 --- a/ui/packages/consul-ui/tests/acceptance/dc/intentions/delete.feature +++ b/ui/packages/consul-ui/tests/acceptance/dc/intentions/delete.feature @@ -23,8 +23,8 @@ Feature: dc / intentions / deleting: Deleting items with confirmations, success And I click delete on the intentionList.intentions And I click confirmInlineDelete on the intentionList.intentions Then a DELETE request was made to "/v1/connect/intentions/exact?source=default%2Fdefault%2Fname&destination=default%2Fdefault%2Fdestination&dc=datacenter" - And "[data-notification]" has the "notification-delete" class - And "[data-notification]" has the "success" class + And "[data-notification]" has the "hds-toast" class + And "[data-notification]" has the "hds-alert--color-success" class Scenario: Deleting an intention from the intention detail page When I visit the intention page for yaml --- @@ -34,8 +34,8 @@ Feature: dc / intentions / deleting: Deleting items with confirmations, success And I click delete And I click confirmDelete Then a DELETE request was made to "/v1/connect/intentions/exact?source=default%2Fdefault%2Fname&destination=default%2Fdefault%2Fdestination&dc=datacenter" - And "[data-notification]" has the "notification-delete" class - And "[data-notification]" has the "success" class + And "[data-notification]" has the "hds-toast" class + And "[data-notification]" has the "hds-alert--color-success" class Scenario: Deleting an intention from the intention detail page and getting an error When I visit the intention page for yaml --- @@ -45,8 +45,8 @@ Feature: dc / intentions / deleting: Deleting items with confirmations, success Given the url "/v1/connect/intentions/exact?source=default%2Fdefault%2Fname&destination=default%2Fdefault%2Fdestination&dc=datacenter" responds with a 500 status And I click delete And I click confirmDelete - And "[data-notification]" has the "notification-update" class - And "[data-notification]" has the "error" class + And "[data-notification]" has the "hds-toast" class + And "[data-notification]" has the "hds-alert--color-critical" class Scenario: Deleting an intention from the intention detail page and getting an error due to a duplicate intention When I visit the intention page for yaml --- @@ -60,6 +60,5 @@ Feature: dc / intentions / deleting: Deleting items with confirmations, success --- And I click delete And I click confirmDelete - And "[data-notification]" has the "notification-update" class - And "[data-notification]" has the "error" class - And I see the text "Intention exists" in "[data-notification] strong" + And "[data-notification]" has the "hds-toast" class + And "[data-notification]" has the "hds-alert--color-critical" class diff --git a/ui/packages/consul-ui/tests/acceptance/dc/intentions/update.feature b/ui/packages/consul-ui/tests/acceptance/dc/intentions/update.feature index 0d7b8525c74..5faa162816c 100644 --- a/ui/packages/consul-ui/tests/acceptance/dc/intentions/update.feature +++ b/ui/packages/consul-ui/tests/acceptance/dc/intentions/update.feature @@ -33,8 +33,8 @@ Feature: dc / intentions / update: Intention Update --- Then the url should be /datacenter/intentions And the title should be "Intentions - Consul" - And "[data-notification]" has the "notification-update" class - And "[data-notification]" has the "success" class + And "[data-notification]" has the "hds-toast" class + And "[data-notification]" has the "hds-alert--color-success" class Where: ------------------------------ | Description | Action | @@ -44,6 +44,6 @@ Feature: dc / intentions / update: Intention Update Given the url "/v1/connect/intentions/exact?source=default%2Fdefault%2Fweb&destination=default%2Fdefault%2Fdb&dc=datacenter" responds with a 500 status And I submit Then the url should be /datacenter/intentions/intention-id - Then "[data-notification]" has the "notification-update" class - And "[data-notification]" has the "error" class + And "[data-notification]" has the "hds-toast" class + And "[data-notification]" has the "hds-alert--color-critical" class diff --git a/ui/packages/consul-ui/tests/acceptance/dc/kvs/create.feature b/ui/packages/consul-ui/tests/acceptance/dc/kvs/create.feature index bd10541a759..9a98ba71fc2 100644 --- a/ui/packages/consul-ui/tests/acceptance/dc/kvs/create.feature +++ b/ui/packages/consul-ui/tests/acceptance/dc/kvs/create.feature @@ -16,8 +16,8 @@ Feature: dc / kvs / create And I submit Then the url should be /datacenter/kv Then a PUT request was made to "/v1/kv/key-value?dc=datacenter&ns=@namespace" - And "[data-notification]" has the "notification-update" class - And "[data-notification]" has the "success" class + And "[data-notification]" has the "hds-toast" class + And "[data-notification]" has the "hds-alert--color-success" class Scenario: Creating a folder Given 1 datacenter model with the value "datacenter" When I visit the kv page for yaml @@ -33,8 +33,8 @@ Feature: dc / kvs / create And I submit Then the url should be /datacenter/kv Then a PUT request was made to "/v1/kv/key-value/?dc=datacenter&ns=@namespace" - And "[data-notification]" has the "notification-update" class - And "[data-notification]" has the "success" class + And "[data-notification]" has the "hds-toast" class + And "[data-notification]" has the "hds-alert--color-success" class Scenario: Clicking create from within a folder Given 1 datacenter model with the value "datacenter" And 1 kv model from yaml diff --git a/ui/packages/consul-ui/tests/acceptance/dc/kvs/delete.feature b/ui/packages/consul-ui/tests/acceptance/dc/kvs/delete.feature index 203daa90d09..01d3f99d266 100644 --- a/ui/packages/consul-ui/tests/acceptance/dc/kvs/delete.feature +++ b/ui/packages/consul-ui/tests/acceptance/dc/kvs/delete.feature @@ -15,8 +15,8 @@ Feature: dc / kvs / deleting: Deleting items with confirmations, success and err And I click delete on the kvs And I click confirmInlineDelete on the kvs Then a DELETE request was made to "/v1/kv/key-name?dc=datacenter&ns=@!namespace" - And "[data-notification]" has the "notification-delete" class - And "[data-notification]" has the "success" class + And "[data-notification]" has the "hds-toast" class + And "[data-notification]" has the "hds-alert--color-success" class Scenario: Deleting an kv from the kv detail page When I visit the kv page for yaml --- @@ -26,8 +26,8 @@ Feature: dc / kvs / deleting: Deleting items with confirmations, success and err And I click delete And I click confirmDelete Then a DELETE request was made to "/v1/kv/key-name?dc=datacenter&ns=@!namespace" - And "[data-notification]" has the "notification-delete" class - And "[data-notification]" has the "success" class + And "[data-notification]" has the "hds-toast" class + And "[data-notification]" has the "hds-alert--color-success" class Scenario: Deleting an kv from the kv detail page and getting an error When I visit the kv page for yaml --- @@ -37,6 +37,6 @@ Feature: dc / kvs / deleting: Deleting items with confirmations, success and err Given the url "/v1/kv/key-name?dc=datacenter&ns=@!namespace" responds with a 500 status And I click delete And I click confirmDelete - And "[data-notification]" has the "notification-update" class - And "[data-notification]" has the "error" class + And "[data-notification]" has the "hds-toast" class + And "[data-notification]" has the "hds-alert--color-critical" class diff --git a/ui/packages/consul-ui/tests/acceptance/dc/kvs/sessions/invalidate.feature b/ui/packages/consul-ui/tests/acceptance/dc/kvs/sessions/invalidate.feature index 6959dba8b74..66d46a3a102 100644 --- a/ui/packages/consul-ui/tests/acceptance/dc/kvs/sessions/invalidate.feature +++ b/ui/packages/consul-ui/tests/acceptance/dc/kvs/sessions/invalidate.feature @@ -21,12 +21,12 @@ Feature: dc / kvs / sessions / invalidate: Invalidate Lock Sessions And I click confirmDelete on the session Then a PUT request was made to "/v1/session/destroy/ee52203d-989f-4f7a-ab5a-2bef004164ca?dc=datacenter&ns=@!namespace" Then the url should be /datacenter/kv/key/edit - And "[data-notification]" has the "notification-delete" class - And "[data-notification]" has the "success" class + And "[data-notification]" has the "hds-toast" class + And "[data-notification]" has the "hds-alert--color-success" class Scenario: Invalidating a lock session and receiving an error Given the url "/v1/session/destroy/ee52203d-989f-4f7a-ab5a-2bef004164ca?dc=datacenter&ns=@namespace" responds with a 500 status And I click delete on the session And I click confirmDelete on the session Then the url should be /datacenter/kv/key/edit - And "[data-notification]" has the "notification-delete" class - And "[data-notification]" has the "error" class + And "[data-notification]" has the "hds-toast" class + And "[data-notification]" has the "hds-alert--color-critical" class diff --git a/ui/packages/consul-ui/tests/acceptance/dc/kvs/update.feature b/ui/packages/consul-ui/tests/acceptance/dc/kvs/update.feature index ce9773914bb..4ee40a60b9e 100644 --- a/ui/packages/consul-ui/tests/acceptance/dc/kvs/update.feature +++ b/ui/packages/consul-ui/tests/acceptance/dc/kvs/update.feature @@ -23,8 +23,8 @@ Feature: dc / kvs / update: KV Update --- And I submit Then a PUT request was made to "/v1/kv/[EncodedName]?dc=datacenter&ns=@!namespace&flags=12" with the body "[Value]" - And "[data-notification]" has the "notification-update" class - And "[data-notification]" has the "success" class + And "[data-notification]" has the "hds-toast" class + And "[data-notification]" has the "hds-alert--color-success" class Where: --------------------------------------------------------- | Name | EncodedName | Value | @@ -56,8 +56,8 @@ Feature: dc / kvs / update: KV Update Then a PUT request was made to "/v1/kv/key?dc=datacenter&ns=@!namespace&flags=12" with the body " " Then the url should be /datacenter/kv And the title should be "Key / Value - Consul" - And "[data-notification]" has the "notification-update" class - And "[data-notification]" has the "success" class + And "[data-notification]" has the "hds-toast" class + And "[data-notification]" has the "hds-alert--color-success" class Scenario: Update to a key change value to '' And 1 kv model from yaml --- @@ -79,8 +79,8 @@ Feature: dc / kvs / update: KV Update And I submit Then a PUT request was made to "/v1/kv/key?dc=datacenter&ns=@!namespace&flags=12" with no body Then the url should be /datacenter/kv - And "[data-notification]" has the "notification-update" class - And "[data-notification]" has the "success" class + And "[data-notification]" has the "hds-toast" class + And "[data-notification]" has the "hds-alert--color-success" class Scenario: Update to a key when the value is empty And 1 kv model from yaml --- @@ -97,8 +97,8 @@ Feature: dc / kvs / update: KV Update And I submit Then a PUT request was made to "/v1/kv/key?dc=datacenter&ns=@!namespace&flags=12" with no body Then the url should be /datacenter/kv - And "[data-notification]" has the "notification-update" class - And "[data-notification]" has the "success" class + And "[data-notification]" has the "hds-toast" class + And "[data-notification]" has the "hds-alert--color-success" class Scenario: There was an error saving the key When I visit the kv page for yaml --- @@ -110,8 +110,8 @@ Feature: dc / kvs / update: KV Update Given the url "/v1/kv/key" responds with a 500 status And I submit Then the url should be /datacenter/kv/key/edit - Then "[data-notification]" has the "notification-update" class - And "[data-notification]" has the "error" class + And "[data-notification]" has the "hds-toast" class + And "[data-notification]" has the "hds-alert--color-critical" class @ignore Scenario: KV's with spaces are saved correctly Then ok diff --git a/ui/packages/consul-ui/tests/acceptance/dc/nodes/sessions/invalidate.feature b/ui/packages/consul-ui/tests/acceptance/dc/nodes/sessions/invalidate.feature index 43dfcb7ae57..b6df7fc1683 100644 --- a/ui/packages/consul-ui/tests/acceptance/dc/nodes/sessions/invalidate.feature +++ b/ui/packages/consul-ui/tests/acceptance/dc/nodes/sessions/invalidate.feature @@ -27,12 +27,12 @@ Feature: dc / nodes / sessions / invalidate: Invalidate Lock Sessions And I click confirmDelete on the sessions Then a PUT request was made to "/v1/session/destroy/7bbbd8bb-fff3-4292-b6e3-cfedd788546a?dc=dc1&ns=@!namespace" Then the url should be /dc1/nodes/node-0/lock-sessions - And "[data-notification]" has the "notification-delete" class - And "[data-notification]" has the "success" class + And "[data-notification]" has the "hds-toast" class + And "[data-notification]" has the "hds-alert--color-success" class Scenario: Invalidating a lock session and receiving an error Given the url "/v1/session/destroy/7bbbd8bb-fff3-4292-b6e3-cfedd788546a?dc=dc1&ns=@namespace" responds with a 500 status And I click delete on the sessions And I click confirmDelete on the sessions Then the url should be /dc1/nodes/node-0/lock-sessions - And "[data-notification]" has the "notification-delete" class - And "[data-notification]" has the "error" class + And "[data-notification]" has the "hds-toast" class + And "[data-notification]" has the "hds-alert--color-critical" class diff --git a/ui/packages/consul-ui/tests/acceptance/dc/nspaces/delete.feature b/ui/packages/consul-ui/tests/acceptance/dc/nspaces/delete.feature index 36bce2f653c..e536b66fc42 100644 --- a/ui/packages/consul-ui/tests/acceptance/dc/nspaces/delete.feature +++ b/ui/packages/consul-ui/tests/acceptance/dc/nspaces/delete.feature @@ -19,8 +19,8 @@ Feature: dc / nspaces / delete: Deleting items with confirmations, success and e And I click delete on the [Listing] And I click confirmDelete on the [Listing] Then a [Method] request was made to "[URL]" - And "[data-notification]" has the "notification-delete" class - And "[data-notification]" has the "success" class + And "[data-notification]" has the "hds-toast" class + And "[data-notification]" has the "hds-alert--color-success" class Where: -------------------------------------------------------------------------------------------------------- | Edit | Listing | Method | URL | Data | @@ -35,8 +35,8 @@ Feature: dc / nspaces / delete: Deleting items with confirmations, success and e And I click delete And I click confirmDelete Then a DELETE request was made to "/v1/namespace/a-namespace?dc=datacenter" - And "[data-notification]" has the "notification-delete" class - And "[data-notification]" has the "success" class + And "[data-notification]" has the "hds-toast" class + And "[data-notification]" has the "hds-alert--color-success" class Scenario: Deleting a [Model] from the [Model] detail page with error When I visit the [Model] page for yaml --- @@ -46,8 +46,8 @@ Feature: dc / nspaces / delete: Deleting items with confirmations, success and e Given the url "[URL]" responds with a 500 status And I click delete And I click confirmDelete - And "[data-notification]" has the "notification-update" class - And "[data-notification]" has the "error" class + And "[data-notification]" has the "hds-toast" class + And "[data-notification]" has the "hds-alert--color-critical" class Where: ------------------------------------------------------------------------------------------- | Model | Method | URL | Slug | diff --git a/ui/packages/consul-ui/tests/acceptance/dc/nspaces/update.feature b/ui/packages/consul-ui/tests/acceptance/dc/nspaces/update.feature index 0b4a5bdc6aa..7feb09ca76b 100644 --- a/ui/packages/consul-ui/tests/acceptance/dc/nspaces/update.feature +++ b/ui/packages/consul-ui/tests/acceptance/dc/nspaces/update.feature @@ -28,8 +28,8 @@ Feature: dc / nspaces / update: Nspace Update Description: [Description] --- Then the url should be /datacenter/namespaces - And "[data-notification]" has the "notification-update" class - And "[data-notification]" has the "success" class + And "[data-notification]" has the "hds-toast" class + And "[data-notification]" has the "hds-alert--color-success" class Where: --------------------------- | Description | @@ -40,5 +40,5 @@ Feature: dc / nspaces / update: Nspace Update Given the url "/v1/namespace/namespace?dc=datacenter" responds with a 500 status And I submit Then the url should be /datacenter/namespaces/namespace - Then "[data-notification]" has the "notification-update" class - And "[data-notification]" has the "error" class + And "[data-notification]" has the "hds-toast" class + And "[data-notification]" has the "hds-alert--color-critical" class diff --git a/ui/packages/consul-ui/tests/acceptance/dc/peers/delete.feature b/ui/packages/consul-ui/tests/acceptance/dc/peers/delete.feature index 7cd6b4b3122..7106105cbaf 100644 --- a/ui/packages/consul-ui/tests/acceptance/dc/peers/delete.feature +++ b/ui/packages/consul-ui/tests/acceptance/dc/peers/delete.feature @@ -16,8 +16,8 @@ Feature: dc / peers / delete: Deleting items with confirmations, success and err And I click delete on the peers And I click confirmDelete on the peers Then a DELETE request was made to "/v1/peering/peer-name" - And "[data-notification]" has the "notification-delete" class - And "[data-notification]" has the "success" class + And "[data-notification]" has the "hds-toast" class + And "[data-notification]" has the "hds-alert--color-success" class Scenario: Deleting a peer from the peer listing page with error Given 1 peer model from yaml --- @@ -32,8 +32,8 @@ Feature: dc / peers / delete: Deleting items with confirmations, success and err And I click actions on the peers And I click delete on the peers And I click confirmDelete on the peers - And "[data-notification]" has the "notification-update" class - And "[data-notification]" has the "error" class + And "[data-notification]" has the "hds-toast" class + And "[data-notification]" has the "hds-alert--color-critical" class Scenario: A Peer currently deleting cannot be deleted Given 1 peer model from yaml --- diff --git a/ui/packages/consul-ui/tests/acceptance/dc/peers/establish.feature b/ui/packages/consul-ui/tests/acceptance/dc/peers/establish.feature index c773155aca8..6388f824a8a 100644 --- a/ui/packages/consul-ui/tests/acceptance/dc/peers/establish.feature +++ b/ui/packages/consul-ui/tests/acceptance/dc/peers/establish.feature @@ -26,6 +26,6 @@ Feature: dc / peers / establish: Peer Establish Peering PeerName: new-peer PeeringToken: an-encoded-token --- - And "[data-notification]" has the "notification-update" class - And "[data-notification]" has the "success" class + And "[data-notification]" has the "hds-toast" class + And "[data-notification]" has the "hds-alert--color-success" class And the url should be /dc-1/peers/new-peer/imported-services diff --git a/ui/packages/consul-ui/tests/acceptance/dc/services/show.feature b/ui/packages/consul-ui/tests/acceptance/dc/services/show.feature index 496b1774286..647217eece4 100644 --- a/ui/packages/consul-ui/tests/acceptance/dc/services/show.feature +++ b/ui/packages/consul-ui/tests/acceptance/dc/services/show.feature @@ -299,6 +299,7 @@ Feature: dc / services / show: Show Service # authorization requests are not blocking so we just wait until the next # service blocking query responds Then pause until I see the text "no longer have access" in "[data-notification]" - And "[data-notification]" has the "error" class + And "[data-notification]" has the "hds-toast" class + And "[data-notification]" has the "hds-alert--color-critical" class And I see status on the error like "403" diff --git a/ui/packages/consul-ui/tests/acceptance/dc/services/show/intentions/create.feature b/ui/packages/consul-ui/tests/acceptance/dc/services/show/intentions/create.feature index e95b03d62f6..0f518420e01 100644 --- a/ui/packages/consul-ui/tests/acceptance/dc/services/show/intentions/create.feature +++ b/ui/packages/consul-ui/tests/acceptance/dc/services/show/intentions/create.feature @@ -62,8 +62,8 @@ Feature: dc / services / intentions / create: Intention Create per Service Action: deny --- Then the url should be /datacenter/services/db/intentions - And "[data-notification]" has the "notification-update" class - And "[data-notification]" has the "success" class + And "[data-notification]" has the "hds-toast" class + And "[data-notification]" has the "hds-alert--color-success" class @notNamespaceable Scenario: with namespaces disabled Given 1 datacenter model with the value "datacenter" @@ -104,5 +104,5 @@ Feature: dc / services / intentions / create: Intention Create per Service Action: deny --- Then the url should be /datacenter/services/db/intentions - And "[data-notification]" has the "notification-update" class - And "[data-notification]" has the "success" class + And "[data-notification]" has the "hds-toast" class + And "[data-notification]" has the "hds-alert--color-success" class diff --git a/ui/packages/consul-ui/tests/acceptance/dc/services/show/intentions/index.feature b/ui/packages/consul-ui/tests/acceptance/dc/services/show/intentions/index.feature index 25a58b1a7bf..b94c4ab3ba9 100644 --- a/ui/packages/consul-ui/tests/acceptance/dc/services/show/intentions/index.feature +++ b/ui/packages/consul-ui/tests/acceptance/dc/services/show/intentions/index.feature @@ -50,5 +50,5 @@ Feature: dc / services / show / intentions / index: Intentions per service And I click delete on the intentionList.intentions component And I click confirmInlineDelete on the intentionList.intentions Then a DELETE request was made to "/v1/connect/intentions/exact?source=default%2Fdefault%2Fname&destination=default%2Fdefault%2Fdestination&dc=dc1" - And "[data-notification]" has the "notification-delete" class - And "[data-notification]" has the "success" class + And "[data-notification]" has the "hds-toast" class + And "[data-notification]" has the "hds-alert--color-success" class diff --git a/ui/packages/consul-ui/tests/acceptance/dc/services/show/topology/intentions.feature b/ui/packages/consul-ui/tests/acceptance/dc/services/show/topology/intentions.feature index a93e27c6aab..35e823711d6 100644 --- a/ui/packages/consul-ui/tests/acceptance/dc/services/show/topology/intentions.feature +++ b/ui/packages/consul-ui/tests/acceptance/dc/services/show/topology/intentions.feature @@ -36,7 +36,8 @@ Feature: dc / services / show / topology / intentions --- When I click ".consul-topology-metrics [data-test-action]" And I click ".consul-topology-metrics [data-test-confirm]" - And "[data-notification]" has the "success" class + And "[data-notification]" has the "hds-toast" class + And "[data-notification]" has the "hds-alert--color-success" class Scenario: There was an error saving the intention Given the url "/v1/connect/intentions/exact?source=default%2Fweb&destination=default%2Fdb&dc=datacenter" responds with a 500 status When I visit the service page for yaml @@ -46,4 +47,5 @@ Feature: dc / services / show / topology / intentions --- When I click ".consul-topology-metrics [data-test-action]" And I click ".consul-topology-metrics [data-test-confirm]" - And "[data-notification]" has the "error" class \ No newline at end of file + And "[data-notification]" has the "hds-toast" class + And "[data-notification]" has the "hds-alert--color-critical" class \ No newline at end of file diff --git a/ui/packages/consul-ui/tests/acceptance/deleting.feature b/ui/packages/consul-ui/tests/acceptance/deleting.feature index f3e58219ed8..2aa21edb348 100644 --- a/ui/packages/consul-ui/tests/acceptance/deleting.feature +++ b/ui/packages/consul-ui/tests/acceptance/deleting.feature @@ -18,8 +18,8 @@ Feature: deleting: Deleting items with confirmations, success and error notifica And I click delete on the [Listing] And I click confirmDelete on the [Listing] Then a [Method] request was made to "[URL]" - And "[data-notification]" has the "notification-delete" class - And "[data-notification]" has the "success" class + And "[data-notification]" has the "hds-toast" class + And "[data-notification]" has the "hds-alert--color-success" class Where: -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | Edit | Listing | Method | URL | Data | @@ -34,8 +34,8 @@ Feature: deleting: Deleting items with confirmations, success and error notifica And I click delete And I click confirmDelete Then a [Method] request was made to "[URL]" - And "[data-notification]" has the "notification-delete" class - And "[data-notification]" has the "success" class + And "[data-notification]" has the "hds-toast" class + And "[data-notification]" has the "hds-alert--color-success" class Where: ----------------------------------------------------------------------------------------------------------------------------------------------------------- | Model | Method | URL | Slug | @@ -50,8 +50,8 @@ Feature: deleting: Deleting items with confirmations, success and error notifica Given the url "[URL]" responds with a 500 status And I click delete And I click confirmDelete - And "[data-notification]" has the "notification-delete" class - And "[data-notification]" has the "error" class + And "[data-notification]" has the "hds-toast" class + And "[data-notification]" has the "hds-alert--color-critical" class Where: ----------------------------------------------------------------------------------------------------------------------------------------------------------- | Model | Method | URL | Slug | diff --git a/ui/packages/consul-ui/tests/acceptance/login.feature b/ui/packages/consul-ui/tests/acceptance/login.feature index 9af0bbfeeed..8e59f5892cc 100644 --- a/ui/packages/consul-ui/tests/acceptance/login.feature +++ b/ui/packages/consul-ui/tests/acceptance/login.feature @@ -48,5 +48,5 @@ Feature: login And I click ".okta-oidc-provider" Then a POST request was made to "/v1/acl/oidc/auth-url?dc=dc-1&ns=@!namespace&partition=partition" And a POST request was made to "/v1/acl/oidc/callback?dc=dc-1&ns=@!namespace&partition=partition" - And "[data-notification]" has the "notification-authorize" class - And "[data-notification]" has the "success" class + And "[data-notification]" has the "hds-toast" class + And "[data-notification]" has the "hds-alert--color-success" class diff --git a/ui/packages/consul-ui/tests/acceptance/settings/update.feature b/ui/packages/consul-ui/tests/acceptance/settings/update.feature index 680c69577f3..9409d5ad98c 100644 --- a/ui/packages/consul-ui/tests/acceptance/settings/update.feature +++ b/ui/packages/consul-ui/tests/acceptance/settings/update.feature @@ -18,6 +18,6 @@ Feature: settings / update: Update Settings consul:token: '' --- And the url should be /settings - And "[data-notification]" has the "notification-update" class - And "[data-notification]" has the "success" class + And "[data-notification]" has the "hds-toast" class + And "[data-notification]" has the "hds-alert--color-success" class From f135b14bdd46c7e2311c5f451aa1148aa11a3d68 Mon Sep 17 00:00:00 2001 From: Ronald Date: Tue, 7 Mar 2023 00:14:06 +0100 Subject: [PATCH 122/262] Fix flakey tests related to ACL token updates (#16545) * Fix flakey tests related to ACL token updates * update all acl token update tests * extra create_token function to its own thing --- command/acl/token/update/token_update_test.go | 179 ++++++++++-------- 1 file changed, 102 insertions(+), 77 deletions(-) diff --git a/command/acl/token/update/token_update_test.go b/command/acl/token/update/token_update_test.go index 81570284104..011e916f4fb 100644 --- a/command/acl/token/update/token_update_test.go +++ b/command/acl/token/update/token_update_test.go @@ -22,6 +22,13 @@ func TestTokenUpdateCommand_noTabs(t *testing.T) { } } +func create_token(t *testing.T, client *api.Client, aclToken *api.ACLToken, writeOptions *api.WriteOptions) *api.ACLToken { + token, _, err := client.ACL().TokenCreate(aclToken, writeOptions) + require.NoError(t, err) + + return token +} + func TestTokenUpdateCommand(t *testing.T) { if testing.Short() { t.Skip("too slow for testing.Short") @@ -50,13 +57,6 @@ func TestTokenUpdateCommand(t *testing.T) { ) require.NoError(t, err) - // create a token - token, _, err := client.ACL().TokenCreate( - &api.ACLToken{Description: "test"}, - &api.WriteOptions{Token: "root"}, - ) - require.NoError(t, err) - run := func(t *testing.T, args []string) *api.ACLToken { ui := cli.NewMockUi() cmd := New(ui) @@ -72,7 +72,9 @@ func TestTokenUpdateCommand(t *testing.T) { // update with node identity t.Run("node-identity", func(t *testing.T) { - token := run(t, []string{ + token := create_token(t, client, &api.ACLToken{Description: "test"}, &api.WriteOptions{Token: "root"}) + + responseToken := run(t, []string{ "-http-addr=" + a.HTTPAddr(), "-accessor-id=" + token.AccessorID, "-token=root", @@ -80,13 +82,19 @@ func TestTokenUpdateCommand(t *testing.T) { "-description=test token", }) - require.Len(t, token.NodeIdentities, 1) - require.Equal(t, "foo", token.NodeIdentities[0].NodeName) - require.Equal(t, "bar", token.NodeIdentities[0].Datacenter) + require.Len(t, responseToken.NodeIdentities, 1) + require.Equal(t, "foo", responseToken.NodeIdentities[0].NodeName) + require.Equal(t, "bar", responseToken.NodeIdentities[0].Datacenter) }) t.Run("node-identity-merge", func(t *testing.T) { - token := run(t, []string{ + token := create_token(t, + client, + &api.ACLToken{Description: "test", NodeIdentities: []*api.ACLNodeIdentity{{NodeName: "foo", Datacenter: "bar"}}}, + &api.WriteOptions{Token: "root"}, + ) + + responseToken := run(t, []string{ "-http-addr=" + a.HTTPAddr(), "-accessor-id=" + token.AccessorID, "-token=root", @@ -95,7 +103,7 @@ func TestTokenUpdateCommand(t *testing.T) { "-merge-node-identities", }) - require.Len(t, token.NodeIdentities, 2) + require.Len(t, responseToken.NodeIdentities, 2) expected := []*api.ACLNodeIdentity{ { NodeName: "foo", @@ -106,28 +114,14 @@ func TestTokenUpdateCommand(t *testing.T) { Datacenter: "baz", }, } - require.ElementsMatch(t, expected, token.NodeIdentities) - }) - - // update with append-node-identity - t.Run("append-node-identity", func(t *testing.T) { - - token := run(t, []string{ - "-http-addr=" + a.HTTPAddr(), - "-accessor-id=" + token.AccessorID, - "-token=root", - "-append-node-identity=third:node", - "-description=test token", - }) - - require.Len(t, token.NodeIdentities, 3) - require.Equal(t, "third", token.NodeIdentities[2].NodeName) - require.Equal(t, "node", token.NodeIdentities[2].Datacenter) + require.ElementsMatch(t, expected, responseToken.NodeIdentities) }) // update with policy by name t.Run("policy-name", func(t *testing.T) { - token := run(t, []string{ + token := create_token(t, client, &api.ACLToken{Description: "test"}, &api.WriteOptions{Token: "root"}) + + responseToken := run(t, []string{ "-http-addr=" + a.HTTPAddr(), "-accessor-id=" + token.AccessorID, "-token=root", @@ -135,12 +129,14 @@ func TestTokenUpdateCommand(t *testing.T) { "-description=test token", }) - require.Len(t, token.Policies, 1) + require.Len(t, responseToken.Policies, 1) }) // update with policy by id t.Run("policy-id", func(t *testing.T) { - token := run(t, []string{ + token := create_token(t, client, &api.ACLToken{Description: "test"}, &api.WriteOptions{Token: "root"}) + + responseToken := run(t, []string{ "-http-addr=" + a.HTTPAddr(), "-accessor-id=" + token.AccessorID, "-token=root", @@ -148,12 +144,14 @@ func TestTokenUpdateCommand(t *testing.T) { "-description=test token", }) - require.Len(t, token.Policies, 1) + require.Len(t, responseToken.Policies, 1) }) // update with service-identity t.Run("service-identity", func(t *testing.T) { - token := run(t, []string{ + token := create_token(t, client, &api.ACLToken{Description: "test"}, &api.WriteOptions{Token: "root"}) + + responseToken := run(t, []string{ "-http-addr=" + a.HTTPAddr(), "-accessor-id=" + token.AccessorID, "-token=root", @@ -161,33 +159,22 @@ func TestTokenUpdateCommand(t *testing.T) { "-description=test token", }) - require.Len(t, token.ServiceIdentities, 1) - require.Equal(t, "service", token.ServiceIdentities[0].ServiceName) - }) - - // update with append-service-identity - t.Run("append-service-identity", func(t *testing.T) { - token := run(t, []string{ - "-http-addr=" + a.HTTPAddr(), - "-accessor-id=" + token.AccessorID, - "-token=root", - "-append-service-identity=web", - "-description=test token", - }) - require.Len(t, token.ServiceIdentities, 2) - require.Equal(t, "web", token.ServiceIdentities[1].ServiceName) + require.Len(t, responseToken.ServiceIdentities, 1) + require.Equal(t, "service", responseToken.ServiceIdentities[0].ServiceName) }) // update with no description shouldn't delete the current description t.Run("merge-description", func(t *testing.T) { - token := run(t, []string{ + token := create_token(t, client, &api.ACLToken{Description: "test token"}, &api.WriteOptions{Token: "root"}) + + responseToken := run(t, []string{ "-http-addr=" + a.HTTPAddr(), "-accessor-id=" + token.AccessorID, "-token=root", "-policy-name=" + policy.Name, }) - require.Equal(t, "test token", token.Description) + require.Equal(t, "test token", responseToken.Description) }) } @@ -219,13 +206,6 @@ func TestTokenUpdateCommandWithAppend(t *testing.T) { ) require.NoError(t, err) - // create a token - token, _, err := client.ACL().TokenCreate( - &api.ACLToken{Description: "test", Policies: []*api.ACLTokenPolicyLink{{Name: policy.Name}}}, - &api.WriteOptions{Token: "root"}, - ) - require.NoError(t, err) - //secondary policy secondPolicy, _, policyErr := client.ACL().PolicyCreate( &api.ACLPolicy{Name: "secondary-policy"}, @@ -233,13 +213,6 @@ func TestTokenUpdateCommandWithAppend(t *testing.T) { ) require.NoError(t, policyErr) - //third policy - thirdPolicy, _, policyErr := client.ACL().PolicyCreate( - &api.ACLPolicy{Name: "third-policy"}, - &api.WriteOptions{Token: "root"}, - ) - require.NoError(t, policyErr) - run := func(t *testing.T, args []string) *api.ACLToken { ui := cli.NewMockUi() cmd := New(ui) @@ -255,7 +228,12 @@ func TestTokenUpdateCommandWithAppend(t *testing.T) { // update with append-policy-name t.Run("append-policy-name", func(t *testing.T) { - token := run(t, []string{ + token := create_token(t, client, + &api.ACLToken{Description: "test", Policies: []*api.ACLTokenPolicyLink{{Name: policy.Name}}}, + &api.WriteOptions{Token: "root"}, + ) + + responseToken := run(t, []string{ "-http-addr=" + a.HTTPAddr(), "-accessor-id=" + token.AccessorID, "-token=root", @@ -263,20 +241,72 @@ func TestTokenUpdateCommandWithAppend(t *testing.T) { "-description=test token", }) - require.Len(t, token.Policies, 2) + require.Len(t, responseToken.Policies, 2) }) // update with append-policy-id t.Run("append-policy-id", func(t *testing.T) { - token := run(t, []string{ + token := create_token(t, client, + &api.ACLToken{Description: "test", Policies: []*api.ACLTokenPolicyLink{{Name: policy.Name}}}, + &api.WriteOptions{Token: "root"}, + ) + + responseToken := run(t, []string{ "-http-addr=" + a.HTTPAddr(), "-accessor-id=" + token.AccessorID, "-token=root", - "-append-policy-id=" + thirdPolicy.ID, + "-append-policy-id=" + secondPolicy.ID, "-description=test token", }) - require.Len(t, token.Policies, 3) + require.Len(t, responseToken.Policies, 2) + }) + + // update with append-node-identity + t.Run("append-node-identity", func(t *testing.T) { + token := create_token(t, client, + &api.ACLToken{ + Description: "test", + Policies: []*api.ACLTokenPolicyLink{{Name: policy.Name}}, + NodeIdentities: []*api.ACLNodeIdentity{{NodeName: "namenode", Datacenter: "somewhere"}}, + }, + &api.WriteOptions{Token: "root"}, + ) + + responseToken := run(t, []string{ + "-http-addr=" + a.HTTPAddr(), + "-accessor-id=" + token.AccessorID, + "-token=root", + "-append-node-identity=third:node", + "-description=test token", + }) + + require.Len(t, responseToken.NodeIdentities, 2) + require.Equal(t, "third", responseToken.NodeIdentities[1].NodeName) + require.Equal(t, "node", responseToken.NodeIdentities[1].Datacenter) + }) + + // update with append-service-identity + t.Run("append-service-identity", func(t *testing.T) { + token := create_token(t, client, + &api.ACLToken{ + Description: "test", + Policies: []*api.ACLTokenPolicyLink{{Name: policy.Name}}, + ServiceIdentities: []*api.ACLServiceIdentity{{ServiceName: "service"}}, + }, + &api.WriteOptions{Token: "root"}, + ) + + responseToken := run(t, []string{ + "-http-addr=" + a.HTTPAddr(), + "-accessor-id=" + token.AccessorID, + "-token=root", + "-append-service-identity=web", + "-description=test token", + }) + + require.Len(t, responseToken.ServiceIdentities, 2) + require.Equal(t, "web", responseToken.ServiceIdentities[1].ServiceName) }) } @@ -310,12 +340,7 @@ func TestTokenUpdateCommand_JSON(t *testing.T) { ) require.NoError(t, err) - // create a token - token, _, err := client.ACL().TokenCreate( - &api.ACLToken{Description: "test"}, - &api.WriteOptions{Token: "root"}, - ) - require.NoError(t, err) + token := create_token(t, client, &api.ACLToken{Description: "test"}, &api.WriteOptions{Token: "root"}) t.Run("update with policy by name", func(t *testing.T) { cmd := New(ui) From f5641ffcccc96e219572953dd950256776921a4e Mon Sep 17 00:00:00 2001 From: John Eikenberry Date: Tue, 7 Mar 2023 03:02:05 +0000 Subject: [PATCH 123/262] support vault auth config for alicloud ca provider Add support for using existing vault auto-auth configurations as the provider configuration when using Vault's CA provider with AliCloud. AliCloud requires 2 extra fields to enable it to use STS (it's preferred auth setup). Our vault-plugin-auth-alicloud package contained a method to help generate them as they require you to make an http call to a faked endpoint proxy to get them (url and headers base64 encoded). --- .changelog/16224.txt | 3 + agent/connect/ca/provider_vault.go | 5 +- .../ca/provider_vault_auth_alicloud.go | 52 +++++++++ agent/connect/ca/provider_vault_auth_test.go | 101 ++++++++++++++++++ agent/connect/ca/provider_vault_test.go | 2 +- go.mod | 13 ++- go.sum | 27 +++-- 7 files changed, 188 insertions(+), 15 deletions(-) create mode 100644 .changelog/16224.txt create mode 100644 agent/connect/ca/provider_vault_auth_alicloud.go diff --git a/.changelog/16224.txt b/.changelog/16224.txt new file mode 100644 index 00000000000..76f73d05953 --- /dev/null +++ b/.changelog/16224.txt @@ -0,0 +1,3 @@ +```release-note:improvement +ca: support Vault agent auto-auth config for Vault CA provider using AliCloud authentication. +``` diff --git a/agent/connect/ca/provider_vault.go b/agent/connect/ca/provider_vault.go index d14fd0a4d2d..6103c1c7fa9 100644 --- a/agent/connect/ca/provider_vault.go +++ b/agent/connect/ca/provider_vault.go @@ -946,6 +946,8 @@ func configureVaultAuthMethod(authMethod *structs.VaultAuthMethod) (VaultAuthent return NewJwtAuthClient(authMethod) case VaultAuthMethodTypeAppRole: return NewAppRoleAuthClient(authMethod) + case VaultAuthMethodTypeAliCloud: + return NewAliCloudAuthClient(authMethod) case VaultAuthMethodTypeKubernetes: return NewK8sAuthClient(authMethod) // These auth methods require a username for the login API path. @@ -969,8 +971,7 @@ func configureVaultAuthMethod(authMethod *structs.VaultAuthMethod) (VaultAuthent return nil, fmt.Errorf("'token' auth method is not supported via auth method configuration; " + "please provide the token with the 'token' parameter in the CA configuration") // The rest of the auth methods use auth/ login API path. - case VaultAuthMethodTypeAliCloud, - VaultAuthMethodTypeCloudFoundry, + case VaultAuthMethodTypeCloudFoundry, VaultAuthMethodTypeGitHub, VaultAuthMethodTypeKerberos, VaultAuthMethodTypeTLS: diff --git a/agent/connect/ca/provider_vault_auth_alicloud.go b/agent/connect/ca/provider_vault_auth_alicloud.go new file mode 100644 index 00000000000..88027903a7c --- /dev/null +++ b/agent/connect/ca/provider_vault_auth_alicloud.go @@ -0,0 +1,52 @@ +package ca + +import ( + "fmt" + + "github.com/aliyun/alibaba-cloud-sdk-go/sdk/auth/credentials/providers" + "github.com/hashicorp/consul/agent/structs" + "github.com/hashicorp/vault-plugin-auth-alicloud/tools" +) + +func NewAliCloudAuthClient(authMethod *structs.VaultAuthMethod) (*VaultAuthClient, error) { + params := authMethod.Params + authClient := NewVaultAPIAuthClient(authMethod, "") + // check for login data already in params (for backwards compability) + legacyKeys := []string{"access_key", "secret_key", "access_token"} + if legacyCheck(params, legacyKeys...) { + return authClient, nil + } + + if r, ok := params["role"].(string); !ok || r == "" { + return nil, fmt.Errorf("role is required for AliCloud login") + } + if r, ok := params["region"].(string); !ok || r == "" { + return nil, fmt.Errorf("region is required for AliCloud login") + } + client := NewVaultAPIAuthClient(authMethod, "") + client.LoginDataGen = AliLoginDataGen + return client, nil +} + +func AliLoginDataGen(authMethod *structs.VaultAuthMethod) (map[string]any, error) { + // validity of these params is checked above in New.. + role := authMethod.Params["role"].(string) + region := authMethod.Params["region"].(string) + // Credentials can be provided either explicitly via env vars, + // or we will try to derive them from instance metadata. + credentialChain := []providers.Provider{ + providers.NewEnvCredentialProvider(), + providers.NewInstanceMetadataProvider(), + } + creds, err := providers.NewChainProvider(credentialChain).Retrieve() + if err != nil { + return nil, err + } + + loginData, err := tools.GenerateLoginData(role, creds, region) + if err != nil { + return nil, err + } + + return loginData, nil +} diff --git a/agent/connect/ca/provider_vault_auth_test.go b/agent/connect/ca/provider_vault_auth_test.go index 45377b03ac2..3598c930bc3 100644 --- a/agent/connect/ca/provider_vault_auth_test.go +++ b/agent/connect/ca/provider_vault_auth_test.go @@ -1,10 +1,12 @@ package ca import ( + "encoding/base64" "encoding/json" "fmt" "net/http" "net/http/httptest" + "net/url" "os" "strconv" "testing" @@ -662,3 +664,102 @@ func TestVaultCAProvider_AppRoleAuthClient(t *testing.T) { }) } } + +func TestVaultCAProvider_AliCloudAuthClient(t *testing.T) { + // required as login parameters, will hang if not set + os.Setenv("ALICLOUD_ACCESS_KEY", "test-access-key") + os.Setenv("ALICLOUD_SECRET_KEY", "test-secret-key") + os.Setenv("ALICLOUD_ACCESS_KEY_STS_TOKEN", "test-access-token") + defer func() { + os.Unsetenv("ALICLOUD_ACCESS_KEY") + os.Unsetenv("ALICLOUD_SECRET_KEY") + os.Unsetenv("ALICLOUD_ACCESS_KEY_STS_TOKEN") + }() + cases := map[string]struct { + authMethod *structs.VaultAuthMethod + expQry map[string][]string + expErr error + }{ + "base-case": { + authMethod: &structs.VaultAuthMethod{ + Type: VaultAuthMethodTypeAliCloud, + Params: map[string]interface{}{ + "role": "test-role", + "region": "test-region", + }, + }, + expQry: map[string][]string{ + "Action": {"GetCallerIdentity"}, + "AccessKeyId": {"test-access-key"}, + "RegionId": {"test-region"}, + }, + }, + "no-role": { + authMethod: &structs.VaultAuthMethod{ + Type: VaultAuthMethodTypeAliCloud, + Params: map[string]interface{}{ + "region": "test-region", + }, + }, + expErr: fmt.Errorf("role is required for AliCloud login"), + }, + "no-region": { + authMethod: &structs.VaultAuthMethod{ + Type: VaultAuthMethodTypeAliCloud, + Params: map[string]interface{}{ + "role": "test-role", + }, + }, + expErr: fmt.Errorf("region is required for AliCloud login"), + }, + "legacy-case": { + authMethod: &structs.VaultAuthMethod{ + Type: VaultAuthMethodTypeAliCloud, + Params: map[string]interface{}{ + "access_key": "test-key", + "access_token": "test-token", + "secret_key": "test-secret-key", + }, + }, + }, + } + + for name, c := range cases { + t.Run(name, func(t *testing.T) { + auth, err := NewAliCloudAuthClient(c.authMethod) + if c.expErr != nil { + require.Error(t, err) + require.EqualError(t, c.expErr, err.Error()) + return + } + require.NotNil(t, auth) + + if auth.LoginDataGen != nil { + encodedData, err := auth.LoginDataGen(c.authMethod) + require.NoError(t, err) + + // identity_request_headers (json encoded headers) + rawheaders, err := base64.StdEncoding.DecodeString( + encodedData["identity_request_headers"].(string)) + require.NoError(t, err) + headers := string(rawheaders) + require.Contains(t, headers, "User-Agent") + require.Contains(t, headers, "AlibabaCloud") + require.Contains(t, headers, "Content-Type") + require.Contains(t, headers, "x-acs-action") + require.Contains(t, headers, "GetCallerIdentity") + + // identity_request_url (w/ query params) + rawurl, err := base64.StdEncoding.DecodeString( + encodedData["identity_request_url"].(string)) + require.NoError(t, err) + requrl, err := url.Parse(string(rawurl)) + require.NoError(t, err) + + queries := requrl.Query() + require.Subset(t, queries, c.expQry, "query missing fields") + require.Equal(t, requrl.Hostname(), "sts.test-region.aliyuncs.com") + } + }) + } +} diff --git a/agent/connect/ca/provider_vault_test.go b/agent/connect/ca/provider_vault_test.go index 7242dda9944..d0c33b3bca0 100644 --- a/agent/connect/ca/provider_vault_test.go +++ b/agent/connect/ca/provider_vault_test.go @@ -104,7 +104,7 @@ func TestVaultCAProvider_configureVaultAuthMethod(t *testing.T) { expError string hasLDG bool }{ - "alicloud": {expLoginPath: "auth/alicloud/login"}, + "alicloud": {expLoginPath: "auth/alicloud/login", params: map[string]any{"role": "test-role", "region": "test-region"}, hasLDG: true}, "approle": {expLoginPath: "auth/approle/login", params: map[string]any{"role_id_file_path": "test-path"}, hasLDG: true}, "aws": {expLoginPath: "auth/aws/login", params: map[string]interface{}{"type": "iam"}, hasLDG: true}, "azure": {expLoginPath: "auth/azure/login", params: map[string]interface{}{"role": "test-role", "resource": "test-resource"}, hasLDG: true}, diff --git a/go.mod b/go.mod index 299e682647c..23387be4ada 100644 --- a/go.mod +++ b/go.mod @@ -17,6 +17,7 @@ exclude ( require ( github.com/NYTimes/gziphandler v1.0.1 + github.com/aliyun/alibaba-cloud-sdk-go v1.62.156 github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e github.com/armon/go-metrics v0.3.10 github.com/armon/go-radix v1.0.0 @@ -47,7 +48,7 @@ require ( github.com/hashicorp/go-cleanhttp v0.5.2 github.com/hashicorp/go-connlimit v0.3.0 github.com/hashicorp/go-discover v0.0.0-20220714221025-1c234a67149a - github.com/hashicorp/go-hclog v1.2.1 + github.com/hashicorp/go-hclog v1.4.0 github.com/hashicorp/go-immutable-radix v1.3.1 github.com/hashicorp/go-memdb v1.3.4 github.com/hashicorp/go-multierror v1.1.1 @@ -55,7 +56,7 @@ require ( github.com/hashicorp/go-secure-stdlib/awsutil v0.1.6 github.com/hashicorp/go-sockaddr v1.0.2 github.com/hashicorp/go-syslog v1.0.0 - github.com/hashicorp/go-uuid v1.0.2 + github.com/hashicorp/go-uuid v1.0.3 github.com/hashicorp/go-version v1.2.1 github.com/hashicorp/golang-lru v0.5.4 github.com/hashicorp/hcl v1.0.0 @@ -68,9 +69,10 @@ require ( github.com/hashicorp/raft-boltdb/v2 v2.2.2 github.com/hashicorp/raft-wal v0.2.4 github.com/hashicorp/serf v0.10.1 - github.com/hashicorp/vault/api v1.8.2 + github.com/hashicorp/vault-plugin-auth-alicloud v0.14.0 + github.com/hashicorp/vault/api v1.8.3 github.com/hashicorp/vault/api/auth/gcp v0.3.0 - github.com/hashicorp/vault/sdk v0.6.0 + github.com/hashicorp/vault/sdk v0.7.0 github.com/hashicorp/yamux v0.0.0-20211028200310-0bc27b27de87 github.com/imdario/mergo v0.3.13 github.com/kr/text v0.2.0 @@ -195,7 +197,7 @@ require ( github.com/nicolai86/scaleway-sdk v1.10.2-0.20180628010248-798f60e20bb2 // indirect github.com/oklog/run v1.0.0 // indirect github.com/oklog/ulid v1.3.1 // indirect - github.com/opentracing/opentracing-go v1.2.0 // indirect + github.com/opentracing/opentracing-go v1.2.1-0.20220228012449-10b1cf09e00b // indirect github.com/packethost/packngo v0.1.1-0.20180711074735-b9cb5096f54c // indirect github.com/pierrec/lz4 v2.5.2+incompatible // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect @@ -232,6 +234,7 @@ require ( google.golang.org/api v0.57.0 // indirect google.golang.org/appengine v1.6.7 // indirect gopkg.in/inf.v0 v0.9.1 // indirect + gopkg.in/ini.v1 v1.66.2 // indirect gopkg.in/resty.v1 v1.12.0 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect diff --git a/go.sum b/go.sum index 7234a8e0275..0ed6defcbb0 100644 --- a/go.sum +++ b/go.sum @@ -132,6 +132,8 @@ github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRF github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= github.com/aliyun/alibaba-cloud-sdk-go v0.0.0-20190808125512-07798873deee/go.mod h1:myCDvQSzCW+wB1WAlocEru4wMGJxy+vlxHdhegi1CDQ= +github.com/aliyun/alibaba-cloud-sdk-go v1.62.156 h1:K4N91T1+RlSlx+t2dujeDviy4ehSGVjEltluDgmeHS4= +github.com/aliyun/alibaba-cloud-sdk-go v1.62.156/go.mod h1:Api2AkmMgGaSUAhmk76oaFObkoeCPc/bKAqcyplPODs= github.com/aliyun/aliyun-oss-go-sdk v0.0.0-20190307165228-86c17b95fcd5/go.mod h1:T/Aws4fEfogEE9v+HPhhw+CntffsBHJ8nXQCwKr0/g8= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= @@ -530,8 +532,8 @@ github.com/hashicorp/go-hclog v0.9.1/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrj github.com/hashicorp/go-hclog v0.9.2/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ= github.com/hashicorp/go-hclog v0.14.1/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= github.com/hashicorp/go-hclog v0.16.2/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= -github.com/hashicorp/go-hclog v1.2.1 h1:YQsLlGDJgwhXFpucSPyVbCBviQtjlHv3jLTlp8YmtEw= -github.com/hashicorp/go-hclog v1.2.1/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M= +github.com/hashicorp/go-hclog v1.4.0 h1:ctuWFGrhFha8BnnzxqeRGidlEcQkDyL5u8J8t5eA11I= +github.com/hashicorp/go-hclog v1.4.0/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M= github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-immutable-radix v1.3.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc= @@ -579,8 +581,9 @@ github.com/hashicorp/go-syslog v1.0.0 h1:KaodqZuhUoZereWVIYmpUgZysurB1kBLX2j0MwM github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-uuid v1.0.2 h1:cfejS+Tpcp13yd5nYHWDI6qVCny6wyX2Mt5SGur2IGE= github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8= +github.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/go-version v1.2.1 h1:zEfKbn2+PDgroKdiOzqiE8rsmLqU2uwi5PB5pBJ3TkI= github.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= @@ -620,13 +623,16 @@ github.com/hashicorp/raft-wal v0.2.4 h1:Ke0ytMj8XyOVKQqFDmmgs/6hqkTJg0b/GO2a2XQB github.com/hashicorp/raft-wal v0.2.4/go.mod h1:JQ/4RbnKFi5Q/4rA73CekaYtHCJhU7qM7AQ4X5Y6q4M= github.com/hashicorp/serf v0.10.1 h1:Z1H2J60yRKvfDYAOZLd2MU0ND4AH/WDz7xYHDWQsIPY= github.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4= +github.com/hashicorp/vault-plugin-auth-alicloud v0.14.0 h1:O6tNk0s/arubLUbLeCyaRs5xGo9VwmbQazISY/BfPK4= +github.com/hashicorp/vault-plugin-auth-alicloud v0.14.0/go.mod h1:We3fJplmALwK1VpjwrLuXr/4QCQHYMdnXLHmLUU6Ntg= github.com/hashicorp/vault/api v1.8.0/go.mod h1:uJrw6D3y9Rv7hhmS17JQC50jbPDAZdjZoTtrCCxxs7E= -github.com/hashicorp/vault/api v1.8.2 h1:C7OL9YtOtwQbTKI9ogB0A1wffRbCN+rH/LLCHO3d8HM= -github.com/hashicorp/vault/api v1.8.2/go.mod h1:ML8aYzBIhY5m1MD1B2Q0JV89cC85YVH4t5kBaZiyVaE= +github.com/hashicorp/vault/api v1.8.3 h1:cHQOLcMhBR+aVI0HzhPxO62w2+gJhIrKguQNONPzu6o= +github.com/hashicorp/vault/api v1.8.3/go.mod h1:4g/9lj9lmuJQMtT6CmVMHC5FW1yENaVv+Nv4ZfG8fAg= github.com/hashicorp/vault/api/auth/gcp v0.3.0 h1:taum+3pCmOXnNgEKHlQbmgXmKw5daWHk7YJrLPP/w8g= github.com/hashicorp/vault/api/auth/gcp v0.3.0/go.mod h1:gnNBFOASYUaFunedTHOzdir7vKcHL3skWBUzEn263bo= -github.com/hashicorp/vault/sdk v0.6.0 h1:6Z+In5DXHiUfZvIZdMx7e2loL1PPyDjA4bVh9ZTIAhs= github.com/hashicorp/vault/sdk v0.6.0/go.mod h1:+DRpzoXIdMvKc88R4qxr+edwy/RvH5QK8itmxLiDHLc= +github.com/hashicorp/vault/sdk v0.7.0 h1:2pQRO40R1etpKkia5fb4kjrdYMx3BHklPxl1pxpxDHg= +github.com/hashicorp/vault/sdk v0.7.0/go.mod h1:KyfArJkhooyba7gYCKSq8v66QdqJmnbAxtV/OX1+JTs= github.com/hashicorp/vic v1.5.1-0.20190403131502-bbfe86ec9443 h1:O/pT5C1Q3mVXMyuqg7yuAWUg/jMZR1/0QTzTRdNR6Uw= github.com/hashicorp/vic v1.5.1-0.20190403131502-bbfe86ec9443/go.mod h1:bEpDU35nTu0ey1EXjwNwPjI9xErAsoOCmcMb9GKvyxo= github.com/hashicorp/yamux v0.0.0-20180604194846-3520598351bb/go.mod h1:+NfK9FKeTrX5uv1uIXGdwYDTeHna2qgaIlx54MXqjAM= @@ -829,8 +835,9 @@ github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1Cpa github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go.mod h1:Ngi6UdF0k5OKD5t5wlmGhe/EDKPoUM3BXZSSfIuJbis= github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -github.com/opentracing/opentracing-go v1.2.0 h1:uEJPy/1a5RIPAJ0Ov+OIO8OxWu77jEv+1B0VhjKrZUs= github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= +github.com/opentracing/opentracing-go v1.2.1-0.20220228012449-10b1cf09e00b h1:FfH+VrHHk6Lxt9HdVS0PXzSXFyS2NbZKXv33FYPol0A= +github.com/opentracing/opentracing-go v1.2.1-0.20220228012449-10b1cf09e00b/go.mod h1:AC62GU6hc0BrNm+9RK9VSiwa/EUe1bkIeFORAMcHvJU= github.com/openzipkin-contrib/zipkin-go-opentracing v0.3.5/go.mod h1:uVHyebswE1cCXr2A73cRM2frx5ld1RJUCJkFNZ90ZiI= github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw= github.com/oracle/oci-go-sdk v7.0.0+incompatible/go.mod h1:VQb79nF8Z2cwLkLS35ukwStZIg5F66tcBccjip/j888= @@ -1005,6 +1012,10 @@ github.com/transip/gotransip v0.0.0-20190812104329-6d8d9179b66f/go.mod h1:i0f4R4 github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926 h1:G3dpKMzFDjgEh2q1Z7zUUtKa8ViPtH+ocF0bE0g00O8= github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= github.com/uber-go/atomic v1.3.2/go.mod h1:/Ct5t2lcmbJ4OSe/waGBoaVvVqtO0bmtfVNex1PFV8g= +github.com/uber/jaeger-client-go v2.30.0+incompatible h1:D6wyKGCecFaSRUpo8lCVbaOOb6ThwMmTEbhRwtKR97o= +github.com/uber/jaeger-client-go v2.30.0+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk= +github.com/uber/jaeger-lib v2.4.1+incompatible h1:td4jdvLcExb4cBISKIpHuGoVXh+dVKhn2Um6rjCsSsg= +github.com/uber/jaeger-lib v2.4.1+incompatible/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6+uUTzImX/AauajbLI56U= github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= @@ -1580,6 +1591,8 @@ gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/ini.v1 v1.42.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/ini.v1 v1.44.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/ini.v1 v1.66.2 h1:XfR1dOYubytKy4Shzc2LHrrGhU0lDCfDGG1yLPmpgsI= +gopkg.in/ini.v1 v1.66.2/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/mcuadros/go-syslog.v2 v2.2.1/go.mod h1:l5LPIyOOyIdQquNg+oU6Z3524YwrcqEm0aKH+5zpt2U= gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= gopkg.in/ns1/ns1-go.v2 v2.0.0-20190730140822-b51389932cbc/go.mod h1:VV+3haRsgDiVLxyifmMBrBIuCWFBPYKbRssXB9z67Hw= From a5b825611174ad506b75cb2952e3ec7b0578d69d Mon Sep 17 00:00:00 2001 From: Tu Nguyen Date: Tue, 7 Mar 2023 08:21:23 -0800 Subject: [PATCH 124/262] Update docs to reflect functionality (#16549) * Update docs to reflect functionality * make consistent with other client runtimes --- website/content/docs/enterprise/index.mdx | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/website/content/docs/enterprise/index.mdx b/website/content/docs/enterprise/index.mdx index d03ab438d20..e63363e8106 100644 --- a/website/content/docs/enterprise/index.mdx +++ b/website/content/docs/enterprise/index.mdx @@ -116,17 +116,17 @@ Consul Enterprise feature availability can change depending on your server and c | Enterprise Feature | VM Client | K8s Client | ECS Client | | ----------------------------------------------------------------------- | :-------: | :--------: | :--------: | -| [Admin Partitions](/consul/docs/enterprise/admin-partitions) | ✅ | ✅ | ❌ | -| [Audit Logging](/consul/docs/enterprise/audit-logging) | ✅ | ✅ | ❌ | -| [Automated Server Backups](/consul/docs/enterprise/backups) | ✅ | ✅ | ❌ | +| [Admin Partitions](/consul/docs/enterprise/admin-partitions) | ✅ | ✅ | ✅ | +| [Audit Logging](/consul/docs/enterprise/audit-logging) | ✅ | ✅ | ✅ | +| [Automated Server Backups](/consul/docs/enterprise/backups) | ✅ | ✅ | ✅ | | [Automated Server Upgrades](/consul/docs/enterprise/upgrades) | ❌ | ❌ | ❌ | | [Enhanced Read Scalability](/consul/docs/enterprise/read-scale) | ❌ | ❌ | ❌ | -| [Namespaces](/consul/docs/enterprise/namespaces) | ✅ | ✅ | ❌ | -| [Network Areas](/consul/docs/enterprise/federation) | ✅ | ✅ | ❌ | +| [Namespaces](/consul/docs/enterprise/namespaces) | ✅ | ✅ | ✅ | +| [Network Areas](/consul/docs/enterprise/federation) | ✅ | ✅ | ✅ | | [Network Segments](/consul/docs/enterprise/network-segments/network-segments-overview) | ❌ | ❌ | ❌ | -| [OIDC Auth Method](/consul/docs/security/acl/auth-methods/oidc) | ✅ | ✅ | ❌ | +| [OIDC Auth Method](/consul/docs/security/acl/auth-methods/oidc) | ✅ | ✅ | ✅ | | [Redundancy Zones](/consul/docs/enterprise/redundancy) | ❌ | ❌ | ❌ | -| [Sentinel ](/consul/docs/enterprise/sentinel) | ✅ | ✅ | ❌ | +| [Sentinel ](/consul/docs/enterprise/sentinel) | ✅ | ✅ | ✅ | From b649a5e8e44a1b802bacddd2fd444b7b243eaaf8 Mon Sep 17 00:00:00 2001 From: cskh Date: Tue, 7 Mar 2023 13:27:47 -0500 Subject: [PATCH 125/262] upgrade test: use retry with ModifyIndex and remove ent test file (#16553) --- .../test/upgrade/fullstopupgrade_test.go | 38 ++- .../test/upgrade/tenancy_ent_test.go | 271 ------------------ 2 files changed, 25 insertions(+), 284 deletions(-) delete mode 100644 test/integration/consul-container/test/upgrade/tenancy_ent_test.go diff --git a/test/integration/consul-container/test/upgrade/fullstopupgrade_test.go b/test/integration/consul-container/test/upgrade/fullstopupgrade_test.go index c90692b5df9..59820c4b07e 100644 --- a/test/integration/consul-container/test/upgrade/fullstopupgrade_test.go +++ b/test/integration/consul-container/test/upgrade/fullstopupgrade_test.go @@ -6,6 +6,7 @@ import ( "testing" "time" + goretry "github.com/avast/retry-go" "github.com/stretchr/testify/require" "github.com/hashicorp/consul/api" @@ -75,22 +76,33 @@ func TestStandardUpgradeToTarget_fromLatest(t *testing.T) { const serviceName = "api" index := libservice.ServiceCreate(t, client, serviceName) - ch, errCh := libservice.ServiceHealthBlockingQuery(client, serviceName, index) require.NoError(t, client.Agent().ServiceRegister( &api.AgentServiceRegistration{Name: serviceName, Port: 9998}, )) - - timer := time.NewTimer(3 * time.Second) - select { - case err := <-errCh: - require.NoError(t, err) - case service := <-ch: - require.Len(t, service, 1) - require.Equal(t, serviceName, service[0].Service.Service) - require.Equal(t, 9998, service[0].Service.Port) - case <-timer.C: - t.Fatalf("test timeout") - } + err = goretry.Do( + func() error { + ch, errCh := libservice.ServiceHealthBlockingQuery(client, serviceName, index) + select { + case err := <-errCh: + require.NoError(t, err) + case service := <-ch: + index = service[0].Service.ModifyIndex + if len(service) != 1 { + return fmt.Errorf("service is %d, want 1", len(service)) + } + if serviceName != service[0].Service.Service { + return fmt.Errorf("service name is %s, want %s", service[0].Service.Service, serviceName) + } + if service[0].Service.Port != 9998 { + return fmt.Errorf("service is %d, want 9998", service[0].Service.Port) + } + } + return nil + }, + goretry.Attempts(5), + goretry.Delay(time.Second), + ) + require.NoError(t, err) // upgrade the cluster to the Target version t.Logf("initiating standard upgrade to version=%q", tc.targetVersion) diff --git a/test/integration/consul-container/test/upgrade/tenancy_ent_test.go b/test/integration/consul-container/test/upgrade/tenancy_ent_test.go deleted file mode 100644 index e28664e0b3c..00000000000 --- a/test/integration/consul-container/test/upgrade/tenancy_ent_test.go +++ /dev/null @@ -1,271 +0,0 @@ -//go:build consulent -// +build consulent - -package upgrade - -import ( - "context" - "encoding/json" - "fmt" - "io" - "testing" - - "github.com/hashicorp/consul/api" - "github.com/hashicorp/consul/sdk/testutil" - "github.com/hashicorp/consul/sdk/testutil/retry" - "github.com/stretchr/testify/require" - - libcluster "github.com/hashicorp/consul/test/integration/consul-container/libs/cluster" - libservice "github.com/hashicorp/consul/test/integration/consul-container/libs/service" - "github.com/hashicorp/consul/test/integration/consul-container/libs/utils" -) - -// Test partition crud using Current Clients and Latest GA Servers -func TestLatestGAServersWithCurrentClients_PartitionCRUD(t *testing.T) { - testLatestGAServersWithCurrentClients_TenancyCRUD(t, "Partitions", - func(t *testing.T, client *api.Client) { - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() - - // CRUD partitions - partition, _, err := client.Partitions().Read(ctx, "default", nil) - require.NoError(t, err) - fmt.Printf("%+v\n", partition) - require.NotNil(t, partition) - require.Equal(t, "default", partition.Name) - - fooPartReq := api.Partition{Name: "foo-part"} - fooPart, _, err := client.Partitions().Create(ctx, &api.Partition{Name: "foo-part"}, nil) - require.NoError(t, err) - require.NotNil(t, fooPart) - require.Equal(t, "foo-part", fooPart.Name) - - partition, _, err = client.Partitions().Read(ctx, "foo-part", nil) - require.NoError(t, err) - require.NotNil(t, partition) - require.Equal(t, "foo-part", partition.Name) - - fooPartReq.Description = "foo-part part" - partition, _, err = client.Partitions().Update(ctx, &fooPartReq, nil) - require.NoError(t, err) - require.NotNil(t, partition) - require.Equal(t, "foo-part", partition.Name) - require.Equal(t, "foo-part part", partition.Description) - }, - func(t *testing.T, client *api.Client) { - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() - - //Read partition again - retry.RunWith(libcluster.LongFailer(), t, func(r *retry.R) { - partition, _, err := client.Partitions().Read(ctx, "default", nil) - require.NoError(r, err) - require.NotNil(r, partition) - require.Equal(r, "default", partition.Name) - }) - - retry.RunWith(libcluster.LongFailer(), t, func(r *retry.R) { - partition, _, err := client.Partitions().Read(ctx, "foo-part", nil) - require.NoError(r, err) - require.NotNil(r, partition) - require.Equal(r, "foo-part", partition.Name) - require.Equal(r, "foo-part part", partition.Description) - }) - }, - ) -} - -// Test namespace crud using Current Clients and Latest GA Servers -func TestLatestGAServersWithCurrentClients_NamespaceCRUD(t *testing.T) { - testLatestGAServersWithCurrentClients_TenancyCRUD(t, "Namespaces", - func(t *testing.T, client *api.Client) { - // CRUD namespaces - namespace, _, err := client.Namespaces().Read("default", nil) - require.NoError(t, err) - require.NotNil(t, namespace, "default namespace does not exist yet") - require.Equal(t, "default", namespace.Name) - - fooNsReq := api.Namespace{Name: "foo-ns"} - fooNs, _, err := client.Namespaces().Create(&api.Namespace{Name: "foo-ns"}, nil) - require.NoError(t, err) - require.NotNil(t, fooNs) - require.Equal(t, "foo-ns", fooNs.Name) - - namespace, _, err = client.Namespaces().Read("foo-ns", nil) - require.NoError(t, err) - require.NotNil(t, namespace) - require.Equal(t, "foo-ns", namespace.Name) - - fooNsReq.Description = "foo-ns ns" - namespace, _, err = client.Namespaces().Update(&fooNsReq, nil) - require.NoError(t, err) - require.NotNil(t, namespace) - require.Equal(t, "foo-ns", namespace.Name) - require.Equal(t, "foo-ns ns", namespace.Description) - }, - func(t *testing.T, client *api.Client) { - retry.RunWith(libcluster.LongFailer(), t, func(r *retry.R) { - namespace, _, err := client.Namespaces().Read("default", nil) - require.NoError(r, err) - require.NotNil(r, namespace) - require.Equal(r, "default", namespace.Name) - }) - retry.RunWith(libcluster.LongFailer(), t, func(r *retry.R) { - namespace, _, err := client.Namespaces().Read("foo-ns", nil) - require.NoError(r, err) - require.NotNil(r, namespace) - require.Equal(r, "foo-ns", namespace.Name) - require.Equal(r, "foo-ns ns", namespace.Description) - }) - }, - ) -} - -func testLatestGAServersWithCurrentClients_TenancyCRUD( - t *testing.T, - tenancyName string, - createFn func(t *testing.T, client *api.Client), - readFn func(t *testing.T, client *api.Client), -) { - const ( - numServers = 3 - numClients = 2 - ) - - // Create initial cluster - cluster, _, _ := libtopology.NewCluster(t, &libtopology.ClusterConfig{ - NumServers: numServers, - NumClients: numClients, - BuildOpts: &libcluster.BuildOptions{ - Datacenter: "dc1", - ConsulImageName: utils.LatestImageName, - ConsulVersion: utils.LatestVersion, - }, - ApplyDefaultProxySettings: true, - }) - - client := cluster.APIClient(0) - libcluster.WaitForLeader(t, cluster, client) - libcluster.WaitForMembers(t, client, 5) - - testutil.RunStep(t, "Create "+tenancyName, func(t *testing.T) { - createFn(t, client) - }) - - ctx := context.Background() - - var snapshot io.ReadCloser - testutil.RunStep(t, "Save snapshot", func(t *testing.T) { - var err error - snapshot, _, err = client.Snapshot().Save(nil) - require.NoError(t, err) - }) - - testutil.RunStep(t, "Check "+tenancyName+" after upgrade", func(t *testing.T) { - // Upgrade nodes - leader, err := cluster.Leader() - require.NoError(t, err) - - // upgrade things in the following order: - // - // 1. follower servers - // 2. leader server - // 3. clients - var upgradeOrder []libcluster.Agent - - followers, err := cluster.Followers() - require.NoError(t, err) - upgradeOrder = append(upgradeOrder, followers...) - upgradeOrder = append(upgradeOrder, leader) - upgradeOrder = append(upgradeOrder, cluster.Clients()...) - - for _, n := range upgradeOrder { - conf := n.GetConfig() - - // TODO: ensure this makes sense again, it was doing an apples/orange version!=image comparison - if conf.Version == utils.TargetVersion { - return - } - - conf.Version = utils.TargetVersion - - if n.IsServer() { - // You only ever need bootstrap settings the FIRST time, so we do not need - // them again. - conf.ConfigBuilder.Unset("bootstrap") - } else { - // If we upgrade the clients fast enough - // membership might not be gossiped to all of - // the clients to persist into their serf - // snapshot, so force them to rejoin the - // normal way on restart. - conf.ConfigBuilder.Set("retry_join", []string{"agent-0"}) - } - - newJSON, err := json.MarshalIndent(conf.ConfigBuilder, "", " ") - require.NoError(t, err) - conf.JSON = string(newJSON) - t.Logf("Upgraded cluster config for %q:\n%s", n.GetName(), conf.JSON) - - selfBefore, err := n.GetClient().Agent().Self() - require.NoError(t, err) - - require.NoError(t, n.Upgrade(ctx, conf)) - - selfAfter, err := n.GetClient().Agent().Self() - require.NoError(t, err) - require.Truef(t, - (selfBefore["Config"]["Version"] != selfAfter["Config"]["Version"]) || (selfBefore["Config"]["Revision"] != selfAfter["Config"]["Revision"]), - fmt.Sprintf("upgraded version must be different (%s, %s), (%s, %s)", selfBefore["Config"]["Version"], selfBefore["Config"]["Revision"], selfAfter["Config"]["Version"], selfAfter["Config"]["Revision"]), - ) - - client := n.GetClient() - - libcluster.WaitForLeader(t, cluster, nil) - libcluster.WaitForMembers(t, client, 5) - } - - //get the client again as it changed after upgrade. - client := cluster.APIClient(0) - libcluster.WaitForLeader(t, cluster, client) - - // Read data again - readFn(t, client) - }) - - // Terminate the cluster for the snapshot test - testutil.RunStep(t, "Terminate the cluster", func(t *testing.T) { - require.NoError(t, cluster.Terminate()) - }) - - { // Clear these so they super break if you tried to use them. - cluster = nil - client = nil - } - - // Create a fresh cluster from scratch - cluster2, _, _ := libtopology.NewCluster(t, &libtopology.ClusterConfig{ - NumServers: numServers, - NumClients: numClients, - BuildOpts: &libcluster.BuildOptions{ - Datacenter: "dc1", - ConsulImageName: utils.LatestImageName, - ConsulVersion: utils.LatestVersion, - }, - ApplyDefaultProxySettings: true, - }) - client2 := cluster2.APIClient(0) - - testutil.RunStep(t, "Restore saved snapshot", func(t *testing.T) { - libcluster.WaitForLeader(t, cluster2, client2) - libcluster.WaitForMembers(t, client2, 5) - - // Restore the saved snapshot - require.NoError(t, client2.Snapshot().Restore(nil, snapshot)) - - libcluster.WaitForLeader(t, cluster2, client2) - - // make sure we still have the right data - readFn(t, client2) - }) -} From dbaf8bf49c135e7924e55f13ceb69f7d21b6587c Mon Sep 17 00:00:00 2001 From: Eric Haberkorn Date: Tue, 7 Mar 2023 14:05:23 -0500 Subject: [PATCH 126/262] add agent locality and replicate it across peer streams (#16522) --- agent/agent.go | 1 + agent/config/builder.go | 1 + agent/config/config.go | 10 + agent/config/runtime.go | 9 + agent/config/runtime_test.go | 1 + .../TestRuntimeConfig_Sanitize.golden | 4 + agent/consul/config.go | 2 + agent/consul/leader_peering.go | 1 + agent/consul/leader_peering_test.go | 14 + agent/consul/server.go | 1 + agent/consul/state/peering.go | 1 + agent/consul/state/peering_test.go | 36 + agent/rpc/peering/service.go | 3 + agent/structs/peering.go | 1 + agent/structs/structs.go | 9 + api/peering.go | 10 + proto/private/pbpeering/peering.gen.go | 22 + proto/private/pbpeering/peering.go | 16 +- proto/private/pbpeering/peering.pb.binary.go | 10 + proto/private/pbpeering/peering.pb.go | 1024 +++++++++-------- proto/private/pbpeering/peering.proto | 16 + 21 files changed, 726 insertions(+), 466 deletions(-) diff --git a/agent/agent.go b/agent/agent.go index 0d11e462d18..dd073dcab06 100644 --- a/agent/agent.go +++ b/agent/agent.go @@ -1493,6 +1493,7 @@ func newConsulConfig(runtimeCfg *config.RuntimeConfig, logger hclog.Logger) (*co cfg.RequestLimitsMode = runtimeCfg.RequestLimitsMode.String() cfg.RequestLimitsReadRate = runtimeCfg.RequestLimitsReadRate cfg.RequestLimitsWriteRate = runtimeCfg.RequestLimitsWriteRate + cfg.Locality = runtimeCfg.StructLocality() enterpriseConsulConfig(cfg, runtimeCfg) return cfg, nil diff --git a/agent/config/builder.go b/agent/config/builder.go index 5d697b027ee..d072429e1d2 100644 --- a/agent/config/builder.go +++ b/agent/config/builder.go @@ -833,6 +833,7 @@ func (b *builder) build() (rt RuntimeConfig, err error) { // gossip configuration GossipLANGossipInterval: b.durationVal("gossip_lan..gossip_interval", c.GossipLAN.GossipInterval), GossipLANGossipNodes: intVal(c.GossipLAN.GossipNodes), + Locality: c.Locality, GossipLANProbeInterval: b.durationVal("gossip_lan..probe_interval", c.GossipLAN.ProbeInterval), GossipLANProbeTimeout: b.durationVal("gossip_lan..probe_timeout", c.GossipLAN.ProbeTimeout), GossipLANSuspicionMult: intVal(c.GossipLAN.SuspicionMult), diff --git a/agent/config/config.go b/agent/config/config.go index 6ed4e9616f0..849cbbd9140 100644 --- a/agent/config/config.go +++ b/agent/config/config.go @@ -186,6 +186,7 @@ type Config struct { LeaveOnTerm *bool `mapstructure:"leave_on_terminate" json:"leave_on_terminate,omitempty"` LicensePath *string `mapstructure:"license_path" json:"license_path,omitempty"` Limits Limits `mapstructure:"limits" json:"-"` + Locality Locality `mapstructure:"locality" json:"-"` LogLevel *string `mapstructure:"log_level" json:"log_level,omitempty"` LogJSON *bool `mapstructure:"log_json" json:"log_json,omitempty"` LogFile *string `mapstructure:"log_file" json:"log_file,omitempty"` @@ -311,6 +312,15 @@ type GossipWANConfig struct { RetransmitMult *int `mapstructure:"retransmit_mult"` } +// Locality identifies where a given entity is running. +type Locality struct { + // Region is region the zone belongs to. + Region *string `mapstructure:"region"` + + // Zone is the zone the entity is running in. + Zone *string `mapstructure:"zone"` +} + type Consul struct { Coordinate struct { UpdateBatchSize *int `mapstructure:"update_batch_size"` diff --git a/agent/config/runtime.go b/agent/config/runtime.go index b0d9cf436e5..fb0c34d8379 100644 --- a/agent/config/runtime.go +++ b/agent/config/runtime.go @@ -796,6 +796,8 @@ type RuntimeConfig struct { // hcl: leave_on_terminate = (true|false) LeaveOnTerm bool + Locality Locality + // Logging configuration used to initialize agent logging. Logging logging.Config @@ -1713,6 +1715,13 @@ func (c *RuntimeConfig) VersionWithMetadata() string { return version } +func (c *RuntimeConfig) StructLocality() structs.Locality { + return structs.Locality{ + Region: stringVal(c.Locality.Region), + Zone: stringVal(c.Locality.Zone), + } +} + // Sanitized returns a JSON/HCL compatible representation of the runtime // configuration where all fields with potential secrets had their // values replaced by 'hidden'. In addition, network addresses and diff --git a/agent/config/runtime_test.go b/agent/config/runtime_test.go index a8208f0eccf..52d6b9efc82 100644 --- a/agent/config/runtime_test.go +++ b/agent/config/runtime_test.go @@ -7092,6 +7092,7 @@ func TestRuntimeConfig_Sanitize(t *testing.T) { }, }, }, + Locality: Locality{Region: strPtr("us-west-1"), Zone: strPtr("us-west-1a")}, } b, err := json.MarshalIndent(rt.Sanitized(), "", " ") diff --git a/agent/config/testdata/TestRuntimeConfig_Sanitize.golden b/agent/config/testdata/TestRuntimeConfig_Sanitize.golden index 2c5b91c98a5..24d626bf4aa 100644 --- a/agent/config/testdata/TestRuntimeConfig_Sanitize.golden +++ b/agent/config/testdata/TestRuntimeConfig_Sanitize.golden @@ -234,6 +234,10 @@ "LeaveDrainTime": "0s", "LeaveOnTerm": false, "LocalProxyConfigResyncInterval": "0s", + "Locality": { + "Region": "us-west-1", + "Zone": "us-west-1a" + }, "Logging": { "EnableSyslog": false, "LogFilePath": "", diff --git a/agent/consul/config.go b/agent/consul/config.go index f114dcecfc8..446da01ffaa 100644 --- a/agent/consul/config.go +++ b/agent/consul/config.go @@ -436,6 +436,8 @@ type Config struct { PeeringTestAllowPeerRegistrations bool + Locality structs.Locality + // Embedded Consul Enterprise specific configuration *EnterpriseConfig } diff --git a/agent/consul/leader_peering.go b/agent/consul/leader_peering.go index 1ba16e2ba1f..fa87ce8b076 100644 --- a/agent/consul/leader_peering.go +++ b/agent/consul/leader_peering.go @@ -385,6 +385,7 @@ func (s *Server) establishStream(ctx context.Context, Remote: &pbpeering.RemoteInfo{ Partition: peer.Partition, Datacenter: s.config.Datacenter, + Locality: pbpeering.LocalityFromStruct(s.config.Locality), }, }, }, diff --git a/agent/consul/leader_peering_test.go b/agent/consul/leader_peering_test.go index f468d9fcd70..9e960de3075 100644 --- a/agent/consul/leader_peering_test.go +++ b/agent/consul/leader_peering_test.go @@ -661,6 +661,11 @@ func TestLeader_Peering_RemoteInfo(t *testing.T) { t.Skip("too slow for testing.Short") } + acceptorLocality := structs.Locality{ + Region: "us-west-2", + Zone: "us-west-2a", + } + ca := connect.TestCA(t, nil) _, acceptingServer := testServerWithConfig(t, func(c *Config) { c.NodeName = "accepting-server" @@ -676,6 +681,7 @@ func TestLeader_Peering_RemoteInfo(t *testing.T) { "RootCert": ca.RootCert, }, } + c.Locality = acceptorLocality }) testrpc.WaitForLeader(t, acceptingServer.RPC, "dc1") @@ -683,6 +689,10 @@ func TestLeader_Peering_RemoteInfo(t *testing.T) { ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second) t.Cleanup(cancel) + dialerLocality := structs.Locality{ + Region: "us-west-1", + Zone: "us-west-1a", + } conn, err := grpc.DialContext(ctx, acceptingServer.config.RPCAddr.String(), grpc.WithContextDialer(newServerDialer(acceptingServer.config.RPCAddr.String())), //nolint:staticcheck @@ -705,6 +715,7 @@ func TestLeader_Peering_RemoteInfo(t *testing.T) { // Ensure that the token contains the correct partition and dc require.Equal(t, "dc1", token.Remote.Datacenter) require.Contains(t, []string{"", "default"}, token.Remote.Partition) + require.Equal(t, acceptorLocality, token.Remote.Locality) // Bring up dialingServer and store acceptingServer's token so that it attempts to dial. _, dialingServer := testServerWithConfig(t, func(c *Config) { @@ -712,6 +723,7 @@ func TestLeader_Peering_RemoteInfo(t *testing.T) { c.Datacenter = "dc2" c.PrimaryDatacenter = "dc2" c.PeeringEnabled = true + c.Locality = dialerLocality }) testrpc.WaitForLeader(t, dialingServer.RPC, "dc2") @@ -743,6 +755,7 @@ func TestLeader_Peering_RemoteInfo(t *testing.T) { require.NoError(t, err) require.Equal(t, "dc1", p.Peering.Remote.Datacenter) require.Contains(t, []string{"", "default"}, p.Peering.Remote.Partition) + require.Equal(t, pbpeering.LocalityFromStruct(acceptorLocality), p.Peering.Remote.Locality) // Retry fetching the until the peering is active in the acceptor. ctx, cancel = context.WithTimeout(context.Background(), 10*time.Second) @@ -758,6 +771,7 @@ func TestLeader_Peering_RemoteInfo(t *testing.T) { require.NotNil(t, p) require.Equal(t, "dc2", p.Peering.Remote.Datacenter) require.Contains(t, []string{"", "default"}, p.Peering.Remote.Partition) + require.Equal(t, pbpeering.LocalityFromStruct(dialerLocality), p.Peering.Remote.Locality) } // Test that the dialing peer attempts to reestablish connections when the accepting peer diff --git a/agent/consul/server.go b/agent/consul/server.go index ea81cf96528..19ebc9c8821 100644 --- a/agent/consul/server.go +++ b/agent/consul/server.go @@ -860,6 +860,7 @@ func newGRPCHandlerFromConfig(deps Deps, config *Config, s *Server) connHandler Datacenter: config.Datacenter, ConnectEnabled: config.ConnectEnabled, PeeringEnabled: config.PeeringEnabled, + Locality: config.Locality, }) s.peeringServer = p o := operator.NewServer(operator.Config{ diff --git a/agent/consul/state/peering.go b/agent/consul/state/peering.go index 491d4887a23..1c8c2472ae7 100644 --- a/agent/consul/state/peering.go +++ b/agent/consul/state/peering.go @@ -591,6 +591,7 @@ func (s *Store) PeeringWrite(idx uint64, req *pbpeering.PeeringWriteRequest) err req.Peering.Remote = &pbpeering.RemoteInfo{ Partition: existing.Remote.Partition, Datacenter: existing.Remote.Datacenter, + Locality: existing.Remote.Locality, } } diff --git a/agent/consul/state/peering_test.go b/agent/consul/state/peering_test.go index f7232ca1add..3d5a2a2a9c4 100644 --- a/agent/consul/state/peering_test.go +++ b/agent/consul/state/peering_test.go @@ -1261,6 +1261,10 @@ func TestStore_PeeringWrite(t *testing.T) { Remote: &pbpeering.RemoteInfo{ Partition: "part1", Datacenter: "datacenter1", + Locality: &pbpeering.Locality{ + Region: "us-west-1", + Zone: "us-west-1a", + }, }, }, }, @@ -1272,6 +1276,10 @@ func TestStore_PeeringWrite(t *testing.T) { Remote: &pbpeering.RemoteInfo{ Partition: "part1", Datacenter: "datacenter1", + Locality: &pbpeering.Locality{ + Region: "us-west-1", + Zone: "us-west-1a", + }, }, }, secrets: &pbpeering.PeeringSecrets{ @@ -1303,6 +1311,10 @@ func TestStore_PeeringWrite(t *testing.T) { Remote: &pbpeering.RemoteInfo{ Partition: "part1", Datacenter: "datacenter1", + Locality: &pbpeering.Locality{ + Region: "us-west-1", + Zone: "us-west-1a", + }, }, }, secrets: &pbpeering.PeeringSecrets{ @@ -1332,6 +1344,10 @@ func TestStore_PeeringWrite(t *testing.T) { Remote: &pbpeering.RemoteInfo{ Partition: "part1", Datacenter: "datacenter1", + Locality: &pbpeering.Locality{ + Region: "us-west-1", + Zone: "us-west-1a", + }, }, }, secrets: &pbpeering.PeeringSecrets{ @@ -1361,6 +1377,10 @@ func TestStore_PeeringWrite(t *testing.T) { Remote: &pbpeering.RemoteInfo{ Partition: "part1", Datacenter: "datacenter1", + Locality: &pbpeering.Locality{ + Region: "us-west-1", + Zone: "us-west-1a", + }, }, }, // Secrets for baz should have been deleted @@ -1389,6 +1409,10 @@ func TestStore_PeeringWrite(t *testing.T) { Remote: &pbpeering.RemoteInfo{ Partition: "part1", Datacenter: "datacenter1", + Locality: &pbpeering.Locality{ + Region: "us-west-1", + Zone: "us-west-1a", + }, }, // Meta should be unchanged. Meta: nil, @@ -1416,6 +1440,10 @@ func TestStore_PeeringWrite(t *testing.T) { Remote: &pbpeering.RemoteInfo{ Partition: "part1", Datacenter: "datacenter1", + Locality: &pbpeering.Locality{ + Region: "us-west-1", + Zone: "us-west-1a", + }, }, }, secrets: nil, @@ -1443,6 +1471,10 @@ func TestStore_PeeringWrite(t *testing.T) { Remote: &pbpeering.RemoteInfo{ Partition: "part1", Datacenter: "datacenter1", + Locality: &pbpeering.Locality{ + Region: "us-west-1", + Zone: "us-west-1a", + }, }, }, // Secrets for baz should have been deleted @@ -1469,6 +1501,10 @@ func TestStore_PeeringWrite(t *testing.T) { Remote: &pbpeering.RemoteInfo{ Partition: "part1", Datacenter: "datacenter1", + Locality: &pbpeering.Locality{ + Region: "us-west-1", + Zone: "us-west-1a", + }, }, }, // Secrets for baz should have been deleted diff --git a/agent/rpc/peering/service.go b/agent/rpc/peering/service.go index 1e4e93fc5c8..91cab013232 100644 --- a/agent/rpc/peering/service.go +++ b/agent/rpc/peering/service.go @@ -87,6 +87,7 @@ type Config struct { Datacenter string ConnectEnabled bool PeeringEnabled bool + Locality structs.Locality } func NewServer(cfg Config) *Server { @@ -327,6 +328,7 @@ func (s *Server) GenerateToken( Remote: structs.PeeringTokenRemote{ Partition: req.PartitionOrDefault(), Datacenter: s.Datacenter, + Locality: s.Config.Locality, }, } @@ -445,6 +447,7 @@ func (s *Server) Establish( Remote: &pbpeering.RemoteInfo{ Partition: tok.Remote.Partition, Datacenter: tok.Remote.Datacenter, + Locality: pbpeering.LocalityFromStruct(tok.Remote.Locality), }, } diff --git a/agent/structs/peering.go b/agent/structs/peering.go index 714a442e8f7..96fd049cb40 100644 --- a/agent/structs/peering.go +++ b/agent/structs/peering.go @@ -14,6 +14,7 @@ type PeeringToken struct { type PeeringTokenRemote struct { Partition string Datacenter string + Locality Locality } type IndexedExportedServiceList struct { diff --git a/agent/structs/structs.go b/agent/structs/structs.go index 5191272a645..ae23899c905 100644 --- a/agent/structs/structs.go +++ b/agent/structs/structs.go @@ -3021,3 +3021,12 @@ func TimeToProto(s time.Time) *timestamppb.Timestamp { func IsZeroProtoTime(t *timestamppb.Timestamp) bool { return t.Seconds == 0 && t.Nanos == 0 } + +// Locality identifies where a given entity is running. +type Locality struct { + // Region is region the zone belongs to. + Region string `json:",omitempty"` + + // Zone is the zone the entity is running in. + Zone string `json:",omitempty"` +} diff --git a/api/peering.go b/api/peering.go index 34602c878da..4de1aad9301 100644 --- a/api/peering.go +++ b/api/peering.go @@ -44,6 +44,16 @@ type PeeringRemoteInfo struct { Partition string // Datacenter is the remote peer's datacenter. Datacenter string + Locality Locality +} + +// Locality identifies where a given entity is running. +type Locality struct { + // Region is region the zone belongs to. + Region string + + // Zone is the zone the entity is running in. + Zone string } type Peering struct { diff --git a/proto/private/pbpeering/peering.gen.go b/proto/private/pbpeering/peering.gen.go index b5b3436d4ce..6cc2a6462f4 100644 --- a/proto/private/pbpeering/peering.gen.go +++ b/proto/private/pbpeering/peering.gen.go @@ -62,6 +62,20 @@ func GenerateTokenResponseFromAPI(t *api.PeeringGenerateTokenResponse, s *Genera } s.PeeringToken = t.PeeringToken } +func LocalityToAPI(s *Locality, t *api.Locality) { + if s == nil { + return + } + t.Region = s.Region + t.Zone = s.Zone +} +func LocalityFromAPI(t *api.Locality, s *Locality) { + if s == nil { + return + } + s.Region = t.Region + s.Zone = t.Zone +} func PeeringToAPI(s *Peering, t *api.Peering) { if s == nil { return @@ -112,6 +126,9 @@ func RemoteInfoToAPI(s *RemoteInfo, t *api.PeeringRemoteInfo) { } t.Partition = s.Partition t.Datacenter = s.Datacenter + if s.Locality != nil { + LocalityToAPI(s.Locality, &t.Locality) + } } func RemoteInfoFromAPI(t *api.PeeringRemoteInfo, s *RemoteInfo) { if s == nil { @@ -119,4 +136,9 @@ func RemoteInfoFromAPI(t *api.PeeringRemoteInfo, s *RemoteInfo) { } s.Partition = t.Partition s.Datacenter = t.Datacenter + { + var x Locality + LocalityFromAPI(&t.Locality, &x) + s.Locality = &x + } } diff --git a/proto/private/pbpeering/peering.go b/proto/private/pbpeering/peering.go index 3481b37a405..a0f337409ce 100644 --- a/proto/private/pbpeering/peering.go +++ b/proto/private/pbpeering/peering.go @@ -276,7 +276,14 @@ func (r *RemoteInfo) IsEmpty() bool { if r == nil { return true } - return r.Partition == "" && r.Datacenter == "" + return r.Partition == "" && r.Datacenter == "" && r.Locality.IsEmpty() +} + +func (l *Locality) IsEmpty() bool { + if l == nil { + return true + } + return l.Region == "" && l.Zone == "" } // convenience @@ -324,3 +331,10 @@ func (o *PeeringTrustBundle) DeepCopy() *PeeringTrustBundle { } return cp } + +func LocalityFromStruct(l structs.Locality) *Locality { + return &Locality{ + Region: l.Region, + Zone: l.Zone, + } +} diff --git a/proto/private/pbpeering/peering.pb.binary.go b/proto/private/pbpeering/peering.pb.binary.go index af74d9a49e6..064c0e294ad 100644 --- a/proto/private/pbpeering/peering.pb.binary.go +++ b/proto/private/pbpeering/peering.pb.binary.go @@ -107,6 +107,16 @@ func (msg *RemoteInfo) UnmarshalBinary(b []byte) error { return proto.Unmarshal(b, msg) } +// MarshalBinary implements encoding.BinaryMarshaler +func (msg *Locality) MarshalBinary() ([]byte, error) { + return proto.Marshal(msg) +} + +// UnmarshalBinary implements encoding.BinaryUnmarshaler +func (msg *Locality) UnmarshalBinary(b []byte) error { + return proto.Unmarshal(b, msg) +} + // MarshalBinary implements encoding.BinaryMarshaler func (msg *StreamStatus) MarshalBinary() ([]byte, error) { return proto.Marshal(msg) diff --git a/proto/private/pbpeering/peering.pb.go b/proto/private/pbpeering/peering.pb.go index 6132adaffdf..56893499f43 100644 --- a/proto/private/pbpeering/peering.pb.go +++ b/proto/private/pbpeering/peering.pb.go @@ -490,6 +490,8 @@ type RemoteInfo struct { Partition string `protobuf:"bytes,1,opt,name=Partition,proto3" json:"Partition,omitempty"` // Datacenter is the remote peer's datacenter. Datacenter string `protobuf:"bytes,2,opt,name=Datacenter,proto3" json:"Datacenter,omitempty"` + // Locality identifies where the peer is running. + Locality *Locality `protobuf:"bytes,3,opt,name=Locality,proto3" json:"Locality,omitempty"` } func (x *RemoteInfo) Reset() { @@ -538,6 +540,75 @@ func (x *RemoteInfo) GetDatacenter() string { return "" } +func (x *RemoteInfo) GetLocality() *Locality { + if x != nil { + return x.Locality + } + return nil +} + +// mog annotation: +// +// target=github.com/hashicorp/consul/api.Locality +// output=peering.gen.go +// name=API +type Locality struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Region is region the zone belongs to. + Region string `protobuf:"bytes,1,opt,name=Region,proto3" json:"Region,omitempty"` + // Zone is the zone the entity is running in. + Zone string `protobuf:"bytes,2,opt,name=Zone,proto3" json:"Zone,omitempty"` +} + +func (x *Locality) Reset() { + *x = Locality{} + if protoimpl.UnsafeEnabled { + mi := &file_private_pbpeering_peering_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Locality) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Locality) ProtoMessage() {} + +func (x *Locality) ProtoReflect() protoreflect.Message { + mi := &file_private_pbpeering_peering_proto_msgTypes[4] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Locality.ProtoReflect.Descriptor instead. +func (*Locality) Descriptor() ([]byte, []int) { + return file_private_pbpeering_peering_proto_rawDescGZIP(), []int{4} +} + +func (x *Locality) GetRegion() string { + if x != nil { + return x.Region + } + return "" +} + +func (x *Locality) GetZone() string { + if x != nil { + return x.Zone + } + return "" +} + // StreamStatus represents information about an active peering stream. type StreamStatus struct { state protoimpl.MessageState @@ -559,7 +630,7 @@ type StreamStatus struct { func (x *StreamStatus) Reset() { *x = StreamStatus{} if protoimpl.UnsafeEnabled { - mi := &file_private_pbpeering_peering_proto_msgTypes[4] + mi := &file_private_pbpeering_peering_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -572,7 +643,7 @@ func (x *StreamStatus) String() string { func (*StreamStatus) ProtoMessage() {} func (x *StreamStatus) ProtoReflect() protoreflect.Message { - mi := &file_private_pbpeering_peering_proto_msgTypes[4] + mi := &file_private_pbpeering_peering_proto_msgTypes[5] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -585,7 +656,7 @@ func (x *StreamStatus) ProtoReflect() protoreflect.Message { // Deprecated: Use StreamStatus.ProtoReflect.Descriptor instead. func (*StreamStatus) Descriptor() ([]byte, []int) { - return file_private_pbpeering_peering_proto_rawDescGZIP(), []int{4} + return file_private_pbpeering_peering_proto_rawDescGZIP(), []int{5} } func (x *StreamStatus) GetImportedServices() []string { @@ -651,7 +722,7 @@ type PeeringTrustBundle struct { func (x *PeeringTrustBundle) Reset() { *x = PeeringTrustBundle{} if protoimpl.UnsafeEnabled { - mi := &file_private_pbpeering_peering_proto_msgTypes[5] + mi := &file_private_pbpeering_peering_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -664,7 +735,7 @@ func (x *PeeringTrustBundle) String() string { func (*PeeringTrustBundle) ProtoMessage() {} func (x *PeeringTrustBundle) ProtoReflect() protoreflect.Message { - mi := &file_private_pbpeering_peering_proto_msgTypes[5] + mi := &file_private_pbpeering_peering_proto_msgTypes[6] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -677,7 +748,7 @@ func (x *PeeringTrustBundle) ProtoReflect() protoreflect.Message { // Deprecated: Use PeeringTrustBundle.ProtoReflect.Descriptor instead. func (*PeeringTrustBundle) Descriptor() ([]byte, []int) { - return file_private_pbpeering_peering_proto_rawDescGZIP(), []int{5} + return file_private_pbpeering_peering_proto_rawDescGZIP(), []int{6} } func (x *PeeringTrustBundle) GetTrustDomain() string { @@ -742,7 +813,7 @@ type PeeringServerAddresses struct { func (x *PeeringServerAddresses) Reset() { *x = PeeringServerAddresses{} if protoimpl.UnsafeEnabled { - mi := &file_private_pbpeering_peering_proto_msgTypes[6] + mi := &file_private_pbpeering_peering_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -755,7 +826,7 @@ func (x *PeeringServerAddresses) String() string { func (*PeeringServerAddresses) ProtoMessage() {} func (x *PeeringServerAddresses) ProtoReflect() protoreflect.Message { - mi := &file_private_pbpeering_peering_proto_msgTypes[6] + mi := &file_private_pbpeering_peering_proto_msgTypes[7] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -768,7 +839,7 @@ func (x *PeeringServerAddresses) ProtoReflect() protoreflect.Message { // Deprecated: Use PeeringServerAddresses.ProtoReflect.Descriptor instead. func (*PeeringServerAddresses) Descriptor() ([]byte, []int) { - return file_private_pbpeering_peering_proto_rawDescGZIP(), []int{6} + return file_private_pbpeering_peering_proto_rawDescGZIP(), []int{7} } func (x *PeeringServerAddresses) GetAddresses() []string { @@ -791,7 +862,7 @@ type PeeringReadRequest struct { func (x *PeeringReadRequest) Reset() { *x = PeeringReadRequest{} if protoimpl.UnsafeEnabled { - mi := &file_private_pbpeering_peering_proto_msgTypes[7] + mi := &file_private_pbpeering_peering_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -804,7 +875,7 @@ func (x *PeeringReadRequest) String() string { func (*PeeringReadRequest) ProtoMessage() {} func (x *PeeringReadRequest) ProtoReflect() protoreflect.Message { - mi := &file_private_pbpeering_peering_proto_msgTypes[7] + mi := &file_private_pbpeering_peering_proto_msgTypes[8] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -817,7 +888,7 @@ func (x *PeeringReadRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use PeeringReadRequest.ProtoReflect.Descriptor instead. func (*PeeringReadRequest) Descriptor() ([]byte, []int) { - return file_private_pbpeering_peering_proto_rawDescGZIP(), []int{7} + return file_private_pbpeering_peering_proto_rawDescGZIP(), []int{8} } func (x *PeeringReadRequest) GetName() string { @@ -845,7 +916,7 @@ type PeeringReadResponse struct { func (x *PeeringReadResponse) Reset() { *x = PeeringReadResponse{} if protoimpl.UnsafeEnabled { - mi := &file_private_pbpeering_peering_proto_msgTypes[8] + mi := &file_private_pbpeering_peering_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -858,7 +929,7 @@ func (x *PeeringReadResponse) String() string { func (*PeeringReadResponse) ProtoMessage() {} func (x *PeeringReadResponse) ProtoReflect() protoreflect.Message { - mi := &file_private_pbpeering_peering_proto_msgTypes[8] + mi := &file_private_pbpeering_peering_proto_msgTypes[9] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -871,7 +942,7 @@ func (x *PeeringReadResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use PeeringReadResponse.ProtoReflect.Descriptor instead. func (*PeeringReadResponse) Descriptor() ([]byte, []int) { - return file_private_pbpeering_peering_proto_rawDescGZIP(), []int{8} + return file_private_pbpeering_peering_proto_rawDescGZIP(), []int{9} } func (x *PeeringReadResponse) GetPeering() *Peering { @@ -893,7 +964,7 @@ type PeeringListRequest struct { func (x *PeeringListRequest) Reset() { *x = PeeringListRequest{} if protoimpl.UnsafeEnabled { - mi := &file_private_pbpeering_peering_proto_msgTypes[9] + mi := &file_private_pbpeering_peering_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -906,7 +977,7 @@ func (x *PeeringListRequest) String() string { func (*PeeringListRequest) ProtoMessage() {} func (x *PeeringListRequest) ProtoReflect() protoreflect.Message { - mi := &file_private_pbpeering_peering_proto_msgTypes[9] + mi := &file_private_pbpeering_peering_proto_msgTypes[10] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -919,7 +990,7 @@ func (x *PeeringListRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use PeeringListRequest.ProtoReflect.Descriptor instead. func (*PeeringListRequest) Descriptor() ([]byte, []int) { - return file_private_pbpeering_peering_proto_rawDescGZIP(), []int{9} + return file_private_pbpeering_peering_proto_rawDescGZIP(), []int{10} } func (x *PeeringListRequest) GetPartition() string { @@ -941,7 +1012,7 @@ type PeeringListResponse struct { func (x *PeeringListResponse) Reset() { *x = PeeringListResponse{} if protoimpl.UnsafeEnabled { - mi := &file_private_pbpeering_peering_proto_msgTypes[10] + mi := &file_private_pbpeering_peering_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -954,7 +1025,7 @@ func (x *PeeringListResponse) String() string { func (*PeeringListResponse) ProtoMessage() {} func (x *PeeringListResponse) ProtoReflect() protoreflect.Message { - mi := &file_private_pbpeering_peering_proto_msgTypes[10] + mi := &file_private_pbpeering_peering_proto_msgTypes[11] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -967,7 +1038,7 @@ func (x *PeeringListResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use PeeringListResponse.ProtoReflect.Descriptor instead. func (*PeeringListResponse) Descriptor() ([]byte, []int) { - return file_private_pbpeering_peering_proto_rawDescGZIP(), []int{10} + return file_private_pbpeering_peering_proto_rawDescGZIP(), []int{11} } func (x *PeeringListResponse) GetPeerings() []*Peering { @@ -1001,7 +1072,7 @@ type PeeringWriteRequest struct { func (x *PeeringWriteRequest) Reset() { *x = PeeringWriteRequest{} if protoimpl.UnsafeEnabled { - mi := &file_private_pbpeering_peering_proto_msgTypes[11] + mi := &file_private_pbpeering_peering_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1014,7 +1085,7 @@ func (x *PeeringWriteRequest) String() string { func (*PeeringWriteRequest) ProtoMessage() {} func (x *PeeringWriteRequest) ProtoReflect() protoreflect.Message { - mi := &file_private_pbpeering_peering_proto_msgTypes[11] + mi := &file_private_pbpeering_peering_proto_msgTypes[12] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1027,7 +1098,7 @@ func (x *PeeringWriteRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use PeeringWriteRequest.ProtoReflect.Descriptor instead. func (*PeeringWriteRequest) Descriptor() ([]byte, []int) { - return file_private_pbpeering_peering_proto_rawDescGZIP(), []int{11} + return file_private_pbpeering_peering_proto_rawDescGZIP(), []int{12} } func (x *PeeringWriteRequest) GetPeering() *Peering { @@ -1061,7 +1132,7 @@ type PeeringWriteResponse struct { func (x *PeeringWriteResponse) Reset() { *x = PeeringWriteResponse{} if protoimpl.UnsafeEnabled { - mi := &file_private_pbpeering_peering_proto_msgTypes[12] + mi := &file_private_pbpeering_peering_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1074,7 +1145,7 @@ func (x *PeeringWriteResponse) String() string { func (*PeeringWriteResponse) ProtoMessage() {} func (x *PeeringWriteResponse) ProtoReflect() protoreflect.Message { - mi := &file_private_pbpeering_peering_proto_msgTypes[12] + mi := &file_private_pbpeering_peering_proto_msgTypes[13] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1087,7 +1158,7 @@ func (x *PeeringWriteResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use PeeringWriteResponse.ProtoReflect.Descriptor instead. func (*PeeringWriteResponse) Descriptor() ([]byte, []int) { - return file_private_pbpeering_peering_proto_rawDescGZIP(), []int{12} + return file_private_pbpeering_peering_proto_rawDescGZIP(), []int{13} } type PeeringDeleteRequest struct { @@ -1102,7 +1173,7 @@ type PeeringDeleteRequest struct { func (x *PeeringDeleteRequest) Reset() { *x = PeeringDeleteRequest{} if protoimpl.UnsafeEnabled { - mi := &file_private_pbpeering_peering_proto_msgTypes[13] + mi := &file_private_pbpeering_peering_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1115,7 +1186,7 @@ func (x *PeeringDeleteRequest) String() string { func (*PeeringDeleteRequest) ProtoMessage() {} func (x *PeeringDeleteRequest) ProtoReflect() protoreflect.Message { - mi := &file_private_pbpeering_peering_proto_msgTypes[13] + mi := &file_private_pbpeering_peering_proto_msgTypes[14] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1128,7 +1199,7 @@ func (x *PeeringDeleteRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use PeeringDeleteRequest.ProtoReflect.Descriptor instead. func (*PeeringDeleteRequest) Descriptor() ([]byte, []int) { - return file_private_pbpeering_peering_proto_rawDescGZIP(), []int{13} + return file_private_pbpeering_peering_proto_rawDescGZIP(), []int{14} } func (x *PeeringDeleteRequest) GetName() string { @@ -1154,7 +1225,7 @@ type PeeringDeleteResponse struct { func (x *PeeringDeleteResponse) Reset() { *x = PeeringDeleteResponse{} if protoimpl.UnsafeEnabled { - mi := &file_private_pbpeering_peering_proto_msgTypes[14] + mi := &file_private_pbpeering_peering_proto_msgTypes[15] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1167,7 +1238,7 @@ func (x *PeeringDeleteResponse) String() string { func (*PeeringDeleteResponse) ProtoMessage() {} func (x *PeeringDeleteResponse) ProtoReflect() protoreflect.Message { - mi := &file_private_pbpeering_peering_proto_msgTypes[14] + mi := &file_private_pbpeering_peering_proto_msgTypes[15] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1180,7 +1251,7 @@ func (x *PeeringDeleteResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use PeeringDeleteResponse.ProtoReflect.Descriptor instead. func (*PeeringDeleteResponse) Descriptor() ([]byte, []int) { - return file_private_pbpeering_peering_proto_rawDescGZIP(), []int{14} + return file_private_pbpeering_peering_proto_rawDescGZIP(), []int{15} } type TrustBundleListByServiceRequest struct { @@ -1197,7 +1268,7 @@ type TrustBundleListByServiceRequest struct { func (x *TrustBundleListByServiceRequest) Reset() { *x = TrustBundleListByServiceRequest{} if protoimpl.UnsafeEnabled { - mi := &file_private_pbpeering_peering_proto_msgTypes[15] + mi := &file_private_pbpeering_peering_proto_msgTypes[16] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1210,7 +1281,7 @@ func (x *TrustBundleListByServiceRequest) String() string { func (*TrustBundleListByServiceRequest) ProtoMessage() {} func (x *TrustBundleListByServiceRequest) ProtoReflect() protoreflect.Message { - mi := &file_private_pbpeering_peering_proto_msgTypes[15] + mi := &file_private_pbpeering_peering_proto_msgTypes[16] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1223,7 +1294,7 @@ func (x *TrustBundleListByServiceRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use TrustBundleListByServiceRequest.ProtoReflect.Descriptor instead. func (*TrustBundleListByServiceRequest) Descriptor() ([]byte, []int) { - return file_private_pbpeering_peering_proto_rawDescGZIP(), []int{15} + return file_private_pbpeering_peering_proto_rawDescGZIP(), []int{16} } func (x *TrustBundleListByServiceRequest) GetServiceName() string { @@ -1266,7 +1337,7 @@ type TrustBundleListByServiceResponse struct { func (x *TrustBundleListByServiceResponse) Reset() { *x = TrustBundleListByServiceResponse{} if protoimpl.UnsafeEnabled { - mi := &file_private_pbpeering_peering_proto_msgTypes[16] + mi := &file_private_pbpeering_peering_proto_msgTypes[17] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1279,7 +1350,7 @@ func (x *TrustBundleListByServiceResponse) String() string { func (*TrustBundleListByServiceResponse) ProtoMessage() {} func (x *TrustBundleListByServiceResponse) ProtoReflect() protoreflect.Message { - mi := &file_private_pbpeering_peering_proto_msgTypes[16] + mi := &file_private_pbpeering_peering_proto_msgTypes[17] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1292,7 +1363,7 @@ func (x *TrustBundleListByServiceResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use TrustBundleListByServiceResponse.ProtoReflect.Descriptor instead. func (*TrustBundleListByServiceResponse) Descriptor() ([]byte, []int) { - return file_private_pbpeering_peering_proto_rawDescGZIP(), []int{16} + return file_private_pbpeering_peering_proto_rawDescGZIP(), []int{17} } func (x *TrustBundleListByServiceResponse) GetIndex() uint64 { @@ -1321,7 +1392,7 @@ type TrustBundleReadRequest struct { func (x *TrustBundleReadRequest) Reset() { *x = TrustBundleReadRequest{} if protoimpl.UnsafeEnabled { - mi := &file_private_pbpeering_peering_proto_msgTypes[17] + mi := &file_private_pbpeering_peering_proto_msgTypes[18] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1334,7 +1405,7 @@ func (x *TrustBundleReadRequest) String() string { func (*TrustBundleReadRequest) ProtoMessage() {} func (x *TrustBundleReadRequest) ProtoReflect() protoreflect.Message { - mi := &file_private_pbpeering_peering_proto_msgTypes[17] + mi := &file_private_pbpeering_peering_proto_msgTypes[18] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1347,7 +1418,7 @@ func (x *TrustBundleReadRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use TrustBundleReadRequest.ProtoReflect.Descriptor instead. func (*TrustBundleReadRequest) Descriptor() ([]byte, []int) { - return file_private_pbpeering_peering_proto_rawDescGZIP(), []int{17} + return file_private_pbpeering_peering_proto_rawDescGZIP(), []int{18} } func (x *TrustBundleReadRequest) GetName() string { @@ -1376,7 +1447,7 @@ type TrustBundleReadResponse struct { func (x *TrustBundleReadResponse) Reset() { *x = TrustBundleReadResponse{} if protoimpl.UnsafeEnabled { - mi := &file_private_pbpeering_peering_proto_msgTypes[18] + mi := &file_private_pbpeering_peering_proto_msgTypes[19] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1389,7 +1460,7 @@ func (x *TrustBundleReadResponse) String() string { func (*TrustBundleReadResponse) ProtoMessage() {} func (x *TrustBundleReadResponse) ProtoReflect() protoreflect.Message { - mi := &file_private_pbpeering_peering_proto_msgTypes[18] + mi := &file_private_pbpeering_peering_proto_msgTypes[19] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1402,7 +1473,7 @@ func (x *TrustBundleReadResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use TrustBundleReadResponse.ProtoReflect.Descriptor instead. func (*TrustBundleReadResponse) Descriptor() ([]byte, []int) { - return file_private_pbpeering_peering_proto_rawDescGZIP(), []int{18} + return file_private_pbpeering_peering_proto_rawDescGZIP(), []int{19} } func (x *TrustBundleReadResponse) GetIndex() uint64 { @@ -1431,7 +1502,7 @@ type PeeringTerminateByIDRequest struct { func (x *PeeringTerminateByIDRequest) Reset() { *x = PeeringTerminateByIDRequest{} if protoimpl.UnsafeEnabled { - mi := &file_private_pbpeering_peering_proto_msgTypes[19] + mi := &file_private_pbpeering_peering_proto_msgTypes[20] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1444,7 +1515,7 @@ func (x *PeeringTerminateByIDRequest) String() string { func (*PeeringTerminateByIDRequest) ProtoMessage() {} func (x *PeeringTerminateByIDRequest) ProtoReflect() protoreflect.Message { - mi := &file_private_pbpeering_peering_proto_msgTypes[19] + mi := &file_private_pbpeering_peering_proto_msgTypes[20] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1457,7 +1528,7 @@ func (x *PeeringTerminateByIDRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use PeeringTerminateByIDRequest.ProtoReflect.Descriptor instead. func (*PeeringTerminateByIDRequest) Descriptor() ([]byte, []int) { - return file_private_pbpeering_peering_proto_rawDescGZIP(), []int{19} + return file_private_pbpeering_peering_proto_rawDescGZIP(), []int{20} } func (x *PeeringTerminateByIDRequest) GetID() string { @@ -1476,7 +1547,7 @@ type PeeringTerminateByIDResponse struct { func (x *PeeringTerminateByIDResponse) Reset() { *x = PeeringTerminateByIDResponse{} if protoimpl.UnsafeEnabled { - mi := &file_private_pbpeering_peering_proto_msgTypes[20] + mi := &file_private_pbpeering_peering_proto_msgTypes[21] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1489,7 +1560,7 @@ func (x *PeeringTerminateByIDResponse) String() string { func (*PeeringTerminateByIDResponse) ProtoMessage() {} func (x *PeeringTerminateByIDResponse) ProtoReflect() protoreflect.Message { - mi := &file_private_pbpeering_peering_proto_msgTypes[20] + mi := &file_private_pbpeering_peering_proto_msgTypes[21] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1502,7 +1573,7 @@ func (x *PeeringTerminateByIDResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use PeeringTerminateByIDResponse.ProtoReflect.Descriptor instead. func (*PeeringTerminateByIDResponse) Descriptor() ([]byte, []int) { - return file_private_pbpeering_peering_proto_rawDescGZIP(), []int{20} + return file_private_pbpeering_peering_proto_rawDescGZIP(), []int{21} } type PeeringTrustBundleWriteRequest struct { @@ -1516,7 +1587,7 @@ type PeeringTrustBundleWriteRequest struct { func (x *PeeringTrustBundleWriteRequest) Reset() { *x = PeeringTrustBundleWriteRequest{} if protoimpl.UnsafeEnabled { - mi := &file_private_pbpeering_peering_proto_msgTypes[21] + mi := &file_private_pbpeering_peering_proto_msgTypes[22] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1529,7 +1600,7 @@ func (x *PeeringTrustBundleWriteRequest) String() string { func (*PeeringTrustBundleWriteRequest) ProtoMessage() {} func (x *PeeringTrustBundleWriteRequest) ProtoReflect() protoreflect.Message { - mi := &file_private_pbpeering_peering_proto_msgTypes[21] + mi := &file_private_pbpeering_peering_proto_msgTypes[22] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1542,7 +1613,7 @@ func (x *PeeringTrustBundleWriteRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use PeeringTrustBundleWriteRequest.ProtoReflect.Descriptor instead. func (*PeeringTrustBundleWriteRequest) Descriptor() ([]byte, []int) { - return file_private_pbpeering_peering_proto_rawDescGZIP(), []int{21} + return file_private_pbpeering_peering_proto_rawDescGZIP(), []int{22} } func (x *PeeringTrustBundleWriteRequest) GetPeeringTrustBundle() *PeeringTrustBundle { @@ -1561,7 +1632,7 @@ type PeeringTrustBundleWriteResponse struct { func (x *PeeringTrustBundleWriteResponse) Reset() { *x = PeeringTrustBundleWriteResponse{} if protoimpl.UnsafeEnabled { - mi := &file_private_pbpeering_peering_proto_msgTypes[22] + mi := &file_private_pbpeering_peering_proto_msgTypes[23] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1574,7 +1645,7 @@ func (x *PeeringTrustBundleWriteResponse) String() string { func (*PeeringTrustBundleWriteResponse) ProtoMessage() {} func (x *PeeringTrustBundleWriteResponse) ProtoReflect() protoreflect.Message { - mi := &file_private_pbpeering_peering_proto_msgTypes[22] + mi := &file_private_pbpeering_peering_proto_msgTypes[23] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1587,7 +1658,7 @@ func (x *PeeringTrustBundleWriteResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use PeeringTrustBundleWriteResponse.ProtoReflect.Descriptor instead. func (*PeeringTrustBundleWriteResponse) Descriptor() ([]byte, []int) { - return file_private_pbpeering_peering_proto_rawDescGZIP(), []int{22} + return file_private_pbpeering_peering_proto_rawDescGZIP(), []int{23} } type PeeringTrustBundleDeleteRequest struct { @@ -1602,7 +1673,7 @@ type PeeringTrustBundleDeleteRequest struct { func (x *PeeringTrustBundleDeleteRequest) Reset() { *x = PeeringTrustBundleDeleteRequest{} if protoimpl.UnsafeEnabled { - mi := &file_private_pbpeering_peering_proto_msgTypes[23] + mi := &file_private_pbpeering_peering_proto_msgTypes[24] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1615,7 +1686,7 @@ func (x *PeeringTrustBundleDeleteRequest) String() string { func (*PeeringTrustBundleDeleteRequest) ProtoMessage() {} func (x *PeeringTrustBundleDeleteRequest) ProtoReflect() protoreflect.Message { - mi := &file_private_pbpeering_peering_proto_msgTypes[23] + mi := &file_private_pbpeering_peering_proto_msgTypes[24] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1628,7 +1699,7 @@ func (x *PeeringTrustBundleDeleteRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use PeeringTrustBundleDeleteRequest.ProtoReflect.Descriptor instead. func (*PeeringTrustBundleDeleteRequest) Descriptor() ([]byte, []int) { - return file_private_pbpeering_peering_proto_rawDescGZIP(), []int{23} + return file_private_pbpeering_peering_proto_rawDescGZIP(), []int{24} } func (x *PeeringTrustBundleDeleteRequest) GetName() string { @@ -1654,7 +1725,7 @@ type PeeringTrustBundleDeleteResponse struct { func (x *PeeringTrustBundleDeleteResponse) Reset() { *x = PeeringTrustBundleDeleteResponse{} if protoimpl.UnsafeEnabled { - mi := &file_private_pbpeering_peering_proto_msgTypes[24] + mi := &file_private_pbpeering_peering_proto_msgTypes[25] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1667,7 +1738,7 @@ func (x *PeeringTrustBundleDeleteResponse) String() string { func (*PeeringTrustBundleDeleteResponse) ProtoMessage() {} func (x *PeeringTrustBundleDeleteResponse) ProtoReflect() protoreflect.Message { - mi := &file_private_pbpeering_peering_proto_msgTypes[24] + mi := &file_private_pbpeering_peering_proto_msgTypes[25] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1680,7 +1751,7 @@ func (x *PeeringTrustBundleDeleteResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use PeeringTrustBundleDeleteResponse.ProtoReflect.Descriptor instead. func (*PeeringTrustBundleDeleteResponse) Descriptor() ([]byte, []int) { - return file_private_pbpeering_peering_proto_rawDescGZIP(), []int{24} + return file_private_pbpeering_peering_proto_rawDescGZIP(), []int{25} } // mog annotation: @@ -1708,7 +1779,7 @@ type GenerateTokenRequest struct { func (x *GenerateTokenRequest) Reset() { *x = GenerateTokenRequest{} if protoimpl.UnsafeEnabled { - mi := &file_private_pbpeering_peering_proto_msgTypes[25] + mi := &file_private_pbpeering_peering_proto_msgTypes[26] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1721,7 +1792,7 @@ func (x *GenerateTokenRequest) String() string { func (*GenerateTokenRequest) ProtoMessage() {} func (x *GenerateTokenRequest) ProtoReflect() protoreflect.Message { - mi := &file_private_pbpeering_peering_proto_msgTypes[25] + mi := &file_private_pbpeering_peering_proto_msgTypes[26] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1734,7 +1805,7 @@ func (x *GenerateTokenRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GenerateTokenRequest.ProtoReflect.Descriptor instead. func (*GenerateTokenRequest) Descriptor() ([]byte, []int) { - return file_private_pbpeering_peering_proto_rawDescGZIP(), []int{25} + return file_private_pbpeering_peering_proto_rawDescGZIP(), []int{26} } func (x *GenerateTokenRequest) GetPeerName() string { @@ -1783,7 +1854,7 @@ type GenerateTokenResponse struct { func (x *GenerateTokenResponse) Reset() { *x = GenerateTokenResponse{} if protoimpl.UnsafeEnabled { - mi := &file_private_pbpeering_peering_proto_msgTypes[26] + mi := &file_private_pbpeering_peering_proto_msgTypes[27] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1796,7 +1867,7 @@ func (x *GenerateTokenResponse) String() string { func (*GenerateTokenResponse) ProtoMessage() {} func (x *GenerateTokenResponse) ProtoReflect() protoreflect.Message { - mi := &file_private_pbpeering_peering_proto_msgTypes[26] + mi := &file_private_pbpeering_peering_proto_msgTypes[27] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1809,7 +1880,7 @@ func (x *GenerateTokenResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GenerateTokenResponse.ProtoReflect.Descriptor instead. func (*GenerateTokenResponse) Descriptor() ([]byte, []int) { - return file_private_pbpeering_peering_proto_rawDescGZIP(), []int{26} + return file_private_pbpeering_peering_proto_rawDescGZIP(), []int{27} } func (x *GenerateTokenResponse) GetPeeringToken() string { @@ -1842,7 +1913,7 @@ type EstablishRequest struct { func (x *EstablishRequest) Reset() { *x = EstablishRequest{} if protoimpl.UnsafeEnabled { - mi := &file_private_pbpeering_peering_proto_msgTypes[27] + mi := &file_private_pbpeering_peering_proto_msgTypes[28] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1855,7 +1926,7 @@ func (x *EstablishRequest) String() string { func (*EstablishRequest) ProtoMessage() {} func (x *EstablishRequest) ProtoReflect() protoreflect.Message { - mi := &file_private_pbpeering_peering_proto_msgTypes[27] + mi := &file_private_pbpeering_peering_proto_msgTypes[28] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1868,7 +1939,7 @@ func (x *EstablishRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use EstablishRequest.ProtoReflect.Descriptor instead. func (*EstablishRequest) Descriptor() ([]byte, []int) { - return file_private_pbpeering_peering_proto_rawDescGZIP(), []int{27} + return file_private_pbpeering_peering_proto_rawDescGZIP(), []int{28} } func (x *EstablishRequest) GetPeerName() string { @@ -1913,7 +1984,7 @@ type EstablishResponse struct { func (x *EstablishResponse) Reset() { *x = EstablishResponse{} if protoimpl.UnsafeEnabled { - mi := &file_private_pbpeering_peering_proto_msgTypes[28] + mi := &file_private_pbpeering_peering_proto_msgTypes[29] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1926,7 +1997,7 @@ func (x *EstablishResponse) String() string { func (*EstablishResponse) ProtoMessage() {} func (x *EstablishResponse) ProtoReflect() protoreflect.Message { - mi := &file_private_pbpeering_peering_proto_msgTypes[28] + mi := &file_private_pbpeering_peering_proto_msgTypes[29] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1939,7 +2010,7 @@ func (x *EstablishResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use EstablishResponse.ProtoReflect.Descriptor instead. func (*EstablishResponse) Descriptor() ([]byte, []int) { - return file_private_pbpeering_peering_proto_rawDescGZIP(), []int{28} + return file_private_pbpeering_peering_proto_rawDescGZIP(), []int{29} } // GenerateTokenRequest encodes a request to persist a peering establishment @@ -1957,7 +2028,7 @@ type SecretsWriteRequest_GenerateTokenRequest struct { func (x *SecretsWriteRequest_GenerateTokenRequest) Reset() { *x = SecretsWriteRequest_GenerateTokenRequest{} if protoimpl.UnsafeEnabled { - mi := &file_private_pbpeering_peering_proto_msgTypes[29] + mi := &file_private_pbpeering_peering_proto_msgTypes[30] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1970,7 +2041,7 @@ func (x *SecretsWriteRequest_GenerateTokenRequest) String() string { func (*SecretsWriteRequest_GenerateTokenRequest) ProtoMessage() {} func (x *SecretsWriteRequest_GenerateTokenRequest) ProtoReflect() protoreflect.Message { - mi := &file_private_pbpeering_peering_proto_msgTypes[29] + mi := &file_private_pbpeering_peering_proto_msgTypes[30] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2011,7 +2082,7 @@ type SecretsWriteRequest_ExchangeSecretRequest struct { func (x *SecretsWriteRequest_ExchangeSecretRequest) Reset() { *x = SecretsWriteRequest_ExchangeSecretRequest{} if protoimpl.UnsafeEnabled { - mi := &file_private_pbpeering_peering_proto_msgTypes[30] + mi := &file_private_pbpeering_peering_proto_msgTypes[31] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2024,7 +2095,7 @@ func (x *SecretsWriteRequest_ExchangeSecretRequest) String() string { func (*SecretsWriteRequest_ExchangeSecretRequest) ProtoMessage() {} func (x *SecretsWriteRequest_ExchangeSecretRequest) ProtoReflect() protoreflect.Message { - mi := &file_private_pbpeering_peering_proto_msgTypes[30] + mi := &file_private_pbpeering_peering_proto_msgTypes[31] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2070,7 +2141,7 @@ type SecretsWriteRequest_PromotePendingRequest struct { func (x *SecretsWriteRequest_PromotePendingRequest) Reset() { *x = SecretsWriteRequest_PromotePendingRequest{} if protoimpl.UnsafeEnabled { - mi := &file_private_pbpeering_peering_proto_msgTypes[31] + mi := &file_private_pbpeering_peering_proto_msgTypes[32] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2083,7 +2154,7 @@ func (x *SecretsWriteRequest_PromotePendingRequest) String() string { func (*SecretsWriteRequest_PromotePendingRequest) ProtoMessage() {} func (x *SecretsWriteRequest_PromotePendingRequest) ProtoReflect() protoreflect.Message { - mi := &file_private_pbpeering_peering_proto_msgTypes[31] + mi := &file_private_pbpeering_peering_proto_msgTypes[32] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2122,7 +2193,7 @@ type SecretsWriteRequest_EstablishRequest struct { func (x *SecretsWriteRequest_EstablishRequest) Reset() { *x = SecretsWriteRequest_EstablishRequest{} if protoimpl.UnsafeEnabled { - mi := &file_private_pbpeering_peering_proto_msgTypes[32] + mi := &file_private_pbpeering_peering_proto_msgTypes[33] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2135,7 +2206,7 @@ func (x *SecretsWriteRequest_EstablishRequest) String() string { func (*SecretsWriteRequest_EstablishRequest) ProtoMessage() {} func (x *SecretsWriteRequest_EstablishRequest) ProtoReflect() protoreflect.Message { - mi := &file_private_pbpeering_peering_proto_msgTypes[32] + mi := &file_private_pbpeering_peering_proto_msgTypes[33] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2170,7 +2241,7 @@ type PeeringSecrets_Establishment struct { func (x *PeeringSecrets_Establishment) Reset() { *x = PeeringSecrets_Establishment{} if protoimpl.UnsafeEnabled { - mi := &file_private_pbpeering_peering_proto_msgTypes[33] + mi := &file_private_pbpeering_peering_proto_msgTypes[34] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2183,7 +2254,7 @@ func (x *PeeringSecrets_Establishment) String() string { func (*PeeringSecrets_Establishment) ProtoMessage() {} func (x *PeeringSecrets_Establishment) ProtoReflect() protoreflect.Message { - mi := &file_private_pbpeering_peering_proto_msgTypes[33] + mi := &file_private_pbpeering_peering_proto_msgTypes[34] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2229,7 +2300,7 @@ type PeeringSecrets_Stream struct { func (x *PeeringSecrets_Stream) Reset() { *x = PeeringSecrets_Stream{} if protoimpl.UnsafeEnabled { - mi := &file_private_pbpeering_peering_proto_msgTypes[34] + mi := &file_private_pbpeering_peering_proto_msgTypes[35] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2242,7 +2313,7 @@ func (x *PeeringSecrets_Stream) String() string { func (*PeeringSecrets_Stream) ProtoMessage() {} func (x *PeeringSecrets_Stream) ProtoReflect() protoreflect.Message { - mi := &file_private_pbpeering_peering_proto_msgTypes[34] + mi := &file_private_pbpeering_peering_proto_msgTypes[35] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2408,289 +2479,298 @@ var file_private_pbpeering_peering_proto_rawDesc = []byte{ 0x65, 0x73, 0x1a, 0x37, 0x0a, 0x09, 0x4d, 0x65, 0x74, 0x61, 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, 0x22, 0x4a, 0x0a, 0x0a, 0x52, - 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1c, 0x0a, 0x09, 0x50, 0x61, 0x72, - 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x50, 0x61, - 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x44, 0x61, 0x74, 0x61, 0x63, - 0x65, 0x6e, 0x74, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x44, 0x61, 0x74, - 0x61, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x22, 0x9e, 0x02, 0x0a, 0x0c, 0x53, 0x74, 0x72, 0x65, - 0x61, 0x6d, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x2a, 0x0a, 0x10, 0x49, 0x6d, 0x70, 0x6f, - 0x72, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x10, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x73, 0x12, 0x2a, 0x0a, 0x10, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x10, - 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, - 0x12, 0x40, 0x0a, 0x0d, 0x4c, 0x61, 0x73, 0x74, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, - 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, - 0x61, 0x6d, 0x70, 0x52, 0x0d, 0x4c, 0x61, 0x73, 0x74, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, - 0x61, 0x74, 0x12, 0x3c, 0x0a, 0x0b, 0x4c, 0x61, 0x73, 0x74, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, - 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, - 0x61, 0x6d, 0x70, 0x52, 0x0b, 0x4c, 0x61, 0x73, 0x74, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, - 0x12, 0x36, 0x0a, 0x08, 0x4c, 0x61, 0x73, 0x74, 0x53, 0x65, 0x6e, 0x64, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x08, - 0x4c, 0x61, 0x73, 0x74, 0x53, 0x65, 0x6e, 0x64, 0x22, 0xfe, 0x01, 0x0a, 0x12, 0x50, 0x65, 0x65, - 0x72, 0x69, 0x6e, 0x67, 0x54, 0x72, 0x75, 0x73, 0x74, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x12, - 0x20, 0x0a, 0x0b, 0x54, 0x72, 0x75, 0x73, 0x74, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x54, 0x72, 0x75, 0x73, 0x74, 0x44, 0x6f, 0x6d, 0x61, 0x69, - 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x50, 0x65, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x50, 0x65, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, - 0x09, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x09, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x52, - 0x6f, 0x6f, 0x74, 0x50, 0x45, 0x4d, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x52, - 0x6f, 0x6f, 0x74, 0x50, 0x45, 0x4d, 0x73, 0x12, 0x2c, 0x0a, 0x11, 0x45, 0x78, 0x70, 0x6f, 0x72, - 0x74, 0x65, 0x64, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x11, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x50, 0x61, 0x72, 0x74, - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x49, - 0x6e, 0x64, 0x65, 0x78, 0x18, 0x06, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x20, 0x0a, 0x0b, 0x4d, 0x6f, 0x64, 0x69, 0x66, - 0x79, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x07, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x4d, 0x6f, - 0x64, 0x69, 0x66, 0x79, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x36, 0x0a, 0x16, 0x50, 0x65, 0x65, - 0x72, 0x69, 0x6e, 0x67, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, - 0x73, 0x65, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, - 0x73, 0x22, 0x46, 0x0a, 0x12, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x61, 0x64, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x50, - 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, - 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x5b, 0x0a, 0x13, 0x50, 0x65, 0x65, - 0x72, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x44, 0x0a, 0x07, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x2a, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, - 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x70, 0x65, - 0x65, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x07, 0x50, - 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x32, 0x0a, 0x12, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, - 0x67, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, - 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x09, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x73, 0x0a, 0x13, 0x50, 0x65, - 0x65, 0x72, 0x69, 0x6e, 0x67, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x46, 0x0a, 0x08, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, + 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x93, 0x01, 0x0a, 0x0a, + 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1c, 0x0a, 0x09, 0x50, 0x61, + 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x50, + 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x44, 0x61, 0x74, 0x61, + 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x44, 0x61, + 0x74, 0x61, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x12, 0x47, 0x0a, 0x08, 0x4c, 0x6f, 0x63, 0x61, + 0x6c, 0x69, 0x74, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x68, 0x61, 0x73, + 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, + 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x4c, + 0x6f, 0x63, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x52, 0x08, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x69, 0x74, + 0x79, 0x22, 0x36, 0x0a, 0x08, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x12, 0x16, 0x0a, + 0x06, 0x52, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x52, + 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x5a, 0x6f, 0x6e, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x5a, 0x6f, 0x6e, 0x65, 0x22, 0x9e, 0x02, 0x0a, 0x0c, 0x53, 0x74, + 0x72, 0x65, 0x61, 0x6d, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x2a, 0x0a, 0x10, 0x49, 0x6d, + 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x09, 0x52, 0x10, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x53, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x2a, 0x0a, 0x10, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, + 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, + 0x52, 0x10, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x73, 0x12, 0x40, 0x0a, 0x0d, 0x4c, 0x61, 0x73, 0x74, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, + 0x65, 0x61, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0d, 0x4c, 0x61, 0x73, 0x74, 0x48, 0x65, 0x61, 0x72, 0x74, + 0x62, 0x65, 0x61, 0x74, 0x12, 0x3c, 0x0a, 0x0b, 0x4c, 0x61, 0x73, 0x74, 0x52, 0x65, 0x63, 0x65, + 0x69, 0x76, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0b, 0x4c, 0x61, 0x73, 0x74, 0x52, 0x65, 0x63, 0x65, 0x69, + 0x76, 0x65, 0x12, 0x36, 0x0a, 0x08, 0x4c, 0x61, 0x73, 0x74, 0x53, 0x65, 0x6e, 0x64, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, + 0x52, 0x08, 0x4c, 0x61, 0x73, 0x74, 0x53, 0x65, 0x6e, 0x64, 0x22, 0xfe, 0x01, 0x0a, 0x12, 0x50, + 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x54, 0x72, 0x75, 0x73, 0x74, 0x42, 0x75, 0x6e, 0x64, 0x6c, + 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x54, 0x72, 0x75, 0x73, 0x74, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x54, 0x72, 0x75, 0x73, 0x74, 0x44, 0x6f, 0x6d, + 0x61, 0x69, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x50, 0x65, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x50, 0x65, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, + 0x1c, 0x0a, 0x09, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x09, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, + 0x08, 0x52, 0x6f, 0x6f, 0x74, 0x50, 0x45, 0x4d, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x08, 0x52, 0x6f, 0x6f, 0x74, 0x50, 0x45, 0x4d, 0x73, 0x12, 0x2c, 0x0a, 0x11, 0x45, 0x78, 0x70, + 0x6f, 0x72, 0x74, 0x65, 0x64, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x50, 0x61, + 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x06, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x20, 0x0a, 0x0b, 0x4d, 0x6f, 0x64, + 0x69, 0x66, 0x79, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x07, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, + 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x36, 0x0a, 0x16, 0x50, + 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, + 0x65, 0x73, 0x73, 0x65, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, + 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, + 0x73, 0x65, 0x73, 0x22, 0x46, 0x0a, 0x12, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x65, + 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, + 0x09, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x09, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x5b, 0x0a, 0x13, 0x50, + 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x44, 0x0a, 0x07, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x52, - 0x08, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x49, 0x6e, 0x64, - 0x65, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x22, - 0xca, 0x02, 0x0a, 0x13, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x57, 0x72, 0x69, 0x74, 0x65, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x44, 0x0a, 0x07, 0x50, 0x65, 0x65, 0x72, 0x69, - 0x6e, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, - 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, - 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x50, 0x65, 0x65, - 0x72, 0x69, 0x6e, 0x67, 0x52, 0x07, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x5e, 0x0a, - 0x0e, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, + 0x07, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x32, 0x0a, 0x12, 0x50, 0x65, 0x65, 0x72, + 0x69, 0x6e, 0x67, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, + 0x0a, 0x09, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x09, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x73, 0x0a, 0x13, + 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x46, 0x0a, 0x08, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, - 0x6c, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, - 0x73, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x0e, 0x53, - 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x54, 0x0a, - 0x04, 0x4d, 0x65, 0x74, 0x61, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x40, 0x2e, 0x68, 0x61, + 0x6c, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, + 0x67, 0x52, 0x08, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x49, + 0x6e, 0x64, 0x65, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x49, 0x6e, 0x64, 0x65, + 0x78, 0x22, 0xca, 0x02, 0x0a, 0x13, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x57, 0x72, 0x69, + 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x44, 0x0a, 0x07, 0x50, 0x65, 0x65, + 0x72, 0x69, 0x6e, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x68, 0x61, 0x73, + 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, + 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x50, + 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x07, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x12, + 0x5e, 0x0a, 0x0e, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, + 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, + 0x6e, 0x61, 0x6c, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x53, 0x65, 0x63, 0x72, + 0x65, 0x74, 0x73, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, + 0x0e, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x54, 0x0a, 0x04, 0x4d, 0x65, 0x74, 0x61, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x40, 0x2e, + 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, + 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x69, 0x6e, + 0x67, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, + 0x04, 0x4d, 0x65, 0x74, 0x61, 0x1a, 0x37, 0x0a, 0x09, 0x4d, 0x65, 0x74, 0x61, 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, 0x22, 0x16, + 0x0a, 0x14, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x48, 0x0a, 0x14, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, + 0x67, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, + 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, + 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x17, 0x0a, 0x15, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x93, 0x01, 0x0a, 0x1f, 0x54, 0x72, + 0x75, 0x73, 0x74, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x79, 0x53, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, + 0x0b, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0b, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, + 0x1c, 0x0a, 0x09, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x09, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1c, 0x0a, + 0x09, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x09, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x4b, + 0x69, 0x6e, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4b, 0x69, 0x6e, 0x64, 0x22, + 0x89, 0x01, 0x0a, 0x20, 0x54, 0x72, 0x75, 0x73, 0x74, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x4c, + 0x69, 0x73, 0x74, 0x42, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x04, 0x52, 0x05, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x4f, 0x0a, 0x07, 0x42, 0x75, + 0x6e, 0x64, 0x6c, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x2e, - 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x4d, - 0x65, 0x74, 0x61, 0x1a, 0x37, 0x0a, 0x09, 0x4d, 0x65, 0x74, 0x61, 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, 0x22, 0x16, 0x0a, 0x14, - 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x48, 0x0a, 0x14, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x44, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, - 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, - 0x12, 0x1c, 0x0a, 0x09, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x09, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x17, - 0x0a, 0x15, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x93, 0x01, 0x0a, 0x1f, 0x54, 0x72, 0x75, 0x73, - 0x74, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x79, 0x53, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0b, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, - 0x09, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x09, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x50, - 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, - 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x4b, 0x69, 0x6e, - 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4b, 0x69, 0x6e, 0x64, 0x22, 0x89, 0x01, - 0x0a, 0x20, 0x54, 0x72, 0x75, 0x73, 0x74, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x4c, 0x69, 0x73, - 0x74, 0x42, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x54, 0x72, 0x75, 0x73, 0x74, 0x42, 0x75, 0x6e, 0x64, + 0x6c, 0x65, 0x52, 0x07, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x73, 0x22, 0x4a, 0x0a, 0x16, 0x54, + 0x72, 0x75, 0x73, 0x74, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x52, 0x65, 0x61, 0x64, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x50, 0x61, 0x72, + 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x50, 0x61, + 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x7e, 0x0a, 0x17, 0x54, 0x72, 0x75, 0x73, 0x74, + 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x52, 0x65, 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x04, 0x52, 0x05, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x4f, 0x0a, 0x07, 0x42, 0x75, 0x6e, 0x64, - 0x6c, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x68, 0x61, 0x73, 0x68, - 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, - 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x50, 0x65, - 0x65, 0x72, 0x69, 0x6e, 0x67, 0x54, 0x72, 0x75, 0x73, 0x74, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, - 0x52, 0x07, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x73, 0x22, 0x4a, 0x0a, 0x16, 0x54, 0x72, 0x75, - 0x73, 0x74, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x52, 0x65, 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x50, 0x61, 0x72, 0x74, 0x69, - 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x50, 0x61, 0x72, 0x74, - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x7e, 0x0a, 0x17, 0x54, 0x72, 0x75, 0x73, 0x74, 0x42, 0x75, - 0x6e, 0x64, 0x6c, 0x65, 0x52, 0x65, 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x14, 0x0a, 0x05, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, - 0x05, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x4d, 0x0a, 0x06, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, - 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, - 0x61, 0x6c, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x69, - 0x6e, 0x67, 0x54, 0x72, 0x75, 0x73, 0x74, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x52, 0x06, 0x42, - 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x22, 0x2d, 0x0a, 0x1b, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, - 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x42, 0x79, 0x49, 0x44, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x02, 0x49, 0x44, 0x22, 0x1e, 0x0a, 0x1c, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x54, - 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x42, 0x79, 0x49, 0x44, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x87, 0x01, 0x0a, 0x1e, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, - 0x54, 0x72, 0x75, 0x73, 0x74, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x57, 0x72, 0x69, 0x74, 0x65, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x65, 0x0a, 0x12, 0x50, 0x65, 0x65, 0x72, 0x69, - 0x6e, 0x67, 0x54, 0x72, 0x75, 0x73, 0x74, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, - 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, - 0x70, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x54, - 0x72, 0x75, 0x73, 0x74, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x52, 0x12, 0x50, 0x65, 0x65, 0x72, - 0x69, 0x6e, 0x67, 0x54, 0x72, 0x75, 0x73, 0x74, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x22, 0x21, - 0x0a, 0x1f, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x54, 0x72, 0x75, 0x73, 0x74, 0x42, 0x75, - 0x6e, 0x64, 0x6c, 0x65, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x53, 0x0a, 0x1f, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x54, 0x72, 0x75, 0x73, - 0x74, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x50, 0x61, 0x72, 0x74, - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x50, 0x61, 0x72, - 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x22, 0x0a, 0x20, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, - 0x67, 0x54, 0x72, 0x75, 0x73, 0x74, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x44, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x9a, 0x02, 0x0a, 0x14, 0x47, - 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x50, 0x65, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x50, 0x65, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, - 0x1c, 0x0a, 0x09, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x09, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x55, 0x0a, - 0x04, 0x4d, 0x65, 0x74, 0x61, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x41, 0x2e, 0x68, 0x61, - 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, - 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x2e, - 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, - 0x4d, 0x65, 0x74, 0x61, 0x12, 0x38, 0x0a, 0x17, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x45, 0x78, - 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x18, - 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x17, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x45, 0x78, 0x74, - 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x1a, 0x37, - 0x0a, 0x09, 0x4d, 0x65, 0x74, 0x61, 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, 0x22, 0x3b, 0x0a, 0x15, 0x47, 0x65, 0x6e, 0x65, 0x72, - 0x61, 0x74, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x22, 0x0a, 0x0c, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x54, 0x6f, 0x6b, 0x65, 0x6e, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x54, - 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0xfc, 0x01, 0x0a, 0x10, 0x45, 0x73, 0x74, 0x61, 0x62, 0x6c, 0x69, - 0x73, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x50, 0x65, 0x65, - 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x50, 0x65, 0x65, - 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, - 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x50, 0x65, 0x65, - 0x72, 0x69, 0x6e, 0x67, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x50, 0x61, 0x72, - 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x50, 0x61, - 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x51, 0x0a, 0x04, 0x4d, 0x65, 0x74, 0x61, 0x18, - 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3d, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, + 0x04, 0x52, 0x05, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x4d, 0x0a, 0x06, 0x42, 0x75, 0x6e, 0x64, + 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, + 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, + 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x50, 0x65, 0x65, + 0x72, 0x69, 0x6e, 0x67, 0x54, 0x72, 0x75, 0x73, 0x74, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x52, + 0x06, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x22, 0x2d, 0x0a, 0x1b, 0x50, 0x65, 0x65, 0x72, 0x69, + 0x6e, 0x67, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x42, 0x79, 0x49, 0x44, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x22, 0x1e, 0x0a, 0x1c, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, + 0x67, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x42, 0x79, 0x49, 0x44, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x87, 0x01, 0x0a, 0x1e, 0x50, 0x65, 0x65, 0x72, 0x69, + 0x6e, 0x67, 0x54, 0x72, 0x75, 0x73, 0x74, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x57, 0x72, 0x69, + 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x65, 0x0a, 0x12, 0x50, 0x65, 0x65, + 0x72, 0x69, 0x6e, 0x67, 0x54, 0x72, 0x75, 0x73, 0x74, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, - 0x6c, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x45, 0x73, 0x74, 0x61, 0x62, 0x6c, - 0x69, 0x73, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x4d, 0x65, 0x74, 0x61, 0x1a, 0x37, 0x0a, 0x09, 0x4d, 0x65, - 0x74, 0x61, 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, 0x22, 0x13, 0x0a, 0x11, 0x45, 0x73, 0x74, 0x61, 0x62, 0x6c, 0x69, 0x73, 0x68, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2a, 0x73, 0x0a, 0x0c, 0x50, 0x65, 0x65, 0x72, - 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x0d, 0x0a, 0x09, 0x55, 0x4e, 0x44, 0x45, - 0x46, 0x49, 0x4e, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x50, 0x45, 0x4e, 0x44, 0x49, - 0x4e, 0x47, 0x10, 0x01, 0x12, 0x10, 0x0a, 0x0c, 0x45, 0x53, 0x54, 0x41, 0x42, 0x4c, 0x49, 0x53, - 0x48, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x12, 0x0a, 0x0a, 0x06, 0x41, 0x43, 0x54, 0x49, 0x56, 0x45, - 0x10, 0x03, 0x12, 0x0b, 0x0a, 0x07, 0x46, 0x41, 0x49, 0x4c, 0x49, 0x4e, 0x47, 0x10, 0x04, 0x12, - 0x0c, 0x0a, 0x08, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x49, 0x4e, 0x47, 0x10, 0x05, 0x12, 0x0e, 0x0a, - 0x0a, 0x54, 0x45, 0x52, 0x4d, 0x49, 0x4e, 0x41, 0x54, 0x45, 0x44, 0x10, 0x06, 0x32, 0x83, 0x09, - 0x0a, 0x0e, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x12, 0x8a, 0x01, 0x0a, 0x0d, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x54, 0x6f, 0x6b, - 0x65, 0x6e, 0x12, 0x37, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, - 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x70, - 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x54, - 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x38, 0x2e, 0x68, 0x61, - 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, - 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x2e, - 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xe2, 0x86, 0x04, 0x02, 0x08, 0x03, 0x12, 0x7e, 0x0a, - 0x09, 0x45, 0x73, 0x74, 0x61, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x12, 0x33, 0x2e, 0x68, 0x61, 0x73, - 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, - 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x45, - 0x73, 0x74, 0x61, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x34, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, - 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x70, 0x65, 0x65, 0x72, - 0x69, 0x6e, 0x67, 0x2e, 0x45, 0x73, 0x74, 0x61, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xe2, 0x86, 0x04, 0x02, 0x08, 0x03, 0x12, 0x84, 0x01, - 0x0a, 0x0b, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x61, 0x64, 0x12, 0x35, 0x2e, + 0x6c, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, + 0x67, 0x54, 0x72, 0x75, 0x73, 0x74, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x52, 0x12, 0x50, 0x65, + 0x65, 0x72, 0x69, 0x6e, 0x67, 0x54, 0x72, 0x75, 0x73, 0x74, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, + 0x22, 0x21, 0x0a, 0x1f, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x54, 0x72, 0x75, 0x73, 0x74, + 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x53, 0x0a, 0x1f, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x54, 0x72, + 0x75, 0x73, 0x74, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x50, 0x61, + 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x50, + 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x22, 0x0a, 0x20, 0x50, 0x65, 0x65, 0x72, + 0x69, 0x6e, 0x67, 0x54, 0x72, 0x75, 0x73, 0x74, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x44, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x9a, 0x02, 0x0a, + 0x14, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x50, 0x65, 0x65, 0x72, 0x4e, 0x61, 0x6d, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x50, 0x65, 0x65, 0x72, 0x4e, 0x61, 0x6d, + 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x55, 0x0a, 0x04, 0x4d, 0x65, 0x74, 0x61, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x41, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x69, 0x6e, - 0x67, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x61, 0x64, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x36, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, - 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, - 0x2e, 0x70, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, - 0x52, 0x65, 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xe2, 0x86, - 0x04, 0x02, 0x08, 0x02, 0x12, 0x84, 0x01, 0x0a, 0x0b, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, - 0x4c, 0x69, 0x73, 0x74, 0x12, 0x35, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, + 0x67, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x52, 0x04, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x38, 0x0a, 0x17, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, + 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x17, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x45, + 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, + 0x1a, 0x37, 0x0a, 0x09, 0x4d, 0x65, 0x74, 0x61, 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, 0x22, 0x3b, 0x0a, 0x15, 0x47, 0x65, 0x6e, + 0x65, 0x72, 0x61, 0x74, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x54, 0x6f, 0x6b, + 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, + 0x67, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0xfc, 0x01, 0x0a, 0x10, 0x45, 0x73, 0x74, 0x61, 0x62, + 0x6c, 0x69, 0x73, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x50, + 0x65, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x50, + 0x65, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x50, 0x65, 0x65, 0x72, 0x69, + 0x6e, 0x67, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x50, + 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x50, + 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, + 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x51, 0x0a, 0x04, 0x4d, 0x65, 0x74, + 0x61, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3d, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, + 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, + 0x6e, 0x61, 0x6c, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x45, 0x73, 0x74, 0x61, + 0x62, 0x6c, 0x69, 0x73, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4d, 0x65, 0x74, + 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x4d, 0x65, 0x74, 0x61, 0x1a, 0x37, 0x0a, 0x09, + 0x4d, 0x65, 0x74, 0x61, 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, 0x22, 0x13, 0x0a, 0x11, 0x45, 0x73, 0x74, 0x61, 0x62, 0x6c, 0x69, + 0x73, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2a, 0x73, 0x0a, 0x0c, 0x50, 0x65, + 0x65, 0x72, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x0d, 0x0a, 0x09, 0x55, 0x4e, + 0x44, 0x45, 0x46, 0x49, 0x4e, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x50, 0x45, 0x4e, + 0x44, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x10, 0x0a, 0x0c, 0x45, 0x53, 0x54, 0x41, 0x42, 0x4c, + 0x49, 0x53, 0x48, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x12, 0x0a, 0x0a, 0x06, 0x41, 0x43, 0x54, 0x49, + 0x56, 0x45, 0x10, 0x03, 0x12, 0x0b, 0x0a, 0x07, 0x46, 0x41, 0x49, 0x4c, 0x49, 0x4e, 0x47, 0x10, + 0x04, 0x12, 0x0c, 0x0a, 0x08, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x49, 0x4e, 0x47, 0x10, 0x05, 0x12, + 0x0e, 0x0a, 0x0a, 0x54, 0x45, 0x52, 0x4d, 0x49, 0x4e, 0x41, 0x54, 0x45, 0x44, 0x10, 0x06, 0x32, + 0x83, 0x09, 0x0a, 0x0e, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x12, 0x8a, 0x01, 0x0a, 0x0d, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x54, + 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x37, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, - 0x2e, 0x70, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, - 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x36, 0x2e, 0x68, 0x61, - 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, - 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x2e, - 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x06, 0xe2, 0x86, 0x04, 0x02, 0x08, 0x02, 0x12, 0x8a, 0x01, 0x0a, 0x0d, - 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x37, 0x2e, + 0x2e, 0x70, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, + 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x38, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x69, 0x6e, - 0x67, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x38, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, + 0x67, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xe2, 0x86, 0x04, 0x02, 0x08, 0x03, 0x12, + 0x7e, 0x0a, 0x09, 0x45, 0x73, 0x74, 0x61, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x12, 0x33, 0x2e, 0x68, + 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, + 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, + 0x2e, 0x45, 0x73, 0x74, 0x61, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x34, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, + 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x70, 0x65, + 0x65, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x45, 0x73, 0x74, 0x61, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xe2, 0x86, 0x04, 0x02, 0x08, 0x03, 0x12, + 0x84, 0x01, 0x0a, 0x0b, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x61, 0x64, 0x12, + 0x35, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, + 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x70, 0x65, 0x65, 0x72, + 0x69, 0x6e, 0x67, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x61, 0x64, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x36, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x69, - 0x6e, 0x67, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x06, 0xe2, 0x86, 0x04, 0x02, 0x08, 0x03, 0x12, 0x87, 0x01, 0x0a, 0x0c, 0x50, 0x65, 0x65, - 0x72, 0x69, 0x6e, 0x67, 0x57, 0x72, 0x69, 0x74, 0x65, 0x12, 0x36, 0x2e, 0x68, 0x61, 0x73, 0x68, - 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, - 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x50, 0x65, - 0x65, 0x72, 0x69, 0x6e, 0x67, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x37, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, - 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x70, 0x65, - 0x65, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x57, 0x72, 0x69, - 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xe2, 0x86, 0x04, 0x02, - 0x08, 0x03, 0x12, 0xab, 0x01, 0x0a, 0x18, 0x54, 0x72, 0x75, 0x73, 0x74, 0x42, 0x75, 0x6e, 0x64, - 0x6c, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, - 0x42, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, + 0x6e, 0x67, 0x52, 0x65, 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, + 0xe2, 0x86, 0x04, 0x02, 0x08, 0x02, 0x12, 0x84, 0x01, 0x0a, 0x0b, 0x50, 0x65, 0x65, 0x72, 0x69, + 0x6e, 0x67, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x35, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, + 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, + 0x61, 0x6c, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x69, + 0x6e, 0x67, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x36, 0x2e, + 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, + 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x69, 0x6e, + 0x67, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xe2, 0x86, 0x04, 0x02, 0x08, 0x02, 0x12, 0x8a, 0x01, + 0x0a, 0x0d, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, + 0x37, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x70, 0x65, 0x65, 0x72, - 0x69, 0x6e, 0x67, 0x2e, 0x54, 0x72, 0x75, 0x73, 0x74, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x4c, - 0x69, 0x73, 0x74, 0x42, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x43, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, + 0x69, 0x6e, 0x67, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x38, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, + 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, + 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x50, 0x65, 0x65, + 0x72, 0x69, 0x6e, 0x67, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x06, 0xe2, 0x86, 0x04, 0x02, 0x08, 0x03, 0x12, 0x87, 0x01, 0x0a, 0x0c, 0x50, + 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x57, 0x72, 0x69, 0x74, 0x65, 0x12, 0x36, 0x2e, 0x68, 0x61, + 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, + 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x2e, + 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x37, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, - 0x70, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x54, 0x72, 0x75, 0x73, 0x74, 0x42, 0x75, 0x6e, - 0x64, 0x6c, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xe2, 0x86, 0x04, 0x02, 0x08, 0x02, - 0x12, 0x90, 0x01, 0x0a, 0x0f, 0x54, 0x72, 0x75, 0x73, 0x74, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, - 0x52, 0x65, 0x61, 0x64, 0x12, 0x39, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, - 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, - 0x2e, 0x70, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x54, 0x72, 0x75, 0x73, 0x74, 0x42, 0x75, - 0x6e, 0x64, 0x6c, 0x65, 0x52, 0x65, 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x3a, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, - 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x70, 0x65, 0x65, 0x72, - 0x69, 0x6e, 0x67, 0x2e, 0x54, 0x72, 0x75, 0x73, 0x74, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x52, - 0x65, 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xe2, 0x86, 0x04, - 0x02, 0x08, 0x02, 0x42, 0x92, 0x02, 0x0a, 0x25, 0x63, 0x6f, 0x6d, 0x2e, 0x68, 0x61, 0x73, 0x68, - 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, - 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x42, 0x0c, 0x50, - 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x33, 0x67, - 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, - 0x6f, 0x72, 0x70, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x2f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2f, 0x70, 0x62, 0x70, 0x65, 0x65, 0x72, 0x69, - 0x6e, 0x67, 0xa2, 0x02, 0x04, 0x48, 0x43, 0x49, 0x50, 0xaa, 0x02, 0x21, 0x48, 0x61, 0x73, 0x68, - 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x49, 0x6e, 0x74, - 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0xca, 0x02, 0x21, - 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x5c, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, - 0x5c, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5c, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, - 0x67, 0xe2, 0x02, 0x2d, 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x5c, 0x43, 0x6f, - 0x6e, 0x73, 0x75, 0x6c, 0x5c, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5c, 0x50, 0x65, - 0x65, 0x72, 0x69, 0x6e, 0x67, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, - 0x61, 0xea, 0x02, 0x24, 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x3a, 0x3a, 0x43, - 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x3a, 0x3a, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x3a, - 0x3a, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x70, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x57, + 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xe2, 0x86, + 0x04, 0x02, 0x08, 0x03, 0x12, 0xab, 0x01, 0x0a, 0x18, 0x54, 0x72, 0x75, 0x73, 0x74, 0x42, 0x75, + 0x6e, 0x64, 0x6c, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x12, 0x42, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, + 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x70, 0x65, + 0x65, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x54, 0x72, 0x75, 0x73, 0x74, 0x42, 0x75, 0x6e, 0x64, 0x6c, + 0x65, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x43, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, + 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, + 0x6c, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x54, 0x72, 0x75, 0x73, 0x74, 0x42, + 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xe2, 0x86, 0x04, 0x02, + 0x08, 0x02, 0x12, 0x90, 0x01, 0x0a, 0x0f, 0x54, 0x72, 0x75, 0x73, 0x74, 0x42, 0x75, 0x6e, 0x64, + 0x6c, 0x65, 0x52, 0x65, 0x61, 0x64, 0x12, 0x39, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, + 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, + 0x61, 0x6c, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x54, 0x72, 0x75, 0x73, 0x74, + 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x52, 0x65, 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x3a, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, + 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x70, 0x65, + 0x65, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x54, 0x72, 0x75, 0x73, 0x74, 0x42, 0x75, 0x6e, 0x64, 0x6c, + 0x65, 0x52, 0x65, 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xe2, + 0x86, 0x04, 0x02, 0x08, 0x02, 0x42, 0x92, 0x02, 0x0a, 0x25, 0x63, 0x6f, 0x6d, 0x2e, 0x68, 0x61, + 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, + 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x42, + 0x0c, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, + 0x33, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x68, 0x61, 0x73, 0x68, + 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2f, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x2f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2f, 0x70, 0x62, 0x70, 0x65, 0x65, + 0x72, 0x69, 0x6e, 0x67, 0xa2, 0x02, 0x04, 0x48, 0x43, 0x49, 0x50, 0xaa, 0x02, 0x21, 0x48, 0x61, + 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x49, + 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0xca, + 0x02, 0x21, 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x5c, 0x43, 0x6f, 0x6e, 0x73, + 0x75, 0x6c, 0x5c, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5c, 0x50, 0x65, 0x65, 0x72, + 0x69, 0x6e, 0x67, 0xe2, 0x02, 0x2d, 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x5c, + 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x5c, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5c, + 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, + 0x61, 0x74, 0x61, 0xea, 0x02, 0x24, 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x3a, + 0x3a, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x3a, 0x3a, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, + 0x6c, 0x3a, 0x3a, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x33, } var ( @@ -2706,96 +2786,98 @@ func file_private_pbpeering_peering_proto_rawDescGZIP() []byte { } var file_private_pbpeering_peering_proto_enumTypes = make([]protoimpl.EnumInfo, 1) -var file_private_pbpeering_peering_proto_msgTypes = make([]protoimpl.MessageInfo, 39) +var file_private_pbpeering_peering_proto_msgTypes = make([]protoimpl.MessageInfo, 40) var file_private_pbpeering_peering_proto_goTypes = []interface{}{ (PeeringState)(0), // 0: hashicorp.consul.internal.peering.PeeringState (*SecretsWriteRequest)(nil), // 1: hashicorp.consul.internal.peering.SecretsWriteRequest (*PeeringSecrets)(nil), // 2: hashicorp.consul.internal.peering.PeeringSecrets (*Peering)(nil), // 3: hashicorp.consul.internal.peering.Peering (*RemoteInfo)(nil), // 4: hashicorp.consul.internal.peering.RemoteInfo - (*StreamStatus)(nil), // 5: hashicorp.consul.internal.peering.StreamStatus - (*PeeringTrustBundle)(nil), // 6: hashicorp.consul.internal.peering.PeeringTrustBundle - (*PeeringServerAddresses)(nil), // 7: hashicorp.consul.internal.peering.PeeringServerAddresses - (*PeeringReadRequest)(nil), // 8: hashicorp.consul.internal.peering.PeeringReadRequest - (*PeeringReadResponse)(nil), // 9: hashicorp.consul.internal.peering.PeeringReadResponse - (*PeeringListRequest)(nil), // 10: hashicorp.consul.internal.peering.PeeringListRequest - (*PeeringListResponse)(nil), // 11: hashicorp.consul.internal.peering.PeeringListResponse - (*PeeringWriteRequest)(nil), // 12: hashicorp.consul.internal.peering.PeeringWriteRequest - (*PeeringWriteResponse)(nil), // 13: hashicorp.consul.internal.peering.PeeringWriteResponse - (*PeeringDeleteRequest)(nil), // 14: hashicorp.consul.internal.peering.PeeringDeleteRequest - (*PeeringDeleteResponse)(nil), // 15: hashicorp.consul.internal.peering.PeeringDeleteResponse - (*TrustBundleListByServiceRequest)(nil), // 16: hashicorp.consul.internal.peering.TrustBundleListByServiceRequest - (*TrustBundleListByServiceResponse)(nil), // 17: hashicorp.consul.internal.peering.TrustBundleListByServiceResponse - (*TrustBundleReadRequest)(nil), // 18: hashicorp.consul.internal.peering.TrustBundleReadRequest - (*TrustBundleReadResponse)(nil), // 19: hashicorp.consul.internal.peering.TrustBundleReadResponse - (*PeeringTerminateByIDRequest)(nil), // 20: hashicorp.consul.internal.peering.PeeringTerminateByIDRequest - (*PeeringTerminateByIDResponse)(nil), // 21: hashicorp.consul.internal.peering.PeeringTerminateByIDResponse - (*PeeringTrustBundleWriteRequest)(nil), // 22: hashicorp.consul.internal.peering.PeeringTrustBundleWriteRequest - (*PeeringTrustBundleWriteResponse)(nil), // 23: hashicorp.consul.internal.peering.PeeringTrustBundleWriteResponse - (*PeeringTrustBundleDeleteRequest)(nil), // 24: hashicorp.consul.internal.peering.PeeringTrustBundleDeleteRequest - (*PeeringTrustBundleDeleteResponse)(nil), // 25: hashicorp.consul.internal.peering.PeeringTrustBundleDeleteResponse - (*GenerateTokenRequest)(nil), // 26: hashicorp.consul.internal.peering.GenerateTokenRequest - (*GenerateTokenResponse)(nil), // 27: hashicorp.consul.internal.peering.GenerateTokenResponse - (*EstablishRequest)(nil), // 28: hashicorp.consul.internal.peering.EstablishRequest - (*EstablishResponse)(nil), // 29: hashicorp.consul.internal.peering.EstablishResponse - (*SecretsWriteRequest_GenerateTokenRequest)(nil), // 30: hashicorp.consul.internal.peering.SecretsWriteRequest.GenerateTokenRequest - (*SecretsWriteRequest_ExchangeSecretRequest)(nil), // 31: hashicorp.consul.internal.peering.SecretsWriteRequest.ExchangeSecretRequest - (*SecretsWriteRequest_PromotePendingRequest)(nil), // 32: hashicorp.consul.internal.peering.SecretsWriteRequest.PromotePendingRequest - (*SecretsWriteRequest_EstablishRequest)(nil), // 33: hashicorp.consul.internal.peering.SecretsWriteRequest.EstablishRequest - (*PeeringSecrets_Establishment)(nil), // 34: hashicorp.consul.internal.peering.PeeringSecrets.Establishment - (*PeeringSecrets_Stream)(nil), // 35: hashicorp.consul.internal.peering.PeeringSecrets.Stream - nil, // 36: hashicorp.consul.internal.peering.Peering.MetaEntry - nil, // 37: hashicorp.consul.internal.peering.PeeringWriteRequest.MetaEntry - nil, // 38: hashicorp.consul.internal.peering.GenerateTokenRequest.MetaEntry - nil, // 39: hashicorp.consul.internal.peering.EstablishRequest.MetaEntry - (*timestamppb.Timestamp)(nil), // 40: google.protobuf.Timestamp + (*Locality)(nil), // 5: hashicorp.consul.internal.peering.Locality + (*StreamStatus)(nil), // 6: hashicorp.consul.internal.peering.StreamStatus + (*PeeringTrustBundle)(nil), // 7: hashicorp.consul.internal.peering.PeeringTrustBundle + (*PeeringServerAddresses)(nil), // 8: hashicorp.consul.internal.peering.PeeringServerAddresses + (*PeeringReadRequest)(nil), // 9: hashicorp.consul.internal.peering.PeeringReadRequest + (*PeeringReadResponse)(nil), // 10: hashicorp.consul.internal.peering.PeeringReadResponse + (*PeeringListRequest)(nil), // 11: hashicorp.consul.internal.peering.PeeringListRequest + (*PeeringListResponse)(nil), // 12: hashicorp.consul.internal.peering.PeeringListResponse + (*PeeringWriteRequest)(nil), // 13: hashicorp.consul.internal.peering.PeeringWriteRequest + (*PeeringWriteResponse)(nil), // 14: hashicorp.consul.internal.peering.PeeringWriteResponse + (*PeeringDeleteRequest)(nil), // 15: hashicorp.consul.internal.peering.PeeringDeleteRequest + (*PeeringDeleteResponse)(nil), // 16: hashicorp.consul.internal.peering.PeeringDeleteResponse + (*TrustBundleListByServiceRequest)(nil), // 17: hashicorp.consul.internal.peering.TrustBundleListByServiceRequest + (*TrustBundleListByServiceResponse)(nil), // 18: hashicorp.consul.internal.peering.TrustBundleListByServiceResponse + (*TrustBundleReadRequest)(nil), // 19: hashicorp.consul.internal.peering.TrustBundleReadRequest + (*TrustBundleReadResponse)(nil), // 20: hashicorp.consul.internal.peering.TrustBundleReadResponse + (*PeeringTerminateByIDRequest)(nil), // 21: hashicorp.consul.internal.peering.PeeringTerminateByIDRequest + (*PeeringTerminateByIDResponse)(nil), // 22: hashicorp.consul.internal.peering.PeeringTerminateByIDResponse + (*PeeringTrustBundleWriteRequest)(nil), // 23: hashicorp.consul.internal.peering.PeeringTrustBundleWriteRequest + (*PeeringTrustBundleWriteResponse)(nil), // 24: hashicorp.consul.internal.peering.PeeringTrustBundleWriteResponse + (*PeeringTrustBundleDeleteRequest)(nil), // 25: hashicorp.consul.internal.peering.PeeringTrustBundleDeleteRequest + (*PeeringTrustBundleDeleteResponse)(nil), // 26: hashicorp.consul.internal.peering.PeeringTrustBundleDeleteResponse + (*GenerateTokenRequest)(nil), // 27: hashicorp.consul.internal.peering.GenerateTokenRequest + (*GenerateTokenResponse)(nil), // 28: hashicorp.consul.internal.peering.GenerateTokenResponse + (*EstablishRequest)(nil), // 29: hashicorp.consul.internal.peering.EstablishRequest + (*EstablishResponse)(nil), // 30: hashicorp.consul.internal.peering.EstablishResponse + (*SecretsWriteRequest_GenerateTokenRequest)(nil), // 31: hashicorp.consul.internal.peering.SecretsWriteRequest.GenerateTokenRequest + (*SecretsWriteRequest_ExchangeSecretRequest)(nil), // 32: hashicorp.consul.internal.peering.SecretsWriteRequest.ExchangeSecretRequest + (*SecretsWriteRequest_PromotePendingRequest)(nil), // 33: hashicorp.consul.internal.peering.SecretsWriteRequest.PromotePendingRequest + (*SecretsWriteRequest_EstablishRequest)(nil), // 34: hashicorp.consul.internal.peering.SecretsWriteRequest.EstablishRequest + (*PeeringSecrets_Establishment)(nil), // 35: hashicorp.consul.internal.peering.PeeringSecrets.Establishment + (*PeeringSecrets_Stream)(nil), // 36: hashicorp.consul.internal.peering.PeeringSecrets.Stream + nil, // 37: hashicorp.consul.internal.peering.Peering.MetaEntry + nil, // 38: hashicorp.consul.internal.peering.PeeringWriteRequest.MetaEntry + nil, // 39: hashicorp.consul.internal.peering.GenerateTokenRequest.MetaEntry + nil, // 40: hashicorp.consul.internal.peering.EstablishRequest.MetaEntry + (*timestamppb.Timestamp)(nil), // 41: google.protobuf.Timestamp } var file_private_pbpeering_peering_proto_depIdxs = []int32{ - 30, // 0: hashicorp.consul.internal.peering.SecretsWriteRequest.generate_token:type_name -> hashicorp.consul.internal.peering.SecretsWriteRequest.GenerateTokenRequest - 31, // 1: hashicorp.consul.internal.peering.SecretsWriteRequest.exchange_secret:type_name -> hashicorp.consul.internal.peering.SecretsWriteRequest.ExchangeSecretRequest - 32, // 2: hashicorp.consul.internal.peering.SecretsWriteRequest.promote_pending:type_name -> hashicorp.consul.internal.peering.SecretsWriteRequest.PromotePendingRequest - 33, // 3: hashicorp.consul.internal.peering.SecretsWriteRequest.establish:type_name -> hashicorp.consul.internal.peering.SecretsWriteRequest.EstablishRequest - 34, // 4: hashicorp.consul.internal.peering.PeeringSecrets.establishment:type_name -> hashicorp.consul.internal.peering.PeeringSecrets.Establishment - 35, // 5: hashicorp.consul.internal.peering.PeeringSecrets.stream:type_name -> hashicorp.consul.internal.peering.PeeringSecrets.Stream - 40, // 6: hashicorp.consul.internal.peering.Peering.DeletedAt:type_name -> google.protobuf.Timestamp - 36, // 7: hashicorp.consul.internal.peering.Peering.Meta:type_name -> hashicorp.consul.internal.peering.Peering.MetaEntry + 31, // 0: hashicorp.consul.internal.peering.SecretsWriteRequest.generate_token:type_name -> hashicorp.consul.internal.peering.SecretsWriteRequest.GenerateTokenRequest + 32, // 1: hashicorp.consul.internal.peering.SecretsWriteRequest.exchange_secret:type_name -> hashicorp.consul.internal.peering.SecretsWriteRequest.ExchangeSecretRequest + 33, // 2: hashicorp.consul.internal.peering.SecretsWriteRequest.promote_pending:type_name -> hashicorp.consul.internal.peering.SecretsWriteRequest.PromotePendingRequest + 34, // 3: hashicorp.consul.internal.peering.SecretsWriteRequest.establish:type_name -> hashicorp.consul.internal.peering.SecretsWriteRequest.EstablishRequest + 35, // 4: hashicorp.consul.internal.peering.PeeringSecrets.establishment:type_name -> hashicorp.consul.internal.peering.PeeringSecrets.Establishment + 36, // 5: hashicorp.consul.internal.peering.PeeringSecrets.stream:type_name -> hashicorp.consul.internal.peering.PeeringSecrets.Stream + 41, // 6: hashicorp.consul.internal.peering.Peering.DeletedAt:type_name -> google.protobuf.Timestamp + 37, // 7: hashicorp.consul.internal.peering.Peering.Meta:type_name -> hashicorp.consul.internal.peering.Peering.MetaEntry 0, // 8: hashicorp.consul.internal.peering.Peering.State:type_name -> hashicorp.consul.internal.peering.PeeringState - 5, // 9: hashicorp.consul.internal.peering.Peering.StreamStatus:type_name -> hashicorp.consul.internal.peering.StreamStatus + 6, // 9: hashicorp.consul.internal.peering.Peering.StreamStatus:type_name -> hashicorp.consul.internal.peering.StreamStatus 4, // 10: hashicorp.consul.internal.peering.Peering.Remote:type_name -> hashicorp.consul.internal.peering.RemoteInfo - 40, // 11: hashicorp.consul.internal.peering.StreamStatus.LastHeartbeat:type_name -> google.protobuf.Timestamp - 40, // 12: hashicorp.consul.internal.peering.StreamStatus.LastReceive:type_name -> google.protobuf.Timestamp - 40, // 13: hashicorp.consul.internal.peering.StreamStatus.LastSend:type_name -> google.protobuf.Timestamp - 3, // 14: hashicorp.consul.internal.peering.PeeringReadResponse.Peering:type_name -> hashicorp.consul.internal.peering.Peering - 3, // 15: hashicorp.consul.internal.peering.PeeringListResponse.Peerings:type_name -> hashicorp.consul.internal.peering.Peering - 3, // 16: hashicorp.consul.internal.peering.PeeringWriteRequest.Peering:type_name -> hashicorp.consul.internal.peering.Peering - 1, // 17: hashicorp.consul.internal.peering.PeeringWriteRequest.SecretsRequest:type_name -> hashicorp.consul.internal.peering.SecretsWriteRequest - 37, // 18: hashicorp.consul.internal.peering.PeeringWriteRequest.Meta:type_name -> hashicorp.consul.internal.peering.PeeringWriteRequest.MetaEntry - 6, // 19: hashicorp.consul.internal.peering.TrustBundleListByServiceResponse.Bundles:type_name -> hashicorp.consul.internal.peering.PeeringTrustBundle - 6, // 20: hashicorp.consul.internal.peering.TrustBundleReadResponse.Bundle:type_name -> hashicorp.consul.internal.peering.PeeringTrustBundle - 6, // 21: hashicorp.consul.internal.peering.PeeringTrustBundleWriteRequest.PeeringTrustBundle:type_name -> hashicorp.consul.internal.peering.PeeringTrustBundle - 38, // 22: hashicorp.consul.internal.peering.GenerateTokenRequest.Meta:type_name -> hashicorp.consul.internal.peering.GenerateTokenRequest.MetaEntry - 39, // 23: hashicorp.consul.internal.peering.EstablishRequest.Meta:type_name -> hashicorp.consul.internal.peering.EstablishRequest.MetaEntry - 26, // 24: hashicorp.consul.internal.peering.PeeringService.GenerateToken:input_type -> hashicorp.consul.internal.peering.GenerateTokenRequest - 28, // 25: hashicorp.consul.internal.peering.PeeringService.Establish:input_type -> hashicorp.consul.internal.peering.EstablishRequest - 8, // 26: hashicorp.consul.internal.peering.PeeringService.PeeringRead:input_type -> hashicorp.consul.internal.peering.PeeringReadRequest - 10, // 27: hashicorp.consul.internal.peering.PeeringService.PeeringList:input_type -> hashicorp.consul.internal.peering.PeeringListRequest - 14, // 28: hashicorp.consul.internal.peering.PeeringService.PeeringDelete:input_type -> hashicorp.consul.internal.peering.PeeringDeleteRequest - 12, // 29: hashicorp.consul.internal.peering.PeeringService.PeeringWrite:input_type -> hashicorp.consul.internal.peering.PeeringWriteRequest - 16, // 30: hashicorp.consul.internal.peering.PeeringService.TrustBundleListByService:input_type -> hashicorp.consul.internal.peering.TrustBundleListByServiceRequest - 18, // 31: hashicorp.consul.internal.peering.PeeringService.TrustBundleRead:input_type -> hashicorp.consul.internal.peering.TrustBundleReadRequest - 27, // 32: hashicorp.consul.internal.peering.PeeringService.GenerateToken:output_type -> hashicorp.consul.internal.peering.GenerateTokenResponse - 29, // 33: hashicorp.consul.internal.peering.PeeringService.Establish:output_type -> hashicorp.consul.internal.peering.EstablishResponse - 9, // 34: hashicorp.consul.internal.peering.PeeringService.PeeringRead:output_type -> hashicorp.consul.internal.peering.PeeringReadResponse - 11, // 35: hashicorp.consul.internal.peering.PeeringService.PeeringList:output_type -> hashicorp.consul.internal.peering.PeeringListResponse - 15, // 36: hashicorp.consul.internal.peering.PeeringService.PeeringDelete:output_type -> hashicorp.consul.internal.peering.PeeringDeleteResponse - 13, // 37: hashicorp.consul.internal.peering.PeeringService.PeeringWrite:output_type -> hashicorp.consul.internal.peering.PeeringWriteResponse - 17, // 38: hashicorp.consul.internal.peering.PeeringService.TrustBundleListByService:output_type -> hashicorp.consul.internal.peering.TrustBundleListByServiceResponse - 19, // 39: hashicorp.consul.internal.peering.PeeringService.TrustBundleRead:output_type -> hashicorp.consul.internal.peering.TrustBundleReadResponse - 32, // [32:40] is the sub-list for method output_type - 24, // [24:32] is the sub-list for method input_type - 24, // [24:24] is the sub-list for extension type_name - 24, // [24:24] is the sub-list for extension extendee - 0, // [0:24] is the sub-list for field type_name + 5, // 11: hashicorp.consul.internal.peering.RemoteInfo.Locality:type_name -> hashicorp.consul.internal.peering.Locality + 41, // 12: hashicorp.consul.internal.peering.StreamStatus.LastHeartbeat:type_name -> google.protobuf.Timestamp + 41, // 13: hashicorp.consul.internal.peering.StreamStatus.LastReceive:type_name -> google.protobuf.Timestamp + 41, // 14: hashicorp.consul.internal.peering.StreamStatus.LastSend:type_name -> google.protobuf.Timestamp + 3, // 15: hashicorp.consul.internal.peering.PeeringReadResponse.Peering:type_name -> hashicorp.consul.internal.peering.Peering + 3, // 16: hashicorp.consul.internal.peering.PeeringListResponse.Peerings:type_name -> hashicorp.consul.internal.peering.Peering + 3, // 17: hashicorp.consul.internal.peering.PeeringWriteRequest.Peering:type_name -> hashicorp.consul.internal.peering.Peering + 1, // 18: hashicorp.consul.internal.peering.PeeringWriteRequest.SecretsRequest:type_name -> hashicorp.consul.internal.peering.SecretsWriteRequest + 38, // 19: hashicorp.consul.internal.peering.PeeringWriteRequest.Meta:type_name -> hashicorp.consul.internal.peering.PeeringWriteRequest.MetaEntry + 7, // 20: hashicorp.consul.internal.peering.TrustBundleListByServiceResponse.Bundles:type_name -> hashicorp.consul.internal.peering.PeeringTrustBundle + 7, // 21: hashicorp.consul.internal.peering.TrustBundleReadResponse.Bundle:type_name -> hashicorp.consul.internal.peering.PeeringTrustBundle + 7, // 22: hashicorp.consul.internal.peering.PeeringTrustBundleWriteRequest.PeeringTrustBundle:type_name -> hashicorp.consul.internal.peering.PeeringTrustBundle + 39, // 23: hashicorp.consul.internal.peering.GenerateTokenRequest.Meta:type_name -> hashicorp.consul.internal.peering.GenerateTokenRequest.MetaEntry + 40, // 24: hashicorp.consul.internal.peering.EstablishRequest.Meta:type_name -> hashicorp.consul.internal.peering.EstablishRequest.MetaEntry + 27, // 25: hashicorp.consul.internal.peering.PeeringService.GenerateToken:input_type -> hashicorp.consul.internal.peering.GenerateTokenRequest + 29, // 26: hashicorp.consul.internal.peering.PeeringService.Establish:input_type -> hashicorp.consul.internal.peering.EstablishRequest + 9, // 27: hashicorp.consul.internal.peering.PeeringService.PeeringRead:input_type -> hashicorp.consul.internal.peering.PeeringReadRequest + 11, // 28: hashicorp.consul.internal.peering.PeeringService.PeeringList:input_type -> hashicorp.consul.internal.peering.PeeringListRequest + 15, // 29: hashicorp.consul.internal.peering.PeeringService.PeeringDelete:input_type -> hashicorp.consul.internal.peering.PeeringDeleteRequest + 13, // 30: hashicorp.consul.internal.peering.PeeringService.PeeringWrite:input_type -> hashicorp.consul.internal.peering.PeeringWriteRequest + 17, // 31: hashicorp.consul.internal.peering.PeeringService.TrustBundleListByService:input_type -> hashicorp.consul.internal.peering.TrustBundleListByServiceRequest + 19, // 32: hashicorp.consul.internal.peering.PeeringService.TrustBundleRead:input_type -> hashicorp.consul.internal.peering.TrustBundleReadRequest + 28, // 33: hashicorp.consul.internal.peering.PeeringService.GenerateToken:output_type -> hashicorp.consul.internal.peering.GenerateTokenResponse + 30, // 34: hashicorp.consul.internal.peering.PeeringService.Establish:output_type -> hashicorp.consul.internal.peering.EstablishResponse + 10, // 35: hashicorp.consul.internal.peering.PeeringService.PeeringRead:output_type -> hashicorp.consul.internal.peering.PeeringReadResponse + 12, // 36: hashicorp.consul.internal.peering.PeeringService.PeeringList:output_type -> hashicorp.consul.internal.peering.PeeringListResponse + 16, // 37: hashicorp.consul.internal.peering.PeeringService.PeeringDelete:output_type -> hashicorp.consul.internal.peering.PeeringDeleteResponse + 14, // 38: hashicorp.consul.internal.peering.PeeringService.PeeringWrite:output_type -> hashicorp.consul.internal.peering.PeeringWriteResponse + 18, // 39: hashicorp.consul.internal.peering.PeeringService.TrustBundleListByService:output_type -> hashicorp.consul.internal.peering.TrustBundleListByServiceResponse + 20, // 40: hashicorp.consul.internal.peering.PeeringService.TrustBundleRead:output_type -> hashicorp.consul.internal.peering.TrustBundleReadResponse + 33, // [33:41] is the sub-list for method output_type + 25, // [25:33] is the sub-list for method input_type + 25, // [25:25] is the sub-list for extension type_name + 25, // [25:25] is the sub-list for extension extendee + 0, // [0:25] is the sub-list for field type_name } func init() { file_private_pbpeering_peering_proto_init() } @@ -2853,7 +2935,7 @@ func file_private_pbpeering_peering_proto_init() { } } file_private_pbpeering_peering_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StreamStatus); i { + switch v := v.(*Locality); i { case 0: return &v.state case 1: @@ -2865,7 +2947,7 @@ func file_private_pbpeering_peering_proto_init() { } } file_private_pbpeering_peering_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PeeringTrustBundle); i { + switch v := v.(*StreamStatus); i { case 0: return &v.state case 1: @@ -2877,7 +2959,7 @@ func file_private_pbpeering_peering_proto_init() { } } file_private_pbpeering_peering_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PeeringServerAddresses); i { + switch v := v.(*PeeringTrustBundle); i { case 0: return &v.state case 1: @@ -2889,7 +2971,7 @@ func file_private_pbpeering_peering_proto_init() { } } file_private_pbpeering_peering_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PeeringReadRequest); i { + switch v := v.(*PeeringServerAddresses); i { case 0: return &v.state case 1: @@ -2901,7 +2983,7 @@ func file_private_pbpeering_peering_proto_init() { } } file_private_pbpeering_peering_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PeeringReadResponse); i { + switch v := v.(*PeeringReadRequest); i { case 0: return &v.state case 1: @@ -2913,7 +2995,7 @@ func file_private_pbpeering_peering_proto_init() { } } file_private_pbpeering_peering_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PeeringListRequest); i { + switch v := v.(*PeeringReadResponse); i { case 0: return &v.state case 1: @@ -2925,7 +3007,7 @@ func file_private_pbpeering_peering_proto_init() { } } file_private_pbpeering_peering_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PeeringListResponse); i { + switch v := v.(*PeeringListRequest); i { case 0: return &v.state case 1: @@ -2937,7 +3019,7 @@ func file_private_pbpeering_peering_proto_init() { } } file_private_pbpeering_peering_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PeeringWriteRequest); i { + switch v := v.(*PeeringListResponse); i { case 0: return &v.state case 1: @@ -2949,7 +3031,7 @@ func file_private_pbpeering_peering_proto_init() { } } file_private_pbpeering_peering_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PeeringWriteResponse); i { + switch v := v.(*PeeringWriteRequest); i { case 0: return &v.state case 1: @@ -2961,7 +3043,7 @@ func file_private_pbpeering_peering_proto_init() { } } file_private_pbpeering_peering_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PeeringDeleteRequest); i { + switch v := v.(*PeeringWriteResponse); i { case 0: return &v.state case 1: @@ -2973,7 +3055,7 @@ func file_private_pbpeering_peering_proto_init() { } } file_private_pbpeering_peering_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PeeringDeleteResponse); i { + switch v := v.(*PeeringDeleteRequest); i { case 0: return &v.state case 1: @@ -2985,7 +3067,7 @@ func file_private_pbpeering_peering_proto_init() { } } file_private_pbpeering_peering_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TrustBundleListByServiceRequest); i { + switch v := v.(*PeeringDeleteResponse); i { case 0: return &v.state case 1: @@ -2997,7 +3079,7 @@ func file_private_pbpeering_peering_proto_init() { } } file_private_pbpeering_peering_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TrustBundleListByServiceResponse); i { + switch v := v.(*TrustBundleListByServiceRequest); i { case 0: return &v.state case 1: @@ -3009,7 +3091,7 @@ func file_private_pbpeering_peering_proto_init() { } } file_private_pbpeering_peering_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TrustBundleReadRequest); i { + switch v := v.(*TrustBundleListByServiceResponse); i { case 0: return &v.state case 1: @@ -3021,7 +3103,7 @@ func file_private_pbpeering_peering_proto_init() { } } file_private_pbpeering_peering_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TrustBundleReadResponse); i { + switch v := v.(*TrustBundleReadRequest); i { case 0: return &v.state case 1: @@ -3033,7 +3115,7 @@ func file_private_pbpeering_peering_proto_init() { } } file_private_pbpeering_peering_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PeeringTerminateByIDRequest); i { + switch v := v.(*TrustBundleReadResponse); i { case 0: return &v.state case 1: @@ -3045,7 +3127,7 @@ func file_private_pbpeering_peering_proto_init() { } } file_private_pbpeering_peering_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PeeringTerminateByIDResponse); i { + switch v := v.(*PeeringTerminateByIDRequest); i { case 0: return &v.state case 1: @@ -3057,7 +3139,7 @@ func file_private_pbpeering_peering_proto_init() { } } file_private_pbpeering_peering_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PeeringTrustBundleWriteRequest); i { + switch v := v.(*PeeringTerminateByIDResponse); i { case 0: return &v.state case 1: @@ -3069,7 +3151,7 @@ func file_private_pbpeering_peering_proto_init() { } } file_private_pbpeering_peering_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PeeringTrustBundleWriteResponse); i { + switch v := v.(*PeeringTrustBundleWriteRequest); i { case 0: return &v.state case 1: @@ -3081,7 +3163,7 @@ func file_private_pbpeering_peering_proto_init() { } } file_private_pbpeering_peering_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PeeringTrustBundleDeleteRequest); i { + switch v := v.(*PeeringTrustBundleWriteResponse); i { case 0: return &v.state case 1: @@ -3093,7 +3175,7 @@ func file_private_pbpeering_peering_proto_init() { } } file_private_pbpeering_peering_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PeeringTrustBundleDeleteResponse); i { + switch v := v.(*PeeringTrustBundleDeleteRequest); i { case 0: return &v.state case 1: @@ -3105,7 +3187,7 @@ func file_private_pbpeering_peering_proto_init() { } } file_private_pbpeering_peering_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GenerateTokenRequest); i { + switch v := v.(*PeeringTrustBundleDeleteResponse); i { case 0: return &v.state case 1: @@ -3117,7 +3199,7 @@ func file_private_pbpeering_peering_proto_init() { } } file_private_pbpeering_peering_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GenerateTokenResponse); i { + switch v := v.(*GenerateTokenRequest); i { case 0: return &v.state case 1: @@ -3129,7 +3211,7 @@ func file_private_pbpeering_peering_proto_init() { } } file_private_pbpeering_peering_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*EstablishRequest); i { + switch v := v.(*GenerateTokenResponse); i { case 0: return &v.state case 1: @@ -3141,7 +3223,7 @@ func file_private_pbpeering_peering_proto_init() { } } file_private_pbpeering_peering_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*EstablishResponse); i { + switch v := v.(*EstablishRequest); i { case 0: return &v.state case 1: @@ -3153,7 +3235,7 @@ func file_private_pbpeering_peering_proto_init() { } } file_private_pbpeering_peering_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SecretsWriteRequest_GenerateTokenRequest); i { + switch v := v.(*EstablishResponse); i { case 0: return &v.state case 1: @@ -3165,7 +3247,7 @@ func file_private_pbpeering_peering_proto_init() { } } file_private_pbpeering_peering_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SecretsWriteRequest_ExchangeSecretRequest); i { + switch v := v.(*SecretsWriteRequest_GenerateTokenRequest); i { case 0: return &v.state case 1: @@ -3177,7 +3259,7 @@ func file_private_pbpeering_peering_proto_init() { } } file_private_pbpeering_peering_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SecretsWriteRequest_PromotePendingRequest); i { + switch v := v.(*SecretsWriteRequest_ExchangeSecretRequest); i { case 0: return &v.state case 1: @@ -3189,7 +3271,7 @@ func file_private_pbpeering_peering_proto_init() { } } file_private_pbpeering_peering_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SecretsWriteRequest_EstablishRequest); i { + switch v := v.(*SecretsWriteRequest_PromotePendingRequest); i { case 0: return &v.state case 1: @@ -3201,7 +3283,7 @@ func file_private_pbpeering_peering_proto_init() { } } file_private_pbpeering_peering_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PeeringSecrets_Establishment); i { + switch v := v.(*SecretsWriteRequest_EstablishRequest); i { case 0: return &v.state case 1: @@ -3213,6 +3295,18 @@ func file_private_pbpeering_peering_proto_init() { } } file_private_pbpeering_peering_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PeeringSecrets_Establishment); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_private_pbpeering_peering_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PeeringSecrets_Stream); i { case 0: return &v.state @@ -3237,7 +3331,7 @@ func file_private_pbpeering_peering_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_private_pbpeering_peering_proto_rawDesc, NumEnums: 1, - NumMessages: 39, + NumMessages: 40, NumExtensions: 0, NumServices: 1, }, diff --git a/proto/private/pbpeering/peering.proto b/proto/private/pbpeering/peering.proto index 3d6c353e28d..b84b10d3035 100644 --- a/proto/private/pbpeering/peering.proto +++ b/proto/private/pbpeering/peering.proto @@ -237,6 +237,22 @@ message RemoteInfo { string Partition = 1; // Datacenter is the remote peer's datacenter. string Datacenter = 2; + + // Locality identifies where the peer is running. + Locality Locality = 3; +} + +// mog annotation: +// +// target=github.com/hashicorp/consul/api.Locality +// output=peering.gen.go +// name=API +message Locality { + // Region is region the zone belongs to. + string Region = 1; + + // Zone is the zone the entity is running in. + string Zone = 2; } // StreamStatus represents information about an active peering stream. From 58016d1aa2d06658158d683a49fa355634ef90f0 Mon Sep 17 00:00:00 2001 From: Paul Glass Date: Tue, 7 Mar 2023 14:05:23 -0600 Subject: [PATCH 127/262] docs: Document config entry permissions (#16556) --- website/content/api-docs/config.mdx | 157 +++++++++++++++++----------- 1 file changed, 96 insertions(+), 61 deletions(-) diff --git a/website/content/api-docs/config.mdx b/website/content/api-docs/config.mdx index 3c49e0c8d34..96e6a7b4de7 100644 --- a/website/content/api-docs/config.mdx +++ b/website/content/api-docs/config.mdx @@ -31,25 +31,32 @@ The table below shows this endpoint's support for | Blocking Queries | Consistency Modes | Agent Caching | ACL Required | | ---------------- | ----------------- | ------------- | ------------------------------------------------- | -| `NO` | `none` | `none` | `service:write`
    `operator:write`1 | - -

    - 1 The ACL required depends on the config entry kind being updated: -

    - -| Config Entry Kind | Required ACL | -| ------------------- | ------------------ | -| ingress-gateway | `operator:write` | -| proxy-defaults | `operator:write` | -| service-defaults | `service:write` | -| service-intentions | `intentions:write` | -| service-resolver | `service:write` | -| service-router | `service:write` | -| service-splitter | `service:write` | -| terminating-gateway | `operator:write` | +| `NO` | `none` | `none` | Refer to [Permissions](#permissions) | The corresponding CLI command is [`consul config write`](/consul/commands/config/write). +### Permissions + +The ACL required depends on the config entry being written: + +| Config Entry Kind | Required ACLs | +| ------------------- | -------------------------------- | +| api-gateway | `mesh:write` or `operator:write` | +| bound-api-gateway | Not writable. | +| exported-services | `mesh:write` or `operator:write` | +| http-route | `mesh:write` or `operator:write` | +| ingress-gateway | `mesh:write` or `operator:write` | +| inline-certificate | `mesh:write` or `operator:write` | +| mesh | `mesh:write` or `operator:write` | +| proxy-defaults | `mesh:write` or `operator:write` | +| service-defaults | `service:write` | +| service-intentions | `intentions:write` | +| service-resolver | `service:write` | +| service-router | `service:write` | +| service-splitter | `service:write` | +| tcp-route | `mesh:write` or `operator:write` | +| terminating-gateway | `mesh:write` or `operator:write` | + ### Query Parameters - `dc` `(string: "")` - Specifies the datacenter to query. @@ -96,25 +103,35 @@ The table below shows this endpoint's support for [agent caching](/consul/api-docs/features/caching), and [required ACLs](/consul/api-docs/api-structure#authentication). -| Blocking Queries | Consistency Modes | Agent Caching | ACL Required | -| ---------------- | ----------------- | ------------- | -------------------------- | -| `YES` | `all` | `none` | `service:read`1 | - -1 The ACL required depends on the config entry kind being read: +| Blocking Queries | Consistency Modes | Agent Caching | ACL Required | +| ---------------- | ----------------- | ------------- | -------------------------------------- | +| `YES` | `all` | `none` | Refer to [Permissions](#permissions-1) | -| Config Entry Kind | Required ACL | -| ------------------- | ----------------- | -| ingress-gateway | `service:read` | -| proxy-defaults | `` | -| service-defaults | `service:read` | -| service-intentions | `intentions:read` | -| service-resolver | `service:read` | -| service-router | `service:read` | -| service-splitter | `service:read` | -| terminating-gateway | `service:read` | The corresponding CLI command is [`consul config read`](/consul/commands/config/read). +### Permissions + +The ACL required depends on the config entry kind being read: + +| Config Entry Kind | Required ACLs | +| ------------------- | -------------------------------- | +| api-gateway | `service:read` | +| bound-api-gateway | `service:read` | +| exported-services | `mesh:read` or `operator:read` | +| http-route | `mesh:read` or `operator:read` | +| ingress-gateway | `service:read` | +| inline-certificate | `mesh:read` or `operator:read` | +| mesh | No ACL required | +| proxy-defaults | No ACL required | +| service-defaults | `service:read` | +| service-intentions | `intentions:read` | +| service-resolver | `service:read` | +| service-router | `service:read` | +| service-splitter | `service:read` | +| tcp-route | `mesh:read` or `operator:read` | +| terminating-gateway | `service:read` | + ### Path Parameters - `kind` `(string: )` - Specifies the kind of the entry to read. @@ -167,22 +184,31 @@ The table below shows this endpoint's support for [agent caching](/consul/api-docs/features/caching), and [required ACLs](/consul/api-docs/api-structure#authentication). -| Blocking Queries | Consistency Modes | Agent Caching | ACL Required | -| ---------------- | ----------------- | ------------- | -------------------------- | -| `YES` | `all` | `none` | `service:read`1 | - -1 The ACL required depends on the config entry kind being read: - -| Config Entry Kind | Required ACL | -| ------------------- | ----------------- | -| ingress-gateway | `service:read` | -| proxy-defaults | `` | -| service-defaults | `service:read` | -| service-intentions | `intentions:read` | -| service-resolver | `service:read` | -| service-router | `service:read` | -| service-splitter | `service:read` | -| terminating-gateway | `service:read` | +| Blocking Queries | Consistency Modes | Agent Caching | ACL Required | +| ---------------- | ----------------- | ------------- | -------------------------------------- | +| `YES` | `all` | `none` | Refer to [Permissions](#permissions-2) | + +### Permissions + +The ACL required depends on the config entry kind being read: + +| Config Entry Kind | Required ACLs | +| ------------------- | -------------------------------- | +| api-gateway | `service:read` | +| bound-api-gateway | `service:read` | +| exported-services | `mesh:read` or `operator:read` | +| http-route | `mesh:read` or `operator:read` | +| ingress-gateway | `service:read` | +| inline-certificate | `mesh:read` or `operator:read` | +| mesh | No ACL required | +| proxy-defaults | No ACL required | +| service-defaults | `service:read` | +| service-intentions | `intentions:read` | +| service-resolver | `service:read` | +| service-router | `service:read` | +| service-splitter | `service:read` | +| tcp-route | `mesh:read` or `operator:read` | +| terminating-gateway | `service:read` | The corresponding CLI command is [`consul config list`](/consul/commands/config/list). @@ -243,20 +269,29 @@ The table below shows this endpoint's support for | Blocking Queries | Consistency Modes | Agent Caching | ACL Required | | ---------------- | ----------------- | ------------- | ------------------------------------------------- | -| `NO` | `none` | `none` | `service:write`
    `operator:write`1 | - -1 The ACL required depends on the config entry kind being deleted: - -| Config Entry Kind | Required ACL | -| ------------------- | ------------------ | -| ingress-gateway | `operator:write` | -| proxy-defaults | `operator:write` | -| service-defaults | `service:write` | -| service-intentions | `intentions:write` | -| service-resolver | `service:write` | -| service-router | `service:write` | -| service-splitter | `service:write` | -| terminating-gateway | `operator:write ` | +| `NO` | `none` | `none` | Refer to [Permissions](#permissions-3) | + +### Permissions + +The ACL required depends on the config entry kind being deleted: + +| Config Entry Kind | Required ACLs | +| ------------------- | -------------------------------- | +| api-gateway | `mesh:write` or `operator:write` | +| bound-api-gateway | Not writable. | +| exported-services | `mesh:write` or `operator:write` | +| http-route | `mesh:write` or `operator:write` | +| ingress-gateway | `mesh:write` or `operator:write` | +| inline-certificate | `mesh:write` or `operator:write` | +| mesh | `mesh:write` or `operator:write` | +| proxy-defaults | `mesh:write` or `operator:write` | +| service-defaults | `service:write` | +| service-intentions | `intentions:write` | +| service-resolver | `service:write` | +| service-router | `service:write` | +| service-splitter | `service:write` | +| tcp-route | `mesh:write` or `operator:write` | +| terminating-gateway | `mesh:write` or `operator:write` | The corresponding CLI command is [`consul config delete`](/consul/commands/config/delete). From 3d75ab8a41694bf42dceef358c81b1c86dc29ad4 Mon Sep 17 00:00:00 2001 From: Eddie Rowe <74205376+eddie-rowe@users.noreply.github.com> Date: Tue, 7 Mar 2023 17:27:11 -0600 Subject: [PATCH 128/262] Broken link fixes (#16566) --- website/content/docs/concepts/service-discovery.mdx | 6 +++--- website/content/docs/intro/index.mdx | 6 +++--- website/content/docs/nia/usage/requirements.mdx | 6 +++--- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/website/content/docs/concepts/service-discovery.mdx b/website/content/docs/concepts/service-discovery.mdx index 7c95b7f8d57..96a4b242867 100644 --- a/website/content/docs/concepts/service-discovery.mdx +++ b/website/content/docs/concepts/service-discovery.mdx @@ -90,6 +90,6 @@ Get started with service discovery today by leveraging Consul on HCP, Consul on Feel free to get started with Consul by exploring one of these Consul tutorials: -- [Get Started with Consul on VMs](/consul/tutorials/getting-started) -- [Get Started with Consul on HCP](/consul/tutorials/cloud-get-started) -- [Get Started with Consul on Kubernetes](/consul/tutorials/gs-consul-service-mesh) +- [Get Started with Consul on VMs](/consul/tutorials/get-started-vms) +- [Get Started with Consul on HCP](/consul/tutorials/get-started-hcp) +- [Get Started with Consul on Kubernetes](/consul/tutorials/get-started-kubernetes) \ No newline at end of file diff --git a/website/content/docs/intro/index.mdx b/website/content/docs/intro/index.mdx index 90a1759fe23..b9b61b621df 100644 --- a/website/content/docs/intro/index.mdx +++ b/website/content/docs/intro/index.mdx @@ -10,9 +10,9 @@ description: >- HashiCorp Consul is a service networking solution that enables teams to manage secure network connectivity between services and across on-prem and multi-cloud environments and runtimes. Consul offers service discovery, service mesh, traffic management, and automated updates to network infrastructure device. You can use these features individually or together in a single Consul deployment. > **Hands-on**: Complete the Getting Started tutorials to learn how to deploy Consul: -- [Get Started on Kubernetes](/consul/tutorials/gs-consul-service-mesh) -- [Get Started on VMs](/consul/tutorials/getting-started) -- [HashiCorp Cloud Platform (HCP) Consul](/consul/tutorials/cloud-get-started) +- [Get Started on Kubernetes](/consul/tutorials/get-started-kubernetes) +- [Get Started on VMs](/consul/tutorials/get-started-vms) +- [HashiCorp Cloud Platform (HCP) Consul](/consul/tutorials/get-started-hcp) ## How does Consul work? diff --git a/website/content/docs/nia/usage/requirements.mdx b/website/content/docs/nia/usage/requirements.mdx index 1950b84fb2f..7d3f84dd897 100644 --- a/website/content/docs/nia/usage/requirements.mdx +++ b/website/content/docs/nia/usage/requirements.mdx @@ -31,7 +31,7 @@ For information on compatible Consul versions, refer to the [Consul compatibilit ### Run an agent -The Consul agent must be running in order to dynamically update network devices. Refer to the [Consul agent documentation](/consul/docs/agent) for information about configuring and starting a Consul agent. For hands-on instructions about running Consul agents, refer to the [Getting Started: Run the Consul Agent Tutorial](/consul/tutorials/getting-started/get-started-agent). +The Consul agent must be running in order to dynamically update network devices. Refer to the [Consul agent documentation](/consul/docs/agent) for information about configuring and starting a Consul agent. When running a Consul agent with CTS in production, consider that CTS uses [blocking queries](/consul/api-docs/features/blocking) to monitor task dependencies, such as changes to registered services. This results in multiple long-running TCP connections between CTS and the agent to poll changes for each dependency. Consul may quickly reach the agent connection limits if CTS is monitoring a high number of services. @@ -62,11 +62,11 @@ You can configure CTS to monitor the web service, execute a task, and update net For more details on registering a service using the HTTP API endpoint, refer to the [register service API docs](/consul/api-docs/agent/service#register-service). -For hands-on instructions on registering a service by loading a service definition, refer to the [Getting Started: Register a Service with Consul Service Discovery Tutorial](/consul/tutorials/getting-started/get-started-service-discovery). +For hands-on instructions on registering a service by loading a service definition, refer to the [Getting Started: Register a Service with Consul Service Discovery Tutorial](/consul/tutorials/get-started-vms/virtual-machine-gs-service-discovery). ### Run a cluster -For production environments, we recommend operating a Consul cluster rather than a single agent. Refer to [Getting Started: Create a Local Consul Datacenter](/consul/tutorials/getting-started/get-started-create-datacenter) for instructions on starting multiple Consul agents and joining them into a cluster. +For production environments, we recommend operating a Consul cluster rather than a single agent. Refer to [Getting Started: Deploy a Consul Datacenter Tutorial](/consul/tutorials/get-started-vms/virtual-machine-gs-deploy) for instructions on starting multiple Consul agents and joining them into a cluster. ## Network infrastructure using a Terraform provider From 280bdd3ea02734bc89500d88a3d6c77850780e4d Mon Sep 17 00:00:00 2001 From: Anita Akaeze Date: Wed, 8 Mar 2023 11:00:23 -0500 Subject: [PATCH 129/262] NET-2954: Improve integration tests CI execution time (#16565) * NET-2954: Improve integration tests CI execution time * fix ci * remove comments and modify config file --- .circleci/config.yml | 90 ++++++++++++++++++- .../test/upgrade/acl_node_test.go | 11 ++- .../test/upgrade/fullstopupgrade_test.go | 12 ++- .../healthcheck_test.go | 7 ++ .../test/upgrade/ingress_gateway_test.go | 17 ++-- .../resolver_default_subset_test.go | 13 ++- .../upgrade/peering_control_plane_mgw_test.go | 10 +-- .../test/upgrade/peering_http_test.go | 13 ++- .../consul-container/test/upgrade/upgrade.go | 3 - 9 files changed, 127 insertions(+), 49 deletions(-) rename test/integration/consul-container/test/{healthcheck => upgrade}/healthcheck_test.go (96%) delete mode 100644 test/integration/consul-container/test/upgrade/upgrade.go diff --git a/.circleci/config.yml b/.circleci/config.yml index 46ebfe240e9..f4c3cac98b0 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -36,6 +36,9 @@ references: - "1.11.6" - "1.10.9" - "1.9.10" + consul-versions: &consul_versions + - "1.14" + - "1.15" images: # When updating the Go version, remember to also update the versions in the # workflows section for go-test-lib jobs. @@ -887,7 +890,7 @@ jobs: -p=4 \ -timeout=30m \ -json \ - ./... \ + `go list ./... | grep -v upgrade` \ --target-image consul \ --target-version local \ --latest-image consul \ @@ -906,6 +909,84 @@ jobs: path: *TEST_RESULTS_DIR - run: *notify-slack-failure + upgrade-integration-test: + machine: + image: *UBUNTU_CI_IMAGE + docker_layer_caching: true + parallelism: 3 + resource_class: large + parameters: + consul-version: + type: enum + enum: *consul_versions + environment: + CONSUL_VERSION: << parameters.consul-version >> + steps: + - checkout + # Get go binary from workspace + - attach_workspace: + at: . + # Build the consul:local image from the already built binary + - run: + command: | + sudo rm -rf /usr/local/go + wget https://dl.google.com/go/go${GO_VERSION}.linux-amd64.tar.gz + sudo tar -C /usr/local -xzvf go${GO_VERSION}.linux-amd64.tar.gz + environment: + <<: *ENVIRONMENT + - run: *install-gotestsum + - run: docker build -t consul:local -f ./build-support/docker/Consul-Dev.dockerfile . + - run: + name: Upgrade Integration Tests + command: | + mkdir -p /tmp/test-results/ + cd ./test/integration/consul-container + docker run --rm consul:local consul version + gotestsum \ + --raw-command \ + --format=short-verbose \ + --debug \ + --rerun-fails=3 \ + --packages="./..." \ + -- \ + go test \ + -p=4 \ + -tags "${GOTAGS}" \ + -timeout=30m \ + -json \ + ./.../upgrade/ \ + --target-image consul \ + --target-version local \ + --latest-image consul \ + --latest-version $CONSUL_VERSION + ls -lrt + environment: + # this is needed because of incompatibility between RYUK container and circleci + GOTESTSUM_JUNITFILE: /tmp/test-results/results.xml + GOTESTSUM_FORMAT: standard-verbose + COMPOSE_INTERACTIVE_NO_CLI: 1 + # tput complains if this isn't set to something. + TERM: ansi + - store_test_results: + path: *TEST_RESULTS_DIR + - store_artifacts: + path: *TEST_RESULTS_DIR + - run: *notify-slack-failure + + # Lints all *.dockerfile but don't fail at this time + dockerfile-lint: + docker: + - image: docker.mirror.hashicorp.services/hadolint/hadolint:latest-debian + steps: + - run: apt-get -qq update; apt-get -y install git # the hadolint container doesn't have git + - checkout + - run: + name: Dockefile lint + command: | + for file in $(find . -type f -name *.dockerfile); do + hadolint $file || true + done + envoy-integration-test: &ENVOY_TESTS machine: image: *UBUNTU_CI_IMAGE @@ -1210,6 +1291,13 @@ workflows: - compatibility-integration-test: requires: - dev-build + - upgrade-integration-test: + requires: + - dev-build + matrix: + parameters: + consul-version: *consul_versions + - noop frontend: unless: << pipeline.parameters.trigger-load-test >> diff --git a/test/integration/consul-container/test/upgrade/acl_node_test.go b/test/integration/consul-container/test/upgrade/acl_node_test.go index f38d0993415..ff64def9411 100644 --- a/test/integration/consul-container/test/upgrade/acl_node_test.go +++ b/test/integration/consul-container/test/upgrade/acl_node_test.go @@ -46,10 +46,9 @@ func TestACL_Upgrade_Node_Token(t *testing.T) { require.NoError(t, err) libassert.CatalogNodeExists(t, client, cluster.Agents[1].GetAgentName()) } - for _, oldVersion := range UpgradeFromVersions { - t.Run(fmt.Sprintf("Upgrade from %s to %s", oldVersion, utils.TargetVersion), - func(t *testing.T) { - run(t, oldVersion, utils.TargetVersion) - }) - } + + t.Run(fmt.Sprintf("Upgrade from %s to %s", utils.LatestVersion, utils.TargetVersion), + func(t *testing.T) { + run(t, utils.LatestVersion, utils.TargetVersion) + }) } diff --git a/test/integration/consul-container/test/upgrade/fullstopupgrade_test.go b/test/integration/consul-container/test/upgrade/fullstopupgrade_test.go index 59820c4b07e..20153d6094a 100644 --- a/test/integration/consul-container/test/upgrade/fullstopupgrade_test.go +++ b/test/integration/consul-container/test/upgrade/fullstopupgrade_test.go @@ -40,13 +40,11 @@ func TestStandardUpgradeToTarget_fromLatest(t *testing.T) { }, ) - for _, oldVersion := range UpgradeFromVersions { - tcs = append(tcs, testcase{ - oldVersion: oldVersion, - targetVersion: utils.TargetVersion, - }, - ) - } + tcs = append(tcs, testcase{ + oldVersion: utils.LatestVersion, + targetVersion: utils.TargetVersion, + }, + ) run := func(t *testing.T, tc testcase) { configCtx := libcluster.NewBuildContext(t, libcluster.BuildOptions{ diff --git a/test/integration/consul-container/test/healthcheck/healthcheck_test.go b/test/integration/consul-container/test/upgrade/healthcheck_test.go similarity index 96% rename from test/integration/consul-container/test/healthcheck/healthcheck_test.go rename to test/integration/consul-container/test/upgrade/healthcheck_test.go index 140f0dfd6cc..8ef12af3c2d 100644 --- a/test/integration/consul-container/test/healthcheck/healthcheck_test.go +++ b/test/integration/consul-container/test/upgrade/healthcheck_test.go @@ -5,6 +5,7 @@ import ( "testing" "time" + "github.com/hashicorp/go-version" "github.com/stretchr/testify/require" "github.com/hashicorp/consul/api" @@ -18,6 +19,12 @@ import ( func TestTargetServersWithLatestGAClients(t *testing.T) { t.Parallel() + fromVersion, err := version.NewVersion(utils.LatestVersion) + require.NoError(t, err) + if fromVersion.LessThan(utils.Version_1_14) { + return + } + const ( numServers = 3 numClients = 1 diff --git a/test/integration/consul-container/test/upgrade/ingress_gateway_test.go b/test/integration/consul-container/test/upgrade/ingress_gateway_test.go index 814854cd275..71a55d1353f 100644 --- a/test/integration/consul-container/test/upgrade/ingress_gateway_test.go +++ b/test/integration/consul-container/test/upgrade/ingress_gateway_test.go @@ -270,17 +270,12 @@ func TestIngressGateway_UpgradeToTarget_fromLatest(t *testing.T) { }) } - for _, oldVersion := range UpgradeFromVersions { - // copy to avoid lint loopclosure - oldVersion := oldVersion - - t.Run(fmt.Sprintf("Upgrade from %s to %s", oldVersion, utils.TargetVersion), - func(t *testing.T) { - t.Parallel() - run(t, oldVersion, utils.TargetVersion) - }) - time.Sleep(1 * time.Second) - } + t.Run(fmt.Sprintf("Upgrade from %s to %s", utils.LatestVersion, utils.TargetVersion), + func(t *testing.T) { + t.Parallel() + run(t, utils.LatestVersion, utils.TargetVersion) + }) + time.Sleep(1 * time.Second) } func mappedHTTPGET(t *testing.T, uri string, mappedPort int, header http.Header) *http.Response { diff --git a/test/integration/consul-container/test/upgrade/l7_traffic_management/resolver_default_subset_test.go b/test/integration/consul-container/test/upgrade/l7_traffic_management/resolver_default_subset_test.go index ffffd9f1a83..c944329de7c 100644 --- a/test/integration/consul-container/test/upgrade/l7_traffic_management/resolver_default_subset_test.go +++ b/test/integration/consul-container/test/upgrade/l7_traffic_management/resolver_default_subset_test.go @@ -12,7 +12,6 @@ import ( libservice "github.com/hashicorp/consul/test/integration/consul-container/libs/service" "github.com/hashicorp/consul/test/integration/consul-container/libs/topology" "github.com/hashicorp/consul/test/integration/consul-container/libs/utils" - "github.com/hashicorp/consul/test/integration/consul-container/test/upgrade" "github.com/stretchr/testify/require" ) @@ -386,13 +385,11 @@ func TestTrafficManagement_ServiceResolver(t *testing.T) { tc.extraAssertion(staticClientProxy) } - for _, oldVersion := range upgrade.UpgradeFromVersions { - for _, tc := range tcs { - t.Run(fmt.Sprintf("%s upgrade from %s to %s", tc.name, oldVersion, utils.TargetVersion), - func(t *testing.T) { - run(t, tc, oldVersion, utils.TargetVersion) - }) - } + for _, tc := range tcs { + t.Run(fmt.Sprintf("%s upgrade from %s to %s", tc.name, utils.LatestVersion, utils.TargetVersion), + func(t *testing.T) { + run(t, tc, utils.LatestVersion, utils.TargetVersion) + }) } } diff --git a/test/integration/consul-container/test/upgrade/peering_control_plane_mgw_test.go b/test/integration/consul-container/test/upgrade/peering_control_plane_mgw_test.go index 2cc14676ba0..b64ff70fb6b 100644 --- a/test/integration/consul-container/test/upgrade/peering_control_plane_mgw_test.go +++ b/test/integration/consul-container/test/upgrade/peering_control_plane_mgw_test.go @@ -88,10 +88,8 @@ func TestPeering_Upgrade_ControlPlane_MGW(t *testing.T) { libassert.AssertFortioName(t, fmt.Sprintf("http://localhost:%d", port), libservice.StaticServerServiceName, "") } - for _, oldVersion := range UpgradeFromVersions { - t.Run(fmt.Sprintf("Upgrade from %s to %s", oldVersion, utils.TargetVersion), - func(t *testing.T) { - run(t, oldVersion, utils.TargetVersion) - }) - } + t.Run(fmt.Sprintf("Upgrade from %s to %s", utils.LatestVersion, utils.TargetVersion), + func(t *testing.T) { + run(t, utils.LatestVersion, utils.TargetVersion) + }) } diff --git a/test/integration/consul-container/test/upgrade/peering_http_test.go b/test/integration/consul-container/test/upgrade/peering_http_test.go index 53f48ea95c5..d081ead8bcd 100644 --- a/test/integration/consul-container/test/upgrade/peering_http_test.go +++ b/test/integration/consul-container/test/upgrade/peering_http_test.go @@ -30,6 +30,7 @@ func TestPeering_UpgradeToTarget_fromLatest(t *testing.T) { // common resources includes static-client in dialing cluster, and static-server in accepting cluster. extraAssertion func(int) } + tcs := []testcase{ // { // TODO: API changed from 1.13 to 1.14 in , PeerName to Peer @@ -372,13 +373,11 @@ func TestPeering_UpgradeToTarget_fromLatest(t *testing.T) { tc.extraAssertion(appPort) } - for _, oldVersion := range UpgradeFromVersions { - for _, tc := range tcs { - t.Run(fmt.Sprintf("%s upgrade from %s to %s", tc.name, oldVersion, utils.TargetVersion), - func(t *testing.T) { - run(t, tc, oldVersion, utils.TargetVersion) - }) - } + for _, tc := range tcs { + t.Run(fmt.Sprintf("%s upgrade from %s to %s", tc.name, utils.LatestVersion, utils.TargetVersion), + func(t *testing.T) { + run(t, tc, utils.LatestVersion, utils.TargetVersion) + }) } } diff --git a/test/integration/consul-container/test/upgrade/upgrade.go b/test/integration/consul-container/test/upgrade/upgrade.go deleted file mode 100644 index 3dc3a227392..00000000000 --- a/test/integration/consul-container/test/upgrade/upgrade.go +++ /dev/null @@ -1,3 +0,0 @@ -package upgrade - -var UpgradeFromVersions = []string{"1.14", "1.15"} From 89de91b2634bbf4a00bc663732260253c2c2ecf9 Mon Sep 17 00:00:00 2001 From: Eric Haberkorn Date: Wed, 8 Mar 2023 11:24:03 -0500 Subject: [PATCH 130/262] fix bug that can lead to peering service deletes impacting the state of local services (#16570) --- .changelog/16570.txt | 3 ++ agent/consul/state/catalog.go | 31 ++++++++++-------- agent/consul/state/catalog_test.go | 51 +++++++++++++++++++++++------- agent/consul/state/usage.go | 6 ++-- agent/structs/structs.go | 12 ++++--- 5 files changed, 72 insertions(+), 31 deletions(-) create mode 100644 .changelog/16570.txt diff --git a/.changelog/16570.txt b/.changelog/16570.txt new file mode 100644 index 00000000000..ad07cda81c0 --- /dev/null +++ b/.changelog/16570.txt @@ -0,0 +1,3 @@ +```release-note:bug +peering: Fixes a bug that can lead to peering service deletes impacting the state of local services +``` diff --git a/agent/consul/state/catalog.go b/agent/consul/state/catalog.go index 39a40d9cad3..077fbde79a8 100644 --- a/agent/consul/state/catalog.go +++ b/agent/consul/state/catalog.go @@ -1186,7 +1186,7 @@ func serviceListTxn(tx ReadTxn, ws memdb.WatchSet, entMeta *acl.EnterpriseMeta, unique := make(map[structs.ServiceName]struct{}) for service := services.Next(); service != nil; service = services.Next() { svc := service.(*structs.ServiceNode) - unique[svc.CompoundServiceName()] = struct{}{} + unique[svc.CompoundServiceName().ServiceName] = struct{}{} } results := make(structs.ServiceList, 0, len(unique)) @@ -1920,17 +1920,17 @@ func (s *Store) deleteServiceTxn(tx WriteTxn, idx uint64, nodeName, serviceID st return fmt.Errorf("failed updating service-kind indexes: %w", err) } // Update the node indexes as the service information is included in node catalog queries. - if err := catalogUpdateNodesIndexes(tx, idx, entMeta, peerName); err != nil { + if err := catalogUpdateNodesIndexes(tx, idx, entMeta, svc.PeerName); err != nil { return fmt.Errorf("failed updating nodes indexes: %w", err) } - if err := catalogUpdateNodeIndexes(tx, idx, nodeName, entMeta, peerName); err != nil { + if err := catalogUpdateNodeIndexes(tx, idx, nodeName, entMeta, svc.PeerName); err != nil { return fmt.Errorf("failed updating node indexes: %w", err) } - name := svc.CompoundServiceName() + psn := svc.CompoundServiceName() if err := cleanupMeshTopology(tx, idx, svc); err != nil { - return fmt.Errorf("failed to clean up mesh-topology associations for %q: %v", name.String(), err) + return fmt.Errorf("failed to clean up mesh-topology associations for %q: %v", psn.String(), err) } q := Query{ @@ -1957,12 +1957,14 @@ func (s *Store) deleteServiceTxn(tx WriteTxn, idx uint64, nodeName, serviceID st if err := catalogUpdateServiceExtinctionIndex(tx, idx, entMeta, svc.PeerName); err != nil { return err } - psn := structs.PeeredServiceName{Peer: svc.PeerName, ServiceName: name} if err := freeServiceVirtualIP(tx, idx, psn, nil); err != nil { - return fmt.Errorf("failed to clean up virtual IP for %q: %v", name.String(), err) + return fmt.Errorf("failed to clean up virtual IP for %q: %v", psn.String(), err) } - if err := cleanupKindServiceName(tx, idx, svc.CompoundServiceName(), svc.ServiceKind); err != nil { - return fmt.Errorf("failed to persist service name: %v", err) + + if svc.PeerName == "" { + if err := cleanupKindServiceName(tx, idx, psn.ServiceName, svc.ServiceKind); err != nil { + return fmt.Errorf("failed to persist service name: %v", err) + } } } } else { @@ -1990,7 +1992,7 @@ func (s *Store) deleteServiceTxn(tx WriteTxn, idx uint64, nodeName, serviceID st if svc.PeerName == "" { sn := structs.ServiceName{Name: svc.ServiceName, EnterpriseMeta: svc.EnterpriseMeta} if err := cleanupGatewayWildcards(tx, idx, sn, false); err != nil { - return fmt.Errorf("failed to clean up gateway-service associations for %q: %v", name.String(), err) + return fmt.Errorf("failed to clean up gateway-service associations for %q: %v", psn.String(), err) } } @@ -2695,7 +2697,7 @@ func (s *Store) CheckIngressServiceNodes(ws memdb.WatchSet, serviceName string, // De-dup services to lookup names := make(map[structs.ServiceName]struct{}) for _, n := range nodes { - names[n.CompoundServiceName()] = struct{}{} + names[n.CompoundServiceName().ServiceName] = struct{}{} } var results structs.CheckServiceNodes @@ -3657,7 +3659,7 @@ func updateGatewayNamespace(tx WriteTxn, idx uint64, service *structs.GatewaySer continue } - existing, err := tx.First(tableGatewayServices, indexID, service.Gateway, sn.CompoundServiceName(), service.Port) + existing, err := tx.First(tableGatewayServices, indexID, service.Gateway, sn.CompoundServiceName().ServiceName, service.Port) if err != nil { return fmt.Errorf("gateway service lookup failed: %s", err) } @@ -4611,7 +4613,10 @@ func updateMeshTopology(tx WriteTxn, idx uint64, node string, svc *structs.NodeS // cleanupMeshTopology removes a service from the mesh topology table // This is only safe to call when there are no more known instances of this proxy func cleanupMeshTopology(tx WriteTxn, idx uint64, service *structs.ServiceNode) error { - // TODO(peering): make this peering aware? + if service.PeerName != "" { + return nil + } + if service.ServiceKind != structs.ServiceKindConnectProxy { return nil } diff --git a/agent/consul/state/catalog_test.go b/agent/consul/state/catalog_test.go index cef5ba0a0a0..b5976bbd2b0 100644 --- a/agent/consul/state/catalog_test.go +++ b/agent/consul/state/catalog_test.go @@ -2577,20 +2577,49 @@ func TestStateStore_DeleteService(t *testing.T) { testRegisterService(t, s, 2, "node1", "service1") testRegisterCheck(t, s, 3, "node1", "service1", "check1", api.HealthPassing) - // Delete the service. + // register a node with a service on a cluster peer. + testRegisterNodeOpts(t, s, 4, "node1", func(n *structs.Node) error { + n.PeerName = "cluster-01" + return nil + }) + testRegisterServiceOpts(t, s, 5, "node1", "service1", func(service *structs.NodeService) { + service.PeerName = "cluster-01" + }) + + wsPeer := memdb.NewWatchSet() + _, ns, err := s.NodeServices(wsPeer, "node1", nil, "cluster-01") + require.Len(t, ns.Services, 1) + require.NoError(t, err) + ws := memdb.NewWatchSet() - _, _, err := s.NodeServices(ws, "node1", nil, "") + _, ns, err = s.NodeServices(ws, "node1", nil, "") + require.Len(t, ns.Services, 1) require.NoError(t, err) - if err := s.DeleteService(4, "node1", "service1", nil, ""); err != nil { - t.Fatalf("err: %s", err) + + { + // Delete the peered service. + err = s.DeleteService(6, "node1", "service1", nil, "cluster-01") + require.NoError(t, err) + require.True(t, watchFired(wsPeer)) + _, kindServiceNames, err := s.ServiceNamesOfKind(nil, structs.ServiceKindTypical) + require.NoError(t, err) + require.Len(t, kindServiceNames, 1) + require.Equal(t, "service1", kindServiceNames[0].Service.Name) } - if !watchFired(ws) { - t.Fatalf("bad") + + { + // Delete the service. + err = s.DeleteService(6, "node1", "service1", nil, "") + require.NoError(t, err) + require.True(t, watchFired(ws)) + _, kindServiceNames, err := s.ServiceNamesOfKind(nil, structs.ServiceKindTypical) + require.NoError(t, err) + require.Len(t, kindServiceNames, 0) } // Service doesn't exist. ws = memdb.NewWatchSet() - _, ns, err := s.NodeServices(ws, "node1", nil, "") + _, ns, err = s.NodeServices(ws, "node1", nil, "") if err != nil || ns == nil || len(ns.Services) != 0 { t.Fatalf("bad: %#v (err: %#v)", ns, err) } @@ -2605,15 +2634,15 @@ func TestStateStore_DeleteService(t *testing.T) { } // Index tables were updated. - assert.Equal(t, uint64(4), catalogChecksMaxIndex(tx, nil, "")) - assert.Equal(t, uint64(4), catalogServicesMaxIndex(tx, nil, "")) + assert.Equal(t, uint64(6), catalogChecksMaxIndex(tx, nil, "")) + assert.Equal(t, uint64(6), catalogServicesMaxIndex(tx, nil, "")) // Deleting a nonexistent service should be idempotent and not return an // error, nor fire a watch. - if err := s.DeleteService(5, "node1", "service1", nil, ""); err != nil { + if err := s.DeleteService(6, "node1", "service1", nil, ""); err != nil { t.Fatalf("err: %s", err) } - assert.Equal(t, uint64(4), catalogServicesMaxIndex(tx, nil, "")) + assert.Equal(t, uint64(6), catalogServicesMaxIndex(tx, nil, "")) if watchFired(ws) { t.Fatalf("bad") } diff --git a/agent/consul/state/usage.go b/agent/consul/state/usage.go index 5e3d7ce9cb3..9db30e5b2d1 100644 --- a/agent/consul/state/usage.go +++ b/agent/consul/state/usage.go @@ -126,11 +126,11 @@ func updateUsage(tx WriteTxn, changes Changes) error { // changed, in order to compare it with the finished memdb state. // Make sure to account for the fact that services can change their names. if serviceNameChanged(change) { - serviceNameChanges[svc.CompoundServiceName()] += 1 + serviceNameChanges[svc.CompoundServiceName().ServiceName] += 1 before := change.Before.(*structs.ServiceNode) - serviceNameChanges[before.CompoundServiceName()] -= 1 + serviceNameChanges[before.CompoundServiceName().ServiceName] -= 1 } else { - serviceNameChanges[svc.CompoundServiceName()] += delta + serviceNameChanges[svc.CompoundServiceName().ServiceName] += delta } case "kvs": diff --git a/agent/structs/structs.go b/agent/structs/structs.go index ae23899c905..9d752a383d5 100644 --- a/agent/structs/structs.go +++ b/agent/structs/structs.go @@ -1153,7 +1153,7 @@ func (sn *ServiceNode) CompoundServiceID() ServiceID { } } -func (sn *ServiceNode) CompoundServiceName() ServiceName { +func (sn *ServiceNode) CompoundServiceName() PeeredServiceName { name := sn.ServiceName if name == "" { name = sn.ServiceID @@ -1163,10 +1163,14 @@ func (sn *ServiceNode) CompoundServiceName() ServiceName { entMeta := sn.EnterpriseMeta entMeta.Normalize() - return ServiceName{ - Name: name, - EnterpriseMeta: entMeta, + return PeeredServiceName{ + ServiceName: ServiceName{ + Name: name, + EnterpriseMeta: entMeta, + }, + Peer: sn.PeerName, } + } // Weights represent the weight used by DNS for a given status From e5c2818ccc902c5b40b70b98faab571199c5f702 Mon Sep 17 00:00:00 2001 From: Semir Patel Date: Wed, 8 Mar 2023 13:32:22 -0600 Subject: [PATCH 131/262] Update changelog with patch releases (#16576) --- CHANGELOG.md | 68 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1a9c4751426..ee7c6d4bb73 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,71 @@ +## 1.15.1 (March 7, 2023) + +IMPROVEMENTS: + +* cli: added `-append-policy-id`, `-append-policy-name`, `-append-role-name`, and `-append-role-id` flags to the `consul token update` command. +These flags allow updates to a token's policies/roles without having to override them completely. [[GH-16288](https://github.com/hashicorp/consul/issues/16288)] +* cli: added `-append-service-identity` and `-append-node-identity` flags to the `consul token update` command. +These flags allow updates to a token's node identities/service identities without having to override them. [[GH-16506](https://github.com/hashicorp/consul/issues/16506)] +* connect: Bump Envoy 1.22.5 to 1.22.7, 1.23.2 to 1.23.4, 1.24.0 to 1.24.2, add 1.25.1, remove 1.21.5 [[GH-16274](https://github.com/hashicorp/consul/issues/16274)] +* mesh: Add ServiceResolver RequestTimeout for route timeouts to make request timeouts configurable [[GH-16495](https://github.com/hashicorp/consul/issues/16495)] +* ui: support filtering API gateways in the ui and displaying their documentation links [[GH-16508](https://github.com/hashicorp/consul/issues/16508)] + +DEPRECATIONS: + +* cli: Deprecate the `-merge-node-identites` and `-merge-service-identities` flags from the `consul token update` command in favor of: `-append-node-identity` and `-append-service-identity`. [[GH-16506](https://github.com/hashicorp/consul/issues/16506)] +* cli: Deprecate the `-merge-policies` and `-merge-roles` flags from the `consul token update` command in favor of: `-append-policy-id`, `-append-policy-name`, `-append-role-name`, and `-append-role-id`. [[GH-16288](https://github.com/hashicorp/consul/issues/16288)] + +BUG FIXES: + +* cli: Fixes an issue with `consul connect envoy` where a log to STDOUT could malform JSON when used with `-bootstrap`. [[GH-16530](https://github.com/hashicorp/consul/issues/16530)] +* cli: Fixes an issue with `consul connect envoy` where grpc-disabled agents were not error-handled correctly. [[GH-16530](https://github.com/hashicorp/consul/issues/16530)] +* cli: ensure acl token read -self works [[GH-16445](https://github.com/hashicorp/consul/issues/16445)] +* cli: fix panic read non-existent acl policy [[GH-16485](https://github.com/hashicorp/consul/issues/16485)] +* gateways: fix HTTPRoute bug where service weights could be less than or equal to 0 and result in a downstream envoy protocol error [[GH-16512](https://github.com/hashicorp/consul/issues/16512)] +* gateways: fix HTTPRoute bug where services with a weight not divisible by 10000 are never registered properly [[GH-16531](https://github.com/hashicorp/consul/issues/16531)] +* mesh: Fix resolution of service resolvers with subsets for external upstreams [[GH-16499](https://github.com/hashicorp/consul/issues/16499)] +* proxycfg: ensure that an irrecoverable error in proxycfg closes the xds session and triggers a replacement proxycfg watcher [[GH-16497](https://github.com/hashicorp/consul/issues/16497)] +* proxycfg: fix a bug where terminating gateways were not cleaning up deleted service resolvers for their referenced services [[GH-16498](https://github.com/hashicorp/consul/issues/16498)] +* ui: Fix issue with lists and filters not rendering properly [[GH-16444](https://github.com/hashicorp/consul/issues/16444)] + +## 1.14.5 (March 7, 2023) + +SECURITY: + +* Upgrade to use Go 1.20.1. +This resolves vulnerabilities [CVE-2022-41724](https://go.dev/issue/58001) in `crypto/tls` and [CVE-2022-41723](https://go.dev/issue/57855) in `net/http`. [[GH-16263](https://github.com/hashicorp/consul/issues/16263)] + +IMPROVEMENTS: + +* container: Upgrade container image to use to Alpine 3.17. [[GH-16358](https://github.com/hashicorp/consul/issues/16358)] +* mesh: Add ServiceResolver RequestTimeout for route timeouts to make request timeouts configurable [[GH-16495](https://github.com/hashicorp/consul/issues/16495)] + +BUG FIXES: + +* mesh: Fix resolution of service resolvers with subsets for external upstreams [[GH-16499](https://github.com/hashicorp/consul/issues/16499)] +* peering: Fix bug where services were incorrectly imported as connect-enabled. [[GH-16339](https://github.com/hashicorp/consul/issues/16339)] +* peering: Fix issue where mesh gateways would use the wrong address when contacting a remote peer with the same datacenter name. [[GH-16257](https://github.com/hashicorp/consul/issues/16257)] +* peering: Fix issue where secondary wan-federated datacenters could not be used as peering acceptors. [[GH-16230](https://github.com/hashicorp/consul/issues/16230)] +* proxycfg: fix a bug where terminating gateways were not cleaning up deleted service resolvers for their referenced services [[GH-16498](https://github.com/hashicorp/consul/issues/16498)] + +## 1.13.7 (March 7, 2023) + +SECURITY: + +* Upgrade to use Go 1.19.6. +This resolves vulnerabilities [CVE-2022-41724](https://go.dev/issue/58001) in `crypto/tls` and [CVE-2022-41723](https://go.dev/issue/57855) in `net/http`. [[GH-16299](https://github.com/hashicorp/consul/issues/16299)] + +IMPROVEMENTS: + +* xds: Removed a bottleneck in Envoy config generation. [[GH-16269](https://github.com/hashicorp/consul/issues/16269)] +* container: Upgrade container image to use to Alpine 3.17. [[GH-16358](https://github.com/hashicorp/consul/issues/16358)] +* mesh: Add ServiceResolver RequestTimeout for route timeouts to make request timeouts configurable [[GH-16495](https://github.com/hashicorp/consul/issues/16495)] + +BUG FIXES: + +* mesh: Fix resolution of service resolvers with subsets for external upstreams [[GH-16499](https://github.com/hashicorp/consul/issues/16499)] +* proxycfg: fix a bug where terminating gateways were not cleaning up deleted service resolvers for their referenced services [[GH-16498](https://github.com/hashicorp/consul/issues/16498)] + ## 1.15.0 (February 23, 2023) BREAKING CHANGES: From 9a5cb2057097e7b8dfe28a48abdb47d357c01387 Mon Sep 17 00:00:00 2001 From: Semir Patel Date: Wed, 8 Mar 2023 14:37:50 -0600 Subject: [PATCH 132/262] Bump submodules from latest 1.15.1 patch release (#16578) * Update changelog with Consul patch releases 1.13.7, 1.14.5, 1.15.1 * Bump submodules from latest patch release * Forgot one --- api/go.mod | 2 +- envoyextensions/go.mod | 4 ++-- envoyextensions/go.sum | 14 ++------------ go.mod | 8 ++++---- test/integration/consul-container/go.mod | 6 ++---- test/integration/consul-container/go.sum | 1 - troubleshoot/go.mod | 4 ++-- troubleshoot/go.sum | 2 +- 8 files changed, 14 insertions(+), 27 deletions(-) diff --git a/api/go.mod b/api/go.mod index c987fde1abe..e53e4908c43 100644 --- a/api/go.mod +++ b/api/go.mod @@ -6,7 +6,7 @@ replace github.com/hashicorp/consul/sdk => ../sdk require ( github.com/google/go-cmp v0.5.7 - github.com/hashicorp/consul/sdk v0.13.0 + github.com/hashicorp/consul/sdk v0.13.1 github.com/hashicorp/go-cleanhttp v0.5.1 github.com/hashicorp/go-hclog v0.12.0 github.com/hashicorp/go-rootcerts v1.0.2 diff --git a/envoyextensions/go.mod b/envoyextensions/go.mod index f96560804c9..6dc8e782b88 100644 --- a/envoyextensions/go.mod +++ b/envoyextensions/go.mod @@ -6,8 +6,8 @@ replace github.com/hashicorp/consul/api => ../api require ( github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1 - github.com/hashicorp/consul/api v1.10.1-0.20230209203402-db2bd404bf72 - github.com/hashicorp/consul/sdk v0.13.0 + github.com/hashicorp/consul/api v1.20.0 + github.com/hashicorp/consul/sdk v0.13.1 github.com/hashicorp/go-hclog v1.2.1 github.com/hashicorp/go-multierror v1.1.1 github.com/hashicorp/go-version v1.2.1 diff --git a/envoyextensions/go.sum b/envoyextensions/go.sum index bf542e8f1dc..28b2402b3ec 100644 --- a/envoyextensions/go.sum +++ b/envoyextensions/go.sum @@ -58,13 +58,12 @@ github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.7 h1:81/ik6ipDQS2aGcBfIN5dHDB36BwrStyeAQquSYCV4o= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/hashicorp/consul/sdk v0.13.0 h1:lce3nFlpv8humJL8rNrrGHYSKc3q+Kxfeg3Ii1m6ZWU= -github.com/hashicorp/consul/sdk v0.13.0/go.mod h1:0hs/l5fOVhJy/VdcoaNqUSi2AUs95eF5WKtv+EYIQqE= +github.com/hashicorp/consul/sdk v0.13.1 h1:EygWVWWMczTzXGpO93awkHFzfUka6hLYJ0qhETd+6lY= +github.com/hashicorp/consul/sdk v0.13.1/go.mod h1:SW/mM4LbKfqmMvcFu8v+eiQQ7oitXEFeiBe9StxERb0= github.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/go-cleanhttp v0.5.1 h1:dH3aiDG9Jvb5r5+bYHsikaOUIpcM0xvgMXVoDkXMzJM= github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= -github.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= github.com/hashicorp/go-hclog v1.2.1 h1:YQsLlGDJgwhXFpucSPyVbCBviQtjlHv3jLTlp8YmtEw= github.com/hashicorp/go-hclog v1.2.1/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M= github.com/hashicorp/go-immutable-radix v1.0.0 h1:AKDB1HM5PWEA7i4nhcpwOrO2byshxBjXVn/J/3+z5/0= @@ -95,10 +94,7 @@ github.com/hashicorp/memberlist v0.5.0 h1:EtYPN8DpAURiapus508I4n9CzHs2W+8NZGbmmR github.com/hashicorp/memberlist v0.5.0/go.mod h1:yvyXLpo0QaGE59Y7hDTsTzDD25JYBZ4mHgHUZ8lrOI0= github.com/hashicorp/serf v0.10.1 h1:Z1H2J60yRKvfDYAOZLd2MU0ND4AH/WDz7xYHDWQsIPY= github.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4= -github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI= -github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= @@ -108,7 +104,6 @@ github.com/mattn/go-colorable v0.1.12 h1:jF+Du6AlPIjs2BiUiQlKOX0rt3SujHxPnksPKZb github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y= @@ -124,7 +119,6 @@ github.com/mitchellh/mapstructure v1.4.1 h1:CpVNEelQCZBooIPDn+AR3NpivK/TIKU8bDxd github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c h1:Lgl0gzECD8GnQ5QCWA8o6BtfL6mDH5rQgM4/fX3avOs= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= @@ -179,7 +173,6 @@ golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -191,7 +184,6 @@ golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10 h1:WIoqL4EROvwiPdUtaip4VcDdpZ4kha7wBWZrbVKCIZg= golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -236,10 +228,8 @@ google.golang.org/protobuf v1.27.1 h1:SnqbnDw1V7RiZcXPx5MEeqPv2s79L9i7BJUlG/+Rur google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/go.mod b/go.mod index 23387be4ada..570f6692ab9 100644 --- a/go.mod +++ b/go.mod @@ -38,11 +38,11 @@ require ( github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4 github.com/hashicorp/consul-awsauth v0.0.0-20220713182709-05ac1c5c2706 github.com/hashicorp/consul-net-rpc v0.0.0-20221205195236-156cfab66a69 - github.com/hashicorp/consul/api v1.18.0 - github.com/hashicorp/consul/envoyextensions v0.0.0-20230209212012-3b9c56956132 + github.com/hashicorp/consul/api v1.20.0 + github.com/hashicorp/consul/envoyextensions v0.1.2 github.com/hashicorp/consul/proto-public v0.2.1 - github.com/hashicorp/consul/sdk v0.13.0 - github.com/hashicorp/consul/troubleshoot v0.0.0-00010101000000-000000000000 + github.com/hashicorp/consul/sdk v0.13.1 + github.com/hashicorp/consul/troubleshoot v0.1.2 github.com/hashicorp/go-bexpr v0.1.2 github.com/hashicorp/go-checkpoint v0.5.0 github.com/hashicorp/go-cleanhttp v0.5.2 diff --git a/test/integration/consul-container/go.mod b/test/integration/consul-container/go.mod index 513612707d7..35174f5fd0b 100644 --- a/test/integration/consul-container/go.mod +++ b/test/integration/consul-container/go.mod @@ -6,8 +6,8 @@ require ( github.com/avast/retry-go v3.0.0+incompatible github.com/docker/docker v20.10.22+incompatible github.com/docker/go-connections v0.4.0 - github.com/hashicorp/consul/api v1.18.0 - github.com/hashicorp/consul/sdk v0.13.0 + github.com/hashicorp/consul/api v1.20.0 + github.com/hashicorp/consul/sdk v0.13.1 github.com/hashicorp/go-cleanhttp v0.5.2 github.com/hashicorp/go-multierror v1.1.1 github.com/hashicorp/go-uuid v1.0.2 @@ -20,7 +20,6 @@ require ( github.com/teris-io/shortid v0.0.0-20220617161101-71ec9f2aa569 github.com/testcontainers/testcontainers-go v0.15.0 golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 - gotest.tools v2.2.0+incompatible ) require ( @@ -39,7 +38,6 @@ require ( github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/golang/protobuf v1.5.2 // indirect github.com/google/btree v1.0.0 // indirect - github.com/google/go-cmp v0.5.9 // indirect github.com/google/uuid v1.3.0 // indirect github.com/hashicorp/errwrap v1.1.0 // indirect github.com/hashicorp/go-hclog v1.2.1 // indirect diff --git a/test/integration/consul-container/go.sum b/test/integration/consul-container/go.sum index 029b5645d7c..e554f8ad3f7 100644 --- a/test/integration/consul-container/go.sum +++ b/test/integration/consul-container/go.sum @@ -387,7 +387,6 @@ github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= -github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-containerregistry v0.5.1/go.mod h1:Ct15B4yir3PLOP5jsy0GNeYVaIZs/MK/Jz5any1wFW0= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= diff --git a/troubleshoot/go.mod b/troubleshoot/go.mod index c4e445ee05f..54838b51d79 100644 --- a/troubleshoot/go.mod +++ b/troubleshoot/go.mod @@ -13,8 +13,8 @@ exclude ( require ( github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1 - github.com/hashicorp/consul/api v1.10.1-0.20230209203402-db2bd404bf72 - github.com/hashicorp/consul/envoyextensions v0.0.0-20230209212012-3b9c56956132 + github.com/hashicorp/consul/api v1.20.0 + github.com/hashicorp/consul/envoyextensions v0.1.2 github.com/stretchr/testify v1.8.0 google.golang.org/protobuf v1.28.1 ) diff --git a/troubleshoot/go.sum b/troubleshoot/go.sum index d2e1e9a2b5b..b8177b292c8 100644 --- a/troubleshoot/go.sum +++ b/troubleshoot/go.sum @@ -83,7 +83,7 @@ github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeN github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/hashicorp/consul/sdk v0.13.0 h1:lce3nFlpv8humJL8rNrrGHYSKc3q+Kxfeg3Ii1m6ZWU= +github.com/hashicorp/consul/sdk v0.13.1 h1:EygWVWWMczTzXGpO93awkHFzfUka6hLYJ0qhETd+6lY= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I= github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= From e2c4a787a54f1f0ae2465853c7281e25d0a8acc5 Mon Sep 17 00:00:00 2001 From: Bryce Kalow Date: Wed, 8 Mar 2023 15:30:38 -0600 Subject: [PATCH 133/262] website: adds content-check command and README update (#16579) --- website/README.md | 10 + website/package-lock.json | 2339 +++++++++++++++++++++++++++++++++++-- website/package.json | 6 +- 3 files changed, 2236 insertions(+), 119 deletions(-) diff --git a/website/README.md b/website/README.md index 4633bae5014..2babc35c2d5 100644 --- a/website/README.md +++ b/website/README.md @@ -100,6 +100,16 @@ The significant keys in the YAML frontmatter are: > ⚠️ If there is a need for a `/api/*` url on this website, the url will be changed to `/api-docs/*`, as the `api` folder is reserved by next.js. +### Validating Content + +Content changes are automatically validated against a set of rules as part of the pull request process. If you want to run these checks locally to validate your content before comitting your changes, you can run the following command: + +``` +npm run content-check +``` + +If the validation fails, actionable error messages will be displayed to help you address detected issues. + ### Creating New Pages There is currently a small bug with new page creation - if you create a new page and link it up via subnav data while the server is running, it will report an error saying the page was not found. This can be resolved by restarting the server. diff --git a/website/package-lock.json b/website/package-lock.json index 4e2d3f519e6..dceec6c8edd 100644 --- a/website/package-lock.json +++ b/website/package-lock.json @@ -8,7 +8,8 @@ "name": "consul-docs", "version": "0.0.1", "devDependencies": { - "@hashicorp/platform-cli": "^2.5.1", + "@hashicorp/platform-cli": "^2.6.0", + "@hashicorp/platform-content-conformance": "^0.0.10", "dart-linkcheck": "2.0.15", "husky": "4.3.8", "next": "^12.3.1", @@ -142,11 +143,10 @@ } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz", - "integrity": "sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==", + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz", + "integrity": "sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==", "dev": true, - "peer": true, "engines": { "node": ">=6.9.0" } @@ -286,6 +286,20 @@ "node": ">=6.0.0" } }, + "node_modules/@babel/plugin-proposal-object-rest-spread": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.12.1.tgz", + "integrity": "sha512-s6SowJIjzlhx8o7lsFx5zmY4At6CTtDvgNQDdPzkBQucle58A6b/TTeEBYtyDgmcXjUTM+vE8YOGHZzzbc/ioA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.0", + "@babel/plugin-transform-parameters": "^7.12.1" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, "node_modules/@babel/plugin-syntax-async-generators": { "version": "7.8.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", @@ -351,6 +365,18 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.1.tgz", + "integrity": "sha512-1yRi7yAtB0ETgxdY9ti/p2TivUxJkTdhu/ZbF9MshVGqOx1TdB3b7xCXs49Fupgg50N45KcAsRP/ZqWjs9SRjg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, "node_modules/@babel/plugin-syntax-logical-assignment-operators": { "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", @@ -395,7 +421,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", "dev": true, - "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -445,6 +470,21 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.20.7.tgz", + "integrity": "sha512-WiWBIkeHKVOSYPO0pWkxGPfKeWrCJyD3NJ53+Lrp/QMSZbsVPovrVl2aWZ19D/LTVnaDv5Ap7GJ/B2CTOZdrfA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, "node_modules/@babel/runtime": { "version": "7.20.7", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.7.tgz", @@ -590,9 +630,9 @@ } }, "node_modules/@hashicorp/platform-cli": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@hashicorp/platform-cli/-/platform-cli-2.5.1.tgz", - "integrity": "sha512-kW9bxaYB/Tt3Djl75Kh+u/jRAe7MuX6mdcw+amPaBUnO9ZnNXQXe73fv7nYm7CueZZd2y5PWfx5LPaxWQzhM4g==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@hashicorp/platform-cli/-/platform-cli-2.6.0.tgz", + "integrity": "sha512-nMO7Uiy/A5CT/BCE9RyQt6/Uci7bxwTesxCNWkXlciyqlIrz9WmBa9hr710IiMoDzrzQ1tL6AgFIeTbXs4RTqA==", "dev": true, "dependencies": { "@hashicorp/platform-cms": "0.3.0", @@ -671,6 +711,331 @@ "rivet-graphql": "0.3.1" } }, + "node_modules/@hashicorp/platform-content-conformance": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/@hashicorp/platform-content-conformance/-/platform-content-conformance-0.0.10.tgz", + "integrity": "sha512-vXLbd2w9phS4JfFyh17jCiyu+LXVonTfb7WEUK2eMlOL/wxe2umyJvEQaJNzD5bwyYC8LuXGA5JkbnPXnU5ZQg==", + "dev": true, + "dependencies": { + "find-up": "^6.3.0", + "flat": "^5.0.2", + "globby": "^13.1.2", + "mdast-util-to-string": "^3.1.0", + "remark": "12.0.1", + "remark-mdx": "^1.6.22", + "unified-lint-rule": "^2.1.1", + "unist-util-stringify-position": "^3.0.2", + "unist-util-visit": "^4.1.1", + "vfile": "^5.3.6", + "vfile-matter": "^4.0.0", + "vfile-reporter": "^7.0.4", + "vfile-reporter-json": "^3.2.0", + "vfile-statistics": "^2.0.0", + "yaml": "^2.1.3", + "yargs": "^17.4.1", + "zod": "^3.19.1" + }, + "bin": { + "hc-content": "dist/cli.js" + } + }, + "node_modules/@hashicorp/platform-content-conformance/node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@hashicorp/platform-content-conformance/node_modules/find-up": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", + "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", + "dev": true, + "dependencies": { + "locate-path": "^7.1.0", + "path-exists": "^5.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@hashicorp/platform-content-conformance/node_modules/globby": { + "version": "13.1.3", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.3.tgz", + "integrity": "sha512-8krCNHXvlCgHDpegPzleMq07yMYTO2sXKASmZmquEYWEmCx6J5UTRbp5RwMJkTJGtcQ44YpiUYUiN0b9mzy8Bw==", + "dev": true, + "dependencies": { + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.11", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@hashicorp/platform-content-conformance/node_modules/locate-path": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", + "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", + "dev": true, + "dependencies": { + "p-locate": "^6.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@hashicorp/platform-content-conformance/node_modules/mdast-util-to-string": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-3.1.1.tgz", + "integrity": "sha512-tGvhT94e+cVnQt8JWE9/b3cUQZWS732TJxXHktvP+BYo62PpYD53Ls/6cC60rW21dW+txxiM4zMdc6abASvZKA==", + "dev": true, + "dependencies": { + "@types/mdast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@hashicorp/platform-content-conformance/node_modules/p-limit": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^1.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@hashicorp/platform-content-conformance/node_modules/p-locate": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", + "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", + "dev": true, + "dependencies": { + "p-limit": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@hashicorp/platform-content-conformance/node_modules/path-exists": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", + "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/@hashicorp/platform-content-conformance/node_modules/remark": { + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/remark/-/remark-12.0.1.tgz", + "integrity": "sha512-gS7HDonkdIaHmmP/+shCPejCEEW+liMp/t/QwmF0Xt47Rpuhl32lLtDV1uKWvGoq+kxr5jSgg5oAIpGuyULjUw==", + "dev": true, + "dependencies": { + "remark-parse": "^8.0.0", + "remark-stringify": "^8.0.0", + "unified": "^9.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@hashicorp/platform-content-conformance/node_modules/remark-parse": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-8.0.3.tgz", + "integrity": "sha512-E1K9+QLGgggHxCQtLt++uXltxEprmWzNfg+MxpfHsZlrddKzZ/hZyWHDbK3/Ap8HJQqYJRXP+jHczdL6q6i85Q==", + "dev": true, + "dependencies": { + "ccount": "^1.0.0", + "collapse-white-space": "^1.0.2", + "is-alphabetical": "^1.0.0", + "is-decimal": "^1.0.0", + "is-whitespace-character": "^1.0.0", + "is-word-character": "^1.0.0", + "markdown-escapes": "^1.0.0", + "parse-entities": "^2.0.0", + "repeat-string": "^1.5.4", + "state-toggle": "^1.0.0", + "trim": "0.0.1", + "trim-trailing-lines": "^1.0.0", + "unherit": "^1.0.4", + "unist-util-remove-position": "^2.0.0", + "vfile-location": "^3.0.0", + "xtend": "^4.0.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@hashicorp/platform-content-conformance/node_modules/remark-stringify": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-8.1.1.tgz", + "integrity": "sha512-q4EyPZT3PcA3Eq7vPpT6bIdokXzFGp9i85igjmhRyXWmPs0Y6/d2FYwUNotKAWyLch7g0ASZJn/KHHcHZQ163A==", + "dev": true, + "dependencies": { + "ccount": "^1.0.0", + "is-alphanumeric": "^1.0.0", + "is-decimal": "^1.0.0", + "is-whitespace-character": "^1.0.0", + "longest-streak": "^2.0.1", + "markdown-escapes": "^1.0.0", + "markdown-table": "^2.0.0", + "mdast-util-compact": "^2.0.0", + "parse-entities": "^2.0.0", + "repeat-string": "^1.5.4", + "state-toggle": "^1.0.0", + "stringify-entities": "^3.0.0", + "unherit": "^1.0.4", + "xtend": "^4.0.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@hashicorp/platform-content-conformance/node_modules/slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@hashicorp/platform-content-conformance/node_modules/unist-util-stringify-position": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz", + "integrity": "sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==", + "dev": true, + "dependencies": { + "@types/unist": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@hashicorp/platform-content-conformance/node_modules/vfile": { + "version": "5.3.7", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.3.7.tgz", + "integrity": "sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==", + "dev": true, + "dependencies": { + "@types/unist": "^2.0.0", + "is-buffer": "^2.0.0", + "unist-util-stringify-position": "^3.0.0", + "vfile-message": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@hashicorp/platform-content-conformance/node_modules/vfile-message": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.4.tgz", + "integrity": "sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==", + "dev": true, + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-stringify-position": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@hashicorp/platform-content-conformance/node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/@hashicorp/platform-content-conformance/node_modules/yaml": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.2.1.tgz", + "integrity": "sha512-e0WHiYql7+9wr4cWMx3TVQrNwejKaEe7/rHNmQmqRjazfOP5W8PB6Jpebb5o6fIapbz9o9+2ipcaTM2ZwDI6lw==", + "dev": true, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@hashicorp/platform-content-conformance/node_modules/yargs": { + "version": "17.7.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.1.tgz", + "integrity": "sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==", + "dev": true, + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@hashicorp/platform-content-conformance/node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/@hashicorp/platform-content-conformance/node_modules/yocto-queue": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", + "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", + "dev": true, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/@humanwhocodes/config-array": { "version": "0.11.8", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", @@ -1089,6 +1454,16 @@ "node": ">= 10.14.2" } }, + "node_modules/@mdx-js/util": { + "version": "1.6.22", + "resolved": "https://registry.npmjs.org/@mdx-js/util/-/util-1.6.22.tgz", + "integrity": "sha512-H1rQc1ZOHANWBvPcW+JpGwr+juXSxM8Q8YCkm3GhZd8REu1fHR3z99CErO1p9pkcfcxZnMdIZdIsXkOHY0NilA==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/@next/env": { "version": "12.3.1", "resolved": "https://registry.npmjs.org/@next/env/-/env-12.3.1.tgz", @@ -1613,6 +1988,12 @@ "dev": true, "peer": true }, + "node_modules/@types/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/@types/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-dPWnWsf+kzIG140B8z2w3fr5D03TLWbOAFQl45xUpI3vcizeXriNR5VYkWZ+WTMsUHqZ9Xlt3hrxGNANFyNQfw==", + "dev": true + }, "node_modules/@types/unist": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.3.tgz", @@ -2759,6 +3140,16 @@ "node": "6.* || 8.* || >= 10.*" } }, + "node_modules/ccount": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-1.1.0.tgz", + "integrity": "sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/chalk": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", @@ -2795,6 +3186,16 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/character-entities-html4": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-1.1.4.tgz", + "integrity": "sha512-HRcDxZuZqMx3/a+qrzxdBKBPUpxWEq9xw2OPZ3a/174ihfrQKVsFhqtthBInFy1zZ9GgZyFXOatNujm8M+El3g==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/character-entities-legacy": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz", @@ -3052,6 +3453,16 @@ "node": ">= 0.12.0" } }, + "node_modules/collapse-white-space": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-1.0.6.tgz", + "integrity": "sha512-jEovNnrhMuqyCcjfEJA56v0Xq8SkIoPKDyaHahwo3POf4qcSXqMYuwNcOTzp74vTsR9Tn08z4MxWqAhcekogkQ==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/collect-v8-coverage": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", @@ -3580,7 +3991,13 @@ "domelementtype": "1" } }, - "node_modules/ejs": { + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true + }, + "node_modules/ejs": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.5.tgz", "integrity": "sha512-dldq3ZfFtgVTJMLjOe+/3sROTzALlL9E34V4/sDtUd/KlBSS0s6U1/+WPE1B4sj9CXHJpL1M6rhNJnc9Wbal9w==", @@ -4994,6 +5411,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true, + "bin": { + "flat": "cli.js" + } + }, "node_modules/flat-cache": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", @@ -5142,7 +5568,6 @@ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true, - "peer": true, "engines": { "node": "6.* || 8.* || >= 10.*" } @@ -5986,6 +6411,15 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/is-alphanumeric": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-alphanumeric/-/is-alphanumeric-1.0.0.tgz", + "integrity": "sha512-ZmRL7++ZkcMOfDuWZuMJyIVLr2keE1o/DeNWh1EmgqGhUcV+9BIVsx0BcSBOHTZqzjs4+dISzr2KAeBEWGgXeA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/is-alphanumerical": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz", @@ -6511,6 +6945,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-whitespace-character": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-whitespace-character/-/is-whitespace-character-1.0.4.tgz", + "integrity": "sha512-SDweEzfIZM0SJV0EUga669UTKlmL0Pq8Lno0QDQsPnvECB3IM2aP0gdx5TrU0A01MAPfViaZiI2V1QMZLaKK5w==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/is-windows": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", @@ -6521,6 +6965,16 @@ "node": ">=0.10.0" } }, + "node_modules/is-word-character": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-word-character/-/is-word-character-1.0.4.tgz", + "integrity": "sha512-5SMO8RVennx3nZrqtKwCGyyetPE9VDba5ugvKLaD4KopPG5kR4mQ7tNt/r7feL5yt5h3lpuBbIUmCOG2eSzXHA==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/is-wsl": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", @@ -7993,6 +8447,29 @@ "node": ">=0.10.0" } }, + "node_modules/markdown-escapes": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/markdown-escapes/-/markdown-escapes-1.0.4.tgz", + "integrity": "sha512-8z4efJYk43E0upd0NbVXwgSTQs6cT3T06etieCMEg7dRbzCbxUCK/GHlX8mhHRDcp+OLlHkPKsvqQTCvsRl2cg==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/markdown-table": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-2.0.0.tgz", + "integrity": "sha512-Ezda85ToJUBhM6WGaG6veasyym+Tbs3cMAw/ZhOPqXiYsr0jgocBV3j3nx+4lk47plLlIqjwuTm/ywVI+zjJ/A==", + "dev": true, + "dependencies": { + "repeat-string": "^1.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/mathml-tag-names": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz", @@ -8003,6 +8480,48 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/mdast-util-compact": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-compact/-/mdast-util-compact-2.0.1.tgz", + "integrity": "sha512-7GlnT24gEwDrdAwEHrU4Vv5lLWrEer4KOkAiKT9nYstsTad7Oc1TwqT2zIMKRdZF7cTuaf+GA1E4Kv7jJh8mPA==", + "dev": true, + "dependencies": { + "unist-util-visit": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-compact/node_modules/unist-util-visit": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-2.0.3.tgz", + "integrity": "sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==", + "dev": true, + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^4.0.0", + "unist-util-visit-parents": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-compact/node_modules/unist-util-visit-parents": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-3.1.1.tgz", + "integrity": "sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg==", + "dev": true, + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/mdast-util-from-markdown": { "version": "0.8.5", "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-0.8.5.tgz", @@ -10282,6 +10801,60 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/remark-mdx": { + "version": "1.6.22", + "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-1.6.22.tgz", + "integrity": "sha512-phMHBJgeV76uyFkH4rvzCftLfKCr2RZuF+/gmVcaKrpsihyzmhXjA0BEMDaPTXG5y8qZOKPVo83NAOX01LPnOQ==", + "dev": true, + "dependencies": { + "@babel/core": "7.12.9", + "@babel/helper-plugin-utils": "7.10.4", + "@babel/plugin-proposal-object-rest-spread": "7.12.1", + "@babel/plugin-syntax-jsx": "7.12.1", + "@mdx-js/util": "1.6.22", + "is-alphabetical": "1.0.4", + "remark-parse": "8.0.3", + "unified": "9.2.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-mdx/node_modules/@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", + "dev": true + }, + "node_modules/remark-mdx/node_modules/remark-parse": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-8.0.3.tgz", + "integrity": "sha512-E1K9+QLGgggHxCQtLt++uXltxEprmWzNfg+MxpfHsZlrddKzZ/hZyWHDbK3/Ap8HJQqYJRXP+jHczdL6q6i85Q==", + "dev": true, + "dependencies": { + "ccount": "^1.0.0", + "collapse-white-space": "^1.0.2", + "is-alphabetical": "^1.0.0", + "is-decimal": "^1.0.0", + "is-whitespace-character": "^1.0.0", + "is-word-character": "^1.0.0", + "markdown-escapes": "^1.0.0", + "parse-entities": "^2.0.0", + "repeat-string": "^1.5.4", + "state-toggle": "^1.0.0", + "trim": "0.0.1", + "trim-trailing-lines": "^1.0.0", + "unherit": "^1.0.4", + "unist-util-remove-position": "^2.0.0", + "vfile-location": "^3.0.0", + "xtend": "^4.0.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/remark-parse": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-9.0.0.tgz", @@ -10339,7 +10912,6 @@ "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", "dev": true, - "peer": true, "engines": { "node": ">=0.10.0" } @@ -11496,6 +12068,16 @@ "node": ">=8" } }, + "node_modules/state-toggle": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/state-toggle/-/state-toggle-1.0.3.tgz", + "integrity": "sha512-d/5Z4/2iiCnHw6Xzghyhb+GcmF89bxwgXG60wjIiZaxnymbyOmI8Hk4VqHXiVVp6u2ysaskFfXg3ekCj4WNftQ==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/static-extend": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", @@ -11732,6 +12314,21 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/stringify-entities": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-3.1.0.tgz", + "integrity": "sha512-3FP+jGMmMV/ffZs86MoghGqAoqXAdxLrJP4GUdrDN1aIScYih5tuIO3eF4To5AJZ79KDZ8Fpdy7QJnK8SsL1Vg==", + "dev": true, + "dependencies": { + "character-entities-html4": "^1.0.0", + "character-entities-legacy": "^1.0.0", + "xtend": "^4.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/stringify-object": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", @@ -12645,6 +13242,12 @@ "node": ">= 4.0.0" } }, + "node_modules/trim": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/trim/-/trim-0.0.1.tgz", + "integrity": "sha512-YzQV+TZg4AxpKxaTHK3c3D+kRDCGVEE7LemdlQZoQXn0iennk10RsIoY6ikzAqJTc9Xjl9C1/waHom/J86ziAQ==", + "dev": true + }, "node_modules/trim-newlines": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", @@ -12654,6 +13257,16 @@ "node": ">=8" } }, + "node_modules/trim-trailing-lines": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/trim-trailing-lines/-/trim-trailing-lines-1.1.4.tgz", + "integrity": "sha512-rjUWSqnfTNrjbB9NQWfPMH/xRK1deHeGsHoVfpxJ++XeYXE0d6B1En37AHfw3jtfTU7dzMzZL2jjpe8Qb5gLIQ==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/trough": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/trough/-/trough-1.0.5.tgz", @@ -12820,6 +13433,20 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/unherit": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/unherit/-/unherit-1.1.3.tgz", + "integrity": "sha512-Ft16BJcnapDKp0+J/rqFC3Rrk6Y/Ng4nzsC028k2jdDII/rdZ7Wd3pPT/6+vIIxRagwRc9K0IUX0Ra4fKvw+WQ==", + "dev": true, + "dependencies": { + "inherits": "^2.0.0", + "xtend": "^4.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/unified": { "version": "9.2.0", "resolved": "https://registry.npmjs.org/unified/-/unified-9.2.0.tgz", @@ -12838,6 +13465,116 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/unified-lint-rule": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/unified-lint-rule/-/unified-lint-rule-2.1.1.tgz", + "integrity": "sha512-vsLHyLZFstqtGse2gvrGwasOmH8M2y+r2kQMoDSWzSqUkQx2MjHjvZuGSv5FUaiv4RQO1bHRajy7lSGp7XWq5A==", + "dev": true, + "dependencies": { + "@types/unist": "^2.0.0", + "trough": "^2.0.0", + "unified": "^10.0.0", + "vfile": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unified-lint-rule/node_modules/bail": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", + "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/unified-lint-rule/node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/unified-lint-rule/node_modules/trough": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/trough/-/trough-2.1.0.tgz", + "integrity": "sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/unified-lint-rule/node_modules/unified": { + "version": "10.1.2", + "resolved": "https://registry.npmjs.org/unified/-/unified-10.1.2.tgz", + "integrity": "sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==", + "dev": true, + "dependencies": { + "@types/unist": "^2.0.0", + "bail": "^2.0.0", + "extend": "^3.0.0", + "is-buffer": "^2.0.0", + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unified-lint-rule/node_modules/unist-util-stringify-position": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz", + "integrity": "sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==", + "dev": true, + "dependencies": { + "@types/unist": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unified-lint-rule/node_modules/vfile": { + "version": "5.3.7", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.3.7.tgz", + "integrity": "sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==", + "dev": true, + "dependencies": { + "@types/unist": "^2.0.0", + "is-buffer": "^2.0.0", + "unist-util-stringify-position": "^3.0.0", + "vfile-message": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unified-lint-rule/node_modules/vfile-message": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.4.tgz", + "integrity": "sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==", + "dev": true, + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-stringify-position": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/unified/node_modules/is-plain-obj": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", @@ -12886,55 +13623,146 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/unist-util-stringify-position": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz", - "integrity": "sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==", + "node_modules/unist-util-remove-position": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-2.0.1.tgz", + "integrity": "sha512-fDZsLYIe2uT+oGFnuZmy73K6ZxOPG/Qcm+w7jbEjaFcJgbQ6cqjs/eSPzXhsmGpAsWPkqZM9pYjww5QTn3LHMA==", "dev": true, "dependencies": { - "@types/unist": "^2.0.2" + "unist-util-visit": "^2.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, - "node_modules/universalify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-1.0.0.tgz", - "integrity": "sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==", + "node_modules/unist-util-remove-position/node_modules/unist-util-visit": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-2.0.3.tgz", + "integrity": "sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==", "dev": true, - "engines": { - "node": ">= 10.0.0" + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^4.0.0", + "unist-util-visit-parents": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "node_modules/unist-util-remove-position/node_modules/unist-util-visit-parents": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-3.1.1.tgz", + "integrity": "sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg==", "dev": true, - "peer": true, "dependencies": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" + "@types/unist": "^2.0.0", + "unist-util-is": "^4.0.0" }, - "engines": { - "node": ">=0.10.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/unset-value/node_modules/has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "node_modules/unist-util-stringify-position": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz", + "integrity": "sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==", "dev": true, - "peer": true, "dependencies": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" + "@types/unist": "^2.0.2" }, - "engines": { - "node": ">=0.10.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.2.tgz", + "integrity": "sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==", + "dev": true, + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0", + "unist-util-visit-parents": "^5.1.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-parents": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz", + "integrity": "sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==", + "dev": true, + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-parents/node_modules/unist-util-is": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.2.0.tgz", + "integrity": "sha512-Glt17jWwZeyqrFqOK0pF1Ded5U3yzJnFr8CG1GMjCWTp9zDo2p+cmD6pWbZU8AgM5WU3IzRv6+rBwhzsGh6hBQ==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit/node_modules/unist-util-is": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.2.0.tgz", + "integrity": "sha512-Glt17jWwZeyqrFqOK0pF1Ded5U3yzJnFr8CG1GMjCWTp9zDo2p+cmD6pWbZU8AgM5WU3IzRv6+rBwhzsGh6hBQ==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/universalify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-1.0.0.tgz", + "integrity": "sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "dev": true, + "peer": true, + "dependencies": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "dev": true, + "peer": true, + "dependencies": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, "node_modules/unset-value/node_modules/has-value/node_modules/isobject": { @@ -12983,103 +13811,476 @@ "integrity": "sha512-O08GjTiAFNsSlrUWfqF1jH0H1W3m35ZyadHrGv5krdnmPPoxP27oDTqux/579PtaroiSGm5yma6KT1mHFH6Y/g==", "dev": true, "dependencies": { - "ip-regex": "^4.1.0", - "tlds": "^1.203.0" + "ip-regex": "^4.1.0", + "tlds": "^1.203.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "dev": true, + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/use-sync-external-store": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz", + "integrity": "sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==", + "dev": true, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "node_modules/v8-compile-cache": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", + "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", + "dev": true + }, + "node_modules/v8-to-istanbul": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-7.1.2.tgz", + "integrity": "sha512-TxNb7YEUwkLXCQYeudi6lgQ/SZrzNO4kMdlqVxaZPUIUjCv6iSSypUQX70kNBSERpQ8fk48+d61FXk+tgqcWow==", + "dev": true, + "peer": true, + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^1.6.0", + "source-map": "^0.7.3" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/v8-to-istanbul/node_modules/source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "dev": true, + "peer": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/vfile": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.2.1.tgz", + "integrity": "sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==", + "dev": true, + "dependencies": { + "@types/unist": "^2.0.0", + "is-buffer": "^2.0.0", + "unist-util-stringify-position": "^2.0.0", + "vfile-message": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-location": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-3.2.0.tgz", + "integrity": "sha512-aLEIZKv/oxuCDZ8lkJGhuhztf/BW4M+iHdCwglA/eWc+vtuRFJj8EtgceYFX4LRjOhCAAiNHsKGssC6onJ+jbA==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-matter": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/vfile-matter/-/vfile-matter-4.0.1.tgz", + "integrity": "sha512-ZeACdaxCOxhePpoLO4A5y/VgI9EuWBXu+sUk65aQ7lXBZDFg7X0tuOzigLJUtsQzazFt6K2m9SdlDxZdfL5vVg==", + "dev": true, + "dependencies": { + "is-buffer": "^2.0.0", + "vfile": "^5.0.0", + "yaml": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-matter/node_modules/unist-util-stringify-position": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz", + "integrity": "sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==", + "dev": true, + "dependencies": { + "@types/unist": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-matter/node_modules/vfile": { + "version": "5.3.7", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.3.7.tgz", + "integrity": "sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==", + "dev": true, + "dependencies": { + "@types/unist": "^2.0.0", + "is-buffer": "^2.0.0", + "unist-util-stringify-position": "^3.0.0", + "vfile-message": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-matter/node_modules/vfile-message": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.4.tgz", + "integrity": "sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==", + "dev": true, + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-stringify-position": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-matter/node_modules/yaml": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.2.1.tgz", + "integrity": "sha512-e0WHiYql7+9wr4cWMx3TVQrNwejKaEe7/rHNmQmqRjazfOP5W8PB6Jpebb5o6fIapbz9o9+2ipcaTM2ZwDI6lw==", + "dev": true, + "engines": { + "node": ">= 14" + } + }, + "node_modules/vfile-message": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz", + "integrity": "sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==", + "dev": true, + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-stringify-position": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-reporter": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/vfile-reporter/-/vfile-reporter-7.0.5.tgz", + "integrity": "sha512-NdWWXkv6gcd7AZMvDomlQbK3MqFWL1RlGzMn++/O2TI+68+nqxCPTvLugdOtfSzXmjh+xUyhp07HhlrbJjT+mw==", + "dev": true, + "dependencies": { + "@types/supports-color": "^8.0.0", + "string-width": "^5.0.0", + "supports-color": "^9.0.0", + "unist-util-stringify-position": "^3.0.0", + "vfile": "^5.0.0", + "vfile-message": "^3.0.0", + "vfile-sort": "^3.0.0", + "vfile-statistics": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-reporter-json": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/vfile-reporter-json/-/vfile-reporter-json-3.3.0.tgz", + "integrity": "sha512-/zgRtjxQ2UGJn+HViiZ7+nIXtUzkkXFQum3BmaS/bSyr10P0X41ETRqqwMJ95RtbKUah3m7pKb6oS1eZeXXHzQ==", + "dev": true, + "dependencies": { + "vfile": "^5.0.0", + "vfile-message": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-reporter-json/node_modules/unist-util-stringify-position": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz", + "integrity": "sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==", + "dev": true, + "dependencies": { + "@types/unist": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-reporter-json/node_modules/vfile": { + "version": "5.3.7", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.3.7.tgz", + "integrity": "sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==", + "dev": true, + "dependencies": { + "@types/unist": "^2.0.0", + "is-buffer": "^2.0.0", + "unist-util-stringify-position": "^3.0.0", + "vfile-message": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-reporter-json/node_modules/vfile-message": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.4.tgz", + "integrity": "sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==", + "dev": true, + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-stringify-position": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-reporter/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/vfile-reporter/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "node_modules/vfile-reporter/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/vfile-reporter/node_modules/strip-ansi": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", + "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/vfile-reporter/node_modules/supports-color": { + "version": "9.3.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-9.3.1.tgz", + "integrity": "sha512-knBY82pjmnIzK3NifMo3RxEIRD9E0kIzV4BKcyTZ9+9kWgLMxd4PrsTSMoFQUabgRBbF8KOLRDCyKgNV+iK44Q==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/vfile-reporter/node_modules/unist-util-stringify-position": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz", + "integrity": "sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==", + "dev": true, + "dependencies": { + "@types/unist": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-reporter/node_modules/vfile": { + "version": "5.3.7", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.3.7.tgz", + "integrity": "sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==", + "dev": true, + "dependencies": { + "@types/unist": "^2.0.0", + "is-buffer": "^2.0.0", + "unist-util-stringify-position": "^3.0.0", + "vfile-message": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-reporter/node_modules/vfile-message": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.4.tgz", + "integrity": "sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==", + "dev": true, + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-stringify-position": "^3.0.0" }, - "engines": { - "node": ">=8" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/use": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "node_modules/vfile-sort": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/vfile-sort/-/vfile-sort-3.0.1.tgz", + "integrity": "sha512-1os1733XY6y0D5x0ugqSeaVJm9lYgj0j5qdcZQFyxlZOSy1jYarL77lLyb5gK4Wqr1d5OxmuyflSO3zKyFnTFw==", "dev": true, - "peer": true, - "engines": { - "node": ">=0.10.0" + "dependencies": { + "vfile": "^5.0.0", + "vfile-message": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/use-sync-external-store": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz", - "integrity": "sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==", + "node_modules/vfile-sort/node_modules/unist-util-stringify-position": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz", + "integrity": "sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==", "dev": true, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + "dependencies": { + "@types/unist": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true - }, - "node_modules/v8-compile-cache": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", - "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", - "dev": true + "node_modules/vfile-sort/node_modules/vfile": { + "version": "5.3.7", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.3.7.tgz", + "integrity": "sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==", + "dev": true, + "dependencies": { + "@types/unist": "^2.0.0", + "is-buffer": "^2.0.0", + "unist-util-stringify-position": "^3.0.0", + "vfile-message": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } }, - "node_modules/v8-to-istanbul": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-7.1.2.tgz", - "integrity": "sha512-TxNb7YEUwkLXCQYeudi6lgQ/SZrzNO4kMdlqVxaZPUIUjCv6iSSypUQX70kNBSERpQ8fk48+d61FXk+tgqcWow==", + "node_modules/vfile-sort/node_modules/vfile-message": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.4.tgz", + "integrity": "sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==", "dev": true, - "peer": true, "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^1.6.0", - "source-map": "^0.7.3" + "@types/unist": "^2.0.0", + "unist-util-stringify-position": "^3.0.0" }, - "engines": { - "node": ">=10.10.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/v8-to-istanbul/node_modules/source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "node_modules/vfile-statistics": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/vfile-statistics/-/vfile-statistics-2.0.1.tgz", + "integrity": "sha512-W6dkECZmP32EG/l+dp2jCLdYzmnDBIw6jwiLZSER81oR5AHRcVqL+k3Z+pfH1R73le6ayDkJRMk0sutj1bMVeg==", "dev": true, - "peer": true, - "engines": { - "node": ">= 8" + "dependencies": { + "vfile": "^5.0.0", + "vfile-message": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "node_modules/vfile-statistics/node_modules/unist-util-stringify-position": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz", + "integrity": "sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==", "dev": true, "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" + "@types/unist": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/vfile": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.2.1.tgz", - "integrity": "sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==", + "node_modules/vfile-statistics/node_modules/vfile": { + "version": "5.3.7", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.3.7.tgz", + "integrity": "sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==", "dev": true, "dependencies": { "@types/unist": "^2.0.0", "is-buffer": "^2.0.0", - "unist-util-stringify-position": "^2.0.0", - "vfile-message": "^2.0.0" + "unist-util-stringify-position": "^3.0.0", + "vfile-message": "^3.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, - "node_modules/vfile-message": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz", - "integrity": "sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==", + "node_modules/vfile-statistics/node_modules/vfile-message": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.4.tgz", + "integrity": "sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==", "dev": true, "dependencies": { "@types/unist": "^2.0.0", - "unist-util-stringify-position": "^2.0.0" + "unist-util-stringify-position": "^3.0.0" }, "funding": { "type": "opencollective", @@ -13273,6 +14474,15 @@ "dev": true, "peer": true }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true, + "engines": { + "node": ">=0.4" + } + }, "node_modules/y18n": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", @@ -13419,6 +14629,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/zod": { + "version": "3.20.6", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.20.6.tgz", + "integrity": "sha512-oyu0m54SGCtzh6EClBVqDDlAYRz4jrVtKwQ7ZnsEmMI9HnzuZFj8QFwAY1M5uniIYACdGvv0PBWPF2kO0aNofA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, "node_modules/zwitch": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-1.0.5.tgz", @@ -13547,11 +14766,10 @@ } }, "@babel/helper-plugin-utils": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz", - "integrity": "sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==", - "dev": true, - "peer": true + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz", + "integrity": "sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==", + "dev": true }, "@babel/helper-replace-supers": { "version": "7.14.4", @@ -13669,6 +14887,17 @@ "integrity": "sha512-vqUSBLP8dQHFPdPi9bc5GK9vRkYHJ49fsZdtoJ8EQ8ibpwk5rPKfvNIwChB0KVXcIjcepEBBd2VHC5r9Gy8ueg==", "dev": true }, + "@babel/plugin-proposal-object-rest-spread": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.12.1.tgz", + "integrity": "sha512-s6SowJIjzlhx8o7lsFx5zmY4At6CTtDvgNQDdPzkBQucle58A6b/TTeEBYtyDgmcXjUTM+vE8YOGHZzzbc/ioA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.0", + "@babel/plugin-transform-parameters": "^7.12.1" + } + }, "@babel/plugin-syntax-async-generators": { "version": "7.8.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", @@ -13719,6 +14948,15 @@ "@babel/helper-plugin-utils": "^7.8.0" } }, + "@babel/plugin-syntax-jsx": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.1.tgz", + "integrity": "sha512-1yRi7yAtB0ETgxdY9ti/p2TivUxJkTdhu/ZbF9MshVGqOx1TdB3b7xCXs49Fupgg50N45KcAsRP/ZqWjs9SRjg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, "@babel/plugin-syntax-logical-assignment-operators": { "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", @@ -13754,7 +14992,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", "dev": true, - "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.8.0" } @@ -13789,6 +15026,15 @@ "@babel/helper-plugin-utils": "^7.14.5" } }, + "@babel/plugin-transform-parameters": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.20.7.tgz", + "integrity": "sha512-WiWBIkeHKVOSYPO0pWkxGPfKeWrCJyD3NJ53+Lrp/QMSZbsVPovrVl2aWZ19D/LTVnaDv5Ap7GJ/B2CTOZdrfA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.20.2" + } + }, "@babel/runtime": { "version": "7.20.7", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.7.tgz", @@ -13903,9 +15149,9 @@ } }, "@hashicorp/platform-cli": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@hashicorp/platform-cli/-/platform-cli-2.5.1.tgz", - "integrity": "sha512-kW9bxaYB/Tt3Djl75Kh+u/jRAe7MuX6mdcw+amPaBUnO9ZnNXQXe73fv7nYm7CueZZd2y5PWfx5LPaxWQzhM4g==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@hashicorp/platform-cli/-/platform-cli-2.6.0.tgz", + "integrity": "sha512-nMO7Uiy/A5CT/BCE9RyQt6/Uci7bxwTesxCNWkXlciyqlIrz9WmBa9hr710IiMoDzrzQ1tL6AgFIeTbXs4RTqA==", "dev": true, "requires": { "@hashicorp/platform-cms": "0.3.0", @@ -13965,6 +15211,242 @@ "rivet-graphql": "0.3.1" } }, + "@hashicorp/platform-content-conformance": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/@hashicorp/platform-content-conformance/-/platform-content-conformance-0.0.10.tgz", + "integrity": "sha512-vXLbd2w9phS4JfFyh17jCiyu+LXVonTfb7WEUK2eMlOL/wxe2umyJvEQaJNzD5bwyYC8LuXGA5JkbnPXnU5ZQg==", + "dev": true, + "requires": { + "find-up": "^6.3.0", + "flat": "^5.0.2", + "globby": "^13.1.2", + "mdast-util-to-string": "^3.1.0", + "remark": "12.0.1", + "remark-mdx": "^1.6.22", + "unified-lint-rule": "^2.1.1", + "unist-util-stringify-position": "^3.0.2", + "unist-util-visit": "^4.1.1", + "vfile": "^5.3.6", + "vfile-matter": "^4.0.0", + "vfile-reporter": "^7.0.4", + "vfile-reporter-json": "^3.2.0", + "vfile-statistics": "^2.0.0", + "yaml": "^2.1.3", + "yargs": "^17.4.1", + "zod": "^3.19.1" + }, + "dependencies": { + "cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + } + }, + "find-up": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", + "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", + "dev": true, + "requires": { + "locate-path": "^7.1.0", + "path-exists": "^5.0.0" + } + }, + "globby": { + "version": "13.1.3", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.3.tgz", + "integrity": "sha512-8krCNHXvlCgHDpegPzleMq07yMYTO2sXKASmZmquEYWEmCx6J5UTRbp5RwMJkTJGtcQ44YpiUYUiN0b9mzy8Bw==", + "dev": true, + "requires": { + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.11", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^4.0.0" + } + }, + "locate-path": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", + "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", + "dev": true, + "requires": { + "p-locate": "^6.0.0" + } + }, + "mdast-util-to-string": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-3.1.1.tgz", + "integrity": "sha512-tGvhT94e+cVnQt8JWE9/b3cUQZWS732TJxXHktvP+BYo62PpYD53Ls/6cC60rW21dW+txxiM4zMdc6abASvZKA==", + "dev": true, + "requires": { + "@types/mdast": "^3.0.0" + } + }, + "p-limit": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", + "dev": true, + "requires": { + "yocto-queue": "^1.0.0" + } + }, + "p-locate": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", + "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", + "dev": true, + "requires": { + "p-limit": "^4.0.0" + } + }, + "path-exists": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", + "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", + "dev": true + }, + "remark": { + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/remark/-/remark-12.0.1.tgz", + "integrity": "sha512-gS7HDonkdIaHmmP/+shCPejCEEW+liMp/t/QwmF0Xt47Rpuhl32lLtDV1uKWvGoq+kxr5jSgg5oAIpGuyULjUw==", + "dev": true, + "requires": { + "remark-parse": "^8.0.0", + "remark-stringify": "^8.0.0", + "unified": "^9.0.0" + } + }, + "remark-parse": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-8.0.3.tgz", + "integrity": "sha512-E1K9+QLGgggHxCQtLt++uXltxEprmWzNfg+MxpfHsZlrddKzZ/hZyWHDbK3/Ap8HJQqYJRXP+jHczdL6q6i85Q==", + "dev": true, + "requires": { + "ccount": "^1.0.0", + "collapse-white-space": "^1.0.2", + "is-alphabetical": "^1.0.0", + "is-decimal": "^1.0.0", + "is-whitespace-character": "^1.0.0", + "is-word-character": "^1.0.0", + "markdown-escapes": "^1.0.0", + "parse-entities": "^2.0.0", + "repeat-string": "^1.5.4", + "state-toggle": "^1.0.0", + "trim": "0.0.1", + "trim-trailing-lines": "^1.0.0", + "unherit": "^1.0.4", + "unist-util-remove-position": "^2.0.0", + "vfile-location": "^3.0.0", + "xtend": "^4.0.1" + } + }, + "remark-stringify": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-8.1.1.tgz", + "integrity": "sha512-q4EyPZT3PcA3Eq7vPpT6bIdokXzFGp9i85igjmhRyXWmPs0Y6/d2FYwUNotKAWyLch7g0ASZJn/KHHcHZQ163A==", + "dev": true, + "requires": { + "ccount": "^1.0.0", + "is-alphanumeric": "^1.0.0", + "is-decimal": "^1.0.0", + "is-whitespace-character": "^1.0.0", + "longest-streak": "^2.0.1", + "markdown-escapes": "^1.0.0", + "markdown-table": "^2.0.0", + "mdast-util-compact": "^2.0.0", + "parse-entities": "^2.0.0", + "repeat-string": "^1.5.4", + "state-toggle": "^1.0.0", + "stringify-entities": "^3.0.0", + "unherit": "^1.0.4", + "xtend": "^4.0.1" + } + }, + "slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "dev": true + }, + "unist-util-stringify-position": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz", + "integrity": "sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==", + "dev": true, + "requires": { + "@types/unist": "^2.0.0" + } + }, + "vfile": { + "version": "5.3.7", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.3.7.tgz", + "integrity": "sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==", + "dev": true, + "requires": { + "@types/unist": "^2.0.0", + "is-buffer": "^2.0.0", + "unist-util-stringify-position": "^3.0.0", + "vfile-message": "^3.0.0" + } + }, + "vfile-message": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.4.tgz", + "integrity": "sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==", + "dev": true, + "requires": { + "@types/unist": "^2.0.0", + "unist-util-stringify-position": "^3.0.0" + } + }, + "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true + }, + "yaml": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.2.1.tgz", + "integrity": "sha512-e0WHiYql7+9wr4cWMx3TVQrNwejKaEe7/rHNmQmqRjazfOP5W8PB6Jpebb5o6fIapbz9o9+2ipcaTM2ZwDI6lw==", + "dev": true + }, + "yargs": { + "version": "17.7.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.1.tgz", + "integrity": "sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==", + "dev": true, + "requires": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + } + }, + "yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true + }, + "yocto-queue": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", + "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", + "dev": true + } + } + }, "@humanwhocodes/config-array": { "version": "0.11.8", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", @@ -14307,6 +15789,12 @@ "chalk": "^4.0.0" } }, + "@mdx-js/util": { + "version": "1.6.22", + "resolved": "https://registry.npmjs.org/@mdx-js/util/-/util-1.6.22.tgz", + "integrity": "sha512-H1rQc1ZOHANWBvPcW+JpGwr+juXSxM8Q8YCkm3GhZd8REu1fHR3z99CErO1p9pkcfcxZnMdIZdIsXkOHY0NilA==", + "dev": true + }, "@next/env": { "version": "12.3.1", "resolved": "https://registry.npmjs.org/@next/env/-/env-12.3.1.tgz", @@ -14685,6 +16173,12 @@ "dev": true, "peer": true }, + "@types/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/@types/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-dPWnWsf+kzIG140B8z2w3fr5D03TLWbOAFQl45xUpI3vcizeXriNR5VYkWZ+WTMsUHqZ9Xlt3hrxGNANFyNQfw==", + "dev": true + }, "@types/unist": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.3.tgz", @@ -15510,6 +17004,12 @@ "rsvp": "^4.8.4" } }, + "ccount": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-1.1.0.tgz", + "integrity": "sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg==", + "dev": true + }, "chalk": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", @@ -15533,6 +17033,12 @@ "integrity": "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==", "dev": true }, + "character-entities-html4": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-1.1.4.tgz", + "integrity": "sha512-HRcDxZuZqMx3/a+qrzxdBKBPUpxWEq9xw2OPZ3a/174ihfrQKVsFhqtthBInFy1zZ9GgZyFXOatNujm8M+El3g==", + "dev": true + }, "character-entities-legacy": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz", @@ -15740,6 +17246,12 @@ "dev": true, "peer": true }, + "collapse-white-space": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-1.0.6.tgz", + "integrity": "sha512-jEovNnrhMuqyCcjfEJA56v0Xq8SkIoPKDyaHahwo3POf4qcSXqMYuwNcOTzp74vTsR9Tn08z4MxWqAhcekogkQ==", + "dev": true + }, "collect-v8-coverage": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", @@ -16168,6 +17680,12 @@ "domelementtype": "1" } }, + "eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true + }, "ejs": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.5.tgz", @@ -17269,6 +18787,12 @@ "semver-regex": "^3.1.2" } }, + "flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true + }, "flat-cache": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", @@ -17382,8 +18906,7 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, - "peer": true + "dev": true }, "get-intrinsic": { "version": "1.1.3", @@ -18009,6 +19532,12 @@ "integrity": "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==", "dev": true }, + "is-alphanumeric": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-alphanumeric/-/is-alphanumeric-1.0.0.tgz", + "integrity": "sha512-ZmRL7++ZkcMOfDuWZuMJyIVLr2keE1o/DeNWh1EmgqGhUcV+9BIVsx0BcSBOHTZqzjs4+dISzr2KAeBEWGgXeA==", + "dev": true + }, "is-alphanumerical": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz", @@ -18355,6 +19884,12 @@ "get-intrinsic": "^1.1.1" } }, + "is-whitespace-character": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-whitespace-character/-/is-whitespace-character-1.0.4.tgz", + "integrity": "sha512-SDweEzfIZM0SJV0EUga669UTKlmL0Pq8Lno0QDQsPnvECB3IM2aP0gdx5TrU0A01MAPfViaZiI2V1QMZLaKK5w==", + "dev": true + }, "is-windows": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", @@ -18362,6 +19897,12 @@ "dev": true, "peer": true }, + "is-word-character": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-word-character/-/is-word-character-1.0.4.tgz", + "integrity": "sha512-5SMO8RVennx3nZrqtKwCGyyetPE9VDba5ugvKLaD4KopPG5kR4mQ7tNt/r7feL5yt5h3lpuBbIUmCOG2eSzXHA==", + "dev": true + }, "is-wsl": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", @@ -19516,12 +21057,59 @@ "object-visit": "^1.0.0" } }, + "markdown-escapes": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/markdown-escapes/-/markdown-escapes-1.0.4.tgz", + "integrity": "sha512-8z4efJYk43E0upd0NbVXwgSTQs6cT3T06etieCMEg7dRbzCbxUCK/GHlX8mhHRDcp+OLlHkPKsvqQTCvsRl2cg==", + "dev": true + }, + "markdown-table": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-2.0.0.tgz", + "integrity": "sha512-Ezda85ToJUBhM6WGaG6veasyym+Tbs3cMAw/ZhOPqXiYsr0jgocBV3j3nx+4lk47plLlIqjwuTm/ywVI+zjJ/A==", + "dev": true, + "requires": { + "repeat-string": "^1.0.0" + } + }, "mathml-tag-names": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz", "integrity": "sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==", "dev": true }, + "mdast-util-compact": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-compact/-/mdast-util-compact-2.0.1.tgz", + "integrity": "sha512-7GlnT24gEwDrdAwEHrU4Vv5lLWrEer4KOkAiKT9nYstsTad7Oc1TwqT2zIMKRdZF7cTuaf+GA1E4Kv7jJh8mPA==", + "dev": true, + "requires": { + "unist-util-visit": "^2.0.0" + }, + "dependencies": { + "unist-util-visit": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-2.0.3.tgz", + "integrity": "sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==", + "dev": true, + "requires": { + "@types/unist": "^2.0.0", + "unist-util-is": "^4.0.0", + "unist-util-visit-parents": "^3.0.0" + } + }, + "unist-util-visit-parents": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-3.1.1.tgz", + "integrity": "sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg==", + "dev": true, + "requires": { + "@types/unist": "^2.0.0", + "unist-util-is": "^4.0.0" + } + } + } + }, "mdast-util-from-markdown": { "version": "0.8.5", "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-0.8.5.tgz", @@ -21246,6 +22834,54 @@ "unified": "^9.1.0" } }, + "remark-mdx": { + "version": "1.6.22", + "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-1.6.22.tgz", + "integrity": "sha512-phMHBJgeV76uyFkH4rvzCftLfKCr2RZuF+/gmVcaKrpsihyzmhXjA0BEMDaPTXG5y8qZOKPVo83NAOX01LPnOQ==", + "dev": true, + "requires": { + "@babel/core": "7.12.9", + "@babel/helper-plugin-utils": "7.10.4", + "@babel/plugin-proposal-object-rest-spread": "7.12.1", + "@babel/plugin-syntax-jsx": "7.12.1", + "@mdx-js/util": "1.6.22", + "is-alphabetical": "1.0.4", + "remark-parse": "8.0.3", + "unified": "9.2.0" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", + "dev": true + }, + "remark-parse": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-8.0.3.tgz", + "integrity": "sha512-E1K9+QLGgggHxCQtLt++uXltxEprmWzNfg+MxpfHsZlrddKzZ/hZyWHDbK3/Ap8HJQqYJRXP+jHczdL6q6i85Q==", + "dev": true, + "requires": { + "ccount": "^1.0.0", + "collapse-white-space": "^1.0.2", + "is-alphabetical": "^1.0.0", + "is-decimal": "^1.0.0", + "is-whitespace-character": "^1.0.0", + "is-word-character": "^1.0.0", + "markdown-escapes": "^1.0.0", + "parse-entities": "^2.0.0", + "repeat-string": "^1.5.4", + "state-toggle": "^1.0.0", + "trim": "0.0.1", + "trim-trailing-lines": "^1.0.0", + "unherit": "^1.0.4", + "unist-util-remove-position": "^2.0.0", + "vfile-location": "^3.0.0", + "xtend": "^4.0.1" + } + } + } + }, "remark-parse": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-9.0.0.tgz", @@ -21288,8 +22924,7 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true, - "peer": true + "dev": true }, "require-from-string": { "version": "2.0.2", @@ -22230,6 +23865,12 @@ } } }, + "state-toggle": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/state-toggle/-/state-toggle-1.0.3.tgz", + "integrity": "sha512-d/5Z4/2iiCnHw6Xzghyhb+GcmF89bxwgXG60wjIiZaxnymbyOmI8Hk4VqHXiVVp6u2ysaskFfXg3ekCj4WNftQ==", + "dev": true + }, "static-extend": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", @@ -22415,6 +24056,17 @@ "es-abstract": "^1.20.4" } }, + "stringify-entities": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-3.1.0.tgz", + "integrity": "sha512-3FP+jGMmMV/ffZs86MoghGqAoqXAdxLrJP4GUdrDN1aIScYih5tuIO3eF4To5AJZ79KDZ8Fpdy7QJnK8SsL1Vg==", + "dev": true, + "requires": { + "character-entities-html4": "^1.0.0", + "character-entities-legacy": "^1.0.0", + "xtend": "^4.0.0" + } + }, "stringify-object": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", @@ -23119,12 +24771,24 @@ } } }, + "trim": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/trim/-/trim-0.0.1.tgz", + "integrity": "sha512-YzQV+TZg4AxpKxaTHK3c3D+kRDCGVEE7LemdlQZoQXn0iennk10RsIoY6ikzAqJTc9Xjl9C1/waHom/J86ziAQ==", + "dev": true + }, "trim-newlines": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", "dev": true }, + "trim-trailing-lines": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/trim-trailing-lines/-/trim-trailing-lines-1.1.4.tgz", + "integrity": "sha512-rjUWSqnfTNrjbB9NQWfPMH/xRK1deHeGsHoVfpxJ++XeYXE0d6B1En37AHfw3jtfTU7dzMzZL2jjpe8Qb5gLIQ==", + "dev": true + }, "trough": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/trough/-/trough-1.0.5.tgz", @@ -23248,6 +24912,16 @@ "which-boxed-primitive": "^1.0.2" } }, + "unherit": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/unherit/-/unherit-1.1.3.tgz", + "integrity": "sha512-Ft16BJcnapDKp0+J/rqFC3Rrk6Y/Ng4nzsC028k2jdDII/rdZ7Wd3pPT/6+vIIxRagwRc9K0IUX0Ra4fKvw+WQ==", + "dev": true, + "requires": { + "inherits": "^2.0.0", + "xtend": "^4.0.0" + } + }, "unified": { "version": "9.2.0", "resolved": "https://registry.npmjs.org/unified/-/unified-9.2.0.tgz", @@ -23270,6 +24944,84 @@ } } }, + "unified-lint-rule": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/unified-lint-rule/-/unified-lint-rule-2.1.1.tgz", + "integrity": "sha512-vsLHyLZFstqtGse2gvrGwasOmH8M2y+r2kQMoDSWzSqUkQx2MjHjvZuGSv5FUaiv4RQO1bHRajy7lSGp7XWq5A==", + "dev": true, + "requires": { + "@types/unist": "^2.0.0", + "trough": "^2.0.0", + "unified": "^10.0.0", + "vfile": "^5.0.0" + }, + "dependencies": { + "bail": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", + "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", + "dev": true + }, + "is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "dev": true + }, + "trough": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/trough/-/trough-2.1.0.tgz", + "integrity": "sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g==", + "dev": true + }, + "unified": { + "version": "10.1.2", + "resolved": "https://registry.npmjs.org/unified/-/unified-10.1.2.tgz", + "integrity": "sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==", + "dev": true, + "requires": { + "@types/unist": "^2.0.0", + "bail": "^2.0.0", + "extend": "^3.0.0", + "is-buffer": "^2.0.0", + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^5.0.0" + } + }, + "unist-util-stringify-position": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz", + "integrity": "sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==", + "dev": true, + "requires": { + "@types/unist": "^2.0.0" + } + }, + "vfile": { + "version": "5.3.7", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.3.7.tgz", + "integrity": "sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==", + "dev": true, + "requires": { + "@types/unist": "^2.0.0", + "is-buffer": "^2.0.0", + "unist-util-stringify-position": "^3.0.0", + "vfile-message": "^3.0.0" + } + }, + "vfile-message": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.4.tgz", + "integrity": "sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==", + "dev": true, + "requires": { + "@types/unist": "^2.0.0", + "unist-util-stringify-position": "^3.0.0" + } + } + } + }, "union-value": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", @@ -23298,6 +25050,38 @@ "integrity": "sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==", "dev": true }, + "unist-util-remove-position": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-2.0.1.tgz", + "integrity": "sha512-fDZsLYIe2uT+oGFnuZmy73K6ZxOPG/Qcm+w7jbEjaFcJgbQ6cqjs/eSPzXhsmGpAsWPkqZM9pYjww5QTn3LHMA==", + "dev": true, + "requires": { + "unist-util-visit": "^2.0.0" + }, + "dependencies": { + "unist-util-visit": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-2.0.3.tgz", + "integrity": "sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==", + "dev": true, + "requires": { + "@types/unist": "^2.0.0", + "unist-util-is": "^4.0.0", + "unist-util-visit-parents": "^3.0.0" + } + }, + "unist-util-visit-parents": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-3.1.1.tgz", + "integrity": "sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg==", + "dev": true, + "requires": { + "@types/unist": "^2.0.0", + "unist-util-is": "^4.0.0" + } + } + } + }, "unist-util-stringify-position": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz", @@ -23307,6 +25091,43 @@ "@types/unist": "^2.0.2" } }, + "unist-util-visit": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.2.tgz", + "integrity": "sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==", + "dev": true, + "requires": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0", + "unist-util-visit-parents": "^5.1.1" + }, + "dependencies": { + "unist-util-is": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.2.0.tgz", + "integrity": "sha512-Glt17jWwZeyqrFqOK0pF1Ded5U3yzJnFr8CG1GMjCWTp9zDo2p+cmD6pWbZU8AgM5WU3IzRv6+rBwhzsGh6hBQ==", + "dev": true + } + } + }, + "unist-util-visit-parents": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz", + "integrity": "sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==", + "dev": true, + "requires": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0" + }, + "dependencies": { + "unist-util-is": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.2.0.tgz", + "integrity": "sha512-Glt17jWwZeyqrFqOK0pF1Ded5U3yzJnFr8CG1GMjCWTp9zDo2p+cmD6pWbZU8AgM5WU3IzRv6+rBwhzsGh6hBQ==", + "dev": true + } + } + }, "universalify": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/universalify/-/universalify-1.0.0.tgz", @@ -23452,6 +25273,62 @@ "vfile-message": "^2.0.0" } }, + "vfile-location": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-3.2.0.tgz", + "integrity": "sha512-aLEIZKv/oxuCDZ8lkJGhuhztf/BW4M+iHdCwglA/eWc+vtuRFJj8EtgceYFX4LRjOhCAAiNHsKGssC6onJ+jbA==", + "dev": true + }, + "vfile-matter": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/vfile-matter/-/vfile-matter-4.0.1.tgz", + "integrity": "sha512-ZeACdaxCOxhePpoLO4A5y/VgI9EuWBXu+sUk65aQ7lXBZDFg7X0tuOzigLJUtsQzazFt6K2m9SdlDxZdfL5vVg==", + "dev": true, + "requires": { + "is-buffer": "^2.0.0", + "vfile": "^5.0.0", + "yaml": "^2.0.0" + }, + "dependencies": { + "unist-util-stringify-position": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz", + "integrity": "sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==", + "dev": true, + "requires": { + "@types/unist": "^2.0.0" + } + }, + "vfile": { + "version": "5.3.7", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.3.7.tgz", + "integrity": "sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==", + "dev": true, + "requires": { + "@types/unist": "^2.0.0", + "is-buffer": "^2.0.0", + "unist-util-stringify-position": "^3.0.0", + "vfile-message": "^3.0.0" + } + }, + "vfile-message": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.4.tgz", + "integrity": "sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==", + "dev": true, + "requires": { + "@types/unist": "^2.0.0", + "unist-util-stringify-position": "^3.0.0" + } + }, + "yaml": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.2.1.tgz", + "integrity": "sha512-e0WHiYql7+9wr4cWMx3TVQrNwejKaEe7/rHNmQmqRjazfOP5W8PB6Jpebb5o6fIapbz9o9+2ipcaTM2ZwDI6lw==", + "dev": true + } + } + }, "vfile-message": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz", @@ -23462,6 +25339,222 @@ "unist-util-stringify-position": "^2.0.0" } }, + "vfile-reporter": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/vfile-reporter/-/vfile-reporter-7.0.5.tgz", + "integrity": "sha512-NdWWXkv6gcd7AZMvDomlQbK3MqFWL1RlGzMn++/O2TI+68+nqxCPTvLugdOtfSzXmjh+xUyhp07HhlrbJjT+mw==", + "dev": true, + "requires": { + "@types/supports-color": "^8.0.0", + "string-width": "^5.0.0", + "supports-color": "^9.0.0", + "unist-util-stringify-position": "^3.0.0", + "vfile": "^5.0.0", + "vfile-message": "^3.0.0", + "vfile-sort": "^3.0.0", + "vfile-statistics": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true + }, + "emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "requires": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + } + }, + "strip-ansi": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", + "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", + "dev": true, + "requires": { + "ansi-regex": "^6.0.1" + } + }, + "supports-color": { + "version": "9.3.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-9.3.1.tgz", + "integrity": "sha512-knBY82pjmnIzK3NifMo3RxEIRD9E0kIzV4BKcyTZ9+9kWgLMxd4PrsTSMoFQUabgRBbF8KOLRDCyKgNV+iK44Q==", + "dev": true + }, + "unist-util-stringify-position": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz", + "integrity": "sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==", + "dev": true, + "requires": { + "@types/unist": "^2.0.0" + } + }, + "vfile": { + "version": "5.3.7", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.3.7.tgz", + "integrity": "sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==", + "dev": true, + "requires": { + "@types/unist": "^2.0.0", + "is-buffer": "^2.0.0", + "unist-util-stringify-position": "^3.0.0", + "vfile-message": "^3.0.0" + } + }, + "vfile-message": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.4.tgz", + "integrity": "sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==", + "dev": true, + "requires": { + "@types/unist": "^2.0.0", + "unist-util-stringify-position": "^3.0.0" + } + } + } + }, + "vfile-reporter-json": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/vfile-reporter-json/-/vfile-reporter-json-3.3.0.tgz", + "integrity": "sha512-/zgRtjxQ2UGJn+HViiZ7+nIXtUzkkXFQum3BmaS/bSyr10P0X41ETRqqwMJ95RtbKUah3m7pKb6oS1eZeXXHzQ==", + "dev": true, + "requires": { + "vfile": "^5.0.0", + "vfile-message": "^3.0.0" + }, + "dependencies": { + "unist-util-stringify-position": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz", + "integrity": "sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==", + "dev": true, + "requires": { + "@types/unist": "^2.0.0" + } + }, + "vfile": { + "version": "5.3.7", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.3.7.tgz", + "integrity": "sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==", + "dev": true, + "requires": { + "@types/unist": "^2.0.0", + "is-buffer": "^2.0.0", + "unist-util-stringify-position": "^3.0.0", + "vfile-message": "^3.0.0" + } + }, + "vfile-message": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.4.tgz", + "integrity": "sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==", + "dev": true, + "requires": { + "@types/unist": "^2.0.0", + "unist-util-stringify-position": "^3.0.0" + } + } + } + }, + "vfile-sort": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/vfile-sort/-/vfile-sort-3.0.1.tgz", + "integrity": "sha512-1os1733XY6y0D5x0ugqSeaVJm9lYgj0j5qdcZQFyxlZOSy1jYarL77lLyb5gK4Wqr1d5OxmuyflSO3zKyFnTFw==", + "dev": true, + "requires": { + "vfile": "^5.0.0", + "vfile-message": "^3.0.0" + }, + "dependencies": { + "unist-util-stringify-position": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz", + "integrity": "sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==", + "dev": true, + "requires": { + "@types/unist": "^2.0.0" + } + }, + "vfile": { + "version": "5.3.7", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.3.7.tgz", + "integrity": "sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==", + "dev": true, + "requires": { + "@types/unist": "^2.0.0", + "is-buffer": "^2.0.0", + "unist-util-stringify-position": "^3.0.0", + "vfile-message": "^3.0.0" + } + }, + "vfile-message": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.4.tgz", + "integrity": "sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==", + "dev": true, + "requires": { + "@types/unist": "^2.0.0", + "unist-util-stringify-position": "^3.0.0" + } + } + } + }, + "vfile-statistics": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/vfile-statistics/-/vfile-statistics-2.0.1.tgz", + "integrity": "sha512-W6dkECZmP32EG/l+dp2jCLdYzmnDBIw6jwiLZSER81oR5AHRcVqL+k3Z+pfH1R73le6ayDkJRMk0sutj1bMVeg==", + "dev": true, + "requires": { + "vfile": "^5.0.0", + "vfile-message": "^3.0.0" + }, + "dependencies": { + "unist-util-stringify-position": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz", + "integrity": "sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==", + "dev": true, + "requires": { + "@types/unist": "^2.0.0" + } + }, + "vfile": { + "version": "5.3.7", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.3.7.tgz", + "integrity": "sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==", + "dev": true, + "requires": { + "@types/unist": "^2.0.0", + "is-buffer": "^2.0.0", + "unist-util-stringify-position": "^3.0.0", + "vfile-message": "^3.0.0" + } + }, + "vfile-message": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.4.tgz", + "integrity": "sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==", + "dev": true, + "requires": { + "@types/unist": "^2.0.0", + "unist-util-stringify-position": "^3.0.0" + } + } + } + }, "w3c-hr-time": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", @@ -23619,6 +25712,12 @@ "dev": true, "peer": true }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true + }, "y18n": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", @@ -23731,6 +25830,12 @@ "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "dev": true }, + "zod": { + "version": "3.20.6", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.20.6.tgz", + "integrity": "sha512-oyu0m54SGCtzh6EClBVqDDlAYRz4jrVtKwQ7ZnsEmMI9HnzuZFj8QFwAY1M5uniIYACdGvv0PBWPF2kO0aNofA==", + "dev": true + }, "zwitch": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-1.0.5.tgz", diff --git a/website/package.json b/website/package.json index 676e5b1e9ea..caacb3c5976 100644 --- a/website/package.json +++ b/website/package.json @@ -4,7 +4,8 @@ "version": "0.0.1", "author": "HashiCorp", "devDependencies": { - "@hashicorp/platform-cli": "^2.5.1", + "@hashicorp/platform-cli": "^2.6.0", + "@hashicorp/platform-content-conformance": "^0.0.10", "dart-linkcheck": "2.0.15", "husky": "4.3.8", "next": "^12.3.1", @@ -23,7 +24,8 @@ "generate:readme": "next-hashicorp markdown-blocks README.md", "lint": "next-hashicorp lint", "start": "./scripts/website-start.sh", - "linkcheck": "linkcheck https://consul.io" + "linkcheck": "linkcheck https://consul.io", + "content-check": "hc-content --config base-docs" }, "engines": { "npm": ">=7.0.0" From 47db3d7ab9f7d3c256a975589abad0b6c77d5e1a Mon Sep 17 00:00:00 2001 From: Michael Wilkerson <62034708+wilkermichael@users.noreply.github.com> Date: Thu, 9 Mar 2023 08:41:14 -0800 Subject: [PATCH 134/262] added a backport-checker GitHub action (#16567) * added a backport-checker GitHub action * Update .github/workflows/backport-checker.yml --- .github/workflows/backport-checker.yml | 32 ++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 .github/workflows/backport-checker.yml diff --git a/.github/workflows/backport-checker.yml b/.github/workflows/backport-checker.yml new file mode 100644 index 00000000000..c9af23ea971 --- /dev/null +++ b/.github/workflows/backport-checker.yml @@ -0,0 +1,32 @@ +# This workflow checks that there is either a 'pr/no-backport' label applied to a PR +# or there is a backport/* label indicating a backport has been set + +name: Backport Checker + +on: + pull_request: + types: [opened, synchronize, labeled] + # Runs on PRs to main and all release branches + branches: + - main + - release/* + +jobs: + # checks that a backport label is present for a PR + backport-check: + # If there's a `pr/no-backport` label we ignore this check. Also, we ignore PRs created by the bot assigned to `backport-assistant` + if: "! ( contains(github.event.pull_request.labels.*.name, 'pr/no-backport') || github.event.pull_request.user.login == 'hc-github-team-consul-core' )" + runs-on: ubuntu-latest + + steps: + - name: Check for Backport Label + run: | + labels="${{join(github.event.pull_request.labels.*.name, ', ') }}" + if [[ "$labels" =~ .*"backport/".* ]]; then + echo "Found backport label!" + exit 0 + fi + # Fail status check when no backport label was found on the PR + echo "Did not find a backport label matching the pattern 'backport/*' and the 'pr/no-backport' label was not applied. Reference - https://github.com/hashicorp/consul/pull/16567" + exit 1 + From 040647e0baee1a297fd1fb59a20e362ce31e9e67 Mon Sep 17 00:00:00 2001 From: Andrew Stucki Date: Thu, 9 Mar 2023 13:56:53 -0500 Subject: [PATCH 135/262] auto-updated agent/uiserver/dist/ from commit 63204b518 (#16587) Co-authored-by: hc-github-team-consul-core --- .../assets/chunk.143.ff39f0b820a97e2c6d5d.js | 52 + .../assets/chunk.178.00380c6ad3fa678e07b6.js | 21 + .../assets/chunk.336.f5cb05e551aa08eb7125.js | 908 ++ ...nk.336.f5cb05e551aa08eb7125.js.LICENSE.txt | 8 + .../assets/chunk.412.2df22e4bf69d8f15ebdb.js | 2276 +++ ...nk.412.2df22e4bf69d8f15ebdb.js.LICENSE.txt | 38 + .../assets/chunk.744.c0eb6726020fc4af8d3f.css | 39 + .../assets/chunk.744.c0eb6726020fc4af8d3f.js | 1 + .../assets/chunk.83.85cc25a28afe28f711a3.js | 65 + ...cript-a5e5d64b0f9ff6b6e21f5f48aa1ef464.js} | 42 +- ... ruby-2b9a2a4b4d14d9fa6f6edcda84a260e6.js} | 0 ...> xml-80f64aaafa6af7844d14f32f3219bb26.js} | 22 +- ... yaml-39582b60e653cf0b8d42292ddfabefb2.js} | 72 +- ...outes-0c01f9c463b81fdc3929288f31c23040.js} | 0 ...vices-70b9e635f1e8e9a316e3773fccadb7c7.js} | 0 ...routes-282630d2b2c8bf766b7e0d4f512828cc.js | 1 + ...rvices-51af43ae095119987dadf6f2392a59b3.js | 1 + ...outes-7718d309039e9f8b3b185656b6dd7f05.js} | 0 ...vices-70b9e635f1e8e9a316e3773fccadb7c7.js} | 0 ...outes-71c32de6a0307211d1299dac7688bfbf.js} | 0 ...vices-70b9e635f1e8e9a316e3773fccadb7c7.js} | 0 ...outes-1bdd3b7ae99c7d7ce0425b2412f10d5e.js} | 0 ...vices-1a3b6937a8bc5f6e68df884b1650eaf0.js} | 0 ...routes-989d6de4b58a54c8638e37694240f29a.js | 1 + ...rvices-e5a754eca7f3fbb406035f10b8dfbb77.js | 1 + ...ul-ui-20fef69ea9b73df740a420526b12c7fb.css | 1 - ...sul-ui-7444626e95c5ba30e9097f92995f0238.js | 3938 ++++++ ...sul-ui-e58b85f0a8e1fb15ded242e5b25b171c.js | 3507 ----- ...ul-ui-f5d0ec3be8cca14adb133c8e2f488419.css | 1 + ...outes-c69d5bf72b7c740af5e6ce29eefe65bf.js} | 2 +- ...debug-41d0902009004c6875ddb9882b4ee3f6.js} | 0 ...debug-d1862bae590c1c8cd6dc0dd81645801a.js} | 0 ...vices-faa0d1867ff0795f940a4199bcf17128.js} | 2 +- ...scape-fe4db48c9e3f272a6d12cf1312de889e.js} | 0 ...coding-022884ab2a5bd42b6f4fff580fa0dd34.js | 209 + ...coding-cdb50fbdab6d4d3fdf574dd784f77d27.js | 204 - ...dexes-50f27403be5972eae4831f5b69db1f80.js} | 0 .../init-21ea65714d133467454b601efc15e2dd.js | 5 - .../init-fe2561b45ce1429092f4a9a2bbb9ce71.js | 5 + ...onsul-5e97a9af114229497d43377450c54418.js} | 0 ...theus-8779f1c99f6a15611567154767f1f674.js} | 32 +- ...endor-69ef69e98b7d14d1513f8056b6c6b48d.css | 1 - ...vendor-aeac0d1e27f3b95c9b4bad3aac59a219.js | 11134 +++++++++++++++ ...vendor-c7887d0a48fe1497d1843edc3d5bfbc8.js | 11488 ---------------- ...endor-cf03d69ba4d9fa5934f04dca689d187f.css | 1 + agent/uiserver/dist/index.html | 60 +- 46 files changed, 18821 insertions(+), 15317 deletions(-) create mode 100644 agent/uiserver/dist/assets/chunk.143.ff39f0b820a97e2c6d5d.js create mode 100644 agent/uiserver/dist/assets/chunk.178.00380c6ad3fa678e07b6.js create mode 100644 agent/uiserver/dist/assets/chunk.336.f5cb05e551aa08eb7125.js create mode 100644 agent/uiserver/dist/assets/chunk.336.f5cb05e551aa08eb7125.js.LICENSE.txt create mode 100644 agent/uiserver/dist/assets/chunk.412.2df22e4bf69d8f15ebdb.js create mode 100644 agent/uiserver/dist/assets/chunk.412.2df22e4bf69d8f15ebdb.js.LICENSE.txt create mode 100644 agent/uiserver/dist/assets/chunk.744.c0eb6726020fc4af8d3f.css create mode 100644 agent/uiserver/dist/assets/chunk.744.c0eb6726020fc4af8d3f.js create mode 100644 agent/uiserver/dist/assets/chunk.83.85cc25a28afe28f711a3.js rename agent/uiserver/dist/assets/codemirror/mode/javascript/{javascript-77218cd1268ea6df75775114ae086566.js => javascript-a5e5d64b0f9ff6b6e21f5f48aa1ef464.js} (91%) rename agent/uiserver/dist/assets/codemirror/mode/ruby/{ruby-ea43ca3a3bdd63a52811e8464d66134b.js => ruby-2b9a2a4b4d14d9fa6f6edcda84a260e6.js} (100%) rename agent/uiserver/dist/assets/codemirror/mode/xml/{xml-10ec8b8cc61ef0fbd25b27a599fdcd60.js => xml-80f64aaafa6af7844d14f32f3219bb26.js} (60%) rename agent/uiserver/dist/assets/codemirror/mode/yaml/{yaml-3f129a000349e3075be0f65719884b61.js => yaml-39582b60e653cf0b8d42292ddfabefb2.js} (89%) rename agent/uiserver/dist/assets/consul-acls/{routes-75a2ac7d38caf09cfee2a4e2bc49dcf7.js => routes-0c01f9c463b81fdc3929288f31c23040.js} (100%) rename agent/uiserver/dist/assets/consul-acls/{services-8b6b2b2bea3add7709b8075a5ed5652b.js => services-70b9e635f1e8e9a316e3773fccadb7c7.js} (100%) create mode 100644 agent/uiserver/dist/assets/consul-hcp/routes-282630d2b2c8bf766b7e0d4f512828cc.js create mode 100644 agent/uiserver/dist/assets/consul-hcp/services-51af43ae095119987dadf6f2392a59b3.js rename agent/uiserver/dist/assets/consul-lock-sessions/{routes-f2c5ce353830c89f540358e7f174e0bf.js => routes-7718d309039e9f8b3b185656b6dd7f05.js} (100%) rename agent/uiserver/dist/assets/consul-lock-sessions/{services-8b6b2b2bea3add7709b8075a5ed5652b.js => services-70b9e635f1e8e9a316e3773fccadb7c7.js} (100%) rename agent/uiserver/dist/assets/consul-nspaces/{routes-f939ed42e9b83f9d1bbc5256be68e77c.js => routes-71c32de6a0307211d1299dac7688bfbf.js} (100%) rename agent/uiserver/dist/assets/consul-nspaces/{services-8b6b2b2bea3add7709b8075a5ed5652b.js => services-70b9e635f1e8e9a316e3773fccadb7c7.js} (100%) rename agent/uiserver/dist/assets/consul-partitions/{routes-cba490481425519435d142c743bbc3d3.js => routes-1bdd3b7ae99c7d7ce0425b2412f10d5e.js} (100%) rename agent/uiserver/dist/assets/consul-partitions/{services-85621f245f195fe1ce177064bfb04504.js => services-1a3b6937a8bc5f6e68df884b1650eaf0.js} (100%) create mode 100644 agent/uiserver/dist/assets/consul-peerings/routes-989d6de4b58a54c8638e37694240f29a.js create mode 100644 agent/uiserver/dist/assets/consul-peerings/services-e5a754eca7f3fbb406035f10b8dfbb77.js delete mode 100644 agent/uiserver/dist/assets/consul-ui-20fef69ea9b73df740a420526b12c7fb.css create mode 100644 agent/uiserver/dist/assets/consul-ui-7444626e95c5ba30e9097f92995f0238.js delete mode 100644 agent/uiserver/dist/assets/consul-ui-e58b85f0a8e1fb15ded242e5b25b171c.js create mode 100644 agent/uiserver/dist/assets/consul-ui-f5d0ec3be8cca14adb133c8e2f488419.css rename agent/uiserver/dist/assets/consul-ui/{routes-e55bc65732ba7c0352d43313fd9563e6.js => routes-c69d5bf72b7c740af5e6ce29eefe65bf.js} (52%) rename agent/uiserver/dist/assets/consul-ui/{routes-debug-8f884a3e3f7105d43b7b4024db9b4c99.js => routes-debug-41d0902009004c6875ddb9882b4ee3f6.js} (100%) rename agent/uiserver/dist/assets/consul-ui/{services-debug-5a3f1d2e3954a05aa8383f02db31b8e6.js => services-debug-d1862bae590c1c8cd6dc0dd81645801a.js} (100%) rename agent/uiserver/dist/assets/consul-ui/{services-a17470cdfbd4a4096117ac0103802226.js => services-faa0d1867ff0795f940a4199bcf17128.js} (78%) rename agent/uiserver/dist/assets/{css.escape-851839b3ea1d0b4eb4c7089446df5e9f.js => css.escape-fe4db48c9e3f272a6d12cf1312de889e.js} (100%) create mode 100644 agent/uiserver/dist/assets/encoding-022884ab2a5bd42b6f4fff580fa0dd34.js delete mode 100644 agent/uiserver/dist/assets/encoding-cdb50fbdab6d4d3fdf574dd784f77d27.js rename agent/uiserver/dist/assets/{encoding-indexes-75eea16b259716db4fd162ee283d2ae5.js => encoding-indexes-50f27403be5972eae4831f5b69db1f80.js} (100%) delete mode 100644 agent/uiserver/dist/assets/init-21ea65714d133467454b601efc15e2dd.js create mode 100644 agent/uiserver/dist/assets/init-fe2561b45ce1429092f4a9a2bbb9ce71.js rename agent/uiserver/dist/assets/metrics-providers/{consul-31d7e3b0ef7c58d62338c7d7aeaaf545.js => consul-5e97a9af114229497d43377450c54418.js} (100%) rename agent/uiserver/dist/assets/metrics-providers/{prometheus-5f31ba3b7ffd850fa916a0a76933e968.js => prometheus-8779f1c99f6a15611567154767f1f674.js} (74%) delete mode 100644 agent/uiserver/dist/assets/vendor-69ef69e98b7d14d1513f8056b6c6b48d.css create mode 100644 agent/uiserver/dist/assets/vendor-aeac0d1e27f3b95c9b4bad3aac59a219.js delete mode 100644 agent/uiserver/dist/assets/vendor-c7887d0a48fe1497d1843edc3d5bfbc8.js create mode 100644 agent/uiserver/dist/assets/vendor-cf03d69ba4d9fa5934f04dca689d187f.css diff --git a/agent/uiserver/dist/assets/chunk.143.ff39f0b820a97e2c6d5d.js b/agent/uiserver/dist/assets/chunk.143.ff39f0b820a97e2c6d5d.js new file mode 100644 index 00000000000..343ded1152b --- /dev/null +++ b/agent/uiserver/dist/assets/chunk.143.ff39f0b820a97e2c6d5d.js @@ -0,0 +1,52 @@ +var __ember_auto_import__;(()=>{var e,r,t,n,o,i={6466:(e,r,t)=>{var n,o +e.exports=(n=_eai_d,o=_eai_r,window.emberAutoImportDynamic=function(e){return 1===arguments.length?o("_eai_dyn_"+e):o("_eai_dynt_"+e)(Array.prototype.slice.call(arguments,1))},window.emberAutoImportSync=function(e){return o("_eai_sync_"+e)(Array.prototype.slice.call(arguments,1))},n("@hashicorp/flight-icons/svg",[],(function(){return t(218)})),n("@lit/reactive-element",[],(function(){return t(3493)})),n("@xstate/fsm",[],(function(){return t(9454)})),n("a11y-dialog",[],(function(){return t(6313)})),n("base64-js",[],(function(){return t(3305)})),n("clipboard",[],(function(){return t(2309)})),n("d3-array",[],(function(){return t(1286)})),n("d3-scale",[],(function(){return t(113)})),n("d3-scale-chromatic",[],(function(){return t(9677)})),n("d3-selection",[],(function(){return t(1058)})),n("d3-shape",[],(function(){return t(6736)})),n("dayjs",[],(function(){return t(4434)})),n("dayjs/plugin/calendar",[],(function(){return t(9379)})),n("dayjs/plugin/relativeTime",[],(function(){return t(8275)})),n("deepmerge",[],(function(){return t(2999)})),n("ember-focus-trap/modifiers/focus-trap.js",[],(function(){return t(6673)})),n("ember-keyboard/helpers/if-key.js",[],(function(){return t(6866)})),n("ember-keyboard/helpers/on-key.js",[],(function(){return t(9930)})),n("ember-keyboard/modifiers/on-key.js",[],(function(){return t(6222)})),n("ember-keyboard/services/keyboard.js",[],(function(){return t(6918)})),n("fast-deep-equal",[],(function(){return t(7889)})),n("fast-memoize",[],(function(){return t(4564)})),n("flat",[],(function(){return t(8581)})),n("intersection-observer-admin",[],(function(){return t(2914)})),n("intl-messageformat",[],(function(){return t(4143)})),n("intl-messageformat-parser",[],(function(){return t(4857)})),n("mnemonist/multi-map",[],(function(){return t(6196)})),n("mnemonist/set",[],(function(){return t(3333)})),n("ngraph.graph",[],(function(){return t(1832)})),n("parse-duration",[],(function(){return t(1813)})),n("pretty-ms",[],(function(){return t(3385)})),n("raf-pool",[],(function(){return t(7114)})),n("tippy.js",[],(function(){return t(1499)})),n("validated-changeset",[],(function(){return t(6530)})),n("wayfarer",[],(function(){return t(6841)})),n("_eai_dyn_dialog-polyfill",[],(function(){return t.e(83).then(t.bind(t,7083))})),void n("_eai_dyn_dialog-polyfill-css",[],(function(){return t.e(744).then(t.bind(t,7744))})))},6760:function(e,r){window._eai_r=require,window._eai_d=define},1292:e=>{"use strict" +e.exports=require("@ember/application")},8797:e=>{"use strict" +e.exports=require("@ember/component/helper")},3353:e=>{"use strict" +e.exports=require("@ember/debug")},9341:e=>{"use strict" +e.exports=require("@ember/destroyable")},4927:e=>{"use strict" +e.exports=require("@ember/modifier")},7219:e=>{"use strict" +e.exports=require("@ember/object")},8773:e=>{"use strict" +e.exports=require("@ember/runloop")},8574:e=>{"use strict" +e.exports=require("@ember/service")},1866:e=>{"use strict" +e.exports=require("@ember/utils")},5831:e=>{"use strict" +e.exports=require("ember-modifier")}},u={} +function a(e){var r=u[e] +if(void 0!==r)return r.exports +var t=u[e]={exports:{}} +return i[e].call(t.exports,t,t.exports,a),t.exports}a.m=i,e=[],a.O=(r,t,n,o)=>{if(!t){var i=1/0 +for(l=0;l=o)&&Object.keys(a.O).every((e=>a.O[e](t[s])))?t.splice(s--,1):(u=!1,o0&&e[l-1][2]>o;l--)e[l]=e[l-1] +e[l]=[t,n,o]},a.n=e=>{var r=e&&e.__esModule?()=>e.default:()=>e +return a.d(r,{a:r}),r},a.d=(e,r)=>{for(var t in r)a.o(r,t)&&!a.o(e,t)&&Object.defineProperty(e,t,{enumerable:!0,get:r[t]})},a.f={},a.e=e=>Promise.all(Object.keys(a.f).reduce(((r,t)=>(a.f[t](e,r),r)),[])),a.u=e=>"chunk."+e+"."+{83:"85cc25a28afe28f711a3",744:"c0eb6726020fc4af8d3f"}[e]+".js",a.miniCssF=e=>"chunk."+e+".c0eb6726020fc4af8d3f.css",a.o=(e,r)=>Object.prototype.hasOwnProperty.call(e,r),r={},t="__ember_auto_import__:",a.l=(e,n,o,i)=>{if(r[e])r[e].push(n) +else{var u,s +if(void 0!==o)for(var c=document.getElementsByTagName("script"),l=0;l{u.onerror=u.onload=null,clearTimeout(p) +var o=r[e] +if(delete r[e],u.parentNode&&u.parentNode.removeChild(u),o&&o.forEach((e=>e(n))),t)return t(n)},p=setTimeout(d.bind(null,void 0,{type:"timeout",target:u}),12e4) +u.onerror=d.bind(null,u.onerror),u.onload=d.bind(null,u.onload),s&&document.head.appendChild(u)}},a.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},a.p="{{.ContentPath}}assets/",n=e=>new Promise(((r,t)=>{var n=a.miniCssF(e),o=a.p+n +if(((e,r)=>{for(var t=document.getElementsByTagName("link"),n=0;n{var o=document.createElement("link") +o.rel="stylesheet",o.type="text/css",o.onerror=o.onload=i=>{if(o.onerror=o.onload=null,"load"===i.type)t() +else{var u=i&&("load"===i.type?"missing":i.type),a=i&&i.target&&i.target.href||r,s=new Error("Loading CSS chunk "+e+" failed.\n("+a+")") +s.code="CSS_CHUNK_LOAD_FAILED",s.type=u,s.request=a,o.parentNode.removeChild(o),n(s)}},o.href=r,document.head.appendChild(o)})(e,o,r,t)})),o={143:0},a.f.miniCss=(e,r)=>{o[e]?r.push(o[e]):0!==o[e]&&{744:1}[e]&&r.push(o[e]=n(e).then((()=>{o[e]=0}),(r=>{throw delete o[e],r})))},(()=>{var e={143:0} +a.f.j=(r,t)=>{var n=a.o(e,r)?e[r]:void 0 +if(0!==n)if(n)t.push(n[2]) +else{var o=new Promise(((t,o)=>n=e[r]=[t,o])) +t.push(n[2]=o) +var i=a.p+a.u(r),u=new Error +a.l(i,(t=>{if(a.o(e,r)&&(0!==(n=e[r])&&(e[r]=void 0),n)){var o=t&&("load"===t.type?"missing":t.type),i=t&&t.target&&t.target.src +u.message="Loading chunk "+r+" failed.\n("+o+": "+i+")",u.name="ChunkLoadError",u.type=o,u.request=i,n[1](u)}}),"chunk-"+r,r)}},a.O.j=r=>0===e[r] +var r=(r,t)=>{var n,o,[i,u,s]=t,c=0 +if(i.some((r=>0!==e[r]))){for(n in u)a.o(u,n)&&(a.m[n]=u[n]) +if(s)var l=s(a)}for(r&&r(t);ca(6760))) +var s=a.O(void 0,[412],(()=>a(6466))) +s=a.O(s),__ember_auto_import__=s})() diff --git a/agent/uiserver/dist/assets/chunk.178.00380c6ad3fa678e07b6.js b/agent/uiserver/dist/assets/chunk.178.00380c6ad3fa678e07b6.js new file mode 100644 index 00000000000..884e5a3cb91 --- /dev/null +++ b/agent/uiserver/dist/assets/chunk.178.00380c6ad3fa678e07b6.js @@ -0,0 +1,21 @@ +var __ember_auto_import__;(()=>{var r,e={6760:function(r,e){window._eai_r=require,window._eai_d=define},4593:(r,e,t)=>{var o,n +r.exports=(o=_eai_d,n=_eai_r,window.emberAutoImportDynamic=function(r){return 1===arguments.length?n("_eai_dyn_"+r):n("_eai_dynt_"+r)(Array.prototype.slice.call(arguments,1))},window.emberAutoImportSync=function(r){return n("_eai_sync_"+r)(Array.prototype.slice.call(arguments,1))},o("lodash.castarray",[],(function(){return t(5665)})),o("lodash.last",[],(function(){return t(66)})),o("lodash.omit",[],(function(){return t(9254)})),o("qunit",[],(function(){return t(3409)})),void o("yadda",[],(function(){return t(409)})))},9265:()=>{},3642:()=>{}},t={} +function o(r){var n=t[r] +if(void 0!==n)return n.exports +var i=t[r]={id:r,loaded:!1,exports:{}} +return e[r].call(i.exports,i,i.exports,o),i.loaded=!0,i.exports}o.m=e,r=[],o.O=(e,t,n,i)=>{if(!t){var a=1/0 +for(c=0;c=i)&&Object.keys(o.O).every((r=>o.O[r](t[l])))?t.splice(l--,1):(u=!1,i0&&r[c-1][2]>i;c--)r[c]=r[c-1] +r[c]=[t,n,i]},o.g=function(){if("object"==typeof globalThis)return globalThis +try{return this||new Function("return this")()}catch(r){if("object"==typeof window)return window}}(),o.o=(r,e)=>Object.prototype.hasOwnProperty.call(r,e),o.nmd=r=>(r.paths=[],r.children||(r.children=[]),r),(()=>{var r={178:0} +o.O.j=e=>0===r[e] +var e=(e,t)=>{var n,i,[a,u,l]=t,_=0 +if(a.some((e=>0!==r[e]))){for(n in u)o.o(u,n)&&(o.m[n]=u[n]) +if(l)var c=l(o)}for(e&&e(t);_o(6760))) +var n=o.O(void 0,[336],(()=>o(4593))) +n=o.O(n),__ember_auto_import__=n})() diff --git a/agent/uiserver/dist/assets/chunk.336.f5cb05e551aa08eb7125.js b/agent/uiserver/dist/assets/chunk.336.f5cb05e551aa08eb7125.js new file mode 100644 index 00000000000..b4ef3eadadc --- /dev/null +++ b/agent/uiserver/dist/assets/chunk.336.f5cb05e551aa08eb7125.js @@ -0,0 +1,908 @@ +/*! For license information please see chunk.336.f5cb05e551aa08eb7125.js.LICENSE.txt */ +(globalThis.webpackChunk_ember_auto_import_=globalThis.webpackChunk_ember_auto_import_||[]).push([[336],{3409:(e,t,n)=>{var r +e=n.nmd(e),function(){"use strict" +function i(e){return i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},i(e)}function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function s(e,t){for(var n=0;ne.length)&&(t=e.length) +for(var n=0,r=new Array(t);n1&&void 0!==arguments[1])||arguments[1],n=t&&q("array",e)?[]:{} +for(var r in e)if(E.call(e,r)){var i=e[r] +n[r]=i===Object(i)?j(i,t):i}return n}function N(e,t){if(e!==Object(e))return e +var n={} +for(var r in t)E.call(t,r)&&E.call(e,r)&&(n[r]=N(e[r],t[r])) +return n}function M(e,t,n){for(var r in t)E.call(t,r)&&(void 0===t[r]?delete e[r]:n&&void 0!==e[r]||(e[r]=t[r])) +return e}function O(e){if(void 0===e)return"undefined" +if(null===e)return"null" +var t=k.call(e).match(/^\[object\s(.*)\]$/),n=t&&t[1] +switch(n){case"Number":return isNaN(e)?"nan":"number" +case"String":case"Boolean":case"Array":case"Set":case"Map":case"Date":case"RegExp":case"Function":case"Symbol":return n.toLowerCase() +default:return i(e)}}function q(e,t){return O(t)===e}function A(e,t){for(var n=e+""+t,r=0,i=0;is.maxDepth)return"[object Array]" +this.up() +for(var r=e.length,i=new Array(r);r--;)i[r]=this.parse(e[r],void 0,t) +return this.down(),n("[",i,"]")}var o=/^function (\w+)/,s={parse:function(e,t,n){var r=(n=n||[]).indexOf(e) +if(-1!==r)return"recursion(".concat(r-n.length,")") +t=t||this.typeOf(e) +var o=this.parsers[t],s=i(o) +if("function"===s){n.push(e) +var a=o.call(this,e,n) +return n.pop(),a}return"string"===s?o:"[ERROR: Missing QUnit.dump formatter for type "+t+"]"},typeOf:function(e){var t +return t=null===e?"null":void 0===e?"undefined":q("regexp",e)?"regexp":q("date",e)?"date":q("function",e)?"function":void 0!==e.setInterval&&void 0!==e.document&&void 0===e.nodeType?"window":9===e.nodeType?"document":e.nodeType?"node":function(e){return"[object Array]"===k.call(e)||"number"==typeof e.length&&void 0!==e.item&&(e.length?e.item(0)===e[0]:null===e.item(0)&&void 0===e[0])}(e)?"array":e.constructor===Error.prototype.constructor?"error":i(e),t},separator:function(){return this.multiline?this.HTML?"
    ":"\n":this.HTML?" ":" "},indent:function(e){if(!this.multiline)return"" +var t=this.indentChar +return this.HTML&&(t=t.replace(/\t/g," ").replace(/ /g," ")),new Array(this.depth+(e||0)).join(t)},up:function(e){this.depth+=e||1},down:function(e){this.depth-=e||1},setParser:function(e,t){this.parsers[e]=t},quote:e,literal:t,join:n,depth:1,maxDepth:F.maxDepth,parsers:{window:"[Window]",document:"[Document]",error:function(e){return'Error("'+e.message+'")'},unknown:"[Unknown]",null:"null",undefined:"undefined",function:function(e){var t="function",r="name"in e?e.name:(o.exec(e)||[])[1] +return r&&(t+=" "+r),n(t=[t+="(",s.parse(e,"functionArgs"),"){"].join(""),s.parse(e,"functionCode"),"}")},array:r,nodelist:r,arguments:r,object:function(e,t){var r=[] +if(s.maxDepth&&s.depth>s.maxDepth)return"[object Object]" +s.up() +var i=[] +for(var o in e)i.push(o) +var a=["message","name"] +for(var u in a){var c=a[u] +c in e&&!T(c,i)&&i.push(c)}i.sort() +for(var l=0;l",r=e.nodeName.toLowerCase(),i=t+r,o=e.attributes +if(o)for(var a=0;a0&&void 0!==arguments[0]?arguments[0]:{passed:0,failed:0,skipped:0,todo:0,total:0} +return e.failed+=this.globalFailureCount,e.total+=this.globalFailureCount,e=this.tests.reduce((function(e,t){return t.valid&&(e[t.getStatus()]++,e.total++),e}),e),this.childSuites.reduce((function(e,t){return t.getTestCounts(e)}),e)}},{key:"getStatus",value:function(){var e=this.getTestCounts(),t=e.total,n=e.failed,r=e.skipped,i=e.todo +return n?"failed":r===t?"skipped":i===t?"todo":"passed"}}]),e}(),B=[],U=new L +function H(e,t,n){var r=B.length?B.slice(-1)[0]:null,i=null!==r?[r.name,e].join(" > "):e,o=r?r.suiteReport:U,s=null!==r&&r.skip||n.skip,a=null!==r&&r.todo||n.todo,u={} +r&&M(u,r.testEnvironment),M(u,t) +var c={name:i,parentModule:r,hooks:{before:[],beforeEach:[],afterEach:[],after:[]},testEnvironment:u,tests:[],moduleId:A(i),testsRun:0,testsIgnored:0,childModules:[],suiteReport:new L(e,o),stats:null,skip:s,todo:!s&&a,ignored:n.ignored||!1} +return r&&r.childModules.push(c),F.modules.push(c),c}function z(e,t,n){var r=t[n] +"function"==typeof r&&e[n].push(r),delete t[n]}function $(e,t){return function(n){F.currentModule!==e&&x.warn("The `"+t+"` hook was called inside the wrong module (`"+F.currentModule.name+"`). Instead, use hooks provided by the callback to the containing module (`"+e.name+"`). This will become an error in QUnit 3.0."),e.hooks[t].push(n)}}function Q(e,t,n){var r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{} +"function"==typeof t&&(n=t,t=void 0) +var i=H(e,t,r),o=i.testEnvironment,s=i.hooks +z(s,o,"before"),z(s,o,"beforeEach"),z(s,o,"afterEach"),z(s,o,"after") +var a={before:$(i,"before"),beforeEach:$(i,"beforeEach"),afterEach:$(i,"afterEach"),after:$(i,"after")},u=F.currentModule +if(F.currentModule=i,"function"==typeof n){B.push(i) +try{var c=n.call(i.testEnvironment,a) +c&&"function"==typeof c.then&&x.warn("Returning a promise from a module callback is not supported. Instead, use hooks for async behavior. This will become an error in QUnit 3.0.")}finally{B.pop(),F.currentModule=i.parentModule||u}}}var G=!1 +function W(e,t,n){var r,i=G&&(r=F.modules.filter((function(e){return!e.ignored})).map((function(e){return e.moduleId})),!B.some((function(e){return r.includes(e.moduleId)}))) +Q(e,t,n,{ignored:i})}W.only=function(){G||(F.modules.length=0,F.queue.length=0,F.currentModule.ignored=!0),G=!0,Q.apply(void 0,arguments)},W.skip=function(e,t,n){G||Q(e,t,n,{skip:!0})},W.todo=function(e,t,n){G||Q(e,t,n,{todo:!0})} +var Y=(J(0)||"").replace(/(:\d+)+\)?/,"").replace(/.+[/\\]/,"") +function V(e,t){if(t=void 0===t?4:t,e&&e.stack){var n=e.stack.split("\n") +if(/^error$/i.test(n[0])&&n.shift(),Y){for(var r=[],i=t;i0&&this.test.internalResetTimeout(this.test.timeout))}},{key:"step",value:function(e){var t=e,n=!!e +this.test.steps.push(e),void 0===e||""===e?t="You must provide a message to assert.step":"string"!=typeof e&&(t="You must provide a string value to assert.step",n=!1),this.pushResult({result:n,message:t})}},{key:"verifySteps",value:function(e,t){var n=this.test.steps.slice() +this.deepEqual(n,e,t),this.test.steps.length=0}},{key:"expect",value:function(e){if(1!==arguments.length)return this.test.expected +this.test.expected=e}},{key:"async",value:function(e){var t=void 0===e?1:e +return this.test.internalStop(t)}},{key:"push",value:function(t,n,r,i,o){return x.warn("assert.push is deprecated and will be removed in QUnit 3.0. Please use assert.pushResult instead (https://api.qunitjs.com/assert/pushResult)."),(this instanceof e?this:F.current.assert).pushResult({result:t,actual:n,expected:r,message:i,negative:o})}},{key:"pushResult",value:function(t){var n=this,r=n instanceof e&&n.test||F.current +if(!r)throw new Error("assertion outside test context, in "+J(2)) +return n instanceof e||(n=r.assert),n.test.pushResult(t)}},{key:"ok",value:function(e,t){t||(t=e?"okay":"failed, expected argument to be truthy, was: ".concat(D.parse(e))),this.pushResult({result:!!e,actual:e,expected:!0,message:t})}},{key:"notOk",value:function(e,t){t||(t=e?"failed, expected argument to be falsy, was: ".concat(D.parse(e)):"okay"),this.pushResult({result:!e,actual:e,expected:!1,message:t})}},{key:"true",value:function(e,t){this.pushResult({result:!0===e,actual:e,expected:!0,message:t})}},{key:"false",value:function(e,t){this.pushResult({result:!1===e,actual:e,expected:!1,message:t})}},{key:"equal",value:function(e,t,n){var r=t==e +this.pushResult({result:r,actual:e,expected:t,message:n})}},{key:"notEqual",value:function(e,t,n){var r=t!=e +this.pushResult({result:r,actual:e,expected:t,message:n,negative:!0})}},{key:"propEqual",value:function(e,t,n){e=j(e),t=j(t),this.pushResult({result:I(e,t),actual:e,expected:t,message:n})}},{key:"notPropEqual",value:function(e,t,n){e=j(e),t=j(t),this.pushResult({result:!I(e,t),actual:e,expected:t,message:n,negative:!0})}},{key:"propContains",value:function(e,t,n){e=N(e,t),t=j(t,!1),this.pushResult({result:I(e,t),actual:e,expected:t,message:n})}},{key:"notPropContains",value:function(e,t,n){e=N(e,t),t=j(t),this.pushResult({result:!I(e,t),actual:e,expected:t,message:n,negative:!0})}},{key:"deepEqual",value:function(e,t,n){this.pushResult({result:I(e,t),actual:e,expected:t,message:n})}},{key:"notDeepEqual",value:function(e,t,n){this.pushResult({result:!I(e,t),actual:e,expected:t,message:n,negative:!0})}},{key:"strictEqual",value:function(e,t,n){this.pushResult({result:t===e,actual:e,expected:t,message:n})}},{key:"notStrictEqual",value:function(e,t,n){this.pushResult({result:t!==e,actual:e,expected:t,message:n,negative:!0})}},{key:"throws",value:function(t,n,r){var i=u(Z(n,r,"throws"),2) +n=i[0],r=i[1] +var o=this instanceof e&&this.test||F.current +if("function"==typeof t){var s,a=!1 +o.ignoreGlobalErrors=!0 +try{t.call(o.testEnvironment)}catch(e){s=e}if(o.ignoreGlobalErrors=!1,s){var c=u(K(s,n,r),3) +a=c[0],n=c[1],r=c[2]}o.assert.pushResult({result:a,actual:s&&R(s),expected:n,message:r})}else{var l='The value provided to `assert.throws` in "'+o.testName+'" was not a function.' +o.assert.pushResult({result:!1,actual:t,message:l})}}},{key:"rejects",value:function(t,n,r){var i=u(Z(n,r,"rejects"),2) +n=i[0],r=i[1] +var o=this instanceof e&&this.test||F.current,s=t&&t.then +if("function"==typeof s){var a=this.async() +return s.call(t,(function(){var e='The promise returned by the `assert.rejects` callback in "'+o.testName+'" did not reject.' +o.assert.pushResult({result:!1,message:e,actual:t}),a()}),(function(e){var t,i=u(K(e,n,r),3) +t=i[0],n=i[1],r=i[2],o.assert.pushResult({result:t,actual:e&&R(e),expected:n,message:r}),a()}))}var c='The value provided to `assert.rejects` in "'+o.testName+'" was not a promise.' +o.assert.pushResult({result:!1,message:c,actual:t})}}]),e}() +function Z(e,t,n){var r=O(e) +if("string"===r){if(void 0===t)return t=e,[e=void 0,t] +throw new Error("assert."+n+" does not accept a string value for the expected argument.\nUse a non-string object value (e.g. RegExp or validator function) instead if necessary.")}if(e&&"regexp"!==r&&"function"!==r&&"object"!==r)throw new Error("Invalid expected value type ("+r+") provided to assert."+n+".") +return[e,t]}function K(e,t,n){var r=!1,i=O(t) +if(t){if("regexp"===i)r=t.test(R(e)),t=String(t) +else if("function"===i&&void 0!==t.prototype&&e instanceof t)r=!0 +else if("object"===i)r=e instanceof t.constructor&&e.name===t.name&&e.message===t.message,t=R(t) +else if("function"===i)try{r=!0===t.call({},e),t=null}catch(e){t=R(e)}}else r=!0 +return[r,t,n]}X.prototype.raises=X.prototype.throws +var ee=Object.create(null),te=["error","runStart","suiteStart","testStart","assertion","testEnd","suiteEnd","runEnd"] +function ne(e,t){if("string"!=typeof e)throw new TypeError("eventName must be a string when emitting an event") +for(var n=ee[e],r=n?c(n):[],i=0;i0&&ue--,le()):function(){var e +if(0===F.stats.testCount&&!0===F.failOnZeroTests)return e=F.filter&&F.filter.length?new Error('No tests matched the filter "'.concat(F.filter,'".')):F.module&&F.module.length?new Error('No tests matched the module "'.concat(F.module,'".')):F.moduleId&&F.moduleId.length?new Error('No tests matched the moduleId "'.concat(F.moduleId,'".')):F.testId&&F.testId.length?new Error('No tests matched the testId "'.concat(F.testId,'".')):new Error("No tests were run."),we("global failure",M((function(t){t.pushResult({result:!1,message:e.message,source:e.stack})}),{validTest:!0})),void le() +var t=F.storage,n=Math.round(S.now()-F.started),r=F.stats.all-F.stats.bad +he.finished=!0,ne("runEnd",U.end(!0)),se("done",{passed:r,failed:F.stats.bad,total:F.stats.all,runtime:n}).then((function(){if(t&&0===F.stats.bad)for(var e=t.length-1;e>=0;e--){var n=t.key(e) +0===n.indexOf("qunit-test-")&&t.removeItem(n)}}))}())}function fe(e){if(ce.length&&!F.blocking){var t=S.now()-e +if(!g||F.updateRate<=0||t>>17,(t^=t<<5)<0&&(t+=4294967296),t/4294967296}}(n)) +var r=Math.floor(ae()*(F.queue.length-ue+1)) +F.queue.splice(ue+r,0,e)}else F.queue.push(e)},advance:le,taskCount:function(){return ce.length}},de=function(){function e(t,n,r){o(this,e),this.name=t,this.suiteName=n.name,this.fullName=n.fullName.concat(t),this.runtime=0,this.assertions=[],this.skipped=!!r.skip,this.todo=!!r.todo,this.valid=r.valid,this._startTime=0,this._endTime=0,n.pushTest(this)}return a(e,[{key:"start",value:function(e){return e&&(this._startTime=S.now(),S.mark("qunit_test_start")),{name:this.name,suiteName:this.suiteName,fullName:this.fullName.slice()}}},{key:"end",value:function(e){if(e&&(this._endTime=S.now(),S)){S.mark("qunit_test_end") +var t=this.fullName.join(" – ") +S.measure("QUnit Test: ".concat(t),"qunit_test_start","qunit_test_end")}return M(this.start(),{runtime:this.getRuntime(),status:this.getStatus(),errors:this.getFailedAssertions(),assertions:this.getAssertions()})}},{key:"pushAssertion",value:function(e){this.assertions.push(e)}},{key:"getRuntime",value:function(){return Math.round(this._endTime-this._startTime)}},{key:"getStatus",value:function(){return this.skipped?"skipped":(this.getFailedAssertions().length>0?this.todo:!this.todo)?this.todo?"todo":"passed":"failed"}},{key:"getFailedAssertions",value:function(){return this.assertions.filter((function(e){return!e.passed}))}},{key:"getAssertions",value:function(){return this.assertions.slice()}},{key:"slimAssertions",value:function(){this.assertions=this.assertions.map((function(e){return delete e.actual,delete e.expected,e}))}}]),e}() +function pe(e){if(this.expected=null,this.assertions=[],this.module=F.currentModule,this.steps=[],this.timeout=void 0,this.data=void 0,this.withData=!1,this.pauses=new w,this.nextPauseId=1,this.stackOffset=3,M(this,e),this.module.skip?(this.skip=!0,this.todo=!1):this.module.todo&&!this.skip&&(this.todo=!0),he.finished)x.warn("Unexpected test after runEnd. This is unstable and will fail in QUnit 3.0.") +else{if(!this.skip&&"function"!=typeof this.callback){var t=this.todo?"QUnit.todo":"QUnit.test" +throw new TypeError("You must provide a callback to ".concat(t,'("').concat(this.testName,'")'))}++pe.count,this.errorForStack=new Error,this.callback&&this.callback.validTest&&(this.errorForStack.stack=void 0),this.testReport=new de(this.testName,this.module.suiteReport,{todo:this.todo,skip:this.skip,valid:this.valid()}) +for(var n=0,r=this.module.tests;n0&&ge("Test did not finish synchronously even though assert.timeout( 0 ) was used.",J(2))}},after:function(){!function(){var e=F.pollution +ve() +var t=C(F.pollution,e) +t.length>0&&ge("Introduced global variable(s): "+t.join(", ")) +var n=C(e,F.pollution) +n.length>0&&ge("Deleted global variable(s): "+n.join(", "))}()},queueGlobalHook:function(e,t){var n=this +return function(){var r +if(F.current=n,F.notrycatch)r=e.call(n.testEnvironment,n.assert) +else try{r=e.call(n.testEnvironment,n.assert)}catch(e){return void n.pushFailure("Global "+t+" failed on "+n.testName+": "+R(e),V(e,0))}n.resolvePromise(r,t)}},queueHook:function(e,t,n){var r=this,i=function(){var n=e.call(r.testEnvironment,r.assert) +r.resolvePromise(n,t)} +return function(){if("before"===t){if(0!==n.testsRun)return +r.preserveEnvironment=!0}if("after"!==t||function(e){return e.testsRun===Se(e).filter((function(e){return!e.skip})).length-1}(n)||!(F.queue.length>0||he.taskCount()>2))if(F.current=r,F.notrycatch)i() +else try{i()}catch(e){r.pushFailure(t+" failed on "+r.testName+": "+(e.message||e),V(e,0))}}},hooks:function(e){var t=[] +return this.skip||(function(n){if(("beforeEach"===e||"afterEach"===e)&&F.globalHooks[e])for(var r=0;r Test: "+n+"\n> Message: "+t+"\n")}var r={module:this.module.name,name:this.testName,result:e.result,message:e.message,actual:e.actual,testId:this.testId,negative:e.negative||!1,runtime:Math.round(S.now()-this.started),todo:!!this.todo} +if(E.call(e,"expected")&&(r.expected=e.expected),!e.result){var i=e.source||J() +i&&(r.source=i)}this.logAssertion(r),this.assertions.push({result:!!e.result,message:e.message})},pushFailure:function(e,t,n){if(!(this instanceof pe))throw new Error("pushFailure() assertion outside test context, was "+J(2)) +this.pushResult({result:!1,message:e||"error",actual:n||null,source:t})},logAssertion:function(e){se("log",e) +var t={passed:e.result,actual:e.actual,expected:e.expected,message:e.message,stack:e.source,todo:e.todo} +this.testReport.pushAssertion(t),ne("assertion",t)},internalResetTimeout:function(e){v(F.timeout),F.timeout=g(F.timeoutHandler(e),e)},internalStop:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:1 +F.blocking=!0 +var t,n=this,r=this.nextPauseId++,i={cancelled:!1,remaining:e} +function o(){if(!i.cancelled){if(void 0===F.current)throw new Error("Unexpected release of async pause after tests finished.\n"+"> Test: ".concat(n.testName," [async #").concat(r,"]")) +if(F.current!==n)throw new Error("Unexpected release of async pause during a different test.\n"+"> Test: ".concat(n.testName," [async #").concat(r,"]")) +if(i.remaining<=0)throw new Error("Tried to release async pause that was already released.\n"+"> Test: ".concat(n.testName," [async #").concat(r,"]")) +i.remaining--,0===i.remaining&&n.pauses.delete(r),_e(n)}}return n.pauses.set(r,i),g&&("number"==typeof n.timeout?t=n.timeout:"number"==typeof F.testTimeout&&(t=F.testTimeout),"number"==typeof t&&t>0&&(F.timeoutHandler=function(e){return function(){F.timeout=null,i.cancelled=!0,n.pauses.delete(r),n.pushFailure("Test took longer than ".concat(e,"ms; test timed out."),J(2)),_e(n)}},v(F.timeout),F.timeout=g(F.timeoutHandler(t),t))),o},resolvePromise:function(e,t){if(null!=e){var n=this,r=e.then +if("function"==typeof r){var i=n.internalStop(),o=function(){i()} +F.notrycatch?r.call(e,o):r.call(e,o,(function(e){var r="Promise rejected "+(t?t.replace(/Each$/,""):"during")+' "'+n.testName+'": '+(e&&e.message||e) +n.pushFailure(r,V(e,0)),ve(),Ee(n)}))}}},valid:function(){if(this.callback&&this.callback.validTest)return!0 +if(!function e(t,n){return!n||!n.length||T(t.moduleId,n)||t.parentModule&&e(t.parentModule,n)}(this.module,F.moduleId))return!1 +if(F.testId&&F.testId.length&&!T(this.testId,F.testId))return!1 +var e=F.module&&F.module.toLowerCase() +if(!function e(t,n){return!n||(t.name?t.name.toLowerCase():null)===n||!!t.parentModule&&e(t.parentModule,n)}(this.module,e))return!1 +var t=F.filter +if(!t)return!0 +var n=/^(!?)\/([\w\W]*)\/(i?$)/.exec(t),r=this.module.name+": "+this.testName +return n?this.regexFilter(!!n[1],n[2],n[3],r):this.stringFilter(t,r)},regexFilter:function(e,t,n,r){return new RegExp(t,n).test(r)!==e},stringFilter:function(e,t){e=e.toLowerCase(),t=t.toLowerCase() +var n="!"!==e.charAt(0) +return n||(e=e.slice(1)),-1!==t.indexOf(e)?n:!n}} +var me=!1 +function ye(e){me||F.currentModule.ignored||new pe(e).queue()}function be(e){F.currentModule.ignored||(me||(F.queue.length=0,me=!0),new pe(e).queue())}function we(e,t){ye({testName:e,callback:t})}function xe(e,t){return"".concat(e," [").concat(t,"]")}function ke(e,t){if(Array.isArray(e))for(var n=0;n0||(g?(v(F.timeout),F.timeout=g((function(){e.pauses.size>0||(v(F.timeout),F.timeout=null,F.blocking=!1,he.advance())}))):(F.blocking=!1,he.advance()))}function Se(e){for(var t=[].concat(e.tests),n=c(e.childModules);n.length;){var r=n.shift() +t.push.apply(t,r.tests),n.push.apply(n,c(r.childModules))}return t}function Ce(e){return e.testsRun+e.testsIgnored===Se(e).length}function Te(e){for(e.testsIgnored++;e=e.parentModule;)e.testsIgnored++}M(we,{todo:function(e,t){ye({testName:e,callback:t,todo:!0})},skip:function(e){ye({testName:e,skip:!0})},only:function(e,t){be({testName:e,callback:t})},each:function(e,t,n){ke(t,(function(t,r){ye({testName:xe(e,r),callback:n,withData:!0,stackOffset:5,data:t})}))}}),we.todo.each=function(e,t,n){ke(t,(function(t,r){ye({testName:xe(e,r),callback:n,todo:!0,withData:!0,stackOffset:5,data:t})}))},we.skip.each=function(e,t){ke(t,(function(t,n){ye({testName:xe(e,n),stackOffset:5,skip:!0})}))},we.only.each=function(e,t,n){ke(t,(function(t,r){be({testName:xe(e,r),callback:n,withData:!0,stackOffset:5,data:t})}))} +var je,Ne,Me,Oe,qe=function(){function e(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{} +o(this,e),this.log=n.log||Function.prototype.bind.call(p.log,p),t.on("error",this.onError.bind(this)),t.on("runStart",this.onRunStart.bind(this)),t.on("testStart",this.onTestStart.bind(this)),t.on("testEnd",this.onTestEnd.bind(this)),t.on("runEnd",this.onRunEnd.bind(this))}return a(e,[{key:"onError",value:function(e){this.log("error",e)}},{key:"onRunStart",value:function(e){this.log("runStart",e)}},{key:"onTestStart",value:function(e){this.log("testStart",e)}},{key:"onTestEnd",value:function(e){this.log("testEnd",e)}},{key:"onRunEnd",value:function(e){this.log("runEnd",e)}}],[{key:"init",value:function(t,n){return new e(t,n)}}]),e}(),Ae=!0 +if("undefined"!=typeof process){var Re=process.env +je=Re.FORCE_COLOR,Ne=Re.NODE_DISABLE_COLORS,Me=Re.NO_COLOR,Oe=Re.TERM,Ae=process.stdout&&process.stdout.isTTY}var Ie={enabled:!Ne&&null==Me&&"dumb"!==Oe&&(null!=je&&"0"!==je||Ae),reset:Pe(0,0),bold:Pe(1,22),dim:Pe(2,22),italic:Pe(3,23),underline:Pe(4,24),inverse:Pe(7,27),hidden:Pe(8,28),strikethrough:Pe(9,29),black:Pe(30,39),red:Pe(31,39),green:Pe(32,39),yellow:Pe(33,39),blue:Pe(34,39),magenta:Pe(35,39),cyan:Pe(36,39),white:Pe(37,39),gray:Pe(90,39),grey:Pe(90,39),bgBlack:Pe(40,49),bgRed:Pe(41,49),bgGreen:Pe(42,49),bgYellow:Pe(43,49),bgBlue:Pe(44,49),bgMagenta:Pe(45,49),bgCyan:Pe(46,49),bgWhite:Pe(47,49)} +function Fe(e,t){for(var n,r=0,i="",o="";r1&&void 0!==arguments[1]?arguments[1]:4 +if(void 0===e&&(e=String(e)),"number"!=typeof e||isFinite(e)||(e=String(e)),"number"==typeof e)return JSON.stringify(e) +if("string"==typeof e){var n=/['"\\/[{}\]\r\n]/,r=/[-?:,[\]{}#&*!|=>'"%@`]/,i=/(^\s|\s$)/,o=/^[\d._-]+$/,s=/^(true|false|y|n|yes|no|on|off)$/i +if(""===e||n.test(e)||r.test(e[0])||i.test(e)||o.test(e)||s.test(e)){if(!/\n/.test(e))return JSON.stringify(e) +var a=new Array(t+1).join(" "),u=e.match(/\n+$/),c=u?u[0].length:0 +if(1===c){var l=e.replace(/\n$/,"").split("\n").map((function(e){return a+e})) +return"|\n"+l.join("\n")}var f=e.split("\n").map((function(e){return a+e})) +return"|+\n"+f.join("\n")}return e}return JSON.stringify(Be(e),null,2)}function Be(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[] +if(-1!==t.indexOf(e))return"[Circular]" +var n,r=Object.prototype.toString.call(e).replace(/^\[.+\s(.+?)]$/,"$1").toLowerCase() +switch(r){case"array":t.push(e),n=e.map((function(e){return Be(e,t)})),t.pop() +break +case"object":t.push(e),n={},Object.keys(e).forEach((function(r){n[r]=Be(e[r],t)})),t.pop() +break +default:n=e}return n}var Ue=function(){function e(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{} +o(this,e),this.log=n.log||Function.prototype.bind.call(p.log,p),this.testCount=0,this.ended=!1,this.bailed=!1,t.on("error",this.onError.bind(this)),t.on("runStart",this.onRunStart.bind(this)),t.on("testEnd",this.onTestEnd.bind(this)),t.on("runEnd",this.onRunEnd.bind(this))}return a(e,[{key:"onRunStart",value:function(e){this.log("TAP version 13")}},{key:"onError",value:function(e){this.bailed||(this.bailed=!0,this.ended||(this.testCount=this.testCount+1,this.log(Ie.red("not ok ".concat(this.testCount," global failure"))),this.logError(e)),this.log("Bail out! "+R(e).split("\n")[0]),this.ended&&this.logError(e))}},{key:"onTestEnd",value:function(e){var t=this +this.testCount=this.testCount+1,"passed"===e.status?this.log("ok ".concat(this.testCount," ").concat(e.fullName.join(" > "))):"skipped"===e.status?this.log(Ie.yellow("ok ".concat(this.testCount," # SKIP ").concat(e.fullName.join(" > ")))):"todo"===e.status?(this.log(Ie.cyan("not ok ".concat(this.testCount," # TODO ").concat(e.fullName.join(" > ")))),e.errors.forEach((function(e){return t.logAssertion(e,"todo")}))):(this.log(Ie.red("not ok ".concat(this.testCount," ").concat(e.fullName.join(" > ")))),e.errors.forEach((function(e){return t.logAssertion(e)})))}},{key:"onRunEnd",value:function(e){this.ended=!0,this.log("1..".concat(e.testCounts.total)),this.log("# pass ".concat(e.testCounts.passed)),this.log(Ie.yellow("# skip ".concat(e.testCounts.skipped))),this.log(Ie.cyan("# todo ".concat(e.testCounts.todo))),this.log(Ie.red("# fail ".concat(e.testCounts.failed)))}},{key:"logAssertion",value:function(e,t){var n=" ---" +n+="\n message: ".concat(Le(e.message||"failed")),n+="\n severity: ".concat(Le(t||"failed")),De.call(e,"actual")&&(n+="\n actual : ".concat(Le(e.actual))),De.call(e,"expected")&&(n+="\n expected: ".concat(Le(e.expected))),e.stack&&(n+="\n stack: ".concat(Le(e.stack+"\n"))),n+="\n ...",this.log(n)}},{key:"logError",value:function(e){var t=" ---" +t+="\n message: ".concat(Le(R(e))),t+="\n severity: ".concat(Le("failed")),e&&e.stack&&(t+="\n stack: ".concat(Le(e.stack+"\n"))),t+="\n ...",this.log(t)}}],[{key:"init",value:function(t,n){return new e(t,n)}}]),e}(),He={console:qe,tap:Ue} +function ze(e){return function(t){F.globalHooks[e]||(F.globalHooks[e]=[]),F.globalHooks[e].push(t)}}var $e={beforeEach:ze("beforeEach"),afterEach:ze("afterEach")} +function Qe(e){F.current?F.current.assert.pushResult({result:!1,message:"global failure: ".concat(R(e)),source:e&&e.stack||J(2)}):(U.globalFailureCount++,F.stats.bad++,F.stats.all++,ne("error",e))}var Ge={} +F.currentModule.suiteReport=U +var We=!1,Ye=!1 +function Ve(){Ye=!0,g?g((function(){Xe()})):Xe()}function Je(){F.blocking=!1,he.advance()}function Xe(){if(F.started)Je() +else{F.started=S.now(),""===F.modules[0].name&&0===F.modules[0].tests.length&&F.modules.shift() +for(var e=[],t=0;t1)throw new Error("Called start() outside of a test context too many times") +if(F.autostart)throw new Error("Called start() outside of a test context when QUnit.config.autostart was true") +if(!F.pageLoaded)return F.autostart=!0,void(m||Ge.load()) +Ve()},onUnhandledRejection:function(e){x.warn("QUnit.onUnhandledRejection is deprecated and will be removed in QUnit 3.0. Please use QUnit.onUncaughtException instead."),Qe(e)},extend:function(){x.warn("QUnit.extend is deprecated and will be removed in QUnit 3.0. Please use Object.assign instead.") +for(var e=arguments.length,t=new Array(e),n=0;n=0;--n){var r=e[n] +if(null!==r){var i=r.score +i>t&&(t=i)}}return-9007199254740991===t?null:t}function l(e,t){var n=e[t] +if(void 0!==n)return n +var r=t +Array.isArray(t)||(r=t.split(".")) +for(var i=r.length,o=-1;e&&++o>1]=e[n],i=1+(n<<1)}for(var s=n-1>>1;n>0&&r.score>1)e[n]=e[s] +e[n]=r}return n.add=function(n){var r=t +e[t++]=n +for(var i=r-1>>1;r>0&&n.score>1)e[r]=e[i] +e[r]=n},n.poll=function(){if(0!==t){var n=e[0] +return e[0]=e[--t],r(),n}},n.peek=function(n){if(0!==t)return e[0]},n.replaceTop=function(t){e[0]=t,r()},n},d=h() +return function t(i){var p={single:function(e,t,n){return"farzher"==e?{target:"farzher was here (^-^*)/",score:0,indexes:[0,1,2,3,4,5,6]}:e?(f(e)||(e=p.getPreparedSearch(e)),t?(f(t)||(t=p.getPrepared(t)),((n&&void 0!==n.allowTypo?n.allowTypo:!i||void 0===i.allowTypo||i.allowTypo)?p.algorithm:p.algorithmNoTypo)(e,t,e[0])):null):null},go:function(e,t,n){if("farzher"==e)return[{target:"farzher was here (^-^*)/",score:0,indexes:[0,1,2,3,4,5,6],obj:t?t[0]:null}] +if(!e)return o +var r=(e=p.prepareSearch(e))[0],s=n&&n.threshold||i&&i.threshold||-9007199254740991,a=n&&n.limit||i&&i.limit||9007199254740991,u=(n&&void 0!==n.allowTypo?n.allowTypo:!i||void 0===i.allowTypo||i.allowTypo)?p.algorithm:p.algorithmNoTypo,h=0,g=0,v=t.length +if(n&&n.keys)for(var m=n.scoreFn||c,y=n.keys,b=y.length,w=v-1;w>=0;--w){for(var x=t[w],k=new Array(b),E=b-1;E>=0;--E)(C=l(x,S=y[E]))?(f(C)||(C=p.getPrepared(C)),k[E]=u(e,C,r)):k[E]=null +k.obj=x +var _=m(k) +null!==_&&(_d.peek().score&&d.replaceTop(k))))}else if(n&&n.key){var S=n.key +for(w=v-1;w>=0;--w)(C=l(x=t[w],S))&&(f(C)||(C=p.getPrepared(C)),null!==(T=u(e,C,r))&&(T.scored.peek().score&&d.replaceTop(T)))))}else for(w=v-1;w>=0;--w){var C,T;(C=t[w])&&(f(C)||(C=p.getPrepared(C)),null!==(T=u(e,C,r))&&(T.scored.peek().score&&d.replaceTop(T)))))}if(0===h)return o +var j=new Array(h) +for(w=h-1;w>=0;--w)j[w]=d.poll() +return j.total=h+g,j},goAsync:function(t,n,r){var s=!1,a=new Promise((function(a,u){if("farzher"==t)return a([{target:"farzher was here (^-^*)/",score:0,indexes:[0,1,2,3,4,5,6],obj:n?n[0]:null}]) +if(!t)return a(o) +var d=(t=p.prepareSearch(t))[0],g=h(),v=n.length-1,m=r&&r.threshold||i&&i.threshold||-9007199254740991,y=r&&r.limit||i&&i.limit||9007199254740991,b=(r&&void 0!==r.allowTypo?r.allowTypo:!i||void 0===i.allowTypo||i.allowTypo)?p.algorithm:p.algorithmNoTypo,w=0,x=0 +function k(){if(s)return u("canceled") +var i=Date.now() +if(r&&r.keys)for(var h=r.scoreFn||c,E=r.keys,_=E.length;v>=0;--v){if(v%1e3==0&&Date.now()-i>=10)return void(e?setImmediate(k):setTimeout(k)) +for(var S=n[v],C=new Array(_),T=_-1;T>=0;--T)(M=l(S,N=E[T]))?(f(M)||(M=p.getPrepared(M)),C[T]=b(t,M,d)):C[T]=null +C.obj=S +var j=h(C) +null!==j&&(jg.peek().score&&g.replaceTop(C))))}else if(r&&r.key)for(var N=r.key;v>=0;--v){if(v%1e3==0&&Date.now()-i>=10)return void(e?setImmediate(k):setTimeout(k));(M=l(S=n[v],N))&&(f(M)||(M=p.getPrepared(M)),null!==(O=b(t,M,d))&&(O.scoreg.peek().score&&g.replaceTop(O)))))}else for(;v>=0;--v){if(v%1e3==0&&Date.now()-i>=10)return void(e?setImmediate(k):setTimeout(k)) +var M,O;(M=n[v])&&(f(M)||(M=p.getPrepared(M)),null!==(O=b(t,M,d))&&(O.scoreg.peek().score&&g.replaceTop(O)))))}if(0===w)return a(o) +for(var q=new Array(w),A=w-1;A>=0;--A)q[A]=g.poll() +q.total=w+x,a(q)}e?setImmediate(k):k()})) +return a.cancel=function(){s=!0},a},highlight:function(e,t,n){if("function"==typeof t)return p.highlightCallback(e,t) +if(null===e)return null +void 0===t&&(t=""),void 0===n&&(n="") +for(var r="",i=0,o=!1,s=e.target,a=s.length,u=e.indexes,c=0;c999)return p.prepare(e) +var t=n.get(e) +return void 0!==t||(t=p.prepare(e),n.set(e,t)),t},getPreparedSearch:function(e){if(e.length>999)return p.prepareSearch(e) +var t=r.get(e) +return void 0!==t||(t=p.prepareSearch(e),r.set(e,t)),t},algorithm:function(e,t,n){for(var r=t._targetLowerCodes,i=e.length,o=r.length,u=0,c=0,l=0,f=0;;){if(n===r[c]){if(s[f++]=c,++u===i)break +n=e[0===l?u:l===u?u+1:l===u-1?u-1:u]}if(++c>=o)for(;;){if(u<=1)return null +if(0===l){if(n===e[--u])continue +l=u}else{if(1===l)return null +if((n=e[1+(u=--l)])===e[u])continue}c=s[(f=u)-1]+1 +break}}u=0 +var h=0,d=!1,g=0,v=t._nextBeginningIndexes +null===v&&(v=t._nextBeginningIndexes=p.prepareNextBeginningIndexes(t.target)) +var m=c=0===s[0]?0:v[s[0]-1] +if(c!==o)for(;;)if(c>=o){if(u<=0){if(++h>i-2)break +if(e[h]===e[h+1])continue +c=m +continue}--u,c=v[a[--g]]}else if(e[0===h?u:h===u?u+1:h===u-1?u-1:u]===r[c]){if(a[g++]=c,++u===i){d=!0 +break}++c}else c=v[c] +if(d)var y=a,b=g +else y=s,b=f +for(var w=0,x=-1,k=0;k=0;--k)t.indexes[k]=y[k] +return t},algorithmNoTypo:function(e,t,n){for(var r=t._targetLowerCodes,i=e.length,o=r.length,u=0,c=0,l=0;;){if(n===r[c]){if(s[l++]=c,++u===i)break +n=e[u]}if(++c>=o)return null}u=0 +var f=!1,h=0,d=t._nextBeginningIndexes +if(null===d&&(d=t._nextBeginningIndexes=p.prepareNextBeginningIndexes(t.target)),(c=0===s[0]?0:d[s[0]-1])!==o)for(;;)if(c>=o){if(u<=0)break;--u,c=d[a[--h]]}else if(e[u]===r[c]){if(a[h++]=c,++u===i){f=!0 +break}++c}else c=d[c] +if(f)var g=a,v=h +else g=s,v=l +for(var m=0,y=-1,b=0;b=0;--b)t.indexes[b]=g[b] +return t},prepareLowerCodes:function(e){for(var t=e.length,n=[],r=e.toLowerCase(),i=0;i=65&&a<=90,c=u||a>=97&&a<=122||a>=48&&a<=57,l=u&&!i||!o||!c +i=u,o=c,l&&(n[r++]=s)}return n},prepareNextBeginningIndexes:function(e){for(var t=e.length,n=p.prepareBeginningIndexes(e),r=[],i=n[0],o=0,s=0;ss?r[s]=i:(i=n[++o],r[s]=void 0===i?t:i) +return r},cleanup:u,new:t} +return p}()},e.exports?e.exports=n():t.fuzzysort=n()}(Ze) +var Ke=Ze.exports,et={failedTests:[],defined:0,completed:0} +function tt(e){return e?(""+e).replace(/['"<>&]/g,(function(e){switch(e){case"'":return"'" +case'"':return""" +case"<":return"<" +case">":return">" +case"&":return"&"}})):""}!function(){if(d&&m){var e=Ge.config,t=[],n=!1,r=Object.prototype.hasOwnProperty,i=j({filter:void 0,module:void 0,moduleId:void 0,testId:void 0}),o=null +Ge.on("runStart",(function(e){et.defined=e.testCounts.total})),Ge.begin((function(t){!function(t){var n,s,a,u,l,f,p,b,E=_("qunit") +E&&(E.setAttribute("role","main"),E.innerHTML="

    "+tt(m.title)+"

    "+(!(n=Ge.config.testId)||n.length<=0?"":"
    Rerunning selected tests: "+tt(n.join(", "))+" Run all tests
    ")+"

      "),(s=_("qunit-header"))&&(s.innerHTML=""+s.innerHTML+" "),(a=_("qunit-banner"))&&(a.className=""),p=_("qunit-tests"),(b=_("qunit-testresult"))&&b.parentNode.removeChild(b),p&&(p.innerHTML="",(b=m.createElement("p")).id="qunit-testresult",b.className="result",p.parentNode.insertBefore(b,p),b.innerHTML='
      Running...
       
      ',l=_("qunit-testresult-controls")),l&&l.appendChild(((f=m.createElement("button")).id="qunit-abort-tests-button",f.innerHTML="Abort",h(f,"click",S),f)),(u=_("qunit-userAgent"))&&(u.innerHTML="",u.appendChild(m.createTextNode("QUnit "+Ge.version+"; "+y.userAgent))),function(t){var n,i,s,a,u,l=_("qunit-testrunner-toolbar") +if(l){l.appendChild(((u=m.createElement("span")).innerHTML=function(){for(var t=!1,n=e.urlConfig,i="",o=0;o"+s.label+": "}else i+=""}return i}(),x(u,"qunit-url-config"),v(u.getElementsByTagName("input"),"change",T),v(u.getElementsByTagName("select"),"change",T),u)) +var f=m.createElement("span") +f.id="qunit-toolbar-filters",f.appendChild((n=m.createElement("form"),i=m.createElement("label"),s=m.createElement("input"),a=m.createElement("button"),x(n,"qunit-filter"),i.innerHTML="Filter: ",s.type="text",s.value=e.filter||"",s.name="filter",s.id="qunit-filter-input",a.innerHTML="Go",i.appendChild(s),n.appendChild(i),n.appendChild(m.createTextNode(" ")),n.appendChild(a),h(n,"submit",C),n)),f.appendChild(function(t){var n=null +if(o={options:t.modules.slice(),selectedMap:new w,isDirty:function(){return c(o.selectedMap.keys()).sort().join(",")!==c(n.keys()).sort().join(",")}},e.moduleId.length)for(var r=0;r","",u," assertions of ",e.stats.all," passed, ",e.stats.bad," failed.",A(et.failedTests)].join("") +if(a&&a.disabled){c="Tests aborted after "+t.runtime+" milliseconds." +for(var l=0;l":"Running: ",I(e.name,e.module),A(et.failedTests)].join(""))})),Ge.log((function(e){var t=_("qunit-test-output-"+e.testId) +if(t){var n,i,o,s=tt(e.message)||(e.result?"okay":"failed") +s=""+s+"",s+="@ "+e.runtime+" ms" +var a=!1 +!e.result&&r.call(e,"expected")?(n=e.negative?"NOT "+Ge.dump.parse(e.expected):Ge.dump.parse(e.expected),i=Ge.dump.parse(e.actual),s+="",i!==n?(s+="","number"==typeof e.actual&&"number"==typeof e.expected?isNaN(e.actual)||isNaN(e.expected)||(a=!0,o=((o=e.actual-e.expected)>0?"+":"")+o):"boolean"!=typeof e.actual&&"boolean"!=typeof e.expected&&(a=P(o=Ge.diff(n,i)).length!==P(n).length+P(i).length),a&&(s+="")):-1!==n.indexOf("[object Array]")||-1!==n.indexOf("[object Object]")?s+="":s+="",e.source&&(s+=""),s+="
      Expected:
      "+tt(n)+"
      Result:
      "+tt(i)+"
      Diff:
      "+o+"
      Message: Diff suppressed as the depth of object is more than current max depth ("+Ge.config.maxDepth+").

      Hint: Use QUnit.dump.maxDepth to run with a higher max depth or Rerun without max depth.

      Message: Diff suppressed as the expected and actual results have an equivalent serialization
      Source:
      "+tt(e.source)+"
      "):!e.result&&e.source&&(s+="
      Source:
      "+tt(e.source)+"
      ") +var u=t.getElementsByTagName("ol")[0],c=m.createElement("li") +c.className=e.result?"pass":"fail",c.innerHTML=s,u.appendChild(c)}})),Ge.testDone((function(r){var i=_("qunit-tests"),o=_("qunit-test-output-"+r.testId) +if(i&&o){var s +E(o,"running"),s=r.failed>0?"failed":r.todo?"todo":r.skipped?"skipped":"passed" +var a=o.getElementsByTagName("ol")[0],u=r.passed,c=r.failed,l=r.failed>0?r.todo:!r.todo +l?x(a,"qunit-collapsed"):(et.failedTests.push(r.testId),e.collapse&&(n?x(a,"qunit-collapsed"):n=!0)) +var f=o.firstChild,d=c?""+c+", "+u+", ":"" +if(f.innerHTML+=" ("+d+r.assertions.length+")",et.completed++,r.skipped){o.className="skipped" +var p=m.createElement("em") +p.className="qunit-skipped-label",p.innerHTML="skipped",o.insertBefore(p,f)}else{if(h(f,"click",(function(){k(a,"qunit-collapsed")})),o.className=l?"pass":"fail",r.todo){var g=m.createElement("em") +g.className="qunit-todo-label",g.innerHTML="todo",o.className+=" todo",o.insertBefore(g,f)}var v=m.createElement("span") +v.className="runtime",v.innerHTML=r.runtime+" ms",o.insertBefore(v,a)}if(r.source){var y=m.createElement("p") +y.innerHTML="Source: "+tt(r.source),x(y,"qunit-source"),l&&x(y,"qunit-collapsed"),h(f,"click",(function(){k(y,"qunit-collapsed")})),o.appendChild(y)}e.hidepassed&&("passed"===s||r.skipped)&&(t.push(o),i.removeChild(o))}})),Ge.on("error",(function(e){var t=q("global failure") +if(t){var n=tt(R(e)) +n=""+n+"",e&&e.stack&&(n+="
      Source:
      "+tt(e.stack)+"
      ") +var r=t.getElementsByTagName("ol")[0],i=m.createElement("li") +i.className="fail",i.innerHTML=n,r.appendChild(i),t.className="fail"}})) +var s,a=(s=d.phantom)&&s.version&&s.version.major>0 +a&&p.warn("Support for PhantomJS is deprecated and will be removed in QUnit 3.0."),a||"complete"!==m.readyState?h(d,"load",Ge.load):Ge.load() +var u=d.onerror +d.onerror=function(t,n,r,i,o){var s=!1 +if(u){for(var a=arguments.length,c=new Array(a>5?a-5:0),l=5;l=0}function x(e,t){b(e,t)||(e.className+=(e.className?" ":"")+t)}function k(e,t,n){n||void 0===n&&!b(e,t)?x(e,t):E(e,t)}function E(e,t){for(var n=" "+e.className+" ";n.indexOf(" "+t+" ")>=0;)n=n.replace(" "+t+" "," ") +e.className=f(n)}function _(e){return m.getElementById&&m.getElementById(e)}function S(){var e=_("qunit-abort-tests-button") +return e&&(e.disabled=!0,e.innerHTML="Aborting..."),Ge.config.queue.length=0,!1}function C(e){var t=_("qunit-filter-input") +return t.value=f(t.value),N(),e&&e.preventDefault&&e.preventDefault(),!1}function T(){var n,r=this,i={} +n="selectedIndex"in r?r.options[r.selectedIndex].value||void 0:r.checked?r.defaultValue||!0:void 0,i[r.name]=n +var o=j(i) +if("hidepassed"===r.name&&"replaceState"in d.history){Ge.urlParams[r.name]=n,e[r.name]=n||!1 +var s=_("qunit-tests") +if(s){var a=s.children.length,u=s.children +if(r.checked){for(var c=0;c-1,g=h.indexOf("skipped")>-1;(p||g)&&t.push(f)}var v,m=function(e,t){var n="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"] +if(!n){if(Array.isArray(e)||(n=l(e))){n&&(e=n) +var r=0,i=function(){} +return{s:i,n:function(){return r>=e.length?{done:!0}:{done:!1,value:e[r++]}},e:function(e){throw e},f:i}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,s=!0,a=!1 +return{s:function(){n=n.call(e)},n:function(){var e=n.next() +return s=e.done,e},e:function(e){a=!0,o=e},f:function(){try{s||null==n.return||n.return()}finally{if(a)throw o}}}}(t) +try{for(m.s();!(v=m.n()).done;){var y=v.value +s.removeChild(y)}}catch(e){m.e(e)}finally{m.f()}}else for(var b;null!=(b=t.pop());)s.appendChild(b)}d.history.replaceState(null,"",o)}else d.location=o}function j(e){var t="?",n=d.location +for(var i in e=M(M({},Ge.urlParams),e))if(r.call(e,i)&&void 0!==e[i])for(var o=[].concat(e[i]),s=0;s"}function q(e,t,n){var r=_("qunit-tests") +if(r){var i=m.createElement("strong") +i.innerHTML=I(e,n) +var o=m.createElement("li") +if(o.appendChild(i),void 0!==t){var s=m.createElement("a") +s.innerHTML="Rerun",s.href=j({testId:t}),o.id="qunit-test-output-"+t,o.appendChild(s)}var a=m.createElement("ol") +return a.className="qunit-assert-list",o.appendChild(a),r.appendChild(o),o}}function A(e){return 0===e.length?"":["
      ",1===e.length?"Rerun 1 failed test":"Rerun "+e.length+" failed tests",""].join("")}function I(e,t){var n="" +return t&&(n=""+tt(t)+": "),n+""+tt(e)+""}function F(e){return[e.completed," / ",e.defined," tests completed.
      "].join("")}function P(e){return e.replace(/<\/?[^>]+(>|$)/g,"").replace(/"/g,"").replace(/\s+/g,"")}}(),Ge.diff=function(){function e(){}var t=-1,n=Object.prototype.hasOwnProperty +return e.prototype.DiffMain=function(e,t,n){var r,i,o,s,a,u +if(r=(new Date).getTime()+1e3,null===e||null===t)throw new Error("Null input. (DiffMain)") +return e===t?e?[[0,e]]:[]:(void 0===n&&(n=!0),i=n,o=this.diffCommonPrefix(e,t),s=e.substring(0,o),e=e.substring(o),t=t.substring(o),o=this.diffCommonSuffix(e,t),a=e.substring(e.length-o),e=e.substring(0,e.length-o),t=t.substring(0,t.length-o),u=this.diffCompute(e,t,i,r),s&&u.unshift([0,s]),a&&u.push([0,a]),this.diffCleanupMerge(u),u)},e.prototype.diffCleanupEfficiency=function(e){var n,r,i,o,s,a,u,c,l +for(n=!1,r=[],i=0,o=null,s=0,a=!1,u=!1,c=!1,l=!1;s0?r[i-1]:-1,c=l=!1),n=!0)),s++ +n&&this.diffCleanupMerge(e)},e.prototype.diffPrettyHtml=function(e){for(var n=[],r=0;r" +break +case t:n[r]=""+tt(o)+"" +break +case 0:n[r]=""+tt(o)+""}}return n.join("")},e.prototype.diffCommonPrefix=function(e,t){var n,r,i,o +if(!e||!t||e.charAt(0)!==t.charAt(0))return 0 +for(i=0,n=r=Math.min(e.length,t.length),o=0;in.length?e:n,a=e.length>n.length?n:e,-1!==(u=s.indexOf(a))?(o=[[1,s.substring(0,u)],[0,a],[1,s.substring(u+a.length)]],e.length>n.length&&(o[0][0]=o[2][0]=t),o):1===a.length?[[t,e],[1,n]]:(c=this.diffHalfMatch(e,n))?(l=c[0],h=c[1],f=c[2],d=c[3],p=c[4],g=this.DiffMain(l,f,r,i),v=this.DiffMain(h,d,r,i),g.concat([[0,p]],v)):r&&e.length>100&&n.length>100?this.diffLineMode(e,n,i):this.diffBisect(e,n,i)):[[t,e]]:[[1,n]]},e.prototype.diffHalfMatch=function(e,t){var n,r,i,o,s,a,u,c,l,f +if(n=e.length>t.length?e:t,r=e.length>t.length?t:e,n.length<4||2*r.length=e.length?[c,l,f,h,s]:null}return i=this,c=h(n,r,Math.ceil(n.length/4)),l=h(n,r,Math.ceil(n.length/2)),c||l?(f=l?c&&c[4].length>l[4].length?c:l:c,e.length>t.length?(o=f[0],u=f[1],a=f[2],s=f[3]):(a=f[0],s=f[1],o=f[2],u=f[3]),[o,u,a,s,f[4]]):null},e.prototype.diffLineMode=function(e,n,r){var i,o,s,a,u,c,l,f,h +for(e=(i=this.diffLinesToChars(e,n)).chars1,n=i.chars2,s=i.lineArray,o=this.DiffMain(e,n,!1,r),this.diffCharsToLines(o,s),this.diffCleanupSemantic(o),o.push([0,""]),a=0,c=0,u=0,f="",l="";a=1&&u>=1){for(o.splice(a-c-u,c+u),a=a-c-u,h=(i=this.DiffMain(f,l,!1,r)).length-1;h>=0;h--)o.splice(a,0,i[h]) +a+=i.length}u=0,c=0,f="",l=""}a++}return o.pop(),o},e.prototype.diffBisect=function(e,n,r){var i,o,s,a,u,c,l,f,h,d,p,g,v,m,y,b,w,x,k,E,_,S,C +for(i=e.length,o=n.length,a=s=Math.ceil((i+o)/2),u=2*s,c=new Array(u),l=new Array(u),f=0;fr);_++){for(S=-_+p;S<=_-g;S+=2){for(b=a+S,k=(w=S===-_||S!==_&&c[b-1]i)g+=2 +else if(k>o)p+=2 +else if(d&&(y=a+h-S)>=0&&y=(x=i-l[y]))return this.diffBisectSplit(e,n,w,k,r)}for(C=-_+v;C<=_-m;C+=2){for(y=a+C,E=(x=C===-_||C!==_&&l[y-1]i)m+=2 +else if(E>o)v+=2 +else if(!d&&(b=a+h-C)>=0&&b=(x=i-x)))return this.diffBisectSplit(e,n,w,k,r)}}return[[t,e],[1,n]]},e.prototype.diffBisectSplit=function(e,t,n,r,i){var o,s,a,u,c,l +return o=e.substring(0,n),a=t.substring(0,r),s=e.substring(n),u=t.substring(r),c=this.DiffMain(o,a,!1,i),l=this.DiffMain(s,u,!1,i),c.concat(l)},e.prototype.diffCleanupSemantic=function(e){var n,r,i,o,s,a,u,c,l,f,h,d,p +for(n=!1,r=[],i=0,o=null,s=0,c=0,l=0,a=0,u=0;s0?r[i-1]:-1,c=0,l=0,a=0,u=0,o=null,n=!0)),s++ +for(n&&this.diffCleanupMerge(e),s=1;s=(p=this.diffCommonOverlap(h,f))?(d>=f.length/2||d>=h.length/2)&&(e.splice(s,0,[0,h.substring(0,d)]),e[s-1][1]=f.substring(0,f.length-d),e[s+1][1]=h.substring(d),s++):(p>=f.length/2||p>=h.length/2)&&(e.splice(s,0,[0,f.substring(0,p)]),e[s-1][0]=1,e[s-1][1]=h.substring(0,h.length-p),e[s+1][0]=t,e[s+1][1]=f.substring(p),s++),s++),s++},e.prototype.diffCommonOverlap=function(e,t){var n,r,i,o,s,a,u +if(n=e.length,r=t.length,0===n||0===r)return 0 +if(n>r?e=e.substring(n-r):n1?(0!==r&&0!==i&&(0!==(a=this.diffCommonPrefix(o,s))&&(n-r-i>0&&0===e[n-r-i-1][0]?e[n-r-i-1][1]+=o.substring(0,a):(e.splice(0,0,[0,o.substring(0,a)]),n++),o=o.substring(a),s=s.substring(a)),0!==(a=this.diffCommonSuffix(o,s))&&(e[n][1]=o.substring(o.length-a)+e[n][1],o=o.substring(0,o.length-a),s=s.substring(0,s.length-a))),0===r?e.splice(n-i,r+i,[1,o]):0===i?e.splice(n-r,r+i,[t,s]):e.splice(n-r-i,r+i,[t,s],[1,o]),n=n-r-i+(r?1:0)+(i?1:0)+1):0!==n&&0===e[n-1][0]?(e[n-1][1]+=e[n][1],e.splice(n,1)):n++,i=0,r=0,s="",o=""}for(""===e[e.length-1][1]&&e.pop(),u=!1,n=1;n{var t=Array.isArray +e.exports=function(){if(!arguments.length)return[] +var e=arguments[0] +return t(e)?e:[e]}},66:e=>{e.exports=function(e){var t=e?e.length:0 +return t?e[t-1]:void 0}},9254:(e,t,n)=>{var r="__lodash_hash_undefined__",i=9007199254740991,o=/^\[object .+?Constructor\]$/,s=/^(?:0|[1-9]\d*)$/,a="object"==typeof n.g&&n.g&&n.g.Object===Object&&n.g,u="object"==typeof self&&self&&self.Object===Object&&self,c=a||u||Function("return this")() +function l(e,t,n){switch(n.length){case 0:return e.call(t) +case 1:return e.call(t,n[0]) +case 2:return e.call(t,n[0],n[1]) +case 3:return e.call(t,n[0],n[1],n[2])}return e.apply(t,n)}function f(e,t){return!(!e||!e.length)&&function(e,t,n){if(t!=t)return function(e,t,n,r){for(var i=e.length,o=-1;++o-1}function h(e,t){for(var n=-1,r=t.length,i=e.length;++n0&&n(a)?t>1?B(a,t-1,n,r,i):h(i,a):r||(i[i.length]=a)}return i}function U(e,t){var n,r,i=e.__data__ +return("string"==(r=typeof(n=t))||"number"==r||"symbol"==r||"boolean"==r?"__proto__"!==n:null===n)?i["string"==typeof t?"string":"hash"]:i.map}function H(e,t){var n=function(e,t){return null==e?void 0:e[t]}(e,t) +return function(e){if(!Z(e)||x&&x in e)return!1 +var t=X(e)||function(e){var t=!1 +if(null!=e&&"function"!=typeof e.toString)try{t=!!(e+"")}catch(e){}return t}(e)?S:o +return t.test(function(e){if(null!=e){try{return k.call(e)}catch(e){}try{return e+""}catch(e){}}return""}(e))}(n)?n:void 0}I.prototype.clear=function(){this.__data__=R?R(null):{}},I.prototype.delete=function(e){return this.has(e)&&delete this.__data__[e]},I.prototype.get=function(e){var t=this.__data__ +if(R){var n=t[e] +return n===r?void 0:n}return E.call(t,e)?t[e]:void 0},I.prototype.has=function(e){var t=this.__data__ +return R?void 0!==t[e]:E.call(t,e)},I.prototype.set=function(e,t){return this.__data__[e]=R&&void 0===t?r:t,this},F.prototype.clear=function(){this.__data__=[]},F.prototype.delete=function(e){var t=this.__data__,n=L(t,e) +return!(n<0||(n==t.length-1?t.pop():N.call(t,n,1),0))},F.prototype.get=function(e){var t=this.__data__,n=L(t,e) +return n<0?void 0:t[n][1]},F.prototype.has=function(e){return L(this.__data__,e)>-1},F.prototype.set=function(e,t){var n=this.__data__,r=L(n,e) +return r<0?n.push([e,t]):n[r][1]=t,this},P.prototype.clear=function(){this.__data__={hash:new I,map:new(A||F),string:new I}},P.prototype.delete=function(e){return U(this,e).delete(e)},P.prototype.get=function(e){return U(this,e).get(e)},P.prototype.has=function(e){return U(this,e).has(e)},P.prototype.set=function(e,t){return U(this,e).set(e,t),this},D.prototype.add=D.prototype.push=function(e){return this.__data__.set(e,r),this},D.prototype.has=function(e){return this.__data__.has(e)} +var z=O?g(O,Object):ie,$=O?function(e){for(var t=[];e;)h(t,z(e)),e=T(e) +return t}:ie +function Q(e){return V(e)||Y(e)||!!(M&&e&&e[M])}function G(e,t){return!!(t=null==t?i:t)&&("number"==typeof e||s.test(e))&&e>-1&&e%1==0&&e-1&&e%1==0&&e<=i}(e.length)&&!X(e)}function X(e){var t=Z(e)?_.call(e):"" +return"[object Function]"==t||"[object GeneratorFunction]"==t}function Z(e){var t=typeof e +return!!e&&("object"==t||"function"==t)}function K(e){return!!e&&"object"==typeof e}function ee(e){return J(e)?function(e,t){var n=V(e)||Y(e)?function(e,t){for(var n=-1,r=Array(e);++n=200&&(o=p,s=!1,t=new D(t)) +e:for(;++i{"use strict" +var r=n(526) +e.exports=function(e){function t(e){var t=e?[].concat(e):[] +return t.in_array=r.curry(t,n,t),t.each=r.curry(t,o,t),t.each_async=r.curry(t,s,t),t.collect=r.curry(t,a,t),t.collect_async=r.curry(t,u,t),t.flatten=r.curry(t,i,t),t.inject=r.curry(t,c,t),t.push_all=r.curry(t,l,t),t.fill=r.curry(t,f,t),t.find_all=r.curry(t,h,t),t.find=r.curry(t,d,t),t.last=r.curry(t,p,t),t.naked=r.curry(t,g,t),t}function n(e,t){for(var n=0;n=e.length?n(null,r):void o()}))} +o()}function a(e,n){for(var r=t(),i=0;i{"use strict" +var r=n(4633),i=n(5901),o=n(6882),s=n(3143) +e.exports=function(e,t,n){var a=[] +function u(){return 0===a.length}function c(){return a.length>1&&a[0].score.equals(a[1].score)}function l(){return a.find_all(h).collect(d).join(", ")}function f(e,t){return t.score.compare(e.score)}function h(e){return e.score.equals(a[0].score)}function d(e){return e.macro.toString()}this.validate=function(){return u()?{step:e,valid:!1,reason:"Undefined Step"}:c()?{step:e,valid:!1,reason:"Ambiguous Step (Patterns ["+l()+"] are all equally good candidates)"}:{step:e,valid:!0,winner:this.winner()}},this.clear_winner=function(){if(u())throw new Error("Undefined Step: ["+e+"]") +if(c())throw new Error("Ambiguous Step: ["+e+"]. Patterns ["+l()+"] match equally well.") +return this.winner()},this.winner=function(){return a[0].macro},function(e,t){a=t.collect((function(t){return{macro:t,score:new o([new r(e,t.levenshtein_signature()),new i(t,n)])}})).sort(f)}(e,s(t))}},9174:e=>{"use strict" +var t=function(e){this.pTFUHht733hM6wfnruGLgAu6Uqvy7MVp=!0,this.properties={},this.merge=function(e){return e&&e.pTFUHht733hM6wfnruGLgAu6Uqvy7MVp?this.merge(e.properties):new t(this.properties)._merge(e)},this._merge=function(e){for(var t in e)this.properties[t]=e[t] +return this},this._merge(e)} +e.exports=t},3591:(e,t,n)=>{"use strict" +var r=n(3143),i=n(6690),o=n(9076),s=function(e){e=e||"$" +var t={},n=new i(new RegExp("(?:^|[^\\\\])\\"+e+"(\\w+)","g")),a=new RegExp("(\\"+e+"\\w+)"),u=this +function c(t,n){return l(t).each((function(r){if(n.in_array(r))throw new Error("Circular Definition: ["+n.join(", ")+"]") +var i=f(r,n) +return t=t.replace(e+r,i)}))}function l(e){return n.groups(e)}function f(e,n){var r=t[e]?t[e].pattern:"(.+)" +return p(r)?u.expand(r,n.concat(e)).pattern:r}function h(e){return e.toString().replace(/^\/|\/$/g,"")}function d(e){return!!t[e]}function p(e){return n.test(e)}function g(e){return r(e.split(a)).inject(r(),(function(e,n){return e.push_all(p(n)?function(e){return l(e).inject(r(),(function(e,n){return d(n)?e.push_all(t[n].converters):e.push_all(g(f(n,[])))}))}(n):v(n))}))}function v(e){return r().fill(o,m(e))}function m(e){return new RegExp(e+"|").exec("").length-1}this.define=function(e,n,i){if(d(e))throw new Error("Duplicate term: ["+e+"]") +if(i&&p(n))throw new Error("Expandable terms cannot use converters: ["+e+"]") +if(i&&!function(e,t){return function(e){return r(e).inject(0,(function(e,t){return e+t.length-1}))}(e)===m(t)}(i,n))throw new Error("Wrong number of converters for: ["+e+"]") +return p(n)||i||(i=v(n)),t[e]={pattern:h(n),converters:r(i)},this},this.merge=function(t){if(t._prefix()!==this._prefix())throw new Error("Cannot merge dictionaries with different prefixes") +return new s(e)._merge(this)._merge(t)},this._merge=function(e){return e.each((function(e,t){u.define(e,t.pattern)})),this},this._prefix=function(){return e},this.each=function(e){for(var n in t)e(n,t[n])},this.expand=function(e,t){var n=h(e) +return p(n)?{pattern:c(n,r(t)),converters:g(n)}:{pattern:n,converters:g(n)}}} +e.exports=s},7453:(e,t,n)=>{"use strict" +var r=n(3143),i=n(526),o=new function(){var e=r() +this.send=function(e,n,r){return 1===arguments.length?this.send(e,{}):2===arguments.length&&i.is_function(n)?this.send(e,{},n):(t(e,n),r&&r(),this)},this.on=function(t,n){return e.push({pattern:t,callback:n}),this} +var t=function(e,t){n(e).each((function(n){n({name:e,data:t})}))},n=function(t){return e.find_all((function(e){return new RegExp(e.pattern).test(t)})).collect((function(e){return e.callback}))}} +e.exports={instance:function(){return o},ON_SCENARIO:"__ON_SCENARIO__",ON_STEP:"__ON_STEP__",ON_EXECUTE:"__ON_EXECUTE__",ON_DEFINE:"__ON_DEFINE__"}},8392:(e,t,n)=>{"use strict" +var r=n(3527),i=function(e){this.constructor(e,/.*\.(?:feature|spec|specification)$/)} +i.prototype=new r,e.exports=i},3527:(e,t,n)=>{"use strict" +var r=n(9782),i=r.path,o=r.fs,s=n(3143) +e.exports=function(e,t){t=t||/.*/,this.each=function(e){this.list().forEach(e)},this.list=function(){return s(e).inject(s(),(function(e,t){return e.concat(n(t).find_all(f))}))} +var n=function(e){return s(r(e).concat(a(e)))},r=function(e){return u(e).find_all(c)},a=function(e){return u(e).find_all(l).inject(s(),(function(e,t){return e.concat(n(t))}))},u=function(e){return o.existsSync(e)?s(o.readdirSync(e)).collect((function(t){return i.join(e,t)})):s()},c=function(e){return!l(e)},l=function(e){return o.statSync(e).isDirectory()},f=function(e){return s(t).find((function(t){return new RegExp(t).test(e)}))}}},4404:(e,t,n)=>{"use strict" +var r=n(8071),i=n(9174),o=n(7453),s=n(3143),a=n(526) +e.exports=function(e){e=s(e) +var t,n=o.instance(),u=this +function c(e){return!e.valid}function l(e){return e.step+(e.valid?"":" <-- "+e.reason)}this.requires=function(t){return e.push_all(t),this},this.validate=function(e){var n=s(e).collect((function(e){var n=u.rank_macros(e).validate() +return t=n.winner,n})) +if(n.find(c))throw new Error("Scenario cannot be interpreted\n"+n.collect(l).join("\n"))},this.interpret=function(e,t,r){t=(new i).merge(t),n.send(o.ON_SCENARIO,{scenario:e,ctx:t.properties}) +var a=f(t,r) +s(e).each_async(a,r)} +var f=function(e,t){var n=function(t,n,r){u.interpret_step(t,e,r)} +return t?n:a.asynchronize(null,n)} +this.interpret_step=function(e,r,s){var a=(new i).merge(r) +n.send(o.ON_STEP,{step:e,ctx:a.properties}) +var u=this.rank_macros(e).clear_winner() +t=u,u.interpret(e,a||{},s)},this.rank_macros=function(e){return new r(e,h(e),t)} +var h=function(t){return e.inject([],(function(e,n){return e.concat(n.find_compatible_macros(t))}))}}},6877:(e,t,n)=>{"use strict" +var r=n(386),i=n(3591),o=n(3143) +e.exports=function(e){e=e||new i +var t=o(),n=this +this.define=function(e,t,n,r){return o(e).each((function(e){s(e,t,n,r)})),this} +var s=function(i,o,s,a){if(n.get_macro(i))throw new Error("Duplicate macro: ["+i+"]") +t.push(new r(i,e.expand(i),o,s,n,a))} +this.get_macro=function(e){return t.find((function(t){return t.is_identified_by(e)}))},this.find_compatible_macros=function(e){return t.find_all((function(t){return t.can_interpret(e)}))}}},386:(e,t,n)=>{"use strict" +var r=n(526),i=n(3143),o=n(9174),s=n(6690),a=n(7453) +e.exports=function(e,t,n,u,c,l){e=p(e) +var f=new s(t.pattern),h=(n=n||r.async_noop,a.instance()) +function d(e){return l.mode?"sync"===l.mode:n!==r.async_noop&&n.length!==e.length+1}function p(e){return new RegExp(e).toString()}l=l||{},this.library=c,this.is_identified_by=function(t){return e===p(t)},this.can_interpret=function(e){return f.test(e)},this.interpret=function(e,s,c){var p=new o({step:e}).merge(u).merge(s) +!function(e,n){var r=0 +i(t.converters).collect((function(t){return function(n){t.apply(null,e.slice(r,r+=t.length-1).concat(n))}})).collect_async((function(e,t,n){e(n)}),n)}(f.groups(e),(function(t,i){if(t)return c(t) +var o +h.send(a.ON_EXECUTE,{step:e,ctx:p.properties,pattern:f.toString(),args:i}) +try{o=r.invoke(n,p.properties,d(i)?i:i.concat(c))}catch(t){if(c)return c(t) +throw t}return function(e){return l.mode?"promise"===l.mode:e&&e.then}(o)?o.then(r.noargs(c)).catch(c):d(i)?c&&c():void 0}))},this.is_sibling=function(e){return e&&e.defined_in(c)},this.defined_in=function(e){return c===e},this.levenshtein_signature=function(){return f.without_expressions()},this.toString=function(){return e},h.send(a.ON_DEFINE,{signature:e,pattern:f.toString()})}},886:(e,t,n)=>{"use strict" +e.exports=function(){function e(){return"undefined"!=typeof process&&void 0!==n.g&&!0}function t(){return"undefined"!=typeof window}function r(){return"undefined"!=typeof phantom}return{get_container:function(){return t()?window:r()?phantom:e()?n.g:void 0},is_node:e,is_browser:t,is_phantom:r,is_karma:function(){return"undefined"!=typeof window&&void 0!==window.__karma__}}}},6690:(e,t,n)=>{"use strict" +var r=n(3143) +e.exports=function(e){var t=/(^|[^\\\\])\(.*?\)/g,n=/(^|[^\\\\])\[.*?\]/g,i=/(^|[^\\\\])\{.*?\}/g,o=/(^|[^\\\\])\\./g,s=/[^\w\s]/g,a=new RegExp(e) +this.test=function(e){var t=a.test(e) +return this.reset(),t},this.groups=function(e){for(var t=r(),n=a.exec(e);n;){var i=n.slice(1,n.length) +t.push(i),n=a.global&&a.exec(e)}return this.reset(),t.flatten()},this.reset=function(){return a.lastIndex=0,this},this.without_expressions=function(){return a.source.replace(t,"$1").replace(n,"$1").replace(i,"$1").replace(o,"$1").replace(s,"")},this.equals=function(e){return this.toString()===e.toString()},this.toString=function(){return"/"+a.source+"/"}}},6007:e=>{"use strict" +e.exports={trim:function(e){return e.replace(/^\s+|\s+$/g,"")},rtrim:function(e){return e.replace(/\s+$/g,"")},isBlank:function(e){return/^\s*$/g.test(e)},isNotBlank:function(e){return!this.isBlank(e)},indentation:function(e){var t=/^(\s*)/.exec(e) +return t&&t[0].length||0}}},5682:(e,t,n)=>{"use strict" +var r=n(4404),i=n(9174),o=n(526),s=function(e,t){if(!(this instanceof s))return new s(e,t) +this.interpreter=new r(e),this.requires=function(e){return this.interpreter.requires(e),this},this.yadda=function(e,n,r){return 0===arguments.length?this:2===arguments.length&&o.is_function(n)?this.yadda(e,{},n):(this.interpreter.validate(e),void this.interpreter.interpret(e,(new i).merge(t).merge(n),r))},this.run=this.yadda,this.toString=function(){return"Yadda 2.1.0 Copyright 2010 Stephen Cresswell / Energized Work Ltd"}} +e.exports=s},7182:e=>{"use strict" +e.exports=function(e,t){var n=Date.parse(e) +return isNaN(n)?t(new Error("Cannot convert ["+e+"] to a date")):t(null,new Date(n))}},3986:e=>{"use strict" +e.exports=function(e,t){var n=parseFloat(e) +return isNaN(n)?t(new Error("Cannot convert ["+e+"] to a float")):t(null,n)}},2453:(e,t,n)=>{"use strict" +e.exports={date:n(7182),integer:n(7444),float:n(3986),list:n(3488),table:n(3337),pass_through:n(9076)}},7444:e=>{"use strict" +e.exports=function(e,t){var n=parseInt(e) +return isNaN(n)?t(new Error("Cannot convert ["+e+"] to an integer")):t(null,n)}},3488:e=>{"use strict" +e.exports=function(e,t){return t(null,e.split(/\n/))}},9076:e=>{"use strict" +e.exports=function(e,t){return t(null,e)}},3337:(e,t,n)=>{"use strict" +var r=n(3143),i=n(6007),o=/[\|\u2506]/,s=/^[\|\u2506]|[\|\u2506]$/g,a=/^[\\|\u2506]?-{3,}/ +e.exports=function(e,t){var n,u=e.split(/\n/),c=(n=u.shift(),r(n.replace(s,"").split(o)).collect((function(e){return{text:i.trim(e),indentation:i.indentation(e)}})).naked()),l=h(u[0])?function(e){if(h(e))return d() +p(e)}:function(e){if(h(e))throw new Error("Dashes are unexpected at this time") +d(),p(e)},f=r() +try{r(u).each(l),t(null,function(e){return e.collect((function(e){var t={} +for(var n in e)t[n]=e[n].join("\n") +return t})).naked()}(f))}catch(e){t(e)}function h(e){return a.test(e)}function d(){f.push({})}function p(e){var t=f.last() +r(e.replace(s,"").split(o)).each((function(e,n){var r=c[n].text,o=c[n].indentation,s=i.rtrim(e.substr(o)) +if(i.isNotBlank(e)&&i.indentation(e){"use strict" +e.exports=function(){var e=Array.prototype.slice +function t(){}function n(t,n){return function(){var r=e.call(arguments,arguments.length-1)[0],i=e.call(arguments,0,arguments.length-2) +n.apply(t,i),r&&r()}}return{noop:t,noargs:function(e){return function(){return e()}},async_noop:n(null,t),asynchronize:n,is_function:function(e){return e&&"[object Function]"==={}.toString.call(e)},curry:function(t,n){var r=e.call(arguments,2) +return function(){return n.apply(t,r.concat(e.call(arguments)))}},invoke:function(e,t,n){return e.apply(t,n)}}}()},409:(e,t,n)=>{"use strict" +var r={Yadda:n(5682),EventBus:n(7453),Interpreter:n(4404),Context:n(9174),Library:n(6877),Dictionary:n(3591),FeatureFileSearch:n(8392),FileSearch:n(3527),Platform:n(886),localisation:n(5534),converters:n(2453),parsers:n(3574),plugins:n(918),shims:n(9782),createInstance:function(){return r.Yadda.apply(null,Array.prototype.slice.call(arguments,0))}} +e.exports=r},2889:(e,t,n)=>{"use strict" +var r=n(8271) +e.exports=new r("Chinese",{feature:"[Ff]eature|功能",scenario:"(?:[Ss]cenario|[Ss]cenario [Oo]utline|场景|剧本|(?:场景|剧本)?大纲)",examples:"(?:[Ee]xamples|[Ww]here|例子|示例|举例|样例)",pending:"(?:[Pp]ending|[Tt]odo|待定|待做|待办|暂停|暂缓)",only:"(?:[Oo]nly|仅仅?)",background:"[Bb]ackground|背景|前提",given:"(?:[Gg]iven|[Ww]ith|[Aa]nd|[Bb]ut|[Ee]xcept|假如|假设|假定|并且|而且|同时|但是)",when:"(?:[Ww]hen|[Ii]f|[Aa]nd|[Bb]ut|当|如果|并且|而且|同时|但是)",then:"(?:[Tt]hen|[Ee]xpect|[Aa]nd|[Bb]ut|那么|期望|并且|而且|同时|但是)",_steps:["given","when","then"]})},8555:(e,t,n)=>{"use strict" +var r=n(8271) +e.exports=new r("Dutch",{feature:"(?:[Ff]eature|[Ff]unctionaliteit|[Ee]igenschap)",scenario:"(?:[Ss]cenario|[Gg|eval)",examples:"(?:[Vv]oorbeelden?)",pending:"(?:[Tt]odo|[Mm]oet nog)",only:"(?:[Aa]lleen)",background:"(?:[Aa]chtergrond)",given:"(?:[Ss]tel|[Gg]egeven(?:\\sdat)?|[Ee]n|[Mm]aar)",when:"(?:[Aa]ls|[Ww]anneer|[Ee]n|[Mm]aar)",then:"(?:[Dd]an|[Vv]ervolgens|[Ee]n|[Mm]aar)",_steps:["given","when","then"]})},9307:(e,t,n)=>{"use strict" +var r=n(8271) +e.exports=new r("English",{feature:"[Ff]eature",scenario:"(?:[Ss]cenario|[Ss]cenario [Oo]utline)",examples:"(?:[Ee]xamples|[Ww]here)",pending:"(?:[Pp]ending|[Tt]odo)",only:"(?:[Oo]nly)",background:"[Bb]ackground",given:"(?:[Gg]iven|[Ww]ith|[Aa]nd|[Bb]ut|[Ee]xcept)",when:"(?:[Ww]hen|[Ii]f|[Aa]nd|[Bb]ut)",then:"(?:[Tt]hen|[Ee]xpect|[Aa]nd|[Bb]ut)",_steps:["given","when","then"]})},298:(e,t,n)=>{"use strict" +var r=n(8271) +e.exports=new r("French",{feature:"(?:[Ff]onctionnalité)",scenario:"(?:[Ss]cénario|[Pp]lan [Dd]u [Ss]cénario)",examples:"(?:[Ee]xemples|[Ee]xemple|[Oo][uù])",pending:"(?:[Ee]n attente|[Ee]n cours|[Tt]odo)",only:"(?:[Ss]eulement])",background:"(?:[Cc]ontexte)",given:"(?:[Ss]oit|[ÉéEe]tant données|[ÉéEe]tant donnée|[ÉéEe]tant donnés|[ÉéEe]tant donné|[Aa]vec|[Ee]t|[Mm]ais|[Aa]ttendre)",when:"(?:[Qq]uand|[Ll]orsqu'|[Ll]orsque|[Ss]i|[Ee]t|[Mm]ais)",then:"(?:[Aa]lors|[Aa]ttendre|[Ee]t|[Mm]ais)",_steps:["given","when","then","soit","etantdonnees","etantdonnee","etantdonne","quand","lorsque","alors"],get soit(){return this.given},get etantdonnees(){return this.given},get etantdonnee(){return this.given},get etantdonne(){return this.given},get quand(){return this.when},get lorsque(){return this.when},get alors(){return this.then}})},4430:(e,t,n)=>{"use strict" +var r=n(8271) +e.exports=new r("German",{feature:"(?:[Ff]unktionalität|[Ff]eature|[Aa]spekt|[Uu]secase|[Aa]nwendungsfall)",scenario:"(?:[Ss]zenario|[Ss]zenario( g|G)rundriss|[Gg]eschehnis)",examples:"(?:[Bb]eispiele?)",pending:"(?:[Tt]odo|[Oo]ffen)",only:"(?:[Nn]ur|[Ee]inzig)",background:"(?:[Gg]rundlage|[Hh]intergrund|[Ss]etup|[Vv]orausgesetzt)",given:"(?:[Aa]ngenommen|[Gg]egeben( sei(en)?)?|[Mm]it|[Uu]nd|[Aa]ber|[Aa]ußer)",when:"(?:[Ww]enn|[Ff]alls|[Uu]nd|[Aa]ber)",then:"(?:[Dd]ann|[Ff]olglich|[Aa]ußer|[Uu]nd|[Aa]ber)",_steps:["given","when","then"]})},8271:(e,t,n)=>{"use strict" +var r=n(6877),i=n(3143) +e.exports=function(e,t){var n=this +this.is_language=!0,this.library=function(e){return n.localise_library(new r(e))},this.localise_library=function(e){return i(t._steps).each((function(t){e[t]=function(r,s,a,u){return i(r).each((function(r){return r=o(n.localise(t),r),e.define(r,s,a,u)}))}})),e} +var o=function(e,t){var n=new RegExp("^/|/$","g"),r=new RegExp(/^(?:\^)?/) +return t.toString().replace(n,"").replace(r,"^(?:\\s)*"+e+"\\s+")} +this.localise=function(n){if(void 0===t[n])throw new Error('Keyword "'+n+'" has not been translated into '+e+".") +return t[n]}}},5821:(e,t,n)=>{"use strict" +var r=n(8271) +e.exports=new r("Norwegian",{feature:"[Ee]genskap",scenario:"[Ss]cenario",examples:"[Ee]ksempler",pending:"[Aa]vventer",only:"[Bb]are",background:"[Bb]akgrunn",given:"(?:[Gg]itt|[Mm]ed|[Oo]g|[Mm]en|[Uu]nntatt)",when:"(?:[Nn]år|[Oo]g|[Mm]en)",then:"(?:[Ss]å|[Ff]forvent|[Oo]g|[Mm]en)",_steps:["given","when","then","gitt","når","så"],get gitt(){return this.given},get"når"(){return this.when},get"så"(){return this.then}})},3040:(e,t,n)=>{"use strict" +var r=n(8271) +e.exports=new r("Pirate",{feature:"(?:[Tt]ale|[Yy]arn)",scenario:"(?:[Aa]dventure|[Ss]ortie)",examples:"[Ww]herest",pending:"[Bb]rig",only:"[Bb]lack [Ss]pot",background:"[Aa]ftground",given:"(?:[Gg]iveth|[Ww]ith|[Aa]nd|[Bb]ut|[Ee]xcept)",when:"(?:[Ww]hence|[Ii]f|[Aa]nd|[Bb]ut)",then:"(?:[Tt]hence|[Ee]xpect|[Aa]nd|[Bb]ut)",_steps:["given","when","then","giveth","whence","thence"],get giveth(){return this.given},get whence(){return this.when},get thence(){return this.then}})},5991:(e,t,n)=>{"use strict" +var r=n(8271) +e.exports=new r("Polish",{feature:"(?:[Ww]łaściwość|[Ff]unkcja|[Aa]spekt|[Pp]otrzeba [Bb]iznesowa)",scenario:"(?:[Ss]cenariusz|[Ss]zablon [Ss]cenariusza)",examples:"[Pp]rzykłady",pending:"(?:[Oo]czekujący|[Nn]iezweryfikowany|[Tt]odo)",only:"[Tt]ylko",background:"[Zz]ałożenia",given:"(?:[Zz]akładając|[Mm]ając|[Oo]raz|[Ii]|[Aa]le)",when:"(?:[Jj]eżeli|[Jj]eśli|[Gg]dy|[Kk]iedy|[Oo]raz|[Ii]|[Aa]le)",then:"(?:[Ww]tedy|[Oo]raz|[Ii]|[Aa]le)",_steps:["given","when","then","zakladajac","majac","jezeli","jesli","gdy","kiedy","wtedy"],get zakladajac(){return this.given},get majac(){return this.given},get jezeli(){return this.when},get jesli(){return this.when},get gdy(){return this.when},get kiedy(){return this.when},get wtedy(){return this.then}})},2482:(e,t,n)=>{"use strict" +var r=n(8271) +e.exports=new r("Portuguese",{feature:"(?:[Ff]uncionalidade|[Cc]aracter[íi]stica)",scenario:"(?:[Cc]en[aá]rio|[Cc]aso)",examples:"(?:[Ee]xemplos|[Ee]xemplo)",pending:"[Pp]endente",only:"[S][óo]",background:"[Ff]undo",given:"(?:[Ss]eja|[Ss]ejam|[Dd]ado|[Dd]ada|[Dd]ados|[Dd]adas|[Ee]|[Mm]as)",when:"(?:[Qq]uando|[Ss]e|[Qq]ue|[Ee]|[Mm]as)",then:"(?:[Ee]nt[aã]o|[Ee]|[Mm]as)",_steps:["given","when","then","seja","sejam","dado","dada","dados","dadas","quando","se","entao"],get seja(){return this.given},get sejam(){return this.given},get dado(){return this.given},get dada(){return this.given},get dados(){return this.given},get dadas(){return this.given},get quando(){return this.when},get se(){return this.when},get entao(){return this.then}})},9494:(e,t,n)=>{"use strict" +var r=n(8271) +e.exports=new r("Russian",{feature:"(?:[Фф]ункция|[Фф]ункционал|[Сс]войство)",scenario:"Сценарий",examples:"Примеры?",pending:"(?:[Ww]ip|[Tt]odo)",only:"Только",background:"(?:[Пп]редыстория|[Кк]онтекст)",given:"(?:[Дд]опустим|[Дд]ано|[Пп]усть|[Ии]|[Н]о)(?:\\s[Яя])?",when:"(?:[Ее]сли|[Кк]огда|[Ии]|[Н]о)(?:\\s[Яя])?",then:"(?:[Тт]о|[Тт]огда|[Ии]|[Н]о)(?:\\s[Яя])?",_steps:["given","when","then"]})},4029:(e,t,n)=>{"use strict" +var r=n(8271) +e.exports=new r("Spanish",{feature:"(?:[Ff]uncionalidad|[Cc]aracterística)",scenario:"(?:[Ee]scenario|[Cc]aso)",examples:"(?:[Ee]jemplos|[Ee]jemplo)",pending:"[Pp]endiente",only:"[S]ólo",background:"[Ff]ondo",given:"(?:[Ss]ea|[Ss]ean|[Dd]ado|[Dd]ada|[Dd]ados|[Dd]adas)",when:"(?:[Cc]uando|[Ss]i|[Qq]ue)",then:"(?:[Ee]ntonces)",_steps:["given","when","then","sea","sean","dado","dada","dados","dadas","cuando","si","entonces"],get sea(){return this.given},get sean(){return this.given},get dado(){return this.given},get dada(){return this.given},get dados(){return this.given},get dadas(){return this.given},get cuando(){return this.when},get si(){return this.when},get entonces(){return this.then}})},6076:(e,t,n)=>{"use strict" +var r=n(8271) +e.exports=new r("Ukrainian",{feature:"(?:[Фф]ункція|[Фф]ункціонал|[Пп]отреба|[Аа]спект|[Оо]собливість|[Вв]ластивість)",scenario:"(?:[Сс]ценарій|[Шш]аблон)",examples:"[Пп]риклади",pending:"(?:[Нн]еперевірений|[Чч]екаючий|[Pp]ending|[Tt]odo)",only:"[Тт]ільки",background:"[Кк]онтекст",given:"(?:[Дд]ано|[Пп]ри|[Нн]ехай|[Іі]|[Тт]а|[Аа]ле)",when:"(?:[Яя]кщо|[Дд]е|[Кк]оли|[Іі]|[Тт]а|[Аа]ле)",then:"(?:[Тт]оді|[Іі]|[Тт]а|[Аа]ле)",_steps:["given","when","then"]})},5534:(e,t,n)=>{"use strict" +e.exports={Chinese:n(2889),English:n(9307),French:n(298),German:n(4430),Dutch:n(8555),Norwegian:n(5821),Pirate:n(3040),Ukrainian:n(6076),Polish:n(5991),Spanish:n(4029),Russian:n(9494),Portuguese:n(2482),default:n(9307),Language:n(8271)}},5070:(e,t,n)=>{"use strict" +e.exports=function(e){var t=n(9782).fs,r=new(n(3610))(e) +this.parse=function(e,n){var i=t.readFileSync(e,"utf8"),o=r.parse(i) +return n&&n(o)||o}}},3610:(e,t,n)=>{"use strict" +var r=n(3143),i=n(526),o=n(6007),s=n(5534) +e.exports=function(e){var t,n,a={language:s.default,leftPlaceholderChar:"[",rightPlaceholderChar:"]"},u=(e=e&&e.is_language?{language:e}:e||a).language||a.language,c=e.leftPlaceholderChar||a.leftPlaceholderChar,l=e.rightPlaceholderChar||a.rightPlaceholderChar,f=new RegExp("^\\s*"+u.localise("feature")+":\\s*(.*)","i"),h=new RegExp("^\\s*"+u.localise("scenario")+":\\s*(.*)","i"),d=new RegExp("^\\s*"+u.localise("background")+":\\s*(.*)","i"),p=new RegExp("^\\s*"+u.localise("examples")+":","i"),g=new RegExp("^(.*)$","i"),v=new RegExp("^\\s*#"),m=new RegExp("^\\s*#{3,}"),y=new RegExp("^(\\s*)$"),b=new RegExp("(^\\s*[\\|┆]?-{3,})"),w=new RegExp("^\\s*@([^=]*)$"),x=new RegExp("^\\s*@([^=]*)=(.*)$") +function k(e,r){var i,s=r+1 +try{if(i=m.test(e))return n=!n +if(n)return +if(i=v.test(e))return +if(i=w.exec(e))return t.handle("Annotation",{key:o.trim(i[1]),value:!0},s) +if(i=x.exec(e))return t.handle("Annotation",{key:o.trim(i[1]),value:o.trim(i[2])},s) +if(i=f.exec(e))return t.handle("Feature",i[1],s) +if(i=h.exec(e))return t.handle("Scenario",i[1],s) +if(i=d.exec(e))return t.handle("Background",i[1],s) +if(i=p.exec(e))return t.handle("Examples",s) +if(i=y.exec(e))return t.handle("Blank",i[0],s) +if(i=b.exec(e))return t.handle("Dash",i[1],s) +if(i=g.exec(e))return t.handle("Text",i[1],s)}catch(t){throw t.message="Error parsing line "+s+', "'+e+'".\nOriginal error was: '+t.message,t}}this.parse=function(e,i){return t=new _,n=!1,function(e){return r(e.split(/\r\n|\n/))}(e).each(k),i&&i(t.export())||t.export()} +var E=function(e){e=e||{},this.register=function(t,n){e[t]=n},this.unregister=function(){r(Array.prototype.slice.call(arguments)).each((function(t){delete e[t]}))},this.find=function(t){if(!e[t.toLowerCase()])throw new Error(t+" is unexpected at this time") +return{handle:e[t.toLowerCase()]}}},_=function(){var e,t=this,n=new S,r=new E({text:i.noop,blank:i.noop,annotation:function(e,t){r.unregister("background"),n.stash(t.key,t.value)},feature:function(t,r){return e=new C(r,n,new S)},scenario:o,background:s}) +function o(t,r,i){return(e=new C(r,new S,n)).on(t,r,i)}var s=o +this.handle=function(e,n,r){t=t.on(e,n,r)},this.on=function(e,t,n){return r.find(e).handle(e,t,n)||this},this.export=function(){if(!e)throw new Error("A feature must contain one or more scenarios") +return e.export()}},S=function(){var e={} +this.stash=function(t,n){if(/\s/.test(t))throw new Error("Invalid annotation: "+t) +e[t.toLowerCase()]=n},this.export=function(){return e}},C=function(e,t,n){var s=[],a=[],u=new j,c=new E({text:function(e,t){s.push(o.trim(t))},blank:i.noop,annotation:function(e,t){c.unregister("background","text"),n.stash(t.key,t.value)},scenario:function(e,t){var r=new N(t,u,n,l) +return a.push(r),n=new S,r},background:function(e,t){return u=new T(t,l),n=new S,u}}),l=this +this.on=function(e,t,n){return c.find(e).handle(e,t,n)||this},this.export=function(){return function(){if(0===a.length)throw new Error("Feature requires one or more scenarios")}(),{title:e,annotations:t.export(),description:s,scenarios:r(a).collect((function(e){return e.export()})).flatten().naked()}}},T=function(e,t){var n=[],r=[],s=0,a=new E({text:u,blank:i.noop,annotation:v,scenario:m}) +function u(e,t,r){a.register("dash",c),n.push(o.trim(t))}function c(e,t,n){a.unregister("dash","annotation","scenario"),a.register("text",l),a.register("blank",h),s=o.indentation(t)}function l(e,t,n){a.register("dash",p),a.register("text",f),a.register("blank",h),a.register("annotation",v),a.register("scenario",m),g(t,"\n")}function f(e,t,n){d(),g(t,"\n")}function h(e,t,n){r.push(t)}function d(){r.length&&(g(r.join("\n"),"\n"),r=[])}function p(e,t,n){a.unregister("dash"),a.register("text",u),a.register("blank",i.noop),d()}function g(e,t){if(o.isNotBlank(e)&&o.indentation(e)=0?"┆":"|",i=r(e.split(n)) +if(void 0!==t&&t!==i.length)throw new Error("Incorrect number of fields in example table. Expected "+t+" but found "+i.length) +return i}function w(t,n,r){return x(),e.on(t,n,r)}function x(){if(0===t.length)throw new Error("Examples table requires one or more headings") +if(0===n.length)throw new Error("Examples table requires one or more rows")}function k(){var e={} +return r(Array.prototype.slice.call(arguments)).each((function(t){for(var n in t)e[n]=t[n]})),e}function _(e,t){return r(t).collect((function(t){return C(e,t)})).naked()}function C(e,t){for(var n in e)t=t.replace(new RegExp("\\"+c+"\\s*"+n+"\\s*\\"+l,"g"),o.rtrim(e[n].join("\n"))) +return t}this.on=function(e,t,n){return a.find(e).handle(e,t,n)||this},this.expand=function(e){return x(),n.collect((function(t){return{title:C(t.fields,e.title),annotations:k(t.annotations.export(),e.annotations),description:_(t,e.description),steps:_(t.fields,e.steps)}})).naked()}}}},7724:(e,t,n)=>{"use strict" +var r=n(3143) +e.exports=function(){var e=/[^\s]/ +this.parse=function(e,r){var i=t(e).find_all(n) +return r&&r(i)||i} +var t=function(e){return r(e.split(/\n/))},n=function(t){return t&&e.test(t)}}},3574:(e,t,n)=>{"use strict" +e.exports={StepParser:n(7724),FeatureParser:n(3610),FeatureFileParser:n(5070)}},8418:(e,t,n)=>{"use strict" +if(!(e=n.nmd(e)).client){var r=n(9782).fs +n.g.process=n.g.process||{cwd:function(){return r.workingDirectory}}}e.exports=function(e,t){var r=n(409).EventBus +e.interpreter.interpret_step=function(e,n,i){var o=this +t.then((function(){t.test.info(e),r.instance().send(r.ON_STEP,{step:e,ctx:n}),o.rank_macros(e).clear_winner().interpret(e,n,i)}))},t.yadda=function(t,n){if(void 0===t)return this +e.run(t,n)}}},918:(e,t,n)=>{"use strict" +e.exports={casper:n(8418),mocha:{ScenarioLevelPlugin:n(616),StepLevelPlugin:n(2271)},get jasmine(){return this.mocha}}},749:(e,t,n)=>{"use strict" +var r=n(5534),i=n(886),o=n(5070),s=n(3143) +e.exports.create=function(e){var t=new i,n=e.language||r.default,a=e.parser||new o(n),u=e.container||t.get_container() +function c(e,t){s(e).each((function(e){l(e.title,e,t)}))}function l(e,t,n){var r;(h(r=t.annotations,"pending")?u.xdescribe:h(r,"only")?u.describe.only||u.fdescribe||u.ddescribe:u.describe)(e,(function(){n(t)}))}function f(e,t){return h(e,"pending")?u.xit:h(e,"only")?u.it.only||u.fit||u.iit:u.it}function h(e,t){var r=new RegExp("^"+n.localise(t)+"$","i") +for(var i in e)if(r.test(i))return!0}return{featureFiles:function(e,t){s(e).each((function(e){c(a.parse(e),t)}))},features:c,describe:l,it_async:function(e,t,n){f(t.annotations)(e,(function(e){n(this,t,e)}))},it_sync:function(e,t,n){f(t.annotations)(e,(function(){n(this,t)}))}}}},616:(e,t,n)=>{"use strict" +var r=n(3143),i=n(886),o=n(749) +e.exports.init=function(e){e=e||{} +var t=new i,n=e.container||t.get_container(),s=o.create(e) +n.featureFiles=n.featureFile=s.featureFiles,n.features=n.feature=s.features,n.scenarios=n.scenario=function(e,t){r(e).each((function(e){(1===t.length?s.it_sync:s.it_async)(e.title,e,(function(e,n,r){t(n,r)}))}))}}},2271:(e,t,n)=>{"use strict" +var r=n(3143),i=n(886),o=n(749) +e.exports.init=function(e){e=e||{} +var t=new i,n=e.container||t.get_container(),s=o.create(e) +n.featureFiles=n.featureFile=s.featureFiles,n.features=n.feature=s.features,n.scenarios=n.scenario=function(e,t){r(e).each((function(e){s.describe(e.title,e,t)}))},n.steps=function(e,t){var n=!1 +function i(e,t){s.it_async(e,e,(function(e,r,i){if(n)return e.skip?e.skip():i() +n=!0,t.bind(e)(r,(function(e){if(e)return(i.fail||i)(e) +n=!1,i()}))}))}function o(e,t){s.it_sync(e,e,(function(e,r){if(n)return e.skip&&e.skip() +n=!0,t.bind(e)(r),n=!1}))}r(e).each((function(e){(1===t.length?o:i)(e,t)}))}}},4633:e=>{"use strict" +e.exports=function(e,t){var n +this.value,this.type="LevenshteinDistanceScore" +var r=this +this.compare=function(e){return e.value-this.value},this.equals=function(e){return!!e&&this.type===e.type&&this.value===e.value},function(){var r=e.length,i=t.length +n=new Array(r+1) +for(var o=0;o<=r;o++)n[o]=new Array(i+1) +for(o=0;o<=r;o++)for(var s=0;s<=i;s++)n[o][s]=0 +for(o=0;o<=r;o++)n[o][0]=o +for(s=0;s<=i;s++)n[0][s]=s}(),function(){if(e===t)return r.value=0 +for(var i=0;i{"use strict" +var r=n(3143) +e.exports=function(e){this.scores=r(e),this.type="MultiScore",this.compare=function(e){for(var t=0;t{"use strict" +e.exports=function(e,t){this.value=e.is_sibling(t)?1:0,this.type="SameLibraryScore",this.compare=function(e){return this.value-e.value},this.equals=function(e){return!!e&&this.type===e.type&&this.value===e.value}}},9782:(e,t,n)=>{"use strict" +var r,i,o,s,a=n(886) +e.exports=(i=function(){return{fs:n(9265),path:n(3642),process:process}},o=function(){return{fs:n(4044),path:n(4152),process:n(5284)}},s=function(){return{fs:n(2459),path:n(8281),process:n(7804)}},(r=new a).is_phantom()?o():r.is_browser()&&r.is_karma()?s():r.is_node()?i():{})},2459:(e,t,n)=>{e.exports=function(){"use strict" +var e=n(8281) +function t(t){return e.resolve(e.normalize(t.split("\\").join("/")))}var r=function(){this.registry=new i,this.converter=new o("/base/","/"),this.reader=new s(this.converter) +var e=Object.keys(window.__karma__.files) +this.converter.parseUris(e).forEach(this.registry.addFile,this.registry)} +r.prototype={constructor:r,workingDirectory:"/",existsSync:function(e){return this.registry.exists(e)},readdirSync:function(e){return this.registry.getContent(e)},statSync:function(e){return{isDirectory:function(){return this.registry.isDirectory(e)}.bind(this)}},readFileSync:function(e,t){if("utf8"!==t)throw new Error("This fs.readFileSync() shim does not support other than utf8 encoding.") +if(!this.registry.isFile(e))throw new Error("File does not exist: "+e) +return this.reader.readFile(e)}} +var i=function(){this.paths={}} +i.prototype={constructor:i,addFile:function(n){n=t(n),this.paths[n]=i.TYPE_FILE +var r=e.dirname(n) +this.addDirectory(r)},addDirectory:function(n){n=t(n),this.paths[n]=i.TYPE_DIRECTORY +var r=e.dirname(n) +r!==n&&this.addDirectory(r)},isFile:function(e){return e=t(e),this.exists(e)&&this.paths[e]===i.TYPE_FILE},isDirectory:function(e){return e=t(e),this.exists(e)&&this.paths[e]===i.TYPE_DIRECTORY},exists:function(e){return e=t(e),this.paths.hasOwnProperty(e)},getContent:function(n){if(!this.isDirectory(n))throw new Error("Not a directory: "+n) +return n=t(n),Object.keys(this.paths).filter((function(t){return t!==n&&e.dirname(t)===n}),this).map((function(t){return e.basename(t)}))}},i.TYPE_FILE=0,i.TYPE_DIRECTORY=1 +var o=function(e,t){this.workingDirectory=t,this.workingDirectoryPattern=this.patternFromBase(t),this.baseUri=e,this.baseUriPattern=this.patternFromBase(e)} +o.prototype={constructor:o,patternFromBase:function(e,t){var n="^"+e.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&") +return new RegExp(n,t)},parseUris:function(e){return e.filter((function(e){return this.baseUriPattern.test(e)}),this).map((function(e){return e.replace(this.baseUriPattern,this.workingDirectory)}),this)},buildUri:function(e){if(e=t(e),!this.workingDirectoryPattern.test(e))throw new Error("Path is not in working directory: "+e) +return e.replace(this.workingDirectoryPattern,this.baseUri)}} +var s=function(e){this.converter=e} +return s.prototype={constructor:s,readFile:function(e){var t=this.converter.buildUri(e),n=new XMLHttpRequest +return n.open("get",t,!1),n.send(),n.responseText}},new r}()},8281:(e,t,n)=>{e.exports=function(){"use strict" +var e={} +try{e=n(3642)}catch(e){throw new Error("The environment does not support the path module, it's probably not using browserify.")}if("function"!=typeof e.normalize||"function"!=typeof e.dirname)throw new Error("The path module emulation does not contain implementations of required functions.") +return e}()},7804:(e,t,n)=>{e.exports=function(){"use strict" +var e=n(2459) +return{cwd:function(){return e.workingDirectory}}}()},4044:(e,t,n)=>{"use strict";(e=n.nmd(e)).exports=function(){if(e.client)return{} +var t=n(9265) +return t.existsSync=t.existsSync||t.exists,t.readdirSync=t.readdirSync||function(e){return t.list(e).filter((function(e){return"."!==e&&".."!==e}))},t.statSync=t.statSync||function(e){return{isDirectory:function(){return t.isDirectory(e)}}},t}()},4152:(e,t,n)=>{"use strict";(e=n.nmd(e)).exports=function(){if(e.client)return{} +var t=n(9265),r={} +try{r=n(3642)}catch(e){}return r.join=r.join||function(){return Array.prototype.join.call(arguments,t.separator)},r.relative=r.relative||function(e,n){return e+t.separator+n},r}()},5284:(e,t,n)=>{"use strict";(e=n.nmd(e)).exports=function(){if(e.client)return{} +var t=n(9265),r=void 0!==r?r:{} +return r.cwd=function(){return t.workingDirectory},r}()}}]) diff --git a/agent/uiserver/dist/assets/chunk.336.f5cb05e551aa08eb7125.js.LICENSE.txt b/agent/uiserver/dist/assets/chunk.336.f5cb05e551aa08eb7125.js.LICENSE.txt new file mode 100644 index 00000000000..54e228a74b6 --- /dev/null +++ b/agent/uiserver/dist/assets/chunk.336.f5cb05e551aa08eb7125.js.LICENSE.txt @@ -0,0 +1,8 @@ +/*! + * QUnit 2.19.1 + * https://qunitjs.com/ + * + * Copyright OpenJS Foundation and other contributors + * Released under the MIT license + * https://jquery.org/license + */ diff --git a/agent/uiserver/dist/assets/chunk.412.2df22e4bf69d8f15ebdb.js b/agent/uiserver/dist/assets/chunk.412.2df22e4bf69d8f15ebdb.js new file mode 100644 index 00000000000..eaf09b0c7c7 --- /dev/null +++ b/agent/uiserver/dist/assets/chunk.412.2df22e4bf69d8f15ebdb.js @@ -0,0 +1,2276 @@ +/*! For license information please see chunk.412.2df22e4bf69d8f15ebdb.js.LICENSE.txt */ +(globalThis.webpackChunk_ember_auto_import_=globalThis.webpackChunk_ember_auto_import_||[]).push([[412],{218:(t,e,n)=>{"use strict" +n.r(e),n.d(e,{iconNames:()=>r}) +const r=["loading","running","apple","apple-color","alibaba","alibaba-color","amazon-ecs","amazon-ecs-color","amazon-eks","amazon-eks-color","auth0","auth0-color","aws","aws-color","aws-cloudwatch","aws-cloudwatch-color","aws-ec2","aws-ec2-color","aws-lambda","aws-lambda-color","aws-s3","aws-s3-color","azure","azure-color","azure-aks","azure-aks-color","azure-blob-storage","azure-blob-storage-color","azure-devops","azure-devops-color","azure-vms","azure-vms-color","bitbucket","bitbucket-color","bridgecrew","bridgecrew-color","cisco","cisco-color","codepen","codepen-color","datadog","datadog-color","digital-ocean","digital-ocean-color","docker","docker-color","f5","f5-color","facebook","facebook-color","figma","figma-color","gcp","gcp-color","gitlab","gitlab-color","github","github-color","google","google-color","grafana","grafana-color","helm","helm-color","infracost","infracost-color","kubernetes","kubernetes-color","lightlytics","lightlytics-color","linkedin","linkedin-color","linode","linode-color","linux","linux-color","loom","loom-color","microsoft","microsoft-color","microsoft-teams","microsoft-teams-color","okta","okta-color","oracle","oracle-color","opa","opa-color","pack","pack-color","saml","saml-color","slack","slack-color","snyk","snyk-color","splunk","splunk-color","twitch","twitch-color","twitter","twitter-color","vantage","vantage-color","vmware","vmware-color","youtube","youtube-color","boundary","boundary-color","consul","consul-color","nomad","nomad-color","packer","packer-color","terraform","terraform-color","vagrant","vagrant-color","vault","vault-color","waypoint","waypoint-color","hashicorp","hashicorp-color","hcp","hcp-color","activity","alert-circle","alert-circle-fill","alert-diamond","alert-diamond-fill","alert-triangle","alert-triangle-fill","alert-octagon","alert-octagon-fill","align-center","align-justify","align-left","align-right","api","archive","arrow-down","arrow-down-circle","arrow-down-left","arrow-down-right","arrow-left","arrow-left-circle","arrow-right","arrow-right-circle","arrow-up","arrow-up-circle","arrow-up-left","arrow-up-right","at-sign","award","auto-apply","bank-vault","bar-chart","bar-chart-alt","battery","battery-charging","beaker","bell","bell-active-fill","bell-active","bell-off","bookmark","bookmark-fill","bookmark-add","bookmark-add-fill","bookmark-remove","bookmark-remove-fill","bottom","box","briefcase","bug","build","bulb","calendar","camera","camera-off","caret","cast","certificate","change","change-circle","change-square","check","check-circle","check-circle-fill","check-diamond","check-diamond-fill","check-hexagon","check-hexagon-fill","check-square","check-square-fill","chevron-down","chevron-left","chevron-right","chevron-up","chevrons-down","chevrons-left","chevrons-right","chevrons-up","circle","circle-dot","circle-fill","circle-half","clipboard","clipboard-checked","clipboard-copy","clock","clock-filled","cloud","closed-caption","cloud-check","cloud-download","cloud-lightning","cloud-lock","cloud-off","cloud-upload","cloud-x","code","collections","command","compass","connection","connection-gateway","corner-down-left","corner-down-right","corner-left-down","corner-left-up","corner-right-down","corner-right-up","corner-up-left","corner-up-right","cpu","credit-card","crop","crosshair","dashboard","database","delay","delete","diamond","diamond-fill","disc","discussion-circle","discussion-square","docs","docs-download","docs-link","dollar-sign","dot","dot-half","download","droplet","duplicate","edit","enterprise","entry-point","exit-point","external-link","event","eye","eye-off","fast-forward","file","file-check","file-change","file-diff","file-minus","file-plus","file-source","file-text","file-x","files","film","filter","filter-circle","filter-fill","fingerprint","flag","folder","folder-fill","folder-minus","folder-minus-fill","folder-plus","folder-plus-fill","folder-star","folder-users","frown","gateway","gift","git-branch","git-commit","git-merge","git-pull-request","git-repo","globe","globe-private","government","grid","grid-alt","guide","guide-link","hammer","handshake","hard-drive","hash","headphones","heart","heart-fill","heart-off","help","hexagon","hexagon-fill","history","home","hourglass","identity-user","identity-service","image","inbox","info","info-fill","jump-link","key","keychain","key-values","labyrinth","layers","layout","learn","learn-link","line-chart","line-chart-up","link","list","load-balancer","lock","lock-fill","lock-off","logs","mail","mail-open","mainframe","map","map-pin","maximize","maximize-alt","meh","menu","mesh","message-circle","message-circle-fill","message-square","message-square-fill","mic","mic-off","migrate","minimize","minimize-alt","minus","minus-circle","minus-square","minus-square-fill","minus-plus","minus-plus-circle","minus-plus-square","module","monitor","moon","more-horizontal","more-vertical","mouse-pointer","move","music","navigation","navigation-alt","network","network-alt","newspaper","node","octagon","org","outline","package","paperclip","path","pause","pause-circle","pen-tool","pencil-tool","phone","phone-call","phone-off","pie-chart","pin","pipeline","play","play-circle","plug","plus","plus-circle","plus-square","power","printer","provider","queue","radio","random","redirect","reload","repeat","replication-direct","replication-perf","rewind","rocket","rotate-cw","rotate-ccw","rss","save","scissors","search","send","server","serverless","server-cluster","settings","service","share","shield","shield-alert","shield-check","shield-off","shield-x","shopping-bag","shopping-cart","shuffle","sidebar","sidebar-hide","sidebar-show","sign-in","sign-out","skip","skip-forward","skip-back","slash","slash-square","sliders","smartphone","smile","socket","sort-asc","sort-desc","speaker","square","square-fill","star","star-circle","star-fill","star-off","step","stop-circle","sun","support","swap-horizontal","swap-vertical","switcher","sync","sync-alert","sync-reverse","tablet","tag","target","terminal","terminal-screen","test","thumbs-up","thumbs-down","toggle-left","toggle-right","token","tools","top","trash","trend-down","trend-up","triangle","triangle-fill","truck","tv","type","unfold-open","unfold-close","unlock","upload","user","user-check","user-circle","user-circle-fill","user-minus","user-plus","user-x","users","verified","video","video-off","volume","volume-down","volume-2","volume-x","wall","wand","watch","webhook","wifi","wifi-off","wrench","x","x-circle","x-circle-fill","x-diamond","x-diamond-fill","x-hexagon","x-hexagon-fill","x-square","x-square-fill","zap","zap-off","zoom-in","zoom-out"]},9454:(t,e,n)=>{"use strict" +function r(t,e){var n="function"==typeof Symbol&&t[Symbol.iterator] +if(!n)return t +var r,i,o=n.call(t),a=[] +try{for(;(void 0===e||e-- >0)&&!(r=o.next()).done;)a.push(r.value)}catch(t){i={error:t}}finally{try{r&&!r.done&&(n=o.return)&&n.call(o)}finally{if(i)throw i.error}}return a}var i +n.r(e),n.d(e,{InterpreterStatus:()=>i,assign:()=>u,createMachine:()=>d,interpret:()=>y}),function(t){t[t.NotStarted=0]="NotStarted",t[t.Running=1]="Running",t[t.Stopped=2]="Stopped"}(i||(i={})) +var o={type:"xstate.init"} +function a(t){return void 0===t?[]:[].concat(t)}function u(t){return{type:"xstate.assign",assignment:t}}function c(t,e){return"string"==typeof(t="string"==typeof t&&e&&e[t]?e[t]:t)?{type:t}:"function"==typeof t?{type:t.name,exec:t}:t}function s(t){return function(e){return t===e}}function f(t){return"string"==typeof t?{type:t}:t}function l(t,e){return{value:t,context:e,actions:[],changed:!1,matches:s(t)}}function h(t,e,n){var r=e,i=!1 +return[t.filter((function(t){if("xstate.assign"===t.type){i=!0 +var e=Object.assign({},r) +return"function"==typeof t.assignment?e=t.assignment(r,n):Object.keys(t.assignment).forEach((function(i){e[i]="function"==typeof t.assignment[i]?t.assignment[i](r,n):t.assignment[i]})),r=e,!1}return!0})),r,i]}function d(t,e){void 0===e&&(e={}) +var n=r(h(a(t.states[t.initial].entry).map((function(t){return c(t,e.actions)})),t.context,o),2),i=n[0],u=n[1],d={config:t,_options:e,initialState:{value:t.initial,actions:i,context:u,matches:s(t.initial)},transition:function(e,n){var i,o,u="string"==typeof e?{value:e,context:t.context}:e,p=u.value,y=u.context,b=f(n),v=t.states[p] +if(v.on){var g=a(v.on[b.type]) +try{for(var m=function(t){var e="function"==typeof Symbol&&Symbol.iterator,n=e&&t[e],r=0 +if(n)return n.call(t) +if(t&&"number"==typeof t.length)return{next:function(){return t&&r>=t.length&&(t=void 0),{value:t&&t[r++],done:!t}}} +throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")}(g),_=m.next();!_.done;_=m.next()){var w=_.value +if(void 0===w)return l(p,y) +var x="string"==typeof w?{target:w}:w,A=x.target,E=x.actions,k=void 0===E?[]:E,D=x.cond,C=void 0===A +if((void 0===D?function(){return!0}:D)(y,b)){var O=t.states[null!=A?A:p],S=r(h((C?a(k):[].concat(v.exit,k,O.entry).filter((function(t){return t}))).map((function(t){return c(t,d._options.actions)})),y,b),3),M=S[0],F=S[1],T=S[2],B=null!=A?A:p +return{value:B,context:F,actions:M,changed:A!==p||M.length>0||T,matches:s(B)}}}}catch(t){i={error:t}}finally{try{_&&!_.done&&(o=m.return)&&o.call(m)}finally{if(i)throw i.error}}}return l(p,y)}} +return d}var p=function(t,e){return t.actions.forEach((function(n){var r=n.exec +return r&&r(t.context,e)}))} +function y(t){var e=t.initialState,n=i.NotStarted,r=new Set,a={_machine:t,send:function(o){n===i.Running&&(e=t.transition(e,o),p(e,f(o)),r.forEach((function(t){return t(e)})))},subscribe:function(t){return r.add(t),t(e),{unsubscribe:function(){return r.delete(t)}}},start:function(r){if(r){var u="object"==typeof r?r:{context:t.config.context,value:r} +e={value:u.value,actions:[],context:u.context,matches:s(u.value)}}return n=i.Running,p(e,o),a},stop:function(){return n=i.Stopped,r.clear(),a},get state(){return e},get status(){return n}} +return a}},6313:(t,e,n)=>{"use strict" +n.r(e),n.d(e,{default:()=>f}) +var r=['a[href]:not([tabindex^="-"])','area[href]:not([tabindex^="-"])','input:not([type="hidden"]):not([type="radio"]):not([disabled]):not([tabindex^="-"])','input[type="radio"]:not([disabled]):not([tabindex^="-"]):checked','select:not([disabled]):not([tabindex^="-"])','textarea:not([disabled]):not([tabindex^="-"])','button:not([disabled]):not([tabindex^="-"])','iframe:not([tabindex^="-"])','audio[controls]:not([tabindex^="-"])','video[controls]:not([tabindex^="-"])','[contenteditable]:not([tabindex^="-"])','[tabindex]:not([tabindex^="-"])'] +function i(t,e){this._show=this.show.bind(this),this._hide=this.hide.bind(this),this._maintainFocus=this._maintainFocus.bind(this),this._bindKeypress=this._bindKeypress.bind(this),this._previouslyFocused=null,this.container=t,this.dialog=t.querySelector('dialog, [role="dialog"], [role="alertdialog"]'),this.role=this.dialog.getAttribute("role")||"dialog",this.useDialog="show"in this.dialog,this._listeners={},this.create(e)}function o(t){return Array.prototype.slice.call(t)}function a(t,e){return o((e||document).querySelectorAll(t))}function u(t){var e=c(t),n=t.querySelector("[autofocus]")||e[0] +n&&n.focus()}function c(t){return a(r.join(","),t).filter((function(t){return!!(t.offsetWidth||t.offsetHeight||t.getClientRects().length)}))}function s(){a("[data-a11y-dialog]").forEach((function(t){new i(t,t.getAttribute("data-a11y-dialog")||void 0)}))}i.prototype.create=function(t){var e,n,r +return this._targets=this._targets||(r=t,NodeList.prototype.isPrototypeOf(r)?o(r):Element.prototype.isPrototypeOf(r)?[r]:"string"==typeof r?a(r):void 0)||((n=o((e=this.container).parentNode.childNodes).filter((function(t){return 1===t.nodeType}))).splice(n.indexOf(e),1),n),this.shown=this.dialog.hasAttribute("open"),this.dialog.setAttribute("role",this.role),this.useDialog?(this.container.setAttribute("data-a11y-dialog-native",""),this.container.removeAttribute("aria-hidden")):this.shown?this.container.removeAttribute("aria-hidden"):this.container.setAttribute("aria-hidden",!0),this._openers=a('[data-a11y-dialog-show="'+this.container.id+'"]'),this._openers.forEach(function(t){t.addEventListener("click",this._show)}.bind(this)),this._closers=a("[data-a11y-dialog-hide]",this.container).concat(a('[data-a11y-dialog-hide="'+this.container.id+'"]')),this._closers.forEach(function(t){t.addEventListener("click",this._hide)}.bind(this)),this._fire("create"),this},i.prototype.show=function(t){return this.shown||(this.shown=!0,this._previouslyFocused=document.activeElement,this.useDialog?this.dialog.showModal(t instanceof Event?void 0:t):(this.dialog.setAttribute("open",""),this.container.removeAttribute("aria-hidden"),this._targets.forEach((function(t){t.hasAttribute("aria-hidden")&&t.setAttribute("data-a11y-dialog-original-aria-hidden",t.getAttribute("aria-hidden")),t.setAttribute("aria-hidden","true")}))),u(this.dialog),document.body.addEventListener("focus",this._maintainFocus,!0),document.addEventListener("keydown",this._bindKeypress),this._fire("show",t)),this},i.prototype.hide=function(t){return this.shown?(this.shown=!1,this.useDialog?this.dialog.close(t instanceof Event?void 0:t):(this.dialog.removeAttribute("open"),this.container.setAttribute("aria-hidden","true"),this._targets.forEach((function(t){t.hasAttribute("data-a11y-dialog-original-aria-hidden")?(t.setAttribute("aria-hidden",t.getAttribute("data-a11y-dialog-original-aria-hidden")),t.removeAttribute("data-a11y-dialog-original-aria-hidden")):t.removeAttribute("aria-hidden")}))),this._previouslyFocused&&this._previouslyFocused.focus&&this._previouslyFocused.focus(),document.body.removeEventListener("focus",this._maintainFocus,!0),document.removeEventListener("keydown",this._bindKeypress),this._fire("hide",t),this):this},i.prototype.destroy=function(){return this.hide(),this._openers.forEach(function(t){t.removeEventListener("click",this._show)}.bind(this)),this._closers.forEach(function(t){t.removeEventListener("click",this._hide)}.bind(this)),this._fire("destroy"),this._listeners={},this},i.prototype.on=function(t,e){return void 0===this._listeners[t]&&(this._listeners[t]=[]),this._listeners[t].push(e),this},i.prototype.off=function(t,e){var n=(this._listeners[t]||[]).indexOf(e) +return n>-1&&this._listeners[t].splice(n,1),this},i.prototype._fire=function(t,e){(this._listeners[t]||[]).forEach(function(t){t(this.container,e)}.bind(this))},i.prototype._bindKeypress=function(t){this.dialog.contains(document.activeElement)&&(this.shown&&27===t.which&&"alertdialog"!==this.role&&(t.preventDefault(),this.hide(t)),this.shown&&9===t.which&&function(t,e){var n=c(t),r=n.indexOf(document.activeElement) +e.shiftKey&&0===r?(n[n.length-1].focus(),e.preventDefault()):e.shiftKey||r!==n.length-1||(n[0].focus(),e.preventDefault())}(this.dialog,t))},i.prototype._maintainFocus=function(t){var e=t.target.getAttribute("data-a11y-dialog-show") +this.shown&&!this.container.contains(t.target)&&e===this.container.id&&u(this.container)},"undefined"!=typeof document&&("loading"===document.readyState?document.addEventListener("DOMContentLoaded",s):window.requestAnimationFrame?window.requestAnimationFrame(s):window.setTimeout(s,16)) +const f=i},3305:(t,e)=>{"use strict" +e.byteLength=function(t){var e=c(t),n=e[0],r=e[1] +return 3*(n+r)/4-r},e.toByteArray=function(t){var e,n,o=c(t),a=o[0],u=o[1],s=new i(function(t,e,n){return 3*(e+n)/4-n}(0,a,u)),f=0,l=u>0?a-4:a +for(n=0;n>16&255,s[f++]=e>>8&255,s[f++]=255&e +return 2===u&&(e=r[t.charCodeAt(n)]<<2|r[t.charCodeAt(n+1)]>>4,s[f++]=255&e),1===u&&(e=r[t.charCodeAt(n)]<<10|r[t.charCodeAt(n+1)]<<4|r[t.charCodeAt(n+2)]>>2,s[f++]=e>>8&255,s[f++]=255&e),s},e.fromByteArray=function(t){for(var e,r=t.length,i=r%3,o=[],a=16383,u=0,c=r-i;uc?c:u+a)) +return 1===i?(e=t[r-1],o.push(n[e>>2]+n[e<<4&63]+"==")):2===i&&(e=(t[r-2]<<8)+t[r-1],o.push(n[e>>10]+n[e>>4&63]+n[e<<2&63]+"=")),o.join("")} +for(var n=[],r=[],i="undefined"!=typeof Uint8Array?Uint8Array:Array,o="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",a=0,u=o.length;a0)throw new Error("Invalid string. Length must be a multiple of 4") +var n=t.indexOf("=") +return-1===n&&(n=e),[n,n===e?0:4-n%4]}function s(t,e,r){for(var i,o,a=[],u=e;u>18&63]+n[o>>12&63]+n[o>>6&63]+n[63&o]) +return a.join("")}r["-".charCodeAt(0)]=62,r["_".charCodeAt(0)]=63},2309:function(t){var e +e=function(){return function(){var t={134:function(t,e,n){"use strict" +n.d(e,{default:function(){return m}}) +var r=n(279),i=n.n(r),o=n(370),a=n.n(o),u=n(817),c=n.n(u) +function s(t){return s="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},s(t)}var f=function(){function t(e){!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.resolveOptions(e),this.initSelection()}var n +return n=[{key:"resolveOptions",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{} +this.action=t.action,this.container=t.container,this.emitter=t.emitter,this.target=t.target,this.text=t.text,this.trigger=t.trigger,this.selectedText=""}},{key:"initSelection",value:function(){this.text?this.selectFake():this.target&&this.selectTarget()}},{key:"createFakeElement",value:function(){var t="rtl"===document.documentElement.getAttribute("dir") +this.fakeElem=document.createElement("textarea"),this.fakeElem.style.fontSize="12pt",this.fakeElem.style.border="0",this.fakeElem.style.padding="0",this.fakeElem.style.margin="0",this.fakeElem.style.position="absolute",this.fakeElem.style[t?"right":"left"]="-9999px" +var e=window.pageYOffset||document.documentElement.scrollTop +return this.fakeElem.style.top="".concat(e,"px"),this.fakeElem.setAttribute("readonly",""),this.fakeElem.value=this.text,this.fakeElem}},{key:"selectFake",value:function(){var t=this,e=this.createFakeElement() +this.fakeHandlerCallback=function(){return t.removeFake()},this.fakeHandler=this.container.addEventListener("click",this.fakeHandlerCallback)||!0,this.container.appendChild(e),this.selectedText=c()(e),this.copyText(),this.removeFake()}},{key:"removeFake",value:function(){this.fakeHandler&&(this.container.removeEventListener("click",this.fakeHandlerCallback),this.fakeHandler=null,this.fakeHandlerCallback=null),this.fakeElem&&(this.container.removeChild(this.fakeElem),this.fakeElem=null)}},{key:"selectTarget",value:function(){this.selectedText=c()(this.target),this.copyText()}},{key:"copyText",value:function(){var t +try{t=document.execCommand(this.action)}catch(e){t=!1}this.handleResult(t)}},{key:"handleResult",value:function(t){this.emitter.emit(t?"success":"error",{action:this.action,text:this.selectedText,trigger:this.trigger,clearSelection:this.clearSelection.bind(this)})}},{key:"clearSelection",value:function(){this.trigger&&this.trigger.focus(),document.activeElement.blur(),window.getSelection().removeAllRanges()}},{key:"destroy",value:function(){this.removeFake()}},{key:"action",set:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"copy" +if(this._action=t,"copy"!==this._action&&"cut"!==this._action)throw new Error('Invalid "action" value, use either "copy" or "cut"')},get:function(){return this._action}},{key:"target",set:function(t){if(void 0!==t){if(!t||"object"!==s(t)||1!==t.nodeType)throw new Error('Invalid "target" value, use a valid Element') +if("copy"===this.action&&t.hasAttribute("disabled"))throw new Error('Invalid "target" attribute. Please use "readonly" instead of "disabled" attribute') +if("cut"===this.action&&(t.hasAttribute("readonly")||t.hasAttribute("disabled")))throw new Error('Invalid "target" attribute. You can\'t cut text from elements with "readonly" or "disabled" attributes') +this._target=t}},get:function(){return this._target}}],n&&function(t,e){for(var n=0;n0&&void 0!==arguments[0]?arguments[0]:{} +this.action="function"==typeof t.action?t.action:this.defaultAction,this.target="function"==typeof t.target?t.target:this.defaultTarget,this.text="function"==typeof t.text?t.text:this.defaultText,this.container="object"===h(t.container)?t.container:document.body}},{key:"listenClick",value:function(t){var e=this +this.listener=a()(t,"click",(function(t){return e.onClick(t)}))}},{key:"onClick",value:function(t){var e=t.delegateTarget||t.currentTarget +this.clipboardAction&&(this.clipboardAction=null),this.clipboardAction=new l({action:this.action(e),target:this.target(e),text:this.text(e),container:this.container,trigger:e,emitter:this})}},{key:"defaultAction",value:function(t){return v("action",t)}},{key:"defaultTarget",value:function(t){var e=v("target",t) +if(e)return document.querySelector(e)}},{key:"defaultText",value:function(t){return v("text",t)}},{key:"destroy",value:function(){this.listener.destroy(),this.clipboardAction&&(this.clipboardAction.destroy(),this.clipboardAction=null)}}],r=[{key:"isSupported",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:["copy","cut"],e="string"==typeof t?[t]:t,n=!!document.queryCommandSupported +return e.forEach((function(t){n=n&&!!document.queryCommandSupported(t)})),n}}],n&&d(e.prototype,n),r&&d(e,r),c}(i()),m=g},828:function(t){if("undefined"!=typeof Element&&!Element.prototype.matches){var e=Element.prototype +e.matches=e.matchesSelector||e.mozMatchesSelector||e.msMatchesSelector||e.oMatchesSelector||e.webkitMatchesSelector}t.exports=function(t,e){for(;t&&9!==t.nodeType;){if("function"==typeof t.matches&&t.matches(e))return t +t=t.parentNode}}},438:function(t,e,n){var r=n(828) +function i(t,e,n,r,i){var a=o.apply(this,arguments) +return t.addEventListener(n,a,i),{destroy:function(){t.removeEventListener(n,a,i)}}}function o(t,e,n,i){return function(n){n.delegateTarget=r(n.target,e),n.delegateTarget&&i.call(t,n)}}t.exports=function(t,e,n,r,o){return"function"==typeof t.addEventListener?i.apply(null,arguments):"function"==typeof n?i.bind(null,document).apply(null,arguments):("string"==typeof t&&(t=document.querySelectorAll(t)),Array.prototype.map.call(t,(function(t){return i(t,e,n,r,o)})))}},879:function(t,e){e.node=function(t){return void 0!==t&&t instanceof HTMLElement&&1===t.nodeType},e.nodeList=function(t){var n=Object.prototype.toString.call(t) +return void 0!==t&&("[object NodeList]"===n||"[object HTMLCollection]"===n)&&"length"in t&&(0===t.length||e.node(t[0]))},e.string=function(t){return"string"==typeof t||t instanceof String},e.fn=function(t){return"[object Function]"===Object.prototype.toString.call(t)}},370:function(t,e,n){var r=n(879),i=n(438) +t.exports=function(t,e,n){if(!t&&!e&&!n)throw new Error("Missing required arguments") +if(!r.string(e))throw new TypeError("Second argument must be a String") +if(!r.fn(n))throw new TypeError("Third argument must be a Function") +if(r.node(t))return function(t,e,n){return t.addEventListener(e,n),{destroy:function(){t.removeEventListener(e,n)}}}(t,e,n) +if(r.nodeList(t))return function(t,e,n){return Array.prototype.forEach.call(t,(function(t){t.addEventListener(e,n)})),{destroy:function(){Array.prototype.forEach.call(t,(function(t){t.removeEventListener(e,n)}))}}}(t,e,n) +if(r.string(t))return function(t,e,n){return i(document.body,t,e,n)}(t,e,n) +throw new TypeError("First argument must be a String, HTMLElement, HTMLCollection, or NodeList")}},817:function(t){t.exports=function(t){var e +if("SELECT"===t.nodeName)t.focus(),e=t.value +else if("INPUT"===t.nodeName||"TEXTAREA"===t.nodeName){var n=t.hasAttribute("readonly") +n||t.setAttribute("readonly",""),t.select(),t.setSelectionRange(0,t.value.length),n||t.removeAttribute("readonly"),e=t.value}else{t.hasAttribute("contenteditable")&&t.focus() +var r=window.getSelection(),i=document.createRange() +i.selectNodeContents(t),r.removeAllRanges(),r.addRange(i),e=r.toString()}return e}},279:function(t){function e(){}e.prototype={on:function(t,e,n){var r=this.e||(this.e={}) +return(r[t]||(r[t]=[])).push({fn:e,ctx:n}),this},once:function(t,e,n){var r=this +function i(){r.off(t,i),e.apply(n,arguments)}return i._=e,this.on(t,i,n)},emit:function(t){for(var e=[].slice.call(arguments,1),n=((this.e||(this.e={}))[t]||[]).slice(),r=0,i=n.length;r{"use strict" +function r(t,e){return te?1:t>=e?0:NaN}n.d(e,{Z:()=>r})},4376:(t,e,n)=>{"use strict" +n.d(e,{Nw:()=>c,ZP:()=>f,ZR:()=>s,ml:()=>u}) +var r=n(7604),i=n(9354),o=n(9750) +const a=(0,i.Z)(r.Z),u=a.right,c=a.left,s=(0,i.Z)(o.Z).center,f=u},9354:(t,e,n)=>{"use strict" +n.d(e,{Z:()=>i}) +var r=n(7604) +function i(t){let e=t,n=t +function i(t,e,r,i){for(null==r&&(r=0),null==i&&(i=t.length);r>>1 +n(t[o],e)<0?r=o+1:i=o}return r}return 1===t.length&&(e=(e,n)=>t(e)-n,n=function(t){return(e,n)=>(0,r.Z)(t(e),n)}(t)),{left:i,center:function(t,n,r,o){null==r&&(r=0),null==o&&(o=t.length) +const a=i(t,n,r,o-1) +return a>r&&e(t[a-1],n)>-e(t[a],n)?a-1:a},right:function(t,e,r,i){for(null==r&&(r=0),null==i&&(i=t.length);r>>1 +n(t[o],e)>0?i=o:r=o+1}return r}}}},1286:(t,e,n)=>{"use strict" +n.r(e),n.d(e,{Adder:()=>v,InternMap:()=>_,InternSet:()=>w,ascending:()=>i.Z,bin:()=>q,bisect:()=>r.ZP,bisectCenter:()=>r.ZR,bisectLeft:()=>r.Nw,bisectRight:()=>r.ml,bisector:()=>o.Z,count:()=>a,cross:()=>l,cumsum:()=>h,descending:()=>d,deviation:()=>y,difference:()=>xt,disjoint:()=>At,every:()=>bt,extent:()=>b,fcumsum:()=>m,filter:()=>gt,fsum:()=>g,greatest:()=>ut,greatestIndex:()=>ct,group:()=>C,groupSort:()=>R,groups:()=>O,histogram:()=>q,index:()=>F,indexes:()=>T,intersection:()=>kt,least:()=>ot,leastIndex:()=>at,map:()=>mt,max:()=>G.Z,maxIndex:()=>K,mean:()=>W,median:()=>X,merge:()=>J,min:()=>Q.Z,minIndex:()=>tt,nice:()=>z,pairs:()=>et,permute:()=>j,quantile:()=>V.Z,quantileSorted:()=>V.s,quickselect:()=>rt.Z,range:()=>it.Z,reduce:()=>_t,reverse:()=>wt,rollup:()=>S,rollups:()=>M,scan:()=>st,shuffle:()=>ft,shuffler:()=>lt,some:()=>vt,sort:()=>N,subset:()=>Ct,sum:()=>ht,superset:()=>Dt,thresholdFreedmanDiaconis:()=>H,thresholdScott:()=>Y,thresholdSturges:()=>Z,tickIncrement:()=>U.G9,tickStep:()=>U.ly,ticks:()=>U.ZP,transpose:()=>dt,union:()=>Ot,variance:()=>p,zip:()=>yt}) +var r=n(4376),i=n(7604),o=n(9354) +function a(t,e){let n=0 +if(void 0===e)for(let r of t)null!=r&&(r=+r)>=r&&++n +else{let r=-1 +for(let i of t)null!=(i=e(i,++r,t))&&(i=+i)>=i&&++n}return n}function u(t){return 0|t.length}function c(t){return!(t>0)}function s(t){return"object"!=typeof t||"length"in t?t:Array.from(t)}function f(t){return e=>t(...e)}function l(){for(var t=arguments.length,e=new Array(t),n=0;ne[n][t]))) +let t=o +for(;++a[t]===i[t];){if(0===t)return r?l.map(r):l +a[t--]=0}}}function h(t,e){var n=0,r=0 +return Float64Array.from(t,void 0===e?t=>n+=+t||0:i=>n+=+e(i,r++,t)||0)}function d(t,e){return et?1:e>=t?0:NaN}function p(t,e){let n,r=0,i=0,o=0 +if(void 0===e)for(let a of t)null!=a&&(a=+a)>=a&&(n=a-i,i+=n/++r,o+=n*(a-i)) +else{let a=-1 +for(let u of t)null!=(u=e(u,++a,t))&&(u=+u)>=u&&(n=u-i,i+=n/++r,o+=n*(u-i))}if(r>1)return o/(r-1)}function y(t,e){const n=p(t,e) +return n?Math.sqrt(n):n}function b(t,e){let n,r +if(void 0===e)for(const i of t)null!=i&&(void 0===n?i>=i&&(n=r=i):(n>i&&(n=i),r=o&&(n=r=o):(n>o&&(n=o),r0){for(o=t[--i];i>0&&(e=o,n=t[--i],o=e+n,r=n-(o-e),!r););i>0&&(r<0&&t[i-1]<0||r>0&&t[i-1]>0)&&(n=2*r,e=o+n,n==e-o&&(o=e))}return o}}function g(t,e){const n=new v +if(void 0===e)for(let r of t)(r=+r)&&n.add(r) +else{let r=-1 +for(let i of t)(i=+e(i,++r,t))&&n.add(i)}return+n}function m(t,e){const n=new v +let r=-1 +return Float64Array.from(t,void 0===e?t=>n.add(+t||0):i=>n.add(+e(i,++r,t)||0))}class _ extends Map{constructor(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:k +if(super(),Object.defineProperties(this,{_intern:{value:new Map},_key:{value:e}}),null!=t)for(const[n,r]of t)this.set(n,r)}get(t){return super.get(x(this,t))}has(t){return super.has(x(this,t))}set(t,e){return super.set(A(this,t),e)}delete(t){return super.delete(E(this,t))}}class w extends Set{constructor(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:k +if(super(),Object.defineProperties(this,{_intern:{value:new Map},_key:{value:e}}),null!=t)for(const n of t)this.add(n)}has(t){return super.has(x(this,t))}add(t){return super.add(A(this,t))}delete(t){return super.delete(E(this,t))}}function x(t,e){let{_intern:n,_key:r}=t +const i=r(e) +return n.has(i)?n.get(i):e}function A(t,e){let{_intern:n,_key:r}=t +const i=r(e) +return n.has(i)?n.get(i):(n.set(i,e),e)}function E(t,e){let{_intern:n,_key:r}=t +const i=r(e) +return n.has(i)&&(e=n.get(e),n.delete(i)),e}function k(t){return null!==t&&"object"==typeof t?t.valueOf():t}function D(t){return t}function C(t){for(var e=arguments.length,n=new Array(e>1?e-1:0),r=1;r1?e-1:0),r=1;r2?n-2:0),i=2;i2?n-2:0),i=2;i1?e-1:0),r=1;r1?e-1:0),r=1;r=r.length)return n(i) +const a=new _,u=r[o++] +let c=-1 +for(const e of i){const t=u(e,++c,i),n=a.get(t) +n?n.push(e):a.set(t,[e])}for(const[e,n]of a)a.set(e,t(n,o)) +return e(a)}(t,0)}function j(t,e){return Array.from(e,(e=>t[e]))}function N(t){for(var e=arguments.length,n=new Array(e>1?e-1:0),r=1;r1){const e=Uint32Array.from(t,((t,e)=>e)) +return n.length>1?(n=n.map((e=>t.map(e))),e.sort(((t,e)=>{for(const r of n){const n=(0,i.Z)(r[t],r[e]) +if(n)return n}}))):(o=t.map(o),e.sort(((t,e)=>(0,i.Z)(o[t],o[e])))),j(t,e)}return t.sort(o)}function R(t,e,n){return(1===e.length?N(S(t,e,n),((t,e)=>{let[n,r]=t,[o,a]=e +return(0,i.Z)(r,a)||(0,i.Z)(n,o)})):N(C(t,n),((t,n)=>{let[r,o]=t,[a,u]=n +return e(o,u)||(0,i.Z)(r,a)}))).map((t=>{let[e]=t +return e}))}var L=Array.prototype,I=L.slice +function $(t){return function(){return t}}L.map +var U=n(458) +function z(t,e,n){let r +for(;;){const i=(0,U.G9)(t,e,n) +if(i===r||0===i||!isFinite(i))return[t,e] +i>0?(t=Math.floor(t/i)*i,e=Math.ceil(e/i)*i):i<0&&(t=Math.ceil(t*i)/i,e=Math.floor(e*i)/i),r=i}}function Z(t){return Math.ceil(Math.log(a(t))/Math.LN2)+1}function q(){var t=D,e=b,n=Z +function i(i){Array.isArray(i)||(i=Array.from(i)) +var o,a,u=i.length,c=new Array(u) +for(o=0;o=l)if(t>=l&&e===b){const t=(0,U.G9)(f,l,n) +isFinite(t)&&(t>0?l=(Math.floor(l/t)+1)*t:t<0&&(l=(Math.ceil(l*-t)+1)/-t))}else h.pop()}for(var d=h.length;h[0]<=f;)h.shift(),--d +for(;h[d-1]>l;)h.pop(),--d +var p,y=new Array(d+1) +for(o=0;o<=d;++o)(p=y[o]=[]).x0=o>0?h[o-1]:f,p.x1=o=o)&&(n=o,r=i) +else for(let o of t)null!=(o=e(o,++i,t))&&(n=o)&&(n=o,r=i) +return r}function W(t,e){let n=0,r=0 +if(void 0===e)for(let i of t)null!=i&&(i=+i)>=i&&(++n,r+=i) +else{let i=-1 +for(let o of t)null!=(o=e(o,++i,t))&&(o=+o)>=o&&(++n,r+=o)}if(n)return r/n}function X(t,e){return(0,V.Z)(t,.5,e)}function J(t){return Array.from(function*(t){for(const e of t)yield*e}(t))}var Q=n(4007) +function tt(t,e){let n,r=-1,i=-1 +if(void 0===e)for(const o of t)++i,null!=o&&(n>o||void 0===n&&o>=o)&&(n=o,r=i) +else for(let o of t)null!=(o=e(o,++i,t))&&(n>o||void 0===n&&o>=o)&&(n=o,r=i) +return r}function et(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:nt +const n=[] +let r,i=!1 +for(const o of t)i&&n.push(e(r,o)),r=o,i=!0 +return n}function nt(t,e){return[t,e]}var rt=n(3767),it=n(1204) +function ot(t){let e,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:i.Z,r=!1 +if(1===n.length){let o +for(const a of t){const t=n(a);(r?(0,i.Z)(t,o)<0:0===(0,i.Z)(t,t))&&(e=a,o=t,r=!0)}}else for(const i of t)(r?n(i,e)<0:0===n(i,i))&&(e=i,r=!0) +return e}function at(t){let e,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:i.Z +if(1===n.length)return tt(t,n) +let r=-1,o=-1 +for(const i of t)++o,(r<0?0===n(i,i):n(i,e)<0)&&(e=i,r=o) +return r}function ut(t){let e,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:i.Z,r=!1 +if(1===n.length){let o +for(const a of t){const t=n(a);(r?(0,i.Z)(t,o)>0:0===(0,i.Z)(t,t))&&(e=a,o=t,r=!0)}}else for(const i of t)(r?n(i,e)>0:0===n(i,i))&&(e=i,r=!0) +return e}function ct(t){let e,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:i.Z +if(1===n.length)return K(t,n) +let r=-1,o=-1 +for(const i of t)++o,(r<0?0===n(i,i):n(i,e)>0)&&(e=i,r=o) +return r}function st(t,e){const n=at(t,e) +return n<0?void 0:n}const ft=lt(Math.random) +function lt(t){return function(e){let n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:e.length,i=r-(n=+n) +for(;i;){const r=t()*i--|0,o=e[i+n] +e[i+n]=e[r+n],e[r+n]=o}return e}}function ht(t,e){let n=0 +if(void 0===e)for(let r of t)(r=+r)&&(n+=r) +else{let r=-1 +for(let i of t)(i=+e(i,++r,t))&&(n+=i)}return n}function dt(t){if(!(i=t.length))return[] +for(var e=-1,n=(0,Q.Z)(t,pt),r=new Array(n);++ee(n,r,t)))}function _t(t,e,n){if("function"!=typeof e)throw new TypeError("reducer is not a function") +const r=t[Symbol.iterator]() +let i,o,a=-1 +if(arguments.length<3){if(({done:i,value:n}=r.next()),i)return;++a}for(;({done:i,value:o}=r.next()),!i;)n=e(n,o,++a,t) +return n}function wt(t){if("function"!=typeof t[Symbol.iterator])throw new TypeError("values is not iterable") +return Array.from(t).reverse()}function xt(t){t=new Set(t) +for(var e=arguments.length,n=new Array(e>1?e-1:0),r=1;r1?e-1:0),r=1;r{"use strict" +function r(t,e){let n +if(void 0===e)for(const r of t)null!=r&&(n=r)&&(n=r) +else{let r=-1 +for(let i of t)null!=(i=e(i,++r,t))&&(n=i)&&(n=i)}return n}n.d(e,{Z:()=>r})},4007:(t,e,n)=>{"use strict" +function r(t,e){let n +if(void 0===e)for(const r of t)null!=r&&(n>r||void 0===n&&r>=r)&&(n=r) +else{let r=-1 +for(let i of t)null!=(i=e(i,++r,t))&&(n>i||void 0===n&&i>=i)&&(n=i)}return n}n.d(e,{Z:()=>r})},9750:(t,e,n)=>{"use strict" +function r(t){return null===t?NaN:+t}function*i(t,e){if(void 0===e)for(let n of t)null!=n&&(n=+n)>=n&&(yield n) +else{let n=-1 +for(let r of t)null!=(r=e(r,++n,t))&&(r=+r)>=r&&(yield r)}}n.d(e,{K:()=>i,Z:()=>r})},801:(t,e,n)=>{"use strict" +n.d(e,{Z:()=>u,s:()=>c}) +var r=n(2368),i=n(4007),o=n(3767),a=n(9750) +function u(t,e,n){if(u=(t=Float64Array.from((0,a.K)(t,n))).length){if((e=+e)<=0||u<2)return(0,i.Z)(t) +if(e>=1)return(0,r.Z)(t) +var u,c=(u-1)*e,s=Math.floor(c),f=(0,r.Z)((0,o.Z)(t,s).subarray(0,s+1)) +return f+((0,i.Z)(t.subarray(s+1))-f)*(c-s)}}function c(t,e){let n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:a.Z +if(r=t.length){if((e=+e)<=0||r<2)return+n(t[0],0,t) +if(e>=1)return+n(t[r-1],r-1,t) +var r,i=(r-1)*e,o=Math.floor(i),u=+n(t[o],o,t),c=+n(t[o+1],o+1,t) +return u+(c-u)*(i-o)}}},3767:(t,e,n)=>{"use strict" +n.d(e,{Z:()=>i}) +var r=n(7604) +function i(t,e){let n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:0,a=arguments.length>3&&void 0!==arguments[3]?arguments[3]:t.length-1,u=arguments.length>4&&void 0!==arguments[4]?arguments[4]:r.Z +for(;a>n;){if(a-n>600){const r=a-n+1,o=e-n+1,c=Math.log(r),s=.5*Math.exp(2*c/3),f=.5*Math.sqrt(c*s*(r-s)/r)*(o-r/2<0?-1:1) +i(t,e,Math.max(n,Math.floor(e-o*s/r+f)),Math.min(a,Math.floor(e+(r-o)*s/r+f)),u)}const r=t[e] +let c=n,s=a +for(o(t,n,e),u(t[a],r)>0&&o(t,n,a);c0;)--s}0===u(t[n],r)?o(t,n,s):(++s,o(t,s,a)),s<=e&&(n=s+1),e<=s&&(a=s-1)}return t}function o(t,e,n){const r=t[e] +t[e]=t[n],t[n]=r}},1204:(t,e,n)=>{"use strict" +function r(t,e,n){t=+t,e=+e,n=(i=arguments.length)<2?(e=t,t=0,1):i<3?1:+n +for(var r=-1,i=0|Math.max(0,Math.ceil((e-t)/n)),o=new Array(i);++rr})},458:(t,e,n)=>{"use strict" +n.d(e,{G9:()=>u,ZP:()=>a,ly:()=>c}) +var r=Math.sqrt(50),i=Math.sqrt(10),o=Math.sqrt(2) +function a(t,e,n){var r,i,o,a,c=-1 +if(n=+n,(t=+t)==(e=+e)&&n>0)return[t] +if((r=e0)for(t=Math.ceil(t/a),e=Math.floor(e/a),o=new Array(i=Math.ceil(e-t+1));++c=0?(c>=r?10:c>=i?5:c>=o?2:1)*Math.pow(10,u):-Math.pow(10,-u)/(c>=r?10:c>=i?5:c>=o?2:1)}function c(t,e,n){var a=Math.abs(e-t)/Math.max(0,n),u=Math.pow(10,Math.floor(Math.log(a)/Math.LN10)),c=a/u +return c>=r?u*=10:c>=i?u*=5:c>=o&&(u*=2),e{"use strict" +n.d(e,{B8:()=>E,Il:()=>i,J5:()=>a,SU:()=>A,Ss:()=>k,ZP:()=>_,xV:()=>o}) +var r=n(1572) +function i(){}var o=.7,a=1/o,u="\\s*([+-]?\\d+)\\s*",c="\\s*([+-]?\\d*\\.?\\d+(?:[eE][+-]?\\d+)?)\\s*",s="\\s*([+-]?\\d*\\.?\\d+(?:[eE][+-]?\\d+)?)%\\s*",f=/^#([0-9a-f]{3,8})$/,l=new RegExp("^rgb\\("+[u,u,u]+"\\)$"),h=new RegExp("^rgb\\("+[s,s,s]+"\\)$"),d=new RegExp("^rgba\\("+[u,u,u,c]+"\\)$"),p=new RegExp("^rgba\\("+[s,s,s,c]+"\\)$"),y=new RegExp("^hsl\\("+[c,s,s]+"\\)$"),b=new RegExp("^hsla\\("+[c,s,s,c]+"\\)$"),v={aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,rebeccapurple:6697881,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074} +function g(){return this.rgb().formatHex()}function m(){return this.rgb().formatRgb()}function _(t){var e,n +return t=(t+"").trim().toLowerCase(),(e=f.exec(t))?(n=e[1].length,e=parseInt(e[1],16),6===n?w(e):3===n?new k(e>>8&15|e>>4&240,e>>4&15|240&e,(15&e)<<4|15&e,1):8===n?x(e>>24&255,e>>16&255,e>>8&255,(255&e)/255):4===n?x(e>>12&15|e>>8&240,e>>8&15|e>>4&240,e>>4&15|240&e,((15&e)<<4|15&e)/255):null):(e=l.exec(t))?new k(e[1],e[2],e[3],1):(e=h.exec(t))?new k(255*e[1]/100,255*e[2]/100,255*e[3]/100,1):(e=d.exec(t))?x(e[1],e[2],e[3],e[4]):(e=p.exec(t))?x(255*e[1]/100,255*e[2]/100,255*e[3]/100,e[4]):(e=y.exec(t))?S(e[1],e[2]/100,e[3]/100,1):(e=b.exec(t))?S(e[1],e[2]/100,e[3]/100,e[4]):v.hasOwnProperty(t)?w(v[t]):"transparent"===t?new k(NaN,NaN,NaN,0):null}function w(t){return new k(t>>16&255,t>>8&255,255&t,1)}function x(t,e,n,r){return r<=0&&(t=e=n=NaN),new k(t,e,n,r)}function A(t){return t instanceof i||(t=_(t)),t?new k((t=t.rgb()).r,t.g,t.b,t.opacity):new k}function E(t,e,n,r){return 1===arguments.length?A(t):new k(t,e,n,null==r?1:r)}function k(t,e,n,r){this.r=+t,this.g=+e,this.b=+n,this.opacity=+r}function D(){return"#"+O(this.r)+O(this.g)+O(this.b)}function C(){var t=this.opacity +return(1===(t=isNaN(t)?1:Math.max(0,Math.min(1,t)))?"rgb(":"rgba(")+Math.max(0,Math.min(255,Math.round(this.r)||0))+", "+Math.max(0,Math.min(255,Math.round(this.g)||0))+", "+Math.max(0,Math.min(255,Math.round(this.b)||0))+(1===t?")":", "+t+")")}function O(t){return((t=Math.max(0,Math.min(255,Math.round(t)||0)))<16?"0":"")+t.toString(16)}function S(t,e,n,r){return r<=0?t=e=n=NaN:n<=0||n>=1?t=e=NaN:e<=0&&(t=NaN),new F(t,e,n,r)}function M(t){if(t instanceof F)return new F(t.h,t.s,t.l,t.opacity) +if(t instanceof i||(t=_(t)),!t)return new F +if(t instanceof F)return t +var e=(t=t.rgb()).r/255,n=t.g/255,r=t.b/255,o=Math.min(e,n,r),a=Math.max(e,n,r),u=NaN,c=a-o,s=(a+o)/2 +return c?(u=e===a?(n-r)/c+6*(n0&&s<1?0:u,new F(u,c,s,t.opacity)}function F(t,e,n,r){this.h=+t,this.s=+e,this.l=+n,this.opacity=+r}function T(t,e,n){return 255*(t<60?e+(n-e)*t/60:t<180?n:t<240?e+(n-e)*(240-t)/60:e)}(0,r.Z)(i,_,{copy:function(t){return Object.assign(new this.constructor,this,t)},displayable:function(){return this.rgb().displayable()},hex:g,formatHex:g,formatHsl:function(){return M(this).formatHsl()},formatRgb:m,toString:m}),(0,r.Z)(k,E,(0,r.l)(i,{brighter:function(t){return t=null==t?a:Math.pow(a,t),new k(this.r*t,this.g*t,this.b*t,this.opacity)},darker:function(t){return t=null==t?o:Math.pow(o,t),new k(this.r*t,this.g*t,this.b*t,this.opacity)},rgb:function(){return this},displayable:function(){return-.5<=this.r&&this.r<255.5&&-.5<=this.g&&this.g<255.5&&-.5<=this.b&&this.b<255.5&&0<=this.opacity&&this.opacity<=1},hex:D,formatHex:D,formatRgb:C,toString:C})),(0,r.Z)(F,(function(t,e,n,r){return 1===arguments.length?M(t):new F(t,e,n,null==r?1:r)}),(0,r.l)(i,{brighter:function(t){return t=null==t?a:Math.pow(a,t),new F(this.h,this.s,this.l*t,this.opacity)},darker:function(t){return t=null==t?o:Math.pow(o,t),new F(this.h,this.s,this.l*t,this.opacity)},rgb:function(){var t=this.h%360+360*(this.h<0),e=isNaN(t)||isNaN(this.s)?0:this.s,n=this.l,r=n+(n<.5?n:1-n)*e,i=2*n-r +return new k(T(t>=240?t-240:t+120,i,r),T(t,i,r),T(t<120?t+240:t-120,i,r),this.opacity)},displayable:function(){return(0<=this.s&&this.s<=1||isNaN(this.s))&&0<=this.l&&this.l<=1&&0<=this.opacity&&this.opacity<=1},formatHsl:function(){var t=this.opacity +return(1===(t=isNaN(t)?1:Math.max(0,Math.min(1,t)))?"hsl(":"hsla(")+(this.h||0)+", "+100*(this.s||0)+"%, "+100*(this.l||0)+"%"+(1===t?")":", "+t+")")}}))},1572:(t,e,n)=>{"use strict" +function r(t,e,n){t.prototype=e.prototype=n,n.constructor=t}function i(t,e){var n=Object.create(t.prototype) +for(var r in e)n[r]=e[r] +return n}n.d(e,{Z:()=>r,l:()=>i})},901:(t,e,n)=>{"use strict" +n.d(e,{ZP:()=>u,wx:()=>o,yi:()=>a}) +var r=n(6436) +function i(t,e){return function(n){return t+n*e}}function o(t,e){var n=e-t +return n?i(t,n>180||n<-180?n-360*Math.round(n/360):n):(0,r.Z)(isNaN(t)?e:t)}function a(t){return 1==(t=+t)?u:function(e,n){return n-e?function(t,e,n){return t=Math.pow(t,n),e=Math.pow(e,n)-t,n=1/n,function(r){return Math.pow(t+r*e,n)}}(e,n,t):(0,r.Z)(isNaN(e)?n:e)}}function u(t,e){var n=e-t +return n?i(t,n):(0,r.Z)(isNaN(t)?e:t)}},6436:(t,e,n)=>{"use strict" +n.d(e,{Z:()=>r}) +const r=t=>()=>t},9663:(t,e,n)=>{"use strict" +n.d(e,{ZP:()=>a,hD:()=>c}) +var r=n(7128) +function i(t,e,n,r,i){var o=t*t,a=o*t +return((1-3*t+3*o-a)*e+(4-6*o+3*a)*n+(1+3*t+3*o-3*a)*r+a*i)/6}var o=n(901) +const a=function t(e){var n=(0,o.yi)(e) +function i(t,e){var i=n((t=(0,r.B8)(t)).r,(e=(0,r.B8)(e)).r),a=n(t.g,e.g),u=n(t.b,e.b),c=(0,o.ZP)(t.opacity,e.opacity) +return function(e){return t.r=i(e),t.g=a(e),t.b=u(e),t.opacity=c(e),t+""}}return i.gamma=t,i}(1) +function u(t){return function(e){var n,i,o=e.length,a=new Array(o),u=new Array(o),c=new Array(o) +for(n=0;n=1?(n=1,e-1):Math.floor(n*e),o=t[r],a=t[r+1],u=r>0?t[r-1]:2*o-a,c=r{"use strict" +function r(t){for(var e=t.length/6|0,n=new Array(e),r=0;rot,interpolateBrBG:()=>v,interpolateBuGn:()=>j,interpolateBuPu:()=>R,interpolateCividis:()=>bt,interpolateCool:()=>Rt,interpolateCubehelixDefault:()=>jt,interpolateGnBu:()=>I,interpolateGreens:()=>ut,interpolateGreys:()=>st,interpolateInferno:()=>Gt,interpolateMagma:()=>Yt,interpolateOrRd:()=>U,interpolateOranges:()=>yt,interpolatePRGn:()=>m,interpolatePiYG:()=>w,interpolatePlasma:()=>Kt,interpolatePuBu:()=>V,interpolatePuBuGn:()=>Z,interpolatePuOr:()=>A,interpolatePuRd:()=>Y,interpolatePurples:()=>lt,interpolateRainbow:()=>It,interpolateRdBu:()=>k,interpolateRdGy:()=>C,interpolateRdPu:()=>K,interpolateRdYlBu:()=>S,interpolateRdYlGn:()=>F,interpolateReds:()=>dt,interpolateSinebow:()=>Zt,interpolateSpectral:()=>B,interpolateTurbo:()=>qt,interpolateViridis:()=>Ht,interpolateWarm:()=>Nt,interpolateYlGn:()=>Q,interpolateYlGnBu:()=>X,interpolateYlOrBr:()=>et,interpolateYlOrRd:()=>rt,schemeAccent:()=>o,schemeBlues:()=>it,schemeBrBG:()=>b,schemeBuGn:()=>P,schemeBuPu:()=>N,schemeCategory10:()=>i,schemeDark2:()=>a,schemeGnBu:()=>L,schemeGreens:()=>at,schemeGreys:()=>ct,schemeOrRd:()=>$,schemeOranges:()=>pt,schemePRGn:()=>g,schemePaired:()=>u,schemePastel1:()=>c,schemePastel2:()=>s,schemePiYG:()=>_,schemePuBu:()=>q,schemePuBuGn:()=>z,schemePuOr:()=>x,schemePuRd:()=>H,schemePurples:()=>ft,schemeRdBu:()=>E,schemeRdGy:()=>D,schemeRdPu:()=>G,schemeRdYlBu:()=>O,schemeRdYlGn:()=>M,schemeReds:()=>ht,schemeSet1:()=>f,schemeSet2:()=>l,schemeSet3:()=>h,schemeSpectral:()=>T,schemeTableau10:()=>d,schemeYlGn:()=>J,schemeYlGnBu:()=>W,schemeYlOrBr:()=>tt,schemeYlOrRd:()=>nt}) +const i=r("1f77b4ff7f0e2ca02cd627289467bd8c564be377c27f7f7fbcbd2217becf"),o=r("7fc97fbeaed4fdc086ffff99386cb0f0027fbf5b17666666"),a=r("1b9e77d95f027570b3e7298a66a61ee6ab02a6761d666666"),u=r("a6cee31f78b4b2df8a33a02cfb9a99e31a1cfdbf6fff7f00cab2d66a3d9affff99b15928"),c=r("fbb4aeb3cde3ccebc5decbe4fed9a6ffffcce5d8bdfddaecf2f2f2"),s=r("b3e2cdfdcdaccbd5e8f4cae4e6f5c9fff2aef1e2cccccccc"),f=r("e41a1c377eb84daf4a984ea3ff7f00ffff33a65628f781bf999999"),l=r("66c2a5fc8d628da0cbe78ac3a6d854ffd92fe5c494b3b3b3"),h=r("8dd3c7ffffb3bebadafb807280b1d3fdb462b3de69fccde5d9d9d9bc80bdccebc5ffed6f"),d=r("4e79a7f28e2ce1575976b7b259a14fedc949af7aa1ff9da79c755fbab0ab") +var p=n(9663) +const y=t=>(0,p.hD)(t[t.length-1]) +var b=new Array(3).concat("d8b365f5f5f55ab4ac","a6611adfc27d80cdc1018571","a6611adfc27df5f5f580cdc1018571","8c510ad8b365f6e8c3c7eae55ab4ac01665e","8c510ad8b365f6e8c3f5f5f5c7eae55ab4ac01665e","8c510abf812ddfc27df6e8c3c7eae580cdc135978f01665e","8c510abf812ddfc27df6e8c3f5f5f5c7eae580cdc135978f01665e","5430058c510abf812ddfc27df6e8c3c7eae580cdc135978f01665e003c30","5430058c510abf812ddfc27df6e8c3f5f5f5c7eae580cdc135978f01665e003c30").map(r) +const v=y(b) +var g=new Array(3).concat("af8dc3f7f7f77fbf7b","7b3294c2a5cfa6dba0008837","7b3294c2a5cff7f7f7a6dba0008837","762a83af8dc3e7d4e8d9f0d37fbf7b1b7837","762a83af8dc3e7d4e8f7f7f7d9f0d37fbf7b1b7837","762a839970abc2a5cfe7d4e8d9f0d3a6dba05aae611b7837","762a839970abc2a5cfe7d4e8f7f7f7d9f0d3a6dba05aae611b7837","40004b762a839970abc2a5cfe7d4e8d9f0d3a6dba05aae611b783700441b","40004b762a839970abc2a5cfe7d4e8f7f7f7d9f0d3a6dba05aae611b783700441b").map(r) +const m=y(g) +var _=new Array(3).concat("e9a3c9f7f7f7a1d76a","d01c8bf1b6dab8e1864dac26","d01c8bf1b6daf7f7f7b8e1864dac26","c51b7de9a3c9fde0efe6f5d0a1d76a4d9221","c51b7de9a3c9fde0eff7f7f7e6f5d0a1d76a4d9221","c51b7dde77aef1b6dafde0efe6f5d0b8e1867fbc414d9221","c51b7dde77aef1b6dafde0eff7f7f7e6f5d0b8e1867fbc414d9221","8e0152c51b7dde77aef1b6dafde0efe6f5d0b8e1867fbc414d9221276419","8e0152c51b7dde77aef1b6dafde0eff7f7f7e6f5d0b8e1867fbc414d9221276419").map(r) +const w=y(_) +var x=new Array(3).concat("998ec3f7f7f7f1a340","5e3c99b2abd2fdb863e66101","5e3c99b2abd2f7f7f7fdb863e66101","542788998ec3d8daebfee0b6f1a340b35806","542788998ec3d8daebf7f7f7fee0b6f1a340b35806","5427888073acb2abd2d8daebfee0b6fdb863e08214b35806","5427888073acb2abd2d8daebf7f7f7fee0b6fdb863e08214b35806","2d004b5427888073acb2abd2d8daebfee0b6fdb863e08214b358067f3b08","2d004b5427888073acb2abd2d8daebf7f7f7fee0b6fdb863e08214b358067f3b08").map(r) +const A=y(x) +var E=new Array(3).concat("ef8a62f7f7f767a9cf","ca0020f4a58292c5de0571b0","ca0020f4a582f7f7f792c5de0571b0","b2182bef8a62fddbc7d1e5f067a9cf2166ac","b2182bef8a62fddbc7f7f7f7d1e5f067a9cf2166ac","b2182bd6604df4a582fddbc7d1e5f092c5de4393c32166ac","b2182bd6604df4a582fddbc7f7f7f7d1e5f092c5de4393c32166ac","67001fb2182bd6604df4a582fddbc7d1e5f092c5de4393c32166ac053061","67001fb2182bd6604df4a582fddbc7f7f7f7d1e5f092c5de4393c32166ac053061").map(r) +const k=y(E) +var D=new Array(3).concat("ef8a62ffffff999999","ca0020f4a582bababa404040","ca0020f4a582ffffffbababa404040","b2182bef8a62fddbc7e0e0e09999994d4d4d","b2182bef8a62fddbc7ffffffe0e0e09999994d4d4d","b2182bd6604df4a582fddbc7e0e0e0bababa8787874d4d4d","b2182bd6604df4a582fddbc7ffffffe0e0e0bababa8787874d4d4d","67001fb2182bd6604df4a582fddbc7e0e0e0bababa8787874d4d4d1a1a1a","67001fb2182bd6604df4a582fddbc7ffffffe0e0e0bababa8787874d4d4d1a1a1a").map(r) +const C=y(D) +var O=new Array(3).concat("fc8d59ffffbf91bfdb","d7191cfdae61abd9e92c7bb6","d7191cfdae61ffffbfabd9e92c7bb6","d73027fc8d59fee090e0f3f891bfdb4575b4","d73027fc8d59fee090ffffbfe0f3f891bfdb4575b4","d73027f46d43fdae61fee090e0f3f8abd9e974add14575b4","d73027f46d43fdae61fee090ffffbfe0f3f8abd9e974add14575b4","a50026d73027f46d43fdae61fee090e0f3f8abd9e974add14575b4313695","a50026d73027f46d43fdae61fee090ffffbfe0f3f8abd9e974add14575b4313695").map(r) +const S=y(O) +var M=new Array(3).concat("fc8d59ffffbf91cf60","d7191cfdae61a6d96a1a9641","d7191cfdae61ffffbfa6d96a1a9641","d73027fc8d59fee08bd9ef8b91cf601a9850","d73027fc8d59fee08bffffbfd9ef8b91cf601a9850","d73027f46d43fdae61fee08bd9ef8ba6d96a66bd631a9850","d73027f46d43fdae61fee08bffffbfd9ef8ba6d96a66bd631a9850","a50026d73027f46d43fdae61fee08bd9ef8ba6d96a66bd631a9850006837","a50026d73027f46d43fdae61fee08bffffbfd9ef8ba6d96a66bd631a9850006837").map(r) +const F=y(M) +var T=new Array(3).concat("fc8d59ffffbf99d594","d7191cfdae61abdda42b83ba","d7191cfdae61ffffbfabdda42b83ba","d53e4ffc8d59fee08be6f59899d5943288bd","d53e4ffc8d59fee08bffffbfe6f59899d5943288bd","d53e4ff46d43fdae61fee08be6f598abdda466c2a53288bd","d53e4ff46d43fdae61fee08bffffbfe6f598abdda466c2a53288bd","9e0142d53e4ff46d43fdae61fee08be6f598abdda466c2a53288bd5e4fa2","9e0142d53e4ff46d43fdae61fee08bffffbfe6f598abdda466c2a53288bd5e4fa2").map(r) +const B=y(T) +var P=new Array(3).concat("e5f5f999d8c92ca25f","edf8fbb2e2e266c2a4238b45","edf8fbb2e2e266c2a42ca25f006d2c","edf8fbccece699d8c966c2a42ca25f006d2c","edf8fbccece699d8c966c2a441ae76238b45005824","f7fcfde5f5f9ccece699d8c966c2a441ae76238b45005824","f7fcfde5f5f9ccece699d8c966c2a441ae76238b45006d2c00441b").map(r) +const j=y(P) +var N=new Array(3).concat("e0ecf49ebcda8856a7","edf8fbb3cde38c96c688419d","edf8fbb3cde38c96c68856a7810f7c","edf8fbbfd3e69ebcda8c96c68856a7810f7c","edf8fbbfd3e69ebcda8c96c68c6bb188419d6e016b","f7fcfde0ecf4bfd3e69ebcda8c96c68c6bb188419d6e016b","f7fcfde0ecf4bfd3e69ebcda8c96c68c6bb188419d810f7c4d004b").map(r) +const R=y(N) +var L=new Array(3).concat("e0f3dba8ddb543a2ca","f0f9e8bae4bc7bccc42b8cbe","f0f9e8bae4bc7bccc443a2ca0868ac","f0f9e8ccebc5a8ddb57bccc443a2ca0868ac","f0f9e8ccebc5a8ddb57bccc44eb3d32b8cbe08589e","f7fcf0e0f3dbccebc5a8ddb57bccc44eb3d32b8cbe08589e","f7fcf0e0f3dbccebc5a8ddb57bccc44eb3d32b8cbe0868ac084081").map(r) +const I=y(L) +var $=new Array(3).concat("fee8c8fdbb84e34a33","fef0d9fdcc8afc8d59d7301f","fef0d9fdcc8afc8d59e34a33b30000","fef0d9fdd49efdbb84fc8d59e34a33b30000","fef0d9fdd49efdbb84fc8d59ef6548d7301f990000","fff7ecfee8c8fdd49efdbb84fc8d59ef6548d7301f990000","fff7ecfee8c8fdd49efdbb84fc8d59ef6548d7301fb300007f0000").map(r) +const U=y($) +var z=new Array(3).concat("ece2f0a6bddb1c9099","f6eff7bdc9e167a9cf02818a","f6eff7bdc9e167a9cf1c9099016c59","f6eff7d0d1e6a6bddb67a9cf1c9099016c59","f6eff7d0d1e6a6bddb67a9cf3690c002818a016450","fff7fbece2f0d0d1e6a6bddb67a9cf3690c002818a016450","fff7fbece2f0d0d1e6a6bddb67a9cf3690c002818a016c59014636").map(r) +const Z=y(z) +var q=new Array(3).concat("ece7f2a6bddb2b8cbe","f1eef6bdc9e174a9cf0570b0","f1eef6bdc9e174a9cf2b8cbe045a8d","f1eef6d0d1e6a6bddb74a9cf2b8cbe045a8d","f1eef6d0d1e6a6bddb74a9cf3690c00570b0034e7b","fff7fbece7f2d0d1e6a6bddb74a9cf3690c00570b0034e7b","fff7fbece7f2d0d1e6a6bddb74a9cf3690c00570b0045a8d023858").map(r) +const V=y(q) +var H=new Array(3).concat("e7e1efc994c7dd1c77","f1eef6d7b5d8df65b0ce1256","f1eef6d7b5d8df65b0dd1c77980043","f1eef6d4b9dac994c7df65b0dd1c77980043","f1eef6d4b9dac994c7df65b0e7298ace125691003f","f7f4f9e7e1efd4b9dac994c7df65b0e7298ace125691003f","f7f4f9e7e1efd4b9dac994c7df65b0e7298ace125698004367001f").map(r) +const Y=y(H) +var G=new Array(3).concat("fde0ddfa9fb5c51b8a","feebe2fbb4b9f768a1ae017e","feebe2fbb4b9f768a1c51b8a7a0177","feebe2fcc5c0fa9fb5f768a1c51b8a7a0177","feebe2fcc5c0fa9fb5f768a1dd3497ae017e7a0177","fff7f3fde0ddfcc5c0fa9fb5f768a1dd3497ae017e7a0177","fff7f3fde0ddfcc5c0fa9fb5f768a1dd3497ae017e7a017749006a").map(r) +const K=y(G) +var W=new Array(3).concat("edf8b17fcdbb2c7fb8","ffffcca1dab441b6c4225ea8","ffffcca1dab441b6c42c7fb8253494","ffffccc7e9b47fcdbb41b6c42c7fb8253494","ffffccc7e9b47fcdbb41b6c41d91c0225ea80c2c84","ffffd9edf8b1c7e9b47fcdbb41b6c41d91c0225ea80c2c84","ffffd9edf8b1c7e9b47fcdbb41b6c41d91c0225ea8253494081d58").map(r) +const X=y(W) +var J=new Array(3).concat("f7fcb9addd8e31a354","ffffccc2e69978c679238443","ffffccc2e69978c67931a354006837","ffffccd9f0a3addd8e78c67931a354006837","ffffccd9f0a3addd8e78c67941ab5d238443005a32","ffffe5f7fcb9d9f0a3addd8e78c67941ab5d238443005a32","ffffe5f7fcb9d9f0a3addd8e78c67941ab5d238443006837004529").map(r) +const Q=y(J) +var tt=new Array(3).concat("fff7bcfec44fd95f0e","ffffd4fed98efe9929cc4c02","ffffd4fed98efe9929d95f0e993404","ffffd4fee391fec44ffe9929d95f0e993404","ffffd4fee391fec44ffe9929ec7014cc4c028c2d04","ffffe5fff7bcfee391fec44ffe9929ec7014cc4c028c2d04","ffffe5fff7bcfee391fec44ffe9929ec7014cc4c02993404662506").map(r) +const et=y(tt) +var nt=new Array(3).concat("ffeda0feb24cf03b20","ffffb2fecc5cfd8d3ce31a1c","ffffb2fecc5cfd8d3cf03b20bd0026","ffffb2fed976feb24cfd8d3cf03b20bd0026","ffffb2fed976feb24cfd8d3cfc4e2ae31a1cb10026","ffffccffeda0fed976feb24cfd8d3cfc4e2ae31a1cb10026","ffffccffeda0fed976feb24cfd8d3cfc4e2ae31a1cbd0026800026").map(r) +const rt=y(nt) +var it=new Array(3).concat("deebf79ecae13182bd","eff3ffbdd7e76baed62171b5","eff3ffbdd7e76baed63182bd08519c","eff3ffc6dbef9ecae16baed63182bd08519c","eff3ffc6dbef9ecae16baed64292c62171b5084594","f7fbffdeebf7c6dbef9ecae16baed64292c62171b5084594","f7fbffdeebf7c6dbef9ecae16baed64292c62171b508519c08306b").map(r) +const ot=y(it) +var at=new Array(3).concat("e5f5e0a1d99b31a354","edf8e9bae4b374c476238b45","edf8e9bae4b374c47631a354006d2c","edf8e9c7e9c0a1d99b74c47631a354006d2c","edf8e9c7e9c0a1d99b74c47641ab5d238b45005a32","f7fcf5e5f5e0c7e9c0a1d99b74c47641ab5d238b45005a32","f7fcf5e5f5e0c7e9c0a1d99b74c47641ab5d238b45006d2c00441b").map(r) +const ut=y(at) +var ct=new Array(3).concat("f0f0f0bdbdbd636363","f7f7f7cccccc969696525252","f7f7f7cccccc969696636363252525","f7f7f7d9d9d9bdbdbd969696636363252525","f7f7f7d9d9d9bdbdbd969696737373525252252525","fffffff0f0f0d9d9d9bdbdbd969696737373525252252525","fffffff0f0f0d9d9d9bdbdbd969696737373525252252525000000").map(r) +const st=y(ct) +var ft=new Array(3).concat("efedf5bcbddc756bb1","f2f0f7cbc9e29e9ac86a51a3","f2f0f7cbc9e29e9ac8756bb154278f","f2f0f7dadaebbcbddc9e9ac8756bb154278f","f2f0f7dadaebbcbddc9e9ac8807dba6a51a34a1486","fcfbfdefedf5dadaebbcbddc9e9ac8807dba6a51a34a1486","fcfbfdefedf5dadaebbcbddc9e9ac8807dba6a51a354278f3f007d").map(r) +const lt=y(ft) +var ht=new Array(3).concat("fee0d2fc9272de2d26","fee5d9fcae91fb6a4acb181d","fee5d9fcae91fb6a4ade2d26a50f15","fee5d9fcbba1fc9272fb6a4ade2d26a50f15","fee5d9fcbba1fc9272fb6a4aef3b2ccb181d99000d","fff5f0fee0d2fcbba1fc9272fb6a4aef3b2ccb181d99000d","fff5f0fee0d2fcbba1fc9272fb6a4aef3b2ccb181da50f1567000d").map(r) +const dt=y(ht) +var pt=new Array(3).concat("fee6cefdae6be6550d","feeddefdbe85fd8d3cd94701","feeddefdbe85fd8d3ce6550da63603","feeddefdd0a2fdae6bfd8d3ce6550da63603","feeddefdd0a2fdae6bfd8d3cf16913d948018c2d04","fff5ebfee6cefdd0a2fdae6bfd8d3cf16913d948018c2d04","fff5ebfee6cefdd0a2fdae6bfd8d3cf16913d94801a636037f2704").map(r) +const yt=y(pt) +function bt(t){return t=Math.max(0,Math.min(1,t)),"rgb("+Math.max(0,Math.min(255,Math.round(-4.54-t*(35.34-t*(2381.73-t*(6402.7-t*(7024.72-2710.57*t)))))))+", "+Math.max(0,Math.min(255,Math.round(32.49+t*(170.73+t*(52.82-t*(131.46-t*(176.58-67.37*t)))))))+", "+Math.max(0,Math.min(255,Math.round(81.24+t*(442.36-t*(2482.43-t*(6167.24-t*(6614.94-2475.67*t)))))))+")"}var vt=n(1572),gt=n(7128) +const mt=Math.PI/180,_t=180/Math.PI +var wt=-.14861,xt=1.78277,At=-.29227,Et=-.90649,kt=1.97294,Dt=kt*Et,Ct=kt*xt,Ot=xt*At-Et*wt +function St(t){if(t instanceof Ft)return new Ft(t.h,t.s,t.l,t.opacity) +t instanceof gt.Ss||(t=(0,gt.SU)(t)) +var e=t.r/255,n=t.g/255,r=t.b/255,i=(Ot*r+Dt*e-Ct*n)/(Ot+Dt-Ct),o=r-i,a=(kt*(n-i)-At*o)/Et,u=Math.sqrt(a*a+o*o)/(kt*i*(1-i)),c=u?Math.atan2(a,o)*_t-120:NaN +return new Ft(c<0?c+360:c,u,i,t.opacity)}function Mt(t,e,n,r){return 1===arguments.length?St(t):new Ft(t,e,n,null==r?1:r)}function Ft(t,e,n,r){this.h=+t,this.s=+e,this.l=+n,this.opacity=+r}(0,vt.Z)(Ft,Mt,(0,vt.l)(gt.Il,{brighter:function(t){return t=null==t?gt.J5:Math.pow(gt.J5,t),new Ft(this.h,this.s,this.l*t,this.opacity)},darker:function(t){return t=null==t?gt.xV:Math.pow(gt.xV,t),new Ft(this.h,this.s,this.l*t,this.opacity)},rgb:function(){var t=isNaN(this.h)?0:(this.h+120)*mt,e=+this.l,n=isNaN(this.s)?0:this.s*e*(1-e),r=Math.cos(t),i=Math.sin(t) +return new gt.Ss(255*(e+n*(wt*r+xt*i)),255*(e+n*(At*r+Et*i)),255*(e+n*(kt*r)),this.opacity)}})) +var Tt=n(901) +function Bt(t){return function e(n){function r(e,r){var i=t((e=Mt(e)).h,(r=Mt(r)).h),o=(0,Tt.ZP)(e.s,r.s),a=(0,Tt.ZP)(e.l,r.l),u=(0,Tt.ZP)(e.opacity,r.opacity) +return function(t){return e.h=i(t),e.s=o(t),e.l=a(Math.pow(t,n)),e.opacity=u(t),e+""}}return n=+n,r.gamma=e,r}(1)}Bt(Tt.wx) +var Pt=Bt(Tt.ZP) +const jt=Pt(Mt(300,.5,0),Mt(-240,.5,1)) +var Nt=Pt(Mt(-100,.75,.35),Mt(80,1.5,.8)),Rt=Pt(Mt(260,.75,.35),Mt(80,1.5,.8)),Lt=Mt() +function It(t){(t<0||t>1)&&(t-=Math.floor(t)) +var e=Math.abs(t-.5) +return Lt.h=360*t-100,Lt.s=1.5-1.5*e,Lt.l=.8-.9*e,Lt+""}var $t=(0,gt.B8)(),Ut=Math.PI/3,zt=2*Math.PI/3 +function Zt(t){var e +return t=(.5-t)*Math.PI,$t.r=255*(e=Math.sin(t))*e,$t.g=255*(e=Math.sin(t+Ut))*e,$t.b=255*(e=Math.sin(t+zt))*e,$t+""}function qt(t){return t=Math.max(0,Math.min(1,t)),"rgb("+Math.max(0,Math.min(255,Math.round(34.61+t*(1172.33-t*(10793.56-t*(33300.12-t*(38394.49-14825.05*t)))))))+", "+Math.max(0,Math.min(255,Math.round(23.31+t*(557.33+t*(1225.33-t*(3574.96-t*(1073.77+707.56*t)))))))+", "+Math.max(0,Math.min(255,Math.round(27.2+t*(3211.1-t*(15327.97-t*(27814-t*(22569.18-6838.66*t)))))))+")"}function Vt(t){var e=t.length +return function(n){return t[Math.max(0,Math.min(e-1,Math.floor(n*e)))]}}const Ht=Vt(r("44015444025645045745055946075a46085c460a5d460b5e470d60470e6147106347116447136548146748166848176948186a481a6c481b6d481c6e481d6f481f70482071482173482374482475482576482677482878482979472a7a472c7a472d7b472e7c472f7d46307e46327e46337f463480453581453781453882443983443a83443b84433d84433e85423f854240864241864142874144874045884046883f47883f48893e49893e4a893e4c8a3d4d8a3d4e8a3c4f8a3c508b3b518b3b528b3a538b3a548c39558c39568c38588c38598c375a8c375b8d365c8d365d8d355e8d355f8d34608d34618d33628d33638d32648e32658e31668e31678e31688e30698e306a8e2f6b8e2f6c8e2e6d8e2e6e8e2e6f8e2d708e2d718e2c718e2c728e2c738e2b748e2b758e2a768e2a778e2a788e29798e297a8e297b8e287c8e287d8e277e8e277f8e27808e26818e26828e26828e25838e25848e25858e24868e24878e23888e23898e238a8d228b8d228c8d228d8d218e8d218f8d21908d21918c20928c20928c20938c1f948c1f958b1f968b1f978b1f988b1f998a1f9a8a1e9b8a1e9c891e9d891f9e891f9f881fa0881fa1881fa1871fa28720a38620a48621a58521a68522a78522a88423a98324aa8325ab8225ac8226ad8127ad8128ae8029af7f2ab07f2cb17e2db27d2eb37c2fb47c31b57b32b67a34b67935b77937b87838b9773aba763bbb753dbc743fbc7340bd7242be7144bf7046c06f48c16e4ac16d4cc26c4ec36b50c46a52c56954c56856c66758c7655ac8645cc8635ec96260ca6063cb5f65cb5e67cc5c69cd5b6ccd5a6ece5870cf5773d05675d05477d1537ad1517cd2507fd34e81d34d84d44b86d54989d5488bd6468ed64590d74393d74195d84098d83e9bd93c9dd93ba0da39a2da37a5db36a8db34aadc32addc30b0dd2fb2dd2db5de2bb8de29bade28bddf26c0df25c2df23c5e021c8e020cae11fcde11dd0e11cd2e21bd5e21ad8e219dae319dde318dfe318e2e418e5e419e7e419eae51aece51befe51cf1e51df4e61ef6e620f8e621fbe723fde725")) +var Yt=Vt(r("00000401000501010601010802010902020b02020d03030f03031204041405041606051806051a07061c08071e0907200a08220b09240c09260d0a290e0b2b100b2d110c2f120d31130d34140e36150e38160f3b180f3d19103f1a10421c10441d11471e114920114b21114e22115024125325125527125829115a2a115c2c115f2d11612f116331116533106734106936106b38106c390f6e3b0f703d0f713f0f72400f74420f75440f764510774710784910784a10794c117a4e117b4f127b51127c52137c54137d56147d57157e59157e5a167e5c167f5d177f5f187f601880621980641a80651a80671b80681c816a1c816b1d816d1d816e1e81701f81721f817320817521817621817822817922827b23827c23827e24828025828125818326818426818627818827818928818b29818c29818e2a81902a81912b81932b80942c80962c80982d80992d809b2e7f9c2e7f9e2f7fa02f7fa1307ea3307ea5317ea6317da8327daa337dab337cad347cae347bb0357bb2357bb3367ab5367ab73779b83779ba3878bc3978bd3977bf3a77c03a76c23b75c43c75c53c74c73d73c83e73ca3e72cc3f71cd4071cf4070d0416fd2426fd3436ed5446dd6456cd8456cd9466bdb476adc4869de4968df4a68e04c67e24d66e34e65e44f64e55064e75263e85362e95462ea5661eb5760ec5860ed5a5fee5b5eef5d5ef05f5ef1605df2625df2645cf3655cf4675cf4695cf56b5cf66c5cf66e5cf7705cf7725cf8745cf8765cf9785df9795df97b5dfa7d5efa7f5efa815ffb835ffb8560fb8761fc8961fc8a62fc8c63fc8e64fc9065fd9266fd9467fd9668fd9869fd9a6afd9b6bfe9d6cfe9f6dfea16efea36ffea571fea772fea973feaa74feac76feae77feb078feb27afeb47bfeb67cfeb77efeb97ffebb81febd82febf84fec185fec287fec488fec68afec88cfeca8dfecc8ffecd90fecf92fed194fed395fed597fed799fed89afdda9cfddc9efddea0fde0a1fde2a3fde3a5fde5a7fde7a9fde9aafdebacfcecaefceeb0fcf0b2fcf2b4fcf4b6fcf6b8fcf7b9fcf9bbfcfbbdfcfdbf")),Gt=Vt(r("00000401000501010601010802010a02020c02020e03021004031204031405041706041907051b08051d09061f0a07220b07240c08260d08290e092b10092d110a30120a32140b34150b37160b39180c3c190c3e1b0c411c0c431e0c451f0c48210c4a230c4c240c4f260c51280b53290b552b0b572d0b592f0a5b310a5c320a5e340a5f3609613809623909633b09643d09653e0966400a67420a68440a68450a69470b6a490b6a4a0c6b4c0c6b4d0d6c4f0d6c510e6c520e6d540f6d550f6d57106e59106e5a116e5c126e5d126e5f136e61136e62146e64156e65156e67166e69166e6a176e6c186e6d186e6f196e71196e721a6e741a6e751b6e771c6d781c6d7a1d6d7c1d6d7d1e6d7f1e6c801f6c82206c84206b85216b87216b88226a8a226a8c23698d23698f24699025689225689326679526679727669827669a28659b29649d29649f2a63a02a63a22b62a32c61a52c60a62d60a82e5fa92e5eab2f5ead305dae305cb0315bb1325ab3325ab43359b63458b73557b93556ba3655bc3754bd3853bf3952c03a51c13a50c33b4fc43c4ec63d4dc73e4cc83f4bca404acb4149cc4248ce4347cf4446d04545d24644d34743d44842d54a41d74b3fd84c3ed94d3dda4e3cdb503bdd513ade5238df5337e05536e15635e25734e35933e45a31e55c30e65d2fe75e2ee8602de9612bea632aeb6429eb6628ec6726ed6925ee6a24ef6c23ef6e21f06f20f1711ff1731df2741cf3761bf37819f47918f57b17f57d15f67e14f68013f78212f78410f8850ff8870ef8890cf98b0bf98c0af98e09fa9008fa9207fa9407fb9606fb9706fb9906fb9b06fb9d07fc9f07fca108fca309fca50afca60cfca80dfcaa0ffcac11fcae12fcb014fcb216fcb418fbb61afbb81dfbba1ffbbc21fbbe23fac026fac228fac42afac62df9c72ff9c932f9cb35f8cd37f8cf3af7d13df7d340f6d543f6d746f5d949f5db4cf4dd4ff4df53f4e156f3e35af3e55df2e661f2e865f2ea69f1ec6df1ed71f1ef75f1f179f2f27df2f482f3f586f3f68af4f88ef5f992f6fa96f8fb9af9fc9dfafda1fcffa4")),Kt=Vt(r("0d088710078813078916078a19068c1b068d1d068e20068f2206902406912605912805922a05932c05942e05952f059631059733059735049837049938049a3a049a3c049b3e049c3f049c41049d43039e44039e46039f48039f4903a04b03a14c02a14e02a25002a25102a35302a35502a45601a45801a45901a55b01a55c01a65e01a66001a66100a76300a76400a76600a76700a86900a86a00a86c00a86e00a86f00a87100a87201a87401a87501a87701a87801a87a02a87b02a87d03a87e03a88004a88104a78305a78405a78606a68707a68808a68a09a58b0aa58d0ba58e0ca48f0da4910ea3920fa39410a29511a19613a19814a099159f9a169f9c179e9d189d9e199da01a9ca11b9ba21d9aa31e9aa51f99a62098a72197a82296aa2395ab2494ac2694ad2793ae2892b02991b12a90b22b8fb32c8eb42e8db52f8cb6308bb7318ab83289ba3388bb3488bc3587bd3786be3885bf3984c03a83c13b82c23c81c33d80c43e7fc5407ec6417dc7427cc8437bc9447aca457acb4679cc4778cc4977cd4a76ce4b75cf4c74d04d73d14e72d24f71d35171d45270d5536fd5546ed6556dd7566cd8576bd9586ada5a6ada5b69db5c68dc5d67dd5e66de5f65de6164df6263e06363e16462e26561e26660e3685fe4695ee56a5de56b5de66c5ce76e5be76f5ae87059e97158e97257ea7457eb7556eb7655ec7754ed7953ed7a52ee7b51ef7c51ef7e50f07f4ff0804ef1814df1834cf2844bf3854bf3874af48849f48948f58b47f58c46f68d45f68f44f79044f79143f79342f89441f89540f9973ff9983ef99a3efa9b3dfa9c3cfa9e3bfb9f3afba139fba238fca338fca537fca636fca835fca934fdab33fdac33fdae32fdaf31fdb130fdb22ffdb42ffdb52efeb72dfeb82cfeba2cfebb2bfebd2afebe2afec029fdc229fdc328fdc527fdc627fdc827fdca26fdcb26fccd25fcce25fcd025fcd225fbd324fbd524fbd724fad824fada24f9dc24f9dd25f8df25f8e125f7e225f7e425f6e626f6e826f5e926f5eb27f4ed27f3ee27f3f027f2f227f1f426f1f525f0f724f0f921"))},113:(t,e,n)=>{"use strict" +n.r(e),n.d(e,{scaleBand:()=>c,scaleDiverging:()=>ur,scaleDivergingLog:()=>cr,scaleDivergingPow:()=>fr,scaleDivergingSqrt:()=>lr,scaleDivergingSymlog:()=>sr,scaleIdentity:()=>J,scaleImplicit:()=>a,scaleLinear:()=>X,scaleLog:()=>ut,scaleOrdinal:()=>u,scalePoint:()=>f,scalePow:()=>bt,scaleQuantile:()=>At,scaleQuantize:()=>Et,scaleRadial:()=>_t,scaleSequential:()=>Qn,scaleSequentialLog:()=>tr,scaleSequentialPow:()=>nr,scaleSequentialQuantile:()=>ir,scaleSequentialSqrt:()=>rr,scaleSequentialSymlog:()=>er,scaleSqrt:()=>vt,scaleSymlog:()=>lt,scaleThreshold:()=>kt,scaleTime:()=>Zn,scaleUtc:()=>Wn,tickFormat:()=>K}) +var r=n(1204) +function i(t,e){switch(arguments.length){case 0:break +case 1:this.range(t) +break +default:this.range(e).domain(t)}return this}function o(t,e){switch(arguments.length){case 0:break +case 1:"function"==typeof t?this.interpolator(t):this.range(t) +break +default:this.domain(t),"function"==typeof e?this.interpolator(e):this.range(e)}return this}const a=Symbol("implicit") +function u(){var t=new Map,e=[],n=[],r=a +function o(i){var o=i+"",u=t.get(o) +if(!u){if(r!==a)return r +t.set(o,u=e.push(i))}return n[(u-1)%n.length]}return o.domain=function(n){if(!arguments.length)return e.slice() +e=[],t=new Map +for(const r of n){const n=r+"" +t.has(n)||t.set(n,e.push(r))}return o},o.range=function(t){return arguments.length?(n=Array.from(t),o):n.slice()},o.unknown=function(t){return arguments.length?(r=t,o):r},o.copy=function(){return u(e,n).unknown(r)},i.apply(o,arguments),o}function c(){var t,e,n=u().unknown(void 0),o=n.domain,a=n.range,s=0,f=1,l=!1,h=0,d=0,p=.5 +function y(){var n=o().length,i=fo&&(i=e.slice(o,i),u[a]?u[a]+=i:u[++a]=i),(n=n[0])===(r=r[0])?u[a]?u[a]+=r:u[++a]=r:(u[++a]=null,c.push({i:a,x:v(n,r)})),o=_.lastIndex +return oe&&(n=t,t=e,e=n),s=function(n){return Math.max(t,Math.min(e,n))}),r=c>2?F:M,i=o=null,l}function l(e){return isNaN(e=+e)?n:(i||(i=r(a.map(t),u,c)))(t(s(e)))}return l.invert=function(n){return s(e((o||(o=r(u,a.map(t),v)))(n)))},l.domain=function(t){return arguments.length?(a=Array.from(t,D),f()):a.slice()},l.range=function(t){return arguments.length?(u=Array.from(t),f()):u.slice()},l.rangeRound=function(t){return u=Array.from(t),c=k,f()},l.clamp=function(t){return arguments.length?(s=!!t||O,f()):s!==O},l.interpolate=function(t){return arguments.length?(c=t,f()):c},l.unknown=function(t){return arguments.length?(n=t,l):n},function(n,r){return t=n,e=r,f()}}function P(){return B()(O,O)}var j,N=/^(?:(.)?([<>=^]))?([+\-( ])?([$#])?(0)?(\d+)?(,)?(\.\d+)?(~)?([a-z%])?$/i +function R(t){if(!(e=N.exec(t)))throw new Error("invalid format: "+t) +var e +return new L({fill:e[1],align:e[2],sign:e[3],symbol:e[4],zero:e[5],width:e[6],comma:e[7],precision:e[8]&&e[8].slice(1),trim:e[9],type:e[10]})}function L(t){this.fill=void 0===t.fill?" ":t.fill+"",this.align=void 0===t.align?">":t.align+"",this.sign=void 0===t.sign?"-":t.sign+"",this.symbol=void 0===t.symbol?"":t.symbol+"",this.zero=!!t.zero,this.width=void 0===t.width?void 0:+t.width,this.comma=!!t.comma,this.precision=void 0===t.precision?void 0:+t.precision,this.trim=!!t.trim,this.type=void 0===t.type?"":t.type+""}function I(t,e){if((n=(t=e?t.toExponential(e-1):t.toExponential()).indexOf("e"))<0)return null +var n,r=t.slice(0,n) +return[r.length>1?r[0]+r.slice(2):r,+t.slice(n+1)]}function $(t){return(t=I(Math.abs(t)))?t[1]:NaN}function U(t,e){var n=I(t,e) +if(!n)return t+"" +var r=n[0],i=n[1] +return i<0?"0."+new Array(-i).join("0")+r:r.length>i+1?r.slice(0,i+1)+"."+r.slice(i+1):r+new Array(i-r.length+2).join("0")}R.prototype=L.prototype,L.prototype.toString=function(){return this.fill+this.align+this.sign+this.symbol+(this.zero?"0":"")+(void 0===this.width?"":Math.max(1,0|this.width))+(this.comma?",":"")+(void 0===this.precision?"":"."+Math.max(0,0|this.precision))+(this.trim?"~":"")+this.type} +const z={"%":(t,e)=>(100*t).toFixed(e),b:t=>Math.round(t).toString(2),c:t=>t+"",d:function(t){return Math.abs(t=Math.round(t))>=1e21?t.toLocaleString("en").replace(/,/g,""):t.toString(10)},e:(t,e)=>t.toExponential(e),f:(t,e)=>t.toFixed(e),g:(t,e)=>t.toPrecision(e),o:t=>Math.round(t).toString(8),p:(t,e)=>U(100*t,e),r:U,s:function(t,e){var n=I(t,e) +if(!n)return t+"" +var r=n[0],i=n[1],o=i-(j=3*Math.max(-8,Math.min(8,Math.floor(i/3))))+1,a=r.length +return o===a?r:o>a?r+new Array(o-a+1).join("0"):o>0?r.slice(0,o)+"."+r.slice(o):"0."+new Array(1-o).join("0")+I(t,Math.max(0,e+o-1))[0]},X:t=>Math.round(t).toString(16).toUpperCase(),x:t=>Math.round(t).toString(16)} +function Z(t){return t}var q,V,H,Y=Array.prototype.map,G=["y","z","a","f","p","n","µ","m","","k","M","G","T","P","E","Z","Y"] +function K(t,e,n,r){var i,o=(0,l.ly)(t,e,n) +switch((r=R(null==r?",f":r)).type){case"s":var a=Math.max(Math.abs(t),Math.abs(e)) +return null!=r.precision||isNaN(i=function(t,e){return Math.max(0,3*Math.max(-8,Math.min(8,Math.floor($(e)/3)))-$(Math.abs(t)))}(o,a))||(r.precision=i),H(r,a) +case"":case"e":case"g":case"p":case"r":null!=r.precision||isNaN(i=function(t,e){return t=Math.abs(t),e=Math.abs(e)-t,Math.max(0,$(e)-$(t))+1}(o,Math.max(Math.abs(t),Math.abs(e))))||(r.precision=i-("e"===r.type)) +break +case"f":case"%":null!=r.precision||isNaN(i=function(t){return Math.max(0,-$(Math.abs(t)))}(o))||(r.precision=i-2*("%"===r.type))}return V(r)}function W(t){var e=t.domain +return t.ticks=function(t){var n=e() +return(0,l.ZP)(n[0],n[n.length-1],null==t?10:t)},t.tickFormat=function(t,n){var r=e() +return K(r[0],r[r.length-1],null==t?10:t,n)},t.nice=function(n){null==n&&(n=10) +var r,i,o=e(),a=0,u=o.length-1,c=o[a],s=o[u],f=10 +for(s0;){if((i=(0,l.G9)(c,s,n))===r)return o[a]=c,o[u]=s,e(o) +if(i>0)c=Math.floor(c/i)*i,s=Math.ceil(s/i)*i +else{if(!(i<0))break +c=Math.ceil(c*i)/i,s=Math.floor(s*i)/i}r=i}return t},t}function X(){var t=P() +return t.copy=function(){return T(t,X())},i.apply(t,arguments),W(t)}function J(t){var e +function n(t){return isNaN(t=+t)?e:t}return n.invert=n,n.domain=n.range=function(e){return arguments.length?(t=Array.from(e,D),n):t.slice()},n.unknown=function(t){return arguments.length?(e=t,n):e},n.copy=function(){return J(t).unknown(e)},t=arguments.length?Array.from(t,D):[0,1],W(n)}function Q(t,e){var n,r=0,i=(t=t.slice()).length-1,o=t[r],a=t[i] +return a0){for(;d<=p;++d)for(f=1,s=n(d);fc)break +b.push(h)}}else for(;d<=p;++d)for(f=o-1,s=n(d);f>=1;--f)if(!((h=s*f)c)break +b.push(h)}2*b.length0&&u>0&&(c+u+1>r&&(u=Math.max(1,r-c)),o.push(t.substring(i-=u,i+u)),!((c+=u+1)>r));)u=e[a=(a+1)%e.length] +return o.reverse().join(n)}),i=void 0===t.currency?"":t.currency[0]+"",o=void 0===t.currency?"":t.currency[1]+"",a=void 0===t.decimal?".":t.decimal+"",u=void 0===t.numerals?Z:function(t){return function(e){return e.replace(/[0-9]/g,(function(e){return t[+e]}))}}(Y.call(t.numerals,String)),c=void 0===t.percent?"%":t.percent+"",s=void 0===t.minus?"−":t.minus+"",f=void 0===t.nan?"NaN":t.nan+"" +function l(t){var e=(t=R(t)).fill,n=t.align,l=t.sign,h=t.symbol,d=t.zero,p=t.width,y=t.comma,b=t.precision,v=t.trim,g=t.type +"n"===g?(y=!0,g="g"):z[g]||(void 0===b&&(b=12),v=!0,g="g"),(d||"0"===e&&"="===n)&&(d=!0,e="0",n="=") +var m="$"===h?i:"#"===h&&/[boxX]/.test(g)?"0"+g.toLowerCase():"",_="$"===h?o:/[%p]/.test(g)?c:"",w=z[g],x=/[defgprs%]/.test(g) +function A(t){var i,o,c,h=m,A=_ +if("c"===g)A=w(t)+A,t="" +else{var E=(t=+t)<0||1/t<0 +if(t=isNaN(t)?f:w(Math.abs(t),b),v&&(t=function(t){t:for(var e,n=t.length,r=1,i=-1;r0&&(i=0)}return i>0?t.slice(0,i)+t.slice(e+1):t}(t)),E&&0==+t&&"+"!==l&&(E=!1),h=(E?"("===l?l:s:"-"===l||"("===l?"":l)+h,A=("s"===g?G[8+j/3]:"")+A+(E&&"("===l?")":""),x)for(i=-1,o=t.length;++i(c=t.charCodeAt(i))||c>57){A=(46===c?a+t.slice(i+1):t.slice(i))+A,t=t.slice(0,i) +break}}y&&!d&&(t=r(t,1/0)) +var k=h.length+t.length+A.length,D=k>1)+h+t+A+D.slice(k) +break +default:t=D+h+t+A}return u(t)}return b=void 0===b?6:/[gprs]/.test(g)?Math.max(1,Math.min(21,b)):Math.max(0,Math.min(20,b)),A.toString=function(){return t+""},A}return{format:l,formatPrefix:function(t,e){var n=l(((t=R(t)).type="f",t)),r=3*Math.max(-8,Math.min(8,Math.floor($(e)/3))),i=Math.pow(10,-r),o=G[8+r/3] +return function(t){return n(i*t)+o}}}}({thousands:",",grouping:[3],currency:["$",""]}),V=q.format,H=q.formatPrefix +var wt=n(801),xt=n(7604) +function At(){var t,e=[],n=[],r=[] +function o(){var t=0,i=Math.max(1,n.length) +for(r=new Array(i-1);++t0?r[i-1]:e[0],i=r?[o[r-1],n]:[o[i-1],o[i]]},u.unknown=function(e){return arguments.length?(t=e,u):u},u.thresholds=function(){return o.slice()},u.copy=function(){return Et().domain([e,n]).range(a).unknown(t)},i.apply(W(u),arguments)}function kt(){var t,e=[.5],n=[0,1],r=1 +function o(i){return i<=i?n[(0,h.ZP)(e,i,0,r)]:t}return o.domain=function(t){return arguments.length?(e=Array.from(t),r=Math.min(e.length,n.length-1),o):e.slice()},o.range=function(t){return arguments.length?(n=Array.from(t),r=Math.min(e.length,n.length-1),o):n.slice()},o.invertExtent=function(t){var r=n.indexOf(t) +return[e[r-1],e[r]]},o.unknown=function(e){return arguments.length?(t=e,o):t},o.copy=function(){return kt().domain(e).range(n).unknown(t)},i.apply(o,arguments)}var Dt=n(9354),Ct=new Date,Ot=new Date +function St(t,e,n,r){function i(e){return t(e=0===arguments.length?new Date:new Date(+e)),e}return i.floor=function(e){return t(e=new Date(+e)),e},i.ceil=function(n){return t(n=new Date(n-1)),e(n,1),t(n),n},i.round=function(t){var e=i(t),n=i.ceil(t) +return t-e0))return u +do{u.push(a=new Date(+n)),e(n,o),t(n)}while(a=e)for(;t(e),!n(e);)e.setTime(e-1)}),(function(t,r){if(t>=t)if(r<0)for(;++r<=0;)for(;e(t,-1),!n(t););else for(;--r>=0;)for(;e(t,1),!n(t););}))},n&&(i.count=function(e,r){return Ct.setTime(+e),Ot.setTime(+r),t(Ct),t(Ot),Math.floor(n(Ct,Ot))},i.every=function(t){return t=Math.floor(t),isFinite(t)&&t>0?t>1?i.filter(r?function(e){return r(e)%t==0}:function(e){return i.count(0,e)%t==0}):i:null}),i}var Mt=St((function(t){t.setMonth(0,1),t.setHours(0,0,0,0)}),(function(t,e){t.setFullYear(t.getFullYear()+e)}),(function(t,e){return e.getFullYear()-t.getFullYear()}),(function(t){return t.getFullYear()})) +Mt.every=function(t){return isFinite(t=Math.floor(t))&&t>0?St((function(e){e.setFullYear(Math.floor(e.getFullYear()/t)*t),e.setMonth(0,1),e.setHours(0,0,0,0)}),(function(e,n){e.setFullYear(e.getFullYear()+n*t)})):null} +const Ft=Mt +Mt.range +var Tt=St((function(t){t.setDate(1),t.setHours(0,0,0,0)}),(function(t,e){t.setMonth(t.getMonth()+e)}),(function(t,e){return e.getMonth()-t.getMonth()+12*(e.getFullYear()-t.getFullYear())}),(function(t){return t.getMonth()})) +const Bt=Tt +Tt.range +var Pt=1e3,jt=6e4,Nt=36e5,Rt=864e5,Lt=6048e5 +function It(t){return St((function(e){e.setDate(e.getDate()-(e.getDay()+7-t)%7),e.setHours(0,0,0,0)}),(function(t,e){t.setDate(t.getDate()+7*e)}),(function(t,e){return(e-t-(e.getTimezoneOffset()-t.getTimezoneOffset())*jt)/Lt}))}var $t=It(0),Ut=It(1),zt=It(2),Zt=It(3),qt=It(4),Vt=It(5),Ht=It(6),Yt=($t.range,Ut.range,zt.range,Zt.range,qt.range,Vt.range,Ht.range,St((t=>t.setHours(0,0,0,0)),((t,e)=>t.setDate(t.getDate()+e)),((t,e)=>(e-t-(e.getTimezoneOffset()-t.getTimezoneOffset())*jt)/Rt),(t=>t.getDate()-1))) +const Gt=Yt +Yt.range +var Kt=St((function(t){t.setTime(t-t.getMilliseconds()-t.getSeconds()*Pt-t.getMinutes()*jt)}),(function(t,e){t.setTime(+t+e*Nt)}),(function(t,e){return(e-t)/Nt}),(function(t){return t.getHours()})) +const Wt=Kt +Kt.range +var Xt=St((function(t){t.setTime(t-t.getMilliseconds()-t.getSeconds()*Pt)}),(function(t,e){t.setTime(+t+e*jt)}),(function(t,e){return(e-t)/jt}),(function(t){return t.getMinutes()})) +const Jt=Xt +Xt.range +var Qt=St((function(t){t.setTime(t-t.getMilliseconds())}),(function(t,e){t.setTime(+t+e*Pt)}),(function(t,e){return(e-t)/Pt}),(function(t){return t.getUTCSeconds()})) +const te=Qt +Qt.range +var ee=St((function(){}),(function(t,e){t.setTime(+t+e)}),(function(t,e){return e-t})) +ee.every=function(t){return t=Math.floor(t),isFinite(t)&&t>0?t>1?St((function(e){e.setTime(Math.floor(e/t)*t)}),(function(e,n){e.setTime(+e+n*t)}),(function(e,n){return(n-e)/t})):ee:null} +const ne=ee +function re(t){return St((function(e){e.setUTCDate(e.getUTCDate()-(e.getUTCDay()+7-t)%7),e.setUTCHours(0,0,0,0)}),(function(t,e){t.setUTCDate(t.getUTCDate()+7*e)}),(function(t,e){return(e-t)/Lt}))}ee.range +var ie=re(0),oe=re(1),ae=re(2),ue=re(3),ce=re(4),se=re(5),fe=re(6),le=(ie.range,oe.range,ae.range,ue.range,ce.range,se.range,fe.range,St((function(t){t.setUTCHours(0,0,0,0)}),(function(t,e){t.setUTCDate(t.getUTCDate()+e)}),(function(t,e){return(e-t)/Rt}),(function(t){return t.getUTCDate()-1}))) +const he=le +le.range +var de=St((function(t){t.setUTCMonth(0,1),t.setUTCHours(0,0,0,0)}),(function(t,e){t.setUTCFullYear(t.getUTCFullYear()+e)}),(function(t,e){return e.getUTCFullYear()-t.getUTCFullYear()}),(function(t){return t.getUTCFullYear()})) +de.every=function(t){return isFinite(t=Math.floor(t))&&t>0?St((function(e){e.setUTCFullYear(Math.floor(e.getUTCFullYear()/t)*t),e.setUTCMonth(0,1),e.setUTCHours(0,0,0,0)}),(function(e,n){e.setUTCFullYear(e.getUTCFullYear()+n*t)})):null} +const pe=de +function ye(t){if(0<=t.y&&t.y<100){var e=new Date(-1,t.m,t.d,t.H,t.M,t.S,t.L) +return e.setFullYear(t.y),e}return new Date(t.y,t.m,t.d,t.H,t.M,t.S,t.L)}function be(t){if(0<=t.y&&t.y<100){var e=new Date(Date.UTC(-1,t.m,t.d,t.H,t.M,t.S,t.L)) +return e.setUTCFullYear(t.y),e}return new Date(Date.UTC(t.y,t.m,t.d,t.H,t.M,t.S,t.L))}function ve(t,e,n){return{y:t,m:e,d:n,H:0,M:0,S:0,L:0}}de.range +var ge,me,_e,we={"-":"",_:" ",0:"0"},xe=/^\s*\d+/,Ae=/^%/,Ee=/[\\^$*+?|[\]().{}]/g +function ke(t,e,n){var r=t<0?"-":"",i=(r?-t:t)+"",o=i.length +return r+(o[t.toLowerCase(),e])))}function Se(t,e,n){var r=xe.exec(e.slice(n,n+1)) +return r?(t.w=+r[0],n+r[0].length):-1}function Me(t,e,n){var r=xe.exec(e.slice(n,n+1)) +return r?(t.u=+r[0],n+r[0].length):-1}function Fe(t,e,n){var r=xe.exec(e.slice(n,n+2)) +return r?(t.U=+r[0],n+r[0].length):-1}function Te(t,e,n){var r=xe.exec(e.slice(n,n+2)) +return r?(t.V=+r[0],n+r[0].length):-1}function Be(t,e,n){var r=xe.exec(e.slice(n,n+2)) +return r?(t.W=+r[0],n+r[0].length):-1}function Pe(t,e,n){var r=xe.exec(e.slice(n,n+4)) +return r?(t.y=+r[0],n+r[0].length):-1}function je(t,e,n){var r=xe.exec(e.slice(n,n+2)) +return r?(t.y=+r[0]+(+r[0]>68?1900:2e3),n+r[0].length):-1}function Ne(t,e,n){var r=/^(Z)|([+-]\d\d)(?::?(\d\d))?/.exec(e.slice(n,n+6)) +return r?(t.Z=r[1]?0:-(r[2]+(r[3]||"00")),n+r[0].length):-1}function Re(t,e,n){var r=xe.exec(e.slice(n,n+1)) +return r?(t.q=3*r[0]-3,n+r[0].length):-1}function Le(t,e,n){var r=xe.exec(e.slice(n,n+2)) +return r?(t.m=r[0]-1,n+r[0].length):-1}function Ie(t,e,n){var r=xe.exec(e.slice(n,n+2)) +return r?(t.d=+r[0],n+r[0].length):-1}function $e(t,e,n){var r=xe.exec(e.slice(n,n+3)) +return r?(t.m=0,t.d=+r[0],n+r[0].length):-1}function Ue(t,e,n){var r=xe.exec(e.slice(n,n+2)) +return r?(t.H=+r[0],n+r[0].length):-1}function ze(t,e,n){var r=xe.exec(e.slice(n,n+2)) +return r?(t.M=+r[0],n+r[0].length):-1}function Ze(t,e,n){var r=xe.exec(e.slice(n,n+2)) +return r?(t.S=+r[0],n+r[0].length):-1}function qe(t,e,n){var r=xe.exec(e.slice(n,n+3)) +return r?(t.L=+r[0],n+r[0].length):-1}function Ve(t,e,n){var r=xe.exec(e.slice(n,n+6)) +return r?(t.L=Math.floor(r[0]/1e3),n+r[0].length):-1}function He(t,e,n){var r=Ae.exec(e.slice(n,n+1)) +return r?n+r[0].length:-1}function Ye(t,e,n){var r=xe.exec(e.slice(n)) +return r?(t.Q=+r[0],n+r[0].length):-1}function Ge(t,e,n){var r=xe.exec(e.slice(n)) +return r?(t.s=+r[0],n+r[0].length):-1}function Ke(t,e){return ke(t.getDate(),e,2)}function We(t,e){return ke(t.getHours(),e,2)}function Xe(t,e){return ke(t.getHours()%12||12,e,2)}function Je(t,e){return ke(1+Gt.count(Ft(t),t),e,3)}function Qe(t,e){return ke(t.getMilliseconds(),e,3)}function tn(t,e){return Qe(t,e)+"000"}function en(t,e){return ke(t.getMonth()+1,e,2)}function nn(t,e){return ke(t.getMinutes(),e,2)}function rn(t,e){return ke(t.getSeconds(),e,2)}function on(t){var e=t.getDay() +return 0===e?7:e}function an(t,e){return ke($t.count(Ft(t)-1,t),e,2)}function un(t){var e=t.getDay() +return e>=4||0===e?qt(t):qt.ceil(t)}function cn(t,e){return t=un(t),ke(qt.count(Ft(t),t)+(4===Ft(t).getDay()),e,2)}function sn(t){return t.getDay()}function fn(t,e){return ke(Ut.count(Ft(t)-1,t),e,2)}function ln(t,e){return ke(t.getFullYear()%100,e,2)}function hn(t,e){return ke((t=un(t)).getFullYear()%100,e,2)}function dn(t,e){return ke(t.getFullYear()%1e4,e,4)}function pn(t,e){var n=t.getDay() +return ke((t=n>=4||0===n?qt(t):qt.ceil(t)).getFullYear()%1e4,e,4)}function yn(t){var e=t.getTimezoneOffset() +return(e>0?"-":(e*=-1,"+"))+ke(e/60|0,"0",2)+ke(e%60,"0",2)}function bn(t,e){return ke(t.getUTCDate(),e,2)}function vn(t,e){return ke(t.getUTCHours(),e,2)}function gn(t,e){return ke(t.getUTCHours()%12||12,e,2)}function mn(t,e){return ke(1+he.count(pe(t),t),e,3)}function _n(t,e){return ke(t.getUTCMilliseconds(),e,3)}function wn(t,e){return _n(t,e)+"000"}function xn(t,e){return ke(t.getUTCMonth()+1,e,2)}function An(t,e){return ke(t.getUTCMinutes(),e,2)}function En(t,e){return ke(t.getUTCSeconds(),e,2)}function kn(t){var e=t.getUTCDay() +return 0===e?7:e}function Dn(t,e){return ke(ie.count(pe(t)-1,t),e,2)}function Cn(t){var e=t.getUTCDay() +return e>=4||0===e?ce(t):ce.ceil(t)}function On(t,e){return t=Cn(t),ke(ce.count(pe(t),t)+(4===pe(t).getUTCDay()),e,2)}function Sn(t){return t.getUTCDay()}function Mn(t,e){return ke(oe.count(pe(t)-1,t),e,2)}function Fn(t,e){return ke(t.getUTCFullYear()%100,e,2)}function Tn(t,e){return ke((t=Cn(t)).getUTCFullYear()%100,e,2)}function Bn(t,e){return ke(t.getUTCFullYear()%1e4,e,4)}function Pn(t,e){var n=t.getUTCDay() +return ke((t=n>=4||0===n?ce(t):ce.ceil(t)).getUTCFullYear()%1e4,e,4)}function jn(){return"+0000"}function Nn(){return"%"}function Rn(t){return+t}function Ln(t){return Math.floor(+t/1e3)}ge=function(t){var e=t.dateTime,n=t.date,r=t.time,i=t.periods,o=t.days,a=t.shortDays,u=t.months,c=t.shortMonths,s=Ce(i),f=Oe(i),l=Ce(o),h=Oe(o),d=Ce(a),p=Oe(a),y=Ce(u),b=Oe(u),v=Ce(c),g=Oe(c),m={a:function(t){return a[t.getDay()]},A:function(t){return o[t.getDay()]},b:function(t){return c[t.getMonth()]},B:function(t){return u[t.getMonth()]},c:null,d:Ke,e:Ke,f:tn,g:hn,G:pn,H:We,I:Xe,j:Je,L:Qe,m:en,M:nn,p:function(t){return i[+(t.getHours()>=12)]},q:function(t){return 1+~~(t.getMonth()/3)},Q:Rn,s:Ln,S:rn,u:on,U:an,V:cn,w:sn,W:fn,x:null,X:null,y:ln,Y:dn,Z:yn,"%":Nn},_={a:function(t){return a[t.getUTCDay()]},A:function(t){return o[t.getUTCDay()]},b:function(t){return c[t.getUTCMonth()]},B:function(t){return u[t.getUTCMonth()]},c:null,d:bn,e:bn,f:wn,g:Tn,G:Pn,H:vn,I:gn,j:mn,L:_n,m:xn,M:An,p:function(t){return i[+(t.getUTCHours()>=12)]},q:function(t){return 1+~~(t.getUTCMonth()/3)},Q:Rn,s:Ln,S:En,u:kn,U:Dn,V:On,w:Sn,W:Mn,x:null,X:null,y:Fn,Y:Bn,Z:jn,"%":Nn},w={a:function(t,e,n){var r=d.exec(e.slice(n)) +return r?(t.w=p.get(r[0].toLowerCase()),n+r[0].length):-1},A:function(t,e,n){var r=l.exec(e.slice(n)) +return r?(t.w=h.get(r[0].toLowerCase()),n+r[0].length):-1},b:function(t,e,n){var r=v.exec(e.slice(n)) +return r?(t.m=g.get(r[0].toLowerCase()),n+r[0].length):-1},B:function(t,e,n){var r=y.exec(e.slice(n)) +return r?(t.m=b.get(r[0].toLowerCase()),n+r[0].length):-1},c:function(t,n,r){return E(t,e,n,r)},d:Ie,e:Ie,f:Ve,g:je,G:Pe,H:Ue,I:Ue,j:$e,L:qe,m:Le,M:ze,p:function(t,e,n){var r=s.exec(e.slice(n)) +return r?(t.p=f.get(r[0].toLowerCase()),n+r[0].length):-1},q:Re,Q:Ye,s:Ge,S:Ze,u:Me,U:Fe,V:Te,w:Se,W:Be,x:function(t,e,r){return E(t,n,e,r)},X:function(t,e,n){return E(t,r,e,n)},y:je,Y:Pe,Z:Ne,"%":He} +function x(t,e){return function(n){var r,i,o,a=[],u=-1,c=0,s=t.length +for(n instanceof Date||(n=new Date(+n));++u53)return null +"w"in o||(o.w=1),"Z"in o?(i=(r=be(ve(o.y,0,1))).getUTCDay(),r=i>4||0===i?oe.ceil(r):oe(r),r=he.offset(r,7*(o.V-1)),o.y=r.getUTCFullYear(),o.m=r.getUTCMonth(),o.d=r.getUTCDate()+(o.w+6)%7):(i=(r=ye(ve(o.y,0,1))).getDay(),r=i>4||0===i?Ut.ceil(r):Ut(r),r=Gt.offset(r,7*(o.V-1)),o.y=r.getFullYear(),o.m=r.getMonth(),o.d=r.getDate()+(o.w+6)%7)}else("W"in o||"U"in o)&&("w"in o||(o.w="u"in o?o.u%7:"W"in o?1:0),i="Z"in o?be(ve(o.y,0,1)).getUTCDay():ye(ve(o.y,0,1)).getDay(),o.m=0,o.d="W"in o?(o.w+6)%7+7*o.W-(i+5)%7:o.w+7*o.U-(i+6)%7) +return"Z"in o?(o.H+=o.Z/100|0,o.M+=o.Z%100,be(o)):ye(o)}}function E(t,e,n,r){for(var i,o,a=0,u=e.length,c=n.length;a=c)return-1 +if(37===(i=e.charCodeAt(a++))){if(i=e.charAt(a++),!(o=w[i in we?e.charAt(a++):i])||(r=o(t,n,r))<0)return-1}else if(i!=n.charCodeAt(r++))return-1}return r}return m.x=x(n,m),m.X=x(r,m),m.c=x(e,m),_.x=x(n,_),_.X=x(r,_),_.c=x(e,_),{format:function(t){var e=x(t+="",m) +return e.toString=function(){return t},e},parse:function(t){var e=A(t+="",!1) +return e.toString=function(){return t},e},utcFormat:function(t){var e=x(t+="",_) +return e.toString=function(){return t},e},utcParse:function(t){var e=A(t+="",!0) +return e.toString=function(){return t},e}}}({dateTime:"%x, %X",date:"%-m/%-d/%Y",time:"%-I:%M:%S %p",periods:["AM","PM"],days:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],shortDays:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],months:["January","February","March","April","May","June","July","August","September","October","November","December"],shortMonths:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]}),me=ge.format,ge.parse,_e=ge.utcFormat,ge.utcParse +var In=31536e6 +function $n(t){return new Date(t)}function Un(t){return t instanceof Date?+t:+new Date(+t)}function zn(t,e,n,r,i,o,a,u,c){var s=P(),f=s.invert,h=s.domain,d=c(".%L"),p=c(":%S"),y=c("%I:%M"),b=c("%I %p"),v=c("%a %d"),g=c("%b %d"),m=c("%B"),_=c("%Y"),w=[[a,1,1e3],[a,5,5e3],[a,15,15e3],[a,30,3e4],[o,1,6e4],[o,5,3e5],[o,15,9e5],[o,30,18e5],[i,1,36e5],[i,3,108e5],[i,6,216e5],[i,12,432e5],[r,1,864e5],[r,2,1728e5],[n,1,6048e5],[e,1,2592e6],[e,3,7776e6],[t,1,In]] +function x(u){return(a(u)e(r/(t.length-1))))},n.quantiles=function(e){return Array.from({length:e+1},((n,r)=>(0,wt.Z)(t,r/e)))},n.copy=function(){return ir(e).domain(t)},o.apply(n,arguments)}function or(t,e){void 0===e&&(e=t,t=E) +for(var n=0,r=e.length-1,i=e[0],o=new Array(r<0?0:r);n{"use strict" +n.r(e),n.d(e,{create:()=>gt,creator:()=>c,local:()=>_t,matcher:()=>p,namespace:()=>o,namespaces:()=>i,pointer:()=>At,pointers:()=>Et,select:()=>vt,selectAll:()=>kt,selection:()=>bt,selector:()=>f,selectorAll:()=>d,style:()=>R,window:()=>B}) +var r="http://www.w3.org/1999/xhtml" +const i={svg:"http://www.w3.org/2000/svg",xhtml:r,xlink:"http://www.w3.org/1999/xlink",xml:"http://www.w3.org/XML/1998/namespace",xmlns:"http://www.w3.org/2000/xmlns/"} +function o(t){var e=t+="",n=e.indexOf(":") +return n>=0&&"xmlns"!==(e=t.slice(0,n))&&(t=t.slice(n+1)),i.hasOwnProperty(e)?{space:i[e],local:t}:t}function a(t){return function(){var e=this.ownerDocument,n=this.namespaceURI +return n===r&&e.documentElement.namespaceURI===r?e.createElement(t):e.createElementNS(n,t)}}function u(t){return function(){return this.ownerDocument.createElementNS(t.space,t.local)}}function c(t){var e=o(t) +return(e.local?u:a)(e)}function s(){}function f(t){return null==t?s:function(){return this.querySelector(t)}}function l(t){return"object"==typeof t&&"length"in t?t:Array.from(t)}function h(){return[]}function d(t){return null==t?h:function(){return this.querySelectorAll(t)}}function p(t){return function(){return this.matches(t)}}function y(t){return function(e){return e.matches(t)}}var b=Array.prototype.find +function v(){return this.firstElementChild}var g=Array.prototype.filter +function m(){return this.children}function _(t){return new Array(t.length)}function w(t,e){this.ownerDocument=t.ownerDocument,this.namespaceURI=t.namespaceURI,this._next=null,this._parent=t,this.__data__=e}function x(t){return function(){return t}}function A(t,e,n,r,i,o){for(var a,u=0,c=e.length,s=o.length;ue?1:t>=e?0:NaN}function C(t){return function(){this.removeAttribute(t)}}function O(t){return function(){this.removeAttributeNS(t.space,t.local)}}function S(t,e){return function(){this.setAttribute(t,e)}}function M(t,e){return function(){this.setAttributeNS(t.space,t.local,e)}}function F(t,e){return function(){var n=e.apply(this,arguments) +null==n?this.removeAttribute(t):this.setAttribute(t,n)}}function T(t,e){return function(){var n=e.apply(this,arguments) +null==n?this.removeAttributeNS(t.space,t.local):this.setAttributeNS(t.space,t.local,n)}}function B(t){return t.ownerDocument&&t.ownerDocument.defaultView||t.document&&t||t.defaultView}function P(t){return function(){this.style.removeProperty(t)}}function j(t,e,n){return function(){this.style.setProperty(t,e,n)}}function N(t,e,n){return function(){var r=e.apply(this,arguments) +null==r?this.style.removeProperty(t):this.style.setProperty(t,r,n)}}function R(t,e){return t.style.getPropertyValue(e)||B(t).getComputedStyle(t,null).getPropertyValue(e)}function L(t){return function(){delete this[t]}}function I(t,e){return function(){this[t]=e}}function $(t,e){return function(){var n=e.apply(this,arguments) +null==n?delete this[t]:this[t]=n}}function U(t){return t.trim().split(/^|\s+/)}function z(t){return t.classList||new Z(t)}function Z(t){this._node=t,this._names=U(t.getAttribute("class")||"")}function q(t,e){for(var n=z(t),r=-1,i=e.length;++r=0&&(e=t.slice(n+1),t=t.slice(0,n)),{type:t,name:e}}))}function ct(t){return function(){var e=this.__on +if(e){for(var n,r=0,i=-1,o=e.length;r=0&&(this._names.splice(e,1),this._node.setAttribute("class",this._names.join(" ")))},contains:function(t){return this._names.indexOf(t)>=0}} +var dt=[null] +function pt(t,e){this._groups=t,this._parents=e}function yt(){return new pt([[document.documentElement]],dt)}pt.prototype=yt.prototype={constructor:pt,select:function(t){"function"!=typeof t&&(t=f(t)) +for(var e=this._groups,n=e.length,r=new Array(n),i=0;i=D&&(D=w+1);!(_=v[D])&&++D=0;)(r=i[o])&&(a&&4^r.compareDocumentPosition(a)&&a.parentNode.insertBefore(r,a),a=r) +return this},sort:function(t){function e(e,n){return e&&n?t(e.__data__,n.__data__):!e-!n}t||(t=D) +for(var n=this._groups,r=n.length,i=new Array(r),o=0;o1?this.each((null==e?P:"function"==typeof e?N:j)(t,e,null==n?"":n)):R(this.node(),t)},property:function(t,e){return arguments.length>1?this.each((null==e?L:"function"==typeof e?$:I)(t,e)):this.node()[t]},classed:function(t,e){var n=U(t+"") +if(arguments.length<2){for(var r=z(this.node()),i=-1,o=n.length;++iAt(t,e)))}function kt(t){return"string"==typeof t?new pt([document.querySelectorAll(t)],[document.documentElement]):new pt([null==t?[]:l(t)],dt)}wt.prototype=_t.prototype={constructor:wt,get:function(t){for(var e=this._;!(e in t);)if(!(t=t.parentNode))return +return t[e]},set:function(t,e){return t[this._]=e},remove:function(t){return this._ in t&&delete t[this._]},toString:function(){return this._}}},6736:(t,e,n)=>{"use strict" +n.r(e),n.d(e,{arc:()=>F,area:()=>I,areaRadial:()=>G,curveBasis:()=>Ct,curveBasisClosed:()=>St,curveBasisOpen:()=>Ft,curveBumpX:()=>Bt,curveBumpY:()=>Pt,curveBundle:()=>Nt,curveCardinal:()=>It,curveCardinalClosed:()=>Ut,curveCardinalOpen:()=>Zt,curveCatmullRom:()=>Ht,curveCatmullRomClosed:()=>Gt,curveCatmullRomOpen:()=>Wt,curveLinear:()=>j,curveLinearClosed:()=>Jt,curveMonotoneX:()=>ae,curveMonotoneY:()=>ue,curveNatural:()=>fe,curveStep:()=>he,curveStepAfter:()=>pe,curveStepBefore:()=>de,line:()=>L,lineRadial:()=>Y,linkHorizontal:()=>nt,linkRadial:()=>it,linkVertical:()=>rt,pie:()=>z,pointRadial:()=>K,radialArea:()=>G,radialLine:()=>Y,stack:()=>me,stackOffsetDiverging:()=>we,stackOffsetExpand:()=>_e,stackOffsetNone:()=>ye,stackOffsetSilhouette:()=>xe,stackOffsetWiggle:()=>Ae,stackOrderAppearance:()=>Ee,stackOrderAscending:()=>De,stackOrderDescending:()=>Oe,stackOrderInsideOut:()=>Se,stackOrderNone:()=>be,stackOrderReverse:()=>Me,symbol:()=>At,symbolCircle:()=>ot,symbolCross:()=>at,symbolDiamond:()=>st,symbolSquare:()=>pt,symbolStar:()=>dt,symbolTriangle:()=>bt,symbolWye:()=>wt,symbols:()=>xt}) +const r=Math.PI,i=2*r,o=1e-6,a=i-o +function u(){this._x0=this._y0=this._x1=this._y1=null,this._=""}function c(){return new u}u.prototype=c.prototype={constructor:u,moveTo:function(t,e){this._+="M"+(this._x0=this._x1=+t)+","+(this._y0=this._y1=+e)},closePath:function(){null!==this._x1&&(this._x1=this._x0,this._y1=this._y0,this._+="Z")},lineTo:function(t,e){this._+="L"+(this._x1=+t)+","+(this._y1=+e)},quadraticCurveTo:function(t,e,n,r){this._+="Q"+ +t+","+ +e+","+(this._x1=+n)+","+(this._y1=+r)},bezierCurveTo:function(t,e,n,r,i,o){this._+="C"+ +t+","+ +e+","+ +n+","+ +r+","+(this._x1=+i)+","+(this._y1=+o)},arcTo:function(t,e,n,i,a){t=+t,e=+e,n=+n,i=+i,a=+a +var u=this._x1,c=this._y1,s=n-t,f=i-e,l=u-t,h=c-e,d=l*l+h*h +if(a<0)throw new Error("negative radius: "+a) +if(null===this._x1)this._+="M"+(this._x1=t)+","+(this._y1=e) +else if(d>o)if(Math.abs(h*s-f*l)>o&&a){var p=n-u,y=i-c,b=s*s+f*f,v=p*p+y*y,g=Math.sqrt(b),m=Math.sqrt(d),_=a*Math.tan((r-Math.acos((b+d-v)/(2*g*m)))/2),w=_/m,x=_/g +Math.abs(w-1)>o&&(this._+="L"+(t+w*l)+","+(e+w*h)),this._+="A"+a+","+a+",0,0,"+ +(h*p>l*y)+","+(this._x1=t+x*s)+","+(this._y1=e+x*f)}else this._+="L"+(this._x1=t)+","+(this._y1=e)},arc:function(t,e,n,u,c,s){t=+t,e=+e,s=!!s +var f=(n=+n)*Math.cos(u),l=n*Math.sin(u),h=t+f,d=e+l,p=1^s,y=s?u-c:c-u +if(n<0)throw new Error("negative radius: "+n) +null===this._x1?this._+="M"+h+","+d:(Math.abs(this._x1-h)>o||Math.abs(this._y1-d)>o)&&(this._+="L"+h+","+d),n&&(y<0&&(y=y%i+i),y>a?this._+="A"+n+","+n+",0,1,"+p+","+(t-f)+","+(e-l)+"A"+n+","+n+",0,1,"+p+","+(this._x1=h)+","+(this._y1=d):y>o&&(this._+="A"+n+","+n+",0,"+ +(y>=r)+","+p+","+(this._x1=t+n*Math.cos(c))+","+(this._y1=e+n*Math.sin(c))))},rect:function(t,e,n,r){this._+="M"+(this._x0=this._x1=+t)+","+(this._y0=this._y1=+e)+"h"+ +n+"v"+ +r+"h"+-n+"Z"},toString:function(){return this._}} +const s=c +function f(t){return function(){return t}}var l=Math.abs,h=Math.atan2,d=Math.cos,p=Math.max,y=Math.min,b=Math.sin,v=Math.sqrt,g=1e-12,m=Math.PI,_=m/2,w=2*m +function x(t){return t>1?0:t<-1?m:Math.acos(t)}function A(t){return t>=1?_:t<=-1?-_:Math.asin(t)}function E(t){return t.innerRadius}function k(t){return t.outerRadius}function D(t){return t.startAngle}function C(t){return t.endAngle}function O(t){return t&&t.padAngle}function S(t,e,n,r,i,o,a,u){var c=n-t,s=r-e,f=a-i,l=u-o,h=l*c-f*s +if(!(h*hT*T+B*B&&(D=O,C=S),{cx:D,cy:C,x01:-f,y01:-l,x11:D*(i/A-1),y11:C*(i/A-1)}}function F(){var t=E,e=k,n=f(0),r=null,i=D,o=C,a=O,u=null +function c(){var c,f,p=+t.apply(this,arguments),E=+e.apply(this,arguments),k=i.apply(this,arguments)-_,D=o.apply(this,arguments)-_,C=l(D-k),O=D>k +if(u||(u=c=s()),Eg)if(C>w-g)u.moveTo(E*d(k),E*b(k)),u.arc(0,0,E,k,D,!O),p>g&&(u.moveTo(p*d(D),p*b(D)),u.arc(0,0,p,D,k,O)) +else{var F,T,B=k,P=D,j=k,N=D,R=C,L=C,I=a.apply(this,arguments)/2,$=I>g&&(r?+r.apply(this,arguments):v(p*p+E*E)),U=y(l(E-p)/2,+n.apply(this,arguments)),z=U,Z=U +if($>g){var q=A($/p*b(I)),V=A($/E*b(I));(R-=2*q)>g?(j+=q*=O?1:-1,N-=q):(R=0,j=N=(k+D)/2),(L-=2*V)>g?(B+=V*=O?1:-1,P-=V):(L=0,B=P=(k+D)/2)}var H=E*d(B),Y=E*b(B),G=p*d(N),K=p*b(N) +if(U>g){var W,X=E*d(P),J=E*b(P),Q=p*d(j),tt=p*b(j) +if(Cg?Z>g?(F=M(Q,tt,H,Y,E,Z,O),T=M(X,J,G,K,E,Z,O),u.moveTo(F.cx+F.x01,F.cy+F.y01),Zg&&R>g?z>g?(F=M(G,K,X,J,p,-z,O),T=M(H,Y,Q,tt,p,-z,O),u.lineTo(F.cx+F.x01,F.cy+F.y01),z=l;--h)u.point(v[h],g[h]) +u.lineEnd(),u.areaEnd()}b&&(v[f]=+t(d,f,c),g[f]=+e(d,f,c),u.point(r?+r(d,f,c):v[f],n?+n(d,f,c):g[f]))}if(p)return u=null,p+""||null}function l(){return L().defined(i).curve(a).context(o)}return t="function"==typeof t?t:void 0===t?N:f(+t),e="function"==typeof e?e:f(void 0===e?0:+e),n="function"==typeof n?n:void 0===n?R:f(+n),c.x=function(e){return arguments.length?(t="function"==typeof e?e:f(+e),r=null,c):t},c.x0=function(e){return arguments.length?(t="function"==typeof e?e:f(+e),c):t},c.x1=function(t){return arguments.length?(r=null==t?null:"function"==typeof t?t:f(+t),c):r},c.y=function(t){return arguments.length?(e="function"==typeof t?t:f(+t),n=null,c):e},c.y0=function(t){return arguments.length?(e="function"==typeof t?t:f(+t),c):e},c.y1=function(t){return arguments.length?(n=null==t?null:"function"==typeof t?t:f(+t),c):n},c.lineX0=c.lineY0=function(){return l().x(t).y(e)},c.lineY1=function(){return l().x(t).y(n)},c.lineX1=function(){return l().x(r).y(e)},c.defined=function(t){return arguments.length?(i="function"==typeof t?t:f(!!t),c):i},c.curve=function(t){return arguments.length?(a=t,null!=o&&(u=a(o)),c):a},c.context=function(t){return arguments.length?(null==t?o=u=null:u=a(o=t),c):o},c}function $(t,e){return et?1:e>=t?0:NaN}function U(t){return t}function z(){var t=U,e=$,n=null,r=f(0),i=f(w),o=f(0) +function a(a){var u,c,s,f,l,h=(a=B(a)).length,d=0,p=new Array(h),y=new Array(h),b=+r.apply(this,arguments),v=Math.min(w,Math.max(-w,i.apply(this,arguments)-b)),g=Math.min(Math.abs(v)/h,o.apply(this,arguments)),m=g*(v<0?-1:1) +for(u=0;u0&&(d+=l) +for(null!=e?p.sort((function(t,n){return e(y[t],y[n])})):null!=n&&p.sort((function(t,e){return n(a[t],a[e])})),u=0,s=d?(v-h*m)/d:0;u0?l*s:0)+m,y[c]={data:a[c],index:u,value:l,startAngle:b,endAngle:f,padAngle:g} +return y}return a.value=function(e){return arguments.length?(t="function"==typeof e?e:f(+e),a):t},a.sortValues=function(t){return arguments.length?(e=t,n=null,a):e},a.sort=function(t){return arguments.length?(n=t,e=null,a):n},a.startAngle=function(t){return arguments.length?(r="function"==typeof t?t:f(+t),a):r},a.endAngle=function(t){return arguments.length?(i="function"==typeof t?t:f(+t),a):i},a.padAngle=function(t){return arguments.length?(o="function"==typeof t?t:f(+t),a):o},a}P.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._point=0},lineEnd:function(){(this._line||0!==this._line&&1===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1,this._line?this._context.lineTo(t,e):this._context.moveTo(t,e) +break +case 1:this._point=2 +default:this._context.lineTo(t,e)}}} +var Z=V(j) +function q(t){this._curve=t}function V(t){function e(e){return new q(t(e))}return e._curve=t,e}function H(t){var e=t.curve +return t.angle=t.x,delete t.x,t.radius=t.y,delete t.y,t.curve=function(t){return arguments.length?e(V(t)):e()._curve},t}function Y(){return H(L().curve(Z))}function G(){var t=I().curve(Z),e=t.curve,n=t.lineX0,r=t.lineX1,i=t.lineY0,o=t.lineY1 +return t.angle=t.x,delete t.x,t.startAngle=t.x0,delete t.x0,t.endAngle=t.x1,delete t.x1,t.radius=t.y,delete t.y,t.innerRadius=t.y0,delete t.y0,t.outerRadius=t.y1,delete t.y1,t.lineStartAngle=function(){return H(n())},delete t.lineX0,t.lineEndAngle=function(){return H(r())},delete t.lineX1,t.lineInnerRadius=function(){return H(i())},delete t.lineY0,t.lineOuterRadius=function(){return H(o())},delete t.lineY1,t.curve=function(t){return arguments.length?e(V(t)):e()._curve},t}function K(t,e){return[(e=+e)*Math.cos(t-=Math.PI/2),e*Math.sin(t)]}function W(t){return t.source}function X(t){return t.target}function J(t){var e=W,n=X,r=N,i=R,o=null +function a(){var a,u=T.call(arguments),c=e.apply(this,u),f=n.apply(this,u) +if(o||(o=a=s()),t(o,+r.apply(this,(u[0]=c,u)),+i.apply(this,u),+r.apply(this,(u[0]=f,u)),+i.apply(this,u)),a)return o=null,a+""||null}return a.source=function(t){return arguments.length?(e=t,a):e},a.target=function(t){return arguments.length?(n=t,a):n},a.x=function(t){return arguments.length?(r="function"==typeof t?t:f(+t),a):r},a.y=function(t){return arguments.length?(i="function"==typeof t?t:f(+t),a):i},a.context=function(t){return arguments.length?(o=null==t?null:t,a):o},a}function Q(t,e,n,r,i){t.moveTo(e,n),t.bezierCurveTo(e=(e+r)/2,n,e,i,r,i)}function tt(t,e,n,r,i){t.moveTo(e,n),t.bezierCurveTo(e,n=(n+i)/2,r,n,r,i)}function et(t,e,n,r,i){var o=K(e,n),a=K(e,n=(n+i)/2),u=K(r,n),c=K(r,i) +t.moveTo(o[0],o[1]),t.bezierCurveTo(a[0],a[1],u[0],u[1],c[0],c[1])}function nt(){return J(Q)}function rt(){return J(tt)}function it(){var t=J(et) +return t.angle=t.x,delete t.x,t.radius=t.y,delete t.y,t}q.prototype={areaStart:function(){this._curve.areaStart()},areaEnd:function(){this._curve.areaEnd()},lineStart:function(){this._curve.lineStart()},lineEnd:function(){this._curve.lineEnd()},point:function(t,e){this._curve.point(e*Math.sin(t),e*-Math.cos(t))}} +const ot={draw:function(t,e){var n=Math.sqrt(e/m) +t.moveTo(n,0),t.arc(0,0,n,0,w)}},at={draw:function(t,e){var n=Math.sqrt(e/5)/2 +t.moveTo(-3*n,-n),t.lineTo(-n,-n),t.lineTo(-n,-3*n),t.lineTo(n,-3*n),t.lineTo(n,-n),t.lineTo(3*n,-n),t.lineTo(3*n,n),t.lineTo(n,n),t.lineTo(n,3*n),t.lineTo(-n,3*n),t.lineTo(-n,n),t.lineTo(-3*n,n),t.closePath()}} +var ut=Math.sqrt(1/3),ct=2*ut +const st={draw:function(t,e){var n=Math.sqrt(e/ct),r=n*ut +t.moveTo(0,-n),t.lineTo(r,0),t.lineTo(0,n),t.lineTo(-r,0),t.closePath()}} +var ft=Math.sin(m/10)/Math.sin(7*m/10),lt=Math.sin(w/10)*ft,ht=-Math.cos(w/10)*ft +const dt={draw:function(t,e){var n=Math.sqrt(.8908130915292852*e),r=lt*n,i=ht*n +t.moveTo(0,-n),t.lineTo(r,i) +for(var o=1;o<5;++o){var a=w*o/5,u=Math.cos(a),c=Math.sin(a) +t.lineTo(c*n,-u*n),t.lineTo(u*r-c*i,c*r+u*i)}t.closePath()}},pt={draw:function(t,e){var n=Math.sqrt(e),r=-n/2 +t.rect(r,r,n,n)}} +var yt=Math.sqrt(3) +const bt={draw:function(t,e){var n=-Math.sqrt(e/(3*yt)) +t.moveTo(0,2*n),t.lineTo(-yt*n,-n),t.lineTo(yt*n,-n),t.closePath()}} +var vt=-.5,gt=Math.sqrt(3)/2,mt=1/Math.sqrt(12),_t=3*(mt/2+1) +const wt={draw:function(t,e){var n=Math.sqrt(e/_t),r=n/2,i=n*mt,o=r,a=n*mt+n,u=-o,c=a +t.moveTo(r,i),t.lineTo(o,a),t.lineTo(u,c),t.lineTo(vt*r-gt*i,gt*r+vt*i),t.lineTo(vt*o-gt*a,gt*o+vt*a),t.lineTo(vt*u-gt*c,gt*u+vt*c),t.lineTo(vt*r+gt*i,vt*i-gt*r),t.lineTo(vt*o+gt*a,vt*a-gt*o),t.lineTo(vt*u+gt*c,vt*c-gt*u),t.closePath()}} +var xt=[ot,at,st,pt,dt,bt,wt] +function At(t,e){var n=null +function r(){var r +if(n||(n=r=s()),t.apply(this,arguments).draw(n,+e.apply(this,arguments)),r)return n=null,r+""||null}return t="function"==typeof t?t:f(t||ot),e="function"==typeof e?e:f(void 0===e?64:+e),r.type=function(e){return arguments.length?(t="function"==typeof e?e:f(e),r):t},r.size=function(t){return arguments.length?(e="function"==typeof t?t:f(+t),r):e},r.context=function(t){return arguments.length?(n=null==t?null:t,r):n},r}function Et(){}function kt(t,e,n){t._context.bezierCurveTo((2*t._x0+t._x1)/3,(2*t._y0+t._y1)/3,(t._x0+2*t._x1)/3,(t._y0+2*t._y1)/3,(t._x0+4*t._x1+e)/6,(t._y0+4*t._y1+n)/6)}function Dt(t){this._context=t}function Ct(t){return new Dt(t)}function Ot(t){this._context=t}function St(t){return new Ot(t)}function Mt(t){this._context=t}function Ft(t){return new Mt(t)}Dt.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._y0=this._y1=NaN,this._point=0},lineEnd:function(){switch(this._point){case 3:kt(this,this._x1,this._y1) +case 2:this._context.lineTo(this._x1,this._y1)}(this._line||0!==this._line&&1===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1,this._line?this._context.lineTo(t,e):this._context.moveTo(t,e) +break +case 1:this._point=2 +break +case 2:this._point=3,this._context.lineTo((5*this._x0+this._x1)/6,(5*this._y0+this._y1)/6) +default:kt(this,t,e)}this._x0=this._x1,this._x1=t,this._y0=this._y1,this._y1=e}},Ot.prototype={areaStart:Et,areaEnd:Et,lineStart:function(){this._x0=this._x1=this._x2=this._x3=this._x4=this._y0=this._y1=this._y2=this._y3=this._y4=NaN,this._point=0},lineEnd:function(){switch(this._point){case 1:this._context.moveTo(this._x2,this._y2),this._context.closePath() +break +case 2:this._context.moveTo((this._x2+2*this._x3)/3,(this._y2+2*this._y3)/3),this._context.lineTo((this._x3+2*this._x2)/3,(this._y3+2*this._y2)/3),this._context.closePath() +break +case 3:this.point(this._x2,this._y2),this.point(this._x3,this._y3),this.point(this._x4,this._y4)}},point:function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1,this._x2=t,this._y2=e +break +case 1:this._point=2,this._x3=t,this._y3=e +break +case 2:this._point=3,this._x4=t,this._y4=e,this._context.moveTo((this._x0+4*this._x1+t)/6,(this._y0+4*this._y1+e)/6) +break +default:kt(this,t,e)}this._x0=this._x1,this._x1=t,this._y0=this._y1,this._y1=e}},Mt.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._y0=this._y1=NaN,this._point=0},lineEnd:function(){(this._line||0!==this._line&&3===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1 +break +case 1:this._point=2 +break +case 2:this._point=3 +var n=(this._x0+4*this._x1+t)/6,r=(this._y0+4*this._y1+e)/6 +this._line?this._context.lineTo(n,r):this._context.moveTo(n,r) +break +case 3:this._point=4 +default:kt(this,t,e)}this._x0=this._x1,this._x1=t,this._y0=this._y1,this._y1=e}} +class Tt{constructor(t,e){this._context=t,this._x=e}areaStart(){this._line=0}areaEnd(){this._line=NaN}lineStart(){this._point=0}lineEnd(){(this._line||0!==this._line&&1===this._point)&&this._context.closePath(),this._line=1-this._line}point(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1,this._line?this._context.lineTo(t,e):this._context.moveTo(t,e) +break +case 1:this._point=2 +default:this._x?this._context.bezierCurveTo(this._x0=(this._x0+t)/2,this._y0,this._x0,e,t,e):this._context.bezierCurveTo(this._x0,this._y0=(this._y0+e)/2,t,this._y0,t,e)}this._x0=t,this._y0=e}}function Bt(t){return new Tt(t,!0)}function Pt(t){return new Tt(t,!1)}function jt(t,e){this._basis=new Dt(t),this._beta=e}jt.prototype={lineStart:function(){this._x=[],this._y=[],this._basis.lineStart()},lineEnd:function(){var t=this._x,e=this._y,n=t.length-1 +if(n>0)for(var r,i=t[0],o=e[0],a=t[n]-i,u=e[n]-o,c=-1;++c<=n;)r=c/n,this._basis.point(this._beta*t[c]+(1-this._beta)*(i+r*a),this._beta*e[c]+(1-this._beta)*(o+r*u)) +this._x=this._y=null,this._basis.lineEnd()},point:function(t,e){this._x.push(+t),this._y.push(+e)}} +const Nt=function t(e){function n(t){return 1===e?new Dt(t):new jt(t,e)}return n.beta=function(e){return t(+e)},n}(.85) +function Rt(t,e,n){t._context.bezierCurveTo(t._x1+t._k*(t._x2-t._x0),t._y1+t._k*(t._y2-t._y0),t._x2+t._k*(t._x1-e),t._y2+t._k*(t._y1-n),t._x2,t._y2)}function Lt(t,e){this._context=t,this._k=(1-e)/6}Lt.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._x2=this._y0=this._y1=this._y2=NaN,this._point=0},lineEnd:function(){switch(this._point){case 2:this._context.lineTo(this._x2,this._y2) +break +case 3:Rt(this,this._x1,this._y1)}(this._line||0!==this._line&&1===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1,this._line?this._context.lineTo(t,e):this._context.moveTo(t,e) +break +case 1:this._point=2,this._x1=t,this._y1=e +break +case 2:this._point=3 +default:Rt(this,t,e)}this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=e}} +const It=function t(e){function n(t){return new Lt(t,e)}return n.tension=function(e){return t(+e)},n}(0) +function $t(t,e){this._context=t,this._k=(1-e)/6}$t.prototype={areaStart:Et,areaEnd:Et,lineStart:function(){this._x0=this._x1=this._x2=this._x3=this._x4=this._x5=this._y0=this._y1=this._y2=this._y3=this._y4=this._y5=NaN,this._point=0},lineEnd:function(){switch(this._point){case 1:this._context.moveTo(this._x3,this._y3),this._context.closePath() +break +case 2:this._context.lineTo(this._x3,this._y3),this._context.closePath() +break +case 3:this.point(this._x3,this._y3),this.point(this._x4,this._y4),this.point(this._x5,this._y5)}},point:function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1,this._x3=t,this._y3=e +break +case 1:this._point=2,this._context.moveTo(this._x4=t,this._y4=e) +break +case 2:this._point=3,this._x5=t,this._y5=e +break +default:Rt(this,t,e)}this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=e}} +const Ut=function t(e){function n(t){return new $t(t,e)}return n.tension=function(e){return t(+e)},n}(0) +function zt(t,e){this._context=t,this._k=(1-e)/6}zt.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._x2=this._y0=this._y1=this._y2=NaN,this._point=0},lineEnd:function(){(this._line||0!==this._line&&3===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1 +break +case 1:this._point=2 +break +case 2:this._point=3,this._line?this._context.lineTo(this._x2,this._y2):this._context.moveTo(this._x2,this._y2) +break +case 3:this._point=4 +default:Rt(this,t,e)}this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=e}} +const Zt=function t(e){function n(t){return new zt(t,e)}return n.tension=function(e){return t(+e)},n}(0) +function qt(t,e,n){var r=t._x1,i=t._y1,o=t._x2,a=t._y2 +if(t._l01_a>g){var u=2*t._l01_2a+3*t._l01_a*t._l12_a+t._l12_2a,c=3*t._l01_a*(t._l01_a+t._l12_a) +r=(r*u-t._x0*t._l12_2a+t._x2*t._l01_2a)/c,i=(i*u-t._y0*t._l12_2a+t._y2*t._l01_2a)/c}if(t._l23_a>g){var s=2*t._l23_2a+3*t._l23_a*t._l12_a+t._l12_2a,f=3*t._l23_a*(t._l23_a+t._l12_a) +o=(o*s+t._x1*t._l23_2a-e*t._l12_2a)/f,a=(a*s+t._y1*t._l23_2a-n*t._l12_2a)/f}t._context.bezierCurveTo(r,i,o,a,t._x2,t._y2)}function Vt(t,e){this._context=t,this._alpha=e}Vt.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._x2=this._y0=this._y1=this._y2=NaN,this._l01_a=this._l12_a=this._l23_a=this._l01_2a=this._l12_2a=this._l23_2a=this._point=0},lineEnd:function(){switch(this._point){case 2:this._context.lineTo(this._x2,this._y2) +break +case 3:this.point(this._x2,this._y2)}(this._line||0!==this._line&&1===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(t,e){if(t=+t,e=+e,this._point){var n=this._x2-t,r=this._y2-e +this._l23_a=Math.sqrt(this._l23_2a=Math.pow(n*n+r*r,this._alpha))}switch(this._point){case 0:this._point=1,this._line?this._context.lineTo(t,e):this._context.moveTo(t,e) +break +case 1:this._point=2 +break +case 2:this._point=3 +default:qt(this,t,e)}this._l01_a=this._l12_a,this._l12_a=this._l23_a,this._l01_2a=this._l12_2a,this._l12_2a=this._l23_2a,this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=e}} +const Ht=function t(e){function n(t){return e?new Vt(t,e):new Lt(t,0)}return n.alpha=function(e){return t(+e)},n}(.5) +function Yt(t,e){this._context=t,this._alpha=e}Yt.prototype={areaStart:Et,areaEnd:Et,lineStart:function(){this._x0=this._x1=this._x2=this._x3=this._x4=this._x5=this._y0=this._y1=this._y2=this._y3=this._y4=this._y5=NaN,this._l01_a=this._l12_a=this._l23_a=this._l01_2a=this._l12_2a=this._l23_2a=this._point=0},lineEnd:function(){switch(this._point){case 1:this._context.moveTo(this._x3,this._y3),this._context.closePath() +break +case 2:this._context.lineTo(this._x3,this._y3),this._context.closePath() +break +case 3:this.point(this._x3,this._y3),this.point(this._x4,this._y4),this.point(this._x5,this._y5)}},point:function(t,e){if(t=+t,e=+e,this._point){var n=this._x2-t,r=this._y2-e +this._l23_a=Math.sqrt(this._l23_2a=Math.pow(n*n+r*r,this._alpha))}switch(this._point){case 0:this._point=1,this._x3=t,this._y3=e +break +case 1:this._point=2,this._context.moveTo(this._x4=t,this._y4=e) +break +case 2:this._point=3,this._x5=t,this._y5=e +break +default:qt(this,t,e)}this._l01_a=this._l12_a,this._l12_a=this._l23_a,this._l01_2a=this._l12_2a,this._l12_2a=this._l23_2a,this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=e}} +const Gt=function t(e){function n(t){return e?new Yt(t,e):new $t(t,0)}return n.alpha=function(e){return t(+e)},n}(.5) +function Kt(t,e){this._context=t,this._alpha=e}Kt.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._x2=this._y0=this._y1=this._y2=NaN,this._l01_a=this._l12_a=this._l23_a=this._l01_2a=this._l12_2a=this._l23_2a=this._point=0},lineEnd:function(){(this._line||0!==this._line&&3===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(t,e){if(t=+t,e=+e,this._point){var n=this._x2-t,r=this._y2-e +this._l23_a=Math.sqrt(this._l23_2a=Math.pow(n*n+r*r,this._alpha))}switch(this._point){case 0:this._point=1 +break +case 1:this._point=2 +break +case 2:this._point=3,this._line?this._context.lineTo(this._x2,this._y2):this._context.moveTo(this._x2,this._y2) +break +case 3:this._point=4 +default:qt(this,t,e)}this._l01_a=this._l12_a,this._l12_a=this._l23_a,this._l01_2a=this._l12_2a,this._l12_2a=this._l23_2a,this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=e}} +const Wt=function t(e){function n(t){return e?new Kt(t,e):new zt(t,0)}return n.alpha=function(e){return t(+e)},n}(.5) +function Xt(t){this._context=t}function Jt(t){return new Xt(t)}function Qt(t){return t<0?-1:1}function te(t,e,n){var r=t._x1-t._x0,i=e-t._x1,o=(t._y1-t._y0)/(r||i<0&&-0),a=(n-t._y1)/(i||r<0&&-0),u=(o*i+a*r)/(r+i) +return(Qt(o)+Qt(a))*Math.min(Math.abs(o),Math.abs(a),.5*Math.abs(u))||0}function ee(t,e){var n=t._x1-t._x0 +return n?(3*(t._y1-t._y0)/n-e)/2:e}function ne(t,e,n){var r=t._x0,i=t._y0,o=t._x1,a=t._y1,u=(o-r)/3 +t._context.bezierCurveTo(r+u,i+u*e,o-u,a-u*n,o,a)}function re(t){this._context=t}function ie(t){this._context=new oe(t)}function oe(t){this._context=t}function ae(t){return new re(t)}function ue(t){return new ie(t)}function ce(t){this._context=t}function se(t){var e,n,r=t.length-1,i=new Array(r),o=new Array(r),a=new Array(r) +for(i[0]=0,o[0]=2,a[0]=t[0]+2*t[1],e=1;e=0;--e)i[e]=(a[e]-i[e+1])/o[e] +for(o[r-1]=(t[r]+i[r-1])/2,e=0;e1)for(var n,r,i,o=1,a=t[e[0]],u=a.length;o=0;)n[e]=e +return n}function ve(t,e){return t[e]}function ge(t){const e=[] +return e.key=t,e}function me(){var t=f([]),e=be,n=ye,r=ve +function i(i){var o,a,u=Array.from(t.apply(this,arguments),ge),c=u.length,s=-1 +for(const t of i)for(o=0,++s;o0){for(var n,r,i,o=0,a=t[0].length;o0)for(var n,r,i,o,a,u,c=0,s=t[e[0]].length;c0?(r[0]=o,r[1]=o+=i):i<0?(r[1]=a,r[0]=a+=i):(r[0]=0,r[1]=i)}function xe(t,e){if((n=t.length)>0){for(var n,r=0,i=t[e[0]],o=i.length;r0&&(r=(n=t[e[0]]).length)>0){for(var n,r,i,o=0,a=1;ao&&(o=e,r=n) +return r}function De(t){var e=t.map(Ce) +return be(t).sort((function(t,n){return e[t]-e[n]}))}function Ce(t){for(var e,n=0,r=-1,i=t.length;++r=0&&(this._t=1-this._t,this._line=1-this._line)},point:function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1,this._line?this._context.lineTo(t,e):this._context.moveTo(t,e) +break +case 1:this._point=2 +default:if(this._t<=0)this._context.lineTo(this._x,e),this._context.lineTo(t,e) +else{var n=this._x*(1-this._t)+t*this._t +this._context.lineTo(n,this._y),this._context.lineTo(n,e)}}this._x=t,this._y=e}}},4434:function(t){t.exports=function(){"use strict" +var t="millisecond",e="second",n="minute",r="hour",i="day",o="week",a="month",u="quarter",c="year",s="date",f=/^(\d{4})[-/]?(\d{1,2})?[-/]?(\d{0,2})[^0-9]*(\d{1,2})?:?(\d{1,2})?:?(\d{1,2})?[.:]?(\d+)?$/,l=/\[([^\]]+)]|Y{1,4}|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|Z{1,2}|SSS/g,h={name:"en",weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_")},d=function(t,e,n){var r=String(t) +return!r||r.length>=e?t:""+Array(e+1-r.length).join(n)+t},p={s:d,z:function(t){var e=-t.utcOffset(),n=Math.abs(e),r=Math.floor(n/60),i=n%60 +return(e<=0?"+":"-")+d(r,2,"0")+":"+d(i,2,"0")},m:function t(e,n){if(e.date()0,b<=y.r||!y.r){b<=1&&p>0&&(y=h[p-1]) +var v=l[y.l] +u&&(b=u(""+b)),s="string"==typeof v?v.replace("%d",b):v(b,r,y.l,f) +break}}if(r)return s +var g=f?l.future:l.past +return"function"==typeof g?g(s):g.replace("%s",s)},r.to=function(t,e){return o(t,e,this,!0)},r.from=function(t,e){return o(t,e,this)} +var a=function(t){return t.$u?n.utc():n()} +r.toNow=function(t){return this.to(a(this),t)},r.fromNow=function(t){return this.from(a(this),t)}}}()},2999:t=>{"use strict" +var e=function(t){return function(t){return!!t&&"object"==typeof t}(t)&&!function(t){var e=Object.prototype.toString.call(t) +return"[object RegExp]"===e||"[object Date]"===e||function(t){return t.$$typeof===n}(t)}(t)},n="function"==typeof Symbol&&Symbol.for?Symbol.for("react.element"):60103 +function r(t,e){return!1!==e.clone&&e.isMergeableObject(t)?u((n=t,Array.isArray(n)?[]:{}),t,e):t +var n}function i(t,e,n){return t.concat(e).map((function(t){return r(t,n)}))}function o(t){return Object.keys(t).concat(function(t){return Object.getOwnPropertySymbols?Object.getOwnPropertySymbols(t).filter((function(e){return t.propertyIsEnumerable(e)})):[]}(t))}function a(t,e){try{return e in t}catch(t){return!1}}function u(t,n,c){(c=c||{}).arrayMerge=c.arrayMerge||i,c.isMergeableObject=c.isMergeableObject||e,c.cloneUnlessOtherwiseSpecified=r +var s=Array.isArray(n) +return s===Array.isArray(t)?s?c.arrayMerge(t,n,c):function(t,e,n){var i={} +return n.isMergeableObject(t)&&o(t).forEach((function(e){i[e]=r(t[e],n)})),o(e).forEach((function(o){(function(t,e){return a(t,e)&&!(Object.hasOwnProperty.call(t,e)&&Object.propertyIsEnumerable.call(t,e))})(t,o)||(a(t,o)&&n.isMergeableObject(e[o])?i[o]=function(t,e){if(!e.customMerge)return u +var n=e.customMerge(t) +return"function"==typeof n?n:u}(o,n)(t[o],e[o],n):i[o]=r(e[o],n))})),i}(t,n,c):r(n,c)}u.all=function(t,e){if(!Array.isArray(t))throw new Error("first argument should be an array") +return t.reduce((function(t,n){return u(t,n,e)}),{})} +var c=u +t.exports=c},6673:(t,e,n)=>{"use strict" +n.r(e),n.d(e,{default:()=>P}) +var r=n(4927),i=["input","select","textarea","a[href]","button","[tabindex]:not(slot)","audio[controls]","video[controls]",'[contenteditable]:not([contenteditable="false"])',"details>summary:first-of-type","details"],o=i.join(","),a="undefined"==typeof Element,u=a?function(){}:Element.prototype.matches||Element.prototype.msMatchesSelector||Element.prototype.webkitMatchesSelector,c=!a&&Element.prototype.getRootNode?function(t){return t.getRootNode()}:function(t){return t.ownerDocument},s=function(t,e,n){var r=Array.prototype.slice.apply(t.querySelectorAll(o)) +return e&&u.call(t,o)&&r.unshift(t),r.filter(n)},f=function t(e,n,r){for(var i=[],a=Array.from(e);a.length;){var c=a.shift() +if("SLOT"===c.tagName){var s=c.assignedElements(),f=t(s.length?s:c.children,!0,r) +r.flatten?i.push.apply(i,f):i.push({scope:c,candidates:f})}else{u.call(c,o)&&r.filter(c)&&(n||!e.includes(c))&&i.push(c) +var l=c.shadowRoot||"function"==typeof r.getShadowRoot&&r.getShadowRoot(c),h=!r.shadowRootFilter||r.shadowRootFilter(c) +if(l&&h){var d=t(!0===l?c.children:l.children,!0,r) +r.flatten?i.push.apply(i,d):i.push({scope:c,candidates:d})}else a.unshift.apply(a,c.children)}}return i},l=function(t,e){return t.tabIndex<0&&(e||/^(AUDIO|VIDEO|DETAILS)$/.test(t.tagName)||t.isContentEditable)&&isNaN(parseInt(t.getAttribute("tabindex"),10))?0:t.tabIndex},h=function(t,e){return t.tabIndex===e.tabIndex?t.documentOrder-e.documentOrder:t.tabIndex-e.tabIndex},d=function(t){return"INPUT"===t.tagName},p=function(t){var e=t.getBoundingClientRect(),n=e.width,r=e.height +return 0===n&&0===r},y=function(t,e){return!(e.disabled||function(t){return d(t)&&"hidden"===t.type}(e)||function(t,e){var n=e.displayCheck,r=e.getShadowRoot +if("hidden"===getComputedStyle(t).visibility)return!0 +var i=u.call(t,"details>summary:first-of-type")?t.parentElement:t +if(u.call(i,"details:not([open]) *"))return!0 +var o=c(t).host,a=(null==o?void 0:o.ownerDocument.contains(o))||t.ownerDocument.contains(t) +if(n&&"full"!==n){if("non-zero-area"===n)return p(t)}else{if("function"==typeof r){for(var s=t;t;){var f=t.parentElement,l=c(t) +if(f&&!f.shadowRoot&&!0===r(f))return p(t) +t=t.assignedSlot?t.assignedSlot:f||l===t.ownerDocument?f:l.host}t=s}if(a)return!t.getClientRects().length}return!1}(e,t)||function(t){return"DETAILS"===t.tagName&&Array.prototype.slice.apply(t.children).some((function(t){return"SUMMARY"===t.tagName}))}(e)||function(t){if(/^(INPUT|BUTTON|SELECT|TEXTAREA)$/.test(t.tagName))for(var e=t.parentElement;e;){if("FIELDSET"===e.tagName&&e.disabled){for(var n=0;n=0)},g=function t(e){var n=[],r=[] +return e.forEach((function(e,i){var o=!!e.scope,a=o?e.scope:e,u=l(a,o),c=o?t(e.candidates):a +0===u?o?n.push.apply(n,c):n.push(a):r.push({documentOrder:i,tabIndex:u,item:e,isScope:o,content:c})})),r.sort(h).reduce((function(t,e){return e.isScope?t.push.apply(t,e.content):t.push(e.content),t}),[]).concat(n)},m=function(t,e){var n +return n=(e=e||{}).getShadowRoot?f([t],e.includeContainer,{filter:b.bind(null,e),flatten:!1,getShadowRoot:e.getShadowRoot,shadowRootFilter:v}):s(t,e.includeContainer,b.bind(null,e)),g(n)},_=function(t,e){if(e=e||{},!t)throw new Error("No node provided") +return!1!==u.call(t,o)&&b(e,t)},w=i.concat("iframe").join(","),x=function(t,e){if(e=e||{},!t)throw new Error("No node provided") +return!1!==u.call(t,w)&&y(e,t)} +function A(t,e){var n=Object.keys(t) +if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(t) +e&&(r=r.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),n.push.apply(n,r)}return n}function E(t){for(var e=1;e0){var e=D[D.length-1] +e!==t&&e.pause()}var n=D.indexOf(t);-1===n||D.splice(n,1),D.push(t)},deactivateTrap:function(t){var e=D.indexOf(t);-1!==e&&D.splice(e,1),D.length>0&&D[D.length-1].unpause()}}),O=function(t){return setTimeout(t,0)},S=function(t,e){var n=-1 +return t.every((function(t,r){return!e(t)||(n=r,!1)})),n},M=function(t){for(var e=arguments.length,n=new Array(e>1?e-1:0),r=1;r1?n-1:0),a=1;a=0)t=r.activeElement +else{var e=o.tabbableGroups[0] +t=e&&e.firstTabbableNode||c("fallbackFocus")}if(!t)throw new Error("Your focus-trap needs to have at least one focusable element") +return t},h=function(){if(o.containerGroups=o.containers.map((function(t){var e,n,r=m(t,i.tabbableOptions),o=(e=t,(n=(n=i.tabbableOptions)||{}).getShadowRoot?f([e],n.includeContainer,{filter:y.bind(null,n),flatten:!0,getShadowRoot:n.getShadowRoot}):s(e,n.includeContainer,y.bind(null,n))) +return{container:t,tabbableNodes:r,focusableNodes:o,firstTabbableNode:r.length>0?r[0]:null,lastTabbableNode:r.length>0?r[r.length-1]:null,nextTabbableNode:function(t){var e=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],n=o.findIndex((function(e){return e===t})) +if(!(n<0))return e?o.slice(n+1).find((function(t){return _(t,i.tabbableOptions)})):o.slice(0,n).reverse().find((function(t){return _(t,i.tabbableOptions)}))}}})),o.tabbableGroups=o.containerGroups.filter((function(t){return t.tabbableNodes.length>0})),o.tabbableGroups.length<=0&&!c("fallbackFocus"))throw new Error("Your focus-trap must have at least one container with at least one tabbable node in it at all times")},d=function t(e){!1!==e&&e!==r.activeElement&&(e&&e.focus?(e.focus({preventScroll:!!i.preventScroll}),o.mostRecentlyFocusedNode=e,function(t){return t.tagName&&"input"===t.tagName.toLowerCase()&&"function"==typeof t.select}(e)&&e.select()):t(l()))},p=function(t){var e=c("setReturnFocus",t) +return e||!1!==e&&t},b=function(t){var e=F(t) +u(e)>=0||(M(i.clickOutsideDeactivates,t)?n.deactivate({returnFocus:i.returnFocusOnDeactivate&&!x(e,i.tabbableOptions)}):M(i.allowOutsideClick,t)||t.preventDefault())},v=function(t){var e=F(t),n=u(e)>=0 +n||e instanceof Document?n&&(o.mostRecentlyFocusedNode=e):(t.stopImmediatePropagation(),d(o.mostRecentlyFocusedNode||l()))},g=function(t){if(function(t){return"Escape"===t.key||"Esc"===t.key||27===t.keyCode}(t)&&!1!==M(i.escapeDeactivates,t))return t.preventDefault(),void n.deactivate();(function(t){return"Tab"===t.key||9===t.keyCode})(t)&&function(t){var e=F(t) +h() +var n=null +if(o.tabbableGroups.length>0){var r=u(e),a=r>=0?o.containerGroups[r]:void 0 +if(r<0)n=t.shiftKey?o.tabbableGroups[o.tabbableGroups.length-1].lastTabbableNode:o.tabbableGroups[0].firstTabbableNode +else if(t.shiftKey){var s=S(o.tabbableGroups,(function(t){var n=t.firstTabbableNode +return e===n})) +if(s<0&&(a.container===e||x(e,i.tabbableOptions)&&!_(e,i.tabbableOptions)&&!a.nextTabbableNode(e,!1))&&(s=r),s>=0){var f=0===s?o.tabbableGroups.length-1:s-1 +n=o.tabbableGroups[f].lastTabbableNode}}else{var l=S(o.tabbableGroups,(function(t){var n=t.lastTabbableNode +return e===n})) +if(l<0&&(a.container===e||x(e,i.tabbableOptions)&&!_(e,i.tabbableOptions)&&!a.nextTabbableNode(e))&&(l=r),l>=0){var p=l===o.tabbableGroups.length-1?0:l+1 +n=o.tabbableGroups[p].firstTabbableNode}}}else n=c("fallbackFocus") +n&&(t.preventDefault(),d(n))}(t)},w=function(t){var e=F(t) +u(e)>=0||M(i.clickOutsideDeactivates,t)||M(i.allowOutsideClick,t)||(t.preventDefault(),t.stopImmediatePropagation())},A=function(){if(o.active)return C.activateTrap(n),o.delayInitialFocusTimer=i.delayInitialFocus?O((function(){d(l())})):d(l()),r.addEventListener("focusin",v,!0),r.addEventListener("mousedown",b,{capture:!0,passive:!1}),r.addEventListener("touchstart",b,{capture:!0,passive:!1}),r.addEventListener("click",w,{capture:!0,passive:!1}),r.addEventListener("keydown",g,{capture:!0,passive:!1}),n},k=function(){if(o.active)return r.removeEventListener("focusin",v,!0),r.removeEventListener("mousedown",b,!0),r.removeEventListener("touchstart",b,!0),r.removeEventListener("click",w,!0),r.removeEventListener("keydown",g,!0),n} +return(n={get active(){return o.active},get paused(){return o.paused},activate:function(t){if(o.active)return this +var e=a(t,"onActivate"),n=a(t,"onPostActivate"),i=a(t,"checkCanFocusTrap") +i||h(),o.active=!0,o.paused=!1,o.nodeFocusedBeforeActivation=r.activeElement,e&&e() +var u=function(){i&&h(),A(),n&&n()} +return i?(i(o.containers.concat()).then(u,u),this):(u(),this)},deactivate:function(t){if(!o.active)return this +var e=E({onDeactivate:i.onDeactivate,onPostDeactivate:i.onPostDeactivate,checkCanReturnFocus:i.checkCanReturnFocus},t) +clearTimeout(o.delayInitialFocusTimer),o.delayInitialFocusTimer=void 0,k(),o.active=!1,o.paused=!1,C.deactivateTrap(n) +var r=a(e,"onDeactivate"),u=a(e,"onPostDeactivate"),c=a(e,"checkCanReturnFocus"),s=a(e,"returnFocus","returnFocusOnDeactivate") +r&&r() +var f=function(){O((function(){s&&d(p(o.nodeFocusedBeforeActivation)),u&&u()}))} +return s&&c?(c(p(o.nodeFocusedBeforeActivation)).then(f,f),this):(f(),this)},pause:function(){return o.paused||!o.active||(o.paused=!0,k()),this},unpause:function(){return o.paused&&o.active?(o.paused=!1,h(),A(),this):this},updateContainerElements:function(t){var e=[].concat(t).filter(Boolean) +return o.containers=e.map((function(t){return"string"==typeof t?r.querySelector(t):t})),o.active&&h(),this}}).updateContainerElements(t),n} +let B +try{B=(0,r.capabilities)("3.22")}catch{B=(0,r.capabilities)("3.13")}var P=(0,r.setModifierManager)((()=>({capabilities:B,createModifier:()=>({focusTrapOptions:void 0,isActive:!0,isPaused:!1,shouldSelfFocus:!1,focusTrap:void 0}),installModifier(t,e,n){let{named:{isActive:r,isPaused:i,shouldSelfFocus:o,focusTrapOptions:a,_createFocusTrap:u}}=n +t.focusTrapOptions={...a}||{},void 0!==r&&(t.isActive=r),void 0!==i&&(t.isPaused=i),t.focusTrapOptions&&void 0===t.focusTrapOptions.initialFocus&&o&&(t.focusTrapOptions.initialFocus=e) +let c=T +u&&(c=u),!1!==t.focusTrapOptions.returnFocusOnDeactivate&&(t.focusTrapOptions.returnFocusOnDeactivate=!0),t.focusTrap=c(e,t.focusTrapOptions),t.isActive&&t.focusTrap.activate(),t.isPaused&&t.focusTrap.pause()},updateModifier(t,e){let{named:n}=e +const r=n.focusTrapOptions||{} +if(t.isActive&&!n.isActive){const{returnFocusOnDeactivate:e}=r,n=void 0===e +t.focusTrap.deactivate({returnFocus:n})}else!t.isActive&&n.isActive&&t.focusTrap.activate() +t.isPaused&&!n.isPaused?t.focusTrap.unpause():!t.isPaused&&n.isPaused&&t.focusTrap.pause(),t.focusTrapOptions=r,void 0!==n.isActive&&(t.isActive=n.isActive),void 0!==n.isPaused&&(t.isPaused=n.isPaused)},destroyModifier(t){let{focusTrap:e}=t +e.deactivate()}})),class{})},7889:t=>{"use strict" +var e=Array.isArray,n=Object.keys,r=Object.prototype.hasOwnProperty +t.exports=function t(i,o){if(i===o)return!0 +if(i&&o&&"object"==typeof i&&"object"==typeof o){var a,u,c,s=e(i),f=e(o) +if(s&&f){if((u=i.length)!=o.length)return!1 +for(a=u;0!=a--;)if(!t(i[a],o[a]))return!1 +return!0}if(s!=f)return!1 +var l=i instanceof Date,h=o instanceof Date +if(l!=h)return!1 +if(l&&h)return i.getTime()==o.getTime() +var d=i instanceof RegExp,p=o instanceof RegExp +if(d!=p)return!1 +if(d&&p)return i.toString()==o.toString() +var y=n(i) +if((u=y.length)!==n(o).length)return!1 +for(a=u;0!=a--;)if(!r.call(o,y[a]))return!1 +for(a=u;0!=a--;)if(!t(i[c=y[a]],o[c]))return!1 +return!0}return i!=i&&o!=o}},9763:(t,e,n)=>{"use strict" +function r(t,e,n){return e in t?Object.defineProperty(t,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[e]=n,t}function i(t,e,n,r){n&&Object.defineProperty(t,e,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(r):void 0})}function o(t,e,n,r,i){var o={} +return Object.keys(r).forEach((function(t){o[t]=r[t]})),o.enumerable=!!o.enumerable,o.configurable=!!o.configurable,("value"in o||o.initializer)&&(o.writable=!0),o=n.slice().reverse().reduce((function(n,r){return r(t,e,n)||n}),o),i&&void 0!==o.initializer&&(o.value=o.initializer?o.initializer.call(i):void 0,o.initializer=void 0),void 0===o.initializer&&(Object.defineProperty(t,e,o),o=null),o}n.d(e,{_:()=>r,a:()=>o,b:()=>i})},5989:(t,e,n)=>{"use strict" +n.d(e,{Bq:()=>i,sd:()=>o,zA:()=>r}) +const r={A:"a",B:"b",C:"c",D:"d",E:"e",F:"f",G:"g",H:"h",I:"i",J:"j",K:"k",L:"l",M:"m",N:"n",O:"o",P:"p",Q:"q",R:"r",S:"s",T:"t",U:"u",V:"v",W:"w",X:"x",Y:"y",Z:"z","!":"1","@":"2","#":"3",$:"4","%":"5","^":"6","&":"7","*":"8","(":"9",")":"0",_:"-","+":"=","<":",",">":".","?":"/",":":";",'"':"'","~":"`","{":"[","}":"]","|":"\\"},i={"å":"a",b:"b","ç":"c","∂":"d","ƒ":"f","©":"g","˙":"h","∆":"j","˚":"k","¬":"l","µ":"m","ø":"o","π":"p","œ":"q","®":"r","ß":"s","†":"t","√":"v","∑":"w","≈":"x","¥":"y","Ω":"z","¡":"1","™":"2","£":"3","¢":"4","∞":"5","§":"6","¶":"7","•":"8","ª":"9","º":"0","–":"-","≠":"=","≤":",","≥":".","÷":"/","…":";","æ":"'","“":"[","‘":"]","«":"\\"},o={"Å":"a","ı":"b","Î":"d","Ï":"f","˝":"g","Ó":"h","ˆ":"i","Ô":"j","":"k","Ò":"l","Â":"m","˜":"n","Ø":"o","Œ":"q","‰":"r","Í":"s","ˇ":"t","¨":"u","◊":"v","„":"w","˛":"x","Á":"y","¸":"z","⁄":"1","€":"2","‹":"3","›":"4","fi":"5","fl":"6","‡":"7","°":"8","·":"9","‚":"0","—":"-","±":"=","¯":",","˘":".","¿":"/","Ú":";","Æ":"'","`":"`","”":"[","’":"]","»":"\\"}},6866:(t,e,n)=>{"use strict" +n.r(e),n.d(e,{default:()=>u}) +var r=n(8797),i=n(3353),o=n(4784),a=n(1377),u=(n(5780),n(2001),n(5989),n(2995),n(1866),(0,r.helper)((function(t){let[e,n]=t +return function(t){(0,i.assert)("ember-keyboard: You must pass a function as the second argument to the `if-key` helper","function"==typeof n),(0,i.assert)("ember-keyboard: The `if-key` helper expects to be invoked with a KeyboardEvent",t instanceof KeyboardEvent),(0,o.Z)((0,a.Z)(t.type,e),t)&&n(t)}})))},9930:(t,e,n)=>{"use strict" +n.r(e),n.d(e,{default:()=>l}) +var r,i,o=n(9763),a=n(8797),u=n.n(a),c=n(3353),s=n(8574),f=n(1377) +let l=(r=class extends(u()){constructor(){super(...arguments),(0,o.b)(this,"keyboard",i,this),(0,o._)(this,"keyCombo",void 0),(0,o._)(this,"callback",void 0),(0,o._)(this,"keyboardActivated",!0),(0,o._)(this,"keyboardPriority",0),(0,o._)(this,"eventName","keydown"),(0,o._)(this,"keyboardHandlers",void 0)}compute(t,e){let[n,r]=t,{event:i="keydown",activated:o=!0,priority:a=0}=e;(0,c.assert)("ember-keyboard: You must pass a function as the second argument to the `on-key` helper","function"==typeof r),this.keyCombo=n,this.callback=r,this.eventName=i,this.keyboardActivated=o,this.keyboardPriority=a,this.keyboardHandlers={},this.keyboardHandlers[(0,f.Z)(i,n)]=r,this.keyboard.register(this)}willDestroy(){this.keyboard.unregister(this),super.willDestroy(...arguments)}},i=(0,o.a)(r.prototype,"keyboard",[s.inject],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),r)},6222:(t,e,n)=>{"use strict" +n.r(e),n.d(e,{default:()=>y}) +var r=n(9763),i=n(5831),o=n.n(i),a=n(8574),u=n(7219),c=n(9341),s=n(1377),f=n(4784) +n(5780),n(2001),n(3353),n(5989),n(2995),n(1866) +const l=["input","select","textarea"] +let h +var d,p +d=class extends(o()){constructor(t,e){super(t,e),(0,r.b)(this,"keyboard",p,this),(0,r._)(this,"element",void 0),(0,r._)(this,"keyboardPriority",0),(0,r._)(this,"activatedParamValue",!0),(0,r._)(this,"eventName","keydown"),(0,r._)(this,"onlyWhenFocused",!0),(0,r._)(this,"listenerName",void 0),(0,r._)(this,"removeEventListeners",(()=>{this.onlyWhenFocused&&(this.element.removeEventListener("click",this.onFocus,!0),this.element.removeEventListener("focus",this.onFocus,!0),this.element.removeEventListener("focusout",this.onFocusOut,!0))})),this.keyboard.register(this),(0,c.registerDestructor)(this,(()=>{this.removeEventListeners(),this.keyboard.unregister(this)}))}modify(t,e,n){this.element=t,this.removeEventListeners(),this.setupProperties(e,n),this.onlyWhenFocused&&this.addEventListeners()}setupProperties(t,e){let[n,r]=t,{activated:i,event:o,priority:a,onlyWhenFocused:u}=e +this.keyCombo=n,this.callback=r,this.eventName=o||"keydown",this.activatedParamValue="activated"in e?!!i:void 0,this.keyboardPriority=a?parseInt(a,10):0,this.listenerName=(0,s.Z)(this.eventName,this.keyCombo),this.onlyWhenFocused=void 0!==u?u:l.includes(this.element.tagName.toLowerCase())}addEventListeners(){this.element.addEventListener("click",this.onFocus,!0),this.element.addEventListener("focus",this.onFocus,!0),this.element.addEventListener("focusout",this.onFocusOut,!0)}onFocus(){this.isFocused=!0}onFocusOut(){this.isFocused=!1}get keyboardActivated(){return!1!==this.activatedParamValue&&(!this.onlyWhenFocused||this.isFocused)}get keyboardFirstResponder(){return!!this.onlyWhenFocused&&this.isFocused}canHandleKeyboardEvent(t){return(0,f.Z)(this.listenerName,t)}handleKeyboardEvent(t,e){(0,f.Z)(this.listenerName,t)&&(this.callback?this.callback(t,e):this.element.click())}},p=(0,r.a)(d.prototype,"keyboard",[a.inject],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),(0,r.a)(d.prototype,"onFocus",[u.action],Object.getOwnPropertyDescriptor(d.prototype,"onFocus"),d.prototype),(0,r.a)(d.prototype,"onFocusOut",[u.action],Object.getOwnPropertyDescriptor(d.prototype,"onFocusOut"),d.prototype),h=d +var y=h},6918:(t,e,n)=>{"use strict" +n.r(e),n.d(e,{default:()=>p}) +var r,i=n(9763),o=n(8574),a=n.n(o),u=n(1292),c=n(7219),s=n(8773),f=n(1377),l=n(4784) +function h(t,e){let n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null +if(t.handleKeyboardEvent){if(t.canHandleKeyboardEvent&&!t.canHandleKeyboardEvent(e))return +t.handleKeyboardEvent(e,n)}else{if(!t.keyboardHandlers)throw new Error("A responder registered with the ember-keyboard service must implement either `keyboardHandlers` (property returning a dictionary of listenerNames to handler functions), or `handleKeyboardEvent(event)`)") +Object.keys(t.keyboardHandlers).forEach((r=>{(0,l.Z)(r,e)&&(n?t.keyboardHandlers[r](e,n):t.keyboardHandlers[r](e))}))}}function d(t,e,n,r){return function(t,e){let n=t-e +return(n>0)-(n<0)}(r?r((0,c.get)(t,n)):(0,c.get)(t,n),r?r((0,c.get)(e,n)):(0,c.get)(e,n))}n(5780),n(2001),n(3353),n(5989),n(2995),n(1866) +let p=(r=class extends(a()){get activeResponders(){let{registeredResponders:t}=this +return Array.from(t).filter((t=>t.keyboardActivated))}get sortedResponders(){return this.activeResponders.sort(((t,e)=>function(t,e,n){return d(e,t,n,arguments.length>3&&void 0!==arguments[3]?arguments[3]:null)}(t,e,"keyboardPriority")))}get firstResponders(){return this.sortedResponders.filter((t=>t.keyboardFirstResponder))}get normalResponders(){return this.sortedResponders.filter((t=>!t.keyboardFirstResponder))}constructor(){if(super(...arguments),(0,i._)(this,"registeredResponders",new Set),"undefined"!=typeof FastBoot)return +let t=((0,u.getOwner)(this).resolveRegistration("config:environment")||{}).emberKeyboard||{} +t.disableOnInputFields&&(this._disableOnInput=!0),this._listeners=t.listeners||["keyUp","keyDown","keyPress"],this._listeners=this._listeners.map((t=>t.toLowerCase())),this._listeners.forEach((t=>{document.addEventListener(t,this._respond)}))}willDestroy(){super.willDestroy(...arguments),"undefined"==typeof FastBoot&&this._listeners.forEach((t=>{document.removeEventListener(t,this._respond)}))}_respond(t){if(this._disableOnInput&&t.target){var e +const n=null!==(e=t.composedPath()[0])&&void 0!==e?e:t.target,r=n.tagName +if(n.getAttribute&&null!=n.getAttribute("contenteditable")||"TEXTAREA"===r||"INPUT"===r)return}(0,s.run)((()=>{let{firstResponders:e,normalResponders:n}=this +!function(t,e){let{firstResponders:n,normalResponders:r}=e,i=!1,o=!1 +const a={stopImmediatePropagation(){i=!0},stopPropagation(){o=!0}} +for(const c of n)if(h(c,t,a),i)break +if(o)return +i=!1 +let u=Number.POSITIVE_INFINITY +for(const c of r){const e=Number(c.keyboardPriority) +if(!i||e!==u){if(e{"use strict" +n.d(e,{Z:()=>i}) +var r=n(1866) +function i(t){if(!(0,r.isNone)(t))switch(t){case 0:return"left" +case 1:return"middle" +case 2:return"right"}}},4784:(t,e,n)=>{"use strict" +n.d(e,{Z:()=>c}) +var r=n(5780),i=n(2001),o=n(5989),a=n(2995) +n(3353),n(1866) +const u="_all" +function c(t,e){let n,o=arguments.length>2&&void 0!==arguments[2]?arguments[2]:(0,i.Z)() +if(t instanceof r.Z)n=t +else{if("string"!=typeof t)throw new Error("Expected a `string` or `KeyCombo` as `keyComboOrKeyComboString` argument to `isKey`") +n=r.Z.parse(t,o)}return n.type===e.type&&(!!s(n)||!(!f(n,e)||!l(n,e)&&!h(n,e))||d(n,e,o))}function s(t){return t.keyOrCode===u&&!1===t.altKey&&!1===t.ctrlKey&&!1===t.metaKey&&!1===t.shiftKey}function f(t,e){return t.type===e.type&&t.altKey===e.altKey&&t.ctrlKey===e.ctrlKey&&t.metaKey===e.metaKey&&t.shiftKey===e.shiftKey}function l(t,e){return e instanceof KeyboardEvent&&(t.keyOrCode===u||t.keyOrCode===e.code||t.keyOrCode===e.key)}function h(t,e){return e instanceof MouseEvent&&(t.keyOrCode===u||t.keyOrCode===(0,a.Z)(e.button))}function d(t,e,n){return y([],t)&&y(["shift"],e)?e.key===t.keyOrCode:y(["shift"],t)&&y(["shift"],e)?(r=e.key,(o.zA[r]||r)===t.keyOrCode):"Macintosh"===n&&y(["alt"],t)&&y(["alt"],e)?function(t){return o.Bq[t]||t}(e.key)===t.keyOrCode:!("Macintosh"!==n||!y(["shift","alt"],t)||!y(["shift","alt"],e))&&function(t){return o.sd[t]||t}(e.key)===t.keyOrCode +var r}const p=["alt","ctrl","meta","shift","cmd"].filter((t=>"cmd"!=t)) +function y(t,e){for(let n of p){if(t.includes(n)&&!e[`${n}Key`])return!1 +if(!t.includes(n)&&e[`${n}Key`])return!1}return!0}},5780:(t,e,n)=>{"use strict" +n.d(e,{Z:()=>f}) +var r=n(9763),i=n(2001) +n(3353) +const o=/^alt$/i,a=/^shift$/i,u=/^ctrl$/i,c=/^meta$/i,s=/^cmd$/i +class f{constructor(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:(0,i.Z)();(0,r._)(this,"type",void 0),(0,r._)(this,"altKey",!1),(0,r._)(this,"ctrlKey",!1),(0,r._)(this,"shiftKey",!1),(0,r._)(this,"metaKey",!1),(0,r._)(this,"keyOrCode",void 0),(0,r._)(this,"platform",void 0),this.platform=t}static parse(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:(0,i.Z)(),n=new f(e),[r,l]=t.split(":") +return n.type=r,"+"===l?(n.keyOrCode=l,n):(l.split("+").forEach((t=>{o.test(t)?n.altKey=!0:u.test(t)?n.ctrlKey=!0:c.test(t)?n.metaKey=!0:a.test(t)?n.shiftKey=!0:s.test(t)?e.indexOf("Mac")>-1?n.metaKey=!0:n.ctrlKey=!0:n.keyOrCode=t})),n)}createMatchingKeyboardEvent(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{} +return new KeyboardEvent(this.type,Object.assign({key:this.keyOrCode,code:this.keyOrCode,altKey:this.altKey,ctrlKey:this.ctrlKey,metaKey:this.metaKey,shiftKey:this.shiftKey},t))}}},1377:(t,e,n)=>{"use strict" +function r(t){if("undefined"==typeof FastBoot)return void 0===t&&(t=navigator.platform),t.indexOf("Mac")>-1?"meta":"ctrl"}function i(t){return t.sort().join("+")}function o(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[],n=e +"string"==typeof e&&(n=e.split("+")),n.indexOf("cmd")>-1&&(n[n.indexOf("cmd")]=r()) +let o=i(n||[]) +return""===o&&(o="_all"),`${t}:${o}`}n.d(e,{Z:()=>o})},2001:(t,e,n)=>{"use strict" +n.d(e,{Z:()=>o}) +var r=n(3353) +let i +function o(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:navigator.userAgent +if((0,r.runInDebug)((()=>{i=null})),!i){let e="Unknown OS";-1!=t.indexOf("Win")&&(e="Windows"),-1!=t.indexOf("Mac")&&(e="Macintosh"),-1!=t.indexOf("Linux")&&(e="Linux"),-1!=t.indexOf("Android")&&(e="Android"),-1!=t.indexOf("like Mac")&&(e="iOS"),i=e}return i}},4564:t=>{function e(t,e,n,r){var i,o=null==(i=r)||"number"==typeof i||"boolean"==typeof i?r:n(r),a=e.get(o) +return void 0===a&&(a=t.call(this,r),e.set(o,a)),a}function n(t,e,n){var r=Array.prototype.slice.call(arguments,3),i=n(r),o=e.get(i) +return void 0===o&&(o=t.apply(this,r),e.set(i,o)),o}function r(t,e,n,r,i){return n.bind(e,t,r,i)}function i(t,i){return r(t,this,1===t.length?e:n,i.cache.create(),i.serializer)}function o(){return JSON.stringify(arguments)}function a(){this.cache=Object.create(null)}a.prototype.has=function(t){return t in this.cache},a.prototype.get=function(t){return this.cache[t]},a.prototype.set=function(t,e){this.cache[t]=e} +var u={create:function(){return new a}} +t.exports=function(t,e){var n=e&&e.cache?e.cache:u,r=e&&e.serializer?e.serializer:o +return(e&&e.strategy?e.strategy:i)(t,{cache:n,serializer:r})},t.exports.strategies={variadic:function(t,e){return r(t,this,n,e.cache.create(),e.serializer)},monadic:function(t,n){return r(t,this,e,n.cache.create(),n.serializer)}}},8581:t=>{function e(t){return t&&t.constructor&&"function"==typeof t.constructor.isBuffer&&t.constructor.isBuffer(t)}function n(t){return t}function r(t,r){const i=(r=r||{}).delimiter||".",o=r.maxDepth,a=r.transformKey||n,u={} +return function t(n,c,s){s=s||1,Object.keys(n).forEach((function(f){const l=n[f],h=r.safe&&Array.isArray(l),d=Object.prototype.toString.call(l),p=e(l),y="[object Object]"===d||"[object Array]"===d,b=c?c+i+a(f):a(f) +if(!h&&!p&&y&&Object.keys(l).length&&(!r.maxDepth||s0&&(r=f(n.shift()),l=f(n[0]))}h[r]=t(i[e],o)})),s}},2914:(t,e,n)=>{"use strict" +n.r(e),n.d(e,{default:()=>s}) +var r,i=function(){function t(){this.registry=new WeakMap}return t.prototype.elementExists=function(t){return this.registry.has(t)},t.prototype.getElement=function(t){return this.registry.get(t)},t.prototype.addElement=function(t,e){t&&this.registry.set(t,e||{})},t.prototype.removeElement=function(t){this.registry.delete(t)},t.prototype.destroyRegistry=function(){this.registry=new WeakMap},t}(),o=function(){} +!function(t){t.enter="enter",t.exit="exit"}(r||(r={})) +var a,u=function(){function t(){this.registry=new i}return t.prototype.addCallback=function(t,e,n){var i,o,a +t===r.enter?((i={})[r.enter]=n,a=i):((o={})[r.exit]=n,a=o),this.registry.addElement(e,Object.assign({},this.registry.getElement(e),a))},t.prototype.dispatchCallback=function(t,e,n){if(t===r.enter){var i=this.registry.getElement(e).enter;(void 0===i?o:i)(n)}else{var a=this.registry.getElement(e).exit;(void 0===a?o:a)(n)}},t}(),c=(a=function(t,e){return a=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n])},a(t,e)},function(t,e){function n(){this.constructor=t}a(t,e),t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)}) +const s=function(t){function e(){var e=t.call(this)||this +return e.elementRegistry=new i,e}return c(e,t),e.prototype.observe=function(t,e){void 0===e&&(e={}),t&&(this.elementRegistry.addElement(t,e),this.setupObserver(t,e))},e.prototype.unobserve=function(t,e){var n=this.findMatchingRootEntry(e) +n&&n.intersectionObserver.unobserve(t)},e.prototype.addEnterCallback=function(t,e){this.addCallback(r.enter,t,e)},e.prototype.addExitCallback=function(t,e){this.addCallback(r.exit,t,e)},e.prototype.dispatchEnterCallback=function(t,e){this.dispatchCallback(r.enter,t,e)},e.prototype.dispatchExitCallback=function(t,e){this.dispatchCallback(r.exit,t,e)},e.prototype.destroy=function(){this.elementRegistry.destroyRegistry()},e.prototype.setupOnIntersection=function(t){var e=this +return function(n){return e.onIntersection(t,n)}},e.prototype.setupObserver=function(t,e){var n,r,i=e.root,o=void 0===i?window:i,a=this.findRootFromRegistry(o) +if(a&&(r=this.determineMatchingElements(e,a)),r){var u=r.elements,c=r.intersectionObserver +u.push(t),c&&c.observe(t)}else{var s={elements:[t],intersectionObserver:c=this.newObserver(t,e),options:e},f=this.stringifyOptions(e) +a?a[f]=s:this.elementRegistry.addElement(o,((n={})[f]=s,n))}},e.prototype.newObserver=function(t,e){var n=e.root,r=e.rootMargin,i=e.threshold,o=new IntersectionObserver(this.setupOnIntersection(e).bind(this),{root:n,rootMargin:r,threshold:i}) +return o.observe(t),o},e.prototype.onIntersection=function(t,e){var n=this +e.forEach((function(e){var r=e.isIntersecting,i=e.intersectionRatio,o=t.threshold||0 +Array.isArray(o)&&(o=o[o.length-1]) +var a=n.findMatchingRootEntry(t) +r||i>o?a&&a.elements.some((function(t){return!(!t||t!==e.target||(n.dispatchEnterCallback(t,e),0))})):a&&a.elements.some((function(t){return!(!t||t!==e.target||(n.dispatchExitCallback(t,e),0))}))}))},e.prototype.findRootFromRegistry=function(t){if(this.elementRegistry)return this.elementRegistry.getElement(t)},e.prototype.findMatchingRootEntry=function(t){var e=t.root,n=void 0===e?window:e,r=this.findRootFromRegistry(n) +if(r)return r[this.stringifyOptions(t)]},e.prototype.determineMatchingElements=function(t,e){var n=this,r=Object.keys(e).filter((function(r){var i=e[r].options +return n.areOptionsSame(t,i)}))[0] +return e[r]},e.prototype.areOptionsSame=function(t,e){if(t===e)return!0 +var n=Object.prototype.toString.call(t),r=Object.prototype.toString.call(e) +if(n!==r)return!1 +if("[object Object]"!==n&&"[object Object]"!==r)return t===e +if(t&&e&&"object"==typeof t&&"object"==typeof e)for(var i in t)if(Object.prototype.hasOwnProperty.call(t,i)&&!1===this.areOptionsSame(t[i],e[i]))return!1 +return!0},e.prototype.stringifyOptions=function(t){var e=t.root +return JSON.stringify(t,(function(t,n){if("root"===t&&e){var r=Array.prototype.slice.call(e.classList).reduce((function(t,e){return t+e}),"") +return e.id+"-"+r}return n}))},e}(u)},4857:(t,e,n)=>{"use strict" +n.r(e),n.d(e,{SKELETON_TYPE:()=>i.aV,SyntaxError:()=>y,TYPE:()=>i.wD,createLiteralElement:()=>i.mD,createNumberElement:()=>i.qx,isArgumentElement:()=>i.VG,isDateElement:()=>i.rp,isDateTimeSkeleton:()=>i.Ii,isLiteralElement:()=>i.O4,isNumberElement:()=>i.uf,isNumberSkeleton:()=>i.Wh,isPluralElement:()=>i.Jo,isPoundElement:()=>i.yx,isSelectElement:()=>i.Wi,isTagElement:()=>i.HI,isTimeElement:()=>i.pe,parse:()=>m,pegParse:()=>b}) +var r=n(2247),i=n(8131),o=/(?:[Eec]{1,6}|G{1,5}|[Qq]{1,5}|(?:[yYur]+|U{1,5})|[ML]{1,5}|d{1,2}|D{1,3}|F{1}|[abB]{1,5}|[hkHK]{1,2}|w{1,2}|W{1}|m{1,2}|s{1,2}|[zZOvVxX]{1,4})(?=([^']*'[^']*')*[^']*$)/g,a=/^\.(?:(0+)(\*)?|(#+)|(0+)(#+))$/g,u=/^(@+)?(\+|#+)?$/g,c=/(\*)(0+)|(#+)(0+)|(0+)/g,s=/^(0+)$/ +function f(t){var e={} +return t.replace(u,(function(t,n,r){return"string"!=typeof r?(e.minimumSignificantDigits=n.length,e.maximumSignificantDigits=n.length):"+"===r?e.minimumSignificantDigits=n.length:"#"===n[0]?e.maximumSignificantDigits=n.length:(e.minimumSignificantDigits=n.length,e.maximumSignificantDigits=n.length+("string"==typeof r?r.length:0)),""})),e}function l(t){switch(t){case"sign-auto":return{signDisplay:"auto"} +case"sign-accounting":case"()":return{currencySign:"accounting"} +case"sign-always":case"+!":return{signDisplay:"always"} +case"sign-accounting-always":case"()!":return{signDisplay:"always",currencySign:"accounting"} +case"sign-except-zero":case"+?":return{signDisplay:"exceptZero"} +case"sign-accounting-except-zero":case"()?":return{signDisplay:"exceptZero",currencySign:"accounting"} +case"sign-never":case"+_":return{signDisplay:"never"}}}function h(t){var e +if("E"===t[0]&&"E"===t[1]?(e={notation:"engineering"},t=t.slice(2)):"E"===t[0]&&(e={notation:"scientific"},t=t.slice(1)),e){var n=t.slice(0,2) +if("+!"===n?(e.signDisplay="always",t=t.slice(2)):"+?"===n&&(e.signDisplay="exceptZero",t=t.slice(2)),!s.test(t))throw new Error("Malformed concise eng/scientific notation") +e.minimumIntegerDigits=t.length}return e}function d(t){return l(t)||{}}function p(t){for(var e={},n=0,i=t;n1)throw new RangeError("integer-width stems only accept a single optional option") +o.options[0].replace(c,(function(t,n,r,i,o,a){if(n)e.minimumIntegerDigits=r.length +else{if(i&&o)throw new Error("We currently do not support maximum integer digits") +if(a)throw new Error("We currently do not support exact integer digits")}return""})) +continue}if(s.test(o.stem))e.minimumIntegerDigits=o.stem.length +else if(a.test(o.stem)){if(o.options.length>1)throw new RangeError("Fraction-precision stems only accept a single optional option") +o.stem.replace(a,(function(t,n,r,i,o,a){return"*"===r?e.minimumFractionDigits=n.length:i&&"#"===i[0]?e.maximumFractionDigits=i.length:o&&a?(e.minimumFractionDigits=o.length,e.maximumFractionDigits=o.length+a.length):(e.minimumFractionDigits=n.length,e.maximumFractionDigits=n.length),""})),o.options.length&&(e=(0,r.pi)((0,r.pi)({},e),f(o.options[0])))}else if(u.test(o.stem))e=(0,r.pi)((0,r.pi)({},e),f(o.stem)) +else{var p=l(o.stem) +p&&(e=(0,r.pi)((0,r.pi)({},e),p)) +var y=h(o.stem) +y&&(e=(0,r.pi)((0,r.pi)({},e),y))}}return e}var y=function(t){function e(n,r,i,o){var a=t.call(this)||this +return a.message=n,a.expected=r,a.found=i,a.location=o,a.name="SyntaxError","function"==typeof Error.captureStackTrace&&Error.captureStackTrace(a,e),a}return(0,r.ZT)(e,t),e.buildMessage=function(t,e){function n(t){return t.charCodeAt(0).toString(16).toUpperCase()}function r(t){return t.replace(/\\/g,"\\\\").replace(/"/g,'\\"').replace(/\0/g,"\\0").replace(/\t/g,"\\t").replace(/\n/g,"\\n").replace(/\r/g,"\\r").replace(/[\x00-\x0F]/g,(function(t){return"\\x0"+n(t)})).replace(/[\x10-\x1F\x7F-\x9F]/g,(function(t){return"\\x"+n(t)}))}function i(t){return t.replace(/\\/g,"\\\\").replace(/\]/g,"\\]").replace(/\^/g,"\\^").replace(/-/g,"\\-").replace(/\0/g,"\\0").replace(/\t/g,"\\t").replace(/\n/g,"\\n").replace(/\r/g,"\\r").replace(/[\x00-\x0F]/g,(function(t){return"\\x0"+n(t)})).replace(/[\x10-\x1F\x7F-\x9F]/g,(function(t){return"\\x"+n(t)}))}function o(t){switch(t.type){case"literal":return'"'+r(t.text)+'"' +case"class":var e=t.parts.map((function(t){return Array.isArray(t)?i(t[0])+"-"+i(t[1]):i(t)})) +return"["+(t.inverted?"^":"")+e+"]" +case"any":return"any character" +case"end":return"end of input" +case"other":return t.description}}return"Expected "+function(t){var e,n,r=t.map(o) +if(r.sort(),r.length>0){for(e=1,n=1;e",!1),v=Lt(">",!1),g=Lt("Tt&&(Tt=St,Bt=[]),Bt.push(t))}function qt(){return Vt()}function Vt(){var t,e +for(t=[],e=Ht();e!==a;)t.push(e),e=Ht() +return t}function Ht(){var e,n +return e=St,Mt=St,(xe?a:void 0)!==a?(n=function(){var t,e,n,o,u,c,s +return Pt++,(t=Kt())===a&&(t=St,(e=Wt())!==a&&(n=Vt())!==a&&(o=Xt())!==a?(Mt=t,c=n,(u=e)!==(s=o)&&Rt('Mismatch tag "'+u+'" !== "'+s+'"',Nt()),t=e=(0,r.pi)({type:i.wD.tag,value:u,children:c},ge())):(St=t,t=a)),Pt--,t===a&&(e=a,0===Pt&&Zt(d)),t}(),n!==a?(Mt=e,e=n):(St=e,e=a)):(St=e,e=a),e===a&&(e=function(){var t,e,n +return t=St,(e=Yt())!==a&&(Mt=t,n=e,e=(0,r.pi)({type:i.wD.literal,value:n},ge())),e}())===a&&(e=function(){var e,n,o,u,c +return Pt++,e=St,123===t.charCodeAt(St)?(n=_,St++):(n=a,0===Pt&&Zt(w)),n!==a&&ue()!==a&&(o=he())!==a&&ue()!==a?(125===t.charCodeAt(St)?(u=x,St++):(u=a,0===Pt&&Zt(A)),u!==a?(Mt=e,c=o,e=n=(0,r.pi)({type:i.wD.argument,value:c},ge())):(St=e,e=a)):(St=e,e=a),Pt--,e===a&&(n=a,0===Pt&&Zt(m)),e}())===a&&(e=function(){var e +return e=function(){var e,n,o,u,c,s,f,l,h +return e=St,123===t.charCodeAt(St)?(n=_,St++):(n=a,0===Pt&&Zt(w)),n!==a&&ue()!==a&&(o=he())!==a&&ue()!==a?(44===t.charCodeAt(St)?(u=P,St++):(u=a,0===Pt&&Zt(j)),u!==a&&ue()!==a?(t.substr(St,6)===N?(c=N,St+=6):(c=a,0===Pt&&Zt(R)),c!==a&&ue()!==a?(s=St,44===t.charCodeAt(St)?(f=P,St++):(f=a,0===Pt&&Zt(j)),f!==a&&(l=ue())!==a?(h=function(){var e,n,o +return e=St,t.substr(St,2)===F?(n=F,St+=2):(n=a,0===Pt&&Zt(T)),n!==a?(o=function(){var t,e,n,o +if(t=St,e=[],(n=te())!==a)for(;n!==a;)e.push(n),n=te() +else e=a +return e!==a&&(Mt=t,o=e,e=(0,r.pi)({type:i.aV.number,tokens:o,parsedOptions:Ae?p(o):{}},ge())),e}(),o!==a?(Mt=e,e=n=o):(St=e,e=a)):(St=e,e=a),e===a&&(e=St,Mt=St,be.push("numberArgStyle"),(n=(n=!0)?void 0:a)!==a&&(o=Yt())!==a?(Mt=e,e=n=B(o)):(St=e,e=a)),e}(),h!==a?s=f=[f,l,h]:(St=s,s=a)):(St=s,s=a),s===a&&(s=null),s!==a&&(f=ue())!==a?(125===t.charCodeAt(St)?(l=x,St++):(l=a,0===Pt&&Zt(A)),l!==a?(Mt=e,e=n=L(o,c,s)):(St=e,e=a)):(St=e,e=a)):(St=e,e=a)):(St=e,e=a)):(St=e,e=a),e}(),e===a&&(e=function(){var e,n,u,c,s,f,l,h,d +return e=St,123===t.charCodeAt(St)?(n=_,St++):(n=a,0===Pt&&Zt(w)),n!==a&&ue()!==a&&(u=he())!==a&&ue()!==a?(44===t.charCodeAt(St)?(c=P,St++):(c=a,0===Pt&&Zt(j)),c!==a&&ue()!==a?(t.substr(St,4)===Y?(s=Y,St+=4):(s=a,0===Pt&&Zt(G)),s===a&&(t.substr(St,4)===K?(s=K,St+=4):(s=a,0===Pt&&Zt(W))),s!==a&&ue()!==a?(f=St,44===t.charCodeAt(St)?(l=P,St++):(l=a,0===Pt&&Zt(j)),l!==a&&(h=ue())!==a?(d=function(){var e,n,u +return e=St,t.substr(St,2)===F?(n=F,St+=2):(n=a,0===Pt&&Zt(T)),n!==a?(u=function(){var e,n,u,c,s,f,l +if(e=St,n=St,u=[],(c=ee())===a&&(c=ne()),c!==a)for(;c!==a;)u.push(c),(c=ee())===a&&(c=ne()) +else u=a +return(n=u!==a?t.substring(n,St):u)!==a&&(Mt=e,s=n,n=(0,r.pi)({type:i.aV.dateTime,pattern:s,parsedOptions:Ae?(f=s,l={},f.replace(o,(function(t){var e=t.length +switch(t[0]){case"G":l.era=4===e?"long":5===e?"narrow":"short" +break +case"y":l.year=2===e?"2-digit":"numeric" +break +case"Y":case"u":case"U":case"r":throw new RangeError("`Y/u/U/r` (year) patterns are not supported, use `y` instead") +case"q":case"Q":throw new RangeError("`q/Q` (quarter) patterns are not supported") +case"M":case"L":l.month=["numeric","2-digit","short","long","narrow"][e-1] +break +case"w":case"W":throw new RangeError("`w/W` (week) patterns are not supported") +case"d":l.day=["numeric","2-digit"][e-1] +break +case"D":case"F":case"g":throw new RangeError("`D/F/g` (day) patterns are not supported, use `d` instead") +case"E":l.weekday=4===e?"short":5===e?"narrow":"short" +break +case"e":if(e<4)throw new RangeError("`e..eee` (weekday) patterns are not supported") +l.weekday=["short","long","narrow","short"][e-4] +break +case"c":if(e<4)throw new RangeError("`c..ccc` (weekday) patterns are not supported") +l.weekday=["short","long","narrow","short"][e-4] +break +case"a":l.hour12=!0 +break +case"b":case"B":throw new RangeError("`b/B` (period) patterns are not supported, use `a` instead") +case"h":l.hourCycle="h12",l.hour=["numeric","2-digit"][e-1] +break +case"H":l.hourCycle="h23",l.hour=["numeric","2-digit"][e-1] +break +case"K":l.hourCycle="h11",l.hour=["numeric","2-digit"][e-1] +break +case"k":l.hourCycle="h24",l.hour=["numeric","2-digit"][e-1] +break +case"j":case"J":case"C":throw new RangeError("`j/J/C` (hour) patterns are not supported, use `h/H/K/k` instead") +case"m":l.minute=["numeric","2-digit"][e-1] +break +case"s":l.second=["numeric","2-digit"][e-1] +break +case"S":case"A":throw new RangeError("`S/A` (second) patterns are not supported, use `s` instead") +case"z":l.timeZoneName=e<4?"short":"long" +break +case"Z":case"O":case"v":case"V":case"X":case"x":throw new RangeError("`Z/O/v/V/X/x` (timeZone) patterns are not supported, use `z` instead")}return""})),l):{}},ge())),n}(),u!==a?(Mt=e,e=n=u):(St=e,e=a)):(St=e,e=a),e===a&&(e=St,Mt=St,be.push("dateOrTimeArgStyle"),(n=(n=!0)?void 0:a)!==a&&(u=Yt())!==a?(Mt=e,e=n=B(u)):(St=e,e=a)),e}(),d!==a?f=l=[l,h,d]:(St=f,f=a)):(St=f,f=a),f===a&&(f=null),f!==a&&(l=ue())!==a?(125===t.charCodeAt(St)?(h=x,St++):(h=a,0===Pt&&Zt(A)),h!==a?(Mt=e,e=n=L(u,s,f)):(St=e,e=a)):(St=e,e=a)):(St=e,e=a)):(St=e,e=a)):(St=e,e=a),e}()),e}(),e===a&&(e=function(){var e,n,o,u,c,s,f,l,h,d,p +if(e=St,123===t.charCodeAt(St)?(n=_,St++):(n=a,0===Pt&&Zt(w)),n!==a)if(ue()!==a)if((o=he())!==a)if(ue()!==a)if(44===t.charCodeAt(St)?(u=P,St++):(u=a,0===Pt&&Zt(j)),u!==a)if(ue()!==a)if(t.substr(St,6)===X?(c=X,St+=6):(c=a,0===Pt&&Zt(J)),c===a&&(t.substr(St,13)===Q?(c=Q,St+=13):(c=a,0===Pt&&Zt(tt))),c!==a)if(ue()!==a)if(44===t.charCodeAt(St)?(s=P,St++):(s=a,0===Pt&&Zt(j)),s!==a)if(ue()!==a)if(f=St,t.substr(St,7)===et?(l=et,St+=7):(l=a,0===Pt&&Zt(nt)),l!==a&&(h=ue())!==a&&(d=ce())!==a?f=l=[l,h,d]:(St=f,f=a),f===a&&(f=null),f!==a)if((l=ue())!==a){if(h=[],(d=ie())!==a)for(;d!==a;)h.push(d),d=ie() +else h=a +h!==a&&(d=ue())!==a?(125===t.charCodeAt(St)?(p=x,St++):(p=a,0===Pt&&Zt(A)),p!==a?(Mt=e,n=function(t,e,n,o){return(0,r.pi)({type:i.wD.plural,pluralType:"plural"===e?"cardinal":"ordinal",value:t,offset:n?n[2]:0,options:o.reduce((function(t,e){var n=e.id,r=e.value,i=e.location +return n in t&&Rt('Duplicate option "'+n+'" in plural element: "'+jt()+'"',Nt()),t[n]={value:r,location:i},t}),{})},ge())}(o,c,f,h),e=n):(St=e,e=a)):(St=e,e=a)}else St=e,e=a +else St=e,e=a +else St=e,e=a +else St=e,e=a +else St=e,e=a +else St=e,e=a +else St=e,e=a +else St=e,e=a +else St=e,e=a +else St=e,e=a +else St=e,e=a +else St=e,e=a +return e}(),e===a&&(e=function(){var e,n,o,u,c,s,f,l,h +if(e=St,123===t.charCodeAt(St)?(n=_,St++):(n=a,0===Pt&&Zt(w)),n!==a)if(ue()!==a)if((o=he())!==a)if(ue()!==a)if(44===t.charCodeAt(St)?(u=P,St++):(u=a,0===Pt&&Zt(j)),u!==a)if(ue()!==a)if(t.substr(St,6)===rt?(c=rt,St+=6):(c=a,0===Pt&&Zt(it)),c!==a)if(ue()!==a)if(44===t.charCodeAt(St)?(s=P,St++):(s=a,0===Pt&&Zt(j)),s!==a)if(ue()!==a){if(f=[],(l=re())!==a)for(;l!==a;)f.push(l),l=re() +else f=a +f!==a&&(l=ue())!==a?(125===t.charCodeAt(St)?(h=x,St++):(h=a,0===Pt&&Zt(A)),h!==a?(Mt=e,n=function(t,e){return(0,r.pi)({type:i.wD.select,value:t,options:e.reduce((function(t,e){var n=e.id,r=e.value,i=e.location +return n in t&&Rt('Duplicate option "'+n+'" in select element: "'+jt()+'"',Nt()),t[n]={value:r,location:i},t}),{})},ge())}(o,f),e=n):(St=e,e=a)):(St=e,e=a)}else St=e,e=a +else St=e,e=a +else St=e,e=a +else St=e,e=a +else St=e,e=a +else St=e,e=a +else St=e,e=a +else St=e,e=a +else St=e,e=a +else St=e,e=a +return e}(),e===a&&(e=function(){var e,n +return e=St,35===t.charCodeAt(St)?(n="#",St++):(n=a,0===Pt&&Zt(h)),n!==a&&(Mt=e,n=(0,r.pi)({type:i.wD.pound},ge())),n}())))),e}function Yt(){var e,n,r,i +if(e=St,Mt=St,(n=(n=xe)?void 0:a)!==a){if(r=[],(i=se())===a&&(i=fe())===a&&(i=le())===a&&(60===t.charCodeAt(St)?(i=s,St++):(i=a,0===Pt&&Zt(f))),i!==a)for(;i!==a;)r.push(i),(i=se())===a&&(i=fe())===a&&(i=le())===a&&(60===t.charCodeAt(St)?(i=s,St++):(i=a,0===Pt&&Zt(f))) +else r=a +r!==a?(Mt=e,e=n=l(r)):(St=e,e=a)}else St=e,e=a +if(e===a){if(e=St,n=[],(r=se())===a&&(r=fe())===a&&(r=le())===a&&(r=Gt()),r!==a)for(;r!==a;)n.push(r),(r=se())===a&&(r=fe())===a&&(r=le())===a&&(r=Gt()) +else n=a +n!==a&&(Mt=e,n=l(n)),e=n}return e}function Gt(){var e,n,r +return e=St,n=St,Pt++,(r=Wt())===a&&(r=Xt())===a&&(r=Kt()),Pt--,r===a?n=void 0:(St=n,n=a),n!==a?(60===t.charCodeAt(St)?(r=s,St++):(r=a,0===Pt&&Zt(f)),r!==a?(Mt=e,e=n="<"):(St=e,e=a)):(St=e,e=a),e}function Kt(){var e,n,o,u,c,l,h +return e=St,n=St,60===t.charCodeAt(St)?(o=s,St++):(o=a,0===Pt&&Zt(f)),o!==a&&(u=de())!==a&&(c=ue())!==a?("/>"===t.substr(St,2)?(l="/>",St+=2):(l=a,0===Pt&&Zt(b)),l!==a?n=o=[o,u,c,l]:(St=n,n=a)):(St=n,n=a),n!==a&&(Mt=e,h=n,n=(0,r.pi)({type:i.wD.literal,value:h.join("")},ge())),n}function Wt(){var e,n,r,i +return e=St,60===t.charCodeAt(St)?(n=s,St++):(n=a,0===Pt&&Zt(f)),n!==a&&(r=de())!==a?(62===t.charCodeAt(St)?(i=">",St++):(i=a,0===Pt&&Zt(v)),i!==a?(Mt=e,e=n=r):(St=e,e=a)):(St=e,e=a),e}function Xt(){var e,n,r,i +return e=St,"",St++):(i=a,0===Pt&&Zt(v)),i!==a?(Mt=e,e=n=r):(St=e,e=a)):(St=e,e=a),e}function Jt(){var e,n,r,i,o +if(Pt++,e=St,n=[],r=St,i=St,Pt++,(o=oe())===a&&(k.test(t.charAt(St))?(o=t.charAt(St),St++):(o=a,0===Pt&&Zt(D))),Pt--,o===a?i=void 0:(St=i,i=a),i!==a?(t.length>St?(o=t.charAt(St),St++):(o=a,0===Pt&&Zt(C)),o!==a?r=i=[i,o]:(St=r,r=a)):(St=r,r=a),r!==a)for(;r!==a;)n.push(r),r=St,i=St,Pt++,(o=oe())===a&&(k.test(t.charAt(St))?(o=t.charAt(St),St++):(o=a,0===Pt&&Zt(D))),Pt--,o===a?i=void 0:(St=i,i=a),i!==a?(t.length>St?(o=t.charAt(St),St++):(o=a,0===Pt&&Zt(C)),o!==a?r=i=[i,o]:(St=r,r=a)):(St=r,r=a) +else n=a +return e=n!==a?t.substring(e,St):n,Pt--,e===a&&(n=a,0===Pt&&Zt(E)),e}function Qt(){var e,n,r +return Pt++,e=St,47===t.charCodeAt(St)?(n="/",St++):(n=a,0===Pt&&Zt(S)),n!==a&&(r=Jt())!==a?(Mt=e,e=n=r):(St=e,e=a),Pt--,e===a&&(n=a,0===Pt&&Zt(O)),e}function te(){var t,e,n,r,i +if(Pt++,t=St,(e=ue())!==a)if((n=Jt())!==a){for(r=[],i=Qt();i!==a;)r.push(i),i=Qt() +r!==a?(Mt=t,e=function(t,e){return{stem:t,options:e}}(n,r),t=e):(St=t,t=a)}else St=t,t=a +else St=t,t=a +return Pt--,t===a&&(e=a,0===Pt&&Zt(M)),t}function ee(){var e,n,r,i +if(e=St,39===t.charCodeAt(St)?(n=I,St++):(n=a,0===Pt&&Zt($)),n!==a){if(r=[],(i=se())===a&&(U.test(t.charAt(St))?(i=t.charAt(St),St++):(i=a,0===Pt&&Zt(z))),i!==a)for(;i!==a;)r.push(i),(i=se())===a&&(U.test(t.charAt(St))?(i=t.charAt(St),St++):(i=a,0===Pt&&Zt(z))) +else r=a +r!==a?(39===t.charCodeAt(St)?(i=I,St++):(i=a,0===Pt&&Zt($)),i!==a?e=n=[n,r,i]:(St=e,e=a)):(St=e,e=a)}else St=e,e=a +if(e===a)if(e=[],(n=se())===a&&(Z.test(t.charAt(St))?(n=t.charAt(St),St++):(n=a,0===Pt&&Zt(q))),n!==a)for(;n!==a;)e.push(n),(n=se())===a&&(Z.test(t.charAt(St))?(n=t.charAt(St),St++):(n=a,0===Pt&&Zt(q))) +else e=a +return e}function ne(){var e,n +if(e=[],V.test(t.charAt(St))?(n=t.charAt(St),St++):(n=a,0===Pt&&Zt(H)),n!==a)for(;n!==a;)e.push(n),V.test(t.charAt(St))?(n=t.charAt(St),St++):(n=a,0===Pt&&Zt(H)) +else e=a +return e}function re(){var e,n,i,o,u,c,s +return e=St,ue()!==a&&(n=ye())!==a&&ue()!==a?(123===t.charCodeAt(St)?(i=_,St++):(i=a,0===Pt&&Zt(w)),i!==a?(Mt=St,be.push("select"),void 0!==a&&(o=Vt())!==a?(125===t.charCodeAt(St)?(u=x,St++):(u=a,0===Pt&&Zt(A)),u!==a?(Mt=e,c=n,s=o,be.pop(),e=(0,r.pi)({id:c,value:s},ge())):(St=e,e=a)):(St=e,e=a)):(St=e,e=a)):(St=e,e=a),e}function ie(){var e,n,i,o,u,c,s +return e=St,ue()!==a?(n=function(){var e,n,r,i +return e=St,n=St,61===t.charCodeAt(St)?(r="=",St++):(r=a,0===Pt&&Zt(ot)),r!==a&&(i=ce())!==a?n=r=[r,i]:(St=n,n=a),(e=n!==a?t.substring(e,St):n)===a&&(e=ye()),e}(),n!==a&&ue()!==a?(123===t.charCodeAt(St)?(i=_,St++):(i=a,0===Pt&&Zt(w)),i!==a?(Mt=St,be.push("plural"),void 0!==a&&(o=Vt())!==a?(125===t.charCodeAt(St)?(u=x,St++):(u=a,0===Pt&&Zt(A)),u!==a?(Mt=e,c=n,s=o,be.pop(),e=(0,r.pi)({id:c,value:s},ge())):(St=e,e=a)):(St=e,e=a)):(St=e,e=a)):(St=e,e=a)):(St=e,e=a),e}function oe(){var e +return Pt++,ut.test(t.charAt(St))?(e=t.charAt(St),St++):(e=a,0===Pt&&Zt(ct)),Pt--,e===a&&0===Pt&&Zt(at),e}function ae(){var e +return Pt++,ft.test(t.charAt(St))?(e=t.charAt(St),St++):(e=a,0===Pt&&Zt(lt)),Pt--,e===a&&0===Pt&&Zt(st),e}function ue(){var e,n,r +for(Pt++,e=St,n=[],r=oe();r!==a;)n.push(r),r=oe() +return e=n!==a?t.substring(e,St):n,Pt--,e===a&&(n=a,0===Pt&&Zt(ht)),e}function ce(){var e,n,r,i +return Pt++,e=St,45===t.charCodeAt(St)?(n="-",St++):(n=a,0===Pt&&Zt(pt)),n===a&&(n=null),n!==a&&(r=pe())!==a?(Mt=e,e=n=(i=r)?n?-i:i:0):(St=e,e=a),Pt--,e===a&&(n=a,0===Pt&&Zt(dt)),e}function se(){var e,n +return Pt++,e=St,t.substr(St,2)===bt?(n=bt,St+=2):(n=a,0===Pt&&Zt(vt)),n!==a&&(Mt=e,n="'"),Pt--,(e=n)===a&&(n=a,0===Pt&&Zt(yt)),e}function fe(){var e,n,r,i,o,u +if(e=St,39===t.charCodeAt(St)?(n=I,St++):(n=a,0===Pt&&Zt($)),n!==a)if(r=function(){var e,n,r,i,o +return e=St,n=St,t.length>St?(r=t.charAt(St),St++):(r=a,0===Pt&&Zt(C)),r!==a?(Mt=St,(i=(i="<"===(o=r)||">"===o||"{"===o||"}"===o||ve()&&"#"===o)?void 0:a)!==a?n=r=[r,i]:(St=n,n=a)):(St=n,n=a),n!==a?t.substring(e,St):n}(),r!==a){for(i=St,o=[],t.substr(St,2)===bt?(u=bt,St+=2):(u=a,0===Pt&&Zt(vt)),u===a&&(U.test(t.charAt(St))?(u=t.charAt(St),St++):(u=a,0===Pt&&Zt(z)));u!==a;)o.push(u),t.substr(St,2)===bt?(u=bt,St+=2):(u=a,0===Pt&&Zt(vt)),u===a&&(U.test(t.charAt(St))?(u=t.charAt(St),St++):(u=a,0===Pt&&Zt(z)));(i=o!==a?t.substring(i,St):o)!==a?(39===t.charCodeAt(St)?(o=I,St++):(o=a,0===Pt&&Zt($)),o===a&&(o=null),o!==a?(Mt=e,e=n=r+i.replace("''","'")):(St=e,e=a)):(St=e,e=a)}else St=e,e=a +else St=e,e=a +return e}function le(){var e,n,r,i,o +return e=St,n=St,t.length>St?(r=t.charAt(St),St++):(r=a,0===Pt&&Zt(C)),r!==a?(Mt=St,(i=(i=!("<"===(o=r)||"{"===o||ve()&&"#"===o||be.length>1&&"}"===o))?void 0:a)!==a?n=r=[r,i]:(St=n,n=a)):(St=n,n=a),n===a&&(10===t.charCodeAt(St)?(n="\n",St++):(n=a,0===Pt&&Zt(gt))),n!==a?t.substring(e,St):n}function he(){var e,n +return Pt++,e=St,(n=pe())===a&&(n=ye()),e=n!==a?t.substring(e,St):n,Pt--,e===a&&(n=a,0===Pt&&Zt(mt)),e}function de(){var e,n +return Pt++,e=St,(n=pe())===a&&(n=function(){var e,n,r,i,o +if(Pt++,e=St,n=[],45===t.charCodeAt(St)?(r="-",St++):(r=a,0===Pt&&Zt(pt)),r===a&&(r=St,i=St,Pt++,(o=oe())===a&&(o=ae()),Pt--,o===a?i=void 0:(St=i,i=a),i!==a?(t.length>St?(o=t.charAt(St),St++):(o=a,0===Pt&&Zt(C)),o!==a?r=i=[i,o]:(St=r,r=a)):(St=r,r=a)),r!==a)for(;r!==a;)n.push(r),45===t.charCodeAt(St)?(r="-",St++):(r=a,0===Pt&&Zt(pt)),r===a&&(r=St,i=St,Pt++,(o=oe())===a&&(o=ae()),Pt--,o===a?i=void 0:(St=i,i=a),i!==a?(t.length>St?(o=t.charAt(St),St++):(o=a,0===Pt&&Zt(C)),o!==a?r=i=[i,o]:(St=r,r=a)):(St=r,r=a)) +else n=a +return e=n!==a?t.substring(e,St):n,Pt--,e===a&&(n=a,0===Pt&&Zt(Ot)),e}()),e=n!==a?t.substring(e,St):n,Pt--,e===a&&(n=a,0===Pt&&Zt(_t)),e}function pe(){var e,n,r,i,o +if(Pt++,e=St,48===t.charCodeAt(St)?(n="0",St++):(n=a,0===Pt&&Zt(xt)),n!==a&&(Mt=e,n=0),(e=n)===a){if(e=St,n=St,At.test(t.charAt(St))?(r=t.charAt(St),St++):(r=a,0===Pt&&Zt(Et)),r!==a){for(i=[],kt.test(t.charAt(St))?(o=t.charAt(St),St++):(o=a,0===Pt&&Zt(Dt));o!==a;)i.push(o),kt.test(t.charAt(St))?(o=t.charAt(St),St++):(o=a,0===Pt&&Zt(Dt)) +i!==a?n=r=[r,i]:(St=n,n=a)}else St=n,n=a +n!==a&&(Mt=e,n=parseInt(n.join(""),10)),e=n}return Pt--,e===a&&(n=a,0===Pt&&Zt(wt)),e}function ye(){var e,n,r,i,o +if(Pt++,e=St,n=[],r=St,i=St,Pt++,(o=oe())===a&&(o=ae()),Pt--,o===a?i=void 0:(St=i,i=a),i!==a?(t.length>St?(o=t.charAt(St),St++):(o=a,0===Pt&&Zt(C)),o!==a?r=i=[i,o]:(St=r,r=a)):(St=r,r=a),r!==a)for(;r!==a;)n.push(r),r=St,i=St,Pt++,(o=oe())===a&&(o=ae()),Pt--,o===a?i=void 0:(St=i,i=a),i!==a?(t.length>St?(o=t.charAt(St),St++):(o=a,0===Pt&&Zt(C)),o!==a?r=i=[i,o]:(St=r,r=a)):(St=r,r=a) +else n=a +return e=n!==a?t.substring(e,St):n,Pt--,e===a&&(n=a,0===Pt&&Zt(Ct)),e}var be=["root"] +function ve(){return"plural"===be[be.length-1]}function ge(){return e&&e.captureLocation?{location:Nt()}:{}}var me,_e,we,xe=e&&e.ignoreTag,Ae=e&&e.shouldParseSkeleton +if((n=c())!==a&&St===t.length)return n +throw n!==a&&St{"use strict" +var r,i +function o(t){return t.type===r.literal}function a(t){return t.type===r.argument}function u(t){return t.type===r.number}function c(t){return t.type===r.date}function s(t){return t.type===r.time}function f(t){return t.type===r.select}function l(t){return t.type===r.plural}function h(t){return t.type===r.pound}function d(t){return t.type===r.tag}function p(t){return!(!t||"object"!=typeof t||t.type!==i.number)}function y(t){return!(!t||"object"!=typeof t||t.type!==i.dateTime)}function b(t){return{type:r.literal,value:t}}function v(t,e){return{type:r.number,value:t,style:e}}n.d(e,{HI:()=>d,Ii:()=>y,Jo:()=>l,O4:()=>o,VG:()=>a,Wh:()=>p,Wi:()=>f,aV:()=>i,mD:()=>b,pe:()=>s,qx:()=>v,rp:()=>c,uf:()=>u,wD:()=>r,yx:()=>h}),function(t){t[t.literal=0]="literal",t[t.argument=1]="argument",t[t.number=2]="number",t[t.date=3]="date",t[t.time=4]="time",t[t.select=5]="select",t[t.plural=6]="plural",t[t.pound=7]="pound",t[t.tag=8]="tag"}(r||(r={})),function(t){t[t.number=0]="number",t[t.dateTime=1]="dateTime"}(i||(i={}))},4143:(t,e,n)=>{"use strict" +n.r(e),n.d(e,{ErrorCode:()=>r,FormatError:()=>f,IntlMessageFormat:()=>g,InvalidValueError:()=>l,InvalidValueTypeError:()=>h,MissingValueError:()=>d,PART_TYPE:()=>s,default:()=>m,formatToParts:()=>y,isFormatXMLElementFn:()=>p}) +var r,i=n(2247),o=n(4857),a=n(4564),u=n.n(a),c=n(8131) +!function(t){t.MISSING_VALUE="MISSING_VALUE",t.INVALID_VALUE="INVALID_VALUE",t.MISSING_INTL_API="MISSING_INTL_API"}(r||(r={})) +var s,f=function(t){function e(e,n,r){var i=t.call(this,e)||this +return i.code=n,i.originalMessage=r,i}return(0,i.ZT)(e,t),e.prototype.toString=function(){return"[formatjs Error: "+this.code+"] "+this.message},e}(Error),l=function(t){function e(e,n,i,o){return t.call(this,'Invalid values for "'+e+'": "'+n+'". Options are "'+Object.keys(i).join('", "')+'"',r.INVALID_VALUE,o)||this}return(0,i.ZT)(e,t),e}(f),h=function(t){function e(e,n,i){return t.call(this,'Value for "'+e+'" must be of type '+n,r.INVALID_VALUE,i)||this}return(0,i.ZT)(e,t),e}(f),d=function(t){function e(e,n){return t.call(this,'The intl string context variable "'+e+'" was not provided to the string "'+n+'"',r.MISSING_VALUE,n)||this}return(0,i.ZT)(e,t),e}(f) +function p(t){return"function"==typeof t}function y(t,e,n,i,o,a,u){if(1===t.length&&(0,c.O4)(t[0]))return[{type:s.literal,value:t[0].value}] +for(var b=[],v=0,g=t;v{var r=n(1219),i=n(2251) +function o(t){this.Container=t||Array,this.items=new Map,this.clear(),Object.defineProperty(this.items,"constructor",{value:o,enumerable:!1})}o.prototype.clear=function(){this.size=0,this.dimension=0,this.items.clear()},o.prototype.set=function(t,e){var n,r=this.items.get(t) +return r||(this.dimension++,r=new this.Container,this.items.set(t,r)),this.Container===Set?(n=r.size,r.add(e),n1?e:this,this.items.forEach((function(t,e){n=e,t.forEach(r)}))},o.prototype.forEachAssociation=function(t,e){e=arguments.length>1?e:this,this.items.forEach(t,e)},o.prototype.keys=function(){return this.items.keys()},o.prototype.values=function(){var t,e,n,i,o=this.items.values(),a=!1 +return this.Container===Set?new r((function n(){if(!a){if((e=o.next()).done)return{done:!0} +a=!0,t=e.value.values()}return(e=t.next()).done?(a=!1,n()):{done:!1,value:e.value}})):new r((function r(){if(!a){if((e=o.next()).done)return{done:!0} +a=!0,t=e.value,n=0,i=t.length}return n>=i?(a=!1,r()):{done:!1,value:t[n++]}}))},o.prototype.entries=function(){var t,e,n,i,o,a=this.items.entries(),u=!1 +return this.Container===Set?new r((function r(){if(!u){if((e=a.next()).done)return{done:!0} +u=!0,n=e.value[0],t=e.value[1].values()}return(e=t.next()).done?(u=!1,r()):{done:!1,value:[n,e.value]}})):new r((function r(){if(!u){if((e=a.next()).done)return{done:!0} +u=!0,n=e.value[0],t=e.value[1],i=0,o=t.length}return i>=o?(u=!1,r()):{done:!1,value:[n,t[i++]]}}))},o.prototype.containers=function(){return this.items.values()},o.prototype.associations=function(){return this.items.entries()},"undefined"!=typeof Symbol&&(o.prototype[Symbol.iterator]=o.prototype.entries),o.prototype.inspect=function(){return this.items},"undefined"!=typeof Symbol&&(o.prototype[Symbol.for("nodejs.util.inspect.custom")]=o.prototype.inspect),o.prototype.toJSON=function(){return this.items},o.from=function(t,e){var n=new o(e) +return i(t,(function(t,e){n.set(e,t)})),n},t.exports=o},3333:(t,e)=>{e.intersection=function(){if(arguments.length<2)throw new Error("mnemonist/Set.intersection: needs at least two arguments.") +var t,e,n=new Set,r=1/0,i=null,o=arguments.length +for(e=0;ee.size)return!1 +for(;!(n=r.next()).done;)if(!e.has(n.value))return!1 +return!0},e.isSuperset=function(t,n){return e.isSubset(n,t)},e.add=function(t,e){for(var n,r=e.values();!(n=r.next()).done;)t.add(n.value)},e.subtract=function(t,e){for(var n,r=e.values();!(n=r.next()).done;)t.delete(n.value)},e.intersect=function(t,e){for(var n,r=t.values();!(n=r.next()).done;)e.has(n.value)||t.delete(n.value)},e.disjunct=function(t,e){for(var n,r=t.values(),i=[];!(n=r.next()).done;)e.has(n.value)&&i.push(n.value) +for(r=e.values();!(n=r.next()).done;)t.has(n.value)||t.add(n.value) +for(var o=0,a=i.length;oe.size&&(n=t,t=e,e=n),0===t.size)return 0 +if(t===e)return t.size +for(var r,i=t.values(),o=0;!(r=i.next()).done;)e.has(r.value)&&o++ +return o},e.unionSize=function(t,n){var r=e.intersectionSize(t,n) +return t.size+n.size-r},e.jaccard=function(t,n){var r=e.intersectionSize(t,n) +return 0===r?0:r/(t.size+n.size-r)},e.overlap=function(t,n){var r=e.intersectionSize(t,n) +return 0===r?0:r/Math.min(t.size,n.size)}},260:t=>{function e(t,e){if(!t)throw new Error(e||"AssertionError")}e.notEqual=function(t,n,r){e(t!=n,r)},e.notOk=function(t,n){e(!t,n)},e.equal=function(t,n,r){e(t==n,r)},e.ok=e,t.exports=e},4662:t=>{t.exports=function(t){!function(t){if(!t)throw new Error("Eventify cannot use falsy object as events subject") +for(var e=["on","fire","off"],n=0;n1&&(r=Array.prototype.splice.call(arguments,1)) +for(var o=0;o{t.exports=function(t){if("uniqueLinkId"in(t=t||{})&&(console.warn("ngraph.graph: Starting from version 0.14 `uniqueLinkId` is deprecated.\nUse `multigraph` option instead\n","\n","Note: there is also change in default behavior: From now on each graph\nis considered to be not a multigraph by default (each edge is unique)."),t.multigraph=t.uniqueLinkId),void 0===t.multigraph&&(t.multigraph=!1),"function"!=typeof Map)throw new Error("ngraph.graph requires `Map` to be defined. Please polyfill it before using ngraph") +var e,n=new Map,s=[],f={},l=0,h=t.multigraph?function(t,e,n){var r=c(t,e),i=f.hasOwnProperty(r) +if(i||C(t,e)){i||(f[r]=0) +var o="@"+ ++f[r] +r=c(t+o,e+o)}return new u(t,e,n,r)}:function(t,e,n){return new u(t,e,n,c(t,e))},d=[],p=O,y=O,b=O,v=O,g={addNode:w,addLink:function(t,e,n){b() +var r=x(t)||w(t),i=x(e)||w(e),o=h(t,e,n) +return s.push(o),a(r,o),t!==e&&a(i,o),p(o,"add"),v(),o},removeLink:D,removeNode:A,getNode:x,getNodeCount:E,getLinkCount:k,getLinksCount:k,getNodesCount:E,getLinks:function(t){var e=x(t) +return e?e.links:null},forEachNode:F,forEachLinkedNode:function(t,e,r){var i=x(t) +if(i&&i.links&&"function"==typeof e)return r?function(t,e,r){for(var i=0;i=0&&n.links.splice(e,1),r&&(e=i(t,r.links))>=0&&r.links.splice(e,1),p(t,"remove"),v(),!0}function C(t,e){var n,r=x(t) +if(!r||!r.links)return null +for(n=0;n0&&(g.fire("changed",d),d.length=0)}function F(t){if("function"!=typeof t)throw new Error("Function is expected to iterate over graph nodes. You passed "+t) +for(var e=n.values(),r=e.next();!r.done;){if(t(r.value))return!0 +r=e.next()}}} +var r=n(4662) +function i(t,e){if(!e)return-1 +if(e.indexOf)return e.indexOf(t) +var n,r=e.length +for(n=0;n{var e="undefined"!=typeof ArrayBuffer,n="undefined"!=typeof Symbol +function r(t,r){var i,o,a,u,c +if(!t)throw new Error("obliterator/forEach: invalid iterable.") +if("function"!=typeof r)throw new Error("obliterator/forEach: expecting a callback.") +if(Array.isArray(t)||e&&ArrayBuffer.isView(t)||"string"==typeof t||"[object Arguments]"===t.toString())for(a=0,u=t.length;a{function e(t){Object.defineProperty(this,"_next",{writable:!1,enumerable:!1,value:t}),this.done=!1}e.prototype.next=function(){if(this.done)return{done:!0} +var t=this._next() +return t.done&&(this.done=!0),t},"undefined"!=typeof Symbol&&(e.prototype[Symbol.iterator]=function(){return this}),e.of=function(){var t=arguments,n=t.length,r=0 +return new e((function(){return r>=n?{done:!0}:{done:!1,value:t[r++]}}))},e.empty=function(){var t=new e(null) +return t.done=!0,t},e.is=function(t){return t instanceof e||"object"==typeof t&&null!==t&&"function"==typeof t.next},t.exports=e},1813:t=>{"use strict" +var e=/(\x2D?(?:\d+\.?\d*|\d*\.?\d+)(?:e[-+]?\d+)?)\s*([A-Za-z\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0560-\u0588\u05D0-\u05EA\u05EF-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u0860-\u086A\u0870-\u0887\u0889-\u088E\u08A0-\u08C9\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u09FC\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C5D\u0C60\u0C61\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D04-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E86-\u0E8A\u0E8C-\u0EA3\u0EA5\u0EA7-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16F1-\u16F8\u1700-\u1711\u171F-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1878\u1880-\u1884\u1887-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4C\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1C80-\u1C88\u1C90-\u1CBA\u1CBD-\u1CBF\u1CE9-\u1CEC\u1CEE-\u1CF3\u1CF5\u1CF6\u1CFA\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2183\u2184\u2C00-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005\u3006\u3031-\u3035\u303B\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312F\u3131-\u318E\u31A0-\u31BF\u31F0-\u31FF\u3400-\u4DBF\u4E00-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6E5\uA717-\uA71F\uA722-\uA788\uA78B-\uA7CA\uA7D0\uA7D1\uA7D3\uA7D5-\uA7D9\uA7F2-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD\uA8FE\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB69\uAB70-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC\u{10000}-\u{1000B}\u{1000D}-\u{10026}\u{10028}-\u{1003A}\u{1003C}\u{1003D}\u{1003F}-\u{1004D}\u{10050}-\u{1005D}\u{10080}-\u{100FA}\u{10280}-\u{1029C}\u{102A0}-\u{102D0}\u{10300}-\u{1031F}\u{1032D}-\u{10340}\u{10342}-\u{10349}\u{10350}-\u{10375}\u{10380}-\u{1039D}\u{103A0}-\u{103C3}\u{103C8}-\u{103CF}\u{10400}-\u{1049D}\u{104B0}-\u{104D3}\u{104D8}-\u{104FB}\u{10500}-\u{10527}\u{10530}-\u{10563}\u{10570}-\u{1057A}\u{1057C}-\u{1058A}\u{1058C}-\u{10592}\u{10594}\u{10595}\u{10597}-\u{105A1}\u{105A3}-\u{105B1}\u{105B3}-\u{105B9}\u{105BB}\u{105BC}\u{10600}-\u{10736}\u{10740}-\u{10755}\u{10760}-\u{10767}\u{10780}-\u{10785}\u{10787}-\u{107B0}\u{107B2}-\u{107BA}\u{10800}-\u{10805}\u{10808}\u{1080A}-\u{10835}\u{10837}\u{10838}\u{1083C}\u{1083F}-\u{10855}\u{10860}-\u{10876}\u{10880}-\u{1089E}\u{108E0}-\u{108F2}\u{108F4}\u{108F5}\u{10900}-\u{10915}\u{10920}-\u{10939}\u{10980}-\u{109B7}\u{109BE}\u{109BF}\u{10A00}\u{10A10}-\u{10A13}\u{10A15}-\u{10A17}\u{10A19}-\u{10A35}\u{10A60}-\u{10A7C}\u{10A80}-\u{10A9C}\u{10AC0}-\u{10AC7}\u{10AC9}-\u{10AE4}\u{10B00}-\u{10B35}\u{10B40}-\u{10B55}\u{10B60}-\u{10B72}\u{10B80}-\u{10B91}\u{10C00}-\u{10C48}\u{10C80}-\u{10CB2}\u{10CC0}-\u{10CF2}\u{10D00}-\u{10D23}\u{10E80}-\u{10EA9}\u{10EB0}\u{10EB1}\u{10F00}-\u{10F1C}\u{10F27}\u{10F30}-\u{10F45}\u{10F70}-\u{10F81}\u{10FB0}-\u{10FC4}\u{10FE0}-\u{10FF6}\u{11003}-\u{11037}\u{11071}\u{11072}\u{11075}\u{11083}-\u{110AF}\u{110D0}-\u{110E8}\u{11103}-\u{11126}\u{11144}\u{11147}\u{11150}-\u{11172}\u{11176}\u{11183}-\u{111B2}\u{111C1}-\u{111C4}\u{111DA}\u{111DC}\u{11200}-\u{11211}\u{11213}-\u{1122B}\u{11280}-\u{11286}\u{11288}\u{1128A}-\u{1128D}\u{1128F}-\u{1129D}\u{1129F}-\u{112A8}\u{112B0}-\u{112DE}\u{11305}-\u{1130C}\u{1130F}\u{11310}\u{11313}-\u{11328}\u{1132A}-\u{11330}\u{11332}\u{11333}\u{11335}-\u{11339}\u{1133D}\u{11350}\u{1135D}-\u{11361}\u{11400}-\u{11434}\u{11447}-\u{1144A}\u{1145F}-\u{11461}\u{11480}-\u{114AF}\u{114C4}\u{114C5}\u{114C7}\u{11580}-\u{115AE}\u{115D8}-\u{115DB}\u{11600}-\u{1162F}\u{11644}\u{11680}-\u{116AA}\u{116B8}\u{11700}-\u{1171A}\u{11740}-\u{11746}\u{11800}-\u{1182B}\u{118A0}-\u{118DF}\u{118FF}-\u{11906}\u{11909}\u{1190C}-\u{11913}\u{11915}\u{11916}\u{11918}-\u{1192F}\u{1193F}\u{11941}\u{119A0}-\u{119A7}\u{119AA}-\u{119D0}\u{119E1}\u{119E3}\u{11A00}\u{11A0B}-\u{11A32}\u{11A3A}\u{11A50}\u{11A5C}-\u{11A89}\u{11A9D}\u{11AB0}-\u{11AF8}\u{11C00}-\u{11C08}\u{11C0A}-\u{11C2E}\u{11C40}\u{11C72}-\u{11C8F}\u{11D00}-\u{11D06}\u{11D08}\u{11D09}\u{11D0B}-\u{11D30}\u{11D46}\u{11D60}-\u{11D65}\u{11D67}\u{11D68}\u{11D6A}-\u{11D89}\u{11D98}\u{11EE0}-\u{11EF2}\u{11FB0}\u{12000}-\u{12399}\u{12480}-\u{12543}\u{12F90}-\u{12FF0}\u{13000}-\u{1342E}\u{14400}-\u{14646}\u{16800}-\u{16A38}\u{16A40}-\u{16A5E}\u{16A70}-\u{16ABE}\u{16AD0}-\u{16AED}\u{16B00}-\u{16B2F}\u{16B40}-\u{16B43}\u{16B63}-\u{16B77}\u{16B7D}-\u{16B8F}\u{16E40}-\u{16E7F}\u{16F00}-\u{16F4A}\u{16F50}\u{16F93}-\u{16F9F}\u{16FE0}\u{16FE1}\u{16FE3}\u{17000}-\u{187F7}\u{18800}-\u{18CD5}\u{18D00}-\u{18D08}\u{1AFF0}-\u{1AFF3}\u{1AFF5}-\u{1AFFB}\u{1AFFD}\u{1AFFE}\u{1B000}-\u{1B122}\u{1B150}-\u{1B152}\u{1B164}-\u{1B167}\u{1B170}-\u{1B2FB}\u{1BC00}-\u{1BC6A}\u{1BC70}-\u{1BC7C}\u{1BC80}-\u{1BC88}\u{1BC90}-\u{1BC99}\u{1D400}-\u{1D454}\u{1D456}-\u{1D49C}\u{1D49E}\u{1D49F}\u{1D4A2}\u{1D4A5}\u{1D4A6}\u{1D4A9}-\u{1D4AC}\u{1D4AE}-\u{1D4B9}\u{1D4BB}\u{1D4BD}-\u{1D4C3}\u{1D4C5}-\u{1D505}\u{1D507}-\u{1D50A}\u{1D50D}-\u{1D514}\u{1D516}-\u{1D51C}\u{1D51E}-\u{1D539}\u{1D53B}-\u{1D53E}\u{1D540}-\u{1D544}\u{1D546}\u{1D54A}-\u{1D550}\u{1D552}-\u{1D6A5}\u{1D6A8}-\u{1D6C0}\u{1D6C2}-\u{1D6DA}\u{1D6DC}-\u{1D6FA}\u{1D6FC}-\u{1D714}\u{1D716}-\u{1D734}\u{1D736}-\u{1D74E}\u{1D750}-\u{1D76E}\u{1D770}-\u{1D788}\u{1D78A}-\u{1D7A8}\u{1D7AA}-\u{1D7C2}\u{1D7C4}-\u{1D7CB}\u{1DF00}-\u{1DF1E}\u{1E100}-\u{1E12C}\u{1E137}-\u{1E13D}\u{1E14E}\u{1E290}-\u{1E2AD}\u{1E2C0}-\u{1E2EB}\u{1E7E0}-\u{1E7E6}\u{1E7E8}-\u{1E7EB}\u{1E7ED}\u{1E7EE}\u{1E7F0}-\u{1E7FE}\u{1E800}-\u{1E8C4}\u{1E900}-\u{1E943}\u{1E94B}\u{1EE00}-\u{1EE03}\u{1EE05}-\u{1EE1F}\u{1EE21}\u{1EE22}\u{1EE24}\u{1EE27}\u{1EE29}-\u{1EE32}\u{1EE34}-\u{1EE37}\u{1EE39}\u{1EE3B}\u{1EE42}\u{1EE47}\u{1EE49}\u{1EE4B}\u{1EE4D}-\u{1EE4F}\u{1EE51}\u{1EE52}\u{1EE54}\u{1EE57}\u{1EE59}\u{1EE5B}\u{1EE5D}\u{1EE5F}\u{1EE61}\u{1EE62}\u{1EE64}\u{1EE67}-\u{1EE6A}\u{1EE6C}-\u{1EE72}\u{1EE74}-\u{1EE77}\u{1EE79}-\u{1EE7C}\u{1EE7E}\u{1EE80}-\u{1EE89}\u{1EE8B}-\u{1EE9B}\u{1EEA1}-\u{1EEA3}\u{1EEA5}-\u{1EEA9}\u{1EEAB}-\u{1EEBB}\u{20000}-\u{2A6DF}\u{2A700}-\u{2B738}\u{2B740}-\u{2B81D}\u{2B820}-\u{2CEA1}\u{2CEB0}-\u{2EBE0}\u{2F800}-\u{2FA1D}\u{30000}-\u{3134A}]*)/giu +function n(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"ms" +var i=null +return t=(t+"").replace(/(\d)[,_](\d)/g,"$1$2"),t.replace(e,(function(t,e,n){(n=r(n))&&(i=(i||0)+parseFloat(e,10)*n)})),i&&i/(r(n)||1)}function r(t){return n[t]||n[t.toLowerCase().replace(/s$/,"")]}t.exports=n,t.exports.default=n,n.nanosecond=n.ns=1e-6,n["µs"]=n["μs"]=n.us=n.microsecond=.001,n.millisecond=n.ms=n[""]=1,n.second=n.sec=n.s=1e3*n.ms,n.minute=n.min=n.m=60*n.s,n.hour=n.hr=n.h=60*n.m,n.day=n.d=24*n.h,n.week=n.wk=n.w=7*n.d,n.month=n.b=30.4375*n.d,n.year=n.yr=n.y=365.25*n.d},2610:t=>{"use strict" +t.exports=t=>{if("number"!=typeof t)throw new TypeError("Expected a number") +const e=t>0?Math.floor:Math.ceil +return{days:e(t/864e5),hours:e(t/36e5)%24,minutes:e(t/6e4)%60,seconds:e(t/1e3)%60,milliseconds:e(t)%1e3,microseconds:e(1e3*t)%1e3,nanoseconds:e(1e6*t)%1e3}}},3385:(t,e,n)=>{"use strict" +const r=n(2610),i=(t,e)=>1===e?t:`${t}s` +t.exports=function(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{} +if(!Number.isFinite(t))throw new TypeError("Expected a finite number") +e.colonNotation&&(e.compact=!1,e.formatSubMilliseconds=!1,e.separateMilliseconds=!1,e.verbose=!1),e.compact&&(e.secondsDecimalDigits=0,e.millisecondsDecimalDigits=0) +const n=[],o=(t,e)=>{const n=Math.floor(t*10**e+1e-7) +return(Math.round(n)/10**e).toFixed(e)},a=(t,r,o,a)=>{if(!(0!==n.length&&e.colonNotation||0!==t||e.colonNotation&&"m"===o))return +let u,c +if(a=(a||t||"0").toString(),e.colonNotation){u=n.length>0?":":"",c="" +const t=a.includes(".")?a.split(".")[0].length:a.length,e=n.length>0?2:1 +a="0".repeat(Math.max(0,e-t))+a}else u="",c=e.verbose?" "+i(r,t):o +n.push(u+a+c)},u=r(t) +if(a(Math.trunc(u.days/365),"year","y"),a(u.days%365,"day","d"),a(u.hours,"hour","h"),a(u.minutes,"minute","m"),e.separateMilliseconds||e.formatSubMilliseconds||!e.colonNotation&&t<1e3)if(a(u.seconds,"second","s"),e.formatSubMilliseconds)a(u.milliseconds,"millisecond","ms"),a(u.microseconds,"microsecond","µs"),a(u.nanoseconds,"nanosecond","ns") +else{const t=u.milliseconds+u.microseconds/1e3+u.nanoseconds/1e6,n="number"==typeof e.millisecondsDecimalDigits?e.millisecondsDecimalDigits:0,r=t>=1?Math.round(t):Math.ceil(t),i=n?t.toFixed(n):r +a(Number.parseFloat(i,10),"millisecond","ms",i)}else{const n=o(t/1e3%60,"number"==typeof e.secondsDecimalDigits?e.secondsDecimalDigits:1),r=e.keepDecimalsOnWholeSeconds?n:n.replace(/\.0+$/,"") +a(Number.parseFloat(r,10),"second","s",r)}if(0===n.length)return"0"+(e.verbose?" milliseconds":"ms") +if(e.compact)return n[0] +if("number"==typeof e.unitCount){const t=e.colonNotation?"":" " +return n.slice(0,Math.max(e.unitCount,1)).join(t)}return e.colonNotation?n.join(""):n.join(" ")}},7114:(t,e,n)=>{"use strict" +var r +n.r(e),n.d(e,{default:()=>i}) +const i=function(){function t(){this.pool=[],this.flush()}return t.prototype.flush=function(){var t=this +r=window.requestAnimationFrame((function(){var e=t.pool +t.reset(),e.forEach((function(t){t[Object.keys(t)[0]]()})),t.flush()}))},t.prototype.add=function(t,e){var n +return this.pool.push(((n={})[t]=e,n)),e},t.prototype.remove=function(t){this.pool=this.pool.filter((function(e){return!e[t]}))},t.prototype.reset=function(){this.pool=[]},t.prototype.stop=function(){window.cancelAnimationFrame(r)},t}()},1499:(t,e,n)=>{"use strict" +function r(t){var e=t.getBoundingClientRect() +return{width:e.width,height:e.height,top:e.top,right:e.right,bottom:e.bottom,left:e.left,x:e.left,y:e.top}}function i(t){if(null==t)return window +if("[object Window]"!==t.toString()){var e=t.ownerDocument +return e&&e.defaultView||window}return t}function o(t){var e=i(t) +return{scrollLeft:e.pageXOffset,scrollTop:e.pageYOffset}}function a(t){return t instanceof i(t).Element||t instanceof Element}function u(t){return t instanceof i(t).HTMLElement||t instanceof HTMLElement}function c(t){return"undefined"!=typeof ShadowRoot&&(t instanceof i(t).ShadowRoot||t instanceof ShadowRoot)}function s(t){return t?(t.nodeName||"").toLowerCase():null}function f(t){return((a(t)?t.ownerDocument:t.document)||window.document).documentElement}function l(t){return r(f(t)).left+o(t).scrollLeft}function h(t){return i(t).getComputedStyle(t)}function d(t){var e=h(t),n=e.overflow,r=e.overflowX,i=e.overflowY +return/auto|scroll|overlay|hidden/.test(n+i+r)}function p(t,e,n){void 0===n&&(n=!1) +var a,c,h=f(e),p=r(t),y=u(e),b={scrollLeft:0,scrollTop:0},v={x:0,y:0} +return(y||!y&&!n)&&(("body"!==s(e)||d(h))&&(b=(a=e)!==i(a)&&u(a)?{scrollLeft:(c=a).scrollLeft,scrollTop:c.scrollTop}:o(a)),u(e)?((v=r(e)).x+=e.clientLeft,v.y+=e.clientTop):h&&(v.x=l(h))),{x:p.left+b.scrollLeft-v.x,y:p.top+b.scrollTop-v.y,width:p.width,height:p.height}}function y(t){var e=r(t),n=t.offsetWidth,i=t.offsetHeight +return Math.abs(e.width-n)<=1&&(n=e.width),Math.abs(e.height-i)<=1&&(i=e.height),{x:t.offsetLeft,y:t.offsetTop,width:n,height:i}}function b(t){return"html"===s(t)?t:t.assignedSlot||t.parentNode||(c(t)?t.host:null)||f(t)}function v(t){return["html","body","#document"].indexOf(s(t))>=0?t.ownerDocument.body:u(t)&&d(t)?t:v(b(t))}function g(t,e){var n +void 0===e&&(e=[]) +var r=v(t),o=r===(null==(n=t.ownerDocument)?void 0:n.body),a=i(r),u=o?[a].concat(a.visualViewport||[],d(r)?r:[]):r,c=e.concat(u) +return o?c:c.concat(g(b(u)))}function m(t){return["table","td","th"].indexOf(s(t))>=0}function _(t){return u(t)&&"fixed"!==h(t).position?t.offsetParent:null}function w(t){for(var e=i(t),n=_(t);n&&m(n)&&"static"===h(n).position;)n=_(n) +return n&&("html"===s(n)||"body"===s(n)&&"static"===h(n).position)?e:n||function(t){for(var e=-1!==navigator.userAgent.toLowerCase().indexOf("firefox"),n=b(t);u(n)&&["html","body"].indexOf(s(n))<0;){var r=h(n) +if("none"!==r.transform||"none"!==r.perspective||"paint"===r.contain||-1!==["transform","perspective"].indexOf(r.willChange)||e&&"filter"===r.willChange||e&&r.filter&&"none"!==r.filter)return n +n=n.parentNode}return null}(t)||e}n.r(e),n.d(e,{animateFill:()=>oe,createSingleton:()=>ne,default:()=>de,delegate:()=>ie,followCursor:()=>se,hideAll:()=>te,inlinePositioning:()=>fe,roundArrow:()=>lt,sticky:()=>le}) +var x="top",A="bottom",E="right",k="left",D="auto",C=[x,A,E,k],O="start",S="end",M="viewport",F="popper",T=C.reduce((function(t,e){return t.concat([e+"-"+O,e+"-"+S])}),[]),B=[].concat(C,[D]).reduce((function(t,e){return t.concat([e,e+"-"+O,e+"-"+S])}),[]),P=["beforeRead","read","afterRead","beforeMain","main","afterMain","beforeWrite","write","afterWrite"] +function j(t){var e=new Map,n=new Set,r=[] +function i(t){n.add(t.name),[].concat(t.requires||[],t.requiresIfExists||[]).forEach((function(t){if(!n.has(t)){var r=e.get(t) +r&&i(r)}})),r.push(t)}return t.forEach((function(t){e.set(t.name,t)})),t.forEach((function(t){n.has(t.name)||i(t)})),r}var N={placement:"bottom",modifiers:[],strategy:"absolute"} +function R(){for(var t=arguments.length,e=new Array(t),n=0;n=0?"x":"y"}function Z(t){var e,n=t.reference,r=t.element,i=t.placement,o=i?$(i):null,a=i?U(i):null,u=n.x+n.width/2-r.width/2,c=n.y+n.height/2-r.height/2 +switch(o){case x:e={x:u,y:n.y-r.height} +break +case A:e={x:u,y:n.y+n.height} +break +case E:e={x:n.x+n.width,y:c} +break +case k:e={x:n.x-r.width,y:c} +break +default:e={x:n.x,y:n.y}}var s=o?z(o):null +if(null!=s){var f="y"===s?"height":"width" +switch(a){case O:e[s]=e[s]-(n[f]/2-r[f]/2) +break +case S:e[s]=e[s]+(n[f]/2-r[f]/2)}}return e}const q={name:"popperOffsets",enabled:!0,phase:"read",fn:function(t){var e=t.state,n=t.name +e.modifiersData[n]=Z({reference:e.rects.reference,element:e.rects.popper,strategy:"absolute",placement:e.placement})},data:{}} +var V=Math.max,H=Math.min,Y=Math.round,G={top:"auto",right:"auto",bottom:"auto",left:"auto"} +function K(t){var e,n=t.popper,r=t.popperRect,o=t.placement,a=t.offsets,u=t.position,c=t.gpuAcceleration,s=t.adaptive,l=t.roundOffsets,d=!0===l?function(t){var e=t.x,n=t.y,r=window.devicePixelRatio||1 +return{x:Y(Y(e*r)/r)||0,y:Y(Y(n*r)/r)||0}}(a):"function"==typeof l?l(a):a,p=d.x,y=void 0===p?0:p,b=d.y,v=void 0===b?0:b,g=a.hasOwnProperty("x"),m=a.hasOwnProperty("y"),_=k,D=x,C=window +if(s){var O=w(n),S="clientHeight",M="clientWidth" +O===i(n)&&"static"!==h(O=f(n)).position&&(S="scrollHeight",M="scrollWidth"),o===x&&(D=A,v-=O[S]-r.height,v*=c?1:-1),o===k&&(_=E,y-=O[M]-r.width,y*=c?1:-1)}var F,T=Object.assign({position:u},s&&G) +return c?Object.assign({},T,((F={})[D]=m?"0":"",F[_]=g?"0":"",F.transform=(C.devicePixelRatio||1)<2?"translate("+y+"px, "+v+"px)":"translate3d("+y+"px, "+v+"px, 0)",F)):Object.assign({},T,((e={})[D]=m?v+"px":"",e[_]=g?y+"px":"",e.transform="",e))}const W={name:"applyStyles",enabled:!0,phase:"write",fn:function(t){var e=t.state +Object.keys(e.elements).forEach((function(t){var n=e.styles[t]||{},r=e.attributes[t]||{},i=e.elements[t] +u(i)&&s(i)&&(Object.assign(i.style,n),Object.keys(r).forEach((function(t){var e=r[t] +!1===e?i.removeAttribute(t):i.setAttribute(t,!0===e?"":e)})))}))},effect:function(t){var e=t.state,n={popper:{position:e.options.strategy,left:"0",top:"0",margin:"0"},arrow:{position:"absolute"},reference:{}} +return Object.assign(e.elements.popper.style,n.popper),e.styles=n,e.elements.arrow&&Object.assign(e.elements.arrow.style,n.arrow),function(){Object.keys(e.elements).forEach((function(t){var r=e.elements[t],i=e.attributes[t]||{},o=Object.keys(e.styles.hasOwnProperty(t)?e.styles[t]:n[t]).reduce((function(t,e){return t[e]="",t}),{}) +u(r)&&s(r)&&(Object.assign(r.style,o),Object.keys(i).forEach((function(t){r.removeAttribute(t)})))}))}},requires:["computeStyles"]} +var X={left:"right",right:"left",bottom:"top",top:"bottom"} +function J(t){return t.replace(/left|right|bottom|top/g,(function(t){return X[t]}))}var Q={start:"end",end:"start"} +function tt(t){return t.replace(/start|end/g,(function(t){return Q[t]}))}function et(t,e){var n=e.getRootNode&&e.getRootNode() +if(t.contains(e))return!0 +if(n&&c(n)){var r=e +do{if(r&&t.isSameNode(r))return!0 +r=r.parentNode||r.host}while(r)}return!1}function nt(t){return Object.assign({},t,{left:t.x,top:t.y,right:t.x+t.width,bottom:t.y+t.height})}function rt(t,e){return e===M?nt(function(t){var e=i(t),n=f(t),r=e.visualViewport,o=n.clientWidth,a=n.clientHeight,u=0,c=0 +return r&&(o=r.width,a=r.height,/^((?!chrome|android).)*safari/i.test(navigator.userAgent)||(u=r.offsetLeft,c=r.offsetTop)),{width:o,height:a,x:u+l(t),y:c}}(t)):u(e)?function(t){var e=r(t) +return e.top=e.top+t.clientTop,e.left=e.left+t.clientLeft,e.bottom=e.top+t.clientHeight,e.right=e.left+t.clientWidth,e.width=t.clientWidth,e.height=t.clientHeight,e.x=e.left,e.y=e.top,e}(e):nt(function(t){var e,n=f(t),r=o(t),i=null==(e=t.ownerDocument)?void 0:e.body,a=V(n.scrollWidth,n.clientWidth,i?i.scrollWidth:0,i?i.clientWidth:0),u=V(n.scrollHeight,n.clientHeight,i?i.scrollHeight:0,i?i.clientHeight:0),c=-r.scrollLeft+l(t),s=-r.scrollTop +return"rtl"===h(i||n).direction&&(c+=V(n.clientWidth,i?i.clientWidth:0)-a),{width:a,height:u,x:c,y:s}}(f(t)))}function it(t){return Object.assign({},{top:0,right:0,bottom:0,left:0},t)}function ot(t,e){return e.reduce((function(e,n){return e[n]=t,e}),{})}function at(t,e){void 0===e&&(e={}) +var n=e,i=n.placement,o=void 0===i?t.placement:i,c=n.boundary,l=void 0===c?"clippingParents":c,d=n.rootBoundary,p=void 0===d?M:d,y=n.elementContext,v=void 0===y?F:y,m=n.altBoundary,_=void 0!==m&&m,k=n.padding,D=void 0===k?0:k,O=it("number"!=typeof D?D:ot(D,C)),S=v===F?"reference":F,T=t.elements.reference,B=t.rects.popper,P=t.elements[_?S:v],j=function(t,e,n){var r="clippingParents"===e?function(t){var e=g(b(t)),n=["absolute","fixed"].indexOf(h(t).position)>=0&&u(t)?w(t):t +return a(n)?e.filter((function(t){return a(t)&&et(t,n)&&"body"!==s(t)})):[]}(t):[].concat(e),i=[].concat(r,[n]),o=i[0],c=i.reduce((function(e,n){var r=rt(t,n) +return e.top=V(r.top,e.top),e.right=H(r.right,e.right),e.bottom=H(r.bottom,e.bottom),e.left=V(r.left,e.left),e}),rt(t,o)) +return c.width=c.right-c.left,c.height=c.bottom-c.top,c.x=c.left,c.y=c.top,c}(a(P)?P:P.contextElement||f(t.elements.popper),l,p),N=r(T),R=Z({reference:N,element:B,strategy:"absolute",placement:o}),L=nt(Object.assign({},B,R)),I=v===F?L:N,$={top:j.top-I.top+O.top,bottom:I.bottom-j.bottom+O.bottom,left:j.left-I.left+O.left,right:I.right-j.right+O.right},U=t.modifiersData.offset +if(v===F&&U){var z=U[o] +Object.keys($).forEach((function(t){var e=[E,A].indexOf(t)>=0?1:-1,n=[x,A].indexOf(t)>=0?"y":"x" +$[t]+=z[n]*e}))}return $}function ut(t,e,n){return V(t,H(e,n))}function ct(t,e,n){return void 0===n&&(n={x:0,y:0}),{top:t.top-e.height-n.y,right:t.right-e.width+n.x,bottom:t.bottom-e.height+n.y,left:t.left-e.width-n.x}}function st(t){return[x,E,A,k].some((function(e){return t[e]>=0}))}var ft=function(t){void 0===t&&(t={}) +var e=t,n=e.defaultModifiers,r=void 0===n?[]:n,i=e.defaultOptions,o=void 0===i?N:i +return function(t,e,n){void 0===n&&(n=o) +var i,u,c={placement:"bottom",orderedModifiers:[],options:Object.assign({},N,o),modifiersData:{},elements:{reference:t,popper:e},attributes:{},styles:{}},s=[],f=!1,l={state:c,setOptions:function(n){h(),c.options=Object.assign({},o,c.options,n),c.scrollParents={reference:a(t)?g(t):t.contextElement?g(t.contextElement):[],popper:g(e)} +var i,u,f=function(t){var e=j(t) +return P.reduce((function(t,n){return t.concat(e.filter((function(t){return t.phase===n})))}),[])}((i=[].concat(r,c.options.modifiers),u=i.reduce((function(t,e){var n=t[e.name] +return t[e.name]=n?Object.assign({},n,e,{options:Object.assign({},n.options,e.options),data:Object.assign({},n.data,e.data)}):e,t}),{}),Object.keys(u).map((function(t){return u[t]})))) +return c.orderedModifiers=f.filter((function(t){return t.enabled})),c.orderedModifiers.forEach((function(t){var e=t.name,n=t.options,r=void 0===n?{}:n,i=t.effect +if("function"==typeof i){var o=i({state:c,name:e,instance:l,options:r}) +s.push(o||function(){})}})),l.update()},forceUpdate:function(){if(!f){var t=c.elements,e=t.reference,n=t.popper +if(R(e,n)){c.rects={reference:p(e,w(n),"fixed"===c.options.strategy),popper:y(n)},c.reset=!1,c.placement=c.options.placement,c.orderedModifiers.forEach((function(t){return c.modifiersData[t.name]=Object.assign({},t.data)})) +for(var r=0;r=0?-1:1,o="function"==typeof n?n(Object.assign({},e,{placement:t})):n,a=o[0],u=o[1] +return a=a||0,u=(u||0)*i,[k,E].indexOf(r)>=0?{x:u,y:a}:{x:a,y:u}}(n,e.rects,o),t}),{}),u=a[e.placement],c=u.x,s=u.y +null!=e.modifiersData.popperOffsets&&(e.modifiersData.popperOffsets.x+=c,e.modifiersData.popperOffsets.y+=s),e.modifiersData[r]=a}},{name:"flip",enabled:!0,phase:"main",fn:function(t){var e=t.state,n=t.options,r=t.name +if(!e.modifiersData[r]._skip){for(var i=n.mainAxis,o=void 0===i||i,a=n.altAxis,u=void 0===a||a,c=n.fallbackPlacements,s=n.padding,f=n.boundary,l=n.rootBoundary,h=n.altBoundary,d=n.flipVariations,p=void 0===d||d,y=n.allowedAutoPlacements,b=e.options.placement,v=$(b),g=c||(v!==b&&p?function(t){if($(t)===D)return[] +var e=J(t) +return[tt(t),e,tt(e)]}(b):[J(b)]),m=[b].concat(g).reduce((function(t,n){return t.concat($(n)===D?function(t,e){void 0===e&&(e={}) +var n=e,r=n.placement,i=n.boundary,o=n.rootBoundary,a=n.padding,u=n.flipVariations,c=n.allowedAutoPlacements,s=void 0===c?B:c,f=U(r),l=f?u?T:T.filter((function(t){return U(t)===f})):C,h=l.filter((function(t){return s.indexOf(t)>=0})) +0===h.length&&(h=l) +var d=h.reduce((function(e,n){return e[n]=at(t,{placement:n,boundary:i,rootBoundary:o,padding:a})[$(n)],e}),{}) +return Object.keys(d).sort((function(t,e){return d[t]-d[e]}))}(e,{placement:n,boundary:f,rootBoundary:l,padding:s,flipVariations:p,allowedAutoPlacements:y}):n)}),[]),_=e.rects.reference,w=e.rects.popper,S=new Map,M=!0,F=m[0],P=0;P=0,I=L?"width":"height",z=at(e,{placement:j,boundary:f,rootBoundary:l,altBoundary:h,padding:s}),Z=L?R?E:k:R?A:x +_[I]>w[I]&&(Z=J(Z)) +var q=J(Z),V=[] +if(o&&V.push(z[N]<=0),u&&V.push(z[Z]<=0,z[q]<=0),V.every((function(t){return t}))){F=j,M=!1 +break}S.set(j,V)}if(M)for(var H=function(t){var e=m.find((function(e){var n=S.get(e) +if(n)return n.slice(0,t).every((function(t){return t}))})) +if(e)return F=e,"break"},Y=p?3:1;Y>0&&"break"!==H(Y);Y--);e.placement!==F&&(e.modifiersData[r]._skip=!0,e.placement=F,e.reset=!0)}},requiresIfExists:["offset"],data:{_skip:!1}},{name:"preventOverflow",enabled:!0,phase:"main",fn:function(t){var e=t.state,n=t.options,r=t.name,i=n.mainAxis,o=void 0===i||i,a=n.altAxis,u=void 0!==a&&a,c=n.boundary,s=n.rootBoundary,f=n.altBoundary,l=n.padding,h=n.tether,d=void 0===h||h,p=n.tetherOffset,b=void 0===p?0:p,v=at(e,{boundary:c,rootBoundary:s,padding:l,altBoundary:f}),g=$(e.placement),m=U(e.placement),_=!m,D=z(g),C="x"===D?"y":"x",S=e.modifiersData.popperOffsets,M=e.rects.reference,F=e.rects.popper,T="function"==typeof b?b(Object.assign({},e.rects,{placement:e.placement})):b,B={x:0,y:0} +if(S){if(o||u){var P="y"===D?x:k,j="y"===D?A:E,N="y"===D?"height":"width",R=S[D],L=S[D]+v[P],I=S[D]-v[j],Z=d?-F[N]/2:0,q=m===O?M[N]:F[N],Y=m===O?-F[N]:-M[N],G=e.elements.arrow,K=d&&G?y(G):{width:0,height:0},W=e.modifiersData["arrow#persistent"]?e.modifiersData["arrow#persistent"].padding:{top:0,right:0,bottom:0,left:0},X=W[P],J=W[j],Q=ut(0,M[N],K[N]),tt=_?M[N]/2-Z-Q-X-T:q-Q-X-T,et=_?-M[N]/2+Z+Q+J+T:Y+Q+J+T,nt=e.elements.arrow&&w(e.elements.arrow),rt=nt?"y"===D?nt.clientTop||0:nt.clientLeft||0:0,it=e.modifiersData.offset?e.modifiersData.offset[e.placement][D]:0,ot=S[D]+tt-it-rt,ct=S[D]+et-it +if(o){var st=ut(d?H(L,ot):L,R,d?V(I,ct):I) +S[D]=st,B[D]=st-R}if(u){var ft="x"===D?x:k,lt="x"===D?A:E,ht=S[C],dt=ht+v[ft],pt=ht-v[lt],yt=ut(d?H(dt,ot):dt,ht,d?V(pt,ct):pt) +S[C]=yt,B[C]=yt-ht}}e.modifiersData[r]=B}},requiresIfExists:["offset"]},{name:"arrow",enabled:!0,phase:"main",fn:function(t){var e,n=t.state,r=t.name,i=t.options,o=n.elements.arrow,a=n.modifiersData.popperOffsets,u=$(n.placement),c=z(u),s=[k,E].indexOf(u)>=0?"height":"width" +if(o&&a){var f=function(t,e){return it("number"!=typeof(t="function"==typeof t?t(Object.assign({},e.rects,{placement:e.placement})):t)?t:ot(t,C))}(i.padding,n),l=y(o),h="y"===c?x:k,d="y"===c?A:E,p=n.rects.reference[s]+n.rects.reference[c]-a[c]-n.rects.popper[s],b=a[c]-n.rects.reference[c],v=w(o),g=v?"y"===c?v.clientHeight||0:v.clientWidth||0:0,m=p/2-b/2,_=f[h],D=g-l[s]-f[d],O=g/2-l[s]/2+m,S=ut(_,O,D),M=c +n.modifiersData[r]=((e={})[M]=S,e.centerOffset=S-O,e)}},effect:function(t){var e=t.state,n=t.options.element,r=void 0===n?"[data-popper-arrow]":n +null!=r&&("string"!=typeof r||(r=e.elements.popper.querySelector(r)))&&et(e.elements.popper,r)&&(e.elements.arrow=r)},requires:["popperOffsets"],requiresIfExists:["preventOverflow"]},{name:"hide",enabled:!0,phase:"main",requiresIfExists:["preventOverflow"],fn:function(t){var e=t.state,n=t.name,r=e.rects.reference,i=e.rects.popper,o=e.modifiersData.preventOverflow,a=at(e,{elementContext:"reference"}),u=at(e,{altBoundary:!0}),c=ct(a,r),s=ct(u,i,o),f=st(c),l=st(s) +e.modifiersData[n]={referenceClippingOffsets:c,popperEscapeOffsets:s,isReferenceHidden:f,hasPopperEscaped:l},e.attributes.popper=Object.assign({},e.attributes.popper,{"data-popper-reference-hidden":f,"data-popper-escaped":l})}}]}),lt='',ht="tippy-content",dt="tippy-backdrop",pt="tippy-arrow",yt="tippy-svg-arrow",bt={passive:!0,capture:!0} +function vt(t,e,n){if(Array.isArray(t)){var r=t[e] +return null==r?Array.isArray(n)?n[e]:n:r}return t}function gt(t,e){var n={}.toString.call(t) +return 0===n.indexOf("[object")&&n.indexOf(e+"]")>-1}function mt(t,e){return"function"==typeof t?t.apply(void 0,e):t}function _t(t,e){return 0===e?t:function(r){clearTimeout(n),n=setTimeout((function(){t(r)}),e)} +var n}function wt(t,e){var n=Object.assign({},t) +return e.forEach((function(t){delete n[t]})),n}function xt(t){return[].concat(t)}function At(t,e){-1===t.indexOf(e)&&t.push(e)}function Et(t){return t.split("-")[0]}function kt(t){return[].slice.call(t)}function Dt(){return document.createElement("div")}function Ct(t){return["Element","Fragment"].some((function(e){return gt(t,e)}))}function Ot(t){return gt(t,"MouseEvent")}function St(t){return!(!t||!t._tippy||t._tippy.reference!==t)}function Mt(t,e){t.forEach((function(t){t&&(t.style.transitionDuration=e+"ms")}))}function Ft(t,e){t.forEach((function(t){t&&t.setAttribute("data-state",e)}))}function Tt(t){var e,n=xt(t)[0] +return(null==n||null==(e=n.ownerDocument)?void 0:e.body)?n.ownerDocument:document}function Bt(t,e,n){var r=e+"EventListener";["transitionend","webkitTransitionEnd"].forEach((function(e){t[r](e,n)}))}var Pt={isTouch:!1},jt=0 +function Nt(){Pt.isTouch||(Pt.isTouch=!0,window.performance&&document.addEventListener("mousemove",Rt))}function Rt(){var t=performance.now() +t-jt<20&&(Pt.isTouch=!1,document.removeEventListener("mousemove",Rt)),jt=t}function Lt(){var t=document.activeElement +if(St(t)){var e=t._tippy +t.blur&&!e.state.isVisible&&t.blur()}}var It="undefined"!=typeof window&&"undefined"!=typeof document?navigator.userAgent:"",$t=/MSIE |Trident\//.test(It),Ut=Object.assign({appendTo:function(){return document.body},aria:{content:"auto",expanded:"auto"},delay:0,duration:[300,250],getReferenceClientRect:null,hideOnClick:!0,ignoreAttributes:!1,interactive:!1,interactiveBorder:2,interactiveDebounce:0,moveTransition:"",offset:[0,10],onAfterUpdate:function(){},onBeforeUpdate:function(){},onCreate:function(){},onDestroy:function(){},onHidden:function(){},onHide:function(){},onMount:function(){},onShow:function(){},onShown:function(){},onTrigger:function(){},onUntrigger:function(){},onClickOutside:function(){},placement:"top",plugins:[],popperOptions:{},render:null,showOnCreate:!1,touch:!0,trigger:"mouseenter focus",triggerTarget:null},{animateFill:!1,followCursor:!1,inlinePositioning:!1,sticky:!1},{},{allowHTML:!1,animation:"fade",arrow:!0,content:"",inertia:!1,maxWidth:350,role:"tooltip",theme:"",zIndex:9999}),zt=Object.keys(Ut) +function Zt(t){var e=(t.plugins||[]).reduce((function(e,n){var r=n.name,i=n.defaultValue +return r&&(e[r]=void 0!==t[r]?t[r]:i),e}),{}) +return Object.assign({},t,{},e)}function qt(t,e){var n=Object.assign({},e,{content:mt(e.content,[t])},e.ignoreAttributes?{}:function(t,e){return(e?Object.keys(Zt(Object.assign({},Ut,{plugins:e}))):zt).reduce((function(e,n){var r=(t.getAttribute("data-tippy-"+n)||"").trim() +if(!r)return e +if("content"===n)e[n]=r +else try{e[n]=JSON.parse(r)}catch(t){e[n]=r}return e}),{})}(t,e.plugins)) +return n.aria=Object.assign({},Ut.aria,{},n.aria),n.aria={expanded:"auto"===n.aria.expanded?e.interactive:n.aria.expanded,content:"auto"===n.aria.content?e.interactive?null:"describedby":n.aria.content},n}function Vt(t,e){t.innerHTML=e}function Ht(t){var e=Dt() +return!0===t?e.className=pt:(e.className=yt,Ct(t)?e.appendChild(t):Vt(e,t)),e}function Yt(t,e){Ct(e.content)?(Vt(t,""),t.appendChild(e.content)):"function"!=typeof e.content&&(e.allowHTML?Vt(t,e.content):t.textContent=e.content)}function Gt(t){var e=t.firstElementChild,n=kt(e.children) +return{box:e,content:n.find((function(t){return t.classList.contains(ht)})),arrow:n.find((function(t){return t.classList.contains(pt)||t.classList.contains(yt)})),backdrop:n.find((function(t){return t.classList.contains(dt)}))}}function Kt(t){var e=Dt(),n=Dt() +n.className="tippy-box",n.setAttribute("data-state","hidden"),n.setAttribute("tabindex","-1") +var r=Dt() +function i(n,r){var i=Gt(e),o=i.box,a=i.content,u=i.arrow +r.theme?o.setAttribute("data-theme",r.theme):o.removeAttribute("data-theme"),"string"==typeof r.animation?o.setAttribute("data-animation",r.animation):o.removeAttribute("data-animation"),r.inertia?o.setAttribute("data-inertia",""):o.removeAttribute("data-inertia"),o.style.maxWidth="number"==typeof r.maxWidth?r.maxWidth+"px":r.maxWidth,r.role?o.setAttribute("role",r.role):o.removeAttribute("role"),n.content===r.content&&n.allowHTML===r.allowHTML||Yt(a,t.props),r.arrow?u?n.arrow!==r.arrow&&(o.removeChild(u),o.appendChild(Ht(r.arrow))):o.appendChild(Ht(r.arrow)):u&&o.removeChild(u)}return r.className=ht,r.setAttribute("data-state","hidden"),Yt(r,t.props),e.appendChild(n),n.appendChild(r),i(t.props,t.props),{popper:e,onUpdate:i}}Kt.$$tippy=!0 +var Wt=1,Xt=[],Jt=[] +function Qt(t,e){void 0===e&&(e={}) +var n=Ut.plugins.concat(e.plugins||[]) +document.addEventListener("touchstart",Nt,bt),window.addEventListener("blur",Lt) +var r,i=Object.assign({},e,{plugins:n}),o=(r=t,Ct(r)?[r]:function(t){return gt(t,"NodeList")}(r)?kt(r):Array.isArray(r)?r:kt(document.querySelectorAll(r))).reduce((function(t,e){var n=e&&function(t,e){var n,r,i,o,a,u,c,s,f,l=qt(t,Object.assign({},Ut,{},Zt((n=e,Object.keys(n).reduce((function(t,e){return void 0!==n[e]&&(t[e]=n[e]),t}),{}))))),h=!1,d=!1,p=!1,y=!1,b=[],v=_t(G,l.interactiveDebounce),g=Wt++,m=(f=l.plugins).filter((function(t,e){return f.indexOf(t)===e})),_={id:g,reference:t,popper:Dt(),popperInstance:null,props:l,state:{isEnabled:!0,isVisible:!1,isDestroyed:!1,isMounted:!1,isShown:!1},plugins:m,clearDelayTimeouts:function(){clearTimeout(r),clearTimeout(i),cancelAnimationFrame(o)},setProps:function(e){if(!_.state.isDestroyed){P("onBeforeUpdate",[_,e]),H() +var n=_.props,r=qt(t,Object.assign({},_.props,{},e,{ignoreAttributes:!0})) +_.props=r,V(),n.interactiveDebounce!==r.interactiveDebounce&&(R(),v=_t(G,r.interactiveDebounce)),n.triggerTarget&&!r.triggerTarget?xt(n.triggerTarget).forEach((function(t){t.removeAttribute("aria-expanded")})):r.triggerTarget&&t.removeAttribute("aria-expanded"),N(),B(),A&&A(n,r),_.popperInstance&&(J(),tt().forEach((function(t){requestAnimationFrame(t._tippy.popperInstance.forceUpdate)}))),P("onAfterUpdate",[_,e])}},setContent:function(t){_.setProps({content:t})},show:function(){var t=_.state.isVisible,e=_.state.isDestroyed,n=!_.state.isEnabled,r=Pt.isTouch&&!_.props.touch,i=vt(_.props.duration,0,Ut.duration) +if(!(t||e||n||r||S().hasAttribute("disabled")||(P("onShow",[_],!1),!1===_.props.onShow(_)))){if(_.state.isVisible=!0,O()&&(x.style.visibility="visible"),B(),U(),_.state.isMounted||(x.style.transition="none"),O()){var o=F() +Mt([o.box,o.content],0)}var a,u,s +c=function(){var t +if(_.state.isVisible&&!y){if(y=!0,x.offsetHeight,x.style.transition=_.props.moveTransition,O()&&_.props.animation){var e=F(),n=e.box,r=e.content +Mt([n,r],i),Ft([n,r],"visible")}j(),N(),At(Jt,_),null==(t=_.popperInstance)||t.forceUpdate(),_.state.isMounted=!0,P("onMount",[_]),_.props.animation&&O()&&function(t,e){Z(t,(function(){_.state.isShown=!0,P("onShown",[_])}))}(i)}},u=_.props.appendTo,s=S(),(a=_.props.interactive&&u===Ut.appendTo||"parent"===u?s.parentNode:mt(u,[s])).contains(x)||a.appendChild(x),J()}},hide:function(){var t=!_.state.isVisible,e=_.state.isDestroyed,n=!_.state.isEnabled,r=vt(_.props.duration,1,Ut.duration) +if(!(t||e||n)&&(P("onHide",[_],!1),!1!==_.props.onHide(_))){if(_.state.isVisible=!1,_.state.isShown=!1,y=!1,h=!1,O()&&(x.style.visibility="hidden"),R(),z(),B(),O()){var i=F(),o=i.box,a=i.content +_.props.animation&&(Mt([o,a],r),Ft([o,a],"hidden"))}j(),N(),_.props.animation?O()&&function(t,e){Z(t,(function(){!_.state.isVisible&&x.parentNode&&x.parentNode.contains(x)&&e()}))}(r,_.unmount):_.unmount()}},hideWithInteractivity:function(t){M().addEventListener("mousemove",v),At(Xt,v),v(t)},enable:function(){_.state.isEnabled=!0},disable:function(){_.hide(),_.state.isEnabled=!1},unmount:function(){_.state.isVisible&&_.hide(),_.state.isMounted&&(Q(),tt().forEach((function(t){t._tippy.unmount()})),x.parentNode&&x.parentNode.removeChild(x),Jt=Jt.filter((function(t){return t!==_})),_.state.isMounted=!1,P("onHidden",[_]))},destroy:function(){_.state.isDestroyed||(_.clearDelayTimeouts(),_.unmount(),H(),delete t._tippy,_.state.isDestroyed=!0,P("onDestroy",[_]))}} +if(!l.render)return _ +var w=l.render(_),x=w.popper,A=w.onUpdate +x.setAttribute("data-tippy-root",""),x.id="tippy-"+_.id,_.popper=x,t._tippy=_,x._tippy=_ +var E=m.map((function(t){return t.fn(_)})),k=t.hasAttribute("aria-expanded") +return V(),N(),B(),P("onCreate",[_]),l.showOnCreate&&et(),x.addEventListener("mouseenter",(function(){_.props.interactive&&_.state.isVisible&&_.clearDelayTimeouts()})),x.addEventListener("mouseleave",(function(t){_.props.interactive&&_.props.trigger.indexOf("mouseenter")>=0&&(M().addEventListener("mousemove",v),v(t))})),_ +function D(){var t=_.props.touch +return Array.isArray(t)?t:[t,0]}function C(){return"hold"===D()[0]}function O(){var t +return!!(null==(t=_.props.render)?void 0:t.$$tippy)}function S(){return s||t}function M(){var t=S().parentNode +return t?Tt(t):document}function F(){return Gt(x)}function T(t){return _.state.isMounted&&!_.state.isVisible||Pt.isTouch||a&&"focus"===a.type?0:vt(_.props.delay,t?0:1,Ut.delay)}function B(){x.style.pointerEvents=_.props.interactive&&_.state.isVisible?"":"none",x.style.zIndex=""+_.props.zIndex}function P(t,e,n){var r +void 0===n&&(n=!0),E.forEach((function(n){n[t]&&n[t].apply(void 0,e)})),n&&(r=_.props)[t].apply(r,e)}function j(){var e=_.props.aria +if(e.content){var n="aria-"+e.content,r=x.id +xt(_.props.triggerTarget||t).forEach((function(t){var e=t.getAttribute(n) +if(_.state.isVisible)t.setAttribute(n,e?e+" "+r:r) +else{var i=e&&e.replace(r,"").trim() +i?t.setAttribute(n,i):t.removeAttribute(n)}}))}}function N(){!k&&_.props.aria.expanded&&xt(_.props.triggerTarget||t).forEach((function(t){_.props.interactive?t.setAttribute("aria-expanded",_.state.isVisible&&t===S()?"true":"false"):t.removeAttribute("aria-expanded")}))}function R(){M().removeEventListener("mousemove",v),Xt=Xt.filter((function(t){return t!==v}))}function L(t){if(!(Pt.isTouch&&(p||"mousedown"===t.type)||_.props.interactive&&x.contains(t.target))){if(S().contains(t.target)){if(Pt.isTouch)return +if(_.state.isVisible&&_.props.trigger.indexOf("click")>=0)return}else P("onClickOutside",[_,t]) +!0===_.props.hideOnClick&&(_.clearDelayTimeouts(),_.hide(),d=!0,setTimeout((function(){d=!1})),_.state.isMounted||z())}}function I(){p=!0}function $(){p=!1}function U(){var t=M() +t.addEventListener("mousedown",L,!0),t.addEventListener("touchend",L,bt),t.addEventListener("touchstart",$,bt),t.addEventListener("touchmove",I,bt)}function z(){var t=M() +t.removeEventListener("mousedown",L,!0),t.removeEventListener("touchend",L,bt),t.removeEventListener("touchstart",$,bt),t.removeEventListener("touchmove",I,bt)}function Z(t,e){var n=F().box +function r(t){t.target===n&&(Bt(n,"remove",r),e())}if(0===t)return e() +Bt(n,"remove",u),Bt(n,"add",r),u=r}function q(e,n,r){void 0===r&&(r=!1),xt(_.props.triggerTarget||t).forEach((function(t){t.addEventListener(e,n,r),b.push({node:t,eventType:e,handler:n,options:r})}))}function V(){var t +C()&&(q("touchstart",Y,{passive:!0}),q("touchend",K,{passive:!0})),(t=_.props.trigger,t.split(/\s+/).filter(Boolean)).forEach((function(t){if("manual"!==t)switch(q(t,Y),t){case"mouseenter":q("mouseleave",K) +break +case"focus":q($t?"focusout":"blur",W) +break +case"focusin":q("focusout",W)}}))}function H(){b.forEach((function(t){var e=t.node,n=t.eventType,r=t.handler,i=t.options +e.removeEventListener(n,r,i)})),b=[]}function Y(t){var e,n=!1 +if(_.state.isEnabled&&!X(t)&&!d){var r="focus"===(null==(e=a)?void 0:e.type) +a=t,s=t.currentTarget,N(),!_.state.isVisible&&Ot(t)&&Xt.forEach((function(e){return e(t)})),"click"===t.type&&(_.props.trigger.indexOf("mouseenter")<0||h)&&!1!==_.props.hideOnClick&&_.state.isVisible?n=!0:et(t),"click"===t.type&&(h=!n),n&&!r&&nt(t)}}function G(t){var e=t.target,n=S().contains(e)||x.contains(e) +if("mousemove"!==t.type||!n){var r=tt().concat(x).map((function(t){var e,n=null==(e=t._tippy.popperInstance)?void 0:e.state +return n?{popperRect:t.getBoundingClientRect(),popperState:n,props:l}:null})).filter(Boolean);(function(t,e){var n=e.clientX,r=e.clientY +return t.every((function(t){var e=t.popperRect,i=t.popperState,o=t.props.interactiveBorder,a=Et(i.placement),u=i.modifiersData.offset +if(!u)return!0 +var c="bottom"===a?u.top.y:0,s="top"===a?u.bottom.y:0,f="right"===a?u.left.x:0,l="left"===a?u.right.x:0,h=e.top-r+c>o,d=r-e.bottom-s>o,p=e.left-n+f>o,y=n-e.right-l>o +return h||d||p||y}))})(r,t)&&(R(),nt(t))}}function K(t){X(t)||_.props.trigger.indexOf("click")>=0&&h||(_.props.interactive?_.hideWithInteractivity(t):nt(t))}function W(t){_.props.trigger.indexOf("focusin")<0&&t.target!==S()||_.props.interactive&&t.relatedTarget&&x.contains(t.relatedTarget)||nt(t)}function X(t){return!!Pt.isTouch&&C()!==t.type.indexOf("touch")>=0}function J(){Q() +var e=_.props,n=e.popperOptions,r=e.placement,i=e.offset,o=e.getReferenceClientRect,a=e.moveTransition,u=O()?Gt(x).arrow:null,s=o?{getBoundingClientRect:o,contextElement:o.contextElement||S()}:t,f=[{name:"offset",options:{offset:i}},{name:"preventOverflow",options:{padding:{top:2,bottom:2,left:5,right:5}}},{name:"flip",options:{padding:5}},{name:"computeStyles",options:{adaptive:!a}},{name:"$$tippy",enabled:!0,phase:"beforeWrite",requires:["computeStyles"],fn:function(t){var e=t.state +if(O()){var n=F().box;["placement","reference-hidden","escaped"].forEach((function(t){"placement"===t?n.setAttribute("data-placement",e.placement):e.attributes.popper["data-popper-"+t]?n.setAttribute("data-"+t,""):n.removeAttribute("data-"+t)})),e.attributes.popper={}}}}] +O()&&u&&f.push({name:"arrow",options:{element:u,padding:3}}),f.push.apply(f,(null==n?void 0:n.modifiers)||[]),_.popperInstance=ft(s,x,Object.assign({},n,{placement:r,onFirstUpdate:c,modifiers:f}))}function Q(){_.popperInstance&&(_.popperInstance.destroy(),_.popperInstance=null)}function tt(){return kt(x.querySelectorAll("[data-tippy-root]"))}function et(t){_.clearDelayTimeouts(),t&&P("onTrigger",[_,t]),U() +var e=T(!0),n=D(),i=n[0],o=n[1] +Pt.isTouch&&"hold"===i&&o&&(e=o),e?r=setTimeout((function(){_.show()}),e):_.show()}function nt(t){if(_.clearDelayTimeouts(),P("onUntrigger",[_,t]),_.state.isVisible){if(!(_.props.trigger.indexOf("mouseenter")>=0&&_.props.trigger.indexOf("click")>=0&&["mouseleave","mousemove"].indexOf(t.type)>=0&&h)){var e=T(!1) +e?i=setTimeout((function(){_.state.isVisible&&_.hide()}),e):o=requestAnimationFrame((function(){_.hide()}))}}else z()}}(e,i) +return n&&t.push(n),t}),[]) +return Ct(t)?o[0]:o}Qt.defaultProps=Ut,Qt.setDefaultProps=function(t){Object.keys(t).forEach((function(e){Ut[e]=t[e]}))},Qt.currentInput=Pt +var te=function(t){var e=void 0===t?{}:t,n=e.exclude,r=e.duration +Jt.forEach((function(t){var e=!1 +if(n&&(e=St(n)?t.reference===n:t.popper===n.popper),!e){var i=t.props.duration +t.setProps({duration:r}),t.hide(),t.state.isDestroyed||t.setProps({duration:i})}}))},ee=Object.assign({},W,{effect:function(t){var e=t.state,n={popper:{position:e.options.strategy,left:"0",top:"0",margin:"0"},arrow:{position:"absolute"},reference:{}} +Object.assign(e.elements.popper.style,n.popper),e.styles=n,e.elements.arrow&&Object.assign(e.elements.arrow.style,n.arrow)}}),ne=function(t,e){var n +void 0===e&&(e={}) +var r,i=t,o=[],a=e.overrides,u=[],c=!1 +function s(){o=i.map((function(t){return t.reference}))}function f(t){i.forEach((function(e){t?e.enable():e.disable()}))}function l(t){return i.map((function(e){var n=e.setProps +return e.setProps=function(i){n(i),e.reference===r&&t.setProps(i)},function(){e.setProps=n}}))}function h(t,e){var n=o.indexOf(e) +if(e!==r){r=e +var u=(a||[]).concat("content").reduce((function(t,e){return t[e]=i[n].props[e],t}),{}) +t.setProps(Object.assign({},u,{getReferenceClientRect:"function"==typeof u.getReferenceClientRect?u.getReferenceClientRect:function(){return e.getBoundingClientRect()}}))}}f(!1),s() +var d={fn:function(){return{onDestroy:function(){f(!0)},onHidden:function(){r=null},onClickOutside:function(t){t.props.showOnCreate&&!c&&(c=!0,r=null)},onShow:function(t){t.props.showOnCreate&&!c&&(c=!0,h(t,o[0]))},onTrigger:function(t,e){h(t,e.currentTarget)}}}},p=Qt(Dt(),Object.assign({},wt(e,["overrides"]),{plugins:[d].concat(e.plugins||[]),triggerTarget:o,popperOptions:Object.assign({},e.popperOptions,{modifiers:[].concat((null==(n=e.popperOptions)?void 0:n.modifiers)||[],[ee])})})),y=p.show +p.show=function(t){if(y(),!r&&null==t)return h(p,o[0]) +if(!r||null!=t){if("number"==typeof t)return o[t]&&h(p,o[t]) +if(i.includes(t)){var e=t.reference +return h(p,e)}return o.includes(t)?h(p,t):void 0}},p.showNext=function(){var t=o[0] +if(!r)return p.show(0) +var e=o.indexOf(r) +p.show(o[e+1]||t)},p.showPrevious=function(){var t=o[o.length-1] +if(!r)return p.show(t) +var e=o.indexOf(r),n=o[e-1]||t +p.show(n)} +var b=p.setProps +return p.setProps=function(t){a=t.overrides||a,b(t)},p.setInstances=function(t){f(!0),u.forEach((function(t){return t()})),i=t,f(!1),s(),l(p),p.setProps({triggerTarget:o})},u=l(p),p},re={mouseover:"mouseenter",focusin:"focus",click:"click"} +function ie(t,e){var n=[],r=[],i=!1,o=e.target,a=wt(e,["target"]),u=Object.assign({},a,{trigger:"manual",touch:!1}),c=Object.assign({},a,{showOnCreate:!0}),s=Qt(t,u) +function f(t){if(t.target&&!i){var n=t.target.closest(o) +if(n){var a=n.getAttribute("data-tippy-trigger")||e.trigger||Ut.trigger +if(!n._tippy&&!("touchstart"===t.type&&"boolean"==typeof c.touch||"touchstart"!==t.type&&a.indexOf(re[t.type])<0)){var u=Qt(n,c) +u&&(r=r.concat(u))}}}}function l(t,e,r,i){void 0===i&&(i=!1),t.addEventListener(e,r,i),n.push({node:t,eventType:e,handler:r,options:i})}return xt(s).forEach((function(t){var e=t.destroy,o=t.enable,a=t.disable +t.destroy=function(t){void 0===t&&(t=!0),t&&r.forEach((function(t){t.destroy()})),r=[],n.forEach((function(t){var e=t.node,n=t.eventType,r=t.handler,i=t.options +e.removeEventListener(n,r,i)})),n=[],e()},t.enable=function(){o(),r.forEach((function(t){return t.enable()})),i=!1},t.disable=function(){a(),r.forEach((function(t){return t.disable()})),i=!0},function(t){var e=t.reference +l(e,"touchstart",f,bt),l(e,"mouseover",f),l(e,"focusin",f),l(e,"click",f)}(t)})),s}var oe={name:"animateFill",defaultValue:!1,fn:function(t){var e +if(!(null==(e=t.props.render)?void 0:e.$$tippy))return{} +var n=Gt(t.popper),r=n.box,i=n.content,o=t.props.animateFill?function(){var t=Dt() +return t.className=dt,Ft([t],"hidden"),t}():null +return{onCreate:function(){o&&(r.insertBefore(o,r.firstElementChild),r.setAttribute("data-animatefill",""),r.style.overflow="hidden",t.setProps({arrow:!1,animation:"shift-away"}))},onMount:function(){if(o){var t=r.style.transitionDuration,e=Number(t.replace("ms","")) +i.style.transitionDelay=Math.round(e/10)+"ms",o.style.transitionDuration=t,Ft([o],"visible")}},onShow:function(){o&&(o.style.transitionDuration="0ms")},onHide:function(){o&&Ft([o],"hidden")}}}},ae={clientX:0,clientY:0},ue=[] +function ce(t){var e=t.clientX,n=t.clientY +ae={clientX:e,clientY:n}}var se={name:"followCursor",defaultValue:!1,fn:function(t){var e=t.reference,n=Tt(t.props.triggerTarget||e),r=!1,i=!1,o=!0,a=t.props +function u(){return"initial"===t.props.followCursor&&t.state.isVisible}function c(){n.addEventListener("mousemove",l)}function s(){n.removeEventListener("mousemove",l)}function f(){r=!0,t.setProps({getReferenceClientRect:null}),r=!1}function l(n){var r=!n.target||e.contains(n.target),i=t.props.followCursor,o=n.clientX,a=n.clientY,u=e.getBoundingClientRect(),c=o-u.left,s=a-u.top +!r&&t.props.interactive||t.setProps({getReferenceClientRect:function(){var t=e.getBoundingClientRect(),n=o,r=a +"initial"===i&&(n=t.left+c,r=t.top+s) +var u="horizontal"===i?t.top:r,f="vertical"===i?t.right:n,l="horizontal"===i?t.bottom:r,h="vertical"===i?t.left:n +return{width:f-h,height:l-u,top:u,right:f,bottom:l,left:h}}})}function h(){t.props.followCursor&&(ue.push({instance:t,doc:n}),function(t){t.addEventListener("mousemove",ce)}(n))}function d(){0===(ue=ue.filter((function(e){return e.instance!==t}))).filter((function(t){return t.doc===n})).length&&function(t){t.removeEventListener("mousemove",ce)}(n)}return{onCreate:h,onDestroy:d,onBeforeUpdate:function(){a=t.props},onAfterUpdate:function(e,n){var o=n.followCursor +r||void 0!==o&&a.followCursor!==o&&(d(),o?(h(),!t.state.isMounted||i||u()||c()):(s(),f()))},onMount:function(){t.props.followCursor&&!i&&(o&&(l(ae),o=!1),u()||c())},onTrigger:function(t,e){Ot(e)&&(ae={clientX:e.clientX,clientY:e.clientY}),i="focus"===e.type},onHidden:function(){t.props.followCursor&&(f(),s(),o=!0)}}}},fe={name:"inlinePositioning",defaultValue:!1,fn:function(t){var e,n=t.reference,r=-1,i=!1,o={name:"tippyInlinePositioning",enabled:!0,phase:"afterWrite",fn:function(i){var o=i.state +t.props.inlinePositioning&&(e!==o.placement&&t.setProps({getReferenceClientRect:function(){return function(t){return function(t,e,n,r){if(n.length<2||null===t)return e +if(2===n.length&&r>=0&&n[0].left>n[1].right)return n[r]||e +switch(t){case"top":case"bottom":var i=n[0],o=n[n.length-1],a="top"===t,u=i.top,c=o.bottom,s=a?i.left:o.left,f=a?i.right:o.right +return{top:u,bottom:c,left:s,right:f,width:f-s,height:c-u} +case"left":case"right":var l=Math.min.apply(Math,n.map((function(t){return t.left}))),h=Math.max.apply(Math,n.map((function(t){return t.right}))),d=n.filter((function(e){return"left"===t?e.left===l:e.right===h})),p=d[0].top,y=d[d.length-1].bottom +return{top:p,bottom:y,left:l,right:h,width:h-l,height:y-p} +default:return e}}(Et(t),n.getBoundingClientRect(),kt(n.getClientRects()),r)}(o.placement)}}),e=o.placement)}} +function a(){var e +i||(e=function(t,e){var n +return{popperOptions:Object.assign({},t.popperOptions,{modifiers:[].concat(((null==(n=t.popperOptions)?void 0:n.modifiers)||[]).filter((function(t){return t.name!==e.name})),[e])})}}(t.props,o),i=!0,t.setProps(e),i=!1)}return{onCreate:a,onAfterUpdate:a,onTrigger:function(e,n){if(Ot(n)){var i=kt(t.reference.getClientRects()),o=i.find((function(t){return t.left-2<=n.clientX&&t.right+2>=n.clientX&&t.top-2<=n.clientY&&t.bottom+2>=n.clientY})) +r=i.indexOf(o)}},onUntrigger:function(){r=-1}}}},le={name:"sticky",defaultValue:!1,fn:function(t){var e=t.reference,n=t.popper +function r(e){return!0===t.props.sticky||t.props.sticky===e}var i=null,o=null +function a(){var u=r("reference")?(t.popperInstance?t.popperInstance.state.elements.reference:e).getBoundingClientRect():null,c=r("popper")?n.getBoundingClientRect():null;(u&&he(i,u)||c&&he(o,c))&&t.popperInstance&&t.popperInstance.update(),i=u,o=c,t.state.isMounted&&requestAnimationFrame(a)}return{onMount:function(){t.props.sticky&&a()}}}} +function he(t,e){return!t||!e||t.top!==e.top||t.right!==e.right||t.bottom!==e.bottom||t.left!==e.left}Qt.setDefaultProps({render:Kt}) +const de=Qt},2247:(t,e,n)=>{"use strict" +n.d(e,{ZT:()=>i,ev:()=>a,pi:()=>o}) +var r=function(t,e){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n])},r(t,e)} +function i(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null") +function n(){this.constructor=t}r(t,e),t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)}var o=function(){return o=Object.assign||function(t){for(var e,n=1,r=arguments.length;n{"use strict" +function r(t){return null!==t&&"object"==typeof t&&!(t instanceof Date||t instanceof RegExp)&&!Array.isArray(t)}n.r(e),n.d(e,{BufferedChangeset:()=>vt,CHANGESET:()=>F,Change:()=>o,Changeset:()=>_t,Err:()=>c,ValidatedChangeset:()=>mt,buildOldValues:()=>q,changeset:()=>gt,getChangeValue:()=>u,getDeep:()=>y,getKeyValues:()=>l,isChange:()=>a,isChangeset:()=>T,isObject:()=>r,isPromise:()=>d,keyInObject:()=>B,lookupValidator:()=>b,mergeDeep:()=>J,mergeNested:()=>Z,normalizeObject:()=>E,objectWithout:()=>rt,propertyIsUnsafe:()=>K,pureAssign:()=>D,setDeep:()=>U,take:()=>it}) +var i=Symbol("__value__"),o=function(t){this[i]=t},a=function(t){return r(t)&&i in t} +function u(t){if(a(t))return t[i]}var c=function(t,e){this.value=t,this.validation=e},s=function(t,e){var n="function"==typeof Symbol&&t[Symbol.iterator] +if(!n)return t +var r,i,o=n.call(t),a=[] +try{for(;(void 0===e||e-- >0)&&!(r=o.next()).done;)a.push(r.value)}catch(t){i={error:t}}finally{try{r&&!r.done&&(n=o.return)&&n.call(o)}finally{if(i)throw i.error}}return a},f=function(){for(var t=[],e=0;e0&&i[i.length-1])||6!==o[0]&&2!==o[0])){a=0 +continue}if(3===o[0]&&(!i||o[1]>i[0]&&o[1]0)&&!(r=o.next()).done;)a.push(r.value)}catch(t){i={error:t}}finally{try{r&&!r.done&&(n=o.return)&&n.call(o)}finally{if(i)throw i.error}}return a},g=function(){for(var t=[],e=0;e=t.length&&(t=void 0),{value:t&&t[r++],done:!t}}} +throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")},A=function(){return A=Object.assign||function(t){for(var e,n=1,r=arguments.length;n0)&&!(r=o.next()).done;)a.push(r.value)}catch(t){i={error:t}}finally{try{r&&!r.done&&(n=o.return)&&n.call(o)}finally{if(i)throw i.error}}return a},O=function(){for(var t=[],e=0;e=t.length&&(t=void 0),{value:t&&t[r++],done:!t}}} +throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")}(n),c=u.next();!c.done;c=u.next()){var s=c.value,f=t[s] +"function"==typeof f.validate?e[s]=f:r(f)?S(f,e,Object.keys(f),O(i,[s])):("function"==typeof f||Array.isArray(f)&&f.every((function(t){return"function"==typeof t||"function"==typeof t.validate})))&&(e[O(i,[s]).join(".")]=f)}}catch(t){o={error:t}}finally{try{c&&!c.done&&(a=u.return)&&a.call(u)}finally{if(o)throw o.error}}return e}function M(t){return t?S(t,{},Object.keys(t)):{}}var F="__CHANGESET__" +function T(t){return t&&t.__changeset__===F}function B(t,e){var n=function(t,e){var n="function"==typeof Symbol&&t[Symbol.iterator] +if(!n)return t +var r,i,o=n.call(t),a=[] +try{for(;(void 0===e||e-- >0)&&!(r=o.next()).done;)a.push(r.value)}catch(t){i={error:t}}finally{try{r&&!r.done&&(n=o.return)&&n.call(o)}finally{if(i)throw i.error}}return a}(e.split(".")),r=n[0],i=n.slice(1) +if(!r||!(r in t))return!1 +if(!i.length)return r in t +var o=t[r] +return null!==o&&"object"==typeof o&&B(t[r],i.join("."))}var P=function(t,e){var n="function"==typeof Symbol&&t[Symbol.iterator] +if(!n)return t +var r,i,o=n.call(t),a=[] +try{for(;(void 0===e||e-- >0)&&!(r=o.next()).done;)a.push(r.value)}catch(t){i={error:t}}finally{try{r&&!r.done&&(n=o.return)&&n.call(o)}finally{if(i)throw i.error}}return a} +function j(t){return!!t&&Object.keys(t).every((function(t){return Number.isInteger(parseInt(t,10))}))}function N(t){return t.reduce((function(t,e,n){return t[n]=e,t}),{})}function R(t){var e,n,r=[] +try{for(var i=function(t){var e="function"==typeof Symbol&&Symbol.iterator,n=e&&t[e],r=0 +if(n)return n.call(t) +if(t&&"number"==typeof t.length)return{next:function(){return t&&r>=t.length&&(t=void 0),{value:t&&t[r++],done:!t}}} +throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")}(Object.entries(t)),o=i.next();!o.done;o=i.next()){var a=P(o.value,2),u=a[0],c=a[1] +r[parseInt(u,10)]=c}}catch(t){e={error:t}}finally{try{o&&!o.done&&(n=i.return)&&n.call(i)}finally{if(e)throw e.error}}return r}var L=function(){return L=Object.assign||function(t){for(var e,n=1,r=arguments.length;n0)&&!(r=o.next()).done;)a.push(r.value)}catch(t){i={error:t}}finally{try{r&&!r.done&&(n=o.return)&&n.call(o)}finally{if(i)throw i.error}}return a}(e.slice(-1),1)[0],r=Object.keys(t).filter((function(t){return t!==n})).reduce((function(e,n){return e[n]=t[n],e}),Object.create(null)) +return L({},r)}function $(t){return"__proto__"!==t&&"constructor"!==t&&"prototype"!==t}function U(t,e,n,i){void 0===i&&(i={safeSet:void 0,safeGet:void 0}) +var c=function(t){return t.split(".")}(e).filter($),s=t +if(i.safeSet=i.safeSet||function(t,e,n){return t[e]=n},i.safeGet=i.safeGet||function(t,e){return t?t[e]:t},1===c.length)return i.safeSet(t,e,n),t +for(var f=0;f=t.length&&(t=void 0),{value:t&&t[r++],done:!t}}} +throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")}(e),u=a.next();!u.done;u=a.next()){var c=u.value +o[c.key]=n(t,c.key)}}catch(t){r={error:t}}finally{try{u&&!u.done&&(i=a.return)&&i.call(a)}finally{if(r)throw r.error}}return o}var V=function(t,e){var n="function"==typeof Symbol&&t[Symbol.iterator] +if(!n)return t +var r,i,o=n.call(t),a=[] +try{for(;(void 0===e||e-- >0)&&!(r=o.next()).done;)a.push(r.value)}catch(t){i={error:t}}finally{try{r&&!r.done&&(n=o.return)&&n.call(o)}finally{if(i)throw i.error}}return a},H=function(){for(var t=[],e=0;e0)for(r in i){var o=i[r] +n.safeSet(t,r,o)}}}else{if(!G(t,r)||!function(t){return!!t&&"object"==typeof t}(s=e[r])||function(t){var e=Object.prototype.toString.call(t) +return"[object RegExp]"===e||"[object Date]"===e}(s)||a(e[r])){var c=e[r] +return c&&a(c)?n.safeSet(t,r,u(c)):n.safeSet(t,r,E(c))}n.safeSet(t,r,J(n.safeGet(t,r),n.safeGet(e,r),n))}var s})),t}function J(t,e,n){void 0===n&&(n={safeGet:void 0,safeSet:void 0,propertyIsUnsafe:void 0,getKeys:void 0}),n.getKeys=n.getKeys||Y,n.propertyIsUnsafe=n.propertyIsUnsafe||K,n.safeGet=n.safeGet||function(t,e){return t[e]},n.safeSet=n.safeSet||function(t,e,n){return t[e]=n} +var r=Array.isArray(e),i=Array.isArray(t) +if(r===i)return r||null==t?e:X(t,e,n) +var o=j(e) +return i&&o?R(X(N(t),e,n)):e}var Q=function(){return Q=Object.assign||function(t){for(var e,n=1,r=arguments.length;n0&&i[i.length-1])||6!==o[0]&&2!==o[0])){a=0 +continue}if(3===o[0]&&(!i||o[1]>i[0]&&o[1]0)&&!(r=o.next()).done;)a.push(r.value)}catch(t){i={error:t}}finally{try{r&&!r.done&&(n=o.return)&&n.call(o)}finally{if(i)throw i.error}}return a},st=function(){for(var t=[],e=0;e0)||r.find((function(e){return t.match(e)}))){var i=this._content,o=this.safeGet(i,t) +if(n.skipValidate)return this._setProperty({key:t,value:e,oldValue:o}),void this._handleValidation(!0,{key:t,value:e}) +this._setProperty({key:t,value:e,oldValue:o}),this._validateKey(t,e)}},Object.defineProperty(t.prototype,Symbol.toStringTag,{get:function(){return"changeset:"+D(this._content,{}).toString()},enumerable:!1,configurable:!0}),t.prototype.toString=function(){return"changeset:"+D(this._content,{}).toString()},t.prototype.prepare=function(t){var e=t(this._bareChanges) +if(this.isObject(e),this.isObject(e)){var n=ft(e).reduce((function(t,n){return t[n]=new o(e[n]),t}),{}) +this._changes=n}return this},t.prototype.execute=function(){var t +if(this.isValid&&this.isDirty){var e=this._content,n=this._changes +t=q(e,this.changes,this.getDeep),this._content=this.mergeDeep(e,n)}return this.trigger("execute"),this._changes={},this._previousContent=t,this},t.prototype.unexecute=function(){return this._previousContent&&(this._content=this.mergeDeep(this._content,this._previousContent,{safeGet:this.safeGet,safeSet:this.safeSet})),this},t.prototype.save=function(t){return at(this,void 0,void 0,(function(){var e,n,r,i +return ut(this,(function(o){switch(o.label){case 0:e=this._content,n=Promise.resolve(this),this.execute(),"function"==typeof e.save?n=e.save(t):"function"==typeof this.safeGet(e,"save")&&(r=this.maybeUnwrapProxy(e).save())&&(n=r),o.label=1 +case 1:return o.trys.push([1,3,,4]),[4,n] +case 2:return i=o.sent(),this.rollback(),[2,i] +case 3:throw o.sent() +case 4:return[2]}}))}))},t.prototype.merge=function(t){var e=this._content +if(T(t),t._content,this.isPristine&&t.isPristine)return this +var n=this._changes,r=t._changes,i=this._errors,o=t._errors,a=new mt(e,this._validator),u=rt(ft(r),i),c=rt(ft(o),n),s=Z(u,o),f=Z(c,r) +return a._errors=s,a._changes=f,a._notifyVirtualProperties(),a},t.prototype.rollback=function(){var t=this._rollbackKeys() +return this._changes={},this._errors={},this._errorsCache={},this._notifyVirtualProperties(t),this.trigger("afterRollback"),this},t.prototype.rollbackInvalid=function(t){var e=this,n=ft(this._errors) +return t?(this._notifyVirtualProperties([t]),this._errors=this._deleteKey(ht,t),this._errorsCache=this._errors,n.indexOf(t)>-1&&(this._changes=this._deleteKey(lt,t))):(this._notifyVirtualProperties(),this._errors={},this._errorsCache=this._errors,n.forEach((function(t){e._changes=e._deleteKey(lt,t)}))),this},t.prototype.rollbackProperty=function(t){return this._changes=this._deleteKey(lt,t),this._errors=this._deleteKey(ht,t),this._errorsCache=this._errors,this},t.prototype.validate=function(){for(var t=[],e=0;e0?t:ft(M(this.validationMap)),e=t.map((function(t){var e=n[t],r=e instanceof nt?e.unwrap():e +return n._validateKey(t,r)})),[2,Promise.all(e)]):[2,Promise.resolve(null)]}))}))},t.prototype.addError=function(t,e){var n,r=this +if(function(t){return r.isObject(t)&&!Array.isArray(t)}(e))e.hasOwnProperty("value")||e.value,e.hasOwnProperty("validation"),n=new c(e.value,e.validation) +else{var i=this[t] +n=new c(i,e)}var o=this._errors +return this._errors=this.setDeep(o,t,n,{safeSet:this.safeSet}),this._errorsCache=this._errors,e},t.prototype.pushErrors=function(t){for(var e=[],n=1;n0},t.prototype._validateKey=function(t,e){var n=this,r=this._content,i=this.getDeep(r,t),o=this._validate(t,e,i) +if(this.trigger("beforeValidation",t),d(o)){this._setIsValidating(t,o) +var a=this._runningValidations,u=Object.entries(a) +return Promise.all(u).then((function(){return o.then((function(r){return delete a[t],n._handleValidation(r,{key:t,value:e})})).then((function(e){return n.trigger(dt,t),e}))}))}var c=this._handleValidation(o,{key:t,value:e}) +return this.trigger(dt,t),c},t.prototype._handleValidation=function(t,e){var n=e.key,r=e.value,i=!0===t||Array.isArray(t)&&1===t.length&&!0===t[0] +return this._errors=this._deleteKey("_errorsCache",n),i?r:this.addError(n,{value:r,validation:t})},t.prototype._validate=function(t,e,n){var r=this._validator,i=this._content +if("function"==typeof r){var o=r({key:t,newValue:e,oldValue:n,changes:this.change,content:i}) +return void 0===o||o}return!0},t.prototype._setProperty=function(t){var e,n,r=t.key,i=t.value,a=t.oldValue,u=this._changes +if(n=a,((e=i)instanceof Date&&n instanceof Date?e.getTime()===n.getTime():e===n)&&void 0!==a)B(u,r)&&(this._changes=this._deleteKey(lt,r)) +else{var c=this.setDeep(u,r,new o(i),{safeSet:this.safeSet}) +this._changes=c}},t.prototype._setIsValidating=function(t,e){var n=this._runningValidations +this.setDeep(n,t,e)},t.prototype._notifyVirtualProperties=function(t){return t||(t=this._rollbackKeys()),t},t.prototype._rollbackKeys=function(){var t=this._changes,e=this._errors +return st(new Set(st(ft(t),ft(e))))},t.prototype._deleteKey=function(t,e){void 0===e&&(e="") +var n=this[t],r=e.split(".") +if(1===r.length&&n.hasOwnProperty(e))delete n[e] +else if(n[r[0]])for(var i=ct(r),o=i[0],u=i.slice(1),c=n,s=n[o],f=o;this.isObject(s)&&f;){var l=s;(a(l)||void 0!==l.value||l.validation)&&delete c[f],c=s,(f=u.shift())&&(s=s[f])}return n},t.prototype.get=function(t){var e=ct(t.split(".")),n=e[0],i=e.slice(1),o=this._changes,c=this._content +if(Object.prototype.hasOwnProperty.call(o,n)){var s=this.getDeep(o,t) +if(!this.isObject(s)&&void 0!==s)return s}if(Object.prototype.hasOwnProperty.call(o,n)&&k(o)){var f=o[n],l=E(f) +if(this.isObject(l)){var h=this.maybeUnwrapProxy(this.getDeep(l,i.join("."))) +if(void 0===h&&function(t,e,n){var r,i +if(a(t))return!1 +var o=e.split("."),u=t +try{for(var c=x(o),s=c.next();!s.done;s=c.next()){var f=s.value +if(!u)return!1 +if(o[o.length-1]!==f&&a(n(u,f)))return!0 +u=n(u,f)}}catch(t){r={error:t}}finally{try{s&&!s.done&&(i=c.return)&&i.call(c)}finally{if(r)throw r.error}}return!1}(o,t,this.safeGet)&&!function(t,e,n){var r,i,o=e.split("."),c=t +try{for(var s=x(o),f=s.next();!f.done;f=s.next()){var l=f.value +if(!c||!Object.prototype.hasOwnProperty.call(c,l))return!1 +c=n(c,l),a(c)&&(c=u(c))}}catch(t){r={error:t}}finally{try{f&&!f.done&&(i=s.return)&&i.call(s)}finally{if(r)throw r.error}}return!0}(o,t,this.safeGet)&&this.getDeep(c,t))return +if(this.isObject(h)){if(a(h))return u(h) +var d=this.safeGet(c,n)||{},p=this.getDeep(d,i.join(".")),y=function(t,e){var n=t +if(-1===e.indexOf("."))return n[e] +for(var r="string"==typeof e?e.split("."):e,i=0;i{var r=n(260),i=n(8806) +t.exports=function t(e){if(!(this instanceof t))return new t(e) +var n=(e||"").replace(/^\//,""),o=i() +return a._trie=o,a.on=function(t,e){if(r.equal(typeof t,"string"),r.equal(typeof e,"function"),t=t||"/",e._wayfarer&&e._trie)o.mount(t,e._trie.trie) +else{var n=o.create(t) +n.cb=e,n.route=t}return a},a.emit=a,a.match=u,a._wayfarer=!0,a +function a(t){var e=u(t),n=new Array(arguments.length) +n[0]=e.params +for(var r=1;r{var r=n(260) +function i(){if(!(this instanceof i))return new i +this.trie={nodes:{}}}function o(t,e){return Object.prototype.hasOwnProperty.call(t,e)}t.exports=i,i.prototype.create=function(t){r.equal(typeof t,"string","route should be a string") +var e=t.replace(/^\//,"").split("/") +return function t(n,r){var i=o(e,n)&&e[n] +if(!1===i)return r +var a=null +return/^:|^\*/.test(i)?(o(r.nodes,"$$")?a=r.nodes.$$:(a={nodes:{}},r.nodes.$$=a),"*"===i[0]&&(r.wildcard=!0),r.name=i.replace(/^:|^\*/,"")):o(r.nodes,i)?a=r.nodes[i]:(a={nodes:{}},r.nodes[i]=a),t(n+1,a)}(0,this.trie)},i.prototype.match=function(t){r.equal(typeof t,"string","route should be a string") +var e=t.replace(/^\//,"").split("/"),n={},i=function t(r,i){if(void 0!==i){var a=e[r] +if(void 0===a)return i +if(o(i.nodes,a))return t(r+1,i.nodes[a]) +if(i.name){try{n[i.name]=decodeURIComponent(a)}catch(e){return t(r,void 0)}return t(r+1,i.nodes.$$)}if(i.wildcard){try{n.wildcard=decodeURIComponent(e.slice(r).join("/"))}catch(e){return t(r,void 0)}return i.nodes.$$}return t(r+1)}}(0,this.trie) +if(i)return(i=Object.assign({},i)).params=n,i},i.prototype.mount=function(t,e){r.equal(typeof t,"string","route should be a string"),r.equal(typeof e,"object","trie should be a object") +var n=t.replace(/^\//,"").split("/"),i=null,o=null +if(1===n.length)o=n[0],i=this.create(o) +else{var a=n.join("/") +o=n[0],i=this.create(a)}Object.assign(i.nodes,e.nodes),e.name&&(i.name=e.name),i.nodes[""]&&(Object.keys(i.nodes[""]).forEach((function(t){"nodes"!==t&&(i[t]=i.nodes[""][t])})),Object.assign(i.nodes,i.nodes[""].nodes),delete i.nodes[""].nodes)}},3493:(t,e,n)=>{"use strict" +n.r(e),n.d(e,{CSSResult:()=>a,ReactiveElement:()=>g,adoptStyles:()=>s,css:()=>c,defaultConverter:()=>y,getCompatibleStyle:()=>f,notEqual:()=>b,supportsAdoptingStyleSheets:()=>r,unsafeCSS:()=>u}) +const r=window.ShadowRoot&&(void 0===window.ShadyCSS||window.ShadyCSS.nativeShadow)&&"adoptedStyleSheets"in Document.prototype&&"replace"in CSSStyleSheet.prototype,i=Symbol(),o=new Map +class a{constructor(t,e){if(this._$cssResult$=!0,e!==i)throw Error("CSSResult is not constructable. Use `unsafeCSS` or `css` instead.") +this.cssText=t}get styleSheet(){let t=o.get(this.cssText) +return r&&void 0===t&&(o.set(this.cssText,t=new CSSStyleSheet),t.replaceSync(this.cssText)),t}toString(){return this.cssText}}const u=t=>new a("string"==typeof t?t:t+"",i),c=function(t){for(var e=arguments.length,n=new Array(e>1?e-1:0),r=1;re+(t=>{if(!0===t._$cssResult$)return t.cssText +if("number"==typeof t)return t +throw Error("Value passed to 'css' function must be a 'css' function result: "+t+". Use 'unsafeCSS' to pass non-literal values, but take care to ensure page security.")})(n)+t[r+1]),t[0]) +return new a(o,i)},s=(t,e)=>{r?t.adoptedStyleSheets=e.map((t=>t instanceof CSSStyleSheet?t:t.styleSheet)):e.forEach((e=>{const n=document.createElement("style"),r=window.litNonce +void 0!==r&&n.setAttribute("nonce",r),n.textContent=e.cssText,t.appendChild(n)}))},f=r?t=>t:t=>t instanceof CSSStyleSheet?(t=>{let e="" +for(const n of t.cssRules)e+=n.cssText +return u(e)})(t):t +var l +const h=window.trustedTypes,d=h?h.emptyScript:"",p=window.reactiveElementPolyfillSupport,y={toAttribute(t,e){switch(e){case Boolean:t=t?d:null +break +case Object:case Array:t=null==t?t:JSON.stringify(t)}return t},fromAttribute(t,e){let n=t +switch(e){case Boolean:n=null!==t +break +case Number:n=null===t?null:Number(t) +break +case Object:case Array:try{n=JSON.parse(t)}catch(t){n=null}}return n}},b=(t,e)=>e!==t&&(e==e||t==t),v={attribute:!0,type:String,converter:y,reflect:!1,hasChanged:b} +class g extends HTMLElement{constructor(){super(),this._$Et=new Map,this.isUpdatePending=!1,this.hasUpdated=!1,this._$Ei=null,this.o()}static addInitializer(t){var e +null!==(e=this.l)&&void 0!==e||(this.l=[]),this.l.push(t)}static get observedAttributes(){this.finalize() +const t=[] +return this.elementProperties.forEach(((e,n)=>{const r=this._$Eh(n,e) +void 0!==r&&(this._$Eu.set(r,n),t.push(r))})),t}static createProperty(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:v +if(e.state&&(e.attribute=!1),this.finalize(),this.elementProperties.set(t,e),!e.noAccessor&&!this.prototype.hasOwnProperty(t)){const n="symbol"==typeof t?Symbol():"__"+t,r=this.getPropertyDescriptor(t,n,e) +void 0!==r&&Object.defineProperty(this.prototype,t,r)}}static getPropertyDescriptor(t,e,n){return{get(){return this[e]},set(r){const i=this[t] +this[e]=r,this.requestUpdate(t,i,n)},configurable:!0,enumerable:!0}}static getPropertyOptions(t){return this.elementProperties.get(t)||v}static finalize(){if(this.hasOwnProperty("finalized"))return!1 +this.finalized=!0 +const t=Object.getPrototypeOf(this) +if(t.finalize(),this.elementProperties=new Map(t.elementProperties),this._$Eu=new Map,this.hasOwnProperty("properties")){const t=this.properties,e=[...Object.getOwnPropertyNames(t),...Object.getOwnPropertySymbols(t)] +for(const n of e)this.createProperty(n,t[n])}return this.elementStyles=this.finalizeStyles(this.styles),!0}static finalizeStyles(t){const e=[] +if(Array.isArray(t)){const n=new Set(t.flat(1/0).reverse()) +for(const t of n)e.unshift(f(t))}else void 0!==t&&e.push(f(t)) +return e}static _$Eh(t,e){const n=e.attribute +return!1===n?void 0:"string"==typeof n?n:"string"==typeof t?t.toLowerCase():void 0}o(){var t +this._$Ep=new Promise((t=>this.enableUpdating=t)),this._$AL=new Map,this._$Em(),this.requestUpdate(),null===(t=this.constructor.l)||void 0===t||t.forEach((t=>t(this)))}addController(t){var e,n;(null!==(e=this._$Eg)&&void 0!==e?e:this._$Eg=[]).push(t),void 0!==this.renderRoot&&this.isConnected&&(null===(n=t.hostConnected)||void 0===n||n.call(t))}removeController(t){var e +null===(e=this._$Eg)||void 0===e||e.splice(this._$Eg.indexOf(t)>>>0,1)}_$Em(){this.constructor.elementProperties.forEach(((t,e)=>{this.hasOwnProperty(e)&&(this._$Et.set(e,this[e]),delete this[e])}))}createRenderRoot(){var t +const e=null!==(t=this.shadowRoot)&&void 0!==t?t:this.attachShadow(this.constructor.shadowRootOptions) +return s(e,this.constructor.elementStyles),e}connectedCallback(){var t +void 0===this.renderRoot&&(this.renderRoot=this.createRenderRoot()),this.enableUpdating(!0),null===(t=this._$Eg)||void 0===t||t.forEach((t=>{var e +return null===(e=t.hostConnected)||void 0===e?void 0:e.call(t)}))}enableUpdating(t){}disconnectedCallback(){var t +null===(t=this._$Eg)||void 0===t||t.forEach((t=>{var e +return null===(e=t.hostDisconnected)||void 0===e?void 0:e.call(t)}))}attributeChangedCallback(t,e,n){this._$AK(t,n)}_$ES(t,e){let n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:v +var r,i +const o=this.constructor._$Eh(t,n) +if(void 0!==o&&!0===n.reflect){const a=(null!==(i=null===(r=n.converter)||void 0===r?void 0:r.toAttribute)&&void 0!==i?i:y.toAttribute)(e,n.type) +this._$Ei=t,null==a?this.removeAttribute(o):this.setAttribute(o,a),this._$Ei=null}}_$AK(t,e){var n,r,i +const o=this.constructor,a=o._$Eu.get(t) +if(void 0!==a&&this._$Ei!==a){const t=o.getPropertyOptions(a),u=t.converter,c=null!==(i=null!==(r=null===(n=u)||void 0===n?void 0:n.fromAttribute)&&void 0!==r?r:"function"==typeof u?u:null)&&void 0!==i?i:y.fromAttribute +this._$Ei=a,this[a]=c(e,t.type),this._$Ei=null}}requestUpdate(t,e,n){let r=!0 +void 0!==t&&(((n=n||this.constructor.getPropertyOptions(t)).hasChanged||b)(this[t],e)?(this._$AL.has(t)||this._$AL.set(t,e),!0===n.reflect&&this._$Ei!==t&&(void 0===this._$E_&&(this._$E_=new Map),this._$E_.set(t,n))):r=!1),!this.isUpdatePending&&r&&(this._$Ep=this._$EC())}async _$EC(){this.isUpdatePending=!0 +try{await this._$Ep}catch(t){Promise.reject(t)}const t=this.scheduleUpdate() +return null!=t&&await t,!this.isUpdatePending}scheduleUpdate(){return this.performUpdate()}performUpdate(){var t +if(!this.isUpdatePending)return +this.hasUpdated,this._$Et&&(this._$Et.forEach(((t,e)=>this[e]=t)),this._$Et=void 0) +let e=!1 +const n=this._$AL +try{e=this.shouldUpdate(n),e?(this.willUpdate(n),null===(t=this._$Eg)||void 0===t||t.forEach((t=>{var e +return null===(e=t.hostUpdate)||void 0===e?void 0:e.call(t)})),this.update(n)):this._$EU()}catch(t){throw e=!1,this._$EU(),t}e&&this._$AE(n)}willUpdate(t){}_$AE(t){var e +null===(e=this._$Eg)||void 0===e||e.forEach((t=>{var e +return null===(e=t.hostUpdated)||void 0===e?void 0:e.call(t)})),this.hasUpdated||(this.hasUpdated=!0,this.firstUpdated(t)),this.updated(t)}_$EU(){this._$AL=new Map,this.isUpdatePending=!1}get updateComplete(){return this.getUpdateComplete()}getUpdateComplete(){return this._$Ep}shouldUpdate(t){return!0}update(t){void 0!==this._$E_&&(this._$E_.forEach(((t,e)=>this._$ES(e,this[e],t))),this._$E_=void 0),this._$EU()}updated(t){}firstUpdated(t){}}g.finalized=!0,g.elementProperties=new Map,g.elementStyles=[],g.shadowRootOptions={mode:"open"},null==p||p({ReactiveElement:g}),(null!==(l=globalThis.reactiveElementVersions)&&void 0!==l?l:globalThis.reactiveElementVersions=[]).push("1.2.1")}}]) diff --git a/agent/uiserver/dist/assets/chunk.412.2df22e4bf69d8f15ebdb.js.LICENSE.txt b/agent/uiserver/dist/assets/chunk.412.2df22e4bf69d8f15ebdb.js.LICENSE.txt new file mode 100644 index 00000000000..b25e5082df0 --- /dev/null +++ b/agent/uiserver/dist/assets/chunk.412.2df22e4bf69d8f15ebdb.js.LICENSE.txt @@ -0,0 +1,38 @@ +/*! + * clipboard.js v2.0.8 + * https://clipboardjs.com/ + * + * Licensed MIT © Zeno Rocha + */ + +/*! +* focus-trap 6.9.4 +* @license MIT, https://github.com/focus-trap/focus-trap/blob/master/LICENSE +*/ + +/*! ***************************************************************************** +Copyright (c) Microsoft Corporation. + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THIS SOFTWARE. +***************************************************************************** */ + +/** + * @license + * Copyright 2017 Google LLC + * SPDX-License-Identifier: BSD-3-Clause + */ + +/** + * @license + * Copyright 2019 Google LLC + * SPDX-License-Identifier: BSD-3-Clause + */ diff --git a/agent/uiserver/dist/assets/chunk.744.c0eb6726020fc4af8d3f.css b/agent/uiserver/dist/assets/chunk.744.c0eb6726020fc4af8d3f.css new file mode 100644 index 00000000000..cf28e28e68b --- /dev/null +++ b/agent/uiserver/dist/assets/chunk.744.c0eb6726020fc4af8d3f.css @@ -0,0 +1,39 @@ +dialog { + position: absolute; + left: 0; right: 0; + width: -moz-fit-content; + width: -webkit-fit-content; + width: fit-content; + height: -moz-fit-content; + height: -webkit-fit-content; + height: fit-content; + margin: auto; + border: solid; + padding: 1em; + background: white; + color: black; + display: block; +} + +dialog:not([open]) { + display: none; +} + +dialog + .backdrop { + position: fixed; + top: 0; right: 0; bottom: 0; left: 0; + background: rgba(0,0,0,0.1); +} + +._dialog_overlay { + position: fixed; + top: 0; right: 0; bottom: 0; left: 0; +} + +dialog.fixed { + position: fixed; + top: 50%; + transform: translate(0, -50%); +} + +/*# sourceMappingURL=chunk.744.c0eb6726020fc4af8d3f.css-e0c9c028789323db3f70d794b7d8bdc8.map*/ \ No newline at end of file diff --git a/agent/uiserver/dist/assets/chunk.744.c0eb6726020fc4af8d3f.js b/agent/uiserver/dist/assets/chunk.744.c0eb6726020fc4af8d3f.js new file mode 100644 index 00000000000..4a5274a4aa3 --- /dev/null +++ b/agent/uiserver/dist/assets/chunk.744.c0eb6726020fc4af8d3f.js @@ -0,0 +1 @@ +"use strict";(globalThis.webpackChunk_ember_auto_import_=globalThis.webpackChunk_ember_auto_import_||[]).push([[744],{7744:(_,e,a)=>{a.r(e)}}]) diff --git a/agent/uiserver/dist/assets/chunk.83.85cc25a28afe28f711a3.js b/agent/uiserver/dist/assets/chunk.83.85cc25a28afe28f711a3.js new file mode 100644 index 00000000000..d49ebc2f6d6 --- /dev/null +++ b/agent/uiserver/dist/assets/chunk.83.85cc25a28afe28f711a3.js @@ -0,0 +1,65 @@ +"use strict";(globalThis.webpackChunk_ember_auto_import_=globalThis.webpackChunk_ember_auto_import_||[]).push([[83],{7083:(e,t,o)=>{o.r(t),o.d(t,{default:()=>_}) +var i=window.CustomEvent +function n(e,t){var o="on"+t.type.toLowerCase() +return"function"==typeof e[o]&&e[o](t),e.dispatchEvent(t)}function a(e){for(;e;){if("dialog"===e.localName)return e +e=e.parentElement?e.parentElement:e.parentNode?e.parentNode.host:null}return null}function r(e){for(;e&&e.shadowRoot&&e.shadowRoot.activeElement;)e=e.shadowRoot.activeElement +e&&e.blur&&e!==document.body&&e.blur()}function l(e,t){for(var o=0;o=0&&(e=this.dialog_),e||(e=d(this.dialog_)),r(document.activeElement),e&&e.focus()},updateZIndex:function(e,t){if(e, the polyfill may not work correctly",e),"dialog"!==e.localName)throw new Error("Failed to register dialog: The element is not a dialog.") +new p(e)},registerDialog:function(e){e.showModal||g.forceRegisterDialog(e)},DialogManager:function(){this.pendingDialogStack=[] +var e=this.checkDOM_.bind(this) +this.overlay=document.createElement("div"),this.overlay.className="_dialog_overlay",this.overlay.addEventListener("click",function(t){this.forwardTab_=void 0,t.stopPropagation(),e([])}.bind(this)),this.handleKey_=this.handleKey_.bind(this),this.handleFocus_=this.handleFocus_.bind(this),this.zIndexLow_=1e5,this.zIndexHigh_=100150,this.forwardTab_=void 0,"MutationObserver"in window&&(this.mo_=new MutationObserver((function(t){var o=[] +t.forEach((function(e){for(var t,i=0;t=e.removedNodes[i];++i)t instanceof Element&&("dialog"===t.localName&&o.push(t),o=o.concat(t.querySelectorAll("dialog")))})),o.length&&e(o)})))}} +if(g.DialogManager.prototype.blockDocument=function(){document.documentElement.addEventListener("focus",this.handleFocus_,!0),document.addEventListener("keydown",this.handleKey_),this.mo_&&this.mo_.observe(document,{childList:!0,subtree:!0})},g.DialogManager.prototype.unblockDocument=function(){document.documentElement.removeEventListener("focus",this.handleFocus_,!0),document.removeEventListener("keydown",this.handleKey_),this.mo_&&this.mo_.disconnect()},g.DialogManager.prototype.updateStacking=function(){for(var e,t=this.zIndexHigh_,o=0;e=this.pendingDialogStack[o];++o)e.updateZIndex(--t,--t),0===o&&(this.overlay.style.zIndex=--t) +var i=this.pendingDialogStack[0] +i?(i.dialog.parentNode||document.body).appendChild(this.overlay):this.overlay.parentNode&&this.overlay.parentNode.removeChild(this.overlay)},g.DialogManager.prototype.containedByTopDialog_=function(e){for(;e=a(e);){for(var t,o=0;t=this.pendingDialogStack[o];++o)if(t.dialog===e)return 0===o +e=e.parentElement}return!1},g.DialogManager.prototype.handleFocus_=function(e){var t=e.composedPath?e.composedPath()[0]:e.target +if(!this.containedByTopDialog_(t)&&document.activeElement!==document.documentElement&&(e.preventDefault(),e.stopPropagation(),r(t),void 0!==this.forwardTab_)){var o=this.pendingDialogStack[0] +return o.dialog.compareDocumentPosition(t)&Node.DOCUMENT_POSITION_PRECEDING&&(this.forwardTab_?o.focus_():t!==document.documentElement&&document.documentElement.focus()),!1}},g.DialogManager.prototype.handleKey_=function(e){if(this.forwardTab_=void 0,27===e.keyCode){e.preventDefault(),e.stopPropagation() +var t=new i("cancel",{bubbles:!1,cancelable:!0}),o=this.pendingDialogStack[0] +o&&n(o.dialog,t)&&o.dialog.close()}else 9===e.keyCode&&(this.forwardTab_=!e.shiftKey)},g.DialogManager.prototype.checkDOM_=function(e){this.pendingDialogStack.slice().forEach((function(t){-1!==e.indexOf(t.dialog)?t.downgradeModal():t.maybeHideModal()}))},g.DialogManager.prototype.pushDialog=function(e){var t=(this.zIndexHigh_-this.zIndexLow_)/2-1 +return!(this.pendingDialogStack.length>=t||(1===this.pendingDialogStack.unshift(e)&&this.blockDocument(),this.updateStacking(),0))},g.DialogManager.prototype.removeDialog=function(e){var t=this.pendingDialogStack.indexOf(e);-1!==t&&(this.pendingDialogStack.splice(t,1),0===this.pendingDialogStack.length&&this.unblockDocument(),this.updateStacking())},g.dm=new g.DialogManager,g.formSubmitter=null,g.imagemapUseValue=null,void 0===window.HTMLDialogElement){var m=document.createElement("form") +if(m.setAttribute("method","dialog"),"dialog"!==m.method){var f=Object.getOwnPropertyDescriptor(HTMLFormElement.prototype,"method") +if(f){var b=f.get +f.get=function(){return s(this)?"dialog":b.call(this)} +var v=f.set +f.set=function(e){return"string"==typeof e&&"dialog"===e.toLowerCase()?this.setAttribute("method",e):v.call(this,e)},Object.defineProperty(HTMLFormElement.prototype,"method",f)}}document.addEventListener("click",(function(e){if(g.formSubmitter=null,g.imagemapUseValue=null,!e.defaultPrevented){var t=e.target +if("composedPath"in e&&(t=e.composedPath().shift()||t),t&&s(t.form)){if(!("submit"===t.type&&["button","input"].indexOf(t.localName)>-1)){if("input"!==t.localName||"image"!==t.type)return +g.imagemapUseValue=e.offsetX+","+e.offsetY}a(t)&&(g.formSubmitter=t)}}}),!1),document.addEventListener("submit",(function(e){var t=e.target +if(!a(t)){var o=c(e) +"dialog"===(o&&o.getAttribute("formmethod")||t.getAttribute("method"))&&e.preventDefault()}})) +var y=HTMLFormElement.prototype.submit +HTMLFormElement.prototype.submit=function(){if(!s(this))return y.call(this) +var e=a(this) +e&&e.close()}}const _=g}}]) diff --git a/agent/uiserver/dist/assets/codemirror/mode/javascript/javascript-77218cd1268ea6df75775114ae086566.js b/agent/uiserver/dist/assets/codemirror/mode/javascript/javascript-a5e5d64b0f9ff6b6e21f5f48aa1ef464.js similarity index 91% rename from agent/uiserver/dist/assets/codemirror/mode/javascript/javascript-77218cd1268ea6df75775114ae086566.js rename to agent/uiserver/dist/assets/codemirror/mode/javascript/javascript-a5e5d64b0f9ff6b6e21f5f48aa1ef464.js index 7d25301561e..4da59f70de8 100644 --- a/agent/uiserver/dist/assets/codemirror/mode/javascript/javascript-77218cd1268ea6df75775114ae086566.js +++ b/agent/uiserver/dist/assets/codemirror/mode/javascript/javascript-a5e5d64b0f9ff6b6e21f5f48aa1ef464.js @@ -1,4 +1,4 @@ -var jsonlint=function(){var e={trace:function(){},yy:{},symbols_:{error:2,JSONString:3,STRING:4,JSONNumber:5,NUMBER:6,JSONNullLiteral:7,NULL:8,JSONBooleanLiteral:9,TRUE:10,FALSE:11,JSONText:12,JSONValue:13,EOF:14,JSONObject:15,JSONArray:16,"{":17,"}":18,JSONMemberList:19,JSONMember:20,":":21,",":22,"[":23,"]":24,JSONElementList:25,$accept:0,$end:1},terminals_:{2:"error",4:"STRING",6:"NUMBER",8:"NULL",10:"TRUE",11:"FALSE",14:"EOF",17:"{",18:"}",21:":",22:",",23:"[",24:"]"},productions_:[0,[3,1],[5,1],[7,1],[9,1],[9,1],[12,2],[13,1],[13,1],[13,1],[13,1],[13,1],[13,1],[15,2],[15,3],[20,3],[19,1],[19,3],[16,2],[16,3],[25,1],[25,3]],performAction:function(e,t,r,n,i,a){var s=a.length-1 +var jsonlint=function(){var e={trace:function(){},yy:{},symbols_:{error:2,JSONString:3,STRING:4,JSONNumber:5,NUMBER:6,JSONNullLiteral:7,NULL:8,JSONBooleanLiteral:9,TRUE:10,FALSE:11,JSONText:12,JSONValue:13,EOF:14,JSONObject:15,JSONArray:16,"{":17,"}":18,JSONMemberList:19,JSONMember:20,":":21,",":22,"[":23,"]":24,JSONElementList:25,$accept:0,$end:1},terminals_:{2:"error",4:"STRING",6:"NUMBER",8:"NULL",10:"TRUE",11:"FALSE",14:"EOF",17:"{",18:"}",21:":",22:",",23:"[",24:"]"},productions_:[0,[3,1],[5,1],[7,1],[9,1],[9,1],[12,2],[13,1],[13,1],[13,1],[13,1],[13,1],[13,1],[15,2],[15,3],[20,3],[19,1],[19,3],[16,2],[16,3],[25,1],[25,3]],performAction:function(e,t,r,n,i,a,s){var o=a.length-1 switch(i){case 1:this.$=e.replace(/\\(\\|")/g,"$1").replace(/\\n/g,"\n").replace(/\\r/g,"\r").replace(/\\t/g,"\t").replace(/\\v/g,"\v").replace(/\\f/g,"\f").replace(/\\b/g,"\b") break case 2:this.$=Number(e) @@ -9,37 +9,35 @@ case 4:this.$=!0 break case 5:this.$=!1 break -case 6:return this.$=a[s-1] +case 6:return this.$=a[o-1] case 13:this.$={} break -case 14:this.$=a[s-1] +case 14:case 19:this.$=a[o-1] break -case 15:this.$=[a[s-2],a[s]] +case 15:this.$=[a[o-2],a[o]] break -case 16:this.$={},this.$[a[s][0]]=a[s][1] +case 16:this.$={},this.$[a[o][0]]=a[o][1] break -case 17:this.$=a[s-2],a[s-2][a[s][0]]=a[s][1] +case 17:this.$=a[o-2],a[o-2][a[o][0]]=a[o][1] break case 18:this.$=[] break -case 19:this.$=a[s-1] +case 20:this.$=[a[o]] break -case 20:this.$=[a[s]] -break -case 21:this.$=a[s-2],a[s-2].push(a[s])}},table:[{3:5,4:[1,12],5:6,6:[1,13],7:3,8:[1,9],9:4,10:[1,10],11:[1,11],12:1,13:2,15:7,16:8,17:[1,14],23:[1,15]},{1:[3]},{14:[1,16]},{14:[2,7],18:[2,7],22:[2,7],24:[2,7]},{14:[2,8],18:[2,8],22:[2,8],24:[2,8]},{14:[2,9],18:[2,9],22:[2,9],24:[2,9]},{14:[2,10],18:[2,10],22:[2,10],24:[2,10]},{14:[2,11],18:[2,11],22:[2,11],24:[2,11]},{14:[2,12],18:[2,12],22:[2,12],24:[2,12]},{14:[2,3],18:[2,3],22:[2,3],24:[2,3]},{14:[2,4],18:[2,4],22:[2,4],24:[2,4]},{14:[2,5],18:[2,5],22:[2,5],24:[2,5]},{14:[2,1],18:[2,1],21:[2,1],22:[2,1],24:[2,1]},{14:[2,2],18:[2,2],22:[2,2],24:[2,2]},{3:20,4:[1,12],18:[1,17],19:18,20:19},{3:5,4:[1,12],5:6,6:[1,13],7:3,8:[1,9],9:4,10:[1,10],11:[1,11],13:23,15:7,16:8,17:[1,14],23:[1,15],24:[1,21],25:22},{1:[2,6]},{14:[2,13],18:[2,13],22:[2,13],24:[2,13]},{18:[1,24],22:[1,25]},{18:[2,16],22:[2,16]},{21:[1,26]},{14:[2,18],18:[2,18],22:[2,18],24:[2,18]},{22:[1,28],24:[1,27]},{22:[2,20],24:[2,20]},{14:[2,14],18:[2,14],22:[2,14],24:[2,14]},{3:20,4:[1,12],20:29},{3:5,4:[1,12],5:6,6:[1,13],7:3,8:[1,9],9:4,10:[1,10],11:[1,11],13:30,15:7,16:8,17:[1,14],23:[1,15]},{14:[2,19],18:[2,19],22:[2,19],24:[2,19]},{3:5,4:[1,12],5:6,6:[1,13],7:3,8:[1,9],9:4,10:[1,10],11:[1,11],13:31,15:7,16:8,17:[1,14],23:[1,15]},{18:[2,17],22:[2,17]},{18:[2,15],22:[2,15]},{22:[2,21],24:[2,21]}],defaultActions:{16:[2,6]},parseError:function(e){throw new Error(e)},parse:function(e){var t=this,r=[0],n=[null],i=[],a=this.table,s="",o=0,l=0,c=0 +case 21:this.$=a[o-2],a[o-2].push(a[o])}},table:[{3:5,4:[1,12],5:6,6:[1,13],7:3,8:[1,9],9:4,10:[1,10],11:[1,11],12:1,13:2,15:7,16:8,17:[1,14],23:[1,15]},{1:[3]},{14:[1,16]},{14:[2,7],18:[2,7],22:[2,7],24:[2,7]},{14:[2,8],18:[2,8],22:[2,8],24:[2,8]},{14:[2,9],18:[2,9],22:[2,9],24:[2,9]},{14:[2,10],18:[2,10],22:[2,10],24:[2,10]},{14:[2,11],18:[2,11],22:[2,11],24:[2,11]},{14:[2,12],18:[2,12],22:[2,12],24:[2,12]},{14:[2,3],18:[2,3],22:[2,3],24:[2,3]},{14:[2,4],18:[2,4],22:[2,4],24:[2,4]},{14:[2,5],18:[2,5],22:[2,5],24:[2,5]},{14:[2,1],18:[2,1],21:[2,1],22:[2,1],24:[2,1]},{14:[2,2],18:[2,2],22:[2,2],24:[2,2]},{3:20,4:[1,12],18:[1,17],19:18,20:19},{3:5,4:[1,12],5:6,6:[1,13],7:3,8:[1,9],9:4,10:[1,10],11:[1,11],13:23,15:7,16:8,17:[1,14],23:[1,15],24:[1,21],25:22},{1:[2,6]},{14:[2,13],18:[2,13],22:[2,13],24:[2,13]},{18:[1,24],22:[1,25]},{18:[2,16],22:[2,16]},{21:[1,26]},{14:[2,18],18:[2,18],22:[2,18],24:[2,18]},{22:[1,28],24:[1,27]},{22:[2,20],24:[2,20]},{14:[2,14],18:[2,14],22:[2,14],24:[2,14]},{3:20,4:[1,12],20:29},{3:5,4:[1,12],5:6,6:[1,13],7:3,8:[1,9],9:4,10:[1,10],11:[1,11],13:30,15:7,16:8,17:[1,14],23:[1,15]},{14:[2,19],18:[2,19],22:[2,19],24:[2,19]},{3:5,4:[1,12],5:6,6:[1,13],7:3,8:[1,9],9:4,10:[1,10],11:[1,11],13:31,15:7,16:8,17:[1,14],23:[1,15]},{18:[2,17],22:[2,17]},{18:[2,15],22:[2,15]},{22:[2,21],24:[2,21]}],defaultActions:{16:[2,6]},parseError:function(e,t){throw new Error(e)},parse:function(e){var t=this,r=[0],n=[null],i=[],a=this.table,s="",o=0,l=0,c=0 this.lexer.setInput(e),this.lexer.yy=this.yy,this.yy.lexer=this.lexer,void 0===this.lexer.yylloc&&(this.lexer.yylloc={}) var u=this.lexer.yylloc function f(){var e return"number"!=typeof(e=t.lexer.lex()||1)&&(e=t.symbols_[e]||e),e}i.push(u),"function"==typeof this.yy.parseError&&(this.parseError=this.yy.parseError) -for(var h,p,d,y,m,v,g,b,x,k,w={};;){if(d=r[r.length-1],this.defaultActions[d]?y=this.defaultActions[d]:(null==h&&(h=f()),y=a[d]&&a[d][h]),void 0===y||!y.length||!y[0]){if(!c){for(v in x=[],a[d])this.terminals_[v]&&v>2&&x.push("'"+this.terminals_[v]+"'") +for(var h,p,d,y,m,v,g,x,b,k,w={};;){if(d=r[r.length-1],this.defaultActions[d]?y=this.defaultActions[d]:(null==h&&(h=f()),y=a[d]&&a[d][h]),void 0===y||!y.length||!y[0]){if(!c){for(v in b=[],a[d])this.terminals_[v]&&v>2&&b.push("'"+this.terminals_[v]+"'") var _="" -_=this.lexer.showPosition?"Parse error on line "+(o+1)+":\n"+this.lexer.showPosition()+"\nExpecting "+x.join(", ")+", got '"+this.terminals_[h]+"'":"Parse error on line "+(o+1)+": Unexpected "+(1==h?"end of input":"'"+(this.terminals_[h]||h)+"'"),this.parseError(_,{text:this.lexer.match,token:this.terminals_[h]||h,line:this.lexer.yylineno,loc:u,expected:x})}if(3==c){if(1==h)throw new Error(_||"Parsing halted.") +_=this.lexer.showPosition?"Parse error on line "+(o+1)+":\n"+this.lexer.showPosition()+"\nExpecting "+b.join(", ")+", got '"+this.terminals_[h]+"'":"Parse error on line "+(o+1)+": Unexpected "+(1==h?"end of input":"'"+(this.terminals_[h]||h)+"'"),this.parseError(_,{text:this.lexer.match,token:this.terminals_[h]||h,line:this.lexer.yylineno,loc:u,expected:b})}if(3==c){if(1==h)throw new Error(_||"Parsing halted.") l=this.lexer.yyleng,s=this.lexer.yytext,o=this.lexer.yylineno,u=this.lexer.yylloc,h=f()}for(;!(2..toString()in a[d]);){if(0==d)throw new Error(_||"Parsing halted.") k=1,r.length=r.length-2*k,n.length=n.length-k,i.length=i.length-k,d=r[r.length-1]}p=h,h=2,y=a[d=r[r.length-1]]&&a[d][2],c=3}if(y[0]instanceof Array&&y.length>1)throw new Error("Parse Error: multiple actions possible at state: "+d+", token: "+h) switch(y[0]){case 1:r.push(h),n.push(this.lexer.yytext),i.push(this.lexer.yylloc),r.push(y[1]),h=null,p?(h=p,p=null):(l=this.lexer.yyleng,s=this.lexer.yytext,o=this.lexer.yylineno,u=this.lexer.yylloc,c>0&&c--) break case 2:if(g=this.productions_[y[1]][1],w.$=n[n.length-g],w._$={first_line:i[i.length-(g||1)].first_line,last_line:i[i.length-1].last_line,first_column:i[i.length-(g||1)].first_column,last_column:i[i.length-1].last_column},void 0!==(m=this.performAction.call(w,s,l,o,this.yy,y[1],n,i)))return m -g&&(r=r.slice(0,-1*g*2),n=n.slice(0,-1*g),i=i.slice(0,-1*g)),r.push(this.productions_[y[1]][0]),n.push(w.$),i.push(w._$),b=a[r[r.length-2]][r[r.length-1]],r.push(b) +g&&(r=r.slice(0,-1*g*2),n=n.slice(0,-1*g),i=i.slice(0,-1*g)),r.push(this.productions_[y[1]][0]),n.push(w.$),i.push(w._$),x=a[r[r.length-2]][r[r.length-1]],r.push(x) break case 3:return!0}}return!0}},t=function(){var e={EOF:1,parseError:function(e,t){if(!this.yy.parseError)throw new Error(e) this.yy.parseError(e,t)},setInput:function(e){return this._input=e,this._more=this._less=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this},input:function(){var e=this._input[0] @@ -50,7 +48,7 @@ return e+this.upcomingInput()+"\n"+t+"^"},next:function(){if(this.done)return th var e,t,r,n,i this._input||(this.done=!0),this._more||(this.yytext="",this.match="") for(var a=this._currentRules(),s=0;st[0].length)||(t=r,n=s,this.options.flex));s++);return t?((i=t[0].match(/\n.*/g))&&(this.yylineno+=i.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:i?i[i.length-1].length-1:this.yylloc.last_column+t[0].length},this.yytext+=t[0],this.match+=t[0],this.yyleng=this.yytext.length,this._more=!1,this._input=this._input.slice(t[0].length),this.matched+=t[0],e=this.performAction.call(this,this.yy,this,a[n],this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),e||void 0):""===this._input?this.EOF:void this.parseError("Lexical error on line "+(this.yylineno+1)+". Unrecognized text.\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},lex:function(){var e=this.next() -return void 0!==e?e:this.lex()},begin:function(e){this.conditionStack.push(e)},popState:function(){return this.conditionStack.pop()},_currentRules:function(){return this.conditions[this.conditionStack[this.conditionStack.length-1]].rules},topState:function(){return this.conditionStack[this.conditionStack.length-2]},pushState:function(e){this.begin(e)},options:{},performAction:function(e,t,r){switch(r){case 0:break +return void 0!==e?e:this.lex()},begin:function(e){this.conditionStack.push(e)},popState:function(){return this.conditionStack.pop()},_currentRules:function(){return this.conditions[this.conditionStack[this.conditionStack.length-1]].rules},topState:function(){return this.conditionStack[this.conditionStack.length-2]},pushState:function(e){this.begin(e)},options:{},performAction:function(e,t,r,n){switch(r){case 0:break case 1:return 6 case 2:return t.yytext=t.yytext.substr(1,t.yyleng-2),4 case 3:return 17 @@ -95,7 +93,7 @@ if(f.test(i)){e.eatWhile(f) var a=e.current(),s=h.propertyIsEnumerable(a)&&h[a] return s&&"."!=r.lastType?y(s.type,s.style,a):y("variable","variable",a)}}function v(e,t){for(var r,n=!1;r=e.next();){if("/"==r&&n){t.tokenize=m break}n="*"==r}return y("comment","comment")}function g(e,t){for(var r,n=!1;null!=(r=e.next());){if(!n&&("`"==r||"$"==r&&e.eat("{"))){t.tokenize=m -break}n=!n&&"\\"==r}return y("quasi","string-2",e.current())}function b(e,t){t.fatArrowAt&&(t.fatArrowAt=null) +break}n=!n&&"\\"==r}return y("quasi","string-2",e.current())}function x(e,t){t.fatArrowAt&&(t.fatArrowAt=null) var r=e.string.indexOf("=>",e.start) if(!(r<0)){for(var n=0,i=!1,a=r-1;a>=0;--a){var s=e.string.charAt(a),o="([{}])".indexOf(s) if(o>=0&&o<3){if(!n){++a @@ -103,7 +101,7 @@ break}if(0==--n)break}else if(o>=3&&o<6)++n else if(f.test(s))i=!0 else{if(/["'\/]/.test(s))return if(i&&!n){++a -break}}}i&&!n&&(t.fatArrowAt=a)}}var x={atom:!0,number:!0,variable:!0,string:!0,regexp:!0,this:!0,"jsonld-keyword":!0} +break}}}i&&!n&&(t.fatArrowAt=a)}}var b={atom:!0,number:!0,variable:!0,string:!0,regexp:!0,this:!0,"jsonld-keyword":!0} function k(e,t,r,n,i,a){this.indented=e,this.column=t,this.type=r,this.prev=i,this.info=a,null!=n&&(this.align=n)}function w(e,t){for(var r=e.localVars;r;r=r.next)if(r.name==t)return!0 for(var n=e.context;n;n=n.prev)for(r=n.vars;r;r=r.next)if(r.name==t)return!0}var _={state:null,column:null,marked:null,cc:null} function E(){for(var e=arguments.length-1;e>=0;e--)_.cc.push(arguments[e])}function j(){return E.apply(null,arguments),!0}function S(e){function t(t){for(var r=t;r;r=r.next)if(r.name==e)return!0 @@ -119,15 +117,15 @@ return r.lex=!0,r}function N(){var e=_.state e.lexical.prev&&(")"==e.lexical.type&&(e.indented=e.lexical.indented),e.lexical=e.lexical.prev)}function O(e){return function t(r){return r==e?j():";"==e?E():j(t)}}function V(e,t){return"var"==e?j(M("vardef",t.length),ae,O(";"),N):"keyword a"==e?j(M("form"),T,V,N):"keyword b"==e?j(M("form"),V,N):"{"==e?j(M("}"),ee,N):";"==e?j():"if"==e?("else"==_.state.lexical.info&&_.state.cc[_.state.cc.length-1]==N&&_.state.cc.pop()(),j(M("form"),T,V,N,ue)):"function"==e?j(me):"for"==e?j(M("form"),fe,V,N):"variable"==e?j(M("stat"),D):"switch"==e?j(M("form"),T,M("}","switch"),O("{"),ee,N,N):"case"==e?j(T,O(":")):"default"==e?j(O(":")):"catch"==e?j(M("form"),$,O("("),ve,O(")"),V,N,A):"class"==e?j(M("form"),ge,N):"export"==e?j(M("stat"),we,N):"import"==e?j(M("stat"),_e,N):"module"==e?j(M("form"),se,M("}"),O("{"),ee,N,N):"async"==e?j(V):E(M("stat"),T,O(";"),N)}function T(e){return L(e,!1)}function z(e){return L(e,!0)}function L(e,t){if(_.state.fatArrowAt==_.stream.start){var r=t?W:C if("("==e)return j($,M(")"),Y(se,")"),N,O("=>"),r,A) if("variable"==e)return E($,se,O("=>"),r,A)}var n=t?F:J -return x.hasOwnProperty(e)?j(n):"function"==e?j(me,n):"keyword c"==e?j(t?P:q):"("==e?j(M(")"),q,Ae,O(")"),N,n):"operator"==e||"spread"==e?j(t?z:T):"["==e?j(M("]"),Ie,N,n):"{"==e?Z(K,"}",null,n):"quasi"==e?E(U,n):"new"==e?j(function(e){return function(t){return"."==t?j(e?G:B):E(e?z:T)}}(t)):j()}function q(e){return e.match(/[;\}\)\],]/)?E():E(T)}function P(e){return e.match(/[;\}\)\],]/)?E():E(z)}function J(e,t){return","==e?j(T):F(e,t,!1)}function F(e,t,r){var n=0==r?J:F,i=0==r?T:z -return"=>"==e?j($,r?W:C,A):"operator"==e?/\+\+|--/.test(t)?j(n):"?"==t?j(T,O(":"),i):j(i):"quasi"==e?E(U,n):";"!=e?"("==e?Z(z,")","call",n):"."==e?j(H,n):"["==e?j(M("]"),q,O("]"),N,n):void 0:void 0}function U(e,t){return"quasi"!=e?E():"${"!=t.slice(t.length-2)?j(U):j(T,R)}function R(e){if("}"==e)return _.marked="string-2",_.state.tokenize=g,j(U)}function C(e){return b(_.stream,_.state),E("{"==e?V:T)}function W(e){return b(_.stream,_.state),E("{"==e?V:z)}function B(e,t){if("target"==t)return _.marked="keyword",j(J)}function G(e,t){if("target"==t)return _.marked="keyword",j(F)}function D(e){return":"==e?j(N,V):E(J,O(";"),N)}function H(e){if("variable"==e)return _.marked="property",j()}function K(e,t){return"variable"==e||"keyword"==_.style?(_.marked="property",j("get"==t||"set"==t?Q:X)):"number"==e||"string"==e?(_.marked=l?"property":_.style+" property",j(X)):"jsonld-keyword"==e?j(X):"modifier"==e?j(K):"["==e?j(T,O("]"),X):"spread"==e?j(T):void 0}function Q(e){return"variable"!=e?E(X):(_.marked="property",j(me))}function X(e){return":"==e?j(z):"("==e?E(me):void 0}function Y(e,t){function r(n,i){if(","==n){var a=_.state.lexical +return b.hasOwnProperty(e)?j(n):"function"==e?j(me,n):"keyword c"==e?j(t?P:q):"("==e?j(M(")"),q,Ae,O(")"),N,n):"operator"==e||"spread"==e?j(t?z:T):"["==e?j(M("]"),Ie,N,n):"{"==e?Z(K,"}",null,n):"quasi"==e?E(U,n):"new"==e?j(function(e){return function(t){return"."==t?j(e?G:B):E(e?z:T)}}(t)):j()}function q(e){return e.match(/[;\}\)\],]/)?E():E(T)}function P(e){return e.match(/[;\}\)\],]/)?E():E(z)}function J(e,t){return","==e?j(T):F(e,t,!1)}function F(e,t,r){var n=0==r?J:F,i=0==r?T:z +return"=>"==e?j($,r?W:C,A):"operator"==e?/\+\+|--/.test(t)?j(n):"?"==t?j(T,O(":"),i):j(i):"quasi"==e?E(U,n):";"!=e?"("==e?Z(z,")","call",n):"."==e?j(H,n):"["==e?j(M("]"),q,O("]"),N,n):void 0:void 0}function U(e,t){return"quasi"!=e?E():"${"!=t.slice(t.length-2)?j(U):j(T,R)}function R(e){if("}"==e)return _.marked="string-2",_.state.tokenize=g,j(U)}function C(e){return x(_.stream,_.state),E("{"==e?V:T)}function W(e){return x(_.stream,_.state),E("{"==e?V:z)}function B(e,t){if("target"==t)return _.marked="keyword",j(J)}function G(e,t){if("target"==t)return _.marked="keyword",j(F)}function D(e){return":"==e?j(N,V):E(J,O(";"),N)}function H(e){if("variable"==e)return _.marked="property",j()}function K(e,t){return"variable"==e||"keyword"==_.style?(_.marked="property",j("get"==t||"set"==t?Q:X)):"number"==e||"string"==e?(_.marked=l?"property":_.style+" property",j(X)):"jsonld-keyword"==e?j(X):"modifier"==e?j(K):"["==e?j(T,O("]"),X):"spread"==e?j(T):void 0}function Q(e){return"variable"!=e?E(X):(_.marked="property",j(me))}function X(e){return":"==e?j(z):"("==e?E(me):void 0}function Y(e,t){function r(n,i){if(","==n){var a=_.state.lexical return"call"==a.info&&(a.pos=(a.pos||0)+1),j(e,r)}return n==t||i==t?j():j(O(t))}return function(n,i){return n==t||i==t?j():E(e,r)}}function Z(e,t,r){for(var n=3;n"),ie):"["==e?j(O("]"),ie):void 0}function ae(){return E(se,te,le,ce)}function se(e,t){return"modifier"==e?j(se):"variable"==e?(S(t),j()):"spread"==e?j(se):"["==e?Z(se,"]"):"{"==e?Z(oe,"}"):void 0}function oe(e,t){return"variable"!=e||_.stream.match(/^\s*:/,!1)?("variable"==e&&(_.marked="property"),"spread"==e?j(se):"}"==e?E():j(O(":"),se,le)):(S(t),j(le))}function le(e,t){if("="==t)return j(z)}function ce(e){if(","==e)return j(ae)}function ue(e,t){if("keyword b"==e&&"else"==t)return j(M("form","else"),V,N)}function fe(e){if("("==e)return j(M(")"),he,O(")"),N)}function he(e){return"var"==e?j(ae,O(";"),de):";"==e?j(de):"variable"==e?j(pe):E(T,O(";"),de)}function pe(e,t){return"in"==t||"of"==t?(_.marked="keyword",j(T)):j(J,de)}function de(e,t){return";"==e?j(ye):"in"==t||"of"==t?(_.marked="keyword",j(T)):E(T,O(";"),ye)}function ye(e){")"!=e&&j(T)}function me(e,t){return"*"==t?(_.marked="keyword",j(me)):"variable"==e?(S(t),j(me)):"("==e?j($,M(")"),Y(ve,")"),N,te,V,A):void 0}function ve(e){return"spread"==e?j(ve):E(se,te,re)}function ge(e,t){if("variable"==e)return S(t),j(be)}function be(e,t){return"extends"==t?j(T,be):"{"==e?j(M("}"),xe,N):void 0}function xe(e,t){return"variable"==e||"keyword"==_.style?"static"==t?(_.marked="keyword",j(xe)):(_.marked="property","get"==t||"set"==t?j(ke,me,xe):j(me,xe)):"*"==t?(_.marked="keyword",j(xe)):";"==e?j(xe):"}"==e?j():void 0}function ke(e){return"variable"!=e?E():(_.marked="property",j())}function we(e,t){return"*"==t?(_.marked="keyword",j(Se,O(";"))):"default"==t?(_.marked="keyword",j(T,O(";"))):E(V)}function _e(e){return"string"==e?j():E(Ee,Se)}function Ee(e,t){return"{"==e?Z(Ee,"}"):("variable"==e&&S(t),"*"==t&&(_.marked="keyword"),j(je))}function je(e,t){if("as"==t)return _.marked="keyword",j(Ee)}function Se(e,t){if("from"==t)return _.marked="keyword",j(T)}function Ie(e){return"]"==e?j():E(z,$e)}function $e(e){return"for"==e?E(Ae,O("]")):","==e?j(Y(P,"]")):E(Y(z,"]"))}function Ae(e){return"for"==e?j(fe,Ae):"if"==e?j(T,Ae):void 0}return N.lex=!0,{startState:function(e){var t={tokenize:m,lastType:"sof",cc:[],lexical:new k((e||0)-s,0,"block",!1),localVars:n.localVars,context:n.localVars&&{vars:n.localVars},indented:e||0} -return n.globalVars&&"object"==typeof n.globalVars&&(t.globalVars=n.globalVars),t},token:function(e,t){if(e.sol()&&(t.lexical.hasOwnProperty("align")||(t.lexical.align=!1),t.indented=e.indentation(),b(e,t)),t.tokenize!=v&&e.eatSpace())return null +return j(M(t,r),Y(e,t),N)}function ee(e){return"}"==e?j():E(V,ee)}function te(e){if(u&&":"==e)return j(ne)}function re(e,t){if("="==t)return j(z)}function ne(e){if("variable"==e)return _.marked="variable-3",j(ie)}function ie(e,t){return"<"==t?j(Y(ne,">"),ie):"["==e?j(O("]"),ie):void 0}function ae(){return E(se,te,le,ce)}function se(e,t){return"modifier"==e?j(se):"variable"==e?(S(t),j()):"spread"==e?j(se):"["==e?Z(se,"]"):"{"==e?Z(oe,"}"):void 0}function oe(e,t){return"variable"!=e||_.stream.match(/^\s*:/,!1)?("variable"==e&&(_.marked="property"),"spread"==e?j(se):"}"==e?E():j(O(":"),se,le)):(S(t),j(le))}function le(e,t){if("="==t)return j(z)}function ce(e){if(","==e)return j(ae)}function ue(e,t){if("keyword b"==e&&"else"==t)return j(M("form","else"),V,N)}function fe(e){if("("==e)return j(M(")"),he,O(")"),N)}function he(e){return"var"==e?j(ae,O(";"),de):";"==e?j(de):"variable"==e?j(pe):E(T,O(";"),de)}function pe(e,t){return"in"==t||"of"==t?(_.marked="keyword",j(T)):j(J,de)}function de(e,t){return";"==e?j(ye):"in"==t||"of"==t?(_.marked="keyword",j(T)):E(T,O(";"),ye)}function ye(e){")"!=e&&j(T)}function me(e,t){return"*"==t?(_.marked="keyword",j(me)):"variable"==e?(S(t),j(me)):"("==e?j($,M(")"),Y(ve,")"),N,te,V,A):void 0}function ve(e){return"spread"==e?j(ve):E(se,te,re)}function ge(e,t){if("variable"==e)return S(t),j(xe)}function xe(e,t){return"extends"==t?j(T,xe):"{"==e?j(M("}"),be,N):void 0}function be(e,t){return"variable"==e||"keyword"==_.style?"static"==t?(_.marked="keyword",j(be)):(_.marked="property","get"==t||"set"==t?j(ke,me,be):j(me,be)):"*"==t?(_.marked="keyword",j(be)):";"==e?j(be):"}"==e?j():void 0}function ke(e){return"variable"!=e?E():(_.marked="property",j())}function we(e,t){return"*"==t?(_.marked="keyword",j(Se,O(";"))):"default"==t?(_.marked="keyword",j(T,O(";"))):E(V)}function _e(e){return"string"==e?j():E(Ee,Se)}function Ee(e,t){return"{"==e?Z(Ee,"}"):("variable"==e&&S(t),"*"==t&&(_.marked="keyword"),j(je))}function je(e,t){if("as"==t)return _.marked="keyword",j(Ee)}function Se(e,t){if("from"==t)return _.marked="keyword",j(T)}function Ie(e){return"]"==e?j():E(z,$e)}function $e(e){return"for"==e?E(Ae,O("]")):","==e?j(Y(P,"]")):E(Y(z,"]"))}function Ae(e){return"for"==e?j(fe,Ae):"if"==e?j(T,Ae):void 0}return N.lex=!0,{startState:function(e){var t={tokenize:m,lastType:"sof",cc:[],lexical:new k((e||0)-s,0,"block",!1),localVars:n.localVars,context:n.localVars&&{vars:n.localVars},indented:e||0} +return n.globalVars&&"object"==typeof n.globalVars&&(t.globalVars=n.globalVars),t},token:function(e,t){if(e.sol()&&(t.lexical.hasOwnProperty("align")||(t.lexical.align=!1),t.indented=e.indentation(),x(e,t)),t.tokenize!=v&&e.eatSpace())return null var r=t.tokenize(e,t) return"comment"==i?r:(t.lastType="operator"!=i||"++"!=a&&"--"!=a?i:"incdec",function(e,t,r,n,i){var a=e.cc -for(_.state=e,_.stream=i,_.marked=null,_.cc=a,_.style=t,e.lexical.hasOwnProperty("align")||(e.lexical.align=!0);;){if((a.length?a.pop():c?T:V)(r,n)){for(;a.length&&a[a.length-1].lex;)a.pop()() -return _.marked?_.marked:"variable"==r&&w(e,n)?"variable-2":t}}}(t,r,i,a,e))},indent:function(t,r){if(t.tokenize==v)return e.Pass +for(_.state=e,_.stream=i,_.marked=null,_.cc=a,_.style=t,e.lexical.hasOwnProperty("align")||(e.lexical.align=!0);;)if((a.length?a.pop():c?T:V)(r,n)){for(;a.length&&a[a.length-1].lex;)a.pop()() +return _.marked?_.marked:"variable"==r&&w(e,n)?"variable-2":t}}(t,r,i,a,e))},indent:function(t,r){if(t.tokenize==v)return e.Pass if(t.tokenize!=m)return 0 var i=r&&r.charAt(0),a=t.lexical if(!/^\s*else\b/.test(r))for(var l=t.cc.length-1;l>=0;--l){var c=t.cc[l] diff --git a/agent/uiserver/dist/assets/codemirror/mode/ruby/ruby-ea43ca3a3bdd63a52811e8464d66134b.js b/agent/uiserver/dist/assets/codemirror/mode/ruby/ruby-2b9a2a4b4d14d9fa6f6edcda84a260e6.js similarity index 100% rename from agent/uiserver/dist/assets/codemirror/mode/ruby/ruby-ea43ca3a3bdd63a52811e8464d66134b.js rename to agent/uiserver/dist/assets/codemirror/mode/ruby/ruby-2b9a2a4b4d14d9fa6f6edcda84a260e6.js diff --git a/agent/uiserver/dist/assets/codemirror/mode/xml/xml-10ec8b8cc61ef0fbd25b27a599fdcd60.js b/agent/uiserver/dist/assets/codemirror/mode/xml/xml-80f64aaafa6af7844d14f32f3219bb26.js similarity index 60% rename from agent/uiserver/dist/assets/codemirror/mode/xml/xml-10ec8b8cc61ef0fbd25b27a599fdcd60.js rename to agent/uiserver/dist/assets/codemirror/mode/xml/xml-80f64aaafa6af7844d14f32f3219bb26.js index 74180b6c481..5e22e0e2c32 100644 --- a/agent/uiserver/dist/assets/codemirror/mode/xml/xml-10ec8b8cc61ef0fbd25b27a599fdcd60.js +++ b/agent/uiserver/dist/assets/codemirror/mode/xml/xml-80f64aaafa6af7844d14f32f3219bb26.js @@ -4,21 +4,21 @@ t.defineMode("xml",(function(r,o){var a,i,l=r.indentUnit,u={},d=o.htmlMode?e:n for(var c in d)u[c]=d[c] for(var c in o)u[c]=o[c] function s(t,e){function n(n){return e.tokenize=n,n(t,e)}var r=t.next() -return"<"==r?t.eat("!")?t.eat("[")?t.match("CDATA[")?n(m("atom","]]>")):null:t.match("--")?n(m("comment","--\x3e")):t.match("DOCTYPE",!0,!0)?(t.eatWhile(/[\w\._\-]/),n(function t(e){return function(n,r){for(var o;null!=(o=n.next());){if("<"==o)return r.tokenize=t(e+1),r.tokenize(n,r) -if(">"==o){if(1==e){r.tokenize=s -break}return r.tokenize=t(e-1),r.tokenize(n,r)}}return"meta"}}(1))):null:t.eat("?")?(t.eatWhile(/[\w\._\-]/),e.tokenize=m("meta","?>"),"meta"):(a=t.eat("/")?"closeTag":"openTag",e.tokenize=f,"tag bracket"):"&"==r?(t.eat("#")?t.eat("x")?t.eatWhile(/[a-fA-F\d]/)&&t.eat(";"):t.eatWhile(/[\d]/)&&t.eat(";"):t.eatWhile(/[\w\.\-:]/)&&t.eat(";"))?"atom":"error":(t.eatWhile(/[^&<]/),null)}function f(t,e){var n,r,o=t.next() +return"<"==r?t.eat("!")?t.eat("[")?t.match("CDATA[")?n(m("atom","]]>")):null:t.match("--")?n(m("comment","--\x3e")):t.match("DOCTYPE",!0,!0)?(t.eatWhile(/[\w\._\-]/),n(g(1))):null:t.eat("?")?(t.eatWhile(/[\w\._\-]/),e.tokenize=m("meta","?>"),"meta"):(a=t.eat("/")?"closeTag":"openTag",e.tokenize=f,"tag bracket"):"&"==r?(t.eat("#")?t.eat("x")?t.eatWhile(/[a-fA-F\d]/)&&t.eat(";"):t.eatWhile(/[\d]/)&&t.eat(";"):t.eatWhile(/[\w\.\-:]/)&&t.eat(";"))?"atom":"error":(t.eatWhile(/[^&<]/),null)}function f(t,e){var n,r,o=t.next() if(">"==o||"/"==o&&t.eat(">"))return e.tokenize=s,a=">"==o?"endTag":"selfcloseTag","tag bracket" if("="==o)return a="equals",null -if("<"==o){e.tokenize=s,e.state=x,e.tagName=e.tagStart=null +if("<"==o){e.tokenize=s,e.state=b,e.tagName=e.tagStart=null var i=e.tokenize(t,e) -return i?i+" tag error":"tag error"}return/[\'\"]/.test(o)?(e.tokenize=(n=o,(r=function(t,e){for(;!t.eol();)if(t.next()==n){e.tokenize=f -break}return"string"}).isInAttribute=!0,r),e.stringStartCol=t.column(),e.tokenize(t,e)):(t.match(/^[^\s\u00a0=<>\"\']*[^\s\u00a0=<>\"\'\/]/),"word")}function m(t,e){return function(n,r){for(;!n.eol();){if(n.match(e)){r.tokenize=s -break}n.next()}return t}}function g(t,e,n){this.prev=t.context,this.tagName=e,this.indent=t.indented,this.startOfLine=n,(u.doNotIndent.hasOwnProperty(e)||t.context&&t.context.noIndent)&&(this.noIndent=!0)}function p(t){t.context&&(t.context=t.context.prev)}function h(t,e){for(var n;;){if(!t.context)return +return i?i+" tag error":"tag error"}return/[\'\"]/.test(o)?(e.tokenize=(n=o,r=function(t,e){for(;!t.eol();)if(t.next()==n){e.tokenize=f +break}return"string"},r.isInAttribute=!0,r),e.stringStartCol=t.column(),e.tokenize(t,e)):(t.match(/^[^\s\u00a0=<>\"\']*[^\s\u00a0=<>\"\'\/]/),"word")}function m(t,e){return function(n,r){for(;!n.eol();){if(n.match(e)){r.tokenize=s +break}n.next()}return t}}function g(t){return function(e,n){for(var r;null!=(r=e.next());){if("<"==r)return n.tokenize=g(t+1),n.tokenize(e,n) +if(">"==r){if(1==t){n.tokenize=s +break}return n.tokenize=g(t-1),n.tokenize(e,n)}}return"meta"}}function p(t,e,n){this.prev=t.context,this.tagName=e,this.indent=t.indented,this.startOfLine=n,(u.doNotIndent.hasOwnProperty(e)||t.context&&t.context.noIndent)&&(this.noIndent=!0)}function h(t){t.context&&(t.context=t.context.prev)}function x(t,e){for(var n;;){if(!t.context)return if(n=t.context.tagName,!u.contextGrabbers.hasOwnProperty(n)||!u.contextGrabbers[n].hasOwnProperty(e))return -p(t)}}function x(t,e,n){return"openTag"==t?(n.tagStart=e.column(),b):"closeTag"==t?k:x}function b(t,e,n){return"word"==t?(n.tagName=e.current(),i="tag",y):(i="error",b)}function k(t,e,n){if("word"==t){var r=e.current() -return n.context&&n.context.tagName!=r&&u.implicitlyClosed.hasOwnProperty(n.context.tagName)&&p(n),n.context&&n.context.tagName==r||!1===u.matchClosing?(i="tag",w):(i="tag error",v)}return i="error",v}function w(t,e,n){return"endTag"!=t?(i="error",w):(p(n),x)}function v(t,e,n){return i="error",w(t,0,n)}function y(t,e,n){if("word"==t)return i="attribute",z +h(t)}}function b(t,e,n){return"openTag"==t?(n.tagStart=e.column(),k):"closeTag"==t?w:b}function k(t,e,n){return"word"==t?(n.tagName=e.current(),i="tag",z):(i="error",k)}function w(t,e,n){if("word"==t){var r=e.current() +return n.context&&n.context.tagName!=r&&u.implicitlyClosed.hasOwnProperty(n.context.tagName)&&h(n),n.context&&n.context.tagName==r||!1===u.matchClosing?(i="tag",v):(i="tag error",y)}return i="error",y}function v(t,e,n){return"endTag"!=t?(i="error",v):(h(n),b)}function y(t,e,n){return i="error",v(t,0,n)}function z(t,e,n){if("word"==t)return i="attribute",N if("endTag"==t||"selfcloseTag"==t){var r=n.tagName,o=n.tagStart -return n.tagName=n.tagStart=null,"selfcloseTag"==t||u.autoSelfClosers.hasOwnProperty(r)?h(n,r):(h(n,r),n.context=new g(n,r,o==n.indented)),x}return i="error",y}function z(t,e,n){return"equals"==t?N:(u.allowMissing||(i="error"),y(t,0,n))}function N(t,e,n){return"string"==t?T:"word"==t&&u.allowUnquoted?(i="string",y):(i="error",y(t,0,n))}function T(t,e,n){return"string"==t?T:y(t,0,n)}return s.isInText=!0,{startState:function(t){var e={tokenize:s,state:x,indented:t||0,tagName:null,tagStart:null,context:null} +return n.tagName=n.tagStart=null,"selfcloseTag"==t||u.autoSelfClosers.hasOwnProperty(r)?x(n,r):(x(n,r),n.context=new p(n,r,o==n.indented)),b}return i="error",z}function N(t,e,n){return"equals"==t?T:(u.allowMissing||(i="error"),z(t,0,n))}function T(t,e,n){return"string"==t?C:"word"==t&&u.allowUnquoted?(i="string",z):(i="error",z(t,0,n))}function C(t,e,n){return"string"==t?C:z(t,0,n)}return s.isInText=!0,{startState:function(t){var e={tokenize:s,state:b,indented:t||0,tagName:null,tagStart:null,context:null} return null!=t&&(e.baseIndent=t),e},token:function(t,e){if(!e.tagName&&t.sol()&&(e.indented=t.indentation()),t.eatSpace())return null a=null var n=e.tokenize(t,e) @@ -34,4 +34,4 @@ break}if(!u.implicitlyClosed.hasOwnProperty(o.tagName))break o=o.prev}else if(a)for(;o;){var i=u.contextGrabbers[o.tagName] if(!i||!i.hasOwnProperty(a[2]))break o=o.prev}for(;o&&o.prev&&!o.startOfLine;)o=o.prev -return o?o.indent+l:e.baseIndent||0},electricInput:/<\/[\s\w:]+>$/,blockCommentStart:"\x3c!--",blockCommentEnd:"--\x3e",configuration:u.htmlMode?"html":"xml",helperType:u.htmlMode?"html":"xml",skipAttribute:function(t){t.state==N&&(t.state=y)}}})),t.defineMIME("text/xml","xml"),t.defineMIME("application/xml","xml"),t.mimeModes.hasOwnProperty("text/html")||t.defineMIME("text/html",{name:"xml",htmlMode:!0})})) +return o?o.indent+l:e.baseIndent||0},electricInput:/<\/[\s\w:]+>$/,blockCommentStart:"\x3c!--",blockCommentEnd:"--\x3e",configuration:u.htmlMode?"html":"xml",helperType:u.htmlMode?"html":"xml",skipAttribute:function(t){t.state==T&&(t.state=z)}}})),t.defineMIME("text/xml","xml"),t.defineMIME("application/xml","xml"),t.mimeModes.hasOwnProperty("text/html")||t.defineMIME("text/html",{name:"xml",htmlMode:!0})})) diff --git a/agent/uiserver/dist/assets/codemirror/mode/yaml/yaml-3f129a000349e3075be0f65719884b61.js b/agent/uiserver/dist/assets/codemirror/mode/yaml/yaml-39582b60e653cf0b8d42292ddfabefb2.js similarity index 89% rename from agent/uiserver/dist/assets/codemirror/mode/yaml/yaml-3f129a000349e3075be0f65719884b61.js rename to agent/uiserver/dist/assets/codemirror/mode/yaml/yaml-39582b60e653cf0b8d42292ddfabefb2.js index b01cbab2418..a52cfdfb93f 100644 --- a/agent/uiserver/dist/assets/codemirror/mode/yaml/yaml-3f129a000349e3075be0f65719884b61.js +++ b/agent/uiserver/dist/assets/codemirror/mode/yaml/yaml-39582b60e653cf0b8d42292ddfabefb2.js @@ -194,44 +194,44 @@ var i=ve(e,n) if("function"!=typeof t)return i for(var r=0,o=i.length;r=55296&&i<=56319&&t+1=56320&&n<=57343?1024*(i-55296)+n-56320+65536:i}function De(e){return/^\n* /.test(e)}function Ue(e,t,n,i,r,o,a,l){var c,s,u=0,p=null,f=!1,d=!1,h=-1!==i,m=-1,g=Le(s=_e(e,0))&&65279!==s&&!Me(s)&&45!==s&&63!==s&&58!==s&&44!==s&&91!==s&&93!==s&&123!==s&&125!==s&&35!==s&&38!==s&&42!==s&&33!==s&&124!==s&&61!==s&&62!==s&&39!==s&&34!==s&&37!==s&&64!==s&&96!==s&&function(e){return!Me(e)&&58!==e}(_e(e,e.length-1)) -if(t||a)for(c=0;c=65536?c+=2:c++){if(!Le(u=_e(e,c)))return 5 -g=g&&Fe(u,p,l),p=u}else{for(c=0;c=65536?c+=2:c++){if(10===(u=_e(e,c)))f=!0,h&&(d=d||c-m-1>i&&" "!==e[m+1],m=c) -else if(!Le(u))return 5 -g=g&&Fe(u,p,l),p=u}d=d||h&&c-m-1>i&&" "!==e[m+1]}return f||d?n>9&&De(e)?5:a?2===o?5:2:d?4:3:!g||a||r(e)?2===o?5:2:1}function qe(e,t,n,i,r){e.dump=function(){if(0===t.length)return 2===e.quotingType?'""':"''" -if(!e.noCompatMode&&(-1!==Ie.indexOf(t)||Se.test(t)))return 2===e.quotingType?'"'+t+'"':"'"+t+"'" +return n}(this.schema,e.styles||null),this.sortKeys=e.sortKeys||!1,this.lineWidth=e.lineWidth||80,this.noRefs=e.noRefs||!1,this.noCompatMode=e.noCompatMode||!1,this.condenseFlow=e.condenseFlow||!1,this.quotingType='"'===e.quotingType?2:1,this.forceQuotes=e.forceQuotes||!1,this.replacer="function"==typeof e.replacer?e.replacer:null,this.implicitTypes=this.schema.compiledImplicit,this.explicitTypes=this.schema.compiledExplicit,this.tag=null,this.result="",this.duplicates=[],this.usedDuplicates=null}function Ee(e,t){for(var i,r=n.repeat(" ",t),o=0,a=-1,l="",c=e.length;o=55296&&i<=56319&&t+1=56320&&n<=57343?1024*(i-55296)+n-56320+65536:i}function Ue(e){return/^\n* /.test(e)}function qe(e,t,n,i,r,o,a,l){var c,s,u=0,p=null,f=!1,d=!1,h=-1!==i,m=-1,g=Ne(s=De(e,0))&&s!==xe&&!Le(s)&&45!==s&&63!==s&&58!==s&&44!==s&&91!==s&&93!==s&&123!==s&&125!==s&&35!==s&&38!==s&&42!==s&&33!==s&&124!==s&&61!==s&&62!==s&&39!==s&&34!==s&&37!==s&&64!==s&&96!==s&&function(e){return!Le(e)&&58!==e}(De(e,e.length-1)) +if(t||a)for(c=0;c=65536?c+=2:c++){if(!Ne(u=De(e,c)))return 5 +g=g&&_e(u,p,l),p=u}else{for(c=0;c=65536?c+=2:c++){if(10===(u=De(e,c)))f=!0,h&&(d=d||c-m-1>i&&" "!==e[m+1],m=c) +else if(!Ne(u))return 5 +g=g&&_e(u,p,l),p=u}d=d||h&&c-m-1>i&&" "!==e[m+1]}return f||d?n>9&&Ue(e)?5:a?2===o?5:2:d?4:3:!g||a||r(e)?2===o?5:2:1}function Ye(e,t,n,i,r){e.dump=function(){if(0===t.length)return 2===e.quotingType?'""':"''" +if(!e.noCompatMode&&(-1!==Se.indexOf(t)||Oe.test(t)))return 2===e.quotingType?'"'+t+'"':"'"+t+"'" var a=e.indent*Math.max(1,n),l=-1===e.lineWidth?-1:Math.max(Math.min(e.lineWidth,40),e.lineWidth-a),c=i||e.flowLevel>-1&&n>=e.flowLevel -switch(Ue(t,c,e.indent,l,(function(t){return function(e,t){var n,i +switch(qe(t,c,e.indent,l,(function(t){return function(e,t){var n,i for(n=0,i=e.implicitTypes.length;n"+Ye(t,e.indent)+Pe(Te(function(e,t){var n,i,r=/(\n+)([^\n]*)/g,o=(l=e.indexOf("\n"),l=-1!==l?l:e.length,r.lastIndex=l,Re(e.slice(0,l),t)),a="\n"===e[0]||" "===e[0] +case 3:return"|"+Pe(t,e.indent)+Re(Ee(t,a)) +case 4:return">"+Pe(t,e.indent)+Re(Ee(function(e,t){var n,i,r=/(\n+)([^\n]*)/g,o=(l=e.indexOf("\n"),l=-1!==l?l:e.length,r.lastIndex=l,$e(e.slice(0,l),t)),a="\n"===e[0]||" "===e[0] var l for(;i=r.exec(e);){var c=i[1],s=i[2] -n=" "===s[0],o+=c+(a||n||""===s?"":"\n")+Re(s,t),a=n}return o}(t,l),a)) -case 5:return'"'+function(e){for(var t,n="",i=0,r=0;r=65536?r+=2:r++)i=_e(e,r),!(t=xe[i])&&Le(i)?(n+=e[r],i>=65536&&(n+=e[r+1])):n+=t||Oe(i) +n=" "===s[0],o+=c+(a||n||""===s?"":"\n")+$e(s,t),a=n}return o}(t,l),a)) +case 5:return'"'+function(e){for(var t,n="",i=0,r=0;r=65536?r+=2:r++)i=De(e,r),!(t=Ie[i])&&Ne(i)?(n+=e[r],i>=65536&&(n+=e[r+1])):n+=t||je(i) return n}(t)+'"' -default:throw new o("impossible error: invalid scalar style")}}()}function Ye(e,t){var n=De(e)?String(t):"",i="\n"===e[e.length-1] -return n+(i&&("\n"===e[e.length-2]||"\n"===e)?"+":i?"":"-")+"\n"}function Pe(e){return"\n"===e[e.length-1]?e.slice(0,-1):e}function Re(e,t){if(""===e||" "===e[0])return e +default:throw new o("impossible error: invalid scalar style")}}()}function Pe(e,t){var n=Ue(e)?String(t):"",i="\n"===e[e.length-1] +return n+(i&&("\n"===e[e.length-2]||"\n"===e)?"+":i?"":"-")+"\n"}function Re(e){return"\n"===e[e.length-1]?e.slice(0,-1):e}function $e(e,t){if(""===e||" "===e[0])return e for(var n,i,r=/ [^ ]/g,o=0,a=0,l=0,c="";n=r.exec(e);)(l=n.index)-o>t&&(i=a>o?a:l,c+="\n"+e.slice(o,i),o=i+1),a=l -return c+="\n",e.length-o>t&&a>o?c+=e.slice(o,a)+"\n"+e.slice(a+1):c+=e.slice(o),c.slice(1)}function $e(e,t,n,i){var r,o,a,l="",c=e.tag -for(r=0,o=n.length;rt&&a>o?c+=e.slice(o,a)+"\n"+e.slice(a+1):c+=e.slice(o),c.slice(1)}function Be(e,t,n,i){var r,o,a,l="",c=e.tag +for(r=0,o=n.length;r tag resolver accepts not "'+s+'" style') -i=c.represent[s](t,s)}e.dump=i}return!0}return!1}function Ke(e,t,n,i,r,a,l){e.tag=null,e.dump=n,Be(e,n,!1)||Be(e,n,!0) +i=c.represent[s](t,s)}e.dump=i}return!0}return!1}function We(e,t,n,i,r,a,l){e.tag=null,e.dump=n,Ke(e,n,!1)||Ke(e,n,!0) var c,s=we.call(e.dump),u=i i&&(i=e.flowLevel<0||e.flowLevel>t) var p,f,d="[object Object]"===s||"[object Array]"===s @@ -240,25 +240,25 @@ else{if(d&&f&&!e.usedDuplicates[p]&&(e.usedDuplicates[p]=!0),"[object Object]"== if(!0===e.sortKeys)d.sort() else if("function"==typeof e.sortKeys)d.sort(e.sortKeys) else if(e.sortKeys)throw new o("sortKeys must be a boolean or a function") -for(r=0,a=d.length;r1024)&&(e.dump&&10===e.dump.charCodeAt(0)?u+="?":u+="? "),u+=e.dump,s&&(u+=Ee(e,t)),Ke(e,t+1,c,!0,s)&&(e.dump&&10===e.dump.charCodeAt(0)?u+=":":u+=": ",p+=u+=e.dump)) +for(r=0,a=d.length;r1024)&&(e.dump&&10===e.dump.charCodeAt(0)?u+="?":u+="? "),u+=e.dump,s&&(u+=Me(e,t)),We(e,t+1,c,!0,s)&&(e.dump&&10===e.dump.charCodeAt(0)?u+=":":u+=": ",p+=u+=e.dump)) e.tag=f,e.dump=p||"{}"}(e,t,e.dump,r),f&&(e.dump="&ref_"+p+e.dump)):(function(e,t,n){var i,r,o,a,l,c="",s=e.tag,u=Object.keys(n) -for(i=0,r=u.length;i1024&&(l+="? "),l+=e.dump+(e.condenseFlow?'"':"")+":"+(e.condenseFlow?"":" "),Ke(e,t,a,!1,!1)&&(c+=l+=e.dump)) +for(i=0,r=u.length;i1024&&(l+="? "),l+=e.dump+(e.condenseFlow?'"':"")+":"+(e.condenseFlow?"":" "),We(e,t,a,!1,!1)&&(c+=l+=e.dump)) e.tag=s,e.dump="{"+c+"}"}(e,t,e.dump),f&&(e.dump="&ref_"+p+" "+e.dump)) -else if("[object Array]"===s)i&&0!==e.dump.length?(e.noArrayIndent&&!l&&t>0?$e(e,t-1,e.dump,r):$e(e,t,e.dump,r),f&&(e.dump="&ref_"+p+e.dump)):(function(e,t,n){var i,r,o,a="",l=e.tag -for(i=0,r=n.length;i0?Be(e,t-1,e.dump,r):Be(e,t,e.dump,r),f&&(e.dump="&ref_"+p+e.dump)):(function(e,t,n){var i,r,o,a="",l=e.tag +for(i=0,r=n.length;i",e.dump=c+" "+e.dump)}return!0}function We(e,t){var n,i,r=[],o=[] -for(function e(t,n,i){var r,o,a -if(null!==t&&"object"==typeof t)if(-1!==(o=n.indexOf(t)))-1===i.indexOf(o)&&i.push(o) -else if(n.push(t),Array.isArray(t))for(o=0,a=t.length;o",e.dump=c+" "+e.dump)}return!0}function He(e,t){var n,i,r=[],o=[] +for(Ge(e,r,o),n=0,i=o.length;n{t.routes=JSON.stringify(e)})({dc:{show:null}}) diff --git a/agent/uiserver/dist/assets/consul-hcp/services-51af43ae095119987dadf6f2392a59b3.js b/agent/uiserver/dist/assets/consul-hcp/services-51af43ae095119987dadf6f2392a59b3.js new file mode 100644 index 00000000000..dc997392546 --- /dev/null +++ b/agent/uiserver/dist/assets/consul-hcp/services-51af43ae095119987dadf6f2392a59b3.js @@ -0,0 +1 @@ +((e,o=("undefined"!=typeof document?document.currentScript.dataset:module.exports))=>{o.services=JSON.stringify(e)})({"component:consul/hcp/home":{class:"consul-ui/components/consul/hcp/home"}}) diff --git a/agent/uiserver/dist/assets/consul-lock-sessions/routes-f2c5ce353830c89f540358e7f174e0bf.js b/agent/uiserver/dist/assets/consul-lock-sessions/routes-7718d309039e9f8b3b185656b6dd7f05.js similarity index 100% rename from agent/uiserver/dist/assets/consul-lock-sessions/routes-f2c5ce353830c89f540358e7f174e0bf.js rename to agent/uiserver/dist/assets/consul-lock-sessions/routes-7718d309039e9f8b3b185656b6dd7f05.js diff --git a/agent/uiserver/dist/assets/consul-lock-sessions/services-8b6b2b2bea3add7709b8075a5ed5652b.js b/agent/uiserver/dist/assets/consul-lock-sessions/services-70b9e635f1e8e9a316e3773fccadb7c7.js similarity index 100% rename from agent/uiserver/dist/assets/consul-lock-sessions/services-8b6b2b2bea3add7709b8075a5ed5652b.js rename to agent/uiserver/dist/assets/consul-lock-sessions/services-70b9e635f1e8e9a316e3773fccadb7c7.js diff --git a/agent/uiserver/dist/assets/consul-nspaces/routes-f939ed42e9b83f9d1bbc5256be68e77c.js b/agent/uiserver/dist/assets/consul-nspaces/routes-71c32de6a0307211d1299dac7688bfbf.js similarity index 100% rename from agent/uiserver/dist/assets/consul-nspaces/routes-f939ed42e9b83f9d1bbc5256be68e77c.js rename to agent/uiserver/dist/assets/consul-nspaces/routes-71c32de6a0307211d1299dac7688bfbf.js diff --git a/agent/uiserver/dist/assets/consul-nspaces/services-8b6b2b2bea3add7709b8075a5ed5652b.js b/agent/uiserver/dist/assets/consul-nspaces/services-70b9e635f1e8e9a316e3773fccadb7c7.js similarity index 100% rename from agent/uiserver/dist/assets/consul-nspaces/services-8b6b2b2bea3add7709b8075a5ed5652b.js rename to agent/uiserver/dist/assets/consul-nspaces/services-70b9e635f1e8e9a316e3773fccadb7c7.js diff --git a/agent/uiserver/dist/assets/consul-partitions/routes-cba490481425519435d142c743bbc3d3.js b/agent/uiserver/dist/assets/consul-partitions/routes-1bdd3b7ae99c7d7ce0425b2412f10d5e.js similarity index 100% rename from agent/uiserver/dist/assets/consul-partitions/routes-cba490481425519435d142c743bbc3d3.js rename to agent/uiserver/dist/assets/consul-partitions/routes-1bdd3b7ae99c7d7ce0425b2412f10d5e.js diff --git a/agent/uiserver/dist/assets/consul-partitions/services-85621f245f195fe1ce177064bfb04504.js b/agent/uiserver/dist/assets/consul-partitions/services-1a3b6937a8bc5f6e68df884b1650eaf0.js similarity index 100% rename from agent/uiserver/dist/assets/consul-partitions/services-85621f245f195fe1ce177064bfb04504.js rename to agent/uiserver/dist/assets/consul-partitions/services-1a3b6937a8bc5f6e68df884b1650eaf0.js diff --git a/agent/uiserver/dist/assets/consul-peerings/routes-989d6de4b58a54c8638e37694240f29a.js b/agent/uiserver/dist/assets/consul-peerings/routes-989d6de4b58a54c8638e37694240f29a.js new file mode 100644 index 00000000000..bb683363705 --- /dev/null +++ b/agent/uiserver/dist/assets/consul-peerings/routes-989d6de4b58a54c8638e37694240f29a.js @@ -0,0 +1 @@ +((e,s=("undefined"!=typeof document?document.currentScript.dataset:module.exports))=>{s.routes=JSON.stringify(e)})({dc:{peers:{_options:{path:"/peers"},index:{_options:{path:"/",queryParams:{sortBy:"sort",state:"state",searchproperty:{as:"searchproperty",empty:[["Name","ID"]]},search:{as:"filter",replace:!0}}}},show:{_options:{path:"/:name"},imported:{_options:{path:"/imported-services",queryParams:{sortBy:"sort",status:"status",source:"source",kind:"kind",searchproperty:{as:"searchproperty",empty:[["Name","Tags"]]},search:{as:"filter",replace:!0}}}},exported:{_options:{path:"/exported-services",queryParams:{search:{as:"filter",replace:!0}}}},addresses:{_options:{path:"/addresses"}}}}}}) diff --git a/agent/uiserver/dist/assets/consul-peerings/services-e5a754eca7f3fbb406035f10b8dfbb77.js b/agent/uiserver/dist/assets/consul-peerings/services-e5a754eca7f3fbb406035f10b8dfbb77.js new file mode 100644 index 00000000000..7e9c950c602 --- /dev/null +++ b/agent/uiserver/dist/assets/consul-peerings/services-e5a754eca7f3fbb406035f10b8dfbb77.js @@ -0,0 +1 @@ +((e,o=("undefined"!=typeof document?document.currentScript.dataset:module.exports))=>{o.services=JSON.stringify(e)})({"component:consul/peer/selector":{class:"consul-ui/components/consul/peer/selector"}}) diff --git a/agent/uiserver/dist/assets/consul-ui-20fef69ea9b73df740a420526b12c7fb.css b/agent/uiserver/dist/assets/consul-ui-20fef69ea9b73df740a420526b12c7fb.css deleted file mode 100644 index 20aa05d74bf..00000000000 --- a/agent/uiserver/dist/assets/consul-ui-20fef69ea9b73df740a420526b12c7fb.css +++ /dev/null @@ -1 +0,0 @@ -@charset "UTF-8";fieldset,hr{border:none}.modal-dialog [role=document] table caption,.modal-dialog [role=document] table thead th,main table caption,main table thead th,table td,table th,td,th{text-align:left}article,aside,figure,footer,header,hgroup,hr,section{display:block}#login-toggle+div footer button,.consul-intention-fieldsets .permissions>button,.empty-state>ul>li>*,.empty-state>ul>li>:active,.empty-state>ul>li>label>button,.empty-state>ul>li>label>button:active,.modal-dialog [role=document] dd a,.modal-dialog [role=document] p a,.oidc-select button.reset,.search-bar-status .remove-all button,a,label.type-dialog,label.type-dialog:active,main dd a,main dd a:active,main p a,main p a:active{text-decoration:none}blockquote,body,dd,dl,dt,fieldset,figure,h1,h2,h3,h4,h5,h6,hr,html,iframe,legend,li,ol,p,pre,textarea,ul{margin:0;padding:0}h1,h2,h3,h4,h5,h6{font-size:100%;font-weight:400}ul{list-style:none}table{border-collapse:collapse;border-spacing:0}table td,table th{padding:0}audio,embed,img,object,video{height:auto;max-width:100%}.app-view>div form button[type=button].type-delete,.consul-intention-action-warn-modal button.dangerous,.copy-button button,.disclosure-menu [aria-expanded]~*>ul>[role=treeitem],.disclosure-menu [aria-expanded]~*>ul>li>[role=menuitem],.disclosure-menu [aria-expanded]~*>ul>li>[role=option],.empty-state div>button,.hashicorp-consul nav li.nspaces .disclosure-menu>button,.hashicorp-consul nav li.partitions .disclosure-menu>button,.informed-action>ul>li>*,.menu-panel>ul>[role=treeitem],.menu-panel>ul>li>[role=menuitem],.menu-panel>ul>li>[role=option],.modal-dialog .type-delete,.more-popover-menu>[type=checkbox]+label+div>ul>[role=treeitem],.more-popover-menu>[type=checkbox]+label+div>ul>li>[role=menuitem],.more-popover-menu>[type=checkbox]+label+div>ul>li>[role=option],.oidc-select button:not(.reset),.popover-menu>[type=checkbox]+label+div>ul>[role=treeitem],.popover-menu>[type=checkbox]+label+div>ul>li>[role=menuitem],.popover-menu>[type=checkbox]+label+div>ul>li>[role=option],.popover-select label>*,.topology-notices button,.type-sort.popover-select label>*,.with-confirmation .type-delete,a.type-create,button.type-cancel,button.type-submit,button[type=reset],button[type=submit],header .actions button[type=button]:not(.copy-btn),label span,table.has-actions tr>.actions>[type=checkbox]+label+div>ul>[role=treeitem],table.has-actions tr>.actions>[type=checkbox]+label+div>ul>li>[role=menuitem],table.has-actions tr>.actions>[type=checkbox]+label+div>ul>li>[role=option],table.with-details tr>.actions>[type=checkbox]+label+div>ul>[role=treeitem],table.with-details tr>.actions>[type=checkbox]+label+div>ul>li>[role=menuitem],table.with-details tr>.actions>[type=checkbox]+label+div>ul>li>[role=option]{-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.type-reveal input:checked~em{-webkit-touch-callout:default;-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;user-select:text}a{color:rgb(var(--color-action))}span,strong,td,th{color:inherit}body{color:rgb(var(--tone-gray-900))}html{background-color:rgb(var(--tone-gray-000));font-size:var(--typo-size-000);text-rendering:optimizeLegibility;text-size-adjust:100%;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;overflow-x:hidden;overflow-y:scroll;box-sizing:border-box;min-width:300px}hr{background-color:rgb(var(--tone-gray-200));height:1px;margin:1.5rem 0}button{background-color:var(--transparent)}body,button,input,select,textarea{font-family:var(--typo-family-sans)}.CodeMirror-lint-tooltip,.cm-s-hashi.CodeMirror,code,pre{font-family:var(--typo-family-mono)}strong{font-style:inherit;font-weight:var(--typo-weight-bold)}code,pre{-moz-osx-font-smoothing:auto;-webkit-font-smoothing:auto}pre{-webkit-overflow-scrolling:touch;overflow-x:auto;white-space:pre;word-wrap:normal}*,::after,::before{box-sizing:inherit;animation-play-state:paused;animation-fill-mode:forwards}fieldset{width:100%}a,input[type=checkbox],input[type=radio]{cursor:pointer}input[type=checkbox],input[type=radio]{vertical-align:baseline}td,th{vertical-align:top}button,input,select,textarea{margin:0}iframe{border:0}:root{--decor-radius-000:0;--decor-radius-100:2px;--decor-radius-200:4px;--decor-radius-250:6px;--decor-radius-300:7px;--decor-radius-999:9999px;--decor-radius-full:100%;--decor-border-000:none;--decor-border-100:1px solid;--decor-border-200:2px solid;--decor-border-300:3px solid;--decor-border-400:4px solid;--decor-elevation-000:none;--decor-elevation-100:0 3px 2px rgb(var(--black) / 6%);--decor-elevation-200:0 2px 4px rgb(var(--black) / 10%);--decor-elevation-300:0 5px 1px -2px rgb(var(--black) / 12%);--decor-elevation-400:0 6px 8px -2px rgb(var(--black) / 5%),0 8px 4px -4px rgb(var(--black) / 10%);--decor-elevation-600:0 12px 5px -7px rgb(var(--black) / 8%),0 11px 10px -3px rgb(var(--black) / 10%);--decor-elevation-800:0 16px 6px -10px rgb(var(--black) / 6%),0 16px 16px -4px rgb(var(--black) / 20%);--steel-050:245 246 247;--steel-100:225 228 231;--steel-200:205 211 215;--steel-300:185 193 199;--steel-400:165 176 183;--steel-500:145 159 168;--steel-600:119 131 138;--steel-700:93 102 107;--steel-800:66 73 77;--steel-900:40 44 46;--lemon-050:255 216 20;--lemon-100:255 216 20;--lemon-200:255 216 20;--lemon-300:255 216 20;--lemon-400:255 216 20;--lemon-500:255 216 20;--lemon-600:255 216 20;--lemon-700:255 216 20;--lemon-800:255 216 20;--lemon-900:255 216 20;--magenta-050:249 235 242;--magenta-100:239 196 216;--magenta-200:229 158 190;--magenta-300:218 119 164;--magenta-400:208 80 138;--magenta-500:198 42 113;--magenta-600:158 33 89;--magenta-700:125 26 71;--magenta-800:90 20 52;--magenta-900:54 12 31;--strawberry-010:255 242 248;--strawberry-050:255 242 248;--strawberry-100:248 217 231;--strawberry-200:248 217 231;--strawberry-300:224 126 172;--strawberry-400:224 126 172;--strawberry-500:202 33 113;--strawberry-600:142 19 74;--strawberry-700:142 19 74;--strawberry-800:101 13 52;--strawberry-900:101 13 52;--cobalt-050:240 245 255;--cobalt-100:191 212 255;--cobalt-200:138 177 255;--cobalt-300:91 146 255;--cobalt-400:56 122 255;--cobalt-500:21 99 255;--cobalt-600:15 79 209;--cobalt-700:14 64 163;--cobalt-800:10 45 116;--cobalt-900:6 27 70;--indigo-050:238 237 252;--indigo-100:213 210 247;--indigo-200:174 167 242;--indigo-300:141 131 237;--indigo-400:117 104 232;--indigo-500:92 78 229;--indigo-600:76 64 188;--indigo-700:59 50 146;--indigo-800:42 36 105;--indigo-900:26 22 63;--teal-050:235 248 243;--teal-100:195 236 220;--teal-200:155 223 197;--teal-300:116 211 174;--teal-400:76 198 151;--teal-500:37 186 129;--teal-600:31 153 106;--teal-700:24 119 83;--teal-800:17 85 59;--teal-900:11 51 36;--cyan-050:231 248 255;--cyan-100:185 236 255;--cyan-200:139 224 255;--cyan-300:92 211 255;--cyan-400:46 199 255;--cyan-500:0 187 255;--cyan-600:0 159 217;--cyan-700:0 119 163;--cyan-800:0 85 116;--cyan-900:0 51 70;--gray-010:251 251 252;--gray-050:247 248 250;--gray-100:235 238 242;--gray-150:235 238 242;--gray-200:220 224 230;--gray-300:186 193 204;--gray-400:142 150 163;--gray-500:111 118 130;--gray-600:98 104 115;--gray-700:82 87 97;--gray-800:55 58 66;--gray-850:44 46 51;--gray-900:31 33 36;--gray-950:21 23 28;--green-050:236 247 237;--green-100:198 233 201;--green-200:160 219 165;--green-300:122 204 129;--green-400:84 190 93;--green-500:46 176 57;--green-600:38 145 47;--green-700:30 113 37;--green-800:21 80 26;--green-900:13 48 16;--blue-010:251 252 255;--blue-050:240 245 255;--blue-100:191 212 255;--blue-200:138 177 255;--blue-300:91 146 255;--blue-400:56 122 255;--blue-500:21 99 255;--blue-600:15 79 209;--blue-700:14 64 163;--blue-800:10 45 116;--blue-900:6 27 70;--red-010:253 250 251;--red-050:249 236 238;--red-100:239 199 204;--red-200:229 162 170;--red-300:219 125 136;--red-400:209 88 102;--red-500:199 52 69;--red-600:163 43 57;--red-700:127 34 44;--red-800:91 24 32;--red-900:55 15 19;--orange-050:254 244 236;--orange-100:253 224 200;--orange-200:252 204 164;--orange-300:251 183 127;--orange-400:250 163 91;--orange-500:250 143 55;--orange-600:205 118 46;--orange-700:160 92 35;--orange-800:114 65 25;--orange-900:69 39 15;--yellow-050:255 251 237;--yellow-100:253 238 186;--yellow-200:252 228 140;--yellow-300:251 217 94;--yellow-400:250 206 48;--yellow-500:250 196 2;--yellow-600:205 161 2;--yellow-700:160 125 2;--yellow-800:114 90 1;--yellow-900:69 54 1;--transparent:transparent;--white:255 255 255;--black:0 0 0;--color-primary:var(--tone-blue-500);--color-dangerous:var(--tone-red-500);--color-primary-disabled:var(--tone-blue-500);--color-neutral:var(--tone-gray-500);--color-action:var(--tone-blue-500);--color-info:var(--tone-blue-500);--color-success:var(--tone-green-500);--color-failure:var(--tone-red-500);--color-danger:var(--tone-red-500);--color-warning:var(--tone-yellow-500);--color-alert:var(--tone-orange-500);--typo-family-sans:BlinkMacSystemFont,-apple-system,"Segoe UI","Roboto","Oxygen","Ubuntu","Cantarell","Fira Sans","Droid Sans","Helvetica Neue","Helvetica","Arial",sans-serif;--typo-family-mono:monospace;--typo-size-000:16px;--typo-size-100:3.5rem;--typo-size-200:1.8rem;--typo-size-250:1.750rem;--typo-size-300:1.3rem;--typo-size-400:1.2rem;--typo-size-450:1.125rem;--typo-size-500:1rem;--typo-size-600:0.875rem;--typo-size-700:0.8125rem;--typo-size-800:0.75rem;--typo-weight-light:300;--typo-weight-normal:400;--typo-weight-medium:500;--typo-weight-semibold:600;--typo-weight-bold:700;--typo-lead-000:0;--typo-lead-050:1;--typo-lead-100:1.2;--typo-lead-200:1.25;--typo-lead-300:1.28;--typo-lead-500:1.33;--typo-lead-600:1.4;--typo-lead-700:1.5;--typo-lead-800:1.7;--icon-alert-triangle-16:url('data:image/svg+xml;charset=UTF-8,');--icon-alert-triangle-24:url('data:image/svg+xml;charset=UTF-8,');--icon-arrow-right-16:url('data:image/svg+xml;charset=UTF-8,');--icon-arrow-right-24:url('data:image/svg+xml;charset=UTF-8,');--icon-x-square-fill-16:url('data:image/svg+xml;charset=UTF-8,');--icon-x-square-fill-24:url('data:image/svg+xml;charset=UTF-8,');--icon-chevron-down-16:url('data:image/svg+xml;charset=UTF-8,');--icon-chevron-down-24:url('data:image/svg+xml;charset=UTF-8,');--icon-clipboard-copy-16:url('data:image/svg+xml;charset=UTF-8,');--icon-clipboard-copy-24:url('data:image/svg+xml;charset=UTF-8,');--icon-docs-16:url('data:image/svg+xml;charset=UTF-8,');--icon-docs-24:url('data:image/svg+xml;charset=UTF-8,');--icon-external-link-16:url('data:image/svg+xml;charset=UTF-8,');--icon-external-link-24:url('data:image/svg+xml;charset=UTF-8,');--icon-file-16:url('data:image/svg+xml;charset=UTF-8,');--icon-file-24:url('data:image/svg+xml;charset=UTF-8,');--icon-folder-16:url('data:image/svg+xml;charset=UTF-8,');--icon-folder-24:url('data:image/svg+xml;charset=UTF-8,');--icon-activity-16:url('data:image/svg+xml;charset=UTF-8,');--icon-activity-24:url('data:image/svg+xml;charset=UTF-8,');--icon-help-16:url('data:image/svg+xml;charset=UTF-8,');--icon-help-24:url('data:image/svg+xml;charset=UTF-8,');--icon-learn-16:url('data:image/svg+xml;charset=UTF-8,');--icon-learn-24:url('data:image/svg+xml;charset=UTF-8,');--icon-github-color-16:url('data:image/svg+xml;charset=UTF-8,');--icon-github-color-24:url('data:image/svg+xml;charset=UTF-8,');--icon-google-color-16:url('data:image/svg+xml;charset=UTF-8,');--icon-google-color-24:url('data:image/svg+xml;charset=UTF-8,');--icon-kubernetes-color-16:url('data:image/svg+xml;charset=UTF-8,');--icon-kubernetes-color-24:url('data:image/svg+xml;charset=UTF-8,');--icon-menu-16:url('data:image/svg+xml;charset=UTF-8,');--icon-menu-24:url('data:image/svg+xml;charset=UTF-8,');--icon-minus-square-16:url('data:image/svg+xml;charset=UTF-8,');--icon-minus-square-24:url('data:image/svg+xml;charset=UTF-8,');--icon-more-horizontal-16:url('data:image/svg+xml;charset=UTF-8,');--icon-more-horizontal-24:url('data:image/svg+xml;charset=UTF-8,');--icon-globe-16:url('data:image/svg+xml;charset=UTF-8,');--icon-globe-24:url('data:image/svg+xml;charset=UTF-8,');--icon-search-16:url('data:image/svg+xml;charset=UTF-8,');--icon-search-24:url('data:image/svg+xml;charset=UTF-8,');--icon-star-16:url('data:image/svg+xml;charset=UTF-8,');--icon-star-24:url('data:image/svg+xml;charset=UTF-8,');--icon-org-16:url('data:image/svg+xml;charset=UTF-8,');--icon-org-24:url('data:image/svg+xml;charset=UTF-8,');--icon-user-16:url('data:image/svg+xml;charset=UTF-8,');--icon-user-24:url('data:image/svg+xml;charset=UTF-8,');--icon-users-16:url('data:image/svg+xml;charset=UTF-8,');--icon-users-24:url('data:image/svg+xml;charset=UTF-8,');--icon-eye-off-16:url('data:image/svg+xml;charset=UTF-8,');--icon-eye-off-24:url('data:image/svg+xml;charset=UTF-8,');--icon-eye-16:url('data:image/svg+xml;charset=UTF-8,');--icon-eye-24:url('data:image/svg+xml;charset=UTF-8,');--icon-alert-circle-16:url('data:image/svg+xml;charset=UTF-8,');--icon-alert-circle-24:url('data:image/svg+xml;charset=UTF-8,');--icon-aws-color-16:url('data:image/svg+xml;charset=UTF-8,');--icon-aws-color-24:url('data:image/svg+xml;charset=UTF-8,');--icon-check-16:url('data:image/svg+xml;charset=UTF-8,');--icon-check-24:url('data:image/svg+xml;charset=UTF-8,');--icon-check-circle-16:url('data:image/svg+xml;charset=UTF-8,');--icon-check-circle-24:url('data:image/svg+xml;charset=UTF-8,');--icon-check-circle-fill-16:url('data:image/svg+xml;charset=UTF-8,');--icon-check-circle-fill-24:url('data:image/svg+xml;charset=UTF-8,');--icon-chevron-left-16:url('data:image/svg+xml;charset=UTF-8,');--icon-chevron-left-24:url('data:image/svg+xml;charset=UTF-8,');--icon-chevron-right-16:url('data:image/svg+xml;charset=UTF-8,');--icon-chevron-right-24:url('data:image/svg+xml;charset=UTF-8,');--icon-chevron-up-16:url('data:image/svg+xml;charset=UTF-8,');--icon-chevron-up-24:url('data:image/svg+xml;charset=UTF-8,');--icon-delay-16:url('data:image/svg+xml;charset=UTF-8,');--icon-delay-24:url('data:image/svg+xml;charset=UTF-8,');--icon-docs-link-16:url('data:image/svg+xml;charset=UTF-8,');--icon-docs-link-24:url('data:image/svg+xml;charset=UTF-8,');--icon-gateway-16:url('data:image/svg+xml;charset=UTF-8,');--icon-gateway-24:url('data:image/svg+xml;charset=UTF-8,');--icon-git-commit-16:url('data:image/svg+xml;charset=UTF-8,');--icon-git-commit-24:url('data:image/svg+xml;charset=UTF-8,');--icon-history-16:url('data:image/svg+xml;charset=UTF-8,');--icon-history-24:url('data:image/svg+xml;charset=UTF-8,');--icon-info-16:url('data:image/svg+xml;charset=UTF-8,');--icon-info-24:url('data:image/svg+xml;charset=UTF-8,');--icon-layers-16:url('data:image/svg+xml;charset=UTF-8,');--icon-layers-24:url('data:image/svg+xml;charset=UTF-8,');--icon-loading-16:url('data:image/svg+xml;charset=UTF-8,');--icon-loading-24:url('data:image/svg+xml;charset=UTF-8,');--icon-path-16:url('data:image/svg+xml;charset=UTF-8,');--icon-path-24:url('data:image/svg+xml;charset=UTF-8,');--icon-skip-16:url('data:image/svg+xml;charset=UTF-8,');--icon-skip-24:url('data:image/svg+xml;charset=UTF-8,');--icon-socket-16:url('data:image/svg+xml;charset=UTF-8,');--icon-socket-24:url('data:image/svg+xml;charset=UTF-8,');--icon-star-circle-16:url('data:image/svg+xml;charset=UTF-8,');--icon-star-circle-24:url('data:image/svg+xml;charset=UTF-8,');--icon-star-fill-16:url('data:image/svg+xml;charset=UTF-8,');--icon-star-fill-24:url('data:image/svg+xml;charset=UTF-8,');--icon-tag-16:url('data:image/svg+xml;charset=UTF-8,');--icon-tag-24:url('data:image/svg+xml;charset=UTF-8,');--icon-vault-color-16:url('data:image/svg+xml;charset=UTF-8,');--icon-vault-color-24:url('data:image/svg+xml;charset=UTF-8,');--icon-x-16:url('data:image/svg+xml;charset=UTF-8,');--icon-x-24:url('data:image/svg+xml;charset=UTF-8,');--icon-x-circle-16:url('data:image/svg+xml;charset=UTF-8,');--icon-x-circle-24:url('data:image/svg+xml;charset=UTF-8,');--icon-cloud-cross-16:url('data:image/svg+xml;charset=UTF-8,');--icon-loading-motion-16:url('data:image/svg+xml;charset=UTF-8,');--icon-auth0-color-16:url('data:image/svg+xml;charset=UTF-8,');--icon-auth0-color-24:url('data:image/svg+xml;charset=UTF-8,');--icon-consul-color-16:url('data:image/svg+xml;charset=UTF-8,');--icon-consul-color-24:url('data:image/svg+xml;charset=UTF-8,');--icon-logo-ember-circle-color-16:url('data:image/svg+xml;charset=UTF-8,');--icon-logo-glimmer-color-16:url('data:image/svg+xml;charset=UTF-8,');--icon-logo-jwt-color-16:url('data:image/svg+xml;charset=UTF-8,');--icon-microsoft-color-16:url('data:image/svg+xml;charset=UTF-8,');--icon-microsoft-color-24:url('data:image/svg+xml;charset=UTF-8,');--icon-nomad-color-16:url('data:image/svg+xml;charset=UTF-8,');--icon-nomad-color-24:url('data:image/svg+xml;charset=UTF-8,');--icon-logo-oidc-color-16:url('data:image/svg+xml;charset=UTF-8,');--icon-okta-color-16:url('data:image/svg+xml;charset=UTF-8,');--icon-okta-color-24:url('data:image/svg+xml;charset=UTF-8,');--icon-terraform-color-16:url('data:image/svg+xml;charset=UTF-8,');--icon-terraform-color-24:url('data:image/svg+xml;charset=UTF-8,');--icon-mesh-16:url('data:image/svg+xml;charset=UTF-8,');--icon-mesh-24:url('data:image/svg+xml;charset=UTF-8,');--icon-port-16:url('data:image/svg+xml;charset=UTF-8,');--icon-protocol-16:url('data:image/svg+xml;charset=UTF-8,');--icon-redirect-16:url('data:image/svg+xml;charset=UTF-8,');--icon-redirect-24:url('data:image/svg+xml;charset=UTF-8,');--icon-search-color-16:url('data:image/svg+xml;charset=UTF-8,');--icon-sort-desc-16:url('data:image/svg+xml;charset=UTF-8,');--icon-sort-desc-24:url('data:image/svg+xml;charset=UTF-8,');--icon-union-16:url('data:image/svg+xml;charset=UTF-8,');--chrome-width:300px;--chrome-height:64px;--tone-brand-050:var(--tone-magenta-050);--tone-brand-100:var(--tone-strawberry-100);--tone-brand-600:224 56 117;--tone-brand-800:var(--tone-magenta-800);--typo-action-500:rgb(var(--tone-blue-500));--decor-error-500:rgb(var(--tone-red-500));--typo-contrast-999:rgb(var(--tone-gray-999));--typo-brand-050:rgb(var(--tone-brand-050));--typo-brand-600:rgb(var(--tone-brand-600));--decor-brand-600:rgb(var(--tone-brand-600));--swatch-brand-600:rgb(var(--tone-brand-600));--swatch-brand-800:rgb(var(--tone-brand-800));--syntax-light-grey:#dde3e7;--syntax-light-gray:#a4a4a4;--syntax-light-grey-blue:#6c7b81;--syntax-dark-grey:#788290;--syntax-faded-gray:#eaeaea;--syntax-atlas:#127eff;--syntax-vagrant:#2f88f7;--syntax-consul:#69499a;--syntax-terraform:#822ff7;--syntax-serf:#dd4e58;--syntax-packer:#1ddba3;--syntax-gray:lighten(#000, 89%);--syntax-red:#ff3d3d;--syntax-green:#39b54a;--syntax-dark-gray:#535f73;--syntax-gutter-grey:#2a2f36;--syntax-yellow:rgb(var(--tone-yellow-500));--horizontal-kv-list-separator-width:18px;--horizontal-kv-list-key-separator:":";--horizontal-kv-list-key-wrapper-start:"(";--horizontal-kv-list-key-wrapper-end:")";--csv-list-separator:",";--icon-loading:icon-loading-motion}.consul-bucket-list .service,.consul-bucket-list:not([class]) dt:not([class]),.consul-exposed-path-list>ul>li>.detail dl:not([class]) dt:not([class]),.consul-instance-checks:not([class]) dt:not([class]),.consul-lock-session-list dl:not([class]) dt:not([class]),.consul-server-card dt:not(.name),.consul-upstream-instance-list dl.local-bind-address dt,.consul-upstream-instance-list dl.local-bind-socket-path dt,.consul-upstream-instance-list dl:not([class]) dt:not([class]),.list-collection>ul>li:not(:first-child)>.detail dl:not([class]) dt:not([class]),.route-title,.tag-list:not([class]) dt:not([class]),section[data-route="dc.show.license"] .validity dl .expired+dd,section[data-route="dc.show.license"] .validity dl:not([class]) dt:not([class]),section[data-route="dc.show.serverstatus"] .redundancy-zones section header dl:not([class]) dt:not([class]),td.tags:not([class]) dt:not([class]){position:absolute;overflow:hidden;clip:rect(0 0 0 0);width:1px;height:1px;margin:-1px;padding:0;border:0}.consul-upstream-instance-list dl.local-bind-socket-mode dt,section[data-route="dc.show.serverstatus"] .redundancy-zones section header dt{position:static!important;clip:unset!important;overflow:visible!important;width:auto!important;height:auto!important;margin:0!important;padding:0!important}.animatable.tab-nav ul::after,.app-view>div form button[type=button].type-delete,.app-view>div form button[type=button].type-delete:hover:not(:disabled):not(:active),.consul-auth-method-type,.consul-external-source,.consul-intention-action-warn-modal button.dangerous,.consul-intention-action-warn-modal button.dangerous:disabled,.consul-intention-action-warn-modal button.dangerous:focus,.consul-intention-action-warn-modal button.dangerous:hover:active,.consul-intention-action-warn-modal button.dangerous:hover:not(:disabled):not(:active),.consul-intention-list td.intent- strong,.consul-intention-permission-form button.type-submit,.consul-intention-permission-form button.type-submit:disabled,.consul-intention-permission-form button.type-submit:focus:not(:disabled),.consul-intention-permission-form button.type-submit:hover:not(:disabled),.consul-intention-search-bar .value- span,.consul-kind,.consul-source,.consul-transparent-proxy,.disclosure-menu [aria-expanded]~*>ul>li.dangerous>:first-child,.disclosure-menu [aria-expanded]~*>ul>li.dangerous>:focus:first-child,.disclosure-menu [aria-expanded]~*>ul>li.dangerous>:hover:first-child,.discovery-chain .route-card>header ul li,.empty-state div>button,.empty-state div>button:disabled,.empty-state div>button:focus,.empty-state div>button:hover:active,.empty-state div>button:hover:not(:disabled):not(:active),.informed-action>ul>.dangerous>*,.informed-action>ul>.dangerous>:focus,.informed-action>ul>.dangerous>:hover,.leader,.menu-panel>ul>li.dangerous>:first-child,.menu-panel>ul>li.dangerous>:focus:first-child,.menu-panel>ul>li.dangerous>:hover:first-child,.modal-dialog .type-delete,.modal-dialog .type-delete:hover:active,.modal-dialog .type-delete:hover:not(:disabled):not(:active),.modal-dialog [role=document]>footer,.modal-dialog [role=document]>header,.more-popover-menu>[type=checkbox]+label+div>ul>li.dangerous>:first-child,.more-popover-menu>[type=checkbox]+label+div>ul>li.dangerous>:focus:first-child,.more-popover-menu>[type=checkbox]+label+div>ul>li.dangerous>:hover:first-child,.oidc-select button:disabled:not(.reset),.oidc-select button:focus:not(.reset),.oidc-select button:hover:active:not(.reset),.oidc-select button:hover:not(:disabled):not(:active):not(.reset),.oidc-select button:not(.reset),.popover-menu>[type=checkbox]+label+div>ul>li.dangerous>:first-child,.popover-menu>[type=checkbox]+label+div>ul>li.dangerous>:focus:first-child,.popover-menu>[type=checkbox]+label+div>ul>li.dangerous>:hover:first-child,.tab-nav .selected>*,.topology-metrics-source-type,.with-confirmation .type-delete,.with-confirmation .type-delete:hover:active,.with-confirmation .type-delete:hover:not(:disabled):not(:active),a.type-create,a.type-create:disabled,a.type-create:focus,a.type-create:hover:active,a.type-create:hover:not(:disabled):not(:active),button.type-cancel,button.type-cancel:active,button.type-cancel:focus,button.type-cancel:hover:not(:disabled):not(:active),button.type-submit,button.type-submit:disabled,button.type-submit:focus,button.type-submit:hover:active,button.type-submit:hover:not(:disabled):not(:active),button[type=reset],button[type=reset]:active,button[type=reset]:focus,button[type=reset]:hover:not(:disabled):not(:active),button[type=submit],button[type=submit]:disabled,button[type=submit]:focus,button[type=submit]:hover:active,button[type=submit]:hover:not(:disabled):not(:active),header .actions button[type=button]:hover:not(:disabled):not(:active):not(.copy-btn),header .actions button[type=button]:not(.copy-btn),html[data-route^="dc.acls.index"] main td strong,span.policy-node-identity,span.policy-service-identity,table.has-actions tr>.actions>[type=checkbox]+label+div>ul>li.dangerous>:first-child,table.has-actions tr>.actions>[type=checkbox]+label+div>ul>li.dangerous>:focus:first-child,table.has-actions tr>.actions>[type=checkbox]+label+div>ul>li.dangerous>:hover:first-child,table.with-details tr>.actions>[type=checkbox]+label+div>ul>li.dangerous>:first-child,table.with-details tr>.actions>[type=checkbox]+label+div>ul>li.dangerous>:focus:first-child,table.with-details tr>.actions>[type=checkbox]+label+div>ul>li.dangerous>:hover:first-child{border-style:solid}.animatable.tab-nav ul::after,.app .notifications .app-notification,.tab-nav li>*{transition-duration:.15s;transition-timing-function:ease-out}[role=banner] nav:first-of-type,[role=contentinfo],html body>.brand-loader,main{transition-timing-function:cubic-bezier(.1,.1,.25,.9);transition-duration:.1s}html[data-state]:not(.ember-loading) body>.brand-loader{animation-timing-function:cubic-bezier(.1,.1,.25,.9);animation-duration:.1s;animation-name:remove-from-flow;animation-fill-mode:forwards}@keyframes remove-from-flow{100%{visibility:hidden;overflow:hidden;clip:rect(0 0 0 0)}}@keyframes typo-truncate{100%{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}}.informed-action header>*{font-size:inherit;font-weight:inherit;line-height:inherit;font-style:inherit}.app-view>div form:not(.filter-bar) [role=radiogroup] label [type=password],.app-view>div form:not(.filter-bar) [role=radiogroup] label [type=text],.app-view>div form:not(.filter-bar) [role=radiogroup] label textarea,.modal-dialog [role=document] .type-password [type=password],.modal-dialog [role=document] .type-password [type=text],.modal-dialog [role=document] .type-password textarea,.modal-dialog [role=document] .type-select [type=password],.modal-dialog [role=document] .type-select [type=text],.modal-dialog [role=document] .type-select textarea,.modal-dialog [role=document] .type-text [type=password],.modal-dialog [role=document] .type-text [type=text],.modal-dialog [role=document] .type-text textarea,.modal-dialog [role=document] [role=radiogroup] label [type=password],.modal-dialog [role=document] [role=radiogroup] label [type=text],.modal-dialog [role=document] [role=radiogroup] label textarea,.oidc-select label [type=password],.oidc-select label [type=text],.oidc-select label textarea,.type-toggle [type=password],.type-toggle [type=text],.type-toggle textarea,body,main .type-password [type=password],main .type-password [type=text],main .type-password textarea,main .type-select [type=password],main .type-select [type=text],main .type-select textarea,main .type-text [type=password],main .type-text [type=text],main .type-text textarea{font-size:var(--typo-size-600);font-family:var(--typo-family-sans);line-height:var(--typo-lead-700)}.app-view>div form:not(.filter-bar) [role=radiogroup] label>span,.app-view>header .title>:first-child,.consul-auth-method-binding-list h2,.consul-auth-method-view section h2,.consul-health-check-list .health-check-output dt,.consul-health-check-list .health-check-output header>*,.consul-intention-list .notice.allow header>*,.consul-intention-list .notice.deny header>*,.consul-intention-list .notice.permissions header>*,.consul-intention-list td.destination,.consul-intention-list td.source,.consul-intention-permission-form h2,.consul-intention-view h2,.consul-server-card .name+dd,.definition-table dt,.disclosure-menu [aria-expanded]~*>ul>[role=treeitem],.disclosure-menu [aria-expanded]~*>ul>li>[role=menuitem],.disclosure-menu [aria-expanded]~*>ul>li>[role=option],.empty-state header :first-child,.hashicorp-consul nav .dcs [aria-expanded],.hashicorp-consul nav li.nspaces .disclosure-menu>button,.hashicorp-consul nav li.partitions .disclosure-menu>button,.informed-action header,.informed-action>ul>li>*,.menu-panel>ul>[role=treeitem],.menu-panel>ul>li>[role=menuitem],.menu-panel>ul>li>[role=option],.modal-dialog [role=document] .type-password>span,.modal-dialog [role=document] .type-select>span,.modal-dialog [role=document] .type-text>span,.modal-dialog [role=document] [role=radiogroup] label>span,.modal-dialog [role=document] form h2,.modal-dialog [role=document] table caption,.modal-dialog [role=document] table td strong,.modal-dialog [role=document] table td:first-child,.modal-dialog [role=document] table th,.modal-dialog [role=document]>header>*,.more-popover-menu>[type=checkbox]+label+div>ul>[role=treeitem],.more-popover-menu>[type=checkbox]+label+div>ul>li>[role=menuitem],.more-popover-menu>[type=checkbox]+label+div>ul>li>[role=option],.notice.error header>*,.notice.highlight header>*,.notice.info header>*,.notice.policy-management header>*,.notice.success header>*,.notice.warning header>*,.oidc-select label>span,.popover-menu>[type=checkbox]+label+div>ul>[role=treeitem],.popover-menu>[type=checkbox]+label+div>ul>li>[role=menuitem],.popover-menu>[type=checkbox]+label+div>ul>li>[role=option],.radio-card header,.tab-nav,.type-toggle label span,.type-toggle>span,[role=banner] nav:last-of-type [aria-expanded],[role=banner] nav:last-of-type>ul>li>.popover-menu>label>button,[role=banner] nav:last-of-type>ul>li>a,[role=banner] nav:last-of-type>ul>li>button,[role=banner] nav:last-of-type>ul>li>span,fieldset>header,html[data-route^="dc.kv.edit"] h2,html[data-route^="dc.services.instance.metadata"] .tab-section section h2,main .type-password>span,main .type-select>span,main .type-text>span,main form h2,main header nav:first-child ol li>*,main table caption,main table td strong,main table td:first-child,main table th,section[data-route="dc.show.license"] aside header>:first-child,section[data-route="dc.show.license"] h2,section[data-route="dc.show.serverstatus"] .redundancy-zones h3,section[data-route="dc.show.serverstatus"] h2,section[data-route="dc.show.serverstatus"] h3,table.has-actions tr>.actions>[type=checkbox]+label+div>ul>[role=treeitem],table.has-actions tr>.actions>[type=checkbox]+label+div>ul>li>[role=menuitem],table.has-actions tr>.actions>[type=checkbox]+label+div>ul>li>[role=option],table.with-details tr>.actions>[type=checkbox]+label+div>ul>[role=treeitem],table.with-details tr>.actions>[type=checkbox]+label+div>ul>li>[role=menuitem],table.with-details tr>.actions>[type=checkbox]+label+div>ul>li>[role=option]{line-height:var(--typo-lead-200)}.app-view>header .title>:first-child{font-weight:var(--typo-weight-bold);font-size:var(--typo-size-200)}.app-view>div form:not(.filter-bar) [role=radiogroup] label>span,.consul-auth-method-binding-list h2,.consul-auth-method-view section h2,.consul-health-check-list .health-check-output header>*,.consul-intention-list .notice.allow header>*,.consul-intention-list .notice.deny header>*,.consul-intention-list .notice.permissions header>*,.consul-intention-list td.destination,.consul-intention-list td.source,.consul-intention-permission-form h2,.consul-intention-view h2,.consul-server-card .name+dd,.definition-table dt,.empty-state header :first-child,.hashicorp-consul nav .dcs [aria-expanded],.informed-action header,.modal-dialog [role=document] .type-password>span,.modal-dialog [role=document] .type-select>span,.modal-dialog [role=document] .type-text>span,.modal-dialog [role=document] [role=radiogroup] label>span,.modal-dialog [role=document] form h2,.modal-dialog [role=document] table caption,.modal-dialog [role=document] table td:first-child,.modal-dialog [role=document]>header>*,.notice.error header>*,.notice.highlight header>*,.notice.info header>*,.notice.policy-management header>*,.notice.success header>*,.notice.warning header>*,.oidc-select label>span,.radio-card header,.type-toggle>span,[role=banner] nav:last-of-type [aria-expanded],[role=banner] nav:last-of-type>ul>li>.popover-menu>label>button,[role=banner] nav:last-of-type>ul>li>a,[role=banner] nav:last-of-type>ul>li>button,[role=banner] nav:last-of-type>ul>li>span,fieldset>header,html[data-route^="dc.kv.edit"] h2,html[data-route^="dc.services.instance.metadata"] .tab-section section h2,main .type-password>span,main .type-select>span,main .type-text>span,main form h2,main table caption,main table td:first-child,section[data-route="dc.show.license"] aside header>:first-child,section[data-route="dc.show.license"] h2,section[data-route="dc.show.serverstatus"] .redundancy-zones h3,section[data-route="dc.show.serverstatus"] h2,section[data-route="dc.show.serverstatus"] h3{font-weight:var(--typo-weight-semibold)}.consul-health-check-list .health-check-output dt,.disclosure-menu [aria-expanded]~*>ul>[role=treeitem],.disclosure-menu [aria-expanded]~*>ul>li>[role=menuitem],.disclosure-menu [aria-expanded]~*>ul>li>[role=option],.hashicorp-consul nav li.nspaces .disclosure-menu>button,.hashicorp-consul nav li.partitions .disclosure-menu>button,.informed-action>ul>li>*,.menu-panel>ul>[role=treeitem],.menu-panel>ul>li>[role=menuitem],.menu-panel>ul>li>[role=option],.modal-dialog [role=document] table td strong,.modal-dialog [role=document] table th,.more-popover-menu>[type=checkbox]+label+div>ul>[role=treeitem],.more-popover-menu>[type=checkbox]+label+div>ul>li>[role=menuitem],.more-popover-menu>[type=checkbox]+label+div>ul>li>[role=option],.popover-menu>[type=checkbox]+label+div>ul>[role=treeitem],.popover-menu>[type=checkbox]+label+div>ul>li>[role=menuitem],.popover-menu>[type=checkbox]+label+div>ul>li>[role=option],.tab-nav,.type-toggle label span,main header nav:first-child ol li>*,main table td strong,main table th,table.has-actions tr>.actions>[type=checkbox]+label+div>ul>[role=treeitem],table.has-actions tr>.actions>[type=checkbox]+label+div>ul>li>[role=menuitem],table.has-actions tr>.actions>[type=checkbox]+label+div>ul>li>[role=option],table.with-details tr>.actions>[type=checkbox]+label+div>ul>[role=treeitem],table.with-details tr>.actions>[type=checkbox]+label+div>ul>li>[role=menuitem],table.with-details tr>.actions>[type=checkbox]+label+div>ul>li>[role=option]{font-weight:var(--typo-weight-medium)}.consul-auth-method-binding-list h2,.consul-auth-method-view section h2,.consul-intention-permission-form h2,.consul-intention-view h2,.empty-state header :first-child,.modal-dialog [role=document] form h2,.modal-dialog [role=document]>header>*,html[data-route^="dc.kv.edit"] h2,main form h2,section[data-route="dc.show.license"] h2,section[data-route="dc.show.serverstatus"] h2,section[data-route="dc.show.serverstatus"] h3{font-size:var(--typo-size-300)}.consul-health-check-list .health-check-output header>*,.consul-intention-list .notice.allow header>*,.consul-intention-list .notice.deny header>*,.consul-intention-list .notice.permissions header>*,.consul-server-card .name+dd,.notice.error header>*,.notice.highlight header>*,.notice.info header>*,.notice.policy-management header>*,.notice.success header>*,.notice.warning header>*,html[data-route^="dc.services.instance.metadata"] .tab-section section h2,section[data-route="dc.show.license"] aside header>:first-child,section[data-route="dc.show.serverstatus"] .redundancy-zones h3{font-size:var(--typo-size-500)}.app-view>div form:not(.filter-bar) [role=radiogroup] label>span,.consul-intention-list td.destination,.consul-intention-list td.source,.definition-table dt,.disclosure-menu [aria-expanded]~*>ul>[role=treeitem],.disclosure-menu [aria-expanded]~*>ul>li>[role=menuitem],.disclosure-menu [aria-expanded]~*>ul>li>[role=option],.hashicorp-consul nav .dcs [aria-expanded],.hashicorp-consul nav li.nspaces .disclosure-menu>button,.hashicorp-consul nav li.partitions .disclosure-menu>button,.informed-action header,.informed-action>ul>li>*,.menu-panel>ul>[role=treeitem],.menu-panel>ul>li>[role=menuitem],.menu-panel>ul>li>[role=option],.modal-dialog [role=document] .type-password>span,.modal-dialog [role=document] .type-select>span,.modal-dialog [role=document] .type-text>span,.modal-dialog [role=document] [role=radiogroup] label>span,.modal-dialog [role=document] table caption,.modal-dialog [role=document] table td:first-child,.more-popover-menu>[type=checkbox]+label+div>ul>[role=treeitem],.more-popover-menu>[type=checkbox]+label+div>ul>li>[role=menuitem],.more-popover-menu>[type=checkbox]+label+div>ul>li>[role=option],.oidc-select label>span,.popover-menu>[type=checkbox]+label+div>ul>[role=treeitem],.popover-menu>[type=checkbox]+label+div>ul>li>[role=menuitem],.popover-menu>[type=checkbox]+label+div>ul>li>[role=option],.radio-card header,.tab-nav,.type-toggle>span,[role=banner] nav:last-of-type [aria-expanded],[role=banner] nav:last-of-type>ul>li>.popover-menu>label>button,[role=banner] nav:last-of-type>ul>li>a,[role=banner] nav:last-of-type>ul>li>button,[role=banner] nav:last-of-type>ul>li>span,fieldset>header,main .type-password>span,main .type-select>span,main .type-text>span,main header nav:first-child ol li>*,main table caption,main table td:first-child,table.has-actions tr>.actions>[type=checkbox]+label+div>ul>[role=treeitem],table.has-actions tr>.actions>[type=checkbox]+label+div>ul>li>[role=menuitem],table.has-actions tr>.actions>[type=checkbox]+label+div>ul>li>[role=option],table.with-details tr>.actions>[type=checkbox]+label+div>ul>[role=treeitem],table.with-details tr>.actions>[type=checkbox]+label+div>ul>li>[role=menuitem],table.with-details tr>.actions>[type=checkbox]+label+div>ul>li>[role=option]{font-size:var(--typo-size-600)}.consul-health-check-list .health-check-output dt,.modal-dialog [role=document] table td strong,.modal-dialog [role=document] table th,.type-toggle label span,main table td strong,main table th{font-size:var(--typo-size-700)}.app-view h1 span.kind-proxy,.app-view>div form button[type=button].type-delete,.app-view>div form:not(.filter-bar) [role=radiogroup] label>em,.app-view>div form:not(.filter-bar) [role=radiogroup] label>span,.auth-form em,.auth-profile,.consul-auth-method-view section,.consul-external-source,.consul-health-check-list .health-check-output dl>dd,.consul-intention-action-warn-modal button.dangerous,.consul-intention-fieldsets .permissions>button,.consul-intention-list .notice.allow,.consul-intention-list .notice.allow footer *,.consul-intention-list .notice.allow p,.consul-intention-list .notice.deny,.consul-intention-list .notice.deny footer *,.consul-intention-list .notice.deny p,.consul-intention-list .notice.permissions,.consul-intention-list .notice.permissions footer *,.consul-intention-list .notice.permissions p,.consul-intention-permission-header-list>ul>li dd,.consul-intention-permission-list>ul>li dd,.consul-kind,.consul-source,.copy-button button,.disclosure-menu [aria-expanded]~* [role=separator],.disclosure-menu [aria-expanded]~*>div,.discovery-chain .resolvers>header>*,.discovery-chain .routes>header>*,.discovery-chain .splitters>header>*,.empty-state div>button,.empty-state header :nth-child(2),.empty-state p,.empty-state>ul>li>*,.empty-state>ul>li>label>button,.has-error>strong,.informed-action p,.menu-panel [role=separator],.menu-panel>div,.modal-dialog .type-delete,.modal-dialog [role=document] .type-password>em,.modal-dialog [role=document] .type-password>span,.modal-dialog [role=document] .type-select>em,.modal-dialog [role=document] .type-select>span,.modal-dialog [role=document] .type-text>em,.modal-dialog [role=document] .type-text>span,.modal-dialog [role=document] [role=radiogroup] label>em,.modal-dialog [role=document] [role=radiogroup] label>span,.modal-dialog [role=document] form button+em,.modal-dialog [role=document] p,.modal-dialog [role=document] table td,.modal-dialog [role=document] table td p,.more-popover-menu>[type=checkbox]+label+div [role=separator],.more-popover-menu>[type=checkbox]+label+div>div,.notice.error,.notice.error footer *,.notice.error p,.notice.highlight,.notice.highlight footer *,.notice.highlight p,.notice.info,.notice.info footer *,.notice.info p,.notice.policy-management,.notice.policy-management footer *,.notice.policy-management p,.notice.success,.notice.success footer *,.notice.success p,.notice.warning,.notice.warning footer *,.notice.warning p,.oidc-select button.reset,.oidc-select button:not(.reset),.oidc-select label>em,.oidc-select label>span,.popover-menu>[type=checkbox]+label+div [role=separator],.popover-menu>[type=checkbox]+label+div>div,.popover-select label>*,.tippy-box[data-theme~=tooltip] .tippy-content,.topology-notices button,.type-dialog,.type-sort.popover-select label>*,.type-toggle>em,.type-toggle>span,.with-confirmation .type-delete,[role=banner] nav:first-of-type [role=separator],[role=banner] nav:first-of-type>ul>li>a,[role=banner] nav:first-of-type>ul>li>label,[role=contentinfo],a.type-create,button.type-cancel,button.type-submit,button[type=reset],button[type=submit],header .actions button[type=button]:not(.copy-btn),main .type-password>em,main .type-password>span,main .type-select>em,main .type-select>span,main .type-text>em,main .type-text>span,main form button+em,main p,main table td,main table td p,pre code,section[data-route="dc.show.serverstatus"] .server-failure-tolerance dt,span.label,table.has-actions tr>.actions>[type=checkbox]+label+div [role=separator],table.has-actions tr>.actions>[type=checkbox]+label+div>div,table.with-details tr>.actions>[type=checkbox]+label+div [role=separator],table.with-details tr>.actions>[type=checkbox]+label+div>div{line-height:inherit;font-size:inherit}.consul-auth-method-view section,.consul-external-source,.consul-intention-list .notice.allow,.consul-intention-list .notice.allow p,.consul-intention-list .notice.deny,.consul-intention-list .notice.deny p,.consul-intention-list .notice.permissions,.consul-intention-list .notice.permissions p,.consul-kind,.consul-source,.notice.error,.notice.error p,.notice.highlight,.notice.highlight p,.notice.info,.notice.info p,.notice.policy-management,.notice.policy-management p,.notice.success,.notice.success p,.notice.warning,.notice.warning p,[role=banner] nav:first-of-type>ul>li>a,[role=banner] nav:first-of-type>ul>li>label,pre code{font-size:var(--typo-size-600)}.app-view h1 span.kind-proxy,.app-view>div form:not(.filter-bar) [role=radiogroup] label>span,.auth-profile,.consul-health-check-list .health-check-output dl>dd,.consul-intention-fieldsets .permissions>button,.consul-intention-permission-header-list>ul>li dd,.consul-intention-permission-list>ul>li dd,.disclosure-menu [aria-expanded]~*>div,.empty-state>ul>li>*,.empty-state>ul>li>label>button,.informed-action p,.menu-panel>div,.modal-dialog [role=document] .type-password>span,.modal-dialog [role=document] .type-select>span,.modal-dialog [role=document] .type-text>span,.modal-dialog [role=document] [role=radiogroup] label>span,.modal-dialog [role=document] table td,.modal-dialog [role=document] table td p,.more-popover-menu>[type=checkbox]+label+div>div,.oidc-select label>span,.popover-menu>[type=checkbox]+label+div>div,.type-dialog,.type-toggle>span,[role=contentinfo],main .type-password>span,main .type-select>span,main .type-text>span,main table td,main table td p,section[data-route="dc.show.serverstatus"] .server-failure-tolerance dt,span.label,table.has-actions tr>.actions>[type=checkbox]+label+div>div,table.with-details tr>.actions>[type=checkbox]+label+div>div{font-size:var(--typo-size-700)}.app-view>div form button[type=button].type-delete,.app-view>div form:not(.filter-bar) [role=radiogroup] label>em,.auth-form em,.consul-intention-action-warn-modal button.dangerous,.consul-intention-list .notice.allow footer *,.consul-intention-list .notice.deny footer *,.consul-intention-list .notice.permissions footer *,.copy-button button,.disclosure-menu [aria-expanded]~* [role=separator],.discovery-chain .resolvers>header>*,.discovery-chain .routes>header>*,.discovery-chain .splitters>header>*,.empty-state div>button,.empty-state header :nth-child(2),.empty-state p,.has-error>strong,.menu-panel [role=separator],.modal-dialog .type-delete,.modal-dialog [role=document] .type-password>em,.modal-dialog [role=document] .type-select>em,.modal-dialog [role=document] .type-text>em,.modal-dialog [role=document] [role=radiogroup] label>em,.modal-dialog [role=document] form button+em,.modal-dialog [role=document] p,.more-popover-menu>[type=checkbox]+label+div [role=separator],.notice.error footer *,.notice.highlight footer *,.notice.info footer *,.notice.policy-management footer *,.notice.success footer *,.notice.warning footer *,.oidc-select button.reset,.oidc-select button:not(.reset),.oidc-select label>em,.popover-menu>[type=checkbox]+label+div [role=separator],.popover-select label>*,.tippy-box[data-theme~=tooltip] .tippy-content,.topology-notices button,.type-sort.popover-select label>*,.type-toggle>em,.with-confirmation .type-delete,[role=banner] nav:first-of-type [role=separator],[role=contentinfo],a.type-create,button.type-cancel,button.type-submit,button[type=reset],button[type=submit],header .actions button[type=button]:not(.copy-btn),main .type-password>em,main .type-select>em,main .type-text>em,main form button+em,main p,table.has-actions tr>.actions>[type=checkbox]+label+div [role=separator],table.with-details tr>.actions>[type=checkbox]+label+div [role=separator]{font-size:var(--typo-size-800)}::after,::before{display:inline-block;vertical-align:text-top;background-repeat:no-repeat;background-position:center;mask-repeat:no-repeat;-webkit-mask-repeat:no-repeat;mask-position:center;-webkit-mask-position:center}::before{animation-name:var(--icon-name-start,var(--icon-name)),var(--icon-size-start,var(--icon-size,icon-000));background-color:var(--icon-color-start,var(--icon-color))}::after{animation-name:var(--icon-name-end,var(--icon-name)),var(--icon-size-end,var(--icon-size,icon-000));background-color:var(--icon-color-end,var(--icon-color))}[style*="--icon-color-start"]::before{color:var(--icon-color-start)}[style*="--icon-color-end"]::after{color:var(--icon-color-end)}[style*="--icon-name-start"]::before,[style*="--icon-name-end"]::after{content:""}@keyframes icon-000{100%{width:1.2em;height:1.2em}}@keyframes icon-100{100%{width:.625rem;height:.625rem}}@keyframes icon-200{100%{width:.75rem;height:.75rem}}@keyframes icon-300{100%{width:1rem;height:1rem}}@keyframes icon-400{100%{width:1.125rem;height:1.125rem}}@keyframes icon-500{100%{width:1.25rem;height:1.25rem}}@keyframes icon-600{100%{width:1.375rem;height:1.375rem}}@keyframes icon-700{100%{width:1.5rem;height:1.5rem}}@keyframes icon-800{100%{width:1.625rem;height:1.625rem}}@keyframes icon-900{100%{width:1.75rem;height:1.75rem}}@keyframes icon-999{100%{width:100%;height:100%}}:root:not(.prefers-color-scheme-dark){--theme-light-none:initial;--icon-aws:icon-aws-color;--icon-vault:icon-vault;--color-vault-500:rgb(var(--black));--tone-gray-000:var(--white);--tone-gray-050:var(--gray-050);--tone-gray-100:var(--gray-100);--tone-gray-150:var(--gray-150);--tone-gray-200:var(--gray-200);--tone-gray-300:var(--gray-300);--tone-gray-400:var(--gray-400);--tone-gray-500:var(--gray-500);--tone-gray-600:var(--gray-600);--tone-gray-700:var(--gray-700);--tone-gray-800:var(--gray-800);--tone-gray-850:var(--gray-850);--tone-gray-900:var(--gray-900);--tone-gray-950:var(--gray-950);--tone-gray-999:var(--black);--tone-green-000:var(--white);--tone-green-050:var(--green-050);--tone-green-100:var(--green-100);--tone-green-150:var(--green-150);--tone-green-200:var(--green-200);--tone-green-300:var(--green-300);--tone-green-400:var(--green-400);--tone-green-500:var(--green-500);--tone-green-600:var(--green-600);--tone-green-700:var(--green-700);--tone-green-800:var(--green-800);--tone-green-850:var(--green-850);--tone-green-900:var(--green-900);--tone-green-950:var(--green-950);--tone-green-999:var(--black);--tone-blue-000:var(--white);--tone-blue-050:var(--blue-050);--tone-blue-100:var(--blue-100);--tone-blue-150:var(--blue-150);--tone-blue-200:var(--blue-200);--tone-blue-300:var(--blue-300);--tone-blue-400:var(--blue-400);--tone-blue-500:var(--blue-500);--tone-blue-600:var(--blue-600);--tone-blue-700:var(--blue-700);--tone-blue-800:var(--blue-800);--tone-blue-850:var(--blue-850);--tone-blue-900:var(--blue-900);--tone-blue-950:var(--blue-950);--tone-blue-999:var(--black);--tone-red-000:var(--white);--tone-red-050:var(--red-050);--tone-red-100:var(--red-100);--tone-red-150:var(--red-150);--tone-red-200:var(--red-200);--tone-red-300:var(--red-300);--tone-red-400:var(--red-400);--tone-red-500:var(--red-500);--tone-red-600:var(--red-600);--tone-red-700:var(--red-700);--tone-red-800:var(--red-800);--tone-red-850:var(--red-850);--tone-red-900:var(--red-900);--tone-red-950:var(--red-950);--tone-red-999:var(--black);--tone-orange-000:var(--white);--tone-orange-050:var(--orange-050);--tone-orange-100:var(--orange-100);--tone-orange-150:var(--orange-150);--tone-orange-200:var(--orange-200);--tone-orange-300:var(--orange-300);--tone-orange-400:var(--orange-400);--tone-orange-500:var(--orange-500);--tone-orange-600:var(--orange-600);--tone-orange-700:var(--orange-700);--tone-orange-800:var(--orange-800);--tone-orange-850:var(--orange-850);--tone-orange-900:var(--orange-900);--tone-orange-950:var(--orange-950);--tone-orange-999:var(--black);--tone-yellow-000:var(--white);--tone-yellow-050:var(--yellow-050);--tone-yellow-100:var(--yellow-100);--tone-yellow-150:var(--yellow-150);--tone-yellow-200:var(--yellow-200);--tone-yellow-300:var(--yellow-300);--tone-yellow-400:var(--yellow-400);--tone-yellow-500:var(--yellow-500);--tone-yellow-600:var(--yellow-600);--tone-yellow-700:var(--yellow-700);--tone-yellow-800:var(--yellow-800);--tone-yellow-850:var(--yellow-850);--tone-yellow-900:var(--yellow-900);--tone-yellow-950:var(--yellow-950);--tone-yellow-999:var(--black);--tone-transparent:var(--transparent);--tone-vault-500:var(--black)}:root.prefers-color-scheme-dark,[role=banner],[role=banner] nav:first-of-type,[role=banner] nav:last-of-type{--theme-dark-none:initial;--icon-aws:icon-aws;--icon-vault:icon-vault;--color-aws-500:rgb(var(--white));--color-vault-500:rgb(var(--tone-lemon-500));--tone-gray-000:var(--black);--tone-gray-050:var(--gray-950);--tone-gray-100:var(--gray-900);--tone-gray-150:var(--gray-850);--tone-gray-200:var(--gray-800);--tone-gray-300:var(--gray-700);--tone-gray-400:var(--gray-600);--tone-gray-500:var(--gray-500);--tone-gray-600:var(--gray-400);--tone-gray-700:var(--gray-300);--tone-gray-800:var(--gray-200);--tone-gray-850:var(--gray-250);--tone-gray-900:var(--gray-100);--tone-gray-950:var(--gray-050);--tone-gray-999:var(--white);--tone-green-000:var(--white);--tone-green-050:var(--green-050);--tone-green-100:var(--green-100);--tone-green-150:var(--green-150);--tone-green-200:var(--green-200);--tone-green-300:var(--green-300);--tone-green-400:var(--green-400);--tone-green-500:var(--green-500);--tone-green-600:var(--green-600);--tone-green-700:var(--green-700);--tone-green-800:var(--green-800);--tone-green-850:var(--green-850);--tone-green-900:var(--green-900);--tone-green-950:var(--green-950);--tone-green-999:var(--black);--tone-blue-000:var(--white);--tone-blue-050:var(--blue-050);--tone-blue-100:var(--blue-100);--tone-blue-150:var(--blue-150);--tone-blue-200:var(--blue-200);--tone-blue-300:var(--blue-300);--tone-blue-400:var(--blue-400);--tone-blue-500:var(--blue-500);--tone-blue-600:var(--blue-600);--tone-blue-700:var(--blue-700);--tone-blue-800:var(--blue-800);--tone-blue-850:var(--blue-850);--tone-blue-900:var(--blue-900);--tone-blue-950:var(--blue-950);--tone-blue-999:var(--black);--tone-red-000:var(--white);--tone-red-050:var(--red-050);--tone-red-100:var(--red-100);--tone-red-150:var(--red-150);--tone-red-200:var(--red-200);--tone-red-300:var(--red-300);--tone-red-400:var(--red-400);--tone-red-500:var(--red-500);--tone-red-600:var(--red-600);--tone-red-700:var(--red-700);--tone-red-800:var(--red-800);--tone-red-850:var(--red-850);--tone-red-900:var(--red-900);--tone-red-950:var(--red-950);--tone-red-999:var(--black);--tone-orange-000:var(--white);--tone-orange-050:var(--orange-050);--tone-orange-100:var(--orange-100);--tone-orange-150:var(--orange-150);--tone-orange-200:var(--orange-200);--tone-orange-300:var(--orange-300);--tone-orange-400:var(--orange-400);--tone-orange-500:var(--orange-500);--tone-orange-600:var(--orange-600);--tone-orange-700:var(--orange-700);--tone-orange-800:var(--orange-800);--tone-orange-850:var(--orange-850);--tone-orange-900:var(--orange-900);--tone-orange-950:var(--orange-950);--tone-orange-999:var(--black);--tone-yellow-000:var(--black);--tone-yellow-050:var(--blue-950);--tone-yellow-100:var(--yellow-900);--tone-yellow-150:var(--yellow-850);--tone-yellow-200:var(--yellow-800);--tone-yellow-300:var(--yellow-700);--tone-yellow-400:var(--yellow-600);--tone-yellow-500:var(--yellow-500);--tone-yellow-600:var(--yellow-400);--tone-yellow-700:var(--yellow-300);--tone-yellow-800:var(--yellow-200);--tone-yellow-850:var(--yellow-250);--tone-yellow-900:var(--yellow-100);--tone-yellow-950:var(--yellow-050);--tone-yellow-999:var(--white);--tone-transparent:var(--transparent);--tone-vault-500:var(--lemon-500)}.consul-intention-permission-header-list dt::before,.consul-intention-permission-list dt::before,.discovery-chain .resolver-card dt,.discovery-chain .route-card section header>::before{font-weight:var(--typo-weight-normal);background-color:rgb(var(--tone-gray-100));visibility:visible;padding:0 4px}#downstream-container .topology-metrics-card .details .group span::before,#downstream-container .topology-metrics-card div .critical::before,#downstream-container .topology-metrics-card div .empty::before,#downstream-container .topology-metrics-card div .health dt::before,#downstream-container .topology-metrics-card div .nspace dt::before,#downstream-container .topology-metrics-card div .partition dt::before,#downstream-container .topology-metrics-card div .passing::before,#downstream-container .topology-metrics-card div .warning::before,#downstream-container>div:first-child span::before,#login-toggle+div footer button::after,#metrics-container .link .config-link::before,#metrics-container .link .metrics-link::before,#metrics-container:hover .sparkline-key-link::before,#upstream-container .topology-metrics-card .details .group span::before,#upstream-container .topology-metrics-card div .critical::before,#upstream-container .topology-metrics-card div .empty::before,#upstream-container .topology-metrics-card div .health dt::before,#upstream-container .topology-metrics-card div .nspace dt::before,#upstream-container .topology-metrics-card div .partition dt::before,#upstream-container .topology-metrics-card div .passing::before,#upstream-container .topology-metrics-card div .warning::before,.animatable.tab-nav ul::after,.certificate button.hide::before,.certificate button.show::before,.consul-auth-method-binding-list dl dt.type+dd span::before,.consul-auth-method-list ul .locality::before,.consul-auth-method-view dl dt.type+dd span::before,.consul-auth-method-view section dl dt.type+dd span::before,.consul-bucket-list .nspace::before,.consul-bucket-list .partition::before,.consul-exposed-path-list>ul>li>.detail .policy-management::before,.consul-exposed-path-list>ul>li>.detail .policy::before,.consul-exposed-path-list>ul>li>.detail .role::before,.consul-exposed-path-list>ul>li>.detail dl.address dt::before,.consul-exposed-path-list>ul>li>.detail dl.behavior dt::before,.consul-exposed-path-list>ul>li>.detail dl.checks dt::before,.consul-exposed-path-list>ul>li>.detail dl.critical dt::before,.consul-exposed-path-list>ul>li>.detail dl.datacenter dt::before,.consul-exposed-path-list>ul>li>.detail dl.empty dt::before,.consul-exposed-path-list>ul>li>.detail dl.lock-delay dt::before,.consul-exposed-path-list>ul>li>.detail dl.mesh dt::before,.consul-exposed-path-list>ul>li>.detail dl.node dt::before,.consul-exposed-path-list>ul>li>.detail dl.nspace dt::before,.consul-exposed-path-list>ul>li>.detail dl.passing dt::before,.consul-exposed-path-list>ul>li>.detail dl.path dt::before,.consul-exposed-path-list>ul>li>.detail dl.port dt::before,.consul-exposed-path-list>ul>li>.detail dl.protocol dt::before,.consul-exposed-path-list>ul>li>.detail dl.socket dt::before,.consul-exposed-path-list>ul>li>.detail dl.ttl dt::before,.consul-exposed-path-list>ul>li>.detail dl.warning dt::before,.consul-exposed-path-list>ul>li>.header .critical dd::before,.consul-exposed-path-list>ul>li>.header .empty dd::before,.consul-exposed-path-list>ul>li>.header .passing dd::before,.consul-exposed-path-list>ul>li>.header .policy-management dd::before,.consul-exposed-path-list>ul>li>.header .warning dd::before,.consul-exposed-path-list>ul>li>.header [rel=me] dd::before,.consul-external-source.consul-api-gateway::before,.consul-external-source.consul::before,.consul-external-source.jwt::before,.consul-external-source.kubernetes::before,.consul-external-source.leader::before,.consul-external-source.nomad::before,.consul-external-source.oidc::before,.consul-external-source.terraform::before,.consul-health-check-list .health-check-output dd em.jwt::before,.consul-health-check-list .health-check-output dd em.kubernetes::before,.consul-health-check-list .health-check-output dd em.oidc::before,.consul-health-check-list .health-check-output::before,.consul-instance-checks dt::before,.consul-intention-fieldsets .value->:last-child::before,.consul-intention-fieldsets .value-allow>:last-child::before,.consul-intention-fieldsets .value-deny>:last-child::before,.consul-intention-list .notice.allow::before,.consul-intention-list .notice.deny::before,.consul-intention-list .notice.permissions::before,.consul-intention-list em span::before,.consul-intention-list td strong.jwt::before,.consul-intention-list td strong.kubernetes::before,.consul-intention-list td strong.oidc::before,.consul-intention-list td.intent- strong::before,.consul-intention-list td.intent-allow strong::before,.consul-intention-list td.intent-deny strong::before,.consul-intention-permission-list .intent-allow::before,.consul-intention-permission-list .intent-deny::before,.consul-intention-permission-list strong.jwt::before,.consul-intention-permission-list strong.kubernetes::before,.consul-intention-permission-list strong.oidc::before,.consul-intention-search-bar .value- span::before,.consul-intention-search-bar .value-allow span::before,.consul-intention-search-bar .value-deny span::before,.consul-intention-search-bar li button span.jwt::before,.consul-intention-search-bar li button span.kubernetes::before,.consul-intention-search-bar li button span.oidc::before,.consul-kind::before,.consul-lock-session-list ul>li:not(:first-child)>.detail .policy-management::before,.consul-lock-session-list ul>li:not(:first-child)>.detail .policy::before,.consul-lock-session-list ul>li:not(:first-child)>.detail .role::before,.consul-lock-session-list ul>li:not(:first-child)>.detail dl.address dt::before,.consul-lock-session-list ul>li:not(:first-child)>.detail dl.behavior dt::before,.consul-lock-session-list ul>li:not(:first-child)>.detail dl.checks dt::before,.consul-lock-session-list ul>li:not(:first-child)>.detail dl.critical dt::before,.consul-lock-session-list ul>li:not(:first-child)>.detail dl.datacenter dt::before,.consul-lock-session-list ul>li:not(:first-child)>.detail dl.empty dt::before,.consul-lock-session-list ul>li:not(:first-child)>.detail dl.lock-delay dt::before,.consul-lock-session-list ul>li:not(:first-child)>.detail dl.mesh dt::before,.consul-lock-session-list ul>li:not(:first-child)>.detail dl.node dt::before,.consul-lock-session-list ul>li:not(:first-child)>.detail dl.nspace dt::before,.consul-lock-session-list ul>li:not(:first-child)>.detail dl.passing dt::before,.consul-lock-session-list ul>li:not(:first-child)>.detail dl.path dt::before,.consul-lock-session-list ul>li:not(:first-child)>.detail dl.port dt::before,.consul-lock-session-list ul>li:not(:first-child)>.detail dl.protocol dt::before,.consul-lock-session-list ul>li:not(:first-child)>.detail dl.socket dt::before,.consul-lock-session-list ul>li:not(:first-child)>.detail dl.ttl dt::before,.consul-lock-session-list ul>li:not(:first-child)>.detail dl.warning dt::before,.consul-lock-session-list ul>li:not(:first-child)>.header .critical dd::before,.consul-lock-session-list ul>li:not(:first-child)>.header .empty dd::before,.consul-lock-session-list ul>li:not(:first-child)>.header .passing dd::before,.consul-lock-session-list ul>li:not(:first-child)>.header .policy-management dd::before,.consul-lock-session-list ul>li:not(:first-child)>.header .warning dd::before,.consul-lock-session-list ul>li:not(:first-child)>.header [rel=me] dd::before,.consul-server-card .health-status+dd.jwt::before,.consul-server-card .health-status+dd.kubernetes::before,.consul-server-card .health-status+dd.oidc::before,.consul-upstream-instance-list dl.datacenter dt::before,.consul-upstream-instance-list dl.nspace dt::before,.consul-upstream-instance-list dl.partition dt::before,.consul-upstream-instance-list li>.detail .policy-management::before,.consul-upstream-instance-list li>.detail .policy::before,.consul-upstream-instance-list li>.detail .role::before,.consul-upstream-instance-list li>.detail dl.address dt::before,.consul-upstream-instance-list li>.detail dl.behavior dt::before,.consul-upstream-instance-list li>.detail dl.checks dt::before,.consul-upstream-instance-list li>.detail dl.critical dt::before,.consul-upstream-instance-list li>.detail dl.datacenter dt::before,.consul-upstream-instance-list li>.detail dl.empty dt::before,.consul-upstream-instance-list li>.detail dl.lock-delay dt::before,.consul-upstream-instance-list li>.detail dl.mesh dt::before,.consul-upstream-instance-list li>.detail dl.node dt::before,.consul-upstream-instance-list li>.detail dl.nspace dt::before,.consul-upstream-instance-list li>.detail dl.passing dt::before,.consul-upstream-instance-list li>.detail dl.path dt::before,.consul-upstream-instance-list li>.detail dl.port dt::before,.consul-upstream-instance-list li>.detail dl.protocol dt::before,.consul-upstream-instance-list li>.detail dl.socket dt::before,.consul-upstream-instance-list li>.detail dl.ttl dt::before,.consul-upstream-instance-list li>.detail dl.warning dt::before,.consul-upstream-instance-list li>.header .critical dd::before,.consul-upstream-instance-list li>.header .empty dd::before,.consul-upstream-instance-list li>.header .passing dd::before,.consul-upstream-instance-list li>.header .policy-management dd::before,.consul-upstream-instance-list li>.header .warning dd::before,.consul-upstream-instance-list li>.header [rel=me] dd::before,.consul-upstream-list dl.partition dt::before,.copy-button button::before,.dangerous.informed-action header::before,.disclosure-menu [aria-expanded]~*>ul>li.is-active>::after,.disclosure-menu [aria-expanded]~*>ul>li[aria-checked]>::after,.disclosure-menu [aria-expanded]~*>ul>li[aria-current]>::after,.disclosure-menu [aria-expanded]~*>ul>li[aria-selected]>::after,.discovery-chain .resolvers>header span::after,.discovery-chain .route-card::before,.discovery-chain .route-card>header ul li.jwt::before,.discovery-chain .route-card>header ul li.kubernetes::before,.discovery-chain .route-card>header ul li.oidc::before,.discovery-chain .routes>header span::after,.discovery-chain .splitter-card::before,.discovery-chain .splitters>header span::after,.empty-state li[class*=-link]>::after,.has-error>strong::before,.hashicorp-consul .docs-link a::after,.hashicorp-consul .feedback-link a::after,.hashicorp-consul .learn-link a::after,.hashicorp-consul nav .dcs li.is-local span.jwt::before,.hashicorp-consul nav .dcs li.is-local span.kubernetes::before,.hashicorp-consul nav .dcs li.is-local span.oidc::before,.hashicorp-consul nav .dcs li.is-primary span.jwt::before,.hashicorp-consul nav .dcs li.is-primary span.kubernetes::before,.hashicorp-consul nav .dcs li.is-primary span.oidc::before,.hashicorp-consul nav li.nspaces .disclosure-menu>button::after,.hashicorp-consul nav li.partitions .disclosure-menu>button::after,.info.informed-action header::before,.jwt.consul-auth-method-type::before,.jwt.consul-external-source::before,.jwt.consul-kind::before,.jwt.consul-source::before,.jwt.consul-transparent-proxy::before,.jwt.leader::before,.jwt.topology-metrics-source-type::before,.kubernetes.consul-auth-method-type::before,.kubernetes.consul-external-source::before,.kubernetes.consul-kind::before,.kubernetes.consul-source::before,.kubernetes.consul-transparent-proxy::before,.kubernetes.informed-action header::before,.kubernetes.leader::before,.kubernetes.topology-metrics-source-type::before,.leader::before,.list-collection>button::after,.list-collection>ul>li:not(:first-child)>.detail .policy-management::before,.list-collection>ul>li:not(:first-child)>.detail .policy::before,.list-collection>ul>li:not(:first-child)>.detail .role::before,.list-collection>ul>li:not(:first-child)>.detail dl.address dt::before,.list-collection>ul>li:not(:first-child)>.detail dl.behavior dt::before,.list-collection>ul>li:not(:first-child)>.detail dl.checks dt::before,.list-collection>ul>li:not(:first-child)>.detail dl.critical dt::before,.list-collection>ul>li:not(:first-child)>.detail dl.datacenter dt::before,.list-collection>ul>li:not(:first-child)>.detail dl.empty dt::before,.list-collection>ul>li:not(:first-child)>.detail dl.lock-delay dt::before,.list-collection>ul>li:not(:first-child)>.detail dl.mesh dt::before,.list-collection>ul>li:not(:first-child)>.detail dl.node dt::before,.list-collection>ul>li:not(:first-child)>.detail dl.nspace dt::before,.list-collection>ul>li:not(:first-child)>.detail dl.passing dt::before,.list-collection>ul>li:not(:first-child)>.detail dl.path dt::before,.list-collection>ul>li:not(:first-child)>.detail dl.port dt::before,.list-collection>ul>li:not(:first-child)>.detail dl.protocol dt::before,.list-collection>ul>li:not(:first-child)>.detail dl.socket dt::before,.list-collection>ul>li:not(:first-child)>.detail dl.ttl dt::before,.list-collection>ul>li:not(:first-child)>.detail dl.warning dt::before,.list-collection>ul>li:not(:first-child)>.header .critical dd::before,.list-collection>ul>li:not(:first-child)>.header .empty dd::before,.list-collection>ul>li:not(:first-child)>.header .passing dd::before,.list-collection>ul>li:not(:first-child)>.header .policy-management dd::before,.list-collection>ul>li:not(:first-child)>.header .warning dd::before,.list-collection>ul>li:not(:first-child)>.header [rel=me] dd::before,.menu-panel>ul>li.is-active>::after,.menu-panel>ul>li[aria-checked]>::after,.menu-panel>ul>li[aria-current]>::after,.menu-panel>ul>li[aria-selected]>::after,.modal-dialog [role=document] a[rel*=help]::after,.modal-dialog [role=document] table td.folder::before,.modal-dialog [role=document] table th span::after,.modal-dialog [role=document]>header button::before,.more-popover-menu>[type=checkbox]+label+div>ul>li.is-active>::after,.more-popover-menu>[type=checkbox]+label+div>ul>li[aria-checked]>::after,.more-popover-menu>[type=checkbox]+label+div>ul>li[aria-current]>::after,.more-popover-menu>[type=checkbox]+label+div>ul>li[aria-selected]>::after,.more-popover-menu>[type=checkbox]+label>::after,.notice.error::before,.notice.highlight::before,.notice.info::before,.notice.policy-management::before,.notice.success::before,.notice.warning::before,.oidc-select .auth0-oidc-provider::before,.oidc-select .google-oidc-provider::before,.oidc-select .microsoft-oidc-provider::before,.oidc-select .okta-oidc-provider::before,.oidc.consul-auth-method-type::before,.oidc.consul-external-source::before,.oidc.consul-kind::before,.oidc.consul-source::before,.oidc.consul-transparent-proxy::before,.oidc.leader::before,.oidc.topology-metrics-source-type::before,.popover-menu>[type=checkbox]+label+div>ul>li.is-active>::after,.popover-menu>[type=checkbox]+label+div>ul>li[aria-checked]>::after,.popover-menu>[type=checkbox]+label+div>ul>li[aria-current]>::after,.popover-menu>[type=checkbox]+label+div>ul>li[aria-selected]>::after,.popover-menu>[type=checkbox]+label>::after,.popover-select .consul button::before,.popover-select .consul-api-gateway button::before,.popover-select .jwt button::before,.popover-select .kubernetes button::before,.popover-select .nomad button::before,.popover-select .oidc button::before,.popover-select .terraform button::before,.popover-select .value-critical button::before,.popover-select .value-empty button::before,.popover-select .value-passing button::before,.popover-select .value-warning button::before,.search-bar-status li.jwt:not(.remove-all)::before,.search-bar-status li.kubernetes:not(.remove-all)::before,.search-bar-status li.oidc:not(.remove-all)::before,.search-bar-status li:not(.remove-all) button::before,.sparkline-key h3::before,.tag-list dt::before,.tooltip-panel dd>div::before,.topology-metrics-popover.deny .tippy-arrow::after,.topology-metrics-popover.deny>button::before,.topology-metrics-popover.l7 .tippy-arrow::after,.topology-metrics-popover.l7>button::before,.topology-metrics-popover.not-defined .tippy-arrow::after,.topology-metrics-popover.not-defined>button::before,.topology-metrics-status-error span::before,.topology-metrics-status-loader span::before,.topology-notices button::before,.type-reveal span::before,.type-sort.popover-select label>::before,.type-source.popover-select li.partition button::before,.warning.informed-action header::before,.warning.modal-dialog header::before,[class*=status-].empty-state header::before,a[rel*=external]::after,html[data-route^="dc.acls.index"] main td strong.jwt::before,html[data-route^="dc.acls.index"] main td strong.kubernetes::before,html[data-route^="dc.acls.index"] main td strong.oidc::before,main a[rel*=help]::after,main header nav:first-child ol li:first-child a::before,main table td.folder::before,main table th span::after,section[data-route="dc.show.serverstatus"] .redundancy-zones section header dl.jwt::before,section[data-route="dc.show.serverstatus"] .redundancy-zones section header dl.kubernetes::before,section[data-route="dc.show.serverstatus"] .redundancy-zones section header dl.oidc::before,section[data-route="dc.show.serverstatus"] .server-failure-tolerance header em.jwt::before,section[data-route="dc.show.serverstatus"] .server-failure-tolerance header em.kubernetes::before,section[data-route="dc.show.serverstatus"] .server-failure-tolerance header em.oidc::before,span.jwt.policy-node-identity::before,span.jwt.policy-service-identity::before,span.kubernetes.policy-node-identity::before,span.kubernetes.policy-service-identity::before,span.oidc.policy-node-identity::before,span.oidc.policy-service-identity::before,table.has-actions tr>.actions>[type=checkbox]+label+div>ul>li.is-active>::after,table.has-actions tr>.actions>[type=checkbox]+label+div>ul>li[aria-checked]>::after,table.has-actions tr>.actions>[type=checkbox]+label+div>ul>li[aria-current]>::after,table.has-actions tr>.actions>[type=checkbox]+label+div>ul>li[aria-selected]>::after,table.has-actions tr>.actions>[type=checkbox]+label>::after,table.with-details td:only-child>div>label::before,table.with-details td>label::before,table.with-details tr>.actions>[type=checkbox]+label+div>ul>li.is-active>::after,table.with-details tr>.actions>[type=checkbox]+label+div>ul>li[aria-checked]>::after,table.with-details tr>.actions>[type=checkbox]+label+div>ul>li[aria-current]>::after,table.with-details tr>.actions>[type=checkbox]+label+div>ul>li[aria-selected]>::after,table.with-details tr>.actions>[type=checkbox]+label>::after,td.tags dt::before{content:""}.hashicorp-consul .acls-separator span{box-sizing:border-box;width:12px;height:12px}.hashicorp-consul .acls-separator span::after,.hashicorp-consul .acls-separator span::before{content:"";display:block;width:100%;height:100%;border-radius:100%}.hashicorp-consul .acls-separator span::before{border:1px solid currentColor;opacity:.5}.ember-power-select-trigger,.ember-power-select-trigger--active,.ember-power-select-trigger:focus{border-top:1px solid #aaa;border-bottom:1px solid #aaa;border-right:1px solid #aaa;border-left:1px solid #aaa}.hashicorp-consul .acls-separator span::after{position:absolute;top:2px;left:2px;width:calc(100% - 4px);height:calc(100% - 4px);background-color:currentColor}@keyframes icon-alert-circle-outline{100%{-webkit-mask-image:var(--icon-alert-circle-16);mask-image:var(--icon-alert-circle-16);background-color:var(--icon-color,var(--color-alert-circle-outline-500,currentColor))}}[class*=status-].empty-state header::before{--icon-name:icon-alert-circle-outline;content:""}@keyframes icon-alert-triangle{100%{-webkit-mask-image:var(--icon-alert-triangle-16);mask-image:var(--icon-alert-triangle-16);background-color:var(--icon-color,var(--color-alert-triangle-500,currentColor))}}#downstream-container .topology-metrics-card div .warning::before,#upstream-container .topology-metrics-card div .warning::before,.consul-exposed-path-list>ul>li>.detail dl.warning dt::before,.consul-exposed-path-list>ul>li>.header .warning dd::before,.consul-health-check-list .warning.health-check-output::before,.consul-instance-checks.warning dt::before,.consul-lock-session-list ul>li:not(:first-child)>.detail dl.warning dt::before,.consul-lock-session-list ul>li:not(:first-child)>.header .warning dd::before,.consul-upstream-instance-list li>.detail dl.warning dt::before,.consul-upstream-instance-list li>.header .warning dd::before,.dangerous.informed-action header::before,.list-collection>ul>li:not(:first-child)>.detail dl.warning dt::before,.list-collection>ul>li:not(:first-child)>.header .warning dd::before,.notice.warning::before,.popover-select .value-warning button::before,.topology-metrics-popover.not-defined .tippy-arrow::after,.topology-metrics-popover.not-defined>button::before,.warning.informed-action header::before,.warning.modal-dialog header::before{--icon-name:icon-alert-triangle;content:""}@keyframes icon-arrow-right{100%{-webkit-mask-image:var(--icon-arrow-right-16);mask-image:var(--icon-arrow-right-16);background-color:var(--icon-color,var(--color-arrow-right-500,currentColor))}}@keyframes icon-cancel-plain{100%{-webkit-mask-image:var(--icon-x-16);mask-image:var(--icon-x-16);background-color:var(--icon-color,var(--color-cancel-plain-500,currentColor))}}.modal-dialog [role=document]>header button::before,.search-bar-status li:not(.remove-all) button::before{--icon-name:icon-cancel-plain;content:""}@keyframes icon-cancel-square-fill{100%{-webkit-mask-image:var(--icon-x-square-fill-16);mask-image:var(--icon-x-square-fill-16);background-color:var(--icon-color,var(--color-cancel-square-fill-500,currentColor))}}#downstream-container .topology-metrics-card div .critical::before,#upstream-container .topology-metrics-card div .critical::before,.consul-exposed-path-list>ul>li>.detail dl.critical dt::before,.consul-exposed-path-list>ul>li>.header .critical dd::before,.consul-health-check-list .critical.health-check-output::before,.consul-instance-checks.critical dt::before,.consul-intention-list .notice.deny::before,.consul-lock-session-list ul>li:not(:first-child)>.detail dl.critical dt::before,.consul-lock-session-list ul>li:not(:first-child)>.header .critical dd::before,.consul-upstream-instance-list li>.detail dl.critical dt::before,.consul-upstream-instance-list li>.header .critical dd::before,.has-error>strong::before,.list-collection>ul>li:not(:first-child)>.detail dl.critical dt::before,.list-collection>ul>li:not(:first-child)>.header .critical dd::before,.notice.error::before,.popover-select .value-critical button::before,.topology-metrics-popover.deny .tippy-arrow::after,.topology-metrics-popover.deny>button::before{--icon-name:icon-cancel-square-fill;content:""}@keyframes icon-check-plain{100%{-webkit-mask-image:var(--icon-check-16);mask-image:var(--icon-check-16);background-color:var(--icon-color,var(--color-check-plain-500,currentColor))}}.disclosure-menu [aria-expanded]~*>ul>li.is-active>::after,.disclosure-menu [aria-expanded]~*>ul>li[aria-checked]>::after,.disclosure-menu [aria-expanded]~*>ul>li[aria-current]>::after,.disclosure-menu [aria-expanded]~*>ul>li[aria-selected]>::after,.menu-panel>ul>li.is-active>::after,.menu-panel>ul>li[aria-checked]>::after,.menu-panel>ul>li[aria-current]>::after,.menu-panel>ul>li[aria-selected]>::after,.more-popover-menu>[type=checkbox]+label+div>ul>li.is-active>::after,.more-popover-menu>[type=checkbox]+label+div>ul>li[aria-checked]>::after,.more-popover-menu>[type=checkbox]+label+div>ul>li[aria-current]>::after,.more-popover-menu>[type=checkbox]+label+div>ul>li[aria-selected]>::after,.popover-menu>[type=checkbox]+label+div>ul>li.is-active>::after,.popover-menu>[type=checkbox]+label+div>ul>li[aria-checked]>::after,.popover-menu>[type=checkbox]+label+div>ul>li[aria-current]>::after,.popover-menu>[type=checkbox]+label+div>ul>li[aria-selected]>::after,table.has-actions tr>.actions>[type=checkbox]+label+div>ul>li.is-active>::after,table.has-actions tr>.actions>[type=checkbox]+label+div>ul>li[aria-checked]>::after,table.has-actions tr>.actions>[type=checkbox]+label+div>ul>li[aria-current]>::after,table.has-actions tr>.actions>[type=checkbox]+label+div>ul>li[aria-selected]>::after,table.with-details tr>.actions>[type=checkbox]+label+div>ul>li.is-active>::after,table.with-details tr>.actions>[type=checkbox]+label+div>ul>li[aria-checked]>::after,table.with-details tr>.actions>[type=checkbox]+label+div>ul>li[aria-current]>::after,table.with-details tr>.actions>[type=checkbox]+label+div>ul>li[aria-selected]>::after{--icon-name:icon-check-plain;content:""}@keyframes icon-chevron-down{100%{-webkit-mask-image:var(--icon-chevron-down-16);mask-image:var(--icon-chevron-down-16);background-color:var(--icon-color,var(--color-chevron-down-500,currentColor))}}.hashicorp-consul nav li.nspaces .disclosure-menu>button::after,.hashicorp-consul nav li.partitions .disclosure-menu>button::after,.list-collection>button.closed::after,.more-popover-menu>[type=checkbox]+label>::after,.popover-menu>[type=checkbox]+label>::after,.topology-notices button::before,table.has-actions tr>.actions>[type=checkbox]+label>::after,table.with-details td:only-child>div>label::before,table.with-details td>label::before,table.with-details tr>.actions>[type=checkbox]+label>::after{--icon-name:icon-chevron-down;content:""}@keyframes icon-copy-action{100%{-webkit-mask-image:var(--icon-clipboard-copy-16);mask-image:var(--icon-clipboard-copy-16);background-color:var(--icon-color,var(--color-copy-action-500,currentColor))}}.copy-button button::before{--icon-name:icon-copy-action;content:"";--icon-color:rgb(var(--tone-gray-500))}@keyframes icon-deny-alt{100%{-webkit-mask-image:var(--icon-skip-16);mask-image:var(--icon-skip-16);background-color:var(--icon-color,var(--color-deny-alt-500,currentColor))}}@keyframes icon-deny-default{100%{-webkit-mask-image:var(--icon-skip-16);mask-image:var(--icon-skip-16);background-color:var(--icon-color,var(--color-deny-default-500,currentColor))}}@keyframes icon-disabled{100%{-webkit-mask-image:var(--icon-skip-16);mask-image:var(--icon-skip-16);background-color:var(--icon-color,var(--color-disabled-500,currentColor))}}.status-403.empty-state header::before{--icon-name:icon-disabled;content:""}@keyframes icon-docs{100%{-webkit-mask-image:var(--icon-docs-16);mask-image:var(--icon-docs-16);background-color:var(--icon-color,var(--color-docs-500,currentColor))}}#metrics-container .link .config-link::before,.empty-state .docs-link>::after,.hashicorp-consul .docs-link a::after{--icon-name:icon-docs;content:""}@keyframes icon-exit{100%{-webkit-mask-image:var(--icon-external-link-16);mask-image:var(--icon-external-link-16);background-color:var(--icon-color,var(--color-exit-500,currentColor))}}#metrics-container .link .metrics-link::before,a[rel*=external]::after{--icon-name:icon-exit;content:""}@keyframes icon-file-fill{100%{-webkit-mask-image:var(--icon-file-16);mask-image:var(--icon-file-16);background-color:var(--icon-color,var(--color-file-fill-500,currentColor))}}.consul-exposed-path-list>ul>li>.detail .policy::before,.consul-lock-session-list ul>li:not(:first-child)>.detail .policy::before,.consul-upstream-instance-list li>.detail .policy::before,.list-collection>ul>li:not(:first-child)>.detail .policy::before{--icon-name:icon-file-fill;content:""}@keyframes icon-folder-outline{100%{-webkit-mask-image:var(--icon-folder-16);mask-image:var(--icon-folder-16);background-color:var(--icon-color,var(--color-folder-outline-500,currentColor))}}#downstream-container .topology-metrics-card div .nspace dt::before,#upstream-container .topology-metrics-card div .nspace dt::before,.consul-bucket-list .nspace::before,.consul-exposed-path-list>ul>li>.detail dl.nspace dt::before,.consul-intention-list span[class|=nspace]::before,.consul-lock-session-list ul>li:not(:first-child)>.detail dl.nspace dt::before,.consul-upstream-instance-list dl.nspace dt::before,.list-collection>ul>li:not(:first-child)>.detail dl.nspace dt::before,.modal-dialog [role=document] table td.folder::before,main table td.folder::before{--icon-name:icon-folder-outline;content:""}@keyframes icon-health{100%{-webkit-mask-image:var(--icon-activity-16);mask-image:var(--icon-activity-16);background-color:var(--icon-color,var(--color-health-500,currentColor))}}.consul-exposed-path-list>ul>li>.detail dl.checks dt::before,.consul-lock-session-list ul>li:not(:first-child)>.detail dl.checks dt::before,.consul-upstream-instance-list li>.detail dl.checks dt::before,.list-collection>ul>li:not(:first-child)>.detail dl.checks dt::before{--icon-name:icon-health;content:""}@keyframes icon-help-circle-outline{100%{-webkit-mask-image:var(--icon-help-16);mask-image:var(--icon-help-16);background-color:var(--icon-color,var(--color-help-circle-outline-500,currentColor))}}#downstream-container .topology-metrics-card div .health dt::before,#upstream-container .topology-metrics-card div .health dt::before,.status-404.empty-state header::before{--icon-name:icon-help-circle-outline;content:""}@keyframes icon-info-circle-fill{100%{-webkit-mask-image:var(--icon-info-16);mask-image:var(--icon-info-16);background-color:var(--icon-color,var(--color-info-circle-fill-500,currentColor))}}#metrics-container:hover .sparkline-key-link::before,.consul-intention-list .notice.permissions::before,.info.informed-action header::before,.notice.info::before,.sparkline-key h3::before{--icon-name:icon-info-circle-fill;content:""}@keyframes icon-info-circle-outline{100%{-webkit-mask-image:var(--icon-info-16);mask-image:var(--icon-info-16);background-color:var(--icon-color,var(--color-info-circle-outline-500,currentColor))}}#downstream-container>div:first-child span::before,.consul-auth-method-binding-list dl dt.type+dd span::before,.consul-auth-method-view dl dt.type+dd span::before,.consul-exposed-path-list>ul>li>.detail dl.behavior dt::before,.consul-lock-session-list ul>li:not(:first-child)>.detail dl.behavior dt::before,.consul-upstream-instance-list li>.detail dl.behavior dt::before,.discovery-chain .resolvers>header span::after,.discovery-chain .routes>header span::after,.discovery-chain .splitters>header span::after,.list-collection>ul>li:not(:first-child)>.detail dl.behavior dt::before,.modal-dialog [role=document] a[rel*=help]::after,.modal-dialog [role=document] table th span::after,.topology-metrics-status-error span::before,.topology-metrics-status-loader span::before,main a[rel*=help]::after,main table th span::after{--icon-name:icon-info-circle-outline;content:""}@keyframes icon-learn{100%{-webkit-mask-image:var(--icon-learn-16);mask-image:var(--icon-learn-16);background-color:var(--icon-color,var(--color-learn-500,currentColor))}}.empty-state .learn-link>::after,.hashicorp-consul .learn-link a::after{--icon-name:icon-learn;content:""}@keyframes icon-logo-github-monochrome{100%{-webkit-mask-image:var(--icon-github-color-16);mask-image:var(--icon-github-color-16);background-color:var(--icon-color,var(--color-logo-github-monochrome-500,currentColor))}}.hashicorp-consul .feedback-link a::after{--icon-name:icon-logo-github-monochrome;content:""}@keyframes icon-logo-google-color{100%{background-image:var(--icon-google-color-16)}}.oidc-select .google-oidc-provider::before{--icon-name:icon-logo-google-color;content:""}@keyframes icon-logo-kubernetes-color{100%{background-image:var(--icon-kubernetes-color-16)}}.consul-external-source.kubernetes::before,.consul-health-check-list .health-check-output dd em.kubernetes::before,.consul-intention-list td strong.kubernetes::before,.consul-intention-permission-list strong.kubernetes::before,.consul-intention-search-bar li button span.kubernetes::before,.consul-server-card .health-status+dd.kubernetes::before,.discovery-chain .route-card>header ul li.kubernetes::before,.hashicorp-consul nav .dcs li.is-local span.kubernetes::before,.hashicorp-consul nav .dcs li.is-primary span.kubernetes::before,.kubernetes.consul-auth-method-type::before,.kubernetes.consul-kind::before,.kubernetes.consul-source::before,.kubernetes.consul-transparent-proxy::before,.kubernetes.informed-action header::before,.kubernetes.leader::before,.kubernetes.topology-metrics-source-type::before,.notice.crd::before,.popover-select .kubernetes button::before,.search-bar-status li.kubernetes:not(.remove-all)::before,html[data-route^="dc.acls.index"] main td strong.kubernetes::before,section[data-route="dc.show.serverstatus"] .redundancy-zones section header dl.kubernetes::before,section[data-route="dc.show.serverstatus"] .server-failure-tolerance header em.kubernetes::before,span.kubernetes.policy-node-identity::before,span.kubernetes.policy-service-identity::before{--icon-name:icon-logo-kubernetes-color;content:""}@keyframes icon-menu{100%{-webkit-mask-image:var(--icon-menu-16);mask-image:var(--icon-menu-16);background-color:var(--icon-color,var(--color-menu-500,currentColor))}}@keyframes icon-minus-square-fill{100%{-webkit-mask-image:var(--icon-minus-square-16);mask-image:var(--icon-minus-square-16);background-color:var(--icon-color,var(--color-minus-square-fill-500,currentColor))}}#downstream-container .topology-metrics-card div .empty::before,#upstream-container .topology-metrics-card div .empty::before,.consul-exposed-path-list>ul>li>.detail dl.empty dt::before,.consul-exposed-path-list>ul>li>.header .empty dd::before,.consul-instance-checks.empty dt::before,.consul-lock-session-list ul>li:not(:first-child)>.detail dl.empty dt::before,.consul-lock-session-list ul>li:not(:first-child)>.header .empty dd::before,.consul-upstream-instance-list li>.detail dl.empty dt::before,.consul-upstream-instance-list li>.header .empty dd::before,.list-collection>ul>li:not(:first-child)>.detail dl.empty dt::before,.list-collection>ul>li:not(:first-child)>.header .empty dd::before,.popover-select .value-empty button::before{--icon-name:icon-minus-square-fill;content:""}@keyframes icon-more-horizontal{100%{-webkit-mask-image:var(--icon-more-horizontal-16);mask-image:var(--icon-more-horizontal-16);background-color:var(--icon-color,var(--color-more-horizontal-500,currentColor))}}@keyframes icon-public-default{100%{-webkit-mask-image:var(--icon-globe-16);mask-image:var(--icon-globe-16);background-color:var(--icon-color,var(--color-public-default-500,currentColor))}}.consul-auth-method-list ul .locality::before,.consul-exposed-path-list>ul>li>.detail dl.address dt::before,.consul-lock-session-list ul>li:not(:first-child)>.detail dl.address dt::before,.consul-upstream-instance-list li>.detail dl.address dt::before,.list-collection>ul>li:not(:first-child)>.detail dl.address dt::before{--icon-name:icon-public-default;content:""}@keyframes icon-search{100%{-webkit-mask-image:var(--icon-search-16);mask-image:var(--icon-search-16);background-color:var(--icon-color,var(--color-search-500,currentColor))}}@keyframes icon-star-outline{100%{-webkit-mask-image:var(--icon-star-16);mask-image:var(--icon-star-16);background-color:var(--icon-color,var(--color-star-outline-500,currentColor))}}.consul-external-source.leader::before,.leader::before{--icon-name:icon-star-outline;content:""}@keyframes icon-user-organization{100%{-webkit-mask-image:var(--icon-org-16);mask-image:var(--icon-org-16);background-color:var(--icon-color,var(--color-user-organization-500,currentColor))}}.consul-exposed-path-list>ul>li>.detail dl.datacenter dt::before,.consul-lock-session-list ul>li:not(:first-child)>.detail dl.datacenter dt::before,.consul-upstream-instance-list dl.datacenter dt::before,.list-collection>ul>li:not(:first-child)>.detail dl.datacenter dt::before{--icon-name:icon-user-organization;content:""}@keyframes icon-user-plain{100%{-webkit-mask-image:var(--icon-user-16);mask-image:var(--icon-user-16);background-color:var(--icon-color,var(--color-user-plain-500,currentColor))}}.consul-exposed-path-list>ul>li>.detail .role::before,.consul-lock-session-list ul>li:not(:first-child)>.detail .role::before,.consul-upstream-instance-list li>.detail .role::before,.list-collection>ul>li:not(:first-child)>.detail .role::before{--icon-name:icon-user-plain;content:""}@keyframes icon-user-team{100%{-webkit-mask-image:var(--icon-users-16);mask-image:var(--icon-users-16);background-color:var(--icon-color,var(--color-user-team-500,currentColor))}}#downstream-container .topology-metrics-card div .partition dt::before,#upstream-container .topology-metrics-card div .partition dt::before,.consul-bucket-list .partition::before,.consul-intention-list span[class|=partition]::before,.consul-upstream-instance-list dl.partition dt::before,.consul-upstream-list dl.partition dt::before,.type-source.popover-select li.partition button::before{--icon-name:icon-user-team;content:""}@keyframes icon-visibility-hide{100%{-webkit-mask-image:var(--icon-eye-off-16);mask-image:var(--icon-eye-off-16);background-color:var(--icon-color,var(--color-visibility-hide-500,currentColor))}}.certificate button.hide::before,.type-reveal input:checked+span::before{--icon-name:icon-visibility-hide;content:""}@keyframes icon-visibility-show{100%{-webkit-mask-image:var(--icon-eye-16);mask-image:var(--icon-eye-16);background-color:var(--icon-color,var(--color-visibility-show-500,currentColor))}}.certificate button.show::before,.type-reveal span::before{--icon-name:icon-visibility-show;content:""}@keyframes icon-alert-circle{100%{-webkit-mask-image:var(--icon-alert-circle-16);mask-image:var(--icon-alert-circle-16);background-color:var(--icon-color,var(--color-alert-circle-500,currentColor))}}@keyframes icon-aws{100%{-webkit-mask-image:var(--icon-aws-color-16);mask-image:var(--icon-aws-color-16);background-color:var(--icon-color,var(--color-aws-500,currentColor))}}@keyframes icon-aws-color{100%{background-image:var(--icon-aws-color-16)}}@keyframes icon-check{100%{-webkit-mask-image:var(--icon-check-16);mask-image:var(--icon-check-16);background-color:var(--icon-color,var(--color-check-500,currentColor))}}@keyframes icon-check-circle{100%{-webkit-mask-image:var(--icon-check-circle-16);mask-image:var(--icon-check-circle-16);background-color:var(--icon-color,var(--color-check-circle-500,currentColor))}}@keyframes icon-check-circle-fill{100%{-webkit-mask-image:var(--icon-check-circle-fill-16);mask-image:var(--icon-check-circle-fill-16);background-color:var(--icon-color,var(--color-check-circle-fill-500,currentColor))}}#downstream-container .topology-metrics-card div .passing::before,#upstream-container .topology-metrics-card div .passing::before,.consul-exposed-path-list>ul>li>.detail dl.passing dt::before,.consul-exposed-path-list>ul>li>.header .passing dd::before,.consul-exposed-path-list>ul>li>.header [rel=me] dd::before,.consul-health-check-list .passing.health-check-output::before,.consul-instance-checks.passing dt::before,.consul-intention-list .notice.allow::before,.consul-lock-session-list ul>li:not(:first-child)>.detail dl.passing dt::before,.consul-lock-session-list ul>li:not(:first-child)>.header .passing dd::before,.consul-lock-session-list ul>li:not(:first-child)>.header [rel=me] dd::before,.consul-upstream-instance-list li>.detail dl.passing dt::before,.consul-upstream-instance-list li>.header .passing dd::before,.consul-upstream-instance-list li>.header [rel=me] dd::before,.list-collection>ul>li:not(:first-child)>.detail dl.passing dt::before,.list-collection>ul>li:not(:first-child)>.header .passing dd::before,.list-collection>ul>li:not(:first-child)>.header [rel=me] dd::before,.notice.success::before,.popover-select .value-passing button::before{--icon-name:icon-check-circle-fill;content:""}@keyframes icon-chevron-left{100%{-webkit-mask-image:var(--icon-chevron-left-16);mask-image:var(--icon-chevron-left-16);background-color:var(--icon-color,var(--color-chevron-left-500,currentColor))}}.empty-state .back-link>::after,main header nav:first-child ol li:first-child a::before{--icon-name:icon-chevron-left;content:""}@keyframes icon-chevron-right{100%{-webkit-mask-image:var(--icon-chevron-right-16);mask-image:var(--icon-chevron-right-16);background-color:var(--icon-color,var(--color-chevron-right-500,currentColor))}}#login-toggle+div footer button::after{--icon-name:icon-chevron-right;content:""}@keyframes icon-chevron-up{100%{-webkit-mask-image:var(--icon-chevron-up-16);mask-image:var(--icon-chevron-up-16);background-color:var(--icon-color,var(--color-chevron-up-500,currentColor))}}.hashicorp-consul nav li.nspaces .disclosure-menu>button[aria-expanded=true]::after,.hashicorp-consul nav li.partitions .disclosure-menu>button[aria-expanded=true]::after,.list-collection>button::after,.more-popover-menu>[type=checkbox]:checked+label>::after,.popover-menu>[type=checkbox]:checked+label>::after,.topology-notices button[aria-expanded=true]::before,table.has-actions tr>.actions>[type=checkbox]:checked+label>::after,table.with-details tr>.actions>[type=checkbox]:checked+label>::after{--icon-name:icon-chevron-up;content:""}@keyframes icon-consul{100%{-webkit-mask-image:var(--icon-consul-color-16);mask-image:var(--icon-consul-color-16);background-color:var(--icon-color,var(--color-consul-500,currentColor))}}@keyframes icon-delay{100%{-webkit-mask-image:var(--icon-delay-16);mask-image:var(--icon-delay-16);background-color:var(--icon-color,var(--color-delay-500,currentColor))}}.consul-exposed-path-list>ul>li>.detail dl.lock-delay dt::before,.consul-lock-session-list ul>li:not(:first-child)>.detail dl.lock-delay dt::before,.consul-upstream-instance-list li>.detail dl.lock-delay dt::before,.list-collection>ul>li:not(:first-child)>.detail dl.lock-delay dt::before{--icon-name:icon-delay;content:""}@keyframes icon-docs-link{100%{-webkit-mask-image:var(--icon-docs-link-16);mask-image:var(--icon-docs-link-16);background-color:var(--icon-color,var(--color-docs-link-500,currentColor))}}@keyframes icon-gateway{100%{-webkit-mask-image:var(--icon-gateway-16);mask-image:var(--icon-gateway-16);background-color:var(--icon-color,var(--color-gateway-500,currentColor))}}.consul-kind::before{--icon-name:icon-gateway;content:""}@keyframes icon-git-commit{100%{-webkit-mask-image:var(--icon-git-commit-16);mask-image:var(--icon-git-commit-16);background-color:var(--icon-color,var(--color-git-commit-500,currentColor))}}.consul-exposed-path-list>ul>li>.detail dl.node dt::before,.consul-lock-session-list ul>li:not(:first-child)>.detail dl.node dt::before,.consul-upstream-instance-list li>.detail dl.node dt::before,.list-collection>ul>li:not(:first-child)>.detail dl.node dt::before{--icon-name:icon-git-commit;content:""}@keyframes icon-history{100%{-webkit-mask-image:var(--icon-history-16);mask-image:var(--icon-history-16);background-color:var(--icon-color,var(--color-history-500,currentColor))}}.consul-exposed-path-list>ul>li>.detail dl.ttl dt::before,.consul-lock-session-list ul>li:not(:first-child)>.detail dl.ttl dt::before,.consul-upstream-instance-list li>.detail dl.ttl dt::before,.list-collection>ul>li:not(:first-child)>.detail dl.ttl dt::before{--icon-name:icon-history;content:""}@keyframes icon-info{100%{-webkit-mask-image:var(--icon-info-16);mask-image:var(--icon-info-16);background-color:var(--icon-color,var(--color-info-500,currentColor))}}@keyframes icon-layers{100%{-webkit-mask-image:var(--icon-layers-16);mask-image:var(--icon-layers-16);background-color:var(--icon-color,var(--color-layers-500,currentColor))}}.topology-metrics-popover.l7 .tippy-arrow::after,.topology-metrics-popover.l7>button::before{--icon-name:icon-layers;content:"";--icon-color:rgb(var(--tone-gray-300))}@keyframes icon-loading{100%{-webkit-mask-image:var(--icon-loading-16);mask-image:var(--icon-loading-16);background-color:var(--icon-color,var(--color-loading-500,currentColor))}}@keyframes icon-path{100%{-webkit-mask-image:var(--icon-path-16);mask-image:var(--icon-path-16);background-color:var(--icon-color,var(--color-path-500,currentColor))}}.consul-exposed-path-list>ul>li>.detail dl.path dt::before,.consul-lock-session-list ul>li:not(:first-child)>.detail dl.path dt::before,.consul-upstream-instance-list li>.detail dl.path dt::before,.list-collection>ul>li:not(:first-child)>.detail dl.path dt::before{--icon-name:icon-path;content:""}@keyframes icon-skip{100%{-webkit-mask-image:var(--icon-skip-16);mask-image:var(--icon-skip-16);background-color:var(--icon-color,var(--color-skip-500,currentColor))}}@keyframes icon-socket{100%{-webkit-mask-image:var(--icon-socket-16);mask-image:var(--icon-socket-16);background-color:var(--icon-color,var(--color-socket-500,currentColor))}}.consul-exposed-path-list>ul>li>.detail dl.socket dt::before,.consul-lock-session-list ul>li:not(:first-child)>.detail dl.socket dt::before,.consul-upstream-instance-list li>.detail dl.socket dt::before,.list-collection>ul>li:not(:first-child)>.detail dl.socket dt::before{--icon-name:icon-socket;content:""}@keyframes icon-star-circle{100%{-webkit-mask-image:var(--icon-star-circle-16);mask-image:var(--icon-star-circle-16);background-color:var(--icon-color,var(--color-star-circle-500,currentColor))}}@keyframes icon-star-fill{100%{-webkit-mask-image:var(--icon-star-fill-16);mask-image:var(--icon-star-fill-16);background-color:var(--icon-color,var(--color-star-fill-500,currentColor))}}.consul-exposed-path-list>ul>li>.detail .policy-management::before,.consul-exposed-path-list>ul>li>.header .policy-management dd::before,.consul-lock-session-list ul>li:not(:first-child)>.detail .policy-management::before,.consul-lock-session-list ul>li:not(:first-child)>.header .policy-management dd::before,.consul-upstream-instance-list li>.detail .policy-management::before,.consul-upstream-instance-list li>.header .policy-management dd::before,.list-collection>ul>li:not(:first-child)>.detail .policy-management::before,.list-collection>ul>li:not(:first-child)>.header .policy-management dd::before,.notice.highlight::before,.notice.policy-management::before{--icon-name:icon-star-fill;content:""}@keyframes icon-tag{100%{-webkit-mask-image:var(--icon-tag-16);mask-image:var(--icon-tag-16);background-color:var(--icon-color,var(--color-tag-500,currentColor))}}.tag-list dt::before,td.tags dt::before{--icon-name:icon-tag;content:""}@keyframes icon-vault{100%{-webkit-mask-image:var(--icon-vault-color-16);mask-image:var(--icon-vault-color-16);background-color:var(--icon-color,var(--color-vault-500,currentColor))}}@keyframes icon-x{100%{-webkit-mask-image:var(--icon-x-16);mask-image:var(--icon-x-16);background-color:var(--icon-color,var(--color-x-500,currentColor))}}@keyframes icon-x-circle{100%{-webkit-mask-image:var(--icon-x-circle-16);mask-image:var(--icon-x-circle-16);background-color:var(--icon-color,var(--color-x-circle-500,currentColor))}}@keyframes icon-cloud-cross{100%{-webkit-mask-image:var(--icon-cloud-cross-16);mask-image:var(--icon-cloud-cross-16);background-color:var(--icon-color,var(--color-cloud-cross-500,currentColor))}}@keyframes icon-loading-motion{100%{-webkit-mask-image:var(--icon-loading-motion-16);mask-image:var(--icon-loading-motion-16);background-color:var(--icon-color,var(--color-loading-motion-500,currentColor))}}@keyframes icon-logo-auth0-color{100%{background-image:var(--icon-auth0-color-16)}}.oidc-select .auth0-oidc-provider::before{--icon-name:icon-logo-auth0-color;content:""}@keyframes icon-logo-consul-color{100%{background-image:var(--icon-consul-color-16)}}.consul-external-source.consul-api-gateway::before,.consul-external-source.consul::before,.popover-select .consul button::before,.popover-select .consul-api-gateway button::before{--icon-name:icon-logo-consul-color;content:""}@keyframes icon-logo-ember-circle-color{100%{background-image:var(--icon-logo-ember-circle-color-16)}}@keyframes icon-logo-glimmer-color{100%{background-image:var(--icon-logo-glimmer-color-16)}}@keyframes icon-logo-jwt-color{100%{background-image:var(--icon-logo-jwt-color-16)}}.consul-external-source.jwt::before,.consul-health-check-list .health-check-output dd em.jwt::before,.consul-intention-list td strong.jwt::before,.consul-intention-permission-list strong.jwt::before,.consul-intention-search-bar li button span.jwt::before,.consul-server-card .health-status+dd.jwt::before,.discovery-chain .route-card>header ul li.jwt::before,.hashicorp-consul nav .dcs li.is-local span.jwt::before,.hashicorp-consul nav .dcs li.is-primary span.jwt::before,.jwt.consul-auth-method-type::before,.jwt.consul-kind::before,.jwt.consul-source::before,.jwt.consul-transparent-proxy::before,.jwt.leader::before,.jwt.topology-metrics-source-type::before,.popover-select .jwt button::before,.search-bar-status li.jwt:not(.remove-all)::before,html[data-route^="dc.acls.index"] main td strong.jwt::before,section[data-route="dc.show.serverstatus"] .redundancy-zones section header dl.jwt::before,section[data-route="dc.show.serverstatus"] .server-failure-tolerance header em.jwt::before,span.jwt.policy-node-identity::before,span.jwt.policy-service-identity::before{--icon-name:icon-logo-jwt-color;content:""}@keyframes icon-logo-microsoft-color{100%{background-image:var(--icon-microsoft-color-16)}}.oidc-select .microsoft-oidc-provider::before{--icon-name:icon-logo-microsoft-color;content:""}@keyframes icon-logo-nomad-color{100%{background-image:var(--icon-nomad-color-16)}}.consul-external-source.nomad::before,.popover-select .nomad button::before{--icon-name:icon-logo-nomad-color;content:""}@keyframes icon-logo-oidc-color{100%{background-image:var(--icon-logo-oidc-color-16)}}.consul-external-source.oidc::before,.consul-health-check-list .health-check-output dd em.oidc::before,.consul-intention-list td strong.oidc::before,.consul-intention-permission-list strong.oidc::before,.consul-intention-search-bar li button span.oidc::before,.consul-server-card .health-status+dd.oidc::before,.discovery-chain .route-card>header ul li.oidc::before,.hashicorp-consul nav .dcs li.is-local span.oidc::before,.hashicorp-consul nav .dcs li.is-primary span.oidc::before,.oidc.consul-auth-method-type::before,.oidc.consul-kind::before,.oidc.consul-source::before,.oidc.consul-transparent-proxy::before,.oidc.leader::before,.oidc.topology-metrics-source-type::before,.popover-select .oidc button::before,.search-bar-status li.oidc:not(.remove-all)::before,html[data-route^="dc.acls.index"] main td strong.oidc::before,section[data-route="dc.show.serverstatus"] .redundancy-zones section header dl.oidc::before,section[data-route="dc.show.serverstatus"] .server-failure-tolerance header em.oidc::before,span.oidc.policy-node-identity::before,span.oidc.policy-service-identity::before{--icon-name:icon-logo-oidc-color;content:""}@keyframes icon-logo-okta-color{100%{background-image:var(--icon-okta-color-16)}}.oidc-select .okta-oidc-provider::before{--icon-name:icon-logo-okta-color;content:""}@keyframes icon-logo-terraform-color{100%{background-image:var(--icon-terraform-color-16)}}.consul-external-source.terraform::before,.popover-select .terraform button::before{--icon-name:icon-logo-terraform-color;content:""}@keyframes icon-mesh{100%{-webkit-mask-image:var(--icon-mesh-16);mask-image:var(--icon-mesh-16);background-color:var(--icon-color,var(--color-mesh-500,currentColor))}}.consul-exposed-path-list>ul>li>.detail dl.mesh dt::before,.consul-lock-session-list ul>li:not(:first-child)>.detail dl.mesh dt::before,.consul-upstream-instance-list li>.detail dl.mesh dt::before,.list-collection>ul>li:not(:first-child)>.detail dl.mesh dt::before{--icon-name:icon-mesh;content:""}@keyframes icon-port{100%{-webkit-mask-image:var(--icon-port-16);mask-image:var(--icon-port-16);background-color:var(--icon-color,var(--color-port-500,currentColor))}}.consul-exposed-path-list>ul>li>.detail dl.port dt::before,.consul-lock-session-list ul>li:not(:first-child)>.detail dl.port dt::before,.consul-upstream-instance-list li>.detail dl.port dt::before,.list-collection>ul>li:not(:first-child)>.detail dl.port dt::before{--icon-name:icon-port;content:""}@keyframes icon-protocol{100%{-webkit-mask-image:var(--icon-protocol-16);mask-image:var(--icon-protocol-16);background-color:var(--icon-color,var(--color-protocol-500,currentColor))}}.consul-exposed-path-list>ul>li>.detail dl.protocol dt::before,.consul-lock-session-list ul>li:not(:first-child)>.detail dl.protocol dt::before,.consul-upstream-instance-list li>.detail dl.protocol dt::before,.list-collection>ul>li:not(:first-child)>.detail dl.protocol dt::before{--icon-name:icon-protocol;content:""}@keyframes icon-redirect{100%{-webkit-mask-image:var(--icon-redirect-16);mask-image:var(--icon-redirect-16);background-color:var(--icon-color,var(--color-redirect-500,currentColor))}}@keyframes icon-search-color{100%{background-image:var(--icon-search-color-16)}}[for=toolbar-toggle]{--icon-name:icon-search-color;content:""}@keyframes icon-sort{100%{-webkit-mask-image:var(--icon-sort-desc-16);mask-image:var(--icon-sort-desc-16);background-color:var(--icon-color,var(--color-sort-500,currentColor))}}.type-sort.popover-select label>::before{--icon-name:icon-sort;content:""}@keyframes icon-union{100%{-webkit-mask-image:var(--icon-union-16);mask-image:var(--icon-union-16);background-color:var(--icon-color,var(--color-union-500,currentColor))}}#downstream-container .topology-metrics-card .details .group span::before,#upstream-container .topology-metrics-card .details .group span::before{--icon-name:icon-union;content:""}.kubernetes.informed-action header::before{-webkit-mask-image:none;mask-image:none;background-color:var(--transparent)!important}.ember-basic-dropdown{position:relative}.ember-basic-dropdown,.ember-basic-dropdown-content,.ember-basic-dropdown-content *{box-sizing:border-box}.ember-basic-dropdown-content{position:absolute;width:auto;z-index:1000;background-color:#fff}.ember-basic-dropdown-content--left{left:0}.ember-basic-dropdown-content--right{right:0}.ember-basic-dropdown-overlay{position:fixed;background:rgba(0,0,0,.5);width:100%;height:100%;z-index:10;top:0;left:0;pointer-events:none}.ember-basic-dropdown-content-wormhole-origin{display:inline}.ember-power-select-dropdown *{box-sizing:border-box}.ember-power-select-trigger{position:relative;border-radius:4px;background-color:#fff;line-height:1.75;overflow-x:hidden;text-overflow:ellipsis;min-height:1.75em;user-select:none;-webkit-user-select:none;color:inherit}.ember-power-select-trigger:after{content:"";display:table;clear:both}.ember-power-select-trigger--active,.ember-power-select-trigger:focus{box-shadow:none}.ember-basic-dropdown-trigger--below.ember-power-select-trigger[aria-expanded=true],.ember-basic-dropdown-trigger--in-place.ember-power-select-trigger[aria-expanded=true]{border-bottom-left-radius:0;border-bottom-right-radius:0}.ember-basic-dropdown-trigger--above.ember-power-select-trigger[aria-expanded=true]{border-top-left-radius:0;border-top-right-radius:0}.ember-power-select-placeholder{color:#999;display:block;overflow-x:hidden;white-space:nowrap;text-overflow:ellipsis}.ember-power-select-status-icon{position:absolute;display:inline-block;width:0;height:0;top:0;bottom:0;margin:auto;border-style:solid;border-width:7px 4px 0;border-color:#aaa transparent transparent;right:5px}.ember-basic-dropdown-trigger[aria-expanded=true] .ember-power-select-status-icon{transform:rotate(180deg)}.ember-power-select-clear-btn{position:absolute;cursor:pointer;right:25px}.ember-power-select-trigger-multiple-input{font-family:inherit;font-size:inherit;border:none;display:inline-block;line-height:inherit;-webkit-appearance:none;outline:0;padding:0;float:left;background-color:transparent;text-indent:2px}.ember-power-select-trigger-multiple-input:disabled{background-color:#eee}.ember-power-select-trigger-multiple-input::placeholder{opacity:1;color:#999}.ember-power-select-trigger-multiple-input::-webkit-input-placeholder{opacity:1;color:#999}.ember-power-select-trigger-multiple-input::-moz-placeholder{opacity:1;color:#999}.ember-power-select-trigger-multiple-input::-ms-input-placeholder{opacity:1;color:#999}.active.discovery-chain [id*=":"],.discovery-chain path,.ember-power-select-multiple-remove-btn:not(:hover){opacity:.5}.ember-power-select-multiple-options{padding:0;margin:0}.ember-power-select-multiple-option{border:1px solid gray;border-radius:4px;color:#333;background-color:#e4e4e4;padding:0 4px;display:inline-block;line-height:1.45;float:left;margin:2px 0 2px 3px}.ember-power-select-multiple-remove-btn{cursor:pointer}.ember-power-select-search{padding:4px}.ember-power-select-search-input{border:1px solid #aaa;border-radius:0;width:100%;font-size:inherit;line-height:inherit;padding:0 5px}.ember-power-select-search-input:focus{border:1px solid #aaa;box-shadow:none}.ember-power-select-dropdown{border-left:1px solid #aaa;border-right:1px solid #aaa;line-height:1.75;border-radius:4px;box-shadow:none;overflow:hidden;color:inherit}.ember-power-select-dropdown.ember-basic-dropdown-content--above{border-top:1px solid #aaa;border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0}.ember-power-select-dropdown.ember-basic-dropdown-content--below,.ember-power-select-dropdown.ember-basic-dropdown-content--in-place{border-top:none;border-bottom:1px solid #aaa;border-top-left-radius:0;border-top-right-radius:0}.ember-power-select-dropdown.ember-basic-dropdown-content--in-place{width:100%}.ember-power-select-options{list-style:none;margin:0;padding:0;user-select:none;-webkit-user-select:none}.ember-power-select-placeholder,.ember-power-select-selected-item,a[rel*=external]::after{margin-left:8px}.ember-power-select-options[role=listbox]{overflow-y:auto;-webkit-overflow-scrolling:touch;max-height:12.25em}.ember-power-select-option{cursor:pointer;padding:0 8px}.ember-power-select-group[aria-disabled=true]{color:#999;cursor:not-allowed}.ember-power-select-group[aria-disabled=true] .ember-power-select-option,.ember-power-select-option[aria-disabled=true]{color:#999;pointer-events:none;cursor:not-allowed}.ember-power-select-option[aria-selected=true]{background-color:#ddd}.ember-power-select-option[aria-current=true]{background-color:#5897fb;color:#fff}.ember-power-select-group-name{cursor:default;font-weight:700}.ember-power-select-trigger[aria-disabled=true]{background-color:#eee}.ember-power-select-trigger{padding:0 16px 0 0}.ember-power-select-group .ember-power-select-group .ember-power-select-group-name{padding-left:24px}.ember-power-select-group .ember-power-select-group .ember-power-select-option{padding-left:40px}.ember-power-select-group .ember-power-select-option{padding-left:24px}.ember-power-select-group .ember-power-select-group-name{padding-left:8px}.ember-power-select-trigger[dir=rtl]{padding:0 0 0 16px}.ember-power-select-trigger[dir=rtl] .ember-power-select-placeholder,.ember-power-select-trigger[dir=rtl] .ember-power-select-selected-item{margin-right:8px}.ember-power-select-trigger[dir=rtl] .ember-power-select-multiple-option,.ember-power-select-trigger[dir=rtl] .ember-power-select-trigger-multiple-input{float:right}.ember-power-select-trigger[dir=rtl] .ember-power-select-status-icon{left:5px;right:initial}.ember-power-select-trigger[dir=rtl] .ember-power-select-clear-btn{left:25px;right:initial}.ember-power-select-dropdown[dir=rtl] .ember-power-select-group .ember-power-select-group .ember-power-select-group-name{padding-right:24px}.ember-power-select-dropdown[dir=rtl] .ember-power-select-group .ember-power-select-group .ember-power-select-option{padding-right:40px}.ember-power-select-dropdown[dir=rtl] .ember-power-select-group .ember-power-select-option{padding-right:24px}.ember-power-select-dropdown[dir=rtl] .ember-power-select-group .ember-power-select-group-name{padding-right:8px}#login-toggle+div footer button:focus,#login-toggle+div footer button:hover,.consul-intention-fieldsets .permissions>button:focus,.consul-intention-fieldsets .permissions>button:hover,.empty-state>ul>li>:focus,.empty-state>ul>li>:hover,.empty-state>ul>li>label>button:focus,.empty-state>ul>li>label>button:hover,.modal-dialog [role=document] dd a:focus,.modal-dialog [role=document] dd a:hover,.modal-dialog [role=document] p a:focus,.modal-dialog [role=document] p a:hover,.oidc-select button.reset:focus,.oidc-select button.reset:hover,.search-bar-status .remove-all button:focus,.search-bar-status .remove-all button:hover,label.type-dialog:focus,label.type-dialog:hover,main dd a:focus,main dd a:hover,main p a:focus,main p a:hover{text-decoration:underline}#login-toggle+div footer button,.consul-intention-fieldsets .permissions>button,.empty-state>ul>li>*,.empty-state>ul>li>:active,.empty-state>ul>li>:focus,.empty-state>ul>li>:hover,.empty-state>ul>li>label>button,.empty-state>ul>li>label>button:active,.empty-state>ul>li>label>button:focus,.empty-state>ul>li>label>button:hover,.modal-dialog [role=document] dd a,.modal-dialog [role=document] p a,.oidc-select button.reset,.search-bar-status .remove-all button,label.type-dialog,label.type-dialog:active,label.type-dialog:focus,label.type-dialog:hover,main dd a,main dd a:active,main dd a:focus,main dd a:hover,main p a,main p a:active,main p a:focus,main p a:hover{color:rgb(var(--color-action))}.modal-dialog [role=document] label a[rel*=help],div.with-confirmation p,main label a[rel*=help]{color:rgb(var(--tone-gray-400))}#login-toggle+div footer button,.consul-intention-fieldsets .permissions>button,.empty-state>ul>li>*,.empty-state>ul>li>label>button,.modal-dialog [role=document] dd a,.modal-dialog [role=document] p a,.oidc-select button.reset,.search-bar-status .remove-all button,label.type-dialog,main dd a,main p a{cursor:pointer;background-color:var(--transparent)}#login-toggle+div footer button:active,.consul-intention-fieldsets .permissions>button:active,.empty-state>ul>li>:active,.empty-state>ul>li>label>button:active,.modal-dialog [role=document] dd a:active,.modal-dialog [role=document] p a:active,.oidc-select button.reset:active,.search-bar-status .remove-all button:active,label.type-dialog:active,main dd a:active,main p a:active{outline:0}.modal-dialog [role=document] a[rel*=help]::after,main a[rel*=help]::after{opacity:.4}.modal-dialog [role=document] h2 a,main h2 a{color:rgb(var(--tone-gray-900))}.modal-dialog [role=document] h2 a[rel*=help]::after,main h2 a[rel*=help]::after{font-size:.65em;margin-top:.2em;margin-left:.2em}.tab-section>p:only-child [rel*=help]::after{content:none}.auth-form{width:320px;margin:-20px 25px 0}.auth-form em{color:rgb(var(--tone-gray-500));font-style:normal;display:inline-block;margin-top:1em}.auth-form .oidc-select,.auth-form form{padding-top:1em}.auth-form form{margin-bottom:0!important}.auth-form .ember-basic-dropdown-trigger,.auth-form button:not(.reset){width:100%}.auth-form .progress{margin:0 auto}#login-toggle+div footer button::after{font-size:120%;position:relative;top:-1px;left:-3px}#login-toggle+div footer{border-top:0;padding:10px 42px 20px;background-color:var(--transparent)}#login-toggle+div>div>div>div{padding-bottom:0}.auth-profile{padding:.9em 1em}.auth-profile dt span{font-weight:var(--typo-weight-normal)}.auth-profile dt{font-weight:var(--typo-weight-bold)}.auth-profile dd,.auth-profile dt{color:rgb(var(--tone-gray-800))}.auth-profile dt span{color:rgb(var(--tone-gray-600))}main header nav:first-child ol li a{color:rgb(var(--tone-gray-500));text-decoration:none}main header nav:first-child ol li a:hover{color:rgb(var(--tone-blue-500));text-decoration:underline}main header nav:first-child ol li a::before{text-decoration:none}main header nav:first-child ol>li{list-style-type:none;display:inline-flex}main header nav:first-child ol li:first-child a::before{background-color:rgb(var(--tone-gray-500));margin-right:4px;display:inline-block}main header nav:first-child ol li:not(:first-child) a{margin-left:6px}main header nav:first-child ol li:not(:first-child) a::before{content:"/";color:rgb(var(--tone-gray-500));margin-right:8px;display:inline-block}main header nav:first-child{position:absolute;top:12px}.app-view>div form button[type=button].type-delete,.consul-intention-action-warn-modal button.dangerous,.copy-button button,.disclosure-menu [aria-expanded]~*>ul>[role=treeitem],.disclosure-menu [aria-expanded]~*>ul>li>[role=menuitem],.disclosure-menu [aria-expanded]~*>ul>li>[role=option],.empty-state div>button,.hashicorp-consul nav li.nspaces .disclosure-menu>button,.hashicorp-consul nav li.partitions .disclosure-menu>button,.informed-action>ul>li>*,.menu-panel>ul>[role=treeitem],.menu-panel>ul>li>[role=menuitem],.menu-panel>ul>li>[role=option],.modal-dialog .type-delete,.more-popover-menu>[type=checkbox]+label+div>ul>[role=treeitem],.more-popover-menu>[type=checkbox]+label+div>ul>li>[role=menuitem],.more-popover-menu>[type=checkbox]+label+div>ul>li>[role=option],.oidc-select button:not(.reset),.popover-menu>[type=checkbox]+label+div>ul>[role=treeitem],.popover-menu>[type=checkbox]+label+div>ul>li>[role=menuitem],.popover-menu>[type=checkbox]+label+div>ul>li>[role=option],.popover-select label>*,.topology-notices button,.type-sort.popover-select label>*,.with-confirmation .type-delete,a.type-create,button.type-cancel,button.type-submit,button[type=reset],button[type=submit],header .actions button[type=button]:not(.copy-btn),table.has-actions tr>.actions>[type=checkbox]+label+div>ul>[role=treeitem],table.has-actions tr>.actions>[type=checkbox]+label+div>ul>li>[role=menuitem],table.has-actions tr>.actions>[type=checkbox]+label+div>ul>li>[role=option],table.with-details tr>.actions>[type=checkbox]+label+div>ul>[role=treeitem],table.with-details tr>.actions>[type=checkbox]+label+div>ul>li>[role=menuitem],table.with-details tr>.actions>[type=checkbox]+label+div>ul>li>[role=option]{cursor:pointer;white-space:nowrap;text-decoration:none}.app-view>div form button[type=button].type-delete:disabled,.consul-intention-action-warn-modal button.dangerous:disabled,.copy-button button:disabled,.disclosure-menu [aria-expanded]~*>ul>[role=treeitem]:disabled,.disclosure-menu [aria-expanded]~*>ul>li>[role=menuitem]:disabled,.disclosure-menu [aria-expanded]~*>ul>li>[role=option]:disabled,.empty-state div>button:disabled,.hashicorp-consul nav li.nspaces .disclosure-menu>button:disabled,.hashicorp-consul nav li.partitions .disclosure-menu>button:disabled,.informed-action>ul>li>:disabled,.menu-panel>ul>[role=treeitem]:disabled,.menu-panel>ul>li>[role=menuitem]:disabled,.menu-panel>ul>li>[role=option]:disabled,.modal-dialog .type-delete:disabled,.more-popover-menu>[type=checkbox]+label+div>ul>[role=treeitem]:disabled,.more-popover-menu>[type=checkbox]+label+div>ul>li>[role=menuitem]:disabled,.more-popover-menu>[type=checkbox]+label+div>ul>li>[role=option]:disabled,.oidc-select button:disabled:not(.reset),.popover-menu>[type=checkbox]+label+div>ul>[role=treeitem]:disabled,.popover-menu>[type=checkbox]+label+div>ul>li>[role=menuitem]:disabled,.popover-menu>[type=checkbox]+label+div>ul>li>[role=option]:disabled,.popover-select label>:disabled,.topology-notices button:disabled,.with-confirmation .type-delete:disabled,a.type-create:disabled,button.type-cancel:disabled,button.type-submit:disabled,button[type=reset]:disabled,button[type=submit]:disabled,header .actions button[type=button]:disabled:not(.copy-btn),table.has-actions tr>.actions>[type=checkbox]+label+div>ul>[role=treeitem]:disabled,table.has-actions tr>.actions>[type=checkbox]+label+div>ul>li>[role=menuitem]:disabled,table.has-actions tr>.actions>[type=checkbox]+label+div>ul>li>[role=option]:disabled,table.with-details tr>.actions>[type=checkbox]+label+div>ul>[role=treeitem]:disabled,table.with-details tr>.actions>[type=checkbox]+label+div>ul>li>[role=menuitem]:disabled,table.with-details tr>.actions>[type=checkbox]+label+div>ul>li>[role=option]:disabled{cursor:default;box-shadow:none}.checkbox-group label,.more-popover-menu>[type=checkbox]~label,.popover-menu>[type=checkbox]~label,html[data-route^="dc.acls.index"] .filter-bar [role=radiogroup] label,table.has-actions tr>.actions>[type=checkbox]~label,table.with-details tr>.actions>[type=checkbox]~label{cursor:pointer}.app-view>div form button[type=button].type-delete,.consul-intention-action-warn-modal button.dangerous,.empty-state div>button,.modal-dialog .type-delete,.oidc-select button:not(.reset),.with-confirmation .type-delete,a.type-create,button.type-cancel,button.type-submit,button[type=reset],button[type=submit],header .actions button[type=button]:not(.copy-btn){border-width:1px;border-radius:var(--decor-radius-100);box-shadow:var(--decor-elevation-300)}button.type-cancel:disabled,button[type=reset]:disabled,header .actions button[type=button]:disabled:not(.copy-btn){color:rgb(var(--tone-gray-600))}.disclosure-menu [aria-expanded]~*>ul>[role=treeitem],.disclosure-menu [aria-expanded]~*>ul>li>[role=menuitem],.disclosure-menu [aria-expanded]~*>ul>li>[role=option],.hashicorp-consul nav li.nspaces .disclosure-menu>button,.hashicorp-consul nav li.partitions .disclosure-menu>button,.informed-action>ul>li>*,.menu-panel>ul>[role=treeitem],.menu-panel>ul>li>[role=menuitem],.menu-panel>ul>li>[role=option],.more-popover-menu>[type=checkbox]+label+div>ul>[role=treeitem],.more-popover-menu>[type=checkbox]+label+div>ul>li>[role=menuitem],.more-popover-menu>[type=checkbox]+label+div>ul>li>[role=option],.popover-menu>[type=checkbox]+label+div>ul>[role=treeitem],.popover-menu>[type=checkbox]+label+div>ul>li>[role=menuitem],.popover-menu>[type=checkbox]+label+div>ul>li>[role=option],table.has-actions tr>.actions>[type=checkbox]+label+div>ul>[role=treeitem],table.has-actions tr>.actions>[type=checkbox]+label+div>ul>li>[role=menuitem],table.has-actions tr>.actions>[type=checkbox]+label+div>ul>li>[role=option],table.with-details tr>.actions>[type=checkbox]+label+div>ul>[role=treeitem],table.with-details tr>.actions>[type=checkbox]+label+div>ul>li>[role=menuitem],table.with-details tr>.actions>[type=checkbox]+label+div>ul>li>[role=option]{color:rgb(var(--tone-gray-900));background-color:rgb(var(--tone-gray-000))}.disclosure-menu [aria-expanded]~*>ul>[role=treeitem]:focus,.disclosure-menu [aria-expanded]~*>ul>[role=treeitem]:hover,.disclosure-menu [aria-expanded]~*>ul>li>[role=menuitem]:focus,.disclosure-menu [aria-expanded]~*>ul>li>[role=menuitem]:hover,.disclosure-menu [aria-expanded]~*>ul>li>[role=option]:focus,.disclosure-menu [aria-expanded]~*>ul>li>[role=option]:hover,.hashicorp-consul nav li.nspaces .disclosure-menu>button:focus,.hashicorp-consul nav li.nspaces .disclosure-menu>button:hover,.hashicorp-consul nav li.partitions .disclosure-menu>button:focus,.hashicorp-consul nav li.partitions .disclosure-menu>button:hover,.informed-action>ul>li>:focus,.informed-action>ul>li>:hover,.menu-panel>ul>[role=treeitem]:focus,.menu-panel>ul>[role=treeitem]:hover,.menu-panel>ul>li>[role=menuitem]:focus,.menu-panel>ul>li>[role=menuitem]:hover,.menu-panel>ul>li>[role=option]:focus,.menu-panel>ul>li>[role=option]:hover,.more-popover-menu>[type=checkbox]+label+div>ul>[role=treeitem]:focus,.more-popover-menu>[type=checkbox]+label+div>ul>[role=treeitem]:hover,.more-popover-menu>[type=checkbox]+label+div>ul>li>[role=menuitem]:focus,.more-popover-menu>[type=checkbox]+label+div>ul>li>[role=menuitem]:hover,.more-popover-menu>[type=checkbox]+label+div>ul>li>[role=option]:focus,.more-popover-menu>[type=checkbox]+label+div>ul>li>[role=option]:hover,.popover-menu>[type=checkbox]+label+div>ul>[role=treeitem]:focus,.popover-menu>[type=checkbox]+label+div>ul>[role=treeitem]:hover,.popover-menu>[type=checkbox]+label+div>ul>li>[role=menuitem]:focus,.popover-menu>[type=checkbox]+label+div>ul>li>[role=menuitem]:hover,.popover-menu>[type=checkbox]+label+div>ul>li>[role=option]:focus,.popover-menu>[type=checkbox]+label+div>ul>li>[role=option]:hover,table.has-actions tr>.actions>[type=checkbox]+label+div>ul>[role=treeitem]:focus,table.has-actions tr>.actions>[type=checkbox]+label+div>ul>[role=treeitem]:hover,table.has-actions tr>.actions>[type=checkbox]+label+div>ul>li>[role=menuitem]:focus,table.has-actions tr>.actions>[type=checkbox]+label+div>ul>li>[role=menuitem]:hover,table.has-actions tr>.actions>[type=checkbox]+label+div>ul>li>[role=option]:focus,table.has-actions tr>.actions>[type=checkbox]+label+div>ul>li>[role=option]:hover,table.with-details tr>.actions>[type=checkbox]+label+div>ul>[role=treeitem]:focus,table.with-details tr>.actions>[type=checkbox]+label+div>ul>[role=treeitem]:hover,table.with-details tr>.actions>[type=checkbox]+label+div>ul>li>[role=menuitem]:focus,table.with-details tr>.actions>[type=checkbox]+label+div>ul>li>[role=menuitem]:hover,table.with-details tr>.actions>[type=checkbox]+label+div>ul>li>[role=option]:focus,table.with-details tr>.actions>[type=checkbox]+label+div>ul>li>[role=option]:hover{background-color:rgb(var(--tone-gray-050))}.type-sort.popover-select label>::before{position:relative;width:16px;height:16px}.type-sort.popover-select label>::after{top:0!important}.app-view>div form button[type=button].type-delete,.consul-intention-action-warn-modal button.dangerous,.copy-button button,.empty-state div>button,.modal-dialog .type-delete,.oidc-select button:not(.reset),.popover-select label>*,.topology-notices button,.type-sort.popover-select label>*,.with-confirmation .type-delete,a.type-create,button.type-cancel,button.type-submit,button[type=reset],button[type=submit],header .actions button[type=button]:not(.copy-btn){position:relative}.app-view>div form button[type=button].type-delete .progress.indeterminate,.consul-intention-action-warn-modal button.dangerous .progress.indeterminate,.copy-button button .progress.indeterminate,.empty-state div>button .progress.indeterminate,.modal-dialog .type-delete .progress.indeterminate,.oidc-select button:not(.reset) .progress.indeterminate,.popover-select label>* .progress.indeterminate,.topology-notices button .progress.indeterminate,.with-confirmation .type-delete .progress.indeterminate,a.type-create .progress.indeterminate,button.type-cancel .progress.indeterminate,button.type-submit .progress.indeterminate,button[type=reset] .progress.indeterminate,button[type=submit] .progress.indeterminate,header .actions button[type=button]:not(.copy-btn) .progress.indeterminate{position:absolute;top:50%;left:50%;margin-left:-12px;margin-top:-12px}.app-view>div form button[type=button].type-delete:disabled .progress+*,.consul-intention-action-warn-modal button.dangerous:disabled .progress+*,.copy-button button:disabled .progress+*,.empty-state div>button:disabled .progress+*,.modal-dialog .type-delete:disabled .progress+*,.oidc-select button:disabled:not(.reset) .progress+*,.popover-select label>:disabled .progress+*,.topology-notices button:disabled .progress+*,.with-confirmation .type-delete:disabled .progress+*,a.type-create:disabled .progress+*,button.type-cancel:disabled .progress+*,button.type-submit:disabled .progress+*,button[type=reset]:disabled .progress+*,button[type=submit]:disabled .progress+*,header .actions button[type=button]:disabled:not(.copy-btn) .progress+*{visibility:hidden}.app-view>div form button[type=button].type-delete:empty,.consul-intention-action-warn-modal button.dangerous:empty,.copy-button button:empty,.empty-state div>button:empty,.modal-dialog .type-delete:empty,.oidc-select button:empty:not(.reset),.popover-select label>:empty,.topology-notices button:empty,.with-confirmation .type-delete:empty,a.type-create:empty,button.type-cancel:empty,button.type-submit:empty,button[type=reset]:empty,button[type=submit]:empty,header .actions button[type=button]:empty:not(.copy-btn){padding-right:0!important;padding-left:18px!important;margin-right:5px}.app-view>div form button[type=button].type-delete:empty::before,.consul-intention-action-warn-modal button.dangerous:empty::before,.copy-button button:empty::before,.empty-state div>button:empty::before,.modal-dialog .type-delete:empty::before,.oidc-select button:empty:not(.reset)::before,.popover-select label>:empty::before,.topology-notices button:empty::before,.with-confirmation .type-delete:empty::before,a.type-create:empty::before,button.type-cancel:empty::before,button.type-submit:empty::before,button[type=reset]:empty::before,button[type=submit]:empty::before,header .actions button[type=button]:empty:not(.copy-btn)::before{left:1px}.app-view>div form button[type=button].type-delete:not(:empty),.consul-intention-action-warn-modal button.dangerous:not(:empty),.copy-button button:not(:empty),.empty-state div>button:not(:empty),.modal-dialog .type-delete:not(:empty),.oidc-select button:not(:empty):not(.reset),.popover-select label>:not(:empty),.topology-notices button:not(:empty),.with-confirmation .type-delete:not(:empty),a.type-create:not(:empty),button.type-cancel:not(:empty),button.type-submit:not(:empty),button[type=reset]:not(:empty),button[type=submit]:not(:empty),header .actions button[type=button]:not(:empty):not(.copy-btn){display:inline-flex;text-align:center;justify-content:center;align-items:center;padding:calc(.5em - 1px) calc(2.2em - 1px);min-width:100px}.app-view>div form button[type=button].type-delete:not(:last-child),.consul-intention-action-warn-modal button.dangerous:not(:last-child),.copy-button button:not(:last-child),.empty-state div>button:not(:last-child),.modal-dialog .type-delete:not(:last-child),.oidc-select button:not(:last-child):not(.reset),.popover-select label>:not(:last-child),.topology-notices button:not(:last-child),.with-confirmation .type-delete:not(:last-child),a.type-create:not(:last-child),button.type-cancel:not(:last-child),button.type-submit:not(:last-child),button[type=reset]:not(:last-child),button[type=submit]:not(:last-child),header .actions button[type=button]:not(:last-child):not(.copy-btn){margin-right:8px}.app-view>header .actions a,.app-view>header .actions button{padding-top:calc(.4em - 1px)!important;padding-bottom:calc(.4em - 1px)!important}.disclosure-menu [aria-expanded]~*>ul>[role=treeitem],.disclosure-menu [aria-expanded]~*>ul>li>[role=menuitem],.disclosure-menu [aria-expanded]~*>ul>li>[role=option],.hashicorp-consul nav li.nspaces .disclosure-menu>button,.hashicorp-consul nav li.partitions .disclosure-menu>button,.informed-action>ul>li>*,.menu-panel>ul>[role=treeitem],.menu-panel>ul>li>[role=menuitem],.menu-panel>ul>li>[role=option],.more-popover-menu>[type=checkbox]+label+div>ul>[role=treeitem],.more-popover-menu>[type=checkbox]+label+div>ul>li>[role=menuitem],.more-popover-menu>[type=checkbox]+label+div>ul>li>[role=option],.popover-menu>[type=checkbox]+label+div>ul>[role=treeitem],.popover-menu>[type=checkbox]+label+div>ul>li>[role=menuitem],.popover-menu>[type=checkbox]+label+div>ul>li>[role=option],table.has-actions tr>.actions>[type=checkbox]+label+div>ul>[role=treeitem],table.has-actions tr>.actions>[type=checkbox]+label+div>ul>li>[role=menuitem],table.has-actions tr>.actions>[type=checkbox]+label+div>ul>li>[role=option],table.with-details tr>.actions>[type=checkbox]+label+div>ul>[role=treeitem],table.with-details tr>.actions>[type=checkbox]+label+div>ul>li>[role=menuitem],table.with-details tr>.actions>[type=checkbox]+label+div>ul>li>[role=option]{padding:.9em 1em;text-align:center;display:inline-block;box-sizing:border-box}.type-sort.popover-select label>*{height:35px!important}.discovery-chain .resolver-card,.discovery-chain .route-card,.discovery-chain .splitter-card{border:var(--decor-border-100);border-radius:var(--decor-radius-100);background-color:rgb(var(--tone-gray-000) /90%);display:block;position:relative}.discovery-chain .resolver-card>section,.discovery-chain .resolver-card>ul>li,.discovery-chain .route-card>section,.discovery-chain .route-card>ul>li,.discovery-chain .splitter-card>section,.discovery-chain .splitter-card>ul>li{border-top:var(--decor-border-100)}.discovery-chain .resolver-card,.discovery-chain .resolver-card>section,.discovery-chain .resolver-card>ul>li,.discovery-chain .route-card,.discovery-chain .route-card>section,.discovery-chain .route-card>ul>li,.discovery-chain .splitter-card,.discovery-chain .splitter-card>section,.discovery-chain .splitter-card>ul>li{border-color:rgb(var(--tone-gray-200))}.discovery-chain .resolver-card:focus,.discovery-chain .resolver-card:hover,.discovery-chain .route-card:focus,.discovery-chain .route-card:hover,.discovery-chain .splitter-card:focus,.discovery-chain .splitter-card:hover{box-shadow:var(--decor-elevation-400)}.discovery-chain .resolver-card>header,.discovery-chain .route-card>header,.discovery-chain .splitter-card>header{padding:10px}.discovery-chain .resolver-card>section,.discovery-chain .resolver-card>ul>li,.discovery-chain .route-card>section,.discovery-chain .route-card>ul>li,.discovery-chain .splitter-card>section,.discovery-chain .splitter-card>ul>li{padding:5px 10px}.discovery-chain .resolver-card ul,.discovery-chain .route-card ul,.discovery-chain .splitter-card ul{list-style-type:none;margin:0;padding:0}.checkbox-group label{margin-right:10px;white-space:nowrap}.checkbox-group span{display:inline-block;margin-left:10px;min-width:50px}.CodeMirror{max-width:1260px;min-height:300px;height:auto;padding-bottom:20px}.CodeMirror-scroll{overflow-x:hidden!important}.CodeMirror-lint-tooltip{background-color:#f9f9fa;border:1px solid var(--syntax-light-gray);border-radius:0;color:#212121;font-size:13px;padding:7px 8px 9px}.cm-s-hashi.CodeMirror{width:100%;background-color:rgb(var(--tone-gray-999))!important;color:#cfd2d1!important;border:none;-webkit-font-smoothing:auto;line-height:1.4}.cm-s-hashi .CodeMirror-gutters{color:var(--syntax-dark-grey);background-color:var(--syntax-gutter-grey);border:none}.cm-s-hashi .CodeMirror-cursor{border-left:solid thin #f8f8f0}.cm-s-hashi .CodeMirror-linenumber{color:#6d8a88}.cm-s-hashi.CodeMirror-focused div.CodeMirror-selected{background:#214283}.cm-s-hashi .CodeMirror-line::selection,.cm-s-hashi .CodeMirror-line>span::selection,.cm-s-hashi .CodeMirror-line>span>span::selection{background:#214283}.cm-s-hashi .CodeMirror-line::-moz-selection,.cm-s-hashi .CodeMirror-line>span::-moz-selection,.cm-s-hashi .CodeMirror-line>span>span::-moz-selection{background:rgb(var(--tone-gray-000) /10%)}.cm-s-hashi span.cm-comment{color:var(--syntax-light-grey)}.cm-s-hashi span.cm-string,.cm-s-hashi span.cm-string-2{color:var(--syntax-packer)}.cm-s-hashi span.cm-number{color:var(--syntax-serf)}.cm-s-hashi span.cm-variable,.cm-s-hashi span.cm-variable-2{color:#9e84c5}.cm-s-hashi span.cm-def{color:var(--syntax-packer)}.cm-s-hashi span.cm-operator{color:var(--syntax-gray)}.cm-s-hashi span.cm-keyword{color:var(--syntax-yellow)}.cm-s-hashi span.cm-atom{color:var(--syntax-serf)}.cm-s-hashi span.cm-meta,.cm-s-hashi span.cm-tag{color:var(--syntax-packer)}.cm-s-hashi span.cm-error{color:var(--syntax-red)}.cm-s-hashi span.cm-attribute,.cm-s-hashi span.cm-qualifier{color:#9fca56}.cm-s-hashi span.cm-property{color:#9e84c5}.cm-s-hashi span.cm-builtin,.cm-s-hashi span.cm-variable-3{color:#9fca56}.cm-s-hashi .CodeMirror-activeline-background{background:#101213}.cm-s-hashi .CodeMirror-matchingbracket{text-decoration:underline;color:rgb(var(--tone-gray-000))!important}.readonly-codemirror .CodeMirror-cursors{display:none}.readonly-codemirror .cm-s-hashi span{color:var(--syntax-light-grey)}.readonly-codemirror .cm-s-hashi span.cm-string,.readonly-codemirror .cm-s-hashi span.cm-string-2{color:var(--syntax-faded-gray)}.readonly-codemirror .cm-s-hashi span.cm-number{color:#a3acbc}.app .skip-links,.readonly-codemirror .cm-s-hashi span.cm-property{color:rgb(var(--tone-gray-000))}.readonly-codemirror .cm-s-hashi span.cm-variable-2{color:var(--syntax-light-grey-blue)}.code-editor .toolbar-container{background:rgb(var(--tone-gray-050));background:linear-gradient(180deg,rgb(var(--tone-gray-050)) 50%,rgb(var(--tone-gray-150)) 100%);border:1px solid;border-bottom-color:rgb(var(--tone-gray-600));border-top-color:rgb(var(--tone-gray-400))}.code-editor .toolbar-container .toolbar .title{color:rgb(var(--tone-gray-900));font-size:14px;font-weight:700;padding:0 8px}.code-editor .toolbar-container .toolbar .toolbar-separator{border-right:1px solid rgb(var(--tone-gray-300))}.code-editor .toolbar-container .ember-power-select-trigger{background-color:rgb(var(--tone-gray-000));color:rgb(var(--tone-gray-999));border-radius:var(--decor-radius-100);border:var(--decor-border-100);border-color:rgb(var(--tone-gray-700))}.code-editor::after,.consul-auth-method-binding-list dl dd .copy-button button::before,.consul-auth-method-view dl dd .copy-button button::before{background-color:rgb(var(--tone-gray-999))}.code-editor{display:block;border:10px;overflow:hidden;position:relative;clear:both}.code-editor::after{position:absolute;bottom:0;width:100%;height:25px;content:"";display:block}.code-editor>pre{display:none}.code-editor .toolbar-container,.code-editor .toolbar-container .toolbar{align-items:center;justify-content:space-between;display:flex}.code-editor .toolbar-container{position:relative;margin-top:4px;height:44px}.code-editor .toolbar-container .toolbar{flex:1;white-space:nowrap}.code-editor .toolbar-container .toolbar .toolbar-separator{height:32px;margin:0 4px;width:0}.code-editor .toolbar-container .toolbar .tools{display:flex;flex-direction:row;margin:0 10px;align-items:center}.code-editor .toolbar-container .toolbar .tools .copy-button{margin-left:10px}.code-editor .toolbar-container .ember-basic-dropdown-trigger{margin:0 8px;width:120px;height:32px;display:flex;align-items:center;flex-direction:row}.consul-exposed-path-list>ul>li,.consul-lock-session-list ul>li:not(:first-child),.consul-upstream-instance-list li,.list-collection>ul>li:not(:first-child){display:grid;grid-template-columns:1fr auto;grid-template-rows:50% 50%;grid-template-areas:"header actions" "detail actions"}.consul-exposed-path-list>ul>li>.header,.consul-lock-session-list ul>li:not(:first-child)>.header,.consul-upstream-instance-list li>.header,.list-collection>ul>li:not(:first-child)>.header{grid-area:header;align-self:start}.consul-exposed-path-list>ul>li>.detail,.consul-lock-session-list ul>li:not(:first-child)>.detail,.consul-upstream-instance-list li>.detail,.list-collection>ul>li:not(:first-child)>.detail{grid-area:detail;align-self:end}.consul-exposed-path-list>ul>li>.detail *,.consul-lock-session-list ul>li:not(:first-child)>.detail *,.consul-upstream-instance-list li>.detail *,.list-collection>ul>li:not(:first-child)>.detail *{flex-wrap:nowrap!important}.consul-exposed-path-list>ul>li>.actions,.consul-lock-session-list ul>li:not(:first-child)>.actions,.consul-upstream-instance-list li>.actions,.list-collection>ul>li:not(:first-child)>.actions{grid-area:actions;display:inline-flex}.consul-nspace-list>ul>li:not(:first-child) dt,.consul-policy-list>ul li:not(:first-child) dl:not(.datacenter) dt,.consul-role-list>ul>li:not(:first-child) dt,.consul-service-instance-list .port dt,.consul-service-instance-list .port dt::before,.consul-token-list>ul>li:not(:first-child) dt{display:none}.consul-exposed-path-list>ul>li>.header:nth-last-child(2),.consul-lock-session-list ul>li:not(:first-child)>.header:nth-last-child(2),.consul-upstream-instance-list li>.header:nth-last-child(2),.list-collection>ul>li:not(:first-child)>.header:nth-last-child(2){grid-column-start:header;grid-column-end:actions}.consul-exposed-path-list>ul>li>.detail:last-child,.consul-lock-session-list ul>li:not(:first-child)>.detail:last-child,.consul-upstream-instance-list li>.detail:last-child,.list-collection>ul>li:not(:first-child)>.detail:last-child{grid-column-start:detail;grid-column-end:actions}.consul-nspace-list>ul>li:not(:first-child) dt+dd,.consul-policy-list>ul li:not(:first-child) dl:not(.datacenter) dt+dd,.consul-role-list>ul>li:not(:first-child) dt+dd,.consul-token-list>ul>li:not(:first-child) dt+dd{margin-left:0!important}.consul-policy-list dl.datacenter dt,.consul-service-list li>div:first-child>dl:first-child dd{margin-top:1px}.app-view>div form:not(.filter-bar) [role=radiogroup] label>em,.consul-exposed-path-list>ul>li>.detail .copy-button,.consul-lock-session-list ul>li:not(:first-child)>.detail .copy-button,.consul-upstream-instance-list li>.detail .copy-button,.list-collection>ul>li:not(:first-child)>.detail .copy-button,.modal-dialog [role=document] .type-password>em,.modal-dialog [role=document] .type-select>em,.modal-dialog [role=document] .type-text>em,.modal-dialog [role=document] [role=radiogroup] label>em,.modal-dialog [role=document] form button+em,.oidc-select label>em,.type-toggle>em,main .type-password>em,main .type-select>em,main .type-text>em,main form button+em{margin-top:2px}.consul-service-instance-list .detail,.consul-service-list .detail{overflow-x:visible!important}.consul-intention-permission-list>ul{border-top:1px solid rgb(var(--tone-gray-200))}.consul-service-instance-list .port .copy-button{margin-right:0}.consul-exposed-path-list>ul>li .copy-button,.consul-lock-session-list ul>li:not(:first-child) .copy-button,.consul-upstream-instance-list li .copy-button,.list-collection>ul>li:not(:first-child) .copy-button{display:inline-flex}.consul-exposed-path-list>ul>li>.header .copy-button,.consul-lock-session-list ul>li:not(:first-child)>.header .copy-button,.consul-upstream-instance-list li>.header .copy-button,.list-collection>ul>li:not(:first-child)>.header .copy-button{margin-left:4px}.consul-exposed-path-list>ul>li .copy-button button,.consul-lock-session-list ul>li:not(:first-child) .copy-button button,.consul-upstream-instance-list li .copy-button button,.list-collection>ul>li:not(:first-child) .copy-button button{padding:0!important;margin:0!important}.consul-exposed-path-list>ul>li>.header .copy-button button,.consul-lock-session-list ul>li:not(:first-child)>.header .copy-button button,.consul-upstream-instance-list li>.header .copy-button button,.list-collection>ul>li:not(:first-child)>.header .copy-button button{display:none}.consul-exposed-path-list>ul>li>.header:hover .copy-button button,.consul-lock-session-list ul>li:not(:first-child)>.header:hover .copy-button button,.consul-upstream-instance-list li>.header:hover .copy-button button,.list-collection>ul>li:not(:first-child)>.header:hover .copy-button button{display:block}.consul-exposed-path-list>ul>li .copy-button button:hover,.consul-lock-session-list ul>li:not(:first-child) .copy-button button:hover,.consul-upstream-instance-list li .copy-button button:hover,.list-collection>ul>li:not(:first-child) .copy-button button:hover{background-color:transparent!important}.consul-exposed-path-list>ul>li>.detail>.consul-external-source:first-child,.consul-exposed-path-list>ul>li>.detail>.consul-kind:first-child,.consul-lock-session-list ul>li:not(:first-child)>.detail>.consul-external-source:first-child,.consul-lock-session-list ul>li:not(:first-child)>.detail>.consul-kind:first-child,.consul-upstream-instance-list li>.detail>.consul-external-source:first-child,.consul-upstream-instance-list li>.detail>.consul-kind:first-child,.list-collection>ul>li:not(:first-child)>.detail>.consul-external-source:first-child,.list-collection>ul>li:not(:first-child)>.detail>.consul-kind:first-child{margin-left:-5px}.consul-exposed-path-list>ul>li>.detail .policy-management::before,.consul-exposed-path-list>ul>li>.detail .policy::before,.consul-exposed-path-list>ul>li>.detail .role::before,.consul-lock-session-list ul>li:not(:first-child)>.detail .policy-management::before,.consul-lock-session-list ul>li:not(:first-child)>.detail .policy::before,.consul-lock-session-list ul>li:not(:first-child)>.detail .role::before,.consul-upstream-instance-list li>.detail .policy-management::before,.consul-upstream-instance-list li>.detail .policy::before,.consul-upstream-instance-list li>.detail .role::before,.list-collection>ul>li:not(:first-child)>.detail .policy-management::before,.list-collection>ul>li:not(:first-child)>.detail .policy::before,.list-collection>ul>li:not(:first-child)>.detail .role::before{margin-right:3px}.consul-exposed-path-list>ul>li>.detail .policy-management::before,.consul-exposed-path-list>ul>li>.header .policy-management dd::before,.consul-lock-session-list ul>li:not(:first-child)>.detail .policy-management::before,.consul-lock-session-list ul>li:not(:first-child)>.header .policy-management dd::before,.consul-upstream-instance-list li>.detail .policy-management::before,.consul-upstream-instance-list li>.header .policy-management dd::before,.list-collection>ul>li:not(:first-child)>.detail .policy-management::before,.list-collection>ul>li:not(:first-child)>.header .policy-management dd::before{--icon-color:rgb(var(--tone-brand-600))}table div.with-confirmation.confirming{background-color:rgb(var(--tone-gray-000))}div.with-confirmation p{margin-right:12px;padding-left:12px;margin-bottom:0!important}div.with-confirmation{float:right;display:flex;align-items:center}table td>div.with-confirmation.confirming{position:absolute;right:0}@media (max-width:420px){div.with-confirmation{float:none;margin-top:1em;display:block}div.with-confirmation p{margin-bottom:1em}}.copy-button button{color:rgb(var(--tone-blue-500));--icon-color:var(--transparent);min-height:17px}.copy-button button::after{--icon-color:rgb(var(--tone-gray-050))}.copy-button button:focus,.copy-button button:hover:not(:disabled):not(:active){color:rgb(var(--tone-blue-500));--icon-color:rgb(var(--tone-gray-050))}.copy-button button:hover::before{--icon-color:rgb(var(--tone-blue-500))}.copy-button button:active{--icon-color:rgb(var(--tone-gray-200))}.copy-button button:empty{padding:0!important;margin-right:0;top:-1px}.copy-button button:empty::after{content:"";display:none;position:absolute;top:-2px;left:-3px;width:20px;height:22px}.copy-button button:empty:hover::after{display:block}.copy-button button:empty::before{position:relative;z-index:1}.copy-button button:not(:empty)::before{margin-right:4px}.consul-bucket-list .copy-button,.consul-exposed-path-list>ul>li>.detail dl .copy-button,.consul-instance-checks .copy-button,.consul-lock-session-list dl .copy-button,.consul-lock-session-list ul>li:not(:first-child)>.detail dl .copy-button,.consul-upstream-instance-list dl .copy-button,.list-collection>ul>li:not(:first-child)>.detail dl .copy-button,.tag-list .copy-button,section[data-route="dc.show.license"] .validity dl .copy-button,section[data-route="dc.show.serverstatus"] .redundancy-zones section header dl .copy-button,td.tags .copy-button{margin-top:0!important}.consul-bucket-list .copy-btn,.consul-exposed-path-list>ul>li>.detail dl .copy-btn,.consul-instance-checks .copy-btn,.consul-lock-session-list dl .copy-btn,.consul-lock-session-list ul>li:not(:first-child)>.detail dl .copy-btn,.consul-upstream-instance-list dl .copy-btn,.list-collection>ul>li:not(:first-child)>.detail dl .copy-btn,.tag-list .copy-btn,section[data-route="dc.show.license"] .validity dl .copy-btn,section[data-route="dc.show.serverstatus"] .redundancy-zones section header dl .copy-btn,td.tags .copy-btn{top:0!important}.consul-bucket-list .copy-btn:empty::before,.consul-exposed-path-list>ul>li>.detail dl .copy-btn:empty::before,.consul-instance-checks .copy-btn:empty::before,.consul-lock-session-list dl .copy-btn:empty::before,.consul-upstream-instance-list dl .copy-btn:empty::before,.list-collection>ul>li:not(:first-child)>.detail dl .copy-btn:empty::before,.tag-list .copy-btn:empty::before,section[data-route="dc.show.license"] .validity dl .copy-btn:empty::before,section[data-route="dc.show.serverstatus"] .redundancy-zones section header dl .copy-btn:empty::before,td.tags .copy-btn:empty::before{left:0!important}.definition-table>dl{display:grid;grid-template-columns:140px auto;grid-gap:.4em 20px;margin-bottom:1.4em}.definition-table>dl>dd>:not(dl){display:inline-block}.disclosure-menu{position:relative}.disclosure-menu [aria-expanded]~*{overflow-y:auto!important;will-change:scrollPosition}.more-popover-menu>[type=checkbox],.more-popover-menu>[type=checkbox]~:not(.animating):not(label),.popover-menu>[type=checkbox],.popover-menu>[type=checkbox]~:not(.animating):not(label),table.has-actions tr>.actions>[type=checkbox],table.has-actions tr>.actions>[type=checkbox]~:not(.animating):not(label),table.with-details tr>.actions>[type=checkbox],table.with-details tr>.actions>[type=checkbox]~:not(.animating):not(label){display:none}.more-popover-menu>[type=checkbox]:checked~:not(label),.popover-menu>[type=checkbox]:checked~:not(label),table.has-actions tr>.actions>[type=checkbox]:checked~:not(label),table.with-details tr>.actions>[type=checkbox]:checked~:not(label){display:block}table.dom-recycling{position:relative}table.dom-recycling tr>*{overflow:hidden}.list-collection-scroll-virtual>ul,table.dom-recycling tbody{overflow-x:hidden!important}table.dom-recycling dd{flex-wrap:nowrap}table.dom-recycling dd>*{margin-bottom:0}.empty-state,.empty-state>div{display:flex;flex-direction:column}.empty-state header :first-child{padding:0;margin:0}.empty-state{margin-top:0!important;padding-bottom:2.8em;color:rgb(var(--tone-gray-500));background-color:rgb(var(--tone-gray-010))}.empty-state>*{width:370px;margin:0 auto}.empty-state button{margin:0 auto;display:inline}.empty-state header :first-child{margin-bottom:-3px;border-bottom:none}.empty-state header{margin-top:1.8em;margin-bottom:.5em}.empty-state>ul{display:flex;justify-content:space-between;margin-top:1em}.empty-state>ul>li>*,.empty-state>ul>li>label>button{display:inline-flex;align-items:center}.empty-state>div:only-child{padding:50px 0 10px;text-align:center}.empty-state header::before{font-size:2.6em;position:relative;top:-3px;float:left;margin-right:10px}.empty-state>ul>li>::before,.empty-state>ul>li>label>button::before{margin-top:-1px;margin-right:.5em;font-size:.9em}.empty-state li[class*=-link]>::after{margin-left:5px}html[data-route^="dc.acls.index"] .filter-bar [role=radiogroup]{border:var(--decor-border-100);border-color:rgb(var(--tone-gray-300));border-radius:var(--decor-radius-100)}html[data-route^="dc.acls.index"] .filter-bar [role=radiogroup] input[type=radio]:checked+*,html[data-route^="dc.acls.index"] .filter-bar [role=radiogroup] input[type=radio]:focus+*,html[data-route^="dc.acls.index"] .filter-bar [role=radiogroup] input[type=radio]:hover+*{box-shadow:var(--decor-elevation-300);background-color:rgb(var(--tone-gray-000))}@media (min-width:996px){html[data-route^="dc.acls.index"] .filter-bar [role=radiogroup]{display:flex}html[data-route^="dc.acls.index"] .filter-bar [role=radiogroup] label{flex-grow:1}}html[data-route^="dc.acls.index"] .filter-bar [role=radiogroup] input[type=radio]{display:none}.app-view>div form:not(.filter-bar) [role=radiogroup] label,.app-view>div form:not(.filter-bar) [role=radiogroup] label textarea,.app-view>div form:not(.filter-bar) [role=radiogroup] label>em,.app-view>div form:not(.filter-bar) [role=radiogroup] label>span,.modal-dialog [role=document] .type-password,.modal-dialog [role=document] .type-password textarea,.modal-dialog [role=document] .type-password>em,.modal-dialog [role=document] .type-password>span,.modal-dialog [role=document] .type-select,.modal-dialog [role=document] .type-select textarea,.modal-dialog [role=document] .type-select>em,.modal-dialog [role=document] .type-select>span,.modal-dialog [role=document] .type-text,.modal-dialog [role=document] .type-text textarea,.modal-dialog [role=document] .type-text>em,.modal-dialog [role=document] .type-text>span,.modal-dialog [role=document] [role=radiogroup] label,.modal-dialog [role=document] [role=radiogroup] label textarea,.modal-dialog [role=document] [role=radiogroup] label>em,.modal-dialog [role=document] [role=radiogroup] label>span,.modal-dialog [role=document] form button+em,.oidc-select label,.oidc-select label textarea,.oidc-select label>em,.oidc-select label>span,.type-toggle,.type-toggle textarea,.type-toggle>em,.type-toggle>span,html[data-route^="dc.acls.index"] .filter-bar [role=radiogroup] label,html[data-route^="dc.acls.index"] .filter-bar [role=radiogroup] label span,main .type-password,main .type-password textarea,main .type-password>em,main .type-password>span,main .type-select,main .type-select textarea,main .type-select>em,main .type-select>span,main .type-text,main .type-text textarea,main .type-text>em,main .type-text>span,main form button+em,span.label{display:block}html[data-route^="dc.acls.index"] .filter-bar [role=radiogroup],html[data-route^="dc.acls.index"] .filter-bar [role=radiogroup] label,html[data-route^="dc.acls.index"] .filter-bar [role=radiogroup] label span{height:100%}html[data-route^="dc.acls.index"] .filter-bar [role=radiogroup] label span{padding:5px 14px}.app-view>div form:not(.filter-bar) [role=radiogroup] label [type=password],.app-view>div form:not(.filter-bar) [role=radiogroup] label [type=text],.app-view>div form:not(.filter-bar) [role=radiogroup] label textarea,.modal-dialog [role=document] .type-password [type=password],.modal-dialog [role=document] .type-password [type=text],.modal-dialog [role=document] .type-password textarea,.modal-dialog [role=document] .type-select [type=password],.modal-dialog [role=document] .type-select [type=text],.modal-dialog [role=document] .type-select textarea,.modal-dialog [role=document] .type-text [type=password],.modal-dialog [role=document] .type-text [type=text],.modal-dialog [role=document] .type-text textarea,.modal-dialog [role=document] [role=radiogroup] label [type=password],.modal-dialog [role=document] [role=radiogroup] label [type=text],.modal-dialog [role=document] [role=radiogroup] label textarea,.oidc-select label [type=password],.oidc-select label [type=text],.oidc-select label textarea,.type-toggle [type=password],.type-toggle [type=text],.type-toggle textarea,main .type-password [type=password],main .type-password [type=text],main .type-password textarea,main .type-select [type=password],main .type-select [type=text],main .type-select textarea,main .type-text [type=password],main .type-text [type=text],main .type-text textarea{-moz-appearance:none;-webkit-appearance:none;box-shadow:inset var(--decor-elevation-100);border-radius:var(--decor-radius-100);border:var(--decor-border-100);outline:0}.app-view>div form:not(.filter-bar) [role=radiogroup] label [type=password]:disabled,.app-view>div form:not(.filter-bar) [role=radiogroup] label [type=password]:read-only,.app-view>div form:not(.filter-bar) [role=radiogroup] label [type=text]:disabled,.app-view>div form:not(.filter-bar) [role=radiogroup] label [type=text]:read-only,.app-view>div form:not(.filter-bar) [role=radiogroup] label textarea:disabled,.app-view>div form:not(.filter-bar) [role=radiogroup] label textarea:read-only,.modal-dialog [role=document] .type-password [type=password]:disabled,.modal-dialog [role=document] .type-password [type=password]:read-only,.modal-dialog [role=document] .type-password [type=text]:disabled,.modal-dialog [role=document] .type-password [type=text]:read-only,.modal-dialog [role=document] .type-password textarea:disabled,.modal-dialog [role=document] .type-password textarea:read-only,.modal-dialog [role=document] .type-select [type=password]:disabled,.modal-dialog [role=document] .type-select [type=password]:read-only,.modal-dialog [role=document] .type-select [type=text]:disabled,.modal-dialog [role=document] .type-select [type=text]:read-only,.modal-dialog [role=document] .type-select textarea:disabled,.modal-dialog [role=document] .type-select textarea:read-only,.modal-dialog [role=document] .type-text [type=password]:disabled,.modal-dialog [role=document] .type-text [type=password]:read-only,.modal-dialog [role=document] .type-text [type=text]:disabled,.modal-dialog [role=document] .type-text [type=text]:read-only,.modal-dialog [role=document] .type-text textarea:disabled,.modal-dialog [role=document] .type-text textarea:read-only,.modal-dialog [role=document] [role=radiogroup] label [type=password]:disabled,.modal-dialog [role=document] [role=radiogroup] label [type=password]:read-only,.modal-dialog [role=document] [role=radiogroup] label [type=text]:disabled,.modal-dialog [role=document] [role=radiogroup] label [type=text]:read-only,.modal-dialog [role=document] [role=radiogroup] label textarea:disabled,.modal-dialog [role=document] [role=radiogroup] label textarea:read-only,.oidc-select label [type=password]:disabled,.oidc-select label [type=password]:read-only,.oidc-select label [type=text]:disabled,.oidc-select label [type=text]:read-only,.oidc-select label textarea:disabled,.oidc-select label textarea:read-only,.type-toggle [type=password]:disabled,.type-toggle [type=password]:read-only,.type-toggle [type=text]:disabled,.type-toggle [type=text]:read-only,.type-toggle textarea:disabled,.type-toggle textarea:read-only,main .type-password [type=password]:disabled,main .type-password [type=password]:read-only,main .type-password [type=text]:disabled,main .type-password [type=text]:read-only,main .type-password textarea:disabled,main .type-password textarea:read-only,main .type-select [type=password]:disabled,main .type-select [type=password]:read-only,main .type-select [type=text]:disabled,main .type-select [type=text]:read-only,main .type-select textarea:disabled,main .type-select textarea:read-only,main .type-text [type=password]:disabled,main .type-text [type=password]:read-only,main .type-text [type=text]:disabled,main .type-text [type=text]:read-only,main .type-text textarea:disabled,main .type-text textarea:read-only,textarea:disabled+.CodeMirror{cursor:not-allowed}.app-view>div form:not(.filter-bar) [role=radiogroup] label [type=password]::placeholder,.app-view>div form:not(.filter-bar) [role=radiogroup] label [type=text]::placeholder,.app-view>div form:not(.filter-bar) [role=radiogroup] label textarea::placeholder,.app-view>div form:not(.filter-bar) [role=radiogroup] label>em,.modal-dialog [role=document] .type-password [type=password]::placeholder,.modal-dialog [role=document] .type-password [type=text]::placeholder,.modal-dialog [role=document] .type-password textarea::placeholder,.modal-dialog [role=document] .type-password>em,.modal-dialog [role=document] .type-select [type=password]::placeholder,.modal-dialog [role=document] .type-select [type=text]::placeholder,.modal-dialog [role=document] .type-select textarea::placeholder,.modal-dialog [role=document] .type-select>em,.modal-dialog [role=document] .type-text [type=password]::placeholder,.modal-dialog [role=document] .type-text [type=text]::placeholder,.modal-dialog [role=document] .type-text textarea::placeholder,.modal-dialog [role=document] .type-text>em,.modal-dialog [role=document] [role=radiogroup] label [type=password]::placeholder,.modal-dialog [role=document] [role=radiogroup] label [type=text]::placeholder,.modal-dialog [role=document] [role=radiogroup] label textarea::placeholder,.modal-dialog [role=document] [role=radiogroup] label>em,.modal-dialog [role=document] form button+em,.modal-dialog [role=document] form fieldset>p,.oidc-select label [type=password]::placeholder,.oidc-select label [type=text]::placeholder,.oidc-select label textarea::placeholder,.oidc-select label>em,.type-toggle [type=password]::placeholder,.type-toggle [type=text]::placeholder,.type-toggle textarea::placeholder,.type-toggle>em,main .type-password [type=password]::placeholder,main .type-password [type=text]::placeholder,main .type-password textarea::placeholder,main .type-password>em,main .type-select [type=password]::placeholder,main .type-select [type=text]::placeholder,main .type-select textarea::placeholder,main .type-select>em,main .type-text [type=password]::placeholder,main .type-text [type=text]::placeholder,main .type-text textarea::placeholder,main .type-text>em,main form button+em,main form fieldset>p{color:rgb(var(--tone-gray-400))}.has-error>input,.has-error>textarea{border-color:var(--decor-error-500,rgb(var(--tone-red-500)))!important}.app-view>div form:not(.filter-bar) [role=radiogroup] label [type=password],.app-view>div form:not(.filter-bar) [role=radiogroup] label [type=text],.app-view>div form:not(.filter-bar) [role=radiogroup] label textarea,.modal-dialog [role=document] .type-password [type=password],.modal-dialog [role=document] .type-password [type=text],.modal-dialog [role=document] .type-password textarea,.modal-dialog [role=document] .type-select [type=password],.modal-dialog [role=document] .type-select [type=text],.modal-dialog [role=document] .type-select textarea,.modal-dialog [role=document] .type-text [type=password],.modal-dialog [role=document] .type-text [type=text],.modal-dialog [role=document] .type-text textarea,.modal-dialog [role=document] [role=radiogroup] label [type=password],.modal-dialog [role=document] [role=radiogroup] label [type=text],.modal-dialog [role=document] [role=radiogroup] label textarea,.oidc-select label [type=password],.oidc-select label [type=text],.oidc-select label textarea,.type-toggle [type=password],.type-toggle [type=text],.type-toggle textarea,main .type-password [type=password],main .type-password [type=text],main .type-password textarea,main .type-select [type=password],main .type-select [type=text],main .type-select textarea,main .type-text [type=password],main .type-text [type=text],main .type-text textarea{color:rgb(var(--tone-gray-500));border-color:rgb(var(--tone-gray-300))}.app-view>div form:not(.filter-bar) [role=radiogroup] label [type=password]:hover,.app-view>div form:not(.filter-bar) [role=radiogroup] label [type=text]:hover,.app-view>div form:not(.filter-bar) [role=radiogroup] label textarea:hover,.modal-dialog [role=document] .type-password [type=password]:hover,.modal-dialog [role=document] .type-password [type=text]:hover,.modal-dialog [role=document] .type-password textarea:hover,.modal-dialog [role=document] .type-select [type=password]:hover,.modal-dialog [role=document] .type-select [type=text]:hover,.modal-dialog [role=document] .type-select textarea:hover,.modal-dialog [role=document] .type-text [type=password]:hover,.modal-dialog [role=document] .type-text [type=text]:hover,.modal-dialog [role=document] .type-text textarea:hover,.modal-dialog [role=document] [role=radiogroup] label [type=password]:hover,.modal-dialog [role=document] [role=radiogroup] label [type=text]:hover,.modal-dialog [role=document] [role=radiogroup] label textarea:hover,.oidc-select label [type=password]:hover,.oidc-select label [type=text]:hover,.oidc-select label textarea:hover,.type-toggle [type=password]:hover,.type-toggle [type=text]:hover,.type-toggle textarea:hover,main .type-password [type=password]:hover,main .type-password [type=text]:hover,main .type-password textarea:hover,main .type-select [type=password]:hover,main .type-select [type=text]:hover,main .type-select textarea:hover,main .type-text [type=password]:hover,main .type-text [type=text]:hover,main .type-text textarea:hover{border-color:rgb(var(--tone-gray-500))}.app-view>div form:not(.filter-bar) [role=radiogroup] label [type=password]:focus,.app-view>div form:not(.filter-bar) [role=radiogroup] label [type=text]:focus,.app-view>div form:not(.filter-bar) [role=radiogroup] label textarea:focus,.modal-dialog [role=document] .type-password [type=password]:focus,.modal-dialog [role=document] .type-password [type=text]:focus,.modal-dialog [role=document] .type-password textarea:focus,.modal-dialog [role=document] .type-select [type=password]:focus,.modal-dialog [role=document] .type-select [type=text]:focus,.modal-dialog [role=document] .type-select textarea:focus,.modal-dialog [role=document] .type-text [type=password]:focus,.modal-dialog [role=document] .type-text [type=text]:focus,.modal-dialog [role=document] .type-text textarea:focus,.modal-dialog [role=document] [role=radiogroup] label [type=password]:focus,.modal-dialog [role=document] [role=radiogroup] label [type=text]:focus,.modal-dialog [role=document] [role=radiogroup] label textarea:focus,.oidc-select label [type=password]:focus,.oidc-select label [type=text]:focus,.oidc-select label textarea:focus,.type-toggle [type=password]:focus,.type-toggle [type=text]:focus,.type-toggle textarea:focus,main .type-password [type=password]:focus,main .type-password [type=text]:focus,main .type-password textarea:focus,main .type-select [type=password]:focus,main .type-select [type=text]:focus,main .type-select textarea:focus,main .type-text [type=password]:focus,main .type-text [type=text]:focus,main .type-text textarea:focus{border-color:var(--typo-action-500,rgb(var(--tone-blue-500)))}.app-view>div form:not(.filter-bar) [role=radiogroup] label a,.modal-dialog [role=document] .type-password a,.modal-dialog [role=document] .type-select a,.modal-dialog [role=document] .type-text a,.modal-dialog [role=document] [role=radiogroup] label a,.oidc-select label a,.type-toggle a,main .type-password a,main .type-select a,main .type-text a{display:inline}.app-view>div form:not(.filter-bar) [role=radiogroup] label [type=password],.app-view>div form:not(.filter-bar) [role=radiogroup] label [type=text],.modal-dialog [role=document] .type-password [type=password],.modal-dialog [role=document] .type-password [type=text],.modal-dialog [role=document] .type-select [type=password],.modal-dialog [role=document] .type-select [type=text],.modal-dialog [role=document] .type-text [type=password],.modal-dialog [role=document] .type-text [type=text],.modal-dialog [role=document] [role=radiogroup] label [type=password],.modal-dialog [role=document] [role=radiogroup] label [type=text],.oidc-select label [type=password],.oidc-select label [type=text],.type-toggle [type=password],.type-toggle [type=text],main .type-password [type=password],main .type-password [type=text],main .type-select [type=password],main .type-select [type=text],main .type-text [type=password],main .type-text [type=text]{display:inline-flex;justify-content:flex-start;max-width:100%;width:100%;height:0;padding:17px 13px}.app-view>div form:not(.filter-bar) [role=radiogroup] label textarea,.modal-dialog [role=document] .type-password textarea,.modal-dialog [role=document] .type-select textarea,.modal-dialog [role=document] .type-text textarea,.modal-dialog [role=document] [role=radiogroup] label textarea,.oidc-select label textarea,.type-toggle textarea,main .type-password textarea,main .type-select textarea,main .type-text textarea{resize:vertical;max-width:100%;min-width:100%;min-height:70px;padding:6px 13px}.app-view>div form:not(.filter-bar) [role=radiogroup],.app-view>div form:not(.filter-bar) [role=radiogroup] label,.checkbox-group,.modal-dialog [role=document] .type-password,.modal-dialog [role=document] .type-select,.modal-dialog [role=document] .type-text,.modal-dialog [role=document] [role=radiogroup],.modal-dialog [role=document] [role=radiogroup] label,.modal-dialog [role=document] form table,.oidc-select label,.type-toggle,main .type-password,main .type-select,main .type-text,main form table{margin-bottom:1.4em}.app-view>div form:not(.filter-bar) [role=radiogroup] label>span,.modal-dialog [role=document] .type-password>span,.modal-dialog [role=document] .type-select>span,.modal-dialog [role=document] .type-text>span,.modal-dialog [role=document] [role=radiogroup] label>span,.oidc-select label>span,.type-toggle>span,main .type-password>span,main .type-select>span,main .type-text>span,span.label{color:var(--typo-contrast-999,inherit);margin-bottom:.3em}.app-view>div form:not(.filter-bar) [role=radiogroup] label>span+em,.modal-dialog [role=document] .type-password>span+em,.modal-dialog [role=document] .type-select>span+em,.modal-dialog [role=document] .type-text>span+em,.modal-dialog [role=document] [role=radiogroup] label>span+em,.oidc-select label>span+em,.type-toggle>span+em,main .type-password>span+em,main .type-select>span+em,main .type-text>span+em,span.label+em{margin-top:-.5em;margin-bottom:.5em}label.type-dialog{cursor:pointer;float:right}.type-toggle+.checkbox-group{margin-top:-1em}.consul-exposed-path-list>ul>li,.consul-intention-permission-header-list>ul>li,.consul-intention-permission-list>ul>li,.consul-lock-session-list ul>li:not(:first-child),.consul-upstream-instance-list li,.list-collection>ul>li:not(:first-child){list-style-type:none;border:var(--decor-border-100);border-top-color:var(--transparent);border-bottom-color:rgb(var(--tone-gray-200));border-right-color:var(--transparent);border-left-color:var(--transparent);--horizontal-padding:12px;--vertical-padding:10px;padding:var(--vertical-padding) 0;padding-left:var(--horizontal-padding)}.consul-auth-method-list>ul>li:active:not(:first-child),.consul-auth-method-list>ul>li:focus:not(:first-child),.consul-auth-method-list>ul>li:hover:not(:first-child),.consul-exposed-path-list>ul>li.linkable:active,.consul-exposed-path-list>ul>li.linkable:focus,.consul-exposed-path-list>ul>li.linkable:hover,.consul-intention-permission-list:not(.readonly)>ul>li:active,.consul-intention-permission-list:not(.readonly)>ul>li:focus,.consul-intention-permission-list:not(.readonly)>ul>li:hover,.consul-lock-session-list ul>li.linkable:active:not(:first-child),.consul-lock-session-list ul>li.linkable:focus:not(:first-child),.consul-lock-session-list ul>li.linkable:hover:not(:first-child),.consul-node-list>ul>li:active:not(:first-child),.consul-node-list>ul>li:focus:not(:first-child),.consul-node-list>ul>li:hover:not(:first-child),.consul-policy-list>ul>li:active:not(:first-child),.consul-policy-list>ul>li:focus:not(:first-child),.consul-policy-list>ul>li:hover:not(:first-child),.consul-role-list>ul>li:active:not(:first-child),.consul-role-list>ul>li:focus:not(:first-child),.consul-role-list>ul>li:hover:not(:first-child),.consul-service-instance-list>ul>li:active:not(:first-child),.consul-service-instance-list>ul>li:focus:not(:first-child),.consul-service-instance-list>ul>li:hover:not(:first-child),.consul-token-list>ul>li:active:not(:first-child),.consul-token-list>ul>li:focus:not(:first-child),.consul-token-list>ul>li:hover:not(:first-child),.consul-upstream-instance-list li.linkable:active,.consul-upstream-instance-list li.linkable:focus,.consul-upstream-instance-list li.linkable:hover,.list-collection>ul>li.linkable:active:not(:first-child),.list-collection>ul>li.linkable:focus:not(:first-child),.list-collection>ul>li.linkable:hover:not(:first-child){border-color:rgb(var(--tone-gray-200));box-shadow:0 2px 4px rgb(var(--black) /10%);border-top-color:var(--transparent);cursor:pointer}.radio-card,.tippy-box{box-shadow:var(--decor-elevation-400)}.consul-exposed-path-list>ul>li>.header,.consul-lock-session-list ul>li:not(:first-child)>.header,.consul-upstream-instance-list li>.header,.list-collection>ul>li:not(:first-child)>.header{color:rgb(var(--tone-gray-999))}.consul-exposed-path-list>ul>li>.header *,.consul-lock-session-list ul>li:not(:first-child)>.header *,.consul-upstream-instance-list li>.header *,.list-collection>ul>li:not(:first-child)>.header *{color:inherit}.consul-exposed-path-list>ul>li>.detail,.consul-lock-session-list ul>li:not(:first-child)>.detail,.consul-upstream-instance-list li>.detail,.list-collection>ul>li:not(:first-child)>.detail,.radio-card{color:rgb(var(--tone-gray-500))}.consul-exposed-path-list>ul>li>.detail a,.consul-lock-session-list ul>li:not(:first-child)>.detail a,.consul-upstream-instance-list li>.detail a,.list-collection>ul>li:not(:first-child)>.detail a{color:inherit}.consul-exposed-path-list>ul>li>.detail a:hover,.consul-lock-session-list ul>li:not(:first-child)>.detail a:hover,.consul-upstream-instance-list li>.detail a:hover,.list-collection>ul>li:not(:first-child)>.detail a:hover{color:rgb(var(--color-action));text-decoration:underline}.consul-exposed-path-list>ul>li>.detail,.consul-exposed-path-list>ul>li>.header>dl:first-child,.consul-lock-session-list ul>li:not(:first-child)>.detail,.consul-lock-session-list ul>li:not(:first-child)>.header>dl:first-child,.consul-upstream-instance-list li>.detail,.consul-upstream-instance-list li>.header>dl:first-child,.list-collection>ul>li:not(:first-child)>.detail,.list-collection>ul>li:not(:first-child)>.header>dl:first-child{margin-right:6px}.consul-exposed-path-list>ul>li>.header dt,.consul-lock-session-list ul>li:not(:first-child)>.header dt,.consul-upstream-instance-list li>.header dt,.list-collection>ul>li:not(:first-child)>.header dt{display:none}.consul-exposed-path-list>ul>li>.header dd::before,.consul-lock-session-list ul>li:not(:first-child)>.header dd::before,.consul-upstream-instance-list li>.header dd::before,.list-collection>ul>li:not(:first-child)>.header dd::before{font-size:.9em}.consul-exposed-path-list>ul>li>.detail,.consul-exposed-path-list>ul>li>.header,.consul-lock-session-list ul>li:not(:first-child)>.detail,.consul-lock-session-list ul>li:not(:first-child)>.header,.consul-upstream-instance-list li>.detail,.consul-upstream-instance-list li>.header,.list-collection>ul>li:not(:first-child)>.detail,.list-collection>ul>li:not(:first-child)>.header{display:flex;flex-wrap:nowrap;overflow-x:hidden}.consul-exposed-path-list>ul>li>.detail *,.consul-exposed-path-list>ul>li>.header *,.consul-lock-session-list ul>li:not(:first-child)>.detail *,.consul-lock-session-list ul>li:not(:first-child)>.header *,.consul-upstream-instance-list li>.detail *,.consul-upstream-instance-list li>.header *,.list-collection>ul>li:not(:first-child)>.detail *,.list-collection>ul>li:not(:first-child)>.header *{white-space:nowrap;flex-wrap:nowrap}.consul-exposed-path-list>ul>li>.detail>span,.consul-lock-session-list ul>li:not(:first-child)>.detail>span,.consul-upstream-instance-list li>.detail>span,.list-collection>ul>li:not(:first-child)>.detail>span{margin-right:18px}.consul-intention-permission-header-list>ul>li,.consul-intention-permission-list>ul>li{padding-top:0!important;padding-bottom:0!important}.consul-intention-permission-header-list>ul>li .detail,.consul-intention-permission-list>ul>li .detail{grid-row-start:header!important;grid-row-end:detail!important;align-self:center!important;padding:5px 0}.consul-intention-permission-header-list>ul>li .popover-menu>[type=checkbox]+label,.consul-intention-permission-list>ul>li .popover-menu>[type=checkbox]+label{padding:0}.consul-intention-permission-header-list>ul>li .popover-menu>[type=checkbox]+label+div:not(.above),.consul-intention-permission-list>ul>li .popover-menu>[type=checkbox]+label+div:not(.above){top:30px}.has-error>strong{font-style:normal;font-weight:400;color:inherit;color:rgb(var(--color-failure));position:relative;padding-left:20px}.has-error>strong::before{font-size:14px;color:rgb(var(--tone-red-500));position:absolute;top:50%;left:0;margin-top:-8px}.more-popover-menu .popover-menu>[type=checkbox]+label,table.has-actions tr>.actions .popover-menu>[type=checkbox]+label,table.with-details tr>.actions .popover-menu>[type=checkbox]+label{padding:7px}.more-popover-menu .popover-menu>[type=checkbox]+label>*,table.has-actions tr>.actions .popover-menu>[type=checkbox]+label>*,table.with-details tr>.actions .popover-menu>[type=checkbox]+label>*{background-color:var(--transparent);border-radius:var(--decor-radius-100);width:30px;height:30px;font-size:0}.more-popover-menu .popover-menu>[type=checkbox]+label>::after,table.has-actions tr>.actions .popover-menu>[type=checkbox]+label>::after,table.with-details tr>.actions .popover-menu>[type=checkbox]+label>::after{--icon-name:icon-more-horizontal;--icon-color:rgb(var(--tone-gray-900));--icon-size:icon-300;content:"";position:absolute;top:50%;left:50%;margin-top:-8px;margin-left:-8px}.more-popover-menu .popover-menu>[type=checkbox]+label>:active,table.has-actions tr>.actions .popover-menu>[type=checkbox]+label>:active,table.with-details tr>.actions .popover-menu>[type=checkbox]+label>:active{background-color:rgb(var(--tone-gray-100))}.more-popover-menu .popover-menu>[type=checkbox]+label>:focus,.more-popover-menu .popover-menu>[type=checkbox]+label>:hover,.radio-card>:first-child,table.has-actions tr>.actions .popover-menu>[type=checkbox]+label>:focus,table.has-actions tr>.actions .popover-menu>[type=checkbox]+label>:hover,table.with-details tr>.actions .popover-menu>[type=checkbox]+label>:focus,table.with-details tr>.actions .popover-menu>[type=checkbox]+label>:hover{background-color:rgb(var(--tone-gray-050))}.oidc-select [class$=-oidc-provider]::before{width:22px;height:22px;flex:0 0 auto;margin-right:10px}.oidc-select .ember-power-select-trigger,.oidc-select li{margin-bottom:1em}.informed-action header,.radio-card header{margin-bottom:.5em}.oidc-select .ember-power-select-trigger{width:100%}.oidc-select button.reset{float:right}.radio-card{border:var(--decor-border-100);border-radius:var(--decor-radius-100);border-color:rgb(var(--tone-gray-200));cursor:pointer;float:none!important;margin-right:0!important;display:flex!important}.checked.radio-card{border-color:rgb(var(--tone-blue-500))}.checked.radio-card>:first-child{background-color:rgb(var(--tone-blue-050))}.radio-card header{color:rgb(var(--tone-gray-999))}.consul-intention-fieldsets .radio-card>:last-child{padding-left:47px;position:relative}.consul-intention-fieldsets .radio-card>:last-child::before{position:absolute;left:14px;font-size:1rem}.radio-card>:first-child{padding:10px;display:grid;align-items:center;justify-items:center}.radio-card>:last-child{padding:18px}.consul-server-card,.disclosure-menu [aria-expanded]~*,.menu-panel,.more-popover-menu>[type=checkbox]+label+div,.popover-menu>[type=checkbox]+label+div,section[data-route="dc.show.license"] aside,section[data-route="dc.show.serverstatus"] .server-failure-tolerance,table.has-actions tr>.actions>[type=checkbox]+label+div,table.with-details tr>.actions>[type=checkbox]+label+div{--tone-border:var(--tone-gray-300);border:var(--decor-border-100);border-radius:var(--decor-radius-200);box-shadow:var(--decor-elevation-600);color:rgb(var(--tone-gray-900));background-color:rgb(var(--tone-gray-000));--padding-x:14px;--padding-y:14px;position:relative}.consul-auth-method-nspace-list tbody tr:hover,.consul-auth-method-view section table tbody tr:hover,table.consul-metadata-list tbody tr:hover{box-shadow:none}.disclosure-menu [aria-expanded]~* [role=separator],.menu-panel [role=separator],.more-popover-menu>[type=checkbox]+label+div [role=separator],.popover-menu>[type=checkbox]+label+div [role=separator],table.has-actions tr>.actions>[type=checkbox]+label+div [role=separator],table.with-details tr>.actions>[type=checkbox]+label+div [role=separator]{border-top:var(--decor-border-100);margin:0}.consul-server-card,.disclosure-menu [aria-expanded]~*,.disclosure-menu [aria-expanded]~* [role=separator],.menu-panel,.menu-panel [role=separator],.more-popover-menu>[type=checkbox]+label+div,.more-popover-menu>[type=checkbox]+label+div [role=separator],.popover-menu>[type=checkbox]+label+div,.popover-menu>[type=checkbox]+label+div [role=separator],section[data-route="dc.show.license"] aside,section[data-route="dc.show.serverstatus"] .server-failure-tolerance,table.has-actions tr>.actions>[type=checkbox]+label+div,table.has-actions tr>.actions>[type=checkbox]+label+div [role=separator],table.with-details tr>.actions>[type=checkbox]+label+div,table.with-details tr>.actions>[type=checkbox]+label+div [role=separator]{border-color:rgb(var(--tone-border))}.paged-collection-scroll,[style*="--paged-row-height"]{overflow-y:auto!important;will-change:scrollPosition}[style*="--paged-start"]::before{content:"";display:block;height:var(--paged-start)}.consul-auth-method-type,.consul-external-source,.consul-health-check-list .health-check-output dd em,.consul-intention-list td strong,.consul-intention-permission-list strong,.consul-intention-search-bar li button span,.consul-kind,.consul-server-card .health-status+dd,.consul-source,.consul-transparent-proxy,.discovery-chain .route-card>header ul li,.hashicorp-consul nav .dcs li.is-local span,.hashicorp-consul nav .dcs li.is-primary span,.leader,.search-bar-status li:not(.remove-all),.topology-metrics-source-type,html[data-route^="dc.acls.index"] main td strong,section[data-route="dc.show.serverstatus"] .redundancy-zones section header dl,section[data-route="dc.show.serverstatus"] .server-failure-tolerance header em,span.policy-node-identity,span.policy-service-identity{border-radius:var(--decor-radius-100);display:inline-flex;position:relative;align-items:center;white-space:nowrap}.consul-auth-method-type::before,.consul-external-source::before,.consul-health-check-list .health-check-output dd em::before,.consul-intention-list td strong::before,.consul-intention-permission-list strong::before,.consul-intention-search-bar li button span::before,.consul-kind::before,.consul-server-card .health-status+dd::before,.consul-source::before,.consul-transparent-proxy::before,.discovery-chain .route-card>header ul li::before,.hashicorp-consul nav .dcs li.is-local span::before,.hashicorp-consul nav .dcs li.is-primary span::before,.leader::before,.search-bar-status li:not(.remove-all)::before,.topology-metrics-source-type::before,html[data-route^="dc.acls.index"] main td strong::before,section[data-route="dc.show.serverstatus"] .redundancy-zones section header dl::before,section[data-route="dc.show.serverstatus"] .server-failure-tolerance header em::before,span.policy-node-identity::before,span.policy-service-identity::before{margin-right:4px}.consul-auth-method-type,.consul-external-source,.consul-kind,.consul-server-card .health-status+dd,.consul-source,.consul-transparent-proxy,.leader,.search-bar-status li:not(.remove-all),.topology-metrics-source-type,section[data-route="dc.show.serverstatus"] .server-failure-tolerance header em,span.policy-node-identity,span.policy-service-identity{padding:0 8px;--icon-size:icon-200}.consul-intention-permission-list strong,.discovery-chain .route-card>header ul li,html[data-route^="dc.acls.index"] main td strong,section[data-route="dc.show.serverstatus"] .redundancy-zones section header dl{padding:1px 5px}.consul-intention-list td strong,.consul-intention-search-bar li button span{padding:4px 8px}span.policy-node-identity::before,span.policy-service-identity::before{vertical-align:unset}span.policy-node-identity::before{content:"Node Identity: "}span.policy-service-identity::before{content:"Service Identity: "}.aws-iam.consul-auth-method-type::before,.aws-iam.consul-external-source::before,.aws-iam.consul-kind::before,.aws-iam.consul-source::before,.aws-iam.consul-transparent-proxy::before,.aws-iam.leader::before,.aws-iam.topology-metrics-source-type::before,.consul-health-check-list .health-check-output dd em.aws-iam::before,.consul-intention-list td strong.aws-iam::before,.consul-intention-permission-list strong.aws-iam::before,.consul-intention-search-bar li button span.aws-iam::before,.consul-server-card .health-status+dd.aws-iam::before,.discovery-chain .route-card>header ul li.aws-iam::before,.hashicorp-consul nav .dcs li.is-local span.aws-iam::before,.hashicorp-consul nav .dcs li.is-primary span.aws-iam::before,.search-bar-status li.aws-iam:not(.remove-all)::before,html[data-route^="dc.acls.index"] main td strong.aws-iam::before,section[data-route="dc.show.serverstatus"] .redundancy-zones section header dl.aws-iam::before,section[data-route="dc.show.serverstatus"] .server-failure-tolerance header em.aws-iam::before,span.aws-iam.policy-node-identity::before,span.aws-iam.policy-service-identity::before{--icon-name:icon-aws-color;content:""}.more-popover-menu>[type=checkbox]+label>*,.popover-menu>[type=checkbox]+label>*,table.has-actions tr>.actions>[type=checkbox]+label>*,table.with-details tr>.actions>[type=checkbox]+label>*{cursor:pointer}.more-popover-menu>[type=checkbox]+label>::after,.popover-menu>[type=checkbox]+label>::after,table.has-actions tr>.actions>[type=checkbox]+label>::after,table.with-details tr>.actions>[type=checkbox]+label>::after{width:16px;height:16px;position:relative}.more-popover-menu,.popover-menu,table.has-actions tr>.actions,table.with-details tr>.actions{position:relative}.more-popover-menu>[type=checkbox]+label,.popover-menu>[type=checkbox]+label,table.has-actions tr>.actions>[type=checkbox]+label,table.with-details tr>.actions>[type=checkbox]+label{display:block}.more-popover-menu>[type=checkbox]+label+div,.popover-menu>[type=checkbox]+label+div,table.has-actions tr>.actions>[type=checkbox]+label+div,table.with-details tr>.actions>[type=checkbox]+label+div{min-width:192px}.more-popover-menu>[type=checkbox]+label+div:not(.above),.popover-menu>[type=checkbox]+label+div:not(.above),table.has-actions tr>.actions>[type=checkbox]+label+div:not(.above),table.with-details tr>.actions>[type=checkbox]+label+div:not(.above){top:38px}.more-popover-menu>[type=checkbox]+label+div:not(.left),.popover-menu>[type=checkbox]+label+div:not(.left),table.has-actions tr>.actions>[type=checkbox]+label+div:not(.left),table.with-details tr>.actions>[type=checkbox]+label+div:not(.left){right:5px}.popover-menu .menu-panel{position:absolute!important}.type-reveal,.type-toggle label{position:relative}.popover-select label{height:100%}.popover-select label>*{padding:0 8px!important;height:100%!important;justify-content:space-between!important;min-width:auto!important}.popover-select label>::after{margin-left:6px}.popover-select button::before{margin-right:10px}.popover-select .value-passing button::before{color:rgb(var(--tone-green-500))}.popover-select .value-warning button::before{color:rgb(var(--tone-orange-500))}.popover-select .value-critical button::before{color:rgb(var(--tone-red-500))}.popover-select .value-empty button::before{color:rgb(var(--tone-gray-400))}.type-source.popover-select li:not(.partition) button{text-transform:capitalize}.type-source.popover-select li.aws button{text-transform:uppercase}.type-source.popover-select li.partition button::before{color:rgb(var(--tone-gray-500))}.progress.indeterminate{width:100%;display:flex;align-items:center;justify-content:center;--icon-size:icon-700;--icon-name:var(--icon-loading);--icon-color:rgb(var(--tone-gray-500))}.progress.indeterminate::before{content:""}.app-view>div form:not(.filter-bar) [role=radiogroup],.modal-dialog [role=document] [role=radiogroup]{overflow:hidden;padding-left:1px}.app-view>div form:not(.filter-bar) [role=radiogroup] label,.modal-dialog [role=document] [role=radiogroup] label{float:left}.app-view>div form:not(.filter-bar) [role=radiogroup] label>span,.modal-dialog [role=document] [role=radiogroup] label>span{float:right;margin-left:1em}.app-view>div form:not(.filter-bar) [role=radiogroup] label:not(:last-child),.modal-dialog [role=document] [role=radiogroup] label:not(:last-child){margin-right:25px}.app-view>div form:not(.filter-bar) [role=radiogroup] label,.app-view>div form:not(.filter-bar) [role=radiogroup] label>span,.modal-dialog [role=document] [role=radiogroup] label,.modal-dialog [role=document] [role=radiogroup] label>span{margin-bottom:0!important}.type-reveal{cursor:pointer}.type-reveal input{display:none}.type-reveal input~em{visibility:hidden;font-style:normal}.type-reveal input:checked~em{visibility:visible;cursor:auto}.type-reveal input~em::before{display:inline;visibility:visible;content:"■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■"}.type-reveal input:checked~em::before,.type-toggle input{display:none}.type-reveal span,[role=banner] nav:not(.in-viewport):first-of-type{visibility:hidden}.type-reveal span{position:absolute;--icon-color:rgb(var(--tone-gray-500))}.type-reveal em{margin-left:22px}.type-reveal span::before{visibility:visible}.type-toggle label span{cursor:pointer}.type-toggle label span::after{border-radius:var(--decor-radius-full)}.type-toggle label span::before{border-radius:7px;left:0;width:24px;height:12px;margin-top:-5px}.type-negative.type-toggle{border:0}.app-view>header .title,.modal-dialog [role=document] table td,.modal-dialog [role=document] table th,main table td,main table th{border-bottom:var(--decor-border-100)}.type-toggle label span::after{background-color:rgb(var(--tone-gray-000));margin-top:-3px;width:8px;height:8px}.type-negative.type-toggle label input+span::before,.type-toggle label input:checked+span::before{background-color:rgb(var(--tone-blue-500))}.type-negative.type-toggle label input:checked+span::before,.type-toggle label span::before{background-color:rgb(var(--tone-gray-300))}.type-toggle label span{color:rgb(var(--tone-gray-900));display:inline-block;padding-left:34px}.type-toggle label span::after,.type-toggle label span::before{position:absolute;display:block;content:"";top:50%}.type-negative.type-toggle label input+span::after,.type-toggle label input:checked+span::after{left:14px}.type-negative.type-toggle label input:checked+span::after,.type-toggle label span::after{left:2px}.modal-dialog [role=document] table th,main table th{border-color:rgb(var(--tone-gray-300));padding:.6em 0}.modal-dialog [role=document] table td,main table td{border-color:rgb(var(--tone-gray-200));color:rgb(var(--tone-gray-500));height:50px;vertical-align:middle}.modal-dialog [role=document] table td strong,.modal-dialog [role=document] table th,main table td strong,main table th{color:rgb(var(--tone-gray-600))}.consul-intention-list td.destination,.consul-intention-list td.source,.modal-dialog [role=document] table a,.modal-dialog [role=document] table td:first-child,main table a,main table td:first-child{color:rgb(var(--tone-gray-900))}.modal-dialog [role=document] table,main table{width:100%;border-collapse:collapse}table.dom-recycling tr{display:flex}table.dom-recycling tr>*{flex:1 1 auto;display:inline-flex;align-items:center}.modal-dialog [role=document] table th.actions input,main table th.actions input{display:none}.modal-dialog [role=document] table th.actions,main table th.actions{text-align:right}.modal-dialog [role=document] table td a,main table td a{display:block}.modal-dialog [role=document] table td.no-actions~.actions,main table td.no-actions~.actions{display:none}.modal-dialog [role=document] table td:not(.actions)>:only-child,main table td:not(.actions)>:only-child{overflow:hidden;text-overflow:ellipsis}.modal-dialog [role=document] table td:not(.actions)>*,main table td:not(.actions)>*{white-space:nowrap}.modal-dialog [role=document] table caption,main table caption{margin-bottom:.8em}.modal-dialog [role=document] table td a,.modal-dialog [role=document] table td:not(.actions),.modal-dialog [role=document] table th:not(.actions),main table td a,main table td:not(.actions),main table th:not(.actions){padding-right:.9em}.modal-dialog [role=document] table tbody td em,main table tbody td em{display:block;font-style:normal;font-weight:400;color:rgb(var(--tone-gray-500))}table.has-actions tr>.actions,table.with-details tr>.actions{width:60px!important;overflow:visible}table.has-actions tr>.actions>[type=checkbox]+label,table.with-details tr>.actions>[type=checkbox]+label{position:absolute;right:5px}table.consul-metadata-list tbody tr{cursor:default}.modal-dialog [role=document] table th span::after,main table th span::after{color:rgb(var(--tone-gray-500));margin-left:4px}.modal-dialog [role=document] table tbody tr,main table tbody tr{cursor:pointer}.modal-dialog [role=document] table td:first-child,main table td:first-child{padding:0}.modal-dialog [role=document] table tbody tr:hover,main table tbody tr:hover{box-shadow:var(--decor-elevation-300)}.modal-dialog [role=document] table td.folder::before,main table td.folder::before{background-color:rgb(var(--tone-gray-300));margin-top:1px;margin-right:5px}@media (max-width:420px){.consul-intention-list tr>:nth-last-child(2),.modal-dialog [role=document] table tr>.actions,main table tr>.actions{display:none}}.voting-status-leader.consul-server-card .name{width:var(--tile-size,3rem);height:var(--tile-size,3rem)}.voting-status-leader.consul-server-card .name::before{display:block;content:"";width:100%;height:100%;border-radius:var(--decor-radius-250);border:var(--decor-border-100);background-image:linear-gradient(135deg,rgb(var(--strawberry-010)) 0,rgb(var(--strawberry-200)) 100%);border-color:rgb(var(--tone-gray-999) /10%)}.voting-status-leader.consul-server-card .name::after{content:"";position:absolute;top:calc(var(--tile-size,3rem)/ 4);left:calc(var(--tile-size,3rem)/ 4);--icon-name:icon-star-fill;--icon-size:icon-700;color:rgb(var(--strawberry-500))}table.with-details td:only-child>div>label,table.with-details td>label{border-radius:var(--decor-radius-100);cursor:pointer;min-width:30px;min-height:30px;display:inline-flex;align-items:center;justify-content:center}table.with-details td:only-child>div>label:focus,table.with-details td:only-child>div>label:hover,table.with-details td>label:focus,table.with-details td>label:hover{background-color:rgb(var(--tone-gray-050))}table.with-details td:only-child>div>label:active,table.with-details td>label:active{background-color:rgb(var(--tone-gray-100))}table.dom-recycling tbody{top:33px!important;width:100%}table.dom-recycling caption~tbody{top:57px!important}table tr>:nth-last-child(2):first-child,table tr>:nth-last-child(2):first-child~*{width:calc(100% / 2)}table tr>:nth-last-child(3):first-child,table tr>:nth-last-child(3):first-child~*{width:calc(100% / 3)}table tr>:nth-last-child(4):first-child,table tr>:nth-last-child(4):first-child~*{width:calc(100% / 4)}table tr>:nth-last-child(5):first-child,table tr>:nth-last-child(5):first-child~*{width:calc(100% / 5)}table.has-actions tr>:nth-last-child(2):first-child,table.has-actions tr>:nth-last-child(2):first-child~*{width:calc(100% - 60px)}table.has-actions tr>:nth-last-child(3):first-child,table.has-actions tr>:nth-last-child(3):first-child~*{width:calc(50% - 30px)}table.has-actions tr>:nth-last-child(4):first-child,table.has-actions tr>:nth-last-child(4):first-child~*{width:calc(33% - 20px)}table.has-actions tr>:nth-last-child(5):first-child,table.has-actions tr>:nth-last-child(5):first-child~*{width:calc(25% - 15px)}html[data-route^="dc.acls.policies"] [role=dialog] table tr>:not(last-child),html[data-route^="dc.acls.policies"] table tr>:not(last-child),html[data-route^="dc.acls.roles"] [role=dialog] table tr>:not(last-child),html[data-route^="dc.acls.roles"] main table.token-list tr>:not(last-child){width:120px}html[data-route^="dc.acls.policies"] table tr>:last-child,html[data-route^="dc.acls.roles"] [role=dialog] table tr>:last-child,html[data-route^="dc.acls.roles"] main table.token-list tr>:last-child{width:calc(100% - 240px)!important}table.with-details td:only-child{cursor:default;border:0}table.with-details td:only-child>div::before,table.with-details td:only-child>div>div,table.with-details td:only-child>div>label{background-color:rgb(var(--tone-gray-000))}table.with-details td:only-child>div>label::before{transform:rotate(180deg)}table.with-details td:only-child>div::before{background:rgb(var(--tone-gray-200));content:"";display:block;height:1px;position:absolute;bottom:-20px;left:10px;width:calc(100% - 20px)}table.with-details tr>.actions{position:relative}table.with-details td:only-child>div>label,table.with-details td>label{pointer-events:auto;position:absolute;top:8px}table.with-details td:only-child>div>label span,table.with-details td>label span{display:none}table.with-details td>label{right:2px}table.with-details tr:nth-child(even) td{height:auto;position:relative;display:table-cell}table.with-details tr:nth-child(even) td>*{display:none}table.with-details td:only-child>div>label{right:11px}table.with-details tr:nth-child(even) td>input:checked+*{display:block}table.with-details td:only-child{overflow:visible;width:100%}table.with-details td:only-child>div{border:1px solid;border-radius:var(--decor-radius-100);box-shadow:var(--decor-elevation-600);margin-bottom:20px;position:relative;left:-10px;right:-10px;width:calc(100% + 20px);margin-top:-51px;pointer-events:none;padding:10px}table.with-details td:only-child>div::after{content:"";display:block;clear:both}table.with-details td:only-child>div>div{pointer-events:auto;margin-top:36px}.consul-auth-method-binding-list dl,.consul-auth-method-view dl,.consul-auth-method-view section dl{display:flex;flex-wrap:wrap}.consul-auth-method-binding-list dl dd,.consul-auth-method-binding-list dl dt,.consul-auth-method-view dl dd,.consul-auth-method-view dl dt{padding:12px 0;margin:0;border-top:1px solid!important}.consul-auth-method-binding-list dl dt,.consul-auth-method-view dl dt{width:20%;font-weight:var(--typo-weight-bold)}.consul-auth-method-binding-list dl dd,.consul-auth-method-view dl dd{margin-left:auto;width:80%;display:flex}.consul-auth-method-binding-list dl dd>ul li,.consul-auth-method-view dl dd>ul li{display:flex}.consul-auth-method-binding-list dl dd>ul li:not(:last-of-type),.consul-auth-method-view dl dd>ul li:not(:last-of-type){padding-bottom:12px}.consul-auth-method-binding-list dl dd .copy-button button,.consul-auth-method-view dl dd .copy-button button{padding:0!important;margin:0 4px 0 0!important}.consul-auth-method-binding-list dl dt.check+dd,.consul-auth-method-view dl dt.check+dd{padding-top:16px}.consul-auth-method-binding-list dl>dd:last-of-type,.consul-auth-method-binding-list dl>dt:last-of-type,.consul-auth-method-view dl>dd:last-of-type,.consul-auth-method-view dl>dt:last-of-type,.consul-auth-method-view section dl>dd:last-of-type,.consul-auth-method-view section dl>dt:last-of-type{border-bottom:1px solid!important;border-color:rgb(var(--tone-gray-300))!important}.consul-auth-method-binding-list dl dd,.consul-auth-method-binding-list dl dt,.consul-auth-method-view dl dd,.consul-auth-method-view dl dt{border-color:rgb(var(--tone-gray-300))!important;color:rgb(var(--tone-gray-999))!important}.consul-auth-method-binding-list dl dt.type+dd span::before,.consul-auth-method-view dl dt.type+dd span::before{margin-left:4px;background-color:rgb(var(--tone-gray-500))}.tooltip-panel dt{cursor:pointer}.tooltip-panel dd>div::before{width:12px;height:12px;background-color:rgb(var(--tone-gray-000));border-top:1px solid rgb(var(--tone-gray-300));border-right:1px solid rgb(var(--tone-gray-300));transform:rotate(-45deg);position:absolute;left:16px;top:-7px}.tooltip-panel,.tooltip-panel dt{display:flex;flex-direction:column}.tooltip-panel dd>div.menu-panel{top:auto;overflow:visible}.tooltip-panel dd{display:none;position:relative;z-index:1;padding-top:10px;margin-bottom:-10px}.tooltip-panel:hover dd{display:block}.tooltip-panel dd>div{width:250px}.app-view>header .title{display:flex;align-items:center;white-space:nowrap;position:relative;z-index:5;padding-bottom:.2em}.app-view>div form:not(.filter-bar) fieldset{border-bottom:var(--decor-border-200)}.app-view>header h1>em{color:rgb(var(--tone-gray-600))}.app-view>header dd>a{color:rgb(var(--tone-gray-999))}.app-view>div div>dl>dd,[role=contentinfo]{color:rgb(var(--tone-gray-400))}.app-view>div form:not(.filter-bar) fieldset,.app-view>header .title{border-color:rgb(var(--tone-gray-200))}.app-view>header .actions{display:flex;align-items:flex-start;margin-left:auto;margin-top:9px}.app-view>header .title>:not(:last-child){margin-right:8px}.app-view>div form:not(.filter-bar) fieldset{padding-bottom:.3em;margin-bottom:2em}[for=toolbar-toggle]{background-position:0 4px;display:inline-block;width:26px;height:26px;cursor:pointer;color:rgb(var(--tone-blue-500))}#toolbar-toggle{display:none}@media (max-width:849px){.app-view>header .actions{margin-top:9px}}@media (min-width:996px){[for=toolbar-toggle]{display:none}}@media (max-width:995px){.app-view>header h1{display:inline-block}html[data-route$="dc.services.instance.show"] h1{display:block}#toolbar-toggle+*{display:none}#toolbar-toggle:checked+*{display:flex}}.brand-loader{position:absolute;top:50%;margin-top:-26px;left:50%}.app .skip-links{outline:solid 1px;background-color:rgb(var(--tone-blue-500));display:flex;flex-direction:column;position:absolute;z-index:10;left:50%;padding:20px;top:-100px;transform:translateX(-50%)}.app .skip-links a,.app .skip-links button{color:inherit}.app .skip-links a,.app .skip-links button,.app .skip-links div{display:block;width:100%;text-align:center;box-sizing:border-box}.app .skip-links:focus-within{top:0}.app .notifications{display:flex;flex-direction:column;align-items:center;position:fixed;z-index:50;top:-45px;left:0;pointer-events:none}.app .notifications .app-notification>*{min-width:400px}.app .notifications .app-notification{transition-property:opacity;width:fit-content;max-width:80%;pointer-events:auto}[role=banner] nav:last-of-type{margin-left:auto}.hashicorp-consul nav .dcs{top:18px}.hashicorp-consul nav .dcs [aria-label]::before{display:none!important}[role=banner] nav:last-of-type [aria-haspopup=menu]~*{position:absolute;right:0;min-width:192px}[role=contentinfo]{position:fixed;z-index:50;width:250px;padding-left:25px;top:calc(100vh - 42px);top:calc(max(100vh,460px) - 42px)}html.has-partitions.has-nspaces .app [role=contentinfo]{top:calc(100vh - 42px);top:calc(max(100vh,640px) - 42px)}[role=banner] nav:first-of-type{z-index:10}[role=banner] nav:first-of-type,[role=contentinfo]{transition-property:left}.app .notifications,main{margin-top:var(--chrome-height,64px);transition-property:margin-left}.app .notifications{transition-property:margin-left,width}@media (min-width:900px){.app>input[id]~main .notifications{width:calc(100% - var(--chrome-width))}.app>input[id]:checked~main .notifications{width:100%}.app>input[id]+header>div>nav:first-of-type,.app>input[id]~footer{left:0}.app>input[id]:checked+header>div>nav:first-of-type,.app>input[id]:checked~footer{left:calc(var(--chrome-width,300px) * -1)}.app>input[id]~main,.app>input[id]~main .notifications{margin-left:var(--chrome-width,300px)}.app>input[id]:checked~main,.app>input[id]:checked~main .notifications{margin-left:0}}@media (max-width:899px){.app>input[id]~main .notifications{width:100%}.app>input[id]:checked+header>div>nav:first-of-type,.app>input[id]:checked~footer{left:0}.app>input[id]+header>div>nav:first-of-type,.app>input[id]~footer{left:calc(var(--chrome-width,300px) * -1)}.app>input[id]~main,.app>input[id]~main .notifications{margin-left:0}}[role=banner]::before{background-color:rgb(var(--tone-gray-000));content:"";position:absolute;z-index:-1;left:0;width:100vw}[role=banner]{display:flex;position:fixed;z-index:50;left:0;padding:0 25px;width:calc(100% - 50px);align-items:center}[role=banner],[role=banner]::before{height:var(--chrome-height)}[role=banner]>a{display:block;line-height:0;font-size:0}.hashicorp-consul nav .dcs [aria-expanded]>a,[role=banner] nav:last-of-type [aria-expanded]>a,[role=banner] nav:last-of-type>ul>li>.popover-menu>label>button>a,[role=banner] nav:last-of-type>ul>li>a>a,[role=banner] nav:last-of-type>ul>li>button>a,[role=banner] nav:last-of-type>ul>li>span>a{color:inherit}.hashicorp-consul nav .dcs [aria-expanded]::after,[role=banner] nav:last-of-type [aria-expanded]::after{--icon-name:icon-chevron-down;content:""}.hashicorp-consul nav .dcs [aria-expanded=true][aria-expanded]::after,[role=banner] nav:last-of-type [aria-expanded=true][aria-expanded]::after{transform:scaleY(-100%)}.app>input[id]{display:none}.disclosure-menu [aria-expanded]~*>ul>[role=treeitem],.disclosure-menu [aria-expanded]~*>ul>li>[role=menuitem],.disclosure-menu [aria-expanded]~*>ul>li>[role=option],.menu-panel>ul>[role=treeitem],.menu-panel>ul>li>[role=menuitem],.menu-panel>ul>li>[role=option],.more-popover-menu>[type=checkbox]+label+div>ul>[role=treeitem],.more-popover-menu>[type=checkbox]+label+div>ul>li>[role=menuitem],.more-popover-menu>[type=checkbox]+label+div>ul>li>[role=option],.popover-menu>[type=checkbox]+label+div>ul>[role=treeitem],.popover-menu>[type=checkbox]+label+div>ul>li>[role=menuitem],.popover-menu>[type=checkbox]+label+div>ul>li>[role=option],[role=banner] nav:last-of-type>ul,[role=banner]>div,[role=banner]>label,table.has-actions tr>.actions>[type=checkbox]+label+div>ul>[role=treeitem],table.has-actions tr>.actions>[type=checkbox]+label+div>ul>li>[role=menuitem],table.has-actions tr>.actions>[type=checkbox]+label+div>ul>li>[role=option],table.with-details tr>.actions>[type=checkbox]+label+div>ul>[role=treeitem],table.with-details tr>.actions>[type=checkbox]+label+div>ul>li>[role=menuitem],table.with-details tr>.actions>[type=checkbox]+label+div>ul>li>[role=option]{display:flex}[role=banner]>label::before{--icon-name:icon-menu;--icon-color:rgb(var(--tone-gray-800));content:"";cursor:pointer}.hashicorp-consul nav .dcs [aria-expanded],[role=banner] nav:last-of-type .popover-menu [type=checkbox]:checked+label>*,[role=banner] nav:last-of-type [aria-expanded],[role=banner] nav:last-of-type>ul>li>.popover-menu>label>button,[role=banner] nav:last-of-type>ul>li>a,[role=banner] nav:last-of-type>ul>li>button,[role=banner] nav:last-of-type>ul>li>span{color:rgb(var(--tone-gray-600))}[role=banner]>label{align-items:center;height:100%;padding:0 1rem 0 5px}[role=banner]>div{justify-content:space-between;flex-grow:1}[role=banner] nav:last-of-type label+div{z-index:400;left:0;right:auto;top:28px!important}.hashicorp-consul nav .dcs [aria-expanded],[role=banner] nav:last-of-type [aria-expanded],[role=banner] nav:last-of-type>ul>li>.popover-menu>label>button,[role=banner] nav:last-of-type>ul>li>a,[role=banner] nav:last-of-type>ul>li>button,[role=banner] nav:last-of-type>ul>li>span{border-radius:var(--decor-radius-200);cursor:pointer;display:block;padding:5px 12px;white-space:nowrap}[role=banner] nav:last-of-type .popover-menu>label{padding-right:5px}[role=banner] nav:last-of-type .popover-menu>label>*{padding-right:4px!important}[role=banner] nav:last-of-type .popover-menu>label>button::after{top:2px}[role=banner] nav:last-of-type>ul>li>span{cursor:default}[role=banner] nav:first-of-type>ul>li>a>a,[role=banner] nav:first-of-type>ul>li>label>a{color:inherit;font-size:inherit}[role=banner] nav:first-of-type>ul>li>a:focus,[role=banner] nav:first-of-type>ul>li>a:hover,[role=banner] nav:first-of-type>ul>li>label:focus,[role=banner] nav:first-of-type>ul>li>label:hover{text-decoration:underline}.tab-nav li>*,[role=banner] nav:first-of-type>ul>li.is-active>a:focus:not(:active),[role=banner] nav:first-of-type>ul>li.is-active>a:hover:not(:active){text-decoration:none}[role=banner] nav:first-of-type{background-color:rgb(var(--tone-gray-050));color:rgb(var(--tone-gray-700))}[role=banner] nav:first-of-type li:not([role=separator])>span{color:rgb(var(--tone-gray-300))}[role=banner] nav:first-of-type [role=separator]{text-transform:uppercase;font-weight:var(--typo-weight-medium);color:rgb(var(--tone-gray-600))}[role=banner] nav:first-of-type>ul>li>a,[role=banner] nav:first-of-type>ul>li>label{cursor:pointer;border-right:var(--decor-border-400);border-color:var(--transparent);color:rgb(var(--tone-gray-800))}[role=banner] nav:first-of-type>ul>li.is-active>a,[role=banner] nav:first-of-type>ul>li>a:focus,[role=banner] nav:first-of-type>ul>li>a:hover,[role=banner] nav:first-of-type>ul>li>label:focus,[role=banner] nav:first-of-type>ul>li>label:hover,[role=banner] nav:first-of-type>ul>li[aria-label]{color:rgb(var(--tone-gray-999))}[role=banner] nav:first-of-type>ul>li.is-active>a{background-color:rgb(var(--tone-gray-150));border-color:rgb(var(--tone-gray-999))}[role=banner] nav:first-of-type [aria-label]::before{color:rgb(var(--tone-gray-700));content:attr(aria-label);display:block;margin-top:-.5rem;margin-bottom:.5rem}.hashicorp-consul nav li.nspaces .disclosure-menu>button,.hashicorp-consul nav li.partitions .disclosure-menu>button{border:var(--decor-border-100);border-color:rgb(var(--tone-gray-500));border-radius:var(--decor-radius-100);font-weight:inherit;background-color:rgb(var(--tone-gray-050));color:rgb(var(--tone-gray-999))}.hashicorp-consul nav li.nspaces .disclosure-menu>button[aria-expanded=true],.hashicorp-consul nav li.partitions .disclosure-menu>button[aria-expanded=true]{border-bottom-left-radius:var(--decor-radius-000);border-bottom-right-radius:var(--decor-radius-000)}.hashicorp-consul nav li.nspaces .disclosure-menu>button::after,.hashicorp-consul nav li.partitions .disclosure-menu>button::after{width:16px;height:16px;position:relative;float:right}[role=banner] nav:first-of-type{position:absolute;left:0;top:var(--chrome-height,47px);width:var(--chrome-width,300px);height:calc(100vh - var(--chrome-height,47px) - 35px);padding-top:35px;overflow:auto}[role=banner] nav:first-of-type li.nspaces,[role=banner] nav:first-of-type li.partition,[role=banner] nav:first-of-type li.partitions{margin-bottom:25px;padding:0 26px}[role=banner] nav:first-of-type li.dcs{padding:0 18px}[role=banner] nav:first-of-type [role=menuitem]{justify-content:flex-start!important}[role=banner] nav:first-of-type [role=menuitem] span{margin-left:.5rem}[role=banner] nav:first-of-type [role=separator],[role=banner] nav:first-of-type li:not([role=separator])>span,[role=banner] nav:first-of-type>ul>li>a,[role=banner] nav:first-of-type>ul>li>label{display:block;padding:7px 25px}[role=banner] nav:first-of-type [role=separator]{margin-top:.7rem;padding-bottom:0}.hashicorp-consul nav li.nspaces .disclosure,.hashicorp-consul nav li.partitions .disclosure{position:relative}.hashicorp-consul nav li.nspaces .disclosure-menu>button,.hashicorp-consul nav li.partitions .disclosure-menu>button{width:100%;text-align:left;padding:10px}.hashicorp-consul nav li.nspaces .disclosure-menu button+*,.hashicorp-consul nav li.partitions .disclosure-menu button+*{border-top-left-radius:var(--decor-radius-000);border-top-right-radius:var(--decor-radius-000);border-top:var(--decor-border-000);position:absolute;z-index:1;width:calc(100% - 2px)}.hashicorp-consul nav .dcs{visibility:visible;position:fixed;z-index:10;left:100px}.hashicorp-consul nav li.dcs [aria-expanded]~*{min-width:250px;max-height:560px;--paged-row-height:43px}.hashicorp-consul nav li.nspaces [aria-expanded]~*,.hashicorp-consul nav li.partitions [aria-expanded]~*{max-height:360px;--paged-row-height:43px}.hashicorp-consul [role=banner] a svg{fill:rgb(var(--tone-brand-600))}.hashicorp-consul .acls-separator span{color:rgb(var(--tone-red-500));display:inline-block;position:relative;top:2px;margin-left:2px}.disclosure-menu [aria-expanded]~*>div+ul,.menu-panel>div+ul,.more-popover-menu>[type=checkbox]+label+div>div+ul,.popover-menu>[type=checkbox]+label+div>div+ul,table.has-actions tr>.actions>[type=checkbox]+label+div>div+ul,table.with-details tr>.actions>[type=checkbox]+label+div>div+ul{border-top:var(--decor-border-100);border-color:rgb(var(--tone-border,var(--tone-gray-300)))}.disclosure-menu [aria-expanded]~* [role=separator]:first-child:not(:empty),.menu-panel [role=separator]:first-child:not(:empty),.more-popover-menu>[type=checkbox]+label+div [role=separator]:first-child:not(:empty),.popover-menu>[type=checkbox]+label+div [role=separator]:first-child:not(:empty),table.has-actions tr>.actions>[type=checkbox]+label+div [role=separator]:first-child:not(:empty),table.with-details tr>.actions>[type=checkbox]+label+div [role=separator]:first-child:not(:empty){border:none}.disclosure-menu [aria-expanded]~* [role=separator],.menu-panel [role=separator],.more-popover-menu>[type=checkbox]+label+div [role=separator],.popover-menu>[type=checkbox]+label+div [role=separator],table.has-actions tr>.actions>[type=checkbox]+label+div [role=separator],table.with-details tr>.actions>[type=checkbox]+label+div [role=separator]{text-transform:uppercase;font-weight:var(--typo-weight-medium);color:rgb(var(--tone-gray-600))}.disclosure-menu [aria-expanded]~*>ul>li,.menu-panel>ul>li,.more-popover-menu>[type=checkbox]+label+div>ul>li,.popover-menu>[type=checkbox]+label+div>ul>li,table.has-actions tr>.actions>[type=checkbox]+label+div>ul>li,table.with-details tr>.actions>[type=checkbox]+label+div>ul>li{list-style-type:none}.disclosure-menu [aria-expanded]~*>ul .informed-action,.menu-panel>ul .informed-action,.more-popover-menu>[type=checkbox]+label+div>ul .informed-action,.popover-menu>[type=checkbox]+label+div>ul .informed-action,table.has-actions tr>.actions>[type=checkbox]+label+div>ul .informed-action,table.with-details tr>.actions>[type=checkbox]+label+div>ul .informed-action{border:0!important}.disclosure-menu [aria-expanded]~*>div,.menu-panel>div,.more-popover-menu>[type=checkbox]+label+div>div,.popover-menu>[type=checkbox]+label+div>div,table.has-actions tr>.actions>[type=checkbox]+label+div>div,table.with-details tr>.actions>[type=checkbox]+label+div>div{padding:.625rem var(--padding-x);white-space:normal;max-width:fit-content}@supports not (max-width:fit-content){.disclosure-menu [aria-expanded]~*>div,.menu-panel>div,.more-popover-menu>[type=checkbox]+label+div>div,.popover-menu>[type=checkbox]+label+div>div,table.has-actions tr>.actions>[type=checkbox]+label+div>div,table.with-details tr>.actions>[type=checkbox]+label+div>div{max-width:200px}}.disclosure-menu [aria-expanded]~*>div::before,.menu-panel>div::before,.more-popover-menu>[type=checkbox]+label+div>div::before,.popover-menu>[type=checkbox]+label+div>div::before,table.has-actions tr>.actions>[type=checkbox]+label+div>div::before,table.with-details tr>.actions>[type=checkbox]+label+div>div::before{position:absolute;left:15px;top:calc(10px + .1em)}.disclosure-menu [aria-expanded]~*>ul>[role=treeitem]+*,.disclosure-menu [aria-expanded]~*>ul>li>[role=menuitem]+*,.disclosure-menu [aria-expanded]~*>ul>li>[role=option]+*,.menu-panel-deprecated>ul>li>div[role=menu],.menu-panel>ul>[role=treeitem]+*,.menu-panel>ul>li>[role=menuitem]+*,.menu-panel>ul>li>[role=option]+*,.more-popover-menu>[type=checkbox]+label+div>ul>[role=treeitem]+*,.more-popover-menu>[type=checkbox]+label+div>ul>li>[role=menuitem]+*,.more-popover-menu>[type=checkbox]+label+div>ul>li>[role=option]+*,.popover-menu>[type=checkbox]+label+div>ul>[role=treeitem]+*,.popover-menu>[type=checkbox]+label+div>ul>li>[role=menuitem]+*,.popover-menu>[type=checkbox]+label+div>ul>li>[role=option]+*,table.has-actions tr>.actions>[type=checkbox]+label+div>ul>[role=treeitem]+*,table.has-actions tr>.actions>[type=checkbox]+label+div>ul>li>[role=menuitem]+*,table.has-actions tr>.actions>[type=checkbox]+label+div>ul>li>[role=option]+*,table.with-details tr>.actions>[type=checkbox]+label+div>ul>[role=treeitem]+*,table.with-details tr>.actions>[type=checkbox]+label+div>ul>li>[role=menuitem]+*,table.with-details tr>.actions>[type=checkbox]+label+div>ul>li>[role=option]+*{position:absolute;top:0;left:calc(100% + 10px)}.disclosure-menu [aria-expanded]~*>ul,.menu-panel>ul,.more-popover-menu>[type=checkbox]+label+div>ul,.popover-menu>[type=checkbox]+label+div>ul,table.has-actions tr>.actions>[type=checkbox]+label+div>ul,table.with-details tr>.actions>[type=checkbox]+label+div>ul{margin:0;padding:calc(var(--padding-y) - .625rem) 0;transition:transform 150ms}.disclosure-menu [aria-expanded]~*>ul,.disclosure-menu [aria-expanded]~*>ul>li,.disclosure-menu [aria-expanded]~*>ul>li>*,.menu-panel>ul,.menu-panel>ul>li,.menu-panel>ul>li>*,.more-popover-menu>[type=checkbox]+label+div>ul,.more-popover-menu>[type=checkbox]+label+div>ul>li,.more-popover-menu>[type=checkbox]+label+div>ul>li>*,.popover-menu>[type=checkbox]+label+div>ul,.popover-menu>[type=checkbox]+label+div>ul>li,.popover-menu>[type=checkbox]+label+div>ul>li>*,table.has-actions tr>.actions>[type=checkbox]+label+div>ul,table.has-actions tr>.actions>[type=checkbox]+label+div>ul>li,table.has-actions tr>.actions>[type=checkbox]+label+div>ul>li>*,table.with-details tr>.actions>[type=checkbox]+label+div>ul,table.with-details tr>.actions>[type=checkbox]+label+div>ul>li,table.with-details tr>.actions>[type=checkbox]+label+div>ul>li>*{width:100%}.disclosure-menu [aria-expanded]~*>ul>[role=treeitem],.disclosure-menu [aria-expanded]~*>ul>li,.disclosure-menu [aria-expanded]~*>ul>li>[role=menuitem],.disclosure-menu [aria-expanded]~*>ul>li>[role=option],.menu-panel>ul>[role=treeitem],.menu-panel>ul>li,.menu-panel>ul>li>[role=menuitem],.menu-panel>ul>li>[role=option],.more-popover-menu>[type=checkbox]+label+div>ul>[role=treeitem],.more-popover-menu>[type=checkbox]+label+div>ul>li,.more-popover-menu>[type=checkbox]+label+div>ul>li>[role=menuitem],.more-popover-menu>[type=checkbox]+label+div>ul>li>[role=option],.popover-menu>[type=checkbox]+label+div>ul>[role=treeitem],.popover-menu>[type=checkbox]+label+div>ul>li,.popover-menu>[type=checkbox]+label+div>ul>li>[role=menuitem],.popover-menu>[type=checkbox]+label+div>ul>li>[role=option],table.has-actions tr>.actions>[type=checkbox]+label+div>ul>[role=treeitem],table.has-actions tr>.actions>[type=checkbox]+label+div>ul>li,table.has-actions tr>.actions>[type=checkbox]+label+div>ul>li>[role=menuitem],table.has-actions tr>.actions>[type=checkbox]+label+div>ul>li>[role=option],table.with-details tr>.actions>[type=checkbox]+label+div>ul>[role=treeitem],table.with-details tr>.actions>[type=checkbox]+label+div>ul>li,table.with-details tr>.actions>[type=checkbox]+label+div>ul>li>[role=menuitem],table.with-details tr>.actions>[type=checkbox]+label+div>ul>li>[role=option]{text-align:left}.hashicorp-consul nav .dcs li.is-local span,.hashicorp-consul nav .dcs li.is-primary span{color:rgb(var(--tone-gray-000));background-color:rgb(var(--tone-gray-500));padding:0 8px;margin-left:.5rem}.disclosure-menu [aria-expanded]~*>ul>[role=treeitem]::after,.disclosure-menu [aria-expanded]~*>ul>li>[role=menuitem]::after,.disclosure-menu [aria-expanded]~*>ul>li>[role=option]::after,.menu-panel>ul>[role=treeitem]::after,.menu-panel>ul>li>[role=menuitem]::after,.menu-panel>ul>li>[role=option]::after,.more-popover-menu>[type=checkbox]+label+div>ul>[role=treeitem]::after,.more-popover-menu>[type=checkbox]+label+div>ul>li>[role=menuitem]::after,.more-popover-menu>[type=checkbox]+label+div>ul>li>[role=option]::after,.popover-menu>[type=checkbox]+label+div>ul>[role=treeitem]::after,.popover-menu>[type=checkbox]+label+div>ul>li>[role=menuitem]::after,.popover-menu>[type=checkbox]+label+div>ul>li>[role=option]::after,table.has-actions tr>.actions>[type=checkbox]+label+div>ul>[role=treeitem]::after,table.has-actions tr>.actions>[type=checkbox]+label+div>ul>li>[role=menuitem]::after,table.has-actions tr>.actions>[type=checkbox]+label+div>ul>li>[role=option]::after,table.with-details tr>.actions>[type=checkbox]+label+div>ul>[role=treeitem]::after,table.with-details tr>.actions>[type=checkbox]+label+div>ul>li>[role=menuitem]::after,table.with-details tr>.actions>[type=checkbox]+label+div>ul>li>[role=option]::after{margin-left:auto;padding-right:var(--padding-x);transform:translate(calc(var(--padding-x)/ 2),0)}.disclosure-menu [aria-expanded]~* [role=separator],.menu-panel [role=separator],.more-popover-menu>[type=checkbox]+label+div [role=separator],.popover-menu>[type=checkbox]+label+div [role=separator],table.has-actions tr>.actions>[type=checkbox]+label+div [role=separator],table.with-details tr>.actions>[type=checkbox]+label+div [role=separator]{padding-top:.375rem}.disclosure-menu [aria-expanded]~* [role=separator]:not(:first-child),.menu-panel [role=separator]:not(:first-child),.more-popover-menu>[type=checkbox]+label+div [role=separator]:not(:first-child),.popover-menu>[type=checkbox]+label+div [role=separator]:not(:first-child),table.has-actions tr>.actions>[type=checkbox]+label+div [role=separator]:not(:first-child),table.with-details tr>.actions>[type=checkbox]+label+div [role=separator]:not(:first-child){margin-top:.275rem}.disclosure-menu [aria-expanded]~* [role=separator]:not(:empty),.menu-panel [role=separator]:not(:empty),.more-popover-menu>[type=checkbox]+label+div [role=separator]:not(:empty),.popover-menu>[type=checkbox]+label+div [role=separator]:not(:empty),table.has-actions tr>.actions>[type=checkbox]+label+div [role=separator]:not(:empty),table.with-details tr>.actions>[type=checkbox]+label+div [role=separator]:not(:empty){padding-left:var(--padding-x);padding-right:var(--padding-x);padding-bottom:.125rem}.disclosure-menu [aria-expanded]~.menu-panel-confirming,.menu-panel-confirming.menu-panel,.more-popover-menu>[type=checkbox]+label+div.menu-panel-confirming,.popover-menu>[type=checkbox]+label+div.menu-panel-confirming,table.has-actions tr>.actions>[type=checkbox]+label+div.menu-panel-confirming,table.with-details tr>.actions>[type=checkbox]+label+div.menu-panel-confirming{overflow:hidden}.disclosure-menu [aria-expanded]~.menu-panel-confirming>ul,.menu-panel-confirming.menu-panel>ul,.more-popover-menu>[type=checkbox]+label+div.menu-panel-confirming>ul,.popover-menu>[type=checkbox]+label+div.menu-panel-confirming>ul,table.has-actions tr>.actions>[type=checkbox]+label+div.menu-panel-confirming>ul,table.with-details tr>.actions>[type=checkbox]+label+div.menu-panel-confirming>ul{transform:translateX(calc(-100% - 10px))}.disclosure-menu [aria-expanded]~*,.menu-panel,.more-popover-menu>[type=checkbox]+label+div,.popover-menu>[type=checkbox]+label+div,table.has-actions tr>.actions>[type=checkbox]+label+div,table.with-details tr>.actions>[type=checkbox]+label+div{overflow:hidden}.menu-panel-deprecated{position:absolute;transition:min-height 150ms,max-height 150ms;min-height:0}.menu-panel-deprecated [type=checkbox]{display:none}.menu-panel-deprecated:not(.confirmation) [type=checkbox]~*{transition:transform 150ms}.confirmation.menu-panel-deprecated [role=menu]{min-height:205px!important}.menu-panel-deprecated [type=checkbox]:checked~*{transform:translateX(calc(-100% - 10px));min-height:143px;max-height:143px}.menu-panel-deprecated [id$="-"]:first-child:checked~ul label[for$="-"] * [role=menu],.menu-panel-deprecated [id$="-"]:first-child:checked~ul>li>[role=menu]{display:block}.menu-panel-deprecated>ul>li>:not(div[role=menu]),.tippy-box{position:relative}.menu-panel-deprecated:not(.left){right:0!important;left:auto!important}.left.menu-panel-deprecated{left:0}.menu-panel-deprecated:not(.above){top:28px}.above.menu-panel-deprecated{bottom:42px}.consul-upstream-instance-list dl.local-bind-socket-mode dt::after{display:inline;content:var(--horizontal-kv-list-key-separator)}.consul-bucket-list,.consul-exposed-path-list>ul>li>.detail dl,.consul-instance-checks,.consul-lock-session-list dl,.consul-lock-session-list ul>li:not(:first-child)>.detail dl,.consul-upstream-instance-list dl,.consul-upstream-instance-list li>.detail dl,.list-collection>ul>li:not(:first-child)>.detail dl,.tag-list,section[data-route="dc.show.license"] .validity dl,section[data-route="dc.show.serverstatus"] .redundancy-zones section header dl,td.tags{display:inline-flex;flex-wrap:nowrap;align-items:center}.consul-bucket-list:empty,.consul-exposed-path-list>ul>li>.detail dl:empty,.consul-instance-checks:empty,.consul-lock-session-list dl:empty,.consul-lock-session-list ul>li:not(:first-child)>.detail dl:empty,.consul-upstream-instance-list dl:empty,.list-collection>ul>li:not(:first-child)>.detail dl:empty,.tag-list:empty,section[data-route="dc.show.license"] .validity dl:empty,section[data-route="dc.show.serverstatus"] .redundancy-zones section header dl:empty,td.tags:empty{display:none}.consul-bucket-list>*>*,.consul-exposed-path-list>ul>li>.detail dl>*>*,.consul-instance-checks>*>*,.consul-lock-session-list dl>*>*,.consul-lock-session-list ul>li:not(:first-child)>.detail dl>*>*,.consul-upstream-instance-list dl>*>*,.consul-upstream-instance-list li>.detail dl>*>*,.list-collection>ul>li:not(:first-child)>.detail dl>*>*,.tag-list>*>*,section[data-route="dc.show.license"] .validity dl>*>*,section[data-route="dc.show.serverstatus"] .redundancy-zones section header dl>*>*,td.tags>*>*{display:inline-block}.consul-bucket-list>*,.consul-exposed-path-list>ul>li>.detail dl>*,.consul-instance-checks>*,.consul-lock-session-list dl>*,.consul-lock-session-list ul>li:not(:first-child)>.detail dl>*,.consul-upstream-instance-list dl>*,.consul-upstream-instance-list li>.detail dl>*,.list-collection>ul>li:not(:first-child)>.detail dl>*,.tag-list>*,section[data-route="dc.show.license"] .validity dl>*,section[data-route="dc.show.serverstatus"] .redundancy-zones section header dl>*,td.tags>*{white-space:nowrap}.consul-bucket-list>dd,.consul-exposed-path-list>ul>li>.detail dl>dd,.consul-instance-checks>dd,.consul-lock-session-list dl>dd,.consul-lock-session-list ul>li:not(:first-child)>.detail dl>dd,.consul-upstream-instance-list dl>dd,.consul-upstream-instance-list li>.detail dl>dd,.list-collection>ul>li:not(:first-child)>.detail dl>dd,.tag-list>dd,section[data-route="dc.show.license"] .validity dl>dd,section[data-route="dc.show.serverstatus"] .redundancy-zones section header dl>dd,td.tags>dd{flex-wrap:wrap}.consul-upstream-instance-list dl.local-bind-socket-mode dt{display:inline-flex;min-width:18px;overflow:hidden}.consul-bucket-list .consul-exposed-path-list>ul>li>.detail dl:not([class]) dd+dt:not([class])+dd,.consul-bucket-list .consul-lock-session-list ul>li:not(:first-child)>.detail dl:not([class]) dd+dt:not([class])+dd,.consul-bucket-list .consul-upstream-instance-list dl.local-bind-address dd+dt+dd,.consul-bucket-list .consul-upstream-instance-list dl.local-bind-socket-path dd+dt+dd,.consul-bucket-list .consul-upstream-instance-list li>.detail dl:not([class]) dd+dt:not([class])+dd,.consul-bucket-list .list-collection>ul>li:not(:first-child)>.detail dl:not([class]) dd+dt:not([class])+dd,.consul-bucket-list .tag-list:not([class]) dd+dt:not([class])+dd,.consul-bucket-list dd+dt,.consul-bucket-list td.tags:not([class]) dd+dt:not([class])+dd,.consul-bucket-list+.consul-bucket-list:not(:first-of-type),.consul-bucket-list+.consul-instance-checks:not(:first-of-type),.consul-bucket-list+.tag-list:not(:first-of-type),.consul-bucket-list+td.tags:not(:first-of-type),.consul-bucket-list:not([class]) .consul-exposed-path-list>ul>li>.detail dl dd+dt:not([class])+dd,.consul-bucket-list:not([class]) .consul-lock-session-list ul>li:not(:first-child)>.detail dl dd+dt:not([class])+dd,.consul-bucket-list:not([class]) .consul-upstream-instance-list li>.detail dl dd+dt:not([class])+dd,.consul-bucket-list:not([class]) .list-collection>ul>li:not(:first-child)>.detail dl dd+dt:not([class])+dd,.consul-bucket-list:not([class]) .tag-list dd+dt:not([class])+dd,.consul-bucket-list:not([class]) dd+dt:not([class])+dd,.consul-bucket-list:not([class]) td.tags dd+dt:not([class])+dd,.consul-exposed-path-list>ul>li>.detail .consul-bucket-list+dl:not(:first-of-type),.consul-exposed-path-list>ul>li>.detail .consul-instance-checks+dl:not(:first-of-type),.consul-exposed-path-list>ul>li>.detail .consul-lock-session-list dl+dl:not(:first-of-type),.consul-exposed-path-list>ul>li>.detail .consul-upstream-instance-list dl+dl:not(:first-of-type),.consul-exposed-path-list>ul>li>.detail .consul-upstream-instance-list dl.local-bind-address dd+dt+dd,.consul-exposed-path-list>ul>li>.detail .consul-upstream-instance-list dl.local-bind-socket-path dd+dt+dd,.consul-exposed-path-list>ul>li>.detail .list-collection>ul>li:not(:first-child)>.detail dl:not([class]) dd+dt:not([class])+dd,.consul-exposed-path-list>ul>li>.detail .tag-list+dl:not(:first-of-type),.consul-exposed-path-list>ul>li>.detail dl .consul-bucket-list:not([class]) dd+dt:not([class])+dd,.consul-exposed-path-list>ul>li>.detail dl .consul-instance-checks:not([class]) dd+dt:not([class])+dd,.consul-exposed-path-list>ul>li>.detail dl .consul-lock-session-list dl:not([class]) dd+dt:not([class])+dd,.consul-exposed-path-list>ul>li>.detail dl .consul-upstream-instance-list dl:not([class]) dd+dt:not([class])+dd,.consul-exposed-path-list>ul>li>.detail dl .tag-list:not([class]) dd+dt:not([class])+dd,.consul-exposed-path-list>ul>li>.detail dl dd+dt,.consul-exposed-path-list>ul>li>.detail dl section[data-route="dc.show.license"] .validity dl:not([class]) dd+dt:not([class])+dd,.consul-exposed-path-list>ul>li>.detail dl section[data-route="dc.show.serverstatus"] .redundancy-zones section header dl:not([class]) dd+dt:not([class])+dd,.consul-exposed-path-list>ul>li>.detail dl td.tags:not([class]) dd+dt:not([class])+dd,.consul-exposed-path-list>ul>li>.detail dl+.consul-bucket-list:not(:first-of-type),.consul-exposed-path-list>ul>li>.detail dl+.consul-instance-checks:not(:first-of-type),.consul-exposed-path-list>ul>li>.detail dl+.tag-list:not(:first-of-type),.consul-exposed-path-list>ul>li>.detail dl+dl:not(:first-of-type),.consul-exposed-path-list>ul>li>.detail dl+td.tags:not(:first-of-type),.consul-exposed-path-list>ul>li>.detail dl:not([class]) .consul-bucket-list dd+dt:not([class])+dd,.consul-exposed-path-list>ul>li>.detail dl:not([class]) .consul-instance-checks dd+dt:not([class])+dd,.consul-exposed-path-list>ul>li>.detail dl:not([class]) .consul-lock-session-list dl dd+dt:not([class])+dd,.consul-exposed-path-list>ul>li>.detail dl:not([class]) .consul-upstream-instance-list dl dd+dt:not([class])+dd,.consul-exposed-path-list>ul>li>.detail dl:not([class]) .tag-list dd+dt:not([class])+dd,.consul-exposed-path-list>ul>li>.detail dl:not([class]) dd+dt:not([class])+dd,.consul-exposed-path-list>ul>li>.detail dl:not([class]) section[data-route="dc.show.license"] .validity dl dd+dt:not([class])+dd,.consul-exposed-path-list>ul>li>.detail dl:not([class]) section[data-route="dc.show.serverstatus"] .redundancy-zones section header dl dd+dt:not([class])+dd,.consul-exposed-path-list>ul>li>.detail dl:not([class]) td.tags dd+dt:not([class])+dd,.consul-exposed-path-list>ul>li>.detail section[data-route="dc.show.license"] .validity dl+dl:not(:first-of-type),.consul-exposed-path-list>ul>li>.detail section[data-route="dc.show.serverstatus"] .redundancy-zones section header dl+dl:not(:first-of-type),.consul-exposed-path-list>ul>li>.detail td.tags+dl:not(:first-of-type),.consul-instance-checks .consul-exposed-path-list>ul>li>.detail dl:not([class]) dd+dt:not([class])+dd,.consul-instance-checks .consul-lock-session-list ul>li:not(:first-child)>.detail dl:not([class]) dd+dt:not([class])+dd,.consul-instance-checks .consul-upstream-instance-list dl.local-bind-address dd+dt+dd,.consul-instance-checks .consul-upstream-instance-list dl.local-bind-socket-path dd+dt+dd,.consul-instance-checks .consul-upstream-instance-list li>.detail dl:not([class]) dd+dt:not([class])+dd,.consul-instance-checks .list-collection>ul>li:not(:first-child)>.detail dl:not([class]) dd+dt:not([class])+dd,.consul-instance-checks .tag-list:not([class]) dd+dt:not([class])+dd,.consul-instance-checks dd+dt,.consul-instance-checks td.tags:not([class]) dd+dt:not([class])+dd,.consul-instance-checks+.consul-bucket-list:not(:first-of-type),.consul-instance-checks+.consul-instance-checks:not(:first-of-type),.consul-instance-checks+.tag-list:not(:first-of-type),.consul-instance-checks+td.tags:not(:first-of-type),.consul-instance-checks:not([class]) .consul-exposed-path-list>ul>li>.detail dl dd+dt:not([class])+dd,.consul-instance-checks:not([class]) .consul-lock-session-list ul>li:not(:first-child)>.detail dl dd+dt:not([class])+dd,.consul-instance-checks:not([class]) .consul-upstream-instance-list li>.detail dl dd+dt:not([class])+dd,.consul-instance-checks:not([class]) .list-collection>ul>li:not(:first-child)>.detail dl dd+dt:not([class])+dd,.consul-instance-checks:not([class]) .tag-list dd+dt:not([class])+dd,.consul-instance-checks:not([class]) dd+dt:not([class])+dd,.consul-instance-checks:not([class]) td.tags dd+dt:not([class])+dd,.consul-lock-session-list .consul-bucket-list ul>li:not(:first-child)>.detail dl:not([class]) dd+dt:not([class])+dd,.consul-lock-session-list .consul-bucket-list+dl:not(:first-of-type),.consul-lock-session-list .consul-bucket-list:not([class]) ul>li:not(:first-child)>.detail dl dd+dt:not([class])+dd,.consul-lock-session-list .consul-exposed-path-list>ul>li>.detail dl dl:not([class]) dd+dt:not([class])+dd,.consul-lock-session-list .consul-exposed-path-list>ul>li>.detail dl+dl:not(:first-of-type),.consul-lock-session-list .consul-exposed-path-list>ul>li>.detail dl:not([class]) dl dd+dt:not([class])+dd,.consul-lock-session-list .consul-instance-checks ul>li:not(:first-child)>.detail dl:not([class]) dd+dt:not([class])+dd,.consul-lock-session-list .consul-instance-checks+dl:not(:first-of-type),.consul-lock-session-list .consul-instance-checks:not([class]) ul>li:not(:first-child)>.detail dl dd+dt:not([class])+dd,.consul-lock-session-list .consul-upstream-instance-list dl li>.detail dl:not([class]) dd+dt:not([class])+dd,.consul-lock-session-list .consul-upstream-instance-list dl ul>li:not(:first-child)>.detail dl:not([class]) dd+dt:not([class])+dd,.consul-lock-session-list .consul-upstream-instance-list dl+dl:not(:first-of-type),.consul-lock-session-list .consul-upstream-instance-list dl.local-bind-address dl dd+dt+dd,.consul-lock-session-list .consul-upstream-instance-list dl.local-bind-socket-path dl dd+dt+dd,.consul-lock-session-list .consul-upstream-instance-list dl:not([class]) li>.detail dl dd+dt:not([class])+dd,.consul-lock-session-list .consul-upstream-instance-list dl:not([class]) ul>li:not(:first-child)>.detail dl dd+dt:not([class])+dd,.consul-lock-session-list .consul-upstream-instance-list li>.detail dl dl:not([class]) dd+dt:not([class])+dd,.consul-lock-session-list .consul-upstream-instance-list li>.detail dl+dl:not(:first-of-type),.consul-lock-session-list .consul-upstream-instance-list li>.detail dl:not([class]) dl dd+dt:not([class])+dd,.consul-lock-session-list .consul-upstream-instance-list ul>li:not(:first-child)>.detail dl dl:not([class]) dd+dt:not([class])+dd,.consul-lock-session-list .consul-upstream-instance-list ul>li:not(:first-child)>.detail dl+dl:not(:first-of-type),.consul-lock-session-list .consul-upstream-instance-list ul>li:not(:first-child)>.detail dl.local-bind-address dd+dt+dd,.consul-lock-session-list .consul-upstream-instance-list ul>li:not(:first-child)>.detail dl.local-bind-socket-path dd+dt+dd,.consul-lock-session-list .consul-upstream-instance-list ul>li:not(:first-child)>.detail dl:not([class]) dl dd+dt:not([class])+dd,.consul-lock-session-list .list-collection>ul>li:not(:first-child)>.detail dl dl:not([class]) dd+dt:not([class])+dd,.consul-lock-session-list .list-collection>ul>li:not(:first-child)>.detail dl+dl:not(:first-of-type),.consul-lock-session-list .list-collection>ul>li:not(:first-child)>.detail dl:not([class]) dl dd+dt:not([class])+dd,.consul-lock-session-list .list-collection>ul>li:not(:first-child)>.detail ul>li:not(:first-child)>.detail dl:not([class]) dd+dt:not([class])+dd,.consul-lock-session-list .tag-list dl:not([class]) dd+dt:not([class])+dd,.consul-lock-session-list .tag-list ul>li:not(:first-child)>.detail dl:not([class]) dd+dt:not([class])+dd,.consul-lock-session-list .tag-list+dl:not(:first-of-type),.consul-lock-session-list .tag-list:not([class]) dl dd+dt:not([class])+dd,.consul-lock-session-list .tag-list:not([class]) ul>li:not(:first-child)>.detail dl dd+dt:not([class])+dd,.consul-lock-session-list dl .consul-exposed-path-list>ul>li>.detail dl:not([class]) dd+dt:not([class])+dd,.consul-lock-session-list dl .consul-lock-session-list ul>li:not(:first-child)>.detail dl:not([class]) dd+dt:not([class])+dd,.consul-lock-session-list dl .consul-upstream-instance-list dl.local-bind-address dd+dt+dd,.consul-lock-session-list dl .consul-upstream-instance-list dl.local-bind-socket-path dd+dt+dd,.consul-lock-session-list dl .consul-upstream-instance-list li>.detail dl:not([class]) dd+dt:not([class])+dd,.consul-lock-session-list dl .list-collection>ul>li:not(:first-child)>.detail dl:not([class]) dd+dt:not([class])+dd,.consul-lock-session-list dl .tag-list:not([class]) dd+dt:not([class])+dd,.consul-lock-session-list dl dd+dt,.consul-lock-session-list dl td.tags:not([class]) dd+dt:not([class])+dd,.consul-lock-session-list dl ul>li:not(:first-child)>.detail dl:not([class]) dd+dt:not([class])+dd,.consul-lock-session-list dl+.consul-bucket-list:not(:first-of-type),.consul-lock-session-list dl+.consul-instance-checks:not(:first-of-type),.consul-lock-session-list dl+.tag-list:not(:first-of-type),.consul-lock-session-list dl+dl:not(:first-of-type),.consul-lock-session-list dl+td.tags:not(:first-of-type),.consul-lock-session-list dl:not([class]) .consul-exposed-path-list>ul>li>.detail dl dd+dt:not([class])+dd,.consul-lock-session-list dl:not([class]) .consul-lock-session-list ul>li:not(:first-child)>.detail dl dd+dt:not([class])+dd,.consul-lock-session-list dl:not([class]) .consul-upstream-instance-list li>.detail dl dd+dt:not([class])+dd,.consul-lock-session-list dl:not([class]) .list-collection>ul>li:not(:first-child)>.detail dl dd+dt:not([class])+dd,.consul-lock-session-list dl:not([class]) .tag-list dd+dt:not([class])+dd,.consul-lock-session-list dl:not([class]) dd+dt:not([class])+dd,.consul-lock-session-list dl:not([class]) td.tags dd+dt:not([class])+dd,.consul-lock-session-list dl:not([class]) ul>li:not(:first-child)>.detail dl dd+dt:not([class])+dd,.consul-lock-session-list section[data-route="dc.show.license"] .validity dl ul>li:not(:first-child)>.detail dl:not([class]) dd+dt:not([class])+dd,.consul-lock-session-list section[data-route="dc.show.license"] .validity dl+dl:not(:first-of-type),.consul-lock-session-list section[data-route="dc.show.license"] .validity dl:not([class]) ul>li:not(:first-child)>.detail dl dd+dt:not([class])+dd,.consul-lock-session-list section[data-route="dc.show.serverstatus"] .redundancy-zones section header dl ul>li:not(:first-child)>.detail dl:not([class]) dd+dt:not([class])+dd,.consul-lock-session-list section[data-route="dc.show.serverstatus"] .redundancy-zones section header dl+dl:not(:first-of-type),.consul-lock-session-list section[data-route="dc.show.serverstatus"] .redundancy-zones section header dl:not([class]) ul>li:not(:first-child)>.detail dl dd+dt:not([class])+dd,.consul-lock-session-list td.tags dl:not([class]) dd+dt:not([class])+dd,.consul-lock-session-list td.tags ul>li:not(:first-child)>.detail dl:not([class]) dd+dt:not([class])+dd,.consul-lock-session-list td.tags+dl:not(:first-of-type),.consul-lock-session-list td.tags:not([class]) dl dd+dt:not([class])+dd,.consul-lock-session-list td.tags:not([class]) ul>li:not(:first-child)>.detail dl dd+dt:not([class])+dd,.consul-lock-session-list ul>li:not(:first-child)>.detail .consul-bucket-list+dl:not(:first-of-type),.consul-lock-session-list ul>li:not(:first-child)>.detail .consul-instance-checks+dl:not(:first-of-type),.consul-lock-session-list ul>li:not(:first-child)>.detail .consul-upstream-instance-list dl+dl:not(:first-of-type),.consul-lock-session-list ul>li:not(:first-child)>.detail .consul-upstream-instance-list dl.local-bind-address dd+dt+dd,.consul-lock-session-list ul>li:not(:first-child)>.detail .consul-upstream-instance-list dl.local-bind-socket-path dd+dt+dd,.consul-lock-session-list ul>li:not(:first-child)>.detail .list-collection>ul>li:not(:first-child)>.detail dl:not([class]) dd+dt:not([class])+dd,.consul-lock-session-list ul>li:not(:first-child)>.detail .tag-list+dl:not(:first-of-type),.consul-lock-session-list ul>li:not(:first-child)>.detail dl .consul-bucket-list:not([class]) dd+dt:not([class])+dd,.consul-lock-session-list ul>li:not(:first-child)>.detail dl .consul-instance-checks:not([class]) dd+dt:not([class])+dd,.consul-lock-session-list ul>li:not(:first-child)>.detail dl .consul-upstream-instance-list dl:not([class]) dd+dt:not([class])+dd,.consul-lock-session-list ul>li:not(:first-child)>.detail dl .tag-list:not([class]) dd+dt:not([class])+dd,.consul-lock-session-list ul>li:not(:first-child)>.detail dl dd+dt,.consul-lock-session-list ul>li:not(:first-child)>.detail dl dl:not([class]) dd+dt:not([class])+dd,.consul-lock-session-list ul>li:not(:first-child)>.detail dl section[data-route="dc.show.license"] .validity dl:not([class]) dd+dt:not([class])+dd,.consul-lock-session-list ul>li:not(:first-child)>.detail dl section[data-route="dc.show.serverstatus"] .redundancy-zones section header dl:not([class]) dd+dt:not([class])+dd,.consul-lock-session-list ul>li:not(:first-child)>.detail dl td.tags:not([class]) dd+dt:not([class])+dd,.consul-lock-session-list ul>li:not(:first-child)>.detail dl+.consul-bucket-list:not(:first-of-type),.consul-lock-session-list ul>li:not(:first-child)>.detail dl+.consul-instance-checks:not(:first-of-type),.consul-lock-session-list ul>li:not(:first-child)>.detail dl+.tag-list:not(:first-of-type),.consul-lock-session-list ul>li:not(:first-child)>.detail dl+dl:not(:first-of-type),.consul-lock-session-list ul>li:not(:first-child)>.detail dl+td.tags:not(:first-of-type),.consul-lock-session-list ul>li:not(:first-child)>.detail dl:not([class]) .consul-bucket-list dd+dt:not([class])+dd,.consul-lock-session-list ul>li:not(:first-child)>.detail dl:not([class]) .consul-instance-checks dd+dt:not([class])+dd,.consul-lock-session-list ul>li:not(:first-child)>.detail dl:not([class]) .consul-upstream-instance-list dl dd+dt:not([class])+dd,.consul-lock-session-list ul>li:not(:first-child)>.detail dl:not([class]) .tag-list dd+dt:not([class])+dd,.consul-lock-session-list ul>li:not(:first-child)>.detail dl:not([class]) dd+dt:not([class])+dd,.consul-lock-session-list ul>li:not(:first-child)>.detail dl:not([class]) dl dd+dt:not([class])+dd,.consul-lock-session-list ul>li:not(:first-child)>.detail dl:not([class]) section[data-route="dc.show.license"] .validity dl dd+dt:not([class])+dd,.consul-lock-session-list ul>li:not(:first-child)>.detail dl:not([class]) section[data-route="dc.show.serverstatus"] .redundancy-zones section header dl dd+dt:not([class])+dd,.consul-lock-session-list ul>li:not(:first-child)>.detail dl:not([class]) td.tags dd+dt:not([class])+dd,.consul-lock-session-list ul>li:not(:first-child)>.detail section[data-route="dc.show.license"] .validity dl+dl:not(:first-of-type),.consul-lock-session-list ul>li:not(:first-child)>.detail section[data-route="dc.show.serverstatus"] .redundancy-zones section header dl+dl:not(:first-of-type),.consul-lock-session-list ul>li:not(:first-child)>.detail td.tags+dl:not(:first-of-type),.consul-upstream-instance-list .consul-bucket-list li>.detail dl:not([class]) dd+dt:not([class])+dd,.consul-upstream-instance-list .consul-bucket-list+dl:not(:first-of-type),.consul-upstream-instance-list .consul-bucket-list:not([class]) li>.detail dl dd+dt:not([class])+dd,.consul-upstream-instance-list .consul-exposed-path-list>ul>li>.detail dl dl:not([class]) dd+dt:not([class])+dd,.consul-upstream-instance-list .consul-exposed-path-list>ul>li>.detail dl+dl:not(:first-of-type),.consul-upstream-instance-list .consul-exposed-path-list>ul>li>.detail dl.local-bind-address dd+dt+dd,.consul-upstream-instance-list .consul-exposed-path-list>ul>li>.detail dl.local-bind-socket-path dd+dt+dd,.consul-upstream-instance-list .consul-exposed-path-list>ul>li>.detail dl:not([class]) dl dd+dt:not([class])+dd,.consul-upstream-instance-list .consul-instance-checks li>.detail dl:not([class]) dd+dt:not([class])+dd,.consul-upstream-instance-list .consul-instance-checks+dl:not(:first-of-type),.consul-upstream-instance-list .consul-instance-checks:not([class]) li>.detail dl dd+dt:not([class])+dd,.consul-upstream-instance-list .consul-lock-session-list dl li>.detail dl:not([class]) dd+dt:not([class])+dd,.consul-upstream-instance-list .consul-lock-session-list dl+dl:not(:first-of-type),.consul-upstream-instance-list .consul-lock-session-list dl:not([class]) li>.detail dl dd+dt:not([class])+dd,.consul-upstream-instance-list .consul-lock-session-list ul>li:not(:first-child)>.detail dl dl:not([class]) dd+dt:not([class])+dd,.consul-upstream-instance-list .consul-lock-session-list ul>li:not(:first-child)>.detail dl+dl:not(:first-of-type),.consul-upstream-instance-list .consul-lock-session-list ul>li:not(:first-child)>.detail dl.local-bind-address dd+dt+dd,.consul-upstream-instance-list .consul-lock-session-list ul>li:not(:first-child)>.detail dl.local-bind-socket-path dd+dt+dd,.consul-upstream-instance-list .consul-lock-session-list ul>li:not(:first-child)>.detail dl:not([class]) dl dd+dt:not([class])+dd,.consul-upstream-instance-list .list-collection>ul>li:not(:first-child)>.detail dl dl:not([class]) dd+dt:not([class])+dd,.consul-upstream-instance-list .list-collection>ul>li:not(:first-child)>.detail dl+dl:not(:first-of-type),.consul-upstream-instance-list .list-collection>ul>li:not(:first-child)>.detail dl.local-bind-address dd+dt+dd,.consul-upstream-instance-list .list-collection>ul>li:not(:first-child)>.detail dl.local-bind-socket-path dd+dt+dd,.consul-upstream-instance-list .list-collection>ul>li:not(:first-child)>.detail dl:not([class]) dl dd+dt:not([class])+dd,.consul-upstream-instance-list .list-collection>ul>li:not(:first-child)>.detail li>.detail dl:not([class]) dd+dt:not([class])+dd,.consul-upstream-instance-list .tag-list dl:not([class]) dd+dt:not([class])+dd,.consul-upstream-instance-list .tag-list li>.detail dl:not([class]) dd+dt:not([class])+dd,.consul-upstream-instance-list .tag-list+dl:not(:first-of-type),.consul-upstream-instance-list .tag-list:not([class]) dl dd+dt:not([class])+dd,.consul-upstream-instance-list .tag-list:not([class]) li>.detail dl dd+dt:not([class])+dd,.consul-upstream-instance-list dl .consul-exposed-path-list>ul>li>.detail dl:not([class]) dd+dt:not([class])+dd,.consul-upstream-instance-list dl .consul-lock-session-list ul>li:not(:first-child)>.detail dl:not([class]) dd+dt:not([class])+dd,.consul-upstream-instance-list dl .consul-upstream-instance-list li>.detail dl:not([class]) dd+dt:not([class])+dd,.consul-upstream-instance-list dl .list-collection>ul>li:not(:first-child)>.detail dl:not([class]) dd+dt:not([class])+dd,.consul-upstream-instance-list dl .tag-list:not([class]) dd+dt:not([class])+dd,.consul-upstream-instance-list dl dd+dt,.consul-upstream-instance-list dl li>.detail dl:not([class]) dd+dt:not([class])+dd,.consul-upstream-instance-list dl td.tags:not([class]) dd+dt:not([class])+dd,.consul-upstream-instance-list dl+.consul-bucket-list:not(:first-of-type),.consul-upstream-instance-list dl+.consul-instance-checks:not(:first-of-type),.consul-upstream-instance-list dl+.tag-list:not(:first-of-type),.consul-upstream-instance-list dl+dl:not(:first-of-type),.consul-upstream-instance-list dl+td.tags:not(:first-of-type),.consul-upstream-instance-list dl.local-bind-address .consul-bucket-list dd+dt+dd,.consul-upstream-instance-list dl.local-bind-address .consul-instance-checks dd+dt+dd,.consul-upstream-instance-list dl.local-bind-address .consul-lock-session-list dl dd+dt+dd,.consul-upstream-instance-list dl.local-bind-address .tag-list dd+dt+dd,.consul-upstream-instance-list dl.local-bind-address dd+dt+dd,.consul-upstream-instance-list dl.local-bind-address section[data-route="dc.show.license"] .validity dl dd+dt+dd,.consul-upstream-instance-list dl.local-bind-address section[data-route="dc.show.serverstatus"] .redundancy-zones section header dl dd+dt+dd,.consul-upstream-instance-list dl.local-bind-address td.tags dd+dt+dd,.consul-upstream-instance-list dl.local-bind-socket-path .consul-bucket-list dd+dt+dd,.consul-upstream-instance-list dl.local-bind-socket-path .consul-instance-checks dd+dt+dd,.consul-upstream-instance-list dl.local-bind-socket-path .consul-lock-session-list dl dd+dt+dd,.consul-upstream-instance-list dl.local-bind-socket-path .tag-list dd+dt+dd,.consul-upstream-instance-list dl.local-bind-socket-path dd+dt+dd,.consul-upstream-instance-list dl.local-bind-socket-path section[data-route="dc.show.license"] .validity dl dd+dt+dd,.consul-upstream-instance-list dl.local-bind-socket-path section[data-route="dc.show.serverstatus"] .redundancy-zones section header dl dd+dt+dd,.consul-upstream-instance-list dl.local-bind-socket-path td.tags dd+dt+dd,.consul-upstream-instance-list dl:not([class]) .consul-exposed-path-list>ul>li>.detail dl dd+dt:not([class])+dd,.consul-upstream-instance-list dl:not([class]) .consul-lock-session-list ul>li:not(:first-child)>.detail dl dd+dt:not([class])+dd,.consul-upstream-instance-list dl:not([class]) .consul-upstream-instance-list li>.detail dl dd+dt:not([class])+dd,.consul-upstream-instance-list dl:not([class]) .list-collection>ul>li:not(:first-child)>.detail dl dd+dt:not([class])+dd,.consul-upstream-instance-list dl:not([class]) .tag-list dd+dt:not([class])+dd,.consul-upstream-instance-list dl:not([class]) dd+dt:not([class])+dd,.consul-upstream-instance-list dl:not([class]) li>.detail dl dd+dt:not([class])+dd,.consul-upstream-instance-list dl:not([class]) td.tags dd+dt:not([class])+dd,.consul-upstream-instance-list li>.detail .consul-bucket-list+dl:not(:first-of-type),.consul-upstream-instance-list li>.detail .consul-instance-checks+dl:not(:first-of-type),.consul-upstream-instance-list li>.detail .consul-lock-session-list dl+dl:not(:first-of-type),.consul-upstream-instance-list li>.detail .list-collection>ul>li:not(:first-child)>.detail dl:not([class]) dd+dt:not([class])+dd,.consul-upstream-instance-list li>.detail .tag-list+dl:not(:first-of-type),.consul-upstream-instance-list li>.detail dl .consul-bucket-list:not([class]) dd+dt:not([class])+dd,.consul-upstream-instance-list li>.detail dl .consul-instance-checks:not([class]) dd+dt:not([class])+dd,.consul-upstream-instance-list li>.detail dl .consul-lock-session-list dl:not([class]) dd+dt:not([class])+dd,.consul-upstream-instance-list li>.detail dl .tag-list:not([class]) dd+dt:not([class])+dd,.consul-upstream-instance-list li>.detail dl dd+dt,.consul-upstream-instance-list li>.detail dl dl:not([class]) dd+dt:not([class])+dd,.consul-upstream-instance-list li>.detail dl section[data-route="dc.show.license"] .validity dl:not([class]) dd+dt:not([class])+dd,.consul-upstream-instance-list li>.detail dl section[data-route="dc.show.serverstatus"] .redundancy-zones section header dl:not([class]) dd+dt:not([class])+dd,.consul-upstream-instance-list li>.detail dl td.tags:not([class]) dd+dt:not([class])+dd,.consul-upstream-instance-list li>.detail dl+.consul-bucket-list:not(:first-of-type),.consul-upstream-instance-list li>.detail dl+.consul-instance-checks:not(:first-of-type),.consul-upstream-instance-list li>.detail dl+.tag-list:not(:first-of-type),.consul-upstream-instance-list li>.detail dl+dl:not(:first-of-type),.consul-upstream-instance-list li>.detail dl+td.tags:not(:first-of-type),.consul-upstream-instance-list li>.detail dl.local-bind-address dd+dt+dd,.consul-upstream-instance-list li>.detail dl.local-bind-socket-path dd+dt+dd,.consul-upstream-instance-list li>.detail dl:not([class]) .consul-bucket-list dd+dt:not([class])+dd,.consul-upstream-instance-list li>.detail dl:not([class]) .consul-instance-checks dd+dt:not([class])+dd,.consul-upstream-instance-list li>.detail dl:not([class]) .consul-lock-session-list dl dd+dt:not([class])+dd,.consul-upstream-instance-list li>.detail dl:not([class]) .tag-list dd+dt:not([class])+dd,.consul-upstream-instance-list li>.detail dl:not([class]) dd+dt:not([class])+dd,.consul-upstream-instance-list li>.detail dl:not([class]) dl dd+dt:not([class])+dd,.consul-upstream-instance-list li>.detail dl:not([class]) section[data-route="dc.show.license"] .validity dl dd+dt:not([class])+dd,.consul-upstream-instance-list li>.detail dl:not([class]) section[data-route="dc.show.serverstatus"] .redundancy-zones section header dl dd+dt:not([class])+dd,.consul-upstream-instance-list li>.detail dl:not([class]) td.tags dd+dt:not([class])+dd,.consul-upstream-instance-list li>.detail section[data-route="dc.show.license"] .validity dl+dl:not(:first-of-type),.consul-upstream-instance-list li>.detail section[data-route="dc.show.serverstatus"] .redundancy-zones section header dl+dl:not(:first-of-type),.consul-upstream-instance-list li>.detail td.tags+dl:not(:first-of-type),.consul-upstream-instance-list section[data-route="dc.show.license"] .validity dl li>.detail dl:not([class]) dd+dt:not([class])+dd,.consul-upstream-instance-list section[data-route="dc.show.license"] .validity dl+dl:not(:first-of-type),.consul-upstream-instance-list section[data-route="dc.show.license"] .validity dl:not([class]) li>.detail dl dd+dt:not([class])+dd,.consul-upstream-instance-list section[data-route="dc.show.serverstatus"] .redundancy-zones section header dl li>.detail dl:not([class]) dd+dt:not([class])+dd,.consul-upstream-instance-list section[data-route="dc.show.serverstatus"] .redundancy-zones section header dl+dl:not(:first-of-type),.consul-upstream-instance-list section[data-route="dc.show.serverstatus"] .redundancy-zones section header dl:not([class]) li>.detail dl dd+dt:not([class])+dd,.consul-upstream-instance-list td.tags dl:not([class]) dd+dt:not([class])+dd,.consul-upstream-instance-list td.tags li>.detail dl:not([class]) dd+dt:not([class])+dd,.consul-upstream-instance-list td.tags+dl:not(:first-of-type),.consul-upstream-instance-list td.tags:not([class]) dl dd+dt:not([class])+dd,.consul-upstream-instance-list td.tags:not([class]) li>.detail dl dd+dt:not([class])+dd,.list-collection>ul>li:not(:first-child)>.detail .consul-bucket-list+dl:not(:first-of-type),.list-collection>ul>li:not(:first-child)>.detail .consul-exposed-path-list>ul>li>.detail dl:not([class]) dd+dt:not([class])+dd,.list-collection>ul>li:not(:first-child)>.detail .consul-instance-checks+dl:not(:first-of-type),.list-collection>ul>li:not(:first-child)>.detail .consul-lock-session-list dl+dl:not(:first-of-type),.list-collection>ul>li:not(:first-child)>.detail .consul-lock-session-list ul>li:not(:first-child)>.detail dl:not([class]) dd+dt:not([class])+dd,.list-collection>ul>li:not(:first-child)>.detail .consul-upstream-instance-list dl+dl:not(:first-of-type),.list-collection>ul>li:not(:first-child)>.detail .consul-upstream-instance-list dl.local-bind-address dd+dt+dd,.list-collection>ul>li:not(:first-child)>.detail .consul-upstream-instance-list dl.local-bind-socket-path dd+dt+dd,.list-collection>ul>li:not(:first-child)>.detail .consul-upstream-instance-list li>.detail dl:not([class]) dd+dt:not([class])+dd,.list-collection>ul>li:not(:first-child)>.detail .tag-list+dl:not(:first-of-type),.list-collection>ul>li:not(:first-child)>.detail dl .consul-bucket-list:not([class]) dd+dt:not([class])+dd,.list-collection>ul>li:not(:first-child)>.detail dl .consul-instance-checks:not([class]) dd+dt:not([class])+dd,.list-collection>ul>li:not(:first-child)>.detail dl .consul-lock-session-list dl:not([class]) dd+dt:not([class])+dd,.list-collection>ul>li:not(:first-child)>.detail dl .consul-upstream-instance-list dl:not([class]) dd+dt:not([class])+dd,.list-collection>ul>li:not(:first-child)>.detail dl .tag-list:not([class]) dd+dt:not([class])+dd,.list-collection>ul>li:not(:first-child)>.detail dl dd+dt,.list-collection>ul>li:not(:first-child)>.detail dl section[data-route="dc.show.license"] .validity dl:not([class]) dd+dt:not([class])+dd,.list-collection>ul>li:not(:first-child)>.detail dl section[data-route="dc.show.serverstatus"] .redundancy-zones section header dl:not([class]) dd+dt:not([class])+dd,.list-collection>ul>li:not(:first-child)>.detail dl td.tags:not([class]) dd+dt:not([class])+dd,.list-collection>ul>li:not(:first-child)>.detail dl+.consul-bucket-list:not(:first-of-type),.list-collection>ul>li:not(:first-child)>.detail dl+.consul-instance-checks:not(:first-of-type),.list-collection>ul>li:not(:first-child)>.detail dl+.tag-list:not(:first-of-type),.list-collection>ul>li:not(:first-child)>.detail dl+dl:not(:first-of-type),.list-collection>ul>li:not(:first-child)>.detail dl+td.tags:not(:first-of-type),.list-collection>ul>li:not(:first-child)>.detail dl:not([class]) .consul-bucket-list dd+dt:not([class])+dd,.list-collection>ul>li:not(:first-child)>.detail dl:not([class]) .consul-instance-checks dd+dt:not([class])+dd,.list-collection>ul>li:not(:first-child)>.detail dl:not([class]) .consul-lock-session-list dl dd+dt:not([class])+dd,.list-collection>ul>li:not(:first-child)>.detail dl:not([class]) .consul-upstream-instance-list dl dd+dt:not([class])+dd,.list-collection>ul>li:not(:first-child)>.detail dl:not([class]) .tag-list dd+dt:not([class])+dd,.list-collection>ul>li:not(:first-child)>.detail dl:not([class]) dd+dt:not([class])+dd,.list-collection>ul>li:not(:first-child)>.detail dl:not([class]) section[data-route="dc.show.license"] .validity dl dd+dt:not([class])+dd,.list-collection>ul>li:not(:first-child)>.detail dl:not([class]) section[data-route="dc.show.serverstatus"] .redundancy-zones section header dl dd+dt:not([class])+dd,.list-collection>ul>li:not(:first-child)>.detail dl:not([class]) td.tags dd+dt:not([class])+dd,.list-collection>ul>li:not(:first-child)>.detail section[data-route="dc.show.license"] .validity dl+dl:not(:first-of-type),.list-collection>ul>li:not(:first-child)>.detail section[data-route="dc.show.serverstatus"] .redundancy-zones section header dl+dl:not(:first-of-type),.list-collection>ul>li:not(:first-child)>.detail td.tags+dl:not(:first-of-type),.tag-list .consul-bucket-list:not([class]) dd+dt:not([class])+dd,.tag-list .consul-exposed-path-list>ul>li>.detail dl:not([class]) dd+dt:not([class])+dd,.tag-list .consul-instance-checks:not([class]) dd+dt:not([class])+dd,.tag-list .consul-lock-session-list dl:not([class]) dd+dt:not([class])+dd,.tag-list .consul-lock-session-list ul>li:not(:first-child)>.detail dl:not([class]) dd+dt:not([class])+dd,.tag-list .consul-upstream-instance-list dl.local-bind-address dd+dt+dd,.tag-list .consul-upstream-instance-list dl.local-bind-socket-path dd+dt+dd,.tag-list .consul-upstream-instance-list dl:not([class]) dd+dt:not([class])+dd,.tag-list .consul-upstream-instance-list li>.detail dl:not([class]) dd+dt:not([class])+dd,.tag-list .list-collection>ul>li:not(:first-child)>.detail dl:not([class]) dd+dt:not([class])+dd,.tag-list dd+dt,.tag-list section[data-route="dc.show.license"] .validity dl:not([class]) dd+dt:not([class])+dd,.tag-list section[data-route="dc.show.serverstatus"] .redundancy-zones section header dl:not([class]) dd+dt:not([class])+dd,.tag-list td.tags:not([class]) dd+dt:not([class])+dd,.tag-list+.consul-bucket-list:not(:first-of-type),.tag-list+.consul-instance-checks:not(:first-of-type),.tag-list+.tag-list:not(:first-of-type),.tag-list+td.tags:not(:first-of-type),.tag-list:not([class]) .consul-bucket-list dd+dt:not([class])+dd,.tag-list:not([class]) .consul-exposed-path-list>ul>li>.detail dl dd+dt:not([class])+dd,.tag-list:not([class]) .consul-instance-checks dd+dt:not([class])+dd,.tag-list:not([class]) .consul-lock-session-list dl dd+dt:not([class])+dd,.tag-list:not([class]) .consul-lock-session-list ul>li:not(:first-child)>.detail dl dd+dt:not([class])+dd,.tag-list:not([class]) .consul-upstream-instance-list dl dd+dt:not([class])+dd,.tag-list:not([class]) .consul-upstream-instance-list li>.detail dl dd+dt:not([class])+dd,.tag-list:not([class]) .list-collection>ul>li:not(:first-child)>.detail dl dd+dt:not([class])+dd,.tag-list:not([class]) dd+dt:not([class])+dd,.tag-list:not([class]) section[data-route="dc.show.license"] .validity dl dd+dt:not([class])+dd,.tag-list:not([class]) section[data-route="dc.show.serverstatus"] .redundancy-zones section header dl dd+dt:not([class])+dd,.tag-list:not([class]) td.tags dd+dt:not([class])+dd,section[data-route="dc.show.license"] .validity .consul-bucket-list+dl:not(:first-of-type),section[data-route="dc.show.license"] .validity .consul-exposed-path-list>ul>li>.detail dl dl:not([class]) dd+dt:not([class])+dd,section[data-route="dc.show.license"] .validity .consul-exposed-path-list>ul>li>.detail dl+dl:not(:first-of-type),section[data-route="dc.show.license"] .validity .consul-exposed-path-list>ul>li>.detail dl:not([class]) dl dd+dt:not([class])+dd,section[data-route="dc.show.license"] .validity .consul-instance-checks+dl:not(:first-of-type),section[data-route="dc.show.license"] .validity .consul-lock-session-list dl ul>li:not(:first-child)>.detail dl:not([class]) dd+dt:not([class])+dd,section[data-route="dc.show.license"] .validity .consul-lock-session-list dl+dl:not(:first-of-type),section[data-route="dc.show.license"] .validity .consul-lock-session-list dl:not([class]) ul>li:not(:first-child)>.detail dl dd+dt:not([class])+dd,section[data-route="dc.show.license"] .validity .consul-lock-session-list ul>li:not(:first-child)>.detail dl dl:not([class]) dd+dt:not([class])+dd,section[data-route="dc.show.license"] .validity .consul-lock-session-list ul>li:not(:first-child)>.detail dl+dl:not(:first-of-type),section[data-route="dc.show.license"] .validity .consul-lock-session-list ul>li:not(:first-child)>.detail dl:not([class]) dl dd+dt:not([class])+dd,section[data-route="dc.show.license"] .validity .consul-upstream-instance-list dl li>.detail dl:not([class]) dd+dt:not([class])+dd,section[data-route="dc.show.license"] .validity .consul-upstream-instance-list dl+dl:not(:first-of-type),section[data-route="dc.show.license"] .validity .consul-upstream-instance-list dl.local-bind-address dl dd+dt+dd,section[data-route="dc.show.license"] .validity .consul-upstream-instance-list dl.local-bind-socket-path dl dd+dt+dd,section[data-route="dc.show.license"] .validity .consul-upstream-instance-list dl:not([class]) li>.detail dl dd+dt:not([class])+dd,section[data-route="dc.show.license"] .validity .consul-upstream-instance-list li>.detail dl dl:not([class]) dd+dt:not([class])+dd,section[data-route="dc.show.license"] .validity .consul-upstream-instance-list li>.detail dl+dl:not(:first-of-type),section[data-route="dc.show.license"] .validity .consul-upstream-instance-list li>.detail dl:not([class]) dl dd+dt:not([class])+dd,section[data-route="dc.show.license"] .validity .list-collection>ul>li:not(:first-child)>.detail dl dl:not([class]) dd+dt:not([class])+dd,section[data-route="dc.show.license"] .validity .list-collection>ul>li:not(:first-child)>.detail dl+dl:not(:first-of-type),section[data-route="dc.show.license"] .validity .list-collection>ul>li:not(:first-child)>.detail dl:not([class]) dl dd+dt:not([class])+dd,section[data-route="dc.show.license"] .validity .tag-list dl:not([class]) dd+dt:not([class])+dd,section[data-route="dc.show.license"] .validity .tag-list+dl:not(:first-of-type),section[data-route="dc.show.license"] .validity .tag-list:not([class]) dl dd+dt:not([class])+dd,section[data-route="dc.show.license"] .validity dl .consul-exposed-path-list>ul>li>.detail dl:not([class]) dd+dt:not([class])+dd,section[data-route="dc.show.license"] .validity dl .consul-lock-session-list ul>li:not(:first-child)>.detail dl:not([class]) dd+dt:not([class])+dd,section[data-route="dc.show.license"] .validity dl .consul-upstream-instance-list dl.local-bind-address dd+dt+dd,section[data-route="dc.show.license"] .validity dl .consul-upstream-instance-list dl.local-bind-socket-path dd+dt+dd,section[data-route="dc.show.license"] .validity dl .consul-upstream-instance-list li>.detail dl:not([class]) dd+dt:not([class])+dd,section[data-route="dc.show.license"] .validity dl .list-collection>ul>li:not(:first-child)>.detail dl:not([class]) dd+dt:not([class])+dd,section[data-route="dc.show.license"] .validity dl .tag-list:not([class]) dd+dt:not([class])+dd,section[data-route="dc.show.license"] .validity dl dd+dt,section[data-route="dc.show.license"] .validity dl td.tags:not([class]) dd+dt:not([class])+dd,section[data-route="dc.show.license"] .validity dl+.consul-bucket-list:not(:first-of-type),section[data-route="dc.show.license"] .validity dl+.consul-instance-checks:not(:first-of-type),section[data-route="dc.show.license"] .validity dl+.tag-list:not(:first-of-type),section[data-route="dc.show.license"] .validity dl+dl:not(:first-of-type),section[data-route="dc.show.license"] .validity dl+td.tags:not(:first-of-type),section[data-route="dc.show.license"] .validity dl:not([class]) .consul-exposed-path-list>ul>li>.detail dl dd+dt:not([class])+dd,section[data-route="dc.show.license"] .validity dl:not([class]) .consul-lock-session-list ul>li:not(:first-child)>.detail dl dd+dt:not([class])+dd,section[data-route="dc.show.license"] .validity dl:not([class]) .consul-upstream-instance-list li>.detail dl dd+dt:not([class])+dd,section[data-route="dc.show.license"] .validity dl:not([class]) .list-collection>ul>li:not(:first-child)>.detail dl dd+dt:not([class])+dd,section[data-route="dc.show.license"] .validity dl:not([class]) .tag-list dd+dt:not([class])+dd,section[data-route="dc.show.license"] .validity dl:not([class]) dd+dt:not([class])+dd,section[data-route="dc.show.license"] .validity dl:not([class]) td.tags dd+dt:not([class])+dd,section[data-route="dc.show.license"] .validity td.tags dl:not([class]) dd+dt:not([class])+dd,section[data-route="dc.show.license"] .validity td.tags+dl:not(:first-of-type),section[data-route="dc.show.license"] .validity td.tags:not([class]) dl dd+dt:not([class])+dd,section[data-route="dc.show.serverstatus"] .redundancy-zones section header .consul-bucket-list+dl:not(:first-of-type),section[data-route="dc.show.serverstatus"] .redundancy-zones section header .consul-exposed-path-list>ul>li>.detail dl dl:not([class]) dd+dt:not([class])+dd,section[data-route="dc.show.serverstatus"] .redundancy-zones section header .consul-exposed-path-list>ul>li>.detail dl+dl:not(:first-of-type),section[data-route="dc.show.serverstatus"] .redundancy-zones section header .consul-exposed-path-list>ul>li>.detail dl:not([class]) dl dd+dt:not([class])+dd,section[data-route="dc.show.serverstatus"] .redundancy-zones section header .consul-instance-checks+dl:not(:first-of-type),section[data-route="dc.show.serverstatus"] .redundancy-zones section header .consul-lock-session-list dl ul>li:not(:first-child)>.detail dl:not([class]) dd+dt:not([class])+dd,section[data-route="dc.show.serverstatus"] .redundancy-zones section header .consul-lock-session-list dl+dl:not(:first-of-type),section[data-route="dc.show.serverstatus"] .redundancy-zones section header .consul-lock-session-list dl:not([class]) ul>li:not(:first-child)>.detail dl dd+dt:not([class])+dd,section[data-route="dc.show.serverstatus"] .redundancy-zones section header .consul-lock-session-list ul>li:not(:first-child)>.detail dl dl:not([class]) dd+dt:not([class])+dd,section[data-route="dc.show.serverstatus"] .redundancy-zones section header .consul-lock-session-list ul>li:not(:first-child)>.detail dl+dl:not(:first-of-type),section[data-route="dc.show.serverstatus"] .redundancy-zones section header .consul-lock-session-list ul>li:not(:first-child)>.detail dl:not([class]) dl dd+dt:not([class])+dd,section[data-route="dc.show.serverstatus"] .redundancy-zones section header .consul-upstream-instance-list dl li>.detail dl:not([class]) dd+dt:not([class])+dd,section[data-route="dc.show.serverstatus"] .redundancy-zones section header .consul-upstream-instance-list dl+dl:not(:first-of-type),section[data-route="dc.show.serverstatus"] .redundancy-zones section header .consul-upstream-instance-list dl.local-bind-address dl dd+dt+dd,section[data-route="dc.show.serverstatus"] .redundancy-zones section header .consul-upstream-instance-list dl.local-bind-socket-path dl dd+dt+dd,section[data-route="dc.show.serverstatus"] .redundancy-zones section header .consul-upstream-instance-list dl:not([class]) li>.detail dl dd+dt:not([class])+dd,section[data-route="dc.show.serverstatus"] .redundancy-zones section header .consul-upstream-instance-list li>.detail dl dl:not([class]) dd+dt:not([class])+dd,section[data-route="dc.show.serverstatus"] .redundancy-zones section header .consul-upstream-instance-list li>.detail dl+dl:not(:first-of-type),section[data-route="dc.show.serverstatus"] .redundancy-zones section header .consul-upstream-instance-list li>.detail dl:not([class]) dl dd+dt:not([class])+dd,section[data-route="dc.show.serverstatus"] .redundancy-zones section header .list-collection>ul>li:not(:first-child)>.detail dl dl:not([class]) dd+dt:not([class])+dd,section[data-route="dc.show.serverstatus"] .redundancy-zones section header .list-collection>ul>li:not(:first-child)>.detail dl+dl:not(:first-of-type),section[data-route="dc.show.serverstatus"] .redundancy-zones section header .list-collection>ul>li:not(:first-child)>.detail dl:not([class]) dl dd+dt:not([class])+dd,section[data-route="dc.show.serverstatus"] .redundancy-zones section header .tag-list dl:not([class]) dd+dt:not([class])+dd,section[data-route="dc.show.serverstatus"] .redundancy-zones section header .tag-list+dl:not(:first-of-type),section[data-route="dc.show.serverstatus"] .redundancy-zones section header .tag-list:not([class]) dl dd+dt:not([class])+dd,section[data-route="dc.show.serverstatus"] .redundancy-zones section header dl .consul-exposed-path-list>ul>li>.detail dl:not([class]) dd+dt:not([class])+dd,section[data-route="dc.show.serverstatus"] .redundancy-zones section header dl .consul-lock-session-list ul>li:not(:first-child)>.detail dl:not([class]) dd+dt:not([class])+dd,section[data-route="dc.show.serverstatus"] .redundancy-zones section header dl .consul-upstream-instance-list dl.local-bind-address dd+dt+dd,section[data-route="dc.show.serverstatus"] .redundancy-zones section header dl .consul-upstream-instance-list dl.local-bind-socket-path dd+dt+dd,section[data-route="dc.show.serverstatus"] .redundancy-zones section header dl .consul-upstream-instance-list li>.detail dl:not([class]) dd+dt:not([class])+dd,section[data-route="dc.show.serverstatus"] .redundancy-zones section header dl .list-collection>ul>li:not(:first-child)>.detail dl:not([class]) dd+dt:not([class])+dd,section[data-route="dc.show.serverstatus"] .redundancy-zones section header dl .tag-list:not([class]) dd+dt:not([class])+dd,section[data-route="dc.show.serverstatus"] .redundancy-zones section header dl dd+dt,section[data-route="dc.show.serverstatus"] .redundancy-zones section header dl td.tags:not([class]) dd+dt:not([class])+dd,section[data-route="dc.show.serverstatus"] .redundancy-zones section header dl+.consul-bucket-list:not(:first-of-type),section[data-route="dc.show.serverstatus"] .redundancy-zones section header dl+.consul-instance-checks:not(:first-of-type),section[data-route="dc.show.serverstatus"] .redundancy-zones section header dl+.tag-list:not(:first-of-type),section[data-route="dc.show.serverstatus"] .redundancy-zones section header dl+dl:not(:first-of-type),section[data-route="dc.show.serverstatus"] .redundancy-zones section header dl+td.tags:not(:first-of-type),section[data-route="dc.show.serverstatus"] .redundancy-zones section header dl:not([class]) .consul-exposed-path-list>ul>li>.detail dl dd+dt:not([class])+dd,section[data-route="dc.show.serverstatus"] .redundancy-zones section header dl:not([class]) .consul-lock-session-list ul>li:not(:first-child)>.detail dl dd+dt:not([class])+dd,section[data-route="dc.show.serverstatus"] .redundancy-zones section header dl:not([class]) .consul-upstream-instance-list li>.detail dl dd+dt:not([class])+dd,section[data-route="dc.show.serverstatus"] .redundancy-zones section header dl:not([class]) .list-collection>ul>li:not(:first-child)>.detail dl dd+dt:not([class])+dd,section[data-route="dc.show.serverstatus"] .redundancy-zones section header dl:not([class]) .tag-list dd+dt:not([class])+dd,section[data-route="dc.show.serverstatus"] .redundancy-zones section header dl:not([class]) dd+dt:not([class])+dd,section[data-route="dc.show.serverstatus"] .redundancy-zones section header dl:not([class]) td.tags dd+dt:not([class])+dd,section[data-route="dc.show.serverstatus"] .redundancy-zones section header td.tags dl:not([class]) dd+dt:not([class])+dd,section[data-route="dc.show.serverstatus"] .redundancy-zones section header td.tags+dl:not(:first-of-type),section[data-route="dc.show.serverstatus"] .redundancy-zones section header td.tags:not([class]) dl dd+dt:not([class])+dd,section[data-route="dc.show.serverstatus"] .redundancy-zones section[data-route="dc.show.license"] .validity header dl+dl:not(:first-of-type),section[data-route="dc.show.serverstatus"] .redundancy-zones section[data-route="dc.show.license"] header .validity dl+dl:not(:first-of-type),td.tags .consul-bucket-list:not([class]) dd+dt:not([class])+dd,td.tags .consul-exposed-path-list>ul>li>.detail dl:not([class]) dd+dt:not([class])+dd,td.tags .consul-instance-checks:not([class]) dd+dt:not([class])+dd,td.tags .consul-lock-session-list dl:not([class]) dd+dt:not([class])+dd,td.tags .consul-lock-session-list ul>li:not(:first-child)>.detail dl:not([class]) dd+dt:not([class])+dd,td.tags .consul-upstream-instance-list dl.local-bind-address dd+dt+dd,td.tags .consul-upstream-instance-list dl.local-bind-socket-path dd+dt+dd,td.tags .consul-upstream-instance-list dl:not([class]) dd+dt:not([class])+dd,td.tags .consul-upstream-instance-list li>.detail dl:not([class]) dd+dt:not([class])+dd,td.tags .list-collection>ul>li:not(:first-child)>.detail dl:not([class]) dd+dt:not([class])+dd,td.tags .tag-list:not([class]) dd+dt:not([class])+dd,td.tags dd+dt,td.tags section[data-route="dc.show.license"] .validity dl:not([class]) dd+dt:not([class])+dd,td.tags section[data-route="dc.show.serverstatus"] .redundancy-zones section header dl:not([class]) dd+dt:not([class])+dd,td.tags+.consul-bucket-list:not(:first-of-type),td.tags+.consul-instance-checks:not(:first-of-type),td.tags+.tag-list:not(:first-of-type),td.tags+td.tags:not(:first-of-type),td.tags:not([class]) .consul-bucket-list dd+dt:not([class])+dd,td.tags:not([class]) .consul-exposed-path-list>ul>li>.detail dl dd+dt:not([class])+dd,td.tags:not([class]) .consul-instance-checks dd+dt:not([class])+dd,td.tags:not([class]) .consul-lock-session-list dl dd+dt:not([class])+dd,td.tags:not([class]) .consul-lock-session-list ul>li:not(:first-child)>.detail dl dd+dt:not([class])+dd,td.tags:not([class]) .consul-upstream-instance-list dl dd+dt:not([class])+dd,td.tags:not([class]) .consul-upstream-instance-list li>.detail dl dd+dt:not([class])+dd,td.tags:not([class]) .list-collection>ul>li:not(:first-child)>.detail dl dd+dt:not([class])+dd,td.tags:not([class]) .tag-list dd+dt:not([class])+dd,td.tags:not([class]) dd+dt:not([class])+dd,td.tags:not([class]) section[data-route="dc.show.license"] .validity dl dd+dt:not([class])+dd,td.tags:not([class]) section[data-route="dc.show.serverstatus"] .redundancy-zones section header dl dd+dt:not([class])+dd{margin-left:var(--horizontal-kv-list-separator-width)}.consul-bucket-list dt+dd,.consul-exposed-path-list>ul>li>.detail dl dt+dd,.consul-instance-checks dt+dd,.consul-lock-session-list dl dt+dd,.consul-lock-session-list ul>li:not(:first-child)>.detail dl dt+dd,.consul-upstream-instance-list dl dt+dd,.consul-upstream-instance-list li>.detail dl dt+dd,.list-collection>ul>li:not(:first-child)>.detail dl dt+dd,.tag-list dt+dd,section[data-route="dc.show.license"] .validity dl dt+dd,section[data-route="dc.show.serverstatus"] .redundancy-zones section header dl dt+dd,td.tags dt+dd{margin-left:4px}.consul-bucket-list:not([class]) dt:not([class])+dd,.consul-exposed-path-list>ul>li>.detail dl:not([class]) dt:not([class])+dd,.consul-instance-checks:not([class]) dt:not([class])+dd,.consul-lock-session-list dl:not([class]) dt:not([class])+dd,.consul-upstream-instance-list dl.local-bind-address dt+dd,.consul-upstream-instance-list dl.local-bind-socket-path dt+dd,.consul-upstream-instance-list dl:not([class]) dt:not([class])+dd,.list-collection>ul>li:not(:first-child)>.detail dl:not([class]) dt:not([class])+dd,.tag-list:not([class]) dt:not([class])+dd,section[data-route="dc.show.license"] .validity dl:not([class]) dt:not([class])+dd,section[data-route="dc.show.serverstatus"] .redundancy-zones section header dl:not([class]) dt:not([class])+dd,td.tags:not([class]) dt:not([class])+dd{margin-left:0!important}.consul-lock-session-list .checks dd,.discovery-chain .resolver-card ol,.tag-list dd,td.tags dd{display:flex}.consul-lock-session-list .checks dd>:not(:last-child)::after,.discovery-chain .resolver-card ol>:not(:last-child)::after,.tag-list dd>:not(:last-child)::after,td.tags dd>:not(:last-child)::after{display:inline;content:var(--csv-list-separator);vertical-align:initial;margin-right:.3em}.tag-list dt::before,td.tags dt::before{color:inherit;color:rgb(var(--tone-gray-500))}.consul-exposed-path-list>ul>li>.detail dl>dt>*,.consul-lock-session-list ul>li:not(:first-child)>.detail dl>dt>*,.consul-upstream-instance-list li>.detail dl>dt>*,.list-collection>ul>li:not(:first-child)>.detail dl>dt>*{display:none}.consul-exposed-path-list>ul>li>.detail dl.passing dt::before,.consul-exposed-path-list>ul>li>.header .passing dd::before,.consul-lock-session-list ul>li:not(:first-child)>.detail dl.passing dt::before,.consul-lock-session-list ul>li:not(:first-child)>.header .passing dd::before,.consul-upstream-instance-list li>.detail dl.passing dt::before,.consul-upstream-instance-list li>.header .passing dd::before,.list-collection>ul>li:not(:first-child)>.detail dl.passing dt::before,.list-collection>ul>li:not(:first-child)>.header .passing dd::before{color:rgb(var(--tone-green-500))}.consul-exposed-path-list>ul>li>.detail dl.warning dt::before,.consul-exposed-path-list>ul>li>.header .warning dd::before,.consul-lock-session-list ul>li:not(:first-child)>.detail dl.warning dt::before,.consul-lock-session-list ul>li:not(:first-child)>.header .warning dd::before,.consul-upstream-instance-list li>.detail dl.warning dt::before,.consul-upstream-instance-list li>.header .warning dd::before,.list-collection>ul>li:not(:first-child)>.detail dl.warning dt::before,.list-collection>ul>li:not(:first-child)>.header .warning dd::before{color:rgb(var(--tone-orange-500))}.consul-exposed-path-list>ul>li>.detail dl.critical dt::before,.consul-exposed-path-list>ul>li>.header .critical dd::before,.consul-lock-session-list ul>li:not(:first-child)>.detail dl.critical dt::before,.consul-lock-session-list ul>li:not(:first-child)>.header .critical dd::before,.consul-upstream-instance-list li>.detail dl.critical dt::before,.consul-upstream-instance-list li>.header .critical dd::before,.list-collection>ul>li:not(:first-child)>.detail dl.critical dt::before,.list-collection>ul>li:not(:first-child)>.header .critical dd::before{color:rgb(var(--tone-red-500))}.consul-exposed-path-list>ul>li>.detail dl.empty dt::before,.consul-exposed-path-list>ul>li>.header .empty dd::before,.consul-lock-session-list ul>li:not(:first-child)>.detail dl.empty dt::before,.consul-lock-session-list ul>li:not(:first-child)>.header .empty dd::before,.consul-upstream-instance-list li>.detail dl.empty dt::before,.consul-upstream-instance-list li>.header .empty dd::before,.list-collection>ul>li:not(:first-child)>.detail dl.empty dt::before,.list-collection>ul>li:not(:first-child)>.header .empty dd::before{color:rgb(var(--tone-gray-500))}.consul-exposed-path-list>ul>li>.header [rel=me] dd::before,.consul-lock-session-list ul>li:not(:first-child)>.header [rel=me] dd::before,.consul-upstream-instance-list li>.header [rel=me] dd::before,.list-collection>ul>li:not(:first-child)>.header [rel=me] dd::before{color:rgb(var(--tone-blue-500))}.app-view>div form:not(.filter-bar) [role=radiogroup] label>em>code,.modal-dialog [role=document] .type-password>em>code,.modal-dialog [role=document] .type-select>em>code,.modal-dialog [role=document] .type-text>em>code,.modal-dialog [role=document] [role=radiogroup] label>em>code,.modal-dialog [role=document] form button+em>code,.modal-dialog [role=document] p code,.oidc-select label>em>code,.type-toggle>em>code,main .type-password>em>code,main .type-select>em>code,main .type-text>em>code,main form button+em>code,main p code{border:1px solid;color:rgb(var(--tone-brand-600));background-color:rgb(var(--tone-gray-050));border-color:rgb(var(--tone-gray-200));display:inline-block;padding:0 4px}[data-tippy-root]{max-width:calc(100vw - 10px)}.tippy-box{outline:0;transition-property:transform,visibility,opacity;background-color:rgb(var(--tone-gray-000));border-radius:var(--decor-radius-100)}[data-animation=fade][data-state=hidden].tippy-box{opacity:0}[data-inertia][data-state=visible].tippy-box{transition-timing-function:cubic-bezier(.54,1.5,.38,1.11)}.tippy-box .tippy-arrow{--size:5px}.tippy-box .tippy-arrow::before{content:"";position:absolute}[data-placement^=top].tippy-box>.tippy-arrow{bottom:0}[data-placement^=top].tippy-box>.tippy-arrow::before{left:0;bottom:calc(0px - var(--size));transform-origin:center top}[data-placement^=bottom].tippy-box>.tippy-arrow{top:0}[data-placement^=bottom].tippy-box>.tippy-arrow::before{left:0;top:calc(0px - var(--size));transform-origin:center bottom}[data-placement^=left].tippy-box>.tippy-arrow{right:0}[data-placement^=left].tippy-box>.tippy-arrow::before{right:calc(0px - var(--size));transform-origin:center left}[data-placement^=right].tippy-box>.tippy-arrow{left:0}[data-placement^=right].tippy-box>.tippy-arrow::before{left:calc(0px - var(--size));transform-origin:center right}[data-theme~=square-tail] .tippy-arrow{--size:18px;left:calc(0px - (var(--size)/ 2))!important}[data-theme~=square-tail] .tippy-arrow::before{background-color:rgb(var(--tone-gray-000));width:calc(1px + var(--size));height:calc(1px + var(--size));border:var(--decor-border-100);border-color:rgb(var(--tone-gray-300))}[data-theme~=square-tail] .tippy-arrow::after{position:absolute;left:1px}[data-theme~=square-tail][data-placement^=top]{bottom:-10px}[data-theme~=square-tail][data-placement^=top] .informed-action{border-bottom-left-radius:0!important}[data-theme~=square-tail][data-placement^=top] .tippy-arrow::before{border-bottom-left-radius:var(--decor-radius-200);border-bottom-right-radius:var(--decor-radius-200);border-top:0!important}[data-theme~=square-tail][data-placement^=top] .tippy-arrow::after{bottom:calc(0px - var(--size))}[data-theme~=square-tail][data-placement^=bottom]{top:-10px}[data-theme~=square-tail][data-placement^=bottom] .informed-action{border-top-left-radius:0!important}[data-theme~=square-tail][data-placement^=bottom] .tippy-arrow::before{border-top-left-radius:var(--decor-radius-200);border-top-right-radius:var(--decor-radius-200);border-bottom:0!important}[data-theme~=square-tail][data-placement^=bottom] .tippy-arrow::after{top:calc(0px - var(--size))}.tippy-box[data-theme~=tooltip] .tippy-content{padding:12px;max-width:224px;position:relative;z-index:1}.tippy-box[data-theme~=tooltip]{background-color:rgb(var(--tone-gray-700));color:rgb(var(--tone-gray-000))}.tippy-box[data-theme~=tooltip] .tippy-arrow{--size:5px;color:rgb(var(--tone-gray-700));width:calc(var(--size) * 2);height:calc(var(--size) * 2)}.tippy-box[data-theme~=tooltip] .tippy-arrow::before{border-color:var(--transparent);border-style:solid}.tippy-box[data-theme~=tooltip][data-placement^=top]>.tippy-arrow::before{border-width:var(--size) var(--size) 0;border-top-color:initial}.tippy-box[data-theme~=tooltip][data-placement^=bottom]>.tippy-arrow::before{border-width:0 var(--size) var(--size);border-bottom-color:initial}.tippy-box[data-theme~=tooltip][data-placement^=left]>.tippy-arrow::before{border-width:var(--size) 0 var(--size) var(--size);border-left-color:initial}.tippy-box[data-theme~=tooltip][data-placement^=right]>.tippy-arrow::before{border-width:var(--size) var(--size) var(--size) 0;border-right-color:initial}.consul-intention-list .notice.allow,.consul-intention-list .notice.deny,.consul-intention-list .notice.permissions,.notice.error,.notice.highlight,.notice.info,.notice.policy-management,.notice.success,.notice.warning{border-radius:var(--decor-radius-100);border:var(--decor-border-100);color:rgb(var(--tone-gray-999))}.consul-intention-list .notice.allow footer *,.consul-intention-list .notice.deny footer *,.consul-intention-list .notice.permissions footer *,.notice.error footer *,.notice.highlight footer *,.notice.info footer *,.notice.policy-management footer *,.notice.success footer *,.notice.warning footer *{font-weight:var(--typo-weight-bold)}.consul-intention-list .notice.allow,.notice.success{background-color:rgb(var(--tone-green-050));border-color:rgb(var(--tone-green-500))}.consul-intention-list .notice.allow header *,.notice.success header *{color:rgb(var(--tone-green-800))}.consul-intention-list .notice.permissions,.notice.info{border-color:rgb(var(--tone-blue-100));background-color:rgb(var(--tone-blue-010))}.notice.highlight,.notice.policy-management{background-color:rgb(var(--tone-gray-050));border-color:rgb(var(--tone-gray-300))}.consul-intention-list .notice.permissions header *,.notice.info header *{color:rgb(var(--tone-blue-700))}.notice.warning{border-color:rgb(var(--tone-yellow-100));background-color:rgb(var(--tone-yellow-050))}.notice.warning header *{color:rgb(var(--tone-yellow-800))}.consul-intention-list .notice.deny,.notice.error{background-color:rgb(var(--tone-red-050));border-color:rgb(var(--tone-red-500))}.consul-intention-list .notice.deny header *,.notice.error header *{color:rgb(var(--tone-red-500))}.consul-health-check-list .passing.health-check-output::before,.consul-intention-list .notice.allow::before,.notice.success::before{color:rgb(var(--tone-green-500))}.consul-intention-list .notice.permissions::before,.notice.info::before{color:rgb(var(--tone-blue-500))}.notice.highlight::before,.notice.policy-management::before{color:rgb(var(--tone-yellow-500))}.notice.warning::before{color:rgb(var(--tone-orange-500))}.consul-intention-list .notice.deny::before,.notice.error::before{color:rgb(var(--tone-red-500))}.consul-intention-list .notice.allow header,.consul-intention-list .notice.deny header,.consul-intention-list .notice.permissions header,.notice.error header,.notice.highlight header,.notice.info header,.notice.policy-management header,.notice.success header,.notice.warning header{margin-bottom:.1rem}.consul-intention-list .notice.allow header>*,.consul-intention-list .notice.deny header>*,.consul-intention-list .notice.permissions header>*,.notice.error header>*,.notice.highlight header>*,.notice.info header>*,.notice.policy-management header>*,.notice.success header>*,.notice.warning header>*{margin-bottom:0}.consul-intention-list .notice.allow p,.consul-intention-list .notice.deny p,.consul-intention-list .notice.permissions p,.notice.error p,.notice.highlight p,.notice.info p,.notice.policy-management p,.notice.success p,.notice.warning p{margin-bottom:.3rem;line-height:1.4}.consul-intention-list .notice.allow,.consul-intention-list .notice.deny,.consul-intention-list .notice.permissions,.notice.error,.notice.highlight,.notice.info,.notice.policy-management,.notice.success,.notice.warning{position:relative;padding:.8rem;padding-left:calc(.8rem + 1.4rem);margin:1em 0}.consul-intention-list .notice.allow::before,.consul-intention-list .notice.deny::before,.consul-intention-list .notice.permissions::before,.notice.error::before,.notice.highlight::before,.notice.info::before,.notice.policy-management::before,.notice.success::before,.notice.warning::before{position:absolute;top:.8rem;left:.6rem;font-size:1rem}.notice.crd::before{-webkit-mask-image:none;mask-image:none;background-color:transparent}.warning.modal-dialog header{background-color:rgb(var(--tone-yellow-050));border-color:rgb(var(--tone-yellow-500));color:rgb(var(--tone-yellow-800))}.warning.modal-dialog header>:not(label){font-size:var(--typo-size-500);font-weight:var(--typo-weight-semibold)}.warning.modal-dialog header::before{color:rgb(var(--tone-yellow-500));float:left;margin-top:2px;margin-right:3px}.modal-dialog>div:first-child{background-color:rgb(var(--tone-gray-000) /90%)}.modal-dialog [role=document]{box-shadow:var(--decor-elevation-800);background-color:rgb(var(--tone-gray-000))}.modal-dialog [role=document]>footer,.modal-dialog [role=document]>header,.modal-dialog-body{border-color:rgb(var(--tone-gray-300))}.modal-dialog-body{border-style:solid;border-left-width:1px;border-right-width:1px}.modal-dialog [role=document]>header button::before{margin-left:-7px;margin-top:-3px}.modal-layer{height:0}.modal-dialog [role=document] table{height:150px!important}.modal-dialog [role=document] tbody{max-height:100px}.modal-dialog table{min-height:149px}.modal-dialog,.modal-dialog>div:first-child{position:fixed;top:0;right:0;bottom:0;left:0}.modal-dialog{z-index:500;display:flex;align-items:center;justify-content:center;height:100%}.role-selector [name="role[state]"],.role-selector [name="role[state]"]+*,[aria-hidden=true].modal-dialog{display:none}.modal-dialog [role=document]{margin:auto;z-index:2;max-width:855px;position:relative}.modal-dialog [role=document]>*{padding-left:15px;padding-right:15px}.modal-dialog [role=document]>div{overflow-y:auto;max-height:80vh;padding:20px 23px}.modal-dialog [role=document]>footer,.modal-dialog [role=document]>header{border-width:1px;padding-top:12px;padding-bottom:10px}.modal-dialog [role=document]>header{position:relative}.modal-dialog [role=document]>header button{cursor:pointer;border:var(--decor-border-100);background-color:rgb(var(--tone-gray-050));border-color:rgb(var(--tone-gray-300));border-radius:var(--decor-radius-100);float:right;width:24px;height:24px;margin-top:-3px}.list-collection>ul{border-top:1px solid;border-color:rgb(var(--tone-gray-200))}.list-collection>button{cursor:pointer;background-color:rgb(var(--tone-gray-050));color:rgb(var(--tone-blue-500));width:100%;padding:15px}.list-collection-scroll-virtual,.list-collection>ul>li{position:relative}.list-collection-scroll-virtual{height:500px}.filter-bar{background-color:rgb(var(--tone-gray-010));border-bottom:var(--decor-border-100);border-color:rgb(var(--tone-gray-200));padding:4px 8px}.filter-bar .filters .popover-menu>[type=checkbox]:checked+label button,.filter-bar .sort .popover-menu>[type=checkbox]:checked+label button{color:rgb(var(--tone-blue-500));background-color:rgb(var(--tone-gray-100))}.filter-bar,.filter-bar>div{display:flex}.filter-bar .sort{margin-left:auto}.filter-bar .popover-select{position:relative;z-index:3}.filter-bar .popover-menu>[type=checkbox]+label button{padding-left:1.5rem!important;padding-right:1.5rem!important}.filter-bar .popover-menu [role=menuitem]{justify-content:normal!important}@media (max-width:1379px){.filter-bar,.filter-bar>div{flex-wrap:wrap}.filter-bar .search{position:relative;z-index:4;width:100%;margin-bottom:.3rem}}@media (max-width:995px){.filter-bar .filters,.filter-bar .sort{display:none}}html[data-route^="dc.acls.index"] .filter-bar{color:inherit}.freetext-filter{border:var(--decor-border-100);border-radius:var(--decor-radius-100);background-color:rgb(var(--tone-gray-000));border-color:rgb(var(--tone-gray-200));color:rgb(var(--tone-gray-400))}.freetext-filter:hover,.freetext-filter:hover *{border-color:rgb(var(--tone-gray-400))}.freetext-filter *,.freetext-filter_input::placeholder{cursor:inherit;color:inherit;border-color:inherit}.freetext-filter_input{-webkit-appearance:none;border:none}.freetext-filter_label::after{visibility:visible;--icon-name:icon-search;content:"";position:absolute;top:50%;left:50%;width:16px;height:16px;margin-left:-8px;margin-top:-8px}.freetext-filter .popover-menu{background-color:rgb(var(--tone-gray-050));color:rgb(var(--tone-gray-800));border-left:1px solid;border-color:inherit}.freetext-filter .popover-menu>[type=checkbox]:checked+label button{background-color:rgb(var(--tone-gray-200))}.freetext-filter{--height:2.2rem;display:flex;position:relative;height:var(--height);width:100%}.freetext-filter>label,.freetext-filter_input{flex-grow:1}.freetext-filter_input,.freetext-filter_label{height:100%}.freetext-filter_input{padding:8px 10px;padding-left:var(--height);min-width:12.7rem;width:100%}.freetext-filter_label{visibility:hidden;position:absolute;z-index:1;width:var(--height)}.informed-action{border-radius:var(--decor-radius-200);border:var(--decor-border-100);border-color:rgb(var(--tone-gray-300));background-color:rgb(var(--tone-gray-000));min-width:190px}.informed-action>div{border-top-left-radius:var(--decor-radius-200);border-top-right-radius:var(--decor-radius-200);cursor:default;padding:1rem}.informed-action p{color:rgb(var(--tone-gray-999))}.informed-action>ul>li>:focus,.informed-action>ul>li>:hover{background-color:rgb(var(--tone-gray-100))}.info.informed-action header{color:rgb(var(--tone-blue-700))}.info.informed-action header::before{background-color:rgb(var(--tone-blue-500));margin-right:5px}.info.informed-action>div{background-color:rgb(var(--tone-blue-010))}.dangerous.informed-action header{color:rgb(var(--tone-red-700))}.dangerous.informed-action header::before{background-color:rgb(var(--tone-red-500))}.dangerous.informed-action>div{background-color:rgb(var(--tone-red-010))}.warning.informed-action header{color:rgb(var(--tone-orange-700))}.warning.informed-action header::before{background-color:rgb(var(--tone-yellow-500));margin-right:5px}.warning.informed-action>div{background-color:rgb(var(--tone-yellow-050))}.informed-action>ul>.action>*{color:rgb(var(--tone-blue-500))}.documentation.informed-action{min-width:270px}.informed-action header::before{float:left;margin-right:5px}.informed-action>ul{list-style:none;display:flex;margin:0;padding:4px}.informed-action>ul>li{width:50%}.informed-action>ul>li>*{width:100%}.tab-nav ul{list-style-type:none;display:inline-flex;align-items:center;position:relative;padding:0;margin:0}.tab-nav li>:not(:disabled){cursor:pointer}.tab-nav{border-bottom:var(--decor-border-100)}.animatable.tab-nav ul::after,.tab-nav li>*{border-bottom:var(--decor-border-300)}.tab-nav{border-color:rgb(var(--tone-gray-200));clear:both;overflow:auto;letter-spacing:.03em}.tab-nav li>*{white-space:nowrap;transition-property:background-color,border-color;border-color:var(--transparent);color:rgb(var(--tone-gray-500));display:inline-block;padding:16px 13px}.tab-nav li:not(.selected)>:active,.tab-nav li:not(.selected)>:focus,.tab-nav li:not(.selected)>:hover{background-color:rgb(var(--tone-gray-100))}.tab-nav li:not(.selected)>:focus,.tab-nav li:not(.selected)>:hover{border-color:rgb(var(--tone-gray-300))}.animatable.tab-nav .selected a{border-color:var(--transparent)!important}.animatable.tab-nav ul::after{position:absolute;bottom:0;height:0;border-top:0;width:calc(var(--selected-width,0) * 1px);transform:translate(calc(var(--selected-left,0) * 1px),0);transition-property:transform,width}.search-bar-status{border-bottom:var(--decor-border-100);border-bottom-color:rgb(var(--tone-gray-200));padding:.5rem 0 .5rem .5rem}.search-bar-status li:not(.remove-all) button::before{color:rgb(var(--tone-gray-600));margin-top:1px;margin-right:.2rem}.search-bar-status dt::after{content:":";padding-right:.3rem}.search-bar-status>dl>dt{float:left}.search-bar-status dt{white-space:nowrap}.search-bar-status li{display:inline-flex}.search-bar-status li:not(:last-child){margin-right:.3rem;margin-bottom:.3rem}.search-bar-status li:not(.remove-all){border:var(--decor-border-100);border-color:rgb(var(--tone-gray-200));color:rgb(var(--tone-gray-600));padding:0 .2rem}.search-bar-status li:not(.remove-all) dl{display:flex}.search-bar-status li:not(.remove-all) button{cursor:pointer;padding:0}.certificate{display:flex}.certificate button.visibility{height:fit-content;padding-top:4px;margin-right:4px;cursor:pointer}.certificate code{background-color:rgb(var(--tone-gray-050));overflow-wrap:break-word;max-width:min-content;padding:0 12px}.certificate hr{border:3px dashed;background-color:rgb(var(--tone-gray-000));width:150px;margin:9px auto auto}.consul-loader circle{fill:rgb(var(--tone-brand-100));animation:loader-animation 1.5s infinite ease-in-out;transform-origin:50% 50%}.consul-loader g:nth-last-child(2) circle{animation-delay:.2s}.consul-loader g:nth-last-child(3) circle{animation-delay:.3s}.consul-loader g:nth-last-child(4) circle{animation-delay:.4s}.consul-loader g:nth-last-child(5) circle{animation-delay:.5s}@keyframes loader-animation{0%,100%{transform:scale3D(1,1,1)}33%{transform:scale3D(0,0,1)}}.consul-loader{display:flex;align-items:center;justify-content:center;height:100%;position:absolute;width:100%;top:0;margin-top:0!important}.tomography-graph .background{fill:rgb(var(--tone-gray-050))}.tomography-graph .axis{fill:none;stroke:rgb(var(--tone-gray-300));stroke-dasharray:4 4}.tomography-graph .border{fill:none;stroke:rgb(var(--tone-gray-300))}.tomography-graph .point{stroke:rgb(var(--tone-gray-400));fill:rgb(var(--tone-magenta-600))}.tomography-graph .lines rect{fill:rgb(var(--tone-magenta-600));stroke:transparent;stroke-width:5px}.tomography-graph .lines rect:hover{fill:rgb(var(--tone-gray-300));height:3px;y:-1px}.tomography-graph .tick line{stroke:rgb(var(--tone-gray-300))}.tomography-graph .tick text{font-size:var(--typo-size-600);text-anchor:start;color:rgb(var(--tone-gray-900))}.discovery-chain .resolver-card,.discovery-chain .route-card,.discovery-chain .splitter-card,.discovery-chain path{transition-duration:.1s;transition-timing-function:linear;cursor:pointer}.discovery-chain path{transition-property:stroke;fill:none;stroke:rgb(var(--tone-gray-400));stroke-width:2;vector-effect:non-scaling-stroke}#downstream-lines svg circle,#upstream-lines svg circle,.discovery-chain circle{fill:rgb(var(--tone-gray-000))}.discovery-chain .resolver-card,.discovery-chain .resolver-card a,.discovery-chain .route-card,.discovery-chain .route-card a,.discovery-chain .splitter-card,.discovery-chain .splitter-card a{color:rgb(var(--tone-gray-900))!important}.discovery-chain path:focus,.discovery-chain path:hover{stroke:rgb(var(--tone-gray-900))}.discovery-chain .resolvers,.discovery-chain .routes,.discovery-chain .splitters{border-radius:var(--decor-radius-100);border:1px solid;border-color:rgb(var(--tone-gray-200));background-color:rgb(var(--tone-gray-100));pointer-events:none}.discovery-chain .resolver-card,.discovery-chain .resolvers>header span,.discovery-chain .route-card,.discovery-chain .routes>header span,.discovery-chain .splitter-card,.discovery-chain .splitters>header span{pointer-events:all}.discovery-chain .resolvers>header>*,.discovery-chain .routes>header>*,.discovery-chain .splitters>header>*{text-transform:uppercase}.discovery-chain .resolvers>header span::after,.discovery-chain .routes>header span::after,.discovery-chain .splitters>header span::after{width:1.2em;height:1.2em;opacity:.6}.discovery-chain .resolver-card,.discovery-chain .route-card,.discovery-chain .splitter-card{transition-property:opacity background-color border-color;margin-top:0!important}.discovery-chain [id*=":"]:not(path):hover{opacity:1;background-color:rgb(var(--tone-gray-000));border-color:rgb(var(--tone-gray-500))}.discovery-chain .route-card header:not(.short) dd{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.discovery-chain .route-card section header>*{visibility:hidden}.discovery-chain .route-card .match-headers header ::before{content:"H"}.discovery-chain .route-card .match-queryparams header>::before{content:"Q"}.discovery-chain .resolver-card dt::before{content:"";--icon-size:icon-999}.discovery-chain .resolver-card dl.failover dt::before{--icon-name:icon-cloud-cross}.discovery-chain .resolver-card dl.redirect dt::before{--icon-name:icon-redirect}.discovery-chain circle{stroke-width:2;stroke:rgb(var(--tone-gray-400))}.discovery-chain{position:relative;display:flex;justify-content:space-between}.discovery-chain svg{position:absolute}.discovery-chain .resolvers,.discovery-chain .routes,.discovery-chain .splitters{padding:10px 1%;width:32%}.discovery-chain .resolvers>header,.discovery-chain .routes>header,.discovery-chain .splitters>header{height:18px}.discovery-chain .resolvers>header span,.discovery-chain .routes>header span,.discovery-chain .splitters>header span{position:relative;z-index:1;margin-left:2px}.discovery-chain .resolvers [role=group],.discovery-chain .routes [role=group],.discovery-chain .splitters [role=group]{position:relative;z-index:1;display:flex;flex-direction:column;justify-content:space-around;height:100%}.discovery-chain .resolver-card dl,.discovery-chain .route-card dl,.discovery-chain .splitter-card dl{margin:0;float:none}.discovery-chain .resolver-card,.discovery-chain .route-card,.discovery-chain .splitter-card{margin-bottom:20px}.discovery-chain .route-card header.short dl{display:flex}.discovery-chain .route-card header.short dt::after{content:" ";display:inline-block}.discovery-chain .route-card>header ul{float:right;margin-top:-2px}.discovery-chain .route-card>header ul li{margin-left:5px}.discovery-chain .route-card section{display:flex}.discovery-chain .route-card section header{display:block;width:19px;margin-right:14px}.discovery-chain .resolver-card a{display:block}.discovery-chain .resolver-card dl{display:flex;flex-wrap:wrap;margin-top:5px}.discovery-chain .resolver-card dt{font-size:0;margin-right:6px;margin-top:1px;width:23px;height:20px}.discovery-chain .resolver-card ol{display:flex;flex-wrap:wrap;list-style-type:none}.discovery-chain .route-card,.discovery-chain .splitter-card{position:relative}.discovery-chain .route-card::before,.discovery-chain .splitter-card::before{background-color:rgb(var(--tone-gray-000));border-radius:var(--decor-radius-full);border:2px solid;border-color:rgb(var(--tone-gray-400));position:absolute;z-index:1;right:-5px;top:50%;margin-top:-5px;width:10px;height:10px}.discovery-chain .resolver-inlets,.discovery-chain .splitter-inlets{width:10px;height:100%;z-index:1}.discovery-chain .splitter-inlets{left:50%;margin-left:calc(calc(-32% / 2) + 1% - 3px)}.discovery-chain .resolver-inlets{right:calc(32% - 1% - 7px)}.consul-bucket-list .service+dd{font-weight:var(--typo-weight-semibold)}.consul-bucket-list dd:not(:last-child)::after{display:inline-block;content:"/";margin:0 6px 0 3px}.consul-bucket-list .service+dd,.consul-bucket-list dd+dt{margin-left:0!important}.consul-upstream-instance-list dl.local-bind-socket-mode dt{text-transform:lowercase;font-weight:var(--typo-weight-semibold)}.consul-health-check-list .health-check-output::before{min-width:20px;min-height:20px;margin-right:15px}@media (max-width:650px){.consul-health-check-list .health-check-output::before{min-width:18px;min-height:18px;margin-right:8px}}.consul-health-check-list .health-check-output dd em{background-color:rgb(var(--tone-gray-100));cursor:default;font-style:normal;margin-top:-2px;margin-left:.5em}.consul-health-check-list .warning.health-check-output::before{color:rgb(var(--tone-orange-500))}.consul-health-check-list .critical.health-check-output::before{color:rgb(var(--tone-red-500))}.consul-health-check-list .health-check-output,.consul-health-check-list .health-check-output pre{border-radius:var(--decor-radius-100)}.consul-health-check-list .health-check-output dd:first-of-type{color:rgb(var(--tone-gray-400))}.consul-health-check-list .health-check-output pre{background-color:rgb(var(--tone-gray-050));color:rgb(var(--tone-gray-600))}.consul-health-check-list .health-check-output{border-width:1px 1px 1px 4px;color:rgb(var(--tone-gray-900));border-color:rgb(var(--tone-gray-200));border-style:solid;display:flex;padding:20px 24px 20px 16px}.consul-health-check-list .passing.health-check-output{border-left-color:rgb(var(--tone-green-500))}.consul-health-check-list .warning.health-check-output{border-left-color:rgb(var(--tone-yellow-500))}.consul-health-check-list .critical.health-check-output{border-left-color:rgb(var(--tone-red-500))}.consul-health-check-list .health-check-output:not(:last-child){margin-bottom:24px}.consul-health-check-list .health-check-output dl:last-of-type,.consul-health-check-list .health-check-output header{width:100%}.consul-health-check-list .health-check-output header{margin-bottom:.9em}.consul-health-check-list .health-check-output>div{flex:1 1 auto;width:calc(100% - 26px);display:flex;flex-wrap:wrap;justify-content:space-between}.consul-health-check-list .health-check-output dl{min-width:110px}.consul-health-check-list .health-check-output dl>*{display:block;width:auto;position:static;padding-left:0}.consul-health-check-list .health-check-output dt{margin-bottom:0}.consul-health-check-list .health-check-output dd{position:relative}.consul-health-check-list .health-check-output dl:nth-last-of-type(2){width:50%}.consul-health-check-list .health-check-output dl:last-of-type{margin-top:1em;margin-bottom:0}.consul-health-check-list .health-check-output dl:last-of-type dt{margin-bottom:.3em}.consul-health-check-list .health-check-output pre{padding:12px 40px 12px 12px;white-space:pre-wrap;position:relative}.consul-health-check-list .health-check-output pre code{word-wrap:break-word}.consul-health-check-list .health-check-output .copy-button{position:absolute;right:.5em;top:.7em}@media (max-width:650px){.consul-health-check-list .health-check-output{padding:15px 19px 15px 14px}.consul-health-check-list .health-check-output::before{margin-right:8px}.consul-health-check-list .health-check-output dl:nth-last-of-type(2){width:100%}.consul-health-check-list .health-check-output dl:not(:last-of-type){margin-right:0}}.consul-instance-checks.passing dt::before{color:rgb(var(--tone-green-500))}.consul-instance-checks.warning dt::before{color:rgb(var(--tone-orange-500))}.consul-instance-checks.critical dt::before{color:rgb(var(--tone-red-500))}.consul-instance-checks.empty dt::before{color:rgb(var(--tone-gray-500))}.consul-exposed-path-list>ul{border-top:1px solid rgb(var(--tone-gray-200))}.consul-intention-list td.intent- strong::before,.consul-intention-list td.intent-allow strong::before,.consul-intention-list td.intent-deny strong::before,.consul-intention-permission-list .intent-allow::before,.consul-intention-permission-list .intent-deny::before,.consul-intention-search-bar .value- span::before,.consul-intention-search-bar .value-allow span::before,.consul-intention-search-bar .value-deny span::before{margin-right:5px}.consul-intention-list td.intent- strong,.consul-intention-list td.intent-allow strong,.consul-intention-list td.intent-deny strong,.consul-intention-permission-list .intent-allow,.consul-intention-permission-list .intent-deny,.consul-intention-search-bar .value- span,.consul-intention-search-bar .value-allow span,.consul-intention-search-bar .value-deny span{display:inline-block;font-weight:var(--typo-weight-normal);font-size:var(--typo-size-600)}.consul-intention-list td.intent-allow strong,.consul-intention-permission-list .intent-allow,.consul-intention-search-bar .value-allow span{color:rgb(var(--tone-green-800));background-color:rgb(var(--tone-green-100))}.consul-intention-list td.intent-deny strong,.consul-intention-permission-list .intent-deny,.consul-intention-search-bar .value-deny span{color:rgb(var(--tone-red-800));background-color:rgb(var(--tone-red-100))}.consul-intention-list td.permissions{color:rgb(var(--tone-blue-500))}.consul-intention-list em{--word-spacing:0.25rem}.consul-intention-list em span::before,.consul-intention-list em span:first-child{margin-right:var(--word-spacing)}.consul-intention-list em span:last-child{margin-left:var(--word-spacing)}.consul-intention-list td{height:59px}.consul-intention-list tr>:nth-child(1){width:calc(30% - 50px)}.consul-intention-list tr>:nth-child(2){width:120px}.consul-intention-list tr>:nth-child(3){width:calc(30% - 50px)}.consul-intention-list tr>:nth-child(4){width:calc(40% - 240px)}.consul-intention-list tr>:nth-child(5){width:160px}.consul-intention-list tr>:last-child{width:60px}.consul-intention-list .menu-panel.confirmation{width:200px}@media (max-width:849px){.consul-intention-list tr>:not(.source):not(.destination):not(.intent){display:none}}.consul-intention-action-warn-modal .modal-dialog-window{max-width:450px}.consul-intention-action-warn-modal .modal-dialog-body p{font-size:var(--typo-size-600)}.consul-intention-fieldsets [role=radiogroup]{overflow:visible!important;display:grid;grid-gap:12px;grid-template-columns:repeat(auto-fit,minmax(270px,auto))}.consul-intention-fieldsets .radio-card header>*{display:inline}.consul-intention-fieldsets .permissions>button{float:right}.consul-intention-permission-modal [role=dialog]{width:100%}.consul-intention-permission-list dl.permission-methods dt::before{content:"M"}.consul-intention-permission-list dl.permission-path dt::before{content:"P"}.consul-intention-permission-header-list dt::before,.consul-intention-permission-list dl.permission-header dt::before{content:"H"}.consul-intention-permission-list .detail>div{display:flex;width:100%}.consul-intention-permission-list strong{margin-right:8px}.consul-intention-permission-form h2{border-top:1px solid rgb(var(--tone-blue-500));padding-top:1.4em;margin-top:.2em;margin-bottom:.6em}.consul-intention-permission-form .consul-intention-permission-header-form{margin-top:10px}.consul-intention-permission-form .consul-intention-permission-header-form fieldset>div,.consul-intention-permission-form fieldset:nth-child(2)>div{display:grid;grid-template-columns:repeat(auto-fit,minmax(160px,1fr));grid-gap:12px}.consul-intention-permission-form fieldset:nth-child(2)>div label:last-child{grid-column:span 2}.consul-intention-permission-form .ember-basic-dropdown-trigger{padding:5px}.consul-intention-permission-form .checkbox-group{flex-direction:column}.consul-intention-permission-header-list{max-height:200px;overflow:auto}.consul-lock-session-list button{margin-right:var(--horizontal-padding)}.consul-lock-session-form{overflow:hidden}.consul-server-list ul{display:grid;grid-template-columns:repeat(4,minmax(215px,25%));gap:12px}.consul-server-list a:hover div{box-shadow:var(--decor-elevation-800);--tone-border:var(--tone-gray-500)}.consul-server-card .name+dd{color:rgb(var(--tone-gray-999));animation-name:typo-truncate}.consul-server-card .health-status+dd{font-size:var(--typo-size-700)}.voting-status-non-voter.consul-server-card .health-status+dd{background-color:rgb(var(--tone-gray-100));color:rgb(var(--tone-gray-600))}.consul-server-card:not(.voting-status-non-voter) .health-status.healthy+dd{background-color:rgb(var(--tone-green-050));color:rgb(var(--tone-green-800))}.consul-server-card:not(.voting-status-non-voter) .health-status:not(.healthy)+dd{background-color:rgb(var(--tone-red-050));color:rgb(var(--tone-red-500))}.consul-server-card .health-status+dd::before{--icon-size:icon-000;content:""}.consul-server-card .health-status.healthy+dd::before{--icon-name:icon-check;--icon-color:rgb(var(--tone-green-800))}.consul-server-card .health-status:not(.healthy)+dd::before{--icon-name:icon-x;--icon-color:rgb(var(--tone-red-500))}.consul-server-card{position:relative;overflow:hidden;--padding-x:24px;--padding-y:24px;padding:var(--padding-y) var(--padding-x);--tile-size:3rem}.consul-auth-method-binding-list h2,.consul-auth-method-view section h2{padding-bottom:12px}.voting-status-leader.consul-server-card .name{position:absolute!important}#downstream-lines,#metrics-container div .sparkline-wrapper,#upstream-lines,.consul-auth-method-view section,main{position:relative}.consul-server-card dd:not(:last-of-type){margin-bottom:calc(var(--padding-y)/ 2)}.voting-status-leader.consul-server-card dd{margin-left:calc(var(--tile-size) + 1rem)}.consul-auth-method-list ul .locality::before{margin-right:4px}.consul-auth-method-view{margin-bottom:32px}.consul-auth-method-view section{width:100%;overflow-y:auto}.consul-auth-method-view section table thead td{color:rgb(var(--tone-gray-500));font-weight:var(--typo-weight-semibold);font-size:var(--typo-size-700)}.consul-auth-method-view section table tbody td{font-size:var(--typo-size-600);color:rgb(var(--tone-gray-999))}.consul-auth-method-view section table tbody tr{cursor:default}.consul-auth-method-view section dt{width:30%}.consul-auth-method-view section dd{width:70%}.consul-auth-method-binding-list p{margin-bottom:4px!important}.consul-auth-method-binding-list code{background-color:rgb(var(--tone-gray-050));padding:0 12px}.consul-auth-method-nspace-list thead td{color:rgb(var(--tone-gray-500))!important;font-weight:var(--typo-weight-semibold)!important;font-size:var(--typo-size-700)!important}.consul-auth-method-nspace-list tbody td{font-size:var(--typo-size-600);color:rgb(var(--tone-gray-999))}.consul-auth-method-nspace-list tbody tr{cursor:default}.role-selector [name="role[state]"]:checked+*{display:block}.topology-notices button{color:rgb(var(--tone-blue-500));float:right;margin-top:16px;margin-bottom:32px}#metrics-container .link a,.topology-container{color:rgb(var(--tone-gray-700))}#downstream-container .topology-metrics-card:not(:last-child),#upstream-column #upstream-container:not(:last-child),#upstream-container .topology-metrics-card:not(:last-child){margin-bottom:8px}#downstream-container,#metrics-container,#upstream-container{border-radius:var(--decor-radius-100);border:1px solid;border-color:rgb(var(--tone-gray-200))}#downstream-container,#upstream-container{background-color:rgb(var(--tone-gray-100));padding:12px}#downstream-container>div:first-child{display:inline-flex}#downstream-container>div:first-child span::before{background-color:rgb(var(--tone-gray-500))}#metrics-container div:first-child{background-color:rgb(var(--tone-gray-000));padding:12px;border:none;font-size:16px;font-weight:700}#metrics-container .link{background-color:rgb(var(--tone-gray-100));padding:18px}#metrics-container .link a:hover{color:rgb(var(--color-action))}#downstream-lines svg path,#upstream-lines svg path{fill:var(--transparent)}#downstream-lines svg .allow-arrow,#upstream-lines svg .allow-arrow{fill:rgb(var(--tone-gray-300));stroke-linejoin:round}#downstream-lines svg .allow-arrow,#downstream-lines svg .allow-dot,#downstream-lines svg path,#upstream-lines svg .allow-arrow,#upstream-lines svg .allow-dot,#upstream-lines svg path{stroke:rgb(var(--tone-gray-300));stroke-width:2}#downstream-lines svg path[data-permission=empty],#downstream-lines svg path[data-permission=not-defined],#upstream-lines svg path[data-permission=empty],#upstream-lines svg path[data-permission=not-defined]{stroke-dasharray:4}#downstream-lines svg path[data-permission=deny],#upstream-lines svg path[data-permission=deny]{stroke:rgb(var(--tone-red-500))}#downstream-lines svg .deny-dot,#upstream-lines svg .deny-dot{stroke:rgb(var(--tone-red-500));stroke-width:2}#downstream-lines svg .deny-arrow,#upstream-lines svg .deny-arrow{fill:rgb(var(--tone-red-500));stroke:rgb(var(--tone-red-500));stroke-linejoin:round}.topology-notices{display:flow-root}.topology-container{display:grid;height:100%;align-items:start;grid-template-columns:2fr 1fr 2fr 1fr 2fr;grid-template-rows:50px 1fr 50px;grid-template-areas:"down-cards down-lines . up-lines up-cards" "down-cards down-lines metrics up-lines up-cards" "down-cards down-lines . up-lines up-cards"}#downstream-container{grid-area:down-cards}#downstream-lines{grid-area:down-lines;margin-left:-20px}#upstream-lines{grid-area:up-lines;margin-right:-20px}#upstream-column{grid-area:up-cards}#metrics-container{grid-area:metrics}#metrics-container .link a::before{background-color:rgb(var(--tone-gray-500));margin-right:4px}#downstream-container .topology-metrics-card,#upstream-container .topology-metrics-card{display:block;color:rgb(var(--tone-gray-700));overflow:hidden;background-color:rgb(var(--tone-gray-000));border-radius:var(--decor-radius-100);border:1px solid;border-color:rgb(var(--tone-gray-200))}#downstream-container .topology-metrics-card p,#upstream-container .topology-metrics-card p{padding:12px 12px 0;font-size:var(--typo-size-500);font-weight:var(--typo-weight-semibold);margin-bottom:0!important}#downstream-container .topology-metrics-card p.empty,#upstream-container .topology-metrics-card p.empty{padding:12px!important}#downstream-container .topology-metrics-card div dl,#upstream-container .topology-metrics-card div dl{display:inline-flex;margin-right:8px}#downstream-container .topology-metrics-card div dd,#upstream-container .topology-metrics-card div dd{color:rgb(var(--tone-gray-700))}#downstream-container .topology-metrics-card div span,#upstream-container .topology-metrics-card div span{margin-right:8px}#downstream-container .topology-metrics-card div dt::before,#downstream-container .topology-metrics-card div span::before,#upstream-container .topology-metrics-card div dt::before,#upstream-container .topology-metrics-card div span::before{margin-right:4px}#downstream-container .topology-metrics-card div .health dt::before,#downstream-container .topology-metrics-card div .nspace dt::before,#upstream-container .topology-metrics-card div .health dt::before,#upstream-container .topology-metrics-card div .nspace dt::before{margin-top:2px}#downstream-container .topology-metrics-card div .health dt::before,#downstream-container .topology-metrics-card div .nspace dt::before,#downstream-container .topology-metrics-card div .partition dt::before,#upstream-container .topology-metrics-card div .health dt::before,#upstream-container .topology-metrics-card div .nspace dt::before,#upstream-container .topology-metrics-card div .partition dt::before{--icon-color:rgb(var(--tone-gray-500))}#downstream-container .topology-metrics-card div .passing::before,#upstream-container .topology-metrics-card div .passing::before{--icon-color:rgb(var(--tone-green-500))}#downstream-container .topology-metrics-card div .warning::before,#upstream-container .topology-metrics-card div .warning::before{--icon-color:rgb(var(--tone-orange-500))}#downstream-container .topology-metrics-card div .critical::before,#upstream-container .topology-metrics-card div .critical::before{--icon-color:rgb(var(--tone-red-500))}#downstream-container .topology-metrics-card div .empty::before,#upstream-container .topology-metrics-card div .empty::before{--icon-color:rgb(var(--tone-gray-500))}#downstream-container .topology-metrics-card .details,#upstream-container .topology-metrics-card .details{padding:0 12px 12px}#downstream-container .topology-metrics-card .details>:not(:last-child),#upstream-container .topology-metrics-card .details>:not(:last-child){padding-bottom:6px}#downstream-container .topology-metrics-card .details .group,#upstream-container .topology-metrics-card .details .group{display:grid;grid-template-columns:20px 1fr;grid-template-rows:repeat(2,1fr);grid-template-areas:"partition partition" "union namespace"}#downstream-container .topology-metrics-card .details .group span,#upstream-container .topology-metrics-card .details .group span{display:inline-block;grid-area:union;padding-left:7px;margin-right:0}#downstream-container .topology-metrics-card .details .group span::before,#upstream-container .topology-metrics-card .details .group span::before{margin-right:0;--icon-color:rgb(var(--tone-gray-500))}#downstream-container .topology-metrics-card .details .group dl:first-child,#upstream-container .topology-metrics-card .details .group dl:first-child{grid-area:partition;padding-bottom:6px}#downstream-container .topology-metrics-card .details .group dl:nth-child(2),#upstream-container .topology-metrics-card .details .group dl:nth-child(2){grid-area:namespace}.topology-metrics-source-type{margin:6px 0 6px 12px;display:table}.topology-metrics-popover>button{position:absolute;transform:translate(-50%,-50%);background-color:rgb(var(--tone-gray-000));padding:1px}.topology-metrics-popover>button:hover{cursor:pointer}.topology-metrics-popover>button:disabled,html[data-route^="dc.nodes.show.metadata"] table tr{cursor:default}.topology-metrics-popover>button:active,.topology-metrics-popover>button:focus{outline:0}.topology-metrics-popover.deny .informed-action header::before{display:none}.topology-metrics-popover.deny .tippy-arrow::after,.topology-metrics-popover.deny>button::before{--icon-color:rgb(var(--tone-red-500))}.topology-metrics-popover.not-defined .tippy-arrow::after,.topology-metrics-popover.not-defined>button::before{--icon-color:rgb(var(--tone-yellow-500))}#metrics-container .sparkline-wrapper svg path{stroke-width:0}#metrics-container .sparkline-wrapper .tooltip{padding:0 0 10px;font-size:.875em;line-height:1.5em;font-weight:400;border:1px solid;background:#fff;border-radius:2px;box-sizing:border-box;box-shadow:0 4px 8px rgba(0,0,0,.05),0 4px 4px rgba(0,0,0,.1)}#metrics-container .sparkline-wrapper .tooltip .sparkline-time{padding:8px 10px;font-weight:700;font-size:14px;color:#000;border-bottom:1px solid rgb(var(--tone-gray-200));margin-bottom:4px;text-align:center}#metrics-container .sparkline-wrapper .tooltip .sparkline-tt-legend,#metrics-container .sparkline-wrapper .tooltip .sparkline-tt-sum{border:0;padding:3px 10px 0}#metrics-container .sparkline-wrapper .tooltip .sparkline-tt-sum{border-top:1px solid rgb(var(--tone-gray-200));margin-top:4px;padding:8px 10px 0}#metrics-container .sparkline-wrapper .tooltip .sparkline-tt-legend-color{width:12px;height:12px;border-radius:2px;margin:0 5px 0 0;padding:0}#metrics-container .sparkline-wrapper .tooltip .sparkline-tt-legend-value,#metrics-container .sparkline-wrapper .tooltip .sparkline-tt-sum-value{float:right}#metrics-container .sparkline-wrapper div.tooltip:before{content:"";display:block;position:absolute;width:12px;height:12px;left:15px;bottom:-7px;border:1px solid;border-top:0;border-left:0;background:#fff;transform:rotate(45deg)}.sparkline-key h3::before{margin:2px 3px 0 0;font-size:14px}.sparkline-key h3{color:rgb(var(--tone-gray-900));font-size:16px}.sparkline-key .sparkline-key-content dd,.sparkline-key-link{color:rgb(var(--tone-gray-500))}.sparkline-key-link:hover{color:rgb(var(--tone-blue-500))}#metrics-container:hover .sparkline-key-link::before{margin:1px 3px 0 0;font-size:12px}#metrics-container div .sparkline-wrapper,#metrics-container div .sparkline-wrapper svg.sparkline{width:100%;height:70px;padding:0;margin:0}#metrics-container div .sparkline-wrapper .tooltip{visibility:hidden;position:absolute;z-index:10;bottom:78px;width:217px}#metrics-container div .sparkline-wrapper .sparkline-tt-legend-color{display:inline-block}#metrics-container div .sparkline-wrapper .topology-metrics-error,#metrics-container div .sparkline-wrapper .topology-metrics-loader{padding-top:15px}.sparkline-key .sparkline-key-content{width:500px;min-height:100px}.sparkline-key .sparkline-key-content dl{padding:10px 0 0}.sparkline-key .sparkline-key-content dt{font-weight:600;width:125px;float:left}.sparkline-key .sparkline-key-content dd{margin:0 0 12px 135px}.sparkline-key-link{visibility:hidden;float:right;margin-top:-35px;margin-right:12px}#metrics-container:hover .sparkline-key-link{visibility:visible}.topology-metrics-stats{padding:12px 12px 0;display:flex;flex-flow:row wrap;justify-content:space-between;align-items:stretch;width:100%;border-top:1px solid rgb(var(--tone-gray-200))}.topology-metrics-stats dl{display:flex;padding-bottom:12px}.topology-metrics-stats dt{margin-right:5px;line-height:1.5em!important}.topology-metrics-stats dd{color:rgb(var(--tone-gray-400))!important}.topology-metrics-stats span{padding-bottom:12px}.topology-metrics-status-error,.topology-metrics-status-loader{font-weight:400;font-size:.875rem;color:rgb(var(--tone-gray-500));text-align:center;margin:0 auto!important;display:block}.topology-metrics-status-error span::before,.topology-metrics-status-loader span::before{background-color:rgb(var(--tone-gray-500))}span.topology-metrics-status-loader::after{--icon-name:var(--icon-loading);content:"";margin-left:.5rem}.definition-table dt{line-height:var(--typo-lead-700)}.app-view>div form:not(.filter-bar) [role=radiogroup] label,.modal-dialog [role=document] [role=radiogroup] label{line-height:var(--typo-lead-200)}.app-view>div form button[type=button].type-delete,.app-view>div form:not(.filter-bar) [role=radiogroup] label>span,.consul-intention-action-warn-modal button.dangerous,.copy-button button,.empty-state div>button,.modal-dialog .type-delete,.modal-dialog [role=document] .type-password>span,.modal-dialog [role=document] .type-select>span,.modal-dialog [role=document] .type-text>span,.modal-dialog [role=document] [role=radiogroup] label>span,.oidc-select button:not(.reset),.oidc-select label>span,.popover-select label>*,.topology-notices button,.type-sort.popover-select label>*,.type-toggle>span,.with-confirmation .type-delete,a.type-create,button.type-cancel,button.type-submit,button[type=reset],button[type=submit],header .actions button[type=button]:not(.copy-btn),main .type-password>span,main .type-select>span,main .type-text>span,span.label{font-weight:var(--typo-weight-semibold)}.discovery-chain .route-card header:not(.short) dd,.discovery-chain .route-card section dt,.discovery-chain .splitter-card>header{font-weight:var(--typo-weight-bold)}.app-view h1 em,.app-view>div form:not(.filter-bar) [role=radiogroup] label>strong,.consul-auth-method-type,.consul-external-source,.consul-health-check-list .health-check-output dd em,.consul-intention-list td strong,.consul-intention-list td.destination em,.consul-intention-list td.source em,.consul-intention-permission-list strong,.consul-intention-search-bar li button span,.consul-kind,.consul-server-card .health-status+dd,.consul-source,.consul-transparent-proxy,.discovery-chain .route-card header dt,.discovery-chain .route-card>header ul li,.empty-state header :nth-child(2),.hashicorp-consul nav .dcs li.is-local span,.hashicorp-consul nav .dcs li.is-primary span,.leader,.modal-dialog [role=document] .type-password>strong,.modal-dialog [role=document] .type-select>strong,.modal-dialog [role=document] .type-text>strong,.modal-dialog [role=document] [role=radiogroup] label>strong,.modal-dialog [role=document] label a[rel*=help],.modal-dialog [role=document] table td:first-child em,.oidc-select label>strong,.search-bar-status li:not(.remove-all),.topology-metrics-source-type,.type-toggle>strong,html[data-route^="dc.acls.index"] main td strong,main .type-password>strong,main .type-select>strong,main .type-text>strong,main label a[rel*=help],main table td:first-child em,section[data-route="dc.show.serverstatus"] .redundancy-zones section header dl,section[data-route="dc.show.serverstatus"] .server-failure-tolerance header em,span.policy-node-identity,span.policy-service-identity{font-weight:var(--typo-weight-normal)}.app-view h1 em,.app-view>div form:not(.filter-bar) [role=radiogroup] label>em,.consul-intention-list td.destination em,.consul-intention-list td.source em,.modal-dialog [role=document] .type-password>em,.modal-dialog [role=document] .type-select>em,.modal-dialog [role=document] .type-text>em,.modal-dialog [role=document] [role=radiogroup] label>em,.modal-dialog [role=document] form button+em,.modal-dialog [role=document] table td:first-child em,.oidc-select label>em,.type-toggle>em,main .type-password>em,main .type-select>em,main .type-text>em,main form button+em,main table td:first-child em{font-style:normal}.consul-exposed-path-list>ul>li>.header,.consul-lock-session-list ul>li:not(:first-child)>.header,.consul-upstream-instance-list li>.header,.list-collection>ul>li:not(:first-child)>.header{font-size:var(--typo-size-450);font-weight:var(--typo-weight-medium)}.consul-exposed-path-list>ul>li>.header :not(button),.consul-lock-session-list ul>li:not(:first-child)>.header :not(button),.consul-upstream-instance-list li>.header :not(button),.list-collection>ul>li:not(:first-child)>.header :not(button){font-size:inherit;font-weight:inherit}.app-view h1 em{font-size:var(--typo-size-500)}@media (max-width:420px) and (-webkit-min-device-pixel-ratio:0){input{font-size:16px!important}}#wrapper{box-sizing:content-box}#wrapper>footer>*,.modal-dialog>*,main>*{box-sizing:border-box}html[data-route$=create] main,html[data-route$=edit] main{max-width:1260px}fieldset [role=group]{display:flex;flex-wrap:wrap;flex-direction:row}.outlet[data-state=loading],html.ember-loading .view-loader,html:not(.has-nspaces) [class*=nspace-],html:not(.has-partitions) [class*=partition-],html[data-state=idle] .view-loader{display:none}[role=group] fieldset{width:50%}[role=group] fieldset:not(:first-of-type){padding-left:20px;border-left:1px solid;border-left:rgb(var(--tone-gray-500))}[role=group] fieldset:not(:last-of-type){padding-right:20px}.app-view{margin-top:50px}@media (max-width:849px){html:not(.with-breadcrumbs) .app-view{margin-top:10px}}html body>.brand-loader{transition-property:transform,opacity;transform:translate(0,0);opacity:1}html[data-state]:not(.ember-loading) body>.brand-loader{opacity:0}@media (min-width:900px){html[data-state] body>.brand-loader{transform:translate(calc(var(--chrome-width)/ 2),0)}}html[data-route$=create] .app-view>header+div>:first-child,html[data-route$=edit] .app-view>header+div>:first-child{margin-top:1.8em}.app-view>div .container,.app-view>div .tab-section .consul-health-check-list,.app-view>div .tab-section>.search-bar+p,.app-view>div .tab-section>:first-child:not(.filter-bar):not(table){margin-top:1.25em}.consul-upstream-instance-list,html[data-route^="dc.nodes.show.sessions"] .consul-lock-session-list{margin-top:0!important}.consul-auth-method-list ul,.consul-node-list ul,.consul-nspace-list ul,.consul-policy-list ul,.consul-role-list ul,.consul-service-instance-list ul,.consul-token-list ul,html[data-route="dc.services.index"] .consul-service-list ul,html[data-route^="dc.nodes.show.sessions"] .consul-lock-session-list ul{border-top-width:0!important}.notice+.consul-token-list ul{border-top-width:1px!important}#wrapper{padding-left:25px;padding-right:25px;display:flex;min-height:100vh;flex-direction:column}main{flex:1}html:not([data-route$=index]):not([data-route$=instances]) main{margin-bottom:2em}@media (max-width:849px){.actions button.copy-btn{margin-top:-56px;padding:0}}.modal-dialog [role=document] p:not(:last-child),main p:not(:last-child){margin-bottom:1em}.modal-dialog [role=document] form+div .with-confirmation,.modal-dialog [role=document] form:not(.filter-bar),main form+div .with-confirmation,main form:not(.filter-bar){margin-bottom:2em}@media (max-width:420px){main form [type=reset]{float:right;margin-right:0!important}}html[data-route^="dc.services.show"] .app-view .actions .external-dashboard{position:absolute;top:50px;right:0}html[data-route^="dc.services.instance"] .app-view>header dl{float:left;margin-top:19px;margin-bottom:23px;margin-right:50px}html[data-route^="dc.services.instance"] .app-view>header dt{font-weight:var(--typo-weight-bold)}html[data-route^="dc.services.instance"] .tab-nav{border-top:var(--decor-border-100)}html[data-route^="dc.services.instance"] .tab-section section:not(:last-child){border-bottom:var(--decor-border-100);padding-bottom:24px}html[data-route^="dc.services.instance"] .tab-nav,html[data-route^="dc.services.instance"] .tab-section section:not(:last-child){border-color:rgb(var(--tone-gray-200))}html[data-route^="dc.services.instance.metadata"] .tab-section section h2{margin:24px 0 12px}html[data-route^="dc.kv"] .type-toggle{float:right;margin-bottom:0!important}html[data-route^="dc.kv.edit"] h2{border-bottom:var(--decor-border-200);border-color:rgb(var(--tone-gray-200));padding-bottom:.2em;margin-bottom:.5em}html[data-route^="dc.acls.index"] main td strong{margin-right:3px}@media (max-width:420px){html[data-route^="dc.acls.create"] main header .actions,html[data-route^="dc.acls.edit"] main header .actions{float:none;display:flex;justify-content:space-between;margin-bottom:1em}html[data-route^="dc.acls.create"] main header .actions .with-feedback,html[data-route^="dc.acls.edit"] main header .actions .with-feedback{position:absolute;right:0}html[data-route^="dc.acls.create"] main header .actions .with-confirmation,html[data-route^="dc.acls.edit"] main header .actions .with-confirmation{margin-top:0}}html[data-route^="dc.intentions.edit"] .definition-table{margin-bottom:1em}section[data-route="dc.show.serverstatus"] .server-failure-tolerance{box-shadow:var(--decor-elevation-000);padding:var(--padding-y) var(--padding-x);max-width:770px;display:flex;flex-wrap:wrap}section[data-route="dc.show.serverstatus"] .server-failure-tolerance>header{width:100%;padding-bottom:.5rem;margin-bottom:1rem;border-bottom:var(--decor-border-100);border-color:rgb(var(--tone-border))}section[data-route="dc.show.serverstatus"] .server-failure-tolerance>header a{float:right;margin-top:4px;font-weight:var(--typo-weight-semibold)}section[data-route="dc.show.serverstatus"] .server-failure-tolerance header em{font-size:.812rem;background-color:rgb(var(--tone-gray-200));text-transform:uppercase;font-style:normal}section[data-route="dc.show.serverstatus"] .server-failure-tolerance>section{width:50%}section[data-route="dc.show.serverstatus"] .server-failure-tolerance dl,section[data-route="dc.show.serverstatus"] .server-failure-tolerance>section{display:flex;flex-direction:column}section[data-route="dc.show.serverstatus"] .server-failure-tolerance dl{flex-grow:1;justify-content:space-between}section[data-route="dc.show.serverstatus"] .server-failure-tolerance dl.warning dd::before{--icon-name:icon-alert-circle;--icon-size:icon-800;--icon-color:rgb(var(--tone-orange-400));content:"";margin-right:.5rem}section[data-route="dc.show.serverstatus"] .server-failure-tolerance section:first-of-type dl{padding-right:1.5rem}section[data-route="dc.show.serverstatus"] .server-failure-tolerance dt{color:rgb(var(--tone-gray-700))}section[data-route="dc.show.serverstatus"] .server-failure-tolerance dd{display:flex;align-items:center;font-size:var(--typo-size-250);color:rgb(var(--tone-gray-999))}section[data-route="dc.show.serverstatus"] .server-failure-tolerance header span::before{--icon-name:icon-info;--icon-size:icon-300;--icon-color:rgb(var(--tone-gray-500));vertical-align:unset;content:""}section[data-route="dc.show.serverstatus"] section:not([class*=-tolerance]) h2{margin-top:1.5rem;margin-bottom:1.5rem}section[data-route="dc.show.serverstatus"] section:not([class*=-tolerance]) header{margin-top:18px;margin-bottom:18px}section[data-route="dc.show.serverstatus"] .redundancy-zones section header{display:flow-root}section[data-route="dc.show.serverstatus"] .redundancy-zones section header h3{float:left;margin-right:.5rem}section[data-route="dc.show.serverstatus"] .redundancy-zones section header dl:not(.warning){background-color:rgb(var(--tone-gray-100))}section[data-route="dc.show.serverstatus"] .redundancy-zones section header dl.warning{background-color:rgb(var(--tone-orange-100));color:rgb(var(--tone-orange-800))}section[data-route="dc.show.serverstatus"] .redundancy-zones section header dl.warning::before{--icon-name:icon-alert-circle;--icon-size:icon-000;margin-right:.312rem;content:""}section[data-route="dc.show.serverstatus"] .redundancy-zones section header dt::after{content:":";display:inline-block;vertical-align:revert;background-color:var(--transparent)}section[data-route="dc.show.license"] .validity p{color:rgb(var(--tone-gray-700))}section[data-route="dc.show.license"] .validity dl{font-size:var(--typo-size-400)}section[data-route="dc.show.license"] .validity dl dt::before{content:"";margin-right:.25rem}section[data-route="dc.show.license"] .validity dl .expired::before{--icon-name:icon-x-circle;--icon-color:rgb(var(--red-500))}section[data-route="dc.show.license"] .validity dl .warning::before{--icon-name:icon-alert-circle;--icon-color:rgb(var(--orange-500))}section[data-route="dc.show.license"] .validity dl .valid:not(.warning)::before{--icon-name:icon-check-circle;--icon-color:rgb(var(--green-500))}section[data-route="dc.show.license"] aside{box-shadow:var(--decor-elevation-000);padding:var(--padding-y) var(--padding-x);width:40%;min-width:413px;margin-top:1rem}section[data-route="dc.show.license"] aside header{margin-bottom:1rem}section[data-route="dc.show.license"] aside li{margin-bottom:.25rem}section[data-route="dc.show.license"] aside a::before{--icon-name:icon-docs-link;content:"";margin-right:.375rem}.prefers-reduced-motion{--icon-loading:icon-loading}@media (prefers-reduced-motion){:root{--icon-loading:icon-loading}}.consul-external-source.vault::before,.popover-select .vault button::before{--icon-name:icon-vault;content:""}.consul-external-source.aws::before,.popover-select .aws button::before{--icon-name:var(--icon-aws);content:""}.consul-external-source.aws::before,.consul-external-source.vault::before{--icon-size:icon-200}.consul-intention-fieldsets .value->:last-child::before,.consul-intention-fieldsets .value-allow>:last-child::before,.consul-intention-fieldsets .value-deny>:last-child::before{--icon-size:icon-500;--icon-resolution:.5}.consul-intention-fieldsets .value-allow>:last-child::before,.consul-intention-list td.intent-allow strong::before,.consul-intention-permission-list .intent-allow::before,.consul-intention-search-bar .value-allow span::before{--icon-name:icon-arrow-right;--icon-color:rgb(var(--tone-green-500))}.consul-intention-fieldsets .value-deny>:last-child::before,.consul-intention-list td.intent-deny strong::before,.consul-intention-permission-list .intent-deny::before,.consul-intention-search-bar .value-deny span::before{--icon-name:icon-skip;--icon-color:rgb(var(--tone-red-500))}.consul-intention-fieldsets .value->:last-child::before,.consul-intention-list td.intent- strong::before,.consul-intention-search-bar .value- span::before{--icon-name:icon-layers}*{border-width:0}.animatable.tab-nav ul::after,.app-view>div form button[type=button].type-delete,.app-view>div form button[type=button].type-delete:disabled,.app-view>div form button[type=button].type-delete:focus,.app-view>div form button[type=button].type-delete:hover:active,.app-view>div form button[type=button].type-delete:hover:not(:disabled):not(:active),.consul-auth-method-type,.consul-external-source,.consul-intention-action-warn-modal button.dangerous,.consul-intention-action-warn-modal button.dangerous:disabled,.consul-intention-action-warn-modal button.dangerous:focus,.consul-intention-action-warn-modal button.dangerous:hover:active,.consul-intention-action-warn-modal button.dangerous:hover:not(:disabled):not(:active),.consul-intention-list td.intent- strong,.consul-intention-permission-form button.type-submit,.consul-intention-permission-form button.type-submit:disabled,.consul-intention-permission-form button.type-submit:focus:not(:disabled),.consul-intention-permission-form button.type-submit:hover:not(:disabled),.consul-intention-search-bar .value- span,.consul-kind,.consul-source,.consul-transparent-proxy,.disclosure-menu [aria-expanded]~*>ul>li.dangerous>:first-child,.disclosure-menu [aria-expanded]~*>ul>li.dangerous>:focus:first-child,.disclosure-menu [aria-expanded]~*>ul>li.dangerous>:hover:first-child,.discovery-chain .route-card>header ul li,.empty-state div>button,.empty-state div>button:disabled,.empty-state div>button:focus,.empty-state div>button:hover:active,.empty-state div>button:hover:not(:disabled):not(:active),.informed-action>ul>.dangerous>*,.informed-action>ul>.dangerous>:focus,.informed-action>ul>.dangerous>:hover,.leader,.menu-panel>ul>li.dangerous>:first-child,.menu-panel>ul>li.dangerous>:focus:first-child,.menu-panel>ul>li.dangerous>:hover:first-child,.modal-dialog .type-delete,.modal-dialog .type-delete:disabled,.modal-dialog .type-delete:focus,.modal-dialog .type-delete:hover:active,.modal-dialog .type-delete:hover:not(:disabled):not(:active),.modal-dialog [role=document]>footer,.modal-dialog [role=document]>header,.more-popover-menu>[type=checkbox]+label+div>ul>li.dangerous>:first-child,.more-popover-menu>[type=checkbox]+label+div>ul>li.dangerous>:focus:first-child,.more-popover-menu>[type=checkbox]+label+div>ul>li.dangerous>:hover:first-child,.oidc-select button:disabled:not(.reset),.oidc-select button:focus:not(.reset),.oidc-select button:hover:active:not(.reset),.oidc-select button:hover:not(:disabled):not(:active):not(.reset),.oidc-select button:not(.reset),.popover-menu>[type=checkbox]+label+div>ul>li.dangerous>:first-child,.popover-menu>[type=checkbox]+label+div>ul>li.dangerous>:focus:first-child,.popover-menu>[type=checkbox]+label+div>ul>li.dangerous>:hover:first-child,.tab-nav .selected>*,.topology-metrics-source-type,.with-confirmation .type-delete,.with-confirmation .type-delete:disabled,.with-confirmation .type-delete:focus,.with-confirmation .type-delete:hover:active,.with-confirmation .type-delete:hover:not(:disabled):not(:active),a.type-create,a.type-create:disabled,a.type-create:focus,a.type-create:hover:active,a.type-create:hover:not(:disabled):not(:active),button.type-cancel,button.type-cancel:active,button.type-cancel:focus,button.type-cancel:hover:not(:disabled):not(:active),button.type-submit,button.type-submit:disabled,button.type-submit:focus,button.type-submit:hover:active,button.type-submit:hover:not(:disabled):not(:active),button[type=reset],button[type=reset]:active,button[type=reset]:focus,button[type=reset]:hover:not(:disabled):not(:active),button[type=submit],button[type=submit]:disabled,button[type=submit]:focus,button[type=submit]:hover:active,button[type=submit]:hover:not(:disabled):not(:active),header .actions button[type=button]:active:not(.copy-btn),header .actions button[type=button]:focus:not(.copy-btn),header .actions button[type=button]:hover:not(:disabled):not(:active):not(.copy-btn),header .actions button[type=button]:not(.copy-btn),html[data-route^="dc.acls.index"] main td strong,span.policy-node-identity,span.policy-service-identity,table.has-actions tr>.actions>[type=checkbox]+label+div>ul>li.dangerous>:first-child,table.has-actions tr>.actions>[type=checkbox]+label+div>ul>li.dangerous>:focus:first-child,table.has-actions tr>.actions>[type=checkbox]+label+div>ul>li.dangerous>:hover:first-child,table.with-details tr>.actions>[type=checkbox]+label+div>ul>li.dangerous>:first-child,table.with-details tr>.actions>[type=checkbox]+label+div>ul>li.dangerous>:focus:first-child,table.with-details tr>.actions>[type=checkbox]+label+div>ul>li.dangerous>:hover:first-child{border-style:solid}button.type-cancel:focus,button.type-cancel:hover:not(:disabled):not(:active),button[type=reset]:focus,button[type=reset]:hover:not(:disabled):not(:active),header .actions button[type=button]:focus:not(.copy-btn),header .actions button[type=button]:hover:not(:disabled):not(:active):not(.copy-btn){background-color:rgb(var(--tone-gray-000));border-color:rgb(var(--tone-gray-700));color:rgb(var(--tone-gray-800))}button.type-cancel,button[type=reset],header .actions button[type=button]:not(.copy-btn){background-color:rgb(var(--tone-gray-050));border-color:rgb(var(--tone-gray-300));color:rgb(var(--tone-gray-800))}.consul-auth-method-type,.consul-external-source,.consul-kind,.consul-source,.consul-transparent-proxy,.leader,.topology-metrics-source-type,span.policy-node-identity,span.policy-service-identity{background-color:rgb(var(--tone-gray-100));border-color:rgb(var(--tone-gray-500));color:rgb(var(--tone-gray-500))}button.type-cancel:active,button[type=reset]:active,header .actions button[type=button]:active:not(.copy-btn){background-color:rgb(var(--tone-gray-200));border-color:rgb(var(--tone-gray-700));color:rgb(var(--tone-gray-800))}.modal-dialog [role=document]>footer,.modal-dialog [role=document]>header{background-color:rgb(var(--tone-gray-050));border-color:rgb(var(--tone-gray-300));color:rgb(var(--tone-gray-900))}.consul-intention-list td.intent- strong,.consul-intention-search-bar .value- span,.discovery-chain .route-card>header ul li,html[data-route^="dc.acls.index"] main td strong{background-color:rgb(var(--tone-gray-100));border-color:rgb(var(--tone-gray-300));color:rgb(var(--tone-gray-900))}.consul-intention-permission-form button.type-submit:disabled{background-color:rgb(var(--tone-gray-000));border-color:rgb(var(--tone-blue-300));color:rgb(var(--tone-blue-300))}.animatable.tab-nav ul::after,.consul-intention-permission-form button.type-submit,.tab-nav .selected>*{background-color:rgb(var(--tone-gray-000));border-color:rgb(var(--tone-blue-500));color:rgb(var(--tone-blue-500))}.consul-intention-permission-form button.type-submit:focus:not(:disabled),.consul-intention-permission-form button.type-submit:hover:not(:disabled){background-color:rgb(var(--tone-blue-050));border-color:rgb(var(--tone-blue-500));color:rgb(var(--tone-blue-800))}.empty-state div>button:disabled,.oidc-select button:disabled:not(.reset),a.type-create:disabled,button.type-submit:disabled,button[type=submit]:disabled{background-color:rgb(var(--tone-blue-200));border-color:rgb(var(--tone-gray-400));color:rgb(var(--tone-blue-050))}.empty-state div>button:focus,.empty-state div>button:hover:not(:disabled):not(:active),.oidc-select button:focus:not(.reset),.oidc-select button:hover:not(:disabled):not(:active):not(.reset),a.type-create:focus,a.type-create:hover:not(:disabled):not(:active),button.type-submit:focus,button.type-submit:hover:not(:disabled):not(:active),button[type=submit]:focus,button[type=submit]:hover:not(:disabled):not(:active){background-color:rgb(var(--tone-blue-400));border-color:rgb(var(--tone-blue-800));color:rgb(var(--tone-gray-000))}.empty-state div>button,.oidc-select button:not(.reset),a.type-create,button.type-submit,button[type=submit]{background-color:rgb(var(--tone-blue-500));border-color:rgb(var(--tone-blue-800));color:rgb(var(--tone-gray-000))}.empty-state div>button:hover:active,.oidc-select button:hover:active:not(.reset),a.type-create:hover:active,button.type-submit:hover:active,button[type=submit]:hover:active{background-color:rgb(var(--tone-blue-700));border-color:rgb(var(--tone-blue-800));color:rgb(var(--tone-gray-000))}.app-view>div form button[type=button].type-delete,.consul-intention-action-warn-modal button.dangerous,.disclosure-menu [aria-expanded]~*>ul>li.dangerous>:first-child,.informed-action>ul>.dangerous>*,.menu-panel>ul>li.dangerous>:first-child,.modal-dialog .type-delete,.more-popover-menu>[type=checkbox]+label+div>ul>li.dangerous>:first-child,.popover-menu>[type=checkbox]+label+div>ul>li.dangerous>:first-child,.with-confirmation .type-delete,table.has-actions tr>.actions>[type=checkbox]+label+div>ul>li.dangerous>:first-child,table.with-details tr>.actions>[type=checkbox]+label+div>ul>li.dangerous>:first-child{background-color:var(--transparent);border-color:rgb(var(--tone-red-500));color:rgb(var(--tone-red-500))}.app-view>div form button[type=button].type-delete:disabled,.consul-intention-action-warn-modal button.dangerous:disabled,.modal-dialog .type-delete:disabled,.with-confirmation .type-delete:disabled{background-color:rgb(var(--tone-red-200));border-color:rgb(var(--tone-gray-400));color:rgb(var(--tone-gray-000))}.app-view>div form button[type=button].type-delete:focus,.app-view>div form button[type=button].type-delete:hover:not(:disabled):not(:active),.consul-intention-action-warn-modal button.dangerous:focus,.consul-intention-action-warn-modal button.dangerous:hover:not(:disabled):not(:active),.disclosure-menu [aria-expanded]~*>ul>li.dangerous>:focus:first-child,.disclosure-menu [aria-expanded]~*>ul>li.dangerous>:hover:first-child,.informed-action>ul>.dangerous>:focus,.informed-action>ul>.dangerous>:hover,.menu-panel>ul>li.dangerous>:focus:first-child,.menu-panel>ul>li.dangerous>:hover:first-child,.modal-dialog .type-delete:focus,.modal-dialog .type-delete:hover:not(:disabled):not(:active),.more-popover-menu>[type=checkbox]+label+div>ul>li.dangerous>:focus:first-child,.more-popover-menu>[type=checkbox]+label+div>ul>li.dangerous>:hover:first-child,.popover-menu>[type=checkbox]+label+div>ul>li.dangerous>:focus:first-child,.popover-menu>[type=checkbox]+label+div>ul>li.dangerous>:hover:first-child,.with-confirmation .type-delete:focus,.with-confirmation .type-delete:hover:not(:disabled):not(:active),table.has-actions tr>.actions>[type=checkbox]+label+div>ul>li.dangerous>:focus:first-child,table.has-actions tr>.actions>[type=checkbox]+label+div>ul>li.dangerous>:hover:first-child,table.with-details tr>.actions>[type=checkbox]+label+div>ul>li.dangerous>:focus:first-child,table.with-details tr>.actions>[type=checkbox]+label+div>ul>li.dangerous>:hover:first-child{background-color:rgb(var(--tone-red-500));border-color:rgb(var(--tone-red-800));color:rgb(var(--tone-gray-000))}.app-view>div form button[type=button].type-delete:hover:active,.consul-intention-action-warn-modal button.dangerous:hover:active,.modal-dialog .type-delete:hover:active,.with-confirmation .type-delete:hover:active{background-color:rgb(var(--tone-red-700));border-color:rgb(var(--tone-red-800));color:rgb(var(--tone-gray-000))}:root.prefers-color-scheme-dark,:root:not(.prefers-color-scheme-dark),[role=banner],[role=banner] nav:first-of-type,[role=banner] nav:last-of-type{--tone-magenta-000:var(--white);--tone-magenta-050:var(--magenta-050);--tone-magenta-100:var(--magenta-100);--tone-magenta-150:var(--magenta-150);--tone-magenta-200:var(--magenta-200);--tone-magenta-300:var(--magenta-300);--tone-magenta-400:var(--magenta-400);--tone-magenta-500:var(--magenta-500);--tone-magenta-600:var(--magenta-600);--tone-magenta-700:var(--magenta-700);--tone-magenta-800:var(--magenta-800);--tone-magenta-850:var(--magenta-850);--tone-magenta-900:var(--magenta-900);--tone-magenta-950:var(--magenta-950);--tone-magenta-999:var(--black);--tone-strawberry-000:var(--white);--tone-strawberry-050:var(--strawberry-050);--tone-strawberry-100:var(--strawberry-100);--tone-strawberry-150:var(--strawberry-150);--tone-strawberry-200:var(--strawberry-200);--tone-strawberry-300:var(--strawberry-300);--tone-strawberry-400:var(--strawberry-400);--tone-strawberry-500:var(--strawberry-500);--tone-strawberry-600:var(--strawberry-600);--tone-strawberry-700:var(--strawberry-700);--tone-strawberry-800:var(--strawberry-800);--tone-strawberry-850:var(--strawberry-850);--tone-strawberry-900:var(--strawberry-900);--tone-strawberry-950:var(--strawberry-950);--tone-strawberry-999:var(--black);--tone-lemon-000:var(--white);--tone-lemon-050:var(--lemon-050);--tone-lemon-100:var(--lemon-100);--tone-lemon-150:var(--lemon-150);--tone-lemon-200:var(--lemon-200);--tone-lemon-300:var(--lemon-300);--tone-lemon-400:var(--lemon-400);--tone-lemon-500:var(--lemon-500);--tone-lemon-600:var(--lemon-600);--tone-lemon-700:var(--lemon-700);--tone-lemon-800:var(--lemon-800);--tone-lemon-850:var(--lemon-850);--tone-lemon-900:var(--lemon-900);--tone-lemon-950:var(--lemon-950);--tone-lemon-999:var(--black)}[role=banner] nav:last-of-type .dangerous button:focus,[role=banner] nav:last-of-type .dangerous button:hover{color:rgb(var(--white))!important}[role=banner] nav:first-of-type .menu-panel a:focus,[role=banner] nav:first-of-type .menu-panel a:hover{background-color:rgb(var(--tone-blue-500))} \ No newline at end of file diff --git a/agent/uiserver/dist/assets/consul-ui-7444626e95c5ba30e9097f92995f0238.js b/agent/uiserver/dist/assets/consul-ui-7444626e95c5ba30e9097f92995f0238.js new file mode 100644 index 00000000000..f965f9a3213 --- /dev/null +++ b/agent/uiserver/dist/assets/consul-ui-7444626e95c5ba30e9097f92995f0238.js @@ -0,0 +1,3938 @@ +"use strict" +define("consul-ui/abilities/acl",["exports","consul-ui/abilities/base","@ember/service"],(function(e,t,n){var l,r,i +function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +let a=(l=(0,n.inject)("env"),r=class extends t.default{constructor(){var e,t,n,l +super(...arguments),e=this,t="env",l=this,(n=i)&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(l):void 0}),o(this,"resource","acl"),o(this,"segmented",!1)}get canAccess(){return!this.env.var("CONSUL_ACLS_ENABLED")||this.canRead}get canRead(){return this.env.var("CONSUL_ACLS_ENABLED")&&super.canRead}get canDuplicate(){return this.env.var("CONSUL_ACLS_ENABLED")&&super.canWrite}get canDelete(){return this.env.var("CONSUL_ACLS_ENABLED")&&"anonymous"!==this.item.ID&&super.canWrite}get canUse(){return this.env.var("CONSUL_ACLS_ENABLED")}},u=r.prototype,s="env",c=[l],d={configurable:!0,enumerable:!0,writable:!0,initializer:null},f={},Object.keys(d).forEach((function(e){f[e]=d[e]})),f.enumerable=!!f.enumerable,f.configurable=!!f.configurable,("value"in f||f.initializer)&&(f.writable=!0),f=c.slice().reverse().reduce((function(e,t){return t(u,s,e)||e}),f),p&&void 0!==f.initializer&&(f.value=f.initializer?f.initializer.call(p):void 0,f.initializer=void 0),void 0===f.initializer&&(Object.defineProperty(u,s,f),f=null),i=f,r) +var u,s,c,d,p,f +e.default=a})),define("consul-ui/abilities/auth-method",["exports","consul-ui/abilities/base","@ember/service"],(function(e,t,n){var l,r,i +function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +let a=(l=(0,n.inject)("env"),r=class extends t.default{constructor(){var e,t,n,l +super(...arguments),e=this,t="env",l=this,(n=i)&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(l):void 0}),o(this,"resource","acl"),o(this,"segmented",!1)}get canRead(){return this.env.var("CONSUL_ACLS_ENABLED")&&super.canRead}get canCreate(){return this.env.var("CONSUL_ACLS_ENABLED")&&super.canCreate}get canDelete(){return this.env.var("CONSUL_ACLS_ENABLED")&&super.canDelete}get canUse(){return this.env.var("CONSUL_SSO_ENABLED")}},u=r.prototype,s="env",c=[l],d={configurable:!0,enumerable:!0,writable:!0,initializer:null},f={},Object.keys(d).forEach((function(e){f[e]=d[e]})),f.enumerable=!!f.enumerable,f.configurable=!!f.configurable,("value"in f||f.initializer)&&(f.writable=!0),f=c.slice().reverse().reduce((function(e,t){return t(u,s,e)||e}),f),p&&void 0!==f.initializer&&(f.value=f.initializer?f.initializer.call(p):void 0,f.initializer=void 0),void 0===f.initializer&&(Object.defineProperty(u,s,f),f=null),i=f,r) +var u,s,c,d,p,f +e.default=a})),define("consul-ui/abilities/base",["exports","@ember/service","@ember/object","ember-can"],(function(e,t,n,l){var r,i,o +function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}Object.defineProperty(e,"__esModule",{value:!0}),e.default=e.ACCESS_LIST=e.ACCESS_WRITE=e.ACCESS_READ=void 0 +const u="read" +e.ACCESS_READ=u +const s="write" +e.ACCESS_WRITE=s +const c="list" +e.ACCESS_LIST=c +let d=(r=(0,t.inject)("repository/permission"),i=class extends l.Ability{constructor(){var e,t,n,l +super(...arguments),e=this,t="permissions",l=this,(n=o)&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(l):void 0}),a(this,"resource",""),a(this,"segmented",!0)}generate(e){return this.permissions.generate(this.resource,e)}generateForSegment(e){return this.segmented?[this.permissions.generate(this.resource,u,e),this.permissions.generate(this.resource,s,e)]:[]}get isLinkable(){return!0}get isNew(){return this.item.isNew}get isPristine(){return this.item.isPristine}get canRead(){if(void 0!==this.item){const e=((0,n.get)(this,"item.Resources")||[]).find((e=>e.Access===u)) +if(e)return e.Allow}return this.permissions.has(this.generate(u))}get canList(){if(void 0!==this.item){const e=((0,n.get)(this,"item.Resources")||[]).find((e=>e.Access===c)) +if(e)return e.Allow}return this.permissions.has(this.generate(c))}get canWrite(){if(void 0!==this.item){const e=((0,n.get)(this,"item.Resources")||[]).find((e=>e.Access===s)) +if(e)return e.Allow}return this.permissions.has(this.generate(s))}get canCreate(){return this.canWrite}get canDelete(){return this.canWrite}get canUpdate(){return this.canWrite}},p=i.prototype,f="permissions",m=[r],h={configurable:!0,enumerable:!0,writable:!0,initializer:null},y={},Object.keys(h).forEach((function(e){y[e]=h[e]})),y.enumerable=!!y.enumerable,y.configurable=!!y.configurable,("value"in y||y.initializer)&&(y.writable=!0),y=m.slice().reverse().reduce((function(e,t){return t(p,f,e)||e}),y),b&&void 0!==y.initializer&&(y.value=y.initializer?y.initializer.call(b):void 0,y.initializer=void 0),void 0===y.initializer&&(Object.defineProperty(p,f,y),y=null),o=y,i) +var p,f,m,h,b,y +e.default=d})),define("consul-ui/abilities/intention",["exports","consul-ui/abilities/base"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +class n extends t.default{constructor(){var e,t,n +super(...arguments),n="intention",(t="resource")in(e=this)?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n}get canWrite(){return(void 0===this.item||void 0===this.item.SourcePeer)&&(super.canWrite&&(void 0===this.item||!this.canViewCRD))}get canViewCRD(){return void 0!==this.item&&this.item.IsManagedByCRD}}e.default=n})),define("consul-ui/abilities/kv",["exports","consul-ui/abilities/base"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +class n extends t.default{constructor(){var e,t,n +super(...arguments),n="key",(t="resource")in(e=this)?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n}generateForSegment(e){let n=super.generateForSegment(e) +return e.endsWith("/")&&(n=n.concat(this.permissions.generate(this.resource,t.ACCESS_LIST,e))),n}get canRead(){return!0}get canList(){return!0}get canWrite(){return!0}}e.default=n})),define("consul-ui/abilities/license",["exports","consul-ui/abilities/base","@ember/service"],(function(e,t,n){var l,r,i +function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +let a=(l=(0,n.inject)("env"),r=class extends t.default{constructor(){var e,t,n,l +super(...arguments),o(this,"resource","operator"),o(this,"segmented",!1),e=this,t="env",l=this,(n=i)&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(l):void 0})}get canRead(){return this.env.var("CONSUL_NSPACES_ENABLED")&&super.canRead}},u=r.prototype,s="env",c=[l],d={configurable:!0,enumerable:!0,writable:!0,initializer:null},f={},Object.keys(d).forEach((function(e){f[e]=d[e]})),f.enumerable=!!f.enumerable,f.configurable=!!f.configurable,("value"in f||f.initializer)&&(f.writable=!0),f=c.slice().reverse().reduce((function(e,t){return t(u,s,e)||e}),f),p&&void 0!==f.initializer&&(f.value=f.initializer?f.initializer.call(p):void 0,f.initializer=void 0),void 0===f.initializer&&(Object.defineProperty(u,s,f),f=null),i=f,r) +var u,s,c,d,p,f +e.default=a})),define("consul-ui/abilities/node",["exports","consul-ui/abilities/base"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +class n extends t.default{constructor(){var e,t,n +super(...arguments),n="node",(t="resource")in(e=this)?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n}}e.default=n})),define("consul-ui/abilities/nspace",["exports","consul-ui/abilities/base","@ember/service"],(function(e,t,n){var l,r,i +function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +let a=(l=(0,n.inject)("env"),r=class extends t.default{constructor(){var e,t,n,l +super(...arguments),e=this,t="env",l=this,(n=i)&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(l):void 0}),o(this,"resource","operator"),o(this,"segmented",!1)}get isLinkable(){return!this.item.DeletedAt}get canManage(){return this.canCreate}get canDelete(){return"default"!==this.item.Name&&super.canDelete}get canChoose(){return this.canUse}get canUse(){return this.env.var("CONSUL_NSPACES_ENABLED")}},u=r.prototype,s="env",c=[l],d={configurable:!0,enumerable:!0,writable:!0,initializer:null},f={},Object.keys(d).forEach((function(e){f[e]=d[e]})),f.enumerable=!!f.enumerable,f.configurable=!!f.configurable,("value"in f||f.initializer)&&(f.writable=!0),f=c.slice().reverse().reduce((function(e,t){return t(u,s,e)||e}),f),p&&void 0!==f.initializer&&(f.value=f.initializer?f.initializer.call(p):void 0,f.initializer=void 0),void 0===f.initializer&&(Object.defineProperty(u,s,f),f=null),i=f,r) +var u,s,c,d,p,f +e.default=a})),define("consul-ui/abilities/overview",["exports","consul-ui/abilities/base","@ember/service"],(function(e,t,n){var l,r,i +function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +let a=(l=(0,n.inject)("env"),r=class extends t.default{constructor(){var e,t,n,l +super(...arguments),e=this,t="env",l=this,(n=i)&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(l):void 0}),o(this,"resource","operator"),o(this,"segmented",!1)}get canAccess(){return!this.env.var("CONSUL_HCP_ENABLED")&&this.canRead}},u=r.prototype,s="env",c=[l],d={configurable:!0,enumerable:!0,writable:!0,initializer:null},f={},Object.keys(d).forEach((function(e){f[e]=d[e]})),f.enumerable=!!f.enumerable,f.configurable=!!f.configurable,("value"in f||f.initializer)&&(f.writable=!0),f=c.slice().reverse().reduce((function(e,t){return t(u,s,e)||e}),f),p&&void 0!==f.initializer&&(f.value=f.initializer?f.initializer.call(p):void 0,f.initializer=void 0),void 0===f.initializer&&(Object.defineProperty(u,s,f),f=null),i=f,r) +var u,s,c,d,p,f +e.default=a})),define("consul-ui/abilities/partition",["exports","consul-ui/abilities/base","@ember/service"],(function(e,t,n){var l,r,i,o,a +function u(e,t,n,l){n&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(l):void 0})}function s(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function c(e,t,n,l,r){var i={} +return Object.keys(l).forEach((function(e){i[e]=l[e]})),i.enumerable=!!i.enumerable,i.configurable=!!i.configurable,("value"in i||i.initializer)&&(i.writable=!0),i=n.slice().reverse().reduce((function(n,l){return l(e,t,n)||n}),i),r&&void 0!==i.initializer&&(i.value=i.initializer?i.initializer.call(r):void 0,i.initializer=void 0),void 0===i.initializer&&(Object.defineProperty(e,t,i),i=null),i}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +let d=(l=(0,n.inject)("env"),r=(0,n.inject)("repository/dc"),i=class extends t.default{constructor(){super(...arguments),u(this,"env",o,this),u(this,"dcs",a,this),s(this,"resource","operator"),s(this,"segmented",!1)}get isLinkable(){return!this.item.DeletedAt}get canManage(){return this.canWrite}get canCreate(){return!(this.dcs.peekAll().length>1)&&super.canCreate}get canDelete(){return"default"!==this.item.Name&&super.canDelete}get canChoose(){return void 0!==this.dc&&(this.canUse&&this.dc.Primary)}get canUse(){return this.env.var("CONSUL_PARTITIONS_ENABLED")}},o=c(i.prototype,"env",[l],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),a=c(i.prototype,"dcs",[r],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),i) +e.default=d})),define("consul-ui/abilities/peer",["exports","consul-ui/abilities/base","@ember/service"],(function(e,t,n){var l,r,i +function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +let a=(l=(0,n.inject)("env"),r=class extends t.default{constructor(){var e,t,n,l +super(...arguments),e=this,t="env",l=this,(n=i)&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(l):void 0}),o(this,"resource","peering"),o(this,"segmented",!1)}get isLinkable(){return this.canDelete}get canDelete(){return!["DELETING"].includes(this.item.State)&&super.canDelete}get canUse(){return this.env.var("CONSUL_PEERINGS_ENABLED")}},u=r.prototype,s="env",c=[l],d={configurable:!0,enumerable:!0,writable:!0,initializer:null},f={},Object.keys(d).forEach((function(e){f[e]=d[e]})),f.enumerable=!!f.enumerable,f.configurable=!!f.configurable,("value"in f||f.initializer)&&(f.writable=!0),f=c.slice().reverse().reduce((function(e,t){return t(u,s,e)||e}),f),p&&void 0!==f.initializer&&(f.value=f.initializer?f.initializer.call(p):void 0,f.initializer=void 0),void 0===f.initializer&&(Object.defineProperty(u,s,f),f=null),i=f,r) +var u,s,c,d,p,f +e.default=a})),define("consul-ui/abilities/permission",["exports","consul-ui/abilities/base"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +class n extends t.default{get canRead(){return this.permissions.permissions.length>0}}e.default=n})),define("consul-ui/abilities/policy",["exports","consul-ui/abilities/base","@ember/service","consul-ui/helpers/policy/typeof"],(function(e,t,n,l){var r,i,o +function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +let u=(r=(0,n.inject)("env"),i=class extends t.default{constructor(){var e,t,n,l +super(...arguments),e=this,t="env",l=this,(n=o)&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(l):void 0}),a(this,"resource","acl"),a(this,"segmented",!1)}get canRead(){return this.env.var("CONSUL_ACLS_ENABLED")&&super.canRead}get canWrite(){return this.env.var("CONSUL_ACLS_ENABLED")&&(void 0===this.item||"policy-management"!==(0,l.typeOf)([this.item]))&&super.canWrite}get canCreate(){return this.env.var("CONSUL_ACLS_ENABLED")&&super.canCreate}get canDelete(){return this.env.var("CONSUL_ACLS_ENABLED")&&(void 0===this.item||"policy-management"!==(0,l.typeOf)([this.item]))&&super.canDelete}},s=i.prototype,c="env",d=[r],p={configurable:!0,enumerable:!0,writable:!0,initializer:null},m={},Object.keys(p).forEach((function(e){m[e]=p[e]})),m.enumerable=!!m.enumerable,m.configurable=!!m.configurable,("value"in m||m.initializer)&&(m.writable=!0),m=d.slice().reverse().reduce((function(e,t){return t(s,c,e)||e}),m),f&&void 0!==m.initializer&&(m.value=m.initializer?m.initializer.call(f):void 0,m.initializer=void 0),void 0===m.initializer&&(Object.defineProperty(s,c,m),m=null),o=m,i) +var s,c,d,p,f,m +e.default=u})),define("consul-ui/abilities/role",["exports","consul-ui/abilities/base","@ember/service"],(function(e,t,n){var l,r,i +function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +let a=(l=(0,n.inject)("env"),r=class extends t.default{constructor(){var e,t,n,l +super(...arguments),e=this,t="env",l=this,(n=i)&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(l):void 0}),o(this,"resource","acl"),o(this,"segmented",!1)}get canRead(){return this.env.var("CONSUL_ACLS_ENABLED")&&super.canRead}get canCreate(){return this.env.var("CONSUL_ACLS_ENABLED")&&super.canCreate}get canDelete(){return this.env.var("CONSUL_ACLS_ENABLED")&&super.canDelete}},u=r.prototype,s="env",c=[l],d={configurable:!0,enumerable:!0,writable:!0,initializer:null},f={},Object.keys(d).forEach((function(e){f[e]=d[e]})),f.enumerable=!!f.enumerable,f.configurable=!!f.configurable,("value"in f||f.initializer)&&(f.writable=!0),f=c.slice().reverse().reduce((function(e,t){return t(u,s,e)||e}),f),p&&void 0!==f.initializer&&(f.value=f.initializer?f.initializer.call(p):void 0,f.initializer=void 0),void 0===f.initializer&&(Object.defineProperty(u,s,f),f=null),i=f,r) +var u,s,c,d,p,f +e.default=a})),define("consul-ui/abilities/server",["exports","consul-ui/abilities/base"],(function(e,t){function n(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +class l extends t.default{constructor(){super(...arguments),n(this,"resource","operator"),n(this,"segmented",!1)}}e.default=l})),define("consul-ui/abilities/service-instance",["exports","consul-ui/abilities/base"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +class n extends t.default{constructor(){var e,t,n +super(...arguments),n="service",(t="resource")in(e=this)?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n}generateForSegment(e){return super.generateForSegment(...arguments).concat([this.permissions.generate("intention",t.ACCESS_READ,e),this.permissions.generate("intention",t.ACCESS_WRITE,e)])}}e.default=n})),define("consul-ui/abilities/session",["exports","consul-ui/abilities/base"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +class n extends t.default{constructor(){var e,t,n +super(...arguments),n="session",(t="resource")in(e=this)?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n}}e.default=n})),define("consul-ui/abilities/token",["exports","consul-ui/abilities/base","@ember/service","consul-ui/helpers/token/is-legacy","consul-ui/helpers/token/is-anonymous"],(function(e,t,n,l,r){var i,o,a +function u(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +let s=(i=(0,n.inject)("env"),o=class extends t.default{constructor(){var e,t,n,l +super(...arguments),e=this,t="env",l=this,(n=a)&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(l):void 0}),u(this,"resource","acl"),u(this,"segmented",!1)}get canRead(){return this.env.var("CONSUL_ACLS_ENABLED")&&super.canRead}get canCreate(){return this.env.var("CONSUL_ACLS_ENABLED")&&super.canCreate}get canDelete(){return this.env.var("CONSUL_ACLS_ENABLED")&&!(0,r.isAnonymous)([this.item])&&this.item.AccessorID!==this.token.AccessorID&&super.canDelete}get canDuplicate(){return this.env.var("CONSUL_ACLS_ENABLED")&&!(0,l.isLegacy)([this.item])&&super.canWrite}},c=o.prototype,d="env",p=[i],f={configurable:!0,enumerable:!0,writable:!0,initializer:null},h={},Object.keys(f).forEach((function(e){h[e]=f[e]})),h.enumerable=!!h.enumerable,h.configurable=!!h.configurable,("value"in h||h.initializer)&&(h.writable=!0),h=p.slice().reverse().reduce((function(e,t){return t(c,d,e)||e}),h),m&&void 0!==h.initializer&&(h.value=h.initializer?h.initializer.call(m):void 0,h.initializer=void 0),void 0===h.initializer&&(Object.defineProperty(c,d,h),h=null),a=h,o) +var c,d,p,f,m,h +e.default=s})),define("consul-ui/abilities/upstream",["exports","consul-ui/abilities/base"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +class n extends t.default{constructor(){var e,t,n +super(...arguments),n="upstream",(t="resource")in(e=this)?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n}get isLinkable(){return this.item.InstanceCount>0}}e.default=n})),define("consul-ui/abilities/zervice",["exports","consul-ui/abilities/base"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +class n extends t.default{constructor(){var e,t,n +super(...arguments),n="service",(t="resource")in(e=this)?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n}get isLinkable(){return this.item.InstanceCount>0}get canReadIntention(){if(void 0===this.item||void 0===this.item.Resources)return!1 +return void 0!==this.item.Resources.find((e=>"intention"===e.Resource&&"read"===e.Access&&!0===e.Allow))}get canWriteIntention(){if(void 0===this.item||void 0===this.item.Resources)return!1 +return void 0!==this.item.Resources.find((e=>"intention"===e.Resource&&"write"===e.Access&&!0===e.Allow))}get canCreateIntention(){return this.canWriteIntention}get canUpdateIntention(){return this.canWriteIntention}}e.default=n})),define("consul-ui/abilities/zone",["exports","consul-ui/abilities/base","@ember/service"],(function(e,t,n){var l,r,i +Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +let o=(l=(0,n.inject)("env"),r=class extends t.default{constructor(){var e,t,n,l +super(...arguments),e=this,t="env",l=this,(n=i)&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(l):void 0})}get canRead(){return this.env.var("CONSUL_NSPACES_ENABLED")}},a=r.prototype,u="env",s=[l],c={configurable:!0,enumerable:!0,writable:!0,initializer:null},p={},Object.keys(c).forEach((function(e){p[e]=c[e]})),p.enumerable=!!p.enumerable,p.configurable=!!p.configurable,("value"in p||p.initializer)&&(p.writable=!0),p=s.slice().reverse().reduce((function(e,t){return t(a,u,e)||e}),p),d&&void 0!==p.initializer&&(p.value=p.initializer?p.initializer.call(d):void 0,p.initializer=void 0),void 0===p.initializer&&(Object.defineProperty(a,u,p),p=null),i=p,r) +var a,u,s,c,d,p +e.default=o})),define("consul-ui/adapters/-json-api",["exports","@ember-data/adapter/json-api"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/adapters/application",["exports","consul-ui/adapters/http","@ember/service"],(function(e,t,n){var l,r,i,o,a +function u(e,t,n,l){n&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(l):void 0})}function s(e,t,n,l,r){var i={} +return Object.keys(l).forEach((function(e){i[e]=l[e]})),i.enumerable=!!i.enumerable,i.configurable=!!i.configurable,("value"in i||i.initializer)&&(i.writable=!0),i=n.slice().reverse().reduce((function(n,l){return l(e,t,n)||n}),i),r&&void 0!==i.initializer&&(i.value=i.initializer?i.initializer.call(r):void 0,i.initializer=void 0),void 0===i.initializer&&(Object.defineProperty(e,t,i),i=null),i}Object.defineProperty(e,"__esModule",{value:!0}),e.default=e.NSPACE_QUERY_PARAM=e.DATACENTER_QUERY_PARAM=void 0 +e.DATACENTER_QUERY_PARAM="dc" +e.NSPACE_QUERY_PARAM="ns" +let c=(l=(0,n.inject)("client/http"),r=(0,n.inject)("env"),i=class extends t.default{constructor(){super(...arguments),u(this,"client",o,this),u(this,"env",a,this)}formatNspace(e){if(this.env.var("CONSUL_NSPACES_ENABLED"))return""!==e?{ns:e}:void 0}formatDatacenter(e){return{dc:e}}},o=s(i.prototype,"client",[l],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),a=s(i.prototype,"env",[r],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),i) +e.default=c})),define("consul-ui/adapters/auth-method",["exports","consul-ui/adapters/application"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +class n extends t.default{requestForQuery(e,t){let{dc:n,ns:l,partition:r,index:i,id:o}=t +return e` + GET /v1/acl/auth-methods?${{dc:n}} + + ${{ns:l,partition:r,index:i}} + `}requestForQueryRecord(e,t){let{dc:n,ns:l,partition:r,index:i,id:o}=t +if(void 0===o)throw new Error("You must specify an id") +return e` + GET /v1/acl/auth-method/${o}?${{dc:n}} + + ${{ns:l,partition:r,index:i}} + `}}e.default=n})),define("consul-ui/adapters/binding-rule",["exports","consul-ui/adapters/application"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +class n extends t.default{requestForQuery(e,t){let{dc:n,ns:l,partition:r,authmethod:i,index:o}=t +return e` + GET /v1/acl/binding-rules?${{dc:n,authmethod:i}} + + ${{ns:l,partition:r,index:o}} + `}}e.default=n})),define("consul-ui/adapters/coordinate",["exports","consul-ui/adapters/application"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +class n extends t.default{requestForQuery(e,t){let{dc:n,partition:l,index:r,uri:i}=t +return e` + GET /v1/coordinate/nodes?${{dc:n}} + X-Request-ID: ${i} + + ${{partition:l,index:r}} + `}}e.default=n})),define("consul-ui/adapters/discovery-chain",["exports","consul-ui/adapters/application"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +class n extends t.default{requestForQueryRecord(e,t){let{dc:n,ns:l,partition:r,index:i,id:o,uri:a}=t +if(void 0===o)throw new Error("You must specify an id") +return e` + GET /v1/discovery-chain/${o}?${{dc:n}} + X-Request-ID: ${a} + + ${{ns:l,partition:r,index:i}} + `}}e.default=n})),define("consul-ui/adapters/http",["exports","@ember/service","@ember-data/adapter","@ember-data/adapter/error"],(function(e,t,n,l){var r,i,o +Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const a=function(e,t,n){let l=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{} +return e.rpc((function(e){for(var t=arguments.length,l=new Array(t>1?t-1:0),r=1;r1?t-1:0),r=1;r1?t-1:0),r=1;r1?t-1:0),r=1;r=500?new l.ServerError(t,r):new l.default(t,r)}}catch(i){n=i}throw n}query(e,t,n){return a(this,t.modelName,"Query",n)}queryRecord(e,t,n){return a(this,t.modelName,"QueryRecord",n)}findAll(e,t){return a(this,t.modelName,"FindAll")}createRecord(e,t,n){return u(this,t.modelName,"CreateRecord",n)}updateRecord(e,t,n){return u(this,t.modelName,"UpdateRecord",n)}deleteRecord(e,t,n){return u(this,t.modelName,"DeleteRecord",n)}},c=i.prototype,d="client",p=[r],f={configurable:!0,enumerable:!0,writable:!0,initializer:null},h={},Object.keys(f).forEach((function(e){h[e]=f[e]})),h.enumerable=!!h.enumerable,h.configurable=!!h.configurable,("value"in h||h.initializer)&&(h.writable=!0),h=p.slice().reverse().reduce((function(e,t){return t(c,d,e)||e}),h),m&&void 0!==h.initializer&&(h.value=h.initializer?h.initializer.call(m):void 0,h.initializer=void 0),void 0===h.initializer&&(Object.defineProperty(c,d,h),h=null),o=h,i) +var c,d,p,f,m,h +e.default=s})),define("consul-ui/adapters/intention",["exports","consul-ui/adapters/application","@ember/object"],(function(e,t,n){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +class l extends t.default{requestForQuery(e,t){let{dc:n,ns:l,partition:r,filter:i,index:o,uri:a}=t +return e` + GET /v1/connect/intentions?${{dc:n}} + X-Request-ID: ${a}${void 0!==i?`\n X-Range: ${i}`:""} + + ${{partition:r,ns:"*",index:o,filter:i}} + `}requestForQueryRecord(e,t){let{dc:n,index:l,id:r}=t +if(void 0===r)throw new Error("You must specify an id") +if(r.match(/^peer:/)){const[t,i,o,a,u,s,c]=r.split(":").map(decodeURIComponent) +return e` + GET /v1/connect/intentions/exact?${{source:`${t}:${i}/${o}/${a}`,destination:`${u}/${s}/${c}`,dc:n}} + Cache-Control: no-store + + ${{index:l}} + `}{const[t,i,o,a,u,s]=r.split(":").map(decodeURIComponent) +return e` + GET /v1/connect/intentions/exact?${{source:`${t}/${i}/${o}`,destination:`${a}/${u}/${s}`,dc:n}} + Cache-Control: no-store + + ${{index:l}} + `}}requestForCreateRecord(e,t,l){const r={SourceName:t.SourceName,DestinationName:t.DestinationName,SourceNS:t.SourceNS,DestinationNS:t.DestinationNS,SourcePartition:t.SourcePartition,DestinationPartition:t.DestinationPartition,SourceType:t.SourceType,Meta:t.Meta,Description:t.Description} +return(0,n.get)(t,"Action.length")?r.Action=t.Action:t.Permissions&&(r.Permissions=t.Permissions),e` + PUT /v1/connect/intentions/exact?${{source:`${l.SourcePartition}/${l.SourceNS}/${l.SourceName}`,destination:`${l.DestinationPartition}/${l.DestinationNS}/${l.DestinationName}`,dc:l.Datacenter}} + + ${r} + `}requestForUpdateRecord(e,t,n){return delete t.DestinationName,delete t.DestinationNS,delete t.DestinationPartition,this.requestForCreateRecord(...arguments)}requestForDeleteRecord(e,t,n){return e` + DELETE /v1/connect/intentions/exact?${{source:`${n.SourcePartition}/${n.SourceNS}/${n.SourceName}`,destination:`${n.DestinationPartition}/${n.DestinationNS}/${n.DestinationName}`,dc:n.Datacenter}} + `}}e.default=l})),define("consul-ui/adapters/kv",["exports","consul-ui/adapters/application","consul-ui/utils/isFolder","consul-ui/utils/keyToArray","consul-ui/models/kv"],(function(e,t,n,l,r){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +class i extends t.default{async requestForQuery(e,t){let{dc:n,ns:r,partition:i,index:o,id:a,separator:u}=t +if(void 0===a)throw new Error("You must specify an id") +const s=await(e` + GET /v1/kv/${(0,l.default)(a)}?${{keys:null,dc:n,separator:u}} + + ${{ns:r,partition:i,index:o}} + `) +return await s(((e,t)=>delete e["x-consul-index"])),s}async requestForQueryRecord(e,t){let{dc:n,ns:r,partition:i,index:o,id:a}=t +if(void 0===a)throw new Error("You must specify an id") +const u=await(e` + GET /v1/kv/${(0,l.default)(a)}?${{dc:n}} + + ${{ns:r,partition:i,index:o}} + `) +return await u(((e,t)=>delete e["x-consul-index"])),u}requestForCreateRecord(e,t,n){const i={dc:n.Datacenter,ns:n.Namespace,partition:n.Partition} +return e` + PUT /v1/kv/${(0,l.default)(n[r.SLUG_KEY])}?${i} + Content-Type: text/plain; charset=utf-8 + + ${t} + `}requestForUpdateRecord(e,t,n){const i={dc:n.Datacenter,ns:n.Namespace,partition:n.Partition,flags:n.Flags} +return e` + PUT /v1/kv/${(0,l.default)(n[r.SLUG_KEY])}?${i} + Content-Type: text/plain; charset=utf-8 + + ${t} + `}requestForDeleteRecord(e,t,i){let o;(0,n.default)(i[r.SLUG_KEY])&&(o=null) +const a={dc:i.Datacenter,ns:i.Namespace,partition:i.Partition,recurse:o} +return e` + DELETE /v1/kv/${(0,l.default)(i[r.SLUG_KEY])}?${a} + `}}e.default=i})) +define("consul-ui/adapters/node",["exports","consul-ui/adapters/application"],(function(e,t){function n(e,t){var n=Object.keys(e) +if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e) +t&&(l=l.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,l)}return n}function l(e){for(var t=1;t({ID:e.ID}))),RoleDefaults:t.ACLs.RoleDefaults.map((e=>({ID:e.ID})))}}} + `}requestForUpdateRecord(e,t,l){return e` + PUT /v1/namespace/${l[n.SLUG_KEY]}?${{dc:l.Datacenter,partition:l.Partition}} + + ${{Description:t.Description,ACLs:{PolicyDefaults:t.ACLs.PolicyDefaults.map((e=>({ID:e.ID}))),RoleDefaults:t.ACLs.RoleDefaults.map((e=>({ID:e.ID})))}}} + `}requestForDeleteRecord(e,t,l){return e` + DELETE /v1/namespace/${l[n.SLUG_KEY]}?${{dc:l.Datacenter,partition:l.Partition}} + `}}e.default=l})),define("consul-ui/adapters/oidc-provider",["exports","consul-ui/adapters/application","@ember/service"],(function(e,t,n){var l,r,i +Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +let o=(l=(0,n.inject)("env"),r=class extends t.default{constructor(){var e,t,n,l +super(...arguments),e=this,t="env",l=this,(n=i)&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(l):void 0})}requestForQuery(e,t){let{dc:n,ns:l,partition:r,index:i,uri:o}=t +return e` + GET /v1/internal/ui/oidc-auth-methods?${{dc:n}} + X-Request-ID: ${o} + + ${{ns:l,partition:r,index:i}} + `}requestForQueryRecord(e,t){let{dc:n,ns:l,partition:r,id:i}=t +if(void 0===i)throw new Error("You must specify an id") +return e` + POST /v1/acl/oidc/auth-url?${{dc:n,ns:l,partition:r}} + Cache-Control: no-store + + ${{AuthMethod:i,RedirectURI:`${this.env.var("CONSUL_BASE_UI_URL")}/oidc/callback`}} + `}requestForAuthorize(e,t){let{dc:n,ns:l,partition:r,id:i,code:o,state:a}=t +if(void 0===i)throw new Error("You must specify an id") +if(void 0===o)throw new Error("You must specify an code") +if(void 0===a)throw new Error("You must specify an state") +return e` + POST /v1/acl/oidc/callback?${{dc:n,ns:l,partition:r}} + Cache-Control: no-store + + ${{AuthMethod:i,Code:o,State:a}} + `}requestForLogout(e,t){let{id:n}=t +if(void 0===n)throw new Error("You must specify an id") +return e` + POST /v1/acl/logout + Cache-Control: no-store + X-Consul-Token: ${n} + `}authorize(e,t,n,l){return this.rpc((function(e,t,n,l){return e.requestForAuthorize(t,n,l)}),(function(e,t,n,l){return e.respondForAuthorize(t,n,l)}),l,t.modelName)}logout(e,t,n,l){return this.rpc((function(e,t,n,l){return e.requestForLogout(t,n,l)}),(function(e,t,n,l){return{}}),l,t.modelName)}},a=r.prototype,u="env",s=[l],c={configurable:!0,enumerable:!0,writable:!0,initializer:null},p={},Object.keys(c).forEach((function(e){p[e]=c[e]})),p.enumerable=!!p.enumerable,p.configurable=!!p.configurable,("value"in p||p.initializer)&&(p.writable=!0),p=s.slice().reverse().reduce((function(e,t){return t(a,u,e)||e}),p),d&&void 0!==p.initializer&&(p.value=p.initializer?p.initializer.call(d):void 0,p.initializer=void 0),void 0===p.initializer&&(Object.defineProperty(a,u,p),p=null),i=p,r) +var a,u,s,c,d,p +e.default=o})),define("consul-ui/adapters/partition",["exports","consul-ui/adapters/application","consul-ui/models/partition"],(function(e,t,n){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +class l extends t.default{async requestForQuery(e,t){let{ns:n,dc:l,index:r}=t +const i=await(e` + GET /v1/partitions?${{dc:l}} + + ${{index:r}} + `) +return await i(((e,t)=>delete e["x-consul-index"])),i}async requestForQueryRecord(e,t){let{ns:n,dc:l,index:r,id:i}=t +if(void 0===i)throw new Error("You must specify an id") +const o=await(e` + GET /v1/partition/${i}?${{dc:l}} + + ${{index:r}} + `) +return await o(((e,t)=>delete e["x-consul-index"])),o}async requestForCreateRecord(e,t,l){return e` + PUT /v1/partition/${l[n.SLUG_KEY]}?${{dc:l.Datacenter}} + + ${{Name:t.Name,Description:t.Description}} + `}async requestForUpdateRecord(e,t,l){return e` + PUT /v1/partition/${l[n.SLUG_KEY]}?${{dc:l.Datacenter}} + + ${{Description:t.Description}} + `}async requestForDeleteRecord(e,t,l){return e` + DELETE /v1/partition/${l[n.SLUG_KEY]}?${{dc:l.Datacenter}} + `}}e.default=l})),define("consul-ui/adapters/permission",["exports","consul-ui/adapters/application","@ember/service"],(function(e,t,n){var l,r,i,o,a +function u(e,t){var n=Object.keys(e) +if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e) +t&&(l=l.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,l)}return n}function s(e){for(var t=1;ts(s({},e),{},{Namespace:l})))),this.env.var("CONSUL_PARTITIONS_ENABLED")&&(i=i.map((e=>s(s({},e),{},{Partition:r})))),e` + POST /v1/internal/acl/authorize?${{dc:n}} + + ${i} + `}authorize(e,t,n,l){return this.rpc((async(e,t,n,l)=>{const r=this.env.var("CONSUL_NSPACES_ENABLED"),i=this.env.var("CONSUL_PARTITIONS_ENABLED") +if(r||i){const e=await this.settings.findBySlug("token") +r&&(void 0!==n.ns&&0!==n.ns.length||(n.ns=e.Namespace)),i&&(void 0!==n.partition&&0!==n.partition.length||(n.partition=e.Partition))}return e.requestForAuthorize(t,n)}),(function(e,t,n,l){return t((function(e,t){return t}))}),l,t.modelName)}},o=p(i.prototype,"env",[l],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),a=p(i.prototype,"settings",[r],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),i) +e.default=f})),define("consul-ui/adapters/policy",["exports","consul-ui/adapters/application","consul-ui/models/policy"],(function(e,t,n){function l(e,t){var n=Object.keys(e) +if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e) +t&&(l=l.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,l)}return n}function r(e){for(var t=1;tdelete e["x-consul-index"])),a}requestForCreateRecord(e,t,n){return e` + PUT /v1/acl/token?${u(u({},this.formatDatacenter(n.Datacenter)),{},{ns:n.Namespace,partition:n.Partition})} + + ${{Description:t.Description,Policies:t.Policies,Roles:t.Roles,ServiceIdentities:t.ServiceIdentities,NodeIdentities:t.NodeIdentities,Local:t.Local}} + `}requestForUpdateRecord(e,t,n){if(void 0!==n.Rules)return e` + PUT /v1/acl/update?${this.formatDatacenter(n.Datacenter)} + + ${t} + ` +const r=u(u({},this.formatDatacenter(n.Datacenter)),{},{ns:n.Namespace,partition:n.Partition}) +return e` + PUT /v1/acl/token/${n[l.SLUG_KEY]}?${r} + + ${{Description:t.Description,Policies:t.Policies,Roles:t.Roles,ServiceIdentities:t.ServiceIdentities,NodeIdentities:t.NodeIdentities,Local:t.Local}} + `}requestForDeleteRecord(e,t,n){const r={dc:n.Datacenter,ns:n.Namespace,partition:n.Partition} +return e` + DELETE /v1/acl/token/${n[l.SLUG_KEY]}?${r} + `}requestForSelf(e,t,n){let{dc:l,index:r,secret:i}=n +return e` + GET /v1/acl/token/self?${{dc:l}} + X-Consul-Token: ${i} + Cache-Control: no-store + + ${{index:r}} + `}requestForCloneRecord(e,t,n){const r=n[l.SLUG_KEY] +if(void 0===r)throw new Error("You must specify an id") +return e` + PUT /v1/acl/token/${r}/clone?${{dc:n.Datacenter,ns:n.Namespace,partition:n.Partition}} + `}self(e,t,n,l){return this.rpc((function(e,t,n,l){return e.requestForSelf(t,n,l)}),(function(e,t,n,l){return e.respondForSelf(t,n,l)}),l,t.modelName)}clone(e,t,n,l){return this.rpc((function(e,t,n,l){return e.requestForCloneRecord(t,n,l)}),((e,t,n,l)=>{const r={dc:l.Datacenter,ns:l.Namespace,partition:l.Partition} +return e.respondForQueryRecord(t,r)}),l,t.modelName)}},d=i.prototype,p="store",f=[r],m={configurable:!0,enumerable:!0,writable:!0,initializer:null},b={},Object.keys(m).forEach((function(e){b[e]=m[e]})),b.enumerable=!!b.enumerable,b.configurable=!!b.configurable,("value"in b||b.initializer)&&(b.writable=!0),b=f.slice().reverse().reduce((function(e,t){return t(d,p,e)||e}),b),h&&void 0!==b.initializer&&(b.value=b.initializer?b.initializer.call(h):void 0,b.initializer=void 0),void 0===b.initializer&&(Object.defineProperty(d,p,b),b=null),o=b,i) +var d,p,f,m,h,b +e.default=c})),define("consul-ui/adapters/topology",["exports","consul-ui/adapters/application"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +class n extends t.default{requestForQueryRecord(e,t){let{dc:n,ns:l,partition:r,kind:i,index:o,id:a,uri:u}=t +if(void 0===a)throw new Error("You must specify an id") +return e` + GET /v1/internal/ui/service-topology/${a}?${{dc:n,kind:i}} + X-Request-ID: ${u} + + ${{ns:l,partition:r,index:o}} + `}}e.default=n})),define("consul-ui/app",["exports","@ember/application","ember-resolver","ember-load-initializers","consul-ui/config/environment"],(function(e,t,n,l,r){function i(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +class o extends t.default{constructor(){super(...arguments),i(this,"modulePrefix",r.default.modulePrefix),i(this,"podModulePrefix",r.default.podModulePrefix),i(this,"Resolver",n.default)}}e.default=o,(0,l.default)(o,r.default.modulePrefix)})),define("consul-ui/component-managers/glimmer",["exports","@glimmer/component/-private/ember-component-manager"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/components/-dynamic-element-alt",["exports","@ember/component"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +var n=t.default.extend() +e.default=n})),define("consul-ui/components/-dynamic-element",["exports","@ember/component"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +var n=t.default.extend() +e.default=n})),define("consul-ui/components/action/index",["exports","@ember/component","@ember/template-factory","@ember/component/template-only"],(function(e,t,n,l){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const r=(0,n.createTemplateFactory)({id:"YwHFpVZ2",block:'[[[41,[30,1],[[[11,"label"],[16,"for",[30,1]],[17,2],[12],[18,8,null],[13]],[]],[[[41,[30,3],[[[41,[30,4],[[[11,3],[16,6,[30,3]],[24,"target","_blank"],[24,"rel","noopener noreferrer"],[17,2],[12],[18,8,null],[13]],[]],[[[11,3],[16,6,[30,3]],[17,2],[12],[18,8,null],[13]],[]]]],[]],[[[11,"button"],[16,4,[28,[37,2],[[30,5],"button"],null]],[16,"tabindex",[30,6]],[17,2],[4,[38,3],["click",[28,[37,4],[[30,7]],null]],null],[12],[18,8,null],[13]],[]]]],[]]]],["@for","&attrs","@href","@external","@type","@tabindex","@onclick","&default"],false,["if","yield","or","on","optional"]]',moduleName:"consul-ui/components/action/index.hbs",isStrictMode:!1}) +var i=(0,t.setComponentTemplate)(r,(0,l.default)()) +e.default=i})),define("consul-ui/components/anonymous/index",["exports","@ember/component","@ember/template-factory"],(function(e,t,n){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const l=(0,n.createTemplateFactory)({id:"RdtQ4WaT",block:'[[[18,1,null]],["&default"],false,["yield"]]',moduleName:"consul-ui/components/anonymous/index.hbs",isStrictMode:!1}) +var r=(0,t.setComponentTemplate)(l,t.default.extend({tagName:""})) +e.default=r})),define("consul-ui/components/app-error/index",["exports","@ember/component","@ember/template-factory","@ember/component/template-only"],(function(e,t,n,l){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const r=(0,n.createTemplateFactory)({id:"4rDG/Mn1",block:'[[[8,[39,0],null,null,[["default"],[[[[1,"\\n "],[8,[39,1],null,[["@name"],["header"]],[["default"],[[[[1,"\\n "],[10,"h1"],[12],[1,"\\n Error "],[1,[30,1,["status"]]],[1,"\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,1],null,[["@name"],["content"]],[["default"],[[[[1,"\\n "],[8,[39,2],null,[["@error","@login"],[[30,1],[52,[28,[37,4],[[30,1,["status"]],"403"],null],[30,2]]]],null],[1,"\\n "]],[]]]]],[1,"\\n"]],[]]]]],[1,"\\n"]],["@error","@login"],false,["app-view","block-slot","error-state","if","eq"]]',moduleName:"consul-ui/components/app-error/index.hbs",isStrictMode:!1}) +var i=(0,t.setComponentTemplate)(r,(0,l.default)()) +e.default=i})),define("consul-ui/components/app-view/index",["exports","@ember/component","@ember/template-factory","block-slots"],(function(e,t,n,l){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const r=(0,n.createTemplateFactory)({id:"JJpdEf6u",block:'[[[11,0],[24,0,"app-view"],[17,1],[12],[1,"\\n "],[18,2,null],[1,"\\n "],[10,"header"],[12],[1,"\\n "],[10,0],[12],[1,"\\n "],[10,0],[12],[1,"\\n "],[10,"nav"],[14,"aria-label","Breadcrumb"],[12],[1,"\\n "],[8,[39,1],null,[["@name"],["breadcrumbs"]],[["default"],[[[[1,"\\n "],[1,[28,[35,2],null,[["class"],["with-breadcrumbs"]]]],[1,"\\n "],[18,2,null],[1,"\\n "]],[]]]]],[1,"\\n "],[13],[1,"\\n "],[10,0],[14,0,"title"],[12],[1,"\\n "],[10,0],[14,0,"title-left-container"],[12],[1,"\\n "],[8,[39,1],null,[["@name"],["header"]],[["default"],[[[[1,"\\n "],[18,2,null],[1,"\\n "]],[]]]]],[1,"\\n "],[13],[1,"\\n "],[10,0],[14,0,"actions"],[12],[1,"\\n "],[8,[39,1],null,[["@name"],["actions"]],[["default"],[[[[1,"\\n "],[8,[39,3],null,[["@name"],["app-view-actions"]],null],[1,"\\n "],[18,2,null],[1,"\\n "]],[]]]]],[1,"\\n "],[13],[1,"\\n "],[13],[1,"\\n "],[8,[39,1],null,[["@name"],["nav"]],[["default"],[[[[1,"\\n "],[18,2,null],[1,"\\n "]],[]]]]],[1,"\\n "],[13],[1,"\\n "],[13],[1,"\\n "],[8,[39,1],null,[["@name"],["toolbar"]],[["default"],[[[[1,"\\n "],[10,"input"],[14,1,"toolbar-toggle"],[14,4,"checkbox"],[12],[13],[1,"\\n "],[18,2,null],[1,"\\n "]],[]]]]],[1,"\\n "],[13],[1,"\\n "],[10,0],[12],[1,"\\n "],[8,[39,1],null,[["@name"],["content"]],[["default"],[[[[18,2,null]],[]]]]],[1,"\\n "],[13],[1,"\\n"],[13],[1,"\\n"]],["&attrs","&default"],false,["yield","yield-slot","document-attrs","portal-target"]]',moduleName:"consul-ui/components/app-view/index.hbs",isStrictMode:!1}) +var i=(0,t.setComponentTemplate)(r,t.default.extend(l.default,{tagName:""})) +e.default=i})),define("consul-ui/components/app/index",["exports","@ember/component","@ember/template-factory","@glimmer/component","@ember/service","@ember/object"],(function(e,t,n,l,r,i){var o,a,u +function s(e,t,n,l,r){var i={} +return Object.keys(l).forEach((function(e){i[e]=l[e]})),i.enumerable=!!i.enumerable,i.configurable=!!i.configurable,("value"in i||i.initializer)&&(i.writable=!0),i=n.slice().reverse().reduce((function(n,l){return l(e,t,n)||n}),i),r&&void 0!==i.initializer&&(i.value=i.initializer?i.initializer.call(r):void 0,i.initializer=void 0),void 0===i.initializer&&(Object.defineProperty(e,t,i),i=null),i}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const c=(0,n.createTemplateFactory)({id:"OX4Ky14Q",block:'[[[44,[[28,[37,1],null,[["main","Notification"],[[28,[37,2],[[33,3],"-main"],null],[50,"app/notification",0,null,null]]]]],[[[1,"\\n"],[11,0],[24,0,"app"],[17,2],[12],[1,"\\n\\n "],[11,0],[24,0,"skip-links"],[4,[38,5],["click",[30,0,["focus"]]],null],[12],[1,"\\n "],[8,[39,6],null,[["@name","@multiple"],["app-before-skip-links",true]],[["default"],[[[],[]]]]],[1,"\\n "],[10,3],[15,6,[28,[37,2],["#",[30,1,["main"]]],null]],[12],[1,[28,[35,7],["components.app.skip_to_content"],null]],[13],[1,"\\n"],[1," "],[8,[39,6],null,[["@name","@multiple"],["app-after-skip-links",true]],[["default"],[[[],[]]]]],[1,"\\n "],[13],[1,"\\n\\n "],[8,[39,8],null,null,null],[1,"\\n\\n "],[10,"input"],[15,1,[28,[37,2],[[33,3],"-main-nav-toggle"],null]],[14,4,"checkbox"],[12],[13],[1,"\\n "],[10,"header"],[14,"role","banner"],[12],[1,"\\n "],[11,"label"],[24,"tabindex","0"],[16,"for",[28,[37,2],[[33,3],"-main-nav-toggle"],null]],[16,"aria-label",[28,[37,7],["components.app.toggle_menu"],null]],[4,[38,5],["keypress",[30,0,["keypressClick"]]],null],[4,[38,5],["mouseup",[30,0,["unfocus"]]],null],[12],[13],[1,"\\n "],[18,3,[[30,1]]],[1,"\\n "],[10,0],[12],[1,"\\n"],[1," "],[11,"nav"],[16,"aria-label",[28,[37,7],["components.app.main"],null]],[16,0,[52,[30,0,["navInViewport"]],"in-viewport"]],[4,[38,11],null,[["onEnter","onExit","viewportTolerance"],[[28,[37,12],[[30,0],"navInViewport",true],null],[28,[37,12],[[30,0],"navInViewport",false],null],[28,[37,1],null,[["top","bottom","left","right"],[-10,-10,-10,-10]]]]]],[12],[1,"\\n "],[18,4,[[30,1]]],[1,"\\n "],[13],[1,"\\n"],[1," "],[10,"nav"],[15,"aria-label",[28,[37,7],["components.app.complementary"],null]],[12],[1,"\\n "],[18,5,[[30,1]]],[1,"\\n "],[13],[1,"\\n\\n "],[13],[1,"\\n "],[13],[1,"\\n "],[10,"main"],[15,1,[28,[37,2],[[33,3],"-main"],null]],[12],[1,"\\n "],[10,0],[14,0,"notifications"],[12],[1,"\\n "],[18,6,[[30,1]]],[1,"\\n "],[8,[39,6],null,[["@name","@multiple"],["app-notifications",true]],[["default"],[[[],[]]]]],[1,"\\n "],[13],[1,"\\n "],[18,7,[[30,1]]],[1,"\\n "],[13],[1,"\\n "],[10,"footer"],[14,"role","contentinfo"],[12],[1,"\\n "],[18,8,[[30,1]]],[1,"\\n "],[13],[1,"\\n"],[13],[1,"\\n\\n"]],[1]]]],["exported","&attrs","&home-nav","&main-nav","&complementary-nav","¬ifications","&main","&content-info"],false,["let","hash","concat","guid","component","on","portal-target","t","modal-layer","yield","if","in-viewport","set"]]',moduleName:"consul-ui/components/app/index.hbs",isStrictMode:!1}) +let d=(o=(0,r.inject)("dom"),a=class extends l.default{constructor(e,t){var n,l,r,i +super(...arguments),n=this,l="dom",i=this,(r=u)&&Object.defineProperty(n,l,{enumerable:r.enumerable,configurable:r.configurable,writable:r.writable,value:r.initializer?r.initializer.call(i):void 0}),this.guid=this.dom.guid(this)}keypressClick(e){e.target.dispatchEvent(new MouseEvent("click"))}focus(e){const t=e.target.getAttribute("href") +t.startsWith("#")&&(e.preventDefault(),this.dom.focus(t))}unfocus(e){e.target.blur()}},u=s(a.prototype,"dom",[o],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),s(a.prototype,"keypressClick",[i.action],Object.getOwnPropertyDescriptor(a.prototype,"keypressClick"),a.prototype),s(a.prototype,"focus",[i.action],Object.getOwnPropertyDescriptor(a.prototype,"focus"),a.prototype),s(a.prototype,"unfocus",[i.action],Object.getOwnPropertyDescriptor(a.prototype,"unfocus"),a.prototype),a) +e.default=d,(0,t.setComponentTemplate)(c,d)})),define("consul-ui/components/app/notification/index",["exports","@ember/component","@ember/template-factory","@ember/component/template-only"],(function(e,t,n,l){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const r=(0,n.createTemplateFactory)({id:"OwV217Ed",block:'[[[11,0],[24,0,"app-notification"],[17,1],[4,[38,0],[[28,[37,1],[[28,[37,1],["opacity","1"],null],[28,[37,1],["transition-delay",[28,[37,2],[[30,2],"ms"],null]],null]],null]],null],[4,[38,0],[[28,[37,1],[[28,[37,1],["opacity",[52,[30,3],"1","0"]],null]],null]],[["delay"],[0]]],[12],[1,"\\n "],[18,4,null],[1,"\\n"],[13],[1,"\\n\\n"]],["&attrs","@delay","@sticky","&default"],false,["style","array","concat","if","yield"]]',moduleName:"consul-ui/components/app/notification/index.hbs",isStrictMode:!1}) +var i=(0,t.setComponentTemplate)(r,(0,l.default)()) +e.default=i})),define("consul-ui/components/aria-menu/index",["exports","@ember/component","@ember/template-factory","@ember/service","@ember/object","@ember/runloop"],(function(e,t,n,l,r,i){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const o=(0,n.createTemplateFactory)({id:"W/2RN9qq",block:'[[[18,1,[[28,[37,1],[[30,0],"change"],null],[28,[37,1],[[30,0],"keypress"],null],[28,[37,1],[[30,0],"keypressClick"],null],[28,[37,2],null,[["labelledBy","controls","expanded"],[[28,[37,3],["component-aria-menu-trigger-",[33,4]],null],[28,[37,3],["component-aria-menu-menu-",[33,4]],null],[52,[33,6],"true",[27]]]]]]]],["&default"],false,["yield","action","hash","concat","guid","if","expanded"]]',moduleName:"consul-ui/components/aria-menu/index.hbs",isStrictMode:!1}),a=13,u=32,s=38,c=40,d={vertical:{[c]:function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:-1 +return(t+1)%e.length},[s]:function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0 +return 0===t?e.length-1:t-1},36:function(e,t){return 0},35:function(e,t){return e.length-1}},horizontal:{}},p='[role^="menuitem"]' +var f=(0,t.setComponentTemplate)(o,t.default.extend({tagName:"",dom:(0,l.inject)("dom"),guid:"",expanded:!1,orientation:"vertical",keyboardAccess:!0,init:function(){this._super(...arguments),(0,r.set)(this,"guid",this.dom.guid(this)),this._listeners=this.dom.listeners(),this._routelisteners=this.dom.listeners()},didInsertElement:function(){this.$menu=this.dom.element(`#component-aria-menu-menu-${this.guid}`) +const e=this.$menu.getAttribute("aria-labelledby") +this.$trigger=this.dom.element(`#${e}`)},willDestroyElement:function(){this._super(...arguments),this._listeners.remove(),this._routelisteners.remove()},actions:{keypressClick:function(e){e.target.dispatchEvent(new MouseEvent("click"))},keypress:function(e){if(![a,u,s,c].includes(e.keyCode))return +e.stopPropagation() +const t=[...this.dom.elements(p,this.$menu)] +if(e.keyCode===a||e.keyCode===u){let e=this.expanded?void 0:t[0];(0,i.next)((()=>{e=this.expanded?e:this.$trigger,void 0!==e&&e.focus()}))}if(void 0===d[this.orientation][e.keyCode])return +e.preventDefault() +const n=this.dom.element(`${p}:focus`,this.$menu) +let l +n&&(l=t.findIndex((function(e){return e===n}))) +t[d[this.orientation][e.keyCode](t,l)].focus()},change:function(e){e.target.checked?this.actions.open.apply(this,[e]):this.actions.close.apply(this,[e])},close:function(e){this._listeners.remove(),(0,r.set)(this,"expanded",!1),(0,i.next)((()=>{this.$trigger.removeAttribute("tabindex")}))},open:function(e){(0,r.set)(this,"expanded",!0) +0===[...this.dom.elements(p,this.$menu)].length&&this.dom.element('input[type="checkbox"]',this.$menu.parentElement).dispatchEvent(new MouseEvent("click")),this.$trigger.setAttribute("tabindex","-1"),this._listeners.add(this.dom.document(),{keydown:e=>{27===e.keyCode&&this.$trigger.focus(),9!==e.keyCode&&27!==e.keyCode?this.keyboardAccess&&this.actions.keypress.apply(this,[e]):this.$trigger.dispatchEvent(new MouseEvent("click"))}})}}})) +e.default=f})),define("consul-ui/components/auth-dialog/chart.xstate",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +e.default={id:"auth-dialog",initial:"idle",on:{CHANGE:[{target:"authorized",cond:"hasToken",actions:["login"]},{target:"unauthorized",actions:["logout"]}]},states:{idle:{on:{CHANGE:[{target:"authorized",cond:"hasToken"},{target:"unauthorized"}]}},unauthorized:{},authorized:{}}}})),define("consul-ui/components/auth-dialog/index",["exports","@ember/component","@ember/template-factory","@glimmer/component","@ember/service","@ember/object","consul-ui/components/auth-dialog/chart.xstate"],(function(e,t,n,l,r,i,o){var a,u,s +function c(e,t,n,l,r){var i={} +return Object.keys(l).forEach((function(e){i[e]=l[e]})),i.enumerable=!!i.enumerable,i.configurable=!!i.configurable,("value"in i||i.initializer)&&(i.writable=!0),i=n.slice().reverse().reduce((function(n,l){return l(e,t,n)||n}),i),r&&void 0!==i.initializer&&(i.value=i.initializer?i.initializer.call(r):void 0,i.initializer=void 0),void 0===i.initializer&&(Object.defineProperty(e,t,i),i=null),i}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const d=(0,n.createTemplateFactory)({id:"Nh7efm+X",block:'[[[8,[39,0],null,[["@src"],[[99,1,["@src"]]]],[["default"],[[[[1,"\\n\\n "],[8,[30,2],null,[["@name","@cond"],["hasToken",[28,[37,2],[[30,0],"hasToken"],null]]],null],[1,"\\n "],[8,[30,3],null,[["@name","@exec"],["login",[28,[37,2],[[30,0],"login"],null]]],null],[1,"\\n "],[8,[30,3],null,[["@name","@exec"],["logout",[28,[37,2],[[30,0],"logout"],null]]],null],[1,"\\n\\n"],[1," "],[8,[39,3],null,[["@src","@onchange"],[[30,6],[28,[37,4],[[28,[37,2],[[30,0],[28,[37,5],[[33,6]],null]],[["value"],["data"]]],[28,[37,2],[[30,0],[30,4],"CHANGE"],null],[28,[37,2],[[30,0],[28,[37,5],[[33,7]],null]],[["value"],["data"]]]],null]]],null],[1,"\\n"],[1," "],[8,[39,8],null,[["@sink"],[[30,7]]],[["default"],[[[[1,"\\n"],[44,[[28,[37,10],null,[["login","logout","token"],[[28,[37,2],[[30,0],[30,8,["open"]]],null],[28,[37,2],[[30,0],[30,8,["open"]],null],null],[33,6]]]]],[[[1,"\\n "],[8,[30,1],null,[["@matches"],["authorized"]],[["default"],[[[[1,"\\n "],[18,10,[[30,9]]],[1,"\\n "]],[]]]]],[1,"\\n\\n "],[8,[30,1],null,[["@matches"],["unauthorized"]],[["default"],[[[[1,"\\n "],[18,11,[[30,9]]],[1,"\\n "]],[]]]]],[1,"\\n\\n"]],[9]]],[1," "]],[8]]]]],[1,"\\n"]],[1,2,3,4,5]]]]],[1,"\\n"]],["State","Guard","Action","dispatch","state","@src","@sink","sink","api","&authorized","&unauthorized"],false,["state-chart","chart","action","data-source","queue","mut","token","previousToken","data-sink","let","hash","yield"]]',moduleName:"consul-ui/components/auth-dialog/index.hbs",isStrictMode:!1}) +let p=(a=(0,r.inject)("repository/oidc-provider"),u=class extends l.default{constructor(){var e,t,n,l +super(...arguments),e=this,t="repo",l=this,(n=s)&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(l):void 0}),this.chart=o.default}hasToken(){return void 0!==this.token.AccessorID}login(){let e=(0,i.get)(this,"previousToken.AccessorID"),t=(0,i.get)(this,"token.AccessorID") +null===e&&(e=(0,i.get)(this,"previousToken.SecretID")),null===t&&(t=(0,i.get)(this,"token.SecretID")) +let n="authorize" +void 0!==e&&e!==t&&(n="use"),this.args.onchange({data:(0,i.get)(this,"token"),type:n})}logout(){void 0!==(0,i.get)(this,"previousToken.AuthMethod")&&this.repo.logout((0,i.get)(this,"previousToken.SecretID")),this.previousToken=null,this.args.onchange({data:null,type:"logout"})}},s=c(u.prototype,"repo",[a],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),c(u.prototype,"hasToken",[i.action],Object.getOwnPropertyDescriptor(u.prototype,"hasToken"),u.prototype),c(u.prototype,"login",[i.action],Object.getOwnPropertyDescriptor(u.prototype,"login"),u.prototype),c(u.prototype,"logout",[i.action],Object.getOwnPropertyDescriptor(u.prototype,"logout"),u.prototype),u) +e.default=p,(0,t.setComponentTemplate)(d,p)})),define("consul-ui/components/auth-form/chart.xstate",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +e.default={id:"auth-form",initial:"idle",on:{RESET:[{target:"idle"}],ERROR:[{target:"error"}]},states:{idle:{entry:["clearError"],on:{SUBMIT:[{target:"loading",cond:"hasValue"},{target:"error"}]}},loading:{},error:{exit:["clearError"],on:{TYPING:[{target:"idle"}],SUBMIT:[{target:"loading",cond:"hasValue"},{target:"error"}]}}}}})),define("consul-ui/components/auth-form/index",["exports","@ember/component","@ember/template-factory","@glimmer/component","@ember/object","consul-ui/components/auth-form/chart.xstate","consul-ui/components/auth-form/tabs.xstate"],(function(e,t,n,l,r,i,o){var a +function u(e,t,n,l,r){var i={} +return Object.keys(l).forEach((function(e){i[e]=l[e]})),i.enumerable=!!i.enumerable,i.configurable=!!i.configurable,("value"in i||i.initializer)&&(i.writable=!0),i=n.slice().reverse().reduce((function(n,l){return l(e,t,n)||n}),i),r&&void 0!==i.initializer&&(i.value=i.initializer?i.initializer.call(r):void 0,i.initializer=void 0),void 0===i.initializer&&(Object.defineProperty(e,t,i),i=null),i}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const s=(0,n.createTemplateFactory)({id:"35JQNcNu",block:'[[[8,[39,0],null,[["@src"],[[30,0,["chart"]]]],[["default"],[[[[1,"\\n"],[44,[[28,[37,2],null,[["State","Guard","Action","dispatch","state"],[[30,1],[30,2],[30,3],[30,4],[30,5]]]]],[[[44,[[28,[37,2],null,[["reset","focus","disabled","error","submit"],[[28,[37,3],[[30,0],[30,4],"RESET"],null],[30,0,["focus"]],[28,[37,4],[[30,5],"loading"],null],[28,[37,5],[[28,[37,3],[[30,0],[30,4],"ERROR"],null],[28,[37,3],[[30,0],[28,[37,6],[[30,0,["error"]]],null]],[["value"],["error.errors.firstObject"]]]],null],[28,[37,5],[[28,[37,3],[[30,0],[28,[37,6],[[30,0,["value"]]],null]],null],[28,[37,3],[[30,0],[30,4],"SUBMIT"],null]],null]]]]],[[[1," "],[8,[30,2],null,[["@name","@cond"],["hasValue",[30,0,["hasValue"]]]],null],[1,"\\n"],[1," "],[8,[30,6,["Action"]],null,[["@name","@exec"],["clearError",[28,[37,5],[[28,[37,3],[[30,0],[28,[37,6],[[30,0,["error"]]],null],[27]],null],[28,[37,3],[[30,0],[28,[37,6],[[30,0,["secret"]]],null],[27]],null]],null]]],null],[1,"\\n "],[11,0],[24,0,"auth-form"],[17,8],[12],[1,"\\n "],[8,[39,0],null,[["@src"],[[30,0,["tabsChart"]]]],[["default"],[[[[1,"\\n"],[41,[28,[37,8],["use SSO"],null],[[[1," "],[8,[39,9],null,[["@items","@onclick"],[[28,[37,10],[[28,[37,2],null,[["label","selected"],["Token",[28,[37,4],[[30,13],"token"],null]]]],[28,[37,2],null,[["label","selected"],["SSO",[28,[37,4],[[30,13],"sso"],null]]]]],null],[28,[37,5],[[28,[37,3],[[30,0],[30,12]],null],[28,[37,3],[[30,0],[30,4],"RESET"],null]],null]]],null],[1,"\\n"]],[]],null],[1," "],[8,[30,1],null,[["@matches"],["error"]],[["default"],[[[[1,"\\n"],[41,[30,0,["error","status"]],[[[1," "],[8,[39,11],[[24,0,"mb-1 mt-2"]],[["@type","@color"],["inline","critical"]],[["default"],[[[[1,"\\n "],[8,[30,14,["Title"]],null,null,[["default"],[[[[1,"\\n"],[41,[30,0,["value","Name"]],[[[41,[28,[37,12],[[30,0,["error","status"]],"403"],null],[[[1," Consul login failed\\n"]],[]],[[[41,[28,[37,12],[[30,0,["error","status"]],"401"],null],[[[1," Could not log in to provider\\n"]],[]],[[[41,[28,[37,12],[[30,0,["error","status"]],"499"],null],[[[1," SSO log in window closed\\n"]],[]],[[[1," Error\\n "]],[]]]],[]]]],[]]]],[]],[[[41,[28,[37,12],[[30,0,["error","status"]],"403"],null],[[[1," Invalid token\\n"]],[]],[[[41,[28,[37,12],[[30,0,["error","status"]],"404"],null],[[[1," No providers\\n"]],[]],[[[1," Error\\n "]],[]]]],[]]]],[]]],[1," "]],[]]]]],[1,"\\n "],[8,[30,14,["Description"]],null,null,[["default"],[[[[1,"\\n"],[41,[30,0,["value","Name"]],[[[41,[28,[37,12],[[30,0,["error","status"]],"403"],null],[[[1," We received a token from your OIDC provider but could not log in to Consul\\n with it.\\n"]],[]],[[[41,[28,[37,12],[[30,0,["error","status"]],"401"],null],[[[1," The OIDC provider has rejected this access token. Please have an\\n administrator check your auth method configuration.\\n"]],[]],[[[41,[28,[37,12],[[30,0,["error","status"]],"499"],null],[[[1," The OIDC provider window was closed. Please try again.\\n"]],[]],[[[1," "],[1,[30,0,["error","detail"]]],[1,"\\n "]],[]]]],[]]]],[]]]],[]],[[[41,[28,[37,12],[[30,0,["error","status"]],"403"],null],[[[1," The token entered does not exist. Please enter a valid token to log in.\\n"]],[]],[[[41,[28,[37,12],[[30,0,["error","status"]],"404"],null],[[[1," No SSO providers are configured for that Partition.\\n"]],[]],[[[1," "],[1,[30,0,["error","detail"]]],[1,"\\n "]],[]]]],[]]]],[]]],[1," "]],[]]]]],[1,"\\n "]],[14]]]]],[1,"\\n"]],[]],null],[1," "]],[]]]]],[1,"\\n "],[8,[30,9],null,[["@matches"],["token"]],[["default"],[[[[1,"\\n "],[10,"form"],[15,"onsubmit",[28,[37,3],[[30,0],[30,4],"SUBMIT"],null]],[12],[1,"\\n "],[10,"fieldset"],[12],[1,"\\n "],[10,"label"],[15,0,[28,[37,13],["type-password",[52,[28,[37,14],[[28,[37,4],[[30,5],"error"],null],[28,[37,15],[[30,0,["error","status"]]],null]],null]," has-error"]],null]],[12],[1,"\\n "],[10,1],[12],[1,"Log in with a token"],[13],[1,"\\n\\n"],[1," "],[11,"input"],[16,"disabled",[28,[37,4],[[30,5],"loading"],null]],[24,3,"auth[SecretID]"],[24,"placeholder","SecretID"],[16,2,[30,0,["secret"]]],[16,"oninput",[28,[37,5],[[28,[37,3],[[30,0],[28,[37,6],[[30,0,["secret"]]],null]],[["value"],["target.value"]]],[28,[37,3],[[30,0],[28,[37,6],[[30,0,["value"]]],null]],[["value"],["target.value"]]],[28,[37,3],[[30,0],[30,4],"TYPING"],null]],null]],[16,4,[52,[28,[37,12],[[28,[37,16],["environment"],null],"testing"],null],"text","password"]],[4,[38,17],[[28,[37,18],[[30,0],"input"],null]],null],[12],[13],[1,"\\n "],[8,[30,1],null,[["@matches"],["error"]],[["default"],[[[[1,"\\n"],[41,[28,[37,15],[[30,0,["error","status"]]],null],[[[1," "],[10,"strong"],[14,"role","alert"],[12],[1,"\\n Please enter your secret\\n "],[13],[1,"\\n"]],[]],null],[1," "]],[]]]]],[1,"\\n "],[13],[1,"\\n "],[13],[1,"\\n "],[8,[39,19],[[16,"disabled",[28,[37,4],[[30,5],"loading"],null]],[24,4,"submit"]],[["@text"],["Log in"]],null],[1,"\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n\\n "],[18,19,[[28,[37,21],[[30,7],[28,[37,2],null,[["Method"],[[30,9]]]]],null]]],[1,"\\n\\n "],[10,"em"],[12],[1,"\\n Contact your administrator for login credentials.\\n "],[13],[1,"\\n "]],[9,10,11,12,13]]]]],[1,"\\n\\n "],[13],[1,"\\n "],[8,[30,1],null,[["@matches"],["loading"]],[["default"],[[[[1,"\\n "],[8,[39,22],null,[["@dc","@nspace","@partition","@type","@value","@onchange","@onerror"],[[30,15],[28,[37,23],[[30,0,["value","Namespace"]],[30,16]],null],[28,[37,23],[[30,0,["value","Partition"]],[30,17]],null],[52,[30,0,["value","Name"]],"oidc","secret"],[30,0,["value"]],[28,[37,5],[[28,[37,3],[[30,0],[30,4],"RESET"],null],[30,18]],null],[28,[37,5],[[28,[37,3],[[30,0],[28,[37,6],[[30,0,["error"]]],null]],[["value"],["error.errors.firstObject"]]],[28,[37,3],[[30,0],[30,4],"ERROR"],null]],null]]],null],[1,"\\n "]],[]]]]],[1,"\\n"]],[7]]]],[6]]]],[1,2,3,4,5]]]]],[1,"\\n"]],["State","Guard","ChartAction","dispatch","state","chart","exported","&attrs","TabState","IgnoredGuard","IgnoredAction","tabDispatch","tabState","A","@dc","@nspace","@partition","@onsubmit","&default"],false,["state-chart","let","hash","action","state-matches","queue","mut","if","can","tab-nav","array","hds/alert","eq","concat","and","not","env","did-insert","set","hds/button","yield","assign","token-source","or"]]',moduleName:"consul-ui/components/auth-form/index.hbs",isStrictMode:!1}) +let c=(a=class extends l.default{constructor(){super(...arguments),this.chart=i.default,this.tabsChart=o.default}hasValue(e,t,n){return""!==this.value&&void 0!==this.value}focus(){this.input.focus()}},u(a.prototype,"hasValue",[r.action],Object.getOwnPropertyDescriptor(a.prototype,"hasValue"),a.prototype),u(a.prototype,"focus",[r.action],Object.getOwnPropertyDescriptor(a.prototype,"focus"),a.prototype),a) +e.default=c,(0,t.setComponentTemplate)(s,c)})),define("consul-ui/components/auth-form/tabs.xstate",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +e.default={id:"auth-form-tabs",initial:"token",on:{TOKEN:[{target:"token"}],SSO:[{target:"sso"}]},states:{token:{},sso:{}}}})),define("consul-ui/components/auth-profile/index",["exports","@ember/component","@ember/template-factory","@ember/component/template-only"],(function(e,t,n,l){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const r=(0,n.createTemplateFactory)({id:"FSF8r1GE",block:'[[[11,"dl"],[24,0,"auth-profile"],[17,1],[12],[1,"\\n "],[10,"dt"],[12],[1,"\\n "],[10,1],[12],[1,"My ACL Token"],[13],[10,"br"],[12],[13],[1,"\\n AccessorID\\n "],[13],[1,"\\n "],[10,"dd"],[12],[1,"\\n "],[1,[28,[35,0],[[30,2,["AccessorID"]],[28,[37,1],[[30,2,["AccessorID","length"]],8],null]],null]],[1,"\\n "],[13],[1,"\\n"],[13]],["&attrs","@item"],false,["string-substring","sub"]]',moduleName:"consul-ui/components/auth-profile/index.hbs",isStrictMode:!1}) +var i=(0,t.setComponentTemplate)(r,(0,l.default)()) +e.default=i})) +define("consul-ui/components/basic-dropdown-content",["exports","ember-basic-dropdown/components/basic-dropdown-content"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/components/basic-dropdown-optional-tag",["exports","ember-basic-dropdown/components/basic-dropdown-optional-tag"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/components/basic-dropdown-trigger",["exports","ember-basic-dropdown/components/basic-dropdown-trigger"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/components/basic-dropdown",["exports","ember-basic-dropdown/components/basic-dropdown"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/components/block-slot",["exports","block-slots/components/block-slot"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/components/brand-loader/enterprise",["exports","@ember/component","@ember/template-factory","@ember/component/template-only"],(function(e,t,n,l){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const r=(0,n.createTemplateFactory)({id:"DW5EhD40",block:'[[[10,"path"],[14,"data-enterprise-logo",""],[14,"d","M322.099,18.0445001 C319.225,18.0223001 316.427,18.9609001 314.148,20.7112001 L314.016,20.8179001 L313.68,18.5368001 L310.332,18.5368001 L310.332,53.0000001 L314.312,52.4338001 L314.312,42.3164001 L314.435,42.3164001 C316.705,42.7693001 319.012,43.0165001 321.327,43.0549001 C326.554,43.0549001 329.098,40.5029001 329.098,35.2432001 L329.098,25.3802001 C329.073,20.4569001 326.809,18.0445001 322.099,18.0445001 Z M264.971,11.9722001 L260.991,12.5466001 L260.991,18.5284001 L256.708,18.5284001 L256.708,21.8106001 L260.991,21.8106001 L260.991,37.6883001 L260.99344,37.9365729 C261.066744,41.6122056 262.7975,43.1124033 266.915,43.1124033 C268.591,43.1170001 270.255,42.8396001 271.839,42.2915001 L271.363,39.1817001 L270.896229,39.3066643 C269.803094,39.5806719 268.682875,39.7315001 267.555,39.7560001 C265.526625,39.7560001 265.081547,38.9674128 264.991981,37.7056542 L264.97743,37.4176027 L264.97159,37.1147428 L264.971,21.8188001 L271.494,21.8188001 L271.83,18.5366001 L264.971,18.5366001 L264.971,11.9722001 Z M283.556,18.0770001 C277.312,18.0770001 274.144,21.0884001 274.144,27.0374001 L274.144,34.3075001 C274.144,40.3140001 277.164,43.1124894 283.655,43.1124894 C286.526,43.1192001 289.38,42.6620001 292.106,41.7581001 L291.589,38.6154001 C289.116,39.3030001 286.566,39.6779001 283.999,39.7314001 C279.785843,39.7314001 278.500803,38.4772648 278.201322,35.860808 L278.165734,35.4868687 L278.141767,35.0951811 C278.138675,35.0284172 278.136019,34.9609111 278.133774,34.8926614 L278.125037,34.474229 L278.124,32.0756001 L292.582,32.0756001 L292.582,27.1031001 C292.582,21.0064001 289.636,18.0770001 283.556,18.0770001 Z M384.631,18.0768001 C378.412,18.0440001 375.22,21.0554001 375.22,27.0208001 L375.22,34.2909001 C375.22,40.2973001 378.239,43.0955988 384.73,43.0955988 C387.599,43.1033001 390.45,42.6460001 393.173,41.7415001 L392.665,38.5988001 C390.188,39.2815001 387.635,39.6509001 385.066,39.6983001 C380.852843,39.6983001 379.567803,38.4442359 379.268322,35.8278014 L379.232734,35.4538649 L379.208767,35.0621794 C379.205675,34.9954158 379.203019,34.9279099 379.200774,34.8596604 L379.192037,34.4412289 L379.191,32.0754001 L393.657,32.0754001 L393.657,27.1029001 C393.657,21.0062001 390.712,18.0768001 384.631,18.0768001 Z M364.634,18.0441001 C363.881125,18.0441001 363.18736,18.0712813 362.54969,18.1279834 L362.016783,18.1838695 C357.948857,18.6791301 356.371,20.5353768 356.371,24.4608001 L356.371522,24.7155013 L356.376145,25.2052033 L356.386527,25.669464 L356.403852,26.1092746 C356.407384,26.1805939 356.411254,26.2509357 356.415488,26.3203208 L356.445451,26.7253144 L356.485319,27.1083357 C356.756619,29.3425283 357.626845,30.4437319 360.247859,31.3753061 L360.701103,31.529163 C360.779411,31.5545991 360.85912,31.5799457 360.940253,31.6052232 L361.444353,31.7562266 L361.983836,31.9065664 L362.55989,32.0572338 L363.430663,32.2724269 L364.440153,32.5299129 L364.884369,32.6506971 L365.29049,32.7679922 L365.660213,32.8831607 L365.99523,32.9975651 C367.26815,33.4554713 367.748817,33.9277406 367.925217,34.806783 L367.963261,35.0352452 C367.974017,35.1143754 367.982943,35.1965576 367.990321,35.2820187 L368.008092,35.5484662 L368.018269,35.8359502 L368.023,36.3096001 C368.023,36.3683432 368.022674,36.4261667 368.021989,36.4830819 L368.013333,36.8137655 C368.008847,36.9204214 368.002676,37.0235359 367.994568,37.1232009 L367.964177,37.4119383 C367.774513,38.8512264 367.058626,39.4837671 364.875404,39.6510671 L364.43427,39.67773 L363.954974,39.6933243 C363.78868,39.6967387 363.615773,39.6984001 363.436,39.6984001 C361.126,39.6638001 358.83,39.3385001 356.601,38.7302001 L356.051,41.7908001 L356.619468,41.9710684 C358.900888,42.6645722 361.270923,43.0269154 363.658,43.0463001 C369.59355,43.0463001 371.402903,41.3625861 371.812159,38.0405419 L371.854011,37.6421573 C371.859965,37.574501 371.865421,37.5062155 371.870401,37.4373012 L371.894725,37.0162715 L371.908596,36.5801656 C371.911587,36.4322862 371.913,36.2818967 371.913,36.1290001 L371.914417,35.5317322 C371.901583,33.4289389 371.677,32.2649251 370.797,31.3698001 C370.053077,30.6022731 368.787947,30.0494771 366.870096,29.4840145 L366.242608,29.3047611 C366.13436,29.2747269 366.024265,29.2445914 365.912304,29.2143213 L365.218,29.0308209 L364.216102,28.7784328 L363.495981,28.593015 L363.068145,28.4733265 L362.67987,28.3551624 C361.018765,27.8247783 360.501056,27.2986662 360.340522,26.2094051 L360.310407,25.9578465 C360.306262,25.9142982 360.302526,25.8699197 360.29916,25.8246823 L360.283089,25.5427193 L360.273984,25.2387571 L360.269927,24.911412 L360.270221,24.3885398 L360.280627,24.0635689 C360.366727,22.3885604 360.966747,21.6370879 363.248047,21.4645754 L363.695778,21.4389299 L364.184625,21.426349 L364.445,21.4248001 C366.684,21.4608001 368.916,21.6859001 371.117,22.0976001 L371.396,18.8646001 L370.730951,18.7059457 C368.73071,18.2553391 366.686,18.0331201 364.634,18.0441001 Z M351.301,18.5363001 L347.321,18.5363001 L347.321,42.6112001 L351.301,42.6112001 L351.301,18.5363001 Z M307.335,18.0850001 L306.70097,18.3638937 C304.598769,19.3169298 302.610091,20.5031364 300.771,21.9005001 L300.623,22.0236001 L300.369,18.5363001 L296.931,18.5363001 L296.931,42.6112001 L300.91,42.6112001 L300.91,25.9048001 L301.641825,25.3925123 C303.604371,24.0427531 305.654445,22.8240667 307.778,21.7446001 L307.335,18.0850001 Z M344.318,18.0850001 L343.683947,18.3638937 C341.581595,19.3169298 339.592091,20.5031364 337.753,21.9005001 L337.606,22.0236001 L337.351,18.5363001 L333.946,18.5363001 L333.946,42.6112001 L337.926,42.6112001 L337.926,25.9048001 L337.967,25.9048001 L338.701162,25.3884311 C340.669963,24.0279284 342.726556,22.7996223 344.859,21.7118001 L344.318,18.0850001 Z M230.384,9.62500005 L211.109,9.62500005 L211.109,42.6112001 L230.466,42.6112001 L230.466,38.9597001 L215.146,38.9597001 L215.146,27.4720001 L229.293,27.4720001 L229.293,23.8698001 L215.146,23.8698001 L215.146,13.2600001 L230.384,13.2600001 L230.384,9.62500005 Z M248.763,18.0441001 C245.899,18.0441001 241.706,19.3323001 239.047,20.6124001 L238.924,20.6698001 L238.522,18.5282001 L235.322,18.5282001 L235.322,42.5704001 L239.302,42.5704001 L239.302,24.2885001 L239.359,24.2885001 C241.919,22.9674001 245.661,21.8268001 247.524,21.8268001 C249.165,21.8268001 249.985,22.5735001 249.985,24.1736001 L249.985,42.5868001 L253.965,42.5868001 L253.965,24.1161001 C253.932,20.0380001 252.25,18.0523001 248.763,18.0441001 Z M321.229,21.5564001 C323.526,21.5564001 325.061,22.2046001 325.061,25.3966001 L325.094,35.2760001 C325.094,38.3121001 323.887,39.6085001 321.057,39.6085001 C318.81,39.5533001 316.572,39.3035001 314.369,38.8618001 L314.287,38.8618001 L314.287,24.4694001 C316.198,22.7311001 318.649,21.7027001 321.229,21.5564001 Z M283.581,21.3264001 C287.372,21.3264001 288.758,22.8855001 288.758,26.7010001 L288.758,28.7934001 L278.149,28.7934001 L278.149,26.7010001 C278.149,22.9839001 279.79,21.3264001 283.581,21.3264001 Z M384.648,21.3262001 C388.431,21.3262001 389.834,22.8852001 389.834,26.7008001 L389.834,28.7932001 L379.224,28.7932001 L379.224,26.7008001 C379.224,22.9837001 380.865,21.3262001 384.648,21.3262001 Z M351.301,8.63220005 L347.321,8.63220005 L347.321,14.4499001 L351.301,14.4499001 L351.301,8.63220005 Z"],[14,"fill-rule","nonzero"],[12],[13],[1,"\\n\\n"]],[],false,[]]',moduleName:"consul-ui/components/brand-loader/enterprise.hbs",isStrictMode:!1}) +var i=(0,t.setComponentTemplate)(r,(0,l.default)()) +e.default=i})),define("consul-ui/components/brand-loader/index",["exports","@ember/component","@ember/template-factory","@ember/component/template-only"],(function(e,t,n,l){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const r=(0,n.createTemplateFactory)({id:"yNoyAgqg",block:'[[[10,0],[14,0,"brand-loader"],[15,5,[29,["margin-left: calc(-",[30,1],"px / 2)"]]],[12],[1,"\\n"],[10,"svg"],[15,"width",[29,[[30,1]]]],[14,"height","53"],[14,"xmlns","http://www.w3.org/2000/svg","http://www.w3.org/2000/xmlns/"],[15,"fill",[29,[[30,2]]]],[12],[1,"\\n "],[10,"path"],[14,"d","M32.7240001,0.866235051 C28.6239001,-0.218137949 24.3210001,-0.285465949 20.1890001,0.670096051 C16.0569001,1.62566005 12.2205001,3.57523005 9.01276015,6.34960005 C5.80499015,9.12397005 3.32280015,12.6393001 1.78161015,16.5905001 C0.240433148,20.5416001 -0.313157852,24.8092001 0.168892148,29.0228001 C0.650943148,33.2364001 2.15407015,37.2687001 4.54780015,40.7697001 C6.94153015,44.2707001 10.1535001,47.1346001 13.9050001,49.1128001 C17.6565001,51.0910001 21.8341001,52.1238001 26.0752001,52.1214409 C32.6125001,52.1281001 38.9121001,49.6698001 43.7170001,45.2370001 L37.5547001,38.7957001 C35.0952001,41.0133001 32.0454001,42.4701001 28.7748001,42.9898001 C25.5042001,43.5096001 22.1530001,43.0698001 19.1273001,41.7239001 C16.1015001,40.3779001 13.5308001,38.1835001 11.7267001,35.4064001 C9.92260015,32.6294001 8.96239015,29.3888001 8.96239015,26.0771001 C8.96239015,22.7655001 9.92260015,19.5249001 11.7267001,16.7478001 C13.5308001,13.9707001 16.1015001,11.7763001 19.1273001,10.4304001 C22.1530001,9.08444005 25.5042001,8.64470005 28.7748001,9.16441005 C32.0454001,9.68412005 35.0952001,11.1410001 37.5547001,13.3586001 L43.7170001,6.89263005 C40.5976001,4.01926005 36.8241001,1.95061005 32.7240001,0.866235051 Z M46.6320001,34.8572001 C46.2182001,34.9395001 45.8380001,35.1427001 45.5397001,35.4410001 C45.2413001,35.7394001 45.0381001,36.1195001 44.9558001,36.5334001 C44.8735001,36.9472001 44.9157001,37.3762001 45.0772001,37.7660001 C45.2387001,38.1559001 45.5121001,38.4891001 45.8630001,38.7235001 C46.2138001,38.9579001 46.6263001,39.0830001 47.0482001,39.0830001 C47.6141001,39.0830001 48.1567001,38.8583001 48.5568001,38.4582001 C48.9569001,38.0581001 49.1817001,37.5154001 49.1817001,36.9496001 C49.1817001,36.5276001 49.0565001,36.1152001 48.8221001,35.7643001 C48.5877001,35.4135001 48.2545001,35.1400001 47.8647001,34.9786001 C47.4748001,34.8171001 47.0459001,34.7748001 46.6320001,34.8572001 Z M49.0856001,27.5622001 C48.6718001,27.6446001 48.2916001,27.8477001 47.9933001,28.1461001 C47.6949001,28.4445001 47.4917001,28.8246001 47.4094001,29.2385001 C47.3271001,29.6523001 47.3693001,30.0813001 47.5308001,30.4711001 C47.6923001,30.8609001 47.9657001,31.1941001 48.3166001,31.4286001 C48.6674001,31.6630001 49.0799001,31.7881001 49.5018001,31.7881001 C50.0670001,31.7859001 50.6084001,31.5605001 51.0080001,31.1609001 C51.4076001,30.7612001 51.6331001,30.2198001 51.6353001,29.6547001 C51.6353001,29.2327001 51.5102001,28.8202001 51.2757001,28.4694001 C51.0413001,28.1186001 50.7081001,27.8451001 50.3183001,27.6836001 C49.9284001,27.5222001 49.4995001,27.4799001 49.0856001,27.5622001 Z M28.0728001,20.8457001 C27.0412001,20.4185001 25.9061001,20.3067001 24.8110001,20.5245001 C23.7159001,20.7423001 22.7100001,21.2800001 21.9205001,22.0695001 C21.1309001,22.8590001 20.5933001,23.8650001 20.3754001,24.9600001 C20.1576001,26.0551001 20.2694001,27.1902001 20.6967001,28.2218001 C21.1240001,29.2534001 21.8476001,30.1351001 22.7760001,30.7554001 C23.7043001,31.3757001 24.7958001,31.7068001 25.9124001,31.7068001 C27.4096001,31.7068001 28.8455001,31.1120001 29.9043001,30.0533001 C30.9630001,28.9946001 31.5578001,27.5587001 31.5578001,26.0614001 C31.5578001,24.9449001 31.2267001,23.8534001 30.6063001,22.9250001 C29.9860001,21.9966001 29.1043001,21.2730001 28.0728001,20.8457001 Z M43.9670001,27.4378001 C43.5772001,27.2763001 43.1482001,27.2341001 42.7344001,27.3164001 C42.3205001,27.3987001 41.9404001,27.6019001 41.6420001,27.9003001 C41.3437001,28.1986001 41.1405001,28.5788001 41.0581001,28.9926001 C40.9758001,29.4065001 41.0181001,29.8354001 41.1796001,30.2253001 C41.3410001,30.6151001 41.6145001,30.9483001 41.9653001,31.1827001 C42.3162001,31.4171001 42.7286001,31.5423001 43.1506001,31.5423001 C43.7164001,31.5423001 44.2591001,31.3175001 44.6592001,30.9174001 C45.0592001,30.5173001 45.2840001,29.9747001 45.2840001,29.4088001 C45.2840001,28.9869001 45.1589001,28.5744001 44.9245001,28.2236001 C44.6901001,27.8727001 44.3568001,27.5993001 43.9670001,27.4378001 Z M43.9670001,20.7503001 C43.5772001,20.5888001 43.1482001,20.5466001 42.7344001,20.6289001 C42.3205001,20.7112001 41.9404001,20.9144001 41.6420001,21.2128001 C41.3437001,21.5111001 41.1405001,21.8913001 41.0581001,22.3051001 C40.9758001,22.7190001 41.0181001,23.1479001 41.1796001,23.5378001 C41.3410001,23.9276001 41.6145001,24.2608001 41.9653001,24.4952001 C42.3162001,24.7296001 42.7286001,24.8548001 43.1506001,24.8548001 C43.7164001,24.8548001 44.2591001,24.6300001 44.6592001,24.2299001 C45.0592001,23.8298001 45.2840001,23.2871001 45.2840001,22.7213001 C45.2840001,22.2994001 45.1589001,21.8869001 44.9245001,21.5360001 C44.6901001,21.1852001 44.3568001,20.9118001 43.9670001,20.7503001 Z M49.0856001,20.3825001 C48.6718001,20.4649001 48.2916001,20.6681001 47.9933001,20.9664001 C47.6949001,21.2648001 47.4917001,21.6449001 47.4094001,22.0588001 C47.3271001,22.4726001 47.3693001,22.9016001 47.5308001,23.2914001 C47.6923001,23.6813001 47.9657001,24.0144001 48.3166001,24.2489001 C48.6674001,24.4833001 49.0799001,24.6084001 49.5018001,24.6084001 C50.0670001,24.6063001 50.6084001,24.3808001 51.0080001,23.9812001 C51.4076001,23.5815001 51.6331001,23.0401001 51.6353001,22.4750001 C51.6353001,22.0530001 51.5102001,21.6406001 51.2757001,21.2897001 C51.0413001,20.9389001 50.7081001,20.6654001 50.3183001,20.5040001 C49.9284001,20.3425001 49.4995001,20.3002001 49.0856001,20.3825001 Z M46.7554001,13.2026001 C46.3416001,13.2849001 45.9614001,13.4881001 45.6630001,13.7865001 C45.3647001,14.0849001 45.1615001,14.4650001 45.0792001,14.8788001 C44.9969001,15.2927001 45.0391001,15.7217001 45.2006001,16.1115001 C45.3621001,16.5013001 45.6355001,16.8345001 45.9863001,17.0689001 C46.3372001,17.3034001 46.7497001,17.4285001 47.1716001,17.4285001 C47.7374001,17.4285001 48.2801001,17.2037001 48.6802001,16.8036001 C49.0803001,16.4035001 49.3050001,15.8609001 49.3050001,15.2951001 C49.3050001,14.8731001 49.1799001,14.4606001 48.9455001,14.1098001 C48.7111001,13.7589001 48.3779001,13.4855001 47.9880001,13.3240001 C47.5982001,13.1625001 47.1692001,13.1203001 46.7554001,13.2026001 Z"],[14,"fill-rule","nonzero"],[12],[13],[1,"\\n "],[10,"path"],[14,"d","M83.5385001,9.02612084 C75.3002001,9.02612084 71.7718001,12.5545001 71.7718001,18.6102001 L71.7718001,33.5278001 L71.7744126,33.809806 C71.8842215,39.6928981 75.4612111,43.1118103 83.5385001,43.1118103 C86.5802001,43.1131001 89.6109001,42.7466001 92.5646001,42.0205001 L91.8671001,36.6049001 L90.9760579,36.7631811 C88.5964705,37.1629803 86.1899224,37.3844223 83.7765001,37.4254001 C79.4194001,37.4254001 78.0326001,35.9320001 78.0326001,32.4118001 L78.0326001,19.7261001 L78.0346281,19.4988781 C78.0956946,16.133828 79.5462067,14.7125001 83.7765001,14.7125001 C86.4916001,14.7587001 89.1980001,15.0332001 91.8671001,15.5331001 L92.5646001,10.1175001 L91.8246092,9.94345672 C89.1057071,9.33281156 86.3267251,9.02500229 83.5385001,9.02612084 Z M172.149,18.4131001 L166.094,18.4131001 L166.09588,36.2248122 C166.154955,40.3975255 167.61375,43.1117001 171.55,43.1117001 C174.919,42.9517001 178.218,42.0880001 181.233,40.5762001 L181.832,42.6112001 L186.443,42.6112001 L186.443,18.4131001 L180.388,18.4131001 L180.388,35.1934001 C178.188,36.3339001 175.481,37.2283001 174.086,37.2283001 C172.691,37.2283001 172.149,36.5801001 172.149,35.2918001 L172.149,18.4131001 Z M105.939,17.9127001 C98.2719471,17.9127001 95.7845671,21.8519543 95.4516942,26.3358062 L95.4257941,26.7784774 C95.4225999,26.8525088 95.4199581,26.9266566 95.4178553,27.0009059 L95.4116001,27.4475001 L95.4116001,33.5853001 L95.4178331,34.0318054 C95.5519456,38.7818866 97.886685,43.0872001 105.931,43.0872001 C113.716697,43.0872001 116.15821,39.0467642 116.432186,34.4757046 L116.45204,34.0318054 C116.456473,33.8833653 116.458758,33.734491 116.459,33.5853001 L116.459,27.4475001 L116.457455,27.2221358 C116.453317,26.9220505 116.440796,26.6236441 116.419035,26.3278463 L116.379357,25.8862225 C115.91894,21.5651129 113.355121,17.9127001 105.939,17.9127001 Z M154.345,17.8876515 C147.453,17.8876515 145.319,20.0214001 145.319,24.8873001 L145.319694,25.1343997 L145.325703,25.6107983 L145.338905,26.064173 C145.341773,26.1378641 145.344992,26.2106314 145.348588,26.2824927 L145.374889,26.7029295 C145.380095,26.7712375 145.385729,26.838675 145.391816,26.9052596 L145.433992,27.2946761 C145.714183,29.5082333 146.613236,30.7206123 149.232713,31.693068 L149.698825,31.8575665 C150.021076,31.9658547 150.36662,32.0715774 150.737101,32.1758709 L151.311731,32.3313812 C151.509646,32.3829554 151.714,32.4343143 151.925,32.4856001 L152.205551,32.5543061 L152.728976,32.6899356 L153.204098,32.8237311 L153.633238,32.9563441 C155.53221,33.5734587 156.004908,34.1732248 156.112605,35.0535762 L156.130482,35.2466262 L156.139507,35.448917 L156.142,35.6611001 L156.137247,35.9859786 L156.121298,36.2838969 C156.024263,37.5177444 155.540462,38.0172149 153.741624,38.1073495 L153.302742,38.1210314 L153.065,38.1227001 C150.631,38.0987001 148.21,37.7482001 145.869,37.0807001 L145.049,41.6922001 L145.672496,41.887484 C148.174444,42.639635 150.769923,43.0436231 153.385,43.0871001 C159.627887,43.0871001 161.583469,40.9824692 162.030289,37.4548504 L162.074576,37.049455 C162.087289,36.9123213 162.098004,36.7731979 162.106868,36.6321214 L162.128062,36.2030694 L162.139051,35.7625187 L162.141,35.5380001 C162.141,35.4566181 162.140828,35.3763299 162.14046,35.2971136 L162.131203,34.6125174 L162.117224,34.1865271 L162.095649,33.7836378 L162.065324,33.4027996 L162.025093,33.0429627 L161.973799,32.7030773 C161.659145,30.8866498 160.790109,29.9278873 158.501441,29.0408119 L158.069484,28.8801405 L157.605084,28.7199991 C157.524916,28.6932947 157.443348,28.6665687 157.360357,28.6397991 L156.845127,28.4784845 L156.294565,28.3150754 L155.707516,28.148522 L155.082823,27.9777746 L154.035614,27.7021396 L153.423677,27.5325226 L153.071612,27.4262327 C153.016479,27.4088193 152.963082,27.3915263 152.911366,27.3743086 L152.620815,27.2715428 C151.671458,26.912485 151.415595,26.5466416 151.348761,25.7543883 L151.334373,25.5160648 L151.327658,25.2523603 L151.327351,24.8244501 C151.355827,23.4390475 151.851313,22.8769001 154.403,22.8769001 C156.636,22.9360001 158.861,23.1692001 161.057,23.5744001 L161.591,18.7085001 L160.876597,18.5511522 C158.72872,18.1040608 156.5401,17.8816774 154.345,17.8876515 Z M197.71,7.71350005 L191.654,8.53405005 L191.654,42.6116001 L197.71,42.6116001 L197.71,7.71350005 Z M135.455,17.9211001 C132.086,18.0823001 128.788,18.9459001 125.772,20.4566001 L125.189,18.4135001 L120.57,18.4135001 L120.57,42.6115001 L126.625,42.6115001 L126.625,25.8066001 C128.833,24.6661001 131.549,23.7717001 132.936,23.7717001 C134.322,23.7717001 134.872,24.4199001 134.872,25.7082001 L134.872,42.6115001 L140.919,42.6115001 L140.919,25.0681001 C140.919,20.7520001 139.475,17.9211001 135.455,17.9211001 Z M105.931,23.0740001 C109.156,23.0740001 110.395,24.5592001 110.395,27.2506001 L110.395,33.7494001 L110.392134,33.9740961 C110.325067,36.5604698 109.074195,37.9178001 105.931,37.9178001 C102.698,37.9178001 101.459,36.4818001 101.459,33.7494001 L101.459,27.2506001 L101.461884,27.0258853 C101.529372,24.4390811 102.787806,23.0740001 105.931,23.0740001 Z"],[14,"fill-rule","nonzero"],[12],[13],[1,"\\n "],[1,[30,3]],[1,"\\n "],[18,4,null],[1,"\\n "],[13],[1,"\\n "],[13],[1,"\\n\\n"]],["@width","@color","@subtitle","&default"],false,["yield"]]',moduleName:"consul-ui/components/brand-loader/index.hbs",isStrictMode:!1}) +var i=(0,t.setComponentTemplate)(r,(0,l.default)()) +e.default=i})),define("consul-ui/components/child-selector/index",["exports","@ember/component","@ember/template-factory","@ember/object","@ember/object/computed","@ember/service","ember-concurrency","block-slots"],(function(e,t,n,l,r,i,o,a){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const u=(0,n.createTemplateFactory)({id:"rQwZ80hm",block:'[[[11,0],[16,0,[29,["child-selector ",[36,0],"-child-selector"]]],[17,1],[12],[1,"\\n"],[18,4,null],[1,"\\n"],[41,[28,[37,3],[[33,4]],null],[[[1," "],[8,[39,5],null,[["@name"],["create"]],[["default"],[[[[18,4,null]],[]]]]],[1,"\\n "],[10,"label"],[14,0,"type-text"],[12],[1,"\\n "],[10,1],[12],[8,[39,5],null,[["@name"],["label"]],[["default"],[[[[18,4,null]],[]]]]],[13],[1,"\\n"],[41,[33,6],[[[1," "],[8,[39,7],null,[["@src","@onchange"],[[28,[37,8],["/${partition}/${nspace}/${dc}/${type}",[28,[37,9],null,[["partition","nspace","dc","type"],[[33,10],[33,11],[33,12],[28,[37,13],[[33,0]],null]]]]],null],[28,[37,14],[[30,0],[28,[37,15],[[33,16]],null]],[["value"],["data"]]]]],null],[1,"\\n"]],[]],null],[1," "],[8,[39,17],null,[["@type","@sort","@filters","@items"],[[99,0,["@type"]],"Name:asc",[28,[37,9],null,[["searchproperties"],[[28,[37,18],["Name"],null]]]],[99,19,["@items"]]]],[["default"],[[[[1,"\\n "],[8,[39,20],null,[["@searchEnabled","@search","@options","@loadingMessage","@searchMessage","@searchPlaceholder","@onOpen","@onClose","@onChange"],[true,[28,[37,14],[[30,0],[30,2,["search"]]],null],[28,[37,21],["Name:asc",[33,19]],null],"Loading...","No possible options",[99,22,["@searchPlaceholder"]],[28,[37,14],[[30,0],[28,[37,15],[[33,6]],null],true],null],[28,[37,14],[[30,0],[28,[37,15],[[33,6]],null],false],null],[28,[37,14],[[30,0],"change","items[]",[33,23]],null]]],[["default"],[[[[1,"\\n "],[8,[39,5],null,[["@name","@params"],["option",[28,[37,24],[[30,3]],null]]],[["default"],[[[[18,4,null]],[]]]]],[1,"\\n "]],[3]]]]],[1,"\\n "]],[2]]]]],[1,"\\n "],[13],[1,"\\n"]],[]],null],[41,[28,[37,25],[[33,23,["length"]],0],null],[[[1," "],[8,[39,5],null,[["@name"],["set"]],[["default"],[[[[18,4,null]],[]]]]],[1,"\\n"]],[]],[[[1,"\\n"]],[]]],[13]],["&attrs","collection","item","&default"],false,["type","yield","if","not","disabled","yield-slot","isOpen","data-source","uri","hash","partition","nspace","dc","pluralize","action","mut","allOptions","data-collection","array","options","power-select","sort-by","placeholder","items","block-params","gt"]]',moduleName:"consul-ui/components/child-selector/index.hbs",isStrictMode:!1}) +var s=(0,t.setComponentTemplate)(u,t.default.extend(a.default,{onchange:function(){},tagName:"",error:function(){},type:"",dom:(0,i.inject)("dom"),formContainer:(0,i.inject)("form"),item:(0,r.alias)("form.data"),selectedOptions:(0,r.alias)("items"),init:function(){this._super(...arguments),this._listeners=this.dom.listeners(),(0,l.set)(this,"form",this.formContainer.form(this.type)),this.form.clear({Datacenter:this.dc,Namespace:this.nspace})},willDestroyElement:function(){this._super(...arguments),this._listeners.remove()},options:(0,l.computed)("selectedOptions.[]","allOptions.[]",(function(){let e=this.allOptions||[] +const t=this.selectedOptions||[] +return(0,l.get)(t,"length")>0&&(e=e.filter((e=>!t.findBy("ID",(0,l.get)(e,"ID"))))),e})),save:(0,o.task)((function*(e,t){let n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:function(){} +const l=this.repo +try{e=yield l.persist(e),this.actions.change.apply(this,[{target:{name:"items[]",value:t}},t,e]),n()}catch(r){this.error({error:r})}})),actions:{reset:function(){this.form.clear({Datacenter:this.dc,Namespace:this.nspace,Partition:this.partition})},remove:function(e,t){const n=this.repo.getSlugKey(),r=(0,l.get)(e,n),i=t.findIndex((function(e){return(0,l.get)(e,n)===r})) +if(-1!==i)return t.removeAt(i,1) +this.onchange({target:this})},change:function(e,t,n){const r=this.dom.normalizeEvent(...arguments),i=t +if("items[]"===r.target.name)(0,l.set)(n,"CreateTime",(new Date).getTime()),i.pushObject(n),this.onchange({target:this})}}})) +e.default=s})),define("consul-ui/components/code-editor/index",["exports","@ember/component","@ember/template-factory","@ember/object","@ember/service"],(function(e,t,n,l,r){function i(e,t){var n=Object.keys(e) +if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e) +t&&(l=l.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,l)}return n}function o(e){for(var t=1;t{let[t]=e +this.oninput((0,l.set)(this,"value",t.target.wholeText))})),this.observer.observe(e,{attributes:!1,subtree:!0,childList:!1,characterData:!0}),(0,l.set)(this,"value",e.firstChild.wholeText)),(0,l.set)(this,"editor",this.helper.getEditor(this.element)),this.settings.findBySlug("code-editor").then((e=>{const t=this.modes,n=this.syntax +n&&(e=t.find((function(e){return e.name.toLowerCase()==n.toLowerCase()}))),e=e||t[0],this.setMode(e)}))},didAppear:function(){this.editor.refresh()},actions:{change:function(e){this.settings.persist({"code-editor":e}),this.setMode(e)}}})) +e.default=c})),define("consul-ui/components/confirmation-alert/index",["exports","@ember/component","@ember/template-factory"],(function(e,t,n){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const l=(0,n.createTemplateFactory)({id:"fpR2WXW3",block:'[[[18,5,null],[1,"\\n"],[8,[39,1],[[24,0,"confirmation-alert warning"],[17,1]],null,[["header","body","actions"],[[[[1,"\\n "],[8,[39,2],null,[["@name"],["header"]],[["default"],[[[[18,5,null]],[]]]]],[1,"\\n "]],[]],[[[1,"\\n "],[8,[39,2],null,[["@name"],["body"]],[["default"],[[[[18,5,null]],[]]]]],[1,"\\n "]],[]],[[[1,"\\n "],[8,[30,2,["Action"]],[[24,0,"dangerous"]],null,[["default"],[[[[1,"\\n "],[8,[39,2],null,[["@name","@params"],["confirm",[28,[37,3],[[50,"action",0,null,[["onclick","tabindex"],[[28,[37,5],[[30,0],[30,3]],null],"-1"]]]],null]]],[["default"],[[[[1,"\\n "],[18,5,null],[1,"\\n "]],[]]]]],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[30,2,["Action"]],null,null,[["default"],[[[[1,"\\n "],[8,[39,5],null,[["@for"],[[30,4]]],[["default"],[[[[1,"\\n Cancel\\n "]],[]]]]],[1,"\\n "]],[]]]]],[1,"\\n "]],[2]]]]]],["&attrs","Actions","@onclick","@name","&default"],false,["yield","informed-action","yield-slot","block-params","component","action"]]',moduleName:"consul-ui/components/confirmation-alert/index.hbs",isStrictMode:!1}) +var r=(0,t.setComponentTemplate)(l,t.default.extend({tagName:""})) +e.default=r})),define("consul-ui/components/confirmation-dialog/index",["exports","@ember/component","@ember/template-factory","block-slots","@ember/object"],(function(e,t,n,l,r){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const i=(0,n.createTemplateFactory)({id:"JwnN2l0u",block:'[[[11,0],[16,0,[28,[37,0],["with-confirmation",[52,[33,2]," confirming",""]],null]],[17,1],[12],[1,"\\n"],[18,2,null],[1,"\\n"],[8,[39,4],null,[["@name","@params"],["action",[28,[37,5],[[28,[37,6],[[30,0],"confirm"],null],[28,[37,6],[[30,0],"cancel"],null]],null]]],[["default"],[[[[1,"\\n"],[41,[28,[37,7],[[33,8],[28,[37,9],[[33,2]],null]],null],[[[1," "],[18,2,null],[1,"\\n"]],[]],null]],[]]]]],[1,"\\n"],[8,[39,4],null,[["@name","@params"],["dialog",[28,[37,5],[[28,[37,6],[[30,0],"execute"],null],[28,[37,6],[[30,0],"cancel"],null],[33,10],[33,11]],null]]],[["default"],[[[[1,"\\n"],[41,[33,2],[[[1," "],[18,2,null],[1,"\\n"]],[]],null]],[]]]]],[1,"\\n"],[13]],["&attrs","&default"],false,["concat","if","confirming","yield","yield-slot","block-params","action","or","permanent","not","message","actionName"]]',moduleName:"consul-ui/components/confirmation-dialog/index.hbs",isStrictMode:!1}) +var o=(0,t.setComponentTemplate)(i,t.default.extend(l.default,{tagName:"",message:"Are you sure?",confirming:!1,permanent:!1,actions:{cancel:function(){(0,r.set)(this,"confirming",!1)},execute:function(){(0,r.set)(this,"confirming",!1),this.sendAction("actionName",...this.arguments)},confirm:function(){const[e,...t]=arguments;(0,r.set)(this,"actionName",e),(0,r.set)(this,"arguments",t),(0,r.set)(this,"confirming",!0)}}})) +e.default=o})),define("consul-ui/components/consul/acl/disabled/index",["exports","@ember/component","@ember/template-factory","@ember/component/template-only"],(function(e,t,n,l){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const r=(0,n.createTemplateFactory)({id:"jFDvZrXB",block:'[[[8,[39,0],null,null,[["default"],[[[[1,"\\n "],[8,[39,1],null,[["@name"],["header"]],[["default"],[[[[1,"\\n "],[10,"h1"],[12],[1,"\\n Tokens\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,1],null,[["@name"],["content"]],[["default"],[[[[1,"\\n "],[8,[39,2],null,null,[["default"],[[[[1,"\\n "],[8,[39,1],null,[["@name"],["header"]],[["default"],[[[[1,"\\n "],[10,"h2"],[12],[1,"Welcome to ACLs"],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,1],null,[["@name"],["body"]],[["default"],[[[[1,"\\n "],[10,2],[12],[1,"\\n ACLs are not enabled in this Consul cluster. We strongly encourage the use of ACLs in production environments for the best security practices.\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,1],null,[["@name"],["actions"]],[["default"],[[[[1,"\\n "],[10,"li"],[12],[1,"\\n "],[8,[39,3],null,[["@text","@href","@icon","@iconPosition","@size"],["Read the documentation",[29,[[28,[37,4],["CONSUL_DOCS_URL"],null],"/acl/index.html"]],"docs-link","trailing","small"]],null],[1,"\\n "],[13],[1,"\\n "],[10,"li"],[12],[1,"\\n "],[8,[39,3],null,[["@text","@href","@icon","@iconPosition","@size"],["Follow the guide",[29,[[28,[37,4],["CONSUL_DOCS_LEARN_URL"],null],"/consul/security-networking/production-acls"]],"learn-link","trailing","small"]],null],[1,"\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n "]],[]]]]],[1,"\\n "]],[]]]]],[1,"\\n"]],[]]]]],[1,"\\n\\n"]],[],false,["app-view","block-slot","empty-state","hds/link/standalone","env"]]',moduleName:"consul-ui/components/consul/acl/disabled/index.hbs",isStrictMode:!1}) +var i=(0,t.setComponentTemplate)(r,(0,l.default)()) +e.default=i})),define("consul-ui/components/consul/acl/selector/index",["exports","@ember/component","@ember/template-factory","@ember/component/template-only"],(function(e,t,n,l){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const r=(0,n.createTemplateFactory)({id:"uDHL3FS4",block:'[[[10,"li"],[14,0,"acls-separator"],[14,"role","separator"],[12],[1,"\\n Access Controls\\n"],[41,[28,[37,1],[[28,[37,2],["use acls"],null]],null],[[[1," "],[11,1],[4,[38,3],["ACLs are not currently enabled in this cluster"],null],[12],[13],[1,"\\n"]],[]],null],[13],[1,"\\n"],[10,"li"],[15,0,[52,[28,[37,4],["dc.acls.tokens",[30,1,["Name"]]],null],"is-active"]],[12],[1,"\\n "],[10,3],[15,6,[28,[37,5],["dc.acls.tokens",[30,1,["Name"]]],null]],[12],[1,"\\n Tokens\\n "],[13],[1,"\\n"],[13],[1,"\\n"],[41,[28,[37,2],["read acls"],null],[[[10,"li"],[15,0,[52,[28,[37,4],["dc.acls.policies",[30,1,["Name"]]],null],"is-active"]],[12],[1,"\\n "],[10,3],[15,6,[28,[37,5],["dc.acls.policies",[30,1,["Name"]]],null]],[12],[1,"\\n Policies\\n "],[13],[1,"\\n"],[13],[1,"\\n"],[10,"li"],[15,0,[52,[28,[37,4],["dc.acls.roles",[30,1,["Name"]]],null],"is-active"]],[12],[1,"\\n "],[10,3],[15,6,[28,[37,5],["dc.acls.roles",[30,1,["Name"]]],null]],[12],[1,"\\n Roles\\n "],[13],[1,"\\n"],[13],[1,"\\n"],[10,"li"],[15,0,[52,[28,[37,4],["dc.acls.auth-methods",[30,1,["Name"]]],null],"is-active"]],[12],[1,"\\n "],[10,3],[15,6,[28,[37,5],["dc.acls.auth-methods",[30,1,["Name"]]],null]],[12],[1,"\\n Auth Methods\\n "],[13],[1,"\\n"],[13],[1,"\\n"]],[]],[[[41,[28,[37,1],[[28,[37,2],["use acls"],null]],null],[[[10,"li"],[15,0,[52,[28,[37,4],["dc.acls.policies",[30,1,["Name"]]],null],"is-active"]],[12],[1,"\\n "],[10,1],[12],[1,"\\n Policies\\n "],[13],[1,"\\n"],[13],[1,"\\n"],[10,"li"],[15,0,[52,[28,[37,4],["dc.acls.roles",[30,1,["Name"]]],null],"is-active"]],[12],[1,"\\n "],[10,1],[12],[1,"\\n Roles\\n "],[13],[1,"\\n"],[13],[1,"\\n"],[10,"li"],[15,0,[52,[28,[37,4],["dc.acls.auth-methods",[30,1,["Name"]]],null],"is-active"]],[12],[1,"\\n "],[10,1],[12],[1,"\\n Auth Methods\\n "],[13],[1,"\\n"],[13],[1,"\\n"]],[]],null]],[]]],[1,"\\n"]],["@dc"],false,["if","not","can","tooltip","is-href","href-to"]]',moduleName:"consul-ui/components/consul/acl/selector/index.hbs",isStrictMode:!1}) +var i=(0,t.setComponentTemplate)(r,(0,l.default)()) +e.default=i})),define("consul-ui/components/consul/auth-method/binding-list/index",["exports","@ember/component","@ember/template-factory","@ember/component/template-only"],(function(e,t,n,l){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const r=(0,n.createTemplateFactory)({id:"tIxrxpUS",block:'[[[10,0],[14,0,"consul-auth-method-binding-list"],[12],[1,"\\n "],[10,"h2"],[12],[1,[30,1,["BindName"]]],[13],[1,"\\n "],[10,"dl"],[12],[1,"\\n "],[10,"dt"],[14,0,"type"],[12],[1,[28,[35,0],["models.binding-rule.BindType"],null]],[13],[1,"\\n "],[10,"dd"],[12],[1,"\\n "],[1,[30,1,["BindType"]]],[1,"\\n "],[10,1],[12],[1,"\\n"],[41,[28,[37,2],[[30,1,["BindType"]],"service"],null],[[[1," "],[8,[39,3],null,null,[["default"],[[[[1,"\\n "],[1,[28,[35,0],["components.consul.auth-method.binding-list.bind-type.service"],null]],[1,"\\n "]],[]]]]],[1,"\\n"]],[]],[[[41,[28,[37,2],[[30,1,["BindType"]],"node"],null],[[[1," "],[8,[39,3],null,null,[["default"],[[[[1,"\\n "],[1,[28,[35,0],["components.consul.auth-method.binding-list.bind-type.node"],null]],[1,"\\n "]],[]]]]],[1,"\\n"]],[]],[[[41,[28,[37,2],[[30,1,["BindType"]],"role"],null],[[[1," "],[8,[39,3],null,null,[["default"],[[[[1,"\\n "],[1,[28,[35,0],["components.consul.auth-method.binding-list.bind-type.role"],null]],[1,"\\n "]],[]]]]],[1,"\\n "]],[]],null]],[]]]],[]]],[1," "],[13],[1,"\\n "],[13],[1,"\\n "],[10,"dt"],[12],[1,[28,[35,0],["models.binding-rule.Selector"],null]],[13],[1,"\\n "],[10,"dd"],[12],[10,"code"],[12],[1,[30,1,["Selector"]]],[13],[13],[1,"\\n "],[10,"dt"],[12],[1,[28,[35,0],["models.binding-rule.Description"],null]],[13],[1,"\\n "],[10,"dd"],[12],[1,[30,1,["Description"]]],[13],[1,"\\n "],[13],[1,"\\n"],[13]],["@item"],false,["t","if","eq","tooltip"]]',moduleName:"consul-ui/components/consul/auth-method/binding-list/index.hbs",isStrictMode:!1}) +var i=(0,t.setComponentTemplate)(r,(0,l.default)()) +e.default=i})),define("consul-ui/components/consul/auth-method/list/index",["exports","@ember/component","@ember/template-factory","@ember/component/template-only"],(function(e,t,n,l){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const r=(0,n.createTemplateFactory)({id:"klEqVgSZ",block:'[[[8,[39,0],[[24,0,"consul-auth-method-list"]],[["@items"],[[30,1]]],[["default"],[[[[1,"\\n "],[8,[39,1],null,[["@name"],["header"]],[["default"],[[[[1,"\\n"],[41,[28,[37,3],[[30,2,["DisplayName"]],""],null],[[[1," "],[10,3],[15,6,[28,[37,4],["dc.acls.auth-methods.show",[30,2,["Name"]]],null]],[12],[1,"\\n "],[1,[30,2,["DisplayName"]]],[1,"\\n "],[13],[1,"\\n"]],[]],[[[1," "],[10,3],[15,6,[28,[37,4],["dc.acls.auth-methods.show",[30,2,["Name"]]],null]],[12],[1,"\\n "],[1,[30,2,["Name"]]],[1,"\\n "],[13],[1,"\\n"]],[]]],[1," "]],[]]]]],[1,"\\n "],[8,[39,1],null,[["@name"],["details"]],[["default"],[[[[1,"\\n "],[8,[39,5],null,[["@item"],[[30,2]]],null],[1,"\\n"],[41,[28,[37,3],[[30,2,["DisplayName"]],""],null],[[[1," "],[10,1],[12],[1,[30,2,["Name"]]],[13],[1,"\\n"]],[]],null],[41,[28,[37,6],[[30,2,["TokenLocality"]],"global"],null],[[[1," "],[10,1],[14,0,"locality"],[12],[1,"creates global tokens"],[13],[1,"\\n"]],[]],null],[41,[30,2,["MaxTokenTTL"]],[[[1," "],[10,"dl"],[14,0,"ttl"],[12],[1,"\\n "],[10,"dt"],[12],[1,"\\n "],[8,[39,7],null,null,[["default"],[[[[1,"\\n Maximum Time to Live: the maximum life of any token created by this auth method\\n "]],[]]]]],[1,"\\n "],[13],[1,"\\n "],[10,"dd"],[12],[1,[30,2,["MaxTokenTTL"]]],[13],[1,"\\n "],[13],[1,"\\n"]],[]],null],[1," "]],[]]]]],[1,"\\n"]],[2]]]]],[1,"\\n"]],["@items","item"],false,["list-collection","block-slot","if","not-eq","href-to","consul/auth-method/type","eq","tooltip"]]',moduleName:"consul-ui/components/consul/auth-method/list/index.hbs",isStrictMode:!1}) +var i=(0,t.setComponentTemplate)(r,(0,l.default)()) +e.default=i})),define("consul-ui/components/consul/auth-method/nspace-list/index",["exports","@ember/component","@ember/template-factory","@ember/component/template-only"],(function(e,t,n,l){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const r=(0,n.createTemplateFactory)({id:"IaUtLqXB",block:'[[[10,0],[14,0,"consul-auth-method-nspace-list"],[12],[1,"\\n "],[10,"table"],[12],[1,"\\n "],[10,"thead"],[12],[1,"\\n "],[10,"tr"],[12],[1,"\\n "],[10,"td"],[12],[1,[28,[35,0],["models.auth-method.Selector"],null]],[13],[1,"\\n "],[10,"td"],[12],[1,[28,[35,0],["models.auth-method.BindNamespace"],null]],[13],[1,"\\n "],[13],[1,"\\n "],[13],[1,"\\n "],[10,"tbody"],[12],[1,"\\n"],[42,[28,[37,2],[[28,[37,2],[[30,1]],null]],null],null,[[[1," "],[10,"tr"],[12],[1,"\\n "],[10,"td"],[12],[1,[30,2,["Selector"]]],[13],[1,"\\n "],[10,"td"],[12],[1,[30,2,["BindNamespace"]]],[13],[1,"\\n "],[13],[1,"\\n"]],[2]],null],[1," "],[13],[1,"\\n "],[13],[1,"\\n"],[13],[1,"\\n\\n"]],["@items","item"],false,["t","each","-track-array"]]',moduleName:"consul-ui/components/consul/auth-method/nspace-list/index.hbs",isStrictMode:!1}) +var i=(0,t.setComponentTemplate)(r,(0,l.default)()) +e.default=i})),define("consul-ui/components/consul/auth-method/search-bar/index",["exports","@ember/component","@ember/template-factory","@ember/component/template-only"],(function(e,t,n,l){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const r=(0,n.createTemplateFactory)({id:"TX/eSrxH",block:'[[[8,[39,0],[[24,0,"consul-auth-method-search-bar"],[17,1]],[["@filter"],[[30,2]]],[["status","search","filter","sort"],[[[[1,"\\n\\n"],[44,[[28,[37,2],[[28,[37,3],["components.consul.auth-method.search-bar.",[30,3,["status","key"]],".name"],null]],[["default"],[[28,[37,4],[[28,[37,3],["common.search.",[30,3,["status","key"]]],null],[28,[37,3],["common.consul.",[30,3,["status","key"]]],null]],null]]]],[28,[37,2],[[28,[37,3],["components.consul.auth-method.search-bar.",[30,3,["status","key"]],".options.",[30,3,["status","value"]]],null]],[["default"],[[28,[37,4],[[28,[37,3],["common.search.",[30,3,["status","value"]]],null],[28,[37,3],["common.consul.",[30,3,["status","value"]]],null],[28,[37,3],["common.brand.",[30,3,["status","value"]]],null]],null]]]]],[[[1," "],[8,[30,3,["RemoveFilter"]],[[16,"aria-label",[28,[37,2],["common.ui.remove"],[["item"],[[28,[37,3],[[30,4]," ",[30,5]],null]]]]]],null,[["default"],[[[[1,"\\n "],[10,"dl"],[12],[1,"\\n "],[10,"dt"],[12],[1,[30,4]],[13],[1,"\\n "],[10,"dd"],[12],[1,[30,5]],[13],[1,"\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n"]],[4,5]]],[1,"\\n "]],[3]],[[[1,"\\n "],[8,[30,6,["Search"]],null,[["@onsearch","@value","@placeholder"],[[28,[37,5],[[30,0],[30,7]],null],[30,8],[28,[37,2],["common.search.search"],null]]],[["default"],[[[[1,"\\n "],[8,[30,6,["Select"]],[[24,0,"type-search-properties"]],[["@position","@onchange","@multiple","@required"],["right",[28,[37,5],[[30,0],[30,2,["searchproperty","change"]]],null],true,true]],[["default"],[[[[1,"\\n "],[8,[39,6],null,[["@name"],["selected"]],[["default"],[[[[1,"\\n "],[10,1],[12],[1,"\\n "],[1,[28,[35,2],["common.search.searchproperty"],null]],[1,"\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,6],null,[["@name"],["options"]],[["default"],[[[[1,"\\n"],[44,[[30,9,["Optgroup"]],[30,9,["Option"]]],[[[42,[28,[37,8],[[28,[37,8],[[30,2,["searchproperty","default"]]],null]],null],null,[[[1," "],[8,[30,11],null,[["@value","@selected"],[[30,12],[28,[37,9],[[30,12],[30,2,["searchproperty","value"]]],null]]],[["default"],[[[[1,"\\n "],[1,[28,[35,2],[[28,[37,3],["common.consul.",[28,[37,10],[[30,12]],null]],null]],null]],[1,"\\n "]],[]]]]],[1,"\\n"]],[12]],null]],[10,11]]],[1," "]],[]]]]],[1,"\\n "]],[9]]]]],[1,"\\n "]],[]]]]],[1,"\\n "]],[6]],[[[1,"\\n "],[8,[30,13,["Select"]],[[24,0,"type-kind"]],[["@position","@onchange","@multiple"],["left",[28,[37,5],[[30,0],[30,2,["kind","change"]]],null],true]],[["default"],[[[[1,"\\n "],[8,[39,6],null,[["@name"],["selected"]],[["default"],[[[[1,"\\n "],[10,1],[12],[1,"\\n "],[1,[28,[35,2],["components.consul.auth-method.search-bar.kind.name"],null]],[1,"\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,6],null,[["@name"],["options"]],[["default"],[[[[1,"\\n"],[44,[[30,14,["Optgroup"]],[30,14,["Option"]]],[[[1," "],[8,[30,16],null,[["@value","@selected"],["kubernetes",[28,[37,9],["kubernetes",[30,2,["kind","value"]]],null]]],[["default"],[[[[1,"\\n "],[8,[39,11],[[24,0,"mr-2.5"]],[["@name"],["kubernetes-color"]],null],[1,"\\n Kubernetes\\n "]],[]]]]],[1,"\\n "],[8,[30,16],[[24,0,"jwt"]],[["@value","@selected"],["jwt",[28,[37,9],["jwt",[30,2,["kind","value"]]],null]]],[["default"],[[[[1,"JWT"]],[]]]]],[1,"\\n"],[41,[28,[37,13],["CONSUL_SSO_ENABLED"],null],[[[1," "],[8,[30,16],[[24,0,"oidc"]],[["@value","@selected"],["oidc",[28,[37,9],["oidc",[30,2,["kind","value"]]],null]]],[["default"],[[[[1,"OIDC"]],[]]]]],[1,"\\n"]],[]],null]],[15,16]]],[1," "]],[]]]]],[1,"\\n "]],[14]]]]],[1,"\\n "],[8,[30,13,["Select"]],[[24,0,"type-locality"]],[["@position","@onchange","@multiple"],["left",[28,[37,5],[[30,0],[30,2,["source","change"]]],null],true]],[["default"],[[[[1,"\\n "],[8,[39,6],null,[["@name"],["selected"]],[["default"],[[[[1,"\\n "],[10,1],[12],[1,"\\n "],[1,[28,[35,2],["components.consul.auth-method.search-bar.locality.name"],null]],[1,"\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,6],null,[["@name"],["options"]],[["default"],[[[[1,"\\n"],[44,[[30,17,["Optgroup"]],[30,17,["Option"]]],[[[42,[28,[37,8],[[28,[37,8],[[28,[37,4],["local","global"],null]],null]],null],null,[[[1," "],[8,[30,19],[[16,0,[29,[[30,20]]]]],[["@value","@selected"],[[30,20],[28,[37,9],[[30,20],[30,2,["types"]]],null]]],[["default"],[[[[1,"\\n "],[1,[28,[35,2],[[28,[37,3],["components.consul.auth-method.search-bar.locality.options.",[30,20]],null]],null]],[1,"\\n "]],[]]]]],[1,"\\n"]],[20]],null]],[18,19]]],[1," "]],[]]]]],[1,"\\n "]],[17]]]]],[1,"\\n "]],[13]],[[[1,"\\n "],[8,[30,21,["Select"]],[[24,0,"type-sort"]],[["@position","@onchange","@multiple","@required"],["right",[28,[37,5],[[30,0],[30,22,["change"]]],null],false,true]],[["default"],[[[[1,"\\n "],[8,[39,6],null,[["@name"],["selected"]],[["default"],[[[[1,"\\n "],[10,1],[12],[1,"\\n"],[44,[[28,[37,14],[[28,[37,4],[[28,[37,4],["MethodName:asc",[28,[37,2],["common.sort.alpha.asc"],null]],null],[28,[37,4],["MethodName:desc",[28,[37,2],["common.sort.alpha.desc"],null]],null],[28,[37,4],["TokenTTL:desc",[28,[37,2],["common.sort.duration.asc"],null]],null],[28,[37,4],["TokenTTL:asc",[28,[37,2],["common.sort.duration.desc"],null]],null]],null]],null]],[[[1," "],[1,[28,[35,15],[[30,24],[30,22,["value"]]],null]],[1,"\\n"]],[24]]],[1," "],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,6],null,[["@name"],["options"]],[["default"],[[[[1,"\\n"],[44,[[30,23,["Optgroup"]],[30,23,["Option"]]],[[[1," "],[8,[30,25],null,[["@label"],[[28,[37,2],["common.ui.name"],null]]],[["default"],[[[[1,"\\n "],[8,[30,26],null,[["@value","@selected"],["MethodName:asc",[28,[37,16],["MethodName:asc",[30,22,["value"]]],null]]],[["default"],[[[[1,[28,[35,2],["common.sort.alpha.asc"],null]]],[]]]]],[1,"\\n "],[8,[30,26],null,[["@value","@selected"],["MethodName:desc",[28,[37,16],["MethodName:desc",[30,22,["value"]]],null]]],[["default"],[[[[1,[28,[35,2],["common.sort.alpha.desc"],null]]],[]]]]],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[30,25],null,[["@label"],[[28,[37,2],["common.ui.maxttl"],null]]],[["default"],[[[[1,"\\n "],[8,[30,26],null,[["@value","@selected"],["TokenTTL:desc",[28,[37,16],["TokenTTL:desc",[30,22,["value"]]],null]]],[["default"],[[[[1,[28,[35,2],["common.sort.duration.asc"],null]]],[]]]]],[1,"\\n "],[8,[30,26],null,[["@value","@selected"],["TokenTTL:asc",[28,[37,16],["TokenTTL:asc",[30,22,["value"]]],null]]],[["default"],[[[[1,[28,[35,2],["common.sort.duration.desc"],null]]],[]]]]],[1,"\\n "]],[]]]]],[1,"\\n"]],[25,26]]],[1," "]],[]]]]],[1,"\\n "]],[23]]]]],[1,"\\n "]],[21]]]]],[1,"\\n"]],["&attrs","@filter","search","key","value","search","@onsearch","@search","components","Optgroup","Option","prop","search","components","Optgroup","Option","components","Optgroup","Option","option","search","@sort","components","selectable","Optgroup","Option"],false,["search-bar","let","t","concat","array","action","block-slot","each","-track-array","includes","lowercase","flight-icon","if","env","from-entries","get","eq"]]',moduleName:"consul-ui/components/consul/auth-method/search-bar/index.hbs",isStrictMode:!1}) +var i=(0,t.setComponentTemplate)(r,(0,l.default)()) +e.default=i})),define("consul-ui/components/consul/auth-method/type/index",["exports","@ember/component","@ember/template-factory","@ember/component/template-only"],(function(e,t,n,l){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const r=(0,n.createTemplateFactory)({id:"KzIxa15o",block:'[[[44,[[28,[37,1],[[30,1,["Type"]]],null]],[[[1," "],[10,1],[15,0,[29,["consul-auth-method-type ",[52,[51,[30,2]],[30,1,["Type"]]]]]],[12],[1,"\\n"],[41,[30,2],[[[1," "],[8,[39,4],[[24,0,"mr-1.5 w-4 h-4"]],[["@name"],[[30,2]]],null],[1,"\\n"]],[]],null],[1," "],[1,[28,[35,5],[[28,[37,6],["common.brand.",[30,1,["Type"]]],null]],null]],[1,"\\n "],[13],[1,"\\n"]],[2]]]],["@item","flightIcon"],false,["let","icon-mapping","unless","if","flight-icon","t","concat"]]',moduleName:"consul-ui/components/consul/auth-method/type/index.hbs",isStrictMode:!1}) +var i=(0,t.setComponentTemplate)(r,(0,l.default)()) +e.default=i})),define("consul-ui/components/consul/auth-method/view/index",["exports","@ember/component","@ember/template-factory","@ember/component/template-only"],(function(e,t,n,l){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const r=(0,n.createTemplateFactory)({id:"4cpKdVK+",block:'[[[1," "],[10,0],[14,0,"consul-auth-method-view"],[12],[1,"\\n"],[41,[28,[37,1],[[30,1,["Type"]],"kubernetes"],null],[[[1," "],[10,"dl"],[12],[1,"\\n "],[10,"dt"],[12],[1,[28,[35,2],["models.auth-method.Type"],null]],[13],[1,"\\n "],[10,"dd"],[12],[8,[39,3],null,[["@item"],[[30,1]]],null],[13],[1,"\\n\\n"],[42,[28,[37,5],[[28,[37,5],[[28,[37,6],["MaxTokenTTL","TokenLocality","DisplayName","Description"],null]],null]],null],null,[[[41,[28,[37,7],[[30,1],[30,2]],null],[[[1," "],[10,"dt"],[12],[1,[28,[35,2],[[28,[37,8],["models.auth-method.",[30,2]],null]],null]],[13],[1,"\\n "],[10,"dd"],[12],[1,[28,[35,7],[[30,1],[30,2]],null]],[13],[1,"\\n"]],[]],null]],[2]],null],[41,[30,1,["Config","Host"]],[[[1," "],[10,"dt"],[12],[1,[28,[35,2],["models.auth-method.Config.Host"],null]],[13],[1,"\\n "],[10,"dd"],[12],[1,"\\n "],[8,[39,9],null,[["@value","@name"],[[30,1,["Config","Host"]],[28,[37,2],["models.auth-method.Config.Host"],null]]],null],[1,"\\n "],[13],[1,"\\n"]],[]],null],[41,[30,1,["Config","CACert"]],[[[1," "],[10,"dt"],[12],[1,[28,[35,2],["models.auth-method.Config.CACert"],null]],[13],[1,"\\n "],[10,"dd"],[12],[1,"\\n "],[8,[39,9],null,[["@obfuscated","@value","@name"],[true,[30,1,["Config","CACert"]],[28,[37,2],["models.auth-method.Config.CACert"],null]]],null],[1,"\\n "],[13],[1,"\\n"]],[]],null],[41,[30,1,["Config","ServiceAccountJWT"]],[[[1," "],[10,"dt"],[12],[1,[28,[35,2],["models.auth-method.Config.ServiceAccountJWT"],null]],[13],[1,"\\n "],[10,"dd"],[12],[1,"\\n "],[8,[39,9],null,[["@value","@name"],[[30,1,["Config","ServiceAccountJWT"]],[28,[37,2],["models.auth-method.Config.ServiceAccountJWT"],null]]],null],[1,"\\n "],[13],[1,"\\n"]],[]],null],[1," "],[13],[1,"\\n"]],[]],[[[1," "],[10,"section"],[14,0,"meta"],[12],[1,"\\n "],[10,"dl"],[12],[1,"\\n "],[10,"dt"],[12],[1,"Type"],[13],[1,"\\n "],[10,"dd"],[12],[1,"\\n "],[8,[39,3],null,[["@item"],[[30,1]]],null],[1,"\\n "],[13],[1,"\\n\\n"],[42,[28,[37,5],[[28,[37,5],[[28,[37,6],["MaxTokenTTL","TokenLocality","DisplayName","Description"],null]],null]],null],null,[[[41,[28,[37,7],[[30,1],[30,3]],null],[[[1,"\\n "],[10,"dt"],[12],[1,[28,[35,2],[[28,[37,8],["models.auth-method.",[30,3]],null]],null]],[13],[1,"\\n "],[10,"dd"],[12],[1,[28,[35,7],[[30,1],[30,3]],null]],[13],[1,"\\n\\n"]],[]],null]],[3]],null],[1,"\\n"],[41,[28,[37,1],[[30,1,["Type"]],"aws-iam"],null],[[[1,"\\n"],[44,[[30,1,["Config"]]],[[[42,[28,[37,5],[[28,[37,5],[[28,[37,6],["BoundIAMPrincipalARNs","EnableIAMEntityDetails","IAMEntityTags","IAMEndpoint","MaxRetries","STSEndpoint","STSRegion","AllowedSTSHeaderValues","ServerIDHeaderValue"],null]],null]],null],null,[[[41,[28,[37,7],[[30,4],[30,5]],null],[[[1,"\\n "],[10,"dt"],[12],[1,[28,[35,2],[[28,[37,8],["models.auth-method.",[30,5]],null]],null]],[13],[1,"\\n "],[10,"dd"],[12],[1,"\\n"],[44,[[28,[37,7],[[30,4],[30,5]],null]],[[[41,[28,[37,11],[[30,6]],null],[[[1," "],[10,"ul"],[12],[1,"\\n"],[42,[28,[37,5],[[28,[37,5],[[30,6]],null]],null],null,[[[1," "],[10,"li"],[12],[1,"\\n "],[10,1],[12],[1,[30,7]],[13],[1,"\\n "],[13],[1,"\\n"]],[7]],null],[1," "],[13],[1,"\\n"]],[]],[[[1," "],[1,[30,6]],[1,"\\n"]],[]]]],[6]]],[1," "],[13],[1,"\\n\\n"]],[]],null]],[5]],null],[1,"\\n"]],[4]]],[1,"\\n"]],[]],[[[41,[28,[37,1],[[30,1,["Type"]],"jwt"],null],[[[41,[30,1,["Config","JWKSURL"]],[[[1," "],[10,"dt"],[12],[1,[28,[35,2],["models.auth-method.Config.JWKSURL"],null]],[13],[1,"\\n "],[10,"dd"],[12],[1,"\\n "],[8,[39,9],null,[["@value","@name"],[[30,1,["Config","JWKSURL"]],[28,[37,2],["models.auth-method.Config.JWKSURL"],null]]],null],[1,"\\n "],[13],[1,"\\n "],[10,"dt"],[12],[1,[28,[35,2],["models.auth-method.Config.JWKSCACert"],null]],[13],[1,"\\n "],[10,"dd"],[12],[1,"\\n "],[8,[39,9],null,[["@obfuscated","@value","@name"],[true,[30,1,["Config","JWKSCACert"]],[28,[37,2],["models.auth-method.Config.JWKSCACert"],null]]],null],[1,"\\n "],[13],[1,"\\n"]],[]],null],[41,[30,1,["Config","JWTValidationPubKeys"]],[[[1," "],[10,"dt"],[12],[1,[28,[35,2],["models.auth-method.Config.JWTValidationPubKeys"],null]],[13],[1,"\\n "],[10,"dd"],[12],[1,"\\n "],[8,[39,9],null,[["@obfuscated","@value","@name"],[true,[30,1,["Config","JWTValidationPubKeys"]],[28,[37,2],["models.auth-method.Config.JWTValidationPubKeys"],null]]],null],[1,"\\n "],[13],[1,"\\n"]],[]],null],[41,[30,1,["Config","OIDCDiscoveryURL"]],[[[1," "],[10,"dt"],[12],[1,[28,[35,2],["models.auth-method.Config.OIDCDiscoveryURL"],null]],[13],[1,"\\n "],[10,"dd"],[12],[1,"\\n "],[8,[39,9],null,[["@value","@name"],[[30,1,["Config","OIDCDiscoveryURL"]],[28,[37,2],["models.auth-method.Config.OIDCDiscoveryURL"],null]]],null],[1,"\\n "],[13],[1,"\\n"]],[]],null],[41,[30,1,["Config","JWTSupportedAlgs"]],[[[1," "],[10,"dt"],[12],[1,[28,[35,2],["models.auth-method.Config.JWTSupportedAlgs"],null]],[13],[1,"\\n "],[10,"dd"],[12],[1,[28,[35,12],[", ",[30,1,["Config","JWTSupportedAlgs"]]],null]],[13],[1,"\\n"]],[]],null],[41,[30,1,["Config","BoundAudiences"]],[[[1," "],[10,"dt"],[12],[1,[28,[35,2],["models.auth-method.Config.BoundAudiences"],null]],[13],[1,"\\n "],[10,"dd"],[12],[1,"\\n "],[10,"ul"],[12],[1,"\\n"],[42,[28,[37,5],[[28,[37,5],[[30,1,["Config","BoundAudiences"]]],null]],null],null,[[[1," "],[10,"li"],[12],[1,"\\n "],[10,1],[12],[1,[30,8]],[13],[1,"\\n "],[13],[1,"\\n"]],[8]],null],[1," "],[13],[1,"\\n "],[13],[1,"\\n"]],[]],null],[42,[28,[37,5],[[28,[37,5],[[28,[37,6],["BoundIssuer","ExpirationLeeway","NotBeforeLeeway","ClockSkewLeeway"],null]],null]],null],null,[[[41,[28,[37,7],[[30,1,["Config"]],[30,9]],null],[[[1," "],[10,"dt"],[12],[1,[28,[35,2],[[28,[37,8],["models.auth-method.Config.",[30,9]],null]],null]],[13],[1,"\\n "],[10,"dd"],[12],[1,[28,[35,7],[[30,1,["Config"]],[30,9]],null]],[13],[1,"\\n"]],[]],null]],[9]],null]],[]],[[[41,[28,[37,1],[[30,1,["Type"]],"oidc"],null],[[[41,[30,1,["Config","OIDCDiscoveryURL"]],[[[1," "],[10,"dt"],[12],[1,[28,[35,2],["models.auth-method.Config.OIDCDiscoveryURL"],null]],[13],[1,"\\n "],[10,"dd"],[12],[1,"\\n "],[8,[39,9],null,[["@value","@name"],[[30,1,["Config","OIDCDiscoveryURL"]],[28,[37,2],["models.auth-method.Config.OIDCDiscoveryURL"],null]]],null],[1,"\\n "],[13],[1,"\\n"]],[]],null],[41,[30,1,["Config","OIDCDiscoveryCACert"]],[[[1," "],[10,"dt"],[12],[1,[28,[35,2],["models.auth-method.Config.OIDCDiscoveryCACert"],null]],[13],[1,"\\n "],[10,"dd"],[12],[1,"\\n "],[8,[39,9],null,[["@obfuscated","@value","@name"],[true,[30,1,["Config","OIDCDiscoveryCACert"]],[28,[37,2],["models.auth-method.Config.OIDCDiscoveryCACert"],null]]],null],[1,"\\n "],[13],[1,"\\n"]],[]],null],[41,[30,1,["Config","OIDCClientID"]],[[[1," "],[10,"dt"],[12],[1,[28,[35,2],["models.auth-method.Config.OIDCClientID"],null]],[13],[1,"\\n "],[10,"dd"],[12],[1,[30,1,["Config","OIDCClientID"]]],[13],[1,"\\n"]],[]],null],[41,[30,1,["Config","OIDCClientSecret"]],[[[1," "],[10,"dt"],[12],[1,[28,[35,2],["models.auth-method.Config.OIDCClientSecret"],null]],[13],[1,"\\n "],[10,"dd"],[12],[1,[30,1,["Config","OIDCClientSecret"]]],[13],[1,"\\n"]],[]],null],[41,[30,1,["Config","AllowedRedirectURIs"]],[[[1," "],[10,"dt"],[12],[1,[28,[35,2],["models.auth-method.Config.AllowedRedirectURIs"],null]],[13],[1,"\\n "],[10,"dd"],[12],[1,"\\n "],[10,"ul"],[12],[1,"\\n"],[42,[28,[37,5],[[28,[37,5],[[30,1,["Config","AllowedRedirectURIs"]]],null]],null],null,[[[1," "],[10,"li"],[12],[1,"\\n "],[8,[39,9],null,[["@value","@name"],[[30,10],"Redirect URI"]],null],[1,"\\n "],[13],[1,"\\n"]],[10]],null],[1," "],[13],[1,"\\n "],[13],[1,"\\n"]],[]],null],[41,[30,1,["Config","BoundAudiences"]],[[[1," "],[10,"dt"],[12],[1,[28,[35,2],["models.auth-method.Config.BoundAudiences"],null]],[13],[1,"\\n "],[10,"dd"],[12],[1,"\\n "],[10,"ul"],[12],[1,"\\n"],[42,[28,[37,5],[[28,[37,5],[[30,1,["Config","BoundAudiences"]]],null]],null],null,[[[1," "],[10,"li"],[12],[1,"\\n "],[10,1],[12],[1,[30,11]],[13],[1,"\\n "],[13],[1,"\\n"]],[11]],null],[1," "],[13],[1,"\\n "],[13],[1,"\\n"]],[]],null],[41,[30,1,["Config","OIDCScopes"]],[[[1," "],[10,"dt"],[12],[1,[28,[35,2],["models.auth-method.Config.OIDCScopes"],null]],[13],[1,"\\n "],[10,"dd"],[12],[1,"\\n "],[10,"ul"],[12],[1,"\\n"],[42,[28,[37,5],[[28,[37,5],[[30,1,["Config","OIDCScopes"]]],null]],null],null,[[[1," "],[10,"li"],[12],[1,"\\n "],[10,1],[12],[1,[30,12]],[13],[1,"\\n "],[13],[1,"\\n"]],[12]],null],[1," "],[13],[1,"\\n "],[13],[1,"\\n"]],[]],null],[41,[30,1,["Config","JWTSupportedAlgs"]],[[[1," "],[10,"dt"],[12],[1,[28,[35,2],["models.auth-method.Config.JWTSupportedAlgs"],null]],[13],[1,"\\n "],[10,"dd"],[12],[1,[28,[35,12],[", ",[30,1,["Config","JWTSupportedAlgs"]]],null]],[13],[1,"\\n"]],[]],null],[41,[30,1,["Config","VerboseOIDCLogging"]],[[[1," "],[10,"dt"],[14,0,"check"],[12],[1,[28,[35,2],["models.auth-method.Config.VerboseOIDCLogging"],null]],[13],[1,"\\n "],[10,"dd"],[12],[10,"input"],[14,"disabled","disabled"],[15,"checked",[30,1,["Config","VerboseOIDCLogging"]]],[14,4,"checkbox"],[12],[13],[13],[1,"\\n"]],[]],null],[1," "]],[]],null]],[]]]],[]]],[1," "],[13],[1,"\\n "],[13],[1,"\\n\\n"],[41,[28,[37,13],[[28,[37,1],[[30,1,["Type"]],"aws-iam"],null]],null],[[[1," "],[10,"hr"],[12],[13],[1,"\\n\\n "],[10,"section"],[14,0,"claim-mappings"],[12],[1,"\\n "],[10,"h2"],[12],[1,"Claim Mappings"],[13],[1,"\\n"],[41,[30,1,["Config","ClaimMappings"]],[[[1," "],[10,2],[12],[1,"Use this if the claim you are capturing is singular. When mapped, the values can be any of a number, string, or boolean and will all be stringified when returned."],[13],[1,"\\n "],[10,"table"],[12],[1,"\\n "],[10,"thead"],[12],[1,"\\n "],[10,"tr"],[12],[1,"\\n "],[10,"td"],[12],[1,"Key"],[13],[1,"\\n "],[10,"td"],[12],[1,"Value"],[13],[1,"\\n "],[13],[1,"\\n "],[13],[1,"\\n "],[10,"tbody"],[12],[1,"\\n"],[42,[28,[37,5],[[28,[37,5],[[28,[37,14],[[30,1,["Config","ClaimMappings"]]],null]],null]],null],null,[[[1," "],[10,"tr"],[12],[1,"\\n "],[10,"td"],[12],[1,[28,[35,7],[[30,13],0],null]],[13],[1,"\\n "],[10,"td"],[12],[1,[28,[35,7],[[30,13],1],null]],[13],[1,"\\n "],[13],[1,"\\n"]],[13]],null],[1," "],[13],[1,"\\n "],[13],[1,"\\n"]],[]],[[[1," "],[8,[39,15],null,null,[["default"],[[[[1,"\\n "],[8,[39,16],null,[["@name"],["header"]],[["default"],[[[[1,"\\n "],[10,"h2"],[12],[1,"No claim mappings"],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,16],null,[["@name"],["body"]],[["default"],[[[[1,"\\n "],[10,2],[12],[1,"Use this if the claim you are capturing is singular. When mapped, the values can be any of a number, string, or boolean and will all be stringified when returned."],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,16],null,[["@name"],["actions"]],[["default"],[[[[1,"\\n "],[10,"li"],[14,0,"docs-link"],[12],[1,"\\n"],[41,[28,[37,1],[[30,1,["Type"]],"jwt"],null],[[[1," "],[10,3],[15,6,[29,[[28,[37,17],["CONSUL_DOCS_URL"],null],"/security/acl/auth-methods/jwt#claimmappings"]]],[14,"rel","noopener noreferrer"],[14,"target","_blank"],[12],[1,"Read the documentation"],[13],[1,"\\n"]],[]],[[[1," "],[10,3],[15,6,[29,[[28,[37,17],["CONSUL_DOCS_URL"],null],"/security/acl/auth-methods/oidc#claimmappings"]]],[14,"rel","noopener noreferrer"],[14,"target","_blank"],[12],[1,"Read the documentation"],[13],[1,"\\n"]],[]]],[1," "],[13],[1,"\\n "]],[]]]]],[1,"\\n "]],[]]]]],[1,"\\n"]],[]]],[1," "],[13],[1,"\\n\\n "],[10,"hr"],[12],[13],[1,"\\n\\n "],[10,"section"],[14,0,"list-claim-mappings"],[12],[1,"\\n "],[10,"h2"],[12],[1,"List Claim Mappings"],[13],[1,"\\n"],[41,[30,1,["Config","ListClaimMappings"]],[[[1," "],[10,2],[12],[1,"Use this if the claim you are capturing is list-like (such as groups). When mapped, the values can be any of a number, string, or boolean and will all be stringified when returned."],[13],[1,"\\n "],[10,"table"],[12],[1,"\\n "],[10,"thead"],[12],[1,"\\n "],[10,"tr"],[12],[1,"\\n "],[10,"td"],[12],[1,"Key"],[13],[1,"\\n "],[10,"td"],[12],[1,"Value"],[13],[1,"\\n "],[13],[1,"\\n "],[13],[1,"\\n "],[10,"tbody"],[12],[1,"\\n"],[42,[28,[37,5],[[28,[37,5],[[28,[37,14],[[30,1,["Config","ListClaimMappings"]]],null]],null]],null],null,[[[1," "],[10,"tr"],[12],[1,"\\n "],[10,"td"],[12],[1,[28,[35,7],[[30,14],0],null]],[13],[1,"\\n "],[10,"td"],[12],[1,[28,[35,7],[[30,14],1],null]],[13],[1,"\\n "],[13],[1,"\\n"]],[14]],null],[1," "],[13],[1,"\\n "],[13],[1,"\\n"]],[]],[[[1," "],[8,[39,15],null,null,[["default"],[[[[1,"\\n "],[8,[39,16],null,[["@name"],["header"]],[["default"],[[[[1,"\\n "],[10,"h2"],[12],[1,"No list claim mappings"],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,16],null,[["@name"],["body"]],[["default"],[[[[1,"\\n "],[10,2],[12],[1,"Use this if the claim you are capturing is list-like (such as groups). When mapped, the values can be any of a number, string, or boolean and will all be stringified when returned."],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,16],null,[["@name"],["actions"]],[["default"],[[[[1,"\\n "],[10,"li"],[14,0,"docs-link"],[12],[1,"\\n"],[41,[28,[37,1],[[30,1,["Type"]],"jwt"],null],[[[1," "],[10,3],[15,6,[29,[[28,[37,17],["CONSUL_DOCS_URL"],null],"/security/acl/auth-methods/jwt#listclaimmappings"]]],[14,"rel","noopener noreferrer"],[14,"target","_blank"],[12],[1,"Read the documentation"],[13],[1,"\\n"]],[]],[[[1," "],[10,3],[15,6,[29,[[28,[37,17],["CONSUL_DOCS_URL"],null],"/security/acl/auth-methods/oidc#listclaimmappings"]]],[14,"rel","noopener noreferrer"],[14,"target","_blank"],[12],[1,"Read the documentation"],[13],[1,"\\n"]],[]]],[1," "],[13],[1,"\\n "]],[]]]]],[1,"\\n "]],[]]]]],[1,"\\n"]],[]]],[1," "],[13],[1,"\\n"]],[]],null]],[]]],[1," "],[13]],["@item","value","value","config","value","item","jtem","bond","value","uri","bond","scope","entry","entry"],false,["if","eq","t","consul/auth-method/type","each","-track-array","array","get","concat","copyable-code","let","array-is-array","join","not","entries","empty-state","block-slot","env"]]',moduleName:"consul-ui/components/consul/auth-method/view/index.hbs",isStrictMode:!1}) +var i=(0,t.setComponentTemplate)(r,(0,l.default)()) +e.default=i})),define("consul-ui/components/consul/bucket/list/index",["exports","@ember/component","@ember/template-factory","@glimmer/component","@ember/service"],(function(e,t,n,l,r){var i,o +Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const a=(0,n.createTemplateFactory)({id:"Uns+fzyc",block:'[[[41,[30,0,["itemsToDisplay","length"]],[[[1," "],[10,"dl"],[14,0,"consul-bucket-list"],[12],[1,"\\n"],[42,[28,[37,2],[[28,[37,2],[[30,0,["itemsToDisplay"]]],null]],null],null,[[[1," "],[11,"dt"],[16,0,[30,1,["type"]]],[4,[38,3],null,null],[12],[1,"\\n "],[1,[30,1,["label"]]],[1,"\\n "],[13],[1,"\\n "],[10,"dd"],[12],[1,"\\n "],[1,[30,1,["item"]]],[1,"\\n "],[13],[1,"\\n"]],[1]],null],[1," "],[13],[1,"\\n"]],[]],null]],["item"],false,["if","each","-track-array","tooltip"]]',moduleName:"consul-ui/components/consul/bucket/list/index.hbs",isStrictMode:!1}) +let u=(i=class extends l.default{constructor(){var e,t,n,l +super(...arguments),e=this,t="abilities",l=this,(n=o)&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(l):void 0})}get itemsToDisplay(){const{peerOrPartitionPart:e,namespacePart:t,servicePart:n}=this +return[...e,...t,...n]}get peerOrPartitionPart(){const{peerPart:e,partitionPart:t}=this +return e.length?e:t}get partitionPart(){const{item:e,partition:t}=this.args,{abilities:n}=this +return t&&n.can("use partitions")&&e.Partition!==t?[{type:"partition",label:"Admin Partition",item:e.Partition}]:[]}get peerPart(){const{item:e}=this.args +return e.PeerName?[{type:"peer",label:"Peer",item:e.PeerName}]:[]}get namespacePart(){const{item:e,nspace:t}=this.args,{abilities:n,partitionPart:l,peerPart:r}=this,i={type:"nspace",label:"Namespace",item:e.Namespace} +return l.length||r.length&&n.can("use nspaces")||t&&n.can("use nspaces")&&e.Namespace!==t?[i]:[]}get servicePart(){const{item:e,service:t}=this.args,{partitionPart:n,namespacePart:l}=this +return(n.length||l.length)&&e.Service&&t?[{type:"service",label:"Service",item:e.Service}]:[]}},s=i.prototype,c="abilities",d=[r.inject],p={configurable:!0,enumerable:!0,writable:!0,initializer:null},m={},Object.keys(p).forEach((function(e){m[e]=p[e]})),m.enumerable=!!m.enumerable,m.configurable=!!m.configurable,("value"in m||m.initializer)&&(m.writable=!0),m=d.slice().reverse().reduce((function(e,t){return t(s,c,e)||e}),m),f&&void 0!==m.initializer&&(m.value=m.initializer?m.initializer.call(f):void 0,m.initializer=void 0),void 0===m.initializer&&(Object.defineProperty(s,c,m),m=null),o=m,i) +var s,c,d,p,f,m +e.default=u,(0,t.setComponentTemplate)(a,u)})),define("consul-ui/components/consul/datacenter/selector/index",["exports","@ember/component","@ember/template-factory","@ember/component/template-only"],(function(e,t,n,l){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const r=(0,n.createTemplateFactory)({id:"b1hlblXc",block:'[[[10,"li"],[14,0,"dcs"],[12],[1,"\\n"],[41,[28,[37,1],[[30,1,["length"]],1],null],[[[1," "],[8,[39,2],[[24,"aria-label","Datacenter"]],[["@items"],[[28,[37,3],["Primary:desc","Local:desc","Name:asc",[30,1]],null]]],[["default"],[[[[1,"\\n "],[8,[30,2,["Action"]],[[4,[38,4],["click",[30,2,["toggle"]]],null]],null,[["default"],[[[[1,"\\n "],[1,[30,3,["Name"]]],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[30,2,["Menu"]],null,null,[["default"],[[[[1,"\\n "],[8,[39,5],null,[["@src","@onchange"],[[28,[37,6],["/*/*/*/datacenters"],null],[28,[37,7],[[30,0],[28,[37,8],[[30,1]],null]],[["value"],["data"]]]]],null],[1,"\\n "],[10,2],[14,0,"dcs-message"],[12],[1,"\\n Datacenters shown in this dropdown are available through WAN Federation.\\n "],[13],[1,"\\n "],[8,[30,4,["Menu"]],null,null,[["default"],[[[[1,"\\n "],[8,[30,5,["Separator"]],null,null,[["default"],[[[[1,"\\n DATACENTERS\\n "]],[]]]]],[1,"\\n"],[42,[28,[37,10],[[28,[37,10],[[30,5,["items"]]],null]],null],null,[[[1," "],[8,[30,5,["Item"]],[[16,"aria-current",[52,[28,[37,11],[[30,3,["Name"]],[30,6,["Name"]]],null],"true"]],[16,0,[28,[37,12],[[28,[37,13],["is-local",[30,6,["Local"]]],null],[28,[37,13],["is-primary",[30,6,["Primary"]]],null]],null]]],null,[["default"],[[[[1,"\\n "],[8,[30,5,["Action"]],[[4,[38,4],["click",[30,2,["close"]]],null]],[["@href"],[[28,[37,14],["."],[["params"],[[28,[37,15],null,[["dc","partition","nspace"],[[30,6,["Name"]],[27],[52,[28,[37,1],[[30,7,["length"]],0],null],[30,7],[27]]]]]]]]]],[["default"],[[[[1,"\\n "],[1,[30,6,["Name"]]],[1,"\\n"],[41,[30,6,["Primary"]],[[[1," "],[10,1],[12],[1,"Primary"],[13],[1,"\\n"]],[]],null],[41,[30,6,["Local"]],[[[1," "],[10,1],[12],[1,"Local"],[13],[1,"\\n"]],[]],null],[1," "]],[]]]]],[1,"\\n "]],[]]]]],[1,"\\n"]],[6]],null],[1," "]],[5]]]]],[1,"\\n "]],[4]]]]],[1,"\\n "]],[2]]]]],[1,"\\n"]],[]],[[[1," "],[10,0],[14,0,"dc-name"],[12],[1,"\\n "],[1,[30,1,["firstObject","Name"]]],[1,"\\n"],[44,[[28,[37,17],["CONSUL_HCP_MANAGED_RUNTIME"],null]],[[[41,[30,8],[[[1," "],[10,1],[12],[1,[28,[35,18],[[30,8]],null]],[13],[1,"\\n"]],[]],null]],[8]]],[1," "],[13],[1,"\\n"]],[]]],[13]],["@dcs","disclosure","@dc","panel","menu","item","@nspace","managedRuntime"],false,["if","gt","disclosure-menu","sort-by","on","data-source","uri","action","mut","each","-track-array","eq","class-map","array","href-to","hash","let","env","capitalize"]]',moduleName:"consul-ui/components/consul/datacenter/selector/index.hbs",isStrictMode:!1}) +var i=(0,t.setComponentTemplate)(r,(0,l.default)()) +e.default=i})),define("consul-ui/components/consul/discovery-chain/index",["exports","@ember/component","@ember/template-factory","@ember/service","@ember/object","consul-ui/components/consul/discovery-chain/utils"],(function(e,t,n,l,r,i){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const o=(0,n.createTemplateFactory)({id:"gGEpz1eC",block:'[[[10,"style"],[12],[1,"\\n"],[41,[33,1,["nodes"]],[[[1," "],[1,[33,1,["nodes"]]],[1,"\\n { opacity: 1 !important; background-color: var(--token-color-surface-interactive); border:\\n var(--decor-border-100); border-radius: var(--decor-radius-200); border-color:\\n var(--token-color-foreground-faint); box-shadow: var(--token-surface-high-box-shadow); }\\n"]],[]],null],[41,[33,1,["edges"]],[[[1," "],[1,[33,1,["edges"]]],[1,"\\n { opacity: 1; }\\n"]],[]],null],[13],[1,"\\n\\n"],[10,0],[14,0,"routes"],[12],[1,"\\n "],[10,"header"],[12],[1,"\\n "],[10,"h2"],[12],[1,"\\n "],[1,[33,2,["ServiceName"]]],[1,"\\n Router\\n "],[11,1],[4,[38,3],["Use routers to intercept traffic using Layer 7 criteria such as path prefixes or http headers."],null],[12],[1,"\\n "],[13],[1,"\\n "],[13],[1,"\\n "],[13],[1,"\\n "],[10,0],[14,"role","group"],[12],[1,"\\n"],[42,[28,[37,5],[[28,[37,5],[[33,6]],null]],null],null,[[[1," "],[8,[39,7],[[4,[38,9],[[28,[37,10],[[28,[37,11],[[30,1],"rect"],null]],[["from"],[[30,0,["edges"]]]]]],null]],[["@item","@onclick"],[[30,1],[28,[37,8],[[30,0],"click"],null]]],null],[1,"\\n"]],[1]],null],[1," "],[13],[1,"\\n"],[13],[1,"\\n\\n"],[10,0],[14,0,"splitters"],[12],[1,"\\n "],[10,"header"],[12],[1,"\\n "],[10,"h2"],[12],[1,"\\n Splitters\\n "],[11,1],[4,[38,3],["Splitters are configured to split incoming requests across different services or subsets of a single service."],null],[12],[1,"\\n "],[13],[1,"\\n "],[13],[1,"\\n "],[13],[1,"\\n "],[10,0],[14,"role","group"],[12],[1,"\\n"],[42,[28,[37,5],[[28,[37,5],[[28,[37,12],["Name",[33,13]],null]],null]],null],null,[[[1," "],[8,[39,14],[[4,[38,9],[[28,[37,10],[[28,[37,11],[[30,2],"rect"],null]],[["from"],[[30,0,["edges"]]]]]],null]],[["@item","@onclick"],[[30,2],[28,[37,8],[[30,0],"click"],null]]],null],[1,"\\n"]],[2]],null],[1," "],[13],[1,"\\n"],[13],[1,"\\n\\n"],[10,0],[14,0,"resolvers"],[12],[1,"\\n "],[10,"header"],[12],[1,"\\n "],[10,"h2"],[12],[1,"\\n Resolvers\\n "],[11,1],[4,[38,3],["Resolvers are used to define which instances of a service should satisfy discovery requests."],null],[12],[1,"\\n "],[13],[1,"\\n "],[13],[1,"\\n "],[13],[1,"\\n "],[10,0],[14,"role","group"],[12],[1,"\\n"],[42,[28,[37,5],[[28,[37,5],[[28,[37,12],["Name",[33,15]],null]],null]],null],null,[[[1," "],[8,[39,16],[[4,[38,9],[[28,[37,10],[[28,[37,11],[[30,3],"rect"],null]],[["from"],[[30,0,["edges"]]]]]],null]],[["@item","@edges","@onclick"],[[30,3],[30,0,["edges"]],[28,[37,8],[[30,0],"click"],null]]],null],[1,"\\n"]],[3]],null],[1," "],[13],[1,"\\n"],[13],[1,"\\n\\n"],[1,[34,17]],[1,"\\n\\n"],[11,"svg"],[24,0,"edges"],[24,"width","100%"],[24,"height","100%"],[24,"preserveAspectRatio","none"],[4,[38,18],[[28,[37,11],[[30,0],"edges"],null]],null],[12],[1,"\\n"],[42,[28,[37,5],[[28,[37,5],[[33,6]],null]],null],null,[[[41,[30,4,["rect"]],[[[44,[[30,4,["rect"]],[30,4,["NextItem","rect"]]],[[[44,[[28,[37,20],[[28,[37,21],null,[["x","y"],[[30,6,["x"]],[28,[37,22],[[30,6,["y"]],[28,[37,23],[[30,6,["height"]],2],null]],null]]]],[28,[37,24],[[30,4,["ID"]]],null]],null]],[[[1,"\\n "],[10,"path"],[15,1,[28,[37,24],[[30,4,["ID"]],">",[30,4,["NextNode"]]],null]],[15,"d",[28,[37,25],[[28,[37,21],null,[["x","y"],[[30,7,["x"]],[28,[37,26],[[30,7,["y"]],0],null]]]]],[["src"],[[28,[37,21],null,[["x","y"],[[30,5,["right"]],[28,[37,22],[[30,5,["y"]],[28,[37,23],[[30,5,["height"]],2],null]],null]]]]]]]],[12],[13],[1,"\\n\\n"]],[7]]]],[5,6]]]],[]],null]],[4]],null],[1,"\\n"],[42,[28,[37,5],[[28,[37,5],[[33,13]],null]],null],null,[[[41,[30,8,["rect"]],[[[44,[[30,8,["rect"]]],[[[42,[28,[37,5],[[28,[37,5],[[30,8,["Splits"]]],null]],null],null,[[[44,[[30,10,["NextItem","rect"]]],[[[44,[[28,[37,20],[[28,[37,21],null,[["x","y"],[[30,12,["x"]],[28,[37,22],[[30,12,["y"]],[28,[37,23],[[30,12,["height"]],2],null]],null]]]],[28,[37,24],[[30,8,["ID"]],"-",[30,11]],null]],null]],[[[1,"\\n "],[11,"path"],[16,1,[28,[37,24],["splitter:",[30,8,["Name"]],">",[30,10,["NextNode"]]],null]],[24,0,"split"],[16,"d",[28,[37,25],[[28,[37,21],null,[["x","y"],[[30,13,["x"]],[30,13,["y"]]]]]],[["src"],[[28,[37,21],null,[["x","y"],[[30,9,["right"]],[28,[37,22],[[30,9,["y"]],[28,[37,23],[[30,9,["height"]],2],null]],null]]]]]]]],[4,[38,3],[[28,[37,24],[[28,[37,27],[[28,[37,28],[[30,10,["Weight"]],0],null]],[["decimals"],[2]]],"%"],null]],[["options"],[[28,[37,21],null,[["followCursor"],[true]]]]]],[12],[13],[1,"\\n\\n"]],[13]]]],[12]]]],[10,11]],null]],[9]]]],[]],null]],[8]],null],[1,"\\n"],[13],[1,"\\n\\n"],[10,"svg"],[14,0,"resolver-inlets"],[14,"height","100%"],[12],[1,"\\n"],[42,[28,[37,5],[[28,[37,5],[[33,6]],null]],null],null,[[[41,[28,[37,29],[[30,14,["NextNode"]],"resolver:"],null],[[[44,[[28,[37,28],[[30,14,["NextItem","rect"]],[28,[37,21],null,[["y","height"],[0,0]]]],null]],[[[1," "],[10,"circle"],[14,"r","2.5"],[14,"cx","5"],[15,"cy",[28,[37,22],[[30,15,["y"]],[28,[37,23],[[30,15,["height"]],2],null]],null]],[12],[13],[1,"\\n"]],[15]]]],[]],null]],[14]],null],[42,[28,[37,5],[[28,[37,5],[[33,13]],null]],null],null,[[[42,[28,[37,5],[[28,[37,5],[[30,16,["Splits"]]],null]],null],null,[[[44,[[28,[37,28],[[30,17,["NextItem","rect"]],[28,[37,21],null,[["y","height"],[0,0]]]],null]],[[[1," "],[10,"circle"],[14,"r","2.5"],[14,"cx","5"],[15,"cy",[28,[37,22],[[30,18,["y"]],[28,[37,23],[[30,18,["height"]],2],null]],null]],[12],[13],[1,"\\n"]],[18]]]],[17]],null]],[16]],null],[13],[1,"\\n\\n"],[10,"svg"],[14,0,"splitter-inlets"],[14,"height","100%"],[12],[1,"\\n"],[42,[28,[37,5],[[28,[37,5],[[33,6]],null]],null],null,[[[41,[28,[37,29],[[30,19,["NextNode"]],"splitter:"],null],[[[44,[[28,[37,28],[[30,19,["NextItem","rect"]],[28,[37,21],null,[["y","height"],[0,0]]]],null]],[[[1," "],[10,"circle"],[14,"r","2.5"],[14,"cx","5"],[15,"cy",[28,[37,22],[[30,20,["y"]],[28,[37,23],[[30,20,["height"]],2],null]],null]],[12],[13],[1,"\\n"]],[20]]]],[]],null]],[19]],null],[13],[1,"\\n"]],["item","item","item","item","src","destRect","dest","splitter","src","item","index","destRect","dest","item","dest","item","item","dest","item","dest"],false,["if","selected","chain","tooltip","each","-track-array","routes","consul/discovery-chain/route-card","action","on-resize","dom-position","set","sort-by","splitters","consul/discovery-chain/splitter-card","resolvers","consul/discovery-chain/resolver-card","nodes","did-insert","let","tween-to","hash","add","div","concat","svg-curve","sub","round","or","string-starts-with"]]',moduleName:"consul-ui/components/consul/discovery-chain/index.hbs",isStrictMode:!1}) +var a=(0,t.setComponentTemplate)(o,t.default.extend({dom:(0,l.inject)("dom"),ticker:(0,l.inject)("ticker"),dataStructs:(0,l.inject)("data-structs"),classNames:["discovery-chain"],classNameBindings:["active"],selectedId:"",init:function(){this._super(...arguments),this._listeners=this.dom.listeners()},didInsertElement:function(){this._listeners.add(this.dom.document(),{click:e=>{this.dom.closest('[class$="-card"]',e.target)||((0,r.set)(this,"active",!1),(0,r.set)(this,"selectedId",""))}})},willDestroyElement:function(){this._super(...arguments),this._listeners.remove(),this.ticker.destroy(this)},splitters:(0,r.computed)("chain.Nodes",(function(){return(0,i.getSplitters)((0,r.get)(this,"chain.Nodes"))})),routes:(0,r.computed)("chain.Nodes",(function(){const e=(0,i.getRoutes)((0,r.get)(this,"chain.Nodes"),this.dom.guid) +if(!e.find((e=>"/"===(0,r.get)(e,"Definition.Match.HTTP.PathPrefix")))&&!e.find((e=>void 0===e.Definition))){let t +const n=`resolver:${this.chain.ServiceName}.${this.chain.Namespace}.${this.chain.Partition}.${this.chain.Datacenter}`,l=`splitter:${this.chain.ServiceName}.${this.chain.Namespace}.${this.chain.Partition}` +if(void 0!==this.chain.Nodes[l]?t=l:void 0!==this.chain.Nodes[n]&&(t=n),void 0!==t){const n={Default:!0,ID:`route:${this.chain.ServiceName}`,Name:this.chain.ServiceName,Definition:{Match:{HTTP:{PathPrefix:"/"}}},NextNode:t} +e.push((0,i.createRoute)(n,this.chain.ServiceName,this.dom.guid))}}return e})),nodes:(0,r.computed)("routes","splitters","resolvers",(function(){let e=this.resolvers.reduce(((e,t)=>(e[`resolver:${t.ID}`]=t,t.Children.reduce(((e,t)=>(e[`resolver:${t.ID}`]=t,e)),e),e)),{}) +return e=this.splitters.reduce(((e,t)=>(e[t.ID]=t,e)),e),e=this.routes.reduce(((e,t)=>(e[t.ID]=t,e)),e),Object.entries(e).forEach((t=>{let[n,l]=t +void 0!==l.NextNode&&(l.NextItem=e[l.NextNode]),void 0!==l.Splits&&l.Splits.forEach((t=>{void 0!==t.NextNode&&(t.NextItem=e[t.NextNode])}))})),""})),resolvers:(0,r.computed)("chain.{Nodes,Targets}",(function(){return(0,i.getResolvers)(this.chain.Datacenter,this.chain.Partition,this.chain.Namespace,(0,r.get)(this,"chain.Targets"),(0,r.get)(this,"chain.Nodes"))})),graph:(0,r.computed)("splitters","routes.[]",(function(){const e=this.dataStructs.graph() +return this.splitters.forEach((t=>{t.Splits.forEach((n=>{e.addLink(t.ID,n.NextNode)}))})),this.routes.forEach(((t,n)=>{e.addLink(t.ID,t.NextNode)})),e})),selected:(0,r.computed)("selectedId","graph",(function(){if(""===this.selectedId||!this.dom.element(`#${this.selectedId}`))return{} +const e=this.selectedId,t=e.split(":").shift(),n=[e],l=[] +return this.graph.forEachLinkedNode(e,((e,r)=>{n.push(e.id),l.push(`${r.fromId}>${r.toId}`),this.graph.forEachLinkedNode(e.id,((e,r)=>{const i=e.id.split(":").shift() +t!==i&&"splitter"!==t&&"splitter"!==i&&(n.push(e.id),l.push(`${r.fromId}>${r.toId}`))}))})),{nodes:n.map((e=>`#${CSS.escape(e)}`)),edges:l.map((e=>`#${CSS.escape(e)}`))}})),actions:{click:function(e){const t=e.currentTarget.getAttribute("id") +t===this.selectedId?((0,r.set)(this,"active",!1),(0,r.set)(this,"selectedId","")):((0,r.set)(this,"active",!0),(0,r.set)(this,"selectedId",t))}}})) +e.default=a})),define("consul-ui/components/consul/discovery-chain/resolver-card/index",["exports","@ember/component","@ember/template-factory","@ember/component/template-only"],(function(e,t,n,l){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const r=(0,n.createTemplateFactory)({id:"o/2vY0FQ",block:'[[[10,0],[14,0,"resolver-card"],[12],[1,"\\n "],[11,"header"],[17,1],[16,"onclick",[28,[37,0],[[30,2]],null]],[16,1,[28,[37,1],["resolver:",[30,3,["ID"]]],null]],[12],[1,"\\n "],[10,3],[14,3,""],[12],[1,"\\n "],[10,"h3"],[12],[1,[30,3,["Name"]]],[13],[1,"\\n"],[41,[30,3,["Failover"]],[[[1," "],[10,"dl"],[14,0,"failover"],[12],[1,"\\n "],[11,"dt"],[4,[38,3],[[28,[37,1],[[30,3,["Failover","Type"]]," failover"],null]],null],[12],[1,"\\n "],[1,[28,[35,1],[[30,3,["Failover","Type"]]," failover"],null]],[1,"\\n "],[13],[1,"\\n "],[10,"dd"],[12],[1,"\\n "],[10,"ol"],[12],[1,"\\n"],[42,[28,[37,5],[[28,[37,5],[[30,3,["Failover","Targets"]]],null]],null],null,[[[1," "],[10,"li"],[12],[10,1],[12],[1,[30,4]],[13],[13],[1,"\\n"]],[4]],null],[1," "],[13],[1,"\\n "],[13],[1,"\\n "],[13],[1,"\\n"]],[]],null],[1," "],[13],[1,"\\n "],[13],[1,"\\n"],[41,[28,[37,6],[[30,3,["Children","length"]],0],null],[[[1," "],[10,"ul"],[12],[1,"\\n"],[42,[28,[37,5],[[28,[37,5],[[30,3,["Children"]]],null]],null],null,[[[1," "],[11,"li"],[16,"onclick",[28,[37,0],[[30,2]],null]],[16,1,[28,[37,1],["resolver:",[30,5,["ID"]]],null]],[4,[38,7],[[28,[37,8],[[28,[37,9],[[30,5],"rect"],null]],[["from"],[[30,6]]]]],null],[12],[1,"\\n "],[10,3],[14,3,""],[12],[1,"\\n"],[41,[30,5,["Redirect"]],[[[1," "],[10,"dl"],[14,0,"redirect"],[12],[1,"\\n "],[11,"dt"],[4,[38,3],[[28,[37,1],[[30,5,["Redirect"]]," redirect"],null]],null],[12],[1,"\\n "],[1,[30,5,["Redirect"]]],[1," redirect\\n "],[13],[1,"\\n "],[10,"dd"],[12],[1,"\\n "],[1,[30,5,["Name"]]],[1,"\\n "],[13],[1,"\\n "],[13],[1,"\\n"],[41,[30,5,["Failover"]],[[[1," "],[10,"dl"],[14,0,"failover"],[12],[1,"\\n "],[11,"dt"],[4,[38,3],[[28,[37,1],[[30,5,["Failover","Type"]]," failover"],null]],null],[12],[1,"\\n "],[1,[30,5,["Failover","Type"]]],[1," failover\\n "],[13],[1,"\\n "],[10,"dd"],[12],[1,"\\n "],[10,"ol"],[12],[1,"\\n"],[42,[28,[37,5],[[28,[37,5],[[30,5,["Failover","Targets"]]],null]],null],null,[[[1," "],[10,"li"],[12],[1,"\\n "],[10,1],[12],[1,[30,7]],[13],[1,"\\n "],[13],[1,"\\n"]],[7]],null],[1," "],[13],[1,"\\n "],[13],[1,"\\n "],[13],[1,"\\n"]],[]],null]],[]],[[[41,[30,5,["Failover"]],[[[1," "],[1,[30,5,["Name"]]],[1,"\\n "],[10,"dl"],[14,0,"failover"],[12],[1,"\\n "],[11,"dt"],[4,[38,3],[[28,[37,1],[[30,5,["Failover","Type"]]," failover"],null]],null],[12],[1,"\\n "],[1,[28,[35,1],[[30,5,["Failover","Type"]]," failover"],null]],[1,"\\n "],[13],[1,"\\n "],[10,"dd"],[12],[1,"\\n "],[10,"ol"],[12],[1,"\\n"],[42,[28,[37,5],[[28,[37,5],[[30,5,["Failover","Targets"]]],null]],null],null,[[[1," "],[10,"li"],[12],[1,"\\n "],[10,1],[12],[1,[30,8]],[13],[1,"\\n "],[13],[1,"\\n"]],[8]],null],[1," "],[13],[1,"\\n "],[13],[1,"\\n "],[13],[1,"\\n"]],[]],[[[1," "],[1,[30,5,["Name"]]],[1,"\\n "]],[]]]],[]]],[1," "],[13],[1,"\\n "],[13],[1,"\\n"]],[5]],null],[1," "],[13],[1,"\\n"]],[]],null],[13],[1,"\\n"]],["&attrs","@onclick","@item","item","child","@edges","target","target"],false,["optional","concat","if","tooltip","each","-track-array","gt","on-resize","dom-position","set"]]',moduleName:"consul-ui/components/consul/discovery-chain/resolver-card/index.hbs",isStrictMode:!1}) +var i=(0,t.setComponentTemplate)(r,(0,l.default)()) +e.default=i})),define("consul-ui/components/consul/discovery-chain/route-card/index",["exports","@ember/component","@ember/template-factory","@glimmer/component","@ember/object"],(function(e,t,n,l,r){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const i=(0,n.createTemplateFactory)({id:"fiqUKMeE",block:'[[[11,3],[24,0,"route-card"],[16,"onclick",[30,1]],[16,1,[30,2,["ID"]]],[17,3],[12],[1,"\\n "],[10,"header"],[15,0,[52,[28,[37,1],[[30,0,["path","value"]],"/"],null],"short"]],[12],[1,"\\n"],[41,[28,[37,2],[[30,2,["Definition","Match","HTTP","Methods","length"]],0],null],[[[1," "],[10,"ul"],[14,0,"match-methods"],[12],[1,"\\n"],[42,[28,[37,4],[[28,[37,4],[[30,2,["Definition","Match","HTTP","Methods"]]],null]],null],null,[[[1," "],[10,"li"],[12],[1,[30,4]],[13],[1,"\\n"]],[4]],null],[1," "],[13],[1,"\\n"]],[]],null],[1," "],[10,"dl"],[12],[1,"\\n "],[10,"dt"],[12],[1,"\\n "],[1,[30,0,["path","type"]]],[1,"\\n "],[13],[1,"\\n "],[10,"dd"],[12],[1,"\\n "],[1,[30,0,["path","value"]]],[1,"\\n "],[13],[1,"\\n "],[13],[1,"\\n "],[13],[1,"\\n"],[41,[28,[37,2],[[30,2,["Definition","Match","HTTP","Header","length"]],0],null],[[[1," "],[10,"section"],[14,0,"match-headers"],[12],[1,"\\n "],[11,"header"],[4,[38,5],["Header"],null],[12],[1,"\\n "],[10,"h4"],[12],[1,"Headers"],[13],[1,"\\n "],[13],[1,"\\n "],[10,"dl"],[12],[1,"\\n"],[42,[28,[37,4],[[28,[37,4],[[30,2,["Definition","Match","HTTP","Header"]]],null]],null],null,[[[1," "],[10,"dt"],[12],[1,"\\n "],[1,[30,5,["Name"]]],[1,"\\n "],[13],[1,"\\n "],[10,"dd"],[12],[1,"\\n "],[1,[28,[35,6],[[30,5]],null]],[1,"\\n "],[13],[1,"\\n"]],[5]],null],[1," "],[13],[1,"\\n "],[13],[1,"\\n"]],[]],null],[41,[28,[37,2],[[30,2,["Definition","Match","HTTP","QueryParam","length"]],0],null],[[[1," "],[10,"section"],[14,0,"match-queryparams"],[12],[1,"\\n "],[11,"header"],[4,[38,5],["Query Params"],null],[12],[1,"\\n "],[10,"h4"],[12],[1,"Query Params"],[13],[1,"\\n "],[13],[1,"\\n "],[10,"dl"],[12],[1,"\\n"],[42,[28,[37,4],[[28,[37,4],[[30,2,["Definition","Match","HTTP","QueryParam"]]],null]],null],null,[[[1," "],[10,"dt"],[12],[1,"\\n "],[1,[30,6,["Name"]]],[1,"\\n "],[13],[1,"\\n "],[10,"dd"],[12],[1,"\\n "],[1,[28,[35,6],[[30,6]],null]],[1,"\\n "],[13],[1,"\\n"]],[6]],null],[1," "],[13],[1,"\\n "],[13],[1,"\\n"]],[]],null],[13],[1,"\\n"]],["@onclick","@item","&attrs","item","item","item"],false,["if","eq","gt","each","-track-array","tooltip","route-match"]]',moduleName:"consul-ui/components/consul/discovery-chain/route-card/index.hbs",isStrictMode:!1}) +class o extends l.default{get path(){return Object.entries((0,r.get)(this.args.item,"Definition.Match.HTTP")||{}).reduce((function(e,t){let[n,l]=t +return n.toLowerCase().startsWith("path")?{type:n.replace("Path",""),value:l}:e}),{type:"Prefix",value:"/"})}}e.default=o,(0,t.setComponentTemplate)(i,o)})),define("consul-ui/components/consul/discovery-chain/splitter-card/index",["exports","@ember/component","@ember/template-factory","@ember/component/template-only"],(function(e,t,n,l){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const r=(0,n.createTemplateFactory)({id:"RQh8TKeM",block:'[[[10,0],[12],[1,"\\n "],[11,3],[17,1],[16,1,[30,2,["ID"]]],[24,0,"splitter-card"],[16,"onclick",[28,[37,0],[[30,3]],null]],[12],[1,"\\n "],[10,"header"],[12],[1,"\\n "],[10,"h3"],[12],[1,[30,2,["Name"]]],[13],[1,"\\n "],[13],[1,"\\n "],[13],[1,"\\n"],[13],[1,"\\n"]],["&attrs","@item","@onclick"],false,["optional"]]',moduleName:"consul-ui/components/consul/discovery-chain/splitter-card/index.hbs",isStrictMode:!1}) +var i=(0,t.setComponentTemplate)(r,(0,l.default)()) +e.default=i})),define("consul-ui/components/consul/discovery-chain/utils",["exports"],(function(e){function t(e,t){var n=Object.keys(e) +if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e) +t&&(l=l.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,l)}return n}function n(e){for(var n=1;n0&&void 0!==arguments[0]?arguments[0]:{},t=arguments.length>1?arguments[1]:void 0 +return Object.values(e).filter((e=>e.Type===t))},i=function(e,t){let n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"default",l=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"default",r=arguments.length>4?arguments[4]:void 0 +return void 0===e[t]&&(e[t]={ID:`${t}.${n}.${l}.${r}`,Name:t,Children:[]}),e[t]},o=function(e,t){let n +const l=e.map((function(e){const[l,r]=[t,e].map((e=>e.split(".").reverse())),i=["Datacenter","Partition","Namespace","Service","Subset"] +return r.find((function(e,t){const r=e!==l[t] +return r&&(n=i[t]),r}))})) +return{Type:n,Targets:l}} +e.getAlternateServices=o +e.getSplitters=function(e){return r(e,"splitter").map((function(e){const t=e.Name.split(".") +return t.reverse(),t.shift(),t.shift(),t.reverse(),n(n({},e),{},{ID:`splitter:${e.Name}`,Name:t.join(".")})}))} +e.getRoutes=function(e,t){return r(e,"router").reduce((function(e,n){return e.concat(n.Routes.map((function(e,l){return a(e,n.Name,t)})))}),[])} +e.getResolvers=function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"default",n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"default",l=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{},r=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{} +const a={} +return Object.values(r).filter((e=>"resolver"===e.Type)).forEach((function(l){const r=l.Name.split(".") +let u +r.length>4&&(u=r.shift()),r.reverse(),r.shift(),r.shift(),r.shift(),r.reverse() +const s=r.join("."),c=i(a,s,n,t,e) +let d +if(void 0!==l.Resolver.Failover&&(d=o(l.Resolver.Failover.Targets,l.Name)),u){const e={Subset:!0,ID:l.Name,Name:u} +void 0!==d&&(e.Failover=d),c.Children.push(e)}else void 0!==d&&(c.Failover=d)})),Object.values(l).forEach((l=>{if(void 0!==r[`resolver:${l.ID}`]){const u=o([l.ID],`service.${n}.${t}.${e}`) +if("Service"!==u.Type){const s=i(a,l.Service,n,t,e),c={Redirect:u.Type,ID:l.ID,Name:l[u.Type]} +void 0!==r[`resolver:${l.ID}`].Resolver.Failover&&(c.Failover=o(r[`resolver:${l.ID}`].Resolver.Failover.Targets,l.ID)),s.Children.push(c)}}})),Object.values(a)} +const a=function(e,t,l){return n(n({},e),{},{Default:e.Default||void 0===e.Definition.Match,ID:`route:${t}-${l(e.Definition)}`})} +e.createRoute=a})),define("consul-ui/components/consul/exposed-path/list/index",["exports","@ember/component","@ember/template-factory","@ember/component/template-only"],(function(e,t,n,l){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const r=(0,n.createTemplateFactory)({id:"gs8UZz5a",block:'[[[11,0],[24,0,"consul-exposed-path-list"],[17,1],[12],[1,"\\n "],[10,"ul"],[12],[1,"\\n"],[42,[28,[37,1],[[28,[37,1],[[30,2]],null]],null],null,[[[1," "],[10,"li"],[12],[1,"\\n "],[10,0],[14,0,"header"],[12],[1,"\\n"],[44,[[28,[37,3],[[30,4],":",[30,3,["ListenerPort"]],[30,3,["Path"]]],null]],[[[1," "],[10,2],[14,0,"combined-address"],[12],[1,"\\n "],[10,1],[12],[1,"\\n "],[1,[30,5]],[1,"\\n "],[13],[1,"\\n "],[8,[39,4],null,[["@value","@name"],[[30,5],"Address"]],null],[1,"\\n "],[13],[1,"\\n"]],[5]]],[1," "],[13],[1,"\\n "],[10,0],[14,0,"detail"],[12],[1,"\\n"],[41,[30,3,["Protocol"]],[[[1," "],[10,"dl"],[14,0,"protocol"],[12],[1,"\\n "],[10,"dt"],[12],[1,"\\n "],[8,[39,6],null,null,[["default"],[[[[1,"\\n Protocol\\n "]],[]]]]],[1,"\\n "],[13],[1,"\\n "],[10,"dd"],[12],[1,"\\n "],[1,[30,3,["Protocol"]]],[1,"\\n "],[13],[1,"\\n "],[13],[1,"\\n"]],[]],null],[41,[30,3,["ListenerPort"]],[[[1," "],[10,"dl"],[14,0,"port"],[12],[1,"\\n "],[10,"dt"],[12],[1,"\\n "],[8,[39,6],null,null,[["default"],[[[[1,"\\n Listener Port\\n "]],[]]]]],[1,"\\n "],[13],[1,"\\n "],[10,"dd"],[12],[1,"\\n listening on :"],[1,[30,3,["ListenerPort"]]],[1,"\\n "],[13],[1,"\\n "],[13],[1,"\\n"]],[]],null],[41,[30,3,["LocalPathPort"]],[[[1," "],[10,"dl"],[14,0,"port"],[12],[1,"\\n "],[10,"dt"],[12],[1,"\\n "],[8,[39,6],null,null,[["default"],[[[[1,"\\n Local Path Port\\n "]],[]]]]],[1,"\\n "],[13],[1,"\\n "],[10,"dd"],[12],[1,"\\n local port :"],[1,[30,3,["LocalPathPort"]]],[1,"\\n "],[13],[1,"\\n "],[13],[1,"\\n"]],[]],null],[41,[30,3,["Path"]],[[[1," "],[10,"dl"],[14,0,"path"],[12],[1,"\\n "],[10,"dt"],[12],[1,"\\n "],[8,[39,6],null,null,[["default"],[[[[1,"\\n Path\\n "]],[]]]]],[1,"\\n "],[13],[1,"\\n "],[10,"dd"],[12],[1,"\\n "],[1,[30,3,["Path"]]],[1,"\\n "],[13],[1,"\\n "],[13],[1,"\\n"]],[]],null],[1," "],[13],[1,"\\n "],[13],[1,"\\n"]],[3]],null],[1," "],[13],[1,"\\n"],[13],[1,"\\n"]],["&attrs","@items","path","@address","combinedAddress"],false,["each","-track-array","let","concat","copy-button","if","tooltip"]]',moduleName:"consul-ui/components/consul/exposed-path/list/index.hbs",isStrictMode:!1}) +var i=(0,t.setComponentTemplate)(r,(0,l.default)()) +e.default=i})),define("consul-ui/components/consul/external-source/index",["exports","@ember/component","@ember/template-factory","@ember/component/template-only"],(function(e,t,n,l){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const r=(0,n.createTemplateFactory)({id:"qg6NqCwn",block:'[[[41,[30,1],[[[44,[[28,[37,2],[[30,1]],null]],[[[41,[28,[37,3],[[30,3],[28,[37,4],[[30,2],"consul-api-gateway"],null]],null],[[[1," "],[10,"dl"],[14,0,"tooltip-panel"],[12],[1,"\\n "],[10,"dt"],[12],[1,"\\n "],[11,1],[24,0,"consul-external-source"],[17,4],[12],[1,"\\n "],[8,[39,5],[[24,0,"mr-1.5 w-4 h-4"]],[["@name"],[[28,[37,6],[[30,2]],null]]],null],[1,"\\n Registered via "],[1,[28,[35,7],[[28,[37,8],["common.brand.",[30,2]],null]],null]],[1,"\\n "],[13],[1,"\\n "],[13],[1,"\\n "],[10,"dd"],[12],[1,"\\n "],[8,[39,9],null,[["@position","@menu"],["left",false]],[["default"],[[[[1,"\\n "],[8,[39,10],null,[["@name"],["header"]],[["default"],[[[[1,"\\n API Gateways manage north-south traffic from external services to services in the Datacenter. For more information, read our documentation.\\n "]],[]]]]],[1,"\\n "],[8,[39,10],null,[["@name"],["menu"]],[["default"],[[[[1,"\\n "],[10,"li"],[14,"role","separator"],[12],[1,"\\n About "],[1,[28,[35,7],[[28,[37,8],["common.brand.",[30,2]],null]],null]],[1,"\\n "],[13],[1,"\\n "],[10,"li"],[14,"role","none"],[14,0,"learn-link"],[12],[1,"\\n "],[10,3],[14,"tabindex","-1"],[14,"role","menuitem"],[15,6,[28,[37,8],[[28,[37,11],["CONSUL_DOCS_LEARN_URL"],null]],null]],[14,"rel","noopener noreferrer"],[14,"target","_blank"],[12],[1,"\\n Learn guides\\n "],[13],[1,"\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n "]],[]]]]],[1,"\\n "],[13],[1,"\\n "],[13],[1,"\\n"]],[]],[[[41,[30,2],[[[1," "],[11,1],[24,0,"consul-external-source"],[17,4],[12],[1,"\\n "],[8,[39,5],[[24,0,"mr-1.5 h-4 w-4"]],[["@name","@color"],[[28,[37,6],[[30,2]],null],"var(--token-color-hashicorp-brand)"]],null],[1,"\\n"],[41,[30,5],[[[1," "],[1,[30,5]],[1,"\\n"]],[]],[[[1," Registered via "],[1,[28,[35,7],[[28,[37,8],["common.brand.",[30,2]],null]],null]],[1,"\\n"]],[]]],[1," "],[13],[1,"\\n "]],[]],null]],[]]]],[2]]]],[]],null]],["@item","externalSource","@withInfo","&attrs","@label"],false,["if","let","service/external-source","and","eq","flight-icon","icon-mapping","t","concat","menu-panel","block-slot","env"]]',moduleName:"consul-ui/components/consul/external-source/index.hbs",isStrictMode:!1}) +var i=(0,t.setComponentTemplate)(r,(0,l.default)()) +e.default=i})),define("consul-ui/components/consul/hcp/home/index",["exports","@ember/component","@ember/template-factory","@ember/component/template-only"],(function(e,t,n,l){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const r=(0,n.createTemplateFactory)({id:"0fh1ph90",block:'[[[11,0],[24,0,"consul-hcp-home"],[17,1],[12],[1,"\\n "],[10,3],[15,6,[28,[37,0],["CONSUL_HCP_URL"],null]],[14,"data-native-href","true"],[12],[1,"\\n Back to HCP\\n "],[13],[1,"\\n"],[13],[1,"\\n"]],["&attrs"],false,["env"]]',moduleName:"consul-ui/components/consul/hcp/home/index.hbs",isStrictMode:!1}) +var i=(0,t.setComponentTemplate)(r,(0,l.default)()) +e.default=i})),define("consul-ui/components/consul/health-check/list/index",["exports","@ember/component","@ember/template-factory","@ember/component/template-only"],(function(e,t,n,l){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const r=(0,n.createTemplateFactory)({id:"L0W/wK5V",block:'[[[11,0],[24,0,"consul-health-check-list"],[17,1],[12],[1,"\\n "],[10,"ul"],[12],[1,"\\n"],[42,[28,[37,1],[[28,[37,1],[[30,2]],null]],null],null,[[[1," "],[10,"li"],[15,0,[28,[37,2],["health-check-output ",[30,3,["Status"]]],null]],[12],[1,"\\n "],[10,0],[12],[1,"\\n "],[10,"header"],[12],[1,"\\n "],[10,"h2"],[12],[1,[30,3,["Name"]]],[13],[1,"\\n "],[13],[1,"\\n "],[10,"dl"],[12],[1,"\\n"],[41,[28,[37,4],[[30,3,["Kind"]],"node"],null],[[[1," "],[10,"dt"],[12],[1,"NodeName"],[13],[1,"\\n "],[10,"dd"],[12],[1,[30,3,["Node"]]],[13],[1,"\\n"]],[]],[[[1," "],[10,"dt"],[12],[1,"ServiceName"],[13],[1,"\\n "],[10,"dd"],[12],[1,[30,3,["ServiceName"]]],[13],[1,"\\n"]],[]]],[1," "],[13],[1,"\\n "],[10,"dl"],[12],[1,"\\n "],[10,"dt"],[12],[1,"CheckID"],[13],[1,"\\n "],[10,"dd"],[12],[1,[28,[35,5],[[30,3,["CheckID"]],"-"],null]],[13],[1,"\\n "],[13],[1,"\\n "],[10,"dl"],[12],[1,"\\n "],[10,"dt"],[12],[1,"Type"],[13],[1,"\\n "],[10,"dd"],[14,"data-health-check-type",""],[12],[1,"\\n "],[1,[30,3,["Type"]]],[1,"\\n"],[41,[30,3,["Exposed"]],[[[1," "],[11,"em"],[4,[38,6],["Expose.checks is set to true, so all registered HTTP and gRPC check paths are exposed through Envoy for the Consul agent."],null],[12],[1,"Exposed"],[13],[1,"\\n"]],[]],null],[1," "],[13],[1,"\\n "],[13],[1,"\\n "],[10,"dl"],[12],[1,"\\n "],[10,"dt"],[12],[1,"Notes"],[13],[1,"\\n "],[10,"dd"],[12],[1,[28,[35,5],[[30,3,["Notes"]],"-"],null]],[13],[1,"\\n "],[13],[1,"\\n "],[10,"dl"],[12],[1,"\\n "],[10,"dt"],[12],[1,"Output"],[13],[1,"\\n "],[10,"dd"],[12],[1,"\\n "],[10,"pre"],[12],[10,"code"],[12],[1,[30,3,["Output"]]],[13],[13],[1,"\\n "],[8,[39,7],null,[["@value","@name"],[[30,3,["Output"]],"output"]],null],[1,"\\n "],[13],[1,"\\n "],[13],[1,"\\n "],[13],[1,"\\n "],[13],[1,"\\n"]],[3]],null],[1," "],[13],[1,"\\n"],[13],[1,"\\n"]],["&attrs","@items","item"],false,["each","-track-array","concat","if","eq","or","tooltip","copy-button"]]',moduleName:"consul-ui/components/consul/health-check/list/index.hbs",isStrictMode:!1}) +var i=(0,t.setComponentTemplate)(r,(0,l.default)()) +e.default=i})) +define("consul-ui/components/consul/health-check/search-bar/index",["exports","@ember/component","@ember/template-factory","@ember/component/template-only"],(function(e,t,n,l){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const r=(0,n.createTemplateFactory)({id:"UNgiEnUJ",block:'[[[8,[39,0],[[24,0,"consul-healthcheck-search-bar"],[17,1]],[["@filter"],[[30,2]]],[["status","search","filter","sort"],[[[[1,"\\n\\n"],[44,[[28,[37,2],[[28,[37,3],["components.consul.health-check.search-bar.",[30,3,["status","key"]],".name"],null]],[["default"],[[28,[37,4],[[28,[37,3],["common.search.",[30,3,["status","key"]]],null],[28,[37,3],["common.consul.",[30,3,["status","key"]]],null]],null]]]],[28,[37,2],[[28,[37,3],["components.consul.health-check.search-bar.",[30,3,["status","key"]],".options.",[30,3,["status","value"]]],null]],[["default"],[[28,[37,4],[[28,[37,3],["common.search.",[30,3,["status","value"]]],null],[28,[37,3],["common.consul.",[30,3,["status","value"]]],null]],null]]]]],[[[1," "],[8,[30,3,["RemoveFilter"]],[[16,"aria-label",[28,[37,2],["common.ui.remove"],[["item"],[[28,[37,3],[[30,4]," ",[30,5]],null]]]]]],null,[["default"],[[[[1,"\\n "],[10,"dl"],[12],[1,"\\n "],[10,"dt"],[12],[1,[30,4]],[13],[1,"\\n "],[10,"dd"],[12],[1,[30,5]],[13],[1,"\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n"]],[4,5]]],[1,"\\n "]],[3]],[[[1,"\\n "],[8,[30,6,["Search"]],null,[["@onsearch","@value","@placeholder"],[[28,[37,5],[[30,0],[30,7]],null],[30,8],[28,[37,2],["common.search.search"],null]]],[["default"],[[[[1,"\\n"],[41,[30,2,["searchproperty"]],[[[1," "],[8,[30,6,["Select"]],[[24,0,"type-search-properties"]],[["@position","@onchange","@multiple","@required"],["right",[28,[37,5],[[30,0],[30,2,["searchproperty","change"]]],null],true,true]],[["default"],[[[[1,"\\n "],[8,[39,7],null,[["@name"],["selected"]],[["default"],[[[[1,"\\n "],[10,1],[12],[1,"\\n "],[1,[28,[35,2],["common.search.searchproperty"],null]],[1,"\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,7],null,[["@name"],["options"]],[["default"],[[[[1,"\\n"],[44,[[30,9,["Optgroup"]],[30,9,["Option"]]],[[[42,[28,[37,9],[[28,[37,9],[[30,2,["searchproperty","default"]]],null]],null],null,[[[1," "],[8,[30,11],null,[["@value","@selected"],[[30,12],[28,[37,10],[[30,12],[30,2,["searchproperty","value"]]],null]]],[["default"],[[[[1,"\\n "],[1,[28,[35,2],[[28,[37,3],["common.consul.",[28,[37,11],[[30,12]],null]],null]],null]],[1,"\\n "]],[]]]]],[1,"\\n"]],[12]],null]],[10,11]]],[1," "]],[]]]]],[1,"\\n "]],[9]]]]],[1,"\\n"]],[]],null],[1," "]],[]]]]],[1,"\\n "]],[6]],[[[1,"\\n "],[8,[30,13,["Select"]],[[24,0,"type-status"]],[["@position","@onchange","@multiple"],["left",[28,[37,5],[[30,0],[30,2,["status","change"]]],null],true]],[["default"],[[[[1,"\\n "],[8,[39,7],null,[["@name"],["selected"]],[["default"],[[[[1,"\\n "],[10,1],[12],[1,"\\n "],[1,[28,[35,2],["common.consul.status"],null]],[1,"\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,7],null,[["@name"],["options"]],[["default"],[[[[1,"\\n"],[44,[[30,14,["Optgroup"]],[30,14,["Option"]]],[[[42,[28,[37,9],[[28,[37,9],[[28,[37,4],["passing","warning","critical","empty"],null]],null]],null],null,[[[1," "],[8,[30,16],[[16,0,[29,["value-",[30,17]]]]],[["@value","@selected"],[[30,17],[28,[37,10],[[30,17],[30,2,["status","value"]]],null]]],[["default"],[[[[1,"\\n "],[1,[28,[35,2],[[28,[37,3],["common.consul.",[30,17]],null]],[["default"],[[28,[37,4],[[28,[37,3],["common.search.",[30,17]],null]],null]]]]],[1,"\\n "]],[]]]]],[1,"\\n"]],[17]],null]],[15,16]]],[1," "]],[]]]]],[1,"\\n "]],[14]]]]],[1,"\\n"],[41,[30,2,["kind"]],[[[1," "],[8,[30,13,["Select"]],[[24,0,"type-kind"]],[["@position","@onchange","@multiple"],["left",[28,[37,5],[[30,0],[30,2,["kind","change"]]],null],true]],[["default"],[[[[1,"\\n "],[8,[39,7],null,[["@name"],["selected"]],[["default"],[[[[1,"\\n "],[10,1],[12],[1,"\\n "],[1,[28,[35,2],["components.consul.health-check.search-bar.kind.name"],null]],[1,"\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,7],null,[["@name"],["options"]],[["default"],[[[[1,"\\n"],[44,[[30,18,["Optgroup"]],[30,18,["Option"]]],[[[42,[28,[37,9],[[28,[37,9],[[28,[37,4],["service","node"],null]],null]],null],null,[[[1," "],[8,[30,20],null,[["@value","@selected"],[[30,21],[28,[37,10],[[30,21],[30,2,["kind","value"]]],null]]],[["default"],[[[[1,"\\n "],[1,[28,[35,2],[[28,[37,3],["components.consul.health-check.search-bar.kind.options.",[30,21]],null]],[["default"],[[28,[37,4],[[28,[37,3],["common.search.",[30,21]],null]],null]]]]],[1,"\\n "]],[]]]]],[1,"\\n"]],[21]],null]],[19,20]]],[1," "]],[]]]]],[1,"\\n "]],[18]]]]],[1,"\\n"]],[]],null],[1," "],[8,[30,13,["Select"]],[[24,0,"type-check"]],[["@position","@onchange","@multiple"],["left",[28,[37,5],[[30,0],[30,2,["check","change"]]],null],true]],[["default"],[[[[1,"\\n "],[8,[39,7],null,[["@name"],["selected"]],[["default"],[[[[1,"\\n "],[10,1],[12],[1,"\\n "],[1,[28,[35,2],["components.consul.health-check.search-bar.check.name"],null]],[1,"\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,7],null,[["@name"],["options"]],[["default"],[[[[1,"\\n"],[44,[[30,22,["Optgroup"]],[30,22,["Option"]]],[[[42,[28,[37,9],[[28,[37,9],[[28,[37,4],["alias","docker","grpc","http","script","serf","tcp","ttl"],null]],null]],null],null,[[[1," "],[8,[30,24],null,[["@value","@selected"],[[30,25],[28,[37,10],[[30,25],[30,2,["check","value"]]],null]]],[["default"],[[[[1,"\\n "],[1,[28,[35,2],[[28,[37,3],["components.consul.health-check.search-bar.check.options.",[30,25]],null]],[["default"],[[28,[37,4],[[28,[37,3],["common.search.",[30,25]],null]],null]]]]],[1,"\\n "]],[]]]]],[1,"\\n"]],[25]],null]],[23,24]]],[1," "]],[]]]]],[1,"\\n "]],[22]]]]],[1,"\\n "]],[13]],[[[1,"\\n "],[8,[30,26,["Select"]],[[24,0,"type-sort"]],[["@position","@onchange","@multiple","@required"],["right",[28,[37,5],[[30,0],[30,27,["change"]]],null],false,true]],[["default"],[[[[1,"\\n "],[8,[39,7],null,[["@name"],["selected"]],[["default"],[[[[1,"\\n "],[10,1],[12],[1,"\\n"],[44,[[28,[37,12],[[28,[37,4],[[28,[37,4],["Name:asc",[28,[37,2],["common.sort.alpha.asc"],null]],null],[28,[37,4],["Name:desc",[28,[37,2],["common.sort.alpha.desc"],null]],null],[28,[37,4],["Status:asc",[28,[37,2],["common.sort.status.asc"],null]],null],[28,[37,4],["Status:desc",[28,[37,2],["common.sort.status.desc"],null]],null],[28,[37,4],["Kind:asc",[28,[37,2],["components.consul.health-check.search-bar.sort.kind.asc"],null]],null],[28,[37,4],["Kind:desc",[28,[37,2],["components.consul.health-check.search-bar.sort.kind.desc"],null]],null]],null]],null]],[[[1," "],[1,[28,[35,13],[[30,29],[30,27,["value"]]],null]],[1,"\\n"]],[29]]],[1," "],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,7],null,[["@name"],["options"]],[["default"],[[[[1,"\\n"],[44,[[30,28,["Optgroup"]],[30,28,["Option"]]],[[[1," "],[8,[30,30],null,[["@label"],[[28,[37,2],["common.consul.status"],null]]],[["default"],[[[[1,"\\n "],[8,[30,31],null,[["@value","@selected"],["Status:asc",[28,[37,14],["Status:asc",[30,27,["value"]]],null]]],[["default"],[[[[1,[28,[35,2],["common.sort.status.asc"],null]]],[]]]]],[1,"\\n "],[8,[30,31],null,[["@value","@selected"],["Status:desc",[28,[37,14],["Status:desc",[30,27,["value"]]],null]]],[["default"],[[[[1,[28,[35,2],["common.sort.status.desc"],null]]],[]]]]],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[30,30],null,[["@label"],[[28,[37,2],["components.consul.health-check.search-bar.sort.name.name"],null]]],[["default"],[[[[1,"\\n "],[8,[30,31],null,[["@value","@selected"],["Name:asc",[28,[37,14],["Name:asc",[30,27,["value"]]],null]]],[["default"],[[[[1,[28,[35,2],["common.sort.alpha.asc"],null]]],[]]]]],[1,"\\n "],[8,[30,31],null,[["@value","@selected"],["Name:desc",[28,[37,14],["Name:desc",[30,27,["value"]]],null]]],[["default"],[[[[1,[28,[35,2],["common.sort.alpha.desc"],null]]],[]]]]],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[30,30],null,[["@label"],[[28,[37,2],["components.consul.health-check.search-bar.sort.kind.name"],null]]],[["default"],[[[[1,"\\n "],[8,[30,31],null,[["@value","@selected"],["Kind:asc",[28,[37,14],["Kind:asc",[30,27]],null]]],[["default"],[[[[1,"Service to Node"]],[]]]]],[1,"\\n "],[8,[30,31],null,[["@value","@selected"],["Kind:desc",[28,[37,14],["Kind:desc",[30,27]],null]]],[["default"],[[[[1,"Node to Service"]],[]]]]],[1,"\\n "]],[]]]]],[1,"\\n"]],[30,31]]],[1," "]],[]]]]],[1,"\\n "]],[28]]]]],[1,"\\n "]],[26]]]]]],["&attrs","@filter","search","key","value","search","@onsearch","@search","components","Optgroup","Option","prop","search","components","Optgroup","Option","state","components","Optgroup","Option","item","components","Optgroup","Option","item","search","@sort","components","selectable","Optgroup","Option"],false,["search-bar","let","t","concat","array","action","if","block-slot","each","-track-array","includes","lowercase","from-entries","get","eq"]]',moduleName:"consul-ui/components/consul/health-check/search-bar/index.hbs",isStrictMode:!1}) +var i=(0,t.setComponentTemplate)(r,(0,l.default)()) +e.default=i})),define("consul-ui/components/consul/instance-checks/index",["exports","@ember/component","@ember/template-factory","@ember/component/template-only"],(function(e,t,n,l){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const r=(0,n.createTemplateFactory)({id:"ddRn9Bp0",block:'[[[44,[[28,[37,1],["Status",[28,[37,2],[[30,1],[28,[37,3],null,null]],null]],null]],[[[44,[[28,[37,2],[[52,[28,[37,5],[[30,2,["critical","length"]],0],null],[30,2,["critical"]]],[52,[28,[37,5],[[30,2,["warning","length"]],0],null],[30,2,["warning"]]],[52,[28,[37,5],[[30,2,["passing","length"]],0],null],[30,2,["passing"]]],[28,[37,3],null,null]],null]],[[[44,[[30,3,["firstObject","Status"]]],[[[1," "],[11,"dl"],[16,0,[28,[37,6],["consul-instance-checks",[28,[37,3],["empty",[28,[37,7],[[30,3,["length"]],0],null]],null],[28,[37,3],[[30,4],[28,[37,8],[[30,3,["length"]],0],null]],null]],null]],[17,5],[12],[1,"\\n "],[10,"dt"],[12],[1,"\\n "],[8,[39,9],null,null,[["default"],[[[[1,"\\n "],[1,[28,[35,10],[[30,6]],null]],[1," Checks\\n "]],[]]]]],[1,"\\n "],[13],[1,"\\n"],[44,[[28,[37,2],[[52,[28,[37,7],[[30,4],"critical"],null],"failing"],[52,[28,[37,7],[[30,4],"warning"],null],"with a warning"],[30,4]],null]],[[[1," "],[10,"dd"],[12],[1,"\\n "],[1,[28,[35,2],[[52,[28,[37,7],[[30,3,["length"]],0],null],[28,[37,11],["No ",[30,6]," checks"],null]],[52,[28,[37,7],[[30,3,["length"]],[30,1,["length"]]],null],[28,[37,11],["All ",[30,6]," checks ",[30,7]],null]],[28,[37,11],[[30,3,["length"]],"/",[30,1,["length"]]," ",[30,6]," checks ",[30,7]],null]],null]],[1,"\\n "],[13],[1,"\\n"]],[7]]],[1," "],[13],[1,"\\n"]],[4]]]],[3]]]],[2]]]],["@items","grouped","checks","status","&attrs","@type","humanized"],false,["let","group-by","or","array","if","gt","class-map","eq","not-eq","tooltip","capitalize","concat"]]',moduleName:"consul-ui/components/consul/instance-checks/index.hbs",isStrictMode:!1}) +var i=(0,t.setComponentTemplate)(r,(0,l.default)()) +e.default=i})),define("consul-ui/components/consul/intention/form/fieldsets/index",["exports","@ember/component","@ember/template-factory"],(function(e,t,n){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const l=(0,n.createTemplateFactory)({id:"fVbLeBz9",block:'[[[11,0],[17,1],[24,0,"consul-intention-fieldsets"],[12],[1,"\\n "],[10,"fieldset"],[15,"disabled",[36,0]],[12],[1,"\\n "],[10,0],[14,"role","group"],[12],[1,"\\n "],[10,"fieldset"],[12],[1,"\\n "],[10,"h2"],[12],[1,"Source"],[13],[1,"\\n "],[10,"label"],[15,0,[29,["type-select",[52,[33,2,["error","SourceName"]]," has-error"]]]],[12],[1,"\\n "],[10,1],[12],[1,"Source Service"],[13],[1,"\\n "],[8,[39,3],null,[["@disabled","@options","@searchField","@selected","@searchPlaceholder","@buildSuggestion","@showCreateWhen","@onCreate","@onChange"],[[28,[37,4],[[33,5]],null],[99,6,["@options"]],"Name",[99,7,["@selected"]],"Type service name",[28,[37,8],[[30,0],"createNewLabel","Use a Consul Service called \'{{term}}\'"],null],[28,[37,8],[[30,0],"isUnique",[33,6]],null],[28,[37,8],[[30,0],[33,9],"SourceName"],null],[28,[37,8],[[30,0],[33,9],"SourceName"],null]]],[["default"],[[[[1,"\\n"],[41,[28,[37,10],[[30,2,["Name"]],"*"],null],[[[1," * (All Services)\\n"]],[]],[[[1," "],[1,[30,2,["Name"]]],[1,"\\n"]],[]]],[1," "]],[2]]]]],[1,"\\n"],[41,[33,5],[[[1," "],[10,"em"],[12],[1,"Search for an existing service, or enter any Service name."],[13],[1,"\\n"]],[]],null],[1," "],[13],[1,"\\n"],[41,[28,[37,11],["choose nspaces"],null],[[[1," "],[10,"label"],[15,0,[29,["type-select",[52,[33,2,["error","SourceNS"]]," has-error"]]]],[12],[1,"\\n "],[10,1],[12],[1,"Source Namespace"],[13],[1,"\\n "],[8,[39,3],null,[["@disabled","@options","@selected","@searchPlaceholder","@buildSuggestion","@showCreateWhen","@onCreate","@onChange"],[[28,[37,4],[[33,5]],null],[99,12,["@options"]],[99,13,["@selected"]],"Type namespace name",[28,[37,8],[[30,0],"createNewLabel","Use a Consul Namespace called \'{{term}}\'"],null],[28,[37,8],[[30,0],"isUnique",[33,12]],null],[28,[37,8],[[30,0],[33,9],"SourceNS"],null],[28,[37,8],[[30,0],[33,9],"SourceNS"],null]]],[["default"],[[[[1,"\\n"],[41,[28,[37,10],[[30,3,["Name"]],"*"],null],[[[1," * (All Namespaces)\\n"]],[]],[[[1," "],[1,[30,3,["Name"]]],[1,"\\n"]],[]]],[1," "]],[3]]]]],[1,"\\n"],[41,[33,5],[[[1," "],[10,"em"],[12],[1,"Search for an existing namespace, or enter any Namespace name."],[13],[1,"\\n"]],[]],null],[1," "],[13],[1,"\\n"]],[]],null],[41,[28,[37,11],["choose partitions"],[["dc"],[[30,4]]]],[[[1," "],[10,"label"],[15,0,[29,["type-select",[52,[33,2,["error","SourcePartition"]]," has-error"]]]],[12],[1,"\\n "],[10,1],[12],[1,"Source Partition"],[13],[1,"\\n "],[8,[39,3],null,[["@disabled","@options","@selected","@searchPlaceholder","@buildSuggestion","@showCreateWhen","@onCreate","@onChange"],[[28,[37,4],[[33,5]],null],[99,14,["@options"]],[99,15,["@selected"]],"Type partition name",[28,[37,8],[[30,0],"createNewLabel","Use a Consul Partition called \'{{term}}\'"],null],[28,[37,8],[[30,0],"isUnique",[33,14]],null],[28,[37,8],[[30,0],[33,9],"SourcePartition"],null],[28,[37,8],[[30,0],[33,9],"SourcePartition"],null]]],[["default"],[[[[1,"\\n "],[1,[30,5,["Name"]]],[1,"\\n "]],[5]]]]],[1,"\\n"],[41,[33,5],[[[1," "],[10,"em"],[12],[1,"Search for an existing partition, or enter any Partition name."],[13],[1,"\\n"]],[]],null],[1," "],[13],[1,"\\n"]],[]],null],[1," "],[13],[1,"\\n "],[10,"fieldset"],[12],[1,"\\n "],[10,"h2"],[12],[1,"Destination"],[13],[1,"\\n "],[10,"label"],[15,0,[29,["type-select",[52,[33,2,["error","DestinationName"]]," has-error"]]]],[12],[1,"\\n "],[10,1],[12],[1,"Destination Service"],[13],[1,"\\n "],[8,[39,3],null,[["@disabled","@options","@searchField","@selected","@searchPlaceholder","@buildSuggestion","@showCreateWhen","@onCreate","@onChange"],[[28,[37,4],[[33,5]],null],[99,6,["@options"]],"Name",[99,16,["@selected"]],"Type service name",[28,[37,8],[[30,0],"createNewLabel","Use a Consul Service called \'{{term}}\'"],null],[28,[37,8],[[30,0],"isUnique",[33,6]],null],[28,[37,8],[[30,0],[33,9],"DestinationName"],null],[28,[37,8],[[30,0],[33,9],"DestinationName"],null]]],[["default"],[[[[1,"\\n"],[41,[28,[37,10],[[30,6,["Name"]],"*"],null],[[[1," * (All Services)\\n"]],[]],[[[1," "],[1,[30,6,["Name"]]],[1,"\\n"]],[]]],[1," "]],[6]]]]],[1,"\\n"],[41,[33,5],[[[1," "],[10,"em"],[12],[1,"Search for an existing service, or enter any Service name."],[13],[1,"\\n"]],[]],null],[1," "],[13],[1,"\\n"],[41,[28,[37,11],["choose nspaces"],null],[[[1," "],[10,"label"],[15,0,[29,["type-select",[52,[33,2,["error","DestinationNS"]]," has-error"]]]],[12],[1,"\\n "],[10,1],[12],[1,"Destination Namespace"],[13],[1,"\\n "],[8,[39,3],null,[["@disabled","@options","@searchField","@selected","@searchPlaceholder","@buildSuggestion","@showCreateWhen","@onCreate","@onChange"],[[28,[37,4],[[33,5]],null],[99,12,["@options"]],"Name",[99,17,["@selected"]],"Type namespace name",[28,[37,8],[[30,0],"createNewLabel","Use a future Consul Namespace called \'{{term}}\'"],null],[28,[37,8],[[30,0],"isUnique",[33,12]],null],[28,[37,8],[[30,0],[33,9],"DestinationNS"],null],[28,[37,8],[[30,0],[33,9],"DestinationNS"],null]]],[["default"],[[[[1,"\\n"],[41,[28,[37,10],[[30,7,["Name"]],"*"],null],[[[1," * (All Namespaces)\\n"]],[]],[[[1," "],[1,[30,7,["Name"]]],[1,"\\n"]],[]]],[1," "]],[7]]]]],[1,"\\n"],[41,[33,5],[[[1," "],[10,"em"],[12],[1,"For the destination, you may choose any namespace for which you have access."],[13],[1,"\\n"]],[]],null],[1," "],[13],[1,"\\n"]],[]],null],[41,[28,[37,11],["choose partitions"],[["dc"],[[30,4]]]],[[[1," "],[10,"label"],[15,0,[29,["type-select",[52,[33,2,["error","DestinationPartition"]]," has-error"]]]],[12],[1,"\\n "],[10,1],[12],[1,"Destination Partition"],[13],[1,"\\n "],[8,[39,3],null,[["@disabled","@options","@searchField","@selected","@searchPlaceholder","@buildSuggestion","@showCreateWhen","@onCreate","@onChange"],[[28,[37,4],[[33,5]],null],[99,14,["@options"]],"Name",[99,18,["@selected"]],"Type partition name",[28,[37,8],[[30,0],"createNewLabel","Use a future Consul Partition called \'{{term}}\'"],null],[28,[37,8],[[30,0],"isUnique",[33,14]],null],[28,[37,8],[[30,0],[33,9],"DestinationPartition"],null],[28,[37,8],[[30,0],[33,9],"DestinationPartition"],null]]],[["default"],[[[[1,"\\n "],[1,[30,8,["Name"]]],[1,"\\n "]],[8]]]]],[1,"\\n"],[41,[33,5],[[[1," "],[10,"em"],[12],[1,"For the destination, you may choose any partition for which you have access."],[13],[1,"\\n"]],[]],null],[1," "],[13],[1,"\\n"]],[]],null],[1," "],[13],[1,"\\n "],[13],[1,"\\n "],[10,"fieldset"],[12],[1,"\\n "],[10,"label"],[15,0,[29,["type-text",[52,[33,2,["error","Description"]]," has-error"]]]],[12],[1,"\\n "],[10,1],[12],[1,"Description (Optional)"],[13],[1,"\\n "],[10,"input"],[14,3,"Description"],[15,2,[33,2,["Description"]]],[14,"placeholder","Description (Optional)"],[15,"onchange",[28,[37,8],[[30,0],[33,9]],null]],[14,4,"text"],[12],[13],[1,"\\n "],[13],[1,"\\n "],[13],[1,"\\n "],[10,0],[12],[1,"\\n "],[10,1],[14,0,"label"],[12],[1,"Should this source connect to the destination?"],[13],[1,"\\n "],[10,0],[14,"role","radiogroup"],[15,0,[52,[33,2,["error","Action"]]," has-error"]],[12],[1,"\\n"],[42,[28,[37,20],[[28,[37,20],[[28,[37,21],[[28,[37,22],null,[["intent","header","body"],["allow","Allow","The source service will be allowed to connect to the destination."]]],[28,[37,22],null,[["intent","header","body"],["deny","Deny","The source service will not be allowed to connect to the destination."]]],[28,[37,22],null,[["intent","header","body"],["","Application Aware","The source service may or may not connect to the destination service via unique permissions based on Layer 7 criteria: path, header, or method."]]]],null]],null]],null],null,[[[1," "],[8,[39,23],[[16,0,[28,[37,24],["value-",[30,9,["intent"]]],null]]],[["@value","@checked","@onchange","@name"],[[30,9,["intent"]],[52,[28,[37,10],[[28,[37,25],[[33,2,["Action"]],""],null],[30,9,["intent"]]],null],"checked"],[28,[37,8],[[30,0],[33,9]],null],"Action"]],[["default"],[[[[1,"\\n "],[10,"header"],[12],[1,"\\n "],[1,[30,9,["header"]]],[1,"\\n "],[13],[1,"\\n "],[10,2],[12],[1,"\\n "],[1,[30,9,["body"]]],[1,"\\n "],[13],[1,"\\n "]],[10]]]]],[1,"\\n"]],[9]],null],[1," "],[13],[1,"\\n "],[13],[1,"\\n "],[13],[1,"\\n"],[41,[28,[37,10],[[28,[37,25],[[33,2,["Action"]],""],null],""],null],[[[1," "],[10,"fieldset"],[14,0,"permissions"],[12],[1,"\\n "],[8,[39,26],[[4,[38,27],["click",[28,[37,8],[[30,0],[30,0,["openModal"]]],null]],null]],[["@text","@size","@color","@icon"],["Add permission","small","tertiary","plus"]],null],[1,"\\n "],[10,"h2"],[12],[1,"Permissions"],[13],[1,"\\n"],[41,[28,[37,28],[[33,2,["Permissions","length"]],0],null],[[[1," "],[8,[39,29],null,null,null],[1,"\\n "],[8,[39,30],null,[["@items","@onclick","@ondelete"],[[33,2,["Permissions"]],[28,[37,31],[[28,[37,8],[[30,0],[28,[37,32],[[33,33]],null]],null],[28,[37,8],[[30,0],[30,0,["openModal"]]],null]],null],[28,[37,8],[[30,0],"delete","Permissions",[33,2]],null]]],null],[1,"\\n"]],[]],[[[1," "],[8,[39,34],null,null,[["default"],[[[[1,"\\n "],[8,[39,35],null,[["@name"],["header"]],[["default"],[[[[1,"\\n "],[10,"h3"],[12],[1,"\\n No permissions yet\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,35],null,[["@name"],["body"]],[["default"],[[[[1,"\\n "],[10,2],[12],[1,"\\n Permissions intercept an Intention\'s traffic using Layer 7 criteria, such as path prefixes and http headers.\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,35],null,[["@name"],["actions"]],[["default"],[[[[1,"\\n "],[10,"li"],[12],[1,"\\n "],[8,[39,36],null,[["@text","@href","@icon","@iconPosition","@size"],["Documentation",[29,[[28,[37,37],["CONSUL_DOCS_URL"],null],"/commands/intention"]],"docs-link","trailing","small"]],null],[1,"\\n "],[13],[1,"\\n "],[10,"li"],[12],[1,"\\n "],[8,[39,36],null,[["@text","@href","@icon","@iconPosition","@size"],["Read the guide",[29,[[28,[37,37],["CONSUL_DOCS_LEARN_URL"],null],"/consul/getting-started/connect"]],"learn-link","trailing","small"]],null],[1,"\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n "]],[]]]]],[1,"\\n"]],[]]],[1," "],[13],[1,"\\n"]],[]],null],[1,"\\n "],[8,[39,38],[[24,0,"consul-intention-permission-modal"]],[["@onclose","@aria"],[[28,[37,8],[[30,0],[28,[37,32],[[33,33]],null],[27]],null],[28,[37,22],null,[["label"],["Edit Permission"]]]]],[["default"],[[[[1,"\\n "],[8,[39,39],null,[["@target","@name","@value"],[[30,0],"modal",[30,11]]],null],[1,"\\n "],[8,[39,35],null,[["@name"],["header"]],[["default"],[[[[1,"\\n "],[10,"h3"],[12],[1,"Edit Permission"],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,35],null,[["@name"],["body"]],[["default"],[[[[1,"\\n "],[8,[39,40],null,[["@item","@onsubmit"],[[99,33,["@item"]],[28,[37,8],[[30,0],"add","Permissions",[33,2]],null]]],[["default"],[[[[1,"\\n "],[8,[39,39],null,[["@target","@name","@value"],[[30,0],"permissionForm",[30,12]]],null],[1,"\\n "]],[12]]]]],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,35],null,[["@name"],["actions"]],[["default"],[[[[1,"\\n "],[8,[39,41],null,null,[["default"],[[[[1,"\\n "],[8,[39,26],[[16,"disabled",[52,[28,[37,4],[[30,0,["permissionForm","isDirty"]]],null],"disabled"]],[16,"onclick",[28,[37,31],[[28,[37,8],[[30,0],[30,0,["permissionForm","submit"]]],null],[28,[37,8],[[30,0],[30,11,["close"]]],null]],null]]],[["@text","@color"],["Save","primary"]],null],[1,"\\n "],[8,[39,26],[[16,"onclick",[28,[37,31],[[28,[37,8],[[30,0],[30,0,["permissionForm","reset"]]],null],[28,[37,8],[[30,0],[30,11,["close"]]],null]],null]]],[["@text","@color"],["Cancel","secondary"]],null],[1,"\\n "]],[]]]]],[1,"\\n "]],[]]]]],[1,"\\n "]],[11]]]]],[1,"\\n\\n"],[13]],["&attrs","service","nspace","@dc","partition","service","nspace","partition","_action","radio","modal","permissionForm"],false,["disabled","if","item","power-select-with-create","not","create","services","SourceName","action","onchange","eq","can","nspaces","SourceNS","partitions","SourcePartition","DestinationName","DestinationNS","DestinationPartition","each","-track-array","array","hash","radio-card","concat","or","hds/button","on","gt","consul/intention/notice/permissions","consul/intention/permission/list","queue","mut","permission","empty-state","block-slot","hds/link/standalone","env","modal-dialog","ref","consul/intention/permission/form","hds/button-set"]]',moduleName:"consul-ui/components/consul/intention/form/fieldsets/index.hbs",isStrictMode:!1}) +var r=(0,t.setComponentTemplate)(l,t.default.extend({tagName:"",shouldShowPermissionForm:!1,openModal(){var e +null===(e=this.modal)||void 0===e||e.open()},actions:{createNewLabel:function(e,t){return e.replace(/{{term}}/g,t)},isUnique:function(e,t){return!e.findBy("Name",t)},add:function(e,t,n){!(t.get(e)||[]).includes(n)&&n.isNew&&(t.pushObject(e,n),t.validate())},delete:function(e,t,n){(t.get(e)||[]).includes(n)&&(t.removeObject(e,n),t.validate())}}})) +e.default=r})),define("consul-ui/components/consul/intention/form/index",["exports","@ember/component","@ember/template-factory","@glimmer/component","@ember/service","@ember/object","@glimmer/tracking"],(function(e,t,n,l,r,i,o){var a,u,s,c,d,p,f,m,h,b,y,g,v +function O(e,t,n,l){n&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(l):void 0})}function P(e,t,n,l,r){var i={} +return Object.keys(l).forEach((function(e){i[e]=l[e]})),i.enumerable=!!i.enumerable,i.configurable=!!i.configurable,("value"in i||i.initializer)&&(i.writable=!0),i=n.slice().reverse().reduce((function(n,l){return l(e,t,n)||n}),i),r&&void 0!==i.initializer&&(i.value=i.initializer?i.initializer.call(r):void 0,i.initializer=void 0),void 0===i.initializer&&(Object.defineProperty(e,t,i),i=null),i}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const x=(0,n.createTemplateFactory)({id:"8yZp6UDg",block:'[[[11,0],[24,0,"consul-intention"],[17,1],[12],[1,"\\n"],[8,[39,0],null,[["@type","@dc","@nspace","@partition","@autofill","@item","@src","@onchange","@onsubmit"],["intention",[30,2,["Name"]],[30,3],[30,4],[30,5],[30,6],[30,7],[28,[37,1],[[30,0],[30,0,["change"]]],null],[28,[37,1],[[30,0],[30,0,["onsubmit"]]],null]]],[["default"],[[[[1,"\\n\\n "],[8,[39,2],null,[["@name"],["error"]],[["default"],[[[[1,"\\n"],[41,[28,[37,4],[[30,8,["error","detail"]],"duplicate intention found:"],null],[[[1," "],[8,[39,5],[[4,[38,6],null,[["after"],[[28,[37,1],[[30,0],[30,9]],null]]]]],[["@color"],["critical"]],[["default"],[[[[1,"\\n "],[8,[30,10,["Title"]],null,null,[["default"],[[[[1,"Intention exists!"]],[]]]]],[1,"\\n "],[8,[30,10,["Description"]],null,null,[["default"],[[[[1,"\\n An intention already exists for this Source-Destination pair. Please enter a different combination of Services, or search the intentions to edit an existing intention.\\n "]],[]]]]],[1,"\\n "]],[10]]]]],[1,"\\n"]],[]],[[[1," "],[8,[39,5],[[4,[38,6],null,[["after"],[[28,[37,1],[[30,0],[30,9]],null]]]]],[["@color"],["critical"]],[["default"],[[[[1,"\\n "],[8,[30,11,["Title"]],null,null,[["default"],[[[[1,"Error!"]],[]]]]],[1,"\\n "],[8,[30,11,["Description"]],null,null,[["default"],[[[[1,"\\n There was an error saving your intention.\\n"],[41,[28,[37,7],[[30,8,["error","status"]],[30,8,["error","detail"]]],null],[[[1," "],[10,"br"],[12],[13],[1,[30,8,["error","status"]]],[1,": "],[1,[30,8,["error","detail"]]],[1,"\\n"]],[]],null],[1," "]],[]]]]],[1,"\\n "]],[11]]]]],[1,"\\n"]],[]]],[1," "]],[9]]]]],[1,"\\n\\n "],[8,[39,2],null,[["@name"],["form"]],[["default"],[[[[1,"\\n"],[44,[[30,8,["data"]],[28,[37,9],[[28,[37,10],["write intention"],[["item"],[[30,8,["data"]]]]]],null]],[[[41,[28,[37,9],[[30,13]],null],[[[1,"\\n"],[44,[[28,[37,11],[[30,12],"Action"],null]],[[[1," "],[8,[39,12],[[24,0,"consul-intention-action-warn-modal warning"]],[["@aria"],[[28,[37,13],null,[["label"],[[28,[37,14],["Set intention to ",[30,14]],null]]]]]],[["default"],[[[[1,"\\n "],[8,[39,15],null,[["@target","@name","@value"],[[30,0],"modal",[30,15]]],null],[1,"\\n "],[8,[39,2],null,[["@name"],["header"]],[["default"],[[[[1,"\\n "],[10,"h2"],[12],[1,"Set intention to "],[1,[30,14]],[1,"?"],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,2],null,[["@name"],["body"]],[["default"],[[[[1,"\\n "],[10,2],[12],[1,"\\n When you change this Intention to "],[1,[30,14]],[1,", you will remove all the Layer 7 policy permissions currently saved to this Intention. Are you sure you want to set it to "],[1,[30,14]],[1,"?\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,2],null,[["@name"],["actions"]],[["default"],[[[[1,"\\n "],[8,[39,16],null,null,[["default"],[[[[1,"\\n "],[8,[39,17],[[4,[38,19],["click",[30,8,["submit"]]],null]],[["@text","@color"],[[29,["Set to ",[28,[37,18],[[30,14]],null]]],"critical"]],null],[1,"\\n "],[8,[39,17],[[16,"onclick",[30,16]]],[["@text","@color"],["No, Cancel","secondary"]],null],[1,"\\n "]],[]]]]],[1,"\\n "]],[16]]]]],[1,"\\n "]],[15]]]]],[1,"\\n"]],[14]]],[1,"\\n "],[8,[39,20],null,[["@src","@onchange"],[[28,[37,21],["/${partition}/*/${dc}/services",[28,[37,13],null,[["partition","dc"],[[30,4],[30,2,["Name"]]]]]],null],[28,[37,1],[[30,0],[30,0,["createServices"]],[30,12]],null]]],null],[1,"\\n\\n"],[41,[28,[37,10],["use nspaces"],null],[[[1," "],[8,[39,20],null,[["@src","@onchange"],[[28,[37,21],["/${partition}/*/${dc}/namespaces",[28,[37,13],null,[["partition","dc"],[[30,4],[30,2,["Name"]]]]]],null],[28,[37,1],[[30,0],[30,0,["createNspaces"]],[30,12]],null]]],null],[1,"\\n"]],[]],null],[1,"\\n"],[41,[28,[37,10],["use partitions"],null],[[[1," "],[8,[39,20],null,[["@src","@onchange"],[[28,[37,21],["/*/*/${dc}/partitions",[28,[37,13],null,[["dc"],[[30,2,["Name"]]]]]],null],[28,[37,1],[[30,0],[30,0,["createPartitions"]],[30,12]],null]]],null],[1,"\\n"]],[]],null],[1,"\\n"],[41,[30,8,["isCreate"]],[[[41,[28,[37,7],[[28,[37,10],["use partitions"],null],[28,[37,9],[[28,[37,10],["choose partitions"],[["dc"],[[30,2]]]]],null]],null],[[[1," "],[8,[39,22],[[24,0,"mb-3 mt-2"]],[["@type"],["inline"]],[["default"],[[[[1,"\\n "],[8,[30,17,["Title"]],null,null,[["default"],[[[[1,"Cross-partition communication not supported"]],[]]]]],[1,"\\n "],[8,[30,17,["Description"]],null,null,[["default"],[[[[1,"Cross-partition communication is not supported outside of the primary datacenter. You will only be able to select namespaces for source and destination services."]],[]]]]],[1,"\\n "]],[17]]]]],[1,"\\n"]],[]],null],[41,[30,0,["isManagedByCRDs"]],[[[1," "],[8,[39,23],null,[["@type"],["warning"]],null],[1,"\\n"]],[]],null]],[]],null],[1," "],[11,"form"],[4,[38,19],["submit",[28,[37,24],[[30,0,["submit"]],[30,12],[30,8,["submit"]]],null]],null],[12],[1,"\\n "],[8,[39,25],null,[["@nspaces","@dc","@partitions","@services","@SourceName","@SourceNS","@SourcePartition","@DestinationName","@DestinationNS","@DestinationPartition","@item","@disabled","@create","@onchange"],[[30,0,["nspaces"]],[30,2],[30,0,["partitions"]],[30,0,["services"]],[30,0,["SourceName"]],[30,0,["SourceNS"]],[30,0,["SourcePartition"]],[30,0,["DestinationName"]],[30,0,["DestinationNS"]],[30,0,["DestinationPartition"]],[30,12],[30,8,["disabled"]],[30,8,["isCreate"]],[30,8,["change"]]]],null],[1,"\\n "],[10,0],[12],[1,"\\n "],[8,[39,16],null,null,[["default"],[[[[1,"\\n "],[8,[39,17],[[16,"disabled",[28,[37,26],[[30,12,["isInvalid"]],[30,8,["disabled"]]],null]],[24,4,"submit"]],[["@text"],["Save"]],null],[1,"\\n "],[8,[39,17],[[16,"disabled",[30,8,["disabled"]]],[24,4,"reset"],[4,[38,19],["click",[28,[37,24],[[30,0,["oncancel"]],[30,12]],null]],null]],[["@text","@color"],["Cancel","secondary"]],null],[1,"\\n"],[41,[28,[37,9],[[30,8,["isCreate"]]],null],[[[41,[28,[37,27],[[30,12,["ID"]],"anonymous"],null],[[[1," "],[8,[39,28],null,[["@message"],["Are you sure you want to delete this Intention?"]],[["default"],[[[[1,"\\n "],[8,[39,2],null,[["@name"],["action"]],[["default"],[[[[1,"\\n "],[8,[39,17],[[16,"disabled",[30,8,["disabled"]]],[4,[38,19],["click",[28,[37,24],[[30,18],[30,8,["delete"]]],null]],null]],[["@text","@color"],["Delete","critical"]],null],[1,"\\n "]],[18]]]]],[1,"\\n "],[8,[39,2],null,[["@name"],["dialog"]],[["default"],[[[[1,"\\n "],[8,[39,29],null,[["@message","@execute","@cancel"],[[30,21],[30,19],[30,20]]],null],[1,"\\n "]],[19,20,21]]]]],[1,"\\n "]],[]]]]],[1,"\\n"]],[]],null]],[]],null],[1," "]],[]]]]],[1,"\\n "],[13],[1,"\\n "],[13],[1,"\\n"]],[]],[[[1,"\\n"],[41,[30,12,["IsManagedByCRD"]],[[[1," "],[8,[39,22],[[24,0,"mb-3 mt-2"]],[["@type"],["inline"]],[["default"],[[[[1,"\\n "],[8,[30,22,["Title"]],null,null,[["default"],[[[[1,"Intention Custom Resource"]],[]]]]],[1,"\\n "],[8,[30,22,["Description"]],null,null,[["default"],[[[[1,"This Intention is view only because it is managed through an Intention Custom Resource in your Kubernetes cluster."]],[]]]]],[1,"\\n "],[8,[30,22,["Link::Standalone"]],null,[["@text","@href","@icon","@iconPosition"],["Learn more about CRDs",[29,[[28,[37,30],["CONSUL_DOCS_URL"],null],"/k8s/crds"]],"docs-link","trailing"]],null],[1,"\\n "]],[22]]]]],[1,"\\n"]],[]],null],[1,"\\n "],[8,[39,31],null,[["@item"],[[30,12]]],null],[1,"\\n"]],[]]]],[12,13]]],[1,"\\n "]],[]]]]],[1,"\\n"]],[8]]]]],[1,"\\n"],[13],[1,"\\n"]],["&attrs","@dc","@nspace","@partition","@autofill","@item","@src","api","after","T","T","item","readonly","newAction","modal","close","A","confirm","execute","cancel","message","A"],false,["data-form","action","block-slot","if","string-starts-with","hds/toast","notification","and","let","not","can","changeset-get","modal-dialog","hash","concat","ref","hds/button-set","hds/button","capitalize","on","data-source","uri","hds/alert","consul/intention/notice/custom-resource","fn","consul/intention/form/fieldsets","or","not-eq","confirmation-dialog","delete-confirmation","env","consul/intention/view"]]',moduleName:"consul-ui/components/consul/intention/form/index.hbs",isStrictMode:!1}) +let w=(a=(0,r.inject)("repository/intention"),u=class extends l.default{constructor(e,t){var n,l,r +super(...arguments),O(this,"services",s,this),O(this,"SourceName",c,this),O(this,"DestinationName",d,this),O(this,"nspaces",p,this),O(this,"SourceNS",f,this),O(this,"DestinationNS",m,this),O(this,"partitions",h,this),O(this,"SourcePartition",b,this),O(this,"DestinationPartition",y,this),O(this,"isManagedByCRDs",g,this),r=null,(l="modal")in(n=this)?Object.defineProperty(n,l,{value:r,enumerable:!0,configurable:!0,writable:!0}):n[l]=r,O(this,"repo",v,this),this.updateCRDManagement()}ondelete(){this.args.ondelete?this.args.ondelete(...arguments):this.onsubmit(...arguments)}oncancel(){this.args.oncancel?this.args.oncancel(...arguments):this.onsubmit(...arguments)}onsubmit(){this.args.onsubmit&&this.args.onsubmit(...arguments)}updateCRDManagement(){this.isManagedByCRDs=this.repo.isManagedByCRDs()}submit(e,t,n){n.preventDefault(),void 0!==e.change.Action&&void 0===e.data.Action?this.modal.open():t()}createServices(e,t){let n=t.data.uniqBy("Name").toArray().filter((e=>!["connect-proxy","mesh-gateway","terminating-gateway"].includes(e.Kind))).sort(((e,t)=>e.Name.localeCompare(t.Name))) +n=[{Name:"*"}].concat(n) +let l=n.findBy("Name",e.SourceName) +l||(l={Name:e.SourceName},n=[l].concat(n)) +let r=n.findBy("Name",e.DestinationName) +r||(r={Name:e.DestinationName},n=[r].concat(n)),this.services=n,this.SourceName=l,this.DestinationName=r}createNspaces(e,t){let n=t.data.toArray().sort(((e,t)=>e.Name.localeCompare(t.Name))) +n=[{Name:"*"}].concat(n) +let l=n.findBy("Name",e.SourceNS) +l||(l={Name:e.SourceNS},n=[l].concat(n)) +let r=n.findBy("Name",e.DestinationNS) +r||(r={Name:e.DestinationNS},n=[r].concat(n)),this.nspaces=n,this.SourceNS=l,this.DestinationNS=r}createPartitions(e,t){let n=t.data.toArray().sort(((e,t)=>e.Name.localeCompare(t.Name))),l=n.findBy("Name",e.SourcePartition) +l||(l={Name:e.SourcePartition},n=[l].concat(n)) +let r=n.findBy("Name",e.DestinationPartition) +r||(r={Name:e.DestinationPartition},n=[r].concat(n)),this.partitions=n,this.SourcePartition=l,this.DestinationPartition=r}change(e,t,n){const l=e.target +let r,i +switch(l.name){case"SourceName":case"DestinationName":case"SourceNS":case"DestinationNS":case"SourcePartition":case"DestinationPartition":switch(r=i=l.value,"string"!=typeof r&&(r=l.value.Name),l.value=r,l.name){case"SourceName":case"DestinationName":0===this.services.filterBy("Name",r).length&&(i={Name:r},this.services=[i].concat(this.services.toArray())) +break +case"SourceNS":case"DestinationNS":0===this.nspaces.filterBy("Name",r).length&&(i={Name:r},this.nspaces=[i].concat(this.nspaces.toArray())) +break +case"SourcePartition":case"DestinationPartition":0===this.partitions.filterBy("Name",r).length&&(i={Name:r},this.partitions=[i].concat(this.partitions.toArray()))}this[l.name]=i}t.handleEvent(e)}},s=P(u.prototype,"services",[o.tracked],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),c=P(u.prototype,"SourceName",[o.tracked],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),d=P(u.prototype,"DestinationName",[o.tracked],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),p=P(u.prototype,"nspaces",[o.tracked],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),f=P(u.prototype,"SourceNS",[o.tracked],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),m=P(u.prototype,"DestinationNS",[o.tracked],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),h=P(u.prototype,"partitions",[o.tracked],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),b=P(u.prototype,"SourcePartition",[o.tracked],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),y=P(u.prototype,"DestinationPartition",[o.tracked],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),g=P(u.prototype,"isManagedByCRDs",[o.tracked],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),v=P(u.prototype,"repo",[a],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),P(u.prototype,"ondelete",[i.action],Object.getOwnPropertyDescriptor(u.prototype,"ondelete"),u.prototype),P(u.prototype,"oncancel",[i.action],Object.getOwnPropertyDescriptor(u.prototype,"oncancel"),u.prototype),P(u.prototype,"onsubmit",[i.action],Object.getOwnPropertyDescriptor(u.prototype,"onsubmit"),u.prototype),P(u.prototype,"updateCRDManagement",[i.action],Object.getOwnPropertyDescriptor(u.prototype,"updateCRDManagement"),u.prototype),P(u.prototype,"submit",[i.action],Object.getOwnPropertyDescriptor(u.prototype,"submit"),u.prototype),P(u.prototype,"createServices",[i.action],Object.getOwnPropertyDescriptor(u.prototype,"createServices"),u.prototype),P(u.prototype,"createNspaces",[i.action],Object.getOwnPropertyDescriptor(u.prototype,"createNspaces"),u.prototype),P(u.prototype,"createPartitions",[i.action],Object.getOwnPropertyDescriptor(u.prototype,"createPartitions"),u.prototype),P(u.prototype,"change",[i.action],Object.getOwnPropertyDescriptor(u.prototype,"change"),u.prototype),u) +e.default=w,(0,t.setComponentTemplate)(x,w)})),define("consul-ui/components/consul/intention/list/check/index",["exports","@ember/component","@ember/template-factory","@ember/component/template-only"],(function(e,t,n,l){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const r=(0,n.createTemplateFactory)({id:"R9NJf0hk",block:'[[[44,[[28,[37,1],[[28,[37,2],[[28,[37,2],["allow","Allowed"],null],[28,[37,2],["deny","Denied"],null],[28,[37,2],["","Layer 7 Rules"],null]],null]],null]],[[[11,0],[16,0,[28,[37,3],["consul-intention-list-check ","notice ",[28,[37,4],[[30,2,["Action"]],"permissions"],null]],null]],[17,3],[12],[1,"\\n "],[10,"h3"],[12],[1,"\\n "],[1,[28,[35,5],[[30,1],[28,[37,4],[[30,2,["Action"]],""],null]],null]],[1,"\\n "],[13],[1,"\\n "],[10,2],[12],[1,"\\n"],[41,[28,[37,7],[[30,2,["Action"]],"allow"],null],[[[1," Yes, "],[1,[33,8,["SourceName"]]],[1," is allowed to connect to "],[1,[30,2,["DestinationName"]]],[1," due to the highest precedence intention below:\\n"]],[]],[[[41,[28,[37,7],[[30,2,["Action"]],"deny"],null],[[[1," No, "],[1,[30,2,["SourceName"]]],[1," is not allowed to connect to "],[1,[30,2,["DestinationName"]]],[1," due to the highest precedence intention below:\\n"]],[]],[[[1," "],[1,[30,2,["SourceName"]]],[1," may or may not be allowed to connect with "],[1,[30,2,["DestinationName"]]],[1," through its Layer 7 rules.\\n "]],[]]]],[]]],[1," "],[13],[1,"\\n"],[13],[1,"\\n"]],[1]]]],["titles","@item","&attrs"],false,["let","from-entries","array","concat","or","get","if","eq","item"]]',moduleName:"consul-ui/components/consul/intention/list/check/index.hbs",isStrictMode:!1}) +var i=(0,t.setComponentTemplate)(r,(0,l.default)()) +e.default=i})),define("consul-ui/components/consul/intention/list/index",["exports","@ember/component","@ember/template-factory","@glimmer/component","@ember/service","@ember/object","@glimmer/tracking"],(function(e,t,n,l,r,i,o){var a,u,s,c +function d(e,t,n,l){n&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(l):void 0})}function p(e,t,n,l,r){var i={} +return Object.keys(l).forEach((function(e){i[e]=l[e]})),i.enumerable=!!i.enumerable,i.configurable=!!i.configurable,("value"in i||i.initializer)&&(i.writable=!0),i=n.slice().reverse().reduce((function(n,l){return l(e,t,n)||n}),i),r&&void 0!==i.initializer&&(i.value=i.initializer?i.initializer.call(r):void 0,i.initializer=void 0),void 0===i.initializer&&(Object.defineProperty(e,t,i),i=null),i}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const f=(0,n.createTemplateFactory)({id:"t3Jtqz1v",block:'[[[11,0],[24,0,"consul-intention-list"],[17,1],[4,[38,0],[[30,0,["updateCRDManagement"]],[30,2]],null],[12],[1,"\\n"],[18,4,[[28,[37,2],null,[["Table","CheckNotice","CustomResourceNotice"],[[50,"consul/intention/list/table",0,null,[["delete","items"],[[30,3],[30,0,["items"]]]]],[52,[30,0,["checkedItem"]],[50,"consul/intention/list/check",0,null,[["item"],[[30,0,["checkedItem"]]]]],""],[52,[30,0,["isManagedByCRDs"]],[50,"consul/intention/notice/custom-resource",0,null,null],""]]]]]],[1,"\\n"],[13]],["&attrs","@items","@delete","&default"],false,["did-update","yield","hash","component","if"]]',moduleName:"consul-ui/components/consul/intention/list/index.hbs",isStrictMode:!1}) +let m=(a=(0,r.inject)("repository/intention"),u=class extends l.default{constructor(e,t){super(...arguments),d(this,"repo",s,this),d(this,"isManagedByCRDs",c,this),this.updateCRDManagement(t.items)}get items(){return this.args.items||[]}get checkedItem(){return 1===this.items.length&&this.args.check&&this.items[0].SourceName===this.args.check?this.items[0]:null}updateCRDManagement(){this.isManagedByCRDs=this.repo.isManagedByCRDs()}},s=p(u.prototype,"repo",[a],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),c=p(u.prototype,"isManagedByCRDs",[o.tracked],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),p(u.prototype,"updateCRDManagement",[i.action],Object.getOwnPropertyDescriptor(u.prototype,"updateCRDManagement"),u.prototype),u) +e.default=m,(0,t.setComponentTemplate)(f,m)})),define("consul-ui/components/consul/intention/list/table/index",["exports","@ember/component","@ember/template-factory","@ember/component/template-only"],(function(e,t,n,l){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const r=(0,n.createTemplateFactory)({id:"5xWkkvyi",block:'[[[8,[39,0],[[24,0,"consul-intention-list-table"],[17,1]],[["@items","@rowHeight"],[[30,2],59]],[["default"],[[[[1,"\\n "],[8,[39,1],null,[["@name"],["header"]],[["default"],[[[[1,"\\n "],[10,"th"],[14,0,"source"],[12],[1,"Source"],[13],[1,"\\n "],[10,"th"],[14,0,"intent"],[12],[1," "],[13],[1,"\\n "],[10,"th"],[14,0,"destination"],[12],[1,"Destination"],[13],[1,"\\n "],[10,"th"],[14,0,"permissions"],[12],[1,"\\n Permissions\\n "],[10,1],[12],[1,"\\n "],[8,[39,2],null,null,[["default"],[[[[1,"Permissions intercept an Intention\'s traffic using Layer 7 criteria, such as path\\n prefixes and http headers."]],[]]]]],[1,"\\n "],[13],[1,"\\n "],[13],[1,"\\n "],[10,"th"],[14,0,"meta"],[12],[1," "],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,1],null,[["@name"],["row"]],[["default"],[[[[1,"\\n "],[10,"td"],[14,0,"source"],[12],[1,"\\n "],[10,3],[15,6,[28,[37,3],[[28,[37,4],[[30,5],"dc.intentions.edit"],null],[30,3,["ID"]]],null]],[12],[1,"\\n"],[41,[28,[37,6],[[30,3,["SourceName"]],"*"],null],[[[1," All Services (*)\\n"]],[]],[[[1," "],[1,[30,3,["SourceName"]]],[1,"\\n"]],[]]],[1," "],[10,"em"],[14,0,"consul-intention-list-table__meta-info"],[12],[1,"\\n "],[8,[39,7],null,[["@item","@nspace","@partition"],[[28,[37,8],null,[["Namespace","Partition","PeerName"],[[30,3,["SourceNS"]],[30,3,["SourcePartition"]],[30,3,["SourcePeer"]]]]],"-","-"]],null],[1,"\\n "],[13],[1,"\\n "],[13],[1,"\\n "],[13],[1,"\\n "],[10,"td"],[15,0,[29,["intent intent-",[28,[37,9],[[30,3,["Action"]]],null]]]],[12],[1,"\\n "],[10,"strong"],[12],[1,[28,[35,10],[[28,[37,4],[[30,3,["Action"]],"App aware"],null]],null]],[13],[1,"\\n "],[13],[1,"\\n "],[10,"td"],[14,0,"destination"],[12],[1,"\\n "],[10,1],[12],[1,"\\n"],[41,[28,[37,6],[[30,3,["DestinationName"]],"*"],null],[[[1," All Services (*)\\n"]],[]],[[[1," "],[1,[30,3,["DestinationName"]]],[1,"\\n"]],[]]],[41,[28,[37,4],[[28,[37,11],["use nspaces"],null],[28,[37,11],["use partitions"],null]],null],[[[1," "],[10,"em"],[12],[1,"\\n "],[10,1],[15,0,[28,[37,12],["partition-",[28,[37,4],[[30,3,["DestinationPartition"]],"default"],null]],null]],[12],[1,[28,[35,4],[[30,3,["DestinationPartition"]],"default"],null]],[13],[1,"\\n /\\n "],[10,1],[15,0,[28,[37,12],["nspace-",[28,[37,4],[[30,3,["DestinationNS"]],"default"],null]],null]],[12],[1,[28,[35,4],[[30,3,["DestinationNS"]],"default"],null]],[13],[1,"\\n "],[13],[1,"\\n"]],[]],null],[1," "],[13],[1,"\\n "],[13],[1,"\\n "],[10,"td"],[14,0,"permissions"],[12],[1,"\\n"],[41,[28,[37,13],[[30,3,["Permissions","length"]],0],null],[[[1," "],[10,1],[12],[1,[28,[35,14],[[30,3,["Permissions","length"]],"Permission"],null]],[13],[1,"\\n"]],[]],null],[1," "],[13],[1,"\\n "],[10,"td"],[14,0,"meta"],[12],[1,"\\n"],[41,[30,3,["IsManagedByCRD"]],[[[1," "],[8,[39,15],null,[["@item","@label"],[[30,3],"Managed by CRD"]],null],[1,"\\n"]],[]],null],[1," "],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,1],null,[["@name"],["actions"]],[["default"],[[[[1,"\\n "],[8,[39,16],null,[["@expanded","@onchange","@keyboardAccess"],[[52,[28,[37,6],[[30,8],[30,6]],null],true,false],[28,[37,17],[[30,0],[30,7],[30,6]],null],false]],[["default"],[[[[1,"\\n "],[8,[39,1],null,[["@name"],["trigger"]],[["default"],[[[[1,"\\n More\\n "]],[]]]]],[1,"\\n "],[8,[39,1],null,[["@name"],["menu"]],[["default"],[[[[1,"\\n"],[41,[28,[37,11],["write intention"],[["item"],[[30,3]]]],[[[1," "],[10,"li"],[14,"role","none"],[12],[1,"\\n "],[10,3],[14,"role","menuitem"],[14,"tabindex","-1"],[15,6,[28,[37,3],[[28,[37,4],[[33,18],"dc.intentions.edit"],null],[30,3,["ID"]]],null]],[12],[1,"Edit"],[13],[1,"\\n "],[13],[1,"\\n "],[10,"li"],[14,"role","none"],[14,0,"dangerous"],[12],[1,"\\n "],[10,"label"],[15,"for",[30,9]],[14,"role","menuitem"],[14,"tabindex","-1"],[15,"onkeypress",[30,11]],[12],[1,"Delete"],[13],[1,"\\n "],[10,0],[14,"role","menu"],[12],[1,"\\n "],[8,[39,19],[[24,0,"warning"]],null,[["header","body","actions"],[[[[1,"\\n Confirm Delete\\n "]],[]],[[[1,"\\n "],[10,2],[12],[1,"\\n Are you sure you want to delete this intention?\\n "],[13],[1,"\\n "]],[]],[[[1,"\\n "],[8,[30,13,["Action"]],[[24,0,"dangerous"]],null,[["default"],[[[[1,"\\n "],[8,[39,17],[[24,0,"type-delete"],[24,"tabindex","-1"],[4,[38,20],["click",[28,[37,21],[[28,[37,17],[[30,0],[30,12]],null],[28,[37,17],[[30,0],[30,14],[30,3]],null]],null]],null]],null,[["default"],[[[[1,"\\n Delete\\n "]],[]]]]],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[30,13,["Action"]],null,null,[["default"],[[[[1,"\\n "],[8,[39,17],null,[["@for"],[[30,9]]],[["default"],[[[[1,"\\n Cancel\\n "]],[]]]]],[1,"\\n "]],[]]]]],[1,"\\n "]],[13]]]]],[1,"\\n "],[13],[1,"\\n "],[13],[1,"\\n"]],[]],[[[41,[28,[37,11],["view CRD intention"],[["item"],[[30,3]]]],[[[1," "],[10,"li"],[14,"role","none"],[12],[1,"\\n "],[10,0],[14,"role","menu"],[12],[1,"\\n "],[8,[39,19],null,null,[["header","body","actions"],[[[[1,"\\n "],[10,1],[14,0,"flex flex-nowrap items-center"],[12],[1,"\\n "],[8,[39,22],[[24,0,"mr-1.5"]],[["@name"],["kubernetes-color"]],null],[1,"\\n Managed by CRD\\n "],[13],[1,"\\n "]],[]],[[[1,"\\n "],[10,2],[12],[1,"\\n This intention is being managed through an Intention Custom Resource in your\\n Kubernetes cluster. It is view only in the UI.\\n "],[13],[1,"\\n "]],[]],[[[1,"\\n "],[8,[30,15,["Action"]],null,null,[["default"],[[[[1,"\\n "],[8,[39,17],[[24,"tabindex","-1"],[24,0,"action"]],[["@href"],[[28,[37,3],[[28,[37,4],[[30,5],"dc.intentions.edit"],null],[30,3,["ID"]]],null]]],[["default"],[[[[1,"\\n View\\n "]],[]]]]],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[30,15,["Action"]],null,null,[["default"],[[[[1,"\\n "],[8,[39,17],null,[["@onclick"],[[28,[37,17],[[30,0],[30,12]],null]]],[["default"],[[[[1,"\\n Cancel\\n "]],[]]]]],[1,"\\n "]],[]]]]],[1,"\\n "]],[15]]]]],[1,"\\n "],[13],[1,"\\n "],[13],[1,"\\n"]],[]],[[[1," "],[10,"li"],[14,"role","none"],[12],[1,"\\n "],[10,3],[14,"role","menuitem"],[14,"tabindex","-1"],[15,6,[28,[37,3],[[28,[37,4],[[33,18],"dc.intentions.edit"],null],[30,3,["ID"]]],null]],[12],[1,"\\n View\\n "],[13],[1,"\\n "],[13],[1,"\\n "]],[]]]],[]]],[1," "]],[9,10,11,12]]]]],[1,"\\n "]],[]]]]],[1,"\\n "]],[6,7,8]]]]],[1,"\\n"]],[3,4]]]]],[1,"\\n"]],["&attrs","@items","item","index","@routeName","index","change","checked","confirm","send","keypressClick","change","Actions","@delete","Actions"],false,["tabular-collection","block-slot","tooltip","href-to","or","if","eq","consul/bucket/list","hash","slugify","capitalize","can","concat","gt","pluralize","consul/external-source","popover-menu","action","routeName","informed-action","on","queue","flight-icon"]]',moduleName:"consul-ui/components/consul/intention/list/table/index.hbs",isStrictMode:!1}) +var i=(0,t.setComponentTemplate)(r,(0,l.default)()) +e.default=i})),define("consul-ui/components/consul/intention/notice/custom-resource/index",["exports","@ember/component","@ember/template-factory","@ember/component/template-only"],(function(e,t,n,l){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const r=(0,n.createTemplateFactory)({id:"6ZXsu8uh",block:'[[[8,[39,0],[[24,0,"mb-2 mt-2 consul-intention-notice-custom-resource"]],[["@type","@color"],["inline",[28,[37,1],[[30,1],"neutral"],null]]],[["default"],[[[[1,"\\n "],[8,[30,2,["Title"]],null,null,[["default"],[[[[1,"Intention Custom Resource"]],[]]]]],[1,"\\n "],[8,[30,2,["Description"]],null,null,[["default"],[[[[1,"Some of your intentions are being managed through an Intention Custom Resource in your Kubernetes cluster. Those managed intentions will be view only in the UI. Any intentions created in the UI will work but will not be synced to the Custom Resource Definition (CRD) datastore."]],[]]]]],[1,"\\n "],[8,[30,2,["Link::Standalone"]],null,[["@href","@text","@icon","@iconPosition","@size"],[[29,[[28,[37,2],["CONSUL_DOCS_URL"],null],"/k8s/crds"]],"Learn more about CRDs","docs-link","trailing","small"]],null],[1,"\\n"]],[2]]]]]],["@type","A"],false,["hds/alert","or","env"]]',moduleName:"consul-ui/components/consul/intention/notice/custom-resource/index.hbs",isStrictMode:!1}) +var i=(0,t.setComponentTemplate)(r,(0,l.default)()) +e.default=i})),define("consul-ui/components/consul/intention/notice/permissions/index",["exports","@ember/component","@ember/template-factory","@ember/component/template-only"],(function(e,t,n,l){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const r=(0,n.createTemplateFactory)({id:"DK7vccyg",block:'[[[8,[39,0],[[24,0,"mb-3 mt-2"]],[["@type"],["inline"]],[["default"],[[[[1,"\\n "],[8,[30,1,["Description"]],null,null,[["default"],[[[[1,[28,[35,1],["components.consul.intention.notice.permissions.body"],null]]],[]]]]],[1,"\\n "],[8,[30,1,["Link::Standalone"]],null,[["@text","@href","@icon","@iconPosition","@size"],[[28,[37,1],["components.consul.intention.notice.permissions.footer"],null],[29,[[28,[37,2],["CONSUL_DOCS_URL"],null],"/connect/intentions"]],"docs-link","trailing","small"]],null],[1,"\\n"]],[1]]]]]],["A"],false,["hds/alert","t","env"]]',moduleName:"consul-ui/components/consul/intention/notice/permissions/index.hbs",isStrictMode:!1}) +var i=(0,t.setComponentTemplate)(r,(0,l.default)()) +e.default=i})),define("consul-ui/components/consul/intention/notifications/index",["exports","@ember/component","@ember/template-factory","@ember/component/template-only"],(function(e,t,n,l){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const r=(0,n.createTemplateFactory)({id:"qH69B/hI",block:'[[[41,[28,[37,1],[[30,1],"create"],null],[[[41,[28,[37,1],[[30,2],"success"],null],[[[1," Your intention has been added.\\n"]],[]],[[[1," There was an error adding your intention.\\n"]],[]]]],[]],[[[41,[28,[37,1],[[30,1],"update"],null],[[[41,[28,[37,1],[[30,2],"success"],null],[[[1," Your intention has been saved.\\n"]],[]],[[[1," There was an error saving your intention.\\n"]],[]]]],[]],[[[41,[28,[37,1],[[30,1],"delete"],null],[[[41,[28,[37,1],[[30,2],"success"],null],[[[1," Your intention was deleted.\\n"]],[]],[[[1," There was an error deleting your intention.\\n"]],[]]]],[]],null]],[]]]],[]]],[44,[[30,3,["errors","firstObject"]]],[[[41,[30,4,["detail"]],[[[1," "],[10,"br"],[12],[13],[1,[28,[35,3],["(",[52,[30,4,["status"]],[28,[37,3],[[30,4,["status"]],": "],null]],[30,4,["detail"]],")"],null]],[1,"\\n"]],[]],null]],[4]]]],["@type","@status","@error","error"],false,["if","eq","let","concat"]]',moduleName:"consul-ui/components/consul/intention/notifications/index.hbs",isStrictMode:!1}) +var i=(0,t.setComponentTemplate)(r,(0,l.default)()) +e.default=i})),define("consul-ui/components/consul/intention/permission/form/index",["exports","@ember/component","@ember/template-factory","@ember/object","@ember/object/computed","@ember/service"],(function(e,t,n,l,r,i){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const o=(0,n.createTemplateFactory)({id:"9N7+TvqA",block:'[[[11,0],[17,1],[24,0,"consul-intention-permission-form"],[12],[1,"\\n"],[8,[39,0],null,[["@name"],[[99,1,["@name"]]]],[["default"],[[[[1,"\\n\\n "],[18,11,[[28,[37,3],null,[["submit","reset","isDirty","changeset"],[[28,[37,4],[[30,0],"submit",[33,5]],null],[28,[37,4],[[30,0],"reset",[33,5]],null],[28,[37,6],[[33,5,["isValid"]]],null],[33,5]]]]]],[1,"\\n\\n "],[10,"fieldset"],[12],[1,"\\n "],[10,0],[14,"data-property","action"],[12],[1,"\\n "],[10,1],[14,0,"label"],[12],[1,"\\n Should this permission allow the source connect to the destination?\\n "],[13],[1,"\\n "],[10,0],[14,"role","radiogroup"],[15,0,[52,[33,5,["error","Action"]]," has-error"]],[12],[1,"\\n"],[42,[28,[37,9],[[28,[37,9],[[33,10]],null]],null],null,[[[1," "],[10,"label"],[12],[1,"\\n "],[10,1],[12],[1,[28,[35,11],[[30,3]],null]],[13],[1,"\\n "],[10,"input"],[14,3,"Action"],[15,2,[30,3]],[15,"checked",[52,[28,[37,12],[[33,5,["Action"]],[30,3]],null],"checked"]],[15,"onchange",[28,[37,4],[[30,0],[28,[37,13],[[33,5],"Action"],null]],[["value"],["target.value"]]]],[14,4,"radio"],[12],[13],[1,"\\n "],[13],[1,"\\n"]],[3]],null],[1," "],[13],[1,"\\n "],[13],[1,"\\n "],[13],[1,"\\n\\n "],[10,"fieldset"],[12],[1,"\\n "],[10,"header"],[12],[1,"\\n "],[10,"h2"],[12],[1,"Path"],[13],[1,"\\n "],[13],[1,"\\n "],[10,0],[12],[1,"\\n "],[8,[30,2,["Element"]],null,[["@name","@type"],["PathType","select"]],[["default"],[[[[1,"\\n "],[8,[30,4,["Label"]],null,null,[["default"],[[[[1,"\\n Path type\\n "]],[]]]]],[1,"\\n "],[8,[39,14],null,[["@options","@selected","@onChange"],[[99,15,["@options"]],[99,16,["@selected"]],[28,[37,4],[[30,0],"change","HTTP.PathType",[33,5]],null]]],[["default"],[[[[1,"\\n "],[1,[28,[35,17],[[33,18],[30,5]],null]],[1,"\\n "]],[5]]]]],[1,"\\n "]],[4]]]]],[1,"\\n\\n"],[41,[33,19],[[[1," "],[8,[30,2,["Element"]],null,[["@name","@error"],["Path",[28,[37,20],[[33,5],"error.HTTP.Path"],null]]],[["default"],[[[[1,"\\n "],[8,[30,6,["Label"]],null,null,[["default"],[[[[1,"\\n "],[1,[28,[35,17],[[33,18],[33,16]],null]],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[30,6,["Text"]],[[16,"oninput",[28,[37,4],[[30,0],"change","HTTP.Path",[33,5]],null]]],[["@value"],[[28,[37,20],[[33,5],"HTTP.Path"],null]]],null],[1,"\\n "],[8,[39,21],null,[["@state","@matches"],[[30,6,["state"]],"error"]],[["default"],[[[[1,"\\n "],[8,[30,6,["Error"]],null,null,[["default"],[[[[1,"\\n"],[41,[28,[37,12],[[28,[37,20],[[33,5],"HTTP.Path"],null],"Regex"],null],[[[1," Path Regex should not be blank\\n"]],[]],[[[1," Path should begin with a \'/\'\\n"]],[]]],[1," "]],[]]]]],[1,"\\n "]],[]]]]],[1,"\\n "]],[6]]]]],[1,"\\n"]],[]],null],[1,"\\n "],[13],[1,"\\n "],[13],[1,"\\n\\n "],[10,"fieldset"],[12],[1,"\\n "],[10,"h2"],[12],[1,"Methods"],[13],[1,"\\n "],[10,0],[14,0,"type-toggle"],[12],[1,"\\n "],[10,1],[12],[1,"All methods are applied by default unless specified"],[13],[1,"\\n "],[8,[30,2,["Element"]],null,[["@name"],["allMethods"]],[["default"],[[[[1,"\\n "],[8,[30,7,["Checkbox"]],[[16,"checked",[52,[33,22],"checked"]],[16,"onchange",[28,[37,4],[[30,0],"change","allMethods",[33,5]],null]]],null,null],[1,"\\n "],[8,[30,7,["Label"]],null,null,[["default"],[[[[1,"\\n All Methods\\n "]],[]]]]],[1,"\\n "]],[7]]]]],[1,"\\n "],[13],[1,"\\n\\n"],[41,[33,23],[[[1," "],[10,0],[14,0,"checkbox-group"],[14,"role","group"],[12],[1,"\\n"],[42,[28,[37,9],[[28,[37,9],[[33,24]],null]],null],null,[[[1," "],[10,"label"],[14,0,"type-checkbox"],[12],[1,"\\n "],[10,"input"],[14,3,"method"],[15,2,[30,8]],[15,"checked",[52,[28,[37,25],[[30,8],[33,5,["HTTP","Methods"]]],null],"checked"]],[15,"onchange",[28,[37,4],[[30,0],"change","method",[33,5]],null]],[14,4,"checkbox"],[12],[13],[1,"\\n "],[10,1],[12],[1,[30,8]],[13],[1,"\\n "],[13],[1,"\\n"]],[8]],null],[1," "],[13],[1,"\\n"]],[]],null],[1," "],[13],[1,"\\n\\n "],[10,"fieldset"],[12],[1,"\\n "],[10,"h2"],[12],[1,"Headers"],[13],[1,"\\n\\n "],[8,[39,26],null,[["@items","@ondelete"],[[28,[37,20],[[33,5],"HTTP.Header"],null],[28,[37,4],[[30,0],"delete","HTTP.Header",[33,5]],null]]],[["default"],[[[[1,"\\n\\n "]],[9]]]]],[1,"\\n\\n "],[8,[39,27],null,[["@onsubmit"],[[28,[37,4],[[30,0],"add","HTTP.Header",[33,5]],null]]],[["default"],[[[[1,"\\n "],[8,[39,28],null,[["@target","@name","@value"],[[30,0],"headerForm",[30,10]]],null],[1,"\\n "]],[10]]]]],[1,"\\n\\n "],[8,[39,29],null,null,[["default"],[[[[1,"\\n "],[8,[39,30],[[16,"disabled",[52,[28,[37,31],[[30,0,["headerForm","isDirty"]]],null],"disabled"]],[16,"onclick",[28,[37,4],[[30,0],[30,0,["headerForm","submit"]]],null]]],[["@text","@color"],[[29,["Add",[52,[28,[37,32],[[28,[37,17],[[28,[37,20],[[33,5],"HTTP.Header"],null],"length"],null],0],null]," another",""]," header"]],"primary"]],null],[1,"\\n "],[8,[39,30],[[16,"onclick",[28,[37,4],[[30,0],[30,0,["headerForm","reset"]]],null]]],[["@text","@color"],["Cancel","secondary"]],null],[1,"\\n "]],[]]]]],[1,"\\n "],[13],[1,"\\n "]],[2]]]]],[1,"\\n"],[13]],["&attrs","group","intent","el","Type","el","el","method","headerList","headerForm","&default"],false,["form-group","name","yield","hash","action","changeset","and","if","each","-track-array","intents","capitalize","eq","changeset-set","power-select","pathTypes","pathType","get","pathLabels","shouldShowPathField","changeset-get","state","allMethods","shouldShowMethods","methods","includes","consul/intention/permission/header/list","consul/intention/permission/header/form","ref","hds/button-set","hds/button","not","gt"]]',moduleName:"consul-ui/components/consul/intention/permission/form/index.hbs",isStrictMode:!1}),a="intention-permission" +var u=(0,t.setComponentTemplate)(o,t.default.extend({tagName:"",name:a,schema:(0,i.inject)("schema"),change:(0,i.inject)("change"),repo:(0,i.inject)(`repository/${a}`),onsubmit:function(){},onreset:function(){},intents:(0,r.alias)(`schema.${a}.Action.allowedValues`),methods:(0,r.alias)(`schema.${a}-http.Methods.allowedValues`),pathProps:(0,r.alias)(`schema.${a}-http.PathType.allowedValues`),pathTypes:(0,l.computed)("pathProps",(function(){return["NoPath"].concat(this.pathProps)})),pathLabels:(0,l.computed)((function(){return{NoPath:"No Path",PathExact:"Exact",PathPrefix:"Prefixed by",PathRegex:"Regular Expression"}})),pathInputLabels:(0,l.computed)((function(){return{PathExact:"Exact Path",PathPrefix:"Path Prefix",PathRegex:"Path Regular Expression"}})),changeset:(0,l.computed)("item",(function(){const e=this.change.changesetFor(a,this.item||this.repo.create()) +return e.isNew&&e.validate(),e})),pathType:(0,l.computed)("changeset._changes.HTTP.PathType","pathTypes.firstObject",(function(){return this.changeset.HTTP.PathType||this.pathTypes.firstObject})),noPathType:(0,r.equal)("pathType","NoPath"),shouldShowPathField:(0,r.not)("noPathType"),allMethods:!1,shouldShowMethods:(0,r.not)("allMethods"),didReceiveAttrs:function(){(0,l.get)(this,"item.HTTP.Methods.length")||(0,l.set)(this,"allMethods",!0)},actions:{change:function(e,t,n){const r=void 0!==(0,l.get)(n,"target.value")?n.target.value:n +switch(e){case"allMethods":(0,l.set)(this,e,n.target.checked) +break +case"method":n.target.checked?this.actions.add.apply(this,["HTTP.Methods",t,r]):this.actions.delete.apply(this,["HTTP.Methods",t,r]) +break +default:t.set(e,r)}t.validate()},add:function(e,t,n){t.pushObject(e,n),t.validate()},delete:function(e,t,n){t.removeObject(e,n),t.validate()},submit:function(e,t){void 0!==e.changes.find((e=>{let{key:t,value:n}=e +return"HTTP.PathType"===t||"HTTP.Path"===t}))&&(this.pathProps.forEach((t=>{e.set(`HTTP.${t}`,void 0)})),"NoPath"!==e.HTTP.PathType&&e.set(`HTTP.${e.HTTP.PathType}`,e.HTTP.Path)),this.allMethods&&e.set("HTTP.Methods",null),delete e._changes.HTTP.PathType,delete e._changes.HTTP.Path,this.repo.persist(e),this.onsubmit(e.data)},reset:function(e,t){e.rollback(),this.onreset(e.data)}}})) +e.default=u})),define("consul-ui/components/consul/intention/permission/header/form/index",["exports","@ember/component","@ember/template-factory","@ember/object","@ember/object/computed","@ember/service"],(function(e,t,n,l,r,i){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const o=(0,n.createTemplateFactory)({id:"M/AqDx5C",block:'[[[11,0],[17,1],[24,0,"consul-intention-permission-header-form"],[12],[1,"\\n "],[8,[39,0],null,[["@name"],[[99,1,["@name"]]]],[["default"],[[[[1,"\\n\\n "],[18,7,[[28,[37,3],null,[["submit","reset","isDirty","changeset"],[[28,[37,4],[[30,0],"submit",[33,5]],null],[28,[37,4],[[30,0],"reset",[33,5]],null],[28,[37,6],[[33,5,["isValid"]],[33,5,["isDirty"]]],null],[33,5]]]]]],[1,"\\n\\n "],[10,"fieldset"],[12],[1,"\\n "],[10,0],[12],[1,"\\n "],[8,[30,2,["Element"]],null,[["@name","@type"],["HeaderType","select"]],[["default"],[[[[1,"\\n "],[8,[30,3,["Label"]],null,null,[["default"],[[[[1,"Header type"]],[]]]]],[1,"\\n "],[8,[39,7],null,[["@options","@selected","@onChange"],[[99,8,["@options"]],[99,9,["@selected"]],[28,[37,4],[[30,0],"change","HeaderType",[33,5]],null]]],[["default"],[[[[1,"\\n "],[1,[28,[35,10],[[33,11],[30,4]],null]],[1,"\\n "]],[4]]]]],[1,"\\n "]],[3]]]]],[1,"\\n\\n\\n "],[8,[30,2,["Element"]],null,[["@name","@error"],["Name",[28,[37,12],[[33,5],"error.Name"],null]]],[["default"],[[[[1,"\\n "],[8,[30,5,["Label"]],null,null,[["default"],[[[[1,"Header name"]],[]]]]],[1,"\\n "],[8,[30,5,["Text"]],[[16,"oninput",[28,[37,4],[[30,0],"change","Name",[33,5]],null]]],[["@value"],[[28,[37,12],[[33,5],"Name"],null]]],null],[1,"\\n "],[8,[39,13],null,[["@state","@matches"],[[30,5,["state"]],"error"]],[["default"],[[[[1,"\\n "],[8,[30,5,["Error"]],null,null,[["default"],[[[[1,"\\n "],[1,[28,[35,12],[[33,5],"error.Name.validation"],null]],[1,"\\n "]],[]]]]],[1,"\\n "]],[]]]]],[1,"\\n "]],[5]]]]],[1,"\\n\\n"],[41,[33,15],[[[1," "],[8,[30,2,["Element"]],null,[["@name","@error"],["Value",[28,[37,12],[[33,5],"error.Value"],null]]],[["default"],[[[[1,"\\n "],[8,[30,6,["Label"]],null,null,[["default"],[[[[1,"Header "],[1,[28,[35,16],[[28,[37,10],[[33,11],[33,9]],null]],null]]],[]]]]],[1,"\\n "],[8,[30,6,["Text"]],[[16,"oninput",[28,[37,4],[[30,0],"change","Value",[33,5]],null]]],[["@value"],[[28,[37,12],[[33,5],"Value"],null]]],null],[1,"\\n "],[8,[39,13],null,[["@state","@matches"],[[30,6,["state"]],"error"]],[["default"],[[[[1,"\\n "],[8,[30,6,["Error"]],null,null,[["default"],[[[[1,"\\n "],[1,[28,[35,12],[[33,5],"error.Value.validation"],null]],[1,"\\n "]],[]]]]],[1,"\\n "]],[]]]]],[1,"\\n "]],[6]]]]],[1,"\\n"]],[]],null],[1,"\\n "],[13],[1,"\\n "],[13],[1,"\\n "]],[2]]]]],[1,"\\n"],[13]],["&attrs","group","el","Type","el","el","&default"],false,["form-group","name","yield","hash","action","changeset","and","power-select","headerTypes","headerType","get","headerLabels","changeset-get","state","if","shouldShowValueField","lowercase"]]',moduleName:"consul-ui/components/consul/intention/permission/header/form/index.hbs",isStrictMode:!1}),a="intention-permission-http-header" +var u=(0,t.setComponentTemplate)(o,t.default.extend({tagName:"",name:a,schema:(0,i.inject)("schema"),change:(0,i.inject)("change"),repo:(0,i.inject)(`repository/${a}`),onsubmit:function(){},onreset:function(){},changeset:(0,l.computed)("item",(function(){return this.change.changesetFor(a,this.item||this.repo.create({HeaderType:this.headerTypes.firstObject}))})),headerTypes:(0,r.alias)(`schema.${a}.HeaderType.allowedValues`),headerLabels:(0,l.computed)((function(){return{Exact:"Exactly Matching",Prefix:"Prefixed by",Suffix:"Suffixed by",Regex:"Regular Expression",Present:"Is present"}})),headerType:(0,l.computed)("changeset.HeaderType","headerTypes.firstObject",(function(){return this.changeset.HeaderType||this.headerTypes.firstObject})),headerTypeEqualsPresent:(0,r.equal)("headerType","Present"),shouldShowValueField:(0,r.not)("headerTypeEqualsPresent"),actions:{change:function(e,t,n){const r=void 0!==(0,l.get)(n,"target.value")?n.target.value:n +t.set(e,r),t.validate()},submit:function(e){this.headerTypes.forEach((t=>{e.set(t,void 0)})) +const t="Present"===e.HeaderType||e.Value +e.set(e.HeaderType,t),delete e._changes.HeaderType,delete e._changes.Value,this.repo.persist(e),this.onsubmit(e.data),(0,l.set)(this,"item",this.repo.create({HeaderType:this.headerType}))},reset:function(e,t){e.rollback()}}})) +e.default=u})),define("consul-ui/components/consul/intention/permission/header/list/index",["exports","@ember/component","@ember/template-factory"],(function(e,t,n){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const l=(0,n.createTemplateFactory)({id:"3ZH2LwLz",block:'[[[41,[28,[37,1],[[33,2,["length"]],0],null],[[[8,[39,3],[[24,0,"consul-intention-permission-header-list"]],[["@items","@scroll","@cellHeight"],[[99,2,["@items"]],"native",42]],[["default"],[[[[1,"\\n "],[8,[39,4],null,[["@name"],["details"]],[["default"],[[[[1,"\\n "],[10,"dl"],[12],[1,"\\n "],[10,"dt"],[12],[1,"\\n "],[8,[39,5],null,null,[["default"],[[[[1,"\\n Header\\n "]],[]]]]],[1,"\\n "],[13],[1,"\\n "],[10,"dd"],[12],[1,"\\n "],[1,[30,1,["Name"]]],[1," "],[1,[28,[35,6],[[30,1]],null]],[1,"\\n "],[13],[1,"\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,4],null,[["@name"],["actions"]],[["default"],[[[[1,"\\n "],[8,[30,2],null,null,[["default"],[[[[1,"\\n "],[8,[30,3],[[24,0,"dangerous"]],[["@onclick"],[[28,[37,7],[[30,0],[33,8],[30,1]],null]]],[["default"],[[[[1,"\\n "],[8,[39,4],null,[["@name"],["label"]],[["default"],[[[[1,"\\n Delete\\n "]],[]]]]],[1,"\\n "],[8,[39,4],null,[["@name"],["confirmation"]],[["default"],[[[[1,"\\n "],[8,[30,4],[[24,0,"warning"]],null,[["default"],[[[[1,"\\n "],[8,[39,4],null,[["@name"],["header"]],[["default"],[[[[1,"\\n Confirm delete\\n "]],[]]]]],[1,"\\n "],[8,[39,4],null,[["@name"],["body"]],[["default"],[[[[1,"\\n "],[10,2],[12],[1,"\\n Are you sure you want to delete this header?\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,4],null,[["@name"],["confirm"]],[["default"],[[[[1,"\\n "],[8,[30,5],null,null,[["default"],[[[[1,"Delete"]],[]]]]],[1,"\\n "]],[5]]]]],[1,"\\n "]],[]]]]],[1,"\\n "]],[4]]]]],[1,"\\n "]],[]]]]],[1,"\\n "]],[3]]]]],[1,"\\n "]],[2]]]]],[1,"\\n"]],[1]]]]],[1,"\\n"]],[]],null]],["item","Actions","Action","Confirmation","Confirm"],false,["if","gt","items","list-collection","block-slot","tooltip","route-match","action","ondelete"]]',moduleName:"consul-ui/components/consul/intention/permission/header/list/index.hbs",isStrictMode:!1}) +var r=(0,t.setComponentTemplate)(l,t.default.extend({tagName:""})) +e.default=r})),define("consul-ui/components/consul/intention/permission/list/index",["exports","@ember/component","@ember/template-factory"],(function(e,t,n){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const l=(0,n.createTemplateFactory)({id:"nRmkYMml",block:'[[[41,[28,[37,1],[[33,2,["length"]],0],null],[[[8,[39,3],[[16,0,[29,["consul-intention-permission-list",[52,[28,[37,4],[[33,5]],null]," readonly"]]]]],[["@scroll","@items","@partial"],["native",[99,2,["@items"]],5]],[["default"],[[[[1,"\\n "],[8,[39,6],null,[["@name"],["details"]],[["default"],[[[[1,"\\n "],[10,0],[15,"onclick",[28,[37,7],[[30,0],[28,[37,8],[[33,5]],null],[30,1]],null]],[12],[1,"\\n "],[10,"strong"],[15,0,[28,[37,9],["intent-",[30,1,["Action"]]],null]],[12],[1,[28,[35,10],[[30,1,["Action"]]],null]],[13],[1,"\\n"],[41,[28,[37,1],[[30,1,["HTTP","Methods","length"]],0],null],[[[1," "],[10,"dl"],[14,0,"permission-methods"],[12],[1,"\\n "],[10,"dt"],[12],[1,"\\n "],[8,[39,11],null,null,[["default"],[[[[1,"\\n Methods\\n "]],[]]]]],[1,"\\n "],[13],[1,"\\n "],[10,"dd"],[12],[1,"\\n"],[42,[28,[37,13],[[28,[37,13],[[30,1,["HTTP","Methods"]]],null]],null],null,[[[1," "],[1,[30,2]],[1,"\\n"]],[2]],null],[1," "],[13],[1,"\\n "],[13],[1,"\\n"]],[]],null],[41,[30,1,["HTTP","Path"]],[[[1," "],[10,"dl"],[14,0,"permission-path"],[12],[1,"\\n "],[10,"dt"],[12],[1,"\\n "],[8,[39,11],null,null,[["default"],[[[[1,"\\n "],[1,[30,1,["HTTP","PathType"]]],[1,"\\n "]],[]]]]],[1,"\\n "],[13],[1,"\\n "],[10,"dd"],[12],[1,"\\n "],[1,[30,1,["HTTP","Path"]]],[1,"\\n "],[13],[1,"\\n "],[13],[1,"\\n"]],[]],null],[42,[28,[37,13],[[28,[37,13],[[30,1,["HTTP","Header"]]],null]],null],null,[[[1," "],[10,"dl"],[14,0,"permission-header"],[12],[1,"\\n "],[10,"dt"],[12],[1,"\\n "],[8,[39,11],null,null,[["default"],[[[[1,"\\n Header\\n "]],[]]]]],[1,"\\n "],[13],[1,"\\n "],[10,"dd"],[12],[1,"\\n "],[1,[30,3,["Name"]]],[1," "],[1,[28,[35,14],[[30,3]],null]],[1,"\\n "],[13],[1,"\\n "],[13],[1,"\\n"]],[3]],null],[1," "],[13],[1,"\\n "]],[]]]]],[1,"\\n"],[41,[33,5],[[[1," "],[8,[39,6],null,[["@name"],["actions"]],[["default"],[[[[1,"\\n "],[8,[30,4],null,null,[["default"],[[[[1,"\\n "],[8,[30,5],null,[["@onclick","@close"],[[28,[37,7],[[30,0],[28,[37,8],[[33,5]],null],[30,1]],null],true]],[["default"],[[[[1,"\\n "],[8,[39,6],null,[["@name"],["label"]],[["default"],[[[[1,"\\n Edit\\n "]],[]]]]],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[30,5],[[24,0,"dangerous"]],[["@onclick"],[[28,[37,7],[[30,0],[33,15],[30,1]],null]]],[["default"],[[[[1,"\\n "],[8,[39,6],null,[["@name"],["label"]],[["default"],[[[[1,"\\n Delete\\n "]],[]]]]],[1,"\\n "],[8,[39,6],null,[["@name"],["confirmation"]],[["default"],[[[[1,"\\n "],[8,[30,6],[[24,0,"warning"]],null,[["default"],[[[[1,"\\n "],[8,[39,6],null,[["@name"],["header"]],[["default"],[[[[1,"\\n Confirm delete\\n "]],[]]]]],[1,"\\n "],[8,[39,6],null,[["@name"],["body"]],[["default"],[[[[1,"\\n "],[10,2],[12],[1,"\\n Are you sure you want to delete this permission?\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,6],null,[["@name"],["confirm"]],[["default"],[[[[1,"\\n "],[8,[30,7],null,null,[["default"],[[[[1,"Delete"]],[]]]]],[1,"\\n "]],[7]]]]],[1,"\\n "]],[]]]]],[1,"\\n "]],[6]]]]],[1,"\\n "]],[]]]]],[1,"\\n "]],[5]]]]],[1,"\\n "]],[4]]]]],[1,"\\n"]],[]],null]],[1]]]]],[1,"\\n"]],[]],null]],["item","item","item","Actions","Action","Confirmation","Confirm"],false,["if","gt","items","list-collection","not","onclick","block-slot","action","optional","concat","capitalize","tooltip","each","-track-array","route-match","ondelete"]]',moduleName:"consul-ui/components/consul/intention/permission/list/index.hbs",isStrictMode:!1}) +var r=(0,t.setComponentTemplate)(l,t.default.extend({tagName:""})) +e.default=r})),define("consul-ui/components/consul/intention/search-bar/index",["exports","@ember/component","@ember/template-factory","@ember/component/template-only"],(function(e,t,n,l){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const r=(0,n.createTemplateFactory)({id:"YTLr6u9H",block:'[[[8,[39,0],[[24,0,"consul-intention-search-bar"],[17,1]],[["@filter"],[[30,2]]],[["status","search","filter","sort"],[[[[1,"\\n\\n"],[44,[[28,[37,2],[[28,[37,3],["components.consul.intention.search-bar.",[30,3,["status","key"]]],null]],[["default"],[[28,[37,4],[[28,[37,3],["common.search.",[30,3,["status","key"]]],null],[28,[37,3],["common.consul.",[30,3,["status","key"]]],null]],null]]]],[28,[37,2],[[28,[37,3],["components.consul.intention.search-bar.",[30,3,["status","value"]]],null]],[["default"],[[28,[37,4],[[28,[37,3],["common.search.",[30,3,["status","value"]]],null],[28,[37,3],["common.consul.",[30,3,["status","value"]]],null]],null]]]]],[[[1," "],[8,[30,3,["RemoveFilter"]],[[16,"aria-label",[28,[37,2],["common.ui.remove"],[["item"],[[28,[37,3],[[30,4]," ",[30,5]],null]]]]]],null,[["default"],[[[[1,"\\n "],[10,"dl"],[12],[1,"\\n "],[10,"dt"],[12],[1,[30,4]],[13],[1,"\\n "],[10,"dd"],[12],[1,[30,5]],[13],[1,"\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n"]],[4,5]]],[1,"\\n "]],[3]],[[[1,"\\n "],[8,[30,6,["Search"]],null,[["@onsearch","@value","@placeholder"],[[28,[37,5],[[30,0],[30,7]],null],[30,8],[28,[37,2],["common.search.search"],null]]],[["default"],[[[[1,"\\n"],[41,[30,2,["searchproperty"]],[[[1," "],[8,[30,6,["Select"]],[[24,0,"type-search-properties"]],[["@position","@onchange","@multiple","@required"],["right",[28,[37,5],[[30,0],[30,2,["searchproperty","change"]]],null],true,true]],[["default"],[[[[1,"\\n "],[8,[39,7],null,[["@name"],["selected"]],[["default"],[[[[1,"\\n "],[10,1],[12],[1,"\\n "],[1,[28,[35,2],["common.search.searchproperty"],null]],[1,"\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,7],null,[["@name"],["options"]],[["default"],[[[[1,"\\n"],[44,[[30,9,["Optgroup"]],[30,9,["Option"]]],[[[42,[28,[37,9],[[28,[37,9],[[30,2,["searchproperty","default"]]],null]],null],null,[[[1," "],[8,[30,11],null,[["@value","@selected"],[[30,12],[28,[37,10],[[30,12],[30,2,["searchproperty","value"]]],null]]],[["default"],[[[[1,"\\n "],[1,[28,[35,2],[[28,[37,3],["common.consul.",[28,[37,11],[[30,12]],null]],null]],null]],[1,"\\n "]],[]]]]],[1,"\\n"]],[12]],null]],[10,11]]],[1," "]],[]]]]],[1,"\\n "]],[9]]]]],[1,"\\n"]],[]],null],[1," "]],[]]]]],[1,"\\n "]],[6]],[[[1,"\\n "],[8,[30,13,["Select"]],[[24,0,"type-access"]],[["@position","@onchange","@multiple"],["left",[28,[37,5],[[30,0],[30,2,["access","change"]]],null],true]],[["default"],[[[[1,"\\n "],[8,[39,7],null,[["@name"],["selected"]],[["default"],[[[[1,"\\n "],[10,1],[12],[1,"\\n "],[1,[28,[35,2],["components.consul.intention.search-bar.access.name"],null]],[1,"\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,7],null,[["@name"],["options"]],[["default"],[[[[1,"\\n"],[44,[[30,14,["Optgroup"]],[30,14,["Option"]]],[[[42,[28,[37,9],[[28,[37,9],[[28,[37,4],["allow","deny",""],null]],null]],null],null,[[[1," "],[8,[30,16],[[16,0,[28,[37,3],["value-",[30,17]],null]]],[["@value","@selected"],[[28,[37,12],[[30,17],"app-aware"],null],[28,[37,10],[[28,[37,12],[[30,17],"app-aware"],null],[30,2,["access","value"]]],null]]],[["default"],[[[[1,"\\n "],[10,1],[12],[1,[28,[35,2],[[28,[37,3],["components.consul.intention.search-bar.access.options.",[28,[37,12],[[30,17],"app-aware"],null]],null]],null]],[13],[1,"\\n "]],[]]]]],[1,"\\n"]],[17]],null]],[15,16]]],[1," "]],[]]]]],[1,"\\n "]],[14]]]]],[1,"\\n "]],[13]],[[[1,"\\n "],[8,[30,18,["Select"]],[[24,0,"type-sort"]],[["@position","@onchange","@multiple","@required"],["right",[28,[37,5],[[30,0],[30,19,["change"]]],null],false,true]],[["default"],[[[[1,"\\n "],[8,[39,7],null,[["@name"],["selected"]],[["default"],[[[[1,"\\n "],[10,1],[12],[1,"\\n"],[44,[[28,[37,13],[[28,[37,4],[[28,[37,4],["Action:asc",[28,[37,2],["components.consul.intention.search-bar.sort.access.asc"],null]],null],[28,[37,4],["Action:desc",[28,[37,2],["components.consul.intention.search-bar.sort.access.desc"],null]],null],[28,[37,4],["SourceName:asc",[28,[37,2],["components.consul.intention.search-bar.sort.source-name.asc"],null]],null],[28,[37,4],["SourceName:desc",[28,[37,2],["components.consul.intention.search-bar.sort.source-name.desc"],null]],null],[28,[37,4],["DestinationName:asc",[28,[37,2],["components.consul.intention.search-bar.sort.destination-name.asc"],null]],null],[28,[37,4],["DestinationName:desc",[28,[37,2],["components.consul.intention.search-bar.sort.destination-name.desc"],null]],null],[28,[37,4],["Precedence:asc",[28,[37,2],["common.sort.numeric.asc"],null]],null],[28,[37,4],["Precedence:desc",[28,[37,2],["common.sort.numeric.desc"],null]],null]],null]],null]],[[[1," "],[1,[28,[35,14],[[30,21],[30,19,["value"]]],null]],[1,"\\n"]],[21]]],[1," "],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,7],null,[["@name"],["options"]],[["default"],[[[[1,"\\n"],[44,[[30,20,["Optgroup"]],[30,20,["Option"]]],[[[1," "],[8,[30,22],null,[["@label"],[[28,[37,2],["components.consul.intention.search-bar.sort.access.name"],null]]],[["default"],[[[[1,"\\n "],[8,[30,23],null,[["@value","@selected"],["Action:asc",[28,[37,15],["Action:asc",[30,19,["value"]]],null]]],[["default"],[[[[1,[28,[35,2],["components.consul.intention.search-bar.sort.access.asc"],null]]],[]]]]],[1,"\\n "],[8,[30,23],null,[["@value","@selected"],["Action:desc",[28,[37,15],["Action:desc",[30,19,["value"]]],null]]],[["default"],[[[[1,[28,[35,2],["components.consul.intention.search-bar.sort.access.desc"],null]]],[]]]]],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[30,22],null,[["@label"],[[28,[37,2],["components.consul.intention.search-bar.sort.source-name.name"],null]]],[["default"],[[[[1,"\\n "],[8,[30,23],null,[["@value","@selected"],["SourceName:asc",[28,[37,15],["SourceName:asc",[30,19,["value"]]],null]]],[["default"],[[[[1,[28,[35,2],["common.sort.alpha.asc"],null]]],[]]]]],[1,"\\n "],[8,[30,23],null,[["@value","@selected"],["SourceName:desc",[28,[37,15],["SourceName:desc",[30,19,["value"]]],null]]],[["default"],[[[[1,[28,[35,2],["common.sort.alpha.desc"],null]]],[]]]]],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[30,22],null,[["@label"],[[28,[37,2],["components.consul.intention.search-bar.sort.destination-name.name"],null]]],[["default"],[[[[1,"\\n "],[8,[30,23],null,[["@value","@selected"],["DestinationName:asc",[28,[37,15],["DestinationName:asc",[30,19,["value"]]],null]]],[["default"],[[[[1,[28,[35,2],["common.sort.alpha.asc"],null]]],[]]]]],[1,"\\n "],[8,[30,23],null,[["@value","@selected"],["DestinationName:desc",[28,[37,15],["DestinationName:desc",[30,19,["value"]]],null]]],[["default"],[[[[1,[28,[35,2],["common.sort.alpha.desc"],null]]],[]]]]],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[30,22],null,[["@label"],[[28,[37,2],["components.consul.intention.search-bar.sort.precedence.name"],null]]],[["default"],[[[[1,"\\n "],[8,[30,23],null,[["@value","@selected"],["Precedence:asc",[28,[37,15],["Precedence:asc",[30,19,["value"]]],null]]],[["default"],[[[[1,[28,[35,2],["common.sort.numeric.asc"],null]]],[]]]]],[1,"\\n "],[8,[30,23],null,[["@value","@selected"],["Precedence:desc",[28,[37,15],["Precedence:desc",[30,19,["value"]]],null]]],[["default"],[[[[1,[28,[35,2],["common.sort.numeric.desc"],null]]],[]]]]],[1,"\\n "]],[]]]]],[1,"\\n"]],[22,23]]],[1," "]],[]]]]],[1,"\\n "]],[20]]]]],[1,"\\n "]],[18]]]]]],["&attrs","@filter","search","key","value","search","@onsearch","@search","components","Optgroup","Option","prop","search","components","Optgroup","Option","item","search","@sort","components","selectable","Optgroup","Option"],false,["search-bar","let","t","concat","array","action","if","block-slot","each","-track-array","includes","lowercase","or","from-entries","get","eq"]]',moduleName:"consul-ui/components/consul/intention/search-bar/index.hbs",isStrictMode:!1}) +var i=(0,t.setComponentTemplate)(r,(0,l.default)()) +e.default=i})),define("consul-ui/components/consul/intention/view/index",["exports","@ember/component","@ember/template-factory"],(function(e,t,n){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const l=(0,n.createTemplateFactory)({id:"+zan8Nkf",block:'[[[11,0],[24,0,"consul-intention-view"],[17,1],[12],[1,"\\n\\n "],[10,0],[14,0,"definition-table"],[12],[1,"\\n "],[10,"dl"],[12],[1,"\\n "],[10,"dt"],[12],[1,"Destination"],[13],[1,"\\n "],[10,"dd"],[12],[1,"\\n "],[8,[39,0],null,[["@item","@nspace","@partition","@service"],[[28,[37,1],null,[["Namespace","Partition","Service"],[[33,2,["DestinationNS"]],[33,2,["DestinationPartition"]],[33,2,["DestinationName"]]]]],"-","-",true]],null],[1,"\\n "],[13],[1,"\\n "],[10,"dt"],[12],[1,"Source"],[13],[1,"\\n "],[10,"dd"],[12],[1,"\\n "],[8,[39,0],null,[["@item","@nspace","@partition","@service"],[[28,[37,1],null,[["Namespace","Partition","Service","PeerName"],[[33,2,["SourceNS"]],[33,2,["SourcePartition"]],[33,2,["SourceName"]],[33,2,["SourcePeer"]]]]],"-","-",true]],null],[1,"\\n "],[13],[1,"\\n"],[41,[33,2,["Action"]],[[[1," "],[10,"dt"],[12],[1,"Action"],[13],[1,"\\n "],[10,"dd"],[12],[1,"\\n "],[1,[33,2,["Action"]]],[1,"\\n "],[13],[1,"\\n"]],[]],null],[1," "],[10,"dt"],[12],[1,"Description"],[13],[1,"\\n "],[10,"dd"],[12],[1,"\\n "],[1,[28,[35,4],[[33,2,["Description"]],"N/A"],null]],[1,"\\n "],[13],[1,"\\n "],[13],[1,"\\n "],[13],[1,"\\n\\n"],[41,[28,[37,5],[[33,2,["Permissions","length"]],0],null],[[[1," "],[10,"h2"],[12],[1,"Permissions"],[13],[1,"\\n "],[8,[39,6],null,null,null],[1,"\\n "],[8,[39,7],null,[["@items"],[[33,2,["Permissions"]]]],null],[1,"\\n"]],[]],null],[1,"\\n"],[13],[1,"\\n"]],["&attrs"],false,["consul/bucket/list","hash","item","if","or","gt","consul/intention/notice/permissions","consul/intention/permission/list"]]',moduleName:"consul-ui/components/consul/intention/view/index.hbs",isStrictMode:!1}) +var r=(0,t.setComponentTemplate)(l,t.default.extend({tagName:""})) +e.default=r})),define("consul-ui/components/consul/kind/index",["exports","@ember/component","@ember/template-factory","@ember/object","ember-cli-string-helpers/helpers/titleize","ember-cli-string-helpers/helpers/humanize"],(function(e,t,n,l,r,i){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const o=(0,n.createTemplateFactory)({id:"uD6fm7hf",block:'[[[41,[33,1,["Kind"]],[[[41,[33,2],[[[1," "],[10,"dl"],[14,0,"tooltip-panel"],[12],[1,"\\n "],[10,"dt"],[12],[1,"\\n "],[10,1],[14,0,"consul-kind"],[12],[1,"\\n "],[1,[34,3]],[1,"\\n "],[13],[1,"\\n "],[13],[1,"\\n "],[10,"dd"],[12],[1,"\\n "],[8,[39,4],null,[["@position"],["left"]],[["default"],[[[[1,"\\n "],[8,[39,5],null,[["@name"],["header"]],[["default"],[[[[1,"\\n"],[41,[28,[37,6],[[33,1,["Kind"]],"ingress-gateway"],null],[[[1," Ingress gateways enable ingress traffic from services outside the Consul service mesh to services inside the Consul service mesh.\\n"]],[]],[[[41,[28,[37,6],[[33,1,["Kind"]],"terminating-gateway"],null],[[[1," Terminating gateways allow connect-enabled services in Consul service mesh to communicate with services outside the service mesh.\\n"]],[]],[[[41,[28,[37,6],[[33,1,["Kind"]],"api-gateway"],null],[[[1," API gateways enable ingress traffic from services outside the Consul service mesh to services inside the Consul service mesh.\\n"]],[]],[[[1," Mesh gateways enable routing of Connect traffic between different Consul datacenters.\\n "]],[]]]],[]]]],[]]],[1," "]],[]]]]],[1,"\\n "],[8,[39,5],null,[["@name"],["menu"]],[["default"],[[[[1,"\\n "],[10,"li"],[14,"role","separator"],[12],[1,"\\n"],[41,[28,[37,6],[[33,1,["Kind"]],"ingress-gateway"],null],[[[1," About Ingress gateways\\n"]],[]],[[[41,[28,[37,6],[[33,1,["Kind"]],"terminating-gateway"],null],[[[1," About Terminating gateways\\n"]],[]],[[[41,[28,[37,6],[[33,1,["Kind"]],"api-gateway"],null],[[[1," About API gateways\\n"]],[]],[[[1," About Mesh gateways\\n "]],[]]]],[]]]],[]]],[1," "],[13],[1,"\\n"],[44,[[28,[37,8],[[28,[37,9],[[28,[37,9],["ingress-gateway","/consul/developer-mesh/ingress-gateways"],null],[28,[37,9],["terminating-gateway","/consul/developer-mesh/understand-terminating-gateways"],null],[28,[37,9],["mesh-gateway","/consul/developer-mesh/connect-gateways"],null]],null]],null]],[[[1," "],[10,"li"],[14,"role","none"],[14,0,"learn-link"],[12],[1,"\\n "],[10,3],[14,"tabindex","-1"],[14,"role","menuitem"],[15,6,[28,[37,10],[[28,[37,11],["CONSUL_DOCS_LEARN_URL"],null],[28,[37,12],[[30,1],[33,1,["Kind"]]],null]],null]],[14,"rel","noopener noreferrer"],[14,"target","_blank"],[12],[1,"\\n Learn guides\\n "],[13],[1,"\\n "],[13],[1,"\\n"]],[1]]],[44,[[28,[37,8],[[28,[37,9],[[28,[37,9],["ingress-gateway","/connect/gateways/ingress-gateway"],null],[28,[37,9],["terminating-gateway","/connect/gateways/terminating-gateway"],null],[28,[37,9],["api-gateway","/connect/gateways/api-gateway"],null],[28,[37,9],["mesh-gateway","/connect/gateways/mesh-gateway"],null]],null]],null]],[[[1," "],[10,"li"],[14,"role","none"],[14,0,"docs-link"],[12],[1,"\\n "],[10,3],[14,"tabindex","-1"],[14,"role","menuitem"],[15,6,[28,[37,10],[[28,[37,11],["CONSUL_DOCS_URL"],null],[28,[37,12],[[30,2],[33,1,["Kind"]]],null]],null]],[14,"rel","noopener noreferrer"],[14,"target","_blank"],[12],[1,"\\n Documentation\\n "],[13],[1,"\\n "],[13],[1,"\\n "],[10,"li"],[14,"role","separator"],[12],[1,"\\n Other gateway types\\n "],[13],[1,"\\n"],[41,[28,[37,13],[[33,1,["Kind"]],"mesh-gateway"],null],[[[1," "],[10,"li"],[14,"role","none"],[14,0,"docs-link"],[12],[1,"\\n "],[10,3],[14,"tabindex","-1"],[14,"role","menuitem"],[15,6,[28,[37,10],[[28,[37,11],["CONSUL_DOCS_URL"],null],[28,[37,12],[[30,2],"mesh-gateway"],null]],null]],[14,"rel","noopener noreferrer"],[14,"target","_blank"],[12],[1,"\\n Mesh gateways\\n "],[13],[1,"\\n "],[13],[1,"\\n"]],[]],null],[41,[28,[37,13],[[33,1,["Kind"]],"terminating-gateway"],null],[[[1," "],[10,"li"],[14,"role","none"],[14,0,"docs-link"],[12],[1,"\\n "],[10,3],[14,"tabindex","-1"],[14,"role","menuitem"],[15,6,[28,[37,10],[[28,[37,11],["CONSUL_DOCS_URL"],null],[28,[37,12],[[30,2],"terminating-gateway"],null]],null]],[14,"rel","noopener noreferrer"],[14,"target","_blank"],[12],[1,"\\n Terminating gateways\\n "],[13],[1,"\\n "],[13],[1,"\\n"]],[]],null],[41,[28,[37,13],[[33,1,["Kind"]],"ingress-gateway"],null],[[[1," "],[10,"li"],[14,"role","none"],[14,0,"docs-link"],[12],[1,"\\n "],[10,3],[14,"tabindex","-1"],[14,"role","menuitem"],[15,6,[28,[37,10],[[28,[37,11],["CONSUL_DOCS_URL"],null],[28,[37,12],[[30,2],"ingress-gateway"],null]],null]],[14,"rel","noopener noreferrer"],[14,"target","_blank"],[12],[1,"\\n Ingress gateways\\n "],[13],[1,"\\n "],[13],[1,"\\n"]],[]],null],[41,[28,[37,13],[[33,1,["Kind"]],"api-gateway"],null],[[[1," "],[10,"li"],[14,"role","none"],[14,0,"docs-link"],[12],[1,"\\n "],[10,3],[14,"tabindex","-1"],[14,"role","menuitem"],[15,6,[28,[37,10],[[28,[37,11],["CONSUL_DOCS_URL"],null],[28,[37,12],[[30,2],"api-gateway"],null]],null]],[14,"rel","noopener noreferrer"],[14,"target","_blank"],[12],[1,"\\n API gateways\\n "],[13],[1,"\\n "],[13],[1,"\\n"]],[]],null]],[2]]],[1," "]],[]]]]],[1,"\\n "]],[]]]]],[1,"\\n "],[13],[1,"\\n "],[13],[1,"\\n"]],[]],[[[1," "],[10,1],[14,0,"consul-kind"],[12],[1,"\\n "],[1,[34,3]],[1,"\\n "],[13],[1,"\\n"]],[]]]],[]],null]],["link","link"],false,["if","item","withInfo","Name","menu-panel","block-slot","eq","let","from-entries","array","concat","env","get","not-eq"]]',moduleName:"consul-ui/components/consul/kind/index.hbs",isStrictMode:!1}),a={"api-gateway":"API Gateway","mesh-gateway":"Mesh Gateway","ingress-gateway":"Ingress Gateway","terminating-gateway":"Terminating Gateway"} +var u=(0,t.setComponentTemplate)(o,t.default.extend({tagName:"",Name:(0,l.computed)("item.Kind",(function(){const e=a[this.item.Kind] +return e||(0,r.titleize)((0,i.humanize)(this.item.Kind))}))})) +e.default=u})),define("consul-ui/components/consul/kv/form/index",["exports","@ember/component","@ember/template-factory","@ember/object","@ember/service"],(function(e,t,n,l,r){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const i=(0,n.createTemplateFactory)({id:"Wsyfh84D",block:'[[[8,[39,0],null,[["@dc","@nspace","@partition","@type","@label","@autofill","@item","@src","@onchange","@onsubmit"],[[99,1,["@dc"]],[99,2,["@nspace"]],[99,3,["@partition"]],"kv","key",[99,4,["@autofill"]],[99,5,["@item"]],[99,6,["@src"]],[28,[37,7],[[30,0],"change"],null],[28,[37,7],[[30,0],[33,8]],null]]],[["default"],[[[[1,"\\n "],[8,[39,9],null,[["@name"],["content"]],[["default"],[[[[1,"\\n"],[44,[[28,[37,11],["write kv"],[["item"],[[30,1,["data"]]]]]],[[[1," "],[10,"form"],[15,"onsubmit",[28,[37,7],[[30,0],[30,1,["submit"]]],null]],[12],[1,"\\n "],[11,"fieldset"],[4,[38,12],[[28,[37,13],[[30,2],[30,1,["disabled"]]],null]],null],[12],[1,"\\n"],[41,[30,1,["isCreate"]],[[[1," "],[10,"label"],[15,0,[29,["type-text",[52,[30,1,["data","error","Key"]]," has-error"]]]],[12],[1,"\\n "],[10,1],[12],[1,"Key or folder"],[13],[1,"\\n "],[10,"input"],[14,"autofocus","autofocus"],[15,2,[28,[37,15],[[30,1,["data","Key"]],[33,16]],null]],[14,3,"additional"],[15,"oninput",[28,[37,7],[[30,0],[30,1,["change"]]],null]],[14,"placeholder","Key or folder"],[14,4,"text"],[12],[13],[1,"\\n "],[10,"em"],[12],[1,"To create a folder, end a key with "],[10,"code"],[12],[1,"/"],[13],[13],[1,"\\n "],[13],[1,"\\n"]],[]],null],[41,[28,[37,13],[[28,[37,17],[[28,[37,15],[[30,1,["data","Key"]],[33,16]],null],""],null],[28,[37,18],[[28,[37,19],[[30,1,["data","Key"]]],null],"/"],null]],null],[[[1," "],[10,0],[12],[1,"\\n "],[10,0],[14,0,"type-toggle"],[12],[1,"\\n "],[10,"label"],[12],[1,"\\n "],[11,"input"],[24,3,"json"],[16,"checked",[52,[33,20],"checked"]],[16,"onchange",[28,[37,7],[[30,0],[30,1,["change"]]],null]],[24,4,"checkbox"],[4,[38,12],[false],null],[12],[13],[1,"\\n "],[10,1],[12],[1,"Code"],[13],[1,"\\n "],[13],[1,"\\n "],[13],[1,"\\n\\n "],[10,"label"],[14,"for",""],[15,0,[29,["type-text",[52,[30,1,["data","error","Value"]]," has-error"]]]],[12],[1,"\\n"],[41,[33,20],[[[1," "],[8,[39,21],null,[["@name","@readonly","@value","@onkeyup"],["value",[28,[37,13],[[30,2],[30,1,["disabled"]]],null],[28,[37,22],[[30,1,["data","Value"]]],null],[28,[37,7],[[30,0],[30,1,["change"]],"value"],null]]],[["label"],[[[[1,"Value"]],[]]]]],[1,"\\n"]],[]],[[[1," "],[10,1],[12],[1,"Value"],[13],[1,"\\n "],[11,"textarea"],[16,"autofocus",[28,[37,23],[[30,1,["isCreate"]]],null]],[24,3,"value"],[16,"oninput",[28,[37,7],[[30,0],[30,1,["change"]]],null]],[4,[38,12],[[28,[37,13],[[30,2],[30,1,["disabled"]]],null]],null],[12],[1,[28,[35,22],[[30,1,["data","Value"]]],null]],[13],[1,"\\n"]],[]]],[1," "],[13],[1,"\\n "],[13],[1,"\\n"]],[]],null],[1," "],[13],[1,"\\n "],[8,[39,24],null,null,[["default"],[[[[1,"\\n"],[41,[30,1,["isCreate"]],[[[41,[28,[37,23],[[30,2]],null],[[[1," "],[8,[39,25],[[16,"disabled",[28,[37,13],[[30,1,["data","isPristine"]],[30,1,["data","isInvalid"]],[30,1,["disabled"]]],null]],[24,4,"submit"]],[["@text"],["Save"]],null],[1,"\\n"]],[]],null],[1,"\\n "],[8,[39,25],[[16,"disabled",[30,1,["disabled"]]],[16,"onclick",[28,[37,7],[[30,0],[33,26],[30,1,["data"]]],null]],[24,4,"reset"]],[["@text","@color"],["Cancel","secondary"]],null],[1,"\\n"]],[]],[[[41,[28,[37,23],[[30,2]],null],[[[1," "],[8,[39,25],[[16,"disabled",[28,[37,13],[[30,1,["data","isInvalid"]],[30,1,["disabled"]]],null]],[24,4,"submit"]],[["@text"],["Save"]],null],[1,"\\n"]],[]],null],[1," "],[8,[39,25],[[16,"disabled",[30,1,["disabled"]]],[16,"onclick",[28,[37,7],[[30,0],[33,26],[30,1,["data"]]],null]],[24,4,"reset"]],[["@text","@color"],["Cancel","secondary"]],null],[1,"\\n"],[41,[28,[37,23],[[30,2]],null],[[[1," "],[8,[39,27],null,[["@message"],["Are you sure you want to delete this key?"]],[["default"],[[[[1,"\\n "],[8,[39,9],null,[["@name"],["action"]],[["default"],[[[[1,"\\n "],[8,[39,25],[[16,"disabled",[30,1,["disabled"]]],[4,[38,28],["click",[28,[37,7],[[30,0],[30,3],[30,1,["delete"]]],null]],null]],[["@text","@color"],["Delete","critical"]],null],[1,"\\n "]],[3]]]]],[1,"\\n "],[8,[39,9],null,[["@name"],["dialog"]],[["default"],[[[[1,"\\n "],[8,[39,29],null,[["@message","@execute","@cancel"],[[30,6],[30,4],[30,5]]],null],[1,"\\n "]],[4,5,6]]]]],[1,"\\n "]],[]]]]],[1,"\\n"]],[]],null]],[]]],[1," "]],[]]]]],[1,"\\n "],[13],[1,"\\n"]],[2]]],[1," "]],[]]]]],[1,"\\n"]],[1]]]]],[1,"\\n"]],["api","disabld","confirm","execute","cancel","message"],false,["data-form","dc","nspace","partition","autofill","item","src","action","onsubmit","block-slot","let","cannot","disabled","or","if","left-trim","parent","eq","not-eq","last","json","code-editor","atob","not","hds/button-set","hds/button","oncancel","confirmation-dialog","on","delete-confirmation"]]',moduleName:"consul-ui/components/consul/kv/form/index.hbs",isStrictMode:!1}) +var o=(0,t.setComponentTemplate)(i,t.default.extend({tagName:"",encoder:(0,r.inject)("btoa"),json:!0,ondelete:function(){this.onsubmit(...arguments)},oncancel:function(){this.onsubmit(...arguments)},onsubmit:function(){},actions:{change:function(e,t){const n=t.getData() +try{t.handleEvent(e)}catch(r){const t=e.target +let i +switch(t.name){case"value":(0,l.set)(n,"Value",this.encoder.execute(t.value)) +break +case"additional":i=(0,l.get)(this,"parent"),(0,l.set)(n,"Key",`${"/"!==i?i:""}${t.value}`) +break +case"json":(0,l.set)(this,"json",!this.json) +break +default:throw r}}}}})) +e.default=o})),define("consul-ui/components/consul/kv/list/index",["exports","@ember/component","@ember/template-factory","@ember/component/template-only"],(function(e,t,n,l){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const r=(0,n.createTemplateFactory)({id:"OYo2s3qR",block:'[[[8,[39,0],[[24,0,"consul-kv-list"],[17,1]],[["@items"],[[30,2]]],[["default"],[[[[1,"\\n "],[8,[39,1],null,[["@name"],["header"]],[["default"],[[[[1,"\\n "],[10,"th"],[12],[1,"Name"],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,1],null,[["@name"],["row"]],[["default"],[[[[1,"\\n "],[10,"td"],[15,0,[52,[30,3,["isFolder"]],"folder","file"]],[12],[1,"\\n "],[10,3],[15,6,[28,[37,3],[[52,[30,3,["isFolder"]],"dc.kv.folder","dc.kv.edit"],[30,3,["Key"]]],null]],[12],[1,[28,[35,4],[[28,[37,5],[[30,3,["Key"]],[30,5,["Key"]]],null],"/"],null]],[13],[1,"\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,1],null,[["@name"],["actions"]],[["default"],[[[[1,"\\n "],[8,[39,6],null,[["@expanded","@onchange","@keyboardAccess"],[[52,[28,[37,7],[[30,8],[30,6]],null],true,false],[28,[37,8],[[30,0],[30,7],[30,6]],null],false]],[["default"],[[[[1,"\\n "],[8,[39,1],null,[["@name"],["trigger"]],[["default"],[[[[1,"\\n More\\n "]],[]]]]],[1,"\\n "],[8,[39,1],null,[["@name"],["menu"]],[["default"],[[[[1,"\\n"],[41,[28,[37,9],["write kv"],[["item"],[[30,3]]]],[[[1," "],[10,"li"],[14,"role","none"],[12],[1,"\\n "],[10,3],[14,"role","menuitem"],[14,"tabindex","-1"],[15,6,[28,[37,3],[[52,[30,3,["isFolder"]],"dc.kv.folder","dc.kv.edit"],[30,3,["Key"]]],null]],[12],[1,[52,[30,3,["isFolder"]],"View","Edit"]],[13],[1,"\\n "],[13],[1,"\\n "],[10,"li"],[14,"role","none"],[14,0,"dangerous"],[12],[1,"\\n "],[10,"label"],[15,"for",[30,9]],[14,"role","menuitem"],[14,"tabindex","-1"],[15,"onkeypress",[30,11]],[12],[1,"Delete"],[13],[1,"\\n "],[10,0],[14,"role","menu"],[12],[1,"\\n "],[8,[39,10],[[24,0,"warning"]],null,[["header","body","actions"],[[[[1,"\\n Confirm Delete\\n "]],[]],[[[1,"\\n "],[10,2],[12],[1,"\\n Are you sure you want to delete this KV entry?\\n "],[13],[1,"\\n "]],[]],[[[1,"\\n "],[8,[30,12,["Action"]],[[24,0,"dangerous"]],null,[["default"],[[[[1,"\\n "],[8,[39,8],[[24,0,"type-delete"],[24,"tabindex","-1"],[4,[38,11],["click",[28,[37,12],[[28,[37,8],[[30,0],[30,7]],null],[28,[37,8],[[30,0],[30,13],[30,3]],null]],null]],null]],null,[["default"],[[[[1,"\\n Delete\\n "]],[]]]]],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[30,12,["Action"]],null,null,[["default"],[[[[1,"\\n "],[8,[39,8],null,[["@for"],[[30,9]]],[["default"],[[[[1,"\\n Cancel\\n "]],[]]]]],[1,"\\n "]],[]]]]],[1,"\\n "]],[12]]]]],[1,"\\n "],[13],[1,"\\n "],[13],[1,"\\n"]],[]],[[[1," "],[10,"li"],[14,"role","none"],[12],[1,"\\n "],[10,3],[14,"role","menuitem"],[14,"tabindex","-1"],[15,6,[28,[37,3],[[52,[30,3,["isFolder"]],"dc.kv.folder","dc.kv.edit"],[30,3,["Key"]]],null]],[12],[1,"View"],[13],[1,"\\n "],[13],[1,"\\n"]],[]]],[1," "]],[9,10,11]]]]],[1,"\\n "]],[]]]]],[1,"\\n "]],[6,7,8]]]]],[1,"\\n"]],[3,4]]]]]],["&attrs","@items","item","index","@parent","index","change","checked","confirm","send","keypressClick","Actions","@delete"],false,["tabular-collection","block-slot","if","href-to","right-trim","left-trim","popover-menu","eq","action","can","informed-action","on","queue"]]',moduleName:"consul-ui/components/consul/kv/list/index.hbs",isStrictMode:!1}) +var i=(0,t.setComponentTemplate)(r,(0,l.default)()) +e.default=i})),define("consul-ui/components/consul/kv/search-bar/index",["exports","@ember/component","@ember/template-factory","@ember/component/template-only"],(function(e,t,n,l){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const r=(0,n.createTemplateFactory)({id:"sF1xY1/s",block:'[[[8,[39,0],[[24,0,"consul-kv-search-bar"],[17,1]],[["@filter"],[[30,2]]],[["status","search","filter","sort"],[[[[1,"\\n\\n"],[44,[[28,[37,2],[[28,[37,3],["components.consul.kv.search-bar.",[30,3,["status","key"]]],null]],[["default"],[[28,[37,4],[[28,[37,3],["common.search.",[30,3,["status","key"]]],null],[28,[37,3],["common.consul.",[30,3,["status","key"]]],null]],null]]]],[28,[37,2],[[28,[37,3],["components.consul.kv.search-bar.",[30,3,["status","value"]]],null]],[["default"],[[28,[37,4],[[28,[37,3],["common.search.",[30,3,["status","value"]]],null],[28,[37,3],["common.consul.",[30,3,["status","value"]]],null]],null]]]]],[[[1," "],[8,[30,3,["RemoveFilter"]],[[16,"aria-label",[28,[37,2],["common.ui.remove"],[["item"],[[28,[37,3],[[30,4]," ",[30,5]],null]]]]]],null,[["default"],[[[[1,"\\n "],[10,"dl"],[12],[1,"\\n "],[10,"dt"],[12],[1,[30,4]],[13],[1,"\\n "],[10,"dd"],[12],[1,[30,5]],[13],[1,"\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n"]],[4,5]]],[1,"\\n "]],[3]],[[[1,"\\n "],[8,[30,6,["Search"]],null,[["@onsearch","@value","@placeholder"],[[28,[37,5],[[30,0],[30,7]],null],[30,8],[28,[37,2],["common.search.search"],null]]],[["default"],[[[[1,"\\n"],[41,[30,2,["searchproperty"]],[[[1," "],[8,[30,6,["Select"]],[[24,0,"type-search-properties"]],[["@position","@onchange","@multiple","@required"],["right",[28,[37,5],[[30,0],[30,2,["searchproperty","change"]]],null],true,true]],[["default"],[[[[1,"\\n "],[8,[39,7],null,[["@name"],["selected"]],[["default"],[[[[1,"\\n "],[10,1],[12],[1,"\\n "],[1,[28,[35,2],["common.search.searchproperty"],null]],[1,"\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,7],null,[["@name"],["options"]],[["default"],[[[[1,"\\n"],[44,[[30,9,["Optgroup"]],[30,9,["Option"]]],[[[42,[28,[37,9],[[28,[37,9],[[30,2,["searchproperty","default"]]],null]],null],null,[[[1," "],[8,[30,11],null,[["@value","@selected"],[[30,12],[28,[37,10],[[30,12],[30,2,["searchproperty","value"]]],null]]],[["default"],[[[[1,"\\n "],[1,[28,[35,2],[[28,[37,3],["common.consul.",[28,[37,11],[[30,12]],null]],null]],null]],[1,"\\n "]],[]]]]],[1,"\\n"]],[12]],null]],[10,11]]],[1," "]],[]]]]],[1,"\\n "]],[9]]]]],[1,"\\n"]],[]],null],[1," "]],[]]]]],[1,"\\n "]],[6]],[[[1,"\\n "],[8,[30,13,["Select"]],[[24,0,"type-kind"]],[["@position","@onchange","@multiple"],["left",[28,[37,5],[[30,0],[30,2,["kind","change"]]],null],true]],[["default"],[[[[1,"\\n "],[8,[39,7],null,[["@name"],["selected"]],[["default"],[[[[1,"\\n "],[10,1],[12],[1,"\\n "],[1,[28,[35,2],["components.consul.kv.search-bar.kind.name"],null]],[1,"\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,7],null,[["@name"],["options"]],[["default"],[[[[1,"\\n"],[44,[[30,14,["Optgroup"]],[30,14,["Option"]]],[[[42,[28,[37,9],[[28,[37,9],[[28,[37,4],["folder","key"],null]],null]],null],null,[[[1," "],[8,[30,16],[[24,0,"value-{item}}"]],[["@value","@selected"],[[30,17],[28,[37,10],[[30,17],[30,2,["kind","value"]]],null]]],[["default"],[[[[1,"\\n "],[1,[28,[35,2],[[28,[37,3],["components.consul.kv.search-bar.kind.options.",[30,17]],null]],null]],[1,"\\n "]],[]]]]],[1,"\\n"]],[17]],null]],[15,16]]],[1," "]],[]]]]],[1,"\\n "]],[14]]]]],[1,"\\n "]],[13]],[[[1,"\\n "],[8,[30,18,["Select"]],[[24,0,"type-sort"]],[["@position","@onchange","@multiple","@required"],["right",[28,[37,5],[[30,0],[30,19,["change"]]],null],false,true]],[["default"],[[[[1,"\\n "],[8,[39,7],null,[["@name"],["selected"]],[["default"],[[[[1,"\\n "],[10,1],[12],[1,"\\n"],[44,[[28,[37,12],[[28,[37,4],[[28,[37,4],["Key:asc",[28,[37,2],["common.sort.alpha.asc"],null]],null],[28,[37,4],["Key:desc",[28,[37,2],["common.sort.alpha.desc"],null]],null],[28,[37,4],["Kind:asc",[28,[37,2],["components.consul.kv.search-bar.sort.kind.asc"],null]],null],[28,[37,4],["Kind:desc",[28,[37,2],["components.consul.kv.search-bar.sort.kind.desc"],null]],null]],null]],null]],[[[1," "],[1,[28,[35,13],[[30,21],[30,19,["value"]]],null]],[1,"\\n"]],[21]]],[1," "],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,7],null,[["@name"],["options"]],[["default"],[[[[1,"\\n"],[44,[[30,20,["Optgroup"]],[30,20,["Option"]]],[[[1," "],[8,[30,22],null,[["@label"],[[28,[37,2],["common.consul.name"],null]]],[["default"],[[[[1,"\\n "],[8,[30,23],null,[["@value","@selected"],["Key:asc",[28,[37,14],["Key:asc",[30,19,["value"]]],null]]],[["default"],[[[[1,[28,[35,2],["common.sort.alpha.asc"],null]]],[]]]]],[1,"\\n "],[8,[30,23],null,[["@value","@selected"],["Key:desc",[28,[37,14],["Key:desc",[30,19,["value"]]],null]]],[["default"],[[[[1,[28,[35,2],["common.sort.alpha.desc"],null]]],[]]]]],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[30,22],null,[["@label"],[[28,[37,2],["components.consul.kv.search-bar.kind.name"],null]]],[["default"],[[[[1,"\\n "],[8,[30,23],null,[["@value","@selected"],["Kind:asc",[28,[37,14],["Kind:asc",[30,19,["value"]]],null]]],[["default"],[[[[1,[28,[35,2],["components.consul.kv.search-bar.sort.kind.asc"],null]]],[]]]]],[1,"\\n "],[8,[30,23],null,[["@value","@selected"],["Kind:desc",[28,[37,14],["Kind:desc",[30,19,["value"]]],null]]],[["default"],[[[[1,[28,[35,2],["components.consul.kv.search-bar.sort.kind.desc"],null]]],[]]]]],[1,"\\n "]],[]]]]],[1,"\\n"]],[22,23]]],[1," "]],[]]]]],[1,"\\n "]],[20]]]]],[1,"\\n "]],[18]]]]],[1,"\\n"]],["&attrs","@filter","search","key","value","search","@onsearch","@search","components","Optgroup","Option","prop","search","components","Optgroup","Option","item","search","@sort","components","selectable","Optgroup","Option"],false,["search-bar","let","t","concat","array","action","if","block-slot","each","-track-array","includes","lowercase","from-entries","get","eq"]]',moduleName:"consul-ui/components/consul/kv/search-bar/index.hbs",isStrictMode:!1}) +var i=(0,t.setComponentTemplate)(r,(0,l.default)()) +e.default=i})),define("consul-ui/components/consul/loader/index",["exports","@ember/component","@ember/template-factory","@ember/component/template-only"],(function(e,t,n,l){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const r=(0,n.createTemplateFactory)({id:"FSVimMul",block:'[[[11,0],[24,0,"consul-loader"],[17,1],[12],[1,"\\n "],[10,"svg"],[14,"xmlns","http://www.w3.org/2000/svg","http://www.w3.org/2000/xmlns/"],[14,"xmlns:xlink","http://www.w3.org/1999/xlink","http://www.w3.org/2000/xmlns/"],[14,"width","44px"],[14,"height","44px"],[14,"viewBox","0 0 44 44"],[14,"version","1.1"],[12],[1,"\\n "],[10,"g"],[12],[1,"\\n "],[10,"circle"],[14,"r","1"],[14,"cx","27"],[14,"cy","2"],[14,5,"transform-origin: 27px 2px"],[12],[13],[1,"\\n "],[10,"circle"],[14,"r","1"],[14,"cx","17"],[14,"cy","2"],[14,5,"transform-origin: 17px 2px"],[12],[13],[1,"\\n "],[10,"circle"],[14,"r","1"],[14,"cx","27"],[14,"cy","42"],[14,5,"transform-origin: 27px 42px"],[12],[13],[1,"\\n "],[10,"circle"],[14,"r","1"],[14,"cx","17"],[14,"cy","42"],[14,5,"transform-origin: 17px 42px"],[12],[13],[1,"\\n "],[10,"circle"],[14,"r","1"],[14,"cx","2"],[14,"cy","17"],[14,5,"transform-origin: 2px 17px"],[12],[13],[1,"\\n "],[10,"circle"],[14,"r","1"],[14,"cx","2"],[14,"cy","27"],[14,5,"transform-origin: 2px 27px"],[12],[13],[1,"\\n "],[10,"circle"],[14,"r","1"],[14,"cx","42"],[14,"cy","17"],[14,5,"transform-origin: 42px 17px"],[12],[13],[1,"\\n "],[10,"circle"],[14,"r","1"],[14,"cx","42"],[14,"cy","27"],[14,5,"transform-origin: 42px 27px"],[12],[13],[1,"\\n "],[10,"circle"],[14,"r","1"],[14,"cx","33"],[14,"cy","4"],[14,5,"transform-origin: 33px 4px"],[12],[13],[1,"\\n "],[10,"circle"],[14,"r","1"],[14,"cx","11"],[14,"cy","4"],[14,5,"transform-origin: 11px 4px"],[12],[13],[1,"\\n "],[10,"circle"],[14,"r","1"],[14,"cx","33"],[14,"cy","40"],[14,5,"transform-origin: 33px 40px"],[12],[13],[1,"\\n "],[10,"circle"],[14,"r","1"],[14,"cx","11"],[14,"cy","40"],[14,5,"transform-origin: 11px 40px"],[12],[13],[1,"\\n "],[10,"circle"],[14,"r","1"],[14,"cx","40"],[14,"cy","11"],[14,5,"transform-origin: 40px 11px"],[12],[13],[1,"\\n "],[10,"circle"],[14,"r","1"],[14,"cx","4"],[14,"cy","33"],[14,5,"transform-origin: 4px 33px"],[12],[13],[1,"\\n "],[10,"circle"],[14,"r","1"],[14,"cx","40"],[14,"cy","33"],[14,5,"transform-origin: 40px 33px"],[12],[13],[1,"\\n "],[10,"circle"],[14,"r","1"],[14,"cx","4"],[14,"cy","11"],[14,5,"transform-origin: 4px 11px"],[12],[13],[1,"\\n "],[13],[1,"\\n "],[10,"g"],[12],[1,"\\n "],[10,"circle"],[14,"r","2"],[14,"cx","22"],[14,"cy","4"],[14,5,"transform-origin: 22px 4px"],[12],[13],[1,"\\n "],[10,"circle"],[14,"r","2"],[14,"cx","22"],[14,"cy","40"],[14,5,"transform-origin: 22px 40px"],[12],[13],[1,"\\n "],[10,"circle"],[14,"r","2"],[14,"cx","4"],[14,"cy","22"],[14,5,"transform-origin: 4px 22px"],[12],[13],[1,"\\n "],[10,"circle"],[14,"r","2"],[14,"cx","40"],[14,"cy","22"],[14,5,"transform-origin: 40px 22px"],[12],[13],[1,"\\n "],[10,"circle"],[14,"r","2"],[14,"cx","9"],[14,"cy","9"],[14,5,"transform-origin: 9px 9px"],[12],[13],[1,"\\n "],[10,"circle"],[14,"r","2"],[14,"cx","35"],[14,"cy","35"],[14,5,"transform-origin: 35px 35px"],[12],[13],[1,"\\n "],[10,"circle"],[14,"r","2"],[14,"cx","35"],[14,"cy","9"],[14,5,"transform-origin: 35px 9px"],[12],[13],[1,"\\n "],[10,"circle"],[14,"r","2"],[14,"cx","9"],[14,"cy","35"],[14,5,"transform-origin: 9px 35px"],[12],[13],[1,"\\n "],[13],[1,"\\n "],[10,"g"],[12],[1,"\\n "],[10,"circle"],[14,"r","2"],[14,"cx","28"],[14,"cy","8"],[14,5,"transform-origin: 28px 8px"],[12],[13],[1,"\\n "],[10,"circle"],[14,"r","2"],[14,"cx","16"],[14,"cy","8"],[14,5,"transform-origin: 16px 8px"],[12],[13],[1,"\\n "],[10,"circle"],[14,"r","2"],[14,"cx","28"],[14,"cy","36"],[14,5,"transform-origin: 28px 36px"],[12],[13],[1,"\\n "],[10,"circle"],[14,"r","2"],[14,"cx","16"],[14,"cy","36"],[14,5,"transform-origin: 16px 36px"],[12],[13],[1,"\\n "],[10,"circle"],[14,"r","2"],[14,"cx","8"],[14,"cy","28"],[14,5,"transform-origin: 8px 28px"],[12],[13],[1,"\\n "],[10,"circle"],[14,"r","2"],[14,"cx","8"],[14,"cy","16"],[14,5,"transform-origin: 8px 16px"],[12],[13],[1,"\\n "],[10,"circle"],[14,"r","2"],[14,"cx","36"],[14,"cy","28"],[14,5,"transform-origin: 36px 28px"],[12],[13],[1,"\\n "],[10,"circle"],[14,"r","2"],[14,"cx","36"],[14,"cy","16"],[14,5,"transform-origin: 36px 16px"],[12],[13],[1,"\\n "],[13],[1,"\\n "],[10,"g"],[12],[1,"\\n "],[10,"circle"],[14,"r","5"],[14,"cx","22"],[14,"cy","12"],[14,5,"transform-origin: 22px 12px"],[12],[13],[1,"\\n "],[10,"circle"],[14,"r","5"],[14,"cx","22"],[14,"cy","32"],[14,5,"transform-origin: 22px 32px"],[12],[13],[1,"\\n "],[10,"circle"],[14,"r","5"],[14,"cx","12"],[14,"cy","22"],[14,5,"transform-origin: 12px 22px"],[12],[13],[1,"\\n "],[10,"circle"],[14,"r","5"],[14,"cx","32"],[14,"cy","22"],[14,5,"transform-origin: 32px 22px"],[12],[13],[1,"\\n "],[10,"circle"],[14,"r","5"],[14,"cx","15"],[14,"cy","15"],[14,5,"transform-origin: 15px 15px"],[12],[13],[1,"\\n "],[10,"circle"],[14,"r","5"],[14,"cx","29"],[14,"cy","29"],[14,5,"transform-origin: 29px 29px"],[12],[13],[1,"\\n "],[10,"circle"],[14,"r","5"],[14,"cx","29"],[14,"cy","15"],[14,5,"transform-origin: 29px 15px"],[12],[13],[1,"\\n "],[10,"circle"],[14,"r","5"],[14,"cx","15"],[14,"cy","29"],[14,5,"transform-origin: 15px 29px"],[12],[13],[1,"\\n "],[13],[1,"\\n "],[10,"g"],[12],[1,"\\n "],[10,"circle"],[14,"r","9"],[14,"cx","22"],[14,"cy","22"],[14,5,"transform-origin: 22px 22px"],[12],[13],[1,"\\n "],[13],[1,"\\n "],[13],[1,"\\n"],[13],[1,"\\n"]],["&attrs"],false,[]]',moduleName:"consul-ui/components/consul/loader/index.hbs",isStrictMode:!1}) +var i=(0,t.setComponentTemplate)(r,(0,l.default)()) +e.default=i})),define("consul-ui/components/consul/lock-session/form/index",["exports","@ember/component","@ember/template-factory","@ember/component/template-only"],(function(e,t,n,l){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const r=(0,n.createTemplateFactory)({id:"Hv2qW8N0",block:'[[[11,0],[24,0,"consul-lock-session-form"],[17,1],[12],[1,"\\n "],[8,[39,0],null,[["@sink","@type","@label","@ondelete","@onchange"],[[28,[37,1],["/${partition}/${nspace}/${dc}/session",[28,[37,2],null,[["partition","nspace","dc"],[[30,2,["Partition"]],[30,2,["Namespace"]],[30,2,["Datacenter"]]]]]],null],"session","Lock Session",[28,[37,3],[[52,[30,3],[30,3],[30,4]],[30,2]],null],[28,[37,3],[[28,[37,5],[[30,4]],null],[30,2]],null]]],[["default"],[[[[1,"\\n "],[8,[39,6],null,[["@name"],["removed"]],[["default"],[[[[1,"\\n "],[8,[39,7],[[4,[38,8],null,[["after"],[[28,[37,9],[[30,0],[30,6]],null]]]]],[["@type"],["remove"]],null],[1,"\\n "]],[6]]]]],[1,"\\n "],[8,[39,6],null,[["@name"],["error"]],[["default"],[[[[1,"\\n "],[8,[39,7],[[4,[38,8],null,[["after"],[[28,[37,9],[[30,0],[30,7]],null]]]]],[["@type","@error"],["remove",[30,8]]],null],[1,"\\n "]],[7,8]]]]],[1,"\\n "],[8,[39,6],null,[["@name"],["content"]],[["default"],[[[[1,"\\n "],[10,0],[14,0,"definition-table"],[12],[1,"\\n "],[10,"dl"],[12],[1,"\\n"],[41,[30,2,["Name"]],[[[1," "],[10,"dt"],[12],[1,"Name"],[13],[1,"\\n "],[10,"dd"],[12],[1,[30,2,["Name"]]],[13],[1,"\\n"]],[]],null],[1," "],[10,"dt"],[12],[1,"ID"],[13],[1,"\\n "],[10,"dd"],[12],[1,[30,2,["ID"]]],[13],[1,"\\n "],[10,"dt"],[12],[1,"Node"],[13],[1,"\\n "],[10,"dd"],[12],[1,"\\n "],[8,[39,10],null,[["@text","@icon","@href","@isHrefExternal","@size","@color"],[[30,2,["Node"]],"git-commit",[28,[37,11],["dc.nodes.show",[30,2,["Node"]]],null],false,"small","tertiary"]],null],[1,"\\n "],[13],[1,"\\n "],[10,"dt"],[12],[1,"Delay"],[13],[1,"\\n "],[10,"dd"],[12],[1,[28,[35,12],[[30,2,["LockDelay"]]],null]],[13],[1,"\\n "],[10,"dt"],[12],[1,"TTL"],[13],[1,"\\n "],[10,"dd"],[12],[1,[28,[35,13],[[30,2,["TTL"]],"-"],null]],[13],[1,"\\n "],[10,"dt"],[12],[1,"Behavior"],[13],[1,"\\n "],[10,"dd"],[12],[1,[30,2,["Behavior"]]],[13],[1,"\\n"],[44,[[30,2,["checks"]]],[[[1," "],[10,"dt"],[12],[1,"Health Checks"],[13],[1,"\\n "],[10,"dd"],[12],[1,"\\n"],[41,[28,[37,15],[[30,9,["length"]],0],null],[[[1," "],[1,[28,[35,16],[", ",[30,9]],null]],[1,"\\n"]],[]],[[[1," -\\n"]],[]]],[1," "],[13],[1,"\\n"]],[9]]],[1," "],[13],[1,"\\n "],[13],[1,"\\n"],[41,[28,[37,17],["delete session"],[["item"],[[30,2]]]],[[[1," "],[8,[39,18],null,[["@message"],["Are you sure you want to invalidate this Lock Session?"]],[["default"],[[[[1,"\\n "],[8,[39,6],null,[["@name"],["action"]],[["default"],[[[[1,"\\n "],[8,[39,10],[[4,[38,19],["click",[28,[37,3],[[30,10],[28,[37,3],[[30,5,["delete"]],[30,2]],null]],null]],null]],[["@text","@color"],["Invalidate Session","critical"]],null],[1,"\\n "]],[10]]]]],[1,"\\n "],[8,[39,6],null,[["@name"],["dialog"]],[["default"],[[[[1,"\\n "],[10,2],[12],[1,"\\n "],[1,[30,13]],[1,"\\n "],[13],[1,"\\n "],[8,[39,20],null,null,[["default"],[[[[1,"\\n "],[8,[39,10],[[4,[38,19],["click",[28,[37,3],[[30,11]],null]],null]],[["@text","@color"],["Confirm Invalidation","critical"]],null],[1,"\\n "],[8,[39,10],[[4,[38,19],["click",[28,[37,3],[[30,12]],null]],null]],[["@text","@color"],["Cancel","secondary"]],null],[1,"\\n "]],[]]]]],[1,"\\n "]],[11,12,13]]]]],[1,"\\n "]],[]]]]],[1,"\\n"]],[]],null],[1," "]],[]]]]],[1,"\\n "]],[5]]]]],[1,"\\n"],[13]],["&attrs","@item","@ondelete","@onsubmit","writer","after","after","error","checks","confirm","execute","cancel","message"],false,["data-writer","uri","hash","fn","if","optional","block-slot","consul/lock-session/notifications","notification","action","hds/button","href-to","duration-from","or","let","gt","join","can","confirmation-dialog","on","hds/button-set"]]',moduleName:"consul-ui/components/consul/lock-session/form/index.hbs",isStrictMode:!1}) +var i=(0,t.setComponentTemplate)(r,(0,l.default)()) +e.default=i})),define("consul-ui/components/consul/lock-session/list/index",["exports","@ember/component","@ember/template-factory","@ember/component/template-only"],(function(e,t,n,l){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const r=(0,n.createTemplateFactory)({id:"f75K08ts",block:'[[[8,[39,0],[[24,0,"consul-lock-session-list"],[17,1]],[["@items"],[[30,2]]],[["default"],[[[[1,"\\n "],[8,[39,1],null,[["@name"],["header"]],[["default"],[[[[1,"\\n"],[41,[30,3,["Name"]],[[[1," "],[10,1],[12],[1,[30,3,["Name"]]],[13],[1,"\\n"]],[]],[[[1," "],[10,1],[12],[1,"\\n "],[1,[30,3,["ID"]]],[1,"\\n "],[8,[39,3],null,[["@value","@name"],[[30,3,["ID"]],"ID"]],null],[1,"\\n "],[13],[1,"\\n"]],[]]],[1," "]],[]]]]],[1,"\\n "],[8,[39,1],null,[["@name"],["details"]],[["default"],[[[[1,"\\n"],[41,[30,3,["Name"]],[[[1," "],[10,"dl"],[12],[1,"\\n "],[10,"dt"],[12],[1,"\\n ID\\n "],[13],[1,"\\n "],[10,"dd"],[12],[1,"\\n "],[8,[39,3],null,[["@value","@name"],[[30,3,["ID"]],"ID"]],null],[1,"\\n "],[1,[30,3,["ID"]]],[1,"\\n "],[13],[1,"\\n "],[13],[1,"\\n"]],[]],null],[1," "],[10,"dl"],[14,0,"lock-delay"],[12],[1,"\\n "],[11,"dt"],[4,[38,4],null,null],[12],[1,"\\n Delay\\n "],[13],[1,"\\n "],[10,"dd"],[12],[1,[28,[35,5],[[30,3,["LockDelay"]]],null]],[13],[1,"\\n "],[13],[1,"\\n "],[10,"dl"],[14,0,"ttl"],[12],[1,"\\n "],[11,"dt"],[4,[38,4],null,null],[12],[1,"\\n TTL\\n "],[13],[1,"\\n"],[41,[28,[37,6],[[30,3,["TTL"]],""],null],[[[1," "],[10,"dd"],[12],[1,"-"],[13],[1,"\\n"]],[]],[[[1," "],[10,"dd"],[12],[1,[30,3,["TTL"]]],[13],[1,"\\n"]],[]]],[1," "],[13],[1,"\\n "],[10,"dl"],[14,0,"behavior"],[12],[1,"\\n "],[11,"dt"],[4,[38,4],null,null],[12],[1,"\\n Behavior\\n "],[13],[1,"\\n "],[10,"dd"],[12],[1,[30,3,["Behavior"]]],[13],[1,"\\n "],[13],[1,"\\n"],[44,[[28,[37,8],[[30,3,["NodeChecks"]],[30,3,["ServiceChecks"]]],null]],[[[1," "],[10,"dl"],[14,0,"checks"],[12],[1,"\\n "],[11,"dt"],[4,[38,4],null,null],[12],[1,"\\n Checks\\n "],[13],[1,"\\n "],[10,"dd"],[12],[1,"\\n"],[41,[28,[37,9],[[30,5,["length"]],0],null],[[[42,[28,[37,11],[[28,[37,11],[[30,5]],null]],null],null,[[[1," "],[10,1],[12],[1,[30,6]],[13],[1,"\\n"]],[6]],null]],[]],[[[1," -\\n"]],[]]],[1," "],[13],[1,"\\n "],[13],[1,"\\n"]],[5]]],[1," "]],[]]]]],[1,"\\n "],[8,[39,1],null,[["@name"],["actions"]],[["default"],[[[[1,"\\n "],[8,[39,12],null,[["@message"],["Are you sure you want to invalidate this session?"]],[["default"],[[[[1,"\\n "],[8,[39,1],null,[["@name"],["action"]],[["default"],[[[[1,"\\n "],[8,[39,13],[[4,[38,14],["click",[28,[37,15],[[30,7],[28,[37,15],[[30,8],[30,3]],null]],null]],null]],[["@text","@color"],["Invalidate","critical"]],null],[1,"\\n "]],[7]]]]],[1,"\\n "],[8,[39,1],null,[["@name"],["dialog"]],[["default"],[[[[1,"\\n "],[10,2],[12],[1,"\\n "],[1,[30,11]],[1,"\\n "],[13],[1,"\\n "],[8,[39,16],null,null,[["default"],[[[[1,"\\n "],[8,[39,13],[[4,[38,14],["click",[28,[37,15],[[30,9]],null]],null]],[["@text","@color"],["Confirm Invalidate","critical"]],null],[1,"\\n "],[8,[39,13],[[4,[38,14],["click",[28,[37,15],[[30,10]],null]],null]],[["@text","@color"],["Cancel","secondary"]],null],[1,"\\n "]],[]]]]],[1,"\\n "]],[9,10,11]]]]],[1,"\\n "]],[]]]]],[1,"\\n "]],[]]]]],[1,"\\n"]],[3,4]]]]]],["&attrs","@items","item","index","checks","item","confirm","@ondelete","execute","cancel","message"],false,["list-collection","block-slot","if","copy-button","tooltip","duration-from","eq","let","union","gt","each","-track-array","confirmation-dialog","hds/button","on","fn","hds/button-set"]]',moduleName:"consul-ui/components/consul/lock-session/list/index.hbs",isStrictMode:!1}) +var i=(0,t.setComponentTemplate)(r,(0,l.default)()) +e.default=i})),define("consul-ui/components/consul/lock-session/notifications/index",["exports","@ember/component","@ember/template-factory","@ember/component/template-only"],(function(e,t,n,l){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const r=(0,n.createTemplateFactory)({id:"8UZIF1qV",block:'[[[41,[28,[37,1],[[30,1],"remove"],null],[[[41,[30,2],[[[1," "],[8,[39,2],[[17,3]],[["@color"],["critical"]],[["default"],[[[[1,"\\n "],[8,[30,4,["Title"]],null,null,[["default"],[[[[1,"Error!"]],[]]]]],[1,"\\n "],[8,[30,4,["Description"]],null,null,[["default"],[[[[1,"\\n There was an error invalidating the Lock Session.\\n"],[41,[28,[37,3],[[30,2,["status"]],[30,2,["detail"]]],null],[[[1," "],[10,"br"],[12],[13],[1,[30,2,["status"]]],[1,": "],[1,[30,2,["detail"]]],[1,"\\n"]],[]],null],[1," "]],[]]]]],[1,"\\n "]],[4]]]]],[1,"\\n"]],[]],[[[1," "],[8,[39,2],[[17,3]],[["@color"],["success"]],[["default"],[[[[1,"\\n "],[8,[30,5,["Title"]],null,null,[["default"],[[[[1,"Success!"]],[]]]]],[1,"\\n "],[8,[30,5,["Description"]],null,null,[["default"],[[[[1,"\\n Your Lock Session has been invalidated.\\n "]],[]]]]],[1,"\\n "]],[5]]]]],[1,"\\n"]],[]]]],[]],[[[41,[28,[37,1],[[30,1],"kv"],null],[[[1," "],[8,[39,4],[[24,0,"mb-3"]],[["@type","@color"],["inline","warning"]],[["default"],[[[[1,"\\n "],[8,[30,6,["Title"]],null,null,[["default"],[[[[1,"Warning"]],[]]]]],[1,"\\n "],[8,[30,6,["Description"]],null,null,[["default"],[[[[1,"This KV has a lock session. You can edit KV\'s with lock sessions, but we recommend doing so with care, or not doing so at all. It may negatively impact the active node it\'s associated with. See below for more details on the Lock Session."]],[]]]]],[1,"\\n "],[8,[30,6,["Link::Standalone"]],null,[["@text","@href","@icon","@iconPosition"],["Learn more",[29,[[28,[37,5],["CONSUL_DOCS_URL"],null],"/internals/sessions.html"]],"docs-link","trailing"]],null],[1,"\\n "]],[6]]]]],[1,"\\n"]],[]],null]],[]]]],["@type","@error","&attrs","T","T","A"],false,["if","eq","hds/toast","and","hds/alert","env"]]',moduleName:"consul-ui/components/consul/lock-session/notifications/index.hbs",isStrictMode:!1}) +var i=(0,t.setComponentTemplate)(r,(0,l.default)()) +e.default=i})),define("consul-ui/components/consul/metadata/list/index",["exports","@ember/component","@ember/template-factory"],(function(e,t,n){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const l=(0,n.createTemplateFactory)({id:"qvPSBKvv",block:'[[[8,[39,0],[[24,0,"consul-metadata-list"]],[["@items"],[[99,1,["@items"]]]],[["default"],[[[[1,"\\n "],[8,[39,2],null,[["@name"],["header"]],[["default"],[[[[1,"\\n "],[10,"th"],[12],[1,"Key"],[13],[1,"\\n "],[10,"th"],[12],[1,"Value"],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,2],null,[["@name"],["row"]],[["default"],[[[[1,"\\n "],[10,"td"],[12],[1,"\\n "],[10,1],[12],[1,"\\n "],[1,[28,[35,3],[0,[30,1]],null]],[1,"\\n "],[13],[1,"\\n "],[13],[1,"\\n "],[10,"td"],[12],[1,"\\n "],[10,1],[12],[1,[28,[35,3],[1,[30,1]],null]],[13],[1,"\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n"]],[1,2]]]]],[1,"\\n"]],["item","index"],false,["tabular-collection","items","block-slot","object-at"]]',moduleName:"consul-ui/components/consul/metadata/list/index.hbs",isStrictMode:!1}) +var r=(0,t.setComponentTemplate)(l,t.default.extend({tagName:""})) +e.default=r})),define("consul-ui/components/consul/node-identity/template/index",["exports","@ember/component","@ember/template-factory","@ember/component/template-only"],(function(e,t,n,l){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const r=(0,n.createTemplateFactory)({id:"YflZV/pQ",block:'[[[41,[28,[37,1],["use partitions"],null],[[[1,"partition \\""],[1,[28,[35,2],[[30,1],"default"],null]],[1,"\\" {\\n"],[41,[28,[37,1],["use nspaces"],null],[[[1," namespace \\"default\\" {\\n node \\""],[1,[30,2]],[1,"\\" {\\n\\t policy = \\"write\\"\\n }\\n }\\n namespace_prefix \\"\\" {\\n service_prefix \\"\\" {\\n\\t policy = \\"read\\"\\n }\\n }\\n"]],[]],[[[1," node \\""],[1,[30,2]],[1,"\\" {\\n\\t policy = \\"write\\"\\n }\\n service_prefix \\"\\" {\\n\\t policy = \\"read\\"\\n }\\n"]],[]]],[1,"}"]],[]],[[[41,[28,[37,1],["use nspaces"],null],[[[1,"namespace \\"default\\" {\\n node \\""],[1,[30,2]],[1,"\\" {\\n\\t policy = \\"write\\"\\n }\\n}\\nnamespace_prefix \\"\\" {\\n service_prefix \\"\\" {\\n\\t policy = \\"read\\"\\n }\\n}\\n"]],[]],[[[1,"node \\""],[1,[30,2]],[1,"\\" {\\n\\tpolicy = \\"write\\"\\n}\\nservice_prefix \\"\\" {\\n\\tpolicy = \\"read\\"\\n}"]],[]]]],[]]]],["@partition","@name"],false,["if","can","or"]]',moduleName:"consul-ui/components/consul/node-identity/template/index.hbs",isStrictMode:!1}) +var i=(0,t.setComponentTemplate)(r,(0,l.default)()) +e.default=i})),define("consul-ui/components/consul/node/agentless-notice/index",["exports","@ember/component","@ember/template-factory","@glimmer/component","@ember/object","consul-ui/services/local-storage"],(function(e,t,n,l,r,i){var o,a,u +function s(e,t,n,l,r){var i={} +return Object.keys(l).forEach((function(e){i[e]=l[e]})),i.enumerable=!!i.enumerable,i.configurable=!!i.configurable,("value"in i||i.initializer)&&(i.writable=!0),i=n.slice().reverse().reduce((function(n,l){return l(e,t,n)||n}),i),r&&void 0!==i.initializer&&(i.value=i.initializer?i.initializer.call(r):void 0,i.initializer=void 0),void 0===i.initializer&&(Object.defineProperty(e,t,i),i=null),i}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const c=(0,n.createTemplateFactory)({id:"639y+0v2",block:'[[[41,[33,1],[[[1," "],[8,[39,2],[[24,0,"mb-3 mt-2 agentless-node-notice"]],[["@type"],["inline"]],[["default"],[[[[1,"\\n "],[8,[30,1,["Title"]],null,null,[["default"],[[[[1,"\\n "],[10,1],[12],[1,[28,[35,3],["routes.dc.nodes.index.agentless.notice.header"],null]],[13],[1,"\\n "],[8,[39,4],[[4,[38,5],["click",[30,0,["dismissAgentlessNotice"]]],null]],[["@color","@text","@icon","@size","@isIconOnly"],["secondary","Dismiss notice","x","small",true]],null],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[30,1,["Description"]],null,null,[["default"],[[[[1,[28,[35,3],["routes.dc.nodes.index.agentless.notice.body"],null]]],[]]]]],[1,"\\n "],[8,[30,1,["Link::Standalone"]],null,[["@href","@text","@icon","@iconPosition"],[[29,[[28,[37,6],["CONSUL_DOCS_DEVELOPER_URL"],null],"/connect/dataplane"]],[28,[37,3],["routes.dc.nodes.index.agentless.notice.footer"],null],"docs-link","trailing"]],null],[1,"\\n "]],[1]]]]],[1,"\\n"]],[]],null]],["A"],false,["if","isVisible","hds/alert","t","hds/button","on","env"]]',moduleName:"consul-ui/components/consul/node/agentless-notice/index.hbs",isStrictMode:!1}) +let d=(o=(0,i.storageFor)("notices"),a=class extends l.default{constructor(){var e,t,n,l,r,i,o +super(...arguments),n="nodes-agentless-dismissed",(t="storageKey")in(e=this)?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,l=this,r="notices",o=this,(i=u)&&Object.defineProperty(l,r,{enumerable:i.enumerable,configurable:i.configurable,writable:i.writable,value:i.initializer?i.initializer.call(o):void 0}),this.args.postfix&&(this.storageKey=`nodes-agentless-dismissed-${this.args.postfix}`)}get isVisible(){const{items:e,filteredItems:t}=this.args +return!this.notices.state.includes(this.storageKey)&&e.length>t.length}dismissAgentlessNotice(){this.notices.add(this.storageKey)}},u=s(a.prototype,"notices",[o],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),s(a.prototype,"dismissAgentlessNotice",[r.action],Object.getOwnPropertyDescriptor(a.prototype,"dismissAgentlessNotice"),a.prototype),a) +e.default=d,(0,t.setComponentTemplate)(c,d)})),define("consul-ui/components/consul/node/list/index",["exports","@ember/component","@ember/template-factory","@ember/component/template-only"],(function(e,t,n,l){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const r=(0,n.createTemplateFactory)({id:"UZddA6ka",block:'[[[8,[39,0],[[24,0,"consul-node-list"]],[["@items"],[[30,1]]],[["default"],[[[[1,"\\n "],[8,[39,1],null,[["@name"],["header"]],[["default"],[[[[1,"\\n "],[10,"dl"],[15,0,[30,2,["Status"]]],[12],[1,"\\n "],[10,"dt"],[12],[1,"\\n Health\\n "],[13],[1,"\\n "],[10,"dd"],[12],[1,"\\n "],[8,[39,2],null,[["@position"],["top-start"]],[["default"],[[[[1,"\\n"],[41,[28,[37,4],["critical",[30,2,["Status"]]],null],[[[1," At least one health check on this node is failing.\\n"]],[]],[[[41,[28,[37,4],["warning",[30,2,["Status"]]],null],[[[1," At least one health check on this node has a warning.\\n"]],[]],[[[41,[28,[37,4],["passing",[30,2,["Status"]]],null],[[[1," All health checks are passing.\\n"]],[]],[[[1," There are no health checks.\\n "]],[]]]],[]]]],[]]],[1," "]],[]]]]],[1,"\\n "],[13],[1,"\\n "],[13],[1,"\\n "],[10,3],[15,6,[28,[37,5],["dc.nodes.show",[30,2,["Node"]]],[["params"],[[28,[37,6],null,[["peer"],[[30,2,["PeerName"]]]]]]]]],[12],[1,"\\n "],[1,[30,2,["Node"]]],[1,"\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,1],null,[["@name"],["details"]],[["default"],[[[[1,"\\n "],[8,[39,7],null,[["@item"],[[30,2]]],null],[1,"\\n"],[41,[28,[37,4],[[30,2,["Address"]],[30,4,["Address"]]],null],[[[1," "],[10,1],[14,0,"leader"],[12],[1,"Leader"],[13],[1,"\\n"]],[]],null],[1," "],[10,1],[12],[1,"\\n "],[1,[28,[35,8],[[30,2,["MeshServiceInstances","length"]]],null]],[1," "],[1,[28,[35,9],[[30,2,["MeshServiceInstances","length"]],"Service"],[["without-count"],[true]]]],[1,"\\n "],[13],[1,"\\n "],[10,"dl"],[12],[1,"\\n "],[10,"dt"],[12],[1,"\\n "],[10,1],[12],[1,"Address"],[13],[1,"\\n "],[13],[1,"\\n "],[10,"dd"],[12],[1,"\\n "],[8,[39,10],null,[["@value","@name"],[[30,2,["Address"]],"Address"]],null],[1,"\\n "],[1,[30,2,["Address"]]],[1,"\\n "],[13],[1,"\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n"]],[2,3]]]]],[1,"\\n"]],["@items","item","index","@leader"],false,["list-collection","block-slot","tooltip","if","eq","href-to","hash","consul/node/peer-info","format-number","pluralize","copy-button"]]',moduleName:"consul-ui/components/consul/node/list/index.hbs",isStrictMode:!1}) +var i=(0,t.setComponentTemplate)(r,(0,l.default)()) +e.default=i})),define("consul-ui/components/consul/node/peer-info/index",["exports","@ember/component","@ember/template-factory","@ember/component/template-only"],(function(e,t,n,l){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const r=(0,n.createTemplateFactory)({id:"7f6XDyqE",block:'[[[41,[30,1,["PeerName"]],[[[1," "],[10,1],[14,0,"consul-node-peer-info"],[12],[1,"\\n "],[11,"svg"],[24,"width","16"],[24,"height","16"],[24,"viewBox","0 0 16 16"],[24,"fill","none"],[24,"xmlns","http://www.w3.org/2000/svg","http://www.w3.org/2000/xmlns/"],[4,[38,1],["Peer"],null],[12],[1,"\\n "],[10,"path"],[14,"d","M16 8C16 7.80109 15.921 7.61032 15.7803 7.46967L12.2803 3.96967C11.9874 3.67678 11.5126 3.67678 11.2197 3.96967C10.9268 4.26256 10.9268 4.73744 11.2197 5.03033L14.1893 8L11.2197 10.9697C10.9268 11.2626 10.9268 11.7374 11.2197 12.0303C11.5126 12.3232 11.9874 12.3232 12.2803 12.0303L15.7803 8.53033C15.921 8.38968 16 8.19891 16 8Z"],[14,"fill","#77838A"],[12],[13],[1,"\\n "],[10,"path"],[14,"d","M0.21967 8.53033C-0.0732233 8.23744 -0.0732233 7.76256 0.21967 7.46967L3.71967 3.96967C4.01256 3.67678 4.48744 3.67678 4.78033 3.96967C5.07322 4.26256 5.07322 4.73744 4.78033 5.03033L1.81066 8L4.78033 10.9697C5.07322 11.2626 5.07322 11.7374 4.78033 12.0303C4.48744 12.3232 4.01256 12.3232 3.71967 12.0303L0.21967 8.53033Z"],[14,"fill","#77838A"],[12],[13],[1,"\\n "],[10,"path"],[14,"d","M5 7C4.44772 7 4 7.44772 4 8C4 8.55229 4.44772 9 5 9H5.01C5.56228 9 6.01 8.55229 6.01 8C6.01 7.44772 5.56228 7 5.01 7H5Z"],[14,"fill","#77838A"],[12],[13],[1,"\\n "],[10,"path"],[14,"d","M7 8C7 7.44772 7.44772 7 8 7H8.01C8.56228 7 9.01 7.44772 9.01 8C9.01 8.55229 8.56228 9 8.01 9H8C7.44772 9 7 8.55229 7 8Z"],[14,"fill","#77838A"],[12],[13],[1,"\\n "],[10,"path"],[14,"d","M11 7C10.4477 7 10 7.44772 10 8C10 8.55229 10.4477 9 11 9H11.01C11.5623 9 12.01 8.55229 12.01 8C12.01 7.44772 11.5623 7 11.01 7H11Z"],[14,"fill","#77838A"],[12],[13],[1,"\\n "],[13],[1,"\\n "],[10,1],[14,0,"consul-node-peer-info__name"],[12],[1,[30,1,["PeerName"]]],[13],[1,"\\n "],[13],[1,"\\n"]],[]],null]],["@item"],false,["if","tooltip"]]',moduleName:"consul-ui/components/consul/node/peer-info/index.hbs",isStrictMode:!1}) +var i=(0,t.setComponentTemplate)(r,(0,l.default)()) +e.default=i})),define("consul-ui/components/consul/node/search-bar/index",["exports","@ember/component","@ember/template-factory","@ember/component/template-only"],(function(e,t,n,l){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const r=(0,n.createTemplateFactory)({id:"u8IgeZRe",block:'[[[8,[39,0],[[24,0,"consul-node-search-bar"],[17,1]],[["@filter"],[[30,2]]],[["status","search","filter","sort"],[[[[1,"\\n\\n"],[44,[[28,[37,2],[[28,[37,3],["components.consul.node.search-bar.",[30,3,["status","key"]]],null]],[["default"],[[28,[37,4],[[28,[37,3],["common.search.",[30,3,["status","key"]]],null],[28,[37,3],["common.consul.",[30,3,["status","key"]]],null]],null]]]],[28,[37,2],[[28,[37,3],["components.consul.node.search-bar.",[30,3,["status","value"]]],null]],[["default"],[[28,[37,4],[[28,[37,3],["common.search.",[30,3,["status","value"]]],null],[28,[37,3],["common.consul.",[30,3,["status","value"]]],null],[28,[37,3],["common.brand.",[30,3,["status","value"]]],null]],null]]]]],[[[1," "],[8,[30,3,["RemoveFilter"]],[[16,"aria-label",[28,[37,2],["common.ui.remove"],[["item"],[[28,[37,3],[[30,4]," ",[30,5]],null]]]]]],null,[["default"],[[[[1,"\\n "],[10,"dl"],[12],[1,"\\n "],[10,"dt"],[12],[1,[30,4]],[13],[1,"\\n "],[10,"dd"],[12],[1,[30,5]],[13],[1,"\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n"]],[4,5]]],[1,"\\n "]],[3]],[[[1,"\\n "],[8,[30,6,["Search"]],null,[["@onsearch","@value","@placeholder"],[[28,[37,5],[[30,0],[30,7]],null],[30,8],[28,[37,2],["common.search.search"],null]]],[["default"],[[[[1,"\\n "],[8,[30,6,["Select"]],[[24,0,"type-search-properties"]],[["@position","@onchange","@multiple","@required"],["right",[28,[37,5],[[30,0],[30,2,["searchproperty","change"]]],null],true,true]],[["default"],[[[[1,"\\n "],[8,[39,6],null,[["@name"],["selected"]],[["default"],[[[[1,"\\n "],[10,1],[12],[1,"\\n "],[1,[28,[35,2],["common.search.searchproperty"],null]],[1,"\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,6],null,[["@name"],["options"]],[["default"],[[[[1,"\\n"],[44,[[30,9,["Optgroup"]],[30,9,["Option"]]],[[[42,[28,[37,8],[[28,[37,8],[[30,2,["searchproperty","default"]]],null]],null],null,[[[1," "],[8,[30,11],null,[["@value","@selected"],[[30,12],[28,[37,9],[[30,12],[30,2,["searchproperty","value"]]],null]]],[["default"],[[[[1,"\\n "],[1,[28,[35,2],[[28,[37,3],["common.consul.",[28,[37,10],[[30,12]],null]],null]],null]],[1,"\\n "]],[]]]]],[1,"\\n"]],[12]],null]],[10,11]]],[1," "]],[]]]]],[1,"\\n "]],[9]]]]],[1,"\\n "]],[]]]]],[1,"\\n "]],[6]],[[[1,"\\n "],[8,[30,13,["Select"]],[[24,0,"type-status"]],[["@position","@onchange","@multiple"],["left",[28,[37,5],[[30,0],[30,2,["status","change"]]],null],true]],[["default"],[[[[1,"\\n "],[8,[39,6],null,[["@name"],["selected"]],[["default"],[[[[1,"\\n "],[10,1],[12],[1,"\\n "],[1,[28,[35,2],["common.consul.status"],null]],[1,"\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,6],null,[["@name"],["options"]],[["default"],[[[[1,"\\n"],[44,[[30,14,["Optgroup"]],[30,14,["Option"]]],[[[42,[28,[37,8],[[28,[37,8],[[28,[37,4],["passing","warning","critical"],null]],null]],null],null,[[[1," "],[8,[30,16],[[16,0,[29,["value-",[30,17]]]]],[["@value","@selected"],[[30,17],[28,[37,9],[[30,17],[30,2,["status","value"]]],null]]],[["default"],[[[[1,"\\n "],[1,[28,[35,2],[[28,[37,3],["common.consul.",[30,17]],null]],[["default"],[[28,[37,4],[[28,[37,3],["common.search.",[30,17]],null]],null]]]]],[1,"\\n "]],[]]]]],[1,"\\n"]],[17]],null]],[15,16]]],[1," "]],[]]]]],[1,"\\n "]],[14]]]]],[1,"\\n "]],[13]],[[[1,"\\n "],[8,[30,18,["Select"]],[[24,0,"type-sort"]],[["@position","@onchange","@multiple","@required"],["right",[28,[37,5],[[30,0],[30,19,["change"]]],null],false,true]],[["default"],[[[[1,"\\n "],[8,[39,6],null,[["@name"],["selected"]],[["default"],[[[[1,"\\n "],[10,1],[12],[1,"\\n"],[44,[[28,[37,11],[[28,[37,4],[[28,[37,4],["Node:asc",[28,[37,2],["common.sort.alpha.asc"],null]],null],[28,[37,4],["Node:desc",[28,[37,2],["common.sort.alpha.desc"],null]],null],[28,[37,4],["Status:asc",[28,[37,2],["common.sort.status.asc"],null]],null],[28,[37,4],["Status:desc",[28,[37,2],["common.sort.status.desc"],null]],null]],null]],null]],[[[1," "],[1,[28,[35,12],[[30,21],[30,19,["value"]]],null]],[1,"\\n"]],[21]]],[1," "],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,6],null,[["@name"],["options"]],[["default"],[[[[1,"\\n"],[44,[[30,20,["Optgroup"]],[30,20,["Option"]]],[[[1," "],[8,[30,22],null,[["@label"],[[28,[37,2],["common.consul.status"],null]]],[["default"],[[[[1,"\\n "],[8,[30,23],null,[["@value","@selected"],["Status:asc",[28,[37,13],["Status:asc",[30,19,["value"]]],null]]],[["default"],[[[[1,[28,[35,2],["common.sort.status.asc"],null]]],[]]]]],[1,"\\n "],[8,[30,23],null,[["@value","@selected"],["Status:desc",[28,[37,13],["Status:desc",[30,19,["value"]]],null]]],[["default"],[[[[1,[28,[35,2],["common.sort.status.desc"],null]]],[]]]]],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[30,22],null,[["@label"],[[28,[37,2],["common.consul.node-name"],null]]],[["default"],[[[[1,"\\n "],[8,[30,23],null,[["@value","@selected"],["Node:asc",[28,[37,13],["Node:asc",[30,19,["value"]]],null]]],[["default"],[[[[1,[28,[35,2],["common.sort.alpha.asc"],null]]],[]]]]],[1,"\\n "],[8,[30,23],null,[["@value","@selected"],["Node:desc",[28,[37,13],["Node:desc",[30,19,["value"]]],null]]],[["default"],[[[[1,[28,[35,2],["common.sort.alpha.desc"],null]]],[]]]]],[1,"\\n "]],[]]]]],[1,"\\n"]],[22,23]]],[1," "]],[]]]]],[1,"\\n "]],[20]]]]],[1,"\\n "]],[18]]]]]],["&attrs","@filter","search","key","value","search","@onsearch","@search","components","Optgroup","Option","prop","search","components","Optgroup","Option","state","search","@sort","components","selectable","Optgroup","Option"],false,["search-bar","let","t","concat","array","action","block-slot","each","-track-array","includes","lowercase","from-entries","get","eq"]]',moduleName:"consul-ui/components/consul/node/search-bar/index.hbs",isStrictMode:!1}) +var i=(0,t.setComponentTemplate)(r,(0,l.default)()) +e.default=i})) +define("consul-ui/components/consul/nspace/form/index",["exports","@ember/component","@ember/template-factory","@glimmer/component","@ember/object"],(function(e,t,n,l,r){var i +function o(e,t,n,l,r){var i={} +return Object.keys(l).forEach((function(e){i[e]=l[e]})),i.enumerable=!!i.enumerable,i.configurable=!!i.configurable,("value"in i||i.initializer)&&(i.writable=!0),i=n.slice().reverse().reduce((function(n,l){return l(e,t,n)||n}),i),r&&void 0!==i.initializer&&(i.value=i.initializer?i.initializer.call(r):void 0,i.initializer=void 0),void 0===i.initializer&&(Object.defineProperty(e,t,i),i=null),i}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const a=(0,n.createTemplateFactory)({id:"rgTjBVSE",block:'[[[11,0],[24,0,"consul-nspace-form"],[17,1],[12],[1,"\\n "],[8,[39,0],null,[["@sink","@type","@label","@ondelete","@onchange"],[[28,[37,1],["/${partition}/${nspace}/${dc}/nspace",[28,[37,2],null,[["partition","nspace","dc"],["","",[30,2,["Datacenter"]]]]]],null],"nspace","Namespace",[28,[37,3],[[30,0,["onDelete"]],[30,2]],null],[28,[37,3],[[30,0,["onSubmit"]],[30,2]],null]]],[["default"],[[[[1,"\\n "],[8,[39,4],null,[["@name"],["removed"]],[["default"],[[[[1,"\\n "],[8,[39,5],[[4,[38,6],null,[["after"],[[28,[37,7],[[30,0],[30,4]],null]]]]],[["@type"],["remove"]],null],[1,"\\n "]],[4]]]]],[1,"\\n\\n "],[8,[39,4],null,[["@name"],["content"]],[["default"],[[[[1,"\\n\\n"],[44,[[28,[37,9],[[28,[37,10],["write nspaces"],null]],null],[30,2],[28,[37,2],null,[["help","Name"],["Must be a valid DNS hostname. Must contain 1-64 characters (numbers, letters, and hyphens), and must begin with a letter. Once created, this cannot be changed.",[28,[37,11],[[28,[37,2],null,[["test","error"],["^[a-zA-Z0-9]([a-zA-Z0-9-]{0,62}[a-zA-Z0-9])?$","Name must be a valid DNS hostname."]]]],null]]]],[28,[37,2],null,[["Description"],[[28,[37,11],null,null]]]]],[[[1," "],[11,"form"],[4,[38,12],["submit",[28,[37,3],[[30,3,["persist"]],[30,6]],null]],null],[4,[38,13],[[30,5]],null],[12],[1,"\\n\\n "],[8,[39,14],null,[["@src"],[[28,[37,14],["validate"],null]]],[["default"],[[[[1,"\\n\\n "],[10,"fieldset"],[12],[1,"\\n"],[41,[28,[37,16],["new nspace"],[["item"],[[30,6]]]],[[[1," "],[8,[39,17],null,[["@name","@placeholder","@item","@validations","@chart"],["Name","Name",[30,6],[30,7],[28,[37,2],null,[["state","dispatch"],[[30,13],[30,12]]]]]],null],[1,"\\n"]],[]],null],[1," "],[8,[39,17],null,[["@expanded","@name","@label","@item","@validations","@chart"],[true,"Description","Description (Optional)",[30,6],[30,8],[28,[37,2],null,[["state","dispatch"],[[30,13],[30,12]]]]]],null],[1,"\\n "],[13],[1,"\\n"],[41,[28,[37,10],["use acls"],null],[[[1," "],[10,"fieldset"],[14,1,"roles"],[12],[1,"\\n "],[10,"h2"],[12],[1,"Roles"],[13],[1,"\\n "],[10,2],[12],[1,"\\n"],[41,[28,[37,10],["write nspace"],[["item"],[[30,6]]]],[[[1," By adding roles to this namespaces, you will apply them to\\n all tokens created within this namespace.\\n"]],[]],[[[1," The following roles are applied to all tokens created within\\n this namespace.\\n"]],[]]],[1," "],[13],[1,"\\n "],[8,[39,18],null,[["@dc","@nspace","@partition","@disabled","@items"],[[30,14],"default",[30,15],[30,5],[30,6,["ACLs","RoleDefaults"]]]],null],[1,"\\n "],[13],[1,"\\n "],[10,"fieldset"],[14,1,"policies"],[12],[1,"\\n "],[10,"h2"],[12],[1,"Policies"],[13],[1,"\\n "],[10,2],[12],[1,"\\n"],[41,[28,[37,9],[[30,5]],null],[[[1," By adding policies to this namespace, you will apply them to\\n all tokens created within this namespace.\\n"]],[]],[[[1," The following policies are applied to all tokens created\\n within this namespace.\\n"]],[]]],[1," "],[13],[1,"\\n "],[8,[39,19],null,[["@dc","@nspace","@partition","@disabled","@allowIdentity","@items"],[[30,14],"default",[30,15],[30,5],false,[30,6,["ACLs","PolicyDefaults"]]]],null],[1,"\\n "],[13],[1,"\\n"]],[]],null],[1," "],[10,0],[12],[1,"\\n "],[8,[39,20],null,null,[["default"],[[[[1,"\\n"],[41,[28,[37,21],[[28,[37,16],["new nspace"],[["item"],[[30,6]]]],[28,[37,10],["create nspaces"],null]],null],[[[1," "],[8,[39,22],[[16,"disabled",[28,[37,23],[[28,[37,16],["pristine nspace"],[["item"],[[30,6]]]],[28,[37,24],[[30,13],"error"],null]],null]],[24,4,"submit"]],[["@text"],["Save"]],null],[1,"\\n"]],[]],[[[41,[28,[37,10],["write nspace"],[["item"],[[30,6]]]],[[[1," "],[8,[39,22],[[24,4,"submit"]],[["@text"],["Save"]],null],[1,"\\n "]],[]],null]],[]]],[1,"\\n "],[8,[39,22],[[24,4,"reset"],[4,[38,12],["click",[28,[37,3],[[30,0,["onCancel"]],[30,6]],null]],null]],[["@color","@text"],["secondary","Cancel"]],null],[1,"\\n\\n"],[41,[28,[37,21],[[28,[37,9],[[28,[37,16],["new nspace"],[["item"],[[30,6]]]]],null],[28,[37,10],["delete nspace"],[["item"],[[30,6]]]]],null],[[[1," "],[8,[39,25],null,[["@message"],["Are you sure you want to delete this Namespace?"]],[["default"],[[[[1,"\\n "],[8,[39,4],null,[["@name"],["action"]],[["default"],[[[[1,"\\n "],[8,[39,22],[[4,[38,12],["click",[28,[37,3],[[30,16],[28,[37,3],[[30,3,["delete"]],[30,6]],null]],null]],null]],[["@color","@text"],["critical","Delete"]],null],[1,"\\n "]],[16]]]]],[1,"\\n "],[8,[39,4],null,[["@name"],["dialog"]],[["default"],[[[[1,"\\n "],[8,[39,26],null,[["@message","@execute","@cancel"],[[30,19],[30,17],[30,18]]],null],[1,"\\n "]],[17,18,19]]]]],[1,"\\n "]],[]]]]],[1,"\\n"]],[]],null],[1," "]],[]]]]],[1,"\\n "],[13],[1,"\\n "]],[9,10,11,12,13]]]]],[1,"\\n "],[13],[1,"\\n"]],[5,6,7,8]]],[1," "]],[]]]]],[1,"\\n "]],[3]]]]],[1,"\\n"],[13]],["&attrs","@item","writer","after","readOnly","item","Name","Description","State","Guard","ChartAction","dispatch","state","@dc","@partition","confirm","execute","cancel","message"],false,["data-writer","uri","hash","fn","block-slot","consul/nspace/notifications","notification","action","let","not","can","array","on","disabled","state-chart","if","is","text-input","role-selector","policy-selector","hds/button-set","and","hds/button","or","state-matches","confirmation-dialog","delete-confirmation"]]',moduleName:"consul-ui/components/consul/nspace/form/index.hbs",isStrictMode:!1}) +let u=(o((i=class extends l.default{onSubmit(e){const t=this.args.onsubmit +if(t)return t(e)}onDelete(e){const{onsubmit:t,ondelete:n}=this.args +return n?n(e):t?t(e):void 0}onCancel(e){const{oncancel:t,onsubmit:n}=this.args +return t?t(e):n?n(e):void 0}}).prototype,"onSubmit",[r.action],Object.getOwnPropertyDescriptor(i.prototype,"onSubmit"),i.prototype),o(i.prototype,"onDelete",[r.action],Object.getOwnPropertyDescriptor(i.prototype,"onDelete"),i.prototype),o(i.prototype,"onCancel",[r.action],Object.getOwnPropertyDescriptor(i.prototype,"onCancel"),i.prototype),i) +e.default=u,(0,t.setComponentTemplate)(a,u)})),define("consul-ui/components/consul/nspace/list/index",["exports","@ember/component","@ember/template-factory","@ember/component/template-only"],(function(e,t,n,l){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const r=(0,n.createTemplateFactory)({id:"HHDNRExj",block:'[[[8,[39,0],[[24,0,"consul-nspace-list"],[17,1]],[["@items","@linkable"],[[30,2],"linkable nspace"]],[["default"],[[[[1,"\\n "],[8,[39,1],null,[["@name"],["header"]],[["default"],[[[[1,"\\n"],[41,[30,3,["DeletedAt"]],[[[1," "],[10,2],[12],[1,"\\n Deleting "],[1,[30,3,["Name"]]],[1,"...\\n "],[13],[1,"\\n"]],[]],[[[1," "],[10,3],[15,6,[28,[37,3],["dc.nspaces.edit",[30,3,["Name"]]],null]],[12],[1,[30,3,["Name"]]],[13],[1,"\\n"]],[]]],[1," "]],[]]]]],[1,"\\n "],[8,[39,1],null,[["@name"],["details"]],[["default"],[[[[1,"\\n"],[41,[30,3,["Description"]],[[[1," "],[10,"dl"],[12],[1,"\\n "],[10,"dt"],[12],[1,"Description"],[13],[1,"\\n "],[10,"dd"],[12],[1,"\\n "],[1,[30,3,["Description"]]],[1,"\\n "],[13],[1,"\\n "],[13],[1,"\\n"]],[]],null],[41,[28,[37,4],["CONSUL_ACLS_ENABLED"],null],[[[1," "],[8,[39,5],null,[["@item"],[[30,3]]],null],[1,"\\n"]],[]],null],[1," "]],[]]]]],[1,"\\n "],[8,[39,1],null,[["@name"],["actions"]],[["default"],[[[[1,"\\n"],[41,[28,[37,6],[[30,3,["DeletedAt"]]],null],[[[1," "],[8,[30,4],null,null,[["default"],[[[[1,"\\n "],[8,[30,5],null,[["@href"],[[28,[37,3],["dc.nspaces.edit",[30,3,["Name"]]],null]]],[["default"],[[[[1,"\\n "],[8,[39,1],null,[["@name"],["label"]],[["default"],[[[[1,"\\n"],[41,[28,[37,7],["write nspace"],[["item"],[[30,3]]]],[[[1," Edit\\n"]],[]],[[[1," View\\n"]],[]]],[1," "]],[]]]]],[1,"\\n "]],[]]]]],[1,"\\n"],[41,[28,[37,7],["delete nspace"],[["item"],[[30,3]]]],[[[1," "],[8,[30,5],[[24,0,"dangerous"]],[["@onclick"],[[28,[37,8],[[30,0],[30,6],[30,3]],null]]],[["default"],[[[[1,"\\n "],[8,[39,1],null,[["@name"],["label"]],[["default"],[[[[1,"\\n Delete\\n "]],[]]]]],[1,"\\n "],[8,[39,1],null,[["@name"],["confirmation"]],[["default"],[[[[1,"\\n "],[8,[30,7],[[24,0,"warning"]],null,[["default"],[[[[1,"\\n "],[8,[39,1],null,[["@name"],["header"]],[["default"],[[[[1,"\\n Confirm delete\\n "]],[]]]]],[1,"\\n "],[8,[39,1],null,[["@name"],["body"]],[["default"],[[[[1,"\\n "],[10,2],[12],[1,"\\n Are you sure you want to delete this namespace?\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,1],null,[["@name"],["confirm"]],[["default"],[[[[1,"\\n "],[8,[30,8],null,null,[["default"],[[[[1,"Delete"]],[]]]]],[1,"\\n "]],[8]]]]],[1,"\\n "]],[]]]]],[1,"\\n "]],[7]]]]],[1,"\\n "]],[]]]]],[1,"\\n"]],[]],null],[1," "]],[5]]]]],[1,"\\n"]],[]],null],[1," "]],[4]]]]],[1,"\\n"]],[3]]]]]],["&attrs","@items","item","Actions","Action","@ondelete","Confirmation","Confirm"],false,["list-collection","block-slot","if","href-to","env","consul/token/ruleset/list","not","can","action"]]',moduleName:"consul-ui/components/consul/nspace/list/index.hbs",isStrictMode:!1}) +var i=(0,t.setComponentTemplate)(r,(0,l.default)()) +e.default=i})),define("consul-ui/components/consul/nspace/notifications/index",["exports","@ember/component","@ember/template-factory","@ember/component/template-only"],(function(e,t,n,l){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const r=(0,n.createTemplateFactory)({id:"re+qR2Bv",block:'[[[41,[28,[37,1],[[30,1],"remove"],null],[[[1," "],[8,[39,2],[[17,2]],[["@color"],["success"]],[["default"],[[[[1,"\\n "],[8,[30,3,["Title"]],null,null,[["default"],[[[[1,"Success!"]],[]]]]],[1,"\\n "],[8,[30,3,["Description"]],null,null,[["default"],[[[[1,"Your Namespace has been marked for deletion."]],[]]]]],[1,"\\n "]],[3]]]]],[1,"\\n"]],[]],null]],["@type","&attrs","T"],false,["if","eq","hds/toast"]]',moduleName:"consul-ui/components/consul/nspace/notifications/index.hbs",isStrictMode:!1}) +var i=(0,t.setComponentTemplate)(r,(0,l.default)()) +e.default=i})),define("consul-ui/components/consul/nspace/search-bar/index",["exports","@ember/component","@ember/template-factory","@ember/component/template-only"],(function(e,t,n,l){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const r=(0,n.createTemplateFactory)({id:"+U4p2s4N",block:'[[[8,[39,0],[[24,0,"consul-nspace-search-bar"],[17,1]],[["@filter"],[[30,2]]],[["status","search","sort"],[[[[1,"\\n\\n"],[44,[[28,[37,2],[[28,[37,3],["components.consul.nspace.search-bar.",[30,3,["status","key"]]],null]],[["default"],[[28,[37,4],[[28,[37,3],["common.search.",[30,3,["status","key"]]],null],[28,[37,3],["common.consul.",[30,3,["status","key"]]],null]],null]]]],[28,[37,2],[[28,[37,3],["components.consul.nspace.search-bar.",[30,3,["status","value"]]],null]],[["default"],[[28,[37,4],[[28,[37,3],["common.search.",[30,3,["status","value"]]],null],[28,[37,3],["common.consul.",[30,3,["status","value"]]],null],[28,[37,3],["common.brand.",[30,3,["status","value"]]],null]],null]]]]],[[[1," "],[8,[30,3,["RemoveFilter"]],[[16,"aria-label",[28,[37,2],["common.ui.remove"],[["item"],[[28,[37,3],[[30,4]," ",[30,5]],null]]]]]],null,[["default"],[[[[1,"\\n "],[10,"dl"],[12],[1,"\\n "],[10,"dt"],[12],[1,[30,4]],[13],[1,"\\n "],[10,"dd"],[12],[1,[30,5]],[13],[1,"\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n"]],[4,5]]],[1,"\\n "]],[3]],[[[1,"\\n "],[8,[30,6,["Search"]],null,[["@onsearch","@value","@placeholder"],[[28,[37,5],[[30,0],[30,7]],null],[30,8],[28,[37,2],["common.search.search"],null]]],[["default"],[[[[1,"\\n "],[8,[30,6,["Select"]],[[24,0,"type-search-properties"]],[["@position","@onchange","@multiple","@required"],["right",[28,[37,5],[[30,0],[30,2,["searchproperty","change"]]],null],true,true]],[["default"],[[[[1,"\\n "],[8,[39,6],null,[["@name"],["selected"]],[["default"],[[[[1,"\\n "],[10,1],[12],[1,"\\n "],[1,[28,[35,2],["common.search.searchproperty"],null]],[1,"\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,6],null,[["@name"],["options"]],[["default"],[[[[1,"\\n"],[44,[[30,9,["Optgroup"]],[30,9,["Option"]]],[[[42,[28,[37,8],[[28,[37,8],[[30,2,["searchproperty","default"]]],null]],null],null,[[[1," "],[8,[30,11],null,[["@value","@selected"],[[30,12],[28,[37,9],[[30,12],[30,2,["searchproperty","value"]]],null]]],[["default"],[[[[1,"\\n "],[1,[28,[35,2],[[28,[37,3],["common.consul.",[28,[37,10],[[30,12]],null]],null]],null]],[1,"\\n "]],[]]]]],[1,"\\n"]],[12]],null]],[10,11]]],[1," "]],[]]]]],[1,"\\n "]],[9]]]]],[1,"\\n "]],[]]]]],[1,"\\n "]],[6]],[[[1,"\\n "],[8,[30,13,["Select"]],[[24,0,"type-sort"]],[["@position","@onchange","@multiple","@required"],["right",[28,[37,5],[[30,0],[30,14,["change"]]],null],false,true]],[["default"],[[[[1,"\\n "],[8,[39,6],null,[["@name"],["selected"]],[["default"],[[[[1,"\\n "],[10,1],[12],[1,"\\n"],[44,[[28,[37,11],[[28,[37,4],[[28,[37,4],["Name:asc",[28,[37,2],["common.sort.alpha.asc"],null]],null],[28,[37,4],["Name:desc",[28,[37,2],["common.sort.alpha.desc"],null]],null]],null]],null]],[[[1," "],[1,[28,[35,12],[[30,16],[30,14,["value"]]],null]],[1,"\\n"]],[16]]],[1," "],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,6],null,[["@name"],["options"]],[["default"],[[[[1,"\\n"],[44,[[30,15,["Optgroup"]],[30,15,["Option"]]],[[[1," "],[8,[30,17],null,[["@label"],[[28,[37,2],["common.consul.name"],null]]],[["default"],[[[[1,"\\n "],[8,[30,18],null,[["@value","@selected"],["Name:asc",[28,[37,13],["Name:asc",[30,14,["value"]]],null]]],[["default"],[[[[1,[28,[35,2],["common.sort.alpha.asc"],null]]],[]]]]],[1,"\\n "],[8,[30,18],null,[["@value","@selected"],["Name:desc",[28,[37,13],["Name:desc",[30,14,["value"]]],null]]],[["default"],[[[[1,[28,[35,2],["common.sort.alpha.desc"],null]]],[]]]]],[1,"\\n "]],[]]]]],[1,"\\n"]],[17,18]]],[1," "]],[]]]]],[1,"\\n "]],[15]]]]],[1,"\\n "]],[13]]]]]],["&attrs","@filter","search","key","value","search","@onsearch","@search","components","Optgroup","Option","prop","search","@sort","components","selectable","Optgroup","Option"],false,["search-bar","let","t","concat","array","action","block-slot","each","-track-array","includes","lowercase","from-entries","get","eq"]]',moduleName:"consul-ui/components/consul/nspace/search-bar/index.hbs",isStrictMode:!1}) +var i=(0,t.setComponentTemplate)(r,(0,l.default)()) +e.default=i})),define("consul-ui/components/consul/nspace/selector/index",["exports","@ember/component","@ember/template-factory","@ember/component/template-only"],(function(e,t,n,l){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const r=(0,n.createTemplateFactory)({id:"Sn707Mkm",block:'[[[41,[28,[37,1],["use nspaces"],null],[[[41,[28,[37,1],["choose nspaces"],null],[[[44,[[28,[37,3],[[30,1],"default"],null],[28,[37,4],["dc.nspaces",[30,2,["Name"]]],null]],[[[1," "],[10,"li"],[14,0,"nspaces"],[12],[1,"\\n "],[8,[39,5],[[24,"aria-label","Namespace"]],[["@items"],[[28,[37,6],[[28,[37,7],null,[["Name","href"],["Manage Namespaces",[28,[37,8],["dc.nspaces",[30,2,["Name"]]],null]]]],[28,[37,9],["DeletedAt",[30,5]],null]],null]]],[["default"],[[[[1,"\\n "],[8,[30,6,["Action"]],[[4,[38,10],["click",[30,6,["toggle"]]],null]],null,[["default"],[[[[1,"\\n "],[1,[52,[30,4],"Manage Namespaces",[30,3]]],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[30,6,["Menu"]],null,null,[["default"],[[[[1,"\\n"],[41,[28,[37,11],[[30,5,["length"]],0],null],[[[1," "],[8,[39,12],null,[["@src","@onchange"],[[28,[37,13],["/${partition}/*/${dc}/namespaces",[28,[37,7],null,[["partition","dc"],[[30,8],[30,2,["Name"]]]]]],null],[28,[37,14],[[28,[37,15],[[30,9]],null]],null]]],null],[1,"\\n"]],[]],[[[1," "],[8,[39,12],null,[["@src","@onchange"],[[28,[37,13],["/${partition}/*/${dc}/namespaces",[28,[37,7],null,[["partition","dc"],[[30,8],[30,2,["Name"]]]]]],null],[28,[37,14],[[28,[37,15],[[30,9]],null]],null]]],null],[1,"\\n"]],[]]],[1," "],[8,[30,7,["Menu"]],null,null,[["default"],[[[[1,"\\n"],[42,[28,[37,17],[[28,[37,17],[[30,10,["items"]]],null]],null],null,[[[1,"\\n "],[8,[30,10,["Item"]],[[16,"aria-current",[52,[28,[37,3],[[28,[37,18],[[30,4],[30,11,["href"]]],null],[28,[37,18],[[28,[37,19],[[30,4]],null],[28,[37,20],[[30,3],[30,11,["Name"]]],null]],null]],null],"true"]]],null,[["default"],[[[[1,"\\n "],[8,[30,10,["Action"]],[[4,[38,10],["click",[30,6,["close"]]],null]],[["@href"],[[52,[30,11,["href"]],[30,11,["href"]],[52,[30,4],[28,[37,8],["dc.services.index"],[["params"],[[28,[37,7],null,[["partition","nspace","dc"],[[52,[28,[37,11],[[30,8,["length"]],0],null],[30,8],[27]],[30,11,["Name"]],[30,2,["Name"]]]]]]]],[28,[37,8],["."],[["params"],[[28,[37,7],null,[["partition","nspace"],[[52,[28,[37,11],[[30,8,["length"]],0],null],[30,8],[27]],[30,11,["Name"]]]]]]]]]]]],[["default"],[[[[1,"\\n "],[1,[30,11,["Name"]]],[1,"\\n "]],[]]]]],[1,"\\n "]],[]]]]],[1,"\\n"]],[11]],null],[1," "]],[10]]]]],[1,"\\n "]],[7]]]]],[1,"\\n "]],[6]]]]],[1,"\\n "],[13],[1,"\\n"]],[3,4]]]],[]],null]],[]],null]],["@nspace","@dc","nspace","isManaging","@nspaces","disclosure","panel","@partition","@onchange","menu","item"],false,["if","can","let","or","is-href","disclosure-menu","append","hash","href-to","reject-by","on","gt","data-source","uri","fn","optional","each","-track-array","and","not","eq"]]',moduleName:"consul-ui/components/consul/nspace/selector/index.hbs",isStrictMode:!1}) +var i=(0,t.setComponentTemplate)(r,(0,l.default)()) +e.default=i})),define("consul-ui/components/consul/partition/form/index",["exports","@ember/component","@ember/template-factory","@ember/component/template-only"],(function(e,t,n,l){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const r=(0,n.createTemplateFactory)({id:"+TwrfeYU",block:'[[[11,0],[24,0,"consul-partition-form"],[17,1],[12],[1,"\\n "],[8,[39,0],null,[["@sink","@type","@label","@ondelete","@onchange"],[[28,[37,1],["/${partition}/${nspace}/${dc}/partition",[28,[37,2],null,[["partition","nspace","dc"],["","",[30,2,["Datacenter"]]]]]],null],"partition","Partition",[28,[37,3],[[52,[30,3],[30,3],[30,4]],[30,2]],null],[28,[37,3],[[28,[37,5],[[30,4]],null],[30,2]],null]]],[["default"],[[[[1,"\\n "],[8,[39,6],null,[["@name"],["removed"]],[["default"],[[[[1,"\\n "],[8,[39,7],[[4,[38,8],null,[["after"],[[28,[37,9],[[30,0],[30,6]],null]]]]],[["@type"],["remove"]],null],[1,"\\n "]],[6]]]]],[1,"\\n\\n "],[8,[39,6],null,[["@name"],["content"]],[["default"],[[[[1,"\\n\\n"],[44,[[28,[37,11],[[28,[37,12],["write partition"],null]],null],[30,2],[28,[37,2],null,[["help","Name"],["Must be a valid DNS hostname. Must contain 1-64 characters (numbers, letters, and hyphens), and must begin with a letter. Once created, this cannot be changed.",[28,[37,13],[[28,[37,2],null,[["test","error"],["^[a-zA-Z0-9]([a-zA-Z0-9-]{0,62}[a-zA-Z0-9])?$","Name must be a valid DNS hostname."]]]],null]]]],[28,[37,2],null,[["Description"],[[28,[37,13],null,null]]]]],[[[11,"form"],[4,[38,14],["submit",[28,[37,3],[[30,5,["persist"]],[30,8]],null]],null],[4,[38,15],[[30,7]],null],[12],[1,"\\n\\n"],[8,[39,16],null,[["@src"],[[28,[37,16],["validate"],null]]],[["default"],[[[[1,"\\n\\n "],[10,"fieldset"],[12],[1,"\\n"],[41,[28,[37,17],["new partition"],[["item"],[[30,8]]]],[[[1," "],[8,[39,18],null,[["@name","@placeholder","@item","@validations","@chart"],["Name","Name",[30,8],[30,9],[28,[37,2],null,[["state","dispatch"],[[30,15],[30,14]]]]]],null],[1,"\\n"]],[]],null],[1," "],[8,[39,18],null,[["@expanded","@name","@label","@item","@validations","@chart"],[true,"Description","Description (Optional)",[30,8],[30,10],[28,[37,2],null,[["state","dispatch"],[[30,15],[30,14]]]]]],null],[1,"\\n "],[13],[1,"\\n\\n "],[10,0],[12],[1,"\\n "],[8,[39,19],null,null,[["default"],[[[[1,"\\n\\n\\n"],[41,[28,[37,20],[[28,[37,17],["new partition"],[["item"],[[30,8]]]],[28,[37,12],["create partitions"],null]],null],[[[1," "],[8,[39,21],[[16,"disabled",[28,[37,22],[[28,[37,17],["pristine partition"],[["item"],[[30,8]]]],[28,[37,23],[[30,15],"error"],null]],null]],[24,4,"submit"]],[["@text"],["Save"]],null],[1,"\\n"]],[]],[[[41,[28,[37,11],[[30,7]],null],[[[1," "],[8,[39,21],[[24,4,"submit"]],[["@text"],["Save"]],null],[1,"\\n"]],[]],null]],[]]],[1," "],[8,[39,21],[[24,4,"reset"],[4,[38,14],["click",[52,[30,16],[28,[37,3],[[28,[37,5],[[30,16],[30,8]],null]],null],[28,[37,3],[[28,[37,5],[[30,4],[30,8]],null]],null]]],null]],[["@text","@color"],["Cancel","secondary"]],null],[1,"\\n\\n"],[41,[28,[37,20],[[28,[37,11],[[28,[37,17],["new partition"],[["item"],[[30,8]]]]],null],[28,[37,12],["delete partition"],[["item"],[[30,8]]]]],null],[[[1," "],[8,[39,24],null,[["@message"],["Are you sure you want to delete this Partition?"]],[["default"],[[[[1,"\\n "],[8,[39,6],null,[["@name"],["action"]],[["default"],[[[[1,"\\n "],[8,[39,21],[[4,[38,14],["click",[28,[37,3],[[30,17],[28,[37,3],[[30,5,["delete"]],[30,8]],null]],null]],null]],[["@text","@color"],["Delete","critical"]],null],[1,"\\n "]],[17]]]]],[1,"\\n "],[8,[39,6],null,[["@name"],["dialog"]],[["default"],[[[[1,"\\n "],[8,[39,25],null,[["@message","@execute","@cancel"],[[30,20],[30,18],[30,19]]],null],[1,"\\n "]],[18,19,20]]]]],[1,"\\n "]],[]]]]],[1,"\\n"]],[]],null],[1," "]],[]]]]],[1,"\\n "],[13],[1,"\\n\\n"]],[11,12,13,14,15]]]]],[1,"\\n"],[13],[1,"\\n\\n"]],[7,8,9,10]]],[1," "]],[]]]]],[1,"\\n"]],[5]]]]],[1,"\\n"],[13],[1,"\\n"]],["&attrs","@item","@ondelete","@onsubmit","writer","after","readOnly","item","Name","Description","State","Guard","ChartAction","dispatch","state","@oncancel","confirm","execute","cancel","message"],false,["data-writer","uri","hash","fn","if","optional","block-slot","consul/partition/notifications","notification","action","let","not","can","array","on","disabled","state-chart","is","text-input","hds/button-set","and","hds/button","or","state-matches","confirmation-dialog","delete-confirmation"]]',moduleName:"consul-ui/components/consul/partition/form/index.hbs",isStrictMode:!1}) +var i=(0,t.setComponentTemplate)(r,(0,l.default)()) +e.default=i})),define("consul-ui/components/consul/partition/list/index",["exports","@ember/component","@ember/template-factory","@ember/component/template-only"],(function(e,t,n,l){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const r=(0,n.createTemplateFactory)({id:"VkpAwQ51",block:'[[[8,[39,0],[[24,0,"consul-partition-list"],[17,1]],[["@items","@linkable"],[[30,2],"linkable partition"]],[["default"],[[[[1,"\\n "],[8,[39,1],null,[["@name"],["header"]],[["default"],[[[[1,"\\n"],[41,[30,3,["DeletedAt"]],[[[1," "],[10,2],[12],[1,"\\n Deleting "],[1,[30,3,["Name"]]],[1,"...\\n "],[13],[1,"\\n"]],[]],[[[1," "],[10,3],[15,6,[28,[37,3],["dc.partitions.edit",[30,3,["Name"]]],null]],[12],[1,[30,3,["Name"]]],[13],[1,"\\n"]],[]]],[1," "]],[]]]]],[1,"\\n "],[8,[39,1],null,[["@name"],["details"]],[["default"],[[[[1,"\\n"],[41,[30,3,["Description"]],[[[1," "],[10,"dl"],[12],[1,"\\n "],[10,"dt"],[12],[1,"Description"],[13],[1,"\\n "],[10,"dd"],[12],[1,"\\n "],[1,[30,3,["Description"]]],[1,"\\n "],[13],[1,"\\n "],[13],[1,"\\n"]],[]],null],[1," "]],[]]]]],[1,"\\n "],[8,[39,1],null,[["@name"],["actions"]],[["default"],[[[[1,"\\n"],[41,[28,[37,4],[[30,3,["DeletedAt"]]],null],[[[1," "],[8,[30,4],null,null,[["default"],[[[[1,"\\n "],[8,[30,5],null,[["@href"],[[28,[37,3],["dc.partitions.edit",[30,3,["Name"]]],null]]],[["default"],[[[[1,"\\n "],[8,[39,1],null,[["@name"],["label"]],[["default"],[[[[1,"\\n"],[41,[28,[37,5],["write partition"],[["item"],[[30,3]]]],[[[1," Edit\\n"]],[]],[[[1," View\\n"]],[]]],[1," "]],[]]]]],[1,"\\n "]],[]]]]],[1,"\\n"],[41,[28,[37,5],["delete partition"],[["item"],[[30,3]]]],[[[1," "],[8,[30,5],[[24,0,"dangerous"]],[["@onclick"],[[28,[37,6],[[30,0],[30,6],[30,3]],null]]],[["default"],[[[[1,"\\n "],[8,[39,1],null,[["@name"],["label"]],[["default"],[[[[1,"\\n Delete\\n "]],[]]]]],[1,"\\n "],[8,[39,1],null,[["@name"],["confirmation"]],[["default"],[[[[1,"\\n "],[8,[30,7],[[24,0,"warning"]],null,[["default"],[[[[1,"\\n "],[8,[39,1],null,[["@name"],["header"]],[["default"],[[[[1,"\\n Confirm delete\\n "]],[]]]]],[1,"\\n "],[8,[39,1],null,[["@name"],["body"]],[["default"],[[[[1,"\\n "],[10,2],[12],[1,"\\n Are you sure you want to delete this partition?\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,1],null,[["@name"],["confirm"]],[["default"],[[[[1,"\\n "],[8,[30,8],null,null,[["default"],[[[[1,"Delete"]],[]]]]],[1,"\\n "]],[8]]]]],[1,"\\n "]],[]]]]],[1,"\\n "]],[7]]]]],[1,"\\n "]],[]]]]],[1,"\\n"]],[]],null],[1," "]],[5]]]]],[1,"\\n"]],[]],null],[1," "]],[4]]]]],[1,"\\n"]],[3]]]]],[1,"\\n"]],["&attrs","@items","item","Actions","Action","@ondelete","Confirmation","Confirm"],false,["list-collection","block-slot","if","href-to","not","can","action"]]',moduleName:"consul-ui/components/consul/partition/list/index.hbs",isStrictMode:!1}) +var i=(0,t.setComponentTemplate)(r,(0,l.default)()) +e.default=i})),define("consul-ui/components/consul/partition/notifications/index",["exports","@ember/component","@ember/template-factory","@ember/component/template-only"],(function(e,t,n,l){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const r=(0,n.createTemplateFactory)({id:"Rj1t1uFE",block:'[[[41,[28,[37,1],[[30,1],"remove"],null],[[[1," "],[8,[39,2],[[17,2]],[["@color"],["success"]],[["default"],[[[[1,"\\n "],[8,[30,3,["Title"]],null,null,[["default"],[[[[1,"Success!"]],[]]]]],[1,"\\n "],[8,[30,3,["Description"]],null,null,[["default"],[[[[1,"\\n Your Partition has been marked for deletion.\\n "]],[]]]]],[1,"\\n "]],[3]]]]],[1,"\\n"]],[]],null]],["@type","&attrs","T"],false,["if","eq","hds/toast"]]',moduleName:"consul-ui/components/consul/partition/notifications/index.hbs",isStrictMode:!1}) +var i=(0,t.setComponentTemplate)(r,(0,l.default)()) +e.default=i})),define("consul-ui/components/consul/partition/search-bar/index",["exports","@ember/component","@ember/template-factory","@ember/component/template-only"],(function(e,t,n,l){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const r=(0,n.createTemplateFactory)({id:"zU7wyufj",block:'[[[8,[39,0],[[24,0,"consul-partition-search-bar"],[17,1]],[["@filter"],[[30,2]]],[["status","search","sort"],[[[[1,"\\n\\n"],[44,[[28,[37,2],[[28,[37,3],["components.consul.nspace.search-bar.",[30,3,["status","key"]]],null]],[["default"],[[28,[37,4],[[28,[37,3],["common.search.",[30,3,["status","key"]]],null],[28,[37,3],["common.consul.",[30,3,["status","key"]]],null]],null]]]],[28,[37,2],[[28,[37,3],["components.consul.nspace.search-bar.",[30,3,["status","value"]]],null]],[["default"],[[28,[37,4],[[28,[37,3],["common.search.",[30,3,["status","value"]]],null],[28,[37,3],["common.consul.",[30,3,["status","value"]]],null],[28,[37,3],["common.brand.",[30,3,["status","value"]]],null]],null]]]]],[[[1," "],[8,[30,3,["RemoveFilter"]],[[16,"aria-label",[28,[37,2],["common.ui.remove"],[["item"],[[28,[37,3],[[30,4]," ",[30,5]],null]]]]]],null,[["default"],[[[[1,"\\n "],[10,"dl"],[12],[1,"\\n "],[10,"dt"],[12],[1,[30,4]],[13],[1,"\\n "],[10,"dd"],[12],[1,[30,5]],[13],[1,"\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n"]],[4,5]]],[1,"\\n "]],[3]],[[[1,"\\n "],[8,[30,6,["Search"]],null,[["@onsearch","@value","@placeholder"],[[28,[37,5],[[30,0],[30,7]],null],[30,8],[28,[37,2],["common.search.search"],null]]],[["default"],[[[[1,"\\n "],[8,[30,6,["Select"]],[[24,0,"type-search-properties"]],[["@position","@onchange","@multiple","@required"],["right",[28,[37,5],[[30,0],[30,2,["searchproperty","change"]]],null],true,true]],[["default"],[[[[1,"\\n "],[8,[39,6],null,[["@name"],["selected"]],[["default"],[[[[1,"\\n "],[10,1],[12],[1,"\\n "],[1,[28,[35,2],["common.search.searchproperty"],null]],[1,"\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,6],null,[["@name"],["options"]],[["default"],[[[[1,"\\n"],[44,[[30,9,["Optgroup"]],[30,9,["Option"]]],[[[42,[28,[37,8],[[28,[37,8],[[30,2,["searchproperty","default"]]],null]],null],null,[[[1," "],[8,[30,11],null,[["@value","@selected"],[[30,12],[28,[37,9],[[30,12],[30,2,["searchproperty","value"]]],null]]],[["default"],[[[[1,"\\n "],[1,[28,[35,2],[[28,[37,3],["common.consul.",[28,[37,10],[[30,12]],null]],null]],null]],[1,"\\n "]],[]]]]],[1,"\\n"]],[12]],null]],[10,11]]],[1," "]],[]]]]],[1,"\\n "]],[9]]]]],[1,"\\n "]],[]]]]],[1,"\\n "]],[6]],[[[1,"\\n "],[8,[30,13,["Select"]],[[24,0,"type-sort"]],[["@position","@onchange","@multiple","@required"],["right",[28,[37,5],[[30,0],[30,14,["change"]]],null],false,true]],[["default"],[[[[1,"\\n "],[8,[39,6],null,[["@name"],["selected"]],[["default"],[[[[1,"\\n "],[10,1],[12],[1,"\\n"],[44,[[28,[37,11],[[28,[37,4],[[28,[37,4],["Name:asc",[28,[37,2],["common.sort.alpha.asc"],null]],null],[28,[37,4],["Name:desc",[28,[37,2],["common.sort.alpha.desc"],null]],null]],null]],null]],[[[1," "],[1,[28,[35,12],[[30,16],[30,14,["value"]]],null]],[1,"\\n"]],[16]]],[1," "],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,6],null,[["@name"],["options"]],[["default"],[[[[1,"\\n"],[44,[[30,15,["Optgroup"]],[30,15,["Option"]]],[[[1," "],[8,[30,17],null,[["@label"],[[28,[37,2],["common.consul.name"],null]]],[["default"],[[[[1,"\\n "],[8,[30,18],null,[["@value","@selected"],["Name:asc",[28,[37,13],["Name:asc",[30,14,["value"]]],null]]],[["default"],[[[[1,[28,[35,2],["common.sort.alpha.asc"],null]]],[]]]]],[1,"\\n "],[8,[30,18],null,[["@value","@selected"],["Name:desc",[28,[37,13],["Name:desc",[30,14,["value"]]],null]]],[["default"],[[[[1,[28,[35,2],["common.sort.alpha.desc"],null]]],[]]]]],[1,"\\n "]],[]]]]],[1,"\\n"]],[17,18]]],[1," "]],[]]]]],[1,"\\n "]],[15]]]]],[1,"\\n "]],[13]]]]]],["&attrs","@filter","search","key","value","search","@onsearch","@search","components","Optgroup","Option","prop","search","@sort","components","selectable","Optgroup","Option"],false,["search-bar","let","t","concat","array","action","block-slot","each","-track-array","includes","lowercase","from-entries","get","eq"]]',moduleName:"consul-ui/components/consul/partition/search-bar/index.hbs",isStrictMode:!1}) +var i=(0,t.setComponentTemplate)(r,(0,l.default)()) +e.default=i})),define("consul-ui/components/consul/partition/selector/index",["exports","@ember/component","@ember/template-factory","@ember/component/template-only"],(function(e,t,n,l){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const r=(0,n.createTemplateFactory)({id:"GPyi0nAM",block:'[[[44,[[28,[37,1],[[30,1],"default"],null],[28,[37,2],["dc.partitions",[30,2,["Name"]]],null]],[[[41,[28,[37,4],["choose partitions"],[["dc"],[[30,2]]]],[[[1," "],[10,"li"],[14,0,"partitions"],[12],[1,"\\n "],[8,[39,5],[[24,"aria-label","Admin Partition"]],[["@items"],[[28,[37,6],[[28,[37,7],null,[["Name","href"],["Manage Partitions",[28,[37,8],["dc.partitions",[30,2,["Name"]]],null]]]],[28,[37,9],["DeletedAt",[30,5]],null]],null]]],[["default"],[[[[1,"\\n "],[8,[30,6,["Action"]],[[4,[38,10],["click",[30,6,["toggle"]]],null]],null,[["default"],[[[[1,"\\n "],[1,[52,[30,4],"Manage Partition",[30,3]]],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[30,6,["Menu"]],null,null,[["default"],[[[[1,"\\n "],[8,[39,11],null,[["@src","@onchange"],[[28,[37,12],["/*/*/${dc}/partitions",[28,[37,7],null,[["dc"],[[30,2,["Name"]]]]]],null],[28,[37,13],[[28,[37,14],[[30,8]],null]],null]]],null],[1,"\\n "],[8,[30,7,["Menu"]],null,null,[["default"],[[[[1,"\\n"],[42,[28,[37,16],[[28,[37,16],[[30,9,["items"]]],null]],null],null,[[[1," "],[8,[30,9,["Item"]],[[16,"aria-current",[52,[28,[37,1],[[28,[37,17],[[30,4],[30,10,["href"]]],null],[28,[37,17],[[28,[37,18],[[30,4]],null],[28,[37,19],[[30,3],[30,10,["Name"]]],null]],null]],null],"true"]]],null,[["default"],[[[[1,"\\n "],[8,[30,9,["Action"]],[[4,[38,10],["click",[30,6,["close"]]],null]],[["@href"],[[52,[30,10,["href"]],[30,10,["href"]],[52,[30,4],[28,[37,8],["dc.services.index"],[["params"],[[28,[37,7],null,[["partition","nspace","dc"],[[30,10,["Name"]],[27],[30,2,["Name"]]]]]]]],[28,[37,8],["."],[["params"],[[28,[37,7],null,[["partition","nspace"],[[30,10,["Name"]],[27]]]]]]]]]]],[["default"],[[[[1,"\\n "],[1,[30,10,["Name"]]],[1,"\\n "]],[]]]]],[1,"\\n "]],[]]]]],[1,"\\n"]],[10]],null],[1," "]],[9]]]]],[1,"\\n "]],[7]]]]],[1,"\\n "]],[6]]]]],[1,"\\n "],[13],[1,"\\n"]],[]],[[[1," "],[10,"li"],[14,0,"partition"],[14,"aria-label","Admin Partition"],[12],[1,"\\n "],[1,"default"],[1,"\\n "],[13],[1,"\\n"]],[]]]],[3,4]]]],["@partition","@dc","partition","isManaging","@partitions","disclosure","panel","@onchange","menu","item"],false,["let","or","is-href","if","can","disclosure-menu","append","hash","href-to","reject-by","on","data-source","uri","fn","optional","each","-track-array","and","not","eq"]]',moduleName:"consul-ui/components/consul/partition/selector/index.hbs",isStrictMode:!1}) +var i=(0,t.setComponentTemplate)(r,(0,l.default)()) +e.default=i})),define("consul-ui/components/consul/peer/address/list/index",["exports","@ember/component","@ember/template-factory","@ember/component/template-only"],(function(e,t,n,l){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const r=(0,n.createTemplateFactory)({id:"pSmtNtNJ",block:'[[[8,[39,0],null,null,[["default"],[[[[1,"\\n"],[41,[30,1,["data","height"]],[[[1," "],[10,0],[15,5,[30,1,["data","fillRemainingHeightStyle"]]],[14,0,"overflow-y-scroll"],[12],[1,"\\n "],[8,[39,2],null,[["@tagName","@estimateHeight","@items"],["ul",[30,1,["data","height"]],[30,2]]],[["default"],[[[[1,"\\n "],[10,"li"],[14,0,"px-3 h-12 border-bottom-primary flex items-center justify-between group"],[12],[1,"\\n "],[10,0],[14,0,"hds-typography-display-300 text-hds-foreground-strong hds-font-weight-semibold"],[12],[1,[30,3]],[13],[1,"\\n "],[8,[39,3],[[24,0,"opacity-0 group-hover:opacity-100"]],[["@value","@name"],[[30,3],"Address"]],null],[1,"\\n "],[13],[1,"\\n "]],[3,4]]]]],[1,"\\n "],[13],[1,"\\n"]],[]],null]],[1]]]]]],["p","@items","address","index"],false,["providers/dimension","if","vertical-collection","copy-button"]]',moduleName:"consul-ui/components/consul/peer/address/list/index.hbs",isStrictMode:!1}) +var i=(0,t.setComponentTemplate)(r,(0,l.default)()) +e.default=i})),define("consul-ui/components/consul/peer/bento-box/index",["exports","@ember/component","@ember/template-factory","@ember/component/template-only"],(function(e,t,n,l){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const r=(0,n.createTemplateFactory)({id:"H9CcvCNn",block:'[[[8,[39,0],[[24,0,"mt-6 mb-3"]],[["@level","@hasBorder"],["base",true]],[["default"],[[[[1,"\\n "],[10,0],[14,0,"flex h-24 p-6 overflow-x-auto space-x-12"],[12],[1,"\\n "],[10,0],[14,0,"shrink-0"],[12],[1,"\\n "],[10,0],[14,0,"mb-2 hds-typography-body-200 hds-font-weight-semibold hds-foreground-primary"],[12],[1,"Status"],[13],[1,"\\n "],[10,0],[14,0,"flex items-center"],[12],[1,"\\n "],[8,[39,1],null,[["@peering"],[[30,1]]],null],[1,"\\n "],[13],[1,"\\n "],[13],[1,"\\n "],[10,0],[14,0,"shrink-0"],[12],[1,"\\n "],[10,0],[14,0,"hds-typography-body-200 mb-2 hds-font-weight-semibold hds-foreground-primary"],[12],[1,"Latest heartbeat"],[13],[1,"\\n "],[10,0],[14,0,"flex items-center"],[12],[1,"\\n"],[41,[30,1,["LastHeartbeat"]],[[[44,[[28,[37,4],[[30,1,["LastHeartbeat"]]],null]],[[[1," "],[8,[39,5],[[24,0,"mr-0.5"]],[["@name","@color"],["activity","var(--token-color-foreground-faint)"]],null],[1,"\\n"],[41,[30,2,["isNearDate"]],[[[1," "],[11,1],[4,[38,6],[[30,2,["friendly"]]],null],[12],[1,[30,2,["relative"]]],[13],[1,"\\n"]],[]],[[[1," "],[10,1],[12],[1,[30,2,["friendly"]]],[13],[1,"\\n"]],[]]]],[2]]]],[]],[[[1," "],[10,1],[12],[1,"None yet"],[13],[1,"\\n"]],[]]],[1," "],[13],[1,"\\n "],[13],[1,"\\n "],[10,0],[14,0,"shrink-0"],[12],[1,"\\n "],[10,0],[14,0,"mb-2 hds-typography-body-200 hds-font-weight-semibold hds-foreground-primary"],[12],[1,"Latest receipt"],[13],[1,"\\n "],[10,0],[14,0,"flex items-center"],[12],[1,"\\n"],[41,[30,1,["LastReceive"]],[[[44,[[28,[37,4],[[30,1,["LastReceive"]]],null]],[[[41,[30,3,["isNearDate"]],[[[1," "],[11,1],[4,[38,6],[[30,3,["friendly"]]],null],[12],[1,[30,3,["relative"]]],[13],[1,"\\n"]],[]],[[[1," "],[10,1],[12],[1,[30,3,["friendly"]]],[13],[1,"\\n"]],[]]]],[3]]]],[]],[[[1," "],[10,1],[12],[1,"None yet"],[13],[1,"\\n"]],[]]],[1," "],[13],[1,"\\n "],[13],[1,"\\n "],[10,0],[14,0,"shrink-0"],[12],[1,"\\n "],[10,0],[14,0,"mb-2 hds-typography-body-200 hds-font-weight-semibold hds-foreground-primary"],[12],[1,"Latest send"],[13],[1,"\\n "],[10,0],[14,0,"flex items-center"],[12],[1,"\\n"],[41,[30,1,["LastSend"]],[[[44,[[28,[37,4],[[30,1,["LastSend"]]],null]],[[[41,[30,4,["isNearDate"]],[[[1," "],[11,1],[4,[38,6],[[30,4,["friendly"]]],null],[12],[1,[30,4,["relative"]]],[13],[1,"\\n"]],[]],[[[1," "],[10,1],[12],[1,[30,4,["friendly"]]],[13],[1,"\\n"]],[]]]],[4]]]],[]],[[[1," "],[10,1],[12],[1,"None yet"],[13],[1,"\\n"]],[]]],[1," "],[13],[1,"\\n\\n "],[13],[1,"\\n "],[13],[1,"\\n"]],[]]]]]],["@peering","smartDate","smartDate","smartDate"],false,["hds/card/container","peerings/badge","if","let","smart-date-format","flight-icon","tooltip"]]',moduleName:"consul-ui/components/consul/peer/bento-box/index.hbs",isStrictMode:!1}) +var i=(0,t.setComponentTemplate)(r,(0,l.default)()) +e.default=i})),define("consul-ui/components/consul/peer/form/chart.xstate",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +e.default={id:"consul-peer-form",initial:"generate",on:{INITIATE:[{target:"initiate"}],GENERATE:[{target:"generate"}]},states:{initiate:{},generate:{}}}})),define("consul-ui/components/consul/peer/form/generate/actions/index",["exports","@ember/component","@ember/template-factory","@ember/component/template-only"],(function(e,t,n,l){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const r=(0,n.createTemplateFactory)({id:"3YYkPKep",block:'[[[8,[39,0],[[16,"form",[30,1]],[24,4,"submit"],[16,"disabled",[28,[37,1],[[28,[37,2],[[30,2,["Name","length"]],0],null]],null]],[17,3]],[["@text"],["Generate token"]],null]],["@id","@item","&attrs"],false,["hds/button","or","eq"]]',moduleName:"consul-ui/components/consul/peer/form/generate/actions/index.hbs",isStrictMode:!1}) +var i=(0,t.setComponentTemplate)(r,(0,l.default)()) +e.default=i})),define("consul-ui/components/consul/peer/form/generate/chart.xstate",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +e.default={id:"consul-peer-generate-form",initial:"idle",states:{idle:{on:{LOAD:{target:"loading"}}},loading:{on:{SUCCESS:{target:"success"},ERROR:{target:"error"}}},success:{on:{RESET:{target:"idle"}}},error:{}}}})),define("consul-ui/components/consul/peer/form/generate/fieldsets/index",["exports","@ember/component","@ember/template-factory","@glimmer/component","@ember/object"],(function(e,t,n,l,r){var i +Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const o=(0,n.createTemplateFactory)({id:"NcmZNT1t",block:'[[[11,0],[16,0,[28,[37,0],["consul-peer-form-generate-fieldsets"],null]],[17,1],[12],[1,"\\n "],[8,[39,1],null,[["@src"],[[28,[37,2],["/machines/validate.xstate"],[["from"],["/components/consul/peer/form/generate/fieldsets"]]]]],[["default"],[[[[1,"\\n"],[44,[[28,[37,4],null,[["help","Name"],[[28,[37,5],[[28,[37,6],["common.validations.dns-hostname.help"],null],[28,[37,6],["common.validations.immutable.help"],null]],null],[28,[37,7],[[28,[37,4],null,[["test","error"],[[28,[37,6],["common.validations.dns-hostname.test"],null],[28,[37,6],["common.validations.dns-hostname.error"],[["name"],["Name"]]]]]]],null]]]]],[[[1," "],[10,"fieldset"],[12],[1,"\\n "],[8,[39,8],null,[["@label","@name","@item","@validations","@chart","@oninput"],[[28,[37,6],["components.consul.peer.generate.name"],null],"Name",[30,4],[30,3],[30,2],[28,[37,9],["target.value",[28,[37,10],[[30,4],"Name"],null]],null]]],null],[1,"\\n "],[18,6,[[28,[37,4],null,[["valid"],[[28,[37,12],[[28,[37,13],[[30,2,["state"]],"error"],null]],null]]]]]],[1,"\\n "],[13],[1,"\\n\\n"]],[3]]],[1,"\\n"],[44,[[28,[37,4],null,[["help"],[[28,[37,6],["common.validations.server-external-addresses.help"],null]]]]],[[[1," "],[10,"fieldset"],[12],[1,"\\n "],[8,[39,8],null,[["@label","@name","@item","@chart","@validations","@oninput"],[[28,[37,6],["components.consul.peer.generate.addresses"],null],"ServerExternalAddresses",[30,4],[30,2],[30,5],[28,[37,9],["target.value",[30,0,["onInput"]]],null]]],null],[1,"\\n "],[18,6,[[28,[37,4],null,[["valid"],[[28,[37,12],[[28,[37,13],[[30,2,["state"]],"error"],null]],null]]]]]],[1,"\\n "],[13],[1,"\\n\\n"]],[5]]],[1," "]],[2]]]]],[1,"\\n"],[13],[1,"\\n"]],["&attrs","fsm","Name","@item","ServerExternalAddresses","&default"],false,["class-map","state-machine","require","let","hash","concat","t","array","text-input","pick","set","yield","not","state-matches"]]',moduleName:"consul-ui/components/consul/peer/form/generate/fieldsets/index.hbs",isStrictMode:!1}) +let a=(i=class extends l.default{onInput(e){e=e?e.split(",").map((e=>e.trim())):[],this.args.item.ServerExternalAddresses=e}},u=i.prototype,s="onInput",c=[r.action],d=Object.getOwnPropertyDescriptor(i.prototype,"onInput"),p=i.prototype,f={},Object.keys(d).forEach((function(e){f[e]=d[e]})),f.enumerable=!!f.enumerable,f.configurable=!!f.configurable,("value"in f||f.initializer)&&(f.writable=!0),f=c.slice().reverse().reduce((function(e,t){return t(u,s,e)||e}),f),p&&void 0!==f.initializer&&(f.value=f.initializer?f.initializer.call(p):void 0,f.initializer=void 0),void 0===f.initializer&&(Object.defineProperty(u,s,f),f=null),i) +var u,s,c,d,p,f +e.default=a,(0,t.setComponentTemplate)(o,a)})),define("consul-ui/components/consul/peer/form/generate/index",["exports","@ember/component","@ember/template-factory","@ember/component/template-only"],(function(e,t,n,l){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const r=(0,n.createTemplateFactory)({id:"s3NJojfR",block:'[[[11,0],[16,0,[28,[37,0],["consul-peer-form-generate"],null]],[17,1],[12],[1,"\\n "],[8,[39,1],null,[["@src","@initial"],[[28,[37,2],["./chart.xstate"],[["from"],["/components/consul/peer/form/generate"]]],[52,[30,2],"loading","idle"]]],[["default"],[[[[1,"\\n\\n"],[44,[[28,[37,5],null,null]],[[[1," "],[11,"form"],[16,1,[30,4]],[4,[38,6],["submit",[28,[37,7],[[30,3,["dispatch"]],"LOAD"],null]],null],[12],[1,"\\n\\n "],[8,[30,3,["State"]],null,[["@matches"],[[28,[37,8],["idle","error"],null]]],[["default"],[[[[1,"\\n "],[8,[30,3,["State"]],null,[["@matches"],["error"]],[["default"],[[[[1,"\\n "],[8,[39,9],[[24,0,"mb-3 mt-2"]],[["@type"],["critical"]],[["default"],[[[[1,"\\n "],[8,[30,6,["Title"]],null,null,[["default"],[[[[1,"Error"]],[]]]]],[1,"\\n "],[8,[30,6,["Description"]],null,null,[["default"],[[[[1,[30,3,["state","context","error","message"]]]],[]]]]],[1,"\\n "]],[6]]]]],[1,"\\n "]],[]]]]],[1,"\\n "],[18,9,[[28,[37,11],null,[["Fieldsets","Actions"],[[50,"consul/peer/form/generate/fieldsets",0,null,[["item"],[[30,7]]]],[50,"consul/peer/form/generate/actions",0,null,[["item","id"],[[30,7],[30,4]]]]]]]]],[1,"\\n "]],[]]]]],[1,"\\n\\n "],[8,[30,3,["State"]],null,[["@matches"],["loading"]],[["default"],[[[[1,"\\n "],[8,[39,13],null,[["@src","@onchange","@onerror"],[[28,[37,14],["/${partition}/${nspace}/${dc}/peering/token-for/${name}/${externalAddresses}",[28,[37,11],null,[["partition","nspace","dc","name","externalAddresses"],[[30,7,["Partition"]],"",[30,7,["Datacenter"]],[30,7,["Name"]],[30,7,["ServerExternalAddresses"]]]]]],null],[28,[37,15],[[30,8],[28,[37,16],["data",[28,[37,7],[[30,3,["dispatch"]],"SUCCESS"],null]],null]],null],[28,[37,15],[[28,[37,7],[[30,3,["dispatch"]],"ERROR"],null]],null]]],null],[1,"\\n "]],[]]]]],[1,"\\n\\n "],[8,[30,3,["State"]],null,[["@matches"],["success"]],[["default"],[[[[1,"\\n "],[18,9,[[28,[37,11],null,[["Fieldsets","Actions"],[[50,"consul/peer/form/token/fieldsets",0,null,[["item","token","regenerate","onclick"],[[30,7],[30,3,["state","context","PeeringToken"]],[30,2],[28,[37,15],[[28,[37,17],[[30,7],"Name",""],null],[28,[37,7],[[30,3,["dispatch"]],"RESET"],null]],null]]]],[50,"consul/peer/form/token/actions",0,null,[["token","item","id"],[[30,3,["state","context","PeeringToken"]],[30,7],[30,4]]]]]]]]],[1,"\\n "]],[]]]]],[1,"\\n\\n "],[13],[1,"\\n"]],[4,5]]],[1,"\\n "]],[3]]]]],[1,"\\n"],[13],[1,"\\n"]],["&attrs","@regenerate","fsm","id","reset","A","@item","@onchange","&default"],false,["class-map","state-machine","require","if","let","unique-id","on","fn","array","hds/alert","yield","hash","component","data-source","uri","queue","pick","set"]]',moduleName:"consul-ui/components/consul/peer/form/generate/index.hbs",isStrictMode:!1}) +var i=(0,t.setComponentTemplate)(r,(0,l.default)()) +e.default=i})),define("consul-ui/components/consul/peer/form/index",["exports","@ember/component","@ember/template-factory","@ember/component/template-only"],(function(e,t,n,l){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const r=(0,n.createTemplateFactory)({id:"5/r0PDQY",block:'[[[11,0],[16,0,[28,[37,0],["consul-peer-form"],null]],[17,1],[12],[1,"\\n "],[8,[39,1],null,[["@src"],[[28,[37,2],["./chart.xstate"],[["from"],["/components/consul/peer/form"]]]]],[["default"],[[[[1,"\\n\\n "],[8,[39,3],null,[["@items","@onTabClicked"],[[28,[37,4],[[28,[37,5],null,[["label","selected","state"],[[28,[37,6],["components.consul.peer.form.generate-label"],null],[28,[37,7],[[30,2,["state"]],"generate"],null],"GENERATE"]]],[28,[37,5],null,[["label","selected","state"],[[28,[37,6],["components.consul.peer.form.establish-label"],null],[28,[37,7],[[30,2,["state"]],"initiate"],null],"INITIATE"]]]],null],[28,[37,8],["state",[30,2,["dispatch"]]],null]]],null],[1,"\\n\\n "],[8,[30,2,["State"]],null,[["@matches"],[[28,[37,4],["generate"],null]]],[["default"],[[[[1,"\\n\\n "],[8,[39,9],null,[["@src"],[[28,[37,10],["/${partition}/${nspace}/${dc}/peer-generate/",[30,3]],null]]],[["default"],[[[[1,"\\n "],[18,6,[[28,[37,5],null,[["Form"],[[50,"consul/peer/form/generate",0,null,[["item"],[[30,4,["data"]]]]]]]]]],[1,"\\n "]],[4]]]]],[1,"\\n\\n "]],[]]]]],[1,"\\n\\n "],[8,[30,2,["State"]],null,[["@matches"],["initiate"]],[["default"],[[[[1,"\\n\\n "],[8,[39,9],null,[["@src"],[[28,[37,10],["/${partition}/${nspace}/${dc}/peer-initiate/",[30,3]],null]]],[["default"],[[[[1,"\\n "],[18,6,[[28,[37,5],null,[["Form"],[[50,"consul/peer/form/initiate",0,null,[["item"],[[30,5,["data"]]]]]]]]]],[1,"\\n "]],[5]]]]],[1,"\\n\\n "]],[]]]]],[1,"\\n\\n "]],[2]]]]],[1,"\\n"],[13],[1,"\\n"]],["&attrs","fsm","@params","source","source","&default"],false,["class-map","state-machine","require","tab-nav","array","hash","t","state-matches","pick","data-source","uri","yield","component"]]',moduleName:"consul-ui/components/consul/peer/form/index.hbs",isStrictMode:!1}) +var i=(0,t.setComponentTemplate)(r,(0,l.default)()) +e.default=i})),define("consul-ui/components/consul/peer/form/initiate/actions/index",["exports","@ember/component","@ember/template-factory","@ember/component/template-only"],(function(e,t,n,l){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const r=(0,n.createTemplateFactory)({id:"ShUcgNKi",block:'[[[8,[39,0],[[16,"form",[30,1]],[24,4,"submit"],[17,2]],[["@text"],["Add peer"]],null]],["@id","&attrs"],false,["hds/button"]]',moduleName:"consul-ui/components/consul/peer/form/initiate/actions/index.hbs",isStrictMode:!1}) +var i=(0,t.setComponentTemplate)(r,(0,l.default)()) +e.default=i})),define("consul-ui/components/consul/peer/form/initiate/fieldsets/index",["exports","@ember/component","@ember/template-factory","@ember/component/template-only"],(function(e,t,n,l){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const r=(0,n.createTemplateFactory)({id:"I08SZDBv",block:'[[[11,0],[16,0,[28,[37,0],["consul-peer-form-initiate-fieldsets"],null]],[17,1],[12],[1,"\\n"],[44,[[28,[37,2],null,[["help","Name"],["Enter a name to locally identify the new peer.",[28,[37,3],[[28,[37,2],null,[["test","error"],[[28,[37,4],["common.validations.dns-hostname.test"],null],[28,[37,4],["common.validations.dns-hostname.error"],[["name"],["Name"]]]]]]],null]]]],[28,[37,2],null,[["help","PeeringToken"],["Enter the token received from the operator of the desired peer.",[28,[37,3],null,null]]]]],[[[1," "],[10,2],[12],[1,"\\n Enter a token generated in the desired peer.\\n "],[13],[1,"\\n "],[8,[39,5],null,[["@src"],[[28,[37,6],["/machines/validate.xstate"],[["from"],["/components/consul/peer/form/generate/fieldsets"]]]]],[["default"],[[[[1,"\\n\\n "],[10,"fieldset"],[12],[1,"\\n "],[8,[39,7],null,[["@name","@label","@item","@validations","@chart"],["Name","Name of peer",[30,5],[30,2],[30,4]]],null],[1,"\\n "],[8,[39,7],null,[["@expanded","@name","@item","@validations","@chart"],[true,"Token",[30,5],[30,3],[30,4]]],null],[1,"\\n "],[18,6,[[28,[37,2],null,[["valid"],[[28,[37,9],[[28,[37,10],[[30,4,["state"]],"error"],null]],null]]]]]],[1,"\\n "],[13],[1,"\\n\\n "]],[4]]]]],[1,"\\n"]],[2,3]]],[13],[1,"\\n"]],["&attrs","Name","PeeringToken","fsm","@item","&default"],false,["class-map","let","hash","array","t","state-machine","require","text-input","yield","not","state-matches"]]',moduleName:"consul-ui/components/consul/peer/form/initiate/fieldsets/index.hbs",isStrictMode:!1}) +var i=(0,t.setComponentTemplate)(r,(0,l.default)()) +e.default=i})),define("consul-ui/components/consul/peer/form/initiate/index",["exports","@ember/component","@ember/template-factory","@ember/component/template-only"],(function(e,t,n,l){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const r=(0,n.createTemplateFactory)({id:"xAGGr6Ec",block:'[[[11,0],[16,0,[28,[37,0],["consul-peer-form-initiate"],null]],[17,1],[12],[1,"\\n "],[8,[39,1],null,[["@sink","@type","@label","@onchange"],[[28,[37,2],["/${partition}/${nspace}/${dc}/peer",[28,[37,3],null,[["partition","nspace","dc"],[[28,[37,4],[[30,2,["Partition"]],""],null],[28,[37,4],[[30,2,["Namespace"]],""],null],[28,[37,4],[[30,2,["Datacenter"]],""],null]]]]],null],"peer","peer",[28,[37,5],[[28,[37,6],[[30,3]],null],[30,2]],null]]],[["default"],[[[[1,"\\n "],[8,[39,7],null,[["@name"],["error"]],[["default"],[[[[1,"\\n "],[8,[39,8],[[24,0,"mb-3 mt-2"]],[["@type"],["critical"]],[["default"],[[[[1,"\\n "],[8,[30,7,["Title"]],null,null,[["default"],[[[[1,"Error"]],[]]]]],[1,"\\n "],[8,[30,7,["Description"]],null,null,[["default"],[[[[1,[30,6,["message"]]]],[]]]]],[1,"\\n "]],[7]]]]],[1,"\\n "]],[5,6]]]]],[1,"\\n "],[8,[39,7],null,[["@name"],["content"]],[["default"],[[[[1,"\\n"],[44,[[28,[37,10],null,null]],[[[1," "],[11,"form"],[16,1,[30,8]],[4,[38,11],["submit",[28,[37,5],[[30,4,["persist"]],[30,2]],null]],null],[12],[1,"\\n "],[18,9,[[28,[37,3],null,[["Fieldsets","Actions"],[[50,"consul/peer/form/initiate/fieldsets",0,null,[["item"],[[30,2]]]],[50,"consul/peer/form/initiate/actions",0,null,[["item","id"],[[30,2],[30,8]]]]]]]]],[1,"\\n "],[13],[1,"\\n"]],[8]]],[1," "]],[]]]]],[1,"\\n "]],[4]]]]],[1,"\\n"],[13]],["&attrs","@item","@onsubmit","writer","after","error","A","id","&default"],false,["class-map","data-writer","uri","hash","or","fn","optional","block-slot","hds/alert","let","unique-id","on","yield","component"]]',moduleName:"consul-ui/components/consul/peer/form/initiate/index.hbs",isStrictMode:!1}) +var i=(0,t.setComponentTemplate)(r,(0,l.default)()) +e.default=i})),define("consul-ui/components/consul/peer/form/token/actions/index",["exports","@ember/component","@ember/template-factory","@ember/component/template-only"],(function(e,t,n,l){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const r=(0,n.createTemplateFactory)({id:"flM3VZCN",block:'[[[11,0],[17,1],[12],[1,"\\n "],[8,[39,0],null,null,[["default"],[[[[1,"\\n "],[8,[39,1],[[17,1],[4,[38,2],[[30,2]],null]],[["@text","@color"],["Copy token","primary"]],null],[1,"\\n "],[8,[39,1],[[24,4,"reset"],[4,[38,3],["click",[30,3]],null]],[["@text","@color"],["Close","secondary"]],null],[1,"\\n "]],[]]]]],[1,"\\n"],[13],[1,"\\n"]],["&attrs","@token","@onclose"],false,["hds/button-set","hds/button","with-copyable","on"]]',moduleName:"consul-ui/components/consul/peer/form/token/actions/index.hbs",isStrictMode:!1}) +var i=(0,t.setComponentTemplate)(r,(0,l.default)()) +e.default=i})),define("consul-ui/components/consul/peer/form/token/fieldsets/index",["exports","@ember/component","@ember/template-factory","@ember/component/template-only"],(function(e,t,n,l){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const r=(0,n.createTemplateFactory)({id:"u1kd86tb",block:'[[[41,[30,1],[[[1," "],[10,2],[12],[1,"\\n Token regenerated! Here’s what’s next:\\n "],[13],[1,"\\n"]],[]],[[[1," "],[10,2],[12],[1,"\\n Token generated! Here’s what’s next:\\n "],[13],[1,"\\n"]],[]]],[1," "],[10,"ol"],[12],[1,"\\n "],[10,"li"],[12],[1,"\\n "],[10,"strong"],[12],[1,"Copy the token"],[13],[10,"br"],[12],[13],[1,"\\n This token cannot be viewed again after creation.\\n "],[10,"br"],[12],[13],[1,"\\n "],[8,[39,1],null,[["@value","@name"],[[30,2],"Token"]],null],[1,"\\n "],[13],[1,"\\n "],[10,"li"],[12],[1,"\\n "],[10,"strong"],[12],[1,"Switch to the peer"],[13],[10,"br"],[12],[13],[1,"\\n Someone on your team should log into the Datacenter (OSS) or Admin Partition (Enterprise) that you want this one to connect with.\\n "],[13],[1,"\\n "],[10,"li"],[12],[1,"\\n "],[10,"strong"],[12],[1,"Initiate the peering"],[13],[10,"br"],[12],[13],[1,"\\n From there, initiate a new peering, name it, and paste this token in.\\n "],[13],[1,"\\n "],[13],[1,"\\n"],[41,[28,[37,2],[[30,1]],null],[[[1," "],[8,[39,3],[[24,4,"reset"],[4,[38,4],["click",[30,3]],null]],[["@text","@color"],["Generate another token","secondary"]],null],[1,"\\n"]],[]],null],[1,"\\n"]],["@regenerate","@token","@onclick"],false,["if","copyable-code","not","hds/button","on"]]',moduleName:"consul-ui/components/consul/peer/form/token/fieldsets/index.hbs",isStrictMode:!1}) +var i=(0,t.setComponentTemplate)(r,(0,l.default)()) +e.default=i})),define("consul-ui/components/consul/peer/info/index",["exports","@ember/component","@ember/template-factory","@ember/component/template-only"],(function(e,t,n,l){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const r=(0,n.createTemplateFactory)({id:"OgBqwHXm",block:'[[[41,[30,1,["PeerName"]],[[[1," "],[10,0],[14,0,"consul-peer-info"],[12],[1,"\\n\\n "],[11,"svg"],[24,"width","16"],[24,"height","16"],[24,"viewBox","0 0 16 16"],[24,"fill","none"],[24,"xmlns","http://www.w3.org/2000/svg","http://www.w3.org/2000/xmlns/"],[4,[38,1],["Peer"],null],[12],[1,"\\n "],[10,"path"],[14,"d","M16 8C16 7.80109 15.921 7.61032 15.7803 7.46967L12.2803 3.96967C11.9874 3.67678 11.5126 3.67678 11.2197 3.96967C10.9268 4.26256 10.9268 4.73744 11.2197 5.03033L14.1893 8L11.2197 10.9697C10.9268 11.2626 10.9268 11.7374 11.2197 12.0303C11.5126 12.3232 11.9874 12.3232 12.2803 12.0303L15.7803 8.53033C15.921 8.38968 16 8.19891 16 8Z"],[14,"fill","#77838A"],[12],[13],[1,"\\n "],[10,"path"],[14,"d","M0.21967 8.53033C-0.0732233 8.23744 -0.0732233 7.76256 0.21967 7.46967L3.71967 3.96967C4.01256 3.67678 4.48744 3.67678 4.78033 3.96967C5.07322 4.26256 5.07322 4.73744 4.78033 5.03033L1.81066 8L4.78033 10.9697C5.07322 11.2626 5.07322 11.7374 4.78033 12.0303C4.48744 12.3232 4.01256 12.3232 3.71967 12.0303L0.21967 8.53033Z"],[14,"fill","#77838A"],[12],[13],[1,"\\n "],[10,"path"],[14,"d","M5 7C4.44772 7 4 7.44772 4 8C4 8.55229 4.44772 9 5 9H5.01C5.56228 9 6.01 8.55229 6.01 8C6.01 7.44772 5.56228 7 5.01 7H5Z"],[14,"fill","#77838A"],[12],[13],[1,"\\n "],[10,"path"],[14,"d","M7 8C7 7.44772 7.44772 7 8 7H8.01C8.56228 7 9.01 7.44772 9.01 8C9.01 8.55229 8.56228 9 8.01 9H8C7.44772 9 7 8.55229 7 8Z"],[14,"fill","#77838A"],[12],[13],[1,"\\n "],[10,"path"],[14,"d","M11 7C10.4477 7 10 7.44772 10 8C10 8.55229 10.4477 9 11 9H11.01C11.5623 9 12.01 8.55229 12.01 8C12.01 7.44772 11.5623 7 11.01 7H11Z"],[14,"fill","#77838A"],[12],[13],[1,"\\n "],[13],[1,"\\n "],[10,1],[14,0,"consul-peer-info__description"],[12],[1,"Imported from "],[10,1],[12],[1,[30,1,["PeerName"]]],[13],[13],[1,"\\n "],[13],[1,"\\n"]],[]],null]],["@item"],false,["if","tooltip"]]',moduleName:"consul-ui/components/consul/peer/info/index.hbs",isStrictMode:!1}) +var i=(0,t.setComponentTemplate)(r,(0,l.default)()) +e.default=i})),define("consul-ui/components/consul/peer/list/index",["exports","@ember/component","@ember/template-factory","@ember/component/template-only"],(function(e,t,n,l){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const r=(0,n.createTemplateFactory)({id:"P8VyWcGf",block:'[[[8,[39,0],[[24,0,"consul-peer-list"],[17,1]],[["@items","@linkable"],[[30,2],"linkable peers"]],[["default"],[[[[1,"\\n "],[8,[39,1],null,[["@name"],["header"]],[["default"],[[[[1,"\\n"],[41,[28,[37,3],["delete peer"],[["item"],[[30,3]]]],[[[1," "],[10,3],[15,6,[28,[37,4],["dc.peers.show",[30,3,["Name"]]],null]],[12],[1,"\\n "],[1,[30,3,["Name"]]],[1,"\\n "],[13],[1,"\\n"]],[]],[[[1," "],[10,2],[12],[1,"\\n "],[1,[30,3,["Name"]]],[1,"\\n "],[13],[1,"\\n"]],[]]],[1," "]],[]]]]],[1,"\\n "],[8,[39,1],null,[["@name"],["details"]],[["default"],[[[[1,"\\n "],[10,0],[14,0,"peers__list__peer-detail"],[12],[1,"\\n "],[8,[39,5],null,[["@peering"],[[30,3]]],null],[1,"\\n\\n "],[11,0],[4,[38,6],[[28,[37,7],["routes.dc.peers.index.detail.imported.tooltip"],[["name"],[[30,3,["Name"]]]]]],null],[12],[1,"\\n "],[1,[28,[35,7],["routes.dc.peers.index.detail.imported.count"],[["count"],[[28,[37,8],[[30,3,["ImportedServiceCount"]]],null]]]]],[1,"\\n "],[13],[1,"\\n\\n "],[11,0],[4,[38,6],[[28,[37,7],["routes.dc.peers.index.detail.exported.tooltip"],[["name"],[[30,3,["Name"]]]]]],null],[12],[1,"\\n "],[1,[28,[35,7],["routes.dc.peers.index.detail.exported.count"],[["count"],[[28,[37,8],[[30,3,["ExportedServiceCount"]]],null]]]]],[1,"\\n "],[13],[1,"\\n\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,1],null,[["@name"],["actions"]],[["default"],[[[[1,"\\n"],[41,[28,[37,3],["delete peer"],[["item"],[[30,3]]]],[[[1,"\\n "],[8,[30,5],null,null,[["default"],[[[[1,"\\n"],[41,[28,[37,9],[[28,[37,3],["write peer"],[["item"],[[30,3]]]],[30,3,["isDialer"]]],null],[[[1," "],[8,[30,6],[[4,[38,10],["click",[28,[37,11],[[30,7],[30,3]],null]],null]],null,[["default"],[[[[1,"\\n "],[8,[39,1],null,[["@name"],["label"]],[["default"],[[[[1,"\\n Regenerate token\\n "]],[]]]]],[1,"\\n "]],[]]]]],[1,"\\n"]],[]],null],[1," "],[8,[30,6],null,[["@href"],[[28,[37,4],["dc.peers.show",[30,3,["Name"]]],null]]],[["default"],[[[[1,"\\n "],[8,[39,1],null,[["@name"],["label"]],[["default"],[[[[1,"\\n View\\n "]],[]]]]],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[30,6],[[24,0,"dangerous"]],[["@onclick"],[[28,[37,11],[[30,8],[30,3]],null]]],[["default"],[[[[1,"\\n "],[8,[39,1],null,[["@name"],["label"]],[["default"],[[[[1,"\\n Delete\\n "]],[]]]]],[1,"\\n "],[8,[39,1],null,[["@name"],["confirmation"]],[["default"],[[[[1,"\\n "],[8,[30,9],[[24,0,"warning"]],null,[["default"],[[[[1,"\\n "],[8,[39,1],null,[["@name"],["header"]],[["default"],[[[[1,"\\n Confirm delete\\n "]],[]]]]],[1,"\\n "],[8,[39,1],null,[["@name"],["body"]],[["default"],[[[[1,"\\n "],[10,2],[12],[1,"\\n Are you sure you want to delete this peer?\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,1],null,[["@name"],["confirm"]],[["default"],[[[[1,"\\n "],[8,[30,10],null,null,[["default"],[[[[1,"\\n Delete\\n "]],[]]]]],[1,"\\n "]],[10]]]]],[1,"\\n "]],[]]]]],[1,"\\n "]],[9]]]]],[1,"\\n "]],[]]]]],[1,"\\n "]],[6]]]]],[1,"\\n"]],[]],null],[1," "]],[5]]]]],[1,"\\n"]],[3,4]]]]]],["&attrs","@items","item","index","Actions","Action","@onedit","@ondelete","Confirmation","Confirm"],false,["list-collection","block-slot","if","can","href-to","peerings/badge","tooltip","t","format-number","and","on","fn"]]',moduleName:"consul-ui/components/consul/peer/list/index.hbs",isStrictMode:!1}) +var i=(0,t.setComponentTemplate)(r,(0,l.default)()) +e.default=i})),define("consul-ui/components/consul/peer/notifications/index",["exports","@ember/component","@ember/template-factory","@ember/component/template-only"],(function(e,t,n,l){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const r=(0,n.createTemplateFactory)({id:"OPH53/LC",block:'[[[41,[28,[37,1],[[30,1],"remove"],null],[[[1," "],[8,[39,2],[[17,2]],[["@color"],["success"]],[["default"],[[[[1,"\\n "],[8,[30,3,["Title"]],null,null,[["default"],[[[[1,"Success!"]],[]]]]],[1,"\\n "],[8,[30,3,["Description"]],null,null,[["default"],[[[[1,"\\n Your Peer has been marked for deletion.\\n "]],[]]]]],[1,"\\n "]],[3]]]]],[1,"\\n"]],[]],null]],["@type","&attrs","T"],false,["if","eq","hds/toast"]]',moduleName:"consul-ui/components/consul/peer/notifications/index.hbs",isStrictMode:!1}) +var i=(0,t.setComponentTemplate)(r,(0,l.default)()) +e.default=i})),define("consul-ui/components/consul/peer/search-bar/index",["exports","@ember/component","@ember/template-factory","@ember/component/template-only"],(function(e,t,n,l){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const r=(0,n.createTemplateFactory)({id:"pkHcu+gS",block:'[[[8,[39,0],[[24,0,"consul-peer-search-bar"],[17,1]],[["@filter"],[[30,2]]],[["status","search","filter","sort"],[[[[1,"\\n\\n"],[44,[[28,[37,2],[[28,[37,3],["components.consul.peer.search-bar.",[30,3,["status","key"]]],null]],[["default"],[[28,[37,4],[[28,[37,3],["common.search.",[30,3,["status","key"]]],null],[28,[37,3],["common.consul.",[30,3,["status","key"]]],null]],null]]]],[28,[37,2],[[28,[37,3],["components.consul.peer.search-bar.",[30,3,["status","value"]]],null]],[["default"],[[28,[37,4],[[28,[37,3],["common.search.",[30,3,["status","value"]]],null],[28,[37,3],["common.consul.",[30,3,["status","value"]]],null],[28,[37,3],["common.brand.",[30,3,["status","value"]]],null]],null]]]]],[[[1," "],[8,[30,3,["RemoveFilter"]],[[16,"aria-label",[28,[37,2],["common.ui.remove"],[["item"],[[28,[37,3],[[30,4]," ",[30,5]],null]]]]]],null,[["default"],[[[[1,"\\n "],[10,"dl"],[12],[1,"\\n "],[10,"dt"],[12],[1,[30,4]],[13],[1,"\\n "],[10,"dd"],[12],[1,[30,5]],[13],[1,"\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n"]],[4,5]]],[1,"\\n "]],[3]],[[[1,"\\n "],[8,[30,6,["Search"]],null,[["@onsearch","@value","@placeholder"],[[28,[37,5],[[30,0],[30,7]],null],[30,8],[28,[37,2],["common.search.search"],null]]],[["default"],[[[[1,"\\n "],[8,[30,6,["Select"]],[[24,0,"type-search-properties"]],[["@position","@onchange","@multiple","@required"],["right",[28,[37,5],[[30,0],[30,2,["searchproperty","change"]]],null],true,true]],[["default"],[[[[1,"\\n "],[8,[39,6],null,[["@name"],["selected"]],[["default"],[[[[1,"\\n "],[10,1],[12],[1,"\\n "],[1,[28,[35,2],["common.search.searchproperty"],null]],[1,"\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,6],null,[["@name"],["options"]],[["default"],[[[[1,"\\n"],[44,[[30,9,["Optgroup"]],[30,9,["Option"]]],[[[42,[28,[37,8],[[28,[37,8],[[30,2,["searchproperty","default"]]],null]],null],null,[[[1," "],[8,[30,11],null,[["@value","@selected"],[[30,12],[28,[37,9],[[30,12],[30,2,["searchproperty","value"]]],null]]],[["default"],[[[[1,"\\n "],[1,[28,[35,2],[[28,[37,3],["common.consul.",[28,[37,10],[[30,12]],null]],null]],null]],[1,"\\n "]],[]]]]],[1,"\\n"]],[12]],null]],[10,11]]],[1," "]],[]]]]],[1,"\\n "]],[9]]]]],[1,"\\n "]],[]]]]],[1,"\\n "]],[6]],[[[1,"\\n "],[8,[30,13,["Select"]],[[24,0,"type-state"]],[["@position","@onchange","@multiple"],["left",[28,[37,5],[[30,0],[30,2,["state","change"]]],null],true]],[["default"],[[[[1,"\\n "],[8,[39,6],null,[["@name"],["selected"]],[["default"],[[[[1,"\\n "],[10,1],[12],[1,"\\n "],[1,[28,[35,2],["components.consul.peer.search-bar.state.name"],null]],[1,"\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,6],null,[["@name"],["options"]],[["default"],[[[[1,"\\n"],[44,[[30,14,["Optgroup"]],[30,14,["Option"]]],[[[42,[28,[37,8],[[28,[37,8],[[28,[37,11],[[28,[37,12],["/models/peer"],[["export","from"],["schema","/components/consul/peer/search-bar"]]],"State.allowedValues"],null]],null]],null],null,[[[44,[[28,[37,13],[[30,17]],null]],[[[1," "],[8,[30,16],[[16,0,[29,["value-",[30,18]]]]],[["@value","@selected"],[[30,18],[28,[37,9],[[30,18],[30,2,["state","value"]]],null]]],[["default"],[[[[1,"\\n "],[10,1],[12],[1,"\\n "],[1,[28,[35,2],[[28,[37,3],["components.consul.peer.search-bar.state.options.",[30,18]],null]],null]],[1,"\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n"]],[18]]]],[17]],null]],[15,16]]],[1," "]],[]]]]],[1,"\\n "]],[14]]]]],[1,"\\n "]],[13]],[[[1,"\\n "],[8,[30,19,["Select"]],[[24,0,"type-sort"]],[["@position","@onchange","@multiple","@required"],["right",[28,[37,5],[[30,0],[30,20,["change"]]],null],false,true]],[["default"],[[[[1,"\\n "],[8,[39,6],null,[["@name"],["selected"]],[["default"],[[[[1,"\\n "],[10,1],[12],[1,"\\n"],[44,[[28,[37,14],[[28,[37,4],[[28,[37,4],["Name:asc",[28,[37,2],["common.sort.alpha.asc"],null]],null],[28,[37,4],["Name:desc",[28,[37,2],["common.sort.alpha.desc"],null]],null],[28,[37,4],["State:asc",[28,[37,2],["components.consul.peer.search-bar.sort.state.asc"],null]],null],[28,[37,4],["State:desc",[28,[37,2],["components.consul.peer.search-bar.sort.state.desc"],null]],null]],null]],null]],[[[1," "],[1,[28,[35,11],[[30,22],[30,20,["value"]]],null]],[1,"\\n"]],[22]]],[1," "],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,6],null,[["@name"],["options"]],[["default"],[[[[1,"\\n"],[44,[[30,21,["Optgroup"]],[30,21,["Option"]]],[[[1," "],[8,[30,23],null,[["@label"],[[28,[37,2],["components.consul.peer.search-bar.sort.state.name"],null]]],[["default"],[[[[1,"\\n "],[8,[30,24],null,[["@value","@selected"],["State:asc",[28,[37,15],["State:asc",[30,20,["value"]]],null]]],[["default"],[[[[1,[28,[35,2],["components.consul.peer.search-bar.sort.state.asc"],null]]],[]]]]],[1,"\\n "],[8,[30,24],null,[["@value","@selected"],["State:desc",[28,[37,15],["State:desc",[30,20,["value"]]],null]]],[["default"],[[[[1,[28,[35,2],["components.consul.peer.search-bar.sort.state.desc"],null]]],[]]]]],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[30,23],null,[["@label"],[[28,[37,2],["common.consul.name"],null]]],[["default"],[[[[1,"\\n "],[8,[30,24],null,[["@value","@selected"],["Name:asc",[28,[37,15],["Name:asc",[30,20,["value"]]],null]]],[["default"],[[[[1,[28,[35,2],["common.sort.alpha.asc"],null]]],[]]]]],[1,"\\n "],[8,[30,24],null,[["@value","@selected"],["Name:desc",[28,[37,15],["Name:desc",[30,20,["value"]]],null]]],[["default"],[[[[1,[28,[35,2],["common.sort.alpha.desc"],null]]],[]]]]],[1,"\\n "]],[]]]]],[1,"\\n"]],[23,24]]],[1," "]],[]]]]],[1,"\\n "]],[21]]]]],[1,"\\n "]],[19]]]]],[1,"\\n"]],["&attrs","@filter","search","key","value","search","@onsearch","@search","components","Optgroup","Option","prop","search","components","Optgroup","Option","upperState","state","search","@sort","components","selectable","Optgroup","Option"],false,["search-bar","let","t","concat","array","action","block-slot","each","-track-array","includes","lowercase","get","require","string-to-lower-case","from-entries","eq"]]',moduleName:"consul-ui/components/consul/peer/search-bar/index.hbs",isStrictMode:!1}) +var i=(0,t.setComponentTemplate)(r,(0,l.default)()) +e.default=i})),define("consul-ui/components/consul/peer/selector/index",["exports","@ember/component","@ember/template-factory","@ember/component/template-only"],(function(e,t,n,l){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const r=(0,n.createTemplateFactory)({id:"kl+7MwvJ",block:'[[[11,"li"],[24,0,"peers-separator"],[24,"role","separator"],[17,1],[12],[1,"\\n Organization\\n"],[13],[1,"\\n"],[10,"li"],[15,0,[52,[28,[37,1],["dc.peers",[30,2,["Name"]]],null],"is-active"]],[12],[1,"\\n "],[10,3],[15,6,[28,[37,2],["dc.peers",[30,2,["Name"]]],[["params"],[[28,[37,3],null,[["peer"],[[27]]]]]]]],[12],[1,"\\n Peers\\n "],[13],[1,"\\n"],[13],[1,"\\n\\n"]],["&attrs","@dc"],false,["if","is-href","href-to","hash"]]',moduleName:"consul-ui/components/consul/peer/selector/index.hbs",isStrictMode:!1}) +var i=(0,t.setComponentTemplate)(r,(0,l.default)()) +e.default=i})),define("consul-ui/components/consul/policy/list/index",["exports","@ember/component","@ember/template-factory","@ember/component/template-only"],(function(e,t,n,l){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const r=(0,n.createTemplateFactory)({id:"v5u90Yk1",block:'[[[8,[39,0],[[24,0,"consul-policy-list"]],[["@items"],[[30,1]]],[["default"],[[[[1,"\\n "],[8,[39,1],null,[["@name"],["header"]],[["default"],[[[[1,"\\n"],[41,[28,[37,3],[[28,[37,4],[[30,2]],null],"policy-management"],null],[[[1," "],[10,"dl"],[14,0,"policy-management"],[12],[1,"\\n "],[10,"dt"],[12],[1,"Type"],[13],[1,"\\n "],[10,"dd"],[12],[1,"\\n "],[8,[39,5],null,null,[["default"],[[[[1,"\\n Global Management Policy\\n "]],[]]]]],[1,"\\n "],[13],[1,"\\n "],[13],[1,"\\n"]],[]],null],[1," "],[10,3],[15,6,[28,[37,6],["dc.acls.policies.edit",[30,2,["ID"]]],null]],[15,0,[52,[28,[37,3],[[28,[37,4],[[30,2]],null],"policy-management"],null],"is-management"]],[12],[1,[30,2,["Name"]]],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,1],null,[["@name"],["details"]],[["default"],[[[[1,"\\n "],[10,"dl"],[14,0,"datacenter"],[12],[1,"\\n "],[10,"dt"],[12],[1,"\\n "],[8,[39,5],null,null,[["default"],[[[[1,"Datacenters"]],[]]]]],[1,"\\n "],[13],[1,"\\n "],[10,"dd"],[12],[1,"\\n "],[1,[28,[35,7],[", ",[28,[37,8],[[30,2]],null]],null]],[1,"\\n "],[13],[1,"\\n "],[13],[1,"\\n "],[10,"dl"],[14,0,"description"],[12],[1,"\\n "],[10,"dt"],[12],[1,"Description"],[13],[1,"\\n "],[10,"dd"],[12],[1,"\\n "],[1,[30,2,["Description"]]],[1,"\\n "],[13],[1,"\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,1],null,[["@name"],["actions"]],[["default"],[[[[1,"\\n "],[8,[30,3],null,null,[["default"],[[[[1,"\\n "],[8,[30,4],null,[["@href"],[[28,[37,6],["dc.acls.policies.edit",[30,2,["ID"]]],null]]],[["default"],[[[[1,"\\n "],[8,[39,1],null,[["@name"],["label"]],[["default"],[[[[1,"\\n"],[41,[28,[37,9],["write policy"],[["item"],[[30,2]]]],[[[1," Edit\\n"]],[]],[[[1," View\\n"]],[]]],[1," "]],[]]]]],[1,"\\n "]],[]]]]],[1,"\\n"],[41,[28,[37,9],["delete policy"],[["item"],[[30,2]]]],[[[1," "],[8,[30,4],[[24,0,"dangerous"]],[["@onclick"],[[28,[37,10],[[30,0],[30,5],[30,2]],null]]],[["default"],[[[[1,"\\n "],[8,[39,1],null,[["@name"],["label"]],[["default"],[[[[1,"\\n Delete\\n "]],[]]]]],[1,"\\n "],[8,[39,1],null,[["@name"],["confirmation"]],[["default"],[[[[1,"\\n "],[8,[30,6],[[24,0,"warning"]],null,[["default"],[[[[1,"\\n "],[8,[39,1],null,[["@name"],["header"]],[["default"],[[[[1,"\\n Confirm delete\\n "]],[]]]]],[1,"\\n "],[8,[39,1],null,[["@name"],["body"]],[["default"],[[[[1,"\\n "],[10,2],[12],[1,"\\n Are you sure you want to delete this policy?\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,1],null,[["@name"],["confirm"]],[["default"],[[[[1,"\\n "],[8,[30,7],null,null,[["default"],[[[[1,"Delete"]],[]]]]],[1,"\\n "]],[7]]]]],[1,"\\n "]],[]]]]],[1,"\\n "]],[6]]]]],[1,"\\n "]],[]]]]],[1,"\\n"]],[]],null],[1," "]],[4]]]]],[1,"\\n "]],[3]]]]],[1,"\\n"]],[2]]]]]],["@items","item","Actions","Action","@ondelete","Confirmation","Confirm"],false,["list-collection","block-slot","if","eq","policy/typeof","tooltip","href-to","join","policy/datacenters","can","action"]]',moduleName:"consul-ui/components/consul/policy/list/index.hbs",isStrictMode:!1}) +var i=(0,t.setComponentTemplate)(r,(0,l.default)()) +e.default=i})),define("consul-ui/components/consul/policy/notifications/index",["exports","@ember/component","@ember/template-factory","@ember/component/template-only"],(function(e,t,n,l){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const r=(0,n.createTemplateFactory)({id:"I7CTnbjl",block:'[[[41,[28,[37,1],[[30,1],"create"],null],[[[41,[28,[37,1],[[30,2],"success"],null],[[[1," Your policy has been added.\\n"]],[]],[[[1," There was an error adding your policy.\\n"]],[]]]],[]],[[[41,[28,[37,1],[[30,1],"update"],null],[[[41,[28,[37,1],[[30,2],"success"],null],[[[1," Your policy has been saved.\\n"]],[]],[[[1," There was an error saving your policy.\\n"]],[]]]],[]],[[[41,[28,[37,1],[[30,1],"delete"],null],[[[41,[28,[37,1],[[30,2],"success"],null],[[[1," Your policy was deleted.\\n"]],[]],[[[1," There was an error deleting your policy.\\n"]],[]]]],[]],null]],[]]]],[]]],[44,[[30,3,["errors","firstObject"]]],[[[41,[30,4,["detail"]],[[[1," "],[10,"br"],[12],[13],[1,[28,[35,3],["(",[52,[30,4,["status"]],[28,[37,3],[[30,4,["status"]],": "],null]],[30,4,["detail"]],")"],null]],[1,"\\n"]],[]],null]],[4]]]],["@type","@status","@error","error"],false,["if","eq","let","concat"]]',moduleName:"consul-ui/components/consul/policy/notifications/index.hbs",isStrictMode:!1}) +var i=(0,t.setComponentTemplate)(r,(0,l.default)()) +e.default=i})) +define("consul-ui/components/consul/policy/search-bar/index",["exports","@ember/component","@ember/template-factory","@glimmer/component"],(function(e,t,n,l){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const r=(0,n.createTemplateFactory)({id:"rNkB4Q1f",block:'[[[8,[39,0],[[24,0,"consul-policy-search-bar"],[17,1]],[["@filter"],[[30,2]]],[["status","search","filter","sort"],[[[[1,"\\n\\n"],[44,[[28,[37,2],[[28,[37,3],["components.consul.policy.search-bar.",[30,3,["status","key"]],".name"],null]],[["default"],[[28,[37,4],[[28,[37,3],["common.search.",[30,3,["status","key"]]],null],[28,[37,3],["common.consul.",[30,3,["status","key"]]],null]],null]]]],[28,[37,2],[[28,[37,3],["components.consul.policy.search-bar.",[30,3,["status","key"]],".options.",[30,3,["status","value"]]],null]],[["default"],[[28,[37,4],[[28,[37,3],["common.search.",[30,3,["status","value"]]],null],[28,[37,3],["common.consul.",[30,3,["status","value"]]],null],[28,[37,3],["common.brand.",[30,3,["status","value"]]],null]],null]]]]],[[[1," "],[8,[30,3,["RemoveFilter"]],[[16,"aria-label",[28,[37,2],["common.ui.remove"],[["item"],[[28,[37,3],[[30,4]," ",[30,5]],null]]]]]],null,[["default"],[[[[1,"\\n "],[10,"dl"],[12],[1,"\\n "],[10,"dt"],[12],[1,[30,4]],[13],[1,"\\n "],[10,"dd"],[12],[1,[52,[28,[37,6],[[30,3,["status","key"]],"datacenter"],null],[30,3,["status","value"]],[30,5]]],[13],[1,"\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n"]],[4,5]]],[1,"\\n "]],[3]],[[[1,"\\n "],[8,[30,6,["Search"]],null,[["@onsearch","@value","@placeholder"],[[28,[37,7],[[30,0],[30,7]],null],[30,8],[28,[37,2],["common.search.search"],null]]],[["default"],[[[[1,"\\n "],[8,[30,6,["Select"]],[[24,0,"type-search-properties"]],[["@position","@onchange","@multiple","@required"],["right",[28,[37,7],[[30,0],[30,2,["searchproperty","change"]]],null],true,true]],[["default"],[[[[1,"\\n "],[8,[39,8],null,[["@name"],["selected"]],[["default"],[[[[1,"\\n "],[10,1],[12],[1,"\\n "],[1,[28,[35,2],["common.search.searchproperty"],null]],[1,"\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,8],null,[["@name"],["options"]],[["default"],[[[[1,"\\n"],[44,[[30,9,["Optgroup"]],[30,9,["Option"]]],[[[42,[28,[37,10],[[28,[37,10],[[30,2,["searchproperty","default"]]],null]],null],null,[[[1," "],[8,[30,11],null,[["@value","@selected"],[[30,12],[28,[37,11],[[30,12],[30,2,["searchproperty","value"]]],null]]],[["default"],[[[[1,"\\n "],[1,[28,[35,2],[[28,[37,3],["common.consul.",[28,[37,12],[[30,12]],null]],null]],null]],[1,"\\n "]],[]]]]],[1,"\\n"]],[12]],null]],[10,11]]],[1," "]],[]]]]],[1,"\\n "]],[9]]]]],[1,"\\n "]],[]]]]],[1,"\\n "]],[6]],[[[1,"\\n "],[8,[30,13,["Select"]],[[24,0,"type-datacenter"]],[["@position","@onchange","@multiple"],["left",[28,[37,7],[[30,0],[30,2,["datacenter","change"]]],null],true]],[["default"],[[[[1,"\\n "],[8,[39,8],null,[["@name"],["selected"]],[["default"],[[[[1,"\\n "],[10,1],[12],[1,"\\n "],[1,[28,[35,2],["common.consul.datacenter"],null]],[1,"\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,8],null,[["@name"],["options"]],[["default"],[[[[1,"\\n"],[44,[[30,14,["Optgroup"]],[30,14,["Option"]]],[[[42,[28,[37,10],[[28,[37,10],[[33,13]],null]],null],null,[[[1," "],[8,[30,16],null,[["@value","@selected"],[[30,17,["Name"]],[28,[37,11],[[30,17,["Name"]],[30,2,["datacenter","value"]]],null]]],[["default"],[[[[1,[30,17,["Name"]]]],[]]]]],[1,"\\n"]],[17]],null],[1," "],[8,[39,14],null,[["@src","@loading","@onchange"],[[28,[37,15],["/${partition}/*/*/datacenters",[28,[37,16],null,[["partition"],[[30,18]]]]],null],"lazy",[28,[37,7],[[30,0],[28,[37,17],[[30,0,["dcs"]]],null]],[["value"],["data"]]]]],null],[1,"\\n"]],[15,16]]],[1," "]],[]]]]],[1,"\\n "]],[14]]]]],[1,"\\n "],[8,[30,13,["Select"]],[[24,0,"type-kind"]],[["@position","@onchange","@multiple"],["left",[28,[37,7],[[30,0],[30,2,["kind","change"]]],null],true]],[["default"],[[[[1,"\\n "],[8,[39,8],null,[["@name"],["selected"]],[["default"],[[[[1,"\\n "],[10,1],[12],[1,"\\n "],[1,[28,[35,2],["components.consul.policy.search-bar.kind.name"],null]],[1,"\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,8],null,[["@name"],["options"]],[["default"],[[[[1,"\\n"],[44,[[30,19,["Optgroup"]],[30,19,["Option"]]],[[[42,[28,[37,10],[[28,[37,10],[[28,[37,4],["global-management","standard"],null]],null]],null],null,[[[1," "],[8,[30,21],[[16,0,[29,["value-",[30,22]]]]],[["@value","@selected"],[[30,22],[28,[37,11],[[30,22],[30,2,["kind","value"]]],null]]],[["default"],[[[[1,"\\n "],[1,[28,[35,2],[[28,[37,3],["components.consul.policy.search-bar.kind.options.",[30,22]],null]],[["default"],[[28,[37,4],[[28,[37,3],["common.search.",[30,22]],null]],null]]]]],[1,"\\n "]],[]]]]],[1,"\\n"]],[22]],null]],[20,21]]],[1," "]],[]]]]],[1,"\\n "]],[19]]]]],[1,"\\n "]],[13]],[[[1,"\\n "],[8,[30,23,["Select"]],[[24,0,"type-sort"]],[["@position","@onchange","@multiple","@required"],["right",[28,[37,7],[[30,0],[30,24,["change"]]],null],false,true]],[["default"],[[[[1,"\\n "],[8,[39,8],null,[["@name"],["selected"]],[["default"],[[[[1,"\\n "],[10,1],[12],[1,"\\n"],[44,[[28,[37,18],[[28,[37,4],[[28,[37,4],["Name:asc",[28,[37,2],["common.sort.alpha.asc"],null]],null],[28,[37,4],["Name:desc",[28,[37,2],["common.sort.alpha.desc"],null]],null]],null]],null]],[[[1," "],[1,[28,[35,19],[[30,26],[30,24,["value"]]],null]],[1,"\\n"]],[26]]],[1," "],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,8],null,[["@name"],["options"]],[["default"],[[[[1,"\\n"],[44,[[30,25,["Optgroup"]],[30,25,["Option"]]],[[[1," "],[8,[30,27],null,[["@label"],[[28,[37,2],["common.ui.name"],null]]],[["default"],[[[[1,"\\n "],[8,[30,28],null,[["@value","@selected"],["Name:asc",[28,[37,6],["Name:asc",[30,24,["value"]]],null]]],[["default"],[[[[1,[28,[35,2],["common.sort.alpha.asc"],null]]],[]]]]],[1,"\\n "],[8,[30,28],null,[["@value","@selected"],["Name:desc",[28,[37,6],["Name:desc",[30,24,["value"]]],null]]],[["default"],[[[[1,[28,[35,2],["common.sort.alpha.desc"],null]]],[]]]]],[1,"\\n "]],[]]]]],[1,"\\n"]],[27,28]]],[1," "]],[]]]]],[1,"\\n "]],[25]]]]],[1,"\\n "]],[23]]]]],[1,"\\n"]],["&attrs","@filter","search","key","value","search","@onsearch","@search","components","Optgroup","Option","prop","search","components","Optgroup","Option","dc","@partition","components","Optgroup","Option","state","search","@sort","components","selectable","Optgroup","Option"],false,["search-bar","let","t","concat","array","if","eq","action","block-slot","each","-track-array","includes","lowercase","dcs","data-source","uri","hash","mut","from-entries","get"]]',moduleName:"consul-ui/components/consul/policy/search-bar/index.hbs",isStrictMode:!1}) +class i extends l.default{}e.default=i,(0,t.setComponentTemplate)(r,i)})),define("consul-ui/components/consul/role/list/index",["exports","@ember/component","@ember/template-factory","@ember/component/template-only"],(function(e,t,n,l){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const r=(0,n.createTemplateFactory)({id:"+f+3clGw",block:'[[[8,[39,0],[[24,0,"consul-role-list"],[17,1]],[["@items"],[[30,2]]],[["default"],[[[[1,"\\n "],[8,[39,1],null,[["@name"],["header"]],[["default"],[[[[1,"\\n "],[10,3],[15,6,[28,[37,2],["dc.acls.roles.edit",[30,3,["ID"]]],null]],[12],[1,[30,3,["Name"]]],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,1],null,[["@name"],["details"]],[["default"],[[[[1,"\\n "],[8,[39,3],null,[["@item"],[[30,3]]],null],[1,"\\n "],[10,"dl"],[12],[1,"\\n "],[10,"dt"],[12],[1,"Description"],[13],[1,"\\n "],[10,"dd"],[12],[1,"\\n "],[1,[30,3,["Description"]]],[1,"\\n "],[13],[1,"\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,1],null,[["@name"],["actions"]],[["default"],[[[[1,"\\n "],[8,[30,4],null,null,[["default"],[[[[1,"\\n "],[8,[30,5],null,[["@href"],[[28,[37,2],["dc.acls.roles.edit",[30,3,["ID"]]],null]]],[["default"],[[[[1,"\\n "],[8,[39,1],null,[["@name"],["label"]],[["default"],[[[[1,"\\n"],[41,[28,[37,5],["write role"],[["item"],[[30,3]]]],[[[1," Edit\\n"]],[]],[[[1," View\\n"]],[]]],[1," "]],[]]]]],[1,"\\n "]],[]]]]],[1,"\\n"],[41,[28,[37,5],["delete role"],[["item"],[[30,3]]]],[[[1," "],[8,[30,5],[[24,0,"dangerous"]],[["@onclick"],[[28,[37,6],[[30,0],[30,6],[30,3]],null]]],[["default"],[[[[1,"\\n "],[8,[39,1],null,[["@name"],["label"]],[["default"],[[[[1,"\\n Delete\\n "]],[]]]]],[1,"\\n "],[8,[39,1],null,[["@name"],["confirmation"]],[["default"],[[[[1,"\\n "],[8,[30,7],[[24,0,"warning"]],null,[["default"],[[[[1,"\\n "],[8,[39,1],null,[["@name"],["header"]],[["default"],[[[[1,"\\n Confirm delete\\n "]],[]]]]],[1,"\\n "],[8,[39,1],null,[["@name"],["body"]],[["default"],[[[[1,"\\n "],[10,2],[12],[1,"\\n Are you sure you want to delete this role?\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,1],null,[["@name"],["confirm"]],[["default"],[[[[1,"\\n "],[8,[30,8],null,null,[["default"],[[[[1,"Delete"]],[]]]]],[1,"\\n "]],[8]]]]],[1,"\\n "]],[]]]]],[1,"\\n "]],[7]]]]],[1,"\\n "]],[]]]]],[1,"\\n"]],[]],null],[1," "]],[5]]]]],[1,"\\n "]],[4]]]]],[1,"\\n"]],[3]]]]]],["&attrs","@items","item","Actions","Action","@ondelete","Confirmation","Confirm"],false,["list-collection","block-slot","href-to","consul/token/ruleset/list","if","can","action"]]',moduleName:"consul-ui/components/consul/role/list/index.hbs",isStrictMode:!1}) +var i=(0,t.setComponentTemplate)(r,(0,l.default)()) +e.default=i})),define("consul-ui/components/consul/role/notifications/index",["exports","@ember/component","@ember/template-factory","@ember/component/template-only"],(function(e,t,n,l){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const r=(0,n.createTemplateFactory)({id:"3IiB4HcR",block:'[[[41,[28,[37,1],[[30,1],"create"],null],[[[41,[28,[37,1],[[30,2],"success"],null],[[[1," Your role has been added.\\n"]],[]],[[[1," There was an error adding your role.\\n"]],[]]]],[]],[[[41,[28,[37,1],[[30,1],"update"],null],[[[41,[28,[37,1],[[30,2],"success"],null],[[[1," Your role has been saved.\\n"]],[]],[[[1," There was an error saving your role.\\n"]],[]]]],[]],[[[41,[28,[37,1],[[30,1],"delete"],null],[[[41,[28,[37,1],[[30,2],"success"],null],[[[1," Your role was deleted.\\n"]],[]],[[[1," There was an error deleting your role.\\n"]],[]]]],[]],null]],[]]]],[]]],[44,[[30,3,["errors","firstObject"]]],[[[41,[30,4,["detail"]],[[[1," "],[10,"br"],[12],[13],[1,[28,[35,3],["(",[52,[30,4,["status"]],[28,[37,3],[[30,4,["status"]],": "],null]],[30,4,["detail"]],")"],null]],[1,"\\n"]],[]],null]],[4]]]],["@type","@status","@error","error"],false,["if","eq","let","concat"]]',moduleName:"consul-ui/components/consul/role/notifications/index.hbs",isStrictMode:!1}) +var i=(0,t.setComponentTemplate)(r,(0,l.default)()) +e.default=i})),define("consul-ui/components/consul/role/search-bar/index",["exports","@ember/component","@ember/template-factory","@ember/component/template-only"],(function(e,t,n,l){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const r=(0,n.createTemplateFactory)({id:"aNFJl995",block:'[[[8,[39,0],[[24,0,"consul-role-search-bar"],[17,1]],[["@filter"],[[30,2]]],[["status","search","sort"],[[[[1,"\\n\\n"],[44,[[28,[37,2],[[28,[37,3],["components.consul.role.search-bar.",[30,3,["status","key"]],".name"],null]],[["default"],[[28,[37,4],[[28,[37,3],["common.search.",[30,3,["status","key"]]],null],[28,[37,3],["common.consul.",[30,3,["status","key"]]],null]],null]]]],[28,[37,2],[[28,[37,3],["components.consul.role.search-bar.",[30,3,["status","key"]],".options.",[30,3,["status","value"]]],null]],[["default"],[[28,[37,4],[[28,[37,3],["common.search.",[30,3,["status","value"]]],null],[28,[37,3],["common.consul.",[30,3,["status","value"]]],null],[28,[37,3],["common.brand.",[30,3,["status","value"]]],null]],null]]]]],[[[1," "],[8,[30,3,["RemoveFilter"]],[[16,"aria-label",[28,[37,2],["common.ui.remove"],[["item"],[[28,[37,3],[[30,4]," ",[30,5]],null]]]]]],null,[["default"],[[[[1,"\\n "],[10,"dl"],[12],[1,"\\n "],[10,"dt"],[12],[1,[30,4]],[13],[1,"\\n "],[10,"dd"],[12],[1,[30,5]],[13],[1,"\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n"]],[4,5]]],[1,"\\n "]],[3]],[[[1,"\\n "],[8,[30,6,["Search"]],null,[["@onsearch","@value","@placeholder"],[[28,[37,5],[[30,0],[30,7]],null],[30,8],[28,[37,2],["common.search.search"],null]]],[["default"],[[[[1,"\\n "],[8,[30,6,["Select"]],[[24,0,"type-search-properties"]],[["@position","@onchange","@multiple","@required"],["right",[28,[37,5],[[30,0],[30,2,["searchproperty","change"]]],null],true,true]],[["default"],[[[[1,"\\n "],[8,[39,6],null,[["@name"],["selected"]],[["default"],[[[[1,"\\n "],[10,1],[12],[1,"\\n "],[1,[28,[35,2],["common.search.searchproperty"],null]],[1,"\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,6],null,[["@name"],["options"]],[["default"],[[[[1,"\\n"],[44,[[30,9,["Optgroup"]],[30,9,["Option"]]],[[[42,[28,[37,8],[[28,[37,8],[[30,2,["searchproperty","default"]]],null]],null],null,[[[1," "],[8,[30,11],null,[["@value","@selected"],[[30,12],[28,[37,9],[[30,12],[30,2,["searchproperty","value"]]],null]]],[["default"],[[[[1,"\\n "],[1,[28,[35,2],[[28,[37,3],["common.consul.",[28,[37,10],[[30,12]],null]],null]],null]],[1,"\\n "]],[]]]]],[1,"\\n"]],[12]],null]],[10,11]]],[1," "]],[]]]]],[1,"\\n "]],[9]]]]],[1,"\\n "]],[]]]]],[1,"\\n "]],[6]],[[[1,"\\n "],[8,[30,13,["Select"]],[[24,0,"type-sort"]],[["@position","@onchange","@multiple","@required"],["right",[28,[37,5],[[30,0],[30,14,["change"]]],null],false,true]],[["default"],[[[[1,"\\n "],[8,[39,6],null,[["@name"],["selected"]],[["default"],[[[[1,"\\n "],[10,1],[12],[1,"\\n"],[44,[[28,[37,11],[[28,[37,4],[[28,[37,4],["Name:asc",[28,[37,2],["common.sort.alpha.asc"],null]],null],[28,[37,4],["Name:desc",[28,[37,2],["common.sort.alpha.desc"],null]],null],[28,[37,4],["CreateIndex:desc",[28,[37,2],["common.sort.age.desc"],null]],null],[28,[37,4],["CreateIndex:asc",[28,[37,2],["common.sort.age.asc"],null]],null]],null]],null]],[[[1," "],[1,[28,[35,12],[[30,16],[30,14,["value"]]],null]],[1,"\\n"]],[16]]],[1," "],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,6],null,[["@name"],["options"]],[["default"],[[[[1,"\\n"],[44,[[30,15,["Optgroup"]],[30,15,["Option"]]],[[[1," "],[8,[30,17],null,[["@label"],[[28,[37,2],["common.ui.name"],null]]],[["default"],[[[[1,"\\n "],[8,[30,18],null,[["@value","@selected"],["Name:asc",[28,[37,13],["Name:asc",[30,14,["value"]]],null]]],[["default"],[[[[1,[28,[35,2],["common.sort.alpha.asc"],null]]],[]]]]],[1,"\\n "],[8,[30,18],null,[["@value","@selected"],["Name:desc",[28,[37,13],["Name:desc",[30,14,["value"]]],null]]],[["default"],[[[[1,[28,[35,2],["common.sort.alpha.desc"],null]]],[]]]]],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[30,17],null,[["@label"],[[28,[37,2],["common.ui.creation"],null]]],[["default"],[[[[1,"\\n "],[8,[30,18],null,[["@value","@selected"],["CreateIndex:desc",[28,[37,13],["CreateIndex:desc",[30,14,["value"]]],null]]],[["default"],[[[[1,[28,[35,2],["common.sort.age.desc"],null]]],[]]]]],[1,"\\n "],[8,[30,18],null,[["@value","@selected"],["CreateIndex:asc",[28,[37,13],["CreateIndex:asc",[30,14,["value"]]],null]]],[["default"],[[[[1,[28,[35,2],["common.sort.age.asc"],null]]],[]]]]],[1,"\\n "]],[]]]]],[1,"\\n"]],[17,18]]],[1," "]],[]]]]],[1,"\\n "]],[15]]]]],[1,"\\n "]],[13]]]]],[1,"\\n"]],["&attrs","@filter","search","key","value","search","@onsearch","@search","components","Optgroup","Option","prop","search","@sort","components","selectable","Optgroup","Option"],false,["search-bar","let","t","concat","array","action","block-slot","each","-track-array","includes","lowercase","from-entries","get","eq"]]',moduleName:"consul-ui/components/consul/role/search-bar/index.hbs",isStrictMode:!1}) +var i=(0,t.setComponentTemplate)(r,(0,l.default)()) +e.default=i})),define("consul-ui/components/consul/server/card/index",["exports","@ember/component","@ember/template-factory","@ember/component/template-only"],(function(e,t,n,l){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const r=(0,n.createTemplateFactory)({id:"3gOA2+ED",block:'[[[11,0],[16,0,[28,[37,0],["consul-server-card",[28,[37,1],["voting-status-leader",[28,[37,2],[[30,1,["Status"]],"leader"],null]],null],[28,[37,1],["voting-status-voter",[28,[37,3],[[28,[37,4],[[30,1,["ReadReplica"]]],null],[28,[37,2],[[30,1,["Status"]],"voter"],null]],null]],null],[28,[37,1],["voting-status-non-voter",[28,[37,5],[[30,1,["ReadReplica"]],[28,[37,6],[[30,1,["Status"]],[28,[37,1],["non-voter","staging"],null]],null]],null]],null]],null]],[17,2],[12],[1,"\\n "],[10,"dl"],[12],[1,"\\n\\n "],[11,"dt"],[24,0,"name"],[4,[38,7],["Leader"],null],[12],[1,"\\n "],[13],[1,"\\n "],[10,"dd"],[12],[1,"\\n "],[1,[30,1,["Name"]]],[1,"\\n "],[13],[1,"\\n\\n "],[10,"dt"],[15,0,[28,[37,0],["health-status",[28,[37,1],["healthy",[30,1,["Healthy"]]],null]],null]],[12],[1,"\\n Status\\n "],[13],[1,"\\n "],[10,"dd"],[12],[1,"\\n "],[1,[52,[28,[37,6],[[30,1,["Status"]],[28,[37,1],["leader","voter"],null]],null],"Active voter","Backup voter"]],[1,"\\n "],[13],[1,"\\n\\n "],[13],[1,"\\n"],[13],[1,"\\n\\n"]],["@item","&attrs"],false,["class-map","array","eq","and","not","or","includes","tooltip","if"]]',moduleName:"consul-ui/components/consul/server/card/index.hbs",isStrictMode:!1}) +var i=(0,t.setComponentTemplate)(r,(0,l.default)()) +e.default=i})),define("consul-ui/components/consul/server/list/index",["exports","@ember/component","@ember/template-factory","@ember/component/template-only"],(function(e,t,n,l){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const r=(0,n.createTemplateFactory)({id:"L4k4YQfd",block:'[[[11,0],[16,0,[28,[37,0],["consul-server-list"],null]],[17,1],[12],[1,"\\n "],[10,"ul"],[12],[1,"\\n"],[42,[28,[37,2],[[28,[37,2],[[30,2]],null]],null],null,[[[1," "],[10,"li"],[12],[1,"\\n "],[10,3],[15,6,[28,[37,3],["dc.nodes.show",[30,3,["Name"]]],null]],[12],[1,"\\n "],[8,[39,4],null,[["@item"],[[30,3]]],null],[1,"\\n "],[13],[1,"\\n "],[13],[1,"\\n"]],[3]],null],[1," "],[13],[1,"\\n"],[13],[1,"\\n\\n"]],["&attrs","@items","item"],false,["class-map","each","-track-array","href-to","consul/server/card"]]',moduleName:"consul-ui/components/consul/server/list/index.hbs",isStrictMode:!1}) +var i=(0,t.setComponentTemplate)(r,(0,l.default)()) +e.default=i})),define("consul-ui/components/consul/service-identity/template/index",["exports","@ember/component","@ember/template-factory","@ember/component/template-only"],(function(e,t,n,l){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const r=(0,n.createTemplateFactory)({id:"/FDJj0m3",block:'[[[41,[28,[37,1],["use partitions"],null],[[[1,"partition \\""],[1,[28,[35,2],[[30,1],"default"],null]],[1,"\\" {\\n"],[41,[28,[37,1],["use nspaces"],null],[[[1," namespace \\""],[1,[28,[35,2],[[30,2],"default"],null]],[1,"\\" {\\n service \\""],[1,[30,3]],[1,"\\" {\\n\\t policy = \\"write\\"\\n }\\n service \\""],[1,[30,3]],[1,"-sidecar-proxy\\" {\\n\\t policy = \\"write\\"\\n }\\n service_prefix \\"\\" {\\n\\t policy = \\"read\\"\\n }\\n node_prefix \\"\\" {\\n\\t policy = \\"read\\"\\n }\\n }\\n"]],[]],[[[1," service \\""],[1,[30,3]],[1,"\\" {\\n\\t policy = \\"write\\"\\n }\\n service \\""],[1,[30,3]],[1,"-sidecar-proxy\\" {\\n\\t policy = \\"write\\"\\n }\\n service_prefix \\"\\" {\\n\\t policy = \\"read\\"\\n }\\n node_prefix \\"\\" {\\n\\t policy = \\"read\\"\\n }\\n"]],[]]],[1,"}\\n"]],[]],[[[41,[28,[37,1],["use nspaces"],null],[[[1,"namespace \\""],[1,[28,[35,2],[[30,2],"default"],null]],[1,"\\" {\\n service \\""],[1,[30,3]],[1,"\\" {\\n\\t policy = \\"write\\"\\n }\\n service \\""],[1,[30,3]],[1,"-sidecar-proxy\\" {\\n\\t policy = \\"write\\"\\n }\\n service_prefix \\"\\" {\\n\\t policy = \\"read\\"\\n }\\n node_prefix \\"\\" {\\n\\t policy = \\"read\\"\\n }\\n}\\n"]],[]],[[[1,"service \\""],[1,[30,3]],[1,"\\" {\\n\\tpolicy = \\"write\\"\\n}\\nservice \\""],[1,[30,3]],[1,"-sidecar-proxy\\" {\\n\\tpolicy = \\"write\\"\\n}\\nservice_prefix \\"\\" {\\n\\tpolicy = \\"read\\"\\n}\\nnode_prefix \\"\\" {\\n\\tpolicy = \\"read\\"\\n}\\n"]],[]]]],[]]]],["@partition","@nspace","@name"],false,["if","can","or"]]',moduleName:"consul-ui/components/consul/service-identity/template/index.hbs",isStrictMode:!1}) +var i=(0,t.setComponentTemplate)(r,(0,l.default)()) +e.default=i})),define("consul-ui/components/consul/service-instance/list/index",["exports","@ember/component","@ember/template-factory","@glimmer/component"],(function(e,t,n,l){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const r=(0,n.createTemplateFactory)({id:"MaR0UaLj",block:'[[[44,[[28,[37,1],[[30,1],"Service.Proxy.DestinationServiceID"],null]],[[[8,[39,2],[[24,0,"consul-service-instance-list"],[17,3]],[["@items"],[[30,4]]],[["default"],[[[[1,"\\n "],[8,[39,3],null,[["@name"],["header"]],[["default"],[[[[1,"\\n"],[41,[28,[37,5],[[30,7],"dc.services.show"],null],[[[1," "],[10,3],[15,6,[28,[37,6],[[30,7],[30,5,["Service","Service"]]],null]],[12],[1,"\\n "],[1,[30,5,["Service","ID"]]],[1,"\\n "],[13],[1,"\\n"]],[]],[[[1," "],[10,3],[15,6,[28,[37,6],[[30,7],[30,5,["Service","Service"]],[30,5,["Node","Node"]],[28,[37,7],[[30,5,["Service","ID"]],[30,5,["Service","Service"]]],null]],null]],[12],[1,"\\n "],[1,[30,5,["Service","ID"]]],[1,"\\n "],[13],[1,"\\n"]],[]]],[1," "]],[]]]]],[1,"\\n "],[8,[39,3],null,[["@name"],["details"]],[["default"],[[[[1,"\\n\\n"],[44,[[28,[37,8],[[30,2],[30,5,["Service","ID"]]],null]],[[[44,[[28,[37,9],[[28,[37,10],[[30,5,["Checks"]],[28,[37,7],[[30,8,["Checks"]],[28,[37,10],null,null]],null]],null]],null]],[[[1,"\\n"],[41,[30,10],[[[1," "],[8,[39,11],null,[["@item"],[[30,5,["Service"]]]],null],[1,"\\n "],[8,[39,12],null,[["@type","@items"],["service",[28,[37,13],["ServiceID","",[30,9]],null]]],null],[1,"\\n"]],[]],[[[41,[51,[30,0,["areAllExternalSourcesMatching"]]],[[[1," "],[8,[39,11],null,[["@item"],[[30,5,["Service"]]]],null],[1,"\\n"]],[]],null],[1,"\\n "],[8,[39,12],null,[["@type","@items"],["service",[28,[37,13],["ServiceID","",[30,9]],null]]],null],[1,"\\n\\n"],[41,[51,[30,5,["Node","Meta","synthetic-node"]]],[[[1," "],[8,[39,12],null,[["@type","@items"],["node",[28,[37,15],["ServiceID","",[30,9]],null]]],null],[1,"\\n"]],[]],null]],[]]],[41,[30,8],[[[1," "],[10,"dl"],[14,0,"mesh"],[12],[1,"\\n "],[10,"dt"],[12],[1,"\\n "],[8,[39,16],null,null,[["default"],[[[[1,"\\n This service uses a proxy for the Consul service mesh\\n "]],[]]]]],[1,"\\n "],[13],[1,"\\n "],[10,"dd"],[12],[1,"\\n in service mesh with proxy\\n "],[13],[1,"\\n "],[13],[1,"\\n"]],[]],null],[41,[28,[37,17],[[28,[37,18],[[30,10]],null],[28,[37,18],[[30,5,["Node","Meta","synthetic-node"]]],null]],null],[[[1," "],[10,"dl"],[14,0,"node"],[12],[1,"\\n "],[10,"dt"],[12],[1,"\\n "],[8,[39,16],null,null,[["default"],[[[[1,"\\n Node\\n "]],[]]]]],[1,"\\n "],[13],[1,"\\n "],[10,"dd"],[12],[1,"\\n "],[10,3],[15,6,[28,[37,6],["dc.nodes.show",[30,5,["Node","Node"]]],null]],[12],[1,[30,5,["Node","Node"]]],[13],[1,"\\n "],[13],[1,"\\n "],[13],[1,"\\n"]],[]],null],[41,[30,5,["Service","Port"]],[[[1," "],[10,"dl"],[14,0,"address"],[12],[1,"\\n "],[10,"dt"],[12],[1,"\\n "],[8,[39,16],null,null,[["default"],[[[[1,"\\n IP Address and Port\\n "]],[]]]]],[1,"\\n "],[13],[1,"\\n "],[10,"dd"],[12],[1,"\\n"],[41,[28,[37,19],[[30,5,["Service","Address"]],""],null],[[[1," "],[1,[30,5,["Service","Address"]]],[1,":"],[1,[30,5,["Service","Port"]]],[1,"\\n"]],[]],[[[1," "],[1,[30,5,["Node","Address"]]],[1,":"],[1,[30,5,["Service","Port"]]],[1,"\\n"]],[]]],[1," "],[13],[1,"\\n "],[13],[1,"\\n"]],[]],[[[41,[30,5,["Service","SocketPath"]],[[[1," "],[10,"dl"],[14,0,"socket"],[12],[1,"\\n "],[11,"dt"],[4,[38,16],null,null],[12],[1,"\\n Socket Path\\n "],[13],[1,"\\n "],[10,"dd"],[12],[1,"\\n "],[1,[30,5,["Service","SocketPath"]]],[1,"\\n "],[13],[1,"\\n "],[13],[1,"\\n"]],[]],null]],[]]],[1," "],[8,[39,20],null,[["@item"],[[30,5,["Service"]]]],null],[1,"\\n\\n"]],[9]]]],[8]]],[1,"\\n "]],[]]]]],[1,"\\n"]],[5,6]]]]],[1,"\\n"]],[2]]]],["@proxies","proxies","&attrs","@items","item","index","@routeName","proxy","checks","@node"],false,["let","to-hash","list-collection","block-slot","if","eq","href-to","or","get","merge-checks","array","consul/external-source","consul/instance-checks","filter-by","unless","reject-by","tooltip","and","not","not-eq","tag-list"]]',moduleName:"consul-ui/components/consul/service-instance/list/index.hbs",isStrictMode:!1}) +class i extends l.default{get areAllExternalSourcesMatching(){var e,t,n +const l=null===(e=this.args.items[0])||void 0===e||null===(t=e.Service)||void 0===t||null===(n=t.Meta)||void 0===n?void 0:n["external-source"] +return this.args.items.every((e=>{var t,n +return(null===(t=e.Service)||void 0===t||null===(n=t.Meta)||void 0===n?void 0:n["external-source"])===l}))}}e.default=i,(0,t.setComponentTemplate)(r,i)})),define("consul-ui/components/consul/service-instance/search-bar/index",["exports","@ember/component","@ember/template-factory","@ember/component/template-only"],(function(e,t,n,l){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const r=(0,n.createTemplateFactory)({id:"sxcYe4gj",block:'[[[8,[39,0],[[24,0,"consul-service-instance-search-bar"],[17,1]],[["@filter"],[[30,2]]],[["status","search","filter","sort"],[[[[1,"\\n\\n"],[44,[[28,[37,2],[[28,[37,3],["components.consul.service-instance.search-bar.",[30,3,["status","key"]],".name"],null]],[["default"],[[28,[37,4],[[28,[37,3],["common.search.",[30,3,["status","key"]]],null],[28,[37,3],["common.consul.",[30,3,["status","key"]]],null]],null]]]],[28,[37,2],[[28,[37,3],["components.consul.service-instance.search-bar.",[30,3,["status","key"]],".options.",[30,3,["status","value"]]],null]],[["default"],[[28,[37,4],[[28,[37,3],["common.search.",[30,3,["status","value"]]],null],[28,[37,3],["common.consul.",[30,3,["status","value"]]],null],[28,[37,3],["common.brand.",[30,3,["status","value"]]],null]],null]]]]],[[[1," "],[8,[30,3,["RemoveFilter"]],[[16,"aria-label",[28,[37,2],["common.ui.remove"],[["item"],[[28,[37,3],[[30,4]," ",[30,5]],null]]]]]],null,[["default"],[[[[1,"\\n "],[10,"dl"],[12],[1,"\\n "],[10,"dt"],[12],[1,[30,4]],[13],[1,"\\n "],[10,"dd"],[12],[1,[30,5]],[13],[1,"\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n"]],[4,5]]],[1,"\\n "]],[3]],[[[1,"\\n "],[8,[30,6,["Search"]],null,[["@onsearch","@value","@placeholder"],[[28,[37,5],[[30,0],[30,7]],null],[30,8],[28,[37,2],["common.search.search"],null]]],[["default"],[[[[1,"\\n"],[41,[30,2,["searchproperty"]],[[[1," "],[8,[30,6,["Select"]],[[24,0,"type-search-properties"]],[["@position","@onchange","@multiple","@required"],["right",[28,[37,5],[[30,0],[30,2,["searchproperty","change"]]],null],true,true]],[["default"],[[[[1,"\\n "],[8,[39,7],null,[["@name"],["selected"]],[["default"],[[[[1,"\\n "],[10,1],[12],[1,"\\n "],[1,[28,[35,2],["common.search.searchproperty"],null]],[1,"\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,7],null,[["@name"],["options"]],[["default"],[[[[1,"\\n"],[44,[[30,9,["Option"]]],[[[42,[28,[37,9],[[28,[37,9],[[30,2,["searchproperty","default"]]],null]],null],null,[[[1," "],[8,[30,10],null,[["@value","@selected"],[[30,11],[28,[37,10],[[30,11],[30,2,["searchproperty","value"]]],null]]],[["default"],[[[[1,"\\n "],[1,[28,[35,2],[[28,[37,3],["common.consul.",[28,[37,11],[[30,11]],null]],null]],null]],[1,"\\n "]],[]]]]],[1,"\\n"]],[11]],null]],[10]]],[1," "]],[]]]]],[1,"\\n "]],[9]]]]],[1,"\\n"]],[]],null],[1," "]],[]]]]],[1,"\\n "]],[6]],[[[1,"\\n "],[8,[30,12,["Select"]],[[24,0,"type-status"]],[["@position","@onchange","@multiple"],["left",[28,[37,5],[[30,0],[30,2,["status","change"]]],null],true]],[["default"],[[[[1,"\\n "],[8,[39,7],null,[["@name"],["selected"]],[["default"],[[[[1,"\\n "],[10,1],[12],[1,"\\n "],[1,[28,[35,2],["common.consul.status"],null]],[1,"\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,7],null,[["@name"],["options"]],[["default"],[[[[1,"\\n"],[44,[[30,13,["Optgroup"]],[30,13,["Option"]]],[[[42,[28,[37,9],[[28,[37,9],[[28,[37,4],["passing","warning","critical","empty"],null]],null]],null],null,[[[1," "],[8,[30,15],[[16,0,[29,["value-",[30,16]]]]],[["@value","@selected"],[[30,16],[28,[37,10],[[30,16],[30,2,["status","value"]]],null]]],[["default"],[[[[1,"\\n "],[1,[28,[35,2],[[28,[37,3],["common.consul.",[30,16]],null]],[["default"],[[28,[37,4],[[28,[37,3],["common.search.",[30,16]],null]],null]]]]],[1,"\\n "]],[]]]]],[1,"\\n"]],[16]],null]],[14,15]]],[1," "]],[]]]]],[1,"\\n "]],[13]]]]],[1,"\\n"],[41,[28,[37,12],[[30,17,["length"]],0],null],[[[1," "],[8,[30,12,["Select"]],[[24,0,"type-source"]],[["@position","@onchange","@multiple"],["left",[28,[37,5],[[30,0],[30,2,["source","change"]]],null],true]],[["default"],[[[[1,"\\n "],[8,[39,13],null,[["@components","@filter","@sources"],[[30,18],[30,2],[30,17]]],null],[1,"\\n "]],[18]]]]],[1,"\\n"]],[]],null],[1," "]],[12]],[[[1,"\\n "],[8,[30,19,["Select"]],[[24,0,"type-sort"]],[["@position","@onchange","@multiple","@required"],["right",[28,[37,5],[[30,0],[30,20,["change"]]],null],false,true]],[["default"],[[[[1,"\\n "],[8,[39,7],null,[["@name"],["selected"]],[["default"],[[[[1,"\\n "],[10,1],[12],[1,"\\n"],[44,[[28,[37,14],[[28,[37,4],[[28,[37,4],["Name:asc",[28,[37,2],["common.sort.alpha.asc"],null]],null],[28,[37,4],["Name:desc",[28,[37,2],["common.sort.alpha.desc"],null]],null],[28,[37,4],["Status:asc",[28,[37,2],["common.sort.status.asc"],null]],null],[28,[37,4],["Status:desc",[28,[37,2],["common.sort.status.desc"],null]],null]],null]],null]],[[[1," "],[1,[28,[35,15],[[30,22],[30,20,["value"]]],null]],[1,"\\n"]],[22]]],[1," "],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,7],null,[["@name"],["options"]],[["default"],[[[[1,"\\n"],[44,[[30,21,["Optgroup"]],[30,21,["Option"]]],[[[1," "],[8,[30,23],null,[["@label"],[[28,[37,2],["common.consul.status"],null]]],[["default"],[[[[1,"\\n "],[8,[30,24],null,[["@value","@selected"],["Status:asc",[28,[37,16],["Status:asc",[30,20,["value"]]],null]]],[["default"],[[[[1,[28,[35,2],["common.sort.status.asc"],null]]],[]]]]],[1,"\\n "],[8,[30,24],null,[["@value","@selected"],["Status:desc",[28,[37,16],["Status:desc",[30,20,["value"]]],null]]],[["default"],[[[[1,[28,[35,2],["common.sort.status.desc"],null]]],[]]]]],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[30,23],null,[["@label"],[[28,[37,2],["components.consul.service-instance.search-bar.sort.name.name"],null]]],[["default"],[[[[1,"\\n "],[8,[30,24],null,[["@value","@selected"],["Name:asc",[28,[37,16],["Name:asc",[30,20,["value"]]],null]]],[["default"],[[[[1,[28,[35,2],["common.sort.alpha.asc"],null]]],[]]]]],[1,"\\n "],[8,[30,24],null,[["@value","@selected"],["Name:desc",[28,[37,16],["Name:desc",[30,20,["value"]]],null]]],[["default"],[[[[1,[28,[35,2],["common.sort.alpha.desc"],null]]],[]]]]],[1,"\\n "]],[]]]]],[1,"\\n"]],[23,24]]],[1," "]],[]]]]],[1,"\\n "]],[21]]]]],[1,"\\n "]],[19]]]]],[1,"\\n"]],["&attrs","@filter","search","key","value","search","@onsearch","@search","components","Option","prop","search","components","Optgroup","Option","state","@sources","components","search","@sort","components","selectable","Optgroup","Option"],false,["search-bar","let","t","concat","array","action","if","block-slot","each","-track-array","includes","lowercase","gt","consul/sources-select","from-entries","get","eq"]]',moduleName:"consul-ui/components/consul/service-instance/search-bar/index.hbs",isStrictMode:!1}) +var i=(0,t.setComponentTemplate)(r,(0,l.default)()) +e.default=i})),define("consul-ui/components/consul/service/list/index",["exports","@ember/component","@ember/template-factory","@ember/component/template-only"],(function(e,t,n,l){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const r=(0,n.createTemplateFactory)({id:"SaF5GIVw",block:'[[[8,[39,0],[[24,0,"consul-service-list"],[17,1]],[["@items","@linkable"],[[30,2],"linkable service"]],[["default"],[[[[1,"\\n "],[8,[39,1],null,[["@name"],["header"]],[["default"],[[[[1,"\\n "],[10,"dl"],[15,0,[30,3,["MeshStatus"]]],[12],[1,"\\n "],[10,"dt"],[12],[1,"\\n Health\\n "],[13],[1,"\\n "],[11,"dd"],[4,[38,2],[[30,3,["healthTooltipText"]]],null],[12],[13],[1,"\\n "],[13],[1,"\\n"],[41,[28,[37,4],[[30,3,["InstanceCount"]],0],null],[[[1," "],[10,3],[15,6,[28,[37,5],["dc.services.show.index",[30,3,["Name"]]],[["params"],[[52,[28,[37,6],[[30,3,["Partition"]],[30,5]],null],[28,[37,7],null,[["partition","nspace","peer"],[[30,3,["Partition"]],[30,3,["Namespace"]],[30,3,["PeerName"]]]]],[28,[37,7],null,[["peer"],[[30,3,["PeerName"]]]]]]]]]],[12],[1,"\\n "],[1,[30,3,["Name"]]],[1,"\\n "],[13],[1,"\\n"]],[]],[[[1," "],[10,2],[12],[1,"\\n "],[1,[30,3,["Name"]]],[1,"\\n "],[13],[1,"\\n"]],[]]],[1," "]],[]]]]],[1,"\\n "],[8,[39,1],null,[["@name"],["details"]],[["default"],[[[[1,"\\n "],[8,[39,8],null,[["@item"],[[30,3]]],null],[1,"\\n "],[8,[39,9],null,[["@item"],[[30,3]]],null],[1,"\\n"],[41,[28,[37,10],[[28,[37,6],[[30,3,["InstanceCount"]],0],null],[28,[37,10],[[28,[37,6],[[30,3,["Kind"]],"terminating-gateway"],null],[28,[37,6],[[30,3,["Kind"]],"ingress-gateway"],null]],null]],null],[[[1," "],[10,1],[12],[1,"\\n "],[1,[28,[35,11],[[30,3,["InstanceCount"]]],null]],[1,"\\n "],[1,[28,[35,12],[[30,3,["InstanceCount"]],"instance"],[["without-count"],[true]]]],[1,"\\n "],[13],[1,"\\n"]],[]],null],[41,[51,[30,6]],[[[1," "],[8,[39,14],null,[["@item","@nspace","@partition"],[[30,3],[30,7],[30,5]]],null],[1,"\\n"]],[]],null],[41,[28,[37,15],[[30,3,["Kind"]],"terminating-gateway"],null],[[[1," "],[10,1],[12],[1,"\\n "],[1,[28,[35,11],[[30,3,["GatewayConfig","AssociatedServiceCount"]]],null]],[1,"\\n "],[1,[28,[35,12],[[30,3,["GatewayConfig","AssociatedServiceCount"]],"linked service"],[["without-count"],[true]]]],[1,"\\n "],[13],[1,"\\n"]],[]],[[[41,[28,[37,15],[[30,3,["Kind"]],"ingress-gateway"],null],[[[1," "],[10,1],[12],[1,"\\n "],[1,[28,[35,11],[[30,3,["GatewayConfig","AssociatedServiceCount"]]],null]],[1,"\\n "],[1,[28,[35,12],[[30,3,["GatewayConfig","AssociatedServiceCount"]],"upstream"],[["without-count"],[true]]]],[1,"\\n "],[13],[1,"\\n "]],[]],null]],[]]],[41,[28,[37,16],[[30,3,["ConnectedWithGateway"]],[30,3,["ConnectedWithProxy"]]],null],[[[1," "],[10,"dl"],[14,0,"mesh"],[12],[1,"\\n "],[10,"dt"],[12],[1,"\\n "],[8,[39,2],null,null,[["default"],[[[[1,"\\n This service uses a proxy for the Consul service mesh\\n "]],[]]]]],[1,"\\n "],[13],[1,"\\n"],[41,[28,[37,10],[[30,3,["ConnectedWithGateway"]],[30,3,["ConnectedWithProxy"]]],null],[[[1," "],[10,"dd"],[12],[1,"\\n in service mesh with proxy and gateway\\n "],[13],[1,"\\n"]],[]],[[[41,[30,3,["ConnectedWithProxy"]],[[[1," "],[10,"dd"],[12],[1,"\\n in service mesh with proxy\\n "],[13],[1,"\\n"]],[]],[[[41,[30,3,["ConnectedWithGateway"]],[[[1," "],[10,"dd"],[12],[1,"\\n in service mesh with gateway\\n "],[13],[1,"\\n "]],[]],null]],[]]]],[]]],[1," "],[13],[1,"\\n"]],[]],null],[1," "],[8,[39,17],null,[["@item"],[[30,3]]],null],[1,"\\n "]],[]]]]],[1,"\\n"]],[3,4]]]]],[1,"\\n"]],["&attrs","@items","item","index","@partition","@isPeerDetail","@nspace"],false,["list-collection","block-slot","tooltip","if","gt","href-to","not-eq","hash","consul/kind","consul/external-source","and","format-number","pluralize","unless","consul/bucket/list","eq","or","tag-list"]]',moduleName:"consul-ui/components/consul/service/list/index.hbs",isStrictMode:!1}) +var i=(0,t.setComponentTemplate)(r,(0,l.default)()) +e.default=i})),define("consul-ui/components/consul/service/search-bar/index",["exports","@ember/component","@ember/template-factory","@glimmer/component"],(function(e,t,n,l){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const r=(0,n.createTemplateFactory)({id:"K9snRb1g",block:'[[[8,[39,0],[[24,0,"consul-service-search-bar"],[17,1]],[["@filter"],[[30,2]]],[["status","search","filter","sort"],[[[[1,"\\n\\n"],[44,[[28,[37,2],[[28,[37,3],["components.consul.service.search-bar.",[30,3,["status","key"]]],null]],[["default"],[[28,[37,4],[[28,[37,3],["common.search.",[30,3,["status","key"]]],null],[28,[37,3],["common.consul.",[30,3,["status","key"]]],null]],null]]]],[28,[37,2],[[28,[37,3],["components.consul.service.search-bar.",[30,3,["status","value"]]],null]],[["default"],[[28,[37,4],[[28,[37,3],["common.search.",[30,3,["status","value"]]],null],[28,[37,3],["common.consul.",[30,3,["status","value"]]],null],[28,[37,3],["common.brand.",[30,3,["status","value"]]],null]],null]]]]],[[[1," "],[8,[30,3,["RemoveFilter"]],[[16,"aria-label",[28,[37,2],["common.ui.remove"],[["item"],[[28,[37,3],[[30,4]," ",[30,5]],null]]]]]],null,[["default"],[[[[1,"\\n "],[10,"dl"],[12],[1,"\\n "],[10,"dt"],[12],[1,[30,4]],[13],[1,"\\n "],[10,"dd"],[12],[1,[30,5]],[13],[1,"\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n"]],[4,5]]],[1,"\\n "]],[3]],[[[1,"\\n "],[8,[30,6,["Search"]],null,[["@onsearch","@value","@placeholder"],[[28,[37,5],[[30,0],[30,7]],null],[30,8],[28,[37,2],["common.search.search"],null]]],[["default"],[[[[1,"\\n "],[8,[30,6,["Select"]],[[24,0,"type-search-properties"]],[["@position","@onchange","@multiple","@required"],["right",[28,[37,5],[[30,0],[30,2,["searchproperty","change"]]],null],true,true]],[["default"],[[[[1,"\\n "],[8,[39,6],null,[["@name"],["selected"]],[["default"],[[[[1,"\\n "],[10,1],[12],[1,"\\n "],[1,[28,[35,2],["common.search.searchproperty"],null]],[1,"\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,6],null,[["@name"],["options"]],[["default"],[[[[1,"\\n"],[44,[[30,9,["Optgroup"]],[30,9,["Option"]]],[[[42,[28,[37,8],[[28,[37,8],[[30,2,["searchproperty","default"]]],null]],null],null,[[[1," "],[8,[30,11],null,[["@value","@selected"],[[30,12],[28,[37,9],[[30,12],[30,2,["searchproperty","value"]]],null]]],[["default"],[[[[1,"\\n "],[1,[28,[35,2],[[28,[37,3],["common.consul.",[28,[37,10],[[30,12]],null]],null]],null]],[1,"\\n "]],[]]]]],[1,"\\n"]],[12]],null]],[10,11]]],[1," "]],[]]]]],[1,"\\n "]],[9]]]]],[1,"\\n "]],[]]]]],[1,"\\n "]],[6]],[[[1,"\\n "],[8,[30,13,["Select"]],[[24,0,"type-status"]],[["@position","@onchange","@multiple"],["left",[28,[37,5],[[30,0],[30,2,["status","change"]]],null],true]],[["default"],[[[[1,"\\n "],[8,[39,6],null,[["@name"],["selected"]],[["default"],[[[[1,"\\n "],[10,1],[12],[1,"\\n "],[1,[28,[35,2],["common.consul.status"],null]],[1,"\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,6],null,[["@name"],["options"]],[["default"],[[[[1,"\\n"],[44,[[30,14,["Optgroup"]],[30,14,["Option"]]],[[[42,[28,[37,8],[[28,[37,8],[[30,0,["healthStates"]]],null]],null],null,[[[1," "],[8,[30,16],[[16,0,[29,["value-",[30,17]]]]],[["@value","@selected"],[[30,17],[28,[37,9],[[30,17],[30,2,["status","value"]]],null]]],[["default"],[[[[1,"\\n "],[1,[28,[35,2],[[28,[37,3],["common.consul.",[30,17]],null]],[["default"],[[28,[37,4],[[28,[37,3],["common.search.",[30,17]],null]],null]]]]],[1,"\\n "]],[]]]]],[1,"\\n"]],[17]],null]],[15,16]]],[1," "]],[]]]]],[1,"\\n "]],[14]]]]],[1,"\\n "],[8,[30,13,["Select"]],null,[["@position","@onchange","@multiple"],["left",[28,[37,5],[[30,0],[30,2,["kind","change"]]],null],true]],[["default"],[[[[1,"\\n "],[8,[39,6],null,[["@name"],["selected"]],[["default"],[[[[1,"\\n "],[10,1],[12],[1,"\\n "],[1,[28,[35,2],["components.consul.service.search-bar.kind"],null]],[1,"\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,6],null,[["@name"],["options"]],[["default"],[[[[1,"\\n"],[44,[[30,18,["Optgroup"]],[30,18,["Option"]]],[[[1," "],[8,[30,20],null,[["@value","@selected"],["service",[28,[37,9],["service",[30,2,["kind","value"]]],null]]],[["default"],[[[[1,"\\n "],[1,[28,[35,2],["common.consul.service"],null]],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[30,19],null,[["@label"],[[28,[37,2],["common.consul.gateway"],null]]],[["default"],[[[[1,"\\n"],[42,[28,[37,8],[[28,[37,8],[[28,[37,4],["api-gateway","ingress-gateway","terminating-gateway","mesh-gateway"],null]],null]],null],null,[[[1," "],[8,[30,20],null,[["@value","@selected"],[[30,21],[28,[37,9],[[30,21],[30,2,["kind","value"]]],null]]],[["default"],[[[[1,"\\n "],[1,[28,[35,2],[[28,[37,3],["common.consul.",[30,21]],null]],null]],[1,"\\n "]],[]]]]],[1,"\\n"]],[21]],null],[1," "]],[]]]]],[1,"\\n "],[8,[30,19],null,[["@label"],[[28,[37,2],["common.consul.mesh"],null]]],[["default"],[[[[1,"\\n"],[42,[28,[37,8],[[28,[37,8],[[28,[37,4],["in-mesh","not-in-mesh"],null]],null]],null],null,[[[1," "],[8,[30,20],null,[["@value","@selected"],[[30,22],[28,[37,9],[[30,22],[30,2,["kind","value"]]],null]]],[["default"],[[[[1,"\\n "],[1,[28,[35,2],[[28,[37,3],["common.search.",[30,22]],null]],null]],[1,"\\n "]],[]]]]],[1,"\\n"]],[22]],null],[1," "]],[]]]]],[1,"\\n"]],[19,20]]],[1," "]],[]]]]],[1,"\\n "]],[18]]]]],[1,"\\n"],[41,[28,[37,12],[[30,23,["length"]],0],null],[[[1," "],[8,[30,13,["Select"]],[[24,0,"type-source"]],[["@position","@onchange","@multiple"],["left",[28,[37,5],[[30,0],[30,2,["source","change"]]],null],true]],[["default"],[[[[1,"\\n "],[8,[39,13],null,[["@components","@filter","@sources"],[[30,24],[30,2],[30,0,["sortedSources"]]]],null],[1,"\\n "]],[24]]]]],[1,"\\n"]],[]],null],[1," "]],[13]],[[[1,"\\n "],[8,[30,25,["Select"]],[[24,0,"type-sort"]],[["@position","@onchange","@multiple","@required"],["right",[28,[37,5],[[30,0],[30,26,["change"]]],null],false,true]],[["default"],[[[[1,"\\n "],[8,[39,6],null,[["@name"],["selected"]],[["default"],[[[[1,"\\n "],[10,1],[12],[1,"\\n"],[44,[[28,[37,14],[[28,[37,4],[[28,[37,4],["Name:asc",[28,[37,2],["common.sort.alpha.asc"],null]],null],[28,[37,4],["Name:desc",[28,[37,2],["common.sort.alpha.desc"],null]],null],[28,[37,4],["Status:asc",[28,[37,2],["common.sort.status.asc"],null]],null],[28,[37,4],["Status:desc",[28,[37,2],["common.sort.status.desc"],null]],null]],null]],null]],[[[1," "],[1,[28,[35,15],[[30,28],[30,26,["value"]]],null]],[1,"\\n"]],[28]]],[1," "],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,6],null,[["@name"],["options"]],[["default"],[[[[1,"\\n"],[44,[[30,27,["Optgroup"]],[30,27,["Option"]]],[[[1," "],[8,[30,29],null,[["@label"],[[28,[37,2],["common.consul.status"],null]]],[["default"],[[[[1,"\\n "],[8,[30,30],null,[["@value","@selected"],["Status:asc",[28,[37,16],["Status:asc",[30,26,["value"]]],null]]],[["default"],[[[[1,[28,[35,2],["common.sort.status.asc"],null]]],[]]]]],[1,"\\n "],[8,[30,30],null,[["@value","@selected"],["Status:desc",[28,[37,16],["Status:desc",[30,26,["value"]]],null]]],[["default"],[[[[1,[28,[35,2],["common.sort.status.desc"],null]]],[]]]]],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[30,29],null,[["@label"],[[28,[37,2],["common.consul.service-name"],null]]],[["default"],[[[[1,"\\n "],[8,[30,30],null,[["@value","@selected"],["Name:asc",[28,[37,16],["Name:asc",[30,26,["value"]]],null]]],[["default"],[[[[1,[28,[35,2],["common.sort.alpha.asc"],null]]],[]]]]],[1,"\\n "],[8,[30,30],null,[["@value","@selected"],["Name:desc",[28,[37,16],["Name:desc",[30,26,["value"]]],null]]],[["default"],[[[[1,[28,[35,2],["common.sort.alpha.desc"],null]]],[]]]]],[1,"\\n "]],[]]]]],[1,"\\n"]],[29,30]]],[1," "]],[]]]]],[1,"\\n "]],[27]]]]],[1,"\\n "]],[25]]]]],[1,"\\n"]],["&attrs","@filter","search","key","value","search","@onsearch","@search","components","Optgroup","Option","prop","search","components","Optgroup","Option","state","components","Optgroup","Option","kind","state","@sources","components","search","@sort","components","selectable","Optgroup","Option"],false,["search-bar","let","t","concat","array","action","block-slot","each","-track-array","includes","lowercase","if","gt","consul/sources-select","from-entries","get","eq"]]',moduleName:"consul-ui/components/consul/service/search-bar/index.hbs",isStrictMode:!1}) +class i extends l.default{get healthStates(){return this.args.peer?["passing","warning","critical","unknown","empty"]:["passing","warning","critical","empty"]}get sortedSources(){const e=this.args.sources||[] +return e.unshift(["consul"]),e.includes("consul-api-gateway")?[...e.filter((e=>"consul-api-gateway"!==e)),"consul-api-gateway"]:e}}e.default=i,(0,t.setComponentTemplate)(r,i)})),define("consul-ui/components/consul/source/index",["exports","@ember/component","@ember/template-factory","@ember/component/template-only"],(function(e,t,n,l){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const r=(0,n.createTemplateFactory)({id:"7cN0Jpki",block:'[[[10,"dl"],[14,0,"tooltip-panel"],[12],[1,"\\n "],[10,"dt"],[12],[1,"\\n "],[10,1],[14,0,"consul-source"],[12],[1,"\\n "],[1,[30,1]],[1,"\\n "],[13],[1,"\\n "],[13],[1,"\\n "],[10,"dd"],[12],[1,"\\n "],[8,[39,0],null,[["@position"],["left"]],[["default"],[[[[1,"\\n "],[8,[39,1],null,[["@name"],["header"]],[["default"],[[[[1,"\\n "],[1,[28,[35,2],["components.consul.source.header"],null]],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,1],null,[["@name"],["menu"]],[["default"],[[[[1,"\\n "],[10,"li"],[14,"role","separator"],[12],[1,"\\n "],[1,[28,[35,2],["components.consul.source.menu-title"],null]],[1,"\\n "],[13],[1,"\\n "],[10,"li"],[14,"role","none"],[14,0,"docs-link"],[12],[1,"\\n "],[10,3],[14,"tabindex","-1"],[14,"role","menuitem"],[15,6,[29,[[28,[37,3],["CONSUL_DOCS_URL"],null],"/connect/l7-traffic"]]],[14,"rel","noopener noreferrer"],[14,"target","_blank"],[12],[1,"\\n "],[1,[28,[35,2],["components.consul.source.links.documentation"],null]],[1,"\\n "],[13],[1,"\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n "]],[]]]]],[1,"\\n "],[13],[1,"\\n"],[13],[1,"\\n\\n"]],["@source"],false,["menu-panel","block-slot","t","env"]]',moduleName:"consul-ui/components/consul/source/index.hbs",isStrictMode:!1}) +var i=(0,t.setComponentTemplate)(r,(0,l.default)()) +e.default=i})),define("consul-ui/components/consul/sources-select/index",["exports","@ember/component","@ember/template-factory","@ember/component/template-only"],(function(e,t,n,l){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const r=(0,n.createTemplateFactory)({id:"xQqOlkTv",block:'[[[41,[28,[37,1],[[30,1,["length"]],0],null],[[[1," "],[8,[39,2],null,[["@name"],["selected"]],[["default"],[[[[1,"\\n "],[10,1],[12],[1,"\\n "],[1,[28,[35,3],["common.search.source"],null]],[1,"\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,2],null,[["@name"],["options"]],[["default"],[[[[1,"\\n"],[44,[[30,2,["Option"]]],[[[42,[28,[37,6],[[28,[37,6],[[30,1]],null]],null],null,[[[44,[[28,[37,7],[[30,4]],null]],[[[1," "],[8,[30,3],[[16,0,[52,[51,[30,5]],[30,4]]]],[["@value","@selected"],[[30,4],[28,[37,9],[[30,4],[30,6,["source","value"]]],null]]],[["default"],[[[[1,"\\n"],[41,[30,5],[[[1," "],[8,[39,10],[[24,0,"mr-2.5"]],[["@name"],[[30,5]]],null],[1,"\\n"]],[]],null],[1," "],[1,[28,[35,3],[[28,[37,11],["common.brand.",[30,4]],null]],null]],[1,"\\n "]],[]]]]],[1,"\\n"]],[5]]]],[4]],null]],[3]]],[1," "]],[]]]]],[1,"\\n"]],[]],null]],["@sources","@components","Option","source","flightIcon","@filter"],false,["if","gt","block-slot","t","let","each","-track-array","icon-mapping","unless","includes","flight-icon","concat"]]',moduleName:"consul-ui/components/consul/sources-select/index.hbs",isStrictMode:!1}) +var i=(0,t.setComponentTemplate)(r,(0,l.default)()) +e.default=i})),define("consul-ui/components/consul/token/list/index",["exports","@ember/component","@ember/template-factory","@ember/component/template-only"],(function(e,t,n,l){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const r=(0,n.createTemplateFactory)({id:"nhK5HxA8",block:'[[[8,[39,0],[[24,0,"consul-token-list"]],[["@items"],[[30,1]]],[["default"],[[[[1,"\\n "],[8,[39,1],null,[["@name"],["header"]],[["default"],[[[[1,"\\n"],[41,[28,[37,3],[[30,2,["AccessorID"]],[30,3,["AccessorID"]]],null],[[[1," "],[10,"dl"],[14,"rel","me"],[12],[1,"\\n "],[10,"dd"],[12],[1,"\\n "],[8,[39,4],null,[["@position"],["top-start"]],[["default"],[[[[1,"\\n Your token\\n "]],[]]]]],[1,"\\n "],[13],[1,"\\n "],[13],[1,"\\n"]],[]],null],[1," "],[10,3],[15,6,[28,[37,5],["dc.acls.tokens.edit",[30,2,["AccessorID"]]],null]],[12],[1,[28,[35,6],[[30,2,["AccessorID"]],-8],null]],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,1],null,[["@name"],["details"]],[["default"],[[[[1,"\\n "],[10,"dl"],[12],[1,"\\n "],[10,"dt"],[12],[1,"Scope"],[13],[1,"\\n "],[10,"dd"],[12],[1,"\\n "],[1,[52,[30,2,["Local"]],"local","global"]],[1,"\\n "],[13],[1,"\\n "],[13],[1,"\\n "],[8,[39,7],null,[["@item"],[[30,2]]],null],[1,"\\n "],[10,"dl"],[12],[1,"\\n "],[10,"dt"],[12],[1,"Description"],[13],[1,"\\n "],[10,"dd"],[12],[1,"\\n "],[1,[28,[35,8],[[30,2,["Description"]],[30,2,["Name"]]],null]],[1,"\\n "],[13],[1,"\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,1],null,[["@name"],["actions"]],[["default"],[[[[1,"\\n"],[41,[30,2,["hasSecretID"]],[[[1," "],[8,[39,9],null,[["@value","@name"],[[30,2,["SecretID"]],[28,[37,10],["components.consul.token.secretID"],null]]],[["default"],[[[[1,"\\n "],[1,[28,[35,10],["components.consul.token.secretID"],null]],[1,"\\n "]],[]]]]],[1,"\\n"]],[]],null],[1," "],[8,[30,4],null,null,[["default"],[[[[1,"\\n "],[8,[30,5],null,[["@href"],[[28,[37,5],["dc.acls.tokens.edit",[30,2,["AccessorID"]]],null]]],[["default"],[[[[1,"\\n "],[8,[39,1],null,[["@name"],["label"]],[["default"],[[[[1,"\\n"],[41,[28,[37,11],["write token"],[["item"],[[30,2]]]],[[[1," Edit\\n"]],[]],[[[1," View\\n"]],[]]],[1," "]],[]]]]],[1,"\\n "]],[]]]]],[1,"\\n"],[41,[28,[37,11],["duplicate token"],[["item"],[[30,2]]]],[[[1," "],[8,[30,5],null,[["@onclick"],[[28,[37,12],[[30,0],[30,6],[30,2]],null]]],[["default"],[[[[1,"\\n "],[8,[39,1],null,[["@name"],["label"]],[["default"],[[[[1,"\\n Duplicate\\n "]],[]]]]],[1,"\\n "]],[]]]]],[1,"\\n"]],[]],null],[1,"\\n"],[41,[28,[37,3],[[30,2,["AccessorID"]],[33,13,["AccessorID"]]],null],[[[1," "],[8,[30,5],[[24,0,"dangerous"]],[["@onclick"],[[28,[37,12],[[30,0],[30,7],[30,2]],null]]],[["default"],[[[[1,"\\n "],[8,[39,1],null,[["@name"],["label"]],[["default"],[[[[1,"\\n Logout\\n "]],[]]]]],[1,"\\n "],[8,[39,1],null,[["@name"],["confirmation"]],[["default"],[[[[1,"\\n "],[8,[30,8],[[24,0,"warning"]],null,[["default"],[[[[1,"\\n "],[8,[39,1],null,[["@name"],["header"]],[["default"],[[[[1,"\\n Confirm logout\\n "]],[]]]]],[1,"\\n "],[8,[39,1],null,[["@name"],["body"]],[["default"],[[[[1,"\\n "],[10,2],[12],[1,"\\n Are you sure you want to stop using this ACL token? This will log you out.\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,1],null,[["@name"],["confirm"]],[["default"],[[[[1,"\\n "],[8,[30,9],null,null,[["default"],[[[[1,"Logout"]],[]]]]],[1,"\\n "]],[9]]]]],[1,"\\n "]],[]]]]],[1,"\\n "]],[8]]]]],[1,"\\n "]],[]]]]],[1,"\\n"]],[]],[[[1," "],[8,[30,5],null,[["@onclick"],[[28,[37,12],[[30,0],[30,10],[30,2]],null]]],[["default"],[[[[1,"\\n "],[8,[39,1],null,[["@name"],["label"]],[["default"],[[[[1,"\\n Use\\n "]],[]]]]],[1,"\\n "],[8,[39,1],null,[["@name"],["confirmation"]],[["default"],[[[[1,"\\n "],[8,[30,11],[[24,0,"warning"]],null,[["default"],[[[[1,"\\n "],[8,[39,1],null,[["@name"],["header"]],[["default"],[[[[1,"\\n Confirm use\\n "]],[]]]]],[1,"\\n "],[8,[39,1],null,[["@name"],["body"]],[["default"],[[[[1,"\\n "],[10,2],[12],[1,"\\n Are you sure you want to use this ACL token?\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,1],null,[["@name"],["confirm"]],[["default"],[[[[1,"\\n "],[8,[30,12],null,null,[["default"],[[[[1,"Use"]],[]]]]],[1,"\\n "]],[12]]]]],[1,"\\n "]],[]]]]],[1,"\\n "]],[11]]]]],[1,"\\n "]],[]]]]],[1,"\\n"]],[]]],[1,"\\n\\n"],[41,[28,[37,11],["delete token"],[["item","token"],[[30,2],[30,3]]]],[[[1," "],[8,[30,5],[[24,0,"dangerous"]],[["@onclick"],[[28,[37,12],[[30,0],[30,13],[30,2]],null]]],[["default"],[[[[1,"\\n "],[8,[39,1],null,[["@name"],["label"]],[["default"],[[[[1,"\\n Delete\\n "]],[]]]]],[1,"\\n "],[8,[39,1],null,[["@name"],["confirmation"]],[["default"],[[[[1,"\\n "],[8,[30,14],[[24,0,"warning"]],null,[["default"],[[[[1,"\\n "],[8,[39,1],null,[["@name"],["header"]],[["default"],[[[[1,"\\n Confirm delete\\n "]],[]]]]],[1,"\\n "],[8,[39,1],null,[["@name"],["body"]],[["default"],[[[[1,"\\n "],[10,2],[12],[1,"\\n Are you sure you want to delete this token?\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,1],null,[["@name"],["confirm"]],[["default"],[[[[1,"\\n "],[8,[30,15],null,null,[["default"],[[[[1,"Delete"]],[]]]]],[1,"\\n "]],[15]]]]],[1,"\\n "]],[]]]]],[1,"\\n "]],[14]]]]],[1,"\\n "]],[]]]]],[1,"\\n"]],[]],null],[1,"\\n "]],[5]]]]],[1,"\\n "]],[4]]]]],[1,"\\n"]],[2]]]]]],["@items","item","@token","Actions","Action","@onclone","@onlogout","Confirmation","Confirm","@onuse","Confirmation","Confirm","@ondelete","Confirmation","Confirm"],false,["list-collection","block-slot","if","eq","tooltip","href-to","substr","consul/token/ruleset/list","or","copy-button","t","can","action","token"]]',moduleName:"consul-ui/components/consul/token/list/index.hbs",isStrictMode:!1}) +var i=(0,t.setComponentTemplate)(r,(0,l.default)()) +e.default=i})),define("consul-ui/components/consul/token/notifications/index",["exports","@ember/component","@ember/template-factory","@ember/component/template-only"],(function(e,t,n,l){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const r=(0,n.createTemplateFactory)({id:"cW0yM/IH",block:'[[[41,[28,[37,1],[[30,1],"create"],null],[[[41,[28,[37,1],[[30,2],"success"],null],[[[1," The token has been added.\\n"]],[]],[[[1," There was an error adding the token.\\n"]],[]]]],[]],[[[41,[28,[37,1],[[30,1],"update"],null],[[[41,[28,[37,1],[[30,2],"success"],null],[[[1," The token has been saved.\\n"]],[]],[[[1," There was an error saving the token.\\n"]],[]]]],[]],[[[41,[28,[37,1],[[30,1],"delete"],null],[[[41,[28,[37,1],[[30,2],"success"],null],[[[1," The token was deleted.\\n"]],[]],[[[1," There was an error deleting the token.\\n"]],[]]]],[]],[[[41,[28,[37,1],[[30,1],"clone"],null],[[[41,[28,[37,1],[[30,2],"success"],null],[[[1," The token has been cloned as "],[1,[28,[35,2],[[30,3,["AccessorID"]],8,false],null]],[1,"\\n"]],[]],[[[1," There was an error cloning the token.\\n"]],[]]]],[]],[[[41,[28,[37,1],[[30,1],"use"],null],[[[41,[28,[37,1],[[30,2],"success"],null],[[[1," You are now using the new ACL token\\n"]],[]],[[[1," There was an error using that ACL token.\\n"]],[]]]],[]],null]],[]]]],[]]]],[]]]],[]]],[44,[[30,4,["errors","firstObject"]]],[[[41,[30,5,["detail"]],[[[1," "],[10,"br"],[12],[13],[1,[28,[35,4],["(",[52,[30,5,["status"]],[28,[37,4],[[30,5,["status"]],": "],null]],[30,5,["detail"]],")"],null]],[1,"\\n"]],[]],null]],[5]]]],["@type","@status","@item","@error","error"],false,["if","eq","truncate","let","concat"]]',moduleName:"consul-ui/components/consul/token/notifications/index.hbs",isStrictMode:!1}) +var i=(0,t.setComponentTemplate)(r,(0,l.default)()) +e.default=i})),define("consul-ui/components/consul/token/ruleset/list/index",["exports","@ember/component","@ember/template-factory"],(function(e,t,n){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const l=(0,n.createTemplateFactory)({id:"z6qiUtoK",block:'[[[44,[[28,[37,1],[[28,[37,2],[[33,3,["Policies"]],[33,3,["ACLs","PolicyDefaults"]],[28,[37,4],null,null]],null]],null]],[[[44,[[28,[37,5],[[30,1],"management"],null]],[[[41,[28,[37,7],[[30,2,["length"]],0],null],[[[1," "],[10,"dl"],[12],[1,"\\n "],[10,"dt"],[12],[1,"\\n Management\\n "],[13],[1,"\\n "],[10,"dd"],[12],[1,"\\n"],[42,[28,[37,9],[[28,[37,9],[[28,[37,5],[[30,1],"management"],null]],null]],null],null,[[[1," "],[10,1],[15,0,[28,[37,10],[[30,3]],null]],[12],[1,[30,3,["Name"]]],[13],[1,"\\n"]],[3]],null],[1," "],[13],[1,"\\n "],[13],[1,"\\n"]],[]],null]],[2]]],[44,[[28,[37,5],[[30,1],"identities"],null]],[[[41,[28,[37,7],[[30,4,["length"]],0],null],[[[1," "],[10,"dl"],[12],[1,"\\n "],[10,"dt"],[12],[1,"Identities"],[13],[1,"\\n "],[10,"dd"],[12],[1,"\\n"],[42,[28,[37,9],[[28,[37,9],[[30,4]],null]],null],null,[[[1," "],[10,1],[15,0,[28,[37,10],[[30,5]],null]],[12],[1,[30,5,["Name"]]],[13],[1,"\\n"]],[5]],null],[1," "],[13],[1,"\\n "],[13],[1,"\\n"]],[]],null]],[4]]],[41,[28,[37,11],[[33,3]],null],[[[1," "],[10,"dl"],[12],[1,"\\n "],[10,"dt"],[12],[1,"Rules"],[13],[1,"\\n "],[10,"dd"],[12],[1,"\\n Legacy tokens have embedded rules.\\n "],[13],[1,"\\n "],[13],[1,"\\n"]],[]],[[[44,[[28,[37,12],[[28,[37,5],[[30,1],"policies"],null],[28,[37,2],[[33,3,["Roles"]],[33,3,["ACLs","RoleDefaults"]],[28,[37,4],null,null]],null]],null]],[[[41,[28,[37,7],[[30,6,["length"]],0],null],[[[1," "],[10,"dl"],[12],[1,"\\n "],[10,"dt"],[12],[1,"Rules"],[13],[1,"\\n "],[10,"dd"],[12],[1,"\\n"],[42,[28,[37,9],[[28,[37,9],[[30,6]],null]],null],null,[[[1," "],[10,1],[15,0,[28,[37,10],[[30,7]],null]],[12],[1,[30,7,["Name"]]],[13],[1,"\\n"]],[7]],null],[1," "],[13],[1,"\\n "],[13],[1,"\\n"]],[]],null]],[6]]]],[]]]],[1]]]],["policies","management","item","identities","item","policies","item"],false,["let","policy/group","or","item","array","get","if","gt","each","-track-array","policy/typeof","token/is-legacy","append"]]',moduleName:"consul-ui/components/consul/token/ruleset/list/index.hbs",isStrictMode:!1}) +var r=(0,t.setComponentTemplate)(l,t.default.extend({tagName:""})) +e.default=r})),define("consul-ui/components/consul/token/search-bar/index",["exports","@ember/component","@ember/template-factory","@ember/component/template-only"],(function(e,t,n,l){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const r=(0,n.createTemplateFactory)({id:"81pOiVwr",block:'[[[8,[39,0],[[24,0,"consul-token-search-bar"],[17,1]],[["@filter"],[[30,2]]],[["status","search","filter","sort"],[[[[1,"\\n\\n"],[44,[[28,[37,2],[[28,[37,3],["components.consul.token.search-bar.",[30,3,["status","key"]],".name"],null]],[["default"],[[28,[37,4],[[28,[37,3],["common.search.",[30,3,["status","key"]]],null],[28,[37,3],["common.consul.",[30,3,["status","key"]]],null]],null]]]],[28,[37,2],[[28,[37,3],["components.consul.token.search-bar.",[30,3,["status","key"]],".options.",[30,3,["status","value"]]],null]],[["default"],[[28,[37,4],[[28,[37,3],["common.search.",[30,3,["status","value"]]],null],[28,[37,3],["common.consul.",[30,3,["status","value"]]],null],[28,[37,3],["common.brand.",[30,3,["status","value"]]],null]],null]]]]],[[[1," "],[8,[30,3,["RemoveFilter"]],[[16,"aria-label",[28,[37,2],["common.ui.remove"],[["item"],[[28,[37,3],[[30,4]," ",[30,5]],null]]]]]],null,[["default"],[[[[1,"\\n "],[10,"dl"],[12],[1,"\\n "],[10,"dt"],[12],[1,[30,4]],[13],[1,"\\n "],[10,"dd"],[12],[1,[30,5]],[13],[1,"\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n"]],[4,5]]],[1,"\\n "]],[3]],[[[1,"\\n "],[8,[30,6,["Search"]],null,[["@onsearch","@value","@placeholder"],[[28,[37,5],[[30,0],[30,7]],null],[30,8],[28,[37,2],["common.search.search"],null]]],[["default"],[[[[1,"\\n "],[8,[30,6,["Select"]],[[24,0,"type-search-properties"]],[["@position","@onchange","@multiple","@required"],["right",[28,[37,5],[[30,0],[30,2,["searchproperty","change"]]],null],true,true]],[["default"],[[[[1,"\\n "],[8,[39,6],null,[["@name"],["selected"]],[["default"],[[[[1,"\\n "],[10,1],[12],[1,"\\n "],[1,[28,[35,2],["common.search.searchproperty"],null]],[1,"\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,6],null,[["@name"],["options"]],[["default"],[[[[1,"\\n"],[44,[[30,9,["Optgroup"]],[30,9,["Option"]]],[[[42,[28,[37,8],[[28,[37,8],[[30,2,["searchproperty","default"]]],null]],null],null,[[[1," "],[8,[30,11],null,[["@value","@selected"],[[30,12],[28,[37,9],[[30,12],[30,2,["searchproperty","value"]]],null]]],[["default"],[[[[1,"\\n "],[1,[28,[35,2],[[28,[37,3],["common.consul.",[28,[37,10],[[30,12]],null]],null]],null]],[1,"\\n "]],[]]]]],[1,"\\n"]],[12]],null]],[10,11]]],[1," "]],[]]]]],[1,"\\n "]],[9]]]]],[1,"\\n "]],[]]]]],[1,"\\n "]],[6]],[[[1,"\\n "],[8,[30,13,["Select"]],[[24,0,"type-status"]],[["@position","@onchange","@multiple"],["left",[28,[37,5],[[30,0],[30,2,["kind","change"]]],null],true]],[["default"],[[[[1,"\\n "],[8,[39,6],null,[["@name"],["selected"]],[["default"],[[[[1,"\\n "],[10,1],[12],[1,"\\n "],[1,[28,[35,2],["components.consul.token.search-bar.kind.name"],null]],[1,"\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,6],null,[["@name"],["options"]],[["default"],[[[[1,"\\n"],[44,[[30,14,["Optgroup"]],[30,14,["Option"]]],[[[42,[28,[37,8],[[28,[37,8],[[28,[37,4],["global-management","global","local"],null]],null]],null],null,[[[1," "],[8,[30,16],[[16,0,[29,["value-",[30,17]]]]],[["@value","@selected"],[[30,17],[28,[37,9],[[30,17],[30,2,["kind","value"]]],null]]],[["default"],[[[[1,"\\n "],[1,[28,[35,2],[[28,[37,3],["components.consul.token.search-bar.kind.options.",[30,17]],null]],[["default"],[[28,[37,4],[[28,[37,3],["common.search.",[30,17]],null]],null]]]]],[1,"\\n "]],[]]]]],[1,"\\n"]],[17]],null]],[15,16]]],[1," "]],[]]]]],[1,"\\n "]],[14]]]]],[1,"\\n "]],[13]],[[[1,"\\n "],[8,[30,18,["Select"]],[[24,0,"type-sort"]],[["@position","@onchange","@multiple","@required"],["right",[28,[37,5],[[30,0],[30,19,["change"]]],null],false,true]],[["default"],[[[[1,"\\n "],[8,[39,6],null,[["@name"],["selected"]],[["default"],[[[[1,"\\n "],[10,1],[12],[1,"\\n"],[44,[[28,[37,11],[[28,[37,4],[[28,[37,4],["CreateTime:desc",[28,[37,2],["common.sort.age.desc"],null]],null],[28,[37,4],["CreateTime:asc",[28,[37,2],["common.sort.age.asc"],null]],null]],null]],null]],[[[1," "],[1,[28,[35,12],[[30,21],[30,19,["value"]]],null]],[1,"\\n"]],[21]]],[1," "],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,6],null,[["@name"],["options"]],[["default"],[[[[1,"\\n"],[44,[[30,20,["Optgroup"]],[30,20,["Option"]]],[[[1," "],[8,[30,22],null,[["@label"],[[28,[37,2],["common.ui.creation"],null]]],[["default"],[[[[1,"\\n "],[8,[30,23],null,[["@value","@selected"],["CreateTime:desc",[28,[37,13],["CreateTime:desc",[30,19,["value"]]],null]]],[["default"],[[[[1,[28,[35,2],["common.sort.age.desc"],null]]],[]]]]],[1,"\\n "],[8,[30,23],null,[["@value","@selected"],["CreateTime:asc",[28,[37,13],["CreateTime:asc",[30,19,["value"]]],null]]],[["default"],[[[[1,[28,[35,2],["common.sort.age.asc"],null]]],[]]]]],[1,"\\n "]],[]]]]],[1,"\\n"]],[22,23]]],[1," "]],[]]]]],[1,"\\n "]],[20]]]]],[1,"\\n "]],[18]]]]],[1,"\\n"]],["&attrs","@filter","search","key","value","search","@onsearch","@search","components","Optgroup","Option","prop","search","components","Optgroup","Option","state","search","@sort","components","selectable","Optgroup","Option"],false,["search-bar","let","t","concat","array","action","block-slot","each","-track-array","includes","lowercase","from-entries","get","eq"]]',moduleName:"consul-ui/components/consul/token/search-bar/index.hbs",isStrictMode:!1}) +var i=(0,t.setComponentTemplate)(r,(0,l.default)()) +e.default=i})),define("consul-ui/components/consul/token/selector/index",["exports","@ember/component","@ember/template-factory","@glimmer/component","@ember/object"],(function(e,t,n,l,r){var i +function o(e,t,n,l,r){var i={} +return Object.keys(l).forEach((function(e){i[e]=l[e]})),i.enumerable=!!i.enumerable,i.configurable=!!i.configurable,("value"in i||i.initializer)&&(i.writable=!0),i=n.slice().reverse().reduce((function(n,l){return l(e,t,n)||n}),i),r&&void 0!==i.initializer&&(i.value=i.initializer?i.initializer.call(r):void 0,i.initializer=void 0),void 0===i.initializer&&(Object.defineProperty(e,t,i),i=null),i}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const a=(0,n.createTemplateFactory)({id:"TUgK5bUH",block:'[[[41,[28,[37,1],["use acls"],null],[[[1," "],[10,"li"],[12],[1,"\\n\\n "],[8,[39,2],null,[["@src","@sink","@onchange"],[[28,[37,3],["settings://consul:token"],null],[28,[37,3],["settings://consul:token"],null],[30,0,["reauthorize"]]]],[["unauthorized","authorized"],[[[[1,"\\n "],[8,[39,4],null,[["@target"],["app-before-skip-links"]],[["default"],[[[[1,"\\n "],[8,[39,5],[[4,[38,6],["click",[28,[37,7],[[30,0,["modal","open"]]],null]],null]],null,[["default"],[[[[1,"\\n Login\\n "]],[]]]]],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,5],[[4,[38,6],["click",[28,[37,7],[[30,0,["modal","open"]]],null]],null]],null,[["default"],[[[[1,"\\n Log in\\n "]],[]]]]],[1,"\\n "],[8,[39,8],null,[["@name","@onclose","@onopen","@aria"],["login-toggle",[30,0,["close"]],[30,0,["open"]],[28,[37,9],null,[["label"],["Log in to Consul"]]]]],[["default"],[[[[1,"\\n "],[8,[39,10],null,[["@target","@name","@value"],[[30,0],"modal",[30,2]]],null],[1,"\\n "],[8,[39,11],null,[["@name"],["header"]],[["default"],[[[[1,"\\n "],[10,"h2"],[12],[1,"\\n Log in to Consul\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,11],null,[["@name"],["body"]],[["default"],[[[[1,"\\n "],[8,[39,12],null,[["@dc","@partition","@nspace","@onsubmit"],[[30,3,["Name"]],[30,4],[30,5],[28,[37,5],[[30,0],[30,1,["login"]]],[["value"],["data"]]]]],[["default"],[[[[1,"\\n "],[8,[39,10],null,[["@target","@name","@value"],[[30,0],"authForm",[30,6]]],null],[1,"\\n"],[41,[28,[37,1],["use SSO"],null],[[[1," "],[8,[30,6,["Method"]],null,[["@matches"],["sso"]],[["default"],[[[[1,"\\n "],[8,[39,13],null,[["@dc","@partition","@nspace","@disabled","@onchange","@onerror"],[[30,3,["Name"]],[30,4],[30,5],[30,6,["disabled"]],[30,6,["submit"]],[30,6,["error"]]]],null],[1,"\\n "]],[]]]]],[1,"\\n"]],[]],null],[1," "]],[6]]]]],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,11],null,[["@name"],["actions"]],[["default"],[[[[1,"\\n "],[8,[39,14],[[4,[38,6],["click",[30,2,["close"]]],null]],[["@color","@text"],["secondary","Continue without logging in"]],null],[1,"\\n "]],[]]]]],[1,"\\n "]],[2]]]]],[1,"\\n "]],[1]],[[[1,"\\n "],[8,[39,8],null,[["@name","@onclose","@onopen","@aria"],["login-toggle",[30,0,["close"]],[30,0,["open"]],[28,[37,9],null,[["label"],["Log in with a different token"]]]]],[["default"],[[[[1,"\\n "],[8,[39,10],null,[["@target","@name","@value"],[[30,0],"modal",[30,8]]],null],[1,"\\n "],[8,[39,11],null,[["@name"],["header"]],[["default"],[[[[1,"\\n "],[10,"h2"],[12],[1,"\\n Log in with a different token\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,11],null,[["@name"],["body"]],[["default"],[[[[1,"\\n "],[8,[39,12],null,[["@dc","@nspace","@partition","@onsubmit"],[[30,3,["Name"]],[30,5],[30,4],[28,[37,5],[[30,0],[30,7,["login"]]],[["value"],["data"]]]]],[["default"],[[[[1,"\\n "],[8,[39,10],null,[["@target","@name","@value"],[[30,0],"authForm",[30,9]]],null],[1,"\\n "]],[9]]]]],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,11],null,[["@name"],["actions"]],[["default"],[[[[1,"\\n "],[8,[39,14],[[4,[38,6],["click",[30,8,["close"]]],null]],[["@color","@text"],["secondary","Continue without logging in"]],null],[1,"\\n "]],[]]]]],[1,"\\n "]],[8]]]]],[1,"\\n "],[8,[39,4],null,[["@target"],["app-before-skip-links"]],[["default"],[[[[1,"\\n "],[8,[39,5],[[4,[38,6],["click",[28,[37,7],[[30,7,["logout"]]],null]],null]],null,[["default"],[[[[1,"\\n Logout\\n "]],[]]]]],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,15],null,null,[["default"],[[[[1,"\\n "],[8,[30,10,["Action"]],[[4,[38,6],["click",[30,10,["toggle"]]],null]],null,[["default"],[[[[1,"\\n Logout\\n "]],[]]]]],[1,"\\n "],[8,[30,10,["Menu"]],null,null,[["default"],[[[[1,"\\n"],[41,[30,7,["token","AccessorID"]],[[[1," "],[8,[39,16],null,[["@item"],[[30,7,["token"]]]],null],[1,"\\n"]],[]],null],[1," "],[8,[30,11,["Menu"]],null,null,[["default"],[[[[1,"\\n "],[8,[30,12,["Separator"]],null,null,null],[1,"\\n "],[8,[30,12,["Item"]],[[24,0,"dangerous"]],null,[["default"],[[[[1,"\\n "],[8,[30,12,["Action"]],[[4,[38,6],["click",[28,[37,7],[[30,7,["logout"]]],null]],null]],null,[["default"],[[[[1,"\\n Logout\\n "]],[]]]]],[1,"\\n "]],[]]]]],[1,"\\n "]],[12]]]]],[1,"\\n "]],[11]]]]],[1,"\\n "]],[10]]]]],[1,"\\n "]],[7]]]]],[1,"\\n\\n "],[13],[1,"\\n"],[18,13,[[28,[37,9],null,[["open","close"],[[30,0,["modal","open"]],[30,0,["model","close"]]]]]]],[1,"\\n"]],[]],null],[1,"\\n"]],["authDialog","modal","@dc","@partition","@nspace","authForm","authDialog","modal","authForm","disclosure","panel","menu","&default"],false,["if","can","auth-dialog","uri","portal","action","on","optional","modal-dialog","hash","ref","block-slot","auth-form","oidc-select","hds/button","disclosure-menu","auth-profile","yield"]]',moduleName:"consul-ui/components/consul/token/selector/index.hbs",isStrictMode:!1}) +let u=(o((i=class extends l.default{open(){this.authForm.focus()}close(){this.authForm.reset()}reauthorize(e){this.modal.close(),this.args.onchange(e)}}).prototype,"open",[r.action],Object.getOwnPropertyDescriptor(i.prototype,"open"),i.prototype),o(i.prototype,"close",[r.action],Object.getOwnPropertyDescriptor(i.prototype,"close"),i.prototype),o(i.prototype,"reauthorize",[r.action],Object.getOwnPropertyDescriptor(i.prototype,"reauthorize"),i.prototype),i) +e.default=u,(0,t.setComponentTemplate)(a,u)})),define("consul-ui/components/consul/tomography/graph/index",["exports","@ember/component","@ember/template-factory","@glimmer/component","@glimmer/tracking"],(function(e,t,n,l,r){var i,o +function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const u=(0,n.createTemplateFactory)({id:"ZXa/jDY4",block:'[[[11,0],[24,0,"tomography-graph"],[17,1],[12],[1,"\\n "],[10,"svg"],[15,"width",[30,0,["size"]]],[15,"height",[30,0,["size"]]],[12],[1,"\\n "],[10,"g"],[15,"transform",[29,["translate(",[28,[37,0],[[30,0,["size"]],2],null],", ",[28,[37,0],[[30,0,["size"]],2],null],")"]]],[12],[1,"\\n "],[10,"g"],[12],[1,"\\n "],[10,"circle"],[14,0,"background"],[15,"r",[30,0,["circle","0"]]],[12],[13],[1,"\\n "],[10,"circle"],[14,0,"axis"],[15,"r",[30,0,["circle","1"]]],[12],[13],[1,"\\n "],[10,"circle"],[14,0,"axis"],[15,"r",[30,0,["circle","2"]]],[12],[13],[1,"\\n "],[10,"circle"],[14,0,"axis"],[15,"r",[30,0,["circle","3"]]],[12],[13],[1,"\\n "],[10,"circle"],[14,0,"border"],[15,"r",[30,0,["circle","4"]]],[12],[13],[1,"\\n "],[13],[1,"\\n "],[10,"g"],[14,0,"lines"],[12],[1,"\\n"],[42,[28,[37,2],[[28,[37,2],[[30,0,["distances"]]],null]],null],null,[[[1," "],[11,"rect"],[16,"transform",[29,["rotate(",[30,2,["rotate"]],")"]]],[16,"width",[30,2,["y2"]]],[24,"height","1"],[4,[38,3],[[28,[37,4],[[30,2,["node"]]," - ",[28,[37,5],[[30,2,["distance"]]],[["maximumFractionDigits"],[2]]],"ms",[52,[30,2,["segment"]],[28,[37,4],["
      (Segment: ",[30,2,["segment"]],")"],null]]],null]],[["options"],[[28,[37,7],null,[["followCursor","allowHTML"],[true,true]]]]]],[12],[13],[1,"\\n"]],[2]],null],[1," "],[13],[1,"\\n "],[10,"g"],[14,0,"labels"],[12],[1,"\\n "],[10,"circle"],[14,0,"point"],[14,"r","5"],[12],[13],[1,"\\n "],[10,"g"],[14,0,"tick"],[15,"transform",[29,["translate(0, ",[30,0,["labels","0"]],")"]]],[12],[1,"\\n "],[10,"line"],[14,"x2","70"],[12],[13],[1,"\\n "],[10,"text"],[14,"x","75"],[14,"y","0"],[14,"dy",".32em"],[12],[1,[28,[35,5],[[30,0,["milliseconds","0"]]],[["maximumFractionDigits"],[2]]]],[1,"ms"],[13],[1,"\\n "],[13],[1,"\\n "],[10,"g"],[14,0,"tick"],[15,"transform",[29,["translate(0, ",[30,0,["labels","1"]],")"]]],[12],[1,"\\n "],[10,"line"],[14,"x2","70"],[12],[13],[1,"\\n "],[10,"text"],[14,"x","75"],[14,"y","0"],[14,"dy",".32em"],[12],[1,[28,[35,5],[[30,0,["milliseconds","1"]]],[["maximumFractionDigits"],[2]]]],[1,"ms"],[13],[1,"\\n "],[13],[1,"\\n "],[10,"g"],[14,0,"tick"],[15,"transform",[29,["translate(0, ",[30,0,["labels","2"]],")"]]],[12],[1,"\\n "],[10,"line"],[14,"x2","70"],[12],[13],[1,"\\n "],[10,"text"],[14,"x","75"],[14,"y","0"],[14,"dy",".32em"],[12],[1,[28,[35,5],[[30,0,["milliseconds","2"]]],[["maximumFractionDigits"],[2]]]],[1,"ms"],[13],[1,"\\n "],[13],[1,"\\n "],[10,"g"],[14,0,"tick"],[15,"transform",[29,["translate(0, ",[30,0,["labels","3"]],")"]]],[12],[1,"\\n "],[10,"line"],[14,"x2","70"],[12],[13],[1,"\\n "],[10,"text"],[14,"x","75"],[14,"y","0"],[14,"dy",".32em"],[12],[1,[28,[35,5],[[30,0,["milliseconds","3"]]],[["maximumFractionDigits"],[2]]]],[1,"ms"],[13],[1,"\\n "],[13],[1,"\\n "],[13],[1,"\\n "],[13],[1,"\\n "],[13],[1,"\\n"],[13],[1,"\\n"]],["&attrs","item"],false,["div","each","-track-array","tooltip","concat","format-number","if","hash"]]',moduleName:"consul-ui/components/consul/tomography/graph/index.hbs",isStrictMode:!1}),s=function(e){return 160*e} +let c=(i=class extends l.default{constructor(){var e,t,n,l +super(...arguments),e=this,t="max",l=this,(n=o)&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(l):void 0}),a(this,"size",336),a(this,"circle",[s(1),s(.25),s(.5),s(.75),s(1)]),a(this,"labels",[s(-.25),s(-.5),s(-.75),s(-1)])}get milliseconds(){const e=(this.args.distances||[]).reduce(((e,t)=>Math.max(e,t.distance)),this.max) +return[25,50,75,100].map((t=>function(e,t){return t>0?parseInt(t*e)/100:0}(t,e)))}get distances(){let e=this.args.distances||[] +const t=e.reduce(((e,t)=>Math.max(e,t.distance)),this.max),n=e.length +if(n>360){const t=360/n +e=e.filter((function(e,l){return 0==l||l==n-1||Math.random()({rotate:360*l/e.length,y2:n.distance/t*160,node:n.node,distance:n.distance,segment:n.segment})))}},d=i.prototype,p="max",f=[r.tracked],m={configurable:!0,enumerable:!0,writable:!0,initializer:function(){return-999999999}},b={},Object.keys(m).forEach((function(e){b[e]=m[e]})),b.enumerable=!!b.enumerable,b.configurable=!!b.configurable,("value"in b||b.initializer)&&(b.writable=!0),b=f.slice().reverse().reduce((function(e,t){return t(d,p,e)||e}),b),h&&void 0!==b.initializer&&(b.value=b.initializer?b.initializer.call(h):void 0,b.initializer=void 0),void 0===b.initializer&&(Object.defineProperty(d,p,b),b=null),o=b,i) +var d,p,f,m,h,b +e.default=c,(0,t.setComponentTemplate)(u,c)})),define("consul-ui/components/consul/transparent-proxy/index",["exports","@ember/component","@ember/template-factory","@ember/component/template-only"],(function(e,t,n,l){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const r=(0,n.createTemplateFactory)({id:"UjBsOCBt",block:'[[[10,1],[14,0,"consul-transparent-proxy"],[12],[1,"\\n "],[1,[28,[35,0],["components.consul.transparent-proxy"],null]],[1,"\\n"],[13]],[],false,["t"]]',moduleName:"consul-ui/components/consul/transparent-proxy/index.hbs",isStrictMode:!1}) +var i=(0,t.setComponentTemplate)(r,(0,l.default)()) +e.default=i})),define("consul-ui/components/consul/upstream-instance/list/index",["exports","@ember/component","@ember/template-factory","@ember/component/template-only"],(function(e,t,n,l){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const r=(0,n.createTemplateFactory)({id:"GEohwFqk",block:'[[[11,0],[24,0,"consul-upstream-instance-list"],[17,1],[12],[1,"\\n "],[10,"ul"],[12],[1,"\\n"],[42,[28,[37,1],[[28,[37,1],[[30,2]],null]],null],null,[[[1," "],[10,"li"],[12],[1,"\\n\\n "],[10,0],[14,0,"header"],[12],[1,"\\n "],[10,2],[12],[1,"\\n "],[1,[30,3,["DestinationName"]]],[1,"\\n "],[13],[1,"\\n "],[13],[1,"\\n\\n "],[10,0],[14,0,"detail"],[12],[1,"\\n\\n"],[41,[28,[37,3],[[30,3,["DestinationType"]],"prepared_query"],null],[[[1," "],[8,[39,4],null,[["@item","@partition","@nspace"],[[28,[37,5],null,[["Namespace","Partition"],[[28,[37,6],[[30,3,["DestinationNamespace"]],[30,4]],null],[28,[37,6],[[30,3,["DestinationPartition"]],[30,5]],null]]]],[30,5],[30,4]]],null],[1,"\\n"]],[]],null],[1,"\\n"],[41,[28,[37,7],[[28,[37,3],[[30,3,["Datacenter"]],[30,6]],null],[28,[37,3],[[30,3,["Datacenter"]],""],null]],null],[[[1," "],[10,"dl"],[14,0,"datacenter"],[12],[1,"\\n "],[11,"dt"],[4,[38,8],null,null],[12],[1,"\\n Datacenter\\n "],[13],[1,"\\n "],[10,"dd"],[12],[1,"\\n "],[1,[30,3,["Datacenter"]]],[1,"\\n "],[13],[1,"\\n "],[13],[1,"\\n"]],[]],null],[1,"\\n"],[41,[30,3,["LocalBindSocketPath"]],[[[1," "],[10,"dl"],[14,0,"local-bind-socket-path"],[12],[1,"\\n "],[10,"dt"],[12],[1,"\\n Local bind socket path\\n "],[13],[1,"\\n "],[10,"dd"],[12],[1,"\\n "],[8,[39,9],null,[["@value","@name"],[[30,3,["LocalBindSocketPath"]],"Local bind socket path"]],null],[1,"\\n "],[1,[30,3,["LocalBindSocketPath"]]],[1,"\\n "],[13],[1,"\\n "],[13],[1,"\\n "],[10,"dl"],[14,0,"local-bind-socket-mode"],[12],[1,"\\n "],[10,"dt"],[12],[1,"\\n Mode\\n "],[13],[1,"\\n "],[10,"dd"],[12],[1,"\\n "],[1,[28,[35,6],[[30,3,["LocalBindSocketMode"]],"-"],null]],[1,"\\n "],[13],[1,"\\n "],[13],[1,"\\n"]],[]],[[[1,"\\n"],[41,[28,[37,10],[[30,3,["LocalBindPort"]],0],null],[[[44,[[28,[37,12],[[28,[37,6],[[30,3,["LocalBindAddress"]],"127.0.0.1"],null],":",[30,3,["LocalBindPort"]]],null]],[[[1," "],[10,"dl"],[14,0,"local-bind-address"],[12],[1,"\\n "],[10,"dt"],[12],[1,"\\n Address\\n "],[13],[1,"\\n "],[10,"dd"],[12],[1,"\\n "],[8,[39,9],null,[["@value","@name"],[[30,7],"Address"]],null],[1,"\\n "],[1,[30,7]],[1,"\\n "],[13],[1,"\\n "],[13],[1,"\\n"]],[7]]]],[]],null],[1,"\\n"]],[]]],[1,"\\n "],[13],[1,"\\n "],[13],[1,"\\n"]],[3]],null],[1," "],[13],[1,"\\n"],[13],[1,"\\n"]],["&attrs","@items","item","@nspace","@partition","@dc","combinedAddress"],false,["each","-track-array","if","not-eq","consul/bucket/list","hash","or","and","tooltip","copy-button","gt","let","concat"]]',moduleName:"consul-ui/components/consul/upstream-instance/list/index.hbs",isStrictMode:!1}) +var i=(0,t.setComponentTemplate)(r,(0,l.default)()) +e.default=i})),define("consul-ui/components/consul/upstream-instance/search-bar/index",["exports","@ember/component","@ember/template-factory","@ember/component/template-only"],(function(e,t,n,l){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const r=(0,n.createTemplateFactory)({id:"wsZfd7L1",block:'[[[8,[39,0],[[24,0,"consul-upstream-instance-search-bar"],[17,1]],[["@filter"],[[30,2]]],[["status","search","sort"],[[[[1,"\\n\\n"],[44,[[28,[37,2],[[28,[37,3],["components.consul.upstream-instance.search-bar.",[30,3,["status","key"]],".name"],null]],[["default"],[[28,[37,4],[[28,[37,3],["common.search.",[30,3,["status","key"]]],null],[28,[37,3],["common.consul.",[30,3,["status","key"]]],null]],null]]]],[28,[37,2],[[28,[37,3],["components.consul.upstream-instance.search-bar.",[30,3,["status","value"]],".name"],null]],[["default"],[[28,[37,4],[[28,[37,3],["common.search.",[30,3,["status","value"]]],null],[28,[37,3],["common.consul.",[30,3,["status","value"]]],null],[28,[37,3],["common.brand.",[30,3,["status","value"]]],null]],null]]]]],[[[1," "],[8,[30,3,["RemoveFilter"]],[[16,"aria-label",[28,[37,2],["common.ui.remove"],[["item"],[[28,[37,3],[[30,4]," ",[30,5]],null]]]]]],null,[["default"],[[[[1,"\\n "],[10,"dl"],[12],[1,"\\n "],[10,"dt"],[12],[1,[30,4]],[13],[1,"\\n "],[10,"dd"],[12],[1,[30,5]],[13],[1,"\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n"]],[4,5]]],[1,"\\n "]],[3]],[[[1,"\\n "],[8,[30,6,["Search"]],null,[["@onsearch","@value","@placeholder"],[[28,[37,5],[[30,0],[30,7]],null],[30,8],[28,[37,2],["common.search.search"],null]]],[["default"],[[[[1,"\\n "],[8,[30,6,["Select"]],[[24,0,"type-search-properties"]],[["@position","@onchange","@multiple","@required"],["right",[28,[37,5],[[30,0],[30,2,["searchproperty","change"]]],null],true,true]],[["default"],[[[[1,"\\n "],[8,[39,6],null,[["@name"],["selected"]],[["default"],[[[[1,"\\n "],[10,1],[12],[1,"\\n "],[1,[28,[35,2],["common.search.searchproperty"],null]],[1,"\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,6],null,[["@name"],["options"]],[["default"],[[[[1,"\\n"],[44,[[30,9,["Optgroup"]],[30,9,["Option"]]],[[[42,[28,[37,8],[[28,[37,8],[[30,2,["searchproperty","default"]]],null]],null],null,[[[1," "],[8,[30,11],null,[["@value","@selected"],[[30,12],[28,[37,9],[[30,12],[30,2,["searchproperty","value"]]],null]]],[["default"],[[[[1,"\\n "],[1,[28,[35,2],[[28,[37,3],["common.consul.",[28,[37,10],[[30,12]],null]],null]],null]],[1,"\\n "]],[]]]]],[1,"\\n"]],[12]],null]],[10,11]]],[1," "]],[]]]]],[1,"\\n "]],[9]]]]],[1,"\\n "]],[]]]]],[1,"\\n "]],[6]],[[[1,"\\n "],[8,[30,13,["Select"]],[[24,0,"type-sort"]],[["@position","@onchange","@multiple","@required"],["right",[28,[37,5],[[30,0],[30,14,["change"]]],null],false,true]],[["default"],[[[[1,"\\n "],[8,[39,6],null,[["@name"],["selected"]],[["default"],[[[[1,"\\n "],[10,1],[12],[1,"\\n"],[44,[[28,[37,11],[[28,[37,4],[[28,[37,4],["DestinationName:asc",[28,[37,2],["common.sort.alpha.asc"],null]],null],[28,[37,4],["DestinationName:desc",[28,[37,2],["common.sort.alpha.desc"],null]],null]],null]],null]],[[[1," "],[1,[28,[35,12],[[30,16],[30,14,["value"]]],null]],[1,"\\n"]],[16]]],[1," "],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,6],null,[["@name"],["options"]],[["default"],[[[[1,"\\n"],[44,[[30,15,["Optgroup"]],[30,15,["Option"]]],[[[1," "],[8,[30,18],null,[["@value","@selected"],["DestinationName:asc",[28,[37,13],["DestinationName:asc",[30,14,["value"]]],null]]],[["default"],[[[[1,[28,[35,2],["common.sort.alpha.asc"],null]]],[]]]]],[1,"\\n "],[8,[30,18],null,[["@value","@selected"],["DestinationName:desc",[28,[37,13],["DestinationName:desc",[30,14,["value"]]],null]]],[["default"],[[[[1,[28,[35,2],["common.sort.alpha.desc"],null]]],[]]]]],[1,"\\n"]],[17,18]]],[1," "]],[]]]]],[1,"\\n "]],[15]]]]],[1,"\\n "]],[13]]]]],[1,"\\n"]],["&attrs","@filter","search","key","value","search","@onsearch","@search","components","Optgroup","Option","prop","search","@sort","components","selectable","Optgroup","Option"],false,["search-bar","let","t","concat","array","action","block-slot","each","-track-array","includes","lowercase","from-entries","get","eq"]]',moduleName:"consul-ui/components/consul/upstream-instance/search-bar/index.hbs",isStrictMode:!1}) +var i=(0,t.setComponentTemplate)(r,(0,l.default)()) +e.default=i})),define("consul-ui/components/consul/upstream/list/index",["exports","@ember/component","@ember/template-factory","@ember/component/template-only"],(function(e,t,n,l){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const r=(0,n.createTemplateFactory)({id:"eZNZsVXh",block:'[[[8,[39,0],[[24,0,"consul-upstream-list"],[17,1]],[["@items","@linkable"],[[30,2],"linkable upstream"]],[["default"],[[[[1,"\\n "],[8,[39,1],null,[["@name"],["header"]],[["default"],[[[[1,"\\n"],[41,[28,[37,3],[[30,3,["InstanceCount"]],0],null],[[[1," "],[10,"dl"],[15,0,[30,3,["MeshStatus"]]],[12],[1,"\\n "],[10,"dt"],[12],[1,"\\n Health\\n "],[13],[1,"\\n "],[11,"dd"],[4,[38,4],null,null],[12],[1,"\\n"],[41,[28,[37,5],["critical",[30,3,["MeshStatus"]]],null],[[[1," At least one health check on one instance is failing.\\n"]],[]],[[[41,[28,[37,5],["warning",[30,3,["MeshStatus"]]],null],[[[1," At least one health check on one instance has a warning.\\n"]],[]],[[[41,[28,[37,5],["passing",[30,3,["MeshStatus"]]],null],[[[1," All health checks are passing.\\n"]],[]],[[[1," There are no health checks.\\n "]],[]]]],[]]]],[]]],[1," "],[13],[1,"\\n "],[13],[1,"\\n "],[10,3],[15,6,[28,[37,6],["dc.services.show",[30,3,["Name"]]],[["params"],[[52,[28,[37,7],[[30,3,["Partition"]],[30,5]],null],[28,[37,8],null,[["partition","nspace"],[[30,3,["Partition"]],[30,3,["Namespace"]]]]],[52,[28,[37,7],[[30,3,["Namespace"]],[30,6]],null],[28,[37,8],null,[["nspace"],[[30,3,["Namespace"]]]]],[28,[37,8],null,null]]]]]]],[12],[1,"\\n "],[1,[30,3,["Name"]]],[1,"\\n "],[13],[1,"\\n"]],[]],[[[1," "],[10,2],[12],[1,"\\n "],[1,[30,3,["Name"]]],[1,"\\n "],[13],[1,"\\n"]],[]]],[1," "]],[]]]]],[1,"\\n "],[8,[39,1],null,[["@name"],["details"]],[["default"],[[[[1,"\\n "],[8,[39,9],null,[["@item","@nspace","@partition"],[[30,3],[30,6],[30,5]]],null],[1,"\\n"],[42,[28,[37,11],[[28,[37,11],[[30,3,["GatewayConfig","Addresses"]]],null]],null],null,[[[1," "],[10,"dl"],[12],[1,"\\n "],[10,"dt"],[12],[1,"\\n Address\\n "],[13],[1,"\\n "],[10,"dd"],[12],[1,"\\n "],[8,[39,12],null,[["@value","@name"],[[30,7],"Address"]],null],[1,"\\n "],[1,[30,7]],[1,"\\n "],[13],[1,"\\n "],[13],[1,"\\n"]],[7]],null],[1," "]],[]]]]],[1,"\\n"]],[3,4]]]]],[1,"\\n"]],["&attrs","@items","item","index","@partition","@nspace","address"],false,["list-collection","block-slot","if","gt","tooltip","eq","href-to","not-eq","hash","consul/bucket/list","each","-track-array","copy-button"]]',moduleName:"consul-ui/components/consul/upstream/list/index.hbs",isStrictMode:!1}) +var i=(0,t.setComponentTemplate)(r,(0,l.default)()) +e.default=i})),define("consul-ui/components/consul/upstream/search-bar/index",["exports","@ember/component","@ember/template-factory","@ember/component/template-only"],(function(e,t,n,l){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const r=(0,n.createTemplateFactory)({id:"t4tLfZqU",block:'[[[8,[39,0],[[24,0,"consul-upstream-search-bar"],[17,1]],[["@filter"],[[30,2]]],[["status","search","filter","sort"],[[[[1,"\\n\\n"],[44,[[28,[37,2],[[28,[37,3],["components.consul.upstream.search-bar.",[30,3,["status","key"]],".name"],null]],[["default"],[[28,[37,4],[[28,[37,3],["common.search.",[30,3,["status","key"]]],null],[28,[37,3],["common.consul.",[30,3,["status","key"]]],null]],null]]]],[28,[37,2],[[28,[37,3],["components.consul.upstream.search-bar.",[30,3,["status","value"]],".name"],null]],[["default"],[[28,[37,4],[[28,[37,3],["common.search.",[30,3,["status","value"]]],null],[28,[37,3],["common.consul.",[30,3,["status","value"]]],null],[28,[37,3],["common.brand.",[30,3,["status","value"]]],null]],null]]]]],[[[1," "],[8,[30,3,["RemoveFilter"]],[[16,"aria-label",[28,[37,2],["common.ui.remove"],[["item"],[[28,[37,3],[[30,4]," ",[30,5]],null]]]]]],null,[["default"],[[[[1,"\\n "],[10,"dl"],[12],[1,"\\n "],[10,"dt"],[12],[1,[30,4]],[13],[1,"\\n "],[10,"dd"],[12],[1,[30,5]],[13],[1,"\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n"]],[4,5]]],[1,"\\n "]],[3]],[[[1,"\\n "],[8,[30,6,["Search"]],null,[["@onsearch","@value","@placeholder"],[[28,[37,5],[[30,0],[30,7]],null],[30,8],[28,[37,2],["common.search.search"],null]]],[["default"],[[[[1,"\\n "],[8,[30,6,["Select"]],[[24,0,"type-search-properties"]],[["@position","@onchange","@multiple","@required"],["right",[28,[37,5],[[30,0],[30,2,["searchproperty","change"]]],null],true,true]],[["default"],[[[[1,"\\n "],[8,[39,6],null,[["@name"],["selected"]],[["default"],[[[[1,"\\n "],[10,1],[12],[1,"\\n "],[1,[28,[35,2],["common.search.searchproperty"],null]],[1,"\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,6],null,[["@name"],["options"]],[["default"],[[[[1,"\\n"],[44,[[30,9,["Optgroup"]],[30,9,["Option"]]],[[[42,[28,[37,8],[[28,[37,8],[[30,2,["searchproperty","default"]]],null]],null],null,[[[1," "],[8,[30,11],null,[["@value","@selected"],[[30,12],[28,[37,9],[[30,12],[30,2,["searchproperty","value"]]],null]]],[["default"],[[[[1,"\\n "],[1,[28,[35,2],[[28,[37,3],["common.consul.",[28,[37,10],[[30,12]],null]],null]],null]],[1,"\\n "]],[]]]]],[1,"\\n"]],[12]],null]],[10,11]]],[1," "]],[]]]]],[1,"\\n "]],[9]]]]],[1,"\\n "]],[]]]]],[1,"\\n "]],[6]],[[[1,"\\n "],[8,[30,13,["Select"]],null,[["@position","@onchange","@multiple"],["left",[28,[37,5],[[30,0],[30,2,["instance","change"]]],null],true]],[["default"],[[[[1,"\\n "],[8,[39,6],null,[["@name"],["selected"]],[["default"],[[[[1,"\\n "],[10,1],[12],[1,"\\n "],[1,[28,[35,2],["components.consul.upstream.search-bar.instance.name"],null]],[1,"\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,6],null,[["@name"],["options"]],[["default"],[[[[1,"\\n"],[44,[[30,14,["Optgroup"]],[30,14,["Option"]]],[[[42,[28,[37,8],[[28,[37,8],[[28,[37,4],["registered","not-registered"],null]],null]],null],null,[[[1," "],[8,[30,16],null,[["@value","@selected"],[[30,17],[28,[37,9],[[30,17],[30,2,["instance","value"]]],null]]],[["default"],[[[[1,"\\n "],[1,[28,[35,2],[[28,[37,3],["common.consul.",[30,17]],null]],null]],[1,"\\n "]],[]]]]],[1,"\\n"]],[17]],null]],[15,16]]],[1," "]],[]]]]],[1,"\\n "]],[14]]]]],[1,"\\n "]],[13]],[[[1,"\\n "],[8,[30,18,["Select"]],[[24,0,"type-sort"]],[["@position","@onchange","@multiple","@required"],["right",[28,[37,5],[[30,0],[30,19,["change"]]],null],false,true]],[["default"],[[[[1,"\\n "],[8,[39,6],null,[["@name"],["selected"]],[["default"],[[[[1,"\\n "],[10,1],[12],[1,"\\n"],[44,[[28,[37,11],[[28,[37,4],[[28,[37,4],["Name:asc",[28,[37,2],["common.sort.alpha.asc"],null]],null],[28,[37,4],["Name:desc",[28,[37,2],["common.sort.alpha.desc"],null]],null],[28,[37,4],["Status:asc",[28,[37,2],["common.sort.status.asc"],null]],null],[28,[37,4],["Status:desc",[28,[37,2],["common.sort.status.desc"],null]],null]],null]],null]],[[[1," "],[1,[28,[35,12],[[30,21],[30,19,["value"]]],null]],[1,"\\n"]],[21]]],[1," "],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,6],null,[["@name"],["options"]],[["default"],[[[[1,"\\n"],[44,[[30,20,["Optgroup"]],[30,20,["Option"]]],[[[1," "],[8,[30,22],null,[["@label"],[[28,[37,2],["common.consul.status"],null]]],[["default"],[[[[1,"\\n "],[8,[30,23],null,[["@value","@selected"],["Status:asc",[28,[37,13],["Status:asc",[30,19,["value"]]],null]]],[["default"],[[[[1,[28,[35,2],["common.sort.status.asc"],null]]],[]]]]],[1,"\\n "],[8,[30,23],null,[["@value","@selected"],["Status:desc",[28,[37,13],["Status:desc",[30,19,["value"]]],null]]],[["default"],[[[[1,[28,[35,2],["common.sort.status.desc"],null]]],[]]]]],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[30,22],null,[["@label"],[[28,[37,2],["common.consul.service-name"],null]]],[["default"],[[[[1,"\\n "],[8,[30,23],null,[["@value","@selected"],["Name:asc",[28,[37,13],["Name:asc",[30,19,["value"]]],null]]],[["default"],[[[[1,[28,[35,2],["common.sort.alpha.asc"],null]]],[]]]]],[1,"\\n "],[8,[30,23],null,[["@value","@selected"],["Name:desc",[28,[37,13],["Name:desc",[30,19,["value"]]],null]]],[["default"],[[[[1,[28,[35,2],["common.sort.alpha.desc"],null]]],[]]]]],[1,"\\n "]],[]]]]],[1,"\\n"]],[22,23]]],[1," "]],[]]]]],[1,"\\n "]],[20]]]]],[1,"\\n "]],[18]]]]],[1,"\\n"]],["&attrs","@filter","search","key","value","search","@onsearch","@search","components","Optgroup","Option","prop","search","components","Optgroup","Option","item","search","@sort","components","selectable","Optgroup","Option"],false,["search-bar","let","t","concat","array","action","block-slot","each","-track-array","includes","lowercase","from-entries","get","eq"]]',moduleName:"consul-ui/components/consul/upstream/search-bar/index.hbs",isStrictMode:!1}) +var i=(0,t.setComponentTemplate)(r,(0,l.default)()) +e.default=i})),define("consul-ui/components/copy-button/chart.xstate",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +e.default={id:"copy-button",initial:"idle",on:{RESET:[{target:"idle"}]},states:{idle:{on:{SUCCESS:[{target:"success"}],ERROR:[{target:"error"}]}},success:{},error:{}}}})),define("consul-ui/components/copy-button/index",["exports","@ember/component","@ember/template-factory","@glimmer/component","consul-ui/components/copy-button/chart.xstate"],(function(e,t,n,l,r){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const i=(0,n.createTemplateFactory)({id:"6RaQJr4m",block:'[[[8,[39,0],null,[["@src"],[[30,0,["chart"]]]],[["default"],[[[[1,"\\n "],[11,0],[24,0,"copy-button"],[17,6],[12],[1,"\\n"],[44,[[28,[37,2],[[30,4],"SUCCESS"],null],[28,[37,2],[[30,4],"ERROR"],null],[28,[37,2],[[30,4],"RESET"],null]],[[[1," "],[11,"button"],[16,"aria-label",[28,[37,3],["components.copy-button.title"],[["name"],[[30,10]]]]],[24,4,"button"],[24,0,"copy-btn"],[17,6],[4,[38,4],[[30,11]],[["success","error"],[[30,7],[30,8]]]],[4,[38,5],[[52,[28,[37,7],[[30,5],"success"],null],[28,[37,3],["components.copy-button.success"],[["name"],[[30,10]]]],[28,[37,3],["components.copy-button.error"],null]]],[["options"],[[28,[37,8],null,[["trigger","showOnCreate","delay","onHidden"],["manual",[28,[37,9],[[28,[37,7],[[30,5],"idle"],null]],null],[28,[37,10],[0,3000],null],[30,9]]]]]]],[12],[18,12,null],[13],[1,"\\n"]],[7,8,9]]],[1," "],[13],[1,"\\n"]],[1,2,3,4,5]]]]],[1,"\\n"]],["State","Guard","Action","dispatch","state","&attrs","success","error","reset","@name","@value","&default"],false,["state-chart","let","fn","t","with-copyable","tooltip","if","state-matches","hash","not","array","yield"]]',moduleName:"consul-ui/components/copy-button/index.hbs",isStrictMode:!1}) +class o extends l.default{constructor(){super(...arguments),this.chart=r.default}}e.default=o,(0,t.setComponentTemplate)(i,o)})),define("consul-ui/components/copyable-code/index",["exports","@ember/component","@ember/template-factory","@ember/component/template-only"],(function(e,t,n,l){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const r=(0,n.createTemplateFactory)({id:"Q8iW7hMH",block:'[[[11,0],[16,0,[28,[37,0],["copyable-code",[28,[37,1],["obfuscated",[30,1]],null]],null]],[17,2],[12],[1,"\\n"],[41,[30,1],[[[1," "],[8,[39,3],null,null,[["default"],[[[[1,"\\n "],[8,[30,3,["Action"]],[[16,"aria-label",[52,[33,4,["expanded"]],"Hide","Show"]],[4,[38,5],["click",[30,3,["toggle"]]],null]],null,[["default"],[[[[1,"\\n\\n "]],[]]]]],[1,"\\n "],[8,[30,3,["Details"]],null,null,[["default"],[[[[1,"\\n "],[10,"pre"],[12],[10,"code"],[15,1,[30,4,["id"]]],[12],[1,[30,5]],[13],[13],[1,"\\n "]],[4]]]]],[1,"\\n "],[8,[30,3,["Details"]],null,[["@auto"],[false]],[["default"],[[[[1,"\\n"],[41,[28,[37,6],[[30,6,["expanded"]]],null],[[[1," "],[10,"hr"],[12],[13],[1,"\\n"]],[]],null],[1," "]],[6]]]]],[1,"\\n "]],[3]]]]],[1,"\\n\\n "],[8,[39,7],null,[["@value","@name"],[[30,5],[30,7]]],null],[1,"\\n\\n"]],[]],[[[1," "],[10,"pre"],[12],[10,"code"],[12],[1,[30,5]],[13],[13],[1,"\\n "],[8,[39,7],null,[["@value","@name"],[[30,5],[30,7]]],null],[1,"\\n"]],[]]],[1,"\\n"],[13]],["@obfuscated","&attrs","disclosure","details","@value","details","@name"],false,["class-map","array","if","disclosure","details","on","not","copy-button"]]',moduleName:"consul-ui/components/copyable-code/index.hbs",isStrictMode:!1}) +var i=(0,t.setComponentTemplate)(r,(0,l.default)()) +e.default=i})),define("consul-ui/components/data-collection/index",["exports","@ember/component","@ember/template-factory","@glimmer/component","@ember/service","@ember/object","@ember/object/computed","@glimmer/tracking"],(function(e,t,n,l,r,i,o,a){var u,s,c,d,p,f,m,h,b,y,g,v,O,P,x,w,j +function _(e,t,n,l){n&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(l):void 0})}function k(e,t,n,l,r){var i={} +return Object.keys(l).forEach((function(e){i[e]=l[e]})),i.enumerable=!!i.enumerable,i.configurable=!!i.configurable,("value"in i||i.initializer)&&(i.writable=!0),i=n.slice().reverse().reduce((function(n,l){return l(e,t,n)||n}),i),r&&void 0!==i.initializer&&(i.value=i.initializer?i.initializer.call(r):void 0,i.initializer=void 0),void 0===i.initializer&&(Object.defineProperty(e,t,i),i=null),i}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const S=(0,n.createTemplateFactory)({id:"2flQHkul",block:'[[[1,[28,[35,0],[[28,[37,1],[[30,0],[28,[37,2],[[28,[37,3],[[30,0],"term"],null],""],null],[30,1]],null]],null]],[1,"\\n"],[18,2,[[28,[37,5],null,[["search","items","Collection","Empty"],[[28,[37,1],[[30,0],[30,0,["search"]]],null],[30,0,["items"]],[52,[28,[37,7],[[30,0,["items","length"]],0],null],[50,"anonymous",0,null,null],""],[52,[28,[37,9],[[30,0,["items","length"]],0],null],[50,"anonymous",0,null,null],""]]]]]],[1,"\\n"]],["@search","&default"],false,["did-update","action","fn","set","yield","hash","if","gt","component","eq"]]',moduleName:"consul-ui/components/data-collection/index.hbs",isStrictMode:!1}) +let N=(u=(0,r.inject)("filter"),s=(0,r.inject)("sort"),c=(0,r.inject)("search"),d=(0,o.alias)("searchService.searchables"),p=(0,i.computed)("term","args.search"),f=(0,i.computed)("type","searchMethod","filtered","args.filters"),m=(0,i.computed)("type","args.sort"),h=(0,i.computed)("comparator","searched"),b=(0,i.computed)("searchTerm","searchable","filtered"),y=(0,i.computed)("type","content","args.filters"),g=(0,i.computed)("args.{items.[],items.content.[]}"),v=class extends l.default{constructor(){super(...arguments),_(this,"filter",O,this),_(this,"sort",P,this),_(this,"searchService",x,this),_(this,"term",w,this),_(this,"searchableMap",j,this)}get type(){return this.args.type}get searchMethod(){return this.args.searchable||"exact"}get searchProperties(){return this.args.filters.searchproperties}get searchTerm(){return this.term||this.args.search||""}get searchable(){const e=(0,i.get)(this,"args.filters.searchproperty.value")||(0,i.get)(this,"args.filters.searchproperty") +return new("string"==typeof this.searchMethod?this.searchableMap[this.searchMethod]:this.args.searchable)(this.filtered,{finders:Object.fromEntries(Object.entries(this.searchService.predicate(this.type)).filter((t=>{let[n,l]=t +return void 0===e||e.includes(n)})))})}get comparator(){return void 0===this.args.sort?[]:this.sort.comparator(this.type)(this.args.sort)}get items(){let e="comparator" +return"function"==typeof this.comparator&&(e=this.comparator),(0,i.defineProperty)(this,"sorted",(0,o.sort)("searched",e)),this.sorted}get searched(){return""===this.searchTerm?this.filtered:this.searchable.search(this.searchTerm)}get filtered(){if(void 0===this.args.filters)return this.content.slice() +const e=this.filter.predicate(this.type) +if(void 0===e)return this.content.slice() +const t=Object.entries(this.args.filters).filter((e=>{let[t,n]=e +return Boolean(n)})).map((e=>{let[t,n]=e +return[t,"string"!=typeof n?n.value:n]})) +return this.content.filter(e(Object.fromEntries(t)))}get content(){const e=this.args.items||[] +return"function"==typeof e.dispatchEvent?e.content:e}search(e){return this.term=e,this.items}},O=k(v.prototype,"filter",[u],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),P=k(v.prototype,"sort",[s],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),x=k(v.prototype,"searchService",[c],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),w=k(v.prototype,"term",[a.tracked],{configurable:!0,enumerable:!0,writable:!0,initializer:function(){return""}}),j=k(v.prototype,"searchableMap",[d],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),k(v.prototype,"searchTerm",[p],Object.getOwnPropertyDescriptor(v.prototype,"searchTerm"),v.prototype),k(v.prototype,"searchable",[f],Object.getOwnPropertyDescriptor(v.prototype,"searchable"),v.prototype),k(v.prototype,"comparator",[m],Object.getOwnPropertyDescriptor(v.prototype,"comparator"),v.prototype),k(v.prototype,"items",[h],Object.getOwnPropertyDescriptor(v.prototype,"items"),v.prototype),k(v.prototype,"searched",[b],Object.getOwnPropertyDescriptor(v.prototype,"searched"),v.prototype),k(v.prototype,"filtered",[y],Object.getOwnPropertyDescriptor(v.prototype,"filtered"),v.prototype),k(v.prototype,"content",[g],Object.getOwnPropertyDescriptor(v.prototype,"content"),v.prototype),k(v.prototype,"search",[i.action],Object.getOwnPropertyDescriptor(v.prototype,"search"),v.prototype),v) +e.default=N,(0,t.setComponentTemplate)(S,N)})),define("consul-ui/components/data-form/index",["exports","@ember/component","@ember/template-factory","@ember/service","@ember/object","block-slots","validated-changeset"],(function(e,t,n,l,r,i,o){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const a=(0,n.createTemplateFactory)({id:"IXfByXKe",block:'[[[8,[39,0],null,[["@items","@src","@onchange","@once"],[[99,1,["@items"]],[28,[37,2],["/${partition}/${nspace}/${dc}/${type}/${src}",[28,[37,3],null,[["partition","nspace","dc","type","src"],[[33,4],[33,5],[33,6],[33,7],[33,8]]]]],null],[28,[37,9],[[30,0],"setData"],null],true]],[["default"],[[[[1,"\\n "],[8,[39,10],null,[["@name"],["loaded"]],[["default"],[[[[1,"\\n\\n "],[8,[39,11],null,[["@sink","@type","@label","@ondelete","@onchange"],[[28,[37,2],["/${partition}/${nspace}/${dc}/${type}",[28,[37,3],null,[["partition","nspace","dc","type"],[[33,4],[33,5],[28,[37,12],[[33,13,["Datacenter"]],[33,6]],null],[33,7]]]]],null],[99,7,["@type"]],[99,14,["@label"]],[28,[37,9],[[30,0],[33,15]],null],[28,[37,9],[[30,0],[33,16]],null]]],[["default"],[[[[1,"\\n\\n"],[44,[[28,[37,3],null,[["data","change","isCreate","error","disabled","submit","delete"],[[33,13],[28,[37,9],[[30,0],"change"],null],[33,18],[30,1,["error"]],[30,1,["inflight"]],[28,[37,9],[[30,0],[30,1,["persist"]],[33,13]],null],[28,[37,9],[[30,0],[30,1,["delete"]],[33,13]],null]]]]],[[[1,"\\n "],[18,3,[[30,2]]],[1,"\\n"],[41,[33,21],[[[1," "],[8,[39,10],null,[["@name"],["error"]],[["default"],[[[[1,"\\n "],[8,[39,22],null,[["@name"],["error"]],[["default"],[[[[1,"\\n "],[18,3,[[30,2]]],[1,"\\n "]],[]]]]],[1,"\\n "]],[]]]]],[1,"\\n"]],[]],null],[1,"\\n "],[8,[39,10],null,[["@name"],["content"]],[["default"],[[[[1,"\\n "],[8,[39,22],null,[["@name"],["form"]],[["default"],[[[[1,"\\n "],[18,3,[[30,2]]],[1,"\\n "]],[]]]]],[1,"\\n "]],[]]]]],[1,"\\n\\n"]],[2]]],[1,"\\n "]],[1]]]]],[1,"\\n\\n "]],[]]]]],[1,"\\n"]],[]]]]]],["writer","api","&default"],false,["data-loader","item","uri","hash","partition","nspace","dc","type","src","action","block-slot","data-writer","or","data","label","ondelete","onsubmit","let","create","yield","if","hasError","yield-slot"]]',moduleName:"consul-ui/components/data-form/index.hbs",isStrictMode:!1}) +var u=(0,t.setComponentTemplate)(a,t.default.extend(i.default,{tagName:"",dom:(0,l.inject)("dom"),builder:(0,l.inject)("form"),create:!1,ondelete:function(){return this.onsubmit(...arguments)},oncancel:function(){return this.onsubmit(...arguments)},onsubmit:function(){},onchange:function(e,t){return t.handleEvent(e)},didReceiveAttrs:function(){this._super(...arguments) +try{this.form=this.builder.form(this.type)}catch(e){}},willRender:function(){this._super(...arguments),(0,r.set)(this,"hasError",this._isRegistered("error"))},willDestroyElement:function(){this._super(...arguments),(0,r.get)(this,"data.isNew")&&this.data.rollbackAttributes()},actions:{setData:function(e){let t=e +return(0,o.isChangeset)(e)||void 0===this.form||(t=this.form.setData(e).getData()),(0,r.get)(e,"isNew")&&((0,r.set)(this,"create",!0),t=Object.entries(this.autofill||{}).reduce((function(e,t){let[n,l]=t +return(0,r.set)(e,n,l),e}),t)),(0,r.set)(this,"data",t),this.data},change:function(e,t,n){this.onchange(this.dom.normalizeEvent(e,t),this.form,this.form.getData())}}})) +e.default=u})),define("consul-ui/components/data-loader/chart.xstate",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +e.default={id:"data-loader",initial:"load",on:{OPEN:{target:"load"},ERROR:{target:"disconnected"},LOAD:[{target:"idle",cond:"loaded"},{target:"loading"}]},states:{load:{},loading:{on:{SUCCESS:{target:"idle"},ERROR:{target:"error"}}},idle:{},error:{on:{RETRY:{target:"load"}}},disconnected:{on:{RETRY:{target:"load"}}}}}})) +define("consul-ui/components/data-loader/index",["exports","@ember/component","@ember/template-factory","@ember/object","block-slots","consul-ui/components/data-loader/chart.xstate"],(function(e,t,n,l,r,i){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const o=(0,n.createTemplateFactory)({id:"0gYnIceV",block:'[[[18,9,null],[1,"\\n"],[8,[39,1],null,[["@src"],[[99,2,["@src"]]]],[["default"],[[[[1,"\\n "],[8,[39,3],null,[["@target","@name","@value"],[[30,0],"dispatch",[30,4]]],null],[1,"\\n "],[8,[30,2],null,[["@name","@cond"],["loaded",[28,[37,4],[[30,0],"isLoaded"],null]]],null],[1,"\\n\\n\\n"],[44,[[28,[37,6],null,[["data","error","invalidate","dispatchError"],[[33,7],[33,8],[30,0,["invalidate"]],[28,[37,9],[[28,[37,4],[[30,0],[28,[37,10],[[33,8]],null]],[["value"],["error.errors.firstObject"]]],[28,[37,4],[[30,0],[30,4],"ERROR"],null]],null]]]]],[[[1,"\\n"],[6,[39,11],null,[["name"],["data"]],[["default","else"],[[[[1," "],[18,9,[[30,6]]],[1,"\\n"]],[]],[[[41,[28,[37,13],[[33,14]],null],[[[1," "],[8,[30,1],null,[["@notMatches"],[[28,[37,15],["error","disconnected"],null]]],[["default"],[[[[1,"\\n"],[41,[28,[37,16],[[33,17],[28,[37,18],[[28,[37,13],[[33,19]],null],[28,[37,20],[[30,5],"loading"],null]],null]],null],[[[1," "],[8,[39,21],null,[["@open","@src","@onchange","@onerror"],[[99,22,["@open"]],[99,17,["@src"]],[28,[37,9],[[28,[37,4],[[30,0],"change"],[["value"],["data"]]],[28,[37,4],[[30,0],[30,4],"SUCCESS"],null]],null],[30,6,["dispatchError"]]]],[["default"],[[[[1,"\\n "],[1,[28,[35,23],[[28,[37,24],[[30,0],"invalidate",[30,7,["invalidate"]]],null]],null]],[1,"\\n "]],[7]]]]],[1,"\\n"]],[]],null],[1," "]],[]]]]],[1,"\\n"]],[]],null]],[]]]]],[1,"\\n "],[8,[30,1],null,[["@matches"],["loading"]],[["default"],[[[[1,"\\n"],[6,[39,11],null,[["name"],["loading"]],[["default","else"],[[[[1," "],[18,9,[[30,6]]],[1,"\\n"]],[]],[[[1," "],[8,[39,25],null,null,null],[1,"\\n"]],[]]]]],[1," "]],[]]]]],[1,"\\n\\n "],[8,[30,1],null,[["@matches"],["error"]],[["default"],[[[[1,"\\n"],[6,[39,11],null,[["name"],["error"]],[["default","else"],[[[[1," "],[18,9,[[30,6]]],[1,"\\n"]],[]],[[[1," "],[8,[39,26],null,[["@error"],[[99,8,["@error"]]]],null],[1,"\\n"]],[]]]]],[1," "]],[]]]]],[1,"\\n\\n "],[8,[30,1],null,[["@matches"],[[28,[37,15],["idle","disconnected"],null]]],[["default"],[[[[1,"\\n\\n "],[8,[30,1],null,[["@matches"],["disconnected"]],[["default"],[[[[1,"\\n"],[41,[28,[37,13],[[28,[37,27],[[33,8,["status"]],"401"],null]],null],[[[6,[39,11],null,[["name","params"],["disconnected",[28,[37,28],[[28,[37,4],[[30,0],[30,4],"RESET"],null]],null]]],[["default","else"],[[[[1," "],[18,9,[[30,6]]],[1,"\\n"]],[]],[[[1," "],[8,[39,29],[[4,[38,30],null,[["sticky"],[true]]]],[["@color"],["warning"]],[["default"],[[[[1,"\\n "],[8,[30,8,["Title"]],null,null,[["default"],[[[[1,"Warning!"]],[]]]]],[1,"\\n "],[8,[30,8,["Description"]],null,null,[["default"],[[[[1,"An error was returned whilst loading this data, refresh to try again."]],[]]]]],[1,"\\n "]],[8]]]]],[1,"\\n"]],[]]]]]],[]],null],[1," "]],[]]]]],[1,"\\n"],[41,[28,[37,27],[[33,8,["status"]],"403"],null],[[[6,[39,11],null,[["name"],["error"]],[["default","else"],[[[[1," "],[18,9,[[30,6]]],[1,"\\n"]],[]],[[[1," "],[8,[39,26],null,[["@error"],[[99,8,["@error"]]]],null],[1,"\\n"]],[]]]]]],[]],[[[1," "],[8,[39,11],null,[["@name"],["loaded"]],[["default"],[[[[1,"\\n "],[18,9,[[30,6]]],[1,"\\n "]],[]]]]],[1,"\\n"]],[]]],[1,"\\n "]],[]]]]],[1,"\\n\\n"]],[6]]],[1," "],[1,[28,[35,31],[[28,[37,32],[[30,4],"LOAD"],null]],[["src"],[[33,17]]]]],[1,"\\n"]],[1,2,3,4,5]]]]]],["State","Guard","Action","dispatch","state","api","source","T","&default"],false,["yield","state-chart","chart","ref","action","let","hash","data","error","queue","mut","yield-slot","if","not","items","array","and","src","or","once","state-matches","data-source","open","did-insert","set","consul/loader","error-state","eq","block-params","hds/toast","notification","did-update","fn"]]',moduleName:"consul-ui/components/data-loader/index.hbs",isStrictMode:!1}) +var a=(0,t.setComponentTemplate)(o,t.default.extend(r.default,{tagName:"",onchange:e=>e,init:function(){this._super(...arguments),this.chart=i.default},didReceiveAttrs:function(){this._super(...arguments),void 0!==this.items&&this.actions.change.apply(this,[this.items])},didInsertElement:function(){this._super(...arguments),this.dispatch("LOAD")},actions:{isLoaded:function(){return void 0!==this.items||void 0===this.src},change:function(e){(0,l.set)(this,"data",this.onchange(e))}}})) +e.default=a})),define("consul-ui/components/data-sink/index",["exports","@ember/component","@ember/template-factory","@ember/service","@ember/object","consul-ui/utils/dom/event-source"],(function(e,t,n,l,r,i){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const o=(0,n.createTemplateFactory)({id:"utpO3btI",block:'[[[18,1,[[28,[37,1],null,[["open","state"],[[28,[37,2],[[30,0],"open"],null],[33,3]]]]]],[1,"\\n"]],["&default"],false,["yield","hash","action","state"]]',moduleName:"consul-ui/components/data-sink/index.hbs",isStrictMode:!1}) +var a=(0,t.setComponentTemplate)(o,t.default.extend({tagName:"",service:(0,l.inject)("data-sink/service"),dom:(0,l.inject)("dom"),logger:(0,l.inject)("logger"),onchange:function(e){},onerror:function(e){},state:(0,r.computed)("instance","instance.{dirtyType,isSaving}",(function(){let e +const t=(0,r.get)(this,"instance.isSaving"),n=(0,r.get)(this,"instance.dirtyType") +if(void 0===t&&void 0===n)e="idle" +else{switch(n){case"created":e=t?"creating":"create" +break +case"updated":e=t?"updating":"update" +break +case"deleted":case void 0:e=t?"removing":"remove"}e=`active.${e}`}return{matches:t=>-1!==e.indexOf(t)}})),init:function(){this._super(...arguments),this._listeners=this.dom.listeners()},willDestroyElement:function(){this._super(...arguments),this._listeners.remove()},source:function(e){const t=(0,i.once)(e),n=e=>{(0,r.set)(this,"instance",void 0) +try{this.onerror(e),this.logger.execute(e)}catch(e){this.logger.execute(e)}} +return this._listeners.add(t,{message:e=>{try{(0,r.set)(this,"instance",void 0),this.onchange(e)}catch(t){n(t)}},error:e=>n(e)}),t},didInsertElement:function(){this._super(...arguments),void 0===this.data&&void 0===this.item||this.actions.open.apply(this,[this.data,this.item])},persist:function(e,t){void 0!==e?(0,r.set)(this,"instance",this.service.prepare(this.sink,e,t)):(0,r.set)(this,"instance",t),this.source((()=>this.service.persist(this.sink,this.instance)))},remove:function(e){(0,r.set)(this,"instance",e),this.source((()=>this.service.remove(this.sink,e)))},actions:{open:function(e,t){if(t instanceof Event&&(t=void 0),void 0===e&&void 0===t)throw new Error("You must specify data to save, or null to remove") +null===e||""===e?this.remove(t):this.persist(e,t)}}})) +e.default=a})),define("consul-ui/components/data-source/index",["exports","@ember/component","@ember/template-factory","@glimmer/component","@ember/service","@glimmer/tracking","@ember/object","@ember/runloop","@ember/debug"],(function(e,t,n,l,r,i,o,a,u){var s,c,d,p,f,m,h,b,y,g +function v(e,t,n,l){n&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(l):void 0})}function O(e,t,n,l,r){var i={} +return Object.keys(l).forEach((function(e){i[e]=l[e]})),i.enumerable=!!i.enumerable,i.configurable=!!i.configurable,("value"in i||i.initializer)&&(i.writable=!0),i=n.slice().reverse().reduce((function(n,l){return l(e,t,n)||n}),i),r&&void 0!==i.initializer&&(i.value=i.initializer?i.initializer.call(r):void 0,i.initializer=void 0),void 0===i.initializer&&(Object.defineProperty(e,t,i),i=null),i}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const P=(0,n.createTemplateFactory)({id:"CRu7UTYr",block:'[[[41,[28,[37,1],[[30,0,["disabled"]]],null],[[[41,[28,[37,2],[[30,0,["loading"]],"lazy"],null],[[[1," "],[11,"data"],[24,"aria-hidden","true"],[24,5,"width: 0;height: 0;font-size: 0;padding: 0;margin: 0;"],[4,[38,3],[[30,0,["connect"]]],null],[12],[13],[1,"\\n"]],[]],[[[1," "],[1,[28,[35,3],[[30,0,["connect"]]],null]],[1,"\\n"]],[]]],[1," "],[1,[28,[35,4],[[30,0,["attributeChanged"]],"src",[30,1]],null]],[1,"\\n "],[1,[28,[35,4],[[30,0,["attributeChanged"]],"loading",[30,2]],null]],[1,"\\n "],[1,[28,[35,5],[[30,0,["disconnect"]]],null]],[1,"\\n"]],[]],null],[1,[28,[35,4],[[30,0,["attributeChanged"]],"disabled",[30,3]],null]],[1,"\\n"],[18,4,[[28,[37,7],null,[["data","error","invalidate","Source"],[[30,0,["data"]],[30,0,["error"]],[30,0,["invalidate"]],[52,[30,0,["data"]],[50,"data-source",0,null,[["disabled"],[[28,[37,1],[[28,[37,2],[[30,0,["error"]],[27]],null]],null]]]],""]]]]]],[1,"\\n"]],["@src","@loading","@disabled","&default"],false,["if","not","eq","did-insert","did-update","will-destroy","yield","hash","component"]]',moduleName:"consul-ui/components/data-source/index.hbs",isStrictMode:!1}),x=function(e,t,n){let l=arguments.length>3&&void 0!==arguments[3]?arguments[3]:function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null +return"function"==typeof e?e():null} +const r=e[t] +return r!==n&&l(r,n),e[t]=n},w=()=>{},j=e=>"function"==typeof e?e:w,_=["eager","lazy"] +let k=(s=(0,r.inject)("data-source/service"),c=(0,r.inject)("dom"),d=(0,r.inject)("logger"),p=class extends l.default{constructor(e,t){super(...arguments),v(this,"dataSource",f,this),v(this,"dom",m,this),v(this,"logger",h,this),v(this,"isIntersecting",b,this),v(this,"data",y,this),v(this,"error",g,this),this._listeners=this.dom.listeners(),this._lazyListeners=this.dom.listeners()}get loading(){return _.includes(this.args.loading)?this.args.loading:_[0]}get disabled(){return void 0!==this.args.disabled&&this.args.disabled}onchange(e){this.error=void 0,this.data=e.data,j(this.args.onchange)(e)}onerror(e){this.error=e.error||e,j(this.args.onerror)(e)}connect(e){Array.isArray(e)?(this._lazyListeners.remove(),this.open()):this._lazyListeners.add(this.dom.isInViewport(e,(e=>{this.isIntersecting=e,this.isIntersecting?this.open():this.close()})))}disconnect(){void 0!==this.data&&void 0===this.data.length&&"function"==typeof this.data.rollbackAttributes&&this.data.rollbackAttributes(),this.close(),this._listeners.remove(),this._lazyListeners.remove()}attributeChanged(e){let[t,n]=e +if("src"===t)("eager"===this.loading||this.isIntersecting)&&this.open()}open(){const e=this.args.src,t=x(this,"source",this.dataSource.open(e,this,this.open),((e,t)=>{this.dataSource.close(e,this)})),n=e=>{try{const t=(0,o.get)(e,"error.errors.firstObject")||{} +"429"!==(0,o.get)(t,"status")&&this.onerror(e),this.logger.execute(e)}catch(e){this.logger.execute(e)}},l=this._listeners.add(this.source,{message:e=>{try{this.onchange(e)}catch(t){n(t)}},error:e=>{n(e)}}) +if(x(this,"_remove",l),"function"==typeof t.getCurrentEvent){const e=t.getCurrentEvent() +if(e){let t +void 0!==e.error?(t="onerror",this.error=e.error):(this.error=void 0,this.data=e.data,t="onchange"),(0,a.schedule)("afterRender",(()=>{try{this[t](e)}catch(l){n(l)}}))}}}async invalidate(){this.source.readyState=2,this.disconnect(),(0,a.schedule)("afterRender",(()=>{(0,u.runInDebug)((e=>console.debug("Invalidation is only supported for non-lazy data sources. If you want to use this you should fixup support for lazy data sources"))),this.connect([])}))}close(){void 0!==this.source&&(this.dataSource.close(this.source,this),x(this,"_remove",void 0),this.source=void 0)}},f=O(p.prototype,"dataSource",[s],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),m=O(p.prototype,"dom",[c],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),h=O(p.prototype,"logger",[d],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),b=O(p.prototype,"isIntersecting",[i.tracked],{configurable:!0,enumerable:!0,writable:!0,initializer:function(){return!1}}),y=O(p.prototype,"data",[i.tracked],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),g=O(p.prototype,"error",[i.tracked],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),O(p.prototype,"connect",[o.action],Object.getOwnPropertyDescriptor(p.prototype,"connect"),p.prototype),O(p.prototype,"disconnect",[o.action],Object.getOwnPropertyDescriptor(p.prototype,"disconnect"),p.prototype),O(p.prototype,"attributeChanged",[o.action],Object.getOwnPropertyDescriptor(p.prototype,"attributeChanged"),p.prototype),O(p.prototype,"open",[o.action],Object.getOwnPropertyDescriptor(p.prototype,"open"),p.prototype),O(p.prototype,"invalidate",[o.action],Object.getOwnPropertyDescriptor(p.prototype,"invalidate"),p.prototype),O(p.prototype,"close",[o.action],Object.getOwnPropertyDescriptor(p.prototype,"close"),p.prototype),p) +e.default=k,(0,t.setComponentTemplate)(P,k)})),define("consul-ui/components/data-writer/chart.xstate",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +e.default={id:"data-writer",initial:"idle",states:{idle:{on:{PERSIST:{target:"persisting"},REMOVE:{target:"removing"}}},removing:{on:{SUCCESS:{target:"removed"},ERROR:{target:"error"}}},persisting:{on:{SUCCESS:{target:"persisted"},ERROR:{target:"error"}}},removed:{on:{RESET:{target:"idle"}}},persisted:{on:{RESET:{target:"idle"}}},error:{on:{RESET:{target:"idle"}}}}}})),define("consul-ui/components/data-writer/index",["exports","@ember/component","@ember/template-factory","@ember/object","block-slots","consul-ui/components/data-writer/chart.xstate"],(function(e,t,n,l,r,i){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const o=(0,n.createTemplateFactory)({id:"RH49dABa",block:'[[[8,[39,0],null,[["@src"],[[99,1,["@src"]]]],[["default"],[[[[1,"\\n\\n "],[8,[39,2],null,[["@target","@name","@value"],[[30,0],"dispatch",[30,4]]],null],[1,"\\n\\n"],[44,[[28,[37,4],null,[["data","error","persist","delete","inflight","disabled"],[[33,5],[33,6],[28,[37,7],[[30,0],"persist"],null],[28,[37,8],[[28,[37,7],[[30,0],[28,[37,9],[[33,5]],null]],null],[28,[37,7],[[30,0],[30,4],"REMOVE"],null]],null],[28,[37,10],[[30,5],[28,[37,11],["persisting","removing"],null]],null],[28,[37,10],[[30,5],[28,[37,11],["persisting","removing"],null]],null]]]]],[[[1,"\\n "],[18,13,[[30,6]]],[1,"\\n\\n "],[8,[30,1],null,[["@matches"],["removing"]],[["default"],[[[[1,"\\n "],[8,[39,13],null,[["@sink","@item","@data","@onchange","@onerror"],[[99,14,["@sink"]],[99,5,["@item"]],null,[28,[37,7],[[30,0],[30,4],"SUCCESS"],null],[28,[37,7],[[30,0],"error"],null]]],null],[1,"\\n "]],[]]]]],[1,"\\n\\n "],[8,[30,1],null,[["@matches"],["persisting"]],[["default"],[[[[1,"\\n "],[8,[39,13],null,[["@sink","@item","@onchange","@onerror"],[[99,14,["@sink"]],[99,5,["@item"]],[28,[37,7],[[30,0],[30,4],"SUCCESS"],null],[28,[37,7],[[30,0],"error"],null]]],null],[1,"\\n "]],[]]]]],[1,"\\n\\n "],[8,[30,1],null,[["@matches"],["removed"]],[["default"],[[[[1,"\\n"],[44,[[28,[37,8],[[28,[37,7],[[30,0],[30,4],"RESET"],null],[28,[37,7],[[30,0],[33,15]],null]],null]],[[[6,[39,16],null,[["name","params"],["removed",[28,[37,17],[[30,7]],null]]],[["default","else"],[[[[1," "],[18,13,[[30,6]]],[1,"\\n"]],[]],[[[1," "],[8,[39,18],[[4,[38,19],null,[["after"],[[28,[37,7],[[30,0],[30,7]],null]]]]],[["@color"],["success"]],[["default"],[[[[1,"\\n "],[8,[30,8,["Title"]],null,null,[["default"],[[[[1,"Success!"]],[]]]]],[1,"\\n "],[8,[30,8,["Description"]],null,null,[["default"],[[[[1,"Your "],[1,[28,[35,20],[[33,21],[33,22]],null]],[1," has been deleted."]],[]]]]],[1,"\\n "]],[8]]]]],[1,"\\n"]],[]]]]]],[7]]],[1," "]],[]]]]],[1,"\\n\\n "],[8,[30,1],null,[["@matches"],["persisted"]],[["default"],[[[[1,"\\n"],[44,[[28,[37,7],[[30,0],[33,23]],null]],[[[6,[39,16],null,[["name","params"],["persisted",[28,[37,17],[[30,9]],null]]],[["default","else"],[[[[1," "],[18,13,[[30,6]]],[1,"\\n"]],[]],[[[1," "],[8,[39,18],[[4,[38,19],null,[["after"],[[28,[37,7],[[30,0],[30,9]],null]]]]],[["@color"],["success"]],[["default"],[[[[1,"\\n "],[8,[30,10,["Title"]],null,null,[["default"],[[[[1,"Success!"]],[]]]]],[1,"\\n "],[8,[30,10,["Description"]],null,null,[["default"],[[[[1,"Your "],[1,[28,[35,20],[[33,21],[33,22]],null]],[1," has been saved."]],[]]]]],[1,"\\n "]],[10]]]]],[1,"\\n"]],[]]]]]],[9]]],[1," "]],[]]]]],[1,"\\n\\n "],[8,[30,1],null,[["@matches"],["error"]],[["default"],[[[[1,"\\n"],[44,[[28,[37,7],[[30,0],[30,4],"RESET"],null]],[[[6,[39,16],null,[["name","params"],["error",[28,[37,17],[[30,11],[30,6,["error"]]],null]]],[["default","else"],[[[[1," "],[18,13,[[30,6]]],[1,"\\n"]],[]],[[[1," "],[8,[39,18],[[4,[38,19],null,[["after"],[[28,[37,7],[[30,0],[30,11]],null]]]]],[["@color"],["critical"]],[["default"],[[[[1,"\\n "],[8,[30,12,["Title"]],null,null,[["default"],[[[[1,"Error!"]],[]]]]],[1,"\\n "],[8,[30,12,["Description"]],null,null,[["default"],[[[[1,"There was an error saving your "],[1,[28,[35,20],[[33,21],[33,22]],null]],[1,".\\n"],[41,[28,[37,25],[[30,6,["error","status"]],[30,6,["error","detail"]]],null],[[[1," "],[10,"br"],[12],[13],[1,[30,6,["error","status"]]],[1,": "],[1,[30,6,["error","detail"]]],[1,"\\n"]],[]],[[[41,[30,6,["error","message"]],[[[1," "],[10,"br"],[12],[13],[1,[30,6,["error","message"]]],[1,"\\n "]],[]],null]],[]]],[1," "]],[]]]]],[1,"\\n "]],[12]]]]],[1,"\\n"]],[]]]]]],[11]]],[1," "]],[]]]]],[1,"\\n\\n "],[8,[39,16],null,[["@name"],["content"]],[["default"],[[[[1,"\\n "],[18,13,[[30,6]]],[1,"\\n "]],[]]]]],[1,"\\n\\n"]],[6]]]],[1,2,3,4,5]]]]]],["State","Guard","Action","dispatch","state","api","after","T","after","T","after","T","&default"],false,["state-chart","chart","ref","let","hash","data","error","action","queue","mut","state-matches","array","yield","data-sink","sink","ondelete","yield-slot","block-params","hds/toast","notification","or","label","type","onchange","if","and"]]',moduleName:"consul-ui/components/data-writer/index.hbs",isStrictMode:!1}) +var a=(0,t.setComponentTemplate)(o,t.default.extend(r.default,{tagName:"",ondelete:function(){return this.onchange(...arguments)},onchange:function(){},init:function(){this._super(...arguments),this.chart=i.default},actions:{persist:function(e,t){t&&"function"==typeof t.preventDefault&&t.preventDefault(),(0,l.set)(this,"data",e),this.dispatch("PERSIST")},error:function(e,t){t&&"function"==typeof t.preventDefault&&t.preventDefault(),(0,l.set)(this,"error",void 0!==e.error.errors?e.error.errors.firstObject:e.error),this.dispatch("ERROR")}}})) +e.default=a})),define("consul-ui/components/debug/navigation/index",["exports","@ember/component","@ember/template-factory","@ember/component/template-only"],(function(e,t,n,l){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const r=(0,n.createTemplateFactory)({id:"gn00CoAo",block:"[[],[],false,[]]",moduleName:"consul-ui/components/debug/navigation/index.hbs",isStrictMode:!1}) +var i=(0,t.setComponentTemplate)(r,(0,l.default)()) +e.default=i})),define("consul-ui/components/delete-confirmation/index",["exports","@ember/component","@ember/template-factory"],(function(e,t,n){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const l=(0,n.createTemplateFactory)({id:"2MbSBAzB",block:'[[[10,2],[12],[1,"\\n "],[1,[34,0]],[1,"\\n"],[13],[1,"\\n"],[8,[39,1],null,null,[["default"],[[[[1,"\\n "],[8,[39,2],[[16,"onclick",[28,[37,3],[[30,0],[33,4]],null]]],[["@text","@color"],["Confirm Delete","critical"]],null],[1,"\\n "],[8,[39,2],[[16,"onclick",[28,[37,3],[[30,0],[33,5]],null]]],[["@text","@color"],["Cancel","secondary"]],null],[1,"\\n"]],[]]]]]],[],false,["message","hds/button-set","hds/button","action","execute","cancel"]]',moduleName:"consul-ui/components/delete-confirmation/index.hbs",isStrictMode:!1}) +var r=(0,t.setComponentTemplate)(l,t.default.extend({tagName:"",execute:function(){},cancel:function(){}})) +e.default=r})),define("consul-ui/components/disclosure-menu/action/index",["exports","@ember/component","@ember/template-factory","@ember/component/template-only"],(function(e,t,n,l){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const r=(0,n.createTemplateFactory)({id:"kVsFG9Z2",block:'[[[8,[30,1,["Action"]],[[24,"aria-haspopup","menu"],[17,2]],null,[["default"],[[[[1,"\\n "],[18,3,null],[1,"\\n"]],[]]]]],[1,"\\n"]],["@disclosure","&attrs","&default"],false,["yield"]]',moduleName:"consul-ui/components/disclosure-menu/action/index.hbs",isStrictMode:!1}) +var i=(0,t.setComponentTemplate)(r,(0,l.default)()) +e.default=i})),define("consul-ui/components/disclosure-menu/index",["exports","@ember/component","@ember/template-factory","@ember/component/template-only"],(function(e,t,n,l){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const r=(0,n.createTemplateFactory)({id:"fLNl+IoV",block:'[[[11,0],[16,0,[28,[37,0],["disclosure-menu"],null]],[17,1],[12],[1,"\\n "],[8,[39,1],null,[["@expanded"],[[30,2]]],[["default"],[[[[1,"\\n "],[18,6,[[28,[37,3],null,[["Action","Menu","disclosure","toggle","close","open","expanded"],[[50,"disclosure-menu/action",0,null,[["disclosure"],[[30,3]]]],[50,"disclosure-menu/menu",0,null,[["disclosure","items","rowHeight"],[[30,3],[30,4],[30,5]]]],[30,3],[30,3,["toggle"]],[30,3,["close"]],[30,3,["open"]],[30,3,["expanded"]]]]]]],[1,"\\n "]],[3]]]]],[1,"\\n"],[13],[1,"\\n"]],["&attrs","@expanded","disclosure","@items","@rowHeight","&default"],false,["class-map","disclosure","yield","hash","component"]]',moduleName:"consul-ui/components/disclosure-menu/index.hbs",isStrictMode:!1}) +var i=(0,t.setComponentTemplate)(r,(0,l.default)()) +e.default=i})),define("consul-ui/components/disclosure-menu/menu/index",["exports","@ember/component","@ember/template-factory","@ember/component/template-only"],(function(e,t,n,l){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const r=(0,n.createTemplateFactory)({id:"ezjH7NRj",block:'[[[8,[30,1,["Details"]],null,null,[["default"],[[[[1,"\\n "],[8,[39,0],null,[["@items"],[[28,[37,1],[[30,3],[28,[37,2],null,null]],null]]],[["default"],[[[[1,"\\n "],[11,0],[16,0,[28,[37,3],[[28,[37,2],["paged-collection-scroll",[28,[37,4],[[30,4,["type"]],[28,[37,2],["virtual-scroll","native-scroll"],null]],null]],null]],null]],[17,5],[4,[38,5],["click",[30,1,["close"]]],null],[4,[38,6],[[30,4,["viewport"]]],null],[4,[38,7],[[30,4,["resize"]]],null],[4,[38,8],["--paged-row-height"],[["returns"],[[30,4,["rowHeight"]]]]],[4,[38,8],["max-height"],[["returns"],[[30,4,["maxHeight"]]]]],[12],[1,"\\n "],[18,6,[[28,[37,10],null,[["Menu"],[[50,"menu",0,null,[["disclosure","pager"],[[30,1],[30,4]]]]]]]]],[1,"\\n "],[13],[1,"\\n "]],[4]]]]],[1,"\\n"]],[2]]]]],[1,"\\n\\n"]],["@disclosure","details","@items","pager","&attrs","&default"],false,["paged-collection","or","array","class-map","includes","on-outside","did-insert","on-resize","css-prop","yield","hash","component"]]',moduleName:"consul-ui/components/disclosure-menu/menu/index.hbs",isStrictMode:!1}) +var i=(0,t.setComponentTemplate)(r,(0,l.default)()) +e.default=i})),define("consul-ui/components/disclosure/action/index",["exports","@ember/component","@ember/template-factory","@ember/component/template-only"],(function(e,t,n,l){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const r=(0,n.createTemplateFactory)({id:"h7+iNKLY",block:'[[[8,[39,0],[[16,"aria-expanded",[52,[30,1,["expanded"]],"true","false"]],[16,"aria-controls",[30,1,["controls"]]],[17,2]],null,[["default"],[[[[1,"\\n "],[18,3,null],[1,"\\n"]],[]]]]],[1,"\\n"]],["@disclosure","&attrs","&default"],false,["action","if","yield"]]',moduleName:"consul-ui/components/disclosure/action/index.hbs",isStrictMode:!1}) +var i=(0,t.setComponentTemplate)(r,(0,l.default)()) +e.default=i})),define("consul-ui/components/disclosure/details/index",["exports","@ember/component","@ember/template-factory","@ember/component/template-only"],(function(e,t,n,l){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const r=(0,n.createTemplateFactory)({id:"VadZ+kad",block:'[[[44,[[28,[37,1],null,null]],[[[41,[28,[37,3],[[28,[37,4],[[28,[37,5],[[30,2],[27]],null],[30,3,["expanded"]]],null],[28,[37,4],[[28,[37,6],[[30,2],[27]],null],[28,[37,5],[[30,2],false],null]],null]],null],[[[18,4,[[28,[37,8],null,[["id","expanded"],[[30,1],[30,3,["expanded"]]]]]]],[1,"\\n"]],[]],null],[1,[28,[35,9],[[28,[37,10],[[30,3,["add"]],[30,1]],null]],null]],[1,"\\n"],[1,[28,[35,11],[[28,[37,10],[[30,3,["remove"]],[30,1]],null]],null]],[1,"\\n"]],[1]]]],["id","@auto","@disclosure","&default"],false,["let","unique-id","if","or","and","eq","not-eq","yield","hash","did-insert","fn","will-destroy"]]',moduleName:"consul-ui/components/disclosure/details/index.hbs",isStrictMode:!1}) +var i=(0,t.setComponentTemplate)(r,(0,l.default)()) +e.default=i})),define("consul-ui/components/disclosure/index",["exports","@ember/component","@ember/template-factory","@glimmer/component","@glimmer/tracking","@ember/object","@ember/runloop"],(function(e,t,n,l,r,i,o){var a,u +function s(e,t,n,l,r){var i={} +return Object.keys(l).forEach((function(e){i[e]=l[e]})),i.enumerable=!!i.enumerable,i.configurable=!!i.configurable,("value"in i||i.initializer)&&(i.writable=!0),i=n.slice().reverse().reduce((function(n,l){return l(e,t,n)||n}),i),r&&void 0!==i.initializer&&(i.value=i.initializer?i.initializer.call(r):void 0,i.initializer=void 0),void 0===i.initializer&&(Object.defineProperty(e,t,i),i=null),i}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const c=(0,n.createTemplateFactory)({id:"iAc3HX8Q",block:'[[[8,[39,0],null,[["@src","@initial"],[[28,[37,0],["boolean"],null],[52,[30,1],"true","false"]]],[["default"],[[[[1,"\\n"],[44,[[28,[37,3],null,[["toggle","close","open","expanded","event","button","controls"],[[28,[37,4],[[30,5],"TOGGLE"],null],[28,[37,4],[[30,5],"FALSE"],null],[28,[37,4],[[30,5],"TRUE"],null],[28,[37,5],[[30,6],"true"],null],[30,6,["context"]],[28,[37,6],null,null],[30,0,["ids"]]]]]],[[[44,[[28,[37,7],[[30,7],[28,[37,3],null,[["Action","Details"],[[50,"disclosure/action",0,null,[["disclosure"],[[30,7]]]],[50,"disclosure/details",0,null,[["disclosure"],[[28,[37,3],null,[["add","remove","expanded"],[[30,0,["add"]],[30,0,["remove"]],[28,[37,5],[[30,6],"true"],null]]]]]]]]]]],null]],[[[1," "],[18,9,[[30,8]]],[1,"\\n"]],[8]]]],[7]]]],[2,3,4,5,6]]]]]],["@expanded","State","Guard","Action","dispatch","state","_api","api","&default"],false,["state-chart","if","let","hash","fn","state-matches","unique-id","assign","component","yield"]]',moduleName:"consul-ui/components/disclosure/index.hbs",isStrictMode:!1}) +let d=(a=class extends l.default{constructor(){var e,t,n,l +super(...arguments),e=this,t="ids",l=this,(n=u)&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(l):void 0})}add(e){(0,o.schedule)("afterRender",(()=>{this.ids=`${this.ids}${this.ids.length>0?" ":""}${e}`}))}remove(e){this.ids=this.ids.split(" ").filter((t=>t!==e)).join(" ")}},u=s(a.prototype,"ids",[r.tracked],{configurable:!0,enumerable:!0,writable:!0,initializer:function(){return""}}),s(a.prototype,"add",[i.action],Object.getOwnPropertyDescriptor(a.prototype,"add"),a.prototype),s(a.prototype,"remove",[i.action],Object.getOwnPropertyDescriptor(a.prototype,"remove"),a.prototype),a) +e.default=d,(0,t.setComponentTemplate)(c,d)})),define("consul-ui/components/ember-collection",["exports","ember-collection/components/ember-collection"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/components/ember-native-scrollable",["exports","ember-collection/components/ember-native-scrollable"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/components/empty-state/index",["exports","@ember/component","@ember/template-factory","@ember/object","block-slots"],(function(e,t,n,l,r){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const i=(0,n.createTemplateFactory)({id:"MevuN2Uz",block:'[[[18,2,null],[1,"\\n"],[11,0],[24,0,"empty-state"],[17,1],[12],[1,"\\n"],[41,[33,2],[[[1," "],[10,"header"],[12],[1,"\\n"],[6,[39,3],null,[["name"],["header"]],[["default"],[[[[1," "],[18,2,null],[1,"\\n"]],[]]]]],[6,[39,3],null,[["name"],["subheader"]],[["default"],[[[[1," "],[18,2,null],[1,"\\n"]],[]]]]],[1," "],[13],[1,"\\n"]],[]],null],[6,[39,3],null,[["name"],["body"]],[["default"],[[[[1," "],[10,0],[12],[1,"\\n "],[18,2,null],[1,"\\n"],[41,[33,4],[[[1," "],[8,[39,5],[[4,[38,7],["click",[33,4]],null]],[["@color","@text"],["primary",[52,[33,6,["AccessorID"]],"Log in with a different token","Log in"]]],[["default"],[[[[1,"\\n "],[8,[39,8],null,[["@src","@onchange"],[[28,[37,9],["settings://consul:token"],null],[28,[37,10],[[30,0],[28,[37,11],[[33,6]],null]],[["value"],["data"]]]]],null],[1,"\\n "]],[]]]]],[1,"\\n"]],[]],null],[1," "],[13],[1,"\\n"]],[]]]]],[6,[39,3],null,[["name"],["actions"]],[["default"],[[[[1," "],[10,"ul"],[12],[1,"\\n "],[18,2,null],[1,"\\n "],[13],[1,"\\n"]],[]]]]],[13]],["&attrs","&default"],false,["yield","if","hasHeader","yield-slot","login","hds/button","token","on","data-source","uri","action","mut"]]',moduleName:"consul-ui/components/empty-state/index.hbs",isStrictMode:!1}) +var o=(0,t.setComponentTemplate)(i,t.default.extend(r.default,{tagName:"",willRender:function(){this._super(...arguments),(0,l.set)(this,"hasHeader",this._isRegistered("header")||this._isRegistered("subheader"))}})) +e.default=o})),define("consul-ui/components/error-state/index",["exports","@ember/component","@ember/template-factory","@ember/component/template-only"],(function(e,t,n,l){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const r=(0,n.createTemplateFactory)({id:"qh3oSZcW",block:'[[[41,[28,[37,1],[[30,1,["status"]],"403"],null],[[[1," "],[8,[39,2],[[16,0,[28,[37,3],["status-",[30,1,["status"]]],null]]],[["@login"],[[30,2]]],[["default"],[[[[1,"\\n "],[8,[39,4],null,[["@name"],["header"]],[["default"],[[[[1,"\\n "],[10,"h2"],[12],[1,"\\n "],[1,[28,[35,5],[[30,1,["message"]],"Consul returned an error"],null]],[1,"\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n"],[41,[30,1,["status"]],[[[1," "],[8,[39,4],null,[["@name"],["subheader"]],[["default"],[[[[1,"\\n "],[10,"h3"],[12],[1,"\\n Error "],[1,[30,1,["status"]]],[1,"\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n"]],[]],null],[1," "],[8,[39,4],null,[["@name"],["body"]],[["default"],[[[[1,"\\n "],[10,2],[12],[1,"\\n"],[41,[30,1,["detail"]],[[[1," "],[1,[30,1,["detail"]]],[1,"\\n"]],[]],[[[1," You may have visited a URL that is loading an unknown resource, so you can try going back to the root or try re-submitting your ACL Token/SecretID by going back to ACLs.\\n"]],[]]],[1," "],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,4],null,[["@name"],["actions"]],[["default"],[[[[1,"\\n "],[10,"li"],[12],[1,"\\n "],[8,[39,6],null,[["@route","@text","@icon","@iconPosition","@size"],["index","Go back","chevron-left","trailing","small"]],null],[1,"\\n "],[13],[1,"\\n "],[10,"li"],[12],[1,"\\n "],[8,[39,6],null,[["@text","@href","@iconPosition","@icon","@size"],["Read the documentation",[29,[[28,[37,7],["CONSUL_DOCS_URL"],null]]],"trailing","docs-link","small"]],null],[1,"\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n "]],[]]]]],[1,"\\n"]],[]],[[[1," "],[8,[39,2],[[16,0,[28,[37,3],["status-",[30,1,["status"]]],null]]],[["@login"],[[30,2]]],[["default"],[[[[1,"\\n "],[8,[39,4],null,[["@name"],["header"]],[["default"],[[[[1,"\\n "],[10,"h2"],[12],[1,"\\n You are not authorized\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,4],null,[["@name"],["subheader"]],[["default"],[[[[1,"\\n "],[10,"h3"],[12],[1,"\\n Error "],[1,[30,1,["status"]]],[1,"\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,4],null,[["@name"],["body"]],[["default"],[[[[1,"\\n "],[10,2],[12],[1,"\\n You must be granted permissions to view this data. Ask your administrator if you think you should have access.\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,4],null,[["@name"],["actions"]],[["default"],[[[[1,"\\n "],[10,"li"],[12],[1,"\\n "],[8,[39,6],null,[["@text","@href","@icon","@iconPosition","@size"],["Read the documentation",[29,[[28,[37,7],["CONSUL_DOCS_URL"],null],"/acl/index.html"]],"docs-link","trailing","small"]],null],[1,"\\n "],[13],[1,"\\n "],[10,"li"],[12],[1,"\\n "],[8,[39,6],null,[["@text","@href","@icon","@iconPosition","@size"],["Follow the guide",[29,[[28,[37,7],["CONSUL_DOCS_LEARN_URL"],null],"/consul/security-networking/production-acls"]],"learn-link","trailing","small"]],null],[1,"\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n "]],[]]]]],[1,"\\n"]],[]]]],["@error","@login"],false,["if","not-eq","empty-state","concat","block-slot","or","hds/link/standalone","env"]]',moduleName:"consul-ui/components/error-state/index.hbs",isStrictMode:!1}) +var i=(0,t.setComponentTemplate)(r,(0,l.default)()) +e.default=i})),define("consul-ui/components/event-source/index",["exports","@ember/component","@ember/template-factory","@ember/service","@ember/object"],(function(e,t,n,l,r){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const i=(0,n.createTemplateFactory)({id:"OA0g9tPL",block:'[[[18,1,[[28,[37,1],null,[["close"],[[28,[37,2],[[30,0],"close"],null]]]]]],[1,"\\n"]],["&default"],false,["yield","hash","action"]]',moduleName:"consul-ui/components/event-source/index.hbs",isStrictMode:!1}),o=function(e,t,n){let l=arguments.length>3&&void 0!==arguments[3]?arguments[3]:function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null +return"function"==typeof e?e():null} +const i=e[t] +return i!==n&&l(i,n),(0,r.set)(e,t,n)} +var a=(0,t.setComponentTemplate)(i,t.default.extend({tagName:"",dom:(0,l.inject)("dom"),logger:(0,l.inject)("logger"),data:(0,l.inject)("data-source/service"),closeOnDestroy:!0,onerror:function(e){this.logger.execute(e.error)},init:function(){this._super(...arguments),this._listeners=this.dom.listeners()},willDestroyElement:function(){this.closeOnDestroy&&this.actions.close.apply(this,[]),this._listeners.remove(),this._super(...arguments)},didReceiveAttrs:function(){this._super(...arguments),(0,r.get)(this,"src.configuration.uri")!==(0,r.get)(this,"source.configuration.uri")&&this.actions.open.apply(this,[])},actions:{open:function(){o(this,"source",this.data.open(this.src,this),((e,t)=>{void 0!==e&&this.data.close(e,this)})),o(this,"proxy",this.src,((e,t)=>{void 0!==e&&e.destroy()})) +const e=e=>{try{const t=(0,r.get)(e,"error.errors.firstObject") +"429"!==(0,r.get)(t||{},"status")&&this.onerror(e),this.logger.execute(e)}catch(e){this.logger.execute(e)}},t=this._listeners.add(this.source,{error:t=>{e(t)}}) +o(this,"_remove",t)},close:function(){void 0!==this.source&&(this.data.close(this.source,this),o(this,"_remove",void 0),(0,r.set)(this,"source",void 0)),void 0!==this.proxy&&this.proxy.destroy()}}})) +e.default=a})),define("consul-ui/components/flash-message",["exports","ember-cli-flash/components/flash-message"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/components/flight-icon",["exports","@hashicorp/ember-flight-icons/components/flight-icon"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/components/form-component/index",["exports","@ember/component","@ember/template-factory","block-slots","@ember/service","@ember/object/computed"],(function(e,t,n,l,r,i){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const o=(0,n.createTemplateFactory)({id:"etKAawDq",block:'[[[18,1,null]],["&default"],false,["yield"]]',moduleName:"consul-ui/components/form-component/index.hbs",isStrictMode:!1}),a=/([^[\]])+/g +var u=(0,t.setComponentTemplate)(o,t.default.extend(l.default,{tagName:"",onreset:function(){},onchange:function(){},onerror:function(){},onsuccess:function(){},data:(0,i.alias)("form.data"),item:(0,i.alias)("form.data"),dom:(0,r.inject)("dom"),container:(0,r.inject)("form"),actions:{change:function(e,t,n){let l=this.dom.normalizeEvent(e,t) +const r=[...l.target.name.matchAll(a)],i=r[r.length-1][0] +let o +o=-1===i.indexOf("[")?`${this.type}[${i}]`:i,this.form.handleEvent(l,o),this.onchange({target:this})}}})) +e.default=u})),define("consul-ui/components/form-group/element/checkbox/index",["exports","@ember/component","@ember/template-factory","@ember/component/template-only"],(function(e,t,n,l){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const r=(0,n.createTemplateFactory)({id:"4jry83Gq",block:'[[[11,"input"],[24,4,"checkbox"],[16,3,[30,1]],[16,2,[30,2]],[17,3],[4,[38,0],[[28,[37,1],[[30,4]],null]],null],[4,[38,2],["change",[28,[37,1],[[30,5]],null]],null],[12],[13],[1,"\\n"]],["@name","@value","&attrs","@didinsert","@onchange"],false,["did-insert","optional","on"]]',moduleName:"consul-ui/components/form-group/element/checkbox/index.hbs",isStrictMode:!1}) +var i=(0,t.setComponentTemplate)(r,(0,l.default)()) +e.default=i})),define("consul-ui/components/form-group/element/error/index",["exports","@ember/component","@ember/template-factory","@ember/component/template-only"],(function(e,t,n,l){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const r=(0,n.createTemplateFactory)({id:"dGEGUftb",block:'[[[11,"strong"],[24,"role","alert"],[17,1],[12],[1,"\\n "],[18,2,null],[1,"\\n"],[13],[1,"\\n"]],["&attrs","&default"],false,["yield"]]',moduleName:"consul-ui/components/form-group/element/error/index.hbs",isStrictMode:!1}) +var i=(0,t.setComponentTemplate)(r,(0,l.default)()) +e.default=i})),define("consul-ui/components/form-group/element/index",["exports","@ember/component","@ember/template-factory","@glimmer/component","@glimmer/tracking","@ember/object"],(function(e,t,n,l,r,i){var o,a,u +function s(e,t,n,l){n&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(l):void 0})}function c(e,t,n,l,r){var i={} +return Object.keys(l).forEach((function(e){i[e]=l[e]})),i.enumerable=!!i.enumerable,i.configurable=!!i.configurable,("value"in i||i.initializer)&&(i.writable=!0),i=n.slice().reverse().reduce((function(n,l){return l(e,t,n)||n}),i),r&&void 0!==i.initializer&&(i.value=i.initializer?i.initializer.call(r):void 0,i.initializer=void 0),void 0===i.initializer&&(Object.defineProperty(e,t,i),i=null),i}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const d=(0,n.createTemplateFactory)({id:"Qn2u34/P",block:'[[[44,[[28,[37,1],null,[["Element","Text","Checkbox","Radio","Label","Error","state"],[[50,"form-group/element",0,null,[["group","name"],[[30,1],[30,2]]]],[50,"form-group/element/text",0,null,[["didinsert","name","oninput"],[[28,[37,3],[[30,0],[30,0,["connect"]]],null],[30,0,["name"]],[28,[37,3],[[30,0],[28,[37,4],[[30,0,["touched"]]],null],true],null]]]],[50,"form-group/element/checkbox",0,null,[["didinsert","name","onchange"],[[28,[37,3],[[30,0],[30,0,["connect"]]],null],[30,0,["name"]],[28,[37,3],[[30,0],[28,[37,4],[[30,0,["touched"]]],null],true],null]]]],[50,"form-group/element/radio",0,null,[["didinsert","name","onchange"],[[28,[37,3],[[30,0],[30,0,["connect"]]],null],[30,0,["name"]],[28,[37,3],[[30,0],[28,[37,4],[[30,0,["touched"]]],null],true],null]]]],[50,"form-group/element/label",0,null,null],[50,"form-group/element/error",0,null,null],[33,5]]]]],[[[41,[28,[37,7],[[30,0,["type"]],[28,[37,8],["radiogroup","checkbox-group","checkboxgroup"],null]],null],[[[1," "],[11,0],[16,"data-property",[30,0,["prop"]]],[16,0,[29,["type-",[30,0,["type"]],[52,[28,[37,9],[[33,5],"error"],null]," has-error"]]]],[17,4],[12],[1,"\\n "],[18,5,[[30,3]]],[1,"\\n "],[13],[1,"\\n"]],[]],[[[1," "],[11,"label"],[16,"data-property",[30,0,["prop"]]],[16,0,[29,["type-",[30,0,["type"]],[52,[28,[37,9],[[33,5],"error"],null]," has-error"]]]],[17,4],[12],[1,"\\n "],[18,5,[[30,3]]],[1,"\\n "],[13],[1,"\\n"]],[]]]],[3]]]],["@group","@name","el","&attrs","&default"],false,["let","hash","component","action","mut","state","if","includes","array","state-matches","yield"]]',moduleName:"consul-ui/components/form-group/element/index.hbs",isStrictMode:!1}) +let p=(o=class extends l.default{constructor(){super(...arguments),s(this,"el",a,this),s(this,"touched",u,this)}get type(){return void 0!==this.el?this.el.dataset.type||this.el.getAttribute("type")||this.el.getAttribute("role"):this.args.type}get name(){return void 0!==this.args.group?`${this.args.group.name}[${this.args.name}]`:this.args.name}get prop(){return`${this.args.name.toLowerCase().split(".").join("-")}`}get state(){const e=this.touched&&this.args.error +return{matches:t=>"error"===t&&e}}connect(e){this.el=e}},a=c(o.prototype,"el",[r.tracked],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),u=c(o.prototype,"touched",[r.tracked],{configurable:!0,enumerable:!0,writable:!0,initializer:function(){return!1}}),c(o.prototype,"connect",[i.action],Object.getOwnPropertyDescriptor(o.prototype,"connect"),o.prototype),o) +e.default=p,(0,t.setComponentTemplate)(d,p)})),define("consul-ui/components/form-group/element/label/index",["exports","@ember/component","@ember/template-factory","@ember/component/template-only"],(function(e,t,n,l){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const r=(0,n.createTemplateFactory)({id:"qfCtMXFx",block:'[[[11,1],[24,0,"form-elements-label label"],[17,1],[12],[1,"\\n "],[18,2,null],[1,"\\n"],[13],[1,"\\n"]],["&attrs","&default"],false,["yield"]]',moduleName:"consul-ui/components/form-group/element/label/index.hbs",isStrictMode:!1}) +var i=(0,t.setComponentTemplate)(r,(0,l.default)()) +e.default=i})),define("consul-ui/components/form-group/element/radio/index",["exports","@ember/component","@ember/template-factory","@ember/component/template-only"],(function(e,t,n,l){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const r=(0,n.createTemplateFactory)({id:"Ir+FjtQH",block:'[[[11,"input"],[24,4,"radio"],[16,3,[30,1]],[16,2,[30,2]],[17,3],[4,[38,0],[[28,[37,1],[[30,4]],null]],null],[4,[38,2],["change",[28,[37,1],[[30,5]],null]],null],[12],[13],[1,"\\n"]],["@name","@value","&attrs","@didinsert","@onchange"],false,["did-insert","optional","on"]]',moduleName:"consul-ui/components/form-group/element/radio/index.hbs",isStrictMode:!1}) +var i=(0,t.setComponentTemplate)(r,(0,l.default)()) +e.default=i})),define("consul-ui/components/form-group/element/text/index",["exports","@ember/component","@ember/template-factory","@ember/component/template-only"],(function(e,t,n,l){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const r=(0,n.createTemplateFactory)({id:"auOoQIU/",block:'[[[11,"input"],[24,4,"text"],[16,3,[30,1]],[16,2,[30,2]],[17,3],[4,[38,0],[[28,[37,1],[[30,4]],null]],null],[4,[38,2],["input",[28,[37,1],[[30,5]],null]],null],[12],[13],[1,"\\n"]],["@name","@value","&attrs","@didinsert","@oninput"],false,["did-insert","optional","on"]]',moduleName:"consul-ui/components/form-group/element/text/index.hbs",isStrictMode:!1}) +var i=(0,t.setComponentTemplate)(r,(0,l.default)()) +e.default=i})),define("consul-ui/components/form-group/index",["exports","@ember/component","@ember/template-factory","@glimmer/component"],(function(e,t,n,l){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const r=(0,n.createTemplateFactory)({id:"7XOStkey",block:'[[[18,1,[[28,[37,1],null,[["Element"],[[50,"form-group/element",0,null,[["group"],[[30,0]]]]]]]]],[1,"\\n"]],["&default"],false,["yield","hash","component"]]',moduleName:"consul-ui/components/form-group/index.hbs",isStrictMode:!1}) +class i extends l.default{get name(){return this.args.name}}e.default=i,(0,t.setComponentTemplate)(r,i)})),define("consul-ui/components/form-input/index",["exports","@ember/component","@ember/template-factory","@ember/component/template-only"],(function(e,t,n,l){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const r=(0,n.createTemplateFactory)({id:"m+IBH13K",block:'[[[11,"label"],[16,0,[28,[37,0],["form-input",[52,[28,[37,2],[[30,1,["state","context","errors"]],[30,2]],null]," has-error"]],null]],[17,3],[12],[1,"\\n "],[10,1],[12],[1,"\\n "],[18,7,null],[1,"\\n "],[13],[1,"\\n "],[18,8,null],[1,"\\n"],[44,[[28,[37,5],[[30,4,["help"]],[30,5]],null]],[[[41,[30,6],[[[1," "],[10,"em"],[12],[1,"\\n "],[1,[30,6]],[1,"\\n "],[13],[1,"\\n"]],[]],null]],[6]]],[1," "],[8,[39,6],null,[["@state","@matches"],[[30,1,["state"]],"error"]],[["default"],[[[[1,"\\n"],[1," "],[10,"strong"],[14,"role","alert"],[12],[1,[28,[35,2],[[28,[37,2],[[30,1,["state","context","errors"]],[30,2]],null],"message"],null]],[13],[1,"\\n "]],[]]]]],[1,"\\n"],[13],[1,"\\n"]],["@chart","@name","&attrs","@validations","@help","help","&label","&input"],false,["concat","if","get","yield","let","or","state"]]',moduleName:"consul-ui/components/form-input/index.hbs",isStrictMode:!1}) +var i=(0,t.setComponentTemplate)(r,(0,l.default)()) +e.default=i})),define("consul-ui/components/freetext-filter/index",["exports","@ember/component","@ember/template-factory","@glimmer/component","@ember/object"],(function(e,t,n,l,r){var i +function o(e,t,n,l,r){var i={} +return Object.keys(l).forEach((function(e){i[e]=l[e]})),i.enumerable=!!i.enumerable,i.configurable=!!i.configurable,("value"in i||i.initializer)&&(i.writable=!0),i=n.slice().reverse().reduce((function(n,l){return l(e,t,n)||n}),i),r&&void 0!==i.initializer&&(i.value=i.initializer?i.initializer.call(r):void 0,i.initializer=void 0),void 0===i.initializer&&(Object.defineProperty(e,t,i),i=null),i}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const a=(0,n.createTemplateFactory)({id:"oIN1v5pq",block:'[[[11,0],[24,0,"freetext-filter"],[17,1],[12],[1,"\\n "],[10,"label"],[14,0,"type-search"],[12],[1,"\\n "],[10,1],[14,0,"freetext-filter_label"],[12],[1,"Search"],[13],[1,"\\n "],[10,"input"],[14,0,"freetext-filter_input"],[15,"onsearch",[28,[37,0],[[30,0],[30,0,["change"]]],null]],[15,"oninput",[28,[37,0],[[30,0],[30,0,["change"]]],null]],[15,"onkeydown",[28,[37,0],[[30,0],[30,0,["keydown"]]],null]],[14,3,"s"],[15,2,[30,2]],[15,"placeholder",[30,0,["placeholder"]]],[14,"autofocus","autofocus"],[14,4,"search"],[12],[13],[1,"\\n "],[13],[1,"\\n "],[18,3,null],[1,"\\n"],[13]],["&attrs","@value","&default"],false,["action","yield"]]',moduleName:"consul-ui/components/freetext-filter/index.hbs",isStrictMode:!1}) +let u=(o((i=class extends l.default{get placeholder(){return this.args.placeholder||"Search"}get onsearch(){return this.args.onsearch||(()=>{})}change(e){this.onsearch(e)}keydown(e){13===e.keyCode&&e.preventDefault()}}).prototype,"change",[r.action],Object.getOwnPropertyDescriptor(i.prototype,"change"),i.prototype),o(i.prototype,"keydown",[r.action],Object.getOwnPropertyDescriptor(i.prototype,"keydown"),i.prototype),i) +e.default=u,(0,t.setComponentTemplate)(a,u)})) +define("consul-ui/components/hashicorp-consul/index",["exports","@ember/component","@ember/template-factory","@glimmer/component","@ember/service"],(function(e,t,n,l,r){var i,o,a +Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const u=(0,n.createTemplateFactory)({id:"wUVRiBq4",block:'[[[8,[39,0],[[24,0,"hashicorp-consul"],[17,1]],null,[["notifications","home-nav","main-nav","complementary-nav","main","content-info"],[[[[1,"\\n"],[42,[28,[37,2],[[28,[37,2],[[33,3,["queue"]]],null]],null],null,[[[1," "],[8,[30,2,["Notification"]],null,[["@delay","@sticky"],[[28,[37,4],[[30,3,["timeout"]],[30,3,["extendedTimeout"]]],null],[30,3,["sticky"]]]],[["default"],[[[[1,"\\n"],[41,[30,3,["dom"]],[[[1," "],[2,[30,3,["dom"]]],[1,"\\n"]],[]],[[[44,[[28,[37,7],[[30,3,["type"]]],null],[28,[37,7],[[30,3,["action"]]],null]],[[[1," "],[8,[39,8],[[24,"data-notification",""]],[["@color"],[[52,[28,[37,9],[[30,4],"error"],null],"critical",[30,4]]]],[["default"],[[[[1,"\\n "],[8,[30,6,["Title"]],null,null,[["default"],[[[[1,[28,[35,10],[[30,4]],null]],[1,"!"]],[]]]]],[1,"\\n "],[8,[30,6,["Description"]],null,null,[["default"],[[[[1,"\\n"],[41,[28,[37,9],[[30,5],"logout"],null],[[[41,[28,[37,9],[[30,4],"success"],null],[[[1," You are now logged out.\\n"]],[]],[[[1," There was an error logging out.\\n"]],[]]]],[]],[[[41,[28,[37,9],[[30,5],"authorize"],null],[[[41,[28,[37,9],[[30,4],"success"],null],[[[1," You are now logged in.\\n"]],[]],[[[1," There was an error, please check your SecretID/Token\\n"]],[]]]],[]],[[[41,[28,[37,11],[[28,[37,9],[[30,5],"use"],null],[28,[37,9],[[30,3,["model"]],"token"],null]],null],[[[1," "],[8,[39,12],null,[["@type","@status","@item","@error"],[[30,5],[30,4],[30,3,["item"]],[30,3,["error"]]]],null],[1,"\\n"]],[]],[[[41,[28,[37,9],[[30,3,["model"]],"intention"],null],[[[1," "],[8,[39,13],null,[["@type","@status","@item","@error"],[[30,5],[30,4],[30,3,["item"]],[30,3,["error"]]]],null],[1,"\\n"]],[]],[[[41,[28,[37,9],[[30,3,["model"]],"role"],null],[[[1," "],[8,[39,14],null,[["@type","@status","@item","@error"],[[30,5],[30,4],[30,3,["item"]],[30,3,["error"]]]],null],[1,"\\n"]],[]],[[[41,[28,[37,9],[[30,3,["model"]],"policy"],null],[[[1," "],[8,[39,15],null,[["@type","@status","@item","@error"],[[30,5],[30,4],[30,3,["item"]],[30,3,["error"]]]],null],[1,"\\n "]],[]],null]],[]]]],[]]]],[]]],[1," "]],[]]]],[]]],[1," "]],[]]]]],[1,"\\n "]],[6]]]]],[1,"\\n\\n"]],[4,5]]]],[]]],[1," "]],[]]]]],[1,"\\n"]],[3]],null],[1,"\\n "]],[2]],[[[1,"\\n "],[10,3],[14,0,"w-8 h-8"],[15,6,[28,[37,16],["index"],[["params"],[[28,[37,17],null,[["peer"],[[27]]]]]]]],[12],[1,"\\n "],[8,[39,18],null,[["@size","@name","@stretched"],["24","consul-color",true]],null],[1,"\\n "],[13],[1,"\\n "]],[]],[[[1,"\\n "],[8,[39,19],null,null,null],[1,"\\n "],[10,"ul"],[12],[1,"\\n "],[8,[39,20],null,[["@dc","@partition","@nspace","@dcs"],[[30,7],[30,8],[30,9],[30,10]]],null],[1,"\\n "],[8,[39,21],null,[["@dc","@partition","@nspace","@partitions","@onchange"],[[30,7],[30,8],[30,9],[30,0,["partitions"]],[28,[37,22],[[30,0],[28,[37,23],[[30,0,["partitions"]]],null]],[["value"],["data"]]]]],null],[1,"\\n "],[8,[39,24],null,[["@dc","@partition","@nspace","@nspaces","@onchange"],[[30,7],[30,8],[30,9],[30,0,["nspaces"]],[28,[37,22],[[30,0],[28,[37,23],[[30,0,["nspaces"]]],null]],[["value"],["data"]]]]],null],[1,"\\n"],[41,[28,[37,25],["access overview"],null],[[[1," "],[10,"li"],[15,0,[28,[37,26],[[28,[37,27],["is-active",[28,[37,28],["dc.show",[30,7,["Name"]]],null]],null]],null]],[12],[1,"\\n "],[8,[39,22],null,[["@href"],[[28,[37,16],["dc.show",[30,7,["Name"]]],[["params"],[[28,[37,17],null,[["peer"],[[27]]]]]]]]],[["default"],[[[[1,"\\n Overview\\n "]],[]]]]],[1,"\\n "],[13],[1,"\\n"]],[]],null],[41,[28,[37,25],["read services"],null],[[[1," "],[10,"li"],[15,0,[52,[28,[37,28],["dc.services",[30,7,["Name"]]],null],"is-active"]],[12],[1,"\\n "],[10,3],[15,6,[28,[37,16],["dc.services",[30,7,["Name"]]],[["params"],[[28,[37,17],null,[["peer"],[[27]]]]]]]],[12],[1,"Services"],[13],[1,"\\n "],[13],[1,"\\n"]],[]],null],[41,[28,[37,25],["read nodes"],null],[[[1," "],[10,"li"],[15,0,[52,[28,[37,28],["dc.nodes",[30,7,["Name"]]],null],"is-active"]],[12],[1,"\\n "],[10,3],[15,6,[28,[37,16],["dc.nodes",[30,7,["Name"]]],[["params"],[[28,[37,17],null,[["peer"],[[27]]]]]]]],[12],[1,"Nodes"],[13],[1,"\\n "],[13],[1,"\\n"]],[]],null],[41,[28,[37,25],["read kv"],null],[[[1," "],[10,"li"],[15,0,[52,[28,[37,28],["dc.kv",[30,7,["Name"]]],null],"is-active"]],[12],[1,"\\n "],[10,3],[15,6,[28,[37,16],["dc.kv",[30,7,["Name"]]],[["params"],[[28,[37,17],null,[["peer"],[[27]]]]]]]],[12],[1,"Key/Value"],[13],[1,"\\n "],[13],[1,"\\n"]],[]],null],[41,[28,[37,25],["read intentions"],null],[[[1," "],[10,"li"],[15,0,[52,[28,[37,28],["dc.intentions",[30,7,["Name"]]],null],"is-active"]],[12],[1,"\\n "],[10,3],[15,6,[28,[37,16],["dc.intentions",[30,7,["Name"]]],[["params"],[[28,[37,17],null,[["peer"],[[27]]]]]]]],[12],[1,"Intentions"],[13],[1,"\\n "],[13],[1,"\\n"]],[]],null],[1," "],[8,[39,29],null,[["@dc","@partition","@nspace"],[[30,7],[30,8],[30,9]]],null],[1,"\\n "],[8,[39,30],null,[["@dc","@partition","@nspace"],[[30,7],[30,8],[30,9]]],null],[1,"\\n "],[13],[1,"\\n "]],[]],[[[1,"\\n "],[10,"ul"],[12],[1,"\\n "],[8,[39,31],null,null,null],[1,"\\n "],[10,"li"],[12],[1,"\\n "],[8,[39,32],null,null,[["default"],[[[[1,"\\n "],[8,[30,11,["Action"]],[[4,[38,33],["click",[30,11,["toggle"]]],null]],null,[["default"],[[[[1,"\\n Help\\n "]],[]]]]],[1,"\\n "],[8,[30,11,["Menu"]],null,null,[["default"],[[[[1,"\\n "],[8,[30,12,["Menu"]],null,null,[["default"],[[[[1,"\\n "],[8,[30,13,["Separator"]],null,null,[["default"],[[[[1,"\\n Consul v"],[1,[28,[35,34],["CONSUL_VERSION"],null]],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[30,13,["Item"]],[[24,0,"docs-link"]],null,[["default"],[[[[1,"\\n "],[8,[30,13,["Action"]],null,[["@href","@external"],[[28,[37,34],["CONSUL_DOCS_URL"],null],true]],[["default"],[[[[1,"\\n Documentation\\n "]],[]]]]],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[30,13,["Item"]],[[24,0,"learn-link"]],null,[["default"],[[[[1,"\\n "],[8,[30,13,["Action"]],null,[["@href","@external"],[[28,[37,35],[[28,[37,34],["CONSUL_DOCS_LEARN_URL"],null],"/consul"],null],true]],[["default"],[[[[1,"\\n HashiCorp Learn\\n "]],[]]]]],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[30,13,["Separator"]],null,null,null],[1,"\\n "],[8,[30,13,["Item"]],[[24,0,"feedback-link"]],null,[["default"],[[[[1,"\\n "],[8,[30,13,["Action"]],null,[["@href","@external"],[[28,[37,34],["CONSUL_REPO_ISSUES_URL"],null],true]],[["default"],[[[[1,"\\n Provide Feedback\\n "]],[]]]]],[1,"\\n "]],[]]]]],[1,"\\n "]],[13]]]]],[1,"\\n "]],[12]]]]],[1,"\\n "]],[11]]]]],[1,"\\n "],[13],[1,"\\n "],[10,"li"],[15,0,[52,[28,[37,28],["settings"],null],"is-active"]],[12],[1,"\\n "],[10,3],[15,6,[28,[37,16],["settings"],[["params"],[[28,[37,17],null,[["nspace","partition"],[[27],[27]]]]]]]],[12],[1,"\\n Settings\\n "],[13],[1,"\\n "],[13],[1,"\\n "],[8,[39,36],null,[["@dc","@partition","@nspace","@onchange"],[[30,7],[30,8],[30,9],[30,14]]],[["default"],[[[[1,"\\n "],[8,[39,37],null,[["@target","@name","@value"],[[30,0],"tokenSelector",[30,15]]],null],[1,"\\n "]],[15]]]]],[1,"\\n "],[13],[1,"\\n "]],[]],[[[1,"\\n "],[18,16,[[28,[37,17],null,[["login"],[[52,[30,0,["tokenSelector"]],[30,0,["tokenSelector"]],[28,[37,17],null,[["open","close"],[[27],[27]]]]]]]]]],[1,"\\n "]],[]],[[[1,"\\n "],[10,2],[12],[1,"\\n Consul v"],[1,[28,[35,34],["CONSUL_VERSION"],null]],[1,"\\n "],[13],[1,"\\n "],[2,[28,[37,35],["\x3c!-- ",[28,[37,34],["CONSUL_GIT_SHA"],null],"--\x3e"],null]],[1,"\\n "]],[]]]]],[1,"\\n"]],["&attrs","app","flash","status","type","T","@dc","@partition","@nspace","@dcs","disclosure","panel","menu","@onchange","selector","&default"],false,["app","each","-track-array","flashMessages","sub","if","let","lowercase","hds/toast","eq","capitalize","or","consul/token/notifications","consul/intention/notifications","consul/role/notifications","consul/policy/notifications","href-to","hash","flight-icon","consul/hcp/home","consul/datacenter/selector","consul/partition/selector","action","mut","consul/nspace/selector","can","class-map","array","is-href","consul/acl/selector","consul/peer/selector","debug/navigation","disclosure-menu","on","env","concat","consul/token/selector","ref","yield"]]',moduleName:"consul-ui/components/hashicorp-consul/index.hbs",isStrictMode:!1}) +let s=(i=(0,r.inject)("flashMessages"),o=class extends l.default{constructor(){var e,t,n,l +super(...arguments),e=this,t="flashMessages",l=this,(n=a)&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(l):void 0})}},c=o.prototype,d="flashMessages",p=[i],f={configurable:!0,enumerable:!0,writable:!0,initializer:null},h={},Object.keys(f).forEach((function(e){h[e]=f[e]})),h.enumerable=!!h.enumerable,h.configurable=!!h.configurable,("value"in h||h.initializer)&&(h.writable=!0),h=p.slice().reverse().reduce((function(e,t){return t(c,d,e)||e}),h),m&&void 0!==h.initializer&&(h.value=h.initializer?h.initializer.call(m):void 0,h.initializer=void 0),void 0===h.initializer&&(Object.defineProperty(c,d,h),h=null),a=h,o) +var c,d,p,f,m,h +e.default=s,(0,t.setComponentTemplate)(u,s)})),define("consul-ui/components/hds/alert/description",["exports","@hashicorp/design-system-components/components/hds/alert/description"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/components/hds/alert/index",["exports","@hashicorp/design-system-components/components/hds/alert/index"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/components/hds/alert/title",["exports","@hashicorp/design-system-components/components/hds/alert/title"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/components/hds/avatar/index",["exports","@hashicorp/design-system-components/components/hds/avatar/index"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/components/hds/badge-count/index",["exports","@hashicorp/design-system-components/components/hds/badge-count/index"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/components/hds/badge/index",["exports","@hashicorp/design-system-components/components/hds/badge/index"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/components/hds/breadcrumb/index",["exports","@hashicorp/design-system-components/components/hds/breadcrumb/index"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/components/hds/breadcrumb/item",["exports","@hashicorp/design-system-components/components/hds/breadcrumb/item"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/components/hds/breadcrumb/truncation",["exports","@hashicorp/design-system-components/components/hds/breadcrumb/truncation"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/components/hds/button-set/index",["exports","@hashicorp/design-system-components/components/hds/button-set/index"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/components/hds/button/index",["exports","@hashicorp/design-system-components/components/hds/button/index"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/components/hds/card/container",["exports","@hashicorp/design-system-components/components/hds/card/container"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/components/hds/disclosure/index",["exports","@hashicorp/design-system-components/components/hds/disclosure/index"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/components/hds/dismiss-button/index",["exports","@hashicorp/design-system-components/components/hds/dismiss-button/index"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/components/hds/dropdown/index",["exports","@hashicorp/design-system-components/components/hds/dropdown/index"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/components/hds/dropdown/list-item/copy-item",["exports","@hashicorp/design-system-components/components/hds/dropdown/list-item/copy-item"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/components/hds/dropdown/list-item/description",["exports","@hashicorp/design-system-components/components/hds/dropdown/list-item/description"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/components/hds/dropdown/list-item/generic",["exports","@hashicorp/design-system-components/components/hds/dropdown/list-item/generic"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/components/hds/dropdown/list-item/interactive",["exports","@hashicorp/design-system-components/components/hds/dropdown/list-item/interactive"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/components/hds/dropdown/list-item/separator",["exports","@hashicorp/design-system-components/components/hds/dropdown/list-item/separator"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/components/hds/dropdown/list-item/title",["exports","@hashicorp/design-system-components/components/hds/dropdown/list-item/title"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/components/hds/dropdown/toggle/button",["exports","@hashicorp/design-system-components/components/hds/dropdown/toggle/button"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/components/hds/dropdown/toggle/icon",["exports","@hashicorp/design-system-components/components/hds/dropdown/toggle/icon"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/components/hds/empty-state/body",["exports","@hashicorp/design-system-components/components/hds/empty-state/body"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/components/hds/empty-state/footer",["exports","@hashicorp/design-system-components/components/hds/empty-state/footer"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/components/hds/empty-state/header",["exports","@hashicorp/design-system-components/components/hds/empty-state/header"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/components/hds/empty-state/index",["exports","@hashicorp/design-system-components/components/hds/empty-state/index"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/components/hds/flyout/body",["exports","@hashicorp/design-system-components/components/hds/flyout/body"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/components/hds/flyout/description",["exports","@hashicorp/design-system-components/components/hds/flyout/description"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})) +define("consul-ui/components/hds/flyout/header",["exports","@hashicorp/design-system-components/components/hds/flyout/header"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/components/hds/flyout/index",["exports","@hashicorp/design-system-components/components/hds/flyout/index"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/components/hds/form/checkbox/base",["exports","@hashicorp/design-system-components/components/hds/form/checkbox/base"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/components/hds/form/checkbox/field",["exports","@hashicorp/design-system-components/components/hds/form/checkbox/field"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/components/hds/form/checkbox/group",["exports","@hashicorp/design-system-components/components/hds/form/checkbox/group"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/components/hds/form/error/index",["exports","@hashicorp/design-system-components/components/hds/form/error/index"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/components/hds/form/error/message",["exports","@hashicorp/design-system-components/components/hds/form/error/message"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/components/hds/form/field/index",["exports","@hashicorp/design-system-components/components/hds/form/field/index"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/components/hds/form/fieldset/index",["exports","@hashicorp/design-system-components/components/hds/form/fieldset/index"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/components/hds/form/helper-text/index",["exports","@hashicorp/design-system-components/components/hds/form/helper-text/index"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/components/hds/form/indicator/index",["exports","@hashicorp/design-system-components/components/hds/form/indicator/index"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/components/hds/form/label/index",["exports","@hashicorp/design-system-components/components/hds/form/label/index"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/components/hds/form/legend/index",["exports","@hashicorp/design-system-components/components/hds/form/legend/index"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/components/hds/form/radio-card/description",["exports","@hashicorp/design-system-components/components/hds/form/radio-card/description"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/components/hds/form/radio-card/group",["exports","@hashicorp/design-system-components/components/hds/form/radio-card/group"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/components/hds/form/radio-card/index",["exports","@hashicorp/design-system-components/components/hds/form/radio-card/index"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/components/hds/form/radio-card/label",["exports","@hashicorp/design-system-components/components/hds/form/radio-card/label"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/components/hds/form/radio/base",["exports","@hashicorp/design-system-components/components/hds/form/radio/base"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/components/hds/form/radio/field",["exports","@hashicorp/design-system-components/components/hds/form/radio/field"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/components/hds/form/radio/group",["exports","@hashicorp/design-system-components/components/hds/form/radio/group"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/components/hds/form/select/base",["exports","@hashicorp/design-system-components/components/hds/form/select/base"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/components/hds/form/select/field",["exports","@hashicorp/design-system-components/components/hds/form/select/field"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/components/hds/form/text-input/base",["exports","@hashicorp/design-system-components/components/hds/form/text-input/base"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/components/hds/form/text-input/field",["exports","@hashicorp/design-system-components/components/hds/form/text-input/field"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/components/hds/form/textarea/base",["exports","@hashicorp/design-system-components/components/hds/form/textarea/base"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/components/hds/form/textarea/field",["exports","@hashicorp/design-system-components/components/hds/form/textarea/field"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/components/hds/form/toggle/base",["exports","@hashicorp/design-system-components/components/hds/form/toggle/base"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/components/hds/form/toggle/field",["exports","@hashicorp/design-system-components/components/hds/form/toggle/field"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/components/hds/form/toggle/group",["exports","@hashicorp/design-system-components/components/hds/form/toggle/group"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/components/hds/icon-tile/index",["exports","@hashicorp/design-system-components/components/hds/icon-tile/index"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})) +define("consul-ui/components/hds/interactive/index",["exports","@hashicorp/design-system-components/components/hds/interactive/index"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/components/hds/link/inline",["exports","@hashicorp/design-system-components/components/hds/link/inline"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/components/hds/link/standalone",["exports","@hashicorp/design-system-components/components/hds/link/standalone"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/components/hds/modal/body",["exports","@hashicorp/design-system-components/components/hds/modal/body"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/components/hds/modal/footer",["exports","@hashicorp/design-system-components/components/hds/modal/footer"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/components/hds/modal/header",["exports","@hashicorp/design-system-components/components/hds/modal/header"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/components/hds/modal/index",["exports","@hashicorp/design-system-components/components/hds/modal/index"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/components/hds/pagination/compact/index",["exports","@hashicorp/design-system-components/components/hds/pagination/compact/index"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/components/hds/pagination/info",["exports","@hashicorp/design-system-components/components/hds/pagination/info"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/components/hds/pagination/nav/arrow",["exports","@hashicorp/design-system-components/components/hds/pagination/nav/arrow"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/components/hds/pagination/nav/ellipsis",["exports","@hashicorp/design-system-components/components/hds/pagination/nav/ellipsis"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/components/hds/pagination/nav/number",["exports","@hashicorp/design-system-components/components/hds/pagination/nav/number"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/components/hds/pagination/numbered/index",["exports","@hashicorp/design-system-components/components/hds/pagination/numbered/index"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/components/hds/pagination/size-selector",["exports","@hashicorp/design-system-components/components/hds/pagination/size-selector"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/components/hds/stepper/step/indicator",["exports","@hashicorp/design-system-components/components/hds/stepper/step/indicator"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/components/hds/stepper/task/indicator",["exports","@hashicorp/design-system-components/components/hds/stepper/task/indicator"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/components/hds/table/index",["exports","@hashicorp/design-system-components/components/hds/table/index"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/components/hds/table/td",["exports","@hashicorp/design-system-components/components/hds/table/td"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/components/hds/table/th-sort",["exports","@hashicorp/design-system-components/components/hds/table/th-sort"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/components/hds/table/th",["exports","@hashicorp/design-system-components/components/hds/table/th"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/components/hds/table/tr",["exports","@hashicorp/design-system-components/components/hds/table/tr"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/components/hds/tabs/index",["exports","@hashicorp/design-system-components/components/hds/tabs/index"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/components/hds/tabs/panel",["exports","@hashicorp/design-system-components/components/hds/tabs/panel"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/components/hds/tabs/tab",["exports","@hashicorp/design-system-components/components/hds/tabs/tab"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/components/hds/tag/index",["exports","@hashicorp/design-system-components/components/hds/tag/index"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/components/hds/toast/index",["exports","@hashicorp/design-system-components/components/hds/toast/index"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/components/hds/yield/index",["exports","@hashicorp/design-system-components/components/hds/yield/index"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/components/informed-action/index",["exports","@ember/component","@ember/template-factory","@ember/component/template-only"],(function(e,t,n,l){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const r=(0,n.createTemplateFactory)({id:"NfQBR0Ol",block:'[[[11,0],[24,0,"informed-action"],[17,1],[12],[1,"\\n "],[10,0],[12],[1,"\\n "],[10,"header"],[12],[1,"\\n "],[18,2,null],[1,"\\n "],[13],[1,"\\n "],[18,3,null],[1,"\\n "],[13],[1,"\\n "],[10,"ul"],[12],[1,"\\n "],[18,4,[[28,[37,1],null,[["Action"],[[50,"anonymous",0,null,[["tagName"],["li"]]]]]]]],[1,"\\n "],[13],[1,"\\n"],[13]],["&attrs","&header","&body","&actions"],false,["yield","hash","component"]]',moduleName:"consul-ui/components/informed-action/index.hbs",isStrictMode:!1}) +var i=(0,t.setComponentTemplate)(r,(0,l.default)()) +e.default=i})),define("consul-ui/components/ivy-codemirror",["exports","ivy-codemirror/components/ivy-codemirror"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/components/jwt-source/index",["exports","@glimmer/component","@ember/service","consul-ui/utils/dom/event-source"],(function(e,t,n,l){var r,i,o,a,u +function s(e,t,n,l){n&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(l):void 0})}function c(e,t,n,l,r){var i={} +return Object.keys(l).forEach((function(e){i[e]=l[e]})),i.enumerable=!!i.enumerable,i.configurable=!!i.configurable,("value"in i||i.initializer)&&(i.writable=!0),i=n.slice().reverse().reduce((function(n,l){return l(e,t,n)||n}),i),r&&void 0!==i.initializer&&(i.value=i.initializer?i.initializer.call(r):void 0,i.initializer=void 0),void 0===i.initializer&&(Object.defineProperty(e,t,i),i=null),i}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +let d=(r=(0,n.inject)("repository/oidc-provider"),i=(0,n.inject)("dom"),o=class extends t.default{constructor(){super(...arguments),s(this,"repo",a,this),s(this,"dom",u,this),this.source&&this.source.close(),this._listeners=this.dom.listeners(),this.source=(0,l.fromPromise)(this.repo.findCodeByURL(this.args.src)),this._listeners.add(this.source,{message:e=>this.onchange(e),error:e=>this.onerror(e)})}onchange(e){"function"==typeof this.args.onchange&&this.args.onchange(...arguments)}onerror(e){"function"==typeof this.args.onerror&&this.args.onerror(...arguments)}willDestroy(){super.willDestroy(...arguments),this.source&&this.source.close(),this.repo.close(),this._listeners.remove()}},a=c(o.prototype,"repo",[r],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),u=c(o.prototype,"dom",[i],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),o) +e.default=d})) +define("consul-ui/components/list-collection/index",["exports","@ember/component","@ember/template-factory","@ember/service","@ember/object","ember-collection/components/ember-collection","ember-collection/layouts/percentage-columns","block-slots"],(function(e,t,n,l,r,i,o,a){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const u=(0,n.createTemplateFactory)({id:"DfcTL8bI",block:'[[[11,0],[16,0,[29,["list-collection list-collection-scroll-",[36,0]]]],[23,5,[28,[37,1],["height:",[33,2,["height"]],"px"],null]],[16,1,[36,3]],[17,1],[12],[1,"\\n"],[18,7,null],[1,"\\n"],[41,[28,[37,6],[[33,0],"virtual"],null],[[[1," "],[1,[28,[35,7],["resize",[28,[37,8],[[30,0],"resize"],null]],null]],[1,"\\n "],[8,[39,9],null,[["@tagName","@content-size","@scroll-left","@scroll-top","@scrollChange","@clientSizeChange"],["ul",[99,10,["@content-size"]],[99,11,["@scroll-left"]],[99,12,["@scroll-top"]],[28,[37,8],[[30,0],"scrollChange"],null],[28,[37,8],[[30,0],"clientSizeChange"],null]]],[["default"],[[[[1,"\\n "],[10,"li"],[12],[13],[42,[28,[37,14],[[28,[37,14],[[33,15]],null]],null],null,[[[10,"li"],[15,"onclick",[28,[37,8],[[30,0],"click"],null]],[22,5,[30,2,["style"]]],[15,0,[52,[33,16],[52,[28,[37,17],[[33,16]],[["item"],[[30,2,["item"]]]]],"linkable"]]],[12],[1,"\\n "],[8,[39,18],null,[["@name"],["header"]],[["default"],[[[[10,0],[14,0,"header"],[12],[18,7,[[30,2,["item"]],[30,2,["index"]]]],[13]],[]]]]],[1,"\\n "],[8,[39,18],null,[["@name"],["details"]],[["default"],[[[[10,0],[14,0,"detail"],[12],[18,7,[[30,2,["item"]],[30,2,["index"]]]],[13]],[]]]]],[1,"\\n "],[8,[39,18],null,[["@name","@params"],["actions",[28,[37,19],[[50,"more-popover-menu",0,null,[["expanded","onchange"],[[52,[28,[37,6],[[33,21],[30,2,["index"]]],null],true,false],[28,[37,8],[[30,0],"change",[30,2,["index"]]],null]]]]],null]]],[["default"],[[[[1,"\\n "],[10,0],[14,0,"actions"],[12],[1,"\\n "],[18,7,[[30,2,["item"]],[30,2,["index"]]]],[1,"\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[13]],[2]],null]],[]]]]],[1,"\\n"]],[]],[[[44,[[52,[28,[37,23],[[33,24],[28,[37,25],[[30,0,["expand"]]],null]],null],[28,[37,26],[0,[33,24],[33,27]],null],[33,27]]],[[[1," "],[10,"ul"],[12],[1,"\\n "],[10,"li"],[14,5,"display: none;"],[12],[13],[42,[28,[37,14],[[28,[37,14],[[30,3]],null]],null],null,[[[10,"li"],[15,"onclick",[28,[37,8],[[30,0],"click"],null]],[15,0,[52,[28,[37,25],[[33,16]],null],"linkable",[52,[28,[37,17],[[33,16]],[["item"],[[33,28,["item"]]]]],"linkable"]]],[12],[1,"\\n "],[8,[39,18],null,[["@name"],["header"]],[["default"],[[[[10,0],[14,0,"header"],[12],[18,7,[[30,4],[30,5]]],[13]],[]]]]],[1,"\\n "],[8,[39,18],null,[["@name"],["details"]],[["default"],[[[[10,0],[14,0,"detail"],[12],[18,7,[[30,4],[30,5]]],[13]],[]]]]],[1,"\\n "],[8,[39,18],null,[["@name","@params"],["actions",[28,[37,19],[[50,"more-popover-menu",0,null,[["onchange"],[[28,[37,8],[[30,0],"change",[30,5]],null]]]]],null]]],[["default"],[[[[1,"\\n "],[10,0],[14,0,"actions"],[12],[1,"\\n "],[18,7,[[30,4],[30,5]]],[1,"\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[13]],[4,5]],null],[13],[1,"\\n"],[41,[28,[37,23],[[33,24],[28,[37,29],[[33,27,["length"]],[33,24]],null]],null],[[[44,[[28,[37,30],[[30,3,["length"]],[33,27,["length"]]],null]],[[[1," "],[10,"button"],[15,0,[52,[30,6],"closed"]],[15,"onclick",[28,[37,8],[[30,0],[28,[37,31],[[30,0,["expand"]]],null],[30,6]],null]],[14,4,"button"],[12],[1,"\\n"],[41,[30,6],[[[1," View "],[1,[28,[35,32],[[33,27,["length"]],[30,3,["length"]]],null]],[1," more\\n"]],[]],[[[1," View less\\n"]],[]]],[1," "],[13],[1,"\\n"]],[6]]]],[]],null]],[3]]],[1,"\\n"]],[]]],[13]],["&attrs","cell","slice","item","index","more","&default"],false,["scroll","concat","style","guid","yield","if","eq","on-window","action","ember-native-scrollable","_contentSize","_scrollLeft","_scrollTop","each","-track-array","_cells","linkable","is","yield-slot","block-params","component","checked","let","and","partial","not","slice","items","cell","gt","not-eq","mut","sub"]]',moduleName:"consul-ui/components/list-collection/index.hbs",isStrictMode:!1}),s=o.default.prototype.formatItemStyle +var c=(0,t.setComponentTemplate)(u,i.default.extend(a.default,{dom:(0,l.inject)("dom"),tagName:"",height:500,cellHeight:70,checked:null,scroll:"virtual",init:function(){this._super(...arguments),this.columns=[100],this.guid=this.dom.guid(this)},didInsertElement:function(){this._super(...arguments),this.$element=this.dom.element(`#${this.guid}`),"virtual"===this.scroll&&this.actions.resize.apply(this,[{target:this.dom.viewport()}])},didReceiveAttrs:function(){this._super(...arguments),this._cellLayout=this["cell-layout"]=new o.default((0,r.get)(this,"items.length"),(0,r.get)(this,"columns"),(0,r.get)(this,"cellHeight")) +const e=this +this["cell-layout"].formatItemStyle=function(t){let n=s.apply(this,arguments) +return e.checked===t&&(n=`${n};z-index: 1`),n}},style:(0,r.computed)("height",(function(){return"virtual"!==this.scroll?{}:{height:(0,r.get)(this,"height")}})),actions:{resize:function(e){const t=(0,r.get)(this,"dom").element('footer[role="contentinfo"]') +if(t){const n=1,l=this.$element.getBoundingClientRect().top+t.clientHeight+n,r=e.target.innerHeight-l +this.set("height",Math.max(0,r)),this.updateItems(),this.updateScrollPosition()}},click:function(e){return this.dom.clickFirstAnchor(e,".list-collection > ul > li")},change:function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{} +if(t.target.checked&&e!==(0,r.get)(this,"checked")){(0,r.set)(this,"checked",parseInt(e)),this.$row=this.dom.closest("li",t.target),this.$row.style.zIndex=1 +const n=this.dom.sibling(t.target,"div") +n.getBoundingClientRect().top+n.clientHeight>this.dom.element('footer[role="contentinfo"]').getBoundingClientRect().top?n.classList.add("above"):n.classList.remove("above")}else{this.dom.sibling(t.target,"div").classList.remove("above"),(0,r.set)(this,"checked",null),this.$row.style.zIndex=null}}}})) +e.default=c})),define("consul-ui/components/maybe-in-element",["exports","ember-maybe-in-element/components/maybe-in-element"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/components/menu-panel/index",["exports","@ember/component","@ember/template-factory","@ember/service","@ember/runloop","@ember/object","block-slots"],(function(e,t,n,l,r,i,o){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const a=(0,n.createTemplateFactory)({id:"wAfNxT0t",block:'[[[18,3,null],[1,"\\n"],[44,[[28,[37,2],null,[["change"],[[28,[37,3],[[30,0],"change"],null]]]]],[[[11,0],[16,0,[28,[37,4],[[28,[37,5],["menu-panel"],null],[28,[37,5],["menu-panel-deprecated"],null],[28,[37,5],[[33,6]],null],[28,[37,5],[[33,7],"confirmation"],null]],null]],[4,[38,8],[[28,[37,3],[[30,0],"connect"],null]],null],[12],[1,"\\n "],[8,[39,9],null,[["@name"],["controls"]],[["default"],[[[[1,"\\n "],[18,3,[[30,1]]],[1,"\\n "]],[]]]]],[1,"\\n"],[6,[39,9],null,[["name"],["header"]],[["default","else"],[[[[1," "],[10,0],[12],[1,"\\n "],[18,3,[[30,1]]],[1,"\\n "],[13],[1,"\\n"]],[]],[[],[]]]]],[1," "],[11,"ul"],[24,"role","menu"],[17,2],[12],[1,"\\n "],[8,[39,9],null,[["@name"],["menu"]],[["default"],[[[[1,"\\n "],[18,3,[[30,1]]],[1,"\\n "]],[]]]]],[1,"\\n "],[13],[1,"\\n"],[13],[1,"\\n"]],[1]]]],["api","&attrs","&default"],false,["yield","let","hash","action","class-map","array","position","isConfirmation","did-insert","yield-slot"]]',moduleName:"consul-ui/components/menu-panel/index.hbs",isStrictMode:!1}) +var u=(0,t.setComponentTemplate)(a,t.default.extend(o.default,{tagName:"",dom:(0,l.inject)("dom"),isConfirmation:!1,actions:{connect:function(e){(0,r.next)((()=>{if(!this.isDestroyed){const t=this.dom.element('li:only-child > [role="menu"]:first-child',e);(0,i.set)(this,"isConfirmation",void 0!==t)}}))},change:function(e){const t=e.target.getAttribute("id"),n=this.dom.element(`[for='${t}']`),l=this.dom.element("[role=menu]",n.parentElement),r=this.dom.closest(".menu-panel",l) +if(e.target.checked){l.style.display="block" +const e=l.offsetHeight+2 +r.style.maxHeight=r.style.minHeight=`${e}px`}else l.style.display=null,r.style.maxHeight=null,r.style.minHeight="0"}}})) +e.default=u})),define("consul-ui/components/menu/action/index",["exports","@ember/component","@ember/template-factory","@ember/component/template-only"],(function(e,t,n,l){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const r=(0,n.createTemplateFactory)({id:"tJ7CAUii",block:'[[[8,[39,0],[[24,"role","menuitem"],[17,1],[4,[38,1],["click",[52,[30,2],[30,4,["close"]],[28,[37,3],null,null]]],null]],[["@href","@external"],[[30,2],[30,3]]],[["default"],[[[[1,"\\n "],[18,5,null],[1,"\\n"]],[]]]]],[1,"\\n"]],["&attrs","@href","@external","@disclosure","&default"],false,["action","on","if","noop","yield"]]',moduleName:"consul-ui/components/menu/action/index.hbs",isStrictMode:!1}) +var i=(0,t.setComponentTemplate)(r,(0,l.default)()) +e.default=i})),define("consul-ui/components/menu/index",["exports","@ember/component","@ember/template-factory","@ember/component/template-only"],(function(e,t,n,l){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const r=(0,n.createTemplateFactory)({id:"6Fvyg+h9",block:'[[[11,"ul"],[24,"role","menu"],[23,5,[28,[37,0],[[28,[37,1],["height",[52,[28,[37,3],[[30,1],[28,[37,4],[[30,1,["type"]],"native-scroll"],null]],null],[30,1,["totalHeight"]]],"px"],null],[28,[37,1],["--paged-start",[52,[28,[37,3],[[30,1],[28,[37,4],[[30,1,["type"]],"native-scroll"],null]],null],[30,1,["startHeight"]]],"px"],null]],null]],[4,[38,5],[[28,[37,6],[[30,1,["pane"]]],null]],null],[4,[38,7],null,[["onclose","openEvent"],[[28,[37,8],[[30,2],[30,3,["close"]]],null],[28,[37,8],[[30,4],[30,3,["event"]]],null]]]],[12],[1,"\\n "],[18,5,[[28,[37,10],null,[["Action","Item","Separator","items"],[[50,"menu/action",0,null,[["disclosure"],[[30,3]]]],[50,"menu/item",0,null,null],[50,"menu/separator",0,null,null],[30,1,["items"]]]]]]],[1,"\\n"],[13]],["@pager","@onclose","@disclosure","@event","&default"],false,["style-map","array","if","and","not-eq","did-insert","optional","aria-menu","or","yield","hash","component"]]',moduleName:"consul-ui/components/menu/index.hbs",isStrictMode:!1}) +var i=(0,t.setComponentTemplate)(r,(0,l.default)()) +e.default=i})),define("consul-ui/components/menu/item/index",["exports","@ember/component","@ember/template-factory","@ember/component/template-only"],(function(e,t,n,l){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const r=(0,n.createTemplateFactory)({id:"xyqbyNJ6",block:'[[[11,"li"],[24,"role","none"],[17,1],[12],[1,"\\n "],[18,2,null],[1,"\\n"],[13],[1,"\\n\\n"]],["&attrs","&default"],false,["yield"]]',moduleName:"consul-ui/components/menu/item/index.hbs",isStrictMode:!1}) +var i=(0,t.setComponentTemplate)(r,(0,l.default)()) +e.default=i})),define("consul-ui/components/menu/separator/index",["exports","@ember/component","@ember/template-factory","@ember/component/template-only"],(function(e,t,n,l){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const r=(0,n.createTemplateFactory)({id:"5tMGOxru",block:'[[[11,"li"],[24,"role","separator"],[17,1],[12],[18,2,null],[13],[1,"\\n"]],["&attrs","&default"],false,["yield"]]',moduleName:"consul-ui/components/menu/separator/index.hbs",isStrictMode:!1}) +var i=(0,t.setComponentTemplate)(r,(0,l.default)()) +e.default=i})),define("consul-ui/components/modal-dialog/index",["exports","@ember/component","@ember/template-factory","@ember/object","block-slots","a11y-dialog","@ember/runloop"],(function(e,t,n,l,r,i,o){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const a=(0,n.createTemplateFactory)({id:"LycjAwp+",block:'[[[44,[[28,[37,1],null,[["labelledby"],[[28,[37,2],null,null]]]]],[[[1," "],[8,[39,3],null,[["@target"],["modal"]],[["default"],[[[[1,"\\n "],[18,4,null],[1,"\\n "],[11,0],[24,0,"modal-dialog"],[24,"aria-hidden","true"],[17,2],[4,[38,5],[[28,[37,6],[[30,0],"connect"],null]],null],[4,[38,7],[[28,[37,6],[[30,0],"disconnect"],null]],null],[12],[1,"\\n "],[10,0],[14,"tabindex","-1"],[14,"data-a11y-dialog-hide",""],[12],[13],[1,"\\n "],[10,0],[14,0,"modal-dialog-modal"],[14,"role","dialog"],[15,"aria-label",[30,3,["label"]]],[12],[1,"\\n "],[10,0],[14,"role","document"],[12],[1,"\\n "],[10,"header"],[14,0,"modal-dialog-header"],[12],[1,"\\n "],[8,[39,8],[[24,"data-a11y-dialog-hide",""]],[["@text","@color","@icon","@size","@isIconOnly"],["Close dialog","secondary","x","small",true]],null],[1,"\\n "],[8,[39,9],null,[["@name"],["header"]],[["default"],[[[[1,"\\n "],[18,4,[[28,[37,1],null,[["open","close","opened","aria"],[[28,[37,6],[[30,0],"open"],null],[28,[37,6],[[30,0],"close"],null],[30,0,["isOpen"]],[30,1]]]]]],[1,"\\n "]],[]]]]],[1,"\\n "],[13],[1,"\\n "],[10,0],[14,0,"modal-dialog-body"],[12],[1,"\\n "],[8,[39,9],null,[["@name"],["body"]],[["default"],[[[[1,"\\n "],[18,4,[[28,[37,1],null,[["open","close","opened","aria"],[[28,[37,6],[[30,0],"open"],null],[28,[37,6],[[30,0],"close"],null],[30,0,["isOpen"]],[30,1]]]]]],[1,"\\n "]],[]]]]],[1,"\\n "],[13],[1,"\\n "],[10,"footer"],[14,0,"modal-dialog-footer"],[12],[1,"\\n "],[8,[39,9],null,[["@name","@params"],["actions",[28,[37,10],[[28,[37,6],[[30,0],"close"],null]],null]]],[["default"],[[[[1,"\\n "],[18,4,[[28,[37,1],null,[["open","close","opened","aria"],[[28,[37,6],[[30,0],"open"],null],[28,[37,6],[[30,0],"close"],null],[30,0,["isOpen"]],[30,1]]]]]],[1,"\\n "]],[]]]]],[1,"\\n "],[13],[1,"\\n "],[13],[1,"\\n "],[13],[1,"\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n"]],[1]]]],["aria","&attrs","@aria","&default"],false,["let","hash","unique-id","portal","yield","did-insert","action","will-destroy","hds/button","yield-slot","block-params"]]',moduleName:"consul-ui/components/modal-dialog/index.hbs",isStrictMode:!1}) +var u=(0,t.setComponentTemplate)(a,t.default.extend(r.default,{tagName:"",onclose:function(){},onopen:function(){},isOpen:!1,actions:{connect:function(e){this.dialog=new i.default(e),this.dialog.on("hide",(()=>{(0,o.schedule)("afterRender",(e=>(0,l.set)(this,"isOpen",!1))),this.onclose({target:e})})),this.dialog.on("show",(()=>{(0,l.set)(this,"isOpen",!0),this.onopen({target:e})})),this.open&&this.actions.open.apply(this,[])},disconnect:function(e){this.dialog.destroy()},open:function(){this.dialog.show()},close:function(){this.dialog.hide()}}})) +e.default=u})),define("consul-ui/components/modal-layer/index",["exports","@ember/component","@ember/template-factory","@ember/component/template-only"],(function(e,t,n,l){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const r=(0,n.createTemplateFactory)({id:"6vWxczPc",block:'[[[11,0],[24,0,"modal-layer"],[17,1],[12],[1,"\\n "],[8,[39,0],null,[["@name","@multiple"],["modal",true]],null],[1,"\\n"],[13],[1,"\\n"]],["&attrs"],false,["portal-target"]]',moduleName:"consul-ui/components/modal-layer/index.hbs",isStrictMode:!1}) +var i=(0,t.setComponentTemplate)(r,(0,l.default)()) +e.default=i})),define("consul-ui/components/more-popover-menu/index",["exports","@ember/component","@ember/template-factory"],(function(e,t,n){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const l=(0,n.createTemplateFactory)({id:"9USQK1Le",block:'[[[11,0],[24,0,"more-popover-menu"],[17,1],[12],[1,"\\n "],[8,[39,0],null,[["@expanded","@onchange","@keyboardAccess"],[[99,1,["@expanded"]],[28,[37,2],[[30,0],[33,3]],null],false]],[["default"],[[[[1,"\\n "],[8,[39,4],null,[["@name"],["trigger"]],[["default"],[[[[1,"\\n More\\n "]],[]]]]],[1,"\\n "],[8,[39,4],null,[["@name"],["menu"]],[["default"],[[[[1,"\\n "],[18,4,[[30,2,["MenuItem"]]]],[1,"\\n "]],[]]]]],[1,"\\n "]],[2,3]]]]],[1,"\\n"],[13],[1,"\\n"]],["&attrs","components","api","&default"],false,["popover-menu","expanded","action","onchange","block-slot","yield"]]',moduleName:"consul-ui/components/more-popover-menu/index.hbs",isStrictMode:!1}) +var r=(0,t.setComponentTemplate)(l,t.default.extend({tagName:""})) +e.default=r})),define("consul-ui/components/oidc-select/chart.xstate",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +e.default={id:"oidc-select",initial:"idle",on:{RESET:[{target:"idle"}]},states:{idle:{on:{LOAD:[{target:"loading"}]}},loaded:{},loading:{on:{SUCCESS:[{target:"loaded"}]}}}}})),define("consul-ui/components/oidc-select/index",["exports","@ember/component","@ember/template-factory","@glimmer/component","@glimmer/tracking","consul-ui/components/oidc-select/chart.xstate"],(function(e,t,n,l,r,i){var o,a +Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const u=(0,n.createTemplateFactory)({id:"1JjkWJfY",block:'[[[8,[39,0],null,[["@src"],[[99,1,["@src"]]]],[["default"],[[[[1,"\\n"],[44,[[28,[37,3],null,[["State","Guard","Action","dispatch","state"],[[30,1],[30,2],[30,3],[30,4],[30,5]]]]],[[[1,"\\n "],[11,0],[24,0,"oidc-select"],[17,7],[12],[1,"\\n "],[8,[30,1],null,[["@notMatches"],["idle"]],[["default"],[[[[1,"\\n "],[8,[39,4],null,[["@src","@onchange","@onerror"],[[28,[37,5],["/${partition}/${nspace}/${dc}/oidc/providers",[28,[37,3],null,[["partition","nspace","dc"],[[30,0,["partition"]],[30,8],[30,9]]]]],null],[28,[37,6],[[28,[37,7],[[30,0],[28,[37,8],[[30,0,["items"]]],null]],[["value"],["data"]]],[28,[37,9],[[30,4],"SUCCESS"],null]],null],[28,[37,6],[[28,[37,9],[[30,4],"RESET"],null],[30,10]],null]]],null],[1,"\\n "]],[]]]]],[1,"\\n\\n "],[8,[30,1],null,[["@matches"],["loaded"]],[["default"],[[[[1,"\\n "],[8,[39,7],[[24,0,"reset"],[4,[38,10],["click",[28,[37,6],[[28,[37,11],[[30,0],"partition",""],null],[28,[37,9],[[30,4],"RESET"],null]],null]],null]],null,[["default"],[[[[1,"\\n Choose different Partition\\n "]],[]]]]],[1,"\\n "]],[]]]]],[1,"\\n\\n "],[8,[39,0],null,[["@src"],[[28,[37,0],["validate"],null]]],[["default"],[[[[1,"\\n "],[8,[39,12],null,[["@name","@label","@item","@validations","@placeholder","@oninput","@chart"],["partition","Admin Partition",[30,0],[28,[37,3],null,[["partition"],[[28,[37,13],[[28,[37,3],null,[["test","error"],["^[a-zA-Z0-9]([a-zA-Z0-9-]{0,62}[a-zA-Z0-9])?$","Name must be a valid DNS hostname."]]]],null]]]],"Enter your Partition",[28,[37,7],[[30,0],[28,[37,8],[[30,0,["partition"]]],null]],[["value"],["target.value"]]],[28,[37,3],null,[["state","dispatch"],[[30,15],[30,14]]]]]],null],[1,"\\n\\n"],[1," "],[8,[30,1],null,[["@matches"],["idle"]],[["default"],[[[[1,"\\n "],[8,[39,14],[[16,"disabled",[28,[37,15],[[28,[37,16],[[30,0,["partition","length"]],1],null],[28,[37,17],[[30,15],"error"],null]],null]],[24,4,"submit"],[4,[38,10],["click",[28,[37,9],[[30,4],"LOAD"],null]],null]],[["@text"],["Choose provider"]],null],[1,"\\n "]],[]]]]],[1,"\\n\\n "]],[11,12,13,14,15]]]]],[1,"\\n\\n "],[8,[30,1],null,[["@matches"],["loading"]],[["default"],[[[[1,"\\n "],[8,[39,18],[[24,"aria-label","Loading"]],null,null],[1,"\\n "]],[]]]]],[1,"\\n\\n "],[8,[30,1],null,[["@matches"],["loaded"]],[["default"],[[[[1,"\\n"],[41,[28,[37,16],[[30,0,["items","length"]],3],null],[[[1,"\\n "],[10,"ul"],[12],[1,"\\n"],[42,[28,[37,21],[[28,[37,21],[[30,0,["items"]]],null]],null],null,[[[1," "],[10,"li"],[12],[1,"\\n "],[8,[39,7],[[16,0,[28,[37,22],[[30,16,["Kind"]],"-oidc-provider"],null]],[16,"disabled",[30,17]],[4,[38,10],["click",[28,[37,9],[[30,18],[30,16]],null]],null]],[["@type"],["button"]],[["default"],[[[[1,"\\n Continue with\\n "],[1,[28,[35,15],[[30,16,["DisplayName"]],[30,16,["Name"]]],null]],[41,[28,[37,23],[[30,16,["Namespace"]],"default"],null],[[[1,"\\n ("],[1,[30,16,["Namespace"]]],[1,")"]],[]],null],[1,"\\n "]],[]]]]],[1,"\\n "],[13],[1,"\\n"]],[16]],null],[1," "],[13],[1,"\\n\\n"]],[]],[[[1,"\\n"],[44,[[28,[37,15],[[30,0,["provider"]],[28,[37,24],[0,[30,0,["items"]]],null]],null]],[[[1,"\\n "],[8,[39,25],null,[["@label","@name","@item","@selected","@items","@onchange","@disabled"],["SSO Provider","provider",[30,0],[30,19],[30,0,["items"]],[28,[37,7],[[30,0],[28,[37,8],[[30,0,["provider"]]],null]],null],[30,17]]],[["option"],[[[[1,"\\n "],[10,1],[15,0,[28,[37,22],[[30,20,["item","Kind"]],"-oidc-provider"],null]],[12],[1,"\\n "],[1,[28,[35,15],[[30,20,["item","DisplayName"]],[30,20,["item","Name"]]],null]],[41,[28,[37,23],[[30,20,["item","Namespace"]],"default"],null],[[[1," ("],[1,[30,20,["item","Namespace"]]],[1,")"]],[]],null],[1,"\\n "],[13],[1,"\\n "]],[20]]]]],[1,"\\n\\n "],[8,[39,14],[[16,"disabled",[30,17]],[4,[38,10],["click",[28,[37,9],[[30,18],[30,19]],null]],null]],[["@color","@text"],["primary","Log in"]],null],[1,"\\n"]],[19]]]],[]]],[1," "]],[]]]]],[1,"\\n "],[13],[1,"\\n"]],[6]]]],[1,2,3,4,5]]]]],[1,"\\n"]],["State","Guard","ChartAction","dispatch","state","chart","&attrs","@nspace","@dc","@onerror","ignoredState","ignoredGuard","ignoredAction","formDispatch","state","item","@disabled","@onchange","item","option"],false,["state-chart","chart","let","hash","data-source","uri","queue","action","mut","fn","on","set","text-input","array","hds/button","or","lt","state-matches","progress","if","each","-track-array","concat","not-eq","object-at","option-input"]]',moduleName:"consul-ui/components/oidc-select/index.hbs",isStrictMode:!1}) +let s=(o=class extends l.default{constructor(){var e,t,n,l +super(...arguments),e=this,t="partition",l=this,(n=a)&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(l):void 0}),this.chart=i.default,this.args.partition&&(this.partition=this.args.partition)}},c=o.prototype,d="partition",p=[r.tracked],f={configurable:!0,enumerable:!0,writable:!0,initializer:function(){return"default"}},h={},Object.keys(f).forEach((function(e){h[e]=f[e]})),h.enumerable=!!h.enumerable,h.configurable=!!h.configurable,("value"in h||h.initializer)&&(h.writable=!0),h=p.slice().reverse().reduce((function(e,t){return t(c,d,e)||e}),h),m&&void 0!==h.initializer&&(h.value=h.initializer?h.initializer.call(m):void 0,h.initializer=void 0),void 0===h.initializer&&(Object.defineProperty(c,d,h),h=null),a=h,o) +var c,d,p,f,m,h +e.default=s,(0,t.setComponentTemplate)(u,s)})),define("consul-ui/components/option-input/index",["exports","@ember/component","@ember/template-factory","@ember/component/template-only"],(function(e,t,n,l){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const r=(0,n.createTemplateFactory)({id:"hk9fkczL",block:'[[[8,[39,0],[[24,0,"option-input type-select"],[17,1]],[["@item","@placeholder","@name","@label","@help","@validations","@chart"],[[30,2],[30,3],[30,4],[30,5],[30,6],[30,7],[30,8]]],[["label","input"],[[[[1,"\\n"],[1," "],[1,[28,[35,1],[[30,5],[30,4]],null]],[1,"\\n "]],[]],[[[1,"\\n"],[41,[30,9],[[[41,[30,10],[[],[]],[[],[]]]],[]],[[[1," "],[8,[39,3],null,[["@disabled","@onChange","@selected","@searchEnabled","@options"],[[30,11],[30,12],[30,13],false,[30,14]]],[["default"],[[[[1,"\\n "],[18,16,[[28,[37,5],null,[["item"],[[30,15]]]]]],[1,"\\n "]],[15]]]]],[1,"\\n"]],[]]],[1," "]],[]]]]],[1,"\\n"]],["&attrs","@item","@placeholder","@name","@label","@help","@validations","@chart","@expanded","@multiple","@disabled","@onchange","@selected","@items","item","&option"],false,["form-input","or","if","power-select","yield","hash"]]',moduleName:"consul-ui/components/option-input/index.hbs",isStrictMode:!1}) +var i=(0,t.setComponentTemplate)(r,(0,l.default)()) +e.default=i})),define("consul-ui/components/outlet/index",["exports","@ember/component","@ember/template-factory","@glimmer/component","@glimmer/tracking","@ember/object","@ember/service"],(function(e,t,n,l,r,i,o){var a,u,s,c,d,p,f,m,h,b,y +function g(e,t,n,l){n&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(l):void 0})}function v(e,t,n,l,r){var i={} +return Object.keys(l).forEach((function(e){i[e]=l[e]})),i.enumerable=!!i.enumerable,i.configurable=!!i.configurable,("value"in i||i.initializer)&&(i.writable=!0),i=n.slice().reverse().reduce((function(n,l){return l(e,t,n)||n}),i),r&&void 0!==i.initializer&&(i.value=i.initializer?i.initializer.call(r):void 0,i.initializer=void 0),void 0===i.initializer&&(Object.defineProperty(e,t,i),i=null),i}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const O=(0,n.createTemplateFactory)({id:"X7pi+rvm",block:'[[[1,[28,[35,0],[[30,0,["connect"]]],null]],[1,"\\n"],[1,[28,[35,1],[[30,0,["disconnect"]]],null]],[1,"\\n"],[11,"section"],[24,0,"outlet"],[16,"data-outlet",[30,1]],[16,"data-route",[30,0,["routeName"]]],[16,"data-state",[30,0,["state","name"]]],[16,"data-transition",[28,[37,2],[[30,0,["previousState","name"]]," ",[30,0,["state","name"]]],null]],[4,[38,0],[[28,[37,3],[[30,0,["attributeChanged"]],"element"],null]],null],[4,[38,4],[[28,[37,3],[[30,0,["attributeChanged"]],"model",[30,2]],null]],null],[4,[38,5],["transitionend",[30,0,["transitionEnd"]]],null],[12],[1,"\\n "],[18,3,[[28,[37,7],null,[["state","previousState","route"],[[30,0,["state"]],[30,0,["previousState"]],[30,0,["route"]]]]]]],[1,"\\n"],[13]],["@name","@model","&default"],false,["did-insert","will-destroy","concat","fn","did-update","on","yield","hash"]]',moduleName:"consul-ui/components/outlet/index.hbs",isStrictMode:!1}) +class P{constructor(e){this.name=e}matches(e){return this.name===e}}let x=(a=(0,o.inject)("routlet"),u=(0,o.inject)("router"),s=class extends l.default{constructor(){super(...arguments),g(this,"routlet",c,this),g(this,"router",d,this),g(this,"element",p,this),g(this,"routeName",f,this),g(this,"state",m,this),g(this,"previousState",h,this),g(this,"endTransition",b,this),g(this,"route",y,this)}get model(){return this.args.model||{}}get name(){return this.args.name}setAppRoute(e){if("loading"!==e||"oidc-provider-debug"===e){const t=this.element.ownerDocument.documentElement +t.classList.contains("ember-loading")&&t.classList.remove("ember-loading"),t.dataset.route=e,this.setAppState("idle")}}setAppState(e){this.element.ownerDocument.documentElement.dataset.state=e}attributeChanged(e,t){switch(e){case"element":this.element=t,"application"===this.args.name&&(this.setAppState("loading"),this.setAppRoute(this.router.currentRouteName)) +break +case"model":void 0!==this.route&&(this.route._model=t)}}transitionEnd(e){"function"==typeof this.endTransition&&this.endTransition()}startLoad(e){const t=this.routlet.findOutlet(e.to.name)||"application" +if(this.args.name===t){let e +this.previousState=this.state,this.state=new P("loading"),this.endTransition=this.routlet.transition(),e=this.element?window.getComputedStyle(this.element).getPropertyValue("transition-duration"):0,0===parseFloat(e)&&this.endTransition()}"application"===this.args.name&&this.setAppState("loading")}endLoad(e){this.state.matches("loading")&&(this.previousState=this.state,this.state=new P("idle")),"application"===this.args.name&&this.setAppRoute(this.router.currentRouteName)}connect(){this.routlet.addOutlet(this.args.name,this),this.previousState=this.state=new P("idle"),this.router.on("routeWillChange",this.startLoad),this.router.on("routeDidChange",this.endLoad)}disconnect(){this.routlet.removeOutlet(this.args.name),this.router.off("routeWillChange",this.startLoad),this.router.off("routeDidChange",this.endLoad)}},c=v(s.prototype,"routlet",[a],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),d=v(s.prototype,"router",[u],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),p=v(s.prototype,"element",[r.tracked],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),f=v(s.prototype,"routeName",[r.tracked],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),m=v(s.prototype,"state",[r.tracked],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),h=v(s.prototype,"previousState",[r.tracked],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),b=v(s.prototype,"endTransition",[r.tracked],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),y=v(s.prototype,"route",[r.tracked],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),v(s.prototype,"attributeChanged",[i.action],Object.getOwnPropertyDescriptor(s.prototype,"attributeChanged"),s.prototype),v(s.prototype,"transitionEnd",[i.action],Object.getOwnPropertyDescriptor(s.prototype,"transitionEnd"),s.prototype),v(s.prototype,"startLoad",[i.action],Object.getOwnPropertyDescriptor(s.prototype,"startLoad"),s.prototype),v(s.prototype,"endLoad",[i.action],Object.getOwnPropertyDescriptor(s.prototype,"endLoad"),s.prototype),v(s.prototype,"connect",[i.action],Object.getOwnPropertyDescriptor(s.prototype,"connect"),s.prototype),v(s.prototype,"disconnect",[i.action],Object.getOwnPropertyDescriptor(s.prototype,"disconnect"),s.prototype),s) +e.default=x,(0,t.setComponentTemplate)(O,x)})),define("consul-ui/components/paged-collection/index",["exports","@ember/component","@ember/template-factory","@glimmer/component","@ember/object","@glimmer/tracking","@ember/runloop"],(function(e,t,n,l,r,i,o){var a,u,s,c,d,p,f,m +function h(e,t,n,l){n&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(l):void 0})}function b(e,t,n,l,r){var i={} +return Object.keys(l).forEach((function(e){i[e]=l[e]})),i.enumerable=!!i.enumerable,i.configurable=!!i.configurable,("value"in i||i.initializer)&&(i.writable=!0),i=n.slice().reverse().reduce((function(n,l){return l(e,t,n)||n}),i),r&&void 0!==i.initializer&&(i.value=i.initializer?i.initializer.call(r):void 0,i.initializer=void 0),void 0===i.initializer&&(Object.defineProperty(e,t,i),i=null),i}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const y=(0,n.createTemplateFactory)({id:"4n2jhP/a",block:'[[[18,2,[[28,[37,1],null,[["items","page","pane","resize","viewport","rowHeight","maxHeight","startHeight","totalHeight","totalPages","Pager"],[[30,0,["items"]],[30,1],[28,[37,2],[[30,0,["setPane"]]],null],[28,[37,2],[[30,0,["resize"]]],null],[28,[37,2],[[30,0,["setViewport"]]],null],[28,[37,2],[[30,0,["setRowHeight"]]],null],[28,[37,2],[[30,0,["setMaxHeight"]]],null],[30,0,["startHeight"]],[30,0,["totalHeight"]],[30,0,["totalPages"]],[52,[28,[37,4],[[33,5],"index"],null],[50,"yield",0,null,null],""]]]]]],[1,"\\n\\n"],[1,[28,[35,7],[[30,0,["disconnect"]]],null]],[1,"\\n"]],["@page","&default"],false,["yield","hash","fn","if","eq","type","component","will-destroy"]]',moduleName:"consul-ui/components/paged-collection/index.hbs",isStrictMode:!1}) +let g=(a=class extends l.default{constructor(){super(...arguments),h(this,"$pane",u,this),h(this,"$viewport",s,this),h(this,"top",c,this),h(this,"visibleItems",d,this),h(this,"overflow",p,this),h(this,"_rowHeight",f,this),h(this,"_type",m,this)}get type(){return this.args.type||this._type}get items(){return this.args.items.slice(this.cursor,this.cursor+this.perPage)}get perPage(){switch(this.type){case"virtual-scroll":return this.visibleItems+2*this.overflow +case"index":return parseInt(this.args.perPage)}return this.total}get cursor(){switch(this.type){case"virtual-scroll":return this.itemsBefore +case"index":return(parseInt(this.args.page)-1)*this.perPage}return 0}get itemsBefore(){return void 0===this.$viewport?0:Math.max(0,Math.round(this.top/this.rowHeight)-this.overflow)}get rowHeight(){return parseFloat(this.args.rowHeight||this._rowHeight)}get startHeight(){switch(this.type){case"virtual-scroll":return Math.min(this.totalHeight,this.itemsBefore*this.rowHeight) +case"index":return 0}return 0}get totalHeight(){return this.total*this.rowHeight}get totalPages(){return Math.ceil(this.total/this.perPage)}get total(){return this.args.items.length}scroll(e){this.top=this.$viewport.scrollTop}resize(){this.$viewport.clientHeight>0&&this.rowHeight>0?this.visibleItems=Math.ceil(this.$viewport.clientHeight/this.rowHeight):this.visibleItems=0}setViewport(e){this.$viewport="html"===e?[...document.getElementsByTagName("html")][0]:e,this.$viewport.addEventListener("scroll",this.scroll),"html"===e&&this.$viewport.addEventListener("resize",this.resize),this.scroll(),this.resize()}setPane(e){this.$pane=e}setRowHeight(e){this._rowHeight=parseFloat(e)}setMaxHeight(e){(0,o.scheduleOnce)("actions",this,"_setMaxHeight")}_setMaxHeight(e){const t=parseFloat(e) +isNaN(t)||(this._type="virtual-scroll")}disconnect(){this.$viewport.removeEventListener("scroll",this.scroll),this.$viewport.removeEventListener("resize",this.resize)}},u=b(a.prototype,"$pane",[i.tracked],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),s=b(a.prototype,"$viewport",[i.tracked],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),c=b(a.prototype,"top",[i.tracked],{configurable:!0,enumerable:!0,writable:!0,initializer:function(){return 0}}),d=b(a.prototype,"visibleItems",[i.tracked],{configurable:!0,enumerable:!0,writable:!0,initializer:function(){return 0}}),p=b(a.prototype,"overflow",[i.tracked],{configurable:!0,enumerable:!0,writable:!0,initializer:function(){return 10}}),f=b(a.prototype,"_rowHeight",[i.tracked],{configurable:!0,enumerable:!0,writable:!0,initializer:function(){return 0}}),m=b(a.prototype,"_type",[i.tracked],{configurable:!0,enumerable:!0,writable:!0,initializer:function(){return"native-scroll"}}),b(a.prototype,"scroll",[r.action],Object.getOwnPropertyDescriptor(a.prototype,"scroll"),a.prototype),b(a.prototype,"resize",[r.action],Object.getOwnPropertyDescriptor(a.prototype,"resize"),a.prototype),b(a.prototype,"setViewport",[r.action],Object.getOwnPropertyDescriptor(a.prototype,"setViewport"),a.prototype),b(a.prototype,"setPane",[r.action],Object.getOwnPropertyDescriptor(a.prototype,"setPane"),a.prototype),b(a.prototype,"setRowHeight",[r.action],Object.getOwnPropertyDescriptor(a.prototype,"setRowHeight"),a.prototype),b(a.prototype,"setMaxHeight",[r.action],Object.getOwnPropertyDescriptor(a.prototype,"setMaxHeight"),a.prototype),b(a.prototype,"_setMaxHeight",[r.action],Object.getOwnPropertyDescriptor(a.prototype,"_setMaxHeight"),a.prototype),b(a.prototype,"disconnect",[r.action],Object.getOwnPropertyDescriptor(a.prototype,"disconnect"),a.prototype),a) +e.default=g,(0,t.setComponentTemplate)(y,g)})),define("consul-ui/components/panel/index.css",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +e.default=e=>e` + .panel { + --padding-x: 14px; + --padding-y: 14px; + } + .panel { + position: relative; + } + .panel-separator { + margin: 0; + } + + .panel { + --tone-border: var(--token-color-palette-neutral-300); + border: var(--decor-border-100); + border-radius: var(--decor-radius-200); + box-shadow: var(--token-surface-high-box-shadow); + } + .panel-separator { + border: 0; + border-top: var(--decor-border-100); + } + .panel { + color: var(--token-color-foreground-strong); + background-color: var(--token-color-surface-primary); + } + .panel, + .panel-separator { + border-color: var(--tone-border); + } +`})),define("consul-ui/components/peerings/badge/icon/index",["exports","@ember/component","@ember/template-factory","@ember/component/template-only"],(function(e,t,n,l){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const r=(0,n.createTemplateFactory)({id:"gV8UFvY5",block:'[[[41,[28,[37,1],[[28,[37,2],[[30,1],"PENDING"],null],[28,[37,2],[[30,1],"ESTABLISHING"],null]],null],[[[11,"svg"],[24,"width","16"],[24,"height","16"],[24,"viewBox","0 0 16 16"],[24,"fill","none"],[24,"xmlns","http://www.w3.org/2000/svg","http://www.w3.org/2000/xmlns/"],[17,2],[12],[1,"\\n "],[10,"path"],[14,"fill-rule","evenodd"],[14,"clip-rule","evenodd"],[14,"d","M8 1.5C6.14798 1.5 4.47788 2.27358 3.29301 3.51732C3.0073 3.81723 2.53256 3.82874 2.23266 3.54303C1.93275 3.25732 1.92125 2.78258 2.20696 2.48268C3.66316 0.954124 5.72078 0 8 0C10.2792 0 12.3368 0.954124 13.793 2.48268C14.0788 2.78258 14.0672 3.25732 13.7673 3.54303C13.4674 3.82874 12.9927 3.81723 12.707 3.51732C11.5221 2.27358 9.85202 1.5 8 1.5ZM1.23586 5.27899C1.63407 5.39303 1.86443 5.80828 1.75039 6.20649C1.58749 6.7753 1.5 7.3768 1.5 8C1.5 11.0649 3.62199 13.636 6.47785 14.321C6.88064 14.4176 7.12885 14.8224 7.03225 15.2252C6.93565 15.628 6.53081 15.8762 6.12802 15.7796C2.61312 14.9366 0 11.7744 0 8C0 7.23572 0.107387 6.49527 0.30836 5.79351C0.422401 5.39531 0.837659 5.16494 1.23586 5.27899ZM14.7641 5.27899C15.1623 5.16494 15.5776 5.39531 15.6916 5.79351C15.8926 6.49527 16 7.23572 16 8C16 11.7744 13.3869 14.9366 9.87199 15.7796C9.4692 15.8762 9.06436 15.628 8.96775 15.2252C8.87115 14.8224 9.11936 14.4176 9.52215 14.321C12.378 13.636 14.5 11.0649 14.5 8C14.5 7.3768 14.4125 6.7753 14.2496 6.20649C14.1356 5.80828 14.3659 5.39303 14.7641 5.27899Z"],[14,"fill","#3B3D45"],[12],[13],[1,"\\n "],[10,"path"],[14,"opacity","0.2"],[14,"fill-rule","evenodd"],[14,"clip-rule","evenodd"],[14,"d","M8 4.5C6.067 4.5 4.5 6.067 4.5 8C4.5 9.933 6.067 11.5 8 11.5C9.933 11.5 11.5 9.933 11.5 8C11.5 6.067 9.933 4.5 8 4.5ZM3 8C3 5.23858 5.23858 3 8 3C10.7614 3 13 5.23858 13 8C13 10.7614 10.7614 13 8 13C5.23858 13 3 10.7614 3 8Z"],[14,"fill","#000001"],[12],[13],[1,"\\n"],[13],[1,"\\n"]],[]],null],[41,[28,[37,2],[[30,1],"ACTIVE"],null],[[[11,"svg"],[24,"width","16"],[24,"height","16"],[24,"viewBox","0 0 16 16"],[24,"fill","none"],[24,"xmlns","http://www.w3.org/2000/svg","http://www.w3.org/2000/xmlns/"],[17,2],[12],[1,"\\n "],[10,"path"],[14,"d","M14.7803 4.28033C15.0732 3.98744 15.0732 3.51256 14.7803 3.21967C14.4874 2.92678 14.0126 2.92678 13.7197 3.21967L5.75 11.1893L2.28033 7.71967C1.98744 7.42678 1.51256 7.42678 1.21967 7.71967C0.926777 8.01256 0.926777 8.48744 1.21967 8.78033L5.21967 12.7803C5.51256 13.0732 5.98744 13.0732 6.28033 12.7803L14.7803 4.28033Z"],[14,"fill","#00781E"],[12],[13],[1,"\\n"],[13],[1,"\\n"]],[]],null],[41,[28,[37,2],[[30,1],"FAILING"],null],[[[11,"svg"],[24,"width","16"],[24,"height","16"],[24,"viewBox","0 0 16 16"],[24,"fill","none"],[24,"xmlns","http://www.w3.org/2000/svg","http://www.w3.org/2000/xmlns/"],[17,2],[12],[1,"\\n "],[10,"path"],[14,"d","M12.7803 4.28033C13.0732 3.98744 13.0732 3.51256 12.7803 3.21967C12.4874 2.92678 12.0126 2.92678 11.7197 3.21967L8 6.93934L4.28033 3.21967C3.98744 2.92678 3.51256 2.92678 3.21967 3.21967C2.92678 3.51256 2.92678 3.98744 3.21967 4.28033L6.93934 8L3.21967 11.7197C2.92678 12.0126 2.92678 12.4874 3.21967 12.7803C3.51256 13.0732 3.98744 13.0732 4.28033 12.7803L8 9.06066L11.7197 12.7803C12.0126 13.0732 12.4874 13.0732 12.7803 12.7803C13.0732 12.4874 13.0732 12.0126 12.7803 11.7197L9.06066 8L12.7803 4.28033Z"],[14,"fill","#C00005"],[12],[13],[1,"\\n"],[13],[1,"\\n"]],[]],null],[1,"\\n"],[41,[28,[37,2],[[30,1],"TERMINATED"],null],[[[11,"svg"],[24,"width","16"],[24,"height","17"],[24,"viewBox","0 0 16 17"],[24,"fill","none"],[24,"xmlns","http://www.w3.org/2000/svg","http://www.w3.org/2000/xmlns/"],[17,2],[12],[1,"\\n "],[10,"path"],[14,"fill-rule","evenodd"],[14,"clip-rule","evenodd"],[14,"d","M3.13889 2.55566C2.78604 2.55566 2.5 2.8417 2.5 3.19455V12.9168C2.5 13.2696 2.78604 13.5557 3.13889 13.5557H12.8611C13.214 13.5557 13.5 13.2696 13.5 12.9168V3.19455C13.5 2.8417 13.214 2.55566 12.8611 2.55566H3.13889ZM1 3.19455C1 2.01328 1.95761 1.05566 3.13889 1.05566H12.8611C14.0424 1.05566 15 2.01328 15 3.19455V12.9168C15 14.0981 14.0424 15.0557 12.8611 15.0557H3.13889C1.95761 15.0557 1 14.0981 1 12.9168V3.19455ZM4.71967 4.77533C5.01256 4.48244 5.48744 4.48244 5.78033 4.77533L8 6.995L10.2197 4.77533C10.5126 4.48244 10.9874 4.48244 11.2803 4.77533C11.5732 5.06823 11.5732 5.5431 11.2803 5.83599L9.06066 8.05566L11.2803 10.2753C11.5732 10.5682 11.5732 11.0431 11.2803 11.336C10.9874 11.6289 10.5126 11.6289 10.2197 11.336L8 9.11632L5.78033 11.336C5.48744 11.6289 5.01256 11.6289 4.71967 11.336C4.42678 11.0431 4.42678 10.5682 4.71967 10.2753L6.93934 8.05566L4.71967 5.83599C4.42678 5.5431 4.42678 5.06823 4.71967 4.77533Z"],[14,"fill","#3B3D45"],[12],[13],[1,"\\n"],[13],[1,"\\n"]],[]],null],[41,[28,[37,2],[[30,1],"UNDEFINED"],null],[[[11,"svg"],[24,"width","16"],[24,"height","16"],[24,"viewBox","0 0 16 16"],[24,"fill","none"],[24,"xmlns","http://www.w3.org/2000/svg","http://www.w3.org/2000/xmlns/"],[17,2],[12],[1,"\\n"],[10,"path"],[14,"fill-rule","evenodd"],[14,"clip-rule","evenodd"],[14,"d","M8.1969 4.52275C7.83582 4.45975 7.46375 4.52849 7.14594 4.7185C6.82781 4.9087 6.58324 5.20915 6.45878 5.56907C6.32341 5.96054 5.89632 6.16815 5.50485 6.03278C5.11338 5.89741 4.90577 5.47032 5.04114 5.07886C5.27962 4.3892 5.75141 3.80461 6.37621 3.43106C7.00132 3.05732 7.73786 2.91999 8.45475 3.04508C9.17148 3.17015 9.81887 3.54878 10.2837 4.11048C10.7481 4.67171 11.0009 5.37994 11 6.10959C10.9999 6.59724 10.9078 7.01534 10.7254 7.37628C10.5432 7.73694 10.2936 7.9952 10.0464 8.19341C9.85239 8.34899 9.63602 8.48431 9.46464 8.59149C9.431 8.61253 9.39909 8.63248 9.36942 8.65129C9.16778 8.77916 9.02667 8.87887 8.91689 8.99055C8.81461 9.0946 8.77388 9.18682 8.75706 9.23816C8.74978 9.26038 8.74659 9.27628 8.74537 9.28347C8.72786 9.68216 8.3991 10 7.9961 10C7.58189 10 7.2461 9.66422 7.2461 9.25C7.24626 9.08689 7.28103 8.92552 7.33163 8.77109C7.41129 8.52797 7.56353 8.22758 7.84718 7.93902C8.0857 7.69637 8.35223 7.52016 8.56613 7.38452C8.61117 7.35596 8.65343 7.32942 8.69337 7.30434C8.8616 7.1987 8.98859 7.11896 9.10803 7.02318C9.24074 6.91676 9.32751 6.81683 9.38666 6.69978C9.44562 6.5831 9.49996 6.4041 9.49996 6.10918L9.49996 6.10808C9.50052 5.72536 9.36781 5.35654 9.12803 5.06677C8.88848 4.77728 8.55813 4.58578 8.1969 4.52275Z"],[14,"fill","#3B3D45"],[12],[13],[1,"\\n"],[10,"path"],[14,"d","M8 11C7.44772 11 7 11.4477 7 12C7 12.5523 7.44772 13 8 13H8.00667C8.55895 13 9.00667 12.5523 9.00667 12C9.00667 11.4477 8.55895 11 8.00667 11H8Z"],[14,"fill","#3B3D45"],[12],[13],[1,"\\n"],[10,"path"],[14,"fill-rule","evenodd"],[14,"clip-rule","evenodd"],[14,"d","M0 8C0 3.58172 3.58172 0 8 0C12.4183 0 16 3.58172 16 8C16 12.4183 12.4183 16 8 16C3.58172 16 0 12.4183 0 8ZM8 1.5C4.41015 1.5 1.5 4.41015 1.5 8C1.5 11.5899 4.41015 14.5 8 14.5C11.5899 14.5 14.5 11.5899 14.5 8C14.5 4.41015 11.5899 1.5 8 1.5Z"],[14,"fill","#3B3D45"],[12],[13],[1,"\\n"],[13],[1,"\\n"]],[]],null],[1,"\\n"],[41,[28,[37,2],[[30,1],"DELETING"],null],[[[10,"svg"],[14,"width","16"],[14,"height","16"],[14,"viewBox","0 0 16 16"],[14,"fill","none"],[14,"xmlns","http://www.w3.org/2000/svg","http://www.w3.org/2000/xmlns/"],[12],[1,"\\n"],[10,"path"],[14,"opacity","0.2"],[14,"fill-rule","evenodd"],[14,"clip-rule","evenodd"],[14,"d","M8 1.5C4.41015 1.5 1.5 4.41015 1.5 8C1.5 11.5899 4.41015 14.5 8 14.5C11.5899 14.5 14.5 11.5899 14.5 8C14.5 4.41015 11.5899 1.5 8 1.5ZM0 8C0 3.58172 3.58172 0 8 0C12.4183 0 16 3.58172 16 8C16 12.4183 12.4183 16 8 16C3.58172 16 0 12.4183 0 8Z"],[14,"fill","#000001"],[12],[13],[1,"\\n"],[10,"path"],[14,"fill-rule","evenodd"],[14,"clip-rule","evenodd"],[14,"d","M7.25 0.75C7.25 0.335786 7.58579 0 8 0C12.4183 0 16 3.58172 16 8C16 8.41421 15.6642 8.75 15.25 8.75C14.8358 8.75 14.5 8.41421 14.5 8C14.5 4.41015 11.5899 1.5 8 1.5C7.58579 1.5 7.25 1.16421 7.25 0.75Z"],[14,"fill","#3B3D45"],[12],[13],[1,"\\n"],[13],[1,"\\n"]],[]],null]],["@state","&attrs"],false,["if","or","eq"]]',moduleName:"consul-ui/components/peerings/badge/icon/index.hbs",isStrictMode:!1}) +var i=(0,t.setComponentTemplate)(r,(0,l.default)()) +e.default=i})),define("consul-ui/components/peerings/badge/index",["exports","@ember/component","@ember/template-factory","@glimmer/component"],(function(e,t,n,l){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const r=(0,n.createTemplateFactory)({id:"Fxysa+1X",block:'[[[41,[30,1,["State"]],[[[1," "],[11,0],[16,0,[29,["peerings-badge ",[28,[37,1],[[30,1,["State"]]],null]]]],[4,[38,2],[[30,0,["tooltip"]]],null],[12],[1,"\\n "],[8,[39,3],null,[["@state"],[[29,[[30,1,["State"]]]]]],null],[1,"\\n "],[10,1],[14,0,"peerings-badge__text"],[12],[1,[28,[35,4],[[28,[37,1],[[30,1,["State"]]],null]],null]],[13],[1,"\\n "],[13],[1,"\\n"]],[]],null]],["@peering"],false,["if","lowercase","tooltip","peerings/badge/icon","capitalize"]]',moduleName:"consul-ui/components/peerings/badge/index.hbs",isStrictMode:!1}),i={ACTIVE:{tooltip:"This peer connection is currently active."},PENDING:{tooltip:"This peering connection has not been established yet."},ESTABLISHING:{tooltip:"This peering connection is in the process of being established."},FAILING:{tooltip:"This peering connection has some intermittent errors (usually network related). It will continue to retry. "},DELETING:{tooltip:"This peer is in the process of being deleted."},TERMINATED:{tooltip:"Someone in the other peer may have deleted this peering connection."},UNDEFINED:{tooltip:""}} +class o extends l.default{get styles(){const{peering:{State:e}}=this.args +return i[e]}get tooltip(){return this.styles.tooltip}}e.default=o,(0,t.setComponentTemplate)(r,o)})),define("consul-ui/components/peerings/provider/index",["exports","@ember/component","@ember/template-factory","@glimmer/component","@ember/service","@ember/application","consul-ui/components/tab-nav"],(function(e,t,n,l,r,i,o){var a,u,s +function c(e,t){var n=Object.keys(e) +if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e) +t&&(l=l.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,l)}return n}function d(e){for(var t=1;tnew o.Tab(d(d({},e),{},{currentRouteName:t.currentRouteName,owner:n}))))}},u=m(a.prototype,"router",[r.inject],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),s=m(a.prototype,"intl",[r.inject],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),a) +e.default=b,(0,t.setComponentTemplate)(h,b)})),define("consul-ui/components/policy-form/index",["exports","@ember/component","@ember/template-factory","consul-ui/components/form-component/index","@ember/object"],(function(e,t,n,l,r){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const i=(0,n.createTemplateFactory)({id:"N+FAvdR9",block:'[[[18,6,null],[1,"\\n"],[11,"fieldset"],[24,0,"policy-form"],[16,"disabled",[52,[28,[37,2],[[28,[37,3],["write policy"],[["item"],[[33,4]]]]],null],"disabled"]],[17,1],[12],[1,"\\n"],[6,[39,5],null,[["name"],["template"]],[["default","else"],[[[],[]],[[[1," "],[10,"header"],[12],[1,"\\n Policy"],[1,[52,[33,6]," or identity?",""]],[1,"\\n "],[13],[1,"\\n"],[41,[33,6],[[[1," "],[10,2],[12],[1,"\\n Identities are default policies with configurable names. They save you some time and effort you\'re using Consul for Connect features.\\n "],[13],[1,"\\n"],[1," "],[10,0],[14,"role","radiogroup"],[15,0,[52,[33,4,["error","Type"]]," has-error"]],[12],[1,"\\n"],[42,[28,[37,8],[[28,[37,8],[[33,9]],null]],null],null,[[[1," "],[10,"label"],[12],[1,"\\n "],[10,1],[12],[1,[30,2,["name"]]],[13],[1,"\\n "],[10,"input"],[15,3,[28,[37,10],[[33,11],"[template]"],null]],[15,2,[30,2,["template"]]],[15,"checked",[28,[37,12],[[33,4,["template"]],[30,2,["template"]]],null]],[15,"onchange",[28,[37,13],[[30,0],[28,[37,14],[[28,[37,15],[[33,4],"template"],null]],null]],[["value"],["target.value"]]]],[14,4,"radio"],[12],[13],[1,"\\n "],[13],[1,"\\n"]],[2]],null],[1," "],[13],[1,"\\n"]],[]],[[[1," "],[10,"input"],[15,3,[28,[37,10],[[33,11],"[template]"],null]],[14,2,""],[14,4,"hidden"],[12],[13],[1,"\\n"]],[]]]],[]]]]],[1," "],[10,"label"],[15,0,[29,["type-text",[52,[28,[37,16],[[33,4,["error","Name"]],[28,[37,2],[[33,4,["isPristine"]]],null]],null]," has-error"]]]],[12],[1,"\\n "],[10,1],[12],[1,"Name"],[13],[1,"\\n "],[10,"input"],[15,2,[33,4,["Name"]]],[15,3,[29,[[36,11],"[Name]"]]],[14,"autofocus","autofocus"],[15,"oninput",[28,[37,13],[[30,0],"change"],null]],[14,4,"text"],[12],[13],[1,"\\n "],[10,"em"],[12],[1,"\\n Maximum 128 characters. May only include letters (uppercase and/or lowercase) and/or numbers. Must be unique.\\n "],[13],[1,"\\n"],[41,[28,[37,16],[[33,4,["error","Name"]],[28,[37,2],[[33,4,["isPristine"]]],null]],null],[[[1," "],[10,"strong"],[12],[1,[33,4,["error","Name","validation"]]],[13],[1,"\\n"]],[]],null],[1," "],[13],[1,"\\n "],[10,"label"],[14,"for",""],[14,0,"type-text"],[12],[1,"\\n"],[41,[28,[37,12],[[33,4,["template"]],"service-identity"],null],[[[1," "],[8,[39,17],null,[["@readonly","@name","@syntax","@oninput"],[true,[28,[37,10],[[33,11],"[Rules]"],null],"hcl",[28,[37,13],[[30,0],"change",[28,[37,10],[[33,11],"[Rules]"],null]],null]]],[["label","content"],[[[[1,"\\n Rules "],[10,3],[15,6,[29,[[28,[37,18],["CONSUL_DOCS_URL"],null],"/guides/acl.html#rule-specification"]]],[14,"rel","help noopener noreferrer"],[14,"target","_blank"],[12],[1,"(HCL Format)"],[13],[1,"\\n "]],[]],[[[8,[39,19],null,[["@nspace","@partition","@name"],[[99,20,["@nspace"]],[99,21,["@partition"]],[33,4,["Name"]]]],null]],[]]]]],[1,"\\n"]],[]],[[[41,[28,[37,12],[[33,4,["template"]],"node-identity"],null],[[[1," "],[8,[39,17],null,[["@readonly","@name","@syntax","@oninput"],[true,[28,[37,10],[[33,11],"[Rules]"],null],"hcl",[28,[37,13],[[30,0],"change",[28,[37,10],[[33,11],"[Rules]"],null]],null]]],[["label","content"],[[[[1,"\\n Rules "],[10,3],[15,6,[29,[[28,[37,18],["CONSUL_DOCS_URL"],null],"/guides/acl.html#rule-specification"]]],[14,"rel","help noopener noreferrer"],[14,"target","_blank"],[12],[1,"(HCL Format)"],[13],[1,"\\n "]],[]],[[[8,[39,22],null,[["@name","@partition"],[[33,4,["Name"]],[99,21,["@partition"]]]],null]],[]]]]],[1,"\\n"]],[]],[[[1," "],[8,[39,17],null,[["@syntax","@class","@name","@value","@onkeyup"],["hcl",[52,[33,4,["error","Rules"]],"error"],[28,[37,10],[[33,11],"[Rules]"],null],[33,4,["Rules"]],[28,[37,13],[[30,0],"change",[28,[37,10],[[33,11],"[Rules]"],null]],null]]],[["label"],[[[[1,"\\n Rules "],[10,3],[15,6,[29,[[28,[37,18],["CONSUL_DOCS_URL"],null],"/guides/acl.html#rule-specification"]]],[14,"rel","help noopener noreferrer"],[14,"target","_blank"],[12],[1,"(HCL Format)"],[13],[1,"\\n "]],[]]]]],[1,"\\n"],[41,[33,4,["error","Rules"]],[[[1," "],[10,"strong"],[12],[1,[33,4,["error","Rules","validation"]]],[13],[1,"\\n"]],[]],null]],[]]]],[]]],[1," "],[13],[1,"\\n"],[41,[28,[37,12],[[33,4,["template"]],"node-identity"],null],[[[1,"\\n "],[8,[39,23],null,[["@src","@onchange"],[[28,[37,24],["/*/*/*/datacenters"],null],[28,[37,13],[[30,0],[28,[37,25],[[33,26]],null]],[["value"],["data"]]]]],null],[1,"\\n "],[10,"label"],[14,0,"type-select"],[12],[1,"\\n "],[10,1],[12],[1,"Datacenter"],[13],[1,"\\n "],[8,[39,27],null,[["@options","@searchField","@selected","@searchPlaceholder","@onChange"],[[28,[37,28],["Name",[33,26]],null],"Name",[28,[37,29],[[33,4,["Datacenter"]],[33,30]],null],"Type a datacenter name",[28,[37,13],[[30,0],"change","Datacenter"],null]]],[["default"],[[[[1,"\\n "],[1,[30,3]],[1,"\\n "]],[3]]]]],[1,"\\n "],[13],[1,"\\n"]],[]],[[[41,[28,[37,12],[[28,[37,29],[[33,21],"default"],null],"default"],null],[[[1," "],[10,0],[14,0,"type-toggle"],[12],[1,"\\n "],[10,1],[12],[1,"Valid datacenters"],[13],[1,"\\n "],[10,"label"],[12],[1,"\\n "],[10,"input"],[15,3,[29,[[36,11],"[isScoped]"]]],[15,"checked",[52,[28,[37,2],[[33,31]],null],"checked"]],[15,"onchange",[28,[37,13],[[30,0],"change"],null]],[14,4,"checkbox"],[12],[13],[1,"\\n "],[10,1],[12],[1,"All"],[13],[1,"\\n "],[13],[1,"\\n "],[13],[1,"\\n"]],[]],null],[41,[33,31],[[[1," "],[8,[39,23],null,[["@src","@onchange"],[[28,[37,24],["/*/*/*/datacenters"],null],[28,[37,13],[[30,0],[28,[37,25],[[33,26]],null]],[["value"],["data"]]]]],null],[1,"\\n\\n "],[10,0],[14,0,"checkbox-group"],[14,"role","group"],[12],[1,"\\n"],[42,[28,[37,8],[[28,[37,8],[[33,26]],null]],null],null,[[[1," "],[10,"label"],[14,0,"type-checkbox"],[12],[1,"\\n "],[10,"input"],[15,3,[29,[[36,11],"[Datacenters]"]]],[15,2,[30,4,["Name"]]],[15,"checked",[52,[28,[37,32],[[30,4,["Name"]],[33,4,["Datacenters"]]],null],"checked"]],[15,"onchange",[28,[37,13],[[30,0],"change"],null]],[14,4,"checkbox"],[12],[13],[1,"\\n "],[10,1],[12],[1,[30,4,["Name"]]],[13],[1,"\\n "],[13],[1,"\\n"]],[4]],null],[42,[28,[37,8],[[28,[37,8],[[33,4,["Datacenters"]]],null]],null],null,[[[41,[28,[37,2],[[28,[37,33],["Name",[30,5],[33,26]],null]],null],[[[1," "],[10,"label"],[14,0,"type-checkbox"],[12],[1,"\\n "],[10,"input"],[15,3,[29,[[36,11],"[Datacenters]"]]],[15,2,[30,5]],[14,"checked","checked"],[15,"onchange",[28,[37,13],[[30,0],"change"],null]],[14,4,"checkbox"],[12],[13],[1,"\\n "],[10,1],[12],[1,[30,5]],[13],[1,"\\n "],[13],[1,"\\n"]],[]],null]],[5]],null],[1," "],[13],[1,"\\n\\n\\n"]],[]],null]],[]]],[41,[28,[37,12],[[33,4,["template"]],""],null],[[[1," "],[10,"label"],[14,0,"type-text"],[12],[1,"\\n "],[10,1],[12],[1,"Description (Optional)"],[13],[1,"\\n "],[10,"textarea"],[15,3,[29,[[36,11],"[Description]"]]],[15,2,[33,4,["Description"]]],[15,"oninput",[28,[37,13],[[30,0],"change"],null]],[12],[13],[1,"\\n "],[13],[1,"\\n"]],[]],null],[13],[1,"\\n\\n"]],["&attrs","template","Name","dc","dc","&default"],false,["yield","if","not","can","item","yield-slot","allowIdentity","each","-track-array","templates","concat","name","eq","action","optional","changeset-set","and","code-editor","env","consul/service-identity/template","nspace","partition","consul/node-identity/template","data-source","uri","mut","datacenters","power-select","map-by","or","dc","isScoped","includes","find-by"]]',moduleName:"consul-ui/components/policy-form/index.hbs",isStrictMode:!1}) +var o=(0,t.setComponentTemplate)(i,l.default.extend({type:"policy",name:"policy",allowIdentity:!0,classNames:["policy-form"],isScoped:!1,init:function(){this._super(...arguments),(0,r.set)(this,"isScoped",(0,r.get)(this,"item.Datacenters.length")>0),this.templates=[{name:"Policy",template:""},{name:"Service Identity",template:"service-identity"},{name:"Node Identity",template:"node-identity"}]},actions:{change:function(e){try{this._super(...arguments)}catch(t){const e=this.isScoped +if("policy[isScoped]"===t.target.name)e?((0,r.set)(this,"previousDatacenters",(0,r.get)(this.item,"Datacenters")),(0,r.set)(this.item,"Datacenters",null)):((0,r.set)(this.item,"Datacenters",this.previousDatacenters),(0,r.set)(this,"previousDatacenters",null)),(0,r.set)(this,"isScoped",!e) +else this.onerror(t) +this.onchange({target:this.form})}}}})) +e.default=o})),define("consul-ui/components/policy-selector/index",["exports","@ember/component","@ember/template-factory","consul-ui/components/child-selector/index","@ember/object","@ember/service"],(function(e,t,n,l,r,i){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const o=(0,n.createTemplateFactory)({id:"7xWCYtBV",block:'[[[8,[39,0],[[17,1]],[["@disabled","@repo","@dc","@partition","@nspace","@type","@placeholder","@items"],[[99,1,["@disabled"]],[99,2,["@repo"]],[99,3,["@dc"]],[99,4,["@partition"]],[99,5,["@nspace"]],"policy","Search for policy",[99,6,["@items"]]]],[["default"],[[[[1,"\\n "],[18,11,null],[1,"\\n "],[8,[39,8],null,[["@name"],["label"]],[["default"],[[[[1,"\\n Apply an existing policy\\n "]],[]]]]],[1,"\\n "],[8,[39,8],null,[["@name"],["create"]],[["default"],[[[[1,"\\n"],[6,[39,9],null,[["name"],["trigger"]],[["default","else"],[[[[1," "],[18,11,null],[1,"\\n"]],[]],[[[1," "],[8,[39,10],[[24,0,"type-dialog"],[4,[38,11],["click",[28,[37,12],[[30,0],[30,0,["openModal"]]],null]],null]],[["@text","@size","@color","@icon"],["Create new policy","small","tertiary","plus"]],null],[1,"\\n"],[1," "],[8,[39,13],[[24,1,"new-policy"]],[["@onopen","@aria"],[[28,[37,12],[[30,0],"open"],null],[28,[37,14],null,[["label"],["New Policy"]]]]],[["default"],[[[[1,"\\n "],[8,[39,15],null,[["@target","@name","@value"],[[30,0],"modal",[30,2]]],null],[1,"\\n "],[8,[39,8],null,[["@name"],["header"]],[["default"],[[[[1,"\\n "],[10,"h2"],[12],[1,"New Policy"],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,8],null,[["@name"],["body"]],[["default"],[[[[1,"\\n "],[8,[39,16],null,[["@form","@nspace","@partition","@dc","@allowServiceIdentity"],[[99,17,["@form"]],[99,5,["@nspace"]],[99,4,["@partition"]],[99,3,["@dc"]],[99,18,["@allowServiceIdentity"]]]],null],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,8],null,[["@name"],["actions"]],[["default"],[[[[1,"\\n "],[8,[39,19],null,null,[["default"],[[[[1,"\\n "],[8,[39,10],[[16,"onclick",[28,[37,20],[[30,0,["save"]],[33,21],[33,6],[28,[37,22],[[28,[37,12],[[30,0],[30,3]],null],[28,[37,12],[[30,0],"reset"],null]],null]],null]],[16,"disabled",[52,[28,[37,24],[[33,21,["isSaving"]],[33,21,["isPristine"]],[33,21,["isInvalid"]]],null],"disabled"]],[24,4,"submit"]],[["@isLoading","@text"],[[33,21,["isSaving"]],"Create and apply"]],null],[1,"\\n "],[8,[39,10],[[16,"disabled",[52,[33,21,["isSaving"]],"disabled"]],[24,4,"reset"],[4,[38,11],["click",[28,[37,12],[[30,0],[28,[37,22],[[28,[37,12],[[30,0],[30,3]],null],[28,[37,12],[[30,0],"reset"],null]],null]],null]],null]],[["@color","@text"],["secondary","Cancel"]],null],[1,"\\n "]],[]]]]],[1,"\\n "]],[3]]]]],[1,"\\n "]],[2]]]]],[1,"\\n"]],[]]]]],[1," "]],[]]]]],[1,"\\n "],[8,[39,8],null,[["@name"],["option"]],[["default"],[[[[1,"\\n "],[1,[30,4,["Name"]]],[1,"\\n "]],[4]]]]],[1,"\\n "],[8,[39,8],null,[["@name"],["set"]],[["default"],[[[[1,"\\n "],[8,[39,25],null,[["@onchange","@items"],[[28,[37,12],[[30,0],"open"],null],[28,[37,26],["CreateTime:desc","Name:asc",[33,6]],null]]],[["default"],[[[[1,"\\n "],[8,[39,8],null,[["@name"],["header"]],[["default"],[[[[1,"\\n "],[10,"th"],[12],[1,"Name"],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,8],null,[["@name"],["row"]],[["default"],[[[[1,"\\n "],[10,"td"],[15,0,[28,[37,27],[[30,5]],null]],[12],[1,"\\n"],[41,[30,5,["ID"]],[[[1," "],[10,3],[15,6,[28,[37,28],["dc.acls.policies.edit",[30,5,["ID"]]],null]],[12],[1,[30,5,["Name"]]],[13],[1,"\\n"]],[]],[[[1," "],[10,3],[15,3,[30,5,["Name"]]],[12],[1,[30,5,["Name"]]],[13],[1,"\\n"]],[]]],[1," "],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,8],null,[["@name"],["details"]],[["default"],[[[[1,"\\n"],[41,[28,[37,29],[[30,5,["template"]],""],null],[[[1," "],[8,[39,30],null,[["@src","@onchange","@loading"],[[28,[37,31],["/${partition}/${nspace}/${dc}/policy/${id}",[28,[37,14],null,[["partition","nspace","dc","id"],[[33,4],[33,5],[33,3],[30,5,["ID"]]]]]],null],[28,[37,12],[[30,0],[28,[37,32],[[33,33]],null]],[["value"],["data"]]],"lazy"]],null],[1,"\\n"]],[]],null],[41,[28,[37,29],[[30,5,["template"]],"node-identity"],null],[[[1," "],[10,"dl"],[12],[1,"\\n "],[10,"dt"],[12],[1,"Datacenter:"],[13],[1,"\\n "],[10,"dd"],[12],[1,"\\n "],[1,[30,5,["Datacenter"]]],[1,"\\n "],[13],[1,"\\n "],[13],[1,"\\n"]],[]],[[[1," "],[10,"dl"],[12],[1,"\\n "],[10,"dt"],[12],[1,"Datacenters:"],[13],[1,"\\n "],[10,"dd"],[12],[1,"\\n "],[1,[28,[35,34],[", ",[28,[37,35],[[28,[37,24],[[33,33],[30,5]],null]],null]],null]],[1,"\\n "],[13],[1,"\\n "],[13],[1,"\\n"]],[]]],[1," "],[10,"label"],[14,0,"type-text"],[12],[1,"\\n"],[41,[28,[37,29],[[30,5,["template"]],"service-identity"],null],[[[1," "],[8,[39,36],null,[["@syntax","@readonly"],["hcl",true]],[["label","content"],[[[[1,"\\n Rules "],[10,3],[15,6,[29,[[28,[37,37],["CONSUL_DOCS_URL"],null],"/guides/acl.html#rule-specification"]]],[14,"rel","help noopener noreferrer"],[14,"target","_blank"],[12],[1,"(HCL Format)"],[13],[1,"\\n "]],[]],[[[1,"\\n "],[8,[39,38],null,[["@nspace","@partition","@name"],[[99,5,["@nspace"]],[99,4,["@partition"]],[30,5,["Name"]]]],null],[1,"\\n "]],[]]]]],[1,"\\n"]],[]],[[[41,[28,[37,29],[[30,5,["template"]],"node-identity"],null],[[[1," "],[8,[39,36],null,[["@syntax","@readonly"],["hcl",true]],[["label","content"],[[[[1,"\\n Rules "],[10,3],[15,6,[29,[[28,[37,37],["CONSUL_DOCS_URL"],null],"/guides/acl.html#rule-specification"]]],[14,"rel","help noopener noreferrer"],[14,"target","_blank"],[12],[1,"(HCL Format)"],[13],[1,"\\n "]],[]],[[[1,"\\n "],[8,[39,39],null,[["@name","@partition"],[[30,5,["Name"]],[99,4,["@partition"]]]],null],[1,"\\n "]],[]]]]],[1,"\\n"]],[]],[[[1," "],[8,[39,36],null,[["@syntax","@readonly","@value"],["hcl",true,[28,[37,24],[[33,33,["Rules"]],[30,5,["Rules"]]],null]]],[["label"],[[[[1,"\\n Rules "],[10,3],[15,6,[29,[[28,[37,37],["CONSUL_DOCS_URL"],null],"/guides/acl.html#rule-specification"]]],[14,"rel","help noopener noreferrer"],[14,"target","_blank"],[12],[1,"(HCL Format)"],[13],[1,"\\n "]],[]]]]],[1,"\\n"]],[]]]],[]]],[1," "],[13],[1,"\\n"],[41,[28,[37,40],[[33,1]],null],[[[1," "],[10,0],[12],[1,"\\n "],[8,[39,41],null,[["@message"],["Are you sure you want to remove this policy from this token?"]],[["default"],[[[[1,"\\n "],[8,[39,8],null,[["@name"],["action"]],[["default"],[[[[1,"\\n "],[8,[39,10],[[4,[38,12],[[30,0],[30,7],"remove",[30,5],[33,6]],null]],[["@text","@color","@size"],["Remove","critical","small"]],null],[1,"\\n "]],[7]]]]],[1,"\\n "],[8,[39,8],null,[["@name"],["dialog"]],[["default"],[[[[1,"\\n "],[10,2],[12],[1,"\\n "],[1,[30,10]],[1,"\\n "],[13],[1,"\\n "],[8,[39,19],null,null,[["default"],[[[[1,"\\n "],[8,[39,10],[[4,[38,12],[[30,0],[30,8]],null]],[["@text","@color","@size"],["Confirm remove","critical","small"]],null],[1,"\\n "],[8,[39,10],[[4,[38,12],[[30,0],[30,9]],null]],[["@text","@color","@size"],["Cancel","secondary","small"]],null],[1,"\\n "]],[]]]]],[1,"\\n "]],[8,9,10]]]]],[1,"\\n "]],[]]]]],[1,"\\n "],[13],[1,"\\n"]],[]],null],[1," "]],[]]]]],[1,"\\n "]],[5,6]]]]],[1,"\\n\\n "]],[]]]]],[1,"\\n"]],[]]]]],[1,"\\n"]],["&attrs","modal","close","option","item","index","confirm","execute","cancel","message","&default"],false,["child-selector","disabled","repo","dc","partition","nspace","items","yield","block-slot","yield-slot","hds/button","on","action","modal-dialog","hash","ref","policy-form","form","allowServiceIdentity","hds/button-set","perform","item","queue","if","or","tabular-details","sort-by","policy/typeof","href-to","eq","data-source","uri","mut","loadedItem","join","policy/datacenters","code-editor","env","consul/service-identity/template","consul/node-identity/template","not","confirmation-dialog"]]',moduleName:"consul-ui/components/policy-selector/index.hbs",isStrictMode:!1}),a="Invalid Policy: A Policy with Name" +var u=(0,t.setComponentTemplate)(o,l.default.extend({repo:(0,i.inject)("repository/policy"),name:"policy",type:"policy",allowIdentity:!0,classNames:["policy-selector"],init:function(){this._super(...arguments) +const e=this.source +e&&this._listeners.add(e,{save:e=>{this.save.perform(...e.data)}})},reset:function(e){this._super(...arguments),(0,r.set)(this,"isScoped",!1)},refreshCodeEditor:function(e,t){this.dom.component(".code-editor",t).didAppear()},error:function(e){const t=this.item,n=e.error +if(void 0===n.errors)throw n +{const e=n.errors[0] +let l="Rules",r=e.detail +switch(!0){case 0===r.indexOf("Failed to parse ACL rules"):case 0===r.indexOf("Invalid service policy"):l="Rules",r=e.detail +break +case 0===r.indexOf(a):l="Name",r=r.substr(a.indexOf(":")+1)}l&&t.addError(l,r)}},openModal:function(){const{modal:e}=this +e&&e.open()},actions:{open:function(e){this.refreshCodeEditor(e,e.target.parentElement)}}})) +e.default=u})),define("consul-ui/components/popover-menu/index",["exports","@ember/component","@ember/template-factory","@ember/service","block-slots","@ember/object"],(function(e,t,n,l,r,i){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const o=(0,n.createTemplateFactory)({id:"yEAcBvbt",block:'[[[18,11,null],[1,"\\n"],[11,0],[24,0,"popover-menu"],[17,1],[12],[1,"\\n "],[8,[39,1],null,[["@keyboardAccess"],[[99,2,["@keyboardAccess"]]]],[["default"],[[[[1,"\\n\\n"],[44,[[28,[37,4],null,[["MenuItem","MenuSeparator"],[[50,"popover-menu/menu-item",0,null,[["menu"],[[28,[37,4],null,[["addSubmenu","removeSubmenu","confirm","clickTrigger","keypressClick"],[[28,[37,6],[[30,0],"addSubmenu"],null],[28,[37,6],[[30,0],"removeSubmenu"],null],[28,[37,7],["popover-menu-",[33,8],"-"],null],[30,0,["toggle","click"]],[30,4]]]]]]],[50,"popover-menu/menu-separator",0,null,null]]]]],[[[44,[[28,[37,4],null,[["toggle"],[[30,0,["toggle","click"]]]]]],[[[1,"\\n "],[8,[39,9],null,[["@checked","@onchange"],[[52,[33,2],[30,5,["expanded"]],[33,11]],[28,[37,12],[[30,2],[28,[37,6],[[30,0],"change"],null]],null]]],[["default"],[[[[1,"\\n "],[8,[39,13],null,[["@target","@name","@value"],[[30,0],"toggle",[30,8]]],null],[1,"\\n "],[10,"button"],[14,"aria-haspopup","menu"],[15,"onkeydown",[30,3]],[15,"onclick",[30,0,["toggle","click"]]],[15,1,[30,5,["labelledBy"]]],[15,"aria-controls",[30,5,["controls"]]],[14,4,"button"],[12],[1,"\\n "],[8,[39,14],null,[["@name"],["trigger"]],[["default"],[[[[1,"\\n "],[18,11,[[30,6],[30,7]]],[1,"\\n "]],[]]]]],[1,"\\n "],[13],[1,"\\n "]],[8]]]]],[1,"\\n\\n "],[8,[39,15],[[16,1,[30,5,["controls"]]],[16,"aria-labelledby",[30,5,["labelledBy"]]],[16,"aria-expanded",[30,5,["expanded"]]]],[["@position"],[[99,16,["@position"]]]],[["default"],[[[[1,"\\n "],[8,[39,13],null,[["@target","@name","@value"],[[30,0],"menu",[30,9]]],null],[1,"\\n "],[8,[39,17],null,[["@name"],["controls"]],[["default"],[[[[1,"\\n "],[10,"input"],[15,1,[28,[37,7],["popover-menu-",[33,8],"-"],null]],[14,4,"checkbox"],[12],[13],[1,"\\n"],[42,[28,[37,19],[[28,[37,19],[[33,20]],null]],null],null,[[[1," "],[10,"input"],[15,1,[28,[37,7],["popover-menu-",[33,8],"-",[30,10]],null]],[15,"onchange",[30,9,["change"]]],[14,4,"checkbox"],[12],[13],[1,"\\n"]],[10]],null],[1," "]],[]]]]],[1,"\\n"],[41,[33,21],[[[1," "],[8,[39,17],null,[["@name"],["header"]],[["default"],[[[[1,"\\n "],[18,11,[[30,6],[30,7]]],[1,"\\n "],[6,[39,14],null,[["name"],["header"]],[["default","else"],[[[],[]],[[],[]]]]],[1,"\\n "]],[]]]]],[1,"\\n"]],[]],null],[1," "],[8,[39,17],null,[["@name"],["menu"]],[["default"],[[[[1,"\\n "],[8,[39,14],null,[["@name","@params"],["menu",[28,[37,22],[[28,[37,7],["popover-menu-",[33,8],"-"],null],[33,23],[30,4],[30,0,["toggle","click"]]],null]]],[["default"],[[[[1,"\\n "],[18,11,[[30,6],[30,7]]],[1,"\\n "]],[]]]]],[1,"\\n "]],[]]]]],[1,"\\n "]],[9]]]]],[1,"\\n\\n"]],[7]]]],[6]]],[1,"\\n "]],[2,3,4,5]]]]],[1,"\\n"],[13]],["&attrs","change","keypress","keypressClick","aria","components","api","toggle","menu","sub","&default"],false,["yield","aria-menu","keyboardAccess","let","hash","component","action","concat","guid","toggle-button","if","expanded","queue","ref","yield-slot","menu-panel","position","block-slot","each","-track-array","submenus","hasHeader","block-params","send"]]',moduleName:"consul-ui/components/popover-menu/index.hbs",isStrictMode:!1}) +var a=(0,t.setComponentTemplate)(o,t.default.extend(r.default,{tagName:"",dom:(0,l.inject)("dom"),expanded:!1,keyboardAccess:!0,onchange:function(){},position:"",init:function(){this._super(...arguments),this.guid=this.dom.guid(this),this.submenus=[]},willRender:function(){(0,i.set)(this,"hasHeader",this._isRegistered("header"))},actions:{addSubmenu:function(e){(0,i.set)(this,"submenus",this.submenus.concat(e))},removeSubmenu:function(e){const t=this.submenus.indexOf(e);-1!==t&&(this.submenus.splice(t,1),(0,i.set)(this,"submenus",this.submenus))},change:function(e){e.target.checked||[...this.dom.elements(`[id^=popover-menu-${this.guid}]`)].forEach((function(e){e.checked=!1})),this.onchange(e)},send:function(){this.sendAction(...arguments)}}})) +e.default=a})),define("consul-ui/components/popover-menu/menu-item/index",["exports","@ember/component","@ember/template-factory","@ember/service","@ember/object","block-slots"],(function(e,t,n,l,r,i){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const o=(0,n.createTemplateFactory)({id:"2GW+NBsb",block:'[[[18,3,null],[1,"\\n"],[11,"li"],[24,"role","none"],[17,1],[12],[1,"\\n"],[41,[33,2],[[[1," "],[10,"label"],[15,"for",[28,[37,3],[[33,4,["confirm"]],[33,5]],null]],[14,"role","menuitem"],[14,"tabindex","-1"],[15,"onkeypress",[33,4,["keypressClick"]]],[12],[1,"\\n "],[8,[39,6],null,[["@name"],["label"]],[["default"],[[[[18,3,null]],[]]]]],[1,"\\n "],[13],[1,"\\n "],[10,0],[14,"role","menu"],[12],[1,"\\n "],[8,[39,6],null,[["@name","@params"],["confirmation",[28,[37,7],[[50,"confirmation-alert",0,null,[["onclick","name"],[[28,[37,9],[[28,[37,10],[[30,0],[33,4,["clickTrigger"]]],null],[28,[37,10],[[30,0],[33,11]],null]],null],[28,[37,3],[[33,4,["confirm"]],[33,5]],null]]]]],null]]],[["default"],[[[[18,3,null]],[]]]]],[1,"\\n "],[13],[1,"\\n"]],[]],[[[41,[33,12],[[[44,[[28,[37,14],[[33,12],"://"],null]],[[[1," "],[10,3],[14,"role","menuitem"],[14,"tabindex","-1"],[15,"onclick",[28,[37,10],[[30,0],[33,4,["clickTrigger"]]],null]],[15,6,[36,12]],[15,"target",[52,[30,2],"_blank"]],[15,"rel",[52,[30,2],"noopener noreferrer"]],[12],[1,"\\n "],[8,[39,6],null,[["@name"],["label"]],[["default"],[[[[1,"\\n "],[18,3,null],[1,"\\n "]],[]]]]],[1,"\\n "],[13],[1,"\\n"]],[2]]]],[]],[[[10,"button"],[14,"role","menuitem"],[15,"aria-selected",[52,[33,15],"true"]],[14,"tabindex","-1"],[15,"onclick",[28,[37,9],[[28,[37,10],[[30,0],[28,[37,16],[[30,0,["onclick"]],[28,[37,17],null,null]],null]],null],[28,[37,10],[[30,0],[52,[30,0,["close"]],[33,4,["clickTrigger"]],[28,[37,17],null,null]]],null]],null]],[14,4,"button"],[12],[1,"\\n "],[8,[39,6],null,[["@name"],["label"]],[["default"],[[[[1,"\\n "],[18,3,null],[1,"\\n "]],[]]]]],[1,"\\n "],[13],[1,"\\n"]],[]]]],[]]],[13],[1,"\\n\\n"]],["&attrs","external","&default"],false,["yield","if","hasConfirmation","concat","menu","guid","yield-slot","block-params","component","queue","action","onclick","href","let","string-includes","selected","or","noop"]]',moduleName:"consul-ui/components/popover-menu/menu-item/index.hbs",isStrictMode:!1}) +var a=(0,t.setComponentTemplate)(o,t.default.extend(i.default,{tagName:"",dom:(0,l.inject)("dom"),init:function(){this._super(...arguments),this.guid=this.dom.guid(this)},didInsertElement:function(){this._super(...arguments),this.menu.addSubmenu(this.guid)},didDestroyElement:function(){this._super(...arguments),this.menu.removeSubmenu(this.guid)},willRender:function(){this._super(...arguments),(0,r.set)(this,"hasConfirmation",this._isRegistered("confirmation"))}})) +e.default=a})),define("consul-ui/components/popover-menu/menu-separator/index",["exports","@ember/component","@ember/template-factory","block-slots"],(function(e,t,n,l){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const r=(0,n.createTemplateFactory)({id:"n5s/eW+J",block:'[[[18,1,null],[1,"\\n"],[10,"li"],[14,"role","separator"],[12],[1,"\\n "],[8,[39,1],null,[["@name"],["label"]],[["default"],[[[[18,1,null]],[]]]]],[1,"\\n"],[13],[1,"\\n"]],["&default"],false,["yield","yield-slot"]]',moduleName:"consul-ui/components/popover-menu/menu-separator/index.hbs",isStrictMode:!1}) +var i=(0,t.setComponentTemplate)(r,t.default.extend(l.default,{tagName:""})) +e.default=i})),define("consul-ui/components/popover-select/index",["exports","@ember/component","@ember/template-factory","@ember/service","block-slots"],(function(e,t,n,l,r){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const i=(0,n.createTemplateFactory)({id:"MCbyGl1m",block:'[[[8,[39,0],[[24,0,"popover-select"],[17,1]],[["@position"],[[28,[37,1],[[33,2],"left"],null]]],[["default"],[[[[1,"\\n "],[18,6,null],[1,"\\n"],[44,[[50,"popover-select/optgroup",0,null,[["components"],[[30,2]]]],[50,"popover-select/option",0,null,[["select","components","onclick"],[[30,0],[30,2],[28,[37,6],[[28,[37,7],[[30,0],"click"],null],[52,[33,9],[28,[37,10],null,null],[30,3,["toggle"]]]],null]]]]],[[[1," "],[8,[39,11],null,[["@name"],["trigger"]],[["default"],[[[[1,"\\n "],[8,[39,12],null,[["@name"],["selected"]],[["default"],[[[[1,"\\n "],[18,6,[[28,[37,13],null,[["Optgroup","Option"],[[30,4],[30,5]]]]]],[1,"\\n "]],[]]]]],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,11],null,[["@name"],["menu"]],[["default"],[[[[1,"\\n "],[8,[39,12],null,[["@name"],["options"]],[["default"],[[[[1,"\\n "],[18,6,[[28,[37,13],null,[["Optgroup","Option"],[[30,4],[30,5]]]]]],[1,"\\n "]],[]]]]],[1,"\\n "]],[]]]]],[1,"\\n"]],[4,5]]]],[2,3]]]]],[1,"\\n"]],["&attrs","components","menu","Optgroup","Option","&default"],false,["popover-menu","or","position","yield","let","component","pipe","action","if","multiple","noop","block-slot","yield-slot","hash"]]',moduleName:"consul-ui/components/popover-select/index.hbs",isStrictMode:!1}) +var o=(0,t.setComponentTemplate)(i,t.default.extend(r.default,{tagName:"",dom:(0,l.inject)("dom"),multiple:!1,required:!1,onchange:function(){},addOption:function(e){void 0===this._options&&(this._options=new Set),this._options.add(e)},removeOption:function(e){this._options.delete(e)},actions:{click:function(e,t){if(this.multiple){if(e.selected&&this.required){if(![...this._options].find((t=>t!==e&&t.selected)))return t}}else{if(e.selected&&this.required)return t;[...this._options].filter((t=>t!==e)).forEach((e=>{e.selected=!1}))}return e.selected=!e.selected,this.onchange(this.dom.setEventTargetProperties(t,{selected:t=>e.args.value,selectedItems:e=>[...this._options].filter((e=>e.selected)).map((e=>e.args.value)).join(",")})),t}}})) +e.default=o})),define("consul-ui/components/popover-select/optgroup/index",["exports","@ember/component","@ember/template-factory","@ember/component/template-only"],(function(e,t,n,l){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const r=(0,n.createTemplateFactory)({id:"GuHT6dz2",block:'[[[44,[[30,1,["MenuSeparator"]]],[[[8,[30,2],null,null,[["default"],[[[[1,"\\n "],[8,[39,1],null,[["@name"],["label"]],[["default"],[[[[1,"\\n "],[1,[30,3]],[1,"\\n "]],[]]]]],[1,"\\n"]],[]]]]],[1,"\\n"],[18,4,null],[1,"\\n"]],[2]]]],["@components","MenuSeparator","@label","&default"],false,["let","block-slot","yield"]]',moduleName:"consul-ui/components/popover-select/optgroup/index.hbs",isStrictMode:!1}) +var i=(0,t.setComponentTemplate)(r,(0,l.default)()) +e.default=i})),define("consul-ui/components/popover-select/option/index",["exports","@ember/component","@ember/template-factory","@glimmer/component","@glimmer/tracking","@ember/object"],(function(e,t,n,l,r,i){var o,a +function u(e,t,n,l,r){var i={} +return Object.keys(l).forEach((function(e){i[e]=l[e]})),i.enumerable=!!i.enumerable,i.configurable=!!i.configurable,("value"in i||i.initializer)&&(i.writable=!0),i=n.slice().reverse().reduce((function(n,l){return l(e,t,n)||n}),i),r&&void 0!==i.initializer&&(i.value=i.initializer?i.initializer.call(r):void 0,i.initializer=void 0),void 0===i.initializer&&(Object.defineProperty(e,t,i),i=null),i}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const s=(0,n.createTemplateFactory)({id:"gE0Zhut+",block:'[[[44,[[30,1,["MenuItem"]]],[[[1," "],[8,[30,2],[[16,0,[52,[30,0,["selected"]],"is-active"]],[17,3],[4,[38,3],[[30,0,["connect"]]],null],[4,[38,3],[[28,[37,4],[[30,0],"selected",[30,5]],null]],null],[4,[38,5],[[28,[37,4],[[30,0],"selected",[30,5]],null]],null],[4,[38,6],[[30,0,["disconnect"]]],null]],[["@onclick","@selected"],[[28,[37,2],[[30,0],[30,4],[30,0]],null],[30,0,["selected"]]]],[["default"],[[[[1,"\\n "],[8,[39,7],null,[["@name"],["label"]],[["default"],[[[[1,"\\n "],[18,6,null],[1,"\\n "]],[]]]]],[1,"\\n "]],[]]]]],[1,"\\n"]],[2]]]],["@components","MenuItem","&attrs","@onclick","@selected","&default"],false,["let","if","action","did-insert","set","did-update","will-destroy","block-slot","yield"]]',moduleName:"consul-ui/components/popover-select/option/index.hbs",isStrictMode:!1}) +let c=(o=class extends l.default{constructor(){var e,t,n,l +super(...arguments),e=this,t="selected",l=this,(n=a)&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(l):void 0})}connect(){this.args.select.addOption(this)}disconnect(){this.args.select.removeOption(this)}},a=u(o.prototype,"selected",[r.tracked],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),u(o.prototype,"connect",[i.action],Object.getOwnPropertyDescriptor(o.prototype,"connect"),o.prototype),u(o.prototype,"disconnect",[i.action],Object.getOwnPropertyDescriptor(o.prototype,"disconnect"),o.prototype),o) +e.default=c,(0,t.setComponentTemplate)(s,c)})),define("consul-ui/components/portal-target",["exports","ember-stargate/components/portal-target"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/components/portal",["exports","ember-stargate/components/portal"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/components/power-select-multiple-with-create",["exports","ember-power-select-with-create/components/power-select-multiple-with-create"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})) +define("consul-ui/components/power-select-multiple",["exports","ember-power-select/components/power-select-multiple"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/components/power-select-multiple/trigger",["exports","ember-power-select/components/power-select-multiple/trigger"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/components/power-select-with-create",["exports","ember-power-select-with-create/components/power-select-with-create"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/components/power-select-with-create/suggested-option",["exports","ember-power-select-with-create/components/power-select-with-create/suggested-option"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/components/power-select",["exports","ember-power-select/components/power-select"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/components/power-select/before-options",["exports","ember-power-select/components/power-select/before-options"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/components/power-select/no-matches-message",["exports","ember-power-select/components/power-select/no-matches-message"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/components/power-select/options",["exports","ember-power-select/components/power-select/options"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/components/power-select/placeholder",["exports","ember-power-select/components/power-select/placeholder"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/components/power-select/power-select-group",["exports","ember-power-select/components/power-select/power-select-group"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/components/power-select/search-message",["exports","ember-power-select/components/power-select/search-message"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/components/power-select/trigger",["exports","ember-power-select/components/power-select/trigger"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/components/progress/index",["exports","@ember/component","@ember/template-factory","@ember/component/template-only"],(function(e,t,n,l){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const r=(0,n.createTemplateFactory)({id:"0deDvA3Z",block:'[[[11,0],[24,0,"progress indeterminate"],[24,"role","progressbar"],[17,1],[12],[13],[1,"\\n"]],["&attrs"],false,[]]',moduleName:"consul-ui/components/progress/index.hbs",isStrictMode:!1}) +var i=(0,t.setComponentTemplate)(r,(0,l.default)()) +e.default=i})),define("consul-ui/components/providers/dimension/index",["exports","@ember/component","@ember/template-factory","@glimmer/component","@glimmer/tracking","@ember/object","ember-ref-bucket","@ember/template"],(function(e,t,n,l,r,i,o,a){var u,s,c,d +function p(e,t,n,l){n&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(l):void 0})}function f(e,t,n,l,r){var i={} +return Object.keys(l).forEach((function(e){i[e]=l[e]})),i.enumerable=!!i.enumerable,i.configurable=!!i.configurable,("value"in i||i.initializer)&&(i.writable=!0),i=n.slice().reverse().reduce((function(n,l){return l(e,t,n)||n}),i),r&&void 0!==i.initializer&&(i.value=i.initializer?i.initializer.call(r):void 0,i.initializer=void 0),void 0===i.initializer&&(Object.defineProperty(e,t,i),i=null),i}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const m=(0,n.createTemplateFactory)({id:"BXV/pZSO",block:'[[[11,0],[4,[38,0],["element"],[["debugName","bucket"],["create-ref",[30,0]]]],[4,[38,1],[[30,0,["measureDimensions"]]],null],[12],[1,"\\n "],[1,[28,[35,2],["resize",[30,0,["handleWindowResize"]]],null]],[1,"\\n "],[18,1,[[28,[37,4],null,[["data"],[[30,0,["data"]]]]]]],[1,"\\n"],[13]],["&default"],false,["create-ref","did-insert","on-window","yield","hash"]]',moduleName:"consul-ui/components/providers/dimension/index.hbs",isStrictMode:!1}) +let h=(u=(0,o.ref)("element"),s=class extends l.default{constructor(){super(...arguments),p(this,"element",c,this),p(this,"height",d,this)}get data(){const{height:e,fillRemainingHeightStyle:t}=this +return{height:e,fillRemainingHeightStyle:t}}get fillRemainingHeightStyle(){return(0,a.htmlSafe)(`height: ${this.height}px;`)}get bottomBoundary(){return document.querySelector(this.args.bottomBoundary)||this.footer}get footer(){return document.querySelector('footer[role="contentinfo"]')}measureDimensions(e){const t=this.bottomBoundary.getBoundingClientRect(),n=e.getBoundingClientRect() +this.height=t.top+t.height-n.top}handleWindowResize(){const{element:e}=this +this.measureDimensions(e)}},c=f(s.prototype,"element",[u],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),d=f(s.prototype,"height",[r.tracked],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),f(s.prototype,"measureDimensions",[i.action],Object.getOwnPropertyDescriptor(s.prototype,"measureDimensions"),s.prototype),f(s.prototype,"handleWindowResize",[i.action],Object.getOwnPropertyDescriptor(s.prototype,"handleWindowResize"),s.prototype),s) +e.default=h,(0,t.setComponentTemplate)(m,h)})),define("consul-ui/components/providers/search/index",["exports","@ember/component","@ember/template-factory","@glimmer/component"],(function(e,t,n,l){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const r=(0,n.createTemplateFactory)({id:"nGR80lz+",block:'[[[18,1,[[28,[37,1],null,[["data"],[[30,0,["data"]]]]]]]],["&default"],false,["yield","hash"]]',moduleName:"consul-ui/components/providers/search/index.hbs",isStrictMode:!1}) +class i extends l.default{get _search(){return this.args.search||""}get items(){const{items:e,searchProperties:t}=this.args,{_search:n}=this +return n.length>0?e.filter((e=>t.reduce(((t,l)=>{const r=-1!==e[l].indexOf(n) +return r?[...t,r]:t}),[]).length>0)):e}get data(){const{items:e}=this +return{items:e}}}e.default=i,(0,t.setComponentTemplate)(r,i)})),define("consul-ui/components/radio-card/index",["exports","@ember/component","@ember/template-factory"],(function(e,t,n){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const l=(0,n.createTemplateFactory)({id:"o/1nwT6X",block:'[[[11,"label"],[17,1],[16,0,[29,["radio-card",[52,[33,1]," checked"]]]],[12],[1,"\\n "],[10,0],[12],[1,"\\n"],[41,[28,[37,2],[[33,3,["length"]],0],null],[[[1," "],[10,"input"],[15,3,[36,4]],[15,2,[36,3]],[15,"checked",[36,1]],[15,"onchange",[28,[37,5],[[30,0],[33,6]],null]],[14,4,"radio"],[12],[13],[1,"\\n"]],[]],[[[1," "],[10,"input"],[15,3,[36,4]],[14,2,""],[15,"checked",[36,1]],[15,"onchange",[28,[37,5],[[30,0],[33,6]],null]],[14,4,"radio"],[12],[13],[1,"\\n"]],[]]],[1," "],[13],[1,"\\n "],[10,0],[12],[1,"\\n "],[18,2,null],[1,"\\n "],[13],[1,"\\n"],[13]],["&attrs","&default"],false,["if","checked","gt","value","name","action","onchange","yield"]]',moduleName:"consul-ui/components/radio-card/index.hbs",isStrictMode:!1}) +var r=(0,t.setComponentTemplate)(l,t.default.extend({tagName:""})) +e.default=r})),define("consul-ui/components/radio-group/index",["exports","@ember/component","@ember/template-factory","@ember/service"],(function(e,t,n,l){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const r=(0,n.createTemplateFactory)({id:"Ud+ETI/C",block:'[[[10,"fieldset"],[12],[1,"\\n "],[10,0],[14,"role","radiogroup"],[15,1,[29,["radiogroup_",[36,0]]]],[12],[1,"\\n"],[42,[28,[37,2],[[28,[37,2],[[33,3]],null]],null],null,[[[44,[[52,[28,[37,6],[[30,1,["key"]],[27]],null],[30,1,["key"]],[30,1,["value"]]],[28,[37,7],[[30,1,["label"]],[30,1,["value"]]],null]],[[[1," "],[10,"label"],[15,"tabindex",[52,[33,8],"0"]],[15,"onkeydown",[52,[33,8],[28,[37,9],[[30,0],"keydown"],null]]],[15,0,[29,["type-radio value-",[30,2]]]],[12],[1," "],[1,"\\n "],[10,"input"],[15,3,[36,0]],[15,2,[30,2]],[15,"checked",[52,[28,[37,10],[[28,[37,11],[[33,12]],null],[30,2]],null],"checked"]],[15,"onchange",[28,[37,9],[[30,0],"change"],null]],[14,4,"radio"],[12],[13],[1,"\\n "],[10,1],[12],[1,[30,3]],[13],[1,"\\n "],[13],[1,"\\n"]],[2,3]]]],[1]],null],[1," "],[13],[1,"\\n"],[13],[1,"\\n"]],["item","_key","_value"],false,["name","each","-track-array","items","let","if","not-eq","or","keyboardAccess","action","eq","concat","value"]]',moduleName:"consul-ui/components/radio-group/index.hbs",isStrictMode:!1}) +var i=(0,t.setComponentTemplate)(r,t.default.extend({tagName:"",keyboardAccess:!1,dom:(0,l.inject)("dom"),init:function(){this._super(...arguments),this.name=this.dom.guid(this)},actions:{keydown:function(e){13===e.keyCode&&e.target.dispatchEvent(new MouseEvent("click"))},change:function(e){this.onchange(this.dom.setEventTargetProperty(e,"value",(e=>""===e?void 0:e)))}}})) +e.default=i})),define("consul-ui/components/ref/index",["exports","@ember/component","@ember/object"],(function(e,t,n){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +var l=t.default.extend({tagName:"",didReceiveAttrs:function(){(0,n.set)(this.target,this.name,this.value)}}) +e.default=l})),define("consul-ui/components/role-form/index",["exports","@ember/component","@ember/template-factory","consul-ui/components/form-component/index"],(function(e,t,n,l){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const r=(0,n.createTemplateFactory)({id:"0/f8kKT6",block:'[[[18,2,null],[1,"\\n"],[11,"fieldset"],[24,0,"role-form"],[16,"disabled",[52,[28,[37,2],[[28,[37,3],["write role"],[["item"],[[33,4]]]]],null],"disabled"]],[17,1],[12],[1,"\\n "],[10,"label"],[15,0,[29,["type-text",[52,[33,4,["error","Name"]]," has-error"]]]],[12],[1,"\\n "],[10,1],[12],[1,"Name"],[13],[1,"\\n "],[10,"input"],[15,2,[33,4,["Name"]]],[14,3,"role[Name]"],[14,"autofocus","autofocus"],[15,"oninput",[28,[37,5],[[30,0],"change"],null]],[14,4,"text"],[12],[13],[1,"\\n "],[10,"em"],[12],[1,"\\n Maximum 256 characters. May only include letters (uppercase and/or lowercase) and/or numbers. Must be unique.\\n "],[13],[1,"\\n"],[41,[33,4,["error","Name"]],[[[1," "],[10,"strong"],[12],[1,[33,4,["error","Name","validation"]]],[13],[1,"\\n"]],[]],null],[1," "],[13],[1,"\\n "],[10,"label"],[14,0,"type-text"],[12],[1,"\\n "],[10,1],[12],[1,"Description (Optional)"],[13],[1,"\\n "],[10,"textarea"],[14,3,"role[Description]"],[15,2,[33,4,["Description"]]],[15,"oninput",[28,[37,5],[[30,0],"change"],null]],[12],[13],[1,"\\n "],[13],[1,"\\n"],[13],[1,"\\n"],[10,"fieldset"],[14,1,"policies"],[14,0,"policies"],[12],[1,"\\n "],[10,"h2"],[12],[1,"Policies"],[13],[1,"\\n"],[6,[39,6],null,[["name","params"],["policy",[28,[37,7],[[33,4]],null]]],[["default","else"],[[[[1," "],[18,2,null],[1,"\\n"]],[]],[[[1," "],[8,[39,8],null,[["@disabled","@dc","@partition","@nspace","@items"],[[28,[37,2],[[28,[37,3],["write role"],[["item"],[[33,4]]]]],null],[99,9,["@dc"]],[99,10,["@partition"]],[99,11,["@nspace"]],[33,4,["Policies"]]]],null],[1,"\\n"]],[]]]]],[13],[1,"\\n"]],["&attrs","&default"],false,["yield","if","not","can","item","action","yield-slot","block-params","policy-selector","dc","partition","nspace"]]',moduleName:"consul-ui/components/role-form/index.hbs",isStrictMode:!1}) +var i=(0,t.setComponentTemplate)(r,l.default.extend({type:"role",name:"role",classNames:["role-form"]})) +e.default=i})),define("consul-ui/components/role-selector/index",["exports","@ember/component","@ember/template-factory","consul-ui/components/child-selector/index","@ember/service","@ember/object","@ember/object/computed","consul-ui/utils/dom/event-source"],(function(e,t,n,l,r,i,o,a){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const u=(0,n.createTemplateFactory)({id:"6ZRIYR2n",block:'[[[8,[39,0],[[24,0,"role-selector"],[24,1,"new-role"]],[["@onclose","@aria"],[[28,[37,1],[[30,0],[28,[37,2],[[33,3]],null],"role"],null],[28,[37,4],null,[["label"],[[52,[28,[37,6],[[33,3],"role"],null],"New Role","New Policy"]]]]]],[["default"],[[[[1,"\\n "],[8,[39,7],null,[["@target","@name","@value"],[[30,0],"modal",[30,1]]],null],[1,"\\n "],[8,[39,8],null,[["@name"],["header"]],[["default"],[[[[1,"\\n"],[41,[28,[37,6],[[33,3],"role"],null],[[[1," "],[10,"h2"],[12],[1,"New Role"],[13],[1,"\\n"]],[]],[[[1," "],[10,"h2"],[12],[1,"New Policy"],[13],[1,"\\n"]],[]]],[1," "]],[]]]]],[1,"\\n "],[8,[39,8],null,[["@name"],["body"]],[["default"],[[[[1,"\\n\\n "],[10,"input"],[15,1,[29,[[36,9],"_state_role"]]],[15,3,[29,[[36,9],"[state]"]]],[14,2,"role"],[15,"checked",[52,[28,[37,6],[[33,3],"role"],null],"checked"]],[15,"onchange",[28,[37,1],[[30,0],"change"],null]],[14,4,"radio"],[12],[13],[1,"\\n "],[8,[39,10],null,[["@form","@dc","@nspace","@partition"],[[99,11,["@form"]],[99,12,["@dc"]],[99,13,["@nspace"]],[99,14,["@partition"]]]],[["default"],[[[[1,"\\n "],[8,[39,8],null,[["@name"],["policy"]],[["default"],[[[[1,"\\n\\n "],[8,[39,15],null,[["@source","@dc","@partition","@nspace","@items"],[[99,16,["@source"]],[99,12,["@dc"]],[99,14,["@partition"]],[99,13,["@nspace"]],[33,17,["Policies"]]]],[["default"],[[[[1,"\\n "],[8,[39,8],null,[["@name"],["trigger"]],[["default"],[[[[1,"\\n "],[8,[39,18],[[24,0,"type-dialog"],[4,[38,1],[[30,0],"triggerStateCheckboxChange"],null]],[["@text","@size","@color","@icon"],["Create new policy","small","tertiary","plus"]],null],[1,"\\n "]],[]]]]],[1,"\\n "]],[]]]]],[1,"\\n\\n "]],[]]]]],[1,"\\n "]],[]]]]],[1,"\\n\\n "],[10,"input"],[15,1,[29,[[36,9],"_state_policy"]]],[15,3,[29,[[36,9],"[state]"]]],[14,2,"policy"],[15,"checked",[52,[28,[37,6],[[33,3],"policy"],null],"checked"]],[15,"onchange",[28,[37,1],[[30,0],"change"],null]],[14,4,"radio"],[12],[13],[1,"\\n "],[8,[39,19],null,[["@name","@form","@dc","@nspace","@partition"],["role[policy]",[99,20,["@form"]],[99,12,["@dc"]],[99,13,["@nspace"]],[99,14,["@partition"]]]],null],[1,"\\n\\n "]],[]]]]],[1,"\\n "],[8,[39,8],null,[["@name"],["actions"]],[["default"],[[[[1,"\\n\\n "],[8,[39,21],null,null,[["default"],[[[[1,"\\n"],[41,[28,[37,6],[[33,3],"role"],null],[[[1," "],[8,[39,18],[[16,"onclick",[28,[37,22],[[30,0,["save"]],[33,17],[33,23],[28,[37,24],[[28,[37,1],[[30,0],[30,2]],null],[28,[37,1],[[30,0],"reset"],null]],null]],null]],[16,"disabled",[52,[28,[37,25],[[33,17,["isSaving"]],[33,17,["isPristine"]],[33,17,["isInvalid"]]],null],"disabled"]],[24,4,"submit"]],[["@text","@isLoading"],["Create and apply",[33,17,["isSaving"]]]],null],[1,"\\n "],[8,[39,18],[[16,"disabled",[52,[33,17,["isSaving"]],"disabled"]],[24,4,"reset"],[4,[38,26],["click",[28,[37,1],[[30,0],[28,[37,24],[[28,[37,1],[[30,0],[30,2]],null],[28,[37,1],[[30,0],"reset"],null]],null]],null]],null]],[["@text","@color"],["Cancel","secondary"]],null],[1,"\\n\\n"]],[]],[[[1," "],[8,[39,18],[[16,"disabled",[52,[28,[37,25],[[33,27,["isSaving"]],[33,27,["isPristine"]],[33,27,["isInvalid"]]],null],"disabled"]],[24,4,"submit"],[4,[38,1],[[30,0],"dispatch","save",[28,[37,28],[[33,27],[33,17,["Policies"]],[28,[37,1],[[30,0],[28,[37,2],[[33,3]],null],"role"],null]],null]],null]],[["@text","@isLoading"],["Create and apply",[33,27,["isSaving"]]]],null],[1,"\\n "],[8,[39,18],[[16,"disabled",[52,[33,27,["isSaving"]],"disabled"]],[24,4,"reset"],[4,[38,26],["click",[28,[37,1],[[30,0],[28,[37,2],[[33,3]],null],"role"],null]],null]],[["@text","@color"],["Cancel","secondary"]],null],[1,"\\n"]],[]]],[1," "]],[]]]]],[1,"\\n "]],[2]]]]],[1,"\\n"]],[1]]]]],[1,"\\n\\n"],[8,[39,29],null,[["@disabled","@repo","@dc","@partition","@nspace","@type","@placeholder","@items"],[[99,30,["@disabled"]],[99,31,["@repo"]],[99,12,["@dc"]],[99,14,["@partition"]],[99,13,["@nspace"]],"role","Search for role",[99,23,["@items"]]]],[["default"],[[[[1,"\\n "],[8,[39,8],null,[["@name"],["label"]],[["default"],[[[[1,"\\n Apply an existing role\\n "]],[]]]]],[1,"\\n "],[8,[39,8],null,[["@name"],["create"]],[["default"],[[[[1,"\\n "],[8,[39,18],[[24,0,"type-dialog"],[4,[38,26],["click",[28,[37,32],[[30,0,["modal","open"]]],null]],null]],[["@text","@size","@color","@icon"],["Create new role","small","tertiary","plus"]],null],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,8],null,[["@name"],["option"]],[["default"],[[[[1,"\\n "],[1,[30,3,["Name"]]],[1,"\\n "]],[3]]]]],[1,"\\n "],[8,[39,8],null,[["@name"],["set"]],[["default"],[[[[1,"\\n "],[8,[39,33],null,[["@rows","@items"],[5,[28,[37,34],["CreateTime:desc","Name:asc",[33,23]],null]]],[["default"],[[[[1,"\\n "],[8,[39,8],null,[["@name"],["header"]],[["default"],[[[[1,"\\n "],[10,"th"],[12],[1,"Name"],[13],[1,"\\n "],[10,"th"],[12],[1,"Description"],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,8],null,[["@name"],["row"]],[["default"],[[[[1,"\\n "],[10,"td"],[12],[1,"\\n "],[10,3],[15,6,[28,[37,35],["dc.acls.roles.edit",[30,4,["ID"]]],null]],[12],[1,[30,4,["Name"]]],[13],[1,"\\n "],[13],[1,"\\n "],[10,"td"],[12],[1,"\\n "],[1,[30,4,["Description"]]],[1,"\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,8],null,[["@name"],["actions"]],[["default"],[[[[1,"\\n "],[8,[39,36],null,[["@expanded","@onchange","@keyboardAccess"],[[52,[28,[37,6],[[30,8],[30,6]],null],true,false],[28,[37,1],[[30,0],[30,7],[30,6]],null],false]],[["default"],[[[[1,"\\n "],[8,[39,8],null,[["@name"],["trigger"]],[["default"],[[[[1,"\\n More\\n "]],[]]]]],[1,"\\n "],[8,[39,8],null,[["@name"],["menu"]],[["default"],[[[[1,"\\n "],[10,"li"],[14,"role","none"],[12],[1,"\\n "],[10,3],[14,"role","menuitem"],[14,"tabindex","-1"],[15,6,[28,[37,35],["dc.acls.roles.edit",[30,4,["ID"]]],null]],[12],[1,"\\n"],[41,[28,[37,37],["edit role"],[["item"],[[30,4]]]],[[[1," Edit\\n"]],[]],[[[1," View\\n"]],[]]],[1," "],[13],[1,"\\n "],[13],[1,"\\n"],[41,[28,[37,38],[[33,30]],null],[[[1," "],[10,"li"],[14,"role","none"],[14,0,"dangerous"],[12],[1,"\\n "],[10,"label"],[15,"for",[30,9]],[14,"role","menuitem"],[14,"tabindex","-1"],[15,"onkeypress",[30,11]],[12],[1,"Remove"],[13],[1,"\\n "],[10,0],[14,"role","menu"],[12],[1,"\\n "],[8,[39,39],[[24,0,"warning"]],null,[["header","body","actions"],[[[[1,"\\n Confirm Remove\\n "]],[]],[[[1,"\\n "],[10,2],[12],[1,"\\n Are you sure you want to remove this role?\\n "],[13],[1,"\\n "]],[]],[[[1,"\\n "],[8,[30,12,["Action"]],[[24,0,"dangerous"]],null,[["default"],[[[[1,"\\n "],[8,[39,1],[[24,"tabindex","-1"],[4,[38,26],["click",[28,[37,1],[[30,0],[30,10],"remove",[30,4],[33,23]],null]],null]],null,[["default"],[[[[1,"\\n Remove\\n "]],[]]]]],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[30,12,["Action"]],null,null,[["default"],[[[[1,"\\n "],[8,[39,1],null,[["@for"],[[30,9]]],[["default"],[[[[1,"\\n Cancel\\n "]],[]]]]],[1,"\\n "]],[]]]]],[1,"\\n "]],[12]]]]],[1,"\\n "],[13],[1,"\\n "],[13],[1,"\\n"]],[]],null],[1," "]],[9,10,11]]]]],[1,"\\n "]],[]]]]],[1,"\\n "]],[6,7,8]]]]],[1,"\\n "]],[4,5]]]]],[1,"\\n "]],[]]]]],[1,"\\n"]],[]]]]],[1,"\\n"]],["modal","close","option","item","index","index","change","checked","confirm","send","keypressClick","Actions"],false,["modal-dialog","action","mut","state","hash","if","eq","ref","block-slot","name","role-form","form","dc","nspace","partition","policy-selector","source","item","hds/button","policy-form","policyForm","hds/button-set","perform","items","queue","or","on","policy","array","child-selector","disabled","repo","optional","tabular-collection","sort-by","href-to","popover-menu","can","not","informed-action"]]',moduleName:"consul-ui/components/role-selector/index.hbs",isStrictMode:!1}) +var s=(0,t.setComponentTemplate)(u,l.default.extend({repo:(0,r.inject)("repository/role"),dom:(0,r.inject)("dom"),name:"role",type:"role",classNames:["role-selector"],state:"role",policy:(0,o.alias)("policyForm.data"),init:function(){this._super(...arguments),(0,i.set)(this,"policyForm",this.formContainer.form("policy")),this.source=new a.CallableEventSource},actions:{reset:function(e){this._super(...arguments),this.policyForm.clear({Datacenter:this.dc})},dispatch:function(e,t){this.source.dispatchEvent({type:e,data:t})},change:function(){const e=this.dom.normalizeEvent(...arguments),t=e.target +if("role[state]"===t.name)(0,i.set)(this,"state",t.value),"policy"===t.value&&this.dom.component(".code-editor",t.nextElementSibling).didAppear() +else this._super(...arguments)},triggerStateCheckboxChange(){let e=document.getElementById(`${this.name}_state_policy`) +e&&e.dispatchEvent(new Event("change"))}}})) +e.default=s})),define("consul-ui/components/route/announcer/index",["exports","@ember/component","@ember/template-factory","@ember/component/template-only"],(function(e,t,n,l){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const r=(0,n.createTemplateFactory)({id:"othmimN0",block:'[[[1,[28,[35,0],[[30,1]],[["separator"],[[28,[37,1],[[30,2]," - "],null]]]]],[1,"\\n"],[8,[39,2],null,[["@name"],["route-announcer"]],null],[1,"\\n\\n"]],["@title","@separator"],false,["page-title","or","portal-target"]]',moduleName:"consul-ui/components/route/announcer/index.hbs",isStrictMode:!1}) +var i=(0,t.setComponentTemplate)(r,(0,l.default)()) +e.default=i})),define("consul-ui/components/route/index",["exports","@ember/component","@ember/template-factory","@glimmer/component","@ember/service","@ember/object","@glimmer/tracking"],(function(e,t,n,l,r,i,o){var a,u,s,c,d,p,f,m,h,b +function y(e,t,n,l){n&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(l):void 0})}function g(e,t,n,l,r){var i={} +return Object.keys(l).forEach((function(e){i[e]=l[e]})),i.enumerable=!!i.enumerable,i.configurable=!!i.configurable,("value"in i||i.initializer)&&(i.writable=!0),i=n.slice().reverse().reduce((function(n,l){return l(e,t,n)||n}),i),r&&void 0!==i.initializer&&(i.value=i.initializer?i.initializer.call(r):void 0,i.initializer=void 0),void 0===i.initializer&&(Object.defineProperty(e,t,i),i=null),i}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const v=(0,n.createTemplateFactory)({id:"aUe64HGf",block:'[[[1,[28,[35,0],[[30,0,["connect"]]],null]],[1,"\\n"],[1,[28,[35,1],[[30,0,["disconnect"]]],null]],[1,"\\n"],[18,1,[[28,[37,3],null,[["model","params","currentName","refresh","t","exists","Title","Announcer"],[[30,0,["model"]],[30,0,["params"]],[30,0,["router","currentRoute","name"]],[30,0,["refresh"]],[30,0,["t"]],[30,0,["exists"]],[50,"route/title",0,null,null],[50,"route/announcer",0,null,null]]]]]]],["&default"],false,["did-insert","will-destroy","yield","hash","component"]]',moduleName:"consul-ui/components/route/index.hbs",isStrictMode:!1}),O=/\${([A-Za-z.0-9_-]+)}/g +let P=(a=(0,r.inject)("routlet"),u=(0,r.inject)("router"),s=(0,r.inject)("intl"),c=(0,r.inject)("encoder"),d=class extends l.default{constructor(){super(...arguments),y(this,"routlet",p,this),y(this,"router",f,this),y(this,"intl",m,this),y(this,"encoder",h,this),y(this,"_model",b,this),this.intlKey=this.encoder.createRegExpEncoder(O,(e=>e))}get params(){return this.routlet.paramsFor(this.args.name)}get model(){if(this._model)return this._model +if(this.args.name){const e=this.routlet.outletFor(this.args.name) +if(e)return this.routlet.modelFor(e.name)}}exists(e){return this.routlet.exists(`${this.args.name}.${e}`)}t(e,t){return e.includes("${")&&(e=this.intlKey(e,t)),this.intl.t(`routes.${this.args.name}.${e}`,t)}connect(){this.routlet.addRoute(this.args.name,this)}disconnect(){this.routlet.removeRoute(this.args.name,this)}},p=g(d.prototype,"routlet",[a],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),f=g(d.prototype,"router",[u],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),m=g(d.prototype,"intl",[s],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),h=g(d.prototype,"encoder",[c],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),b=g(d.prototype,"_model",[o.tracked],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),g(d.prototype,"exists",[i.action],Object.getOwnPropertyDescriptor(d.prototype,"exists"),d.prototype),g(d.prototype,"t",[i.action],Object.getOwnPropertyDescriptor(d.prototype,"t"),d.prototype),g(d.prototype,"connect",[i.action],Object.getOwnPropertyDescriptor(d.prototype,"connect"),d.prototype),g(d.prototype,"disconnect",[i.action],Object.getOwnPropertyDescriptor(d.prototype,"disconnect"),d.prototype),d) +e.default=P,(0,t.setComponentTemplate)(v,P)})),define("consul-ui/components/route/title/index",["exports","@ember/component","@ember/template-factory","@ember/component/template-only"],(function(e,t,n,l){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const r=(0,n.createTemplateFactory)({id:"SU19CA8/",block:'[[[1,[28,[35,0],[[30,1]],[["separator"],[[30,2]]]]],[1,"\\n"],[41,[28,[37,2],[[30,3],false],null],[[[1,[30,1]],[1,"\\n"]],[]],null],[8,[39,3],null,[["@target"],["route-announcer"]],[["default"],[[[[1,"\\n"],[11,0],[24,0,"route-title"],[17,4],[24,"aria-live","assertive"],[24,"aria-atomic","true"],[12],[1,"\\n"],[1," "],[1,[28,[35,4],["Navigated to ",[30,1]],null]],[1,"\\n"],[13],[1,"\\n"]],[]]]]],[1,"\\n"]],["@title","@separator","@render","&attrs"],false,["page-title","if","not-eq","portal","concat"]]',moduleName:"consul-ui/components/route/title/index.hbs",isStrictMode:!1}) +var i=(0,t.setComponentTemplate)(r,(0,l.default)()) +e.default=i})),define("consul-ui/components/search-bar/index",["exports","@ember/component","@ember/template-factory","@glimmer/component","@ember/object","consul-ui/components/search-bar/utils"],(function(e,t,n,l,r,i){var o +Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const a=(0,n.createTemplateFactory)({id:"ltULr+gR",block:'[[[11,0],[24,0,"search-bar"],[17,1],[12],[1,"\\n "],[10,"form"],[14,0,"filter-bar"],[12],[1,"\\n "],[10,0],[14,0,"search"],[12],[1,"\\n "],[18,4,[[28,[37,1],null,[["Search","Select"],[[50,"freetext-filter",0,null,null],[50,"popover-select",0,null,null]]]]]],[1,"\\n "],[13],[1,"\\n "],[10,0],[14,0,"filters"],[12],[1,"\\n "],[18,5,[[28,[37,1],null,[["Search","Select"],[[50,"freetext-filter",0,null,null],[50,"popover-select",0,null,null]]]]]],[1,"\\n "],[13],[1,"\\n "],[10,0],[14,0,"sort"],[12],[1,"\\n "],[18,6,[[28,[37,1],null,[["Search","Select"],[[50,"freetext-filter",0,null,null],[50,"popover-select",0,null,null]]]]]],[1,"\\n "],[13],[1,"\\n "],[13],[1,"\\n"],[41,[30,0,["isFiltered"]],[[[1," "],[10,0],[14,0,"search-bar-status"],[12],[1,"\\n "],[10,"dl"],[12],[1,"\\n "],[10,"dt"],[12],[1,[28,[35,4],[[28,[37,5],["component.search-bar.header"],[["default","item"],["common.ui.filtered-by",""]]]],null]],[13],[1,"\\n "],[10,"dd"],[12],[1,"\\n "],[10,"ul"],[12],[1,"\\n"],[42,[28,[37,7],[[28,[37,7],[[30,0,["filters"]]],null]],null],null,[[[1," "],[18,7,[[28,[37,1],null,[["RemoveFilter","status"],[[50,"search-bar/remove-filter",0,null,[["onclick"],[[28,[37,8],[[30,0],[28,[37,9],[[28,[37,9],[[30,3],[30,2,["key"]]],null],"change"],null],[28,[37,1],null,[["target"],[[28,[37,1],null,[["selectedItems"],[[28,[37,10],[[30,2,["selected"]],","],null]]]]]]]],null]]]],[28,[37,1],null,[["key","value"],[[30,2,["key"]],[28,[37,11],[[30,2,["value"]]],null]]]]]]]]],[1,"\\n"]],[2]],null],[1," "],[10,"li"],[14,0,"remove-all"],[12],[1,"\\n "],[8,[39,8],[[4,[38,12],["click",[30,0,["removeAllFilters"]]],null]],null,[["default"],[[[[1,"\\n Remove filters\\n "]],[]]]]],[1,"\\n "],[13],[1,"\\n "],[13],[1,"\\n "],[13],[1,"\\n "],[13],[1,"\\n "],[13],[1,"\\n"]],[]],null],[13],[1,"\\n"]],["&attrs","filter","@filter","&search","&filter","&sort","&status"],false,["yield","hash","component","if","string-trim","t","each","-track-array","action","get","join","lowercase","on"]]',moduleName:"consul-ui/components/search-bar/index.hbs",isStrictMode:!1}) +let u=(o=class extends l.default{get isFiltered(){const e=this.args.filter.searchproperty||{default:[],value:[]} +return(0,i.diff)(e.default,e.value).length>0||Object.entries(this.args.filter).some((e=>{let[t,n]=e +return"searchproperty"!==t&&void 0!==n.value}))}get filters(){return(0,i.filters)(this.args.filter)}removeAllFilters(){Object.values(this.args.filter).forEach(((e,t)=>{setTimeout((()=>e.change(e.default||[])),1*t)}))}},s=o.prototype,c="removeAllFilters",d=[r.action],p=Object.getOwnPropertyDescriptor(o.prototype,"removeAllFilters"),f=o.prototype,m={},Object.keys(p).forEach((function(e){m[e]=p[e]})),m.enumerable=!!m.enumerable,m.configurable=!!m.configurable,("value"in m||m.initializer)&&(m.writable=!0),m=d.slice().reverse().reduce((function(e,t){return t(s,c,e)||e}),m),f&&void 0!==m.initializer&&(m.value=m.initializer?m.initializer.call(f):void 0,m.initializer=void 0),void 0===m.initializer&&(Object.defineProperty(s,c,m),m=null),o) +var s,c,d,p,f,m +e.default=u,(0,t.setComponentTemplate)(a,u)})),define("consul-ui/components/search-bar/remove-filter/index",["exports","@ember/component","@ember/template-factory","@ember/component/template-only"],(function(e,t,n,l){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const r=(0,n.createTemplateFactory)({id:"euFx6j52",block:'[[[10,"li"],[12],[1,"\\n "],[8,[39,0],[[17,1],[4,[38,1],["click",[30,2]],null]],null,null],[1,"\\n "],[18,3,null],[1,"\\n"],[13],[1,"\\n"]],["&attrs","@onclick","&default"],false,["action","on","yield"]]',moduleName:"consul-ui/components/search-bar/remove-filter/index.hbs",isStrictMode:!1}) +var i=(0,t.setComponentTemplate)(r,(0,l.default)()) +e.default=i})),define("consul-ui/components/search-bar/utils",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.filters=e.diff=void 0 +const t=(e,t)=>e.filter((e=>!t.includes(e))) +e.diff=t +e.filters=e=>Object.entries(e).filter((e=>{let[n,l]=e +return"searchproperty"===n?t(l.default,l.value).length>0:(l.value||[]).length>0})).reduce(((e,n)=>{let[l,r]=n +return e.concat(r.value.map((e=>{const n={key:l,value:e} +return n.selected="searchproperty"!==l?t(r.value,[e]):1===r.value.length?r.default:t(r.value,[e]),n})))}),[])})),define("consul-ui/components/state-chart/action/index",["exports","@ember/component","@ember/template-factory"],(function(e,t,n){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const l=(0,n.createTemplateFactory)({id:"ryQhDcxm",block:'[[[18,1,null]],["&default"],false,["yield"]]',moduleName:"consul-ui/components/state-chart/action/index.hbs",isStrictMode:!1}) +var r=(0,t.setComponentTemplate)(l,t.default.extend({tagName:"",didInsertElement:function(){this._super(...arguments),this.chart.addAction(this.name,((e,t)=>this.exec(e,t)))},willDestroy:function(){this._super(...arguments),this.chart.removeAction(this.type)}})) +e.default=r})),define("consul-ui/components/state-chart/guard/index",["exports","@ember/component","@ember/template-factory"],(function(e,t,n){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const l=(0,n.createTemplateFactory)({id:"nyWRsZoG",block:'[[[18,1,null]],["&default"],false,["yield"]]',moduleName:"consul-ui/components/state-chart/guard/index.hbs",isStrictMode:!1}) +var r=(0,t.setComponentTemplate)(l,t.default.extend({tagName:"",didInsertElement:function(){this._super(...arguments) +const e=this +this.chart.addGuard(this.name,(function(){return"function"==typeof e.cond?e.cond(...arguments):e.cond}))},willDestroyElement:function(){this._super(...arguments),this.chart.removeGuard(this.name)}})) +e.default=r})),define("consul-ui/components/state-chart/index",["exports","@ember/component","@ember/template-factory","@ember/service","@ember/object"],(function(e,t,n,l,r){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const i=(0,n.createTemplateFactory)({id:"4gS2sdh2",block:'[[[18,1,[[50,"state",0,null,[["state"],[[33,2]]]],[50,"state-chart/guard",0,null,[["chart"],[[30,0]]]],[50,"state-chart/action",0,null,[["chart"],[[30,0]]]],[28,[37,3],[[30,0],"dispatch"],null],[33,2]]]],["&default"],false,["yield","component","state","action"]]',moduleName:"consul-ui/components/state-chart/index.hbs",isStrictMode:!1}) +var o=(0,t.setComponentTemplate)(i,t.default.extend({chart:(0,l.inject)("state"),tagName:"",ontransition:function(e){},init:function(){this._super(...arguments),this._actions={},this._guards={}},didReceiveAttrs:function(){var e=this +void 0!==this.machine&&this.machine.stop(),void 0!==this.initial&&(this.src.initial=this.initial),this.machine=this.chart.interpret(this.src,{onTransition:e=>{const t=new CustomEvent("transition",{detail:e}) +this.ontransition(t),t.defaultPrevented||e.actions.forEach((t=>{"function"==typeof this._actions[t.type]&&this._actions[t.type](t.type,e.context,e.event)})),(0,r.set)(this,"state",e)},onGuard:function(t){for(var n=arguments.length,l=new Array(n>1?n-1:0),r=1;r1&&void 0!==arguments[1]?arguments[1]:{} +if(this.$tr&&(this.$tr.style.zIndex=null),t.target&&t.target.checked&&e!==(0,r.get)(this,"checked")){(0,r.set)(this,"checked",parseInt(e)) +const n=t.target,l=this.dom.closest("tr",n),i=this.dom.sibling(n,"div") +i.getBoundingClientRect().top+i.clientHeight>this.dom.element('footer[role="contentinfo"]').getBoundingClientRect().top?i.classList.add("above"):i.classList.remove("above"),l.style.zIndex=1,this.$tr=l}else(0,r.set)(this,"checked",null)}}})) +e.default=d})),define("consul-ui/components/tabular-details/index",["exports","@ember/component","@ember/template-factory","@ember/service","block-slots"],(function(e,t,n,l,r){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const i=(0,n.createTemplateFactory)({id:"+Q2oF2tj",block:'[[[18,4,null],[1,"\\n"],[10,"table"],[14,0,"with-details has-actions"],[12],[1,"\\n "],[10,"thead"],[12],[1,"\\n "],[10,"tr"],[12],[1,"\\n "],[8,[39,1],null,[["@name"],["header"]],[["default"],[[[[18,4,null]],[]]]]],[1,"\\n "],[10,"th"],[14,0,"actions"],[12],[1,"Actions"],[13],[1,"\\n "],[13],[1,"\\n "],[13],[1,"\\n "],[10,"tbody"],[12],[1,"\\n"],[44,[[28,[37,3],["tabular-details-",[33,4],"-toggle-",[33,5],"_"],null]],[[[42,[28,[37,7],[[28,[37,7],[[33,8]],null]],null],null,[[[1," "],[10,"tr"],[15,"onclick",[28,[37,9],[[30,0],"click"],null]],[12],[1,"\\n "],[8,[39,1],null,[["@name"],["row"]],[["default"],[[[[18,4,[[30,2],[30,3]]]],[]]]]],[1,"\\n "],[10,"td"],[14,0,"actions"],[12],[1,"\\n "],[10,"label"],[15,"for",[28,[37,3],[[30,1],[30,3]],null]],[12],[10,1],[12],[1,"Show details"],[13],[13],[1,"\\n "],[13],[1,"\\n "],[13],[1,"\\n "],[10,"tr"],[12],[1,"\\n "],[10,"td"],[14,"colspan","3"],[12],[1,"\\n "],[10,"input"],[15,"checked",[28,[37,10],[[28,[37,11],[[30,2,["closed"]]],null]],null]],[15,2,[30,3]],[15,3,[36,4]],[15,1,[28,[37,3],[[30,1],[30,3]],null]],[15,"onchange",[28,[37,9],[[30,0],"change",[30,2],[33,8]],null]],[14,4,"checkbox"],[12],[13],[1,"\\n "],[10,0],[12],[1,"\\n "],[10,"label"],[15,"for",[28,[37,3],[[30,1],[30,3]],null]],[12],[10,1],[12],[1,"Hide details"],[13],[13],[1,"\\n "],[10,0],[12],[1,"\\n "],[8,[39,1],null,[["@name"],["details"]],[["default"],[[[[1,"\\n "],[18,4,[[30,2],[30,3]]],[1,"\\n "]],[]]]]],[1,"\\n "],[13],[1,"\\n "],[13],[1,"\\n "],[13],[1,"\\n "],[13],[1,"\\n"]],[2,3]],null]],[1]]],[1," "],[13],[1,"\\n"],[13],[1,"\\n"]],["inputId","item","index","&default"],false,["yield","yield-slot","let","concat","name","guid","each","-track-array","items","action","not","is-empty"]]',moduleName:"consul-ui/components/tabular-details/index.hbs",isStrictMode:!1}) +var o=(0,t.setComponentTemplate)(i,t.default.extend(r.default,{dom:(0,l.inject)("dom"),onchange:function(){},init:function(){this._super(...arguments),this.guid=this.dom.guid(this)},actions:{click:function(e){this.dom.clickFirstAnchor(e)},change:function(e,t,n){this.onchange(n,e,t)}}})) +e.default=o})),define("consul-ui/components/tag-list/index",["exports","@ember/component","@ember/template-factory","@ember/component/template-only"],(function(e,t,n,l){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const r=(0,n.createTemplateFactory)({id:"6itZIEFp",block:'[[[44,[[28,[37,1],[[28,[37,2],[[30,1,["Tags"]],[28,[37,3],null,null]],null],[28,[37,2],[[30,2],[28,[37,3],null,null]],null]],null]],[[[41,[28,[37,5],[[30,3,["length"]],0],null],[[[41,[48,[30,6]],[[[1," "],[18,6,[[50,"tag-list",0,null,[["item"],[[30,1]]]]]],[1,"\\n"]],[]],[[[11,"dl"],[24,0,"tag-list"],[17,4],[12],[1,"\\n "],[11,"dt"],[4,[38,9],null,null],[12],[1,"\\n "],[1,[28,[35,10],["components.tag-list.title"],[["default"],[[28,[37,3],["common.consul.tags"],null]]]]],[1,"\\n "],[13],[1,"\\n "],[10,"dd"],[12],[1,"\\n"],[42,[28,[37,12],[[28,[37,12],[[30,3]],null]],null],null,[[[1," "],[10,1],[12],[1,[30,5]],[13],[1,"\\n"]],[5]],null],[1," "],[13],[1,"\\n"],[13],[1,"\\n"]],[]]]],[]],null]],[3]]]],["@item","@tags","tags","&attrs","item","&default"],false,["let","union","or","array","if","gt","has-block","yield","component","tooltip","t","each","-track-array"]]',moduleName:"consul-ui/components/tag-list/index.hbs",isStrictMode:!1}) +var i=(0,t.setComponentTemplate)(r,(0,l.default)()) +e.default=i})),define("consul-ui/components/text-input/index",["exports","@ember/component","@ember/template-factory","@ember/component/template-only"],(function(e,t,n,l){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const r=(0,n.createTemplateFactory)({id:"CVQgbzbo",block:'[[[8,[39,0],[[16,0,[28,[37,1],["text-input"," type-text"],null]],[17,1]],[["@item","@placeholder","@name","@label","@help","@validations","@chart"],[[30,2],[30,3],[30,4],[30,5],[30,6],[30,7],[30,8]]],[["label","input"],[[[[1,"\\n"],[1," "],[1,[28,[35,2],[[30,5],[30,4]],null]],[1,"\\n "]],[]],[[[1,"\\n"],[41,[30,9],[[[1," "],[11,"textarea"],[16,3,[30,4]],[4,[38,4],[[30,2]],[["validations","chart"],[[30,7],[30,8]]]],[4,[38,5],["input",[28,[37,6],[[30,10]],null]],null],[12],[1,[28,[35,2],[[30,11],[28,[37,7],[[30,2],[30,4]],null]],null]],[13],[1,"\\n"]],[]],[[[1," "],[11,"input"],[16,2,[28,[37,2],[[30,11],[28,[37,7],[[30,2],[30,4]],null]],null]],[16,3,[30,4]],[16,"placeholder",[28,[37,2],[[30,3]],null]],[24,4,"text"],[4,[38,4],[[30,2]],[["validations","chart"],[[30,7],[30,8]]]],[4,[38,5],["input",[28,[37,6],[[30,10]],null]],null],[12],[13],[1,"\\n"]],[]]],[1," "]],[]]]]],[1,"\\n"]],["&attrs","@item","@placeholder","@name","@label","@help","@validations","@chart","@expanded","@oninput","@value"],false,["form-input","concat","or","if","validate","on","optional","get"]]',moduleName:"consul-ui/components/text-input/index.hbs",isStrictMode:!1}) +var i=(0,t.setComponentTemplate)(r,(0,l.default)()) +e.default=i})),define("consul-ui/components/toggle-button/index",["exports","@ember/component","@ember/template-factory","@ember/service"],(function(e,t,n,l){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const r=(0,n.createTemplateFactory)({id:"DglTzUFT",block:'[[[11,"input"],[17,1],[24,4,"checkbox"],[16,"checked",[52,[33,1],"checked",[27]]],[16,1,[28,[37,2],["toggle-button-",[33,3]],null]],[16,"onchange",[28,[37,4],[[30,0],"change"],null]],[4,[38,5],[[28,[37,6],[[30,0],"input"],null]],null],[12],[13],[1,"\\n"],[11,"label"],[16,"for",[28,[37,2],["toggle-button-",[33,3]],null]],[4,[38,5],[[28,[37,6],[[30,0],"label"],null]],null],[12],[1,"\\n "],[18,2,[[28,[37,8],null,[["click"],[[28,[37,4],[[30,0],"click"],null]]]]]],[1,"\\n"],[13]],["&attrs","&default"],false,["if","checked","concat","guid","action","did-insert","set","yield","hash"]]',moduleName:"consul-ui/components/toggle-button/index.hbs",isStrictMode:!1}) +var i=(0,t.setComponentTemplate)(r,t.default.extend({dom:(0,l.inject)("dom"),tagName:"",checked:!1,onchange:function(){},onblur:function(){},init:function(){this._super(...arguments),this.guid=this.dom.guid(this),this._listeners=this.dom.listeners()},willDestroyElement:function(){this._super(...arguments),this._listeners.remove()},didReceiveAttrs:function(){this._super(...arguments),this.checked?this.addClickOutsideListener():this._listeners.remove()},addClickOutsideListener:function(){this._listeners.remove(),this._listeners.add(this.dom.document(),"click",(e=>{this.dom.isOutside(this.label,e.target)&&this.dom.isOutside(this.label.nextElementSibling,e.target)&&(this.input.checked&&(this.input.checked=!1,this.onchange({target:this.input})),this._listeners.remove())}))},actions:{click:function(e){-1===(e.target.rel||"").indexOf("noopener")&&e.preventDefault(),this.input.checked=!this.input.checked,0!==e.detail&&e.target.blur(),this.actions.change.apply(this,[e])},change:function(e){this.input.checked&&this.addClickOutsideListener(),this.onchange({target:this.input})}}})) +e.default=i})),define("consul-ui/components/token-list/index",["exports","@ember/component","@ember/template-factory","block-slots"],(function(e,t,n,l){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const r=(0,n.createTemplateFactory)({id:"YY0PAiL0",block:'[[[18,3,null],[1,"\\n"],[41,[28,[37,2],[[33,3,["length"]],0],null],[[[1," "],[8,[39,4],[[24,0,"token-list"]],[["@rows","@items"],[5,[28,[37,5],["AccessorID:asc",[33,3]],null]]],[["default"],[[[[1,"\\n"],[41,[33,6],[[[1," "],[8,[39,7],null,[["@name"],["caption"]],[["default"],[[[[1,[34,6]]],[]]]]],[1,"\\n"]],[]],null],[1," "],[8,[39,7],null,[["@name"],["header"]],[["default"],[[[[1,"\\n "],[10,"th"],[12],[1,"AccessorID"],[13],[1,"\\n "],[10,"th"],[12],[1,"Scope"],[13],[1,"\\n "],[10,"th"],[12],[1,"Description"],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,7],null,[["@name"],["row"]],[["default"],[[[[1,"\\n "],[10,"td"],[12],[1,"\\n "],[10,3],[15,6,[28,[37,8],["dc.acls.tokens.edit",[30,1,["AccessorID"]]],null]],[15,"target",[28,[37,9],[[33,10],""],null]],[12],[1,[28,[35,11],[[30,1,["AccessorID"]],8,false],null]],[13],[1,"\\n "],[13],[1,"\\n "],[10,"td"],[12],[1,"\\n "],[1,[52,[30,1,["Local"]],"local","global"]],[1,"\\n "],[13],[1,"\\n "],[10,"td"],[12],[1,"\\n "],[10,2],[12],[1,[30,1,["Description"]]],[13],[1,"\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n "]],[1,2]]]]],[1,"\\n"]],[]],null]],["item","index","&default"],false,["yield","if","gt","items","tabular-collection","sort-by","caption","block-slot","href-to","or","target","truncate"]]',moduleName:"consul-ui/components/token-list/index.hbs",isStrictMode:!1}) +var i=(0,t.setComponentTemplate)(r,t.default.extend(l.default,{tagName:""})) +e.default=i})),define("consul-ui/components/token-source/chart.xstate",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +e.default={id:"token-source",initial:"idle",on:{RESTART:[{target:"secret",cond:"isSecret"},{target:"provider"}]},states:{idle:{},secret:{},provider:{on:{SUCCESS:"jwt"}},jwt:{on:{SUCCESS:"token"}},token:{}}}})),define("consul-ui/components/token-source/index",["exports","@ember/component","@ember/template-factory","@glimmer/component","@ember/object","@glimmer/tracking","consul-ui/components/token-source/chart.xstate"],(function(e,t,n,l,r,i,o){var a,u,s +function c(e,t){var n=Object.keys(e) +if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e) +t&&(l=l.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,l)}return n}function d(e,t,n,l){n&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(l):void 0})}function p(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function f(e,t,n,l,r){var i={} +return Object.keys(l).forEach((function(e){i[e]=l[e]})),i.enumerable=!!i.enumerable,i.configurable=!!i.configurable,("value"in i||i.initializer)&&(i.writable=!0),i=n.slice().reverse().reduce((function(n,l){return l(e,t,n)||n}),i),r&&void 0!==i.initializer&&(i.value=i.initializer?i.initializer.call(r):void 0,i.initializer=void 0),void 0===i.initializer&&(Object.defineProperty(e,t,i),i=null),i}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const m=(0,n.createTemplateFactory)({id:"49zN7wYk",block:'[[[8,[39,0],null,[["@src","@initial"],[[30,0,["chart"]],[52,[28,[37,2],[[30,1],"oidc"],null],"provider","secret"]]],[["default"],[[[[1,"\\n "],[8,[30,3],null,[["@name","@cond"],["isSecret",[30,0,["isSecret"]]]],null],[1,"\\n"],[44,[[28,[37,4],["/${partition}/${nspace}/${dc}",[28,[37,5],null,[["partition","nspace","dc"],[[28,[37,6],[[30,7,["Partition"]],[30,8]],null],[28,[37,6],[[30,7,["Namespace"]],[30,9]],null],[30,10]]]]],null]],[[[1," "],[8,[30,2],null,[["@matches"],["secret"]],[["default"],[[[[1,"\\n "],[8,[39,7],null,[["@src","@onchange","@onerror"],[[28,[37,4],[[28,[37,8],[[30,11],"/token/self/${value}"],null],[28,[37,5],null,[["value"],[[30,7]]]]],null],[30,0,["change"]],[30,12]]],null],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[30,2],null,[["@matches"],["provider"]],[["default"],[[[[1,"\\n "],[8,[39,7],null,[["@src","@onchange","@onerror"],[[28,[37,4],[[28,[37,8],[[30,11],"/oidc/provider/${value}"],null],[28,[37,5],null,[["value"],[[30,7,["Name"]]]]]],null],[28,[37,9],[[28,[37,10],[[30,0],[28,[37,11],[[30,0,["provider"]]],null]],[["value"],["data"]]],[28,[37,10],[[30,0],[30,5],"SUCCESS"],null]],null],[30,12]]],null],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[30,2],null,[["@matches"],["jwt"]],[["default"],[[[[1,"\\n "],[8,[39,12],null,[["@src","@onchange","@onerror"],[[30,0,["provider","AuthURL"]],[28,[37,9],[[28,[37,10],[[30,0],[28,[37,11],[[30,0,["jwt"]]],null]],[["value"],["data"]]],[28,[37,10],[[30,0],[30,5],"SUCCESS"],null]],null],[30,12]]],null],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[30,2],null,[["@matches"],["token"]],[["default"],[[[[1,"\\n "],[8,[39,7],null,[["@src","@onchange","@onerror"],[[28,[37,4],[[28,[37,8],[[30,11],"/oidc/authorize/${provider}/${code}/${state}"],null],[28,[37,5],null,[["provider","code","state"],[[30,0,["provider","Name"]],[30,0,["jwt","authorizationCode"]],[28,[37,6],[[30,0,["jwt","authorizationState"]],""],null]]]]],null],[30,0,["change"]],[30,12]]],null],[1,"\\n "]],[]]]]],[1,"\\n"]],[11]]]],[2,3,4,5,6]]]]]],["@type","State","Guard","Action","dispatch","state","@value","@partition","@nspace","@dc","path","@onerror"],false,["state-chart","if","eq","let","uri","hash","or","data-source","concat","queue","action","mut","jwt-source"]]',moduleName:"consul-ui/components/token-source/index.hbs",isStrictMode:!1}) +let h=(a=class extends l.default{constructor(){super(...arguments),d(this,"provider",u,this),d(this,"jwt",s,this),this.chart=o.default}isSecret(){return"secret"===this.args.type}change(e){e.data.toJSON=function(){return function(e){for(var t=1;t{const n=parseFloat(t.getTotalLength()),l=t.getPointAtLength(Math.ceil(n/3)) +return{id:t.id,x:Math.round(l.x-e.x),y:Math.round(l.y-e.y)}}))}},s=p(u.prototype,"iconPositions",[r.tracked],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),c=p(u.prototype,"dom",[a],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),p(u.prototype,"getIconPositions",[i.action],Object.getOwnPropertyDescriptor(u.prototype,"getIconPositions"),u.prototype),u) +e.default=m,(0,t.setComponentTemplate)(f,m)})),define("consul-ui/components/topology-metrics/index",["exports","@ember/component","@ember/template-factory","@glimmer/component","@glimmer/tracking","@ember/object","@ember/service"],(function(e,t,n,l,r,i,o){var a,u,s,c,d,p,f,m,h,b,y +function g(e,t,n,l){n&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(l):void 0})}function v(e,t,n,l,r){var i={} +return Object.keys(l).forEach((function(e){i[e]=l[e]})),i.enumerable=!!i.enumerable,i.configurable=!!i.configurable,("value"in i||i.initializer)&&(i.writable=!0),i=n.slice().reverse().reduce((function(n,l){return l(e,t,n)||n}),i),r&&void 0!==i.initializer&&(i.value=i.initializer?i.initializer.call(r):void 0,i.initializer=void 0),void 0===i.initializer&&(Object.defineProperty(e,t,i),i=null),i}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const O=(0,n.createTemplateFactory)({id:"/n9s2uNC",block:'[[[11,0],[24,0,"topology-container consul-topology-metrics"],[4,[38,0],[[30,0,["calculate"]]],null],[12],[1,"\\n"],[41,[28,[37,2],[[30,0,["downstreams","length"]],0],null],[[[1," "],[11,0],[24,1,"downstream-container"],[4,[38,3],[[30,0,["setHeight"]],"downstream-lines"],null],[4,[38,4],[[30,0,["setHeight"]],"downstream-lines",[30,0,["downstreams"]]],null],[12],[1,"\\n"],[41,[28,[37,5],[[30,0,["emptyColumn"]]],null],[[[1," "],[10,0],[12],[1,"\\n "],[10,2],[12],[1,[30,1,["Name"]]],[13],[1,"\\n "],[10,1],[12],[1,"\\n "],[8,[39,6],null,null,[["default"],[[[[1,"\\n Only showing downstreams within the current datacenter for "],[1,[30,2,["Service","Service"]]],[1,".\\n "]],[]]]]],[1,"\\n "],[13],[1,"\\n "],[13],[1,"\\n"]],[]],null],[42,[28,[37,8],[[28,[37,8],[[30,0,["downstreams"]]],null]],null],null,[[[1," "],[8,[39,9],null,[["@nspace","@dc","@service","@item","@hasMetricsProvider","@noMetricsReason"],[[30,4],[30,1,["Name"]],[30,2,["Service"]],[30,3],[30,5],[30,0,["noMetricsReason"]]]],[["default"],[[[[1,"\\n"],[41,[28,[37,10],[[30,5],[30,0,["mainNotIngressService"]],[28,[37,11],[[30,3,["Kind"]],"ingress-gateway"],null]],null],[[[1," "],[8,[39,12],null,[["@nspace","@partition","@dc","@endpoint","@service","@item","@noMetricsReason"],[[28,[37,13],[[30,3,["Namespace"]],"default"],null],[28,[37,13],[[30,3,["Partition"]],"default"],null],[30,3,["Datacenter"]],"downstream-summary-for-service",[30,2,["Service","Service"]],[30,3,["Name"]],[30,0,["noMetricsReason"]]]],null],[1,"\\n"]],[]],null],[1," "]],[]]]]],[1,"\\n"]],[3]],null],[1," "],[13],[1,"\\n"]],[]],null],[1," "],[10,0],[14,1,"metrics-container"],[12],[1,"\\n "],[10,0],[14,0,"metrics-header"],[12],[1,"\\n "],[1,[30,2,["Service","Service"]]],[1,"\\n "],[13],[1,"\\n"],[41,[28,[37,11],[[30,2,["Service","Meta","external-source"]],"consul-api-gateway"],null],[[[41,[30,5],[[[1," "],[8,[39,14],null,[["@nspace","@partition","@dc","@service","@protocol","@noMetricsReason"],[[28,[37,13],[[30,2,["Service","Namespace"]],"default"],null],[28,[37,13],[[33,15,["Service","Partition"]],"default"],null],[30,1,["Name"]],[30,2,["Service","Service"]],[30,6,["Protocol"]],[30,0,["noMetricsReason"]]]],null],[1,"\\n"],[41,[30,0,["mainNotIngressService"]],[[[1," "],[8,[39,12],null,[["@nspace","@partition","@dc","@endpoint","@service","@protocol","@noMetricsReason"],[[28,[37,13],[[30,2,["Service","Namespace"]],"default"],null],[28,[37,13],[[33,15,["Service","Partition"]],"default"],null],[30,1,["Name"]],"summary-for-service",[30,2,["Service","Service"]],[30,6,["Protocol"]],[30,0,["noMetricsReason"]]]],null],[1,"\\n"]],[]],null]],[]],null],[1," "],[10,0],[14,0,"link"],[12],[1,"\\n"],[41,[30,7],[[[1," "],[10,3],[14,0,"metrics-link"],[15,6,[30,7]],[14,"target","_blank"],[14,"rel","noopener noreferrer"],[12],[1,"Open dashboard"],[13],[1,"\\n"]],[]],[[[1," "],[10,3],[14,0,"config-link"],[15,6,[29,[[28,[37,16],["CONSUL_DOCS_URL"],null],"/connect/observability/ui-visualization"]]],[14,"target","_blank"],[14,"rel","noopener noreferrer"],[12],[1,"Configure dashboard"],[13],[1,"\\n"]],[]]],[1," "],[13],[1,"\\n"]],[]],null],[1," "],[13],[1,"\\n "],[10,0],[14,1,"downstream-lines"],[12],[1,"\\n "],[8,[39,17],null,[["@type","@service","@view","@center","@lines","@items","@oncreate"],["downstream",[30,2],[30,0,["downView"]],[30,0,["centerDimensions"]],[30,0,["downLines"]],[30,0,["downstreams"]],[28,[37,18],[[30,0],[30,8]],null]]],null],[1,"\\n "],[13],[1,"\\n"],[41,[28,[37,2],[[30,0,["upstreams","length"]],0],null],[[[1," "],[10,0],[14,1,"upstream-column"],[12],[1,"\\n"],[42,[28,[37,19],[[28,[37,20],["PeerOrDatacenter",[30,0,["upstreams"]]],null]],null],null,[[[1," "],[11,0],[24,1,"upstream-container"],[4,[38,3],[[30,0,["setHeight"]],"upstream-lines"],null],[4,[38,4],[[30,0,["setHeight"]],"upstream-lines",[30,0,["upstreams"]]],null],[12],[1,"\\n"],[41,[30,10],[[[1," "],[10,2],[12],[1,[30,10]],[13],[1,"\\n"]],[]],null],[42,[28,[37,8],[[28,[37,8],[[30,9]],null]],null],null,[[[1," "],[8,[39,9],null,[["@dc","@item","@service"],[[30,1,["Name"]],[30,11],[30,2,["Service"]]]],[["default"],[[[[1,"\\n"],[41,[28,[37,10],[[30,5],[30,0,["mainNotIngressService"]],[28,[37,11],[[30,11,["Kind"]],"ingress-gateway"],null]],null],[[[1," "],[8,[39,12],null,[["@nspace","@partition","@dc","@endpoint","@service","@item","@noMetricsReason"],[[28,[37,13],[[30,11,["Namespace"]],"default"],null],[28,[37,13],[[30,11,["Partition"]],"default"],null],[30,11,["Datacenter"]],"upstream-summary-for-service",[30,2,["Service","Service"]],[30,11,["Name"]],[30,0,["noMetricsReason"]]]],null],[1,"\\n"]],[]],null],[1," "]],[]]]]],[1,"\\n"]],[11]],null],[1," "],[13],[1,"\\n"]],[9,10]],null],[1," "],[13],[1,"\\n"]],[]],null],[1," "],[10,0],[14,1,"upstream-lines"],[12],[1,"\\n "],[8,[39,21],null,[["@type","@service","@view","@center","@lines","@items","@oncreate"],["upstream",[30,2],[30,0,["upView"]],[30,0,["centerDimensions"]],[30,0,["upLines"]],[30,0,["upstreams"]],[28,[37,18],[[30,0],[30,8]],null]]],null],[1,"\\n "],[13],[1,"\\n"],[13],[1,"\\n"]],["@dc","@service","item","@nspace","@hasMetricsProvider","@topology","@metricsHref","@oncreate","upstreams","dc","item"],false,["on-resize","if","gt","did-insert","did-update","not","tooltip","each","-track-array","topology-metrics/card","and","not-eq","topology-metrics/stats","or","topology-metrics/series","service","env","topology-metrics/down-lines","action","-each-in","group-by","topology-metrics/up-lines"]]',moduleName:"consul-ui/components/topology-metrics/index.hbs",isStrictMode:!1}) +let P=(a=(0,o.inject)("env"),u=(0,o.inject)(),s=class extends l.default{constructor(){super(...arguments),g(this,"env",c,this),g(this,"abilities",d,this),g(this,"centerDimensions",p,this),g(this,"downView",f,this),g(this,"downLines",m,this),g(this,"upView",h,this),g(this,"upLines",b,this),g(this,"noMetricsReason",y,this)}drawDownLines(e){const t=["allow","deny"],n={x:this.centerDimensions.x-7,y:this.centerDimensions.y+this.centerDimensions.height/2} +return e.map((e=>{const t=e.getBoundingClientRect(),l={x:t.x+t.width,y:t.y+t.height/2} +return{id:e.id,permission:e.getAttribute("data-permission"),dest:n,src:l}})).sort(((e,n)=>t.indexOf(e.permission)-t.indexOf(n.permission)))}drawUpLines(e){const t=["allow","deny"],n={x:this.centerDimensions.x+5.5,y:this.centerDimensions.y+this.centerDimensions.height/2} +return e.map((e=>{const t=e.getBoundingClientRect(),l={x:t.x-t.width-25,y:t.y+t.height/2} +return{id:e.id,permission:e.getAttribute("data-permission"),dest:l,src:n}})).sort(((e,n)=>t.indexOf(e.permission)-t.indexOf(n.permission)))}emptyColumn(){const e=(0,i.get)(this.args.topology,"noDependencies") +return!this.env.var("CONSUL_ACLS_ENABLED")||e}get downstreams(){const e=(0,i.get)(this.args.topology,"Downstreams")||[],t=[...e],n=(0,i.get)(this.args.topology,"noDependencies") +if(!this.env.var("CONSUL_ACLS_ENABLED")&&n)t.push({Name:"Downstreams unknown.",Empty:!0,Datacenter:"",Namespace:""}) +else if(0===e.length){const e=this.abilities.can("use peers") +t.push({Name:e?"No downstreams, or the downstreams are imported services.":"No downstreams.",Datacenter:"",Namespace:""})}return t}get upstreams(){const e=(0,i.get)(this.args.topology,"Upstreams")||[] +e.forEach((e=>{e.PeerOrDatacenter=e.PeerName||e.Datacenter})) +const t=[...e],n=(0,i.get)(this.args.dc,"DefaultACLPolicy"),l=(0,i.get)(this.args.topology,"wildcardIntention"),r=(0,i.get)(this.args.topology,"noDependencies") +return!this.env.var("CONSUL_ACLS_ENABLED")&&r?t.push({Name:"Upstreams unknown.",Datacenter:"",PeerOrDatacenter:"",Namespace:""}):"allow"===n||l?t.push({Name:"* (All Services)",Datacenter:"",PeerOrDatacenter:"",Namespace:""}):0===e.length&&t.push({Name:"No upstreams.",Datacenter:"",PeerOrDatacenter:"",Namespace:""}),t}get mainNotIngressService(){return"ingress-gateway"!==((0,i.get)(this.args.service.Service,"Kind")||"")}setHeight(e,t){if(e){const n=e.getBoundingClientRect() +document.getElementById(`${t[0]}`).setAttribute("style",`height:${n.height}px`)}this.calculate()}calculate(){this.args.isRemoteDC?this.noMetricsReason="remote-dc":"ingress-gateway"===this.args.service.Service.Kind?this.noMetricsReason="ingress-gateway":this.noMetricsReason=null +const e=document.getElementById("downstream-lines").getBoundingClientRect(),t=document.getElementById("upstream-lines").getBoundingClientRect(),n=document.getElementById("upstream-column") +this.emptyColumn?this.downView={x:e.x,y:e.y,width:e.width,height:e.height+10}:this.downView=e,n&&(this.upView={x:t.x,y:t.y,width:t.width,height:n.getBoundingClientRect().height+10}) +const l=[...document.querySelectorAll("#downstream-container .topology-metrics-card")],r=document.querySelector(".metrics-header"),i=[...document.querySelectorAll("#upstream-column .topology-metrics-card")] +this.centerDimensions=r.getBoundingClientRect(),this.downLines=this.drawDownLines(l),this.upLines=this.drawUpLines(i)}},c=v(s.prototype,"env",[a],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),d=v(s.prototype,"abilities",[u],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),p=v(s.prototype,"centerDimensions",[r.tracked],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),f=v(s.prototype,"downView",[r.tracked],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),m=v(s.prototype,"downLines",[r.tracked],{configurable:!0,enumerable:!0,writable:!0,initializer:function(){return[]}}),h=v(s.prototype,"upView",[r.tracked],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),b=v(s.prototype,"upLines",[r.tracked],{configurable:!0,enumerable:!0,writable:!0,initializer:function(){return[]}}),y=v(s.prototype,"noMetricsReason",[r.tracked],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),v(s.prototype,"setHeight",[i.action],Object.getOwnPropertyDescriptor(s.prototype,"setHeight"),s.prototype),v(s.prototype,"calculate",[i.action],Object.getOwnPropertyDescriptor(s.prototype,"calculate"),s.prototype),s) +e.default=P,(0,t.setComponentTemplate)(O,P)})),define("consul-ui/components/topology-metrics/notifications/index",["exports","@ember/component","@ember/template-factory","@ember/component/template-only"],(function(e,t,n,l){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const r=(0,n.createTemplateFactory)({id:"PrGtFY8+",block:'[[[41,[28,[37,1],[[30,1],"create"],null],[[[41,[28,[37,1],[[30,2],"success"],null],[[[1," Your intention has been added.\\n"]],[]],[[[1," There was an error adding your intention.\\n"]],[]]]],[]],[[[41,[28,[37,1],[[30,1],"update"],null],[[[41,[28,[37,1],[[30,2],"success"],null],[[[1," Your intention has been saved.\\n"]],[]],[[[1," There was an error saving your intention.\\n"]],[]]]],[]],null]],[]]],[44,[[30,3,["errors","firstObject"]]],[[[41,[30,4,["detail"]],[[[1," "],[10,"br"],[12],[13],[1,[28,[35,3],["(",[52,[30,4,["status"]],[28,[37,3],[[30,4,["status"]],": "],null]],[30,4,["detail"]],")"],null]],[1,"\\n"]],[]],null]],[4]]],[1,"\\n"]],["@type","@status","@error","error"],false,["if","eq","let","concat"]]',moduleName:"consul-ui/components/topology-metrics/notifications/index.hbs",isStrictMode:!1}) +var i=(0,t.setComponentTemplate)(r,(0,l.default)()) +e.default=i})),define("consul-ui/components/topology-metrics/popover/index",["exports","@ember/component","@ember/template-factory","@glimmer/component"],(function(e,t,n,l){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const r=(0,n.createTemplateFactory)({id:"2ZmfKieE",block:'[[[11,0],[16,0,[29,["topology-metrics-popover ",[30,1]]]],[17,2],[12],[1,"\\n"],[44,[[28,[37,1],["top:",[30,3,["y"]],"px;left:",[30,3,["x"]],"px;"],null],[52,[28,[37,3],[[30,1],"deny"],null],"Add intention","View intention"]],[[[41,[28,[37,4],[[30,6]],null],[[[41,[28,[37,3],[[30,1],"deny"],null],[[[1," "],[8,[39,5],[[24,0,"dangerous"],[4,[38,6],[[28,[37,7],[[30,0],"popover"],null]],null]],null,[["header","body","actions"],[[[[1,"\\n "],[10,"h3"],[12],[1,"\\n "],[1,[28,[35,8],["components.consul.topology-metrics.popover.deny.header"],null]],[1,"\\n "],[13],[1,"\\n "]],[]],[[[1,"\\n "],[10,2],[12],[1,"\\n"],[41,[30,7,["Intention","HasExact"]],[[[1," "],[1,[28,[35,8],["components.consul.topology-metrics.popover.deny.body.isExact"],null]],[1,"\\n"]],[]],[[[1," "],[1,[28,[35,8],["components.consul.topology-metrics.popover.deny.body.notExact"],null]],[1,"\\n"]],[]]],[1," "],[13],[1,"\\n "]],[]],[[[1,"\\n "],[8,[30,8,["Action"]],[[24,0,"action"]],null,[["default"],[[[[1,"\\n "],[11,"button"],[24,4,"button"],[4,[38,9],["click",[30,9]],null],[12],[1,"\\n"],[41,[30,7,["Intention","HasExact"]],[[[1," "],[1,[28,[35,8],["components.consul.topology-metrics.popover.deny.action.isExact"],null]],[1,"\\n"]],[]],[[[1," "],[1,[28,[35,8],["components.consul.topology-metrics.popover.deny.action.notExact"],null]],[1,"\\n"]],[]]],[1," "],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[30,8,["Action"]],null,null,[["default"],[[[[1,"\\n "],[11,"button"],[24,0,"cancel"],[24,4,"button"],[4,[38,9],["click",[28,[37,10],[[28,[37,11],[[30,0,["popoverController","hide"]]],null]],null]],null],[12],[1,"\\n Cancel\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n "]],[8]]]]],[1,"\\n"]],[]],[[[41,[28,[37,3],[[30,1],"not-defined"],null],[[[1," "],[8,[39,5],[[24,0,"warning documentation"],[4,[38,6],[[28,[37,7],[[30,0],"popover"],null]],null]],null,[["header","body","actions"],[[[[1,"\\n "],[10,"h3"],[12],[1,"\\n "],[1,[28,[35,8],["components.consul.topology-metrics.popover.not-defined.header"],null]],[1,"\\n "],[13],[1,"\\n "]],[]],[[[1,"\\n "],[10,2],[12],[1,"\\n "],[1,[28,[35,8],["components.consul.topology-metrics.popover.not-defined.body"],[["downstream","upstream"],[[30,7,["Name"]],[30,10,["Name"]]]]]],[1,"\\n "],[13],[1,"\\n "]],[]],[[[1,"\\n "],[8,[30,11,["Action"]],[[24,0,"action"]],null,[["default"],[[[[1,"\\n "],[10,3],[15,6,[29,[[28,[37,12],["CONSUL_DOCS_URL"],null],"/connect/registration/service-registration#upstreams"]]],[14,"rel","noopener noreferrer"],[14,"target","_blank"],[12],[1,"\\n "],[1,[28,[35,8],["components.consul.topology-metrics.popover.not-defined.action"],null]],[1,"\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[30,11,["Action"]],null,null,[["default"],[[[[1,"\\n "],[11,"button"],[24,0,"cancel"],[24,4,"button"],[4,[38,9],["click",[28,[37,10],[[28,[37,11],[[30,0,["popoverController","hide"]]],null]],null]],null],[12],[1,"\\n Close\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n "]],[11]]]]],[1,"\\n"]],[]],[[[1," "],[8,[39,5],[[24,0,"info"],[4,[38,6],[[28,[37,7],[[30,0],"popover"],null]],null]],null,[["header","body","actions"],[[[[1,"\\n "],[10,"h3"],[12],[1,"\\n "],[1,[28,[35,8],["components.consul.topology-metrics.popover.l7.header"],null]],[1,"\\n "],[13],[1,"\\n "]],[]],[[[1,"\\n "],[10,2],[12],[1,"\\n "],[1,[28,[35,8],["components.consul.topology-metrics.popover.l7.body"],null]],[1,"\\n "],[13],[1,"\\n "]],[]],[[[1,"\\n "],[8,[30,12,["Action"]],[[24,0,"action"]],null,[["default"],[[[[1,"\\n "],[10,3],[15,6,[28,[37,13],["dc.services.show.intentions.edit",[28,[37,1],[[30,7,["Intention","ID"]]],null]],null]],[12],[1,"\\n "],[1,[28,[35,8],["components.consul.topology-metrics.popover.l7.action"],null]],[1,"\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[30,12,["Action"]],null,null,[["default"],[[[[1,"\\n "],[11,"button"],[24,0,"cancel"],[24,4,"button"],[4,[38,9],["click",[28,[37,10],[[28,[37,11],[[30,0,["popoverController","hide"]]],null]],null]],null],[12],[1,"\\n Close\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n "]],[12]]]]],[1,"\\n "]],[]]]],[]]],[1," "],[11,"button"],[23,5,[30,4]],[16,"aria-label",[30,5]],[24,4,"button"],[4,[38,14],[[30,0,["popover"]]],[["options","returns"],[[28,[37,15],null,[["theme","placement"],["square-tail","bottom-start"]]],[28,[37,7],[[30,0],"popoverController"],null]]]],[4,[38,9],["click",[28,[37,10],[[28,[37,11],[[30,0,["popoverController","show"]]],null]],null]],null],[12],[1,"\\n "],[13],[1,"\\n"]],[]],[[[1," "],[11,"button"],[23,5,[30,4]],[16,"aria-label",[30,5]],[24,4,"button"],[4,[38,16],[true],null],[12],[1,"\\n "],[13],[1,"\\n"]],[]]]],[4,5]]],[13],[1,"\\n"]],["@type","&attrs","@position","style","label","@disabled","@item","Actions","@oncreate","@service","Actions","Actions"],false,["let","concat","if","eq","not","informed-action","did-insert","set","t","on","fn","optional","env","href-to","with-overlay","hash","disabled"]]',moduleName:"consul-ui/components/topology-metrics/popover/index.hbs",isStrictMode:!1}) +class i extends l.default{}e.default=i,(0,t.setComponentTemplate)(r,i)})),define("consul-ui/components/topology-metrics/series/index",["exports","@ember/component","@ember/template-factory","dayjs","dayjs/plugin/calendar","d3-selection","d3-scale","d3-scale-chromatic","d3-shape","d3-array","@ember/object"],(function(e,t,n,l,r,i,o,a,u,s,c){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const d=(0,n.createTemplateFactory)({id:"AXSuGOoT",block:'[[[41,[28,[37,1],[[30,1]],null],[[[1," "],[8,[39,2],null,[["@src","@onchange","@onerror"],[[28,[37,3],["/${partition}/${nspace}/${dc}/metrics/summary-for-service/${service}/${protocol}",[28,[37,4],null,[["nspace","partition","dc","service","protocol"],[[30,2],[30,3],[30,4],[30,5],[30,6]]]]],null],[28,[37,5],[[30,0],"change"],null],[28,[37,5],[[30,0],[28,[37,6],[[33,7]],null]],[["value"],["error"]]]]],null],[1,"\\n"]],[]],null],[1,"\\n"],[1,[28,[35,8],["resize",[28,[37,5],[[30,0],"redraw"],null]],null]],[1,"\\n"],[1,[28,[35,9],[[28,[37,5],[[30,0],"redraw"],null]],null]],[1,"\\n\\n"],[41,[28,[37,1],[[33,10]],null],[[[41,[33,11,["labels"]],[[[1," "],[11,3],[24,0,"sparkline-key-link"],[4,[38,12],["click",[28,[37,13],[[30,0,["modal","open"]]],null]],null],[12],[1,"\\n Key\\n "],[13],[1,"\\n"]],[]],null]],[]],null],[1,"\\n"],[10,0],[14,0,"sparkline-wrapper"],[12],[1,"\\n "],[10,0],[14,0,"tooltip"],[12],[1,"\\n "],[10,0],[14,0,"sparkline-time"],[12],[1,"Timestamp"],[13],[1,"\\n "],[13],[1,"\\n"],[41,[33,10],[[[1," "],[8,[39,14],null,[["@noMetricsReason","@error"],[[30,1],[99,7,["@error"]]]],null],[1,"\\n"]],[]],null],[1," "],[10,"svg"],[14,0,"sparkline"],[12],[13],[1,"\\n"],[13],[1,"\\n\\n"],[8,[39,15],[[24,0,"sparkline-key"]],[["@aria"],[[28,[37,4],null,[["label"],["Metrics Key"]]]]],[["default"],[[[[1,"\\n "],[8,[39,16],null,[["@target","@name","@value"],[[30,0],"modal",[30,7]]],null],[1,"\\n "],[8,[39,17],null,[["@name"],["header"]],[["default"],[[[[1,"\\n "],[10,"h3"],[12],[1,"Metrics Key"],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,17],null,[["@name"],["body"]],[["default"],[[[[1,"\\n "],[10,0],[14,0,"sparkline-key-content"],[12],[1,"\\n "],[10,2],[12],[1,"This key describes the metrics corresponding to the graph tooltip labels in more detail."],[13],[1,"\\n "],[10,"dl"],[12],[1,"\\n"],[42,[28,[37,19],[[33,11,["labels"]]],null],null,[[[1," "],[10,"dt"],[12],[1,[30,9]],[13],[1,"\\n "],[10,"dd"],[12],[1,[30,8]],[13],[1,"\\n"]],[8,9]],null],[1," "],[13],[1,"\\n"],[41,[51,[33,11,["labels"]]],[[[1," "],[10,1],[14,0,"no-data"],[12],[1,"No metrics loaded."],[13],[1,"\\n"]],[]],null],[1," "],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,17],null,[["@name"],["actions"]],[["default"],[[[[1,"\\n "],[10,"button"],[14,0,"type-cancel"],[15,"onclick",[28,[37,5],[[30,0],[30,7,["close"]]],null]],[14,4,"button"],[12],[1,"\\n Close\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n"]],[7]]]]]],["@noMetricsReason","@nspace","@partition","@dc","@service","@protocol","modal","desc","label"],false,["if","not","data-source","uri","hash","action","mut","error","on-window","did-insert","empty","data","on","optional","topology-metrics/status","modal-dialog","ref","block-slot","each","-each-in","unless"]]',moduleName:"consul-ui/components/topology-metrics/series/index.hbs",isStrictMode:!1}) +l.default.extend(r.default) +var p=(0,t.setComponentTemplate)(d,t.default.extend({data:null,empty:!1,actions:{redraw:function(e){this.drawGraphs()},change:function(e){this.set("data",e.data.series),this.drawGraphs(),this.rerender()}},drawGraphs:function(){if(!this.data)return void(0,c.set)(this,"empty",!0) +let e=this.svg=(0,i.select)(this.element.querySelector("svg.sparkline")) +e.on("mouseover mousemove mouseout",null),e.selectAll("path").remove(),e.selectAll("rect").remove() +let t=e.node().getBoundingClientRect(),n=t.width,l=t.height,r=this.data||{},d=r.data||[],p=r.labels||{},f=r.unitSuffix||"",m=Object.keys(p).filter((e=>"Total"!=e)) +if(0==d.length||0==m.length)return void(0,c.set)(this,"empty",!0);(0,c.set)(this,"empty",!1) +let h=(0,u.stack)().keys(m).order(u.stackOrderReverse)(d),b=d.map((e=>{let t=0 +return m.forEach((n=>{t+=e[n]})),t})),y=(0,o.scaleTime)().domain((0,s.extent)(d,(e=>e.time))).range([0,n]),g=(0,o.scaleLinear)().domain([0,(0,s.max)(b)]).range([l,0]),v=(0,u.area)().x((e=>y(e.data.time))).y1((e=>g(e[0]))).y0((e=>g(e[1]))),O=["#DCE0E6","#C73445"].concat(a.schemeTableau10) +m.includes("Outbound")&&(O=["#DCE0E6","#0E40A3"].concat(a.schemeTableau10)) +let P=(0,o.scaleOrdinal)(O).domain(m) +e.selectAll("path").data(h).join("path").attr("fill",(e=>{let{key:t}=e +return P(t)})).attr("stroke",(e=>{let{key:t}=e +return P(t)})).attr("d",v) +let x=e.append("rect").attr("class","cursor").style("visibility","hidden").attr("width",1).attr("height",l).attr("x",0).attr("y",0),w=(0,i.select)(this.element.querySelector(".tooltip")) +for(var j of(w.selectAll(".sparkline-tt-legend").remove(),w.selectAll(".sparkline-tt-sum").remove(),m)){let e=w.append("div").attr("class","sparkline-tt-legend") +e.append("div").attr("class","sparkline-tt-legend-color").style("background-color",P(j)),e.append("span").text(j).append("span").attr("class","sparkline-tt-legend-value")}let _=w.selectAll(".sparkline-tt-legend-value") +m.length>1&&w.append("div").attr("class","sparkline-tt-sum").append("span").text("Total").append("span").attr("class","sparkline-tt-sum-value") +let k=this +e.on("mouseover",(function(e){w.style("visibility","visible"),x.style("visibility","visible"),k.updateTooltip(e,d,h,b,f,y,w,_,x)})).on("mousemove",(function(e){k.updateTooltip(e,d,h,b,f,y,w,_,x)})).on("mouseout",(function(e){w.style("visibility","hidden"),x.style("visibility","hidden")}))},willDestroyElement:function(){this._super(...arguments),void 0!==this.svg&&this.svg.on("mouseover mousemove mouseout",null)},updateTooltip:function(e,t,n,r,o,a,u,c,d){let[p]=(0,i.pointer)(e) +d.attr("x",p) +let m=a.invert(p) +var h=(0,s.bisector)((function(e){return e.time})).left +let b=h(t,m) +var y +u.style("left",p-22+"px").select(".sparkline-time").text((y=m,(0,l.default)(y).calendar(null,{sameDay:"[Today at] h:mm:ss A",lastDay:"[Yesterday at] h:mm:ss A",lastWeek:"[Last] dddd at h:mm:ss A",sameElse:"MMM DD at h:mm:ss A"}))),u.select(".sparkline-tt-sum-value").text(`${f(r[b])}${o}`),c.nodes().forEach(((e,t)=>{let l=n[t][b][1]-n[t][b][0];(0,i.select)(e).text(`${f(l)}${o}`)})),d.attr("x",p)}})) +function f(e){return e<1e3?Number.isInteger(e)?""+e:Number(e>=100?e.toPrecision(3):e<1?e.toFixed(2):e.toPrecision(2)):e>=1e3&&e<1e6?+(e/1e3).toPrecision(3)+"k":e>=1e6&&e<1e9?+(e/1e6).toPrecision(3)+"m":e>=1e9&&e<1e12?+(e/1e9).toPrecision(3)+"g":e>=1e12?+(e/1e12).toFixed(0)+"t":void 0}e.default=p})),define("consul-ui/components/topology-metrics/source-type/index",["exports","@ember/component","@ember/template-factory","@ember/component/template-only"],(function(e,t,n,l){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const r=(0,n.createTemplateFactory)({id:"wl8kyvfj",block:'[[[11,1],[24,0,"topology-metrics-source-type"],[4,[38,0],[[28,[37,1],[[28,[37,2],["components.consul.topology-metrics.source-type.",[30,1],".tooltip"],null]],null]],null],[12],[1,"\\n "],[1,[28,[35,1],[[28,[37,2],["components.consul.topology-metrics.source-type.",[30,1],".text"],null]],null]],[1,"\\n"],[13]],["@source"],false,["tooltip","t","concat"]]',moduleName:"consul-ui/components/topology-metrics/source-type/index.hbs",isStrictMode:!1}) +var i=(0,t.setComponentTemplate)(r,(0,l.default)()) +e.default=i})),define("consul-ui/components/topology-metrics/stats/index",["exports","@ember/component","@ember/template-factory","@glimmer/component","@glimmer/tracking","@ember/object"],(function(e,t,n,l,r,i){var o,a,u +function s(e,t,n,l){n&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(l):void 0})}function c(e,t,n,l,r){var i={} +return Object.keys(l).forEach((function(e){i[e]=l[e]})),i.enumerable=!!i.enumerable,i.configurable=!!i.configurable,("value"in i||i.initializer)&&(i.writable=!0),i=n.slice().reverse().reduce((function(n,l){return l(e,t,n)||n}),i),r&&void 0!==i.initializer&&(i.value=i.initializer?i.initializer.call(r):void 0,i.initializer=void 0),void 0===i.initializer&&(Object.defineProperty(e,t,i),i=null),i}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const d=(0,n.createTemplateFactory)({id:"OvZgaKFU",block:'[[[41,[28,[37,1],[[30,1]],null],[[[1," "],[8,[39,2],null,[["@src","@onchange","@onerror"],[[28,[37,3],["/${partition}/${nspace}/${dc}/metrics/${endpoint}/${service}/${protocol}",[28,[37,4],null,[["nspace","partition","dc","endpoint","service","protocol"],[[30,2],[30,3],[30,4],[30,5],[30,6],[28,[37,5],[[30,7],""],null]]]]],null],[28,[37,6],[[30,0],"statsUpdate"],null],[28,[37,6],[[30,0],[28,[37,7],[[33,8]],null]],[["value"],["error"]]]]],null],[1,"\\n"]],[]],null],[1,"\\n"],[11,0],[17,8],[24,0,"topology-metrics-stats"],[12],[1,"\\n"],[41,[33,9],[[[42,[28,[37,11],[[28,[37,11],[[33,12]],null]],null],null,[[[1," "],[11,"dl"],[4,[38,13],[[30,9,["desc"]]],[["options"],[[28,[37,4],null,[["allowHTML"],[true]]]]]],[12],[1,"\\n "],[10,"dt"],[12],[1,"\\n "],[1,[30,9,["value"]]],[1,"\\n "],[13],[1,"\\n "],[10,"dd"],[12],[1,"\\n "],[1,[30,9,["label"]]],[1,"\\n "],[13],[1,"\\n "],[13],[1,"\\n"]],[9]],[[[1," "],[10,1],[12],[1,"No Metrics Available"],[13],[1,"\\n"]],[]]]],[]],[[[1," "],[8,[39,14],null,[["@noMetricsReason","@error"],[[30,1],[99,8,["@error"]]]],null],[1,"\\n"]],[]]],[13]],["@noMetricsReason","@nspace","@partition","@dc","@endpoint","@service","@protocol","&attrs","stat"],false,["if","not","data-source","uri","hash","or","action","mut","error","hasLoaded","each","-track-array","stats","tooltip","topology-metrics/status"]]',moduleName:"consul-ui/components/topology-metrics/stats/index.hbs",isStrictMode:!1}) +let p=(o=class extends l.default{constructor(){super(...arguments),s(this,"stats",a,this),s(this,"hasLoaded",u,this)}statsUpdate(e){if("summary-for-service"==this.args.endpoint)this.stats=e.data.stats +else{let t=this.args.nspace||"" +0===t.length&&(t="default") +let n=`${this.args.item}.${t}.${this.args.dc}` +this.stats=e.data.stats[n]}this.stats=(this.stats||[]).slice(0,4),this.hasLoaded=!0}},a=c(o.prototype,"stats",[r.tracked],{configurable:!0,enumerable:!0,writable:!0,initializer:function(){return null}}),u=c(o.prototype,"hasLoaded",[r.tracked],{configurable:!0,enumerable:!0,writable:!0,initializer:function(){return!1}}),c(o.prototype,"statsUpdate",[i.action],Object.getOwnPropertyDescriptor(o.prototype,"statsUpdate"),o.prototype),o) +e.default=p,(0,t.setComponentTemplate)(d,p)})),define("consul-ui/components/topology-metrics/status/index",["exports","@ember/component","@ember/template-factory","@ember/component/template-only"],(function(e,t,n,l){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const r=(0,n.createTemplateFactory)({id:"weO6aWlc",block:'[[[41,[28,[37,1],[[30,1],[30,2]],null],[[[1," "],[10,1],[14,0,"topology-metrics-status-error"],[12],[1,"\\n"],[41,[28,[37,2],[[30,1],"ingress-gateway"],null],[[[1," "],[1,[28,[35,3],["components.consul.topology-metrics.status.ingress-gateway"],null]],[1,"\\n"]],[]],[[[41,[28,[37,2],[[30,1],"remote-dc"],null],[[[1," "],[1,[28,[35,3],["components.consul.topology-metrics.status.error"],null]],[1,"\\n "],[11,1],[4,[38,4],[[28,[37,3],["components.consul.topology-metrics.status.remote-dc"],null]],null],[12],[13],[1,"\\n"]],[]],[[[41,[30,2],[[[1," "],[1,[28,[35,3],["components.consul.topology-metrics.status.error"],null]],[1,"\\n "]],[]],null]],[]]]],[]]],[1," "],[13],[1,"\\n"]],[]],[[[1," "],[10,1],[14,0,"topology-metrics-status-loader"],[12],[1,[28,[35,3],["components.consul.topology-metrics.status.loading"],null]],[13],[1,"\\n"]],[]]]],["@noMetricsReason","@error"],false,["if","or","eq","t","tooltip"]]',moduleName:"consul-ui/components/topology-metrics/status/index.hbs",isStrictMode:!1}) +var i=(0,t.setComponentTemplate)(r,(0,l.default)()) +e.default=i})),define("consul-ui/components/topology-metrics/up-lines/index",["exports","@ember/component","@ember/template-factory","@glimmer/component","@glimmer/tracking","@ember/object","@ember/service"],(function(e,t,n,l,r,i,o){var a,u,s,c +function d(e,t,n,l){n&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(l):void 0})}function p(e,t,n,l,r){var i={} +return Object.keys(l).forEach((function(e){i[e]=l[e]})),i.enumerable=!!i.enumerable,i.configurable=!!i.configurable,("value"in i||i.initializer)&&(i.writable=!0),i=n.slice().reverse().reduce((function(n,l){return l(e,t,n)||n}),i),r&&void 0!==i.initializer&&(i.value=i.initializer?i.initializer.call(r):void 0,i.initializer=void 0),void 0===i.initializer&&(Object.defineProperty(e,t,i),i=null),i}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const f=(0,n.createTemplateFactory)({id:"MfMA5Fce",block:'[[[41,[28,[37,1],[[30,1,["length"]],0],null],[[[1," "],[11,"svg"],[16,"viewBox",[28,[37,2],[[30,2,["x"]]," ",[30,3,["y"]]," ",[30,3,["width"]]," ",[30,3,["height"]]],null]],[24,"preserveAspectRatio","none"],[4,[38,3],[[30,0,["getIconPositions"]]],null],[4,[38,4],[[30,0,["getIconPositions"]],[30,1]],null],[12],[1,"\\n "],[10,"defs"],[12],[1,"\\n "],[10,"marker"],[15,1,[28,[37,2],[[30,0,["guid"]],"-allow-dot"],null]],[14,0,"allow-dot"],[14,"viewBox","-2 -2 15 15"],[14,"refX","6"],[14,"refY","6"],[14,"markerWidth","6"],[14,"markerHeight","6"],[12],[1,"\\n "],[10,"circle"],[14,"cx","6"],[14,"cy","6"],[14,"r","6"],[12],[13],[1,"\\n "],[13],[1,"\\n "],[10,"marker"],[15,1,[28,[37,2],[[30,0,["guid"]],"-allow-arrow"],null]],[14,0,"allow-arrow"],[14,"viewBox","-1 -1 12 12"],[14,"refX","5"],[14,"refY","5"],[14,"markerWidth","6"],[14,"markerHeight","6"],[14,"orient","auto-start-reverse"],[12],[1,"\\n "],[10,"polygon"],[14,"points","0 0 10 5 0 10"],[12],[13],[1,"\\n "],[13],[1,"\\n "],[10,"marker"],[15,1,[28,[37,2],[[30,0,["guid"]],"-deny-dot"],null]],[14,0,"deny-dot"],[14,"viewBox","-2 -2 15 15"],[14,"refX","6"],[14,"refY","6"],[14,"markerWidth","6"],[14,"markerHeight","6"],[12],[1,"\\n "],[10,"circle"],[14,"cx","6"],[14,"cy","6"],[14,"r","6"],[12],[13],[1,"\\n "],[13],[1,"\\n "],[10,"marker"],[15,1,[28,[37,2],[[30,0,["guid"]],"-deny-arrow"],null]],[14,0,"deny-arrow"],[14,"viewBox","-1 -1 12 12"],[14,"refX","5"],[14,"refY","5"],[14,"markerWidth","6"],[14,"markerHeight","6"],[14,"orient","auto-start-reverse"],[12],[1,"\\n "],[10,"polygon"],[14,"points","0 0 10 5 0 10"],[12],[13],[1,"\\n "],[13],[1,"\\n "],[13],[1,"\\n"],[42,[28,[37,6],[[28,[37,6],[[30,1]],null]],null],null,[[[41,[28,[37,7],[[30,4,["permission"]],"deny"],null],[[[1," "],[10,"path"],[15,1,[28,[37,2],[[30,0,["guid"]],[30,4,["id"]]],null]],[15,"d",[28,[37,8],[[30,4,["dest"]]],[["src"],[[30,4,["src"]]]]]],[15,"marker-start",[28,[37,2],["url(#",[30,0,["guid"]],"-deny-dot)"],null]],[15,"marker-end",[28,[37,2],["url(#",[30,0,["guid"]],"-deny-arrow)"],null]],[15,"data-permission",[30,4,["permission"]]],[12],[13],[1,"\\n"]],[]],[[[1," "],[10,"path"],[15,1,[28,[37,2],[[30,0,["guid"]],[30,4,["id"]]],null]],[15,"d",[28,[37,8],[[30,4,["dest"]]],[["src"],[[30,4,["src"]]]]]],[15,"marker-start",[28,[37,2],["url(#",[30,0,["guid"]],"-allow-dot)"],null]],[15,"marker-end",[28,[37,2],["url(#",[30,0,["guid"]],"-allow-arrow)"],null]],[15,"data-permission",[30,4,["permission"]]],[12],[13],[1,"\\n"]],[]]]],[4]],null],[1," "],[13],[1,"\\n"]],[]],null],[42,[28,[37,6],[[28,[37,6],[[30,5]],null]],null],null,[[[41,[28,[37,9],[[28,[37,10],[[30,6,["Datacenter"]],""],null],[28,[37,11],[[28,[37,12],[[30,6,["Intention","Allowed"]]],null],[30,6,["Intention","HasPermissions"]]],null]],null],[[[1," "],[8,[39,13],null,[["@type","@position","@item","@disabled","@oncreate"],[[52,[30,6,["Intention","HasPermissions"]],"l7","deny"],[28,[37,14],["id",[28,[37,2],[[30,0,["guid"]],[30,6,["Namespace"]],[30,6,["Name"]]],null],[30,0,["iconPositions"]]],null],[30,6],false,[28,[37,15],[[30,0],[30,7],[30,8],[30,6]],null]]],null],[1,"\\n"]],[]],null]],[6]],null]],["@lines","@center","@view","line","@items","item","@oncreate","@service"],false,["if","gt","concat","did-insert","did-update","each","-track-array","eq","svg-curve","and","not-eq","or","not","topology-metrics/popover","find-by","action"]]',moduleName:"consul-ui/components/topology-metrics/up-lines/index.hbs",isStrictMode:!1}) +let m=(a=(0,o.inject)("dom"),u=class extends l.default{constructor(){super(...arguments),d(this,"iconPositions",s,this),d(this,"dom",c,this)}get guid(){return this.dom.guid(this)}getIconPositions(){const e=this.args.center,t=this.args.view,n=[...document.querySelectorAll("#upstream-lines path")] +this.iconPositions=n.map((n=>{const l=parseFloat(n.getTotalLength()),r=n.getPointAtLength(Math.ceil(.666*l)) +return{id:n.id,x:Math.round(r.x-e.x),y:Math.round(r.y-t.y)}}))}},s=p(u.prototype,"iconPositions",[r.tracked],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),c=p(u.prototype,"dom",[a],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),p(u.prototype,"getIconPositions",[i.action],Object.getOwnPropertyDescriptor(u.prototype,"getIconPositions"),u.prototype),u) +e.default=m,(0,t.setComponentTemplate)(f,m)})),define("consul-ui/components/torii-iframe-placeholder",["exports","torii/components/torii-iframe-placeholder"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +var n=t.default +e.default=n})),define("consul-ui/components/vertical-collection",["exports","@html-next/vertical-collection/components/vertical-collection/component"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/components/watcher/index",["exports","@ember/component","@ember/template-factory","@glimmer/component","@ember/object","@glimmer/tracking","@ember/runloop","@ember/service"],(function(e,t,n,l,r,i,o,a){var u,s,c,d +function p(e,t,n,l){n&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(l):void 0})}function f(e,t,n,l,r){var i={} +return Object.keys(l).forEach((function(e){i[e]=l[e]})),i.enumerable=!!i.enumerable,i.configurable=!!i.configurable,("value"in i||i.initializer)&&(i.writable=!0),i=n.slice().reverse().reduce((function(n,l){return l(e,t,n)||n}),i),r&&void 0!==i.initializer&&(i.value=i.initializer?i.initializer.call(r):void 0,i.initializer=void 0),void 0===i.initializer&&(Object.defineProperty(e,t,i),i=null),i}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const m=(0,n.createTemplateFactory)({id:"WK8VbrJT",block:'[[[18,1,[[28,[37,1],null,[["fns"],[[28,[37,1],null,[["start","stop"],[[30,0,["start"]],[30,0,["stop"]]]]]]]]]],[1,"\\n"]],["&default"],false,["yield","hash"]]',moduleName:"consul-ui/components/watcher/index.hbs",isStrictMode:!1}) +let h=(u=class extends l.default{constructor(){super(...arguments),p(this,"env",s,this),p(this,"_isPolling",c,this),p(this,"cancel",d,this)}get timeout(){return this.isTesting?300:this.args.timeout||1e4}get isTesting(){return"testing"===this.env.var("environment")}get isPolling(){const{isTesting:e,_isPolling:t}=this +return!e&&t}start(){this._isPolling=!0,this.watchTask()}stop(){this._isPolling=!1,(0,o.cancel)(this.cancel)}watchTask(){const e=(0,o.later)(this,(()=>{var e,t +null===(e=(t=this.args).watch)||void 0===e||e.call(t),this.isPolling&&this.watchTask()}),this.timeout) +this.cancel=e}},s=f(u.prototype,"env",[a.inject],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),c=f(u.prototype,"_isPolling",[i.tracked],{configurable:!0,enumerable:!0,writable:!0,initializer:function(){return!1}}),d=f(u.prototype,"cancel",[i.tracked],{configurable:!0,enumerable:!0,writable:!0,initializer:function(){return null}}),f(u.prototype,"start",[r.action],Object.getOwnPropertyDescriptor(u.prototype,"start"),u.prototype),f(u.prototype,"stop",[r.action],Object.getOwnPropertyDescriptor(u.prototype,"stop"),u.prototype),u) +e.default=h,(0,t.setComponentTemplate)(m,h)})),define("consul-ui/components/yield-slot",["exports","block-slots/components/yield-slot"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/components/yield/index",["exports","@ember/component","@ember/template-factory","@ember/component/template-only"],(function(e,t,n,l){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const r=(0,n.createTemplateFactory)({id:"uvrXCen3",block:'[[[18,1,null],[1,"\\n"]],["&default"],false,["yield"]]',moduleName:"consul-ui/components/yield/index.hbs",isStrictMode:!1}) +var i=(0,t.setComponentTemplate)(r,(0,l.default)()) +e.default=i})),define("consul-ui/controllers/_peered-resource",["exports","@ember/controller","@ember/service"],(function(e,t,n){var l,r +Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +let i=(l=class extends t.default{constructor(){var e,t,n,l +super(...arguments),e=this,t="abilities",l=this,(n=r)&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(l):void 0})}get _searchProperties(){const{searchProperties:e}=this +return this.abilities.can("use peers")?e:e.filter((e=>"PeerName"!==e))}},o=l.prototype,a="abilities",u=[n.inject],s={configurable:!0,enumerable:!0,writable:!0,initializer:null},d={},Object.keys(s).forEach((function(e){d[e]=s[e]})),d.enumerable=!!d.enumerable,d.configurable=!!d.configurable,("value"in d||d.initializer)&&(d.writable=!0),d=u.slice().reverse().reduce((function(e,t){return t(o,a,e)||e}),d),c&&void 0!==d.initializer&&(d.value=d.initializer?d.initializer.call(c):void 0,d.initializer=void 0),void 0===d.initializer&&(Object.defineProperty(o,a,d),d=null),r=d,l) +var o,a,u,s,c,d +e.default=i})),define("consul-ui/controllers/application",["exports","@ember/service","@ember/controller","@ember/application","@ember/object","consul-ui/utils/routing/transitionable"],(function(e,t,n,l,r,i){var o,a,u,s,c,d,p +function f(e,t,n,l){n&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(l):void 0})}function m(e,t,n,l,r){var i={} +return Object.keys(l).forEach((function(e){i[e]=l[e]})),i.enumerable=!!i.enumerable,i.configurable=!!i.configurable,("value"in i||i.initializer)&&(i.writable=!0),i=n.slice().reverse().reduce((function(n,l){return l(e,t,n)||n}),i),r&&void 0!==i.initializer&&(i.value=i.initializer?i.initializer.call(r):void 0,i.initializer=void 0),void 0===i.initializer&&(Object.defineProperty(e,t,i),i=null),i}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +let h=(o=(0,t.inject)("router"),a=(0,t.inject)("store"),u=(0,t.inject)("feedback"),s=class extends n.default{constructor(){super(...arguments),f(this,"router",c,this),f(this,"store",d,this),f(this,"feedback",p,this)}reauthorize(e){this.feedback.execute((()=>{this.store.invalidate() +const t={} +if(e.data){const n=e.data +if(void 0!==this.nspace){const e=(0,r.get)(n,"Namespace")||this.nspace.Name +e!==this.nspace.Name&&(t.nspace=`${e}`)}}const n=(0,l.getOwner)(this),o=this.router.currentRoute.name,a=n.lookup(`route:${o}`) +return n.lookup("route:application").refresh().promise.catch((function(e){})).then((e=>o!==this.router.currentRouteName||void 0!==t.nspace?a.transitionTo(...(0,i.default)(this.router.currentRoute,t,n)):e))}),e.type,(function(e,t){return e}),{})}},c=m(s.prototype,"router",[o],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),d=m(s.prototype,"store",[a],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),p=m(s.prototype,"feedback",[u],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),m(s.prototype,"reauthorize",[r.action],Object.getOwnPropertyDescriptor(s.prototype,"reauthorize"),s.prototype),s) +e.default=h})),define("consul-ui/controllers/dc/acls/policies/create",["exports","consul-ui/controllers/dc/acls/policies/edit"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +class n extends t.default{}e.default=n})),define("consul-ui/controllers/dc/acls/policies/edit",["exports","@ember/service","@ember/controller"],(function(e,t,n){var l,r,i +Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +let o=(l=(0,t.inject)("form"),r=class extends n.default{constructor(){var e,t,n,l +super(...arguments),e=this,t="builder",l=this,(n=i)&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(l):void 0})}init(){super.init(...arguments),this.form=this.builder.form("policy")}setProperties(e){super.setProperties(Object.keys(e).reduce(((e,t,n)=>{if("item"===t)e[t]=this.form.setData(e[t]).getData() +return e}),e))}},a=r.prototype,u="builder",s=[l],c={configurable:!0,enumerable:!0,writable:!0,initializer:null},p={},Object.keys(c).forEach((function(e){p[e]=c[e]})),p.enumerable=!!p.enumerable,p.configurable=!!p.configurable,("value"in p||p.initializer)&&(p.writable=!0),p=s.slice().reverse().reduce((function(e,t){return t(a,u,e)||e}),p),d&&void 0!==p.initializer&&(p.value=p.initializer?p.initializer.call(d):void 0,p.initializer=void 0),void 0===p.initializer&&(Object.defineProperty(a,u,p),p=null),i=p,r) +var a,u,s,c,d,p +e.default=o})) +define("consul-ui/controllers/dc/acls/roles/create",["exports","consul-ui/controllers/dc/acls/roles/edit"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +class n extends t.default{}e.default=n})),define("consul-ui/controllers/dc/acls/roles/edit",["exports","@ember/service","@ember/controller"],(function(e,t,n){var l,r,i +Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +let o=(l=(0,t.inject)("form"),r=class extends n.default{constructor(){var e,t,n,l +super(...arguments),e=this,t="builder",l=this,(n=i)&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(l):void 0})}init(){super.init(...arguments),this.form=this.builder.form("role")}setProperties(e){super.setProperties(Object.keys(e).reduce(((e,t,n)=>{if("item"===t)e[t]=this.form.setData(e[t]).getData() +return e}),e))}},a=r.prototype,u="builder",s=[l],c={configurable:!0,enumerable:!0,writable:!0,initializer:null},p={},Object.keys(c).forEach((function(e){p[e]=c[e]})),p.enumerable=!!p.enumerable,p.configurable=!!p.configurable,("value"in p||p.initializer)&&(p.writable=!0),p=s.slice().reverse().reduce((function(e,t){return t(a,u,e)||e}),p),d&&void 0!==p.initializer&&(p.value=p.initializer?p.initializer.call(d):void 0,p.initializer=void 0),void 0===p.initializer&&(Object.defineProperty(a,u,p),p=null),i=p,r) +var a,u,s,c,d,p +e.default=o})),define("consul-ui/controllers/dc/acls/tokens/create",["exports","consul-ui/controllers/dc/acls/tokens/edit"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +class n extends t.default{}e.default=n})),define("consul-ui/controllers/dc/acls/tokens/edit",["exports","@ember/controller","@ember/service"],(function(e,t,n){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +var l=t.default.extend({dom:(0,n.inject)("dom"),builder:(0,n.inject)("form"),isScoped:!1,init:function(){this._super(...arguments),this.form=this.builder.form("token")},setProperties:function(e){this._super(Object.keys(e).reduce(((e,t,n)=>{if("item"===t)e[t]=this.form.setData(e[t]).getData() +return e}),e))},actions:{change:function(e,t,n){const l=this.dom.normalizeEvent(e,t),r=this.form +try{r.handleEvent(l)}catch(i){throw l.target.name,i}}}}) +e.default=l})),define("consul-ui/controllers/dc/nodes/index",["exports","consul-ui/controllers/_peered-resource"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +class n extends t.default{}e.default=n})),define("consul-ui/controllers/dc/peers/index",["exports","@ember/controller","@ember/service"],(function(e,t,n){var l,r +Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +let i=(l=class extends t.default{constructor(){var e,t,n,l,i,o,a +super(...arguments),e=this,t="router",l=this,(n=r)&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(l):void 0}),a=(e,t)=>{null==e||e(),this.router.transitionTo("dc.peers.show",t.Name)},(o="redirectToPeerShow")in(i=this)?Object.defineProperty(i,o,{value:a,enumerable:!0,configurable:!0,writable:!0}):i[o]=a}},o=l.prototype,a="router",u=[n.inject],s={configurable:!0,enumerable:!0,writable:!0,initializer:null},d={},Object.keys(s).forEach((function(e){d[e]=s[e]})),d.enumerable=!!d.enumerable,d.configurable=!!d.configurable,("value"in d||d.initializer)&&(d.writable=!0),d=u.slice().reverse().reduce((function(e,t){return t(o,a,e)||e}),d),c&&void 0!==d.initializer&&(d.value=d.initializer?d.initializer.call(c):void 0,d.initializer=void 0),void 0===d.initializer&&(Object.defineProperty(o,a,d),d=null),r=d,l) +var o,a,u,s,c,d +e.default=i})),define("consul-ui/controllers/dc/peers/show/exported",["exports","@ember/controller","@glimmer/tracking","@ember/object"],(function(e,t,n,l){var r,i +function o(e,t,n,l,r){var i={} +return Object.keys(l).forEach((function(e){i[e]=l[e]})),i.enumerable=!!i.enumerable,i.configurable=!!i.configurable,("value"in i||i.initializer)&&(i.writable=!0),i=n.slice().reverse().reduce((function(n,l){return l(e,t,n)||n}),i),r&&void 0!==i.initializer&&(i.value=i.initializer?i.initializer.call(r):void 0,i.initializer=void 0),void 0===i.initializer&&(Object.defineProperty(e,t,i),i=null),i}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +let a=(r=class extends t.default{constructor(){var e,t,n,l,r,o,a +super(...arguments),n={search:{as:"filter"}},(t="queryParams")in(e=this)?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,l=this,r="search",a=this,(o=i)&&Object.defineProperty(l,r,{enumerable:o.enumerable,configurable:o.configurable,writable:o.writable,value:o.initializer?o.initializer.call(a):void 0})}updateSearch(e){this.search=e}},i=o(r.prototype,"search",[n.tracked],{configurable:!0,enumerable:!0,writable:!0,initializer:function(){return""}}),o(r.prototype,"updateSearch",[l.action],Object.getOwnPropertyDescriptor(r.prototype,"updateSearch"),r.prototype),r) +e.default=a})),define("consul-ui/controllers/dc/peers/show/index",["exports","@ember/controller","@ember/service","@ember/object"],(function(e,t,n,l){var r,i +function o(e,t,n,l,r){var i={} +return Object.keys(l).forEach((function(e){i[e]=l[e]})),i.enumerable=!!i.enumerable,i.configurable=!!i.configurable,("value"in i||i.initializer)&&(i.writable=!0),i=n.slice().reverse().reduce((function(n,l){return l(e,t,n)||n}),i),r&&void 0!==i.initializer&&(i.value=i.initializer?i.initializer.call(r):void 0,i.initializer=void 0),void 0===i.initializer&&(Object.defineProperty(e,t,i),i=null),i}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +let a=(r=class extends t.default{constructor(){var e,t,n,l +super(...arguments),e=this,t="router",l=this,(n=i)&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(l):void 0})}transitionToImported(){this.router.replaceWith("dc.peers.show.imported")}},i=o(r.prototype,"router",[n.inject],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),o(r.prototype,"transitionToImported",[l.action],Object.getOwnPropertyDescriptor(r.prototype,"transitionToImported"),r.prototype),r) +e.default=a})),define("consul-ui/controllers/dc/services/index",["exports","consul-ui/controllers/_peered-resource"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +class n extends t.default{}e.default=n})),define("consul-ui/controllers/dc/services/instance/healthchecks",["exports","@ember/controller","@ember/object"],(function(e,t,n){var l +function r(e,t,n,l,r){var i={} +return Object.keys(l).forEach((function(e){i[e]=l[e]})),i.enumerable=!!i.enumerable,i.configurable=!!i.configurable,("value"in i||i.initializer)&&(i.writable=!0),i=n.slice().reverse().reduce((function(n,l){return l(e,t,n)||n}),i),r&&void 0!==i.initializer&&(i.value=i.initializer?i.initializer.call(r):void 0,i.initializer=void 0),void 0===i.initializer&&(Object.defineProperty(e,t,i),i=null),i}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +let i=(r((l=class extends t.default{syntheticNodeSearchPropertyFilter(e,t){var n +return!(null!==(n=e.Node.Meta)&&void 0!==n&&n["synthetic-node"]&&"Node"===t)}syntheticNodeHealthCheckFilter(e,t,n,l){var r +return!(null!==(r=e.Node.Meta)&&void 0!==r&&r["synthetic-node"]&&"node"===(null==t?void 0:t.Kind))}}).prototype,"syntheticNodeSearchPropertyFilter",[n.action],Object.getOwnPropertyDescriptor(l.prototype,"syntheticNodeSearchPropertyFilter"),l.prototype),r(l.prototype,"syntheticNodeHealthCheckFilter",[n.action],Object.getOwnPropertyDescriptor(l.prototype,"syntheticNodeHealthCheckFilter"),l.prototype),l) +e.default=i})),define("consul-ui/data-adapter",["exports","@ember-data/debug"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/decorators/data-source",["exports","@ember/debug","wayfarer"],(function(e,t,n){Object.defineProperty(e,"__esModule",{value:!0}),e.match=e.default=void 0 +const l=(0,n.default)(),r={} +e.default=e=>(n,i,o)=>((0,t.runInDebug)((()=>{r[e]={cls:n,method:i}})),l.on(e,(function(e,t,l){const r=t.lookup("service:container").get(n) +return t=>o.value.apply(r,[e,t,l])})),o) +e.match=e=>l.match(e),(0,t.runInDebug)((()=>{window.DataSourceRoutes=()=>{const e=window.ConsulUi.__container__.lookup("service:container"),t=window.open("","_blank") +t.document.write(`\n\n
      \n${Object.entries(r).map((t=>{let[n,l]=t,r=e.keyForClass(l.cls).split("/").pop()
      +return r=r.split("-").map((e=>`${e[0].toUpperCase()}${e.substr(1)}`)).join(""),`${n}\n      ${r}Repository.${l.method}(params)\n\n`})).join("")}\n  
      \n\n `),t.focus()}}))})),define("consul-ui/decorators/replace",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=e.nullValue=e.replace=void 0 +const t=(e,t)=>(n,l,r)=>({get:function(){const n=r.get.apply(this,arguments) +return n===e?t:n},set:function(){return r.set.apply(this,arguments)}}) +e.replace=t +e.nullValue=function(e){return t(null,e)} +var n=t +e.default=n})),define("consul-ui/env",["exports","consul-ui/config/environment","consul-ui/utils/get-environment"],(function(e,t,n){Object.defineProperty(e,"__esModule",{value:!0}),e.env=void 0 +const l=(0,n.default)(t.default,window,document) +e.env=l})),define("consul-ui/filter/predicates/auth-method",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +e.default={kind:{kubernetes:(e,t)=>e.Type===t,jwt:(e,t)=>e.Type===t,oidc:(e,t)=>e.Type===t},source:{local:(e,t)=>e.TokenLocality===t,global:(e,t)=>e.TokenLocality===t}}})),define("consul-ui/filter/predicates/health-check",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +e.default={status:{passing:(e,t)=>e.Status===t,warning:(e,t)=>e.Status===t,critical:(e,t)=>e.Status===t},kind:{service:(e,t)=>e.Kind===t,node:(e,t)=>e.Kind===t},check:{serf:(e,t)=>e.Type===t,script:(e,t)=>e.Type===t,http:(e,t)=>e.Type===t,tcp:(e,t)=>e.Type===t,ttl:(e,t)=>e.Type===t,docker:(e,t)=>e.Type===t,grpc:(e,t)=>e.Type===t,alias:(e,t)=>e.Type===t}}})),define("consul-ui/filter/predicates/intention",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +e.default={access:{allow:(e,t)=>e.Action===t,deny:(e,t)=>e.Action===t,"app-aware":(e,t)=>void 0===e.Action}}})),define("consul-ui/filter/predicates/kv",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +e.default={kind:{folder:(e,t)=>e.isFolder,key:(e,t)=>!e.isFolder}}})),define("consul-ui/filter/predicates/node",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +e.default={status:{passing:(e,t)=>e.Status===t,warning:(e,t)=>e.Status===t,critical:(e,t)=>e.Status===t}}})),define("consul-ui/filter/predicates/peer",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +e.default={state:{pending:(e,t)=>e.State.toLowerCase()===t,establishing:(e,t)=>e.State.toLowerCase()===t,active:(e,t)=>e.State.toLowerCase()===t,failing:(e,t)=>e.State.toLowerCase()===t,terminated:(e,t)=>e.State.toLowerCase()===t,deleting:(e,t)=>e.State.toLowerCase()===t}}})),define("consul-ui/filter/predicates/policy",["exports","mnemonist/set"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +var n={kind:{"global-management":(e,t)=>e.isGlobalManagement,standard:(e,t)=>!e.isGlobalManagement},datacenter:(e,n)=>void 0===e.Datacenters||t.default.intersectionSize(n,new Set(e.Datacenters))>0} +e.default=n})),define("consul-ui/filter/predicates/service-instance",["exports","mnemonist/set"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +var n={status:{passing:(e,t)=>e.Status===t,warning:(e,t)=>e.Status===t,critical:(e,t)=>e.Status===t,empty:(e,t)=>0===e.ServiceChecks.length},source:(e,n)=>0!==t.default.intersectionSize(n,new Set(e.ExternalSources||[]))} +e.default=n})),define("consul-ui/filter/predicates/service",["exports","mnemonist/set"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +var n={kind:{"api-gateway":(e,t)=>e.Kind===t,"ingress-gateway":(e,t)=>e.Kind===t,"terminating-gateway":(e,t)=>e.Kind===t,"mesh-gateway":(e,t)=>e.Kind===t,service:(e,t)=>!e.Kind,"in-mesh":(e,t)=>e.InMesh,"not-in-mesh":(e,t)=>!e.InMesh},status:{passing:(e,t)=>e.MeshStatus===t,warning:(e,t)=>e.MeshStatus===t,critical:(e,t)=>e.MeshStatus===t,empty:(e,t)=>0===e.MeshChecksTotal,unknown:e=>e.peerIsFailing||e.isZeroCountButPeered},instance:{registered:(e,t)=>e.InstanceCount>0,"not-registered":(e,t)=>0===e.InstanceCount},source:(e,n)=>{let l=!1 +return n.includes("consul")&&(l=!e.ExternalSources||0===e.ExternalSources.length||1===e.ExternalSources.length&&""===e.ExternalSources[0]||e.PeerName),0!==t.default.intersectionSize(n,new Set(e.ExternalSources||[]))||n.includes(e.Partition)||l}} +e.default=n})),define("consul-ui/filter/predicates/token",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +e.default={kind:{"global-management":(e,t)=>e.isGlobalManagement,global:(e,t)=>!e.Local,local:(e,t)=>e.Local}}})),define("consul-ui/flash/object",["exports","ember-cli-flash/flash/object"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/formats",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +e.default={time:{hhmmss:{hour:"numeric",minute:"numeric",second:"numeric"}},date:{hhmmss:{hour:"numeric",minute:"numeric",second:"numeric"}},number:{compact:{notation:"compact"},EUR:{style:"currency",currency:"EUR",minimumFractionDigits:2,maximumFractionDigits:2},USD:{style:"currency",currency:"USD",minimumFractionDigits:2,maximumFractionDigits:2}}}})),define("consul-ui/forms/intention",["exports","consul-ui/validations/intention","consul-ui/utils/form/builder"],(function(e,t,n){Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(e){let n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:t.default,i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:l +return i(n,{}).setValidators(r)} +const l=(0,n.default)()})),define("consul-ui/forms/kv",["exports","consul-ui/validations/kv","consul-ui/utils/form/builder"],(function(e,t,n){Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(e){let n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:t.default,i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:l +return i(n,{}).setValidators(r)} +const l=(0,n.default)()})),define("consul-ui/forms/policy",["exports","consul-ui/validations/policy","consul-ui/utils/form/builder"],(function(e,t,n){Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(e){let n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"policy",r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:t.default,i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:l +return i(n,{Datacenters:{type:"array"}}).setValidators(r)} +const l=(0,n.default)()})),define("consul-ui/forms/role",["exports","consul-ui/validations/role","consul-ui/utils/form/builder"],(function(e,t,n){Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(e){let n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"role",r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:t.default,i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:l +return i(n,{}).setValidators(r).add(e.form("policy"))} +const l=(0,n.default)()})) +define("consul-ui/forms/token",["exports","consul-ui/validations/token","consul-ui/utils/form/builder"],(function(e,t,n){Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(e){let n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:t.default,i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:l +return i(n,{}).setValidators(r).add(e.form("policy")).add(e.form("role"))} +const l=(0,n.default)()})),define("consul-ui/helpers/-element",["exports","ember-element-helper/helpers/-element"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/helpers/abs",["exports","ember-math-helpers/helpers/abs"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"abs",{enumerable:!0,get:function(){return t.abs}})})),define("consul-ui/helpers/acos",["exports","ember-math-helpers/helpers/acos"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"acos",{enumerable:!0,get:function(){return t.acos}})})),define("consul-ui/helpers/acosh",["exports","ember-math-helpers/helpers/acosh"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"acosh",{enumerable:!0,get:function(){return t.acosh}})})),define("consul-ui/helpers/add",["exports","ember-math-helpers/helpers/add"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"add",{enumerable:!0,get:function(){return t.add}})})),define("consul-ui/helpers/adopt-styles",["exports","@ember/component/helper","@ember/debug","@lit/reactive-element"],(function(e,t,n,l){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +class r extends t.default{compute(e,t){let[n,r]=e +Array.isArray(r)||(r=[r]),(0,l.adoptStyles)(n,r)}}e.default=r})),define("consul-ui/helpers/and",["exports","ember-truth-helpers/helpers/and"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"and",{enumerable:!0,get:function(){return t.and}})})),define("consul-ui/helpers/app-version",["exports","@ember/component/helper","consul-ui/config/environment","ember-cli-app-version/utils/regexp"],(function(e,t,n,l){function r(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{} +const r=n.default.APP.version +let i=t.versionOnly||t.hideSha,o=t.shaOnly||t.hideVersion,a=null +return i&&(t.showExtended&&(a=r.match(l.versionExtendedRegExp)),a||(a=r.match(l.versionRegExp))),o&&(a=r.match(l.shaRegExp)),a?a[0]:r}Object.defineProperty(e,"__esModule",{value:!0}),e.appVersion=r,e.default=void 0 +var i=(0,t.helper)(r) +e.default=i})),define("consul-ui/helpers/append",["exports","ember-composable-helpers/helpers/append"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"append",{enumerable:!0,get:function(){return t.append}})})),define("consul-ui/helpers/array-concat",["exports","ember-array-fns/helpers/array-concat"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"arrayConcat",{enumerable:!0,get:function(){return t.arrayConcat}})})),define("consul-ui/helpers/array-every",["exports","ember-array-fns/helpers/array-every"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"arrayEvery",{enumerable:!0,get:function(){return t.arrayEvery}})})),define("consul-ui/helpers/array-filter",["exports","ember-array-fns/helpers/array-filter"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"arrayFilter",{enumerable:!0,get:function(){return t.arrayFilter}})})),define("consul-ui/helpers/array-find-index",["exports","ember-array-fns/helpers/array-find-index"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"arrayFindIndex",{enumerable:!0,get:function(){return t.arrayFindIndex}})})),define("consul-ui/helpers/array-find",["exports","ember-array-fns/helpers/array-find"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"arrayFind",{enumerable:!0,get:function(){return t.arrayFind}})})),define("consul-ui/helpers/array-includes",["exports","ember-array-fns/helpers/array-includes"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"arrayIncludes",{enumerable:!0,get:function(){return t.arrayIncludes}})})),define("consul-ui/helpers/array-index-of",["exports","ember-array-fns/helpers/array-index-of"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"arrayIndexOf",{enumerable:!0,get:function(){return t.arrayIndexOf}})})),define("consul-ui/helpers/array-is-array",["exports","ember-array-fns/helpers/array-is-array"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"arrayIsArray",{enumerable:!0,get:function(){return t.arrayIsArray}})})),define("consul-ui/helpers/array-is-first-element",["exports","ember-array-fns/helpers/array-is-first-element"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"arrayIsFirstElement",{enumerable:!0,get:function(){return t.arrayIsFirstElement}})})),define("consul-ui/helpers/array-is-last-element",["exports","ember-array-fns/helpers/array-is-last-element"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"arrayIsLastElement",{enumerable:!0,get:function(){return t.arrayIsLastElement}})})),define("consul-ui/helpers/array-join",["exports","ember-array-fns/helpers/array-join"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"arrayJoin",{enumerable:!0,get:function(){return t.arrayJoin}})})),define("consul-ui/helpers/array-last-index-of",["exports","ember-array-fns/helpers/array-last-index-of"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"arrayLastIndexOf",{enumerable:!0,get:function(){return t.arrayLastIndexOf}})})),define("consul-ui/helpers/array-map",["exports","ember-array-fns/helpers/array-map"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"arrayMap",{enumerable:!0,get:function(){return t.arrayMap}})})),define("consul-ui/helpers/array-reduce",["exports","ember-array-fns/helpers/array-reduce"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"arrayReduce",{enumerable:!0,get:function(){return t.arrayReduce}})})),define("consul-ui/helpers/array-reverse",["exports","ember-array-fns/helpers/array-reverse"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"arrayReverse",{enumerable:!0,get:function(){return t.arrayReverse}})})),define("consul-ui/helpers/array-slice",["exports","ember-array-fns/helpers/array-slice"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"arraySlice",{enumerable:!0,get:function(){return t.arraySlice}})})),define("consul-ui/helpers/array-some",["exports","ember-array-fns/helpers/array-some"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"arraySome",{enumerable:!0,get:function(){return t.arraySome}})})),define("consul-ui/helpers/array-sort",["exports","ember-array-fns/helpers/array-sort"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"arraySort",{enumerable:!0,get:function(){return t.arraySort}})})),define("consul-ui/helpers/array-splice",["exports","ember-array-fns/helpers/array-splice"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"arraySplice",{enumerable:!0,get:function(){return t.arraySplice}})})),define("consul-ui/helpers/asin",["exports","ember-math-helpers/helpers/asin"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"asin",{enumerable:!0,get:function(){return t.asin}})})) +define("consul-ui/helpers/asinh",["exports","ember-math-helpers/helpers/asinh"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"asinh",{enumerable:!0,get:function(){return t.asinh}})})),define("consul-ui/helpers/assign",["exports","ember-assign-helper/helpers/assign"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"assign",{enumerable:!0,get:function(){return t.assign}})})),define("consul-ui/helpers/atan",["exports","ember-math-helpers/helpers/atan"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"atan",{enumerable:!0,get:function(){return t.atan}})})),define("consul-ui/helpers/atan2",["exports","ember-math-helpers/helpers/atan2"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"atan2",{enumerable:!0,get:function(){return t.atan2}})})),define("consul-ui/helpers/atanh",["exports","ember-math-helpers/helpers/atanh"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"atanh",{enumerable:!0,get:function(){return t.atanh}})})),define("consul-ui/helpers/atob",["exports","@ember/component/helper","consul-ui/utils/atob"],(function(e,t,n){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +var l=(0,t.helper)((function(e){let[t=""]=e +return(0,n.default)(t)})) +e.default=l})),define("consul-ui/helpers/block-params",["exports","block-slots/helpers/block-params"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/helpers/cached-model",["exports","@ember/component/helper","@ember/application"],(function(e,t,n){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +class l extends t.default{compute(e,t){let[l,r]=e +return(0,n.getOwner)(this).lookup(`service:repository/${l}`).cached(r)}}e.default=l})),define("consul-ui/helpers/call",["exports","ember-composable-helpers/helpers/call"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"call",{enumerable:!0,get:function(){return t.call}})})),define("consul-ui/helpers/can",["exports","ember-can/helpers/can"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/helpers/cancel-all",["exports","ember-concurrency/helpers/cancel-all"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/helpers/cannot",["exports","ember-can/helpers/cannot"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/helpers/capitalize",["exports","ember-cli-string-helpers/helpers/capitalize"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"capitalize",{enumerable:!0,get:function(){return t.capitalize}})})),define("consul-ui/helpers/cbrt",["exports","ember-math-helpers/helpers/cbrt"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"cbrt",{enumerable:!0,get:function(){return t.cbrt}})})),define("consul-ui/helpers/ceil",["exports","ember-math-helpers/helpers/ceil"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"ceil",{enumerable:!0,get:function(){return t.ceil}})})),define("consul-ui/helpers/changeset-get",["exports","ember-changeset/helpers/changeset-get"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/helpers/changeset-set",["exports","ember-changeset/helpers/changeset-set"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"changesetSet",{enumerable:!0,get:function(){return t.changesetSet}})})),define("consul-ui/helpers/changeset",["exports","ember-changeset-validations/helpers/changeset"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"changeset",{enumerable:!0,get:function(){return t.changeset}})})),define("consul-ui/helpers/chunk",["exports","ember-composable-helpers/helpers/chunk"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"chunk",{enumerable:!0,get:function(){return t.chunk}})})),define("consul-ui/helpers/class-map",["exports","@ember/component/helper"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +var n=(0,t.helper)((e=>{const t=e.filter(Boolean).filter((e=>"string"==typeof e||e[e.length-1])).map((e=>"string"==typeof e?e:e[0])).join(" ") +return t.length>0?t:void 0})) +e.default=n})),define("consul-ui/helpers/classify",["exports","ember-cli-string-helpers/helpers/classify"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"classify",{enumerable:!0,get:function(){return t.classify}})})),define("consul-ui/helpers/clz32",["exports","ember-math-helpers/helpers/clz32"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"clz32",{enumerable:!0,get:function(){return t.clz32}})})),define("consul-ui/helpers/collection",["exports","@ember/component/helper","@ember/object","consul-ui/models/service","consul-ui/models/service-instance"],(function(e,t,n,l,r){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const i={service:l.Collection,"service-instance":r.Collection} +class o{}class a extends t.default{compute(e,t){let[l,r]=e +if(l.length>0){const e=(0,n.get)(l,"firstObject")._internalModel.modelName +return new(0,i[e])(l)}return new o}}e.default=a})),define("consul-ui/helpers/compact",["exports","ember-composable-helpers/helpers/compact"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/helpers/compute",["exports","ember-composable-helpers/helpers/compute"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"compute",{enumerable:!0,get:function(){return t.compute}})})),define("consul-ui/helpers/contains",["exports","ember-composable-helpers/helpers/contains"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"contains",{enumerable:!0,get:function(){return t.contains}})})),define("consul-ui/helpers/cos",["exports","ember-math-helpers/helpers/cos"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"cos",{enumerable:!0,get:function(){return t.cos}})})),define("consul-ui/helpers/cosh",["exports","ember-math-helpers/helpers/cosh"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"cosh",{enumerable:!0,get:function(){return t.cosh}})})),define("consul-ui/helpers/css-map",["exports","@ember/component/helper","@lit/reactive-element"],(function(e,t,n){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +var l=(0,t.helper)((e=>e.filter((e=>e instanceof n.CSSResult||e[e.length-1])).map((e=>e instanceof n.CSSResult?e:e[0])))) +e.default=l})),define("consul-ui/helpers/css",["exports","@ember/component/helper","@lit/reactive-element"],(function(e,t,n){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +class l extends t.default{compute(e,t){let[l]=e +return(0,n.css)([l])}}e.default=l})) +define("consul-ui/helpers/dec",["exports","ember-composable-helpers/helpers/dec"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"dec",{enumerable:!0,get:function(){return t.dec}})})),define("consul-ui/helpers/did-insert",["exports","ember-render-helpers/helpers/did-insert"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/helpers/did-update",["exports","ember-render-helpers/helpers/did-update"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/helpers/div",["exports","ember-math-helpers/helpers/div"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"div",{enumerable:!0,get:function(){return t.div}})})),define("consul-ui/helpers/document-attrs",["exports","@ember/component/helper","@ember/service","@ember/debug","mnemonist/multi-map"],(function(e,t,n,l,r){var i,o,a +Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const u=new Map,s=new WeakMap +let c=(i=(0,n.inject)("-document"),o=class extends t.default{constructor(){var e,t,n,l +super(...arguments),e=this,t="document",l=this,(n=a)&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(l):void 0})}compute(e,t){this.synchronize(this.document.documentElement,t)}willDestroy(){this.synchronize(this.document.documentElement),s.delete(this)}synchronize(e,t){const n=s.get(this) +return n&&Object.entries(n).forEach((e=>{let[t,n]=e,l=u.get(t) +void 0!==l&&[...new Set(n.split(" "))].map((e=>l.remove(e,this)))})),t&&(s.set(this,t),[...Object.entries(t)].forEach((e=>{let[t,n]=e,l=u.get(t) +void 0===l&&(l=new r.default(Set),u.set(t,l)),[...new Set(n.split(" "))].map((e=>{0===l.count(e)&&l.set(e,null),l.set(e,this)}))}))),[...u.entries()].forEach((t=>{let[n,r]=t,i="attr" +"class"===n?i=n:n.startsWith("data-")&&(i="data"),[...r.keys()].forEach((t=>{if(1===r.count(t)){if("class"===i)e.classList.remove(t) +else(0,l.runInDebug)((()=>{throw new Error(`${i} is not implemented yet`)})) +r.delete(t),0===r.size&&u.delete(n)}else if("class"===i)e.classList.add(t) +else(0,l.runInDebug)((()=>{throw new Error(`${i} is not implemented yet`)}))}))})),u}},d=o.prototype,p="document",f=[i],m={configurable:!0,enumerable:!0,writable:!0,initializer:null},b={},Object.keys(m).forEach((function(e){b[e]=m[e]})),b.enumerable=!!b.enumerable,b.configurable=!!b.configurable,("value"in b||b.initializer)&&(b.writable=!0),b=f.slice().reverse().reduce((function(e,t){return t(d,p,e)||e}),b),h&&void 0!==b.initializer&&(b.value=b.initializer?b.initializer.call(h):void 0,b.initializer=void 0),void 0===b.initializer&&(Object.defineProperty(d,p,b),b=null),a=b,o) +var d,p,f,m,h,b +e.default=c})),define("consul-ui/helpers/dom-position",["exports","@ember/component/helper"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +class n extends t.default{compute(e,t){let[n]=e,{from:l,offset:r=!1}=t +return e=>{if("function"==typeof n){let t,i +if(r)i=e.currentTarget,t={width:i.offsetWidth,left:i.offsetLeft,height:i.offsetHeight,top:i.offsetTop} +else if(i=e.target,t=i.getBoundingClientRect(),void 0!==l){const e=l.getBoundingClientRect() +t.x=t.x-e.x,t.y=t.y-e.y}return n(t)}{const t=e.target,l=t.getBoundingClientRect() +n.forEach((e=>{let[n,r]=e +t.style[r]=`${l[n]}px`}))}}}}e.default=n})),define("consul-ui/helpers/drop",["exports","ember-composable-helpers/helpers/drop"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/helpers/duration-from",["exports","@ember/component/helper","@ember/service"],(function(e,t,n){var l,r,i +Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +let o=(l=(0,n.inject)("temporal"),r=class extends t.default{constructor(){var e,t,n,l +super(...arguments),e=this,t="temporal",l=this,(n=i)&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(l):void 0})}compute(e,t){let[n]=e +return this.temporal.durationFrom(n)}},a=r.prototype,u="temporal",s=[l],c={configurable:!0,enumerable:!0,writable:!0,initializer:null},p={},Object.keys(c).forEach((function(e){p[e]=c[e]})),p.enumerable=!!p.enumerable,p.configurable=!!p.configurable,("value"in p||p.initializer)&&(p.writable=!0),p=s.slice().reverse().reduce((function(e,t){return t(a,u,e)||e}),p),d&&void 0!==p.initializer&&(p.value=p.initializer?p.initializer.call(d):void 0,p.initializer=void 0),void 0===p.initializer&&(Object.defineProperty(a,u,p),p=null),i=p,r) +var a,u,s,c,d,p +e.default=o})),define("consul-ui/helpers/element",["exports","ember-element-helper/helpers/element"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/helpers/ember-power-select-is-group",["exports","ember-power-select/helpers/ember-power-select-is-group"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"emberPowerSelectIsGroup",{enumerable:!0,get:function(){return t.emberPowerSelectIsGroup}})})),define("consul-ui/helpers/ember-power-select-is-selected",["exports","ember-power-select/helpers/ember-power-select-is-selected"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"emberPowerSelectIsSelected",{enumerable:!0,get:function(){return t.emberPowerSelectIsSelected}})})),define("consul-ui/helpers/ensure-safe-component",["exports","@embroider/util"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.EnsureSafeComponentHelper}})})),define("consul-ui/helpers/entries",["exports","ember-composable-helpers/helpers/entries"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"entries",{enumerable:!0,get:function(){return t.entries}})})),define("consul-ui/helpers/env",["exports","@ember/component/helper","@ember/service"],(function(e,t,n){var l,r,i +Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +let o=(l=(0,n.inject)("env"),r=class extends t.default{constructor(){var e,t,n,l +super(...arguments),e=this,t="env",l=this,(n=i)&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(l):void 0})}compute(e,t){let[n,l=""]=e +const r=this.env.var(n) +return null!=r?r:l}},a=r.prototype,u="env",s=[l],c={configurable:!0,enumerable:!0,writable:!0,initializer:null},p={},Object.keys(c).forEach((function(e){p[e]=c[e]})),p.enumerable=!!p.enumerable,p.configurable=!!p.configurable,("value"in p||p.initializer)&&(p.writable=!0),p=s.slice().reverse().reduce((function(e,t){return t(a,u,e)||e}),p),d&&void 0!==p.initializer&&(p.value=p.initializer?p.initializer.call(d):void 0,p.initializer=void 0),void 0===p.initializer&&(Object.defineProperty(a,u,p),p=null),i=p,r) +var a,u,s,c,d,p +e.default=o})),define("consul-ui/helpers/eq",["exports","ember-truth-helpers/helpers/equal"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"equal",{enumerable:!0,get:function(){return t.equal}})})),define("consul-ui/helpers/exp",["exports","ember-math-helpers/helpers/exp"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"exp",{enumerable:!0,get:function(){return t.exp}})})),define("consul-ui/helpers/expm1",["exports","ember-math-helpers/helpers/expm1"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"expm1",{enumerable:!0,get:function(){return t.expm1}})})),define("consul-ui/helpers/filter-by",["exports","ember-composable-helpers/helpers/filter-by"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/helpers/filter",["exports","ember-composable-helpers/helpers/filter"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/helpers/find-by",["exports","ember-composable-helpers/helpers/find-by"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/helpers/fixed-grid-layout",["exports","@ember/component/helper","ember-collection/layouts/grid"],(function(e,t,n){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +var l=(0,t.helper)((function(e){return new n.default(e[0],e[1])})) +e.default=l})),define("consul-ui/helpers/flatten-property",["exports","@ember/component/helper"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +var n=(0,t.helper)((function e(t,n){let[l,r]=t +const i=n.pages||[] +return i.push(...l.pages),l.children.forEach((t=>e([t],{pages:i}))),i})) +e.default=n})),define("consul-ui/helpers/flatten",["exports","ember-composable-helpers/helpers/flatten"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"flatten",{enumerable:!0,get:function(){return t.flatten}})})),define("consul-ui/helpers/floor",["exports","ember-math-helpers/helpers/floor"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"floor",{enumerable:!0,get:function(){return t.floor}})})),define("consul-ui/helpers/format-date",["exports","ember-intl/helpers/format-date"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/helpers/format-message",["exports","ember-intl/helpers/format-message"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/helpers/format-number",["exports","ember-intl/helpers/format-number"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/helpers/format-relative",["exports","ember-intl/helpers/format-relative"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/helpers/format-short-time",["exports","@ember/component/helper"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +var n=(0,t.helper)((function(e,t){let n,l,r,i,[o]=e +i=Math.floor(o/1e3),r=Math.floor(i/60),i%=60,l=Math.floor(r/60),r%=60,n=Math.floor(l/24),l%=24 +const a=n,u=l,s=r,c=i +switch(!0){case 0!==a:return a+"d" +case 0!==u:return u+"h" +case 0!==s:return s+"m" +default:return c+"s"}})) +e.default=n})),define("consul-ui/helpers/format-time",["exports","ember-intl/helpers/format-time"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})) +define("consul-ui/helpers/from-entries",["exports","ember-composable-helpers/helpers/from-entries"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"fromEntries",{enumerable:!0,get:function(){return t.fromEntries}})})),define("consul-ui/helpers/fround",["exports","ember-math-helpers/helpers/fround"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"fround",{enumerable:!0,get:function(){return t.fround}})})),define("consul-ui/helpers/gcd",["exports","ember-math-helpers/helpers/gcd"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"gcd",{enumerable:!0,get:function(){return t.gcd}})})),define("consul-ui/helpers/group-by",["exports","ember-composable-helpers/helpers/group-by"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/helpers/gt",["exports","ember-truth-helpers/helpers/gt"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"gt",{enumerable:!0,get:function(){return t.gt}})})),define("consul-ui/helpers/gte",["exports","ember-truth-helpers/helpers/gte"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"gte",{enumerable:!0,get:function(){return t.gte}})})),define("consul-ui/helpers/has-next",["exports","ember-composable-helpers/helpers/has-next"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"hasNext",{enumerable:!0,get:function(){return t.hasNext}})})),define("consul-ui/helpers/has-previous",["exports","ember-composable-helpers/helpers/has-previous"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"hasPrevious",{enumerable:!0,get:function(){return t.hasPrevious}})})),define("consul-ui/helpers/hds-link-to-models",["exports","@hashicorp/design-system-components/helpers/hds-link-to-models"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/helpers/hds-link-to-query",["exports","@hashicorp/design-system-components/helpers/hds-link-to-query"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/helpers/href-to",["exports","@ember/component/helper","@ember/service","@ember/object","@ember/application","consul-ui/utils/routing/transitionable","consul-ui/utils/routing/wildcard","consul-ui/router"],(function(e,t,n,l,r,i,o,a){var u,s,c +function d(e,t,n,l,r){var i={} +return Object.keys(l).forEach((function(e){i[e]=l[e]})),i.enumerable=!!i.enumerable,i.configurable=!!i.configurable,("value"in i||i.initializer)&&(i.writable=!0),i=n.slice().reverse().reduce((function(n,l){return l(e,t,n)||n}),i),r&&void 0!==i.initializer&&(i.value=i.initializer?i.initializer.call(r):void 0,i.initializer=void 0),void 0===i.initializer&&(Object.defineProperty(e,t,i),i=null),i}Object.defineProperty(e,"__esModule",{value:!0}),e.default=e.hrefTo=void 0 +const p=(0,o.default)(a.routes),f=function(e,t){let n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{} +const l=e.lookup("router:main").location,r=e.lookup("service:router") +let o=t.slice(0),a=o.shift(),u=n.params||{} +"."===a&&(o=(0,i.default)(r.currentRoute,u,e),a=o.shift()) +try{return p(a)&&(o=o.map(((e,t)=>e.split("/").map(encodeURIComponent).join("/")))),l.hrefTo(a,o,u)}catch(s){throw s.constructor===Error&&(s.message=`${s.message} For "${t[0]}:${JSON.stringify(t.slice(1))}"`),s}} +e.hrefTo=f +let m=(u=(0,n.inject)("router"),s=class extends t.default{constructor(){var e,t,n,l +super(...arguments),e=this,t="router",l=this,(n=c)&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(l):void 0})}init(){super.init(...arguments),this.router.on("routeWillChange",this.routeWillChange)}compute(e,t){return f((0,r.getOwner)(this),e,t)}routeWillChange(e){this.recompute()}willDestroy(){this.router.off("routeWillChange",this.routeWillChange),super.willDestroy()}},c=d(s.prototype,"router",[u],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),d(s.prototype,"routeWillChange",[l.action],Object.getOwnPropertyDescriptor(s.prototype,"routeWillChange"),s.prototype),s) +e.default=m})),define("consul-ui/helpers/humanize",["exports","ember-cli-string-helpers/helpers/humanize"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"humanize",{enumerable:!0,get:function(){return t.humanize}})})),define("consul-ui/helpers/hypot",["exports","ember-math-helpers/helpers/hypot"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"hypot",{enumerable:!0,get:function(){return t.hypot}})})),define("consul-ui/helpers/icon-mapping",["exports","@ember/component/helper"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const n={kubernetes:"kubernetes-color",terraform:"terraform-color",nomad:"nomad-color",consul:"consul-color","consul-api-gateway":"consul-color",vault:"vault",aws:"aws-color","aws-iam":"aws-color",lambda:"aws-lambda-color"} +var l=(0,t.helper)((function(e){let[t]=e +return n[t]})) +e.default=l})),define("consul-ui/helpers/if-key",["exports","ember-keyboard/helpers/if-key.js"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/helpers/imul",["exports","ember-math-helpers/helpers/imul"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"imul",{enumerable:!0,get:function(){return t.imul}})})),define("consul-ui/helpers/inc",["exports","ember-composable-helpers/helpers/inc"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"inc",{enumerable:!0,get:function(){return t.inc}})})),define("consul-ui/helpers/includes",["exports","ember-composable-helpers/helpers/includes"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"includes",{enumerable:!0,get:function(){return t.includes}})})),define("consul-ui/helpers/intersect",["exports","ember-composable-helpers/helpers/intersect"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/helpers/invoke",["exports","ember-composable-helpers/helpers/invoke"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"invoke",{enumerable:!0,get:function(){return t.invoke}})})),define("consul-ui/helpers/is-active",["exports","ember-router-helpers/helpers/is-active"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"isActive",{enumerable:!0,get:function(){return t.isActive}})})),define("consul-ui/helpers/is-array",["exports","ember-truth-helpers/helpers/is-array"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"isArray",{enumerable:!0,get:function(){return t.isArray}})})),define("consul-ui/helpers/is-empty",["exports","ember-truth-helpers/helpers/is-empty"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/helpers/is-equal",["exports","ember-truth-helpers/helpers/is-equal"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"isEqual",{enumerable:!0,get:function(){return t.isEqual}})})),define("consul-ui/helpers/is-href",["exports","@ember/component/helper","@ember/service","@ember/object"],(function(e,t,n,l){var r,i,o +function a(e,t,n,l,r){var i={} +return Object.keys(l).forEach((function(e){i[e]=l[e]})),i.enumerable=!!i.enumerable,i.configurable=!!i.configurable,("value"in i||i.initializer)&&(i.writable=!0),i=n.slice().reverse().reduce((function(n,l){return l(e,t,n)||n}),i),r&&void 0!==i.initializer&&(i.value=i.initializer?i.initializer.call(r):void 0,i.initializer=void 0),void 0===i.initializer&&(Object.defineProperty(e,t,i),i=null),i}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +let u=(r=(0,n.inject)("router"),i=class extends t.default{constructor(){var e,t,n,l +super(...arguments),e=this,t="router",l=this,(n=o)&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(l):void 0})}init(){super.init(...arguments),this.router.on("routeWillChange",this.routeWillChange)}compute(e){let[t,...n]=e +return this.router.currentRouteName.startsWith("nspace.")&&t.startsWith("dc.")&&(t=`nspace.${t}`),void 0!==this.next&&"loading"!==this.next?this.next.startsWith(t):this.router.isActive(t,...n)}routeWillChange(e){this.next=e.to.name.replace(".index",""),this.recompute()}willDestroy(){this.router.off("routeWillChange",this.routeWillChange),super.willDestroy()}},o=a(i.prototype,"router",[r],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),a(i.prototype,"routeWillChange",[l.action],Object.getOwnPropertyDescriptor(i.prototype,"routeWillChange"),i.prototype),i) +e.default=u})),define("consul-ui/helpers/is",["exports","ember-can/helpers/can","@ember/object","@ember/string"],(function(e,t,n,l){Object.defineProperty(e,"__esModule",{value:!0}),e.default=e.is=void 0 +const r=(e,t,r)=>{let[i,o]=t,{abilityName:a,propertyName:u}=e.abilities.parse(i),s=e.abilities.abilityFor(a,o,r) +return u="function"==typeof s.getCharacteristicProperty?s.getCharacteristicProperty(u):(0,l.camelize)(`is-${u}`),(0,n.get)(s,u)} +e.is=r +class i extends t.default{compute(e,t){let[n,l]=e +return r(this,[n,l],t)}}e.default=i})),define("consul-ui/helpers/join",["exports","ember-composable-helpers/helpers/join"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/helpers/json-stringify",["exports","@ember/component/helper"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +var n=(0,t.helper)((function(e,t){try{return JSON.stringify(...e)}catch(n){return e[0].map((t=>JSON.stringify(t,e[1],e[2])))}})) +e.default=n})),define("consul-ui/helpers/keys",["exports","ember-composable-helpers/helpers/keys"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"keys",{enumerable:!0,get:function(){return t.keys}})})),define("consul-ui/helpers/last",["exports","@ember/component/helper"],(function(e,t){function n(e,t){let[n=""]=e +if(!0==("string"==typeof n))return n.substr(-1)}Object.defineProperty(e,"__esModule",{value:!0}),e.last=n,e.default=void 0 +var l=(0,t.helper)(n) +e.default=l})) +define("consul-ui/helpers/lcm",["exports","ember-math-helpers/helpers/lcm"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"lcm",{enumerable:!0,get:function(){return t.lcm}})})),define("consul-ui/helpers/left-trim",["exports","@ember/component/helper","consul-ui/utils/left-trim"],(function(e,t,n){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +var l=(0,t.helper)((function(e,t){let[l="",r=""]=e +return(0,n.default)(l,r)})) +e.default=l})),define("consul-ui/helpers/loc",["exports","@ember/string/helpers/loc"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"loc",{enumerable:!0,get:function(){return t.loc}})})),define("consul-ui/helpers/log-e",["exports","ember-math-helpers/helpers/log-e"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"logE",{enumerable:!0,get:function(){return t.logE}})})),define("consul-ui/helpers/log10",["exports","ember-math-helpers/helpers/log10"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"log10",{enumerable:!0,get:function(){return t.log10}})})),define("consul-ui/helpers/log1p",["exports","ember-math-helpers/helpers/log1p"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"log1p",{enumerable:!0,get:function(){return t.log1p}})})),define("consul-ui/helpers/log2",["exports","ember-math-helpers/helpers/log2"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"log2",{enumerable:!0,get:function(){return t.log2}})})),define("consul-ui/helpers/lowercase",["exports","ember-cli-string-helpers/helpers/lowercase"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"lowercase",{enumerable:!0,get:function(){return t.lowercase}})})),define("consul-ui/helpers/lt",["exports","ember-truth-helpers/helpers/lt"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"lt",{enumerable:!0,get:function(){return t.lt}})})),define("consul-ui/helpers/lte",["exports","ember-truth-helpers/helpers/lte"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"lte",{enumerable:!0,get:function(){return t.lte}})})),define("consul-ui/helpers/map-by",["exports","ember-composable-helpers/helpers/map-by"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/helpers/map",["exports","ember-composable-helpers/helpers/map"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/helpers/max",["exports","ember-math-helpers/helpers/max"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"max",{enumerable:!0,get:function(){return t.max}})})),define("consul-ui/helpers/merge-checks",["exports","@ember/component/helper","consul-ui/utils/merge-checks"],(function(e,t,n){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +var l=(0,t.helper)((function(e,t){let[l,r]=e +return(0,n.default)(l,r)})) +e.default=l})),define("consul-ui/helpers/min",["exports","ember-math-helpers/helpers/min"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"min",{enumerable:!0,get:function(){return t.min}})})),define("consul-ui/helpers/mixed-grid-layout",["exports","@ember/component/helper","ember-collection/layouts/mixed-grid"],(function(e,t,n){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +var l=(0,t.helper)((function(e){return new n.default(e[0])})) +e.default=l})),define("consul-ui/helpers/mod",["exports","ember-math-helpers/helpers/mod"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"mod",{enumerable:!0,get:function(){return t.mod}})})),define("consul-ui/helpers/mult",["exports","ember-math-helpers/helpers/mult"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"mult",{enumerable:!0,get:function(){return t.mult}})})),define("consul-ui/helpers/next",["exports","ember-composable-helpers/helpers/next"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"next",{enumerable:!0,get:function(){return t.next}})})),define("consul-ui/helpers/noop",["exports","ember-composable-helpers/helpers/noop"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"noop",{enumerable:!0,get:function(){return t.noop}})})),define("consul-ui/helpers/not-eq",["exports","ember-truth-helpers/helpers/not-equal"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"notEqualHelper",{enumerable:!0,get:function(){return t.notEqualHelper}})})),define("consul-ui/helpers/not",["exports","ember-truth-helpers/helpers/not"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"not",{enumerable:!0,get:function(){return t.not}})})),define("consul-ui/helpers/object-at",["exports","ember-composable-helpers/helpers/object-at"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"objectAt",{enumerable:!0,get:function(){return t.objectAt}})})),define("consul-ui/helpers/on-document",["exports","ember-on-helper/helpers/on-document"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/helpers/on-key",["exports","ember-keyboard/helpers/on-key.js"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/helpers/on-window",["exports","ember-on-helper/helpers/on-window"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/helpers/on",["exports","ember-on-helper/helpers/on"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/helpers/optional",["exports","ember-composable-helpers/helpers/optional"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"optional",{enumerable:!0,get:function(){return t.optional}})})),define("consul-ui/helpers/or",["exports","ember-truth-helpers/helpers/or"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"or",{enumerable:!0,get:function(){return t.or}})})),define("consul-ui/helpers/page-title",["exports","ember-page-title/helpers/page-title"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +var n=t.default +e.default=n})) +define("consul-ui/helpers/percentage-columns-layout",["exports","@ember/component/helper","ember-collection/layouts/percentage-columns"],(function(e,t,n){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +var l=(0,t.helper)((function(e){return new n.default(e[0],e[1],e[2])})) +e.default=l})),define("consul-ui/helpers/percentage-of",["exports","@ember/component/helper"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +var n=(0,t.helper)((function(e,t){let[n,l]=e +const r=n/l*100 +return isNaN(r)?0:r.toFixed(2)})) +e.default=n})),define("consul-ui/helpers/perform",["exports","ember-concurrency/helpers/perform"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/helpers/pick",["exports","ember-composable-helpers/helpers/pick"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"pick",{enumerable:!0,get:function(){return t.pick}})})),define("consul-ui/helpers/pipe-action",["exports","ember-composable-helpers/helpers/pipe-action"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/helpers/pipe",["exports","ember-composable-helpers/helpers/pipe"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"pipe",{enumerable:!0,get:function(){return t.pipe}})})),define("consul-ui/helpers/pluralize",["exports","ember-inflector/lib/helpers/pluralize"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +var n=t.default +e.default=n})),define("consul-ui/helpers/policy/datacenters",["exports","@ember/component/helper","@ember/object"],(function(e,t,n){function l(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{} +const l=(0,n.get)(e[0],"Datacenters") +return Array.isArray(l)&&0!==l.length?(0,n.get)(e[0],"Datacenters"):[t.global||"All"]}Object.defineProperty(e,"__esModule",{value:!0}),e.datacenters=l,e.default=void 0 +var r=(0,t.helper)(l) +e.default=r})),define("consul-ui/helpers/policy/group",["exports","@ember/component/helper","@ember/object","consul-ui/models/policy"],(function(e,t,n,l){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +var r=(0,t.helper)((function(e){let[t]=e +return t.reduce((function(e,t){let r +switch(!0){case(0,n.get)(t,"ID")===l.MANAGEMENT_ID:r="management" +break +case""!==(0,n.get)(t,"template"):r="identities" +break +default:r="policies"}return e[r].push(t),e}),{management:[],identities:[],policies:[]})})) +e.default=r})),define("consul-ui/helpers/policy/typeof",["exports","@ember/component/helper","@ember/object"],(function(e,t,n){Object.defineProperty(e,"__esModule",{value:!0}),e.typeOf=l,e.default=void 0 +function l(e,t){const l=e[0],r=(0,n.get)(l,"template") +switch(!0){case void 0===r:return"role" +case"service-identity"===r:return"policy-service-identity" +case"node-identity"===r:return"policy-node-identity" +case"00000000-0000-0000-0000-000000000001"===(0,n.get)(l,"ID"):return"policy-management" +default:return"policy"}}var r=(0,t.helper)(l) +e.default=r})),define("consul-ui/helpers/pow",["exports","ember-math-helpers/helpers/pow"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"pow",{enumerable:!0,get:function(){return t.pow}})})),define("consul-ui/helpers/previous",["exports","ember-composable-helpers/helpers/previous"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"previous",{enumerable:!0,get:function(){return t.previous}})})),define("consul-ui/helpers/queue",["exports","ember-composable-helpers/helpers/queue"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"queue",{enumerable:!0,get:function(){return t.queue}})})),define("consul-ui/helpers/random",["exports","ember-math-helpers/helpers/random"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"random",{enumerable:!0,get:function(){return t.random}})})),define("consul-ui/helpers/range",["exports","ember-composable-helpers/helpers/range"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"range",{enumerable:!0,get:function(){return t.range}})})),define("consul-ui/helpers/reduce",["exports","ember-composable-helpers/helpers/reduce"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/helpers/ref-to",["exports","ember-ref-bucket/helpers/ref-to"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"refTo",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/helpers/refresh-route",["exports","@ember/component/helper","@ember/service","@ember/application"],(function(e,t,n,l){var r,i,o +Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +let a=(r=(0,n.inject)("router"),i=class extends t.default{constructor(){var e,t,n,l +super(...arguments),e=this,t="router",l=this,(n=o)&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(l):void 0})}compute(e,t){return()=>{const e=(0,l.getOwner)(this),t=this.router.currentRoute.name +return e.lookup(`route:${t}`).refresh()}}},u=i.prototype,s="router",c=[r],d={configurable:!0,enumerable:!0,writable:!0,initializer:null},f={},Object.keys(d).forEach((function(e){f[e]=d[e]})),f.enumerable=!!f.enumerable,f.configurable=!!f.configurable,("value"in f||f.initializer)&&(f.writable=!0),f=c.slice().reverse().reduce((function(e,t){return t(u,s,e)||e}),f),p&&void 0!==f.initializer&&(f.value=f.initializer?f.initializer.call(p):void 0,f.initializer=void 0),void 0===f.initializer&&(Object.defineProperty(u,s,f),f=null),o=f,i) +var u,s,c,d,p,f +e.default=a})),define("consul-ui/helpers/reject-by",["exports","ember-composable-helpers/helpers/reject-by"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/helpers/render-template",["exports","@ember/component/helper","@ember/service"],(function(e,t,n){var l,r,i +Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const o=/{{([A-Za-z.0-9_-]+)}}/g +let a,u=(l=(0,n.inject)("encoder"),r=class extends t.default{constructor(){var e,t,n,l +super(...arguments),e=this,t="encoder",l=this,(n=i)&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(l):void 0}),"function"!=typeof a&&(a=this.encoder.createRegExpEncoder(o,encodeURIComponent,!1))}compute(e){let[t,n]=e +return a(t,n)}},s=r.prototype,c="encoder",d=[l],p={configurable:!0,enumerable:!0,writable:!0,initializer:null},m={},Object.keys(p).forEach((function(e){m[e]=p[e]})),m.enumerable=!!m.enumerable,m.configurable=!!m.configurable,("value"in m||m.initializer)&&(m.writable=!0),m=d.slice().reverse().reduce((function(e,t){return t(s,c,e)||e}),m),f&&void 0!==m.initializer&&(m.value=m.initializer?m.initializer.call(f):void 0,m.initializer=void 0),void 0===m.initializer&&(Object.defineProperty(s,c,m),m=null),i=m,r) +var s,c,d,p,f,m +e.default=u})),define("consul-ui/helpers/repeat",["exports","ember-composable-helpers/helpers/repeat"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"repeat",{enumerable:!0,get:function(){return t.repeat}})})),define("consul-ui/helpers/require",["exports","@ember/component/helper","require","@lit/reactive-element","consul-ui/utils/path/resolve"],(function(e,t,n,l,r){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const i=new Map +var o=(0,t.helper)(((e,t)=>{let o,[a=""]=e,u=(0,r.default)(`consul-ui${t.from}`,a) +if("/"===a.charAt(0)&&(u=`consul-ui${u}`),!n.default.has(u))throw new Error(`Unable to resolve '${u}' does the file exist?`) +switch(o=(0,n.default)(u)[t.export||"default"],!0){case u.endsWith(".css"):return o(l.css) +case u.endsWith(".xstate"):return o +case u.endsWith(".element"):{if(i.has(u))return i.get(u) +const e=o(HTMLElement) +return i.set(u,e),e}default:return o}})) +e.default=o})),define("consul-ui/helpers/reverse",["exports","ember-composable-helpers/helpers/reverse"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/helpers/right-trim",["exports","@ember/component/helper","consul-ui/utils/right-trim"],(function(e,t,n){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +var l=(0,t.helper)((function(e,t){let[l="",r=""]=e +return(0,n.default)(l,r)})) +e.default=l})),define("consul-ui/helpers/root-url",["exports","ember-router-helpers/helpers/root-url"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"rootUrl",{enumerable:!0,get:function(){return t.rootUrl}})})),define("consul-ui/helpers/round",["exports","ember-math-helpers/helpers/round"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"round",{enumerable:!0,get:function(){return t.round}})})),define("consul-ui/helpers/route-action",["exports","ember-route-action-helper/helpers/route-action"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/helpers/route-match",["exports","@ember/component/helper"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +var n=(0,t.helper)((function(e,t){let[n]=e +switch(["Present","Exact","Prefix","Suffix","Regex"].find((e=>void 0!==n[e]))){case"Present":return(n.Invert?"NOT ":"")+"present" +case"Exact":return`${n.Invert?"NOT ":""}exactly matching "${n.Exact}"` +case"Prefix":return`${n.Invert?"NOT ":""}prefixed by "${n.Prefix}"` +case"Suffix":return`${n.Invert?"NOT ":""}suffixed by "${n.Suffix}"` +case"Regex":return`${n.Invert?"NOT ":""}matching the regex "${n.Regex}"`}return""})) +e.default=n})),define("consul-ui/helpers/route-params",["exports","ember-router-helpers/helpers/route-params"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"routeParams",{enumerable:!0,get:function(){return t.routeParams}})})),define("consul-ui/helpers/service/card-permissions",["exports","@ember/component/helper"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +var n=(0,t.helper)((function(e){let[t]=e +if(""===t.Datacenter)return"empty" +{const e=t.Intention.HasPermissions,n=t.Intention.Allowed,l="specific-intention"===t.Source&&!t.TransparentProxy +switch(!0){case e:return"allow" +case!n&&!e:return"deny" +case n&&l:return"not-defined" +default:return"allow"}}})) +e.default=n})) +define("consul-ui/helpers/service/external-source",["exports","@ember/component/helper","@ember/object"],(function(e,t,n){function l(e,t){let l=(0,n.get)(e[0],"ExternalSources.firstObject") +l||(l=(0,n.get)(e[0],"Meta.external-source")) +const r=void 0===t.prefix?"":t.prefix +if(l&&["consul-api-gateway","vault","kubernetes","terraform","nomad","consul","aws","lambda"].includes(l))return`${r}${l}`}Object.defineProperty(e,"__esModule",{value:!0}),e.serviceExternalSource=l,e.default=void 0 +var r=(0,t.helper)(l) +e.default=r})),define("consul-ui/helpers/service/health-percentage",["exports","@ember/component/helper"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +var n=(0,t.helper)((function(e){let[t]=e +const n=t.ChecksCritical+t.ChecksPassing+t.ChecksWarning +return 0===n?"":{passing:Math.round(t.ChecksPassing/n*100),warning:Math.round(t.ChecksWarning/n*100),critical:Math.round(t.ChecksCritical/n*100)}})) +e.default=n})),define("consul-ui/helpers/set",["exports","ember-set-helper/helpers/set"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/helpers/shuffle",["exports","ember-composable-helpers/helpers/shuffle"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"shuffle",{enumerable:!0,get:function(){return t.shuffle}})})),define("consul-ui/helpers/sign",["exports","ember-math-helpers/helpers/sign"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"sign",{enumerable:!0,get:function(){return t.sign}})})),define("consul-ui/helpers/sin",["exports","ember-math-helpers/helpers/sin"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"sin",{enumerable:!0,get:function(){return t.sin}})})),define("consul-ui/helpers/singularize",["exports","ember-inflector/lib/helpers/singularize"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +var n=t.default +e.default=n})),define("consul-ui/helpers/slice",["exports","ember-composable-helpers/helpers/slice"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/helpers/slugify",["exports","@ember/component/helper"],(function(e,t){function n(e,t){let[n=""]=e +return n.replace(/ /g,"-").toLowerCase()}Object.defineProperty(e,"__esModule",{value:!0}),e.slugify=n,e.default=void 0 +var l=(0,t.helper)(n) +e.default=l})),define("consul-ui/helpers/smart-date-format",["exports","@ember/component/helper","@ember/service"],(function(e,t,n){var l,r,i +function o(e,t,n,l){n&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(l):void 0})}function a(e,t,n,l,r){var i={} +return Object.keys(l).forEach((function(e){i[e]=l[e]})),i.enumerable=!!i.enumerable,i.configurable=!!i.configurable,("value"in i||i.initializer)&&(i.writable=!0),i=n.slice().reverse().reduce((function(n,l){return l(e,t,n)||n}),i),r&&void 0!==i.initializer&&(i.value=i.initializer?i.initializer.call(r):void 0,i.initializer=void 0),void 0===i.initializer&&(Object.defineProperty(e,t,i),i=null),i}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const u=6048e5 +function s(e){const t=new Date +return e>=+t-u&&e<=+t+u}let c=(l=class extends t.default{constructor(){super(...arguments),o(this,"temporal",r,this),o(this,"intl",i,this)}compute(e,t){let[n]=e +return{isNearDate:s(n),relative:`${this.temporal.format(n)} ago`,friendly:this.intl.formatTime(n,{month:"short",day:"numeric",year:"numeric",hour:"numeric",minute:"numeric",second:"numeric",hourCycle:"h24"})}}},r=a(l.prototype,"temporal",[n.inject],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),i=a(l.prototype,"intl",[n.inject],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),l) +e.default=c})),define("consul-ui/helpers/sort-by",["exports","ember-composable-helpers/helpers/sort-by"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/helpers/split",["exports","@ember/component/helper"],(function(e,t){function n(e,t){let[n="",l=","]=e +return n.split(l)}Object.defineProperty(e,"__esModule",{value:!0}),e.split=n,e.default=void 0 +var l=(0,t.helper)(n) +e.default=l})),define("consul-ui/helpers/sqrt",["exports","ember-math-helpers/helpers/sqrt"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"sqrt",{enumerable:!0,get:function(){return t.sqrt}})})),define("consul-ui/helpers/state-chart",["exports","@ember/component/helper","@ember/service"],(function(e,t,n){var l,r,i +Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +let o=(l=(0,n.inject)("state"),r=class extends t.default{constructor(){var e,t,n,l +super(...arguments),e=this,t="state",l=this,(n=i)&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(l):void 0})}compute(e,t){let[n]=e +return this.state.stateChart(n)}},a=r.prototype,u="state",s=[l],c={configurable:!0,enumerable:!0,writable:!0,initializer:null},p={},Object.keys(c).forEach((function(e){p[e]=c[e]})),p.enumerable=!!p.enumerable,p.configurable=!!p.configurable,("value"in p||p.initializer)&&(p.writable=!0),p=s.slice().reverse().reduce((function(e,t){return t(a,u,e)||e}),p),d&&void 0!==p.initializer&&(p.value=p.initializer?p.initializer.call(d):void 0,p.initializer=void 0),void 0===p.initializer&&(Object.defineProperty(a,u,p),p=null),i=p,r) +var a,u,s,c,d,p +e.default=o})),define("consul-ui/helpers/state-matches",["exports","@ember/component/helper","@ember/service"],(function(e,t,n){var l,r,i +Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +let o=(l=(0,n.inject)("state"),r=class extends t.default{constructor(){var e,t,n,l +super(...arguments),e=this,t="state",l=this,(n=i)&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(l):void 0})}compute(e,t){let[n,l]=e +return this.state.matches(n,l)}},a=r.prototype,u="state",s=[l],c={configurable:!0,enumerable:!0,writable:!0,initializer:null},p={},Object.keys(c).forEach((function(e){p[e]=c[e]})),p.enumerable=!!p.enumerable,p.configurable=!!p.configurable,("value"in p||p.initializer)&&(p.writable=!0),p=s.slice().reverse().reduce((function(e,t){return t(a,u,e)||e}),p),d&&void 0!==p.initializer&&(p.value=p.initializer?p.initializer.call(d):void 0,p.initializer=void 0),void 0===p.initializer&&(Object.defineProperty(a,u,p),p=null),i=p,r) +var a,u,s,c,d,p +e.default=o})),define("consul-ui/helpers/string-char-at",["exports","ember-string-fns/helpers/string-char-at"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"stringCharAt",{enumerable:!0,get:function(){return t.stringCharAt}})})),define("consul-ui/helpers/string-char-code-at",["exports","ember-string-fns/helpers/string-char-code-at"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"stringCharCodeAt",{enumerable:!0,get:function(){return t.stringCharCodeAt}})})),define("consul-ui/helpers/string-code-point-at",["exports","ember-string-fns/helpers/string-code-point-at"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"stringCodePointAt",{enumerable:!0,get:function(){return t.stringCodePointAt}})})),define("consul-ui/helpers/string-concat",["exports","ember-string-fns/helpers/string-concat"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"stringConcat",{enumerable:!0,get:function(){return t.stringConcat}})})),define("consul-ui/helpers/string-ends-with",["exports","ember-string-fns/helpers/string-ends-with"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"stringEndsWith",{enumerable:!0,get:function(){return t.stringEndsWith}})})),define("consul-ui/helpers/string-equals",["exports","ember-string-fns/helpers/string-equals"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"stringEquals",{enumerable:!0,get:function(){return t.stringEquals}})})),define("consul-ui/helpers/string-from-char-code",["exports","ember-string-fns/helpers/string-from-char-code"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"stringFromCharCode",{enumerable:!0,get:function(){return t.stringFromCharCode}})})),define("consul-ui/helpers/string-from-code-point",["exports","ember-string-fns/helpers/string-from-code-point"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"stringFromCodePoint",{enumerable:!0,get:function(){return t.stringFromCodePoint}})})),define("consul-ui/helpers/string-html-safe",["exports","@ember/component/helper","@ember/string"],(function(e,t,n){function l(e){let[t=""]=e +return(0,n.htmlSafe)(t)}Object.defineProperty(e,"__esModule",{value:!0}),e.stringHtmlSafe=l,e.default=void 0 +var r=(0,t.helper)(l) +e.default=r})),define("consul-ui/helpers/string-includes",["exports","ember-string-fns/helpers/string-includes"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"stringIncludes",{enumerable:!0,get:function(){return t.stringIncludes}})})),define("consul-ui/helpers/string-index-of",["exports","ember-string-fns/helpers/string-index-of"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"stringIndexOf",{enumerable:!0,get:function(){return t.stringIndexOf}})})),define("consul-ui/helpers/string-last-index-of",["exports","ember-string-fns/helpers/string-last-index-of"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"stringLastIndexOf",{enumerable:!0,get:function(){return t.stringLastIndexOf}})})),define("consul-ui/helpers/string-not-equals",["exports","ember-string-fns/helpers/string-not-equals"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"stringNotEquals",{enumerable:!0,get:function(){return t.stringNotEquals}})})),define("consul-ui/helpers/string-pad-end",["exports","ember-string-fns/helpers/string-pad-end"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"stringPadEnd",{enumerable:!0,get:function(){return t.stringPadEnd}})})),define("consul-ui/helpers/string-pad-start",["exports","ember-string-fns/helpers/string-pad-start"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"stringPadStart",{enumerable:!0,get:function(){return t.stringPadStart}})})) +define("consul-ui/helpers/string-repeat",["exports","ember-string-fns/helpers/string-repeat"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"stringRepeat",{enumerable:!0,get:function(){return t.stringRepeat}})})),define("consul-ui/helpers/string-replace-all",["exports","ember-string-fns/helpers/string-replace-all"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"stringReplaceAll",{enumerable:!0,get:function(){return t.stringReplaceAll}})})),define("consul-ui/helpers/string-replace",["exports","ember-string-fns/helpers/string-replace"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"stringReplace",{enumerable:!0,get:function(){return t.stringReplace}})})),define("consul-ui/helpers/string-slice",["exports","ember-string-fns/helpers/string-slice"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"stringSlice",{enumerable:!0,get:function(){return t.stringSlice}})})),define("consul-ui/helpers/string-split",["exports","ember-string-fns/helpers/string-split"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"stringSplit",{enumerable:!0,get:function(){return t.stringSplit}})})),define("consul-ui/helpers/string-starts-with",["exports","ember-string-fns/helpers/string-starts-with"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"stringStartsWith",{enumerable:!0,get:function(){return t.stringStartsWith}})})),define("consul-ui/helpers/string-substring",["exports","ember-string-fns/helpers/string-substring"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"stringSubstring",{enumerable:!0,get:function(){return t.stringSubstring}})})),define("consul-ui/helpers/string-to-camel-case",["exports","ember-string-fns/helpers/string-to-camel-case"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"stringToCamelCase",{enumerable:!0,get:function(){return t.stringToCamelCase}})})),define("consul-ui/helpers/string-to-kebab-case",["exports","ember-string-fns/helpers/string-to-kebab-case"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"stringToKebabCase",{enumerable:!0,get:function(){return t.stringToKebabCase}})})),define("consul-ui/helpers/string-to-lower-case",["exports","ember-string-fns/helpers/string-to-lower-case"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"stringToLowerCase",{enumerable:!0,get:function(){return t.stringToLowerCase}})})),define("consul-ui/helpers/string-to-pascal-case",["exports","ember-string-fns/helpers/string-to-pascal-case"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"stringToPascalCase",{enumerable:!0,get:function(){return t.stringToPascalCase}})})),define("consul-ui/helpers/string-to-sentence-case",["exports","ember-string-fns/helpers/string-to-sentence-case"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"stringToSentenceCase",{enumerable:!0,get:function(){return t.stringToSentenceCase}})})),define("consul-ui/helpers/string-to-snake-case",["exports","ember-string-fns/helpers/string-to-snake-case"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"stringToSnakeCase",{enumerable:!0,get:function(){return t.stringToSnakeCase}})})),define("consul-ui/helpers/string-to-title-case",["exports","ember-string-fns/helpers/string-to-title-case"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"stringToTitleCase",{enumerable:!0,get:function(){return t.stringToTitleCase}})})),define("consul-ui/helpers/string-to-upper-case",["exports","ember-string-fns/helpers/string-to-upper-case"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"stringToUpperCase",{enumerable:!0,get:function(){return t.stringToUpperCase}})})),define("consul-ui/helpers/string-trim-end",["exports","ember-string-fns/helpers/string-trim-end"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"stringTrimEnd",{enumerable:!0,get:function(){return t.stringTrimEnd}})})),define("consul-ui/helpers/string-trim-start",["exports","ember-string-fns/helpers/string-trim-start"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"stringTrimStart",{enumerable:!0,get:function(){return t.stringTrimStart}})})),define("consul-ui/helpers/string-trim",["exports","ember-string-fns/helpers/string-trim"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"stringTrim",{enumerable:!0,get:function(){return t.stringTrim}})})),define("consul-ui/helpers/style-map",["exports","@ember/component/helper"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +var n=(0,t.helper)((function(e){const t=e.reduce(((e,t)=>{let[n,l,r=""]=t +return null==l?e:`${e}${n}:${l.toString()}${r};`}),"") +return t.length>0?t:void 0})) +e.default=n})),define("consul-ui/helpers/sub",["exports","ember-math-helpers/helpers/sub"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"sub",{enumerable:!0,get:function(){return t.sub}})})),define("consul-ui/helpers/substr",["exports","@ember/component/helper"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +var n=(0,t.helper)((function(e,t){let[n="",l=0,r]=e +return n.substr(l,r)})) +e.default=n})),define("consul-ui/helpers/svg-curve",["exports","@ember/component/helper"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +var n=(0,t.helper)((function(e,t){let[n]=e +const l=t.src||{x:0,y:0},r=t.type||"cubic" +let i=[n,{x:(l.x+n.x)/2,y:l.y}] +return"cubic"===r&&i.push({x:i[1].x,y:n.y}),`${o=l,`\n M ${o.x} ${o.y}\n `}${function(){const e=[...arguments] +return`${arguments.length>2?"C":"Q"} ${e.concat(e.shift()).map((e=>Object.values(e).join(" "))).join(",")}`}(...i)}` +var o})) +e.default=n})),define("consul-ui/helpers/t",["exports","ember-intl/helpers/t"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/helpers/take",["exports","ember-composable-helpers/helpers/take"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/helpers/tan",["exports","ember-math-helpers/helpers/tan"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"tan",{enumerable:!0,get:function(){return t.tan}})})),define("consul-ui/helpers/tanh",["exports","ember-math-helpers/helpers/tanh"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"tanh",{enumerable:!0,get:function(){return t.tanh}})})),define("consul-ui/helpers/task",["exports","ember-concurrency/helpers/task"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/helpers/temporal-format",["exports","@ember/component/helper","@ember/service"],(function(e,t,n){var l,r,i +Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +let o=(l=(0,n.inject)("temporal"),r=class extends t.default{constructor(){var e,t,n,l +super(...arguments),e=this,t="temporal",l=this,(n=i)&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(l):void 0})}compute(e,t){let[n]=e +return this.temporal.format(n,t)}},a=r.prototype,u="temporal",s=[l],c={configurable:!0,enumerable:!0,writable:!0,initializer:null},p={},Object.keys(c).forEach((function(e){p[e]=c[e]})),p.enumerable=!!p.enumerable,p.configurable=!!p.configurable,("value"in p||p.initializer)&&(p.writable=!0),p=s.slice().reverse().reduce((function(e,t){return t(a,u,e)||e}),p),d&&void 0!==p.initializer&&(p.value=p.initializer?p.initializer.call(d):void 0,p.initializer=void 0),void 0===p.initializer&&(Object.defineProperty(a,u,p),p=null),i=p,r) +var a,u,s,c,d,p +e.default=o})),define("consul-ui/helpers/temporal-within",["exports","@ember/component/helper","@ember/service"],(function(e,t,n){var l,r,i +Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +let o=(l=(0,n.inject)("temporal"),r=class extends t.default{constructor(){var e,t,n,l +super(...arguments),e=this,t="temporal",l=this,(n=i)&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(l):void 0})}compute(e,t){return this.temporal.within(e,t)}},a=r.prototype,u="temporal",s=[l],c={configurable:!0,enumerable:!0,writable:!0,initializer:null},p={},Object.keys(c).forEach((function(e){p[e]=c[e]})),p.enumerable=!!p.enumerable,p.configurable=!!p.configurable,("value"in p||p.initializer)&&(p.writable=!0),p=s.slice().reverse().reduce((function(e,t){return t(a,u,e)||e}),p),d&&void 0!==p.initializer&&(p.value=p.initializer?p.initializer.call(d):void 0,p.initializer=void 0),void 0===p.initializer&&(Object.defineProperty(a,u,p),p=null),i=p,r) +var a,u,s,c,d,p +e.default=o})),define("consul-ui/helpers/test",["exports","consul-ui/helpers/can","consul-ui/helpers/is"],(function(e,t,n){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +class l extends t.default{compute(e,t){let[l,r]=e +switch(!0){case l.startsWith("can "):return super.compute([l.substr(4),r],t) +case l.startsWith("is "):return(0,n.is)(this,[l.substr(3),r],t)}throw new Error(`${l} is not supported by the 'test' helper.`)}}e.default=l})) +define("consul-ui/helpers/titleize",["exports","ember-cli-string-helpers/helpers/titleize"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"titleize",{enumerable:!0,get:function(){return t.titleize}})})),define("consul-ui/helpers/to-hash",["exports","@ember/component/helper","@ember/object"],(function(e,t,n){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +var l=(0,t.helper)(((e,t)=>{let[l=[],r]=e +return Array.isArray(l)||(l=l.toArray()),l.reduce(((e,t,l)=>(e[(0,n.get)(t,r)]=t,e)),{})})) +e.default=l})),define("consul-ui/helpers/to-route",["exports","@ember/component/helper","@ember/service"],(function(e,t,n){var l,r,i,o,a +function u(e,t,n,l){n&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(l):void 0})}function s(e,t,n,l,r){var i={} +return Object.keys(l).forEach((function(e){i[e]=l[e]})),i.enumerable=!!i.enumerable,i.configurable=!!i.configurable,("value"in i||i.initializer)&&(i.writable=!0),i=n.slice().reverse().reduce((function(n,l){return l(e,t,n)||n}),i),r&&void 0!==i.initializer&&(i.value=i.initializer?i.initializer.call(r):void 0,i.initializer=void 0),void 0===i.initializer&&(Object.defineProperty(e,t,i),i=null),i}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +let c=(l=(0,n.inject)("router"),r=(0,n.inject)("env"),i=class extends t.default{constructor(){super(...arguments),u(this,"router",o,this),u(this,"env",a,this)}compute(e){let[t]=e +return this.router.recognize(`${this.env.var("rootURL")}${t}`).name}},o=s(i.prototype,"router",[l],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),a=s(i.prototype,"env",[r],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),i) +e.default=c})),define("consul-ui/helpers/toggle-action",["exports","ember-composable-helpers/helpers/toggle-action"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/helpers/toggle",["exports","ember-composable-helpers/helpers/toggle"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"toggle",{enumerable:!0,get:function(){return t.toggle}})})),define("consul-ui/helpers/token/is-anonymous",["exports","@ember/component/helper","@ember/object"],(function(e,t,n){Object.defineProperty(e,"__esModule",{value:!0}),e.isAnonymous=l,e.default=void 0 +function l(e,t){return"00000000-0000-0000-0000-000000000002"===(0,n.get)(e[0],"AccessorID")}var r=(0,t.helper)(l) +e.default=r})),define("consul-ui/helpers/token/is-legacy",["exports","@ember/component/helper","@ember/object"],(function(e,t,n){Object.defineProperty(e,"__esModule",{value:!0}),e.isLegacy=r,e.default=void 0 +const l=function(e){const t=(0,n.get)(e,"Rules") +if(null!=t)return""!==t.trim() +const l=(0,n.get)(e,"Legacy") +return void 0!==l&&l} +function r(e,t){const n=e[0] +return void 0!==n.length?n.find((function(e){return l(e)})):l(n)}var i=(0,t.helper)(r) +e.default=i})),define("consul-ui/helpers/transition-to",["exports","ember-router-helpers/helpers/transition-to"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"transitionTo",{enumerable:!0,get:function(){return t.transitionTo}})})),define("consul-ui/helpers/trunc",["exports","ember-math-helpers/helpers/trunc"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"trunc",{enumerable:!0,get:function(){return t.trunc}})})),define("consul-ui/helpers/truncate",["exports","ember-cli-string-helpers/helpers/truncate"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"truncate",{enumerable:!0,get:function(){return t.truncate}})})),define("consul-ui/helpers/tween-to",["exports","@ember/component/helper","@ember/service"],(function(e,t,n){var l,r,i +Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +let o=(l=(0,n.inject)("ticker"),r=class extends t.default{constructor(){var e,t,n,l +super(...arguments),e=this,t="ticker",l=this,(n=i)&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(l):void 0})}compute(e,t){let[n,l]=e +return this.ticker.tweenTo(n,l)}},a=r.prototype,u="ticker",s=[l],c={configurable:!0,enumerable:!0,writable:!0,initializer:null},p={},Object.keys(c).forEach((function(e){p[e]=c[e]})),p.enumerable=!!p.enumerable,p.configurable=!!p.configurable,("value"in p||p.initializer)&&(p.writable=!0),p=s.slice().reverse().reduce((function(e,t){return t(a,u,e)||e}),p),d&&void 0!==p.initializer&&(p.value=p.initializer?p.initializer.call(d):void 0,p.initializer=void 0),void 0===p.initializer&&(Object.defineProperty(a,u,p),p=null),i=p,r) +var a,u,s,c,d,p +e.default=o})),define("consul-ui/helpers/union",["exports","ember-composable-helpers/helpers/union"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/helpers/uniq-by",["exports","@ember/component/helper","@ember/utils","@ember/array"],(function(e,t,n,l){function r(e){let[t,r]=e +return(0,n.isEmpty)(t)?[]:(0,l.A)(r).uniqBy(t)}Object.defineProperty(e,"__esModule",{value:!0}),e.uniqBy=r,e.default=void 0 +var i=(0,t.helper)(r) +e.default=i})),define("consul-ui/helpers/unique-id",["exports","@ember/component/helper","@ember/service"],(function(e,t,n){var l,r,i +Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +let o=(l=(0,n.inject)("dom"),r=class extends t.default{constructor(){var e,t,n,l +super(...arguments),e=this,t="dom",l=this,(n=i)&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(l):void 0})}compute(e,t){return this.dom.guid({})}},a=r.prototype,u="dom",s=[l],c={configurable:!0,enumerable:!0,writable:!0,initializer:null},p={},Object.keys(c).forEach((function(e){p[e]=c[e]})),p.enumerable=!!p.enumerable,p.configurable=!!p.configurable,("value"in p||p.initializer)&&(p.writable=!0),p=s.slice().reverse().reduce((function(e,t){return t(a,u,e)||e}),p),d&&void 0!==p.initializer&&(p.value=p.initializer?p.initializer.call(d):void 0,p.initializer=void 0),void 0===p.initializer&&(Object.defineProperty(a,u,p),p=null),i=p,r) +var a,u,s,c,d,p +e.default=o})),define("consul-ui/helpers/uppercase",["exports","ember-cli-string-helpers/helpers/uppercase"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"uppercase",{enumerable:!0,get:function(){return t.uppercase}})})),define("consul-ui/helpers/uri",["exports","@ember/component/helper","@ember/service"],(function(e,t,n){var l,r,i,o,a +function u(e,t,n,l){n&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(l):void 0})}function s(e,t,n,l,r){var i={} +return Object.keys(l).forEach((function(e){i[e]=l[e]})),i.enumerable=!!i.enumerable,i.configurable=!!i.configurable,("value"in i||i.initializer)&&(i.writable=!0),i=n.slice().reverse().reduce((function(n,l){return l(e,t,n)||n}),i),r&&void 0!==i.initializer&&(i.value=i.initializer?i.initializer.call(r):void 0,i.initializer=void 0),void 0===i.initializer&&(Object.defineProperty(e,t,i),i=null),i}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const c=/\${([A-Za-z.0-9_-]+)}/g +let d,p=(l=(0,n.inject)("encoder"),r=(0,n.inject)("data-source/service"),i=class extends t.default{constructor(){super(...arguments),u(this,"encoder",o,this),u(this,"data",a,this),"function"!=typeof d&&(d=this.encoder.createRegExpEncoder(c,encodeURIComponent))}compute(e){let[t,n]=e +return this.data.uri(d(t,n))}},o=s(i.prototype,"encoder",[l],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),a=s(i.prototype,"data",[r],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),i) +e.default=p})),define("consul-ui/helpers/url-for",["exports","ember-router-helpers/helpers/url-for"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"urlFor",{enumerable:!0,get:function(){return t.urlFor}})})),define("consul-ui/helpers/values",["exports","ember-composable-helpers/helpers/values"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"values",{enumerable:!0,get:function(){return t.values}})})),define("consul-ui/helpers/will-destroy",["exports","ember-render-helpers/helpers/will-destroy"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/helpers/without",["exports","ember-composable-helpers/helpers/without"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"without",{enumerable:!0,get:function(){return t.without}})})),define("consul-ui/helpers/xor",["exports","ember-truth-helpers/helpers/xor"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"xor",{enumerable:!0,get:function(){return t.xor}})})),define("consul-ui/initializers/app-version",["exports","ember-cli-app-version/initializer-factory","consul-ui/config/environment"],(function(e,t,n){let l,r +Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0,n.default.APP&&(l=n.default.APP.name,r=n.default.APP.version) +var i={name:"App Version",initialize:(0,t.default)(l,r)} +e.default=i})),define("consul-ui/initializers/container-debug-adapter",["exports","ember-resolver/resolvers/classic/container-debug-adapter"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +var n={name:"container-debug-adapter",initialize(){(arguments[1]||arguments[0]).register("container-debug-adapter:main",t.default)}} +e.default=n})),define("consul-ui/initializers/ember-data-data-adapter",["exports","@ember-data/debug/setup"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/initializers/ember-data",["exports","ember-data","ember-data/setup-container"],(function(e,t,n){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +var l={name:"ember-data",initialize:n.default} +e.default=l})),define("consul-ui/initializers/export-application-global",["exports","ember","consul-ui/config/environment"],(function(e,t,n){function l(){var e=arguments[1]||arguments[0] +if(!1!==n.default.exportApplicationGlobal){var l +if("undefined"!=typeof window)l=window +else if("undefined"!=typeof global)l=global +else{if("undefined"==typeof self)return +l=self}var r,i=n.default.exportApplicationGlobal +r="string"==typeof i?i:t.default.String.classify(n.default.modulePrefix),l[r]||(l[r]=e,e.reopen({willDestroy:function(){this._super.apply(this,arguments),delete l[r]}}))}}Object.defineProperty(e,"__esModule",{value:!0}),e.initialize=l,e.default=void 0 +var r={name:"export-application-global",initialize:l} +e.default=r})),define("consul-ui/initializers/flash-messages",["exports","consul-ui/config/environment","@ember/application/deprecations","ember-cli-flash/utils/flash-message-options"],(function(e,t,n,l){Object.defineProperty(e,"__esModule",{value:!0}),e.initialize=r,e.default=void 0 +function r(){const e=arguments[1]||arguments[0],{flashMessageDefaults:n}=t.default||{},{injectionFactories:r}=n||[],i=(0,l.default)(n) +r&&r.length +i.injectionFactories.forEach((t=>{e.inject(t,"flashMessages","service:flash-messages")}))}var i={name:"flash-messages",initialize:r} +e.default=i})),define("consul-ui/initializers/initialize-torii-callback",["exports","consul-ui/config/environment","torii/redirect-handler"],(function(e,t,n){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +var l={name:"torii-callback",before:"torii",initialize(e){arguments[1]&&(e=arguments[1]),t.default.torii&&t.default.torii.disableRedirectInitializer||(e.deferReadiness(),n.default.handle(window).catch((function(){e.advanceReadiness()})))}} +e.default=l})),define("consul-ui/initializers/initialize-torii-session",["exports","torii/bootstrap/session","torii/configuration"],(function(e,t,n){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +var l={name:"torii-session",after:"torii",initialize(e){arguments[1]&&(e=arguments[1]) +const l=(0,n.getConfiguration)() +l.sessionServiceName&&(0,t.default)(e,l.sessionServiceName)}} +e.default=l})),define("consul-ui/initializers/initialize-torii",["exports","torii/bootstrap/torii","torii/configuration","consul-ui/config/environment"],(function(e,t,n,l){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +var r={name:"torii",initialize(e){arguments[1]&&(e=arguments[1]),(0,n.configure)(l.default.torii||{}),(0,t.default)(e)}},i=r +e.default=i})) +define("consul-ui/initializers/model-fragments",["exports","ember-data-model-fragments","ember-data-model-fragments/ext"],(function(e,t,n){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +var l={name:"fragmentTransform",after:"ember-data",initialize(){}} +e.default=l})),define("consul-ui/initializers/setup-ember-can",["exports","ember-can/initializers/setup-ember-can"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"initialize",{enumerable:!0,get:function(){return t.initialize}})})),define("consul-ui/initializers/viewport-config",["exports","ember-in-viewport/initializers/viewport-config"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"initialize",{enumerable:!0,get:function(){return t.initialize}})})),define("consul-ui/instance-initializers/container",["exports","@ember/debug","require","deepmerge"],(function(e,t,n,l){Object.defineProperty(e,"__esModule",{value:!0}),e.default=e.services=void 0 +const r=document,i=l.default.all([...r.querySelectorAll("script[data-services]")].map((e=>JSON.parse(e.dataset.services)))) +e.services=i +var o={name:"container",initialize(e){(function(e,t){Object.entries(t).forEach((t=>{let[l,r]=t +if(1==("string"==typeof r.class)){if(!n.default.has(r.class))throw new Error(`Unable to locate '${r.class}'`) +e.register(l.replace("auth-provider:","torii-provider:"),(0,n.default)(r.class).default)}}))})(e,i) +const l=e.lookup("service:container") +let r=l.get("container-debug-adapter:main").catalogEntriesByType("service").filter((e=>e.startsWith("repository/")||"ui-config"===e));(0,t.runInDebug)((()=>r=r.filter((e=>!e.endsWith("-test"))))),r.push("repository/service"),r.forEach((e=>{const t=`service:${e}` +l.set(t,l.resolveRegistration(t))}))}} +e.default=o})),define("consul-ui/instance-initializers/ember-data",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +var t={name:"ember-data",initialize(){}} +e.default=t})),define("consul-ui/instance-initializers/href-to",["exports","@ember/routing/link-component"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=e.HrefTo=void 0 +class n{constructor(e,t){this.applicationInstance=e,this.target=t +const n=this.target.attributes.href +this.url=n&&n.value}handle(e){this.shouldHandle(e)&&(e.preventDefault(),this.applicationInstance.lookup("router:main").location.transitionTo(this.url))}shouldHandle(e){return this.isUnmodifiedLeftClick(e)&&!this.isIgnored(this.target)&&!this.isExternal(this.target)&&!this.hasActionHelper(this.target)&&!this.hasDownload(this.target)&&!this.isLinkComponent(this.target)}isUnmodifiedLeftClick(e){return!(void 0!==e.which&&1!==e.which||e.ctrlKey||e.metaKey)}isExternal(e){return"_blank"===e.getAttribute("target")}isIgnored(e){return e.dataset.nativeHref}hasActionHelper(e){return e.dataset.emberAction}hasDownload(e){return e.hasAttribute("download")}isLinkComponent(e){let n=!1 +const l=e.id +if(l){const e=this.applicationInstance.lookup("-view-registry:main")[l] +n=e&&e instanceof t.default}return n}recognizeUrl(e){let t=!1 +if(e){const n=this._getRouter(),l=this._getRootUrl(),r=0===e.indexOf(l),i=this.getUrlWithoutRoot(),o=n._router._routerMicrolib||n._router.router +t=r&&o.recognizer.recognize(i)}return t}getUrlWithoutRoot(){const e=this.applicationInstance.lookup("router:main").location +let t=e.getURL.apply({getHash:()=>"",location:{pathname:this.url},baseURL:e.baseURL,rootURL:e.rootURL,env:e.env},[]) +const n=t.indexOf("?") +return-1!==n&&(t=t.substr(0,n-1)),t}_getRouter(){return this.applicationInstance.lookup("service:router")}_getRootUrl(){let e=this._getRouter().get("rootURL") +return"/"!==e.charAt(e.length-1)&&(e+="/"),e}}e.HrefTo=n +var l={name:"href-to",initialize(e){if("undefined"==typeof FastBoot){const t=e.lookup("service:dom").document(),l=t=>{const l="A"===t.target.tagName?t.target:function(e){if(e.closest)return e.closest("a") +for(e=e.parentElement;e&&"A"!==e.tagName;)e=e.parentElement +return e}(t.target) +if(l){new n(e,l).handle(t)}} +t.body.addEventListener("click",l),e.reopen({willDestroy(){return t.body.removeEventListener("click",l),this._super(...arguments)}})}}} +e.default=l})),define("consul-ui/instance-initializers/ivy-codemirror",["exports"],(function(e){function t(e){const t=e.application.name,n=e.lookup("service:-document"),l=new Map(Object.entries(JSON.parse(n.querySelector(`[data-${t}-fs]`).textContent))) +CodeMirror.modeURL={replace:function(e,t){switch(t.trim()){case"javascript":return l.get(["codemirror","mode","javascript","javascript.js"].join("/")) +case"ruby":return l.get(["codemirror","mode","ruby","ruby.js"].join("/")) +case"yaml":return l.get(["codemirror","mode","yaml","yaml.js"].join("/")) +case"xml":return l.get(["codemirror","mode","xml","xml.js"].join("/"))}}} +e.resolveRegistration("component:ivy-codemirror").reopen({attributeBindings:["name"]})}Object.defineProperty(e,"__esModule",{value:!0}),e.initialize=t,e.default=void 0 +var n={initialize:t} +e.default=n})),define("consul-ui/instance-initializers/selection",["exports","consul-ui/env"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +var n={name:"selection",initialize(e){if((0,t.env)("CONSUL_UI_DISABLE_ANCHOR_SELECTION"))return +const n=e.lookup("service:dom"),l=n.document(),r=l.getElementsByTagName("html")[0],i=function(e){return"A"===e.tagName?e:n.closest("a",e)},o=function(e){if(r.classList.contains("is-debug"))return +const t=i(e.target) +if(t){if(void 0!==e.button&&2===e.button){const e=t.dataset.href +return void(e&&t.setAttribute("href",e))}const n=t.getAttribute("href") +n&&(t.dataset.href=n,t.removeAttribute("href"))}},a=function(e){if(r.classList.contains("is-debug"))return +const t=i(e.target) +if(t){const n=t.dataset.href +!function(){const t=(arguments.length>0&&void 0!==arguments[0]?arguments[0]:window).getSelection() +let n=!1 +try{n="isCollapsed"in t&&!t.isCollapsed&&t.toString().length>1}catch(e){}return n}()&&n&&t.setAttribute("href",n)}} +l.body.addEventListener("mousedown",o),l.body.addEventListener("mouseup",a),e.reopen({willDestroy:function(){return l.body.removeEventListener("mousedown",o),l.body.removeEventListener("mouseup",a),this._super(...arguments)}})}} +e.default=n})),define("consul-ui/instance-initializers/setup-routes",["exports","ember","torii/bootstrap/routing","torii/configuration","torii/compat/get-router-instance","torii/compat/get-router-lib","torii/router-dsl-ext"],(function(e,t,n,l,r,i,o){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +var a={name:"torii-setup-routes",initialize(e){if(!(0,l.getConfiguration)().sessionServiceName)return +let o=(0,r.default)(e) +const a=e.lookup("service:router") +var u=function(){var l=(0,i.default)(o).authenticatedRoutes +!t.default.isEmpty(l)&&(0,n.default)(e,l),a.off("routeWillChange",u)} +a.on("routeWillChange",u)}} +e.default=a})),define("consul-ui/instance-initializers/walk-providers",["exports","torii/lib/container-utils","torii/configuration"],(function(e,t,n){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +var l={name:"torii-walk-providers",initialize(e){let l=(0,n.getConfiguration)() +for(var r in l.providers)l.providers.hasOwnProperty(r)&&(0,t.lookup)(e,"torii-provider:"+r)}} +e.default=l})),define("consul-ui/locations/fsm-with-optional-test",["exports","consul-ui/locations/fsm-with-optional","consul-ui/locations/fsm","@ember/test-helpers"],(function(e,t,n,l){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +class r extends t.default{static create(){return new this(...arguments)}constructor(){var e,t,l +super(...arguments),l="fsm-with-optional-test",(t="implementation")in(e=this)?Object.defineProperty(e,t,{value:l,enumerable:!0,configurable:!0,writable:!0}):e[t]=l,this.location=new n.Location,this.machine=new n.FSM(this.location),this.doc={defaultView:{addEventListener:(e,t)=>{this.machine=new n.FSM(this.location,t)},removeEventListener:(e,t)=>{this.machine=new n.FSM}}}}visit(e){const t=this.container,n=this.container.lookup("router:main"),r=async e=>(await(0,l.settled)(),new Promise((e=>setTimeout(e(t),0)))),i=e=>{if(e.error)throw e.error +if("TransitionAborted"===e.name&&n._routerMicrolib.activeTransition)return n._routerMicrolib.activeTransition.then(r,i) +throw"TransitionAborted"===e.name?new Error(e.message):e} +return""===this.location.pathname?(this.rootURL=n.rootURL.replace(/\/$/,""),this.machine.state.path=this.location.pathname=`${this.rootURL}${e}`,this.path=this.getURL(),t.handleURL(`${this.path}`).then(r,i)):this.transitionTo(e).then(r,i)}}e.default=r})),define("consul-ui/locations/fsm-with-optional",["exports","consul-ui/env"],(function(e,t){function n(e,t){var n=Object.keys(e) +if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e) +t&&(l=l.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,l)}return n}function l(e){for(var t=1;t{if(t<3){let t=!1 +return Object.entries(i).reduce(((n,l)=>{let[r,i]=l +const o=i.exec(e) +return null!==o&&(n[r]={value:e,match:o[1]},t=!0),n}),this.optional),!t}return!0})).join("/")}optionalParams(){let e=this.optional||{} +return["partition","nspace","peer"].reduce(((t,n)=>{let l="" +return void 0!==e[n]&&(l=e[n].match),t[n]=l,t}),{})}visit(){return this.transitionTo(...arguments)}hrefTo(e,n,r){const i=l({},r) +void 0!==i.dc&&delete i.dc,void 0!==i.nspace&&(i.nspace=`~${i.nspace}`),void 0!==i.partition&&(i.partition=`_${i.partition}`),void 0!==i.peer&&(i.peer=`:${i.peer}`),void 0===this.router&&(this.router=this.container.lookup("router:main")) +let o=!0 +switch(!0){case"settings"===e:case e.startsWith("docs."):o=!1}if(this.router.currentRouteName.startsWith("docs.")&&(n.unshift((0,t.env)("CONSUL_DATACENTER_PRIMARY")),e.startsWith("dc")))return`console://${e} <= ${JSON.stringify(n)}` +const a=this.router._routerMicrolib +let u +try{u=a.generate(e,...n,{queryParams:{}})}catch(s){n=Object.values(a.oldState.params).reduce(((e,t)=>e.concat(Object.keys(t).length>0?t:[])),[]),u=a.generate(e,...n)}return this.formatURL(u,i,o)}transitionTo(e){if(this.router.currentRouteName.startsWith("docs")&&e.startsWith("console://"))return console.info(`location.transitionTo: ${e.substr(10)}`),!0 +const t=Object.entries(this.optionalParams()),n=this.getURLForTransition(e) +if(this._previousURL===n)return this.dispatch("push",e),Promise.resolve() +{const l=this.optionalParams() +return t.some((e=>{let[t,n]=e +return l[t]!==n}))&&this.dispatch("push",e),this.container.lookup("router:main").transitionTo(n)}}getURL(){const e=this.location.search||"" +let t="" +void 0!==this.location.hash&&(t=this.location.hash.substr(0)) +return`${this.getURLForTransition(this.location.pathname)}${e}${t}`}formatURL(e,t){let n=!(arguments.length>2&&void 0!==arguments[2])||arguments[2] +if(""!==e?(this.rootURL=this.rootURL.replace(o,""),this.baseURL=this.baseURL.replace(o,"")):"/"===this.baseURL[0]&&"/"===this.rootURL[0]&&(this.baseURL=this.baseURL.replace(o,"")),n){const n=e.split("/") +t=l(l({},this.optional),t||{}),t=Object.values(t).filter((e=>Boolean(e))).map((e=>e.value||e),[]),n.splice(...[1,0].concat(t)),e=n.join("/")}return`${this.baseURL}${this.rootURL}${e}`}changeURL(e,t){this.path=t +const n=this.machine.state +t=this.formatURL(t),n&&n.path===t||this.dispatch(e,t)}setURL(e){this.changeURL("push",e)}replaceURL(e){this.changeURL("replace",e)}onUpdateURL(e){this.callback=e}dispatch(e,t){const n={path:t,uuid:"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,(e=>{const t=16*Math.random()|0 +return("x"===e?t:3&t|8).toString(16)}))} +this.machine[`${e}State`](n,null,t),this.route({state:n})}willDestroy(){this.doc.defaultView.removeEventListener("popstate",this.route)}}})),define("consul-ui/locations/fsm",["exports"],(function(e){function t(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}Object.defineProperty(e,"__esModule",{value:!0}),e.default=e.Location=e.FSM=void 0 +e.FSM=class{constructor(e){let n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:()=>{} +t(this,"state",{}),this.listener=n,this.location=e}pushState(e,t,n){this.state=e,this.location.pathname=n,this.listener({state:this.state})}replaceState(){return this.pushState(...arguments)}} +e.Location=class{constructor(){t(this,"pathname",""),t(this,"search",""),t(this,"hash","")}} +e.default=class{static create(){return new this(...arguments)}constructor(e){t(this,"implementation","fsm"),this.container=Object.entries(e)[0][1]}visit(){return this.transitionTo(...arguments)}hrefTo(){}transitionTo(){}}})),define("consul-ui/machines/boolean.xstate",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +e.default={id:"boolean",initial:"false",states:{true:{on:{TOGGLE:[{target:"false"}],FALSE:[{target:"false"}]}},false:{on:{TOGGLE:[{target:"true"}],TRUE:[{target:"true"}]}}}}})),define("consul-ui/machines/validate.xstate",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +e.default={id:"form",initial:"idle",on:{RESET:[{target:"idle"}]},states:{idle:{on:{SUCCESS:[{target:"success"}],ERROR:[{target:"error"}]}},success:{},error:{}}}})),define("consul-ui/mixins/policy/as-many",["exports","@ember/object/mixin","@ember/object","consul-ui/utils/minimizeModel"],(function(e,t,n,l){function r(e,t){var n=Object.keys(e) +if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e) +t&&(l=l.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,l)}return n}function i(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const o=function(e,t,n,l){return(e||[]).map((function(e){const r={template:t,Name:e[n]} +return void 0!==e[l]&&(r[l]=e[l]),r}))},a=function(e){return(e||[]).map((function(e){return function(e){for(var t=1;t(n.Policies=a(n.Policies).concat(o(n.ServiceIdentities,"service-identity","ServiceName","Datacenters")).concat(o(n.NodeIdentities,"node-identity","NodeName","Datacenter")),t(e,n))))}),t)},respondForQuery:function(e,t){return this._super((function(t){return e((function(e,n){return t(e,n.map((function(e){return e.Policies=a(e.Policies).concat(o(e.ServiceIdentities,"service-identity","ServiceName","Datacenters")).concat(o(e.NodeIdentities,"node-identity","NodeName","Datacenter")),e})))}))}),t)},serialize:function(e,t){const n=this._super(...arguments) +return n.ServiceIdentities=u(n.Policies,"service-identity","ServiceName","Datacenters"),n.NodeIdentities=u(n.Policies,"node-identity","NodeName","Datacenter"),n.Policies=(0,l.default)(s(n.Policies)),n}}) +e.default=c})),define("consul-ui/mixins/role/as-many",["exports","@ember/object/mixin","consul-ui/utils/minimizeModel"],(function(e,t,n){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +var l=t.default.create({respondForQueryRecord:function(e,t){return this._super((function(t){return e(((e,n)=>(n.Roles=void 0===n.Roles||null===n.Roles?[]:n.Roles,t(e,n))))}),t)},respondForQuery:function(e,t){return this._super((function(t){return e((function(e,n){return t(e,n.map((function(e){return e.Roles=void 0===e.Roles||null===e.Roles?[]:e.Roles,e})))}))}),t)},serialize:function(e,t){const l=this._super(...arguments) +return l.Roles=(0,n.default)(l.Roles),l}}) +e.default=l})),define("consul-ui/mixins/slots",["exports","block-slots/mixins/slots"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/mixins/with-blocking-actions",["exports","@ember/object/mixin","@ember/service","@ember/object","ember-inflector"],(function(e,t,n,l,r){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +var i=t.default.create({_feedback:(0,n.inject)("feedback"),settings:(0,n.inject)("settings"),init:function(){this._super(...arguments) +const e=this._feedback,t=this;(0,l.set)(this,"feedback",{execute:function(n,l,i){const o=t.routeName.split(".") +o.pop() +const a=(0,r.singularize)(o.pop()) +return e.execute(n,l,i,a)}})},afterCreate:function(e){return this.afterUpdate(...arguments)},afterUpdate:function(e){const t=this.routeName.split(".") +return t.pop(),this.transitionTo(t.join("."))},afterDelete:function(e){const t=this.routeName.split(".") +return"index"===t.pop()?this.refresh():this.transitionTo(t.join("."))},errorCreate:function(e,t){return e},errorUpdate:function(e,t){return e},errorDelete:function(e,t){return e},actions:{cancel:function(){return this.afterUpdate(...arguments)},create:function(e,t){return t.preventDefault(),this.feedback.execute((()=>this.repo.persist(e).then((e=>this.afterCreate(...arguments)))),"create",((e,t)=>this.errorCreate(e,t)))},update:function(e,t){return t.preventDefault(),this.feedback.execute((()=>this.repo.persist(e).then((()=>this.afterUpdate(...arguments)))),"update",((e,t)=>this.errorUpdate(e,t)))},delete:function(e){return this.feedback.execute((()=>this.repo.remove(e).then((()=>this.afterDelete(...arguments)))),"delete",((e,t)=>this.errorDelete(e,t)))},use:function(e){return this.repo.findBySlug({dc:(0,l.get)(e,"Datacenter"),ns:(0,l.get)(e,"Namespace"),partition:(0,l.get)(e,"Partition"),id:(0,l.get)(e,"AccessorID")}).then((e=>this.settings.persist({token:{AccessorID:(0,l.get)(e,"AccessorID"),SecretID:(0,l.get)(e,"SecretID"),Namespace:(0,l.get)(e,"Namespace"),Partition:(0,l.get)(e,"Partition")}})))},logout:function(e){return this.settings.delete("token")},clone:function(e){let t +return this.feedback.execute((()=>this.repo.clone(e).then((e=>(t=e,this.afterDelete(...arguments)))).then((function(){return t}))),"clone")}}}) +e.default=i})),define("consul-ui/models/auth-method",["exports","@ember-data/model","@ember/object/computed","parse-duration","@ember/object"],(function(e,t,n,l,r){var i,o,a,u,s,c,d,p,f,m,h,b,y,g,v,O,P,x,w,j,_,k,S,N,C,z,M,D,T,E,L,A,R,I,$,F +function U(e,t,n,l){n&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(l):void 0})}function B(e,t,n,l,r){var i={} +return Object.keys(l).forEach((function(e){i[e]=l[e]})),i.enumerable=!!i.enumerable,i.configurable=!!i.configurable,("value"in i||i.initializer)&&(i.writable=!0),i=n.slice().reverse().reduce((function(n,l){return l(e,t,n)||n}),i),r&&void 0!==i.initializer&&(i.value=i.initializer?i.initializer.call(r):void 0,i.initializer=void 0),void 0===i.initializer&&(Object.defineProperty(e,t,i),i=null),i}Object.defineProperty(e,"__esModule",{value:!0}),e.default=e.SLUG_KEY=e.PRIMARY_KEY=void 0 +e.PRIMARY_KEY="uid" +e.SLUG_KEY="Name" +let q=(i=(0,t.attr)("string"),o=(0,t.attr)("string"),a=(0,t.attr)("string"),u=(0,t.attr)("string"),s=(0,t.attr)("string"),c=(0,t.attr)("string",{defaultValue:()=>""}),d=(0,t.attr)("string",{defaultValue:()=>""}),p=(0,t.attr)("string",{defaultValue:()=>"local"}),f=(0,t.attr)("string"),m=(0,t.attr)(),h=(0,n.or)("DisplayName","Name"),b=(0,t.attr)(),y=(0,t.attr)("string"),g=(0,t.attr)("number"),v=(0,t.attr)("number"),O=(0,t.attr)(),P=(0,t.attr)(),x=(0,r.computed)("MaxTokenTTL"),w=class extends t.default{constructor(){super(...arguments),U(this,"uid",j,this),U(this,"Name",_,this),U(this,"Datacenter",k,this),U(this,"Namespace",S,this),U(this,"Partition",N,this),U(this,"Description",C,this),U(this,"DisplayName",z,this),U(this,"TokenLocality",M,this),U(this,"Type",D,this),U(this,"NamespaceRules",T,this),U(this,"MethodName",E,this),U(this,"Config",L,this),U(this,"MaxTokenTTL",A,this),U(this,"CreateIndex",R,this),U(this,"ModifyIndex",I,this),U(this,"Datacenters",$,this),U(this,"meta",F,this)}get TokenTTL(){return(0,l.default)(this.MaxTokenTTL)}},j=B(w.prototype,"uid",[i],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),_=B(w.prototype,"Name",[o],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),k=B(w.prototype,"Datacenter",[a],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),S=B(w.prototype,"Namespace",[u],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),N=B(w.prototype,"Partition",[s],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),C=B(w.prototype,"Description",[c],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),z=B(w.prototype,"DisplayName",[d],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),M=B(w.prototype,"TokenLocality",[p],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),D=B(w.prototype,"Type",[f],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),T=B(w.prototype,"NamespaceRules",[m],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),E=B(w.prototype,"MethodName",[h],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),L=B(w.prototype,"Config",[b],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),A=B(w.prototype,"MaxTokenTTL",[y],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),R=B(w.prototype,"CreateIndex",[g],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),I=B(w.prototype,"ModifyIndex",[v],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),$=B(w.prototype,"Datacenters",[O],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),F=B(w.prototype,"meta",[P],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),B(w.prototype,"TokenTTL",[x],Object.getOwnPropertyDescriptor(w.prototype,"TokenTTL"),w.prototype),w) +e.default=q})),define("consul-ui/models/binding-rule",["exports","@ember-data/model"],(function(e,t){var n,l,r,i,o,a,u,s,c,d,p,f,m,h,b,y,g,v,O,P,x,w,j,_,k +function S(e,t,n,l){n&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(l):void 0})}function N(e,t,n,l,r){var i={} +return Object.keys(l).forEach((function(e){i[e]=l[e]})),i.enumerable=!!i.enumerable,i.configurable=!!i.configurable,("value"in i||i.initializer)&&(i.writable=!0),i=n.slice().reverse().reduce((function(n,l){return l(e,t,n)||n}),i),r&&void 0!==i.initializer&&(i.value=i.initializer?i.initializer.call(r):void 0,i.initializer=void 0),void 0===i.initializer&&(Object.defineProperty(e,t,i),i=null),i}Object.defineProperty(e,"__esModule",{value:!0}),e.default=e.SLUG_KEY=e.PRIMARY_KEY=void 0 +e.PRIMARY_KEY="uid" +e.SLUG_KEY="ID" +let C=(n=(0,t.attr)("string"),l=(0,t.attr)("string"),r=(0,t.attr)("string"),i=(0,t.attr)("string"),o=(0,t.attr)("string"),a=(0,t.attr)("string",{defaultValue:()=>""}),u=(0,t.attr)("string"),s=(0,t.attr)("string",{defaultValue:()=>""}),c=(0,t.attr)("string"),d=(0,t.attr)("string"),p=(0,t.attr)("number"),f=(0,t.attr)("number"),m=class extends t.default{constructor(){super(...arguments),S(this,"uid",h,this),S(this,"ID",b,this),S(this,"Datacenter",y,this),S(this,"Namespace",g,this),S(this,"Partition",v,this),S(this,"Description",O,this),S(this,"AuthMethod",P,this),S(this,"Selector",x,this),S(this,"BindType",w,this),S(this,"BindName",j,this),S(this,"CreateIndex",_,this),S(this,"ModifyIndex",k,this)}},h=N(m.prototype,"uid",[n],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),b=N(m.prototype,"ID",[l],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),y=N(m.prototype,"Datacenter",[r],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),g=N(m.prototype,"Namespace",[i],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),v=N(m.prototype,"Partition",[o],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),O=N(m.prototype,"Description",[a],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),P=N(m.prototype,"AuthMethod",[u],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),x=N(m.prototype,"Selector",[s],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),w=N(m.prototype,"BindType",[c],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),j=N(m.prototype,"BindName",[d],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),_=N(m.prototype,"CreateIndex",[p],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),k=N(m.prototype,"ModifyIndex",[f],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),m) +e.default=C})),define("consul-ui/models/coordinate",["exports","@ember-data/model"],(function(e,t){var n,l,r,i,o,a,u,s,c,d,p,f,m,h,b +function y(e,t,n,l){n&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(l):void 0})}function g(e,t,n,l,r){var i={} +return Object.keys(l).forEach((function(e){i[e]=l[e]})),i.enumerable=!!i.enumerable,i.configurable=!!i.configurable,("value"in i||i.initializer)&&(i.writable=!0),i=n.slice().reverse().reduce((function(n,l){return l(e,t,n)||n}),i),r&&void 0!==i.initializer&&(i.value=i.initializer?i.initializer.call(r):void 0,i.initializer=void 0),void 0===i.initializer&&(Object.defineProperty(e,t,i),i=null),i}Object.defineProperty(e,"__esModule",{value:!0}),e.default=e.SLUG_KEY=e.PRIMARY_KEY=void 0 +e.PRIMARY_KEY="uid" +e.SLUG_KEY="Node" +let v=(n=(0,t.attr)("string"),l=(0,t.attr)("string"),r=(0,t.attr)(),i=(0,t.attr)("string"),o=(0,t.attr)("string"),a=(0,t.attr)("string"),u=(0,t.attr)("number"),s=class extends t.default{constructor(){super(...arguments),y(this,"uid",c,this),y(this,"Node",d,this),y(this,"Coord",p,this),y(this,"Segment",f,this),y(this,"Datacenter",m,this),y(this,"Partition",h,this),y(this,"SyncTime",b,this)}},c=g(s.prototype,"uid",[n],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),d=g(s.prototype,"Node",[l],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),p=g(s.prototype,"Coord",[r],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),f=g(s.prototype,"Segment",[i],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),m=g(s.prototype,"Datacenter",[o],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),h=g(s.prototype,"Partition",[a],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),b=g(s.prototype,"SyncTime",[u],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),s) +e.default=v})),define("consul-ui/models/dc",["exports","@ember-data/model"],(function(e,t){var n,l,r,i,o,a,u,s,c,d,p,f,m,h,b,y,g,v,O,P,x,w,j,_,k,S,N,C,z,M,D +function T(e,t,n,l){n&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(l):void 0})}function E(e,t,n,l,r){var i={} +return Object.keys(l).forEach((function(e){i[e]=l[e]})),i.enumerable=!!i.enumerable,i.configurable=!!i.configurable,("value"in i||i.initializer)&&(i.writable=!0),i=n.slice().reverse().reduce((function(n,l){return l(e,t,n)||n}),i),r&&void 0!==i.initializer&&(i.value=i.initializer?i.initializer.call(r):void 0,i.initializer=void 0),void 0===i.initializer&&(Object.defineProperty(e,t,i),i=null),i}Object.defineProperty(e,"__esModule",{value:!0}),e.default=e.SLUG_KEY=e.FOREIGN_KEY=e.PRIMARY_KEY=void 0 +e.PRIMARY_KEY="uid" +e.FOREIGN_KEY="Datacenter" +e.SLUG_KEY="Name" +let L=(n=(0,t.attr)("string"),l=(0,t.attr)("string"),r=(0,t.attr)("boolean"),i=(0,t.attr)("number"),o=(0,t.attr)("number"),a=(0,t.attr)("string"),u=(0,t.attr)(),s=(0,t.attr)(),c=(0,t.attr)(),d=(0,t.attr)(),p=(0,t.attr)(),f=(0,t.attr)("boolean"),m=(0,t.attr)("boolean"),h=(0,t.attr)("string"),b=(0,t.attr)("boolean",{defaultValue:()=>!0}),y=class extends t.default{constructor(){super(...arguments),T(this,"uri",g,this),T(this,"Name",v,this),T(this,"Healthy",O,this),T(this,"FailureTolerance",P,this),T(this,"OptimisticFailureTolerance",x,this),T(this,"Leader",w,this),T(this,"Voters",j,this),T(this,"Servers",_,this),T(this,"RedundancyZones",k,this),T(this,"Default",S,this),T(this,"ReadReplicas",N,this),T(this,"Local",C,this),T(this,"Primary",z,this),T(this,"DefaultACLPolicy",M,this),T(this,"MeshEnabled",D,this)}},g=E(y.prototype,"uri",[n],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),v=E(y.prototype,"Name",[l],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),O=E(y.prototype,"Healthy",[r],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),P=E(y.prototype,"FailureTolerance",[i],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),x=E(y.prototype,"OptimisticFailureTolerance",[o],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),w=E(y.prototype,"Leader",[a],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),j=E(y.prototype,"Voters",[u],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),_=E(y.prototype,"Servers",[s],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),k=E(y.prototype,"RedundancyZones",[c],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),S=E(y.prototype,"Default",[d],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),N=E(y.prototype,"ReadReplicas",[p],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),C=E(y.prototype,"Local",[f],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),z=E(y.prototype,"Primary",[m],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),M=E(y.prototype,"DefaultACLPolicy",[h],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),D=E(y.prototype,"MeshEnabled",[b],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),y) +e.default=L})),define("consul-ui/models/discovery-chain",["exports","@ember-data/model"],(function(e,t){var n,l,r,i,o,a,u,s,c,d,p,f,m,h,b +function y(e,t,n,l){n&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(l):void 0})}function g(e,t,n,l,r){var i={} +return Object.keys(l).forEach((function(e){i[e]=l[e]})),i.enumerable=!!i.enumerable,i.configurable=!!i.configurable,("value"in i||i.initializer)&&(i.writable=!0),i=n.slice().reverse().reduce((function(n,l){return l(e,t,n)||n}),i),r&&void 0!==i.initializer&&(i.value=i.initializer?i.initializer.call(r):void 0,i.initializer=void 0),void 0===i.initializer&&(Object.defineProperty(e,t,i),i=null),i}Object.defineProperty(e,"__esModule",{value:!0}),e.default=e.SLUG_KEY=e.PRIMARY_KEY=void 0 +e.PRIMARY_KEY="uid" +e.SLUG_KEY="ServiceName" +let v=(n=(0,t.attr)("string"),l=(0,t.attr)("string"),r=(0,t.attr)("string"),i=(0,t.attr)("string"),o=(0,t.attr)("string"),a=(0,t.attr)(),u=(0,t.attr)(),s=class extends t.default{constructor(){super(...arguments),y(this,"uid",c,this),y(this,"ServiceName",d,this),y(this,"Datacenter",p,this),y(this,"Partition",f,this),y(this,"Namespace",m,this),y(this,"Chain",h,this),y(this,"meta",b,this)}},c=g(s.prototype,"uid",[n],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),d=g(s.prototype,"ServiceName",[l],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),p=g(s.prototype,"Datacenter",[r],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),f=g(s.prototype,"Partition",[i],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),m=g(s.prototype,"Namespace",[o],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),h=g(s.prototype,"Chain",[a],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),b=g(s.prototype,"meta",[u],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),s) +e.default=v})),define("consul-ui/models/gateway-config",["exports","ember-data-model-fragments/fragment","ember-data-model-fragments/attributes","@ember-data/model"],(function(e,t,n,l){var r,i,o,a,u +function s(e,t,n,l){n&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(l):void 0})}function c(e,t,n,l,r){var i={} +return Object.keys(l).forEach((function(e){i[e]=l[e]})),i.enumerable=!!i.enumerable,i.configurable=!!i.configurable,("value"in i||i.initializer)&&(i.writable=!0),i=n.slice().reverse().reduce((function(n,l){return l(e,t,n)||n}),i),r&&void 0!==i.initializer&&(i.value=i.initializer?i.initializer.call(r):void 0,i.initializer=void 0),void 0===i.initializer&&(Object.defineProperty(e,t,i),i=null),i}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +let d=(r=(0,l.attr)("number",{defaultValue:()=>0}),i=(0,n.array)("string",{defaultValue:()=>[]}),o=class extends t.default{constructor(){super(...arguments),s(this,"AssociatedServiceCount",a,this),s(this,"Addresses",u,this)}},a=c(o.prototype,"AssociatedServiceCount",[r],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),u=c(o.prototype,"Addresses",[i],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),o) +e.default=d})),define("consul-ui/models/health-check",["exports","ember-data-model-fragments/fragment","ember-data-model-fragments/attributes","@ember-data/model","@ember/object","consul-ui/decorators/replace"],(function(e,t,n,l,r,i){var o,a,u,s,c,d,p,f,m,h,b,y,g,v,O,P,x,w,j,_,k,S,N,C,z,M,D,T,E +function L(e,t,n,l){n&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(l):void 0})}function A(e,t,n,l,r){var i={} +return Object.keys(l).forEach((function(e){i[e]=l[e]})),i.enumerable=!!i.enumerable,i.configurable=!!i.configurable,("value"in i||i.initializer)&&(i.writable=!0),i=n.slice().reverse().reduce((function(n,l){return l(e,t,n)||n}),i),r&&void 0!==i.initializer&&(i.value=i.initializer?i.initializer.call(r):void 0,i.initializer=void 0),void 0===i.initializer&&(Object.defineProperty(e,t,i),i=null),i}Object.defineProperty(e,"__esModule",{value:!0}),e.default=e.schema=void 0 +e.schema={Status:{allowedValues:["passing","warning","critical"]},Type:{allowedValues:["serf","script","http","tcp","ttl","docker","grpc","alias"]}} +let R=(o=(0,l.attr)("string"),a=(0,l.attr)("string"),u=(0,i.replace)("","serf"),s=(0,l.attr)("string"),c=(0,l.attr)("string"),d=(0,l.attr)("string"),p=(0,l.attr)("string"),f=(0,l.attr)("string"),m=(0,l.attr)("string"),h=(0,l.attr)("string"),b=(0,i.nullValue)([]),y=(0,n.array)("string"),g=(0,l.attr)(),v=(0,l.attr)("boolean"),O=(0,r.computed)("ServiceID"),P=(0,r.computed)("Type"),x=class extends t.default{constructor(){super(...arguments),L(this,"Name",w,this),L(this,"CheckID",j,this),L(this,"Type",_,this),L(this,"Status",k,this),L(this,"Notes",S,this),L(this,"Output",N,this),L(this,"ServiceName",C,this),L(this,"ServiceID",z,this),L(this,"Node",M,this),L(this,"ServiceTags",D,this),L(this,"Definition",T,this),L(this,"Exposed",E,this)}get Kind(){return""===this.ServiceID?"node":"service"}get Exposable(){return["http","grpc"].includes(this.Type)}},w=A(x.prototype,"Name",[o],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),j=A(x.prototype,"CheckID",[a],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),_=A(x.prototype,"Type",[u,s],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),k=A(x.prototype,"Status",[c],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),S=A(x.prototype,"Notes",[d],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),N=A(x.prototype,"Output",[p],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),C=A(x.prototype,"ServiceName",[f],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),z=A(x.prototype,"ServiceID",[m],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),M=A(x.prototype,"Node",[h],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),D=A(x.prototype,"ServiceTags",[b,y],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),T=A(x.prototype,"Definition",[g],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),E=A(x.prototype,"Exposed",[v],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),A(x.prototype,"Kind",[O],Object.getOwnPropertyDescriptor(x.prototype,"Kind"),x.prototype),A(x.prototype,"Exposable",[P],Object.getOwnPropertyDescriptor(x.prototype,"Exposable"),x.prototype),x) +e.default=R})),define("consul-ui/models/intention-permission-http-header",["exports","ember-data-model-fragments/fragment","@ember-data/model","@ember/object","@ember/object/computed"],(function(e,t,n,l,r){var i,o,a,u,s,c,d,p,f,m,h,b,y,g,v,O +function P(e,t,n,l){n&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(l):void 0})}function x(e,t,n,l,r){var i={} +return Object.keys(l).forEach((function(e){i[e]=l[e]})),i.enumerable=!!i.enumerable,i.configurable=!!i.configurable,("value"in i||i.initializer)&&(i.writable=!0),i=n.slice().reverse().reduce((function(n,l){return l(e,t,n)||n}),i),r&&void 0!==i.initializer&&(i.value=i.initializer?i.initializer.call(r):void 0,i.initializer=void 0),void 0===i.initializer&&(Object.defineProperty(e,t,i),i=null),i}Object.defineProperty(e,"__esModule",{value:!0}),e.default=e.schema=void 0 +const w={Name:{required:!0},HeaderType:{allowedValues:["Exact","Prefix","Suffix","Regex","Present"]}} +e.schema=w +let j=(i=(0,n.attr)("string"),o=(0,n.attr)("string"),a=(0,n.attr)("string"),u=(0,n.attr)("string"),s=(0,n.attr)("string"),c=(0,n.attr)(),d=(0,r.or)(...w.HeaderType.allowedValues),p=(0,l.computed)(...w.HeaderType.allowedValues),f=class extends t.default{constructor(){super(...arguments),P(this,"Name",m,this),P(this,"Exact",h,this),P(this,"Prefix",b,this),P(this,"Suffix",y,this),P(this,"Regex",g,this),P(this,"Present",v,this),P(this,"Value",O,this)}get HeaderType(){return w.HeaderType.allowedValues.find((e=>void 0!==this[e]))}},m=x(f.prototype,"Name",[i],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),h=x(f.prototype,"Exact",[o],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),b=x(f.prototype,"Prefix",[a],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),y=x(f.prototype,"Suffix",[u],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),g=x(f.prototype,"Regex",[s],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),v=x(f.prototype,"Present",[c],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),O=x(f.prototype,"Value",[d],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),x(f.prototype,"HeaderType",[p],Object.getOwnPropertyDescriptor(f.prototype,"HeaderType"),f.prototype),f) +e.default=j})),define("consul-ui/models/intention-permission-http",["exports","ember-data-model-fragments/fragment","ember-data-model-fragments/attributes","@ember-data/model","@ember/object","@ember/object/computed"],(function(e,t,n,l,r,i){var o,a,u,s,c,d,p,f,m,h,b,y,g,v +function O(e,t,n,l){n&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(l):void 0})}function P(e,t,n,l,r){var i={} +return Object.keys(l).forEach((function(e){i[e]=l[e]})),i.enumerable=!!i.enumerable,i.configurable=!!i.configurable,("value"in i||i.initializer)&&(i.writable=!0),i=n.slice().reverse().reduce((function(n,l){return l(e,t,n)||n}),i),r&&void 0!==i.initializer&&(i.value=i.initializer?i.initializer.call(r):void 0,i.initializer=void 0),void 0===i.initializer&&(Object.defineProperty(e,t,i),i=null),i}Object.defineProperty(e,"__esModule",{value:!0}),e.default=e.schema=void 0 +const x={PathType:{allowedValues:["PathPrefix","PathExact","PathRegex"]},Methods:{allowedValues:["GET","HEAD","POST","PUT","DELETE","CONNECT","OPTIONS","TRACE","PATCH"]}} +e.schema=x +let w=(o=(0,l.attr)("string"),a=(0,l.attr)("string"),u=(0,l.attr)("string"),s=(0,n.fragmentArray)("intention-permission-http-header"),c=(0,n.array)("string"),d=(0,i.or)(...x.PathType.allowedValues),p=(0,r.computed)(...x.PathType.allowedValues),f=class extends t.default{constructor(){super(...arguments),O(this,"PathExact",m,this),O(this,"PathPrefix",h,this),O(this,"PathRegex",b,this),O(this,"Header",y,this),O(this,"Methods",g,this),O(this,"Path",v,this)}get PathType(){return x.PathType.allowedValues.find((e=>"string"==typeof this[e]))}},m=P(f.prototype,"PathExact",[o],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),h=P(f.prototype,"PathPrefix",[a],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),b=P(f.prototype,"PathRegex",[u],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),y=P(f.prototype,"Header",[s],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),g=P(f.prototype,"Methods",[c],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),v=P(f.prototype,"Path",[d],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),P(f.prototype,"PathType",[p],Object.getOwnPropertyDescriptor(f.prototype,"PathType"),f.prototype),f) +e.default=w})),define("consul-ui/models/intention-permission",["exports","ember-data-model-fragments/fragment","ember-data-model-fragments/attributes","@ember-data/model"],(function(e,t,n,l){var r,i,o,a,u +function s(e,t,n,l){n&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(l):void 0})}function c(e,t,n,l,r){var i={} +return Object.keys(l).forEach((function(e){i[e]=l[e]})),i.enumerable=!!i.enumerable,i.configurable=!!i.configurable,("value"in i||i.initializer)&&(i.writable=!0),i=n.slice().reverse().reduce((function(n,l){return l(e,t,n)||n}),i),r&&void 0!==i.initializer&&(i.value=i.initializer?i.initializer.call(r):void 0,i.initializer=void 0),void 0===i.initializer&&(Object.defineProperty(e,t,i),i=null),i}Object.defineProperty(e,"__esModule",{value:!0}),e.default=e.schema=void 0 +const d={Action:{defaultValue:"allow",allowedValues:["allow","deny"]}} +e.schema=d +let p=(r=(0,l.attr)("string",{defaultValue:()=>d.Action.defaultValue}),i=(0,n.fragment)("intention-permission-http"),o=class extends t.default{constructor(){super(...arguments),s(this,"Action",a,this),s(this,"HTTP",u,this)}},a=c(o.prototype,"Action",[r],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),u=c(o.prototype,"HTTP",[i],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),o) +e.default=p})),define("consul-ui/models/intention",["exports","@ember-data/model","@ember/object","ember-data-model-fragments/attributes","consul-ui/decorators/replace"],(function(e,t,n,l,r){var i,o,a,u,s,c,d,p,f,m,h,b,y,g,v,O,P,x,w,j,_,k,S,N,C,z,M,D,T,E,L,A,R,I,$,F,U,B,q,K,H,Y,G,V,W,Z,Q,J,X,ee,te,ne +function le(e,t,n,l){n&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(l):void 0})}function re(e,t,n,l,r){var i={} +return Object.keys(l).forEach((function(e){i[e]=l[e]})),i.enumerable=!!i.enumerable,i.configurable=!!i.configurable,("value"in i||i.initializer)&&(i.writable=!0),i=n.slice().reverse().reduce((function(n,l){return l(e,t,n)||n}),i),r&&void 0!==i.initializer&&(i.value=i.initializer?i.initializer.call(r):void 0,i.initializer=void 0),void 0===i.initializer&&(Object.defineProperty(e,t,i),i=null),i}Object.defineProperty(e,"__esModule",{value:!0}),e.default=e.SLUG_KEY=e.PRIMARY_KEY=void 0 +e.PRIMARY_KEY="uid" +e.SLUG_KEY="ID" +let ie=(i=(0,t.attr)("string"),o=(0,t.attr)("string"),a=(0,t.attr)("string"),u=(0,t.attr)("string"),s=(0,r.default)("",void 0),c=(0,t.attr)("string"),d=(0,t.attr)("string",{defaultValue:()=>"*"}),p=(0,t.attr)("string",{defaultValue:()=>"*"}),f=(0,t.attr)("string",{defaultValue:()=>"default"}),m=(0,t.attr)("string",{defaultValue:()=>"default"}),h=(0,t.attr)("string",{defaultValue:()=>"default"}),b=(0,t.attr)("string",{defaultValue:()=>"default"}),y=(0,t.attr)("number"),g=(0,t.attr)("string",{defaultValue:()=>"consul"}),v=(0,r.nullValue)(void 0),O=(0,t.attr)("string"),P=(0,t.attr)("string"),x=(0,t.attr)("boolean",{defaultValue:()=>!0}),w=(0,t.attr)("number"),j=(0,t.attr)("date"),_=(0,t.attr)("date"),k=(0,t.attr)("number"),S=(0,t.attr)("number"),N=(0,t.attr)(),C=(0,t.attr)({defaultValue:()=>[]}),z=(0,l.fragmentArray)("intention-permission"),M=(0,n.computed)("Meta"),D=class extends t.default{constructor(){super(...arguments),le(this,"uid",T,this),le(this,"ID",E,this),le(this,"Datacenter",L,this),le(this,"Description",A,this),le(this,"SourcePeer",R,this),le(this,"SourceName",I,this),le(this,"DestinationName",$,this),le(this,"SourceNS",F,this),le(this,"DestinationNS",U,this),le(this,"SourcePartition",B,this),le(this,"DestinationPartition",q,this),le(this,"Precedence",K,this),le(this,"SourceType",H,this),le(this,"Action",Y,this),le(this,"LegacyID",G,this),le(this,"Legacy",V,this),le(this,"SyncTime",W,this),le(this,"CreatedAt",Z,this),le(this,"UpdatedAt",Q,this),le(this,"CreateIndex",J,this),le(this,"ModifyIndex",X,this),le(this,"Meta",ee,this),le(this,"Resources",te,this),le(this,"Permissions",ne,this)}get IsManagedByCRD(){return void 0!==Object.entries(this.Meta||{}).find((e=>{let[t,n]=e +return"external-source"===t&&"kubernetes"===n}))}},T=re(D.prototype,"uid",[i],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),E=re(D.prototype,"ID",[o],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),L=re(D.prototype,"Datacenter",[a],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),A=re(D.prototype,"Description",[u],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),R=re(D.prototype,"SourcePeer",[s,c],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),I=re(D.prototype,"SourceName",[d],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),$=re(D.prototype,"DestinationName",[p],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),F=re(D.prototype,"SourceNS",[f],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),U=re(D.prototype,"DestinationNS",[m],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),B=re(D.prototype,"SourcePartition",[h],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),q=re(D.prototype,"DestinationPartition",[b],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),K=re(D.prototype,"Precedence",[y],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),H=re(D.prototype,"SourceType",[g],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),Y=re(D.prototype,"Action",[v,O],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),G=re(D.prototype,"LegacyID",[P],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),V=re(D.prototype,"Legacy",[x],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),W=re(D.prototype,"SyncTime",[w],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),Z=re(D.prototype,"CreatedAt",[j],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),Q=re(D.prototype,"UpdatedAt",[_],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),J=re(D.prototype,"CreateIndex",[k],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),X=re(D.prototype,"ModifyIndex",[S],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),ee=re(D.prototype,"Meta",[N],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),te=re(D.prototype,"Resources",[C],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),ne=re(D.prototype,"Permissions",[z],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),re(D.prototype,"IsManagedByCRD",[M],Object.getOwnPropertyDescriptor(D.prototype,"IsManagedByCRD"),D.prototype),D) +e.default=ie})) +define("consul-ui/models/kv",["exports","@ember-data/model","@ember/object","consul-ui/utils/isFolder","consul-ui/decorators/replace"],(function(e,t,n,l,r){var i,o,a,u,s,c,d,p,f,m,h,b,y,g,v,O,P,x,w,j,_,k,S,N,C,z,M,D,T,E,L,A +function R(e,t,n,l){n&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(l):void 0})}function I(e,t,n,l,r){var i={} +return Object.keys(l).forEach((function(e){i[e]=l[e]})),i.enumerable=!!i.enumerable,i.configurable=!!i.configurable,("value"in i||i.initializer)&&(i.writable=!0),i=n.slice().reverse().reduce((function(n,l){return l(e,t,n)||n}),i),r&&void 0!==i.initializer&&(i.value=i.initializer?i.initializer.call(r):void 0,i.initializer=void 0),void 0===i.initializer&&(Object.defineProperty(e,t,i),i=null),i}Object.defineProperty(e,"__esModule",{value:!0}),e.default=e.SLUG_KEY=e.PRIMARY_KEY=void 0 +e.PRIMARY_KEY="uid" +e.SLUG_KEY="Key" +let $=(i=(0,t.attr)("string"),o=(0,t.attr)("string"),a=(0,t.attr)("number"),u=(0,t.attr)(),s=(0,t.attr)("string"),c=(0,t.attr)("string"),d=(0,t.attr)("string"),p=(0,t.attr)("number"),f=(0,t.attr)("number"),m=(0,r.nullValue)(void 0),h=(0,t.attr)("string"),b=(0,t.attr)("number"),y=(0,t.attr)("number"),g=(0,t.attr)("string"),v=(0,t.attr)({defaultValue:()=>[]}),O=(0,n.computed)("isFolder"),P=(0,n.computed)("Key"),x=class extends t.default{constructor(){super(...arguments),R(this,"uid",w,this),R(this,"Key",j,this),R(this,"SyncTime",_,this),R(this,"meta",k,this),R(this,"Datacenter",S,this),R(this,"Namespace",N,this),R(this,"Partition",C,this),R(this,"LockIndex",z,this),R(this,"Flags",M,this),R(this,"Value",D,this),R(this,"CreateIndex",T,this),R(this,"ModifyIndex",E,this),R(this,"Session",L,this),R(this,"Resources",A,this)}get Kind(){return this.isFolder?"folder":"key"}get isFolder(){return(0,l.default)(this.Key||"")}},w=I(x.prototype,"uid",[i],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),j=I(x.prototype,"Key",[o],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),_=I(x.prototype,"SyncTime",[a],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),k=I(x.prototype,"meta",[u],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),S=I(x.prototype,"Datacenter",[s],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),N=I(x.prototype,"Namespace",[c],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),C=I(x.prototype,"Partition",[d],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),z=I(x.prototype,"LockIndex",[p],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),M=I(x.prototype,"Flags",[f],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),D=I(x.prototype,"Value",[m,h],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),T=I(x.prototype,"CreateIndex",[b],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),E=I(x.prototype,"ModifyIndex",[y],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),L=I(x.prototype,"Session",[g],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),A=I(x.prototype,"Resources",[v],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),I(x.prototype,"Kind",[O],Object.getOwnPropertyDescriptor(x.prototype,"Kind"),x.prototype),I(x.prototype,"isFolder",[P],Object.getOwnPropertyDescriptor(x.prototype,"isFolder"),x.prototype),x) +e.default=$})),define("consul-ui/models/license",["exports","@ember-data/model"],(function(e,t){var n,l,r,i,o,a,u,s,c,d,p,f,m,h,b,y,g +function v(e,t,n,l){n&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(l):void 0})}function O(e,t,n,l,r){var i={} +return Object.keys(l).forEach((function(e){i[e]=l[e]})),i.enumerable=!!i.enumerable,i.configurable=!!i.configurable,("value"in i||i.initializer)&&(i.writable=!0),i=n.slice().reverse().reduce((function(n,l){return l(e,t,n)||n}),i),r&&void 0!==i.initializer&&(i.value=i.initializer?i.initializer.call(r):void 0,i.initializer=void 0),void 0===i.initializer&&(Object.defineProperty(e,t,i),i=null),i}Object.defineProperty(e,"__esModule",{value:!0}),e.default=e.PRIMARY_KEY=void 0 +e.PRIMARY_KEY="uri" +let P=(n=(0,t.attr)("string"),l=(0,t.attr)("boolean"),r=(0,t.attr)("number"),i=(0,t.attr)(),o=(0,t.attr)("string"),a=(0,t.attr)("string"),u=(0,t.attr)("string"),s=(0,t.attr)(),c=class extends t.default{constructor(){super(...arguments),v(this,"uri",d,this),v(this,"Valid",p,this),v(this,"SyncTime",f,this),v(this,"meta",m,this),v(this,"Datacenter",h,this),v(this,"Namespace",b,this),v(this,"Partition",y,this),v(this,"License",g,this)}},d=O(c.prototype,"uri",[n],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),p=O(c.prototype,"Valid",[l],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),f=O(c.prototype,"SyncTime",[r],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),m=O(c.prototype,"meta",[i],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),h=O(c.prototype,"Datacenter",[o],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),b=O(c.prototype,"Namespace",[a],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),y=O(c.prototype,"Partition",[u],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),g=O(c.prototype,"License",[s],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),c) +e.default=P})),define("consul-ui/models/node",["exports","@ember-data/model","@ember/object","@ember/object/computed","ember-data-model-fragments/attributes"],(function(e,t,n,l,r){var i,o,a,u,s,c,d,p,f,m,h,b,y,g,v,O,P,x,w,j,_,k,S,N,C,z,M,D,T,E,L,A,R,I,$,F,U,B,q,K,H,Y,G +function V(e,t,n,l){n&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(l):void 0})}function W(e,t,n,l,r){var i={} +return Object.keys(l).forEach((function(e){i[e]=l[e]})),i.enumerable=!!i.enumerable,i.configurable=!!i.configurable,("value"in i||i.initializer)&&(i.writable=!0),i=n.slice().reverse().reduce((function(n,l){return l(e,t,n)||n}),i),r&&void 0!==i.initializer&&(i.value=i.initializer?i.initializer.call(r):void 0,i.initializer=void 0),void 0===i.initializer&&(Object.defineProperty(e,t,i),i=null),i}Object.defineProperty(e,"__esModule",{value:!0}),e.default=e.SLUG_KEY=e.PRIMARY_KEY=void 0 +e.PRIMARY_KEY="uid" +e.SLUG_KEY="ID" +let Z=(i=(0,t.attr)("string"),o=(0,t.attr)("string"),a=(0,t.attr)("string"),u=(0,t.attr)("string"),s=(0,t.attr)("string"),c=(0,t.attr)("string"),d=(0,t.attr)("string"),p=(0,t.attr)("number"),f=(0,t.attr)("number"),m=(0,t.attr)("number"),h=(0,t.attr)(),b=(0,t.attr)(),y=(0,t.attr)(),g=(0,t.attr)({defaultValue:()=>[]}),v=(0,t.hasMany)("service-instance"),O=(0,r.fragmentArray)("health-check"),P=(0,l.filter)("Services",(e=>"connect-proxy"!==e.Service.Kind)),x=(0,l.filter)("Services",(e=>"connect-proxy"===e.Service.Kind)),w=(0,l.filter)("Checks",(e=>""===e.ServiceID)),j=(0,n.computed)("ChecksCritical","ChecksPassing","ChecksWarning"),_=(0,n.computed)("NodeChecks.[]"),k=(0,n.computed)("NodeChecks.[]"),S=(0,n.computed)("NodeChecks.[]"),N=class extends t.default{constructor(){super(...arguments),V(this,"uid",C,this),V(this,"ID",z,this),V(this,"Datacenter",M,this),V(this,"PeerName",D,this),V(this,"Partition",T,this),V(this,"Address",E,this),V(this,"Node",L,this),V(this,"SyncTime",A,this),V(this,"CreateIndex",R,this),V(this,"ModifyIndex",I,this),V(this,"meta",$,this),V(this,"Meta",F,this),V(this,"TaggedAddresses",U,this),V(this,"Resources",B,this),V(this,"Services",q,this),V(this,"Checks",K,this),V(this,"MeshServiceInstances",H,this),V(this,"ProxyServiceInstances",Y,this),V(this,"NodeChecks",G,this)}get Status(){switch(!0){case 0!==this.ChecksCritical:return"critical" +case 0!==this.ChecksWarning:return"warning" +case 0!==this.ChecksPassing:return"passing" +default:return"empty"}}get ChecksCritical(){return this.NodeChecks.filter((e=>"critical"===e.Status)).length}get ChecksPassing(){return this.NodeChecks.filter((e=>"passing"===e.Status)).length}get ChecksWarning(){return this.NodeChecks.filter((e=>"warning"===e.Status)).length}},C=W(N.prototype,"uid",[i],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),z=W(N.prototype,"ID",[o],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),M=W(N.prototype,"Datacenter",[a],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),D=W(N.prototype,"PeerName",[u],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),T=W(N.prototype,"Partition",[s],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),E=W(N.prototype,"Address",[c],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),L=W(N.prototype,"Node",[d],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),A=W(N.prototype,"SyncTime",[p],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),R=W(N.prototype,"CreateIndex",[f],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),I=W(N.prototype,"ModifyIndex",[m],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),$=W(N.prototype,"meta",[h],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),F=W(N.prototype,"Meta",[b],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),U=W(N.prototype,"TaggedAddresses",[y],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),B=W(N.prototype,"Resources",[g],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),q=W(N.prototype,"Services",[v],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),K=W(N.prototype,"Checks",[O],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),H=W(N.prototype,"MeshServiceInstances",[P],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),Y=W(N.prototype,"ProxyServiceInstances",[x],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),G=W(N.prototype,"NodeChecks",[w],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),W(N.prototype,"Status",[j],Object.getOwnPropertyDescriptor(N.prototype,"Status"),N.prototype),W(N.prototype,"ChecksCritical",[_],Object.getOwnPropertyDescriptor(N.prototype,"ChecksCritical"),N.prototype),W(N.prototype,"ChecksPassing",[k],Object.getOwnPropertyDescriptor(N.prototype,"ChecksPassing"),N.prototype),W(N.prototype,"ChecksWarning",[S],Object.getOwnPropertyDescriptor(N.prototype,"ChecksWarning"),N.prototype),N) +e.default=Z})),define("consul-ui/models/nspace",["exports","@ember-data/model"],(function(e,t){var n,l,r,i,o,a,u,s,c,d,p,f,m,h,b,y,g,v,O,P,x +function w(e,t,n,l){n&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(l):void 0})}function j(e,t,n,l,r){var i={} +return Object.keys(l).forEach((function(e){i[e]=l[e]})),i.enumerable=!!i.enumerable,i.configurable=!!i.configurable,("value"in i||i.initializer)&&(i.writable=!0),i=n.slice().reverse().reduce((function(n,l){return l(e,t,n)||n}),i),r&&void 0!==i.initializer&&(i.value=i.initializer?i.initializer.call(r):void 0,i.initializer=void 0),void 0===i.initializer&&(Object.defineProperty(e,t,i),i=null),i}Object.defineProperty(e,"__esModule",{value:!0}),e.default=e.NSPACE_KEY=e.SLUG_KEY=e.PRIMARY_KEY=void 0 +e.PRIMARY_KEY="uid" +e.SLUG_KEY="Name" +e.NSPACE_KEY="Namespace" +let _=(n=(0,t.attr)("string"),l=(0,t.attr)("string"),r=(0,t.attr)("string"),i=(0,t.attr)("string"),o=(0,t.attr)("string"),a=(0,t.attr)("number"),u=(0,t.attr)("string",{defaultValue:()=>""}),s=(0,t.attr)({defaultValue:()=>[]}),c=(0,t.attr)("string"),d=(0,t.attr)({defaultValue:()=>({PolicyDefaults:[],RoleDefaults:[]})}),p=class extends t.default{constructor(){super(...arguments),w(this,"uid",f,this),w(this,"Name",m,this),w(this,"Datacenter",h,this),w(this,"Partition",b,this),w(this,"Namespace",y,this),w(this,"SyncTime",g,this),w(this,"Description",v,this),w(this,"Resources",O,this),w(this,"DeletedAt",P,this),w(this,"ACLs",x,this)}},f=j(p.prototype,"uid",[n],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),m=j(p.prototype,"Name",[l],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),h=j(p.prototype,"Datacenter",[r],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),b=j(p.prototype,"Partition",[i],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),y=j(p.prototype,"Namespace",[o],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),g=j(p.prototype,"SyncTime",[a],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),v=j(p.prototype,"Description",[u],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),O=j(p.prototype,"Resources",[s],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),P=j(p.prototype,"DeletedAt",[c],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),x=j(p.prototype,"ACLs",[d],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),p) +e.default=_})),define("consul-ui/models/oidc-provider",["exports","@ember-data/model"],(function(e,t){var n,l,r,i,o,a,u,s,c,d,p,f,m,h,b,y,g,v,O +function P(e,t,n,l){n&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(l):void 0})}function x(e,t,n,l,r){var i={} +return Object.keys(l).forEach((function(e){i[e]=l[e]})),i.enumerable=!!i.enumerable,i.configurable=!!i.configurable,("value"in i||i.initializer)&&(i.writable=!0),i=n.slice().reverse().reduce((function(n,l){return l(e,t,n)||n}),i),r&&void 0!==i.initializer&&(i.value=i.initializer?i.initializer.call(r):void 0,i.initializer=void 0),void 0===i.initializer&&(Object.defineProperty(e,t,i),i=null),i}Object.defineProperty(e,"__esModule",{value:!0}),e.default=e.SLUG_KEY=e.PRIMARY_KEY=void 0 +e.PRIMARY_KEY="uid" +e.SLUG_KEY="Name" +let w=(n=(0,t.attr)("string"),l=(0,t.attr)("string"),r=(0,t.attr)("string"),i=(0,t.attr)("string"),o=(0,t.attr)("string"),a=(0,t.attr)("string"),u=(0,t.attr)("string"),s=(0,t.attr)("string"),c=(0,t.attr)(),d=class extends t.default{constructor(){super(...arguments),P(this,"uid",p,this),P(this,"Name",f,this),P(this,"Datacenter",m,this),P(this,"Namespace",h,this),P(this,"Partition",b,this),P(this,"Kind",y,this),P(this,"AuthURL",g,this),P(this,"DisplayName",v,this),P(this,"meta",O,this)}},p=x(d.prototype,"uid",[n],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),f=x(d.prototype,"Name",[l],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),m=x(d.prototype,"Datacenter",[r],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),h=x(d.prototype,"Namespace",[i],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),b=x(d.prototype,"Partition",[o],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),y=x(d.prototype,"Kind",[a],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),g=x(d.prototype,"AuthURL",[u],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),v=x(d.prototype,"DisplayName",[s],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),O=x(d.prototype,"meta",[c],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),d) +e.default=w})),define("consul-ui/models/partition",["exports","ember-data/model","ember-data/attr"],(function(e,t,n){var l,r,i,o,a,u,s,c,d,p,f,m,h,b,y,g,v,O,P +function x(e,t,n,l){n&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(l):void 0})}function w(e,t,n,l,r){var i={} +return Object.keys(l).forEach((function(e){i[e]=l[e]})),i.enumerable=!!i.enumerable,i.configurable=!!i.configurable,("value"in i||i.initializer)&&(i.writable=!0),i=n.slice().reverse().reduce((function(n,l){return l(e,t,n)||n}),i),r&&void 0!==i.initializer&&(i.value=i.initializer?i.initializer.call(r):void 0,i.initializer=void 0),void 0===i.initializer&&(Object.defineProperty(e,t,i),i=null),i}Object.defineProperty(e,"__esModule",{value:!0}),e.default=e.PARTITION_KEY=e.SLUG_KEY=e.PRIMARY_KEY=void 0 +e.PRIMARY_KEY="uid" +e.SLUG_KEY="Name" +e.PARTITION_KEY="Partition" +let j=(l=(0,n.default)("string"),r=(0,n.default)("string"),i=(0,n.default)("string"),o=(0,n.default)("string"),a=(0,n.default)("string"),u=(0,n.default)("string"),s=(0,n.default)("string"),c=(0,n.default)("number"),d=(0,n.default)(),p=class extends t.default{constructor(){super(...arguments),x(this,"uid",f,this),x(this,"Name",m,this),x(this,"Description",h,this),x(this,"DeletedAt",b,this),x(this,"Datacenter",y,this),x(this,"Namespace",g,this),x(this,"Partition",v,this),x(this,"SyncTime",O,this),x(this,"meta",P,this)}},f=w(p.prototype,"uid",[l],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),m=w(p.prototype,"Name",[r],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),h=w(p.prototype,"Description",[i],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),b=w(p.prototype,"DeletedAt",[o],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),y=w(p.prototype,"Datacenter",[a],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),g=w(p.prototype,"Namespace",[u],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),v=w(p.prototype,"Partition",[s],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),O=w(p.prototype,"SyncTime",[c],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),P=w(p.prototype,"meta",[d],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),p) +e.default=j})),define("consul-ui/models/peer",["exports","@ember-data/model","consul-ui/decorators/replace"],(function(e,t,n){var l,r,i,o,a,u,s,c,d,p,f,m,h,b,y,g,v,O,P,x,w,j,_,k,S,N,C,z,M,D,T,E,L,A,R,I +function $(e,t,n,l){n&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(l):void 0})}function F(e,t,n,l,r){var i={} +return Object.keys(l).forEach((function(e){i[e]=l[e]})),i.enumerable=!!i.enumerable,i.configurable=!!i.configurable,("value"in i||i.initializer)&&(i.writable=!0),i=n.slice().reverse().reduce((function(n,l){return l(e,t,n)||n}),i),r&&void 0!==i.initializer&&(i.value=i.initializer?i.initializer.call(r):void 0,i.initializer=void 0),void 0===i.initializer&&(Object.defineProperty(e,t,i),i=null),i}Object.defineProperty(e,"__esModule",{value:!0}),e.default=e.schema=void 0 +e.schema={State:{defaultValue:"PENDING",allowedValues:["PENDING","ESTABLISHING","ACTIVE","FAILING","TERMINATED","DELETING"]}} +let U=(l=(0,t.attr)("string"),r=(0,t.attr)(),i=(0,t.attr)("string"),o=(0,t.attr)("string"),a=(0,t.attr)("string"),u=(0,t.attr)("string"),s=(0,t.attr)("string"),c=(0,t.attr)("string"),d=(0,n.nullValue)([]),p=(0,t.attr)(),f=(0,t.attr)("string"),m=(0,t.attr)(),h=(0,n.nullValue)([]),b=(0,t.attr)(),y=(0,n.nullValue)([]),g=(0,t.attr)(),v=(0,t.attr)("date"),O=(0,t.attr)("date"),P=(0,t.attr)("date"),x=class extends t.default{constructor(){super(...arguments),$(this,"uri",w,this),$(this,"meta",j,this),$(this,"Datacenter",_,this),$(this,"Partition",k,this),$(this,"Name",S,this),$(this,"State",N,this),$(this,"ID",C,this),$(this,"ServerExternalAddresses",z,this),$(this,"ServerExternalAddresses",M,this),$(this,"PeerID",D,this),$(this,"PeerServerAddresses",T,this),$(this,"ImportedServices",E,this),$(this,"ExportedServices",L,this),$(this,"LastHeartbeat",A,this),$(this,"LastReceive",R,this),$(this,"LastSend",I,this)}get ImportedServiceCount(){return this.ImportedServices.length}get ExportedServiceCount(){return this.ExportedServices.length}get isReceiver(){return this.PeerID}get isDialer(){return!this.isReceiver}},w=F(x.prototype,"uri",[l],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),j=F(x.prototype,"meta",[r],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),_=F(x.prototype,"Datacenter",[i],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),k=F(x.prototype,"Partition",[o],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),S=F(x.prototype,"Name",[a],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),N=F(x.prototype,"State",[u],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),C=F(x.prototype,"ID",[s],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),z=F(x.prototype,"ServerExternalAddresses",[c],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),M=F(x.prototype,"ServerExternalAddresses",[d,p],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),D=F(x.prototype,"PeerID",[f],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),T=F(x.prototype,"PeerServerAddresses",[m],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),E=F(x.prototype,"ImportedServices",[h,b],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),L=F(x.prototype,"ExportedServices",[y,g],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),A=F(x.prototype,"LastHeartbeat",[v],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),R=F(x.prototype,"LastReceive",[O],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),I=F(x.prototype,"LastSend",[P],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),x) +e.default=U})),define("consul-ui/models/permission",["exports","@ember-data/model"],(function(e,t){var n,l,r,i,o,a,u,s,c +function d(e,t,n,l){n&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(l):void 0})}function p(e,t,n,l,r){var i={} +return Object.keys(l).forEach((function(e){i[e]=l[e]})),i.enumerable=!!i.enumerable,i.configurable=!!i.configurable,("value"in i||i.initializer)&&(i.writable=!0),i=n.slice().reverse().reduce((function(n,l){return l(e,t,n)||n}),i),r&&void 0!==i.initializer&&(i.value=i.initializer?i.initializer.call(r):void 0,i.initializer=void 0),void 0===i.initializer&&(Object.defineProperty(e,t,i),i=null),i}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +let f=(n=(0,t.attr)("string"),l=(0,t.attr)("string"),r=(0,t.attr)("string"),i=(0,t.attr)("boolean"),o=class extends t.default{constructor(){super(...arguments),d(this,"Resource",a,this),d(this,"Segment",u,this),d(this,"Access",s,this),d(this,"Allow",c,this)}},a=p(o.prototype,"Resource",[n],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),u=p(o.prototype,"Segment",[l],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),s=p(o.prototype,"Access",[r],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),c=p(o.prototype,"Allow",[i],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),o) +e.default=f})),define("consul-ui/models/policy",["exports","@ember-data/model","@ember/object"],(function(e,t,n){var l,r,i,o,a,u,s,c,d,p,f,m,h,b,y,g,v,O,P,x,w,j,_,k,S,N,C,z,M,D,T,E +function L(e,t,n,l){n&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(l):void 0})}function A(e,t,n,l,r){var i={} +return Object.keys(l).forEach((function(e){i[e]=l[e]})),i.enumerable=!!i.enumerable,i.configurable=!!i.configurable,("value"in i||i.initializer)&&(i.writable=!0),i=n.slice().reverse().reduce((function(n,l){return l(e,t,n)||n}),i),r&&void 0!==i.initializer&&(i.value=i.initializer?i.initializer.call(r):void 0,i.initializer=void 0),void 0===i.initializer&&(Object.defineProperty(e,t,i),i=null),i}Object.defineProperty(e,"__esModule",{value:!0}),e.default=e.SLUG_KEY=e.PRIMARY_KEY=e.MANAGEMENT_ID=void 0 +const R="00000000-0000-0000-0000-000000000001" +e.MANAGEMENT_ID=R +e.PRIMARY_KEY="uid" +e.SLUG_KEY="ID" +let I=(l=(0,t.attr)("string"),r=(0,t.attr)("string"),i=(0,t.attr)("string"),o=(0,t.attr)("string"),a=(0,t.attr)("string"),u=(0,t.attr)("string",{defaultValue:()=>""}),s=(0,t.attr)("string",{defaultValue:()=>""}),c=(0,t.attr)("string",{defaultValue:()=>""}),d=(0,t.attr)("number"),p=(0,t.attr)("number"),f=(0,t.attr)("number"),m=(0,t.attr)(),h=(0,t.attr)(),b=(0,t.attr)("string",{defaultValue:()=>""}),y=(0,t.attr)("number",{defaultValue:()=>(new Date).getTime()}),g=(0,n.computed)("ID"),v=class extends t.default{constructor(){super(...arguments),L(this,"uid",O,this),L(this,"ID",P,this),L(this,"Datacenter",x,this),L(this,"Namespace",w,this),L(this,"Partition",j,this),L(this,"Name",_,this),L(this,"Description",k,this),L(this,"Rules",S,this),L(this,"SyncTime",N,this),L(this,"CreateIndex",C,this),L(this,"ModifyIndex",z,this),L(this,"Datacenters",M,this),L(this,"meta",D,this),L(this,"template",T,this),L(this,"CreateTime",E,this)}get isGlobalManagement(){return this.ID===R}},O=A(v.prototype,"uid",[l],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),P=A(v.prototype,"ID",[r],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),x=A(v.prototype,"Datacenter",[i],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),w=A(v.prototype,"Namespace",[o],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),j=A(v.prototype,"Partition",[a],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),_=A(v.prototype,"Name",[u],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),k=A(v.prototype,"Description",[s],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),S=A(v.prototype,"Rules",[c],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),N=A(v.prototype,"SyncTime",[d],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),C=A(v.prototype,"CreateIndex",[p],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),z=A(v.prototype,"ModifyIndex",[f],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),M=A(v.prototype,"Datacenters",[m],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),D=A(v.prototype,"meta",[h],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),T=A(v.prototype,"template",[b],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),E=A(v.prototype,"CreateTime",[y],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),A(v.prototype,"isGlobalManagement",[g],Object.getOwnPropertyDescriptor(v.prototype,"isGlobalManagement"),v.prototype),v) +e.default=I})),define("consul-ui/models/proxy",["exports","@ember-data/model","consul-ui/models/service-instance"],(function(e,t,n){var l,r,i,o,a,u,s,c,d,p,f,m,h,b,y,g,v,O,P,x,w +function j(e,t,n,l){n&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(l):void 0})}function _(e,t,n,l,r){var i={} +return Object.keys(l).forEach((function(e){i[e]=l[e]})),i.enumerable=!!i.enumerable,i.configurable=!!i.configurable,("value"in i||i.initializer)&&(i.writable=!0),i=n.slice().reverse().reduce((function(n,l){return l(e,t,n)||n}),i),r&&void 0!==i.initializer&&(i.value=i.initializer?i.initializer.call(r):void 0,i.initializer=void 0),void 0===i.initializer&&(Object.defineProperty(e,t,i),i=null),i}Object.defineProperty(e,"__esModule",{value:!0}),e.default=e.SLUG_KEY=e.PRIMARY_KEY=void 0 +e.PRIMARY_KEY="uid" +e.SLUG_KEY="Node,ServiceID" +let k=(l=(0,t.attr)("string"),r=(0,t.attr)("string"),i=(0,t.attr)("string"),o=(0,t.attr)("string"),a=(0,t.attr)("string"),u=(0,t.attr)("string"),s=(0,t.attr)("string"),c=(0,t.attr)("string"),d=(0,t.attr)("number"),p=(0,t.attr)(),f=class extends n.default{constructor(){super(...arguments),j(this,"uid",m,this),j(this,"ID",h,this),j(this,"Datacenter",b,this),j(this,"Namespace",y,this),j(this,"Partition",g,this),j(this,"ServiceName",v,this),j(this,"ServiceID",O,this),j(this,"NodeName",P,this),j(this,"SyncTime",x,this),j(this,"ServiceProxy",w,this)}},m=_(f.prototype,"uid",[l],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),h=_(f.prototype,"ID",[r],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),b=_(f.prototype,"Datacenter",[i],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),y=_(f.prototype,"Namespace",[o],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),g=_(f.prototype,"Partition",[a],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),v=_(f.prototype,"ServiceName",[u],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),O=_(f.prototype,"ServiceID",[s],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),P=_(f.prototype,"NodeName",[c],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),x=_(f.prototype,"SyncTime",[d],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),w=_(f.prototype,"ServiceProxy",[p],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),f) +e.default=k})),define("consul-ui/models/role",["exports","@ember-data/model"],(function(e,t){var n,l,r,i,o,a,u,s,c,d,p,f,m,h,b,y,g,v,O,P,x,w,j,_,k,S,N,C,z,M,D,T,E +function L(e,t,n,l){n&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(l):void 0})}function A(e,t,n,l,r){var i={} +return Object.keys(l).forEach((function(e){i[e]=l[e]})),i.enumerable=!!i.enumerable,i.configurable=!!i.configurable,("value"in i||i.initializer)&&(i.writable=!0),i=n.slice().reverse().reduce((function(n,l){return l(e,t,n)||n}),i),r&&void 0!==i.initializer&&(i.value=i.initializer?i.initializer.call(r):void 0,i.initializer=void 0),void 0===i.initializer&&(Object.defineProperty(e,t,i),i=null),i}Object.defineProperty(e,"__esModule",{value:!0}),e.default=e.SLUG_KEY=e.PRIMARY_KEY=void 0 +e.PRIMARY_KEY="uid" +e.SLUG_KEY="ID" +let R=(n=(0,t.attr)("string"),l=(0,t.attr)("string"),r=(0,t.attr)("string"),i=(0,t.attr)("string"),o=(0,t.attr)("string"),a=(0,t.attr)("string",{defaultValue:()=>""}),u=(0,t.attr)("string",{defaultValue:()=>""}),s=(0,t.attr)({defaultValue:()=>[]}),c=(0,t.attr)({defaultValue:()=>[]}),d=(0,t.attr)({defaultValue:()=>[]}),p=(0,t.attr)("number"),f=(0,t.attr)("number"),m=(0,t.attr)("number"),h=(0,t.attr)("number"),b=(0,t.attr)(),y=(0,t.attr)("string"),g=class extends t.default{constructor(){super(...arguments),L(this,"uid",v,this),L(this,"ID",O,this),L(this,"Datacenter",P,this),L(this,"Namespace",x,this),L(this,"Partition",w,this),L(this,"Name",j,this),L(this,"Description",_,this),L(this,"Policies",k,this),L(this,"ServiceIdentities",S,this),L(this,"NodeIdentities",N,this),L(this,"SyncTime",C,this),L(this,"CreateIndex",z,this),L(this,"ModifyIndex",M,this),L(this,"CreateTime",D,this),L(this,"Datacenters",T,this),L(this,"Hash",E,this)}},v=A(g.prototype,"uid",[n],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),O=A(g.prototype,"ID",[l],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),P=A(g.prototype,"Datacenter",[r],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),x=A(g.prototype,"Namespace",[i],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),w=A(g.prototype,"Partition",[o],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),j=A(g.prototype,"Name",[a],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),_=A(g.prototype,"Description",[u],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),k=A(g.prototype,"Policies",[s],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),S=A(g.prototype,"ServiceIdentities",[c],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),N=A(g.prototype,"NodeIdentities",[d],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),C=A(g.prototype,"SyncTime",[p],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),z=A(g.prototype,"CreateIndex",[f],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),M=A(g.prototype,"ModifyIndex",[m],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),D=A(g.prototype,"CreateTime",[h],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),T=A(g.prototype,"Datacenters",[b],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),E=A(g.prototype,"Hash",[y],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),g) +e.default=R})),define("consul-ui/models/service-instance",["exports","@ember-data/model","ember-data-model-fragments/attributes","@ember/object","@ember/object/computed","@glimmer/tracking"],(function(e,t,n,l,r,i){var o,a,u,s,c,d,p,f,m,h,b,y,g,v,O,P,x,w,j,_,k,S,N,C,z,M,D,T,E,L,A,R,I,$,F,U,B,q,K,H,Y,G,V,W,Z,Q,J,X,ee,te,ne,le +function re(e,t,n,l){n&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(l):void 0})}function ie(e,t,n,l,r){var i={} +return Object.keys(l).forEach((function(e){i[e]=l[e]})),i.enumerable=!!i.enumerable,i.configurable=!!i.configurable,("value"in i||i.initializer)&&(i.writable=!0),i=n.slice().reverse().reduce((function(n,l){return l(e,t,n)||n}),i),r&&void 0!==i.initializer&&(i.value=i.initializer?i.initializer.call(r):void 0,i.initializer=void 0),void 0===i.initializer&&(Object.defineProperty(e,t,i),i=null),i}Object.defineProperty(e,"__esModule",{value:!0}),e.default=e.Collection=e.SLUG_KEY=e.PRIMARY_KEY=void 0 +e.PRIMARY_KEY="uid" +e.SLUG_KEY="Node.Node,Service.ID" +const oe=(a=ie((o=class{constructor(e){re(this,"items",a,this),this.items=e}get ExternalSources(){const e=this.items.reduce((function(e,t){return e.concat(t.ExternalSources||[])}),[]) +return[...new Set(e)].filter(Boolean).sort()}}).prototype,"items",[i.tracked],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),o) +e.Collection=oe +let ae=(u=(0,t.attr)("string"),s=(0,t.attr)("string"),c=(0,t.attr)(),d=(0,t.attr)(),p=(0,t.attr)(),f=(0,n.fragmentArray)("health-check"),m=(0,t.attr)("number"),h=(0,t.attr)(),b=(0,t.attr)({defaultValue:()=>[]}),y=(0,r.alias)("Service.Service"),g=(0,r.or)("Service.{ID,Service}"),v=(0,r.or)("Service.Address","Node.Service"),O=(0,t.attr)("string"),P=(0,r.alias)("Service.Tags"),x=(0,r.alias)("Service.Meta"),w=(0,r.alias)("Service.Namespace"),j=(0,r.alias)("Service.Partition"),_=(0,r.filter)("Checks.@each.Kind",((e,t,n)=>"service"===e.Kind)),k=(0,r.filter)("Checks.@each.Kind",((e,t,n)=>"node"===e.Kind)),S=(0,l.computed)("Service.Meta"),N=(0,l.computed)("Service.Kind"),C=(0,l.computed)("Service.Kind"),z=(0,l.computed)("IsOrigin"),M=(0,l.computed)("ChecksPassing","ChecksWarning","ChecksCritical"),D=(0,l.computed)("Checks.[]"),T=(0,l.computed)("Checks.[]"),E=(0,l.computed)("Checks.[]"),L=(0,l.computed)("Checks.[]","ChecksPassing"),A=(0,l.computed)("Checks.[]","ChecksWarning"),R=(0,l.computed)("Checks.[]","ChecksCritical"),I=class extends t.default{constructor(){super(...arguments),re(this,"uid",$,this),re(this,"Datacenter",F,this),re(this,"Proxy",U,this),re(this,"Node",B,this),re(this,"Service",q,this),re(this,"Checks",K,this),re(this,"SyncTime",H,this),re(this,"meta",Y,this),re(this,"Resources",G,this),re(this,"Name",V,this),re(this,"ID",W,this),re(this,"Address",Z,this),re(this,"SocketPath",Q,this),re(this,"Tags",J,this),re(this,"Meta",X,this),re(this,"Namespace",ee,this),re(this,"Partition",te,this),re(this,"ServiceChecks",ne,this),re(this,"NodeChecks",le,this)}get ExternalSources(){const e=Object.entries(this.Service.Meta||{}).filter((e=>{let[t,n]=e +return"external-source"===t})).map((e=>{let[t,n]=e +return n})) +return[...new Set(e)]}get IsProxy(){return["connect-proxy","mesh-gateway","ingress-gateway","terminating-gateway","api-gateway"].includes(this.Service.Kind)}get IsOrigin(){return!["connect-proxy","mesh-gateway"].includes(this.Service.Kind)}get IsMeshOrigin(){return this.IsOrigin&&!["terminating-gateway"].includes(this.Service.Kind)}get Status(){switch(!0){case 0!==this.ChecksCritical.length:return"critical" +case 0!==this.ChecksWarning.length:return"warning" +case 0!==this.ChecksPassing.length:return"passing" +default:return"empty"}}get ChecksPassing(){return this.Checks.filter((e=>"passing"===e.Status))}get ChecksWarning(){return this.Checks.filter((e=>"warning"===e.Status))}get ChecksCritical(){return this.Checks.filter((e=>"critical"===e.Status))}get PercentageChecksPassing(){return this.ChecksPassing.length/this.Checks.length*100}get PercentageChecksWarning(){return this.ChecksWarning.length/this.Checks.length*100}get PercentageChecksCritical(){return this.ChecksCritical.length/this.Checks.length*100}},$=ie(I.prototype,"uid",[u],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),F=ie(I.prototype,"Datacenter",[s],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),U=ie(I.prototype,"Proxy",[c],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),B=ie(I.prototype,"Node",[d],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),q=ie(I.prototype,"Service",[p],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),K=ie(I.prototype,"Checks",[f],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),H=ie(I.prototype,"SyncTime",[m],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),Y=ie(I.prototype,"meta",[h],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),G=ie(I.prototype,"Resources",[b],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),V=ie(I.prototype,"Name",[y],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),W=ie(I.prototype,"ID",[g],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),Z=ie(I.prototype,"Address",[v],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),Q=ie(I.prototype,"SocketPath",[O],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),J=ie(I.prototype,"Tags",[P],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),X=ie(I.prototype,"Meta",[x],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),ee=ie(I.prototype,"Namespace",[w],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),te=ie(I.prototype,"Partition",[j],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),ne=ie(I.prototype,"ServiceChecks",[_],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),le=ie(I.prototype,"NodeChecks",[k],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),ie(I.prototype,"ExternalSources",[S],Object.getOwnPropertyDescriptor(I.prototype,"ExternalSources"),I.prototype),ie(I.prototype,"IsProxy",[N],Object.getOwnPropertyDescriptor(I.prototype,"IsProxy"),I.prototype),ie(I.prototype,"IsOrigin",[C],Object.getOwnPropertyDescriptor(I.prototype,"IsOrigin"),I.prototype),ie(I.prototype,"IsMeshOrigin",[z],Object.getOwnPropertyDescriptor(I.prototype,"IsMeshOrigin"),I.prototype),ie(I.prototype,"Status",[M],Object.getOwnPropertyDescriptor(I.prototype,"Status"),I.prototype),ie(I.prototype,"ChecksPassing",[D],Object.getOwnPropertyDescriptor(I.prototype,"ChecksPassing"),I.prototype),ie(I.prototype,"ChecksWarning",[T],Object.getOwnPropertyDescriptor(I.prototype,"ChecksWarning"),I.prototype),ie(I.prototype,"ChecksCritical",[E],Object.getOwnPropertyDescriptor(I.prototype,"ChecksCritical"),I.prototype),ie(I.prototype,"PercentageChecksPassing",[L],Object.getOwnPropertyDescriptor(I.prototype,"PercentageChecksPassing"),I.prototype),ie(I.prototype,"PercentageChecksWarning",[A],Object.getOwnPropertyDescriptor(I.prototype,"PercentageChecksWarning"),I.prototype),ie(I.prototype,"PercentageChecksCritical",[R],Object.getOwnPropertyDescriptor(I.prototype,"PercentageChecksCritical"),I.prototype),I) +e.default=ae})),define("consul-ui/models/service",["exports","@ember-data/model","@ember/object","@glimmer/tracking","ember-data-model-fragments/attributes","consul-ui/decorators/replace"],(function(e,t,n,l,r,i){var o,a,u,s,c,d,p,f,m,h,b,y,g,v,O,P,x,w,j,_,k,S,N,C,z,M,D,T,E,L,A,R,I,$,F,U,B,q,K,H,Y,G,V,W,Z,Q,J,X,ee,te,ne,le,re,ie,oe,ae,ue,se,ce,de,pe,fe,me,he,be,ye,ge +function ve(e,t,n,l){n&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(l):void 0})}function Oe(e,t,n,l,r){var i={} +return Object.keys(l).forEach((function(e){i[e]=l[e]})),i.enumerable=!!i.enumerable,i.configurable=!!i.configurable,("value"in i||i.initializer)&&(i.writable=!0),i=n.slice().reverse().reduce((function(n,l){return l(e,t,n)||n}),i),r&&void 0!==i.initializer&&(i.value=i.initializer?i.initializer.call(r):void 0,i.initializer=void 0),void 0===i.initializer&&(Object.defineProperty(e,t,i),i=null),i}Object.defineProperty(e,"__esModule",{value:!0}),e.default=e.Collection=e.SLUG_KEY=e.PRIMARY_KEY=void 0 +e.PRIMARY_KEY="uid" +e.SLUG_KEY="Name,PeerName" +const Pe=(a=Oe((o=class{constructor(e){ve(this,"items",a,this),this.items=e}get ExternalSources(){const e=this.items.reduce((function(e,t){return e.concat(t.ExternalSources||[])}),[]) +return[...new Set(e)].filter(Boolean).sort()}get Partitions(){return[...new Set(this.items.map((e=>e.Partition)))].sort()}}).prototype,"items",[l.tracked],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),o) +e.Collection=Pe +let xe=(u=(0,t.attr)("string"),s=(0,t.attr)("string"),c=(0,t.attr)("string"),d=(0,t.attr)("string"),p=(0,t.attr)("string"),f=(0,t.attr)("string"),m=(0,i.default)("",void 0),h=(0,t.attr)("string"),b=(0,t.attr)("number"),y=(0,t.attr)("number"),g=(0,t.attr)("number"),v=(0,t.attr)("number"),O=(0,t.attr)("boolean"),P=(0,t.attr)("boolean"),x=(0,t.attr)({defaultValue:()=>[]}),w=(0,t.attr)("number"),j=(0,t.attr)("number"),_=(0,t.attr)("number"),k=(0,i.nullValue)([]),S=(0,t.attr)({defaultValue:()=>[]}),N=(0,t.attr)(),C=(0,t.attr)(),z=(0,r.fragment)("gateway-config"),M=(0,i.nullValue)([]),D=(0,t.attr)(),T=(0,t.attr)(),E=(0,t.attr)(),L=(0,t.belongsTo)({async:!1}),A=(0,n.computed)("peer","InstanceCount"),R=(0,n.computed)("peer.State"),I=(0,n.computed)("ChecksPassing","ChecksWarning","ChecksCritical"),$=(0,n.computed)("MeshChecksPassing","MeshChecksWarning","MeshChecksCritical"),F=(0,n.computed)("ConnectedWithProxy","ConnectedWithGateway"),U=(0,n.computed)("MeshEnabled","Kind"),B=(0,n.computed)("MeshChecksPassing","MeshChecksWarning","MeshChecksCritical","isZeroCountButPeered","peerIsFailing"),q=(0,n.computed)("isZeroCountButPeered","peerIsFailing","MeshStatus"),K=(0,n.computed)("ChecksPassing","Proxy.ChecksPassing"),H=(0,n.computed)("ChecksWarning","Proxy.ChecksWarning"),Y=(0,n.computed)("ChecksCritical","Proxy.ChecksCritical"),G=class extends t.default{constructor(){super(...arguments),ve(this,"uid",V,this),ve(this,"Name",W,this),ve(this,"Datacenter",Z,this),ve(this,"Namespace",Q,this),ve(this,"Partition",J,this),ve(this,"Kind",X,this),ve(this,"PeerName",ee,this),ve(this,"ChecksPassing",te,this),ve(this,"ChecksCritical",ne,this),ve(this,"ChecksWarning",le,this),ve(this,"InstanceCount",re,this),ve(this,"ConnectedWithGateway",ie,this),ve(this,"ConnectedWithProxy",oe,this),ve(this,"Resources",ae,this),ve(this,"SyncTime",ue,this),ve(this,"CreateIndex",se,this),ve(this,"ModifyIndex",ce,this),ve(this,"Tags",de,this),ve(this,"Nodes",pe,this),ve(this,"Proxy",fe,this),ve(this,"GatewayConfig",me,this),ve(this,"ExternalSources",he,this),ve(this,"Meta",be,this),ve(this,"meta",ye,this),ve(this,"peer",ge,this)}get isZeroCountButPeered(){return this.peer&&0===this.InstanceCount}get peerIsFailing(){return this.peer&&"FAILING"===this.peer.State}get ChecksTotal(){return this.ChecksPassing+this.ChecksWarning+this.ChecksCritical}get MeshChecksTotal(){return this.MeshChecksPassing+this.MeshChecksWarning+this.MeshChecksCritical}get MeshEnabled(){return this.ConnectedWithProxy||this.ConnectedWithGateway}get InMesh(){return this.MeshEnabled||(this.Kind||"").length>0}get MeshStatus(){switch(!0){case this.isZeroCountButPeered:case this.peerIsFailing:return"unknown" +case 0!==this.MeshChecksCritical:return"critical" +case 0!==this.MeshChecksWarning:return"warning" +case 0!==this.MeshChecksPassing:return"passing" +default:return"empty"}}get healthTooltipText(){const{MeshStatus:e,isZeroCountButPeered:t,peerIsFailing:n}=this +return t?"This service currently has 0 instances. Check with the operator of its peer to make sure this is expected behavior.":n?"This peer is out of sync, so the current health statuses of its services are unknown.":"critical"===e?"At least one health check on one instance is failing.":"warning"===e?"At least one health check on one instance has a warning.":"passing"==e?"All health checks are passing.":"There are no health checks"}get MeshChecksPassing(){let e=0 +return void 0!==this.Proxy&&(e=this.Proxy.ChecksPassing),this.ChecksPassing+e}get MeshChecksWarning(){let e=0 +return void 0!==this.Proxy&&(e=this.Proxy.ChecksWarning),this.ChecksWarning+e}get MeshChecksCritical(){let e=0 +return void 0!==this.Proxy&&(e=this.Proxy.ChecksCritical),this.ChecksCritical+e}},V=Oe(G.prototype,"uid",[u],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),W=Oe(G.prototype,"Name",[s],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),Z=Oe(G.prototype,"Datacenter",[c],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),Q=Oe(G.prototype,"Namespace",[d],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),J=Oe(G.prototype,"Partition",[p],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),X=Oe(G.prototype,"Kind",[f],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),ee=Oe(G.prototype,"PeerName",[m,h],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),te=Oe(G.prototype,"ChecksPassing",[b],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),ne=Oe(G.prototype,"ChecksCritical",[y],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),le=Oe(G.prototype,"ChecksWarning",[g],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),re=Oe(G.prototype,"InstanceCount",[v],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),ie=Oe(G.prototype,"ConnectedWithGateway",[O],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),oe=Oe(G.prototype,"ConnectedWithProxy",[P],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),ae=Oe(G.prototype,"Resources",[x],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),ue=Oe(G.prototype,"SyncTime",[w],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),se=Oe(G.prototype,"CreateIndex",[j],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),ce=Oe(G.prototype,"ModifyIndex",[_],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),de=Oe(G.prototype,"Tags",[k,S],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),pe=Oe(G.prototype,"Nodes",[N],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),fe=Oe(G.prototype,"Proxy",[C],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),me=Oe(G.prototype,"GatewayConfig",[z],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),he=Oe(G.prototype,"ExternalSources",[M,D],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),be=Oe(G.prototype,"Meta",[T],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),ye=Oe(G.prototype,"meta",[E],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),ge=Oe(G.prototype,"peer",[L],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),Oe(G.prototype,"isZeroCountButPeered",[A],Object.getOwnPropertyDescriptor(G.prototype,"isZeroCountButPeered"),G.prototype),Oe(G.prototype,"peerIsFailing",[R],Object.getOwnPropertyDescriptor(G.prototype,"peerIsFailing"),G.prototype),Oe(G.prototype,"ChecksTotal",[I],Object.getOwnPropertyDescriptor(G.prototype,"ChecksTotal"),G.prototype),Oe(G.prototype,"MeshChecksTotal",[$],Object.getOwnPropertyDescriptor(G.prototype,"MeshChecksTotal"),G.prototype),Oe(G.prototype,"MeshEnabled",[F],Object.getOwnPropertyDescriptor(G.prototype,"MeshEnabled"),G.prototype),Oe(G.prototype,"InMesh",[U],Object.getOwnPropertyDescriptor(G.prototype,"InMesh"),G.prototype),Oe(G.prototype,"MeshStatus",[B],Object.getOwnPropertyDescriptor(G.prototype,"MeshStatus"),G.prototype),Oe(G.prototype,"healthTooltipText",[q],Object.getOwnPropertyDescriptor(G.prototype,"healthTooltipText"),G.prototype),Oe(G.prototype,"MeshChecksPassing",[K],Object.getOwnPropertyDescriptor(G.prototype,"MeshChecksPassing"),G.prototype),Oe(G.prototype,"MeshChecksWarning",[H],Object.getOwnPropertyDescriptor(G.prototype,"MeshChecksWarning"),G.prototype),Oe(G.prototype,"MeshChecksCritical",[Y],Object.getOwnPropertyDescriptor(G.prototype,"MeshChecksCritical"),G.prototype),G) +e.default=xe})),define("consul-ui/models/session",["exports","@ember-data/model","@ember/object","consul-ui/decorators/replace"],(function(e,t,n,l){var r,i,o,a,u,s,c,d,p,f,m,h,b,y,g,v,O,P,x,w,j,_,k,S,N,C,z,M,D,T,E,L,A,R,I,$ +function F(e,t,n,l){n&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(l):void 0})}function U(e,t,n,l,r){var i={} +return Object.keys(l).forEach((function(e){i[e]=l[e]})),i.enumerable=!!i.enumerable,i.configurable=!!i.configurable,("value"in i||i.initializer)&&(i.writable=!0),i=n.slice().reverse().reduce((function(n,l){return l(e,t,n)||n}),i),r&&void 0!==i.initializer&&(i.value=i.initializer?i.initializer.call(r):void 0,i.initializer=void 0),void 0===i.initializer&&(Object.defineProperty(e,t,i),i=null),i}Object.defineProperty(e,"__esModule",{value:!0}),e.default=e.SLUG_KEY=e.PRIMARY_KEY=void 0 +e.PRIMARY_KEY="uid" +e.SLUG_KEY="ID" +let B=(r=(0,t.attr)("string"),i=(0,t.attr)("string"),o=(0,t.attr)("string"),a=(0,t.attr)("string"),u=(0,t.attr)("string"),s=(0,t.attr)("string"),c=(0,t.attr)("string"),d=(0,t.attr)("string"),p=(0,t.attr)("string"),f=(0,t.attr)("number"),m=(0,t.attr)("number"),h=(0,t.attr)("number"),b=(0,t.attr)("number"),y=(0,l.nullValue)([]),g=(0,t.attr)({defaultValue:()=>[]}),v=(0,l.nullValue)([]),O=(0,t.attr)({defaultValue:()=>[]}),P=(0,t.attr)({defaultValue:()=>[]}),x=(0,n.computed)("NodeChecks","ServiceChecks"),w=class extends t.default{constructor(){super(...arguments),F(this,"uid",j,this),F(this,"ID",_,this),F(this,"Name",k,this),F(this,"Datacenter",S,this),F(this,"Namespace",N,this),F(this,"Partition",C,this),F(this,"Node",z,this),F(this,"Behavior",M,this),F(this,"TTL",D,this),F(this,"LockDelay",T,this),F(this,"SyncTime",E,this),F(this,"CreateIndex",L,this),F(this,"ModifyIndex",A,this),F(this,"NodeChecks",R,this),F(this,"ServiceChecks",I,this),F(this,"Resources",$,this)}get checks(){return[...this.NodeChecks,...this.ServiceChecks.map((e=>{let{ID:t}=e +return t}))]}},j=U(w.prototype,"uid",[r],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),_=U(w.prototype,"ID",[i],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),k=U(w.prototype,"Name",[o],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),S=U(w.prototype,"Datacenter",[a],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),N=U(w.prototype,"Namespace",[u],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),C=U(w.prototype,"Partition",[s],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),z=U(w.prototype,"Node",[c],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),M=U(w.prototype,"Behavior",[d],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),D=U(w.prototype,"TTL",[p],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),T=U(w.prototype,"LockDelay",[f],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),E=U(w.prototype,"SyncTime",[m],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),L=U(w.prototype,"CreateIndex",[h],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),A=U(w.prototype,"ModifyIndex",[b],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),R=U(w.prototype,"NodeChecks",[y,g],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),I=U(w.prototype,"ServiceChecks",[v,O],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),$=U(w.prototype,"Resources",[P],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),U(w.prototype,"checks",[x],Object.getOwnPropertyDescriptor(w.prototype,"checks"),w.prototype),w) +e.default=B})),define("consul-ui/models/token",["exports","@ember-data/model","@ember/object","consul-ui/models/policy"],(function(e,t,n,l){var r,i,o,a,u,s,c,d,p,f,m,h,b,y,g,v,O,P,x,w,j,_,k,S,N,C,z,M,D,T,E,L,A,R,I,$,F,U,B,q,K,H,Y,G,V,W,Z +function Q(e,t,n,l){n&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(l):void 0})}function J(e,t,n,l,r){var i={} +return Object.keys(l).forEach((function(e){i[e]=l[e]})),i.enumerable=!!i.enumerable,i.configurable=!!i.configurable,("value"in i||i.initializer)&&(i.writable=!0),i=n.slice().reverse().reduce((function(n,l){return l(e,t,n)||n}),i),r&&void 0!==i.initializer&&(i.value=i.initializer?i.initializer.call(r):void 0,i.initializer=void 0),void 0===i.initializer&&(Object.defineProperty(e,t,i),i=null),i}Object.defineProperty(e,"__esModule",{value:!0}),e.default=e.SLUG_KEY=e.PRIMARY_KEY=void 0 +e.PRIMARY_KEY="uid" +e.SLUG_KEY="AccessorID" +let X=(r=(0,t.attr)("string"),i=(0,t.attr)("string"),o=(0,t.attr)("string"),a=(0,t.attr)("string"),u=(0,t.attr)("string"),s=(0,t.attr)("string"),c=(0,t.attr)("string"),d=(0,t.attr)("boolean"),p=(0,t.attr)("boolean"),f=(0,t.attr)("string",{defaultValue:()=>""}),m=(0,t.attr)(),h=(0,t.attr)({defaultValue:()=>[]}),b=(0,t.attr)({defaultValue:()=>[]}),y=(0,t.attr)({defaultValue:()=>[]}),g=(0,t.attr)({defaultValue:()=>[]}),v=(0,t.attr)("date"),O=(0,t.attr)("string"),P=(0,t.attr)("number"),x=(0,t.attr)("number"),w=(0,t.attr)("string"),j=(0,t.attr)("string",{defaultValue:()=>""}),_=(0,t.attr)("string"),k=(0,n.computed)("Policies.[]"),S=(0,n.computed)("SecretID"),N=class extends t.default{constructor(){super(...arguments),Q(this,"uid",C,this),Q(this,"AccessorID",z,this),Q(this,"Datacenter",M,this),Q(this,"Namespace",D,this),Q(this,"Partition",T,this),Q(this,"IDPName",E,this),Q(this,"SecretID",L,this),Q(this,"Legacy",A,this),Q(this,"Local",R,this),Q(this,"Description",I,this),Q(this,"meta",$,this),Q(this,"Policies",F,this),Q(this,"Roles",U,this),Q(this,"ServiceIdentities",B,this),Q(this,"NodeIdentities",q,this),Q(this,"CreateTime",K,this),Q(this,"Hash",H,this),Q(this,"CreateIndex",Y,this),Q(this,"ModifyIndex",G,this),Q(this,"Type",V,this),Q(this,"Name",W,this),Q(this,"Rules",Z,this)}get isGlobalManagement(){return(this.Policies||[]).find((e=>e.ID===l.MANAGEMENT_ID))}get hasSecretID(){return""!==this.SecretID&&""!==this.SecretID}},C=J(N.prototype,"uid",[r],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),z=J(N.prototype,"AccessorID",[i],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),M=J(N.prototype,"Datacenter",[o],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),D=J(N.prototype,"Namespace",[a],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),T=J(N.prototype,"Partition",[u],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),E=J(N.prototype,"IDPName",[s],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),L=J(N.prototype,"SecretID",[c],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),A=J(N.prototype,"Legacy",[d],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),R=J(N.prototype,"Local",[p],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),I=J(N.prototype,"Description",[f],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),$=J(N.prototype,"meta",[m],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),F=J(N.prototype,"Policies",[h],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),U=J(N.prototype,"Roles",[b],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),B=J(N.prototype,"ServiceIdentities",[y],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),q=J(N.prototype,"NodeIdentities",[g],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),K=J(N.prototype,"CreateTime",[v],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),H=J(N.prototype,"Hash",[O],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),Y=J(N.prototype,"CreateIndex",[P],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),G=J(N.prototype,"ModifyIndex",[x],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),V=J(N.prototype,"Type",[w],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),W=J(N.prototype,"Name",[j],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),Z=J(N.prototype,"Rules",[_],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),J(N.prototype,"isGlobalManagement",[k],Object.getOwnPropertyDescriptor(N.prototype,"isGlobalManagement"),N.prototype),J(N.prototype,"hasSecretID",[S],Object.getOwnPropertyDescriptor(N.prototype,"hasSecretID"),N.prototype),N) +e.default=X})),define("consul-ui/models/topology",["exports","@ember-data/model","@ember/object"],(function(e,t,n){var l,r,i,o,a,u,s,c,d,p,f,m,h,b,y,g,v,O,P,x,w,j,_,k,S,N,C,z +function M(e,t,n,l){n&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(l):void 0})}function D(e,t,n,l,r){var i={} +return Object.keys(l).forEach((function(e){i[e]=l[e]})),i.enumerable=!!i.enumerable,i.configurable=!!i.configurable,("value"in i||i.initializer)&&(i.writable=!0),i=n.slice().reverse().reduce((function(n,l){return l(e,t,n)||n}),i),r&&void 0!==i.initializer&&(i.value=i.initializer?i.initializer.call(r):void 0,i.initializer=void 0),void 0===i.initializer&&(Object.defineProperty(e,t,i),i=null),i}Object.defineProperty(e,"__esModule",{value:!0}),e.default=e.SLUG_KEY=e.PRIMARY_KEY=void 0 +e.PRIMARY_KEY="uid" +e.SLUG_KEY="ServiceName" +let T=(l=(0,t.attr)("string"),r=(0,t.attr)("string"),i=(0,t.attr)("string"),o=(0,t.attr)("string"),a=(0,t.attr)("string"),u=(0,t.attr)("string"),s=(0,t.attr)("boolean"),c=(0,t.attr)("boolean"),d=(0,t.attr)("boolean"),p=(0,t.attr)(),f=(0,t.attr)(),m=(0,t.attr)(),h=(0,n.computed)("Downstreams"),b=(0,n.computed)("Downstreams","Upstreams"),y=(0,n.computed)("Downstreams","Upstreams"),g=class extends t.default{constructor(){super(...arguments),M(this,"uid",v,this),M(this,"ServiceName",O,this),M(this,"Datacenter",P,this),M(this,"Namespace",x,this),M(this,"Partition",w,this),M(this,"Protocol",j,this),M(this,"FilteredByACLs",_,this),M(this,"TransparentProxy",k,this),M(this,"ConnectNative",S,this),M(this,"Upstreams",N,this),M(this,"Downstreams",C,this),M(this,"meta",z,this)}get notDefinedIntention(){let e=!1 +return e=0!==this.Downstreams.filter((e=>"specific-intention"===e.Source&&!e.TransparentProxy&&!e.ConnectNative&&e.Intention.Allowed)).length,e}get wildcardIntention(){const e=0!==this.Downstreams.filter((e=>!e.Intention.HasExact&&e.Intention.Allowed)).length,t=0!==this.Upstreams.filter((e=>!e.Intention.HasExact&&e.Intention.Allowed)).length +return e||t}get noDependencies(){return 0===this.Upstreams.length&&0===this.Downstreams.length}},v=D(g.prototype,"uid",[l],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),O=D(g.prototype,"ServiceName",[r],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),P=D(g.prototype,"Datacenter",[i],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),x=D(g.prototype,"Namespace",[o],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),w=D(g.prototype,"Partition",[a],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),j=D(g.prototype,"Protocol",[u],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),_=D(g.prototype,"FilteredByACLs",[s],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),k=D(g.prototype,"TransparentProxy",[c],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),S=D(g.prototype,"ConnectNative",[d],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),N=D(g.prototype,"Upstreams",[p],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),C=D(g.prototype,"Downstreams",[f],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),z=D(g.prototype,"meta",[m],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),D(g.prototype,"notDefinedIntention",[h],Object.getOwnPropertyDescriptor(g.prototype,"notDefinedIntention"),g.prototype),D(g.prototype,"wildcardIntention",[b],Object.getOwnPropertyDescriptor(g.prototype,"wildcardIntention"),g.prototype),D(g.prototype,"noDependencies",[y],Object.getOwnPropertyDescriptor(g.prototype,"noDependencies"),g.prototype),g) +e.default=T})),define("consul-ui/modifiers/aria-menu",["exports","ember-modifier","@ember/service","@ember/object"],(function(e,t,n,l){var r,i,o +function a(e,t,n,l,r){var i={} +return Object.keys(l).forEach((function(e){i[e]=l[e]})),i.enumerable=!!i.enumerable,i.configurable=!!i.configurable,("value"in i||i.initializer)&&(i.writable=!0),i=n.slice().reverse().reduce((function(n,l){return l(e,t,n)||n}),i),r&&void 0!==i.initializer&&(i.value=i.initializer?i.initializer.call(r):void 0,i.initializer=void 0),void 0===i.initializer&&(Object.defineProperty(e,t,i),i=null),i}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const u={vertical:{40:function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:-1 +return(t+1)%e.length},38:function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0 +return 0===t?e.length-1:t-1},36:(e,t)=>0,35:(e,t)=>e.length-1},horizontal:{}} +let s=(r=(0,n.inject)("-document"),i=class extends t.default{constructor(){var e,t,n,l,r,i,a +super(...arguments),e=this,t="doc",l=this,(n=o)&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(l):void 0}),a="vertical",(i="orientation")in(r=this)?Object.defineProperty(r,i,{value:a,enumerable:!0,configurable:!0,writable:!0}):r[i]=a}async keydown(e){if(27===e.keyCode)return this.options.onclose(e),void this.$trigger.focus() +const t=[...this.element.querySelectorAll('[role^="menuitem"]')],n=t.findIndex((e=>e===this.doc.activeElement)) +9!==e.keyCode?void 0!==u[this.orientation][e.keyCode]&&(t[u[this.orientation][e.keyCode](t,n)].focus(),e.stopPropagation(),e.preventDefault()):e.shiftKey?0===n&&(this.options.onclose(e),this.$trigger.focus()):n===t.length-1&&(await new Promise((e=>setTimeout(e,0))),this.options.onclose(e))}async focus(e){""===e.pointerType&&(await Promise.resolve(),this.keydown({keyCode:36,stopPropagation:()=>{},preventDefault:()=>{}}))}connect(e,t){this.$trigger=this.doc.getElementById(this.element.getAttribute("aria-labelledby")),void 0!==t.openEvent&&this.focus(t.openEvent),this.doc.addEventListener("keydown",this.keydown)}disconnect(){this.doc.removeEventListener("keydown",this.keydown)}didReceiveArguments(){this.params=this.args.positional,this.options=this.args.named}didInstall(){this.connect(this.args.positional,this.args.named)}willRemove(){this.disconnect()}},o=a(i.prototype,"doc",[r],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),a(i.prototype,"keydown",[l.action],Object.getOwnPropertyDescriptor(i.prototype,"keydown"),i.prototype),a(i.prototype,"focus",[l.action],Object.getOwnPropertyDescriptor(i.prototype,"focus"),i.prototype),i) +e.default=s})),define("consul-ui/modifiers/create-ref",["exports","ember-ref-bucket/modifiers/create-ref"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/modifiers/css-prop",["exports","ember-modifier","@ember/service"],(function(e,t,n){var l,r,i +Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +let o=(l=(0,n.inject)("-document"),r=class extends t.default{constructor(){var e,t,n,l +super(...arguments),e=this,t="doc",l=this,(n=i)&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(l):void 0})}didReceiveArguments(){const e=this.args.positional,t=this.args.named;(e[1]||t.returns)(this.doc.defaultView.getComputedStyle(this.element).getPropertyValue(e[0]))}},a=r.prototype,u="doc",s=[l],c={configurable:!0,enumerable:!0,writable:!0,initializer:null},p={},Object.keys(c).forEach((function(e){p[e]=c[e]})),p.enumerable=!!p.enumerable,p.configurable=!!p.configurable,("value"in p||p.initializer)&&(p.writable=!0),p=s.slice().reverse().reduce((function(e,t){return t(a,u,e)||e}),p),d&&void 0!==p.initializer&&(p.value=p.initializer?p.initializer.call(d):void 0,p.initializer=void 0),void 0===p.initializer&&(Object.defineProperty(a,u,p),p=null),i=p,r) +var a,u,s,c,d,p +e.default=o})),define("consul-ui/modifiers/css-props",["exports","ember-modifier"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const n=Object.fromEntries([...document.styleSheets].reduce(((e,t)=>e.concat([...t.cssRules].filter((e=>1===e.type)).reduce(((e,t)=>[...e,...[...t.style].filter((e=>e.startsWith("--"))).map((e=>[e.trim(),t.style.getPropertyValue(e).trim()]))]),[]))),[])) +var l=(0,t.modifier)((function(e,t,l){let[r]=t +const i=new RegExp(`^--${l.prefix||"."}${l.group||""}+`),o={} +Object.entries(n).forEach((e=>{let[t,n]=e +const r=t.match(i) +if(r){let e=r[0] +"-"===e.charAt(e.length-1)&&(e=e.substr(0,e.length-1)),l.group?(void 0===o[e]&&(o[e]={}),o[e][t]=n):o[t]=n}})),r(o)})) +e.default=l})),define("consul-ui/modifiers/did-insert",["exports","@ember/render-modifiers/modifiers/did-insert"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/modifiers/did-update",["exports","@ember/render-modifiers/modifiers/did-update"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/modifiers/did-upsert",["exports","@ember/modifier"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const n=e=>({target:e.element,currentTarget:e.element}) +var l=(0,t.setModifierManager)((()=>({capabilities:(0,t.capabilities)("3.22",{disableAutoTracking:!0}),createModifier:()=>({element:null}),installModifier(e,t,l){e.element=t,l.positional.forEach((()=>{})),l.named&&Object.values(l.named) +const[r,...i]=l.positional +r(n(e),i,l.named)},updateModifier(e,t){t.positional.forEach((()=>{})),t.named&&Object.values(t.named) +const[l,...r]=t.positional +l(n(e),r,t.named)},destroyModifier(){}})),class{}) +e.default=l})),define("consul-ui/modifiers/disabled",["exports","ember-modifier"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +var n=(0,t.modifier)((function(e,t,n){let[l=!0]=t +if(["input","textarea","select","button"].includes(e.nodeName.toLowerCase()))l?(e.setAttribute("disabled",l),e.setAttribute("aria-disabled",l)):(e.dataset.disabled=!1,e.removeAttribute("disabled"),e.removeAttribute("aria-disabled")) +else for(const r of e.querySelectorAll("input,textarea,button"))l&&"false"!==r.dataset.disabled?(e.setAttribute("disabled",l),e.setAttribute("aria-disabled",l)):(e.removeAttribute("disabled"),e.removeAttribute("aria-disabled"))})) +e.default=n})),define("consul-ui/modifiers/focus-trap",["exports","ember-focus-trap/modifiers/focus-trap.js"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/modifiers/in-viewport",["exports","ember-in-viewport/modifiers/in-viewport"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/modifiers/notification",["exports","ember-modifier","@ember/service"],(function(e,t,n){var l,r,i +function o(e,t){var n=Object.keys(e) +if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e) +t&&(l=l.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,l)}return n}function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +let u=(l=(0,n.inject)("flashMessages"),r=class extends t.default{constructor(){var e,t,n,l +super(...arguments),e=this,t="notify",l=this,(n=i)&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(l):void 0})}didInstall(){this.element.setAttribute("role","alert"),this.element.dataset.notification=null +const e=function(e){for(var t=1;te.after())).catch((e=>{if("TransitionAborted"!==e.name)throw e})).then((t=>{this.notify.add(e)})):this.notify.add(e)}willDestroy(){this.args.named.sticky&&this.notify.clearMessages()}},s=r.prototype,c="notify",d=[l],p={configurable:!0,enumerable:!0,writable:!0,initializer:null},m={},Object.keys(p).forEach((function(e){m[e]=p[e]})),m.enumerable=!!m.enumerable,m.configurable=!!m.configurable,("value"in m||m.initializer)&&(m.writable=!0),m=d.slice().reverse().reduce((function(e,t){return t(s,c,e)||e}),m),f&&void 0!==m.initializer&&(m.value=m.initializer?m.initializer.call(f):void 0,m.initializer=void 0),void 0===m.initializer&&(Object.defineProperty(s,c,m),m=null),i=m,r) +var s,c,d,p,f,m +e.default=u})),define("consul-ui/modifiers/on-key",["exports","ember-keyboard/modifiers/on-key.js"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/modifiers/on-outside",["exports","ember-modifier","@ember/object","@ember/service"],(function(e,t,n,l){var r,i,o +function a(e,t,n,l,r){var i={} +return Object.keys(l).forEach((function(e){i[e]=l[e]})),i.enumerable=!!i.enumerable,i.configurable=!!i.configurable,("value"in i||i.initializer)&&(i.writable=!0),i=n.slice().reverse().reduce((function(n,l){return l(e,t,n)||n}),i),r&&void 0!==i.initializer&&(i.value=i.initializer?i.initializer.call(r):void 0,i.initializer=void 0),void 0===i.initializer&&(Object.defineProperty(e,t,i),i=null),i}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +let u=(r=(0,l.inject)("dom"),i=class extends t.default{constructor(){var e,t,n,l +super(...arguments),e=this,t="dom",l=this,(n=o)&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(l):void 0}),this.doc=this.dom.document()}async connect(e,t){await new Promise((e=>setTimeout(e,0))) +try{this.doc.addEventListener(e[0],this.listen)}catch(n){}}listen(e){if(this.dom.isOutside(this.element,e.target)){("function"==typeof this.params[1]?this.params[1]:e=>{}).apply(this.element,[e])}}disconnect(){this.doc.removeEventListener("click",this.listen)}didReceiveArguments(){this.params=this.args.positional,this.options=this.args.named}didInstall(){this.connect(this.args.positional,this.args.named)}willRemove(){this.disconnect()}},o=a(i.prototype,"dom",[r],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),a(i.prototype,"listen",[n.action],Object.getOwnPropertyDescriptor(i.prototype,"listen"),i.prototype),i) +e.default=u})),define("consul-ui/modifiers/on-resize",["exports","ember-on-resize-modifier/modifiers/on-resize"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})) +define("consul-ui/modifiers/style",["exports","ember-modifier","@ember/debug"],(function(e,t,n){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +class l extends t.default{setStyles(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[] +const t=this._oldStyles||new Set +Array.isArray(e)||(e=Object.entries(e)),e.forEach((e=>{let[n,l]=e,r="" +l.length>0&&l.includes("!important")&&(r="important",l=l.replace("!important","")),this.element.style.setProperty(n,l,r),t.delete(n)})),t.forEach((e=>this.element.style.removeProperty(e))),this._oldStyles=new Set(e.map((e=>e[0])))}didReceiveArguments(){void 0!==this.args.named.delay?setTimeout((e=>{typeof this!==this.args.positional[0]&&this.setStyles(this.args.positional[0])}),this.args.named.delay):this.setStyles(this.args.positional[0])}}e.default=l})),define("consul-ui/modifiers/tooltip",["exports","ember-modifier","tippy.js"],(function(e,t,n){function l(e,t){var n=Object.keys(e) +if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e) +t&&(l=l.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,l)}return n}function r(e){for(var t=1;t2&&void 0!==arguments[2]?arguments[2]:{} +if("string"==typeof l&&""===l.trim())return +const o=i.options||{} +let a,u=e +if("string"==typeof o.triggerTarget){const e=u +if("parentNode"===o.triggerTarget)u=u.parentNode +else u=u.querySelectorAll(o.triggerTarget) +l=u.cloneNode(!0),e.remove(),i.options.triggerTarget=void 0}if(void 0===l&&(l=u.innerHTML,u.innerHTML=""),"manual"===o.trigger){const e=o.delay||[] +void 0!==e[1]&&(i.options.onShown=t=>{clearInterval(a),a=setTimeout((()=>{t.hide()}),e[1])})}let s=u,c=!1 +s.hasAttribute("tabindex")||(c=!0,s.setAttribute("tabindex","0")) +const d=(0,n.default)(u,r({theme:"tooltip",triggerTarget:s,content:e=>l,plugins:[void 0!==o.followCursor?n.followCursor:void 0].filter((e=>Boolean(e)))},i.options)) +return()=>{c&&s.removeAttribute("tabindex"),clearInterval(a),d.destroy()}})) +e.default=o})),define("consul-ui/modifiers/validate",["exports","ember-modifier","@ember/object"],(function(e,t,n){var l +function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(e,t,n,l,r){var i={} +return Object.keys(l).forEach((function(e){i[e]=l[e]})),i.enumerable=!!i.enumerable,i.configurable=!!i.configurable,("value"in i||i.initializer)&&(i.writable=!0),i=n.slice().reverse().reduce((function(n,l){return l(e,t,n)||n}),i),r&&void 0!==i.initializer&&(i.value=i.initializer?i.initializer.call(r):void 0,i.initializer=void 0),void 0===i.initializer&&(Object.defineProperty(e,t,i),i=null),i}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +class o extends Error{}let a=(l=class extends t.default{constructor(){super(...arguments),r(this,"item",null),r(this,"hash",null)}validate(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{} +if(0===Object.keys(t).length)return +const n={} +Object.entries(this.hash.validations).filter((e=>{let[t,n]=e +return"string"!=typeof n})).forEach((t=>{let[l,r]=t +this.item&&(this.item[l]=e),(r||[]).forEach((t=>{new RegExp(t.test).test(e)||(n[l]=new o(t.error))}))})) +const l=this.hash.chart.state||{} +null==l.context&&(l.context={}),Object.keys(n).length>0?(l.context.errors=n,this.hash.chart.dispatch("ERROR",l.context)):(l.context.errors=null,this.hash.chart.dispatch("RESET",l.context))}reset(e){if(0===e.target.value.length){const e=this.hash.chart.state +e.context||(e.context={}),e.context.errors||(e.context.errors={}),Object.entries(this.hash.validations).filter((e=>{let[t,n]=e +return"string"!=typeof n})).forEach((t=>{let[n,l]=t +void 0!==e.context.errors[n]&&delete e.context.errors[n]})),0===Object.keys(e.context.errors).length&&(e.context.errors=null,this.hash.chart.dispatch("RESET",e.context))}}async connect(e,t){let[n]=e +this.element.addEventListener("input",this.listen),this.element.addEventListener("blur",this.reset),this.element.value.length>0&&(await Promise.resolve(),this&&this.element&&this.validate(this.element.value,this.hash.validations))}listen(e){this.validate(e.target.value,this.hash.validations)}disconnect(){this.item=null,this.hash=null,this.element.removeEventListener("input",this.listen),this.element.removeEventListener("blur",this.reset)}didReceiveArguments(){const[e]=this.args.positional,t=this.args.named +this.item=e,this.hash=t,void 0===t.chart&&(this.hash.chart={state:{context:{}},dispatch:e=>{switch(e){case"ERROR":t.onchange(this.hash.chart.state.context.errors) +break +case"RESET":t.onchange()}}})}didInstall(){this.connect(this.args.positional,this.args.named)}willRemove(){this.disconnect()}},i(l.prototype,"reset",[n.action],Object.getOwnPropertyDescriptor(l.prototype,"reset"),l.prototype),i(l.prototype,"listen",[n.action],Object.getOwnPropertyDescriptor(l.prototype,"listen"),l.prototype),l) +e.default=a})),define("consul-ui/modifiers/will-destroy",["exports","@ember/render-modifiers/modifiers/will-destroy"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/modifiers/with-copyable",["exports","ember-modifier","@ember/service","@ember/debug"],(function(e,t,n,l){var r,i,o +function a(e,t){var n=Object.keys(e) +if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e) +t&&(l=l.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,l)}return n}function u(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const s=(e,t,n)=>typeof t===e?t:n +let c=(r=(0,n.inject)("clipboard/os"),i=class extends t.default{constructor(){var e,t,n,l +super(...arguments),e=this,t="clipboard",l=this,(n=o)&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(l):void 0}),u(this,"hash",null),u(this,"source",null)}connect(e,t){let[n]=e +n=s("string",n,this.element.innerText) +const r={success:e=>((0,l.runInDebug)((e=>console.info(`with-copyable: Copied \`${n}\``))),s("function",t.success,(()=>{}))(e)),error:e=>((0,l.runInDebug)((e=>console.info(`with-copyable: Error copying \`${n}\``))),s("function",t.error,(()=>{}))(e))} +this.source=this.clipboard.execute(this.element,function(e){for(var t=1;tn},r.options)).on("success",r.success).on("error",r.error),this.hash=r}disconnect(){this.source&&this.hash&&(this.source.off("success",this.hash.success).off("error",this.hash.error),this.source.destroy(),this.hash=null,this.source=null)}didReceiveArguments(){this.disconnect(),this.connect(this.args.positional,this.args.named)}willRemove(){this.disconnect()}},d=i.prototype,p="clipboard",f=[r],m={configurable:!0,enumerable:!0,writable:!0,initializer:null},b={},Object.keys(m).forEach((function(e){b[e]=m[e]})),b.enumerable=!!b.enumerable,b.configurable=!!b.configurable,("value"in b||b.initializer)&&(b.writable=!0),b=f.slice().reverse().reduce((function(e,t){return t(d,p,e)||e}),b),h&&void 0!==b.initializer&&(b.value=b.initializer?b.initializer.call(h):void 0,b.initializer=void 0),void 0===b.initializer&&(Object.defineProperty(d,p,b),b=null),o=b,i) +var d,p,f,m,h,b +e.default=c})),define("consul-ui/modifiers/with-overlay",["exports","ember-modifier","tippy.js"],(function(e,t,n){function l(e,t){var n=Object.keys(e) +if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e) +t&&(l=l.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,l)}return n}function r(e){for(var t=1;t2&&void 0!==arguments[2]?arguments[2]:{} +const o=i.options||{} +let a,u=e +if("string"==typeof o.triggerTarget){const e=u +if("parentNode"===o.triggerTarget)u=u.parentNode +else u=u.querySelectorAll(o.triggerTarget) +l=u.cloneNode(!0),e.remove(),i.options.triggerTarget=void 0}if(void 0===l&&(l=u.innerHTML,u.innerHTML=""),i.returns&&(o.trigger="manual"),"manual"===o.trigger){const e=o.delay||[] +void 0!==e[1]&&(o.onShown=t=>{clearInterval(a),a=setTimeout((()=>{t.hide()}),e[1])})}let s=u +const c=(0,n.default)(u,r({triggerTarget:s,content:e=>l,interactive:!0,plugins:[void 0!==o.followCursor?n.followCursor:void 0].filter((e=>Boolean(e)))},o)) +return i.returns&&i.returns(c),()=>{clearInterval(a),c.destroy()}})) +e.default=o})),define("consul-ui/router",["exports","@ember/routing/router","consul-ui/config/environment","@ember/debug","deepmerge","consul-ui/env","consul-ui/utils/routing/walk"],(function(e,t,n,l,r,i,o){function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}Object.defineProperty(e,"__esModule",{value:!0}),e.default=e.routes=void 0 +const u=document,s=n.default.modulePrefix,c=r.default.all([...u.querySelectorAll("script[data-routes]")].map((e=>JSON.parse(e.dataset.routes)))) +e.routes=c,(0,l.runInDebug)((()=>{const e=requirejs.entries[`${s}/docfy-output`] +if(void 0!==e){const t={} +e.callback(t),function e(t,n){"/"!==n.name&&(t=t[n.name]={_options:{path:n.name}}),n.pages.forEach((e=>{const n=e.relativeUrl +"string"==typeof n&&""!==n&&(t[n]={_options:{path:n}})})),n.children.forEach((n=>{e(t,n)}))}(c,t.default.nested)}})),(0,l.runInDebug)((()=>{window.Routes=function(){let e,t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:(0,i.env)("DEBUG_ROUTES_ENDPOINT") +t||(t="data:,%s") +const n=(0,o.dump)(c) +t.startsWith("data:,")?(e=window.open("","_blank"),e.document.write(`
      ${n}
      `)):e=window.open(t.replace("%s",encodeURIComponent(n)),"_blank"),e.focus()}})) +class d extends t.default{constructor(){super(...arguments),a(this,"location",(0,i.env)("locationType")),a(this,"rootURL",(0,i.env)("rootURL"))}}e.default=d,d.map((0,o.default)(c))})),define("consul-ui/routes/application",["exports","consul-ui/routing/route","@ember/object","@ember/service","consul-ui/mixins/with-blocking-actions"],(function(e,t,n,l,r){var i,o,a,u,s,c,d +function p(e,t,n,l){n&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(l):void 0})}function f(e,t,n,l,r){var i={} +return Object.keys(l).forEach((function(e){i[e]=l[e]})),i.enumerable=!!i.enumerable,i.configurable=!!i.configurable,("value"in i||i.initializer)&&(i.writable=!0),i=n.slice().reverse().reduce((function(n,l){return l(e,t,n)||n}),i),r&&void 0!==i.initializer&&(i.value=i.initializer?i.initializer.call(r):void 0,i.initializer=void 0),void 0===i.initializer&&(Object.defineProperty(e,t,i),i=null),i}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +let m=(i=(0,l.inject)("client/http"),o=(0,l.inject)("env"),a=(0,l.inject)(),u=class extends(t.default.extend(r.default)){constructor(){var e,t,n +super(...arguments),p(this,"client",s,this),p(this,"env",c,this),p(this,"hcp",d,this),n=void 0,(t="data")in(e=this)?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n}async model(){return this.env.var("CONSUL_ACLS_ENABLED")&&await this.hcp.updateTokenIfNecessary(this.env.var("CONSUL_HTTP_TOKEN")),{}}onClientChanged(e){let t=e.data +""===t&&(t={blocking:!0}),void 0!==this.data?(!0===this.data.blocking&&!1===t.blocking&&this.client.abort(),this.data=Object.assign({},t)):this.data=Object.assign({},t)}error(e,t){let n={status:e.code||e.statusCode||"",message:e.message||e.detail||"Error"} +return e.errors&&e.errors[0]&&(n=e.errors[0],n.message=n.message||n.title||n.detail||"Error"),""===n.status&&(n.message="Error"),this.controllerFor("application").setProperties({error:n}),!0}},s=f(u.prototype,"client",[i],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),c=f(u.prototype,"env",[o],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),d=f(u.prototype,"hcp",[a],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),f(u.prototype,"onClientChanged",[n.action],Object.getOwnPropertyDescriptor(u.prototype,"onClientChanged"),u.prototype),f(u.prototype,"error",[n.action],Object.getOwnPropertyDescriptor(u.prototype,"error"),u.prototype),u) +e.default=m})),define("consul-ui/routes/dc",["exports","@ember/service","consul-ui/routing/route"],(function(e,t,n){var l,r,i +Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +let o=(l=(0,t.inject)("repository/permission"),r=class extends n.default{constructor(){var e,t,n,l +super(...arguments),e=this,t="permissionsRepo",l=this,(n=i)&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(l):void 0})}async model(e){const t=await this.permissionsRepo.findAll({dc:e.dc,ns:this.optionalParams().nspace,partition:this.optionalParams().partition}) +return this.controllerFor("application").setProperties({permissions:t}),{permissions:t}}},a=r.prototype,u="permissionsRepo",s=[l],c={configurable:!0,enumerable:!0,writable:!0,initializer:null},p={},Object.keys(c).forEach((function(e){p[e]=c[e]})),p.enumerable=!!p.enumerable,p.configurable=!!p.configurable,("value"in p||p.initializer)&&(p.writable=!0),p=s.slice().reverse().reduce((function(e,t){return t(a,u,e)||e}),p),d&&void 0!==p.initializer&&(p.value=p.initializer?p.initializer.call(d):void 0,p.initializer=void 0),void 0===p.initializer&&(Object.defineProperty(a,u,p),p=null),i=p,r) +var a,u,s,c,d,p +e.default=o})),define("consul-ui/routes/dc/acls/auth-methods/index",["exports","consul-ui/routing/route"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +class n extends t.default{constructor(){var e,t,n +super(...arguments),n={sortBy:"sort",source:"source",kind:"kind",searchproperty:{as:"searchproperty",empty:[["Name","DisplayName"]]},search:{as:"filter",replace:!0}},(t="queryParams")in(e=this)?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n}}e.default=n})),define("consul-ui/routes/dc/acls/auth-methods/show/index",["exports","consul-ui/routing/route","consul-ui/utils/routing/redirect-to"],(function(e,t,n){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +class l extends t.default{constructor(){var e,t,l +super(...arguments),e=this,t="redirect",l=(0,n.default)("auth-method"),t in e?Object.defineProperty(e,t,{value:l,enumerable:!0,configurable:!0,writable:!0}):e[t]=l}}e.default=l})),define("consul-ui/routes/dc/acls/policies/create",["exports","consul-ui/routes/dc/acls/policies/edit"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +class n extends t.default{constructor(){var e,t,n +super(...arguments),n="dc/acls/policies/edit",(t="templateName")in(e=this)?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n}}e.default=n})),define("consul-ui/routes/dc/acls/policies/edit",["exports","@ember/service","consul-ui/routing/route","consul-ui/mixins/with-blocking-actions"],(function(e,t,n,l){var r,i,o +Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +let a=(r=(0,t.inject)("repository/policy"),i=class extends(n.default.extend(l.default)){constructor(){var e,t,n,l +super(...arguments),e=this,t="repo",l=this,(n=o)&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(l):void 0})}},u=i.prototype,s="repo",c=[r],d={configurable:!0,enumerable:!0,writable:!0,initializer:null},f={},Object.keys(d).forEach((function(e){f[e]=d[e]})),f.enumerable=!!f.enumerable,f.configurable=!!f.configurable,("value"in f||f.initializer)&&(f.writable=!0),f=c.slice().reverse().reduce((function(e,t){return t(u,s,e)||e}),f),p&&void 0!==f.initializer&&(f.value=f.initializer?f.initializer.call(p):void 0,f.initializer=void 0),void 0===f.initializer&&(Object.defineProperty(u,s,f),f=null),o=f,i) +var u,s,c,d,p,f +e.default=a})),define("consul-ui/routes/dc/acls/policies/index",["exports","consul-ui/routing/route","@ember/service","consul-ui/mixins/with-blocking-actions"],(function(e,t,n,l){var r,i,o +Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +let a=(r=(0,n.inject)("repository/policy"),i=class extends(t.default.extend(l.default)){constructor(){var e,t,n,l,r,i,a +super(...arguments),e=this,t="repo",l=this,(n=o)&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(l):void 0}),a={sortBy:"sort",datacenter:{as:"dc"},kind:"kind",searchproperty:{as:"searchproperty",empty:[["Name","Description"]]},search:{as:"filter",replace:!0}},(i="queryParams")in(r=this)?Object.defineProperty(r,i,{value:a,enumerable:!0,configurable:!0,writable:!0}):r[i]=a}},u=i.prototype,s="repo",c=[r],d={configurable:!0,enumerable:!0,writable:!0,initializer:null},f={},Object.keys(d).forEach((function(e){f[e]=d[e]})),f.enumerable=!!f.enumerable,f.configurable=!!f.configurable,("value"in f||f.initializer)&&(f.writable=!0),f=c.slice().reverse().reduce((function(e,t){return t(u,s,e)||e}),f),p&&void 0!==f.initializer&&(f.value=f.initializer?f.initializer.call(p):void 0,f.initializer=void 0),void 0===f.initializer&&(Object.defineProperty(u,s,f),f=null),o=f,i) +var u,s,c,d,p,f +e.default=a})),define("consul-ui/routes/dc/acls/roles/create",["exports","consul-ui/routes/dc/acls/roles/edit"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +class n extends t.default{constructor(){var e,t,n +super(...arguments),n="dc/acls/roles/edit",(t="templateName")in(e=this)?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n}}e.default=n})),define("consul-ui/routes/dc/acls/roles/edit",["exports","@ember/service","consul-ui/routing/route","consul-ui/mixins/with-blocking-actions"],(function(e,t,n,l){var r,i,o +Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +let a=(r=(0,t.inject)("repository/role"),i=class extends(n.default.extend(l.default)){constructor(){var e,t,n,l +super(...arguments),e=this,t="repo",l=this,(n=o)&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(l):void 0})}},u=i.prototype,s="repo",c=[r],d={configurable:!0,enumerable:!0,writable:!0,initializer:null},f={},Object.keys(d).forEach((function(e){f[e]=d[e]})),f.enumerable=!!f.enumerable,f.configurable=!!f.configurable,("value"in f||f.initializer)&&(f.writable=!0),f=c.slice().reverse().reduce((function(e,t){return t(u,s,e)||e}),f),p&&void 0!==f.initializer&&(f.value=f.initializer?f.initializer.call(p):void 0,f.initializer=void 0),void 0===f.initializer&&(Object.defineProperty(u,s,f),f=null),o=f,i) +var u,s,c,d,p,f +e.default=a})),define("consul-ui/routes/dc/acls/roles/index",["exports","consul-ui/routing/route","@ember/service","consul-ui/mixins/with-blocking-actions"],(function(e,t,n,l){var r,i,o +Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +let a=(r=(0,n.inject)("repository/role"),i=class extends(t.default.extend(l.default)){constructor(){var e,t,n,l,r,i,a +super(...arguments),e=this,t="repo",l=this,(n=o)&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(l):void 0}),a={sortBy:"sort",searchproperty:{as:"searchproperty",empty:[["Name","Description","Policy"]]},search:{as:"filter",replace:!0}},(i="queryParams")in(r=this)?Object.defineProperty(r,i,{value:a,enumerable:!0,configurable:!0,writable:!0}):r[i]=a}},u=i.prototype,s="repo",c=[r],d={configurable:!0,enumerable:!0,writable:!0,initializer:null},f={},Object.keys(d).forEach((function(e){f[e]=d[e]})),f.enumerable=!!f.enumerable,f.configurable=!!f.configurable,("value"in f||f.initializer)&&(f.writable=!0),f=c.slice().reverse().reduce((function(e,t){return t(u,s,e)||e}),f),p&&void 0!==f.initializer&&(f.value=f.initializer?f.initializer.call(p):void 0,f.initializer=void 0),void 0===f.initializer&&(Object.defineProperty(u,s,f),f=null),o=f,i) +var u,s,c,d,p,f +e.default=a})),define("consul-ui/routes/dc/acls/tokens/create",["exports","consul-ui/routes/dc/acls/tokens/edit"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +class n extends t.default{constructor(){var e,t,n +super(...arguments),n="dc/acls/tokens/edit",(t="templateName")in(e=this)?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n}}e.default=n})),define("consul-ui/routes/dc/acls/tokens/edit",["exports","@ember/service","consul-ui/routing/route","consul-ui/mixins/with-blocking-actions"],(function(e,t,n,l){var r,i,o,a,u +function s(e,t,n,l){n&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(l):void 0})}function c(e,t,n,l,r){var i={} +return Object.keys(l).forEach((function(e){i[e]=l[e]})),i.enumerable=!!i.enumerable,i.configurable=!!i.configurable,("value"in i||i.initializer)&&(i.writable=!0),i=n.slice().reverse().reduce((function(n,l){return l(e,t,n)||n}),i),r&&void 0!==i.initializer&&(i.value=i.initializer?i.initializer.call(r):void 0,i.initializer=void 0),void 0===i.initializer&&(Object.defineProperty(e,t,i),i=null),i}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +let d=(r=(0,t.inject)("repository/token"),i=(0,t.inject)("settings"),o=class extends(n.default.extend(l.default)){constructor(){super(...arguments),s(this,"repo",a,this),s(this,"settings",u,this)}async model(e,t){return{token:await this.settings.findBySlug("token")}}},a=c(o.prototype,"repo",[r],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),u=c(o.prototype,"settings",[i],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),o) +e.default=d})),define("consul-ui/routes/dc/acls/tokens/index",["exports","consul-ui/routing/route","@ember/service","consul-ui/mixins/with-blocking-actions"],(function(e,t,n,l){var r,i,o +Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +let a=(r=(0,n.inject)("repository/token"),i=class extends(t.default.extend(l.default)){constructor(){var e,t,n,l,r,i,a +super(...arguments),e=this,t="repo",l=this,(n=o)&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(l):void 0}),a={sortBy:"sort",kind:"kind",searchproperty:{as:"searchproperty",empty:[["AccessorID","Description","Role","Policy"]]},search:{as:"filter",replace:!0}},(i="queryParams")in(r=this)?Object.defineProperty(r,i,{value:a,enumerable:!0,configurable:!0,writable:!0}):r[i]=a}},u=i.prototype,s="repo",c=[r],d={configurable:!0,enumerable:!0,writable:!0,initializer:null},f={},Object.keys(d).forEach((function(e){f[e]=d[e]})),f.enumerable=!!f.enumerable,f.configurable=!!f.configurable,("value"in f||f.initializer)&&(f.writable=!0),f=c.slice().reverse().reduce((function(e,t){return t(u,s,e)||e}),f),p&&void 0!==f.initializer&&(f.value=f.initializer?f.initializer.call(p):void 0,f.initializer=void 0),void 0===f.initializer&&(Object.defineProperty(u,s,f),f=null),o=f,i) +var u,s,c,d,p,f +e.default=a})),define("consul-ui/routes/dc/kv/folder",["exports","consul-ui/routes/dc/kv/index"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +class n extends t.default{beforeModel(e){super.beforeModel(...arguments) +const t=this.paramsFor("dc.kv.folder") +if("/"===t.key||null==t.key)return this.transitionTo("dc.kv.index")}}e.default=n})),define("consul-ui/routes/dc/kv/index",["exports","consul-ui/routing/route","@ember/object","consul-ui/utils/isFolder"],(function(e,t,n,l){var r +Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +let i=(r=class extends t.default{beforeModel(){const e=this.paramsFor(this.routeName).key||"/" +if(!(0,l.default)(e))return this.replaceWith(this.routeName,e+"/")}error(e){return!e.errors||!e.errors[0]||"404"!=e.errors[0].status||this.transitionTo("dc.kv.index")}},o=r.prototype,a="error",u=[n.action],s=Object.getOwnPropertyDescriptor(r.prototype,"error"),c=r.prototype,d={},Object.keys(s).forEach((function(e){d[e]=s[e]})),d.enumerable=!!d.enumerable,d.configurable=!!d.configurable,("value"in d||d.initializer)&&(d.writable=!0),d=u.slice().reverse().reduce((function(e,t){return t(o,a,e)||e}),d),c&&void 0!==d.initializer&&(d.value=d.initializer?d.initializer.call(c):void 0,d.initializer=void 0),void 0===d.initializer&&(Object.defineProperty(o,a,d),d=null),r) +var o,a,u,s,c,d +e.default=i})),define("consul-ui/routes/dc/services/notfound",["exports","consul-ui/routing/route"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +class n extends t.default{redirect(e,t){this.replaceWith("dc.services.instance",e.name,e.node,e.id)}}e.default=n})),define("consul-ui/routes/dc/services/show/topology",["exports","consul-ui/routing/route","@ember/service","@ember/object"],(function(e,t,n,l){var r,i,o,a,u,s,c +function d(e,t){var n=Object.keys(e) +if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e) +t&&(l=l.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,l)}return n}function p(e){for(var t=1;tn.Datacenter===e.Datacenter&&n.SourceName===e.Name&&n.SourceNS===e.Namespace&&n.SourcePartition===e.Partition&&n.DestinationName===t.Name&&n.DestinationNS===t.Namespace&&n.DestinationPartition===t.Partition)) +void 0===r?r=this.repo.create({Datacenter:e.Datacenter,SourceName:e.Name,SourceNS:e.Namespace||"default",SourcePartition:e.Partition||"default",DestinationName:t.Name,DestinationNS:t.Namespace||"default",DestinationPartition:t.Partition||"default"}):n=this.feedback.notification("update","intention"),(0,l.set)(r,"Action","allow"),await this.repo.persist(r),n.success(r)}catch(r){n.error(r)}this.refresh()}afterModel(e,t){const n=p(p(p({},this.optionalParams()),this.paramsFor("dc")),this.paramsFor("dc.services.show")) +this.intentions=this.data.source((e=>e`/${n.partition}/${n.nspace}/${n.dc}/intentions/for-service/${n.name}`))}async deactivate(e){(await this.intentions).destroy()}},u=h(a.prototype,"data",[r],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),s=h(a.prototype,"repo",[i],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),c=h(a.prototype,"feedback",[o],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),h(a.prototype,"createIntention",[l.action],Object.getOwnPropertyDescriptor(a.prototype,"createIntention"),a.prototype),a) +e.default=b})),define("consul-ui/routing/route",["exports","@ember/routing/route","@ember/object","@ember/service","consul-ui/utils/path/resolve","consul-ui/router"],(function(e,t,n,l,r,i){var o,a,u,s,c,d,p,f,m,h,b +function y(e,t){var n=Object.keys(e) +if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e) +t&&(l=l.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,l)}return n}function g(e){for(var t=1;t!n.includes(e))).length&&(e=void 0)}}return e}model(){const e={} +return void 0!==this.queryParams&&void 0!==this.queryParams.searchproperty&&(e.searchProperties=this.queryParams.searchproperty.empty[0]),e}setupController(e,t){(0,n.setProperties)(e,g(g({},t),{},{routeName:this.routeName})),super.setupController(...arguments)}optionalParams(){return this.container.get(`location:${this.env.var("locationType")}`).optionalParams()}paramsFor(e){return this.routlet.normalizeParamsFor(this.routeName,super.paramsFor(...arguments))}async replaceWith(e,t){await Promise.resolve() +let n=[] +return"string"==typeof t&&(n=[t]),void 0===t||Array.isArray(t)||"string"==typeof t||(n=Object.values(t)),super.replaceWith(e,...n)}async transitionTo(e,t){await Promise.resolve() +let n=[] +return"string"==typeof t&&(n=[t]),void 0===t||Array.isArray(t)||"string"==typeof t||(n=Object.values(t)),super.transitionTo(e,...n)}},p=P(d.prototype,"container",[o],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),f=P(d.prototype,"env",[a],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),m=P(d.prototype,"permissions",[u],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),h=P(d.prototype,"router",[s],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),b=P(d.prototype,"routlet",[c],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),P(d.prototype,"replaceWith",[n.action],Object.getOwnPropertyDescriptor(d.prototype,"replaceWith"),d.prototype),P(d.prototype,"transitionTo",[n.action],Object.getOwnPropertyDescriptor(d.prototype,"transitionTo"),d.prototype),d) +e.default=x})),define("consul-ui/routing/single",["exports","consul-ui/routing/route","@ember/debug","rsvp"],(function(e,t,n,l){function r(e,t){var n=Object.keys(e) +if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e) +t&&(l=l.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,l)}return n}function i(e){for(var t=1;te.ID,Name:e=>e.Name}})),define("consul-ui/search/predicates/auth-method",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +e.default={Name:e=>e.Name,DisplayName:e=>e.DisplayName}})),define("consul-ui/search/predicates/health-check",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +var t={Name:e=>e.Name,Node:e=>e.Node,Service:e=>e.ServiceName,CheckID:e=>e.CheckID||"",ID:e=>e.Service.ID||"",Notes:e=>e.Notes,Output:e=>e.Output,ServiceTags:e=>{return t=e.ServiceTags,Array.isArray(t)?t:t.toArray() +var t}} +e.default=t})),define("consul-ui/search/predicates/intention",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const t="All Services (*)" +var n={SourceName:e=>[e.SourceName,"*"===e.SourceName?t:void 0].filter(Boolean),DestinationName:e=>[e.DestinationName,"*"===e.DestinationName?t:void 0].filter(Boolean)} +e.default=n})) +define("consul-ui/search/predicates/kv",["exports","consul-ui/utils/right-trim"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +var n={Key:e=>(0,t.default)(e.Key.toLowerCase()).split("/").filter((e=>Boolean(e))).pop()} +e.default=n})),define("consul-ui/search/predicates/node",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +var t={Node:e=>e.Node,Address:e=>e.Address,PeerName:e=>e.PeerName,Meta:e=>Object.entries(e.Meta||{}).reduce(((e,t)=>e.concat(t)),[])} +e.default=t})),define("consul-ui/search/predicates/nspace",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +e.default={Name:e=>e.Name,Description:e=>e.Description,Role:e=>((e.ACLs||{}).RoleDefaults||[]).map((e=>e.Name)),Policy:e=>((e.ACLs||{}).PolicyDefaults||[]).map((e=>e.Name))}})),define("consul-ui/search/predicates/peer",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +e.default={Name:e=>e.Name,ID:e=>e.ID}})),define("consul-ui/search/predicates/policy",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +e.default={Name:e=>e.Name,Description:e=>e.Description}})),define("consul-ui/search/predicates/role",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +e.default={Name:e=>e.Name,Description:e=>e.Description,Policy:e=>(e.Policies||[]).map((e=>e.Name)).concat((e.ServiceIdentities||[]).map((e=>e.ServiceName))).concat((e.NodeIdentities||[]).map((e=>e.NodeName)))}})),define("consul-ui/search/predicates/service-instance",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +var t={Name:e=>e.Name,Node:e=>e.Node.Node,Tags:e=>e.Service.Tags||[],ID:e=>e.Service.ID||"",Address:e=>e.Address||"",Port:e=>(e.Service.Port||"").toString(),"Service.Meta":e=>Object.entries(e.Service.Meta||{}).reduce(((e,t)=>e.concat(t)),[]),"Node.Meta":e=>Object.entries(e.Node.Meta||{}).reduce(((e,t)=>e.concat(t)),[])} +e.default=t})),define("consul-ui/search/predicates/service",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +e.default={Name:e=>e.Name,Tags:e=>e.Tags||[],PeerName:e=>e.PeerName,Partition:e=>e.Partition}})),define("consul-ui/search/predicates/token",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +e.default={Name:e=>e.Name,Description:e=>e.Description,AccessorID:e=>e.AccessorID,Role:e=>(e.Roles||[]).map((e=>e.Name)),Policy:e=>(e.Policies||[]).map((e=>e.Name)).concat((e.ServiceIdentities||[]).map((e=>e.ServiceName))).concat((e.NodeIdentities||[]).map((e=>e.NodeName)))}})),define("consul-ui/search/predicates/upstream-instance",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +e.default={DestinationName:(e,t)=>e.DestinationName,LocalBindAddress:(e,t)=>e.LocalBindAddress,LocalBindPort:(e,t)=>e.LocalBindPort.toString()}})),define("consul-ui/serializers/-default",["exports","@ember-data/serializer/json"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/serializers/-json-api",["exports","@ember-data/serializer/json-api"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/serializers/-rest",["exports","@ember-data/serializer/rest"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/serializers/application",["exports","consul-ui/serializers/http","@ember/object","consul-ui/utils/http/consul","consul-ui/utils/http/headers","consul-ui/models/dc","consul-ui/models/nspace","consul-ui/models/partition","consul-ui/utils/create-fingerprinter"],(function(e,t,n,l,r,i,o,a,u){function s(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const c=function(e,t){const n={} +return Object.keys(e).forEach((function(t){n[t.toLowerCase()]=e[t]})),t[l.HEADERS_SYMBOL]=n,t} +class d extends t.default{constructor(){super(...arguments),s(this,"attachHeaders",c),s(this,"fingerprint",(0,u.default)(i.FOREIGN_KEY,o.NSPACE_KEY,a.PARTITION_KEY))}respondForQuery(e,t){return e(((e,n)=>{return c(e,(r=n,i=this.fingerprint(this.primaryKey,this.slugKey,t.dc,e[l.HEADERS_NAMESPACE],e[l.HEADERS_PARTITION]),Array.isArray(r)?r.map(i):[r].map(i)[0]),t) +var r,i}))}respondForQueryRecord(e,t){return e(((e,n)=>c(e,this.fingerprint(this.primaryKey,this.slugKey,t.dc,e[l.HEADERS_NAMESPACE],e[l.HEADERS_PARTITION])(n),t)))}respondForCreateRecord(e,t,n){const r=this.slugKey,o=this.primaryKey +return e(((e,t)=>(!0===t&&(t=n),this.fingerprint(o,r,n[i.FOREIGN_KEY],e[l.HEADERS_NAMESPACE],n.Partition)(t))))}respondForUpdateRecord(e,t,n){const r=this.slugKey,o=this.primaryKey +return e(((e,t)=>(!0===t&&(t=n),this.fingerprint(o,r,n[i.FOREIGN_KEY],e[l.HEADERS_NAMESPACE],e[l.HEADERS_PARTITION])(t))))}respondForDeleteRecord(e,t,n){const r=this.slugKey,u=this.primaryKey +return e(((e,t)=>({[u]:this.fingerprint(u,r,n[i.FOREIGN_KEY],e[l.HEADERS_NAMESPACE],e[l.HEADERS_PARTITION])({[r]:n[r],[o.NSPACE_KEY]:n[o.NSPACE_KEY],[a.PARTITION_KEY]:n[a.PARTITION_KEY]})[u]})))}normalizeResponse(e,t,n,l,r){const i=this.normalizePayload(n,l,r),o=this.normalizeMeta(e,t,i,l,r) +"query"!==r&&(i.meta=o) +const a=super.normalizeResponse(e,t,{meta:o,[t.modelName]:i},l,r) +return void 0===a?n:a}timestamp(){return(new Date).getTime()}normalizeMeta(e,t,i,o,a){const u=i[l.HEADERS_SYMBOL]||{} +delete i[l.HEADERS_SYMBOL] +const s={cacheControl:u[r.CACHE_CONTROL.toLowerCase()],cursor:u[l.HEADERS_INDEX.toLowerCase()],dc:u[l.HEADERS_DATACENTER.toLowerCase()],nspace:u[l.HEADERS_NAMESPACE.toLowerCase()],partition:u[l.HEADERS_PARTITION.toLowerCase()]} +return void 0!==u["x-range"]&&(s.range=u["x-range"]),void 0!==u.refresh&&(s.interval=1e3*u.refresh),"query"===a&&(s.date=this.timestamp(),i.forEach((function(e){(0,n.set)(e,"SyncTime",s.date)}))),s}normalizePayload(e,t,n){return e}}e.default=d})),define("consul-ui/serializers/auth-method",["exports","consul-ui/serializers/application","consul-ui/models/auth-method"],(function(e,t,n){function l(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +class r extends t.default{constructor(){super(...arguments),l(this,"primaryKey",n.PRIMARY_KEY),l(this,"slugKey",n.SLUG_KEY)}}e.default=r})),define("consul-ui/serializers/binding-rule",["exports","consul-ui/serializers/application","consul-ui/models/binding-rule"],(function(e,t,n){function l(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +class r extends t.default{constructor(){super(...arguments),l(this,"primaryKey",n.PRIMARY_KEY),l(this,"slugKey",n.SLUG_KEY)}}e.default=r})),define("consul-ui/serializers/coordinate",["exports","consul-ui/serializers/application","consul-ui/models/coordinate"],(function(e,t,n){function l(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +class r extends t.default{constructor(){super(...arguments),l(this,"primaryKey",n.PRIMARY_KEY),l(this,"slugKey",n.SLUG_KEY)}}e.default=r})),define("consul-ui/serializers/discovery-chain",["exports","consul-ui/serializers/application","consul-ui/models/discovery-chain"],(function(e,t,n){function l(e,t){var n=Object.keys(e) +if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e) +t&&(l=l.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,l)}return n}function r(e){for(var t=1;tt))}respondForQueryRecord(e,t){return e(((e,t)=>t))}respondForFindAll(e,t){return e(((e,t)=>t))}respondForCreateRecord(e,t){return e(((e,t)=>t))}respondForUpdateRecord(e,t){return e(((e,t)=>t))}respondForDeleteRecord(e,t){return e(((e,t)=>t))}}e.default=n})),define("consul-ui/serializers/intention",["exports","consul-ui/serializers/application","@ember/service","@ember/object","consul-ui/models/intention"],(function(e,t,n,l,r){var i,o,a +function u(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +let s=(i=(0,n.inject)("encoder"),o=class extends t.default{constructor(){var e,t,n,l +super(...arguments),e=this,t="encoder",l=this,(n=a)&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(l):void 0}),u(this,"primaryKey",r.PRIMARY_KEY),u(this,"slugKey",r.SLUG_KEY)}init(){super.init(...arguments),this.uri=this.encoder.uriTag()}ensureID(e){return(0,l.get)(e,"ID.length")?(e.Legacy=!0,e.LegacyID=e.ID):e.Legacy=!1,e.SourcePeer?e.ID=this.uri`peer:${e.SourcePeer}:${e.SourceNS}:${e.SourceName}:${e.DestinationPartition}:${e.DestinationNS}:${e.DestinationName}`:e.ID=this.uri`${e.SourcePartition}:${e.SourceNS}:${e.SourceName}:${e.DestinationPartition}:${e.DestinationNS}:${e.DestinationName}`,e}respondForQuery(e,t){return super.respondForQuery((t=>e(((e,n)=>t(e,n.map((e=>this.ensureID(e))))))),t)}respondForQueryRecord(e,t){return super.respondForQueryRecord((t=>e(((e,n)=>(n=this.ensureID(n),t(e,n))))),t)}respondForCreateRecord(e,t,n){const l=this.slugKey,r=this.primaryKey +return e(((e,i)=>((i=n).ID=this.uri`${t.SourcePartition}:${t.SourceNS}:${t.SourceName}:${t.DestinationPartition}:${t.DestinationNS}:${t.DestinationName}`,this.fingerprint(r,l,i.Datacenter)(i))))}respondForUpdateRecord(e,t,n){const l=this.slugKey,r=this.primaryKey +return e(((e,i)=>((i=n).LegacyID=i.ID,i.ID=t.ID,this.fingerprint(r,l,i.Datacenter)(i))))}},c=o.prototype,d="encoder",p=[i],f={configurable:!0,enumerable:!0,writable:!0,initializer:null},h={},Object.keys(f).forEach((function(e){h[e]=f[e]})),h.enumerable=!!h.enumerable,h.configurable=!!h.configurable,("value"in h||h.initializer)&&(h.writable=!0),h=p.slice().reverse().reduce((function(e,t){return t(c,d,e)||e}),h),m&&void 0!==h.initializer&&(h.value=h.initializer?h.initializer.call(m):void 0,h.initializer=void 0),void 0===h.initializer&&(Object.defineProperty(c,d,h),h=null),a=h,o) +var c,d,p,f,m,h +e.default=s})),define("consul-ui/serializers/kv",["exports","consul-ui/serializers/application","@ember/service","consul-ui/models/kv"],(function(e,t,n,l){var r,i,o +function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +let u=(r=(0,n.inject)("atob"),i=class extends t.default{constructor(){var e,t,n,r +super(...arguments),e=this,t="decoder",r=this,(n=o)&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(r):void 0}),a(this,"primaryKey",l.PRIMARY_KEY),a(this,"slugKey",l.SLUG_KEY)}serialize(e,t){const n=e.attr("Value") +return"string"==typeof n?this.decoder.execute(n):null}respondForQueryRecord(e,t){return super.respondForQueryRecord((t=>e(((e,n)=>(void 0===n[0].Session&&(n[0].Session=""),t(e,n[0]))))),t)}respondForQuery(e,t){return super.respondForQuery((t=>e(((e,n)=>t(e,n.map((e=>({[this.slugKey]:e}))))))),t)}},s=i.prototype,c="decoder",d=[r],p={configurable:!0,enumerable:!0,writable:!0,initializer:null},m={},Object.keys(p).forEach((function(e){m[e]=p[e]})),m.enumerable=!!m.enumerable,m.configurable=!!m.configurable,("value"in m||m.initializer)&&(m.writable=!0),m=d.slice().reverse().reduce((function(e,t){return t(s,c,e)||e}),m),f&&void 0!==m.initializer&&(m.value=m.initializer?m.initializer.call(f):void 0,m.initializer=void 0),void 0===m.initializer&&(Object.defineProperty(s,c,m),m=null),o=m,i) +var s,c,d,p,f,m +e.default=u})),define("consul-ui/serializers/node",["exports","consul-ui/serializers/application","@ember-data/serializer/rest","consul-ui/models/node","@ember/string"],(function(e,t,n,l,r){function i(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const o=function(e){return""===e[l.SLUG_KEY]&&(e[l.SLUG_KEY]=e.Node),e} +class a extends(t.default.extend(n.EmbeddedRecordsMixin)){constructor(){super(...arguments),i(this,"primaryKey",l.PRIMARY_KEY),i(this,"slugKey",l.SLUG_KEY),i(this,"attrs",{Services:{embedded:"always"}})}transformHasManyResponse(e,t,n){let l,r={} +return"Services"===t.key?((n.Checks||[]).filter((e=>""!==e.ServiceID)).forEach((e=>{void 0===r[e.ServiceID]&&(r[e.ServiceID]=[]),r[e.ServiceID].push(e)})),""===n.PeerName&&(n.PeerName=void 0),l=this.store.serializerFor(t.type),n.Services=n.Services.map((e=>l.transformHasManyResponseFromNode(n,e,r))),n):super.transformHasManyResponse(...arguments)}respondForQuery(e,t,n,l){const i=super.respondForQuery((t=>e(((e,n)=>t(e,n.map(o))))),t) +return l.eachRelationship(((e,t)=>{i.forEach((e=>this[`transform${(0,r.classify)(t.kind)}Response`](this.store,t,e,i)))})),i}respondForQueryRecord(e,t,n,l){const i=super.respondForQueryRecord((t=>e(((e,n)=>t(e,o(n))))),t) +return l.eachRelationship(((e,t)=>{this[`transform${(0,r.classify)(t.kind)}Response`](this.store,t,i)})),i}respondForQueryLeader(e,t){return e(((e,n)=>{const l=n.split(":"),r=l.pop(),i=l.join(":") +return this.attachHeaders(e,{Address:i,Port:r},t)}))}}e.default=a})),define("consul-ui/serializers/nspace",["exports","consul-ui/serializers/application","@ember/object","consul-ui/models/nspace"],(function(e,t,n,l){function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const i=e=>((0,n.get)(e,"ACLs.PolicyDefaults")&&(e.ACLs.PolicyDefaults=e.ACLs.PolicyDefaults.map((function(e){return void 0===e.template&&(e.template=""),e}))),["PolicyDefaults","RoleDefaults"].forEach((function(t){void 0===e.ACLs&&(e.ACLs=[]),void 0===e.ACLs[t]&&(e.ACLs[t]=[])})),e) +class o extends t.default{constructor(){super(...arguments),r(this,"primaryKey",l.PRIMARY_KEY),r(this,"slugKey",l.SLUG_KEY)}respondForQuery(e,t,n,l){return super.respondForQuery((n=>e(((e,l)=>n(e,l.map((function(e){return e.Namespace="*",e.Datacenter=t.dc,i(e)})))))),t)}respondForQueryRecord(e,t,n){return super.respondForQuery((n=>e(((e,l)=>(l.Datacenter=t.dc,l.Namespace="*",n(e,i(l)))))),t,n)}respondForCreateRecord(e,t,n){return super.respondForCreateRecord((n=>e(((e,l)=>(l.Datacenter=t.dc,l.Namespace="*",n(e,i(l)))))),t,n)}respondForUpdateRecord(e,t,n){return e(((e,t)=>i(t)))}}e.default=o})),define("consul-ui/serializers/oidc-provider",["exports","consul-ui/serializers/application","consul-ui/models/oidc-provider"],(function(e,t,n){function l(e,t){var n=Object.keys(e) +if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e) +t&&(l=l.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,l)}return n}function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +class i extends t.default{constructor(){super(...arguments),r(this,"primaryKey",n.PRIMARY_KEY),r(this,"slugKey",n.SLUG_KEY)}respondForAuthorize(e,t,n){return e(((e,t)=>this.attachHeaders(e,t,n)))}respondForQueryRecord(e,t){return super.respondForQueryRecord((n=>e(((e,i)=>n(e,function(e){for(var t=1;te(((e,n)=>t(e,n.map((e=>(e.Partition="*",e.Namespace="*",e))))))),t)}}e.default=r})),define("consul-ui/serializers/permission",["exports","consul-ui/serializers/application"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +class n extends t.default{}e.default=n})),define("consul-ui/serializers/policy",["exports","consul-ui/serializers/application","consul-ui/models/policy"],(function(e,t,n){function l(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +class r extends t.default{constructor(){super(...arguments),l(this,"primaryKey",n.PRIMARY_KEY),l(this,"slugKey",n.SLUG_KEY)}}e.default=r})),define("consul-ui/serializers/proxy",["exports","consul-ui/serializers/application","consul-ui/models/proxy"],(function(e,t,n){function l(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +class r extends t.default{constructor(){super(...arguments),l(this,"primaryKey",n.PRIMARY_KEY),l(this,"slugKey",n.SLUG_KEY),l(this,"attrs",{NodeName:"Node"})}}e.default=r})),define("consul-ui/serializers/role",["exports","consul-ui/serializers/application","consul-ui/models/role","consul-ui/mixins/policy/as-many"],(function(e,t,n,l){function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +class i extends(t.default.extend(l.default)){constructor(){super(...arguments),r(this,"primaryKey",n.PRIMARY_KEY),r(this,"slugKey",n.SLUG_KEY)}}e.default=i})),define("consul-ui/serializers/service-instance",["exports","consul-ui/serializers/application","consul-ui/models/service-instance"],(function(e,t,n){function l(e,t){var n=Object.keys(e) +if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e) +t&&(l=l.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,l)}return n}function r(e){for(var t=1;t{switch(t.Status){case"passing":e.ChecksPassing.push(t) +break +case"warning":e.ChecksWarning.push(t) +break +case"critical":e.ChecksCritical.push(t)}return e}),{ChecksPassing:[],ChecksWarning:[],ChecksCritical:[]}),o=r(r({},i),{},{Service:t,Checks:l,Node:{Datacenter:e.Datacenter,Namespace:e.Namespace,Partition:e.Partition,ID:e.ID,Node:e.Node,Address:e.Address,TaggedAddresses:e.TaggedAddresses,Meta:e.Meta}}) +return o.uid=this.extractUid(o),o}respondForQuery(e,t){return super.respondForQuery((n=>e(((e,l)=>{if(0===l.length){const e=new Error +throw e.errors=[{status:"404",title:"Not found"}],e}return l.forEach((e=>{e.Datacenter=t.dc,e.Namespace=t.ns||"default",e.Partition=t.partition||"default",e.uid=this.extractUid(e)})),n(e,l)}))),t)}respondForQueryRecord(e,t){return super.respondForQueryRecord((n=>e(((e,l)=>{if(l.forEach((e=>{e.Datacenter=t.dc,e.Namespace=t.ns||"default",e.Partition=t.partition||"default",e.uid=this.extractUid(e)})),void 0===(l=l.find((function(e){return e.Node.Node===t.node&&e.Service.ID===t.serviceId})))){const e=new Error +throw e.errors=[{status:"404",title:"Not found"}],e}return l.Namespace=l.Service.Namespace,l.Partition=l.Service.Partition,n(e,l)}))),t)}}e.default=o})) +define("consul-ui/serializers/service",["exports","consul-ui/serializers/application","consul-ui/models/service","@ember/object","consul-ui/utils/http/consul"],(function(e,t,n,l,r){function i(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +class o extends t.default{constructor(){super(...arguments),i(this,"primaryKey",n.PRIMARY_KEY),i(this,"slugKey",n.SLUG_KEY)}respondForQuery(e,t){return super.respondForQuery((t=>e(((e,n)=>t(e,this._transformServicesPayload(n))))),t)}respondForQueryRecord(e,t){return super.respondForQueryRecord((n=>e(((e,r)=>n(e,{Name:t.id,Namespace:(0,l.get)(r,"firstObject.Service.Namespace"),Nodes:r})))),t)}createJSONApiDocumentFromServicesPayload(e,t,n){const{primaryKey:l,slugKey:i,fingerprint:o}=this +return{data:this._transformServicesPayload(t).map(o(l,i,n,e[r.HEADERS_NAMESPACE],e[r.HEADERS_PARTITION])).map((e=>({id:e.uid,type:"service",attributes:e})))}}_transformServicesPayload(e){const t={} +return e.filter((function(e){return"connect-proxy"!==e.Kind})).forEach((e=>{t[e.Name]=e})),e.filter((function(e){return"connect-proxy"===e.Kind})).forEach((e=>{e.ProxyFor&&e.ProxyFor.forEach((n=>{void 0!==t[n]&&(t[n].Proxy=e)}))})),e}}e.default=o})),define("consul-ui/serializers/session",["exports","consul-ui/serializers/application","consul-ui/models/session"],(function(e,t,n){function l(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +class r extends t.default{constructor(){super(...arguments),l(this,"primaryKey",n.PRIMARY_KEY),l(this,"slugKey",n.SLUG_KEY)}respondForQueryRecord(e,t){return super.respondForQueryRecord((t=>e(((e,n)=>{if(0===n.length){const e=new Error +throw e.errors=[{status:"404",title:"Not found"}],e}return t(e,n[0])}))),t)}}e.default=r})),define("consul-ui/serializers/token",["exports","consul-ui/serializers/application","@ember/object","consul-ui/models/token","consul-ui/mixins/policy/as-many","consul-ui/mixins/role/as-many"],(function(e,t,n,l,r,i){function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +class a extends(t.default.extend(r.default,i.default)){constructor(){super(...arguments),o(this,"primaryKey",l.PRIMARY_KEY),o(this,"slugKey",l.SLUG_KEY)}serialize(e,t){let n=super.serialize(...arguments) +return null!==n.Rules&&(n={ID:n.SecretID,Name:n.Description,Type:n.Type,Rules:n.Rules}),n&&delete n.SecretID,n}respondForSelf(e,t){return this.respondForQueryRecord(e,t)}respondForUpdateRecord(e,t,l){return super.respondForUpdateRecord((t=>e(((e,l)=>{if(void 0!==l.Policies&&null!==l.Policies||(l.Policies=[]),void 0!==l.ID){const e=this.store.peekAll("token").findBy("SecretID",l.ID) +e&&(l.SecretID=l.ID,l.AccessorID=(0,n.get)(e,"AccessorID"))}return t(e,l)}))),t,l)}}e.default=a})),define("consul-ui/serializers/topology",["exports","consul-ui/serializers/application","consul-ui/models/topology","@ember/service"],(function(e,t,n,l){var r,i,o +function a(e,t){var n=Object.keys(e) +if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e) +t&&(l=l.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,l)}return n}function u(e){for(var t=1;t{e.Intention.SourceName=e.Name,e.Intention.SourceNS=e.Namespace,e.Intention.DestinationName=t.id,e.Intention.DestinationNS=t.ns||"default",l.ensureID(e.Intention)})),i.Upstreams.forEach((e=>{e.Intention.SourceName=t.id,e.Intention.SourceNS=t.ns||"default",e.Intention.DestinationName=e.Name,e.Intention.DestinationNS=e.Namespace,l.ensureID(e.Intention)})),r(e,u(u({},i),{},{[n.SLUG_KEY]:t.id}))}))}),t)}},d=i.prototype,p="store",f=[r],m={configurable:!0,enumerable:!0,writable:!0,initializer:null},b={},Object.keys(m).forEach((function(e){b[e]=m[e]})),b.enumerable=!!b.enumerable,b.configurable=!!b.configurable,("value"in b||b.initializer)&&(b.writable=!0),b=f.slice().reverse().reduce((function(e,t){return t(d,p,e)||e}),b),h&&void 0!==b.initializer&&(b.value=b.initializer?b.initializer.call(h):void 0,b.initializer=void 0),void 0===b.initializer&&(Object.defineProperty(d,p,b),b=null),o=b,i) +var d,p,f,m,h,b +e.default=c})),define("consul-ui/services/-ensure-registered",["exports","@embroider/util/services/ensure-registered"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/services/-portal",["exports","ember-stargate/services/-portal"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/services/abilities",["exports","ember-can/services/can"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +class n extends t.default{parse(e){return super.parse(e.replace("use SSO","use authMethods").replace("service","zervice"))}}e.default=n})),define("consul-ui/services/atob",["exports","@ember/service","consul-ui/utils/atob"],(function(e,t,n){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +class l extends t.default{execute(){return(0,n.default)(...arguments)}}e.default=l})),define("consul-ui/services/auth-providers/oauth2-code-with-url-provider",["exports","torii/providers/oauth2-code","@ember/debug"],(function(e,t,n){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +class l extends t.default{constructor(){var e,t,n +super(...arguments),n="oidc-with-url",(t="name")in(e=this)?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n}buildUrl(){return this.baseUrl}open(e){const t=this.get("name"),l=this.buildUrl() +return this.get("popup").open(l,["state","code"],e).then((function(e){const l={authorizationState:e.state,authorizationCode:decodeURIComponent(e.code),provider:t} +return(0,n.runInDebug)((e=>console.info("Retrieved the following creds from the OAuth Provider",l))),l}))}close(){const e=this.get("popup.remote")||{} +if("function"==typeof e.close)return e.close()}}e.default=l})),define("consul-ui/services/btoa",["exports","@ember/service","consul-ui/utils/btoa"],(function(e,t,n){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +class l extends t.default{execute(){return(0,n.default)(...arguments)}}e.default=l})),define("consul-ui/services/can",["exports","ember-can/services/abilities"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/services/change",["exports","@ember/service","ember-changeset-validations","ember-changeset","consul-ui/utils/form/changeset","consul-ui/validations/intention-permission","consul-ui/validations/intention-permission-http-header"],(function(e,t,n,l,r,i,o){var a,u,s +Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const c={"intention-permission":i.default,"intention-permission-http-header":o.default} +let d=(a=(0,t.inject)("schema"),u=class extends t.default{constructor(){var e,t,n,l +super(...arguments),e=this,t="schema",l=this,(n=s)&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(l):void 0})}init(){super.init(...arguments),this._validators=new Map}willDestroy(){this._validators=null}changesetFor(e,t){let i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{} +const o=this.validatorFor(e,i) +let a +if(o){let e=o +"function"!=typeof o&&(e=(0,n.default)(o)),a=(0,l.Changeset)(t,e,o,{changeset:r.default})}else a=(0,l.Changeset)(t) +return a}validatorFor(e){if(!this._validators.has(e)){const t=c[e] +let n +void 0!==t&&(n=t(this.schema)),this._validators.set(e,n)}return this._validators.get(e)}},p=u.prototype,f="schema",m=[a],h={configurable:!0,enumerable:!0,writable:!0,initializer:null},y={},Object.keys(h).forEach((function(e){y[e]=h[e]})),y.enumerable=!!y.enumerable,y.configurable=!!y.configurable,("value"in y||y.initializer)&&(y.writable=!0),y=m.slice().reverse().reduce((function(e,t){return t(p,f,e)||e}),y),b&&void 0!==y.initializer&&(y.value=y.initializer?y.initializer.call(b):void 0,y.initializer=void 0),void 0===y.initializer&&(Object.defineProperty(p,f,y),y=null),s=y,u) +var p,f,m,h,b,y +e.default=d})),define("consul-ui/services/client/connections",["exports","@ember/service"],(function(e,t){var n,l,r,i,o,a,u +function s(e,t,n,l){n&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(l):void 0})}function c(e,t,n,l,r){var i={} +return Object.keys(l).forEach((function(e){i[e]=l[e]})),i.enumerable=!!i.enumerable,i.configurable=!!i.configurable,("value"in i||i.initializer)&&(i.writable=!0),i=n.slice().reverse().reduce((function(n,l){return l(e,t,n)||n}),i),r&&void 0!==i.initializer&&(i.value=i.initializer?i.initializer.call(r):void 0,i.initializer=void 0),void 0===i.initializer&&(Object.defineProperty(e,t,i),i=null),i}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +let d=(n=(0,t.inject)("dom"),l=(0,t.inject)("env"),r=(0,t.inject)("data-source/service"),i=class extends t.default{constructor(){super(...arguments),s(this,"dom",o,this),s(this,"env",a,this),s(this,"data",u,this)}init(){super.init(...arguments),this._listeners=this.dom.listeners(),this.connections=new Set,this.addVisibilityChange()}willDestroy(){this._listeners.remove(),this.purge(),super.willDestroy(...arguments)}addVisibilityChange(){this._listeners.add(this.dom.document(),{visibilitychange:e=>{e.target.hidden&&this.purge(-1)}})}whenAvailable(e){const t=this.dom.document() +return t.hidden?new Promise((n=>{const l=this._listeners.add(t,{visibilitychange:function(t){l(),n(e)}})})):Promise.resolve(e)}purge(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0;[...this.connections].forEach((function(t){t.abort(e)})),this.connections=new Set}acquire(e){if(this.connections.size>=this.env.var("CONSUL_HTTP_MAX_CONNECTIONS")){const t=this.data.closed() +let n=[...this.connections].find((e=>!!e.headers()["x-request-id"]&&t.includes(e.headers()["x-request-id"]))) +void 0===n&&"text/event-stream"===e.headers()["content-type"]&&(n=this.connections.values().next().value),void 0!==n&&(this.release(n),n.abort(429))}this.connections.add(e)}release(e){this.connections.delete(e)}},o=c(i.prototype,"dom",[n],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),a=c(i.prototype,"env",[l],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),u=c(i.prototype,"data",[r],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),i) +e.default=d})),define("consul-ui/services/client/http",["exports","@ember/service","@ember/object","@ember/runloop","consul-ui/utils/http/headers","consul-ui/utils/http/consul","consul-ui/utils/http/create-url","consul-ui/utils/http/create-headers","consul-ui/utils/http/create-query-params"],(function(e,t,n,l,r,i,o,a,u){var s,c,d,p,f,m,h,b,y,g,v,O,P,x,w +function j(e,t,n,l){n&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(l):void 0})}function _(e,t,n,l,r){var i={} +return Object.keys(l).forEach((function(e){i[e]=l[e]})),i.enumerable=!!i.enumerable,i.configurable=!!i.configurable,("value"in i||i.initializer)&&(i.writable=!0),i=n.slice().reverse().reduce((function(n,l){return l(e,t,n)||n}),i),r&&void 0!==i.initializer&&(i.value=i.initializer?i.initializer.call(r):void 0,i.initializer=void 0),void 0===i.initializer&&(Object.defineProperty(e,t,i),i=null),i}function k(e,t){var n=Object.keys(e) +if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e) +t&&(l=l.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,l)}return n}function S(e){for(var t=1;tC.stringify(this.sanitize(e)))) +const e=this.encoder.uriTag() +this.cache=(t,n)=>(t.uri=n(e),t.SyncTime=(new Date).getTime(),this.store.push({data:{id:t.uri,type:new URL(t.uri).protocol.slice(0,-1),attributes:t}}))}sanitize(e){return this.env.var("CONSUL_NSPACES_ENABLED")&&void 0!==e.ns&&null!==e.ns&&""!==e.ns||delete e.ns,this.env.var("CONSUL_PARTITIONS_ENABLED")&&void 0!==e.partition&&null!==e.partition&&""!==e.partition||delete e.partition,e}willDestroy(){this._listeners.remove(),super.willDestroy(...arguments)}url(){return this.parseURL(...arguments)}body(){const e=function(e){let t={} +const n=e.reduce((function(e,t,n){return-1!==(t=t.split("\n").map((e=>e.trim())).join("\n")).indexOf("\n\n")?n:e}),-1) +for(var l=arguments.length,r=new Array(l>1?l-1:0),i=1;i1?t-1:0),l=1;l0||Object.keys(d.data).length>0)&&(d.body=d.data) +else{const e=C.stringify(d.data) +e.length>0&&(-1!==d.url.indexOf("?")?d.url=`${d.url}&${e}`:d.url=`${d.url}?${e}`)}return d.headers[r.CONTENT_TYPE]="application/json; charset=utf-8",d.url=`${this.env.var("CONSUL_API_PREFIX")}${d.url}`,d}fetchWithToken(e,t){return this.settings.findBySlug("token").then((n=>fetch(`${this.env.var("CONSUL_API_PREFIX")}${e}`,S(S({},t),{},{credentials:"include",headers:S({"X-Consul-Token":void 0===n.SecretID?"":n.SecretID},t.headers)}))))}request(e){const t=this,n=this.cache +return e((function(e){for(var r=arguments.length,o=new Array(r>1?r-1:0),a=1;a{const r=S(S({},u),{},{headers:S({[i.HEADERS_TOKEN]:void 0===e.SecretID?"":e.SecretID},u.headers)}),o=t.transport.request(r) +return new Promise(((r,a)=>{const s=t._listeners.add(o,{open:e=>{t.acquire(e.target)},message:t=>{const o=S(S(S({},Object.entries(t.data.headers).reduce((function(e,t,n){let[l,r]=t +return M.includes(l)||(e[l]=r),e}),{})),u.clientHeaders),{},{[i.HEADERS_DATACENTER]:u.data.dc,[i.HEADERS_NAMESPACE]:u.data.ns||e.Namespace||"default",[i.HEADERS_PARTITION]:u.data.partition||e.Partition||"default"}),a=function(e){let l=e(o,t.data.response,n) +const r=l.meta||{} +return 2===r.version&&(Array.isArray(l.body)?l=new Proxy(l.body,{get:(e,t)=>"meta"===t?r:e[t]}):(l=l.body,l.meta=r)),l};(0,l.next)((()=>r(a)))},error:e=>{(0,l.next)((()=>a(e.error)))},close:e=>{t.release(e.target),s()}}) +o.fetch()}))}))}))}whenAvailable(e){return this.connections.whenAvailable(e)}abort(){return this.connections.purge(...arguments)}acquire(){return this.connections.acquire(...arguments)}release(){return this.connections.release(...arguments)}},y=_(b.prototype,"dom",[s],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),g=_(b.prototype,"env",[c],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),v=_(b.prototype,"connections",[d],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),O=_(b.prototype,"transport",[p],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),P=_(b.prototype,"settings",[f],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),x=_(b.prototype,"encoder",[m],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),w=_(b.prototype,"store",[h],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),b) +e.default=D})),define("consul-ui/services/client/transports/xhr",["exports","@ember/service","consul-ui/utils/http/create-headers","consul-ui/utils/http/xhr","consul-ui/utils/http/request","consul-ui/utils/http/error"],(function(e,t,n,l,r,i){function o(e,t){var n=Object.keys(e) +if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e) +t&&(l=l.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,l)}return n}function a(e){for(var t=1;t(this.xhr(n),t),t}}e.default=c})),define("consul-ui/services/clipboard/local-storage",["exports","@ember/service","clipboard"],(function(e,t,n){var l,r,i +Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +class o extends n.default{constructor(e,t,n){super(e,t),this._cb=n}onClick(e){this._cb(this.text(e.delegateTarget||e.currentTarget)),this.emit("success",{})}}let a=(l=(0,t.inject)("-document"),r=class extends t.default{constructor(){var e,t,n,l,r,o,a +super(...arguments),e=this,t="doc",l=this,(n=i)&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(l):void 0}),a="clipboard",(o="key")in(r=this)?Object.defineProperty(r,o,{value:a,enumerable:!0,configurable:!0,writable:!0}):r[o]=a}execute(e,t){return new o(e,t,(e=>{this.doc.defaultView.localStorage.setItem(this.key,e)}))}},u=r.prototype,s="doc",c=[l],d={configurable:!0,enumerable:!0,writable:!0,initializer:null},f={},Object.keys(d).forEach((function(e){f[e]=d[e]})),f.enumerable=!!f.enumerable,f.configurable=!!f.configurable,("value"in f||f.initializer)&&(f.writable=!0),f=c.slice().reverse().reduce((function(e,t){return t(u,s,e)||e}),f),p&&void 0!==f.initializer&&(f.value=f.initializer?f.initializer.call(p):void 0,f.initializer=void 0),void 0===f.initializer&&(Object.defineProperty(u,s,f),f=null),i=f,r) +var u,s,c,d,p,f +e.default=a})),define("consul-ui/services/clipboard/os",["exports","@ember/service","clipboard"],(function(e,t,n){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +class l extends t.default{execute(){return new n.default(...arguments)}}e.default=l})),define("consul-ui/services/code-mirror",["exports","ivy-codemirror/services/code-mirror"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/services/code-mirror/linter",["exports","@ember/service","consul-ui/utils/editor/lint"],(function(e,t,n){var l,r,i +Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const o=[{name:"JSON",mime:"application/json",mode:"javascript",ext:["json","map"],alias:["json5"]},{name:"HCL",mime:"text/x-ruby",mode:"ruby",ext:["rb"],alias:["jruby","macruby","rake","rb","rbx"]},{name:"YAML",mime:"text/x-yaml",mode:"yaml",ext:["yaml","yml"],alias:["yml"]},{name:"XML",mime:"application/xml",mode:"xml",htmlMode:!1,matchClosing:!0,alignCDATA:!1,ext:["xml"],alias:["xml"]}] +let a=(l=(0,t.inject)("dom"),r=class extends t.default{constructor(){var e,t,n,l +super(...arguments),e=this,t="dom",l=this,(n=i)&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(l):void 0})}modes(){return o}lint(){return(0,n.default)(...arguments)}getEditor(e){return this.dom.element("textarea + div",e).CodeMirror}},u=r.prototype,s="dom",c=[l],d={configurable:!0,enumerable:!0,writable:!0,initializer:null},f={},Object.keys(d).forEach((function(e){f[e]=d[e]})),f.enumerable=!!f.enumerable,f.configurable=!!f.configurable,("value"in f||f.initializer)&&(f.writable=!0),f=c.slice().reverse().reduce((function(e,t){return t(u,s,e)||e}),f),p&&void 0!==f.initializer&&(f.value=f.initializer?f.initializer.call(p):void 0,f.initializer=void 0),void 0===f.initializer&&(Object.defineProperty(u,s,f),f=null),i=f,r) +var u,s,c,d,p,f +e.default=a})),define("consul-ui/services/container",["exports","@ember/service"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +class n extends t.default{constructor(e){super(...arguments),this._owner=e,this._wm=new WeakMap}set(e,t){this._wm.set(t,e)}keyForClass(e){return this._wm.get(e)}get(e){return"string"!=typeof e&&(e=this.keyForClass(e)),this.lookup(e)}lookup(e){return this._owner.lookup(e)}resolveRegistration(e){return this._owner.resolveRegistration(e).prototype}}e.default=n})),define("consul-ui/services/data-sink/protocols/http",["exports","@ember/service","@ember/object"],(function(e,t,n){var l,r,i,o,a,u,s,c,d,p,f,m,h,b,y,g,v +function O(e,t,n,l){n&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(l):void 0})}function P(e,t,n,l,r){var i={} +return Object.keys(l).forEach((function(e){i[e]=l[e]})),i.enumerable=!!i.enumerable,i.configurable=!!i.configurable,("value"in i||i.initializer)&&(i.writable=!0),i=n.slice().reverse().reduce((function(n,l){return l(e,t,n)||n}),i),r&&void 0!==i.initializer&&(i.value=i.initializer?i.initializer.call(r):void 0,i.initializer=void 0),void 0===i.initializer&&(Object.defineProperty(e,t,i),i=null),i}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +let x=(l=(0,t.inject)("client/http"),r=(0,t.inject)("settings"),i=(0,t.inject)("repository/intention"),o=(0,t.inject)("repository/kv"),a=(0,t.inject)("repository/nspace"),u=(0,t.inject)("repository/partition"),s=(0,t.inject)("repository/peer"),c=(0,t.inject)("repository/session"),d=class extends t.default{constructor(){super(...arguments),O(this,"client",p,this),O(this,"settings",f,this),O(this,"intention",m,this),O(this,"kv",h,this),O(this,"nspace",b,this),O(this,"partition",y,this),O(this,"peer",g,this),O(this,"session",v,this)}prepare(e,t,l){return(0,n.setProperties)(l,t)}persist(e,t){const[,,,,n]=e.split("/"),l=this[n] +return this.client.request((e=>l.persist(t,e)))}remove(e,t){const[,,,,n]=e.split("/"),l=this[n] +return this.client.request((e=>l.remove(t,e)))}},p=P(d.prototype,"client",[l],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),f=P(d.prototype,"settings",[r],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),m=P(d.prototype,"intention",[i],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),h=P(d.prototype,"kv",[o],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),b=P(d.prototype,"nspace",[a],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),y=P(d.prototype,"partition",[u],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),g=P(d.prototype,"peer",[s],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),v=P(d.prototype,"session",[c],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),d) +e.default=x})),define("consul-ui/services/data-sink/protocols/local-storage",["exports","@ember/service","@ember/object"],(function(e,t,n){var l,r,i +Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +let o=(l=(0,t.inject)("settings"),r=class extends t.default{constructor(){var e,t,n,l +super(...arguments),e=this,t="settings",l=this,(n=i)&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(l):void 0})}prepare(e,t){let l=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{} +return null===t||""===t?l:(0,n.setProperties)(l,t)}persist(e,t){const n=e.split(":").pop() +return this.settings.persist({[n]:t})}remove(e,t){const n=e.split(":").pop() +return this.settings.delete(n)}},a=r.prototype,u="settings",s=[l],c={configurable:!0,enumerable:!0,writable:!0,initializer:null},p={},Object.keys(c).forEach((function(e){p[e]=c[e]})),p.enumerable=!!p.enumerable,p.configurable=!!p.configurable,("value"in p||p.initializer)&&(p.writable=!0),p=s.slice().reverse().reduce((function(e,t){return t(a,u,e)||e}),p),d&&void 0!==p.initializer&&(p.value=p.initializer?p.initializer.call(d):void 0,p.initializer=void 0),void 0===p.initializer&&(Object.defineProperty(a,u,p),p=null),i=p,r) +var a,u,s,c,d,p +e.default=o})),define("consul-ui/services/data-sink/service",["exports","@ember/service"],(function(e,t){var n,l,r,i,o +function a(e,t,n,l){n&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(l):void 0})}function u(e,t,n,l,r){var i={} +return Object.keys(l).forEach((function(e){i[e]=l[e]})),i.enumerable=!!i.enumerable,i.configurable=!!i.configurable,("value"in i||i.initializer)&&(i.writable=!0),i=n.slice().reverse().reduce((function(n,l){return l(e,t,n)||n}),i),r&&void 0!==i.initializer&&(i.value=i.initializer?i.initializer.call(r):void 0,i.initializer=void 0),void 0===i.initializer&&(Object.defineProperty(e,t,i),i=null),i}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const s=function(e){return-1===(e=e.toString()).indexOf("://")&&(e=`consul://${e}`),e.split("://")} +let c=(n=(0,t.inject)("data-sink/protocols/http"),l=(0,t.inject)("data-sink/protocols/local-storage"),r=class extends t.default{constructor(){super(...arguments),a(this,"consul",i,this),a(this,"settings",o,this)}prepare(e,t,n){const[l,r]=s(e) +return this[l].prepare(r,t,n)}persist(e,t){const[n,l]=s(e) +return this[n].persist(l,t)}remove(e,t){const[n,l]=s(e) +return this[n].remove(l,t)}},i=u(r.prototype,"consul",[n],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),o=u(r.prototype,"settings",[l],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),r) +e.default=c})),define("consul-ui/services/data-source/protocols/http",["exports","@ember/service","@ember/application","consul-ui/decorators/data-source"],(function(e,t,n,l){var r,i,o,a,u +function s(e,t,n,l){n&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(l):void 0})}function c(e,t,n,l,r){var i={} +return Object.keys(l).forEach((function(e){i[e]=l[e]})),i.enumerable=!!i.enumerable,i.configurable=!!i.configurable,("value"in i||i.initializer)&&(i.writable=!0),i=n.slice().reverse().reduce((function(n,l){return l(e,t,n)||n}),i),r&&void 0!==i.initializer&&(i.value=i.initializer?i.initializer.call(r):void 0,i.initializer=void 0),void 0===i.initializer&&(Object.defineProperty(e,t,i),i=null),i}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +let d=(r=(0,t.inject)("client/http"),i=(0,t.inject)("data-source/protocols/http/blocking"),o=class extends t.default{constructor(){super(...arguments),s(this,"client",a,this),s(this,"type",u,this)}source(e,t){const r=(0,l.match)(e) +let i +return this.client.request((e=>{i=r.cb(r.params,(0,n.getOwner)(this),e)})),this.type.source(i,t)}},a=c(o.prototype,"client",[r],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),u=c(o.prototype,"type",[i],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),o) +e.default=d})),define("consul-ui/services/data-source/protocols/http/blocking",["exports","@ember/service","@ember/object","consul-ui/utils/dom/event-source","consul-ui/services/settings","consul-ui/services/client/http","consul-ui/utils/maybe-call"],(function(e,t,n,l,r,i,o){var a,u,s,c,d +function p(e,t,n,l){n&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(l):void 0})}function f(e,t,n,l,r){var i={} +return Object.keys(l).forEach((function(e){i[e]=l[e]})),i.enumerable=!!i.enumerable,i.configurable=!!i.configurable,("value"in i||i.initializer)&&(i.writable=!0),i=n.slice().reverse().reduce((function(n,l){return l(e,t,n)||n}),i),r&&void 0!==i.initializer&&(i.value=i.initializer?i.initializer.call(r):void 0,i.initializer=void 0),void 0===i.initializer&&(Object.defineProperty(e,t,i),i=null),i}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +let m=(a=(0,t.inject)("client/http"),u=(0,t.inject)("settings"),s=class extends t.default{constructor(){super(...arguments),p(this,"client",c,this),p(this,"settings",d,this)}source(e,t){return new l.BlockingEventSource(((t,l)=>{const a=l.close.bind(l) +return(0,o.default)((()=>t.cursor=void 0),(0,r.ifNotBlocking)(this.settings))().then((()=>e(t).then((0,o.default)(a,(0,r.ifNotBlocking)(this.settings))).then((function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{} +const t=(0,n.get)(e,"meta")||{} +return void 0===t.cursor&&void 0===t.interval&&a(),e})).catch((0,i.restartWhenAvailable)(this.client))))}),t)}},c=f(s.prototype,"client",[a],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),d=f(s.prototype,"settings",[u],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),s) +e.default=m})),define("consul-ui/services/data-source/protocols/http/promise",["exports","@ember/service","consul-ui/utils/dom/event-source"],(function(e,t,n){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +class l extends t.default{source(e,t){return(0,n.once)(e,t)}}e.default=l})),define("consul-ui/services/data-source/protocols/local-storage",["exports","@ember/service","consul-ui/utils/dom/event-source"],(function(e,t,n){var l,r,i +Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +let o=(l=(0,t.inject)("settings"),r=class extends t.default{constructor(){var e,t,n,l +super(...arguments),e=this,t="repo",l=this,(n=i)&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(l):void 0})}source(e,t){const l=e.split(":").pop() +return new n.StorageEventSource((e=>this.repo.findBySlug(l)),{key:e,uri:t.uri})}},a=r.prototype,u="repo",s=[l],c={configurable:!0,enumerable:!0,writable:!0,initializer:null},p={},Object.keys(c).forEach((function(e){p[e]=c[e]})),p.enumerable=!!p.enumerable,p.configurable=!!p.configurable,("value"in p||p.initializer)&&(p.writable=!0),p=s.slice().reverse().reduce((function(e,t){return t(a,u,e)||e}),p),d&&void 0!==p.initializer&&(p.value=p.initializer?p.initializer.call(d):void 0,p.initializer=void 0),void 0===p.initializer&&(Object.defineProperty(a,u,p),p=null),i=p,r) +var a,u,s,c,d,p +e.default=o})),define("consul-ui/services/data-source/service",["exports","@ember/service","@ember/debug","consul-ui/utils/dom/event-source","@ember/runloop","mnemonist/multi-map"],(function(e,t,n,l,r,i){var o,a,u,s,c,d,p,f,m +function h(e,t,n,l){n&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(l):void 0})}function b(e,t,n,l,r){var i={} +return Object.keys(l).forEach((function(e){i[e]=l[e]})),i.enumerable=!!i.enumerable,i.configurable=!!i.configurable,("value"in i||i.initializer)&&(i.writable=!0),i=n.slice().reverse().reduce((function(n,l){return l(e,t,n)||n}),i),r&&void 0!==i.initializer&&(i.value=i.initializer?i.initializer.call(r):void 0,i.initializer=void 0),void 0===i.initializer&&(Object.defineProperty(e,t,i),i=null),i}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +let y=null,g=null,v=null +class O{constructor(e){this.uri=e}toString(){return this.uri}}let P=(o=(0,t.inject)("dom"),a=(0,t.inject)("encoder"),u=(0,t.inject)("data-source/protocols/http"),s=(0,t.inject)("data-source/protocols/local-storage"),c=class extends t.default{constructor(){super(...arguments),h(this,"dom",d,this),h(this,"encoder",p,this),h(this,"consul",f,this),h(this,"settings",m,this)}init(){super.init(...arguments),y=new Map,g=new Map,v=new i.default(Set),this._listeners=this.dom.listeners()}resetCache(){y=new Map}willDestroy(){(0,r.schedule)("afterRender",(()=>{this._listeners.remove(),g.forEach((function(e){e.close()})),y=null,g=null,v.clear(),v=null}))}source(e,t){const n=e(this.encoder.uriTag()) +return new Promise(((e,t)=>{const r={},i=this.open(n,r,!0) +i.configuration.ref=r +const o=this._listeners.add(i,{message:t=>{o(),e((0,l.proxy)(t.target,t.data))},error:e=>{o(),this.close(i,r),t(e.error)}}) +void 0!==i.getCurrentEvent()&&i.dispatchEvent(i.getCurrentEvent())}))}unwrap(e,t){const n=e._source +return v.set(n,t),v.remove(n,n.configuration.ref),delete n.configuration.ref,n}uri(e){return new O(e)}open(e,t){let l,r=arguments.length>2&&void 0!==arguments[2]&&arguments[2] +if(!(e instanceof O)&&"string"!=typeof e)return this.unwrap(e,t);(0,n.runInDebug)((t=>{e instanceof O||console.error(new Error(`DataSource '${e}' does not use the uri helper. Please ensure you use the uri helper to ensure correct encoding`))})),-1===(e=e.toString()).indexOf("://")&&(e=`consul://${e}`) +let[i,o]=e.split("://") +const a=this[i] +if(g.has(e))l=g.get(e),g.delete(e),g.set(e,l) +else{let t={} +y.has(e)&&(t=y.get(e)),t.uri=e,l=a.source(o,t) +const n=this._listeners.add(l,{close:t=>{const l=t.target,r=l.getCurrentEvent(),i=l.configuration.cursor +void 0!==r&&void 0!==i&&t.errors&&"401"!==t.errors[0].status&&y.set(e,{currentEvent:r,cursor:i}),v.has(l)||g.delete(e),n()}}) +g.set(e,l)}return(!v.has(l)||l.readyState>1||r)&&l.open(),v.set(l,t),l}close(e,t){e&&(v.remove(e,t),v.has(e)||(e.close(),2===e.readyState&&g.delete(e.configuration.uri)))}closed(){return[...g.entries()].filter((e=>{let[t,n]=e +return n.readyState>1})).map((e=>e[0]))}},d=b(c.prototype,"dom",[o],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),p=b(c.prototype,"encoder",[a],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),f=b(c.prototype,"consul",[u],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),m=b(c.prototype,"settings",[s],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),c) +e.default=P})),define("consul-ui/services/data-structs",["exports","@ember/service","ngraph.graph"],(function(e,t,n){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +class l extends t.default{graph(){return(0,n.default)()}}e.default=l})),define("consul-ui/services/dom",["exports","@ember/service","@ember/object/internals","consul-ui/utils/dom/qsa-factory","consul-ui/utils/dom/sibling","consul-ui/utils/dom/closest","consul-ui/utils/dom/is-outside","consul-ui/utils/dom/get-component-factory","consul-ui/utils/dom/normalize-event","consul-ui/utils/dom/create-listeners","consul-ui/utils/dom/click-first-anchor"],(function(e,t,n,l,r,i,o,a,u,s,c){var d,p,f +function m(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const h=(0,l.default)() +let b,y +const g=(0,c.default)(i.default) +let v=(d=(0,t.inject)("-document"),p=class extends t.default{constructor(e){var t,n,l,c +super(...arguments),t=this,n="doc",c=this,(l=f)&&Object.defineProperty(t,n,{enumerable:l.enumerable,configurable:l.configurable,writable:l.writable,value:l.initializer?l.initializer.call(c):void 0}),m(this,"clickFirstAnchor",g),m(this,"closest",i.default),m(this,"sibling",r.default),m(this,"isOutside",o.default),m(this,"normalizeEvent",u.default),m(this,"listeners",s.default),y=new WeakMap,b=(0,a.default)(e)}willDestroy(){super.willDestroy(...arguments),y=null,b=null}document(){return this.doc}viewport(){return this.doc.defaultView}guid(e){return(0,n.guidFor)(e)}focus(e){if("string"==typeof e&&(e=this.element(e)),void 0!==e){let t=e.getAttribute("tabindex") +e.setAttribute("tabindex","0"),e.focus(),null===t?e.removeAttribute("tabindex"):e.setAttribute("tabindex",t)}}setEventTargetProperty(e,t,n){const l=e.target +return new Proxy(e,{get:function(r,i,o){return"target"===i?new Proxy(l,{get:function(r,i,o){return i===t?n(e.target[t]):l[i]}}):Reflect.get(...arguments)}})}setEventTargetProperties(e,t){const n=e.target +return new Proxy(e,{get:function(l,r,i){return"target"===r?new Proxy(n,{get:function(l,r,i){return void 0!==t[r]?t[r](e.target):n[r]}}):Reflect.get(...arguments)}})}root(){return this.doc.documentElement}elementById(e){return this.doc.getElementById(e)}elementsByTagName(e,t){return(t=void 0===t?this.doc:t).getElementsByTagName(e)}elements(e,t){return h(e,t)}element(e,t){return"#"===e.substr(0,1)?this.elementById(e.substr(1)):[...h(e,t)][0]}component(e,t){return b("string"!=typeof e?e:this.element(e,t))}components(e,t){return[...this.elements(e,t)].map((function(e){return b(e)})).filter((function(e){return null!=e}))}isInViewport(e,t){let n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:0 +y.set(e,t) +let l=new IntersectionObserver(((e,t)=>{e.map((e=>{const t=y.get(e.target) +"function"==typeof t&&t(e.isIntersecting)}))}),{rootMargin:"0px",threshold:n}) +return l.observe(e),()=>{l.unobserve(e),y&&y.delete(e),l.disconnect(),l=null}}},O=p.prototype,P="doc",x=[d],w={configurable:!0,enumerable:!0,writable:!0,initializer:null},_={},Object.keys(w).forEach((function(e){_[e]=w[e]})),_.enumerable=!!_.enumerable,_.configurable=!!_.configurable,("value"in _||_.initializer)&&(_.writable=!0),_=x.slice().reverse().reduce((function(e,t){return t(O,P,e)||e}),_),j&&void 0!==_.initializer&&(_.value=_.initializer?_.initializer.call(j):void 0,_.initializer=void 0),void 0===_.initializer&&(Object.defineProperty(O,P,_),_=null),f=_,p) +var O,P,x,w,j,_ +e.default=v})) +define("consul-ui/services/encoder",["exports","@ember/service","@ember/object","@ember/debug","consul-ui/utils/atob","consul-ui/utils/btoa"],(function(e,t,n,l,r,i){function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +class a extends t.default{constructor(){super(...arguments),o(this,"uriComponent",encodeURIComponent),o(this,"joiner",(function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"" +return(l,r)=>(r||Array(l.length).fill(t)).reduce(((t,r,i)=>`${t}${r}${e(l[i]||n)}`),"")}))}createRegExpEncoder(e,t){return function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:e=>e,r=!(arguments.length>2&&void 0!==arguments[2])||arguments[2] +return function(){let i=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",o=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{} +return""!==i?i.replace(e,((e,a)=>{const u=(0,n.get)(o,a) +return(0,l.runInDebug)((()=>{r&&void 0===u&&console.error(new Error(`${a} is undefined in ${i}`))})),t(u||"")})):""}}(e,t)}atob(){return(0,r.default)(...arguments)}btoa(){return(0,i.default)(...arguments)}uriJoin(){return this.joiner(this.uriComponent,"/","")(...arguments)}uriTag(){return this.tag(this.uriJoin.bind(this))}tag(e){return function(t){for(var n=arguments.length,l=new Array(n>1?n-1:0),r=1;rthis.success(n,e,void 0,t),error:n=>this.error(n,e,void 0,t)}}success(e,t){let l=arguments.length>2&&void 0!==arguments[2]?arguments[2]:m,r=arguments.length>3?arguments[3]:void 0 +const i=(0,n.default)(t),o=(0,n.default)(l) +!1!==e&&(this.notify.clearMessages(),this.notify.add(s(s({},{timeout:6e3,extendedTimeout:300,destroyOnClick:!0}),{},{type:o(f),action:i(),item:e,model:r})))}error(e,t){let l=arguments.length>2&&void 0!==arguments[2]?arguments[2]:m,r=arguments.length>3?arguments[3]:void 0 +const i=(0,n.default)(t),o=(0,n.default)(l) +this.notify.clearMessages(),this.logger.execute(e),"TransitionAborted"===e.name?this.notify.add(s(s({},{timeout:6e3,extendedTimeout:300,destroyOnClick:!0}),{},{type:o(f),action:i(),model:r})):this.notify.add(s(s({},{timeout:6e3,extendedTimeout:300,destroyOnClick:!0}),{},{type:o("error",e),action:i(),error:e,model:r}))}async execute(e,t,n,l){let r +try{r=await e(),this.success(r,t,n,l)}catch(i){this.error(i,t,n,l)}}},o=p(i.prototype,"notify",[l],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),a=p(i.prototype,"logger",[r],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),i) +e.default=h})),define("consul-ui/services/filter",["exports","@ember/service","consul-ui/utils/filter","consul-ui/filter/predicates/service","consul-ui/filter/predicates/service-instance","consul-ui/filter/predicates/health-check","consul-ui/filter/predicates/node","consul-ui/filter/predicates/kv","consul-ui/filter/predicates/intention","consul-ui/filter/predicates/token","consul-ui/filter/predicates/policy","consul-ui/filter/predicates/auth-method","consul-ui/filter/predicates/peer"],(function(e,t,n,l,r,i,o,a,u,s,c,d,p){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const f={service:(0,n.andOr)(l.default),"service-instance":(0,n.andOr)(r.default),"health-check":(0,n.andOr)(i.default),"auth-method":(0,n.andOr)(d.default),node:(0,n.andOr)(o.default),kv:(0,n.andOr)(a.default),intention:(0,n.andOr)(u.default),token:(0,n.andOr)(s.default),policy:(0,n.andOr)(c.default),peer:(0,n.andOr)(p.default)} +class m extends t.default{predicate(e){return f[e]}}e.default=m})),define("consul-ui/services/flash-messages",["exports","ember-cli-flash/services/flash-messages"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/services/form",["exports","@ember/service","consul-ui/utils/form/builder","consul-ui/forms/kv","consul-ui/forms/token","consul-ui/forms/policy","consul-ui/forms/role","consul-ui/forms/intention"],(function(e,t,n,l,r,i,o,a){var u,s,c,d,p +function f(e,t,n,l){n&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(l):void 0})}function m(e,t,n,l,r){var i={} +return Object.keys(l).forEach((function(e){i[e]=l[e]})),i.enumerable=!!i.enumerable,i.configurable=!!i.configurable,("value"in i||i.initializer)&&(i.writable=!0),i=n.slice().reverse().reduce((function(n,l){return l(e,t,n)||n}),i),r&&void 0!==i.initializer&&(i.value=i.initializer?i.initializer.call(r):void 0,i.initializer=void 0),void 0===i.initializer&&(Object.defineProperty(e,t,i),i=null),i}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const h=(0,n.default)(),b={kv:l.default,token:r.default,policy:i.default,role:o.default,intention:a.default} +let y=(u=(0,t.inject)("repository/role"),s=(0,t.inject)("repository/policy"),c=class extends t.default{constructor(){var e,t,n +super(...arguments),f(this,"role",d,this),f(this,"policy",p,this),n=[],(t="forms")in(e=this)?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n}build(e,t){return h(...arguments)}form(e){let t=this.forms[e] +if(void 0===t&&(t=this.forms[e]=b[e](this),"role"===e||"policy"===e)){const n=this[e] +t.clear((function(e){return n.create(e)})),t.submit((function(e){return n.persist(e)}))}return t}},d=m(c.prototype,"role",[u],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),p=m(c.prototype,"policy",[s],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),c) +e.default=y})),define("consul-ui/services/hcp",["exports","@ember/service","@ember/debug"],(function(e,t,n){var l,r,i,o,a,u,s +function c(e,t,n,l){n&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(l):void 0})}function d(e,t,n,l,r){var i={} +return Object.keys(l).forEach((function(e){i[e]=l[e]})),i.enumerable=!!i.enumerable,i.configurable=!!i.configurable,("value"in i||i.initializer)&&(i.writable=!0),i=n.slice().reverse().reduce((function(n,l){return l(e,t,n)||n}),i),r&&void 0!==i.initializer&&(i.value=i.initializer?i.initializer.call(r):void 0,i.initializer=void 0),void 0===i.initializer&&(Object.defineProperty(e,t,i),i=null),i}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +let p=(l=(0,t.inject)("env"),r=(0,t.inject)("repository/token"),i=(0,t.inject)("settings"),o=class extends t.default{constructor(){super(...arguments),c(this,"env",a,this),c(this,"tokenRepo",u,this),c(this,"settings",s,this)}async updateTokenIfNecessary(e){if(e){const l=await this.settings.findBySlug("token") +if(e&&e!==l.SecretID)try{const t=await this.tokenRepo.self({secret:e,dc:this.env.var("CONSUL_DATACENTER_LOCAL")}) +await this.settings.persist({token:{AccessorID:t.AccessorID,SecretID:t.SecretID,Namespace:t.Namespace,Partition:t.Partition}})}catch(t){(0,n.runInDebug)((e=>console.error(t)))}}}},a=d(o.prototype,"env",[l],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),u=d(o.prototype,"tokenRepo",[r],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),s=d(o.prototype,"settings",[i],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),o) +e.default=p})),define("consul-ui/services/i18n",["exports","ember-intl/services/intl","@ember/service"],(function(e,t,n){var l,r,i +function o(e,t){var n=Object.keys(e) +if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e) +t&&(l=l.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,l)}return n}function a(e){for(var t=1;t(e[t]=this.env.var(t),e)),{}) +return a(a({},e),t)}},d=r.prototype,p="env",f=[l],m={configurable:!0,enumerable:!0,writable:!0,initializer:null},b={},Object.keys(m).forEach((function(e){b[e]=m[e]})),b.enumerable=!!b.enumerable,b.configurable=!!b.configurable,("value"in b||b.initializer)&&(b.writable=!0),b=f.slice().reverse().reduce((function(e,t){return t(d,p,e)||e}),b),h&&void 0!==b.initializer&&(b.value=b.initializer?b.initializer.call(h):void 0,b.initializer=void 0),void 0===b.initializer&&(Object.defineProperty(d,p,b),b=null),i=b,r) +var d,p,f,m,h,b +e.default=c})),define("consul-ui/services/in-viewport",["exports","ember-in-viewport/services/in-viewport"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/services/intl",["exports","ember-intl/services/intl"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/services/keyboard",["exports","ember-keyboard/services/keyboard.js"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/services/local-storage",["exports","@ember/service","@ember/application","consul-ui/config/environment"],(function(e,t,n,l){Object.defineProperty(e,"__esModule",{value:!0}),e.storageFor=function(e){return function(){return{get(){return(0,n.getOwner)(this).lookup("service:localStorage").getBucket(e)}}}},e.default=void 0 +class r{constructor(){this.data=new Map}getItem(e){return this.data.get(e)}setItem(e,t){return this.data.set(e,t.toString())}seed(e){const t=new Map +Object.keys(e).forEach((n=>{t.set(n,e[n].toString())})),this.data=t}}class i extends t.default{constructor(){super(...arguments),this.storage="test"===l.default.environment?new r:window.localStorage,this.buckets=new Map}getBucket(e){const t=this.buckets.get(e) +return t||this._setupBucket(e)}_setupBucket(e){const t=new(0,(0,n.getOwner)(this).factoryFor(`storage:${e}`).class)(e,this.storage) +return this.buckets.set(e,t),t}}e.default=i})),define("consul-ui/services/logger",["exports","@ember/service","@ember/debug"],(function(e,t,n){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +class l extends t.default{execute(e){(0,n.runInDebug)((()=>{(e=void 0!==e.error?e.error:e)instanceof Error?console.error(e):console.log(e)}))}}e.default=l})),define("consul-ui/services/page-title-list",["exports","ember-page-title/services/page-title-list"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/services/page-title",["exports","ember-page-title/services/page-title"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/services/popup",["exports","torii/services/popup"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/services/repository",["exports","@ember/service","@ember/debug","@ember/utils","@ember/object","validated-changeset","consul-ui/utils/http/error","consul-ui/abilities/base"],(function(e,t,n,l,r,i,o,a){var u,s,c,d,p,f,m +function h(e,t,n,l){n&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(l):void 0})}function b(e,t,n,l,r){var i={} +return Object.keys(l).forEach((function(e){i[e]=l[e]})),i.enumerable=!!i.enumerable,i.configurable=!!i.configurable,("value"in i||i.initializer)&&(i.writable=!0),i=n.slice().reverse().reduce((function(n,l){return l(e,t,n)||n}),i),r&&void 0!==i.initializer&&(i.value=i.initializer?i.initializer.call(r):void 0,i.initializer=void 0),void 0===i.initializer&&(Object.defineProperty(e,t,i),i=null),i}Object.defineProperty(e,"__esModule",{value:!0}),e.default=e.softDelete=void 0 +e.softDelete=(e,t)=>e.store.adapterFor(e.getModelName()).rpc(((e,t,n,l)=>e.requestForDeleteRecord(t,n,l)),((e,n,l,r)=>t),t,e.getModelName()) +let y=(u=(0,t.inject)("store"),s=(0,t.inject)("env"),c=(0,t.inject)("repository/permission"),d=class extends t.default{constructor(){super(...arguments),h(this,"store",p,this),h(this,"env",f,this),h(this,"permissions",m,this)}getModelName(){}getPrimaryKey(){}getSlugKey(){}async authorizeBySlug(e,t,n){return n.resources=await this.permissions.findBySlug(n,this.getModelName()),this.validatePermissions(e,t,n)}async authorizeByPermissions(e,t,n){return n.resources=await this.permissions.authorize(n),this.validatePermissions(e,t,n)}async validatePermissions(e,t,n){if(n.resources.length>0){const e=n.resources.find((e=>e.Access===t)) +if(e&&!1===e.Allow){const e=new o.default(403) +throw e.errors=[{status:"403"}],e}}const l=await e(n.resources) +return(0,r.get)(l,"Resources")&&(0,r.set)(l,"Resources",n.resources),l}shouldReconcile(e,t){if((0,r.get)(e,"Datacenter")!==t.dc)return!1 +if(this.env.var("CONSUL_NSPACES_ENABLED")){const n=(0,r.get)(e,"Namespace") +if(void 0!==n&&n!==t.ns)return!1}if(this.env.var("CONSUL_PARTITIONS_ENABLED")){const n=(0,r.get)(e,"Partition") +if(void 0!==n&&n!==t.partition)return!1}return!0}reconcile(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{} +void 0!==e.date&&this.store.peekAll(this.getModelName()).forEach((n=>{const l=(0,r.get)(n,"SyncTime") +!n.isDeleted&&void 0!==l&&l!=e.date&&this.shouldReconcile(n,t)&&this.store.unloadRecord(n)}))}peekOne(e){return this.store.peekRecord(this.getModelName(),e)}peekAll(){return this.store.peekAll(this.getModelName())}cached(e){const t=Object.entries(e) +return this.store.peekAll(this.getModelName()).filter((e=>t.every((t=>{let[n,l]=t +return e[n]===l}))))}async findAllByDatacenter(e){return this.findAll(...arguments)}async findAll(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{} +return void 0!==t.cursor&&(e.index=t.cursor,e.uri=t.uri),this.query(e)}async query(){let e,t,n,l=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{} +try{n=await this.store.query(this.getModelName(),l),t=n.meta}catch(o){switch((0,r.get)(o,"errors.firstObject.status")){case"404":case"403":t={date:Number.POSITIVE_INFINITY},e=o +break +default:throw o}}if(void 0!==t&&this.reconcile(t,l,i),void 0!==e)throw e +return n}async findBySlug(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{} +return""===e.id?this.create({Datacenter:e.dc,Namespace:e.ns,Partition:e.partition}):(void 0!==t.cursor&&(e.index=t.cursor,e.uri=t.uri),this.authorizeBySlug((()=>this.store.queryRecord(this.getModelName(),e)),a.ACCESS_READ,e))}create(e){return this.store.createRecord(this.getModelName(),e)}persist(e){return(0,i.isChangeset)(e)&&(e.execute(),e=e.data),(0,r.set)(e,"SyncTime",void 0),e.save()}remove(e){let t=e +return void 0===e.destroyRecord&&(t=e.get("data")),"object"===(0,l.typeOf)(t)&&(t=this.store.peekRecord(this.getModelName(),t[this.getPrimaryKey()])),t.destroyRecord().then((e=>this.store.unloadRecord(e)))}invalidate(){this.store.unloadAll(this.getModelName())}},p=b(d.prototype,"store",[u],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),f=b(d.prototype,"env",[s],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),m=b(d.prototype,"permissions",[c],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),d) +e.default=y})),define("consul-ui/services/repository/auth-method",["exports","consul-ui/services/repository","consul-ui/models/auth-method","consul-ui/decorators/data-source"],(function(e,t,n,l){var r,i,o +function a(e,t,n,l,r){var i={} +return Object.keys(l).forEach((function(e){i[e]=l[e]})),i.enumerable=!!i.enumerable,i.configurable=!!i.configurable,("value"in i||i.initializer)&&(i.writable=!0),i=n.slice().reverse().reduce((function(n,l){return l(e,t,n)||n}),i),r&&void 0!==i.initializer&&(i.value=i.initializer?i.initializer.call(r):void 0,i.initializer=void 0),void 0===i.initializer&&(Object.defineProperty(e,t,i),i=null),i}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +let u=(r=(0,l.default)("/:partition/:ns/:dc/auth-methods"),i=(0,l.default)("/:partition/:ns/:dc/auth-method/:id"),o=class extends t.default{getModelName(){return"auth-method"}getPrimaryKey(){return n.PRIMARY_KEY}getSlugKey(){return n.SLUG_KEY}async findAllByDatacenter(){return super.findAllByDatacenter(...arguments)}async findBySlug(){return super.findBySlug(...arguments)}},a(o.prototype,"findAllByDatacenter",[r],Object.getOwnPropertyDescriptor(o.prototype,"findAllByDatacenter"),o.prototype),a(o.prototype,"findBySlug",[i],Object.getOwnPropertyDescriptor(o.prototype,"findBySlug"),o.prototype),o) +e.default=u})),define("consul-ui/services/repository/binding-rule",["exports","consul-ui/services/repository","consul-ui/models/binding-rule","consul-ui/decorators/data-source"],(function(e,t,n,l){var r,i +Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +let o=(r=(0,l.default)("/:partition/:ns/:dc/binding-rules/for-auth-method/:authmethod"),i=class extends t.default{getModelName(){return"binding-rule"}getPrimaryKey(){return n.PRIMARY_KEY}getSlugKey(){return n.SLUG_KEY}async findAllByAuthMethod(){return super.findAll(...arguments)}},a=i.prototype,u="findAllByAuthMethod",s=[r],c=Object.getOwnPropertyDescriptor(i.prototype,"findAllByAuthMethod"),d=i.prototype,p={},Object.keys(c).forEach((function(e){p[e]=c[e]})),p.enumerable=!!p.enumerable,p.configurable=!!p.configurable,("value"in p||p.initializer)&&(p.writable=!0),p=s.slice().reverse().reduce((function(e,t){return t(a,u,e)||e}),p),d&&void 0!==p.initializer&&(p.value=p.initializer?p.initializer.call(d):void 0,p.initializer=void 0),void 0===p.initializer&&(Object.defineProperty(a,u,p),p=null),i) +var a,u,s,c,d,p +e.default=o})),define("consul-ui/services/repository/coordinate",["exports","consul-ui/services/repository","consul-ui/decorators/data-source","consul-ui/utils/tomography","consul-ui/utils/distance"],(function(e,t,n,l,r){var i,o,a +function u(e,t,n,l,r){var i={} +return Object.keys(l).forEach((function(e){i[e]=l[e]})),i.enumerable=!!i.enumerable,i.configurable=!!i.configurable,("value"in i||i.initializer)&&(i.writable=!0),i=n.slice().reverse().reduce((function(n,l){return l(e,t,n)||n}),i),r&&void 0!==i.initializer&&(i.value=i.initializer?i.initializer.call(r):void 0,i.initializer=void 0),void 0===i.initializer&&(Object.defineProperty(e,t,i),i=null),i}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const s=(0,l.default)(r.default) +let c=(i=(0,n.default)("/:partition/:ns/:dc/coordinates"),o=(0,n.default)("/:partition/:ns/:dc/coordinates/for-node/:id"),a=class extends t.default{getModelName(){return"coordinate"}async findAllByDatacenter(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{} +return void 0!==t.cursor&&(e.index=t.cursor,e.uri=t.uri),this.store.query(this.getModelName(),e)}async findAllByNode(e,t){const n=await this.findAllByDatacenter(e,t) +let l={} +return n.length>1&&(l=s(e.id,n)),l.meta=n.meta,l}},u(a.prototype,"findAllByDatacenter",[i],Object.getOwnPropertyDescriptor(a.prototype,"findAllByDatacenter"),a.prototype),u(a.prototype,"findAllByNode",[o],Object.getOwnPropertyDescriptor(a.prototype,"findAllByNode"),a.prototype),a) +e.default=c})),define("consul-ui/services/repository/dc",["exports","@ember/error","@ember/service","consul-ui/services/repository","consul-ui/decorators/data-source","consul-ui/utils/http/consul"],(function(e,t,n,l,r,i){var o,a,u,s,c,d,p +function f(e,t,n,l,r){var i={} +return Object.keys(l).forEach((function(e){i[e]=l[e]})),i.enumerable=!!i.enumerable,i.configurable=!!i.configurable,("value"in i||i.initializer)&&(i.writable=!0),i=n.slice().reverse().reduce((function(n,l){return l(e,t,n)||n}),i),r&&void 0!==i.initializer&&(i.value=i.initializer?i.initializer.call(r):void 0,i.initializer=void 0),void 0===i.initializer&&(Object.defineProperty(e,t,i),i=null),i}function m(e,t){var n=Object.keys(e) +if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e) +t&&(l=l.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,l)}return n}function h(e){for(var t=1;t{const l=Object.entries(e).find((e=>{let[t,n]=e +return t.toLowerCase()===i.HEADERS_DEFAULT_ACL_POLICY.toLowerCase()}))[1]||"allow" +return{meta:{version:2,uri:a},body:t.map((e=>n({Name:e,Datacenter:"",Local:e===u,Primary:e===s,DefaultACLPolicy:l},(t=>t`${y}:///${""}/${""}/${e}/datacenter`))))}}))}async fetch(e,t,n){let{partition:l,ns:r,dc:i}=e,{uri:o}=t +return(await(n` + GET /v1/operator/autopilot/state?${{dc:i}} + X-Request-ID: ${o} + `))(((e,t,n)=>{const l=Object.values(t.Servers),r=[] +return{meta:{version:2,uri:o},body:n(h(h({},t),{},{Servers:l,RedundancyZones:Object.entries(t.RedundancyZones||{}).map((e=>{let[n,l]=e +return h(h({},l),{},{Name:n,Healthy:!0,Servers:l.Servers.reduce(((e,n)=>{const l=t.Servers[n] +return r.push(l.ID),e.push(l),e}),[])})})),ReadReplicas:(t.ReadReplicas||[]).map((e=>(r.push(e),t.Servers[e]))),Default:{Servers:l.filter((e=>!r.includes(e.ID)))}}),(e=>e`${y}:///${""}/${""}/${i}/datacenter`))}}))}async fetchCatalogHealth(e,t,n){let{partition:l,ns:r,dc:i}=e,{uri:o}=t +return(await(n` + GET /v1/internal/ui/catalog-overview?${{dc:i,stale:null}} + X-Request-ID: ${o} + `))(((e,t,n)=>{const l=["Nodes","Services","Checks"].reduce(((e,n)=>((e,t,n)=>t[n].reduce(((e,t)=>(["Partition","Namespace"].forEach((l=>{let r=e[l][t[l]] +void 0===r&&(r=e[l][t[l]]={Name:t[l]}),void 0===r[n]&&(r[n]=h({},g)),r[n].Total+=t.Total,r[n].Passing+=t.Passing,r[n].Warning+=t.Warning,r[n].Critical+=t.Critical})),e.Datacenter[n].Total+=t.Total,e.Datacenter[n].Passing+=t.Passing,e.Datacenter[n].Warning+=t.Warning,e.Datacenter[n].Critical+=t.Critical,e)),e))(e,t,n)),{Datacenter:{Name:i,Nodes:h({},g),Services:h({},g),Checks:h({},g)},Partition:{},Namespace:{}}) +return{meta:{version:2,uri:o,interval:3e4},body:h({Datacenter:l.Datacenter,Partitions:Object.values(l.Partition),Namespaces:Object.values(l.Namespace)},t)}}))}async find(e){const n=this.store.peekAll("dc").findBy("Name",e.name) +if(void 0===n){const e=new t.default("Page not found") +throw e.status="404",{errors:[e]}}return n}},p=f(d.prototype,"env",[o],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),f(d.prototype,"fetchAll",[a],Object.getOwnPropertyDescriptor(d.prototype,"fetchAll"),d.prototype),f(d.prototype,"fetch",[u],Object.getOwnPropertyDescriptor(d.prototype,"fetch"),d.prototype),f(d.prototype,"fetchCatalogHealth",[s],Object.getOwnPropertyDescriptor(d.prototype,"fetchCatalogHealth"),d.prototype),f(d.prototype,"find",[c],Object.getOwnPropertyDescriptor(d.prototype,"find"),d.prototype),d) +e.default=v})),define("consul-ui/services/repository/discovery-chain",["exports","@ember/service","@ember/object","consul-ui/services/repository","consul-ui/decorators/data-source"],(function(e,t,n,l,r){var i,o,a,u +function s(e,t,n,l,r){var i={} +return Object.keys(l).forEach((function(e){i[e]=l[e]})),i.enumerable=!!i.enumerable,i.configurable=!!i.configurable,("value"in i||i.initializer)&&(i.writable=!0),i=n.slice().reverse().reduce((function(n,l){return l(e,t,n)||n}),i),r&&void 0!==i.initializer&&(i.value=i.initializer?i.initializer.call(r):void 0,i.initializer=void 0),void 0===i.initializer&&(Object.defineProperty(e,t,i),i=null),i}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +let c=(i=(0,t.inject)("repository/dc"),o=(0,r.default)("/:partition/:ns/:dc/discovery-chain/:id"),a=class extends l.default{constructor(){var e,t,n,l +super(...arguments),e=this,t="dcs",l=this,(n=u)&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(l):void 0})}getModelName(){return"discovery-chain"}findBySlug(e){const t=this.dcs.peekAll().findBy("Name",e.dc) +return void 0===t||(0,n.get)(t,"MeshEnabled")?super.findBySlug(...arguments).catch((e=>{const l=(0,n.get)(e,"errors.firstObject.status"),r=((0,n.get)(e,"errors.firstObject.detail")||"").trim() +if("500"!==l)throw e +void 0!==t&&r.endsWith("Connect must be enabled in order to use this endpoint")&&(0,n.set)(t,"MeshEnabled",!1)})):Promise.resolve()}},u=s(a.prototype,"dcs",[i],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),s(a.prototype,"findBySlug",[o],Object.getOwnPropertyDescriptor(a.prototype,"findBySlug"),a.prototype),a) +e.default=c})),define("consul-ui/services/repository/intention-permission-http-header",["exports","consul-ui/services/repository"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +class n extends t.default{getModelName(){return"intention-permission-http-header"}create(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{} +return this.store.createFragment(this.getModelName(),e)}persist(e){return e.execute()}}e.default=n})),define("consul-ui/services/repository/intention-permission",["exports","consul-ui/services/repository"],(function(e,t){function n(e,t){var n=Object.keys(e) +if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e) +t&&(l=l.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,l)}return n}function l(e){for(var t=1;t0&&void 0!==arguments[0]?arguments[0]:{} +return this.store.createFragment(this.getModelName(),l(l({},e),{},{HTTP:this.store.createFragment("intention-permission-http",e.HTTP||{})}))}persist(e){return e.execute()}}e.default=i})),define("consul-ui/services/repository/intention",["exports","@ember/object","@ember/service","consul-ui/services/repository","consul-ui/models/intention","consul-ui/decorators/data-source"],(function(e,t,n,l,r,i){var o,a,u,s,c,d +function p(e,t){var n=Object.keys(e) +if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e) +t&&(l=l.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,l)}return n}function f(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function m(e,t,n,l,r){var i={} +return Object.keys(l).forEach((function(e){i[e]=l[e]})),i.enumerable=!!i.enumerable,i.configurable=!!i.configurable,("value"in i||i.initializer)&&(i.writable=!0),i=n.slice().reverse().reduce((function(n,l){return l(e,t,n)||n}),i),r&&void 0!==i.initializer&&(i.value=i.initializer?i.initializer.call(r):void 0,i.initializer=void 0),void 0===i.initializer&&(Object.defineProperty(e,t,i),i=null),i}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +let h=(o=(0,n.inject)("env"),a=(0,i.default)("/:partition/:ns/:dc/intentions"),u=(0,i.default)("/:partition/:ns/:dc/intention/:id"),s=(0,i.default)("/:partition/:ns/:dc/intentions/for-service/:id"),c=class extends l.default{constructor(){var e,t,n,l +super(...arguments),e=this,t="env",l=this,(n=d)&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(l):void 0}),f(this,"managedByCRDs",!1)}getModelName(){return"intention"}getPrimaryKey(){return r.PRIMARY_KEY}create(e){return delete e.Namespace,super.create(function(e){for(var t=1;te.IsManagedByCRD))),this.managedByCRDs}async authorizeBySlug(e,t,n){const[,l,,r]=n.id.split(":"),i=this.permissions.abilityFor(this.getModelName()) +return n.resources=i.generateForSegment(l).concat(i.generateForSegment(r)),this.authorizeByPermissions(e,t,n)}async persist(e){const n=await super.persist(...arguments) +return(0,t.get)(n,"Action.length")&&(0,t.set)(n,"Permissions",[]),n}async findAll(){return super.findAll(...arguments)}async findBySlug(e){let t +if(""===e.id){const n=this.env.var("CONSUL_NSPACES_ENABLED")?"*":"default",l="default" +t=await this.create({SourceNS:e.nspace||n,DestinationNS:e.nspace||n,SourcePartition:e.partition||l,DestinationPartition:e.partition||l,Datacenter:e.dc,Partition:e.partition})}else t=super.findBySlug(...arguments) +return t}async findByService(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{} +const n={dc:e.dc,nspace:e.nspace,filter:`SourceName == "${e.id}" or DestinationName == "${e.id}" or SourceName == "*" or DestinationName == "*"`} +return void 0!==t.cursor&&(n.index=t.cursor,n.uri=t.uri),this.store.query(this.getModelName(),n)}},d=m(c.prototype,"env",[o],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),m(c.prototype,"findAll",[a],Object.getOwnPropertyDescriptor(c.prototype,"findAll"),c.prototype),m(c.prototype,"findBySlug",[u],Object.getOwnPropertyDescriptor(c.prototype,"findBySlug"),c.prototype),m(c.prototype,"findByService",[s],Object.getOwnPropertyDescriptor(c.prototype,"findByService"),c.prototype),c) +e.default=h})),define("consul-ui/services/repository/kv",["exports","consul-ui/services/repository","consul-ui/utils/isFolder","@ember/object","consul-ui/models/kv","consul-ui/decorators/data-source"],(function(e,t,n,l,r,i){var o,a,u +function s(e,t,n,l,r){var i={} +return Object.keys(l).forEach((function(e){i[e]=l[e]})),i.enumerable=!!i.enumerable,i.configurable=!!i.configurable,("value"in i||i.initializer)&&(i.writable=!0),i=n.slice().reverse().reduce((function(n,l){return l(e,t,n)||n}),i),r&&void 0!==i.initializer&&(i.value=i.initializer?i.initializer.call(r):void 0,i.initializer=void 0),void 0===i.initializer&&(Object.defineProperty(e,t,i),i=null),i}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +let c=(o=(0,i.default)("/:partition/:ns/:dc/kv/:id"),a=(0,i.default)("/:partition/:ns/:dc/kvs/:id"),u=class extends t.default{getModelName(){return"kv"}getPrimaryKey(){return r.PRIMARY_KEY}shouldReconcile(e,t){return super.shouldReconcile(...arguments)&&e.Key.startsWith(t.id)}async findBySlug(e){let t +if((0,n.default)(e.id)){const n=JSON.stringify([e.partition,e.ns,e.dc,e.id]) +t=this.store.peekRecord(this.getModelName(),n),t||(t=await this.create({Key:e.id,Datacenter:e.dc,Namespace:e.ns,Partition:e.partition}))}else t=""===e.id?await this.create({Datacenter:e.dc,Namespace:e.ns,Partition:e.partition}):await super.findBySlug(...arguments) +return t}async findAllBySlug(e){e.separator="/","/"===e.id&&(e.id="") +let t=await this.findAll(...arguments) +const n=t.meta +return t=t.filter((t=>e.id!==(0,l.get)(t,"Key"))),t.meta=n,t}},s(u.prototype,"findBySlug",[o],Object.getOwnPropertyDescriptor(u.prototype,"findBySlug"),u.prototype),s(u.prototype,"findAllBySlug",[a],Object.getOwnPropertyDescriptor(u.prototype,"findAllBySlug"),u.prototype),u) +e.default=c})),define("consul-ui/services/repository/license",["exports","consul-ui/services/repository","consul-ui/decorators/data-source"],(function(e,t,n){var l,r +function i(e,t){var n=Object.keys(e) +if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e) +t&&(l=l.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,l)}return n}function o(e){for(var t=1;t({meta:{version:2,uri:o,interval:3e4},body:n(u(t,{dc:i}),(e=>e`${"license"}:///${l}/${r}/${i}/license/${t.License.license_id}`))})))}},c=r.prototype,d="find",p=[l],f=Object.getOwnPropertyDescriptor(r.prototype,"find"),m=r.prototype,h={},Object.keys(f).forEach((function(e){h[e]=f[e]})),h.enumerable=!!h.enumerable,h.configurable=!!h.configurable,("value"in h||h.initializer)&&(h.writable=!0),h=p.slice().reverse().reduce((function(e,t){return t(c,d,e)||e}),h),m&&void 0!==h.initializer&&(h.value=h.initializer?h.initializer.call(m):void 0,h.initializer=void 0),void 0===h.initializer&&(Object.defineProperty(c,d,h),h=null),r) +var c,d,p,f,m,h +e.default=s})),define("consul-ui/services/repository/metrics",["exports","@ember/service","consul-ui/services/repository","consul-ui/decorators/data-source"],(function(e,t,n,l){var r,i,o,a,u,s,c,d,p,f +function m(e,t,n,l){n&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(l):void 0})}function h(e,t,n,l,r){var i={} +return Object.keys(l).forEach((function(e){i[e]=l[e]})),i.enumerable=!!i.enumerable,i.configurable=!!i.configurable,("value"in i||i.initializer)&&(i.writable=!0),i=n.slice().reverse().reduce((function(n,l){return l(e,t,n)||n}),i),r&&void 0!==i.initializer&&(i.value=i.initializer?i.initializer.call(r):void 0,i.initializer=void 0),void 0===i.initializer&&(Object.defineProperty(e,t,i),i=null),i}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +let b=(r=(0,t.inject)("ui-config"),i=(0,t.inject)("env"),o=(0,t.inject)("client/http"),a=(0,l.default)("/:partition/:ns/:dc/metrics/summary-for-service/:slug/:protocol"),u=(0,l.default)("/:partition/:ns/:dc/metrics/upstream-summary-for-service/:slug/:protocol"),s=(0,l.default)("/:partition/:ns/:dc/metrics/downstream-summary-for-service/:slug/:protocol"),c=class extends n.default{constructor(){var e,t,n +super(...arguments),m(this,"config",d,this),m(this,"env",p,this),m(this,"client",f,this),n=null,(t="error")in(e=this)?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n}getModelName(){return"metrics"}init(){super.init(...arguments) +const e=this.config.getSync(),t=e.metrics_provider_options||{} +t.metrics_proxy_enabled=e.metrics_proxy_enabled +const n=e.metrics_provider||"prometheus" +t.fetch=(e,t)=>this.client.fetchWithToken(`/v1/internal/ui/metrics-proxy${e}`,t) +try{this.provider=window.consul.getMetricsProvider(n,t)}catch(l){this.error=new Error(`metrics provider not initialized: ${l}`),console.error(this.error)}}findServiceSummary(e){if(this.error)return Promise.reject(this.error) +const t=[this.provider.serviceRecentSummarySeries(e.slug,e.dc,e.ns,e.protocol,{}),this.provider.serviceRecentSummaryStats(e.slug,e.dc,e.ns,e.protocol,{})] +return Promise.all(t).then((e=>({meta:{interval:this.env.var("CONSUL_METRICS_POLL_INTERVAL")||1e4},series:e[0],stats:e[1].stats})))}findUpstreamSummary(e){return this.error?Promise.reject(this.error):this.provider.upstreamRecentSummaryStats(e.slug,e.dc,e.ns,{}).then((e=>(e.meta={interval:this.env.var("CONSUL_METRICS_POLL_INTERVAL")||1e4},e)))}findDownstreamSummary(e){return this.error?Promise.reject(this.error):this.provider.downstreamRecentSummaryStats(e.slug,e.dc,e.ns,{}).then((e=>(e.meta={interval:this.env.var("CONSUL_METRICS_POLL_INTERVAL")||1e4},e)))}},d=h(c.prototype,"config",[r],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),p=h(c.prototype,"env",[i],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),f=h(c.prototype,"client",[o],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),h(c.prototype,"findServiceSummary",[a],Object.getOwnPropertyDescriptor(c.prototype,"findServiceSummary"),c.prototype),h(c.prototype,"findUpstreamSummary",[u],Object.getOwnPropertyDescriptor(c.prototype,"findUpstreamSummary"),c.prototype),h(c.prototype,"findDownstreamSummary",[s],Object.getOwnPropertyDescriptor(c.prototype,"findDownstreamSummary"),c.prototype),c) +e.default=b})),define("consul-ui/services/repository/node",["exports","consul-ui/services/repository","consul-ui/decorators/data-source"],(function(e,t,n){var l,r,i,o +function a(e,t,n,l,r){var i={} +return Object.keys(l).forEach((function(e){i[e]=l[e]})),i.enumerable=!!i.enumerable,i.configurable=!!i.configurable,("value"in i||i.initializer)&&(i.writable=!0),i=n.slice().reverse().reduce((function(n,l){return l(e,t,n)||n}),i),r&&void 0!==i.initializer&&(i.value=i.initializer?i.initializer.call(r):void 0,i.initializer=void 0),void 0===i.initializer&&(Object.defineProperty(e,t,i),i=null),i}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +let u=(l=(0,n.default)("/:partition/:ns/:dc/nodes"),r=(0,n.default)("/:partition/:ns/:dc/node/:id/:peer"),i=(0,n.default)("/:partition/:ns/:dc/leader"),o=class extends t.default{getModelName(){return"node"}async findAllByDatacenter(){return super.findAllByDatacenter(...arguments)}async findBySlug(){return super.findBySlug(...arguments)}findLeader(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{} +return void 0!==t.refresh&&(e.uri=t.uri),this.store.queryLeader(this.getModelName(),e)}},a(o.prototype,"findAllByDatacenter",[l],Object.getOwnPropertyDescriptor(o.prototype,"findAllByDatacenter"),o.prototype),a(o.prototype,"findBySlug",[r],Object.getOwnPropertyDescriptor(o.prototype,"findBySlug"),o.prototype),a(o.prototype,"findLeader",[i],Object.getOwnPropertyDescriptor(o.prototype,"findLeader"),o.prototype),o) +e.default=u})),define("consul-ui/services/repository/nspace",["exports","@ember/service","@ember/debug","consul-ui/services/repository","consul-ui/models/nspace","consul-ui/decorators/data-source","consul-ui/utils/form/builder"],(function(e,t,n,l,r,i,o){var a,u,s,c,d,p,f,m,h,b,y,g,v,O,P +function x(e,t,n,l){n&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(l):void 0})}function w(e,t,n,l,r){var i={} +return Object.keys(l).forEach((function(e){i[e]=l[e]})),i.enumerable=!!i.enumerable,i.configurable=!!i.configurable,("value"in i||i.initializer)&&(i.writable=!0),i=n.slice().reverse().reduce((function(n,l){return l(e,t,n)||n}),i),r&&void 0!==i.initializer&&(i.value=i.initializer?i.initializer.call(r):void 0,i.initializer=void 0),void 0===i.initializer&&(Object.defineProperty(e,t,i),i=null),i}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +let j=(a=(0,t.inject)("router"),u=(0,t.inject)("container"),s=(0,t.inject)("env"),c=(0,t.inject)("form"),d=(0,t.inject)("settings"),p=(0,t.inject)("repository/permission"),f=(0,i.default)("/:partition/:ns/:dc/namespaces"),m=(0,i.default)("/:partition/:ns/:dc/namespace/:id"),h=class extends l.default{constructor(){super(...arguments),x(this,"router",b,this),x(this,"container",y,this),x(this,"env",g,this),x(this,"form",v,this),x(this,"settings",O,this),x(this,"permissions",P,this)}getPrimaryKey(){return r.PRIMARY_KEY}getSlugKey(){return r.SLUG_KEY}getModelName(){return"nspace"}async findAll(){return this.permissions.can("use nspaces")?super.findAll(...arguments).catch((()=>[])):[]}async findBySlug(e){let t +return t=""===e.id?await this.create({Datacenter:e.dc,Partition:e.partition,ACLs:{PolicyDefaults:[],RoleDefaults:[]}}):await super.findBySlug(...arguments),(0,o.defaultChangeset)(t)}remove(e){return(0,l.softDelete)(this,e)}authorize(e,t){return this.env.var("CONSUL_ACLS_ENABLED")?this.store.authorize(this.getModelName(),{dc:e,ns:t}).catch((function(e){return[]})):Promise.resolve([{Resource:"operator",Access:"write",Allow:!0}])}async getActive(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"" +if(this.permissions.can("use nspaces"))return{Name:"default"} +const t=this.store.peekAll("nspace").toArray() +if(0===e.length){e=(await this.settings.findBySlug("token")).Namespace||"default"}return 1===t.length?t[0]:function(e,t){let l=e.find((function(e){return e.Name===t.Name})) +return void 0===l&&((0,n.runInDebug)((n=>console.info(`${t.Name} not found in [${e.map((e=>e.Name)).join(", ")}]`))),l=e.find((function(e){return"default"===e.Name})),void 0===l&&(l=e[0])),l}(t,{Name:e})}},b=w(h.prototype,"router",[a],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),y=w(h.prototype,"container",[u],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),g=w(h.prototype,"env",[s],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),v=w(h.prototype,"form",[c],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),O=w(h.prototype,"settings",[d],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),P=w(h.prototype,"permissions",[p],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),w(h.prototype,"findAll",[f],Object.getOwnPropertyDescriptor(h.prototype,"findAll"),h.prototype),w(h.prototype,"findBySlug",[m],Object.getOwnPropertyDescriptor(h.prototype,"findBySlug"),h.prototype),h) +e.default=j})) +define("consul-ui/services/repository/oidc-provider",["exports","@ember/service","consul-ui/services/repository","@ember/application","@ember/object","consul-ui/decorators/data-source"],(function(e,t,n,l,r,i){var o,a,u,s,c,d,p,f +function m(e,t,n,l){n&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(l):void 0})}function h(e,t,n,l,r){var i={} +return Object.keys(l).forEach((function(e){i[e]=l[e]})),i.enumerable=!!i.enumerable,i.configurable=!!i.configurable,("value"in i||i.initializer)&&(i.writable=!0),i=n.slice().reverse().reduce((function(n,l){return l(e,t,n)||n}),i),r&&void 0!==i.initializer&&(i.value=i.initializer?i.initializer.call(r):void 0,i.initializer=void 0),void 0===i.initializer&&(Object.defineProperty(e,t,i),i=null),i}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const b="oidc-with-url" +let y=(o=(0,t.inject)("torii"),a=(0,t.inject)("settings"),u=(0,i.default)("/:partition/:ns/:dc/oidc/providers"),s=(0,i.default)("/:partition/:ns/:dc/oidc/provider/:id"),c=(0,i.default)("/:partition/:ns/:dc/oidc/authorize/:id/:code/:state"),d=class extends n.default{constructor(){super(...arguments),m(this,"manager",p,this),m(this,"settings",f,this)}init(){super.init(...arguments),this.provider=(0,l.getOwner)(this).lookup("torii-provider:oidc-with-url")}getModelName(){return"oidc-provider"}async findAllByDatacenter(){const e=await super.findAllByDatacenter(...arguments) +if(0===e.length){const e=new Error("Not found") +return e.statusCode=404,void this.store.adapterFor(this.getModelName()).error(e)}return e}async findBySlug(e){const t=await this.settings.findBySlug("token")||{} +return super.findBySlug({ns:e.ns||t.Namespace||"default",partition:e.partition||t.Partition||"default",dc:e.dc,id:e.id})}authorize(e){return this.store.authorize(this.getModelName(),e)}logout(e,t,n,l,r){const i={id:e} +return this.store.logout(this.getModelName(),i)}close(){this.manager.close(b)}findCodeByURL(e){return(0,r.set)(this.provider,"baseUrl",e),this.manager.open(b,{}).catch((e=>{let t +if(!0===e.message.startsWith("remote was closed"))t=new Error("Remote was closed"),t.statusCode=499 +else t=new Error(e.message),t.statusCode=500 +this.store.adapterFor(this.getModelName()).error(t)}))}},p=h(d.prototype,"manager",[o],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),f=h(d.prototype,"settings",[a],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),h(d.prototype,"findAllByDatacenter",[u],Object.getOwnPropertyDescriptor(d.prototype,"findAllByDatacenter"),d.prototype),h(d.prototype,"findBySlug",[s],Object.getOwnPropertyDescriptor(d.prototype,"findBySlug"),d.prototype),h(d.prototype,"authorize",[c],Object.getOwnPropertyDescriptor(d.prototype,"authorize"),d.prototype),d) +e.default=y})),define("consul-ui/services/repository/partition",["exports","@ember/service","@ember/debug","consul-ui/services/repository","consul-ui/models/partition","consul-ui/decorators/data-source","consul-ui/utils/form/builder"],(function(e,t,n,l,r,i,o){var a,u,s,c,d,p,f,m,h +function b(e,t,n,l){n&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(l):void 0})}function y(e,t,n,l,r){var i={} +return Object.keys(l).forEach((function(e){i[e]=l[e]})),i.enumerable=!!i.enumerable,i.configurable=!!i.configurable,("value"in i||i.initializer)&&(i.writable=!0),i=n.slice().reverse().reduce((function(n,l){return l(e,t,n)||n}),i),r&&void 0!==i.initializer&&(i.value=i.initializer?i.initializer.call(r):void 0,i.initializer=void 0),void 0===i.initializer&&(Object.defineProperty(e,t,i),i=null),i}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +let g=(a=(0,t.inject)("settings"),u=(0,t.inject)("form"),s=(0,t.inject)("repository/permission"),c=(0,i.default)("/:partition/:ns/:dc/partitions"),d=(0,i.default)("/:partition/:ns/:dc/partition/:id"),p=class extends l.default{constructor(){super(...arguments),b(this,"settings",f,this),b(this,"form",m,this),b(this,"permissions",h,this)}getModelName(){return"partition"}getPrimaryKey(){return r.PRIMARY_KEY}getSlugKey(){return r.SLUG_KEY}async findAll(){return this.permissions.can("use partitions")?super.findAll(...arguments).catch((()=>[])):[]}async findBySlug(e){let t +return t=""===e.id?await this.create({Datacenter:e.dc,Partition:""}):await super.findBySlug(...arguments),(0,o.defaultChangeset)(t)}remove(e){return(0,l.softDelete)(this,e)}async getActive(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"" +const t=this.store.peekAll("partition").toArray() +if(0===e.length){e=(await this.settings.findBySlug("token")).Partition||"default"}return 1===t.length?t[0]:function(e,t){let l=e.find((function(e){return e.Name===t.Name})) +return void 0===l&&((0,n.runInDebug)((n=>console.info(`${t.Name} not found in [${e.map((e=>e.Name)).join(", ")}]`))),l=e.find((function(e){return"default"===e.Name})),void 0===l&&(l=e[0])),l}(t,{Name:e})}},f=y(p.prototype,"settings",[a],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),m=y(p.prototype,"form",[u],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),h=y(p.prototype,"permissions",[s],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),y(p.prototype,"findAll",[c],Object.getOwnPropertyDescriptor(p.prototype,"findAll"),p.prototype),y(p.prototype,"findBySlug",[d],Object.getOwnPropertyDescriptor(p.prototype,"findBySlug"),p.prototype),p) +e.default=g})),define("consul-ui/services/repository/peer",["exports","consul-ui/services/repository","consul-ui/decorators/data-source","@ember/service"],(function(e,t,n,l){var r,i,o,a,u,s,c,d +function p(e,t,n,l,r){var i={} +return Object.keys(l).forEach((function(e){i[e]=l[e]})),i.enumerable=!!i.enumerable,i.configurable=!!i.configurable,("value"in i||i.initializer)&&(i.writable=!0),i=n.slice().reverse().reduce((function(n,l){return l(e,t,n)||n}),i),r&&void 0!==i.initializer&&(i.value=i.initializer?i.initializer.call(r):void 0,i.initializer=void 0),void 0===i.initializer&&(Object.defineProperty(e,t,i),i=null),i}function f(e,t){var n=Object.keys(e) +if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e) +t&&(l=l.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,l)}return n}function m(e){for(var t=1;t{const r=this.store.serializerFor("service") +return this.store.push(r.createJSONApiDocumentFromServicesPayload(e,t,l))}))}async fetchToken(e,t,n){let{dc:l,ns:r,partition:i,name:o,externalAddresses:a}=e +const u=(null==a?void 0:a.length)>0?a.split(","):[] +return(await(n` + POST /v1/peering/token + + ${{PeerName:o,Partition:i||void 0,ServerExternalAddresses:u}} + `))(((e,t,n)=>t))}async fetchAll(e,t,n){let{dc:l,ns:r,partition:i}=e,{uri:o}=t +return(await(n` + GET /v1/peerings + + ${{partition:i}} + `))(((e,t,n)=>({meta:{version:2,interval:1e4,uri:o},body:t.map((e=>n(b(e,l,i),(t=>t`peer:///${i}/${r}/${l}/peer/${e.Name}`))))})))}async fetchOne(e,t,n){let{partition:l,ns:r,dc:i,name:o}=e,{uri:a}=t +if(void 0===o||""===o){const e=this.create({Datacenter:i,Namespace:"",Partition:l}) +return e.meta={cacheControl:"no-store"},e}return(await(n` + GET /v1/peering/${o} + + ${{partition:l}} + `))(((e,t,n)=>{const{StreamStatus:o}=t +return o&&(o.LastHeartbeat&&(o.LastHeartbeat=new Date(o.LastHeartbeat)),o.LastReceive&&(o.LastReceive=new Date(o.LastReceive)),o.LastSend&&(o.LastSend=new Date(o.LastSend))),{meta:{version:2,interval:1e4,uri:a},body:n(b(t,i,l),(e=>e`peer:///${l}/${r}/${i}/peer/${t.Name}`))}}))}async persist(e,t){return(await(t` + POST /v1/peering/establish + + ${{PeerName:e.Name,PeeringToken:e.PeeringToken,Partition:e.Partition||void 0}} + `))(((t,n,l)=>{const r=e.Partition,i=e.Namespace,o=e.Datacenter +return{meta:{version:2},body:l(m(m({},e),{},{State:"ESTABLISHING"}),(t=>t`peer:///${r}/${i}/${o}/peer/${e.Name}`))}}))}async remove(e,t){return(await(t` + DELETE /v1/peering/${e.Name} + `))(((t,n,l)=>{const r=e.Partition,i=e.Namespace,o=e.Datacenter +return{meta:{version:2},body:l(m(m({},e),{},{State:"DELETING"}),(t=>t`peer:///${r}/${i}/${o}/peer/${e.Name}`))}}))}},d=p(c.prototype,"store",[l.inject],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),p(c.prototype,"fetchExportedServices",[r],Object.getOwnPropertyDescriptor(c.prototype,"fetchExportedServices"),c.prototype),p(c.prototype,"fetchToken",[i],Object.getOwnPropertyDescriptor(c.prototype,"fetchToken"),c.prototype),p(c.prototype,"fetchAll",[o],Object.getOwnPropertyDescriptor(c.prototype,"fetchAll"),c.prototype),p(c.prototype,"fetchOne",[a,u,s],Object.getOwnPropertyDescriptor(c.prototype,"fetchOne"),c.prototype),c) +e.default=y})),define("consul-ui/services/repository/permission",["exports","consul-ui/services/repository","@ember/service","@glimmer/tracking","@ember/debug","consul-ui/decorators/data-source"],(function(e,t,n,l,r,i){var o,a,u,s,c,d,p +function f(e,t){var n=Object.keys(e) +if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e) +t&&(l=l.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,l)}return n}function m(e){for(var t=1;tt.every((t=>n[t]===e[t]))&&!0===n.Allow))}can(e){return this._can.can(e)}abilityFor(e){return this._can.abilityFor(e)}generate(e,t,n){const l={Resource:e,Access:t} +return void 0!==n&&(l.Segment=n),l}async authorize(e){if(this.env.var("CONSUL_ACLS_ENABLED")){let n=[] +try{n=await this.store.authorize("permission",e)}catch(t){(0,r.runInDebug)((()=>console.error(t)))}return n}return e.resources.map((e=>m(m({},e),{},{Allow:!0})))}async findBySlug(e,t){let n +try{n=this._can.abilityFor(t)}catch(r){return[]}const l=n.generateForSegment(e.id.toString()) +return 0===l.length?[]:(e.resources=l,this.authorize(e))}async findByPermissions(e){return this.authorize(e)}async findAll(e){return e.resources=this.permissionsToRequest,this.permissions=await this.findByPermissions(e),this.permissions.forEach((e=>{["key","node","service","intention","session"].includes(e.Resource)&&(e.Allow=!0)})),this.permissions}get permissionsToRequest(){return this._can.can("use peers")?[...g,...v]:g}},c=y(s.prototype,"env",[o],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),d=y(s.prototype,"_can",[a],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),p=y(s.prototype,"permissions",[l.tracked],{configurable:!0,enumerable:!0,writable:!0,initializer:function(){return[]}}),y(s.prototype,"findAll",[u],Object.getOwnPropertyDescriptor(s.prototype,"findAll"),s.prototype),s) +e.default=O})),define("consul-ui/services/repository/policy",["exports","consul-ui/services/repository","@ember/object","@ember/service","consul-ui/models/policy","consul-ui/decorators/data-source"],(function(e,t,n,l,r,i){var o,a,u,s,c +function d(e,t,n,l,r){var i={} +return Object.keys(l).forEach((function(e){i[e]=l[e]})),i.enumerable=!!i.enumerable,i.configurable=!!i.configurable,("value"in i||i.initializer)&&(i.writable=!0),i=n.slice().reverse().reduce((function(n,l){return l(e,t,n)||n}),i),r&&void 0!==i.initializer&&(i.value=i.initializer?i.initializer.call(r):void 0,i.initializer=void 0),void 0===i.initializer&&(Object.defineProperty(e,t,i),i=null),i}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +let p=(o=(0,l.inject)("form"),a=(0,i.default)("/:partition/:ns/:dc/policies"),u=(0,i.default)("/:partition/:ns/:dc/policy/:id"),s=class extends t.default{constructor(){var e,t,n,l +super(...arguments),e=this,t="form",l=this,(n=c)&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(l):void 0})}getModelName(){return"policy"}getPrimaryKey(){return r.PRIMARY_KEY}getSlugKey(){return r.SLUG_KEY}async findAllByDatacenter(){return super.findAllByDatacenter(...arguments)}async findBySlug(e){let t +return t=""===e.id?await this.create({Datacenter:e.dc,Partition:e.partition,Namespace:e.ns}):await super.findBySlug(...arguments),this.form.form(this.getModelName()).setData(t).getData()}persist(e){return""===(0,n.get)(e,"template")?e.save():Promise.resolve(e)}translate(e){return this.store.translate("policy",(0,n.get)(e,"Rules"))}},c=d(s.prototype,"form",[o],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),d(s.prototype,"findAllByDatacenter",[a],Object.getOwnPropertyDescriptor(s.prototype,"findAllByDatacenter"),s.prototype),d(s.prototype,"findBySlug",[u],Object.getOwnPropertyDescriptor(s.prototype,"findBySlug"),s.prototype),s) +e.default=p})),define("consul-ui/services/repository/proxy",["exports","consul-ui/services/repository","consul-ui/models/proxy","@ember/object","consul-ui/decorators/data-source"],(function(e,t,n,l,r){var i,o,a +function u(e,t,n,l,r){var i={} +return Object.keys(l).forEach((function(e){i[e]=l[e]})),i.enumerable=!!i.enumerable,i.configurable=!!i.configurable,("value"in i||i.initializer)&&(i.writable=!0),i=n.slice().reverse().reduce((function(n,l){return l(e,t,n)||n}),i),r&&void 0!==i.initializer&&(i.value=i.initializer?i.initializer.call(r):void 0,i.initializer=void 0),void 0===i.initializer&&(Object.defineProperty(e,t,i),i=null),i}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +let s=(i=(0,r.default)("/:partition/:ns/:dc/proxies/for-service/:id"),o=(0,r.default)("/:partition/:ns/:dc/proxy-instance/:serviceId/:node/:id"),a=class extends t.default{getModelName(){return"proxy"}getPrimaryKey(){return n.PRIMARY_KEY}findAllBySlug(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{} +return void 0!==t.cursor&&(e.index=t.cursor,e.uri=t.uri),this.store.query(this.getModelName(),e).then((e=>(e.forEach((e=>{const t=JSON.parse(e.uid) +t.pop(),t.push(e.ServiceProxy.DestinationServiceID) +const n=this.store.peekRecord("service-instance",JSON.stringify(t)) +n&&(0,l.set)(n,"ProxyInstance",e)})),e)))}async findInstanceBySlug(e,t){const n=await this.findAllBySlug(e,t) +let r={} +if((0,l.get)(n,"length")>0){let t=n.filterBy("ServiceProxy.DestinationServiceID",e.serviceId).findBy("NodeName",e.node) +t?r=t:(t=n.findBy("ServiceProxy.DestinationServiceName",e.id),t&&(r=t))}return(0,l.set)(r,"meta",(0,l.get)(n,"meta")),r}},u(a.prototype,"findAllBySlug",[i],Object.getOwnPropertyDescriptor(a.prototype,"findAllBySlug"),a.prototype),u(a.prototype,"findInstanceBySlug",[o],Object.getOwnPropertyDescriptor(a.prototype,"findInstanceBySlug"),a.prototype),a) +e.default=s})),define("consul-ui/services/repository/role",["exports","consul-ui/services/repository","@ember/service","consul-ui/models/role","consul-ui/decorators/data-source"],(function(e,t,n,l,r){var i,o,a,u,s +function c(e,t,n,l,r){var i={} +return Object.keys(l).forEach((function(e){i[e]=l[e]})),i.enumerable=!!i.enumerable,i.configurable=!!i.configurable,("value"in i||i.initializer)&&(i.writable=!0),i=n.slice().reverse().reduce((function(n,l){return l(e,t,n)||n}),i),r&&void 0!==i.initializer&&(i.value=i.initializer?i.initializer.call(r):void 0,i.initializer=void 0),void 0===i.initializer&&(Object.defineProperty(e,t,i),i=null),i}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +let d=(i=(0,n.inject)("form"),o=(0,r.default)("/:partition/:ns/:dc/roles"),a=(0,r.default)("/:partition/:ns/:dc/role/:id"),u=class extends t.default{constructor(){var e,t,n,l +super(...arguments),e=this,t="form",l=this,(n=s)&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(l):void 0})}getModelName(){return"role"}getPrimaryKey(){return l.PRIMARY_KEY}getSlugKey(){return l.SLUG_KEY}async findAll(){return super.findAll(...arguments)}async findBySlug(e){let t +return t=""===e.id?await this.create({Datacenter:e.dc,Partition:e.partition,Namespace:e.ns}):await super.findBySlug(...arguments),this.form.form(this.getModelName()).setData(t).getData()}},s=c(u.prototype,"form",[i],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),c(u.prototype,"findAll",[o],Object.getOwnPropertyDescriptor(u.prototype,"findAll"),u.prototype),c(u.prototype,"findBySlug",[a],Object.getOwnPropertyDescriptor(u.prototype,"findBySlug"),u.prototype),u) +e.default=d})),define("consul-ui/services/repository/service-instance",["exports","consul-ui/services/repository","@ember/object","consul-ui/abilities/base","consul-ui/decorators/data-source"],(function(e,t,n,l,r){var i,o,a +function u(e,t,n,l,r){var i={} +return Object.keys(l).forEach((function(e){i[e]=l[e]})),i.enumerable=!!i.enumerable,i.configurable=!!i.configurable,("value"in i||i.initializer)&&(i.writable=!0),i=n.slice().reverse().reduce((function(n,l){return l(e,t,n)||n}),i),r&&void 0!==i.initializer&&(i.value=i.initializer?i.initializer.call(r):void 0,i.initializer=void 0),void 0===i.initializer&&(Object.defineProperty(e,t,i),i=null),i}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +let s=(i=(0,r.default)("/:partition/:ns/:dc/service-instances/for-service/:id/:peer"),o=(0,r.default)("/:partition/:ns/:dc/service-instance/:serviceId/:node/:id/:peer"),a=class extends t.default{getModelName(){return"service-instance"}shouldReconcile(e,t){return super.shouldReconcile(...arguments)&&e.Service.Service===t.id}async findByService(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{} +return void 0!==t.cursor&&(e.index=t.cursor,e.uri=t.uri),this.authorizeBySlug((async t=>{const l=await this.query(e) +return(0,n.set)(l,"firstObject.Service.Resources",t),l}),l.ACCESS_READ,e)}async findBySlug(e){return super.findBySlug(...arguments)}},u(a.prototype,"findByService",[i],Object.getOwnPropertyDescriptor(a.prototype,"findByService"),a.prototype),u(a.prototype,"findBySlug",[o],Object.getOwnPropertyDescriptor(a.prototype,"findBySlug"),a.prototype),a) +e.default=s})),define("consul-ui/services/repository/service",["exports","consul-ui/services/repository","consul-ui/decorators/data-source","@ember/service"],(function(e,t,n,l){var r,i,o,a,u +function s(e,t,n,l,r){var i={} +return Object.keys(l).forEach((function(e){i[e]=l[e]})),i.enumerable=!!i.enumerable,i.configurable=!!i.configurable,("value"in i||i.initializer)&&(i.writable=!0),i=n.slice().reverse().reduce((function(n,l){return l(e,t,n)||n}),i),r&&void 0!==i.initializer&&(i.value=i.initializer?i.initializer.call(r):void 0,i.initializer=void 0),void 0===i.initializer&&(Object.defineProperty(e,t,i),i=null),i}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +let c=(r=(0,n.default)("/:partition/:ns/:dc/services"),i=(0,n.default)("/:partition/:ns/:dc/services/:peer/:peerId"),o=(0,n.default)("/:partition/:ns/:dc/gateways/for-service/:gateway"),a=class extends t.default{constructor(){var e,t,n,l +super(...arguments),e=this,t="store",l=this,(n=u)&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(l):void 0})}getModelName(){return"service"}async findAllByDatacenter(){return super.findAll(...arguments)}async findAllImportedServices(e,t){const{peerId:n}=e +return delete e.peerId,super.findAll(e,t).then((e=>{const t=this.store.peekRecord("peer",n) +return e.forEach((e=>e.peer=t)),e}))}findGatewayBySlug(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{} +return void 0!==t.cursor&&(e.index=t.cursor,e.uri=t.uri),this.store.query(this.getModelName(),e)}},u=s(a.prototype,"store",[l.inject],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),s(a.prototype,"findAllByDatacenter",[r],Object.getOwnPropertyDescriptor(a.prototype,"findAllByDatacenter"),a.prototype),s(a.prototype,"findAllImportedServices",[i],Object.getOwnPropertyDescriptor(a.prototype,"findAllImportedServices"),a.prototype),s(a.prototype,"findGatewayBySlug",[o],Object.getOwnPropertyDescriptor(a.prototype,"findGatewayBySlug"),a.prototype),a) +e.default=c})),define("consul-ui/services/repository/session",["exports","@ember/service","consul-ui/services/repository","consul-ui/decorators/data-source"],(function(e,t,n,l){var r,i,o,a,u +function s(e,t,n,l,r){var i={} +return Object.keys(l).forEach((function(e){i[e]=l[e]})),i.enumerable=!!i.enumerable,i.configurable=!!i.configurable,("value"in i||i.initializer)&&(i.writable=!0),i=n.slice().reverse().reduce((function(n,l){return l(e,t,n)||n}),i),r&&void 0!==i.initializer&&(i.value=i.initializer?i.initializer.call(r):void 0,i.initializer=void 0),void 0===i.initializer&&(Object.defineProperty(e,t,i),i=null),i}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +let c=(r=(0,t.inject)("store"),i=(0,l.default)("/:partition/:ns/:dc/sessions/for-node/:id"),o=(0,l.default)("/:partition/:ns/:dc/sessions/for-key/:id"),a=class extends n.default{constructor(){var e,t,n,l +super(...arguments),e=this,t="store",l=this,(n=u)&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(l):void 0})}getModelName(){return"session"}findByNode(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{} +return void 0!==t.cursor&&(e.index=t.cursor,e.uri=t.uri),this.store.query(this.getModelName(),e)}findByKey(e){return this.findBySlug(...arguments)}},u=s(a.prototype,"store",[r],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),s(a.prototype,"findByNode",[i],Object.getOwnPropertyDescriptor(a.prototype,"findByNode"),a.prototype),s(a.prototype,"findByKey",[o],Object.getOwnPropertyDescriptor(a.prototype,"findByKey"),a.prototype),a) +e.default=c})),define("consul-ui/services/repository/token",["exports","consul-ui/services/repository","@ember/object","@ember/service","consul-ui/models/token","consul-ui/decorators/data-source"],(function(e,t,n,l,r,i){var o,a,u,s,c,d,p,f +function m(e,t,n,l,r){var i={} +return Object.keys(l).forEach((function(e){i[e]=l[e]})),i.enumerable=!!i.enumerable,i.configurable=!!i.configurable,("value"in i||i.initializer)&&(i.writable=!0),i=n.slice().reverse().reduce((function(n,l){return l(e,t,n)||n}),i),r&&void 0!==i.initializer&&(i.value=i.initializer?i.initializer.call(r):void 0,i.initializer=void 0),void 0===i.initializer&&(Object.defineProperty(e,t,i),i=null),i}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +let h=(o=(0,l.inject)("form"),a=(0,i.default)("/:partition/:ns/:dc/tokens"),u=(0,i.default)("/:partition/:ns/:dc/token/:id"),s=(0,i.default)("/:partition/:ns/:dc/token/self/:secret"),c=(0,i.default)("/:partition/:ns/:dc/tokens/for-policy/:policy"),d=(0,i.default)("/:partition/:ns/:dc/tokens/for-role/:role"),p=class extends t.default{constructor(){var e,t,n,l +super(...arguments),e=this,t="form",l=this,(n=f)&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(l):void 0})}getModelName(){return"token"}getPrimaryKey(){return r.PRIMARY_KEY}getSlugKey(){return r.SLUG_KEY}async findAll(){return super.findAll(...arguments)}async findBySlug(e){let t +return t=""===e.id?await this.create({Datacenter:e.dc,Partition:e.partition,Namespace:e.ns}):await super.findBySlug(...arguments),this.form.form(this.getModelName()).setData(t).getData()}self(e){return this.store.self(this.getModelName(),{secret:e.secret,dc:e.dc}).catch((e=>Promise.reject(e)))}clone(e){return this.store.clone(this.getModelName(),(0,n.get)(e,r.PRIMARY_KEY))}findByPolicy(e){return this.findAll(...arguments)}findByRole(){return this.findAll(...arguments)}},f=m(p.prototype,"form",[o],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),m(p.prototype,"findAll",[a],Object.getOwnPropertyDescriptor(p.prototype,"findAll"),p.prototype),m(p.prototype,"findBySlug",[u],Object.getOwnPropertyDescriptor(p.prototype,"findBySlug"),p.prototype),m(p.prototype,"self",[s],Object.getOwnPropertyDescriptor(p.prototype,"self"),p.prototype),m(p.prototype,"findByPolicy",[c],Object.getOwnPropertyDescriptor(p.prototype,"findByPolicy"),p.prototype),m(p.prototype,"findByRole",[d],Object.getOwnPropertyDescriptor(p.prototype,"findByRole"),p.prototype),p) +e.default=h})),define("consul-ui/services/repository/topology",["exports","@ember/service","consul-ui/services/repository","@ember/object","consul-ui/decorators/data-source"],(function(e,t,n,l,r){var i,o,a,u +function s(e,t,n,l,r){var i={} +return Object.keys(l).forEach((function(e){i[e]=l[e]})),i.enumerable=!!i.enumerable,i.configurable=!!i.configurable,("value"in i||i.initializer)&&(i.writable=!0),i=n.slice().reverse().reduce((function(n,l){return l(e,t,n)||n}),i),r&&void 0!==i.initializer&&(i.value=i.initializer?i.initializer.call(r):void 0,i.initializer=void 0),void 0===i.initializer&&(Object.defineProperty(e,t,i),i=null),i}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +let c=(i=(0,t.inject)("repository/dc"),o=(0,r.default)("/:partition/:ns/:dc/topology/:id/:kind"),a=class extends n.default{constructor(){var e,t,n,l +super(...arguments),e=this,t="dcs",l=this,(n=u)&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(l):void 0})}getModelName(){return"topology"}findBySlug(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{} +const n=this.dcs.peekOne(e.dc) +return null===n||(0,l.get)(n,"MeshEnabled")?(void 0!==t.cursor&&(e.index=t.cursor,e.uri=t.uri),this.store.queryRecord(this.getModelName(),e).catch((e=>{const t=(0,l.get)(e,"errors.firstObject.status"),r=((0,l.get)(e,"errors.firstObject.detail")||"").trim() +if("500"!==t)throw e +null!==n&&r.endsWith("Connect must be enabled in order to use this endpoint")&&(0,l.set)(n,"MeshEnabled",!1)}))):Promise.resolve()}},u=s(a.prototype,"dcs",[i],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),s(a.prototype,"findBySlug",[o],Object.getOwnPropertyDescriptor(a.prototype,"findBySlug"),a.prototype),a) +e.default=c})),define("consul-ui/services/resize-observer",["exports","ember-resize-observer-service/services/resize-observer"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/services/routlet",["exports","@ember/service","@ember/runloop","@ember/object","consul-ui/utils/routing/wildcard","consul-ui/router"],(function(e,t,n,l,r,i){var o,a,u,s,c,d,p,f,m +function h(e,t){var n=Object.keys(e) +if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e) +t&&(l=l.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,l)}return n}function b(e){for(var t=1;t{if("application"===e)return 1 +if("application"===t)return-1 +const n=e.split(".").length,l=t.split(".").length +switch(!0){case n>l:return-1 +case n0&&!t.every((e=>this.permissions.can(e))))}transition(){let e +return this._transition=new Promise((t=>{e=t})),e}findOutlet(e){return[...P.keys()].find((t=>-1!==e.indexOf(t)))}outletFor(e){const t=[...P.keys()],n=t.indexOf(e)+1 +return P.get(t[n])}normalizeParamsFor(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{} +return O(e)?Object.keys(t).reduce((function(e,n){return void 0!==t[n]?e[n]=decodeURIComponent(t[n]):e[n]=t[n],e}),{}):t}paramsFor(e){let t={} +const n=P.get(e) +void 0!==n&&void 0!==n.args.params&&(t=n.args.params) +let l=this.router.currentRoute +null===l&&(l=this.container.lookup("route:application")) +let r,i=l,o=this.normalizeParamsFor(e,i.params) +for(;r=i.parent;)o=b(b({},this.normalizeParamsFor(r.name,r.params)),o),i=r +return b(b(b({},this.container.get(`location:${this.env.var("locationType")}`).optionalParams()),o),t)}modelFor(e){const t=P.get(e) +if(void 0!==t)return t.model}addRoute(e,t){const l=this.outletFor(e) +void 0!==l&&(l.route=t,(0,n.schedule)("afterRender",(()=>{l.routeName=e})))}removeRoute(e,t){const l=this.outletFor(e) +t._model=void 0,void 0!==l&&(0,n.schedule)("afterRender",(()=>{l.route=void 0}))}addOutlet(e,t){P.set(e,t)}removeOutlet(e){(0,n.schedule)("afterRender",(()=>{P.delete(e)}))}},d=v(c.prototype,"container",[o],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),p=v(c.prototype,"env",[a],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),f=v(c.prototype,"router",[u],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),m=v(c.prototype,"permissions",[s],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),c) +e.default=x})),define("consul-ui/services/schema",["exports","@ember/service","consul-ui/models/intention-permission","consul-ui/models/intention-permission-http","consul-ui/models/intention-permission-http-header"],(function(e,t,n,l,r){function i(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +class o extends t.default{constructor(){super(...arguments),i(this,"intention-permission",n.schema),i(this,"intention-permission-http",l.schema),i(this,"intention-permission-http-header",r.schema)}}e.default=o})),define("consul-ui/services/search",["exports","@ember/service","consul-ui/utils/search/exact","consul-ui/search/predicates/intention","consul-ui/search/predicates/upstream-instance","consul-ui/search/predicates/service-instance","consul-ui/search/predicates/health-check","consul-ui/search/predicates/acl","consul-ui/search/predicates/service","consul-ui/search/predicates/node","consul-ui/search/predicates/kv","consul-ui/search/predicates/token","consul-ui/search/predicates/role","consul-ui/search/predicates/policy","consul-ui/search/predicates/auth-method","consul-ui/search/predicates/nspace","consul-ui/search/predicates/peer"],(function(e,t,n,l,r,i,o,a,u,s,c,d,p,f,m,h,b){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const y={intention:l.default,service:u.default,"service-instance":i.default,"upstream-instance":r.default,"health-check":o.default,"auth-method":m.default,node:s.default,kv:c.default,acl:a.default,token:d.default,role:p.default,policy:f.default,nspace:h.default,peer:b.default} +class g extends t.default{constructor(){var e,t,l +super(...arguments),e=this,t="searchables",l={exact:n.default},t in e?Object.defineProperty(e,t,{value:l,enumerable:!0,configurable:!0,writable:!0}):e[t]=l}predicate(e){return y[e]}}e.default=g})),define("consul-ui/services/settings",["exports","@ember/service","consul-ui/utils/storage/local-storage"],(function(e,t,n){Object.defineProperty(e,"__esModule",{value:!0}),e.default=e.ifNotBlocking=void 0 +const l=(0,n.default)("consul") +e.ifNotBlocking=function(e){return e.findBySlug("client").then((function(e){return void 0!==e.blocking&&!e.blocking}))} +class r extends t.default{constructor(){var e,t,n +super(...arguments),n=l,(t="storage")in(e=this)?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n}findAll(e){return Promise.resolve(this.storage.all())}findBySlug(e){return Promise.resolve(this.storage.getValue(e))}persist(e){const t=this.storage +return Object.keys(e).forEach(((n,l)=>{t.setValue(n,e[n])})),Promise.resolve(e)}delete(e){Array.isArray(e)||(e=[e]) +const t=this.storage,n=e.reduce((function(e,n,l,r){return t.removeValue(n),e}),{}) +return Promise.resolve(n)}}e.default=r})),define("consul-ui/services/sort",["exports","@ember/service","consul-ui/sort/comparators/service","consul-ui/sort/comparators/service-instance","consul-ui/sort/comparators/upstream-instance","consul-ui/sort/comparators/kv","consul-ui/sort/comparators/health-check","consul-ui/sort/comparators/intention","consul-ui/sort/comparators/token","consul-ui/sort/comparators/role","consul-ui/sort/comparators/policy","consul-ui/sort/comparators/auth-method","consul-ui/sort/comparators/nspace","consul-ui/sort/comparators/peer","consul-ui/sort/comparators/node"],(function(e,t,n,l,r,i,o,a,u,s,c,d,p,f,m){Object.defineProperty(e,"__esModule",{value:!0}),e.default=e.properties=void 0 +const h=e=>e.reduce(((e,t)=>e.concat([`${t}:asc`,`${t}:desc`])),[]),b=function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[] +return t=>{const n=h(e) +return[n.find((e=>e===t))||n[0]]}} +e.properties=b +const y={properties:b,directionify:h},g={service:(0,n.default)(y),"service-instance":(0,l.default)(y),"upstream-instance":(0,r.default)(y),"health-check":(0,o.default)(y),"auth-method":(0,d.default)(y),kv:(0,i.default)(y),intention:(0,a.default)(y),token:(0,u.default)(y),role:(0,s.default)(y),policy:(0,c.default)(y),nspace:(0,p.default)(y),peer:(0,f.default)(y),node:(0,m.default)(y)} +class v extends t.default{comparator(e){return g[e]}}e.default=v})),define("consul-ui/services/state-with-charts",["exports","consul-ui/services/state","consul-ui/machines/validate.xstate","consul-ui/machines/boolean.xstate"],(function(e,t,n,l){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +class r extends t.default{constructor(){var e,t,r +super(...arguments),e=this,t="stateCharts",r={validate:n.default,boolean:l.default},t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r}}e.default=r})),define("consul-ui/services/state",["exports","@ember/service","@ember/object","flat","@xstate/fsm"],(function(e,t,n,l,r){var i,o,a +Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +let u=(i=(0,t.inject)("logger"),o=class extends t.default{constructor(){var e,t,n,l,r,i,o +super(...arguments),n={},(t="stateCharts")in(e=this)?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,l=this,r="logger",o=this,(i=a)&&Object.defineProperty(l,r,{enumerable:i.enumerable,configurable:i.configurable,writable:i.writable,value:i.initializer?i.initializer.call(o):void 0})}log(e,t){}stateChart(e){return this.stateCharts[e]}addGuards(e,t){return this.guards(e).forEach((function(l){let[r,i]=l;(0,n.set)(e,r,(function(){return!!t.onGuard(i,...arguments)}))})),[e,t]}machine(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{} +return(0,r.createMachine)(...this.addGuards(e,t))}prepareChart(e){return void 0!==(e=JSON.parse(JSON.stringify(e))).on&&Object.values(e.states).forEach((function(t){void 0===t.on?t.on=e.on:Object.keys(e.on).forEach((function(n){void 0===t.on[n]&&(t.on[n]=e.on[n])}))})),e}matches(e,t){if(void 0===e)return!1 +return(Array.isArray(t)?t:[t]).some((t=>e.matches(t)))}state(e){return{matches:e}}interpret(e,t){e=this.prepareChart(e) +const n=(0,r.interpret)(this.machine(e,t)) +return n.subscribe((n=>{n.changed&&(this.log(e,n),t.onTransition(n))})),n}guards(e){return Object.entries((0,l.default)(e)).filter((e=>{let[t]=e +return t.endsWith(".cond")}))}},s=o.prototype,c="logger",d=[i],p={configurable:!0,enumerable:!0,writable:!0,initializer:null},m={},Object.keys(p).forEach((function(e){m[e]=p[e]})),m.enumerable=!!m.enumerable,m.configurable=!!m.configurable,("value"in m||m.initializer)&&(m.writable=!0),m=d.slice().reverse().reduce((function(e,t){return t(s,c,e)||e}),m),f&&void 0!==m.initializer&&(m.value=m.initializer?m.initializer.call(f):void 0,m.initializer=void 0),void 0===m.initializer&&(Object.defineProperty(s,c,m),m=null),a=m,o) +var s,c,d,p,f,m +e.default=u})),define("consul-ui/services/store",["exports","@ember/service","@ember-data/store"],(function(e,t,n){var l,r,i,o,a +function u(e,t,n,l){n&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(l):void 0})}function s(e,t,n,l,r){var i={} +return Object.keys(l).forEach((function(e){i[e]=l[e]})),i.enumerable=!!i.enumerable,i.configurable=!!i.configurable,("value"in i||i.initializer)&&(i.writable=!0),i=n.slice().reverse().reduce((function(n,l){return l(e,t,n)||n}),i),r&&void 0!==i.initializer&&(i.value=i.initializer?i.initializer.call(r):void 0,i.initializer=void 0),void 0===i.initializer&&(Object.defineProperty(e,t,i),i=null),i}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +let c=(l=(0,t.inject)("data-source/service"),r=(0,t.inject)("client/http"),i=class extends n.default{constructor(){super(...arguments),u(this,"dataSource",o,this),u(this,"client",a,this)}invalidate(){this.client.abort(401),this.dataSource.resetCache(),this.init()}clear(){this.invalidate(0)}clone(e,t){return this.adapterFor(e).clone(this,{modelName:e},t,this._internalModelForId(e,t).createSnapshot({}))}self(e,t){const n=this.adapterFor(e),l=this.serializerFor(e),r={modelName:e} +return n.self(this,r,t.secret,t).then((e=>l.normalizeResponse(this,r,e,t,"self")))}queryLeader(e,t){const n=this.adapterFor(e),l=this.serializerFor(e),r={modelName:e} +return n.queryLeader(this,r,null,t).then((e=>(e.meta=l.normalizeMeta(this,r,e,null,"leader"),e)))}authorize(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{} +const n=this.adapterFor(e),l=this.serializerFor(e),r={modelName:e} +return n.authorize(this,r,null,t).then((e=>l.normalizeResponse(this,r,e,void 0,"authorize")))}logout(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{} +const n={modelName:e} +return this.adapterFor(e).logout(this,n,t.id,t)}},o=s(i.prototype,"dataSource",[l],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),a=s(i.prototype,"client",[r],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),i) +e.default=c})),define("consul-ui/services/temporal",["exports","pretty-ms","parse-duration","@ember/debug","dayjs","dayjs/plugin/relativeTime","@ember/service"],(function(e,t,n,l,r,i,o){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0,r.default.extend(i.default) +class a extends o.default{format(e,t){const n=(0,r.default)(e) +return(0,r.default)().isBefore(n)?(0,r.default)().to(n,!0):(0,r.default)().from(n,!0)}within(e,t){let[n,l]=e +return(0,r.default)(n).isBefore((0,r.default)().add(l,"ms"))}parse(e,t){return(0,n.default)(e)}durationFrom(e){return!0==("number"==typeof e)?0===e?"0":(0,t.default)(e/1e6,{formatSubMilliseconds:!0}).split(" ").join(""):e}}e.default=a})),define("consul-ui/services/text-measurer",["exports","ember-text-measurer/services/text-measurer"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/services/ticker",["exports","@ember/service","consul-ui/utils/ticker"],(function(e,t,n){let l +Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +class r extends t.default{init(){super.init(...arguments),this.reset()}tweenTo(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",r=arguments.length>2?arguments[2]:void 0,i=arguments.length>3?arguments[3]:void 0 +const o=t +return l.has(o)?(t=l.get(o),t instanceof n.Tween&&(t=t.stop().getTarget()),l.set(o,n.Tween.to(t,e,r,i)),t):(l.set(o,e),e)}destroy(e){return this.reset(),n.Tween.destroy()}reset(){l=new Map}}e.default=r})),define("consul-ui/services/timeout",["exports","@ember/service","consul-ui/utils/promisedTimeout","@ember/runloop"],(function(e,t,n,l){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +const r=(0,n.default)(Promise) +class i extends t.default{execute(e,t){return r(e,t)}tick(){return new Promise((function(e,t){(0,l.next)(e)}))}}e.default=i})),define("consul-ui/services/torii-session",["exports","torii/services/torii-session"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/services/torii",["exports","torii/services/torii"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/services/ui-config",["exports","@ember/service","@ember/object","consul-ui/decorators/data-source"],(function(e,t,n,l){var r,i,o,a,u,s +function c(e,t,n,l,r){var i={} +return Object.keys(l).forEach((function(e){i[e]=l[e]})),i.enumerable=!!i.enumerable,i.configurable=!!i.configurable,("value"in i||i.initializer)&&(i.writable=!0),i=n.slice().reverse().reduce((function(n,l){return l(e,t,n)||n}),i),r&&void 0!==i.initializer&&(i.value=i.initializer?i.initializer.call(r):void 0,i.initializer=void 0),void 0===i.initializer&&(Object.defineProperty(e,t,i),i=null),i}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +let d=(r=(0,t.inject)("env"),i=(0,l.default)("/:partition/:nspace/:dc/ui-config/:path"),o=(0,l.default)("/:partition/:nspace/:dc/notfound/:path"),a=(0,l.default)("/:partition/:nspace/:dc/ui-config"),u=class extends t.default{constructor(){var e,t,n,l +super(...arguments),e=this,t="env",l=this,(n=s)&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(l):void 0})}async findByPath(e){return(0,n.get)(this.get(),e.path)}async parsePath(e){return e.path.split("/").reduce(((e,t,n)=>{switch(!0){case t.startsWith("~"):e.nspace=t.substr(1) +break +case t.startsWith("_"):e.partition=t.substr(1) +break +case void 0===e.dc:e.dc=t}return e}),{})}async get(){return this.env.var("CONSUL_UI_CONFIG")}getSync(){return this.env.var("CONSUL_UI_CONFIG")}},s=c(u.prototype,"env",[r],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),c(u.prototype,"findByPath",[i],Object.getOwnPropertyDescriptor(u.prototype,"findByPath"),u.prototype),c(u.prototype,"parsePath",[o],Object.getOwnPropertyDescriptor(u.prototype,"parsePath"),u.prototype),c(u.prototype,"get",[a],Object.getOwnPropertyDescriptor(u.prototype,"get"),u.prototype),u) +e.default=d})),define("consul-ui/sort/comparators/auth-method",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +e.default=e=>{let{properties:t}=e +return function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"MethodName:asc" +return t(["MethodName","TokenTTL"])(e)}}})),define("consul-ui/sort/comparators/health-check",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +e.default=e=>{let{properties:t}=e +return function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"Status:asc" +return e.startsWith("Status:")?function(t,n){const[,l]=e.split(":") +let r,i +"asc"===l?(r=t,i=n):(i=t,r=n) +const o=r.Status,a=i.Status +switch(o){case"passing":return"passing"===a?0:1 +case"critical":return"critical"===a?0:-1 +case"warning":switch(a){case"passing":return-1 +case"critical":return 1 +default:return 0}}return 0}:t(["Name","Kind"])(e)}}})) +define("consul-ui/sort/comparators/intention",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +e.default=()=>e=>[e]})),define("consul-ui/sort/comparators/kv",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +e.default=e=>{let{properties:t}=e +return e=>t(["Key","Kind"])(e)}})),define("consul-ui/sort/comparators/node",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +e.default=e=>{let{properties:t}=e +return function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"Name:asc" +return e.startsWith("Status:")?function(t,n){const[,l]=e.split(":") +let r,i +switch("asc"===l?(i=t,r=n):(r=t,i=n),!0){case r.ChecksCritical>i.ChecksCritical:return 1 +case r.ChecksCriticali.ChecksWarning:return 1 +case r.ChecksWarningi.ChecksPassing:return-1}}return 0}}:t(["Node"])(e)}}})),define("consul-ui/sort/comparators/nspace",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +e.default=e=>{let{properties:t}=e +return e=>t(["Name"])(e)}})),define("consul-ui/sort/comparators/partition",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +e.default=e=>{let{properties:t}=e +return e=>t(["Name"])(e)}})),define("consul-ui/sort/comparators/peer",["exports","consul-ui/models/peer"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +e.default=e=>{let{properties:n}=e +return function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"State:asc" +return e.startsWith("State:")?function(n,l){const[,r]=e.split(":") +let i,o +switch("asc"===r?(o=n,i=l):(i=n,o=l),!0){case t.schema.State.allowedValues.indexOf(i.State)t.schema.State.allowedValues.indexOf(o.State):return-1 +case t.schema.State.allowedValues.indexOf(i.State)===t.schema.State.allowedValues.indexOf(o.State):return 0}}:n(["Name"])(e)}}})),define("consul-ui/sort/comparators/policy",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +e.default=e=>{let{properties:t}=e +return function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"Name:asc" +return t(["Name"])(e)}}})),define("consul-ui/sort/comparators/role",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +e.default=e=>{let{properties:t}=e +return function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"Name:asc" +return t(["Name","CreateIndex"])(e)}}})),define("consul-ui/sort/comparators/service-instance",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +e.default=e=>{let{properties:t}=e +return e=>{if(e.startsWith("Status:")){const[,t]=e.split(":"),n=["PercentageChecksPassing","PercentageChecksWarning","PercentageChecksCritical"] +return"asc"===t&&n.reverse(),function(e,t){for(let l in n){let r=n[l] +if(e[r]!==t[r])return e[r]>t[r]?-1:1}}}return t(["Name"])(e)}}})),define("consul-ui/sort/comparators/service",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +e.default=e=>{let{properties:t}=e +return function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"Status:asc" +return e.startsWith("Status:")?function(t,n){const[,l]=e.split(":") +let r,i +switch("asc"===l?(i=t,r=n):(r=t,i=n),!0){case r.MeshChecksCritical>i.MeshChecksCritical:return 1 +case r.MeshChecksCriticali.MeshChecksWarning:return 1 +case r.MeshChecksWarningi.MeshChecksPassing:return-1}}return 0}}:t(["Name"])(e)}}})),define("consul-ui/sort/comparators/token",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +e.default=e=>{let{properties:t}=e +return e=>t(["CreateTime"])(e)}})),define("consul-ui/sort/comparators/upstream-instance",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +e.default=e=>{let{properties:t}=e +return function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"DestinationName:asc" +return t(["DestinationName"])(e)}}})),define("consul-ui/storages/base",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +e.default=class{constructor(e,t){this.key=e,this.storage=t,this.state=this.initState(this.key,this.storage)}initState(){const{key:e,storage:t}=this +return t.getItem(e)}}})),define("consul-ui/storages/notices",["exports","tracked-built-ins","consul-ui/storages/base"],(function(e,t,n){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +class l extends n.default{initState(){const{key:e,storage:n}=this,l=n.getItem(e) +return l?new t.TrackedArray(l.split(",")):new t.TrackedArray}add(e){const{key:t,storage:n,state:l}=this +l.push(e),n.setItem(t,[...l])}}e.default=l})),define("consul-ui/styles/base/decoration/visually-hidden.css",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +e.default=e=>e` + @keyframes visually-hidden { + 100% { + position: absolute; + overflow: hidden; + clip: rect(0 0 0 0); + width: 1px; + height: 1px; + margin: -1px; + padding: 0; + border: 0; + } + } + `})),define("consul-ui/styles/base/icons/base-keyframes.css",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +e.default=e=>e` + *::before, + *::after { + display: inline-block; + animation-play-state: paused; + animation-fill-mode: forwards; + animation-iteration-count: var(--icon-resolution, 1); + vertical-align: text-top; + } + *::before { + animation-name: var(--icon-name-start, var(--icon-name)), + var(--icon-size-start, var(--icon-size, icon-000)); + background-color: var(--icon-color-start, var(--icon-color)); + } + *::after { + animation-name: var(--icon-name-end, var(--icon-name)), + var(--icon-size-end, var(--icon-size, icon-000)); + background-color: var(--icon-color-end, var(--icon-color)); + } + + [style*='--icon-color-start']::before { + color: var(--icon-color-start); + } + [style*='--icon-color-end']::after { + color: var(--icon-color-end); + } + [style*='--icon-name-start']::before, + [style*='--icon-name-end']::after { + content: ''; + } + + @keyframes icon-000 { + 100% { + width: 1.2em; + height: 1.2em; + } + } + @keyframes icon-100 { + 100% { + width: 0.625rem; /* 10px */ + height: 0.625rem; /* 10px */ + } + } + @keyframes icon-200 { + 100% { + width: 0.75rem; /* 12px */ + height: 0.75rem; /* 12px */ + } + } + @keyframes icon-300 { + 100% { + width: 1rem; /* 16px */ + height: 1rem; /* 16px */ + } + } + @keyframes icon-400 { + 100% { + width: 1.125rem; /* 18px */ + height: 1.125rem; /* 18px */ + } + } + @keyframes icon-500 { + 100% { + width: 1.25rem; /* 20px */ + height: 1.25rem; /* 20px */ + } + } + @keyframes icon-600 { + 100% { + width: 1.375rem; /* 22px */ + height: 1.375rem; /* 22px */ + } + } + @keyframes icon-700 { + 100% { + width: 1.5rem; /* 24px */ + height: 1.5rem; /* 24px */ + } + } + @keyframes icon-800 { + 100% { + width: 1.625rem; /* 26px */ + height: 1.625rem; /* 26px */ + } + } + @keyframes icon-900 { + 100% { + width: 1.75rem; /* 28px */ + height: 1.75rem; /* 28px */ + } + } +`})),define("consul-ui/templates/application",["exports","@ember/template-factory"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +var n=(0,t.createTemplateFactory)({id:"JXqlDmpZ",block:'[[[8,[39,0],null,[["@name"],[[99,1,["@name"]]]],[["default"],[[[[1,"\\n\\n"],[1," "],[8,[30,1,["Announcer"]],null,[["@title"],["Consul"]],null],[1,"\\n"],[41,[28,[37,3],["use acls"],null],[[[1," "],[1,[28,[35,4],null,[["class"],["has-acls"]]]],[1,"\\n"]],[]],null],[41,[28,[37,3],["use nspaces"],null],[[[1," "],[1,[28,[35,4],null,[["class"],["has-nspaces"]]]],[1,"\\n"]],[]],null],[41,[28,[37,3],["use partitions"],null],[[[1," "],[1,[28,[35,4],null,[["class"],["has-partitions"]]]],[1,"\\n"]],[]],null],[1,"\\n"],[1," "],[8,[39,5],null,[["@src","@onchange"],[[28,[37,6],["settings://consul:client"],null],[28,[37,7],["onClientChanged"],null]]],null],[1,"\\n\\n"],[1," "],[8,[39,5],null,[["@src"],[[28,[37,6],["settings://consul:theme"],null]]],[["default"],[[[[1,"\\n"],[42,[28,[37,9],[[30,2,["data"]]],null],null,[[[41,[28,[37,10],[[30,3],[28,[37,11],[[30,4],[28,[37,12],["color-scheme","contrast"],null]],null]],null],[[[1," "],[1,[28,[35,4],null,[["class"],[[28,[37,13],["prefers-",[30,4],"-",[30,3]],null]]]]],[1,"\\n"]],[]],null]],[3,4]],null],[1," "]],[2]]]]],[1,"\\n\\n"],[41,[28,[37,3],["use acls"],null],[[[1," "],[8,[39,5],null,[["@src","@onchange"],[[28,[37,6],["settings://consul:token"],null],[28,[37,14],[[30,0],[28,[37,15],[[33,16]],null]],[["value"],["data"]]]]],null],[1,"\\n"]],[]],null],[1,"\\n"],[41,[28,[37,17],[[30,1,["currentName"]],"oauth-provider-debug"],null],[[[1,"\\n"],[41,[28,[37,18],[[30,1,["currentName"]],"index"],null],[[[1,"\\n"],[1," "],[1,[28,[35,19],[[28,[37,7],["replaceWith","dc.services.index",[28,[37,20],null,[["dc"],[[28,[37,21],["CONSUL_DATACENTER_LOCAL"],null]]]]],null]],null]],[1,"\\n"]],[]],[[[41,[28,[37,18],[[30,1,["currentName"]],"notfound"],null],[[[1," "],[8,[39,5],null,[["@src","@onchange"],[[28,[37,6],["/*/*/*/notfound/${path}",[28,[37,20],null,[["path"],[[30,1,["params","notfound"]]]]]],null],[28,[37,14],[[30,0],[28,[37,15],[[33,22]],null]],[["value"],["data"]]]]],null],[1,"\\n"]],[]],null],[1,"\\n"],[44,[[52,[28,[37,3],["use partitions"],null],[28,[37,24],[[30,1,["params","partition"]],[33,22,["partition"]],[33,16,["Partition"]],""],null],""],[52,[28,[37,3],["use nspaces"],null],[28,[37,24],[[30,1,["params","nspace"]],[33,22,["nspace"]],[33,16,["Namespace"]],""],null],""]],[[[1,"\\n"],[1," "],[8,[39,5],null,[["@src"],[[28,[37,6],["/*/*/*/datacenters"],null]]],[["default"],[[[[1,"\\n"],[44,[[28,[37,24],[[52,[33,25,["dc"]],[28,[37,26],[0,[28,[37,27],["dc",[28,[37,20],null,[["Name"],[[33,22,["dc"]]]]]],null]],null]],[28,[37,26],[0,[28,[37,27],["dc",[28,[37,20],null,[["Name"],[[30,1,["params","dc"]]]]]],null]],null],[28,[37,20],null,[["Name"],[[28,[37,21],["CONSUL_DATACENTER_LOCAL"],null]]]]],null],[30,7,["data"]]],[[[41,[28,[37,10],[[28,[37,28],[[30,8,["Name","length"]],0],null],[30,9]],null],[[[1,"\\n"],[1," "],[8,[39,5],null,[["@src"],[[28,[37,6],["/${partition}/*/${dc}/datacenter-cache/${name}",[28,[37,20],null,[["dc","partition","name"],[[30,8,["Name"]],[30,5],[30,8,["Name"]]]]]],null]]],[["default"],[[[[1,"\\n"],[41,[30,10,["data"]],[[[1," "],[8,[39,29],[[24,1,"wrapper"]],[["@dcs","@dc","@partition","@nspace","@user","@onchange"],[[30,9],[30,10,["data"]],[30,5],[30,6],[28,[37,20],null,[["token"],[[33,16]]]],[28,[37,14],[[30,0],"reauthorize"],null]]],[["default"],[[[[1,"\\n\\n"],[41,[33,30],[[[1," "],[8,[39,31],null,[["@error","@login"],[[99,30,["@error"]],[30,11,["login","open"]]]],null],[1,"\\n"]],[]],[[[1," "],[8,[39,32],null,[["@name","@model"],["application",[28,[37,20],null,[["app","user","dc","dcs"],[[30,11],[28,[37,20],null,[["token"],[[33,16]]]],[30,10,["data"]],[30,9]]]]]],[["default"],[[[[1,"\\n "],[46,[28,[37,34],null,null],null,null,null],[1,"\\n "]],[12]]]]],[1,"\\n\\n"],[1," "],[8,[39,35],[[24,0,"view-loader"]],null,null],[1,"\\n"]],[]]],[1,"\\n "]],[11]]]]],[1,"\\n"]],[]],null],[1," "]],[10]]]]],[1,"\\n"]],[]],null]],[8,9]]],[1," "]],[7]]]]],[1,"\\n"]],[5,6]]]],[]]]],[]],[[[1," "],[8,[39,32],null,[["@name","@model"],["application",[28,[37,20],null,[["user"],[[28,[37,20],null,[["token"],[[33,16]]]]]]]]],[["default"],[[[[1,"\\n "],[46,[28,[37,34],null,null],null,null,null],[1,"\\n "]],[13]]]]],[1,"\\n"]],[]]]],[1]]]]],[1,"\\n"]],["route","source","value","key","partition","nspace","dcs","dc","dcs","dc","consul","o","o"],false,["route","routeName","if","can","document-attrs","data-source","uri","route-action","each","-each-in","and","includes","array","concat","action","mut","token","not-eq","eq","did-insert","hash","env","notfound","let","or","nofound","object-at","cached-model","gt","hashicorp-consul","error","app-error","outlet","component","-outlet","consul/loader"]]',moduleName:"consul-ui/templates/application.hbs",isStrictMode:!1}) +e.default=n})),define("consul-ui/templates/components/basic-dropdown-content",["exports","ember-basic-dropdown/templates/components/basic-dropdown-content"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/templates/components/basic-dropdown-optional-tag",["exports","ember-basic-dropdown/templates/components/basic-dropdown-optional-tag"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/templates/components/basic-dropdown-trigger",["exports","ember-basic-dropdown/templates/components/basic-dropdown-trigger"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/templates/components/basic-dropdown",["exports","ember-basic-dropdown/templates/components/basic-dropdown"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/templates/dc",["exports","@ember/template-factory"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +var n=(0,t.createTemplateFactory)({id:"zSQnZ2jK",block:'[[[8,[39,0],null,[["@name"],[[99,1,["@name"]]]],[["default"],[[[[1,"\\n "],[8,[39,2],null,[["@name","@model"],[[99,1,["@name"]],[30,1,["model"]]]],[["default"],[[[[1,"\\n "],[46,[28,[37,4],null,null],null,null,null],[1,"\\n "]],[2]]]]],[1,"\\n"]],[1]]]]],[1,"\\n"]],["route","o"],false,["route","routeName","outlet","component","-outlet"]]',moduleName:"consul-ui/templates/dc.hbs",isStrictMode:!1}) +e.default=n})),define("consul-ui/templates/dc/acls",["exports","@ember/template-factory"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +var n=(0,t.createTemplateFactory)({id:"U8Va7GUq",block:'[[[8,[39,0],null,[["@name"],[[99,1,["@name"]]]],[["default"],[[[[1,"\\n "],[8,[39,2],null,[["@name","@model"],[[99,1,["@name"]],[30,1,["model"]]]],[["default"],[[[[1,"\\n "],[46,[28,[37,4],null,null],null,null,null],[1,"\\n "]],[2]]]]],[1,"\\n"]],[1]]]]],[1,"\\n"]],["route","o"],false,["route","routeName","outlet","component","-outlet"]]',moduleName:"consul-ui/templates/dc/acls.hbs",isStrictMode:!1}) +e.default=n})),define("consul-ui/templates/dc/acls/auth-methods/index",["exports","@ember/template-factory"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +var n=(0,t.createTemplateFactory)({id:"RVzHvzAb",block:'[[[8,[39,0],null,[["@name"],[[99,1,["@name"]]]],[["default"],[[[[1,"\\n\\n "],[8,[39,2],null,[["@src"],[[28,[37,3],["/${partition}/${nspace}/${dc}/auth-methods",[28,[37,4],null,[["partition","nspace","dc"],[[30,1,["params","partition"]],[30,1,["params","nspace"]],[30,1,["params","dc"]]]]]],null]]],[["default"],[[[[1,"\\n\\n "],[8,[39,5],null,[["@name"],["error"]],[["default"],[[[[1,"\\n"],[41,[28,[37,7],[[30,2,["error","status"]],"401"],null],[[[1," "],[8,[39,8],null,null,null],[1,"\\n"]],[]],[[[1," "],[8,[39,9],null,[["@error","@login"],[[30,2,["error"]],[30,1,["model","app","login","open"]]]],null],[1,"\\n"]],[]]],[1," "]],[]]]]],[1,"\\n\\n "],[8,[39,5],null,[["@name"],["loaded"]],[["default"],[[[[1,"\\n"],[44,[[28,[37,4],null,[["value","change"],[[28,[37,11],[[33,12],"MethodName:asc"],null],[28,[37,13],[[30,0],[28,[37,14],[[33,12]],null]],[["value"],["target.selected"]]]]]],[28,[37,4],null,[["kind","source","searchproperty"],[[28,[37,4],null,[["value","change"],[[52,[33,15],[28,[37,16],[[33,15],","],null],[27]],[28,[37,13],[[30,0],[28,[37,14],[[33,15]],null]],[["value"],["target.selectedItems"]]]]]],[28,[37,4],null,[["value","change"],[[52,[33,17],[28,[37,16],[[33,17],","],null],[27]],[28,[37,13],[[30,0],[28,[37,14],[[33,17]],null]],[["value"],["target.selectedItems"]]]]]],[28,[37,4],null,[["value","change","default"],[[52,[28,[37,18],[[33,19],[27]],null],[28,[37,16],[[33,19],","],null],[33,20]],[28,[37,13],[[30,0],[28,[37,14],[[33,19]],null]],[["value"],["target.selectedItems"]]],[33,20]]]]]]],[30,2,["data"]]],[[[1,"\\n\\n "],[8,[39,21],null,[["@login"],[[30,1,["model","app","login","open"]]]],[["default"],[[[[1,"\\n "],[8,[39,5],null,[["@name"],["header"]],[["default"],[[[[1,"\\n "],[10,"h1"],[12],[1,"\\n "],[8,[30,1,["Title"]],null,[["@title"],["Auth Methods"]],null],[1,"\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,5],null,[["@name"],["toolbar"]],[["default"],[[[[1,"\\n"],[41,[28,[37,22],[[30,5,["length"]],0],null],[[[1," "],[8,[39,23],null,[["@search","@onsearch","@sort","@filter"],[[99,24,["@search"]],[28,[37,13],[[30,0],[28,[37,14],[[33,24]],null]],[["value"],["target.value"]]],[30,3],[30,4]]],null],[1,"\\n"]],[]],null],[1," "]],[]]]]],[1,"\\n "],[8,[39,5],null,[["@name"],["content"]],[["default"],[[[[1,"\\n "],[8,[39,25],null,[["@type","@sort","@filters","@search","@items"],["auth-method",[30,3,["value"]],[30,4],[99,24,["@search"]],[30,5]]],[["default"],[[[[1,"\\n "],[8,[30,6,["Collection"]],null,null,[["default"],[[[[1,"\\n "],[8,[39,26],null,[["@items"],[[30,6,["items"]]]],null],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[30,6,["Empty"]],null,null,[["default"],[[[[1,"\\n "],[8,[39,27],null,[["@login"],[[30,1,["model","app","login","open"]]]],[["default"],[[[[1,"\\n "],[8,[39,5],null,[["@name"],["header"]],[["default"],[[[[1,"\\n "],[10,"h2"],[12],[1,"\\n "],[1,[28,[35,28],["routes.dc.acls.auth-methods.index.empty.header"],[["items"],[[30,5,["length"]]]]]],[1,"\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,5],null,[["@name"],["body"]],[["default"],[[[[1,"\\n "],[1,[28,[35,28],["routes.dc.acls.auth-methods.index.empty.body"],[["items","htmlSafe"],[[30,5,["length"]],true]]]],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,5],null,[["@name"],["actions"]],[["default"],[[[[1,"\\n "],[10,"li"],[12],[1,"\\n "],[8,[39,29],null,[["@text","@href","@icon","@iconPosition","@size"],["Documentation on auth methods",[29,[[28,[37,30],["CONSUL_DOCS_URL"],null],"/security/acl/auth-methods"]],"docs-link","trailing","small"]],null],[1,"\\n "],[13],[1,"\\n "],[10,"li"],[12],[1,"\\n "],[8,[39,29],null,[["@text","@href","@icon","@iconPosition","@size"],["Read the API Docs",[29,[[28,[37,30],["CONSUL_DOCS_API_URL"],null],"/acl/auth-methods.html"]],"learn-link","trailing","small"]],null],[1,"\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n "]],[]]]]],[1,"\\n "]],[]]]]],[1,"\\n "]],[6]]]]],[1,"\\n "]],[]]]]],[1,"\\n "]],[]]]]],[1,"\\n"]],[3,4,5]]],[1," "]],[]]]]],[1,"\\n "]],[2]]]]],[1,"\\n"]],[1]]]]],[1,"\\n"]],["route","loader","sort","filters","items","collection"],false,["route","routeName","data-loader","uri","hash","block-slot","if","eq","consul/acl/disabled","app-error","let","or","sortBy","action","mut","kind","split","source","not-eq","searchproperty","searchProperties","app-view","gt","consul/auth-method/search-bar","search","data-collection","consul/auth-method/list","empty-state","t","hds/link/standalone","env"]]',moduleName:"consul-ui/templates/dc/acls/auth-methods/index.hbs",isStrictMode:!1}) +e.default=n})),define("consul-ui/templates/dc/acls/auth-methods/show",["exports","@ember/template-factory"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +var n=(0,t.createTemplateFactory)({id:"HUExCiVZ",block:'[[[8,[39,0],null,[["@name"],[[99,1,["@name"]]]],[["default"],[[[[1,"\\n "],[8,[39,2],null,[["@src"],[[28,[37,3],["/${partition}/${nspace}/${dc}/auth-method/${name}",[28,[37,4],null,[["partition","nspace","dc","name"],[[30,1,["params","partition"]],[30,1,["params","nspace"]],[30,1,["params","dc"]],[30,1,["params","id"]]]]]],null]]],[["default"],[[[[1,"\\n\\n "],[8,[39,5],null,[["@name"],["error"]],[["default"],[[[[1,"\\n"],[41,[28,[37,7],[[30,2,["error","status"]],"401"],null],[[[1," "],[8,[39,8],null,null,null],[1,"\\n"]],[]],[[[1," "],[8,[39,9],null,[["@error","@login"],[[30,2,["error"]],[30,1,["model","app","login","open"]]]],null],[1,"\\n"]],[]]],[1," "]],[]]]]],[1,"\\n\\n "],[8,[39,5],null,[["@name"],["loaded"]],[["default"],[[[[1,"\\n"],[44,[[30,2,["data"]]],[[[1," "],[8,[39,11],null,null,[["default"],[[[[1,"\\n "],[8,[39,5],null,[["@name"],["breadcrumbs"]],[["default"],[[[[1,"\\n "],[10,"ol"],[12],[1,"\\n "],[10,"li"],[12],[10,3],[15,6,[28,[37,12],["dc.acls.auth-methods"],null]],[12],[1,"All Auth Methods"],[13],[13],[1,"\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,5],null,[["@name"],["header"]],[["default"],[[[[1,"\\n "],[10,"h1"],[12],[1,"\\n "],[8,[30,1,["Title"]],null,[["@title"],[[30,3,["Name"]]]],null],[1,"\\n "],[13],[1,"\\n "],[8,[39,13],null,[["@item"],[[30,3]]],null],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,5],null,[["@name"],["nav"]],[["default"],[[[[1,"\\n "],[8,[39,14],null,[["@items"],[[28,[37,15],[[28,[37,16],[[28,[37,4],null,[["label","href","selected"],["General info",[28,[37,12],["dc.acls.auth-methods.show.auth-method"],null],[28,[37,17],["dc.acls.auth-methods.show.auth-method"],null]]]],[52,[28,[37,18],["use nspaces"],null],[28,[37,4],null,[["label","href","selected"],["Namespace rules",[28,[37,12],["dc.acls.auth-methods.show.nspace-rules"],null],[28,[37,17],["dc.acls.auth-methods.show.nspace-rules"],null]]]],""],[28,[37,4],null,[["label","href","selected"],["Binding rules",[28,[37,12],["dc.acls.auth-methods.show.binding-rules"],null],[28,[37,17],["dc.acls.auth-methods.show.binding-rules"],null]]]]],null]],null]]],null],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,5],null,[["@name"],["content"]],[["default"],[[[[1,"\\n "],[8,[39,19],null,[["@name","@model"],[[99,1,["@name"]],[28,[37,4],null,[["item"],[[30,3]]]]]],[["default"],[[[[1,"\\n "],[46,[28,[37,21],null,null],null,null,null],[1,"\\n "]],[4]]]]],[1,"\\n "]],[]]]]],[1,"\\n "]],[]]]]],[1,"\\n"]],[3]]],[1," "]],[]]]]],[1,"\\n "]],[2]]]]],[1,"\\n"]],[1]]]]]],["route","loader","item","o"],false,["route","routeName","data-loader","uri","hash","block-slot","if","eq","consul/acl/disabled","app-error","let","app-view","href-to","consul/auth-method/type","tab-nav","compact","array","is-href","can","outlet","component","-outlet"]]',moduleName:"consul-ui/templates/dc/acls/auth-methods/show.hbs",isStrictMode:!1}) +e.default=n})),define("consul-ui/templates/dc/acls/auth-methods/show/auth-method",["exports","@ember/template-factory"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +var n=(0,t.createTemplateFactory)({id:"eqP++7Wz",block:'[[[8,[39,0],null,[["@name"],[[99,1,["@name"]]]],[["default"],[[[[1,"\\n "],[10,0],[14,0,"tab-section"],[12],[1,"\\n "],[8,[39,2],null,[["@item"],[[30,1,["model","item"]]]],null],[1,"\\n "],[13],[1,"\\n"]],[1]]]]],[1,"\\n"]],["route"],false,["route","routeName","consul/auth-method/view"]]',moduleName:"consul-ui/templates/dc/acls/auth-methods/show/auth-method.hbs",isStrictMode:!1}) +e.default=n})),define("consul-ui/templates/dc/acls/auth-methods/show/binding-rules",["exports","@ember/template-factory"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +var n=(0,t.createTemplateFactory)({id:"P/K1HFfv",block:'[[[8,[39,0],null,[["@name"],[[99,1,["@name"]]]],[["default"],[[[[1,"\\n\\n "],[8,[39,2],null,[["@src"],[[28,[37,3],["/${partition}/${nspace}/${dc}/binding-rules/for-auth-method/${name}",[28,[37,4],null,[["partition","nspace","dc","name"],[[30,1,["params","partition"]],[30,1,["params","nspace"]],[30,1,["params","dc"]],[30,1,["params","id"]]]]]],null]]],[["default"],[[[[1,"\\n\\n "],[8,[39,5],null,[["@name"],["error"]],[["default"],[[[[1,"\\n "],[8,[39,6],null,[["@error","@login"],[[30,2,["error"]],[30,1,["model","app","login","open"]]]],null],[1,"\\n "]],[]]]]],[1,"\\n\\n "],[8,[39,5],null,[["@name"],["loaded"]],[["default"],[[[[1,"\\n"],[44,[[30,2,["data"]]],[[[1,"\\n "],[10,0],[14,0,"tab-section"],[12],[1,"\\n"],[41,[28,[37,9],[[30,3,["length"]],0],null],[[[1," "],[10,2],[12],[1,"\\n Binding rules allow an operator to express a systematic way of automatically linking roles and service identities to newly created tokens without operator intervention.\\n "],[13],[1,"\\n "],[10,2],[12],[1,"\\n Successful authentication with an auth method returns a set of trusted identity attributes corresponding to the authenticated identity. Those attributes are matched against all configured binding rules for that auth method to determine what privileges to grant the Consul ACL token it will ultimately create.\\n "],[13],[1,"\\n "],[10,"hr"],[12],[13],[1,"\\n"],[42,[28,[37,11],[[28,[37,11],[[30,3]],null]],null],null,[[[1," "],[8,[39,12],null,[["@item"],[[30,4]]],null],[1,"\\n "],[10,"hr"],[12],[13],[1,"\\n"]],[4]],null]],[]],[[[1," "],[8,[39,13],null,null,[["default"],[[[[1,"\\n "],[8,[39,5],null,[["@name"],["header"]],[["default"],[[[[1,"\\n "],[10,"h2"],[12],[1,"\\n "],[1,[28,[35,14],["routes.dc.acls.auth-methods.show.binding-rules.index.empty.header"],null]],[1,"\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,5],null,[["@name"],["body"]],[["default"],[[[[1,"\\n "],[1,[28,[35,14],["routes.dc.acls.auth-methods.show.binding-rules.index.empty.body"],[["htmlSafe"],[true]]]],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,5],null,[["@name"],["actions"]],[["default"],[[[[1,"\\n "],[10,"li"],[14,0,"docs-link"],[12],[1,"\\n "],[10,3],[15,6,[29,[[28,[37,15],["CONSUL_DOCS_API_URL"],null],"/acl/binding-rules"]]],[14,"rel","noopener noreferrer"],[14,"target","_blank"],[12],[1,"Read the documentation"],[13],[1,"\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n "]],[]]]]],[1,"\\n"]],[]]],[1," "],[13],[1,"\\n"]],[3]]],[1,"\\n "]],[]]]]],[1,"\\n "]],[2]]]]],[1,"\\n"]],[1]]]]],[1,"\\n"]],["route","loader","items","item"],false,["route","routeName","data-loader","uri","hash","block-slot","app-error","let","if","gt","each","-track-array","consul/auth-method/binding-list","empty-state","t","env"]]',moduleName:"consul-ui/templates/dc/acls/auth-methods/show/binding-rules.hbs",isStrictMode:!1}) +e.default=n})),define("consul-ui/templates/dc/acls/auth-methods/show/nspace-rules",["exports","@ember/template-factory"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +var n=(0,t.createTemplateFactory)({id:"L5CJq4k2",block:'[[[8,[39,0],null,[["@name"],[[99,1,["@name"]]]],[["default"],[[[[1,"\\n"],[44,[[30,1,["model","item"]]],[[[1," "],[10,0],[14,0,"tab-section"],[12],[1,"\\n"],[41,[28,[37,4],[[30,2,["NamespaceRules","length"]],0],null],[[[1," "],[10,2],[12],[1,"\\n A set of rules that can control which namespace tokens created via this auth method will be created within. Unlike binding rules, the first matching namespace rule wins.\\n "],[13],[1,"\\n "],[8,[39,5],null,[["@items"],[[30,2,["NamespaceRules"]]]],null],[1,"\\n"]],[]],[[[1," "],[8,[39,6],null,null,[["default"],[[[[1,"\\n "],[8,[39,7],null,[["@name"],["header"]],[["default"],[[[[1,"\\n "],[10,"h2"],[12],[1,"\\n "],[1,[28,[35,8],[[28,[37,9],[[30,1,["t"]],"empty.header"],null]],null]],[1,"\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,7],null,[["@name"],["body"]],[["default"],[[[[1,"\\n "],[1,[28,[35,8],[[28,[37,9],[[30,1,["t"]],"empty.body",[28,[37,10],null,[["htmlSafe"],[true]]]],null]],null]],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,7],null,[["@name"],["actions"]],[["default"],[[[[1,"\\n "],[10,"li"],[14,0,"docs-link"],[12],[1,"\\n "],[10,3],[15,6,[29,[[28,[37,11],["CONSUL_DOCS_API_URL"],null],"/acl/auth-methods#namespacerules"]]],[14,"rel","noopener noreferrer"],[14,"target","_blank"],[12],[1,"Read the documentation"],[13],[1,"\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n "]],[]]]]],[1,"\\n"]],[]]],[1," "],[13],[1,"\\n"]],[2]]]],[1]]]]],[1,"\\n"]],["route","item"],false,["route","routeName","let","if","gt","consul/auth-method/nspace-list","empty-state","block-slot","compute","fn","hash","env"]]',moduleName:"consul-ui/templates/dc/acls/auth-methods/show/nspace-rules.hbs",isStrictMode:!1}) +e.default=n})),define("consul-ui/templates/dc/acls/index",["exports","@ember/template-factory"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +var n=(0,t.createTemplateFactory)({id:"kWA9U8QS",block:'[[[8,[39,0],null,[["@name"],[[99,1,["@name"]]]],[["default"],[[[[1,"\\n "],[1,[28,[35,2],[[28,[37,3],["replaceWith","dc.acls.tokens"],null]],null]],[1,"\\n"]],[1]]]]],[1,"\\n"]],["route"],false,["route","routeName","did-insert","route-action"]]',moduleName:"consul-ui/templates/dc/acls/index.hbs",isStrictMode:!1}) +e.default=n})),define("consul-ui/templates/dc/acls/policies/-form",["exports","@ember/template-factory"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +var n=(0,t.createTemplateFactory)({id:"k8B3pmJI",block:'[[[10,"form"],[12],[1,"\\n "],[8,[39,0],null,[["@form","@partition","@nspace","@item"],[[99,1,["@form"]],[99,2,["@partition"]],[99,3,["@nspace"]],[99,4,["@item"]]]],[["default"],[[[[1,"\\n"],[1," "],[8,[39,5],null,[["@name"],["template"]],null],[1,"\\n "]],[]]]]],[1,"\\n"],[41,[28,[37,7],[[33,8]],null],[[[1," "],[8,[39,9],null,[["@src","@onchange"],[[28,[37,10],["/${partition}/${nspace}/${dc}/tokens/for-policy/${id}",[28,[37,11],null,[["partition","nspace","dc","id"],[[33,2],[33,3],[33,12],[28,[37,13],[[33,14],""],null]]]]],null],[28,[37,15],[[30,0],[28,[37,16],[[33,17]],null]],[["value"],["data"]]]]],null],[1,"\\n"],[41,[28,[37,18],[[33,17,["length"]],0],null],[[[1," "],[8,[39,19],null,[["@caption","@items"],["Applied to the following tokens:",[99,17,["@items"]]]],null],[1,"\\n"]],[]],null]],[]],null],[1," "],[10,0],[12],[1,"\\n "],[8,[39,20],null,null,[["default"],[[[[1,"\\n"],[41,[28,[37,21],[[33,8],[28,[37,22],["create tokens"],null]],null],[[[1," "],[8,[39,23],[[16,"disabled",[52,[28,[37,13],[[33,4,["isPristine"]],[33,4,["isInvalid"]],[28,[37,24],[[33,4,["Name"]],""],null]],null],"disabled"]],[24,4,"submit"],[4,[38,25],["click",[28,[37,26],["create",[33,4]],null]],null]],[["@text"],["Save"]],null],[1,"\\n"]],[]],[[[41,[28,[37,22],["write policy"],[["item"],[[33,4]]]],[[[1," "],[8,[39,23],[[16,"disabled",[52,[33,4,["isInvalid"]],"disabled"]],[24,4,"submit"],[4,[38,25],["click",[28,[37,26],["update",[33,4]],null]],null]],[["@text"],["Save"]],null],[1,"\\n"]],[]],null]],[]]],[1," "],[8,[39,23],[[24,4,"reset"],[4,[38,15],[[30,0],"cancel",[33,4]],null]],[["@text","@color"],["Cancel","secondary"]],null],[1,"\\n"],[41,[28,[37,21],[[28,[37,7],[[33,8]],null],[28,[37,22],["delete policy"],[["item"],[[33,4]]]]],null],[[[1," "],[8,[39,27],null,[["@message"],["Are you sure you want to delete this Policy?"]],[["default"],[[[[1,"\\n "],[8,[39,5],null,[["@name"],["action"]],[["default"],[[[[1,"\\n "],[8,[39,23],[[4,[38,15],[[30,0],[30,1],"delete",[33,4]],null]],[["@text","@color"],["Delete","critical"]],null],[1,"\\n "]],[1]]]]],[1,"\\n "],[8,[39,5],null,[["@name"],["dialog"]],[["default"],[[[[1,"\\n"],[41,[28,[37,18],[[33,17,["length"]],0],null],[[[1," "],[8,[39,28],null,[["@onclose","@open","@aria"],[[28,[37,15],[[30,0],[30,3]],null],true,[28,[37,11],null,[["label"],["Policy in Use"]]]]],[["default"],[[[[1,"\\n "],[8,[39,5],null,[["@name"],["header"]],[["default"],[[[[1,"\\n "],[10,"h2"],[12],[1,"Policy in Use"],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,5],null,[["@name"],["body"]],[["default"],[[[[1,"\\n "],[10,2],[12],[1,"\\n This Policy is currently in use. If you choose to delete this Policy, it will be removed from the\\n following "],[10,"strong"],[12],[1,[33,17,["length"]]],[1," Tokens"],[13],[1,":\\n "],[13],[1,"\\n "],[8,[39,19],null,[["@items","@target"],[[99,17,["@items"]],"_blank"]],null],[1,"\\n "],[10,2],[12],[1,"\\n This action cannot be undone. "],[1,[30,4]],[1,"\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,5],null,[["@name"],["actions"]],[["default"],[[[[1,"\\n "],[8,[39,20],null,null,[["default"],[[[[1,"\\n "],[8,[39,23],[[4,[38,15],[[30,0],[30,2]],null]],[["@text","@color"],["Yes, Delete","critical"]],null],[1,"\\n "],[8,[39,23],[[4,[38,15],[[30,0],[30,5]],null]],[["@text","@color"],["Cancel","secondary"]],null],[1,"\\n "]],[]]]]],[1,"\\n "]],[5]]]]],[1,"\\n "]],[]]]]],[1,"\\n"]],[]],[[[1," "],[8,[39,29],null,[["@message","@execute","@cancel"],[[30,4],[30,2],[30,3]]],null],[1,"\\n"]],[]]],[1," "]],[2,3,4]]]]],[1,"\\n "]],[]]]]],[1,"\\n"]],[]],null],[1," "]],[]]]]],[1,"\\n "],[13],[1,"\\n"],[13],[1,"\\n"]],["confirm","execute","cancel","message","close"],false,["policy-form","form","partition","nspace","item","block-slot","if","not","create","data-source","uri","hash","dc","or","id","action","mut","items","gt","token-list","hds/button-set","and","can","hds/button","eq","on","route-action","confirmation-dialog","modal-dialog","delete-confirmation"]]',moduleName:"consul-ui/templates/dc/acls/policies/-form.hbs",isStrictMode:!1}) +e.default=n})) +define("consul-ui/templates/dc/acls/policies/edit",["exports","@ember/template-factory"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +var n=(0,t.createTemplateFactory)({id:"zMcjLQlh",block:'[[[8,[39,0],null,[["@name"],[[99,1,["@name"]]]],[["default"],[[[[1,"\\n "],[8,[39,2],null,[["@src"],[[28,[37,3],["/${partition}/${nspace}/${dc}/policy/${id}",[28,[37,4],null,[["partition","nspace","dc","id"],[[30,1,["params","partition"]],[30,1,["params","nspace"]],[30,1,["params","dc"]],[28,[37,5],[[30,1,["params","id"]],""],null]]]]],null]]],[["default"],[[[[1,"\\n\\n "],[8,[39,6],null,[["@name"],["error"]],[["default"],[[[[1,"\\n"],[41,[28,[37,8],[[30,2,["error","status"]],"401"],null],[[[1," "],[8,[39,9],null,null,null],[1,"\\n"]],[]],[[[1," "],[8,[39,10],null,[["@error","@login"],[[30,2,["error"]],[30,1,["model","app","login","open"]]]],null],[1,"\\n"]],[]]],[1," "]],[]]]]],[1,"\\n\\n "],[8,[39,6],null,[["@name"],["loaded"]],[["default"],[[[[1,"\\n"],[44,[[30,1,["params","dc"]],[30,1,["params","partition"]],[30,1,["params","nspace"]],[28,[37,5],[[30,1,["params","id"]],""],null],[30,2,["data"]],[30,2,["data","isNew"]]],[[[1," "],[8,[39,12],null,[["@login"],[[30,1,["model","app","login","open"]]]],[["default"],[[[[1,"\\n "],[8,[39,6],null,[["@name"],["breadcrumbs"]],[["default"],[[[[1,"\\n "],[10,"ol"],[12],[1,"\\n "],[10,"li"],[12],[10,3],[15,6,[28,[37,13],["dc.acls.policies"],null]],[12],[1,"All Policies"],[13],[13],[1,"\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,6],null,[["@name"],["header"]],[["default"],[[[[1,"\\n "],[10,"h1"],[12],[1,"\\n"],[41,[30,8],[[[1," "],[8,[30,1,["Title"]],null,[["@title"],["New Policy"]],null],[1,"\\n"]],[]],[[[41,[28,[37,14],["write policy"],[["item"],[[30,7]]]],[[[1," "],[8,[30,1,["Title"]],null,[["@title"],["Edit Policy"]],null],[1,"\\n"]],[]],[[[1," "],[8,[30,1,["Title"]],null,[["@title"],["View Policy"]],null],[1,"\\n"]],[]]]],[]]],[1," "],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,6],null,[["@name"],["content"]],[["default"],[[[[1,"\\n"],[41,[28,[37,15],[[30,8]],null],[[[1," "],[10,0],[14,0,"definition-table"],[12],[1,"\\n "],[10,"dl"],[12],[1,"\\n "],[10,"dt"],[12],[1,"Policy ID"],[13],[1,"\\n "],[10,"dd"],[12],[1,"\\n "],[8,[39,16],null,[["@value","@name"],[[30,7,["ID"]],"Policy ID"]],null],[1,"\\n "],[13],[1,"\\n "],[13],[1,"\\n "],[13],[1,"\\n"]],[]],null],[41,[28,[37,8],[[28,[37,17],[[30,7]],null],"policy-management"],null],[[[1," "],[8,[39,18],[[24,0,"mb-3 mt-2"]],[["@type","@icon"],["inline","star-fill"]],[["default"],[[[[1,"\\n "],[8,[30,9,["Title"]],null,null,[["default"],[[[[1,"Management"]],[]]]]],[1,"\\n "],[8,[30,9,["Description"]],null,null,[["default"],[[[[1,"This global-management token is built into Consul\'s policy system. You can apply this special policy to tokens for full access. This policy is not editable or removeable, but can be ignored by not applying it to any tokens."]],[]]]]],[1,"\\n "],[8,[30,9,["Link::Standalone"]],null,[["@text","@href","@icon","@iconPosition"],["Learn more",[29,[[28,[37,19],["CONSUL_DOCS_URL"],null],"/guides/acl.html#builtin-policies"]],"docs-link","trailing"]],null],[1,"\\n "]],[9]]]]],[1,"\\n "],[10,0],[14,0,"definition-table"],[12],[1,"\\n "],[10,"dl"],[12],[1,"\\n "],[10,"dt"],[12],[1,"Name"],[13],[1,"\\n "],[10,"dd"],[12],[1,[30,7,["Name"]]],[13],[1,"\\n "],[10,"dt"],[12],[1,"Valid Datacenters"],[13],[1,"\\n "],[10,"dd"],[12],[1,[28,[35,20],[", ",[28,[37,21],[[30,7]],null]],null]],[13],[1,"\\n "],[10,"dt"],[12],[1,"Description"],[13],[1,"\\n "],[10,"dd"],[12],[1,[30,7,["Description"]]],[13],[1,"\\n "],[13],[1,"\\n "],[13],[1,"\\n "],[8,[39,22],null,[["@src"],[[28,[37,3],["/${partition}/${nspace}/${dc}/tokens/for-policy/${id}",[28,[37,4],null,[["partition","nspace","dc","id"],[[30,4],[30,5],[30,3],[30,6]]]]],null]]],[["default"],[[[[1,"\\n"],[41,[28,[37,23],[[30,10,["data","length"]],0],null],[[[1," "],[8,[39,24],null,[["@caption","@items"],["Applied to the following tokens:",[30,10,["data"]]]],null],[1,"\\n"]],[]],null],[1," "]],[10]]]]],[1,"\\n"]],[]],[[[1," "],[19,"dc/acls/policies/form",[1,2,3,4,5,6,7,8]],[1,"\\n"]],[]]],[1," "]],[]]]]],[1,"\\n "]],[]]]]],[1,"\\n"]],[3,4,5,6,7,8]]],[1," "]],[]]]]],[1,"\\n "]],[2]]]]],[1,"\\n"]],[1]]]]]],["route","loader","dc","partition","nspace","id","item","create","A","loader"],true,["route","routeName","data-loader","uri","hash","or","block-slot","if","eq","consul/acl/disabled","app-error","let","app-view","href-to","can","not","copyable-code","policy/typeof","hds/alert","env","join","policy/datacenters","data-source","gt","token-list","partial"]]',moduleName:"consul-ui/templates/dc/acls/policies/edit.hbs",isStrictMode:!1}) +e.default=n})),define("consul-ui/templates/dc/acls/policies/index",["exports","@ember/template-factory"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +var n=(0,t.createTemplateFactory)({id:"gfKx11yz",block:'[[[8,[39,0],null,[["@name"],[[99,1,["@name"]]]],[["default"],[[[[1,"\\n "],[8,[39,2],null,[["@src"],[[28,[37,3],["/${partition}/${nspace}/${dc}/policies",[28,[37,4],null,[["partition","nspace","dc"],[[30,1,["params","partition"]],[30,1,["params","nspace"]],[30,1,["params","dc"]]]]]],null]]],[["default"],[[[[1,"\\n\\n "],[8,[39,5],null,[["@name"],["error"]],[["default"],[[[[1,"\\n"],[41,[28,[37,7],[[30,2,["error","status"]],"401"],null],[[[1," "],[8,[39,8],null,null,null],[1,"\\n"]],[]],[[[1," "],[8,[39,9],null,[["@error","@login"],[[30,2,["error"]],[30,1,["model","app","login","open"]]]],null],[1,"\\n"]],[]]],[1," "]],[]]]]],[1,"\\n\\n "],[8,[39,5],null,[["@name"],["loaded"]],[["default"],[[[[1,"\\n"],[44,[[28,[37,4],null,[["value","change"],[[28,[37,11],[[33,12],"Name:asc"],null],[28,[37,13],[[30,0],[28,[37,14],[[33,12]],null]],[["value"],["target.selected"]]]]]],[28,[37,4],null,[["kind","datacenter","searchproperty"],[[28,[37,4],null,[["value","change"],[[52,[33,15],[28,[37,16],[[33,15],","],null],[27]],[28,[37,13],[[30,0],[28,[37,14],[[33,15]],null]],[["value"],["target.selectedItems"]]]]]],[28,[37,4],null,[["value","change"],[[52,[33,17],[28,[37,16],[[33,17],","],null],[27]],[28,[37,13],[[30,0],[28,[37,14],[[33,17]],null]],[["value"],["target.selectedItems"]]]]]],[28,[37,4],null,[["value","change","default"],[[52,[28,[37,18],[[33,19],[27]],null],[28,[37,16],[[33,19],","],null],[33,20]],[28,[37,13],[[30,0],[28,[37,14],[[33,19]],null]],[["value"],["target.selectedItems"]]],[33,20]]]]]]],[30,2,["data"]]],[[[1," "],[8,[39,21],null,[["@login"],[[30,1,["model","app","login","open"]]]],[["default"],[[[[1,"\\n "],[8,[39,5],null,[["@name"],["header"]],[["default"],[[[[1,"\\n "],[10,"h1"],[12],[1,"\\n "],[8,[30,1,["Title"]],null,[["@title"],["Policies"]],null],[1,"\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,5],null,[["@name"],["actions"]],[["default"],[[[[1,"\\n"],[41,[28,[37,22],["create policies"],null],[[[1," "],[8,[39,23],null,[["@text","@route"],["Create","dc.acls.policies.create"]],null],[1,"\\n"]],[]],null],[1," "]],[]]]]],[1,"\\n "],[8,[39,5],null,[["@name"],["toolbar"]],[["default"],[[[[1,"\\n"],[41,[28,[37,24],[[30,5,["length"]],0],null],[[[1," "],[8,[39,25],null,[["@partition","@search","@onsearch","@sort","@filter"],[[30,1,["params","partition"]],[99,26,["@search"]],[28,[37,13],[[30,0],[28,[37,14],[[33,26]],null]],[["value"],["target.value"]]],[30,3],[30,4]]],null],[1,"\\n"]],[]],null],[1," "]],[]]]]],[1,"\\n "],[8,[39,5],null,[["@name"],["content"]],[["default"],[[[[1,"\\n "],[8,[39,27],null,[["@type","@sort","@filters","@search","@items"],["policy",[30,3,["value"]],[30,4],[99,26,["@search"]],[30,5]]],[["default"],[[[[1,"\\n "],[8,[30,6,["Collection"]],null,null,[["default"],[[[[1,"\\n "],[8,[39,28],null,[["@items","@ondelete"],[[30,6,["items"]],[28,[37,29],["delete"],null]]],null],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[30,6,["Empty"]],null,null,[["default"],[[[[1,"\\n "],[8,[39,30],null,[["@login"],[[30,1,["model","app","login","open"]]]],[["default"],[[[[1,"\\n "],[8,[39,5],null,[["@name"],["header"]],[["default"],[[[[1,"\\n "],[10,"h2"],[12],[1,"\\n "],[1,[28,[35,31],["routes.dc.acls.policies.index.empty.header"],[["items"],[[30,5,["length"]]]]]],[1,"\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,5],null,[["@name"],["body"]],[["default"],[[[[1,"\\n "],[1,[28,[35,31],["routes.dc.acls.policies.index.empty.body"],[["items","htmlSafe"],[[30,5,["length"]],true]]]],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,5],null,[["@name"],["actions"]],[["default"],[[[[1,"\\n "],[10,"li"],[12],[1,"\\n "],[8,[39,32],null,[["@text","@href","@icon","@iconPosition","@size"],["Documentation on policies",[29,[[28,[37,33],["CONSUL_DOCS_URL"],null],"/commands/acl/policy"]],"docs-link","trailing","small"]],null],[1,"\\n "],[13],[1,"\\n "],[10,"li"],[12],[1,"\\n "],[8,[39,32],null,[["@text","@href","@icon","@iconPosition","@size"],["Take the tutorial",[29,[[28,[37,33],["CONSUL_LEARN_URL"],null],"/consul/security-networking/managing-acl-policies"]],"learn-link","trailing","small"]],null],[1,"\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n "]],[]]]]],[1,"\\n "]],[]]]]],[1,"\\n "]],[6]]]]],[1,"\\n "]],[]]]]],[1,"\\n "]],[]]]]],[1,"\\n\\n"]],[3,4,5]]],[1," "]],[]]]]],[1,"\\n "]],[2]]]]],[1,"\\n"]],[1]]]]]],["route","loader","sort","filters","items","collection"],false,["route","routeName","data-loader","uri","hash","block-slot","if","eq","consul/acl/disabled","app-error","let","or","sortBy","action","mut","kind","split","datacenter","not-eq","searchproperty","searchProperties","app-view","can","hds/button","gt","consul/policy/search-bar","search","data-collection","consul/policy/list","route-action","empty-state","t","hds/link/standalone","env"]]',moduleName:"consul-ui/templates/dc/acls/policies/index.hbs",isStrictMode:!1}) +e.default=n})),define("consul-ui/templates/dc/acls/roles/-form",["exports","@ember/template-factory"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +var n=(0,t.createTemplateFactory)({id:"V+NwcqN9",block:'[[[10,"form"],[12],[1,"\\n "],[8,[39,0],null,[["@form","@item","@dc","@nspace","@partition"],[[99,1,["@form"]],[99,2,["@item"]],[99,3,["@dc"]],[99,4,["@nspace"]],[99,5,["@partition"]]]],null],[1,"\\n"],[41,[28,[37,7],[[33,8]],null],[[[1," "],[8,[39,9],null,[["@src"],[[28,[37,10],["/${partition}/${nspace}/${dc}/tokens/for-role/${id}",[28,[37,11],null,[["partition","nspace","dc","id"],[[33,5],[33,4],[33,3],[28,[37,12],[[33,13],""],null]]]]],null]]],[["default"],[[[[1,"\\n"],[41,[28,[37,14],[[30,1,["data","length"]],0],null],[[[1," "],[10,"h2"],[12],[1,"Where is this role used?"],[13],[1,"\\n "],[10,2],[12],[1,"\\n We\'re only able to show information for the primary datacenter and the current datacenter. This list may not\\n show every case where this role is applied.\\n "],[13],[1,"\\n "],[8,[39,15],null,[["@caption","@items"],["Tokens",[30,1,["data"]]]],null],[1,"\\n"]],[]],null],[1," "]],[1]]]]],[1,"\\n"]],[]],null],[1," "],[10,0],[12],[1,"\\n "],[8,[39,16],null,null,[["default"],[[[[1,"\\n"],[41,[28,[37,17],[[33,8],[28,[37,18],["create roles"],null]],null],[[[1," "],[8,[39,19],[[16,"disabled",[28,[37,12],[[33,2,["isPristine"]],[33,2,["isInvalid"]],[28,[37,20],[[33,2,["Name"]],""],null]],null]],[24,4,"submit"],[4,[38,21],["click",[28,[37,22],["create",[33,2]],null]],null]],[["@text"],["Save"]],null],[1,"\\n"]],[]],[[[41,[28,[37,18],["write role"],[["item"],[[33,2]]]],[[[1," "],[8,[39,19],[[16,"disabled",[33,2,["isInvalid"]]],[24,4,"submit"],[4,[38,21],["click",[28,[37,22],["update",[33,2]],null]],null]],[["@text"],["Save"]],null],[1,"\\n"]],[]],null]],[]]],[1," "],[8,[39,19],[[24,4,"reset"],[4,[38,23],[[30,0],"cancel",[33,2]],null]],[["@text","@color"],["Cancel","secondary"]],null],[1,"\\n\\n"],[41,[28,[37,17],[[28,[37,7],[[33,8]],null],[28,[37,18],["delete role"],[["item"],[[33,2]]]]],null],[[[1," "],[8,[39,24],null,[["@message"],["Are you sure you want to delete this Role?"]],[["default"],[[[[1,"\\n "],[8,[39,25],null,[["@name"],["action"]],[["default"],[[[[1,"\\n "],[8,[39,19],[[4,[38,23],[[30,0],[30,2],"delete",[33,2]],null]],[["@text","@color"],["Delete","critical"]],null],[1,"\\n "]],[2]]]]],[1,"\\n "],[8,[39,25],null,[["@name"],["dialog"]],[["default"],[[[[1,"\\n"],[41,[28,[37,14],[[33,26,["length"]],0],null],[[[1," "],[8,[39,27],null,[["@onclose","@aria"],[[28,[37,23],[[30,0],[30,4]],null],[28,[37,11],null,[["label"],["Role in Use"]]]]],[["default"],[[[[1,"\\n "],[8,[39,25],null,[["@name"],["header"]],[["default"],[[[[1,"\\n "],[10,"h2"],[12],[1,"Role in Use"],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,25],null,[["@name"],["body"]],[["default"],[[[[1,"\\n "],[10,2],[12],[1,"\\n This Role is currently in use. If you choose to delete this Role, it will be removed from the\\n following "],[10,"strong"],[12],[1,[33,26,["length"]]],[1," Tokens"],[13],[1,":\\n "],[13],[1,"\\n "],[8,[39,15],null,[["@items","@target"],[[99,26,["@items"]],"_blank"]],null],[1,"\\n "],[10,2],[12],[1,"\\n This action cannot be undone. "],[1,[30,5]],[1,"\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,25],null,[["@name"],["actions"]],[["default"],[[[[1,"\\n "],[8,[39,16],null,null,[["default"],[[[[1,"\\n "],[8,[39,19],[[4,[38,23],[[30,0],[30,3]],null]],[["@text","@color"],["Yes, Delete","critical"]],null],[1,"\\n "],[8,[39,19],[[4,[38,23],[[30,0],[30,6]],null]],[["@text","@color"],["Cancel","secondary"]],null],[1,"\\n "]],[]]]]],[1,"\\n "]],[6]]]]],[1,"\\n "]],[]]]]],[1,"\\n"]],[]],[[[1," "],[8,[39,28],null,[["@message","@execute","@cancel"],[[30,5],[30,3],[30,4]]],null],[1,"\\n"]],[]]],[1," "]],[3,4,5]]]]],[1,"\\n "]],[]]]]],[1,"\\n"]],[]],null],[1," "]],[]]]]],[1,"\\n "],[13],[1,"\\n"],[13],[1,"\\n"]],["loader","confirm","execute","cancel","message","close"],false,["role-form","form","item","dc","nspace","partition","if","not","create","data-source","uri","hash","or","id","gt","token-list","hds/button-set","and","can","hds/button","eq","on","route-action","action","confirmation-dialog","block-slot","items","modal-dialog","delete-confirmation"]]',moduleName:"consul-ui/templates/dc/acls/roles/-form.hbs",isStrictMode:!1}) +e.default=n})),define("consul-ui/templates/dc/acls/roles/edit",["exports","@ember/template-factory"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +var n=(0,t.createTemplateFactory)({id:"J3r9dfLo",block:'[[[8,[39,0],null,[["@name"],[[99,1,["@name"]]]],[["default"],[[[[1,"\\n "],[8,[39,2],null,[["@src"],[[28,[37,3],["/${partition}/${nspace}/${dc}/role/${id}",[28,[37,4],null,[["partition","nspace","dc","id"],[[30,1,["params","partition"]],[30,1,["params","nspace"]],[30,1,["params","dc"]],[28,[37,5],[[30,1,["params","id"]],""],null]]]]],null]]],[["default"],[[[[1,"\\n\\n "],[8,[39,6],null,[["@name"],["error"]],[["default"],[[[[1,"\\n"],[41,[28,[37,8],[[30,2,["error","status"]],"401"],null],[[[1," "],[8,[39,9],null,null,null],[1,"\\n"]],[]],[[[1," "],[8,[39,10],null,[["@error","@login"],[[30,2,["error"]],[30,1,["model","app","login","open"]]]],null],[1,"\\n"]],[]]],[1," "]],[]]]]],[1,"\\n\\n "],[8,[39,6],null,[["@name"],["loaded"]],[["default"],[[[[1,"\\n"],[44,[[30,1,["params","dc"]],[30,1,["params","partition"]],[30,1,["params","nspace"]],[30,2,["data"]],[30,2,["data","isNew"]]],[[[1," "],[8,[39,12],null,[["@login"],[[30,1,["model","app","login","open"]]]],[["default"],[[[[1,"\\n "],[8,[39,6],null,[["@name"],["breadcrumbs"]],[["default"],[[[[1,"\\n "],[10,"ol"],[12],[1,"\\n "],[10,"li"],[12],[10,3],[15,6,[28,[37,13],["dc.acls.roles"],null]],[12],[1,"All Roles"],[13],[13],[1,"\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,6],null,[["@name"],["header"]],[["default"],[[[[1,"\\n "],[10,"h1"],[12],[1,"\\n"],[41,[30,7],[[[1," "],[8,[30,1,["Title"]],null,[["@title"],["New Role"]],null],[1,"\\n"]],[]],[[[1," "],[8,[30,1,["Title"]],null,[["@title"],["Edit Role"]],null],[1,"\\n"]],[]]],[1," "],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,6],null,[["@name"],["content"]],[["default"],[[[[1,"\\n"],[41,[28,[37,14],[[30,7]],null],[[[1," "],[10,0],[14,0,"definition-table"],[12],[1,"\\n "],[10,"dl"],[12],[1,"\\n "],[10,"dt"],[12],[1,"Role ID"],[13],[1,"\\n "],[10,"dd"],[12],[1,"\\n "],[8,[39,15],null,[["@value","@name"],[[30,6,["ID"]],"Role ID"]],null],[1,"\\n "],[13],[1,"\\n "],[13],[1,"\\n "],[13],[1,"\\n"]],[]],null],[1," "],[19,"dc/acls/roles/form",[1,2,3,4,5,6,7]],[1,"\\n "]],[]]]]],[1,"\\n "]],[]]]]],[1,"\\n"]],[3,4,5,6,7]]],[1," "]],[]]]]],[1,"\\n "]],[2]]]]],[1,"\\n"]],[1]]]]]],["route","loader","dc","partition","nspace","item","create"],true,["route","routeName","data-loader","uri","hash","or","block-slot","if","eq","consul/acl/disabled","app-error","let","app-view","href-to","not","copyable-code","partial"]]',moduleName:"consul-ui/templates/dc/acls/roles/edit.hbs",isStrictMode:!1}) +e.default=n})),define("consul-ui/templates/dc/acls/roles/index",["exports","@ember/template-factory"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +var n=(0,t.createTemplateFactory)({id:"nMIoNCst",block:'[[[8,[39,0],null,[["@name","@title"],[[99,1,["@name"]],"Roles"]],[["default"],[[[[1,"\\n "],[8,[39,2],null,[["@src"],[[28,[37,3],["/${partition}/${nspace}/${dc}/roles",[28,[37,4],null,[["partition","nspace","dc"],[[30,1,["params","partition"]],[30,1,["params","nspace"]],[30,1,["params","dc"]]]]]],null]]],[["default"],[[[[1,"\\n\\n "],[8,[39,5],null,[["@name"],["error"]],[["default"],[[[[1,"\\n"],[41,[28,[37,7],[[30,2,["error","status"]],"401"],null],[[[1," "],[8,[39,8],null,null,null],[1,"\\n"]],[]],[[[1," "],[8,[39,9],null,[["@error","@login"],[[30,2,["error"]],[30,1,["model","app","login","open"]]]],null],[1,"\\n"]],[]]],[1," "]],[]]]]],[1,"\\n\\n "],[8,[39,5],null,[["@name"],["loaded"]],[["default"],[[[[1,"\\n"],[44,[[28,[37,4],null,[["value","change"],[[28,[37,11],[[33,12],"Name:asc"],null],[28,[37,13],[[30,0],[28,[37,14],[[33,12]],null]],[["value"],["target.selected"]]]]]],[28,[37,4],null,[["searchproperty"],[[28,[37,4],null,[["value","change","default"],[[52,[28,[37,15],[[33,16],[27]],null],[28,[37,17],[[33,16],","],null],[33,18]],[28,[37,13],[[30,0],[28,[37,14],[[33,16]],null]],[["value"],["target.selectedItems"]]],[33,18]]]]]]],[30,2,["data"]]],[[[1,"\\n "],[8,[39,19],null,[["@login"],[[30,1,["model","app","login","open"]]]],[["default"],[[[[1,"\\n "],[8,[39,5],null,[["@name"],["header"]],[["default"],[[[[1,"\\n "],[10,"h1"],[12],[1,"\\n "],[8,[30,1,["Title"]],null,[["@title"],["Roles"]],null],[1,"\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,5],null,[["@name"],["actions"]],[["default"],[[[[1,"\\n"],[41,[28,[37,20],["create roles"],null],[[[1," "],[8,[39,21],null,[["@text","@route"],["Create","dc.acls.roles.create"]],null],[1,"\\n"]],[]],null],[1," "]],[]]]]],[1,"\\n "],[8,[39,5],null,[["@name"],["toolbar"]],[["default"],[[[[1,"\\n"],[41,[28,[37,22],[[30,5,["length"]],0],null],[[[1," "],[8,[39,23],null,[["@search","@onsearch","@sort","@filter"],[[99,24,["@search"]],[28,[37,13],[[30,0],[28,[37,14],[[33,24]],null]],[["value"],["target.value"]]],[30,3],[30,4]]],null],[1,"\\n"]],[]],null],[1," "]],[]]]]],[1,"\\n "],[8,[39,5],null,[["@name"],["content"]],[["default"],[[[[1,"\\n "],[8,[39,25],null,[["@type","@sort","@filters","@search","@items"],["role",[30,3,["value"]],[30,4],[99,24,["@search"]],[30,5]]],[["default"],[[[[1,"\\n "],[8,[30,6,["Collection"]],null,null,[["default"],[[[[1,"\\n "],[8,[39,26],null,[["@items","@ondelete"],[[30,6,["items"]],[28,[37,27],["delete"],null]]],null],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[30,6,["Empty"]],null,null,[["default"],[[[[1,"\\n "],[8,[39,28],null,[["@login"],[[30,1,["model","app","login","open"]]]],[["default"],[[[[1,"\\n "],[8,[39,5],null,[["@name"],["header"]],[["default"],[[[[1,"\\n "],[10,"h2"],[12],[1,"\\n "],[1,[28,[35,29],["routes.dc.acls.roles.index.empty.header"],[["items"],[[30,5,["length"]]]]]],[1,"\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,5],null,[["@name"],["body"]],[["default"],[[[[1,"\\n "],[1,[28,[35,29],["routes.dc.acls.roles.index.empty.body"],[["items","htmlSafe"],[[30,5,["length"]],true]]]],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,5],null,[["@name"],["actions"]],[["default"],[[[[1,"\\n "],[10,"li"],[12],[1,"\\n "],[8,[39,30],null,[["@text","@href","@icon","@iconPosition","@size"],["Documentation on roles",[29,[[28,[37,31],["CONSUL_DOCS_URL"],null],"/commands/acl/role"]],"docs-link","trailing","small"]],null],[1,"\\n "],[13],[1,"\\n "],[10,"li"],[12],[1,"\\n "],[8,[39,30],null,[["@text","@href","@icon","@iconPosition","@size"],["Read the API Docs",[29,[[28,[37,31],["CONSUL_DOCS_API_URL"],null],"/acl/roles.html"]],"learn-link","trailing","small"]],null],[1,"\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n "]],[]]]]],[1,"\\n "]],[]]]]],[1,"\\n "]],[6]]]]],[1,"\\n "]],[]]]]],[1,"\\n "]],[]]]]],[1,"\\n"]],[3,4,5]]],[1," "]],[]]]]],[1,"\\n "]],[2]]]]],[1,"\\n"]],[1]]]]]],["route","loader","sort","filters","items","collection"],false,["route","routeName","data-loader","uri","hash","block-slot","if","eq","consul/acl/disabled","app-error","let","or","sortBy","action","mut","not-eq","searchproperty","split","searchProperties","app-view","can","hds/button","gt","consul/role/search-bar","search","data-collection","consul/role/list","route-action","empty-state","t","hds/link/standalone","env"]]',moduleName:"consul-ui/templates/dc/acls/roles/index.hbs",isStrictMode:!1}) +e.default=n})),define("consul-ui/templates/dc/acls/tokens/-fieldsets-legacy",["exports","@ember/template-factory"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +var n=(0,t.createTemplateFactory)({id:"igHmo1ap",block:'[[[1," "],[10,"fieldset"],[15,"disabled",[52,[28,[37,1],[[28,[37,2],["write token"],[["item"],[[33,3]]]]],null],"disabled"]],[12],[1,"\\n "],[10,"label"],[15,0,[29,["type-text",[52,[33,3,["error","Name"]]," has-error"]]]],[12],[1,"\\n "],[10,1],[12],[1,"Name"],[13],[1,"\\n "],[8,[39,4],null,[["@value","@name","@autofocus"],[[33,3,["Description"]],"name","autofocus"]],null],[1,"\\n "],[13],[1,"\\n"],[41,false,[[[1," "],[10,0],[14,"role","radiogroup"],[15,0,[52,[33,3,["error","Type"]]," has-error"]],[12],[1,"\\n"],[42,[28,[37,6],[[28,[37,6],[[28,[37,7],["management","client"],null]],null]],null],null,[[[1," "],[10,"label"],[12],[1,"\\n "],[10,1],[12],[1,[28,[35,8],[[30,1]],null]],[13],[1,"\\n "],[10,"input"],[14,3,"Type"],[15,2,[29,[[30,1]]]],[15,"checked",[52,[28,[37,9],[[33,3,["Type"]],[30,1]],null],"checked"]],[15,"onchange",[28,[37,10],[[30,0],"change"],null]],[14,4,"radio"],[12],[13],[1,"\\n "],[13],[1,"\\n"]],[1]],null],[1," "],[13],[1,"\\n"]],[]],null],[1," "],[10,"label"],[14,0,"type-text"],[12],[1,"\\n "],[8,[39,11],null,[["@class","@name","@syntax","@value","@onkeyup"],[[52,[33,3,["error","Rules"]],"error"],"Rules","hcl",[33,3,["Rules"]],[28,[37,10],[[30,0],"change","Rules"],null]]],[["label"],[[[[1,"\\n Rules "],[10,3],[15,6,[29,[[28,[37,12],["CONSUL_DOCS_URL"],null],"/guides/acl.html#rule-specification"]]],[14,"rel","help noopener noreferrer"],[14,"target","_blank"],[12],[1,"(HCL Format)"],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[13],[1,"\\n"],[41,[33,13],[[[1," "],[10,"label"],[14,0,"type-text"],[12],[1,"\\n "],[10,1],[12],[1,"ID"],[13],[1,"\\n "],[8,[39,4],null,[["@value"],[[33,3,["ID"]]]],null],[1,"\\n "],[10,"em"],[12],[1,"We\'ll generate a UUID if this field is left empty."],[13],[1,"\\n "],[13],[1,"\\n"]],[]],null],[1," "],[13],[1,"\\n\\n"]],["type"],false,["if","not","can","item","input","each","-track-array","array","capitalize","eq","action","code-editor","env","create"]]',moduleName:"consul-ui/templates/dc/acls/tokens/-fieldsets-legacy.hbs",isStrictMode:!1}) +e.default=n})),define("consul-ui/templates/dc/acls/tokens/-fieldsets",["exports","@ember/template-factory"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +var n=(0,t.createTemplateFactory)({id:"DwYj+qxa",block:'[[[10,"fieldset"],[15,"disabled",[52,[28,[37,1],[[28,[37,2],["write token"],[["item"],[[33,3]]]]],null],"disabled"]],[12],[1,"\\n"],[41,[33,4],[[[1," "],[10,0],[14,0,"type-toggle"],[12],[1,"\\n "],[10,"label"],[12],[1,"\\n "],[10,"input"],[14,3,"Local"],[15,"checked",[52,[33,5],"checked"]],[15,"onchange",[28,[37,6],[[30,0],"change"],null]],[14,4,"checkbox"],[12],[13],[1,"\\n "],[10,1],[12],[1,"Restrict this token to a local datacenter?"],[13],[1,"\\n "],[13],[1,"\\n "],[10,"em"],[12],[1,"Local tokens get set in the Raft store of the local DC and do not ever get transmitted to the primary DC or replicated to any other DC."],[13],[1,"\\n "],[13],[1,"\\n"]],[]],null],[1," "],[10,"label"],[14,0,"type-text validate-optional"],[12],[1,"\\n "],[10,1],[12],[1,"Description (Optional)"],[13],[1,"\\n "],[10,"textarea"],[14,3,"Description"],[15,"oninput",[28,[37,6],[[30,0],"change"],null]],[12],[1,[33,3,["Description"]]],[13],[1,"\\n "],[13],[1,"\\n"],[13],[1,"\\n"],[10,"fieldset"],[14,1,"roles"],[12],[1,"\\n "],[10,"h2"],[12],[1,"Roles"],[13],[1,"\\n "],[8,[39,7],null,[["@disabled","@dc","@partition","@nspace","@items"],[[28,[37,1],[[28,[37,2],["write token"],[["item"],[[33,3]]]]],null],[99,8,["@dc"]],[99,9,["@partition"]],[99,10,["@nspace"]],[33,3,["Roles"]]]],null],[1,"\\n"],[13],[1,"\\n"],[10,"fieldset"],[14,1,"policies"],[12],[1,"\\n "],[10,"h2"],[12],[1,"Policies"],[13],[1,"\\n "],[8,[39,11],null,[["@disabled","@dc","@partition","@nspace","@items"],[[28,[37,1],[[28,[37,2],["write token"],[["item"],[[33,3]]]]],null],[99,8,["@dc"]],[99,9,["@partition"]],[99,10,["@nspace"]],[33,3,["Policies"]]]],null],[1,"\\n"],[13],[1,"\\n"]],[],false,["if","not","can","item","create","Local","action","role-selector","dc","partition","nspace","policy-selector"]]',moduleName:"consul-ui/templates/dc/acls/tokens/-fieldsets.hbs",isStrictMode:!1}) +e.default=n})),define("consul-ui/templates/dc/acls/tokens/-form",["exports","@ember/template-factory"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +var n=(0,t.createTemplateFactory)({id:"3VM7Ab9v",block:'[[[10,"form"],[12],[1,"\\n"],[41,[28,[37,1],[[28,[37,2],[[33,3]],null]],null],[[[1," "],[19,"dc/acls/tokens/fieldsets",[]],[1,"\\n"]],[]],[[[1," "],[19,"dc/acls/tokens/fieldsets-legacy",[]],[1,"\\n"]],[]]],[1," "],[10,0],[12],[1,"\\n "],[8,[39,5],null,null,[["default"],[[[[1,"\\n"],[41,[28,[37,6],[[33,7],[28,[37,8],["create tokens"],null]],null],[[[1," "],[8,[39,9],[[16,"disabled",[52,[28,[37,10],[[28,[37,6],[[28,[37,2],[[33,3]],null],[33,3,["isPristine"]]],null],[33,3,["isInvalid"]]],null],"disabled"]],[24,4,"submit"],[4,[38,11],["click",[28,[37,12],["create",[33,3]],null]],null]],[["@text"],["Save"]],null],[1,"\\n"]],[]],[[[41,[28,[37,8],["write token"],[["item"],[[33,3]]]],[[[1," "],[8,[39,9],[[16,"disabled",[52,[33,3,["isInvalid"]],"disabled"]],[24,4,"submit"],[4,[38,11],["click",[28,[37,12],["update",[33,3]],null]],null]],[["@text"],["Save"]],null],[1,"\\n"]],[]],null]],[]]],[1," "],[8,[39,9],[[24,4,"reset"],[4,[38,13],[[30,0],"cancel",[33,3]],null]],[["@text","@color"],["Cancel","secondary"]],null],[1,"\\n"],[41,[28,[37,6],[[28,[37,1],[[33,7]],null],[28,[37,8],["delete token"],[["item","token"],[[33,3],[33,14]]]]],null],[[[1," "],[8,[39,15],null,[["@message"],["Are you sure you want to delete this Token?"]],[["default"],[[[[1,"\\n "],[8,[39,16],null,[["@name"],["action"]],[["default"],[[[[1,"\\n "],[8,[39,9],[[4,[38,13],[[30,0],[30,1],"delete",[33,3]],null]],[["@text","@color"],["Delete","critical"]],null],[1,"\\n "]],[1]]]]],[1,"\\n "],[8,[39,16],null,[["@name"],["dialog"]],[["default"],[[[[1,"\\n "],[8,[39,17],null,[["@message","@execute","@cancel"],[[30,4],[30,2],[30,3]]],null],[1,"\\n "]],[2,3,4]]]]],[1,"\\n "]],[]]]]],[1,"\\n"]],[]],null],[1," "]],[]]]]],[1,"\\n "],[13],[1,"\\n"],[13],[1,"\\n"]],["confirm","execute","cancel","message"],true,["if","not","token/is-legacy","item","partial","hds/button-set","and","create","can","hds/button","or","on","route-action","action","token","confirmation-dialog","block-slot","delete-confirmation"]]',moduleName:"consul-ui/templates/dc/acls/tokens/-form.hbs",isStrictMode:!1}) +e.default=n})),define("consul-ui/templates/dc/acls/tokens/edit",["exports","@ember/template-factory"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +var n=(0,t.createTemplateFactory)({id:"VqbRsph6",block:'[[[8,[39,0],null,[["@name"],[[99,1,["@name"]]]],[["default"],[[[[1,"\\n "],[8,[39,2],null,[["@src"],[[28,[37,3],["/${partition}/${nspace}/${dc}/token/${id}",[28,[37,4],null,[["partition","nspace","dc","id"],[[30,1,["params","partition"]],[30,1,["params","nspace"]],[30,1,["params","dc"]],[28,[37,5],[[30,1,["params","id"]],""],null]]]]],null]]],[["default"],[[[[1,"\\n\\n "],[8,[39,6],null,[["@name"],["error"]],[["default"],[[[[1,"\\n"],[41,[28,[37,8],[[30,2,["error","status"]],"401"],null],[[[1," "],[8,[39,9],null,null,null],[1,"\\n"]],[]],[[[1," "],[8,[39,10],null,[["@error","@login"],[[30,2,["error"]],[30,1,["model","app","login","open"]]]],null],[1,"\\n"]],[]]],[1," "]],[]]]]],[1,"\\n\\n "],[8,[39,6],null,[["@name"],["loaded"]],[["default"],[[[[1,"\\n"],[44,[[30,1,["params","dc"]],[30,1,["params","partition"]],[30,1,["params","nspace"]],[30,2,["data"]],[30,2,["data","isNew"]]],[[[1," "],[8,[39,12],null,[["@login"],[[30,1,["model","app","login","open"]]]],[["default"],[[[[1,"\\n "],[8,[39,6],null,[["@name"],["breadcrumbs"]],[["default"],[[[[1,"\\n "],[10,"ol"],[12],[1,"\\n "],[10,"li"],[12],[10,3],[15,6,[28,[37,13],["dc.acls.tokens"],null]],[12],[1,"All Tokens"],[13],[13],[1,"\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,6],null,[["@name"],["header"]],[["default"],[[[[1,"\\n "],[10,"h1"],[12],[1,"\\n"],[41,[30,7],[[[1," "],[8,[30,1,["Title"]],null,[["@title"],["New Token"]],null],[1,"\\n"]],[]],[[[1," "],[8,[30,1,["Title"]],null,[["@title"],["Edit Token"]],null],[1,"\\n"]],[]]],[1," "],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,6],null,[["@name"],["actions"]],[["default"],[[[[1,"\\n"],[41,[28,[37,14],[[30,7]],null],[[[1," "],[8,[39,15],null,null,[["default"],[[[[1,"\\n"],[41,[28,[37,16],[[30,6,["AccessorID"]],[33,17,["AccessorID"]]],null],[[[1," "],[8,[39,18],null,[["@message"],["Are you sure you want to use this ACL token?"]],[["default"],[[[[1,"\\n "],[8,[39,6],null,[["@name"],["action"]],[["default"],[[[[1,"\\n "],[8,[39,19],[[4,[38,20],[[30,0],[30,8],"use",[30,6]],null]],[["@text","@color"],["Use","secondary"]],null],[1,"\\n "]],[8]]]]],[1,"\\n "],[8,[39,6],null,[["@name"],["dialog"]],[["default"],[[[[1,"\\n "],[10,2],[12],[1,"\\n "],[1,[30,11]],[1,"\\n "],[13],[1,"\\n "],[8,[39,15],null,null,[["default"],[[[[1,"\\n "],[8,[39,19],[[4,[38,20],[[30,0],[30,9]],null]],[["@text","@color"],["Confirm Use","critical"]],null],[1,"\\n "],[8,[39,19],[[4,[38,20],[[30,0],[30,10]],null]],[["@text","@color"],["Cancel","secondary"]],null],[1,"\\n "]],[]]]]],[1,"\\n "]],[9,10,11]]]]],[1,"\\n "]],[]]]]],[1,"\\n"]],[]],null],[41,[28,[37,21],["duplicate token"],[["item"],[[30,6]]]],[[[1," "],[8,[39,19],[[4,[38,20],[[30,0],"clone",[30,6]],null]],[["@text","@color"],["Duplicate","secondary"]],null],[1,"\\n"]],[]],null],[1," "]],[]]]]],[1,"\\n"]],[]],null],[1," "]],[]]]]],[1,"\\n "],[8,[39,6],null,[["@name"],["content"]],[["default"],[[[[1,"\\n"],[41,[28,[37,22],[[30,6]],null],[[[1," "],[8,[39,23],[[24,0,"mb-6"]],[["@type"],["inline"]],[["default"],[[[[1,"\\n "],[8,[30,12,["Title"]],null,null,[["default"],[[[[1,"Update"]],[]]]]],[1,"\\n "],[8,[30,12,["Description"]],null,null,[["default"],[[[[1,"We have upgraded our ACL system by allowing you to create reusable policies which you can then apply to tokens. Don\'t worry, even though this token was written in the old style, it is still valid. However, we do recommend upgrading your old tokens to the new style."]],[]]]]],[1,"\\n "],[8,[30,12,["Link::Standalone"]],null,[["@text","@href","@icon","@iconPosition"],["Learn more",[29,[[28,[37,24],["CONSUL_DOCS_URL"],null],"/guides/acl-migrate-tokens.html"]],"docs-link","trailing"]],null],[1,"\\n "]],[12]]]]],[1,"\\n"]],[]],null],[41,[28,[37,14],[[30,7]],null],[[[1," "],[10,0],[14,0,"definition-table"],[12],[1,"\\n "],[10,"dl"],[12],[1,"\\n "],[10,"dt"],[12],[1,"AccessorID"],[13],[1,"\\n "],[10,"dd"],[12],[1,"\\n "],[8,[39,25],null,[["@value","@name"],[[30,6,["AccessorID"]],"AccessorID"]],null],[1,"\\n "],[13],[1,"\\n "],[10,"dt"],[12],[1,"Token"],[13],[1,"\\n "],[10,"dd"],[12],[1,"\\n "],[8,[39,25],null,[["@obfuscated","@value","@name"],[true,[30,6,["SecretID"]],"Token"]],null],[1,"\\n "],[13],[1,"\\n"],[41,[28,[37,26],[[28,[37,14],[[28,[37,22],[[30,6]],null]],null],[28,[37,14],[[30,7]],null]],null],[[[1," "],[10,"dt"],[12],[1,"Scope"],[13],[1,"\\n "],[10,"dd"],[12],[1,"\\n "],[1,[52,[30,6,["Local"]],"local","global"]],[1,"\\n "],[13],[1,"\\n"]],[]],null],[1," "],[13],[1,"\\n "],[13],[1,"\\n"]],[]],null],[1," "],[19,"dc/acls/tokens/form",[1,2,3,4,5,6,7]],[1,"\\n "]],[]]]]],[1,"\\n "]],[]]]]],[1,"\\n"]],[3,4,5,6,7]]],[1," "]],[]]]]],[1,"\\n "]],[2]]]]],[1,"\\n"]],[1]]]]]],["route","loader","dc","partition","nspace","item","create","confirm","execute","cancel","message","A"],true,["route","routeName","data-loader","uri","hash","or","block-slot","if","eq","consul/acl/disabled","app-error","let","app-view","href-to","not","hds/button-set","not-eq","token","confirmation-dialog","hds/button","action","can","token/is-legacy","hds/alert","env","copyable-code","and","partial"]]',moduleName:"consul-ui/templates/dc/acls/tokens/edit.hbs",isStrictMode:!1}) +e.default=n})),define("consul-ui/templates/dc/acls/tokens/index",["exports","@ember/template-factory"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +var n=(0,t.createTemplateFactory)({id:"vndZHRNu",block:'[[[8,[39,0],null,[["@name"],[[99,1,["@name"]]]],[["default"],[[[[1,"\\n "],[8,[39,2],null,[["@src"],[[28,[37,3],["/${partition}/${nspace}/${dc}/tokens",[28,[37,4],null,[["partition","nspace","dc"],[[30,1,["params","partition"]],[30,1,["params","nspace"]],[30,1,["params","dc"]]]]]],null]]],[["default"],[[[[1,"\\n\\n "],[8,[39,5],null,[["@name"],["error"]],[["default"],[[[[1,"\\n"],[41,[28,[37,7],[[30,2,["error","status"]],"401"],null],[[[1," "],[8,[39,8],null,null,null],[1,"\\n"]],[]],[[[1," "],[8,[39,9],null,[["@error","@login"],[[30,2,["error"]],[30,1,["model","app","login","open"]]]],null],[1,"\\n"]],[]]],[1," "]],[]]]]],[1,"\\n\\n "],[8,[39,5],null,[["@name"],["loaded"]],[["default"],[[[[1,"\\n"],[44,[[28,[37,4],null,[["value","change"],[[28,[37,11],[[33,12],"CreateTime:desc"],null],[28,[37,13],[[30,0],[28,[37,14],[[33,12]],null]],[["value"],["target.selected"]]]]]],[28,[37,4],null,[["kind","searchproperty"],[[28,[37,4],null,[["value","change"],[[52,[33,15],[28,[37,16],[[33,15],","],null],[27]],[28,[37,13],[[30,0],[28,[37,14],[[33,15]],null]],[["value"],["target.selectedItems"]]]]]],[28,[37,4],null,[["value","change","default"],[[52,[28,[37,17],[[33,18],[27]],null],[28,[37,16],[[33,18],","],null],[33,19]],[28,[37,13],[[30,0],[28,[37,14],[[33,18]],null]],[["value"],["target.selectedItems"]]],[33,19]]]]]]],[30,2,["data"]]],[[[1,"\\n "],[8,[39,20],null,[["@login"],[[30,1,["model","app","login","open"]]]],[["default"],[[[[1,"\\n "],[8,[39,5],null,[["@name"],["header"]],[["default"],[[[[1,"\\n "],[10,"h1"],[12],[1,"\\n "],[8,[30,1,["Title"]],null,[["@title"],["Tokens"]],null],[1,"\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,5],null,[["@name"],["actions"]],[["default"],[[[[1,"\\n"],[41,[28,[37,21],["create tokens"],null],[[[1," "],[8,[39,22],null,[["@text","@route"],["Create","dc.acls.tokens.create"]],null],[1,"\\n"]],[]],null],[1," "]],[]]]]],[1,"\\n "],[8,[39,5],null,[["@name"],["toolbar"]],[["default"],[[[[1,"\\n"],[41,[28,[37,23],[[30,5,["length"]],0],null],[[[1," "],[8,[39,24],null,[["@search","@onsearch","@sort","@filter"],[[99,25,["@search"]],[28,[37,13],[[30,0],[28,[37,14],[[33,25]],null]],[["value"],["target.value"]]],[30,3],[30,4]]],null],[1,"\\n"]],[]],null],[1," "]],[]]]]],[1,"\\n "],[8,[39,5],null,[["@name"],["content"]],[["default"],[[[[1,"\\n"],[41,[28,[37,26],[[30,5]],null],[[[1," "],[8,[39,27],[[24,0,"mb-3 mt-3"]],[["@type"],["inline"]],[["default"],[[[[1,"\\n "],[8,[30,6,["Title"]],null,null,[["default"],[[[[1,"Update"]],[]]]]],[1,"\\n "],[8,[30,6,["Description"]],null,null,[["default"],[[[[1,"We have upgraded our ACL System to allow the creation of reusable policies that can be applied to tokens. Read more about the changes and how to upgrade legacy tokens."]],[]]]]],[1,"\\n "],[8,[30,6,["Link::Standalone"]],null,[["@text","@href","@icon","@iconPosition"],["Learn more",[29,[[28,[37,28],["CONSUL_DOCS_URL"],null],"/guides/acl-migrate-tokens.html"]],"docs-link","trailing"]],null],[1,"\\n "]],[6]]]]],[1,"\\n"]],[]],null],[1," "],[8,[39,29],null,[["@type","@sort","@filters","@search","@items"],["token",[30,3,["value"]],[30,4],[99,25,["@search"]],[30,5]]],[["default"],[[[[1,"\\n "],[8,[30,7,["Collection"]],null,null,[["default"],[[[[1,"\\n "],[8,[39,30],null,[["@items","@token","@onuse","@ondelete","@onlogout","@onclone"],[[30,7,["items"]],[30,1,["model","user","token"]],[28,[37,31],["use"],null],[28,[37,31],["delete"],null],[28,[37,31],["logout"],null],[28,[37,31],["clone"],null]]],null],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[30,7,["Empty"]],null,null,[["default"],[[[[1,"\\n "],[8,[39,32],null,[["@login"],[[30,1,["model","app","login","open"]]]],[["default"],[[[[1,"\\n "],[8,[39,5],null,[["@name"],["header"]],[["default"],[[[[1,"\\n "],[10,"h2"],[12],[1,"\\n "],[1,[28,[35,33],["routes.dc.acls.tokens.index.empty.header"],[["items"],[[30,5,["length"]]]]]],[1,"\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,5],null,[["@name"],["body"]],[["default"],[[[[1,"\\n "],[1,[28,[35,33],["routes.dc.acls.tokens.index.empty.body"],[["items","htmlSafe"],[[30,5,["length"]],true]]]],[1,"\\n "]],[]]]]],[1,"\\n "]],[]]]]],[1,"\\n "]],[]]]]],[1,"\\n "]],[7]]]]],[1,"\\n "]],[]]]]],[1,"\\n "]],[]]]]],[1,"\\n"]],[3,4,5]]],[1," "]],[]]]]],[1,"\\n "]],[2]]]]],[1,"\\n"]],[1]]]]],[1,"\\n"]],["route","loader","sort","filters","items","A","collection"],false,["route","routeName","data-loader","uri","hash","block-slot","if","eq","consul/acl/disabled","app-error","let","or","sortBy","action","mut","kind","split","not-eq","searchproperty","searchProperties","app-view","can","hds/button","gt","consul/token/search-bar","search","token/is-legacy","hds/alert","env","data-collection","consul/token/list","route-action","empty-state","t"]]',moduleName:"consul-ui/templates/dc/acls/tokens/index.hbs",isStrictMode:!1}) +e.default=n})),define("consul-ui/templates/dc/intentions/edit",["exports","@ember/template-factory"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +var n=(0,t.createTemplateFactory)({id:"APCDJQ0j",block:'[[[8,[39,0],null,[["@name"],[[99,1,["@name"]]]],[["default"],[[[[1,"\\n "],[8,[39,2],null,[["@src"],[[28,[37,3],["/${partition}/${nspace}/${dc}/intention/${id}",[28,[37,4],null,[["partition","nspace","dc","id"],[[30,1,["params","partition"]],[30,1,["params","nspace"]],[30,1,["params","dc"]],[28,[37,5],[[30,1,["params","intention_id"]],""],null]]]]],null]]],[["default"],[[[[1,"\\n\\n "],[8,[39,6],null,[["@name"],["error"]],[["default"],[[[[1,"\\n "],[8,[39,7],null,[["@error","@login"],[[30,2,["error"]],[30,1,["model","app","login","open"]]]],null],[1,"\\n "]],[]]]]],[1,"\\n\\n "],[8,[39,6],null,[["@name"],["loaded"]],[["default"],[[[[1,"\\n"],[44,[[30,2,["data"]],[28,[37,9],[[28,[37,10],["write intention"],[["item"],[[30,2,["data"]]]]]],null]],[[[1," "],[8,[39,11],null,null,[["default"],[[[[1,"\\n "],[8,[39,6],null,[["@name"],["breadcrumbs"]],[["default"],[[[[1,"\\n "],[10,"ol"],[12],[1,"\\n "],[10,"li"],[12],[10,3],[15,6,[28,[37,12],["dc.intentions"],null]],[12],[1,"All Intentions"],[13],[13],[1,"\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,6],null,[["@name"],["header"]],[["default"],[[[[1,"\\n "],[10,"h1"],[12],[1,"\\n"],[41,[28,[37,9],[[30,4]],null],[[[41,[30,3,["ID"]],[[[1," "],[8,[30,1,["Title"]],null,[["@title"],["Edit Intention"]],null],[1,"\\n"]],[]],[[[1," "],[8,[30,1,["Title"]],null,[["@title"],["New Intention"]],null],[1,"\\n"]],[]]]],[]],[[[1," "],[8,[30,1,["Title"]],null,[["@title"],["View Intention"]],null],[1,"\\n"]],[]]],[1," "],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,6],null,[["@name"],["content"]],[["default"],[[[[1,"\\n "],[8,[39,14],null,[["@readonly","@item","@dc","@nspace","@partition","@onsubmit"],[[30,4],[30,3],[30,1,["model","dc"]],[30,1,["params","nspace"]],[30,1,["params","partition"]],[28,[37,15],["transitionTo","dc.intentions.index",[28,[37,4],null,[["dc"],[[30,1,["params","dc"]]]]]],null]]],null],[1,"\\n "]],[]]]]],[1,"\\n "]],[]]]]],[1,"\\n"]],[3,4]]],[1," "]],[]]]]],[1,"\\n"]],[2]]]]],[1,"\\n"]],[1]]]]]],["route","loader","item","readOnly"],false,["route","routeName","data-loader","uri","hash","or","block-slot","app-error","let","not","can","app-view","href-to","if","consul/intention/form","route-action"]]',moduleName:"consul-ui/templates/dc/intentions/edit.hbs",isStrictMode:!1}) +e.default=n})),define("consul-ui/templates/dc/intentions/index",["exports","@ember/template-factory"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +var n=(0,t.createTemplateFactory)({id:"MRCKg8a1",block:'[[[8,[39,0],null,[["@name"],[[99,1,["@name"]]]],[["default"],[[[[1,"\\n "],[8,[39,2],null,[["@src"],[[28,[37,3],["/${partition}/${nspace}/${dc}/intentions",[28,[37,4],null,[["partition","nspace","dc"],[[30,1,["params","partition"]],[30,1,["params","nspace"]],[30,1,["params","dc"]]]]]],null]]],[["default"],[[[[1,"\\n\\n "],[8,[39,5],null,[["@name"],["error"]],[["default"],[[[[1,"\\n "],[8,[39,6],null,[["@error","@login"],[[30,2,["error"]],[30,1,["model","app","login","open"]]]],null],[1,"\\n "]],[]]]]],[1,"\\n\\n "],[8,[39,5],null,[["@name"],["loaded"]],[["default"],[[[[1,"\\n"],[44,[[28,[37,4],null,[["value","change"],[[28,[37,8],[[33,9],"Action:asc"],null],[28,[37,10],[[30,0],[28,[37,11],[[33,9]],null]],[["value"],["target.selected"]]]]]],[28,[37,4],null,[["access","searchproperty"],[[28,[37,4],null,[["value","change"],[[52,[33,13],[28,[37,14],[[33,13],","],null],[27]],[28,[37,10],[[30,0],[28,[37,11],[[33,13]],null]],[["value"],["target.selectedItems"]]]]]],[28,[37,4],null,[["value","change","default"],[[52,[28,[37,15],[[33,16],[27]],null],[28,[37,14],[[33,16],","],null],[33,17]],[28,[37,10],[[30,0],[28,[37,11],[[33,16]],null]],[["value"],["target.selectedItems"]]],[33,17]]]]]]],[30,2,["data"]]],[[[1,"\\n "],[8,[39,18],null,null,[["default"],[[[[1,"\\n "],[8,[39,5],null,[["@name"],["header"]],[["default"],[[[[1,"\\n "],[10,"h1"],[12],[1,"\\n "],[8,[30,1,["Title"]],null,[["@title"],["Intentions"]],null],[1," "],[10,"em"],[12],[1,[28,[35,19],[[30,5,["length"]]],null]],[1," total"],[13],[1,"\\n "],[13],[1,"\\n "],[10,"label"],[14,"for","toolbar-toggle"],[12],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,5],null,[["@name"],["actions"]],[["default"],[[[[1,"\\n"],[41,[28,[37,20],["create intentions"],null],[[[1," "],[8,[39,21],null,[["@text","@route"],["Create","dc.intentions.create"]],null],[1,"\\n"]],[]],null],[1," "]],[]]]]],[1,"\\n "],[8,[39,5],null,[["@name"],["toolbar"]],[["default"],[[[[1,"\\n\\n"],[41,[28,[37,22],[[30,5,["length"]],0],null],[[[1," "],[8,[39,23],null,[["@search","@onsearch","@sort","@filter"],[[99,24,["@search"]],[28,[37,10],[[30,0],[28,[37,11],[[33,24]],null]],[["value"],["target.value"]]],[30,3],[30,4]]],null],[1,"\\n"]],[]],null],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,5],null,[["@name"],["content"]],[["default"],[[[[1,"\\n "],[8,[39,25],null,[["@sink","@type","@ondelete"],[[28,[37,3],["/${partition}/${dc}/${nspace}/intention/",[28,[37,4],null,[["partition","nspace","dc"],[[30,1,["params","partition"]],[30,1,["params","nspace"]],[30,1,["params","dc"]]]]]],null],"intention",[99,26,["@ondelete"]]]],[["default"],[[[[1,"\\n "],[8,[39,5],null,[["@name"],["content"]],[["default"],[[[[1,"\\n "],[8,[39,27],null,[["@type","@sort","@filters","@search","@items"],["intention",[30,3,["value"]],[30,4],[99,24,["@search"]],[30,5]]],[["default"],[[[[1,"\\n "],[8,[30,7,["Collection"]],null,null,[["default"],[[[[1,"\\n "],[8,[39,28],null,[["@items","@delete"],[[30,7,["items"]],[30,6,["delete"]]]],[["default"],[[[[1,"\\n "],[8,[30,8,["CustomResourceNotice"]],null,null,null],[1,"\\n "],[8,[30,8,["Table"]],null,null,null],[1,"\\n "]],[8]]]]],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[30,7,["Empty"]],null,null,[["default"],[[[[1,"\\n "],[8,[39,29],null,[["@login"],[[30,1,["model","app","login","open"]]]],[["default"],[[[[1,"\\n "],[8,[39,5],null,[["@name"],["header"]],[["default"],[[[[1,"\\n "],[10,"h2"],[12],[1,"\\n "],[1,[28,[35,30],["routes.dc.intentions.index.empty.header"],[["items"],[[30,5,["length"]]]]]],[1,"\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,5],null,[["@name"],["body"]],[["default"],[[[[1,"\\n "],[1,[28,[35,30],["routes.dc.intentions.index.empty.body"],[["items","canUseACLs","htmlSafe"],[[30,5,["length"]],[28,[37,20],["use acls"],null],true]]]],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,5],null,[["@name"],["actions"]],[["default"],[[[[1,"\\n "],[10,"li"],[12],[1,"\\n "],[8,[39,31],null,[["@text","@href","@icon","@iconPosition","@size"],["Documentation on intentions",[29,[[28,[37,32],["CONSUL_DOCS_URL"],null],"/commands/intention"]],"docs-link","trailing","small"]],null],[1,"\\n "],[13],[1,"\\n "],[10,"li"],[12],[1,"\\n "],[8,[39,31],null,[["@text","@href","@icon","@iconPosition","@size"],["Take the tutorial",[29,[[28,[37,32],["CONSUL_DOCS_LEARN_URL"],null],"/consul/getting-started/connect"]],"learn-link","trailing","small"]],null],[1,"\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n "]],[]]]]],[1,"\\n "]],[]]]]],[1,"\\n "]],[7]]]]],[1,"\\n "]],[]]]]],[1,"\\n "]],[6]]]]],[1,"\\n "]],[]]]]],[1,"\\n "]],[]]]]],[1,"\\n\\n"]],[3,4,5]]],[1," "]],[]]]]],[1,"\\n "]],[2]]]]],[1,"\\n"]],[1]]]]]],["route","api","sort","filters","items","writer","collection","list"],false,["route","routeName","data-loader","uri","hash","block-slot","app-error","let","or","sortBy","action","mut","if","access","split","not-eq","searchproperty","searchProperties","app-view","format-number","can","hds/button","gt","consul/intention/search-bar","search","data-writer","refresh-route","data-collection","consul/intention/list","empty-state","t","hds/link/standalone","env"]]',moduleName:"consul-ui/templates/dc/intentions/index.hbs",isStrictMode:!1}) +e.default=n})),define("consul-ui/templates/dc/kv/edit",["exports","@ember/template-factory"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +var n=(0,t.createTemplateFactory)({id:"OKjbKUH/",block:'[[[8,[39,0],null,[["@name"],[[99,1,["@name"]]]],[["default"],[[[[1,"\\n\\n"],[44,["/"],[[[1,"\\n"],[44,[[28,[37,3],[[28,[37,4],[[30,2],[28,[37,5],[0,-1,[28,[37,6],[[30,1,["params","key"]],[30,2]],null]],null]],null],[30,2]],null]],[[[1,"\\n "],[8,[39,7],null,[["@src"],[[28,[37,8],["/${partition}/${nspace}/${dc}/kv/${key}",[28,[37,9],null,[["partition","nspace","dc","key"],[[30,1,["params","partition"]],[30,1,["params","nspace"]],[30,1,["params","dc"]],[52,[28,[37,11],[[33,1],"create"],null],"",[30,1,["params","key"]]]]]]],null]]],[["default"],[[[[1,"\\n\\n "],[8,[39,12],null,[["@name"],["error"]],[["default"],[[[[1,"\\n "],[8,[39,13],null,[["@error","@login"],[[30,4,["error"]],[30,1,["model","app","login","open"]]]],null],[1,"\\n "]],[]]]]],[1,"\\n\\n "],[8,[39,12],null,[["@name"],["loaded"]],[["default"],[[[[1,"\\n"],[44,[[30,1,["params","dc"]],[30,1,["params","partition"]],[30,1,["params","nspace"]],[30,4,["data"]]],[[[1,"\\n "],[8,[39,14],null,null,[["default"],[[[[1,"\\n\\n "],[8,[39,12],null,[["@name"],["breadcrumbs"]],[["default"],[[[[1,"\\n "],[10,"ol"],[12],[1,"\\n "],[10,"li"],[12],[1,"\\n "],[8,[39,15],null,[["@href"],[[28,[37,16],["dc.kv.index"],null]]],[["default"],[[[[1,"\\n Key / Values\\n "]],[]]]]],[1,"\\n "],[13],[1,"\\n"],[41,[28,[37,17],[[30,3],[30,2]],null],[[[1,"\\n"],[44,[[28,[37,6],[[30,3],[30,2]],null]],[[[1,"\\n"],[42,[28,[37,19],[[28,[37,19],[[30,9]],null]],null],null,[[[41,[28,[37,20],[[30,10,["length"]],0],null],[[[1," "],[10,"li"],[12],[1,"\\n "],[8,[39,15],[[4,[38,15],[[30,0],[30,10]],null]],[["@href"],[[28,[37,16],["dc.kv.folder",[28,[37,4],["/",[28,[37,21],[[28,[37,5],[0,[28,[37,22],[[30,11],1],null],[30,9]],null],""],null]],null]],null]]],[["default"],[[[[1,"\\n "],[1,[30,10]],[1,"\\n "]],[]]]]],[1,"\\n "],[13],[1,"\\n"]],[]],null]],[10,11]],null]],[9]]],[1,"\\n"]],[]],null],[1," "],[13],[1,"\\n "]],[]]]]],[1,"\\n\\n "],[8,[39,12],null,[["@name"],["header"]],[["default"],[[[[1,"\\n "],[10,"h1"],[12],[1,"\\n"],[41,[28,[37,23],[[30,8,["Key"]],[28,[37,17],[[30,8,["Key"]],[30,3]],null]],null],[[[1," "],[8,[30,1,["Title"]],null,[["@title","@render"],["Edit Key / Value",false]],null],[1,"\\n "],[1,[28,[35,24],[[30,8,["Key"]],[30,3]],null]],[1,"\\n"]],[]],[[[1," "],[8,[30,1,["Title"]],null,[["@title","@render"],["New Key / Value",true]],null],[1,"\\n"]],[]]],[1," "],[13],[1,"\\n "]],[]]]]],[1,"\\n\\n "],[8,[39,12],null,[["@name"],["content"]],[["default"],[[[[1,"\\n\\n"],[41,[30,8,["Session"]],[[[1," "],[8,[39,25],null,[["@type"],["kv"]],null],[1,"\\n"]],[]],null],[1,"\\n "],[8,[39,26],null,[["@item","@dc","@nspace","@partition","@onsubmit","@parent"],[[30,8],[30,1,["params","dc"]],[30,1,["params","nspace"]],[30,1,["params","partition"]],[52,[28,[37,27],[[30,3],[30,2]],null],[28,[37,28],["dc.kv.index"],null],[28,[37,28],["dc.kv.folder",[30,3]],null]],[30,3]]],null],[1,"\\n\\n\\n"],[41,[28,[37,23],[[30,8,["Session"]]],null],[[[1," "],[8,[39,29],null,[["@src","@onchange"],[[28,[37,8],["/${partition}/${nspace}/${dc}/sessions/for-key/${id}",[28,[37,9],null,[["partition","nspace","dc","id"],[[30,1,["params","partition"]],[30,1,["params","nspace"]],[30,1,["params","dc"]],[30,8,["Session"]]]]]],null],[28,[37,15],[[30,0],[28,[37,30],[[33,31]],null]],[["value"],["data"]]]]],null],[1,"\\n "],[10,"h2"],[12],[1,"\\n "],[8,[39,15],[[24,"rel","help"]],[["@href","@external"],[[28,[37,3],[[28,[37,32],["CONSUL_DOCS_URL"],null],"/internals/sessions.html#session-design"],null],true]],[["default"],[[[[1,"\\n Lock Session\\n "]],[]]]]],[1,"\\n "],[13],[1,"\\n"],[41,[33,31,["ID"]],[[[1," "],[8,[39,33],null,[["@item","@ondelete"],[[99,31,["@item"]],[30,4,["invalidate"]]]],null],[1,"\\n"]],[]],null]],[]],null],[1,"\\n "]],[]]]]],[1,"\\n "]],[]]]]],[1,"\\n"]],[5,6,7,8]]],[1," "]],[]]]]],[1,"\\n "]],[4]]]]],[1,"\\n"]],[3]]]],[2]]]],[1]]]]],[1,"\\n"]],["route","separator","parentKey","loader","dc","partition","nspace","item","parts","breadcrumb","index"],false,["route","routeName","let","concat","join","slice","split","data-loader","uri","hash","if","string-ends-with","block-slot","app-error","app-view","action","href-to","not-eq","each","-track-array","gt","append","add","and","left-trim","consul/lock-session/notifications","consul/kv/form","eq","transition-to","data-source","mut","session","env","consul/lock-session/form"]]',moduleName:"consul-ui/templates/dc/kv/edit.hbs",isStrictMode:!1}) +e.default=n})),define("consul-ui/templates/dc/kv/index",["exports","@ember/template-factory"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +var n=(0,t.createTemplateFactory)({id:"Vj7yxEy8",block:'[[[8,[39,0],null,[["@name"],[[99,1,["@name"]]]],[["default"],[[[[1,"\\n "],[8,[39,2],null,[["@src","@onchange"],[[28,[37,3],["/${partition}/${nspace}/${dc}/kv/${key}",[28,[37,4],null,[["partition","nspace","dc","key"],[[30,1,["params","partition"]],[30,1,["params","nspace"]],[30,1,["params","dc"]],[28,[37,5],[[30,1,["params","key"]],"/"],null]]]]],null],[28,[37,6],[[30,0],[28,[37,7],[[33,8]],null]],[["value"],["data"]]]]],null],[1,"\\n "],[8,[39,9],null,[["@src"],[[28,[37,3],["/${partition}/${nspace}/${dc}/kvs/${key}",[28,[37,4],null,[["partition","nspace","dc","key"],[[30,1,["params","partition"]],[30,1,["params","nspace"]],[30,1,["params","dc"]],[28,[37,5],[[30,1,["params","key"]],"/"],null]]]]],null]]],[["default"],[[[[1,"\\n\\n "],[8,[39,10],null,[["@name"],["error"]],[["default"],[[[[1,"\\n "],[8,[39,11],null,[["@error","@login"],[[30,2,["error"]],[30,1,["model","app","login","open"]]]],null],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,10],null,[["@name"],["disconnected"]],[["default"],[[[[1,"\\n"],[41,[28,[37,13],[[30,2,["error","status"]],"404"],null],[[[1," "],[8,[39,14],[[4,[38,15],null,[["sticky"],[true]]]],[["@color"],["warning"]],[["default"],[[[[1,"\\n "],[8,[30,4,["Title"]],null,null,[["default"],[[[[1,"Warning!"]],[]]]]],[1,"\\n "],[8,[30,4,["Description"]],null,null,[["default"],[[[[1,"\\n This KV or parent of this KV was deleted.\\n "]],[]]]]],[1,"\\n "]],[4]]]]],[1,"\\n"]],[]],[[[41,[28,[37,13],[[30,2,["error","status"]],"403"],null],[[[1," "],[8,[39,14],[[4,[38,15],null,[["sticky"],[true]]]],[["@color"],["critical"]],[["default"],[[[[1,"\\n "],[8,[30,5,["Title"]],null,null,[["default"],[[[[1,"Error!"]],[]]]]],[1,"\\n "],[8,[30,5,["Description"]],null,null,[["default"],[[[[1,"\\n You no longer have access to this KV.\\n "]],[]]]]],[1,"\\n "]],[5]]]]],[1,"\\n"]],[]],[[[1," "],[8,[39,14],[[4,[38,15],null,[["sticky"],[true]]]],[["@color"],["warning"]],[["default"],[[[[1,"\\n "],[8,[30,6,["Title"]],null,null,[["default"],[[[[1,"Warning!"]],[]]]]],[1,"\\n "],[8,[30,6,["Description"]],null,null,[["default"],[[[[1,"\\n An error was returned whilst loading this data, refresh to try again.\\n "]],[]]]]],[1,"\\n "]],[6]]]]],[1,"\\n "]],[]]]],[]]],[1," "]],[3]]]]],[1,"\\n\\n "],[8,[39,10],null,[["@name"],["loaded"]],[["default"],[[[[1,"\\n"],[44,[[28,[37,4],null,[["value","change"],[[28,[37,5],[[33,17],"Kind:asc"],null],[28,[37,6],[[30,0],[28,[37,7],[[33,17]],null]],[["value"],["target.selected"]]]]]],[28,[37,4],null,[["kind"],[[28,[37,4],null,[["value","change"],[[52,[33,18],[28,[37,19],[[33,18],","],null],[27]],[28,[37,6],[[30,0],[28,[37,7],[[33,18]],null]],[["value"],["target.selectedItems"]]]]]]]]],[33,8],[30,2,["data"]]],[[[1," "],[8,[39,20],null,null,[["default"],[[[[1,"\\n"],[41,[28,[37,21],[[30,9,["Key"]],"/"],null],[[[1," "],[8,[39,10],null,[["@name"],["breadcrumbs"]],[["default"],[[[[1,"\\n "],[10,"ol"],[12],[1,"\\n "],[10,"li"],[12],[10,3],[15,6,[28,[37,22],["dc.kv"],null]],[12],[1,"Key / Values"],[13],[13],[1,"\\n"],[42,[28,[37,24],[[28,[37,24],[[28,[37,25],[0,-2,[28,[37,19],[[30,9,["Key"]],"/"],null]],null]],null]],null],null,[[[1," "],[10,"li"],[12],[11,3],[16,6,[28,[37,22],["dc.kv.folder",[28,[37,26],["/",[28,[37,27],[[28,[37,25],[0,[28,[37,28],[[30,12],1],null],[28,[37,19],[[30,9,["Key"]],"/"],null]],null],""],null]],null]],null]],[4,[38,29],[[30,11]],null],[12],[1,[30,11]],[13],[13],[1,"\\n"]],[11,12]],null],[1," "],[13],[1,"\\n "]],[]]]]],[1,"\\n"]],[]],null],[1," "],[8,[39,10],null,[["@name"],["header"]],[["default"],[[[[1,"\\n "],[10,"h1"],[12],[1,"\\n"],[41,[28,[37,13],[[30,9,["Key"]],"/"],null],[[[1," "],[8,[30,1,["Title"]],null,[["@title"],["Key / Value"]],null],[1,"\\n"]],[]],[[[1," "],[8,[30,1,["Title"]],null,[["@title"],[[28,[37,30],[1,[28,[37,31],[1,[28,[37,32],[[28,[37,19],[[30,9,["Key"]],"/"],null]],null]],null]],null]]],null],[1,"\\n"]],[]]],[1," "],[13],[1,"\\n "],[10,"label"],[14,"for","toolbar-toggle"],[12],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,10],null,[["@name"],["toolbar"]],[["default"],[[[[1,"\\n"],[41,[28,[37,33],[[30,10,["length"]],0],null],[[[1," "],[8,[39,34],null,[["@search","@onsearch","@sort","@filter"],[[99,35,["@search"]],[28,[37,6],[[30,0],[28,[37,7],[[33,35]],null]],[["value"],["target.value"]]],[30,7],[30,8]]],null],[1,"\\n"]],[]],null],[1," "]],[]]]]],[1,"\\n "],[8,[39,10],null,[["@name"],["actions"]],[["default"],[[[[1,"\\n"],[41,[28,[37,36],["create kvs"],null],[[[41,[28,[37,37],[[30,9,["Key"]],[28,[37,21],[[30,9,["Key"]],"/"],null]],null],[[[1," "],[8,[39,38],null,[["@text","@isHrefExternal","@href"],["Create",false,[29,[[28,[37,22],["dc.kv.create",[30,9,["Key"]]],null]]]]],null],[1,"\\n"]],[]],[[[1," "],[8,[39,38],null,[["@text","@route"],["Create","dc.kv.root-create"]],null],[1,"\\n"]],[]]]],[]],null],[1," "]],[]]]]],[1,"\\n "],[8,[39,10],null,[["@name"],["content"]],[["default"],[[[[1,"\\n "],[8,[39,39],null,[["@sink","@type","@label","@ondelete"],[[28,[37,3],["/${partition}/${nspace}/${dc}/kv/",[28,[37,4],null,[["partition","nspace","dc"],[[30,1,["params","partition"]],[30,1,["params","nspace"]],[30,1,["params","dc"]]]]]],null],"kv","key",[99,40,["@ondelete"]]]],[["default"],[[[[1,"\\n "],[8,[39,10],null,[["@name"],["content"]],[["default"],[[[[1,"\\n "],[8,[39,41],null,[["@type","@sort","@filters","@search","@items"],["kv",[30,7,["value"]],[30,8],[99,35,["@search"]],[30,10]]],[["default"],[[[[1,"\\n "],[8,[30,14,["Collection"]],null,null,[["default"],[[[[1,"\\n "],[8,[39,42],null,[["@items","@parent","@delete"],[[30,14,["items"]],[30,9],[30,13,["delete"]]]],null],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[30,14,["Empty"]],null,null,[["default"],[[[[1,"\\n "],[8,[39,43],null,[["@login"],[[30,1,["model","app","login","open"]]]],[["default"],[[[[1,"\\n "],[8,[39,10],null,[["@name"],["header"]],[["default"],[[[[1,"\\n "],[10,"h2"],[12],[1,"\\n "],[1,[28,[35,44],["routes.dc.kv.index.empty.header"],[["items"],[[30,10,["length"]]]]]],[1,"\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,10],null,[["@name"],["body"]],[["default"],[[[[1,"\\n "],[1,[28,[35,44],["routes.dc.kv.index.empty.body"],[["items","canUseACLs","htmlSafe"],[[30,10,["length"]],[28,[37,36],["use acls"],null],true]]]],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,10],null,[["@name"],["actions"]],[["default"],[[[[1,"\\n "],[10,"li"],[12],[1,"\\n "],[8,[39,45],null,[["@text","@href","@icon","@iconPosition","@size"],["Documentation on K/V",[29,[[28,[37,46],["CONSUL_DOCS_URL"],null],"/agent/kv"]],"docs-link","trailing","small"]],null],[1,"\\n "],[13],[1,"\\n "],[10,"li"],[12],[1,"\\n "],[8,[39,45],null,[["@text","@href","@icon","@iconPosition","@size"],["Take the tutorial",[29,[[28,[37,46],["CONSUL_DOCS_LEARN_URL"],null],"/consul/getting-started/kv"]],"learn-link","trailing","small"]],null],[1,"\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n "]],[]]]]],[1,"\\n "]],[]]]]],[1,"\\n "]],[14]]]]],[1,"\\n "]],[]]]]],[1,"\\n "]],[13]]]]],[1,"\\n "]],[]]]]],[1,"\\n "]],[]]]]],[1,"\\n"]],[7,8,9,10]]],[1," "]],[]]]]],[1,"\\n "]],[2]]]]],[1,"\\n"]],[1]]]]],[1,"\\n"]],["route","loader","after","T","T","T","sort","filters","parent","items","breadcrumb","index","writer","collection"],false,["route","routeName","data-source","uri","hash","or","action","mut","parent","data-loader","block-slot","app-error","if","eq","hds/toast","notification","let","sortBy","kind","split","app-view","not-eq","href-to","each","-track-array","slice","join","append","add","tooltip","take","drop","reverse","gt","consul/kv/search-bar","search","can","and","hds/button","data-writer","refresh-route","data-collection","consul/kv/list","empty-state","t","hds/link/standalone","env"]]',moduleName:"consul-ui/templates/dc/kv/index.hbs",isStrictMode:!1}) +e.default=n})),define("consul-ui/templates/dc/nodes/index",["exports","@ember/template-factory"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +var n=(0,t.createTemplateFactory)({id:"vxNtRU5K",block:'[[[8,[39,0],null,[["@name"],[[99,1,["@name"]]]],[["default"],[[[[1,"\\n\\n "],[8,[39,2],null,[["@src"],[[28,[37,3],["/${partition}/${nspace}/${dc}/leader",[28,[37,4],null,[["partition","nspace","dc"],[[30,1,["params","partition"]],[30,1,["params","nspace"]],[30,1,["params","dc"]]]]]],null]]],[["default"],[[[[1,"\\n\\n "],[8,[39,5],null,[["@src"],[[28,[37,3],["/${partition}/${nspace}/${dc}/nodes",[28,[37,4],null,[["partition","nspace","dc"],[[30,1,["params","partition"]],[30,1,["params","nspace"]],[30,1,["params","dc"]]]]]],null]]],[["default"],[[[[1,"\\n\\n "],[8,[39,6],null,[["@name"],["error"]],[["default"],[[[[1,"\\n "],[8,[39,7],null,[["@error","@login"],[[30,3,["error"]],[30,1,["model","app","login","open"]]]],null],[1,"\\n "]],[]]]]],[1,"\\n\\n "],[8,[39,6],null,[["@name"],["loaded"]],[["default"],[[[[1,"\\n"],[44,[[28,[37,4],null,[["value","change"],[[28,[37,9],[[33,10],"Status:asc"],null],[28,[37,11],[[30,0],[28,[37,12],[[33,10]],null]],[["value"],["target.selected"]]]]]],[28,[37,4],null,[["status","searchproperty"],[[28,[37,4],null,[["value","change"],[[52,[33,14],[28,[37,15],[[33,14],","],null],[27]],[28,[37,11],[[30,0],[28,[37,12],[[33,14]],null]],[["value"],["target.selectedItems"]]]]]],[28,[37,4],null,[["value","change","default"],[[52,[28,[37,16],[[33,17],[27]],null],[28,[37,15],[[33,17],","],null],[30,0,["_searchProperties"]]],[28,[37,11],[[30,0],[28,[37,12],[[33,17]],null]],[["value"],["target.selectedItems"]]],[30,0,["_searchProperties"]]]]]]]],[30,3,["data"]],[30,2,["data"]]],[[[44,[[28,[37,18],["Meta.synthetic-node",[30,6]],null]],[[[1," "],[8,[39,19],null,null,[["default"],[[[[1,"\\n "],[8,[39,6],null,[["@name"],["header"]],[["default"],[[[[1,"\\n "],[10,"h1"],[12],[1,"\\n "],[8,[30,1,["Title"]],null,[["@title"],["Nodes"]],null],[1,"\\n "],[10,"em"],[12],[1,[28,[35,20],[[30,6,["length"]]],null]],[1," total"],[13],[1,"\\n "],[13],[1,"\\n "],[10,"label"],[14,"for","toolbar-toggle"],[12],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,6],null,[["@name"],["toolbar"]],[["default"],[[[[1,"\\n"],[41,[28,[37,21],[[30,8,["length"]],0],null],[[[1," "],[8,[39,22],null,[["@search","@onsearch","@sort","@filter"],[[99,23,["@search"]],[28,[37,11],[[30,0],[28,[37,12],[[33,23]],null]],[["value"],["target.value"]]],[30,4],[30,5]]],null],[1,"\\n"]],[]],null],[1," "]],[]]]]],[1,"\\n "],[8,[39,6],null,[["@name"],["content"]],[["default"],[[[[1,"\\n "],[8,[39,24],null,[["@items","@filteredItems","@postfix"],[[30,6],[30,8],[28,[37,25],[[30,1,["params","partition"]],[30,1,["params","dc"]]],null]]],null],[1,"\\n "],[8,[39,26],null,[["@type","@sort","@filters","@search","@items"],["node",[30,4,["value"]],[30,5],[99,23,["@search"]],[30,8]]],[["default"],[[[[1,"\\n "],[8,[30,9,["Collection"]],null,null,[["default"],[[[[1,"\\n "],[8,[39,27],null,[["@items","@leader"],[[30,9,["items"]],[30,7]]],null],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[30,9,["Empty"]],null,null,[["default"],[[[[1,"\\n "],[8,[39,28],null,[["@login"],[[30,1,["model","app","login","open"]]]],[["default"],[[[[1,"\\n "],[8,[39,6],null,[["@name"],["header"]],[["default"],[[[[1,"\\n "],[10,"h2"],[12],[1,"\\n "],[1,[28,[35,29],["routes.dc.nodes.index.empty.header"],[["items"],[[30,6,["length"]]]]]],[1,"\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,6],null,[["@name"],["body"]],[["default"],[[[[1,"\\n "],[1,[28,[35,29],["routes.dc.nodes.index.empty.body"],[["items","canUseACLs","htmlSafe"],[[30,6,["length"]],[28,[37,30],["use acls"],null],true]]]],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,6],null,[["@name"],["actions"]],[["default"],[[[[1,"\\n "],[10,"li"],[12],[1,"\\n "],[8,[39,31],null,[["@text","@href","@color","@icon","@iconPosition","@size"],[[28,[37,29],["routes.dc.nodes.index.empty.documentation"],null],[29,[[28,[37,32],["CONSUL_DOCS_DEVELOPER_URL"],null],"/agent"]],"tertiary","docs-link","trailing","small"]],null],[1,"\\n "],[13],[1,"\\n "],[10,"li"],[12],[1,"\\n "],[8,[39,31],null,[["@text","@href","@color","@icon","@iconPosition","@size"],[[28,[37,29],["routes.dc.nodes.index.empty.learn"],null],[29,[[28,[37,32],["CONSUL_DOCS_LEARN_URL"],null],"/tutorials/consul/deployment-guide?in=consul/production-deploy#configure-consul-agents"]],"tertiary","learn-link","trailing","small"]],null],[1,"\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n "]],[]]]]],[1,"\\n "]],[]]]]],[1,"\\n "]],[9]]]]],[1,"\\n "]],[]]]]],[1,"\\n "]],[]]]]],[1,"\\n"]],[8]]]],[4,5,6,7]]],[1," "]],[]]]]],[1,"\\n "]],[3]]]]],[1,"\\n "]],[2]]]]],[1,"\\n"]],[1]]]]],[1,"\\n"]],["route","leader","api","sort","filters","items","leader","filtered","collection"],false,["route","routeName","data-source","uri","hash","data-loader","block-slot","app-error","let","or","sortBy","action","mut","if","status","split","not-eq","searchproperty","reject-by","app-view","format-number","gt","consul/node/search-bar","search","consul/node/agentless-notice","concat","data-collection","consul/node/list","empty-state","t","can","hds/button","env"]]',moduleName:"consul-ui/templates/dc/nodes/index.hbs",isStrictMode:!1}) +e.default=n})),define("consul-ui/templates/dc/nodes/show",["exports","@ember/template-factory"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +var n=(0,t.createTemplateFactory)({id:"14xgVgV5",block:'[[[8,[39,0],null,[["@name"],[[99,1,["@name"]]]],[["default"],[[[[1,"\\n "],[8,[39,2],null,[["@src"],[[28,[37,3],["/${partition}/${nspace}/${dc}/coordinates/for-node/${name}",[28,[37,4],null,[["partition","nspace","dc","name"],[[30,1,["params","partition"]],[30,1,["params","nspace"]],[30,1,["params","dc"]],[30,1,["params","name"]]]]]],null]]],[["default"],[[[[1,"\\n "],[8,[39,5],null,[["@src"],[[28,[37,3],["/${partition}/${nspace}/${dc}/node/${name}/${peer}",[28,[37,4],null,[["partition","nspace","dc","name","peer"],[[30,1,["params","partition"]],[30,1,["params","nspace"]],[30,1,["params","dc"]],[30,1,["params","name"]],[30,1,["params","peer"]]]]]],null]]],[["default"],[[[[1,"\\n "],[8,[39,6],null,[["@name"],["error"]],[["default"],[[[[1,"\\n "],[8,[39,7],null,[["@error","@login"],[[30,3,["error"]],[30,1,["model","app","login","open"]]]],null],[1,"\\n "]],[]]]]],[1,"\\n\\n "],[8,[39,6],null,[["@name"],["disconnected"]],[["default"],[[[[1,"\\n"],[41,[28,[37,9],[[30,3,["error","status"]],"404"],null],[[[1," "],[8,[39,10],[[4,[38,11],null,[["sticky"],[true]]]],[["@color"],["warning"]],[["default"],[[[[1,"\\n "],[8,[30,5,["Title"]],null,null,[["default"],[[[[1,"Warning!"]],[]]]]],[1,"\\n "],[8,[30,5,["Description"]],null,null,[["default"],[[[[1,"This node no longer exists in the catalog."]],[]]]]],[1,"\\n "]],[5]]]]],[1,"\\n"]],[]],[[[41,[28,[37,9],[[30,3,["error","status"]],"403"],null],[[[1," "],[8,[39,10],[[4,[38,11],null,[["sticky"],[true]]]],[["@color"],["critical"]],[["default"],[[[[1,"\\n "],[8,[30,6,["Title"]],null,null,[["default"],[[[[1,"Error!"]],[]]]]],[1,"\\n "],[8,[30,6,["Description"]],null,null,[["default"],[[[[1,"You no longer have access to this node."]],[]]]]],[1,"\\n "]],[6]]]]],[1,"\\n"]],[]],[[[1," "],[8,[39,10],[[4,[38,11],null,[["sticky"],[true]]]],[["@color"],["warning"]],[["default"],[[[[1,"\\n "],[8,[30,7,["Title"]],null,null,[["default"],[[[[1,"Warning!"]],[]]]]],[1,"\\n "],[8,[30,7,["Description"]],null,null,[["default"],[[[[1,"An error was returned whilst loading this data, refresh to try again."]],[]]]]],[1,"\\n "]],[7]]]]],[1,"\\n "]],[]]]],[]]],[1," "]],[4]]]]],[1,"\\n "],[8,[39,6],null,[["@name"],["loaded"]],[["default"],[[[[1,"\\n"],[44,[[30,3,["data"]],[30,2,["data"]]],[[[1," "],[8,[39,13],null,null,[["default"],[[[[1,"\\n "],[8,[39,6],null,[["@name"],["notification"]],[["default"],[[[[1,"\\n "],[8,[39,14],null,[["@type","@status"],[[30,11],[30,10]]],null],[1,"\\n "]],[10,11]]]]],[1,"\\n "],[8,[39,6],null,[["@name"],["breadcrumbs"]],[["default"],[[[[1,"\\n "],[10,"ol"],[12],[1,"\\n "],[10,"li"],[12],[10,3],[15,6,[28,[37,15],["dc.nodes"],[["params"],[[28,[37,4],null,[["peer"],[[27]]]]]]]],[12],[1,"All Nodes"],[13],[13],[1,"\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,6],null,[["@name"],["header"]],[["default"],[[[[1,"\\n "],[10,"h1"],[12],[1,"\\n "],[8,[30,1,["Title"]],null,[["@title"],[[30,8,["Node"]]]],null],[1,"\\n "],[13],[1,"\\n "],[10,"label"],[14,"for","toolbar-toggle"],[12],[13],[1,"\\n "],[8,[39,16],null,[["@item"],[[30,8]]],null],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,6],null,[["@name"],["nav"]],[["default"],[[[[1,"\\n "],[8,[39,17],null,[["@items"],[[28,[37,18],[[28,[37,19],[[28,[37,4],null,[["label","href","selected"],[[28,[37,20],["routes.dc.nodes.show.healthchecks.title"],null],[28,[37,15],["dc.nodes.show.healthchecks"],null],[28,[37,21],["dc.nodes.show.healthchecks"],null]]]],[28,[37,4],null,[["label","href","selected"],[[28,[37,20],["routes.dc.nodes.show.services.title"],null],[28,[37,15],["dc.nodes.show.services"],null],[28,[37,21],["dc.nodes.show.services"],null]]]],[52,[30,9,["distances"]],[28,[37,4],null,[["label","href","selected"],[[28,[37,20],["routes.dc.nodes.show.rtt.title"],null],[28,[37,15],["dc.nodes.show.rtt"],null],[28,[37,21],["dc.nodes.show.rtt"],null]]]],""],[52,[28,[37,22],["read sessions"],null],[28,[37,4],null,[["label","href","selected"],[[28,[37,20],["routes.dc.nodes.show.sessions.title"],null],[28,[37,15],["dc.nodes.show.sessions"],null],[28,[37,21],["dc.nodes.show.sessions"],null]]]],""],[28,[37,4],null,[["label","href","selected"],[[28,[37,20],["routes.dc.nodes.show.metadata.title"],null],[28,[37,15],["dc.nodes.show.metadata"],null],[28,[37,21],["dc.nodes.show.metadata"],null]]]]],null]],null]]],null],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,6],null,[["@name"],["actions"]],[["default"],[[[[1,"\\n "],[8,[39,23],null,[["@value","@name"],[[30,8,["Address"]],"Address"]],[["default"],[[[[1,[30,8,["Address"]]]],[]]]]],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,6],null,[["@name"],["content"]],[["default"],[[[[1,"\\n "],[8,[39,24],null,[["@name","@model"],[[99,1,["@name"]],[28,[37,25],[[28,[37,4],null,[["item","tomography"],[[30,8],[30,9]]]],[30,1,["model"]]],null]]],[["default"],[[[[1,"\\n "],[46,[28,[37,27],null,null],null,null,null],[1,"\\n "]],[12]]]]],[1,"\\n "]],[]]]]],[1,"\\n "]],[]]]]],[1,"\\n"]],[8,9]]],[1," "]],[]]]]],[1,"\\n "]],[3]]]]],[1,"\\n "]],[2]]]]],[1,"\\n"]],[1]]]]],[1,"\\n"]],["route","tomography","loader","after","T","T","T","item","tomography","status","type","o"],false,["route","routeName","data-source","uri","hash","data-loader","block-slot","app-error","if","eq","hds/toast","notification","let","app-view","consul/lock-session/notifications","href-to","consul/peer/info","tab-nav","compact","array","t","is-href","can","copy-button","outlet","assign","component","-outlet"]]',moduleName:"consul-ui/templates/dc/nodes/show.hbs",isStrictMode:!1}) +e.default=n})),define("consul-ui/templates/dc/nodes/show/healthchecks",["exports","@ember/template-factory"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +var n=(0,t.createTemplateFactory)({id:"i+D+Qmra",block:'[[[8,[39,0],null,[["@name"],[[99,1,["@name"]]]],[["default"],[[[[1,"\\n"],[44,[[28,[37,3],null,[["value","change"],[[28,[37,4],[[33,5],"Status:asc"],null],[28,[37,6],[[30,0],[28,[37,7],[[33,5]],null]],[["value"],["target.selected"]]]]]],[28,[37,3],null,[["status","kind","check","searchproperty"],[[28,[37,3],null,[["value","change"],[[52,[33,9],[28,[37,10],[[33,9],","],null],[27]],[28,[37,6],[[30,0],[28,[37,7],[[33,9]],null]],[["value"],["target.selectedItems"]]]]]],[28,[37,3],null,[["value","change"],[[52,[33,11],[28,[37,10],[[33,11],","],null],[27]],[28,[37,6],[[30,0],[28,[37,7],[[33,11]],null]],[["value"],["target.selectedItems"]]]]]],[28,[37,3],null,[["value","change"],[[52,[33,12],[28,[37,10],[[33,12],","],null],[27]],[28,[37,6],[[30,0],[28,[37,7],[[33,12]],null]],[["value"],["target.selectedItems"]]]]]],[28,[37,3],null,[["value","change","default"],[[52,[28,[37,13],[[33,14],[27]],null],[28,[37,10],[[33,14],","],null],[33,15]],[28,[37,6],[[30,0],[28,[37,7],[[33,14]],null]],[["value"],["target.selectedItems"]]],[33,15]]]]]]],[30,1,["model","item","Checks"]]],[[[1," "],[10,0],[14,0,"tab-section"],[12],[1,"\\n"],[41,[28,[37,16],[[30,4,["length"]],0],null],[[[1," "],[10,"input"],[14,1,"toolbar-toggle"],[14,4,"checkbox"],[12],[13],[1,"\\n "],[8,[39,17],null,[["@search","@onsearch","@sort","@filter"],[[99,18,["@search"]],[28,[37,6],[[30,0],[28,[37,7],[[33,18]],null]],[["value"],["target.value"]]],[30,2],[30,3]]],null],[1,"\\n"]],[]],null],[44,[[28,[37,19],["Type","serf",[30,4]],null]],[[[41,[28,[37,20],[[30,5],[28,[37,21],[[30,5,["Status"]],"critical"],null]],null],[[[1," "],[8,[39,22],[[24,0,"mb-3 mt-2"]],[["@type","@color"],["inline","warning"]],[["default"],[[[[1,"\\n "],[8,[30,6,["Title"]],null,null,[["default"],[[[[1,[28,[35,23],["routes.dc.nodes.show.healthchecks.critical-serf-notice.header"],null]]],[]]]]],[1,"\\n "],[8,[30,6,["Description"]],null,null,[["default"],[[[[1,[28,[35,23],["routes.dc.nodes.show.healthchecks.critical-serf-notice.body"],null]]],[]]]]],[1,"\\n "]],[6]]]]],[1,"\\n"]],[]],null]],[5]]],[1," "],[8,[39,24],null,[["@type","@sort","@filters","@search","@items"],["health-check",[30,2,["value"]],[30,3],[99,18,["@search"]],[30,4]]],[["default"],[[[[1,"\\n "],[8,[30,7,["Collection"]],null,null,[["default"],[[[[1,"\\n "],[8,[39,25],null,[["@items"],[[30,7,["items"]]]],null],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[30,7,["Empty"]],null,null,[["default"],[[[[1,"\\n "],[8,[39,26],null,null,[["default"],[[[[1,"\\n "],[8,[39,27],null,[["@name"],["body"]],[["default"],[[[[1,"\\n "],[1,[28,[35,23],["routes.dc.nodes.show.healthchecks.empty"],[["items","htmlSafe"],[[30,4,["length"]],true]]]],[1,"\\n "]],[]]]]],[1,"\\n "]],[]]]]],[1,"\\n "]],[]]]]],[1,"\\n "]],[7]]]]],[1,"\\n "],[13],[1,"\\n"]],[2,3,4]]]],[1]]]]]],["route","sort","filters","items","serf","A","collection"],false,["route","routeName","let","hash","or","sortBy","action","mut","if","status","split","kind","check","not-eq","searchproperty","searchProperties","gt","consul/health-check/search-bar","search","find-by","and","eq","hds/alert","t","data-collection","consul/health-check/list","empty-state","block-slot"]]',moduleName:"consul-ui/templates/dc/nodes/show/healthchecks.hbs",isStrictMode:!1}) +e.default=n})),define("consul-ui/templates/dc/nodes/show/index",["exports","@ember/template-factory"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +var n=(0,t.createTemplateFactory)({id:"qL7XyD9+",block:'[[[8,[39,0],null,[["@name"],[[99,1,["@name"]]]],[["default"],[[[[1,"\\n"],[41,[28,[37,3],[[30,1,["model","item","Checks","length"]],0],null],[[[1," "],[1,[28,[35,4],[[28,[37,5],["replaceWith","dc.nodes.show.services"],null]],null]],[1,"\\n"]],[]],[[[1," "],[1,[28,[35,4],[[28,[37,5],["replaceWith","dc.nodes.show.healthchecks"],null]],null]],[1,"\\n"]],[]]]],[1]]]]],[1,"\\n"]],["route"],false,["route","routeName","if","eq","did-insert","route-action"]]',moduleName:"consul-ui/templates/dc/nodes/show/index.hbs",isStrictMode:!1}) +e.default=n})),define("consul-ui/templates/dc/nodes/show/metadata",["exports","@ember/template-factory"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +var n=(0,t.createTemplateFactory)({id:"II5xvxvi",block:'[[[8,[39,0],null,[["@name"],[[99,1,["@name"]]]],[["default"],[[[[1,"\\n "],[10,0],[14,0,"tab-section"],[12],[1,"\\n"],[41,[30,1,["model","item","Meta"]],[[[1," "],[8,[39,3],null,[["@items"],[[28,[37,4],[[30,1,["model","item","Meta"]]],null]]],null],[1,"\\n"]],[]],[[[1," "],[8,[39,5],null,null,[["default"],[[[[1,"\\n "],[8,[39,6],null,[["@name"],["body"]],[["default"],[[[[1,"\\n "],[10,2],[12],[1,"\\n This node has no metadata.\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n "]],[]]]]],[1,"\\n"]],[]]],[1," "],[13],[1,"\\n"]],[1]]]]],[1,"\\n"]],["route"],false,["route","routeName","if","consul/metadata/list","entries","empty-state","block-slot"]]',moduleName:"consul-ui/templates/dc/nodes/show/metadata.hbs",isStrictMode:!1}) +e.default=n})),define("consul-ui/templates/dc/nodes/show/rtt",["exports","@ember/template-factory"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +var n=(0,t.createTemplateFactory)({id:"dQ8VTTOG",block:'[[[8,[39,0],null,[["@name"],[[99,1,["@name"]]]],[["default"],[[[[1,"\\n"],[44,[[30,1,["model","tomography"]]],[[[41,[28,[37,4],[[30,2,["distances"]]],null],[[[1," "],[1,[28,[35,5],[[28,[37,6],["replaceWith","dc.nodes.show"],null]],null]],[1,"\\n"]],[]],[[[1," "],[10,0],[14,0,"tab-section"],[12],[1,"\\n "],[10,0],[14,0,"definition-table"],[12],[1,"\\n "],[10,"dl"],[12],[1,"\\n "],[10,"dt"],[12],[1,"\\n Minimum\\n "],[13],[1,"\\n "],[10,"dd"],[12],[1,"\\n "],[1,[28,[35,7],[[30,2,["min"]]],[["maximumFractionDigits"],[2]]]],[1,"ms\\n "],[13],[1,"\\n "],[10,"dt"],[12],[1,"\\n Median\\n "],[13],[1,"\\n "],[10,"dd"],[12],[1,"\\n "],[1,[28,[35,7],[[30,2,["median"]]],[["maximumFractionDigits"],[2]]]],[1,"ms\\n "],[13],[1,"\\n "],[10,"dt"],[12],[1,"\\n Maximum\\n "],[13],[1,"\\n "],[10,"dd"],[12],[1,"\\n "],[1,[28,[35,7],[[30,2,["max"]]],[["maximumFractionDigits"],[2]]]],[1,"ms\\n "],[13],[1,"\\n "],[13],[1,"\\n "],[13],[1,"\\n "],[8,[39,8],null,[["@distances"],[[30,2,["distances"]]]],null],[1,"\\n "],[13],[1,"\\n"]],[]]]],[2]]]],[1]]]]],[1,"\\n"]],["route","tomography"],false,["route","routeName","let","if","not","did-insert","route-action","format-number","consul/tomography/graph"]]',moduleName:"consul-ui/templates/dc/nodes/show/rtt.hbs",isStrictMode:!1}) +e.default=n})),define("consul-ui/templates/dc/nodes/show/services",["exports","@ember/template-factory"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +var n=(0,t.createTemplateFactory)({id:"3xjsHJKx",block:'[[[8,[39,0],null,[["@name"],[[99,1,["@name"]]]],[["default"],[[[[1,"\\n"],[44,[[28,[37,3],null,[["value","change"],[[28,[37,4],[[33,5],"Status:asc"],null],[28,[37,6],[[30,0],[28,[37,7],[[33,5]],null]],[["value"],["target.selected"]]]]]],[28,[37,3],null,[["status","source","searchproperty"],[[28,[37,3],null,[["value","change"],[[52,[33,9],[28,[37,10],[[33,9],","],null],[27]],[28,[37,6],[[30,0],[28,[37,7],[[33,9]],null]],[["value"],["target.selectedItems"]]]]]],[28,[37,3],null,[["value","change"],[[52,[33,11],[28,[37,10],[[33,11],","],null],[27]],[28,[37,6],[[30,0],[28,[37,7],[[33,11]],null]],[["value"],["target.selectedItems"]]]]]],[28,[37,3],null,[["value","change","default"],[[52,[28,[37,12],[[33,13],[27]],null],[28,[37,10],[[33,13],","],null],[33,14]],[28,[37,6],[[30,0],[28,[37,7],[[33,13]],null]],[["value"],["target.selectedItems"]]],[33,14]]]]]]],[30,1,["model","item","MeshServiceInstances"]],[30,1,["model","item","ProxyServiceInstances"]]],[[[1," "],[10,0],[14,0,"tab-section"],[12],[1,"\\n"],[41,[28,[37,15],[[30,4,["length"]],0],null],[[[1," "],[10,"input"],[14,1,"toolbar-toggle"],[14,4,"checkbox"],[12],[13],[1,"\\n "],[8,[39,16],null,[["@sources","@search","@onsearch","@searchproperties","@sort","@filter"],[[28,[37,17],[[28,[37,18],[[30,4]],null],"ExternalSources"],null],[99,19,["@search"]],[28,[37,6],[[30,0],[28,[37,7],[[33,19]],null]],[["value"],["target.value"]]],[99,14,["@searchproperties"]],[30,2],[30,3]]],null],[1,"\\n"]],[]],null],[1," "],[8,[39,20],null,[["@type","@sort","@filters","@search","@items"],["service-instance",[30,2,["value"]],[30,3],[99,19,["@search"]],[30,4]]],[["default"],[[[[1,"\\n "],[8,[30,6,["Collection"]],null,null,[["default"],[[[[1,"\\n "],[8,[39,21],null,[["@node","@routeName","@items","@proxies"],[[30,1,["model","item"]],"dc.services.show",[30,6,["items"]],[30,5]]],null],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[30,6,["Empty"]],null,null,[["default"],[[[[1,"\\n "],[8,[39,22],null,null,[["default"],[[[[1,"\\n "],[8,[39,23],null,[["@name"],["body"]],[["default"],[[[[1,"\\n "],[1,[28,[35,24],["routes.dc.nodes.show.services.empty"],[["items","htmlSafe"],[[30,4,["length"]],true]]]],[1,"\\n "]],[]]]]],[1,"\\n "]],[]]]]],[1,"\\n "]],[]]]]],[1,"\\n "]],[6]]]]],[1,"\\n "],[13],[1,"\\n"]],[2,3,4,5]]]],[1]]]]]],["route","sort","filters","items","proxies","collection"],false,["route","routeName","let","hash","or","sortBy","action","mut","if","status","split","source","not-eq","searchproperty","searchProperties","gt","consul/service-instance/search-bar","get","collection","search","data-collection","consul/service-instance/list","empty-state","block-slot","t"]]',moduleName:"consul-ui/templates/dc/nodes/show/services.hbs",isStrictMode:!1}) +e.default=n})),define("consul-ui/templates/dc/nodes/show/sessions",["exports","@ember/template-factory"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +var n=(0,t.createTemplateFactory)({id:"sY17bdHd",block:'[[[8,[39,0],null,[["@name"],[[99,1,["@name"]]]],[["default"],[[[[1,"\\n "],[8,[39,2],null,[["@src"],[[28,[37,3],["/${partition}/${nspace}/${dc}/sessions/for-node/${node}",[28,[37,4],null,[["partition","nspace","dc","node"],[[30,1,["params","partition"]],[30,1,["params","nspace"]],[30,1,["params","dc"]],[30,1,["params","name"]]]]]],null]]],[["default"],[[[[1,"\\n\\n "],[8,[39,5],null,[["@name"],["error"]],[["default"],[[[[1,"\\n "],[8,[39,6],null,[["@error","@login"],[[30,2,["error"]],[30,1,["model","app","login","open"]]]],null],[1,"\\n "]],[]]]]],[1,"\\n\\n "],[8,[39,5],null,[["@name"],["loaded"]],[["default"],[[[[1,"\\n"],[44,[[30,2,["data"]]],[[[1," "],[10,0],[14,0,"tab-section"],[12],[1,"\\n "],[8,[39,8],null,[["@sink","@type","@label","@ondelete"],[[28,[37,3],["/${partition}/${dc}/${nspace}/session/",[28,[37,4],null,[["partition","nspace","dc"],[[30,1,["params","partition"]],[30,1,["params","nspace"]],[30,1,["params","dc"]]]]]],null],"session","Lock Session",[99,9,["@ondelete"]]]],[["default"],[[[[1,"\\n\\n "],[8,[39,5],null,[["@name"],["removed"]],[["default"],[[[[1,"\\n "],[8,[39,10],[[4,[38,11],null,[["after"],[[28,[37,12],[[30,0],[30,5]],null]]]]],[["@type"],["remove"]],null],[1,"\\n "]],[5]]]]],[1,"\\n\\n "],[8,[39,5],null,[["@name"],["error"]],[["default"],[[[[1,"\\n "],[8,[39,10],[[4,[38,11],null,[["after"],[[28,[37,12],[[30,0],[30,6]],null]]]]],[["@type","@error"],["remove",[30,7]]],null],[1,"\\n "]],[6,7]]]]],[1,"\\n\\n "],[8,[39,5],null,[["@name"],["content"]],[["default"],[[[[1,"\\n\\n "],[8,[39,13],null,[["@type","@items"],["session",[30,3]]],[["default"],[[[[1,"\\n\\n "],[8,[30,8,["Collection"]],null,null,[["default"],[[[[1,"\\n "],[8,[39,14],null,[["@items","@ondelete"],[[30,8,["items"]],[30,4,["delete"]]]],null],[1,"\\n "]],[]]]]],[1,"\\n\\n "],[8,[30,8,["Empty"]],null,null,[["default"],[[[[1,"\\n "],[8,[39,15],null,[["@login"],[[30,1,["model","app","login","open"]]]],[["default"],[[[[1,"\\n "],[8,[39,5],null,[["@name"],["header"]],[["default"],[[[[1,"\\n "],[10,"h2"],[12],[1,"\\n "],[1,[28,[35,16],["routes.dc.nodes.show.sessions.empty.header"],[["items"],[[30,3,["length"]]]]]],[1,"\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,5],null,[["@name"],["body"]],[["default"],[[[[1,"\\n "],[1,[28,[35,16],["routes.dc.nodes.show.sessions.empty.body"],[["canUseACLs","htmlSafe"],[[28,[37,17],["use acls"],null],true]]]],[1,"\\n "]],[]]]]],[1,"\\n\\n "],[8,[39,5],null,[["@name"],["actions"]],[["default"],[[[[1,"\\n "],[10,"li"],[12],[1,"\\n "],[8,[39,18],null,[["@text","@href","@icon","@iconPosition","@size"],["Documentation on Lock Sessions",[29,[[28,[37,19],["CONSUL_DOCS_URL"],null],"/internals/sessions.html"]],"docs-link","trailing","small"]],null],[1,"\\n "],[13],[1,"\\n "],[10,"li"],[12],[1,"\\n "],[8,[39,18],null,[["@text","@href","@icon","@iconPosition","@size"],["Take the tutorial",[29,[[28,[37,19],["CONSUL_DOCS_LEARN_URL"],null],"/tutorials/consul/distributed-semaphore"]],"learn-link","trailing","small"]],null],[1,"\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n\\n "]],[]]]]],[1,"\\n "]],[]]]]],[1,"\\n\\n "]],[8]]]]],[1,"\\n\\n "]],[]]]]],[1,"\\n "]],[4]]]]],[1,"\\n "],[13],[1,"\\n"]],[3]]],[1," "]],[]]]]],[1,"\\n"]],[2]]]]],[1,"\\n"]],[1]]]]],[1,"\\n"]],["route","api","items","writer","after","after","error","collection"],false,["route","routeName","data-loader","uri","hash","block-slot","app-error","let","data-writer","refresh-route","consul/lock-session/notifications","notification","action","data-collection","consul/lock-session/list","empty-state","t","can","hds/link/standalone","env"]]',moduleName:"consul-ui/templates/dc/nodes/show/sessions.hbs",isStrictMode:!1}) +e.default=n})),define("consul-ui/templates/dc/nspaces/edit",["exports","@ember/template-factory"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +var n=(0,t.createTemplateFactory)({id:"kT+yvkgU",block:'[[[8,[39,0],null,[["@name"],[[99,1,["@name"]]]],[["default"],[[[[1,"\\n "],[8,[39,2],null,[["@src"],[[28,[37,3],["/${partition}/${nspace}/${dc}/namespace/${id}",[28,[37,4],null,[["partition","nspace","dc","id"],[[30,1,["params","partition"]],[30,1,["params","nspace"]],[30,1,["params","dc"]],[28,[37,5],[[30,1,["params","name"]],""],null]]]]],null]]],[["default"],[[[[1,"\\n\\n "],[8,[39,6],null,[["@name"],["error"]],[["default"],[[[[1,"\\n "],[8,[39,7],null,[["@error","@login"],[[30,2,["error"]],[30,1,["model","app","login","open"]]]],null],[1,"\\n "]],[]]]]],[1,"\\n\\n "],[8,[39,6],null,[["@name"],["loaded"]],[["default"],[[[[1,"\\n"],[44,[[30,1,["params","dc"]],[30,1,["params","partition"]],[30,1,["params","nspace"]],[30,2,["data"]],[30,2,["data","isNew"]]],[[[1," "],[8,[39,9],null,null,[["default"],[[[[1,"\\n "],[8,[39,6],null,[["@name"],["breadcrumbs"]],[["default"],[[[[1,"\\n "],[10,"ol"],[12],[1,"\\n "],[10,"li"],[12],[10,3],[15,6,[28,[37,10],["dc.nspaces"],null]],[12],[1,"All Namespaces"],[13],[13],[1,"\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,6],null,[["@name"],["header"]],[["default"],[[[[1,"\\n "],[10,"h1"],[12],[1,"\\n "],[8,[30,1,["Title"]],null,[["@title"],[[52,[30,7],"New Namespace",[28,[37,12],["Edit ",[30,6,["Name"]]],null]]]],null],[1,"\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,6],null,[["@name"],["actions"]],[["default"],[[[[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,6],null,[["@name"],["content"]],[["default"],[[[[1,"\\n "],[8,[39,13],null,[["@item","@dc","@nspace","@partition","@onsubmit"],[[30,6],[30,1,["params","dc"]],[30,1,["params","nspace"]],[30,1,["params","partition"]],[28,[37,14],["dc.nspaces.index"],null]]],null],[1,"\\n "]],[]]]]],[1,"\\n "]],[]]]]],[1,"\\n"]],[3,4,5,6,7]]],[1," "]],[]]]]],[1,"\\n "]],[2]]]]],[1,"\\n"]],[1]]]]],[1,"\\n"]],["route","loader","dc","partition","nspace","item","create"],false,["route","routeName","data-loader","uri","hash","or","block-slot","app-error","let","app-view","href-to","if","concat","consul/nspace/form","transition-to"]]',moduleName:"consul-ui/templates/dc/nspaces/edit.hbs",isStrictMode:!1}) +e.default=n})),define("consul-ui/templates/dc/nspaces/index",["exports","@ember/template-factory"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +var n=(0,t.createTemplateFactory)({id:"sVU/Q7Zh",block:'[[[8,[39,0],null,[["@name"],[[99,1,["@name"]]]],[["default"],[[[[1,"\\n "],[8,[39,2],null,[["@src"],[[28,[37,3],["/${partition}/${nspace}/${dc}/namespaces",[28,[37,4],null,[["partition","nspace","dc"],[[30,1,["params","partition"]],[30,1,["params","nspace"]],[30,1,["params","dc"]]]]]],null]]],[["default"],[[[[1,"\\n\\n "],[8,[39,5],null,[["@name"],["error"]],[["default"],[[[[1,"\\n "],[8,[39,6],null,[["@error","@login"],[[30,2,["error"]],[30,1,["model","app","login","open"]]]],null],[1,"\\n "]],[]]]]],[1,"\\n\\n "],[8,[39,5],null,[["@name"],["loaded"]],[["default"],[[[[1,"\\n"],[44,[[28,[37,4],null,[["value","change"],[[28,[37,8],[[33,9],"Name:asc"],null],[28,[37,10],[[30,0],[28,[37,11],[[33,9]],null]],[["value"],["target.selected"]]]]]],[28,[37,4],null,[["searchproperty"],[[28,[37,4],null,[["value","change","default"],[[52,[28,[37,13],[[33,14],[27]],null],[28,[37,15],[[33,14],","],null],[33,16]],[28,[37,10],[[30,0],[28,[37,11],[[33,14]],null]],[["value"],["target.selectedItems"]]],[33,16]]]]]]],[30,2,["data"]]],[[[1,"\\n "],[8,[39,17],null,null,[["default"],[[[[1,"\\n "],[8,[39,5],null,[["@name"],["header"]],[["default"],[[[[1,"\\n "],[10,"h1"],[12],[1,"\\n "],[8,[30,1,["Title"]],null,[["@title"],["Namespaces"]],null],[1,"\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,5],null,[["@name"],["actions"]],[["default"],[[[[1,"\\n"],[41,[28,[37,18],["create nspaces"],null],[[[1," "],[8,[39,19],null,[["@text","@route"],["Create","dc.nspaces.create"]],null],[1,"\\n"]],[]],null],[1," "]],[]]]]],[1,"\\n "],[8,[39,5],null,[["@name"],["toolbar"]],[["default"],[[[[1,"\\n"],[41,[28,[37,20],[[30,5,["length"]],0],null],[[[1," "],[8,[39,21],null,[["@search","@onsearch","@sort","@filter"],[[99,22,["@search"]],[28,[37,10],[[30,0],[28,[37,11],[[33,22]],null]],[["value"],["target.value"]]],[30,3],[30,4]]],null],[1,"\\n"]],[]],null],[1," "]],[]]]]],[1,"\\n "],[8,[39,5],null,[["@name"],["content"]],[["default"],[[[[1,"\\n "],[8,[39,23],null,[["@sink","@type","@label","@ondelete"],[[28,[37,3],["/${partition}/${dc}/${nspace}/nspace/",[28,[37,4],null,[["partition","nspace","dc"],[[30,1,["params","partition"]],[30,1,["params","nspace"]],[30,1,["params","dc"]]]]]],null],"nspace","Namespace",[99,24,["@ondelete"]]]],[["default"],[[[[1,"\\n "],[8,[39,5],null,[["@name"],["removed"]],[["default"],[[[[1,"\\n "],[8,[39,25],[[4,[38,26],null,[["after"],[[28,[37,10],[[30,0],[30,7]],null]]]]],[["@type"],["remove"]],null],[1,"\\n "]],[7]]]]],[1,"\\n "],[8,[39,5],null,[["@name"],["content"]],[["default"],[[[[1,"\\n "],[8,[39,27],null,[["@type","@sort","@filters","@search","@items"],["nspace",[30,3,["value"]],[30,4],[99,22,["@search"]],[30,5]]],[["default"],[[[[1,"\\n "],[8,[30,8,["Collection"]],null,null,[["default"],[[[[1,"\\n "],[8,[39,28],null,[["@items","@ondelete"],[[30,8,["items"]],[30,6,["delete"]]]],null],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[30,8,["Empty"]],null,null,[["default"],[[[[1,"\\n "],[8,[39,29],null,[["@login"],[[30,1,["model","app","login","open"]]]],[["default"],[[[[1,"\\n "],[8,[39,5],null,[["@name"],["header"]],[["default"],[[[[1,"\\n "],[10,"h2"],[12],[1,"\\n "],[1,[28,[35,30],["routes.dc.namespaces.index.empty.header"],[["items"],[[30,5,["length"]]]]]],[1,"\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,5],null,[["@name"],["body"]],[["default"],[[[[1,"\\n "],[10,2],[12],[1,"\\n "],[1,[28,[35,30],["routes.dc.namespaces.index.empty.body"],[["items","canUseACLs"],[[30,5,["length"]],[28,[37,18],["use acls"],null]]]]],[1,"\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,5],null,[["@name"],["actions"]],[["default"],[[[[1,"\\n "],[10,"li"],[12],[1,"\\n "],[8,[39,31],null,[["@text","@href","@icon","@iconPosition","@size"],["Documentation on namespaces",[29,[[28,[37,32],["CONSUL_DOCS_URL"],null],"/commands/namespace"]],"docs-link","trailing","small"]],null],[1,"\\n "],[13],[1,"\\n "],[10,"li"],[12],[1,"\\n "],[8,[39,31],null,[["@text","@href","@icon","@iconPosition","@size"],["Read the guide",[29,[[28,[37,32],["CONSUL_DOCS_LEARN_URL"],null],"/consul/namespaces/secure-namespaces"]],"learn-link","trailing","small"]],null],[1,"\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n "]],[]]]]],[1,"\\n "]],[]]]]],[1,"\\n "]],[8]]]]],[1,"\\n "]],[]]]]],[1,"\\n "]],[6]]]]],[1,"\\n "]],[]]]]],[1,"\\n "]],[]]]]],[1,"\\n"]],[3,4,5]]],[1," "]],[]]]]],[1,"\\n "]],[2]]]]],[1,"\\n"]],[1]]]]],[1,"\\n"]],["route","loader","sort","filters","items","writer","after","collection"],false,["route","routeName","data-loader","uri","hash","block-slot","app-error","let","or","sortBy","action","mut","if","not-eq","searchproperty","split","searchProperties","app-view","can","hds/button","gt","consul/nspace/search-bar","search","data-writer","refresh-route","consul/nspace/notifications","notification","data-collection","consul/nspace/list","empty-state","t","hds/link/standalone","env"]]',moduleName:"consul-ui/templates/dc/nspaces/index.hbs",isStrictMode:!1}) +e.default=n})),define("consul-ui/templates/dc/partitions/edit",["exports","@ember/template-factory"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +var n=(0,t.createTemplateFactory)({id:"4dMfLoFT",block:'[[[8,[39,0],null,[["@name"],[[99,1,["@name"]]]],[["default"],[[[[1,"\\n "],[8,[39,2],null,[["@src"],[[28,[37,3],["/${partition}/${nspace}/${dc}/partition/${id}",[28,[37,4],null,[["partition","nspace","dc","id"],[[30,1,["params","partition"]],[30,1,["params","nspace"]],[30,1,["params","dc"]],[28,[37,5],[[30,1,["params","name"]],""],null]]]]],null]]],[["default"],[[[[1,"\\n\\n "],[8,[39,6],null,[["@name"],["error"]],[["default"],[[[[1,"\\n "],[8,[39,7],null,[["@error","@login"],[[30,2,["error"]],[30,1,["model","app","login","open"]]]],null],[1,"\\n "]],[]]]]],[1,"\\n\\n "],[8,[39,6],null,[["@name"],["loaded"]],[["default"],[[[[1,"\\n"],[44,[[30,1,["params","dc"]],[30,1,["params","partition"]],[30,1,["params","nspace"]],[30,2,["data"]]],[[[1," "],[8,[39,9],null,null,[["default"],[[[[1,"\\n "],[8,[39,6],null,[["@name"],["breadcrumbs"]],[["default"],[[[[1,"\\n "],[10,"ol"],[12],[1,"\\n "],[10,"li"],[12],[10,3],[15,6,[28,[37,10],["dc.partitions"],null]],[12],[1,"All Admin Partitions"],[13],[13],[1,"\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,6],null,[["@name"],["header"]],[["default"],[[[[1,"\\n "],[10,"h1"],[12],[1,"\\n "],[8,[30,1,["Title"]],null,[["@title"],[[52,[28,[37,12],["new partition"],[["item"],[[30,6]]]],"New Partition",[28,[37,13],["Edit ",[30,6,["Name"]]],null]]]],null],[1,"\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,6],null,[["@name"],["content"]],[["default"],[[[[1,"\\n\\n "],[8,[39,14],null,[["@item","@dc","@nspace","@partition","@onsubmit"],[[30,6],[30,1,["params","dc"]],[30,1,["params","nspace"]],[30,1,["params","partition"]],[28,[37,15],["dc.partitions.index"],null]]],null],[1,"\\n\\n "]],[]]]]],[1,"\\n "]],[]]]]],[1,"\\n"]],[3,4,5,6]]],[1," "]],[]]]]],[1,"\\n "]],[2]]]]],[1,"\\n"]],[1]]]]],[1,"\\n"]],["route","loader","dc","partition","nspace","item"],false,["route","routeName","data-loader","uri","hash","or","block-slot","app-error","let","app-view","href-to","if","is","concat","consul/partition/form","transition-to"]]',moduleName:"consul-ui/templates/dc/partitions/edit.hbs",isStrictMode:!1}) +e.default=n})),define("consul-ui/templates/dc/partitions/index",["exports","@ember/template-factory"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +var n=(0,t.createTemplateFactory)({id:"h9pu8svr",block:'[[[8,[39,0],null,[["@name"],[[99,1,["@name"]]]],[["default"],[[[[1,"\\n "],[8,[39,2],null,[["@src"],[[28,[37,3],["/${partition}/${nspace}/${dc}/partitions",[28,[37,4],null,[["partition","nspace","dc"],[[30,1,["params","partition"]],[30,1,["params","nspace"]],[30,1,["params","dc"]]]]]],null]]],[["default"],[[[[1,"\\n\\n "],[8,[39,5],null,[["@name"],["error"]],[["default"],[[[[1,"\\n "],[8,[39,6],null,[["@error","@login"],[[30,2,["error"]],[30,1,["model","app","login","open"]]]],null],[1,"\\n "]],[]]]]],[1,"\\n\\n "],[8,[39,5],null,[["@name"],["loaded"]],[["default"],[[[[1,"\\n"],[44,[[28,[37,4],null,[["value","change"],[[28,[37,8],[[33,9],"Name:asc"],null],[28,[37,10],[[30,0],[28,[37,11],[[33,9]],null]],[["value"],["target.selected"]]]]]],[28,[37,4],null,[["searchproperty"],[[28,[37,4],null,[["value","change","default"],[[52,[28,[37,13],[[33,14],[27]],null],[28,[37,15],[[33,14],","],null],[33,16]],[28,[37,10],[[30,0],[28,[37,11],[[33,14]],null]],[["value"],["target.selectedItems"]]],[33,16]]]]]]],[30,2,["data"]]],[[[1,"\\n "],[8,[39,17],null,null,[["default"],[[[[1,"\\n "],[8,[39,5],null,[["@name"],["header"]],[["default"],[[[[1,"\\n "],[10,"h1"],[12],[1,"\\n "],[8,[30,1,["Title"]],null,[["@title"],["Admin Partitions"]],null],[1,"\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,5],null,[["@name"],["actions"]],[["default"],[[[[1,"\\n"],[41,[28,[37,18],["create partitions"],null],[[[1," "],[8,[39,19],null,[["@text","@route"],["Create","dc.partitions.create"]],null],[1,"\\n"]],[]],null],[1," "]],[]]]]],[1,"\\n "],[8,[39,5],null,[["@name"],["toolbar"]],[["default"],[[[[1,"\\n"],[41,[28,[37,20],[[30,5,["length"]],0],null],[[[1," "],[8,[39,21],null,[["@search","@onsearch","@sort","@filter"],[[99,22,["@search"]],[28,[37,10],[[30,0],[28,[37,11],[[33,22]],null]],[["value"],["target.value"]]],[30,3],[30,4]]],null],[1,"\\n"]],[]],null],[1," "]],[]]]]],[1,"\\n "],[8,[39,5],null,[["@name"],["content"]],[["default"],[[[[1,"\\n "],[8,[39,23],null,[["@sink","@type","@label","@ondelete"],[[28,[37,3],["/${partition}/${dc}/${nspace}/partition/",[28,[37,4],null,[["partition","nspace","dc"],[[30,1,["params","partition"]],[30,1,["params","nspace"]],[30,1,["params","dc"]]]]]],null],"partition","Partition",[99,24,["@ondelete"]]]],[["default"],[[[[1,"\\n "],[8,[39,5],null,[["@name"],["removed"]],[["default"],[[[[1,"\\n "],[8,[39,25],[[4,[38,26],null,[["after"],[[28,[37,10],[[30,0],[30,7]],null]]]]],[["@type"],["remove"]],null],[1,"\\n "]],[7]]]]],[1,"\\n "],[8,[39,5],null,[["@name"],["content"]],[["default"],[[[[1,"\\n "],[8,[39,27],null,[["@type","@sort","@filters","@search","@items"],["nspace",[30,3,["value"]],[30,4],[99,22,["@search"]],[30,5]]],[["default"],[[[[1,"\\n "],[8,[30,8,["Collection"]],null,null,[["default"],[[[[1,"\\n "],[8,[39,28],null,[["@items","@ondelete"],[[30,8,["items"]],[30,6,["delete"]]]],null],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[30,8,["Empty"]],null,null,[["default"],[[[[1,"\\n "],[8,[39,29],null,[["@login"],[[30,1,["model","app","login","open"]]]],[["default"],[[[[1,"\\n "],[8,[39,5],null,[["@name"],["header"]],[["default"],[[[[1,"\\n "],[10,"h2"],[12],[1,"\\n "],[1,[28,[35,30],["routes.dc.partitions.index.empty.header"],[["items"],[[30,5,["length"]]]]]],[1,"\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,5],null,[["@name"],["body"]],[["default"],[[[[1,"\\n "],[10,2],[12],[1,"\\n "],[1,[28,[35,30],["routes.dc.partitions.index.empty.body"],[["items","canUseACLs"],[[30,5,["length"]],[28,[37,18],["use acls"],null]]]]],[1,"\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,5],null,[["@name"],["actions"]],[["default"],[[[[1,"\\n "],[10,"li"],[14,0,"docs-link"],[12],[1,"\\n "],[8,[39,10],null,[["@href","@external"],[[29,[[28,[37,31],["CONSUL_DOCS_URL"],null],"/enterprise/admin-partitions"]],true]],[["default"],[[[[1,"\\n Documentation on Admin Partitions\\n "]],[]]]]],[1,"\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n "]],[]]]]],[1,"\\n "]],[]]]]],[1,"\\n "]],[8]]]]],[1,"\\n "]],[]]]]],[1,"\\n "]],[6]]]]],[1,"\\n "]],[]]]]],[1,"\\n "]],[]]]]],[1,"\\n"]],[3,4,5]]],[1," "]],[]]]]],[1,"\\n "]],[2]]]]],[1,"\\n"]],[1]]]]],[1,"\\n"]],["route","loader","sort","filters","items","writer","after","collection"],false,["route","routeName","data-loader","uri","hash","block-slot","app-error","let","or","sortBy","action","mut","if","not-eq","searchproperty","split","searchProperties","app-view","can","hds/button","gt","consul/partition/search-bar","search","data-writer","refresh-route","consul/partition/notifications","notification","data-collection","consul/partition/list","empty-state","t","env"]]',moduleName:"consul-ui/templates/dc/partitions/index.hbs",isStrictMode:!1}) +e.default=n})),define("consul-ui/templates/dc/peers/index",["exports","@ember/template-factory"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +var n=(0,t.createTemplateFactory)({id:"mLlJfy/N",block:'[[[8,[39,0],null,[["@name"],[[99,1,["@name"]]]],[["default"],[[[[1,"\\n "],[8,[39,2],null,[["@src"],[[28,[37,3],["/${partition}/${nspace}/${dc}/peers",[28,[37,4],null,[["partition","nspace","dc"],[[30,1,["params","partition"]],[30,1,["params","nspace"]],[30,1,["params","dc"]]]]]],null]]],[["default"],[[[[1,"\\n\\n "],[8,[39,5],null,[["@name"],["error"]],[["default"],[[[[1,"\\n "],[8,[39,6],null,[["@error","@login"],[[30,2,["error"]],[30,1,["model","app","login","open"]]]],null],[1,"\\n "]],[]]]]],[1,"\\n\\n "],[8,[39,5],null,[["@name"],["loaded"]],[["default"],[[[[1,"\\n"],[44,[[28,[37,4],null,[["value","change"],[[28,[37,8],[[33,9],"State:asc"],null],[28,[37,10],[[30,0],[28,[37,11],[[33,9]],null]],[["value"],["target.selected"]]]]]],[28,[37,4],null,[["state","searchproperty"],[[28,[37,4],null,[["value","change"],[[52,[33,13],[28,[37,14],[[33,13],","],null],[27]],[28,[37,10],[[30,0],[28,[37,11],[[33,13]],null]],[["value"],["target.selectedItems"]]]]]],[28,[37,4],null,[["value","change","default"],[[52,[28,[37,15],[[33,16],[27]],null],[28,[37,14],[[33,16],","],null],[33,17]],[28,[37,10],[[30,0],[28,[37,11],[[33,16]],null]],[["value"],["target.selectedItems"]]],[33,17]]]]]]],[30,2,["data"]]],[[[1," "],[8,[39,18],null,null,[["default"],[[[[1,"\\n "],[8,[39,5],null,[["@name"],["header"]],[["default"],[[[[1,"\\n "],[10,"h1"],[12],[1,"\\n "],[8,[30,1,["Title"]],null,[["@title"],["Peers"]],null],[1,"\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,5],null,[["@name"],["toolbar"]],[["default"],[[[[1,"\\n\\n"],[41,[28,[37,19],[[30,5,["length"]],0],null],[[[1," "],[8,[39,20],null,[["@search","@onsearch","@sort","@filter"],[[99,21,["@search"]],[28,[37,10],[[30,0],[28,[37,11],[[33,21]],null]],[["value"],["target.value"]]],[30,3],[30,4]]],null],[1,"\\n"]],[]],null],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,5],null,[["@name"],["actions"]],[["default"],[[[[1,"\\n\\n "],[8,[39,22],[[24,0,"peer-create-modal"]],[["@aria"],[[28,[37,4],null,[["label"],["Add peer connection"]]]]],[["default"],[[[[1,"\\n "],[8,[39,5],null,[["@name"],["header"]],[["default"],[[[[1,"\\n "],[1,[28,[35,23],[[28,[37,24],[[30,0],"create",[30,6]],null]],null]],[1,"\\n "],[10,"h2"],[12],[1,"\\n Add peer connection\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,5],null,[["@name"],["body"]],[["default"],[[[[1,"\\n\\n"],[41,[30,6,["opened"]],[[[1," "],[8,[39,25],null,[["@params"],[[30,1,["params"]]]],[["default"],[[[[1,"\\n "],[8,[30,7,["Form"]],null,[["@onchange","@onsubmit"],[[30,2,["invalidate"]],[28,[37,26],[[30,0,["redirectToPeerShow"]],[30,6,["close"]]],null]]],[["default"],[[[[1,"\\n "],[1,[28,[35,23],[[28,[37,24],[[30,0],"form",[30,8]],null]],null]],[1,"\\n "],[8,[30,8,["Fieldsets"]],null,null,null],[1,"\\n "]],[8]]]]],[1,"\\n "]],[7]]]]],[1,"\\n"]],[]],null],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,5],null,[["@name"],["actions"]],[["default"],[[[[1,"\\n "],[8,[30,0,["form","Actions"]],null,[["@onclose"],[[30,0,["create","close"]]]],null],[1,"\\n "]],[]]]]],[1,"\\n "]],[6]]]]],[1,"\\n "],[8,[39,27],[[4,[38,28],["click",[28,[37,29],[[30,0,["create","open"]]],null]],null]],[["@color","@text"],["primary","Add peer connection"]],null],[1,"\\n\\n "]],[]]]]],[1,"\\n "],[8,[39,5],null,[["@name"],["content"]],[["default"],[[[[1,"\\n\\n "],[8,[39,30],null,[["@sink","@type","@label"],[[28,[37,3],["/${partition}/${dc}/${nspace}/peer/",[28,[37,4],null,[["partition","nspace","dc"],[[30,1,["params","partition"]],[30,1,["params","nspace"]],[30,1,["params","dc"]]]]]],null],"peer","Peer"]],[["default"],[[[[1,"\\n\\n "],[8,[39,5],null,[["@name"],["removed"]],[["default"],[[[[1,"\\n "],[8,[39,31],[[4,[38,32],null,[["after"],[[28,[37,10],[[30,0],[30,10]],null]]]]],[["@type"],["remove"]],null],[1,"\\n "]],[10]]]]],[1,"\\n "],[8,[39,5],null,[["@name"],["content"]],[["default"],[[[[1,"\\n\\n "],[8,[39,22],null,[["@aria","@onclose"],[[28,[37,4],null,[["label"],["Regenerate token"]]],[28,[37,24],[[30,0],"item",[27]],null]]],[["default"],[[[[1,"\\n "],[8,[39,5],null,[["@name"],["header"]],[["default"],[[[[1,"\\n "],[1,[28,[35,23],[[28,[37,24],[[30,0],"regenerate",[30,11]],null]],null]],[1,"\\n "],[10,"h2"],[12],[1,"\\n Regenerate token\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,5],null,[["@name"],["body"]],[["default"],[[[[1,"\\n"],[41,[30,0,["item"]],[[[1," "],[8,[39,33],null,[["@item","@onchange","@regenerate"],[[30,0,["item"]],[30,2,["invalidate"]],true]],[["default"],[[[[1,"\\n "],[1,[28,[35,23],[[28,[37,24],[[30,0],"regenerateForm",[30,12]],null]],null]],[1,"\\n "],[8,[30,12,["Fieldsets"]],null,null,null],[1,"\\n "]],[12]]]]],[1,"\\n"]],[]],null],[1," "]],[]]]]],[1,"\\n "],[8,[39,5],null,[["@name"],["actions"]],[["default"],[[[[1,"\\n "],[8,[30,0,["regenerateForm","Actions"]],null,[["@onclose"],[[30,0,["regenerate","close"]]]],null],[1,"\\n "]],[]]]]],[1,"\\n "]],[11]]]]],[1,"\\n\\n "],[8,[39,34],null,[["@type","@sort","@filters","@search","@items"],["peer",[30,3,["value"]],[30,4],[99,21,["@search"]],[30,5]]],[["default"],[[[[1,"\\n "],[8,[30,13,["Collection"]],null,null,[["default"],[[[[1,"\\n\\n "],[8,[39,35],null,[["@items","@onedit","@ondelete"],[[30,13,["items"]],[28,[37,36],[[28,[37,24],[[30,0],"item"],null],[30,0,["regenerate","open"]]],null],[30,9,["delete"]]]],null],[1,"\\n\\n "]],[]]]]],[1,"\\n "],[8,[30,13,["Empty"]],null,null,[["default"],[[[[1,"\\n"],[1," "],[8,[39,37],null,[["@login"],[[30,1,["model","app","login","open"]]]],[["default"],[[[[1,"\\n "],[8,[39,5],null,[["@name"],["header"]],[["default"],[[[[1,"\\n "],[10,"h2"],[12],[1,"\\n "],[1,[28,[35,38],["routes.dc.peers.index.empty.header"],[["items"],[[30,5,["length"]]]]]],[1,"\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,5],null,[["@name"],["body"]],[["default"],[[[[1,"\\n "],[10,2],[12],[1,"\\n "],[1,[28,[35,38],["routes.dc.peers.index.empty.body"],[["items","canUsePartitions","canUseACLs","htmlSafe"],[[30,5,["length"]],[28,[37,39],["use partitions"],null],[28,[37,39],["use acls"],null],true]]]],[1,"\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,5],null,[["@name"],["actions"]],[["default"],[[[[1,"\\n "],[10,"li"],[12],[1,"\\n"],[1," "],[8,[39,40],null,[["@text","@href","@icon","@iconPosition","@size"],["Documentation on Peers",[29,[[28,[37,41],["CONSUL_DOCS_URL"],null],"/connect/cluster-peering"]],"docs-link","trailing","small"]],null],[1,"\\n "],[13],[1,"\\n "],[10,"li"],[12],[1,"\\n "],[8,[39,40],null,[["@text","@href","@icon","@iconPosition","@size"],["Take the tutorial",[29,[[28,[37,41],["CONSUL_DOCS_URL"],null],"/connect/cluster-peering/create-manage-peering"]],"learn-link","trailing","small"]],null],[1,"\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n "]],[]]]]],[1,"\\n "]],[]]]]],[1,"\\n "]],[13]]]]],[1,"\\n "]],[]]]]],[1,"\\n "]],[9]]]]],[1,"\\n "]],[]]]]],[1,"\\n "]],[]]]]],[1,"\\n"]],[3,4,5]]],[1," "]],[]]]]],[1,"\\n "]],[2]]]]],[1,"\\n"]],[1]]]]]],["route","loader","sort","filters","items","modal","form","form","writer","after","modal","form","collection"],false,["route","routeName","data-loader","uri","hash","block-slot","app-error","let","or","sortBy","action","mut","if","state","split","not-eq","searchproperty","searchProperties","app-view","gt","consul/peer/search-bar","search","modal-dialog","did-insert","set","consul/peer/form","fn","hds/button","on","optional","data-writer","consul/peer/notifications","notification","consul/peer/form/generate","data-collection","consul/peer/list","queue","empty-state","t","can","hds/link/standalone","env"]]',moduleName:"consul-ui/templates/dc/peers/index.hbs",isStrictMode:!1}) +e.default=n})),define("consul-ui/templates/dc/peers/show",["exports","@ember/template-factory"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +var n=(0,t.createTemplateFactory)({id:"Omb1G6/B",block:'[[[8,[39,0],null,[["@name"],[[99,1,["@name"]]]],[["default"],[[[[1,"\\n "],[8,[39,2],null,[["@src"],[[28,[37,3],["/${partition}/${nspace}/${dc}/peer/${name}",[28,[37,4],null,[["partition","nspace","dc","name"],[[30,1,["params","partition"]],[30,1,["params","nspace"]],[30,1,["params","dc"]],[30,1,["params","name"]]]]]],null]]],[["default"],[[[[1,"\\n\\n "],[8,[39,5],null,[["@name"],["error"]],[["default"],[[[[1,"\\n "],[8,[39,6],null,[["@error","@login"],[[30,2,["error"]],[30,1,["model","app","login","open"]]]],null],[1,"\\n "]],[]]]]],[1,"\\n\\n "],[8,[39,5],null,[["@name"],["loaded"]],[["default"],[[[[1,"\\n"],[44,[[30,1,["params","dc"]],[30,1,["params","partition"]],[30,1,["params","nspace"]],[30,2,["data"]]],[[[1," "],[8,[39,8],null,null,[["default"],[[[[1,"\\n "],[8,[39,5],null,[["@name"],["breadcrumbs"]],[["default"],[[[[1,"\\n "],[10,"ol"],[12],[1,"\\n "],[10,"li"],[12],[10,3],[15,6,[28,[37,9],["dc.peers"],null]],[12],[1,"All Peers"],[13],[13],[1,"\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,5],null,[["@name"],["header"]],[["default"],[[[[1,"\\n "],[10,"h1"],[12],[1,"\\n "],[8,[30,1,["Title"]],null,[["@title"],[[30,6,["Name"]]]],null],[1,"\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,5],null,[["@name"],["content"]],[["default"],[[[[1,"\\n "],[8,[39,10],null,[["@peering"],[[30,6]]],null],[1,"\\n "],[8,[39,11],null,[["@peer"],[[30,6]]],[["default"],[[[[1,"\\n "],[8,[39,12],null,[["@items"],[[30,7,["data","tabs"]]]],null],[1,"\\n\\n "]],[7]]]]],[1,"\\n "],[8,[39,13],null,[["@name","@model"],[[99,1,["@name"]],[28,[37,14],[[28,[37,4],null,[["items","peer"],[[30,6,["PeerServerAddresses"]],[30,6]]]],[30,1,["model"]]],null]]],[["default"],[[[[1,"\\n "],[46,[28,[37,16],null,null],null,null,null],[1,"\\n "]],[8]]]]],[1,"\\n "]],[]]]]],[1,"\\n "]],[]]]]],[1,"\\n"]],[3,4,5,6]]],[1," "]],[]]]]],[1,"\\n "]],[2]]]]],[1,"\\n"]],[1]]]]]],["route","loader","dc","partition","nspace","item","peering","o"],false,["route","routeName","data-loader","uri","hash","block-slot","app-error","let","app-view","href-to","consul/peer/bento-box","peerings/provider","tab-nav","outlet","assign","component","-outlet"]]',moduleName:"consul-ui/templates/dc/peers/show.hbs",isStrictMode:!1}) +e.default=n})),define("consul-ui/templates/dc/peers/show/addresses",["exports","@ember/template-factory"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +var n=(0,t.createTemplateFactory)({id:"An6ASLD6",block:'[[[8,[39,0],null,[["@name"],[[99,1,["@name"]]]],[["default"],[[[[1,"\\n"],[41,[28,[37,3],[[30,1,["model","items","length"]],0],null],[[[1," "],[8,[39,4],null,[["@items"],[[30,1,["model","items"]]]],null],[1,"\\n"]],[]],[[[1," "],[8,[39,5],null,[["@login"],[[30,1,["model","app","login","open"]]]],[["default"],[[[[1,"\\n "],[8,[39,6],null,[["@name"],["header"]],[["default"],[[[[1,"\\n "],[10,"h2"],[12],[1,"\\n "],[1,[28,[35,7],["routes.dc.peers.show.addresses.empty.header"],null]],[1,"\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,6],null,[["@name"],["body"]],[["default"],[[[[1,"\\n "],[1,[28,[35,7],["routes.dc.peers.show.addresses.empty.body"],[["htmlSafe"],[true]]]],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,6],null,[["@name"],["actions"]],[["default"],[[[[1,"\\n "],[10,"li"],[12],[1,"\\n "],[8,[39,8],null,[["@text","@href","@icon","@iconPosition","@size"],["Documentation on Peers",[29,[[28,[37,9],["CONSUL_DOCS_URL"],null],"/connect/cluster-peering"]],"docs-link","trailing","small"]],null],[1,"\\n "],[13],[1,"\\n "],[10,"li"],[12],[1,"\\n "],[8,[39,8],null,[["@text","@href","@icon","@iconPosition","@size"],["Take the tutorial",[29,[[28,[37,9],["CONSUL_DOCS_URL"],null],"/connect/cluster-peering/create-manage-peering"]],"learn-link","trailing","small"]],null],[1,"\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n "]],[]]]]],[1,"\\n"]],[]]]],[1]]]]]],["route"],false,["route","routeName","if","gt","consul/peer/address/list","empty-state","block-slot","t","hds/link/standalone","env"]]',moduleName:"consul-ui/templates/dc/peers/show/addresses.hbs",isStrictMode:!1}) +e.default=n})),define("consul-ui/templates/dc/peers/show/exported",["exports","@ember/template-factory"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +var n=(0,t.createTemplateFactory)({id:"nW3ZeYXo",block:'[[[8,[39,0],null,[["@name"],[[99,1,["@name"]]]],[["default"],[[[[1,"\\n "],[8,[39,2],null,[["@src"],[[28,[37,3],["/${partition}/${nspace}/${dc}/exported-services/${name}",[28,[37,4],null,[["partition","nspace","dc","name"],[[30,1,["params","partition"]],[30,1,["params","nspace"]],[30,1,["params","dc"]],[30,1,["model","peer","Name"]]]]]],null]]],[["default"],[[[[1,"\\n"],[44,[[28,[37,6],[[30,1,["params","partition"]],[30,1,["model","user","token","Partition"]],"default"],null],[30,2,["data"]]],[[[1,"\\n "],[8,[39,7],null,[["@name"],["error"]],[["default"],[[[[1,"\\n "],[8,[39,8],null,[["@error","@login"],[[30,2,["error"]],[30,1,["model","app","login","open"]]]],null],[1,"\\n "]],[]]]]],[1,"\\n\\n "],[8,[39,7],null,[["@name"],["loaded"]],[["default"],[[[[1,"\\n"],[41,[30,4,["length"]],[[[1," "],[10,0],[14,0,"search-bar"],[12],[1,"\\n "],[10,"form"],[14,0,"filter-bar"],[12],[1,"\\n "],[8,[39,10],[[24,0,"!w-80"]],[["@onsearch","@value","@placeholder"],[[28,[37,11],["target.value",[30,0,["updateSearch"]]],null],[30,0,["search"]],"Search"]],null],[1,"\\n "],[13],[1,"\\n "],[13],[1,"\\n"]],[]],null],[1," "],[8,[39,12],null,[["@items","@search","@searchProperties"],[[30,4],[30,0,["search"]],[28,[37,13],["Name"],null]]],[["default"],[[[[1,"\\n "],[8,[39,14],null,null,[["default"],[[[[1,"\\n"],[41,[30,6,["data","height"]],[[[1," "],[10,0],[15,5,[30,6,["data","fillRemainingHeightStyle"]]],[14,0,"overflow-y-scroll"],[12],[1,"\\n"],[41,[30,5,["data","items","length"]],[[[1," "],[8,[39,15],null,[["@tagName","@estimateHeight","@items"],["ul",[30,6,["data","height"]],[30,5,["data","items"]]]],[["default"],[[[[1,"\\n "],[10,"li"],[14,0,"px-3 h-12 border-bottom-primary"],[12],[1,"\\n "],[10,3],[14,0,"hds-typography-display-300 hds-foreground-strong hds-font-weight-semibold h-full w-full flex items-center"],[15,6,[28,[37,16],["dc.services.show.index",[30,7,["Name"]]],[["params"],[[52,[28,[37,17],[[30,7,["Partition"]],[30,3]],null],[28,[37,4],null,[["partition","nspace","peer"],[[30,7,["Partition"]],[30,7,["Namespace"]],[30,7,["PeerName"]]]]],[28,[37,4],null,[["peer"],[[30,7,["PeerName"]]]]]]]]]],[12],[1,"\\n "],[1,[30,7,["Name"]]],[1,"\\n "],[13],[1,"\\n "],[13],[1,"\\n "]],[7,8]]]]],[1,"\\n"]],[]],[[[1," "],[8,[39,18],null,[["@login"],[[30,1,["model","app","login","open"]]]],[["default"],[[[[1,"\\n "],[8,[39,7],null,[["@name"],["header"]],[["default"],[[[[1,"\\n "],[10,"h2"],[12],[1,"\\n "],[1,[28,[35,19],["routes.dc.peers.show.exported.empty.header"],[["name"],[[30,1,["model","peer","Name"]]]]]],[1,"\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,7],null,[["@name"],["body"]],[["default"],[[[[1,"\\n "],[1,[28,[35,19],["routes.dc.peers.show.exported.empty.body"],[["items","name","htmlSafe"],[[30,4,["length"]],[30,1,["model","peer","Name"]],true]]]],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,7],null,[["@name"],["actions"]],[["default"],[[[[1,"\\n "],[10,"li"],[12],[1,"\\n "],[8,[39,20],null,[["@text","@href","@icon","@iconPosition","@size"],["Documentation on Peers",[29,[[28,[37,21],["CONSUL_DOCS_URL"],null],"/connect/cluster-peering"]],"docs-link","trailing","small"]],null],[1,"\\n "],[13],[1,"\\n "],[10,"li"],[12],[1,"\\n "],[8,[39,20],null,[["@text","@href","@icon","@iconPosition","@size"],["Take the tutorial",[29,[[28,[37,21],["CONSUL_DOCS_URL"],null],"/connect/cluster-peering/create-manage-peering"]],"learn-link","trailing","small"]],null],[1,"\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n "]],[]]]]],[1,"\\n"]],[]]],[1," "],[13],[1,"\\n"]],[]],null],[1," "]],[6]]]]],[1,"\\n\\n "]],[5]]]]],[1,"\\n "]],[]]]]],[1,"\\n"]],[3,4]]],[1," "]],[2]]]]],[1,"\\n\\n"]],[1]]]]]],["route","api","partition","items","search","p","service","index"],false,["route","routeName","data-loader","uri","hash","let","or","block-slot","app-error","if","freetext-filter","pick","providers/search","array","providers/dimension","vertical-collection","href-to","not-eq","empty-state","t","hds/link/standalone","env"]]',moduleName:"consul-ui/templates/dc/peers/show/exported.hbs",isStrictMode:!1}) +e.default=n})) +define("consul-ui/templates/dc/peers/show/imported",["exports","@ember/template-factory"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +var n=(0,t.createTemplateFactory)({id:"LzFp9Hrp",block:'[[[8,[39,0],null,[["@name"],[[99,1,["@name"]]]],[["default"],[[[[1,"\\n "],[8,[39,2],null,[["@src"],[[28,[37,3],["/${partition}/${nspace}/${dc}/services/${peer}/${peerId}",[28,[37,4],null,[["partition","nspace","dc","peer","peerId"],[[30,1,["params","partition"]],[30,1,["params","nspace"]],[30,1,["params","dc"]],[30,1,["model","peer","Name"]],[30,1,["model","peer","id"]]]]]],null]]],[["default"],[[[[1,"\\n\\n "],[8,[39,5],null,[["@name"],["error"]],[["default"],[[[[1,"\\n "],[8,[39,6],null,[["@error","@login"],[[30,2,["error"]],[30,1,["model","app","login","open"]]]],null],[1,"\\n "]],[]]]]],[1,"\\n\\n "],[8,[39,5],null,[["@name"],["loaded"]],[["default"],[[[[1,"\\n"],[44,[[28,[37,4],null,[["value","change"],[[28,[37,8],[[33,9],"Status:asc"],null],[28,[37,10],[[30,0],[28,[37,11],[[33,9]],null]],[["value"],["target.selected"]]]]]],[28,[37,4],null,[["status","kind","source","searchproperty"],[[28,[37,4],null,[["value","change"],[[52,[33,13],[28,[37,14],[[33,13],","],null],[27]],[28,[37,10],[[30,0],[28,[37,11],[[33,13]],null]],[["value"],["target.selectedItems"]]]]]],[28,[37,4],null,[["value","change"],[[52,[33,15],[28,[37,14],[[33,15],","],null],[27]],[28,[37,10],[[30,0],[28,[37,11],[[33,15]],null]],[["value"],["target.selectedItems"]]]]]],[28,[37,4],null,[["value","change"],[[52,[33,16],[28,[37,14],[[33,16],","],null],[27]],[28,[37,10],[[30,0],[28,[37,11],[[33,16]],null]],[["value"],["target.selectedItems"]]]]]],[28,[37,4],null,[["value","change","default"],[[52,[28,[37,17],[[33,18],[27]],null],[28,[37,14],[[33,18],","],null],[30,0,["searchProperties"]]],[28,[37,10],[[30,0],[28,[37,11],[[33,18]],null]],[["value"],["target.selectedItems"]]],[30,0,["searchProperties"]]]]]]]],[28,[37,19],["Kind","connect-proxy",[30,2,["data"]]],null],[28,[37,8],[[30,1,["params","partition"]],[30,1,["model","user","token","Partition"]],"default"],null],[28,[37,8],[[30,1,["params","nspace"]],[30,1,["model","user","token","Namespace"]],"default"],null]],[[[1,"\\n"],[41,[28,[37,20],[[30,5,["length"]],0],null],[[[44,[[28,[37,21],[[30,5]],null]],[[[1," "],[8,[39,22],null,[["@sources","@partitions","@partition","@search","@onsearch","@sort","@filter","@peer"],[[28,[37,23],[[30,8],"ExternalSources"],null],[28,[37,23],[[30,8],"Partitions"],null],[30,6],[99,24,["@search"]],[28,[37,10],[[30,0],[28,[37,11],[[33,24]],null]],[["value"],["target.value"]]],[30,3],[30,4],[30,1,["model","peer"]]]],null],[1,"\\n"]],[8]]]],[]],null],[1," "],[8,[39,25],null,[["@type","@sort","@filters","@search","@items"],["service",[30,3,["value"]],[30,4],[99,24,["@search"]],[30,5]]],[["default"],[[[[1,"\\n "],[8,[30,9,["Collection"]],null,null,[["default"],[[[[1,"\\n "],[8,[39,26],null,[["@items","@partition","@isPeerDetail"],[[30,9,["items"]],[30,6],true]],null],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[30,9,["Empty"]],null,null,[["default"],[[[[1,"\\n "],[8,[39,27],null,[["@login"],[[30,1,["model","app","login","open"]]]],[["default"],[[[[1,"\\n "],[8,[39,5],null,[["@name"],["header"]],[["default"],[[[[1,"\\n "],[10,"h2"],[12],[1,"\\n "],[1,[28,[35,28],["routes.dc.peers.show.imported.empty.header"],[["name"],[[30,1,["model","peer","Name"]]]]]],[1,"\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,5],null,[["@name"],["body"]],[["default"],[[[[1,"\\n "],[1,[28,[35,28],["routes.dc.peers.show.imported.empty.body"],[["items","name","htmlSafe"],[[30,5,["length"]],[30,1,["model","peer","Name"]],true]]]],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,5],null,[["@name"],["actions"]],[["default"],[[[[1,"\\n "],[10,"li"],[12],[1,"\\n"],[1," "],[8,[39,29],null,[["@text","@href","@icon","@iconPosition","@size"],["Documentation on Peers",[29,[[28,[37,30],["CONSUL_DOCS_URL"],null],"/connect/cluster-peering"]],"docs-link","trailing","small"]],null],[1,"\\n "],[13],[1,"\\n "],[10,"li"],[12],[1,"\\n "],[8,[39,29],null,[["@text","@href","@icon","@iconPosition","@size"],["Take the tutorial",[29,[[28,[37,30],["CONSUL_DOCS_URL"],null],"/connect/cluster-peering/create-manage-peering"]],"learn-link","trailing","small"]],null],[1,"\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n "]],[]]]]],[1,"\\n "]],[]]]]],[1,"\\n "]],[9]]]]],[1,"\\n"]],[3,4,5,6,7]]],[1," "]],[]]]]],[1,"\\n "]],[2]]]]],[1,"\\n"]],[1]]]]]],["route","api","sort","filters","items","partition","nspace","items","collection"],false,["route","routeName","data-loader","uri","hash","block-slot","app-error","let","or","sortBy","action","mut","if","status","split","kind","source","not-eq","searchproperty","reject-by","gt","collection","consul/service/search-bar","get","search","data-collection","consul/service/list","empty-state","t","hds/link/standalone","env"]]',moduleName:"consul-ui/templates/dc/peers/show/imported.hbs",isStrictMode:!1}) +e.default=n})),define("consul-ui/templates/dc/peers/show/index",["exports","@ember/template-factory"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +var n=(0,t.createTemplateFactory)({id:"gn6gS8WU",block:'[[[8,[39,0],null,[["@name"],[[99,1,["@name"]]]],[["default"],[[[[1,"\\n "],[1,[28,[35,2],[[30,0,["transitionToImported"]]],null]],[1,"\\n"]],[1]]]]]],["route"],false,["route","routeName","did-insert"]]',moduleName:"consul-ui/templates/dc/peers/show/index.hbs",isStrictMode:!1}) +e.default=n})),define("consul-ui/templates/dc/routing-config",["exports","@ember/template-factory"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +var n=(0,t.createTemplateFactory)({id:"wffPe0l/",block:'[[[8,[39,0],null,[["@name"],[[99,1,["@name"]]]],[["default"],[[[[1,"\\n\\n "],[8,[39,2],null,[["@src"],[[28,[37,3],["/${partition}/${nspace}/${dc}/discovery-chain/${name}",[28,[37,4],null,[["partition","nspace","dc","name"],[[30,1,["params","partition"]],[30,1,["params","nspace"]],[30,1,["params","dc"]],[30,1,["params","name"]]]]]],null]]],[["default"],[[[[1,"\\n\\n "],[8,[39,5],null,[["@name"],["error"]],[["default"],[[[[1,"\\n "],[8,[39,6],null,[["@error","@login"],[[30,2,["error"]],[30,1,["model","app","login","open"]]]],null],[1,"\\n "]],[]]]]],[1,"\\n\\n "],[8,[39,5],null,[["@name"],["loaded"]],[["default"],[[[[1,"\\n"],[44,[[30,2,["data"]]],[[[8,[39,8],null,null,[["default"],[[[[1,"\\n "],[8,[39,5],null,[["@name"],["breadcrumbs"]],[["default"],[[[[1,"\\n "],[10,"ol"],[12],[1,"\\n "],[10,"li"],[12],[10,3],[15,6,[28,[37,9],["dc.services"],null]],[12],[1,"All Services"],[13],[13],[1,"\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,5],null,[["@name"],["header"]],[["default"],[[[[1,"\\n "],[10,"h1"],[12],[1,"\\n "],[8,[30,1,["Title"]],null,[["@title"],[[30,3,["Chain","ServiceName"]]]],null],[1,"\\n "],[13],[1,"\\n "],[8,[39,10],null,[["@source","@withInfo"],[[28,[37,11],["routes.dc.routing-config.source"],null],true]],null],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,5],null,[["@name"],["content"]],[["default"],[[[[1,"\\n "],[10,0],[14,0,"container"],[12],[1,"\\n "],[8,[39,12],null,[["@chain"],[[30,3,["Chain"]]]],null],[1,"\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n"]],[]]]]],[1,"\\n"]],[3]]],[1," "]],[]]]]],[1,"\\n "]],[2]]]]],[1,"\\n"]],[1]]]]],[1,"\\n"]],["route","loader","item"],false,["route","routeName","data-loader","uri","hash","block-slot","app-error","let","app-view","href-to","consul/source","t","consul/discovery-chain"]]',moduleName:"consul-ui/templates/dc/routing-config.hbs",isStrictMode:!1}) +e.default=n})),define("consul-ui/templates/dc/services/index",["exports","@ember/template-factory"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +var n=(0,t.createTemplateFactory)({id:"ixFFtisJ",block:'[[[8,[39,0],null,[["@name"],[[99,1,["@name"]]]],[["default"],[[[[1,"\\n\\n "],[8,[39,2],null,[["@src"],[[28,[37,3],["/${partition}/${nspace}/${dc}/services",[28,[37,4],null,[["partition","nspace","dc"],[[30,1,["params","partition"]],[30,1,["params","nspace"]],[30,1,["params","dc"]]]]]],null]]],[["default"],[[[[1,"\\n\\n "],[8,[39,5],null,[["@name"],["error"]],[["default"],[[[[1,"\\n "],[8,[39,6],null,[["@error","@login"],[[30,2,["error"]],[30,1,["model","app","login","open"]]]],null],[1,"\\n "]],[]]]]],[1,"\\n\\n "],[8,[39,5],null,[["@name"],["loaded"]],[["default"],[[[[1,"\\n\\n"],[44,[[28,[37,4],null,[["value","change"],[[28,[37,8],[[33,9],"Status:asc"],null],[28,[37,10],[[30,0],[28,[37,11],[[33,9]],null]],[["value"],["target.selected"]]]]]],[28,[37,4],null,[["status","kind","source","searchproperty"],[[28,[37,4],null,[["value","change"],[[52,[33,13],[28,[37,14],[[33,13],","],null],[27]],[28,[37,10],[[30,0],[28,[37,11],[[33,13]],null]],[["value"],["target.selectedItems"]]]]]],[28,[37,4],null,[["value","change"],[[52,[33,15],[28,[37,14],[[33,15],","],null],[27]],[28,[37,10],[[30,0],[28,[37,11],[[33,15]],null]],[["value"],["target.selectedItems"]]]]]],[28,[37,4],null,[["value","change"],[[52,[33,16],[28,[37,14],[[33,16],","],null],[27]],[28,[37,10],[[30,0],[28,[37,11],[[33,16]],null]],[["value"],["target.selectedItems"]]]]]],[28,[37,4],null,[["value","change","default"],[[52,[28,[37,17],[[33,18],[27]],null],[28,[37,14],[[33,18],","],null],[30,0,["_searchProperties"]]],[28,[37,10],[[30,0],[28,[37,11],[[33,18]],null]],[["value"],["target.selectedItems"]]],[30,0,["_searchProperties"]]]]]]]],[28,[37,19],["Kind","connect-proxy",[30,2,["data"]]],null],[28,[37,8],[[30,1,["params","partition"]],[30,1,["model","user","token","Partition"]],"default"],null],[28,[37,8],[[30,1,["params","nspace"]],[30,1,["model","user","token","Namespace"]],"default"],null]],[[[1,"\\n "],[8,[39,20],null,null,[["default"],[[[[1,"\\n "],[8,[39,5],null,[["@name"],["header"]],[["default"],[[[[1,"\\n "],[10,"h1"],[12],[1,"\\n "],[8,[30,1,["Title"]],null,[["@title"],["Services"]],null],[1," "],[10,"em"],[12],[1,[28,[35,21],[[30,5,["length"]]],null]],[1," total"],[13],[1,"\\n "],[13],[1,"\\n "],[10,"label"],[14,"for","toolbar-toggle"],[12],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,5],null,[["@name"],["toolbar"]],[["default"],[[[[1,"\\n"],[41,[28,[37,22],[[30,5,["length"]],0],null],[[[44,[[28,[37,23],[[30,5]],null]],[[[1," "],[8,[39,24],null,[["@sources","@partitions","@partition","@search","@onsearch","@sort","@filter"],[[28,[37,25],[[30,8],"ExternalSources"],null],[28,[37,25],[[30,8],"Partitions"],null],[30,6],[99,26,["@search"]],[28,[37,10],[[30,0],[28,[37,11],[[33,26]],null]],[["value"],["target.value"]]],[30,3],[30,4]]],null],[1,"\\n"]],[8]]]],[]],null],[1," "]],[]]]]],[1,"\\n "],[8,[39,5],null,[["@name"],["content"]],[["default"],[[[[1,"\\n "],[8,[39,27],null,[["@type","@sort","@filters","@search","@items"],["service",[30,3,["value"]],[30,4],[99,26,["@search"]],[30,5]]],[["default"],[[[[1,"\\n "],[8,[30,9,["Collection"]],null,null,[["default"],[[[[1,"\\n "],[8,[39,28],null,[["@items","@partition"],[[30,9,["items"]],[30,6]]],[["default"],[[[[1,"\\n "]],[]]]]],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[30,9,["Empty"]],null,null,[["default"],[[[[1,"\\n "],[8,[39,29],null,[["@login"],[[30,1,["model","app","login","open"]]]],[["default"],[[[[1,"\\n "],[8,[39,5],null,[["@name"],["header"]],[["default"],[[[[1,"\\n "],[10,"h2"],[12],[1,"\\n "],[1,[28,[35,30],["routes.dc.services.index.empty.header"],[["items"],[[30,5,["length"]]]]]],[1,"\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,5],null,[["@name"],["body"]],[["default"],[[[[1,"\\n "],[1,[28,[35,30],["routes.dc.services.index.empty.body"],[["items","canUseACLs","htmlSafe"],[[30,5,["length"]],[28,[37,31],["use acls"],null],true]]]],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,5],null,[["@name"],["actions"]],[["default"],[[[[1,"\\n "],[10,"li"],[12],[1,"\\n "],[8,[39,32],null,[["@text","@href","@icon","@iconPosition","@size"],["Documentation on Services",[29,[[28,[37,33],["CONSUL_DOCS_URL"],null],"/commands/services"]],"docs-link","trailing","small"]],null],[1,"\\n "],[13],[1,"\\n "],[10,"li"],[12],[1,"\\n "],[8,[39,32],null,[["@text","@href","@icon","@iconPosition","@size"],["Take the tutorial",[29,[[28,[37,33],["CONSUL_DOCS_LEARN_URL"],null],"/consul/getting-started/services"]],"learn-link","trailing","small"]],null],[1,"\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n "]],[]]]]],[1,"\\n "]],[]]]]],[1,"\\n "]],[9]]]]],[1,"\\n "]],[]]]]],[1,"\\n\\n "]],[]]]]],[1,"\\n\\n"]],[3,4,5,6,7]]],[1,"\\n "]],[]]]]],[1,"\\n "]],[2]]]]],[1,"\\n"]],[1]]]]],[1,"\\n"]],["route","api","sort","filters","items","partition","nspace","items","collection"],false,["route","routeName","data-loader","uri","hash","block-slot","app-error","let","or","sortBy","action","mut","if","status","split","kind","source","not-eq","searchproperty","reject-by","app-view","format-number","gt","collection","consul/service/search-bar","get","search","data-collection","consul/service/list","empty-state","t","can","hds/link/standalone","env"]]',moduleName:"consul-ui/templates/dc/services/index.hbs",isStrictMode:!1}) +e.default=n})),define("consul-ui/templates/dc/services/instance",["exports","@ember/template-factory"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +var n=(0,t.createTemplateFactory)({id:"qYqPny+P",block:'[[[8,[39,0],null,[["@name"],[[99,1,["@name"]]]],[["default"],[[[[1,"\\n "],[8,[39,2],null,[["@src"],[[28,[37,3],["/${partition}/${nspace}/${dc}/service-instance/${id}/${node}/${name}/${peer}",[28,[37,4],null,[["partition","nspace","dc","id","node","name","peer"],[[30,1,["params","partition"]],[30,1,["params","nspace"]],[30,1,["params","dc"]],[30,1,["params","id"]],[30,1,["params","node"]],[30,1,["params","name"]],[30,1,["params","peer"]]]]]],null]]],[["default"],[[[[1,"\\n\\n "],[8,[39,5],null,[["@name"],["error"]],[["default"],[[[[1,"\\n "],[8,[39,6],null,[["@error","@login"],[[30,2,["error"]],[30,1,["model","app","login","open"]]]],null],[1,"\\n "]],[]]]]],[1,"\\n\\n "],[8,[39,5],null,[["@name"],["disconnected"]],[["default"],[[[[1,"\\n"],[41,[28,[37,8],[[30,2,["error","status"]],"404"],null],[[[1," "],[8,[39,9],[[4,[38,10],null,[["sticky"],[true]]]],[["@color"],["warning"]],[["default"],[[[[1,"\\n "],[8,[30,4,["Title"]],null,null,[["default"],[[[[1,"Warning!"]],[]]]]],[1,"\\n "],[8,[30,4,["Description"]],null,null,[["default"],[[[[1,"\\n This service has been deregistered and no longer exists in the catalog.\\n "]],[]]]]],[1,"\\n "]],[4]]]]],[1,"\\n"]],[]],[[[41,[28,[37,8],[[30,2,["error","status"]],"403"],null],[[[1," "],[8,[39,9],[[4,[38,10],null,[["sticky"],[true]]]],[["@color"],["critical"]],[["default"],[[[[1,"\\n "],[8,[30,5,["Title"]],null,null,[["default"],[[[[1,"Error!"]],[]]]]],[1,"\\n "],[8,[30,5,["Description"]],null,null,[["default"],[[[[1,"\\n You no longer have access to this service.\\n "]],[]]]]],[1,"\\n "]],[5]]]]],[1,"\\n"]],[]],[[[1," "],[8,[39,9],[[4,[38,10],null,[["sticky"],[true]]]],[["@color"],["critical"]],[["default"],[[[[1,"\\n "],[8,[30,6,["Title"]],null,null,[["default"],[[[[1,"Warning!"]],[]]]]],[1,"\\n "],[8,[30,6,["Description"]],null,null,[["default"],[[[[1,"\\n An error was returned whilst loading this data, refresh to try again.\\n "]],[]]]]],[1,"\\n "]],[6]]]]],[1,"\\n "]],[]]]],[]]],[1," "]],[3]]]]],[1,"\\n\\n "],[8,[39,5],null,[["@name"],["loaded"]],[["default"],[[[[1,"\\n"],[44,[[30,2,["data"]]],[[[41,[30,7,["IsOrigin"]],[[[1," "],[8,[39,12],null,[["@src","@onchange"],[[28,[37,3],["/${partition}/${nspace}/${dc}/proxy-instance/${id}/${node}/${name}",[28,[37,4],null,[["partition","nspace","dc","id","node","name"],[[30,1,["params","partition"]],[30,1,["params","nspace"]],[30,1,["params","dc"]],[30,1,["params","id"]],[30,1,["params","node"]],[30,1,["params","name"]]]]]],null],[28,[37,13],[[30,0],[28,[37,14],[[33,15]],null]],[["value"],["data"]]]]],[["default"],[[[[1,"\\n"],[41,[30,8,["data","ServiceID"]],[[[1," "],[8,[39,12],null,[["@src","@onchange"],[[28,[37,3],["/${partition}/${nspace}/${dc}/service-instance/${id}/${node}/${name}/${peer}",[28,[37,4],null,[["partition","nspace","dc","id","node","name","peer"],[[30,1,["params","partition"]],[30,1,["params","nspace"]],[30,1,["params","dc"]],[30,8,["data","ServiceID"]],[30,8,["data","NodeName"]],[30,8,["data","ServiceName"]],[30,1,["params","peer"]]]]]],null],[28,[37,13],[[30,0],[28,[37,14],[[33,16]],null]],[["value"],["data"]]]]],null],[1,"\\n"]],[]],null],[1," "]],[8]]]]],[1,"\\n"]],[]],null],[1," "],[8,[39,17],null,null,[["default"],[[[[1,"\\n "],[8,[39,5],null,[["@name"],["breadcrumbs"]],[["default"],[[[[1,"\\n "],[10,"ol"],[12],[1,"\\n "],[10,"li"],[12],[10,3],[15,6,[28,[37,18],["dc.services"],[["params"],[[28,[37,4],null,[["peer"],[[27]]]]]]]],[12],[1,"All Services"],[13],[13],[1,"\\n "],[10,"li"],[12],[11,3],[16,6,[28,[37,18],["dc.services.show"],null]],[4,[38,19],[[28,[37,20],["Service (",[30,7,["Service","Service"]],")"],null]],null],[12],[1,"\\n Service ("],[1,[30,7,["Service","Service"]]],[1,")\\n "],[13],[13],[1,"\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,5],null,[["@name"],["header"]],[["default"],[[[[1,"\\n "],[10,"h1"],[12],[1,"\\n "],[8,[30,1,["Title"]],null,[["@title"],[[30,7,["Service","ID"]]]],null],[1,"\\n "],[13],[1,"\\n "],[8,[39,21],null,[["@item","@withInfo"],[[30,7],true]],null],[1,"\\n "],[8,[39,22],null,[["@item","@withInfo"],[[30,7],true]],null],[1,"\\n"],[41,[28,[37,8],[[33,15,["ServiceProxy","Mode"]],"transparent"],null],[[[1," "],[8,[39,23],null,null,null],[1,"\\n"]],[]],null],[1," "]],[]]]]],[1,"\\n "],[8,[39,5],null,[["@name"],["nav"]],[["default"],[[[[1,"\\n "],[10,"dl"],[12],[1,"\\n "],[10,"dt"],[12],[1,"Service Name"],[13],[1,"\\n "],[10,"dd"],[12],[10,3],[15,6,[29,[[28,[37,18],["dc.services.show",[30,7,["Service","Service"]]],null]]]],[12],[1,[30,7,["Service","Service"]]],[13],[13],[1,"\\n "],[13],[1,"\\n"],[41,[51,[30,7,["Node","Meta","synthetic-node"]]],[[[1," "],[10,"dl"],[12],[1,"\\n "],[10,"dt"],[12],[1,"Node Name"],[13],[1,"\\n "],[10,"dd"],[12],[10,3],[15,6,[29,[[28,[37,18],["dc.nodes.show",[30,7,["Node","Node"]]],null]]]],[12],[1,[30,7,["Node","Node"]]],[13],[13],[1,"\\n "],[13],[1,"\\n"]],[]],null],[41,[30,7,["Service","PeerName"]],[[[1," "],[10,"dl"],[12],[1,"\\n "],[10,"dt"],[12],[1,"Peer Name"],[13],[1,"\\n "],[10,"dd"],[12],[10,3],[15,6,[28,[37,18],["dc.peers.show",[30,7,["Service","PeerName"]]],[["params"],[[28,[37,4],null,[["peer"],[[27]]]]]]]],[12],[1,[30,7,["Service","PeerName"]]],[13],[13],[1,"\\n "],[13],[1,"\\n"]],[]],null],[1," "]],[]]]]],[1,"\\n "],[8,[39,5],null,[["@name"],["actions"]],[["default"],[[[[1,"\\n"],[44,[[28,[37,25],[[30,7,["Service","Address"]],[30,7,["Node","Address"]]],null]],[[[1," "],[8,[39,26],null,[["@value","@name"],[[30,9],"Address"]],[["default"],[[[[1,[30,9]]],[]]]]],[1,"\\n"]],[9]]],[1," "]],[]]]]],[1,"\\n "],[8,[39,5],null,[["@name"],["content"]],[["default"],[[[[1,"\\n "],[8,[39,27],null,[["@items"],[[28,[37,28],[[28,[37,29],[[28,[37,4],null,[["label","href","selected"],["Health Checks",[28,[37,18],["dc.services.instance.healthchecks"],null],[28,[37,30],["dc.services.instance.healthchecks"],null]]]],[52,[28,[37,8],[[30,7,["Service","Kind"]],"mesh-gateway"],null],[28,[37,4],null,[["label","href","selected"],["Addresses",[28,[37,18],["dc.services.instance.addresses"],null],[28,[37,30],["dc.services.instance.addresses"],null]]]]],[52,[33,16],[28,[37,4],null,[["label","href","selected"],["Upstreams",[28,[37,18],["dc.services.instance.upstreams"],null],[28,[37,30],["dc.services.instance.upstreams"],null]]]]],[52,[33,16],[28,[37,4],null,[["label","href","selected"],["Exposed Paths",[28,[37,18],["dc.services.instance.exposedpaths"],null],[28,[37,30],["dc.services.instance.exposedpaths"],null]]]]],[28,[37,4],null,[["label","href","selected"],["Tags & Meta",[28,[37,18],["dc.services.instance.metadata"],null],[28,[37,30],["dc.services.instance.metadata"],null]]]]],null]],null]]],null],[1,"\\n "],[8,[39,31],null,[["@name","@model"],[[99,1,["@name"]],[28,[37,32],[[28,[37,4],null,[["proxy","meta","item"],[[33,16],[33,15],[30,7]]]],[30,1,["model"]]],null]]],[["default"],[[[[1,"\\n "],[46,[28,[37,34],null,null],null,null,null],[1,"\\n "]],[10]]]]],[1,"\\n "]],[]]]]],[1,"\\n "]],[]]]]],[1,"\\n"]],[7]]],[1," "]],[]]]]],[1,"\\n "]],[2]]]]],[1,"\\n"]],[1]]]]]],["route","loader","after","T","T","T","item","meta","address","o"],false,["route","routeName","data-loader","uri","hash","block-slot","app-error","if","eq","hds/toast","notification","let","data-source","action","mut","meta","proxy","app-view","href-to","tooltip","concat","consul/external-source","consul/kind","consul/transparent-proxy","unless","or","copy-button","tab-nav","compact","array","is-href","outlet","assign","component","-outlet"]]',moduleName:"consul-ui/templates/dc/services/instance.hbs",isStrictMode:!1}) +e.default=n})),define("consul-ui/templates/dc/services/instance/addresses",["exports","@ember/template-factory"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +var n=(0,t.createTemplateFactory)({id:"OEv9mr5t",block:'[[[8,[39,0],null,[["@name"],[[99,1,["@name"]]]],[["default"],[[[[1,"\\n"],[44,[[28,[37,3],[[30,1,["model","item","Service","TaggedAddresses"]]],null]],[[[1," "],[10,0],[14,0,"tab-section"],[12],[1,"\\n"],[41,[28,[37,5],[[30,2,["length"]],0],null],[[[1," "],[8,[39,6],[[24,0,"consul-tagged-addresses"]],[["@items"],[[30,2]]],[["default"],[[[[1,"\\n "],[8,[39,7],null,[["@name"],["header"]],[["default"],[[[[1,"\\n "],[10,"th"],[12],[1,"Tag"],[13],[1,"\\n "],[10,"th"],[12],[1,"Address"],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,7],null,[["@name"],["row"]],[["default"],[[[[1,"\\n"],[44,[[28,[37,8],[1,[30,3]],null]],[[[41,[30,5],[[[1," "],[10,"td"],[12],[1,"\\n "],[1,[28,[35,8],[0,[30,3]],null]],[41,[28,[37,9],[[28,[37,10],[[30,5,["Address"]],[33,11,["Address"]]],null],[28,[37,10],[[30,5,["Port"]],[33,11,["Port"]]],null]],null],[[[1," "],[10,"em"],[12],[1,"(default)"],[13]],[]],null],[1,"\\n "],[13],[1,"\\n "],[10,"td"],[12],[1,"\\n "],[1,[30,5,["Address"]]],[1,":"],[1,[30,5,["Port"]]],[1,"\\n "],[13],[1,"\\n"]],[]],null]],[5]]],[1," "]],[]]]]],[1,"\\n "]],[3,4]]]]],[1,"\\n"]],[]],[[[1," "],[10,2],[12],[1,"\\n There are no additional addresses.\\n "],[13],[1,"\\n"]],[]]],[1," "],[13],[1,"\\n"]],[2]]]],[1]]]]],[1,"\\n"]],["route","items","taggedAddress","index","address"],false,["route","routeName","let","entries","if","gt","tabular-collection","block-slot","object-at","and","eq","item"]]',moduleName:"consul-ui/templates/dc/services/instance/addresses.hbs",isStrictMode:!1}) +e.default=n})),define("consul-ui/templates/dc/services/instance/exposedpaths",["exports","@ember/template-factory"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +var n=(0,t.createTemplateFactory)({id:"bKwLyBQ8",block:'[[[8,[39,0],null,[["@name"],[[99,1,["@name"]]]],[["default"],[[[[1,"\\n"],[44,[[30,1,["model","proxy"]],[30,1,["model","meta"]]],[[[1," "],[10,0],[14,0,"tab-section"],[12],[1,"\\n"],[41,[28,[37,4],[[30,3,["ServiceProxy","Expose","Paths","length"]],0],null],[[[1," "],[1,[28,[35,5],["routes.dc.services.instance.exposedpaths.intro"],[["htmlSafe"],[true]]]],[1,"\\n "],[8,[39,6],null,[["@items","@address"],[[30,3,["ServiceProxy","Expose","Paths"]],[28,[37,7],[[30,2,["Service","Address"]],[30,2,["Node","Address"]]],null]]],null],[1,"\\n"]],[]],[[[1," "],[8,[39,8],null,null,[["default"],[[[[1,"\\n "],[8,[39,9],null,[["@name"],["body"]],[["default"],[[[[1,"\\n "],[1,[28,[35,5],["routes.dc.services.instance.exposedpaths.empty.body"],[["htmlSafe"],[true]]]],[1,"\\n "]],[]]]]],[1,"\\n "]],[]]]]],[1,"\\n"]],[]]],[1," "],[13],[1,"\\n"]],[2,3]]]],[1]]]]]],["route","item","proxy"],false,["route","routeName","let","if","gt","t","consul/exposed-path/list","or","empty-state","block-slot"]]',moduleName:"consul-ui/templates/dc/services/instance/exposedpaths.hbs",isStrictMode:!1}) +e.default=n})),define("consul-ui/templates/dc/services/instance/healthchecks",["exports","@ember/template-factory"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +var n=(0,t.createTemplateFactory)({id:"c8iqBcKE",block:'[[[8,[39,0],null,[["@name"],[[99,1,["@name"]]]],[["default"],[[[[1,"\\n"],[44,[[28,[37,3],[[28,[37,4],[[30,0],"syntheticNodeSearchPropertyFilter",[30,1,["model","item"]]],null],[33,5]],null]],[[[44,[[28,[37,6],null,[["value","change"],[[28,[37,7],[[33,8],"Status:asc"],null],[28,[37,4],[[30,0],[28,[37,9],[[33,8]],null]],[["value"],["target.selected"]]]]]],[28,[37,6],null,[["status","check","searchproperty"],[[28,[37,6],null,[["value","change"],[[52,[33,11],[28,[37,12],[[33,11],","],null],[27]],[28,[37,4],[[30,0],[28,[37,9],[[33,11]],null]],[["value"],["target.selectedItems"]]]]]],[28,[37,6],null,[["value","change"],[[52,[33,13],[28,[37,12],[[33,13],","],null],[27]],[28,[37,4],[[30,0],[28,[37,9],[[33,13]],null]],[["value"],["target.selectedItems"]]]]]],[28,[37,6],null,[["value","change","default"],[[52,[28,[37,14],[[33,15],[27]],null],[28,[37,12],[[33,15],","],null],[30,2]],[28,[37,4],[[30,0],[28,[37,9],[[33,15]],null]],[["value"],["target.selectedItems"]]],[30,2]]]]]]],[28,[37,3],[[28,[37,4],[[30,0],"syntheticNodeHealthCheckFilter",[30,1,["model","item"]]],null],[28,[37,16],[[28,[37,17],[[30,1,["model","item","Checks"]],[30,1,["model","proxy","Checks"]]],null],[30,1,["model","proxy","ServiceProxy","Expose","Checks"]]],null]],null]],[[[1," "],[10,0],[14,0,"tab-section"],[12],[1,"\\n\\n"],[41,[28,[37,18],[[30,5,["length"]],0],null],[[[1," "],[10,"input"],[14,1,"toolbar-toggle"],[14,4,"checkbox"],[12],[13],[1,"\\n "],[8,[39,19],null,[["@search","@onsearch","@sort","@filter"],[[99,20,["@search"]],[28,[37,4],[[30,0],[28,[37,9],[[33,20]],null]],[["value"],["target.value"]]],[30,3],[30,4]]],null],[1,"\\n"]],[]],null],[1,"\\n"],[44,[[28,[37,21],["Type","serf",[30,5]],null]],[[[41,[28,[37,22],[[30,6],[28,[37,23],[[30,6,["Status"]],"critical"],null]],null],[[[1," "],[8,[39,24],[[24,0,"mb-3 mt-2"]],[["@type","@color"],["inline","warning"]],[["default"],[[[[1,"\\n "],[8,[30,7,["Title"]],null,null,[["default"],[[[[1,[28,[35,25],["routes.dc.services.instance.healthchecks.critical-serf-notice.header"],null]]],[]]]]],[1,"\\n "],[8,[30,7,["Description"]],null,null,[["default"],[[[[1,[28,[35,25],["routes.dc.services.instance.healthchecks.critical-serf-notice.body"],[["htmlSafe"],[true]]]]],[]]]]],[1,"\\n "]],[7]]]]],[1,"\\n"]],[]],null]],[6]]],[1," "],[8,[39,26],null,[["@type","@sort","@filters","@search","@items"],["health-check",[30,3,["value"]],[30,4],[99,20,["@search"]],[30,5]]],[["default"],[[[[1,"\\n "],[8,[30,8,["Collection"]],null,null,[["default"],[[[[1,"\\n "],[8,[39,27],null,[["@items"],[[30,8,["items"]]]],null],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[30,8,["Empty"]],null,null,[["default"],[[[[1,"\\n "],[8,[39,28],null,null,[["default"],[[[[1,"\\n "],[8,[39,29],null,[["@name"],["body"]],[["default"],[[[[1,"\\n "],[1,[28,[35,25],["routes.dc.services.instance.healthchecks.empty"],[["items","htmlSafe"],[[30,5,["length"]],true]]]],[1,"\\n "]],[]]]]],[1,"\\n "]],[]]]]],[1,"\\n "]],[]]]]],[1,"\\n "]],[8]]]]],[1,"\\n\\n "],[13],[1,"\\n"]],[3,4,5]]]],[2]]]],[1]]]]],[1,"\\n"]],["route","filteredSearchProperties","sort","filters","items","serf","A","collection"],false,["route","routeName","let","filter","action","searchProperties","hash","or","sortBy","mut","if","status","split","check","not-eq","searchproperty","merge-checks","array","gt","consul/health-check/search-bar","search","find-by","and","eq","hds/alert","t","data-collection","consul/health-check/list","empty-state","block-slot"]]',moduleName:"consul-ui/templates/dc/services/instance/healthchecks.hbs",isStrictMode:!1}) +e.default=n})),define("consul-ui/templates/dc/services/instance/metadata",["exports","@ember/template-factory"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +var n=(0,t.createTemplateFactory)({id:"TS1cbRDj",block:'[[[8,[39,0],null,[["@name"],[[99,1,["@name"]]]],[["default"],[[[[1,"\\n"],[44,[[30,1,["model","item"]]],[[[1," "],[10,0],[14,0,"tab-section"],[12],[1,"\\n "],[10,"section"],[14,0,"tags"],[12],[1,"\\n "],[10,"h2"],[12],[1,"Tags"],[13],[1,"\\n"],[41,[28,[37,4],[[30,2,["Tags","length"]],0],null],[[[1," "],[8,[39,5],null,[["@item"],[[30,2]]],null],[1,"\\n"]],[]],[[[1," "],[8,[39,6],null,null,[["default"],[[[[1,"\\n "],[8,[39,7],null,[["@name"],["body"]],[["default"],[[[[1,"\\n "],[10,2],[12],[1,"\\n There are no tags.\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n "]],[]]]]],[1,"\\n"]],[]]],[1," "],[13],[1,"\\n "],[10,"section"],[14,0,"metadata"],[12],[1,"\\n "],[10,"h2"],[12],[1,"Meta"],[13],[1,"\\n"],[41,[30,2,["Meta"]],[[[1," "],[8,[39,8],null,[["@items"],[[28,[37,9],[[30,2,["Meta"]]],null]]],null],[1,"\\n"]],[]],[[[1," "],[8,[39,6],null,null,[["default"],[[[[1,"\\n "],[8,[39,7],null,[["@name"],["body"]],[["default"],[[[[1,"\\n "],[10,2],[12],[1,"\\n This instance has no metadata.\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n "]],[]]]]],[1,"\\n"]],[]]],[1," "],[13],[1,"\\n "],[13],[1,"\\n"]],[2]]]],[1]]]]],[1,"\\n"]],["route","item"],false,["route","routeName","let","if","gt","tag-list","empty-state","block-slot","consul/metadata/list","entries"]]',moduleName:"consul-ui/templates/dc/services/instance/metadata.hbs",isStrictMode:!1}) +e.default=n})),define("consul-ui/templates/dc/services/instance/upstreams",["exports","@ember/template-factory"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +var n=(0,t.createTemplateFactory)({id:"2fQZNDmw",block:'[[[8,[39,0],null,[["@name"],[[99,1,["@name"]]]],[["default"],[[[[1,"\\n "],[10,0],[14,0,"tab-section"],[12],[1,"\\n"],[44,[[28,[37,3],null,[["value","change"],[[28,[37,4],[[33,5],"DestinationName:asc"],null],[28,[37,6],[[30,0],[28,[37,7],[[33,5]],null]],[["value"],["target.selected"]]]]]],[28,[37,3],null,[["searchproperty"],[[28,[37,3],null,[["value","change","default"],[[52,[28,[37,9],[[33,10],[27]],null],[28,[37,11],[[33,10],","],null],[33,12]],[28,[37,6],[[30,0],[28,[37,7],[[33,10]],null]],[["value"],["target.selectedItems"]]],[33,12]]]]]]],[28,[37,4],[[30,1,["params","partition"]],[30,1,["model","user","token","Partition"]],"default"],null],[28,[37,4],[[30,1,["params","nspace"]],[30,1,["model","user","token","Namespace"]],"default"],null],[30,1,["params","dc"]],[30,1,["model","proxy"]],[30,1,["model","meta"]],[30,1,["model","proxy","Service","Proxy","Upstreams"]]],[[[41,[28,[37,13],[[30,9,["length"]],0],null],[[[1," "],[10,"input"],[14,1,"toolbar-toggle"],[14,4,"checkbox"],[12],[13],[1,"\\n "],[8,[39,14],null,[["@search","@onsearch","@searchproperties","@sort","@filter"],[[99,15,["@search"]],[28,[37,6],[[30,0],[28,[37,7],[[33,15]],null]],[["value"],["target.value"]]],[99,12,["@searchproperties"]],[30,2],[30,3]]],null],[1,"\\n"]],[]],null],[41,[28,[37,16],[[30,8,["ServiceProxy","Mode"]],"transparent"],null],[[[1," "],[8,[39,17],[[24,0,"mb-3 mt-2"]],[["@type","@color"],["inline","warning"]],[["default"],[[[[1,"\\n "],[8,[30,10,["Title"]],null,null,[["default"],[[[[1,[28,[35,18],["routes.dc.services.instance.upstreams.tproxy-mode.header"],null]]],[]]]]],[1,"\\n "],[8,[30,10,["Description"]],null,null,[["default"],[[[[1,"\\n "],[1,[28,[35,18],["routes.dc.services.instance.upstreams.tproxy-mode.body"],null]],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[30,10,["Link::Standalone"]],null,[["@text","@href","@icon","@iconPosition","@size"],[[28,[37,18],["routes.dc.services.instance.upstreams.tproxy-mode.footer.text"],null],[29,[[28,[37,19],[[28,[37,20],["CONSUL_DOCS_URL"],null],[28,[37,18],["routes.dc.services.instance.upstreams.tproxy-mode.footer.link"],null]],null]]],"docs-link","trailing","small"]],null],[1,"\\n "]],[10]]]]],[1,"\\n"]],[]],null],[1," "],[8,[39,21],null,[["@type","@sort","@filters","@search","@items"],["upstream-instance",[30,2,["value"]],[30,3],[99,15,["@search"]],[30,9]]],[["default"],[[[[1,"\\n "],[8,[30,11,["Collection"]],null,null,[["default"],[[[[1,"\\n "],[8,[39,22],null,[["@items","@dc","@nspace","@partition"],[[30,11,["items"]],[30,6],[30,5],[30,4]]],null],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[30,11,["Empty"]],null,null,[["default"],[[[[1,"\\n "],[8,[39,23],null,null,[["default"],[[[[1,"\\n "],[8,[39,24],null,[["@name"],["body"]],[["default"],[[[[1,"\\n "],[1,[28,[35,18],["routes.dc.services.instance.upstreams.empty"],[["items","htmlSafe"],[[30,9,["length"]],true]]]],[1,"\\n "]],[]]]]],[1,"\\n "]],[]]]]],[1,"\\n "]],[]]]]],[1,"\\n "]],[11]]]]],[1,"\\n"]],[2,3,4,5,6,7,8,9]]],[1," "],[13],[1,"\\n"]],[1]]]]]],["route","sort","filters","partition","nspace","dc","proxy","meta","items","A","collection"],false,["route","routeName","let","hash","or","sortBy","action","mut","if","not-eq","searchproperty","split","searchProperties","gt","consul/upstream-instance/search-bar","search","eq","hds/alert","t","concat","env","data-collection","consul/upstream-instance/list","empty-state","block-slot"]]',moduleName:"consul-ui/templates/dc/services/instance/upstreams.hbs",isStrictMode:!1}) +e.default=n})),define("consul-ui/templates/dc/services/show",["exports","@ember/template-factory"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +var n=(0,t.createTemplateFactory)({id:"ep8WMqyL",block:'[[[8,[39,0],null,[["@name"],[[99,1,["@name"]]]],[["default"],[[[[1,"\\n "],[8,[39,2],null,[["@src"],[[28,[37,3],["/${partition}/${nspace}/${dc}/service-instances/for-service/${name}/${peer}",[28,[37,4],null,[["partition","nspace","dc","name","peer"],[[30,1,["params","partition"]],[30,1,["params","nspace"]],[30,1,["params","dc"]],[30,1,["params","name"]],[30,1,["params","peer"]]]]]],null]]],[["default"],[[[[1,"\\n\\n "],[8,[39,5],null,[["@name"],["error"]],[["default"],[[[[1,"\\n "],[8,[39,6],null,[["@error","@login"],[[30,2,["error"]],[30,1,["model","app","login","open"]]]],null],[1,"\\n "]],[]]]]],[1,"\\n\\n "],[8,[39,5],null,[["@name"],["disconnected"]],[["default"],[[[[1,"\\n"],[41,[28,[37,8],[[30,2,["error","status"]],"404"],null],[[[1," "],[8,[39,9],[[4,[38,10],null,[["sticky"],[true]]]],[["@color"],["warning"]],[["default"],[[[[1,"\\n "],[8,[30,4,["Title"]],null,null,[["default"],[[[[1,"Warning!"]],[]]]]],[1,"\\n "],[8,[30,4,["Description"]],null,null,[["default"],[[[[1,"This service has been deregistered and no longer exists in the catalog."]],[]]]]],[1,"\\n "]],[4]]]]],[1,"\\n"]],[]],[[[41,[28,[37,8],[[30,2,["error","status"]],"403"],null],[[[1," "],[8,[39,9],[[4,[38,10],null,[["sticky"],[true]]]],[["@color"],["critical"]],[["default"],[[[[1,"\\n "],[8,[30,5,["Title"]],null,null,[["default"],[[[[1,"Error!"]],[]]]]],[1,"\\n "],[8,[30,5,["Description"]],null,null,[["default"],[[[[1,"You no longer have access to this service."]],[]]]]],[1,"\\n "]],[5]]]]],[1,"\\n"]],[]],[[[1," "],[8,[39,9],[[4,[38,10],null,[["sticky"],[true]]]],[["@color"],["warning"]],[["default"],[[[[1,"\\n "],[8,[30,6,["Title"]],null,null,[["default"],[[[[1,"Warning!"]],[]]]]],[1,"\\n "],[8,[30,6,["Description"]],null,null,[["default"],[[[[1,"An error was returned whilst loading this data, refresh to try again."]],[]]]]],[1,"\\n "]],[6]]]]],[1,"\\n "]],[]]]],[]]],[1," "]],[3]]]]],[1,"\\n\\n "],[8,[39,5],null,[["@name"],["loaded"]],[["default"],[[[[1,"\\n"],[44,[[30,2,["data"]],[30,2,["data","firstObject"]],[30,1,["model","dc"]]],[[[1,"\\n"],[41,[30,8,["IsOrigin"]],[[[1," "],[8,[39,12],null,[["@src","@onchange"],[[28,[37,3],["/${partition}/${nspace}/${dc}/proxies/for-service/${name}",[28,[37,4],null,[["partition","nspace","dc","name"],[[30,1,["params","partition"]],[30,1,["params","nspace"]],[30,1,["params","dc"]],[30,1,["params","name"]]]]]],null],[28,[37,13],[[30,0],[28,[37,14],[[33,15]],null]],[["value"],["data"]]]]],null],[1,"\\n"],[41,[28,[37,16],[[33,17]],null],[[[1," "],[8,[39,12],null,[["@src","@onchange"],[[28,[37,3],["/${partition}/${nspace}/${dc}/discovery-chain/${name}",[28,[37,4],null,[["partition","nspace","dc","name"],[[30,1,["params","partition"]],[30,1,["params","nspace"]],[30,1,["params","dc"]],[30,1,["params","name"]]]]]],null],[28,[37,13],[[30,0],[28,[37,14],[[33,17]],null]],[["value"],["data"]]]]],null],[1,"\\n"]],[]],null],[1," "],[1,[28,[35,18],[[28,[37,19],[[30,0],"chain",[27]],null],[30,1,["params","dc"]]],null]],[1,"\\n"]],[]],null],[44,[[28,[37,4],null,[["topology","services","upstreams","instances","intentions","routing","tags"],[[28,[37,20],[[30,9,["MeshEnabled"]],[30,8,["IsMeshOrigin"]],[28,[37,21],[[28,[37,22],[[33,15,["length"]],0],null],[28,[37,8],[[30,8,["Service","Kind"]],"ingress-gateway"],null]],null],[28,[37,16],[[30,8,["Service","PeerName"]]],null]],null],[28,[37,20],[[28,[37,8],[[30,8,["Service","Kind"]],"terminating-gateway"],null],[28,[37,16],[[30,8,["Service","PeerName"]]],null]],null],[28,[37,20],[[28,[37,8],[[30,8,["Service","Kind"]],"ingress-gateway"],null],[28,[37,16],[[30,8,["Service","PeerName"]]],null]],null],true,[28,[37,20],[[28,[37,23],[[30,8,["Service","Kind"]],"terminating-gateway"],null],[28,[37,24],["read intention for service"],[["item"],[[30,8,["Service"]]]]],[28,[37,16],[[30,8,["Service","PeerName"]]],null]],null],[28,[37,20],[[30,9,["MeshEnabled"]],[30,8,["IsOrigin"]],[28,[37,16],[[30,8,["Service","PeerName"]]],null]],null],true]]]],[[[1," "],[8,[39,25],null,null,[["default"],[[[[1,"\\n "],[8,[39,5],null,[["@name"],["notification"]],[["default"],[[[[1,"\\n "],[8,[39,26],null,[["@type","@status","@error"],[[30,12],[30,11],[30,14]]],null],[1,"\\n "]],[11,12,13,14]]]]],[1,"\\n "],[8,[39,5],null,[["@name"],["breadcrumbs"]],[["default"],[[[[1,"\\n "],[10,"ol"],[12],[1,"\\n "],[10,"li"],[12],[10,3],[15,6,[28,[37,27],["dc.services"],[["params"],[[28,[37,4],null,[["peer"],[[27]]]]]]]],[12],[1,"All Services"],[13],[13],[1,"\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,5],null,[["@name"],["header"]],[["default"],[[[[1,"\\n "],[10,"h1"],[12],[1,"\\n "],[8,[30,1,["Title"]],null,[["@title"],[[30,8,["Service","Service"]]]],null],[1,"\\n "],[13],[1,"\\n "],[8,[39,28],null,[["@item","@withInfo"],[[30,8,["Service"]],true]],null],[1,"\\n "],[8,[39,29],null,[["@item","@withInfo"],[[30,8,["Service"]],true]],null],[1,"\\n "],[8,[39,30],null,[["@item"],[[30,8,["Service"]]]],null],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,5],null,[["@name"],["nav"]],[["default"],[[[[1,"\\n"],[41,[28,[37,23],[[30,8,["Service","Kind"]],"mesh-gateway"],null],[[[1," "],[8,[39,31],null,[["@items"],[[28,[37,32],[[28,[37,33],[[52,[30,10,["topology"]],[28,[37,4],null,[["label","href","selected"],["Topology",[28,[37,27],["dc.services.show.topology"],null],[28,[37,34],["dc.services.show.topology"],null]]]],""],[52,[30,10,["services"]],[28,[37,4],null,[["label","href","selected"],["Linked Services",[28,[37,27],["dc.services.show.services"],null],[28,[37,34],["dc.services.show.services"],null]]]],""],[52,[30,10,["upstreams"]],[28,[37,4],null,[["label","href","selected"],["Upstreams",[28,[37,27],["dc.services.show.upstreams"],null],[28,[37,34],["dc.services.show.upstreams"],null]]]],""],[52,[30,10,["instances"]],[28,[37,4],null,[["label","href","selected"],["Instances",[28,[37,27],["dc.services.show.instances"],null],[28,[37,34],["dc.services.show.instances"],null]]]],""],[52,[30,10,["intentions"]],[28,[37,4],null,[["label","href","selected"],["Intentions",[28,[37,27],["dc.services.show.intentions"],null],[28,[37,34],["dc.services.show.intentions"],null]]]],""],[52,[30,10,["routing"]],[28,[37,4],null,[["label","href","selected"],["Routing",[28,[37,27],["dc.services.show.routing"],null],[28,[37,34],["dc.services.show.routing"],null]]]],""],[52,[30,10,["tags"]],[28,[37,4],null,[["label","href","selected"],["Tags",[28,[37,27],["dc.services.show.tags"],null],[28,[37,34],["dc.services.show.tags"],null]]]],""]],null]],null]]],null],[1,"\\n"]],[]],null],[1," "]],[]]]]],[1,"\\n "],[8,[39,5],null,[["@name"],["actions"]],[["default"],[[[[1,"\\n "],[8,[39,12],null,[["@src"],[[28,[37,3],["/${partition}/${nspace}/${dc}/ui-config",[28,[37,4],null,[["partition","nspace","dc"],[[30,1,["params","partition"]],[30,1,["params","nspace"]],[30,1,["params","dc"]]]]]],null]]],[["default"],[[[[1,"\\n"],[41,[30,15,["data","dashboard_url_templates","service"]],[[[1," "],[8,[39,13],[[24,0,"external-dashboard"]],[["@href","@external"],[[28,[37,35],[[30,15,["data","dashboard_url_templates","service"]],[28,[37,4],null,[["Datacenter","Service"],[[30,9,["Name"]],[28,[37,4],null,[["Name","Namespace","Partition"],[[30,8,["Service","Service"]],[28,[37,21],[[30,8,["Service","Namespace"]],""],null],[28,[37,21],[[30,8,["Service","Partition"]],""],null]]]]]]]],null],true]],[["default"],[[[[1,"\\n Open dashboard\\n "]],[]]]]],[1,"\\n"]],[]],null],[1," "]],[15]]]]],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,5],null,[["@name"],["content"]],[["default"],[[[[1,"\\n"],[41,[28,[37,21],[[28,[37,16],[[30,8,["IsOrigin"]]],null],[33,17]],null],[[[1," "],[8,[39,36],null,[["@name","@model"],[[99,1,["@name"]],[28,[37,37],[[28,[37,4],null,[["items","proxies","item","tabs"],[[30,7],[33,15],[30,8],[30,10]]]],[30,1,["model"]]],null]]],[["default"],[[[[1,"\\n "],[46,[28,[37,39],null,null],null,null,null],[1,"\\n "]],[16]]]]],[1,"\\n"]],[]],null],[1," "]],[]]]]],[1,"\\n "]],[]]]]],[1,"\\n"]],[10]]]],[7,8,9]]],[1," "]],[]]]]],[1,"\\n "]],[2]]]]],[1,"\\n"]],[1]]]]]],["route","loader","after","T","T","T","items","item","dc","tabs","status","type","item","error","config","o"],false,["route","routeName","data-loader","uri","hash","block-slot","app-error","if","eq","hds/toast","notification","let","data-source","action","mut","proxies","not","chain","did-insert","set","and","or","gt","not-eq","can","app-view","topology-metrics/notifications","href-to","consul/external-source","consul/kind","consul/peer/info","tab-nav","compact","array","is-href","render-template","outlet","assign","component","-outlet"]]',moduleName:"consul-ui/templates/dc/services/show.hbs",isStrictMode:!1}) +e.default=n})),define("consul-ui/templates/dc/services/show/index",["exports","@ember/template-factory"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +var n=(0,t.createTemplateFactory)({id:"och8aDuk",block:'[[[8,[39,0],null,[["@name"],[[99,1,["@name"]]]],[["default"],[[[[1,"\\n"],[41,[30,1,["model","tabs","topology"]],[[[1," "],[1,[28,[35,3],[[28,[37,4],["replaceWith","dc.services.show.topology"],null]],null]],[1,"\\n"]],[]],[[[41,[30,1,["model","tabs","upstreams"]],[[[1," "],[1,[28,[35,3],[[28,[37,4],["replaceWith","dc.services.show.upstreams"],null]],null]],[1,"\\n"]],[]],[[[41,[30,1,["model","tabs","services"]],[[[1," "],[1,[28,[35,3],[[28,[37,4],["replaceWith","dc.services.show.services"],null]],null]],[1,"\\n"]],[]],[[[1," "],[1,[28,[35,3],[[28,[37,4],["replaceWith","dc.services.show.instances"],null]],null]],[1,"\\n"]],[]]]],[]]]],[]]]],[1]]]]],[1,"\\n"]],["route"],false,["route","routeName","if","did-insert","route-action"]]',moduleName:"consul-ui/templates/dc/services/show/index.hbs",isStrictMode:!1}) +e.default=n})),define("consul-ui/templates/dc/services/show/instances",["exports","@ember/template-factory"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +var n=(0,t.createTemplateFactory)({id:"QmKK5Mhb",block:'[[[8,[39,0],null,[["@name"],[[99,1,["@name"]]]],[["default"],[[[[1,"\\n"],[10,0],[14,0,"tab-section"],[12],[1,"\\n"],[44,[[28,[37,3],null,[["value","change"],[[28,[37,4],[[33,5],"Status:asc"],null],[28,[37,6],[[30,0],[28,[37,7],[[33,5]],null]],[["value"],["target.selected"]]]]]],[28,[37,3],null,[["status","source","searchproperty"],[[28,[37,3],null,[["value","change"],[[52,[33,9],[28,[37,10],[[33,9],","],null],[27]],[28,[37,6],[[30,0],[28,[37,7],[[33,9]],null]],[["value"],["target.selectedItems"]]]]]],[28,[37,3],null,[["value","change"],[[52,[33,11],[28,[37,10],[[33,11],","],null],[27]],[28,[37,6],[[30,0],[28,[37,7],[[33,11]],null]],[["value"],["target.selectedItems"]]]]]],[28,[37,3],null,[["value","change","default"],[[52,[28,[37,12],[[33,13],[27]],null],[28,[37,10],[[33,13],","],null],[33,14]],[28,[37,6],[[30,0],[28,[37,7],[[33,13]],null]],[["value"],["target.selectedItems"]]],[33,14]]]]]]],[30,1,["model","items"]],[30,1,["model","proxies","firstObject"]]],[[[41,[28,[37,15],[[30,4,["length"]],0],null],[[[1," "],[10,"input"],[14,1,"toolbar-toggle"],[14,4,"checkbox"],[12],[13],[1,"\\n "],[8,[39,16],null,[["@sources","@search","@onsearch","@sort","@filter"],[[28,[37,17],[[28,[37,18],[[30,4]],null],"ExternalSources"],null],[99,19,["@search"]],[28,[37,6],[[30,0],[28,[37,7],[[33,19]],null]],[["value"],["target.value"]]],[30,2],[30,3]]],null],[1,"\\n"]],[]],null],[41,[30,5,["ServiceName"]],[[[1," "],[8,[39,20],null,[["@src","@onchange"],[[28,[37,21],["/${partition}/${nspace}/${dc}/service-instances/for-service/${name}/${peer}",[28,[37,3],null,[["partition","nspace","dc","name","peer"],[[30,1,["params","partition"]],[30,1,["params","nspace"]],[30,1,["params","dc"]],[30,5,["ServiceName"]],[30,1,["params","peer"]]]]]],null],[28,[37,6],[[30,0],[28,[37,7],[[33,22]],null]],[["value"],["data"]]]]],null],[1,"\\n"]],[]],null],[1," "],[8,[39,23],null,[["@type","@sort","@filters","@search","@items"],["service-instance",[30,2,["value"]],[30,3],[99,19,["@search"]],[30,4]]],[["default"],[[[[1,"\\n "],[8,[30,6,["Collection"]],null,null,[["default"],[[[[1,"\\n "],[8,[39,24],null,[["@routeName","@items","@proxies"],["dc.services.instance",[30,6,["items"]],[99,22,["@proxies"]]]],null],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[30,6,["Empty"]],null,null,[["default"],[[[[1,"\\n "],[8,[39,25],null,null,[["default"],[[[[1,"\\n "],[8,[39,26],null,[["@name"],["body"]],[["default"],[[[[1,"\\n "],[1,[28,[35,27],["routes.dc.services.show.instances.empty"],[["items","htmlSafe"],[[30,4,["length"]],true]]]],[1,"\\n "]],[]]]]],[1,"\\n "]],[]]]]],[1,"\\n "]],[]]]]],[1,"\\n "]],[6]]]]],[1,"\\n"]],[2,3,4,5]]],[13],[1,"\\n"]],[1]]]]],[1,"\\n"]],["route","sort","filters","items","proxyMeta","collection"],false,["route","routeName","let","hash","or","sortBy","action","mut","if","status","split","source","not-eq","searchproperty","searchProperties","gt","consul/service-instance/search-bar","get","collection","search","data-source","uri","proxies","data-collection","consul/service-instance/list","empty-state","block-slot","t"]]',moduleName:"consul-ui/templates/dc/services/show/instances.hbs",isStrictMode:!1}) +e.default=n})),define("consul-ui/templates/dc/services/show/intentions",["exports","@ember/template-factory"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +var n=(0,t.createTemplateFactory)({id:"sF5zClCb",block:'[[[8,[39,0],null,[["@name"],[[99,1,["@name"]]]],[["default"],[[[[1,"\\n "],[8,[39,2],null,[["@name","@model"],[[99,1,["@name"]],[30,1,["model"]]]],[["default"],[[[[1,"\\n "],[46,[28,[37,4],null,null],null,null,null],[1,"\\n "]],[2]]]]],[1,"\\n"]],[1]]]]],[1,"\\n"]],["route","o"],false,["route","routeName","outlet","component","-outlet"]]',moduleName:"consul-ui/templates/dc/services/show/intentions.hbs",isStrictMode:!1}) +e.default=n})),define("consul-ui/templates/dc/services/show/intentions/edit",["exports","@ember/template-factory"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +var n=(0,t.createTemplateFactory)({id:"FjErs42E",block:'[[[8,[39,0],null,[["@name"],[[99,1,["@name"]]]],[["default"],[[[[1,"\\n"],[44,[[28,[37,3],[[28,[37,4],["write intention for service"],[["item"],[[33,5,["Service"]]]]]],null]],[[[1," "],[8,[39,6],null,[["@src"],[[28,[37,7],["/${partition}/${nspace}/${dc}/intention/${id}",[28,[37,8],null,[["partition","nspace","dc","id"],[[30,1,["params","partition"]],[30,1,["params","nspace"]],[30,1,["params","dc"]],[28,[37,9],[[30,1,["params","intention_id"]],""],null]]]]],null]]],[["default"],[[[[1,"\\n\\n "],[8,[39,10],null,[["@name"],["error"]],[["default"],[[[[1,"\\n "],[8,[39,11],null,[["@error","@login"],[[30,3,["error"]],[30,1,["model","app","login","open"]]]],null],[1,"\\n "]],[]]]]],[1,"\\n\\n "],[8,[39,10],null,[["@name"],["loaded"]],[["default"],[[[[1,"\\n"],[44,[[30,3,["data"]]],[[[1," "],[8,[39,12],null,[["@readonly","@item","@dc","@nspace","@partition","@autofill","@onsubmit"],[[30,2],[30,4],[30,1,["model","dc"]],[30,1,["params","nspace"]],[30,1,["params","partition"]],[28,[37,8],null,[["DestinationName"],[[30,1,["params","name"]]]]],[28,[37,13],["dc.services.show.intentions.index"],null]]],null],[1,"\\n"]],[4]]],[1," "]],[]]]]],[1,"\\n"]],[3]]]]],[1,"\\n"]],[2]]]],[1]]]]],[1,"\\n"]],["route","readOnly","loader","item"],false,["route","routeName","let","not","can","item","data-loader","uri","hash","or","block-slot","error-state","consul/intention/form","transition-to"]]',moduleName:"consul-ui/templates/dc/services/show/intentions/edit.hbs",isStrictMode:!1}) +e.default=n})),define("consul-ui/templates/dc/services/show/intentions/index",["exports","@ember/template-factory"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +var n=(0,t.createTemplateFactory)({id:"R5ukfGXO",block:'[[[8,[39,0],null,[["@name"],[[99,1,["@name"]]]],[["default"],[[[[1,"\\n "],[8,[39,2],null,[["@src"],[[28,[37,3],["/${partition}/${nspace}/${dc}/intentions/for-service/${slug}",[28,[37,4],null,[["partition","nspace","dc","slug"],[[30,1,["params","partition"]],[30,1,["params","nspace"]],[30,1,["params","dc"]],[30,1,["params","name"]]]]]],null]]],[["default"],[[[[1,"\\n "],[8,[39,5],null,[["@name"],["error"]],[["default"],[[[[1,"\\n "],[8,[39,6],null,[["@error"],[[30,2,["error"]]]],null],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,5],null,[["@name"],["loaded"]],[["default"],[[[[1,"\\n"],[44,[[28,[37,4],null,[["value","change"],[[28,[37,8],[[33,9],"Action:asc"],null],[28,[37,10],[[30,0],[28,[37,11],[[33,9]],null]],[["value"],["target.selected"]]]]]],[28,[37,4],null,[["access","searchproperty"],[[28,[37,4],null,[["value","change"],[[52,[33,13],[28,[37,14],[[33,13],","],null],[27]],[28,[37,10],[[30,0],[28,[37,11],[[33,13]],null]],[["value"],["target.selectedItems"]]]]]],[28,[37,4],null,[["value","change","default"],[[52,[28,[37,15],[[33,16],[27]],null],[28,[37,14],[[33,16],","],null],[33,17]],[28,[37,10],[[30,0],[28,[37,11],[[33,16]],null]],[["value"],["target.selectedItems"]]],[33,17]]]]]]],[30,2,["data"]],[30,1,["model","item"]]],[[[1," "],[10,0],[14,0,"tab-section"],[12],[1,"\\n"],[41,[28,[37,18],["create intention for service"],[["item"],[[30,6,["Service"]]]]],[[[1," "],[8,[39,19],null,[["@target"],["app-view-actions"]],[["default"],[[[[1,"\\n "],[8,[39,20],null,[["@text","@route"],["Create","dc.services.show.intentions.create"]],null],[1,"\\n "]],[]]]]],[1,"\\n"]],[]],null],[41,[28,[37,21],[[30,5,["length"]],0],null],[[[1," "],[8,[39,22],null,[["@search","@onsearch","@sort","@filter"],[[99,23,["@search"]],[28,[37,10],[[30,0],[28,[37,11],[[33,23]],null]],[["value"],["target.value"]]],[30,3],[30,4]]],null],[1,"\\n"]],[]],null],[1," "],[8,[39,24],null,[["@sink","@type","@ondelete"],[[28,[37,3],["/${partition}/${dc}/${nspace}/intention/",[28,[37,4],null,[["partition","nspace","dc"],[[30,1,["params","partition"]],[30,1,["params","nspace"]],[30,1,["params","dc"]]]]]],null],"intention",[99,25,["@ondelete"]]]],[["default"],[[[[1,"\\n "],[8,[39,5],null,[["@name"],["content"]],[["default"],[[[[1,"\\n "],[8,[39,26],null,[["@type","@sort","@filters","@search","@items"],["intention",[30,3,["value"]],[30,4],[99,23,["@search"]],[30,5]]],[["default"],[[[[1,"\\n "],[8,[30,8,["Collection"]],null,null,[["default"],[[[[1,"\\n "],[8,[39,27],null,[["@items","@check","@delete"],[[30,8,["items"]],[99,23,["@check"]],[30,7,["delete"]]]],[["default"],[[[[1,"\\n "],[8,[30,9,["CustomResourceNotice"]],null,null,null],[1,"\\n "],[8,[30,9,["CheckNotice"]],null,null,null],[1,"\\n "],[8,[30,9,["Table"]],null,[["@routeName"],["dc.services.show.intentions.edit"]],null],[1,"\\n "]],[9]]]]],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[30,8,["Empty"]],null,null,[["default"],[[[[1,"\\n "],[8,[39,28],null,[["@login"],[[30,1,["model","app","login","open"]]]],[["default"],[[[[1,"\\n "],[8,[39,5],null,[["@name"],["header"]],[["default"],[[[[1,"\\n "],[10,"h2"],[12],[1,"\\n "],[1,[28,[35,29],["routes.dc.services.show.intentions.index.empty.header"],[["items"],[[30,5,["length"]]]]]],[1,"\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,5],null,[["@name"],["body"]],[["default"],[[[[1,"\\n "],[1,[28,[35,29],["routes.dc.services.show.intentions.index.empty.body"],[["items","canUseACLs","htmlSafe"],[[30,5,["length"]],[28,[37,18],["use acls"],null],true]]]],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,5],null,[["@name"],["actions"]],[["default"],[[[[1,"\\n "],[10,"li"],[12],[1,"\\n "],[8,[39,30],null,[["@text","@href","@icon","@iconPosition","@size"],["Documentation on intentions",[29,[[28,[37,31],["CONSUL_DOCS_URL"],null],"/commands/intention"]],"docs-link","trailing","small"]],null],[1,"\\n "],[13],[1,"\\n "],[10,"li"],[12],[1,"\\n "],[8,[39,30],null,[["@text","@href","@icon","@iconPosition","@size"],["Take the tutorial",[29,[[28,[37,31],["CONSUL_DOCS_LEARN_URL"],null],"/consul/getting-started/connect"]],"learn-link","trailing","small"]],null],[1,"\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n "]],[]]]]],[1,"\\n "]],[]]]]],[1,"\\n "]],[8]]]]],[1,"\\n "]],[]]]]],[1,"\\n "]],[7]]]]],[1,"\\n "],[13],[1,"\\n"]],[3,4,5,6]]],[1," "]],[]]]]],[1,"\\n "]],[2]]]]],[1,"\\n"]],[1]]]]],[1,"\\n"]],["route","api","sort","filters","items","item","writer","collection","list"],false,["route","routeName","data-loader","uri","hash","block-slot","error-state","let","or","sortBy","action","mut","if","access","split","not-eq","searchproperty","searchProperties","can","portal","hds/button","gt","consul/intention/search-bar","search","data-writer","refresh-route","data-collection","consul/intention/list","empty-state","t","hds/link/standalone","env"]]',moduleName:"consul-ui/templates/dc/services/show/intentions/index.hbs",isStrictMode:!1}) +e.default=n})),define("consul-ui/templates/dc/services/show/routing",["exports","@ember/template-factory"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +var n=(0,t.createTemplateFactory)({id:"LPaSV3FN",block:'[[[8,[39,0],null,[["@name"],[[99,1,["@name"]]]],[["default"],[[[[1,"\\n "],[8,[39,2],null,[["@src"],[[28,[37,3],["/${partition}/${nspace}/${dc}/discovery-chain/${name}",[28,[37,4],null,[["partition","nspace","dc","name"],[[30,1,["params","partition"]],[30,1,["params","nspace"]],[30,1,["params","dc"]],[30,1,["params","name"]]]]]],null]]],[["default"],[[[[1,"\\n\\n "],[8,[39,5],null,[["@name"],["error"]],[["default"],[[[[1,"\\n "],[8,[39,6],null,[["@error","@login"],[[30,2,["error"]],[30,1,["model","app","login","open"]]]],null],[1,"\\n "]],[]]]]],[1,"\\n\\n "],[8,[39,5],null,[["@name"],["loaded"]],[["default"],[[[[1,"\\n "],[10,0],[14,0,"tab-section"],[12],[1,"\\n "],[8,[39,7],null,[["@chain"],[[30,2,["data","Chain"]]]],null],[1,"\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n "]],[2]]]]],[1,"\\n"]],[1]]]]],[1,"\\n"]],["route","loader"],false,["route","routeName","data-loader","uri","hash","block-slot","app-error","consul/discovery-chain"]]',moduleName:"consul-ui/templates/dc/services/show/routing.hbs",isStrictMode:!1}) +e.default=n})),define("consul-ui/templates/dc/services/show/services",["exports","@ember/template-factory"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +var n=(0,t.createTemplateFactory)({id:"9lMQo36C",block:'[[[8,[39,0],null,[["@name"],[[99,1,["@name"]]]],[["default"],[[[[1,"\\n "],[8,[39,2],null,[["@src"],[[28,[37,3],["/${partition}/${nspace}/${dc}/gateways/for-service/${name}",[28,[37,4],null,[["partition","nspace","dc","name"],[[30,1,["params","partition"]],[30,1,["params","nspace"]],[30,1,["params","dc"]],[30,1,["params","name"]]]]]],null]]],[["default"],[[[[1,"\\n\\n "],[8,[39,5],null,[["@name"],["error"]],[["default"],[[[[1,"\\n "],[8,[39,6],null,[["@error","@login"],[[30,2,["error"]],[30,1,["model","app","login","open"]]]],null],[1,"\\n "]],[]]]]],[1,"\\n\\n "],[8,[39,5],null,[["@name"],["loaded"]],[["default"],[[[[1,"\\n "],[10,0],[14,0,"tab-section"],[12],[1,"\\n"],[44,[[28,[37,4],null,[["value","change"],[[28,[37,8],[[33,9],"Status:asc"],null],[28,[37,10],[[30,0],[28,[37,11],[[33,9]],null]],[["value"],["target.selected"]]]]]],[28,[37,4],null,[["instance","searchproperty"],[[28,[37,4],null,[["value","change"],[[52,[33,13],[28,[37,14],[[33,13],","],null],[27]],[28,[37,10],[[30,0],[28,[37,11],[[33,13]],null]],[["value"],["target.selectedItems"]]]]]],[28,[37,4],null,[["value","change","default"],[[52,[28,[37,15],[[33,16],[27]],null],[28,[37,14],[[33,16],","],null],[33,17]],[28,[37,10],[[30,0],[28,[37,11],[[33,16]],null]],[["value"],["target.selectedItems"]]],[33,17]]]]]]],[30,2,["data"]]],[[[41,[28,[37,18],[[30,5,["length"]],0],null],[[[1," "],[10,"input"],[14,1,"toolbar-toggle"],[14,4,"checkbox"],[12],[13],[1,"\\n "],[8,[39,19],null,[["@search","@onsearch","@sort","@filter"],[[99,20,["@search"]],[28,[37,10],[[30,0],[28,[37,11],[[33,20]],null]],[["value"],["target.value"]]],[30,3],[30,4]]],null],[1,"\\n"]],[]],null],[1," "],[8,[39,21],null,[["@type","@sort","@filters","@search","@items"],["service",[30,3,["value"]],[30,4],[99,20,["@search"]],[30,5]]],[["default"],[[[[1,"\\n "],[8,[30,6,["Collection"]],null,null,[["default"],[[[[1,"\\n "],[1,[28,[35,22],["routes.dc.services.show.services.intro"],[["htmlSafe"],[true]]]],[1,"\\n "],[8,[39,23],null,[["@nspace","@partition","@items"],[[28,[37,8],[[30,1,["params","nspace"]],[30,1,["model","user","token","Namespace"]],"default"],null],[28,[37,8],[[30,1,["params","partition"]],[30,1,["model","user","token","Partition"]],"default"],null],[30,6,["items"]]]],[["default"],[[[[1,"\\n "]],[]]]]],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[30,6,["Empty"]],null,null,[["default"],[[[[1,"\\n "],[8,[39,24],null,null,[["default"],[[[[1,"\\n "],[8,[39,5],null,[["@name"],["body"]],[["default"],[[[[1,"\\n "],[1,[28,[35,22],["routes.dc.services.show.services.empty"],[["items","htmlSafe"],[[30,5,["length"]],true]]]],[1,"\\n "]],[]]]]],[1,"\\n "]],[]]]]],[1,"\\n "]],[]]]]],[1,"\\n "]],[6]]]]],[1,"\\n"]],[3,4,5]]],[1," "],[13],[1,"\\n "]],[]]]]],[1,"\\n "]],[2]]]]],[1,"\\n"]],[1]]]]],[1,"\\n"]],["route","loader","sort","filters","items","collection"],false,["route","routeName","data-loader","uri","hash","block-slot","app-error","let","or","sortBy","action","mut","if","instance","split","not-eq","searchproperty","searchProperties","gt","consul/upstream/search-bar","search","data-collection","t","consul/service/list","empty-state"]]',moduleName:"consul-ui/templates/dc/services/show/services.hbs",isStrictMode:!1}) +e.default=n})),define("consul-ui/templates/dc/services/show/tags",["exports","@ember/template-factory"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +var n=(0,t.createTemplateFactory)({id:"QPrKCkNR",block:'[[[8,[39,0],null,[["@name"],[[99,1,["@name"]]]],[["default"],[[[[1,"\\n "],[10,0],[14,0,"tab-section"],[12],[1,"\\n"],[44,[[28,[37,3],[[28,[37,4],["Tags",[30,1,["model","items"]]],null]],null]],[[[41,[28,[37,6],[[30,2,["length"]],0],null],[[[1," "],[8,[39,7],null,[["@item"],[[28,[37,8],null,[["Tags"],[[30,2]]]]]],null],[1,"\\n"]],[]],[[[1," "],[8,[39,9],null,null,[["default"],[[[[1,"\\n "],[8,[39,10],null,[["@name"],["header"]],[["default"],[[[[1,"\\n "],[10,"h2"],[12],[1,"\\n "],[1,[28,[35,11],["routes.dc.services.show.tags.empty.header"],null]],[1,"\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,10],null,[["@name"],["body"]],[["default"],[[[[1,"\\n "],[1,[28,[35,11],["routes.dc.services.show.tags.empty.body"],[["htmlSafe"],[true]]]],[1,"\\n "]],[]]]]],[1,"\\n "]],[]]]]],[1,"\\n"]],[]]]],[2]]],[1," "],[13],[1,"\\n"]],[1]]]]],[1,"\\n"]],["route","tags"],false,["route","routeName","let","flatten","map-by","if","gt","tag-list","hash","empty-state","block-slot","t"]]',moduleName:"consul-ui/templates/dc/services/show/tags.hbs",isStrictMode:!1}) +e.default=n})),define("consul-ui/templates/dc/services/show/topology",["exports","@ember/template-factory"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +var n=(0,t.createTemplateFactory)({id:"ZLtuX5vP",block:'[[[8,[39,0],null,[["@name"],[[99,1,["@name"]]]],[["default"],[[[[1,"\\n "],[8,[39,2],null,[["@src"],[[28,[37,3],["/${partition}/${nspace}/${dc}/topology/${name}/${kind}",[28,[37,4],null,[["partition","nspace","dc","name","kind"],[[30,1,["params","partition"]],[30,1,["params","nspace"]],[30,1,["params","dc"]],[30,1,["params","name"]],[28,[37,5],[[30,1,["model","items","firstObject","Service","Kind"]],""],null]]]]],null]]],[["default"],[[[[1,"\\n\\n "],[8,[39,6],null,[["@name"],["error"]],[["default"],[[[[1,"\\n "],[8,[39,7],null,[["@error","@login"],[[30,2,["error"]],[30,1,["model","app","login","open"]]]],null],[1,"\\n "]],[]]]]],[1,"\\n\\n "],[8,[39,6],null,[["@name"],["loaded"]],[["default"],[[[[1,"\\n"],[44,[[30,1,["params","nspace"]],[30,1,["model","dc"]],[30,1,["model","items"]],[30,2,["data"]]],[[[1," "],[10,0],[14,0,"tab-section"],[12],[1,"\\n\\n "],[10,0],[14,0,"topology-notices"],[12],[1,"\\n "],[8,[39,9],null,[["@expanded"],[true]],[["default"],[[[[1,"\\n"],[44,[[28,[37,10],[[28,[37,11],[[28,[37,11],["filtered-by-acls",[28,[37,5],[false,[30,6,["FilteredByACLs"]]],null]],null],[28,[37,11],["default-allow",[28,[37,5],[false,[28,[37,12],[[30,4,["DefaultACLPolicy"]],"allow"],null]],null]],null],[28,[37,11],["wildcard-intention",[28,[37,5],[false,[30,6,["wildcardIntention"]]],null]],null],[28,[37,11],["not-defined-intention",[28,[37,5],[false,[30,6,["notDefinedIntention"]]],null]],null],[28,[37,11],["no-dependencies",[28,[37,5],[false,[28,[37,13],[[30,6,["noDependencies"]],[28,[37,14],["use acls"],null]],null]],null]],null],[28,[37,11],["acls-disabled",[28,[37,5],[false,[28,[37,13],[[30,6,["noDependencies"]],[28,[37,15],[[28,[37,14],["use acls"],null]],null]],null]],null]],null]],null]],null]],[[[1,"\\n"],[44,[[28,[37,16],[false,[28,[37,17],[[30,8]],null]],null]],[[[1,"\\n"],[42,[28,[37,19],[[30,8]],null],null,[[[41,[30,10],[[[1," "],[8,[30,7,["Details"]],null,[["@auto"],[false]],[["default"],[[[[1,"\\n "],[8,[39,21],[[16,1,[30,12,["id"]]],[24,0,"mb-3 mt-2 topology-metrics-notice"]],[["@type","@color"],["inline",[52,[28,[37,22],[[30,11],[28,[37,11],["filtered-by-acls","no-dependencies"],null]],null],"neutral","warning"]]],[["default"],[[[[1,"\\n "],[8,[30,13,["Title"]],null,null,[["default"],[[[[1,"\\n "],[1,[28,[35,23],[[28,[37,24],[[30,1,["t"]],"notice.${prop}.header",[28,[37,4],null,[["prop"],[[30,11]]]]],null]],null]],[1,"\\n "]],[]]]]],[1,"\\n"],[41,[30,7,["expanded"]],[[[1," "],[8,[30,13,["Description"]],null,null,[["default"],[[[[1,"\\n "],[1,[28,[35,23],[[28,[37,24],[[30,1,["t"]],"notice.${prop}.body",[28,[37,4],null,[["prop"],[[30,11]]]]],null]],null]],[1,"\\n "]],[]]]]],[1,"\\n"]],[]],null],[41,[28,[37,13],[[30,7,["expanded"]],[28,[37,25],[[30,11],"filtered-by-acls"],null]],null],[[[41,[28,[37,22],[[30,11],[28,[37,11],["wildcard-intention","default-allow","no-intentions"],null]],null],[[[1," "],[8,[30,13,["Button"]],null,[["@color","@size","@route","@text","@icon"],["secondary","small","dc.services.show.intentions",[28,[37,23],[[28,[37,24],[[30,1,["t"]],"notice.${prop}.footer.link-text",[28,[37,4],null,[["prop"],[[30,11]]]]],null]],null],[28,[37,23],[[28,[37,24],[[30,1,["t"]],"notice.${prop}.footer.icon",[28,[37,4],null,[["prop"],[[30,11]]]]],null]],null]]],null],[1,"\\n"]],[]],[[[1," "],[8,[30,13,["Link::Standalone"]],null,[["@text","@href","@icon","@iconPosition"],[[28,[37,23],[[28,[37,24],[[30,1,["t"]],"notice.${prop}.footer.link-text",[28,[37,4],null,[["prop"],[[30,11]]]]],null]],null],[28,[37,23],[[28,[37,24],[[30,1,["t"]],"notice.${prop}.footer.link",[28,[37,4],null,[["prop"],[[30,11]]]]],null]],null],"docs-link","trailing"]],null],[1,"\\n"]],[]]]],[]],null],[1," "]],[13]]]]],[1,"\\n "]],[12]]]]],[1,"\\n"]],[]],null]],[10,11]],null],[1,"\\n"],[41,[28,[37,26],[[30,9,["length"]],2],null],[[[1," "],[8,[30,7,["Action"]],[[4,[38,27],["click",[30,7,["toggle"]]],null]],null,[["default"],[[[[1,"\\n "],[1,[28,[35,23],[[28,[37,24],[[30,1,["t"]],"notices.${expanded}",[28,[37,4],null,[["expanded"],[[52,[30,7,["expanded"]],"close","open"]]]]],null]],null]],[1,"\\n "]],[]]]]],[1,"\\n"]],[]],null],[1,"\\n"]],[9]]]],[8]]],[1," "]],[7]]]]],[1,"\\n\\n "],[13],[1,"\\n\\n\\n "],[8,[39,28],null,[["@src"],[[28,[37,3],["/${partition}/${nspace}/${dc}/ui-config",[28,[37,4],null,[["partition","nspace","dc"],[[30,1,["params","partition"]],[30,1,["params","nspace"]],[30,1,["params","dc"]]]]]],null]]],[["default"],[[[[1,"\\n"],[41,[30,14,["data"]],[[[1,"\\n "],[8,[39,29],null,[["@nspace","@dc","@service","@topology","@metricsHref","@isRemoteDC","@hasMetricsProvider","@oncreate"],[[30,3],[30,4],[30,5,["firstObject"]],[30,6],[28,[37,30],[[30,14,["data","dashboard_url_templates","service"]],[28,[37,4],null,[["Datacenter","Service"],[[30,4,["Name"]],[28,[37,4],null,[["Name","Namespace","Partition"],[[30,5,["firstObject","Name"]],[28,[37,5],[[30,5,["firstObject","Namespace"]],""],null],[28,[37,5],[[30,5,["firstObject","Partition"]],""],null]]]]]]]],null],[28,[37,15],[[30,4,["Local"]]],null],[28,[37,26],[[30,14,["data","metrics_provider","length"]],0],null],[28,[37,31],["createIntention"],null]]],null],[1,"\\n\\n"]],[]],null],[1," "]],[14]]]]],[1,"\\n "],[13],[1,"\\n"]],[3,4,5,6]]],[1," "]],[]]]]],[1,"\\n "]],[2]]]]],[1,"\\n"]],[1]]]]],[1,"\\n"]],["route","loader","nspace","dc","items","topology","disclosure","notices","noticesEnabled","enabled","prop","details","A","config"],false,["route","routeName","data-loader","uri","hash","or","block-slot","app-error","let","disclosure","from-entries","array","eq","and","can","not","without","values","each","-each-in","if","hds/alert","includes","compute","fn","not-eq","gt","on","data-source","topology-metrics","render-template","route-action"]]',moduleName:"consul-ui/templates/dc/services/show/topology.hbs",isStrictMode:!1}) +e.default=n})),define("consul-ui/templates/dc/services/show/upstreams",["exports","@ember/template-factory"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +var n=(0,t.createTemplateFactory)({id:"edRsEgtL",block:'[[[8,[39,0],null,[["@name"],[[99,1,["@name"]]]],[["default"],[[[[1,"\\n "],[8,[39,2],null,[["@src"],[[28,[37,3],["/${partition}/${nspace}/${dc}/gateways/for-service/${name}",[28,[37,4],null,[["partition","nspace","dc","name"],[[30,1,["params","partition"]],[30,1,["params","nspace"]],[30,1,["params","dc"]],[30,1,["params","name"]]]]]],null]]],[["default"],[[[[1,"\\n\\n "],[8,[39,5],null,[["@name"],["error"]],[["default"],[[[[1,"\\n "],[8,[39,6],null,[["@error","@login"],[[30,2,["error"]],[30,1,["model","app","login","open"]]]],null],[1,"\\n "]],[]]]]],[1,"\\n\\n "],[8,[39,5],null,[["@name"],["loaded"]],[["default"],[[[[1,"\\n "],[10,0],[14,0,"tab-section"],[12],[1,"\\n"],[44,[[28,[37,4],null,[["value","change"],[[28,[37,8],[[33,9],"Status:asc"],null],[28,[37,10],[[30,0],[28,[37,11],[[33,9]],null]],[["value"],["target.selected"]]]]]],[28,[37,4],null,[["instance","searchproperty"],[[28,[37,4],null,[["value","change"],[[52,[33,13],[28,[37,14],[[33,13],","],null],[27]],[28,[37,10],[[30,0],[28,[37,11],[[33,13]],null]],[["value"],["target.selectedItems"]]]]]],[28,[37,4],null,[["value","change","default"],[[52,[28,[37,15],[[33,16],[27]],null],[28,[37,14],[[33,16],","],null],[33,17]],[28,[37,10],[[30,0],[28,[37,11],[[33,16]],null]],[["value"],["target.selectedItems"]]],[33,17]]]]]]],[28,[37,8],[[30,1,["params","partition"]],[30,1,["model","user","token","Partition"]],"default"],null],[28,[37,8],[[30,1,["params","nspace"]],[30,1,["model","user","token","Namespace"]],"default"],null],[30,1,["params","dc"]],[30,2,["data"]]],[[[41,[28,[37,18],[[30,8,["length"]],0],null],[[[1," "],[10,"input"],[14,1,"toolbar-toggle"],[14,4,"checkbox"],[12],[13],[1,"\\n "],[8,[39,19],null,[["@search","@onsearch","@sort","@filter"],[[99,20,["@search"]],[28,[37,10],[[30,0],[28,[37,11],[[33,20]],null]],[["value"],["target.value"]]],[30,3],[30,4]]],null],[1,"\\n"]],[]],null],[1," "],[1,[28,[35,21],["routes.dc.services.show.upstreams.intro"],[["htmlSafe"],[true]]]],[1,"\\n "],[8,[39,22],null,[["@type","@sort","@filters","@search","@items"],["service",[30,3,["value"]],[30,4],[99,20,["@search"]],[30,8]]],[["default"],[[[[1,"\\n "],[8,[30,9,["Collection"]],null,null,[["default"],[[[[1,"\\n "],[8,[39,23],null,[["@items","@dc","@nspace","@partition"],[[30,9,["items"]],[30,7],[30,6],[30,5]]],[["default"],[[[[1,"\\n "]],[]]]]],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[30,9,["Empty"]],null,null,[["default"],[[[[1,"\\n "],[8,[39,24],null,null,[["default"],[[[[1,"\\n "],[8,[39,5],null,[["@name"],["body"]],[["default"],[[[[1,"\\n "],[1,[28,[35,21],["routes.dc.services.show.upstreams.empty"],[["items","htmlSafe"],[[30,8,["length"]],true]]]],[1,"\\n "]],[]]]]],[1,"\\n "]],[]]]]],[1,"\\n "]],[]]]]],[1,"\\n "]],[9]]]]],[1,"\\n"]],[3,4,5,6,7,8]]],[1," "],[13],[1,"\\n "]],[]]]]],[1,"\\n "]],[2]]]]],[1,"\\n"]],[1]]]]],[1,"\\n"]],["route","loader","sort","filters","partition","nspace","dc","items","collection"],false,["route","routeName","data-loader","uri","hash","block-slot","app-error","let","or","sortBy","action","mut","if","instance","split","not-eq","searchproperty","searchProperties","gt","consul/upstream/search-bar","search","t","data-collection","consul/upstream/list","empty-state"]]',moduleName:"consul-ui/templates/dc/services/show/upstreams.hbs",isStrictMode:!1}) +e.default=n})),define("consul-ui/templates/dc/show",["exports","@ember/template-factory"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +var n=(0,t.createTemplateFactory)({id:"FQ+sKuK+",block:'[[[8,[39,0],null,[["@name"],[[99,1,["@name"]]]],[["default"],[[[[1,"\\n "],[8,[39,2],null,null,[["default"],[[[[1,"\\n "],[8,[39,3],null,[["@name"],["header"]],[["default"],[[[[1,"\\n "],[10,"h1"],[12],[1,"\\n "],[8,[30,1,["Title"]],null,[["@title"],[[28,[37,4],[[28,[37,5],[[30,1,["t"]],"title"],null]],null]]],null],[1,"\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,3],null,[["@name"],["toolbar"]],[["default"],[[[[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,3],null,[["@name"],["nav"]],[["default"],[[[[1,"\\n\\n"],[44,[[28,[37,7],[[28,[37,8],[[28,[37,8],["serverstatus",[28,[37,4],[[28,[37,5],[[30,1,["exists"]],"serverstatus"],null]],null]],null],[28,[37,8],["cataloghealth",false],null],[28,[37,8],["license",[28,[37,4],[[28,[37,5],[[30,1,["exists"]],"license"],null]],null]],null]],null]],null]],[[[1,"\\n"],[44,[[28,[37,9],[false,[28,[37,10],[[30,2]],null]],null]],[[[1,"\\n"],[41,[28,[37,12],[[30,3,["length"]],1],null],[[[1," "],[8,[39,13],null,[["@items"],[[28,[37,14],[[28,[37,8],[[52,[30,2,["serverstatus"]],[28,[37,15],null,[["label","href","selected"],[[28,[37,4],[[28,[37,5],[[30,1,["t"]],"serverstatus.title"],null]],null],[28,[37,16],["dc.show.serverstatus"],null],[28,[37,17],["dc.show.serverstatus"],null]]]],""],[52,[30,2,["cataloghealth"]],[28,[37,15],null,[["label","href","selected"],[[28,[37,4],[[28,[37,5],[[30,1,["t"]],"cataloghealth.title"],null]],null],[28,[37,16],["dc.show.cataloghealth"],null],[28,[37,17],["dc.show.cataloghealth"],null]]]],""],[52,[30,2,["license"]],[28,[37,15],null,[["label","href","selected"],[[28,[37,4],[[28,[37,5],[[30,1,["t"]],"license.title"],null]],null],[28,[37,16],["dc.show.license"],null],[28,[37,17],["dc.show.license"],null]]]]],""],null]],null]]],null],[1,"\\n"]],[]],null],[1,"\\n"]],[3]]]],[2]]],[1," "]],[]]]]],[1,"\\n "],[8,[39,3],null,[["@name"],["content"]],[["default"],[[[[1,"\\n "],[8,[39,18],null,[["@name","@model"],[[99,1,["@name"]],[30,1,["model"]]]],[["default"],[[[[1,"\\n "],[46,[28,[37,20],null,null],null,null,null],[1,"\\n "]],[4]]]]],[1,"\\n "]],[]]]]],[1,"\\n\\n "]],[]]]]],[1,"\\n"]],[1]]]]],[1,"\\n"]],["route","tabs","tabsEnabled","o"],false,["route","routeName","app-view","block-slot","compute","fn","let","from-entries","array","without","values","if","gt","tab-nav","compact","hash","href-to","is-href","outlet","component","-outlet"]]',moduleName:"consul-ui/templates/dc/show.hbs",isStrictMode:!1}) +e.default=n})),define("consul-ui/templates/dc/show/index",["exports","@ember/template-factory"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +var n=(0,t.createTemplateFactory)({id:"ZLphbwyJ",block:'[[[8,[39,0],null,[["@name"],[[99,1,["@name"]]]],[["default"],[[[[1,"\\n "],[1,[28,[35,2],[[28,[37,3],["replaceWith",[52,[28,[37,5],["access overview"],null],"dc.show.serverstatus","dc.services.index"]],null]],null]],[1,"\\n"]],[1]]]]],[1,"\\n\\n"]],["route"],false,["route","routeName","did-insert","route-action","if","can"]]',moduleName:"consul-ui/templates/dc/show/index.hbs",isStrictMode:!1}) +e.default=n})),define("consul-ui/templates/dc/show/license",["exports","@ember/template-factory"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +var n=(0,t.createTemplateFactory)({id:"NAOKWgT+",block:'[[[8,[39,0],null,[["@name"],[[99,1,["@name"]]]],[["default"],[[[[1,"\\n "],[8,[39,2],null,[["@src"],[[28,[37,3],["/${partition}/${nspace}/${dc}/license",[28,[37,4],null,[["partition","nspace","dc"],[[30,1,["params","partition"]],[30,1,["params","nspace"]],[30,1,["params","dc"]]]]]],null]]],[["default"],[[[[1,"\\n\\n"],[44,[[30,2,["data"]]],[[[1," "],[8,[39,6],null,[["@name"],["error"]],[["default"],[[[[1,"\\n "],[8,[39,7],null,[["@error","@login"],[[30,2,["error"]],[30,1,["model","app","login","open"]]]],null],[1,"\\n "]],[]]]]],[1,"\\n\\n "],[8,[39,6],null,[["@name"],["disconnected"]],[["default"],[[[[1,"\\n"],[41,[28,[37,9],[[30,2,["error","status"]],"404"],null],[[[1," "],[8,[39,10],[[4,[38,11],null,[["sticky"],[true]]]],[["@color"],["warning"]],[["default"],[[[[1,"\\n "],[8,[30,5,["Title"]],null,null,[["default"],[[[[1,"Warning!"]],[]]]]],[1,"\\n "],[8,[30,5,["Description"]],null,null,[["default"],[[[[1,"This service has been deregistered and no longer exists in the catalog."]],[]]]]],[1,"\\n "]],[5]]]]],[1,"\\n"]],[]],[[[41,[28,[37,9],[[30,2,["error","status"]],"403"],null],[[[1," "],[8,[39,10],[[4,[38,11],null,[["sticky"],[true]]]],[["@color"],["critical"]],[["default"],[[[[1,"\\n "],[8,[30,6,["Title"]],null,null,[["default"],[[[[1,"Error!"]],[]]]]],[1,"\\n "],[8,[30,6,["Description"]],null,null,[["default"],[[[[1,"You no longer have access to this service."]],[]]]]],[1,"\\n "]],[6]]]]],[1,"\\n"]],[]],[[[1," "],[8,[39,10],[[4,[38,11],null,[["sticky"],[true]]]],[["@color"],["warning"]],[["default"],[[[[1,"\\n "],[8,[30,7,["Title"]],null,null,[["default"],[[[[1,"Warning!"]],[]]]]],[1,"\\n "],[8,[30,7,["Description"]],null,null,[["default"],[[[[1,"An error was returned whilst loading this data, refresh to try again."]],[]]]]],[1,"\\n "]],[7]]]]],[1,"\\n "]],[]]]],[]]],[1," "]],[4]]]]],[1,"\\n\\n "],[8,[39,6],null,[["@name"],["loaded"]],[["default"],[[[[1,"\\n "],[10,0],[14,0,"tab-section"],[12],[1,"\\n "],[10,"section"],[15,0,[28,[37,12],["validity",[28,[37,13],["valid",[30,3,["Valid"]]],null]],null]],[12],[1,"\\n "],[10,"header"],[12],[1,"\\n "],[10,"h2"],[12],[1,"\\n "],[1,[28,[35,14],[[28,[37,15],[[30,1,["t"]],"expiry.header"],null]],null]],[1,"\\n "],[13],[1,"\\n "],[13],[1,"\\n\\n "],[10,2],[12],[1,"\\n "],[1,[28,[35,14],[[28,[37,15],[[30,1,["t"]],"expiry.${type}.body",[28,[37,4],null,[["type","date","time","htmlSafe"],[[52,[30,3,["Valid"]],"valid","expired"],[28,[37,16],[[30,3,["License","expiration_time"]]],[["year","month","day"],["numeric","long","numeric"]]],[28,[37,16],[[30,3,["License","expiration_time"]]],[["hour12","hour","hourCycle","minute","second","timeZoneName"],[true,"numeric","h12","numeric","numeric","short"]]],true]]]],null]],null]],[1,"\\n "],[13],[1,"\\n\\n "],[10,"dl"],[12],[1,"\\n "],[10,"dt"],[15,0,[28,[37,12],[[28,[37,13],["valid",[30,3,["Valid"]]],null],[28,[37,13],["expired",[28,[37,17],[[30,3,["Valid"]]],null]],null],[28,[37,13],["warning",[28,[37,18],[[30,3,["License","expiration_time"]],2629800000],null]],null]],null]],[12],[1,"\\n "],[1,[28,[35,14],[[28,[37,15],[[30,1,["t"]],"expiry.${type}.header",[28,[37,4],null,[["type"],[[52,[30,3,["Valid"]],"valid","expired"]]]]],null]],null]],[1,"\\n "],[13],[1,"\\n "],[10,"dd"],[12],[1,"\\n "],[1,[28,[35,19],[[30,3,["License","expiration_time"]]],null]],[1,"\\n "],[13],[1,"\\n "],[13],[1,"\\n\\n "],[10,"aside"],[12],[1,"\\n "],[10,"header"],[12],[1,"\\n "],[10,"h3"],[12],[1,"\\n "],[1,[28,[35,14],[[28,[37,15],[[30,1,["t"]],"documentation.title"],null]],null]],[1,"\\n "],[13],[1,"\\n "],[13],[1,"\\n "],[10,0],[14,0,"flex gap-1.5 flex-col"],[12],[1,"\\n "],[8,[39,20],null,[["@text","@href","@icon"],[[28,[37,14],[[28,[37,15],[[30,1,["t"]],"documentation.links.license-expiration.text"],null]],null],[29,[[28,[37,21],[[28,[37,22],["CONSUL_DOCS_URL"],null],[28,[37,14],[[28,[37,15],[[30,1,["t"]],"documentation.links.license-expiration.link"],null]],null]],null]]],"docs-link"]],null],[1,"\\n "],[8,[39,20],null,[["@text","@href","@icon"],[[28,[37,14],[[28,[37,15],[[30,1,["t"]],"documentation.links.renewing-license.text"],null]],null],[29,[[28,[37,21],[[28,[37,22],["CONSUL_DOCS_URL"],null],[28,[37,14],[[28,[37,15],[[30,1,["t"]],"documentation.links.renewing-license.link"],null]],null]],null]]],"docs-link"]],null],[1,"\\n "],[8,[39,20],null,[["@text","@href","@icon"],[[28,[37,14],[[28,[37,15],[[30,1,["t"]],"documentation.links.applying-new-license.text"],null]],null],[29,[[28,[37,21],[[28,[37,22],["CONSUL_DOCS_URL"],null],[28,[37,14],[[28,[37,15],[[30,1,["t"]],"documentation.links.applying-new-license.link"],null]],null]],null]]],"docs-link"]],null],[1,"\\n "],[13],[1,"\\n "],[13],[1,"\\n\\n "],[13],[1,"\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n"]],[3]]],[1," "]],[2]]]]],[1,"\\n"]],[1]]]]],[1,"\\n\\n"]],["route","loader","item","after","T","T","T"],false,["route","routeName","data-loader","uri","hash","let","block-slot","error-state","if","eq","hds/toast","notification","class-map","array","compute","fn","format-time","not","temporal-within","temporal-format","hds/link/standalone","concat","env"]]',moduleName:"consul-ui/templates/dc/show/license.hbs",isStrictMode:!1}) +e.default=n})),define("consul-ui/templates/dc/show/serverstatus",["exports","@ember/template-factory"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +var n=(0,t.createTemplateFactory)({id:"UCwnBDmO",block:'[[[8,[39,0],null,[["@name"],[[99,1,["@name"]]]],[["default"],[[[[1,"\\n "],[8,[39,2],null,[["@src"],[[28,[37,3],["/${partition}/${nspace}/${dc}/datacenter",[28,[37,4],null,[["partition","nspace","dc"],[[30,1,["params","partition"]],[30,1,["params","nspace"]],[30,1,["params","dc"]]]]]],null]]],[["default"],[[[[1,"\\n\\n"],[44,[[30,2,["data"]]],[[[1," "],[8,[39,6],null,[["@name"],["error"]],[["default"],[[[[1,"\\n "],[8,[39,7],null,[["@error","@login"],[[30,2,["error"]],[30,1,["model","app","login","open"]]]],null],[1,"\\n "]],[]]]]],[1,"\\n\\n "],[8,[39,6],null,[["@name"],["disconnected"]],[["default"],[[[[1,"\\n"],[41,[28,[37,9],[[30,2,["error","status"]],"404"],null],[[[1," "],[8,[39,10],[[4,[38,11],null,[["sticky"],[true]]]],[["@color"],["warning"]],[["default"],[[[[1,"\\n "],[8,[30,5,["Title"]],null,null,[["default"],[[[[1,"Warning!"]],[]]]]],[1,"\\n "],[8,[30,5,["Description"]],null,null,[["default"],[[[[1,"This service has been deregistered and no longer exists in the catalog."]],[]]]]],[1,"\\n "]],[5]]]]],[1,"\\n"]],[]],[[[41,[28,[37,9],[[30,2,["error","status"]],"403"],null],[[[1," "],[8,[39,10],[[4,[38,11],null,[["sticky"],[true]]]],[["@color"],["critical"]],[["default"],[[[[1,"\\n "],[8,[30,6,["Title"]],null,null,[["default"],[[[[1,"Error!"]],[]]]]],[1,"\\n "],[8,[30,6,["Description"]],null,null,[["default"],[[[[1,"You no longer have access to this service."]],[]]]]],[1,"\\n "]],[6]]]]],[1,"\\n"]],[]],[[[1," "],[8,[39,10],[[4,[38,11],null,[["sticky"],[true]]]],[["@color"],["warning"]],[["default"],[[[[1,"\\n "],[8,[30,7,["Title"]],null,null,[["default"],[[[[1,"Warning!"]],[]]]]],[1,"\\n "],[8,[30,7,["Description"]],null,null,[["default"],[[[[1,"An error was returned whilst loading this data, refresh to try again."]],[]]]]],[1,"\\n "]],[7]]]]],[1,"\\n "]],[]]]],[]]],[1," "]],[4]]]]],[1,"\\n\\n "],[8,[39,6],null,[["@name"],["loaded"]],[["default"],[[[[1,"\\n "],[10,0],[14,0,"tab-section"],[12],[1,"\\n\\n "],[10,"section"],[15,0,[28,[37,12],["server-failure-tolerance"],null]],[12],[1,"\\n\\n "],[10,"header"],[12],[1,"\\n "],[10,"h2"],[12],[1,"\\n "],[1,[28,[35,13],[[28,[37,14],[[30,1,["t"]],"tolerance.header"],null]],null]],[1,"\\n "],[13],[1,"\\n "],[8,[39,15],null,[["@icon","@iconPosition","@text","@href"],["docs-link","trailing",[28,[37,13],[[28,[37,14],[[30,1,["t"]],"tolerance.link-text"],null]],null],[29,[[28,[37,16],[[28,[37,17],["CONSUL_DOCS_URL"],null],[28,[37,13],[[28,[37,14],[[30,1,["t"]],"tolerance.link"],null]],null]],null]]]]],null],[1,"\\n "],[13],[1,"\\n\\n "],[10,"section"],[15,0,[28,[37,12],[[28,[37,18],["immediate-tolerance"],null]],null]],[12],[1,"\\n "],[10,"header"],[12],[1,"\\n "],[10,"h3"],[12],[1,"\\n "],[1,[28,[35,13],[[28,[37,14],[[30,1,["t"]],"tolerance.immediate.header"],null]],null]],[1,"\\n "],[13],[1,"\\n "],[13],[1,"\\n "],[10,"dl"],[15,0,[28,[37,12],[[28,[37,18],["warning",[28,[37,19],[[28,[37,9],[[30,3,["FailureTolerance"]],0],null],[28,[37,9],[[30,3,["OptimisticFailureTolerance"]],0],null]],null]],null]],null]],[12],[1,"\\n "],[10,"dt"],[12],[1,"\\n "],[1,[28,[35,13],[[28,[37,14],[[30,1,["t"]],"tolerance.immediate.body"],null]],null]],[1,"\\n "],[13],[1,"\\n "],[10,"dd"],[12],[1,"\\n "],[1,[30,3,["FailureTolerance"]]],[1,"\\n "],[13],[1,"\\n "],[13],[1,"\\n "],[13],[1,"\\n\\n"],[41,[28,[37,20],["read zones"],null],[[[1," "],[10,"section"],[15,0,[28,[37,12],[[28,[37,18],["optimistic-tolerance"],null]],null]],[12],[1,"\\n "],[10,"header"],[12],[1,"\\n "],[10,"h3"],[12],[1,"\\n "],[1,[28,[35,13],[[28,[37,14],[[30,1,["t"]],"tolerance.optimistic.header"],null]],null]],[1,"\\n "],[11,1],[4,[38,21],["With > 30 seconds between server failures, Consul can restore the Immediate Fault Tolerance by replacing failed active voters with healthy back-up voters when using redundancy zones."],null],[12],[1,"\\n "],[13],[1,"\\n "],[13],[1,"\\n "],[13],[1,"\\n "],[10,"dl"],[15,0,[28,[37,12],[[28,[37,18],["warning",[28,[37,9],[[30,3,["OptimisticFailureTolerance"]],0],null]],null]],null]],[12],[1,"\\n "],[10,"dt"],[12],[1,"\\n "],[1,[28,[35,13],[[28,[37,14],[[30,1,["t"]],"tolerance.optimistic.body"],null]],null]],[1,"\\n "],[13],[1,"\\n "],[10,"dd"],[12],[1,"\\n "],[1,[30,3,["OptimisticFailureTolerance"]]],[1,"\\n "],[13],[1,"\\n "],[13],[1,"\\n\\n "],[13],[1,"\\n"]],[]],null],[1," "],[13],[1,"\\n\\n"],[41,[28,[37,22],[[30,3,["RedundancyZones","length"]],0],null],[[[1," "],[10,"section"],[15,0,[28,[37,12],["redundancy-zones"],null]],[12],[1,"\\n "],[10,"header"],[12],[1,"\\n "],[10,"h2"],[12],[1,"\\n "],[1,[28,[35,23],[[28,[37,24],["common.consul.redundancyzone"],null]],null]],[1,"\\n "],[13],[1,"\\n "],[13],[1,"\\n\\n"],[42,[28,[37,26],[[28,[37,26],[[30,3,["RedundancyZones"]]],null]],null],null,[[[41,[28,[37,22],[[30,8,["Servers","length"]],0],null],[[[1," "],[10,"section"],[12],[1,"\\n "],[10,"header"],[12],[1,"\\n "],[10,"h3"],[12],[1,"\\n "],[1,[30,8,["Name"]]],[1,"\\n "],[13],[1,"\\n "],[10,"dl"],[15,0,[28,[37,12],[[28,[37,18],["warning",[28,[37,9],[[30,8,["FailureTolerance"]],0],null]],null]],null]],[12],[1,"\\n "],[10,"dt"],[12],[1,[28,[35,24],["common.consul.failuretolerance"],null]],[13],[1,"\\n "],[10,"dd"],[12],[1,[30,8,["FailureTolerance"]]],[13],[1,"\\n "],[13],[1,"\\n "],[13],[1,"\\n "],[8,[39,27],null,[["@items"],[[30,8,["Servers"]]]],null],[1,"\\n "],[13],[1,"\\n"]],[]],null]],[8]],null],[1,"\\n"],[41,[28,[37,22],[[30,3,["Default","Servers","length"]],0],null],[[[1," "],[10,"section"],[12],[1,"\\n "],[10,"header"],[12],[1,"\\n "],[10,"h3"],[12],[1,"\\n "],[1,[28,[35,13],[[28,[37,14],[[30,1,["t"]],"unassigned"],null]],null]],[1,"\\n "],[13],[1,"\\n "],[13],[1,"\\n "],[8,[39,27],null,[["@items"],[[30,3,["Default","Servers"]]]],null],[1,"\\n "],[13],[1,"\\n"]],[]],null],[1,"\\n "],[13],[1,"\\n"]],[]],[[[1," "],[10,"section"],[12],[1,"\\n "],[10,"header"],[12],[1,"\\n "],[10,"h2"],[12],[1,"\\n "],[1,[28,[35,13],[[28,[37,14],[[30,1,["t"]],"servers"],null]],null]],[1,"\\n "],[13],[1,"\\n "],[13],[1,"\\n "],[8,[39,27],null,[["@items"],[[30,3,["Default","Servers"]]]],null],[1,"\\n "],[13],[1,"\\n"]],[]]],[1,"\\n"],[41,[28,[37,22],[[30,3,["ReadReplicas","length"]],0],null],[[[1," "],[10,"section"],[12],[1,"\\n "],[10,"header"],[12],[1,"\\n "],[10,"h2"],[12],[1,"\\n "],[1,[28,[35,23],[[28,[37,24],["common.consul.readreplica"],null]],null]],[1,"\\n "],[13],[1,"\\n "],[13],[1,"\\n\\n "],[8,[39,27],null,[["@items"],[[30,3,["ReadReplicas"]]]],null],[1,"\\n "],[13],[1,"\\n"]],[]],null],[1,"\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n"]],[3]]],[1," "]],[2]]]]],[1,"\\n"]],[1]]]]],[1,"\\n\\n"]],["route","loader","item","after","T","T","T","item"],false,["route","routeName","data-loader","uri","hash","let","block-slot","error-state","if","eq","hds/toast","notification","class-map","compute","fn","hds/link/standalone","concat","env","array","and","can","tooltip","gt","pluralize","t","each","-track-array","consul/server/list"]]',moduleName:"consul-ui/templates/dc/show/serverstatus.hbs",isStrictMode:!1}) +e.default=n})),define("consul-ui/templates/error",["exports","@ember/template-factory"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +var n=(0,t.createTemplateFactory)({id:"fBHiRsbk",block:'[[[41,[33,1],[[[8,[39,2],null,[["@error"],[[99,1,["@error"]]]],null],[1,"\\n"]],[]],null]],[],false,["if","error","app-error"]]',moduleName:"consul-ui/templates/error.hbs",isStrictMode:!1}) +e.default=n})),define("consul-ui/templates/index",["exports","@ember/template-factory"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +var n=(0,t.createTemplateFactory)({id:"GYFZBIFL",block:'[[[8,[39,0],null,[["@name"],[[99,1,["@name"]]]],[["default"],[[[[1,"\\n "],[8,[39,2],null,[["@name","@model"],[[99,1,["@name"]],[30,1,["model"]]]],[["default"],[[[[1,"\\n "],[46,[28,[37,4],null,null],null,null,null],[1,"\\n "]],[2]]]]],[1,"\\n"]],[1]]]]],[1,"\\n"]],["route","o"],false,["route","routeName","outlet","component","-outlet"]]',moduleName:"consul-ui/templates/index.hbs",isStrictMode:!1}) +e.default=n})),define("consul-ui/templates/loading",["exports","@ember/template-factory"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +var n=(0,t.createTemplateFactory)({id:"bxrEoh3x",block:"[[],[],false,[]]",moduleName:"consul-ui/templates/loading.hbs",isStrictMode:!1}) +e.default=n})),define("consul-ui/templates/notfound",["exports","@ember/template-factory"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +var n=(0,t.createTemplateFactory)({id:"3oarGPY0",block:'[[[8,[39,0],null,[["@name"],[[99,1,["@name"]]]],[["default"],[[[[1,"\\n "],[8,[39,2],null,[["@login","@error"],[[30,1,["model","app","login","open"]],[28,[37,3],null,[["status","message"],[404,"Unable to find that page"]]]]],null],[1,"\\n"]],[1]]]]],[1,"\\n\\n"]],["route"],false,["route","routeName","app-error","hash"]]',moduleName:"consul-ui/templates/notfound.hbs",isStrictMode:!1}) +e.default=n})),define("consul-ui/templates/oauth-provider-debug",["exports","@ember/template-factory"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +var n=(0,t.createTemplateFactory)({id:"8VyAGRf6",block:'[[[8,[39,0],null,[["@name"],[[99,1,["@name"]]]],[["default"],[[[[1,"\\n"],[10,0],[14,5,"width: 50%;margin: 0 auto;"],[12],[1,"\\n "],[10,"h1"],[12],[8,[30,1,["Title"]],null,[["@title"],["Mock OAuth Provider"]],null],[13],[1,"\\n "],[10,"main"],[12],[1,"\\n "],[10,"form"],[14,"method","GET"],[15,"action",[36,2]],[12],[1,"\\n"],[44,[[28,[37,4],null,[["state","code"],["state-123456789/abcdefghijklmnopqrstuvwxyz","code-abcdefghijklmnopqrstuvwxyz/123456789"]]]],[[[1," "],[8,[39,5],null,[["@name","@label","@item","@help"],["state","State",[30,2],"The OIDC state value that will get passed through to Consul"]],null],[1,"\\n "],[8,[39,5],null,[["@name","@label","@item","@help"],["code","Code",[30,2],"The OIDC code value that will get passed through to Consul"]],null],[1,"\\n"]],[2]]],[1," "],[8,[39,6],null,[["@type"],["submit"]],[["default"],[[[[1,"\\n Login\\n "]],[]]]]],[1,"\\n "],[13],[1,"\\n "],[13],[1,"\\n"],[13],[1,"\\n"]],[1]]]]],[1,"\\n"]],["route","item"],false,["route","routeName","redirect_uri","let","hash","text-input","action"]]',moduleName:"consul-ui/templates/oauth-provider-debug.hbs",isStrictMode:!1}) +e.default=n})) +define("consul-ui/templates/settings",["exports","@ember/template-factory"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +var n=(0,t.createTemplateFactory)({id:"cNZzwPnu",block:'[[[8,[39,0],null,[["@name"],[[99,1,["@name"]]]],[["default"],[[[[1,"\\n "],[8,[39,2],null,[["@src"],[[28,[37,3],["settings://consul:client"],null]]],[["default"],[[[[1,"\\n\\n "],[8,[39,4],null,[["@name"],["error"]],[["default"],[[[[1,"\\n "],[8,[39,5],null,[["@error","@login"],[[30,2,["error"]],[30,1,["model","app","login","open"]]]],null],[1,"\\n "]],[]]]]],[1,"\\n\\n "],[8,[39,4],null,[["@name"],["loaded"]],[["default"],[[[[1,"\\n"],[44,[[28,[37,7],[[30,2,["data"]],[28,[37,8],null,[["blocking"],[true]]]],null]],[[[1," "],[8,[39,9],null,null,[["default"],[[[[1,"\\n "],[8,[39,4],null,[["@name"],["header"]],[["default"],[[[[1,"\\n "],[10,"h1"],[12],[1,"\\n "],[8,[30,1,["Title"]],null,[["@title"],["Settings"]],null],[1,"\\n "],[13],[1,"\\n "]],[]]]]],[1,"\\n "],[8,[39,4],null,[["@name"],["content"]],[["default"],[[[[1,"\\n "],[8,[39,10],[[24,0,"mb-3 mt-2"]],[["@type"],["inline"]],[["default"],[[[[1,"\\n "],[8,[30,4,["Title"]],null,null,[["default"],[[[[1,"Local Storage"]],[]]]]],[1,"\\n "],[8,[30,4,["Description"]],null,null,[["default"],[[[[1,"These settings are immediately saved to local storage and persisted through browser usage."]],[]]]]],[1,"\\n "]],[4]]]]],[1,"\\n "],[10,"form"],[12],[1,"\\n"],[41,[28,[37,12],[[28,[37,13],["CONSUL_UI_DISABLE_REALTIME"],null]],null],[[[1," "],[8,[39,14],null,null,[["default"],[[[[1,"\\n "],[8,[30,5,["Details"]],null,null,[["default"],[[[[1,"\\n "],[8,[39,15],null,[["@data","@sink","@onchange"],[[30,3],"settings://consul:client",[28,[37,16],[[30,0],[28,[37,17],[[30,5,["close"]]],null]],null]]],null],[1,"\\n "]],[]]]]],[1,"\\n "],[10,"fieldset"],[12],[1,"\\n "],[10,"h2"],[12],[1,"Blocking Queries"],[13],[1,"\\n "],[10,2],[12],[1,"Keep catalog info up-to-date without refreshing the page. Any changes made to services, nodes and intentions would be reflected in real time."],[13],[1,"\\n "],[10,0],[14,0,"type-toggle"],[12],[1,"\\n "],[10,"label"],[12],[1,"\\n "],[11,"input"],[24,3,"client[blocking]"],[16,"checked",[52,[30,3,["blocking"]],"checked"]],[24,4,"checkbox"],[4,[38,18],["change",[28,[37,19],[[28,[37,20],[[30,3],"blocking",[28,[37,12],[[30,3,["blocking"]]],null]],null],[28,[37,17],[[30,5,["open"]]],null]],null]],null],[12],[13],[1,"\\n "],[10,1],[12],[1,[52,[30,3,["blocking"]],"On","Off"]],[13],[1,"\\n "],[13],[1,"\\n "],[13],[1,"\\n "],[13],[1,"\\n "]],[5]]]]],[1,"\\n"]],[]],null],[1," "],[13],[1,"\\n "]],[]]]]],[1,"\\n "]],[]]]]],[1,"\\n"]],[3]]],[1," "]],[]]]]],[1,"\\n"]],[2]]]]],[1,"\\n"]],[1]]]]],[1,"\\n"]],["route","loader","item","A","disclosure"],false,["route","routeName","data-loader","uri","block-slot","app-error","let","or","hash","app-view","hds/alert","if","not","env","disclosure","data-sink","action","fn","on","queue","set"]]',moduleName:"consul-ui/templates/settings.hbs",isStrictMode:!1}) +e.default=n})),define("consul-ui/transforms/array",["exports","ember-data-model-fragments/transforms/array"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +var n=t.default +e.default=n})),define("consul-ui/transforms/boolean",["exports","@ember-data/serializer/-private"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.BooleanTransform}})})),define("consul-ui/transforms/date",["exports","@ember-data/serializer/-private"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.DateTransform}})})),define("consul-ui/transforms/fragment-array",["exports","ember-data-model-fragments/transforms/fragment-array"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +var n=t.default +e.default=n})),define("consul-ui/transforms/fragment",["exports","ember-data-model-fragments/transforms/fragment"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +var n=t.default +e.default=n})),define("consul-ui/transforms/number",["exports","@ember-data/serializer/-private"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.NumberTransform}})})),define("consul-ui/transforms/string",["exports","@ember-data/serializer/-private"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.StringTransform}})})),define("consul-ui/utils/ascend",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(e,t){const n=e.split("/") +return n.length>t?n.slice(0,-t).concat("").join("/"):""}})),define("consul-ui/utils/atob",["exports","base64-js"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(e){let n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"utf-8" +const l=t.default.toByteArray(e) +return new TextDecoder(n).decode(l)}})),define("consul-ui/utils/btoa",["exports","base64-js"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(e){const n=(new TextEncoder).encode(e) +return t.default.fromByteArray(n)}})),define("consul-ui/utils/calculate-position",["exports","ember-basic-dropdown/utils/calculate-position"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/utils/callable-type",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(e){return"function"!=typeof e?function(){return e}:e}})),define("consul-ui/utils/create-fingerprinter",["exports","@ember/object","@ember/utils"],(function(e,t,n){Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(e,l,r){let i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:JSON.stringify +return function(o,a,u,s,c){return function(d){if(null==(u=null==u?d[e]:u))throw new Error(`Unable to create fingerprint, missing foreignKey value. Looking for value in \`${e}\` got \`${u}\``) +const p=a.split(",").map((function(e){const l=(0,t.get)(d,e) +if((0,n.isEmpty)(l)){if("PeerName"===e)return +throw new Error(`Unable to create fingerprint, missing slug. Looking for value in \`${e}\` got \`${l}\``)}return l})).compact() +return void 0===d[l]&&("*"===s&&(s="default"),d[l]=s),void 0===d[r]&&("*"===c&&(c="default"),d[r]=c),void 0===d[e]&&(d[e]=u),void 0===d[o]&&(d[o]=i([d[r],d[l],u].concat(p))),d}}}})),define("consul-ui/utils/distance",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(e,t){e=e.Coord,t=t.Coord +let n=0 +for(let o=0;o0&&(r=i) +return Math.round(1e5*r)/100}})),define("consul-ui/utils/dom/click-first-anchor",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(e){let n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:t +return function(t){let l=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"tr" +const r=t.target.nodeName.toLowerCase() +switch(r){case"input":case"label":case"a":case"button":return}const i=e(l,t.target).querySelector("a") +i&&n(i)}} +const t=function(e){["mousedown","mouseup","click"].map((function(e){return new MouseEvent(e,{bubbles:!0,cancelable:!0,view:window})})).forEach((function(t){e.dispatchEvent(t)}))}})),define("consul-ui/utils/dom/closest",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(e,t){try{return t.closest(e)}catch(n){return}}})),define("consul-ui/utils/dom/create-listeners",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[] +return new t(e)} +class t{constructor(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[] +this.listeners=e}add(e,n,l){let r +if("function"==typeof e)r=e +else if(e instanceof t)r=e.remove.bind(e) +else{let t="addEventListener",i="removeEventListener" +void 0===e[t]&&(t="on",i="off") +let o=n +"string"==typeof o&&(o={[n]:l}) +const a=Object.keys(o).map((function(n){return function(n,l){return e[t](n,l),function(){return e[i](n,l),l}}(n,o[n])})) +r=()=>a.map((e=>e()))}return this.listeners.push(r),()=>{const e=this.listeners.findIndex((function(e){return e===r})) +return this.listeners.splice(e,1)[0]()}}remove(){const e=this.listeners.map((e=>e())) +return this.listeners.splice(0,this.listeners.length),e}}})),define("consul-ui/utils/dom/event-source/blocking",["exports","@ember/object"],(function(e,t){function n(e,t){if(null==e)return{} +var n,l,r=function(e,t){if(null==e)return{} +var n,l,r={},i=Object.keys(e) +for(l=0;l=0||(r[n]=e[n]) +return r}(e,t) +if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e) +for(l=0;l=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(e){let a=arguments.length>1&&void 0!==arguments[1]?arguments[1]:l() +const u=function(l){let u=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{} +const{currentEvent:s}=u,c=n(u,["currentEvent"]) +e.apply(this,[e=>{const{createEvent:u}=e,s=n(e,["createEvent"]) +return l.apply(this,[s,this]).catch(a).then((n=>{if(n instanceof Error)return n +let l=("function"==typeof u?u:o)(n,e) +l.type||(l={type:"message",data:l}) +const a=(0,t.get)(l.data||{},"meta") +a&&(e.cursor=r(a.cursor,e.cursor),e.cacheControl=a.cacheControl,e.interval=a.interval),-1===(e.cacheControl||"").indexOf("no-store")&&(this.currentEvent=l),this.dispatchEvent(l) +const s=i(e,l,this.previousEvent) +return this.previousEvent=this.currentEvent,s(n)}))},c]),void 0!==s&&(this.currentEvent=s),this.addEventListener("open",(e=>{const t=e.target.getCurrentEvent() +void 0!==t&&this.dispatchEvent(t)}))} +return u.prototype=Object.assign(Object.create(e.prototype,{constructor:{value:e,configurable:!0,writable:!0}}),{getCurrentEvent:function(){return this.currentEvent},getPreviousEvent:function(){return this.previousEvent}}),u},e.validateCursor=e.createErrorBackoff=void 0 +const l=function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:3e3,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:Promise,l=arguments.length>2&&void 0!==arguments[2]?arguments[2]:setTimeout +return function(r){let i=(0,t.get)(r,"errors.firstObject.status")||(0,t.get)(r,"statusCode") +if(void 0!==i)switch(i=i.toString(),!0){case 0===i.indexOf("5")&&3===i.length&&"500"!==i:case"0"===i:return new n((function(t){l((function(){t(r)}),e)}))}throw r}} +e.createErrorBackoff=l +const r=function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null,n=parseInt(e) +if(!isNaN(n))return null!==t&&n2&&void 0!==arguments[2]?arguments[2]:Promise +return function(l){return function(r,i){const o=i.key +if(void 0!==l[o]&&i.settings.enabled)return void 0===l[o].configuration&&(l[o].configuration={}),l[o].configuration.settings=i.settings,e(l[o]) +{const a=i.type||t,u=l[o]=new a(r,i) +return e(u).catch((function(e){return delete l[o],n.reject(e)})).then((function(e){return void 0===e.configuration.cursor&&(e.close(),delete l[o]),e}))}}}}})),define("consul-ui/utils/dom/event-source/callable",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(e){let r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:Promise,i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:t,o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:n +const a=function(t){let n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{} +e.call(this),this.readyState=2,this.source="function"!=typeof t?function(e,t){return this.close(),r.resolve()}:t,this.readyState=0,r.resolve().then((()=>{if(!(this.readyState>1))return this.readyState=1,this.dispatchEvent({type:"open"}),i(this,n,l)})).catch((e=>{this.dispatchEvent(o(e)),this.readyState=2,this.dispatchEvent({type:"close",error:e})})).then((()=>{this.readyState=2}))} +return a.prototype=Object.assign(Object.create(e.prototype,{constructor:{value:a,configurable:!0,writable:!0}}),{close:function(){switch(this.readyState){case 0:case 2:this.readyState=2 +break +default:this.readyState=3}return this}}),a},e.defaultRunner=void 0 +const t=function(e,n,l){if(!l(e))return e.source.bind(e)(n,e).then((function(r){return t(e,n,l)})) +e.dispatchEvent({type:"close"})} +e.defaultRunner=t +const n=function(e){return new ErrorEvent("error",{error:e,message:e.message})},l=function(e){switch(e.readyState){case 2:case 3:return!0}return!1}})),define("consul-ui/utils/dom/event-source/index",["exports","@ember/object/proxy","@ember/array/proxy","consul-ui/utils/dom/create-listeners","consul-ui/utils/dom/event-target/rsvp","consul-ui/utils/dom/event-source/cache","consul-ui/utils/dom/event-source/proxy","consul-ui/utils/dom/event-source/resolver","consul-ui/utils/dom/event-source/callable","consul-ui/utils/dom/event-source/openable","consul-ui/utils/dom/event-source/blocking","consul-ui/utils/dom/event-source/storage","@ember/object","ember-concurrency","consul-ui/env"],(function(e,t,n,l,r,i,o,a,u,s,c,d,p,f,m){let h +switch(Object.defineProperty(e,"__esModule",{value:!0}),e.once=e.toPromise=e.fromPromise=e.cache=e.source=e.resolve=e.proxy=e.StorageEventSource=e.BlockingEventSource=e.OpenableEventSource=e.CallableEventSource=void 0,(0,m.env)("CONSUL_UI_REALTIME_RUNNER")){case"ec":h=function(e,t,n){return p.default.extend({task:(0,f.task)((function*(){for(;!n(e);)yield e.source.bind(e)(t)}))}).create().get("task").perform()} +break +case"generator":h=async function(e,t,n){const l=function*(){for(;!n(e);)yield e.source.bind(e)(t)} +let r,i=l().next() +for(;!i.done;)r=await i.value,i=l().next() +return r} +break +case"async":h=async function(e,t,n){let l +for(;!n(e);)l=await e.source.bind(e)(t) +return l}}const b=(0,u.default)(r.default,Promise,h) +e.CallableEventSource=b +const y=(0,s.default)(b) +e.OpenableEventSource=y +const g=(0,c.default)(y) +e.BlockingEventSource=g +const v=(0,d.default)(r.default,Promise) +e.StorageEventSource=v +const O=(0,o.default)(t.default,n.default,l.default) +e.proxy=O +const P=(0,a.default)(Promise) +e.resolve=P +const x=function(e){return P(e,(0,l.default)()).then((function(t){return O(e,t)}))} +e.source=x +const w=(0,i.default)(x,g,Promise) +e.cache=w +e.fromPromise=function(e){return new b((function(t){const n=this.dispatchEvent.bind(this),l=()=>{this.close()} +return e.then((function(e){l(),n({type:"message",data:e})})).catch((function(e){l(),n(function(e){return new ErrorEvent("error",{error:e,message:e.message})}(e))}))}))} +e.toPromise=function(e,t){let n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"message",l=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"error" +return new Promise((function(r,i){const o=function(e){r(e.data)},a=function(e){i(e.error)} +e.addEventListener(n,o),e.addEventListener(l,a),t((function(){"function"==typeof e.close&&e.close(),e.removeEventListener(n,o),e.removeEventListener(l,a)}))}))} +e.once=function(e,t){let n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:y +return new n((function(t,n){return e(t,n).then((function(e){n.dispatchEvent({type:"message",data:e}),n.close()})).catch((function(e){n.dispatchEvent({type:"error",error:e}),n.close()}))}),t)}})),define("consul-ui/utils/dom/event-source/openable",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:EventSource +const t=function(t){let n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{} +e.apply(this,arguments),this.configuration=n} +return t.prototype=Object.assign(Object.create(e.prototype,{constructor:{value:t,configurable:!0,writable:!0}}),{open:function(){switch(this.readyState){case 3:this.readyState=1 +break +case 2:e.apply(this,[this.source,this.configuration])}return this}}),t}})),define("consul-ui/utils/dom/event-source/proxy",["exports","@ember/object"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(e,l,r){return function(i){let o=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[],a=e,u="object" +return"string"!=typeof o&&void 0!==(0,t.get)(o,"length")&&(a=l,u="array",o=o.filter((function(e){return!(0,t.get)(e,"isDestroyed")&&!(0,t.get)(e,"isDeleted")&&(0,t.get)(e,"isLoaded")}))),void 0===n[u]&&(n[u]=a.extend({init:function(){this.listeners=r(),this.listeners.add(this._source,"message",(e=>(0,t.set)(this,"content",e.data))),this._super(...arguments)},addEventListener:function(e,t){this.listeners.add(this._source,e,t)},getCurrentEvent:function(){return this._source.getCurrentEvent(...arguments)},removeEventListener:function(){return this._source.removeEventListener(...arguments)},dispatchEvent:function(){return this._source.dispatchEvent(...arguments)},close:function(){return this._source.close(...arguments)},open:function(){return this._source.open(...arguments)},willDestroy:function(){this._super(...arguments),this.close(),this.listeners.remove()}})),n[u].create({content:o,_source:i,configuration:i.configuration})}} +const n={}})),define("consul-ui/utils/dom/event-source/resolver",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:Promise +return function(t,n){let l +return"function"==typeof t.getCurrentEvent&&(l=t.getCurrentEvent()),null!=l?e.resolve(l.data).then((function(e){return t.open(),e})):new e((function(e,l){n.add(t,"error",(function(e){n.remove(),e.target.close(),l(e.error)})),n.add(t,"message",(function(t){n.remove(),e(t.data)}))}))}}})),define("consul-ui/utils/dom/event-source/storage",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:Promise +const n=function(e){if((void 0===e||e.key===this.configuration.key)&&1===this.readyState){const e=this.source(this.configuration) +t.resolve(e).then((e=>{this.configuration.cursor++,this._currentEvent={type:"message",data:e},this.dispatchEvent({type:"message",data:e})}))}} +return class extends e{constructor(e,t){super(...arguments),this.readyState=2,this.target=t.target||window,this.name="storage",this.source=e,this.handler=n.bind(this),this.configuration=t,this.configuration.cursor=1,this.open()}dispatchEvent(){if(1===this.readyState)return super.dispatchEvent(...arguments)}close(){this.target.removeEventListener(this.name,this.handler),this.readyState=2}getCurrentEvent(){return this._currentEvent}open(){const e=this.readyState +this.readyState=1,1!==e&&(this.target.addEventListener(this.name,this.handler),this.handler())}}}})),define("consul-ui/utils/dom/event-target/event-target-shim/event",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.wrapEvent=function(e,t){return new(u(Object.getPrototypeOf(t)))(e,t)},e.isStopped=function(e){return l(e).immediateStopped},e.setEventPhase=function(e,t){l(e).eventPhase=t},e.setCurrentTarget=function(e,t){l(e).currentTarget=t},e.setPassiveListener=function(e,t){l(e).passiveListener=t} +const t=new WeakMap,n=new WeakMap +function l(e){const n=t.get(e) +return console.assert(null!=n,"'this' is expected an Event object, but got",e),n}function r(e){null==e.passiveListener?e.event.cancelable&&(e.canceled=!0,"function"==typeof e.event.preventDefault&&e.event.preventDefault()):"undefined"!=typeof console&&"function"==typeof console.error&&console.error("Unable to preventDefault inside passive event listener invocation.",e.passiveListener)}function i(e,n){t.set(this,{eventTarget:e,event:n,eventPhase:2,currentTarget:e,canceled:!1,stopped:!1,immediateStopped:!1,passiveListener:null,timeStamp:n.timeStamp||Date.now()}),Object.defineProperty(this,"isTrusted",{value:!1,enumerable:!0}) +const l=Object.keys(n) +for(let t=0;t1&&void 0!==arguments[1]?arguments[1]:"-view-registry:main" +const n=e.lookup(t) +return function(e){const t=e.getAttribute("id") +if(t)return n[t]}}})),define("consul-ui/utils/dom/is-outside",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(e,t){let n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:document +if(e){const l=!t||!n.contains(t),r=e===t||e.contains(t) +return!l&&!r}return!1}})) +define("consul-ui/utils/dom/normalize-event",["exports"],(function(e){function t(e,t){var n=Object.keys(e) +if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e) +t&&(l=l.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,l)}return n}function n(e){for(var n=1;n2&&void 0!==arguments[2]?arguments[2]:{} +if(void 0!==e.target)return e +return{target:n(n({},l),{name:e,value:t})}}})),define("consul-ui/utils/dom/qsa-factory",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:document +return function(t){let n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:e +return n.querySelectorAll(t)}}})),define("consul-ui/utils/dom/sibling",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(e,t){let n=e +for(;n=n.nextSibling;)if(1===n.nodeType&&n.nodeName.toLowerCase()===t)return n}})),define("consul-ui/utils/editor/lint",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(e,t){n(e,t,(function(){e.getValue().trim().length&&e.performLint()}))},e.createLoader=void 0 +const t=function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:document.getElementsByTagName.bind(document),t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:CodeMirror +return t.registerHelper("lint","ruby",(function(e){return[]})),function(n,l,r){let i=[...e("script")] +const o=i.find((function(e){return-1!==e.src.indexOf(`/codemirror/mode/${l}/${l}.js`)})) +t.autoLoadMode(n,l),o?r():(i=[...e("script")],t.on(i[0],"load",(function(){r()})))}} +e.createLoader=t +const n=t()})),define("consul-ui/utils/filter/index",["exports","mnemonist/set"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.andOr=void 0 +e.andOr=e=>{const n=function(e){return Object.entries(e).reduce(((e,t)=>{let[n,l]=t +return e[n]="function"!=typeof l?new Set(Object.keys(l)):null,e}),{})}(e) +return l=>(l=function(e,n){return Object.keys(n).reduce(((l,r)=>{const i=void 0===e[r]?[]:e[r] +return i.length>0&&(null!==n[r]?l[r]=[...t.default.intersection(n[r],new Set(i))]:l[r]=[...new Set(i)]),l}),{})}(l,n),t=>function(e,t,n){return Object.entries(t).every((t=>{let[l,r]=t,i=n[l] +return"function"==typeof i?i(e,r):r.some((t=>i[t](e,t)))}))}(t,l,e))}})),define("consul-ui/utils/form/builder",["exports","@ember/object","ember-changeset","consul-ui/utils/form/changeset","ember-changeset-validations","consul-ui/utils/get-form-name-property"],(function(e,t,n,l,r,i){Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:o,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:i.default +return function(){let l=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{} +const i={} +let o=null +const a={data:null,name:l,getName:function(){return this.name},setData:function(n){return o&&!Array.isArray(n)&&(n=e(n,o)),(0,t.set)(this,"data",n),this},getData:function(){return this.data},add:function(e){return i[e.getName()]=e,this},handleEvent:function(e,l){const i=e.target,o=n(l||i.name),a=o[0],u=o[1] +let s=r +if(a!==this.getName()){if(this.has(a))return this.form(a).handleEvent(e) +s=s[a]}const c=this.getData(),d="function"==typeof c.toJSON?c.toJSON():(0,t.get)(c,"data").toJSON() +if(!Object.keys(d).includes(u)){const e=new Error(`${u} property doesn't exist`) +throw e.target=i,e}let p=(0,t.get)(c,u) +if(Array.isArray(p)||void 0!==s[u]&&"string"==typeof s[u].type&&"array"===s[u].type.toLowerCase()){null==p&&(p=[]) +p[i.checked?"pushObject":"removeObject"](i.value),(0,t.set)(c,u,p)}else void 0===i.checked||"on"!==i.value.toLowerCase()&&"off"!==i.value.toLowerCase()?(0,t.set)(c,u,i.value):(0,t.set)(c,u,i.checked) +return this.validate()},reset:function(){return"function"==typeof this.getData().rollbackAttributes&&this.getData().rollbackAttributes(),this},clear:function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{} +return"function"==typeof e?this.clearer=e:this.setData(this.clearer(e)).getData()},submit:function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{} +if("function"==typeof e)return this.submitter=e +this.submitter(this.getData())},setValidators:function(e){return o=e,this},validate:function(){const e=this.getData() +return"function"==typeof e.validate&&e.validate(),this},addError:function(e,t){const n=this.getData() +"function"==typeof n.addError&&n.addError(...arguments)},form:function(e){return null==e?this:i[e]},has:function(e){return void 0!==i[e]}} +return a.submit=a.submit.bind(a),a.reset=a.reset.bind(a),a}},e.defaultChangeset=void 0 +const o=function(e,t){return(0,n.Changeset)(e,(0,r.default)(t),t,{changeset:l.default})} +e.defaultChangeset=o})),define("consul-ui/utils/form/changeset",["exports","@ember/object","ember-changeset"],(function(e,t,n){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +class l extends n.EmberChangeset{pushObject(e,n){let l +void 0===(0,t.get)(this,`_changes.${e}`)?(l=(0,t.get)(this,`data.${e}`),l=l?l.toArray():[]):l=this.get(e).slice(0),l.push(n),this.set(`${e}`,l)}removeObject(e,n){let l +void 0===(0,t.get)(this,`_changes.${e}`)?(l=(0,t.get)(this,`data.${e}`),l=void 0===l?[]:l.toArray()):l=this.get(e).slice(0) +const r=l.indexOf(n);-1!==r&&l.splice(r,1),this.set(`${e}`,l)}}e.default=l})),define("consul-ui/utils/get-environment",["exports","@ember/debug"],(function(e,t){function n(e,t){var n=Object.keys(e) +if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e) +t&&(l=l.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,l)}return n}function l(e){for(var t=1;t0&&void 0!==arguments[0]?arguments[0]:{},n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:window,r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:document;(0,t.runInDebug)((()=>{const e=function(e){return e.split(";").map((e=>e.trim())).filter((e=>""!==e)).filter((e=>e.split("=").shift().startsWith("CONSUL_")))} +n.Scenario=function(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"" +if(t.length>0)e(t).forEach((e=>{if(e.startsWith("CONSUL_COLOR_SCHEME=")){const[,l]=e.split("=") +let r +try{r=JSON.parse(n.localStorage.getItem("consul:theme"))}catch(t){r={"color-scheme":"light"}}n.localStorage.setItem("consul:theme",`{"color-scheme": "${"!"===l?"light"===r["color-scheme"]?"dark":"light":l}"}`)}else r.cookie=`${e};Path=/`})),n.location.hash="",location.reload() +else{t=e(r.cookie).join(";") +n.open("","_blank").document.write(`
      ${location.href}#${t}

      Scenario`)}},void 0!==n.location&&"string"==typeof n.location.hash&&n.location.hash.length>0&&n.Scenario(n.location.hash.substr(1))})) +const i=function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:r.cookie +return e.split(";").filter((e=>""!==e)).map((e=>{const[t,...n]=e.trim().split("=") +return[t,n.join("=")]}))},o=function(e){const t=n.localStorage.getItem(e) +return null===t?void 0:t},a=function(e){try{return n.performance.getEntriesByType("resource").find((t=>"script"===t.initiatorType&&e===t.name))||{}}catch(t){return{}}},u=l(l({},e.operatorConfig),JSON.parse(r.querySelector(`[data-${e.modulePrefix}-config]`).textContent)),s=u.UIConfig||{},c=r.getElementsByTagName("script"),d=c[c.length-1].src +let p +const f=function(e,t){let n,l,r,i +switch(e){case"CONSUL_NSPACES_ENABLED":return void 0!==u.NamespacesEnabled&&u.NamespacesEnabled +case"CONSUL_SSO_ENABLED":return void 0!==u.SSOEnabled&&u.SSOEnabled +case"CONSUL_ACLS_ENABLED":return void 0!==u.ACLsEnabled&&u.ACLsEnabled +case"CONSUL_PARTITIONS_ENABLED":return void 0!==u.PartitionsEnabled&&u.PartitionsEnabled +case"CONSUL_PEERINGS_ENABLED":return void 0!==u.PeeringEnabled&&u.PeeringEnabled +case"CONSUL_HCP_ENABLED":return void 0!==u.HCPEnabled&&u.HCPEnabled +case"CONSUL_DATACENTER_LOCAL":return u.LocalDatacenter +case"CONSUL_DATACENTER_PRIMARY":return u.PrimaryDatacenter +case"CONSUL_HCP_MANAGED_RUNTIME":return u.HCPManagedRuntime +case"CONSUL_API_PREFIX":return u.APIPrefix +case"CONSUL_HCP_URL":return u.HCPURL +case"CONSUL_UI_CONFIG":return l={service:void 0},r=t("CONSUL_METRICS_PROVIDER"),i=t("CONSUL_METRICS_PROXY_ENABLED"),l.service=t("CONSUL_SERVICE_DASHBOARD_URL"),r&&(s.metrics_provider=r),i&&(s.metrics_proxy_enabled=i),l.service&&(s.dashboard_url_templates=l),s +case"CONSUL_BASE_UI_URL":return d.split("/").slice(0,-2).join("/") +case"CONSUL_HTTP_PROTOCOL":return void 0===p&&(p=a(d)),p.nextHopProtocol||"http/1.1" +case"CONSUL_HTTP_MAX_CONNECTIONS":switch(n=t("CONSUL_HTTP_PROTOCOL"),!0){case 0===n.indexOf("h2"):case 0===n.indexOf("hq"):case 0===n.indexOf("spdy"):return +default:return 5}}},m=function(t){let n={} +switch(e.environment){case"development":case"staging":case"coverage":case"test":n=i().reduce((function(e,t){let[n,l]=t +switch(n){case"CONSUL_INTL_LOCALE":e.CONSUL_INTL_LOCALE=String(l).toLowerCase() +break +case"CONSUL_INTL_DEBUG":e.CONSUL_INTL_DEBUG=!!JSON.parse(String(l).toLowerCase()) +break +case"CONSUL_ACLS_ENABLE":e.CONSUL_ACLS_ENABLED=!!JSON.parse(String(l).toLowerCase()) +break +case"CONSUL_AGENTLESS_ENABLE":e.CONSUL_AGENTLESS_ENABLED=!!JSON.parse(String(l).toLowerCase()) +break +case"CONSUL_NSPACES_ENABLE":e.CONSUL_NSPACES_ENABLED=!!JSON.parse(String(l).toLowerCase()) +break +case"CONSUL_SSO_ENABLE":e.CONSUL_SSO_ENABLED=!!JSON.parse(String(l).toLowerCase()) +break +case"CONSUL_PARTITIONS_ENABLE":e.CONSUL_PARTITIONS_ENABLED=!!JSON.parse(String(l).toLowerCase()) +break +case"CONSUL_METRICS_PROXY_ENABLE":e.CONSUL_METRICS_PROXY_ENABLED=!!JSON.parse(String(l).toLowerCase()) +break +case"CONSUL_PEERINGS_ENABLE":e.CONSUL_PEERINGS_ENABLED=!!JSON.parse(String(l).toLowerCase()) +break +case"CONSUL_HCP_ENABLE":e.CONSUL_HCP_ENABLED=!!JSON.parse(String(l).toLowerCase()) +break +case"CONSUL_UI_CONFIG":e.CONSUL_UI_CONFIG=JSON.parse(l) +break +case"TokenSecretID":e.CONSUL_HTTP_TOKEN=l +break +default:e[n]=l}return e}),{}) +break +case"production":n=i().reduce((function(e,t){let[n,l]=t +if("TokenSecretID"===n)e.CONSUL_HTTP_TOKEN=l +return e}),{})}return void 0!==n[t]?n[t]:e[t]} +return function e(t){switch(t){case"CONSUL_UI_DISABLE_REALTIME":case"CONSUL_UI_DISABLE_ANCHOR_SELECTION":return!!JSON.parse(String(o(t)||0).toLowerCase())||m(t) +case"CONSUL_UI_REALTIME_RUNNER":return o(t)||m(t) +case"CONSUL_UI_CONFIG":case"CONSUL_DATACENTER_LOCAL":case"CONSUL_DATACENTER_PRIMARY":case"CONSUL_HCP_MANAGED_RUNTIME":case"CONSUL_API_PREFIX":case"CONSUL_HCP_URL":case"CONSUL_ACLS_ENABLED":case"CONSUL_NSPACES_ENABLED":case"CONSUL_PEERINGS_ENABLED":case"CONSUL_AGENTLESS_ENABLED":case"CONSUL_HCP_ENABLED":case"CONSUL_SSO_ENABLED":case"CONSUL_PARTITIONS_ENABLED":case"CONSUL_METRICS_PROVIDER":case"CONSUL_METRICS_PROXY_ENABLE":case"CONSUL_SERVICE_DASHBOARD_URL":case"CONSUL_BASE_UI_URL":case"CONSUL_HTTP_PROTOCOL":case"CONSUL_HTTP_MAX_CONNECTIONS":{const n=m(t) +return void 0!==n?n:f(t,e)}default:return m(t)}}}})),define("consul-ui/utils/get-form-name-property",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(e){if(-1!==e.indexOf("["))return e.match(/(.*)\[(.*)\]/).slice(1) +return["",e]}})),define("consul-ui/utils/helpers/call-if-type",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(e){return function(t){return function(n){let l=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{} +return typeof n[0]!==e?n[0]:t(n[0],l)}}}})),define("consul-ui/utils/http/consul",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.HEADERS_SYMBOL=e.HEADERS_DIGEST=e.HEADERS_TOKEN=e.HEADERS_INDEX=e.HEADERS_DEFAULT_ACL_POLICY=e.HEADERS_DATACENTER=e.HEADERS_NAMESPACE=e.HEADERS_PARTITION=void 0 +e.HEADERS_PARTITION="X-Consul-Partition" +e.HEADERS_NAMESPACE="X-Consul-Namespace" +e.HEADERS_DATACENTER="X-Consul-Datacenter" +e.HEADERS_DEFAULT_ACL_POLICY="X-Consul-Default-Acl-Policy" +e.HEADERS_INDEX="X-Consul-Index" +e.HEADERS_TOKEN="X-Consul-Token" +e.HEADERS_DIGEST="X-Consul-ContentHash" +e.HEADERS_SYMBOL="__consul_ui_http_headers__"})),define("consul-ui/utils/http/create-headers",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(){return function(e){return e.reduce((function(e,t){const[n,...l]=t.split(":") +return l.length>0&&(e[n.trim()]=l.join(":").trim()),e}),{})}}})),define("consul-ui/utils/http/create-query-params",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:encodeURIComponent +return function t(n,l){return Object.entries(n).reduce((function(n,r,i){let[o,a]=r +if(void 0===a)return n +let u=e(o) +return void 0!==l&&(u=`${l}[${u}]`),null===a?n.concat(u):"object"==typeof a?n.concat(t(a,u)):n.concat(`${u}=${e(a)}`)}),[]).join("&")}}})),define("consul-ui/utils/http/create-url",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(e,t){return function(n){for(var l=arguments.length,r=new Array(l>1?l-1:0),i=1;i0&&void 0!==arguments[0]?arguments[0]:0 +if("text/event-stream"===this.headers()["content-type"]){this.statusCode=e +const t=this.connection() +if(t.readyState)switch(t.readyState){case 0:case 1:t.abort()}}}}e.default=i})),define("consul-ui/utils/http/status",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.INTERNAL_SERVER_ERROR=e.FORBIDDEN=e.UNAUTHORIZED=e.OK=void 0 +e.OK=200 +e.UNAUTHORIZED=401 +e.FORBIDDEN=403 +e.INTERNAL_SERVER_ERROR=500})),define("consul-ui/utils/http/xhr",["exports"],(function(e){function t(e,t){var n=Object.keys(e) +if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e) +t&&(l=l.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,l)}return n}function n(e){for(var n=1;n=200&&this.status<400){const e=l.converters["text json"](this.response) +l.success(t,e,this.status,this.statusText)}else l.error(t,this.responseText,this.status,this.statusText,this.error) +l.complete(this.status)}} +let i=l.url +i.endsWith("?")&&(i=i.substr(0,i.length-1)),r.open(l.method,i,!0),void 0===l.headers&&(l.headers={}) +const o=n(n({},l.headers),{},{"X-Requested-With":"XMLHttpRequest"}) +return Object.entries(o).forEach((e=>{let[t,n]=e +return r.setRequestHeader(t,n)})),l.beforeSend(r),r.withCredentials=!0,r.send(l.body),r}}})),define("consul-ui/utils/intl/missing-message",["exports","@ember/debug"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(e,n){(0,t.runInDebug)((t=>console.debug(`Translation key not found: ${e}`))) +const l=e.split(".").pop().split("-").join(" ") +return`${l.substr(0,1).toUpperCase()}${l.substr(1)}`}})),define("consul-ui/utils/isFolder",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"" +return"/"===e.slice(-1)}})),define("consul-ui/utils/keyToArray",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"/" +return(e===t?"":e).split(t)}})),define("consul-ui/utils/left-trim",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"" +return 0===e.indexOf(t)?e.substr(t.length):e}})),define("consul-ui/utils/maybe-call",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(e,t){return function(n){return t.then((function(t){return t&&e(),n}))}}})),define("consul-ui/utils/merge-checks",["exports","@ember/object","mnemonist/multi-map"],(function(e,t,n){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +e.default=function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],l=arguments.length>1&&void 0!==arguments[1]&&arguments[1],r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:n.default +const i=new r,o=e.shift(),a=o.map((e=>(""===e.ServiceName&&i.set(e.Node,e.CheckID),e))).concat(e.reduce(((e,t)=>void 0===t?e:e.concat(t.reduce(((e,t)=>{if(""===t.ServiceName){if((i.get(t.Node)||[]).includes(t.CheckID))return e +i.set(t.Node,t.CheckID)}return e.push(t),e}),[]))),[])) +return l&&a.filter((e=>(0,t.get)(e,"Exposable"))).forEach((e=>{(0,t.set)(e,"Exposed",l)})),a}})),define("consul-ui/utils/minimizeModel",["exports","@ember/object"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(e){if(Array.isArray(e))return e.filter((function(e){return!(0,t.get)(e,"isNew")})).map((function(e){return{ID:(0,t.get)(e,"ID"),Name:(0,t.get)(e,"Name")}}))}})),define("consul-ui/utils/non-empty-set",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(e){return function(t){return null==t||""===t?{}:{[e]:t}}}})),define("consul-ui/utils/path/resolve",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +e.default=(e,t)=>0===t.indexOf("/")?t:t.split("/").reduce(((e,t,n,l)=>("."!==t&&(".."===t?e.pop():""===t&&n!==l.length-1||e.push(t)),e)),e.split("/")).join("/")})),define("consul-ui/utils/promisedTimeout",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:Promise,t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:setTimeout +return function(n){let l=arguments.length>1&&void 0!==arguments[1]?arguments[1]:function(){} +return new e(((e,r)=>{l(t((function(){e(n)}),n))}))}}})) +define("consul-ui/utils/right-trim",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"" +const n=e.length-t.length +if(n>=0)return e.lastIndexOf(t)===n?e.substr(0,n):e +return e}})),define("consul-ui/utils/routing/redirect-to",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(e,t){return function(t,n){const l=this.routeName.split(".").slice(0,-1).join(".") +this.replaceWith(`${l}.${e}`,t)}}})),define("consul-ui/utils/routing/transitionable",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(e){let l=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},r=arguments.length>2?arguments[2]:void 0 +null===e&&(e=r.lookup("route:application")) +let i,o=n(e,l),a=e +for(;i=a.parent;)o=o.concat(n(i,l)),a=i +return o.reverse(),t(e.name||"application",o,l)} +const t=function(e,t,n){return[e,...t]},n=function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{} +return(e.paramNames||[]).map((function(n){return void 0!==t[n]?t[n]:e.params[n]})).reverse()}})),define("consul-ui/utils/routing/walk",["exports","@ember/debug"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(e){return function(){n.apply(this,[e])}},e.dump=e.walk=void 0 +const n=function(e){Object.keys(e).forEach(((t,l)=>{if("_options"===t)return +if(null===e[t])return +const r=e[t]._options +let i +Object.keys(e[t]).length>1&&(i=function(){n.apply(this,[e[t]])}),this.route(t,r,i)})),void 0===e.index&&(e.index={_options:{path:""}})} +e.walk=n +let l=e=>{} +e.dump=l,(0,t.runInDebug)((()=>{const t=function(e){return Array(e).fill(" ",0,e).join("")} +e.dump=l=function(e){let l=2 +const r={out:"",route:function(e,n,r){this.out+=`${t(l)}this.route('${e}', ${JSON.stringify(n)}`,r?(l++,this.out+=", function() {\n",r.apply(this,[]),l--,this.out+=`${t(l)}});\n`):this.out+=");",this.out+="\n"}} +return n.apply(r,[e]),`Router.map(\n function() {\n${r.out}\n }\n);`}}))})),define("consul-ui/utils/routing/wildcard",["exports","@ember/object"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(e){return function(n){let l=!1 +try{l=-1!==(0,t.get)(e,n)._options.path.indexOf("*")}catch(r){}return l}}})),define("consul-ui/utils/search/exact",["exports","consul-ui/utils/search/predicate"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +class n extends t.default{predicate(e){return e=e.toLowerCase(),function(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"" +return-1!==t.toString().toLowerCase().indexOf(e)}}}e.default=n})),define("consul-ui/utils/search/fuzzy",["exports","fuse.js"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +e.default=class{constructor(e,n){this.fuse=new t.default(e,{includeMatches:!0,shouldSort:!1,threshold:.4,keys:Object.keys(n.finders)||[],getFn:(e,t)=>(n.finders[t[0]](e)||[]).toString()})}search(e){return this.fuse.search(e).map((e=>e.item))}}})),define("consul-ui/utils/search/predicate",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +e.default=class{constructor(e,t){this.items=e,this.options=t}search(e){const t=this.predicate(e) +return this.items.filter((e=>Object.entries(this.options.finders).some((n=>{let[l,r]=n +const i=r(e) +return Array.isArray(i)?i.some(t):t(i)}))))}}})),define("consul-ui/utils/search/regexp",["exports","consul-ui/utils/search/predicate"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +class n extends t.default{predicate(e){let t +try{t=new RegExp(e,"i")}catch(n){return()=>!1}return e=>t.test(e)}}e.default=n})),define("consul-ui/utils/storage/local-storage",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:window.localStorage,n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:JSON.stringify,l=arguments.length>3&&void 0!==arguments[3]?arguments[3]:JSON.parse,r=arguments.length>4&&void 0!==arguments[4]?arguments[4]:function(e){window.dispatchEvent(new StorageEvent("storage",{key:e}))} +const i=`${e}:` +return{getValue:function(e){let n=t.getItem(`${i}${e}`) +"string"!=typeof n&&(n='""') +try{n=l(n)}catch(r){n=""}return n},setValue:function(e,l){if(null===l)return this.removeValue(e) +try{l=n(l)}catch(a){l='""'}const o=t.setItem(`${i}${e}`,l) +return r(`${i}${e}`),o},removeValue:function(e){const n=t.removeItem(`${i}${e}`) +return r(`${i}${e}`),n},all:function(){return Object.keys(t).reduce(((e,t,n,l)=>{if(0===t.indexOf(`${i}`)){const n=t.substr(i.length) +e[n]=this.getValue(n)}return e}),{})}}}})),define("consul-ui/utils/templatize",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[] +return e.map((e=>`template-${e}`))}})),define("consul-ui/utils/ticker/index",["exports","consul-ui/utils/dom/event-target/rsvp","@ember/object"],(function(e,t,n){Object.defineProperty(e,"__esModule",{value:!0}),e.Tween=e.Ticker=void 0 +const l=class extends t.default{constructor(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:1e3/60 +super(),this.setRate(e)}tick(){this.dispatchEvent({type:"tick",target:this})}setRate(e){clearInterval(this._interval),this._interval=setInterval((()=>this.tick()),e)}destroy(){clearInterval(this._interval)}},r=class extends t.default{static destroy(){void 0!==r.defaultTickerGroup&&(r.defaultTickerGroup.destroy(),delete r.defaultTickerGroup)}constructor(e){super(),this.setTickable(e)}tick(){this._tickable.tick()}setTickable(e){this._tickable=e,void 0===this._tickable.getTicker&&(this._tickable.getTicker=()=>this),this.tick=this._tickable.tick.bind(this._tickable)}getTickable(){return this._tickable}isAlive(){return this._isAlive}start(){this._isAlive=!0,this.getTickerGroup().addEventListener("tick",this.tick),this.dispatchEvent({type:"start",target:this})}stop(){this._isAlive=!1,this.getTickerGroup().removeEventListener("tick",this.tick),this.dispatchEvent({type:"stop",target:this})}activeCount(){return this.getTickerGroup().activeCount()}setTickerGroup(e){this._group=e}getTickerGroup(){return void 0===this._group&&(void 0===r.defaultTickerGroup&&(r.defaultTickerGroup=new o),this._group=r.defaultTickerGroup),this._group}} +e.Ticker=r +const i={easeOut:function(e,t,n,l){return e/=l,n*(--e*e*e+1)+t}},o=l,a=class extends class{constructor(){this._currentframe=1,this.setIncrement(1)}isAtStart(){return this._currentframe<=1}isAtEnd(){return this._currentframe>=this._totalframes}addEventListener(){return this.getTicker().addEventListener(...arguments)}removeEventListener(){return this.getTicker().removeEventListener(...arguments)}stop(){return this.gotoAndStop(this._currentframe)}play(){return this.gotoAndPlay(this._currentframe)}start(){return this.gotoAndPlay(this._currentframe)}gotoAndStop(e){this._currentframe=e +const t=this.getTicker() +return t.isAlive()&&t.stop(),this}gotoAndPlay(e){this._currentframe=e +const t=this.getTicker() +return t.isAlive()||t.start(),this}getTicker(){return void 0===this._ticker&&(this._ticker=new r(this)),this._ticker}setFrames(e){return this._totalframes=e,this}setIncrement(e){return this._increment=e,this}}{static destroy(){r.destroy()}static to(e,t,n,l){return Object.keys(t).forEach((function(n){t[n]-=e[n]})),new a(e,t,n,l).play()}constructor(e,t){let n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:12,l=arguments.length>3&&void 0!==arguments[3]?arguments[3]:i.easeOut +super(),this.setMethod(l),this.setProps(t),this.setTarget(e),this.setFrames(n),this.tick=this.forwards}_process(){Object.keys(this._props).forEach((e=>{const t=this._method(this._currentframe,this._initialstate[e],this._props[e],this._totalframes);(0,n.set)(this._target,e,t)}))}forwards(){this._currentframe<=this._totalframes?(this._process(),this._currentframe+=this._increment):(this._currentframe=this._totalframes,this.getTicker().stop())}backwards(){this._currentframe-=this._increment,this._currentframe>=0?this._process():(this.run=this.forwards,this._currentframe=1,this.getTicker().stop())}gotoAndPlay(){return void 0===this._initialstate&&(this._initialstate={},Object.keys(this._props).forEach((e=>{this._initialstate[e]=this._target[e]}))),super.gotoAndPlay(...arguments)}setTarget(e){this._target=e}getTarget(e){return this._target}setProps(e){return this._props=e,this}setMethod(e){this._method=e}} +e.Tween=a})),define("consul-ui/utils/titleize",["exports","ember-cli-string-helpers/utils/titleize"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/utils/tomography",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(e){return function(t,n){var l=999999999,r=-999999999,i=[] +n.forEach((function(o){if(t==o.Node){var a=o.Segment +n.forEach((function(t){if(o.Node!=t.Node&&t.Segment==a){var n=e(o,t) +i.push({node:t.Node,distance:n,segment:a}),nr&&(r=n)}})),i.sort((function(e,t){return e.distance-t.distance}))}})) +var o,a=i.length,u=Math.floor(a/2) +return a>0?o=a%2?i[u].distance:(i[u-1].distance+i[u].distance)/2:(o=0,l=0,r=0),{distances:i,min:Math.trunc(100*l)/100,median:Math.trunc(100*o)/100,max:Math.trunc(100*r)/100}}}})),define("consul-ui/utils/ucfirst",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(e){return`${e.substr(0,1).toUpperCase()}${e.substr(1)}`}})),define("consul-ui/utils/update-array-object",["exports","@ember/object","@ember/object/proxy"],(function(e,t,n){Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(e,l,r,i){i=void 0===i?(0,t.get)(l,r):i +const o=e.findIndex((function(e){return(0,t.get)(e,r)===i}));-1!==o&&(l instanceof n.default&&(0,t.set)(l,"content",e.objectAt(o)),e.replace(o,1,[l])) +return l}})),define("consul-ui/validations/intention-permission-http-header",["exports","ember-changeset-validations/validators","consul-ui/validations/sometimes"],(function(e,t,n){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +e.default=e=>({Name:[(0,t.validatePresence)(!0)],Value:[(0,n.default)((0,t.validatePresence)(!0),(function(){return"Present"!==this.get("HeaderType")}))]})})),define("consul-ui/validations/intention-permission",["exports","ember-changeset-validations/validators","consul-ui/validations/sometimes"],(function(e,t,n){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +e.default=e=>({"*":[(0,n.default)((0,t.validatePresence)(!0),(function(){const e=this.get("HTTP.Methods")||[],t=this.get("HTTP.Header")||[],n=this.get("HTTP.PathType")||"NoPath",l=this.get("HTTP.Path")||"" +return![0!==e.length,0!==t.length,"NoPath"!==n&&""!==l].includes(!0)}))],Action:[(0,t.validateInclusion)({in:e["intention-permission"].Action.allowedValues})],HTTP:{Path:[(0,n.default)((0,t.validateFormat)({regex:/^\//}),(function(){const e=this.get("HTTP.PathType") +return void 0!==e&&"NoPath"!==e}))]}})})),define("consul-ui/validations/intention",["exports","ember-changeset-validations/validators","consul-ui/validations/sometimes"],(function(e,t,n){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +var l={"*":[(0,n.default)((0,t.validatePresence)(!0),(function(){const e=this.get("Action")||"",t=this.get("Permissions")||[] +return""===e&&0===t.length}))],SourceName:[(0,t.validatePresence)(!0),(0,t.validateLength)({min:1})],DestinationName:[(0,t.validatePresence)(!0),(0,t.validateLength)({min:1})],Permissions:[(0,n.default)((0,t.validateLength)({min:1}),(function(e,t){return!this.get("Action")}))]} +e.default=l})),define("consul-ui/validations/kv",["exports","ember-changeset-validations/validators"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +var n={Key:[(0,t.validatePresence)(!0),(0,t.validateLength)({min:1})]} +e.default=n})),define("consul-ui/validations/policy",["exports","ember-changeset-validations/validators"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +var n={Name:(0,t.validateFormat)({regex:/^[A-Za-z0-9\-_]{1,128}$/})} +e.default=n})),define("consul-ui/validations/role",["exports","ember-changeset-validations/validators"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +var n={Name:(0,t.validateFormat)({regex:/^[A-Za-z0-9\-_]{1,256}$/})} +e.default=n})),define("consul-ui/validations/sometimes",["exports","@ember/object"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(e,n){return function(e){return function(l,r,i,o,a){let u={get(e){if(e.includes(".")){let n=(0,t.get)(o,e) +if(void 0!==n)return n +let l=e.split("."),r=l.pop(),i=l.join("."),u=(0,t.get)(o,i) +return u&&u.hasOwnProperty&&u.hasOwnProperty(r)?n:(0,t.get)(a,e)}return o.hasOwnProperty(e)?(0,t.get)(o,e):(0,t.get)(a,e)}} +return!n.call(u,o,a)||e(l,r,i,o,a)}}(e)}})),define("consul-ui/validations/token",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 +e.default={}})),define("consul-ui/config/environment",[],(function(){try{var e="consul-ui/config/environment",t=document.querySelector('meta[name="'+e+'"]').getAttribute("content"),n={default:JSON.parse(decodeURIComponent(t))} +return Object.defineProperty(n,"__esModule",{value:!0}),n}catch(l){throw new Error('Could not read config from meta tag with name "'+e+'".')}})),runningTests||require("consul-ui/app").default.create({name:"consul-ui",version:"2.2.0+63204b51"}) diff --git a/agent/uiserver/dist/assets/consul-ui-e58b85f0a8e1fb15ded242e5b25b171c.js b/agent/uiserver/dist/assets/consul-ui-e58b85f0a8e1fb15ded242e5b25b171c.js deleted file mode 100644 index ad0150bba14..00000000000 --- a/agent/uiserver/dist/assets/consul-ui-e58b85f0a8e1fb15ded242e5b25b171c.js +++ /dev/null @@ -1,3507 +0,0 @@ -"use strict" -define("consul-ui/abilities/acl",["exports","consul-ui/abilities/base"],(function(e,t){var n,r,a -function l(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -let s=(n=Ember.inject.service("env"),r=class extends t.default{constructor(...e){var t,n,r,s -super(...e),t=this,n="env",s=this,(r=a)&&Object.defineProperty(t,n,{enumerable:r.enumerable,configurable:r.configurable,writable:r.writable,value:r.initializer?r.initializer.call(s):void 0}),l(this,"resource","acl"),l(this,"segmented",!1)}get canAccess(){return!this.env.var("CONSUL_ACLS_ENABLED")||this.canRead}get canRead(){return this.env.var("CONSUL_ACLS_ENABLED")&&super.canRead}get canDuplicate(){return this.env.var("CONSUL_ACLS_ENABLED")&&super.canWrite}get canDelete(){return this.env.var("CONSUL_ACLS_ENABLED")&&"anonymous"!==this.item.ID&&super.canWrite}get canUse(){return this.env.var("CONSUL_ACLS_ENABLED")}},i=r.prototype,o="env",u=[n],c={configurable:!0,enumerable:!0,writable:!0,initializer:null},m={},Object.keys(c).forEach((function(e){m[e]=c[e]})),m.enumerable=!!m.enumerable,m.configurable=!!m.configurable,("value"in m||m.initializer)&&(m.writable=!0),m=u.slice().reverse().reduce((function(e,t){return t(i,o,e)||e}),m),d&&void 0!==m.initializer&&(m.value=m.initializer?m.initializer.call(d):void 0,m.initializer=void 0),void 0===m.initializer&&(Object.defineProperty(i,o,m),m=null),a=m,r) -var i,o,u,c,d,m -e.default=s})),define("consul-ui/abilities/auth-method",["exports","consul-ui/abilities/base"],(function(e,t){var n,r,a -function l(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -let s=(n=Ember.inject.service("env"),r=class extends t.default{constructor(...e){var t,n,r,s -super(...e),t=this,n="env",s=this,(r=a)&&Object.defineProperty(t,n,{enumerable:r.enumerable,configurable:r.configurable,writable:r.writable,value:r.initializer?r.initializer.call(s):void 0}),l(this,"resource","acl"),l(this,"segmented",!1)}get canRead(){return this.env.var("CONSUL_ACLS_ENABLED")&&super.canRead}get canCreate(){return this.env.var("CONSUL_ACLS_ENABLED")&&super.canCreate}get canDelete(){return this.env.var("CONSUL_ACLS_ENABLED")&&super.canDelete}get canUse(){return this.env.var("CONSUL_SSO_ENABLED")}},i=r.prototype,o="env",u=[n],c={configurable:!0,enumerable:!0,writable:!0,initializer:null},m={},Object.keys(c).forEach((function(e){m[e]=c[e]})),m.enumerable=!!m.enumerable,m.configurable=!!m.configurable,("value"in m||m.initializer)&&(m.writable=!0),m=u.slice().reverse().reduce((function(e,t){return t(i,o,e)||e}),m),d&&void 0!==m.initializer&&(m.value=m.initializer?m.initializer.call(d):void 0,m.initializer=void 0),void 0===m.initializer&&(Object.defineProperty(i,o,m),m=null),a=m,r) -var i,o,u,c,d,m -e.default=s})),define("consul-ui/abilities/base",["exports","ember-can"],(function(e,t){var n,r,a -function l(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}Object.defineProperty(e,"__esModule",{value:!0}),e.default=e.ACCESS_LIST=e.ACCESS_WRITE=e.ACCESS_READ=void 0 -e.ACCESS_READ="read" -e.ACCESS_WRITE="write" -e.ACCESS_LIST="list" -let s=(n=Ember.inject.service("repository/permission"),r=class extends t.Ability{constructor(...e){var t,n,r,s -super(...e),t=this,n="permissions",s=this,(r=a)&&Object.defineProperty(t,n,{enumerable:r.enumerable,configurable:r.configurable,writable:r.writable,value:r.initializer?r.initializer.call(s):void 0}),l(this,"resource",""),l(this,"segmented",!0)}generate(e){return this.permissions.generate(this.resource,e)}generateForSegment(e){return this.segmented?[this.permissions.generate(this.resource,"read",e),this.permissions.generate(this.resource,"write",e)]:[]}get isLinkable(){return!0}get isNew(){return this.item.isNew}get isPristine(){return this.item.isPristine}get canRead(){if(void 0!==this.item){const e=(Ember.get(this,"item.Resources")||[]).find(e=>"read"===e.Access) -if(e)return e.Allow}return this.permissions.has(this.generate("read"))}get canList(){if(void 0!==this.item){const e=(Ember.get(this,"item.Resources")||[]).find(e=>"list"===e.Access) -if(e)return e.Allow}return this.permissions.has(this.generate("list"))}get canWrite(){if(void 0!==this.item){const e=(Ember.get(this,"item.Resources")||[]).find(e=>"write"===e.Access) -if(e)return e.Allow}return this.permissions.has(this.generate("write"))}get canCreate(){return this.canWrite}get canDelete(){return this.canWrite}get canUpdate(){return this.canWrite}},i=r.prototype,o="permissions",u=[n],c={configurable:!0,enumerable:!0,writable:!0,initializer:null},m={},Object.keys(c).forEach((function(e){m[e]=c[e]})),m.enumerable=!!m.enumerable,m.configurable=!!m.configurable,("value"in m||m.initializer)&&(m.writable=!0),m=u.slice().reverse().reduce((function(e,t){return t(i,o,e)||e}),m),d&&void 0!==m.initializer&&(m.value=m.initializer?m.initializer.call(d):void 0,m.initializer=void 0),void 0===m.initializer&&(Object.defineProperty(i,o,m),m=null),a=m,r) -var i,o,u,c,d,m -e.default=s})),define("consul-ui/abilities/hcp",["exports","consul-ui/abilities/base"],(function(e,t){var n,r,a -Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -let l=(n=Ember.inject.service("env"),r=class extends t.default{constructor(...e){var t,n,r,l -super(...e),t=this,n="env",l=this,(r=a)&&Object.defineProperty(t,n,{enumerable:r.enumerable,configurable:r.configurable,writable:r.writable,value:r.initializer?r.initializer.call(l):void 0})}get is(){return!1}},s=r.prototype,i="env",o=[n],u={configurable:!0,enumerable:!0,writable:!0,initializer:null},d={},Object.keys(u).forEach((function(e){d[e]=u[e]})),d.enumerable=!!d.enumerable,d.configurable=!!d.configurable,("value"in d||d.initializer)&&(d.writable=!0),d=o.slice().reverse().reduce((function(e,t){return t(s,i,e)||e}),d),c&&void 0!==d.initializer&&(d.value=d.initializer?d.initializer.call(c):void 0,d.initializer=void 0),void 0===d.initializer&&(Object.defineProperty(s,i,d),d=null),a=d,r) -var s,i,o,u,c,d -e.default=l})),define("consul-ui/abilities/intention",["exports","consul-ui/abilities/base"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -class n extends t.default{constructor(...e){var t,n,r -super(...e),r="intention",(n="resource")in(t=this)?Object.defineProperty(t,n,{value:r,enumerable:!0,configurable:!0,writable:!0}):t[n]=r}get canWrite(){return super.canWrite&&(void 0===this.item||!this.canViewCRD)}get canViewCRD(){return void 0!==this.item&&this.item.IsManagedByCRD}}e.default=n})),define("consul-ui/abilities/kv",["exports","consul-ui/abilities/base"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -class n extends t.default{constructor(...e){var t,n,r -super(...e),r="key",(n="resource")in(t=this)?Object.defineProperty(t,n,{value:r,enumerable:!0,configurable:!0,writable:!0}):t[n]=r}generateForSegment(e){let n=super.generateForSegment(e) -return e.endsWith("/")&&(n=n.concat(this.permissions.generate(this.resource,t.ACCESS_LIST,e))),n}get canRead(){return!0}get canList(){return!0}get canWrite(){return!0}}e.default=n})),define("consul-ui/abilities/license",["exports","consul-ui/abilities/base"],(function(e,t){var n,r,a -function l(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -let s=(n=Ember.inject.service("env"),r=class extends t.default{constructor(...e){var t,n,r,s -super(...e),l(this,"resource","operator"),l(this,"segmented",!1),t=this,n="env",s=this,(r=a)&&Object.defineProperty(t,n,{enumerable:r.enumerable,configurable:r.configurable,writable:r.writable,value:r.initializer?r.initializer.call(s):void 0})}get canRead(){return this.env.var("CONSUL_NSPACES_ENABLED")&&super.canRead}},i=r.prototype,o="env",u=[n],c={configurable:!0,enumerable:!0,writable:!0,initializer:null},m={},Object.keys(c).forEach((function(e){m[e]=c[e]})),m.enumerable=!!m.enumerable,m.configurable=!!m.configurable,("value"in m||m.initializer)&&(m.writable=!0),m=u.slice().reverse().reduce((function(e,t){return t(i,o,e)||e}),m),d&&void 0!==m.initializer&&(m.value=m.initializer?m.initializer.call(d):void 0,m.initializer=void 0),void 0===m.initializer&&(Object.defineProperty(i,o,m),m=null),a=m,r) -var i,o,u,c,d,m -e.default=s})),define("consul-ui/abilities/node",["exports","consul-ui/abilities/base"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -class n extends t.default{constructor(...e){var t,n,r -super(...e),r="node",(n="resource")in(t=this)?Object.defineProperty(t,n,{value:r,enumerable:!0,configurable:!0,writable:!0}):t[n]=r}}e.default=n})),define("consul-ui/abilities/nspace",["exports","consul-ui/abilities/base"],(function(e,t){var n,r,a -function l(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -let s=(n=Ember.inject.service("env"),r=class extends t.default{constructor(...e){var t,n,r,s -super(...e),t=this,n="env",s=this,(r=a)&&Object.defineProperty(t,n,{enumerable:r.enumerable,configurable:r.configurable,writable:r.writable,value:r.initializer?r.initializer.call(s):void 0}),l(this,"resource","operator"),l(this,"segmented",!1)}get isLinkable(){return!this.item.DeletedAt}get canManage(){return this.canCreate}get canDelete(){return"default"!==this.item.Name&&super.canDelete}get canChoose(){return this.canUse}get canUse(){return this.env.var("CONSUL_NSPACES_ENABLED")}},i=r.prototype,o="env",u=[n],c={configurable:!0,enumerable:!0,writable:!0,initializer:null},m={},Object.keys(c).forEach((function(e){m[e]=c[e]})),m.enumerable=!!m.enumerable,m.configurable=!!m.configurable,("value"in m||m.initializer)&&(m.writable=!0),m=u.slice().reverse().reduce((function(e,t){return t(i,o,e)||e}),m),d&&void 0!==m.initializer&&(m.value=m.initializer?m.initializer.call(d):void 0,m.initializer=void 0),void 0===m.initializer&&(Object.defineProperty(i,o,m),m=null),a=m,r) -var i,o,u,c,d,m -e.default=s})),define("consul-ui/abilities/overview",["exports","consul-ui/abilities/base"],(function(e,t){function n(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -class r extends t.default{constructor(...e){super(...e),n(this,"resource","operator"),n(this,"segmented",!1)}get canAccess(){return this.canRead}}e.default=r})),define("consul-ui/abilities/partition",["exports","consul-ui/abilities/base"],(function(e,t){var n,r,a,l,s -function i(e,t,n,r){n&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(r):void 0})}function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function u(e,t,n,r,a){var l={} -return Object.keys(r).forEach((function(e){l[e]=r[e]})),l.enumerable=!!l.enumerable,l.configurable=!!l.configurable,("value"in l||l.initializer)&&(l.writable=!0),l=n.slice().reverse().reduce((function(n,r){return r(e,t,n)||n}),l),a&&void 0!==l.initializer&&(l.value=l.initializer?l.initializer.call(a):void 0,l.initializer=void 0),void 0===l.initializer&&(Object.defineProperty(e,t,l),l=null),l}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -let c=(n=Ember.inject.service("env"),r=Ember.inject.service("repository/dc"),a=class extends t.default{constructor(...e){super(...e),i(this,"env",l,this),i(this,"dcs",s,this),o(this,"resource","operator"),o(this,"segmented",!1)}get isLinkable(){return!this.item.DeletedAt}get canManage(){return this.canWrite}get canCreate(){return!(this.dcs.peekAll().length>1)&&super.canCreate}get canDelete(){return"default"!==this.item.Name&&super.canDelete}get canChoose(){return void 0!==this.dc&&(this.canUse&&this.dc.Primary)}get canUse(){return this.env.var("CONSUL_PARTITIONS_ENABLED")}},l=u(a.prototype,"env",[n],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),s=u(a.prototype,"dcs",[r],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),a) -e.default=c})),define("consul-ui/abilities/permission",["exports","consul-ui/abilities/base"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -class n extends t.default{get canRead(){return this.permissions.permissions.length>0}}e.default=n})),define("consul-ui/abilities/policy",["exports","consul-ui/abilities/base","consul-ui/helpers/policy/typeof"],(function(e,t,n){var r,a,l -function s(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -let i=(r=Ember.inject.service("env"),a=class extends t.default{constructor(...e){var t,n,r,a -super(...e),t=this,n="env",a=this,(r=l)&&Object.defineProperty(t,n,{enumerable:r.enumerable,configurable:r.configurable,writable:r.writable,value:r.initializer?r.initializer.call(a):void 0}),s(this,"resource","acl"),s(this,"segmented",!1)}get canRead(){return this.env.var("CONSUL_ACLS_ENABLED")&&super.canRead}get canWrite(){return this.env.var("CONSUL_ACLS_ENABLED")&&(void 0===this.item||"policy-management"!==(0,n.typeOf)([this.item]))&&super.canWrite}get canCreate(){return this.env.var("CONSUL_ACLS_ENABLED")&&super.canCreate}get canDelete(){return this.env.var("CONSUL_ACLS_ENABLED")&&(void 0===this.item||"policy-management"!==(0,n.typeOf)([this.item]))&&super.canDelete}},o=a.prototype,u="env",c=[r],d={configurable:!0,enumerable:!0,writable:!0,initializer:null},p={},Object.keys(d).forEach((function(e){p[e]=d[e]})),p.enumerable=!!p.enumerable,p.configurable=!!p.configurable,("value"in p||p.initializer)&&(p.writable=!0),p=c.slice().reverse().reduce((function(e,t){return t(o,u,e)||e}),p),m&&void 0!==p.initializer&&(p.value=p.initializer?p.initializer.call(m):void 0,p.initializer=void 0),void 0===p.initializer&&(Object.defineProperty(o,u,p),p=null),l=p,a) -var o,u,c,d,m,p -e.default=i})),define("consul-ui/abilities/role",["exports","consul-ui/abilities/base"],(function(e,t){var n,r,a -function l(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -let s=(n=Ember.inject.service("env"),r=class extends t.default{constructor(...e){var t,n,r,s -super(...e),t=this,n="env",s=this,(r=a)&&Object.defineProperty(t,n,{enumerable:r.enumerable,configurable:r.configurable,writable:r.writable,value:r.initializer?r.initializer.call(s):void 0}),l(this,"resource","acl"),l(this,"segmented",!1)}get canRead(){return this.env.var("CONSUL_ACLS_ENABLED")&&super.canRead}get canCreate(){return this.env.var("CONSUL_ACLS_ENABLED")&&super.canCreate}get canDelete(){return this.env.var("CONSUL_ACLS_ENABLED")&&super.canDelete}},i=r.prototype,o="env",u=[n],c={configurable:!0,enumerable:!0,writable:!0,initializer:null},m={},Object.keys(c).forEach((function(e){m[e]=c[e]})),m.enumerable=!!m.enumerable,m.configurable=!!m.configurable,("value"in m||m.initializer)&&(m.writable=!0),m=u.slice().reverse().reduce((function(e,t){return t(i,o,e)||e}),m),d&&void 0!==m.initializer&&(m.value=m.initializer?m.initializer.call(d):void 0,m.initializer=void 0),void 0===m.initializer&&(Object.defineProperty(i,o,m),m=null),a=m,r) -var i,o,u,c,d,m -e.default=s})),define("consul-ui/abilities/service-instance",["exports","consul-ui/abilities/base"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -class n extends t.default{constructor(...e){var t,n,r -super(...e),r="service",(n="resource")in(t=this)?Object.defineProperty(t,n,{value:r,enumerable:!0,configurable:!0,writable:!0}):t[n]=r}generateForSegment(e){return super.generateForSegment(...arguments).concat([this.permissions.generate("intention",t.ACCESS_READ,e),this.permissions.generate("intention",t.ACCESS_WRITE,e)])}}e.default=n})),define("consul-ui/abilities/session",["exports","consul-ui/abilities/base"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -class n extends t.default{constructor(...e){var t,n,r -super(...e),r="session",(n="resource")in(t=this)?Object.defineProperty(t,n,{value:r,enumerable:!0,configurable:!0,writable:!0}):t[n]=r}}e.default=n})),define("consul-ui/abilities/token",["exports","consul-ui/abilities/base","consul-ui/helpers/token/is-legacy","consul-ui/helpers/token/is-anonymous"],(function(e,t,n,r){var a,l,s -function i(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -let o=(a=Ember.inject.service("env"),l=class extends t.default{constructor(...e){var t,n,r,a -super(...e),t=this,n="env",a=this,(r=s)&&Object.defineProperty(t,n,{enumerable:r.enumerable,configurable:r.configurable,writable:r.writable,value:r.initializer?r.initializer.call(a):void 0}),i(this,"resource","acl"),i(this,"segmented",!1)}get canRead(){return this.env.var("CONSUL_ACLS_ENABLED")&&super.canRead}get canCreate(){return this.env.var("CONSUL_ACLS_ENABLED")&&super.canCreate}get canDelete(){return this.env.var("CONSUL_ACLS_ENABLED")&&!(0,r.isAnonymous)([this.item])&&this.item.AccessorID!==this.token.AccessorID&&super.canDelete}get canDuplicate(){return this.env.var("CONSUL_ACLS_ENABLED")&&!(0,n.isLegacy)([this.item])&&super.canWrite}},u=l.prototype,c="env",d=[a],m={configurable:!0,enumerable:!0,writable:!0,initializer:null},f={},Object.keys(m).forEach((function(e){f[e]=m[e]})),f.enumerable=!!f.enumerable,f.configurable=!!f.configurable,("value"in f||f.initializer)&&(f.writable=!0),f=d.slice().reverse().reduce((function(e,t){return t(u,c,e)||e}),f),p&&void 0!==f.initializer&&(f.value=f.initializer?f.initializer.call(p):void 0,f.initializer=void 0),void 0===f.initializer&&(Object.defineProperty(u,c,f),f=null),s=f,l) -var u,c,d,m,p,f -e.default=o})),define("consul-ui/abilities/upstream",["exports","consul-ui/abilities/base"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -class n extends t.default{constructor(...e){var t,n,r -super(...e),r="upstream",(n="resource")in(t=this)?Object.defineProperty(t,n,{value:r,enumerable:!0,configurable:!0,writable:!0}):t[n]=r}get isLinkable(){return this.item.InstanceCount>0}}e.default=n})),define("consul-ui/abilities/zervice",["exports","consul-ui/abilities/base"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -class n extends t.default{constructor(...e){var t,n,r -super(...e),r="service",(n="resource")in(t=this)?Object.defineProperty(t,n,{value:r,enumerable:!0,configurable:!0,writable:!0}):t[n]=r}get isLinkable(){return this.item.InstanceCount>0}get canReadIntention(){if(void 0===this.item||void 0===this.item.Resources)return!1 -return void 0!==this.item.Resources.find(e=>"intention"===e.Resource&&"read"===e.Access&&!0===e.Allow)}get canWriteIntention(){if(void 0===this.item||void 0===this.item.Resources)return!1 -return void 0!==this.item.Resources.find(e=>"intention"===e.Resource&&"write"===e.Access&&!0===e.Allow)}get canCreateIntention(){return this.canWriteIntention}get canUpdateIntention(){return this.canWriteIntention}}e.default=n})),define("consul-ui/abilities/zone",["exports","consul-ui/abilities/base"],(function(e,t){var n,r,a -Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -let l=(n=Ember.inject.service("env"),r=class extends t.default{constructor(...e){var t,n,r,l -super(...e),t=this,n="env",l=this,(r=a)&&Object.defineProperty(t,n,{enumerable:r.enumerable,configurable:r.configurable,writable:r.writable,value:r.initializer?r.initializer.call(l):void 0})}get canRead(){return this.env.var("CONSUL_NSPACES_ENABLED")}},s=r.prototype,i="env",o=[n],u={configurable:!0,enumerable:!0,writable:!0,initializer:null},d={},Object.keys(u).forEach((function(e){d[e]=u[e]})),d.enumerable=!!d.enumerable,d.configurable=!!d.configurable,("value"in d||d.initializer)&&(d.writable=!0),d=o.slice().reverse().reduce((function(e,t){return t(s,i,e)||e}),d),c&&void 0!==d.initializer&&(d.value=d.initializer?d.initializer.call(c):void 0,d.initializer=void 0),void 0===d.initializer&&(Object.defineProperty(s,i,d),d=null),a=d,r) -var s,i,o,u,c,d -e.default=l})),define("consul-ui/adapters/-json-api",["exports","@ember-data/adapter/json-api"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/adapters/application",["exports","consul-ui/adapters/http"],(function(e,t){var n,r,a,l,s -function i(e,t,n,r){n&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(r):void 0})}function o(e,t,n,r,a){var l={} -return Object.keys(r).forEach((function(e){l[e]=r[e]})),l.enumerable=!!l.enumerable,l.configurable=!!l.configurable,("value"in l||l.initializer)&&(l.writable=!0),l=n.slice().reverse().reduce((function(n,r){return r(e,t,n)||n}),l),a&&void 0!==l.initializer&&(l.value=l.initializer?l.initializer.call(a):void 0,l.initializer=void 0),void 0===l.initializer&&(Object.defineProperty(e,t,l),l=null),l}Object.defineProperty(e,"__esModule",{value:!0}),e.default=e.NSPACE_QUERY_PARAM=e.DATACENTER_QUERY_PARAM=void 0 -e.DATACENTER_QUERY_PARAM="dc" -e.NSPACE_QUERY_PARAM="ns" -let u=(n=Ember.inject.service("client/http"),r=Ember.inject.service("env"),a=class extends t.default{constructor(...e){super(...e),i(this,"client",l,this),i(this,"env",s,this)}formatNspace(e){if(this.env.var("CONSUL_NSPACES_ENABLED"))return""!==e?{ns:e}:void 0}formatDatacenter(e){return{dc:e}}},l=o(a.prototype,"client",[n],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),s=o(a.prototype,"env",[r],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),a) -e.default=u})),define("consul-ui/adapters/auth-method",["exports","consul-ui/adapters/application"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -class n extends t.default{requestForQuery(e,{dc:t,ns:n,partition:r,index:a,id:l}){return e` - GET /v1/acl/auth-methods?${{dc:t}} - - ${{ns:n,partition:r,index:a}} - `}requestForQueryRecord(e,{dc:t,ns:n,partition:r,index:a,id:l}){if(void 0===l)throw new Error("You must specify an id") -return e` - GET /v1/acl/auth-method/${l}?${{dc:t}} - - ${{ns:n,partition:r,index:a}} - `}}e.default=n})),define("consul-ui/adapters/binding-rule",["exports","consul-ui/adapters/application"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -class n extends t.default{requestForQuery(e,{dc:t,ns:n,partition:r,authmethod:a,index:l}){return e` - GET /v1/acl/binding-rules?${{dc:t,authmethod:a}} - - ${{ns:n,partition:r,index:l}} - `}}e.default=n})),define("consul-ui/adapters/coordinate",["exports","consul-ui/adapters/application"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -class n extends t.default{requestForQuery(e,{dc:t,partition:n,index:r,uri:a}){return e` - GET /v1/coordinate/nodes?${{dc:t}} - X-Request-ID: ${a} - - ${{partition:n,index:r}} - `}}e.default=n})),define("consul-ui/adapters/discovery-chain",["exports","consul-ui/adapters/application"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -class n extends t.default{requestForQueryRecord(e,{dc:t,ns:n,partition:r,index:a,id:l,uri:s}){if(void 0===l)throw new Error("You must specify an id") -return e` - GET /v1/discovery-chain/${l}?${{dc:t}} - X-Request-ID: ${s} - - ${{ns:n,partition:r,index:a}} - `}}e.default=n})),define("consul-ui/adapters/http",["exports","@ember-data/adapter","@ember-data/adapter/error"],(function(e,t,n){var r,a,l -Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const s=function(e,t,n,r={}){return e.rpc((function(e,...t){return e["requestFor"+n](...t)}),(function(e,...t){return e["respondFor"+n](...t)}),r,t)},i=function(e,t,n,r){return e.rpc((function(e,...t){return e["requestFor"+n](...t)}),(function(e,...t){return e["respondFor"+n](...t)}),r,t)} -let o=(r=Ember.inject.service("client/http"),a=class extends t.default{constructor(...e){var t,n,r,a -super(...e),t=this,n="client",a=this,(r=l)&&Object.defineProperty(t,n,{enumerable:r.enumerable,configurable:r.configurable,writable:r.writable,value:r.initializer?r.initializer.call(a):void 0})}rpc(e,t,n,r){const a=this.client,l=this.store,s=this -let i,o -const u=l.serializerFor(r),c=l.modelFor(r) -return"function"==typeof n.attributes?(i=n.attributes(),o=u.serialize(n,{})):(i=n,o=i),a.request((function(t){return e(s,t,o,i,c)})).catch((function(e){return s.error(e)})).then((function(e){return t(u,e,o,i,c)}))}error(e){if(e instanceof TypeError)throw e -const t=[{status:""+e.statusCode,title:"The backend responded with an error",detail:e.message}] -let r -try{switch(e.statusCode){case 0:r=new n.AbortError,r.errors[0].status="0" -break -case 401:r=new n.UnauthorizedError(t,"") -break -case 403:r=new n.ForbiddenError(t,"") -break -case 404:r=new n.NotFoundError(t,"") -break -case 408:r=new n.TimeoutError -break -case 409:r=new n.ConflictError(t,"") -break -case 422:r=new n.InvalidError(t) -break -default:r=e.statusCode>=500?new n.ServerError(t,""):new n.default(t,"")}}catch(a){r=a}throw r}query(e,t,n){return s(this,t.modelName,"Query",n)}queryRecord(e,t,n){return s(this,t.modelName,"QueryRecord",n)}findAll(e,t){return s(this,t.modelName,"FindAll")}createRecord(e,t,n){return i(this,t.modelName,"CreateRecord",n)}updateRecord(e,t,n){return i(this,t.modelName,"UpdateRecord",n)}deleteRecord(e,t,n){return i(this,t.modelName,"DeleteRecord",n)}},u=a.prototype,c="client",d=[r],m={configurable:!0,enumerable:!0,writable:!0,initializer:null},f={},Object.keys(m).forEach((function(e){f[e]=m[e]})),f.enumerable=!!f.enumerable,f.configurable=!!f.configurable,("value"in f||f.initializer)&&(f.writable=!0),f=d.slice().reverse().reduce((function(e,t){return t(u,c,e)||e}),f),p&&void 0!==f.initializer&&(f.value=f.initializer?f.initializer.call(p):void 0,f.initializer=void 0),void 0===f.initializer&&(Object.defineProperty(u,c,f),f=null),l=f,a) -var u,c,d,m,p,f -e.default=o})),define("consul-ui/adapters/intention",["exports","consul-ui/adapters/application"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -class n extends t.default{requestForQuery(e,{dc:t,ns:n,partition:r,filter:a,index:l,uri:s}){return e` - GET /v1/connect/intentions?${{dc:t}} - X-Request-ID: ${s}${void 0!==a?"\n X-Range: "+a:""} - - ${{partition:r,ns:"*",index:l,filter:a}} - `}requestForQueryRecord(e,{dc:t,index:n,id:r}){if(void 0===r)throw new Error("You must specify an id") -const[a,l,s,i,o,u]=r.split(":").map(decodeURIComponent) -return e` - GET /v1/connect/intentions/exact?${{source:`${a}/${l}/${s}`,destination:`${i}/${o}/${u}`,dc:t}} - Cache-Control: no-store - - ${{index:n}} - `}requestForCreateRecord(e,t,n){const r={SourceName:t.SourceName,DestinationName:t.DestinationName,SourceNS:t.SourceNS,DestinationNS:t.DestinationNS,SourcePartition:t.SourcePartition,DestinationPartition:t.DestinationPartition,SourceType:t.SourceType,Meta:t.Meta,Description:t.Description} -return Ember.get(t,"Action.length")?r.Action=t.Action:t.Permissions&&(r.Permissions=t.Permissions),e` - PUT /v1/connect/intentions/exact?${{source:`${n.SourcePartition}/${n.SourceNS}/${n.SourceName}`,destination:`${n.DestinationPartition}/${n.DestinationNS}/${n.DestinationName}`,dc:n.Datacenter}} - - ${r} - `}requestForUpdateRecord(e,t,n){return delete t.DestinationName,delete t.DestinationNS,delete t.DestinationPartition,this.requestForCreateRecord(...arguments)}requestForDeleteRecord(e,t,n){return e` - DELETE /v1/connect/intentions/exact?${{source:`${n.SourcePartition}/${n.SourceNS}/${n.SourceName}`,destination:`${n.DestinationPartition}/${n.DestinationNS}/${n.DestinationName}`,dc:n.Datacenter}} - `}}e.default=n})),define("consul-ui/adapters/kv",["exports","consul-ui/adapters/application","consul-ui/utils/isFolder","consul-ui/utils/keyToArray","consul-ui/models/kv"],(function(e,t,n,r,a){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -class l extends t.default{async requestForQuery(e,{dc:t,ns:n,partition:a,index:l,id:s,separator:i}){if(void 0===s)throw new Error("You must specify an id") -const o=await(e` - GET /v1/kv/${(0,r.default)(s)}?${{keys:null,dc:t,separator:i}} - - ${{ns:n,partition:a,index:l}} - `) -return await o(e=>delete e["x-consul-index"]),o}async requestForQueryRecord(e,{dc:t,ns:n,partition:a,index:l,id:s}){if(void 0===s)throw new Error("You must specify an id") -const i=await(e` - GET /v1/kv/${(0,r.default)(s)}?${{dc:t}} - - ${{ns:n,partition:a,index:l}} - `) -return await i(e=>delete e["x-consul-index"]),i}requestForCreateRecord(e,t,n){const l={dc:n.Datacenter,ns:n.Namespace,partition:n.Partition} -return e` - PUT /v1/kv/${(0,r.default)(n[a.SLUG_KEY])}?${l} - Content-Type: text/plain; charset=utf-8 - - ${t} - `}requestForUpdateRecord(e,t,n){const l={dc:n.Datacenter,ns:n.Namespace,partition:n.Partition,flags:n.Flags} -return e` - PUT /v1/kv/${(0,r.default)(n[a.SLUG_KEY])}?${l} - Content-Type: text/plain; charset=utf-8 - - ${t} - `}requestForDeleteRecord(e,t,l){let s;(0,n.default)(l[a.SLUG_KEY])&&(s=null) -const i={dc:l.Datacenter,ns:l.Namespace,partition:l.Partition,recurse:s} -return e` - DELETE /v1/kv/${(0,r.default)(l[a.SLUG_KEY])}?${i} - `}}e.default=l})),define("consul-ui/adapters/node",["exports","consul-ui/adapters/application"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -class n extends t.default{requestForQuery(e,{dc:t,ns:n,partition:r,index:a,id:l,uri:s}){return e` - GET /v1/internal/ui/nodes?${{dc:t}} - X-Request-ID: ${s} - - ${{ns:n,partition:r,index:a}} - `}requestForQueryRecord(e,{dc:t,ns:n,partition:r,index:a,id:l,uri:s}){if(void 0===l)throw new Error("You must specify an id") -return e` - GET /v1/internal/ui/node/${l}?${{dc:t}} - X-Request-ID: ${s} - - ${{ns:n,partition:r,index:a}} - `}requestForQueryLeader(e,{dc:t,uri:n}){return e` - GET /v1/status/leader?${{dc:t}} - X-Request-ID: ${n} - Refresh: 30 - `}queryLeader(e,t,n,r){return this.rpc((function(e,t,n,r){return e.requestForQueryLeader(t,n,r)}),(function(e,t,n,r){return e.respondForQueryLeader(t,n,r)}),r,t.modelName)}}e.default=n})) -define("consul-ui/adapters/nspace",["exports","consul-ui/adapters/application","consul-ui/models/nspace"],(function(e,t,n){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -class r extends t.default{requestForQuery(e,{dc:t,partition:n,index:r,uri:a}){return e` - GET /v1/namespaces?${{dc:t}} - X-Request-ID: ${a} - - ${{partition:n,index:r}} - `}requestForQueryRecord(e,{dc:t,partition:n,index:r,id:a}){if(void 0===a)throw new Error("You must specify an name") -return e` - GET /v1/namespace/${a}?${{dc:t}} - - ${{partition:n,index:r}} - `}requestForCreateRecord(e,t,r){return e` - PUT /v1/namespace/${r[n.SLUG_KEY]}?${{dc:r.Datacenter,partition:r.Partition}} - - ${{Name:t.Name,Description:t.Description,ACLs:{PolicyDefaults:t.ACLs.PolicyDefaults.map(e=>({ID:e.ID})),RoleDefaults:t.ACLs.RoleDefaults.map(e=>({ID:e.ID}))}}} - `}requestForUpdateRecord(e,t,r){return e` - PUT /v1/namespace/${r[n.SLUG_KEY]}?${{dc:r.Datacenter,partition:r.Partition}} - - ${{Description:t.Description,ACLs:{PolicyDefaults:t.ACLs.PolicyDefaults.map(e=>({ID:e.ID})),RoleDefaults:t.ACLs.RoleDefaults.map(e=>({ID:e.ID}))}}} - `}requestForDeleteRecord(e,t,r){return e` - DELETE /v1/namespace/${r[n.SLUG_KEY]}?${{dc:r.Datacenter,partition:r.Partition}} - `}}e.default=r})),define("consul-ui/adapters/oidc-provider",["exports","consul-ui/adapters/application"],(function(e,t){var n,r,a -Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -let l=(n=Ember.inject.service("env"),r=class extends t.default{constructor(...e){var t,n,r,l -super(...e),t=this,n="env",l=this,(r=a)&&Object.defineProperty(t,n,{enumerable:r.enumerable,configurable:r.configurable,writable:r.writable,value:r.initializer?r.initializer.call(l):void 0})}requestForQuery(e,{dc:t,ns:n,partition:r,index:a,uri:l}){return e` - GET /v1/internal/ui/oidc-auth-methods?${{dc:t}} - X-Request-ID: ${l} - - ${{ns:n,partition:r,index:a}} - `}requestForQueryRecord(e,{dc:t,ns:n,partition:r,id:a}){if(void 0===a)throw new Error("You must specify an id") -return e` - POST /v1/acl/oidc/auth-url?${{dc:t,ns:n,partition:r}} - Cache-Control: no-store - - ${{AuthMethod:a,RedirectURI:this.env.var("CONSUL_BASE_UI_URL")+"/oidc/callback"}} - `}requestForAuthorize(e,{dc:t,ns:n,partition:r,id:a,code:l,state:s}){if(void 0===a)throw new Error("You must specify an id") -if(void 0===l)throw new Error("You must specify an code") -if(void 0===s)throw new Error("You must specify an state") -return e` - POST /v1/acl/oidc/callback?${{dc:t,ns:n,partition:r}} - Cache-Control: no-store - - ${{AuthMethod:a,Code:l,State:s}} - `}requestForLogout(e,{id:t}){if(void 0===t)throw new Error("You must specify an id") -return e` - POST /v1/acl/logout - Cache-Control: no-store - X-Consul-Token: ${t} - `}authorize(e,t,n,r){return this.rpc((function(e,t,n,r){return e.requestForAuthorize(t,n,r)}),(function(e,t,n,r){return e.respondForAuthorize(t,n,r)}),r,t.modelName)}logout(e,t,n,r){return this.rpc((function(e,t,n,r){return e.requestForLogout(t,n,r)}),(function(){return{}}),r,t.modelName)}},s=r.prototype,i="env",o=[n],u={configurable:!0,enumerable:!0,writable:!0,initializer:null},d={},Object.keys(u).forEach((function(e){d[e]=u[e]})),d.enumerable=!!d.enumerable,d.configurable=!!d.configurable,("value"in d||d.initializer)&&(d.writable=!0),d=o.slice().reverse().reduce((function(e,t){return t(s,i,e)||e}),d),c&&void 0!==d.initializer&&(d.value=d.initializer?d.initializer.call(c):void 0,d.initializer=void 0),void 0===d.initializer&&(Object.defineProperty(s,i,d),d=null),a=d,r) -var s,i,o,u,c,d -e.default=l})),define("consul-ui/adapters/partition",["exports","consul-ui/adapters/application","consul-ui/models/partition"],(function(e,t,n){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -class r extends t.default{async requestForQuery(e,{ns:t,dc:n,index:r}){const a=await(e` - GET /v1/partitions?${{dc:n}} - - ${{index:r}} - `) -return await a(e=>delete e["x-consul-index"]),a}async requestForQueryRecord(e,{ns:t,dc:n,index:r,id:a}){if(void 0===a)throw new Error("You must specify an id") -const l=await(e` - GET /v1/partition/${a}?${{dc:n}} - - ${{index:r}} - `) -return await l(e=>delete e["x-consul-index"]),l}async requestForCreateRecord(e,t,r){return e` - PUT /v1/partition/${r[n.SLUG_KEY]}?${{dc:r.Datacenter}} - - ${{Name:t.Name,Description:t.Description}} - `}async requestForUpdateRecord(e,t,r){return e` - PUT /v1/partition/${r[n.SLUG_KEY]}?${{dc:r.Datacenter}} - - ${{Description:t.Description}} - `}async requestForDeleteRecord(e,t,r){return e` - DELETE /v1/partition/${r[n.SLUG_KEY]}?${{dc:r.Datacenter}} - `}}e.default=r})),define("consul-ui/adapters/permission",["exports","consul-ui/adapters/application"],(function(e,t){var n,r,a,l,s -function i(e,t){var n=Object.keys(e) -if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e) -t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function o(e){for(var t=1;to(o({},e),{},{Namespace:n}))),this.env.var("CONSUL_PARTITIONS_ENABLED")&&(a=a.map(e=>o(o({},e),{},{Partition:r}))),e` - POST /v1/internal/acl/authorize?${{dc:t}} - - ${a} - `}authorize(e,t,n,r){return this.rpc(async(e,t,n)=>{const r=this.env.var("CONSUL_NSPACES_ENABLED"),a=this.env.var("CONSUL_PARTITIONS_ENABLED") -if(r||a){const e=await this.settings.findBySlug("token") -r&&(void 0!==n.ns&&0!==n.ns.length||(n.ns=e.Namespace)),a&&(void 0!==n.partition&&0!==n.partition.length||(n.partition=e.Partition))}return e.requestForAuthorize(t,n)},(function(e,t){return t((function(e,t){return t}))}),r,t.modelName)}},l=d(a.prototype,"env",[n],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),s=d(a.prototype,"settings",[r],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),a) -e.default=m})),define("consul-ui/adapters/policy",["exports","consul-ui/adapters/application","consul-ui/models/policy"],(function(e,t,n){function r(e,t){var n=Object.keys(e) -if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e) -t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function a(e){for(var t=1;tdelete e["x-consul-index"]),s}requestForCreateRecord(e,t,n){return e` - PUT /v1/acl/token?${i(i({},this.formatDatacenter(n.Datacenter)),{},{ns:n.Namespace,partition:n.Partition})} - - ${{Description:t.Description,Policies:t.Policies,Roles:t.Roles,ServiceIdentities:t.ServiceIdentities,NodeIdentities:t.NodeIdentities,Local:t.Local}} - `}requestForUpdateRecord(e,t,r){if(void 0!==r.Rules)return e` - PUT /v1/acl/update?${this.formatDatacenter(r.Datacenter)} - - ${t} - ` -const a=i(i({},this.formatDatacenter(r.Datacenter)),{},{ns:r.Namespace,partition:r.Partition}) -return e` - PUT /v1/acl/token/${r[n.SLUG_KEY]}?${a} - - ${{Description:t.Description,Policies:t.Policies,Roles:t.Roles,ServiceIdentities:t.ServiceIdentities,NodeIdentities:t.NodeIdentities,Local:t.Local}} - `}requestForDeleteRecord(e,t,r){const a={dc:r.Datacenter,ns:r.Namespace,partition:r.Partition} -return e` - DELETE /v1/acl/token/${r[n.SLUG_KEY]}?${a} - `}requestForSelf(e,t,{dc:n,index:r,secret:a}){return e` - GET /v1/acl/token/self?${{dc:n}} - X-Consul-Token: ${a} - Cache-Control: no-store - - ${{index:r}} - `}requestForCloneRecord(e,t,r){const a=r[n.SLUG_KEY] -if(void 0===a)throw new Error("You must specify an id") -return e` - PUT /v1/acl/token/${a}/clone?${{dc:r.Datacenter,ns:r.Namespace,partition:r.Partition}} - `}self(e,t,n,r){return this.rpc((function(e,t,n,r){return e.requestForSelf(t,n,r)}),(function(e,t,n,r){return e.respondForSelf(t,n,r)}),r,t.modelName)}clone(e,t,n,r){return this.rpc((function(e,t,n,r){return e.requestForCloneRecord(t,n,r)}),(e,t,n,r)=>{const a={dc:r.Datacenter,ns:r.Namespace,partition:r.Partition} -return e.respondForQueryRecord(t,a)},r,t.modelName)}},c=a.prototype,d="store",m=[r],p={configurable:!0,enumerable:!0,writable:!0,initializer:null},b={},Object.keys(p).forEach((function(e){b[e]=p[e]})),b.enumerable=!!b.enumerable,b.configurable=!!b.configurable,("value"in b||b.initializer)&&(b.writable=!0),b=m.slice().reverse().reduce((function(e,t){return t(c,d,e)||e}),b),f&&void 0!==b.initializer&&(b.value=b.initializer?b.initializer.call(f):void 0,b.initializer=void 0),void 0===b.initializer&&(Object.defineProperty(c,d,b),b=null),l=b,a) -var c,d,m,p,f,b -e.default=u})),define("consul-ui/adapters/topology",["exports","consul-ui/adapters/application"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -class n extends t.default{requestForQueryRecord(e,{dc:t,ns:n,partition:r,kind:a,index:l,id:s,uri:i}){if(void 0===s)throw new Error("You must specify an id") -return e` - GET /v1/internal/ui/service-topology/${s}?${{dc:t,kind:a}} - X-Request-ID: ${i} - - ${{ns:n,partition:r,index:l}} - `}}e.default=n})),define("consul-ui/app",["exports","ember-resolver","ember-load-initializers","consul-ui/config/environment"],(function(e,t,n,r){function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -class l extends Ember.Application{constructor(...e){super(...e),a(this,"modulePrefix",r.default.modulePrefix),a(this,"podModulePrefix",r.default.podModulePrefix),a(this,"Resolver",t.default)}}e.default=l,(0,n.default)(l,r.default.modulePrefix)})),define("consul-ui/component-managers/glimmer",["exports","@glimmer/component/-private/ember-component-manager"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/components/-dynamic-element-alt",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -var t=Ember.Component.extend() -e.default=t})),define("consul-ui/components/-dynamic-element",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -var t=Ember.Component.extend() -e.default=t})),define("consul-ui/components/action/index",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const t=Ember.HTMLBars.template({id:"ZOGNH+Kw",block:'{"symbols":["@tabindex","&attrs","@type","@onclick","&default","@href","@external","@for"],"statements":[[6,[37,3],[[32,8]],null,[["default","else"],[{"statements":[[11,"label"],[16,"for",[32,8]],[17,2],[12],[18,5,null],[13]],"parameters":[]},{"statements":[[6,[37,3],[[32,6]],null,[["default","else"],[{"statements":[[6,[37,3],[[32,7]],null,[["default","else"],[{"statements":[[11,"a"],[16,6,[32,6]],[24,"target","_blank"],[24,"rel","noopener noreferrer"],[17,2],[12],[18,5,null],[13]],"parameters":[]},{"statements":[[11,"a"],[16,6,[32,6]],[17,2],[12],[18,5,null],[13]],"parameters":[]}]]]],"parameters":[]},{"statements":[[11,"button"],[16,"tabindex",[32,1]],[17,2],[16,4,[30,[36,0],[[32,3],"button"],null]],[4,[38,2],["click",[30,[36,1],[[32,4]],null]],null],[12],[18,5,null],[13]],"parameters":[]}]]]],"parameters":[]}]]]],"hasEval":false,"upvars":["or","optional","on","if"]}',meta:{moduleName:"consul-ui/components/action/index.hbs"}}) -var n=Ember._setComponentTemplate(t,Ember._templateOnlyComponent()) -e.default=n})),define("consul-ui/components/anonymous/index",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const t=Ember.HTMLBars.template({id:"U7xNhMne",block:'{"symbols":["&default"],"statements":[[18,1,null]],"hasEval":false,"upvars":[]}',meta:{moduleName:"consul-ui/components/anonymous/index.hbs"}}) -var n=Ember._setComponentTemplate(t,Ember.Component.extend({tagName:""})) -e.default=n})),define("consul-ui/components/app-error/index",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const t=Ember.HTMLBars.template({id:"dYVazy5r",block:'{"symbols":["@error","@login"],"statements":[[8,"app-view",[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["header"]],[["default"],[{"statements":[[2,"\\n "],[10,"h1"],[12],[2,"\\n Error "],[1,[32,1,["status"]]],[2,"\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["content"]],[["default"],[{"statements":[[2,"\\n "],[8,"error-state",[],[["@error","@login"],[[32,1],[30,[36,1],[[30,[36,0],[[32,1,["status"]],"403"],null],[32,2]],null]]],null],[2,"\\n "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[]}]]],[2,"\\n"]],"hasEval":false,"upvars":["eq","if"]}',meta:{moduleName:"consul-ui/components/app-error/index.hbs"}}) -var n=Ember._setComponentTemplate(t,Ember._templateOnlyComponent()) -e.default=n})),define("consul-ui/components/app-view/index",["exports","block-slots"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const n=Ember.HTMLBars.template({id:"xz4Gi6kv",block:'{"symbols":["&attrs","&default"],"statements":[[11,"div"],[24,0,"app-view"],[17,1],[12],[2,"\\n "],[18,2,null],[2,"\\n "],[10,"header"],[12],[2,"\\n "],[10,"div"],[12],[2,"\\n "],[10,"div"],[12],[2,"\\n "],[10,"nav"],[14,"aria-label","Breadcrumb"],[12],[2,"\\n "],[8,"yield-slot",[],[["@name"],["breadcrumbs"]],[["default"],[{"statements":[[2,"\\n "],[1,[30,[36,0],null,[["class"],["with-breadcrumbs"]]]],[2,"\\n "],[18,2,null],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[13],[2,"\\n "],[10,"div"],[14,0,"title"],[12],[2,"\\n "],[8,"yield-slot",[],[["@name"],["header"]],[["default"],[{"statements":[[2,"\\n "],[18,2,null],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[10,"div"],[14,0,"actions"],[12],[2,"\\n "],[8,"yield-slot",[],[["@name"],["actions"]],[["default"],[{"statements":[[2,"\\n "],[8,"portal-target",[],[["@name"],["app-view-actions"]],null],[2,"\\n "],[18,2,null],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[13],[2,"\\n "],[13],[2,"\\n "],[8,"yield-slot",[],[["@name"],["nav"]],[["default"],[{"statements":[[2,"\\n "],[18,2,null],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[13],[2,"\\n "],[13],[2,"\\n "],[8,"yield-slot",[],[["@name"],["toolbar"]],[["default"],[{"statements":[[2,"\\n "],[10,"input"],[14,1,"toolbar-toggle"],[14,4,"checkbox"],[12],[13],[2,"\\n "],[18,2,null],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[13],[2,"\\n "],[10,"div"],[12],[2,"\\n "],[8,"yield-slot",[],[["@name"],["content"]],[["default"],[{"statements":[[18,2,null]],"parameters":[]}]]],[2,"\\n "],[13],[2,"\\n"],[13],[2,"\\n"]],"hasEval":false,"upvars":["document-attrs"]}',meta:{moduleName:"consul-ui/components/app-view/index.hbs"}}) -var r=Ember._setComponentTemplate(n,Ember.Component.extend(t.default,{tagName:""})) -e.default=r})),define("consul-ui/components/app/index",["exports","@glimmer/component"],(function(e,t){var n,r,a,l,s,i -function o(e,t,n,r,a){var l={} -return Object.keys(r).forEach((function(e){l[e]=r[e]})),l.enumerable=!!l.enumerable,l.configurable=!!l.configurable,("value"in l||l.initializer)&&(l.writable=!0),l=n.slice().reverse().reduce((function(n,r){return r(e,t,n)||n}),l),a&&void 0!==l.initializer&&(l.value=l.initializer?l.initializer.call(a):void 0,l.initializer=void 0),void 0===l.initializer&&(Object.defineProperty(e,t,l),l=null),l}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const u=Ember.HTMLBars.template({id:"/jM8p8BN",block:'{"symbols":["exported","&attrs","&default"],"statements":[[6,[37,10],[[30,[36,6],null,[["main","Notification"],[[30,[36,1],[[35,3],"-main"],null],[30,[36,9],["app/notification"],null]]]]],null,[["default"],[{"statements":[[2,"\\n"],[11,"div"],[24,0,"app"],[17,2],[12],[2,"\\n\\n "],[11,"div"],[24,0,"skip-links"],[4,[38,0],["click",[32,0,["focus"]]],null],[12],[2,"\\n "],[8,"portal-target",[],[["@name","@multiple"],["app-before-skip-links",true]],[["default"],[{"statements":[],"parameters":[]}]]],[2,"\\n "],[10,"a"],[15,6,[30,[36,1],["#",[32,1,["main"]]],null]],[12],[1,[30,[36,2],["components.app.skip_to_content"],null]],[13],[2,"\\n"],[2," "],[8,"portal-target",[],[["@name","@multiple"],["app-after-skip-links",true]],[["default"],[{"statements":[],"parameters":[]}]]],[2,"\\n "],[13],[2,"\\n\\n "],[8,"modal-layer",[],[[],[]],null],[2,"\\n\\n "],[10,"input"],[15,1,[30,[36,1],[[35,3],"-main-nav-toggle"],null]],[14,4,"checkbox"],[12],[13],[2,"\\n "],[10,"header"],[14,"role","banner"],[12],[2,"\\n "],[11,"label"],[24,"tabindex","0"],[16,"for",[30,[36,1],[[35,3],"-main-nav-toggle"],null]],[16,"aria-label",[30,[36,2],["components.app.toggle_menu"],null]],[4,[38,0],["keypress",[32,0,["keypressClick"]]],null],[4,[38,0],["mouseup",[32,0,["unfocus"]]],null],[12],[13],[2,"\\n "],[18,3,[[30,[36,4],["home-nav"],null],[32,1]]],[2,"\\n "],[10,"div"],[12],[2,"\\n"],[2," "],[11,"nav"],[16,"aria-label",[30,[36,2],["components.app.main"],null]],[16,0,[30,[36,5],[[32,0,["navInViewport"]],"in-viewport"],null]],[4,[38,8],null,[["onEnter","onExit","viewportTolerance"],[[30,[36,7],[[32,0],"navInViewport",true],null],[30,[36,7],[[32,0],"navInViewport",false],null],[30,[36,6],null,[["top","bottom","left","right"],[-10,-10,-10,-10]]]]]],[12],[2,"\\n "],[18,3,[[30,[36,4],["main-nav"],null],[32,1]]],[2,"\\n "],[13],[2,"\\n"],[2," "],[10,"nav"],[15,"aria-label",[30,[36,2],["components.app.complementary"],null]],[12],[2,"\\n "],[18,3,[[30,[36,4],["complementary-nav"],null],[32,1]]],[2,"\\n "],[13],[2,"\\n\\n "],[13],[2,"\\n "],[13],[2,"\\n "],[10,"main"],[15,1,[30,[36,1],[[35,3],"-main"],null]],[12],[2,"\\n "],[10,"div"],[14,0,"notifications"],[12],[2,"\\n "],[18,3,[[30,[36,4],["notifications"],null],[32,1]]],[2,"\\n "],[8,"portal-target",[],[["@name","@multiple"],["app-notifications",true]],[["default"],[{"statements":[],"parameters":[]}]]],[2,"\\n "],[13],[2,"\\n "],[18,3,[[30,[36,4],["main"],null],[32,1]]],[2,"\\n "],[13],[2,"\\n "],[10,"footer"],[14,"role","contentinfo"],[12],[2,"\\n "],[18,3,[[30,[36,4],["content-info"],null],[32,1]]],[2,"\\n "],[13],[2,"\\n"],[13],[2,"\\n\\n"]],"parameters":[1]}]]]],"hasEval":false,"upvars":["on","concat","t","guid","-named-block-invocation","if","hash","set","in-viewport","component","let"]}',meta:{moduleName:"consul-ui/components/app/index.hbs"}}) -let c=(n=Ember.inject.service("dom"),r=Ember._action,a=Ember._action,l=Ember._action,s=class extends t.default{constructor(e,t){var n,r,a,l -super(...arguments),n=this,r="dom",l=this,(a=i)&&Object.defineProperty(n,r,{enumerable:a.enumerable,configurable:a.configurable,writable:a.writable,value:a.initializer?a.initializer.call(l):void 0}),this.guid=this.dom.guid(this)}keypressClick(e){e.target.dispatchEvent(new MouseEvent("click"))}focus(e){const t=e.target.getAttribute("href") -t.startsWith("#")&&(e.preventDefault(),this.dom.focus(t))}unfocus(e){e.target.blur()}},i=o(s.prototype,"dom",[n],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),o(s.prototype,"keypressClick",[r],Object.getOwnPropertyDescriptor(s.prototype,"keypressClick"),s.prototype),o(s.prototype,"focus",[a],Object.getOwnPropertyDescriptor(s.prototype,"focus"),s.prototype),o(s.prototype,"unfocus",[l],Object.getOwnPropertyDescriptor(s.prototype,"unfocus"),s.prototype),s) -e.default=c,Ember._setComponentTemplate(u,c)})),define("consul-ui/components/app/notification/index",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const t=Ember.HTMLBars.template({id:"litSWzOO",block:'{"symbols":["&attrs","@delay","@sticky","&default"],"statements":[[11,"div"],[24,0,"app-notification"],[17,1],[4,[38,2],[[30,[36,1],[[30,[36,1],["opacity","1"],null],[30,[36,1],["transition-delay",[30,[36,0],[[32,2],"ms"],null]],null]],null]],null],[4,[38,2],[[30,[36,1],[[30,[36,1],["opacity",[30,[36,3],[[32,3],"1","0"],null]],null]],null]],[["delay"],[0]]],[12],[2,"\\n "],[18,4,null],[2,"\\n"],[13],[2,"\\n\\n"]],"hasEval":false,"upvars":["concat","array","style","if"]}',meta:{moduleName:"consul-ui/components/app/notification/index.hbs"}}) -var n=Ember._setComponentTemplate(t,Ember._templateOnlyComponent()) -e.default=n})),define("consul-ui/components/aria-menu/index",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const t=Ember.HTMLBars.template({id:"IOWpioIP",block:'{"symbols":["&default"],"statements":[[18,1,[[30,[36,5],[[32,0],"change"],null],[30,[36,5],[[32,0],"keypress"],null],[30,[36,5],[[32,0],"keypressClick"],null],[30,[36,4],null,[["labelledBy","controls","expanded"],[[30,[36,3],["component-aria-menu-trigger-",[35,2]],null],[30,[36,3],["component-aria-menu-menu-",[35,2]],null],[30,[36,1],[[35,0],"true",[29]],null]]]]]]],"hasEval":false,"upvars":["expanded","if","guid","concat","hash","action"]}',meta:{moduleName:"consul-ui/components/aria-menu/index.hbs"}}),n=13,r=32,a=38,l=40,s={vertical:{[l]:function(e,t=-1){return(t+1)%e.length},[a]:function(e,t=0){return 0===t?e.length-1:t-1},36:function(){return 0},35:function(e){return e.length-1}},horizontal:{}} -var i=Ember._setComponentTemplate(t,Ember.Component.extend({tagName:"",dom:Ember.inject.service("dom"),guid:"",expanded:!1,orientation:"vertical",keyboardAccess:!0,init:function(){this._super(...arguments),Ember.set(this,"guid",this.dom.guid(this)),this._listeners=this.dom.listeners(),this._routelisteners=this.dom.listeners()},didInsertElement:function(){this.$menu=this.dom.element("#component-aria-menu-menu-"+this.guid) -const e=this.$menu.getAttribute("aria-labelledby") -this.$trigger=this.dom.element("#"+e)},willDestroyElement:function(){this._super(...arguments),this._listeners.remove(),this._routelisteners.remove()},actions:{keypressClick:function(e){e.target.dispatchEvent(new MouseEvent("click"))},keypress:function(e){if(![n,r,a,l].includes(e.keyCode))return -e.stopPropagation() -const t=[...this.dom.elements('[role^="menuitem"]',this.$menu)] -if(e.keyCode===n||e.keyCode===r){let e=this.expanded?void 0:t[0] -Ember.run.next(()=>{e=this.expanded?e:this.$trigger,void 0!==e&&e.focus()})}if(void 0===s[this.orientation][e.keyCode])return -e.preventDefault() -const i=this.dom.element('[role^="menuitem"]:focus',this.$menu) -let o -i&&(o=t.findIndex((function(e){return e===i}))) -t[s[this.orientation][e.keyCode](t,o)].focus()},change:function(e){e.target.checked?this.actions.open.apply(this,[e]):this.actions.close.apply(this,[e])},close:function(){this._listeners.remove(),Ember.set(this,"expanded",!1),Ember.run.next(()=>{this.$trigger.removeAttribute("tabindex")})},open:function(){Ember.set(this,"expanded",!0) -0===[...this.dom.elements('[role^="menuitem"]',this.$menu)].length&&this.dom.element('input[type="checkbox"]',this.$menu.parentElement).dispatchEvent(new MouseEvent("click")),this.$trigger.setAttribute("tabindex","-1"),this._listeners.add(this.dom.document(),{keydown:e=>{27===e.keyCode&&this.$trigger.focus(),9!==e.keyCode&&27!==e.keyCode?this.keyboardAccess&&this.actions.keypress.apply(this,[e]):this.$trigger.dispatchEvent(new MouseEvent("click"))}})}}})) -e.default=i})),define("consul-ui/components/auth-dialog/chart.xstate",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -e.default={id:"auth-dialog",initial:"idle",on:{CHANGE:[{target:"authorized",cond:"hasToken",actions:["login"]},{target:"unauthorized",actions:["logout"]}]},states:{idle:{on:{CHANGE:[{target:"authorized",cond:"hasToken"},{target:"unauthorized"}]}},unauthorized:{},authorized:{}}}})),define("consul-ui/components/auth-dialog/index",["exports","@glimmer/component","consul-ui/components/auth-dialog/chart.xstate"],(function(e,t,n){var r,a,l,s,i,o -function u(e,t,n,r,a){var l={} -return Object.keys(r).forEach((function(e){l[e]=r[e]})),l.enumerable=!!l.enumerable,l.configurable=!!l.configurable,("value"in l||l.initializer)&&(l.writable=!0),l=n.slice().reverse().reduce((function(n,r){return r(e,t,n)||n}),l),a&&void 0!==l.initializer&&(l.value=l.initializer?l.initializer.call(a):void 0,l.initializer=void 0),void 0===l.initializer&&(Object.defineProperty(e,t,l),l=null),l}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const c=Ember.HTMLBars.template({id:"h+KHm0qM",block:'{"symbols":["State","Guard","Action","dispatch","state","sink","api","&default","@src","@sink"],"statements":[[8,"state-chart",[],[["@src"],[[34,1]]],[["default"],[{"statements":[[2,"\\n\\n "],[8,[32,2],[],[["@name","@cond"],["hasToken",[30,[36,2],[[32,0],"hasToken"],null]]],null],[2,"\\n "],[8,[32,3],[],[["@name","@exec"],["login",[30,[36,2],[[32,0],"login"],null]]],null],[2,"\\n "],[8,[32,3],[],[["@name","@exec"],["logout",[30,[36,2],[[32,0],"logout"],null]]],null],[2,"\\n\\n"],[2," "],[8,"data-source",[],[["@src","@onchange"],[[32,9],[30,[36,6],[[30,[36,2],[[32,0],[30,[36,4],[[35,5]],null]],[["value"],["data"]]],[30,[36,2],[[32,0],[32,4],"CHANGE"],null],[30,[36,2],[[32,0],[30,[36,4],[[35,3]],null]],[["value"],["data"]]]],null]]],null],[2,"\\n"],[2," "],[8,"data-sink",[],[["@sink"],[[32,10]]],[["default"],[{"statements":[[2,"\\n"],[6,[37,8],[[30,[36,7],null,[["login","logout","token"],[[30,[36,2],[[32,0],[32,6,["open"]]],null],[30,[36,2],[[32,0],[32,6,["open"]],null],null],[35,5]]]]],null,[["default"],[{"statements":[[2,"\\n "],[8,[32,1],[],[["@matches"],["authorized"]],[["default"],[{"statements":[[2,"\\n "],[18,8,[[30,[36,0],["authorized"],null],[32,7]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n\\n "],[8,[32,1],[],[["@matches"],["unauthorized"]],[["default"],[{"statements":[[2,"\\n "],[18,8,[[30,[36,0],["unauthorized"],null],[32,7]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n\\n"]],"parameters":[7]}]]],[2," "]],"parameters":[6]}]]],[2,"\\n"]],"parameters":[1,2,3,4,5]}]]],[2,"\\n"]],"hasEval":false,"upvars":["-named-block-invocation","chart","action","previousToken","mut","token","queue","hash","let"]}',meta:{moduleName:"consul-ui/components/auth-dialog/index.hbs"}}) -let d=(r=Ember.inject.service("repository/oidc-provider"),a=Ember._action,l=Ember._action,s=Ember._action,i=class extends t.default{constructor(){var e,t,r,a -super(...arguments),e=this,t="repo",a=this,(r=o)&&Object.defineProperty(e,t,{enumerable:r.enumerable,configurable:r.configurable,writable:r.writable,value:r.initializer?r.initializer.call(a):void 0}),this.chart=n.default}hasToken(){return void 0!==this.token.AccessorID}login(){let e=Ember.get(this,"previousToken.AccessorID"),t=Ember.get(this,"token.AccessorID") -null===e&&(e=Ember.get(this,"previousToken.SecretID")),null===t&&(t=Ember.get(this,"token.SecretID")) -let n="authorize" -void 0!==e&&e!==t&&(n="use"),this.args.onchange({data:Ember.get(this,"token"),type:n})}logout(){void 0!==Ember.get(this,"previousToken.AuthMethod")&&this.repo.logout(Ember.get(this,"previousToken.SecretID")),this.previousToken=null,this.args.onchange({data:null,type:"logout"})}},o=u(i.prototype,"repo",[r],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),u(i.prototype,"hasToken",[a],Object.getOwnPropertyDescriptor(i.prototype,"hasToken"),i.prototype),u(i.prototype,"login",[l],Object.getOwnPropertyDescriptor(i.prototype,"login"),i.prototype),u(i.prototype,"logout",[s],Object.getOwnPropertyDescriptor(i.prototype,"logout"),i.prototype),i) -e.default=d,Ember._setComponentTemplate(c,d)})),define("consul-ui/components/auth-form/chart.xstate",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -e.default={id:"auth-form",initial:"idle",on:{RESET:[{target:"idle"}],ERROR:[{target:"error"}]},states:{idle:{entry:["clearError"],on:{SUBMIT:[{target:"loading",cond:"hasValue"},{target:"error"}]}},loading:{},error:{exit:["clearError"],on:{TYPING:[{target:"idle"}],SUBMIT:[{target:"loading",cond:"hasValue"},{target:"error"}]}}}}})),define("consul-ui/components/auth-form/index",["exports","@glimmer/component","consul-ui/components/auth-form/chart.xstate","consul-ui/components/auth-form/tabs.xstate"],(function(e,t,n,r){var a,l,s -function i(e,t,n,r,a){var l={} -return Object.keys(r).forEach((function(e){l[e]=r[e]})),l.enumerable=!!l.enumerable,l.configurable=!!l.configurable,("value"in l||l.initializer)&&(l.writable=!0),l=n.slice().reverse().reduce((function(n,r){return r(e,t,n)||n}),l),a&&void 0!==l.initializer&&(l.value=l.initializer?l.initializer.call(a):void 0,l.initializer=void 0),void 0===l.initializer&&(Object.defineProperty(e,t,l),l=null),l}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const o=Ember.HTMLBars.template({id:"3tojTMnY",block:'{"symbols":["State","Guard","ChartAction","dispatch","state","chart","exported","TabState","IgnoredGuard","IgnoredAction","tabDispatch","tabState","notice","&attrs","&default","@dc","@nspace","@partition","@onsubmit"],"statements":[[8,"state-chart",[],[["@src"],[[32,0,["chart"]]]],[["default"],[{"statements":[[2,"\\n"],[6,[37,17],[[30,[36,3],null,[["State","Guard","Action","dispatch","state"],[[32,1],[32,2],[32,3],[32,4],[32,5]]]]],null,[["default"],[{"statements":[[6,[37,17],[[30,[36,3],null,[["reset","focus","disabled","error","submit"],[[30,[36,5],[[32,0],[32,4],"RESET"],null],[32,0,["focus"]],[30,[36,2],[[32,5],"loading"],null],[30,[36,6],[[30,[36,5],[[32,0],[32,4],"ERROR"],null],[30,[36,5],[[32,0],[30,[36,7],[[32,0,["error"]]],null]],[["value"],["error.errors.firstObject"]]]],null],[30,[36,6],[[30,[36,5],[[32,0],[30,[36,7],[[32,0,["value"]]],null]],null],[30,[36,5],[[32,0],[32,4],"SUBMIT"],null]],null]]]]],null,[["default"],[{"statements":[[2," "],[8,[32,2],[],[["@name","@cond"],["hasValue",[32,0,["hasValue"]]]],null],[2,"\\n"],[2," "],[8,[32,6,["Action"]],[],[["@name","@exec"],["clearError",[30,[36,6],[[30,[36,5],[[32,0],[30,[36,7],[[32,0,["error"]]],null],[29]],null],[30,[36,5],[[32,0],[30,[36,7],[[32,0,["secret"]]],null],[29]],null]],null]]],null],[2,"\\n "],[11,"div"],[24,0,"auth-form"],[17,14],[12],[2,"\\n"],[8,"state-chart",[],[["@src"],[[32,0,["tabsChart"]]]],[["default"],[{"statements":[[2,"\\n"],[6,[37,1],[[30,[36,8],["use SSO"],null]],null,[["default"],[{"statements":[[2," "],[8,"tab-nav",[],[["@items","@onclick"],[[30,[36,4],[[30,[36,3],null,[["label","selected"],["Token",[30,[36,2],[[32,12],"token"],null]]]],[30,[36,3],null,[["label","selected"],["SSO",[30,[36,2],[[32,12],"sso"],null]]]]],null],[30,[36,6],[[30,[36,5],[[32,0],[32,11]],null],[30,[36,5],[[32,0],[32,4],"RESET"],null]],null]]],null],[2,"\\n"]],"parameters":[]}]]],[2," "],[8,[32,1],[],[["@matches"],["error"]],[["default"],[{"statements":[[2,"\\n"],[6,[37,1],[[32,0,["error","status"]]],null,[["default"],[{"statements":[[2," "],[8,"notice",[[24,"role","alert"]],[["@type"],["error"]],[["default"],[{"statements":[[2,"\\n "],[8,[32,13,["Body"]],[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[10,"p"],[12],[2,"\\n"],[6,[37,1],[[32,0,["value","Name"]]],null,[["default","else"],[{"statements":[[6,[37,1],[[30,[36,0],[[32,0,["error","status"]],"403"],null]],null,[["default","else"],[{"statements":[[2," "],[10,"strong"],[12],[2,"Consul login failed"],[13],[10,"br"],[12],[13],[2,"\\n We received a token from your OIDC provider but could not log in to Consul with it.\\n"]],"parameters":[]},{"statements":[[6,[37,1],[[30,[36,0],[[32,0,["error","status"]],"401"],null]],null,[["default","else"],[{"statements":[[2," "],[10,"strong"],[12],[2,"Could not log in to provider"],[13],[10,"br"],[12],[13],[2,"\\n The OIDC provider has rejected this access token. Please have an administrator check your auth method configuration.\\n"]],"parameters":[]},{"statements":[[6,[37,1],[[30,[36,0],[[32,0,["error","status"]],"499"],null]],null,[["default","else"],[{"statements":[[2," "],[10,"strong"],[12],[2,"SSO log in window closed"],[13],[10,"br"],[12],[13],[2,"\\n The OIDC provider window was closed. Please try again.\\n"]],"parameters":[]},{"statements":[[2," "],[10,"strong"],[12],[2,"Error"],[13],[10,"br"],[12],[13],[2,"\\n "],[1,[32,0,["error","detail"]]],[2,"\\n "]],"parameters":[]}]]]],"parameters":[]}]]]],"parameters":[]}]]]],"parameters":[]},{"statements":[[6,[37,1],[[30,[36,0],[[32,0,["error","status"]],"403"],null]],null,[["default","else"],[{"statements":[[2," "],[10,"strong"],[12],[2,"Invalid token"],[13],[10,"br"],[12],[13],[2,"\\n The token entered does not exist. Please enter a valid token to log in.\\n"]],"parameters":[]},{"statements":[[6,[37,1],[[30,[36,0],[[32,0,["error","status"]],"404"],null]],null,[["default","else"],[{"statements":[[2," "],[10,"strong"],[12],[2,"No providers"],[13],[10,"br"],[12],[13],[2,"\\n No SSO providers are configured for that Partition.\\n"]],"parameters":[]},{"statements":[[2," "],[10,"strong"],[12],[2,"Error"],[13],[10,"br"],[12],[13],[2,"\\n "],[1,[32,0,["error","detail"]]],[2,"\\n "]],"parameters":[]}]]]],"parameters":[]}]]]],"parameters":[]}]]],[2," "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[13]}]]],[2,"\\n"]],"parameters":[]}]]],[2," "]],"parameters":[]}]]],[2,"\\n"],[8,[32,8],[],[["@matches"],["token"]],[["default"],[{"statements":[[2,"\\n "],[10,"form"],[15,"onsubmit",[30,[36,5],[[32,0],[32,4],"SUBMIT"],null]],[12],[2,"\\n "],[10,"fieldset"],[12],[2,"\\n "],[10,"label"],[15,0,[30,[36,11],["type-password",[30,[36,1],[[30,[36,10],[[30,[36,2],[[32,5],"error"],null],[30,[36,9],[[32,0,["error","status"]]],null]],null]," has-error"],null]],null]],[12],[2,"\\n "],[10,"span"],[12],[2,"Log in with a token"],[13],[2,"\\n\\n"],[2," "],[11,"input"],[16,"disabled",[30,[36,2],[[32,5],"loading"],null]],[24,3,"auth[SecretID]"],[24,"placeholder","SecretID"],[16,2,[32,0,["secret"]]],[16,"oninput",[30,[36,6],[[30,[36,5],[[32,0],[30,[36,7],[[32,0,["secret"]]],null]],[["value"],["target.value"]]],[30,[36,5],[[32,0],[30,[36,7],[[32,0,["value"]]],null]],[["value"],["target.value"]]],[30,[36,5],[[32,0],[32,4],"TYPING"],null]],null]],[16,4,[30,[36,1],[[30,[36,0],[[30,[36,12],["environment"],null],"testing"],null],"text","password"],null]],[4,[38,14],[[30,[36,13],[[32,0],"input"],null]],null],[12],[13],[2,"\\n "],[8,[32,1],[],[["@matches"],["error"]],[["default"],[{"statements":[[2,"\\n"],[6,[37,1],[[30,[36,9],[[32,0,["error","status"]]],null]],null,[["default"],[{"statements":[[2," "],[10,"strong"],[14,"role","alert"],[12],[2,"\\n Please enter your secret\\n "],[13],[2,"\\n"]],"parameters":[]}]]],[2," "]],"parameters":[]}]]],[2,"\\n "],[13],[2,"\\n "],[13],[2,"\\n "],[8,"action",[[16,"disabled",[30,[36,2],[[32,5],"loading"],null]]],[["@type"],["submit"]],[["default"],[{"statements":[[2,"\\n Log in\\n "]],"parameters":[]}]]],[2,"\\n "],[13],[2,"\\n"]],"parameters":[]}]]],[2,"\\n\\n"],[18,15,[[30,[36,15],[[32,7],[30,[36,3],null,[["Method"],[[32,8]]]]],null]]],[2,"\\n\\n "],[10,"em"],[12],[2,"\\n Contact your administrator for login credentials.\\n "],[13],[2,"\\n"]],"parameters":[8,9,10,11,12]}]]],[2,"\\n\\n\\n "],[13],[2,"\\n "],[8,[32,1],[],[["@matches"],["loading"]],[["default"],[{"statements":[[2,"\\n "],[8,"token-source",[],[["@dc","@nspace","@partition","@type","@value","@onchange","@onerror"],[[32,16],[30,[36,16],[[32,0,["value","Namespace"]],[32,17]],null],[30,[36,16],[[32,0,["value","Partition"]],[32,18]],null],[30,[36,1],[[32,0,["value","Name"]],"oidc","secret"],null],[32,0,["value"]],[30,[36,6],[[30,[36,5],[[32,0],[32,4],"RESET"],null],[32,19]],null],[30,[36,6],[[30,[36,5],[[32,0],[30,[36,7],[[32,0,["error"]]],null]],[["value"],["error.errors.firstObject"]]],[30,[36,5],[[32,0],[32,4],"ERROR"],null]],null]]],null],[2,"\\n "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[7]}]]]],"parameters":[6]}]]]],"parameters":[1,2,3,4,5]}]]]],"hasEval":false,"upvars":["eq","if","state-matches","hash","array","action","queue","mut","can","not","and","concat","env","set","did-insert","assign","or","let"]}',meta:{moduleName:"consul-ui/components/auth-form/index.hbs"}}) -let u=(a=Ember._action,l=Ember._action,i((s=class extends t.default{constructor(){super(...arguments),this.chart=n.default,this.tabsChart=r.default}hasValue(e,t,n){return""!==this.value&&void 0!==this.value}focus(){this.input.focus()}}).prototype,"hasValue",[a],Object.getOwnPropertyDescriptor(s.prototype,"hasValue"),s.prototype),i(s.prototype,"focus",[l],Object.getOwnPropertyDescriptor(s.prototype,"focus"),s.prototype),s) -e.default=u,Ember._setComponentTemplate(o,u)})),define("consul-ui/components/auth-form/tabs.xstate",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -e.default={id:"auth-form-tabs",initial:"token",on:{TOKEN:[{target:"token"}],SSO:[{target:"sso"}]},states:{token:{},sso:{}}}})),define("consul-ui/components/auth-profile/index",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const t=Ember.HTMLBars.template({id:"NskkZ4lP",block:'{"symbols":["&attrs","@item"],"statements":[[11,"dl"],[24,0,"auth-profile"],[17,1],[12],[2,"\\n "],[10,"dt"],[12],[2,"\\n "],[10,"span"],[12],[2,"My ACL Token"],[13],[10,"br"],[12],[13],[2,"\\n AccessorID\\n "],[13],[2,"\\n "],[10,"dd"],[12],[2,"\\n "],[1,[30,[36,1],[[32,2,["AccessorID"]],[30,[36,0],[[32,2,["AccessorID","length"]],8],null]],null]],[2,"\\n "],[13],[2,"\\n"],[13]],"hasEval":false,"upvars":["sub","string-substring"]}',meta:{moduleName:"consul-ui/components/auth-profile/index.hbs"}}) -var n=Ember._setComponentTemplate(t,Ember._templateOnlyComponent()) -e.default=n})),define("consul-ui/components/basic-dropdown-content",["exports","ember-basic-dropdown/components/basic-dropdown-content"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})) -define("consul-ui/components/basic-dropdown-optional-tag",["exports","ember-basic-dropdown/components/basic-dropdown-optional-tag"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/components/basic-dropdown-trigger",["exports","ember-basic-dropdown/components/basic-dropdown-trigger"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/components/basic-dropdown",["exports","ember-basic-dropdown/components/basic-dropdown"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/components/block-slot",["exports","block-slots/components/block-slot"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/components/brand-loader/enterprise",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const t=Ember.HTMLBars.template({id:"3HLvt6Sl",block:'{"symbols":[],"statements":[[10,"path"],[14,"data-enterprise-logo",""],[14,"d","M322.099,18.0445001 C319.225,18.0223001 316.427,18.9609001 314.148,20.7112001 L314.016,20.8179001 L313.68,18.5368001 L310.332,18.5368001 L310.332,53.0000001 L314.312,52.4338001 L314.312,42.3164001 L314.435,42.3164001 C316.705,42.7693001 319.012,43.0165001 321.327,43.0549001 C326.554,43.0549001 329.098,40.5029001 329.098,35.2432001 L329.098,25.3802001 C329.073,20.4569001 326.809,18.0445001 322.099,18.0445001 Z M264.971,11.9722001 L260.991,12.5466001 L260.991,18.5284001 L256.708,18.5284001 L256.708,21.8106001 L260.991,21.8106001 L260.991,37.6883001 L260.99344,37.9365729 C261.066744,41.6122056 262.7975,43.1124033 266.915,43.1124033 C268.591,43.1170001 270.255,42.8396001 271.839,42.2915001 L271.363,39.1817001 L270.896229,39.3066643 C269.803094,39.5806719 268.682875,39.7315001 267.555,39.7560001 C265.526625,39.7560001 265.081547,38.9674128 264.991981,37.7056542 L264.97743,37.4176027 L264.97159,37.1147428 L264.971,21.8188001 L271.494,21.8188001 L271.83,18.5366001 L264.971,18.5366001 L264.971,11.9722001 Z M283.556,18.0770001 C277.312,18.0770001 274.144,21.0884001 274.144,27.0374001 L274.144,34.3075001 C274.144,40.3140001 277.164,43.1124894 283.655,43.1124894 C286.526,43.1192001 289.38,42.6620001 292.106,41.7581001 L291.589,38.6154001 C289.116,39.3030001 286.566,39.6779001 283.999,39.7314001 C279.785843,39.7314001 278.500803,38.4772648 278.201322,35.860808 L278.165734,35.4868687 L278.141767,35.0951811 C278.138675,35.0284172 278.136019,34.9609111 278.133774,34.8926614 L278.125037,34.474229 L278.124,32.0756001 L292.582,32.0756001 L292.582,27.1031001 C292.582,21.0064001 289.636,18.0770001 283.556,18.0770001 Z M384.631,18.0768001 C378.412,18.0440001 375.22,21.0554001 375.22,27.0208001 L375.22,34.2909001 C375.22,40.2973001 378.239,43.0955988 384.73,43.0955988 C387.599,43.1033001 390.45,42.6460001 393.173,41.7415001 L392.665,38.5988001 C390.188,39.2815001 387.635,39.6509001 385.066,39.6983001 C380.852843,39.6983001 379.567803,38.4442359 379.268322,35.8278014 L379.232734,35.4538649 L379.208767,35.0621794 C379.205675,34.9954158 379.203019,34.9279099 379.200774,34.8596604 L379.192037,34.4412289 L379.191,32.0754001 L393.657,32.0754001 L393.657,27.1029001 C393.657,21.0062001 390.712,18.0768001 384.631,18.0768001 Z M364.634,18.0441001 C363.881125,18.0441001 363.18736,18.0712813 362.54969,18.1279834 L362.016783,18.1838695 C357.948857,18.6791301 356.371,20.5353768 356.371,24.4608001 L356.371522,24.7155013 L356.376145,25.2052033 L356.386527,25.669464 L356.403852,26.1092746 C356.407384,26.1805939 356.411254,26.2509357 356.415488,26.3203208 L356.445451,26.7253144 L356.485319,27.1083357 C356.756619,29.3425283 357.626845,30.4437319 360.247859,31.3753061 L360.701103,31.529163 C360.779411,31.5545991 360.85912,31.5799457 360.940253,31.6052232 L361.444353,31.7562266 L361.983836,31.9065664 L362.55989,32.0572338 L363.430663,32.2724269 L364.440153,32.5299129 L364.884369,32.6506971 L365.29049,32.7679922 L365.660213,32.8831607 L365.99523,32.9975651 C367.26815,33.4554713 367.748817,33.9277406 367.925217,34.806783 L367.963261,35.0352452 C367.974017,35.1143754 367.982943,35.1965576 367.990321,35.2820187 L368.008092,35.5484662 L368.018269,35.8359502 L368.023,36.3096001 C368.023,36.3683432 368.022674,36.4261667 368.021989,36.4830819 L368.013333,36.8137655 C368.008847,36.9204214 368.002676,37.0235359 367.994568,37.1232009 L367.964177,37.4119383 C367.774513,38.8512264 367.058626,39.4837671 364.875404,39.6510671 L364.43427,39.67773 L363.954974,39.6933243 C363.78868,39.6967387 363.615773,39.6984001 363.436,39.6984001 C361.126,39.6638001 358.83,39.3385001 356.601,38.7302001 L356.051,41.7908001 L356.619468,41.9710684 C358.900888,42.6645722 361.270923,43.0269154 363.658,43.0463001 C369.59355,43.0463001 371.402903,41.3625861 371.812159,38.0405419 L371.854011,37.6421573 C371.859965,37.574501 371.865421,37.5062155 371.870401,37.4373012 L371.894725,37.0162715 L371.908596,36.5801656 C371.911587,36.4322862 371.913,36.2818967 371.913,36.1290001 L371.914417,35.5317322 C371.901583,33.4289389 371.677,32.2649251 370.797,31.3698001 C370.053077,30.6022731 368.787947,30.0494771 366.870096,29.4840145 L366.242608,29.3047611 C366.13436,29.2747269 366.024265,29.2445914 365.912304,29.2143213 L365.218,29.0308209 L364.216102,28.7784328 L363.495981,28.593015 L363.068145,28.4733265 L362.67987,28.3551624 C361.018765,27.8247783 360.501056,27.2986662 360.340522,26.2094051 L360.310407,25.9578465 C360.306262,25.9142982 360.302526,25.8699197 360.29916,25.8246823 L360.283089,25.5427193 L360.273984,25.2387571 L360.269927,24.911412 L360.270221,24.3885398 L360.280627,24.0635689 C360.366727,22.3885604 360.966747,21.6370879 363.248047,21.4645754 L363.695778,21.4389299 L364.184625,21.426349 L364.445,21.4248001 C366.684,21.4608001 368.916,21.6859001 371.117,22.0976001 L371.396,18.8646001 L370.730951,18.7059457 C368.73071,18.2553391 366.686,18.0331201 364.634,18.0441001 Z M351.301,18.5363001 L347.321,18.5363001 L347.321,42.6112001 L351.301,42.6112001 L351.301,18.5363001 Z M307.335,18.0850001 L306.70097,18.3638937 C304.598769,19.3169298 302.610091,20.5031364 300.771,21.9005001 L300.623,22.0236001 L300.369,18.5363001 L296.931,18.5363001 L296.931,42.6112001 L300.91,42.6112001 L300.91,25.9048001 L301.641825,25.3925123 C303.604371,24.0427531 305.654445,22.8240667 307.778,21.7446001 L307.335,18.0850001 Z M344.318,18.0850001 L343.683947,18.3638937 C341.581595,19.3169298 339.592091,20.5031364 337.753,21.9005001 L337.606,22.0236001 L337.351,18.5363001 L333.946,18.5363001 L333.946,42.6112001 L337.926,42.6112001 L337.926,25.9048001 L337.967,25.9048001 L338.701162,25.3884311 C340.669963,24.0279284 342.726556,22.7996223 344.859,21.7118001 L344.318,18.0850001 Z M230.384,9.62500005 L211.109,9.62500005 L211.109,42.6112001 L230.466,42.6112001 L230.466,38.9597001 L215.146,38.9597001 L215.146,27.4720001 L229.293,27.4720001 L229.293,23.8698001 L215.146,23.8698001 L215.146,13.2600001 L230.384,13.2600001 L230.384,9.62500005 Z M248.763,18.0441001 C245.899,18.0441001 241.706,19.3323001 239.047,20.6124001 L238.924,20.6698001 L238.522,18.5282001 L235.322,18.5282001 L235.322,42.5704001 L239.302,42.5704001 L239.302,24.2885001 L239.359,24.2885001 C241.919,22.9674001 245.661,21.8268001 247.524,21.8268001 C249.165,21.8268001 249.985,22.5735001 249.985,24.1736001 L249.985,42.5868001 L253.965,42.5868001 L253.965,24.1161001 C253.932,20.0380001 252.25,18.0523001 248.763,18.0441001 Z M321.229,21.5564001 C323.526,21.5564001 325.061,22.2046001 325.061,25.3966001 L325.094,35.2760001 C325.094,38.3121001 323.887,39.6085001 321.057,39.6085001 C318.81,39.5533001 316.572,39.3035001 314.369,38.8618001 L314.287,38.8618001 L314.287,24.4694001 C316.198,22.7311001 318.649,21.7027001 321.229,21.5564001 Z M283.581,21.3264001 C287.372,21.3264001 288.758,22.8855001 288.758,26.7010001 L288.758,28.7934001 L278.149,28.7934001 L278.149,26.7010001 C278.149,22.9839001 279.79,21.3264001 283.581,21.3264001 Z M384.648,21.3262001 C388.431,21.3262001 389.834,22.8852001 389.834,26.7008001 L389.834,28.7932001 L379.224,28.7932001 L379.224,26.7008001 C379.224,22.9837001 380.865,21.3262001 384.648,21.3262001 Z M351.301,8.63220005 L347.321,8.63220005 L347.321,14.4499001 L351.301,14.4499001 L351.301,8.63220005 Z"],[14,"fill-rule","nonzero"],[12],[13],[2,"\\n\\n"]],"hasEval":false,"upvars":[]}',meta:{moduleName:"consul-ui/components/brand-loader/enterprise.hbs"}}) -var n=Ember._setComponentTemplate(t,Ember._templateOnlyComponent()) -e.default=n})),define("consul-ui/components/brand-loader/index",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const t=Ember.HTMLBars.template({id:"fT5BqeI8",block:'{"symbols":["@width","@color","@subtitle","&default"],"statements":[[10,"div"],[14,0,"brand-loader"],[15,5,[31,["margin-left: calc(-",[32,1],"px / 2)"]]],[12],[2,"\\n"],[10,"svg"],[15,"width",[31,[[32,1]]]],[14,"height","53"],[14,"xmlns","http://www.w3.org/2000/svg","http://www.w3.org/2000/xmlns/"],[15,"fill",[31,[[32,2]]]],[12],[2,"\\n "],[10,"path"],[14,"d","M32.7240001,0.866235051 C28.6239001,-0.218137949 24.3210001,-0.285465949 20.1890001,0.670096051 C16.0569001,1.62566005 12.2205001,3.57523005 9.01276015,6.34960005 C5.80499015,9.12397005 3.32280015,12.6393001 1.78161015,16.5905001 C0.240433148,20.5416001 -0.313157852,24.8092001 0.168892148,29.0228001 C0.650943148,33.2364001 2.15407015,37.2687001 4.54780015,40.7697001 C6.94153015,44.2707001 10.1535001,47.1346001 13.9050001,49.1128001 C17.6565001,51.0910001 21.8341001,52.1238001 26.0752001,52.1214409 C32.6125001,52.1281001 38.9121001,49.6698001 43.7170001,45.2370001 L37.5547001,38.7957001 C35.0952001,41.0133001 32.0454001,42.4701001 28.7748001,42.9898001 C25.5042001,43.5096001 22.1530001,43.0698001 19.1273001,41.7239001 C16.1015001,40.3779001 13.5308001,38.1835001 11.7267001,35.4064001 C9.92260015,32.6294001 8.96239015,29.3888001 8.96239015,26.0771001 C8.96239015,22.7655001 9.92260015,19.5249001 11.7267001,16.7478001 C13.5308001,13.9707001 16.1015001,11.7763001 19.1273001,10.4304001 C22.1530001,9.08444005 25.5042001,8.64470005 28.7748001,9.16441005 C32.0454001,9.68412005 35.0952001,11.1410001 37.5547001,13.3586001 L43.7170001,6.89263005 C40.5976001,4.01926005 36.8241001,1.95061005 32.7240001,0.866235051 Z M46.6320001,34.8572001 C46.2182001,34.9395001 45.8380001,35.1427001 45.5397001,35.4410001 C45.2413001,35.7394001 45.0381001,36.1195001 44.9558001,36.5334001 C44.8735001,36.9472001 44.9157001,37.3762001 45.0772001,37.7660001 C45.2387001,38.1559001 45.5121001,38.4891001 45.8630001,38.7235001 C46.2138001,38.9579001 46.6263001,39.0830001 47.0482001,39.0830001 C47.6141001,39.0830001 48.1567001,38.8583001 48.5568001,38.4582001 C48.9569001,38.0581001 49.1817001,37.5154001 49.1817001,36.9496001 C49.1817001,36.5276001 49.0565001,36.1152001 48.8221001,35.7643001 C48.5877001,35.4135001 48.2545001,35.1400001 47.8647001,34.9786001 C47.4748001,34.8171001 47.0459001,34.7748001 46.6320001,34.8572001 Z M49.0856001,27.5622001 C48.6718001,27.6446001 48.2916001,27.8477001 47.9933001,28.1461001 C47.6949001,28.4445001 47.4917001,28.8246001 47.4094001,29.2385001 C47.3271001,29.6523001 47.3693001,30.0813001 47.5308001,30.4711001 C47.6923001,30.8609001 47.9657001,31.1941001 48.3166001,31.4286001 C48.6674001,31.6630001 49.0799001,31.7881001 49.5018001,31.7881001 C50.0670001,31.7859001 50.6084001,31.5605001 51.0080001,31.1609001 C51.4076001,30.7612001 51.6331001,30.2198001 51.6353001,29.6547001 C51.6353001,29.2327001 51.5102001,28.8202001 51.2757001,28.4694001 C51.0413001,28.1186001 50.7081001,27.8451001 50.3183001,27.6836001 C49.9284001,27.5222001 49.4995001,27.4799001 49.0856001,27.5622001 Z M28.0728001,20.8457001 C27.0412001,20.4185001 25.9061001,20.3067001 24.8110001,20.5245001 C23.7159001,20.7423001 22.7100001,21.2800001 21.9205001,22.0695001 C21.1309001,22.8590001 20.5933001,23.8650001 20.3754001,24.9600001 C20.1576001,26.0551001 20.2694001,27.1902001 20.6967001,28.2218001 C21.1240001,29.2534001 21.8476001,30.1351001 22.7760001,30.7554001 C23.7043001,31.3757001 24.7958001,31.7068001 25.9124001,31.7068001 C27.4096001,31.7068001 28.8455001,31.1120001 29.9043001,30.0533001 C30.9630001,28.9946001 31.5578001,27.5587001 31.5578001,26.0614001 C31.5578001,24.9449001 31.2267001,23.8534001 30.6063001,22.9250001 C29.9860001,21.9966001 29.1043001,21.2730001 28.0728001,20.8457001 Z M43.9670001,27.4378001 C43.5772001,27.2763001 43.1482001,27.2341001 42.7344001,27.3164001 C42.3205001,27.3987001 41.9404001,27.6019001 41.6420001,27.9003001 C41.3437001,28.1986001 41.1405001,28.5788001 41.0581001,28.9926001 C40.9758001,29.4065001 41.0181001,29.8354001 41.1796001,30.2253001 C41.3410001,30.6151001 41.6145001,30.9483001 41.9653001,31.1827001 C42.3162001,31.4171001 42.7286001,31.5423001 43.1506001,31.5423001 C43.7164001,31.5423001 44.2591001,31.3175001 44.6592001,30.9174001 C45.0592001,30.5173001 45.2840001,29.9747001 45.2840001,29.4088001 C45.2840001,28.9869001 45.1589001,28.5744001 44.9245001,28.2236001 C44.6901001,27.8727001 44.3568001,27.5993001 43.9670001,27.4378001 Z M43.9670001,20.7503001 C43.5772001,20.5888001 43.1482001,20.5466001 42.7344001,20.6289001 C42.3205001,20.7112001 41.9404001,20.9144001 41.6420001,21.2128001 C41.3437001,21.5111001 41.1405001,21.8913001 41.0581001,22.3051001 C40.9758001,22.7190001 41.0181001,23.1479001 41.1796001,23.5378001 C41.3410001,23.9276001 41.6145001,24.2608001 41.9653001,24.4952001 C42.3162001,24.7296001 42.7286001,24.8548001 43.1506001,24.8548001 C43.7164001,24.8548001 44.2591001,24.6300001 44.6592001,24.2299001 C45.0592001,23.8298001 45.2840001,23.2871001 45.2840001,22.7213001 C45.2840001,22.2994001 45.1589001,21.8869001 44.9245001,21.5360001 C44.6901001,21.1852001 44.3568001,20.9118001 43.9670001,20.7503001 Z M49.0856001,20.3825001 C48.6718001,20.4649001 48.2916001,20.6681001 47.9933001,20.9664001 C47.6949001,21.2648001 47.4917001,21.6449001 47.4094001,22.0588001 C47.3271001,22.4726001 47.3693001,22.9016001 47.5308001,23.2914001 C47.6923001,23.6813001 47.9657001,24.0144001 48.3166001,24.2489001 C48.6674001,24.4833001 49.0799001,24.6084001 49.5018001,24.6084001 C50.0670001,24.6063001 50.6084001,24.3808001 51.0080001,23.9812001 C51.4076001,23.5815001 51.6331001,23.0401001 51.6353001,22.4750001 C51.6353001,22.0530001 51.5102001,21.6406001 51.2757001,21.2897001 C51.0413001,20.9389001 50.7081001,20.6654001 50.3183001,20.5040001 C49.9284001,20.3425001 49.4995001,20.3002001 49.0856001,20.3825001 Z M46.7554001,13.2026001 C46.3416001,13.2849001 45.9614001,13.4881001 45.6630001,13.7865001 C45.3647001,14.0849001 45.1615001,14.4650001 45.0792001,14.8788001 C44.9969001,15.2927001 45.0391001,15.7217001 45.2006001,16.1115001 C45.3621001,16.5013001 45.6355001,16.8345001 45.9863001,17.0689001 C46.3372001,17.3034001 46.7497001,17.4285001 47.1716001,17.4285001 C47.7374001,17.4285001 48.2801001,17.2037001 48.6802001,16.8036001 C49.0803001,16.4035001 49.3050001,15.8609001 49.3050001,15.2951001 C49.3050001,14.8731001 49.1799001,14.4606001 48.9455001,14.1098001 C48.7111001,13.7589001 48.3779001,13.4855001 47.9880001,13.3240001 C47.5982001,13.1625001 47.1692001,13.1203001 46.7554001,13.2026001 Z"],[14,"fill-rule","nonzero"],[12],[13],[2,"\\n "],[10,"path"],[14,"d","M83.5385001,9.02612084 C75.3002001,9.02612084 71.7718001,12.5545001 71.7718001,18.6102001 L71.7718001,33.5278001 L71.7744126,33.809806 C71.8842215,39.6928981 75.4612111,43.1118103 83.5385001,43.1118103 C86.5802001,43.1131001 89.6109001,42.7466001 92.5646001,42.0205001 L91.8671001,36.6049001 L90.9760579,36.7631811 C88.5964705,37.1629803 86.1899224,37.3844223 83.7765001,37.4254001 C79.4194001,37.4254001 78.0326001,35.9320001 78.0326001,32.4118001 L78.0326001,19.7261001 L78.0346281,19.4988781 C78.0956946,16.133828 79.5462067,14.7125001 83.7765001,14.7125001 C86.4916001,14.7587001 89.1980001,15.0332001 91.8671001,15.5331001 L92.5646001,10.1175001 L91.8246092,9.94345672 C89.1057071,9.33281156 86.3267251,9.02500229 83.5385001,9.02612084 Z M172.149,18.4131001 L166.094,18.4131001 L166.09588,36.2248122 C166.154955,40.3975255 167.61375,43.1117001 171.55,43.1117001 C174.919,42.9517001 178.218,42.0880001 181.233,40.5762001 L181.832,42.6112001 L186.443,42.6112001 L186.443,18.4131001 L180.388,18.4131001 L180.388,35.1934001 C178.188,36.3339001 175.481,37.2283001 174.086,37.2283001 C172.691,37.2283001 172.149,36.5801001 172.149,35.2918001 L172.149,18.4131001 Z M105.939,17.9127001 C98.2719471,17.9127001 95.7845671,21.8519543 95.4516942,26.3358062 L95.4257941,26.7784774 C95.4225999,26.8525088 95.4199581,26.9266566 95.4178553,27.0009059 L95.4116001,27.4475001 L95.4116001,33.5853001 L95.4178331,34.0318054 C95.5519456,38.7818866 97.886685,43.0872001 105.931,43.0872001 C113.716697,43.0872001 116.15821,39.0467642 116.432186,34.4757046 L116.45204,34.0318054 C116.456473,33.8833653 116.458758,33.734491 116.459,33.5853001 L116.459,27.4475001 L116.457455,27.2221358 C116.453317,26.9220505 116.440796,26.6236441 116.419035,26.3278463 L116.379357,25.8862225 C115.91894,21.5651129 113.355121,17.9127001 105.939,17.9127001 Z M154.345,17.8876515 C147.453,17.8876515 145.319,20.0214001 145.319,24.8873001 L145.319694,25.1343997 L145.325703,25.6107983 L145.338905,26.064173 C145.341773,26.1378641 145.344992,26.2106314 145.348588,26.2824927 L145.374889,26.7029295 C145.380095,26.7712375 145.385729,26.838675 145.391816,26.9052596 L145.433992,27.2946761 C145.714183,29.5082333 146.613236,30.7206123 149.232713,31.693068 L149.698825,31.8575665 C150.021076,31.9658547 150.36662,32.0715774 150.737101,32.1758709 L151.311731,32.3313812 C151.509646,32.3829554 151.714,32.4343143 151.925,32.4856001 L152.205551,32.5543061 L152.728976,32.6899356 L153.204098,32.8237311 L153.633238,32.9563441 C155.53221,33.5734587 156.004908,34.1732248 156.112605,35.0535762 L156.130482,35.2466262 L156.139507,35.448917 L156.142,35.6611001 L156.137247,35.9859786 L156.121298,36.2838969 C156.024263,37.5177444 155.540462,38.0172149 153.741624,38.1073495 L153.302742,38.1210314 L153.065,38.1227001 C150.631,38.0987001 148.21,37.7482001 145.869,37.0807001 L145.049,41.6922001 L145.672496,41.887484 C148.174444,42.639635 150.769923,43.0436231 153.385,43.0871001 C159.627887,43.0871001 161.583469,40.9824692 162.030289,37.4548504 L162.074576,37.049455 C162.087289,36.9123213 162.098004,36.7731979 162.106868,36.6321214 L162.128062,36.2030694 L162.139051,35.7625187 L162.141,35.5380001 C162.141,35.4566181 162.140828,35.3763299 162.14046,35.2971136 L162.131203,34.6125174 L162.117224,34.1865271 L162.095649,33.7836378 L162.065324,33.4027996 L162.025093,33.0429627 L161.973799,32.7030773 C161.659145,30.8866498 160.790109,29.9278873 158.501441,29.0408119 L158.069484,28.8801405 L157.605084,28.7199991 C157.524916,28.6932947 157.443348,28.6665687 157.360357,28.6397991 L156.845127,28.4784845 L156.294565,28.3150754 L155.707516,28.148522 L155.082823,27.9777746 L154.035614,27.7021396 L153.423677,27.5325226 L153.071612,27.4262327 C153.016479,27.4088193 152.963082,27.3915263 152.911366,27.3743086 L152.620815,27.2715428 C151.671458,26.912485 151.415595,26.5466416 151.348761,25.7543883 L151.334373,25.5160648 L151.327658,25.2523603 L151.327351,24.8244501 C151.355827,23.4390475 151.851313,22.8769001 154.403,22.8769001 C156.636,22.9360001 158.861,23.1692001 161.057,23.5744001 L161.591,18.7085001 L160.876597,18.5511522 C158.72872,18.1040608 156.5401,17.8816774 154.345,17.8876515 Z M197.71,7.71350005 L191.654,8.53405005 L191.654,42.6116001 L197.71,42.6116001 L197.71,7.71350005 Z M135.455,17.9211001 C132.086,18.0823001 128.788,18.9459001 125.772,20.4566001 L125.189,18.4135001 L120.57,18.4135001 L120.57,42.6115001 L126.625,42.6115001 L126.625,25.8066001 C128.833,24.6661001 131.549,23.7717001 132.936,23.7717001 C134.322,23.7717001 134.872,24.4199001 134.872,25.7082001 L134.872,42.6115001 L140.919,42.6115001 L140.919,25.0681001 C140.919,20.7520001 139.475,17.9211001 135.455,17.9211001 Z M105.931,23.0740001 C109.156,23.0740001 110.395,24.5592001 110.395,27.2506001 L110.395,33.7494001 L110.392134,33.9740961 C110.325067,36.5604698 109.074195,37.9178001 105.931,37.9178001 C102.698,37.9178001 101.459,36.4818001 101.459,33.7494001 L101.459,27.2506001 L101.461884,27.0258853 C101.529372,24.4390811 102.787806,23.0740001 105.931,23.0740001 Z"],[14,"fill-rule","nonzero"],[12],[13],[2,"\\n "],[1,[32,3]],[2,"\\n "],[18,4,null],[2,"\\n "],[13],[2,"\\n "],[13],[2,"\\n\\n"]],"hasEval":false,"upvars":[]}',meta:{moduleName:"consul-ui/components/brand-loader/index.hbs"}}) -var n=Ember._setComponentTemplate(t,Ember._templateOnlyComponent()) -e.default=n})),define("consul-ui/components/certificate/index",["exports","@glimmer/component"],(function(e,t){var n,r,a,l -function s(e,t,n,r,a){var l={} -return Object.keys(r).forEach((function(e){l[e]=r[e]})),l.enumerable=!!l.enumerable,l.configurable=!!l.configurable,("value"in l||l.initializer)&&(l.writable=!0),l=n.slice().reverse().reduce((function(n,r){return r(e,t,n)||n}),l),a&&void 0!==l.initializer&&(l.value=l.initializer?l.initializer.call(a):void 0,l.initializer=void 0),void 0===l.initializer&&(Object.defineProperty(e,t,l),l=null),l}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const i=Ember.HTMLBars.template({id:"FAdEcz6O",block:'{"symbols":["@item","@name"],"statements":[[10,"div"],[14,0,"certificate"],[12],[2,"\\n "],[8,"copy-button",[],[["@value","@name"],[[32,1],[32,2]]],null],[2,"\\n "],[11,"button"],[16,0,[30,[36,1],["visibility",[30,[36,0],[[32,0,["show"]]," hide"," show"],null]],null]],[24,4,"button"],[4,[38,2],["click",[32,0,["setVisibility"]]],null],[12],[2,"\\n "],[13],[2,"\\n"],[6,[37,0],[[32,0,["show"]]],null,[["default","else"],[{"statements":[[2," "],[10,"code"],[12],[1,[32,1]],[13],[2,"\\n"]],"parameters":[]},{"statements":[[2," "],[10,"hr"],[12],[13],[2,"\\n"]],"parameters":[]}]]],[13]],"hasEval":false,"upvars":["if","concat","on"]}',meta:{moduleName:"consul-ui/components/certificate/index.hbs"}}) -let o=(n=Ember._tracked,r=Ember._action,a=class extends t.default{constructor(...e){var t,n,r,a -super(...e),t=this,n="show",a=this,(r=l)&&Object.defineProperty(t,n,{enumerable:r.enumerable,configurable:r.configurable,writable:r.writable,value:r.initializer?r.initializer.call(a):void 0})}setVisibility(){this.show=!this.show}},l=s(a.prototype,"show",[n],{configurable:!0,enumerable:!0,writable:!0,initializer:function(){return!1}}),s(a.prototype,"setVisibility",[r],Object.getOwnPropertyDescriptor(a.prototype,"setVisibility"),a.prototype),a) -e.default=o,Ember._setComponentTemplate(i,o)})),define("consul-ui/components/child-selector/index",["exports","ember-concurrency","block-slots"],(function(e,t,n){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const r=Ember.HTMLBars.template({id:"ounU18qJ",block:'{"symbols":["collection","item","&default","&attrs"],"statements":[[11,"div"],[16,0,[31,["child-selector ",[34,0],"-child-selector"]]],[17,4],[12],[2,"\\n"],[18,3,null],[2,"\\n"],[6,[37,11],[[30,[36,19],[[35,18]],null]],null,[["default"],[{"statements":[[2," "],[8,"yield-slot",[],[["@name"],["create"]],[["default"],[{"statements":[[18,3,null]],"parameters":[]}]]],[2,"\\n "],[10,"label"],[14,0,"type-text"],[12],[2,"\\n "],[10,"span"],[12],[8,"yield-slot",[],[["@name"],["label"]],[["default"],[{"statements":[[18,3,null]],"parameters":[]}]]],[13],[2,"\\n"],[6,[37,11],[[35,10]],null,[["default"],[{"statements":[[2," "],[8,"data-source",[],[["@src","@onchange"],[[30,[36,6],["/${partition}/${nspace}/${dc}/${type}",[30,[36,5],null,[["partition","nspace","dc","type"],[[35,4],[35,3],[35,2],[30,[36,1],[[35,0]],null]]]]],null],[30,[36,9],[[32,0],[30,[36,8],[[35,7]],null]],[["value"],["data"]]]]],null],[2,"\\n"]],"parameters":[]}]]],[2," "],[8,"data-collection",[],[["@type","@sort","@filters","@items"],[[34,0],"Name:asc",[30,[36,5],null,[["searchproperties"],[[30,[36,12],["Name"],null]]]],[34,13]]],[["default"],[{"statements":[[2,"\\n "],[8,"power-select",[],[["@searchEnabled","@search","@options","@loadingMessage","@searchMessage","@searchPlaceholder","@onOpen","@onClose","@onChange"],[true,[30,[36,9],[[32,0],[32,1,["search"]]],null],[30,[36,14],["Name:asc",[35,13]],null],"Loading...","No possible options",[34,15],[30,[36,9],[[32,0],[30,[36,8],[[35,10]],null],true],null],[30,[36,9],[[32,0],[30,[36,8],[[35,10]],null],false],null],[30,[36,9],[[32,0],"change","items[]",[35,16]],null]]],[["default"],[{"statements":[[2,"\\n "],[8,"yield-slot",[],[["@name","@params"],["option",[30,[36,17],[[32,2]],null]]],[["default"],[{"statements":[[18,3,null]],"parameters":[]}]]],[2,"\\n "]],"parameters":[2]}]]],[2,"\\n "]],"parameters":[1]}]]],[2,"\\n "],[13],[2,"\\n"]],"parameters":[]}]]],[6,[37,11],[[30,[36,20],[[35,16,["length"]],0],null]],null,[["default","else"],[{"statements":[[2," "],[8,"yield-slot",[],[["@name"],["set"]],[["default"],[{"statements":[[18,3,null]],"parameters":[]}]]],[2,"\\n"]],"parameters":[]},{"statements":[[2,"\\n"]],"parameters":[]}]]],[13]],"hasEval":false,"upvars":["type","pluralize","dc","nspace","partition","hash","uri","allOptions","mut","action","isOpen","if","array","options","sort-by","placeholder","items","block-params","disabled","not","gt"]}',meta:{moduleName:"consul-ui/components/child-selector/index.hbs"}}) -var a=Ember._setComponentTemplate(r,Ember.Component.extend(n.default,{onchange:function(){},tagName:"",error:function(){},type:"",dom:Ember.inject.service("dom"),formContainer:Ember.inject.service("form"),item:Ember.computed.alias("form.data"),selectedOptions:Ember.computed.alias("items"),init:function(){this._super(...arguments),this._listeners=this.dom.listeners(),this.form=this.formContainer.form(this.type),this.form.clear({Datacenter:this.dc,Namespace:this.nspace})},willDestroyElement:function(){this._super(...arguments),this._listeners.remove()},options:Ember.computed("selectedOptions.[]","allOptions.[]",(function(){let e=this.allOptions||[] -const t=this.selectedOptions||[] -return Ember.get(t,"length")>0&&(e=e.filter(e=>!t.findBy("ID",Ember.get(e,"ID")))),e})),save:(0,t.task)((function*(e,t,n=function(){}){const r=this.repo -try{e=yield r.persist(e),this.actions.change.apply(this,[{target:{name:"items[]",value:t}},t,e]),n()}catch(a){this.error({error:a})}})),actions:{reset:function(){this.form.clear({Datacenter:this.dc,Namespace:this.nspace,Partition:this.partition})},remove:function(e,t){const n=this.repo.getSlugKey(),r=Ember.get(e,n),a=t.findIndex((function(e){return Ember.get(e,n)===r})) -if(-1!==a)return t.removeAt(a,1) -this.onchange({target:this})},change:function(e,t,n){const r=this.dom.normalizeEvent(...arguments),a=t -switch(r.target.name){case"items[]":Ember.set(n,"CreateTime",(new Date).getTime()),a.pushObject(n),this.onchange({target:this})}}}})) -e.default=a})),define("consul-ui/components/code-editor/index",["exports"],(function(e){function t(e,t){var n=Object.keys(e) -if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e) -t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function n(e){for(var n=1;n{this.oninput(Ember.set(this,"value",e.target.wholeText))}),this.observer.observe(e,{attributes:!1,subtree:!0,childList:!1,characterData:!0}),Ember.set(this,"value",e.firstChild.wholeText)),Ember.set(this,"editor",this.helper.getEditor(this.element)),this.settings.findBySlug("code-editor").then(e=>{const t=this.modes,n=this.syntax -n&&(e=t.find((function(e){return e.name.toLowerCase()==n.toLowerCase()}))),e=e||t[0],this.setMode(e)})},didAppear:function(){this.editor.refresh()},actions:{change:function(e){this.settings.persist({"code-editor":e}),this.setMode(e)}}})) -e.default=s})),define("consul-ui/components/confirmation-alert/index",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const t=Ember.HTMLBars.template({id:"Ph3CAF0n",block:'{"symbols":["__arg0","__arg1","Actions","@onclick","&default","@name","&attrs"],"statements":[[18,5,null],[2,"\\n"],[8,"informed-action",[[24,0,"confirmation-alert warning"],[17,7]],[["@namedBlocksInfo"],[[30,[36,6],null,[["header","body","actions"],[0,0,1]]]]],[["default"],[{"statements":[[6,[37,5],[[30,[36,4],[[32,1],"header"],null]],null,[["default","else"],[{"statements":[[2,"\\n "],[8,"yield-slot",[],[["@name"],["header"]],[["default"],[{"statements":[[18,5,null]],"parameters":[]}]]],[2,"\\n "]],"parameters":[]},{"statements":[[6,[37,5],[[30,[36,4],[[32,1],"body"],null]],null,[["default","else"],[{"statements":[[2,"\\n "],[8,"yield-slot",[],[["@name"],["body"]],[["default"],[{"statements":[[18,5,null]],"parameters":[]}]]],[2,"\\n "]],"parameters":[]},{"statements":[[6,[37,5],[[30,[36,4],[[32,1],"actions"],null]],null,[["default"],[{"statements":[[6,[37,3],[[32,2]],null,[["default"],[{"statements":[[2,"\\n "],[8,[32,3,["Action"]],[[24,0,"dangerous"]],[[],[]],[["default"],[{"statements":[[2,"\\n "],[8,"yield-slot",[],[["@name","@params"],["confirm",[30,[36,2],[[30,[36,1],["action"],[["onclick","tabindex"],[[30,[36,0],[[32,0],[32,4]],null],"-1"]]]],null]]],[["default"],[{"statements":[[2,"\\n "],[18,5,null],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,[32,3,["Action"]],[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[8,"action",[],[["@for"],[[32,6]]],[["default"],[{"statements":[[2,"\\n Cancel\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[3]}]]]],"parameters":[]}]]]],"parameters":[]}]]]],"parameters":[]}]]]],"parameters":[1,2]}]]]],"hasEval":false,"upvars":["action","component","block-params","let","-is-named-block-invocation","if","hash"]}',meta:{moduleName:"consul-ui/components/confirmation-alert/index.hbs"}}) -var n=Ember._setComponentTemplate(t,Ember.Component.extend({tagName:""})) -e.default=n})),define("consul-ui/components/confirmation-dialog/index",["exports","block-slots"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const n=Ember.HTMLBars.template({id:"hLDc+Wit",block:'{"symbols":["&default","&attrs"],"statements":[[11,"div"],[16,0,[30,[36,2],["with-confirmation",[30,[36,1],[[35,0]," confirming",""],null]],null]],[17,2],[12],[2,"\\n"],[18,1,null],[2,"\\n"],[8,"yield-slot",[],[["@name","@params"],["action",[30,[36,4],[[30,[36,3],[[32,0],"confirm"],null],[30,[36,3],[[32,0],"cancel"],null]],null]]],[["default"],[{"statements":[[2,"\\n"],[6,[37,1],[[30,[36,7],[[35,6],[30,[36,5],[[35,0]],null]],null]],null,[["default"],[{"statements":[[2," "],[18,1,null],[2,"\\n"]],"parameters":[]}]]]],"parameters":[]}]]],[2,"\\n"],[8,"yield-slot",[],[["@name","@params"],["dialog",[30,[36,4],[[30,[36,3],[[32,0],"execute"],null],[30,[36,3],[[32,0],"cancel"],null],[35,9],[35,8]],null]]],[["default"],[{"statements":[[2,"\\n"],[6,[37,1],[[35,0]],null,[["default"],[{"statements":[[2," "],[18,1,null],[2,"\\n"]],"parameters":[]}]]]],"parameters":[]}]]],[2,"\\n"],[13]],"hasEval":false,"upvars":["confirming","if","concat","action","block-params","not","permanent","or","actionName","message"]}',meta:{moduleName:"consul-ui/components/confirmation-dialog/index.hbs"}}) -var r=Ember._setComponentTemplate(n,Ember.Component.extend(t.default,{tagName:"",message:"Are you sure?",confirming:!1,permanent:!1,actions:{cancel:function(){Ember.set(this,"confirming",!1)},execute:function(){Ember.set(this,"confirming",!1),this.sendAction("actionName",...this.arguments)},confirm:function(){const[e,...t]=arguments -Ember.set(this,"actionName",e),Ember.set(this,"arguments",t),Ember.set(this,"confirming",!0)}}})) -e.default=r})),define("consul-ui/components/consul/acl/disabled/index",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const t=Ember.HTMLBars.template({id:"GJrj4o1x",block:'{"symbols":[],"statements":[[8,"app-view",[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["header"]],[["default"],[{"statements":[[2,"\\n "],[10,"h1"],[12],[2,"\\n Tokens\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["content"]],[["default"],[{"statements":[[2,"\\n "],[8,"empty-state",[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["header"]],[["default"],[{"statements":[[2,"\\n "],[10,"h2"],[12],[2,"Welcome to ACLs"],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["body"]],[["default"],[{"statements":[[2,"\\n "],[10,"p"],[12],[2,"\\n ACLs are not enabled in this Consul cluster. We strongly encourage the use of ACLs in production environments for the best security practices.\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["actions"]],[["default"],[{"statements":[[2,"\\n "],[10,"li"],[14,0,"docs-link"],[12],[2,"\\n "],[10,"a"],[15,6,[31,[[30,[36,0],["CONSUL_DOCS_URL"],null],"/acl/index.html"]]],[14,"rel","noopener noreferrer"],[14,"target","_blank"],[12],[2,"Read the documentation"],[13],[2,"\\n "],[13],[2,"\\n "],[10,"li"],[14,0,"learn-link"],[12],[2,"\\n "],[10,"a"],[15,6,[31,[[30,[36,0],["CONSUL_DOCS_LEARN_URL"],null],"/consul/security-networking/production-acls"]]],[14,"rel","noopener noreferrer"],[14,"target","_blank"],[12],[2,"Follow the guide"],[13],[2,"\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[]}]]],[2,"\\n\\n"]],"hasEval":false,"upvars":["env"]}',meta:{moduleName:"consul-ui/components/consul/acl/disabled/index.hbs"}}) -var n=Ember._setComponentTemplate(t,Ember._templateOnlyComponent()) -e.default=n})),define("consul-ui/components/consul/acl/selector/index",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const t=Ember.HTMLBars.template({id:"CGsTmKTv",block:'{"symbols":["@dc"],"statements":[[10,"li"],[14,0,"acls-separator"],[14,"role","separator"],[12],[2,"\\n Access Controls\\n"],[6,[37,1],[[30,[36,3],[[30,[36,2],["use acls"],null]],null]],null,[["default"],[{"statements":[[2," "],[11,"span"],[4,[38,5],["ACLs are not currently enabled in this cluster"],null],[12],[13],[2,"\\n"]],"parameters":[]}]]],[13],[2,"\\n"],[10,"li"],[15,0,[30,[36,1],[[30,[36,0],["dc.acls.tokens",[32,1,["Name"]]],null],"is-active"],null]],[12],[2,"\\n "],[10,"a"],[15,6,[30,[36,4],["dc.acls.tokens",[32,1,["Name"]]],null]],[12],[2,"\\n Tokens\\n "],[13],[2,"\\n"],[13],[2,"\\n"],[6,[37,1],[[30,[36,2],["read acls"],null]],null,[["default","else"],[{"statements":[[10,"li"],[15,0,[30,[36,1],[[30,[36,0],["dc.acls.policies",[32,1,["Name"]]],null],"is-active"],null]],[12],[2,"\\n "],[10,"a"],[15,6,[30,[36,4],["dc.acls.policies",[32,1,["Name"]]],null]],[12],[2,"\\n Policies\\n "],[13],[2,"\\n"],[13],[2,"\\n"],[10,"li"],[15,0,[30,[36,1],[[30,[36,0],["dc.acls.roles",[32,1,["Name"]]],null],"is-active"],null]],[12],[2,"\\n "],[10,"a"],[15,6,[30,[36,4],["dc.acls.roles",[32,1,["Name"]]],null]],[12],[2,"\\n Roles\\n "],[13],[2,"\\n"],[13],[2,"\\n"],[10,"li"],[15,0,[30,[36,1],[[30,[36,0],["dc.acls.auth-methods",[32,1,["Name"]]],null],"is-active"],null]],[12],[2,"\\n "],[10,"a"],[15,6,[30,[36,4],["dc.acls.auth-methods",[32,1,["Name"]]],null]],[12],[2,"\\n Auth Methods\\n "],[13],[2,"\\n"],[13],[2,"\\n"]],"parameters":[]},{"statements":[[6,[37,1],[[30,[36,3],[[30,[36,2],["use acls"],null]],null]],null,[["default"],[{"statements":[[10,"li"],[15,0,[30,[36,1],[[30,[36,0],["dc.acls.policies",[32,1,["Name"]]],null],"is-active"],null]],[12],[2,"\\n "],[10,"span"],[12],[2,"\\n Policies\\n "],[13],[2,"\\n"],[13],[2,"\\n"],[10,"li"],[15,0,[30,[36,1],[[30,[36,0],["dc.acls.roles",[32,1,["Name"]]],null],"is-active"],null]],[12],[2,"\\n "],[10,"span"],[12],[2,"\\n Roles\\n "],[13],[2,"\\n"],[13],[2,"\\n"],[10,"li"],[15,0,[30,[36,1],[[30,[36,0],["dc.acls.auth-methods",[32,1,["Name"]]],null],"is-active"],null]],[12],[2,"\\n "],[10,"span"],[12],[2,"\\n Auth Methods\\n "],[13],[2,"\\n"],[13],[2,"\\n"]],"parameters":[]}]]]],"parameters":[]}]]],[2,"\\n"]],"hasEval":false,"upvars":["is-href","if","can","not","href-to","tooltip"]}',meta:{moduleName:"consul-ui/components/consul/acl/selector/index.hbs"}}) -var n=Ember._setComponentTemplate(t,Ember._templateOnlyComponent()) -e.default=n})),define("consul-ui/components/consul/auth-method/binding-list/index",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const t=Ember.HTMLBars.template({id:"9xphbQEM",block:'{"symbols":["@item"],"statements":[[10,"div"],[14,0,"consul-auth-method-binding-list"],[12],[2,"\\n "],[10,"h2"],[12],[1,[32,1,["BindName"]]],[13],[2,"\\n "],[10,"dl"],[12],[2,"\\n "],[10,"dt"],[14,0,"type"],[12],[1,[30,[36,0],["models.binding-rule.BindType"],null]],[13],[2,"\\n "],[10,"dd"],[12],[2,"\\n "],[1,[32,1,["BindType"]]],[2,"\\n "],[10,"span"],[12],[2,"\\n"],[6,[37,2],[[30,[36,1],[[32,1,["BindType"]],"service"],null]],null,[["default","else"],[{"statements":[[2," "],[8,"tooltip",[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[1,[30,[36,0],["components.consul.auth-method.binding-list.bind-type.service"],null]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[]},{"statements":[[6,[37,2],[[30,[36,1],[[32,1,["BindType"]],"node"],null]],null,[["default","else"],[{"statements":[[2," "],[8,"tooltip",[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[1,[30,[36,0],["components.consul.auth-method.binding-list.bind-type.node"],null]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[]},{"statements":[[6,[37,2],[[30,[36,1],[[32,1,["BindType"]],"role"],null]],null,[["default"],[{"statements":[[2," "],[8,"tooltip",[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[1,[30,[36,0],["components.consul.auth-method.binding-list.bind-type.role"],null]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[]}]]]],"parameters":[]}]]]],"parameters":[]}]]],[2," "],[13],[2,"\\n "],[13],[2,"\\n "],[10,"dt"],[12],[1,[30,[36,0],["models.binding-rule.Selector"],null]],[13],[2,"\\n "],[10,"dd"],[12],[10,"code"],[12],[1,[32,1,["Selector"]]],[13],[13],[2,"\\n "],[10,"dt"],[12],[1,[30,[36,0],["models.binding-rule.Description"],null]],[13],[2,"\\n "],[10,"dd"],[12],[1,[32,1,["Description"]]],[13],[2,"\\n "],[13],[2,"\\n"],[13]],"hasEval":false,"upvars":["t","eq","if"]}',meta:{moduleName:"consul-ui/components/consul/auth-method/binding-list/index.hbs"}}) -var n=Ember._setComponentTemplate(t,Ember._templateOnlyComponent()) -e.default=n})),define("consul-ui/components/consul/auth-method/list/index",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const t=Ember.HTMLBars.template({id:"Xxbv7lp+",block:'{"symbols":["item","@items"],"statements":[[8,"list-collection",[[24,0,"consul-auth-method-list"]],[["@items"],[[32,2]]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["header"]],[["default"],[{"statements":[[2,"\\n"],[6,[37,2],[[30,[36,1],[[32,1,["DisplayName"]],""],null]],null,[["default","else"],[{"statements":[[2," "],[10,"a"],[15,6,[30,[36,0],["dc.acls.auth-methods.show",[32,1,["Name"]]],null]],[12],[2,"\\n "],[1,[32,1,["DisplayName"]]],[2,"\\n "],[13],[2,"\\n"]],"parameters":[]},{"statements":[[2," "],[10,"a"],[15,6,[30,[36,0],["dc.acls.auth-methods.show",[32,1,["Name"]]],null]],[12],[2,"\\n "],[1,[32,1,["Name"]]],[2,"\\n "],[13],[2,"\\n"]],"parameters":[]}]]],[2," "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["details"]],[["default"],[{"statements":[[2,"\\n "],[8,"consul/auth-method/type",[],[["@item"],[[32,1]]],null],[2,"\\n"],[6,[37,2],[[30,[36,1],[[32,1,["DisplayName"]],""],null]],null,[["default"],[{"statements":[[2," "],[10,"span"],[12],[1,[32,1,["Name"]]],[13],[2,"\\n"]],"parameters":[]}]]],[6,[37,2],[[30,[36,3],[[32,1,["TokenLocality"]],"global"],null]],null,[["default"],[{"statements":[[2," "],[10,"span"],[14,0,"locality"],[12],[2,"creates global tokens"],[13],[2,"\\n"]],"parameters":[]}]]],[6,[37,2],[[32,1,["MaxTokenTTL"]]],null,[["default"],[{"statements":[[2," "],[10,"dl"],[14,0,"ttl"],[12],[2,"\\n "],[10,"dt"],[12],[2,"\\n "],[8,"tooltip",[],[[],[]],[["default"],[{"statements":[[2,"\\n Maximum Time to Live: the maximum life of any token created by this auth method\\n "]],"parameters":[]}]]],[2,"\\n "],[13],[2,"\\n "],[10,"dd"],[12],[1,[32,1,["MaxTokenTTL"]]],[13],[2,"\\n "],[13],[2,"\\n"]],"parameters":[]}]]],[2," "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[1]}]]],[2,"\\n"]],"hasEval":false,"upvars":["href-to","not-eq","if","eq"]}',meta:{moduleName:"consul-ui/components/consul/auth-method/list/index.hbs"}}) -var n=Ember._setComponentTemplate(t,Ember._templateOnlyComponent()) -e.default=n})),define("consul-ui/components/consul/auth-method/nspace-list/index",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const t=Ember.HTMLBars.template({id:"Ej9L7VaQ",block:'{"symbols":["item","@items"],"statements":[[10,"div"],[14,0,"consul-auth-method-nspace-list"],[12],[2,"\\n "],[10,"table"],[12],[2,"\\n "],[10,"thead"],[12],[2,"\\n "],[10,"tr"],[12],[2,"\\n "],[10,"td"],[12],[1,[30,[36,0],["models.auth-method.Selector"],null]],[13],[2,"\\n "],[10,"td"],[12],[1,[30,[36,0],["models.auth-method.BindNamespace"],null]],[13],[2,"\\n "],[13],[2,"\\n "],[13],[2,"\\n "],[10,"tbody"],[12],[2,"\\n"],[6,[37,2],[[30,[36,1],[[30,[36,1],[[32,2]],null]],null]],null,[["default"],[{"statements":[[2," "],[10,"tr"],[12],[2,"\\n "],[10,"td"],[12],[1,[32,1,["Selector"]]],[13],[2,"\\n "],[10,"td"],[12],[1,[32,1,["BindNamespace"]]],[13],[2,"\\n "],[13],[2,"\\n"]],"parameters":[1]}]]],[2," "],[13],[2,"\\n "],[13],[2,"\\n"],[13],[2,"\\n\\n"]],"hasEval":false,"upvars":["t","-track-array","each"]}',meta:{moduleName:"consul-ui/components/consul/auth-method/nspace-list/index.hbs"}}) -var n=Ember._setComponentTemplate(t,Ember._templateOnlyComponent()) -e.default=n})),define("consul-ui/components/consul/auth-method/search-bar/index",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const t=Ember.HTMLBars.template({id:"KCBFWnGq",block:'{"symbols":["__arg0","__arg1","search","components","Optgroup","Option","selectable","search","components","Optgroup","Option","option","components","Optgroup","Option","search","components","Optgroup","Option","prop","search","key","value","@sort","@filter","@onsearch","@search","&attrs"],"statements":[[8,"search-bar",[[24,0,"consul-auth-method-search-bar"],[17,28]],[["@filter","@namedBlocksInfo"],[[32,25],[30,[36,15],null,[["status","search","filter","sort"],[1,1,1,1]]]]],[["default"],[{"statements":[[6,[37,8],[[30,[36,7],[[32,1],"status"],null]],null,[["default","else"],[{"statements":[[6,[37,6],[[32,2]],null,[["default"],[{"statements":[[2,"\\n\\n"],[6,[37,6],[[30,[36,0],[[30,[36,10],["components.consul.auth-method.search-bar.",[32,21,["status","key"]],".name"],null]],[["default"],[[30,[36,4],[[30,[36,10],["common.search.",[32,21,["status","key"]]],null],[30,[36,10],["common.consul.",[32,21,["status","key"]]],null]],null]]]],[30,[36,0],[[30,[36,10],["components.consul.auth-method.search-bar.",[32,21,["status","key"]],".options.",[32,21,["status","value"]]],null]],[["default"],[[30,[36,4],[[30,[36,10],["common.search.",[32,21,["status","value"]]],null],[30,[36,10],["common.consul.",[32,21,["status","value"]]],null],[30,[36,10],["common.brand.",[32,21,["status","value"]]],null]],null]]]]],null,[["default"],[{"statements":[[2," "],[8,[32,21,["RemoveFilter"]],[[16,"aria-label",[30,[36,0],["common.ui.remove"],[["item"],[[30,[36,10],[[32,22]," ",[32,23]],null]]]]]],[[],[]],[["default"],[{"statements":[[2,"\\n "],[10,"dl"],[12],[2,"\\n "],[10,"dt"],[12],[1,[32,22]],[13],[2,"\\n "],[10,"dd"],[12],[1,[32,23]],[13],[2,"\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[22,23]}]]],[2,"\\n "]],"parameters":[21]}]]]],"parameters":[]},{"statements":[[6,[37,8],[[30,[36,7],[[32,1],"search"],null]],null,[["default","else"],[{"statements":[[6,[37,6],[[32,2]],null,[["default"],[{"statements":[[2,"\\n "],[8,[32,16,["Search"]],[],[["@onsearch","@value","@placeholder"],[[30,[36,3],[[32,0],[32,26]],null],[32,27],[30,[36,0],["common.search.search"],null]]],[["default"],[{"statements":[[2,"\\n "],[8,[32,16,["Select"]],[[24,0,"type-search-properties"]],[["@position","@onchange","@multiple","@required"],["right",[30,[36,3],[[32,0],[32,25,["searchproperty","change"]]],null],true,true]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["selected"]],[["default"],[{"statements":[[2,"\\n "],[10,"span"],[12],[2,"\\n "],[1,[30,[36,0],["common.search.searchproperty"],null]],[2,"\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["options"]],[["default"],[{"statements":[[2,"\\n"],[6,[37,6],[[32,17,["Optgroup"]],[32,17,["Option"]]],null,[["default"],[{"statements":[[6,[37,12],[[30,[36,11],[[30,[36,11],[[32,25,["searchproperty","default"]]],null]],null]],null,[["default"],[{"statements":[[2," "],[8,[32,19],[],[["@value","@selected"],[[32,20],[30,[36,9],[[32,20],[32,25,["searchproperty","value"]]],null]]],[["default"],[{"statements":[[2,"\\n "],[1,[30,[36,0],[[30,[36,10],["common.consul.",[30,[36,14],[[32,20]],null]],null]],null]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[20]}]]]],"parameters":[18,19]}]]],[2," "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[17]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[16]}]]]],"parameters":[]},{"statements":[[6,[37,8],[[30,[36,7],[[32,1],"filter"],null]],null,[["default","else"],[{"statements":[[6,[37,6],[[32,2]],null,[["default"],[{"statements":[[2,"\\n "],[8,[32,8,["Select"]],[[24,0,"type-kind"]],[["@position","@onchange","@multiple"],["left",[30,[36,3],[[32,0],[32,25,["kind","change"]]],null],true]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["selected"]],[["default"],[{"statements":[[2,"\\n "],[10,"span"],[12],[2,"\\n "],[1,[30,[36,0],["components.consul.auth-method.search-bar.kind.name"],null]],[2,"\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["options"]],[["default"],[{"statements":[[2,"\\n"],[6,[37,6],[[32,13,["Optgroup"]],[32,13,["Option"]]],null,[["default"],[{"statements":[[2," "],[8,[32,15],[[24,0,"kubernetes"]],[["@value","@selected"],["kubernetes",[30,[36,9],["kubernetes",[32,25,["kind","value"]]],null]]],[["default"],[{"statements":[[2,"Kubernetes"]],"parameters":[]}]]],[2,"\\n "],[8,[32,15],[[24,0,"jwt"]],[["@value","@selected"],["jwt",[30,[36,9],["jwt",[32,25,["kind","value"]]],null]]],[["default"],[{"statements":[[2,"JWT"]],"parameters":[]}]]],[2,"\\n"],[6,[37,8],[[30,[36,13],["CONSUL_SSO_ENABLED"],null]],null,[["default"],[{"statements":[[2," "],[8,[32,15],[[24,0,"oidc"]],[["@value","@selected"],["oidc",[30,[36,9],["oidc",[32,25,["kind","value"]]],null]]],[["default"],[{"statements":[[2,"OIDC"]],"parameters":[]}]]],[2,"\\n"]],"parameters":[]}]]]],"parameters":[14,15]}]]],[2," "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[13]}]]],[2,"\\n "],[8,[32,8,["Select"]],[[24,0,"type-locality"]],[["@position","@onchange","@multiple"],["left",[30,[36,3],[[32,0],[32,25,["source","change"]]],null],true]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["selected"]],[["default"],[{"statements":[[2,"\\n "],[10,"span"],[12],[2,"\\n "],[1,[30,[36,0],["components.consul.auth-method.search-bar.locality.name"],null]],[2,"\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["options"]],[["default"],[{"statements":[[2,"\\n"],[6,[37,6],[[32,9,["Optgroup"]],[32,9,["Option"]]],null,[["default"],[{"statements":[[6,[37,12],[[30,[36,11],[[30,[36,11],[[30,[36,4],["local","global"],null]],null]],null]],null,[["default"],[{"statements":[[2," "],[8,[32,11],[[16,0,[31,[[32,12]]]]],[["@value","@selected"],[[32,12],[30,[36,9],[[32,12],[32,25,["types"]]],null]]],[["default"],[{"statements":[[2,"\\n "],[1,[30,[36,0],[[30,[36,10],["components.consul.auth-method.search-bar.locality.options.",[32,12]],null]],null]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[12]}]]]],"parameters":[10,11]}]]],[2," "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[9]}]]],[2,"\\n "]],"parameters":[8]}]]]],"parameters":[]},{"statements":[[6,[37,8],[[30,[36,7],[[32,1],"sort"],null]],null,[["default"],[{"statements":[[6,[37,6],[[32,2]],null,[["default"],[{"statements":[[2,"\\n "],[8,[32,3,["Select"]],[[24,0,"type-sort"]],[["@position","@onchange","@multiple","@required"],["right",[30,[36,3],[[32,0],[32,24,["change"]]],null],false,true]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["selected"]],[["default"],[{"statements":[[2,"\\n "],[10,"span"],[12],[2,"\\n"],[6,[37,6],[[30,[36,5],[[30,[36,4],[[30,[36,4],["MethodName:asc",[30,[36,0],["common.sort.alpha.asc"],null]],null],[30,[36,4],["MethodName:desc",[30,[36,0],["common.sort.alpha.desc"],null]],null],[30,[36,4],["TokenTTL:desc",[30,[36,0],["common.sort.duration.asc"],null]],null],[30,[36,4],["TokenTTL:asc",[30,[36,0],["common.sort.duration.desc"],null]],null]],null]],null]],null,[["default"],[{"statements":[[2," "],[1,[30,[36,2],[[32,7],[32,24,["value"]]],null]],[2,"\\n"]],"parameters":[7]}]]],[2," "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["options"]],[["default"],[{"statements":[[2,"\\n"],[6,[37,6],[[32,4,["Optgroup"]],[32,4,["Option"]]],null,[["default"],[{"statements":[[2," "],[8,[32,5],[],[["@label"],[[30,[36,0],["common.ui.name"],null]]],[["default"],[{"statements":[[2,"\\n "],[8,[32,6],[],[["@value","@selected"],["MethodName:asc",[30,[36,1],["MethodName:asc",[32,24,["value"]]],null]]],[["default"],[{"statements":[[1,[30,[36,0],["common.sort.alpha.asc"],null]]],"parameters":[]}]]],[2,"\\n "],[8,[32,6],[],[["@value","@selected"],["MethodName:desc",[30,[36,1],["MethodName:desc",[32,24,["value"]]],null]]],[["default"],[{"statements":[[1,[30,[36,0],["common.sort.alpha.desc"],null]]],"parameters":[]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,[32,5],[],[["@label"],[[30,[36,0],["common.ui.maxttl"],null]]],[["default"],[{"statements":[[2,"\\n "],[8,[32,6],[],[["@value","@selected"],["TokenTTL:desc",[30,[36,1],["TokenTTL:desc",[32,24,["value"]]],null]]],[["default"],[{"statements":[[1,[30,[36,0],["common.sort.duration.asc"],null]]],"parameters":[]}]]],[2,"\\n "],[8,[32,6],[],[["@value","@selected"],["TokenTTL:asc",[30,[36,1],["TokenTTL:asc",[32,24,["value"]]],null]]],[["default"],[{"statements":[[1,[30,[36,0],["common.sort.duration.desc"],null]]],"parameters":[]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[5,6]}]]],[2," "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[4]}]]],[2,"\\n "]],"parameters":[3]}]]]],"parameters":[]}]]]],"parameters":[]}]]]],"parameters":[]}]]]],"parameters":[]}]]]],"parameters":[1,2]}]]],[2,"\\n"]],"hasEval":false,"upvars":["t","eq","get","action","array","from-entries","let","-is-named-block-invocation","if","contains","concat","-track-array","each","env","lowercase","hash"]}',meta:{moduleName:"consul-ui/components/consul/auth-method/search-bar/index.hbs"}}) -var n=Ember._setComponentTemplate(t,Ember._templateOnlyComponent()) -e.default=n})),define("consul-ui/components/consul/auth-method/type/index",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const t=Ember.HTMLBars.template({id:"ikz01KlN",block:'{"symbols":["@item"],"statements":[[10,"span"],[15,0,[31,["consul-auth-method-type ",[32,1,["Type"]]]]],[12],[2,"\\n "],[1,[30,[36,1],[[30,[36,0],["common.brand.",[32,1,["Type"]]],null]],null]],[2,"\\n"],[13],[2,"\\n"]],"hasEval":false,"upvars":["concat","t"]}',meta:{moduleName:"consul-ui/components/consul/auth-method/type/index.hbs"}}) -var n=Ember._setComponentTemplate(t,Ember._templateOnlyComponent()) -e.default=n})),define("consul-ui/components/consul/auth-method/view/index",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const t=Ember.HTMLBars.template({id:"Fb1QS0ut",block:'{"symbols":["entry","entry","scope","bond","uri","value","bond","config","value","item","jtem","value","value","@item"],"statements":[[2," "],[10,"div"],[14,0,"consul-auth-method-view"],[12],[2,"\\n"],[6,[37,2],[[30,[36,1],[[32,14,["Type"]],"kubernetes"],null]],null,[["default","else"],[{"statements":[[2," "],[10,"dl"],[12],[2,"\\n "],[10,"dt"],[12],[1,[30,[36,7],["models.auth-method.Type"],null]],[13],[2,"\\n "],[10,"dd"],[12],[8,"consul/auth-method/type",[],[["@item"],[[32,14]]],null],[13],[2,"\\n\\n"],[6,[37,6],[[30,[36,5],[[30,[36,5],[[30,[36,10],["MaxTokenTTL","TokenLocality","DisplayName","Description"],null]],null]],null]],null,[["default"],[{"statements":[[6,[37,2],[[30,[36,3],[[32,14],[32,13]],null]],null,[["default"],[{"statements":[[2," "],[10,"dt"],[12],[1,[30,[36,7],[[30,[36,9],["models.auth-method.",[32,13]],null]],null]],[13],[2,"\\n "],[10,"dd"],[12],[1,[30,[36,3],[[32,14],[32,13]],null]],[13],[2,"\\n"]],"parameters":[]}]]]],"parameters":[13]}]]],[6,[37,2],[[32,14,["Config","Host"]]],null,[["default"],[{"statements":[[2," "],[10,"dt"],[12],[1,[30,[36,7],["models.auth-method.Config.Host"],null]],[13],[2,"\\n "],[10,"dd"],[12],[2,"\\n "],[8,"copy-button",[],[["@value","@name"],[[32,14,["Config","Host"]],[30,[36,7],["models.auth-method.Config.Host"],null]]],null],[2,"\\n "],[10,"span"],[12],[1,[32,14,["Config","Host"]]],[13],[2,"\\n "],[13],[2,"\\n"]],"parameters":[]}]]],[6,[37,2],[[32,14,["Config","CACert"]]],null,[["default"],[{"statements":[[2," "],[10,"dt"],[12],[1,[30,[36,7],["models.auth-method.Config.CACert"],null]],[13],[2,"\\n "],[10,"dd"],[12],[2,"\\n "],[8,"certificate",[],[["@item","@name"],[[32,14,["Config","CACert"]],[30,[36,7],["models.auth-method.Config.CACert"],null]]],null],[2,"\\n "],[13],[2,"\\n"]],"parameters":[]}]]],[6,[37,2],[[32,14,["Config","ServiceAccountJWT"]]],null,[["default"],[{"statements":[[2," "],[10,"dt"],[12],[1,[30,[36,7],["models.auth-method.Config.ServiceAccountJWT"],null]],[13],[2,"\\n "],[10,"dd"],[12],[2,"\\n "],[8,"copy-button",[],[["@value","@name"],[[32,14,["Config","ServiceAccountJWT"]],[30,[36,7],["models.auth-method.Config.ServiceAccountJWT"],null]]],null],[2,"\\n "],[10,"span"],[12],[2,"\\n "],[1,[32,14,["Config","ServiceAccountJWT"]]],[2,"\\n "],[13],[2,"\\n "],[13],[2,"\\n"]],"parameters":[]}]]],[2," "],[13],[2,"\\n"]],"parameters":[]},{"statements":[[2," "],[10,"section"],[14,0,"meta"],[12],[2,"\\n "],[10,"dl"],[12],[2,"\\n "],[10,"dt"],[12],[2,"Type"],[13],[2,"\\n "],[10,"dd"],[12],[2,"\\n "],[8,"consul/auth-method/type",[],[["@item"],[[32,14]]],null],[2,"\\n "],[13],[2,"\\n\\n"],[6,[37,6],[[30,[36,5],[[30,[36,5],[[30,[36,10],["MaxTokenTTL","TokenLocality","DisplayName","Description"],null]],null]],null]],null,[["default"],[{"statements":[[6,[37,2],[[30,[36,3],[[32,14],[32,12]],null]],null,[["default"],[{"statements":[[2,"\\n "],[10,"dt"],[12],[1,[30,[36,7],[[30,[36,9],["models.auth-method.",[32,12]],null]],null]],[13],[2,"\\n "],[10,"dd"],[12],[1,[30,[36,3],[[32,14],[32,12]],null]],[13],[2,"\\n\\n"]],"parameters":[]}]]]],"parameters":[12]}]]],[2,"\\n"],[6,[37,2],[[30,[36,1],[[32,14,["Type"]],"aws-iam"],null]],null,[["default","else"],[{"statements":[[2,"\\n"],[6,[37,12],[[32,14,["Config"]]],null,[["default"],[{"statements":[[6,[37,6],[[30,[36,5],[[30,[36,5],[[30,[36,10],["BoundIAMPrincipalARNs","EnableIAMEntityDetails","IAMEntityTags","IAMEndpoint","MaxRetries","STSEndpoint","STSRegion","AllowedSTSHeaderValues","ServerIDHeaderValue"],null]],null]],null]],null,[["default"],[{"statements":[[6,[37,2],[[30,[36,3],[[32,8],[32,9]],null]],null,[["default"],[{"statements":[[2,"\\n "],[10,"dt"],[12],[1,[30,[36,7],[[30,[36,9],["models.auth-method.",[32,9]],null]],null]],[13],[2,"\\n "],[10,"dd"],[12],[2,"\\n"],[6,[37,12],[[30,[36,3],[[32,8],[32,9]],null]],null,[["default"],[{"statements":[[6,[37,2],[[30,[36,11],[[32,10]],null]],null,[["default","else"],[{"statements":[[2," "],[10,"ul"],[12],[2,"\\n"],[6,[37,6],[[30,[36,5],[[30,[36,5],[[32,10]],null]],null]],null,[["default"],[{"statements":[[2," "],[10,"li"],[12],[2,"\\n "],[10,"span"],[12],[1,[32,11]],[13],[2,"\\n "],[13],[2,"\\n"]],"parameters":[11]}]]],[2," "],[13],[2,"\\n"]],"parameters":[]},{"statements":[[2," "],[1,[32,10]],[2,"\\n"]],"parameters":[]}]]]],"parameters":[10]}]]],[2," "],[13],[2,"\\n\\n"]],"parameters":[]}]]]],"parameters":[9]}]]],[2,"\\n"]],"parameters":[8]}]]],[2,"\\n"]],"parameters":[]},{"statements":[[6,[37,2],[[30,[36,1],[[32,14,["Type"]],"jwt"],null]],null,[["default","else"],[{"statements":[[6,[37,2],[[32,14,["Config","JWKSURL"]]],null,[["default"],[{"statements":[[2," "],[10,"dt"],[12],[1,[30,[36,7],["models.auth-method.Config.JWKSURL"],null]],[13],[2,"\\n "],[10,"dd"],[12],[2,"\\n "],[8,"copy-button",[],[["@value","@name"],[[32,14,["Config","JWKSURL"]],[30,[36,7],["models.auth-method.Config.JWKSURL"],null]]],null],[2,"\\n "],[10,"span"],[12],[1,[32,14,["Config","JWKSURL"]]],[13],[2,"\\n "],[13],[2,"\\n "],[10,"dt"],[12],[1,[30,[36,7],["models.auth-method.Config.JWKSCACert"],null]],[13],[2,"\\n "],[10,"dd"],[12],[2,"\\n "],[8,"certificate",[],[["@item","@name"],[[32,14,["Config","JWKSCACert"]],[30,[36,7],["models.auth-method.Config.JWKSCACert"],null]]],null],[2,"\\n "],[13],[2,"\\n"]],"parameters":[]}]]],[6,[37,2],[[32,14,["Config","JWTValidationPubKeys"]]],null,[["default"],[{"statements":[[2," "],[10,"dt"],[12],[1,[30,[36,7],["models.auth-method.Config.JWTValidationPubKeys"],null]],[13],[2,"\\n "],[10,"dd"],[12],[2,"\\n "],[8,"certificate",[],[["@item","@name"],[[32,14,["Config","JWTValidationPubKeys"]],[30,[36,7],["models.auth-method.Config.JWTValidationPubKeys"],null]]],null],[2,"\\n "],[13],[2,"\\n"]],"parameters":[]}]]],[6,[37,2],[[32,14,["Config","OIDCDiscoveryURL"]]],null,[["default"],[{"statements":[[2," "],[10,"dt"],[12],[1,[30,[36,7],["models.auth-method.Config.OIDCDiscoveryURL"],null]],[13],[2,"\\n "],[10,"dd"],[12],[2,"\\n "],[8,"copy-button",[],[["@value","@name"],[[32,14,["Config","OIDCDiscoveryURL"]],[30,[36,7],["models.auth-method.Config.OIDCDiscoveryURL"],null]]],null],[2,"\\n "],[10,"span"],[12],[1,[32,14,["Config","OIDCDiscoveryURL"]]],[13],[2,"\\n "],[13],[2,"\\n"]],"parameters":[]}]]],[6,[37,2],[[32,14,["Config","JWTSupportedAlgs"]]],null,[["default"],[{"statements":[[2," "],[10,"dt"],[12],[1,[30,[36,7],["models.auth-method.Config.JWTSupportedAlgs"],null]],[13],[2,"\\n "],[10,"dd"],[12],[1,[30,[36,8],[", ",[32,14,["Config","JWTSupportedAlgs"]]],null]],[13],[2,"\\n"]],"parameters":[]}]]],[6,[37,2],[[32,14,["Config","BoundAudiences"]]],null,[["default"],[{"statements":[[2," "],[10,"dt"],[12],[1,[30,[36,7],["models.auth-method.Config.BoundAudiences"],null]],[13],[2,"\\n "],[10,"dd"],[12],[2,"\\n "],[10,"ul"],[12],[2,"\\n"],[6,[37,6],[[30,[36,5],[[30,[36,5],[[32,14,["Config","BoundAudiences"]]],null]],null]],null,[["default"],[{"statements":[[2," "],[10,"li"],[12],[2,"\\n "],[10,"span"],[12],[1,[32,7]],[13],[2,"\\n "],[13],[2,"\\n"]],"parameters":[7]}]]],[2," "],[13],[2,"\\n "],[13],[2,"\\n"]],"parameters":[]}]]],[6,[37,6],[[30,[36,5],[[30,[36,5],[[30,[36,10],["BoundIssuer","ExpirationLeeway","NotBeforeLeeway","ClockSkewLeeway"],null]],null]],null]],null,[["default"],[{"statements":[[6,[37,2],[[30,[36,3],[[32,14,["Config"]],[32,6]],null]],null,[["default"],[{"statements":[[2," "],[10,"dt"],[12],[1,[30,[36,7],[[30,[36,9],["models.auth-method.Config.",[32,6]],null]],null]],[13],[2,"\\n "],[10,"dd"],[12],[1,[30,[36,3],[[32,14,["Config"]],[32,6]],null]],[13],[2,"\\n"]],"parameters":[]}]]]],"parameters":[6]}]]]],"parameters":[]},{"statements":[[6,[37,2],[[30,[36,1],[[32,14,["Type"]],"oidc"],null]],null,[["default"],[{"statements":[[6,[37,2],[[32,14,["Config","OIDCDiscoveryURL"]]],null,[["default"],[{"statements":[[2," "],[10,"dt"],[12],[1,[30,[36,7],["models.auth-method.Config.OIDCDiscoveryURL"],null]],[13],[2,"\\n "],[10,"dd"],[12],[2,"\\n "],[8,"copy-button",[],[["@value","@name"],[[32,14,["Config","OIDCDiscoveryURL"]],[30,[36,7],["models.auth-method.Config.OIDCDiscoveryURL"],null]]],null],[2,"\\n "],[10,"span"],[12],[1,[32,14,["Config","OIDCDiscoveryURL"]]],[13],[2,"\\n "],[13],[2,"\\n"]],"parameters":[]}]]],[6,[37,2],[[32,14,["Config","OIDCDiscoveryCACert"]]],null,[["default"],[{"statements":[[2," "],[10,"dt"],[12],[1,[30,[36,7],["models.auth-method.Config.OIDCDiscoveryCACert"],null]],[13],[2,"\\n "],[10,"dd"],[12],[2,"\\n "],[8,"certificate",[],[["@item","@name"],[[32,14,["Config","OIDCDiscoveryCACert"]],[30,[36,7],["models.auth-method.Config.OIDCDiscoveryCACert"],null]]],null],[2,"\\n "],[13],[2,"\\n"]],"parameters":[]}]]],[6,[37,2],[[32,14,["Config","OIDCClientID"]]],null,[["default"],[{"statements":[[2," "],[10,"dt"],[12],[1,[30,[36,7],["models.auth-method.Config.OIDCClientID"],null]],[13],[2,"\\n "],[10,"dd"],[12],[1,[32,14,["Config","OIDCClientID"]]],[13],[2,"\\n"]],"parameters":[]}]]],[6,[37,2],[[32,14,["Config","OIDCClientSecret"]]],null,[["default"],[{"statements":[[2," "],[10,"dt"],[12],[1,[30,[36,7],["models.auth-method.Config.OIDCClientSecret"],null]],[13],[2,"\\n "],[10,"dd"],[12],[1,[32,14,["Config","OIDCClientSecret"]]],[13],[2,"\\n"]],"parameters":[]}]]],[6,[37,2],[[32,14,["Config","AllowedRedirectURIs"]]],null,[["default"],[{"statements":[[2," "],[10,"dt"],[12],[1,[30,[36,7],["models.auth-method.Config.AllowedRedirectURIs"],null]],[13],[2,"\\n "],[10,"dd"],[12],[2,"\\n "],[10,"ul"],[12],[2,"\\n"],[6,[37,6],[[30,[36,5],[[30,[36,5],[[32,14,["Config","AllowedRedirectURIs"]]],null]],null]],null,[["default"],[{"statements":[[2," "],[10,"li"],[12],[2,"\\n "],[8,"copy-button",[],[["@value","@name"],[[32,5],"Redirect URI"]],null],[2,"\\n "],[10,"span"],[12],[1,[32,5]],[13],[2,"\\n "],[13],[2,"\\n"]],"parameters":[5]}]]],[2," "],[13],[2,"\\n "],[13],[2,"\\n"]],"parameters":[]}]]],[6,[37,2],[[32,14,["Config","BoundAudiences"]]],null,[["default"],[{"statements":[[2," "],[10,"dt"],[12],[1,[30,[36,7],["models.auth-method.Config.BoundAudiences"],null]],[13],[2,"\\n "],[10,"dd"],[12],[2,"\\n "],[10,"ul"],[12],[2,"\\n"],[6,[37,6],[[30,[36,5],[[30,[36,5],[[32,14,["Config","BoundAudiences"]]],null]],null]],null,[["default"],[{"statements":[[2," "],[10,"li"],[12],[2,"\\n "],[10,"span"],[12],[1,[32,4]],[13],[2,"\\n "],[13],[2,"\\n"]],"parameters":[4]}]]],[2," "],[13],[2,"\\n "],[13],[2,"\\n"]],"parameters":[]}]]],[6,[37,2],[[32,14,["Config","OIDCScopes"]]],null,[["default"],[{"statements":[[2," "],[10,"dt"],[12],[1,[30,[36,7],["models.auth-method.Config.OIDCScopes"],null]],[13],[2,"\\n "],[10,"dd"],[12],[2,"\\n "],[10,"ul"],[12],[2,"\\n"],[6,[37,6],[[30,[36,5],[[30,[36,5],[[32,14,["Config","OIDCScopes"]]],null]],null]],null,[["default"],[{"statements":[[2," "],[10,"li"],[12],[2,"\\n "],[10,"span"],[12],[1,[32,3]],[13],[2,"\\n "],[13],[2,"\\n"]],"parameters":[3]}]]],[2," "],[13],[2,"\\n "],[13],[2,"\\n"]],"parameters":[]}]]],[6,[37,2],[[32,14,["Config","JWTSupportedAlgs"]]],null,[["default"],[{"statements":[[2," "],[10,"dt"],[12],[1,[30,[36,7],["models.auth-method.Config.JWTSupportedAlgs"],null]],[13],[2,"\\n "],[10,"dd"],[12],[1,[30,[36,8],[", ",[32,14,["Config","JWTSupportedAlgs"]]],null]],[13],[2,"\\n"]],"parameters":[]}]]],[6,[37,2],[[32,14,["Config","VerboseOIDCLogging"]]],null,[["default"],[{"statements":[[2," "],[10,"dt"],[14,0,"check"],[12],[1,[30,[36,7],["models.auth-method.Config.VerboseOIDCLogging"],null]],[13],[2,"\\n "],[10,"dd"],[12],[10,"input"],[14,"disabled","disabled"],[15,"checked",[32,14,["Config","VerboseOIDCLogging"]]],[14,4,"checkbox"],[12],[13],[13],[2,"\\n"]],"parameters":[]}]]],[2," "]],"parameters":[]}]]]],"parameters":[]}]]]],"parameters":[]}]]],[2," "],[13],[2,"\\n "],[13],[2,"\\n\\n"],[6,[37,2],[[30,[36,13],[[30,[36,1],[[32,14,["Type"]],"aws-iam"],null]],null]],null,[["default"],[{"statements":[[2," "],[10,"hr"],[12],[13],[2,"\\n\\n "],[10,"section"],[14,0,"claim-mappings"],[12],[2,"\\n "],[10,"h2"],[12],[2,"Claim Mappings"],[13],[2,"\\n"],[6,[37,2],[[32,14,["Config","ClaimMappings"]]],null,[["default","else"],[{"statements":[[2," "],[10,"p"],[12],[2,"Use this if the claim you are capturing is singular. When mapped, the values can be any of a number, string, or boolean and will all be stringified when returned."],[13],[2,"\\n "],[10,"table"],[12],[2,"\\n "],[10,"thead"],[12],[2,"\\n "],[10,"tr"],[12],[2,"\\n "],[10,"td"],[12],[2,"Key"],[13],[2,"\\n "],[10,"td"],[12],[2,"Value"],[13],[2,"\\n "],[13],[2,"\\n "],[13],[2,"\\n "],[10,"tbody"],[12],[2,"\\n"],[6,[37,6],[[30,[36,5],[[30,[36,5],[[30,[36,4],[[32,14,["Config","ClaimMappings"]]],null]],null]],null]],null,[["default"],[{"statements":[[2," "],[10,"tr"],[12],[2,"\\n "],[10,"td"],[12],[1,[30,[36,3],[[32,2],0],null]],[13],[2,"\\n "],[10,"td"],[12],[1,[30,[36,3],[[32,2],1],null]],[13],[2,"\\n "],[13],[2,"\\n"]],"parameters":[2]}]]],[2," "],[13],[2,"\\n "],[13],[2,"\\n"]],"parameters":[]},{"statements":[[2," "],[8,"empty-state",[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["header"]],[["default"],[{"statements":[[2,"\\n "],[10,"h2"],[12],[2,"No claim mappings"],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["body"]],[["default"],[{"statements":[[2,"\\n "],[10,"p"],[12],[2,"Use this if the claim you are capturing is singular. When mapped, the values can be any of a number, string, or boolean and will all be stringified when returned."],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["actions"]],[["default"],[{"statements":[[2,"\\n "],[10,"li"],[14,0,"docs-link"],[12],[2,"\\n"],[6,[37,2],[[30,[36,1],[[32,14,["Type"]],"jwt"],null]],null,[["default","else"],[{"statements":[[2," "],[10,"a"],[15,6,[31,[[30,[36,0],["CONSUL_DOCS_URL"],null],"/security/acl/auth-methods/jwt#claimmappings"]]],[14,"rel","noopener noreferrer"],[14,"target","_blank"],[12],[2,"Read the documentation"],[13],[2,"\\n"]],"parameters":[]},{"statements":[[2," "],[10,"a"],[15,6,[31,[[30,[36,0],["CONSUL_DOCS_URL"],null],"/security/acl/auth-methods/oidc#claimmappings"]]],[14,"rel","noopener noreferrer"],[14,"target","_blank"],[12],[2,"Read the documentation"],[13],[2,"\\n"]],"parameters":[]}]]],[2," "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[]}]]],[2," "],[13],[2,"\\n\\n "],[10,"hr"],[12],[13],[2,"\\n\\n "],[10,"section"],[14,0,"list-claim-mappings"],[12],[2,"\\n "],[10,"h2"],[12],[2,"List Claim Mappings"],[13],[2,"\\n"],[6,[37,2],[[32,14,["Config","ListClaimMappings"]]],null,[["default","else"],[{"statements":[[2," "],[10,"p"],[12],[2,"Use this if the claim you are capturing is list-like (such as groups). When mapped, the values can be any of a number, string, or boolean and will all be stringified when returned."],[13],[2,"\\n "],[10,"table"],[12],[2,"\\n "],[10,"thead"],[12],[2,"\\n "],[10,"tr"],[12],[2,"\\n "],[10,"td"],[12],[2,"Key"],[13],[2,"\\n "],[10,"td"],[12],[2,"Value"],[13],[2,"\\n "],[13],[2,"\\n "],[13],[2,"\\n "],[10,"tbody"],[12],[2,"\\n"],[6,[37,6],[[30,[36,5],[[30,[36,5],[[30,[36,4],[[32,14,["Config","ListClaimMappings"]]],null]],null]],null]],null,[["default"],[{"statements":[[2," "],[10,"tr"],[12],[2,"\\n "],[10,"td"],[12],[1,[30,[36,3],[[32,1],0],null]],[13],[2,"\\n "],[10,"td"],[12],[1,[30,[36,3],[[32,1],1],null]],[13],[2,"\\n "],[13],[2,"\\n"]],"parameters":[1]}]]],[2," "],[13],[2,"\\n "],[13],[2,"\\n"]],"parameters":[]},{"statements":[[2," "],[8,"empty-state",[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["header"]],[["default"],[{"statements":[[2,"\\n "],[10,"h2"],[12],[2,"No list claim mappings"],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["body"]],[["default"],[{"statements":[[2,"\\n "],[10,"p"],[12],[2,"Use this if the claim you are capturing is list-like (such as groups). When mapped, the values can be any of a number, string, or boolean and will all be stringified when returned."],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["actions"]],[["default"],[{"statements":[[2,"\\n "],[10,"li"],[14,0,"docs-link"],[12],[2,"\\n"],[6,[37,2],[[30,[36,1],[[32,14,["Type"]],"jwt"],null]],null,[["default","else"],[{"statements":[[2," "],[10,"a"],[15,6,[31,[[30,[36,0],["CONSUL_DOCS_URL"],null],"/security/acl/auth-methods/jwt#listclaimmappings"]]],[14,"rel","noopener noreferrer"],[14,"target","_blank"],[12],[2,"Read the documentation"],[13],[2,"\\n"]],"parameters":[]},{"statements":[[2," "],[10,"a"],[15,6,[31,[[30,[36,0],["CONSUL_DOCS_URL"],null],"/security/acl/auth-methods/oidc#listclaimmappings"]]],[14,"rel","noopener noreferrer"],[14,"target","_blank"],[12],[2,"Read the documentation"],[13],[2,"\\n"]],"parameters":[]}]]],[2," "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[]}]]],[2," "],[13],[2,"\\n"]],"parameters":[]}]]]],"parameters":[]}]]],[2," "],[13]],"hasEval":false,"upvars":["env","eq","if","get","entries","-track-array","each","t","join","concat","array","array-is-array","let","not"]}',meta:{moduleName:"consul-ui/components/consul/auth-method/view/index.hbs"}}) -var n=Ember._setComponentTemplate(t,Ember._templateOnlyComponent()) -e.default=n})),define("consul-ui/components/consul/bucket/list/index",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const t=Ember.HTMLBars.template({id:"WPJVSna7",block:'{"symbols":["@item","@service","@nspace","@partition"],"statements":[[6,[37,2],[[30,[36,1],[[32,4],[30,[36,4],["use partitions"],null]],null]],null,[["default","else"],[{"statements":[[6,[37,2],[[30,[36,3],[[32,1,["Partition"]],[32,4]],null]],null,[["default"],[{"statements":[[2," "],[10,"dl"],[14,0,"consul-bucket-list"],[12],[2,"\\n "],[11,"dt"],[24,0,"partition"],[4,[38,0],null,null],[12],[2,"\\n Admin Partition\\n "],[13],[2,"\\n "],[10,"dd"],[12],[2,"\\n "],[1,[32,1,["Partition"]]],[2,"\\n "],[13],[2,"\\n "],[11,"dt"],[24,0,"nspace"],[4,[38,0],null,null],[12],[2,"\\n Namespace\\n "],[13],[2,"\\n "],[10,"dd"],[12],[2,"\\n "],[1,[32,1,["Namespace"]]],[2,"\\n "],[13],[2,"\\n\\n"],[6,[37,2],[[30,[36,1],[[32,2],[32,1,["Service"]]],null]],null,[["default"],[{"statements":[[2," "],[10,"dt"],[14,0,"service"],[12],[2,"\\n Service\\n "],[13],[2,"\\n "],[10,"dd"],[12],[2,"\\n "],[1,[32,1,["Service"]]],[2,"\\n "],[13],[2,"\\n"]],"parameters":[]}]]],[2,"\\n "],[13],[2,"\\n"]],"parameters":[]}]]]],"parameters":[]},{"statements":[[6,[37,2],[[30,[36,1],[[32,3],[30,[36,4],["use nspace"],null]],null]],null,[["default"],[{"statements":[[6,[37,2],[[30,[36,3],[[32,1,["Namespace"]],[32,3]],null]],null,[["default"],[{"statements":[[2," "],[10,"dl"],[14,0,"consul-bucket-list"],[12],[2,"\\n "],[11,"dt"],[24,0,"nspace"],[4,[38,0],null,null],[12],[2,"\\n Namespace\\n "],[13],[2,"\\n "],[10,"dd"],[12],[2,"\\n "],[1,[32,1,["Namespace"]]],[2,"\\n "],[13],[2,"\\n"],[6,[37,2],[[30,[36,1],[[32,2],[32,1,["Service"]]],null]],null,[["default"],[{"statements":[[2," "],[10,"dt"],[14,0,"service"],[12],[2,"\\n Service\\n "],[13],[2,"\\n "],[10,"dd"],[12],[2,"\\n "],[1,[32,1,["Service"]]],[2,"\\n "],[13],[2,"\\n"]],"parameters":[]}]]],[2," "],[13],[2,"\\n"]],"parameters":[]}]]]],"parameters":[]}]]]],"parameters":[]}]]]],"hasEval":false,"upvars":["tooltip","and","if","not-eq","can"]}',meta:{moduleName:"consul-ui/components/consul/bucket/list/index.hbs"}}) -var n=Ember._setComponentTemplate(t,Ember._templateOnlyComponent()) -e.default=n})),define("consul-ui/components/consul/datacenter/selector/index",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const t=Ember.HTMLBars.template({id:"5dl+NDsZ",block:'{"symbols":["disclosure","panel","menu","item","@dc","@nspace","@dcs"],"statements":[[10,"li"],[14,0,"dcs"],[12],[2,"\\n "],[8,"disclosure-menu",[[24,"aria-label","Datacenter"]],[["@items"],[[30,[36,8],["Primary:desc","Local:desc","Name:asc",[32,7]],null]]],[["default"],[{"statements":[[2,"\\n "],[8,[32,1,["Action"]],[[4,[38,7],["click",[32,1,["toggle"]]],null]],[[],[]],[["default"],[{"statements":[[2,"\\n "],[1,[32,5,["Name"]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,[32,1,["Menu"]],[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[8,"data-source",[],[["@src","@onchange"],[[30,[36,9],["/*/*/*/datacenters"],null],[30,[36,11],[[32,0],[30,[36,10],[[32,7]],null]],[["value"],["data"]]]]],null],[2,"\\n "],[8,[32,2,["Menu"]],[],[[],[]],[["default"],[{"statements":[[2,"\\n"],[6,[37,13],[[30,[36,12],[[30,[36,12],[[32,3,["items"]]],null]],null]],null,[["default"],[{"statements":[[2," "],[8,[32,3,["Item"]],[[16,"aria-current",[30,[36,1],[[30,[36,0],[[32,5,["Name"]],[32,4,["Name"]]],null],"true"],null]],[16,0,[30,[36,3],[[30,[36,2],["is-local",[32,4,["Local"]]],null],[30,[36,2],["is-primary",[32,4,["Primary"]]],null]],null]]],[[],[]],[["default"],[{"statements":[[2,"\\n "],[8,[32,3,["Action"]],[[4,[38,7],["click",[32,1,["close"]]],null]],[["@href"],[[30,[36,6],["."],[["params"],[[30,[36,5],null,[["dc","partition","nspace"],[[32,4,["Name"]],[29],[30,[36,1],[[30,[36,4],[[32,6,["length"]],0],null],[32,6],[29]],null]]]]]]]]],[["default"],[{"statements":[[2,"\\n "],[1,[32,4,["Name"]]],[2,"\\n"],[6,[37,1],[[32,4,["Primary"]]],null,[["default"],[{"statements":[[2," "],[10,"span"],[12],[2,"Primary"],[13],[2,"\\n"]],"parameters":[]}]]],[6,[37,1],[[32,4,["Local"]]],null,[["default"],[{"statements":[[2," "],[10,"span"],[12],[2,"Local"],[13],[2,"\\n"]],"parameters":[]}]]],[2," "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[4]}]]],[2," "]],"parameters":[3]}]]],[2,"\\n "]],"parameters":[2]}]]],[2,"\\n "]],"parameters":[1]}]]],[2,"\\n"],[13],[2,"\\n\\n"]],"hasEval":false,"upvars":["eq","if","array","class-map","gt","hash","href-to","on","sort-by","uri","mut","action","-track-array","each"]}',meta:{moduleName:"consul-ui/components/consul/datacenter/selector/index.hbs"}}) -var n=Ember._setComponentTemplate(t,Ember._templateOnlyComponent()) -e.default=n})),define("consul-ui/components/consul/discovery-chain/index",["exports","consul-ui/components/consul/discovery-chain/utils"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const n=Ember.HTMLBars.template({id:"tgH7XXQj",block:'{"symbols":["item","dest","item","item","dest","item","dest","splitter","src","item","index","destRect","dest","item","src","destRect","dest","item","item","item"],"statements":[[10,"style"],[12],[2,"\\n"],[6,[37,6],[[35,19,["nodes"]]],null,[["default"],[{"statements":[[2," "],[1,[35,19,["nodes"]]],[2," {\\n opacity: 1 !important;\\n\\n background-color: var(--tone-gray-000);\\n border: var(--decor-border-100);\\n border-radius: var(--decor-radius-200);\\n border-color: rgb(var(--tone-gray-500));\\n box-shadow: var(--decor-elevation-600);\\n }\\n"]],"parameters":[]}]]],[6,[37,6],[[35,19,["edges"]]],null,[["default"],[{"statements":[[2," "],[1,[35,19,["edges"]]],[2," {\\n opacity: 1;\\n }\\n"]],"parameters":[]}]]],[13],[2,"\\n\\n"],[10,"div"],[14,0,"routes"],[12],[2,"\\n "],[10,"header"],[12],[2,"\\n "],[10,"h2"],[12],[2,"\\n "],[1,[35,20,["ServiceName"]]],[2," Router\\n "],[11,"span"],[4,[38,12],["Use routers to intercept traffic using Layer 7 criteria such as path prefixes or http headers."],null],[12],[2,"\\n "],[13],[2,"\\n "],[13],[2,"\\n "],[13],[2,"\\n "],[10,"div"],[14,"role","group"],[12],[2,"\\n"],[6,[37,8],[[30,[36,7],[[30,[36,7],[[35,21]],null]],null]],null,[["default"],[{"statements":[[2," "],[8,"consul/discovery-chain/route-card",[[4,[38,18],[[30,[36,17],[[30,[36,16],[[32,20],"rect"],null]],[["from"],[[32,0,["edges"]]]]]],null]],[["@item","@onclick"],[[32,20],[30,[36,15],[[32,0],"click"],null]]],null],[2,"\\n"]],"parameters":[20]}]]],[2," "],[13],[2,"\\n"],[13],[2,"\\n\\n"],[10,"div"],[14,0,"splitters"],[12],[2,"\\n "],[10,"header"],[12],[2,"\\n "],[10,"h2"],[12],[2,"\\n Splitters\\n "],[11,"span"],[4,[38,12],["Splitters are configured to split incoming requests across different services or subsets of a single service."],null],[12],[2,"\\n "],[13],[2,"\\n "],[13],[2,"\\n "],[13],[2,"\\n "],[10,"div"],[14,"role","group"],[12],[2,"\\n"],[6,[37,8],[[30,[36,7],[[30,[36,7],[[30,[36,23],["Name",[35,22]],null]],null]],null]],null,[["default"],[{"statements":[[2," "],[8,"consul/discovery-chain/splitter-card",[[4,[38,18],[[30,[36,17],[[30,[36,16],[[32,19],"rect"],null]],[["from"],[[32,0,["edges"]]]]]],null]],[["@item","@onclick"],[[32,19],[30,[36,15],[[32,0],"click"],null]]],null],[2,"\\n"]],"parameters":[19]}]]],[2," "],[13],[2,"\\n"],[13],[2,"\\n\\n"],[10,"div"],[14,0,"resolvers"],[12],[2,"\\n "],[10,"header"],[12],[2,"\\n "],[10,"h2"],[12],[2,"\\n Resolvers\\n "],[11,"span"],[4,[38,12],["Resolvers are used to define which instances of a service should satisfy discovery requests."],null],[12],[2,"\\n "],[13],[2,"\\n "],[13],[2,"\\n "],[13],[2,"\\n "],[10,"div"],[14,"role","group"],[12],[2,"\\n"],[6,[37,8],[[30,[36,7],[[30,[36,7],[[30,[36,23],["Name",[35,24]],null]],null]],null]],null,[["default"],[{"statements":[[2," "],[8,"consul/discovery-chain/resolver-card",[[4,[38,18],[[30,[36,17],[[30,[36,16],[[32,18],"rect"],null]],[["from"],[[32,0,["edges"]]]]]],null]],[["@item","@edges","@onclick"],[[32,18],[32,0,["edges"]],[30,[36,15],[[32,0],"click"],null]]],null],[2,"\\n"]],"parameters":[18]}]]],[2," "],[13],[2,"\\n"],[13],[2,"\\n\\n"],[1,[34,25]],[2,"\\n\\n"],[11,"svg"],[24,0,"edges"],[24,"width","100%"],[24,"height","100%"],[24,"preserveAspectRatio","none"],[4,[38,26],[[30,[36,16],[[32,0],"edges"],null]],null],[12],[2,"\\n"],[6,[37,8],[[30,[36,7],[[30,[36,7],[[35,21]],null]],null]],null,[["default"],[{"statements":[[6,[37,6],[[32,14,["rect"]]],null,[["default"],[{"statements":[[6,[37,4],[[32,14,["rect"]],[32,14,["NextItem","rect"]]],null,[["default"],[{"statements":[[6,[37,4],[[30,[36,13],[[30,[36,2],null,[["x","y"],[[32,16,["x"]],[30,[36,1],[[32,16,["y"]],[30,[36,0],[[32,16,["height"]],2],null]],null]]]],[30,[36,9],[[32,14,["ID"]]],null]],null]],null,[["default"],[{"statements":[[2,"\\n "],[10,"path"],[15,1,[30,[36,9],[[32,14,["ID"]],">",[32,14,["NextNode"]]],null]],[15,"d",[30,[36,10],[[30,[36,2],null,[["x","y"],[[32,17,["x"]],[30,[36,14],[[32,17,["y"]],0],null]]]]],[["src"],[[30,[36,2],null,[["x","y"],[[32,15,["right"]],[30,[36,1],[[32,15,["y"]],[30,[36,0],[[32,15,["height"]],2],null]],null]]]]]]]],[12],[13],[2,"\\n\\n"]],"parameters":[17]}]]]],"parameters":[15,16]}]]]],"parameters":[]}]]]],"parameters":[14]}]]],[2,"\\n"],[6,[37,8],[[30,[36,7],[[30,[36,7],[[35,22]],null]],null]],null,[["default"],[{"statements":[[6,[37,6],[[32,8,["rect"]]],null,[["default"],[{"statements":[[6,[37,4],[[32,8,["rect"]]],null,[["default"],[{"statements":[[6,[37,8],[[30,[36,7],[[30,[36,7],[[32,8,["Splits"]]],null]],null]],null,[["default"],[{"statements":[[6,[37,4],[[32,10,["NextItem","rect"]]],null,[["default"],[{"statements":[[6,[37,4],[[30,[36,13],[[30,[36,2],null,[["x","y"],[[32,12,["x"]],[30,[36,1],[[32,12,["y"]],[30,[36,0],[[32,12,["height"]],2],null]],null]]]],[30,[36,9],[[32,8,["ID"]],"-",[32,11]],null]],null]],null,[["default"],[{"statements":[[2,"\\n "],[11,"path"],[16,1,[30,[36,9],["splitter:",[32,8,["Name"]],">",[32,10,["NextNode"]]],null]],[24,0,"split"],[16,"d",[30,[36,10],[[30,[36,2],null,[["x","y"],[[32,13,["x"]],[32,13,["y"]]]]]],[["src"],[[30,[36,2],null,[["x","y"],[[32,9,["right"]],[30,[36,1],[[32,9,["y"]],[30,[36,0],[[32,9,["height"]],2],null]],null]]]]]]]],[4,[38,12],[[30,[36,9],[[30,[36,11],[[30,[36,3],[[32,10,["Weight"]],0],null]],[["decimals"],[2]]],"%"],null]],[["options"],[[30,[36,2],null,[["followCursor"],[true]]]]]],[12],[13],[2,"\\n\\n"]],"parameters":[13]}]]]],"parameters":[12]}]]]],"parameters":[10,11]}]]]],"parameters":[9]}]]]],"parameters":[]}]]]],"parameters":[8]}]]],[2,"\\n"],[13],[2,"\\n\\n"],[10,"svg"],[14,0,"resolver-inlets"],[14,"height","100%"],[12],[2,"\\n"],[6,[37,8],[[30,[36,7],[[30,[36,7],[[35,21]],null]],null]],null,[["default"],[{"statements":[[6,[37,6],[[30,[36,5],[[32,6,["NextNode"]],"resolver:"],null]],null,[["default"],[{"statements":[[6,[37,4],[[30,[36,3],[[32,6,["NextItem","rect"]],[30,[36,2],null,[["y","height"],[0,0]]]],null]],null,[["default"],[{"statements":[[2," "],[10,"circle"],[14,"r","2.5"],[14,"cx","5"],[15,"cy",[30,[36,1],[[32,7,["y"]],[30,[36,0],[[32,7,["height"]],2],null]],null]],[12],[13],[2,"\\n"]],"parameters":[7]}]]]],"parameters":[]}]]]],"parameters":[6]}]]],[6,[37,8],[[30,[36,7],[[30,[36,7],[[35,22]],null]],null]],null,[["default"],[{"statements":[[6,[37,8],[[30,[36,7],[[30,[36,7],[[32,3,["Splits"]]],null]],null]],null,[["default"],[{"statements":[[6,[37,4],[[30,[36,3],[[32,4,["NextItem","rect"]],[30,[36,2],null,[["y","height"],[0,0]]]],null]],null,[["default"],[{"statements":[[2," "],[10,"circle"],[14,"r","2.5"],[14,"cx","5"],[15,"cy",[30,[36,1],[[32,5,["y"]],[30,[36,0],[[32,5,["height"]],2],null]],null]],[12],[13],[2,"\\n"]],"parameters":[5]}]]]],"parameters":[4]}]]]],"parameters":[3]}]]],[13],[2,"\\n\\n"],[10,"svg"],[14,0,"splitter-inlets"],[14,"height","100%"],[12],[2,"\\n"],[6,[37,8],[[30,[36,7],[[30,[36,7],[[35,21]],null]],null]],null,[["default"],[{"statements":[[6,[37,6],[[30,[36,5],[[32,1,["NextNode"]],"splitter:"],null]],null,[["default"],[{"statements":[[6,[37,4],[[30,[36,3],[[32,1,["NextItem","rect"]],[30,[36,2],null,[["y","height"],[0,0]]]],null]],null,[["default"],[{"statements":[[2," "],[10,"circle"],[14,"r","2.5"],[14,"cx","5"],[15,"cy",[30,[36,1],[[32,2,["y"]],[30,[36,0],[[32,2,["height"]],2],null]],null]],[12],[13],[2,"\\n"]],"parameters":[2]}]]]],"parameters":[]}]]]],"parameters":[1]}]]],[13],[2,"\\n"]],"hasEval":false,"upvars":["div","add","hash","or","let","string-starts-with","if","-track-array","each","concat","svg-curve","round","tooltip","tween-to","sub","action","set","dom-position","on-resize","selected","chain","routes","splitters","sort-by","resolvers","nodes","did-insert"]}',meta:{moduleName:"consul-ui/components/consul/discovery-chain/index.hbs"}}) -var r=Ember._setComponentTemplate(n,Ember.Component.extend({dom:Ember.inject.service("dom"),ticker:Ember.inject.service("ticker"),dataStructs:Ember.inject.service("data-structs"),classNames:["discovery-chain"],classNameBindings:["active"],selectedId:"",init:function(){this._super(...arguments),this._listeners=this.dom.listeners()},didInsertElement:function(){this._listeners.add(this.dom.document(),{click:e=>{this.dom.closest('[class$="-card"]',e.target)||(Ember.set(this,"active",!1),Ember.set(this,"selectedId",""))}})},willDestroyElement:function(){this._super(...arguments),this._listeners.remove(),this.ticker.destroy(this)},splitters:Ember.computed("chain.Nodes",(function(){return(0,t.getSplitters)(Ember.get(this,"chain.Nodes"))})),routes:Ember.computed("chain.Nodes",(function(){const e=(0,t.getRoutes)(Ember.get(this,"chain.Nodes"),this.dom.guid) -if(!e.find(e=>"/"===Ember.get(e,"Definition.Match.HTTP.PathPrefix"))&&!e.find(e=>void 0===e.Definition)){let n -const r=`resolver:${this.chain.ServiceName}.${this.chain.Namespace}.${this.chain.Partition}.${this.chain.Datacenter}`,a=`splitter:${this.chain.ServiceName}.${this.chain.Namespace}.${this.chain.Partition}` -if(void 0!==this.chain.Nodes[a]?n=a:void 0!==this.chain.Nodes[r]&&(n=r),void 0!==n){const r={Default:!0,ID:"route:"+this.chain.ServiceName,Name:this.chain.ServiceName,Definition:{Match:{HTTP:{PathPrefix:"/"}}},NextNode:n} -e.push((0,t.createRoute)(r,this.chain.ServiceName,this.dom.guid))}}return e})),nodes:Ember.computed("routes","splitters","resolvers",(function(){let e=this.resolvers.reduce((e,t)=>(e["resolver:"+t.ID]=t,t.Children.reduce((e,t)=>(e["resolver:"+t.ID]=t,e),e),e),{}) -return e=this.splitters.reduce((e,t)=>(e[t.ID]=t,e),e),e=this.routes.reduce((e,t)=>(e[t.ID]=t,e),e),Object.entries(e).forEach(([t,n])=>{void 0!==n.NextNode&&(n.NextItem=e[n.NextNode]),void 0!==n.Splits&&n.Splits.forEach(t=>{void 0!==t.NextNode&&(t.NextItem=e[t.NextNode])})}),""})),resolvers:Ember.computed("chain.{Nodes,Targets}",(function(){return(0,t.getResolvers)(this.chain.Datacenter,this.chain.Partition,this.chain.Namespace,Ember.get(this,"chain.Targets"),Ember.get(this,"chain.Nodes"))})),graph:Ember.computed("splitters","routes.[]",(function(){const e=this.dataStructs.graph() -return this.splitters.forEach(t=>{t.Splits.forEach(n=>{e.addLink(t.ID,n.NextNode)})}),this.routes.forEach(t=>{e.addLink(t.ID,t.NextNode)}),e})),selected:Ember.computed("selectedId","graph",(function(){if(""===this.selectedId||!this.dom.element("#"+this.selectedId))return{} -const e=this.selectedId,t=e.split(":").shift(),n=[e],r=[] -return this.graph.forEachLinkedNode(e,(e,a)=>{n.push(e.id),r.push(`${a.fromId}>${a.toId}`),this.graph.forEachLinkedNode(e.id,(e,a)=>{const l=e.id.split(":").shift() -t!==l&&"splitter"!==t&&"splitter"!==l&&(n.push(e.id),r.push(`${a.fromId}>${a.toId}`))})}),{nodes:n.map(e=>"#"+CSS.escape(e)),edges:r.map(e=>"#"+CSS.escape(e))}})),actions:{click:function(e){const t=e.currentTarget.getAttribute("id") -t===this.selectedId?(Ember.set(this,"active",!1),Ember.set(this,"selectedId","")):(Ember.set(this,"active",!0),Ember.set(this,"selectedId",t))}}})) -e.default=r})),define("consul-ui/components/consul/discovery-chain/resolver-card/index",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const t=Ember.HTMLBars.template({id:"2+oC+0pQ",block:'{"symbols":["child","target","target","item","@onclick","@edges","@item","&attrs"],"statements":[[10,"div"],[14,0,"resolver-card"],[12],[2,"\\n "],[11,"header"],[17,8],[16,"onclick",[30,[36,5],[[32,5]],null]],[16,1,[30,[36,0],["resolver:",[32,7,["ID"]]],null]],[12],[2,"\\n "],[10,"a"],[14,3,""],[12],[2,"\\n "],[10,"h3"],[12],[1,[32,7,["Name"]]],[13],[2,"\\n"],[6,[37,4],[[32,7,["Failover"]]],null,[["default"],[{"statements":[[2," "],[10,"dl"],[14,0,"failover"],[12],[2,"\\n "],[11,"dt"],[4,[38,1],[[30,[36,0],[[32,7,["Failover","Type"]]," failover"],null]],null],[12],[2,"\\n "],[1,[30,[36,0],[[32,7,["Failover","Type"]]," failover"],null]],[2,"\\n "],[13],[2,"\\n "],[10,"dd"],[12],[2,"\\n "],[10,"ol"],[12],[2,"\\n"],[6,[37,3],[[30,[36,2],[[30,[36,2],[[32,7,["Failover","Targets"]]],null]],null]],null,[["default"],[{"statements":[[2," "],[10,"li"],[12],[10,"span"],[12],[1,[32,4]],[13],[13],[2,"\\n"]],"parameters":[4]}]]],[2," "],[13],[2,"\\n "],[13],[2,"\\n "],[13],[2,"\\n"]],"parameters":[]}]]],[2," "],[13],[2,"\\n "],[13],[2,"\\n"],[6,[37,4],[[30,[36,9],[[32,7,["Children","length"]],0],null]],null,[["default"],[{"statements":[[2," "],[10,"ul"],[12],[2,"\\n"],[6,[37,3],[[30,[36,2],[[30,[36,2],[[32,7,["Children"]]],null]],null]],null,[["default"],[{"statements":[[2," "],[11,"li"],[16,"onclick",[30,[36,5],[[32,5]],null]],[16,1,[30,[36,0],["resolver:",[32,1,["ID"]]],null]],[4,[38,8],[[30,[36,7],[[30,[36,6],[[32,1],"rect"],null]],[["from"],[[32,6]]]]],null],[12],[2,"\\n "],[10,"a"],[14,3,""],[12],[2,"\\n"],[6,[37,4],[[32,1,["Redirect"]]],null,[["default","else"],[{"statements":[[2," "],[10,"dl"],[14,0,"redirect"],[12],[2,"\\n "],[11,"dt"],[4,[38,1],[[30,[36,0],[[32,1,["Redirect"]]," redirect"],null]],null],[12],[2,"\\n "],[1,[32,1,["Redirect"]]],[2," redirect\\n "],[13],[2,"\\n "],[10,"dd"],[12],[2,"\\n "],[1,[32,1,["Name"]]],[2,"\\n "],[13],[2,"\\n "],[13],[2,"\\n"],[6,[37,4],[[32,1,["Failover"]]],null,[["default"],[{"statements":[[2," "],[10,"dl"],[14,0,"failover"],[12],[2,"\\n "],[11,"dt"],[4,[38,1],[[30,[36,0],[[32,1,["Failover","Type"]]," failover"],null]],null],[12],[2,"\\n "],[1,[32,1,["Failover","Type"]]],[2," failover\\n "],[13],[2,"\\n "],[10,"dd"],[12],[2,"\\n "],[10,"ol"],[12],[2,"\\n"],[6,[37,3],[[30,[36,2],[[30,[36,2],[[32,1,["Failover","Targets"]]],null]],null]],null,[["default"],[{"statements":[[2," "],[10,"li"],[12],[2,"\\n "],[10,"span"],[12],[1,[32,3]],[13],[2,"\\n "],[13],[2,"\\n"]],"parameters":[3]}]]],[2," "],[13],[2,"\\n "],[13],[2,"\\n "],[13],[2,"\\n"]],"parameters":[]}]]]],"parameters":[]},{"statements":[[6,[37,4],[[32,1,["Failover"]]],null,[["default","else"],[{"statements":[[2," "],[1,[32,1,["Name"]]],[2,"\\n "],[10,"dl"],[14,0,"failover"],[12],[2,"\\n "],[11,"dt"],[4,[38,1],[[30,[36,0],[[32,1,["Failover","Type"]]," failover"],null]],null],[12],[2,"\\n "],[1,[30,[36,0],[[32,1,["Failover","Type"]]," failover"],null]],[2,"\\n "],[13],[2,"\\n "],[10,"dd"],[12],[2,"\\n "],[10,"ol"],[12],[2,"\\n"],[6,[37,3],[[30,[36,2],[[30,[36,2],[[32,1,["Failover","Targets"]]],null]],null]],null,[["default"],[{"statements":[[2," "],[10,"li"],[12],[2,"\\n "],[10,"span"],[12],[1,[32,2]],[13],[2,"\\n "],[13],[2,"\\n"]],"parameters":[2]}]]],[2," "],[13],[2,"\\n "],[13],[2,"\\n "],[13],[2,"\\n"]],"parameters":[]},{"statements":[[2," "],[1,[32,1,["Name"]]],[2,"\\n "]],"parameters":[]}]]]],"parameters":[]}]]],[2," "],[13],[2,"\\n "],[13],[2,"\\n"]],"parameters":[1]}]]],[2," "],[13],[2,"\\n"]],"parameters":[]}]]],[13],[2,"\\n"]],"hasEval":false,"upvars":["concat","tooltip","-track-array","each","if","optional","set","dom-position","on-resize","gt"]}',meta:{moduleName:"consul-ui/components/consul/discovery-chain/resolver-card/index.hbs"}}) -var n=Ember._setComponentTemplate(t,Ember._templateOnlyComponent()) -e.default=n})),define("consul-ui/components/consul/discovery-chain/route-card/index",["exports","@glimmer/component"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const n=Ember.HTMLBars.template({id:"m02p4dNF",block:'{"symbols":["item","item","item","@item","@onclick","&attrs"],"statements":[[11,"a"],[24,0,"route-card"],[16,"onclick",[32,5]],[16,1,[32,4,["ID"]]],[17,6],[12],[2,"\\n "],[10,"header"],[15,0,[30,[36,5],[[30,[36,4],[[32,0,["path","value"]],"/"],null],"short"],null]],[12],[2,"\\n"],[6,[37,5],[[30,[36,6],[[32,4,["Definition","Match","HTTP","Methods","length"]],0],null]],null,[["default"],[{"statements":[[2," "],[10,"ul"],[14,0,"match-methods"],[12],[2,"\\n"],[6,[37,3],[[30,[36,2],[[30,[36,2],[[32,4,["Definition","Match","HTTP","Methods"]]],null]],null]],null,[["default"],[{"statements":[[2," "],[10,"li"],[12],[1,[32,3]],[13],[2,"\\n"]],"parameters":[3]}]]],[2," "],[13],[2,"\\n"]],"parameters":[]}]]],[2," "],[10,"dl"],[12],[2,"\\n "],[10,"dt"],[12],[2,"\\n "],[1,[32,0,["path","type"]]],[2,"\\n "],[13],[2,"\\n "],[10,"dd"],[12],[2,"\\n "],[1,[32,0,["path","value"]]],[2,"\\n "],[13],[2,"\\n "],[13],[2,"\\n "],[13],[2,"\\n"],[6,[37,5],[[30,[36,6],[[32,4,["Definition","Match","HTTP","Header","length"]],0],null]],null,[["default"],[{"statements":[[2," "],[10,"section"],[14,0,"match-headers"],[12],[2,"\\n "],[11,"header"],[4,[38,1],["Header"],null],[12],[2,"\\n "],[10,"h4"],[12],[2,"Headers"],[13],[2,"\\n "],[13],[2,"\\n "],[10,"dl"],[12],[2,"\\n"],[6,[37,3],[[30,[36,2],[[30,[36,2],[[32,4,["Definition","Match","HTTP","Header"]]],null]],null]],null,[["default"],[{"statements":[[2," "],[10,"dt"],[12],[2,"\\n "],[1,[32,2,["Name"]]],[2,"\\n "],[13],[2,"\\n "],[10,"dd"],[12],[2,"\\n "],[1,[30,[36,0],[[32,2]],null]],[2,"\\n "],[13],[2,"\\n"]],"parameters":[2]}]]],[2," "],[13],[2,"\\n "],[13],[2,"\\n"]],"parameters":[]}]]],[6,[37,5],[[30,[36,6],[[32,4,["Definition","Match","HTTP","QueryParam","length"]],0],null]],null,[["default"],[{"statements":[[2," "],[10,"section"],[14,0,"match-queryparams"],[12],[2,"\\n "],[11,"header"],[4,[38,1],["Query Params"],null],[12],[2,"\\n "],[10,"h4"],[12],[2,"Query Params"],[13],[2,"\\n "],[13],[2,"\\n "],[10,"dl"],[12],[2,"\\n"],[6,[37,3],[[30,[36,2],[[30,[36,2],[[32,4,["Definition","Match","HTTP","QueryParam"]]],null]],null]],null,[["default"],[{"statements":[[2," "],[10,"dt"],[12],[2,"\\n "],[1,[32,1,["Name"]]],[2,"\\n "],[13],[2,"\\n "],[10,"dd"],[12],[2,"\\n "],[1,[30,[36,0],[[32,1]],null]],[2,"\\n "],[13],[2,"\\n"]],"parameters":[1]}]]],[2," "],[13],[2,"\\n "],[13],[2,"\\n"]],"parameters":[]}]]],[13],[2,"\\n"]],"hasEval":false,"upvars":["route-match","tooltip","-track-array","each","eq","if","gt"]}',meta:{moduleName:"consul-ui/components/consul/discovery-chain/route-card/index.hbs"}}) -class r extends t.default{get path(){return Object.entries(Ember.get(this.args.item,"Definition.Match.HTTP")||{}).reduce((function(e,[t,n]){return t.toLowerCase().startsWith("path")?{type:t.replace("Path",""),value:n}:e}),{type:"Prefix",value:"/"})}}e.default=r,Ember._setComponentTemplate(n,r)})),define("consul-ui/components/consul/discovery-chain/splitter-card/index",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const t=Ember.HTMLBars.template({id:"fGt7Ht9M",block:'{"symbols":["&attrs","@item","@onclick"],"statements":[[10,"div"],[12],[2,"\\n "],[11,"a"],[17,1],[16,1,[32,2,["ID"]]],[24,0,"splitter-card"],[16,"onclick",[30,[36,0],[[32,3]],null]],[12],[2,"\\n "],[10,"header"],[12],[2,"\\n "],[10,"h3"],[12],[1,[32,2,["Name"]]],[13],[2,"\\n "],[13],[2,"\\n "],[13],[2,"\\n"],[13],[2,"\\n"]],"hasEval":false,"upvars":["optional"]}',meta:{moduleName:"consul-ui/components/consul/discovery-chain/splitter-card/index.hbs"}}) -var n=Ember._setComponentTemplate(t,Ember._templateOnlyComponent()) -e.default=n})),define("consul-ui/components/consul/discovery-chain/utils",["exports"],(function(e){function t(e,t){var n=Object.keys(e) -if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e) -t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function n(e){for(var n=1;ne.Type===t)},l=function(e,t,n="default",r="default",a){return void 0===e[t]&&(e[t]={ID:`${t}.${n}.${r}.${a}`,Name:t,Children:[]}),e[t]},s=function(e,t){let n -const r=e.map((function(e){const[r,a]=[t,e].map(e=>e.split(".").reverse()),l=["Datacenter","Partition","Namespace","Service","Subset"] -return a.find((function(e,t){const a=e!==r[t] -return a&&(n=l[t]),a}))})) -return{Type:n,Targets:r}} -e.getAlternateServices=s -e.getSplitters=function(e){return a(e,"splitter").map((function(e){const t=e.Name.split(".") -return t.reverse(),t.shift(),t.shift(),t.reverse(),n(n({},e),{},{ID:"splitter:"+e.Name,Name:t.join(".")})}))} -e.getRoutes=function(e,t){return a(e,"router").reduce((function(e,n){return e.concat(n.Routes.map((function(e){return i(e,n.Name,t)})))}),[])} -e.getResolvers=function(e,t="default",n="default",r={},a={}){const i={} -return Object.values(a).filter(e=>"resolver"===e.Type).forEach((function(r){const a=r.Name.split(".") -let o -a.length>4&&(o=a.shift()),a.reverse(),a.shift(),a.shift(),a.shift(),a.reverse() -const u=a.join("."),c=l(i,u,n,t,e) -let d -if(void 0!==r.Resolver.Failover&&(d=s(r.Resolver.Failover.Targets,r.Name)),o){const e={Subset:!0,ID:r.Name,Name:o} -void 0!==d&&(e.Failover=d),c.Children.push(e)}else void 0!==d&&(c.Failover=d)})),Object.values(r).forEach(r=>{if(void 0!==a["resolver:"+r.ID]){const o=s([r.ID],`service.${n}.${t}.${e}`) -if("Service"!==o.Type){const u=l(i,r.Service,n,t,e),c={Redirect:o.Type,ID:r.ID,Name:r[o.Type]} -void 0!==a["resolver:"+r.ID].Resolver.Failover&&(c.Failover=s(a["resolver:"+r.ID].Resolver.Failover.Targets,r.ID)),u.Children.push(c)}}}),Object.values(i)} -const i=function(e,t,r){return n(n({},e),{},{Default:e.Default||void 0===e.Definition.Match,ID:`route:${t}-${r(e.Definition)}`})} -e.createRoute=i})),define("consul-ui/components/consul/exposed-path/list/index",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const t=Ember.HTMLBars.template({id:"JI0j+pbJ",block:'{"symbols":["path","combinedAddress","@address","&attrs","@items"],"statements":[[11,"div"],[24,0,"consul-exposed-path-list"],[17,4],[12],[2,"\\n "],[10,"ul"],[12],[2,"\\n"],[6,[37,4],[[30,[36,3],[[30,[36,3],[[32,5]],null]],null]],null,[["default"],[{"statements":[[2," "],[10,"li"],[12],[2,"\\n "],[10,"div"],[14,0,"header"],[12],[2,"\\n"],[6,[37,1],[[30,[36,0],[[32,3],":",[32,1,["ListenerPort"]],[32,1,["Path"]]],null]],null,[["default"],[{"statements":[[2," "],[10,"p"],[14,0,"combined-address"],[12],[2,"\\n "],[10,"span"],[12],[2,"\\n "],[1,[32,2]],[2,"\\n "],[13],[2,"\\n "],[8,"copy-button",[],[["@value","@name"],[[32,2],"Address"]],null],[2,"\\n "],[13],[2,"\\n"]],"parameters":[2]}]]],[2," "],[13],[2,"\\n "],[10,"div"],[14,0,"detail"],[12],[2,"\\n"],[6,[37,2],[[32,1,["Protocol"]]],null,[["default"],[{"statements":[[2," "],[10,"dl"],[14,0,"protocol"],[12],[2,"\\n "],[10,"dt"],[12],[2,"\\n "],[8,"tooltip",[],[[],[]],[["default"],[{"statements":[[2,"\\n Protocol\\n "]],"parameters":[]}]]],[2,"\\n "],[13],[2,"\\n "],[10,"dd"],[12],[2,"\\n "],[1,[32,1,["Protocol"]]],[2,"\\n "],[13],[2,"\\n "],[13],[2,"\\n"]],"parameters":[]}]]],[6,[37,2],[[32,1,["ListenerPort"]]],null,[["default"],[{"statements":[[2," "],[10,"dl"],[14,0,"port"],[12],[2,"\\n "],[10,"dt"],[12],[2,"\\n "],[8,"tooltip",[],[[],[]],[["default"],[{"statements":[[2,"\\n Listener Port\\n "]],"parameters":[]}]]],[2,"\\n "],[13],[2,"\\n "],[10,"dd"],[12],[2,"\\n listening on :"],[1,[32,1,["ListenerPort"]]],[2,"\\n "],[13],[2,"\\n "],[13],[2,"\\n"]],"parameters":[]}]]],[6,[37,2],[[32,1,["LocalPathPort"]]],null,[["default"],[{"statements":[[2," "],[10,"dl"],[14,0,"port"],[12],[2,"\\n "],[10,"dt"],[12],[2,"\\n "],[8,"tooltip",[],[[],[]],[["default"],[{"statements":[[2,"\\n Local Path Port\\n "]],"parameters":[]}]]],[2,"\\n "],[13],[2,"\\n "],[10,"dd"],[12],[2,"\\n local port :"],[1,[32,1,["LocalPathPort"]]],[2,"\\n "],[13],[2,"\\n "],[13],[2,"\\n"]],"parameters":[]}]]],[6,[37,2],[[32,1,["Path"]]],null,[["default"],[{"statements":[[2," "],[10,"dl"],[14,0,"path"],[12],[2,"\\n "],[10,"dt"],[12],[2,"\\n "],[8,"tooltip",[],[[],[]],[["default"],[{"statements":[[2,"\\n Path\\n "]],"parameters":[]}]]],[2,"\\n "],[13],[2,"\\n "],[10,"dd"],[12],[2,"\\n "],[1,[32,1,["Path"]]],[2,"\\n "],[13],[2,"\\n "],[13],[2,"\\n"]],"parameters":[]}]]],[2," "],[13],[2,"\\n "],[13],[2,"\\n"]],"parameters":[1]}]]],[2," "],[13],[2,"\\n"],[13],[2,"\\n"]],"hasEval":false,"upvars":["concat","let","if","-track-array","each"]}',meta:{moduleName:"consul-ui/components/consul/exposed-path/list/index.hbs"}}) -var n=Ember._setComponentTemplate(t,Ember._templateOnlyComponent()) -e.default=n})),define("consul-ui/components/consul/external-source/index",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const t=Ember.HTMLBars.template({id:"uL9PpB5h",block:'{"symbols":["externalSource","@label","&attrs","@withInfo","@item"],"statements":[[6,[37,2],[[32,5]],null,[["default"],[{"statements":[[6,[37,7],[[30,[36,6],[[32,5]],null]],null,[["default"],[{"statements":[[6,[37,2],[[30,[36,5],[[32,4],[30,[36,4],[[32,1],"consul-api-gateway"],null]],null]],null,[["default","else"],[{"statements":[[2," "],[10,"dl"],[14,0,"tooltip-panel"],[12],[2,"\\n "],[10,"dt"],[12],[2,"\\n "],[11,"span"],[16,0,[31,["consul-external-source ",[32,1]]]],[17,3],[12],[2,"\\n Registered via "],[1,[30,[36,1],[[30,[36,0],["common.brand.",[32,1]],null]],null]],[2,"\\n "],[13],[2,"\\n "],[13],[2,"\\n "],[10,"dd"],[12],[2,"\\n "],[8,"menu-panel",[],[["@position","@menu"],["left",false]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["header"]],[["default"],[{"statements":[[2,"\\n API Gateways manage north-south traffic from external services to services in the Datacenter. For more information, read our documentation.\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["menu"]],[["default"],[{"statements":[[2,"\\n "],[10,"li"],[14,"role","separator"],[12],[2,"\\n About "],[1,[30,[36,1],[[30,[36,0],["common.brand.",[32,1]],null]],null]],[2,"\\n "],[13],[2,"\\n "],[10,"li"],[14,"role","none"],[14,0,"learn-link"],[12],[2,"\\n "],[10,"a"],[14,"tabindex","-1"],[14,"role","menuitem"],[15,6,[30,[36,0],[[30,[36,3],["CONSUL_DOCS_LEARN_URL"],null]],null]],[14,"rel","noopener noreferrer"],[14,"target","_blank"],[12],[2,"\\n Learn guides\\n "],[13],[2,"\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[13],[2,"\\n "],[13],[2,"\\n"]],"parameters":[]},{"statements":[[6,[37,2],[[32,1]],null,[["default"],[{"statements":[[2," "],[11,"span"],[16,0,[31,["consul-external-source ",[32,1]]]],[17,3],[12],[2,"\\n"],[6,[37,2],[[32,2]],null,[["default","else"],[{"statements":[[2," "],[1,[32,2]],[2,"\\n"]],"parameters":[]},{"statements":[[2," Registered via "],[1,[30,[36,1],[[30,[36,0],["common.brand.",[32,1]],null]],null]],[2,"\\n"]],"parameters":[]}]]],[2," "],[13],[2,"\\n "]],"parameters":[]}]]]],"parameters":[]}]]]],"parameters":[1]}]]]],"parameters":[]}]]]],"hasEval":false,"upvars":["concat","t","if","env","eq","and","service/external-source","let"]}',meta:{moduleName:"consul-ui/components/consul/external-source/index.hbs"}}) -var n=Ember._setComponentTemplate(t,Ember._templateOnlyComponent()) -e.default=n})),define("consul-ui/components/consul/health-check/list/index",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const t=Ember.HTMLBars.template({id:"IRYzjPsd",block:'{"symbols":["item","&attrs","@items"],"statements":[[11,"div"],[24,0,"consul-health-check-list"],[17,2],[12],[2,"\\n "],[10,"ul"],[12],[2,"\\n"],[6,[37,6],[[30,[36,5],[[30,[36,5],[[32,3]],null]],null]],null,[["default"],[{"statements":[[2," "],[10,"li"],[15,0,[30,[36,1],["health-check-output ",[32,1,["Status"]]],null]],[12],[2,"\\n "],[10,"div"],[12],[2,"\\n "],[10,"header"],[12],[2,"\\n "],[10,"h2"],[12],[1,[32,1,["Name"]]],[13],[2,"\\n "],[13],[2,"\\n "],[10,"dl"],[12],[2,"\\n"],[6,[37,3],[[30,[36,2],[[32,1,["Kind"]],"node"],null]],null,[["default","else"],[{"statements":[[2," "],[10,"dt"],[12],[2,"NodeName"],[13],[2,"\\n "],[10,"dd"],[12],[1,[32,1,["Node"]]],[13],[2,"\\n"]],"parameters":[]},{"statements":[[2," "],[10,"dt"],[12],[2,"ServiceName"],[13],[2,"\\n "],[10,"dd"],[12],[1,[32,1,["ServiceName"]]],[13],[2,"\\n"]],"parameters":[]}]]],[2," "],[13],[2,"\\n "],[10,"dl"],[12],[2,"\\n "],[10,"dt"],[12],[2,"CheckID"],[13],[2,"\\n "],[10,"dd"],[12],[1,[30,[36,4],[[32,1,["CheckID"]],"-"],null]],[13],[2,"\\n "],[13],[2,"\\n "],[10,"dl"],[12],[2,"\\n "],[10,"dt"],[12],[2,"Type"],[13],[2,"\\n "],[10,"dd"],[14,"data-health-check-type",""],[12],[2,"\\n "],[1,[32,1,["Type"]]],[2,"\\n"],[6,[37,3],[[32,1,["Exposed"]]],null,[["default"],[{"statements":[[2," "],[11,"em"],[4,[38,0],["Expose.checks is set to true, so all registered HTTP and gRPC check paths are exposed through Envoy for the Consul agent."],null],[12],[2,"Exposed"],[13],[2,"\\n"]],"parameters":[]}]]],[2," "],[13],[2,"\\n "],[13],[2,"\\n "],[10,"dl"],[12],[2,"\\n "],[10,"dt"],[12],[2,"Notes"],[13],[2,"\\n "],[10,"dd"],[12],[1,[30,[36,4],[[32,1,["Notes"]],"-"],null]],[13],[2,"\\n "],[13],[2,"\\n "],[10,"dl"],[12],[2,"\\n "],[10,"dt"],[12],[2,"Output"],[13],[2,"\\n "],[10,"dd"],[12],[2,"\\n "],[10,"pre"],[12],[10,"code"],[12],[1,[32,1,["Output"]]],[13],[13],[2,"\\n "],[8,"copy-button",[],[["@value","@name"],[[32,1,["Output"]],"output"]],null],[2,"\\n "],[13],[2,"\\n "],[13],[2,"\\n "],[13],[2,"\\n "],[13],[2,"\\n"]],"parameters":[1]}]]],[2," "],[13],[2,"\\n"],[13],[2,"\\n"]],"hasEval":false,"upvars":["tooltip","concat","eq","if","or","-track-array","each"]}',meta:{moduleName:"consul-ui/components/consul/health-check/list/index.hbs"}}) -var n=Ember._setComponentTemplate(t,Ember._templateOnlyComponent()) -e.default=n})),define("consul-ui/components/consul/health-check/search-bar/index",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const t=Ember.HTMLBars.template({id:"FSYiXBjC",block:'{"symbols":["__arg0","__arg1","search","components","Optgroup","Option","selectable","search","components","Optgroup","Option","item","components","Optgroup","Option","item","components","Optgroup","Option","state","search","components","Optgroup","Option","prop","search","key","value","@sort","@filter","@onsearch","@search","&attrs"],"statements":[[8,"search-bar",[[24,0,"consul-healthcheck-search-bar"],[17,33]],[["@filter","@namedBlocksInfo"],[[32,30],[30,[36,14],null,[["status","search","filter","sort"],[1,1,1,1]]]]],[["default"],[{"statements":[[6,[37,8],[[30,[36,7],[[32,1],"status"],null]],null,[["default","else"],[{"statements":[[6,[37,6],[[32,2]],null,[["default"],[{"statements":[[2,"\\n\\n"],[6,[37,6],[[30,[36,0],[[30,[36,10],["components.consul.health-check.search-bar.",[32,26,["status","key"]],".name"],null]],[["default"],[[30,[36,4],[[30,[36,10],["common.search.",[32,26,["status","key"]]],null],[30,[36,10],["common.consul.",[32,26,["status","key"]]],null]],null]]]],[30,[36,0],[[30,[36,10],["components.consul.health-check.search-bar.",[32,26,["status","key"]],".options.",[32,26,["status","value"]]],null]],[["default"],[[30,[36,4],[[30,[36,10],["common.search.",[32,26,["status","value"]]],null],[30,[36,10],["common.consul.",[32,26,["status","value"]]],null]],null]]]]],null,[["default"],[{"statements":[[2," "],[8,[32,26,["RemoveFilter"]],[[16,"aria-label",[30,[36,0],["common.ui.remove"],[["item"],[[30,[36,10],[[32,27]," ",[32,28]],null]]]]]],[[],[]],[["default"],[{"statements":[[2,"\\n "],[10,"dl"],[12],[2,"\\n "],[10,"dt"],[12],[1,[32,27]],[13],[2,"\\n "],[10,"dd"],[12],[1,[32,28]],[13],[2,"\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[27,28]}]]],[2,"\\n "]],"parameters":[26]}]]]],"parameters":[]},{"statements":[[6,[37,8],[[30,[36,7],[[32,1],"search"],null]],null,[["default","else"],[{"statements":[[6,[37,6],[[32,2]],null,[["default"],[{"statements":[[2,"\\n "],[8,[32,21,["Search"]],[],[["@onsearch","@value","@placeholder"],[[30,[36,3],[[32,0],[32,31]],null],[32,32],[30,[36,0],["common.search.search"],null]]],[["default"],[{"statements":[[2,"\\n"],[6,[37,8],[[32,30,["searchproperty"]]],null,[["default"],[{"statements":[[2," "],[8,[32,21,["Select"]],[[24,0,"type-search-properties"]],[["@position","@onchange","@multiple","@required"],["right",[30,[36,3],[[32,0],[32,30,["searchproperty","change"]]],null],true,true]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["selected"]],[["default"],[{"statements":[[2,"\\n "],[10,"span"],[12],[2,"\\n "],[1,[30,[36,0],["common.search.searchproperty"],null]],[2,"\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["options"]],[["default"],[{"statements":[[2,"\\n"],[6,[37,6],[[32,22,["Optgroup"]],[32,22,["Option"]]],null,[["default"],[{"statements":[[6,[37,12],[[30,[36,11],[[30,[36,11],[[32,30,["searchproperty","default"]]],null]],null]],null,[["default"],[{"statements":[[2," "],[8,[32,24],[],[["@value","@selected"],[[32,25],[30,[36,9],[[32,25],[32,30,["searchproperty","value"]]],null]]],[["default"],[{"statements":[[2,"\\n "],[1,[30,[36,0],[[30,[36,10],["common.consul.",[30,[36,13],[[32,25]],null]],null]],null]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[25]}]]]],"parameters":[23,24]}]]],[2," "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[22]}]]],[2,"\\n"]],"parameters":[]}]]],[2," "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[21]}]]]],"parameters":[]},{"statements":[[6,[37,8],[[30,[36,7],[[32,1],"filter"],null]],null,[["default","else"],[{"statements":[[6,[37,6],[[32,2]],null,[["default"],[{"statements":[[2,"\\n "],[8,[32,8,["Select"]],[[24,0,"type-status"]],[["@position","@onchange","@multiple"],["left",[30,[36,3],[[32,0],[32,30,["status","change"]]],null],true]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["selected"]],[["default"],[{"statements":[[2,"\\n "],[10,"span"],[12],[2,"\\n "],[1,[30,[36,0],["common.consul.status"],null]],[2,"\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["options"]],[["default"],[{"statements":[[2,"\\n"],[6,[37,6],[[32,17,["Optgroup"]],[32,17,["Option"]]],null,[["default"],[{"statements":[[6,[37,12],[[30,[36,11],[[30,[36,11],[[30,[36,4],["passing","warning","critical","empty"],null]],null]],null]],null,[["default"],[{"statements":[[2," "],[8,[32,19],[[16,0,[31,["value-",[32,20]]]]],[["@value","@selected"],[[32,20],[30,[36,9],[[32,20],[32,30,["status","value"]]],null]]],[["default"],[{"statements":[[2,"\\n "],[1,[30,[36,0],[[30,[36,10],["common.consul.",[32,20]],null]],[["default"],[[30,[36,4],[[30,[36,10],["common.search.",[32,20]],null]],null]]]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[20]}]]]],"parameters":[18,19]}]]],[2," "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[17]}]]],[2,"\\n"],[6,[37,8],[[32,30,["kind"]]],null,[["default"],[{"statements":[[2," "],[8,[32,8,["Select"]],[[24,0,"type-kind"]],[["@position","@onchange","@multiple"],["left",[30,[36,3],[[32,0],[32,30,["kind","change"]]],null],true]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["selected"]],[["default"],[{"statements":[[2,"\\n "],[10,"span"],[12],[2,"\\n "],[1,[30,[36,0],["components.consul.health-check.search-bar.kind.name"],null]],[2,"\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["options"]],[["default"],[{"statements":[[2,"\\n"],[6,[37,6],[[32,13,["Optgroup"]],[32,13,["Option"]]],null,[["default"],[{"statements":[[6,[37,12],[[30,[36,11],[[30,[36,11],[[30,[36,4],["service","node"],null]],null]],null]],null,[["default"],[{"statements":[[2," "],[8,[32,15],[],[["@value","@selected"],[[32,16],[30,[36,9],[[32,16],[32,30,["kind","value"]]],null]]],[["default"],[{"statements":[[2,"\\n "],[1,[30,[36,0],[[30,[36,10],["components.consul.health-check.search-bar.kind.options.",[32,16]],null]],[["default"],[[30,[36,4],[[30,[36,10],["common.search.",[32,16]],null]],null]]]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[16]}]]]],"parameters":[14,15]}]]],[2," "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[13]}]]],[2,"\\n"]],"parameters":[]}]]],[2," "],[8,[32,8,["Select"]],[[24,0,"type-check"]],[["@position","@onchange","@multiple"],["left",[30,[36,3],[[32,0],[32,30,["check","change"]]],null],true]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["selected"]],[["default"],[{"statements":[[2,"\\n "],[10,"span"],[12],[2,"\\n "],[1,[30,[36,0],["components.consul.health-check.search-bar.check.name"],null]],[2,"\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["options"]],[["default"],[{"statements":[[2,"\\n"],[6,[37,6],[[32,9,["Optgroup"]],[32,9,["Option"]]],null,[["default"],[{"statements":[[6,[37,12],[[30,[36,11],[[30,[36,11],[[30,[36,4],["alias","docker","grpc","http","script","serf","tcp","ttl"],null]],null]],null]],null,[["default"],[{"statements":[[2," "],[8,[32,11],[],[["@value","@selected"],[[32,12],[30,[36,9],[[32,12],[32,30,["check","value"]]],null]]],[["default"],[{"statements":[[2,"\\n "],[1,[30,[36,0],[[30,[36,10],["components.consul.health-check.search-bar.check.options.",[32,12]],null]],[["default"],[[30,[36,4],[[30,[36,10],["common.search.",[32,12]],null]],null]]]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[12]}]]]],"parameters":[10,11]}]]],[2," "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[9]}]]],[2,"\\n "]],"parameters":[8]}]]]],"parameters":[]},{"statements":[[6,[37,8],[[30,[36,7],[[32,1],"sort"],null]],null,[["default"],[{"statements":[[6,[37,6],[[32,2]],null,[["default"],[{"statements":[[2,"\\n "],[8,[32,3,["Select"]],[[24,0,"type-sort"]],[["@position","@onchange","@multiple","@required"],["right",[30,[36,3],[[32,0],[32,29,["change"]]],null],false,true]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["selected"]],[["default"],[{"statements":[[2,"\\n "],[10,"span"],[12],[2,"\\n"],[6,[37,6],[[30,[36,5],[[30,[36,4],[[30,[36,4],["Name:asc",[30,[36,0],["common.sort.alpha.asc"],null]],null],[30,[36,4],["Name:desc",[30,[36,0],["common.sort.alpha.desc"],null]],null],[30,[36,4],["Status:asc",[30,[36,0],["common.sort.status.asc"],null]],null],[30,[36,4],["Status:desc",[30,[36,0],["common.sort.status.desc"],null]],null],[30,[36,4],["Kind:asc",[30,[36,0],["components.consul.health-check.search-bar.sort.kind.asc"],null]],null],[30,[36,4],["Kind:desc",[30,[36,0],["components.consul.health-check.search-bar.sort.kind.desc"],null]],null]],null]],null]],null,[["default"],[{"statements":[[2," "],[1,[30,[36,2],[[32,7],[32,29,["value"]]],null]],[2,"\\n"]],"parameters":[7]}]]],[2," "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["options"]],[["default"],[{"statements":[[2,"\\n"],[6,[37,6],[[32,4,["Optgroup"]],[32,4,["Option"]]],null,[["default"],[{"statements":[[2," "],[8,[32,5],[],[["@label"],[[30,[36,0],["common.consul.status"],null]]],[["default"],[{"statements":[[2,"\\n "],[8,[32,6],[],[["@value","@selected"],["Status:asc",[30,[36,1],["Status:asc",[32,29,["value"]]],null]]],[["default"],[{"statements":[[1,[30,[36,0],["common.sort.status.asc"],null]]],"parameters":[]}]]],[2,"\\n "],[8,[32,6],[],[["@value","@selected"],["Status:desc",[30,[36,1],["Status:desc",[32,29,["value"]]],null]]],[["default"],[{"statements":[[1,[30,[36,0],["common.sort.status.desc"],null]]],"parameters":[]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,[32,5],[],[["@label"],[[30,[36,0],["components.consul.health-check.search-bar.sort.name.name"],null]]],[["default"],[{"statements":[[2,"\\n "],[8,[32,6],[],[["@value","@selected"],["Name:asc",[30,[36,1],["Name:asc",[32,29,["value"]]],null]]],[["default"],[{"statements":[[1,[30,[36,0],["common.sort.alpha.asc"],null]]],"parameters":[]}]]],[2,"\\n "],[8,[32,6],[],[["@value","@selected"],["Name:desc",[30,[36,1],["Name:desc",[32,29,["value"]]],null]]],[["default"],[{"statements":[[1,[30,[36,0],["common.sort.alpha.desc"],null]]],"parameters":[]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,[32,5],[],[["@label"],[[30,[36,0],["components.consul.health-check.search-bar.sort.kind.name"],null]]],[["default"],[{"statements":[[2,"\\n "],[8,[32,6],[],[["@value","@selected"],["Kind:asc",[30,[36,1],["Kind:asc",[32,29]],null]]],[["default"],[{"statements":[[2,"Service to Node"]],"parameters":[]}]]],[2,"\\n "],[8,[32,6],[],[["@value","@selected"],["Kind:desc",[30,[36,1],["Kind:desc",[32,29]],null]]],[["default"],[{"statements":[[2,"Node to Service"]],"parameters":[]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[5,6]}]]],[2," "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[4]}]]],[2,"\\n "]],"parameters":[3]}]]]],"parameters":[]}]]]],"parameters":[]}]]]],"parameters":[]}]]]],"parameters":[]}]]]],"parameters":[1,2]}]]]],"hasEval":false,"upvars":["t","eq","get","action","array","from-entries","let","-is-named-block-invocation","if","contains","concat","-track-array","each","lowercase","hash"]}',meta:{moduleName:"consul-ui/components/consul/health-check/search-bar/index.hbs"}}) -var n=Ember._setComponentTemplate(t,Ember._templateOnlyComponent()) -e.default=n})) -define("consul-ui/components/consul/instance-checks/index",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const t=Ember.HTMLBars.template({id:"rPbWf6F2",block:'{"symbols":["grouped","checks","status","humanized","@type","@items","&attrs"],"statements":[[6,[37,8],[[30,[36,10],["Status",[30,[36,3],[[32,6],[30,[36,5],null,null]],null]],null]],null,[["default"],[{"statements":[[6,[37,8],[[30,[36,3],[[30,[36,2],[[30,[36,9],[[32,1,["critical","length"]],0],null],[32,1,["critical"]]],null],[30,[36,2],[[30,[36,9],[[32,1,["warning","length"]],0],null],[32,1,["warning"]]],null],[30,[36,2],[[30,[36,9],[[32,1,["passing","length"]],0],null],[32,1,["passing"]]],null],[30,[36,5],null,null]],null]],null,[["default"],[{"statements":[[6,[37,8],[[32,2,["firstObject","Status"]]],null,[["default"],[{"statements":[[2," "],[11,"dl"],[16,0,[30,[36,6],["consul-instance-checks",[30,[36,5],["empty",[30,[36,1],[[32,2,["length"]],0],null]],null],[30,[36,5],[[32,3],[30,[36,4],[[32,2,["length"]],0],null]],null]],null]],[17,7],[12],[2,"\\n "],[10,"dt"],[12],[2,"\\n "],[8,"tooltip",[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[1,[30,[36,7],[[32,5]],null]],[2," Checks\\n "]],"parameters":[]}]]],[2,"\\n "],[13],[2,"\\n"],[6,[37,8],[[30,[36,3],[[30,[36,2],[[30,[36,1],[[32,3],"critical"],null],"failing"],null],[30,[36,2],[[30,[36,1],[[32,3],"warning"],null],"with a warning"],null],[32,3]],null]],null,[["default"],[{"statements":[[2," "],[10,"dd"],[12],[2,"\\n "],[1,[30,[36,3],[[30,[36,2],[[30,[36,1],[[32,2,["length"]],0],null],[30,[36,0],["No ",[32,5]," checks"],null]],null],[30,[36,2],[[30,[36,1],[[32,2,["length"]],[32,6,["length"]]],null],[30,[36,0],["All ",[32,5]," checks ",[32,4]],null]],null],[30,[36,0],[[32,2,["length"]],"/",[32,6,["length"]]," ",[32,5]," checks ",[32,4]],null]],null]],[2,"\\n "],[13],[2,"\\n"]],"parameters":[4]}]]],[2," "],[13],[2,"\\n"]],"parameters":[3]}]]]],"parameters":[2]}]]]],"parameters":[1]}]]]],"hasEval":false,"upvars":["concat","eq","if","or","not-eq","array","class-map","capitalize","let","gt","group-by"]}',meta:{moduleName:"consul-ui/components/consul/instance-checks/index.hbs"}}) -var n=Ember._setComponentTemplate(t,Ember._templateOnlyComponent()) -e.default=n})),define("consul-ui/components/consul/intention/form/fieldsets/index",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const t=Ember.HTMLBars.template({id:"RvLiSiHb",block:'{"symbols":["modal","permissionForm","_action","radio","partition","nspace","service","partition","nspace","service","&attrs","@dc"],"statements":[[11,"div"],[17,11],[24,0,"consul-intention-fieldsets"],[12],[2,"\\n "],[10,"fieldset"],[15,"disabled",[34,22]],[12],[2,"\\n "],[10,"div"],[14,"role","group"],[12],[2,"\\n "],[10,"fieldset"],[12],[2,"\\n "],[10,"h2"],[12],[2,"Source"],[13],[2,"\\n "],[10,"label"],[15,0,[31,["type-select",[30,[36,9],[[35,1,["error","SourceName"]]," has-error"],null]]]],[12],[2,"\\n "],[10,"span"],[12],[2,"Source Service"],[13],[2,"\\n "],[8,"power-select-with-create",[],[["@disabled","@options","@searchField","@selected","@searchPlaceholder","@buildSuggestion","@showCreateWhen","@onCreate","@onChange"],[[30,[36,15],[[35,14]],null],[34,23],"Name",[34,24],"Type service name",[30,[36,3],[[32,0],"createNewLabel","Use a Consul Service called \'{{term}}\'"],null],[30,[36,3],[[32,0],"isUnique",[35,23]],null],[30,[36,3],[[32,0],[35,13],"SourceName"],null],[30,[36,3],[[32,0],[35,13],"SourceName"],null]]],[["default"],[{"statements":[[2,"\\n"],[6,[37,9],[[30,[36,12],[[32,10,["Name"]],"*"],null]],null,[["default","else"],[{"statements":[[2," * (All Services)\\n"]],"parameters":[]},{"statements":[[2," "],[1,[32,10,["Name"]]],[2,"\\n"]],"parameters":[]}]]],[2," "]],"parameters":[10]}]]],[2,"\\n"],[6,[37,9],[[35,14]],null,[["default"],[{"statements":[[2," "],[10,"em"],[12],[2,"Search for an existing service, or enter any Service name."],[13],[2,"\\n"]],"parameters":[]}]]],[2," "],[13],[2,"\\n"],[6,[37,9],[[30,[36,25],["choose nspaces"],null]],null,[["default"],[{"statements":[[2," "],[10,"label"],[15,0,[31,["type-select",[30,[36,9],[[35,1,["error","SourceNS"]]," has-error"],null]]]],[12],[2,"\\n "],[10,"span"],[12],[2,"Source Namespace"],[13],[2,"\\n "],[8,"power-select-with-create",[],[["@disabled","@options","@selected","@searchPlaceholder","@buildSuggestion","@showCreateWhen","@onCreate","@onChange"],[[30,[36,15],[[35,14]],null],[34,18],[34,21],"Type namespace name",[30,[36,3],[[32,0],"createNewLabel","Use a Consul Namespace called \'{{term}}\'"],null],[30,[36,3],[[32,0],"isUnique",[35,18]],null],[30,[36,3],[[32,0],[35,13],"SourceNS"],null],[30,[36,3],[[32,0],[35,13],"SourceNS"],null]]],[["default"],[{"statements":[[2,"\\n"],[6,[37,9],[[30,[36,12],[[32,9,["Name"]],"*"],null]],null,[["default","else"],[{"statements":[[2," * (All Namespaces)\\n"]],"parameters":[]},{"statements":[[2," "],[1,[32,9,["Name"]]],[2,"\\n"]],"parameters":[]}]]],[2," "]],"parameters":[9]}]]],[2,"\\n"],[6,[37,9],[[35,14]],null,[["default"],[{"statements":[[2," "],[10,"em"],[12],[2,"Search for an existing namespace, or enter any Namespace name."],[13],[2,"\\n"]],"parameters":[]}]]],[2," "],[13],[2,"\\n"]],"parameters":[]}]]],[6,[37,9],[[30,[36,25],["choose partitions"],[["dc"],[[32,12]]]]],null,[["default"],[{"statements":[[2," "],[10,"label"],[15,0,[31,["type-select",[30,[36,9],[[35,1,["error","SourcePartition"]]," has-error"],null]]]],[12],[2,"\\n "],[10,"span"],[12],[2,"Source Partition"],[13],[2,"\\n "],[8,"power-select-with-create",[],[["@disabled","@options","@selected","@searchPlaceholder","@buildSuggestion","@showCreateWhen","@onCreate","@onChange"],[[30,[36,15],[[35,14]],null],[34,16],[34,20],"Type partition name",[30,[36,3],[[32,0],"createNewLabel","Use a Consul Partition called \'{{term}}\'"],null],[30,[36,3],[[32,0],"isUnique",[35,16]],null],[30,[36,3],[[32,0],[35,13],"SourcePartition"],null],[30,[36,3],[[32,0],[35,13],"SourcePartition"],null]]],[["default"],[{"statements":[[2,"\\n "],[1,[32,8,["Name"]]],[2,"\\n "]],"parameters":[8]}]]],[2,"\\n"],[6,[37,9],[[35,14]],null,[["default"],[{"statements":[[2," "],[10,"em"],[12],[2,"Search for an existing partition, or enter any Partition name."],[13],[2,"\\n"]],"parameters":[]}]]],[2," "],[13],[2,"\\n"]],"parameters":[]}]]],[2," "],[13],[2,"\\n "],[10,"fieldset"],[12],[2,"\\n "],[10,"h2"],[12],[2,"Destination"],[13],[2,"\\n "],[10,"label"],[15,0,[31,["type-select",[30,[36,9],[[35,1,["error","DestinationName"]]," has-error"],null]]]],[12],[2,"\\n "],[10,"span"],[12],[2,"Destination Service"],[13],[2,"\\n "],[8,"power-select-with-create",[],[["@disabled","@options","@searchField","@selected","@searchPlaceholder","@buildSuggestion","@showCreateWhen","@onCreate","@onChange"],[[30,[36,15],[[35,14]],null],[34,23],"Name",[34,26],"Type service name",[30,[36,3],[[32,0],"createNewLabel","Use a Consul Service called \'{{term}}\'"],null],[30,[36,3],[[32,0],"isUnique",[35,23]],null],[30,[36,3],[[32,0],[35,13],"DestinationName"],null],[30,[36,3],[[32,0],[35,13],"DestinationName"],null]]],[["default"],[{"statements":[[2,"\\n"],[6,[37,9],[[30,[36,12],[[32,7,["Name"]],"*"],null]],null,[["default","else"],[{"statements":[[2," * (All Services)\\n"]],"parameters":[]},{"statements":[[2," "],[1,[32,7,["Name"]]],[2,"\\n"]],"parameters":[]}]]],[2," "]],"parameters":[7]}]]],[2,"\\n"],[6,[37,9],[[35,14]],null,[["default"],[{"statements":[[2," "],[10,"em"],[12],[2,"Search for an existing service, or enter any Service name."],[13],[2,"\\n"]],"parameters":[]}]]],[2," "],[13],[2,"\\n"],[6,[37,9],[[30,[36,25],["choose nspaces"],null]],null,[["default"],[{"statements":[[2," "],[10,"label"],[15,0,[31,["type-select",[30,[36,9],[[35,1,["error","DestinationNS"]]," has-error"],null]]]],[12],[2,"\\n "],[10,"span"],[12],[2,"Destination Namespace"],[13],[2,"\\n "],[8,"power-select-with-create",[],[["@disabled","@options","@searchField","@selected","@searchPlaceholder","@buildSuggestion","@showCreateWhen","@onCreate","@onChange"],[[30,[36,15],[[35,14]],null],[34,18],"Name",[34,19],"Type namespace name",[30,[36,3],[[32,0],"createNewLabel","Use a future Consul Namespace called \'{{term}}\'"],null],[30,[36,3],[[32,0],"isUnique",[35,18]],null],[30,[36,3],[[32,0],[35,13],"DestinationNS"],null],[30,[36,3],[[32,0],[35,13],"DestinationNS"],null]]],[["default"],[{"statements":[[2,"\\n"],[6,[37,9],[[30,[36,12],[[32,6,["Name"]],"*"],null]],null,[["default","else"],[{"statements":[[2," * (All Namespaces)\\n"]],"parameters":[]},{"statements":[[2," "],[1,[32,6,["Name"]]],[2,"\\n"]],"parameters":[]}]]],[2," "]],"parameters":[6]}]]],[2,"\\n"],[6,[37,9],[[35,14]],null,[["default"],[{"statements":[[2," "],[10,"em"],[12],[2,"For the destination, you may choose any namespace for which you have access."],[13],[2,"\\n"]],"parameters":[]}]]],[2," "],[13],[2,"\\n"]],"parameters":[]}]]],[6,[37,9],[[30,[36,25],["choose partitions"],[["dc"],[[32,12]]]]],null,[["default"],[{"statements":[[2," "],[10,"label"],[15,0,[31,["type-select",[30,[36,9],[[35,1,["error","DestinationPartition"]]," has-error"],null]]]],[12],[2,"\\n "],[10,"span"],[12],[2,"Destination Partition"],[13],[2,"\\n "],[8,"power-select-with-create",[],[["@disabled","@options","@searchField","@selected","@searchPlaceholder","@buildSuggestion","@showCreateWhen","@onCreate","@onChange"],[[30,[36,15],[[35,14]],null],[34,16],"Name",[34,17],"Type partition name",[30,[36,3],[[32,0],"createNewLabel","Use a future Consul Partition called \'{{term}}\'"],null],[30,[36,3],[[32,0],"isUnique",[35,16]],null],[30,[36,3],[[32,0],[35,13],"DestinationPartition"],null],[30,[36,3],[[32,0],[35,13],"DestinationPartition"],null]]],[["default"],[{"statements":[[2,"\\n "],[1,[32,5,["Name"]]],[2,"\\n "]],"parameters":[5]}]]],[2,"\\n"],[6,[37,9],[[35,14]],null,[["default"],[{"statements":[[2," "],[10,"em"],[12],[2,"For the destination, you may choose any partition for which you have access."],[13],[2,"\\n"]],"parameters":[]}]]],[2," "],[13],[2,"\\n"]],"parameters":[]}]]],[2," "],[13],[2,"\\n "],[13],[2,"\\n "],[10,"fieldset"],[12],[2,"\\n "],[10,"label"],[15,0,[31,["type-text",[30,[36,9],[[35,1,["error","Description"]]," has-error"],null]]]],[12],[2,"\\n "],[10,"span"],[12],[2,"Description (Optional)"],[13],[2,"\\n "],[10,"input"],[14,3,"Description"],[15,2,[34,1,["Description"]]],[14,"placeholder","Description (Optional)"],[15,"onchange",[30,[36,3],[[32,0],[35,13]],null]],[14,4,"text"],[12],[13],[2,"\\n "],[13],[2,"\\n "],[13],[2,"\\n "],[10,"div"],[12],[2,"\\n "],[10,"span"],[14,0,"label"],[12],[2,"Should this source connect to the destination?"],[13],[2,"\\n "],[10,"div"],[14,"role","radiogroup"],[15,0,[30,[36,9],[[35,1,["error","Action"]]," has-error"],null]],[12],[2,"\\n"],[6,[37,30],[[30,[36,29],[[30,[36,29],[[30,[36,28],[[30,[36,27],null,[["intent","header","body"],["allow","Allow","The source service will be allowed to connect to the destination."]]],[30,[36,27],null,[["intent","header","body"],["deny","Deny","The source service will not be allowed to connect to the destination."]]],[30,[36,27],null,[["intent","header","body"],["","Application Aware","The source service may or may not connect to the destination service via unique permissions based on Layer 7 criteria: path, header, or method."]]]],null]],null]],null]],null,[["default"],[{"statements":[[2," "],[8,"radio-card",[[16,0,[30,[36,10],["value-",[32,3,["intent"]]],null]]],[["@value","@checked","@onchange","@name"],[[32,3,["intent"]],[30,[36,9],[[30,[36,12],[[30,[36,11],[[35,1,["Action"]],""],null],[32,3,["intent"]]],null],"checked"],null],[30,[36,3],[[32,0],[35,13]],null],"Action"]],[["default"],[{"statements":[[2,"\\n "],[10,"header"],[12],[2,"\\n "],[1,[32,3,["header"]]],[2,"\\n "],[13],[2,"\\n "],[10,"p"],[12],[2,"\\n "],[1,[32,3,["body"]]],[2,"\\n "],[13],[2,"\\n "]],"parameters":[4]}]]],[2,"\\n"]],"parameters":[3]}]]],[2," "],[13],[2,"\\n "],[13],[2,"\\n "],[13],[2,"\\n"],[6,[37,9],[[30,[36,12],[[30,[36,11],[[35,1,["Action"]],""],null],""],null]],null,[["default"],[{"statements":[[2," "],[10,"fieldset"],[14,0,"permissions"],[12],[2,"\\n "],[11,"button"],[24,4,"button"],[4,[38,7],["click",[30,[36,2],[[32,0,["modal","open"]]],null]],null],[12],[2,"\\n Add permission\\n "],[13],[2,"\\n "],[10,"h2"],[12],[2,"Permissions"],[13],[2,"\\n"],[6,[37,9],[[30,[36,8],[[35,1,["Permissions","length"]],0],null]],null,[["default","else"],[{"statements":[[2," "],[8,"consul/intention/notice/permissions",[],[[],[]],null],[2,"\\n "],[8,"consul/intention/permission/list",[],[["@items","@onclick","@ondelete"],[[34,1,["Permissions"]],[30,[36,6],[[30,[36,3],[[32,0],[30,[36,5],[[35,4]],null]],null],[30,[36,3],[[32,0],[30,[36,2],[[32,0,["modal","open"]]],null]],null]],null],[30,[36,3],[[32,0],"delete","Permissions",[35,1]],null]]],null],[2,"\\n"]],"parameters":[]},{"statements":[[2," "],[8,"empty-state",[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["header"]],[["default"],[{"statements":[[2,"\\n "],[10,"h3"],[12],[2,"\\n No permissions yet\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["body"]],[["default"],[{"statements":[[2,"\\n "],[10,"p"],[12],[2,"\\n Permissions intercept an Intention\'s traffic using Layer 7 criteria, such as path prefixes and http headers.\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["actions"]],[["default"],[{"statements":[[2,"\\n "],[10,"li"],[14,0,"docs-link"],[12],[2,"\\n "],[10,"a"],[15,6,[31,[[30,[36,0],["CONSUL_DOCS_URL"],null],"/commands/intention"]]],[14,"rel","noopener noreferrer"],[14,"target","_blank"],[12],[2,"Documentation"],[13],[2,"\\n "],[13],[2,"\\n "],[10,"li"],[14,0,"learn-link"],[12],[2,"\\n "],[10,"a"],[15,6,[31,[[30,[36,0],["CONSUL_DOCS_LEARN_URL"],null],"/consul/getting-started/connect"]]],[14,"rel","noopener noreferrer"],[14,"target","_blank"],[12],[2,"Read the guide"],[13],[2,"\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[]}]]],[2," "],[13],[2,"\\n"]],"parameters":[]}]]],[2,"\\n "],[8,"modal-dialog",[[24,0,"consul-intention-permission-modal"]],[["@onclose","@aria"],[[30,[36,3],[[32,0],[30,[36,5],[[35,4]],null],[29]],null],[30,[36,27],null,[["label"],["Edit Permission"]]]]],[["default"],[{"statements":[[2,"\\n "],[8,"ref",[],[["@target","@name","@value"],[[32,0],"modal",[32,1]]],null],[2,"\\n "],[8,"block-slot",[],[["@name"],["header"]],[["default"],[{"statements":[[2,"\\n "],[10,"h3"],[12],[2,"Edit Permission"],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["body"]],[["default"],[{"statements":[[2,"\\n "],[8,"consul/intention/permission/form",[],[["@item","@onsubmit"],[[34,4],[30,[36,3],[[32,0],"add","Permissions",[35,1]],null]]],[["default"],[{"statements":[[2,"\\n "],[8,"ref",[],[["@target","@name","@value"],[[32,0],"permissionForm",[32,2]]],null],[2,"\\n "]],"parameters":[2]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["actions"]],[["default"],[{"statements":[[2,"\\n "],[10,"button"],[14,0,"type-submit"],[15,"disabled",[30,[36,9],[[30,[36,15],[[32,0,["permissionForm","isDirty"]]],null],"disabled"],null]],[15,"onclick",[30,[36,6],[[30,[36,3],[[32,0],[32,0,["permissionForm","submit"]]],null],[30,[36,3],[[32,0],[32,1,["close"]]],null]],null]],[14,4,"button"],[12],[2,"\\n Save\\n "],[13],[2,"\\n "],[10,"button"],[14,0,"type-cancel"],[15,"onclick",[30,[36,6],[[30,[36,3],[[32,0],[32,0,["permissionForm","reset"]]],null],[30,[36,3],[[32,0],[32,1,["close"]]],null]],null]],[14,4,"button"],[12],[2,"\\n Cancel\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[1]}]]],[2,"\\n\\n"],[13]],"hasEval":false,"upvars":["env","item","optional","action","permission","mut","queue","on","gt","if","concat","or","eq","onchange","create","not","partitions","DestinationPartition","nspaces","DestinationNS","SourcePartition","SourceNS","disabled","services","SourceName","can","DestinationName","hash","array","-track-array","each"]}',meta:{moduleName:"consul-ui/components/consul/intention/form/fieldsets/index.hbs"}}) -var n=Ember._setComponentTemplate(t,Ember.Component.extend({tagName:"",shouldShowPermissionForm:!1,actions:{createNewLabel:function(e,t){return e.replace(/{{term}}/g,t)},isUnique:function(e,t){return!e.findBy("Name",t)},add:function(e,t,n){!(t.get(e)||[]).includes(n)&&n.isNew&&(t.pushObject(e,n),t.validate())},delete:function(e,t,n){(t.get(e)||[]).includes(n)&&(t.removeObject(e,n),t.validate())}}})) -e.default=n})),define("consul-ui/components/consul/intention/form/index",["exports","@glimmer/component"],(function(e,t){var n,r,a,l,s,i,o,u,c,d,m,p,f,b,h,v,y,g,O,_,P,w,E,k,x,j,C,S,N,z,M,D -function T(e,t,n,r){n&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(r):void 0})}function L(e,t,n,r,a){var l={} -return Object.keys(r).forEach((function(e){l[e]=r[e]})),l.enumerable=!!l.enumerable,l.configurable=!!l.configurable,("value"in l||l.initializer)&&(l.writable=!0),l=n.slice().reverse().reduce((function(n,r){return r(e,t,n)||n}),l),a&&void 0!==l.initializer&&(l.value=l.initializer?l.initializer.call(a):void 0,l.initializer=void 0),void 0===l.initializer&&(Object.defineProperty(e,t,l),l=null),l}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const A=Ember.HTMLBars.template({id:"JJOVYubC",block:'{"symbols":["api","item","readonly","notice","execute","cancel","message","confirm","notice","newAction","modal","close","after","notice","notice","@dc","@partition","&attrs","@nspace","@autofill","@item","@src"],"statements":[[11,"div"],[24,0,"consul-intention"],[17,18],[12],[2,"\\n"],[8,"data-form",[],[["@type","@dc","@nspace","@partition","@autofill","@item","@src","@onchange","@onsubmit"],["intention",[32,16,["Name"]],[32,19],[32,17],[32,20],[32,21],[32,22],[30,[36,10],[[32,0],[32,0,["change"]]],null],[30,[36,10],[[32,0],[32,0,["onsubmit"]]],null]]],[["default"],[{"statements":[[2,"\\n\\n "],[8,"block-slot",[],[["@name"],["error"]],[["default"],[{"statements":[[2,"\\n"],[6,[37,1],[[30,[36,17],[[32,1,["error","detail"]],"duplicate intention found:"],null]],null,[["default","else"],[{"statements":[[2," "],[8,"notice",[[24,0,"notification-update"],[4,[38,16],null,[["after"],[[30,[36,10],[[32,0],[32,13]],null]]]]],[["@type"],["error"]],[["default"],[{"statements":[[2,"\\n "],[8,[32,15,["Header"]],[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[10,"strong"],[12],[2,"Intention exists!"],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,[32,15,["Body"]],[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[10,"p"],[12],[2,"\\n An intention already exists for this Source-Destination pair. Please enter a different combination of Services, or search the intentions to edit an existing intention.\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[15]}]]],[2,"\\n"]],"parameters":[]},{"statements":[[2," "],[8,"notice",[[24,0,"notification-update"],[4,[38,16],null,[["after"],[[30,[36,10],[[32,0],[32,13]],null]]]]],[["@type"],["error"]],[["default"],[{"statements":[[2,"\\n "],[8,[32,14,["Header"]],[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[10,"strong"],[12],[2,"Error!"],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,[32,14,["Body"]],[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[10,"p"],[12],[2,"\\n There was an error saving your intention.\\n"],[6,[37,1],[[30,[36,7],[[32,1,["error","status"]],[32,1,["error","detail"]]],null]],null,[["default"],[{"statements":[[2," "],[10,"br"],[12],[13],[1,[32,1,["error","status"]]],[2,": "],[1,[32,1,["error","detail"]]],[2,"\\n"]],"parameters":[]}]]],[2," "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[14]}]]],[2,"\\n"]],"parameters":[]}]]],[2," "]],"parameters":[13]}]]],[2,"\\n\\n "],[8,"block-slot",[],[["@name"],["form"]],[["default"],[{"statements":[[2,"\\n"],[6,[37,14],[[32,1,["data"]],[30,[36,6],[[30,[36,5],["write intention"],[["item"],[[32,1,["data"]]]]]],null]],null,[["default"],[{"statements":[[6,[37,1],[[30,[36,6],[[32,3]],null]],null,[["default","else"],[{"statements":[[2,"\\n"],[6,[37,14],[[30,[36,13],[[32,2],"Action"],null]],null,[["default"],[{"statements":[[2," "],[8,"modal-dialog",[[24,0,"consul-intention-action-warn-modal warning"]],[["@aria"],[[30,[36,8],null,[["label"],[[30,[36,11],["Set intention to ",[32,10]],null]]]]]],[["default"],[{"statements":[[2,"\\n "],[8,"ref",[],[["@target","@name","@value"],[[32,0],"modal",[32,11]]],null],[2,"\\n "],[8,"block-slot",[],[["@name"],["header"]],[["default"],[{"statements":[[2,"\\n "],[10,"h2"],[12],[2,"Set intention to "],[1,[32,10]],[2,"?"],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["body"]],[["default"],[{"statements":[[2,"\\n "],[10,"p"],[12],[2,"\\n When you change this Intention to "],[1,[32,10]],[2,", you will remove all the Layer 7 policy permissions currently saved to this Intention. Are you sure you want to set it to "],[1,[32,10]],[2,"?\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["actions"]],[["default"],[{"statements":[[2,"\\n "],[11,"button"],[24,0,"dangerous"],[24,4,"button"],[4,[38,3],["click",[32,1,["submit"]]],null],[12],[2,"\\n Set to "],[1,[30,[36,12],[[32,10]],null]],[2,"\\n "],[13],[2,"\\n "],[10,"button"],[14,0,"type-cancel"],[15,"onclick",[32,12]],[14,4,"button"],[12],[2,"\\n No, Cancel\\n "],[13],[2,"\\n "]],"parameters":[12]}]]],[2,"\\n "]],"parameters":[11]}]]],[2,"\\n"]],"parameters":[10]}]]],[2,"\\n "],[8,"data-source",[],[["@src","@onchange"],[[30,[36,9],["/${partition}/*/${dc}/services",[30,[36,8],null,[["partition","dc"],[[32,17],[32,16,["Name"]]]]]],null],[30,[36,10],[[32,0],[32,0,["createServices"]],[32,2]],null]]],null],[2,"\\n\\n"],[6,[37,1],[[30,[36,5],["use nspaces"],null]],null,[["default"],[{"statements":[[2," "],[8,"data-source",[],[["@src","@onchange"],[[30,[36,9],["/${partition}/*/${dc}/namespaces",[30,[36,8],null,[["partition","dc"],[[32,17],[32,16,["Name"]]]]]],null],[30,[36,10],[[32,0],[32,0,["createNspaces"]],[32,2]],null]]],null],[2,"\\n"]],"parameters":[]}]]],[2,"\\n"],[6,[37,1],[[30,[36,5],["use partitions"],null]],null,[["default"],[{"statements":[[2," "],[8,"data-source",[],[["@src","@onchange"],[[30,[36,9],["/*/*/${dc}/partitions",[30,[36,8],null,[["dc"],[[32,16,["Name"]]]]]],null],[30,[36,10],[[32,0],[32,0,["createPartitions"]],[32,2]],null]]],null],[2,"\\n"]],"parameters":[]}]]],[2,"\\n"],[6,[37,1],[[32,1,["isCreate"]]],null,[["default"],[{"statements":[[6,[37,1],[[30,[36,7],[[30,[36,5],["use partitions"],null],[30,[36,6],[[30,[36,5],["choose partitions"],[["dc"],[[32,16]]]]],null]],null]],null,[["default"],[{"statements":[[2," "],[8,"notice",[],[["@type"],["info"]],[["default"],[{"statements":[[2,"\\n "],[8,[32,9,["Header"]],[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[10,"h3"],[12],[2,"\\n Cross-partition communication not supported\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,[32,9,["Body"]],[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[10,"p"],[12],[2,"\\n Cross-partition communication is not supported outside of the primary datacenter. You will only be able to select namespaces for source and destination services.\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[9]}]]],[2,"\\n"]],"parameters":[]}]]],[6,[37,1],[[32,0,["isManagedByCRDs"]]],null,[["default"],[{"statements":[[2," "],[8,"consul/intention/notice/custom-resource",[],[["@type"],["warning"]],null],[2,"\\n"]],"parameters":[]}]]]],"parameters":[]}]]],[2," "],[11,"form"],[4,[38,3],["submit",[30,[36,2],[[32,0,["submit"]],[32,2],[32,1,["submit"]]],null]],null],[12],[2,"\\n "],[8,"consul/intention/form/fieldsets",[],[["@nspaces","@dc","@partitions","@services","@SourceName","@SourceNS","@SourcePartition","@DestinationName","@DestinationNS","@DestinationPartition","@item","@disabled","@create","@onchange"],[[32,0,["nspaces"]],[32,16],[32,0,["partitions"]],[32,0,["services"]],[32,0,["SourceName"]],[32,0,["SourceNS"]],[32,0,["SourcePartition"]],[32,0,["DestinationName"]],[32,0,["DestinationNS"]],[32,0,["DestinationPartition"]],[32,2],[32,1,["disabled"]],[32,1,["isCreate"]],[32,1,["change"]]]],null],[2,"\\n "],[10,"div"],[12],[2,"\\n "],[10,"button"],[15,"disabled",[30,[36,15],[[32,2,["isInvalid"]],[32,1,["disabled"]]],null]],[14,4,"submit"],[12],[2,"\\n Save\\n "],[13],[2,"\\n "],[11,"button"],[16,"disabled",[32,1,["disabled"]]],[24,4,"reset"],[4,[38,3],["click",[30,[36,2],[[32,0,["oncancel"]],[32,2]],null]],null],[12],[2,"\\n Cancel\\n "],[13],[2,"\\n"],[6,[37,1],[[30,[36,6],[[32,1,["isCreate"]]],null]],null,[["default"],[{"statements":[[6,[37,1],[[30,[36,4],[[32,2,["ID"]],"anonymous"],null]],null,[["default"],[{"statements":[[2," "],[8,"confirmation-dialog",[],[["@message"],["Are you sure you want to delete this Intention?"]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["action"]],[["default"],[{"statements":[[2,"\\n "],[11,"button"],[24,0,"type-delete"],[16,"disabled",[32,1,["disabled"]]],[24,4,"button"],[4,[38,3],["click",[30,[36,2],[[32,8],[32,1,["delete"]]],null]],null],[12],[2,"\\n Delete\\n "],[13],[2,"\\n "]],"parameters":[8]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["dialog"]],[["default"],[{"statements":[[2,"\\n "],[8,"delete-confirmation",[],[["@message","@execute","@cancel"],[[32,7],[32,5],[32,6]]],null],[2,"\\n "]],"parameters":[5,6,7]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[]}]]]],"parameters":[]}]]],[2," "],[13],[2,"\\n "],[13],[2,"\\n"]],"parameters":[]},{"statements":[[2,"\\n"],[6,[37,1],[[32,2,["IsManagedByCRD"]]],null,[["default"],[{"statements":[[2," "],[8,"notice",[[24,0,"crd"]],[["@type"],["warning"]],[["default"],[{"statements":[[2,"\\n "],[8,[32,4,["Header"]],[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[10,"h3"],[12],[2,"\\n Intention Custom Resource\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,[32,4,["Body"]],[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[10,"p"],[12],[2,"\\n This Intention is view only because it is managed through an Intention Custom Resource in your Kubernetes cluster.\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,[32,4,["Footer"]],[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[10,"p"],[12],[2,"\\n "],[10,"a"],[15,6,[31,[[30,[36,0],["CONSUL_DOCS_URL"],null],"/k8s/crds"]]],[14,"target","_blank"],[14,"rel","noopener noreferrer"],[12],[2,"Learn more about CRDs"],[13],[2,"\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[4]}]]],[2,"\\n"]],"parameters":[]}]]],[2,"\\n "],[8,"consul/intention/view",[],[["@item"],[[32,2]]],null],[2,"\\n"]],"parameters":[]}]]]],"parameters":[2,3]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[1]}]]],[2,"\\n"],[13],[2,"\\n"]],"hasEval":false,"upvars":["env","if","fn","on","not-eq","can","not","and","hash","uri","action","concat","capitalize","changeset-get","let","or","notification","string-starts-with"]}',meta:{moduleName:"consul-ui/components/consul/intention/form/index.hbs"}}) -let R=(n=Ember._tracked,r=Ember._tracked,a=Ember._tracked,l=Ember._tracked,s=Ember._tracked,i=Ember._tracked,o=Ember._tracked,u=Ember._tracked,c=Ember._tracked,d=Ember._tracked,m=Ember.inject.service("repository/intention"),p=Ember._action,f=Ember._action,b=Ember._action,h=Ember._action,v=Ember._action,y=Ember._action,g=Ember._action,O=Ember._action,_=Ember._action,P=class extends t.default{constructor(e,t){var n,r,a -super(...arguments),T(this,"services",w,this),T(this,"SourceName",E,this),T(this,"DestinationName",k,this),T(this,"nspaces",x,this),T(this,"SourceNS",j,this),T(this,"DestinationNS",C,this),T(this,"partitions",S,this),T(this,"SourcePartition",N,this),T(this,"DestinationPartition",z,this),T(this,"isManagedByCRDs",M,this),a=null,(r="modal")in(n=this)?Object.defineProperty(n,r,{value:a,enumerable:!0,configurable:!0,writable:!0}):n[r]=a,T(this,"repo",D,this),this.updateCRDManagement()}ondelete(){this.args.ondelete?this.args.ondelete(...arguments):this.onsubmit(...arguments)}oncancel(){this.args.oncancel?this.args.oncancel(...arguments):this.onsubmit(...arguments)}onsubmit(){this.args.onsubmit&&this.args.onsubmit(...arguments)}updateCRDManagement(){this.isManagedByCRDs=this.repo.isManagedByCRDs()}submit(e,t,n){n.preventDefault(),void 0!==e.change.Action&&void 0===e.data.Action?this.modal.open():t()}createServices(e,t){let n=t.data.uniqBy("Name").toArray().filter(e=>!["connect-proxy","mesh-gateway","terminating-gateway"].includes(e.Kind)).sort((e,t)=>e.Name.localeCompare(t.Name)) -n=[{Name:"*"}].concat(n) -let r=n.findBy("Name",e.SourceName) -r||(r={Name:e.SourceName},n=[r].concat(n)) -let a=n.findBy("Name",e.DestinationName) -a||(a={Name:e.DestinationName},n=[a].concat(n)),this.services=n,this.SourceName=r,this.DestinationName=a}createNspaces(e,t){let n=t.data.toArray().sort((e,t)=>e.Name.localeCompare(t.Name)) -n=[{Name:"*"}].concat(n) -let r=n.findBy("Name",e.SourceNS) -r||(r={Name:e.SourceNS},n=[r].concat(n)) -let a=n.findBy("Name",e.DestinationNS) -a||(a={Name:e.DestinationNS},n=[a].concat(n)),this.nspaces=n,this.SourceNS=r,this.DestinationNS=a}createPartitions(e,t){let n=t.data.toArray().sort((e,t)=>e.Name.localeCompare(t.Name)),r=n.findBy("Name",e.SourcePartition) -r||(r={Name:e.SourcePartition},n=[r].concat(n)) -let a=n.findBy("Name",e.DestinationPartition) -a||(a={Name:e.DestinationPartition},n=[a].concat(n)),this.partitions=n,this.SourcePartition=r,this.DestinationPartition=a}change(e,t,n){const r=e.target -let a,l -switch(r.name){case"SourceName":case"DestinationName":case"SourceNS":case"DestinationNS":case"SourcePartition":case"DestinationPartition":switch(a=l=r.value,"string"!=typeof a&&(a=r.value.Name),r.value=a,r.name){case"SourceName":case"DestinationName":0===this.services.filterBy("Name",a).length&&(l={Name:a},this.services=[l].concat(this.services.toArray())) -break -case"SourceNS":case"DestinationNS":0===this.nspaces.filterBy("Name",a).length&&(l={Name:a},this.nspaces=[l].concat(this.nspaces.toArray())) -break -case"SourcePartition":case"DestinationPartition":0===this.partitions.filterBy("Name",a).length&&(l={Name:a},this.partitions=[l].concat(this.partitions.toArray()))}this[r.name]=l}t.handleEvent(e)}},w=L(P.prototype,"services",[n],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),E=L(P.prototype,"SourceName",[r],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),k=L(P.prototype,"DestinationName",[a],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),x=L(P.prototype,"nspaces",[l],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),j=L(P.prototype,"SourceNS",[s],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),C=L(P.prototype,"DestinationNS",[i],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),S=L(P.prototype,"partitions",[o],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),N=L(P.prototype,"SourcePartition",[u],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),z=L(P.prototype,"DestinationPartition",[c],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),M=L(P.prototype,"isManagedByCRDs",[d],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),D=L(P.prototype,"repo",[m],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),L(P.prototype,"ondelete",[p],Object.getOwnPropertyDescriptor(P.prototype,"ondelete"),P.prototype),L(P.prototype,"oncancel",[f],Object.getOwnPropertyDescriptor(P.prototype,"oncancel"),P.prototype),L(P.prototype,"onsubmit",[b],Object.getOwnPropertyDescriptor(P.prototype,"onsubmit"),P.prototype),L(P.prototype,"updateCRDManagement",[h],Object.getOwnPropertyDescriptor(P.prototype,"updateCRDManagement"),P.prototype),L(P.prototype,"submit",[v],Object.getOwnPropertyDescriptor(P.prototype,"submit"),P.prototype),L(P.prototype,"createServices",[y],Object.getOwnPropertyDescriptor(P.prototype,"createServices"),P.prototype),L(P.prototype,"createNspaces",[g],Object.getOwnPropertyDescriptor(P.prototype,"createNspaces"),P.prototype),L(P.prototype,"createPartitions",[O],Object.getOwnPropertyDescriptor(P.prototype,"createPartitions"),P.prototype),L(P.prototype,"change",[_],Object.getOwnPropertyDescriptor(P.prototype,"change"),P.prototype),P) -e.default=R,Ember._setComponentTemplate(A,R)})),define("consul-ui/components/consul/intention/list/check/index",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const t=Ember.HTMLBars.template({id:"7ITVRz58",block:'{"symbols":["titles","@item","&attrs"],"statements":[[6,[37,8],[[30,[36,7],[[30,[36,6],[[30,[36,6],["allow","Allowed"],null],[30,[36,6],["deny","Denied"],null],[30,[36,6],["","Layer 7 Rules"],null]],null]],null]],null,[["default"],[{"statements":[[11,"div"],[16,0,[30,[36,4],["consul-intention-list-check ","notice ",[30,[36,3],[[32,2,["Action"]],"permissions"],null]],null]],[17,3],[12],[2,"\\n "],[10,"h3"],[12],[2,"\\n "],[1,[30,[36,5],[[32,1],[30,[36,3],[[32,2,["Action"]],""],null]],null]],[2,"\\n "],[13],[2,"\\n "],[10,"p"],[12],[2,"\\n"],[6,[37,1],[[30,[36,0],[[32,2,["Action"]],"allow"],null]],null,[["default","else"],[{"statements":[[2," Yes, "],[1,[35,2,["SourceName"]]],[2," is allowed to connect to "],[1,[32,2,["DestinationName"]]],[2," due to the highest precedence intention below:\\n"]],"parameters":[]},{"statements":[[6,[37,1],[[30,[36,0],[[32,2,["Action"]],"deny"],null]],null,[["default","else"],[{"statements":[[2," No, "],[1,[32,2,["SourceName"]]],[2," is not allowed to connect to "],[1,[32,2,["DestinationName"]]],[2," due to the highest precedence intention below:\\n"]],"parameters":[]},{"statements":[[2," "],[1,[32,2,["SourceName"]]],[2," may or may not be allowed to connect with "],[1,[32,2,["DestinationName"]]],[2," through its Layer 7 rules.\\n "]],"parameters":[]}]]]],"parameters":[]}]]],[2," "],[13],[2,"\\n"],[13],[2,"\\n"]],"parameters":[1]}]]]],"hasEval":false,"upvars":["eq","if","item","or","concat","get","array","from-entries","let"]}',meta:{moduleName:"consul-ui/components/consul/intention/list/check/index.hbs"}}) -var n=Ember._setComponentTemplate(t,Ember._templateOnlyComponent()) -e.default=n})),define("consul-ui/components/consul/intention/list/index",["exports","@glimmer/component"],(function(e,t){var n,r,a,l,s,i -function o(e,t,n,r){n&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(r):void 0})}function u(e,t,n,r,a){var l={} -return Object.keys(r).forEach((function(e){l[e]=r[e]})),l.enumerable=!!l.enumerable,l.configurable=!!l.configurable,("value"in l||l.initializer)&&(l.writable=!0),l=n.slice().reverse().reduce((function(n,r){return r(e,t,n)||n}),l),a&&void 0!==l.initializer&&(l.value=l.initializer?l.initializer.call(a):void 0,l.initializer=void 0),void 0===l.initializer&&(Object.defineProperty(e,t,l),l=null),l}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const c=Ember.HTMLBars.template({id:"npl02ASn",block:'{"symbols":["&attrs","@items","@delete","&default"],"statements":[[11,"div"],[24,0,"consul-intention-list"],[17,1],[4,[38,0],[[32,0,["updateCRDManagement"]],[32,2]],null],[12],[2,"\\n"],[18,4,[[30,[36,3],null,[["Table","CheckNotice","CustomResourceNotice"],[[30,[36,1],["consul/intention/list/table"],[["delete","items"],[[32,3],[32,0,["items"]]]]],[30,[36,2],[[32,0,["checkedItem"]],[30,[36,1],["consul/intention/list/check"],[["item"],[[32,0,["checkedItem"]]]]],""],null],[30,[36,2],[[32,0,["isManagedByCRDs"]],[30,[36,1],["consul/intention/notice/custom-resource"],null],""],null]]]]]],[2,"\\n"],[13]],"hasEval":false,"upvars":["did-update","component","if","hash"]}',meta:{moduleName:"consul-ui/components/consul/intention/list/index.hbs"}}) -let d=(n=Ember.inject.service("repository/intention"),r=Ember._tracked,a=Ember._action,l=class extends t.default{constructor(e,t){super(...arguments),o(this,"repo",s,this),o(this,"isManagedByCRDs",i,this),this.updateCRDManagement(t.items)}get items(){return this.args.items||[]}get checkedItem(){return 1===this.items.length&&this.args.check&&this.items[0].SourceName===this.args.check?this.items[0]:null}updateCRDManagement(){this.isManagedByCRDs=this.repo.isManagedByCRDs()}},s=u(l.prototype,"repo",[n],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),i=u(l.prototype,"isManagedByCRDs",[r],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),u(l.prototype,"updateCRDManagement",[a],Object.getOwnPropertyDescriptor(l.prototype,"updateCRDManagement"),l.prototype),l) -e.default=d,Ember._setComponentTemplate(c,d)})),define("consul-ui/components/consul/intention/list/table/index",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const t=Ember.HTMLBars.template({id:"3cYAAMVS",block:'{"symbols":["item","index","index","change","checked","confirm","send","keypressClick","change","__arg0","__arg1","Actions","__arg0","__arg1","Actions","@routeName","@delete","&attrs","@items"],"statements":[[8,"tabular-collection",[[24,0,"consul-intention-list-table"],[17,18]],[["@items","@rowHeight"],[[32,19],59]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["header"]],[["default"],[{"statements":[[2,"\\n "],[10,"th"],[14,0,"source"],[12],[2,"Source"],[13],[2,"\\n "],[10,"th"],[14,0,"intent"],[12],[2," "],[13],[2,"\\n "],[10,"th"],[14,0,"destination"],[12],[2,"Destination"],[13],[2,"\\n "],[10,"th"],[14,0,"permissions"],[12],[2,"\\n Permissions\\n "],[10,"span"],[12],[2,"\\n "],[8,"tooltip",[],[[],[]],[["default"],[{"statements":[[2,"Permissions intercept an Intention\'s traffic using Layer 7 criteria, such as path prefixes and http headers."]],"parameters":[]}]]],[2,"\\n "],[13],[2,"\\n "],[13],[2,"\\n "],[10,"th"],[14,0,"meta"],[12],[2," "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["row"]],[["default"],[{"statements":[[2,"\\n "],[10,"td"],[14,0,"source"],[12],[2,"\\n "],[10,"a"],[15,6,[30,[36,1],[[30,[36,0],[[32,16],"dc.intentions.edit"],null],[32,1,["ID"]]],null]],[12],[2,"\\n"],[6,[37,5],[[30,[36,11],[[32,1,["SourceName"]],"*"],null]],null,[["default","else"],[{"statements":[[2," All Services (*)\\n"]],"parameters":[]},{"statements":[[2," "],[1,[32,1,["SourceName"]]],[2,"\\n"]],"parameters":[]}]]],[6,[37,5],[[30,[36,0],[[30,[36,7],["use nspaces"],null],[30,[36,7],["use partitions"],null]],null]],null,[["default"],[{"statements":[[2," "],[10,"em"],[12],[2,"\\n "],[10,"span"],[15,0,[30,[36,13],["partition-",[30,[36,0],[[32,1,["SourcePartition"]],"default"],null]],null]],[12],[1,[30,[36,0],[[32,1,["SourcePartition"]],"default"],null]],[13],[2," / "],[10,"span"],[15,0,[30,[36,13],["nspace-",[30,[36,0],[[32,1,["SourceNS"]],"default"],null]],null]],[12],[1,[30,[36,0],[[32,1,["SourceNS"]],"default"],null]],[13],[2,"\\n "],[13],[2,"\\n"]],"parameters":[]}]]],[2," "],[13],[2,"\\n "],[13],[2,"\\n "],[10,"td"],[15,0,[31,["intent intent-",[30,[36,14],[[32,1,["Action"]]],null]]]],[12],[2,"\\n "],[10,"strong"],[12],[1,[30,[36,15],[[30,[36,0],[[32,1,["Action"]],"App aware"],null]],null]],[13],[2,"\\n "],[13],[2,"\\n "],[10,"td"],[14,0,"destination"],[12],[2,"\\n "],[10,"span"],[12],[2,"\\n"],[6,[37,5],[[30,[36,11],[[32,1,["DestinationName"]],"*"],null]],null,[["default","else"],[{"statements":[[2," All Services (*)\\n"]],"parameters":[]},{"statements":[[2," "],[1,[32,1,["DestinationName"]]],[2,"\\n"]],"parameters":[]}]]],[6,[37,5],[[30,[36,0],[[30,[36,7],["use nspaces"],null],[30,[36,7],["use partitions"],null]],null]],null,[["default"],[{"statements":[[2," "],[10,"em"],[12],[2,"\\n "],[10,"span"],[15,0,[30,[36,13],["partition-",[30,[36,0],[[32,1,["DestinationPartition"]],"default"],null]],null]],[12],[1,[30,[36,0],[[32,1,["DestinationPartition"]],"default"],null]],[13],[2," / "],[10,"span"],[15,0,[30,[36,13],["nspace-",[30,[36,0],[[32,1,["DestinationNS"]],"default"],null]],null]],[12],[1,[30,[36,0],[[32,1,["DestinationNS"]],"default"],null]],[13],[2,"\\n "],[13],[2,"\\n"]],"parameters":[]}]]],[2," "],[13],[2,"\\n "],[13],[2,"\\n "],[10,"td"],[14,0,"permissions"],[12],[2,"\\n"],[6,[37,5],[[30,[36,16],[[32,1,["Permissions","length"]],0],null]],null,[["default"],[{"statements":[[2," "],[10,"span"],[12],[1,[30,[36,12],[[32,1,["Permissions","length"]],"Permission"],null]],[13],[2,"\\n"]],"parameters":[]}]]],[2," "],[13],[2,"\\n "],[10,"td"],[14,0,"meta"],[12],[2,"\\n"],[6,[37,5],[[32,1,["IsManagedByCRD"]]],null,[["default"],[{"statements":[[2," "],[8,"consul/external-source",[],[["@item","@label"],[[32,1],"Managed by CRD"]],null],[2,"\\n"]],"parameters":[]}]]],[2," "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n"],[6,[37,5],[[30,[36,18],[[30,[36,0],[[30,[36,7],["write intention"],[["item"],[[32,1]]]],[30,[36,7],["view CRD intention"],[["item"],[[32,1]]]]],null],[30,[36,17],[[32,1,["Meta","external-source"]],"consul-api-gateway"],null]],null]],null,[["default"],[{"statements":[[2," "],[8,"block-slot",[],[["@name"],["actions"]],[["default"],[{"statements":[[2,"\\n "],[8,"popover-menu",[],[["@expanded","@onchange","@keyboardAccess"],[[30,[36,5],[[30,[36,11],[[32,5],[32,3]],null],true,false],null],[30,[36,2],[[32,0],[32,4],[32,3]],null],false]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["trigger"]],[["default"],[{"statements":[[2,"\\n More\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["menu"]],[["default"],[{"statements":[[2,"\\n"],[6,[37,5],[[30,[36,7],["write intention"],[["item"],[[32,1]]]]],null,[["default","else"],[{"statements":[[2," "],[10,"li"],[14,"role","none"],[12],[2,"\\n "],[10,"a"],[14,"role","menuitem"],[14,"tabindex","-1"],[15,6,[30,[36,1],[[30,[36,0],[[35,10],"dc.intentions.edit"],null],[32,1,["ID"]]],null]],[12],[2,"Edit"],[13],[2,"\\n "],[13],[2,"\\n "],[10,"li"],[14,"role","none"],[14,0,"dangerous"],[12],[2,"\\n "],[10,"label"],[15,"for",[32,6]],[14,"role","menuitem"],[14,"tabindex","-1"],[15,"onkeypress",[32,8]],[12],[2,"Delete"],[13],[2,"\\n "],[10,"div"],[14,"role","menu"],[12],[2,"\\n "],[8,"informed-action",[[24,0,"warning"]],[["@namedBlocksInfo"],[[30,[36,6],null,[["header","body","actions"],[0,0,1]]]]],[["default"],[{"statements":[[6,[37,5],[[30,[36,4],[[32,13],"header"],null]],null,[["default","else"],[{"statements":[[2,"\\n Confirm Delete\\n "]],"parameters":[]},{"statements":[[6,[37,5],[[30,[36,4],[[32,13],"body"],null]],null,[["default","else"],[{"statements":[[2,"\\n "],[10,"p"],[12],[2,"\\n Are you sure you want to delete this intention?\\n "],[13],[2,"\\n "]],"parameters":[]},{"statements":[[6,[37,5],[[30,[36,4],[[32,13],"actions"],null]],null,[["default"],[{"statements":[[6,[37,3],[[32,14]],null,[["default"],[{"statements":[[2,"\\n "],[8,[32,15,["Action"]],[[24,0,"dangerous"]],[[],[]],[["default"],[{"statements":[[2,"\\n "],[8,"action",[[24,0,"type-delete"],[24,"tabindex","-1"],[4,[38,9],["click",[30,[36,8],[[30,[36,2],[[32,0],[32,9]],null],[30,[36,2],[[32,0],[32,17],[32,1]],null]],null]],null]],[[],[]],[["default"],[{"statements":[[2,"\\n Delete\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,[32,15,["Action"]],[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[8,"action",[],[["@for"],[[32,6]]],[["default"],[{"statements":[[2,"\\n Cancel\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[15]}]]]],"parameters":[]}]]]],"parameters":[]}]]]],"parameters":[]}]]]],"parameters":[13,14]}]]],[2,"\\n "],[13],[2,"\\n "],[13],[2,"\\n"]],"parameters":[]},{"statements":[[6,[37,5],[[30,[36,7],["view CRD intention"],[["item"],[[32,1]]]]],null,[["default"],[{"statements":[[2," "],[10,"li"],[14,"role","none"],[12],[2,"\\n "],[10,"div"],[14,"role","menu"],[12],[2,"\\n "],[8,"informed-action",[[24,0,"info kubernetes"]],[["@namedBlocksInfo"],[[30,[36,6],null,[["header","body","actions"],[0,0,1]]]]],[["default"],[{"statements":[[6,[37,5],[[30,[36,4],[[32,10],"header"],null]],null,[["default","else"],[{"statements":[[2,"\\n Managed by CRD\\n "]],"parameters":[]},{"statements":[[6,[37,5],[[30,[36,4],[[32,10],"body"],null]],null,[["default","else"],[{"statements":[[2,"\\n "],[10,"p"],[12],[2,"\\n This intention is being managed through an Intention Custom Resource in your Kubernetes cluster. It is view only in the UI.\\n "],[13],[2,"\\n "]],"parameters":[]},{"statements":[[6,[37,5],[[30,[36,4],[[32,10],"actions"],null]],null,[["default"],[{"statements":[[6,[37,3],[[32,11]],null,[["default"],[{"statements":[[2,"\\n "],[8,[32,12,["Action"]],[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[8,"action",[[24,"tabindex","-1"],[24,0,"action"]],[["@href"],[[30,[36,1],[[30,[36,0],[[32,16],"dc.intentions.edit"],null],[32,1,["ID"]]],null]]],[["default"],[{"statements":[[2,"\\n View\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,[32,12,["Action"]],[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[8,"action",[],[["@onclick"],[[30,[36,2],[[32,0],[32,9]],null]]],[["default"],[{"statements":[[2,"\\n Cancel\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[12]}]]]],"parameters":[]}]]]],"parameters":[]}]]]],"parameters":[]}]]]],"parameters":[10,11]}]]],[2,"\\n "],[13],[2,"\\n "],[13],[2,"\\n "]],"parameters":[]}]]]],"parameters":[]}]]],[2," "]],"parameters":[6,7,8,9]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[3,4,5]}]]],[2,"\\n"]],"parameters":[]}]]]],"parameters":[1,2]}]]],[2,"\\n"]],"hasEval":false,"upvars":["or","href-to","action","let","-is-named-block-invocation","if","hash","can","queue","on","routeName","eq","pluralize","concat","slugify","capitalize","gt","not-eq","and"]}',meta:{moduleName:"consul-ui/components/consul/intention/list/table/index.hbs"}}) -var n=Ember._setComponentTemplate(t,Ember._templateOnlyComponent()) -e.default=n})),define("consul-ui/components/consul/intention/notice/custom-resource/index",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const t=Ember.HTMLBars.template({id:"50F/MLBP",block:'{"symbols":["notice","&attrs","@type"],"statements":[[8,"notice",[[24,0,"consul-intention-notice-custom-resource crd"],[17,2]],[["@type"],[[30,[36,0],[[32,3],"info"],null]]],[["default"],[{"statements":[[2,"\\n "],[8,[32,1,["Header"]],[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[10,"h3"],[12],[2,"\\n Intention Custom Resource\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,[32,1,["Body"]],[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[10,"p"],[12],[2,"\\n Some of your intentions are being managed through an Intention Custom Resource in your Kubernetes cluster. Those managed intentions will be view only in the UI. Any intentions created in the UI will work but will not be synced to the Custom Resource Definition (CRD) datastore.\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,[32,1,["Footer"]],[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[10,"p"],[12],[2,"\\n "],[10,"a"],[15,6,[31,[[30,[36,1],["CONSUL_DOCS_URL"],null],"/k8s/crds"]]],[14,"target","_blank"],[14,"rel","noopener noreferrer"],[12],[2,"Learn more about CRDs"],[13],[2,"\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[1]}]]]],"hasEval":false,"upvars":["or","env"]}',meta:{moduleName:"consul-ui/components/consul/intention/notice/custom-resource/index.hbs"}}) -var n=Ember._setComponentTemplate(t,Ember._templateOnlyComponent()) -e.default=n})),define("consul-ui/components/consul/intention/notice/permissions/index",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const t=Ember.HTMLBars.template({id:"HoDXcnya",block:'{"symbols":["notice"],"statements":[[8,"notice",[],[["@type"],["info"]],[["default"],[{"statements":[[2,"\\n "],[8,[32,1,["Body"]],[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[10,"p"],[12],[2,"\\n "],[1,[30,[36,0],["components.consul.intention.notice.permissions.body"],null]],[2,"\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,[32,1,["Footer"]],[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[10,"p"],[12],[2,"\\n "],[10,"a"],[15,6,[31,[[30,[36,1],["CONSUL_DOCS_URL"],null],"/connect/intentions"]]],[14,"target","_blank"],[14,"rel","noopener noreferrer"],[12],[2,"\\n "],[1,[30,[36,0],["components.consul.intention.notice.permissions.footer"],null]],[2,"\\n "],[13],[2,"\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[1]}]]],[2,"\\n\\n"]],"hasEval":false,"upvars":["t","env"]}',meta:{moduleName:"consul-ui/components/consul/intention/notice/permissions/index.hbs"}}) -var n=Ember._setComponentTemplate(t,Ember._templateOnlyComponent()) -e.default=n})),define("consul-ui/components/consul/intention/notifications/index",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const t=Ember.HTMLBars.template({id:"mgi1y+sM",block:'{"symbols":["error","@status","@type","@error"],"statements":[[6,[37,1],[[30,[36,2],[[32,3],"create"],null]],null,[["default","else"],[{"statements":[[6,[37,1],[[30,[36,2],[[32,2],"success"],null]],null,[["default","else"],[{"statements":[[2," Your intention has been added.\\n"]],"parameters":[]},{"statements":[[2," There was an error adding your intention.\\n"]],"parameters":[]}]]]],"parameters":[]},{"statements":[[6,[37,1],[[30,[36,2],[[32,3],"update"],null]],null,[["default","else"],[{"statements":[[6,[37,1],[[30,[36,2],[[32,2],"success"],null]],null,[["default","else"],[{"statements":[[2," Your intention has been saved.\\n"]],"parameters":[]},{"statements":[[2," There was an error saving your intention.\\n"]],"parameters":[]}]]]],"parameters":[]},{"statements":[[6,[37,1],[[30,[36,2],[[32,3],"delete"],null]],null,[["default"],[{"statements":[[6,[37,1],[[30,[36,2],[[32,2],"success"],null]],null,[["default","else"],[{"statements":[[2," Your intention was deleted.\\n"]],"parameters":[]},{"statements":[[2," There was an error deleting your intention.\\n"]],"parameters":[]}]]]],"parameters":[]}]]]],"parameters":[]}]]]],"parameters":[]}]]],[6,[37,3],[[32,4,["errors","firstObject"]]],null,[["default"],[{"statements":[[6,[37,1],[[32,1,["detail"]]],null,[["default"],[{"statements":[[2," "],[10,"br"],[12],[13],[1,[30,[36,0],["(",[30,[36,1],[[32,1,["status"]],[30,[36,0],[[32,1,["status"]],": "],null]],null],[32,1,["detail"]],")"],null]],[2,"\\n"]],"parameters":[]}]]]],"parameters":[1]}]]]],"hasEval":false,"upvars":["concat","if","eq","let"]}',meta:{moduleName:"consul-ui/components/consul/intention/notifications/index.hbs"}}) -var n=Ember._setComponentTemplate(t,Ember._templateOnlyComponent()) -e.default=n})),define("consul-ui/components/consul/intention/permission/form/index",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const t=Ember.HTMLBars.template({id:"jlM2y89J",block:'{"symbols":["group","headerForm","headerList","method","el","el","el","Type","intent","&attrs","&default"],"statements":[[11,"div"],[17,10],[24,0,"consul-intention-permission-form"],[12],[2,"\\n"],[8,"form-group",[],[["@name"],[[34,14]]],[["default"],[{"statements":[[2,"\\n\\n "],[18,11,[[30,[36,16],null,[["submit","reset","isDirty","changeset"],[[30,[36,3],[[32,0],"submit",[35,0]],null],[30,[36,3],[[32,0],"reset",[35,0]],null],[30,[36,15],[[35,0,["isValid"]]],null],[35,0]]]]]],[2,"\\n\\n "],[10,"fieldset"],[12],[2,"\\n "],[10,"div"],[14,"data-property","action"],[12],[2,"\\n "],[10,"span"],[14,0,"label"],[12],[2,"\\n Should this permission allow the source connect to the destination?\\n "],[13],[2,"\\n "],[10,"div"],[14,"role","radiogroup"],[15,0,[30,[36,2],[[35,0,["error","Action"]]," has-error"],null]],[12],[2,"\\n"],[6,[37,6],[[30,[36,5],[[30,[36,5],[[35,17]],null]],null]],null,[["default"],[{"statements":[[2," "],[10,"label"],[12],[2,"\\n "],[10,"span"],[12],[1,[30,[36,12],[[32,9]],null]],[13],[2,"\\n "],[10,"input"],[14,3,"Action"],[15,2,[32,9]],[15,"checked",[30,[36,2],[[30,[36,11],[[35,0,["Action"]],[32,9]],null],"checked"],null]],[15,"onchange",[30,[36,3],[[32,0],[30,[36,13],[[35,0],"Action"],null]],[["value"],["target.value"]]]],[14,4,"radio"],[12],[13],[2,"\\n "],[13],[2,"\\n"]],"parameters":[9]}]]],[2," "],[13],[2,"\\n "],[13],[2,"\\n "],[13],[2,"\\n\\n "],[10,"fieldset"],[12],[2,"\\n "],[10,"header"],[12],[2,"\\n "],[10,"h2"],[12],[2,"Path"],[13],[2,"\\n "],[13],[2,"\\n "],[10,"div"],[12],[2,"\\n "],[8,[32,1,["Element"]],[],[["@name","@type"],["PathType","select"]],[["default"],[{"statements":[[2,"\\n "],[8,[32,7,["Label"]],[],[[],[]],[["default"],[{"statements":[[2,"\\n Path type\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"power-select",[],[["@options","@selected","@onChange"],[[34,18],[34,8],[30,[36,3],[[32,0],"change","HTTP.PathType",[35,0]],null]]],[["default"],[{"statements":[[2,"\\n "],[1,[30,[36,10],[[35,9],[32,8]],null]],[2,"\\n "]],"parameters":[8]}]]],[2,"\\n "]],"parameters":[7]}]]],[2,"\\n\\n"],[6,[37,2],[[35,19]],null,[["default"],[{"statements":[[2," "],[8,[32,1,["Element"]],[],[["@name","@error"],["Path",[30,[36,7],[[35,0],"error.HTTP.Path"],null]]],[["default"],[{"statements":[[2,"\\n "],[8,[32,6,["Label"]],[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[1,[30,[36,10],[[35,9],[35,8]],null]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,[32,6,["Text"]],[[16,"oninput",[30,[36,3],[[32,0],"change","HTTP.Path",[35,0]],null]]],[["@value"],[[30,[36,7],[[35,0],"HTTP.Path"],null]]],null],[2,"\\n "],[8,"state",[],[["@state","@matches"],[[32,6,["state"]],"error"]],[["default"],[{"statements":[[2,"\\n "],[8,[32,6,["Error"]],[],[[],[]],[["default"],[{"statements":[[2,"\\n"],[6,[37,2],[[30,[36,11],[[30,[36,7],[[35,0],"HTTP.Path"],null],"Regex"],null]],null,[["default","else"],[{"statements":[[2," Path Regex should not be blank\\n"]],"parameters":[]},{"statements":[[2," Path should begin with a \'/\'\\n"]],"parameters":[]}]]],[2," "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[6]}]]],[2,"\\n"]],"parameters":[]}]]],[2,"\\n "],[13],[2,"\\n "],[13],[2,"\\n\\n "],[10,"fieldset"],[12],[2,"\\n "],[10,"h2"],[12],[2,"Methods"],[13],[2,"\\n "],[10,"div"],[14,0,"type-toggle"],[12],[2,"\\n "],[10,"span"],[12],[2,"All methods are applied by default unless specified"],[13],[2,"\\n "],[8,[32,1,["Element"]],[],[["@name"],["allMethods"]],[["default"],[{"statements":[[2,"\\n "],[8,[32,5,["Checkbox"]],[[16,"checked",[30,[36,2],[[35,20],"checked"],null]],[16,"onchange",[30,[36,3],[[32,0],"change","allMethods",[35,0]],null]]],[[],[]],null],[2,"\\n "],[8,[32,5,["Label"]],[],[[],[]],[["default"],[{"statements":[[2,"\\n All Methods\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[5]}]]],[2,"\\n "],[13],[2,"\\n\\n"],[6,[37,2],[[35,21]],null,[["default"],[{"statements":[[2," "],[10,"div"],[14,0,"checkbox-group"],[14,"role","group"],[12],[2,"\\n"],[6,[37,6],[[30,[36,5],[[30,[36,5],[[35,4]],null]],null]],null,[["default"],[{"statements":[[2," "],[10,"label"],[14,0,"type-checkbox"],[12],[2,"\\n "],[10,"input"],[14,3,"method"],[15,2,[32,4]],[15,"checked",[30,[36,2],[[30,[36,1],[[32,4],[35,0,["HTTP","Methods"]]],null],"checked"],null]],[15,"onchange",[30,[36,3],[[32,0],"change","method",[35,0]],null]],[14,4,"checkbox"],[12],[13],[2,"\\n "],[10,"span"],[12],[1,[32,4]],[13],[2,"\\n "],[13],[2,"\\n"]],"parameters":[4]}]]],[2," "],[13],[2,"\\n"]],"parameters":[]}]]],[2," "],[13],[2,"\\n\\n "],[10,"fieldset"],[12],[2,"\\n "],[10,"h2"],[12],[2,"Headers"],[13],[2,"\\n\\n "],[8,"consul/intention/permission/header/list",[],[["@items","@ondelete"],[[30,[36,7],[[35,0],"HTTP.Header"],null],[30,[36,3],[[32,0],"delete","HTTP.Header",[35,0]],null]]],[["default"],[{"statements":[[2,"\\n\\n "]],"parameters":[3]}]]],[2,"\\n\\n "],[8,"consul/intention/permission/header/form",[],[["@onsubmit"],[[30,[36,3],[[32,0],"add","HTTP.Header",[35,0]],null]]],[["default"],[{"statements":[[2,"\\n "],[8,"ref",[],[["@target","@name","@value"],[[32,0],"headerForm",[32,2]]],null],[2,"\\n "]],"parameters":[2]}]]],[2,"\\n\\n "],[10,"button"],[14,0,"type-submit"],[15,"disabled",[30,[36,2],[[30,[36,22],[[32,0,["headerForm","isDirty"]]],null],"disabled"],null]],[15,"onclick",[30,[36,3],[[32,0],[32,0,["headerForm","submit"]]],null]],[14,4,"button"],[12],[2,"\\n Add"],[6,[37,2],[[30,[36,23],[[30,[36,10],[[30,[36,7],[[35,0],"HTTP.Header"],null],"length"],null],0],null]],null,[["default"],[{"statements":[[2," another"]],"parameters":[]}]]],[2," header\\n "],[13],[2,"\\n "],[10,"button"],[14,0,"type-cancel"],[15,"onclick",[30,[36,3],[[32,0],[32,0,["headerForm","reset"]]],null]],[14,4,"button"],[12],[2,"\\n Cancel\\n "],[13],[2,"\\n\\n "],[13],[2,"\\n "]],"parameters":[1]}]]],[2,"\\n"],[13]],"hasEval":false,"upvars":["changeset","contains","if","action","methods","-track-array","each","changeset-get","pathType","pathLabels","get","eq","capitalize","changeset-set","name","and","hash","intents","pathTypes","shouldShowPathField","allMethods","shouldShowMethods","not","gt"]}',meta:{moduleName:"consul-ui/components/consul/intention/permission/form/index.hbs"}}),n="intention-permission" -var r=Ember._setComponentTemplate(t,Ember.Component.extend({tagName:"",name:n,schema:Ember.inject.service("schema"),change:Ember.inject.service("change"),repo:Ember.inject.service("repository/"+n),onsubmit:function(){},onreset:function(){},intents:Ember.computed.alias(`schema.${n}.Action.allowedValues`),methods:Ember.computed.alias(`schema.${n}-http.Methods.allowedValues`),pathProps:Ember.computed.alias(`schema.${n}-http.PathType.allowedValues`),pathTypes:Ember.computed("pathProps",(function(){return["NoPath"].concat(this.pathProps)})),pathLabels:Ember.computed((function(){return{NoPath:"No Path",PathExact:"Exact",PathPrefix:"Prefixed by",PathRegex:"Regular Expression"}})),pathInputLabels:Ember.computed((function(){return{PathExact:"Exact Path",PathPrefix:"Path Prefix",PathRegex:"Path Regular Expression"}})),changeset:Ember.computed("item",(function(){const e=this.change.changesetFor(n,this.item||this.repo.create()) -return e.isNew&&e.validate(),e})),pathType:Ember.computed("changeset._changes.HTTP.PathType","pathTypes.firstObject",(function(){return this.changeset.HTTP.PathType||this.pathTypes.firstObject})),noPathType:Ember.computed.equal("pathType","NoPath"),shouldShowPathField:Ember.computed.not("noPathType"),allMethods:!1,shouldShowMethods:Ember.computed.not("allMethods"),didReceiveAttrs:function(){Ember.get(this,"item.HTTP.Methods.length")||Ember.set(this,"allMethods",!0)},actions:{change:function(e,t,n){const r=void 0!==Ember.get(n,"target.value")?n.target.value:n -switch(e){case"allMethods":Ember.set(this,e,n.target.checked) -break -case"method":n.target.checked?this.actions.add.apply(this,["HTTP.Methods",t,r]):this.actions.delete.apply(this,["HTTP.Methods",t,r]) -break -default:t.set(e,r)}t.validate()},add:function(e,t,n){t.pushObject(e,n),t.validate()},delete:function(e,t,n){t.removeObject(e,n),t.validate()},submit:function(e){void 0!==e.changes.find(({key:e,value:t})=>"HTTP.PathType"===e||"HTTP.Path"===e)&&(this.pathProps.forEach(t=>{e.set("HTTP."+t,void 0)}),"NoPath"!==e.HTTP.PathType&&e.set("HTTP."+e.HTTP.PathType,e.HTTP.Path)),this.allMethods&&e.set("HTTP.Methods",null),delete e._changes.HTTP.PathType,delete e._changes.HTTP.Path,this.repo.persist(e),this.onsubmit(e.data)},reset:function(e){e.rollback(),this.onreset(e.data)}}})) -e.default=r})),define("consul-ui/components/consul/intention/permission/header/form/index",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const t=Ember.HTMLBars.template({id:"iPtOEBL6",block:'{"symbols":["group","el","el","el","Type","&attrs","&default"],"statements":[[11,"div"],[17,6],[24,0,"consul-intention-permission-header-form"],[12],[2,"\\n "],[8,"form-group",[],[["@name"],[[34,7]]],[["default"],[{"statements":[[2,"\\n\\n "],[18,7,[[30,[36,9],null,[["submit","reset","isDirty","changeset"],[[30,[36,6],[[32,0],"submit",[35,0]],null],[30,[36,6],[[32,0],"reset",[35,0]],null],[30,[36,8],[[35,0,["isValid"]],[35,0,["isDirty"]]],null],[35,0]]]]]],[2,"\\n\\n "],[10,"fieldset"],[12],[2,"\\n "],[10,"div"],[12],[2,"\\n "],[8,[32,1,["Element"]],[],[["@name","@type"],["HeaderType","select"]],[["default"],[{"statements":[[2,"\\n "],[8,[32,4,["Label"]],[],[[],[]],[["default"],[{"statements":[[2,"Header type"]],"parameters":[]}]]],[2,"\\n "],[8,"power-select",[],[["@options","@selected","@onChange"],[[34,10],[34,2],[30,[36,6],[[32,0],"change","HeaderType",[35,0]],null]]],[["default"],[{"statements":[[2,"\\n "],[1,[30,[36,4],[[35,3],[32,5]],null]],[2,"\\n "]],"parameters":[5]}]]],[2,"\\n "]],"parameters":[4]}]]],[2,"\\n\\n\\n "],[8,[32,1,["Element"]],[],[["@name","@error"],["Name",[30,[36,1],[[35,0],"error.Name"],null]]],[["default"],[{"statements":[[2,"\\n "],[8,[32,3,["Label"]],[],[[],[]],[["default"],[{"statements":[[2,"Header name"]],"parameters":[]}]]],[2,"\\n "],[8,[32,3,["Text"]],[[16,"oninput",[30,[36,6],[[32,0],"change","Name",[35,0]],null]]],[["@value"],[[30,[36,1],[[35,0],"Name"],null]]],null],[2,"\\n "],[8,"state",[],[["@state","@matches"],[[32,3,["state"]],"error"]],[["default"],[{"statements":[[2,"\\n "],[8,[32,3,["Error"]],[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[1,[30,[36,1],[[35,0],"error.Name.validation"],null]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[3]}]]],[2,"\\n\\n"],[6,[37,12],[[35,11]],null,[["default"],[{"statements":[[2," "],[8,[32,1,["Element"]],[],[["@name","@error"],["Value",[30,[36,1],[[35,0],"error.Value"],null]]],[["default"],[{"statements":[[2,"\\n "],[8,[32,2,["Label"]],[],[[],[]],[["default"],[{"statements":[[2,"Header "],[1,[30,[36,5],[[30,[36,4],[[35,3],[35,2]],null]],null]]],"parameters":[]}]]],[2,"\\n "],[8,[32,2,["Text"]],[[16,"oninput",[30,[36,6],[[32,0],"change","Value",[35,0]],null]]],[["@value"],[[30,[36,1],[[35,0],"Value"],null]]],null],[2,"\\n "],[8,"state",[],[["@state","@matches"],[[32,2,["state"]],"error"]],[["default"],[{"statements":[[2,"\\n "],[8,[32,2,["Error"]],[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[1,[30,[36,1],[[35,0],"error.Value.validation"],null]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[2]}]]],[2,"\\n"]],"parameters":[]}]]],[2,"\\n "],[13],[2,"\\n "],[13],[2,"\\n "]],"parameters":[1]}]]],[2,"\\n"],[13]],"hasEval":false,"upvars":["changeset","changeset-get","headerType","headerLabels","get","lowercase","action","name","and","hash","headerTypes","shouldShowValueField","if"]}',meta:{moduleName:"consul-ui/components/consul/intention/permission/header/form/index.hbs"}}),n="intention-permission-http-header" -var r=Ember._setComponentTemplate(t,Ember.Component.extend({tagName:"",name:n,schema:Ember.inject.service("schema"),change:Ember.inject.service("change"),repo:Ember.inject.service("repository/"+n),onsubmit:function(){},onreset:function(){},changeset:Ember.computed("item",(function(){return this.change.changesetFor(n,this.item||this.repo.create({HeaderType:this.headerTypes.firstObject}))})),headerTypes:Ember.computed.alias(`schema.${n}.HeaderType.allowedValues`),headerLabels:Ember.computed((function(){return{Exact:"Exactly Matching",Prefix:"Prefixed by",Suffix:"Suffixed by",Regex:"Regular Expression",Present:"Is present"}})),headerType:Ember.computed("changeset.HeaderType","headerTypes.firstObject",(function(){return this.changeset.HeaderType||this.headerTypes.firstObject})),headerTypeEqualsPresent:Ember.computed.equal("headerType","Present"),shouldShowValueField:Ember.computed.not("headerTypeEqualsPresent"),actions:{change:function(e,t,n){const r=void 0!==Ember.get(n,"target.value")?n.target.value:n -t.set(e,r),t.validate()},submit:function(e){this.headerTypes.forEach(t=>{e.set(t,void 0)}) -const t="Present"===e.HeaderType||e.Value -e.set(e.HeaderType,t),delete e._changes.HeaderType,delete e._changes.Value,this.repo.persist(e),this.onsubmit(e.data),Ember.set(this,"item",this.repo.create({HeaderType:this.headerType}))},reset:function(e){e.rollback()}}})) -e.default=r})),define("consul-ui/components/consul/intention/permission/header/list/index",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const t=Ember.HTMLBars.template({id:"GtepE94Y",block:'{"symbols":["item","Actions","Action","Confirmation","Confirm"],"statements":[[6,[37,5],[[30,[36,4],[[35,0,["length"]],0],null]],null,[["default"],[{"statements":[[8,"list-collection",[[24,0,"consul-intention-permission-header-list"]],[["@items","@scroll","@cellHeight"],[[34,0],"native",42]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["details"]],[["default"],[{"statements":[[2,"\\n "],[10,"dl"],[12],[2,"\\n "],[10,"dt"],[12],[2,"\\n "],[8,"tooltip",[],[[],[]],[["default"],[{"statements":[[2,"\\n Header\\n "]],"parameters":[]}]]],[2,"\\n "],[13],[2,"\\n "],[10,"dd"],[12],[2,"\\n "],[1,[32,1,["Name"]]],[2," "],[1,[30,[36,1],[[32,1]],null]],[2,"\\n "],[13],[2,"\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["actions"]],[["default"],[{"statements":[[2,"\\n "],[8,[32,2],[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[8,[32,3],[[24,0,"dangerous"]],[["@onclick"],[[30,[36,3],[[32,0],[35,2],[32,1]],null]]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["label"]],[["default"],[{"statements":[[2,"\\n Delete\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["confirmation"]],[["default"],[{"statements":[[2,"\\n "],[8,[32,4],[[24,0,"warning"]],[[],[]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["header"]],[["default"],[{"statements":[[2,"\\n Confirm delete\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["body"]],[["default"],[{"statements":[[2,"\\n "],[10,"p"],[12],[2,"\\n Are you sure you want to delete this header?\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["confirm"]],[["default"],[{"statements":[[2,"\\n "],[8,[32,5],[],[[],[]],[["default"],[{"statements":[[2,"Delete"]],"parameters":[]}]]],[2,"\\n "]],"parameters":[5]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[4]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[3]}]]],[2,"\\n "]],"parameters":[2]}]]],[2,"\\n"]],"parameters":[1]}]]],[2,"\\n"]],"parameters":[]}]]]],"hasEval":false,"upvars":["items","route-match","ondelete","action","gt","if"]}',meta:{moduleName:"consul-ui/components/consul/intention/permission/header/list/index.hbs"}}) -var n=Ember._setComponentTemplate(t,Ember.Component.extend({tagName:""})) -e.default=n})),define("consul-ui/components/consul/intention/permission/list/index",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const t=Ember.HTMLBars.template({id:"O6TCv5DN",block:'{"symbols":["item","Actions","Action","Confirmation","Confirm","item","item"],"statements":[[6,[37,8],[[30,[36,12],[[35,9,["length"]],0],null]],null,[["default"],[{"statements":[[8,"list-collection",[[16,0,[31,["consul-intention-permission-list",[30,[36,8],[[30,[36,7],[[35,0]],null]," readonly"],null]]]]],[["@scroll","@items","@partial"],["native",[34,9],5]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["details"]],[["default"],[{"statements":[[2,"\\n "],[10,"div"],[15,"onclick",[30,[36,2],[[32,0],[30,[36,1],[[35,0]],null],[32,1]],null]],[12],[2,"\\n "],[10,"strong"],[15,0,[30,[36,10],["intent-",[32,1,["Action"]]],null]],[12],[1,[30,[36,11],[[32,1,["Action"]]],null]],[13],[2,"\\n"],[6,[37,8],[[30,[36,12],[[32,1,["HTTP","Methods","length"]],0],null]],null,[["default"],[{"statements":[[2," "],[10,"dl"],[14,0,"permission-methods"],[12],[2,"\\n "],[10,"dt"],[12],[2,"\\n "],[8,"tooltip",[],[[],[]],[["default"],[{"statements":[[2,"\\n Methods\\n "]],"parameters":[]}]]],[2,"\\n "],[13],[2,"\\n "],[10,"dd"],[12],[2,"\\n"],[6,[37,6],[[30,[36,5],[[30,[36,5],[[32,1,["HTTP","Methods"]]],null]],null]],null,[["default"],[{"statements":[[2," "],[1,[32,7]],[2,"\\n"]],"parameters":[7]}]]],[2," "],[13],[2,"\\n "],[13],[2,"\\n"]],"parameters":[]}]]],[6,[37,8],[[32,1,["HTTP","Path"]]],null,[["default"],[{"statements":[[2," "],[10,"dl"],[14,0,"permission-path"],[12],[2,"\\n "],[10,"dt"],[12],[2,"\\n "],[8,"tooltip",[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[1,[32,1,["HTTP","PathType"]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[13],[2,"\\n "],[10,"dd"],[12],[2,"\\n "],[1,[32,1,["HTTP","Path"]]],[2,"\\n "],[13],[2,"\\n "],[13],[2,"\\n"]],"parameters":[]}]]],[6,[37,6],[[30,[36,5],[[30,[36,5],[[32,1,["HTTP","Header"]]],null]],null]],null,[["default"],[{"statements":[[2," "],[10,"dl"],[14,0,"permission-header"],[12],[2,"\\n "],[10,"dt"],[12],[2,"\\n "],[8,"tooltip",[],[[],[]],[["default"],[{"statements":[[2,"\\n Header\\n "]],"parameters":[]}]]],[2,"\\n "],[13],[2,"\\n "],[10,"dd"],[12],[2,"\\n "],[1,[32,6,["Name"]]],[2," "],[1,[30,[36,4],[[32,6]],null]],[2,"\\n "],[13],[2,"\\n "],[13],[2,"\\n"]],"parameters":[6]}]]],[2," "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n"],[6,[37,8],[[35,0]],null,[["default"],[{"statements":[[2," "],[8,"block-slot",[],[["@name"],["actions"]],[["default"],[{"statements":[[2,"\\n "],[8,[32,2],[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[8,[32,3],[],[["@onclick","@close"],[[30,[36,2],[[32,0],[30,[36,1],[[35,0]],null],[32,1]],null],true]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["label"]],[["default"],[{"statements":[[2,"\\n Edit\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,[32,3],[[24,0,"dangerous"]],[["@onclick"],[[30,[36,2],[[32,0],[35,3],[32,1]],null]]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["label"]],[["default"],[{"statements":[[2,"\\n Delete\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["confirmation"]],[["default"],[{"statements":[[2,"\\n "],[8,[32,4],[[24,0,"warning"]],[[],[]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["header"]],[["default"],[{"statements":[[2,"\\n Confirm delete\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["body"]],[["default"],[{"statements":[[2,"\\n "],[10,"p"],[12],[2,"\\n Are you sure you want to delete this permission?\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["confirm"]],[["default"],[{"statements":[[2,"\\n "],[8,[32,5],[],[[],[]],[["default"],[{"statements":[[2,"Delete"]],"parameters":[]}]]],[2,"\\n "]],"parameters":[5]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[4]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[3]}]]],[2,"\\n "]],"parameters":[2]}]]],[2,"\\n"]],"parameters":[]}]]]],"parameters":[1]}]]],[2,"\\n"]],"parameters":[]}]]]],"hasEval":false,"upvars":["onclick","optional","action","ondelete","route-match","-track-array","each","not","if","items","concat","capitalize","gt"]}',meta:{moduleName:"consul-ui/components/consul/intention/permission/list/index.hbs"}}) -var n=Ember._setComponentTemplate(t,Ember.Component.extend({tagName:""})) -e.default=n})),define("consul-ui/components/consul/intention/search-bar/index",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const t=Ember.HTMLBars.template({id:"302KbrGO",block:'{"symbols":["__arg0","__arg1","search","components","Optgroup","Option","selectable","search","components","Optgroup","Option","item","search","components","Optgroup","Option","prop","search","key","value","@sort","@filter","@onsearch","@search","&attrs"],"statements":[[8,"search-bar",[[24,0,"consul-intention-search-bar"],[17,25]],[["@filter","@namedBlocksInfo"],[[32,22],[30,[36,15],null,[["status","search","filter","sort"],[1,1,1,1]]]]],[["default"],[{"statements":[[6,[37,8],[[30,[36,7],[[32,1],"status"],null]],null,[["default","else"],[{"statements":[[6,[37,6],[[32,2]],null,[["default"],[{"statements":[[2,"\\n\\n"],[6,[37,6],[[30,[36,0],[[30,[36,9],["components.consul.intention.search-bar.",[32,18,["status","key"]]],null]],[["default"],[[30,[36,4],[[30,[36,9],["common.search.",[32,18,["status","key"]]],null],[30,[36,9],["common.consul.",[32,18,["status","key"]]],null]],null]]]],[30,[36,0],[[30,[36,9],["components.consul.intention.search-bar.",[32,18,["status","value"]]],null]],[["default"],[[30,[36,4],[[30,[36,9],["common.search.",[32,18,["status","value"]]],null],[30,[36,9],["common.consul.",[32,18,["status","value"]]],null]],null]]]]],null,[["default"],[{"statements":[[2," "],[8,[32,18,["RemoveFilter"]],[[16,"aria-label",[30,[36,0],["common.ui.remove"],[["item"],[[30,[36,9],[[32,19]," ",[32,20]],null]]]]]],[[],[]],[["default"],[{"statements":[[2,"\\n "],[10,"dl"],[12],[2,"\\n "],[10,"dt"],[12],[1,[32,19]],[13],[2,"\\n "],[10,"dd"],[12],[1,[32,20]],[13],[2,"\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[19,20]}]]],[2,"\\n "]],"parameters":[18]}]]]],"parameters":[]},{"statements":[[6,[37,8],[[30,[36,7],[[32,1],"search"],null]],null,[["default","else"],[{"statements":[[6,[37,6],[[32,2]],null,[["default"],[{"statements":[[2,"\\n "],[8,[32,13,["Search"]],[],[["@onsearch","@value","@placeholder"],[[30,[36,3],[[32,0],[32,23]],null],[32,24],[30,[36,0],["common.search.search"],null]]],[["default"],[{"statements":[[2,"\\n"],[6,[37,8],[[32,22,["searchproperty"]]],null,[["default"],[{"statements":[[2," "],[8,[32,13,["Select"]],[[24,0,"type-search-properties"]],[["@position","@onchange","@multiple","@required"],["right",[30,[36,3],[[32,0],[32,22,["searchproperty","change"]]],null],true,true]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["selected"]],[["default"],[{"statements":[[2,"\\n "],[10,"span"],[12],[2,"\\n "],[1,[30,[36,0],["common.search.searchproperty"],null]],[2,"\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["options"]],[["default"],[{"statements":[[2,"\\n"],[6,[37,6],[[32,14,["Optgroup"]],[32,14,["Option"]]],null,[["default"],[{"statements":[[6,[37,13],[[30,[36,12],[[30,[36,12],[[32,22,["searchproperty","default"]]],null]],null]],null,[["default"],[{"statements":[[2," "],[8,[32,16],[],[["@value","@selected"],[[32,17],[30,[36,11],[[32,17],[32,22,["searchproperty","value"]]],null]]],[["default"],[{"statements":[[2,"\\n "],[1,[30,[36,0],[[30,[36,9],["common.consul.",[30,[36,14],[[32,17]],null]],null]],null]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[17]}]]]],"parameters":[15,16]}]]],[2," "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[14]}]]],[2,"\\n"]],"parameters":[]}]]],[2," "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[13]}]]]],"parameters":[]},{"statements":[[6,[37,8],[[30,[36,7],[[32,1],"filter"],null]],null,[["default","else"],[{"statements":[[6,[37,6],[[32,2]],null,[["default"],[{"statements":[[2,"\\n "],[8,[32,8,["Select"]],[[24,0,"type-access"]],[["@position","@onchange","@multiple"],["left",[30,[36,3],[[32,0],[32,22,["access","change"]]],null],true]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["selected"]],[["default"],[{"statements":[[2,"\\n "],[10,"span"],[12],[2,"\\n "],[1,[30,[36,0],["components.consul.intention.search-bar.access.name"],null]],[2,"\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["options"]],[["default"],[{"statements":[[2,"\\n"],[6,[37,6],[[32,9,["Optgroup"]],[32,9,["Option"]]],null,[["default"],[{"statements":[[6,[37,13],[[30,[36,12],[[30,[36,12],[[30,[36,4],["allow","deny",""],null]],null]],null]],null,[["default"],[{"statements":[[2," "],[8,[32,11],[[16,0,[30,[36,9],["value-",[32,12]],null]]],[["@value","@selected"],[[30,[36,10],[[32,12],"app-aware"],null],[30,[36,11],[[30,[36,10],[[32,12],"app-aware"],null],[32,22,["access","value"]]],null]]],[["default"],[{"statements":[[2,"\\n "],[10,"span"],[12],[1,[30,[36,0],[[30,[36,9],["components.consul.intention.search-bar.access.options.",[30,[36,10],[[32,12],"app-aware"],null]],null]],null]],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[12]}]]]],"parameters":[10,11]}]]],[2," "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[9]}]]],[2,"\\n "]],"parameters":[8]}]]]],"parameters":[]},{"statements":[[6,[37,8],[[30,[36,7],[[32,1],"sort"],null]],null,[["default"],[{"statements":[[6,[37,6],[[32,2]],null,[["default"],[{"statements":[[2,"\\n "],[8,[32,3,["Select"]],[[24,0,"type-sort"]],[["@position","@onchange","@multiple","@required"],["right",[30,[36,3],[[32,0],[32,21,["change"]]],null],false,true]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["selected"]],[["default"],[{"statements":[[2,"\\n "],[10,"span"],[12],[2,"\\n"],[6,[37,6],[[30,[36,5],[[30,[36,4],[[30,[36,4],["Action:asc",[30,[36,0],["components.consul.intention.search-bar.sort.access.asc"],null]],null],[30,[36,4],["Action:desc",[30,[36,0],["components.consul.intention.search-bar.sort.access.desc"],null]],null],[30,[36,4],["SourceName:asc",[30,[36,0],["components.consul.intention.search-bar.sort.source-name.asc"],null]],null],[30,[36,4],["SourceName:desc",[30,[36,0],["components.consul.intention.search-bar.sort.source-name.desc"],null]],null],[30,[36,4],["DestinationName:asc",[30,[36,0],["components.consul.intention.search-bar.sort.destination-name.asc"],null]],null],[30,[36,4],["DestinationName:desc",[30,[36,0],["components.consul.intention.search-bar.sort.destination-name.desc"],null]],null],[30,[36,4],["Precedence:asc",[30,[36,0],["common.sort.numeric.asc"],null]],null],[30,[36,4],["Precedence:desc",[30,[36,0],["common.sort.numeric.desc"],null]],null]],null]],null]],null,[["default"],[{"statements":[[2," "],[1,[30,[36,2],[[32,7],[32,21,["value"]]],null]],[2,"\\n"]],"parameters":[7]}]]],[2," "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["options"]],[["default"],[{"statements":[[2,"\\n"],[6,[37,6],[[32,4,["Optgroup"]],[32,4,["Option"]]],null,[["default"],[{"statements":[[2," "],[8,[32,5],[],[["@label"],[[30,[36,0],["components.consul.intention.search-bar.sort.access.name"],null]]],[["default"],[{"statements":[[2,"\\n "],[8,[32,6],[],[["@value","@selected"],["Action:asc",[30,[36,1],["Action:asc",[32,21,["value"]]],null]]],[["default"],[{"statements":[[1,[30,[36,0],["components.consul.intention.search-bar.sort.access.asc"],null]]],"parameters":[]}]]],[2,"\\n "],[8,[32,6],[],[["@value","@selected"],["Action:desc",[30,[36,1],["Action:desc",[32,21,["value"]]],null]]],[["default"],[{"statements":[[1,[30,[36,0],["components.consul.intention.search-bar.sort.access.desc"],null]]],"parameters":[]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,[32,5],[],[["@label"],[[30,[36,0],["components.consul.intention.search-bar.sort.source-name.name"],null]]],[["default"],[{"statements":[[2,"\\n "],[8,[32,6],[],[["@value","@selected"],["SourceName:asc",[30,[36,1],["SourceName:asc",[32,21,["value"]]],null]]],[["default"],[{"statements":[[1,[30,[36,0],["common.sort.alpha.asc"],null]]],"parameters":[]}]]],[2,"\\n "],[8,[32,6],[],[["@value","@selected"],["SourceName:desc",[30,[36,1],["SourceName:desc",[32,21,["value"]]],null]]],[["default"],[{"statements":[[1,[30,[36,0],["common.sort.alpha.desc"],null]]],"parameters":[]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,[32,5],[],[["@label"],[[30,[36,0],["components.consul.intention.search-bar.sort.destination-name.name"],null]]],[["default"],[{"statements":[[2,"\\n "],[8,[32,6],[],[["@value","@selected"],["DestinationName:asc",[30,[36,1],["DestinationName:asc",[32,21,["value"]]],null]]],[["default"],[{"statements":[[1,[30,[36,0],["common.sort.alpha.asc"],null]]],"parameters":[]}]]],[2,"\\n "],[8,[32,6],[],[["@value","@selected"],["DestinationName:desc",[30,[36,1],["DestinationName:desc",[32,21,["value"]]],null]]],[["default"],[{"statements":[[1,[30,[36,0],["common.sort.alpha.desc"],null]]],"parameters":[]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,[32,5],[],[["@label"],[[30,[36,0],["components.consul.intention.search-bar.sort.precedence.name"],null]]],[["default"],[{"statements":[[2,"\\n "],[8,[32,6],[],[["@value","@selected"],["Precedence:asc",[30,[36,1],["Precedence:asc",[32,21,["value"]]],null]]],[["default"],[{"statements":[[1,[30,[36,0],["common.sort.numeric.asc"],null]]],"parameters":[]}]]],[2,"\\n "],[8,[32,6],[],[["@value","@selected"],["Precedence:desc",[30,[36,1],["Precedence:desc",[32,21,["value"]]],null]]],[["default"],[{"statements":[[1,[30,[36,0],["common.sort.numeric.desc"],null]]],"parameters":[]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[5,6]}]]],[2," "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[4]}]]],[2,"\\n "]],"parameters":[3]}]]]],"parameters":[]}]]]],"parameters":[]}]]]],"parameters":[]}]]]],"parameters":[]}]]]],"parameters":[1,2]}]]]],"hasEval":false,"upvars":["t","eq","get","action","array","from-entries","let","-is-named-block-invocation","if","concat","or","contains","-track-array","each","lowercase","hash"]}',meta:{moduleName:"consul-ui/components/consul/intention/search-bar/index.hbs"}}) -var n=Ember._setComponentTemplate(t,Ember._templateOnlyComponent()) -e.default=n})),define("consul-ui/components/consul/intention/view/index",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const t=Ember.HTMLBars.template({id:"FT+AOUhZ",block:'{"symbols":["&attrs"],"statements":[[11,"div"],[24,0,"consul-intention-view"],[17,1],[12],[2,"\\n\\n "],[10,"div"],[14,0,"definition-table"],[12],[2,"\\n "],[10,"dl"],[12],[2,"\\n "],[10,"dt"],[12],[2,"Destination"],[13],[2,"\\n "],[10,"dd"],[12],[2,"\\n "],[8,"consul/bucket/list",[],[["@item","@nspace","@partition","@service"],[[30,[36,1],null,[["Namespace","Partition","Service"],[[35,0,["DestinationNS"]],[35,0,["DestinationPartition"]],[35,0,["DestinationName"]]]]],"-","-",true]],null],[2,"\\n "],[13],[2,"\\n "],[10,"dt"],[12],[2,"Source"],[13],[2,"\\n "],[10,"dd"],[12],[2,"\\n "],[8,"consul/bucket/list",[],[["@item","@nspace","@partition","@service"],[[30,[36,1],null,[["Namespace","Partition","Service"],[[35,0,["SourceNS"]],[35,0,["SourcePartition"]],[35,0,["SourceName"]]]]],"-","-",true]],null],[2,"\\n "],[13],[2,"\\n"],[6,[37,2],[[35,0,["Action"]]],null,[["default"],[{"statements":[[2," "],[10,"dt"],[12],[2,"Action"],[13],[2,"\\n "],[10,"dd"],[12],[2,"\\n "],[1,[35,0,["Action"]]],[2,"\\n "],[13],[2,"\\n"]],"parameters":[]}]]],[2," "],[10,"dt"],[12],[2,"Description"],[13],[2,"\\n "],[10,"dd"],[12],[2,"\\n "],[1,[30,[36,3],[[35,0,["Description"]],"N/A"],null]],[2,"\\n "],[13],[2,"\\n "],[13],[2,"\\n "],[13],[2,"\\n\\n"],[6,[37,2],[[30,[36,4],[[35,0,["Permissions","length"]],0],null]],null,[["default"],[{"statements":[[2," "],[10,"h2"],[12],[2,"Permissions"],[13],[2,"\\n "],[8,"consul/intention/notice/permissions",[],[[],[]],null],[2,"\\n "],[8,"consul/intention/permission/list",[],[["@items"],[[34,0,["Permissions"]]]],null],[2,"\\n"]],"parameters":[]}]]],[2,"\\n"],[13],[2,"\\n"]],"hasEval":false,"upvars":["item","hash","if","or","gt"]}',meta:{moduleName:"consul-ui/components/consul/intention/view/index.hbs"}}) -var n=Ember._setComponentTemplate(t,Ember.Component.extend({tagName:""})) -e.default=n})),define("consul-ui/components/consul/kind/index",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const t=Ember.HTMLBars.template({id:"z+keWPxf",block:'{"symbols":["Name","link","link"],"statements":[[6,[37,5],[[35,3,["Kind"]]],null,[["default"],[{"statements":[[6,[37,9],[[30,[36,12],[[30,[36,11],[[35,3,["Kind"]]],null]],null]],null,[["default"],[{"statements":[[6,[37,5],[[35,10]],null,[["default","else"],[{"statements":[[2," "],[10,"dl"],[14,0,"tooltip-panel"],[12],[2,"\\n "],[10,"dt"],[12],[2,"\\n "],[10,"span"],[14,0,"consul-kind"],[12],[2,"\\n "],[1,[32,1]],[2,"\\n "],[13],[2,"\\n "],[13],[2,"\\n "],[10,"dd"],[12],[2,"\\n "],[8,"menu-panel",[],[["@position"],["left"]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["header"]],[["default"],[{"statements":[[2,"\\n"],[6,[37,5],[[30,[36,6],[[35,3,["Kind"]],"ingress-gateway"],null]],null,[["default","else"],[{"statements":[[2," Ingress gateways enable ingress traffic from services outside the Consul service mesh to services inside the Consul service mesh.\\n"]],"parameters":[]},{"statements":[[6,[37,5],[[30,[36,6],[[35,3,["Kind"]],"terminating-gateway"],null]],null,[["default","else"],[{"statements":[[2," Terminating gateways allow connect-enabled services in Consul service mesh to communicate with services outside the service mesh.\\n"]],"parameters":[]},{"statements":[[2," Mesh gateways enable routing of Connect traffic between different Consul datacenters.\\n "]],"parameters":[]}]]]],"parameters":[]}]]],[2," "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["menu"]],[["default"],[{"statements":[[2,"\\n "],[10,"li"],[14,"role","separator"],[12],[2,"\\n"],[6,[37,5],[[30,[36,6],[[35,3,["Kind"]],"ingress-gateway"],null]],null,[["default","else"],[{"statements":[[2," About Ingress gateways\\n"]],"parameters":[]},{"statements":[[6,[37,5],[[30,[36,6],[[35,3,["Kind"]],"terminating-gateway"],null]],null,[["default","else"],[{"statements":[[2," About Terminating gateways\\n"]],"parameters":[]},{"statements":[[2," About Mesh gateways\\n "]],"parameters":[]}]]]],"parameters":[]}]]],[2," "],[13],[2,"\\n"],[6,[37,9],[[30,[36,8],[[30,[36,7],[[30,[36,7],["ingress-gateway","/consul/developer-mesh/ingress-gateways"],null],[30,[36,7],["terminating-gateway","/consul/developer-mesh/understand-terminating-gateways"],null],[30,[36,7],["mesh-gateway","/consul/developer-mesh/connect-gateways"],null]],null]],null]],null,[["default"],[{"statements":[[2," "],[10,"li"],[14,"role","none"],[14,0,"learn-link"],[12],[2,"\\n "],[10,"a"],[14,"tabindex","-1"],[14,"role","menuitem"],[15,6,[30,[36,2],[[30,[36,1],["CONSUL_DOCS_LEARN_URL"],null],[30,[36,0],[[32,3],[35,3,["Kind"]]],null]],null]],[14,"rel","noopener noreferrer"],[14,"target","_blank"],[12],[2,"\\n Learn guides\\n "],[13],[2,"\\n "],[13],[2,"\\n"]],"parameters":[3]}]]],[6,[37,9],[[30,[36,8],[[30,[36,7],[[30,[36,7],["ingress-gateway","/connect/ingress-gateway"],null],[30,[36,7],["terminating-gateway","/connect/terminating-gateway"],null],[30,[36,7],["mesh-gateway","/connect/mesh-gateway"],null]],null]],null]],null,[["default"],[{"statements":[[2," "],[10,"li"],[14,"role","none"],[14,0,"docs-link"],[12],[2,"\\n "],[10,"a"],[14,"tabindex","-1"],[14,"role","menuitem"],[15,6,[30,[36,2],[[30,[36,1],["CONSUL_DOCS_URL"],null],[30,[36,0],[[32,2],[35,3,["Kind"]]],null]],null]],[14,"rel","noopener noreferrer"],[14,"target","_blank"],[12],[2,"\\n Documentation\\n "],[13],[2,"\\n "],[13],[2,"\\n "],[10,"li"],[14,"role","separator"],[12],[2,"\\n Other gateway types\\n "],[13],[2,"\\n"],[6,[37,5],[[30,[36,4],[[35,3,["Kind"]],"mesh-gateway"],null]],null,[["default"],[{"statements":[[2," "],[10,"li"],[14,"role","none"],[14,0,"docs-link"],[12],[2,"\\n "],[10,"a"],[14,"tabindex","-1"],[14,"role","menuitem"],[15,6,[30,[36,2],[[30,[36,1],["CONSUL_DOCS_URL"],null],[30,[36,0],[[32,2],"mesh-gateway"],null]],null]],[14,"rel","noopener noreferrer"],[14,"target","_blank"],[12],[2,"\\n Mesh gateways\\n "],[13],[2,"\\n "],[13],[2,"\\n"]],"parameters":[]}]]],[6,[37,5],[[30,[36,4],[[35,3,["Kind"]],"terminating-gateway"],null]],null,[["default"],[{"statements":[[2," "],[10,"li"],[14,"role","none"],[14,0,"docs-link"],[12],[2,"\\n "],[10,"a"],[14,"tabindex","-1"],[14,"role","menuitem"],[15,6,[30,[36,2],[[30,[36,1],["CONSUL_DOCS_URL"],null],[30,[36,0],[[32,2],"terminating-gateway"],null]],null]],[14,"rel","noopener noreferrer"],[14,"target","_blank"],[12],[2,"\\n Terminating gateways\\n "],[13],[2,"\\n "],[13],[2,"\\n"]],"parameters":[]}]]],[6,[37,5],[[30,[36,4],[[35,3,["Kind"]],"ingress-gateway"],null]],null,[["default"],[{"statements":[[2," "],[10,"li"],[14,"role","none"],[14,0,"docs-link"],[12],[2,"\\n "],[10,"a"],[14,"tabindex","-1"],[14,"role","menuitem"],[15,6,[30,[36,2],[[30,[36,1],["CONSUL_DOCS_URL"],null],[30,[36,0],[[32,2],"ingress-gateway"],null]],null]],[14,"rel","noopener noreferrer"],[14,"target","_blank"],[12],[2,"\\n Ingress gateways\\n "],[13],[2,"\\n "],[13],[2,"\\n"]],"parameters":[]}]]]],"parameters":[2]}]]],[2," "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[13],[2,"\\n "],[13],[2,"\\n"]],"parameters":[]},{"statements":[[2," "],[10,"span"],[14,0,"consul-kind"],[12],[2,"\\n "],[1,[32,1]],[2,"\\n "],[13],[2,"\\n"]],"parameters":[]}]]]],"parameters":[1]}]]]],"parameters":[]}]]]],"hasEval":false,"upvars":["get","env","concat","item","not-eq","if","eq","array","from-entries","let","withInfo","humanize","titleize"]}',meta:{moduleName:"consul-ui/components/consul/kind/index.hbs"}}) -var n=Ember._setComponentTemplate(t,Ember.Component.extend({tagName:""})) -e.default=n})),define("consul-ui/components/consul/kv/form/index",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const t=Ember.HTMLBars.template({id:"LrzkPXNV",block:'{"symbols":["api","disabld","execute","cancel","message","confirm","__arg0"],"statements":[[8,"data-form",[],[["@dc","@nspace","@partition","@type","@label","@autofill","@item","@src","@onchange","@onsubmit"],[[34,15],[34,16],[34,17],"kv","key",[34,18],[34,19],[34,20],[30,[36,0],[[32,0],"change"],null],[30,[36,0],[[32,0],[35,21]],null]]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["content"]],[["default"],[{"statements":[[2,"\\n"],[6,[37,23],[[30,[36,22],["write kv"],[["item"],[[32,1,["data"]]]]]],null,[["default"],[{"statements":[[2," "],[10,"form"],[15,"onsubmit",[30,[36,0],[[32,0],[32,1,["submit"]]],null]],[12],[2,"\\n "],[11,"fieldset"],[4,[38,5],[[30,[36,1],[[32,2],[32,1,["disabled"]]],null]],null],[12],[2,"\\n"],[6,[37,3],[[32,1,["isCreate"]]],null,[["default"],[{"statements":[[2," "],[10,"label"],[15,0,[31,["type-text",[30,[36,3],[[32,1,["data","error","Key"]]," has-error"],null]]]],[12],[2,"\\n "],[10,"span"],[12],[2,"Key or folder"],[13],[2,"\\n "],[10,"input"],[14,"autofocus","autofocus"],[15,2,[30,[36,11],[[32,1,["data","Key"]],[35,10]],null]],[14,3,"additional"],[15,"oninput",[30,[36,0],[[32,0],[32,1,["change"]]],null]],[14,"placeholder","Key or folder"],[14,4,"text"],[12],[13],[2,"\\n "],[10,"em"],[12],[2,"To create a folder, end a key with "],[10,"code"],[12],[2,"/"],[13],[13],[2,"\\n "],[13],[2,"\\n"]],"parameters":[]}]]],[6,[37,3],[[30,[36,1],[[30,[36,14],[[30,[36,11],[[32,1,["data","Key"]],[35,10]],null],""],null],[30,[36,13],[[30,[36,12],[[32,1,["data","Key"]]],null],"/"],null]],null]],null,[["default"],[{"statements":[[2," "],[10,"div"],[12],[2,"\\n "],[10,"div"],[14,0,"type-toggle"],[12],[2,"\\n "],[10,"label"],[12],[2,"\\n "],[11,"input"],[24,3,"json"],[16,"checked",[30,[36,3],[[35,9],"checked"],null]],[16,"onchange",[30,[36,0],[[32,0],[32,1,["change"]]],null]],[24,4,"checkbox"],[4,[38,5],[false],null],[12],[13],[2,"\\n "],[10,"span"],[12],[2,"Code"],[13],[2,"\\n "],[13],[2,"\\n "],[13],[2,"\\n\\n "],[10,"label"],[14,"for",""],[15,0,[31,["type-text",[30,[36,3],[[32,1,["data","error","Value"]]," has-error"],null]]]],[12],[2,"\\n"],[6,[37,3],[[35,9]],null,[["default","else"],[{"statements":[[2," "],[8,"code-editor",[],[["@name","@readonly","@value","@onkeyup","@namedBlocksInfo"],["value",[30,[36,1],[[32,2],[32,1,["disabled"]]],null],[30,[36,6],[[32,1,["data","Value"]]],null],[30,[36,0],[[32,0],[32,1,["change"]],"value"],null],[30,[36,7],null,[["label"],[0]]]]],[["default"],[{"statements":[[6,[37,3],[[30,[36,8],[[32,7],"label"],null]],null,[["default"],[{"statements":[[2,"Value"]],"parameters":[]}]]]],"parameters":[7]}]]],[2,"\\n"]],"parameters":[]},{"statements":[[2," "],[10,"span"],[12],[2,"Value"],[13],[2,"\\n "],[11,"textarea"],[16,"autofocus",[30,[36,2],[[32,1,["isCreate"]]],null]],[24,3,"value"],[16,"oninput",[30,[36,0],[[32,0],[32,1,["change"]]],null]],[4,[38,5],[[30,[36,1],[[32,2],[32,1,["disabled"]]],null]],null],[12],[1,[30,[36,6],[[32,1,["data","Value"]]],null]],[13],[2,"\\n"]],"parameters":[]}]]],[2," "],[13],[2,"\\n "],[13],[2,"\\n"]],"parameters":[]}]]],[2," "],[13],[2,"\\n"],[6,[37,3],[[32,1,["isCreate"]]],null,[["default","else"],[{"statements":[[6,[37,3],[[30,[36,2],[[32,2]],null]],null,[["default"],[{"statements":[[2," "],[10,"button"],[15,"disabled",[30,[36,1],[[32,1,["data","isPristine"]],[32,1,["data","isInvalid"]],[32,1,["disabled"]]],null]],[14,4,"submit"],[12],[2,"Save"],[13],[2,"\\n"]],"parameters":[]}]]],[2," "],[10,"button"],[15,"onclick",[30,[36,0],[[32,0],[35,4],[32,1,["data"]]],null]],[15,"disabled",[32,1,["disabled"]]],[14,4,"reset"],[12],[2,"Cancel"],[13],[2,"\\n"]],"parameters":[]},{"statements":[[6,[37,3],[[30,[36,2],[[32,2]],null]],null,[["default"],[{"statements":[[2," "],[10,"button"],[15,"disabled",[30,[36,1],[[32,1,["data","isInvalid"]],[32,1,["disabled"]]],null]],[14,4,"submit"],[12],[2,"Save"],[13],[2,"\\n"]],"parameters":[]}]]],[2," "],[10,"button"],[15,"onclick",[30,[36,0],[[32,0],[35,4],[32,1,["data"]]],null]],[15,"disabled",[32,1,["disabled"]]],[14,4,"reset"],[12],[2,"Cancel"],[13],[2,"\\n"],[6,[37,3],[[30,[36,2],[[32,2]],null]],null,[["default"],[{"statements":[[2," "],[8,"confirmation-dialog",[],[["@message"],["Are you sure you want to delete this key?"]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["action"]],[["default"],[{"statements":[[2,"\\n "],[11,"button"],[24,0,"type-delete"],[16,"disabled",[32,1,["disabled"]]],[24,4,"button"],[4,[38,0],[[32,0],[32,6],[32,1,["delete"]]],null],[12],[2,"Delete"],[13],[2,"\\n "]],"parameters":[6]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["dialog"]],[["default"],[{"statements":[[2,"\\n "],[8,"delete-confirmation",[],[["@message","@execute","@cancel"],[[32,5],[32,3],[32,4]]],null],[2,"\\n "]],"parameters":[3,4,5]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[]}]]]],"parameters":[]}]]],[2," "],[13],[2,"\\n"]],"parameters":[2]}]]],[2," "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[1]}]]],[2,"\\n"]],"hasEval":false,"upvars":["action","or","not","if","oncancel","disabled","atob","hash","-is-named-block-invocation","json","parent","left-trim","last","not-eq","eq","dc","nspace","partition","autofill","item","src","onsubmit","cannot","let"]}',meta:{moduleName:"consul-ui/components/consul/kv/form/index.hbs"}}) -var n=Ember._setComponentTemplate(t,Ember.Component.extend({tagName:"",encoder:Ember.inject.service("btoa"),json:!0,ondelete:function(){this.onsubmit(...arguments)},oncancel:function(){this.onsubmit(...arguments)},onsubmit:function(){},actions:{change:function(e,t){const n=t.getData() -try{t.handleEvent(e)}catch(r){const t=e.target -let a -switch(t.name){case"value":Ember.set(n,"Value",this.encoder.execute(t.value)) -break -case"additional":a=Ember.get(this,"parent"),Ember.set(n,"Key",`${"/"!==a?a:""}${t.value}`) -break -case"json":Ember.set(this,"json",!this.json) -break -default:throw r}}}}})) -e.default=n})),define("consul-ui/components/consul/kv/list/index",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const t=Ember.HTMLBars.template({id:"IGQyLUaF",block:'{"symbols":["item","index","index","change","checked","confirm","send","keypressClick","__arg0","__arg1","Actions","@delete","&attrs","@items","@parent"],"statements":[[8,"tabular-collection",[[24,0,"consul-kv-list"],[17,13]],[["@items"],[[32,14]]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["header"]],[["default"],[{"statements":[[2,"\\n "],[10,"th"],[12],[2,"Name"],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["row"]],[["default"],[{"statements":[[2,"\\n "],[10,"td"],[15,0,[30,[36,0],[[32,1,["isFolder"]],"folder","file"],null]],[12],[2,"\\n "],[10,"a"],[15,6,[30,[36,1],[[30,[36,0],[[32,1,["isFolder"]],"dc.kv.folder","dc.kv.edit"],null],[32,1,["Key"]]],null]],[12],[1,[30,[36,9],[[30,[36,8],[[32,1,["Key"]],[32,15,["Key"]]],null],"/"],null]],[13],[2,"\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["actions"]],[["default"],[{"statements":[[2,"\\n "],[8,"popover-menu",[],[["@expanded","@onchange","@keyboardAccess"],[[30,[36,0],[[30,[36,10],[[32,5],[32,3]],null],true,false],null],[30,[36,2],[[32,0],[32,4],[32,3]],null],false]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["trigger"]],[["default"],[{"statements":[[2,"\\n More\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["menu"]],[["default"],[{"statements":[[2,"\\n"],[6,[37,0],[[30,[36,11],["write kv"],[["item"],[[32,1]]]]],null,[["default","else"],[{"statements":[[2," "],[10,"li"],[14,"role","none"],[12],[2,"\\n "],[10,"a"],[14,"role","menuitem"],[14,"tabindex","-1"],[15,6,[30,[36,1],[[30,[36,0],[[32,1,["isFolder"]],"dc.kv.folder","dc.kv.edit"],null],[32,1,["Key"]]],null]],[12],[1,[30,[36,0],[[32,1,["isFolder"]],"View","Edit"],null]],[13],[2,"\\n "],[13],[2,"\\n "],[10,"li"],[14,"role","none"],[14,0,"dangerous"],[12],[2,"\\n "],[10,"label"],[15,"for",[32,6]],[14,"role","menuitem"],[14,"tabindex","-1"],[15,"onkeypress",[32,8]],[12],[2,"Delete"],[13],[2,"\\n "],[10,"div"],[14,"role","menu"],[12],[2,"\\n "],[8,"informed-action",[[24,0,"warning"]],[["@namedBlocksInfo"],[[30,[36,7],null,[["header","body","actions"],[0,0,1]]]]],[["default"],[{"statements":[[6,[37,0],[[30,[36,6],[[32,9],"header"],null]],null,[["default","else"],[{"statements":[[2,"\\n Confirm Delete\\n "]],"parameters":[]},{"statements":[[6,[37,0],[[30,[36,6],[[32,9],"body"],null]],null,[["default","else"],[{"statements":[[2,"\\n "],[10,"p"],[12],[2,"\\n Are you sure you want to delete this KV entry?\\n "],[13],[2,"\\n "]],"parameters":[]},{"statements":[[6,[37,0],[[30,[36,6],[[32,9],"actions"],null]],null,[["default"],[{"statements":[[6,[37,5],[[32,10]],null,[["default"],[{"statements":[[2,"\\n "],[8,[32,11,["Action"]],[[24,0,"dangerous"]],[[],[]],[["default"],[{"statements":[[2,"\\n "],[8,"action",[[24,0,"type-delete"],[24,"tabindex","-1"],[4,[38,4],["click",[30,[36,3],[[30,[36,2],[[32,0],[32,4]],null],[30,[36,2],[[32,0],[32,12],[32,1]],null]],null]],null]],[[],[]],[["default"],[{"statements":[[2,"\\n Delete\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,[32,11,["Action"]],[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[8,"action",[],[["@for"],[[32,6]]],[["default"],[{"statements":[[2,"\\n Cancel\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[11]}]]]],"parameters":[]}]]]],"parameters":[]}]]]],"parameters":[]}]]]],"parameters":[9,10]}]]],[2,"\\n "],[13],[2,"\\n "],[13],[2,"\\n"]],"parameters":[]},{"statements":[[2," "],[10,"li"],[14,"role","none"],[12],[2,"\\n "],[10,"a"],[14,"role","menuitem"],[14,"tabindex","-1"],[15,6,[30,[36,1],[[30,[36,0],[[32,1,["isFolder"]],"dc.kv.folder","dc.kv.edit"],null],[32,1,["Key"]]],null]],[12],[2,"View"],[13],[2,"\\n "],[13],[2,"\\n"]],"parameters":[]}]]],[2," "]],"parameters":[6,7,8]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[3,4,5]}]]],[2,"\\n"]],"parameters":[1,2]}]]]],"hasEval":false,"upvars":["if","href-to","action","queue","on","let","-is-named-block-invocation","hash","left-trim","right-trim","eq","can"]}',meta:{moduleName:"consul-ui/components/consul/kv/list/index.hbs"}}) -var n=Ember._setComponentTemplate(t,Ember._templateOnlyComponent()) -e.default=n})),define("consul-ui/components/consul/kv/search-bar/index",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const t=Ember.HTMLBars.template({id:"pTbMHFFw",block:'{"symbols":["__arg0","__arg1","search","components","Optgroup","Option","selectable","search","components","Optgroup","Option","item","search","components","Optgroup","Option","prop","search","key","value","@sort","@filter","@onsearch","@search","&attrs"],"statements":[[8,"search-bar",[[24,0,"consul-kv-search-bar"],[17,25]],[["@filter","@namedBlocksInfo"],[[32,22],[30,[36,14],null,[["status","search","filter","sort"],[1,1,1,1]]]]],[["default"],[{"statements":[[6,[37,8],[[30,[36,7],[[32,1],"status"],null]],null,[["default","else"],[{"statements":[[6,[37,6],[[32,2]],null,[["default"],[{"statements":[[2,"\\n\\n"],[6,[37,6],[[30,[36,0],[[30,[36,10],["components.consul.kv.search-bar.",[32,18,["status","key"]]],null]],[["default"],[[30,[36,4],[[30,[36,10],["common.search.",[32,18,["status","key"]]],null],[30,[36,10],["common.consul.",[32,18,["status","key"]]],null]],null]]]],[30,[36,0],[[30,[36,10],["components.consul.kv.search-bar.",[32,18,["status","value"]]],null]],[["default"],[[30,[36,4],[[30,[36,10],["common.search.",[32,18,["status","value"]]],null],[30,[36,10],["common.consul.",[32,18,["status","value"]]],null]],null]]]]],null,[["default"],[{"statements":[[2," "],[8,[32,18,["RemoveFilter"]],[[16,"aria-label",[30,[36,0],["common.ui.remove"],[["item"],[[30,[36,10],[[32,19]," ",[32,20]],null]]]]]],[[],[]],[["default"],[{"statements":[[2,"\\n "],[10,"dl"],[12],[2,"\\n "],[10,"dt"],[12],[1,[32,19]],[13],[2,"\\n "],[10,"dd"],[12],[1,[32,20]],[13],[2,"\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[19,20]}]]],[2,"\\n "]],"parameters":[18]}]]]],"parameters":[]},{"statements":[[6,[37,8],[[30,[36,7],[[32,1],"search"],null]],null,[["default","else"],[{"statements":[[6,[37,6],[[32,2]],null,[["default"],[{"statements":[[2,"\\n "],[8,[32,13,["Search"]],[],[["@onsearch","@value","@placeholder"],[[30,[36,3],[[32,0],[32,23]],null],[32,24],[30,[36,0],["common.search.search"],null]]],[["default"],[{"statements":[[2,"\\n"],[6,[37,8],[[32,22,["searchproperty"]]],null,[["default"],[{"statements":[[2," "],[8,[32,13,["Select"]],[[24,0,"type-search-properties"]],[["@position","@onchange","@multiple","@required"],["right",[30,[36,3],[[32,0],[32,22,["searchproperty","change"]]],null],true,true]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["selected"]],[["default"],[{"statements":[[2,"\\n "],[10,"span"],[12],[2,"\\n "],[1,[30,[36,0],["common.search.searchproperty"],null]],[2,"\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["options"]],[["default"],[{"statements":[[2,"\\n"],[6,[37,6],[[32,14,["Optgroup"]],[32,14,["Option"]]],null,[["default"],[{"statements":[[6,[37,12],[[30,[36,11],[[30,[36,11],[[32,22,["searchproperty","default"]]],null]],null]],null,[["default"],[{"statements":[[2," "],[8,[32,16],[],[["@value","@selected"],[[32,17],[30,[36,9],[[32,17],[32,22,["searchproperty","value"]]],null]]],[["default"],[{"statements":[[2,"\\n "],[1,[30,[36,0],[[30,[36,10],["common.consul.",[30,[36,13],[[32,17]],null]],null]],null]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[17]}]]]],"parameters":[15,16]}]]],[2," "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[14]}]]],[2,"\\n"]],"parameters":[]}]]],[2," "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[13]}]]]],"parameters":[]},{"statements":[[6,[37,8],[[30,[36,7],[[32,1],"filter"],null]],null,[["default","else"],[{"statements":[[6,[37,6],[[32,2]],null,[["default"],[{"statements":[[2,"\\n "],[8,[32,8,["Select"]],[[24,0,"type-kind"]],[["@position","@onchange","@multiple"],["left",[30,[36,3],[[32,0],[32,22,["kind","change"]]],null],true]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["selected"]],[["default"],[{"statements":[[2,"\\n "],[10,"span"],[12],[2,"\\n "],[1,[30,[36,0],["components.consul.kv.search-bar.kind.name"],null]],[2,"\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["options"]],[["default"],[{"statements":[[2,"\\n"],[6,[37,6],[[32,9,["Optgroup"]],[32,9,["Option"]]],null,[["default"],[{"statements":[[6,[37,12],[[30,[36,11],[[30,[36,11],[[30,[36,4],["folder","key"],null]],null]],null]],null,[["default"],[{"statements":[[2," "],[8,[32,11],[[24,0,"value-{item}}"]],[["@value","@selected"],[[32,12],[30,[36,9],[[32,12],[32,22,["kind","value"]]],null]]],[["default"],[{"statements":[[2,"\\n "],[1,[30,[36,0],[[30,[36,10],["components.consul.kv.search-bar.kind.options.",[32,12]],null]],null]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[12]}]]]],"parameters":[10,11]}]]],[2," "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[9]}]]],[2,"\\n "]],"parameters":[8]}]]]],"parameters":[]},{"statements":[[6,[37,8],[[30,[36,7],[[32,1],"sort"],null]],null,[["default"],[{"statements":[[6,[37,6],[[32,2]],null,[["default"],[{"statements":[[2,"\\n "],[8,[32,3,["Select"]],[[24,0,"type-sort"]],[["@position","@onchange","@multiple","@required"],["right",[30,[36,3],[[32,0],[32,21,["change"]]],null],false,true]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["selected"]],[["default"],[{"statements":[[2,"\\n "],[10,"span"],[12],[2,"\\n"],[6,[37,6],[[30,[36,5],[[30,[36,4],[[30,[36,4],["Key:asc",[30,[36,0],["common.sort.alpha.asc"],null]],null],[30,[36,4],["Key:desc",[30,[36,0],["common.sort.alpha.desc"],null]],null],[30,[36,4],["Kind:asc",[30,[36,0],["components.consul.kv.search-bar.sort.kind.asc"],null]],null],[30,[36,4],["Kind:desc",[30,[36,0],["components.consul.kv.search-bar.sort.kind.desc"],null]],null]],null]],null]],null,[["default"],[{"statements":[[2," "],[1,[30,[36,2],[[32,7],[32,21,["value"]]],null]],[2,"\\n"]],"parameters":[7]}]]],[2," "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["options"]],[["default"],[{"statements":[[2,"\\n"],[6,[37,6],[[32,4,["Optgroup"]],[32,4,["Option"]]],null,[["default"],[{"statements":[[2," "],[8,[32,5],[],[["@label"],[[30,[36,0],["common.consul.name"],null]]],[["default"],[{"statements":[[2,"\\n "],[8,[32,6],[],[["@value","@selected"],["Key:asc",[30,[36,1],["Key:asc",[32,21,["value"]]],null]]],[["default"],[{"statements":[[1,[30,[36,0],["common.sort.alpha.asc"],null]]],"parameters":[]}]]],[2,"\\n "],[8,[32,6],[],[["@value","@selected"],["Key:desc",[30,[36,1],["Key:desc",[32,21,["value"]]],null]]],[["default"],[{"statements":[[1,[30,[36,0],["common.sort.alpha.desc"],null]]],"parameters":[]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,[32,5],[],[["@label"],[[30,[36,0],["components.consul.kv.search-bar.kind.name"],null]]],[["default"],[{"statements":[[2,"\\n "],[8,[32,6],[],[["@value","@selected"],["Kind:asc",[30,[36,1],["Kind:asc",[32,21,["value"]]],null]]],[["default"],[{"statements":[[1,[30,[36,0],["components.consul.kv.search-bar.sort.kind.asc"],null]]],"parameters":[]}]]],[2,"\\n "],[8,[32,6],[],[["@value","@selected"],["Kind:desc",[30,[36,1],["Kind:desc",[32,21,["value"]]],null]]],[["default"],[{"statements":[[1,[30,[36,0],["components.consul.kv.search-bar.sort.kind.desc"],null]]],"parameters":[]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[5,6]}]]],[2," "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[4]}]]],[2,"\\n "]],"parameters":[3]}]]]],"parameters":[]}]]]],"parameters":[]}]]]],"parameters":[]}]]]],"parameters":[]}]]]],"parameters":[1,2]}]]],[2,"\\n"]],"hasEval":false,"upvars":["t","eq","get","action","array","from-entries","let","-is-named-block-invocation","if","contains","concat","-track-array","each","lowercase","hash"]}',meta:{moduleName:"consul-ui/components/consul/kv/search-bar/index.hbs"}}) -var n=Ember._setComponentTemplate(t,Ember._templateOnlyComponent()) -e.default=n})),define("consul-ui/components/consul/loader/index",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const t=Ember.HTMLBars.template({id:"2ziS2H3f",block:'{"symbols":["&attrs"],"statements":[[11,"div"],[24,0,"consul-loader"],[17,1],[12],[2,"\\n "],[10,"svg"],[14,"xmlns","http://www.w3.org/2000/svg","http://www.w3.org/2000/xmlns/"],[14,"xmlns:xlink","http://www.w3.org/1999/xlink","http://www.w3.org/2000/xmlns/"],[14,"width","44px"],[14,"height","44px"],[14,"viewBox","0 0 44 44"],[14,"version","1.1"],[12],[2,"\\n "],[10,"g"],[12],[2,"\\n "],[10,"circle"],[14,"r","1"],[14,"cx","27"],[14,"cy","2"],[14,5,"transform-origin: 27px 2px"],[12],[13],[2,"\\n "],[10,"circle"],[14,"r","1"],[14,"cx","17"],[14,"cy","2"],[14,5,"transform-origin: 17px 2px"],[12],[13],[2,"\\n "],[10,"circle"],[14,"r","1"],[14,"cx","27"],[14,"cy","42"],[14,5,"transform-origin: 27px 42px"],[12],[13],[2,"\\n "],[10,"circle"],[14,"r","1"],[14,"cx","17"],[14,"cy","42"],[14,5,"transform-origin: 17px 42px"],[12],[13],[2,"\\n "],[10,"circle"],[14,"r","1"],[14,"cx","2"],[14,"cy","17"],[14,5,"transform-origin: 2px 17px"],[12],[13],[2,"\\n "],[10,"circle"],[14,"r","1"],[14,"cx","2"],[14,"cy","27"],[14,5,"transform-origin: 2px 27px"],[12],[13],[2,"\\n "],[10,"circle"],[14,"r","1"],[14,"cx","42"],[14,"cy","17"],[14,5,"transform-origin: 42px 17px"],[12],[13],[2,"\\n "],[10,"circle"],[14,"r","1"],[14,"cx","42"],[14,"cy","27"],[14,5,"transform-origin: 42px 27px"],[12],[13],[2,"\\n "],[10,"circle"],[14,"r","1"],[14,"cx","33"],[14,"cy","4"],[14,5,"transform-origin: 33px 4px"],[12],[13],[2,"\\n "],[10,"circle"],[14,"r","1"],[14,"cx","11"],[14,"cy","4"],[14,5,"transform-origin: 11px 4px"],[12],[13],[2,"\\n "],[10,"circle"],[14,"r","1"],[14,"cx","33"],[14,"cy","40"],[14,5,"transform-origin: 33px 40px"],[12],[13],[2,"\\n "],[10,"circle"],[14,"r","1"],[14,"cx","11"],[14,"cy","40"],[14,5,"transform-origin: 11px 40px"],[12],[13],[2,"\\n "],[10,"circle"],[14,"r","1"],[14,"cx","40"],[14,"cy","11"],[14,5,"transform-origin: 40px 11px"],[12],[13],[2,"\\n "],[10,"circle"],[14,"r","1"],[14,"cx","4"],[14,"cy","33"],[14,5,"transform-origin: 4px 33px"],[12],[13],[2,"\\n "],[10,"circle"],[14,"r","1"],[14,"cx","40"],[14,"cy","33"],[14,5,"transform-origin: 40px 33px"],[12],[13],[2,"\\n "],[10,"circle"],[14,"r","1"],[14,"cx","4"],[14,"cy","11"],[14,5,"transform-origin: 4px 11px"],[12],[13],[2,"\\n "],[13],[2,"\\n "],[10,"g"],[12],[2,"\\n "],[10,"circle"],[14,"r","2"],[14,"cx","22"],[14,"cy","4"],[14,5,"transform-origin: 22px 4px"],[12],[13],[2,"\\n "],[10,"circle"],[14,"r","2"],[14,"cx","22"],[14,"cy","40"],[14,5,"transform-origin: 22px 40px"],[12],[13],[2,"\\n "],[10,"circle"],[14,"r","2"],[14,"cx","4"],[14,"cy","22"],[14,5,"transform-origin: 4px 22px"],[12],[13],[2,"\\n "],[10,"circle"],[14,"r","2"],[14,"cx","40"],[14,"cy","22"],[14,5,"transform-origin: 40px 22px"],[12],[13],[2,"\\n "],[10,"circle"],[14,"r","2"],[14,"cx","9"],[14,"cy","9"],[14,5,"transform-origin: 9px 9px"],[12],[13],[2,"\\n "],[10,"circle"],[14,"r","2"],[14,"cx","35"],[14,"cy","35"],[14,5,"transform-origin: 35px 35px"],[12],[13],[2,"\\n "],[10,"circle"],[14,"r","2"],[14,"cx","35"],[14,"cy","9"],[14,5,"transform-origin: 35px 9px"],[12],[13],[2,"\\n "],[10,"circle"],[14,"r","2"],[14,"cx","9"],[14,"cy","35"],[14,5,"transform-origin: 9px 35px"],[12],[13],[2,"\\n "],[13],[2,"\\n "],[10,"g"],[12],[2,"\\n "],[10,"circle"],[14,"r","2"],[14,"cx","28"],[14,"cy","8"],[14,5,"transform-origin: 28px 8px"],[12],[13],[2,"\\n "],[10,"circle"],[14,"r","2"],[14,"cx","16"],[14,"cy","8"],[14,5,"transform-origin: 16px 8px"],[12],[13],[2,"\\n "],[10,"circle"],[14,"r","2"],[14,"cx","28"],[14,"cy","36"],[14,5,"transform-origin: 28px 36px"],[12],[13],[2,"\\n "],[10,"circle"],[14,"r","2"],[14,"cx","16"],[14,"cy","36"],[14,5,"transform-origin: 16px 36px"],[12],[13],[2,"\\n "],[10,"circle"],[14,"r","2"],[14,"cx","8"],[14,"cy","28"],[14,5,"transform-origin: 8px 28px"],[12],[13],[2,"\\n "],[10,"circle"],[14,"r","2"],[14,"cx","8"],[14,"cy","16"],[14,5,"transform-origin: 8px 16px"],[12],[13],[2,"\\n "],[10,"circle"],[14,"r","2"],[14,"cx","36"],[14,"cy","28"],[14,5,"transform-origin: 36px 28px"],[12],[13],[2,"\\n "],[10,"circle"],[14,"r","2"],[14,"cx","36"],[14,"cy","16"],[14,5,"transform-origin: 36px 16px"],[12],[13],[2,"\\n "],[13],[2,"\\n "],[10,"g"],[12],[2,"\\n "],[10,"circle"],[14,"r","5"],[14,"cx","22"],[14,"cy","12"],[14,5,"transform-origin: 22px 12px"],[12],[13],[2,"\\n "],[10,"circle"],[14,"r","5"],[14,"cx","22"],[14,"cy","32"],[14,5,"transform-origin: 22px 32px"],[12],[13],[2,"\\n "],[10,"circle"],[14,"r","5"],[14,"cx","12"],[14,"cy","22"],[14,5,"transform-origin: 12px 22px"],[12],[13],[2,"\\n "],[10,"circle"],[14,"r","5"],[14,"cx","32"],[14,"cy","22"],[14,5,"transform-origin: 32px 22px"],[12],[13],[2,"\\n "],[10,"circle"],[14,"r","5"],[14,"cx","15"],[14,"cy","15"],[14,5,"transform-origin: 15px 15px"],[12],[13],[2,"\\n "],[10,"circle"],[14,"r","5"],[14,"cx","29"],[14,"cy","29"],[14,5,"transform-origin: 29px 29px"],[12],[13],[2,"\\n "],[10,"circle"],[14,"r","5"],[14,"cx","29"],[14,"cy","15"],[14,5,"transform-origin: 29px 15px"],[12],[13],[2,"\\n "],[10,"circle"],[14,"r","5"],[14,"cx","15"],[14,"cy","29"],[14,5,"transform-origin: 15px 29px"],[12],[13],[2,"\\n "],[13],[2,"\\n "],[10,"g"],[12],[2,"\\n "],[10,"circle"],[14,"r","9"],[14,"cx","22"],[14,"cy","22"],[14,5,"transform-origin: 22px 22px"],[12],[13],[2,"\\n "],[13],[2,"\\n "],[13],[2,"\\n"],[13],[2,"\\n"]],"hasEval":false,"upvars":[]}',meta:{moduleName:"consul-ui/components/consul/loader/index.hbs"}}) -var n=Ember._setComponentTemplate(t,Ember._templateOnlyComponent()) -e.default=n})),define("consul-ui/components/consul/lock-session/form/index",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const t=Ember.HTMLBars.template({id:"4H9hZw6F",block:'{"symbols":["writer","execute","cancel","message","confirm","checks","after","error","after","@item","&attrs","@onsubmit","@ondelete"],"statements":[[11,"div"],[24,0,"consul-lock-session-form"],[17,11],[12],[2,"\\n "],[8,"data-writer",[],[["@sink","@type","@label","@ondelete","@onchange"],[[30,[36,6],["/${partition}/${nspace}/${dc}/session",[30,[36,5],null,[["partition","nspace","dc"],[[32,10,["Partition"]],[32,10,["Namespace"]],[32,10,["Datacenter"]]]]]],null],"session","Lock Session",[30,[36,0],[[30,[36,4],[[32,13],[32,13],[32,12]],null],[32,10]],null],[30,[36,0],[[30,[36,7],[[32,12]],null],[32,10]],null]]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["removed"]],[["default"],[{"statements":[[2,"\\n "],[8,"consul/lock-session/notifications",[[4,[38,9],null,[["after"],[[30,[36,8],[[32,0],[32,9]],null]]]]],[["@type"],["remove"]],null],[2,"\\n "]],"parameters":[9]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["error"]],[["default"],[{"statements":[[2,"\\n "],[8,"consul/lock-session/notifications",[[4,[38,9],null,[["after"],[[30,[36,8],[[32,0],[32,7]],null]]]]],[["@type","@error"],["remove",[32,8]]],null],[2,"\\n "]],"parameters":[7,8]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["content"]],[["default"],[{"statements":[[2,"\\n "],[10,"div"],[14,0,"definition-table"],[12],[2,"\\n "],[10,"dl"],[12],[2,"\\n"],[6,[37,4],[[32,10,["Name"]]],null,[["default"],[{"statements":[[2," "],[10,"dt"],[12],[2,"Name"],[13],[2,"\\n "],[10,"dd"],[12],[1,[32,10,["Name"]]],[13],[2,"\\n"]],"parameters":[]}]]],[2," "],[10,"dt"],[12],[2,"ID"],[13],[2,"\\n "],[10,"dd"],[12],[1,[32,10,["ID"]]],[13],[2,"\\n "],[10,"dt"],[12],[2,"Node"],[13],[2,"\\n "],[10,"dd"],[12],[2,"\\n "],[10,"a"],[15,6,[30,[36,10],["dc.nodes.show",[32,10,["Node"]]],null]],[12],[2,"\\n "],[1,[32,10,["Node"]]],[2,"\\n "],[13],[2,"\\n "],[13],[2,"\\n "],[10,"dt"],[12],[2,"Delay"],[13],[2,"\\n "],[10,"dd"],[12],[1,[30,[36,11],[[32,10,["LockDelay"]]],null]],[13],[2,"\\n "],[10,"dt"],[12],[2,"TTL"],[13],[2,"\\n "],[10,"dd"],[12],[1,[30,[36,12],[[32,10,["TTL"]],"-"],null]],[13],[2,"\\n "],[10,"dt"],[12],[2,"Behavior"],[13],[2,"\\n "],[10,"dd"],[12],[1,[32,10,["Behavior"]]],[13],[2,"\\n"],[6,[37,13],[[32,10,["checks"]]],null,[["default"],[{"statements":[[2," "],[10,"dt"],[12],[2,"Health Checks"],[13],[2,"\\n "],[10,"dd"],[12],[2,"\\n"],[6,[37,4],[[30,[36,3],[[32,6,["length"]],0],null]],null,[["default","else"],[{"statements":[[2," "],[1,[30,[36,2],[", ",[32,6]],null]],[2,"\\n"]],"parameters":[]},{"statements":[[2," -\\n"]],"parameters":[]}]]],[2," "],[13],[2,"\\n"]],"parameters":[6]}]]],[2," "],[13],[2,"\\n "],[13],[2,"\\n"],[6,[37,4],[[30,[36,14],["delete session"],[["item"],[[32,10]]]]],null,[["default"],[{"statements":[[2," "],[8,"confirmation-dialog",[],[["@message"],["Are you sure you want to invalidate this Lock Session?"]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["action"]],[["default"],[{"statements":[[2,"\\n "],[8,"action",[[24,0,"type-delete"],[4,[38,1],["click",[30,[36,0],[[32,5],[30,[36,0],[[32,1,["delete"]],[32,10]],null]],null]],null]],[[],[]],[["default"],[{"statements":[[2,"\\n Invalidate Session\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[5]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["dialog"]],[["default"],[{"statements":[[2,"\\n "],[10,"p"],[12],[2,"\\n "],[1,[32,4]],[2,"\\n "],[13],[2,"\\n "],[8,"action",[[24,0,"type-delete"],[4,[38,1],["click",[30,[36,0],[[32,2]],null]],null]],[[],[]],[["default"],[{"statements":[[2,"\\n Confirm Invalidation\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"action",[[24,0,"type-cancel"],[4,[38,1],["click",[30,[36,0],[[32,3]],null]],null]],[[],[]],[["default"],[{"statements":[[2,"\\n Cancel\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[2,3,4]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[]}]]],[2," "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[1]}]]],[2,"\\n"],[13]],"hasEval":false,"upvars":["fn","on","join","gt","if","hash","uri","optional","action","notification","href-to","duration-from","or","let","can"]}',meta:{moduleName:"consul-ui/components/consul/lock-session/form/index.hbs"}}) -var n=Ember._setComponentTemplate(t,Ember._templateOnlyComponent()) -e.default=n})),define("consul-ui/components/consul/lock-session/list/index",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const t=Ember.HTMLBars.template({id:"4zmOmXUM",block:'{"symbols":["item","index","execute","cancel","message","confirm","checks","item","&attrs","@items","@ondelete"],"statements":[[8,"list-collection",[[24,0,"consul-lock-session-list"],[17,9]],[["@items"],[[32,10]]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["header"]],[["default"],[{"statements":[[2,"\\n"],[6,[37,4],[[32,1,["Name"]]],null,[["default","else"],[{"statements":[[2," "],[10,"span"],[12],[1,[32,1,["Name"]]],[13],[2,"\\n"]],"parameters":[]},{"statements":[[2," "],[10,"span"],[12],[2,"\\n "],[1,[32,1,["ID"]]],[2,"\\n "],[8,"copy-button",[],[["@value","@name"],[[32,1,["ID"]],"ID"]],null],[2,"\\n "],[13],[2,"\\n"]],"parameters":[]}]]],[2," "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["details"]],[["default"],[{"statements":[[2,"\\n"],[6,[37,4],[[32,1,["Name"]]],null,[["default"],[{"statements":[[2," "],[10,"dl"],[12],[2,"\\n "],[10,"dt"],[12],[2,"\\n ID\\n "],[13],[2,"\\n "],[10,"dd"],[12],[2,"\\n "],[8,"copy-button",[],[["@value","@name"],[[32,1,["ID"]],"ID"]],null],[2,"\\n "],[1,[32,1,["ID"]]],[2,"\\n "],[13],[2,"\\n "],[13],[2,"\\n"]],"parameters":[]}]]],[2," "],[10,"dl"],[14,0,"lock-delay"],[12],[2,"\\n "],[11,"dt"],[4,[38,2],null,null],[12],[2,"\\n Delay\\n "],[13],[2,"\\n "],[10,"dd"],[12],[1,[30,[36,5],[[32,1,["LockDelay"]]],null]],[13],[2,"\\n "],[13],[2,"\\n "],[10,"dl"],[14,0,"ttl"],[12],[2,"\\n "],[11,"dt"],[4,[38,2],null,null],[12],[2,"\\n TTL\\n "],[13],[2,"\\n"],[6,[37,4],[[30,[36,6],[[32,1,["TTL"]],""],null]],null,[["default","else"],[{"statements":[[2," "],[10,"dd"],[12],[2,"-"],[13],[2,"\\n"]],"parameters":[]},{"statements":[[2," "],[10,"dd"],[12],[1,[32,1,["TTL"]]],[13],[2,"\\n"]],"parameters":[]}]]],[2," "],[13],[2,"\\n "],[10,"dl"],[14,0,"behavior"],[12],[2,"\\n "],[11,"dt"],[4,[38,2],null,null],[12],[2,"\\n Behavior\\n "],[13],[2,"\\n "],[10,"dd"],[12],[1,[32,1,["Behavior"]]],[13],[2,"\\n "],[13],[2,"\\n"],[6,[37,8],[[30,[36,7],[[32,1,["NodeChecks"]],[32,1,["ServiceChecks"]]],null]],null,[["default"],[{"statements":[[2," "],[10,"dl"],[14,0,"checks"],[12],[2,"\\n "],[11,"dt"],[4,[38,2],null,null],[12],[2,"\\n Checks\\n "],[13],[2,"\\n "],[10,"dd"],[12],[2,"\\n"],[6,[37,4],[[30,[36,3],[[32,7,["length"]],0],null]],null,[["default","else"],[{"statements":[[6,[37,1],[[30,[36,0],[[30,[36,0],[[32,7]],null]],null]],null,[["default"],[{"statements":[[2," "],[10,"span"],[12],[1,[32,8]],[13],[2,"\\n"]],"parameters":[8]}]]]],"parameters":[]},{"statements":[[2," -\\n"]],"parameters":[]}]]],[2," "],[13],[2,"\\n "],[13],[2,"\\n"]],"parameters":[7]}]]],[2," "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["actions"]],[["default"],[{"statements":[[2,"\\n "],[8,"confirmation-dialog",[],[["@message"],["Are you sure you want to invalidate this session?"]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["action"]],[["default"],[{"statements":[[2,"\\n "],[8,"action",[[24,0,"type-delete"],[4,[38,10],["click",[30,[36,9],[[32,6],[30,[36,9],[[32,11],[32,1]],null]],null]],null]],[[],[]],[["default"],[{"statements":[[2,"\\n Invalidate\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[6]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["dialog"]],[["default"],[{"statements":[[2,"\\n "],[10,"p"],[12],[2,"\\n "],[1,[32,5]],[2,"\\n "],[13],[2,"\\n "],[8,"action",[[24,0,"type-delete"],[4,[38,10],["click",[30,[36,9],[[32,3]],null]],null]],[[],[]],[["default"],[{"statements":[[2,"\\n Confirm Invalidate\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"action",[[24,0,"type-cancel"],[4,[38,10],["click",[30,[36,9],[[32,4]],null]],null]],[[],[]],[["default"],[{"statements":[[2,"\\n Cancel\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[3,4,5]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[1,2]}]]]],"hasEval":false,"upvars":["-track-array","each","tooltip","gt","if","duration-from","eq","union","let","fn","on"]}',meta:{moduleName:"consul-ui/components/consul/lock-session/list/index.hbs"}}) -var n=Ember._setComponentTemplate(t,Ember._templateOnlyComponent()) -e.default=n})),define("consul-ui/components/consul/lock-session/notifications/index",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const t=Ember.HTMLBars.template({id:"C5IRTA6J",block:'{"symbols":["notice","notice","notice","@type","&attrs","@error"],"statements":[[6,[37,2],[[30,[36,1],[[32,4],"remove"],null]],null,[["default","else"],[{"statements":[[6,[37,2],[[32,6]],null,[["default","else"],[{"statements":[[2," "],[8,"notice",[[24,0,"notification-delete"],[17,5]],[["@type"],["error"]],[["default"],[{"statements":[[2,"\\n "],[8,[32,3,["Header"]],[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[10,"strong"],[12],[2,"Error!"],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,[32,3,["Body"]],[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[10,"p"],[12],[2,"\\n There was an error invalidating the Lock Session.\\n"],[6,[37,2],[[30,[36,3],[[32,6,["status"]],[32,6,["detail"]]],null]],null,[["default"],[{"statements":[[2," "],[10,"br"],[12],[13],[1,[32,6,["status"]]],[2,": "],[1,[32,6,["detail"]]],[2,"\\n"]],"parameters":[]}]]],[2," "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[3]}]]],[2,"\\n"]],"parameters":[]},{"statements":[[2," "],[8,"notice",[[24,0,"notification-delete"],[17,5]],[["@type"],["success"]],[["default"],[{"statements":[[2,"\\n "],[8,[32,2,["Header"]],[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[10,"strong"],[12],[2,"Success!"],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,[32,2,["Body"]],[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[10,"p"],[12],[2,"\\n Your Lock Session has been invalidated.\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[2]}]]],[2,"\\n"]],"parameters":[]}]]]],"parameters":[]},{"statements":[[6,[37,2],[[30,[36,1],[[32,4],"kv"],null]],null,[["default"],[{"statements":[[2," "],[8,"notice",[],[["@type"],["warning"]],[["default"],[{"statements":[[2,"\\n "],[8,[32,1,["Body"]],[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[10,"p"],[12],[2,"\\n "],[10,"strong"],[12],[2,"Warning."],[13],[2," This KV has a lock session. You can edit KV\'s with lock sessions, but we recommend doing so with care, or not doing so at all. It may negatively impact the active node it\'s associated with. See below for more details on the Lock Session and see "],[10,"a"],[15,6,[31,[[30,[36,0],["CONSUL_DOCS_URL"],null],"/internals/sessions.html"]]],[14,"target","_blank"],[14,"rel","noopener noreferrer"],[12],[2,"our documentation"],[13],[2," for more information.\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[1]}]]],[2,"\\n"]],"parameters":[]}]]]],"parameters":[]}]]]],"hasEval":false,"upvars":["env","eq","if","and"]}',meta:{moduleName:"consul-ui/components/consul/lock-session/notifications/index.hbs"}}) -var n=Ember._setComponentTemplate(t,Ember._templateOnlyComponent()) -e.default=n})),define("consul-ui/components/consul/logo/index",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const t=Ember.HTMLBars.template({id:"VqMopggF",block:'{"symbols":[],"statements":[[10,"svg"],[14,"width","32"],[14,"height","32"],[14,"xmlns","http://www.w3.org/2000/svg","http://www.w3.org/2000/xmlns/"],[14,"fill","currentColor"],[12],[2,"\\n "],[10,"title"],[12],[2,"Consul"],[13],[2,"\\n "],[10,"path"],[14,"d","M20.0909311,0.531825836 C17.5736708,-0.133926002 14.9319012,-0.175262092 12.3950559,0.41140611 C9.85814916,0.998075538 7.50278772,2.1950159 5.53339269,3.89834301 C3.56397924,5.60167011 2.04003632,7.75991032 1.09382125,10.1857533 C0.147614161,12.6115349 -0.192263562,15.231632 0.103691496,17.8185758 C0.399647167,20.4055195 1.32249342,22.8811539 2.79212624,25.0305962 C4.26175905,27.1800385 6.2337511,28.9383326 8.5369881,30.1528504 C10.8402251,31.3673682 13.4050666,32.0014567 16.008894,32 C20.0224756,32.0040967 23.890121,30.4948211 26.8400939,27.7732993 L23.056744,23.818657 C21.5467316,25.1801547 19.674304,26.0745584 17.666316,26.3936287 C15.658328,26.7127604 13.6008556,26.4427448 11.7432242,25.6164282 C9.88553137,24.7900502 8.30724765,23.4427963 7.19961874,21.7377931 C6.09198982,20.0328513 5.50246798,18.0432818 5.50246798,16.0100604 C5.50246798,13.9769005 6.09198982,11.987331 7.19961874,10.2823278 C8.30724765,8.57732462 9.88553137,7.23007065 11.7432242,6.40375406 C13.6008556,5.57740063 15.658328,5.30742184 17.666316,5.62649829 C19.674304,5.94557474 21.5467316,6.8400276 23.056744,8.20152524 L26.8400939,4.23173679 C24.9249353,2.46762854 22.6081914,1.1975789 20.0909311,0.531825836 Z M28.629761,21.4006112 C28.3757081,21.4511394 28.1422839,21.5758942 27.9591423,21.7590358 C27.7759394,21.9422387 27.6511845,22.1756015 27.6006564,22.4297158 C27.5501282,22.6837687 27.5760369,22.9471537 27.67519,23.1864717 C27.7743431,23.4258512 27.9421973,23.6304197 28.1576327,23.7743298 C28.3730067,23.9182399 28.6262614,23.9950451 28.8852873,23.9950451 C29.2327222,23.9950451 29.565852,23.8570904 29.8114938,23.6114486 C30.0571355,23.3658068 30.1951517,23.0326156 30.1951517,22.6852422 C30.1951517,22.4261549 30.118285,22.1729615 29.9743749,21.9575261 C29.8304648,21.7421521 29.6258964,21.5742365 29.3865783,21.4751449 C29.1471988,21.3759918 28.8838753,21.3500217 28.629761,21.4006112 Z M30.136151,16.921839 C29.8820981,16.9724286 29.648674,17.097122 29.4655324,17.280325 C29.2823294,17.4635279 29.1575746,17.6968907 29.1070464,17.951005 C29.0565183,18.2050579 29.082427,18.4684429 29.1815801,18.7077609 C29.2807332,18.947079 29.4485873,19.1516475 29.6640227,19.295619 C29.8793967,19.4395291 30.1326515,19.5163343 30.3916774,19.5163343 C30.7386825,19.5149836 31.0710755,19.3765991 31.3164103,19.1312643 C31.5617451,18.8858681 31.7001911,18.5534751 31.7015418,18.2065314 C31.7015418,17.9474441 31.6247365,17.6941893 31.480765,17.4788153 C31.3368549,17.2634413 31.1322864,17.0955257 30.8929684,16.9963726 C30.6535889,16.897281 30.3902653,16.8713108 30.136151,16.921839 Z M17.2353224,12.7982374 C16.6019706,12.5359576 15.9050749,12.4673179 15.2327372,12.6010364 C14.5603995,12.7347549 13.9428262,13.0648763 13.458112,13.5495906 C12.9733363,14.0343049 12.6432763,14.6519395 12.5094963,15.3242158 C12.3757778,15.9965535 12.4444175,16.6934492 12.7067588,17.3268011 C12.9691,17.9601529 13.4133549,18.5014734 13.983347,18.8823072 C14.5532777,19.263141 15.2234051,19.4664201 15.9089428,19.4664201 C16.8281501,19.4664201 17.7097223,19.1012421 18.3597736,18.4512522 C19.0097635,17.8012623 19.3749415,16.9196902 19.3749415,16.0004214 C19.3749415,15.3149452 19.1716623,14.6448177 18.7907672,14.0748256 C18.4099334,13.5048336 17.8686128,13.0605787 17.2353224,12.7982374 Z M26.9935817,16.8454635 C26.7542636,16.7463104 26.4908786,16.7204017 26.2368257,16.7709299 C25.9827114,16.821458 25.7493487,16.9462129 25.5661457,17.1294158 C25.3830041,17.3125574 25.2582493,17.5459815 25.2076597,17.8000344 C25.1571316,18.0541487 25.1831017,18.3174723 25.2822548,18.5568518 C25.3813465,18.7961699 25.549262,19.0007383 25.764636,19.1446484 C25.9800714,19.2885585 26.2332648,19.3654252 26.4923521,19.3654252 C26.8397256,19.3654252 27.1729167,19.227409 27.4185585,18.9817672 C27.6641389,18.7361255 27.8021551,18.4029957 27.8021551,18.0555608 C27.8021551,17.7965349 27.7253498,17.5432802 27.5814397,17.3279062 C27.4375296,17.1124708 27.2328997,16.9446166 26.9935817,16.8454635 Z M26.9935817,12.7396665 C26.7542636,12.6405134 26.4908786,12.6146047 26.2368257,12.6651329 C25.9827114,12.715661 25.7493487,12.8404159 25.5661457,13.0236188 C25.3830041,13.2067604 25.2582493,13.4401845 25.2076597,13.6942374 C25.1571316,13.9483517 25.1831017,14.2116753 25.2822548,14.4510548 C25.3813465,14.6903729 25.549262,14.8949413 25.764636,15.0388514 C25.9800714,15.1827615 26.2332648,15.2596282 26.4923521,15.2596282 C26.8397256,15.2596282 27.1729167,15.121612 27.4185585,14.8759702 C27.6641389,14.6303285 27.8021551,14.2971373 27.8021551,13.9497638 C27.8021551,13.6907379 27.7253498,13.4374832 27.5814397,13.2220478 C27.4375296,13.0066738 27.2328997,12.8388196 26.9935817,12.7396665 Z M30.136151,12.5138553 C29.8820981,12.5644449 29.648674,12.6891997 29.4655324,12.8723413 C29.2823294,13.0555443 29.1575746,13.288907 29.1070464,13.5430213 C29.0565183,13.7970742 29.082427,14.0604592 29.1815801,14.2997773 C29.2807332,14.5391567 29.4485873,14.7436638 29.6640227,14.8876353 C29.8793967,15.0315454 30.1326515,15.1083507 30.3916774,15.1083507 C30.7386825,15.1070614 31.0710755,14.9686154 31.3164103,14.7232806 C31.5617451,14.4778844 31.7001911,14.1454914 31.7015418,13.7985477 C31.7015418,13.5394604 31.6247365,13.286267 31.480765,13.0708316 C31.3368549,12.8554577 31.1322864,12.6875421 30.8929684,12.5884504 C30.6535889,12.4892973 30.3902653,12.4633272 30.136151,12.5138553 Z M28.7055225,8.10574889 C28.4514696,8.15627705 28.2180454,8.28103189 28.0348425,8.46423485 C27.8517009,8.64743782 27.7269461,8.88080057 27.6764179,9.13485348 C27.6258898,9.38896778 27.6517985,9.65235274 27.7509516,9.89167082 C27.8501046,10.1309889 28.0179588,10.3355574 28.2333328,10.4794675 C28.4487682,10.623439 28.702023,10.7002442 28.9610489,10.7002442 C29.3084223,10.7002442 29.6416135,10.5622281 29.8872553,10.3165863 C30.1328971,10.0709445 30.2708519,9.73781471 30.2708519,9.39044126 C30.2708519,9.13135396 30.1940466,8.87809919 30.0501365,8.6627252 C29.9062264,8.44728981 29.7016579,8.27943562 29.4622784,8.18028254 C29.2229604,8.08112946 28.9595754,8.05522073 28.7055225,8.10574889 Z"],[14,"fill-rule","nonzero"],[12],[13],[2,"\\n"],[13]],"hasEval":false,"upvars":[]}',meta:{moduleName:"consul-ui/components/consul/logo/index.hbs"}}) -var n=Ember._setComponentTemplate(t,Ember._templateOnlyComponent()) -e.default=n})),define("consul-ui/components/consul/metadata/list/index",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const t=Ember.HTMLBars.template({id:"VbVHYYDc",block:'{"symbols":["item","index"],"statements":[[8,"tabular-collection",[[24,0,"consul-metadata-list"]],[["@items"],[[34,0]]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["header"]],[["default"],[{"statements":[[2,"\\n "],[10,"th"],[12],[2,"Key"],[13],[2,"\\n "],[10,"th"],[12],[2,"Value"],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["row"]],[["default"],[{"statements":[[2,"\\n "],[10,"td"],[12],[2,"\\n "],[10,"span"],[12],[2,"\\n "],[1,[30,[36,1],[0,[32,1]],null]],[2,"\\n "],[13],[2,"\\n "],[13],[2,"\\n "],[10,"td"],[12],[2,"\\n "],[10,"span"],[12],[1,[30,[36,1],[1,[32,1]],null]],[13],[2,"\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[1,2]}]]],[2,"\\n"]],"hasEval":false,"upvars":["items","object-at"]}',meta:{moduleName:"consul-ui/components/consul/metadata/list/index.hbs"}}) -var n=Ember._setComponentTemplate(t,Ember.Component.extend({tagName:""})) -e.default=n})),define("consul-ui/components/consul/node-identity/template/index",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const t=Ember.HTMLBars.template({id:"f1nRWNk1",block:'{"symbols":["@name","@partition"],"statements":[[6,[37,1],[[30,[36,0],["use partitions"],null]],null,[["default","else"],[{"statements":[[2,"partition \\""],[1,[30,[36,2],[[32,2],"default"],null]],[2,"\\" {\\n"],[6,[37,1],[[30,[36,0],["use nspaces"],null]],null,[["default","else"],[{"statements":[[2," namespace \\"default\\" {\\n node \\""],[1,[32,1]],[2,"\\" {\\n\\t policy = \\"write\\"\\n }\\n }\\n namespace_prefix \\"\\" {\\n service_prefix \\"\\" {\\n\\t policy = \\"read\\"\\n }\\n }\\n"]],"parameters":[]},{"statements":[[2," node \\""],[1,[32,1]],[2,"\\" {\\n\\t policy = \\"write\\"\\n }\\n service_prefix \\"\\" {\\n\\t policy = \\"read\\"\\n }\\n"]],"parameters":[]}]]],[2,"}"]],"parameters":[]},{"statements":[[6,[37,1],[[30,[36,0],["use nspaces"],null]],null,[["default","else"],[{"statements":[[2,"namespace \\"default\\" {\\n node \\""],[1,[32,1]],[2,"\\" {\\n\\t policy = \\"write\\"\\n }\\n}\\nnamespace_prefix \\"\\" {\\n service_prefix \\"\\" {\\n\\t policy = \\"read\\"\\n }\\n}\\n"]],"parameters":[]},{"statements":[[2,"node \\""],[1,[32,1]],[2,"\\" {\\n\\tpolicy = \\"write\\"\\n}\\nservice_prefix \\"\\" {\\n\\tpolicy = \\"read\\"\\n}"]],"parameters":[]}]]]],"parameters":[]}]]]],"hasEval":false,"upvars":["can","if","or"]}',meta:{moduleName:"consul-ui/components/consul/node-identity/template/index.hbs"}}) -var n=Ember._setComponentTemplate(t,Ember._templateOnlyComponent()) -e.default=n})),define("consul-ui/components/consul/node/list/index",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const t=Ember.HTMLBars.template({id:"mZ3vKiug",block:'{"symbols":["item","index","@items","@leader"],"statements":[[8,"list-collection",[[24,0,"consul-node-list"]],[["@items"],[[32,3]]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["header"]],[["default"],[{"statements":[[2,"\\n "],[10,"dl"],[15,0,[32,1,["Status"]]],[12],[2,"\\n "],[10,"dt"],[12],[2,"\\n Health\\n "],[13],[2,"\\n "],[10,"dd"],[12],[2,"\\n "],[8,"tooltip",[],[["@position"],["top-start"]],[["default"],[{"statements":[[2,"\\n"],[6,[37,1],[[30,[36,0],["critical",[32,1,["Status"]]],null]],null,[["default","else"],[{"statements":[[2," At least one health check on this node is failing.\\n"]],"parameters":[]},{"statements":[[6,[37,1],[[30,[36,0],["warning",[32,1,["Status"]]],null]],null,[["default","else"],[{"statements":[[2," At least one health check on this node has a warning.\\n"]],"parameters":[]},{"statements":[[6,[37,1],[[30,[36,0],["passing",[32,1,["Status"]]],null]],null,[["default","else"],[{"statements":[[2," All health checks are passing.\\n"]],"parameters":[]},{"statements":[[2," There are no health checks.\\n "]],"parameters":[]}]]]],"parameters":[]}]]]],"parameters":[]}]]],[2," "]],"parameters":[]}]]],[2,"\\n "],[13],[2,"\\n "],[13],[2,"\\n "],[10,"a"],[15,6,[30,[36,2],["dc.nodes.show",[32,1,["Node"]]],null]],[12],[2,"\\n "],[1,[32,1,["Node"]]],[2,"\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["details"]],[["default"],[{"statements":[[2,"\\n"],[6,[37,1],[[30,[36,0],[[32,1,["Address"]],[32,4,["Address"]]],null]],null,[["default"],[{"statements":[[2," "],[10,"span"],[14,0,"leader"],[12],[2,"Leader"],[13],[2,"\\n"]],"parameters":[]}]]],[2," "],[10,"span"],[12],[2,"\\n "],[1,[30,[36,3],[[32,1,["MeshServiceInstances","length"]]],null]],[2," "],[1,[30,[36,4],[[32,1,["MeshServiceInstances","length"]],"Service"],[["without-count"],[true]]]],[2,"\\n "],[13],[2,"\\n "],[10,"dl"],[12],[2,"\\n "],[10,"dt"],[12],[2,"\\n "],[10,"span"],[12],[2,"Address"],[13],[2,"\\n "],[13],[2,"\\n "],[10,"dd"],[12],[2,"\\n "],[8,"copy-button",[],[["@value","@name"],[[32,1,["Address"]],"Address"]],null],[2,"\\n "],[1,[32,1,["Address"]]],[2,"\\n "],[13],[2,"\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[1,2]}]]],[2,"\\n"]],"hasEval":false,"upvars":["eq","if","href-to","format-number","pluralize"]}',meta:{moduleName:"consul-ui/components/consul/node/list/index.hbs"}}) -var n=Ember._setComponentTemplate(t,Ember._templateOnlyComponent()) -e.default=n})),define("consul-ui/components/consul/node/search-bar/index",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const t=Ember.HTMLBars.template({id:"iOQYq0d+",block:'{"symbols":["__arg0","__arg1","search","components","Optgroup","Option","selectable","search","components","Optgroup","Option","state","search","components","Optgroup","Option","prop","search","key","value","@sort","@filter","@onsearch","@search","&attrs"],"statements":[[8,"search-bar",[[24,0,"consul-node-search-bar"],[17,25]],[["@filter","@namedBlocksInfo"],[[32,22],[30,[36,14],null,[["status","search","filter","sort"],[1,1,1,1]]]]],[["default"],[{"statements":[[6,[37,8],[[30,[36,7],[[32,1],"status"],null]],null,[["default","else"],[{"statements":[[6,[37,6],[[32,2]],null,[["default"],[{"statements":[[2,"\\n\\n"],[6,[37,6],[[30,[36,0],[[30,[36,10],["components.consul.node.search-bar.",[32,18,["status","key"]]],null]],[["default"],[[30,[36,4],[[30,[36,10],["common.search.",[32,18,["status","key"]]],null],[30,[36,10],["common.consul.",[32,18,["status","key"]]],null]],null]]]],[30,[36,0],[[30,[36,10],["components.consul.node.search-bar.",[32,18,["status","value"]]],null]],[["default"],[[30,[36,4],[[30,[36,10],["common.search.",[32,18,["status","value"]]],null],[30,[36,10],["common.consul.",[32,18,["status","value"]]],null],[30,[36,10],["common.brand.",[32,18,["status","value"]]],null]],null]]]]],null,[["default"],[{"statements":[[2," "],[8,[32,18,["RemoveFilter"]],[[16,"aria-label",[30,[36,0],["common.ui.remove"],[["item"],[[30,[36,10],[[32,19]," ",[32,20]],null]]]]]],[[],[]],[["default"],[{"statements":[[2,"\\n "],[10,"dl"],[12],[2,"\\n "],[10,"dt"],[12],[1,[32,19]],[13],[2,"\\n "],[10,"dd"],[12],[1,[32,20]],[13],[2,"\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[19,20]}]]],[2,"\\n "]],"parameters":[18]}]]]],"parameters":[]},{"statements":[[6,[37,8],[[30,[36,7],[[32,1],"search"],null]],null,[["default","else"],[{"statements":[[6,[37,6],[[32,2]],null,[["default"],[{"statements":[[2,"\\n "],[8,[32,13,["Search"]],[],[["@onsearch","@value","@placeholder"],[[30,[36,3],[[32,0],[32,23]],null],[32,24],[30,[36,0],["common.search.search"],null]]],[["default"],[{"statements":[[2,"\\n "],[8,[32,13,["Select"]],[[24,0,"type-search-properties"]],[["@position","@onchange","@multiple","@required"],["right",[30,[36,3],[[32,0],[32,22,["searchproperty","change"]]],null],true,true]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["selected"]],[["default"],[{"statements":[[2,"\\n "],[10,"span"],[12],[2,"\\n "],[1,[30,[36,0],["common.search.searchproperty"],null]],[2,"\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["options"]],[["default"],[{"statements":[[2,"\\n"],[6,[37,6],[[32,14,["Optgroup"]],[32,14,["Option"]]],null,[["default"],[{"statements":[[6,[37,12],[[30,[36,11],[[30,[36,11],[[32,22,["searchproperty","default"]]],null]],null]],null,[["default"],[{"statements":[[2," "],[8,[32,16],[],[["@value","@selected"],[[32,17],[30,[36,9],[[32,17],[32,22,["searchproperty","value"]]],null]]],[["default"],[{"statements":[[2,"\\n "],[1,[30,[36,0],[[30,[36,10],["common.consul.",[30,[36,13],[[32,17]],null]],null]],null]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[17]}]]]],"parameters":[15,16]}]]],[2," "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[14]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[13]}]]]],"parameters":[]},{"statements":[[6,[37,8],[[30,[36,7],[[32,1],"filter"],null]],null,[["default","else"],[{"statements":[[6,[37,6],[[32,2]],null,[["default"],[{"statements":[[2,"\\n "],[8,[32,8,["Select"]],[[24,0,"type-status"]],[["@position","@onchange","@multiple"],["left",[30,[36,3],[[32,0],[32,22,["status","change"]]],null],true]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["selected"]],[["default"],[{"statements":[[2,"\\n "],[10,"span"],[12],[2,"\\n "],[1,[30,[36,0],["common.consul.status"],null]],[2,"\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["options"]],[["default"],[{"statements":[[2,"\\n"],[6,[37,6],[[32,9,["Optgroup"]],[32,9,["Option"]]],null,[["default"],[{"statements":[[6,[37,12],[[30,[36,11],[[30,[36,11],[[30,[36,4],["passing","warning","critical"],null]],null]],null]],null,[["default"],[{"statements":[[2," "],[8,[32,11],[[16,0,[31,["value-",[32,12]]]]],[["@value","@selected"],[[32,12],[30,[36,9],[[32,12],[32,22,["status","value"]]],null]]],[["default"],[{"statements":[[2,"\\n "],[1,[30,[36,0],[[30,[36,10],["common.consul.",[32,12]],null]],[["default"],[[30,[36,4],[[30,[36,10],["common.search.",[32,12]],null]],null]]]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[12]}]]]],"parameters":[10,11]}]]],[2," "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[9]}]]],[2,"\\n "]],"parameters":[8]}]]]],"parameters":[]},{"statements":[[6,[37,8],[[30,[36,7],[[32,1],"sort"],null]],null,[["default"],[{"statements":[[6,[37,6],[[32,2]],null,[["default"],[{"statements":[[2,"\\n "],[8,[32,3,["Select"]],[[24,0,"type-sort"]],[["@position","@onchange","@multiple","@required"],["right",[30,[36,3],[[32,0],[32,21,["change"]]],null],false,true]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["selected"]],[["default"],[{"statements":[[2,"\\n "],[10,"span"],[12],[2,"\\n"],[6,[37,6],[[30,[36,5],[[30,[36,4],[[30,[36,4],["Node:asc",[30,[36,0],["common.sort.alpha.asc"],null]],null],[30,[36,4],["Node:desc",[30,[36,0],["common.sort.alpha.desc"],null]],null],[30,[36,4],["Status:asc",[30,[36,0],["common.sort.status.asc"],null]],null],[30,[36,4],["Status:desc",[30,[36,0],["common.sort.status.desc"],null]],null]],null]],null]],null,[["default"],[{"statements":[[2," "],[1,[30,[36,2],[[32,7],[32,21,["value"]]],null]],[2,"\\n"]],"parameters":[7]}]]],[2," "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["options"]],[["default"],[{"statements":[[2,"\\n"],[6,[37,6],[[32,4,["Optgroup"]],[32,4,["Option"]]],null,[["default"],[{"statements":[[2," "],[8,[32,5],[],[["@label"],[[30,[36,0],["common.consul.status"],null]]],[["default"],[{"statements":[[2,"\\n "],[8,[32,6],[],[["@value","@selected"],["Status:asc",[30,[36,1],["Status:asc",[32,21,["value"]]],null]]],[["default"],[{"statements":[[1,[30,[36,0],["common.sort.status.asc"],null]]],"parameters":[]}]]],[2,"\\n "],[8,[32,6],[],[["@value","@selected"],["Status:desc",[30,[36,1],["Status:desc",[32,21,["value"]]],null]]],[["default"],[{"statements":[[1,[30,[36,0],["common.sort.status.desc"],null]]],"parameters":[]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,[32,5],[],[["@label"],[[30,[36,0],["common.consul.node-name"],null]]],[["default"],[{"statements":[[2,"\\n "],[8,[32,6],[],[["@value","@selected"],["Node:asc",[30,[36,1],["Node:asc",[32,21,["value"]]],null]]],[["default"],[{"statements":[[1,[30,[36,0],["common.sort.alpha.asc"],null]]],"parameters":[]}]]],[2,"\\n "],[8,[32,6],[],[["@value","@selected"],["Node:desc",[30,[36,1],["Node:desc",[32,21,["value"]]],null]]],[["default"],[{"statements":[[1,[30,[36,0],["common.sort.alpha.desc"],null]]],"parameters":[]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[5,6]}]]],[2," "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[4]}]]],[2,"\\n "]],"parameters":[3]}]]]],"parameters":[]}]]]],"parameters":[]}]]]],"parameters":[]}]]]],"parameters":[]}]]]],"parameters":[1,2]}]]]],"hasEval":false,"upvars":["t","eq","get","action","array","from-entries","let","-is-named-block-invocation","if","contains","concat","-track-array","each","lowercase","hash"]}',meta:{moduleName:"consul-ui/components/consul/node/search-bar/index.hbs"}}) -var n=Ember._setComponentTemplate(t,Ember._templateOnlyComponent()) -e.default=n})),define("consul-ui/components/consul/nspace/form/index",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const t=Ember.HTMLBars.template({id:"2mV3xg0a",block:'{"symbols":["writer","readOnly","item","Name","Description","State","Guard","ChartAction","dispatch","state","execute","cancel","message","confirm","after","@dc","@partition","@onsubmit","@oncancel","&attrs","@item","@ondelete"],"statements":[[11,"div"],[24,0,"consul-nspace-form"],[17,20],[12],[2,"\\n "],[8,"data-writer",[],[["@sink","@type","@label","@ondelete","@onchange"],[[30,[36,12],["/${partition}/${nspace}/${dc}/nspace",[30,[36,9],null,[["partition","nspace","dc"],["","",[32,21,["Datacenter"]]]]]],null],"nspace","Namespace",[30,[36,0],[[30,[36,3],[[32,22],[32,22],[32,18]],null],[32,21]],null],[30,[36,0],[[30,[36,13],[[32,18]],null],[32,21]],null]]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["removed"]],[["default"],[{"statements":[[2,"\\n "],[8,"consul/nspace/notifications",[[4,[38,15],null,[["after"],[[30,[36,14],[[32,0],[32,15]],null]]]]],[["@type"],["remove"]],null],[2,"\\n "]],"parameters":[15]}]]],[2,"\\n\\n "],[8,"block-slot",[],[["@name"],["content"]],[["default"],[{"statements":[[2,"\\n\\n"],[6,[37,17],[[30,[36,8],[[30,[36,2],["write nspaces"],null]],null],[32,21],[30,[36,9],null,[["help","Name"],["Must be a valid DNS hostname. Must contain 1-64 characters (numbers, letters, and hyphens), and must begin with a letter. Once created, this cannot be changed.",[30,[36,16],[[30,[36,9],null,[["test","error"],["^[a-zA-Z0-9]([a-zA-Z0-9-]{0,62}[a-zA-Z0-9])?$","Name must be a valid DNS hostname."]]]],null]]]],[30,[36,9],null,[["Description"],[[30,[36,16],null,null]]]]],null,[["default"],[{"statements":[[11,"form"],[4,[38,1],["submit",[30,[36,0],[[32,1,["persist"]],[32,3]],null]],null],[4,[38,7],[[32,2]],null],[12],[2,"\\n\\n"],[8,"state-chart",[],[["@src"],[[30,[36,10],["validate"],null]]],[["default"],[{"statements":[[2,"\\n\\n "],[10,"fieldset"],[12],[2,"\\n"],[6,[37,3],[[30,[36,5],["new nspace"],[["item"],[[32,3]]]]],null,[["default"],[{"statements":[[2," "],[8,"text-input",[],[["@name","@placeholder","@item","@validations","@chart"],["Name","Name",[32,3],[32,4],[30,[36,9],null,[["state","dispatch"],[[32,10],[32,9]]]]]],null],[2,"\\n"]],"parameters":[]}]]],[2," "],[8,"text-input",[],[["@expanded","@name","@label","@item","@validations","@chart"],[true,"Description","Description (Optional)",[32,3],[32,5],[30,[36,9],null,[["state","dispatch"],[[32,10],[32,9]]]]]],null],[2,"\\n "],[13],[2,"\\n"],[6,[37,3],[[30,[36,2],["use acls"],null]],null,[["default"],[{"statements":[[2," "],[10,"fieldset"],[14,1,"roles"],[12],[2,"\\n "],[10,"h2"],[12],[2,"Roles"],[13],[2,"\\n "],[10,"p"],[12],[2,"\\n"],[6,[37,3],[[30,[36,2],["write nspace"],[["item"],[[32,3]]]]],null,[["default","else"],[{"statements":[[2," By adding roles to this namespaces, you will apply them to all tokens created within this namespace.\\n"]],"parameters":[]},{"statements":[[2," The following roles are applied to all tokens created within this namespace.\\n"]],"parameters":[]}]]],[2," "],[13],[2,"\\n "],[8,"role-selector",[],[["@dc","@nspace","@partition","@disabled","@items"],[[32,16],"default",[32,17],[32,2],[32,3,["ACLs","RoleDefaults"]]]],null],[2,"\\n "],[13],[2,"\\n "],[10,"fieldset"],[14,1,"policies"],[12],[2,"\\n "],[10,"h2"],[12],[2,"Policies"],[13],[2,"\\n "],[10,"p"],[12],[2,"\\n"],[6,[37,3],[[30,[36,8],[[32,2]],null]],null,[["default","else"],[{"statements":[[2," By adding policies to this namespace, you will apply them to all tokens created within this namespace.\\n"]],"parameters":[]},{"statements":[[2," The following policies are applied to all tokens created within this namespace.\\n"]],"parameters":[]}]]],[2," "],[13],[2,"\\n "],[8,"policy-selector",[],[["@dc","@nspace","@partition","@disabled","@allowIdentity","@items"],[[32,16],"default",[32,17],[32,2],false,[32,3,["ACLs","PolicyDefaults"]]]],null],[2,"\\n "],[13],[2,"\\n"]],"parameters":[]}]]],[2," "],[10,"div"],[12],[2,"\\n"],[6,[37,3],[[30,[36,11],[[30,[36,5],["new nspace"],[["item"],[[32,3]]]],[30,[36,2],["create nspaces"],null]],null]],null,[["default","else"],[{"statements":[[2," "],[8,"action",[[4,[38,7],[[30,[36,6],[[30,[36,5],["pristine nspace"],[["item"],[[32,3]]]],[30,[36,4],[[32,10],"error"],null]],null]],null]],[["@type"],["submit"]],[["default"],[{"statements":[[2,"\\n Save\\n "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[]},{"statements":[[6,[37,3],[[30,[36,2],["write nspace"],[["item"],[[32,3]]]]],null,[["default"],[{"statements":[[2," "],[8,"action",[],[["@type"],["submit"]],[["default"],[{"statements":[[2,"Save"]],"parameters":[]}]]],[2,"\\n"]],"parameters":[]}]]]],"parameters":[]}]]],[2,"\\n "],[8,"action",[[4,[38,1],["click",[30,[36,3],[[32,19],[30,[36,0],[[32,19],[32,3]],null],[30,[36,0],[[32,18],[32,3]],null]],null]],null]],[["@type"],["reset"]],[["default"],[{"statements":[[2,"\\n Cancel\\n "]],"parameters":[]}]]],[2,"\\n\\n"],[6,[37,3],[[30,[36,11],[[30,[36,8],[[30,[36,5],["new nspace"],[["item"],[[32,3]]]]],null],[30,[36,2],["delete nspace"],[["item"],[[32,3]]]]],null]],null,[["default"],[{"statements":[[2," "],[8,"confirmation-dialog",[],[["@message"],["Are you sure you want to delete this Namespace?"]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["action"]],[["default"],[{"statements":[[2,"\\n "],[8,"action",[[24,0,"type-delete"],[4,[38,1],["click",[30,[36,0],[[32,14],[30,[36,0],[[32,1,["delete"]],[32,3]],null]],null]],null]],[[],[]],[["default"],[{"statements":[[2,"\\n Delete\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[14]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["dialog"]],[["default"],[{"statements":[[2,"\\n "],[8,"delete-confirmation",[],[["@message","@execute","@cancel"],[[32,13],[32,11],[32,12]]],null],[2,"\\n "]],"parameters":[11,12,13]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[]}]]],[2,"\\n "],[13],[2,"\\n"]],"parameters":[6,7,8,9,10]}]]],[2,"\\n"],[13],[2,"\\n"]],"parameters":[2,3,4,5]}]]],[2," "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[1]}]]],[2,"\\n"],[13],[2,"\\n\\n"]],"hasEval":false,"upvars":["fn","on","can","if","state-matches","is","or","disabled","not","hash","state-chart","and","uri","optional","action","notification","array","let"]}',meta:{moduleName:"consul-ui/components/consul/nspace/form/index.hbs"}}) -var n=Ember._setComponentTemplate(t,Ember._templateOnlyComponent()) -e.default=n})),define("consul-ui/components/consul/nspace/list/index",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const t=Ember.HTMLBars.template({id:"dI19TXfs",block:'{"symbols":["item","Actions","Action","Confirmation","Confirm","@ondelete","&attrs","@items"],"statements":[[8,"list-collection",[[24,0,"consul-nspace-list"],[17,7]],[["@items","@linkable"],[[32,8],"linkable nspace"]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["header"]],[["default"],[{"statements":[[2,"\\n"],[6,[37,3],[[32,1,["DeletedAt"]]],null,[["default","else"],[{"statements":[[2," "],[10,"p"],[12],[2,"\\n Deleting "],[1,[32,1,["Name"]]],[2,"...\\n "],[13],[2,"\\n"]],"parameters":[]},{"statements":[[2," "],[10,"a"],[15,6,[30,[36,1],["dc.nspaces.edit",[32,1,["Name"]]],null]],[12],[1,[32,1,["Name"]]],[13],[2,"\\n"]],"parameters":[]}]]],[2," "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["details"]],[["default"],[{"statements":[[2,"\\n"],[6,[37,3],[[32,1,["Description"]]],null,[["default"],[{"statements":[[2," "],[10,"dl"],[12],[2,"\\n "],[10,"dt"],[12],[2,"Description"],[13],[2,"\\n "],[10,"dd"],[12],[2,"\\n "],[1,[32,1,["Description"]]],[2,"\\n "],[13],[2,"\\n "],[13],[2,"\\n"]],"parameters":[]}]]],[6,[37,3],[[30,[36,4],["CONSUL_ACLS_ENABLED"],null]],null,[["default"],[{"statements":[[2," "],[8,"consul/token/ruleset/list",[],[["@item"],[[32,1]]],null],[2,"\\n"]],"parameters":[]}]]],[2," "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["actions"]],[["default"],[{"statements":[[2,"\\n"],[6,[37,3],[[30,[36,5],[[32,1,["DeletedAt"]]],null]],null,[["default"],[{"statements":[[2," "],[8,[32,2],[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[8,[32,3],[],[["@href"],[[30,[36,1],["dc.nspaces.edit",[32,1,["Name"]]],null]]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["label"]],[["default"],[{"statements":[[2,"\\n"],[6,[37,3],[[30,[36,2],["write nspace"],[["item"],[[32,1]]]]],null,[["default","else"],[{"statements":[[2," Edit\\n"]],"parameters":[]},{"statements":[[2," View\\n"]],"parameters":[]}]]],[2," "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n"],[6,[37,3],[[30,[36,2],["delete nspace"],[["item"],[[32,1]]]]],null,[["default"],[{"statements":[[2," "],[8,[32,3],[[24,0,"dangerous"]],[["@onclick"],[[30,[36,0],[[32,0],[32,6],[32,1]],null]]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["label"]],[["default"],[{"statements":[[2,"\\n Delete\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["confirmation"]],[["default"],[{"statements":[[2,"\\n "],[8,[32,4],[[24,0,"warning"]],[[],[]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["header"]],[["default"],[{"statements":[[2,"\\n Confirm delete\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["body"]],[["default"],[{"statements":[[2,"\\n "],[10,"p"],[12],[2,"\\n Are you sure you want to delete this namespace?\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["confirm"]],[["default"],[{"statements":[[2,"\\n "],[8,[32,5],[],[[],[]],[["default"],[{"statements":[[2,"Delete"]],"parameters":[]}]]],[2,"\\n "]],"parameters":[5]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[4]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[]}]]],[2," "]],"parameters":[3]}]]],[2,"\\n"]],"parameters":[]}]]],[2," "]],"parameters":[2]}]]],[2,"\\n"]],"parameters":[1]}]]]],"hasEval":false,"upvars":["action","href-to","can","if","env","not"]}',meta:{moduleName:"consul-ui/components/consul/nspace/list/index.hbs"}}) -var n=Ember._setComponentTemplate(t,Ember._templateOnlyComponent()) -e.default=n})) -define("consul-ui/components/consul/nspace/notifications/index",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const t=Ember.HTMLBars.template({id:"LcZiH9cu",block:'{"symbols":["notice","&attrs","@type"],"statements":[[6,[37,1],[[30,[36,0],[[32,3],"remove"],null]],null,[["default"],[{"statements":[[2," "],[8,"notice",[[24,0,"notification-delete"],[17,2]],[["@type"],["success"]],[["default"],[{"statements":[[2,"\\n "],[8,[32,1,["Header"]],[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[10,"strong"],[12],[2,"Success!"],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,[32,1,["Body"]],[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[10,"p"],[12],[2,"\\n Your Namespace has been marked for deletion.\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[1]}]]],[2,"\\n"]],"parameters":[]}]]]],"hasEval":false,"upvars":["eq","if"]}',meta:{moduleName:"consul-ui/components/consul/nspace/notifications/index.hbs"}}) -var n=Ember._setComponentTemplate(t,Ember._templateOnlyComponent()) -e.default=n})),define("consul-ui/components/consul/nspace/search-bar/index",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const t=Ember.HTMLBars.template({id:"zG/SiimO",block:'{"symbols":["__arg0","__arg1","search","components","Optgroup","Option","selectable","search","components","Optgroup","Option","prop","search","key","value","@sort","@filter","@onsearch","@search","&attrs"],"statements":[[8,"search-bar",[[24,0,"consul-nspace-search-bar"],[17,20]],[["@filter","@namedBlocksInfo"],[[32,17],[30,[36,14],null,[["status","search","sort"],[1,1,1]]]]],[["default"],[{"statements":[[6,[37,8],[[30,[36,7],[[32,1],"status"],null]],null,[["default","else"],[{"statements":[[6,[37,6],[[32,2]],null,[["default"],[{"statements":[[2,"\\n\\n"],[6,[37,6],[[30,[36,0],[[30,[36,11],["components.consul.nspace.search-bar.",[32,13,["status","key"]]],null]],[["default"],[[30,[36,4],[[30,[36,11],["common.search.",[32,13,["status","key"]]],null],[30,[36,11],["common.consul.",[32,13,["status","key"]]],null]],null]]]],[30,[36,0],[[30,[36,11],["components.consul.nspace.search-bar.",[32,13,["status","value"]]],null]],[["default"],[[30,[36,4],[[30,[36,11],["common.search.",[32,13,["status","value"]]],null],[30,[36,11],["common.consul.",[32,13,["status","value"]]],null],[30,[36,11],["common.brand.",[32,13,["status","value"]]],null]],null]]]]],null,[["default"],[{"statements":[[2," "],[8,[32,13,["RemoveFilter"]],[[16,"aria-label",[30,[36,0],["common.ui.remove"],[["item"],[[30,[36,11],[[32,14]," ",[32,15]],null]]]]]],[[],[]],[["default"],[{"statements":[[2,"\\n "],[10,"dl"],[12],[2,"\\n "],[10,"dt"],[12],[1,[32,14]],[13],[2,"\\n "],[10,"dd"],[12],[1,[32,15]],[13],[2,"\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[14,15]}]]],[2,"\\n "]],"parameters":[13]}]]]],"parameters":[]},{"statements":[[6,[37,8],[[30,[36,7],[[32,1],"search"],null]],null,[["default","else"],[{"statements":[[6,[37,6],[[32,2]],null,[["default"],[{"statements":[[2,"\\n "],[8,[32,8,["Search"]],[],[["@onsearch","@value","@placeholder"],[[30,[36,3],[[32,0],[32,18]],null],[32,19],[30,[36,0],["common.search.search"],null]]],[["default"],[{"statements":[[2,"\\n "],[8,[32,8,["Select"]],[[24,0,"type-search-properties"]],[["@position","@onchange","@multiple","@required"],["right",[30,[36,3],[[32,0],[32,17,["searchproperty","change"]]],null],true,true]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["selected"]],[["default"],[{"statements":[[2,"\\n "],[10,"span"],[12],[2,"\\n "],[1,[30,[36,0],["common.search.searchproperty"],null]],[2,"\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["options"]],[["default"],[{"statements":[[2,"\\n"],[6,[37,6],[[32,9,["Optgroup"]],[32,9,["Option"]]],null,[["default"],[{"statements":[[6,[37,13],[[30,[36,12],[[30,[36,12],[[32,17,["searchproperty","default"]]],null]],null]],null,[["default"],[{"statements":[[2," "],[8,[32,11],[],[["@value","@selected"],[[32,12],[30,[36,9],[[32,12],[32,17,["searchproperty","value"]]],null]]],[["default"],[{"statements":[[2,"\\n "],[1,[30,[36,0],[[30,[36,11],["common.consul.",[30,[36,10],[[32,12]],null]],null]],null]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[12]}]]]],"parameters":[10,11]}]]],[2," "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[9]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[8]}]]]],"parameters":[]},{"statements":[[6,[37,8],[[30,[36,7],[[32,1],"sort"],null]],null,[["default"],[{"statements":[[6,[37,6],[[32,2]],null,[["default"],[{"statements":[[2,"\\n "],[8,[32,3,["Select"]],[[24,0,"type-sort"]],[["@position","@onchange","@multiple","@required"],["right",[30,[36,3],[[32,0],[32,16,["change"]]],null],false,true]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["selected"]],[["default"],[{"statements":[[2,"\\n "],[10,"span"],[12],[2,"\\n"],[6,[37,6],[[30,[36,5],[[30,[36,4],[[30,[36,4],["Name:asc",[30,[36,0],["common.sort.alpha.asc"],null]],null],[30,[36,4],["Name:desc",[30,[36,0],["common.sort.alpha.desc"],null]],null]],null]],null]],null,[["default"],[{"statements":[[2," "],[1,[30,[36,2],[[32,7],[32,16,["value"]]],null]],[2,"\\n"]],"parameters":[7]}]]],[2," "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["options"]],[["default"],[{"statements":[[2,"\\n"],[6,[37,6],[[32,4,["Optgroup"]],[32,4,["Option"]]],null,[["default"],[{"statements":[[2," "],[8,[32,5],[],[["@label"],[[30,[36,0],["common.consul.name"],null]]],[["default"],[{"statements":[[2,"\\n "],[8,[32,6],[],[["@value","@selected"],["Name:asc",[30,[36,1],["Name:asc",[32,16,["value"]]],null]]],[["default"],[{"statements":[[1,[30,[36,0],["common.sort.alpha.asc"],null]]],"parameters":[]}]]],[2,"\\n "],[8,[32,6],[],[["@value","@selected"],["Name:desc",[30,[36,1],["Name:desc",[32,16,["value"]]],null]]],[["default"],[{"statements":[[1,[30,[36,0],["common.sort.alpha.desc"],null]]],"parameters":[]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[5,6]}]]],[2," "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[4]}]]],[2,"\\n "]],"parameters":[3]}]]]],"parameters":[]}]]]],"parameters":[]}]]]],"parameters":[]}]]]],"parameters":[1,2]}]]]],"hasEval":false,"upvars":["t","eq","get","action","array","from-entries","let","-is-named-block-invocation","if","contains","lowercase","concat","-track-array","each","hash"]}',meta:{moduleName:"consul-ui/components/consul/nspace/search-bar/index.hbs"}}) -var n=Ember._setComponentTemplate(t,Ember._templateOnlyComponent()) -e.default=n})),define("consul-ui/components/consul/nspace/selector/index",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const t=Ember.HTMLBars.template({id:"M3okNSs+",block:'{"symbols":["nspace","isManaging","disclosure","panel","menu","item","@partition","@dc","@onchange","@nspaces","@nspace"],"statements":[[6,[37,4],[[30,[36,18],["use nspaces"],null]],null,[["default"],[{"statements":[[6,[37,4],[[30,[36,18],["choose nspaces"],null]],null,[["default"],[{"statements":[[6,[37,17],[[30,[36,3],[[32,11],"default"],null],[30,[36,16],["dc.nspaces",[32,8,["Name"]]],null]],null,[["default"],[{"statements":[[2," "],[10,"li"],[14,0,"nspaces"],[12],[2,"\\n "],[8,"disclosure-menu",[[24,"aria-label","Namespace"]],[["@items"],[[30,[36,13],[[30,[36,6],null,[["Name","href"],["Manage Namespaces",[30,[36,7],["dc.nspaces",[32,8,["Name"]]],null]]]],[30,[36,12],["DeletedAt",[32,10]],null]],null]]],[["default"],[{"statements":[[2,"\\n "],[8,[32,3,["Action"]],[[4,[38,8],["click",[32,3,["toggle"]]],null]],[[],[]],[["default"],[{"statements":[[2,"\\n "],[1,[30,[36,4],[[32,2],"Manage Namespaces",[32,1]],null]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,[32,3,["Menu"]],[],[[],[]],[["default"],[{"statements":[[2,"\\n"],[6,[37,4],[[30,[36,5],[[32,10,["length"]],0],null]],null,[["default","else"],[{"statements":[[2," "],[8,"data-source",[],[["@src","@onchange"],[[30,[36,9],["/${partition}/*/${dc}/namespaces",[30,[36,6],null,[["partition","dc"],[[32,7],[32,8,["Name"]]]]]],null],[30,[36,11],[[30,[36,10],[[32,9]],null]],null]]],null],[2,"\\n"]],"parameters":[]},{"statements":[[2," "],[8,"data-source",[],[["@src","@onchange"],[[30,[36,9],["/${partition}/*/${dc}/namespaces",[30,[36,6],null,[["partition","dc"],[[32,7],[32,8,["Name"]]]]]],null],[30,[36,11],[[30,[36,10],[[32,9]],null]],null]]],null],[2,"\\n"]],"parameters":[]}]]],[2," "],[8,[32,4,["Menu"]],[],[[],[]],[["default"],[{"statements":[[2,"\\n"],[6,[37,15],[[30,[36,14],[[30,[36,14],[[32,5,["items"]]],null]],null]],null,[["default"],[{"statements":[[2,"\\n "],[8,[32,5,["Item"]],[[16,"aria-current",[30,[36,4],[[30,[36,3],[[30,[36,2],[[32,2],[32,6,["href"]]],null],[30,[36,2],[[30,[36,1],[[32,2]],null],[30,[36,0],[[32,1],[32,6,["Name"]]],null]],null]],null],"true"],null]]],[[],[]],[["default"],[{"statements":[[2,"\\n "],[8,[32,5,["Action"]],[[4,[38,8],["click",[32,3,["close"]]],null]],[["@href"],[[30,[36,4],[[32,6,["href"]],[32,6,["href"]],[30,[36,4],[[32,2],[30,[36,7],["dc.services.index"],[["params"],[[30,[36,6],null,[["partition","nspace","dc"],[[30,[36,4],[[30,[36,5],[[32,7,["length"]],0],null],[32,7],[29]],null],[32,6,["Name"]],[32,8,["Name"]]]]]]]],[30,[36,7],["."],[["params"],[[30,[36,6],null,[["partition","nspace"],[[30,[36,4],[[30,[36,5],[[32,7,["length"]],0],null],[32,7],[29]],null],[32,6,["Name"]]]]]]]]],null]],null]]],[["default"],[{"statements":[[2,"\\n "],[1,[32,6,["Name"]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[6]}]]],[2," "]],"parameters":[5]}]]],[2,"\\n "]],"parameters":[4]}]]],[2,"\\n "]],"parameters":[3]}]]],[2,"\\n "],[13],[2,"\\n"]],"parameters":[1,2]}]]]],"parameters":[]}]]]],"parameters":[]}]]]],"hasEval":false,"upvars":["eq","not","and","or","if","gt","hash","href-to","on","uri","optional","fn","reject-by","append","-track-array","each","is-href","let","can"]}',meta:{moduleName:"consul-ui/components/consul/nspace/selector/index.hbs"}}) -var n=Ember._setComponentTemplate(t,Ember._templateOnlyComponent()) -e.default=n})),define("consul-ui/components/consul/partition/form/index",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const t=Ember.HTMLBars.template({id:"XmdLDsy0",block:'{"symbols":["writer","readOnly","item","Name","Description","State","Guard","ChartAction","dispatch","state","execute","cancel","message","confirm","after","@onsubmit","@oncancel","&attrs","@item","@ondelete"],"statements":[[11,"div"],[24,0,"consul-partition-form"],[17,18],[12],[2,"\\n "],[8,"data-writer",[],[["@sink","@type","@label","@ondelete","@onchange"],[[30,[36,12],["/${partition}/${nspace}/${dc}/partition",[30,[36,8],null,[["partition","nspace","dc"],["","",[32,19,["Datacenter"]]]]]],null],"partition","Partition",[30,[36,0],[[30,[36,3],[[32,20],[32,20],[32,16]],null],[32,19]],null],[30,[36,0],[[30,[36,13],[[32,16]],null],[32,19]],null]]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["removed"]],[["default"],[{"statements":[[2,"\\n "],[8,"consul/partition/notifications",[[4,[38,15],null,[["after"],[[30,[36,14],[[32,0],[32,15]],null]]]]],[["@type"],["remove"]],null],[2,"\\n "]],"parameters":[15]}]]],[2,"\\n\\n "],[8,"block-slot",[],[["@name"],["content"]],[["default"],[{"statements":[[2,"\\n\\n"],[6,[37,17],[[30,[36,2],[[30,[36,10],["write partition"],null]],null],[32,19],[30,[36,8],null,[["help","Name"],["Must be a valid DNS hostname. Must contain 1-64 characters (numbers, letters, and hyphens), and must begin with a letter. Once created, this cannot be changed.",[30,[36,16],[[30,[36,8],null,[["test","error"],["^[a-zA-Z0-9]([a-zA-Z0-9-]{0,62}[a-zA-Z0-9])?$","Name must be a valid DNS hostname."]]]],null]]]],[30,[36,8],null,[["Description"],[[30,[36,16],null,null]]]]],null,[["default"],[{"statements":[[11,"form"],[4,[38,1],["submit",[30,[36,0],[[32,1,["persist"]],[32,3]],null]],null],[4,[38,7],[[32,2]],null],[12],[2,"\\n\\n"],[8,"state-chart",[],[["@src"],[[30,[36,9],["validate"],null]]],[["default"],[{"statements":[[2,"\\n\\n "],[10,"fieldset"],[12],[2,"\\n"],[6,[37,3],[[30,[36,5],["new partition"],[["item"],[[32,3]]]]],null,[["default"],[{"statements":[[2," "],[8,"text-input",[],[["@name","@placeholder","@item","@validations","@chart"],["Name","Name",[32,3],[32,4],[30,[36,8],null,[["state","dispatch"],[[32,10],[32,9]]]]]],null],[2,"\\n"]],"parameters":[]}]]],[2," "],[8,"text-input",[],[["@expanded","@name","@label","@item","@validations","@chart"],[true,"Description","Description (Optional)",[32,3],[32,5],[30,[36,8],null,[["state","dispatch"],[[32,10],[32,9]]]]]],null],[2,"\\n "],[13],[2,"\\n\\n "],[10,"div"],[12],[2,"\\n"],[6,[37,3],[[30,[36,11],[[30,[36,5],["new partition"],[["item"],[[32,3]]]],[30,[36,10],["create partitions"],null]],null]],null,[["default","else"],[{"statements":[[2," "],[8,"action",[[4,[38,7],[[30,[36,6],[[30,[36,5],["pristine partition"],[["item"],[[32,3]]]],[30,[36,4],[[32,10],"error"],null]],null]],null]],[["@type"],["submit"]],[["default"],[{"statements":[[2,"\\n Save\\n "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[]},{"statements":[[6,[37,3],[[30,[36,2],[[32,2]],null]],null,[["default"],[{"statements":[[2," "],[8,"action",[],[["@type"],["submit"]],[["default"],[{"statements":[[2,"Save"]],"parameters":[]}]]],[2,"\\n"]],"parameters":[]}]]]],"parameters":[]}]]],[2,"\\n "],[8,"action",[[4,[38,1],["click",[30,[36,3],[[32,17],[30,[36,0],[[32,17],[32,3]],null],[30,[36,0],[[32,16],[32,3]],null]],null]],null]],[["@type"],["reset"]],[["default"],[{"statements":[[2,"\\n Cancel\\n "]],"parameters":[]}]]],[2,"\\n\\n"],[6,[37,3],[[30,[36,11],[[30,[36,2],[[30,[36,5],["new partition"],[["item"],[[32,3]]]]],null],[30,[36,10],["delete partition"],[["item"],[[32,3]]]]],null]],null,[["default"],[{"statements":[[2," "],[8,"confirmation-dialog",[],[["@message"],["Are you sure you want to delete this Partition?"]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["action"]],[["default"],[{"statements":[[2,"\\n "],[8,"action",[[24,0,"type-delete"],[4,[38,1],["click",[30,[36,0],[[32,14],[30,[36,0],[[32,1,["delete"]],[32,3]],null]],null]],null]],[[],[]],[["default"],[{"statements":[[2,"\\n Delete\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[14]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["dialog"]],[["default"],[{"statements":[[2,"\\n "],[8,"delete-confirmation",[],[["@message","@execute","@cancel"],[[32,13],[32,11],[32,12]]],null],[2,"\\n "]],"parameters":[11,12,13]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[]}]]],[2,"\\n "],[13],[2,"\\n\\n"]],"parameters":[6,7,8,9,10]}]]],[2,"\\n"],[13],[2,"\\n\\n"]],"parameters":[2,3,4,5]}]]],[2," "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[1]}]]],[2,"\\n"],[13],[2,"\\n"]],"hasEval":false,"upvars":["fn","on","not","if","state-matches","is","or","disabled","hash","state-chart","can","and","uri","optional","action","notification","array","let"]}',meta:{moduleName:"consul-ui/components/consul/partition/form/index.hbs"}}) -var n=Ember._setComponentTemplate(t,Ember._templateOnlyComponent()) -e.default=n})),define("consul-ui/components/consul/partition/list/index",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const t=Ember.HTMLBars.template({id:"r5hj3CrJ",block:'{"symbols":["item","Actions","Action","Confirmation","Confirm","@ondelete","&attrs","@items"],"statements":[[8,"list-collection",[[24,0,"consul-partition-list"],[17,7]],[["@items","@linkable"],[[32,8],"linkable partition"]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["header"]],[["default"],[{"statements":[[2,"\\n"],[6,[37,3],[[32,1,["DeletedAt"]]],null,[["default","else"],[{"statements":[[2," "],[10,"p"],[12],[2,"\\n Deleting "],[1,[32,1,["Name"]]],[2,"...\\n "],[13],[2,"\\n"]],"parameters":[]},{"statements":[[2," "],[10,"a"],[15,6,[30,[36,1],["dc.partitions.edit",[32,1,["Name"]]],null]],[12],[1,[32,1,["Name"]]],[13],[2,"\\n"]],"parameters":[]}]]],[2," "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["details"]],[["default"],[{"statements":[[2,"\\n"],[6,[37,3],[[32,1,["Description"]]],null,[["default"],[{"statements":[[2," "],[10,"dl"],[12],[2,"\\n "],[10,"dt"],[12],[2,"Description"],[13],[2,"\\n "],[10,"dd"],[12],[2,"\\n "],[1,[32,1,["Description"]]],[2,"\\n "],[13],[2,"\\n "],[13],[2,"\\n"]],"parameters":[]}]]],[2," "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["actions"]],[["default"],[{"statements":[[2,"\\n"],[6,[37,3],[[30,[36,4],[[32,1,["DeletedAt"]]],null]],null,[["default"],[{"statements":[[2," "],[8,[32,2],[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[8,[32,3],[],[["@href"],[[30,[36,1],["dc.partitions.edit",[32,1,["Name"]]],null]]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["label"]],[["default"],[{"statements":[[2,"\\n"],[6,[37,3],[[30,[36,2],["write partition"],[["item"],[[32,1]]]]],null,[["default","else"],[{"statements":[[2," Edit\\n"]],"parameters":[]},{"statements":[[2," View\\n"]],"parameters":[]}]]],[2," "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n"],[6,[37,3],[[30,[36,2],["delete partition"],[["item"],[[32,1]]]]],null,[["default"],[{"statements":[[2," "],[8,[32,3],[[24,0,"dangerous"]],[["@onclick"],[[30,[36,0],[[32,0],[32,6],[32,1]],null]]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["label"]],[["default"],[{"statements":[[2,"\\n Delete\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["confirmation"]],[["default"],[{"statements":[[2,"\\n "],[8,[32,4],[[24,0,"warning"]],[[],[]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["header"]],[["default"],[{"statements":[[2,"\\n Confirm delete\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["body"]],[["default"],[{"statements":[[2,"\\n "],[10,"p"],[12],[2,"\\n Are you sure you want to delete this partition?\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["confirm"]],[["default"],[{"statements":[[2,"\\n "],[8,[32,5],[],[[],[]],[["default"],[{"statements":[[2,"Delete"]],"parameters":[]}]]],[2,"\\n "]],"parameters":[5]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[4]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[]}]]],[2," "]],"parameters":[3]}]]],[2,"\\n"]],"parameters":[]}]]],[2," "]],"parameters":[2]}]]],[2,"\\n"]],"parameters":[1]}]]],[2,"\\n"]],"hasEval":false,"upvars":["action","href-to","can","if","not"]}',meta:{moduleName:"consul-ui/components/consul/partition/list/index.hbs"}}) -var n=Ember._setComponentTemplate(t,Ember._templateOnlyComponent()) -e.default=n})),define("consul-ui/components/consul/partition/notifications/index",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const t=Ember.HTMLBars.template({id:"0ydQ0+/V",block:'{"symbols":["notice","&attrs","@type"],"statements":[[6,[37,1],[[30,[36,0],[[32,3],"remove"],null]],null,[["default"],[{"statements":[[2," "],[8,"notice",[[24,0,"notification-delete"],[17,2]],[["@type"],["success"]],[["default"],[{"statements":[[2,"\\n "],[8,[32,1,["Header"]],[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[10,"strong"],[12],[2,"Success!"],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,[32,1,["Body"]],[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[10,"p"],[12],[2,"\\n Your Partition has been marked for deletion.\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[1]}]]],[2,"\\n"]],"parameters":[]}]]]],"hasEval":false,"upvars":["eq","if"]}',meta:{moduleName:"consul-ui/components/consul/partition/notifications/index.hbs"}}) -var n=Ember._setComponentTemplate(t,Ember._templateOnlyComponent()) -e.default=n})),define("consul-ui/components/consul/partition/search-bar/index",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const t=Ember.HTMLBars.template({id:"0zDAbGxg",block:'{"symbols":["__arg0","__arg1","search","components","Optgroup","Option","selectable","search","components","Optgroup","Option","prop","search","key","value","@sort","@filter","@onsearch","@search","&attrs"],"statements":[[8,"search-bar",[[24,0,"consul-partition-search-bar"],[17,20]],[["@filter","@namedBlocksInfo"],[[32,17],[30,[36,14],null,[["status","search","sort"],[1,1,1]]]]],[["default"],[{"statements":[[6,[37,8],[[30,[36,7],[[32,1],"status"],null]],null,[["default","else"],[{"statements":[[6,[37,6],[[32,2]],null,[["default"],[{"statements":[[2,"\\n\\n"],[6,[37,6],[[30,[36,0],[[30,[36,11],["components.consul.nspace.search-bar.",[32,13,["status","key"]]],null]],[["default"],[[30,[36,4],[[30,[36,11],["common.search.",[32,13,["status","key"]]],null],[30,[36,11],["common.consul.",[32,13,["status","key"]]],null]],null]]]],[30,[36,0],[[30,[36,11],["components.consul.nspace.search-bar.",[32,13,["status","value"]]],null]],[["default"],[[30,[36,4],[[30,[36,11],["common.search.",[32,13,["status","value"]]],null],[30,[36,11],["common.consul.",[32,13,["status","value"]]],null],[30,[36,11],["common.brand.",[32,13,["status","value"]]],null]],null]]]]],null,[["default"],[{"statements":[[2," "],[8,[32,13,["RemoveFilter"]],[[16,"aria-label",[30,[36,0],["common.ui.remove"],[["item"],[[30,[36,11],[[32,14]," ",[32,15]],null]]]]]],[[],[]],[["default"],[{"statements":[[2,"\\n "],[10,"dl"],[12],[2,"\\n "],[10,"dt"],[12],[1,[32,14]],[13],[2,"\\n "],[10,"dd"],[12],[1,[32,15]],[13],[2,"\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[14,15]}]]],[2,"\\n "]],"parameters":[13]}]]]],"parameters":[]},{"statements":[[6,[37,8],[[30,[36,7],[[32,1],"search"],null]],null,[["default","else"],[{"statements":[[6,[37,6],[[32,2]],null,[["default"],[{"statements":[[2,"\\n "],[8,[32,8,["Search"]],[],[["@onsearch","@value","@placeholder"],[[30,[36,3],[[32,0],[32,18]],null],[32,19],[30,[36,0],["common.search.search"],null]]],[["default"],[{"statements":[[2,"\\n "],[8,[32,8,["Select"]],[[24,0,"type-search-properties"]],[["@position","@onchange","@multiple","@required"],["right",[30,[36,3],[[32,0],[32,17,["searchproperty","change"]]],null],true,true]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["selected"]],[["default"],[{"statements":[[2,"\\n "],[10,"span"],[12],[2,"\\n "],[1,[30,[36,0],["common.search.searchproperty"],null]],[2,"\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["options"]],[["default"],[{"statements":[[2,"\\n"],[6,[37,6],[[32,9,["Optgroup"]],[32,9,["Option"]]],null,[["default"],[{"statements":[[6,[37,13],[[30,[36,12],[[30,[36,12],[[32,17,["searchproperty","default"]]],null]],null]],null,[["default"],[{"statements":[[2," "],[8,[32,11],[],[["@value","@selected"],[[32,12],[30,[36,9],[[32,12],[32,17,["searchproperty","value"]]],null]]],[["default"],[{"statements":[[2,"\\n "],[1,[30,[36,0],[[30,[36,11],["common.consul.",[30,[36,10],[[32,12]],null]],null]],null]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[12]}]]]],"parameters":[10,11]}]]],[2," "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[9]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[8]}]]]],"parameters":[]},{"statements":[[6,[37,8],[[30,[36,7],[[32,1],"sort"],null]],null,[["default"],[{"statements":[[6,[37,6],[[32,2]],null,[["default"],[{"statements":[[2,"\\n "],[8,[32,3,["Select"]],[[24,0,"type-sort"]],[["@position","@onchange","@multiple","@required"],["right",[30,[36,3],[[32,0],[32,16,["change"]]],null],false,true]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["selected"]],[["default"],[{"statements":[[2,"\\n "],[10,"span"],[12],[2,"\\n"],[6,[37,6],[[30,[36,5],[[30,[36,4],[[30,[36,4],["Name:asc",[30,[36,0],["common.sort.alpha.asc"],null]],null],[30,[36,4],["Name:desc",[30,[36,0],["common.sort.alpha.desc"],null]],null]],null]],null]],null,[["default"],[{"statements":[[2," "],[1,[30,[36,2],[[32,7],[32,16,["value"]]],null]],[2,"\\n"]],"parameters":[7]}]]],[2," "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["options"]],[["default"],[{"statements":[[2,"\\n"],[6,[37,6],[[32,4,["Optgroup"]],[32,4,["Option"]]],null,[["default"],[{"statements":[[2," "],[8,[32,5],[],[["@label"],[[30,[36,0],["common.consul.name"],null]]],[["default"],[{"statements":[[2,"\\n "],[8,[32,6],[],[["@value","@selected"],["Name:asc",[30,[36,1],["Name:asc",[32,16,["value"]]],null]]],[["default"],[{"statements":[[1,[30,[36,0],["common.sort.alpha.asc"],null]]],"parameters":[]}]]],[2,"\\n "],[8,[32,6],[],[["@value","@selected"],["Name:desc",[30,[36,1],["Name:desc",[32,16,["value"]]],null]]],[["default"],[{"statements":[[1,[30,[36,0],["common.sort.alpha.desc"],null]]],"parameters":[]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[5,6]}]]],[2," "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[4]}]]],[2,"\\n "]],"parameters":[3]}]]]],"parameters":[]}]]]],"parameters":[]}]]]],"parameters":[]}]]]],"parameters":[1,2]}]]]],"hasEval":false,"upvars":["t","eq","get","action","array","from-entries","let","-is-named-block-invocation","if","contains","lowercase","concat","-track-array","each","hash"]}',meta:{moduleName:"consul-ui/components/consul/partition/search-bar/index.hbs"}}) -var n=Ember._setComponentTemplate(t,Ember._templateOnlyComponent()) -e.default=n})),define("consul-ui/components/consul/partition/selector/index",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const t=Ember.HTMLBars.template({id:"AZQPTZYS",block:'{"symbols":["partition","isManaging","disclosure","panel","menu","item","@dc","@partitions","@onchange","@partition"],"statements":[[6,[37,17],[[30,[36,3],[[32,10],"default"],null],[30,[36,16],["dc.partitions",[32,7,["Name"]]],null]],null,[["default"],[{"statements":[[6,[37,4],[[30,[36,15],["choose partitions"],[["dc"],[[32,7]]]]],null,[["default","else"],[{"statements":[[2," "],[10,"li"],[14,0,"partitions"],[12],[2,"\\n "],[8,"disclosure-menu",[[24,"aria-label","Admin Partition"]],[["@items"],[[30,[36,9],[[30,[36,5],null,[["Name","href"],["Manage Partitions",[30,[36,6],["dc.partitions",[32,7,["Name"]]],null]]]],[30,[36,8],["DeletedAt",[32,8]],null]],null]]],[["default"],[{"statements":[[2,"\\n "],[8,[32,3,["Action"]],[[4,[38,7],["click",[32,3,["toggle"]]],null]],[[],[]],[["default"],[{"statements":[[2,"\\n "],[1,[30,[36,4],[[32,2],"Manage Partition",[32,1]],null]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,[32,3,["Menu"]],[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[8,"data-source",[],[["@src","@onchange"],[[30,[36,10],["/*/*/${dc}/partitions",[30,[36,5],null,[["dc"],[[32,7,["Name"]]]]]],null],[30,[36,12],[[30,[36,11],[[32,9]],null]],null]]],null],[2,"\\n "],[8,[32,4,["Menu"]],[],[[],[]],[["default"],[{"statements":[[2,"\\n"],[6,[37,14],[[30,[36,13],[[30,[36,13],[[32,5,["items"]]],null]],null]],null,[["default"],[{"statements":[[2," "],[8,[32,5,["Item"]],[[16,"aria-current",[30,[36,4],[[30,[36,3],[[30,[36,2],[[32,2],[32,6,["href"]]],null],[30,[36,2],[[30,[36,1],[[32,2]],null],[30,[36,0],[[32,1],[32,6,["Name"]]],null]],null]],null],"true"],null]]],[[],[]],[["default"],[{"statements":[[2,"\\n "],[8,[32,5,["Action"]],[[4,[38,7],["click",[32,3,["close"]]],null]],[["@href"],[[30,[36,4],[[32,6,["href"]],[32,6,["href"]],[30,[36,4],[[32,2],[30,[36,6],["dc.services.index"],[["params"],[[30,[36,5],null,[["partition","nspace","dc"],[[32,6,["Name"]],[29],[32,7,["Name"]]]]]]]],[30,[36,6],["."],[["params"],[[30,[36,5],null,[["partition","nspace"],[[32,6,["Name"]],[29]]]]]]]],null]],null]]],[["default"],[{"statements":[[2,"\\n "],[1,[32,6,["Name"]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[6]}]]],[2," "]],"parameters":[5]}]]],[2,"\\n "]],"parameters":[4]}]]],[2,"\\n "]],"parameters":[3]}]]],[2,"\\n "],[13],[2,"\\n"]],"parameters":[]},{"statements":[[2," "],[10,"li"],[14,0,"partition"],[14,"aria-label","Admin Partition"],[12],[2,"\\n "],[1,"default"],[2,"\\n "],[13],[2,"\\n"]],"parameters":[]}]]]],"parameters":[1,2]}]]]],"hasEval":false,"upvars":["eq","not","and","or","if","hash","href-to","on","reject-by","append","uri","optional","fn","-track-array","each","can","is-href","let"]}',meta:{moduleName:"consul-ui/components/consul/partition/selector/index.hbs"}}) -var n=Ember._setComponentTemplate(t,Ember._templateOnlyComponent()) -e.default=n})),define("consul-ui/components/consul/policy/list/index",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const t=Ember.HTMLBars.template({id:"UDg6I3Xb",block:'{"symbols":["item","Actions","Action","Confirmation","Confirm","@ondelete","@items"],"statements":[[8,"list-collection",[[24,0,"consul-policy-list"]],[["@items"],[[32,7]]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["header"]],[["default"],[{"statements":[[2,"\\n"],[6,[37,3],[[30,[36,2],[[30,[36,1],[[32,1]],null],"policy-management"],null]],null,[["default"],[{"statements":[[2," "],[10,"dl"],[14,0,"policy-management"],[12],[2,"\\n "],[10,"dt"],[12],[2,"Type"],[13],[2,"\\n "],[10,"dd"],[12],[2,"\\n "],[8,"tooltip",[],[[],[]],[["default"],[{"statements":[[2,"\\n Global Management Policy\\n "]],"parameters":[]}]]],[2,"\\n "],[13],[2,"\\n "],[13],[2,"\\n"]],"parameters":[]}]]],[2," "],[10,"a"],[15,6,[30,[36,4],["dc.acls.policies.edit",[32,1,["ID"]]],null]],[15,0,[30,[36,3],[[30,[36,2],[[30,[36,1],[[32,1]],null],"policy-management"],null],"is-management"],null]],[12],[1,[32,1,["Name"]]],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["details"]],[["default"],[{"statements":[[2,"\\n "],[10,"dl"],[14,0,"datacenter"],[12],[2,"\\n "],[10,"dt"],[12],[2,"\\n "],[8,"tooltip",[],[[],[]],[["default"],[{"statements":[[2,"Datacenters"]],"parameters":[]}]]],[2,"\\n "],[13],[2,"\\n "],[10,"dd"],[12],[2,"\\n "],[1,[30,[36,6],[", ",[30,[36,5],[[32,1]],null]],null]],[2,"\\n "],[13],[2,"\\n "],[13],[2,"\\n "],[10,"dl"],[14,0,"description"],[12],[2,"\\n "],[10,"dt"],[12],[2,"Description"],[13],[2,"\\n "],[10,"dd"],[12],[2,"\\n "],[1,[32,1,["Description"]]],[2,"\\n "],[13],[2,"\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["actions"]],[["default"],[{"statements":[[2,"\\n "],[8,[32,2],[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[8,[32,3],[],[["@href"],[[30,[36,4],["dc.acls.policies.edit",[32,1,["ID"]]],null]]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["label"]],[["default"],[{"statements":[[2,"\\n"],[6,[37,3],[[30,[36,7],["write policy"],[["item"],[[32,1]]]]],null,[["default","else"],[{"statements":[[2," Edit\\n"]],"parameters":[]},{"statements":[[2," View\\n"]],"parameters":[]}]]],[2," "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n"],[6,[37,3],[[30,[36,7],["delete policy"],[["item"],[[32,1]]]]],null,[["default"],[{"statements":[[2," "],[8,[32,3],[[24,0,"dangerous"]],[["@onclick"],[[30,[36,0],[[32,0],[32,6],[32,1]],null]]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["label"]],[["default"],[{"statements":[[2,"\\n Delete\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["confirmation"]],[["default"],[{"statements":[[2,"\\n "],[8,[32,4],[[24,0,"warning"]],[[],[]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["header"]],[["default"],[{"statements":[[2,"\\n Confirm delete\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["body"]],[["default"],[{"statements":[[2,"\\n "],[10,"p"],[12],[2,"\\n Are you sure you want to delete this policy?\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["confirm"]],[["default"],[{"statements":[[2,"\\n "],[8,[32,5],[],[[],[]],[["default"],[{"statements":[[2,"Delete"]],"parameters":[]}]]],[2,"\\n "]],"parameters":[5]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[4]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[]}]]],[2," "]],"parameters":[3]}]]],[2,"\\n "]],"parameters":[2]}]]],[2,"\\n"]],"parameters":[1]}]]]],"hasEval":false,"upvars":["action","policy/typeof","eq","if","href-to","policy/datacenters","join","can"]}',meta:{moduleName:"consul-ui/components/consul/policy/list/index.hbs"}}) -var n=Ember._setComponentTemplate(t,Ember._templateOnlyComponent()) -e.default=n})),define("consul-ui/components/consul/policy/notifications/index",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const t=Ember.HTMLBars.template({id:"rB0yLURE",block:'{"symbols":["error","@status","@type","@error"],"statements":[[6,[37,1],[[30,[36,2],[[32,3],"create"],null]],null,[["default","else"],[{"statements":[[6,[37,1],[[30,[36,2],[[32,2],"success"],null]],null,[["default","else"],[{"statements":[[2," Your policy has been added.\\n"]],"parameters":[]},{"statements":[[2," There was an error adding your policy.\\n"]],"parameters":[]}]]]],"parameters":[]},{"statements":[[6,[37,1],[[30,[36,2],[[32,3],"update"],null]],null,[["default","else"],[{"statements":[[6,[37,1],[[30,[36,2],[[32,2],"success"],null]],null,[["default","else"],[{"statements":[[2," Your policy has been saved.\\n"]],"parameters":[]},{"statements":[[2," There was an error saving your policy.\\n"]],"parameters":[]}]]]],"parameters":[]},{"statements":[[6,[37,1],[[30,[36,2],[[32,3],"delete"],null]],null,[["default"],[{"statements":[[6,[37,1],[[30,[36,2],[[32,2],"success"],null]],null,[["default","else"],[{"statements":[[2," Your policy was deleted.\\n"]],"parameters":[]},{"statements":[[2," There was an error deleting your policy.\\n"]],"parameters":[]}]]]],"parameters":[]}]]]],"parameters":[]}]]]],"parameters":[]}]]],[6,[37,3],[[32,4,["errors","firstObject"]]],null,[["default"],[{"statements":[[6,[37,1],[[32,1,["detail"]]],null,[["default"],[{"statements":[[2," "],[10,"br"],[12],[13],[1,[30,[36,0],["(",[30,[36,1],[[32,1,["status"]],[30,[36,0],[[32,1,["status"]],": "],null]],null],[32,1,["detail"]],")"],null]],[2,"\\n"]],"parameters":[]}]]]],"parameters":[1]}]]]],"hasEval":false,"upvars":["concat","if","eq","let"]}',meta:{moduleName:"consul-ui/components/consul/policy/notifications/index.hbs"}}) -var n=Ember._setComponentTemplate(t,Ember._templateOnlyComponent()) -e.default=n})),define("consul-ui/components/consul/policy/search-bar/index",["exports","@glimmer/component"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const n=Ember.HTMLBars.template({id:"v58RpJPi",block:'{"symbols":["__arg0","__arg1","search","components","Optgroup","Option","selectable","search","components","Optgroup","Option","state","components","Optgroup","Option","dc","search","components","Optgroup","Option","prop","search","key","value","@sort","@filter","@partition","@onsearch","@search","&attrs"],"statements":[[8,"search-bar",[[24,0,"consul-policy-search-bar"],[17,30]],[["@filter","@namedBlocksInfo"],[[32,26],[30,[36,14],null,[["status","search","filter","sort"],[1,1,1,1]]]]],[["default"],[{"statements":[[6,[37,8],[[30,[36,7],[[32,1],"status"],null]],null,[["default","else"],[{"statements":[[6,[37,6],[[32,2]],null,[["default"],[{"statements":[[2,"\\n\\n"],[6,[37,6],[[30,[36,0],[[30,[36,10],["components.consul.policy.search-bar.",[32,22,["status","key"]],".name"],null]],[["default"],[[30,[36,4],[[30,[36,10],["common.search.",[32,22,["status","key"]]],null],[30,[36,10],["common.consul.",[32,22,["status","key"]]],null]],null]]]],[30,[36,0],[[30,[36,10],["components.consul.policy.search-bar.",[32,22,["status","key"]],".options.",[32,22,["status","value"]]],null]],[["default"],[[30,[36,4],[[30,[36,10],["common.search.",[32,22,["status","value"]]],null],[30,[36,10],["common.consul.",[32,22,["status","value"]]],null],[30,[36,10],["common.brand.",[32,22,["status","value"]]],null]],null]]]]],null,[["default"],[{"statements":[[2," "],[8,[32,22,["RemoveFilter"]],[[16,"aria-label",[30,[36,0],["common.ui.remove"],[["item"],[[30,[36,10],[[32,23]," ",[32,24]],null]]]]]],[[],[]],[["default"],[{"statements":[[2,"\\n "],[10,"dl"],[12],[2,"\\n "],[10,"dt"],[12],[1,[32,23]],[13],[2,"\\n "],[10,"dd"],[12],[1,[30,[36,8],[[30,[36,1],[[32,22,["status","key"]],"datacenter"],null],[32,22,["status","value"]],[32,24]],null]],[13],[2,"\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[23,24]}]]],[2,"\\n "]],"parameters":[22]}]]]],"parameters":[]},{"statements":[[6,[37,8],[[30,[36,7],[[32,1],"search"],null]],null,[["default","else"],[{"statements":[[6,[37,6],[[32,2]],null,[["default"],[{"statements":[[2,"\\n "],[8,[32,17,["Search"]],[],[["@onsearch","@value","@placeholder"],[[30,[36,3],[[32,0],[32,28]],null],[32,29],[30,[36,0],["common.search.search"],null]]],[["default"],[{"statements":[[2,"\\n "],[8,[32,17,["Select"]],[[24,0,"type-search-properties"]],[["@position","@onchange","@multiple","@required"],["right",[30,[36,3],[[32,0],[32,26,["searchproperty","change"]]],null],true,true]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["selected"]],[["default"],[{"statements":[[2,"\\n "],[10,"span"],[12],[2,"\\n "],[1,[30,[36,0],["common.search.searchproperty"],null]],[2,"\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["options"]],[["default"],[{"statements":[[2,"\\n"],[6,[37,6],[[32,18,["Optgroup"]],[32,18,["Option"]]],null,[["default"],[{"statements":[[6,[37,12],[[30,[36,11],[[30,[36,11],[[32,26,["searchproperty","default"]]],null]],null]],null,[["default"],[{"statements":[[2," "],[8,[32,20],[],[["@value","@selected"],[[32,21],[30,[36,9],[[32,21],[32,26,["searchproperty","value"]]],null]]],[["default"],[{"statements":[[2,"\\n "],[1,[30,[36,0],[[30,[36,10],["common.consul.",[30,[36,17],[[32,21]],null]],null]],null]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[21]}]]]],"parameters":[19,20]}]]],[2," "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[18]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[17]}]]]],"parameters":[]},{"statements":[[6,[37,8],[[30,[36,7],[[32,1],"filter"],null]],null,[["default","else"],[{"statements":[[6,[37,6],[[32,2]],null,[["default"],[{"statements":[[2,"\\n "],[8,[32,8,["Select"]],[[24,0,"type-datacenter"]],[["@position","@onchange","@multiple"],["left",[30,[36,3],[[32,0],[32,26,["datacenter","change"]]],null],true]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["selected"]],[["default"],[{"statements":[[2,"\\n "],[10,"span"],[12],[2,"\\n "],[1,[30,[36,0],["common.consul.datacenter"],null]],[2,"\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["options"]],[["default"],[{"statements":[[2,"\\n"],[6,[37,6],[[32,13,["Optgroup"]],[32,13,["Option"]]],null,[["default"],[{"statements":[[6,[37,12],[[30,[36,11],[[30,[36,11],[[35,13]],null]],null]],null,[["default"],[{"statements":[[2," "],[8,[32,15],[],[["@value","@selected"],[[32,16,["Name"]],[30,[36,9],[[32,16,["Name"]],[32,26,["datacenter","value"]]],null]]],[["default"],[{"statements":[[1,[32,16,["Name"]]]],"parameters":[]}]]],[2,"\\n"]],"parameters":[16]}]]],[2," "],[8,"data-source",[],[["@src","@loading","@onchange"],[[30,[36,15],["/${partition}/*/*/datacenters",[30,[36,14],null,[["partition"],[[32,27]]]]],null],"lazy",[30,[36,3],[[32,0],[30,[36,16],[[32,0,["dcs"]]],null]],[["value"],["data"]]]]],null],[2,"\\n"]],"parameters":[14,15]}]]],[2," "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[13]}]]],[2,"\\n "],[8,[32,8,["Select"]],[[24,0,"type-kind"]],[["@position","@onchange","@multiple"],["left",[30,[36,3],[[32,0],[32,26,["kind","change"]]],null],true]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["selected"]],[["default"],[{"statements":[[2,"\\n "],[10,"span"],[12],[2,"\\n "],[1,[30,[36,0],["components.consul.policy.search-bar.kind.name"],null]],[2,"\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["options"]],[["default"],[{"statements":[[2,"\\n"],[6,[37,6],[[32,9,["Optgroup"]],[32,9,["Option"]]],null,[["default"],[{"statements":[[6,[37,12],[[30,[36,11],[[30,[36,11],[[30,[36,4],["global-management","standard"],null]],null]],null]],null,[["default"],[{"statements":[[2," "],[8,[32,11],[[16,0,[31,["value-",[32,12]]]]],[["@value","@selected"],[[32,12],[30,[36,9],[[32,12],[32,26,["kind","value"]]],null]]],[["default"],[{"statements":[[2,"\\n "],[1,[30,[36,0],[[30,[36,10],["components.consul.policy.search-bar.kind.options.",[32,12]],null]],[["default"],[[30,[36,4],[[30,[36,10],["common.search.",[32,12]],null]],null]]]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[12]}]]]],"parameters":[10,11]}]]],[2," "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[9]}]]],[2,"\\n "]],"parameters":[8]}]]]],"parameters":[]},{"statements":[[6,[37,8],[[30,[36,7],[[32,1],"sort"],null]],null,[["default"],[{"statements":[[6,[37,6],[[32,2]],null,[["default"],[{"statements":[[2,"\\n "],[8,[32,3,["Select"]],[[24,0,"type-sort"]],[["@position","@onchange","@multiple","@required"],["right",[30,[36,3],[[32,0],[32,25,["change"]]],null],false,true]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["selected"]],[["default"],[{"statements":[[2,"\\n "],[10,"span"],[12],[2,"\\n"],[6,[37,6],[[30,[36,5],[[30,[36,4],[[30,[36,4],["Name:asc",[30,[36,0],["common.sort.alpha.asc"],null]],null],[30,[36,4],["Name:desc",[30,[36,0],["common.sort.alpha.desc"],null]],null]],null]],null]],null,[["default"],[{"statements":[[2," "],[1,[30,[36,2],[[32,7],[32,25,["value"]]],null]],[2,"\\n"]],"parameters":[7]}]]],[2," "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["options"]],[["default"],[{"statements":[[2,"\\n"],[6,[37,6],[[32,4,["Optgroup"]],[32,4,["Option"]]],null,[["default"],[{"statements":[[2," "],[8,[32,5],[],[["@label"],[[30,[36,0],["common.ui.name"],null]]],[["default"],[{"statements":[[2,"\\n "],[8,[32,6],[],[["@value","@selected"],["Name:asc",[30,[36,1],["Name:asc",[32,25,["value"]]],null]]],[["default"],[{"statements":[[1,[30,[36,0],["common.sort.alpha.asc"],null]]],"parameters":[]}]]],[2,"\\n "],[8,[32,6],[],[["@value","@selected"],["Name:desc",[30,[36,1],["Name:desc",[32,25,["value"]]],null]]],[["default"],[{"statements":[[1,[30,[36,0],["common.sort.alpha.desc"],null]]],"parameters":[]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[5,6]}]]],[2," "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[4]}]]],[2,"\\n "]],"parameters":[3]}]]]],"parameters":[]}]]]],"parameters":[]}]]]],"parameters":[]}]]]],"parameters":[]}]]]],"parameters":[1,2]}]]],[2,"\\n"]],"hasEval":false,"upvars":["t","eq","get","action","array","from-entries","let","-is-named-block-invocation","if","contains","concat","-track-array","each","dcs","hash","uri","mut","lowercase"]}',meta:{moduleName:"consul-ui/components/consul/policy/search-bar/index.hbs"}}) -class r extends t.default{}e.default=r,Ember._setComponentTemplate(n,r)})),define("consul-ui/components/consul/role/list/index",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const t=Ember.HTMLBars.template({id:"qgd++x7w",block:'{"symbols":["item","Actions","Action","Confirmation","Confirm","@ondelete","&attrs","@items"],"statements":[[8,"list-collection",[[24,0,"consul-role-list"],[17,7]],[["@items"],[[32,8]]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["header"]],[["default"],[{"statements":[[2,"\\n "],[10,"a"],[15,6,[30,[36,1],["dc.acls.roles.edit",[32,1,["ID"]]],null]],[12],[1,[32,1,["Name"]]],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["details"]],[["default"],[{"statements":[[2,"\\n "],[8,"consul/token/ruleset/list",[],[["@item"],[[32,1]]],null],[2,"\\n "],[10,"dl"],[12],[2,"\\n "],[10,"dt"],[12],[2,"Description"],[13],[2,"\\n "],[10,"dd"],[12],[2,"\\n "],[1,[32,1,["Description"]]],[2,"\\n "],[13],[2,"\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["actions"]],[["default"],[{"statements":[[2,"\\n "],[8,[32,2],[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[8,[32,3],[],[["@href"],[[30,[36,1],["dc.acls.roles.edit",[32,1,["ID"]]],null]]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["label"]],[["default"],[{"statements":[[2,"\\n"],[6,[37,3],[[30,[36,2],["write role"],[["item"],[[32,1]]]]],null,[["default","else"],[{"statements":[[2," Edit\\n"]],"parameters":[]},{"statements":[[2," View\\n"]],"parameters":[]}]]],[2," "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n"],[6,[37,3],[[30,[36,2],["delete role"],[["item"],[[32,1]]]]],null,[["default"],[{"statements":[[2," "],[8,[32,3],[[24,0,"dangerous"]],[["@onclick"],[[30,[36,0],[[32,0],[32,6],[32,1]],null]]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["label"]],[["default"],[{"statements":[[2,"\\n Delete\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["confirmation"]],[["default"],[{"statements":[[2,"\\n "],[8,[32,4],[[24,0,"warning"]],[[],[]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["header"]],[["default"],[{"statements":[[2,"\\n Confirm delete\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["body"]],[["default"],[{"statements":[[2,"\\n "],[10,"p"],[12],[2,"\\n Are you sure you want to delete this role?\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["confirm"]],[["default"],[{"statements":[[2,"\\n "],[8,[32,5],[],[[],[]],[["default"],[{"statements":[[2,"Delete"]],"parameters":[]}]]],[2,"\\n "]],"parameters":[5]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[4]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[]}]]],[2," "]],"parameters":[3]}]]],[2,"\\n "]],"parameters":[2]}]]],[2,"\\n"]],"parameters":[1]}]]]],"hasEval":false,"upvars":["action","href-to","can","if"]}',meta:{moduleName:"consul-ui/components/consul/role/list/index.hbs"}}) -var n=Ember._setComponentTemplate(t,Ember._templateOnlyComponent()) -e.default=n})),define("consul-ui/components/consul/role/notifications/index",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const t=Ember.HTMLBars.template({id:"pmI3em2e",block:'{"symbols":["error","@status","@type","@error"],"statements":[[6,[37,1],[[30,[36,2],[[32,3],"create"],null]],null,[["default","else"],[{"statements":[[6,[37,1],[[30,[36,2],[[32,2],"success"],null]],null,[["default","else"],[{"statements":[[2," Your role has been added.\\n"]],"parameters":[]},{"statements":[[2," There was an error adding your role.\\n"]],"parameters":[]}]]]],"parameters":[]},{"statements":[[6,[37,1],[[30,[36,2],[[32,3],"update"],null]],null,[["default","else"],[{"statements":[[6,[37,1],[[30,[36,2],[[32,2],"success"],null]],null,[["default","else"],[{"statements":[[2," Your role has been saved.\\n"]],"parameters":[]},{"statements":[[2," There was an error saving your role.\\n"]],"parameters":[]}]]]],"parameters":[]},{"statements":[[6,[37,1],[[30,[36,2],[[32,3],"delete"],null]],null,[["default"],[{"statements":[[6,[37,1],[[30,[36,2],[[32,2],"success"],null]],null,[["default","else"],[{"statements":[[2," Your role was deleted.\\n"]],"parameters":[]},{"statements":[[2," There was an error deleting your role.\\n"]],"parameters":[]}]]]],"parameters":[]}]]]],"parameters":[]}]]]],"parameters":[]}]]],[6,[37,3],[[32,4,["errors","firstObject"]]],null,[["default"],[{"statements":[[6,[37,1],[[32,1,["detail"]]],null,[["default"],[{"statements":[[2," "],[10,"br"],[12],[13],[1,[30,[36,0],["(",[30,[36,1],[[32,1,["status"]],[30,[36,0],[[32,1,["status"]],": "],null]],null],[32,1,["detail"]],")"],null]],[2,"\\n"]],"parameters":[]}]]]],"parameters":[1]}]]]],"hasEval":false,"upvars":["concat","if","eq","let"]}',meta:{moduleName:"consul-ui/components/consul/role/notifications/index.hbs"}}) -var n=Ember._setComponentTemplate(t,Ember._templateOnlyComponent()) -e.default=n})),define("consul-ui/components/consul/role/search-bar/index",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const t=Ember.HTMLBars.template({id:"wPLJBG1T",block:'{"symbols":["__arg0","__arg1","search","components","Optgroup","Option","selectable","search","components","Optgroup","Option","prop","search","key","value","@sort","@filter","@onsearch","@search","&attrs"],"statements":[[8,"search-bar",[[24,0,"consul-role-search-bar"],[17,20]],[["@filter","@namedBlocksInfo"],[[32,17],[30,[36,14],null,[["status","search","sort"],[1,1,1]]]]],[["default"],[{"statements":[[6,[37,8],[[30,[36,7],[[32,1],"status"],null]],null,[["default","else"],[{"statements":[[6,[37,6],[[32,2]],null,[["default"],[{"statements":[[2,"\\n\\n"],[6,[37,6],[[30,[36,0],[[30,[36,11],["components.consul.role.search-bar.",[32,13,["status","key"]],".name"],null]],[["default"],[[30,[36,4],[[30,[36,11],["common.search.",[32,13,["status","key"]]],null],[30,[36,11],["common.consul.",[32,13,["status","key"]]],null]],null]]]],[30,[36,0],[[30,[36,11],["components.consul.role.search-bar.",[32,13,["status","key"]],".options.",[32,13,["status","value"]]],null]],[["default"],[[30,[36,4],[[30,[36,11],["common.search.",[32,13,["status","value"]]],null],[30,[36,11],["common.consul.",[32,13,["status","value"]]],null],[30,[36,11],["common.brand.",[32,13,["status","value"]]],null]],null]]]]],null,[["default"],[{"statements":[[2," "],[8,[32,13,["RemoveFilter"]],[[16,"aria-label",[30,[36,0],["common.ui.remove"],[["item"],[[30,[36,11],[[32,14]," ",[32,15]],null]]]]]],[[],[]],[["default"],[{"statements":[[2,"\\n "],[10,"dl"],[12],[2,"\\n "],[10,"dt"],[12],[1,[32,14]],[13],[2,"\\n "],[10,"dd"],[12],[1,[32,15]],[13],[2,"\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[14,15]}]]],[2,"\\n "]],"parameters":[13]}]]]],"parameters":[]},{"statements":[[6,[37,8],[[30,[36,7],[[32,1],"search"],null]],null,[["default","else"],[{"statements":[[6,[37,6],[[32,2]],null,[["default"],[{"statements":[[2,"\\n "],[8,[32,8,["Search"]],[],[["@onsearch","@value","@placeholder"],[[30,[36,3],[[32,0],[32,18]],null],[32,19],[30,[36,0],["common.search.search"],null]]],[["default"],[{"statements":[[2,"\\n "],[8,[32,8,["Select"]],[[24,0,"type-search-properties"]],[["@position","@onchange","@multiple","@required"],["right",[30,[36,3],[[32,0],[32,17,["searchproperty","change"]]],null],true,true]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["selected"]],[["default"],[{"statements":[[2,"\\n "],[10,"span"],[12],[2,"\\n "],[1,[30,[36,0],["common.search.searchproperty"],null]],[2,"\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["options"]],[["default"],[{"statements":[[2,"\\n"],[6,[37,6],[[32,9,["Optgroup"]],[32,9,["Option"]]],null,[["default"],[{"statements":[[6,[37,13],[[30,[36,12],[[30,[36,12],[[32,17,["searchproperty","default"]]],null]],null]],null,[["default"],[{"statements":[[2," "],[8,[32,11],[],[["@value","@selected"],[[32,12],[30,[36,9],[[32,12],[32,17,["searchproperty","value"]]],null]]],[["default"],[{"statements":[[2,"\\n "],[1,[30,[36,0],[[30,[36,11],["common.consul.",[30,[36,10],[[32,12]],null]],null]],null]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[12]}]]]],"parameters":[10,11]}]]],[2," "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[9]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[8]}]]]],"parameters":[]},{"statements":[[6,[37,8],[[30,[36,7],[[32,1],"sort"],null]],null,[["default"],[{"statements":[[6,[37,6],[[32,2]],null,[["default"],[{"statements":[[2,"\\n "],[8,[32,3,["Select"]],[[24,0,"type-sort"]],[["@position","@onchange","@multiple","@required"],["right",[30,[36,3],[[32,0],[32,16,["change"]]],null],false,true]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["selected"]],[["default"],[{"statements":[[2,"\\n "],[10,"span"],[12],[2,"\\n"],[6,[37,6],[[30,[36,5],[[30,[36,4],[[30,[36,4],["Name:asc",[30,[36,0],["common.sort.alpha.asc"],null]],null],[30,[36,4],["Name:desc",[30,[36,0],["common.sort.alpha.desc"],null]],null],[30,[36,4],["CreateIndex:desc",[30,[36,0],["common.sort.age.desc"],null]],null],[30,[36,4],["CreateIndex:asc",[30,[36,0],["common.sort.age.asc"],null]],null]],null]],null]],null,[["default"],[{"statements":[[2," "],[1,[30,[36,2],[[32,7],[32,16,["value"]]],null]],[2,"\\n"]],"parameters":[7]}]]],[2," "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["options"]],[["default"],[{"statements":[[2,"\\n"],[6,[37,6],[[32,4,["Optgroup"]],[32,4,["Option"]]],null,[["default"],[{"statements":[[2," "],[8,[32,5],[],[["@label"],[[30,[36,0],["common.ui.name"],null]]],[["default"],[{"statements":[[2,"\\n "],[8,[32,6],[],[["@value","@selected"],["Name:asc",[30,[36,1],["Name:asc",[32,16,["value"]]],null]]],[["default"],[{"statements":[[1,[30,[36,0],["common.sort.alpha.asc"],null]]],"parameters":[]}]]],[2,"\\n "],[8,[32,6],[],[["@value","@selected"],["Name:desc",[30,[36,1],["Name:desc",[32,16,["value"]]],null]]],[["default"],[{"statements":[[1,[30,[36,0],["common.sort.alpha.desc"],null]]],"parameters":[]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,[32,5],[],[["@label"],[[30,[36,0],["common.ui.creation"],null]]],[["default"],[{"statements":[[2,"\\n "],[8,[32,6],[],[["@value","@selected"],["CreateIndex:desc",[30,[36,1],["CreateIndex:desc",[32,16,["value"]]],null]]],[["default"],[{"statements":[[1,[30,[36,0],["common.sort.age.desc"],null]]],"parameters":[]}]]],[2,"\\n "],[8,[32,6],[],[["@value","@selected"],["CreateIndex:asc",[30,[36,1],["CreateIndex:asc",[32,16,["value"]]],null]]],[["default"],[{"statements":[[1,[30,[36,0],["common.sort.age.asc"],null]]],"parameters":[]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[5,6]}]]],[2," "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[4]}]]],[2,"\\n "]],"parameters":[3]}]]]],"parameters":[]}]]]],"parameters":[]}]]]],"parameters":[]}]]]],"parameters":[1,2]}]]],[2,"\\n"]],"hasEval":false,"upvars":["t","eq","get","action","array","from-entries","let","-is-named-block-invocation","if","contains","lowercase","concat","-track-array","each","hash"]}',meta:{moduleName:"consul-ui/components/consul/role/search-bar/index.hbs"}}) -var n=Ember._setComponentTemplate(t,Ember._templateOnlyComponent()) -e.default=n})),define("consul-ui/components/consul/server/card/index",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const t=Ember.HTMLBars.template({id:"Ec5kcuWa",block:'{"symbols":["@item","&attrs"],"statements":[[11,"div"],[16,0,[30,[36,6],["consul-server-card",[30,[36,0],["voting-status-leader",[30,[36,3],[[32,1,["Status"]],"leader"],null]],null],[30,[36,0],["voting-status-voter",[30,[36,5],[[30,[36,4],[[32,1,["ReadReplica"]]],null],[30,[36,3],[[32,1,["Status"]],"voter"],null]],null]],null],[30,[36,0],["voting-status-non-voter",[30,[36,2],[[32,1,["ReadReplica"]],[30,[36,1],[[32,1,["Status"]],[30,[36,0],["non-voter","staging"],null]],null]],null]],null]],null]],[17,2],[12],[2,"\\n "],[10,"dl"],[12],[2,"\\n\\n "],[11,"dt"],[24,0,"name"],[4,[38,7],["Leader"],null],[12],[2,"\\n "],[13],[2,"\\n "],[10,"dd"],[12],[2,"\\n "],[1,[32,1,["Name"]]],[2,"\\n "],[13],[2,"\\n\\n "],[10,"dt"],[15,0,[30,[36,6],["health-status",[30,[36,0],["healthy",[32,1,["Healthy"]]],null]],null]],[12],[2,"\\n Status\\n "],[13],[2,"\\n "],[10,"dd"],[12],[2,"\\n "],[1,[30,[36,8],[[30,[36,1],[[32,1,["Status"]],[30,[36,0],["leader","voter"],null]],null],"Active voter","Backup voter"],null]],[2,"\\n "],[13],[2,"\\n\\n "],[13],[2,"\\n"],[13],[2,"\\n\\n"]],"hasEval":false,"upvars":["array","contains","or","eq","not","and","class-map","tooltip","if"]}',meta:{moduleName:"consul-ui/components/consul/server/card/index.hbs"}}) -var n=Ember._setComponentTemplate(t,Ember._templateOnlyComponent()) -e.default=n})),define("consul-ui/components/consul/server/list/index",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const t=Ember.HTMLBars.template({id:"sOHjodBR",block:'{"symbols":["item","&attrs","@items"],"statements":[[11,"div"],[16,0,[30,[36,1],["consul-server-list"],null]],[17,2],[12],[2,"\\n "],[10,"ul"],[12],[2,"\\n"],[6,[37,3],[[30,[36,2],[[30,[36,2],[[32,3]],null]],null]],null,[["default"],[{"statements":[[2," "],[10,"li"],[12],[2,"\\n "],[10,"a"],[15,6,[30,[36,0],["dc.nodes.show",[32,1,["Name"]]],null]],[12],[2,"\\n "],[8,"consul/server/card",[],[["@item"],[[32,1]]],null],[2,"\\n "],[13],[2,"\\n "],[13],[2,"\\n"]],"parameters":[1]}]]],[2," "],[13],[2,"\\n"],[13],[2,"\\n\\n"]],"hasEval":false,"upvars":["href-to","class-map","-track-array","each"]}',meta:{moduleName:"consul-ui/components/consul/server/list/index.hbs"}}) -var n=Ember._setComponentTemplate(t,Ember._templateOnlyComponent()) -e.default=n})),define("consul-ui/components/consul/service-identity/template/index",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const t=Ember.HTMLBars.template({id:"spWJOarV",block:'{"symbols":["@name","@nspace","@partition"],"statements":[[6,[37,2],[[30,[36,1],["use partitions"],null]],null,[["default","else"],[{"statements":[[2,"partition \\""],[1,[30,[36,0],[[32,3],"default"],null]],[2,"\\" {\\n"],[6,[37,2],[[30,[36,1],["use nspaces"],null]],null,[["default","else"],[{"statements":[[2," namespace \\""],[1,[30,[36,0],[[32,2],"default"],null]],[2,"\\" {\\n service \\""],[1,[32,1]],[2,"\\" {\\n\\t policy = \\"write\\"\\n }\\n service \\""],[1,[32,1]],[2,"-sidecar-proxy\\" {\\n\\t policy = \\"write\\"\\n }\\n service_prefix \\"\\" {\\n\\t policy = \\"read\\"\\n }\\n node_prefix \\"\\" {\\n\\t policy = \\"read\\"\\n }\\n }\\n"]],"parameters":[]},{"statements":[[2," service \\""],[1,[32,1]],[2,"\\" {\\n\\t policy = \\"write\\"\\n }\\n service \\""],[1,[32,1]],[2,"-sidecar-proxy\\" {\\n\\t policy = \\"write\\"\\n }\\n service_prefix \\"\\" {\\n\\t policy = \\"read\\"\\n }\\n node_prefix \\"\\" {\\n\\t policy = \\"read\\"\\n }\\n"]],"parameters":[]}]]],[2,"}\\n"]],"parameters":[]},{"statements":[[6,[37,2],[[30,[36,1],["use nspaces"],null]],null,[["default","else"],[{"statements":[[2,"namespace \\""],[1,[30,[36,0],[[32,2],"default"],null]],[2,"\\" {\\n service \\""],[1,[32,1]],[2,"\\" {\\n\\t policy = \\"write\\"\\n }\\n service \\""],[1,[32,1]],[2,"-sidecar-proxy\\" {\\n\\t policy = \\"write\\"\\n }\\n service_prefix \\"\\" {\\n\\t policy = \\"read\\"\\n }\\n node_prefix \\"\\" {\\n\\t policy = \\"read\\"\\n }\\n}\\n"]],"parameters":[]},{"statements":[[2,"service \\""],[1,[32,1]],[2,"\\" {\\n\\tpolicy = \\"write\\"\\n}\\nservice \\""],[1,[32,1]],[2,"-sidecar-proxy\\" {\\n\\tpolicy = \\"write\\"\\n}\\nservice_prefix \\"\\" {\\n\\tpolicy = \\"read\\"\\n}\\nnode_prefix \\"\\" {\\n\\tpolicy = \\"read\\"\\n}\\n"]],"parameters":[]}]]]],"parameters":[]}]]]],"hasEval":false,"upvars":["or","can","if"]}',meta:{moduleName:"consul-ui/components/consul/service-identity/template/index.hbs"}}) -var n=Ember._setComponentTemplate(t,Ember._templateOnlyComponent()) -e.default=n})),define("consul-ui/components/consul/service-instance/list/index",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const t=Ember.HTMLBars.template({id:"AAaMSxui",block:'{"symbols":["proxies","item","index","proxy","checks","@node","@routeName","&attrs","@items","@proxies"],"statements":[[6,[37,10],[[30,[36,13],[[32,10],"Service.Proxy.DestinationServiceID"],null]],null,[["default"],[{"statements":[[8,"list-collection",[[24,0,"consul-service-instance-list"],[17,8]],[["@items"],[[32,9]]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["header"]],[["default"],[{"statements":[[2,"\\n"],[6,[37,1],[[30,[36,11],[[32,7],"dc.services.show"],null]],null,[["default","else"],[{"statements":[[2," "],[10,"a"],[15,6,[30,[36,3],[[32,7],[32,2,["Service","Service"]]],null]],[12],[2,"\\n "],[1,[32,2,["Service","ID"]]],[2,"\\n "],[13],[2,"\\n"]],"parameters":[]},{"statements":[[2," "],[10,"a"],[15,6,[30,[36,3],[[32,7],[32,2,["Service","Service"]],[32,2,["Node","Node"]],[30,[36,8],[[32,2,["Service","ID"]],[32,2,["Service","Service"]]],null]],null]],[12],[2,"\\n "],[1,[32,2,["Service","ID"]]],[2,"\\n "],[13],[2,"\\n"]],"parameters":[]}]]],[2," "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["details"]],[["default"],[{"statements":[[2,"\\n\\n"],[6,[37,10],[[30,[36,12],[[32,1],[32,2,["Service","ID"]]],null]],null,[["default"],[{"statements":[[6,[37,10],[[30,[36,9],[[30,[36,7],[[32,2,["Checks"]],[30,[36,8],[[32,4,["Checks"]],[30,[36,7],null,null]],null]],null]],null]],null,[["default"],[{"statements":[[2,"\\n"],[6,[37,1],[[32,6]],null,[["default","else"],[{"statements":[[2," "],[8,"consul/external-source",[],[["@item"],[[32,2,["Service"]]]],null],[2,"\\n "],[8,"consul/instance-checks",[],[["@type","@items"],["service",[30,[36,4],["ServiceID","",[32,5]],null]]],null],[2,"\\n"]],"parameters":[]},{"statements":[[2," "],[8,"consul/external-source",[],[["@item"],[[32,2,["Service"]]]],null],[2,"\\n\\n "],[8,"consul/instance-checks",[],[["@type","@items"],["service",[30,[36,4],["ServiceID","",[32,5]],null]]],null],[2,"\\n "],[8,"consul/instance-checks",[],[["@type","@items"],["node",[30,[36,5],["ServiceID","",[32,5]],null]]],null],[2,"\\n"]],"parameters":[]}]]],[6,[37,1],[[32,4]],null,[["default"],[{"statements":[[2," "],[10,"dl"],[14,0,"mesh"],[12],[2,"\\n "],[10,"dt"],[12],[2,"\\n "],[8,"tooltip",[],[[],[]],[["default"],[{"statements":[[2,"\\n This service uses a proxy for the Consul service mesh\\n "]],"parameters":[]}]]],[2,"\\n "],[13],[2,"\\n "],[10,"dd"],[12],[2,"\\n in service mesh with proxy\\n "],[13],[2,"\\n "],[13],[2,"\\n"]],"parameters":[]}]]],[6,[37,1],[[30,[36,6],[[32,6]],null]],null,[["default"],[{"statements":[[2," "],[10,"dl"],[14,0,"node"],[12],[2,"\\n "],[10,"dt"],[12],[2,"\\n "],[8,"tooltip",[],[[],[]],[["default"],[{"statements":[[2,"\\n Node\\n "]],"parameters":[]}]]],[2,"\\n "],[13],[2,"\\n "],[10,"dd"],[12],[2,"\\n "],[10,"a"],[15,6,[30,[36,3],["dc.nodes.show",[32,2,["Node","Node"]]],null]],[12],[1,[32,2,["Node","Node"]]],[13],[2,"\\n "],[13],[2,"\\n "],[13],[2,"\\n"]],"parameters":[]}]]],[6,[37,1],[[32,2,["Service","Port"]]],null,[["default","else"],[{"statements":[[2," "],[10,"dl"],[14,0,"address"],[12],[2,"\\n "],[10,"dt"],[12],[2,"\\n "],[8,"tooltip",[],[[],[]],[["default"],[{"statements":[[2,"\\n IP Address and Port\\n "]],"parameters":[]}]]],[2,"\\n "],[13],[2,"\\n "],[10,"dd"],[12],[2,"\\n"],[6,[37,1],[[30,[36,2],[[32,2,["Service","Address"]],""],null]],null,[["default","else"],[{"statements":[[2," "],[1,[32,2,["Service","Address"]]],[2,":"],[1,[32,2,["Service","Port"]]],[2,"\\n"]],"parameters":[]},{"statements":[[2," "],[1,[32,2,["Node","Address"]]],[2,":"],[1,[32,2,["Service","Port"]]],[2,"\\n"]],"parameters":[]}]]],[2," "],[13],[2,"\\n "],[13],[2,"\\n"]],"parameters":[]},{"statements":[[6,[37,1],[[32,2,["Service","SocketPath"]]],null,[["default"],[{"statements":[[2," "],[10,"dl"],[14,0,"socket"],[12],[2,"\\n "],[11,"dt"],[4,[38,0],null,null],[12],[2,"\\n Socket Path\\n "],[13],[2,"\\n "],[10,"dd"],[12],[2,"\\n "],[1,[32,2,["Service","SocketPath"]]],[2,"\\n "],[13],[2,"\\n "],[13],[2,"\\n"]],"parameters":[]}]]]],"parameters":[]}]]],[2," "],[8,"tag-list",[],[["@item"],[[32,2,["Service"]]]],null],[2,"\\n\\n"]],"parameters":[5]}]]]],"parameters":[4]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[2,3]}]]],[2,"\\n"]],"parameters":[1]}]]]],"hasEval":false,"upvars":["tooltip","if","not-eq","href-to","filter-by","reject-by","not","array","or","merge-checks","let","eq","get","to-hash"]}',meta:{moduleName:"consul-ui/components/consul/service-instance/list/index.hbs"}}) -var n=Ember._setComponentTemplate(t,Ember._templateOnlyComponent()) -e.default=n})),define("consul-ui/components/consul/service-instance/search-bar/index",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const t=Ember.HTMLBars.template({id:"kLJwzL+X",block:'{"symbols":["__arg0","__arg1","search","components","Optgroup","Option","selectable","search","components","Optgroup","Option","source","components","Optgroup","Option","state","search","components","Optgroup","Option","prop","search","key","value","@sort","@filter","@sources","@onsearch","@search","&attrs"],"statements":[[8,"search-bar",[[24,0,"consul-service-instance-search-bar"],[17,30]],[["@filter","@namedBlocksInfo"],[[32,26],[30,[36,15],null,[["status","search","filter","sort"],[1,1,1,1]]]]],[["default"],[{"statements":[[6,[37,8],[[30,[36,7],[[32,1],"status"],null]],null,[["default","else"],[{"statements":[[6,[37,6],[[32,2]],null,[["default"],[{"statements":[[2,"\\n\\n"],[6,[37,6],[[30,[36,0],[[30,[36,10],["components.consul.service-instance.search-bar.",[32,22,["status","key"]],".name"],null]],[["default"],[[30,[36,4],[[30,[36,10],["common.search.",[32,22,["status","key"]]],null],[30,[36,10],["common.consul.",[32,22,["status","key"]]],null]],null]]]],[30,[36,0],[[30,[36,10],["components.consul.service-instance.search-bar.",[32,22,["status","key"]],".options.",[32,22,["status","value"]]],null]],[["default"],[[30,[36,4],[[30,[36,10],["common.search.",[32,22,["status","value"]]],null],[30,[36,10],["common.consul.",[32,22,["status","value"]]],null],[30,[36,10],["common.brand.",[32,22,["status","value"]]],null]],null]]]]],null,[["default"],[{"statements":[[2," "],[8,[32,22,["RemoveFilter"]],[[16,"aria-label",[30,[36,0],["common.ui.remove"],[["item"],[[30,[36,10],[[32,23]," ",[32,24]],null]]]]]],[[],[]],[["default"],[{"statements":[[2,"\\n "],[10,"dl"],[12],[2,"\\n "],[10,"dt"],[12],[1,[32,23]],[13],[2,"\\n "],[10,"dd"],[12],[1,[32,24]],[13],[2,"\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[23,24]}]]],[2,"\\n "]],"parameters":[22]}]]]],"parameters":[]},{"statements":[[6,[37,8],[[30,[36,7],[[32,1],"search"],null]],null,[["default","else"],[{"statements":[[6,[37,6],[[32,2]],null,[["default"],[{"statements":[[2,"\\n "],[8,[32,17,["Search"]],[],[["@onsearch","@value","@placeholder"],[[30,[36,3],[[32,0],[32,28]],null],[32,29],[30,[36,0],["common.search.search"],null]]],[["default"],[{"statements":[[2,"\\n"],[6,[37,8],[[32,26,["searchproperty"]]],null,[["default"],[{"statements":[[2," "],[8,[32,17,["Select"]],[[24,0,"type-search-properties"]],[["@position","@onchange","@multiple","@required"],["right",[30,[36,3],[[32,0],[32,26,["searchproperty","change"]]],null],true,true]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["selected"]],[["default"],[{"statements":[[2,"\\n "],[10,"span"],[12],[2,"\\n "],[1,[30,[36,0],["common.search.searchproperty"],null]],[2,"\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["options"]],[["default"],[{"statements":[[2,"\\n"],[6,[37,6],[[32,18,["Optgroup"]],[32,18,["Option"]]],null,[["default"],[{"statements":[[6,[37,12],[[30,[36,11],[[30,[36,11],[[32,26,["searchproperty","default"]]],null]],null]],null,[["default"],[{"statements":[[2," "],[8,[32,20],[],[["@value","@selected"],[[32,21],[30,[36,9],[[32,21],[32,26,["searchproperty","value"]]],null]]],[["default"],[{"statements":[[2,"\\n "],[1,[30,[36,0],[[30,[36,10],["common.consul.",[30,[36,14],[[32,21]],null]],null]],null]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[21]}]]]],"parameters":[19,20]}]]],[2," "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[18]}]]],[2,"\\n"]],"parameters":[]}]]],[2," "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[17]}]]]],"parameters":[]},{"statements":[[6,[37,8],[[30,[36,7],[[32,1],"filter"],null]],null,[["default","else"],[{"statements":[[6,[37,6],[[32,2]],null,[["default"],[{"statements":[[2,"\\n "],[8,[32,8,["Select"]],[[24,0,"type-status"]],[["@position","@onchange","@multiple"],["left",[30,[36,3],[[32,0],[32,26,["status","change"]]],null],true]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["selected"]],[["default"],[{"statements":[[2,"\\n "],[10,"span"],[12],[2,"\\n "],[1,[30,[36,0],["common.consul.status"],null]],[2,"\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["options"]],[["default"],[{"statements":[[2,"\\n"],[6,[37,6],[[32,13,["Optgroup"]],[32,13,["Option"]]],null,[["default"],[{"statements":[[6,[37,12],[[30,[36,11],[[30,[36,11],[[30,[36,4],["passing","warning","critical","empty"],null]],null]],null]],null,[["default"],[{"statements":[[2," "],[8,[32,15],[[16,0,[31,["value-",[32,16]]]]],[["@value","@selected"],[[32,16],[30,[36,9],[[32,16],[32,26,["status","value"]]],null]]],[["default"],[{"statements":[[2,"\\n "],[1,[30,[36,0],[[30,[36,10],["common.consul.",[32,16]],null]],[["default"],[[30,[36,4],[[30,[36,10],["common.search.",[32,16]],null]],null]]]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[16]}]]]],"parameters":[14,15]}]]],[2," "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[13]}]]],[2,"\\n"],[6,[37,8],[[30,[36,13],[[32,27,["length"]],0],null]],null,[["default"],[{"statements":[[2," "],[8,[32,8,["Select"]],[[24,0,"type-source"]],[["@position","@onchange","@multiple"],["left",[30,[36,3],[[32,0],[32,26,["source","change"]]],null],true]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["selected"]],[["default"],[{"statements":[[2,"\\n "],[10,"span"],[12],[2,"\\n "],[1,[30,[36,0],["common.search.source"],null]],[2,"\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["options"]],[["default"],[{"statements":[[2,"\\n"],[6,[37,6],[[32,9,["Optgroup"]],[32,9,["Option"]]],null,[["default"],[{"statements":[[6,[37,12],[[30,[36,11],[[30,[36,11],[[32,27]],null]],null]],null,[["default"],[{"statements":[[2," "],[8,[32,11],[[16,0,[32,12]]],[["@value","@selected"],[[32,12],[30,[36,9],[[32,12],[32,26,["source","value"]]],null]]],[["default"],[{"statements":[[2,"\\n "],[1,[30,[36,0],[[30,[36,10],["common.brand.",[32,12]],null]],null]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[12]}]]]],"parameters":[10,11]}]]],[2," "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[9]}]]],[2,"\\n"]],"parameters":[]}]]],[2," "]],"parameters":[8]}]]]],"parameters":[]},{"statements":[[6,[37,8],[[30,[36,7],[[32,1],"sort"],null]],null,[["default"],[{"statements":[[6,[37,6],[[32,2]],null,[["default"],[{"statements":[[2,"\\n "],[8,[32,3,["Select"]],[[24,0,"type-sort"]],[["@position","@onchange","@multiple","@required"],["right",[30,[36,3],[[32,0],[32,25,["change"]]],null],false,true]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["selected"]],[["default"],[{"statements":[[2,"\\n "],[10,"span"],[12],[2,"\\n"],[6,[37,6],[[30,[36,5],[[30,[36,4],[[30,[36,4],["Name:asc",[30,[36,0],["common.sort.alpha.asc"],null]],null],[30,[36,4],["Name:desc",[30,[36,0],["common.sort.alpha.desc"],null]],null],[30,[36,4],["Status:asc",[30,[36,0],["common.sort.status.asc"],null]],null],[30,[36,4],["Status:desc",[30,[36,0],["common.sort.status.desc"],null]],null]],null]],null]],null,[["default"],[{"statements":[[2," "],[1,[30,[36,2],[[32,7],[32,25,["value"]]],null]],[2,"\\n"]],"parameters":[7]}]]],[2," "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["options"]],[["default"],[{"statements":[[2,"\\n"],[6,[37,6],[[32,4,["Optgroup"]],[32,4,["Option"]]],null,[["default"],[{"statements":[[2," "],[8,[32,5],[],[["@label"],[[30,[36,0],["common.consul.status"],null]]],[["default"],[{"statements":[[2,"\\n "],[8,[32,6],[],[["@value","@selected"],["Status:asc",[30,[36,1],["Status:asc",[32,25,["value"]]],null]]],[["default"],[{"statements":[[1,[30,[36,0],["common.sort.status.asc"],null]]],"parameters":[]}]]],[2,"\\n "],[8,[32,6],[],[["@value","@selected"],["Status:desc",[30,[36,1],["Status:desc",[32,25,["value"]]],null]]],[["default"],[{"statements":[[1,[30,[36,0],["common.sort.status.desc"],null]]],"parameters":[]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,[32,5],[],[["@label"],[[30,[36,0],["components.consul.service-instance.search-bar.sort.name.name"],null]]],[["default"],[{"statements":[[2,"\\n "],[8,[32,6],[],[["@value","@selected"],["Name:asc",[30,[36,1],["Name:asc",[32,25,["value"]]],null]]],[["default"],[{"statements":[[1,[30,[36,0],["common.sort.alpha.asc"],null]]],"parameters":[]}]]],[2,"\\n "],[8,[32,6],[],[["@value","@selected"],["Name:desc",[30,[36,1],["Name:desc",[32,25,["value"]]],null]]],[["default"],[{"statements":[[1,[30,[36,0],["common.sort.alpha.desc"],null]]],"parameters":[]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[5,6]}]]],[2," "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[4]}]]],[2,"\\n "]],"parameters":[3]}]]]],"parameters":[]}]]]],"parameters":[]}]]]],"parameters":[]}]]]],"parameters":[]}]]]],"parameters":[1,2]}]]],[2,"\\n"]],"hasEval":false,"upvars":["t","eq","get","action","array","from-entries","let","-is-named-block-invocation","if","contains","concat","-track-array","each","gt","lowercase","hash"]}',meta:{moduleName:"consul-ui/components/consul/service-instance/search-bar/index.hbs"}}) -var n=Ember._setComponentTemplate(t,Ember._templateOnlyComponent()) -e.default=n})),define("consul-ui/components/consul/service/list/index",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const t=Ember.HTMLBars.template({id:"zit0hWHY",block:'{"symbols":["item","index","@partition","&attrs","@items","@nspace"],"statements":[[8,"list-collection",[[24,0,"consul-service-list"],[17,4]],[["@items","@linkable"],[[32,5],"linkable service"]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["header"]],[["default"],[{"statements":[[2,"\\n "],[10,"dl"],[15,0,[32,1,["MeshStatus"]]],[12],[2,"\\n "],[10,"dt"],[12],[2,"\\n Health\\n "],[13],[2,"\\n "],[10,"dd"],[12],[2,"\\n "],[8,"tooltip",[],[["@position"],["top-start"]],[["default"],[{"statements":[[2,"\\n"],[6,[37,0],[[30,[36,4],["critical",[32,1,["MeshStatus"]]],null]],null,[["default","else"],[{"statements":[[2," At least one health check on one instance is failing.\\n"]],"parameters":[]},{"statements":[[6,[37,0],[[30,[36,4],["warning",[32,1,["MeshStatus"]]],null]],null,[["default","else"],[{"statements":[[2," At least one health check on one instance has a warning.\\n"]],"parameters":[]},{"statements":[[6,[37,0],[[30,[36,4],["passing",[32,1,["MeshStatus"]]],null]],null,[["default","else"],[{"statements":[[2," All health checks are passing.\\n"]],"parameters":[]},{"statements":[[2," There are no health checks.\\n "]],"parameters":[]}]]]],"parameters":[]}]]]],"parameters":[]}]]],[2," "]],"parameters":[]}]]],[2,"\\n "],[13],[2,"\\n "],[13],[2,"\\n"],[6,[37,0],[[30,[36,8],[[32,1,["InstanceCount"]],0],null]],null,[["default","else"],[{"statements":[[2," "],[10,"a"],[15,6,[30,[36,7],["dc.services.show.index",[32,1,["Name"]]],[["params"],[[30,[36,0],[[30,[36,6],[[32,1,["Partition"]],[32,3]],null],[30,[36,5],null,[["partition","nspace"],[[32,1,["Partition"]],[32,1,["Namespace"]]]]],[30,[36,5],null,null]],null]]]]],[12],[2,"\\n "],[1,[32,1,["Name"]]],[2,"\\n "],[13],[2,"\\n"]],"parameters":[]},{"statements":[[2," "],[10,"p"],[12],[2,"\\n "],[1,[32,1,["Name"]]],[2,"\\n "],[13],[2,"\\n"]],"parameters":[]}]]],[2," "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["details"]],[["default"],[{"statements":[[2,"\\n "],[8,"consul/kind",[],[["@item"],[[32,1]]],null],[2,"\\n "],[8,"consul/external-source",[],[["@item"],[[32,1]]],null],[2,"\\n"],[6,[37,0],[[30,[36,1],[[30,[36,6],[[32,1,["InstanceCount"]],0],null],[30,[36,1],[[30,[36,6],[[32,1,["Kind"]],"terminating-gateway"],null],[30,[36,6],[[32,1,["Kind"]],"ingress-gateway"],null]],null]],null]],null,[["default"],[{"statements":[[2," "],[10,"span"],[12],[2,"\\n "],[1,[30,[36,2],[[32,1,["InstanceCount"]]],null]],[2," "],[1,[30,[36,3],[[32,1,["InstanceCount"]],"instance"],[["without-count"],[true]]]],[2,"\\n "],[13],[2,"\\n"]],"parameters":[]}]]],[6,[37,0],[[30,[36,4],[[32,1,["Kind"]],"terminating-gateway"],null]],null,[["default","else"],[{"statements":[[2," "],[10,"span"],[12],[2,"\\n "],[1,[30,[36,2],[[32,1,["GatewayConfig","AssociatedServiceCount"]]],null]],[2," "],[1,[30,[36,3],[[32,1,["GatewayConfig","AssociatedServiceCount"]],"linked service"],[["without-count"],[true]]]],[2,"\\n "],[13],[2,"\\n"]],"parameters":[]},{"statements":[[6,[37,0],[[30,[36,4],[[32,1,["Kind"]],"ingress-gateway"],null]],null,[["default"],[{"statements":[[2," "],[10,"span"],[12],[2,"\\n "],[1,[30,[36,2],[[32,1,["GatewayConfig","AssociatedServiceCount"]]],null]],[2," "],[1,[30,[36,3],[[32,1,["GatewayConfig","AssociatedServiceCount"]],"upstream"],[["without-count"],[true]]]],[2,"\\n "],[13],[2,"\\n "]],"parameters":[]}]]]],"parameters":[]}]]],[6,[37,0],[[30,[36,9],[[32,1,["ConnectedWithGateway"]],[32,1,["ConnectedWithProxy"]]],null]],null,[["default"],[{"statements":[[2," "],[10,"dl"],[14,0,"mesh"],[12],[2,"\\n "],[10,"dt"],[12],[2,"\\n "],[8,"tooltip",[],[[],[]],[["default"],[{"statements":[[2,"\\n This service uses a proxy for the Consul service mesh\\n "]],"parameters":[]}]]],[2,"\\n "],[13],[2,"\\n"],[6,[37,0],[[30,[36,1],[[32,1,["ConnectedWithGateway"]],[32,1,["ConnectedWithProxy"]]],null]],null,[["default","else"],[{"statements":[[2," "],[10,"dd"],[12],[2,"\\n in service mesh with proxy and gateway\\n "],[13],[2,"\\n"]],"parameters":[]},{"statements":[[6,[37,0],[[32,1,["ConnectedWithProxy"]]],null,[["default","else"],[{"statements":[[2," "],[10,"dd"],[12],[2,"\\n in service mesh with proxy\\n "],[13],[2,"\\n"]],"parameters":[]},{"statements":[[6,[37,0],[[32,1,["ConnectedWithGateway"]]],null,[["default"],[{"statements":[[2," "],[10,"dd"],[12],[2,"\\n in service mesh with gateway\\n "],[13],[2,"\\n "]],"parameters":[]}]]]],"parameters":[]}]]]],"parameters":[]}]]],[2," "],[13],[2,"\\n"]],"parameters":[]}]]],[2," "],[8,"consul/bucket/list",[],[["@item","@nspace","@partition"],[[32,1],[32,6],[32,3]]],null],[2,"\\n "],[8,"tag-list",[],[["@item"],[[32,1]]],null],[2,"\\n "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[1,2]}]]]],"hasEval":false,"upvars":["if","and","format-number","pluralize","eq","hash","not-eq","href-to","gt","or"]}',meta:{moduleName:"consul-ui/components/consul/service/list/index.hbs"}}) -var n=Ember._setComponentTemplate(t,Ember._templateOnlyComponent()) -e.default=n})),define("consul-ui/components/consul/service/search-bar/index",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const t=Ember.HTMLBars.template({id:"tDwWS/Y3",block:'{"symbols":["__arg0","__arg1","search","components","Optgroup","Option","selectable","search","components","Optgroup","Option","source","nonDefaultPartitions","partition","components","Optgroup","Option","state","kind","components","Optgroup","Option","state","search","components","Optgroup","Option","prop","search","key","value","@sort","@filter","@sources","@partitions","@partition","@onsearch","@search","&attrs"],"statements":[[8,"search-bar",[[24,0,"consul-service-search-bar"],[17,39]],[["@filter","@namedBlocksInfo"],[[32,33],[30,[36,16],null,[["status","search","filter","sort"],[1,1,1,1]]]]],[["default"],[{"statements":[[6,[37,8],[[30,[36,7],[[32,1],"status"],null]],null,[["default","else"],[{"statements":[[6,[37,6],[[32,2]],null,[["default"],[{"statements":[[2,"\\n\\n"],[6,[37,6],[[30,[36,0],[[30,[36,10],["components.consul.service.search-bar.",[32,29,["status","key"]]],null]],[["default"],[[30,[36,4],[[30,[36,10],["common.search.",[32,29,["status","key"]]],null],[30,[36,10],["common.consul.",[32,29,["status","key"]]],null]],null]]]],[30,[36,0],[[30,[36,10],["components.consul.service.search-bar.",[32,29,["status","value"]]],null]],[["default"],[[30,[36,4],[[30,[36,10],["common.search.",[32,29,["status","value"]]],null],[30,[36,10],["common.consul.",[32,29,["status","value"]]],null],[30,[36,10],["common.brand.",[32,29,["status","value"]]],null]],null]]]]],null,[["default"],[{"statements":[[2," "],[8,[32,29,["RemoveFilter"]],[[16,"aria-label",[30,[36,0],["common.ui.remove"],[["item"],[[30,[36,10],[[32,30]," ",[32,31]],null]]]]]],[[],[]],[["default"],[{"statements":[[2,"\\n "],[10,"dl"],[12],[2,"\\n "],[10,"dt"],[12],[1,[32,30]],[13],[2,"\\n "],[10,"dd"],[12],[1,[32,31]],[13],[2,"\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[30,31]}]]],[2,"\\n "]],"parameters":[29]}]]]],"parameters":[]},{"statements":[[6,[37,8],[[30,[36,7],[[32,1],"search"],null]],null,[["default","else"],[{"statements":[[6,[37,6],[[32,2]],null,[["default"],[{"statements":[[2,"\\n "],[8,[32,24,["Search"]],[],[["@onsearch","@value","@placeholder"],[[30,[36,3],[[32,0],[32,37]],null],[32,38],[30,[36,0],["common.search.search"],null]]],[["default"],[{"statements":[[2,"\\n "],[8,[32,24,["Select"]],[[24,0,"type-search-properties"]],[["@position","@onchange","@multiple","@required"],["right",[30,[36,3],[[32,0],[32,33,["searchproperty","change"]]],null],true,true]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["selected"]],[["default"],[{"statements":[[2,"\\n "],[10,"span"],[12],[2,"\\n "],[1,[30,[36,0],["common.search.searchproperty"],null]],[2,"\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["options"]],[["default"],[{"statements":[[2,"\\n"],[6,[37,6],[[32,25,["Optgroup"]],[32,25,["Option"]]],null,[["default"],[{"statements":[[6,[37,12],[[30,[36,11],[[30,[36,11],[[32,33,["searchproperty","default"]]],null]],null]],null,[["default"],[{"statements":[[2," "],[8,[32,27],[],[["@value","@selected"],[[32,28],[30,[36,9],[[32,28],[32,33,["searchproperty","value"]]],null]]],[["default"],[{"statements":[[2,"\\n "],[1,[30,[36,0],[[30,[36,10],["common.consul.",[30,[36,15],[[32,28]],null]],null]],null]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[28]}]]]],"parameters":[26,27]}]]],[2," "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[25]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[24]}]]]],"parameters":[]},{"statements":[[6,[37,8],[[30,[36,7],[[32,1],"filter"],null]],null,[["default","else"],[{"statements":[[6,[37,6],[[32,2]],null,[["default"],[{"statements":[[2,"\\n "],[8,[32,8,["Select"]],[[24,0,"type-status"]],[["@position","@onchange","@multiple"],["left",[30,[36,3],[[32,0],[32,33,["status","change"]]],null],true]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["selected"]],[["default"],[{"statements":[[2,"\\n "],[10,"span"],[12],[2,"\\n "],[1,[30,[36,0],["common.consul.status"],null]],[2,"\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["options"]],[["default"],[{"statements":[[2,"\\n"],[6,[37,6],[[32,20,["Optgroup"]],[32,20,["Option"]]],null,[["default"],[{"statements":[[6,[37,12],[[30,[36,11],[[30,[36,11],[[30,[36,4],["passing","warning","critical","empty"],null]],null]],null]],null,[["default"],[{"statements":[[2," "],[8,[32,22],[[16,0,[31,["value-",[32,23]]]]],[["@value","@selected"],[[32,23],[30,[36,9],[[32,23],[32,33,["status","value"]]],null]]],[["default"],[{"statements":[[2,"\\n "],[1,[30,[36,0],[[30,[36,10],["common.consul.",[32,23]],null]],[["default"],[[30,[36,4],[[30,[36,10],["common.search.",[32,23]],null]],null]]]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[23]}]]]],"parameters":[21,22]}]]],[2," "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[20]}]]],[2,"\\n "],[8,[32,8,["Select"]],[],[["@position","@onchange","@multiple"],["left",[30,[36,3],[[32,0],[32,33,["kind","change"]]],null],true]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["selected"]],[["default"],[{"statements":[[2,"\\n "],[10,"span"],[12],[2,"\\n "],[1,[30,[36,0],["components.consul.service.search-bar.kind"],null]],[2,"\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["options"]],[["default"],[{"statements":[[2,"\\n"],[6,[37,6],[[32,15,["Optgroup"]],[32,15,["Option"]]],null,[["default"],[{"statements":[[2," "],[8,[32,17],[],[["@value","@selected"],["service",[30,[36,9],["service",[32,33,["kind","value"]]],null]]],[["default"],[{"statements":[[2,"\\n "],[1,[30,[36,0],["common.consul.service"],null]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,[32,16],[],[["@label"],[[30,[36,0],["common.consul.gateway"],null]]],[["default"],[{"statements":[[2,"\\n"],[6,[37,12],[[30,[36,11],[[30,[36,11],[[30,[36,4],["ingress-gateway","terminating-gateway","mesh-gateway"],null]],null]],null]],null,[["default"],[{"statements":[[2," "],[8,[32,17],[],[["@value","@selected"],[[32,19],[30,[36,9],[[32,19],[32,33,["kind","value"]]],null]]],[["default"],[{"statements":[[2,"\\n "],[1,[30,[36,0],[[30,[36,10],["common.consul.",[32,19]],null]],null]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[19]}]]],[2," "]],"parameters":[]}]]],[2,"\\n "],[8,[32,16],[],[["@label"],[[30,[36,0],["common.consul.mesh"],null]]],[["default"],[{"statements":[[2,"\\n"],[6,[37,12],[[30,[36,11],[[30,[36,11],[[30,[36,4],["in-mesh","not-in-mesh"],null]],null]],null]],null,[["default"],[{"statements":[[2," "],[8,[32,17],[],[["@value","@selected"],[[32,18],[30,[36,9],[[32,18],[32,33,["kind","value"]]],null]]],[["default"],[{"statements":[[2,"\\n "],[1,[30,[36,0],[[30,[36,10],["common.search.",[32,18]],null]],null]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[18]}]]],[2," "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[16,17]}]]],[2," "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[15]}]]],[2,"\\n"],[6,[37,8],[[30,[36,13],[[32,34,["length"]],0],null]],null,[["default"],[{"statements":[[2," "],[8,[32,8,["Select"]],[[24,0,"type-source"]],[["@position","@onchange","@multiple"],["left",[30,[36,3],[[32,0],[32,33,["source","change"]]],null],true]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["selected"]],[["default"],[{"statements":[[2,"\\n "],[10,"span"],[12],[2,"\\n "],[1,[30,[36,0],["common.search.source"],null]],[2,"\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["options"]],[["default"],[{"statements":[[2,"\\n"],[6,[37,6],[[32,9,["Optgroup"]],[32,9,["Option"]]],null,[["default"],[{"statements":[[6,[37,6],[[30,[36,14],["Partition",[32,36],[32,35]],null]],null,[["default"],[{"statements":[[6,[37,8],[[30,[36,13],[[32,13,["length"]],0],null]],null,[["default"],[{"statements":[[2," "],[8,[32,10],[],[["@label"],[[30,[36,0],["common.brand.consul"],null]]],[["default"],[{"statements":[[2,"\\n"],[6,[37,12],[[30,[36,11],[[30,[36,11],[[32,35]],null]],null]],null,[["default"],[{"statements":[[2," "],[8,[32,11],[[24,0,"partition"]],[["@value","@selected"],[[32,14],[30,[36,9],[[32,14],[32,33,["source","value"]]],null]]],[["default"],[{"statements":[[2,"\\n "],[1,[32,14]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[14]}]]],[2," "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[]}]]]],"parameters":[13]}]]],[2,"\\n"],[6,[37,8],[[30,[36,13],[[32,34,["length"]],0],null]],null,[["default"],[{"statements":[[2," "],[8,[32,10],[],[["@label"],[[30,[36,0],["common.search.integrations"],null]]],[["default"],[{"statements":[[2,"\\n"],[6,[37,12],[[30,[36,11],[[30,[36,11],[[32,34]],null]],null]],null,[["default"],[{"statements":[[2," "],[8,[32,11],[[16,0,[32,12]]],[["@value","@selected"],[[32,12],[30,[36,9],[[32,12],[32,33,["source","value"]]],null]]],[["default"],[{"statements":[[2,"\\n "],[1,[30,[36,0],[[30,[36,10],["common.brand.",[32,12]],null]],null]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[12]}]]],[2," "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[]}]]]],"parameters":[10,11]}]]],[2," "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[9]}]]],[2,"\\n"]],"parameters":[]}]]],[2," "]],"parameters":[8]}]]]],"parameters":[]},{"statements":[[6,[37,8],[[30,[36,7],[[32,1],"sort"],null]],null,[["default"],[{"statements":[[6,[37,6],[[32,2]],null,[["default"],[{"statements":[[2,"\\n "],[8,[32,3,["Select"]],[[24,0,"type-sort"]],[["@position","@onchange","@multiple","@required"],["right",[30,[36,3],[[32,0],[32,32,["change"]]],null],false,true]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["selected"]],[["default"],[{"statements":[[2,"\\n "],[10,"span"],[12],[2,"\\n"],[6,[37,6],[[30,[36,5],[[30,[36,4],[[30,[36,4],["Name:asc",[30,[36,0],["common.sort.alpha.asc"],null]],null],[30,[36,4],["Name:desc",[30,[36,0],["common.sort.alpha.desc"],null]],null],[30,[36,4],["Status:asc",[30,[36,0],["common.sort.status.asc"],null]],null],[30,[36,4],["Status:desc",[30,[36,0],["common.sort.status.desc"],null]],null]],null]],null]],null,[["default"],[{"statements":[[2," "],[1,[30,[36,2],[[32,7],[32,32,["value"]]],null]],[2,"\\n"]],"parameters":[7]}]]],[2," "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["options"]],[["default"],[{"statements":[[2,"\\n"],[6,[37,6],[[32,4,["Optgroup"]],[32,4,["Option"]]],null,[["default"],[{"statements":[[2," "],[8,[32,5],[],[["@label"],[[30,[36,0],["common.consul.status"],null]]],[["default"],[{"statements":[[2,"\\n "],[8,[32,6],[],[["@value","@selected"],["Status:asc",[30,[36,1],["Status:asc",[32,32,["value"]]],null]]],[["default"],[{"statements":[[1,[30,[36,0],["common.sort.status.asc"],null]]],"parameters":[]}]]],[2,"\\n "],[8,[32,6],[],[["@value","@selected"],["Status:desc",[30,[36,1],["Status:desc",[32,32,["value"]]],null]]],[["default"],[{"statements":[[1,[30,[36,0],["common.sort.status.desc"],null]]],"parameters":[]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,[32,5],[],[["@label"],[[30,[36,0],["common.consul.service-name"],null]]],[["default"],[{"statements":[[2,"\\n "],[8,[32,6],[],[["@value","@selected"],["Name:asc",[30,[36,1],["Name:asc",[32,32,["value"]]],null]]],[["default"],[{"statements":[[1,[30,[36,0],["common.sort.alpha.asc"],null]]],"parameters":[]}]]],[2,"\\n "],[8,[32,6],[],[["@value","@selected"],["Name:desc",[30,[36,1],["Name:desc",[32,32,["value"]]],null]]],[["default"],[{"statements":[[1,[30,[36,0],["common.sort.alpha.desc"],null]]],"parameters":[]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[5,6]}]]],[2," "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[4]}]]],[2,"\\n "]],"parameters":[3]}]]]],"parameters":[]}]]]],"parameters":[]}]]]],"parameters":[]}]]]],"parameters":[]}]]]],"parameters":[1,2]}]]],[2,"\\n"]],"hasEval":false,"upvars":["t","eq","get","action","array","from-entries","let","-is-named-block-invocation","if","contains","concat","-track-array","each","gt","reject-by","lowercase","hash"]}',meta:{moduleName:"consul-ui/components/consul/service/search-bar/index.hbs"}}) -var n=Ember._setComponentTemplate(t,Ember._templateOnlyComponent()) -e.default=n})),define("consul-ui/components/consul/source/index",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const t=Ember.HTMLBars.template({id:"GdArOCfb",block:'{"symbols":["@source"],"statements":[[10,"dl"],[14,0,"tooltip-panel"],[12],[2,"\\n "],[10,"dt"],[12],[2,"\\n "],[10,"span"],[14,0,"consul-source"],[12],[2,"\\n "],[1,[32,1]],[2,"\\n "],[13],[2,"\\n "],[13],[2,"\\n "],[10,"dd"],[12],[2,"\\n "],[8,"menu-panel",[],[["@position"],["left"]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["header"]],[["default"],[{"statements":[[2,"\\n "],[1,[30,[36,0],["components.consul.source.header"],null]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["menu"]],[["default"],[{"statements":[[2,"\\n "],[10,"li"],[14,"role","separator"],[12],[2,"\\n "],[1,[30,[36,0],["components.consul.source.menu-title"],null]],[2,"\\n "],[13],[2,"\\n "],[10,"li"],[14,"role","none"],[14,0,"docs-link"],[12],[2,"\\n "],[10,"a"],[14,"tabindex","-1"],[14,"role","menuitem"],[15,6,[31,[[30,[36,1],["CONSUL_DOCS_URL"],null],"/connect/l7-traffic"]]],[14,"rel","noopener noreferrer"],[14,"target","_blank"],[12],[2,"\\n "],[1,[30,[36,0],["components.consul.source.links.documentation"],null]],[2,"\\n "],[13],[2,"\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[13],[2,"\\n"],[13],[2,"\\n\\n"]],"hasEval":false,"upvars":["t","env"]}',meta:{moduleName:"consul-ui/components/consul/source/index.hbs"}}) -var n=Ember._setComponentTemplate(t,Ember._templateOnlyComponent()) -e.default=n})),define("consul-ui/components/consul/token/list/index",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const t=Ember.HTMLBars.template({id:"FbsUqUSU",block:'{"symbols":["item","Actions","Action","Confirmation","Confirm","Confirmation","Confirm","Confirmation","Confirm","@ondelete","@onuse","@onlogout","@onclone","@items","@token"],"statements":[[8,"list-collection",[[24,0,"consul-token-list"]],[["@items"],[[32,14]]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["header"]],[["default"],[{"statements":[[2,"\\n"],[6,[37,3],[[30,[36,2],[[32,1,["AccessorID"]],[32,15,["AccessorID"]]],null]],null,[["default"],[{"statements":[[2," "],[10,"dl"],[14,"rel","me"],[12],[2,"\\n "],[10,"dd"],[12],[2,"\\n "],[8,"tooltip",[],[["@position"],["top-start"]],[["default"],[{"statements":[[2,"\\n Your token\\n "]],"parameters":[]}]]],[2,"\\n "],[13],[2,"\\n "],[13],[2,"\\n"]],"parameters":[]}]]],[2," "],[10,"a"],[15,6,[30,[36,4],["dc.acls.tokens.edit",[32,1,["AccessorID"]]],null]],[12],[1,[30,[36,5],[[32,1,["AccessorID"]],-8],null]],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["details"]],[["default"],[{"statements":[[2,"\\n "],[10,"dl"],[12],[2,"\\n "],[10,"dt"],[12],[2,"Scope"],[13],[2,"\\n "],[10,"dd"],[12],[2,"\\n "],[1,[30,[36,3],[[32,1,["Local"]],"local","global"],null]],[2,"\\n "],[13],[2,"\\n "],[13],[2,"\\n "],[8,"consul/token/ruleset/list",[],[["@item"],[[32,1]]],null],[2,"\\n "],[10,"dl"],[12],[2,"\\n "],[10,"dt"],[12],[2,"Description"],[13],[2,"\\n "],[10,"dd"],[12],[2,"\\n "],[1,[30,[36,6],[[32,1,["Description"]],[32,1,["Name"]]],null]],[2,"\\n "],[13],[2,"\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["actions"]],[["default"],[{"statements":[[2,"\\n"],[6,[37,3],[[32,1,["hasSecretID"]]],null,[["default"],[{"statements":[[2," "],[8,"copy-button",[],[["@value","@name"],[[32,1,["SecretID"]],[30,[36,1],["components.consul.token.secretID"],null]]],[["default"],[{"statements":[[2,"\\n "],[1,[30,[36,1],["components.consul.token.secretID"],null]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[]}]]],[2," "],[8,[32,2],[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[8,[32,3],[],[["@href"],[[30,[36,4],["dc.acls.tokens.edit",[32,1,["AccessorID"]]],null]]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["label"]],[["default"],[{"statements":[[2,"\\n"],[6,[37,3],[[30,[36,7],["write token"],[["item"],[[32,1]]]]],null,[["default","else"],[{"statements":[[2," Edit\\n"]],"parameters":[]},{"statements":[[2," View\\n"]],"parameters":[]}]]],[2," "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n"],[6,[37,3],[[30,[36,7],["duplicate token"],[["item"],[[32,1]]]]],null,[["default"],[{"statements":[[2," "],[8,[32,3],[],[["@onclick"],[[30,[36,0],[[32,0],[32,13],[32,1]],null]]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["label"]],[["default"],[{"statements":[[2,"\\n Duplicate\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[]}]]],[2,"\\n"],[6,[37,3],[[30,[36,2],[[32,1,["AccessorID"]],[35,8,["AccessorID"]]],null]],null,[["default","else"],[{"statements":[[2," "],[8,[32,3],[[24,0,"dangerous"]],[["@onclick"],[[30,[36,0],[[32,0],[32,12],[32,1]],null]]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["label"]],[["default"],[{"statements":[[2,"\\n Logout\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["confirmation"]],[["default"],[{"statements":[[2,"\\n "],[8,[32,8],[[24,0,"warning"]],[[],[]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["header"]],[["default"],[{"statements":[[2,"\\n Confirm logout\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["body"]],[["default"],[{"statements":[[2,"\\n "],[10,"p"],[12],[2,"\\n Are you sure you want to stop using this ACL token? This will log you out.\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["confirm"]],[["default"],[{"statements":[[2,"\\n "],[8,[32,9],[],[[],[]],[["default"],[{"statements":[[2,"Logout"]],"parameters":[]}]]],[2,"\\n "]],"parameters":[9]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[8]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[]},{"statements":[[2," "],[8,[32,3],[],[["@onclick"],[[30,[36,0],[[32,0],[32,11],[32,1]],null]]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["label"]],[["default"],[{"statements":[[2,"\\n Use\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["confirmation"]],[["default"],[{"statements":[[2,"\\n "],[8,[32,6],[[24,0,"warning"]],[[],[]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["header"]],[["default"],[{"statements":[[2,"\\n Confirm use\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["body"]],[["default"],[{"statements":[[2,"\\n "],[10,"p"],[12],[2,"\\n Are you sure you want to use this ACL token?\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["confirm"]],[["default"],[{"statements":[[2,"\\n "],[8,[32,7],[],[[],[]],[["default"],[{"statements":[[2,"Use"]],"parameters":[]}]]],[2,"\\n "]],"parameters":[7]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[6]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[]}]]],[2,"\\n\\n"],[6,[37,3],[[30,[36,7],["delete token"],[["item","token"],[[32,1],[32,15]]]]],null,[["default"],[{"statements":[[2," "],[8,[32,3],[[24,0,"dangerous"]],[["@onclick"],[[30,[36,0],[[32,0],[32,10],[32,1]],null]]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["label"]],[["default"],[{"statements":[[2,"\\n Delete\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["confirmation"]],[["default"],[{"statements":[[2,"\\n "],[8,[32,4],[[24,0,"warning"]],[[],[]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["header"]],[["default"],[{"statements":[[2,"\\n Confirm delete\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["body"]],[["default"],[{"statements":[[2,"\\n "],[10,"p"],[12],[2,"\\n Are you sure you want to delete this token?\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["confirm"]],[["default"],[{"statements":[[2,"\\n "],[8,[32,5],[],[[],[]],[["default"],[{"statements":[[2,"Delete"]],"parameters":[]}]]],[2,"\\n "]],"parameters":[5]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[4]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[]}]]],[2,"\\n "]],"parameters":[3]}]]],[2,"\\n "]],"parameters":[2]}]]],[2,"\\n"]],"parameters":[1]}]]]],"hasEval":false,"upvars":["action","t","eq","if","href-to","substr","or","can","token"]}',meta:{moduleName:"consul-ui/components/consul/token/list/index.hbs"}}) -var n=Ember._setComponentTemplate(t,Ember._templateOnlyComponent()) -e.default=n})),define("consul-ui/components/consul/token/notifications/index",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const t=Ember.HTMLBars.template({id:"8YjZ0J1V",block:'{"symbols":["error","@status","@type","@item","@error"],"statements":[[6,[37,1],[[30,[36,2],[[32,3],"create"],null]],null,[["default","else"],[{"statements":[[6,[37,1],[[30,[36,2],[[32,2],"success"],null]],null,[["default","else"],[{"statements":[[2," The token has been added.\\n"]],"parameters":[]},{"statements":[[2," There was an error adding the token.\\n"]],"parameters":[]}]]]],"parameters":[]},{"statements":[[6,[37,1],[[30,[36,2],[[32,3],"update"],null]],null,[["default","else"],[{"statements":[[6,[37,1],[[30,[36,2],[[32,2],"success"],null]],null,[["default","else"],[{"statements":[[2," The token has been saved.\\n"]],"parameters":[]},{"statements":[[2," There was an error saving the token.\\n"]],"parameters":[]}]]]],"parameters":[]},{"statements":[[6,[37,1],[[30,[36,2],[[32,3],"delete"],null]],null,[["default","else"],[{"statements":[[6,[37,1],[[30,[36,2],[[32,2],"success"],null]],null,[["default","else"],[{"statements":[[2," The token was deleted.\\n"]],"parameters":[]},{"statements":[[2," There was an error deleting the token.\\n"]],"parameters":[]}]]]],"parameters":[]},{"statements":[[6,[37,1],[[30,[36,2],[[32,3],"clone"],null]],null,[["default","else"],[{"statements":[[6,[37,1],[[30,[36,2],[[32,2],"success"],null]],null,[["default","else"],[{"statements":[[2," The token has been cloned as "],[1,[30,[36,3],[[32,4,["AccessorID"]],8,false],null]],[2,"\\n"]],"parameters":[]},{"statements":[[2," There was an error cloning the token.\\n"]],"parameters":[]}]]]],"parameters":[]},{"statements":[[6,[37,1],[[30,[36,2],[[32,3],"use"],null]],null,[["default"],[{"statements":[[6,[37,1],[[30,[36,2],[[32,2],"success"],null]],null,[["default","else"],[{"statements":[[2," You are now using the new ACL token\\n"]],"parameters":[]},{"statements":[[2," There was an error using that ACL token.\\n"]],"parameters":[]}]]]],"parameters":[]}]]]],"parameters":[]}]]]],"parameters":[]}]]]],"parameters":[]}]]]],"parameters":[]}]]],[6,[37,4],[[32,5,["errors","firstObject"]]],null,[["default"],[{"statements":[[6,[37,1],[[32,1,["detail"]]],null,[["default"],[{"statements":[[2," "],[10,"br"],[12],[13],[1,[30,[36,0],["(",[30,[36,1],[[32,1,["status"]],[30,[36,0],[[32,1,["status"]],": "],null]],null],[32,1,["detail"]],")"],null]],[2,"\\n"]],"parameters":[]}]]]],"parameters":[1]}]]]],"hasEval":false,"upvars":["concat","if","eq","truncate","let"]}',meta:{moduleName:"consul-ui/components/consul/token/notifications/index.hbs"}}) -var n=Ember._setComponentTemplate(t,Ember._templateOnlyComponent()) -e.default=n})),define("consul-ui/components/consul/token/ruleset/list/index",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const t=Ember.HTMLBars.template({id:"BIcaaAvq",block:'{"symbols":["policies","policies","item","identities","item","management","item"],"statements":[[6,[37,10],[[30,[36,12],[[30,[36,7],[[35,6,["Policies"]],[35,6,["ACLs","PolicyDefaults"]],[30,[36,5],null,null]],null]],null]],null,[["default"],[{"statements":[[6,[37,10],[[30,[36,8],[[32,1],"management"],null]],null,[["default"],[{"statements":[[6,[37,4],[[30,[36,3],[[32,6,["length"]],0],null]],null,[["default"],[{"statements":[[2," "],[10,"dl"],[12],[2,"\\n "],[10,"dt"],[12],[2,"\\n Management\\n "],[13],[2,"\\n "],[10,"dd"],[12],[2,"\\n"],[6,[37,2],[[30,[36,1],[[30,[36,1],[[30,[36,8],[[32,1],"management"],null]],null]],null]],null,[["default"],[{"statements":[[2," "],[10,"span"],[15,0,[30,[36,0],[[32,7]],null]],[12],[1,[32,7,["Name"]]],[13],[2,"\\n"]],"parameters":[7]}]]],[2," "],[13],[2,"\\n "],[13],[2,"\\n"]],"parameters":[]}]]]],"parameters":[6]}]]],[6,[37,10],[[30,[36,8],[[32,1],"identities"],null]],null,[["default"],[{"statements":[[6,[37,4],[[30,[36,3],[[32,4,["length"]],0],null]],null,[["default"],[{"statements":[[2," "],[10,"dl"],[12],[2,"\\n "],[10,"dt"],[12],[2,"Identities"],[13],[2,"\\n "],[10,"dd"],[12],[2,"\\n"],[6,[37,2],[[30,[36,1],[[30,[36,1],[[32,4]],null]],null]],null,[["default"],[{"statements":[[2," "],[10,"span"],[15,0,[30,[36,0],[[32,5]],null]],[12],[1,[32,5,["Name"]]],[13],[2,"\\n"]],"parameters":[5]}]]],[2," "],[13],[2,"\\n "],[13],[2,"\\n"]],"parameters":[]}]]]],"parameters":[4]}]]],[6,[37,4],[[30,[36,11],[[35,6]],null]],null,[["default","else"],[{"statements":[[2," "],[10,"dl"],[12],[2,"\\n "],[10,"dt"],[12],[2,"Rules"],[13],[2,"\\n "],[10,"dd"],[12],[2,"\\n Legacy tokens have embedded rules.\\n "],[13],[2,"\\n "],[13],[2,"\\n"]],"parameters":[]},{"statements":[[6,[37,10],[[30,[36,9],[[30,[36,8],[[32,1],"policies"],null],[30,[36,7],[[35,6,["Roles"]],[35,6,["ACLs","RoleDefaults"]],[30,[36,5],null,null]],null]],null]],null,[["default"],[{"statements":[[6,[37,4],[[30,[36,3],[[32,2,["length"]],0],null]],null,[["default"],[{"statements":[[2," "],[10,"dl"],[12],[2,"\\n "],[10,"dt"],[12],[2,"Rules"],[13],[2,"\\n "],[10,"dd"],[12],[2,"\\n"],[6,[37,2],[[30,[36,1],[[30,[36,1],[[32,2]],null]],null]],null,[["default"],[{"statements":[[2," "],[10,"span"],[15,0,[30,[36,0],[[32,3]],null]],[12],[1,[32,3,["Name"]]],[13],[2,"\\n"]],"parameters":[3]}]]],[2," "],[13],[2,"\\n "],[13],[2,"\\n"]],"parameters":[]}]]]],"parameters":[2]}]]]],"parameters":[]}]]]],"parameters":[1]}]]]],"hasEval":false,"upvars":["policy/typeof","-track-array","each","gt","if","array","item","or","get","append","let","token/is-legacy","policy/group"]}',meta:{moduleName:"consul-ui/components/consul/token/ruleset/list/index.hbs"}}) -var n=Ember._setComponentTemplate(t,Ember.Component.extend({tagName:""})) -e.default=n})),define("consul-ui/components/consul/token/search-bar/index",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const t=Ember.HTMLBars.template({id:"MmGQHD2n",block:'{"symbols":["__arg0","__arg1","search","components","Optgroup","Option","selectable","search","components","Optgroup","Option","state","search","components","Optgroup","Option","prop","search","key","value","@sort","@filter","@onsearch","@search","&attrs"],"statements":[[8,"search-bar",[[24,0,"consul-token-search-bar"],[17,25]],[["@filter","@namedBlocksInfo"],[[32,22],[30,[36,14],null,[["status","search","filter","sort"],[1,1,1,1]]]]],[["default"],[{"statements":[[6,[37,8],[[30,[36,7],[[32,1],"status"],null]],null,[["default","else"],[{"statements":[[6,[37,6],[[32,2]],null,[["default"],[{"statements":[[2,"\\n\\n"],[6,[37,6],[[30,[36,0],[[30,[36,10],["components.consul.token.search-bar.",[32,18,["status","key"]],".name"],null]],[["default"],[[30,[36,4],[[30,[36,10],["common.search.",[32,18,["status","key"]]],null],[30,[36,10],["common.consul.",[32,18,["status","key"]]],null]],null]]]],[30,[36,0],[[30,[36,10],["components.consul.token.search-bar.",[32,18,["status","key"]],".options.",[32,18,["status","value"]]],null]],[["default"],[[30,[36,4],[[30,[36,10],["common.search.",[32,18,["status","value"]]],null],[30,[36,10],["common.consul.",[32,18,["status","value"]]],null],[30,[36,10],["common.brand.",[32,18,["status","value"]]],null]],null]]]]],null,[["default"],[{"statements":[[2," "],[8,[32,18,["RemoveFilter"]],[[16,"aria-label",[30,[36,0],["common.ui.remove"],[["item"],[[30,[36,10],[[32,19]," ",[32,20]],null]]]]]],[[],[]],[["default"],[{"statements":[[2,"\\n "],[10,"dl"],[12],[2,"\\n "],[10,"dt"],[12],[1,[32,19]],[13],[2,"\\n "],[10,"dd"],[12],[1,[32,20]],[13],[2,"\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[19,20]}]]],[2,"\\n "]],"parameters":[18]}]]]],"parameters":[]},{"statements":[[6,[37,8],[[30,[36,7],[[32,1],"search"],null]],null,[["default","else"],[{"statements":[[6,[37,6],[[32,2]],null,[["default"],[{"statements":[[2,"\\n "],[8,[32,13,["Search"]],[],[["@onsearch","@value","@placeholder"],[[30,[36,3],[[32,0],[32,23]],null],[32,24],[30,[36,0],["common.search.search"],null]]],[["default"],[{"statements":[[2,"\\n "],[8,[32,13,["Select"]],[[24,0,"type-search-properties"]],[["@position","@onchange","@multiple","@required"],["right",[30,[36,3],[[32,0],[32,22,["searchproperty","change"]]],null],true,true]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["selected"]],[["default"],[{"statements":[[2,"\\n "],[10,"span"],[12],[2,"\\n "],[1,[30,[36,0],["common.search.searchproperty"],null]],[2,"\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["options"]],[["default"],[{"statements":[[2,"\\n"],[6,[37,6],[[32,14,["Optgroup"]],[32,14,["Option"]]],null,[["default"],[{"statements":[[6,[37,12],[[30,[36,11],[[30,[36,11],[[32,22,["searchproperty","default"]]],null]],null]],null,[["default"],[{"statements":[[2," "],[8,[32,16],[],[["@value","@selected"],[[32,17],[30,[36,9],[[32,17],[32,22,["searchproperty","value"]]],null]]],[["default"],[{"statements":[[2,"\\n "],[1,[30,[36,0],[[30,[36,10],["common.consul.",[30,[36,13],[[32,17]],null]],null]],null]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[17]}]]]],"parameters":[15,16]}]]],[2," "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[14]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[13]}]]]],"parameters":[]},{"statements":[[6,[37,8],[[30,[36,7],[[32,1],"filter"],null]],null,[["default","else"],[{"statements":[[6,[37,6],[[32,2]],null,[["default"],[{"statements":[[2,"\\n "],[8,[32,8,["Select"]],[[24,0,"type-status"]],[["@position","@onchange","@multiple"],["left",[30,[36,3],[[32,0],[32,22,["kind","change"]]],null],true]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["selected"]],[["default"],[{"statements":[[2,"\\n "],[10,"span"],[12],[2,"\\n "],[1,[30,[36,0],["components.consul.token.search-bar.kind.name"],null]],[2,"\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["options"]],[["default"],[{"statements":[[2,"\\n"],[6,[37,6],[[32,9,["Optgroup"]],[32,9,["Option"]]],null,[["default"],[{"statements":[[6,[37,12],[[30,[36,11],[[30,[36,11],[[30,[36,4],["global-management","global","local"],null]],null]],null]],null,[["default"],[{"statements":[[2," "],[8,[32,11],[[16,0,[31,["value-",[32,12]]]]],[["@value","@selected"],[[32,12],[30,[36,9],[[32,12],[32,22,["kind","value"]]],null]]],[["default"],[{"statements":[[2,"\\n "],[1,[30,[36,0],[[30,[36,10],["components.consul.token.search-bar.kind.options.",[32,12]],null]],[["default"],[[30,[36,4],[[30,[36,10],["common.search.",[32,12]],null]],null]]]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[12]}]]]],"parameters":[10,11]}]]],[2," "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[9]}]]],[2,"\\n "]],"parameters":[8]}]]]],"parameters":[]},{"statements":[[6,[37,8],[[30,[36,7],[[32,1],"sort"],null]],null,[["default"],[{"statements":[[6,[37,6],[[32,2]],null,[["default"],[{"statements":[[2,"\\n "],[8,[32,3,["Select"]],[[24,0,"type-sort"]],[["@position","@onchange","@multiple","@required"],["right",[30,[36,3],[[32,0],[32,21,["change"]]],null],false,true]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["selected"]],[["default"],[{"statements":[[2,"\\n "],[10,"span"],[12],[2,"\\n"],[6,[37,6],[[30,[36,5],[[30,[36,4],[[30,[36,4],["CreateTime:desc",[30,[36,0],["common.sort.age.desc"],null]],null],[30,[36,4],["CreateTime:asc",[30,[36,0],["common.sort.age.asc"],null]],null]],null]],null]],null,[["default"],[{"statements":[[2," "],[1,[30,[36,2],[[32,7],[32,21,["value"]]],null]],[2,"\\n"]],"parameters":[7]}]]],[2," "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["options"]],[["default"],[{"statements":[[2,"\\n"],[6,[37,6],[[32,4,["Optgroup"]],[32,4,["Option"]]],null,[["default"],[{"statements":[[2," "],[8,[32,5],[],[["@label"],[[30,[36,0],["common.ui.creation"],null]]],[["default"],[{"statements":[[2,"\\n "],[8,[32,6],[],[["@value","@selected"],["CreateTime:desc",[30,[36,1],["CreateTime:desc",[32,21,["value"]]],null]]],[["default"],[{"statements":[[1,[30,[36,0],["common.sort.age.desc"],null]]],"parameters":[]}]]],[2,"\\n "],[8,[32,6],[],[["@value","@selected"],["CreateTime:asc",[30,[36,1],["CreateTime:asc",[32,21,["value"]]],null]]],[["default"],[{"statements":[[1,[30,[36,0],["common.sort.age.asc"],null]]],"parameters":[]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[5,6]}]]],[2," "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[4]}]]],[2,"\\n "]],"parameters":[3]}]]]],"parameters":[]}]]]],"parameters":[]}]]]],"parameters":[]}]]]],"parameters":[]}]]]],"parameters":[1,2]}]]],[2,"\\n"]],"hasEval":false,"upvars":["t","eq","get","action","array","from-entries","let","-is-named-block-invocation","if","contains","concat","-track-array","each","lowercase","hash"]}',meta:{moduleName:"consul-ui/components/consul/token/search-bar/index.hbs"}}) -var n=Ember._setComponentTemplate(t,Ember._templateOnlyComponent()) -e.default=n})),define("consul-ui/components/consul/token/selector/index",["exports","@glimmer/component"],(function(e,t){var n,r,a,l -function s(e,t,n,r,a){var l={} -return Object.keys(r).forEach((function(e){l[e]=r[e]})),l.enumerable=!!l.enumerable,l.configurable=!!l.configurable,("value"in l||l.initializer)&&(l.writable=!0),l=n.slice().reverse().reduce((function(n,r){return r(e,t,n)||n}),l),a&&void 0!==l.initializer&&(l.value=l.initializer?l.initializer.call(a):void 0,l.initializer=void 0),void 0===l.initializer&&(Object.defineProperty(e,t,l),l=null),l}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const i=Ember.HTMLBars.template({id:"lqyx1nTC",block:'{"symbols":["__arg0","__arg1","authDialog","disclosure","panel","menu","modal","authForm","authDialog","modal","authForm","@dc","@nspace","@partition","&default"],"statements":[[6,[37,4],[[30,[36,7],["use acls"],null]],null,[["default"],[{"statements":[[2," "],[10,"li"],[12],[2,"\\n\\n "],[8,"auth-dialog",[],[["@src","@sink","@onchange","@namedBlocksInfo"],[[30,[36,8],["settings://consul:token"],null],[30,[36,8],["settings://consul:token"],null],[32,0,["reauthorize"]],[30,[36,0],null,[["unauthorized","authorized"],[1,1]]]]],[["default"],[{"statements":[[6,[37,4],[[30,[36,6],[[32,1],"unauthorized"],null]],null,[["default","else"],[{"statements":[[6,[37,5],[[32,2]],null,[["default"],[{"statements":[[2,"\\n "],[8,"portal",[],[["@target"],["app-before-skip-links"]],[["default"],[{"statements":[[2,"\\n "],[8,"action",[[4,[38,2],["click",[30,[36,3],[[32,0,["modal","open"]]],null]],null]],[[],[]],[["default"],[{"statements":[[2,"\\n Login\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"action",[[4,[38,2],["click",[30,[36,3],[[32,0,["modal","open"]]],null]],null]],[[],[]],[["default"],[{"statements":[[2,"\\n Log in\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"modal-dialog",[],[["@name","@onclose","@onopen","@aria"],["login-toggle",[32,0,["close"]],[32,0,["open"]],[30,[36,0],null,[["label"],["Log in to Consul"]]]]],[["default"],[{"statements":[[2,"\\n "],[8,"ref",[],[["@target","@name","@value"],[[32,0],"modal",[32,10]]],null],[2,"\\n "],[8,"block-slot",[],[["@name"],["header"]],[["default"],[{"statements":[[2,"\\n "],[10,"h2"],[12],[2,"\\n Log in to Consul\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["body"]],[["default"],[{"statements":[[2,"\\n "],[8,"auth-form",[],[["@dc","@partition","@nspace","@onsubmit"],[[32,12,["Name"]],[32,14],[32,13],[30,[36,1],[[32,0],[32,9,["login"]]],[["value"],["data"]]]]],[["default"],[{"statements":[[2,"\\n "],[8,"ref",[],[["@target","@name","@value"],[[32,0],"authForm",[32,11]]],null],[2,"\\n"],[6,[37,4],[[30,[36,7],["use SSO"],null]],null,[["default"],[{"statements":[[2," "],[8,[32,11,["Method"]],[],[["@matches"],["sso"]],[["default"],[{"statements":[[2,"\\n "],[8,"oidc-select",[],[["@dc","@nspace","@disabled","@onchange","@onerror"],[[32,12,["Name"]],[32,13],[32,11,["disabled"]],[32,11,["submit"]],[32,11,["error"]]]],null],[2,"\\n "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[]}]]],[2," "]],"parameters":[11]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["actions"]],[["default"],[{"statements":[[2,"\\n "],[8,"action",[[4,[38,2],["click",[32,10,["close"]]],null]],[[],[]],[["default"],[{"statements":[[2,"\\n Continue without logging in\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[10]}]]],[2,"\\n "]],"parameters":[9]}]]]],"parameters":[]},{"statements":[[6,[37,4],[[30,[36,6],[[32,1],"authorized"],null]],null,[["default"],[{"statements":[[6,[37,5],[[32,2]],null,[["default"],[{"statements":[[2,"\\n "],[8,"modal-dialog",[],[["@name","@onclose","@onopen","@aria"],["login-toggle",[32,0,["close"]],[32,0,["open"]],[30,[36,0],null,[["label"],["Log in with a different token"]]]]],[["default"],[{"statements":[[2,"\\n "],[8,"ref",[],[["@target","@name","@value"],[[32,0],"modal",[32,7]]],null],[2,"\\n "],[8,"block-slot",[],[["@name"],["header"]],[["default"],[{"statements":[[2,"\\n "],[10,"h2"],[12],[2,"\\n Log in with a different token\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["body"]],[["default"],[{"statements":[[2,"\\n "],[8,"auth-form",[],[["@dc","@nspace","@partition","@onsubmit"],[[32,12,["Name"]],[32,13],[32,14],[30,[36,1],[[32,0],[32,3,["login"]]],[["value"],["data"]]]]],[["default"],[{"statements":[[2,"\\n "],[8,"ref",[],[["@target","@name","@value"],[[32,0],"authForm",[32,8]]],null],[2,"\\n "]],"parameters":[8]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["actions"]],[["default"],[{"statements":[[2,"\\n "],[8,"action",[[4,[38,2],["click",[32,7,["close"]]],null]],[[],[]],[["default"],[{"statements":[[2,"\\n Continue without logging in\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[7]}]]],[2,"\\n "],[8,"portal",[],[["@target"],["app-before-skip-links"]],[["default"],[{"statements":[[2,"\\n "],[8,"action",[[4,[38,2],["click",[30,[36,3],[[32,3,["logout"]]],null]],null]],[[],[]],[["default"],[{"statements":[[2,"\\n Logout\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"disclosure-menu",[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[8,[32,4,["Action"]],[[4,[38,2],["click",[32,4,["toggle"]]],null]],[[],[]],[["default"],[{"statements":[[2,"\\n Logout\\n "]],"parameters":[]}]]],[2,"\\n "],[8,[32,4,["Menu"]],[],[[],[]],[["default"],[{"statements":[[2,"\\n"],[6,[37,4],[[32,3,["token","AccessorID"]]],null,[["default"],[{"statements":[[2," "],[8,"auth-profile",[],[["@item"],[[32,3,["token"]]]],null],[2,"\\n"]],"parameters":[]}]]],[2," "],[8,[32,5,["Menu"]],[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[8,[32,6,["Separator"]],[],[[],[]],null],[2,"\\n "],[8,[32,6,["Item"]],[[24,0,"dangerous"]],[[],[]],[["default"],[{"statements":[[2,"\\n "],[8,[32,6,["Action"]],[[4,[38,2],["click",[30,[36,3],[[32,3,["logout"]]],null]],null]],[[],[]],[["default"],[{"statements":[[2,"\\n Logout\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[6]}]]],[2,"\\n "]],"parameters":[5]}]]],[2,"\\n "]],"parameters":[4]}]]],[2,"\\n "]],"parameters":[3]}]]]],"parameters":[]}]]]],"parameters":[]}]]]],"parameters":[1,2]}]]],[2,"\\n\\n "],[13],[2,"\\n"],[18,15,[[30,[36,0],null,[["open","close"],[[32,0,["modal","open"]],[32,0,["model","close"]]]]]]],[2,"\\n"]],"parameters":[]}]]],[2,"\\n"]],"hasEval":false,"upvars":["hash","action","on","optional","if","let","-is-named-block-invocation","can","uri"]}',meta:{moduleName:"consul-ui/components/consul/token/selector/index.hbs"}}) -let o=(n=Ember._action,r=Ember._action,a=Ember._action,s((l=class extends t.default{open(){this.authForm.focus()}close(){this.authForm.reset()}reauthorize(e){this.modal.close(),this.args.onchange(e)}}).prototype,"open",[n],Object.getOwnPropertyDescriptor(l.prototype,"open"),l.prototype),s(l.prototype,"close",[r],Object.getOwnPropertyDescriptor(l.prototype,"close"),l.prototype),s(l.prototype,"reauthorize",[a],Object.getOwnPropertyDescriptor(l.prototype,"reauthorize"),l.prototype),l) -e.default=o,Ember._setComponentTemplate(i,o)})),define("consul-ui/components/consul/tomography/graph/index",["exports","@glimmer/component"],(function(e,t){var n,r,a -function l(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const s=Ember.HTMLBars.template({id:"rK0KE41X",block:'{"symbols":["item","&attrs"],"statements":[[11,"div"],[24,0,"tomography-graph"],[17,2],[12],[2,"\\n "],[10,"svg"],[15,"width",[32,0,["size"]]],[15,"height",[32,0,["size"]]],[12],[2,"\\n "],[10,"g"],[15,"transform",[31,["translate(",[30,[36,5],[[32,0,["size"]],2],null],", ",[30,[36,5],[[32,0,["size"]],2],null],")"]]],[12],[2,"\\n "],[10,"g"],[12],[2,"\\n "],[10,"circle"],[14,0,"background"],[15,"r",[32,0,["circle","0"]]],[12],[13],[2,"\\n "],[10,"circle"],[14,0,"axis"],[15,"r",[32,0,["circle","1"]]],[12],[13],[2,"\\n "],[10,"circle"],[14,0,"axis"],[15,"r",[32,0,["circle","2"]]],[12],[13],[2,"\\n "],[10,"circle"],[14,0,"axis"],[15,"r",[32,0,["circle","3"]]],[12],[13],[2,"\\n "],[10,"circle"],[14,0,"border"],[15,"r",[32,0,["circle","4"]]],[12],[13],[2,"\\n "],[13],[2,"\\n "],[10,"g"],[14,0,"lines"],[12],[2,"\\n"],[6,[37,7],[[30,[36,6],[[30,[36,6],[[32,0,["distances"]]],null]],null]],null,[["default"],[{"statements":[[2," "],[11,"rect"],[16,"transform",[31,["rotate(",[32,1,["rotate"]],")"]]],[16,"width",[32,1,["y2"]]],[24,"height","1"],[4,[38,4],[[30,[36,1],[[32,1,["node"]]," - ",[30,[36,3],[[32,1,["distance"]]],[["maximumFractionDigits"],[2]]],"ms",[30,[36,2],[[32,1,["segment"]],[30,[36,1],["
      (Segment: ",[32,1,["segment"]],")"],null]],null]],null]],[["options"],[[30,[36,0],null,[["followCursor","allowHTML"],[true,true]]]]]],[12],[13],[2,"\\n"]],"parameters":[1]}]]],[2," "],[13],[2,"\\n "],[10,"g"],[14,0,"labels"],[12],[2,"\\n "],[10,"circle"],[14,0,"point"],[14,"r","5"],[12],[13],[2,"\\n "],[10,"g"],[14,0,"tick"],[15,"transform",[31,["translate(0, ",[32,0,["labels","0"]],")"]]],[12],[2,"\\n "],[10,"line"],[14,"x2","70"],[12],[13],[2,"\\n "],[10,"text"],[14,"x","75"],[14,"y","0"],[14,"dy",".32em"],[12],[1,[30,[36,3],[[32,0,["milliseconds","0"]]],[["maximumFractionDigits"],[2]]]],[2,"ms"],[13],[2,"\\n "],[13],[2,"\\n "],[10,"g"],[14,0,"tick"],[15,"transform",[31,["translate(0, ",[32,0,["labels","1"]],")"]]],[12],[2,"\\n "],[10,"line"],[14,"x2","70"],[12],[13],[2,"\\n "],[10,"text"],[14,"x","75"],[14,"y","0"],[14,"dy",".32em"],[12],[1,[30,[36,3],[[32,0,["milliseconds","1"]]],[["maximumFractionDigits"],[2]]]],[2,"ms"],[13],[2,"\\n "],[13],[2,"\\n "],[10,"g"],[14,0,"tick"],[15,"transform",[31,["translate(0, ",[32,0,["labels","2"]],")"]]],[12],[2,"\\n "],[10,"line"],[14,"x2","70"],[12],[13],[2,"\\n "],[10,"text"],[14,"x","75"],[14,"y","0"],[14,"dy",".32em"],[12],[1,[30,[36,3],[[32,0,["milliseconds","2"]]],[["maximumFractionDigits"],[2]]]],[2,"ms"],[13],[2,"\\n "],[13],[2,"\\n "],[10,"g"],[14,0,"tick"],[15,"transform",[31,["translate(0, ",[32,0,["labels","3"]],")"]]],[12],[2,"\\n "],[10,"line"],[14,"x2","70"],[12],[13],[2,"\\n "],[10,"text"],[14,"x","75"],[14,"y","0"],[14,"dy",".32em"],[12],[1,[30,[36,3],[[32,0,["milliseconds","3"]]],[["maximumFractionDigits"],[2]]]],[2,"ms"],[13],[2,"\\n "],[13],[2,"\\n "],[13],[2,"\\n "],[13],[2,"\\n "],[13],[2,"\\n"],[13],[2,"\\n"]],"hasEval":false,"upvars":["hash","concat","if","format-number","tooltip","div","-track-array","each"]}',meta:{moduleName:"consul-ui/components/consul/tomography/graph/index.hbs"}}),i=function(e){return 160*e} -let o=(n=Ember._tracked,r=class extends t.default{constructor(...e){var t,n,r,s -super(...e),t=this,n="max",s=this,(r=a)&&Object.defineProperty(t,n,{enumerable:r.enumerable,configurable:r.configurable,writable:r.writable,value:r.initializer?r.initializer.call(s):void 0}),l(this,"size",336),l(this,"circle",[i(1),i(.25),i(.5),i(.75),i(1)]),l(this,"labels",[i(-.25),i(-.5),i(-.75),i(-1)])}get milliseconds(){const e=(this.args.distances||[]).reduce((e,t)=>Math.max(e,t.distance),this.max) -return[25,50,75,100].map(t=>function(e,t){return t>0?parseInt(t*e)/100:0}(t,e))}get distances(){let e=this.args.distances||[] -const t=e.reduce((e,t)=>Math.max(e,t.distance),this.max),n=e.length -if(n>360){const t=360/n -e=e.filter((function(e,r){return 0==r||r==n-1||Math.random()({rotate:360*r/e.length,y2:n.distance/t*160,node:n.node,distance:n.distance,segment:n.segment}))}},u=r.prototype,c="max",d=[n],m={configurable:!0,enumerable:!0,writable:!0,initializer:function(){return-999999999}},f={},Object.keys(m).forEach((function(e){f[e]=m[e]})),f.enumerable=!!f.enumerable,f.configurable=!!f.configurable,("value"in f||f.initializer)&&(f.writable=!0),f=d.slice().reverse().reduce((function(e,t){return t(u,c,e)||e}),f),p&&void 0!==f.initializer&&(f.value=f.initializer?f.initializer.call(p):void 0,f.initializer=void 0),void 0===f.initializer&&(Object.defineProperty(u,c,f),f=null),a=f,r) -var u,c,d,m,p,f -e.default=o,Ember._setComponentTemplate(s,o)})),define("consul-ui/components/consul/transparent-proxy/index",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const t=Ember.HTMLBars.template({id:"+31LUgoZ",block:'{"symbols":[],"statements":[[10,"span"],[14,0,"consul-transparent-proxy"],[12],[2,"\\n "],[1,[30,[36,0],["components.consul.transparent-proxy"],null]],[2,"\\n"],[13]],"hasEval":false,"upvars":["t"]}',meta:{moduleName:"consul-ui/components/consul/transparent-proxy/index.hbs"}}) -var n=Ember._setComponentTemplate(t,Ember._templateOnlyComponent()) -e.default=n})),define("consul-ui/components/consul/upstream-instance/list/index",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const t=Ember.HTMLBars.template({id:"Xj0kgGX9",block:'{"symbols":["item","combinedAddress","@partition","@nspace","@dc","&attrs","@items"],"statements":[[11,"div"],[24,0,"consul-upstream-instance-list"],[17,6],[12],[2,"\\n "],[10,"ul"],[12],[2,"\\n"],[6,[37,10],[[30,[36,9],[[30,[36,9],[[32,7]],null]],null]],null,[["default"],[{"statements":[[2," "],[10,"li"],[12],[2,"\\n\\n "],[10,"div"],[14,0,"header"],[12],[2,"\\n "],[10,"p"],[12],[2,"\\n "],[1,[32,1,["DestinationName"]]],[2,"\\n "],[13],[2,"\\n "],[13],[2,"\\n\\n "],[10,"div"],[14,0,"detail"],[12],[2,"\\n\\n"],[6,[37,4],[[30,[36,7],[[32,1,["DestinationType"]],"prepared_query"],null]],null,[["default"],[{"statements":[[2," "],[8,"consul/bucket/list",[],[["@item","@partition","@nspace"],[[30,[36,6],null,[["Namespace","Partition"],[[30,[36,0],[[32,1,["DestinationNamespace"]],[32,4]],null],[30,[36,0],[[32,1,["DestinationPartition"]],[32,3]],null]]]],[32,3],[32,4]]],null],[2,"\\n"]],"parameters":[]}]]],[2,"\\n"],[6,[37,4],[[30,[36,8],[[30,[36,7],[[32,1,["Datacenter"]],[32,5]],null],[30,[36,7],[[32,1,["Datacenter"]],""],null]],null]],null,[["default"],[{"statements":[[2," "],[10,"dl"],[14,0,"datacenter"],[12],[2,"\\n "],[11,"dt"],[4,[38,5],null,null],[12],[2,"\\n Datacenter\\n "],[13],[2,"\\n "],[10,"dd"],[12],[2,"\\n "],[1,[32,1,["Datacenter"]]],[2,"\\n "],[13],[2,"\\n "],[13],[2,"\\n"]],"parameters":[]}]]],[2,"\\n"],[6,[37,4],[[32,1,["LocalBindSocketPath"]]],null,[["default","else"],[{"statements":[[2," "],[10,"dl"],[14,0,"local-bind-socket-path"],[12],[2,"\\n "],[10,"dt"],[12],[2,"\\n Local bind socket path\\n "],[13],[2,"\\n "],[10,"dd"],[12],[2,"\\n "],[8,"copy-button",[],[["@value","@name"],[[32,1,["LocalBindSocketPath"]],"Local bind socket path"]],null],[2,"\\n "],[1,[32,1,["LocalBindSocketPath"]]],[2,"\\n "],[13],[2,"\\n "],[13],[2,"\\n "],[10,"dl"],[14,0,"local-bind-socket-mode"],[12],[2,"\\n "],[10,"dt"],[12],[2,"\\n Mode\\n "],[13],[2,"\\n "],[10,"dd"],[12],[2,"\\n "],[1,[30,[36,0],[[32,1,["LocalBindSocketMode"]],"-"],null]],[2,"\\n "],[13],[2,"\\n "],[13],[2,"\\n"]],"parameters":[]},{"statements":[[2,"\\n"],[6,[37,4],[[30,[36,3],[[32,1,["LocalBindPort"]],0],null]],null,[["default"],[{"statements":[[6,[37,2],[[30,[36,1],[[30,[36,0],[[32,1,["LocalBindAddress"]],"127.0.0.1"],null],":",[32,1,["LocalBindPort"]]],null]],null,[["default"],[{"statements":[[2," "],[10,"dl"],[14,0,"local-bind-address"],[12],[2,"\\n "],[10,"dt"],[12],[2,"\\n Address\\n "],[13],[2,"\\n "],[10,"dd"],[12],[2,"\\n "],[8,"copy-button",[],[["@value","@name"],[[32,2],"Address"]],null],[2,"\\n "],[1,[32,2]],[2,"\\n "],[13],[2,"\\n "],[13],[2,"\\n"]],"parameters":[2]}]]]],"parameters":[]}]]],[2,"\\n"]],"parameters":[]}]]],[2,"\\n "],[13],[2,"\\n "],[13],[2,"\\n"]],"parameters":[1]}]]],[2," "],[13],[2,"\\n"],[13],[2,"\\n"]],"hasEval":false,"upvars":["or","concat","let","gt","if","tooltip","hash","not-eq","and","-track-array","each"]}',meta:{moduleName:"consul-ui/components/consul/upstream-instance/list/index.hbs"}}) -var n=Ember._setComponentTemplate(t,Ember._templateOnlyComponent()) -e.default=n})) -define("consul-ui/components/consul/upstream-instance/search-bar/index",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const t=Ember.HTMLBars.template({id:"FXiYZK0f",block:'{"symbols":["__arg0","__arg1","search","components","Optgroup","Option","selectable","search","components","Optgroup","Option","prop","search","key","value","@sort","@filter","@onsearch","@search","&attrs"],"statements":[[8,"search-bar",[[24,0,"consul-upstream-instance-search-bar"],[17,20]],[["@filter","@namedBlocksInfo"],[[32,17],[30,[36,14],null,[["status","search","sort"],[1,1,1]]]]],[["default"],[{"statements":[[6,[37,8],[[30,[36,7],[[32,1],"status"],null]],null,[["default","else"],[{"statements":[[6,[37,6],[[32,2]],null,[["default"],[{"statements":[[2,"\\n\\n"],[6,[37,6],[[30,[36,1],[[30,[36,11],["components.consul.upstream-instance.search-bar.",[32,13,["status","key"]],".name"],null]],[["default"],[[30,[36,4],[[30,[36,11],["common.search.",[32,13,["status","key"]]],null],[30,[36,11],["common.consul.",[32,13,["status","key"]]],null]],null]]]],[30,[36,1],[[30,[36,11],["components.consul.upstream-instance.search-bar.",[32,13,["status","value"]],".name"],null]],[["default"],[[30,[36,4],[[30,[36,11],["common.search.",[32,13,["status","value"]]],null],[30,[36,11],["common.consul.",[32,13,["status","value"]]],null],[30,[36,11],["common.brand.",[32,13,["status","value"]]],null]],null]]]]],null,[["default"],[{"statements":[[2," "],[8,[32,13,["RemoveFilter"]],[[16,"aria-label",[30,[36,1],["common.ui.remove"],[["item"],[[30,[36,11],[[32,14]," ",[32,15]],null]]]]]],[[],[]],[["default"],[{"statements":[[2,"\\n "],[10,"dl"],[12],[2,"\\n "],[10,"dt"],[12],[1,[32,14]],[13],[2,"\\n "],[10,"dd"],[12],[1,[32,15]],[13],[2,"\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[14,15]}]]],[2,"\\n "]],"parameters":[13]}]]]],"parameters":[]},{"statements":[[6,[37,8],[[30,[36,7],[[32,1],"search"],null]],null,[["default","else"],[{"statements":[[6,[37,6],[[32,2]],null,[["default"],[{"statements":[[2,"\\n "],[8,[32,8,["Search"]],[],[["@onsearch","@value","@placeholder"],[[30,[36,3],[[32,0],[32,18]],null],[32,19],[30,[36,1],["common.search.search"],null]]],[["default"],[{"statements":[[2,"\\n "],[8,[32,8,["Select"]],[[24,0,"type-search-properties"]],[["@position","@onchange","@multiple","@required"],["right",[30,[36,3],[[32,0],[32,17,["searchproperty","change"]]],null],true,true]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["selected"]],[["default"],[{"statements":[[2,"\\n "],[10,"span"],[12],[2,"\\n "],[1,[30,[36,1],["common.search.searchproperty"],null]],[2,"\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["options"]],[["default"],[{"statements":[[2,"\\n"],[6,[37,6],[[32,9,["Optgroup"]],[32,9,["Option"]]],null,[["default"],[{"statements":[[6,[37,13],[[30,[36,12],[[30,[36,12],[[32,17,["searchproperty","default"]]],null]],null]],null,[["default"],[{"statements":[[2," "],[8,[32,11],[],[["@value","@selected"],[[32,12],[30,[36,9],[[32,12],[32,17,["searchproperty","value"]]],null]]],[["default"],[{"statements":[[2,"\\n "],[1,[30,[36,1],[[30,[36,11],["common.consul.",[30,[36,10],[[32,12]],null]],null]],null]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[12]}]]]],"parameters":[10,11]}]]],[2," "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[9]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[8]}]]]],"parameters":[]},{"statements":[[6,[37,8],[[30,[36,7],[[32,1],"sort"],null]],null,[["default"],[{"statements":[[6,[37,6],[[32,2]],null,[["default"],[{"statements":[[2,"\\n "],[8,[32,3,["Select"]],[[24,0,"type-sort"]],[["@position","@onchange","@multiple","@required"],["right",[30,[36,3],[[32,0],[32,16,["change"]]],null],false,true]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["selected"]],[["default"],[{"statements":[[2,"\\n "],[10,"span"],[12],[2,"\\n"],[6,[37,6],[[30,[36,5],[[30,[36,4],[[30,[36,4],["DestinationName:asc",[30,[36,1],["common.sort.alpha.asc"],null]],null],[30,[36,4],["DestinationName:desc",[30,[36,1],["common.sort.alpha.desc"],null]],null]],null]],null]],null,[["default"],[{"statements":[[2," "],[1,[30,[36,2],[[32,7],[32,16,["value"]]],null]],[2,"\\n"]],"parameters":[7]}]]],[2," "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["options"]],[["default"],[{"statements":[[2,"\\n"],[6,[37,6],[[32,4,["Optgroup"]],[32,4,["Option"]]],null,[["default"],[{"statements":[[2," "],[8,[32,6],[],[["@value","@selected"],["DestinationName:asc",[30,[36,0],["DestinationName:asc",[32,16,["value"]]],null]]],[["default"],[{"statements":[[1,[30,[36,1],["common.sort.alpha.asc"],null]]],"parameters":[]}]]],[2,"\\n "],[8,[32,6],[],[["@value","@selected"],["DestinationName:desc",[30,[36,0],["DestinationName:desc",[32,16,["value"]]],null]]],[["default"],[{"statements":[[1,[30,[36,1],["common.sort.alpha.desc"],null]]],"parameters":[]}]]],[2,"\\n"]],"parameters":[5,6]}]]],[2," "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[4]}]]],[2,"\\n "]],"parameters":[3]}]]]],"parameters":[]}]]]],"parameters":[]}]]]],"parameters":[]}]]]],"parameters":[1,2]}]]],[2,"\\n"]],"hasEval":false,"upvars":["eq","t","get","action","array","from-entries","let","-is-named-block-invocation","if","contains","lowercase","concat","-track-array","each","hash"]}',meta:{moduleName:"consul-ui/components/consul/upstream-instance/search-bar/index.hbs"}}) -var n=Ember._setComponentTemplate(t,Ember._templateOnlyComponent()) -e.default=n})),define("consul-ui/components/consul/upstream/list/index",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const t=Ember.HTMLBars.template({id:"qkxQac+l",block:'{"symbols":["item","index","address","@nspace","@partition","&attrs","@items"],"statements":[[8,"list-collection",[[24,0,"consul-upstream-list"],[17,6]],[["@items","@linkable"],[[32,7],"linkable upstream"]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["header"]],[["default"],[{"statements":[[2,"\\n"],[6,[37,1],[[30,[36,6],[[32,1,["InstanceCount"]],0],null]],null,[["default","else"],[{"statements":[[2," "],[10,"dl"],[15,0,[32,1,["MeshStatus"]]],[12],[2,"\\n "],[10,"dt"],[12],[2,"\\n Health\\n "],[13],[2,"\\n "],[11,"dd"],[4,[38,2],null,null],[12],[2,"\\n"],[6,[37,1],[[30,[36,0],["critical",[32,1,["MeshStatus"]]],null]],null,[["default","else"],[{"statements":[[2," At least one health check on one instance is failing.\\n"]],"parameters":[]},{"statements":[[6,[37,1],[[30,[36,0],["warning",[32,1,["MeshStatus"]]],null]],null,[["default","else"],[{"statements":[[2," At least one health check on one instance has a warning.\\n"]],"parameters":[]},{"statements":[[6,[37,1],[[30,[36,0],["passing",[32,1,["MeshStatus"]]],null]],null,[["default","else"],[{"statements":[[2," All health checks are passing.\\n"]],"parameters":[]},{"statements":[[2," There are no health checks.\\n "]],"parameters":[]}]]]],"parameters":[]}]]]],"parameters":[]}]]],[2," "],[13],[2,"\\n "],[13],[2,"\\n "],[10,"a"],[15,6,[30,[36,5],["dc.services.show",[32,1,["Name"]]],[["params"],[[30,[36,1],[[30,[36,4],[[32,1,["Partition"]],[32,5]],null],[30,[36,3],null,[["partition","nspace"],[[32,1,["Partition"]],[32,1,["Namespace"]]]]],[30,[36,1],[[30,[36,4],[[32,1,["Namespace"]],[32,4]],null],[30,[36,3],null,[["nspace"],[[32,1,["Namespace"]]]]],[30,[36,3],null,null]],null]],null]]]]],[12],[2,"\\n "],[1,[32,1,["Name"]]],[2,"\\n "],[13],[2,"\\n"]],"parameters":[]},{"statements":[[2," "],[10,"p"],[12],[2,"\\n "],[1,[32,1,["Name"]]],[2,"\\n "],[13],[2,"\\n"]],"parameters":[]}]]],[2," "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["details"]],[["default"],[{"statements":[[2,"\\n "],[8,"consul/bucket/list",[],[["@item","@nspace","@partition"],[[32,1],[32,4],[32,5]]],null],[2,"\\n"],[6,[37,8],[[30,[36,7],[[30,[36,7],[[32,1,["GatewayConfig","Addresses"]]],null]],null]],null,[["default"],[{"statements":[[2," "],[10,"dl"],[12],[2,"\\n "],[10,"dt"],[12],[2,"\\n Address\\n "],[13],[2,"\\n "],[10,"dd"],[12],[2,"\\n "],[8,"copy-button",[],[["@value","@name"],[[32,3],"Address"]],null],[2,"\\n "],[1,[32,3]],[2,"\\n "],[13],[2,"\\n "],[13],[2,"\\n"]],"parameters":[3]}]]],[2," "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[1,2]}]]],[2,"\\n"]],"hasEval":false,"upvars":["eq","if","tooltip","hash","not-eq","href-to","gt","-track-array","each"]}',meta:{moduleName:"consul-ui/components/consul/upstream/list/index.hbs"}}) -var n=Ember._setComponentTemplate(t,Ember._templateOnlyComponent()) -e.default=n})),define("consul-ui/components/consul/upstream/search-bar/index",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const t=Ember.HTMLBars.template({id:"BotuftEI",block:'{"symbols":["__arg0","__arg1","search","components","Optgroup","Option","selectable","search","components","Optgroup","Option","item","search","components","Optgroup","Option","prop","search","key","value","@sort","@filter","@onsearch","@search","&attrs"],"statements":[[8,"search-bar",[[24,0,"consul-upstream-search-bar"],[17,25]],[["@filter","@namedBlocksInfo"],[[32,22],[30,[36,14],null,[["status","search","filter","sort"],[1,1,1,1]]]]],[["default"],[{"statements":[[6,[37,8],[[30,[36,7],[[32,1],"status"],null]],null,[["default","else"],[{"statements":[[6,[37,6],[[32,2]],null,[["default"],[{"statements":[[2,"\\n\\n"],[6,[37,6],[[30,[36,0],[[30,[36,10],["components.consul.upstream.search-bar.",[32,18,["status","key"]],".name"],null]],[["default"],[[30,[36,4],[[30,[36,10],["common.search.",[32,18,["status","key"]]],null],[30,[36,10],["common.consul.",[32,18,["status","key"]]],null]],null]]]],[30,[36,0],[[30,[36,10],["components.consul.upstream.search-bar.",[32,18,["status","value"]],".name"],null]],[["default"],[[30,[36,4],[[30,[36,10],["common.search.",[32,18,["status","value"]]],null],[30,[36,10],["common.consul.",[32,18,["status","value"]]],null],[30,[36,10],["common.brand.",[32,18,["status","value"]]],null]],null]]]]],null,[["default"],[{"statements":[[2," "],[8,[32,18,["RemoveFilter"]],[[16,"aria-label",[30,[36,0],["common.ui.remove"],[["item"],[[30,[36,10],[[32,19]," ",[32,20]],null]]]]]],[[],[]],[["default"],[{"statements":[[2,"\\n "],[10,"dl"],[12],[2,"\\n "],[10,"dt"],[12],[1,[32,19]],[13],[2,"\\n "],[10,"dd"],[12],[1,[32,20]],[13],[2,"\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[19,20]}]]],[2,"\\n "]],"parameters":[18]}]]]],"parameters":[]},{"statements":[[6,[37,8],[[30,[36,7],[[32,1],"search"],null]],null,[["default","else"],[{"statements":[[6,[37,6],[[32,2]],null,[["default"],[{"statements":[[2,"\\n "],[8,[32,13,["Search"]],[],[["@onsearch","@value","@placeholder"],[[30,[36,3],[[32,0],[32,23]],null],[32,24],[30,[36,0],["common.search.search"],null]]],[["default"],[{"statements":[[2,"\\n "],[8,[32,13,["Select"]],[[24,0,"type-search-properties"]],[["@position","@onchange","@multiple","@required"],["right",[30,[36,3],[[32,0],[32,22,["searchproperty","change"]]],null],true,true]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["selected"]],[["default"],[{"statements":[[2,"\\n "],[10,"span"],[12],[2,"\\n "],[1,[30,[36,0],["common.search.searchproperty"],null]],[2,"\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["options"]],[["default"],[{"statements":[[2,"\\n"],[6,[37,6],[[32,14,["Optgroup"]],[32,14,["Option"]]],null,[["default"],[{"statements":[[6,[37,12],[[30,[36,11],[[30,[36,11],[[32,22,["searchproperty","default"]]],null]],null]],null,[["default"],[{"statements":[[2," "],[8,[32,16],[],[["@value","@selected"],[[32,17],[30,[36,9],[[32,17],[32,22,["searchproperty","value"]]],null]]],[["default"],[{"statements":[[2,"\\n "],[1,[30,[36,0],[[30,[36,10],["common.consul.",[30,[36,13],[[32,17]],null]],null]],null]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[17]}]]]],"parameters":[15,16]}]]],[2," "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[14]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[13]}]]]],"parameters":[]},{"statements":[[6,[37,8],[[30,[36,7],[[32,1],"filter"],null]],null,[["default","else"],[{"statements":[[6,[37,6],[[32,2]],null,[["default"],[{"statements":[[2,"\\n "],[8,[32,8,["Select"]],[],[["@position","@onchange","@multiple"],["left",[30,[36,3],[[32,0],[32,22,["instance","change"]]],null],true]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["selected"]],[["default"],[{"statements":[[2,"\\n "],[10,"span"],[12],[2,"\\n "],[1,[30,[36,0],["components.consul.upstream.search-bar.instance.name"],null]],[2,"\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["options"]],[["default"],[{"statements":[[2,"\\n"],[6,[37,6],[[32,9,["Optgroup"]],[32,9,["Option"]]],null,[["default"],[{"statements":[[6,[37,12],[[30,[36,11],[[30,[36,11],[[30,[36,4],["registered","not-registered"],null]],null]],null]],null,[["default"],[{"statements":[[2," "],[8,[32,11],[],[["@value","@selected"],[[32,12],[30,[36,9],[[32,12],[32,22,["instance","value"]]],null]]],[["default"],[{"statements":[[2,"\\n "],[1,[30,[36,0],[[30,[36,10],["common.consul.",[32,12]],null]],null]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[12]}]]]],"parameters":[10,11]}]]],[2," "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[9]}]]],[2,"\\n "]],"parameters":[8]}]]]],"parameters":[]},{"statements":[[6,[37,8],[[30,[36,7],[[32,1],"sort"],null]],null,[["default"],[{"statements":[[6,[37,6],[[32,2]],null,[["default"],[{"statements":[[2,"\\n "],[8,[32,3,["Select"]],[[24,0,"type-sort"]],[["@position","@onchange","@multiple","@required"],["right",[30,[36,3],[[32,0],[32,21,["change"]]],null],false,true]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["selected"]],[["default"],[{"statements":[[2,"\\n "],[10,"span"],[12],[2,"\\n"],[6,[37,6],[[30,[36,5],[[30,[36,4],[[30,[36,4],["Name:asc",[30,[36,0],["common.sort.alpha.asc"],null]],null],[30,[36,4],["Name:desc",[30,[36,0],["common.sort.alpha.desc"],null]],null],[30,[36,4],["Status:asc",[30,[36,0],["common.sort.status.asc"],null]],null],[30,[36,4],["Status:desc",[30,[36,0],["common.sort.status.desc"],null]],null]],null]],null]],null,[["default"],[{"statements":[[2," "],[1,[30,[36,2],[[32,7],[32,21,["value"]]],null]],[2,"\\n"]],"parameters":[7]}]]],[2," "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["options"]],[["default"],[{"statements":[[2,"\\n"],[6,[37,6],[[32,4,["Optgroup"]],[32,4,["Option"]]],null,[["default"],[{"statements":[[2," "],[8,[32,5],[],[["@label"],[[30,[36,0],["common.consul.status"],null]]],[["default"],[{"statements":[[2,"\\n "],[8,[32,6],[],[["@value","@selected"],["Status:asc",[30,[36,1],["Status:asc",[32,21,["value"]]],null]]],[["default"],[{"statements":[[1,[30,[36,0],["common.sort.status.asc"],null]]],"parameters":[]}]]],[2,"\\n "],[8,[32,6],[],[["@value","@selected"],["Status:desc",[30,[36,1],["Status:desc",[32,21,["value"]]],null]]],[["default"],[{"statements":[[1,[30,[36,0],["common.sort.status.desc"],null]]],"parameters":[]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,[32,5],[],[["@label"],[[30,[36,0],["common.consul.service-name"],null]]],[["default"],[{"statements":[[2,"\\n "],[8,[32,6],[],[["@value","@selected"],["Name:asc",[30,[36,1],["Name:asc",[32,21,["value"]]],null]]],[["default"],[{"statements":[[1,[30,[36,0],["common.sort.alpha.asc"],null]]],"parameters":[]}]]],[2,"\\n "],[8,[32,6],[],[["@value","@selected"],["Name:desc",[30,[36,1],["Name:desc",[32,21,["value"]]],null]]],[["default"],[{"statements":[[1,[30,[36,0],["common.sort.alpha.desc"],null]]],"parameters":[]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[5,6]}]]],[2," "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[4]}]]],[2,"\\n "]],"parameters":[3]}]]]],"parameters":[]}]]]],"parameters":[]}]]]],"parameters":[]}]]]],"parameters":[]}]]]],"parameters":[1,2]}]]],[2,"\\n"]],"hasEval":false,"upvars":["t","eq","get","action","array","from-entries","let","-is-named-block-invocation","if","contains","concat","-track-array","each","lowercase","hash"]}',meta:{moduleName:"consul-ui/components/consul/upstream/search-bar/index.hbs"}}) -var n=Ember._setComponentTemplate(t,Ember._templateOnlyComponent()) -e.default=n})),define("consul-ui/components/copy-button/chart.xstate",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -e.default={id:"copy-button",initial:"idle",on:{RESET:[{target:"idle"}]},states:{idle:{on:{SUCCESS:[{target:"success"}],ERROR:[{target:"error"}]}},success:{},error:{}}}})),define("consul-ui/components/copy-button/index",["exports","@glimmer/component","consul-ui/components/copy-button/chart.xstate"],(function(e,t,n){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const r=Ember.HTMLBars.template({id:"wLwVUwEq",block:'{"symbols":["State","Guard","Action","dispatch","state","success","error","reset","@name","&attrs","@value","&default"],"statements":[[8,"state-chart",[],[["@src"],[[32,0,["chart"]]]],[["default"],[{"statements":[[2,"\\n "],[11,"div"],[24,0,"copy-button"],[17,10],[12],[2,"\\n"],[6,[37,9],[[30,[36,8],[[32,4],"SUCCESS"],null],[30,[36,8],[[32,4],"ERROR"],null],[30,[36,8],[[32,4],"RESET"],null]],null,[["default"],[{"statements":[[2," "],[11,"button"],[16,"aria-label",[30,[36,0],["components.copy-button.title"],[["name"],[[32,9]]]]],[24,0,"copy-btn"],[17,10],[24,4,"button"],[4,[38,1],[[32,11]],[["success","error"],[[32,6],[32,7]]]],[4,[38,7],[[30,[36,6],[[30,[36,3],[[32,5],"success"],null],[30,[36,0],["components.copy-button.success"],[["name"],[[32,9]]]],[30,[36,0],["components.copy-button.error"],null]],null]],[["options"],[[30,[36,5],null,[["trigger","showOnCreate","delay","onHidden"],["manual",[30,[36,4],[[30,[36,3],[[32,5],"idle"],null]],null],[30,[36,2],[0,3000],null],[32,8]]]]]]],[12],[18,12,null],[13],[2,"\\n"]],"parameters":[6,7,8]}]]],[2," "],[13],[2,"\\n"]],"parameters":[1,2,3,4,5]}]]],[2,"\\n"]],"hasEval":false,"upvars":["t","with-copyable","array","state-matches","not","hash","if","tooltip","fn","let"]}',meta:{moduleName:"consul-ui/components/copy-button/index.hbs"}}) -class a extends t.default{constructor(){super(...arguments),this.chart=n.default}}e.default=a,Ember._setComponentTemplate(r,a)})),define("consul-ui/components/custom-element/index",["exports","@glimmer/component"],(function(e,t){var n,r,a,l,s,i,o,u -function c(e,t){var n=Object.keys(e) -if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e) -t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function d(e){for(var t=1;t{let n=e.type -const r=e.default -switch(t=null==t?e.default:t,-1!==n.indexOf("|")&&(n="string"),n){case"":case"":case"":case"number":{const e=parseFloat(t) -return isNaN(e)?void 0===r?0:r:e}case"":return parseInt(t) -case"":case"string":return(t||"").toString()}},g=(e,t=HTMLElement,n={},r={})=>{const a=Object.keys(n) -return customElements.define(e,class extends t{static get observedAttributes(){return a}attributeChangedCallback(e,t,a){const l=y(n[e],t),s=y(n[e],a),i=r["--"+e] -void 0!==i&&i.track===`[${e}]`&&this.style.setProperty("--"+e,s),"function"==typeof super.attributeChangedCallback&&super.attributeChangedCallback(e,l,s),this.dispatchEvent(new CustomEvent("custom-element.attributeChange",{detail:{name:e,previousValue:l,value:s}}))}}),()=>{}},O=(e,t)=>(e||[]).reduce((e,n)=>{let r -const a={} -return t.forEach((e,t)=>{"_"!==e?a[e]=n[t]:r=t}),e[n[r]]=a,e},{}) -let _=(n=Ember._tracked,r=Ember._tracked,a=Ember._action,l=Ember._action,s=Ember._action,i=class extends t.default{constructor(e,t){if(super(...arguments),m(this,"$element",o,this),m(this,"_attributes",u,this),p(this,"__attributes",void 0),p(this,"_attchange",void 0),!h.has(t.element)){const e=g(t.element,t.class,O(t.attrs,["_","type","default","description"]),O(t.cssprops,["_","type","track","description"])) -h.set(t.element,e)}}get attributes(){return this._attributes}get element(){if(this.$element){if(v.has(this.$element))return v.get(this.$element) -const n=(e=this.$element,t=this,new Proxy(e,{get:(e,n)=>{switch(n){case"attrs":return t.attributes -default:if("function"==typeof e[n])return e[n].bind(e)}}})) -return v.set(this.$element,n),n}var e,t}setHost(e,t){e(t),this.$element=t,this.$element.addEventListener("custom-element.attributeChange",this.attributeChange),(this.args.attrs||[]).forEach(e=>{const n=t.getAttribute(e[0]) -t.attributeChangedCallback(e[0],n,n)})}disconnect(){this.$element.removeEventListener("custom-element.attributeChange",this.attributeChange)}attributeChange(e){var t,n -e.stopImmediatePropagation(),this.__attributes=d(d({},this.__attributes),{},{[e.detail.name]:e.detail.value}),this._attchange=(t=()=>{this._attributes=this.__attributes},void 0!==(n=this._attchange)&&cancelAnimationFrame(n),requestAnimationFrame(t))}},o=f(i.prototype,"$element",[n],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),u=f(i.prototype,"_attributes",[r],{configurable:!0,enumerable:!0,writable:!0,initializer:function(){return{}}}),f(i.prototype,"setHost",[a],Object.getOwnPropertyDescriptor(i.prototype,"setHost"),i.prototype),f(i.prototype,"disconnect",[l],Object.getOwnPropertyDescriptor(i.prototype,"disconnect"),i.prototype),f(i.prototype,"attributeChange",[s],Object.getOwnPropertyDescriptor(i.prototype,"attributeChange"),i.prototype),i) -e.default=_,Ember._setComponentTemplate(b,_)})),define("consul-ui/components/data-collection/index",["exports","@glimmer/component"],(function(e,t){var n,r,a,l,s,i,o,u,c,d,m,p,f,b,h,v,y,g,O -function _(e,t,n,r){n&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(r):void 0})}function P(e,t,n,r,a){var l={} -return Object.keys(r).forEach((function(e){l[e]=r[e]})),l.enumerable=!!l.enumerable,l.configurable=!!l.configurable,("value"in l||l.initializer)&&(l.writable=!0),l=n.slice().reverse().reduce((function(n,r){return r(e,t,n)||n}),l),a&&void 0!==l.initializer&&(l.value=l.initializer?l.initializer.call(a):void 0,l.initializer=void 0),void 0===l.initializer&&(Object.defineProperty(e,t,l),l=null),l}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const w=Ember.HTMLBars.template({id:"V00/q7z+",block:'{"symbols":["@search","&default"],"statements":[[1,[30,[36,3],[[30,[36,2],[[32,0],[30,[36,1],[[30,[36,0],[[32,0],"term"],null],""],null],[32,1]],null]],null]],[2,"\\n"],[18,2,[[30,[36,8],null,[["search","items","Collection","Empty"],[[30,[36,2],[[32,0],[32,0,["search"]]],null],[32,0,["items"]],[30,[36,6],[[30,[36,7],[[32,0,["items","length"]],0],null],[30,[36,4],["anonymous"],null],""],null],[30,[36,6],[[30,[36,5],[[32,0,["items","length"]],0],null],[30,[36,4],["anonymous"],null],""],null]]]]]],[2,"\\n"]],"hasEval":false,"upvars":["set","fn","action","did-update","component","eq","if","gt","hash"]}',meta:{moduleName:"consul-ui/components/data-collection/index.hbs"}}) -let E=(n=Ember.inject.service("filter"),r=Ember.inject.service("sort"),a=Ember.inject.service("search"),l=Ember._tracked,s=Ember.computed.alias("searchService.searchables"),i=Ember.computed("term","args.search"),o=Ember.computed("type","searchMethod","filtered","args.filters"),u=Ember.computed("type","args.sort"),c=Ember.computed("comparator","searched"),d=Ember.computed("searchTerm","searchable","filtered"),m=Ember.computed("type","content","args.filters"),p=Ember.computed("args.{items.[],items.content.[]}"),f=Ember._action,b=class extends t.default{constructor(...e){super(...e),_(this,"filter",h,this),_(this,"sort",v,this),_(this,"searchService",y,this),_(this,"term",g,this),_(this,"searchableMap",O,this)}get type(){return this.args.type}get searchMethod(){return this.args.searchable||"exact"}get searchProperties(){return this.args.filters.searchproperties}get searchTerm(){return this.term||this.args.search||""}get searchable(){const e=Ember.get(this,"args.filters.searchproperty.value")||Ember.get(this,"args.filters.searchproperty") -return new("string"==typeof this.searchMethod?this.searchableMap[this.searchMethod]:this.args.searchable)(this.filtered,{finders:Object.fromEntries(Object.entries(this.searchService.predicate(this.type)).filter(([t,n])=>void 0===e||e.includes(t)))})}get comparator(){return void 0===this.args.sort?[]:this.sort.comparator(this.type)(this.args.sort)}get items(){let e="comparator" -return"function"==typeof this.comparator&&(e=this.comparator),Ember.defineProperty(this,"sorted",Ember.computed.sort("searched",e)),this.sorted}get searched(){return""===this.searchTerm?this.filtered:this.searchable.search(this.searchTerm)}get filtered(){if(void 0===this.args.filters)return this.content.slice() -const e=this.filter.predicate(this.type) -if(void 0===e)return this.content.slice() -const t=Object.entries(this.args.filters).filter(([e,t])=>Boolean(t)).map(([e,t])=>[e,"string"!=typeof t?t.value:t]) -return this.content.filter(e(Object.fromEntries(t)))}get content(){const e=this.args.items||[] -return"function"==typeof e.dispatchEvent?e.content:e}search(e){return this.term=e,this.items}},h=P(b.prototype,"filter",[n],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),v=P(b.prototype,"sort",[r],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),y=P(b.prototype,"searchService",[a],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),g=P(b.prototype,"term",[l],{configurable:!0,enumerable:!0,writable:!0,initializer:function(){return""}}),O=P(b.prototype,"searchableMap",[s],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),P(b.prototype,"searchTerm",[i],Object.getOwnPropertyDescriptor(b.prototype,"searchTerm"),b.prototype),P(b.prototype,"searchable",[o],Object.getOwnPropertyDescriptor(b.prototype,"searchable"),b.prototype),P(b.prototype,"comparator",[u],Object.getOwnPropertyDescriptor(b.prototype,"comparator"),b.prototype),P(b.prototype,"items",[c],Object.getOwnPropertyDescriptor(b.prototype,"items"),b.prototype),P(b.prototype,"searched",[d],Object.getOwnPropertyDescriptor(b.prototype,"searched"),b.prototype),P(b.prototype,"filtered",[m],Object.getOwnPropertyDescriptor(b.prototype,"filtered"),b.prototype),P(b.prototype,"content",[p],Object.getOwnPropertyDescriptor(b.prototype,"content"),b.prototype),P(b.prototype,"search",[f],Object.getOwnPropertyDescriptor(b.prototype,"search"),b.prototype),b) -e.default=E,Ember._setComponentTemplate(w,E)})),define("consul-ui/components/data-form/index",["exports","block-slots","validated-changeset"],(function(e,t,n){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const r=Ember.HTMLBars.template({id:"0brDSSRZ",block:'{"symbols":["writer","api","&default"],"statements":[[8,"data-loader",[],[["@items","@src","@onchange","@once"],[[34,2],[30,[36,9],["/${partition}/${nspace}/${dc}/${type}/${src}",[30,[36,8],null,[["partition","nspace","dc","type","src"],[[35,7],[35,6],[35,5],[35,4],[35,3]]]]],null],[30,[36,10],[[32,0],"setData"],null],true]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["loaded"]],[["default"],[{"statements":[[2,"\\n\\n "],[8,"data-writer",[],[["@sink","@type","@label","@ondelete","@onchange"],[[30,[36,9],["/${partition}/${nspace}/${dc}/${type}",[30,[36,8],null,[["partition","nspace","dc","type"],[[35,7],[35,6],[30,[36,12],[[35,11,["Datacenter"]],[35,5]],null],[35,4]]]]],null],[34,4],[34,13],[30,[36,10],[[32,0],[35,14]],null],[30,[36,10],[[32,0],[35,15]],null]]],[["default"],[{"statements":[[2,"\\n\\n"],[6,[37,17],[[30,[36,8],null,[["data","change","isCreate","error","disabled","submit","delete"],[[35,11],[30,[36,10],[[32,0],"change"],null],[35,16],[32,1,["error"]],[32,1,["inflight"]],[30,[36,10],[[32,0],[32,1,["persist"]],[35,11]],null],[30,[36,10],[[32,0],[32,1,["delete"]],[35,11]],null]]]]],null,[["default"],[{"statements":[[2,"\\n "],[18,3,[[32,2]]],[2,"\\n"],[6,[37,1],[[35,0]],null,[["default"],[{"statements":[[2," "],[8,"block-slot",[],[["@name"],["error"]],[["default"],[{"statements":[[2,"\\n "],[8,"yield-slot",[],[["@name"],["error"]],[["default"],[{"statements":[[2,"\\n "],[18,3,[[32,2]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["content"]],[["default"],[{"statements":[[2,"\\n "],[8,"yield-slot",[],[["@name"],["form"]],[["default"],[{"statements":[[2,"\\n "],[18,3,[[32,2]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n\\n"]],"parameters":[2]}]]],[2,"\\n "]],"parameters":[1]}]]],[2,"\\n\\n "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[]}]]]],"hasEval":false,"upvars":["hasError","if","item","src","type","dc","nspace","partition","hash","uri","action","data","or","label","ondelete","onsubmit","create","let"]}',meta:{moduleName:"consul-ui/components/data-form/index.hbs"}}) -var a=Ember._setComponentTemplate(r,Ember.Component.extend(t.default,{tagName:"",dom:Ember.inject.service("dom"),builder:Ember.inject.service("form"),create:!1,ondelete:function(){return this.onsubmit(...arguments)},oncancel:function(){return this.onsubmit(...arguments)},onsubmit:function(){},onchange:function(e,t){return t.handleEvent(e)},didReceiveAttrs:function(){this._super(...arguments) -try{this.form=this.builder.form(this.type)}catch(e){}},willRender:function(){this._super(...arguments),Ember.set(this,"hasError",this._isRegistered("error"))},willDestroyElement:function(){this._super(...arguments),Ember.get(this,"data.isNew")&&this.data.rollbackAttributes()},actions:{setData:function(e){let t=e -return(0,n.isChangeset)(e)||void 0===this.form||(t=this.form.setData(e).getData()),Ember.get(e,"isNew")&&(Ember.set(this,"create",!0),t=Object.entries(this.autofill||{}).reduce((function(e,[t,n]){return Ember.set(e,t,n),e}),t)),Ember.set(this,"data",t),this.data},change:function(e,t){this.onchange(this.dom.normalizeEvent(e,t),this.form,this.form.getData())}}})) -e.default=a})),define("consul-ui/components/data-loader/chart.xstate",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -e.default={id:"data-loader",initial:"load",on:{OPEN:{target:"load"},ERROR:{target:"disconnected"},LOAD:[{target:"idle",cond:"loaded"},{target:"loading"}],INVALIDATE:[{target:"invalidating"}]},states:{load:{},invalidating:{},loading:{on:{SUCCESS:{target:"idle"},ERROR:{target:"error"}}},idle:{},error:{on:{RETRY:{target:"load"}}},disconnected:{on:{RETRY:{target:"load"}}}}}})),define("consul-ui/components/data-loader/index",["exports","block-slots","consul-ui/components/data-loader/chart.xstate"],(function(e,t,n){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const r=Ember.HTMLBars.template({id:"t05sBy/d",block:'{"symbols":["State","Guard","Action","dispatch","state","api","notice","&default"],"statements":[[18,8,null],[2,"\\n"],[8,"state-chart",[],[["@src"],[[34,17]]],[["default"],[{"statements":[[2,"\\n "],[8,"ref",[],[["@target","@name","@value"],[[32,0],"dispatch",[32,4]]],null],[2,"\\n "],[8,[32,2],[],[["@name","@cond"],["loaded",[30,[36,3],[[32,0],"isLoaded"],null]]],null],[2,"\\n\\n\\n"],[6,[37,21],[[30,[36,20],null,[["data","error","invalidate","dispatchError"],[[35,19],[35,0],[30,[36,3],[[32,0],"invalidate"],null],[30,[36,7],[[30,[36,3],[[32,0],[30,[36,18],[[35,0]],null]],[["value"],["error.errors.firstObject"]]],[30,[36,3],[[32,0],[32,4],"ERROR"],null]],null]]]]],null,[["default"],[{"statements":[[2,"\\n"],[6,[37,1],null,[["name"],["data"]],[["default","else"],[{"statements":[[2," "],[18,8,[[32,6]]],[2,"\\n"]],"parameters":[]},{"statements":[[6,[37,14],[[30,[36,11],[[35,15]],null]],null,[["default"],[{"statements":[[2," "],[8,[32,1],[],[["@notMatches"],[[30,[36,8],["error","disconnected","invalidating"],null]]],[["default"],[{"statements":[[2,"\\n"],[6,[37,14],[[30,[36,13],[[35,6],[30,[36,12],[[30,[36,11],[[35,10]],null],[30,[36,9],[[32,5],"loading"],null]],null]],null]],null,[["default"],[{"statements":[[2," "],[8,"data-source",[],[["@open","@src","@onchange","@onerror"],[[34,5],[34,6],[30,[36,7],[[30,[36,3],[[32,0],"change"],[["value"],["data"]]],[30,[36,3],[[32,0],[32,4],"SUCCESS"],null]],null],[32,6,["dispatchError"]]]],null],[2,"\\n"]],"parameters":[]}]]],[2," "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[]}]]]],"parameters":[]}]]],[2,"\\n "],[8,[32,1],[],[["@matches"],["loading"]],[["default"],[{"statements":[[2,"\\n"],[6,[37,1],null,[["name"],["loading"]],[["default","else"],[{"statements":[[2," "],[18,8,[[32,6]]],[2,"\\n"]],"parameters":[]},{"statements":[[2," "],[8,"consul/loader",[],[[],[]],null],[2,"\\n"]],"parameters":[]}]]],[2," "]],"parameters":[]}]]],[2,"\\n\\n "],[8,[32,1],[],[["@matches"],["error"]],[["default"],[{"statements":[[2,"\\n"],[6,[37,1],null,[["name"],["error"]],[["default","else"],[{"statements":[[2," "],[18,8,[[32,6]]],[2,"\\n"]],"parameters":[]},{"statements":[[2," "],[8,"error-state",[],[["@error"],[[34,0]]],null],[2,"\\n"]],"parameters":[]}]]],[2," "]],"parameters":[]}]]],[2,"\\n\\n "],[8,[32,1],[],[["@matches"],[[30,[36,8],["idle","disconnected","invalidating"],null]]],[["default"],[{"statements":[[2,"\\n\\n "],[8,[32,1],[],[["@matches"],["disconnected"]],[["default"],[{"statements":[[2,"\\n"],[6,[37,14],[[30,[36,11],[[30,[36,16],[[35,0,["status"]],"401"],null]],null]],null,[["default"],[{"statements":[[6,[37,1],null,[["name","params"],["disconnected",[30,[36,4],[[30,[36,3],[[32,0],[32,4],"RESET"],null]],null]]],[["default","else"],[{"statements":[[2," "],[18,8,[[32,6]]],[2,"\\n"]],"parameters":[]},{"statements":[[2," "],[8,"notice",[[24,0,"notification-update"],[4,[38,2],null,[["sticky"],[true]]]],[["@type"],["warning"]],[["default"],[{"statements":[[2,"\\n "],[8,[32,7,["Header"]],[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[10,"strong"],[12],[2,"Warning!"],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,[32,7,["Body"]],[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[10,"p"],[12],[2,"\\n An error was returned whilst loading this data, refresh to try again.\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[7]}]]],[2,"\\n"]],"parameters":[]}]]]],"parameters":[]}]]],[2," "]],"parameters":[]}]]],[2,"\\n"],[6,[37,14],[[30,[36,16],[[35,0,["status"]],"403"],null]],null,[["default","else"],[{"statements":[[6,[37,1],null,[["name"],["error"]],[["default","else"],[{"statements":[[2," "],[18,8,[[32,6]]],[2,"\\n"]],"parameters":[]},{"statements":[[2," "],[8,"error-state",[],[["@error"],[[34,0]]],null],[2,"\\n"]],"parameters":[]}]]]],"parameters":[]},{"statements":[[2," "],[8,"yield-slot",[],[["@name"],["loaded"]],[["default"],[{"statements":[[2,"\\n "],[18,8,[[32,6]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n\\n"]],"parameters":[6]}]]],[2," "],[1,[30,[36,23],[[30,[36,22],[[32,4],"LOAD"],null]],[["src"],[[35,6]]]]],[2,"\\n"]],"parameters":[1,2,3,4,5]}]]]],"hasEval":false,"upvars":["error","yield-slot","notification","action","block-params","open","src","queue","array","state-matches","once","not","or","and","if","items","eq","chart","mut","data","hash","let","fn","did-update"]}',meta:{moduleName:"consul-ui/components/data-loader/index.hbs"}}) -var a=Ember._setComponentTemplate(r,Ember.Component.extend(t.default,{tagName:"",onchange:e=>e,init:function(){this._super(...arguments),this.chart=n.default},didReceiveAttrs:function(){this._super(...arguments),void 0!==this.items&&this.actions.change.apply(this,[this.items])},didInsertElement:function(){this._super(...arguments),this.dispatch("LOAD")},actions:{invalidate(){this.dispatch("INVALIDATE"),Ember.run.schedule("afterRender",()=>{this.dispatch("LOAD")})},isLoaded:function(){return void 0!==this.items||void 0===this.src},change:function(e){Ember.set(this,"data",this.onchange(e))}}})) -e.default=a})),define("consul-ui/components/data-sink/index",["exports","consul-ui/utils/dom/event-source"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const n=Ember.HTMLBars.template({id:"R4WHi3tx",block:'{"symbols":["&default"],"statements":[[18,1,[[30,[36,2],null,[["open","state"],[[30,[36,1],[[32,0],"open"],null],[35,0]]]]]],[2,"\\n"]],"hasEval":false,"upvars":["state","action","hash"]}',meta:{moduleName:"consul-ui/components/data-sink/index.hbs"}}) -var r=Ember._setComponentTemplate(n,Ember.Component.extend({tagName:"",service:Ember.inject.service("data-sink/service"),dom:Ember.inject.service("dom"),logger:Ember.inject.service("logger"),onchange:function(){},onerror:function(){},state:Ember.computed("instance","instance.{dirtyType,isSaving}",(function(){let e -const t=Ember.get(this,"instance.isSaving"),n=Ember.get(this,"instance.dirtyType") -if(void 0===t&&void 0===n)e="idle" -else{switch(n){case"created":e=t?"creating":"create" -break -case"updated":e=t?"updating":"update" -break -case"deleted":case void 0:e=t?"removing":"remove"}e="active."+e}return{matches:t=>-1!==e.indexOf(t)}})),init:function(){this._super(...arguments),this._listeners=this.dom.listeners()},willDestroyElement:function(){this._super(...arguments),this._listeners.remove()},source:function(e){const n=(0,t.once)(e),r=e=>{Ember.set(this,"instance",void 0) -try{this.onerror(e),this.logger.execute(e)}catch(e){this.logger.execute(e)}} -return this._listeners.add(n,{message:e=>{try{Ember.set(this,"instance",void 0),this.onchange(e)}catch(t){r(t)}},error:e=>r(e)}),n},didInsertElement:function(){this._super(...arguments),void 0===this.data&&void 0===this.item||this.actions.open.apply(this,[this.data,this.item])},persist:function(e,t){void 0!==e?Ember.set(this,"instance",this.service.prepare(this.sink,e,t)):Ember.set(this,"instance",t),this.source(()=>this.service.persist(this.sink,this.instance))},remove:function(e){Ember.set(this,"instance",e),this.source(()=>this.service.remove(this.sink,e))},actions:{open:function(e,t){if(t instanceof Event&&(t=void 0),void 0===e&&void 0===t)throw new Error("You must specify data to save, or null to remove") -null===e||""===e?this.remove(t):this.persist(e,t)}}})) -e.default=r})),define("consul-ui/components/data-source/index",["exports","@glimmer/component"],(function(e,t){var n,r,a,l,s,i,o,u,c,d,m,p,f,b,h,v,y,g,O -function _(e,t,n,r){n&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(r):void 0})}function P(e,t,n,r,a){var l={} -return Object.keys(r).forEach((function(e){l[e]=r[e]})),l.enumerable=!!l.enumerable,l.configurable=!!l.configurable,("value"in l||l.initializer)&&(l.writable=!0),l=n.slice().reverse().reduce((function(n,r){return r(e,t,n)||n}),l),a&&void 0!==l.initializer&&(l.value=l.initializer?l.initializer.call(a):void 0,l.initializer=void 0),void 0===l.initializer&&(Object.defineProperty(e,t,l),l=null),l}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const w=Ember.HTMLBars.template({id:"N/jmqD/5",block:'{"symbols":["@src","@loading","@disabled","&default"],"statements":[[6,[37,2],[[30,[36,5],[[32,0,["disabled"]]],null]],null,[["default"],[{"statements":[[6,[37,2],[[30,[36,1],[[32,0,["loading"]],"lazy"],null]],null,[["default","else"],[{"statements":[[2," "],[11,"data"],[24,"aria-hidden","true"],[24,5,"width: 0;height: 0;font-size: 0;padding: 0;margin: 0;"],[4,[38,0],[[32,0,["connect"]]],null],[12],[13],[2,"\\n"]],"parameters":[]},{"statements":[[2," "],[1,[30,[36,0],[[32,0,["connect"]]],null]],[2,"\\n"]],"parameters":[]}]]],[2," "],[1,[30,[36,3],[[32,0,["attributeChanged"]],"src",[32,1]],null]],[2,"\\n "],[1,[30,[36,3],[[32,0,["attributeChanged"]],"loading",[32,2]],null]],[2,"\\n "],[1,[30,[36,4],[[32,0,["disconnect"]]],null]],[2,"\\n"]],"parameters":[]}]]],[1,[30,[36,3],[[32,0,["attributeChanged"]],"disabled",[32,3]],null]],[2,"\\n"],[18,4,[[30,[36,7],null,[["data","error","Source"],[[32,0,["data"]],[32,0,["error"]],[30,[36,2],[[32,0,["data"]],[30,[36,6],["data-source"],[["disabled"],[[30,[36,5],[[30,[36,1],[[32,0,["error"]],[29]],null]],null]]]],""],null]]]]]],[2,"\\n"]],"hasEval":false,"upvars":["did-insert","eq","if","did-update","will-destroy","not","component","hash"]}',meta:{moduleName:"consul-ui/components/data-source/index.hbs"}}),E=function(e,t,n,r=((e=null)=>"function"==typeof e?e():null)){const a=e[t] -return a!==n&&r(a,n),e[t]=n},k=()=>{},x=e=>"function"==typeof e?e:k,j=["eager","lazy"] -let C=(n=Ember.inject.service("data-source/service"),r=Ember.inject.service("dom"),a=Ember.inject.service("logger"),l=Ember._tracked,s=Ember._tracked,i=Ember._tracked,o=Ember._action,u=Ember._action,c=Ember._action,d=Ember._action,m=Ember._action,p=Ember._action,f=class extends t.default{constructor(e,t){super(...arguments),_(this,"dataSource",b,this),_(this,"dom",h,this),_(this,"logger",v,this),_(this,"isIntersecting",y,this),_(this,"data",g,this),_(this,"error",O,this),this._listeners=this.dom.listeners(),this._lazyListeners=this.dom.listeners()}get loading(){return j.includes(this.args.loading)?this.args.loading:j[0]}get disabled(){return void 0!==this.args.disabled&&this.args.disabled}onchange(e){this.error=void 0,this.data=e.data,x(this.args.onchange)(e)}onerror(e){this.error=e.error||e,x(this.args.onerror)(e)}connect(e){Array.isArray(e)?(this._lazyListeners.remove(),this.open()):this._lazyListeners.add(this.dom.isInViewport(e,e=>{this.isIntersecting=e,this.isIntersecting?this.open():this.close()}))}disconnect(){void 0!==this.data&&void 0===this.data.length&&"function"==typeof this.data.rollbackAttributes&&this.data.rollbackAttributes(),this.close(),this._listeners.remove(),this._lazyListeners.remove()}attributeChanged([e,t]){switch(e){case"src":("eager"===this.loading||this.isIntersecting)&&this.open()}}open(){const e=this.args.src,t=E(this,"source",this.dataSource.open(e,this,this.open),e=>{this.dataSource.close(e,this)}),n=e=>{try{const t=Ember.get(e,"error.errors.firstObject")||{} -"429"!==Ember.get(t,"status")&&this.onerror(e),this.logger.execute(e)}catch(e){this.logger.execute(e)}},r=this._listeners.add(this.source,{message:e=>{try{this.onchange(e)}catch(t){n(t)}},error:e=>{n(e)}}) -if(E(this,"_remove",r),"function"==typeof t.getCurrentEvent){const e=t.getCurrentEvent() -if(e){let t -void 0!==e.error?(t="onerror",this.error=e.error):(this.error=void 0,this.data=e.data,t="onchange"),Ember.run.schedule("afterRender",()=>{try{this[t](e)}catch(r){n(r)}})}}}async invalidate(){this.source.readyState=2,this.disconnect(),Ember.run.schedule("afterRender",()=>{this.connect([])})}close(){void 0!==this.source&&(this.dataSource.close(this.source,this),E(this,"_remove",void 0),this.source=void 0)}},b=P(f.prototype,"dataSource",[n],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),h=P(f.prototype,"dom",[r],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),v=P(f.prototype,"logger",[a],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),y=P(f.prototype,"isIntersecting",[l],{configurable:!0,enumerable:!0,writable:!0,initializer:function(){return!1}}),g=P(f.prototype,"data",[s],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),O=P(f.prototype,"error",[i],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),P(f.prototype,"connect",[o],Object.getOwnPropertyDescriptor(f.prototype,"connect"),f.prototype),P(f.prototype,"disconnect",[u],Object.getOwnPropertyDescriptor(f.prototype,"disconnect"),f.prototype),P(f.prototype,"attributeChanged",[c],Object.getOwnPropertyDescriptor(f.prototype,"attributeChanged"),f.prototype),P(f.prototype,"open",[d],Object.getOwnPropertyDescriptor(f.prototype,"open"),f.prototype),P(f.prototype,"invalidate",[m],Object.getOwnPropertyDescriptor(f.prototype,"invalidate"),f.prototype),P(f.prototype,"close",[p],Object.getOwnPropertyDescriptor(f.prototype,"close"),f.prototype),f) -e.default=C,Ember._setComponentTemplate(w,C)})),define("consul-ui/components/data-writer/chart.xstate",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -e.default={id:"data-writer",initial:"idle",states:{idle:{on:{PERSIST:{target:"persisting"},REMOVE:{target:"removing"}}},removing:{on:{SUCCESS:{target:"removed"},ERROR:{target:"error"}}},persisting:{on:{SUCCESS:{target:"persisted"},ERROR:{target:"error"}}},removed:{on:{RESET:{target:"idle"}}},persisted:{on:{RESET:{target:"idle"}}},error:{on:{RESET:{target:"idle"}}}}}})),define("consul-ui/components/data-writer/index",["exports","block-slots","consul-ui/components/data-writer/chart.xstate"],(function(e,t,n){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const r=Ember.HTMLBars.template({id:"Gj1ownZS",block:'{"symbols":["State","Guard","Action","dispatch","state","api","after","notice","after","notice","after","notice","&default"],"statements":[[8,"state-chart",[],[["@src"],[[34,17]]],[["default"],[{"statements":[[2,"\\n\\n "],[8,"ref",[],[["@target","@name","@value"],[[32,0],"dispatch",[32,4]]],null],[2,"\\n\\n"],[6,[37,15],[[30,[36,20],null,[["data","error","persist","delete","inflight","disabled"],[[35,10],[35,11],[30,[36,0],[[32,0],"persist"],null],[30,[36,13],[[30,[36,0],[[32,0],[30,[36,12],[[35,10]],null]],null],[30,[36,0],[[32,0],[32,4],"REMOVE"],null]],null],[30,[36,19],[[32,5],[30,[36,18],["persisting","removing"],null]],null],[30,[36,19],[[32,5],[30,[36,18],["persisting","removing"],null]],null]]]]],null,[["default"],[{"statements":[[2,"\\n "],[18,13,[[32,6]]],[2,"\\n\\n "],[8,[32,1],[],[["@matches"],["removing"]],[["default"],[{"statements":[[2,"\\n "],[8,"data-sink",[],[["@sink","@item","@data","@onchange","@onerror"],[[34,9],[34,10],null,[30,[36,0],[[32,0],[32,4],"SUCCESS"],null],[30,[36,13],[[30,[36,0],[[32,0],[30,[36,12],[[35,11]],null]],[["value"],["error.errors.firstObject"]]],[30,[36,0],[[32,0],[32,4],"ERROR"],null]],null]]],null],[2,"\\n "]],"parameters":[]}]]],[2,"\\n\\n "],[8,[32,1],[],[["@matches"],["persisting"]],[["default"],[{"statements":[[2,"\\n "],[8,"data-sink",[],[["@sink","@item","@onchange","@onerror"],[[34,9],[34,10],[30,[36,0],[[32,0],[32,4],"SUCCESS"],null],[30,[36,13],[[30,[36,0],[[32,0],[30,[36,12],[[35,11]],null]],[["value"],["error.errors.firstObject"]]],[30,[36,0],[[32,0],[32,4],"ERROR"],null]],null]]],null],[2,"\\n "]],"parameters":[]}]]],[2,"\\n\\n "],[8,[32,1],[],[["@matches"],["removed"]],[["default"],[{"statements":[[2,"\\n"],[6,[37,15],[[30,[36,13],[[30,[36,0],[[32,0],[32,4],"RESET"],null],[30,[36,0],[[32,0],[35,14]],null]],null]],null,[["default"],[{"statements":[[6,[37,8],null,[["name","params"],["removed",[30,[36,7],[[32,11]],null]]],[["default","else"],[{"statements":[[2," "],[18,13,[[32,6]]],[2,"\\n"]],"parameters":[]},{"statements":[[2," "],[8,"notice",[[24,0,"notification-delete"],[4,[38,1],null,[["after"],[[30,[36,0],[[32,0],[32,11]],null]]]]],[["@type"],["success"]],[["default"],[{"statements":[[2,"\\n "],[8,[32,12,["Header"]],[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[10,"strong"],[12],[2,"Success!"],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,[32,12,["Body"]],[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[10,"p"],[12],[2,"\\n Your "],[1,[30,[36,4],[[35,3],[35,2]],null]],[2," has been deleted.\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[12]}]]],[2,"\\n"]],"parameters":[]}]]]],"parameters":[11]}]]],[2," "]],"parameters":[]}]]],[2,"\\n\\n "],[8,[32,1],[],[["@matches"],["persisted"]],[["default"],[{"statements":[[2,"\\n"],[6,[37,15],[[30,[36,0],[[32,0],[35,16]],null]],null,[["default"],[{"statements":[[6,[37,8],null,[["name","params"],["persisted",[30,[36,7],[[32,9]],null]]],[["default","else"],[{"statements":[[2," "],[18,13,[[32,6]]],[2,"\\n"]],"parameters":[]},{"statements":[[2," "],[8,"notice",[[24,0,"notification-update"],[4,[38,1],null,[["after"],[[30,[36,0],[[32,0],[32,9]],null]]]]],[["@type"],["success"]],[["default"],[{"statements":[[2,"\\n "],[8,[32,10,["Header"]],[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[10,"strong"],[12],[2,"Success!"],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,[32,10,["Body"]],[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[10,"p"],[12],[2,"\\n Your "],[1,[30,[36,4],[[35,3],[35,2]],null]],[2," has been saved.\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[10]}]]],[2,"\\n"]],"parameters":[]}]]]],"parameters":[9]}]]],[2," "]],"parameters":[]}]]],[2,"\\n\\n "],[8,[32,1],[],[["@matches"],["error"]],[["default"],[{"statements":[[2,"\\n"],[6,[37,15],[[30,[36,0],[[32,0],[32,4],"RESET"],null]],null,[["default"],[{"statements":[[6,[37,8],null,[["name","params"],["error",[30,[36,7],[[32,7],[32,6,["error"]]],null]]],[["default","else"],[{"statements":[[2," "],[18,13,[[32,6]]],[2,"\\n"]],"parameters":[]},{"statements":[[2," "],[8,"notice",[[24,0,"notification-update"],[4,[38,1],null,[["after"],[[30,[36,0],[[32,0],[32,7]],null]]]]],[["@type"],["error"]],[["default"],[{"statements":[[2,"\\n "],[8,[32,8,["Header"]],[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[10,"strong"],[12],[2,"Error!"],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,[32,8,["Body"]],[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[10,"p"],[12],[2,"\\n There was an error saving your "],[1,[30,[36,4],[[35,3],[35,2]],null]],[2,".\\n"],[6,[37,6],[[30,[36,5],[[32,6,["error","status"]],[32,6,["error","detail"]]],null]],null,[["default"],[{"statements":[[2," "],[10,"br"],[12],[13],[1,[32,6,["error","status"]]],[2,": "],[1,[32,6,["error","detail"]]],[2,"\\n"]],"parameters":[]}]]],[2," "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[8]}]]],[2,"\\n"]],"parameters":[]}]]]],"parameters":[7]}]]],[2," "]],"parameters":[]}]]],[2,"\\n\\n "],[8,"yield-slot",[],[["@name"],["content"]],[["default"],[{"statements":[[2,"\\n "],[18,13,[[32,6]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n\\n"]],"parameters":[6]}]]]],"parameters":[1,2,3,4,5]}]]]],"hasEval":false,"upvars":["action","notification","type","label","or","and","if","block-params","yield-slot","sink","data","error","mut","queue","ondelete","let","onchange","chart","array","state-matches","hash"]}',meta:{moduleName:"consul-ui/components/data-writer/index.hbs"}}) -var a=Ember._setComponentTemplate(r,Ember.Component.extend(t.default,{tagName:"",ondelete:function(){return this.onchange(...arguments)},onchange:function(){},init:function(){this._super(...arguments),this.chart=n.default},actions:{persist:function(e,t){t&&"function"==typeof t.preventDefault&&t.preventDefault(),Ember.set(this,"data",e),this.dispatch("PERSIST")}}})) -e.default=a})),define("consul-ui/components/debug/navigation/index",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const t=Ember.HTMLBars.template({id:"ZDKUMD/N",block:'{"symbols":[],"statements":[],"hasEval":false,"upvars":[]}',meta:{moduleName:"consul-ui/components/debug/navigation/index.hbs"}}) -var n=Ember._setComponentTemplate(t,Ember._templateOnlyComponent()) -e.default=n})),define("consul-ui/components/delete-confirmation/index",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const t=Ember.HTMLBars.template({id:"jCwHFXDR",block:'{"symbols":[],"statements":[[10,"p"],[12],[2,"\\n "],[1,[34,0]],[2,"\\n"],[13],[2,"\\n"],[10,"button"],[14,0,"type-delete"],[15,"onclick",[30,[36,2],[[32,0],[35,1]],null]],[14,4,"button"],[12],[2,"\\n Confirm Delete\\n"],[13],[2,"\\n"],[10,"button"],[14,0,"type-cancel"],[15,"onclick",[30,[36,2],[[32,0],[35,3]],null]],[14,4,"button"],[12],[2,"Cancel"],[13],[2,"\\n"]],"hasEval":false,"upvars":["message","execute","action","cancel"]}',meta:{moduleName:"consul-ui/components/delete-confirmation/index.hbs"}}) -var n=Ember._setComponentTemplate(t,Ember.Component.extend({tagName:"",execute:function(){},cancel:function(){}})) -e.default=n})),define("consul-ui/components/disclosure-card/index",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const t=Ember.HTMLBars.template({id:"jQWyQTRo",block:'{"symbols":["custom","element","disclosure","&default"],"statements":[[8,"custom-element",[],[["@attrs"],[[34,0]]],[["default"],[{"statements":[[2,"\\n"],[8,"disclosure",[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[11,"disclosure-card"],[16,"expanded",[32,3,["expanded"]]],[4,[38,1],[[32,1,["connect"]]],null],[4,[38,2],[[32,1,["disconnect"]]],null],[12],[2,"\\n\\n "],[8,[32,1,["Template"]],[],[["@styles"],[[30,[36,5],[[30,[36,4],["/styles/base/icons/base-keyframes.css"],[["from"],["/components/disclosure-card"]]],[30,[36,4],["/styles/base/icons/icons/chevron-down/index.css"],[["from"],["/components/disclosure-card"]]],[30,[36,4],["/components/panel/index.css"],[["from"],["/components/disclosure-card"]]],[30,[36,3],["\\n :host {\\n display: block;\\n }\\n slot[name=\'action\']::slotted(button) {\\n display: block;\\n cursor: pointer;\\n width: 100%;\\n\\n background-color: rgb(var(--tone-gray-050));\\n color: rgb(var(--tone-gray-800));\\n padding-top: var(--padding-y);\\n padding-bottom: var(--padding-y);\\n }\\n slot[name=\'action\']::slotted(button)::after {\\n transition-timing-function: linear;\\n transition-duration: 300ms;\\n transition-property: transform;\\n --icon-name: icon-chevron-down;\\n --icon-size: icon-000;\\n content: \'\';\\n }\\n\\n :host([expanded]) slot[name=\'action\']::slotted(button)::after {\\n transform: scaleY(-100%);\\n }\\n\\n :host([expanded]) [style*=\'max-height\'] {\\n transition-duration: 50ms;\\n }\\n [style*=\'max-height\'] {\\n transition-timing-function: ease-out;\\n transition-property: max-height;\\n overflow: hidden;\\n }\\n .content {\\n padding: var(--padding-y) var(--padding-x);\\n }\\n "],null]],null]]],[["default"],[{"statements":[[2,"\\n "],[10,"div"],[14,"part","base"],[15,0,[30,[36,6],["panel"],null]],[12],[2,"\\n "],[11,"div"],[16,0,[30,[36,6],["content"],null]],[4,[38,8],[[30,[36,7],[[30,[36,0],[[30,[36,0],["height","max-height"],null]],null]],null]],null],[12],[2,"\\n "],[10,"slot"],[12],[2,"\\n "],[13],[2,"\\n "],[13],[2,"\\n "],[10,"hr"],[15,0,[30,[36,6],["panel-separator"],null]],[12],[13],[2,"\\n "],[10,"slot"],[14,3,"action"],[12],[2,"\\n "],[13],[2,"\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n\\n "],[18,4,[[32,3]]],[2,"\\n\\n "],[13],[2,"\\n"]],"parameters":[3]}]]],[2,"\\n"]],"parameters":[1,2]}]]],[2,"\\n"]],"hasEval":false,"upvars":["array","did-insert","will-destroy","css","require","css-map","class-map","dom-position","on-resize"]}',meta:{moduleName:"consul-ui/components/disclosure-card/index.hbs"}}) -var n=Ember._setComponentTemplate(t,Ember._templateOnlyComponent()) -e.default=n})),define("consul-ui/components/disclosure-menu/action/index",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const t=Ember.HTMLBars.template({id:"dVOJ6hd3",block:'{"symbols":["@disclosure","&attrs","&default"],"statements":[[8,[32,1,["Action"]],[[24,"aria-haspopup","menu"],[17,2]],[[],[]],[["default"],[{"statements":[[2,"\\n "],[18,3,null],[2,"\\n"]],"parameters":[]}]]],[2,"\\n"]],"hasEval":false,"upvars":[]}',meta:{moduleName:"consul-ui/components/disclosure-menu/action/index.hbs"}}) -var n=Ember._setComponentTemplate(t,Ember._templateOnlyComponent()) -e.default=n})),define("consul-ui/components/disclosure-menu/index",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const t=Ember.HTMLBars.template({id:"0ppCO1I+",block:'{"symbols":["disclosure","&attrs","@expanded","@rowHeight","@items","&default"],"statements":[[11,"div"],[16,0,[30,[36,0],["disclosure-menu"],null]],[17,2],[12],[2,"\\n "],[8,"disclosure",[],[["@expanded"],[[32,3]]],[["default"],[{"statements":[[2,"\\n "],[18,6,[[30,[36,2],null,[["Action","Menu","disclosure","toggle","close","open","expanded"],[[30,[36,1],["disclosure-menu/action"],[["disclosure"],[[32,1]]]],[30,[36,1],["disclosure-menu/menu"],[["disclosure","items","rowHeight"],[[32,1],[32,5],[32,4]]]],[32,1],[32,1,["toggle"]],[32,1,["close"]],[32,1,["open"]],[32,1,["expanded"]]]]]]],[2,"\\n "]],"parameters":[1]}]]],[2,"\\n"],[13],[2,"\\n"]],"hasEval":false,"upvars":["class-map","component","hash"]}',meta:{moduleName:"consul-ui/components/disclosure-menu/index.hbs"}}) -var n=Ember._setComponentTemplate(t,Ember._templateOnlyComponent()) -e.default=n})),define("consul-ui/components/disclosure-menu/menu/index",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const t=Ember.HTMLBars.template({id:"OoptGQit",block:'{"symbols":["details","pager","@disclosure","@items","&attrs","&default"],"statements":[[8,[32,3,["Details"]],[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[8,"paged-collection",[],[["@items"],[[30,[36,1],[[32,4],[30,[36,0],null,null]],null]]],[["default"],[{"statements":[[2,"\\n "],[11,"div"],[16,0,[30,[36,3],[[30,[36,0],["paged-collection-scroll",[30,[36,2],[[32,2,["type"]],[30,[36,0],["virtual-scroll","native-scroll"],null]],null]],null]],null]],[17,5],[4,[38,4],["click",[32,3,["close"]]],null],[4,[38,5],[[32,2,["viewport"]]],null],[4,[38,6],[[32,2,["resize"]]],null],[4,[38,7],["--paged-row-height"],[["returns"],[[32,2,["rowHeight"]]]]],[4,[38,7],["max-height"],[["returns"],[[32,2,["maxHeight"]]]]],[12],[2,"\\n "],[18,6,[[30,[36,9],null,[["Menu"],[[30,[36,8],["menu"],[["disclosure","pager"],[[32,3],[32,2]]]]]]]]],[2,"\\n "],[13],[2,"\\n "]],"parameters":[2]}]]],[2,"\\n"]],"parameters":[1]}]]],[2,"\\n\\n"]],"hasEval":false,"upvars":["array","or","contains","class-map","on-outside","did-insert","on-resize","css-prop","component","hash"]}',meta:{moduleName:"consul-ui/components/disclosure-menu/menu/index.hbs"}}) -var n=Ember._setComponentTemplate(t,Ember._templateOnlyComponent()) -e.default=n})),define("consul-ui/components/disclosure/action/index",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const t=Ember.HTMLBars.template({id:"psbqw5ZC",block:'{"symbols":["@disclosure","&attrs","&default"],"statements":[[8,"action",[[16,"aria-expanded",[30,[36,0],[[32,1,["expanded"]],"true","false"],null]],[16,"aria-controls",[32,1,["controls"]]],[17,2]],[[],[]],[["default"],[{"statements":[[2,"\\n "],[18,3,null],[2,"\\n"]],"parameters":[]}]]],[2,"\\n"]],"hasEval":false,"upvars":["if"]}',meta:{moduleName:"consul-ui/components/disclosure/action/index.hbs"}}) -var n=Ember._setComponentTemplate(t,Ember._templateOnlyComponent()) -e.default=n})),define("consul-ui/components/disclosure/details/index",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const t=Ember.HTMLBars.template({id:"zTpefIvc",block:'{"symbols":["id","@disclosure","&default","@auto"],"statements":[[6,[37,10],[[30,[36,9],null,null]],null,[["default"],[{"statements":[[6,[37,5],[[30,[36,4],[[30,[36,3],[[30,[36,1],[[32,4],[29]],null],[32,2,["expanded"]]],null],[30,[36,3],[[30,[36,2],[[32,4],[29]],null],[30,[36,1],[[32,4],false],null]],null]],null]],null,[["default"],[{"statements":[[18,3,[[30,[36,0],null,[["id","expanded"],[[32,1],[32,2,["expanded"]]]]]]],[2,"\\n"]],"parameters":[]}]]],[1,[30,[36,7],[[30,[36,6],[[32,2,["add"]],[32,1]],null]],null]],[2,"\\n"],[1,[30,[36,8],[[30,[36,6],[[32,2,["remove"]],[32,1]],null]],null]],[2,"\\n"]],"parameters":[1]}]]]],"hasEval":false,"upvars":["hash","eq","not-eq","and","or","if","fn","did-insert","will-destroy","unique-id","let"]}',meta:{moduleName:"consul-ui/components/disclosure/details/index.hbs"}}) -var n=Ember._setComponentTemplate(t,Ember._templateOnlyComponent()) -e.default=n})),define("consul-ui/components/disclosure/index",["exports","@glimmer/component"],(function(e,t){var n,r,a,l,s -function i(e,t,n,r,a){var l={} -return Object.keys(r).forEach((function(e){l[e]=r[e]})),l.enumerable=!!l.enumerable,l.configurable=!!l.configurable,("value"in l||l.initializer)&&(l.writable=!0),l=n.slice().reverse().reduce((function(n,r){return r(e,t,n)||n}),l),a&&void 0!==l.initializer&&(l.value=l.initializer?l.initializer.call(a):void 0,l.initializer=void 0),void 0===l.initializer&&(Object.defineProperty(e,t,l),l=null),l}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const o=Ember.HTMLBars.template({id:"28tf0rhU",block:'{"symbols":["State","Guard","Action","dispatch","state","_api","api","&default","@expanded"],"statements":[[8,"state-chart",[],[["@src","@initial"],[[30,[36,5],["boolean"],null],[30,[36,6],[[32,9],"true","false"],null]]],[["default"],[{"statements":[[2,"\\n"],[6,[37,4],[[30,[36,1],null,[["toggle","close","open","expanded","event","button","controls"],[[30,[36,8],[[32,4],"TOGGLE"],null],[30,[36,8],[[32,4],"FALSE"],null],[30,[36,8],[[32,4],"TRUE"],null],[30,[36,0],[[32,5],"true"],null],[32,5,["context"]],[30,[36,7],null,null],[32,0,["ids"]]]]]],null,[["default"],[{"statements":[[6,[37,4],[[30,[36,3],[[32,6],[30,[36,1],null,[["Action","Details"],[[30,[36,2],["disclosure/action"],[["disclosure"],[[32,6]]]],[30,[36,2],["disclosure/details"],[["disclosure"],[[30,[36,1],null,[["add","remove","expanded"],[[32,0,["add"]],[32,0,["remove"]],[30,[36,0],[[32,5],"true"],null]]]]]]]]]]],null]],null,[["default"],[{"statements":[[2," "],[18,8,[[32,7]]],[2,"\\n"]],"parameters":[7]}]]]],"parameters":[6]}]]]],"parameters":[1,2,3,4,5]}]]]],"hasEval":false,"upvars":["state-matches","hash","component","assign","let","state-chart","if","unique-id","fn"]}',meta:{moduleName:"consul-ui/components/disclosure/index.hbs"}}) -let u=(n=Ember._tracked,r=Ember._action,a=Ember._action,l=class extends t.default{constructor(...e){var t,n,r,a -super(...e),t=this,n="ids",a=this,(r=s)&&Object.defineProperty(t,n,{enumerable:r.enumerable,configurable:r.configurable,writable:r.writable,value:r.initializer?r.initializer.call(a):void 0})}add(e){Ember.run.schedule("afterRender",()=>{this.ids=`${this.ids}${this.ids.length>0?" ":""}${e}`})}remove(e){this.ids=this.ids.split(" ").filter(t=>t!==e).join(" ")}},s=i(l.prototype,"ids",[n],{configurable:!0,enumerable:!0,writable:!0,initializer:function(){return""}}),i(l.prototype,"add",[r],Object.getOwnPropertyDescriptor(l.prototype,"add"),l.prototype),i(l.prototype,"remove",[a],Object.getOwnPropertyDescriptor(l.prototype,"remove"),l.prototype),l) -e.default=u,Ember._setComponentTemplate(o,u)})),define("consul-ui/components/distribution-meter/index.css",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -e.default=e=>e` - :host { - display: block; - width: 100%; - height: 100%; - } - dl { - position: relative; - height: 100%; - } - :host([type='linear']) { - height: 3px; - } - :host([type='radial']), - :host([type='circular']) { - height: 300px; - } - :host([type='linear']) dl { - background-color: currentColor; - color: rgb(var(--tone-gray-100)); - border-radius: var(--decor-radius-999); - transition-property: transform; - transition-timing-function: ease-out; - transition-duration: .1s; - } - :host([type='linear']) dl:hover { - transform: scaleY(3); - box-shadow: var(--decor-elevation-200); - } - `})),define("consul-ui/components/distribution-meter/index",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const t=Ember.HTMLBars.template({id:"weg3QSze",block:'{"symbols":["custom","element","&attrs","&default"],"statements":[[8,"custom-element",[],[["@attrs"],[[30,[36,0],[[30,[36,0],["type","\\"linear\\" | \\"radial\\" | \\"circular\\"","linear"],null]],null]]],[["default"],[{"statements":[[2,"\\n "],[11,"distribution-meter"],[17,3],[4,[38,1],[[32,1,["connect"]]],null],[4,[38,2],[[32,1,["disconnect"]]],null],[12],[2,"\\n "],[8,[32,1,["Template"]],[],[["@styles"],[[30,[36,4],[[30,[36,3],["./index.css"],[["from"],["/components/distribution-meter"]]]],null]]],[["default"],[{"statements":[[2,"\\n "],[10,"dl"],[12],[2,"\\n "],[10,"slot"],[12],[13],[2,"\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[18,4,[[30,[36,6],null,[["Meter"],[[30,[36,5],["distribution-meter/meter"],[["type"],[[32,2,["attrs","type"]]]]]]]]]],[2,"\\n "],[13],[2,"\\n"]],"parameters":[1,2]}]]],[2,"\\n"]],"hasEval":false,"upvars":["array","did-insert","will-destroy","require","css-map","component","hash"]}',meta:{moduleName:"consul-ui/components/distribution-meter/index.hbs"}}) -var n=Ember._setComponentTemplate(t,Ember._templateOnlyComponent()) -e.default=n})),define("consul-ui/components/distribution-meter/meter/element",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const t=(e,t=0)=>{const n=parseFloat(e) -return isNaN(n)?t:n} -e.default=e=>class extends e{attributeChangedCallback(e,n,r){const a=this -switch(e){case"percentage":{let e=a -for(;e;){const n=e.nextElementSibling,r=n?t(n.style.getPropertyValue("--aggregated-percentage")):0,a=t(e.getAttribute("percentage"))+r -e.style.setProperty("--aggregated-percentage",a),e.setAttribute("aggregated-percentage",a),e=e.previousElementSibling}break}}}}})),define("consul-ui/components/distribution-meter/meter/index.css",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -e.default=e=>e` - /*@import '~/styles/base/decoration/visually-hidden.css';*/ - - :host(.critical) { - color: rgb(var(--tone-red-500)); - } - :host(.warning) { - color: rgb(var(--tone-orange-500)); - } - :host(.passing) { - color: rgb(var(--tone-green-500)); - } - - :host { - position: absolute; - top: 0; - height: 100%; - - transition-timing-function: ease-out; - transition-duration: .5s; - } - dt, dd meter { - animation-name: visually-hidden; - animation-fill-mode: forwards; - animation-play-state: paused; - } - - :host(.type-linear) { - transition-property: width; - width: calc(var(--aggregated-percentage) * 1%); - height: 100%; - background-color: currentColor; - border-radius: var(--decor-radius-999); - } - - :host svg { - height: 100%; - } - :host(.type-radial), - :host(.type-circular) { - transition-property: none; - } - :host(.type-radial) dd, - :host(.type-circular) dd { - width: 100%; - height: 100%; - } - :host(.type-radial) circle, - :host(.type-circular) circle { - transition-timing-function: ease-out; - transition-duration: .5s; - pointer-events: stroke; - transition-property: stroke-dashoffset, stroke-width; - transform: rotate(-90deg); - transform-origin: 50%; - fill: transparent; - stroke: currentColor; - stroke-dasharray: 100, 100; - stroke-dashoffset: calc(calc(100 - var(--aggregated-percentage)) * 1px); - } - :host([aggregated-percentage='100']) circle { - stroke-dasharray: 0 !important; - } - :host([aggregated-percentage='0']) circle { - stroke-dasharray: 0, 100 !important; - } - :host(.type-radial) circle, - :host(.type-circular]) svg { - pointer-events: none; - } - :host(.type-radial) circle { - stroke-width: 32; - } - :host(.type-circular) circle { - stroke-width: 14; - } - `})),define("consul-ui/components/distribution-meter/meter/index",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const t=Ember.HTMLBars.template({id:"pCg7idGT",block:'{"symbols":["custom","element","@type","&attrs"],"statements":[[8,"custom-element",[],[["@class","@attrs","@cssprops"],[[30,[36,0],["./element"],[["from"],["/components/distribution-meter/meter"]]],[30,[36,1],[[30,[36,1],["percentage","number",0],null],[30,[36,1],["description","string",""],null]],null],[30,[36,1],[[30,[36,1],["--percentage","percentage","[percentage]"],null],[30,[36,1],["--aggregated-percentage","percentage",[29]],null]],null]]],[["default"],[{"statements":[[2,"\\n\\n "],[11,"distribution-meter-meter"],[16,0,[30,[36,3],[[30,[36,1],[[30,[36,2],["type-",[32,3]],null],[32,3]],null]],null]],[17,4],[4,[38,4],[[32,1,["connect"]]],null],[4,[38,5],[[32,1,["disconnect"]]],null],[12],[2,"\\n "],[8,[32,1,["Template"]],[],[["@styles"],[[30,[36,6],[[30,[36,0],["/styles/base/decoration/visually-hidden.css"],[["from"],["/components/distribution-meter/meter"]]],[30,[36,0],["./index.css"],[["from"],["/components/distribution-meter/meter"]]]],null]]],[["default"],[{"statements":[[2,"\\n "],[10,"dt"],[12],[1,[32,2,["attrs","description"]]],[13],[2,"\\n "],[10,"dd"],[15,"aria-label",[30,[36,2],[[32,2,["attrs","percentage"]],"%"],null]],[12],[2,"\\n "],[10,"meter"],[14,"min","0"],[14,"max","100"],[15,2,[32,2,["attrs","percentage"]]],[12],[2,"\\n "],[10,"slot"],[12],[1,[30,[36,2],[[32,2,["attrs","percentage"]],"%"],null]],[13],[2,"\\n "],[13],[2,"\\n"],[6,[37,9],[[30,[36,8],[[30,[36,7],[[32,3],"circular"],null],[30,[36,7],[[32,3],"radial"],null]],null]],null,[["default"],[{"statements":[[2," "],[10,"svg"],[14,"aria-hidden","true"],[14,"viewBox","0 0 32 32"],[14,"clip-path","circle()"],[12],[2,"\\n "],[10,"circle"],[14,"r","16"],[14,"cx","16"],[14,"cy","16"],[12],[13],[2,"\\n "],[13],[2,"\\n"]],"parameters":[]}]]],[2," "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[13],[2,"\\n\\n"]],"parameters":[1,2]}]]],[2,"\\n\\n"]],"hasEval":false,"upvars":["require","array","concat","class-map","did-insert","will-destroy","css-map","eq","or","if"]}',meta:{moduleName:"consul-ui/components/distribution-meter/meter/index.hbs"}}) -var n=Ember._setComponentTemplate(t,Ember._templateOnlyComponent()) -e.default=n})),define("consul-ui/components/ember-collection",["exports","ember-collection/components/ember-collection"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/components/ember-native-scrollable",["exports","ember-collection/components/ember-native-scrollable"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})) -define("consul-ui/components/empty-state/index",["exports","block-slots"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const n=Ember.HTMLBars.template({id:"iwlkCEdF",block:'{"symbols":["&default","&attrs"],"statements":[[18,1,null],[2,"\\n"],[11,"div"],[24,0,"empty-state"],[17,2],[12],[2,"\\n"],[6,[37,6],[[35,8]],null,[["default"],[{"statements":[[2," "],[10,"header"],[12],[2,"\\n"],[6,[37,7],null,[["name"],["header"]],[["default"],[{"statements":[[2," "],[18,1,null],[2,"\\n"]],"parameters":[]}]]],[6,[37,7],null,[["name"],["subheader"]],[["default"],[{"statements":[[2," "],[18,1,null],[2,"\\n"]],"parameters":[]}]]],[2," "],[13],[2,"\\n"]],"parameters":[]}]]],[6,[37,7],null,[["name"],["body"]],[["default"],[{"statements":[[2," "],[10,"div"],[12],[2,"\\n "],[18,1,null],[2,"\\n"],[6,[37,6],[[35,0]],null,[["default"],[{"statements":[[2," "],[8,"action",[[4,[38,1],["click",[35,0]],null]],[[],[]],[["default"],[{"statements":[[2,"\\n "],[8,"data-source",[],[["@src","@onchange"],[[30,[36,2],["settings://consul:token"],null],[30,[36,5],[[32,0],[30,[36,4],[[35,3]],null]],[["value"],["data"]]]]],null],[2,"\\n"],[6,[37,6],[[35,3,["AccessorID"]]],null,[["default","else"],[{"statements":[[2," Log in with a different token\\n"]],"parameters":[]},{"statements":[[2," Log in\\n"]],"parameters":[]}]]],[2," "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[]}]]],[2," "],[13],[2,"\\n"]],"parameters":[]}]]],[6,[37,7],null,[["name"],["actions"]],[["default"],[{"statements":[[2," "],[10,"ul"],[12],[2,"\\n "],[18,1,null],[2,"\\n "],[13],[2,"\\n"]],"parameters":[]}]]],[13]],"hasEval":false,"upvars":["login","on","uri","token","mut","action","if","yield-slot","hasHeader"]}',meta:{moduleName:"consul-ui/components/empty-state/index.hbs"}}) -var r=Ember._setComponentTemplate(n,Ember.Component.extend(t.default,{tagName:"",willRender:function(){this._super(...arguments),Ember.set(this,"hasHeader",this._isRegistered("header")||this._isRegistered("subheader"))}})) -e.default=r})),define("consul-ui/components/error-state/index",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const t=Ember.HTMLBars.template({id:"hckyXX72",block:'{"symbols":["@error","@login"],"statements":[[6,[37,3],[[30,[36,5],[[32,1,["status"]],"403"],null]],null,[["default","else"],[{"statements":[[2," "],[8,"empty-state",[[16,0,[30,[36,0],["status-",[32,1,["status"]]],null]]],[["@login"],[[32,2]]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["header"]],[["default"],[{"statements":[[2,"\\n "],[10,"h2"],[12],[2,"\\n "],[1,[30,[36,2],[[32,1,["message"]],"Consul returned an error"],null]],[2,"\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n"],[6,[37,3],[[32,1,["status"]]],null,[["default"],[{"statements":[[2," "],[8,"block-slot",[],[["@name"],["subheader"]],[["default"],[{"statements":[[2,"\\n "],[10,"h3"],[12],[2,"\\n Error "],[1,[32,1,["status"]]],[2,"\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[]}]]],[2," "],[8,"block-slot",[],[["@name"],["body"]],[["default"],[{"statements":[[2,"\\n "],[10,"p"],[12],[2,"\\n"],[6,[37,3],[[32,1,["detail"]]],null,[["default","else"],[{"statements":[[2," "],[1,[32,1,["detail"]]],[2,"\\n"]],"parameters":[]},{"statements":[[2," You may have visited a URL that is loading an unknown resource, so you can try going back to the root or try re-submitting your ACL Token/SecretID by going back to ACLs.\\n"]],"parameters":[]}]]],[2," "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["actions"]],[["default"],[{"statements":[[2,"\\n "],[10,"li"],[14,0,"back-link"],[12],[2,"\\n "],[8,"action",[],[["@href"],[[30,[36,4],["index"],null]]],[["default"],[{"statements":[[2,"\\n Go back\\n "]],"parameters":[]}]]],[2,"\\n "],[13],[2,"\\n "],[10,"li"],[14,0,"docs-link"],[12],[2,"\\n "],[8,"action",[],[["@href","@external"],[[31,[[30,[36,1],["CONSUL_DOCS_URL"],null]]],true]],[["default"],[{"statements":[[2,"\\n Read the documentation\\n "]],"parameters":[]}]]],[2,"\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[]},{"statements":[[2," "],[8,"empty-state",[[16,0,[30,[36,0],["status-",[32,1,["status"]]],null]]],[["@login"],[[32,2]]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["header"]],[["default"],[{"statements":[[2,"\\n "],[10,"h2"],[12],[2,"\\n You are not authorized\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["subheader"]],[["default"],[{"statements":[[2,"\\n "],[10,"h3"],[12],[2,"\\n Error "],[1,[32,1,["status"]]],[2,"\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["body"]],[["default"],[{"statements":[[2,"\\n "],[10,"p"],[12],[2,"\\n You must be granted permissions to view this data. Ask your administrator if you think you should have access.\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["actions"]],[["default"],[{"statements":[[2,"\\n "],[10,"li"],[14,0,"docs-link"],[12],[2,"\\n "],[8,"action",[],[["@href","@external"],[[31,[[30,[36,1],["CONSUL_DOCS_URL"],null],"/acl/index.html"]],true]],[["default"],[{"statements":[[2,"\\n Read the documentation\\n "]],"parameters":[]}]]],[2,"\\n "],[13],[2,"\\n "],[10,"li"],[14,0,"learn-link"],[12],[2,"\\n "],[8,"action",[],[["@href","@external"],[[31,[[30,[36,1],["CONSUL_DOCS_LEARN_URL"],null],"/consul/security-networking/production-acls"]],true]],[["default"],[{"statements":[[2,"\\n Follow the guide\\n "]],"parameters":[]}]]],[2,"\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[]}]]]],"hasEval":false,"upvars":["concat","env","or","if","href-to","not-eq"]}',meta:{moduleName:"consul-ui/components/error-state/index.hbs"}}) -var n=Ember._setComponentTemplate(t,Ember._templateOnlyComponent()) -e.default=n})),define("consul-ui/components/event-source/index",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const t=Ember.HTMLBars.template({id:"9rZp1Dvu",block:'{"symbols":["&default"],"statements":[[18,1,[[30,[36,1],null,[["close"],[[30,[36,0],[[32,0],"close"],null]]]]]],[2,"\\n"]],"hasEval":false,"upvars":["action","hash"]}',meta:{moduleName:"consul-ui/components/event-source/index.hbs"}}),n=function(e,t,n,r=((e=null)=>"function"==typeof e?e():null)){const a=e[t] -return a!==n&&r(a,n),Ember.set(e,t,n)} -var r=Ember._setComponentTemplate(t,Ember.Component.extend({tagName:"",dom:Ember.inject.service("dom"),logger:Ember.inject.service("logger"),data:Ember.inject.service("data-source/service"),closeOnDestroy:!0,onerror:function(e){this.logger.execute(e.error)},init:function(){this._super(...arguments),this._listeners=this.dom.listeners()},willDestroyElement:function(){this.closeOnDestroy&&this.actions.close.apply(this,[]),this._listeners.remove(),this._super(...arguments)},didReceiveAttrs:function(){this._super(...arguments),Ember.get(this,"src.configuration.uri")!==Ember.get(this,"source.configuration.uri")&&this.actions.open.apply(this,[])},actions:{open:function(){n(this,"source",this.data.open(this.src,this),e=>{void 0!==e&&this.data.close(e,this)}),n(this,"proxy",this.src,e=>{void 0!==e&&e.destroy()}) -const e=e=>{try{const t=Ember.get(e,"error.errors.firstObject") -"429"!==Ember.get(t||{},"status")&&this.onerror(e),this.logger.execute(e)}catch(e){this.logger.execute(e)}},t=this._listeners.add(this.source,{error:t=>{e(t)}}) -n(this,"_remove",t)},close:function(){void 0!==this.source&&(this.data.close(this.source,this),n(this,"_remove",void 0),Ember.set(this,"source",void 0)),void 0!==this.proxy&&this.proxy.destroy()}}})) -e.default=r})),define("consul-ui/components/flash-message",["exports","ember-cli-flash/components/flash-message"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/components/form-component/index",["exports","block-slots"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const n=Ember.HTMLBars.template({id:"YBF10tF/",block:'{"symbols":["&default"],"statements":[[18,1,null]],"hasEval":false,"upvars":[]}',meta:{moduleName:"consul-ui/components/form-component/index.hbs"}}),r=/([^[\]])+/g -var a=Ember._setComponentTemplate(n,Ember.Component.extend(t.default,{tagName:"",onreset:function(){},onchange:function(){},onerror:function(){},onsuccess:function(){},data:Ember.computed.alias("form.data"),item:Ember.computed.alias("form.data"),dom:Ember.inject.service("dom"),container:Ember.inject.service("form"),actions:{change:function(e,t){let n=this.dom.normalizeEvent(e,t) -const a=[...n.target.name.matchAll(r)],l=a[a.length-1][0] -let s -s=-1===l.indexOf("[")?`${this.type}[${l}]`:l,this.form.handleEvent(n,s),this.onchange({target:this})}}})) -e.default=a})),define("consul-ui/components/form-group/element/checkbox/index",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const t=Ember.HTMLBars.template({id:"dFj6ezet",block:'{"symbols":["@name","@value","&attrs","@didinsert","@onchange"],"statements":[[11,"input"],[16,3,[32,1]],[16,2,[32,2]],[17,3],[24,4,"checkbox"],[4,[38,1],[[30,[36,0],[[32,4]],null]],null],[4,[38,2],["change",[30,[36,0],[[32,5]],null]],null],[12],[13],[2,"\\n"]],"hasEval":false,"upvars":["optional","did-insert","on"]}',meta:{moduleName:"consul-ui/components/form-group/element/checkbox/index.hbs"}}) -var n=Ember._setComponentTemplate(t,Ember._templateOnlyComponent()) -e.default=n})),define("consul-ui/components/form-group/element/error/index",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const t=Ember.HTMLBars.template({id:"Z2yKEUoj",block:'{"symbols":["&attrs","&default"],"statements":[[11,"strong"],[24,"role","alert"],[17,1],[12],[2,"\\n "],[18,2,null],[2,"\\n"],[13],[2,"\\n"]],"hasEval":false,"upvars":[]}',meta:{moduleName:"consul-ui/components/form-group/element/error/index.hbs"}}) -var n=Ember._setComponentTemplate(t,Ember._templateOnlyComponent()) -e.default=n})),define("consul-ui/components/form-group/element/index",["exports","@glimmer/component"],(function(e,t){var n,r,a,l,s,i -function o(e,t,n,r){n&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(r):void 0})}function u(e,t,n,r,a){var l={} -return Object.keys(r).forEach((function(e){l[e]=r[e]})),l.enumerable=!!l.enumerable,l.configurable=!!l.configurable,("value"in l||l.initializer)&&(l.writable=!0),l=n.slice().reverse().reduce((function(n,r){return r(e,t,n)||n}),l),a&&void 0!==l.initializer&&(l.value=l.initializer?l.initializer.call(a):void 0,l.initializer=void 0),void 0===l.initializer&&(Object.defineProperty(e,t,l),l=null),l}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const c=Ember.HTMLBars.template({id:"F1rSsI4z",block:'{"symbols":["el","&attrs","&default","@name","@group"],"statements":[[6,[37,9],[[30,[36,8],null,[["Element","Text","Checkbox","Radio","Label","Error","state"],[[30,[36,5],["form-group/element"],[["group","name"],[[32,5],[32,4]]]],[30,[36,5],["form-group/element/text"],[["didinsert","name","oninput"],[[30,[36,7],[[32,0],[32,0,["connect"]]],null],[32,0,["name"]],[30,[36,7],[[32,0],[30,[36,6],[[32,0,["touched"]]],null],true],null]]]],[30,[36,5],["form-group/element/checkbox"],[["didinsert","name","onchange"],[[30,[36,7],[[32,0],[32,0,["connect"]]],null],[32,0,["name"]],[30,[36,7],[[32,0],[30,[36,6],[[32,0,["touched"]]],null],true],null]]]],[30,[36,5],["form-group/element/radio"],[["didinsert","name","onchange"],[[30,[36,7],[[32,0],[32,0,["connect"]]],null],[32,0,["name"]],[30,[36,7],[[32,0],[30,[36,6],[[32,0,["touched"]]],null],true],null]]]],[30,[36,5],["form-group/element/label"],null],[30,[36,5],["form-group/element/error"],null],[35,0]]]]],null,[["default"],[{"statements":[[6,[37,2],[[30,[36,4],[[32,0,["type"]],[30,[36,3],["radiogroup","checkbox-group","checkboxgroup"],null]],null]],null,[["default","else"],[{"statements":[[2," "],[11,"div"],[16,"data-property",[32,0,["prop"]]],[16,0,[31,["type-",[32,0,["type"]],[30,[36,2],[[30,[36,1],[[35,0],"error"],null]," has-error"],null]]]],[17,2],[12],[2,"\\n "],[18,3,[[32,1]]],[2,"\\n "],[13],[2,"\\n"]],"parameters":[]},{"statements":[[2," "],[11,"label"],[16,"data-property",[32,0,["prop"]]],[16,0,[31,["type-",[32,0,["type"]],[30,[36,2],[[30,[36,1],[[35,0],"error"],null]," has-error"],null]]]],[17,2],[12],[2,"\\n "],[18,3,[[32,1]]],[2,"\\n "],[13],[2,"\\n"]],"parameters":[]}]]]],"parameters":[1]}]]]],"hasEval":false,"upvars":["state","state-matches","if","array","contains","component","mut","action","hash","let"]}',meta:{moduleName:"consul-ui/components/form-group/element/index.hbs"}}) -let d=(n=Ember._tracked,r=Ember._tracked,a=Ember._action,l=class extends t.default{constructor(...e){super(...e),o(this,"el",s,this),o(this,"touched",i,this)}get type(){return void 0!==this.el?this.el.dataset.type||this.el.getAttribute("type")||this.el.getAttribute("role"):this.args.type}get name(){return void 0!==this.args.group?`${this.args.group.name}[${this.args.name}]`:this.args.name}get prop(){return""+this.args.name.toLowerCase().split(".").join("-")}get state(){const e=this.touched&&this.args.error -return{matches:t=>"error"===t&&e}}connect(e){this.el=e}},s=u(l.prototype,"el",[n],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),i=u(l.prototype,"touched",[r],{configurable:!0,enumerable:!0,writable:!0,initializer:function(){return!1}}),u(l.prototype,"connect",[a],Object.getOwnPropertyDescriptor(l.prototype,"connect"),l.prototype),l) -e.default=d,Ember._setComponentTemplate(c,d)})),define("consul-ui/components/form-group/element/label/index",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const t=Ember.HTMLBars.template({id:"ND/d/+Dz",block:'{"symbols":["&attrs","&default"],"statements":[[11,"span"],[24,0,"form-elements-label label"],[17,1],[12],[2,"\\n "],[18,2,null],[2,"\\n"],[13],[2,"\\n"]],"hasEval":false,"upvars":[]}',meta:{moduleName:"consul-ui/components/form-group/element/label/index.hbs"}}) -var n=Ember._setComponentTemplate(t,Ember._templateOnlyComponent()) -e.default=n})),define("consul-ui/components/form-group/element/radio/index",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const t=Ember.HTMLBars.template({id:"Pv6QuCmR",block:'{"symbols":["@name","@value","&attrs","@didinsert","@onchange"],"statements":[[11,"input"],[16,3,[32,1]],[16,2,[32,2]],[17,3],[24,4,"radio"],[4,[38,1],[[30,[36,0],[[32,4]],null]],null],[4,[38,2],["change",[30,[36,0],[[32,5]],null]],null],[12],[13],[2,"\\n"]],"hasEval":false,"upvars":["optional","did-insert","on"]}',meta:{moduleName:"consul-ui/components/form-group/element/radio/index.hbs"}}) -var n=Ember._setComponentTemplate(t,Ember._templateOnlyComponent()) -e.default=n})),define("consul-ui/components/form-group/element/text/index",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const t=Ember.HTMLBars.template({id:"RUJvSrX2",block:'{"symbols":["@name","@value","&attrs","@didinsert","@oninput"],"statements":[[11,"input"],[16,3,[32,1]],[16,2,[32,2]],[17,3],[24,4,"text"],[4,[38,1],[[30,[36,0],[[32,4]],null]],null],[4,[38,2],["input",[30,[36,0],[[32,5]],null]],null],[12],[13],[2,"\\n"]],"hasEval":false,"upvars":["optional","did-insert","on"]}',meta:{moduleName:"consul-ui/components/form-group/element/text/index.hbs"}}) -var n=Ember._setComponentTemplate(t,Ember._templateOnlyComponent()) -e.default=n})),define("consul-ui/components/form-group/index",["exports","@glimmer/component"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const n=Ember.HTMLBars.template({id:"PFK3HI8F",block:'{"symbols":["&default"],"statements":[[18,1,[[30,[36,1],null,[["Element"],[[30,[36,0],["form-group/element"],[["group"],[[32,0]]]]]]]]],[2,"\\n"]],"hasEval":false,"upvars":["component","hash"]}',meta:{moduleName:"consul-ui/components/form-group/index.hbs"}}) -class r extends t.default{get name(){return this.args.name}}e.default=r,Ember._setComponentTemplate(n,r)})),define("consul-ui/components/form-input/index",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const t=Ember.HTMLBars.template({id:"TcGpchvk",block:'{"symbols":["help","@name","@chart","&attrs","&default","@help","@validations"],"statements":[[11,"label"],[16,0,[30,[36,2],["form-input",[30,[36,0],[[30,[36,1],[[32,3,["state","context","errors"]],[32,2]],null]," has-error"],null]],null]],[17,4],[12],[2,"\\n "],[10,"span"],[12],[2,"\\n "],[18,5,[[30,[36,3],["label"],null]]],[2,"\\n "],[13],[2,"\\n "],[18,5,[[30,[36,3],["input"],null]]],[2,"\\n"],[6,[37,5],[[30,[36,4],[[32,7,["help"]],[32,6]],null]],null,[["default"],[{"statements":[[6,[37,0],[[32,1]],null,[["default"],[{"statements":[[2," "],[10,"em"],[12],[2,"\\n "],[1,[32,1]],[2,"\\n "],[13],[2,"\\n"]],"parameters":[]}]]]],"parameters":[1]}]]],[2," "],[8,"state",[],[["@state","@matches"],[[32,3,["state"]],"error"]],[["default"],[{"statements":[[2,"\\n"],[2," "],[10,"strong"],[14,"role","alert"],[12],[1,[30,[36,1],[[30,[36,1],[[32,3,["state","context","errors"]],[32,2]],null],"message"],null]],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n"],[13],[2,"\\n"]],"hasEval":false,"upvars":["if","get","concat","-named-block-invocation","or","let"]}',meta:{moduleName:"consul-ui/components/form-input/index.hbs"}}) -var n=Ember._setComponentTemplate(t,Ember._templateOnlyComponent()) -e.default=n})),define("consul-ui/components/freetext-filter/index",["exports","@glimmer/component"],(function(e,t){var n,r,a -function l(e,t,n,r,a){var l={} -return Object.keys(r).forEach((function(e){l[e]=r[e]})),l.enumerable=!!l.enumerable,l.configurable=!!l.configurable,("value"in l||l.initializer)&&(l.writable=!0),l=n.slice().reverse().reduce((function(n,r){return r(e,t,n)||n}),l),a&&void 0!==l.initializer&&(l.value=l.initializer?l.initializer.call(a):void 0,l.initializer=void 0),void 0===l.initializer&&(Object.defineProperty(e,t,l),l=null),l}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const s=Ember.HTMLBars.template({id:"lUCYCwl6",block:'{"symbols":["&attrs","@value","&default"],"statements":[[11,"div"],[24,0,"freetext-filter"],[17,1],[12],[2,"\\n "],[10,"label"],[14,0,"type-search"],[12],[2,"\\n "],[10,"span"],[14,0,"freetext-filter_label"],[12],[2,"Search"],[13],[2,"\\n "],[10,"input"],[14,0,"freetext-filter_input"],[15,"onsearch",[30,[36,0],[[32,0],[32,0,["change"]]],null]],[15,"oninput",[30,[36,0],[[32,0],[32,0,["change"]]],null]],[15,"onkeydown",[30,[36,0],[[32,0],[32,0,["keydown"]]],null]],[14,3,"s"],[15,2,[32,2]],[15,"placeholder",[32,0,["placeholder"]]],[14,"autofocus","autofocus"],[14,4,"search"],[12],[13],[2,"\\n "],[13],[2,"\\n "],[18,3,null],[2,"\\n"],[13]],"hasEval":false,"upvars":["action"]}',meta:{moduleName:"consul-ui/components/freetext-filter/index.hbs"}}) -let i=(n=Ember._action,r=Ember._action,l((a=class extends t.default{get placeholder(){return this.args.placeholder||"Search"}get onsearch(){return this.args.onsearch||(()=>{})}change(e){this.onsearch(e)}keydown(e){13===e.keyCode&&e.preventDefault()}}).prototype,"change",[n],Object.getOwnPropertyDescriptor(a.prototype,"change"),a.prototype),l(a.prototype,"keydown",[r],Object.getOwnPropertyDescriptor(a.prototype,"keydown"),a.prototype),a) -e.default=i,Ember._setComponentTemplate(s,i)})),define("consul-ui/components/hashicorp-consul/index",["exports","@glimmer/component"],(function(e,t){var n,r,a -Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const l=Ember.HTMLBars.template({id:"GQy+KSaK",block:'{"symbols":["__arg0","__arg1","selector","disclosure","panel","menu","app","flash","status","type","notice","&default","@dc","@partition","@nspace","@onchange","@dcs","&attrs"],"statements":[[8,"app",[[24,0,"hashicorp-consul"],[17,18]],[["@namedBlocksInfo"],[[30,[36,4],null,[["notifications","home-nav","main-nav","complementary-nav","main","content-info"],[1,0,0,0,0,0]]]]],[["default"],[{"statements":[[6,[37,3],[[30,[36,2],[[32,1],"notifications"],null]],null,[["default","else"],[{"statements":[[6,[37,17],[[32,2]],null,[["default"],[{"statements":[[2,"\\n"],[6,[37,21],[[30,[36,20],[[30,[36,20],[[35,19,["queue"]]],null]],null]],null,[["default"],[{"statements":[[2," "],[8,[32,7,["Notification"]],[],[["@delay","@sticky"],[[30,[36,18],[[32,8,["timeout"]],[32,8,["extendedTimeout"]]],null],[32,8,["sticky"]]]],[["default"],[{"statements":[[2,"\\n"],[6,[37,3],[[32,8,["dom"]]],null,[["default","else"],[{"statements":[[2," "],[2,[32,8,["dom"]]],[2,"\\n"]],"parameters":[]},{"statements":[[6,[37,17],[[30,[36,16],[[32,8,["type"]]],null],[30,[36,16],[[32,8,["action"]]],null]],null,[["default"],[{"statements":[[2," "],[8,"notice",[[24,"role","alert"],[16,0,[30,[36,1],[[32,9]," notification-",[32,10]],null]],[24,"data-notification",""]],[["@type"],[[32,9]]],[["default"],[{"statements":[[2,"\\n "],[8,[32,11,["Header"]],[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[10,"strong"],[12],[2,"\\n "],[1,[30,[36,15],[[32,9]],null]],[2,"!\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,[32,11,["Body"]],[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[10,"p"],[12],[2,"\\n"],[6,[37,3],[[30,[36,13],[[32,10],"logout"],null]],null,[["default","else"],[{"statements":[[6,[37,3],[[30,[36,13],[[32,9],"success"],null]],null,[["default","else"],[{"statements":[[2," You are now logged out.\\n"]],"parameters":[]},{"statements":[[2," There was an error logging out.\\n"]],"parameters":[]}]]]],"parameters":[]},{"statements":[[6,[37,3],[[30,[36,13],[[32,10],"authorize"],null]],null,[["default","else"],[{"statements":[[6,[37,3],[[30,[36,13],[[32,9],"success"],null]],null,[["default","else"],[{"statements":[[2," You are now logged in.\\n"]],"parameters":[]},{"statements":[[2," There was an error, please check your SecretID/Token\\n"]],"parameters":[]}]]]],"parameters":[]},{"statements":[[6,[37,3],[[30,[36,14],[[30,[36,13],[[32,10],"use"],null],[30,[36,13],[[32,8,["model"]],"token"],null]],null]],null,[["default","else"],[{"statements":[[2," "],[8,"consul/token/notifications",[],[["@type","@status","@item","@error"],[[32,10],[32,9],[32,8,["item"]],[32,8,["error"]]]],null],[2,"\\n"]],"parameters":[]},{"statements":[[6,[37,3],[[30,[36,13],[[32,8,["model"]],"intention"],null]],null,[["default","else"],[{"statements":[[2," "],[8,"consul/intention/notifications",[],[["@type","@status","@item","@error"],[[32,10],[32,9],[32,8,["item"]],[32,8,["error"]]]],null],[2,"\\n"]],"parameters":[]},{"statements":[[6,[37,3],[[30,[36,13],[[32,8,["model"]],"role"],null]],null,[["default","else"],[{"statements":[[2," "],[8,"consul/role/notifications",[],[["@type","@status","@item","@error"],[[32,10],[32,9],[32,8,["item"]],[32,8,["error"]]]],null],[2,"\\n"]],"parameters":[]},{"statements":[[6,[37,3],[[30,[36,13],[[32,8,["model"]],"policy"],null]],null,[["default"],[{"statements":[[2," "],[8,"consul/policy/notifications",[],[["@type","@status","@item","@error"],[[32,10],[32,9],[32,8,["item"]],[32,8,["error"]]]],null],[2,"\\n "]],"parameters":[]}]]]],"parameters":[]}]]]],"parameters":[]}]]]],"parameters":[]}]]],[2," "]],"parameters":[]}]]]],"parameters":[]}]]],[2," "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[11]}]]],[2,"\\n"]],"parameters":[9,10]}]]]],"parameters":[]}]]],[2," "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[8]}]]],[2,"\\n "]],"parameters":[7]}]]]],"parameters":[]},{"statements":[[6,[37,3],[[30,[36,2],[[32,1],"home-nav"],null]],null,[["default","else"],[{"statements":[[2,"\\n "],[10,"a"],[15,6,[30,[36,7],["index"],null]],[12],[8,"consul/logo",[],[[],[]],null],[13],[2,"\\n "]],"parameters":[]},{"statements":[[6,[37,3],[[30,[36,2],[[32,1],"main-nav"],null]],null,[["default","else"],[{"statements":[[2,"\\n "],[10,"ul"],[12],[2,"\\n "],[8,"consul/datacenter/selector",[],[["@dc","@partition","@nspace","@dcs"],[[32,13],[32,14],[32,15],[32,17]]],null],[2,"\\n "],[8,"consul/partition/selector",[],[["@dc","@partition","@nspace","@partitions","@onchange"],[[32,13],[32,14],[32,15],[32,0,["partitions"]],[30,[36,11],[[32,0],[30,[36,10],[[32,0,["partitions"]]],null]],[["value"],["data"]]]]],null],[2,"\\n "],[8,"consul/nspace/selector",[],[["@dc","@partition","@nspace","@nspaces","@onchange"],[[32,13],[32,14],[32,15],[32,0,["nspaces"]],[30,[36,11],[[32,0],[30,[36,10],[[32,0,["nspaces"]]],null]],[["value"],["data"]]]]],null],[2,"\\n"],[6,[37,3],[[30,[36,12],["access overview"],null]],null,[["default"],[{"statements":[[2," "],[10,"li"],[15,0,[30,[36,9],[[30,[36,8],["is-active",[30,[36,6],["dc.show",[32,13,["Name"]]],null]],null]],null]],[12],[2,"\\n "],[8,"action",[],[["@href"],[[30,[36,7],["dc.show",[32,13,["Name"]]],null]]],[["default"],[{"statements":[[2,"\\n Overview\\n "]],"parameters":[]}]]],[2,"\\n "],[13],[2,"\\n"]],"parameters":[]}]]],[6,[37,3],[[30,[36,12],["read services"],null]],null,[["default"],[{"statements":[[2," "],[10,"li"],[15,0,[30,[36,3],[[30,[36,6],["dc.services",[32,13,["Name"]]],null],"is-active"],null]],[12],[2,"\\n "],[10,"a"],[15,6,[30,[36,7],["dc.services",[32,13,["Name"]]],null]],[12],[2,"Services"],[13],[2,"\\n "],[13],[2,"\\n"]],"parameters":[]}]]],[6,[37,3],[[30,[36,12],["read nodes"],null]],null,[["default"],[{"statements":[[2," "],[10,"li"],[15,0,[30,[36,3],[[30,[36,6],["dc.nodes",[32,13,["Name"]]],null],"is-active"],null]],[12],[2,"\\n "],[10,"a"],[15,6,[30,[36,7],["dc.nodes",[32,13,["Name"]]],null]],[12],[2,"Nodes"],[13],[2,"\\n "],[13],[2,"\\n"]],"parameters":[]}]]],[6,[37,3],[[30,[36,12],["read kv"],null]],null,[["default"],[{"statements":[[2," "],[10,"li"],[15,0,[30,[36,3],[[30,[36,6],["dc.kv",[32,13,["Name"]]],null],"is-active"],null]],[12],[2,"\\n "],[10,"a"],[15,6,[30,[36,7],["dc.kv",[32,13,["Name"]]],null]],[12],[2,"Key/Value"],[13],[2,"\\n "],[13],[2,"\\n"]],"parameters":[]}]]],[6,[37,3],[[30,[36,12],["read intentions"],null]],null,[["default"],[{"statements":[[2," "],[10,"li"],[15,0,[30,[36,3],[[30,[36,6],["dc.intentions",[32,13,["Name"]]],null],"is-active"],null]],[12],[2,"\\n "],[10,"a"],[15,6,[30,[36,7],["dc.intentions",[32,13,["Name"]]],null]],[12],[2,"Intentions"],[13],[2,"\\n "],[13],[2,"\\n"]],"parameters":[]}]]],[2," "],[8,"consul/acl/selector",[],[["@dc","@partition","@nspace"],[[32,13],[32,14],[32,15]]],null],[2,"\\n "],[13],[2,"\\n "]],"parameters":[]},{"statements":[[6,[37,3],[[30,[36,2],[[32,1],"complementary-nav"],null]],null,[["default","else"],[{"statements":[[2,"\\n "],[10,"ul"],[12],[2,"\\n "],[8,"debug/navigation",[],[[],[]],null],[2,"\\n "],[10,"li"],[12],[2,"\\n "],[8,"disclosure-menu",[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[8,[32,4,["Action"]],[[4,[38,5],["click",[32,4,["toggle"]]],null]],[[],[]],[["default"],[{"statements":[[2,"\\n Help\\n "]],"parameters":[]}]]],[2,"\\n "],[8,[32,4,["Menu"]],[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[8,[32,5,["Menu"]],[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[8,[32,6,["Separator"]],[],[[],[]],[["default"],[{"statements":[[2,"\\n Consul v"],[1,[30,[36,0],["CONSUL_VERSION"],null]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,[32,6,["Item"]],[[24,0,"docs-link"]],[[],[]],[["default"],[{"statements":[[2,"\\n "],[8,[32,6,["Action"]],[],[["@href","@external"],[[30,[36,0],["CONSUL_DOCS_URL"],null],true]],[["default"],[{"statements":[[2,"\\n Documentation\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,[32,6,["Item"]],[[24,0,"learn-link"]],[[],[]],[["default"],[{"statements":[[2,"\\n "],[8,[32,6,["Action"]],[],[["@href","@external"],[[30,[36,1],[[30,[36,0],["CONSUL_DOCS_LEARN_URL"],null],"/consul"],null],true]],[["default"],[{"statements":[[2,"\\n HashiCorp Learn\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,[32,6,["Separator"]],[],[[],[]],null],[2,"\\n "],[8,[32,6,["Item"]],[[24,0,"feedback-link"]],[[],[]],[["default"],[{"statements":[[2,"\\n "],[8,[32,6,["Action"]],[],[["@href","@external"],[[30,[36,0],["CONSUL_REPO_ISSUES_URL"],null],true]],[["default"],[{"statements":[[2,"\\n Provide Feedback\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[6]}]]],[2,"\\n "]],"parameters":[5]}]]],[2,"\\n "]],"parameters":[4]}]]],[2,"\\n "],[13],[2,"\\n "],[10,"li"],[15,0,[30,[36,3],[[30,[36,6],["settings"],null],"is-active"],null]],[12],[2,"\\n "],[10,"a"],[15,6,[30,[36,7],["settings"],[["params"],[[30,[36,4],null,[["nspace","partition"],[[29],[29]]]]]]]],[12],[2,"\\n Settings\\n "],[13],[2,"\\n "],[13],[2,"\\n "],[8,"consul/token/selector",[],[["@dc","@partition","@nspace","@onchange"],[[32,13],[32,14],[32,15],[32,16]]],[["default"],[{"statements":[[2,"\\n "],[8,"ref",[],[["@target","@name","@value"],[[32,0],"tokenSelector",[32,3]]],null],[2,"\\n "]],"parameters":[3]}]]],[2,"\\n "],[13],[2,"\\n "]],"parameters":[]},{"statements":[[6,[37,3],[[30,[36,2],[[32,1],"main"],null]],null,[["default","else"],[{"statements":[[2,"\\n "],[18,12,[[30,[36,4],null,[["login"],[[30,[36,3],[[32,0,["tokenSelector"]],[32,0,["tokenSelector"]],[30,[36,4],null,[["open","close"],[[29],[29]]]]],null]]]]]],[2,"\\n "]],"parameters":[]},{"statements":[[6,[37,3],[[30,[36,2],[[32,1],"content-info"],null]],null,[["default"],[{"statements":[[2,"\\n "],[10,"p"],[12],[2,"\\n Consul v"],[1,[30,[36,0],["CONSUL_VERSION"],null]],[2,"\\n "],[13],[2,"\\n "],[2,[30,[36,1],["\x3c!-- ",[30,[36,0],["CONSUL_GIT_SHA"],null],"--\x3e"],null]],[2,"\\n "]],"parameters":[]}]]]],"parameters":[]}]]]],"parameters":[]}]]]],"parameters":[]}]]]],"parameters":[]}]]]],"parameters":[]}]]]],"parameters":[1,2]}]]]],"hasEval":false,"upvars":["env","concat","-is-named-block-invocation","if","hash","on","is-href","href-to","array","class-map","mut","action","can","eq","or","capitalize","lowercase","let","sub","flashMessages","-track-array","each"]}',meta:{moduleName:"consul-ui/components/hashicorp-consul/index.hbs"}}) -let s=(n=Ember.inject.service("flashMessages"),r=class extends t.default{constructor(...e){var t,n,r,l -super(...e),t=this,n="flashMessages",l=this,(r=a)&&Object.defineProperty(t,n,{enumerable:r.enumerable,configurable:r.configurable,writable:r.writable,value:r.initializer?r.initializer.call(l):void 0})}},i=r.prototype,o="flashMessages",u=[n],c={configurable:!0,enumerable:!0,writable:!0,initializer:null},m={},Object.keys(c).forEach((function(e){m[e]=c[e]})),m.enumerable=!!m.enumerable,m.configurable=!!m.configurable,("value"in m||m.initializer)&&(m.writable=!0),m=u.slice().reverse().reduce((function(e,t){return t(i,o,e)||e}),m),d&&void 0!==m.initializer&&(m.value=m.initializer?m.initializer.call(d):void 0,m.initializer=void 0),void 0===m.initializer&&(Object.defineProperty(i,o,m),m=null),a=m,r) -var i,o,u,c,d,m -e.default=s,Ember._setComponentTemplate(l,s)})),define("consul-ui/components/informed-action/index",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const t=Ember.HTMLBars.template({id:"VuPbMP+L",block:'{"symbols":["&attrs","&default"],"statements":[[11,"div"],[24,0,"informed-action"],[17,1],[12],[2,"\\n "],[10,"div"],[12],[2,"\\n "],[10,"header"],[12],[2,"\\n "],[18,2,[[30,[36,0],["header"],null]]],[2,"\\n "],[13],[2,"\\n "],[18,2,[[30,[36,0],["body"],null]]],[2,"\\n "],[13],[2,"\\n "],[10,"ul"],[12],[2,"\\n "],[18,2,[[30,[36,0],["actions"],null],[30,[36,2],null,[["Action"],[[30,[36,1],["anonymous"],[["tagName"],["li"]]]]]]]],[2,"\\n "],[13],[2,"\\n"],[13]],"hasEval":false,"upvars":["-named-block-invocation","component","hash"]}',meta:{moduleName:"consul-ui/components/informed-action/index.hbs"}}) -var n=Ember._setComponentTemplate(t,Ember._templateOnlyComponent()) -e.default=n})),define("consul-ui/components/ivy-codemirror",["exports","ivy-codemirror/components/ivy-codemirror"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/components/jwt-source/index",["exports","@glimmer/component","consul-ui/utils/dom/event-source"],(function(e,t,n){var r,a,l,s,i -function o(e,t,n,r){n&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(r):void 0})}function u(e,t,n,r,a){var l={} -return Object.keys(r).forEach((function(e){l[e]=r[e]})),l.enumerable=!!l.enumerable,l.configurable=!!l.configurable,("value"in l||l.initializer)&&(l.writable=!0),l=n.slice().reverse().reduce((function(n,r){return r(e,t,n)||n}),l),a&&void 0!==l.initializer&&(l.value=l.initializer?l.initializer.call(a):void 0,l.initializer=void 0),void 0===l.initializer&&(Object.defineProperty(e,t,l),l=null),l}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -let c=(r=Ember.inject.service("repository/oidc-provider"),a=Ember.inject.service("dom"),l=class extends t.default{constructor(){super(...arguments),o(this,"repo",s,this),o(this,"dom",i,this),this.source&&this.source.close(),this._listeners=this.dom.listeners(),this.source=(0,n.fromPromise)(this.repo.findCodeByURL(this.args.src)),this._listeners.add(this.source,{message:e=>this.onchange(e),error:e=>this.onerror(e)})}onchange(e){"function"==typeof this.args.onchange&&this.args.onchange(...arguments)}onerror(e){"function"==typeof this.args.onerror&&this.args.onerror(...arguments)}willDestroy(){super.willDestroy(...arguments),this.source&&this.source.close(),this.repo.close(),this._listeners.remove()}},s=u(l.prototype,"repo",[r],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),i=u(l.prototype,"dom",[a],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),l) -e.default=c})),define("consul-ui/components/list-collection/index",["exports","ember-collection/components/ember-collection","ember-collection/layouts/percentage-columns","block-slots"],(function(e,t,n,r){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const a=Ember.HTMLBars.template({id:"sapn9cV8",block:'{"symbols":["slice","more","item","index","cell","&default","&attrs"],"statements":[[11,"div"],[16,0,[31,["list-collection list-collection-scroll-",[34,26]]]],[23,5,[30,[36,28],["height:",[35,27,["height"]],"px"],null]],[16,1,[34,29]],[17,7],[12],[2,"\\n"],[18,6,null],[2,"\\n"],[6,[37,2],[[30,[36,20],[[35,26],"virtual"],null]],null,[["default","else"],[{"statements":[[2," "],[1,[30,[36,21],["resize",[30,[36,4],[[32,0],"resize"],null]],null]],[2,"\\n "],[8,"ember-native-scrollable",[],[["@tagName","@content-size","@scroll-left","@scroll-top","@scrollChange","@clientSizeChange"],["ul",[34,22],[34,23],[34,24],[30,[36,4],[[32,0],"scrollChange"],null],[30,[36,4],[[32,0],"clientSizeChange"],null]]],[["default"],[{"statements":[[2,"\\n "],[10,"li"],[12],[13],[6,[37,14],[[30,[36,13],[[30,[36,13],[[35,25]],null]],null]],null,[["default"],[{"statements":[[10,"li"],[15,"onclick",[30,[36,4],[[32,0],"click"],null]],[22,5,[32,5,["style"]]],[15,0,[30,[36,2],[[35,8],[30,[36,2],[[30,[36,9],[[35,8]],[["item"],[[32,5,["item"]]]]],"linkable"],null]],null]],[12],[2,"\\n "],[8,"yield-slot",[],[["@name"],["header"]],[["default"],[{"statements":[[10,"div"],[14,0,"header"],[12],[18,6,[[32,5,["item"]],[32,5,["index"]]]],[13]],"parameters":[]}]]],[2,"\\n "],[8,"yield-slot",[],[["@name"],["details"]],[["default"],[{"statements":[[10,"div"],[14,0,"detail"],[12],[18,6,[[32,5,["item"]],[32,5,["index"]]]],[13]],"parameters":[]}]]],[2,"\\n "],[8,"yield-slot",[],[["@name","@params"],["actions",[30,[36,12],[[30,[36,11],["more-popover-menu"],[["expanded","onchange"],[[30,[36,2],[[30,[36,20],[[35,19],[32,5,["index"]]],null],true,false],null],[30,[36,4],[[32,0],"change",[32,5,["index"]]],null]]]]],null]]],[["default"],[{"statements":[[2,"\\n "],[10,"div"],[14,0,"actions"],[12],[2,"\\n "],[18,6,[[32,5,["item"]],[32,5,["index"]]]],[2,"\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[13]],"parameters":[5]}]]]],"parameters":[]}]]],[2,"\\n"]],"parameters":[]},{"statements":[[6,[37,6],[[30,[36,2],[[30,[36,17],[[35,15],[30,[36,10],[[32,0,["expand"]]],null]],null],[30,[36,18],[0,[35,15],[35,0]],null],[35,0]],null]],null,[["default"],[{"statements":[[2," "],[10,"ul"],[12],[2,"\\n "],[10,"li"],[14,5,"display: none;"],[12],[13],[6,[37,14],[[30,[36,13],[[30,[36,13],[[32,1]],null]],null]],null,[["default"],[{"statements":[[10,"li"],[15,"onclick",[30,[36,4],[[32,0],"click"],null]],[15,0,[30,[36,2],[[30,[36,10],[[35,8]],null],"linkable",[30,[36,2],[[30,[36,9],[[35,8]],[["item"],[[35,7,["item"]]]]],"linkable"],null]],null]],[12],[2,"\\n "],[8,"yield-slot",[],[["@name"],["header"]],[["default"],[{"statements":[[10,"div"],[14,0,"header"],[12],[18,6,[[32,3],[32,4]]],[13]],"parameters":[]}]]],[2,"\\n "],[8,"yield-slot",[],[["@name"],["details"]],[["default"],[{"statements":[[10,"div"],[14,0,"detail"],[12],[18,6,[[32,3],[32,4]]],[13]],"parameters":[]}]]],[2,"\\n "],[8,"yield-slot",[],[["@name","@params"],["actions",[30,[36,12],[[30,[36,11],["more-popover-menu"],[["onchange"],[[30,[36,4],[[32,0],"change",[32,4]],null]]]]],null]]],[["default"],[{"statements":[[2,"\\n "],[10,"div"],[14,0,"actions"],[12],[2,"\\n "],[18,6,[[32,3],[32,4]]],[2,"\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[13]],"parameters":[3,4]}]]],[13],[2,"\\n"],[6,[37,2],[[30,[36,17],[[35,15],[30,[36,16],[[35,0,["length"]],[35,15]],null]],null]],null,[["default"],[{"statements":[[6,[37,6],[[30,[36,5],[[32,1,["length"]],[35,0,["length"]]],null]],null,[["default"],[{"statements":[[2," "],[10,"button"],[15,0,[30,[36,2],[[32,2],"closed"],null]],[15,"onclick",[30,[36,4],[[32,0],[30,[36,3],[[32,0,["expand"]]],null],[32,2]],null]],[14,4,"button"],[12],[2,"\\n"],[6,[37,2],[[32,2]],null,[["default","else"],[{"statements":[[2," View "],[1,[30,[36,1],[[35,0,["length"]],[32,1,["length"]]],null]],[2," more\\n"]],"parameters":[]},{"statements":[[2," View less\\n"]],"parameters":[]}]]],[2," "],[13],[2,"\\n"]],"parameters":[2]}]]]],"parameters":[]}]]]],"parameters":[1]}]]],[2,"\\n"]],"parameters":[]}]]],[13]],"hasEval":false,"upvars":["items","sub","if","mut","action","not-eq","let","cell","linkable","is","not","component","block-params","-track-array","each","partial","gt","and","slice","checked","eq","on-window","_contentSize","_scrollLeft","_scrollTop","_cells","scroll","style","concat","guid"]}',meta:{moduleName:"consul-ui/components/list-collection/index.hbs"}}),l=n.default.prototype.formatItemStyle -var s=Ember._setComponentTemplate(a,t.default.extend(r.default,{dom:Ember.inject.service("dom"),tagName:"",height:500,cellHeight:70,checked:null,scroll:"virtual",init:function(){this._super(...arguments),this.columns=[100],this.guid=this.dom.guid(this)},didInsertElement:function(){this._super(...arguments),this.$element=this.dom.element("#"+this.guid),"virtual"===this.scroll&&this.actions.resize.apply(this,[{target:this.dom.viewport()}])},didReceiveAttrs:function(){this._super(...arguments),this._cellLayout=this["cell-layout"]=new n.default(Ember.get(this,"items.length"),Ember.get(this,"columns"),Ember.get(this,"cellHeight")) -const e=this -this["cell-layout"].formatItemStyle=function(t){let n=l.apply(this,arguments) -return e.checked===t&&(n+=";z-index: 1"),n}},style:Ember.computed("height",(function(){return"virtual"!==this.scroll?{}:{height:Ember.get(this,"height")}})),actions:{resize:function(e){const t=Ember.get(this,"dom").element('footer[role="contentinfo"]') -if(t){const n=1,r=this.$element.getBoundingClientRect().top+t.clientHeight+n,a=e.target.innerHeight-r -this.set("height",Math.max(0,a)),this.updateItems(),this.updateScrollPosition()}},click:function(e){return this.dom.clickFirstAnchor(e,".list-collection > ul > li")},change:function(e,t={}){if(t.target.checked&&e!==Ember.get(this,"checked")){Ember.set(this,"checked",parseInt(e)),this.$row=this.dom.closest("li",t.target),this.$row.style.zIndex=1 -const n=this.dom.sibling(t.target,"div") -n.getBoundingClientRect().top+n.clientHeight>this.dom.element('footer[role="contentinfo"]').getBoundingClientRect().top?n.classList.add("above"):n.classList.remove("above")}else{this.dom.sibling(t.target,"div").classList.remove("above"),Ember.set(this,"checked",null),this.$row.style.zIndex=null}}}})) -e.default=s})),define("consul-ui/components/maybe-in-element",["exports","ember-maybe-in-element/components/maybe-in-element"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/components/menu-panel/index",["exports","block-slots"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const n=Ember.HTMLBars.template({id:"NsIcnIv+",block:'{"symbols":["api","&default","&attrs"],"statements":[[18,2,null],[2,"\\n"],[6,[37,8],[[30,[36,7],null,[["change"],[[30,[36,4],[[32,0],"change"],null]]]]],null,[["default"],[{"statements":[[11,"div"],[16,0,[30,[36,3],[[30,[36,1],["menu-panel"],null],[30,[36,1],["menu-panel-deprecated"],null],[30,[36,1],[[35,2]],null],[30,[36,1],[[35,0],"confirmation"],null]],null]],[4,[38,5],[[30,[36,4],[[32,0],"connect"],null]],null],[12],[2,"\\n "],[8,"yield-slot",[],[["@name"],["controls"]],[["default"],[{"statements":[[2,"\\n "],[18,2,[[32,1]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n"],[6,[37,6],null,[["name"],["header"]],[["default","else"],[{"statements":[[2," "],[10,"div"],[12],[2,"\\n "],[18,2,[[32,1]]],[2,"\\n "],[13],[2,"\\n"]],"parameters":[]},{"statements":[],"parameters":[]}]]],[2," "],[11,"ul"],[24,"role","menu"],[17,3],[12],[2,"\\n "],[8,"yield-slot",[],[["@name"],["menu"]],[["default"],[{"statements":[[2,"\\n "],[18,2,[[32,1]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[13],[2,"\\n"],[13],[2,"\\n"]],"parameters":[1]}]]]],"hasEval":false,"upvars":["isConfirmation","array","position","class-map","action","did-insert","yield-slot","hash","let"]}',meta:{moduleName:"consul-ui/components/menu-panel/index.hbs"}}) -var r=Ember._setComponentTemplate(n,Ember.Component.extend(t.default,{tagName:"",dom:Ember.inject.service("dom"),isConfirmation:!1,actions:{connect:function(e){Ember.run.next(()=>{if(!this.isDestroyed){const t=this.dom.element('li:only-child > [role="menu"]:first-child',e) -Ember.set(this,"isConfirmation",void 0!==t)}})},change:function(e){const t=e.target.getAttribute("id"),n=this.dom.element(`[for='${t}']`),r=this.dom.element("[role=menu]",n.parentElement),a=this.dom.closest(".menu-panel",r) -if(e.target.checked){r.style.display="block" -const e=r.offsetHeight+2 -a.style.maxHeight=a.style.minHeight=e+"px"}else r.style.display=null,a.style.maxHeight=null,a.style.minHeight="0"}}})) -e.default=r})),define("consul-ui/components/menu/action/index",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const t=Ember.HTMLBars.template({id:"H3aA1fem",block:'{"symbols":["&attrs","@href","@external","@disclosure","&default"],"statements":[[8,"action",[[24,"role","menuitem"],[17,1],[4,[38,2],["click",[30,[36,1],[[32,2],[32,4,["close"]],[30,[36,0],null,null]],null]],null]],[["@href","@external"],[[32,2],[32,3]]],[["default"],[{"statements":[[2,"\\n "],[18,5,null],[2,"\\n"]],"parameters":[]}]]],[2,"\\n"]],"hasEval":false,"upvars":["noop","if","on"]}',meta:{moduleName:"consul-ui/components/menu/action/index.hbs"}}) -var n=Ember._setComponentTemplate(t,Ember._templateOnlyComponent()) -e.default=n})),define("consul-ui/components/menu/index",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const t=Ember.HTMLBars.template({id:"grZDhn10",block:'{"symbols":["@pager","@disclosure","@event","@onclose","&default"],"statements":[[11,"ul"],[24,"role","menu"],[23,5,[30,[36,4],[[30,[36,3],["height",[30,[36,2],[[30,[36,1],[[32,1],[30,[36,0],[[32,1,["type"]],"native-scroll"],null]],null],[32,1,["totalHeight"]]],null],"px"],null],[30,[36,3],["--paged-start",[30,[36,2],[[30,[36,1],[[32,1],[30,[36,0],[[32,1,["type"]],"native-scroll"],null]],null],[32,1,["startHeight"]]],null],"px"],null]],null]],[4,[38,6],[[30,[36,5],[[32,1,["pane"]]],null]],null],[4,[38,8],null,[["onclose","openEvent"],[[30,[36,7],[[32,4],[32,2,["close"]]],null],[30,[36,7],[[32,3],[32,2,["event"]]],null]]]],[12],[2,"\\n "],[18,5,[[30,[36,10],null,[["Action","Item","Separator","items"],[[30,[36,9],["menu/action"],[["disclosure"],[[32,2]]]],[30,[36,9],["menu/item"],null],[30,[36,9],["menu/separator"],null],[32,1,["items"]]]]]]],[2,"\\n"],[13]],"hasEval":false,"upvars":["not-eq","and","if","array","style-map","optional","did-insert","or","aria-menu","component","hash"]}',meta:{moduleName:"consul-ui/components/menu/index.hbs"}}) -var n=Ember._setComponentTemplate(t,Ember._templateOnlyComponent()) -e.default=n})),define("consul-ui/components/menu/item/index",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const t=Ember.HTMLBars.template({id:"50p8S2ab",block:'{"symbols":["&attrs","&default"],"statements":[[11,"li"],[24,"role","none"],[17,1],[12],[2,"\\n "],[18,2,null],[2,"\\n"],[13],[2,"\\n\\n"]],"hasEval":false,"upvars":[]}',meta:{moduleName:"consul-ui/components/menu/item/index.hbs"}}) -var n=Ember._setComponentTemplate(t,Ember._templateOnlyComponent()) -e.default=n})),define("consul-ui/components/menu/separator/index",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const t=Ember.HTMLBars.template({id:"TK+1HboX",block:'{"symbols":["&attrs","&default"],"statements":[[11,"li"],[24,"role","separator"],[17,1],[12],[18,2,null],[13],[2,"\\n"]],"hasEval":false,"upvars":[]}',meta:{moduleName:"consul-ui/components/menu/separator/index.hbs"}}) -var n=Ember._setComponentTemplate(t,Ember._templateOnlyComponent()) -e.default=n})),define("consul-ui/components/modal-dialog/index",["exports","block-slots","a11y-dialog"],(function(e,t,n){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const r=Ember.HTMLBars.template({id:"QFjycrze",block:'{"symbols":["aria","&default","&attrs","@aria"],"statements":[[6,[37,6],[[30,[36,3],null,[["labelledby"],[[30,[36,5],null,null]]]]],null,[["default"],[{"statements":[[2," "],[8,"portal",[],[["@target"],["modal"]],[["default"],[{"statements":[[2,"\\n "],[18,2,null],[2,"\\n "],[11,"div"],[24,0,"modal-dialog"],[24,"aria-hidden","true"],[17,3],[4,[38,1],[[30,[36,0],[[32,0],"connect"],null]],null],[4,[38,2],[[30,[36,0],[[32,0],"disconnect"],null]],null],[12],[2,"\\n "],[10,"div"],[14,"tabindex","-1"],[14,"data-a11y-dialog-hide",""],[12],[13],[2,"\\n "],[10,"div"],[14,0,"modal-dialog-modal"],[14,"role","dialog"],[15,"aria-label",[32,4,["label"]]],[12],[2,"\\n "],[10,"div"],[14,"role","document"],[12],[2,"\\n "],[10,"header"],[14,0,"modal-dialog-header"],[12],[2,"\\n "],[10,"button"],[14,"data-a11y-dialog-hide",""],[14,"aria-label","Close dialog"],[14,4,"button"],[12],[2,"\\n "],[13],[2,"\\n "],[8,"yield-slot",[],[["@name"],["header"]],[["default"],[{"statements":[[2,"\\n "],[18,2,[[30,[36,3],null,[["open","close","aria"],[[30,[36,0],[[32,0],"open"],null],[30,[36,0],[[32,0],"close"],null],[32,1]]]]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[13],[2,"\\n "],[10,"div"],[14,0,"modal-dialog-body"],[12],[2,"\\n "],[8,"yield-slot",[],[["@name"],["body"]],[["default"],[{"statements":[[2,"\\n "],[18,2,[[30,[36,3],null,[["open","close","aria"],[[30,[36,0],[[32,0],"open"],null],[30,[36,0],[[32,0],"close"],null],[32,1]]]]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[13],[2,"\\n "],[10,"footer"],[14,0,"modal-dialog-footer"],[12],[2,"\\n "],[8,"yield-slot",[],[["@name","@params"],["actions",[30,[36,4],[[30,[36,0],[[32,0],"close"],null]],null]]],[["default"],[{"statements":[[2,"\\n "],[18,2,[[30,[36,3],null,[["open","close","aria"],[[30,[36,0],[[32,0],"open"],null],[30,[36,0],[[32,0],"close"],null],[32,1]]]]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[13],[2,"\\n "],[13],[2,"\\n "],[13],[2,"\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[1]}]]]],"hasEval":false,"upvars":["action","did-insert","will-destroy","hash","block-params","unique-id","let"]}',meta:{moduleName:"consul-ui/components/modal-dialog/index.hbs"}}) -var a=Ember._setComponentTemplate(r,Ember.Component.extend(t.default,{tagName:"",onclose:function(){},onopen:function(){},actions:{connect:function(e){this.dialog=new n.default(e),this.dialog.on("hide",()=>this.onclose({target:e})),this.dialog.on("show",()=>this.onopen({target:e})),this.open&&this.dialog.show()},disconnect:function(){this.dialog.destroy()},open:function(){this.dialog.show()},close:function(){this.dialog.hide()}}})) -e.default=a})),define("consul-ui/components/modal-layer/index",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const t=Ember.HTMLBars.template({id:"SGKsWSq5",block:'{"symbols":["&attrs"],"statements":[[11,"div"],[24,0,"modal-layer"],[17,1],[12],[2,"\\n "],[8,"portal-target",[],[["@name","@multiple"],["modal",true]],null],[2,"\\n"],[13],[2,"\\n"]],"hasEval":false,"upvars":[]}',meta:{moduleName:"consul-ui/components/modal-layer/index.hbs"}}) -var n=Ember._setComponentTemplate(t,Ember._templateOnlyComponent()) -e.default=n})),define("consul-ui/components/more-popover-menu/index",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const t=Ember.HTMLBars.template({id:"tD2XBvHN",block:'{"symbols":["components","api","&attrs","&default"],"statements":[[11,"div"],[24,0,"more-popover-menu"],[17,3],[12],[2,"\\n "],[8,"popover-menu",[],[["@expanded","@onchange","@keyboardAccess"],[[34,0],[30,[36,2],[[32,0],[35,1]],null],false]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["trigger"]],[["default"],[{"statements":[[2,"\\n More\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["menu"]],[["default"],[{"statements":[[2,"\\n "],[18,4,[[32,1,["MenuItem"]]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[1,2]}]]],[2,"\\n"],[13],[2,"\\n"]],"hasEval":false,"upvars":["expanded","onchange","action"]}',meta:{moduleName:"consul-ui/components/more-popover-menu/index.hbs"}}) -var n=Ember._setComponentTemplate(t,Ember.Component.extend({tagName:""})) -e.default=n})),define("consul-ui/components/notice/index",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const t=Ember.HTMLBars.template({id:"CHmd0+dq",block:'{"symbols":["@type","&attrs","&default"],"statements":[[11,"div"],[16,0,[31,["notice ",[30,[36,0],[[32,1],"info"],null]]]],[17,2],[12],[2,"\\n"],[18,3,[[30,[36,2],null,[["Header","Body","Footer"],[[30,[36,1],["anonymous"],[["tagName"],["header"]]],[30,[36,1],["anonymous"],null],[30,[36,1],["anonymous"],[["tagName"],["footer"]]]]]]]],[2,"\\n"],[13],[2,"\\n"]],"hasEval":false,"upvars":["or","component","hash"]}',meta:{moduleName:"consul-ui/components/notice/index.hbs"}}) -var n=Ember._setComponentTemplate(t,Ember._templateOnlyComponent()) -e.default=n})),define("consul-ui/components/oidc-select/chart.xstate",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -e.default={id:"oidc-select",initial:"idle",on:{RESET:[{target:"idle"}]},states:{idle:{on:{LOAD:[{target:"loading"}]}},loaded:{},loading:{on:{SUCCESS:[{target:"loaded"}]}}}}})) -define("consul-ui/components/oidc-select/index",["exports","@glimmer/component","consul-ui/components/oidc-select/chart.xstate"],(function(e,t,n){var r,a,l -Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const s=Ember.HTMLBars.template({id:"QN/Z72sP",block:'{"symbols":["State","Guard","ChartAction","dispatch","state","chart","item","__arg0","__arg1","option","item","ignoredState","ignoredGuard","ignoredAction","formDispatch","state","@disabled","@onchange","&attrs","@dc","@nspace","@onerror"],"statements":[[8,"state-chart",[],[["@src"],[[34,22]]],[["default"],[{"statements":[[2,"\\n"],[6,[37,4],[[30,[36,7],null,[["State","Guard","Action","dispatch","state"],[[32,1],[32,2],[32,3],[32,4],[32,5]]]]],null,[["default"],[{"statements":[[2,"\\n"],[11,"div"],[24,0,"oidc-select"],[17,19],[12],[2,"\\n "],[8,[32,1],[],[["@notMatches"],["idle"]],[["default"],[{"statements":[[2,"\\n "],[8,"data-source",[],[["@src","@onchange","@onerror"],[[30,[36,15],["/${partition}/${nspace}/${dc}/oidc/providers",[30,[36,7],null,[["partition","nspace","dc"],[[32,0,["partition"]],[32,21],[32,20]]]]],null],[30,[36,16],[[30,[36,6],[[32,0],[30,[36,5],[[32,0,["items"]]],null]],[["value"],["data"]]],[30,[36,10],[[32,4],"SUCCESS"],null]],null],[30,[36,16],[[30,[36,10],[[32,4],"RESET"],null],[32,22]],null]]],null],[2,"\\n "]],"parameters":[]}]]],[2,"\\n\\n "],[8,[32,1],[],[["@matches"],["loaded"]],[["default"],[{"statements":[[2,"\\n "],[8,"action",[[24,0,"reset"],[4,[38,11],["click",[30,[36,16],[[30,[36,17],[[32,0],"partition",""],null],[30,[36,10],[[32,4],"RESET"],null]],null]],null]],[[],[]],[["default"],[{"statements":[[2,"\\n Choose different Partition\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n\\n "],[8,"state-chart",[],[["@src"],[[30,[36,18],["validate"],null]]],[["default"],[{"statements":[[2,"\\n "],[8,"text-input",[],[["@name","@label","@item","@validations","@placeholder","@oninput","@chart"],["partition","Admin Partition",[32,0],[30,[36,7],null,[["partition"],[[30,[36,19],[[30,[36,7],null,[["test","error"],["^[a-zA-Z0-9]([a-zA-Z0-9-]{0,62}[a-zA-Z0-9])?$","Name must be a valid DNS hostname."]]]],null]]]],"Enter your Partition",[30,[36,6],[[32,0],[30,[36,5],[[32,0,["partition"]]],null]],[["value"],["target.value"]]],[30,[36,7],null,[["state","dispatch"],[[32,16],[32,15]]]]]],null],[2,"\\n\\n"],[2," "],[8,[32,1],[],[["@matches"],["idle"]],[["default"],[{"statements":[[2,"\\n "],[8,"action",[[4,[38,9],[[30,[36,1],[[30,[36,21],[[32,0,["partition","length"]],1],null],[30,[36,20],[[32,16],"error"],null]],null]],null],[4,[38,11],["click",[30,[36,10],[[32,4],"LOAD"],null]],null]],[[],[]],[["default"],[{"statements":[[2,"\\n Choose provider\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n\\n "]],"parameters":[12,13,14,15,16]}]]],[2,"\\n\\n "],[8,[32,1],[],[["@matches"],["loading"]],[["default"],[{"statements":[[2,"\\n "],[8,"progress",[[24,"aria-label","Loading"]],[[],[]],null],[2,"\\n "]],"parameters":[]}]]],[2,"\\n\\n "],[8,[32,1],[],[["@matches"],["loaded"]],[["default"],[{"statements":[[2,"\\n"],[6,[37,3],[[30,[36,21],[[32,0,["items","length"]],3],null]],null,[["default","else"],[{"statements":[[2,"\\n "],[10,"ul"],[12],[2,"\\n"],[6,[37,14],[[30,[36,13],[[30,[36,13],[[32,0,["items"]]],null]],null]],null,[["default"],[{"statements":[[2," "],[10,"li"],[12],[2,"\\n "],[8,"action",[[16,0,[30,[36,0],[[32,11,["Kind"]],"-oidc-provider"],null]],[16,"disabled",[32,17]],[4,[38,11],["click",[30,[36,10],[[32,18],[32,11]],null]],null]],[["@type"],["button"]],[["default"],[{"statements":[[2,"\\n Continue with "],[1,[30,[36,1],[[32,11,["DisplayName"]],[32,11,["Name"]]],null]],[6,[37,3],[[30,[36,2],[[32,11,["Namespace"]],"default"],null]],null,[["default"],[{"statements":[[2," ("],[1,[32,11,["Namespace"]]],[2,")"]],"parameters":[]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[13],[2,"\\n"]],"parameters":[11]}]]],[2," "],[13],[2,"\\n\\n"]],"parameters":[]},{"statements":[[2,"\\n"],[6,[37,4],[[30,[36,1],[[32,0,["provider"]],[30,[36,12],[0,[32,0,["items"]]],null]],null]],null,[["default"],[{"statements":[[2,"\\n "],[8,"option-input",[],[["@label","@name","@item","@selected","@items","@onchange","@disabled","@namedBlocksInfo"],["SSO Provider","provider",[32,0],[32,7],[32,0,["items"]],[30,[36,6],[[32,0],[30,[36,5],[[32,0,["provider"]]],null]],null],[32,17],[30,[36,7],null,[["option"],[1]]]]],[["default"],[{"statements":[[6,[37,3],[[30,[36,8],[[32,8],"option"],null]],null,[["default"],[{"statements":[[6,[37,4],[[32,9]],null,[["default"],[{"statements":[[2,"\\n "],[10,"span"],[15,0,[30,[36,0],[[32,10,["item","Kind"]],"-oidc-provider"],null]],[12],[2,"\\n "],[1,[30,[36,1],[[32,10,["item","DisplayName"]],[32,10,["item","Name"]]],null]],[6,[37,3],[[30,[36,2],[[32,10,["item","Namespace"]],"default"],null]],null,[["default"],[{"statements":[[2," ("],[1,[32,10,["item","Namespace"]]],[2,")"]],"parameters":[]}]]],[2,"\\n "],[13],[2,"\\n "]],"parameters":[10]}]]]],"parameters":[]}]]]],"parameters":[8,9]}]]],[2,"\\n\\n "],[8,"action",[[4,[38,9],[[32,17]],null],[4,[38,11],["click",[30,[36,10],[[32,18],[32,7]],null]],null]],[["@type"],["button"]],[["default"],[{"statements":[[2,"\\n Log in\\n "]],"parameters":[]}]]],[2,"\\n\\n"]],"parameters":[7]}]]]],"parameters":[]}]]],[2," "]],"parameters":[]}]]],[2,"\\n "],[13],[2,"\\n"]],"parameters":[6]}]]]],"parameters":[1,2,3,4,5]}]]]],"hasEval":false,"upvars":["concat","or","not-eq","if","let","mut","action","hash","-is-named-block-invocation","disabled","fn","on","object-at","-track-array","each","uri","queue","set","state-chart","array","state-matches","lt","chart"]}',meta:{moduleName:"consul-ui/components/oidc-select/index.hbs"}}) -let i=(r=Ember._tracked,a=class extends t.default{constructor(){var e,t,r,a -super(...arguments),e=this,t="partition",a=this,(r=l)&&Object.defineProperty(e,t,{enumerable:r.enumerable,configurable:r.configurable,writable:r.writable,value:r.initializer?r.initializer.call(a):void 0}),this.chart=n.default}},o=a.prototype,u="partition",c=[r],d={configurable:!0,enumerable:!0,writable:!0,initializer:function(){return""}},p={},Object.keys(d).forEach((function(e){p[e]=d[e]})),p.enumerable=!!p.enumerable,p.configurable=!!p.configurable,("value"in p||p.initializer)&&(p.writable=!0),p=c.slice().reverse().reduce((function(e,t){return t(o,u,e)||e}),p),m&&void 0!==p.initializer&&(p.value=p.initializer?p.initializer.call(m):void 0,p.initializer=void 0),void 0===p.initializer&&(Object.defineProperty(o,u,p),p=null),l=p,a) -var o,u,c,d,m,p -e.default=i,Ember._setComponentTemplate(s,i)})),define("consul-ui/components/option-input/index",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const t=Ember.HTMLBars.template({id:"lDf2582n",block:'{"symbols":["__arg0","item","@disabled","@onchange","@selected","@items","&default","@multiple","@expanded","@name","@label","&attrs","@item","@placeholder","@help","@validations","@chart"],"statements":[[8,"form-input",[[24,0,"option-input type-select"],[17,12]],[["@item","@placeholder","@name","@label","@help","@validations","@chart","@namedBlocksInfo"],[[32,13],[32,14],[32,10],[32,11],[32,15],[32,16],[32,17],[30,[36,0],null,[["label","input"],[0,0]]]]],[["default"],[{"statements":[[6,[37,2],[[30,[36,3],[[32,1],"label"],null]],null,[["default","else"],[{"statements":[[2,"\\n"],[2," "],[1,[30,[36,4],[[32,11],[32,10]],null]],[2,"\\n "]],"parameters":[]},{"statements":[[6,[37,2],[[30,[36,3],[[32,1],"input"],null]],null,[["default"],[{"statements":[[2,"\\n"],[6,[37,2],[[32,9]],null,[["default","else"],[{"statements":[[6,[37,2],[[32,8]],null,[["default","else"],[{"statements":[],"parameters":[]},{"statements":[],"parameters":[]}]]]],"parameters":[]},{"statements":[[2," "],[8,"power-select",[],[["@disabled","@onChange","@selected","@searchEnabled","@options"],[[32,3],[32,4],[32,5],false,[32,6]]],[["default"],[{"statements":[[2,"\\n "],[18,7,[[30,[36,1],["option"],null],[30,[36,0],null,[["item"],[[32,2]]]]]],[2,"\\n "]],"parameters":[2]}]]],[2,"\\n"]],"parameters":[]}]]],[2," "]],"parameters":[]}]]]],"parameters":[]}]]]],"parameters":[1]}]]],[2,"\\n"]],"hasEval":false,"upvars":["hash","-named-block-invocation","if","-is-named-block-invocation","or"]}',meta:{moduleName:"consul-ui/components/option-input/index.hbs"}}) -var n=Ember._setComponentTemplate(t,Ember._templateOnlyComponent()) -e.default=n})),define("consul-ui/components/outlet/index",["exports","@glimmer/component"],(function(e,t){var n,r,a,l,s,i,o,u,c,d,m,p,f,b,h,v,y,g,O,_,P,w,E -function k(e,t,n,r){n&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(r):void 0})}function x(e,t,n,r,a){var l={} -return Object.keys(r).forEach((function(e){l[e]=r[e]})),l.enumerable=!!l.enumerable,l.configurable=!!l.configurable,("value"in l||l.initializer)&&(l.writable=!0),l=n.slice().reverse().reduce((function(n,r){return r(e,t,n)||n}),l),a&&void 0!==l.initializer&&(l.value=l.initializer?l.initializer.call(a):void 0,l.initializer=void 0),void 0===l.initializer&&(Object.defineProperty(e,t,l),l=null),l}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const j=Ember.HTMLBars.template({id:"R/yzDCxZ",block:'{"symbols":["@name","@model","&default"],"statements":[[1,[30,[36,0],[[32,0,["connect"]]],null]],[2,"\\n"],[1,[30,[36,1],[[32,0,["disconnect"]]],null]],[2,"\\n"],[11,"section"],[24,0,"outlet"],[16,"data-outlet",[32,1]],[16,"data-route",[32,0,["routeName"]]],[16,"data-state",[32,0,["state","name"]]],[16,"data-transition",[30,[36,2],[[32,0,["previousState","name"]]," ",[32,0,["state","name"]]],null]],[4,[38,0],[[30,[36,3],[[32,0,["attributeChanged"]],"element"],null]],null],[4,[38,4],[[30,[36,3],[[32,0,["attributeChanged"]],"model",[32,2]],null]],null],[4,[38,5],["transitionend",[32,0,["transitionEnd"]]],null],[12],[2,"\\n "],[18,3,[[30,[36,6],null,[["state","previousState","route"],[[32,0,["state"]],[32,0,["previousState"]],[32,0,["route"]]]]]]],[2,"\\n"],[13]],"hasEval":false,"upvars":["did-insert","will-destroy","concat","fn","did-update","on","hash"]}',meta:{moduleName:"consul-ui/components/outlet/index.hbs"}}) -class C{constructor(e){this.name=e}matches(e){return this.name===e}}let S=(n=Ember.inject.service("routlet"),r=Ember.inject.service("router"),a=Ember._tracked,l=Ember._tracked,s=Ember._tracked,i=Ember._tracked,o=Ember._tracked,u=Ember._tracked,c=Ember._action,d=Ember._action,m=Ember._action,p=Ember._action,f=Ember._action,b=Ember._action,h=class extends t.default{constructor(...e){super(...e),k(this,"routlet",v,this),k(this,"router",y,this),k(this,"element",g,this),k(this,"routeName",O,this),k(this,"state",_,this),k(this,"previousState",P,this),k(this,"endTransition",w,this),k(this,"route",E,this)}get model(){return this.args.model||{}}get name(){return this.args.name}setAppRoute(e){if("loading"!==e||"oidc-provider-debug"===e){const t=this.element.ownerDocument.documentElement -t.classList.contains("ember-loading")&&t.classList.remove("ember-loading"),t.dataset.route=e,this.setAppState("idle")}}setAppState(e){this.element.ownerDocument.documentElement.dataset.state=e}attributeChanged(e,t){switch(e){case"element":this.element=t,"application"===this.args.name&&(this.setAppState("loading"),this.setAppRoute(this.router.currentRouteName)) -break -case"model":void 0!==this.route&&(this.route._model=t)}}transitionEnd(e){"function"==typeof this.endTransition&&this.endTransition()}startLoad(e){const t=this.routlet.findOutlet(e.to.name)||"application" -if(this.args.name===t){this.previousState=this.state,this.state=new C("loading"),this.endTransition=this.routlet.transition() -const e=window.getComputedStyle(this.element).getPropertyValue("transition-duration") -0===parseFloat(e)&&this.endTransition()}"application"===this.args.name&&this.setAppState("loading")}endLoad(e){this.state.matches("loading")&&(this.previousState=this.state,this.state=new C("idle")),"application"===this.args.name&&this.setAppRoute(this.router.currentRouteName)}connect(){this.routlet.addOutlet(this.args.name,this),this.previousState=this.state=new C("idle"),this.router.on("routeWillChange",this.startLoad),this.router.on("routeDidChange",this.endLoad)}disconnect(){this.routlet.removeOutlet(this.args.name),this.router.off("routeWillChange",this.startLoad),this.router.off("routeDidChange",this.endLoad)}},v=x(h.prototype,"routlet",[n],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),y=x(h.prototype,"router",[r],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),g=x(h.prototype,"element",[a],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),O=x(h.prototype,"routeName",[l],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),_=x(h.prototype,"state",[s],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),P=x(h.prototype,"previousState",[i],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),w=x(h.prototype,"endTransition",[o],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),E=x(h.prototype,"route",[u],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),x(h.prototype,"attributeChanged",[c],Object.getOwnPropertyDescriptor(h.prototype,"attributeChanged"),h.prototype),x(h.prototype,"transitionEnd",[d],Object.getOwnPropertyDescriptor(h.prototype,"transitionEnd"),h.prototype),x(h.prototype,"startLoad",[m],Object.getOwnPropertyDescriptor(h.prototype,"startLoad"),h.prototype),x(h.prototype,"endLoad",[p],Object.getOwnPropertyDescriptor(h.prototype,"endLoad"),h.prototype),x(h.prototype,"connect",[f],Object.getOwnPropertyDescriptor(h.prototype,"connect"),h.prototype),x(h.prototype,"disconnect",[b],Object.getOwnPropertyDescriptor(h.prototype,"disconnect"),h.prototype),h) -e.default=S,Ember._setComponentTemplate(j,S)})),define("consul-ui/components/paged-collection/index",["exports","@glimmer/component"],(function(e,t){var n,r,a,l,s,i,o,u,c,d,m,p,f,b,h,v,y,g,O,_,P,w -function E(e,t,n,r){n&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(r):void 0})}function k(e,t,n,r,a){var l={} -return Object.keys(r).forEach((function(e){l[e]=r[e]})),l.enumerable=!!l.enumerable,l.configurable=!!l.configurable,("value"in l||l.initializer)&&(l.writable=!0),l=n.slice().reverse().reduce((function(n,r){return r(e,t,n)||n}),l),a&&void 0!==l.initializer&&(l.value=l.initializer?l.initializer.call(a):void 0,l.initializer=void 0),void 0===l.initializer&&(Object.defineProperty(e,t,l),l=null),l}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const x=Ember.HTMLBars.template({id:"hajSVwhB",block:'{"symbols":["@page","&default"],"statements":[[18,2,[[30,[36,5],null,[["items","page","pane","resize","viewport","rowHeight","maxHeight","startHeight","totalHeight","totalPages","Pager"],[[32,0,["items"]],[32,1],[30,[36,4],[[32,0,["setPane"]]],null],[30,[36,4],[[32,0,["resize"]]],null],[30,[36,4],[[32,0,["setViewport"]]],null],[30,[36,4],[[32,0,["setRowHeight"]]],null],[30,[36,4],[[32,0,["setMaxHeight"]]],null],[32,0,["startHeight"]],[32,0,["totalHeight"]],[32,0,["totalPages"]],[30,[36,3],[[30,[36,2],[[35,1],"index"],null],[30,[36,0],["yield"],null],""],null]]]]]],[2,"\\n\\n"],[1,[30,[36,6],[[32,0,["disconnect"]]],null]],[2,"\\n"]],"hasEval":false,"upvars":["component","type","eq","if","fn","hash","will-destroy"]}',meta:{moduleName:"consul-ui/components/paged-collection/index.hbs"}}) -let j=(n=Ember._tracked,r=Ember._tracked,a=Ember._tracked,l=Ember._tracked,s=Ember._tracked,i=Ember._tracked,o=Ember._tracked,u=Ember._action,c=Ember._action,d=Ember._action,m=Ember._action,p=Ember._action,f=Ember._action,b=Ember._action,h=class extends t.default{constructor(...e){super(...e),E(this,"$pane",v,this),E(this,"$viewport",y,this),E(this,"top",g,this),E(this,"visibleItems",O,this),E(this,"overflow",_,this),E(this,"_rowHeight",P,this),E(this,"_type",w,this)}get type(){return this.args.type||this._type}get items(){return this.args.items.slice(this.cursor,this.cursor+this.perPage)}get perPage(){switch(this.type){case"virtual-scroll":return this.visibleItems+2*this.overflow -case"index":return parseInt(this.args.perPage)}return this.total}get cursor(){switch(this.type){case"virtual-scroll":return this.itemsBefore -case"index":return(parseInt(this.args.page)-1)*this.perPage}return 0}get itemsBefore(){return void 0===this.$viewport?0:Math.max(0,Math.round(this.top/this.rowHeight)-this.overflow)}get rowHeight(){return parseFloat(this.args.rowHeight||this._rowHeight)}get startHeight(){switch(this.type){case"virtual-scroll":return Math.min(this.totalHeight,this.itemsBefore*this.rowHeight) -case"index":return 0}return 0}get totalHeight(){return this.total*this.rowHeight}get totalPages(){return Math.ceil(this.total/this.perPage)}get total(){return this.args.items.length}scroll(e){this.top=this.$viewport.scrollTop}resize(){this.$viewport.clientHeight>0&&this.rowHeight>0?this.visibleItems=Math.ceil(this.$viewport.clientHeight/this.rowHeight):this.visibleItems=0}setViewport(e){this.$viewport="html"===e?[...document.getElementsByTagName("html")][0]:e,this.$viewport.addEventListener("scroll",this.scroll),"html"===e&&this.$viewport.addEventListener("resize",this.resize),this.scroll(),this.resize()}setPane(e){this.$pane=e}setRowHeight(e){this._rowHeight=parseFloat(e)}setMaxHeight(e){const t=parseFloat(e) -isNaN(t)||(this._type="virtual-scroll")}disconnect(){this.$viewport.removeEventListener("scroll",this.scroll),this.$viewport.removeEventListener("resize",this.resize)}},v=k(h.prototype,"$pane",[n],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),y=k(h.prototype,"$viewport",[r],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),g=k(h.prototype,"top",[a],{configurable:!0,enumerable:!0,writable:!0,initializer:function(){return 0}}),O=k(h.prototype,"visibleItems",[l],{configurable:!0,enumerable:!0,writable:!0,initializer:function(){return 0}}),_=k(h.prototype,"overflow",[s],{configurable:!0,enumerable:!0,writable:!0,initializer:function(){return 10}}),P=k(h.prototype,"_rowHeight",[i],{configurable:!0,enumerable:!0,writable:!0,initializer:function(){return 0}}),w=k(h.prototype,"_type",[o],{configurable:!0,enumerable:!0,writable:!0,initializer:function(){return"native-scroll"}}),k(h.prototype,"scroll",[u],Object.getOwnPropertyDescriptor(h.prototype,"scroll"),h.prototype),k(h.prototype,"resize",[c],Object.getOwnPropertyDescriptor(h.prototype,"resize"),h.prototype),k(h.prototype,"setViewport",[d],Object.getOwnPropertyDescriptor(h.prototype,"setViewport"),h.prototype),k(h.prototype,"setPane",[m],Object.getOwnPropertyDescriptor(h.prototype,"setPane"),h.prototype),k(h.prototype,"setRowHeight",[p],Object.getOwnPropertyDescriptor(h.prototype,"setRowHeight"),h.prototype),k(h.prototype,"setMaxHeight",[f],Object.getOwnPropertyDescriptor(h.prototype,"setMaxHeight"),h.prototype),k(h.prototype,"disconnect",[b],Object.getOwnPropertyDescriptor(h.prototype,"disconnect"),h.prototype),h) -e.default=j,Ember._setComponentTemplate(x,j)})),define("consul-ui/components/panel/index.css",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -e.default=e=>e` - .panel { - --padding-x: 14px; - --padding-y: 14px; - } - .panel { - position: relative; - } - .panel-separator { - margin: 0; - } - - .panel { - --tone-border: var(--tone-gray-300); - border: var(--decor-border-100); - border-radius: var(--decor-radius-200); - box-shadow: var(--decor-elevation-600); - } - .panel-separator { - border: 0; - border-top: var(--decor-border-100); - } - .panel { - color: rgb(var(--tone-gray-900)); - background-color: rgb(var(--tone-gray-000)); - } - .panel, - .panel-separator { - border-color: rgb(var(--tone-border)); - } -`})),define("consul-ui/components/policy-form/index",["exports","consul-ui/components/form-component/index"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const n=Ember.HTMLBars.template({id:"F2W+pe23",block:'{"symbols":["dc","dc","Name","__arg0","__arg0","__arg0","template","&default","&attrs"],"statements":[[18,8,null],[2,"\\n"],[11,"fieldset"],[24,0,"policy-form"],[16,"disabled",[30,[36,6],[[30,[36,5],[[30,[36,27],["write policy"],[["item"],[[35,1]]]]],null],"disabled"],null]],[17,9],[12],[2,"\\n"],[6,[37,28],null,[["name"],["template"]],[["default","else"],[{"statements":[],"parameters":[]},{"statements":[[2," "],[10,"header"],[12],[2,"\\n Policy"],[1,[30,[36,6],[[35,26]," or identity?",""],null]],[2,"\\n "],[13],[2,"\\n"],[6,[37,6],[[35,26]],null,[["default","else"],[{"statements":[[2," "],[10,"p"],[12],[2,"\\n Identities are default policies with configurable names. They save you some time and effort you\'re using Consul for Connect features.\\n "],[13],[2,"\\n"],[2," "],[10,"div"],[14,"role","radiogroup"],[15,0,[30,[36,6],[[35,1,["error","Type"]]," has-error"],null]],[12],[2,"\\n"],[6,[37,11],[[30,[36,10],[[30,[36,10],[[35,25]],null]],null]],null,[["default"],[{"statements":[[2," "],[10,"label"],[12],[2,"\\n "],[10,"span"],[12],[1,[32,7,["name"]]],[13],[2,"\\n "],[10,"input"],[15,3,[30,[36,19],[[35,0],"[template]"],null]],[15,2,[32,7,["template"]]],[15,"checked",[30,[36,15],[[35,1,["template"]],[32,7,["template"]]],null]],[15,"onchange",[30,[36,2],[[32,0],[30,[36,24],[[30,[36,23],[[35,1],"template"],null]],null]],[["value"],["target.value"]]]],[14,4,"radio"],[12],[13],[2,"\\n "],[13],[2,"\\n"]],"parameters":[7]}]]],[2," "],[13],[2,"\\n"]],"parameters":[]},{"statements":[[2," "],[10,"input"],[15,3,[30,[36,19],[[35,0],"[template]"],null]],[14,2,""],[14,4,"hidden"],[12],[13],[2,"\\n"]],"parameters":[]}]]]],"parameters":[]}]]],[2," "],[10,"label"],[15,0,[31,["type-text",[30,[36,6],[[30,[36,29],[[35,1,["error","Name"]],[30,[36,5],[[35,1,["isPristine"]]],null]],null]," has-error"],null]]]],[12],[2,"\\n "],[10,"span"],[12],[2,"Name"],[13],[2,"\\n "],[10,"input"],[15,2,[34,1,["Name"]]],[15,3,[31,[[34,0],"[Name]"]]],[14,"autofocus","autofocus"],[15,"oninput",[30,[36,2],[[32,0],"change"],null]],[14,4,"text"],[12],[13],[2,"\\n "],[10,"em"],[12],[2,"\\n Maximum 128 characters. May only include letters (uppercase and/or lowercase) and/or numbers. Must be unique.\\n "],[13],[2,"\\n"],[6,[37,6],[[30,[36,29],[[35,1,["error","Name"]],[30,[36,5],[[35,1,["isPristine"]]],null]],null]],null,[["default"],[{"statements":[[2," "],[10,"strong"],[12],[1,[35,1,["error","Name","validation"]]],[13],[2,"\\n"]],"parameters":[]}]]],[2," "],[13],[2,"\\n "],[10,"label"],[14,"for",""],[14,0,"type-text"],[12],[2,"\\n"],[6,[37,6],[[30,[36,15],[[35,1,["template"]],"service-identity"],null]],null,[["default","else"],[{"statements":[[2," "],[8,"code-editor",[],[["@readonly","@name","@syntax","@oninput","@namedBlocksInfo"],[true,[30,[36,19],[[35,0],"[Rules]"],null],"hcl",[30,[36,2],[[32,0],"change",[30,[36,19],[[35,0],"[Rules]"],null]],null],[30,[36,20],null,[["label","content"],[0,0]]]]],[["default"],[{"statements":[[6,[37,6],[[30,[36,21],[[32,6],"label"],null]],null,[["default","else"],[{"statements":[[2,"\\n Rules "],[10,"a"],[15,6,[31,[[30,[36,18],["CONSUL_DOCS_URL"],null],"/guides/acl.html#rule-specification"]]],[14,"rel","help noopener noreferrer"],[14,"target","_blank"],[12],[2,"(HCL Format)"],[13],[2,"\\n "]],"parameters":[]},{"statements":[[6,[37,6],[[30,[36,21],[[32,6],"content"],null]],null,[["default"],[{"statements":[[8,"consul/service-identity/template",[],[["@nspace","@partition","@name"],[[34,22],[34,13],[34,1,["Name"]]]],null]],"parameters":[]}]]]],"parameters":[]}]]]],"parameters":[6]}]]],[2,"\\n"]],"parameters":[]},{"statements":[[6,[37,6],[[30,[36,15],[[35,1,["template"]],"node-identity"],null]],null,[["default","else"],[{"statements":[[2," "],[8,"code-editor",[],[["@readonly","@name","@syntax","@oninput","@namedBlocksInfo"],[true,[30,[36,19],[[35,0],"[Rules]"],null],"hcl",[30,[36,2],[[32,0],"change",[30,[36,19],[[35,0],"[Rules]"],null]],null],[30,[36,20],null,[["label","content"],[0,0]]]]],[["default"],[{"statements":[[6,[37,6],[[30,[36,21],[[32,5],"label"],null]],null,[["default","else"],[{"statements":[[2,"\\n Rules "],[10,"a"],[15,6,[31,[[30,[36,18],["CONSUL_DOCS_URL"],null],"/guides/acl.html#rule-specification"]]],[14,"rel","help noopener noreferrer"],[14,"target","_blank"],[12],[2,"(HCL Format)"],[13],[2,"\\n "]],"parameters":[]},{"statements":[[6,[37,6],[[30,[36,21],[[32,5],"content"],null]],null,[["default"],[{"statements":[[8,"consul/node-identity/template",[],[["@name","@partition"],[[34,1,["Name"]],[34,13]]],null]],"parameters":[]}]]]],"parameters":[]}]]]],"parameters":[5]}]]],[2,"\\n"]],"parameters":[]},{"statements":[[2," "],[8,"code-editor",[],[["@syntax","@class","@name","@value","@onkeyup","@namedBlocksInfo"],["hcl",[30,[36,6],[[35,1,["error","Rules"]],"error"],null],[30,[36,19],[[35,0],"[Rules]"],null],[34,1,["Rules"]],[30,[36,2],[[32,0],"change",[30,[36,19],[[35,0],"[Rules]"],null]],null],[30,[36,20],null,[["label"],[0]]]]],[["default"],[{"statements":[[6,[37,6],[[30,[36,21],[[32,4],"label"],null]],null,[["default"],[{"statements":[[2,"\\n Rules "],[10,"a"],[15,6,[31,[[30,[36,18],["CONSUL_DOCS_URL"],null],"/guides/acl.html#rule-specification"]]],[14,"rel","help noopener noreferrer"],[14,"target","_blank"],[12],[2,"(HCL Format)"],[13],[2,"\\n "]],"parameters":[]}]]]],"parameters":[4]}]]],[2,"\\n"],[6,[37,6],[[35,1,["error","Rules"]]],null,[["default"],[{"statements":[[2," "],[10,"strong"],[12],[1,[35,1,["error","Rules","validation"]]],[13],[2,"\\n"]],"parameters":[]}]]]],"parameters":[]}]]]],"parameters":[]}]]],[2," "],[13],[2,"\\n"],[6,[37,6],[[30,[36,15],[[35,1,["template"]],"node-identity"],null]],null,[["default","else"],[{"statements":[[2,"\\n "],[8,"data-source",[],[["@src","@onchange"],[[30,[36,8],["/*/*/*/datacenters"],null],[30,[36,2],[[32,0],[30,[36,9],[[35,3]],null]],[["value"],["data"]]]]],null],[2,"\\n "],[10,"label"],[14,0,"type-select"],[12],[2,"\\n "],[10,"span"],[12],[2,"Datacenter"],[13],[2,"\\n "],[8,"power-select",[],[["@options","@searchField","@selected","@searchPlaceholder","@onChange"],[[30,[36,16],["Name",[35,3]],null],"Name",[30,[36,14],[[35,1,["Datacenter"]],[35,17]],null],"Type a datacenter name",[30,[36,2],[[32,0],"change","Datacenter"],null]]],[["default"],[{"statements":[[2,"\\n "],[1,[32,3]],[2,"\\n "]],"parameters":[3]}]]],[2,"\\n "],[13],[2,"\\n"]],"parameters":[]},{"statements":[[6,[37,6],[[30,[36,15],[[30,[36,14],[[35,13],"default"],null],"default"],null]],null,[["default"],[{"statements":[[2," "],[10,"div"],[14,0,"type-toggle"],[12],[2,"\\n "],[10,"span"],[12],[2,"Valid datacenters"],[13],[2,"\\n "],[10,"label"],[12],[2,"\\n "],[10,"input"],[15,3,[31,[[34,0],"[isScoped]"]]],[15,"checked",[30,[36,6],[[30,[36,5],[[35,12]],null],"checked"],null]],[15,"onchange",[30,[36,2],[[32,0],"change"],null]],[14,4,"checkbox"],[12],[13],[2,"\\n "],[10,"span"],[12],[2,"All"],[13],[2,"\\n "],[13],[2,"\\n "],[13],[2,"\\n"]],"parameters":[]}]]],[6,[37,6],[[35,12]],null,[["default"],[{"statements":[[2," "],[8,"data-source",[],[["@src","@onchange"],[[30,[36,8],["/*/*/*/datacenters"],null],[30,[36,2],[[32,0],[30,[36,9],[[35,3]],null]],[["value"],["data"]]]]],null],[2,"\\n\\n "],[10,"div"],[14,0,"checkbox-group"],[14,"role","group"],[12],[2,"\\n"],[6,[37,11],[[30,[36,10],[[30,[36,10],[[35,3]],null]],null]],null,[["default"],[{"statements":[[2," "],[10,"label"],[14,0,"type-checkbox"],[12],[2,"\\n "],[10,"input"],[15,3,[31,[[34,0],"[Datacenters]"]]],[15,2,[32,2,["Name"]]],[15,"checked",[30,[36,6],[[30,[36,7],[[32,2,["Name"]],[35,1,["Datacenters"]]],null],"checked"],null]],[15,"onchange",[30,[36,2],[[32,0],"change"],null]],[14,4,"checkbox"],[12],[13],[2,"\\n "],[10,"span"],[12],[1,[32,2,["Name"]]],[13],[2,"\\n "],[13],[2,"\\n"]],"parameters":[2]}]]],[6,[37,11],[[30,[36,10],[[30,[36,10],[[35,1,["Datacenters"]]],null]],null]],null,[["default"],[{"statements":[[6,[37,6],[[30,[36,5],[[30,[36,4],["Name",[32,1],[35,3]],null]],null]],null,[["default"],[{"statements":[[2," "],[10,"label"],[14,0,"type-checkbox"],[12],[2,"\\n "],[10,"input"],[15,3,[31,[[34,0],"[Datacenters]"]]],[15,2,[32,1]],[14,"checked","checked"],[15,"onchange",[30,[36,2],[[32,0],"change"],null]],[14,4,"checkbox"],[12],[13],[2,"\\n "],[10,"span"],[12],[1,[32,1]],[13],[2,"\\n "],[13],[2,"\\n"]],"parameters":[]}]]]],"parameters":[1]}]]],[2," "],[13],[2,"\\n\\n\\n"]],"parameters":[]}]]]],"parameters":[]}]]],[6,[37,6],[[30,[36,15],[[35,1,["template"]],""],null]],null,[["default"],[{"statements":[[2," "],[10,"label"],[14,0,"type-text"],[12],[2,"\\n "],[10,"span"],[12],[2,"Description (Optional)"],[13],[2,"\\n "],[10,"textarea"],[15,3,[31,[[34,0],"[Description]"]]],[15,2,[34,1,["Description"]]],[15,"oninput",[30,[36,2],[[32,0],"change"],null]],[12],[13],[2,"\\n "],[13],[2,"\\n"]],"parameters":[]}]]],[13],[2,"\\n\\n"]],"hasEval":false,"upvars":["name","item","action","datacenters","find-by","not","if","contains","uri","mut","-track-array","each","isScoped","partition","or","eq","map-by","dc","env","concat","hash","-is-named-block-invocation","nspace","changeset-set","optional","templates","allowIdentity","can","yield-slot","and"]}',meta:{moduleName:"consul-ui/components/policy-form/index.hbs"}}) -var r=Ember._setComponentTemplate(n,t.default.extend({type:"policy",name:"policy",allowIdentity:!0,classNames:["policy-form"],isScoped:!1,init:function(){this._super(...arguments),Ember.set(this,"isScoped",Ember.get(this,"item.Datacenters.length")>0),this.templates=[{name:"Policy",template:""},{name:"Service Identity",template:"service-identity"},{name:"Node Identity",template:"node-identity"}]},actions:{change:function(e){try{this._super(...arguments)}catch(t){const e=this.isScoped -switch(t.target.name){case"policy[isScoped]":e?(Ember.set(this,"previousDatacenters",Ember.get(this.item,"Datacenters")),Ember.set(this.item,"Datacenters",null)):(Ember.set(this.item,"Datacenters",this.previousDatacenters),Ember.set(this,"previousDatacenters",null)),Ember.set(this,"isScoped",!e) -break -default:this.onerror(t)}this.onchange({target:this.form})}}}})) -e.default=r})),define("consul-ui/components/policy-selector/index",["exports","consul-ui/components/child-selector/index"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const n=Ember.HTMLBars.template({id:"CuBwNJCz",block:'{"symbols":["item","index","execute","cancel","message","confirm","__arg0","__arg0","__arg0","option","modal","close","&default","&attrs"],"statements":[[8,"child-selector",[[17,14]],[["@disabled","@repo","@dc","@partition","@nspace","@type","@placeholder","@items"],[[34,24],[34,25],[34,13],[34,8],[34,10],"policy","Search for policy",[34,0]]],[["default"],[{"statements":[[2,"\\n "],[18,13,null],[2,"\\n "],[8,"block-slot",[],[["@name"],["label"]],[["default"],[{"statements":[[2,"\\n Apply an existing policy\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["create"]],[["default"],[{"statements":[[2,"\\n"],[6,[37,26],null,[["name"],["trigger"]],[["default","else"],[{"statements":[[2," "],[18,13,null],[2,"\\n"]],"parameters":[]},{"statements":[[2," "],[11,"label"],[24,0,"type-dialog"],[4,[38,18],["click",[30,[36,17],[[32,0,["modal","open"]]],null]],null],[12],[2,"\\n "],[10,"span"],[12],[2,"Create new policy"],[13],[2,"\\n "],[13],[2,"\\n"],[2," "],[8,"modal-dialog",[[24,1,"new-policy"]],[["@onopen","@aria"],[[30,[36,1],[[32,0],"open"],null],[30,[36,5],null,[["label"],["New Policy"]]]]],[["default"],[{"statements":[[2,"\\n "],[8,"ref",[],[["@target","@name","@value"],[[32,0],"modal",[32,11]]],null],[2,"\\n "],[8,"block-slot",[],[["@name"],["header"]],[["default"],[{"statements":[[2,"\\n "],[10,"h2"],[12],[2,"New Policy"],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["body"]],[["default"],[{"statements":[[2,"\\n "],[8,"policy-form",[],[["@form","@nspace","@partition","@dc","@allowServiceIdentity"],[[34,19],[34,10],[34,8],[34,13],[34,20]]],null],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["actions"]],[["default"],[{"statements":[[2,"\\n "],[10,"button"],[15,"onclick",[30,[36,23],[[32,0,["save"]],[35,22],[35,0],[30,[36,21],[[30,[36,1],[[32,0],[32,12]],null],[30,[36,1],[[32,0],"reset"],null]],null]],null]],[15,"disabled",[30,[36,7],[[30,[36,4],[[35,22,["isSaving"]],[35,22,["isPristine"]],[35,22,["isInvalid"]]],null],"disabled"],null]],[14,4,"submit"],[12],[2,"\\n"],[6,[37,7],[[35,22,["isSaving"]]],null,[["default"],[{"statements":[[2," "],[10,"div"],[14,0,"progress indeterminate"],[12],[13],[2,"\\n"]],"parameters":[]}]]],[2," "],[10,"span"],[12],[2,"Create and apply"],[13],[2,"\\n "],[13],[2,"\\n "],[11,"button"],[16,"disabled",[30,[36,7],[[35,22,["isSaving"]],"disabled"],null]],[24,4,"reset"],[4,[38,1],[[32,0],[30,[36,21],[[30,[36,1],[[32,0],[32,12]],null],[30,[36,1],[[32,0],"reset"],null]],null]],null],[12],[2,"Cancel"],[13],[2,"\\n "]],"parameters":[12]}]]],[2,"\\n "]],"parameters":[11]}]]],[2,"\\n"]],"parameters":[]}]]],[2," "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["option"]],[["default"],[{"statements":[[2,"\\n "],[1,[32,10,["Name"]]],[2,"\\n "]],"parameters":[10]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["set"]],[["default"],[{"statements":[[2,"\\n "],[8,"tabular-details",[],[["@onchange","@items"],[[30,[36,1],[[32,0],"open"],null],[30,[36,27],["CreateTime:desc","Name:asc",[35,0]],null]]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["header"]],[["default"],[{"statements":[[2,"\\n "],[10,"th"],[12],[2,"Name"],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["row"]],[["default"],[{"statements":[[2,"\\n "],[10,"td"],[15,0,[30,[36,28],[[32,1]],null]],[12],[2,"\\n"],[6,[37,7],[[32,1,["ID"]]],null,[["default","else"],[{"statements":[[2," "],[10,"a"],[15,6,[30,[36,16],["dc.acls.policies.edit",[32,1,["ID"]]],null]],[12],[1,[32,1,["Name"]]],[13],[2,"\\n"]],"parameters":[]},{"statements":[[2," "],[10,"a"],[15,3,[32,1,["Name"]]],[12],[1,[32,1,["Name"]]],[13],[2,"\\n"]],"parameters":[]}]]],[2," "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["details"]],[["default"],[{"statements":[[2,"\\n"],[6,[37,7],[[30,[36,9],[[32,1,["template"]],""],null]],null,[["default"],[{"statements":[[2," "],[8,"data-source",[],[["@src","@onchange","@loading"],[[30,[36,14],["/${partition}/${nspace}/${dc}/policy/${id}",[30,[36,5],null,[["partition","nspace","dc","id"],[[35,8],[35,10],[35,13],[32,1,["ID"]]]]]],null],[30,[36,1],[[32,0],[30,[36,15],[[35,3]],null]],[["value"],["data"]]],"lazy"]],null],[2,"\\n"]],"parameters":[]}]]],[6,[37,7],[[30,[36,9],[[32,1,["template"]],"node-identity"],null]],null,[["default","else"],[{"statements":[[2," "],[10,"dl"],[12],[2,"\\n "],[10,"dt"],[12],[2,"Datacenter:"],[13],[2,"\\n "],[10,"dd"],[12],[2,"\\n "],[1,[32,1,["Datacenter"]]],[2,"\\n "],[13],[2,"\\n "],[13],[2,"\\n"]],"parameters":[]},{"statements":[[2," "],[10,"dl"],[12],[2,"\\n "],[10,"dt"],[12],[2,"Datacenters:"],[13],[2,"\\n "],[10,"dd"],[12],[2,"\\n "],[1,[30,[36,12],[", ",[30,[36,11],[[30,[36,4],[[35,3],[32,1]],null]],null]],null]],[2,"\\n "],[13],[2,"\\n "],[13],[2,"\\n"]],"parameters":[]}]]],[2," "],[10,"label"],[14,0,"type-text"],[12],[2,"\\n"],[6,[37,7],[[30,[36,9],[[32,1,["template"]],"service-identity"],null]],null,[["default","else"],[{"statements":[[2," "],[8,"code-editor",[],[["@syntax","@readonly","@namedBlocksInfo"],["hcl",true,[30,[36,5],null,[["label","content"],[0,0]]]]],[["default"],[{"statements":[[6,[37,7],[[30,[36,6],[[32,9],"label"],null]],null,[["default","else"],[{"statements":[[2,"\\n Rules "],[10,"a"],[15,6,[31,[[30,[36,2],["CONSUL_DOCS_URL"],null],"/guides/acl.html#rule-specification"]]],[14,"rel","help noopener noreferrer"],[14,"target","_blank"],[12],[2,"(HCL Format)"],[13],[2,"\\n "]],"parameters":[]},{"statements":[[6,[37,7],[[30,[36,6],[[32,9],"content"],null]],null,[["default"],[{"statements":[[2,"\\n "],[8,"consul/service-identity/template",[],[["@nspace","@partition","@name"],[[34,10],[34,8],[32,1,["Name"]]]],null],[2,"\\n "]],"parameters":[]}]]]],"parameters":[]}]]]],"parameters":[9]}]]],[2,"\\n"]],"parameters":[]},{"statements":[[6,[37,7],[[30,[36,9],[[32,1,["template"]],"node-identity"],null]],null,[["default","else"],[{"statements":[[2," "],[8,"code-editor",[],[["@syntax","@readonly","@namedBlocksInfo"],["hcl",true,[30,[36,5],null,[["label","content"],[0,0]]]]],[["default"],[{"statements":[[6,[37,7],[[30,[36,6],[[32,8],"label"],null]],null,[["default","else"],[{"statements":[[2,"\\n Rules "],[10,"a"],[15,6,[31,[[30,[36,2],["CONSUL_DOCS_URL"],null],"/guides/acl.html#rule-specification"]]],[14,"rel","help noopener noreferrer"],[14,"target","_blank"],[12],[2,"(HCL Format)"],[13],[2,"\\n "]],"parameters":[]},{"statements":[[6,[37,7],[[30,[36,6],[[32,8],"content"],null]],null,[["default"],[{"statements":[[2,"\\n "],[8,"consul/node-identity/template",[],[["@name","@partition"],[[32,1,["Name"]],[34,8]]],null],[2,"\\n "]],"parameters":[]}]]]],"parameters":[]}]]]],"parameters":[8]}]]],[2,"\\n"]],"parameters":[]},{"statements":[[2," "],[8,"code-editor",[],[["@syntax","@readonly","@value","@namedBlocksInfo"],["hcl",true,[30,[36,4],[[35,3,["Rules"]],[32,1,["Rules"]]],null],[30,[36,5],null,[["label"],[0]]]]],[["default"],[{"statements":[[6,[37,7],[[30,[36,6],[[32,7],"label"],null]],null,[["default"],[{"statements":[[2,"\\n Rules "],[10,"a"],[15,6,[31,[[30,[36,2],["CONSUL_DOCS_URL"],null],"/guides/acl.html#rule-specification"]]],[14,"rel","help noopener noreferrer"],[14,"target","_blank"],[12],[2,"(HCL Format)"],[13],[2,"\\n "]],"parameters":[]}]]]],"parameters":[7]}]]],[2,"\\n"]],"parameters":[]}]]]],"parameters":[]}]]],[2," "],[13],[2,"\\n"],[6,[37,7],[[30,[36,29],[[35,24]],null]],null,[["default"],[{"statements":[[2," "],[10,"div"],[12],[2,"\\n "],[8,"confirmation-dialog",[],[["@message"],["Are you sure you want to remove this policy from this token?"]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["action"]],[["default"],[{"statements":[[2,"\\n "],[11,"button"],[24,0,"type-delete"],[24,4,"button"],[4,[38,1],[[32,0],[32,6],"remove",[32,1],[35,0]],null],[12],[2,"Remove"],[13],[2,"\\n "]],"parameters":[6]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["dialog"]],[["default"],[{"statements":[[2,"\\n "],[10,"p"],[12],[2,"\\n "],[1,[32,5]],[2,"\\n "],[13],[2,"\\n\\n "],[11,"button"],[24,0,"type-delete"],[24,4,"button"],[4,[38,1],[[32,0],[32,3]],null],[12],[2,"Confirm remove"],[13],[2,"\\n "],[11,"button"],[24,0,"type-cancel"],[24,4,"button"],[4,[38,1],[[32,0],[32,4]],null],[12],[2,"Cancel"],[13],[2,"\\n "]],"parameters":[3,4,5]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[13],[2,"\\n"]],"parameters":[]}]]],[2," "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[1,2]}]]],[2,"\\n\\n "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[]}]]],[2,"\\n"]],"hasEval":false,"upvars":["items","action","env","loadedItem","or","hash","-is-named-block-invocation","if","partition","eq","nspace","policy/datacenters","join","dc","uri","mut","href-to","optional","on","form","allowServiceIdentity","queue","item","perform","disabled","repo","yield-slot","sort-by","policy/typeof","not"]}',meta:{moduleName:"consul-ui/components/policy-selector/index.hbs"}}) -var r=Ember._setComponentTemplate(n,t.default.extend({repo:Ember.inject.service("repository/policy"),name:"policy",type:"policy",allowIdentity:!0,classNames:["policy-selector"],init:function(){this._super(...arguments) -const e=this.source -e&&this._listeners.add(e,{save:e=>{this.save.perform(...e.data)}})},reset:function(e){this._super(...arguments),Ember.set(this,"isScoped",!1)},refreshCodeEditor:function(e,t){this.dom.component(".code-editor",t).didAppear()},error:function(e){const t=this.item,n=e.error -if(void 0===n.errors)throw n -{const e=n.errors[0] -let r="Rules",a=e.detail -switch(!0){case 0===a.indexOf("Failed to parse ACL rules"):case 0===a.indexOf("Invalid service policy"):r="Rules",a=e.detail -break -case 0===a.indexOf("Invalid Policy: A Policy with Name"):r="Name",a=a.substr("Invalid Policy: A Policy with Name".indexOf(":")+1)}r&&t.addError(r,a)}},actions:{open:function(e){this.refreshCodeEditor(e,e.target.parentElement)}}})) -e.default=r})),define("consul-ui/components/popover-menu/index",["exports","block-slots"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const n=Ember.HTMLBars.template({id:"sMDVsgDS",block:'{"symbols":["change","keypress","keypressClick","aria","components","api","menu","sub","toggle","&default","&attrs"],"statements":[[18,10,null],[2,"\\n"],[11,"div"],[24,0,"popover-menu"],[17,11],[12],[2,"\\n "],[8,"aria-menu",[],[["@keyboardAccess"],[[34,4]]],[["default"],[{"statements":[[2,"\\n\\n"],[6,[37,16],[[30,[36,15],null,[["MenuItem","MenuSeparator"],[[30,[36,17],["popover-menu/menu-item"],[["menu"],[[30,[36,15],null,[["addSubmenu","removeSubmenu","confirm","clickTrigger","keypressClick"],[[30,[36,6],[[32,0],"addSubmenu"],null],[30,[36,6],[[32,0],"removeSubmenu"],null],[30,[36,2],["popover-menu-",[35,1],"-"],null],[32,0,["toggle","click"]],[32,3]]]]]]],[30,[36,17],["popover-menu/menu-separator"],null]]]]],null,[["default"],[{"statements":[[6,[37,16],[[30,[36,15],null,[["toggle"],[[32,0,["toggle","click"]]]]]],null,[["default"],[{"statements":[[2,"\\n "],[8,"toggle-button",[],[["@checked","@onchange"],[[30,[36,5],[[35,4],[32,4,["expanded"]],[35,3]],null],[30,[36,7],[[32,1],[30,[36,6],[[32,0],"change"],null]],null]]],[["default"],[{"statements":[[2,"\\n "],[8,"ref",[],[["@target","@name","@value"],[[32,0],"toggle",[32,9]]],null],[2,"\\n "],[10,"button"],[14,"aria-haspopup","menu"],[15,"onkeydown",[32,2]],[15,"onclick",[32,0,["toggle","click"]]],[15,1,[32,4,["labelledBy"]]],[15,"aria-controls",[32,4,["controls"]]],[14,4,"button"],[12],[2,"\\n "],[8,"yield-slot",[],[["@name"],["trigger"]],[["default"],[{"statements":[[2,"\\n "],[18,10,[[32,5],[32,6]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[13],[2,"\\n "]],"parameters":[9]}]]],[2,"\\n\\n "],[8,"menu-panel",[[16,1,[32,4,["controls"]]],[16,"aria-labelledby",[32,4,["labelledBy"]]],[16,"aria-expanded",[32,4,["expanded"]]]],[["@position"],[[34,8]]],[["default"],[{"statements":[[2,"\\n "],[8,"ref",[],[["@target","@name","@value"],[[32,0],"menu",[32,7]]],null],[2,"\\n "],[8,"block-slot",[],[["@name"],["controls"]],[["default"],[{"statements":[[2,"\\n "],[10,"input"],[15,1,[30,[36,2],["popover-menu-",[35,1],"-"],null]],[14,4,"checkbox"],[12],[13],[2,"\\n"],[6,[37,11],[[30,[36,10],[[30,[36,10],[[35,9]],null]],null]],null,[["default"],[{"statements":[[2," "],[10,"input"],[15,1,[30,[36,2],["popover-menu-",[35,1],"-",[32,8]],null]],[15,"onchange",[32,7,["change"]]],[14,4,"checkbox"],[12],[13],[2,"\\n"]],"parameters":[8]}]]],[2," "]],"parameters":[]}]]],[2,"\\n"],[6,[37,5],[[35,12]],null,[["default"],[{"statements":[[2," "],[8,"block-slot",[],[["@name"],["header"]],[["default"],[{"statements":[[2,"\\n "],[18,10,[[32,5],[32,6]]],[2,"\\n "],[6,[37,0],null,[["name"],["header"]],[["default","else"],[{"statements":[],"parameters":[]},{"statements":[],"parameters":[]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[]}]]],[2," "],[8,"block-slot",[],[["@name"],["menu"]],[["default"],[{"statements":[[2,"\\n "],[8,"yield-slot",[],[["@name","@params"],["menu",[30,[36,14],[[30,[36,2],["popover-menu-",[35,1],"-"],null],[35,13],[32,3],[32,0,["toggle","click"]]],null]]],[["default"],[{"statements":[[2,"\\n "],[18,10,[[32,5],[32,6]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[7]}]]],[2,"\\n\\n"]],"parameters":[6]}]]]],"parameters":[5]}]]],[2,"\\n "]],"parameters":[1,2,3,4]}]]],[2,"\\n"],[13]],"hasEval":false,"upvars":["yield-slot","guid","concat","expanded","keyboardAccess","if","action","queue","position","submenus","-track-array","each","hasHeader","send","block-params","hash","let","component"]}',meta:{moduleName:"consul-ui/components/popover-menu/index.hbs"}}) -var r=Ember._setComponentTemplate(n,Ember.Component.extend(t.default,{tagName:"",dom:Ember.inject.service("dom"),expanded:!1,keyboardAccess:!0,onchange:function(){},position:"",init:function(){this._super(...arguments),this.guid=this.dom.guid(this),this.submenus=[]},willRender:function(){Ember.set(this,"hasHeader",this._isRegistered("header"))},actions:{addSubmenu:function(e){Ember.set(this,"submenus",this.submenus.concat(e))},removeSubmenu:function(e){const t=this.submenus.indexOf(e);-1!==t&&(this.submenus.splice(t,1),Ember.set(this,"submenus",this.submenus))},change:function(e){e.target.checked||[...this.dom.elements(`[id^=popover-menu-${this.guid}]`)].forEach((function(e){e.checked=!1})),this.onchange(e)},send:function(){this.sendAction(...arguments)}}})) -e.default=r})),define("consul-ui/components/popover-menu/menu-item/index",["exports","block-slots"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const n=Ember.HTMLBars.template({id:"zKK0lEHV",block:'{"symbols":["external","&default","&attrs"],"statements":[[18,2,null],[2,"\\n"],[11,"li"],[24,"role","none"],[17,3],[12],[2,"\\n"],[6,[37,1],[[35,15]],null,[["default","else"],[{"statements":[[2," "],[10,"label"],[15,"for",[30,[36,11],[[35,3,["confirm"]],[35,10]],null]],[14,"role","menuitem"],[14,"tabindex","-1"],[15,"onkeypress",[34,3,["keypressClick"]]],[12],[2,"\\n "],[8,"yield-slot",[],[["@name"],["label"]],[["default"],[{"statements":[[18,2,null]],"parameters":[]}]]],[2,"\\n "],[13],[2,"\\n "],[10,"div"],[14,"role","menu"],[12],[2,"\\n "],[8,"yield-slot",[],[["@name","@params"],["confirmation",[30,[36,14],[[30,[36,13],["confirmation-alert"],[["onclick","name"],[[30,[36,6],[[30,[36,4],[[32,0],[35,3,["clickTrigger"]]],null],[30,[36,4],[[32,0],[35,12]],null]],null],[30,[36,11],[[35,3,["confirm"]],[35,10]],null]]]]],null]]],[["default"],[{"statements":[[18,2,null]],"parameters":[]}]]],[2,"\\n "],[13],[2,"\\n"]],"parameters":[]},{"statements":[[6,[37,1],[[35,7]],null,[["default","else"],[{"statements":[[6,[37,9],[[30,[36,8],[[35,7],"://"],null]],null,[["default"],[{"statements":[[2," "],[10,"a"],[14,"role","menuitem"],[14,"tabindex","-1"],[15,"onclick",[30,[36,4],[[32,0],[35,3,["clickTrigger"]]],null]],[15,6,[34,7]],[15,"target",[30,[36,1],[[32,1],"_blank"],null]],[15,"rel",[30,[36,1],[[32,1],"noopener noreferrer"],null]],[12],[2,"\\n "],[8,"yield-slot",[],[["@name"],["label"]],[["default"],[{"statements":[[2,"\\n "],[18,2,null],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[13],[2,"\\n"]],"parameters":[1]}]]]],"parameters":[]},{"statements":[[10,"button"],[14,"role","menuitem"],[15,"aria-selected",[30,[36,1],[[35,0],"true"],null]],[14,"tabindex","-1"],[15,"onclick",[30,[36,6],[[30,[36,4],[[32,0],[30,[36,5],[[32,0,["onclick"]],[30,[36,2],null,null]],null]],null],[30,[36,4],[[32,0],[30,[36,1],[[32,0,["close"]],[35,3,["clickTrigger"]],[30,[36,2],null,null]],null]],null]],null]],[14,4,"button"],[12],[2,"\\n "],[8,"yield-slot",[],[["@name"],["label"]],[["default"],[{"statements":[[2,"\\n "],[18,2,null],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[13],[2,"\\n"]],"parameters":[]}]]]],"parameters":[]}]]],[13],[2,"\\n\\n"]],"hasEval":false,"upvars":["selected","if","noop","menu","action","or","queue","href","string-includes","let","guid","concat","onclick","component","block-params","hasConfirmation"]}',meta:{moduleName:"consul-ui/components/popover-menu/menu-item/index.hbs"}}) -var r=Ember._setComponentTemplate(n,Ember.Component.extend(t.default,{tagName:"",dom:Ember.inject.service("dom"),init:function(){this._super(...arguments),this.guid=this.dom.guid(this)},didInsertElement:function(){this._super(...arguments),this.menu.addSubmenu(this.guid)},didDestroyElement:function(){this._super(...arguments),this.menu.removeSubmenu(this.guid)},willRender:function(){this._super(...arguments),Ember.set(this,"hasConfirmation",this._isRegistered("confirmation"))}})) -e.default=r})),define("consul-ui/components/popover-menu/menu-separator/index",["exports","block-slots"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const n=Ember.HTMLBars.template({id:"RS9Jf7fe",block:'{"symbols":["&default"],"statements":[[18,1,null],[2,"\\n"],[10,"li"],[14,"role","separator"],[12],[2,"\\n "],[8,"yield-slot",[],[["@name"],["label"]],[["default"],[{"statements":[[18,1,null]],"parameters":[]}]]],[2,"\\n"],[13],[2,"\\n"]],"hasEval":false,"upvars":[]}',meta:{moduleName:"consul-ui/components/popover-menu/menu-separator/index.hbs"}}) -var r=Ember._setComponentTemplate(n,Ember.Component.extend(t.default,{tagName:""})) -e.default=r})),define("consul-ui/components/popover-select/index",["exports","block-slots"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const n=Ember.HTMLBars.template({id:"nf0dRHsn",block:'{"symbols":["components","menu","Optgroup","Option","&default","&attrs"],"statements":[[8,"popover-menu",[[24,0,"popover-select"],[17,6]],[["@position"],[[30,[36,2],[[35,1],"left"],null]]],[["default"],[{"statements":[[2,"\\n "],[18,5,null],[2,"\\n"],[6,[37,9],[[30,[36,8],["popover-select/optgroup"],[["components"],[[32,1]]]],[30,[36,8],["popover-select/option"],[["select","components","onclick"],[[32,0],[32,1],[30,[36,7],[[30,[36,6],[[32,0],"click"],null],[30,[36,5],[[35,4],[30,[36,3],null,null],[32,2,["toggle"]]],null]],null]]]]],null,[["default"],[{"statements":[[2," "],[8,"block-slot",[],[["@name"],["trigger"]],[["default"],[{"statements":[[2,"\\n "],[8,"yield-slot",[],[["@name"],["selected"]],[["default"],[{"statements":[[2,"\\n "],[18,5,[[30,[36,0],null,[["Optgroup","Option"],[[32,3],[32,4]]]]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["menu"]],[["default"],[{"statements":[[2,"\\n "],[8,"yield-slot",[],[["@name"],["options"]],[["default"],[{"statements":[[2,"\\n "],[18,5,[[30,[36,0],null,[["Optgroup","Option"],[[32,3],[32,4]]]]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[3,4]}]]]],"parameters":[1,2]}]]],[2,"\\n"]],"hasEval":false,"upvars":["hash","position","or","noop","multiple","if","action","pipe","component","let"]}',meta:{moduleName:"consul-ui/components/popover-select/index.hbs"}}) -var r=Ember._setComponentTemplate(n,Ember.Component.extend(t.default,{tagName:"",dom:Ember.inject.service("dom"),multiple:!1,required:!1,onchange:function(){},addOption:function(e){void 0===this._options&&(this._options=new Set),this._options.add(e)},removeOption:function(e){this._options.delete(e)},actions:{click:function(e,t){if(this.multiple){if(e.selected&&this.required){if(![...this._options].find(t=>t!==e&&t.selected))return t}}else{if(e.selected&&this.required)return t;[...this._options].filter(t=>t!==e).forEach(e=>{e.selected=!1})}return e.selected=!e.selected,this.onchange(this.dom.setEventTargetProperties(t,{selected:()=>e.args.value,selectedItems:()=>[...this._options].filter(e=>e.selected).map(e=>e.args.value).join(",")})),t}}})) -e.default=r})),define("consul-ui/components/popover-select/optgroup/index",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const t=Ember.HTMLBars.template({id:"tEmaYnIW",block:'{"symbols":["MenuSeparator","@label","&default","@components"],"statements":[[6,[37,0],[[32,4,["MenuSeparator"]]],null,[["default"],[{"statements":[[8,[32,1],[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["label"]],[["default"],[{"statements":[[2,"\\n "],[1,[32,2]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[]}]]],[2,"\\n"],[18,3,null],[2,"\\n"]],"parameters":[1]}]]]],"hasEval":false,"upvars":["let"]}',meta:{moduleName:"consul-ui/components/popover-select/optgroup/index.hbs"}}) -var n=Ember._setComponentTemplate(t,Ember._templateOnlyComponent()) -e.default=n})),define("consul-ui/components/popover-select/option/index",["exports","@glimmer/component"],(function(e,t){var n,r,a,l,s -function i(e,t,n,r,a){var l={} -return Object.keys(r).forEach((function(e){l[e]=r[e]})),l.enumerable=!!l.enumerable,l.configurable=!!l.configurable,("value"in l||l.initializer)&&(l.writable=!0),l=n.slice().reverse().reduce((function(n,r){return r(e,t,n)||n}),l),a&&void 0!==l.initializer&&(l.value=l.initializer?l.initializer.call(a):void 0,l.initializer=void 0),void 0===l.initializer&&(Object.defineProperty(e,t,l),l=null),l}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const o=Ember.HTMLBars.template({id:"n6EznTlk",block:'{"symbols":["MenuItem","&attrs","@onclick","@selected","&default","@components"],"statements":[[6,[37,6],[[32,6,["MenuItem"]]],null,[["default"],[{"statements":[[2," "],[8,[32,1],[[16,0,[30,[36,0],[[32,0,["selected"]],"is-active"],null]],[17,2],[4,[38,2],[[32,0,["connect"]]],null],[4,[38,2],[[30,[36,3],[[32,0],"selected",[32,4]],null]],null],[4,[38,4],[[30,[36,3],[[32,0],"selected",[32,4]],null]],null],[4,[38,5],[[32,0,["disconnect"]]],null]],[["@onclick","@selected"],[[30,[36,1],[[32,0],[32,3],[32,0]],null],[32,0,["selected"]]]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["label"]],[["default"],[{"statements":[[2,"\\n "],[18,5,null],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[1]}]]]],"hasEval":false,"upvars":["if","action","did-insert","set","did-update","will-destroy","let"]}',meta:{moduleName:"consul-ui/components/popover-select/option/index.hbs"}}) -let u=(n=Ember._tracked,r=Ember._action,a=Ember._action,l=class extends t.default{constructor(...e){var t,n,r,a -super(...e),t=this,n="selected",a=this,(r=s)&&Object.defineProperty(t,n,{enumerable:r.enumerable,configurable:r.configurable,writable:r.writable,value:r.initializer?r.initializer.call(a):void 0})}connect(){this.args.select.addOption(this)}disconnect(){this.args.select.removeOption(this)}},s=i(l.prototype,"selected",[n],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),i(l.prototype,"connect",[r],Object.getOwnPropertyDescriptor(l.prototype,"connect"),l.prototype),i(l.prototype,"disconnect",[a],Object.getOwnPropertyDescriptor(l.prototype,"disconnect"),l.prototype),l) -e.default=u,Ember._setComponentTemplate(o,u)})),define("consul-ui/components/portal-target",["exports","ember-stargate/components/portal-target"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/components/portal",["exports","ember-stargate/components/portal"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/components/power-select-multiple-with-create",["exports","ember-power-select-with-create/components/power-select-multiple-with-create"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/components/power-select-multiple",["exports","ember-power-select/components/power-select-multiple"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/components/power-select-multiple/trigger",["exports","ember-power-select/components/power-select-multiple/trigger"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/components/power-select-with-create",["exports","ember-power-select-with-create/components/power-select-with-create"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/components/power-select-with-create/suggested-option",["exports","ember-power-select-with-create/components/power-select-with-create/suggested-option"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/components/power-select",["exports","ember-power-select/components/power-select"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/components/power-select/before-options",["exports","ember-power-select/components/power-select/before-options"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/components/power-select/no-matches-message",["exports","ember-power-select/components/power-select/no-matches-message"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/components/power-select/options",["exports","ember-power-select/components/power-select/options"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/components/power-select/placeholder",["exports","ember-power-select/components/power-select/placeholder"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/components/power-select/power-select-group",["exports","ember-power-select/components/power-select/power-select-group"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/components/power-select/search-message",["exports","ember-power-select/components/power-select/search-message"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/components/power-select/trigger",["exports","ember-power-select/components/power-select/trigger"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/components/progress/index",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const t=Ember.HTMLBars.template({id:"i9InYRlc",block:'{"symbols":["&attrs"],"statements":[[11,"div"],[24,0,"progress indeterminate"],[24,"role","progressbar"],[17,1],[12],[13],[2,"\\n"]],"hasEval":false,"upvars":[]}',meta:{moduleName:"consul-ui/components/progress/index.hbs"}}) -var n=Ember._setComponentTemplate(t,Ember._templateOnlyComponent()) -e.default=n})),define("consul-ui/components/radio-card/index",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const t=Ember.HTMLBars.template({id:"Z32bK3Za",block:'{"symbols":["&attrs","&default"],"statements":[[11,"label"],[17,1],[16,0,[31,["radio-card",[30,[36,5],[[35,1]," checked"],null]]]],[12],[2,"\\n "],[10,"div"],[12],[2,"\\n"],[6,[37,5],[[30,[36,6],[[35,4,["length"]],0],null]],null,[["default","else"],[{"statements":[[2," "],[10,"input"],[15,3,[34,0]],[15,2,[34,4]],[15,"checked",[34,1]],[15,"onchange",[30,[36,3],[[32,0],[35,2]],null]],[14,4,"radio"],[12],[13],[2,"\\n"]],"parameters":[]},{"statements":[[2," "],[10,"input"],[15,3,[34,0]],[14,2,""],[15,"checked",[34,1]],[15,"onchange",[30,[36,3],[[32,0],[35,2]],null]],[14,4,"radio"],[12],[13],[2,"\\n"]],"parameters":[]}]]],[2," "],[13],[2,"\\n "],[10,"div"],[12],[2,"\\n "],[18,2,null],[2,"\\n "],[13],[2,"\\n"],[13]],"hasEval":false,"upvars":["name","checked","onchange","action","value","if","gt"]}',meta:{moduleName:"consul-ui/components/radio-card/index.hbs"}}) -var n=Ember._setComponentTemplate(t,Ember.Component.extend({tagName:""})) -e.default=n})) -define("consul-ui/components/radio-group/index",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const t=Ember.HTMLBars.template({id:"VMO7TmR4",block:'{"symbols":["item","_key","_value"],"statements":[[10,"fieldset"],[12],[2,"\\n "],[10,"div"],[14,"role","radiogroup"],[15,1,[31,["radiogroup_",[34,3]]]],[12],[2,"\\n"],[6,[37,12],[[30,[36,11],[[30,[36,11],[[35,10]],null]],null]],null,[["default"],[{"statements":[[6,[37,9],[[30,[36,1],[[30,[36,8],[[32,1,["key"]],[29]],null],[32,1,["key"]],[32,1,["value"]]],null],[30,[36,7],[[32,1,["label"]],[32,1,["value"]]],null]],null,[["default"],[{"statements":[[2," "],[10,"label"],[15,"tabindex",[30,[36,1],[[35,0],"0"],null]],[15,"onkeydown",[30,[36,1],[[35,0],[30,[36,2],[[32,0],"keydown"],null]],null]],[15,0,[31,["type-radio value-",[32,2]]]],[12],[2," "],[2,"\\n "],[10,"input"],[15,3,[34,3]],[15,2,[32,2]],[15,"checked",[30,[36,1],[[30,[36,6],[[30,[36,5],[[35,4]],null],[32,2]],null],"checked"],null]],[15,"onchange",[30,[36,2],[[32,0],"change"],null]],[14,4,"radio"],[12],[13],[2,"\\n "],[10,"span"],[12],[1,[32,3]],[13],[2,"\\n "],[13],[2,"\\n"]],"parameters":[2,3]}]]]],"parameters":[1]}]]],[2," "],[13],[2,"\\n"],[13],[2,"\\n"]],"hasEval":false,"upvars":["keyboardAccess","if","action","name","value","concat","eq","or","not-eq","let","items","-track-array","each"]}',meta:{moduleName:"consul-ui/components/radio-group/index.hbs"}}) -var n=Ember._setComponentTemplate(t,Ember.Component.extend({tagName:"",keyboardAccess:!1,dom:Ember.inject.service("dom"),init:function(){this._super(...arguments),this.name=this.dom.guid(this)},actions:{keydown:function(e){13===e.keyCode&&e.target.dispatchEvent(new MouseEvent("click"))},change:function(e){this.onchange(this.dom.setEventTargetProperty(e,"value",e=>""===e?void 0:e))}}})) -e.default=n})),define("consul-ui/components/ref/index",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -var t=Ember.Component.extend({tagName:"",didReceiveAttrs:function(){Ember.set(this.target,this.name,this.value)}}) -e.default=t})),define("consul-ui/components/role-form/index",["exports","consul-ui/components/form-component/index"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const n=Ember.HTMLBars.template({id:"YrahCt0J",block:'{"symbols":["&default","&attrs"],"statements":[[18,1,null],[2,"\\n"],[11,"fieldset"],[24,0,"role-form"],[16,"disabled",[30,[36,6],[[30,[36,2],[[30,[36,1],["write role"],[["item"],[[35,0]]]]],null],"disabled"],null]],[17,2],[12],[2,"\\n "],[10,"label"],[15,0,[31,["type-text",[30,[36,6],[[35,0,["error","Name"]]," has-error"],null]]]],[12],[2,"\\n "],[10,"span"],[12],[2,"Name"],[13],[2,"\\n "],[10,"input"],[15,2,[34,0,["Name"]]],[14,3,"role[Name]"],[14,"autofocus","autofocus"],[15,"oninput",[30,[36,7],[[32,0],"change"],null]],[14,4,"text"],[12],[13],[2,"\\n "],[10,"em"],[12],[2,"\\n Maximum 256 characters. May only include letters (uppercase and/or lowercase) and/or numbers. Must be unique.\\n "],[13],[2,"\\n"],[6,[37,6],[[35,0,["error","Name"]]],null,[["default"],[{"statements":[[2," "],[10,"strong"],[12],[1,[35,0,["error","Name","validation"]]],[13],[2,"\\n"]],"parameters":[]}]]],[2," "],[13],[2,"\\n "],[10,"label"],[14,0,"type-text"],[12],[2,"\\n "],[10,"span"],[12],[2,"Description (Optional)"],[13],[2,"\\n "],[10,"textarea"],[14,3,"role[Description]"],[15,2,[34,0,["Description"]]],[15,"oninput",[30,[36,7],[[32,0],"change"],null]],[12],[13],[2,"\\n "],[13],[2,"\\n"],[13],[2,"\\n"],[10,"fieldset"],[14,1,"policies"],[14,0,"policies"],[12],[2,"\\n "],[10,"h2"],[12],[2,"Policies"],[13],[2,"\\n"],[6,[37,9],null,[["name","params"],["policy",[30,[36,8],[[35,0]],null]]],[["default","else"],[{"statements":[[2," "],[18,1,null],[2,"\\n"]],"parameters":[]},{"statements":[[2," "],[8,"policy-selector",[],[["@disabled","@dc","@partition","@nspace","@items"],[[30,[36,2],[[30,[36,1],["write role"],[["item"],[[35,0]]]]],null],[34,3],[34,4],[34,5],[34,0,["Policies"]]]],null],[2,"\\n"]],"parameters":[]}]]],[13],[2,"\\n"]],"hasEval":false,"upvars":["item","can","not","dc","partition","nspace","if","action","block-params","yield-slot"]}',meta:{moduleName:"consul-ui/components/role-form/index.hbs"}}) -var r=Ember._setComponentTemplate(n,t.default.extend({type:"role",name:"role",classNames:["role-form"]})) -e.default=r})),define("consul-ui/components/role-selector/index",["exports","consul-ui/components/child-selector/index","consul-ui/utils/dom/event-source"],(function(e,t,n){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const r=Ember.HTMLBars.template({id:"shRBjLTM",block:'{"symbols":["item","index","index","change","checked","confirm","send","keypressClick","__arg0","__arg1","Actions","option","modal","close"],"statements":[[8,"modal-dialog",[[24,0,"role-selector"],[24,1,"new-role"]],[["@onclose","@aria"],[[30,[36,1],[[32,0],[30,[36,10],[[35,9]],null],"role"],null],[30,[36,6],null,[["label"],[[30,[36,5],[[30,[36,15],[[35,9],"role"],null],"New Role","New Policy"],null]]]]]],[["default"],[{"statements":[[2,"\\n "],[8,"ref",[],[["@target","@name","@value"],[[32,0],"modal",[32,13]]],null],[2,"\\n "],[8,"block-slot",[],[["@name"],["header"]],[["default"],[{"statements":[[2,"\\n"],[6,[37,5],[[30,[36,15],[[35,9],"role"],null]],null,[["default","else"],[{"statements":[[2," "],[10,"h2"],[12],[2,"New Role"],[13],[2,"\\n"]],"parameters":[]},{"statements":[[2," "],[10,"h2"],[12],[2,"New Policy"],[13],[2,"\\n"]],"parameters":[]}]]],[2," "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["body"]],[["default"],[{"statements":[[2,"\\n\\n "],[10,"input"],[15,1,[31,[[34,16],"_state_role"]]],[15,3,[31,[[34,16],"[state]"]]],[14,2,"role"],[15,"checked",[30,[36,5],[[30,[36,15],[[35,9],"role"],null],"checked"],null]],[15,"onchange",[30,[36,1],[[32,0],"change"],null]],[14,4,"radio"],[12],[13],[2,"\\n "],[8,"role-form",[],[["@form","@dc","@nspace","@partition"],[[34,17],[34,18],[34,19],[34,20]]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["policy"]],[["default"],[{"statements":[[2,"\\n\\n "],[8,"policy-selector",[],[["@source","@dc","@partition","@nspace","@items"],[[34,21],[34,18],[34,20],[34,19],[34,11,["Policies"]]]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["trigger"]],[["default"],[{"statements":[[2,"\\n "],[10,"label"],[15,"for",[31,[[34,16],"_state_policy"]]],[14,0,"type-dialog"],[12],[2,"\\n "],[10,"span"],[12],[2,"Create new policy"],[13],[2,"\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n\\n "],[10,"input"],[15,1,[31,[[34,16],"_state_policy"]]],[15,3,[31,[[34,16],"[state]"]]],[14,2,"policy"],[15,"checked",[30,[36,5],[[30,[36,15],[[35,9],"policy"],null],"checked"],null]],[15,"onchange",[30,[36,1],[[32,0],"change"],null]],[14,4,"radio"],[12],[13],[2,"\\n "],[8,"policy-form",[],[["@name","@form","@dc","@nspace","@partition"],["role[policy]",[34,22],[34,18],[34,19],[34,20]]],null],[2,"\\n\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["actions"]],[["default"],[{"statements":[[2,"\\n\\n"],[6,[37,5],[[30,[36,15],[[35,9],"role"],null]],null,[["default","else"],[{"statements":[[2," "],[10,"button"],[15,"onclick",[30,[36,14],[[32,0,["save"]],[35,11],[35,0],[30,[36,13],[[30,[36,1],[[32,0],[32,14]],null],[30,[36,1],[[32,0],"reset"],null]],null]],null]],[15,"disabled",[30,[36,5],[[30,[36,8],[[35,11,["isSaving"]],[35,11,["isPristine"]],[35,11,["isInvalid"]]],null],"disabled"],null]],[14,4,"submit"],[12],[2,"\\n"],[6,[37,5],[[35,11,["isSaving"]]],null,[["default"],[{"statements":[[2," "],[10,"div"],[14,0,"progress indeterminate"],[12],[13],[2,"\\n"]],"parameters":[]}]]],[2," "],[10,"span"],[12],[2,"Create and apply"],[13],[2,"\\n "],[13],[2,"\\n "],[11,"button"],[16,"disabled",[30,[36,5],[[35,11,["isSaving"]],"disabled"],null]],[24,4,"reset"],[4,[38,1],[[32,0],[30,[36,13],[[30,[36,1],[[32,0],[32,14]],null],[30,[36,1],[[32,0],"reset"],null]],null]],null],[12],[2,"Cancel"],[13],[2,"\\n"]],"parameters":[]},{"statements":[[2," "],[11,"button"],[16,"disabled",[30,[36,5],[[30,[36,8],[[35,7,["isSaving"]],[35,7,["isPristine"]],[35,7,["isInvalid"]]],null],"disabled"],null]],[24,4,"submit"],[4,[38,1],[[32,0],"dispatch","save",[30,[36,12],[[35,7],[35,11,["Policies"]],[30,[36,1],[[32,0],[30,[36,10],[[35,9]],null],"role"],null]],null]],null],[12],[2,"\\n"],[6,[37,5],[[35,7,["isSaving"]]],null,[["default"],[{"statements":[[2," "],[10,"div"],[14,0,"progress indeterminate"],[12],[13],[2,"\\n"]],"parameters":[]}]]],[2," "],[10,"span"],[12],[2,"Create and apply"],[13],[2,"\\n "],[13],[2,"\\n "],[11,"button"],[16,"disabled",[30,[36,5],[[35,7,["isSaving"]],"disabled"],null]],[24,4,"reset"],[4,[38,1],[[32,0],[30,[36,10],[[35,9]],null],"role"],null],[12],[2,"Cancel"],[13],[2,"\\n"]],"parameters":[]}]]],[2,"\\n "]],"parameters":[14]}]]],[2,"\\n"]],"parameters":[13]}]]],[2,"\\n\\n"],[8,"child-selector",[],[["@disabled","@repo","@dc","@partition","@nspace","@type","@placeholder","@items"],[[34,23],[34,24],[34,18],[34,20],[34,19],"role","Search for role",[34,0]]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["label"]],[["default"],[{"statements":[[2,"\\n Apply an existing role\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["create"]],[["default"],[{"statements":[[2,"\\n "],[11,"label"],[24,0,"type-dialog"],[4,[38,2],["click",[30,[36,25],[[32,0,["modal","open"]]],null]],null],[12],[2,"\\n "],[10,"span"],[12],[2,"Create new role"],[13],[2,"\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["option"]],[["default"],[{"statements":[[2,"\\n "],[1,[32,12,["Name"]]],[2,"\\n "]],"parameters":[12]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["set"]],[["default"],[{"statements":[[2,"\\n "],[8,"tabular-collection",[],[["@rows","@items"],[5,[30,[36,26],["CreateTime:desc","Name:asc",[35,0]],null]]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["header"]],[["default"],[{"statements":[[2,"\\n "],[10,"th"],[12],[2,"Name"],[13],[2,"\\n "],[10,"th"],[12],[2,"Description"],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["row"]],[["default"],[{"statements":[[2,"\\n "],[10,"td"],[12],[2,"\\n "],[10,"a"],[15,6,[30,[36,27],["dc.acls.roles.edit",[32,1,["ID"]]],null]],[12],[1,[32,1,["Name"]]],[13],[2,"\\n "],[13],[2,"\\n "],[10,"td"],[12],[2,"\\n "],[1,[32,1,["Description"]]],[2,"\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["actions"]],[["default"],[{"statements":[[2,"\\n "],[8,"popover-menu",[],[["@expanded","@onchange","@keyboardAccess"],[[30,[36,5],[[30,[36,15],[[32,5],[32,3]],null],true,false],null],[30,[36,1],[[32,0],[32,4],[32,3]],null],false]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["trigger"]],[["default"],[{"statements":[[2,"\\n More\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["menu"]],[["default"],[{"statements":[[2,"\\n "],[10,"li"],[14,"role","none"],[12],[2,"\\n "],[10,"a"],[14,"role","menuitem"],[14,"tabindex","-1"],[15,6,[30,[36,27],["dc.acls.roles.edit",[32,1,["ID"]]],null]],[12],[2,"\\n"],[6,[37,5],[[30,[36,28],["edit role"],[["item"],[[32,1]]]]],null,[["default","else"],[{"statements":[[2," Edit\\n"]],"parameters":[]},{"statements":[[2," View\\n"]],"parameters":[]}]]],[2," "],[13],[2,"\\n "],[13],[2,"\\n"],[6,[37,5],[[30,[36,29],[[35,23]],null]],null,[["default"],[{"statements":[[2," "],[10,"li"],[14,"role","none"],[14,0,"dangerous"],[12],[2,"\\n "],[10,"label"],[15,"for",[32,6]],[14,"role","menuitem"],[14,"tabindex","-1"],[15,"onkeypress",[32,8]],[12],[2,"Remove"],[13],[2,"\\n "],[10,"div"],[14,"role","menu"],[12],[2,"\\n "],[8,"informed-action",[[24,0,"warning"]],[["@namedBlocksInfo"],[[30,[36,6],null,[["header","body","actions"],[0,0,1]]]]],[["default"],[{"statements":[[6,[37,5],[[30,[36,4],[[32,9],"header"],null]],null,[["default","else"],[{"statements":[[2,"\\n Confirm Remove\\n "]],"parameters":[]},{"statements":[[6,[37,5],[[30,[36,4],[[32,9],"body"],null]],null,[["default","else"],[{"statements":[[2,"\\n "],[10,"p"],[12],[2,"\\n Are you sure you want to remove this role?\\n "],[13],[2,"\\n "]],"parameters":[]},{"statements":[[6,[37,5],[[30,[36,4],[[32,9],"actions"],null]],null,[["default"],[{"statements":[[6,[37,3],[[32,10]],null,[["default"],[{"statements":[[2,"\\n "],[8,[32,11,["Action"]],[[24,0,"dangerous"]],[[],[]],[["default"],[{"statements":[[2,"\\n "],[8,"action",[[24,"tabindex","-1"],[4,[38,2],["click",[30,[36,1],[[32,0],[32,7],"remove",[32,1],[35,0]],null]],null]],[[],[]],[["default"],[{"statements":[[2,"\\n Remove\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,[32,11,["Action"]],[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[8,"action",[],[["@for"],[[32,6]]],[["default"],[{"statements":[[2,"\\n Cancel\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[11]}]]]],"parameters":[]}]]]],"parameters":[]}]]]],"parameters":[]}]]]],"parameters":[9,10]}]]],[2,"\\n "],[13],[2,"\\n "],[13],[2,"\\n"]],"parameters":[]}]]],[2," "]],"parameters":[6,7,8]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[3,4,5]}]]],[2,"\\n "]],"parameters":[1,2]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[]}]]],[2,"\\n"]],"hasEval":false,"upvars":["items","action","on","let","-is-named-block-invocation","if","hash","policy","or","state","mut","item","array","queue","perform","eq","name","form","dc","nspace","partition","source","policyForm","disabled","repo","optional","sort-by","href-to","can","not"]}',meta:{moduleName:"consul-ui/components/role-selector/index.hbs"}}) -var a=Ember._setComponentTemplate(r,t.default.extend({repo:Ember.inject.service("repository/role"),dom:Ember.inject.service("dom"),name:"role",type:"role",classNames:["role-selector"],state:"role",policy:Ember.computed.alias("policyForm.data"),init:function(){this._super(...arguments),this.policyForm=this.formContainer.form("policy"),this.source=new n.CallableEventSource},actions:{reset:function(e){this._super(...arguments),this.policyForm.clear({Datacenter:this.dc})},dispatch:function(e,t){this.source.dispatchEvent({type:e,data:t})},change:function(){const e=this.dom.normalizeEvent(...arguments),t=e.target -switch(t.name){case"role[state]":Ember.set(this,"state",t.value),"policy"===t.value&&this.dom.component(".code-editor",t.nextElementSibling).didAppear() -break -default:this._super(...arguments)}}}})) -e.default=a})),define("consul-ui/components/route/announcer/index",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const t=Ember.HTMLBars.template({id:"TLOSA7kE",block:'{"symbols":["@separator","@title"],"statements":[[1,[30,[36,1],[[32,2]],[["separator"],[[30,[36,0],[[32,1]," - "],null]]]]],[2,"\\n"],[8,"portal-target",[],[["@name"],["route-announcer"]],null],[2,"\\n\\n"]],"hasEval":false,"upvars":["or","page-title"]}',meta:{moduleName:"consul-ui/components/route/announcer/index.hbs"}}) -var n=Ember._setComponentTemplate(t,Ember._templateOnlyComponent()) -e.default=n})),define("consul-ui/components/route/index",["exports","@glimmer/component"],(function(e,t){var n,r,a,l,s,i,o,u,c,d,m,p,f,b -function h(e,t,n,r){n&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(r):void 0})}function v(e,t,n,r,a){var l={} -return Object.keys(r).forEach((function(e){l[e]=r[e]})),l.enumerable=!!l.enumerable,l.configurable=!!l.configurable,("value"in l||l.initializer)&&(l.writable=!0),l=n.slice().reverse().reduce((function(n,r){return r(e,t,n)||n}),l),a&&void 0!==l.initializer&&(l.value=l.initializer?l.initializer.call(a):void 0,l.initializer=void 0),void 0===l.initializer&&(Object.defineProperty(e,t,l),l=null),l}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const y=Ember.HTMLBars.template({id:"uH9p2fDA",block:'{"symbols":["&default"],"statements":[[1,[30,[36,0],[[32,0,["connect"]]],null]],[2,"\\n"],[1,[30,[36,1],[[32,0,["disconnect"]]],null]],[2,"\\n"],[18,1,[[30,[36,3],null,[["model","params","currentName","refresh","t","Title","Announcer"],[[32,0,["model"]],[32,0,["params"]],[32,0,["router","currentRoute","name"]],[32,0,["refresh"]],[32,0,["t"]],[30,[36,2],["route/title"],null],[30,[36,2],["route/announcer"],null]]]]]]],"hasEval":false,"upvars":["did-insert","will-destroy","component","hash"]}',meta:{moduleName:"consul-ui/components/route/index.hbs"}}),g=/\${([A-Za-z.0-9_-]+)}/g -let O=(n=Ember.inject.service("routlet"),r=Ember.inject.service("router"),a=Ember.inject.service("intl"),l=Ember.inject.service("encoder"),s=Ember._tracked,i=Ember._action,o=Ember._action,u=Ember._action,c=class extends t.default{constructor(){super(...arguments),h(this,"routlet",d,this),h(this,"router",m,this),h(this,"intl",p,this),h(this,"encoder",f,this),h(this,"_model",b,this),this.intlKey=this.encoder.createRegExpEncoder(g,e=>e)}get params(){return this.routlet.paramsFor(this.args.name)}get model(){if(this._model)return this._model -if(this.args.name){const e=this.routlet.outletFor(this.args.name) -return this.routlet.modelFor(e.name)}}t(e,t){return e.includes("${")&&(e=this.intlKey(e,t)),this.intl.t(`routes.${this.args.name}.${e}`,t)}connect(){this.routlet.addRoute(this.args.name,this)}disconnect(){this.routlet.removeRoute(this.args.name,this)}},d=v(c.prototype,"routlet",[n],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),m=v(c.prototype,"router",[r],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),p=v(c.prototype,"intl",[a],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),f=v(c.prototype,"encoder",[l],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),b=v(c.prototype,"_model",[s],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),v(c.prototype,"t",[i],Object.getOwnPropertyDescriptor(c.prototype,"t"),c.prototype),v(c.prototype,"connect",[o],Object.getOwnPropertyDescriptor(c.prototype,"connect"),c.prototype),v(c.prototype,"disconnect",[u],Object.getOwnPropertyDescriptor(c.prototype,"disconnect"),c.prototype),c) -e.default=O,Ember._setComponentTemplate(y,O)})),define("consul-ui/components/route/title/index",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const t=Ember.HTMLBars.template({id:"W83dDaVI",block:'{"symbols":["@title","@separator","@render","&attrs"],"statements":[[1,[30,[36,0],[[32,1]],[["separator"],[[32,2]]]]],[2,"\\n"],[6,[37,2],[[30,[36,1],[[32,3],false],null]],null,[["default"],[{"statements":[[1,[32,1]],[2,"\\n"]],"parameters":[]}]]],[8,"portal",[],[["@target"],["route-announcer"]],[["default"],[{"statements":[[2,"\\n"],[11,"div"],[24,0,"route-title"],[17,4],[24,"aria-live","assertive"],[24,"aria-atomic","true"],[12],[2,"\\n"],[2," "],[1,[30,[36,3],["Navigated to ",[32,1]],null]],[2,"\\n"],[13],[2,"\\n"]],"parameters":[]}]]],[2,"\\n"]],"hasEval":false,"upvars":["page-title","not-eq","if","concat"]}',meta:{moduleName:"consul-ui/components/route/title/index.hbs"}}) -var n=Ember._setComponentTemplate(t,Ember._templateOnlyComponent()) -e.default=n})),define("consul-ui/components/search-bar/index",["exports","@glimmer/component","consul-ui/components/search-bar/utils"],(function(e,t,n){var r,a -Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const l=Ember.HTMLBars.template({id:"zyw10T4p",block:'{"symbols":["filter","@filter","&default","&attrs"],"statements":[[11,"div"],[24,0,"search-bar"],[17,4],[12],[2,"\\n "],[10,"form"],[14,0,"filter-bar"],[12],[2,"\\n "],[10,"div"],[14,0,"search"],[12],[2,"\\n "],[18,3,[[30,[36,6],["search"],null],[30,[36,1],null,[["Search","Select"],[[30,[36,5],["freetext-filter"],null],[30,[36,5],["popover-select"],null]]]]]],[2,"\\n "],[13],[2,"\\n "],[10,"div"],[14,0,"filters"],[12],[2,"\\n "],[18,3,[[30,[36,6],["filter"],null],[30,[36,1],null,[["Search","Select"],[[30,[36,5],["freetext-filter"],null],[30,[36,5],["popover-select"],null]]]]]],[2,"\\n "],[13],[2,"\\n "],[10,"div"],[14,0,"sort"],[12],[2,"\\n "],[18,3,[[30,[36,6],["sort"],null],[30,[36,1],null,[["Search","Select"],[[30,[36,5],["freetext-filter"],null],[30,[36,5],["popover-select"],null]]]]]],[2,"\\n "],[13],[2,"\\n "],[13],[2,"\\n"],[6,[37,12],[[32,0,["isFiltered"]]],null,[["default"],[{"statements":[[2," "],[10,"div"],[14,0,"search-bar-status"],[12],[2,"\\n "],[10,"dl"],[12],[2,"\\n "],[10,"dt"],[12],[1,[30,[36,8],[[30,[36,7],["component.search-bar.header"],[["default","item"],["common.ui.filtered-by",""]]]],null]],[13],[2,"\\n "],[10,"dd"],[12],[2,"\\n "],[10,"ul"],[12],[2,"\\n"],[6,[37,10],[[30,[36,9],[[30,[36,9],[[32,0,["filters"]]],null]],null]],null,[["default"],[{"statements":[[2," "],[18,3,[[30,[36,6],["status"],null],[30,[36,1],null,[["RemoveFilter","status"],[[30,[36,5],["search-bar/remove-filter"],[["onclick"],[[30,[36,4],[[32,0],[30,[36,3],[[30,[36,3],[[32,2],[32,1,["key"]]],null],"change"],null],[30,[36,1],null,[["target"],[[30,[36,1],null,[["selectedItems"],[[30,[36,2],[[32,1,["selected"]],","],null]]]]]]]],null]]]],[30,[36,1],null,[["key","value"],[[32,1,["key"]],[30,[36,0],[[32,1,["value"]]],null]]]]]]]]],[2,"\\n"]],"parameters":[1]}]]],[2," "],[10,"li"],[14,0,"remove-all"],[12],[2,"\\n "],[8,"action",[[4,[38,11],["click",[32,0,["removeAllFilters"]]],null]],[[],[]],[["default"],[{"statements":[[2,"\\n Remove filters\\n "]],"parameters":[]}]]],[2,"\\n "],[13],[2,"\\n "],[13],[2,"\\n "],[13],[2,"\\n "],[13],[2,"\\n "],[13],[2,"\\n"]],"parameters":[]}]]],[13],[2,"\\n"]],"hasEval":false,"upvars":["lowercase","hash","join","get","action","component","-named-block-invocation","t","string-trim","-track-array","each","on","if"]}',meta:{moduleName:"consul-ui/components/search-bar/index.hbs"}}) -let s=(r=Ember._action,a=class extends t.default{get isFiltered(){const e=this.args.filter.searchproperty||{default:[],value:[]} -return(0,n.diff)(e.default,e.value).length>0||Object.entries(this.args.filter).some(([e,t])=>"searchproperty"!==e&&void 0!==t.value)}get filters(){return(0,n.filters)(this.args.filter)}removeAllFilters(){Object.values(this.args.filter).forEach((e,t)=>{setTimeout(()=>e.change(e.default||[]),1*t)})}},i=a.prototype,o="removeAllFilters",u=[r],c=Object.getOwnPropertyDescriptor(a.prototype,"removeAllFilters"),d=a.prototype,m={},Object.keys(c).forEach((function(e){m[e]=c[e]})),m.enumerable=!!m.enumerable,m.configurable=!!m.configurable,("value"in m||m.initializer)&&(m.writable=!0),m=u.slice().reverse().reduce((function(e,t){return t(i,o,e)||e}),m),d&&void 0!==m.initializer&&(m.value=m.initializer?m.initializer.call(d):void 0,m.initializer=void 0),void 0===m.initializer&&(Object.defineProperty(i,o,m),m=null),a) -var i,o,u,c,d,m -e.default=s,Ember._setComponentTemplate(l,s)})),define("consul-ui/components/search-bar/remove-filter/index",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const t=Ember.HTMLBars.template({id:"qI+OTqbX",block:'{"symbols":["&attrs","@onclick","&default"],"statements":[[10,"li"],[12],[2,"\\n "],[8,"action",[[17,1],[4,[38,0],["click",[32,2]],null]],[[],[]],null],[2,"\\n "],[18,3,null],[2,"\\n"],[13],[2,"\\n"]],"hasEval":false,"upvars":["on"]}',meta:{moduleName:"consul-ui/components/search-bar/remove-filter/index.hbs"}}) -var n=Ember._setComponentTemplate(t,Ember._templateOnlyComponent()) -e.default=n})),define("consul-ui/components/search-bar/utils",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.filters=e.diff=void 0 -const t=(e,t)=>e.filter(e=>!t.includes(e)) -e.diff=t -e.filters=e=>Object.entries(e).filter(([e,n])=>"searchproperty"===e?t(n.default,n.value).length>0:(n.value||[]).length>0).reduce((e,[n,r])=>e.concat(r.value.map(e=>{const a={key:n,value:e} -return a.selected="searchproperty"!==n?t(r.value,[e]):1===r.value.length?r.default:t(r.value,[e]),a})),[])})),define("consul-ui/components/secret-button/index",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const t=Ember.HTMLBars.template({id:"XcT8OSA5",block:'{"symbols":["&default"],"statements":[[10,"label"],[14,0,"type-reveal"],[12],[2,"\\n "],[10,"input"],[14,4,"checkbox"],[12],[13],[2,"\\n "],[10,"span"],[12],[2,"Reveal"],[13],[2,"\\n "],[10,"em"],[12],[18,1,null],[13],[2,"\\n"],[13]],"hasEval":false,"upvars":[]}',meta:{moduleName:"consul-ui/components/secret-button/index.hbs"}}) -var n=Ember._setComponentTemplate(t,Ember.Component.extend({})) -e.default=n})),define("consul-ui/components/shadow-host/index",["exports","@glimmer/component"],(function(e,t){var n,r,a,l -function s(e,t,n,r,a){var l={} -return Object.keys(r).forEach((function(e){l[e]=r[e]})),l.enumerable=!!l.enumerable,l.configurable=!!l.configurable,("value"in l||l.initializer)&&(l.writable=!0),l=n.slice().reverse().reduce((function(n,r){return r(e,t,n)||n}),l),a&&void 0!==l.initializer&&(l.value=l.initializer?l.initializer.call(a):void 0,l.initializer=void 0),void 0===l.initializer&&(Object.defineProperty(e,t,l),l=null),l}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const i=Ember.HTMLBars.template({id:"U0GA4gT4",block:'{"symbols":["&default"],"statements":[[18,1,[[30,[36,2],null,[["host","root","Template"],[[30,[36,1],[[32,0,["attachShadow"]]],null],[32,0,["shadowRoot"]],[30,[36,0],["shadow-template"],[["shadowRoot"],[[32,0,["shadowRoot"]]]]]]]]]],[2,"\\n"]],"hasEval":false,"upvars":["component","fn","hash"]}',meta:{moduleName:"consul-ui/components/shadow-host/index.hbs"}}) -let o=(n=Ember._tracked,r=Ember._action,a=class extends t.default{constructor(...e){var t,n,r,a -super(...e),t=this,n="shadowRoot",a=this,(r=l)&&Object.defineProperty(t,n,{enumerable:r.enumerable,configurable:r.configurable,writable:r.writable,value:r.initializer?r.initializer.call(a):void 0})}attachShadow(e){this.shadowRoot=e.attachShadow({mode:"open"})}},l=s(a.prototype,"shadowRoot",[n],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),s(a.prototype,"attachShadow",[r],Object.getOwnPropertyDescriptor(a.prototype,"attachShadow"),a.prototype),a) -e.default=o,Ember._setComponentTemplate(i,o)})),define("consul-ui/components/shadow-template/index",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const t=Ember.HTMLBars.template({id:"SySVt5/r",block:'{"symbols":["@styles","@shadowRoot","&default"],"statements":[[6,[37,1],[[32,2]],null,[["default"],[{"statements":[[6,[37,2],[[32,2]],[["guid","insertBefore"],["%cursor:0%",[29]]],[["default"],[{"statements":[[6,[37,1],[[32,1]],null,[["default"],[{"statements":[[2," "],[1,[30,[36,0],[[32,2],[32,1]],null]],[2,"\\n"]],"parameters":[]}]]],[2," "],[18,3,null],[2,"\\n"]],"parameters":[]}]]]],"parameters":[]}]]]],"hasEval":false,"upvars":["adopt-styles","if","in-element"]}',meta:{moduleName:"consul-ui/components/shadow-template/index.hbs"}}) -var n=Ember._setComponentTemplate(t,Ember._templateOnlyComponent()) -e.default=n})),define("consul-ui/components/state-chart/action/index",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const t=Ember.HTMLBars.template({id:"vK0LWE3t",block:'{"symbols":["&default"],"statements":[[18,1,null]],"hasEval":false,"upvars":[]}',meta:{moduleName:"consul-ui/components/state-chart/action/index.hbs"}}) -var n=Ember._setComponentTemplate(t,Ember.Component.extend({tagName:"",didInsertElement:function(){this._super(...arguments),this.chart.addAction(this.name,(e,t)=>this.exec(e,t))},willDestroy:function(){this._super(...arguments),this.chart.removeAction(this.type)}})) -e.default=n})),define("consul-ui/components/state-chart/guard/index",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const t=Ember.HTMLBars.template({id:"ajHPMf+f",block:'{"symbols":["&default"],"statements":[[18,1,null]],"hasEval":false,"upvars":[]}',meta:{moduleName:"consul-ui/components/state-chart/guard/index.hbs"}}) -var n=Ember._setComponentTemplate(t,Ember.Component.extend({tagName:"",didInsertElement:function(){this._super(...arguments) -const e=this -this.chart.addGuard(this.name,(function(){return"function"==typeof e.cond?e.cond(...arguments):e.cond}))},willDestroyElement:function(){this._super(...arguments),this.chart.removeGuard(this.name)}})) -e.default=n})),define("consul-ui/components/state-chart/index",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const t=Ember.HTMLBars.template({id:"uYjYKgyF",block:'{"symbols":["&default"],"statements":[[18,1,[[30,[36,2],["state"],[["state"],[[35,0]]]],[30,[36,2],["state-chart/guard"],[["chart"],[[32,0]]]],[30,[36,2],["state-chart/action"],[["chart"],[[32,0]]]],[30,[36,1],[[32,0],"dispatch"],null],[35,0]]]],"hasEval":false,"upvars":["state","action","component"]}',meta:{moduleName:"consul-ui/components/state-chart/index.hbs"}}) -var n=Ember._setComponentTemplate(t,Ember.Component.extend({chart:Ember.inject.service("state"),tagName:"",ontransition:function(){},init:function(){this._super(...arguments),this._actions={},this._guards={}},didReceiveAttrs:function(){void 0!==this.machine&&this.machine.stop(),void 0!==this.initial&&(this.src.initial=this.initial),this.machine=this.chart.interpret(this.src,{onTransition:e=>{const t=new CustomEvent("transition",{detail:e}) -this.ontransition(t),t.defaultPrevented||e.actions.forEach(t=>{"function"==typeof this._actions[t.type]&&this._actions[t.type](t.type,e.context,e.event)}),Ember.set(this,"state",e)},onGuard:(e,...t)=>this._guards[e](...t)})},didInsertElement:function(){this._super(...arguments),Ember.set(this,"state",this.machine.initialState||this.machine.state),this.machine.start()},willDestroy:function(){this._super(...arguments),this.machine.stop()},addAction:function(e,t){this._actions[e]=t},removeAction:function(e){delete this._actions[e]},addGuard:function(e,t){this._guards[e]=t},removeGuard:function(e){delete this._guards[e]},dispatch:function(e,t){this.machine.state.context=t,this.machine.send({type:e})},actions:{dispatch:function(e,t){t&&t.preventDefault&&(void 0!==t.target.nodeName&&"a"===t.target.nodeName.toLowerCase()||t.preventDefault()),this.dispatch(e,t)}}})) -e.default=n})),define("consul-ui/components/state/index",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const t=Ember.HTMLBars.template({id:"oAnib0UE",block:'{"symbols":["&default"],"statements":[[6,[37,1],[[35,0]],null,[["default"],[{"statements":[[2," "],[18,1,null],[2,"\\n"]],"parameters":[]}]]]],"hasEval":false,"upvars":["rendering","if"]}',meta:{moduleName:"consul-ui/components/state/index.hbs"}}) -var n=Ember._setComponentTemplate(t,Ember.Component.extend({service:Ember.inject.service("state"),tagName:"",didReceiveAttrs:function(){if(void 0===this.state)return -let e=!0 -void 0!==this.matches?e=this.service.matches(this.state,this.matches):void 0!==this.notMatches&&(e=!this.service.matches(this.state,this.notMatches)),Ember.set(this,"rendering",e)}})) -e.default=n})),define("consul-ui/components/tab-nav/index",["exports","@glimmer/component"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const n=Ember.HTMLBars.template({id:"AuN05zkB",block:'{"symbols":["select","name","item","@items","@onclick","&attrs"],"statements":[[6,[37,16],[[30,[36,15],[[30,[36,14],[[32,0],"style"],null]],[["offset"],[true]]],"tab"],null,[["default"],[{"statements":[[11,"nav"],[23,5,[30,[36,1],[[32,0,["style"]],[30,[36,11],["--selected-width:",[32,0,["style","width"]],";","--selected-left:",[32,0,["style","left"]],";","--selected-height:",[32,0,["style","height"]],";","--selected-top:",[32,0,["style","top"]]],null],[29]],null]],[24,"aria-label","Secondary"],[16,0,[30,[36,11],["tab-nav"," animatable"],null]],[17,6],[12],[2,"\\n "],[10,"ul"],[12],[2,"\\n"],[6,[37,13],[[30,[36,12],[[30,[36,12],[[32,4]],null]],null]],null,[["default"],[{"statements":[[2," "],[11,"li"],[16,0,[30,[36,1],[[30,[36,4],[[32,3,["selected"]],[30,[36,3],[[35,2],[30,[36,1],[[32,3,["label"]],[30,[36,0],[[32,3,["label"]]],null],[30,[36,0],[[32,3]],null]],null]],null]],null],"selected"],null]],[4,[38,6],["click",[30,[36,5],[[32,1]],null]],null],[4,[38,8],[[30,[36,1],[[32,3,["selected"]],[30,[36,5],[[32,1]],null],[30,[36,7],null,null]],null],[32,4,["length"]]],null],[12],[2,"\\n "],[8,"action",[[4,[38,6],["click",[30,[36,1],[[30,[36,10],[[32,5],[29]],null],[30,[36,5],[[32,5],[30,[36,9],[[32,3,["label"]]],null]],null],[30,[36,7],null,null]],null]],null]],[["@href"],[[32,3,["href"]]]],[["default"],[{"statements":[[2,"\\n "],[1,[32,3,["label"]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[13],[2,"\\n"]],"parameters":[3]}]]],[2," "],[13],[2,"\\n"],[13],[2,"\\n"]],"parameters":[1,2]}]]]],"hasEval":false,"upvars":["slugify","if","selected","eq","or","fn","on","noop","did-upsert","uppercase","not-eq","concat","-track-array","each","set","dom-position","let"]}',meta:{moduleName:"consul-ui/components/tab-nav/index.hbs"}}) -class r extends t.default{}e.default=r,Ember._setComponentTemplate(n,r)})),define("consul-ui/components/tabular-collection/index",["exports","ember-collection/components/ember-collection","ember-collection/utils/needs-revalidate","ember-collection/layouts/grid","block-slots"],(function(e,t,n,r,a){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const l=Ember.HTMLBars.template({id:"Vy6UbjoV",block:'{"symbols":["cell","index","&default","&attrs"],"statements":[[11,"table"],[16,0,[31,["tabular-collection dom-recycling ",[30,[36,4],[[35,3],"has-actions",""],null]]]],[16,1,[34,5]],[23,5,[30,[36,7],["height:",[35,6,["height"]],"px"],null]],[17,4],[12],[2,"\\n"],[1,[30,[36,8],["resize",[30,[36,1],[[32,0],"resize"],null]],null]],[2,"\\n"],[18,3,null],[2,"\\n"],[6,[37,4],[[35,9]],null,[["default"],[{"statements":[[2," "],[10,"caption"],[12],[8,"yield-slot",[],[["@name"],["caption"]],[["default"],[{"statements":[[18,3,null]],"parameters":[]}]]],[13],[2,"\\n"]],"parameters":[]}]]],[2," "],[10,"thead"],[12],[2,"\\n "],[10,"tr"],[12],[2,"\\n "],[8,"yield-slot",[],[["@name"],["header"]],[["default"],[{"statements":[[18,3,null]],"parameters":[]}]]],[2,"\\n"],[6,[37,4],[[35,3]],null,[["default"],[{"statements":[[2," "],[10,"th"],[14,0,"actions"],[12],[2,"Actions"],[13],[2,"\\n"]],"parameters":[]}]]],[2," "],[13],[2,"\\n "],[13],[2,"\\n "],[8,"ember-native-scrollable",[],[["@tagName","@content-size","@scroll-left","@scroll-top","@scrollChange","@clientSizeChange"],["tbody",[34,10],[34,11],[34,12],[30,[36,1],[[32,0],"scrollChange"],null],[30,[36,1],[[32,0],"clientSizeChange"],null]]],[["default"],[{"statements":[[2,"\\n "],[10,"tr"],[12],[13],[6,[37,15],[[30,[36,14],[[30,[36,14],[[35,13]],null]],null]],null,[["default"],[{"statements":[[10,"tr"],[22,5,[32,1,["style"]]],[15,"onclick",[30,[36,1],[[32,0],"click"],null]],[12],[2,"\\n "],[8,"yield-slot",[],[["@name"],["row"]],[["default"],[{"statements":[[18,3,[[32,1,["item"]],[32,2]]]],"parameters":[]}]]],[2,"\\n"],[6,[37,4],[[35,3]],null,[["default"],[{"statements":[[2," "],[10,"td"],[14,0,"actions"],[12],[2,"\\n "],[8,"yield-slot",[],[["@name","@params"],["actions",[30,[36,2],[[32,1,["index"]],[30,[36,1],[[32,0],"change"],null],[35,0]],null]]],[["default"],[{"statements":[[2,"\\n "],[18,3,[[32,1,["item"]],[32,2]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[13],[2,"\\n"]],"parameters":[]}]]],[2," "],[13]],"parameters":[1,2]}]]]],"parameters":[]}]]],[2,"\\n"],[13]],"hasEval":false,"upvars":["checked","action","block-params","hasActions","if","guid","style","concat","on-window","hasCaption","_contentSize","_scrollLeft","_scrollTop","_cells","-track-array","each"]}',meta:{moduleName:"consul-ui/components/tabular-collection/index.hbs"}}),s=r.default.prototype.formatItemStyle -var i=Ember._setComponentTemplate(l,t.default.extend(a.default,{tagName:"",dom:Ember.inject.service("dom"),width:1150,rowHeight:50,maxHeight:500,checked:null,hasCaption:!1,init:function(){this._super(...arguments),this.guid=this.dom.guid(this) -const e=this -this["cell-layout"]=new r.default(Ember.get(this,"width"),Ember.get(this,"rowHeight")),this["cell-layout"].formatItemStyle=function(t){let n=s.apply(this,arguments) -return e.checked===t&&(n+=";z-index: 1"),n}},didInsertElement:function(){this._super(...arguments),this.$element=this.dom.element("#"+this.guid),this.actions.resize.apply(this,[{target:this.dom.viewport()}])},style:Ember.computed("rowHeight","_items","maxRows","maxHeight",(function(){const e=Ember.get(this,"rows") -let t=Ember.get(this,"maxHeight") -if(e){let n=Math.max(3,Ember.get(this._items||[],"length")) -n=Math.min(e,n),t=Ember.get(this,"rowHeight")*n+29}return{height:t}})),willRender:function(){this._super(...arguments),Ember.set(this,"hasCaption",this._isRegistered("caption")),Ember.set(this,"hasActions",this._isRegistered("actions"))},_needsRevalidate:function(){this.isDestroyed||this.isDestroying||(this._isGlimmer2()?this.rerender():(0,n.default)(this))},actions:{resize:function(e){const t=this.$element,n=this.dom.element(".app-view") -if(n){const a=1,l=t.getBoundingClientRect(),i=this.dom.element('footer[role="contentinfo"]'),o=l.top+i.clientHeight+a,u=e.target.innerHeight-o -this.set("maxHeight",Math.max(0,u)),this["cell-layout"]=new r.default(n.clientWidth,Ember.get(this,"rowHeight")) -const c=this -this["cell-layout"].formatItemStyle=function(e){let t=s.apply(this,arguments) -return c.checked===e&&(t+=";z-index: 1"),t},this.updateItems(),this.updateScrollPosition()}},click:function(e){return this.dom.clickFirstAnchor(e)},change:function(e,t={}){if(this.$tr&&(this.$tr.style.zIndex=null),t.target&&t.target.checked&&e!==Ember.get(this,"checked")){Ember.set(this,"checked",parseInt(e)) -const n=t.target,r=this.dom.closest("tr",n),a=this.dom.sibling(n,"div") -a.getBoundingClientRect().top+a.clientHeight>this.dom.element('footer[role="contentinfo"]').getBoundingClientRect().top?a.classList.add("above"):a.classList.remove("above"),r.style.zIndex=1,this.$tr=r}else Ember.set(this,"checked",null)}}})) -e.default=i})),define("consul-ui/components/tabular-details/index",["exports","block-slots"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const n=Ember.HTMLBars.template({id:"1/kFWI3B",block:'{"symbols":["inputId","item","index","&default"],"statements":[[18,4,null],[2,"\\n"],[10,"table"],[14,0,"with-details has-actions"],[12],[2,"\\n "],[10,"thead"],[12],[2,"\\n "],[10,"tr"],[12],[2,"\\n "],[8,"yield-slot",[],[["@name"],["header"]],[["default"],[{"statements":[[18,4,null]],"parameters":[]}]]],[2,"\\n "],[10,"th"],[14,0,"actions"],[12],[2,"Actions"],[13],[2,"\\n "],[13],[2,"\\n "],[13],[2,"\\n "],[10,"tbody"],[12],[2,"\\n"],[6,[37,9],[[30,[36,1],["tabular-details-",[35,4],"-toggle-",[35,8],"_"],null]],null,[["default"],[{"statements":[[6,[37,7],[[30,[36,6],[[30,[36,6],[[35,5]],null]],null]],null,[["default"],[{"statements":[[2," "],[10,"tr"],[15,"onclick",[30,[36,0],[[32,0],"click"],null]],[12],[2,"\\n "],[8,"yield-slot",[],[["@name"],["row"]],[["default"],[{"statements":[[18,4,[[32,2],[32,3]]]],"parameters":[]}]]],[2,"\\n "],[10,"td"],[14,0,"actions"],[12],[2,"\\n "],[10,"label"],[15,"for",[30,[36,1],[[32,1],[32,3]],null]],[12],[10,"span"],[12],[2,"Show details"],[13],[13],[2,"\\n "],[13],[2,"\\n "],[13],[2,"\\n "],[10,"tr"],[12],[2,"\\n "],[10,"td"],[14,"colspan","3"],[12],[2,"\\n "],[10,"input"],[15,"checked",[30,[36,3],[[30,[36,2],[[32,2,["closed"]]],null]],null]],[15,2,[32,3]],[15,3,[34,4]],[15,1,[30,[36,1],[[32,1],[32,3]],null]],[15,"onchange",[30,[36,0],[[32,0],"change",[32,2],[35,5]],null]],[14,4,"checkbox"],[12],[13],[2,"\\n "],[10,"div"],[12],[2,"\\n "],[10,"label"],[15,"for",[30,[36,1],[[32,1],[32,3]],null]],[12],[10,"span"],[12],[2,"Hide details"],[13],[13],[2,"\\n "],[10,"div"],[12],[2,"\\n "],[8,"yield-slot",[],[["@name"],["details"]],[["default"],[{"statements":[[2,"\\n "],[18,4,[[32,2],[32,3]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[13],[2,"\\n "],[13],[2,"\\n "],[13],[2,"\\n "],[13],[2,"\\n"]],"parameters":[2,3]}]]]],"parameters":[1]}]]],[2," "],[13],[2,"\\n"],[13],[2,"\\n"]],"hasEval":false,"upvars":["action","concat","is-empty","not","name","items","-track-array","each","guid","let"]}',meta:{moduleName:"consul-ui/components/tabular-details/index.hbs"}}) -var r=Ember._setComponentTemplate(n,Ember.Component.extend(t.default,{dom:Ember.inject.service("dom"),onchange:function(){},init:function(){this._super(...arguments),this.guid=this.dom.guid(this)},actions:{click:function(e){this.dom.clickFirstAnchor(e)},change:function(e,t,n){this.onchange(n,e,t)}}})) -e.default=r})),define("consul-ui/components/tag-list/index",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const t=Ember.HTMLBars.template({id:"m+vNqE0Z",block:'{"symbols":["tags","item","&attrs","@item","&default","@namedBlocksInfo","@tags"],"statements":[[6,[37,11],[[30,[36,10],[[30,[36,9],[[32,4,["Tags"]],[30,[36,1],null,null]],null],[30,[36,9],[[32,7],[30,[36,1],null,null]],null]],null]],null,[["default"],[{"statements":[[6,[37,7],[[30,[36,8],[[32,1,["length"]],0],null]],null,[["default"],[{"statements":[[6,[37,7],[[30,[36,6],[[32,6],"default",[27,[32,5]]],null]],null,[["default","else"],[{"statements":[[2," "],[18,5,[[30,[36,5],["tag-list"],[["item"],[[32,4]]]]]],[2,"\\n"]],"parameters":[]},{"statements":[[11,"dl"],[24,0,"tag-list"],[17,3],[12],[2,"\\n "],[11,"dt"],[4,[38,0],null,null],[12],[2,"\\n "],[1,[30,[36,2],["components.tag-list.title"],[["default"],[[30,[36,1],["common.consul.tags"],null]]]]],[2,"\\n "],[13],[2,"\\n "],[10,"dd"],[12],[2,"\\n"],[6,[37,4],[[30,[36,3],[[30,[36,3],[[32,1]],null]],null]],null,[["default"],[{"statements":[[2," "],[10,"span"],[12],[1,[32,2]],[13],[2,"\\n"]],"parameters":[2]}]]],[2," "],[13],[2,"\\n"],[13],[2,"\\n"]],"parameters":[]}]]]],"parameters":[]}]]]],"parameters":[1]}]]]],"hasEval":false,"upvars":["tooltip","array","t","-track-array","each","component","-has-block","if","gt","or","union","let"]}',meta:{moduleName:"consul-ui/components/tag-list/index.hbs"}}) -var n=Ember._setComponentTemplate(t,Ember._templateOnlyComponent()) -e.default=n})),define("consul-ui/components/text-input/index",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const t=Ember.HTMLBars.template({id:"BI0eUwml",block:'{"symbols":["__arg0","@name","@item","@value","@placeholder","@chart","@validations","@oninput","@expanded","@label","&attrs","@help"],"statements":[[8,"form-input",[[16,0,[30,[36,7],["text-input"," type-text"],null]],[17,11]],[["@item","@placeholder","@name","@label","@help","@validations","@chart","@namedBlocksInfo"],[[32,3],[32,5],[32,2],[32,10],[32,12],[32,7],[32,6],[30,[36,8],null,[["label","input"],[0,0]]]]],[["default"],[{"statements":[[6,[37,5],[[30,[36,6],[[32,1],"label"],null]],null,[["default","else"],[{"statements":[[2,"\\n"],[2," "],[1,[30,[36,1],[[32,10],[32,2]],null]],[2,"\\n "]],"parameters":[]},{"statements":[[6,[37,5],[[30,[36,6],[[32,1],"input"],null]],null,[["default"],[{"statements":[[2,"\\n"],[6,[37,5],[[32,9]],null,[["default","else"],[{"statements":[[2," "],[11,"textarea"],[16,3,[32,2]],[4,[38,2],[[32,3]],[["validations","chart"],[[32,7],[32,6]]]],[4,[38,4],["input",[30,[36,3],[[32,8]],null]],null],[12],[1,[30,[36,1],[[32,4],[30,[36,0],[[32,3],[32,2]],null]],null]],[13],[2,"\\n"]],"parameters":[]},{"statements":[[2," "],[11,"input"],[16,2,[30,[36,1],[[32,4],[30,[36,0],[[32,3],[32,2]],null]],null]],[16,3,[32,2]],[16,"placeholder",[30,[36,1],[[32,5]],null]],[24,4,"text"],[4,[38,2],[[32,3]],[["validations","chart"],[[32,7],[32,6]]]],[4,[38,4],["input",[30,[36,3],[[32,8]],null]],null],[12],[13],[2,"\\n"]],"parameters":[]}]]],[2," "]],"parameters":[]}]]]],"parameters":[]}]]]],"parameters":[1]}]]],[2,"\\n"]],"hasEval":false,"upvars":["get","or","validate","optional","on","if","-is-named-block-invocation","concat","hash"]}',meta:{moduleName:"consul-ui/components/text-input/index.hbs"}}) -var n=Ember._setComponentTemplate(t,Ember._templateOnlyComponent()) -e.default=n})),define("consul-ui/components/toggle-button/index",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const t=Ember.HTMLBars.template({id:"R/cqpwNW",block:'{"symbols":["&attrs","&default"],"statements":[[11,"input"],[17,1],[16,"checked",[30,[36,1],[[35,0],"checked",[29]],null]],[16,1,[30,[36,3],["toggle-button-",[35,2]],null]],[16,"onchange",[30,[36,4],[[32,0],"change"],null]],[24,4,"checkbox"],[4,[38,6],[[30,[36,5],[[32,0],"input"],null]],null],[12],[13],[2,"\\n"],[11,"label"],[16,"for",[30,[36,3],["toggle-button-",[35,2]],null]],[4,[38,6],[[30,[36,5],[[32,0],"label"],null]],null],[12],[2,"\\n "],[18,2,[[30,[36,7],null,[["click"],[[30,[36,4],[[32,0],"click"],null]]]]]],[2,"\\n"],[13]],"hasEval":false,"upvars":["checked","if","guid","concat","action","set","did-insert","hash"]}',meta:{moduleName:"consul-ui/components/toggle-button/index.hbs"}}) -var n=Ember._setComponentTemplate(t,Ember.Component.extend({dom:Ember.inject.service("dom"),tagName:"",checked:!1,onchange:function(){},onblur:function(){},init:function(){this._super(...arguments),this.guid=this.dom.guid(this),this._listeners=this.dom.listeners()},willDestroyElement:function(){this._super(...arguments),this._listeners.remove()},didReceiveAttrs:function(){this._super(...arguments),this.checked?this.addClickOutsideListener():this._listeners.remove()},addClickOutsideListener:function(){this._listeners.remove(),this._listeners.add(this.dom.document(),"click",e=>{this.dom.isOutside(this.label,e.target)&&this.dom.isOutside(this.label.nextElementSibling,e.target)&&(this.input.checked&&(this.input.checked=!1,this.onchange({target:this.input})),this._listeners.remove())})},actions:{click:function(e){-1===(e.target.rel||"").indexOf("noopener")&&e.preventDefault(),this.input.checked=!this.input.checked,0!==e.detail&&e.target.blur(),this.actions.change.apply(this,[e])},change:function(){this.input.checked&&this.addClickOutsideListener(),this.onchange({target:this.input})}}})) -e.default=n})),define("consul-ui/components/token-list/index",["exports","block-slots"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const n=Ember.HTMLBars.template({id:"Nxw8uhmR",block:'{"symbols":["item","index","&default"],"statements":[[18,3,null],[2,"\\n"],[6,[37,3],[[30,[36,8],[[35,1,["length"]],0],null]],null,[["default"],[{"statements":[[2," "],[8,"tabular-collection",[[24,0,"token-list"]],[["@rows","@items"],[5,[30,[36,2],["AccessorID:asc",[35,1]],null]]],[["default"],[{"statements":[[2,"\\n"],[6,[37,3],[[35,0]],null,[["default"],[{"statements":[[2," "],[8,"block-slot",[],[["@name"],["caption"]],[["default"],[{"statements":[[1,[34,0]]],"parameters":[]}]]],[2,"\\n"]],"parameters":[]}]]],[2," "],[8,"block-slot",[],[["@name"],["header"]],[["default"],[{"statements":[[2,"\\n "],[10,"th"],[12],[2,"AccessorID"],[13],[2,"\\n "],[10,"th"],[12],[2,"Scope"],[13],[2,"\\n "],[10,"th"],[12],[2,"Description"],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["row"]],[["default"],[{"statements":[[2,"\\n "],[10,"td"],[12],[2,"\\n "],[10,"a"],[15,6,[30,[36,4],["dc.acls.tokens.edit",[32,1,["AccessorID"]]],null]],[15,"target",[30,[36,6],[[35,5],""],null]],[12],[1,[30,[36,7],[[32,1,["AccessorID"]],8,false],null]],[13],[2,"\\n "],[13],[2,"\\n "],[10,"td"],[12],[2,"\\n "],[1,[30,[36,3],[[32,1,["Local"]],"local","global"],null]],[2,"\\n "],[13],[2,"\\n "],[10,"td"],[12],[2,"\\n "],[10,"p"],[12],[1,[32,1,["Description"]]],[13],[2,"\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[1,2]}]]],[2,"\\n"]],"parameters":[]}]]]],"hasEval":false,"upvars":["caption","items","sort-by","if","href-to","target","or","truncate","gt"]}',meta:{moduleName:"consul-ui/components/token-list/index.hbs"}}) -var r=Ember._setComponentTemplate(n,Ember.Component.extend(t.default,{tagName:""})) -e.default=r})),define("consul-ui/components/token-source/chart.xstate",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -e.default={id:"token-source",initial:"idle",on:{RESTART:[{target:"secret",cond:"isSecret"},{target:"provider"}]},states:{idle:{},secret:{},provider:{on:{SUCCESS:"jwt"}},jwt:{on:{SUCCESS:"token"}},token:{}}}})),define("consul-ui/components/token-source/index",["exports","@glimmer/component","consul-ui/components/token-source/chart.xstate"],(function(e,t,n){var r,a,l,s,i,o,u -function c(e,t){var n=Object.keys(e) -if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e) -t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function d(e,t,n,r){n&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(r):void 0})}function m(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function p(e,t,n,r,a){var l={} -return Object.keys(r).forEach((function(e){l[e]=r[e]})),l.enumerable=!!l.enumerable,l.configurable=!!l.configurable,("value"in l||l.initializer)&&(l.writable=!0),l=n.slice().reverse().reduce((function(n,r){return r(e,t,n)||n}),l),a&&void 0!==l.initializer&&(l.value=l.initializer?l.initializer.call(a):void 0,l.initializer=void 0),void 0===l.initializer&&(Object.defineProperty(e,t,l),l=null),l}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const f=Ember.HTMLBars.template({id:"mPga2rq/",block:'{"symbols":["State","Guard","Action","dispatch","state","path","@value","@onerror","@type","@dc","@nspace","@partition"],"statements":[[8,"state-chart",[],[["@src","@initial"],[[32,0,["chart"]],[30,[36,8],[[30,[36,7],[[32,9],"oidc"],null],"provider","secret"],null]]],[["default"],[{"statements":[[2,"\\n "],[8,[32,2],[],[["@name","@cond"],["isSecret",[32,0,["isSecret"]]]],null],[2,"\\n"],[6,[37,9],[[30,[36,2],["/${partition}/${nspace}/${dc}",[30,[36,0],null,[["partition","nspace","dc"],[[30,[36,6],[[32,7,["Partition"]],[32,12]],null],[30,[36,6],[[32,7,["Namespace"]],[32,11]],null],[32,10]]]]],null]],null,[["default"],[{"statements":[[2," "],[8,[32,1],[],[["@matches"],["secret"]],[["default"],[{"statements":[[2,"\\n "],[8,"data-source",[],[["@src","@onchange","@onerror"],[[30,[36,2],[[30,[36,1],[[32,6],"/token/self/${value}"],null],[30,[36,0],null,[["value"],[[32,7]]]]],null],[32,0,["change"]],[32,8]]],null],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,[32,1],[],[["@matches"],["provider"]],[["default"],[{"statements":[[2,"\\n "],[8,"data-source",[],[["@src","@onchange","@onerror"],[[30,[36,2],[[30,[36,1],[[32,6],"/oidc/provider/${value}"],null],[30,[36,0],null,[["value"],[[32,7,["Name"]]]]]],null],[30,[36,5],[[30,[36,3],[[32,0],[30,[36,4],[[32,0,["provider"]]],null]],[["value"],["data"]]],[30,[36,3],[[32,0],[32,4],"SUCCESS"],null]],null],[32,8]]],null],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,[32,1],[],[["@matches"],["jwt"]],[["default"],[{"statements":[[2,"\\n "],[8,"jwt-source",[],[["@src","@onchange","@onerror"],[[32,0,["provider","AuthURL"]],[30,[36,5],[[30,[36,3],[[32,0],[30,[36,4],[[32,0,["jwt"]]],null]],[["value"],["data"]]],[30,[36,3],[[32,0],[32,4],"SUCCESS"],null]],null],[32,8]]],null],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,[32,1],[],[["@matches"],["token"]],[["default"],[{"statements":[[2,"\\n "],[8,"data-source",[],[["@src","@onchange","@onerror"],[[30,[36,2],[[30,[36,1],[[32,6],"/oidc/authorize/${provider}/${code}/${state}"],null],[30,[36,0],null,[["provider","code","state"],[[32,0,["provider","Name"]],[32,0,["jwt","authorizationCode"]],[30,[36,6],[[32,0,["jwt","authorizationState"]],""],null]]]]],null],[32,0,["change"]],[32,8]]],null],[2,"\\n "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[6]}]]]],"parameters":[1,2,3,4,5]}]]]],"hasEval":false,"upvars":["hash","concat","uri","action","mut","queue","or","eq","if","let"]}',meta:{moduleName:"consul-ui/components/token-source/index.hbs"}}) -let b=(r=Ember._tracked,a=Ember._tracked,l=Ember._action,s=Ember._action,i=class extends t.default{constructor(){super(...arguments),d(this,"provider",o,this),d(this,"jwt",u,this),this.chart=n.default}isSecret(){return"secret"===this.args.type}change(e){e.data.toJSON=function(){return function(e){for(var t=1;t{const n=parseFloat(t.getTotalLength()),r=t.getPointAtLength(Math.ceil(n/3)) -return{id:t.id,x:Math.round(r.x-e.x),y:Math.round(r.y-e.y)}})}},s=u(l.prototype,"iconPositions",[n],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),i=u(l.prototype,"dom",[r],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),u(l.prototype,"getIconPositions",[a],Object.getOwnPropertyDescriptor(l.prototype,"getIconPositions"),l.prototype),l) -e.default=d,Ember._setComponentTemplate(c,d)})),define("consul-ui/components/topology-metrics/index",["exports","@glimmer/component"],(function(e,t){var n,r,a,l,s,i,o,u,c,d,m,p,f,b,h,v,y -function g(e,t,n,r){n&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(r):void 0})}function O(e,t,n,r,a){var l={} -return Object.keys(r).forEach((function(e){l[e]=r[e]})),l.enumerable=!!l.enumerable,l.configurable=!!l.configurable,("value"in l||l.initializer)&&(l.writable=!0),l=n.slice().reverse().reduce((function(n,r){return r(e,t,n)||n}),l),a&&void 0!==l.initializer&&(l.value=l.initializer?l.initializer.call(a):void 0,l.initializer=void 0),void 0===l.initializer&&(Object.defineProperty(e,t,l),l=null),l}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const _=Ember.HTMLBars.template({id:"FlkBlhGg",block:'{"symbols":["upstreams","dc","item","item","@service","@dc","@hasMetricsProvider","@metricsHref","@topology","@nspace","@oncreate"],"statements":[[11,"div"],[24,0,"topology-container consul-topology-metrics"],[4,[38,13],[[32,0,["calculate"]]],null],[12],[2,"\\n"],[6,[37,3],[[30,[36,14],[[32,0,["downstreams","length"]],0],null]],null,[["default"],[{"statements":[[2," "],[11,"div"],[24,1,"downstream-container"],[4,[38,4],[[32,0,["setHeight"]],"downstream-lines"],null],[4,[38,5],[[32,0,["setHeight"]],"downstream-lines",[32,0,["downstreams"]]],null],[12],[2,"\\n"],[6,[37,3],[[30,[36,12],[[32,0,["emptyColumn"]]],null]],null,[["default"],[{"statements":[[2," "],[10,"div"],[12],[2,"\\n "],[10,"p"],[12],[1,[32,6,["Name"]]],[13],[2,"\\n "],[10,"span"],[12],[2,"\\n "],[8,"tooltip",[],[[],[]],[["default"],[{"statements":[[2,"\\n Only showing downstreams within the current datacenter for "],[1,[32,5,["Service","Service"]]],[2,".\\n "]],"parameters":[]}]]],[2,"\\n "],[13],[2,"\\n "],[13],[2,"\\n"]],"parameters":[]}]]],[6,[37,7],[[30,[36,6],[[30,[36,6],[[32,0,["downstreams"]]],null]],null]],null,[["default"],[{"statements":[[2," "],[8,"topology-metrics/card",[],[["@nspace","@dc","@service","@item","@hasMetricsProvider","@noMetricsReason"],[[32,10],[32,6,["Name"]],[32,5,["Service"]],[32,4],[32,7],[32,0,["noMetricsReason"]]]],[["default"],[{"statements":[[2,"\\n"],[6,[37,3],[[30,[36,2],[[32,7],[32,0,["mainNotIngressService"]],[30,[36,1],[[32,4,["Kind"]],"ingress-gateway"],null]],null]],null,[["default"],[{"statements":[[2," "],[8,"topology-metrics/stats",[],[["@nspace","@partition","@dc","@endpoint","@service","@item","@noMetricsReason"],[[30,[36,0],[[32,4,["Namespace"]],"default"],null],[30,[36,0],[[32,4,["Partition"]],"default"],null],[32,4,["Datacenter"]],"downstream-summary-for-service",[32,5,["Service","Service"]],[32,4,["Name"]],[32,0,["noMetricsReason"]]]],null],[2,"\\n"]],"parameters":[]}]]],[2," "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[4]}]]],[2," "],[13],[2,"\\n"]],"parameters":[]}]]],[2," "],[10,"div"],[14,1,"metrics-container"],[12],[2,"\\n "],[10,"div"],[14,0,"metrics-header"],[12],[2,"\\n "],[1,[32,5,["Service","Service"]]],[2,"\\n "],[13],[2,"\\n"],[6,[37,3],[[30,[36,1],[[32,5,["Service","Meta","external-source"]],"consul-api-gateway"],null]],null,[["default"],[{"statements":[[6,[37,3],[[32,7]],null,[["default"],[{"statements":[[2," "],[8,"topology-metrics/series",[],[["@nspace","@partition","@dc","@service","@protocol","@noMetricsReason"],[[30,[36,0],[[32,5,["Service","Namespace"]],"default"],null],[30,[36,0],[[35,11,["Service","Partition"]],"default"],null],[32,6,["Name"]],[32,5,["Service","Service"]],[32,9,["Protocol"]],[32,0,["noMetricsReason"]]]],null],[2,"\\n"],[6,[37,3],[[32,0,["mainNotIngressService"]]],null,[["default"],[{"statements":[[2," "],[8,"topology-metrics/stats",[],[["@nspace","@partition","@dc","@endpoint","@service","@protocol","@noMetricsReason"],[[30,[36,0],[[32,5,["Service","Namespace"]],"default"],null],[30,[36,0],[[35,11,["Service","Partition"]],"default"],null],[32,6,["Name"]],"summary-for-service",[32,5,["Service","Service"]],[32,9,["Protocol"]],[32,0,["noMetricsReason"]]]],null],[2,"\\n"]],"parameters":[]}]]]],"parameters":[]}]]],[2," "],[10,"div"],[14,0,"link"],[12],[2,"\\n"],[6,[37,3],[[32,8]],null,[["default","else"],[{"statements":[[2," "],[10,"a"],[14,0,"metrics-link"],[15,6,[32,8]],[14,"target","_blank"],[14,"rel","noopener noreferrer"],[12],[2,"Open dashboard"],[13],[2,"\\n"]],"parameters":[]},{"statements":[[2," "],[10,"a"],[14,0,"config-link"],[15,6,[31,[[30,[36,10],["CONSUL_DOCS_URL"],null],"/connect/observability/ui-visualization"]]],[14,"target","_blank"],[14,"rel","noopener noreferrer"],[12],[2,"Configure dashboard"],[13],[2,"\\n"]],"parameters":[]}]]],[2," "],[13],[2,"\\n"]],"parameters":[]}]]],[2," "],[13],[2,"\\n "],[10,"div"],[14,1,"downstream-lines"],[12],[2,"\\n "],[8,"topology-metrics/down-lines",[],[["@type","@service","@view","@center","@lines","@items","@oncreate"],["downstream",[32,5],[32,0,["downView"]],[32,0,["centerDimensions"]],[32,0,["downLines"]],[32,0,["downstreams"]],[30,[36,15],[[32,0],[32,11]],null]]],null],[2,"\\n "],[13],[2,"\\n"],[6,[37,3],[[30,[36,14],[[32,0,["upstreams","length"]],0],null]],null,[["default"],[{"statements":[[2," "],[10,"div"],[14,1,"upstream-column"],[12],[2,"\\n"],[6,[37,7],[[30,[36,9],[[30,[36,8],["Datacenter",[32,0,["upstreams"]]],null]],null]],null,[["default"],[{"statements":[[2," "],[11,"div"],[24,1,"upstream-container"],[4,[38,4],[[32,0,["setHeight"]],"upstream-lines"],null],[4,[38,5],[[32,0,["setHeight"]],"upstream-lines",[32,0,["upstreams"]]],null],[12],[2,"\\n"],[6,[37,3],[[32,2]],null,[["default"],[{"statements":[[2," "],[10,"p"],[12],[1,[32,2]],[13],[2,"\\n"]],"parameters":[]}]]],[6,[37,7],[[30,[36,6],[[30,[36,6],[[32,1]],null]],null]],null,[["default"],[{"statements":[[2," "],[8,"topology-metrics/card",[],[["@dc","@item","@service"],[[32,6,["Name"]],[32,3],[32,5,["Service"]]]],[["default"],[{"statements":[[2,"\\n"],[6,[37,3],[[30,[36,2],[[32,7],[32,0,["mainNotIngressService"]],[30,[36,1],[[32,3,["Kind"]],"ingress-gateway"],null]],null]],null,[["default"],[{"statements":[[2," "],[8,"topology-metrics/stats",[],[["@nspace","@partition","@dc","@endpoint","@service","@item","@noMetricsReason"],[[30,[36,0],[[32,3,["Namespace"]],"default"],null],[30,[36,0],[[32,3,["Partition"]],"default"],null],[32,3,["Datacenter"]],"upstream-summary-for-service",[32,5,["Service","Service"]],[32,3,["Name"]],[32,0,["noMetricsReason"]]]],null],[2,"\\n"]],"parameters":[]}]]],[2," "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[3]}]]],[2," "],[13],[2,"\\n"]],"parameters":[1,2]}]]],[2," "],[13],[2,"\\n"]],"parameters":[]}]]],[2," "],[10,"div"],[14,1,"upstream-lines"],[12],[2,"\\n "],[8,"topology-metrics/up-lines",[],[["@type","@service","@view","@center","@lines","@items","@oncreate"],["upstream",[32,5],[32,0,["upView"]],[32,0,["centerDimensions"]],[32,0,["upLines"]],[32,0,["upstreams"]],[30,[36,15],[[32,0],[32,11]],null]]],null],[2,"\\n "],[13],[2,"\\n"],[13],[2,"\\n"]],"hasEval":false,"upvars":["or","not-eq","and","if","did-insert","did-update","-track-array","each","group-by","-each-in","env","service","not","on-resize","gt","action"]}',meta:{moduleName:"consul-ui/components/topology-metrics/index.hbs"}}) -let P=(n=Ember.inject.service("env"),r=Ember._tracked,a=Ember._tracked,l=Ember._tracked,s=Ember._tracked,i=Ember._tracked,o=Ember._tracked,u=Ember._action,c=Ember._action,d=class extends t.default{constructor(...e){super(...e),g(this,"env",m,this),g(this,"centerDimensions",p,this),g(this,"downView",f,this),g(this,"downLines",b,this),g(this,"upView",h,this),g(this,"upLines",v,this),g(this,"noMetricsReason",y,this)}drawDownLines(e){const t=["allow","deny"],n={x:this.centerDimensions.x-7,y:this.centerDimensions.y+this.centerDimensions.height/2} -return e.map(e=>{const t=e.getBoundingClientRect(),r={x:t.x+t.width,y:t.y+t.height/2} -return{id:e.id,permission:e.getAttribute("data-permission"),dest:n,src:r}}).sort((e,n)=>t.indexOf(e.permission)-t.indexOf(n.permission))}drawUpLines(e){const t=["allow","deny"],n={x:this.centerDimensions.x+5.5,y:this.centerDimensions.y+this.centerDimensions.height/2} -return e.map(e=>{const t=e.getBoundingClientRect(),r={x:t.x-t.width-25,y:t.y+t.height/2} -return{id:e.id,permission:e.getAttribute("data-permission"),dest:r,src:n}}).sort((e,n)=>t.indexOf(e.permission)-t.indexOf(n.permission))}emptyColumn(){const e=Ember.get(this.args.topology,"noDependencies") -return!this.env.var("CONSUL_ACLS_ENABLED")||e}get downstreams(){const e=Ember.get(this.args.topology,"Downstreams")||[],t=[...e],n=Ember.get(this.args.topology,"noDependencies") -return!this.env.var("CONSUL_ACLS_ENABLED")&&n?t.push({Name:"Downstreams unknown.",Empty:!0,Datacenter:"",Namespace:""}):0===e.length&&t.push({Name:"No downstreams.",Datacenter:"",Namespace:""}),t}get upstreams(){const e=Ember.get(this.args.topology,"Upstreams")||[],t=[...e],n=Ember.get(this.args.dc,"DefaultACLPolicy"),r=Ember.get(this.args.topology,"wildcardIntention"),a=Ember.get(this.args.topology,"noDependencies") -return!this.env.var("CONSUL_ACLS_ENABLED")&&a?t.push({Name:"Upstreams unknown.",Datacenter:"",Namespace:""}):"allow"===n||r?t.push({Name:"* (All Services)",Datacenter:"",Namespace:""}):0===e.length&&t.push({Name:"No upstreams.",Datacenter:"",Namespace:""}),t}get mainNotIngressService(){return"ingress-gateway"!==(Ember.get(this.args.service.Service,"Kind")||"")}setHeight(e,t){if(e){const n=e.getBoundingClientRect() -document.getElementById(""+t[0]).setAttribute("style",`height:${n.height}px`)}this.calculate()}calculate(){this.args.isRemoteDC?this.noMetricsReason="remote-dc":"ingress-gateway"===this.args.service.Service.Kind?this.noMetricsReason="ingress-gateway":this.noMetricsReason=null -const e=document.getElementById("downstream-lines").getBoundingClientRect(),t=document.getElementById("upstream-lines").getBoundingClientRect(),n=document.getElementById("upstream-column") -this.emptyColumn?this.downView={x:e.x,y:e.y,width:e.width,height:e.height+10}:this.downView=e,n&&(this.upView={x:t.x,y:t.y,width:t.width,height:n.getBoundingClientRect().height+10}) -const r=[...document.querySelectorAll("#downstream-container .topology-metrics-card")],a=document.querySelector(".metrics-header"),l=[...document.querySelectorAll("#upstream-column .topology-metrics-card")] -this.centerDimensions=a.getBoundingClientRect(),this.downLines=this.drawDownLines(r),this.upLines=this.drawUpLines(l)}},m=O(d.prototype,"env",[n],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),p=O(d.prototype,"centerDimensions",[r],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),f=O(d.prototype,"downView",[a],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),b=O(d.prototype,"downLines",[l],{configurable:!0,enumerable:!0,writable:!0,initializer:function(){return[]}}),h=O(d.prototype,"upView",[s],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),v=O(d.prototype,"upLines",[i],{configurable:!0,enumerable:!0,writable:!0,initializer:function(){return[]}}),y=O(d.prototype,"noMetricsReason",[o],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),O(d.prototype,"setHeight",[u],Object.getOwnPropertyDescriptor(d.prototype,"setHeight"),d.prototype),O(d.prototype,"calculate",[c],Object.getOwnPropertyDescriptor(d.prototype,"calculate"),d.prototype),d) -e.default=P,Ember._setComponentTemplate(_,P)})) -define("consul-ui/components/topology-metrics/notifications/index",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const t=Ember.HTMLBars.template({id:"ZVlQpsZp",block:'{"symbols":["error","@status","@type","@error"],"statements":[[6,[37,1],[[30,[36,2],[[32,3],"create"],null]],null,[["default","else"],[{"statements":[[6,[37,1],[[30,[36,2],[[32,2],"success"],null]],null,[["default","else"],[{"statements":[[2," Your intention has been added.\\n"]],"parameters":[]},{"statements":[[2," There was an error adding your intention.\\n"]],"parameters":[]}]]]],"parameters":[]},{"statements":[[6,[37,1],[[30,[36,2],[[32,3],"update"],null]],null,[["default"],[{"statements":[[6,[37,1],[[30,[36,2],[[32,2],"success"],null]],null,[["default","else"],[{"statements":[[2," Your intention has been saved.\\n"]],"parameters":[]},{"statements":[[2," There was an error saving your intention.\\n"]],"parameters":[]}]]]],"parameters":[]}]]]],"parameters":[]}]]],[6,[37,3],[[32,4,["errors","firstObject"]]],null,[["default"],[{"statements":[[6,[37,1],[[32,1,["detail"]]],null,[["default"],[{"statements":[[2," "],[10,"br"],[12],[13],[1,[30,[36,0],["(",[30,[36,1],[[32,1,["status"]],[30,[36,0],[[32,1,["status"]],": "],null]],null],[32,1,["detail"]],")"],null]],[2,"\\n"]],"parameters":[]}]]]],"parameters":[1]}]]],[2,"\\n"]],"hasEval":false,"upvars":["concat","if","eq","let"]}',meta:{moduleName:"consul-ui/components/topology-metrics/notifications/index.hbs"}}) -var n=Ember._setComponentTemplate(t,Ember._templateOnlyComponent()) -e.default=n})),define("consul-ui/components/topology-metrics/popover/index",["exports","@glimmer/component"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const n=Ember.HTMLBars.template({id:"iYw9/Q3m",block:'{"symbols":["style","label","__arg0","__arg1","Actions","__arg0","__arg1","Actions","__arg0","__arg1","Actions","@item","@service","@type","@oncreate","@disabled","&attrs","@position"],"statements":[[11,"div"],[16,0,[31,["topology-metrics-popover ",[32,14]]]],[17,17],[12],[2,"\\n"],[6,[37,7],[[30,[36,1],["top:",[32,18,["y"]],"px;left:",[32,18,["x"]],"px;"],null],[30,[36,9],[[30,[36,14],[[32,14],"deny"],null],"Add intention","View intention"],null]],null,[["default"],[{"statements":[[6,[37,9],[[30,[36,16],[[32,16]],null]],null,[["default","else"],[{"statements":[[6,[37,9],[[30,[36,14],[[32,14],"deny"],null]],null,[["default","else"],[{"statements":[[2," "],[8,"informed-action",[[24,0,"dangerous"],[4,[38,12],[[30,[36,11],[[32,0],"popover"],null]],null]],[["@namedBlocksInfo"],[[30,[36,10],null,[["header","body","actions"],[0,0,1]]]]],[["default"],[{"statements":[[6,[37,9],[[30,[36,8],[[32,9],"header"],null]],null,[["default","else"],[{"statements":[[2,"\\n "],[10,"h3"],[12],[2,"\\n "],[1,[30,[36,3],["components.consul.topology-metrics.popover.deny.header"],null]],[2,"\\n "],[13],[2,"\\n "]],"parameters":[]},{"statements":[[6,[37,9],[[30,[36,8],[[32,9],"body"],null]],null,[["default","else"],[{"statements":[[2,"\\n "],[10,"p"],[12],[2,"\\n"],[6,[37,9],[[32,12,["Intention","HasExact"]]],null,[["default","else"],[{"statements":[[2," "],[1,[30,[36,3],["components.consul.topology-metrics.popover.deny.body.isExact"],null]],[2,"\\n"]],"parameters":[]},{"statements":[[2," "],[1,[30,[36,3],["components.consul.topology-metrics.popover.deny.body.notExact"],null]],[2,"\\n"]],"parameters":[]}]]],[2," "],[13],[2,"\\n "]],"parameters":[]},{"statements":[[6,[37,9],[[30,[36,8],[[32,9],"actions"],null]],null,[["default"],[{"statements":[[6,[37,7],[[32,10]],null,[["default"],[{"statements":[[2,"\\n "],[8,[32,11,["Action"]],[[24,0,"action"]],[[],[]],[["default"],[{"statements":[[2,"\\n "],[11,"button"],[24,4,"button"],[4,[38,6],["click",[32,15]],null],[12],[2,"\\n"],[6,[37,9],[[32,12,["Intention","HasExact"]]],null,[["default","else"],[{"statements":[[2," "],[1,[30,[36,3],["components.consul.topology-metrics.popover.deny.action.isExact"],null]],[2,"\\n"]],"parameters":[]},{"statements":[[2," "],[1,[30,[36,3],["components.consul.topology-metrics.popover.deny.action.notExact"],null]],[2,"\\n"]],"parameters":[]}]]],[2," "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,[32,11,["Action"]],[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[11,"button"],[24,0,"cancel"],[24,4,"button"],[4,[38,6],["click",[30,[36,5],[[30,[36,4],[[32,0,["popoverController","hide"]]],null]],null]],null],[12],[2,"\\n Cancel\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[11]}]]]],"parameters":[]}]]]],"parameters":[]}]]]],"parameters":[]}]]]],"parameters":[9,10]}]]],[2,"\\n"]],"parameters":[]},{"statements":[[6,[37,9],[[30,[36,14],[[32,14],"not-defined"],null]],null,[["default","else"],[{"statements":[[2," "],[8,"informed-action",[[24,0,"warning documentation"],[4,[38,12],[[30,[36,11],[[32,0],"popover"],null]],null]],[["@namedBlocksInfo"],[[30,[36,10],null,[["header","body","actions"],[0,0,1]]]]],[["default"],[{"statements":[[6,[37,9],[[30,[36,8],[[32,6],"header"],null]],null,[["default","else"],[{"statements":[[2,"\\n "],[10,"h3"],[12],[2,"\\n "],[1,[30,[36,3],["components.consul.topology-metrics.popover.not-defined.header"],null]],[2,"\\n "],[13],[2,"\\n "]],"parameters":[]},{"statements":[[6,[37,9],[[30,[36,8],[[32,6],"body"],null]],null,[["default","else"],[{"statements":[[2,"\\n "],[10,"p"],[12],[2,"\\n "],[1,[30,[36,3],["components.consul.topology-metrics.popover.not-defined.body"],[["downstream","upstream"],[[32,12,["Name"]],[32,13,["Name"]]]]]],[2,"\\n "],[13],[2,"\\n "]],"parameters":[]},{"statements":[[6,[37,9],[[30,[36,8],[[32,6],"actions"],null]],null,[["default"],[{"statements":[[6,[37,7],[[32,7]],null,[["default"],[{"statements":[[2,"\\n "],[8,[32,8,["Action"]],[[24,0,"action"]],[[],[]],[["default"],[{"statements":[[2,"\\n "],[10,"a"],[15,6,[31,[[30,[36,13],["CONSUL_DOCS_URL"],null],"/connect/registration/service-registration#upstreams"]]],[14,"rel","noopener noreferrer"],[14,"target","_blank"],[12],[2,"\\n "],[1,[30,[36,3],["components.consul.topology-metrics.popover.not-defined.action"],null]],[2,"\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,[32,8,["Action"]],[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[11,"button"],[24,0,"cancel"],[24,4,"button"],[4,[38,6],["click",[30,[36,5],[[30,[36,4],[[32,0,["popoverController","hide"]]],null]],null]],null],[12],[2,"\\n Close\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[8]}]]]],"parameters":[]}]]]],"parameters":[]}]]]],"parameters":[]}]]]],"parameters":[6,7]}]]],[2,"\\n"]],"parameters":[]},{"statements":[[2," "],[8,"informed-action",[[24,0,"info"],[4,[38,12],[[30,[36,11],[[32,0],"popover"],null]],null]],[["@namedBlocksInfo"],[[30,[36,10],null,[["header","body","actions"],[0,0,1]]]]],[["default"],[{"statements":[[6,[37,9],[[30,[36,8],[[32,3],"header"],null]],null,[["default","else"],[{"statements":[[2,"\\n "],[10,"h3"],[12],[2,"\\n "],[1,[30,[36,3],["components.consul.topology-metrics.popover.l7.header"],null]],[2,"\\n "],[13],[2,"\\n "]],"parameters":[]},{"statements":[[6,[37,9],[[30,[36,8],[[32,3],"body"],null]],null,[["default","else"],[{"statements":[[2,"\\n "],[10,"p"],[12],[2,"\\n "],[1,[30,[36,3],["components.consul.topology-metrics.popover.l7.body"],null]],[2,"\\n "],[13],[2,"\\n "]],"parameters":[]},{"statements":[[6,[37,9],[[30,[36,8],[[32,3],"actions"],null]],null,[["default"],[{"statements":[[6,[37,7],[[32,4]],null,[["default"],[{"statements":[[2,"\\n "],[8,[32,5,["Action"]],[[24,0,"action"]],[[],[]],[["default"],[{"statements":[[2,"\\n "],[10,"a"],[15,6,[30,[36,2],["dc.services.show.intentions.edit",[30,[36,1],[[32,12,["Intention","ID"]]],null]],null]],[12],[2,"\\n "],[1,[30,[36,3],["components.consul.topology-metrics.popover.l7.action"],null]],[2,"\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,[32,5,["Action"]],[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[11,"button"],[24,0,"cancel"],[24,4,"button"],[4,[38,6],["click",[30,[36,5],[[30,[36,4],[[32,0,["popoverController","hide"]]],null]],null]],null],[12],[2,"\\n Close\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[5]}]]]],"parameters":[]}]]]],"parameters":[]}]]]],"parameters":[]}]]]],"parameters":[3,4]}]]],[2,"\\n "]],"parameters":[]}]]]],"parameters":[]}]]],[2," "],[11,"button"],[23,5,[32,1]],[16,"aria-label",[32,2]],[24,4,"button"],[4,[38,15],[[32,0,["popover"]]],[["options","returns"],[[30,[36,10],null,[["theme","placement"],["square-tail","bottom-start"]]],[30,[36,11],[[32,0],"popoverController"],null]]]],[4,[38,6],["click",[30,[36,5],[[30,[36,4],[[32,0,["popoverController","show"]]],null]],null]],null],[12],[2,"\\n "],[13],[2,"\\n"]],"parameters":[]},{"statements":[[2," "],[11,"button"],[23,5,[32,1]],[16,"aria-label",[32,2]],[24,4,"button"],[4,[38,0],[true],null],[12],[2,"\\n "],[13],[2,"\\n"]],"parameters":[]}]]]],"parameters":[1,2]}]]],[13],[2,"\\n"]],"hasEval":false,"upvars":["disabled","concat","href-to","t","optional","fn","on","let","-is-named-block-invocation","if","hash","set","did-insert","env","eq","with-overlay","not"]}',meta:{moduleName:"consul-ui/components/topology-metrics/popover/index.hbs"}}) -class r extends t.default{}e.default=r,Ember._setComponentTemplate(n,r)})),define("consul-ui/components/topology-metrics/series/index",["exports","dayjs","dayjs/plugin/calendar","d3-selection","d3-scale","d3-scale-chromatic","d3-shape","d3-array"],(function(e,t,n,r,a,l,s,i){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const o=Ember.HTMLBars.template({id:"T4gO0fLS",block:'{"symbols":["modal","desc","label","@noMetricsReason","@protocol","@service","@dc","@partition","@nspace"],"statements":[[6,[37,4],[[30,[36,9],[[32,4]],null]],null,[["default"],[{"statements":[[2," "],[8,"data-source",[],[["@src","@onchange","@onerror"],[[30,[36,6],["/${partition}/${nspace}/${dc}/metrics/summary-for-service/${service}/${protocol}",[30,[36,5],null,[["nspace","partition","dc","service","protocol"],[[32,9],[32,8],[32,7],[32,6],[32,5]]]]],null],[30,[36,7],[[32,0],"change"],null],[30,[36,7],[[32,0],[30,[36,8],[[35,0]],null]],[["value"],["error"]]]]],null],[2,"\\n"]],"parameters":[]}]]],[2,"\\n"],[1,[30,[36,10],["resize",[30,[36,7],[[32,0],"redraw"],null]],null]],[2,"\\n"],[1,[30,[36,11],[[30,[36,7],[[32,0],"redraw"],null]],null]],[2,"\\n\\n"],[6,[37,4],[[30,[36,9],[[35,12]],null]],null,[["default"],[{"statements":[[6,[37,4],[[35,3,["labels"]]],null,[["default"],[{"statements":[[2," "],[11,"a"],[24,0,"sparkline-key-link"],[4,[38,2],["click",[30,[36,1],[[32,0,["modal","open"]]],null]],null],[12],[2,"\\n Key\\n "],[13],[2,"\\n"]],"parameters":[]}]]]],"parameters":[]}]]],[2,"\\n"],[10,"div"],[14,0,"sparkline-wrapper"],[12],[2,"\\n "],[10,"div"],[14,0,"tooltip"],[12],[2,"\\n "],[10,"div"],[14,0,"sparkline-time"],[12],[2,"Timestamp"],[13],[2,"\\n "],[13],[2,"\\n"],[6,[37,4],[[35,12]],null,[["default"],[{"statements":[[2," "],[8,"topology-metrics/status",[],[["@noMetricsReason","@error"],[[32,4],[34,0]]],null],[2,"\\n"]],"parameters":[]}]]],[2," "],[10,"svg"],[14,0,"sparkline"],[12],[13],[2,"\\n"],[13],[2,"\\n\\n"],[8,"modal-dialog",[[24,0,"sparkline-key"]],[["@aria"],[[30,[36,5],null,[["label"],["Metrics Key"]]]]],[["default"],[{"statements":[[2,"\\n "],[8,"ref",[],[["@target","@name","@value"],[[32,0],"modal",[32,1]]],null],[2,"\\n "],[8,"block-slot",[],[["@name"],["header"]],[["default"],[{"statements":[[2,"\\n "],[10,"h3"],[12],[2,"Metrics Key"],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["body"]],[["default"],[{"statements":[[2,"\\n "],[10,"div"],[14,0,"sparkline-key-content"],[12],[2,"\\n "],[10,"p"],[12],[2,"This key describes the metrics corresponding to the graph tooltip labels in more detail."],[13],[2,"\\n "],[10,"dl"],[12],[2,"\\n"],[6,[37,14],[[30,[36,13],[[35,3,["labels"]]],null]],null,[["default"],[{"statements":[[2," "],[10,"dt"],[12],[1,[32,3]],[13],[2,"\\n "],[10,"dd"],[12],[1,[32,2]],[13],[2,"\\n"]],"parameters":[2,3]}]]],[2," "],[13],[2,"\\n"],[6,[37,15],[[35,3,["labels"]]],null,[["default"],[{"statements":[[2," "],[10,"span"],[14,0,"no-data"],[12],[2,"No metrics loaded."],[13],[2,"\\n"]],"parameters":[]}]]],[2," "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["actions"]],[["default"],[{"statements":[[2,"\\n "],[10,"button"],[14,0,"type-cancel"],[15,"onclick",[30,[36,7],[[32,0],[32,1,["close"]]],null]],[14,4,"button"],[12],[2,"\\n Close\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[1]}]]]],"hasEval":false,"upvars":["error","optional","on","data","if","hash","uri","action","mut","not","on-window","did-insert","empty","-each-in","each","unless"]}',meta:{moduleName:"consul-ui/components/topology-metrics/series/index.hbs"}}) -t.default.extend(n.default) -var u=Ember._setComponentTemplate(o,Ember.Component.extend({data:null,empty:!1,actions:{redraw:function(){this.drawGraphs()},change:function(e){this.set("data",e.data.series),this.drawGraphs(),this.rerender()}},drawGraphs:function(){if(!this.data)return void Ember.set(this,"empty",!0) -let e=this.svg=(0,r.select)(this.element.querySelector("svg.sparkline")) -e.on("mouseover mousemove mouseout",null),e.selectAll("path").remove(),e.selectAll("rect").remove() -let t=e.node().getBoundingClientRect(),n=t.width,o=t.height,u=this.data||{},c=u.data||[],d=u.labels||{},m=u.unitSuffix||"",p=Object.keys(d).filter(e=>"Total"!=e) -if(0==c.length||0==p.length)return void Ember.set(this,"empty",!0) -Ember.set(this,"empty",!1) -let f=(0,s.stack)().keys(p).order(s.stackOrderReverse)(c),b=c.map(e=>{let t=0 -return p.forEach(n=>{t+=e[n]}),t}),h=(0,a.scaleTime)().domain((0,i.extent)(c,e=>e.time)).range([0,n]),v=(0,a.scaleLinear)().domain([0,(0,i.max)(b)]).range([o,0]),y=(0,s.area)().x(e=>h(e.data.time)).y1(e=>v(e[0])).y0(e=>v(e[1])),g=["#DCE0E6","#C73445"].concat(l.schemeTableau10) -p.includes("Outbound")&&(g=["#DCE0E6","#0E40A3"].concat(l.schemeTableau10)) -let O=(0,a.scaleOrdinal)(g).domain(p) -e.selectAll("path").data(f).join("path").attr("fill",({key:e})=>O(e)).attr("stroke",({key:e})=>O(e)).attr("d",y) -let _=e.append("rect").attr("class","cursor").style("visibility","hidden").attr("width",1).attr("height",o).attr("x",0).attr("y",0),P=(0,r.select)(this.element.querySelector(".tooltip")) -for(var w of(P.selectAll(".sparkline-tt-legend").remove(),P.selectAll(".sparkline-tt-sum").remove(),p)){let e=P.append("div").attr("class","sparkline-tt-legend") -e.append("div").attr("class","sparkline-tt-legend-color").style("background-color",O(w)),e.append("span").text(w).append("span").attr("class","sparkline-tt-legend-value")}let E=P.selectAll(".sparkline-tt-legend-value") -p.length>1&&P.append("div").attr("class","sparkline-tt-sum").append("span").text("Total").append("span").attr("class","sparkline-tt-sum-value") -let k=this -e.on("mouseover",(function(e){P.style("visibility","visible"),_.style("visibility","visible"),k.updateTooltip(e,c,f,b,m,h,P,E,_)})).on("mousemove",(function(e){k.updateTooltip(e,c,f,b,m,h,P,E,_)})).on("mouseout",(function(){P.style("visibility","hidden"),_.style("visibility","hidden")}))},willDestroyElement:function(){this._super(...arguments),void 0!==this.svg&&this.svg.on("mouseover mousemove mouseout",null)},updateTooltip:function(e,n,a,l,s,o,u,d,m){let[p]=(0,r.pointer)(e) -m.attr("x",p) -let f=o.invert(p) -let b=(0,(0,i.bisector)((function(e){return e.time})).left)(n,f) -var h -u.style("left",p-22+"px").select(".sparkline-time").text((h=f,(0,t.default)(h).calendar(null,{sameDay:"[Today at] h:mm:ss A",lastDay:"[Yesterday at] h:mm:ss A",lastWeek:"[Last] dddd at h:mm:ss A",sameElse:"MMM DD at h:mm:ss A"}))),u.select(".sparkline-tt-sum-value").text(`${c(l[b])}${s}`),d.nodes().forEach((e,t)=>{let n=a[t][b][1]-a[t][b][0];(0,r.select)(e).text(`${c(n)}${s}`)}),m.attr("x",p)}})) -function c(e){return e<1e3?Number.isInteger(e)?""+e:Number(e>=100?e.toPrecision(3):e<1?e.toFixed(2):e.toPrecision(2)):e>=1e3&&e<1e6?+(e/1e3).toPrecision(3)+"k":e>=1e6&&e<1e9?+(e/1e6).toPrecision(3)+"m":e>=1e9&&e<1e12?+(e/1e9).toPrecision(3)+"g":e>=1e12?+(e/1e12).toFixed(0)+"t":void 0}e.default=u})),define("consul-ui/components/topology-metrics/source-type/index",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const t=Ember.HTMLBars.template({id:"g20EXkUJ",block:'{"symbols":["@source"],"statements":[[11,"span"],[24,0,"topology-metrics-source-type"],[4,[38,2],[[30,[36,1],[[30,[36,0],["components.consul.topology-metrics.source-type.",[32,1],".tooltip"],null]],null]],null],[12],[2,"\\n "],[1,[30,[36,1],[[30,[36,0],["components.consul.topology-metrics.source-type.",[32,1],".text"],null]],null]],[2,"\\n"],[13]],"hasEval":false,"upvars":["concat","t","tooltip"]}',meta:{moduleName:"consul-ui/components/topology-metrics/source-type/index.hbs"}}) -var n=Ember._setComponentTemplate(t,Ember._templateOnlyComponent()) -e.default=n})),define("consul-ui/components/topology-metrics/stats/index",["exports","@glimmer/component"],(function(e,t){var n,r,a,l,s,i -function o(e,t,n,r){n&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(r):void 0})}function u(e,t,n,r,a){var l={} -return Object.keys(r).forEach((function(e){l[e]=r[e]})),l.enumerable=!!l.enumerable,l.configurable=!!l.configurable,("value"in l||l.initializer)&&(l.writable=!0),l=n.slice().reverse().reduce((function(n,r){return r(e,t,n)||n}),l),a&&void 0!==l.initializer&&(l.value=l.initializer?l.initializer.call(a):void 0,l.initializer=void 0),void 0===l.initializer&&(Object.defineProperty(e,t,l),l=null),l}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const c=Ember.HTMLBars.template({id:"vUxWURoJ",block:'{"symbols":["stat","@noMetricsReason","@protocol","@service","@endpoint","@dc","@partition","@nspace","&attrs"],"statements":[[6,[37,11],[[30,[36,10],[[32,2]],null]],null,[["default"],[{"statements":[[2," "],[8,"data-source",[],[["@src","@onchange","@onerror"],[[30,[36,7],["/${partition}/${nspace}/${dc}/metrics/${endpoint}/${service}/${protocol}",[30,[36,1],null,[["nspace","partition","dc","endpoint","service","protocol"],[[32,8],[32,7],[32,6],[32,5],[32,4],[30,[36,6],[[32,3],""],null]]]]],null],[30,[36,8],[[32,0],"statsUpdate"],null],[30,[36,8],[[32,0],[30,[36,9],[[35,0]],null]],[["value"],["error"]]]]],null],[2,"\\n"]],"parameters":[]}]]],[2,"\\n"],[11,"div"],[17,9],[24,0,"topology-metrics-stats"],[12],[2,"\\n"],[6,[37,11],[[35,12]],null,[["default","else"],[{"statements":[[6,[37,5],[[30,[36,4],[[30,[36,4],[[35,3]],null]],null]],null,[["default","else"],[{"statements":[[2," "],[11,"dl"],[4,[38,2],[[32,1,["desc"]]],[["options"],[[30,[36,1],null,[["allowHTML"],[true]]]]]],[12],[2,"\\n "],[10,"dt"],[12],[2,"\\n "],[1,[32,1,["value"]]],[2,"\\n "],[13],[2,"\\n "],[10,"dd"],[12],[2,"\\n "],[1,[32,1,["label"]]],[2,"\\n "],[13],[2,"\\n "],[13],[2,"\\n"]],"parameters":[1]},{"statements":[[2," "],[10,"span"],[12],[2,"No Metrics Available"],[13],[2,"\\n"]],"parameters":[]}]]]],"parameters":[]},{"statements":[[2," "],[8,"topology-metrics/status",[],[["@noMetricsReason","@error"],[[32,2],[34,0]]],null],[2,"\\n"]],"parameters":[]}]]],[13]],"hasEval":false,"upvars":["error","hash","tooltip","stats","-track-array","each","or","uri","action","mut","not","if","hasLoaded"]}',meta:{moduleName:"consul-ui/components/topology-metrics/stats/index.hbs"}}) -let d=(n=Ember._tracked,r=Ember._tracked,a=Ember._action,l=class extends t.default{constructor(...e){super(...e),o(this,"stats",s,this),o(this,"hasLoaded",i,this)}statsUpdate(e){if("summary-for-service"==this.args.endpoint)this.stats=e.data.stats -else{let t=this.args.nspace||"" -0===t.length&&(t="default") -let n=`${this.args.item}.${t}.${this.args.dc}` -this.stats=e.data.stats[n]}this.stats=(this.stats||[]).slice(0,4),this.hasLoaded=!0}},s=u(l.prototype,"stats",[n],{configurable:!0,enumerable:!0,writable:!0,initializer:function(){return null}}),i=u(l.prototype,"hasLoaded",[r],{configurable:!0,enumerable:!0,writable:!0,initializer:function(){return!1}}),u(l.prototype,"statsUpdate",[a],Object.getOwnPropertyDescriptor(l.prototype,"statsUpdate"),l.prototype),l) -e.default=d,Ember._setComponentTemplate(c,d)})),define("consul-ui/components/topology-metrics/status/index",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const t=Ember.HTMLBars.template({id:"nZPL6KB3",block:'{"symbols":["@error","@noMetricsReason"],"statements":[[6,[37,1],[[30,[36,4],[[32,2],[32,1]],null]],null,[["default","else"],[{"statements":[[2," "],[10,"span"],[14,0,"topology-metrics-status-error"],[12],[2,"\\n"],[6,[37,1],[[30,[36,3],[[32,2],"ingress-gateway"],null]],null,[["default","else"],[{"statements":[[2," "],[1,[30,[36,0],["components.consul.topology-metrics.status.ingress-gateway"],null]],[2,"\\n"]],"parameters":[]},{"statements":[[6,[37,1],[[30,[36,3],[[32,2],"remote-dc"],null]],null,[["default","else"],[{"statements":[[2," "],[1,[30,[36,0],["components.consul.topology-metrics.status.error"],null]],[2,"\\n "],[11,"span"],[4,[38,2],[[30,[36,0],["components.consul.topology-metrics.status.remote-dc"],null]],null],[12],[13],[2,"\\n"]],"parameters":[]},{"statements":[[6,[37,1],[[32,1]],null,[["default"],[{"statements":[[2," "],[1,[30,[36,0],["components.consul.topology-metrics.status.error"],null]],[2,"\\n "]],"parameters":[]}]]]],"parameters":[]}]]]],"parameters":[]}]]],[2," "],[13],[2,"\\n"]],"parameters":[]},{"statements":[[2," "],[10,"span"],[14,0,"topology-metrics-status-loader"],[12],[1,[30,[36,0],["components.consul.topology-metrics.status.loading"],null]],[13],[2,"\\n"]],"parameters":[]}]]]],"hasEval":false,"upvars":["t","if","tooltip","eq","or"]}',meta:{moduleName:"consul-ui/components/topology-metrics/status/index.hbs"}}) -var n=Ember._setComponentTemplate(t,Ember._templateOnlyComponent()) -e.default=n})),define("consul-ui/components/topology-metrics/up-lines/index",["exports","@glimmer/component"],(function(e,t){var n,r,a,l,s,i -function o(e,t,n,r){n&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(r):void 0})}function u(e,t,n,r,a){var l={} -return Object.keys(r).forEach((function(e){l[e]=r[e]})),l.enumerable=!!l.enumerable,l.configurable=!!l.configurable,("value"in l||l.initializer)&&(l.writable=!0),l=n.slice().reverse().reduce((function(n,r){return r(e,t,n)||n}),l),a&&void 0!==l.initializer&&(l.value=l.initializer?l.initializer.call(a):void 0,l.initializer=void 0),void 0===l.initializer&&(Object.defineProperty(e,t,l),l=null),l}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const c=Ember.HTMLBars.template({id:"JzB9jHPV",block:'{"symbols":["item","line","@service","@oncreate","@view","@center","@lines","@items"],"statements":[[6,[37,0],[[30,[36,14],[[32,7,["length"]],0],null]],null,[["default"],[{"statements":[[2," "],[11,"svg"],[16,"viewBox",[30,[36,1],[[32,6,["x"]]," ",[32,5,["y"]]," ",[32,5,["width"]]," ",[32,5,["height"]]],null]],[24,"preserveAspectRatio","none"],[4,[38,10],[[32,0,["getIconPositions"]]],null],[4,[38,11],[[32,0,["getIconPositions"]],[32,7]],null],[12],[2,"\\n "],[10,"defs"],[12],[2,"\\n "],[10,"marker"],[15,1,[30,[36,1],[[32,0,["guid"]],"-allow-dot"],null]],[14,0,"allow-dot"],[14,"viewBox","-2 -2 15 15"],[14,"refX","6"],[14,"refY","6"],[14,"markerWidth","6"],[14,"markerHeight","6"],[12],[2,"\\n "],[10,"circle"],[14,"cx","6"],[14,"cy","6"],[14,"r","6"],[12],[13],[2,"\\n "],[13],[2,"\\n "],[10,"marker"],[15,1,[30,[36,1],[[32,0,["guid"]],"-allow-arrow"],null]],[14,0,"allow-arrow"],[14,"viewBox","-1 -1 12 12"],[14,"refX","5"],[14,"refY","5"],[14,"markerWidth","6"],[14,"markerHeight","6"],[14,"orient","auto-start-reverse"],[12],[2,"\\n "],[10,"polygon"],[14,"points","0 0 10 5 0 10"],[12],[13],[2,"\\n "],[13],[2,"\\n "],[10,"marker"],[15,1,[30,[36,1],[[32,0,["guid"]],"-deny-dot"],null]],[14,0,"deny-dot"],[14,"viewBox","-2 -2 15 15"],[14,"refX","6"],[14,"refY","6"],[14,"markerWidth","6"],[14,"markerHeight","6"],[12],[2,"\\n "],[10,"circle"],[14,"cx","6"],[14,"cy","6"],[14,"r","6"],[12],[13],[2,"\\n "],[13],[2,"\\n "],[10,"marker"],[15,1,[30,[36,1],[[32,0,["guid"]],"-deny-arrow"],null]],[14,0,"deny-arrow"],[14,"viewBox","-1 -1 12 12"],[14,"refX","5"],[14,"refY","5"],[14,"markerWidth","6"],[14,"markerHeight","6"],[14,"orient","auto-start-reverse"],[12],[2,"\\n "],[10,"polygon"],[14,"points","0 0 10 5 0 10"],[12],[13],[2,"\\n "],[13],[2,"\\n "],[13],[2,"\\n"],[6,[37,13],[[30,[36,12],[[30,[36,12],[[32,7]],null]],null]],null,[["default"],[{"statements":[[6,[37,0],[[30,[36,9],[[32,2,["permission"]],"deny"],null]],null,[["default","else"],[{"statements":[[2," "],[10,"path"],[15,1,[30,[36,1],[[32,0,["guid"]],[32,2,["id"]]],null]],[15,"d",[30,[36,8],[[32,2,["dest"]]],[["src"],[[32,2,["src"]]]]]],[15,"marker-start",[30,[36,1],["url(#",[32,0,["guid"]],"-deny-dot)"],null]],[15,"marker-end",[30,[36,1],["url(#",[32,0,["guid"]],"-deny-arrow)"],null]],[15,"data-permission",[32,2,["permission"]]],[12],[13],[2,"\\n"]],"parameters":[]},{"statements":[[2," "],[10,"path"],[15,1,[30,[36,1],[[32,0,["guid"]],[32,2,["id"]]],null]],[15,"d",[30,[36,8],[[32,2,["dest"]]],[["src"],[[32,2,["src"]]]]]],[15,"marker-start",[30,[36,1],["url(#",[32,0,["guid"]],"-allow-dot)"],null]],[15,"marker-end",[30,[36,1],["url(#",[32,0,["guid"]],"-allow-arrow)"],null]],[15,"data-permission",[32,2,["permission"]]],[12],[13],[2,"\\n"]],"parameters":[]}]]]],"parameters":[2]}]]],[2," "],[13],[2,"\\n"]],"parameters":[]}]]],[6,[37,13],[[30,[36,12],[[30,[36,12],[[32,8]],null]],null]],null,[["default"],[{"statements":[[6,[37,0],[[30,[36,7],[[30,[36,6],[[32,1,["Datacenter"]],""],null],[30,[36,5],[[30,[36,4],[[32,1,["Intention","Allowed"]]],null],[32,1,["Intention","HasPermissions"]]],null]],null]],null,[["default"],[{"statements":[[2," "],[8,"topology-metrics/popover",[],[["@type","@position","@item","@disabled","@oncreate"],[[30,[36,0],[[32,1,["Intention","HasPermissions"]],"l7","deny"],null],[30,[36,2],["id",[30,[36,1],[[32,0,["guid"]],[32,1,["Namespace"]],[32,1,["Name"]]],null],[32,0,["iconPositions"]]],null],[32,1],false,[30,[36,3],[[32,0],[32,4],[32,3],[32,1]],null]]],null],[2,"\\n"]],"parameters":[]}]]]],"parameters":[1]}]]]],"hasEval":false,"upvars":["if","concat","find-by","action","not","or","not-eq","and","svg-curve","eq","did-insert","did-update","-track-array","each","gt"]}',meta:{moduleName:"consul-ui/components/topology-metrics/up-lines/index.hbs"}}) -let d=(n=Ember._tracked,r=Ember.inject.service("dom"),a=Ember._action,l=class extends t.default{constructor(...e){super(...e),o(this,"iconPositions",s,this),o(this,"dom",i,this)}get guid(){return this.dom.guid(this)}getIconPositions(){const e=this.args.center,t=this.args.view,n=[...document.querySelectorAll("#upstream-lines path")] -this.iconPositions=n.map(n=>{const r=parseFloat(n.getTotalLength()),a=n.getPointAtLength(Math.ceil(.666*r)) -return{id:n.id,x:Math.round(a.x-e.x),y:Math.round(a.y-t.y)}})}},s=u(l.prototype,"iconPositions",[n],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),i=u(l.prototype,"dom",[r],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),u(l.prototype,"getIconPositions",[a],Object.getOwnPropertyDescriptor(l.prototype,"getIconPositions"),l.prototype),l) -e.default=d,Ember._setComponentTemplate(c,d)})),define("consul-ui/components/torii-iframe-placeholder",["exports","torii/components/torii-iframe-placeholder"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -var n=t.default -e.default=n})),define("consul-ui/components/yield-slot",["exports","block-slots/components/yield-slot"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/components/yield/index",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const t=Ember.HTMLBars.template({id:"TxsW/zUX",block:'{"symbols":["&default"],"statements":[[18,1,null],[2,"\\n"]],"hasEval":false,"upvars":[]}',meta:{moduleName:"consul-ui/components/yield/index.hbs"}}) -var n=Ember._setComponentTemplate(t,Ember._templateOnlyComponent()) -e.default=n})),define("consul-ui/controllers/application",["exports","consul-ui/utils/routing/transitionable"],(function(e,t){var n,r,a,l,s,i,o,u -function c(e,t,n,r){n&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(r):void 0})}function d(e,t,n,r,a){var l={} -return Object.keys(r).forEach((function(e){l[e]=r[e]})),l.enumerable=!!l.enumerable,l.configurable=!!l.configurable,("value"in l||l.initializer)&&(l.writable=!0),l=n.slice().reverse().reduce((function(n,r){return r(e,t,n)||n}),l),a&&void 0!==l.initializer&&(l.value=l.initializer?l.initializer.call(a):void 0,l.initializer=void 0),void 0===l.initializer&&(Object.defineProperty(e,t,l),l=null),l}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -let m=(n=Ember.inject.service("router"),r=Ember.inject.service("store"),a=Ember.inject.service("feedback"),l=Ember._action,s=class extends Ember.Controller{constructor(...e){super(...e),c(this,"router",i,this),c(this,"store",o,this),c(this,"feedback",u,this)}reauthorize(e){this.feedback.execute(()=>{this.store.invalidate() -const n={} -if(e.data){const t=e.data -if(void 0!==this.nspace){const e=Ember.get(t,"Namespace")||this.nspace.Name -e!==this.nspace.Name&&(n.nspace=""+e)}}const r=Ember.getOwner(this),a=this.router.currentRoute.name,l=r.lookup("route:"+a) -return r.lookup("route:application").refresh().promise.catch((function(){})).then(e=>a!==this.router.currentRouteName||void 0!==n.nspace?l.transitionTo(...(0,t.default)(this.router.currentRoute,n,r)):e)},e.type,(function(e){return e}),{})}},i=d(s.prototype,"router",[n],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),o=d(s.prototype,"store",[r],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),u=d(s.prototype,"feedback",[a],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),d(s.prototype,"reauthorize",[l],Object.getOwnPropertyDescriptor(s.prototype,"reauthorize"),s.prototype),s) -e.default=m})),define("consul-ui/controllers/dc/acls/policies/create",["exports","consul-ui/controllers/dc/acls/policies/edit"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -class n extends t.default{}e.default=n})),define("consul-ui/controllers/dc/acls/policies/edit",["exports"],(function(e){var t,n,r -Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -let a=(t=Ember.inject.service("form"),n=class extends Ember.Controller{constructor(...e){var t,n,a,l -super(...e),t=this,n="builder",l=this,(a=r)&&Object.defineProperty(t,n,{enumerable:a.enumerable,configurable:a.configurable,writable:a.writable,value:a.initializer?a.initializer.call(l):void 0})}init(){super.init(...arguments),this.form=this.builder.form("policy")}setProperties(e){super.setProperties(Object.keys(e).reduce((e,t)=>{switch(t){case"item":e[t]=this.form.setData(e[t]).getData()}return e},e))}},l=n.prototype,s="builder",i=[t],o={configurable:!0,enumerable:!0,writable:!0,initializer:null},c={},Object.keys(o).forEach((function(e){c[e]=o[e]})),c.enumerable=!!c.enumerable,c.configurable=!!c.configurable,("value"in c||c.initializer)&&(c.writable=!0),c=i.slice().reverse().reduce((function(e,t){return t(l,s,e)||e}),c),u&&void 0!==c.initializer&&(c.value=c.initializer?c.initializer.call(u):void 0,c.initializer=void 0),void 0===c.initializer&&(Object.defineProperty(l,s,c),c=null),r=c,n) -var l,s,i,o,u,c -e.default=a})),define("consul-ui/controllers/dc/acls/roles/create",["exports","consul-ui/controllers/dc/acls/roles/edit"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -class n extends t.default{}e.default=n})),define("consul-ui/controllers/dc/acls/roles/edit",["exports"],(function(e){var t,n,r -Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -let a=(t=Ember.inject.service("form"),n=class extends Ember.Controller{constructor(...e){var t,n,a,l -super(...e),t=this,n="builder",l=this,(a=r)&&Object.defineProperty(t,n,{enumerable:a.enumerable,configurable:a.configurable,writable:a.writable,value:a.initializer?a.initializer.call(l):void 0})}init(){super.init(...arguments),this.form=this.builder.form("role")}setProperties(e){super.setProperties(Object.keys(e).reduce((e,t)=>{switch(t){case"item":e[t]=this.form.setData(e[t]).getData()}return e},e))}},l=n.prototype,s="builder",i=[t],o={configurable:!0,enumerable:!0,writable:!0,initializer:null},c={},Object.keys(o).forEach((function(e){c[e]=o[e]})),c.enumerable=!!c.enumerable,c.configurable=!!c.configurable,("value"in c||c.initializer)&&(c.writable=!0),c=i.slice().reverse().reduce((function(e,t){return t(l,s,e)||e}),c),u&&void 0!==c.initializer&&(c.value=c.initializer?c.initializer.call(u):void 0,c.initializer=void 0),void 0===c.initializer&&(Object.defineProperty(l,s,c),c=null),r=c,n) -var l,s,i,o,u,c -e.default=a})),define("consul-ui/controllers/dc/acls/tokens/create",["exports","consul-ui/controllers/dc/acls/tokens/edit"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -class n extends t.default{}e.default=n})),define("consul-ui/controllers/dc/acls/tokens/edit",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -var t=Ember.Controller.extend({dom:Ember.inject.service("dom"),builder:Ember.inject.service("form"),isScoped:!1,init:function(){this._super(...arguments),this.form=this.builder.form("token")},setProperties:function(e){this._super(Object.keys(e).reduce((e,t)=>{switch(t){case"item":e[t]=this.form.setData(e[t]).getData()}return e},e))},actions:{change:function(e,t){const n=this.dom.normalizeEvent(e,t),r=this.form -try{r.handleEvent(n)}catch(a){throw n.target.name,a}}}}) -e.default=t})),define("consul-ui/data-adapter",["exports","@ember-data/debug"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/decorators/data-source",["exports","wayfarer"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.match=e.default=void 0 -const n=(0,t.default)() -e.default=e=>(t,r,a)=>(n.on(e,(function(e,n,r){const l=n.lookup("service:container").get(t) -return t=>a.value.apply(l,[e,t,r])})),a) -e.match=e=>n.match(e)})),define("consul-ui/decorators/replace",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=e.nullValue=e.replace=void 0 -const t=(e,t)=>(n,r,a)=>({get:function(){const n=a.get.apply(this,arguments) -return n===e?t:n},set:function(){return a.set.apply(this,arguments)}}) -e.replace=t -e.nullValue=function(e){return t(null,e)} -var n=t -e.default=n})),define("consul-ui/env",["exports","consul-ui/config/environment","consul-ui/utils/get-environment"],(function(e,t,n){Object.defineProperty(e,"__esModule",{value:!0}),e.env=void 0 -const r=(0,n.default)(t.default,window,document) -e.env=r})),define("consul-ui/filter/predicates/auth-method",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -e.default={kind:{kubernetes:(e,t)=>e.Type===t,jwt:(e,t)=>e.Type===t,oidc:(e,t)=>e.Type===t},source:{local:(e,t)=>e.TokenLocality===t,global:(e,t)=>e.TokenLocality===t}}})),define("consul-ui/filter/predicates/health-check",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -e.default={status:{passing:(e,t)=>e.Status===t,warning:(e,t)=>e.Status===t,critical:(e,t)=>e.Status===t},kind:{service:(e,t)=>e.Kind===t,node:(e,t)=>e.Kind===t},check:{serf:(e,t)=>e.Type===t,script:(e,t)=>e.Type===t,http:(e,t)=>e.Type===t,tcp:(e,t)=>e.Type===t,ttl:(e,t)=>e.Type===t,docker:(e,t)=>e.Type===t,grpc:(e,t)=>e.Type===t,alias:(e,t)=>e.Type===t}}})),define("consul-ui/filter/predicates/intention",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -e.default={access:{allow:(e,t)=>e.Action===t,deny:(e,t)=>e.Action===t,"app-aware":e=>void 0===e.Action}}})),define("consul-ui/filter/predicates/kv",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -e.default={kind:{folder:e=>e.isFolder,key:e=>!e.isFolder}}})),define("consul-ui/filter/predicates/node",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -e.default={status:{passing:(e,t)=>e.Status===t,warning:(e,t)=>e.Status===t,critical:(e,t)=>e.Status===t}}})),define("consul-ui/filter/predicates/policy",["exports","mnemonist/set"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -var n={kind:{"global-management":e=>e.isGlobalManagement,standard:e=>!e.isGlobalManagement},datacenter:(e,n)=>void 0===e.Datacenters||t.default.intersectionSize(n,new Set(e.Datacenters))>0} -e.default=n})),define("consul-ui/filter/predicates/service-instance",["exports","mnemonist/set"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -var n={status:{passing:(e,t)=>e.Status===t,warning:(e,t)=>e.Status===t,critical:(e,t)=>e.Status===t,empty:e=>0===e.ServiceChecks.length},source:(e,n)=>0!==t.default.intersectionSize(n,new Set(e.ExternalSources||[]))} -e.default=n})),define("consul-ui/filter/predicates/service",["exports","mnemonist/set"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -var n={kind:{"ingress-gateway":(e,t)=>e.Kind===t,"terminating-gateway":(e,t)=>e.Kind===t,"mesh-gateway":(e,t)=>e.Kind===t,service:e=>!e.Kind,"in-mesh":e=>e.InMesh,"not-in-mesh":e=>!e.InMesh},status:{passing:(e,t)=>e.MeshStatus===t,warning:(e,t)=>e.MeshStatus===t,critical:(e,t)=>e.MeshStatus===t,empty:e=>0===e.MeshChecksTotal},instance:{registered:e=>e.InstanceCount>0,"not-registered":e=>0===e.InstanceCount},source:(e,n)=>0!==t.default.intersectionSize(n,new Set(e.ExternalSources||[]))||n.includes(e.Partition)} -e.default=n})),define("consul-ui/filter/predicates/token",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -e.default={kind:{"global-management":e=>e.isGlobalManagement,global:e=>!e.Local,local:e=>e.Local}}})) -define("consul-ui/flash/object",["exports","ember-cli-flash/flash/object"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/formats",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -e.default={time:{hhmmss:{hour:"numeric",minute:"numeric",second:"numeric"}},date:{hhmmss:{hour:"numeric",minute:"numeric",second:"numeric"}},number:{compact:{notation:"compact"},EUR:{style:"currency",currency:"EUR",minimumFractionDigits:2,maximumFractionDigits:2},USD:{style:"currency",currency:"USD",minimumFractionDigits:2,maximumFractionDigits:2}}}})),define("consul-ui/forms/intention",["exports","consul-ui/validations/intention","consul-ui/utils/form/builder"],(function(e,t,n){Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(e,n="",a=t.default,l=r){return l(n,{}).setValidators(a)} -const r=(0,n.default)()})),define("consul-ui/forms/kv",["exports","consul-ui/validations/kv","consul-ui/utils/form/builder"],(function(e,t,n){Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(e,n="",a=t.default,l=r){return l(n,{}).setValidators(a)} -const r=(0,n.default)()})),define("consul-ui/forms/policy",["exports","consul-ui/validations/policy","consul-ui/utils/form/builder"],(function(e,t,n){Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(e,n="policy",a=t.default,l=r){return l(n,{Datacenters:{type:"array"}}).setValidators(a)} -const r=(0,n.default)()})),define("consul-ui/forms/role",["exports","consul-ui/validations/role","consul-ui/utils/form/builder"],(function(e,t,n){Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(e,n="role",a=t.default,l=r){return l(n,{}).setValidators(a).add(e.form("policy"))} -const r=(0,n.default)()})),define("consul-ui/forms/token",["exports","consul-ui/validations/token","consul-ui/utils/form/builder"],(function(e,t,n){Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(e,n="",a=t.default,l=r){return l(n,{}).setValidators(a).add(e.form("policy")).add(e.form("role"))} -const r=(0,n.default)()})),define("consul-ui/helpers/-element",["exports","ember-element-helper/helpers/-element"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/helpers/-has-block-params",["exports","ember-named-blocks-polyfill/helpers/-has-block-params"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/helpers/-has-block",["exports","ember-named-blocks-polyfill/helpers/-has-block"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/helpers/-is-named-block-invocation",["exports","ember-named-blocks-polyfill/helpers/-is-named-block-invocation"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/helpers/-named-block-invocation",["exports","ember-named-blocks-polyfill/helpers/-named-block-invocation"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/helpers/abs",["exports","ember-math-helpers/helpers/abs"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"abs",{enumerable:!0,get:function(){return t.abs}})})),define("consul-ui/helpers/acos",["exports","ember-math-helpers/helpers/acos"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"acos",{enumerable:!0,get:function(){return t.acos}})})),define("consul-ui/helpers/acosh",["exports","ember-math-helpers/helpers/acosh"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"acosh",{enumerable:!0,get:function(){return t.acosh}})})),define("consul-ui/helpers/add",["exports","ember-math-helpers/helpers/add"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"add",{enumerable:!0,get:function(){return t.add}})})),define("consul-ui/helpers/adopt-styles",["exports","@lit/reactive-element"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -class n extends Ember.Helper{compute([e,n],r){Array.isArray(n)||(n=[n]),(0,t.adoptStyles)(e,n)}}e.default=n})),define("consul-ui/helpers/and",["exports","ember-truth-helpers/helpers/and"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"and",{enumerable:!0,get:function(){return t.and}})})),define("consul-ui/helpers/app-version",["exports","consul-ui/config/environment","ember-cli-app-version/utils/regexp"],(function(e,t,n){function r(e,r={}){const a=t.default.APP.version -let l=r.versionOnly||r.hideSha,s=r.shaOnly||r.hideVersion,i=null -return l&&(r.showExtended&&(i=a.match(n.versionExtendedRegExp)),i||(i=a.match(n.versionRegExp))),s&&(i=a.match(n.shaRegExp)),i?i[0]:a}Object.defineProperty(e,"__esModule",{value:!0}),e.appVersion=r,e.default=void 0 -var a=Ember.Helper.helper(r) -e.default=a})),define("consul-ui/helpers/append",["exports","ember-composable-helpers/helpers/append"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"append",{enumerable:!0,get:function(){return t.append}})})),define("consul-ui/helpers/array-concat",["exports","ember-array-fns/helpers/array-concat"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"arrayConcat",{enumerable:!0,get:function(){return t.arrayConcat}})})),define("consul-ui/helpers/array-every",["exports","ember-array-fns/helpers/array-every"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"arrayEvery",{enumerable:!0,get:function(){return t.arrayEvery}})})),define("consul-ui/helpers/array-filter",["exports","ember-array-fns/helpers/array-filter"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"arrayFilter",{enumerable:!0,get:function(){return t.arrayFilter}})})),define("consul-ui/helpers/array-find-index",["exports","ember-array-fns/helpers/array-find-index"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"arrayFindIndex",{enumerable:!0,get:function(){return t.arrayFindIndex}})})),define("consul-ui/helpers/array-find",["exports","ember-array-fns/helpers/array-find"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"arrayFind",{enumerable:!0,get:function(){return t.arrayFind}})})),define("consul-ui/helpers/array-includes",["exports","ember-array-fns/helpers/array-includes"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"arrayIncludes",{enumerable:!0,get:function(){return t.arrayIncludes}})})),define("consul-ui/helpers/array-index-of",["exports","ember-array-fns/helpers/array-index-of"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"arrayIndexOf",{enumerable:!0,get:function(){return t.arrayIndexOf}})})),define("consul-ui/helpers/array-is-array",["exports","ember-array-fns/helpers/array-is-array"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"arrayIsArray",{enumerable:!0,get:function(){return t.arrayIsArray}})})),define("consul-ui/helpers/array-is-first-element",["exports","ember-array-fns/helpers/array-is-first-element"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"arrayIsFirstElement",{enumerable:!0,get:function(){return t.arrayIsFirstElement}})})),define("consul-ui/helpers/array-is-last-element",["exports","ember-array-fns/helpers/array-is-last-element"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"arrayIsLastElement",{enumerable:!0,get:function(){return t.arrayIsLastElement}})})) -define("consul-ui/helpers/array-join",["exports","ember-array-fns/helpers/array-join"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"arrayJoin",{enumerable:!0,get:function(){return t.arrayJoin}})})),define("consul-ui/helpers/array-last-index-of",["exports","ember-array-fns/helpers/array-last-index-of"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"arrayLastIndexOf",{enumerable:!0,get:function(){return t.arrayLastIndexOf}})})),define("consul-ui/helpers/array-map",["exports","ember-array-fns/helpers/array-map"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"arrayMap",{enumerable:!0,get:function(){return t.arrayMap}})})),define("consul-ui/helpers/array-reduce",["exports","ember-array-fns/helpers/array-reduce"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"arrayReduce",{enumerable:!0,get:function(){return t.arrayReduce}})})),define("consul-ui/helpers/array-reverse",["exports","ember-array-fns/helpers/array-reverse"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"arrayReverse",{enumerable:!0,get:function(){return t.arrayReverse}})})),define("consul-ui/helpers/array-slice",["exports","ember-array-fns/helpers/array-slice"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"arraySlice",{enumerable:!0,get:function(){return t.arraySlice}})})),define("consul-ui/helpers/array-some",["exports","ember-array-fns/helpers/array-some"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"arraySome",{enumerable:!0,get:function(){return t.arraySome}})})),define("consul-ui/helpers/array-sort",["exports","ember-array-fns/helpers/array-sort"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"arraySort",{enumerable:!0,get:function(){return t.arraySort}})})),define("consul-ui/helpers/array-splice",["exports","ember-array-fns/helpers/array-splice"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"arraySplice",{enumerable:!0,get:function(){return t.arraySplice}})})),define("consul-ui/helpers/asin",["exports","ember-math-helpers/helpers/asin"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"asin",{enumerable:!0,get:function(){return t.asin}})})),define("consul-ui/helpers/asinh",["exports","ember-math-helpers/helpers/asinh"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"asinh",{enumerable:!0,get:function(){return t.asinh}})})),define("consul-ui/helpers/assign",["exports","ember-assign-helper/helpers/assign"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"assign",{enumerable:!0,get:function(){return t.assign}})})),define("consul-ui/helpers/atan",["exports","ember-math-helpers/helpers/atan"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"atan",{enumerable:!0,get:function(){return t.atan}})})),define("consul-ui/helpers/atan2",["exports","ember-math-helpers/helpers/atan2"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"atan2",{enumerable:!0,get:function(){return t.atan2}})})),define("consul-ui/helpers/atanh",["exports","ember-math-helpers/helpers/atanh"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"atanh",{enumerable:!0,get:function(){return t.atanh}})})),define("consul-ui/helpers/atob",["exports","consul-ui/utils/atob"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -var n=Ember.Helper.helper((function([e=""]){return(0,t.default)(e)})) -e.default=n})),define("consul-ui/helpers/block-params",["exports","block-slots/helpers/block-params"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/helpers/cached-model",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -class t extends Ember.Helper{compute([e,t],n){return Ember.getOwner(this).lookup("service:repository/"+e).cached(t)}}e.default=t})),define("consul-ui/helpers/camelize",["exports","ember-cli-string-helpers/helpers/camelize"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"camelize",{enumerable:!0,get:function(){return t.camelize}})})),define("consul-ui/helpers/can",["exports","ember-can/helpers/can"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -class n extends t.default{_addAbilityObserver(e,t){this.isDestroyed||this.isDestroying||super._addAbilityObserver(...arguments)}}e.default=n})),define("consul-ui/helpers/cancel-all",["exports","ember-concurrency/helpers/cancel-all"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/helpers/cannot",["exports","ember-can/helpers/cannot"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/helpers/capitalize",["exports","ember-cli-string-helpers/helpers/capitalize"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"capitalize",{enumerable:!0,get:function(){return t.capitalize}})})),define("consul-ui/helpers/cbrt",["exports","ember-math-helpers/helpers/cbrt"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"cbrt",{enumerable:!0,get:function(){return t.cbrt}})})),define("consul-ui/helpers/ceil",["exports","ember-math-helpers/helpers/ceil"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"ceil",{enumerable:!0,get:function(){return t.ceil}})})),define("consul-ui/helpers/changeset-get",["exports","ember-changeset/helpers/changeset-get"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/helpers/changeset-set",["exports","ember-changeset/helpers/changeset-set"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"changesetSet",{enumerable:!0,get:function(){return t.changesetSet}})})),define("consul-ui/helpers/changeset",["exports","ember-changeset-validations/helpers/changeset"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"changeset",{enumerable:!0,get:function(){return t.changeset}})})),define("consul-ui/helpers/chunk",["exports","ember-composable-helpers/helpers/chunk"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"chunk",{enumerable:!0,get:function(){return t.chunk}})})),define("consul-ui/helpers/class-map",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -var t=Ember.Helper.helper(e=>{const t=e.filter(Boolean).filter(e=>"string"==typeof e||e[e.length-1]).map(e=>"string"==typeof e?e:e[0]).join(" ") -return t.length>0?t:void 0}) -e.default=t})) -define("consul-ui/helpers/classify",["exports","ember-cli-string-helpers/helpers/classify"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"classify",{enumerable:!0,get:function(){return t.classify}})})),define("consul-ui/helpers/clz32",["exports","ember-math-helpers/helpers/clz32"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"clz32",{enumerable:!0,get:function(){return t.clz32}})})),define("consul-ui/helpers/collection",["exports","consul-ui/models/service","consul-ui/models/service-instance"],(function(e,t,n){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const r={service:t.Collection,"service-instance":n.Collection} -class a{}class l extends Ember.Helper{compute([e,t],n){if(e.length>0){const t=Ember.get(e,"firstObject")._internalModel.modelName -return new(0,r[t])(e)}return new a}}e.default=l})),define("consul-ui/helpers/compact",["exports","ember-composable-helpers/helpers/compact"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/helpers/compute",["exports","ember-composable-helpers/helpers/compute"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"compute",{enumerable:!0,get:function(){return t.compute}})})),define("consul-ui/helpers/contains",["exports","ember-composable-helpers/helpers/contains"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"contains",{enumerable:!0,get:function(){return t.contains}})})),define("consul-ui/helpers/cos",["exports","ember-math-helpers/helpers/cos"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"cos",{enumerable:!0,get:function(){return t.cos}})})),define("consul-ui/helpers/cosh",["exports","ember-math-helpers/helpers/cosh"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"cosh",{enumerable:!0,get:function(){return t.cosh}})})),define("consul-ui/helpers/css-map",["exports","@lit/reactive-element"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -var n=Ember.Helper.helper(e=>e.filter(e=>e instanceof t.CSSResult||e[e.length-1]).map(e=>e instanceof t.CSSResult?e:e[0])) -e.default=n})),define("consul-ui/helpers/css",["exports","@lit/reactive-element"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -class n extends Ember.Helper{compute([e],n){return(0,t.css)([e])}}e.default=n})),define("consul-ui/helpers/dasherize",["exports","ember-cli-string-helpers/helpers/dasherize"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"dasherize",{enumerable:!0,get:function(){return t.dasherize}})})),define("consul-ui/helpers/dec",["exports","ember-composable-helpers/helpers/dec"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"dec",{enumerable:!0,get:function(){return t.dec}})})),define("consul-ui/helpers/did-insert",["exports","ember-render-helpers/helpers/did-insert"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/helpers/did-update",["exports","ember-render-helpers/helpers/did-update"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/helpers/div",["exports","ember-math-helpers/helpers/div"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"div",{enumerable:!0,get:function(){return t.div}})})),define("consul-ui/helpers/document-attrs",["exports","mnemonist/multi-map"],(function(e,t){var n,r,a -Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const l=new Map,s=new WeakMap -let i=(n=Ember.inject.service("-document"),r=class extends Ember.Helper{constructor(...e){var t,n,r,l -super(...e),t=this,n="document",l=this,(r=a)&&Object.defineProperty(t,n,{enumerable:r.enumerable,configurable:r.configurable,writable:r.writable,value:r.initializer?r.initializer.call(l):void 0})}compute(e,t){this.synchronize(this.document.documentElement,t)}willDestroy(){this.synchronize(this.document.documentElement),s.delete(this)}synchronize(e,n){const r=s.get(this) -return r&&Object.entries(r).forEach(([e,t])=>{let n=l.get(e) -void 0!==n&&[...new Set(t.split(" "))].map(e=>n.remove(e,this))}),n&&(s.set(this,n),[...Object.entries(n)].forEach(([e,n])=>{let r=l.get(e) -void 0===r&&(r=new t.default(Set),l.set(e,r)),[...new Set(n.split(" "))].map(e=>{0===r.count(e)&&r.set(e,null),r.set(e,this)})})),[...l.entries()].forEach(([t,n])=>{let r="attr" -"class"===t?r=t:t.startsWith("data-")&&(r="data"),[...n.keys()].forEach(a=>{if(1===n.count(a)){switch(r){case"class":e.classList.remove(a)}n.delete(a),0===n.size&&l.delete(t)}else switch(r){case"class":e.classList.add(a)}})}),l}},o=r.prototype,u="document",c=[n],d={configurable:!0,enumerable:!0,writable:!0,initializer:null},p={},Object.keys(d).forEach((function(e){p[e]=d[e]})),p.enumerable=!!p.enumerable,p.configurable=!!p.configurable,("value"in p||p.initializer)&&(p.writable=!0),p=c.slice().reverse().reduce((function(e,t){return t(o,u,e)||e}),p),m&&void 0!==p.initializer&&(p.value=p.initializer?p.initializer.call(m):void 0,p.initializer=void 0),void 0===p.initializer&&(Object.defineProperty(o,u,p),p=null),a=p,r) -var o,u,c,d,m,p -e.default=i})),define("consul-ui/helpers/dom-position",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -class t extends Ember.Helper{compute([e],{from:t,offset:n=!1}){return r=>{if("function"==typeof e){let a,l -if(n)l=r.currentTarget,a={width:l.offsetWidth,left:l.offsetLeft,height:l.offsetHeight,top:l.offsetTop} -else if(l=r.target,a=l.getBoundingClientRect(),void 0!==t){const e=t.getBoundingClientRect() -a.x=a.x-e.x,a.y=a.y-e.y}return e(a)}{const t=r.target,n=t.getBoundingClientRect() -e.forEach(([e,r])=>{t.style[r]=n[e]+"px"})}}}}e.default=t})),define("consul-ui/helpers/drop",["exports","ember-composable-helpers/helpers/drop"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/helpers/duration-from",["exports"],(function(e){var t,n,r -Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -let a=(t=Ember.inject.service("temporal"),n=class extends Ember.Helper{constructor(...e){var t,n,a,l -super(...e),t=this,n="temporal",l=this,(a=r)&&Object.defineProperty(t,n,{enumerable:a.enumerable,configurable:a.configurable,writable:a.writable,value:a.initializer?a.initializer.call(l):void 0})}compute([e],t){return this.temporal.durationFrom(e)}},l=n.prototype,s="temporal",i=[t],o={configurable:!0,enumerable:!0,writable:!0,initializer:null},c={},Object.keys(o).forEach((function(e){c[e]=o[e]})),c.enumerable=!!c.enumerable,c.configurable=!!c.configurable,("value"in c||c.initializer)&&(c.writable=!0),c=i.slice().reverse().reduce((function(e,t){return t(l,s,e)||e}),c),u&&void 0!==c.initializer&&(c.value=c.initializer?c.initializer.call(u):void 0,c.initializer=void 0),void 0===c.initializer&&(Object.defineProperty(l,s,c),c=null),r=c,n) -var l,s,i,o,u,c -e.default=a})),define("consul-ui/helpers/element",["exports","ember-element-helper/helpers/element"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/helpers/ember-power-select-is-group",["exports","ember-power-select/helpers/ember-power-select-is-group"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"emberPowerSelectIsGroup",{enumerable:!0,get:function(){return t.emberPowerSelectIsGroup}})})),define("consul-ui/helpers/ember-power-select-is-selected",["exports","ember-power-select/helpers/ember-power-select-is-selected"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"emberPowerSelectIsSelected",{enumerable:!0,get:function(){return t.emberPowerSelectIsSelected}})})),define("consul-ui/helpers/ensure-safe-component",["exports","@embroider/util"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.EnsureSafeComponentHelper}})})),define("consul-ui/helpers/entries",["exports","ember-composable-helpers/helpers/entries"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"entries",{enumerable:!0,get:function(){return t.entries}})})),define("consul-ui/helpers/env",["exports"],(function(e){var t,n,r -Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -let a=(t=Ember.inject.service("env"),n=class extends Ember.Helper{constructor(...e){var t,n,a,l -super(...e),t=this,n="env",l=this,(a=r)&&Object.defineProperty(t,n,{enumerable:a.enumerable,configurable:a.configurable,writable:a.writable,value:a.initializer?a.initializer.call(l):void 0})}compute([e,t=""],n){const r=this.env.var(e) -return null!=r?r:t}},l=n.prototype,s="env",i=[t],o={configurable:!0,enumerable:!0,writable:!0,initializer:null},c={},Object.keys(o).forEach((function(e){c[e]=o[e]})),c.enumerable=!!c.enumerable,c.configurable=!!c.configurable,("value"in c||c.initializer)&&(c.writable=!0),c=i.slice().reverse().reduce((function(e,t){return t(l,s,e)||e}),c),u&&void 0!==c.initializer&&(c.value=c.initializer?c.initializer.call(u):void 0,c.initializer=void 0),void 0===c.initializer&&(Object.defineProperty(l,s,c),c=null),r=c,n) -var l,s,i,o,u,c -e.default=a})),define("consul-ui/helpers/eq",["exports","ember-truth-helpers/helpers/equal"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"equal",{enumerable:!0,get:function(){return t.equal}})})),define("consul-ui/helpers/exp",["exports","ember-math-helpers/helpers/exp"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"exp",{enumerable:!0,get:function(){return t.exp}})})),define("consul-ui/helpers/expm1",["exports","ember-math-helpers/helpers/expm1"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"expm1",{enumerable:!0,get:function(){return t.expm1}})})),define("consul-ui/helpers/filter-by",["exports","ember-composable-helpers/helpers/filter-by"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/helpers/filter",["exports","ember-composable-helpers/helpers/filter"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})) -define("consul-ui/helpers/find-by",["exports","ember-composable-helpers/helpers/find-by"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/helpers/fixed-grid-layout",["exports","ember-collection/layouts/grid"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -var n=Ember.Helper.helper((function(e){return new t.default(e[0],e[1])})) -e.default=n})),define("consul-ui/helpers/flatten-property",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -var t=Ember.Helper.helper((function e([t,n],r){const a=r.pages||[] -return a.push(...t.pages),t.children.forEach(t=>e([t],{pages:a})),a})) -e.default=t})),define("consul-ui/helpers/flatten",["exports","ember-composable-helpers/helpers/flatten"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"flatten",{enumerable:!0,get:function(){return t.flatten}})})),define("consul-ui/helpers/floor",["exports","ember-math-helpers/helpers/floor"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"floor",{enumerable:!0,get:function(){return t.floor}})})),define("consul-ui/helpers/format-date",["exports","ember-intl/helpers/format-date"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/helpers/format-message",["exports","ember-intl/helpers/format-message"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/helpers/format-number",["exports","ember-intl/helpers/format-number"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/helpers/format-relative",["exports","ember-intl/helpers/format-relative"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/helpers/format-short-time",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -var t=Ember.Helper.helper((function([e]){let t,n,r,a -a=Math.floor(e/1e3),r=Math.floor(a/60),a%=60,n=Math.floor(r/60),r%=60,t=Math.floor(n/24),n%=24 -const l=t,s=n,i=r,o=a -switch(!0){case 0!==l:return l+"d" -case 0!==s:return s+"h" -case 0!==i:return i+"m" -default:return o+"s"}})) -e.default=t})),define("consul-ui/helpers/format-time",["exports","ember-intl/helpers/format-time"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/helpers/from-entries",["exports","ember-composable-helpers/helpers/from-entries"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"fromEntries",{enumerable:!0,get:function(){return t.fromEntries}})})),define("consul-ui/helpers/fround",["exports","ember-math-helpers/helpers/fround"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"fround",{enumerable:!0,get:function(){return t.fround}})})),define("consul-ui/helpers/gcd",["exports","ember-math-helpers/helpers/gcd"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"gcd",{enumerable:!0,get:function(){return t.gcd}})})),define("consul-ui/helpers/group-by",["exports","ember-composable-helpers/helpers/group-by"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/helpers/gt",["exports","ember-truth-helpers/helpers/gt"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"gt",{enumerable:!0,get:function(){return t.gt}})})),define("consul-ui/helpers/gte",["exports","ember-truth-helpers/helpers/gte"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"gte",{enumerable:!0,get:function(){return t.gte}})})),define("consul-ui/helpers/has-next",["exports","ember-composable-helpers/helpers/has-next"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"hasNext",{enumerable:!0,get:function(){return t.hasNext}})})),define("consul-ui/helpers/has-previous",["exports","ember-composable-helpers/helpers/has-previous"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"hasPrevious",{enumerable:!0,get:function(){return t.hasPrevious}})})),define("consul-ui/helpers/href-to",["exports","consul-ui/utils/routing/transitionable","consul-ui/utils/routing/wildcard","consul-ui/router"],(function(e,t,n,r){var a,l,s,i -function o(e,t,n,r,a){var l={} -return Object.keys(r).forEach((function(e){l[e]=r[e]})),l.enumerable=!!l.enumerable,l.configurable=!!l.configurable,("value"in l||l.initializer)&&(l.writable=!0),l=n.slice().reverse().reduce((function(n,r){return r(e,t,n)||n}),l),a&&void 0!==l.initializer&&(l.value=l.initializer?l.initializer.call(a):void 0,l.initializer=void 0),void 0===l.initializer&&(Object.defineProperty(e,t,l),l=null),l}Object.defineProperty(e,"__esModule",{value:!0}),e.default=e.hrefTo=void 0 -const u=(0,n.default)(r.routes),c=function(e,n,r={}){const a=e.lookup("router:main").location,l=e.lookup("service:router") -let s=n.slice(0),i=s.shift(),o=r.params||{} -"."===i&&(s=(0,t.default)(l.currentRoute,o,e),i=s.shift()) -try{return u(i)&&(s=s.map(e=>e.split("/").map(encodeURIComponent).join("/"))),a.hrefTo(i,s,o)}catch(c){throw c.constructor===Error&&(c.message=`${c.message} For "${n[0]}:${JSON.stringify(n.slice(1))}"`),c}} -e.hrefTo=c -let d=(a=Ember.inject.service("router"),l=Ember._action,s=class extends Ember.Helper{constructor(...e){var t,n,r,a -super(...e),t=this,n="router",a=this,(r=i)&&Object.defineProperty(t,n,{enumerable:r.enumerable,configurable:r.configurable,writable:r.writable,value:r.initializer?r.initializer.call(a):void 0})}init(){super.init(...arguments),this.router.on("routeWillChange",this.routeWillChange)}compute(e,t){return c(Ember.getOwner(this),e,t)}routeWillChange(e){this.recompute()}willDestroy(){this.router.off("routeWillChange",this.routeWillChange),super.willDestroy()}},i=o(s.prototype,"router",[a],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),o(s.prototype,"routeWillChange",[l],Object.getOwnPropertyDescriptor(s.prototype,"routeWillChange"),s.prototype),s) -e.default=d})),define("consul-ui/helpers/html-safe",["exports","ember-cli-string-helpers/helpers/html-safe"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"htmlSafe",{enumerable:!0,get:function(){return t.htmlSafe}})})),define("consul-ui/helpers/humanize",["exports","ember-cli-string-helpers/helpers/humanize"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"humanize",{enumerable:!0,get:function(){return t.humanize}})})),define("consul-ui/helpers/hypot",["exports","ember-math-helpers/helpers/hypot"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"hypot",{enumerable:!0,get:function(){return t.hypot}})})),define("consul-ui/helpers/imul",["exports","ember-math-helpers/helpers/imul"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"imul",{enumerable:!0,get:function(){return t.imul}})})),define("consul-ui/helpers/inc",["exports","ember-composable-helpers/helpers/inc"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"inc",{enumerable:!0,get:function(){return t.inc}})})),define("consul-ui/helpers/intersect",["exports","ember-composable-helpers/helpers/intersect"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/helpers/invoke",["exports","ember-composable-helpers/helpers/invoke"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"invoke",{enumerable:!0,get:function(){return t.invoke}})})),define("consul-ui/helpers/is-active",["exports","ember-router-helpers/helpers/is-active"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"isActive",{enumerable:!0,get:function(){return t.isActive}})})),define("consul-ui/helpers/is-array",["exports","ember-truth-helpers/helpers/is-array"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"isArray",{enumerable:!0,get:function(){return t.isArray}})})),define("consul-ui/helpers/is-empty",["exports","ember-truth-helpers/helpers/is-empty"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})) -define("consul-ui/helpers/is-equal",["exports","ember-truth-helpers/helpers/is-equal"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"isEqual",{enumerable:!0,get:function(){return t.isEqual}})})),define("consul-ui/helpers/is-href",["exports"],(function(e){var t,n,r,a -function l(e,t,n,r,a){var l={} -return Object.keys(r).forEach((function(e){l[e]=r[e]})),l.enumerable=!!l.enumerable,l.configurable=!!l.configurable,("value"in l||l.initializer)&&(l.writable=!0),l=n.slice().reverse().reduce((function(n,r){return r(e,t,n)||n}),l),a&&void 0!==l.initializer&&(l.value=l.initializer?l.initializer.call(a):void 0,l.initializer=void 0),void 0===l.initializer&&(Object.defineProperty(e,t,l),l=null),l}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -let s=(t=Ember.inject.service("router"),n=Ember._action,r=class extends Ember.Helper{constructor(...e){var t,n,r,l -super(...e),t=this,n="router",l=this,(r=a)&&Object.defineProperty(t,n,{enumerable:r.enumerable,configurable:r.configurable,writable:r.writable,value:r.initializer?r.initializer.call(l):void 0})}init(){super.init(...arguments),this.router.on("routeWillChange",this.routeWillChange)}compute([e,...t]){return this.router.currentRouteName.startsWith("nspace.")&&e.startsWith("dc.")&&(e="nspace."+e),void 0!==this.next&&"loading"!==this.next?this.next.startsWith(e):this.router.isActive(e,...t)}routeWillChange(e){this.next=e.to.name.replace(".index",""),this.recompute()}willDestroy(){this.router.off("routeWillChange",this.routeWillChange),super.willDestroy()}},a=l(r.prototype,"router",[t],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),l(r.prototype,"routeWillChange",[n],Object.getOwnPropertyDescriptor(r.prototype,"routeWillChange"),r.prototype),r) -e.default=s})),define("consul-ui/helpers/is",["exports","ember-can/helpers/can"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=e.is=void 0 -const n=(e,[t,n],r)=>{let{abilityName:a,propertyName:l}=e.abilities.parse(t),s=e.abilities.abilityFor(a,n,r) -return l="function"==typeof s.getCharacteristicProperty?s.getCharacteristicProperty(l):Ember.String.camelize("is-"+l),e._removeAbilityObserver(),e._addAbilityObserver(s,l),Ember.get(s,l)} -e.is=n -class r extends t.default{compute([e,t],r){return n(this,[e,t],r)}}e.default=r})),define("consul-ui/helpers/join",["exports","ember-composable-helpers/helpers/join"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/helpers/json-stringify",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -var t=Ember.Helper.helper((function(e){try{return JSON.stringify(...e)}catch(t){return e[0].map(t=>JSON.stringify(t,e[1],e[2]))}})) -e.default=t})),define("consul-ui/helpers/keys",["exports","ember-composable-helpers/helpers/keys"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"keys",{enumerable:!0,get:function(){return t.keys}})})),define("consul-ui/helpers/last",["exports"],(function(e){function t([e=""]){switch(!0){case"string"==typeof e:return e.substr(-1)}}Object.defineProperty(e,"__esModule",{value:!0}),e.last=t,e.default=void 0 -var n=Ember.Helper.helper(t) -e.default=n})),define("consul-ui/helpers/lcm",["exports","ember-math-helpers/helpers/lcm"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"lcm",{enumerable:!0,get:function(){return t.lcm}})})),define("consul-ui/helpers/left-trim",["exports","consul-ui/utils/left-trim"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -var n=Ember.Helper.helper((function([e="",n=""]){return(0,t.default)(e,n)})) -e.default=n})),define("consul-ui/helpers/log-e",["exports","ember-math-helpers/helpers/log-e"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"logE",{enumerable:!0,get:function(){return t.logE}})})),define("consul-ui/helpers/log10",["exports","ember-math-helpers/helpers/log10"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"log10",{enumerable:!0,get:function(){return t.log10}})})),define("consul-ui/helpers/log1p",["exports","ember-math-helpers/helpers/log1p"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"log1p",{enumerable:!0,get:function(){return t.log1p}})})),define("consul-ui/helpers/log2",["exports","ember-math-helpers/helpers/log2"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"log2",{enumerable:!0,get:function(){return t.log2}})})),define("consul-ui/helpers/lowercase",["exports","ember-cli-string-helpers/helpers/lowercase"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"lowercase",{enumerable:!0,get:function(){return t.lowercase}})})),define("consul-ui/helpers/lt",["exports","ember-truth-helpers/helpers/lt"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"lt",{enumerable:!0,get:function(){return t.lt}})})),define("consul-ui/helpers/lte",["exports","ember-truth-helpers/helpers/lte"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"lte",{enumerable:!0,get:function(){return t.lte}})})),define("consul-ui/helpers/map-by",["exports","ember-composable-helpers/helpers/map-by"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/helpers/map",["exports","ember-composable-helpers/helpers/map"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/helpers/max",["exports","ember-math-helpers/helpers/max"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"max",{enumerable:!0,get:function(){return t.max}})})),define("consul-ui/helpers/merge-checks",["exports","consul-ui/utils/merge-checks"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -var n=Ember.Helper.helper((function([e,n]){return(0,t.default)(e,n)})) -e.default=n})),define("consul-ui/helpers/min",["exports","ember-math-helpers/helpers/min"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"min",{enumerable:!0,get:function(){return t.min}})})),define("consul-ui/helpers/mixed-grid-layout",["exports","ember-collection/layouts/mixed-grid"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -var n=Ember.Helper.helper((function(e){return new t.default(e[0])})) -e.default=n})),define("consul-ui/helpers/mod",["exports","ember-math-helpers/helpers/mod"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"mod",{enumerable:!0,get:function(){return t.mod}})})),define("consul-ui/helpers/mult",["exports","ember-math-helpers/helpers/mult"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"mult",{enumerable:!0,get:function(){return t.mult}})})),define("consul-ui/helpers/next",["exports","ember-composable-helpers/helpers/next"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"next",{enumerable:!0,get:function(){return t.next}})})),define("consul-ui/helpers/noop",["exports","ember-composable-helpers/helpers/noop"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"noop",{enumerable:!0,get:function(){return t.noop}})})),define("consul-ui/helpers/not-eq",["exports","ember-truth-helpers/helpers/not-equal"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"notEqualHelper",{enumerable:!0,get:function(){return t.notEqualHelper}})})),define("consul-ui/helpers/not",["exports","ember-truth-helpers/helpers/not"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"not",{enumerable:!0,get:function(){return t.not}})})),define("consul-ui/helpers/object-at",["exports","ember-composable-helpers/helpers/object-at"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"objectAt",{enumerable:!0,get:function(){return t.objectAt}})})),define("consul-ui/helpers/on-document",["exports","ember-on-helper/helpers/on-document"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})) -define("consul-ui/helpers/on-window",["exports","ember-on-helper/helpers/on-window"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/helpers/on",["exports","ember-on-helper/helpers/on"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/helpers/optional",["exports","ember-composable-helpers/helpers/optional"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"optional",{enumerable:!0,get:function(){return t.optional}})})),define("consul-ui/helpers/or",["exports","ember-truth-helpers/helpers/or"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"or",{enumerable:!0,get:function(){return t.or}})})),define("consul-ui/helpers/page-title",["exports","ember-page-title/helpers/page-title"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -var n=t.default -e.default=n})),define("consul-ui/helpers/percentage-columns-layout",["exports","ember-collection/layouts/percentage-columns"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -var n=Ember.Helper.helper((function(e){return new t.default(e[0],e[1],e[2])})) -e.default=n})),define("consul-ui/helpers/percentage-of",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -var t=Ember.Helper.helper((function([e,t]){const n=e/t*100 -return isNaN(n)?0:n.toFixed(2)})) -e.default=t})),define("consul-ui/helpers/perform",["exports","ember-concurrency/helpers/perform"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/helpers/pipe-action",["exports","ember-composable-helpers/helpers/pipe-action"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/helpers/pipe",["exports","ember-composable-helpers/helpers/pipe"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"pipe",{enumerable:!0,get:function(){return t.pipe}})})),define("consul-ui/helpers/pluralize",["exports","ember-inflector/lib/helpers/pluralize"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -var n=t.default -e.default=n})),define("consul-ui/helpers/policy/datacenters",["exports"],(function(e){function t(e,t={}){const n=Ember.get(e[0],"Datacenters") -return Array.isArray(n)&&0!==n.length?Ember.get(e[0],"Datacenters"):[t.global||"All"]}Object.defineProperty(e,"__esModule",{value:!0}),e.datacenters=t,e.default=void 0 -var n=Ember.Helper.helper(t) -e.default=n})),define("consul-ui/helpers/policy/group",["exports","consul-ui/models/policy"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -var n=Ember.Helper.helper((function([e]){return e.reduce((function(e,n){let r -switch(!0){case Ember.get(n,"ID")===t.MANAGEMENT_ID:r="management" -break -case""!==Ember.get(n,"template"):r="identities" -break -default:r="policies"}return e[r].push(n),e}),{management:[],identities:[],policies:[]})})) -e.default=n})),define("consul-ui/helpers/policy/typeof",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.typeOf=t,e.default=void 0 -function t(e){const t=e[0],n=Ember.get(t,"template") -switch(!0){case void 0===n:return"role" -case"service-identity"===n:return"policy-service-identity" -case"node-identity"===n:return"policy-node-identity" -case"00000000-0000-0000-0000-000000000001"===Ember.get(t,"ID"):return"policy-management" -default:return"policy"}}var n=Ember.Helper.helper(t) -e.default=n})),define("consul-ui/helpers/pow",["exports","ember-math-helpers/helpers/pow"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"pow",{enumerable:!0,get:function(){return t.pow}})})),define("consul-ui/helpers/previous",["exports","ember-composable-helpers/helpers/previous"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"previous",{enumerable:!0,get:function(){return t.previous}})})),define("consul-ui/helpers/queue",["exports","ember-composable-helpers/helpers/queue"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"queue",{enumerable:!0,get:function(){return t.queue}})})),define("consul-ui/helpers/random",["exports","ember-math-helpers/helpers/random"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"random",{enumerable:!0,get:function(){return t.random}})})),define("consul-ui/helpers/range",["exports","ember-composable-helpers/helpers/range"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"range",{enumerable:!0,get:function(){return t.range}})})),define("consul-ui/helpers/reduce",["exports","ember-composable-helpers/helpers/reduce"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/helpers/refresh-route",["exports"],(function(e){var t,n,r -Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -let a=(t=Ember.inject.service("router"),n=class extends Ember.Helper{constructor(...e){var t,n,a,l -super(...e),t=this,n="router",l=this,(a=r)&&Object.defineProperty(t,n,{enumerable:a.enumerable,configurable:a.configurable,writable:a.writable,value:a.initializer?a.initializer.call(l):void 0})}compute(e,t){return()=>{const e=Ember.getOwner(this),t=this.router.currentRoute.name -return e.lookup("route:"+t).refresh()}}},l=n.prototype,s="router",i=[t],o={configurable:!0,enumerable:!0,writable:!0,initializer:null},c={},Object.keys(o).forEach((function(e){c[e]=o[e]})),c.enumerable=!!c.enumerable,c.configurable=!!c.configurable,("value"in c||c.initializer)&&(c.writable=!0),c=i.slice().reverse().reduce((function(e,t){return t(l,s,e)||e}),c),u&&void 0!==c.initializer&&(c.value=c.initializer?c.initializer.call(u):void 0,c.initializer=void 0),void 0===c.initializer&&(Object.defineProperty(l,s,c),c=null),r=c,n) -var l,s,i,o,u,c -e.default=a})),define("consul-ui/helpers/reject-by",["exports","ember-composable-helpers/helpers/reject-by"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/helpers/render-template",["exports"],(function(e){var t,n,r -Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const a=/{{([A-Za-z.0-9_-]+)}}/g -let l,s=(t=Ember.inject.service("encoder"),n=class extends Ember.Helper{constructor(){var e,t,n,s -super(...arguments),e=this,t="encoder",s=this,(n=r)&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(s):void 0}),"function"!=typeof l&&(l=this.encoder.createRegExpEncoder(a,encodeURIComponent,!1))}compute([e,t]){return l(e,t)}},i=n.prototype,o="encoder",u=[t],c={configurable:!0,enumerable:!0,writable:!0,initializer:null},m={},Object.keys(c).forEach((function(e){m[e]=c[e]})),m.enumerable=!!m.enumerable,m.configurable=!!m.configurable,("value"in m||m.initializer)&&(m.writable=!0),m=u.slice().reverse().reduce((function(e,t){return t(i,o,e)||e}),m),d&&void 0!==m.initializer&&(m.value=m.initializer?m.initializer.call(d):void 0,m.initializer=void 0),void 0===m.initializer&&(Object.defineProperty(i,o,m),m=null),r=m,n) -var i,o,u,c,d,m -e.default=s})),define("consul-ui/helpers/repeat",["exports","ember-composable-helpers/helpers/repeat"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"repeat",{enumerable:!0,get:function(){return t.repeat}})})),define("consul-ui/helpers/require",["exports","@lit/reactive-element","consul-ui/utils/path/resolve","consul-ui/components/panel/index.css","consul-ui/components/distribution-meter/index.css","consul-ui/components/distribution-meter/meter/index.css","consul-ui/components/distribution-meter/meter/element","consul-ui/styles/base/decoration/visually-hidden.css","consul-ui/styles/base/icons/base-keyframes.css","consul-ui/styles/base/icons/icons/chevron-down/index.css"],(function(e,t,n,r,a,l,s,i,o,u){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const c={"/components/panel/index.css":r.default,"/components/distribution-meter/index.css":a.default,"/components/distribution-meter/meter/index.css":l.default,"/components/distribution-meter/meter/element":s.default,"/styles/base/decoration/visually-hidden.css":i.default,"/styles/base/icons/base-keyframes.css":o.default,"/styles/base/icons/icons/chevron-down/index.css":u.default},d=new Map -var m=Ember.Helper.helper(([e=""],{from:r})=>{const a=(0,n.default)(r,e) -switch(!0){case a.endsWith(".css"):return c[a](t.css) -default:{if(d.has(a))return d.get(a) -const e=c[a](HTMLElement) -return d.set(a,e),e}}}) -e.default=m})),define("consul-ui/helpers/reverse",["exports","ember-composable-helpers/helpers/reverse"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/helpers/right-trim",["exports","consul-ui/utils/right-trim"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -var n=Ember.Helper.helper((function([e="",n=""]){return(0,t.default)(e,n)})) -e.default=n})),define("consul-ui/helpers/root-url",["exports","ember-router-helpers/helpers/root-url"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"rootUrl",{enumerable:!0,get:function(){return t.rootUrl}})})),define("consul-ui/helpers/round",["exports","ember-math-helpers/helpers/round"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"round",{enumerable:!0,get:function(){return t.round}})})),define("consul-ui/helpers/route-action",["exports","ember-route-action-helper/helpers/route-action"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})) -define("consul-ui/helpers/route-match",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -var t=Ember.Helper.helper((function([e]){switch(["Present","Exact","Prefix","Suffix","Regex"].find(t=>void 0!==e[t])){case"Present":return(e.Invert?"NOT ":"")+"present" -case"Exact":return`${e.Invert?"NOT ":""}exactly matching "${e.Exact}"` -case"Prefix":return`${e.Invert?"NOT ":""}prefixed by "${e.Prefix}"` -case"Suffix":return`${e.Invert?"NOT ":""}suffixed by "${e.Suffix}"` -case"Regex":return`${e.Invert?"NOT ":""}matching the regex "${e.Regex}"`}return""})) -e.default=t})),define("consul-ui/helpers/route-params",["exports","ember-router-helpers/helpers/route-params"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"routeParams",{enumerable:!0,get:function(){return t.routeParams}})})),define("consul-ui/helpers/service/card-permissions",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -var t=Ember.Helper.helper((function([e]){if(""===e.Datacenter)return"empty" -{const t=e.Intention.HasPermissions,n=e.Intention.Allowed,r="specific-intention"===e.Source&&!e.TransparentProxy -switch(!0){case t:return"allow" -case!n&&!t:return"deny" -case n&&r:return"not-defined" -default:return"allow"}}})) -e.default=t})),define("consul-ui/helpers/service/external-source",["exports"],(function(e){function t(e,t){let n=Ember.get(e[0],"ExternalSources.firstObject") -n||(n=Ember.get(e[0],"Meta.external-source")) -const r=void 0===t.prefix?"":t.prefix -if(n&&["consul-api-gateway","vault","kubernetes","terraform","nomad","consul","aws"].includes(n))return`${r}${n}`}Object.defineProperty(e,"__esModule",{value:!0}),e.serviceExternalSource=t,e.default=void 0 -var n=Ember.Helper.helper(t) -e.default=n})),define("consul-ui/helpers/service/health-percentage",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -var t=Ember.Helper.helper((function([e]){const t=e.ChecksCritical+e.ChecksPassing+e.ChecksWarning -return 0===t?"":{passing:Math.round(e.ChecksPassing/t*100),warning:Math.round(e.ChecksWarning/t*100),critical:Math.round(e.ChecksCritical/t*100)}})) -e.default=t})),define("consul-ui/helpers/set",["exports","ember-set-helper/helpers/set"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/helpers/shuffle",["exports","ember-composable-helpers/helpers/shuffle"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"shuffle",{enumerable:!0,get:function(){return t.shuffle}})})),define("consul-ui/helpers/sign",["exports","ember-math-helpers/helpers/sign"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"sign",{enumerable:!0,get:function(){return t.sign}})})),define("consul-ui/helpers/sin",["exports","ember-math-helpers/helpers/sin"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"sin",{enumerable:!0,get:function(){return t.sin}})})),define("consul-ui/helpers/singularize",["exports","ember-inflector/lib/helpers/singularize"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -var n=t.default -e.default=n})),define("consul-ui/helpers/slice",["exports","ember-composable-helpers/helpers/slice"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/helpers/slugify",["exports"],(function(e){function t([e=""]){return e.replace(/ /g,"-").toLowerCase()}Object.defineProperty(e,"__esModule",{value:!0}),e.slugify=t,e.default=void 0 -var n=Ember.Helper.helper(t) -e.default=n})),define("consul-ui/helpers/sort-by",["exports","ember-composable-helpers/helpers/sort-by"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/helpers/split",["exports"],(function(e){function t([e="",t=","]){return e.split(t)}Object.defineProperty(e,"__esModule",{value:!0}),e.split=t,e.default=void 0 -var n=Ember.Helper.helper(t) -e.default=n})),define("consul-ui/helpers/sqrt",["exports","ember-math-helpers/helpers/sqrt"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"sqrt",{enumerable:!0,get:function(){return t.sqrt}})})),define("consul-ui/helpers/state-chart",["exports"],(function(e){var t,n,r -Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -let a=(t=Ember.inject.service("state"),n=class extends Ember.Helper{constructor(...e){var t,n,a,l -super(...e),t=this,n="state",l=this,(a=r)&&Object.defineProperty(t,n,{enumerable:a.enumerable,configurable:a.configurable,writable:a.writable,value:a.initializer?a.initializer.call(l):void 0})}compute([e],t){return this.state.stateChart(e)}},l=n.prototype,s="state",i=[t],o={configurable:!0,enumerable:!0,writable:!0,initializer:null},c={},Object.keys(o).forEach((function(e){c[e]=o[e]})),c.enumerable=!!c.enumerable,c.configurable=!!c.configurable,("value"in c||c.initializer)&&(c.writable=!0),c=i.slice().reverse().reduce((function(e,t){return t(l,s,e)||e}),c),u&&void 0!==c.initializer&&(c.value=c.initializer?c.initializer.call(u):void 0,c.initializer=void 0),void 0===c.initializer&&(Object.defineProperty(l,s,c),c=null),r=c,n) -var l,s,i,o,u,c -e.default=a})),define("consul-ui/helpers/state-matches",["exports"],(function(e){var t,n,r -Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -let a=(t=Ember.inject.service("state"),n=class extends Ember.Helper{constructor(...e){var t,n,a,l -super(...e),t=this,n="state",l=this,(a=r)&&Object.defineProperty(t,n,{enumerable:a.enumerable,configurable:a.configurable,writable:a.writable,value:a.initializer?a.initializer.call(l):void 0})}compute([e,t],n){return this.state.matches(e,t)}},l=n.prototype,s="state",i=[t],o={configurable:!0,enumerable:!0,writable:!0,initializer:null},c={},Object.keys(o).forEach((function(e){c[e]=o[e]})),c.enumerable=!!c.enumerable,c.configurable=!!c.configurable,("value"in c||c.initializer)&&(c.writable=!0),c=i.slice().reverse().reduce((function(e,t){return t(l,s,e)||e}),c),u&&void 0!==c.initializer&&(c.value=c.initializer?c.initializer.call(u):void 0,c.initializer=void 0),void 0===c.initializer&&(Object.defineProperty(l,s,c),c=null),r=c,n) -var l,s,i,o,u,c -e.default=a})),define("consul-ui/helpers/string-char-at",["exports","ember-string-fns/helpers/string-char-at"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"stringCharAt",{enumerable:!0,get:function(){return t.stringCharAt}})})),define("consul-ui/helpers/string-char-code-at",["exports","ember-string-fns/helpers/string-char-code-at"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"stringCharCodeAt",{enumerable:!0,get:function(){return t.stringCharCodeAt}})})),define("consul-ui/helpers/string-code-point-at",["exports","ember-string-fns/helpers/string-code-point-at"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"stringCodePointAt",{enumerable:!0,get:function(){return t.stringCodePointAt}})})),define("consul-ui/helpers/string-concat",["exports","ember-string-fns/helpers/string-concat"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"stringConcat",{enumerable:!0,get:function(){return t.stringConcat}})})),define("consul-ui/helpers/string-ends-with",["exports","ember-string-fns/helpers/string-ends-with"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"stringEndsWith",{enumerable:!0,get:function(){return t.stringEndsWith}})})),define("consul-ui/helpers/string-equals",["exports","ember-string-fns/helpers/string-equals"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"stringEquals",{enumerable:!0,get:function(){return t.stringEquals}})})),define("consul-ui/helpers/string-from-char-code",["exports","ember-string-fns/helpers/string-from-char-code"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"stringFromCharCode",{enumerable:!0,get:function(){return t.stringFromCharCode}})})),define("consul-ui/helpers/string-from-code-point",["exports","ember-string-fns/helpers/string-from-code-point"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"stringFromCodePoint",{enumerable:!0,get:function(){return t.stringFromCodePoint}})})),define("consul-ui/helpers/string-html-safe",["exports"],(function(e){function t([e=""]){return Ember.String.htmlSafe(e)}Object.defineProperty(e,"__esModule",{value:!0}),e.stringHtmlSafe=t,e.default=void 0 -var n=Ember.Helper.helper(t) -e.default=n})),define("consul-ui/helpers/string-includes",["exports","ember-string-fns/helpers/string-includes"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"stringIncludes",{enumerable:!0,get:function(){return t.stringIncludes}})})),define("consul-ui/helpers/string-index-of",["exports","ember-string-fns/helpers/string-index-of"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"stringIndexOf",{enumerable:!0,get:function(){return t.stringIndexOf}})})),define("consul-ui/helpers/string-last-index-of",["exports","ember-string-fns/helpers/string-last-index-of"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"stringLastIndexOf",{enumerable:!0,get:function(){return t.stringLastIndexOf}})})),define("consul-ui/helpers/string-not-equals",["exports","ember-string-fns/helpers/string-not-equals"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"stringNotEquals",{enumerable:!0,get:function(){return t.stringNotEquals}})})) -define("consul-ui/helpers/string-pad-end",["exports","ember-string-fns/helpers/string-pad-end"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"stringPadEnd",{enumerable:!0,get:function(){return t.stringPadEnd}})})),define("consul-ui/helpers/string-pad-start",["exports","ember-string-fns/helpers/string-pad-start"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"stringPadStart",{enumerable:!0,get:function(){return t.stringPadStart}})})),define("consul-ui/helpers/string-repeat",["exports","ember-string-fns/helpers/string-repeat"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"stringRepeat",{enumerable:!0,get:function(){return t.stringRepeat}})})),define("consul-ui/helpers/string-replace-all",["exports","ember-string-fns/helpers/string-replace-all"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"stringReplaceAll",{enumerable:!0,get:function(){return t.stringReplaceAll}})})),define("consul-ui/helpers/string-replace",["exports","ember-string-fns/helpers/string-replace"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"stringReplace",{enumerable:!0,get:function(){return t.stringReplace}})})),define("consul-ui/helpers/string-slice",["exports","ember-string-fns/helpers/string-slice"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"stringSlice",{enumerable:!0,get:function(){return t.stringSlice}})})),define("consul-ui/helpers/string-split",["exports","ember-string-fns/helpers/string-split"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"stringSplit",{enumerable:!0,get:function(){return t.stringSplit}})})),define("consul-ui/helpers/string-starts-with",["exports","ember-string-fns/helpers/string-starts-with"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"stringStartsWith",{enumerable:!0,get:function(){return t.stringStartsWith}})})),define("consul-ui/helpers/string-substring",["exports","ember-string-fns/helpers/string-substring"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"stringSubstring",{enumerable:!0,get:function(){return t.stringSubstring}})})),define("consul-ui/helpers/string-to-camel-case",["exports","ember-string-fns/helpers/string-to-camel-case"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"stringToCamelCase",{enumerable:!0,get:function(){return t.stringToCamelCase}})})),define("consul-ui/helpers/string-to-kebab-case",["exports","ember-string-fns/helpers/string-to-kebab-case"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"stringToKebabCase",{enumerable:!0,get:function(){return t.stringToKebabCase}})})),define("consul-ui/helpers/string-to-lower-case",["exports","ember-string-fns/helpers/string-to-lower-case"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"stringToLowerCase",{enumerable:!0,get:function(){return t.stringToLowerCase}})})),define("consul-ui/helpers/string-to-pascal-case",["exports","ember-string-fns/helpers/string-to-pascal-case"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"stringToPascalCase",{enumerable:!0,get:function(){return t.stringToPascalCase}})})),define("consul-ui/helpers/string-to-sentence-case",["exports","ember-string-fns/helpers/string-to-sentence-case"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"stringToSentenceCase",{enumerable:!0,get:function(){return t.stringToSentenceCase}})})),define("consul-ui/helpers/string-to-snake-case",["exports","ember-string-fns/helpers/string-to-snake-case"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"stringToSnakeCase",{enumerable:!0,get:function(){return t.stringToSnakeCase}})})),define("consul-ui/helpers/string-to-title-case",["exports","ember-string-fns/helpers/string-to-title-case"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"stringToTitleCase",{enumerable:!0,get:function(){return t.stringToTitleCase}})})),define("consul-ui/helpers/string-to-upper-case",["exports","ember-string-fns/helpers/string-to-upper-case"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"stringToUpperCase",{enumerable:!0,get:function(){return t.stringToUpperCase}})})),define("consul-ui/helpers/string-trim-end",["exports","ember-string-fns/helpers/string-trim-end"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"stringTrimEnd",{enumerable:!0,get:function(){return t.stringTrimEnd}})})),define("consul-ui/helpers/string-trim-start",["exports","ember-string-fns/helpers/string-trim-start"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"stringTrimStart",{enumerable:!0,get:function(){return t.stringTrimStart}})})),define("consul-ui/helpers/string-trim",["exports","ember-string-fns/helpers/string-trim"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"stringTrim",{enumerable:!0,get:function(){return t.stringTrim}})})),define("consul-ui/helpers/style-map",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -var t=Ember.Helper.helper(e=>{const t=e.reduce((e,[t,n,r=""])=>null==n?e:`${e}${t}:${n.toString()}${r};`,"") -return t.length>0?t:void 0}) -e.default=t})),define("consul-ui/helpers/sub",["exports","ember-math-helpers/helpers/sub"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"sub",{enumerable:!0,get:function(){return t.sub}})})),define("consul-ui/helpers/substr",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -var t=Ember.Helper.helper((function([e="",t=0,n]){return e.substr(t,n)})) -e.default=t})),define("consul-ui/helpers/svg-curve",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -var t=Ember.Helper.helper((function([e],t){const n=t.src||{x:0,y:0},r=t.type||"cubic" -let a=[e,{x:(n.x+e.x)/2,y:n.y}] -return"cubic"===r&&a.push({x:a[1].x,y:e.y}),`${l=n,`\n M ${l.x} ${l.y}\n `}${function(){const e=[...arguments] -return`${arguments.length>2?"C":"Q"} ${e.concat(e.shift()).map(e=>Object.values(e).join(" ")).join(",")}`}(...a)}` -var l})) -e.default=t})),define("consul-ui/helpers/t",["exports","ember-intl/helpers/t"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/helpers/take",["exports","ember-composable-helpers/helpers/take"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/helpers/tan",["exports","ember-math-helpers/helpers/tan"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"tan",{enumerable:!0,get:function(){return t.tan}})})),define("consul-ui/helpers/tanh",["exports","ember-math-helpers/helpers/tanh"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"tanh",{enumerable:!0,get:function(){return t.tanh}})})),define("consul-ui/helpers/task",["exports","ember-concurrency/helpers/task"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/helpers/temporal-format",["exports"],(function(e){var t,n,r -Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -let a=(t=Ember.inject.service("temporal"),n=class extends Ember.Helper{constructor(...e){var t,n,a,l -super(...e),t=this,n="temporal",l=this,(a=r)&&Object.defineProperty(t,n,{enumerable:a.enumerable,configurable:a.configurable,writable:a.writable,value:a.initializer?a.initializer.call(l):void 0})}compute([e],t){return this.temporal.format(e,t)}},l=n.prototype,s="temporal",i=[t],o={configurable:!0,enumerable:!0,writable:!0,initializer:null},c={},Object.keys(o).forEach((function(e){c[e]=o[e]})),c.enumerable=!!c.enumerable,c.configurable=!!c.configurable,("value"in c||c.initializer)&&(c.writable=!0),c=i.slice().reverse().reduce((function(e,t){return t(l,s,e)||e}),c),u&&void 0!==c.initializer&&(c.value=c.initializer?c.initializer.call(u):void 0,c.initializer=void 0),void 0===c.initializer&&(Object.defineProperty(l,s,c),c=null),r=c,n) -var l,s,i,o,u,c -e.default=a})) -define("consul-ui/helpers/temporal-within",["exports"],(function(e){var t,n,r -Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -let a=(t=Ember.inject.service("temporal"),n=class extends Ember.Helper{constructor(...e){var t,n,a,l -super(...e),t=this,n="temporal",l=this,(a=r)&&Object.defineProperty(t,n,{enumerable:a.enumerable,configurable:a.configurable,writable:a.writable,value:a.initializer?a.initializer.call(l):void 0})}compute(e,t){return this.temporal.within(e,t)}},l=n.prototype,s="temporal",i=[t],o={configurable:!0,enumerable:!0,writable:!0,initializer:null},c={},Object.keys(o).forEach((function(e){c[e]=o[e]})),c.enumerable=!!c.enumerable,c.configurable=!!c.configurable,("value"in c||c.initializer)&&(c.writable=!0),c=i.slice().reverse().reduce((function(e,t){return t(l,s,e)||e}),c),u&&void 0!==c.initializer&&(c.value=c.initializer?c.initializer.call(u):void 0,c.initializer=void 0),void 0===c.initializer&&(Object.defineProperty(l,s,c),c=null),r=c,n) -var l,s,i,o,u,c -e.default=a})),define("consul-ui/helpers/test",["exports","consul-ui/helpers/can","consul-ui/helpers/is"],(function(e,t,n){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -class r extends t.default{compute([e,t],r){switch(!0){case e.startsWith("can "):return super.compute([e.substr(4),t],r) -case e.startsWith("is "):return(0,n.is)(this,[e.substr(3),t],r)}throw new Error(e+" is not supported by the 'test' helper.")}}e.default=r})),define("consul-ui/helpers/titleize",["exports","ember-cli-string-helpers/helpers/titleize"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"titleize",{enumerable:!0,get:function(){return t.titleize}})})),define("consul-ui/helpers/to-hash",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -var t=Ember.Helper.helper(([e=[],t])=>(Array.isArray(e)||(e=e.toArray()),e.reduce((e,n)=>(e[Ember.get(n,t)]=n,e),{}))) -e.default=t})),define("consul-ui/helpers/to-route",["exports"],(function(e){var t,n,r,a,l -function s(e,t,n,r){n&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(r):void 0})}function i(e,t,n,r,a){var l={} -return Object.keys(r).forEach((function(e){l[e]=r[e]})),l.enumerable=!!l.enumerable,l.configurable=!!l.configurable,("value"in l||l.initializer)&&(l.writable=!0),l=n.slice().reverse().reduce((function(n,r){return r(e,t,n)||n}),l),a&&void 0!==l.initializer&&(l.value=l.initializer?l.initializer.call(a):void 0,l.initializer=void 0),void 0===l.initializer&&(Object.defineProperty(e,t,l),l=null),l}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -let o=(t=Ember.inject.service("router"),n=Ember.inject.service("env"),r=class extends Ember.Helper{constructor(...e){super(...e),s(this,"router",a,this),s(this,"env",l,this)}compute([e]){return this.router.recognize(`${this.env.var("rootURL")}${e}`).name}},a=i(r.prototype,"router",[t],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),l=i(r.prototype,"env",[n],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),r) -e.default=o})),define("consul-ui/helpers/toggle-action",["exports","ember-composable-helpers/helpers/toggle-action"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/helpers/toggle",["exports","ember-composable-helpers/helpers/toggle"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"toggle",{enumerable:!0,get:function(){return t.toggle}})})),define("consul-ui/helpers/token/is-anonymous",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.isAnonymous=t,e.default=void 0 -function t(e){return"00000000-0000-0000-0000-000000000002"===Ember.get(e[0],"AccessorID")}var n=Ember.Helper.helper(t) -e.default=n})),define("consul-ui/helpers/token/is-legacy",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.isLegacy=n,e.default=void 0 -const t=function(e){const t=Ember.get(e,"Rules") -if(null!=t)return""!==t.trim() -const n=Ember.get(e,"Legacy") -return void 0!==n&&n} -function n(e){const n=e[0] -return void 0!==n.length?n.find((function(e){return t(e)})):t(n)}var r=Ember.Helper.helper(n) -e.default=r})),define("consul-ui/helpers/transition-to",["exports","ember-router-helpers/helpers/transition-to"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"transitionTo",{enumerable:!0,get:function(){return t.transitionTo}})})),define("consul-ui/helpers/trim",["exports","ember-cli-string-helpers/helpers/trim"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"trim",{enumerable:!0,get:function(){return t.trim}})})),define("consul-ui/helpers/trunc",["exports","ember-math-helpers/helpers/trunc"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"trunc",{enumerable:!0,get:function(){return t.trunc}})})),define("consul-ui/helpers/truncate",["exports","ember-cli-string-helpers/helpers/truncate"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"truncate",{enumerable:!0,get:function(){return t.truncate}})})),define("consul-ui/helpers/tween-to",["exports"],(function(e){var t,n,r -Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -let a=(t=Ember.inject.service("ticker"),n=class extends Ember.Helper{constructor(...e){var t,n,a,l -super(...e),t=this,n="ticker",l=this,(a=r)&&Object.defineProperty(t,n,{enumerable:a.enumerable,configurable:a.configurable,writable:a.writable,value:a.initializer?a.initializer.call(l):void 0})}compute([e,t],n){return this.ticker.tweenTo(e,t)}},l=n.prototype,s="ticker",i=[t],o={configurable:!0,enumerable:!0,writable:!0,initializer:null},c={},Object.keys(o).forEach((function(e){c[e]=o[e]})),c.enumerable=!!c.enumerable,c.configurable=!!c.configurable,("value"in c||c.initializer)&&(c.writable=!0),c=i.slice().reverse().reduce((function(e,t){return t(l,s,e)||e}),c),u&&void 0!==c.initializer&&(c.value=c.initializer?c.initializer.call(u):void 0,c.initializer=void 0),void 0===c.initializer&&(Object.defineProperty(l,s,c),c=null),r=c,n) -var l,s,i,o,u,c -e.default=a})),define("consul-ui/helpers/underscore",["exports","ember-cli-string-helpers/helpers/underscore"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"underscore",{enumerable:!0,get:function(){return t.underscore}})})),define("consul-ui/helpers/union",["exports","ember-composable-helpers/helpers/union"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/helpers/uniq-by",["exports"],(function(e){function t([e,t]){return Ember.isEmpty(e)?[]:Ember.A(t).uniqBy(e)}Object.defineProperty(e,"__esModule",{value:!0}),e.uniqBy=t,e.default=void 0 -var n=Ember.Helper.helper(t) -e.default=n})),define("consul-ui/helpers/unique-id",["exports"],(function(e){var t,n,r -Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -let a=(t=Ember.inject.service("dom"),n=class extends Ember.Helper{constructor(...e){var t,n,a,l -super(...e),t=this,n="dom",l=this,(a=r)&&Object.defineProperty(t,n,{enumerable:a.enumerable,configurable:a.configurable,writable:a.writable,value:a.initializer?a.initializer.call(l):void 0})}compute(e,t){return this.dom.guid({})}},l=n.prototype,s="dom",i=[t],o={configurable:!0,enumerable:!0,writable:!0,initializer:null},c={},Object.keys(o).forEach((function(e){c[e]=o[e]})),c.enumerable=!!c.enumerable,c.configurable=!!c.configurable,("value"in c||c.initializer)&&(c.writable=!0),c=i.slice().reverse().reduce((function(e,t){return t(l,s,e)||e}),c),u&&void 0!==c.initializer&&(c.value=c.initializer?c.initializer.call(u):void 0,c.initializer=void 0),void 0===c.initializer&&(Object.defineProperty(l,s,c),c=null),r=c,n) -var l,s,i,o,u,c -e.default=a})),define("consul-ui/helpers/uppercase",["exports","ember-cli-string-helpers/helpers/uppercase"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"uppercase",{enumerable:!0,get:function(){return t.uppercase}})})),define("consul-ui/helpers/uri",["exports"],(function(e){var t,n,r,a,l -function s(e,t,n,r){n&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(r):void 0})}function i(e,t,n,r,a){var l={} -return Object.keys(r).forEach((function(e){l[e]=r[e]})),l.enumerable=!!l.enumerable,l.configurable=!!l.configurable,("value"in l||l.initializer)&&(l.writable=!0),l=n.slice().reverse().reduce((function(n,r){return r(e,t,n)||n}),l),a&&void 0!==l.initializer&&(l.value=l.initializer?l.initializer.call(a):void 0,l.initializer=void 0),void 0===l.initializer&&(Object.defineProperty(e,t,l),l=null),l}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const o=/\${([A-Za-z.0-9_-]+)}/g -let u,c=(t=Ember.inject.service("encoder"),n=Ember.inject.service("data-source/service"),r=class extends Ember.Helper{constructor(){super(...arguments),s(this,"encoder",a,this),s(this,"data",l,this),"function"!=typeof u&&(u=this.encoder.createRegExpEncoder(o,encodeURIComponent))}compute([e,t]){return this.data.uri(u(e,t))}},a=i(r.prototype,"encoder",[t],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),l=i(r.prototype,"data",[n],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),r) -e.default=c})),define("consul-ui/helpers/url-for",["exports","ember-router-helpers/helpers/url-for"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"urlFor",{enumerable:!0,get:function(){return t.urlFor}})})),define("consul-ui/helpers/values",["exports","ember-composable-helpers/helpers/values"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"values",{enumerable:!0,get:function(){return t.values}})})),define("consul-ui/helpers/w",["exports","ember-cli-string-helpers/helpers/w"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"w",{enumerable:!0,get:function(){return t.w}})})),define("consul-ui/helpers/will-destroy",["exports","ember-render-helpers/helpers/will-destroy"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/helpers/without",["exports","ember-composable-helpers/helpers/without"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"without",{enumerable:!0,get:function(){return t.without}})})),define("consul-ui/helpers/xor",["exports","ember-truth-helpers/helpers/xor"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"xor",{enumerable:!0,get:function(){return t.xor}})})),define("consul-ui/initializers/app-version",["exports","ember-cli-app-version/initializer-factory","consul-ui/config/environment"],(function(e,t,n){let r,a -Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0,n.default.APP&&(r=n.default.APP.name,a=n.default.APP.version) -var l={name:"App Version",initialize:(0,t.default)(r,a)} -e.default=l})),define("consul-ui/initializers/container-debug-adapter",["exports","ember-resolver/resolvers/classic/container-debug-adapter"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -var n={name:"container-debug-adapter",initialize(){let e=arguments[1]||arguments[0] -e.register("container-debug-adapter:main",t.default),e.inject("container-debug-adapter:main","namespace","application:main")}} -e.default=n})),define("consul-ui/initializers/ember-data-data-adapter",["exports","@ember-data/debug/setup"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/initializers/ember-data",["exports","ember-data","ember-data/setup-container"],(function(e,t,n){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -var r={name:"ember-data",initialize:n.default} -e.default=r})) -define("consul-ui/initializers/export-application-global",["exports","consul-ui/config/environment"],(function(e,t){function n(){var e=arguments[1]||arguments[0] -if(!1!==t.default.exportApplicationGlobal){var n -if("undefined"!=typeof window)n=window -else if("undefined"!=typeof global)n=global -else{if("undefined"==typeof self)return -n=self}var r,a=t.default.exportApplicationGlobal -r="string"==typeof a?a:Ember.String.classify(t.default.modulePrefix),n[r]||(n[r]=e,e.reopen({willDestroy:function(){this._super.apply(this,arguments),delete n[r]}}))}}Object.defineProperty(e,"__esModule",{value:!0}),e.initialize=n,e.default=void 0 -var r={name:"export-application-global",initialize:n} -e.default=r})),define("consul-ui/initializers/flash-messages",["exports","consul-ui/config/environment","ember-cli-flash/utils/flash-message-options"],(function(e,t,n){Object.defineProperty(e,"__esModule",{value:!0}),e.initialize=r,e.default=void 0 -function r(){const e=arguments[1]||arguments[0],{flashMessageDefaults:r}=t.default||{},{injectionFactories:a}=r||[],l=(0,n.default)(r) -a&&a.length -l.injectionFactories.forEach(t=>{e.inject(t,"flashMessages","service:flash-messages")})}var a={name:"flash-messages",initialize:r} -e.default=a})),define("consul-ui/initializers/initialize-torii-callback",["exports","consul-ui/config/environment","torii/redirect-handler"],(function(e,t,n){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -var r={name:"torii-callback",before:"torii",initialize(e){arguments[1]&&(e=arguments[1]),t.default.torii&&t.default.torii.disableRedirectInitializer||(e.deferReadiness(),n.default.handle(window).catch((function(){e.advanceReadiness()})))}} -e.default=r})),define("consul-ui/initializers/initialize-torii-session",["exports","torii/bootstrap/session","torii/configuration"],(function(e,t,n){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -var r={name:"torii-session",after:"torii",initialize(e){arguments[1]&&(e=arguments[1]) -const r=(0,n.getConfiguration)() -if(r.sessionServiceName){(0,t.default)(e,r.sessionServiceName) -var a="service:"+r.sessionServiceName -e.inject("adapter",r.sessionServiceName,a)}}} -e.default=r})),define("consul-ui/initializers/initialize-torii",["exports","torii/bootstrap/torii","torii/configuration","consul-ui/config/environment"],(function(e,t,n,r){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -var a={name:"torii",initialize(e){arguments[1]&&(e=arguments[1]),(0,n.configure)(r.default.torii||{}),(0,t.default)(e),e.inject("route","torii","service:torii")}} -e.default=a})),define("consul-ui/initializers/model-fragments",["exports","ember-data-model-fragments","ember-data-model-fragments/ext"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -var t={name:"fragmentTransform",after:"ember-data",initialize(){}} -e.default=t})),define("consul-ui/initializers/setup-ember-can",["exports","ember-can/initializers/setup-ember-can"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"initialize",{enumerable:!0,get:function(){return t.initialize}})})),define("consul-ui/initializers/viewport-config",["exports","ember-in-viewport/initializers/viewport-config"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"initialize",{enumerable:!0,get:function(){return t.initialize}})})),define("consul-ui/instance-initializers/container",["exports","require","deepmerge"],(function(e,t,n){Object.defineProperty(e,"__esModule",{value:!0}),e.default=e.services=void 0 -const r=document,a=n.default.all([...r.querySelectorAll("script[data-services]")].map(e=>JSON.parse(e.dataset.services))) -e.services=a -var l={name:"container",initialize(e){(function(e,n){Object.entries(n).forEach(([n,r])=>{switch(!0){case"string"==typeof r.class:if(!t.default.has(r.class))throw new Error(`Unable to locate '${r.class}'`) -e.register(n.replace("auth-provider:","torii-provider:"),(0,t.default)(r.class).default)}})})(e,a) -const n=e.lookup("service:container") -let r=n.get("container-debug-adapter:main").catalogEntriesByType("service").filter(e=>e.startsWith("repository/")||"ui-config"===e) -r.push("repository/service"),r.forEach(e=>{const t="service:"+e -n.set(t,n.resolveRegistration(t))})}} -e.default=l})),define("consul-ui/instance-initializers/ember-data",["exports","ember-data/initialize-store-service"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -var n={name:"ember-data",initialize:t.default} -e.default=n})),define("consul-ui/instance-initializers/href-to",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=e.HrefTo=void 0 -class t{constructor(e,t){this.applicationInstance=e,this.target=t -const n=this.target.attributes.href -this.url=n&&n.value}handle(e){this.shouldHandle(e)&&(e.preventDefault(),this.applicationInstance.lookup("router:main").location.transitionTo(this.url))}shouldHandle(e){return this.isUnmodifiedLeftClick(e)&&!this.isIgnored(this.target)&&!this.isExternal(this.target)&&!this.hasActionHelper(this.target)&&!this.hasDownload(this.target)&&!this.isLinkComponent(this.target)}isUnmodifiedLeftClick(e){return!(void 0!==e.which&&1!==e.which||e.ctrlKey||e.metaKey)}isExternal(e){return"_blank"===e.getAttribute("target")}isIgnored(e){return e.dataset.nativeHref}hasActionHelper(e){return e.dataset.emberAction}hasDownload(e){return e.hasAttribute("download")}isLinkComponent(e){let t=!1 -const n=e.id -if(n){const e=this.applicationInstance.lookup("-view-registry:main")[n] -t=e&&e instanceof Ember.LinkComponent}return t}recognizeUrl(e){let t=!1 -if(e){const n=this._getRouter(),r=this._getRootUrl(),a=0===e.indexOf(r),l=this.getUrlWithoutRoot(),s=n._router._routerMicrolib||n._router.router -t=a&&s.recognizer.recognize(l)}return t}getUrlWithoutRoot(){const e=this.applicationInstance.lookup("router:main").location -let t=e.getURL.apply({getHash:()=>"",location:{pathname:this.url},baseURL:e.baseURL,rootURL:e.rootURL,env:e.env},[]) -const n=t.indexOf("?") -return-1!==n&&(t=t.substr(0,n-1)),t}_getRouter(){return this.applicationInstance.lookup("service:router")}_getRootUrl(){let e=this._getRouter().get("rootURL") -return"/"!==e.charAt(e.length-1)&&(e+="/"),e}}e.HrefTo=t -var n={name:"href-to",initialize(e){if("undefined"==typeof FastBoot){const n=e.lookup("service:dom").document(),r=n=>{const r="A"===n.target.tagName?n.target:function(e){if(e.closest)return e.closest("a") -for(e=e.parentElement;e&&"A"!==e.tagName;)e=e.parentElement -return e}(n.target) -if(r){new t(e,r).handle(n)}} -n.body.addEventListener("click",r),e.reopen({willDestroy(){return n.body.removeEventListener("click",r),this._super(...arguments)}})}}} -e.default=n})),define("consul-ui/instance-initializers/ivy-codemirror",["exports"],(function(e){function t(e){const t=e.application.name,n=e.lookup("service:-document"),r=new Map(Object.entries(JSON.parse(n.querySelector(`[data-${t}-fs]`).textContent))) -CodeMirror.modeURL={replace:function(e,t){switch(t.trim()){case"javascript":return r.get(["codemirror","mode","javascript","javascript.js"].join("/")) -case"ruby":return r.get(["codemirror","mode","ruby","ruby.js"].join("/")) -case"yaml":return r.get(["codemirror","mode","yaml","yaml.js"].join("/")) -case"xml":return r.get(["codemirror","mode","xml","xml.js"].join("/"))}}} -e.resolveRegistration("component:ivy-codemirror").reopen({attributeBindings:["name"]})}Object.defineProperty(e,"__esModule",{value:!0}),e.initialize=t,e.default=void 0 -var n={initialize:t} -e.default=n})),define("consul-ui/instance-initializers/selection",["exports","consul-ui/env"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -var n={name:"selection",initialize(e){if((0,t.env)("CONSUL_UI_DISABLE_ANCHOR_SELECTION"))return -const n=e.lookup("service:dom"),r=n.document(),a=r.getElementsByTagName("html")[0],l=function(e){return"A"===e.tagName?e:n.closest("a",e)},s=function(e){if(a.classList.contains("is-debug"))return -const t=l(e.target) -if(t){if(void 0!==e.button&&2===e.button){const e=t.dataset.href -return void(e&&t.setAttribute("href",e))}const n=t.getAttribute("href") -n&&(t.dataset.href=n,t.removeAttribute("href"))}},i=function(e){if(a.classList.contains("is-debug"))return -const t=l(e.target) -if(t){const n=t.dataset.href -!function(t=window){const n=t.getSelection() -let r=!1 -try{r="isCollapsed"in n&&!n.isCollapsed&&n.toString().length>1}catch(e){}return r}()&&n&&t.setAttribute("href",n)}} -r.body.addEventListener("mousedown",s),r.body.addEventListener("mouseup",i),e.reopen({willDestroy:function(){return r.body.removeEventListener("mousedown",s),r.body.removeEventListener("mouseup",i),this._super(...arguments)}})}} -e.default=n})),define("consul-ui/instance-initializers/setup-routes",["exports","torii/bootstrap/routing","torii/configuration","torii/compat/get-router-instance","torii/compat/get-router-lib","torii/router-dsl-ext"],(function(e,t,n,r,a){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -var l={name:"torii-setup-routes",initialize(e){if(!(0,n.getConfiguration)().sessionServiceName)return -let l=(0,r.default)(e) -var s=function(){var n=(0,a.default)(l).authenticatedRoutes -!Ember.isEmpty(n)&&(0,t.default)(e,n),l.off("willTransition",s)} -l.on("willTransition",s)}} -e.default=l})),define("consul-ui/instance-initializers/walk-providers",["exports","torii/lib/container-utils","torii/configuration"],(function(e,t,n){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -var r={name:"torii-walk-providers",initialize(e){let r=(0,n.getConfiguration)() -for(var a in r.providers)r.providers.hasOwnProperty(a)&&(0,t.lookup)(e,"torii-provider:"+a)}} -e.default=r})),define("consul-ui/locations/fsm-with-optional-test",["exports","consul-ui/locations/fsm-with-optional","consul-ui/locations/fsm","@ember/test-helpers"],(function(e,t,n,r){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -class a extends t.default{static create(){return new this(...arguments)}constructor(){var e,t,r -super(...arguments),r="fsm-with-optional-test",(t="implementation")in(e=this)?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,this.location=new n.Location,this.machine=new n.FSM(this.location),this.doc={defaultView:{addEventListener:(e,t)=>{this.machine=new n.FSM(this.location,t)},removeEventListener:()=>{this.machine=new n.FSM}}}}visit(e){const t=this.container,n=this.container.lookup("router:main"),a=async()=>(await(0,r.settled)(),new Promise(e=>setTimeout(e(t),0))),l=e=>{if(e.error)throw e.error -if("TransitionAborted"===e.name&&n._routerMicrolib.activeTransition)return n._routerMicrolib.activeTransition.then(a,l) -throw"TransitionAborted"===e.name?new Error(e.message):e} -return""===this.location.pathname?(this.rootURL=n.rootURL.replace(/\/$/,""),this.machine.state.path=this.location.pathname=`${this.rootURL}${e}`,this.path=this.getURL(),t.handleURL(""+this.path).then(a,l)):this.transitionTo(e).then(a,l)}}e.default=a})),define("consul-ui/locations/fsm-with-optional",["exports","consul-ui/env"],(function(e,t){function n(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const r={};(0,t.env)("CONSUL_PARTITIONS_ENABLED")&&(r.partition=/^_([a-zA-Z0-9]([a-zA-Z0-9-]{0,62}[a-zA-Z0-9])?)$/),(0,t.env)("CONSUL_NSPACES_ENABLED")&&(r.nspace=/^~([a-zA-Z0-9]([a-zA-Z0-9-]{0,62}[a-zA-Z0-9])?)$/) -const a=/\/$/,l=function(e){const t=e.state.path,n=this.getURLForTransition(t) -if(n===this._previousURL){if(t===this._previousPath)return -this._previousPath=e.state.path,this.container.lookup("route:application").refresh()}"function"==typeof this.callback&&this.callback(n),this._previousURL=n,this._previousPath=e.state.path} -e.default=class{static create(){return new this(...arguments)}constructor(e,t,r){n(this,"implementation","fsm-with-optional"),n(this,"baseURL",""),n(this,"rootURL","/"),n(this,"path","/"),n(this,"cancelRouterSetup",!1),n(this,"optional",{}),this.container=Object.entries(e)[0][1],this.route=l.bind(this),this.doc=void 0===t?this.container.lookup("service:-document"):t,this.env=void 0===r?this.container.lookup("service:env"):r -const a=this.doc.querySelector("base[href]") -null!==a&&(this.baseURL=a.getAttribute("href"))}initState(){this.location=this.location||this.doc.defaultView.location,this.machine=this.machine||this.doc.defaultView.history,this.doc.defaultView.addEventListener("popstate",this.route) -const e=this.machine.state,t=this.getURL(),n=this.formatURL(t) -e&&e.path===n?(this._previousPath=n,this._previousURL=t):this.dispatch("replace",n)}getURLFrom(e){return e=e||this.location.pathname,this.rootURL=this.rootURL.replace(a,""),this.baseURL=this.baseURL.replace(a,""),e.replace(new RegExp(`^${this.baseURL}(?=/|$)`),"").replace(new RegExp(`^${this.rootURL}(?=/|$)`),"")}getURLForTransition(e){return this.optional={},e=this.getURLFrom(e).split("/").filter((e,t)=>{if(t<3){let t=!1 -return Object.entries(r).reduce((n,[r,a])=>{const l=a.exec(e) -return null!==l&&(n[r]={value:e,match:l[1]},t=!0),n},this.optional),!t}return!0}).join("/")}optionalParams(){let e=this.optional||{} -return["partition","nspace"].reduce((t,n)=>{let r="" -return void 0!==e[n]&&(r=e[n].match),t[n]=r,t},{})}visit(){return this.transitionTo(...arguments)}hrefTo(e,n,r){void 0!==r.dc&&delete r.dc,void 0!==r.nspace&&(r.nspace="~"+r.nspace),void 0!==r.partition&&(r.partition="_"+r.partition),void 0===this.router&&(this.router=this.container.lookup("router:main")) -let a=!0 -switch(!0){case"settings"===e:case e.startsWith("docs."):a=!1}if(this.router.currentRouteName.startsWith("docs.")&&(n.unshift((0,t.env)("CONSUL_DATACENTER_PRIMARY")),e.startsWith("dc")))return`console://${e} <= ${JSON.stringify(n)}` -const l=this.router._routerMicrolib -let s -try{s=l.generate(e,...n,{queryParams:{}})}catch(i){n=Object.values(l.oldState.params).reduce((e,t)=>e.concat(Object.keys(t).length>0?t:[]),[]),s=l.generate(e,...n)}return this.formatURL(s,r,a)}transitionTo(e){if(this.router.currentRouteName.startsWith("docs")&&e.startsWith("console://"))return console.info("location.transitionTo: "+e.substr(10)),!0 -const t=Object.entries(this.optionalParams()),n=this.getURLForTransition(e) -if(this._previousURL===n)return this.dispatch("push",e),Promise.resolve() -{const r=this.optionalParams() -return t.some(([e,t])=>r[e]!==t)&&this.dispatch("push",e),this.container.lookup("router:main").transitionTo(n)}}getURL(){const e=this.location.search||"" -let t="" -void 0!==this.location.hash&&(t=this.location.hash.substr(0)) -return`${this.getURLForTransition(this.location.pathname)}${e}${t}`}formatURL(e,t,n=!0){if(""!==e?(this.rootURL=this.rootURL.replace(a,""),this.baseURL=this.baseURL.replace(a,"")):"/"===this.baseURL[0]&&"/"===this.rootURL[0]&&(this.baseURL=this.baseURL.replace(a,"")),n){const n=e.split("/") -0===Object.keys(t||{}).length&&(t=void 0),t=(t=Object.values(t||this.optional||{})).filter(e=>Boolean(e)).map(e=>e.value||e,[]),n.splice(...[1,0].concat(t)),e=n.join("/")}return`${this.baseURL}${this.rootURL}${e}`}changeURL(e,t){this.path=t -const n=this.machine.state -t=this.formatURL(t),n&&n.path===t||this.dispatch(e,t)}setURL(e){this.changeURL("push",e)}replaceURL(e){this.changeURL("replace",e)}onUpdateURL(e){this.callback=e}dispatch(e,t){const n={path:t,uuid:"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,e=>{const t=16*Math.random()|0 -return("x"===e?t:3&t|8).toString(16)})} -this.machine[e+"State"](n,null,t),this.route({state:n})}willDestroy(){this.doc.defaultView.removeEventListener("popstate",this.route)}}})),define("consul-ui/locations/fsm",["exports"],(function(e){function t(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}Object.defineProperty(e,"__esModule",{value:!0}),e.default=e.Location=e.FSM=void 0 -e.FSM=class{constructor(e,n=(()=>{})){t(this,"state",{}),this.listener=n,this.location=e}pushState(e,t,n){this.state=e,this.location.pathname=n,this.listener({state:this.state})}replaceState(){return this.pushState(...arguments)}} -e.Location=class{constructor(){t(this,"pathname",""),t(this,"search",""),t(this,"hash","")}} -e.default=class{static create(){return new this(...arguments)}constructor(e){t(this,"implementation","fsm"),this.container=Object.entries(e)[0][1]}visit(){return this.transitionTo(...arguments)}hrefTo(){}transitionTo(){}}})),define("consul-ui/machines/boolean.xstate",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -e.default={id:"boolean",initial:"false",states:{true:{on:{TOGGLE:[{target:"false"}],FALSE:[{target:"false"}]}},false:{on:{TOGGLE:[{target:"true"}],TRUE:[{target:"true"}]}}}}})),define("consul-ui/machines/validate.xstate",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -e.default={id:"form",initial:"idle",on:{RESET:[{target:"idle"}]},states:{idle:{on:{SUCCESS:[{target:"success"}],ERROR:[{target:"error"}]}},success:{},error:{}}}})),define("consul-ui/mixins/policy/as-many",["exports","consul-ui/utils/minimizeModel"],(function(e,t){function n(e,t){var n=Object.keys(e) -if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e) -t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const a=function(e,t,n,r){return(e||[]).map((function(e){const a={template:t,Name:e[n]} -return void 0!==e[r]&&(a[r]=e[r]),a}))},l=function(e){return(e||[]).map((function(e){return function(e){for(var t=1;t(n.Policies=l(n.Policies).concat(a(n.ServiceIdentities,"service-identity","ServiceName","Datacenters")).concat(a(n.NodeIdentities,"node-identity","NodeName","Datacenter")),t(e,n)))}),t)},respondForQuery:function(e,t){return this._super((function(t){return e((function(e,n){return t(e,n.map((function(e){return e.Policies=l(e.Policies).concat(a(e.ServiceIdentities,"service-identity","ServiceName","Datacenters")).concat(a(e.NodeIdentities,"node-identity","NodeName","Datacenter")),e})))}))}),t)},serialize:function(e,n){const r=this._super(...arguments) -return r.ServiceIdentities=s(r.Policies,"service-identity","ServiceName","Datacenters"),r.NodeIdentities=s(r.Policies,"node-identity","NodeName","Datacenter"),r.Policies=(0,t.default)(i(r.Policies)),r}}) -e.default=o})),define("consul-ui/mixins/role/as-many",["exports","consul-ui/utils/minimizeModel"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -var n=Ember.Mixin.create({respondForQueryRecord:function(e,t){return this._super((function(t){return e((e,n)=>(n.Roles=void 0===n.Roles||null===n.Roles?[]:n.Roles,t(e,n)))}),t)},respondForQuery:function(e,t){return this._super((function(t){return e((function(e,n){return t(e,n.map((function(e){return e.Roles=void 0===e.Roles||null===e.Roles?[]:e.Roles,e})))}))}),t)},serialize:function(e,n){const r=this._super(...arguments) -return r.Roles=(0,t.default)(r.Roles),r}}) -e.default=n})),define("consul-ui/mixins/slots",["exports","block-slots/mixins/slots"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/mixins/with-blocking-actions",["exports","ember-inflector"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -var n=Ember.Mixin.create({_feedback:Ember.inject.service("feedback"),settings:Ember.inject.service("settings"),init:function(){this._super(...arguments) -const e=this._feedback,n=this -Ember.set(this,"feedback",{execute:function(r,a,l){const s=n.routeName.split(".") -s.pop() -const i=(0,t.singularize)(s.pop()) -return e.execute(r,a,l,i)}})},afterCreate:function(e){return this.afterUpdate(...arguments)},afterUpdate:function(){const e=this.routeName.split(".") -return e.pop(),this.transitionTo(e.join("."))},afterDelete:function(){const e=this.routeName.split(".") -switch(e.pop()){case"index":return this.refresh() -default:return this.transitionTo(e.join("."))}},errorCreate:function(e){return e},errorUpdate:function(e){return e},errorDelete:function(e){return e},actions:{cancel:function(){return this.afterUpdate(...arguments)},create:function(e){return this.feedback.execute(()=>this.repo.persist(e).then(()=>this.afterCreate(...arguments)),"create",(e,t)=>this.errorCreate(e,t))},update:function(e){return this.feedback.execute(()=>this.repo.persist(e).then(()=>this.afterUpdate(...arguments)),"update",(e,t)=>this.errorUpdate(e,t))},delete:function(e){return this.feedback.execute(()=>this.repo.remove(e).then(()=>this.afterDelete(...arguments)),"delete",(e,t)=>this.errorDelete(e,t))},use:function(e){return this.repo.findBySlug({dc:Ember.get(e,"Datacenter"),ns:Ember.get(e,"Namespace"),partition:Ember.get(e,"Partition"),id:Ember.get(e,"AccessorID")}).then(e=>this.settings.persist({token:{AccessorID:Ember.get(e,"AccessorID"),SecretID:Ember.get(e,"SecretID"),Namespace:Ember.get(e,"Namespace"),Partition:Ember.get(e,"Partition")}}))},logout:function(){return this.settings.delete("token")},clone:function(e){let t -return this.feedback.execute(()=>this.repo.clone(e).then(e=>(t=e,this.afterDelete(...arguments))).then((function(){return t})),"clone")}}}) -e.default=n})),define("consul-ui/models/auth-method",["exports","@ember-data/model","parse-duration"],(function(e,t,n){var r,a,l,s,i,o,u,c,d,m,p,f,b,h,v,y,g,O,_,P,w,E,k,x,j,C,S,N,z,M,D,T,L,A,R,I -function B(e,t,n,r){n&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(r):void 0})}function H(e,t,n,r,a){var l={} -return Object.keys(r).forEach((function(e){l[e]=r[e]})),l.enumerable=!!l.enumerable,l.configurable=!!l.configurable,("value"in l||l.initializer)&&(l.writable=!0),l=n.slice().reverse().reduce((function(n,r){return r(e,t,n)||n}),l),a&&void 0!==l.initializer&&(l.value=l.initializer?l.initializer.call(a):void 0,l.initializer=void 0),void 0===l.initializer&&(Object.defineProperty(e,t,l),l=null),l}Object.defineProperty(e,"__esModule",{value:!0}),e.default=e.SLUG_KEY=e.PRIMARY_KEY=void 0 -e.PRIMARY_KEY="uid" -e.SLUG_KEY="Name" -let $=(r=(0,t.attr)("string"),a=(0,t.attr)("string"),l=(0,t.attr)("string"),s=(0,t.attr)("string"),i=(0,t.attr)("string"),o=(0,t.attr)("string",{defaultValue:()=>""}),u=(0,t.attr)("string",{defaultValue:()=>""}),c=(0,t.attr)("string",{defaultValue:()=>"local"}),d=(0,t.attr)("string"),m=(0,t.attr)(),p=Ember.computed.or("DisplayName","Name"),f=(0,t.attr)(),b=(0,t.attr)("string"),h=(0,t.attr)("number"),v=(0,t.attr)("number"),y=(0,t.attr)(),g=(0,t.attr)(),O=Ember.computed("MaxTokenTTL"),_=class extends t.default{constructor(...e){super(...e),B(this,"uid",P,this),B(this,"Name",w,this),B(this,"Datacenter",E,this),B(this,"Namespace",k,this),B(this,"Partition",x,this),B(this,"Description",j,this),B(this,"DisplayName",C,this),B(this,"TokenLocality",S,this),B(this,"Type",N,this),B(this,"NamespaceRules",z,this),B(this,"MethodName",M,this),B(this,"Config",D,this),B(this,"MaxTokenTTL",T,this),B(this,"CreateIndex",L,this),B(this,"ModifyIndex",A,this),B(this,"Datacenters",R,this),B(this,"meta",I,this)}get TokenTTL(){return(0,n.default)(this.MaxTokenTTL)}},P=H(_.prototype,"uid",[r],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),w=H(_.prototype,"Name",[a],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),E=H(_.prototype,"Datacenter",[l],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),k=H(_.prototype,"Namespace",[s],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),x=H(_.prototype,"Partition",[i],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),j=H(_.prototype,"Description",[o],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),C=H(_.prototype,"DisplayName",[u],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),S=H(_.prototype,"TokenLocality",[c],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),N=H(_.prototype,"Type",[d],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),z=H(_.prototype,"NamespaceRules",[m],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),M=H(_.prototype,"MethodName",[p],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),D=H(_.prototype,"Config",[f],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),T=H(_.prototype,"MaxTokenTTL",[b],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),L=H(_.prototype,"CreateIndex",[h],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),A=H(_.prototype,"ModifyIndex",[v],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),R=H(_.prototype,"Datacenters",[y],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),I=H(_.prototype,"meta",[g],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),H(_.prototype,"TokenTTL",[O],Object.getOwnPropertyDescriptor(_.prototype,"TokenTTL"),_.prototype),_) -e.default=$})),define("consul-ui/models/binding-rule",["exports","@ember-data/model"],(function(e,t){var n,r,a,l,s,i,o,u,c,d,m,p,f,b,h,v,y,g,O,_,P,w,E,k,x -function j(e,t,n,r){n&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(r):void 0})}function C(e,t,n,r,a){var l={} -return Object.keys(r).forEach((function(e){l[e]=r[e]})),l.enumerable=!!l.enumerable,l.configurable=!!l.configurable,("value"in l||l.initializer)&&(l.writable=!0),l=n.slice().reverse().reduce((function(n,r){return r(e,t,n)||n}),l),a&&void 0!==l.initializer&&(l.value=l.initializer?l.initializer.call(a):void 0,l.initializer=void 0),void 0===l.initializer&&(Object.defineProperty(e,t,l),l=null),l}Object.defineProperty(e,"__esModule",{value:!0}),e.default=e.SLUG_KEY=e.PRIMARY_KEY=void 0 -e.PRIMARY_KEY="uid" -e.SLUG_KEY="ID" -let S=(n=(0,t.attr)("string"),r=(0,t.attr)("string"),a=(0,t.attr)("string"),l=(0,t.attr)("string"),s=(0,t.attr)("string"),i=(0,t.attr)("string",{defaultValue:()=>""}),o=(0,t.attr)("string"),u=(0,t.attr)("string",{defaultValue:()=>""}),c=(0,t.attr)("string"),d=(0,t.attr)("string"),m=(0,t.attr)("number"),p=(0,t.attr)("number"),f=class extends t.default{constructor(...e){super(...e),j(this,"uid",b,this),j(this,"ID",h,this),j(this,"Datacenter",v,this),j(this,"Namespace",y,this),j(this,"Partition",g,this),j(this,"Description",O,this),j(this,"AuthMethod",_,this),j(this,"Selector",P,this),j(this,"BindType",w,this),j(this,"BindName",E,this),j(this,"CreateIndex",k,this),j(this,"ModifyIndex",x,this)}},b=C(f.prototype,"uid",[n],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),h=C(f.prototype,"ID",[r],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),v=C(f.prototype,"Datacenter",[a],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),y=C(f.prototype,"Namespace",[l],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),g=C(f.prototype,"Partition",[s],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),O=C(f.prototype,"Description",[i],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),_=C(f.prototype,"AuthMethod",[o],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),P=C(f.prototype,"Selector",[u],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),w=C(f.prototype,"BindType",[c],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),E=C(f.prototype,"BindName",[d],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),k=C(f.prototype,"CreateIndex",[m],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),x=C(f.prototype,"ModifyIndex",[p],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),f) -e.default=S})),define("consul-ui/models/coordinate",["exports","@ember-data/model"],(function(e,t){var n,r,a,l,s,i,o,u,c,d,m,p,f,b,h -function v(e,t,n,r){n&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(r):void 0})}function y(e,t,n,r,a){var l={} -return Object.keys(r).forEach((function(e){l[e]=r[e]})),l.enumerable=!!l.enumerable,l.configurable=!!l.configurable,("value"in l||l.initializer)&&(l.writable=!0),l=n.slice().reverse().reduce((function(n,r){return r(e,t,n)||n}),l),a&&void 0!==l.initializer&&(l.value=l.initializer?l.initializer.call(a):void 0,l.initializer=void 0),void 0===l.initializer&&(Object.defineProperty(e,t,l),l=null),l}Object.defineProperty(e,"__esModule",{value:!0}),e.default=e.SLUG_KEY=e.PRIMARY_KEY=void 0 -e.PRIMARY_KEY="uid" -e.SLUG_KEY="Node" -let g=(n=(0,t.attr)("string"),r=(0,t.attr)("string"),a=(0,t.attr)(),l=(0,t.attr)("string"),s=(0,t.attr)("string"),i=(0,t.attr)("string"),o=(0,t.attr)("number"),u=class extends t.default{constructor(...e){super(...e),v(this,"uid",c,this),v(this,"Node",d,this),v(this,"Coord",m,this),v(this,"Segment",p,this),v(this,"Datacenter",f,this),v(this,"Partition",b,this),v(this,"SyncTime",h,this)}},c=y(u.prototype,"uid",[n],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),d=y(u.prototype,"Node",[r],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),m=y(u.prototype,"Coord",[a],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),p=y(u.prototype,"Segment",[l],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),f=y(u.prototype,"Datacenter",[s],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),b=y(u.prototype,"Partition",[i],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),h=y(u.prototype,"SyncTime",[o],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),u) -e.default=g})),define("consul-ui/models/dc",["exports","@ember-data/model"],(function(e,t){var n,r,a,l,s,i,o,u,c,d,m,p,f,b,h,v,y,g,O,_,P,w,E,k,x,j,C,S,N,z,M -function D(e,t,n,r){n&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(r):void 0})}function T(e,t,n,r,a){var l={} -return Object.keys(r).forEach((function(e){l[e]=r[e]})),l.enumerable=!!l.enumerable,l.configurable=!!l.configurable,("value"in l||l.initializer)&&(l.writable=!0),l=n.slice().reverse().reduce((function(n,r){return r(e,t,n)||n}),l),a&&void 0!==l.initializer&&(l.value=l.initializer?l.initializer.call(a):void 0,l.initializer=void 0),void 0===l.initializer&&(Object.defineProperty(e,t,l),l=null),l}Object.defineProperty(e,"__esModule",{value:!0}),e.default=e.SLUG_KEY=e.FOREIGN_KEY=e.PRIMARY_KEY=void 0 -e.PRIMARY_KEY="uid" -e.FOREIGN_KEY="Datacenter" -e.SLUG_KEY="Name" -let L=(n=(0,t.attr)("string"),r=(0,t.attr)("string"),a=(0,t.attr)("boolean"),l=(0,t.attr)("number"),s=(0,t.attr)("number"),i=(0,t.attr)("string"),o=(0,t.attr)(),u=(0,t.attr)(),c=(0,t.attr)(),d=(0,t.attr)(),m=(0,t.attr)(),p=(0,t.attr)("boolean"),f=(0,t.attr)("boolean"),b=(0,t.attr)("string"),h=(0,t.attr)("boolean",{defaultValue:()=>!0}),v=class extends t.default{constructor(...e){super(...e),D(this,"uri",y,this),D(this,"Name",g,this),D(this,"Healthy",O,this),D(this,"FailureTolerance",_,this),D(this,"OptimisticFailureTolerance",P,this),D(this,"Leader",w,this),D(this,"Voters",E,this),D(this,"Servers",k,this),D(this,"RedundancyZones",x,this),D(this,"Default",j,this),D(this,"ReadReplicas",C,this),D(this,"Local",S,this),D(this,"Primary",N,this),D(this,"DefaultACLPolicy",z,this),D(this,"MeshEnabled",M,this)}},y=T(v.prototype,"uri",[n],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),g=T(v.prototype,"Name",[r],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),O=T(v.prototype,"Healthy",[a],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),_=T(v.prototype,"FailureTolerance",[l],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),P=T(v.prototype,"OptimisticFailureTolerance",[s],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),w=T(v.prototype,"Leader",[i],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),E=T(v.prototype,"Voters",[o],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),k=T(v.prototype,"Servers",[u],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),x=T(v.prototype,"RedundancyZones",[c],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),j=T(v.prototype,"Default",[d],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),C=T(v.prototype,"ReadReplicas",[m],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),S=T(v.prototype,"Local",[p],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),N=T(v.prototype,"Primary",[f],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),z=T(v.prototype,"DefaultACLPolicy",[b],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),M=T(v.prototype,"MeshEnabled",[h],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),v) -e.default=L})),define("consul-ui/models/discovery-chain",["exports","@ember-data/model"],(function(e,t){var n,r,a,l,s,i,o,u,c,d,m,p,f,b,h -function v(e,t,n,r){n&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(r):void 0})}function y(e,t,n,r,a){var l={} -return Object.keys(r).forEach((function(e){l[e]=r[e]})),l.enumerable=!!l.enumerable,l.configurable=!!l.configurable,("value"in l||l.initializer)&&(l.writable=!0),l=n.slice().reverse().reduce((function(n,r){return r(e,t,n)||n}),l),a&&void 0!==l.initializer&&(l.value=l.initializer?l.initializer.call(a):void 0,l.initializer=void 0),void 0===l.initializer&&(Object.defineProperty(e,t,l),l=null),l}Object.defineProperty(e,"__esModule",{value:!0}),e.default=e.SLUG_KEY=e.PRIMARY_KEY=void 0 -e.PRIMARY_KEY="uid" -e.SLUG_KEY="ServiceName" -let g=(n=(0,t.attr)("string"),r=(0,t.attr)("string"),a=(0,t.attr)("string"),l=(0,t.attr)("string"),s=(0,t.attr)("string"),i=(0,t.attr)(),o=(0,t.attr)(),u=class extends t.default{constructor(...e){super(...e),v(this,"uid",c,this),v(this,"ServiceName",d,this),v(this,"Datacenter",m,this),v(this,"Partition",p,this),v(this,"Namespace",f,this),v(this,"Chain",b,this),v(this,"meta",h,this)}},c=y(u.prototype,"uid",[n],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),d=y(u.prototype,"ServiceName",[r],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),m=y(u.prototype,"Datacenter",[a],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),p=y(u.prototype,"Partition",[l],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),f=y(u.prototype,"Namespace",[s],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),b=y(u.prototype,"Chain",[i],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),h=y(u.prototype,"meta",[o],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),u) -e.default=g})),define("consul-ui/models/gateway-config",["exports","ember-data-model-fragments/fragment","ember-data-model-fragments/attributes","@ember-data/model"],(function(e,t,n,r){var a,l,s,i,o -function u(e,t,n,r){n&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(r):void 0})}function c(e,t,n,r,a){var l={} -return Object.keys(r).forEach((function(e){l[e]=r[e]})),l.enumerable=!!l.enumerable,l.configurable=!!l.configurable,("value"in l||l.initializer)&&(l.writable=!0),l=n.slice().reverse().reduce((function(n,r){return r(e,t,n)||n}),l),a&&void 0!==l.initializer&&(l.value=l.initializer?l.initializer.call(a):void 0,l.initializer=void 0),void 0===l.initializer&&(Object.defineProperty(e,t,l),l=null),l}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -let d=(a=(0,r.attr)("number",{defaultValue:()=>0}),l=(0,n.array)("string",{defaultValue:()=>[]}),s=class extends t.default{constructor(...e){super(...e),u(this,"AssociatedServiceCount",i,this),u(this,"Addresses",o,this)}},i=c(s.prototype,"AssociatedServiceCount",[a],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),o=c(s.prototype,"Addresses",[l],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),s) -e.default=d})) -define("consul-ui/models/health-check",["exports","ember-data-model-fragments/fragment","ember-data-model-fragments/attributes","@ember-data/model","consul-ui/decorators/replace"],(function(e,t,n,r,a){var l,s,i,o,u,c,d,m,p,f,b,h,v,y,g,O,_,P,w,E,k,x,j,C,S,N,z,M,D -function T(e,t,n,r){n&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(r):void 0})}function L(e,t,n,r,a){var l={} -return Object.keys(r).forEach((function(e){l[e]=r[e]})),l.enumerable=!!l.enumerable,l.configurable=!!l.configurable,("value"in l||l.initializer)&&(l.writable=!0),l=n.slice().reverse().reduce((function(n,r){return r(e,t,n)||n}),l),a&&void 0!==l.initializer&&(l.value=l.initializer?l.initializer.call(a):void 0,l.initializer=void 0),void 0===l.initializer&&(Object.defineProperty(e,t,l),l=null),l}Object.defineProperty(e,"__esModule",{value:!0}),e.default=e.schema=void 0 -e.schema={Status:{allowedValues:["passing","warning","critical"]},Type:{allowedValues:["serf","script","http","tcp","ttl","docker","grpc","alias"]}} -let A=(l=(0,r.attr)("string"),s=(0,r.attr)("string"),i=(0,a.replace)("","serf"),o=(0,r.attr)("string"),u=(0,r.attr)("string"),c=(0,r.attr)("string"),d=(0,r.attr)("string"),m=(0,r.attr)("string"),p=(0,r.attr)("string"),f=(0,r.attr)("string"),b=(0,a.nullValue)([]),h=(0,n.array)("string"),v=(0,r.attr)(),y=(0,r.attr)("boolean"),g=Ember.computed("ServiceID"),O=Ember.computed("Type"),_=class extends t.default{constructor(...e){super(...e),T(this,"Name",P,this),T(this,"CheckID",w,this),T(this,"Type",E,this),T(this,"Status",k,this),T(this,"Notes",x,this),T(this,"Output",j,this),T(this,"ServiceName",C,this),T(this,"ServiceID",S,this),T(this,"Node",N,this),T(this,"ServiceTags",z,this),T(this,"Definition",M,this),T(this,"Exposed",D,this)}get Kind(){return""===this.ServiceID?"node":"service"}get Exposable(){return["http","grpc"].includes(this.Type)}},P=L(_.prototype,"Name",[l],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),w=L(_.prototype,"CheckID",[s],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),E=L(_.prototype,"Type",[i,o],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),k=L(_.prototype,"Status",[u],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),x=L(_.prototype,"Notes",[c],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),j=L(_.prototype,"Output",[d],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),C=L(_.prototype,"ServiceName",[m],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),S=L(_.prototype,"ServiceID",[p],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),N=L(_.prototype,"Node",[f],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),z=L(_.prototype,"ServiceTags",[b,h],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),M=L(_.prototype,"Definition",[v],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),D=L(_.prototype,"Exposed",[y],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),L(_.prototype,"Kind",[g],Object.getOwnPropertyDescriptor(_.prototype,"Kind"),_.prototype),L(_.prototype,"Exposable",[O],Object.getOwnPropertyDescriptor(_.prototype,"Exposable"),_.prototype),_) -e.default=A})),define("consul-ui/models/intention-permission-http-header",["exports","ember-data-model-fragments/fragment","@ember-data/model"],(function(e,t,n){var r,a,l,s,i,o,u,c,d,m,p,f,b,h,v,y -function g(e,t,n,r){n&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(r):void 0})}function O(e,t,n,r,a){var l={} -return Object.keys(r).forEach((function(e){l[e]=r[e]})),l.enumerable=!!l.enumerable,l.configurable=!!l.configurable,("value"in l||l.initializer)&&(l.writable=!0),l=n.slice().reverse().reduce((function(n,r){return r(e,t,n)||n}),l),a&&void 0!==l.initializer&&(l.value=l.initializer?l.initializer.call(a):void 0,l.initializer=void 0),void 0===l.initializer&&(Object.defineProperty(e,t,l),l=null),l}Object.defineProperty(e,"__esModule",{value:!0}),e.default=e.schema=void 0 -const _={Name:{required:!0},HeaderType:{allowedValues:["Exact","Prefix","Suffix","Regex","Present"]}} -e.schema=_ -let P=(r=(0,n.attr)("string"),a=(0,n.attr)("string"),l=(0,n.attr)("string"),s=(0,n.attr)("string"),i=(0,n.attr)("string"),o=(0,n.attr)(),u=Ember.computed.or(..._.HeaderType.allowedValues),c=Ember.computed(..._.HeaderType.allowedValues),d=class extends t.default{constructor(...e){super(...e),g(this,"Name",m,this),g(this,"Exact",p,this),g(this,"Prefix",f,this),g(this,"Suffix",b,this),g(this,"Regex",h,this),g(this,"Present",v,this),g(this,"Value",y,this)}get HeaderType(){return _.HeaderType.allowedValues.find(e=>void 0!==this[e])}},m=O(d.prototype,"Name",[r],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),p=O(d.prototype,"Exact",[a],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),f=O(d.prototype,"Prefix",[l],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),b=O(d.prototype,"Suffix",[s],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),h=O(d.prototype,"Regex",[i],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),v=O(d.prototype,"Present",[o],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),y=O(d.prototype,"Value",[u],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),O(d.prototype,"HeaderType",[c],Object.getOwnPropertyDescriptor(d.prototype,"HeaderType"),d.prototype),d) -e.default=P})),define("consul-ui/models/intention-permission-http",["exports","ember-data-model-fragments/fragment","ember-data-model-fragments/attributes","@ember-data/model"],(function(e,t,n,r){var a,l,s,i,o,u,c,d,m,p,f,b,h,v -function y(e,t,n,r){n&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(r):void 0})}function g(e,t,n,r,a){var l={} -return Object.keys(r).forEach((function(e){l[e]=r[e]})),l.enumerable=!!l.enumerable,l.configurable=!!l.configurable,("value"in l||l.initializer)&&(l.writable=!0),l=n.slice().reverse().reduce((function(n,r){return r(e,t,n)||n}),l),a&&void 0!==l.initializer&&(l.value=l.initializer?l.initializer.call(a):void 0,l.initializer=void 0),void 0===l.initializer&&(Object.defineProperty(e,t,l),l=null),l}Object.defineProperty(e,"__esModule",{value:!0}),e.default=e.schema=void 0 -const O={PathType:{allowedValues:["PathPrefix","PathExact","PathRegex"]},Methods:{allowedValues:["GET","HEAD","POST","PUT","DELETE","CONNECT","OPTIONS","TRACE","PATCH"]}} -e.schema=O -let _=(a=(0,r.attr)("string"),l=(0,r.attr)("string"),s=(0,r.attr)("string"),i=(0,n.fragmentArray)("intention-permission-http-header"),o=(0,n.array)("string"),u=Ember.computed.or(...O.PathType.allowedValues),c=Ember.computed(...O.PathType.allowedValues),d=class extends t.default{constructor(...e){super(...e),y(this,"PathExact",m,this),y(this,"PathPrefix",p,this),y(this,"PathRegex",f,this),y(this,"Header",b,this),y(this,"Methods",h,this),y(this,"Path",v,this)}get PathType(){return O.PathType.allowedValues.find(e=>"string"==typeof this[e])}},m=g(d.prototype,"PathExact",[a],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),p=g(d.prototype,"PathPrefix",[l],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),f=g(d.prototype,"PathRegex",[s],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),b=g(d.prototype,"Header",[i],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),h=g(d.prototype,"Methods",[o],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),v=g(d.prototype,"Path",[u],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),g(d.prototype,"PathType",[c],Object.getOwnPropertyDescriptor(d.prototype,"PathType"),d.prototype),d) -e.default=_})),define("consul-ui/models/intention-permission",["exports","ember-data-model-fragments/fragment","ember-data-model-fragments/attributes","@ember-data/model"],(function(e,t,n,r){var a,l,s,i,o -function u(e,t,n,r){n&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(r):void 0})}function c(e,t,n,r,a){var l={} -return Object.keys(r).forEach((function(e){l[e]=r[e]})),l.enumerable=!!l.enumerable,l.configurable=!!l.configurable,("value"in l||l.initializer)&&(l.writable=!0),l=n.slice().reverse().reduce((function(n,r){return r(e,t,n)||n}),l),a&&void 0!==l.initializer&&(l.value=l.initializer?l.initializer.call(a):void 0,l.initializer=void 0),void 0===l.initializer&&(Object.defineProperty(e,t,l),l=null),l}Object.defineProperty(e,"__esModule",{value:!0}),e.default=e.schema=void 0 -const d={Action:{defaultValue:"allow",allowedValues:["allow","deny"]}} -e.schema=d -let m=(a=(0,r.attr)("string",{defaultValue:()=>d.Action.defaultValue}),l=(0,n.fragment)("intention-permission-http"),s=class extends t.default{constructor(...e){super(...e),u(this,"Action",i,this),u(this,"HTTP",o,this)}},i=c(s.prototype,"Action",[a],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),o=c(s.prototype,"HTTP",[l],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),s) -e.default=m})),define("consul-ui/models/intention",["exports","@ember-data/model","ember-data-model-fragments/attributes","consul-ui/decorators/replace"],(function(e,t,n,r){var a,l,s,i,o,u,c,d,m,p,f,b,h,v,y,g,O,_,P,w,E,k,x,j,C,S,N,z,M,D,T,L,A,R,I,B,H,$,U,F,q,K,Y,V,W,G,Q,Z,J -function X(e,t,n,r){n&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(r):void 0})}function ee(e,t,n,r,a){var l={} -return Object.keys(r).forEach((function(e){l[e]=r[e]})),l.enumerable=!!l.enumerable,l.configurable=!!l.configurable,("value"in l||l.initializer)&&(l.writable=!0),l=n.slice().reverse().reduce((function(n,r){return r(e,t,n)||n}),l),a&&void 0!==l.initializer&&(l.value=l.initializer?l.initializer.call(a):void 0,l.initializer=void 0),void 0===l.initializer&&(Object.defineProperty(e,t,l),l=null),l}Object.defineProperty(e,"__esModule",{value:!0}),e.default=e.SLUG_KEY=e.PRIMARY_KEY=void 0 -e.PRIMARY_KEY="uid" -e.SLUG_KEY="ID" -let te=(a=(0,t.attr)("string"),l=(0,t.attr)("string"),s=(0,t.attr)("string"),i=(0,t.attr)("string"),o=(0,t.attr)("string",{defaultValue:()=>"*"}),u=(0,t.attr)("string",{defaultValue:()=>"*"}),c=(0,t.attr)("string",{defaultValue:()=>"default"}),d=(0,t.attr)("string",{defaultValue:()=>"default"}),m=(0,t.attr)("string",{defaultValue:()=>"default"}),p=(0,t.attr)("string",{defaultValue:()=>"default"}),f=(0,t.attr)("number"),b=(0,t.attr)("string",{defaultValue:()=>"consul"}),h=(0,r.nullValue)(void 0),v=(0,t.attr)("string"),y=(0,t.attr)("string"),g=(0,t.attr)("boolean",{defaultValue:()=>!0}),O=(0,t.attr)("number"),_=(0,t.attr)("date"),P=(0,t.attr)("date"),w=(0,t.attr)("number"),E=(0,t.attr)("number"),k=(0,t.attr)(),x=(0,t.attr)({defaultValue:()=>[]}),j=(0,n.fragmentArray)("intention-permission"),C=Ember.computed("Meta"),S=class extends t.default{constructor(...e){super(...e),X(this,"uid",N,this),X(this,"ID",z,this),X(this,"Datacenter",M,this),X(this,"Description",D,this),X(this,"SourceName",T,this),X(this,"DestinationName",L,this),X(this,"SourceNS",A,this),X(this,"DestinationNS",R,this),X(this,"SourcePartition",I,this),X(this,"DestinationPartition",B,this),X(this,"Precedence",H,this),X(this,"SourceType",$,this),X(this,"Action",U,this),X(this,"LegacyID",F,this),X(this,"Legacy",q,this),X(this,"SyncTime",K,this),X(this,"CreatedAt",Y,this),X(this,"UpdatedAt",V,this),X(this,"CreateIndex",W,this),X(this,"ModifyIndex",G,this),X(this,"Meta",Q,this),X(this,"Resources",Z,this),X(this,"Permissions",J,this)}get IsManagedByCRD(){return void 0!==Object.entries(this.Meta||{}).find(([e,t])=>"external-source"===e&&"kubernetes"===t)}},N=ee(S.prototype,"uid",[a],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),z=ee(S.prototype,"ID",[l],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),M=ee(S.prototype,"Datacenter",[s],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),D=ee(S.prototype,"Description",[i],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),T=ee(S.prototype,"SourceName",[o],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),L=ee(S.prototype,"DestinationName",[u],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),A=ee(S.prototype,"SourceNS",[c],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),R=ee(S.prototype,"DestinationNS",[d],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),I=ee(S.prototype,"SourcePartition",[m],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),B=ee(S.prototype,"DestinationPartition",[p],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),H=ee(S.prototype,"Precedence",[f],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),$=ee(S.prototype,"SourceType",[b],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),U=ee(S.prototype,"Action",[h,v],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),F=ee(S.prototype,"LegacyID",[y],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),q=ee(S.prototype,"Legacy",[g],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),K=ee(S.prototype,"SyncTime",[O],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),Y=ee(S.prototype,"CreatedAt",[_],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),V=ee(S.prototype,"UpdatedAt",[P],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),W=ee(S.prototype,"CreateIndex",[w],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),G=ee(S.prototype,"ModifyIndex",[E],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),Q=ee(S.prototype,"Meta",[k],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),Z=ee(S.prototype,"Resources",[x],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),J=ee(S.prototype,"Permissions",[j],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),ee(S.prototype,"IsManagedByCRD",[C],Object.getOwnPropertyDescriptor(S.prototype,"IsManagedByCRD"),S.prototype),S) -e.default=te})),define("consul-ui/models/kv",["exports","@ember-data/model","consul-ui/utils/isFolder","consul-ui/decorators/replace"],(function(e,t,n,r){var a,l,s,i,o,u,c,d,m,p,f,b,h,v,y,g,O,_,P,w,E,k,x,j,C,S,N,z,M,D,T,L -function A(e,t,n,r){n&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(r):void 0})}function R(e,t,n,r,a){var l={} -return Object.keys(r).forEach((function(e){l[e]=r[e]})),l.enumerable=!!l.enumerable,l.configurable=!!l.configurable,("value"in l||l.initializer)&&(l.writable=!0),l=n.slice().reverse().reduce((function(n,r){return r(e,t,n)||n}),l),a&&void 0!==l.initializer&&(l.value=l.initializer?l.initializer.call(a):void 0,l.initializer=void 0),void 0===l.initializer&&(Object.defineProperty(e,t,l),l=null),l}Object.defineProperty(e,"__esModule",{value:!0}),e.default=e.SLUG_KEY=e.PRIMARY_KEY=void 0 -e.PRIMARY_KEY="uid" -e.SLUG_KEY="Key" -let I=(a=(0,t.attr)("string"),l=(0,t.attr)("string"),s=(0,t.attr)("number"),i=(0,t.attr)(),o=(0,t.attr)("string"),u=(0,t.attr)("string"),c=(0,t.attr)("string"),d=(0,t.attr)("number"),m=(0,t.attr)("number"),p=(0,r.nullValue)(void 0),f=(0,t.attr)("string"),b=(0,t.attr)("number"),h=(0,t.attr)("number"),v=(0,t.attr)("string"),y=(0,t.attr)({defaultValue:()=>[]}),g=Ember.computed("isFolder"),O=Ember.computed("Key"),_=class extends t.default{constructor(...e){super(...e),A(this,"uid",P,this),A(this,"Key",w,this),A(this,"SyncTime",E,this),A(this,"meta",k,this),A(this,"Datacenter",x,this),A(this,"Namespace",j,this),A(this,"Partition",C,this),A(this,"LockIndex",S,this),A(this,"Flags",N,this),A(this,"Value",z,this),A(this,"CreateIndex",M,this),A(this,"ModifyIndex",D,this),A(this,"Session",T,this),A(this,"Resources",L,this)}get Kind(){return this.isFolder?"folder":"key"}get isFolder(){return(0,n.default)(this.Key||"")}},P=R(_.prototype,"uid",[a],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),w=R(_.prototype,"Key",[l],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),E=R(_.prototype,"SyncTime",[s],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),k=R(_.prototype,"meta",[i],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),x=R(_.prototype,"Datacenter",[o],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),j=R(_.prototype,"Namespace",[u],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),C=R(_.prototype,"Partition",[c],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),S=R(_.prototype,"LockIndex",[d],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),N=R(_.prototype,"Flags",[m],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),z=R(_.prototype,"Value",[p,f],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),M=R(_.prototype,"CreateIndex",[b],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),D=R(_.prototype,"ModifyIndex",[h],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),T=R(_.prototype,"Session",[v],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),L=R(_.prototype,"Resources",[y],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),R(_.prototype,"Kind",[g],Object.getOwnPropertyDescriptor(_.prototype,"Kind"),_.prototype),R(_.prototype,"isFolder",[O],Object.getOwnPropertyDescriptor(_.prototype,"isFolder"),_.prototype),_) -e.default=I})),define("consul-ui/models/license",["exports","@ember-data/model"],(function(e,t){var n,r,a,l,s,i,o,u,c,d,m,p,f,b,h,v,y -function g(e,t,n,r){n&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(r):void 0})}function O(e,t,n,r,a){var l={} -return Object.keys(r).forEach((function(e){l[e]=r[e]})),l.enumerable=!!l.enumerable,l.configurable=!!l.configurable,("value"in l||l.initializer)&&(l.writable=!0),l=n.slice().reverse().reduce((function(n,r){return r(e,t,n)||n}),l),a&&void 0!==l.initializer&&(l.value=l.initializer?l.initializer.call(a):void 0,l.initializer=void 0),void 0===l.initializer&&(Object.defineProperty(e,t,l),l=null),l}Object.defineProperty(e,"__esModule",{value:!0}),e.default=e.PRIMARY_KEY=void 0 -e.PRIMARY_KEY="uri" -let _=(n=(0,t.attr)("string"),r=(0,t.attr)("boolean"),a=(0,t.attr)("number"),l=(0,t.attr)(),s=(0,t.attr)("string"),i=(0,t.attr)("string"),o=(0,t.attr)("string"),u=(0,t.attr)(),c=class extends t.default{constructor(...e){super(...e),g(this,"uri",d,this),g(this,"Valid",m,this),g(this,"SyncTime",p,this),g(this,"meta",f,this),g(this,"Datacenter",b,this),g(this,"Namespace",h,this),g(this,"Partition",v,this),g(this,"License",y,this)}},d=O(c.prototype,"uri",[n],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),m=O(c.prototype,"Valid",[r],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),p=O(c.prototype,"SyncTime",[a],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),f=O(c.prototype,"meta",[l],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),b=O(c.prototype,"Datacenter",[s],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),h=O(c.prototype,"Namespace",[i],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),v=O(c.prototype,"Partition",[o],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),y=O(c.prototype,"License",[u],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),c) -e.default=_})),define("consul-ui/models/node",["exports","@ember-data/model","ember-data-model-fragments/attributes"],(function(e,t,n){var r,a,l,s,i,o,u,c,d,m,p,f,b,h,v,y,g,O,_,P,w,E,k,x,j,C,S,N,z,M,D,T,L,A,R,I,B,H,$,U,F -function q(e,t,n,r){n&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(r):void 0})}function K(e,t,n,r,a){var l={} -return Object.keys(r).forEach((function(e){l[e]=r[e]})),l.enumerable=!!l.enumerable,l.configurable=!!l.configurable,("value"in l||l.initializer)&&(l.writable=!0),l=n.slice().reverse().reduce((function(n,r){return r(e,t,n)||n}),l),a&&void 0!==l.initializer&&(l.value=l.initializer?l.initializer.call(a):void 0,l.initializer=void 0),void 0===l.initializer&&(Object.defineProperty(e,t,l),l=null),l}Object.defineProperty(e,"__esModule",{value:!0}),e.default=e.SLUG_KEY=e.PRIMARY_KEY=void 0 -e.PRIMARY_KEY="uid" -e.SLUG_KEY="ID" -let Y=(r=(0,t.attr)("string"),a=(0,t.attr)("string"),l=(0,t.attr)("string"),s=(0,t.attr)("string"),i=(0,t.attr)("string"),o=(0,t.attr)("string"),u=(0,t.attr)("number"),c=(0,t.attr)("number"),d=(0,t.attr)("number"),m=(0,t.attr)(),p=(0,t.attr)(),f=(0,t.attr)(),b=(0,t.attr)({defaultValue:()=>[]}),h=(0,t.hasMany)("service-instance"),v=(0,n.fragmentArray)("health-check"),y=Ember.computed.filter("Services",e=>"connect-proxy"!==e.Service.Kind),g=Ember.computed.filter("Services",e=>"connect-proxy"===e.Service.Kind),O=Ember.computed.filter("Checks",e=>""===e.ServiceID),_=Ember.computed("ChecksCritical","ChecksPassing","ChecksWarning"),P=Ember.computed("NodeChecks.[]"),w=Ember.computed("NodeChecks.[]"),E=Ember.computed("NodeChecks.[]"),k=class extends t.default{constructor(...e){super(...e),q(this,"uid",x,this),q(this,"ID",j,this),q(this,"Datacenter",C,this),q(this,"Partition",S,this),q(this,"Address",N,this),q(this,"Node",z,this),q(this,"SyncTime",M,this),q(this,"CreateIndex",D,this),q(this,"ModifyIndex",T,this),q(this,"meta",L,this),q(this,"Meta",A,this),q(this,"TaggedAddresses",R,this),q(this,"Resources",I,this),q(this,"Services",B,this),q(this,"Checks",H,this),q(this,"MeshServiceInstances",$,this),q(this,"ProxyServiceInstances",U,this),q(this,"NodeChecks",F,this)}get Status(){switch(!0){case 0!==this.ChecksCritical:return"critical" -case 0!==this.ChecksWarning:return"warning" -case 0!==this.ChecksPassing:return"passing" -default:return"empty"}}get ChecksCritical(){return this.NodeChecks.filter(e=>"critical"===e.Status).length}get ChecksPassing(){return this.NodeChecks.filter(e=>"passing"===e.Status).length}get ChecksWarning(){return this.NodeChecks.filter(e=>"warning"===e.Status).length}},x=K(k.prototype,"uid",[r],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),j=K(k.prototype,"ID",[a],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),C=K(k.prototype,"Datacenter",[l],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),S=K(k.prototype,"Partition",[s],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),N=K(k.prototype,"Address",[i],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),z=K(k.prototype,"Node",[o],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),M=K(k.prototype,"SyncTime",[u],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),D=K(k.prototype,"CreateIndex",[c],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),T=K(k.prototype,"ModifyIndex",[d],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),L=K(k.prototype,"meta",[m],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),A=K(k.prototype,"Meta",[p],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),R=K(k.prototype,"TaggedAddresses",[f],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),I=K(k.prototype,"Resources",[b],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),B=K(k.prototype,"Services",[h],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),H=K(k.prototype,"Checks",[v],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),$=K(k.prototype,"MeshServiceInstances",[y],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),U=K(k.prototype,"ProxyServiceInstances",[g],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),F=K(k.prototype,"NodeChecks",[O],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),K(k.prototype,"Status",[_],Object.getOwnPropertyDescriptor(k.prototype,"Status"),k.prototype),K(k.prototype,"ChecksCritical",[P],Object.getOwnPropertyDescriptor(k.prototype,"ChecksCritical"),k.prototype),K(k.prototype,"ChecksPassing",[w],Object.getOwnPropertyDescriptor(k.prototype,"ChecksPassing"),k.prototype),K(k.prototype,"ChecksWarning",[E],Object.getOwnPropertyDescriptor(k.prototype,"ChecksWarning"),k.prototype),k) -e.default=Y})),define("consul-ui/models/nspace",["exports","@ember-data/model"],(function(e,t){var n,r,a,l,s,i,o,u,c,d,m,p,f,b,h,v,y,g,O,_,P -function w(e,t,n,r){n&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(r):void 0})}function E(e,t,n,r,a){var l={} -return Object.keys(r).forEach((function(e){l[e]=r[e]})),l.enumerable=!!l.enumerable,l.configurable=!!l.configurable,("value"in l||l.initializer)&&(l.writable=!0),l=n.slice().reverse().reduce((function(n,r){return r(e,t,n)||n}),l),a&&void 0!==l.initializer&&(l.value=l.initializer?l.initializer.call(a):void 0,l.initializer=void 0),void 0===l.initializer&&(Object.defineProperty(e,t,l),l=null),l}Object.defineProperty(e,"__esModule",{value:!0}),e.default=e.NSPACE_KEY=e.SLUG_KEY=e.PRIMARY_KEY=void 0 -e.PRIMARY_KEY="uid" -e.SLUG_KEY="Name" -e.NSPACE_KEY="Namespace" -let k=(n=(0,t.attr)("string"),r=(0,t.attr)("string"),a=(0,t.attr)("string"),l=(0,t.attr)("string"),s=(0,t.attr)("string"),i=(0,t.attr)("number"),o=(0,t.attr)("string",{defaultValue:()=>""}),u=(0,t.attr)({defaultValue:()=>[]}),c=(0,t.attr)("string"),d=(0,t.attr)({defaultValue:()=>({PolicyDefaults:[],RoleDefaults:[]})}),m=class extends t.default{constructor(...e){super(...e),w(this,"uid",p,this),w(this,"Name",f,this),w(this,"Datacenter",b,this),w(this,"Partition",h,this),w(this,"Namespace",v,this),w(this,"SyncTime",y,this),w(this,"Description",g,this),w(this,"Resources",O,this),w(this,"DeletedAt",_,this),w(this,"ACLs",P,this)}},p=E(m.prototype,"uid",[n],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),f=E(m.prototype,"Name",[r],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),b=E(m.prototype,"Datacenter",[a],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),h=E(m.prototype,"Partition",[l],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),v=E(m.prototype,"Namespace",[s],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),y=E(m.prototype,"SyncTime",[i],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),g=E(m.prototype,"Description",[o],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),O=E(m.prototype,"Resources",[u],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),_=E(m.prototype,"DeletedAt",[c],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),P=E(m.prototype,"ACLs",[d],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),m) -e.default=k})),define("consul-ui/models/oidc-provider",["exports","@ember-data/model"],(function(e,t){var n,r,a,l,s,i,o,u,c,d,m,p,f,b,h,v,y,g,O -function _(e,t,n,r){n&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(r):void 0})}function P(e,t,n,r,a){var l={} -return Object.keys(r).forEach((function(e){l[e]=r[e]})),l.enumerable=!!l.enumerable,l.configurable=!!l.configurable,("value"in l||l.initializer)&&(l.writable=!0),l=n.slice().reverse().reduce((function(n,r){return r(e,t,n)||n}),l),a&&void 0!==l.initializer&&(l.value=l.initializer?l.initializer.call(a):void 0,l.initializer=void 0),void 0===l.initializer&&(Object.defineProperty(e,t,l),l=null),l}Object.defineProperty(e,"__esModule",{value:!0}),e.default=e.SLUG_KEY=e.PRIMARY_KEY=void 0 -e.PRIMARY_KEY="uid" -e.SLUG_KEY="Name" -let w=(n=(0,t.attr)("string"),r=(0,t.attr)("string"),a=(0,t.attr)("string"),l=(0,t.attr)("string"),s=(0,t.attr)("string"),i=(0,t.attr)("string"),o=(0,t.attr)("string"),u=(0,t.attr)("string"),c=(0,t.attr)(),d=class extends t.default{constructor(...e){super(...e),_(this,"uid",m,this),_(this,"Name",p,this),_(this,"Datacenter",f,this),_(this,"Namespace",b,this),_(this,"Partition",h,this),_(this,"Kind",v,this),_(this,"AuthURL",y,this),_(this,"DisplayName",g,this),_(this,"meta",O,this)}},m=P(d.prototype,"uid",[n],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),p=P(d.prototype,"Name",[r],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),f=P(d.prototype,"Datacenter",[a],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),b=P(d.prototype,"Namespace",[l],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),h=P(d.prototype,"Partition",[s],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),v=P(d.prototype,"Kind",[i],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),y=P(d.prototype,"AuthURL",[o],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),g=P(d.prototype,"DisplayName",[u],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),O=P(d.prototype,"meta",[c],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),d) -e.default=w})),define("consul-ui/models/partition",["exports","ember-data/model","ember-data/attr"],(function(e,t,n){var r,a,l,s,i,o,u,c,d,m,p,f,b,h,v,y,g,O,_ -function P(e,t,n,r){n&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(r):void 0})}function w(e,t,n,r,a){var l={} -return Object.keys(r).forEach((function(e){l[e]=r[e]})),l.enumerable=!!l.enumerable,l.configurable=!!l.configurable,("value"in l||l.initializer)&&(l.writable=!0),l=n.slice().reverse().reduce((function(n,r){return r(e,t,n)||n}),l),a&&void 0!==l.initializer&&(l.value=l.initializer?l.initializer.call(a):void 0,l.initializer=void 0),void 0===l.initializer&&(Object.defineProperty(e,t,l),l=null),l}Object.defineProperty(e,"__esModule",{value:!0}),e.default=e.PARTITION_KEY=e.SLUG_KEY=e.PRIMARY_KEY=void 0 -e.PRIMARY_KEY="uid" -e.SLUG_KEY="Name" -e.PARTITION_KEY="Partition" -let E=(r=(0,n.default)("string"),a=(0,n.default)("string"),l=(0,n.default)("string"),s=(0,n.default)("string"),i=(0,n.default)("string"),o=(0,n.default)("string"),u=(0,n.default)("string"),c=(0,n.default)("number"),d=(0,n.default)(),m=class extends t.default{constructor(...e){super(...e),P(this,"uid",p,this),P(this,"Name",f,this),P(this,"Description",b,this),P(this,"DeletedAt",h,this),P(this,"Datacenter",v,this),P(this,"Namespace",y,this),P(this,"Partition",g,this),P(this,"SyncTime",O,this),P(this,"meta",_,this)}},p=w(m.prototype,"uid",[r],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),f=w(m.prototype,"Name",[a],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),b=w(m.prototype,"Description",[l],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),h=w(m.prototype,"DeletedAt",[s],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),v=w(m.prototype,"Datacenter",[i],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),y=w(m.prototype,"Namespace",[o],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),g=w(m.prototype,"Partition",[u],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),O=w(m.prototype,"SyncTime",[c],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),_=w(m.prototype,"meta",[d],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),m) -e.default=E})),define("consul-ui/models/permission",["exports","@ember-data/model"],(function(e,t){var n,r,a,l,s,i,o,u,c -function d(e,t,n,r){n&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(r):void 0})}function m(e,t,n,r,a){var l={} -return Object.keys(r).forEach((function(e){l[e]=r[e]})),l.enumerable=!!l.enumerable,l.configurable=!!l.configurable,("value"in l||l.initializer)&&(l.writable=!0),l=n.slice().reverse().reduce((function(n,r){return r(e,t,n)||n}),l),a&&void 0!==l.initializer&&(l.value=l.initializer?l.initializer.call(a):void 0,l.initializer=void 0),void 0===l.initializer&&(Object.defineProperty(e,t,l),l=null),l}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -let p=(n=(0,t.attr)("string"),r=(0,t.attr)("string"),a=(0,t.attr)("string"),l=(0,t.attr)("boolean"),s=class extends t.default{constructor(...e){super(...e),d(this,"Resource",i,this),d(this,"Segment",o,this),d(this,"Access",u,this),d(this,"Allow",c,this)}},i=m(s.prototype,"Resource",[n],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),o=m(s.prototype,"Segment",[r],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),u=m(s.prototype,"Access",[a],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),c=m(s.prototype,"Allow",[l],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),s) -e.default=p})),define("consul-ui/models/policy",["exports","@ember-data/model"],(function(e,t){var n,r,a,l,s,i,o,u,c,d,m,p,f,b,h,v,y,g,O,_,P,w,E,k,x,j,C,S,N,z,M,D -function T(e,t,n,r){n&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(r):void 0})}function L(e,t,n,r,a){var l={} -return Object.keys(r).forEach((function(e){l[e]=r[e]})),l.enumerable=!!l.enumerable,l.configurable=!!l.configurable,("value"in l||l.initializer)&&(l.writable=!0),l=n.slice().reverse().reduce((function(n,r){return r(e,t,n)||n}),l),a&&void 0!==l.initializer&&(l.value=l.initializer?l.initializer.call(a):void 0,l.initializer=void 0),void 0===l.initializer&&(Object.defineProperty(e,t,l),l=null),l}Object.defineProperty(e,"__esModule",{value:!0}),e.default=e.SLUG_KEY=e.PRIMARY_KEY=e.MANAGEMENT_ID=void 0 -e.MANAGEMENT_ID="00000000-0000-0000-0000-000000000001" -e.PRIMARY_KEY="uid" -e.SLUG_KEY="ID" -let A=(n=(0,t.attr)("string"),r=(0,t.attr)("string"),a=(0,t.attr)("string"),l=(0,t.attr)("string"),s=(0,t.attr)("string"),i=(0,t.attr)("string",{defaultValue:()=>""}),o=(0,t.attr)("string",{defaultValue:()=>""}),u=(0,t.attr)("string",{defaultValue:()=>""}),c=(0,t.attr)("number"),d=(0,t.attr)("number"),m=(0,t.attr)("number"),p=(0,t.attr)(),f=(0,t.attr)(),b=(0,t.attr)("string",{defaultValue:()=>""}),h=(0,t.attr)("number",{defaultValue:()=>(new Date).getTime()}),v=Ember.computed("ID"),y=class extends t.default{constructor(...e){super(...e),T(this,"uid",g,this),T(this,"ID",O,this),T(this,"Datacenter",_,this),T(this,"Namespace",P,this),T(this,"Partition",w,this),T(this,"Name",E,this),T(this,"Description",k,this),T(this,"Rules",x,this),T(this,"SyncTime",j,this),T(this,"CreateIndex",C,this),T(this,"ModifyIndex",S,this),T(this,"Datacenters",N,this),T(this,"meta",z,this),T(this,"template",M,this),T(this,"CreateTime",D,this)}get isGlobalManagement(){return"00000000-0000-0000-0000-000000000001"===this.ID}},g=L(y.prototype,"uid",[n],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),O=L(y.prototype,"ID",[r],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),_=L(y.prototype,"Datacenter",[a],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),P=L(y.prototype,"Namespace",[l],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),w=L(y.prototype,"Partition",[s],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),E=L(y.prototype,"Name",[i],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),k=L(y.prototype,"Description",[o],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),x=L(y.prototype,"Rules",[u],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),j=L(y.prototype,"SyncTime",[c],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),C=L(y.prototype,"CreateIndex",[d],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),S=L(y.prototype,"ModifyIndex",[m],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),N=L(y.prototype,"Datacenters",[p],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),z=L(y.prototype,"meta",[f],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),M=L(y.prototype,"template",[b],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),D=L(y.prototype,"CreateTime",[h],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),L(y.prototype,"isGlobalManagement",[v],Object.getOwnPropertyDescriptor(y.prototype,"isGlobalManagement"),y.prototype),y) -e.default=A})),define("consul-ui/models/proxy",["exports","@ember-data/model","consul-ui/models/service-instance"],(function(e,t,n){var r,a,l,s,i,o,u,c,d,m,p,f,b,h,v,y,g,O,_,P,w -function E(e,t,n,r){n&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(r):void 0})}function k(e,t,n,r,a){var l={} -return Object.keys(r).forEach((function(e){l[e]=r[e]})),l.enumerable=!!l.enumerable,l.configurable=!!l.configurable,("value"in l||l.initializer)&&(l.writable=!0),l=n.slice().reverse().reduce((function(n,r){return r(e,t,n)||n}),l),a&&void 0!==l.initializer&&(l.value=l.initializer?l.initializer.call(a):void 0,l.initializer=void 0),void 0===l.initializer&&(Object.defineProperty(e,t,l),l=null),l}Object.defineProperty(e,"__esModule",{value:!0}),e.default=e.SLUG_KEY=e.PRIMARY_KEY=void 0 -e.PRIMARY_KEY="uid" -e.SLUG_KEY="Node,ServiceID" -let x=(r=(0,t.attr)("string"),a=(0,t.attr)("string"),l=(0,t.attr)("string"),s=(0,t.attr)("string"),i=(0,t.attr)("string"),o=(0,t.attr)("string"),u=(0,t.attr)("string"),c=(0,t.attr)("string"),d=(0,t.attr)("number"),m=(0,t.attr)(),p=class extends n.default{constructor(...e){super(...e),E(this,"uid",f,this),E(this,"ID",b,this),E(this,"Datacenter",h,this),E(this,"Namespace",v,this),E(this,"Partition",y,this),E(this,"ServiceName",g,this),E(this,"ServiceID",O,this),E(this,"NodeName",_,this),E(this,"SyncTime",P,this),E(this,"ServiceProxy",w,this)}},f=k(p.prototype,"uid",[r],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),b=k(p.prototype,"ID",[a],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),h=k(p.prototype,"Datacenter",[l],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),v=k(p.prototype,"Namespace",[s],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),y=k(p.prototype,"Partition",[i],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),g=k(p.prototype,"ServiceName",[o],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),O=k(p.prototype,"ServiceID",[u],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),_=k(p.prototype,"NodeName",[c],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),P=k(p.prototype,"SyncTime",[d],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),w=k(p.prototype,"ServiceProxy",[m],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),p) -e.default=x})),define("consul-ui/models/role",["exports","@ember-data/model"],(function(e,t){var n,r,a,l,s,i,o,u,c,d,m,p,f,b,h,v,y,g,O,_,P,w,E,k,x,j,C,S,N,z,M,D,T -function L(e,t,n,r){n&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(r):void 0})}function A(e,t,n,r,a){var l={} -return Object.keys(r).forEach((function(e){l[e]=r[e]})),l.enumerable=!!l.enumerable,l.configurable=!!l.configurable,("value"in l||l.initializer)&&(l.writable=!0),l=n.slice().reverse().reduce((function(n,r){return r(e,t,n)||n}),l),a&&void 0!==l.initializer&&(l.value=l.initializer?l.initializer.call(a):void 0,l.initializer=void 0),void 0===l.initializer&&(Object.defineProperty(e,t,l),l=null),l}Object.defineProperty(e,"__esModule",{value:!0}),e.default=e.SLUG_KEY=e.PRIMARY_KEY=void 0 -e.PRIMARY_KEY="uid" -e.SLUG_KEY="ID" -let R=(n=(0,t.attr)("string"),r=(0,t.attr)("string"),a=(0,t.attr)("string"),l=(0,t.attr)("string"),s=(0,t.attr)("string"),i=(0,t.attr)("string",{defaultValue:()=>""}),o=(0,t.attr)("string",{defaultValue:()=>""}),u=(0,t.attr)({defaultValue:()=>[]}),c=(0,t.attr)({defaultValue:()=>[]}),d=(0,t.attr)({defaultValue:()=>[]}),m=(0,t.attr)("number"),p=(0,t.attr)("number"),f=(0,t.attr)("number"),b=(0,t.attr)("number"),h=(0,t.attr)(),v=(0,t.attr)("string"),y=class extends t.default{constructor(...e){super(...e),L(this,"uid",g,this),L(this,"ID",O,this),L(this,"Datacenter",_,this),L(this,"Namespace",P,this),L(this,"Partition",w,this),L(this,"Name",E,this),L(this,"Description",k,this),L(this,"Policies",x,this),L(this,"ServiceIdentities",j,this),L(this,"NodeIdentities",C,this),L(this,"SyncTime",S,this),L(this,"CreateIndex",N,this),L(this,"ModifyIndex",z,this),L(this,"CreateTime",M,this),L(this,"Datacenters",D,this),L(this,"Hash",T,this)}},g=A(y.prototype,"uid",[n],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),O=A(y.prototype,"ID",[r],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),_=A(y.prototype,"Datacenter",[a],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),P=A(y.prototype,"Namespace",[l],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),w=A(y.prototype,"Partition",[s],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),E=A(y.prototype,"Name",[i],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),k=A(y.prototype,"Description",[o],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),x=A(y.prototype,"Policies",[u],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),j=A(y.prototype,"ServiceIdentities",[c],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),C=A(y.prototype,"NodeIdentities",[d],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),S=A(y.prototype,"SyncTime",[m],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),N=A(y.prototype,"CreateIndex",[p],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),z=A(y.prototype,"ModifyIndex",[f],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),M=A(y.prototype,"CreateTime",[b],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),D=A(y.prototype,"Datacenters",[h],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),T=A(y.prototype,"Hash",[v],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),y) -e.default=R})),define("consul-ui/models/service-instance",["exports","@ember-data/model","ember-data-model-fragments/attributes"],(function(e,t,n){var r,a,l,s,i,o,u,c,d,m,p,f,b,h,v,y,g,O,_,P,w,E,k,x,j,C,S,N,z,M,D,T,L,A,R,I,B,H,$,U,F,q,K,Y,V,W,G,Q,Z,J,X,ee,te -function ne(e,t,n,r){n&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(r):void 0})}function re(e,t,n,r,a){var l={} -return Object.keys(r).forEach((function(e){l[e]=r[e]})),l.enumerable=!!l.enumerable,l.configurable=!!l.configurable,("value"in l||l.initializer)&&(l.writable=!0),l=n.slice().reverse().reduce((function(n,r){return r(e,t,n)||n}),l),a&&void 0!==l.initializer&&(l.value=l.initializer?l.initializer.call(a):void 0,l.initializer=void 0),void 0===l.initializer&&(Object.defineProperty(e,t,l),l=null),l}Object.defineProperty(e,"__esModule",{value:!0}),e.default=e.Collection=e.SLUG_KEY=e.PRIMARY_KEY=void 0 -e.PRIMARY_KEY="uid" -e.SLUG_KEY="Node.Node,Service.ID" -const ae=(r=Ember._tracked,l=re((a=class{constructor(e){ne(this,"items",l,this),this.items=e}get ExternalSources(){const e=this.items.reduce((function(e,t){return e.concat(t.ExternalSources||[])}),[]) -return[...new Set(e)].filter(Boolean).sort()}}).prototype,"items",[r],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),a) -e.Collection=ae -let le=(s=(0,t.attr)("string"),i=(0,t.attr)("string"),o=(0,t.attr)(),u=(0,t.attr)(),c=(0,t.attr)(),d=(0,n.fragmentArray)("health-check"),m=(0,t.attr)("number"),p=(0,t.attr)(),f=(0,t.attr)({defaultValue:()=>[]}),b=Ember.computed.alias("Service.Service"),h=Ember.computed.or("Service.{ID,Service}"),v=Ember.computed.or("Service.Address","Node.Service"),y=(0,t.attr)("string"),g=Ember.computed.alias("Service.Tags"),O=Ember.computed.alias("Service.Meta"),_=Ember.computed.alias("Service.Namespace"),P=Ember.computed.alias("Service.Partition"),w=Ember.computed.filter("Checks.@each.Kind",e=>"service"===e.Kind),E=Ember.computed.filter("Checks.@each.Kind",e=>"node"===e.Kind),k=Ember.computed("Service.Meta"),x=Ember.computed("Service.Kind"),j=Ember.computed("Service.Kind"),C=Ember.computed("IsOrigin"),S=Ember.computed("ChecksPassing","ChecksWarning","ChecksCritical"),N=Ember.computed("Checks.[]"),z=Ember.computed("Checks.[]"),M=Ember.computed("Checks.[]"),D=Ember.computed("Checks.[]","ChecksPassing"),T=Ember.computed("Checks.[]","ChecksWarning"),L=Ember.computed("Checks.[]","ChecksCritical"),A=class extends t.default{constructor(...e){super(...e),ne(this,"uid",R,this),ne(this,"Datacenter",I,this),ne(this,"Proxy",B,this),ne(this,"Node",H,this),ne(this,"Service",$,this),ne(this,"Checks",U,this),ne(this,"SyncTime",F,this),ne(this,"meta",q,this),ne(this,"Resources",K,this),ne(this,"Name",Y,this),ne(this,"ID",V,this),ne(this,"Address",W,this),ne(this,"SocketPath",G,this),ne(this,"Tags",Q,this),ne(this,"Meta",Z,this),ne(this,"Namespace",J,this),ne(this,"Partition",X,this),ne(this,"ServiceChecks",ee,this),ne(this,"NodeChecks",te,this)}get ExternalSources(){const e=Object.entries(this.Service.Meta||{}).filter(([e,t])=>"external-source"===e).map(([e,t])=>t) -return[...new Set(e)]}get IsProxy(){return["connect-proxy","mesh-gateway","ingress-gateway","terminating-gateway"].includes(this.Service.Kind)}get IsOrigin(){return!["connect-proxy","mesh-gateway"].includes(this.Service.Kind)}get IsMeshOrigin(){return this.IsOrigin&&!["terminating-gateway"].includes(this.Service.Kind)}get Status(){switch(!0){case 0!==this.ChecksCritical.length:return"critical" -case 0!==this.ChecksWarning.length:return"warning" -case 0!==this.ChecksPassing.length:return"passing" -default:return"empty"}}get ChecksPassing(){return this.Checks.filter(e=>"passing"===e.Status)}get ChecksWarning(){return this.Checks.filter(e=>"warning"===e.Status)}get ChecksCritical(){return this.Checks.filter(e=>"critical"===e.Status)}get PercentageChecksPassing(){return this.ChecksPassing.length/this.Checks.length*100}get PercentageChecksWarning(){return this.ChecksWarning.length/this.Checks.length*100}get PercentageChecksCritical(){return this.ChecksCritical.length/this.Checks.length*100}},R=re(A.prototype,"uid",[s],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),I=re(A.prototype,"Datacenter",[i],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),B=re(A.prototype,"Proxy",[o],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),H=re(A.prototype,"Node",[u],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),$=re(A.prototype,"Service",[c],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),U=re(A.prototype,"Checks",[d],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),F=re(A.prototype,"SyncTime",[m],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),q=re(A.prototype,"meta",[p],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),K=re(A.prototype,"Resources",[f],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),Y=re(A.prototype,"Name",[b],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),V=re(A.prototype,"ID",[h],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),W=re(A.prototype,"Address",[v],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),G=re(A.prototype,"SocketPath",[y],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),Q=re(A.prototype,"Tags",[g],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),Z=re(A.prototype,"Meta",[O],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),J=re(A.prototype,"Namespace",[_],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),X=re(A.prototype,"Partition",[P],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),ee=re(A.prototype,"ServiceChecks",[w],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),te=re(A.prototype,"NodeChecks",[E],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),re(A.prototype,"ExternalSources",[k],Object.getOwnPropertyDescriptor(A.prototype,"ExternalSources"),A.prototype),re(A.prototype,"IsProxy",[x],Object.getOwnPropertyDescriptor(A.prototype,"IsProxy"),A.prototype),re(A.prototype,"IsOrigin",[j],Object.getOwnPropertyDescriptor(A.prototype,"IsOrigin"),A.prototype),re(A.prototype,"IsMeshOrigin",[C],Object.getOwnPropertyDescriptor(A.prototype,"IsMeshOrigin"),A.prototype),re(A.prototype,"Status",[S],Object.getOwnPropertyDescriptor(A.prototype,"Status"),A.prototype),re(A.prototype,"ChecksPassing",[N],Object.getOwnPropertyDescriptor(A.prototype,"ChecksPassing"),A.prototype),re(A.prototype,"ChecksWarning",[z],Object.getOwnPropertyDescriptor(A.prototype,"ChecksWarning"),A.prototype),re(A.prototype,"ChecksCritical",[M],Object.getOwnPropertyDescriptor(A.prototype,"ChecksCritical"),A.prototype),re(A.prototype,"PercentageChecksPassing",[D],Object.getOwnPropertyDescriptor(A.prototype,"PercentageChecksPassing"),A.prototype),re(A.prototype,"PercentageChecksWarning",[T],Object.getOwnPropertyDescriptor(A.prototype,"PercentageChecksWarning"),A.prototype),re(A.prototype,"PercentageChecksCritical",[L],Object.getOwnPropertyDescriptor(A.prototype,"PercentageChecksCritical"),A.prototype),A) -e.default=le})),define("consul-ui/models/service",["exports","@ember-data/model","ember-data-model-fragments/attributes","consul-ui/decorators/replace"],(function(e,t,n,r){var a,l,s,i,o,u,c,d,m,p,f,b,h,v,y,g,O,_,P,w,E,k,x,j,C,S,N,z,M,D,T,L,A,R,I,B,H,$,U,F,q,K,Y,V,W,G,Q,Z,J,X,ee,te,ne,re,ae,le,se,ie,oe,ue -function ce(e,t,n,r){n&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(r):void 0})}function de(e,t,n,r,a){var l={} -return Object.keys(r).forEach((function(e){l[e]=r[e]})),l.enumerable=!!l.enumerable,l.configurable=!!l.configurable,("value"in l||l.initializer)&&(l.writable=!0),l=n.slice().reverse().reduce((function(n,r){return r(e,t,n)||n}),l),a&&void 0!==l.initializer&&(l.value=l.initializer?l.initializer.call(a):void 0,l.initializer=void 0),void 0===l.initializer&&(Object.defineProperty(e,t,l),l=null),l}Object.defineProperty(e,"__esModule",{value:!0}),e.default=e.Collection=e.SLUG_KEY=e.PRIMARY_KEY=void 0 -e.PRIMARY_KEY="uid" -e.SLUG_KEY="Name" -const me=(a=Ember._tracked,s=de((l=class{constructor(e){ce(this,"items",s,this),this.items=e}get ExternalSources(){const e=this.items.reduce((function(e,t){return e.concat(t.ExternalSources||[])}),[]) -return[...new Set(e)].filter(Boolean).sort()}get Partitions(){return[...new Set(this.items.map(e=>e.Partition))].sort()}}).prototype,"items",[a],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),l) -e.Collection=me -let pe=(i=(0,t.attr)("string"),o=(0,t.attr)("string"),u=(0,t.attr)("string"),c=(0,t.attr)("string"),d=(0,t.attr)("string"),m=(0,t.attr)("string"),p=(0,t.attr)("number"),f=(0,t.attr)("number"),b=(0,t.attr)("number"),h=(0,t.attr)("number"),v=(0,t.attr)("boolean"),y=(0,t.attr)("boolean"),g=(0,t.attr)({defaultValue:()=>[]}),O=(0,t.attr)("number"),_=(0,t.attr)("number"),P=(0,t.attr)("number"),w=(0,r.nullValue)([]),E=(0,t.attr)({defaultValue:()=>[]}),k=(0,t.attr)(),x=(0,t.attr)(),j=(0,n.fragment)("gateway-config"),C=(0,r.nullValue)([]),S=(0,t.attr)(),N=(0,t.attr)(),z=(0,t.attr)(),M=Ember.computed("ChecksPassing","ChecksWarning","ChecksCritical"),D=Ember.computed("MeshChecksPassing","MeshChecksWarning","MeshChecksCritical"),T=Ember.computed("ConnectedWithProxy","ConnectedWithGateway"),L=Ember.computed("MeshEnabled","Kind"),A=Ember.computed("MeshChecksPassing","MeshChecksWarning","MeshChecksCritical"),R=Ember.computed("ChecksPassing","Proxy.ChecksPassing"),I=Ember.computed("ChecksWarning","Proxy.ChecksWarning"),B=Ember.computed("ChecksCritical","Proxy.ChecksCritical"),H=class extends t.default{constructor(...e){super(...e),ce(this,"uid",$,this),ce(this,"Name",U,this),ce(this,"Datacenter",F,this),ce(this,"Namespace",q,this),ce(this,"Partition",K,this),ce(this,"Kind",Y,this),ce(this,"ChecksPassing",V,this),ce(this,"ChecksCritical",W,this),ce(this,"ChecksWarning",G,this),ce(this,"InstanceCount",Q,this),ce(this,"ConnectedWithGateway",Z,this),ce(this,"ConnectedWithProxy",J,this),ce(this,"Resources",X,this),ce(this,"SyncTime",ee,this),ce(this,"CreateIndex",te,this),ce(this,"ModifyIndex",ne,this),ce(this,"Tags",re,this),ce(this,"Nodes",ae,this),ce(this,"Proxy",le,this),ce(this,"GatewayConfig",se,this),ce(this,"ExternalSources",ie,this),ce(this,"Meta",oe,this),ce(this,"meta",ue,this)}get ChecksTotal(){return this.ChecksPassing+this.ChecksWarning+this.ChecksCritical}get MeshChecksTotal(){return this.MeshChecksPassing+this.MeshChecksWarning+this.MeshChecksCritical}get MeshEnabled(){return this.ConnectedWithProxy||this.ConnectedWithGateway}get InMesh(){return this.MeshEnabled||(this.Kind||"").length>0}get MeshStatus(){switch(!0){case 0!==this.MeshChecksCritical:return"critical" -case 0!==this.MeshChecksWarning:return"warning" -case 0!==this.MeshChecksPassing:return"passing" -default:return"empty"}}get MeshChecksPassing(){let e=0 -return void 0!==this.Proxy&&(e=this.Proxy.ChecksPassing),this.ChecksPassing+e}get MeshChecksWarning(){let e=0 -return void 0!==this.Proxy&&(e=this.Proxy.ChecksWarning),this.ChecksWarning+e}get MeshChecksCritical(){let e=0 -return void 0!==this.Proxy&&(e=this.Proxy.ChecksCritical),this.ChecksCritical+e}},$=de(H.prototype,"uid",[i],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),U=de(H.prototype,"Name",[o],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),F=de(H.prototype,"Datacenter",[u],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),q=de(H.prototype,"Namespace",[c],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),K=de(H.prototype,"Partition",[d],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),Y=de(H.prototype,"Kind",[m],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),V=de(H.prototype,"ChecksPassing",[p],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),W=de(H.prototype,"ChecksCritical",[f],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),G=de(H.prototype,"ChecksWarning",[b],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),Q=de(H.prototype,"InstanceCount",[h],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),Z=de(H.prototype,"ConnectedWithGateway",[v],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),J=de(H.prototype,"ConnectedWithProxy",[y],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),X=de(H.prototype,"Resources",[g],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),ee=de(H.prototype,"SyncTime",[O],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),te=de(H.prototype,"CreateIndex",[_],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),ne=de(H.prototype,"ModifyIndex",[P],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),re=de(H.prototype,"Tags",[w,E],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),ae=de(H.prototype,"Nodes",[k],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),le=de(H.prototype,"Proxy",[x],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),se=de(H.prototype,"GatewayConfig",[j],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),ie=de(H.prototype,"ExternalSources",[C,S],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),oe=de(H.prototype,"Meta",[N],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),ue=de(H.prototype,"meta",[z],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),de(H.prototype,"ChecksTotal",[M],Object.getOwnPropertyDescriptor(H.prototype,"ChecksTotal"),H.prototype),de(H.prototype,"MeshChecksTotal",[D],Object.getOwnPropertyDescriptor(H.prototype,"MeshChecksTotal"),H.prototype),de(H.prototype,"MeshEnabled",[T],Object.getOwnPropertyDescriptor(H.prototype,"MeshEnabled"),H.prototype),de(H.prototype,"InMesh",[L],Object.getOwnPropertyDescriptor(H.prototype,"InMesh"),H.prototype),de(H.prototype,"MeshStatus",[A],Object.getOwnPropertyDescriptor(H.prototype,"MeshStatus"),H.prototype),de(H.prototype,"MeshChecksPassing",[R],Object.getOwnPropertyDescriptor(H.prototype,"MeshChecksPassing"),H.prototype),de(H.prototype,"MeshChecksWarning",[I],Object.getOwnPropertyDescriptor(H.prototype,"MeshChecksWarning"),H.prototype),de(H.prototype,"MeshChecksCritical",[B],Object.getOwnPropertyDescriptor(H.prototype,"MeshChecksCritical"),H.prototype),H) -e.default=pe})),define("consul-ui/models/session",["exports","@ember-data/model","consul-ui/decorators/replace"],(function(e,t,n){var r,a,l,s,i,o,u,c,d,m,p,f,b,h,v,y,g,O,_,P,w,E,k,x,j,C,S,N,z,M,D,T,L,A,R,I -function B(e,t,n,r){n&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(r):void 0})}function H(e,t,n,r,a){var l={} -return Object.keys(r).forEach((function(e){l[e]=r[e]})),l.enumerable=!!l.enumerable,l.configurable=!!l.configurable,("value"in l||l.initializer)&&(l.writable=!0),l=n.slice().reverse().reduce((function(n,r){return r(e,t,n)||n}),l),a&&void 0!==l.initializer&&(l.value=l.initializer?l.initializer.call(a):void 0,l.initializer=void 0),void 0===l.initializer&&(Object.defineProperty(e,t,l),l=null),l}Object.defineProperty(e,"__esModule",{value:!0}),e.default=e.SLUG_KEY=e.PRIMARY_KEY=void 0 -e.PRIMARY_KEY="uid" -e.SLUG_KEY="ID" -let $=(r=(0,t.attr)("string"),a=(0,t.attr)("string"),l=(0,t.attr)("string"),s=(0,t.attr)("string"),i=(0,t.attr)("string"),o=(0,t.attr)("string"),u=(0,t.attr)("string"),c=(0,t.attr)("string"),d=(0,t.attr)("string"),m=(0,t.attr)("number"),p=(0,t.attr)("number"),f=(0,t.attr)("number"),b=(0,t.attr)("number"),h=(0,n.nullValue)([]),v=(0,t.attr)({defaultValue:()=>[]}),y=(0,n.nullValue)([]),g=(0,t.attr)({defaultValue:()=>[]}),O=(0,t.attr)({defaultValue:()=>[]}),_=Ember.computed("NodeChecks","ServiceChecks"),P=class extends t.default{constructor(...e){super(...e),B(this,"uid",w,this),B(this,"ID",E,this),B(this,"Name",k,this),B(this,"Datacenter",x,this),B(this,"Namespace",j,this),B(this,"Partition",C,this),B(this,"Node",S,this),B(this,"Behavior",N,this),B(this,"TTL",z,this),B(this,"LockDelay",M,this),B(this,"SyncTime",D,this),B(this,"CreateIndex",T,this),B(this,"ModifyIndex",L,this),B(this,"NodeChecks",A,this),B(this,"ServiceChecks",R,this),B(this,"Resources",I,this)}get checks(){return[...this.NodeChecks,...this.ServiceChecks.map(({ID:e})=>e)]}},w=H(P.prototype,"uid",[r],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),E=H(P.prototype,"ID",[a],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),k=H(P.prototype,"Name",[l],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),x=H(P.prototype,"Datacenter",[s],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),j=H(P.prototype,"Namespace",[i],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),C=H(P.prototype,"Partition",[o],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),S=H(P.prototype,"Node",[u],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),N=H(P.prototype,"Behavior",[c],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),z=H(P.prototype,"TTL",[d],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),M=H(P.prototype,"LockDelay",[m],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),D=H(P.prototype,"SyncTime",[p],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),T=H(P.prototype,"CreateIndex",[f],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),L=H(P.prototype,"ModifyIndex",[b],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),A=H(P.prototype,"NodeChecks",[h,v],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),R=H(P.prototype,"ServiceChecks",[y,g],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),I=H(P.prototype,"Resources",[O],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),H(P.prototype,"checks",[_],Object.getOwnPropertyDescriptor(P.prototype,"checks"),P.prototype),P) -e.default=$})),define("consul-ui/models/token",["exports","@ember-data/model","consul-ui/models/policy"],(function(e,t,n){var r,a,l,s,i,o,u,c,d,m,p,f,b,h,v,y,g,O,_,P,w,E,k,x,j,C,S,N,z,M,D,T,L,A,R,I,B,H,$,U,F,q,K,Y,V,W,G -function Q(e,t,n,r){n&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(r):void 0})}function Z(e,t,n,r,a){var l={} -return Object.keys(r).forEach((function(e){l[e]=r[e]})),l.enumerable=!!l.enumerable,l.configurable=!!l.configurable,("value"in l||l.initializer)&&(l.writable=!0),l=n.slice().reverse().reduce((function(n,r){return r(e,t,n)||n}),l),a&&void 0!==l.initializer&&(l.value=l.initializer?l.initializer.call(a):void 0,l.initializer=void 0),void 0===l.initializer&&(Object.defineProperty(e,t,l),l=null),l}Object.defineProperty(e,"__esModule",{value:!0}),e.default=e.SLUG_KEY=e.PRIMARY_KEY=void 0 -e.PRIMARY_KEY="uid" -e.SLUG_KEY="AccessorID" -let J=(r=(0,t.attr)("string"),a=(0,t.attr)("string"),l=(0,t.attr)("string"),s=(0,t.attr)("string"),i=(0,t.attr)("string"),o=(0,t.attr)("string"),u=(0,t.attr)("string"),c=(0,t.attr)("boolean"),d=(0,t.attr)("boolean"),m=(0,t.attr)("string",{defaultValue:()=>""}),p=(0,t.attr)(),f=(0,t.attr)({defaultValue:()=>[]}),b=(0,t.attr)({defaultValue:()=>[]}),h=(0,t.attr)({defaultValue:()=>[]}),v=(0,t.attr)({defaultValue:()=>[]}),y=(0,t.attr)("date"),g=(0,t.attr)("string"),O=(0,t.attr)("number"),_=(0,t.attr)("number"),P=(0,t.attr)("string"),w=(0,t.attr)("string",{defaultValue:()=>""}),E=(0,t.attr)("string"),k=Ember.computed("Policies.[]"),x=Ember.computed("SecretID"),j=class extends t.default{constructor(...e){super(...e),Q(this,"uid",C,this),Q(this,"AccessorID",S,this),Q(this,"Datacenter",N,this),Q(this,"Namespace",z,this),Q(this,"Partition",M,this),Q(this,"IDPName",D,this),Q(this,"SecretID",T,this),Q(this,"Legacy",L,this),Q(this,"Local",A,this),Q(this,"Description",R,this),Q(this,"meta",I,this),Q(this,"Policies",B,this),Q(this,"Roles",H,this),Q(this,"ServiceIdentities",$,this),Q(this,"NodeIdentities",U,this),Q(this,"CreateTime",F,this),Q(this,"Hash",q,this),Q(this,"CreateIndex",K,this),Q(this,"ModifyIndex",Y,this),Q(this,"Type",V,this),Q(this,"Name",W,this),Q(this,"Rules",G,this)}get isGlobalManagement(){return(this.Policies||[]).find(e=>e.ID===n.MANAGEMENT_ID)}get hasSecretID(){return""!==this.SecretID&&""!==this.SecretID}},C=Z(j.prototype,"uid",[r],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),S=Z(j.prototype,"AccessorID",[a],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),N=Z(j.prototype,"Datacenter",[l],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),z=Z(j.prototype,"Namespace",[s],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),M=Z(j.prototype,"Partition",[i],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),D=Z(j.prototype,"IDPName",[o],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),T=Z(j.prototype,"SecretID",[u],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),L=Z(j.prototype,"Legacy",[c],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),A=Z(j.prototype,"Local",[d],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),R=Z(j.prototype,"Description",[m],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),I=Z(j.prototype,"meta",[p],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),B=Z(j.prototype,"Policies",[f],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),H=Z(j.prototype,"Roles",[b],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),$=Z(j.prototype,"ServiceIdentities",[h],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),U=Z(j.prototype,"NodeIdentities",[v],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),F=Z(j.prototype,"CreateTime",[y],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),q=Z(j.prototype,"Hash",[g],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),K=Z(j.prototype,"CreateIndex",[O],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),Y=Z(j.prototype,"ModifyIndex",[_],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),V=Z(j.prototype,"Type",[P],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),W=Z(j.prototype,"Name",[w],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),G=Z(j.prototype,"Rules",[E],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),Z(j.prototype,"isGlobalManagement",[k],Object.getOwnPropertyDescriptor(j.prototype,"isGlobalManagement"),j.prototype),Z(j.prototype,"hasSecretID",[x],Object.getOwnPropertyDescriptor(j.prototype,"hasSecretID"),j.prototype),j) -e.default=J})),define("consul-ui/models/topology",["exports","@ember-data/model"],(function(e,t){var n,r,a,l,s,i,o,u,c,d,m,p,f,b,h,v,y,g,O,_,P,w,E,k,x,j,C,S -function N(e,t,n,r){n&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(r):void 0})}function z(e,t,n,r,a){var l={} -return Object.keys(r).forEach((function(e){l[e]=r[e]})),l.enumerable=!!l.enumerable,l.configurable=!!l.configurable,("value"in l||l.initializer)&&(l.writable=!0),l=n.slice().reverse().reduce((function(n,r){return r(e,t,n)||n}),l),a&&void 0!==l.initializer&&(l.value=l.initializer?l.initializer.call(a):void 0,l.initializer=void 0),void 0===l.initializer&&(Object.defineProperty(e,t,l),l=null),l}Object.defineProperty(e,"__esModule",{value:!0}),e.default=e.SLUG_KEY=e.PRIMARY_KEY=void 0 -e.PRIMARY_KEY="uid" -e.SLUG_KEY="ServiceName" -let M=(n=(0,t.attr)("string"),r=(0,t.attr)("string"),a=(0,t.attr)("string"),l=(0,t.attr)("string"),s=(0,t.attr)("string"),i=(0,t.attr)("string"),o=(0,t.attr)("boolean"),u=(0,t.attr)("boolean"),c=(0,t.attr)("boolean"),d=(0,t.attr)(),m=(0,t.attr)(),p=(0,t.attr)(),f=Ember.computed("Downstreams"),b=Ember.computed("Downstreams","Upstreams"),h=Ember.computed("Downstreams","Upstreams"),v=class extends t.default{constructor(...e){super(...e),N(this,"uid",y,this),N(this,"ServiceName",g,this),N(this,"Datacenter",O,this),N(this,"Namespace",_,this),N(this,"Partition",P,this),N(this,"Protocol",w,this),N(this,"FilteredByACLs",E,this),N(this,"TransparentProxy",k,this),N(this,"ConnectNative",x,this),N(this,"Upstreams",j,this),N(this,"Downstreams",C,this),N(this,"meta",S,this)}get notDefinedIntention(){let e=!1 -return e=0!==this.Downstreams.filter(e=>"specific-intention"===e.Source&&!e.TransparentProxy&&!e.ConnectNative&&e.Intention.Allowed).length,e}get wildcardIntention(){const e=0!==this.Downstreams.filter(e=>!e.Intention.HasExact&&e.Intention.Allowed).length,t=0!==this.Upstreams.filter(e=>!e.Intention.HasExact&&e.Intention.Allowed).length -return e||t}get noDependencies(){return 0===this.Upstreams.length&&0===this.Downstreams.length}},y=z(v.prototype,"uid",[n],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),g=z(v.prototype,"ServiceName",[r],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),O=z(v.prototype,"Datacenter",[a],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),_=z(v.prototype,"Namespace",[l],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),P=z(v.prototype,"Partition",[s],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),w=z(v.prototype,"Protocol",[i],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),E=z(v.prototype,"FilteredByACLs",[o],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),k=z(v.prototype,"TransparentProxy",[u],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),x=z(v.prototype,"ConnectNative",[c],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),j=z(v.prototype,"Upstreams",[d],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),C=z(v.prototype,"Downstreams",[m],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),S=z(v.prototype,"meta",[p],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),z(v.prototype,"notDefinedIntention",[f],Object.getOwnPropertyDescriptor(v.prototype,"notDefinedIntention"),v.prototype),z(v.prototype,"wildcardIntention",[b],Object.getOwnPropertyDescriptor(v.prototype,"wildcardIntention"),v.prototype),z(v.prototype,"noDependencies",[h],Object.getOwnPropertyDescriptor(v.prototype,"noDependencies"),v.prototype),v) -e.default=M})),define("consul-ui/modifiers/aria-menu",["exports","ember-modifier"],(function(e,t){var n,r,a,l,s -function i(e,t,n,r,a){var l={} -return Object.keys(r).forEach((function(e){l[e]=r[e]})),l.enumerable=!!l.enumerable,l.configurable=!!l.configurable,("value"in l||l.initializer)&&(l.writable=!0),l=n.slice().reverse().reduce((function(n,r){return r(e,t,n)||n}),l),a&&void 0!==l.initializer&&(l.value=l.initializer?l.initializer.call(a):void 0,l.initializer=void 0),void 0===l.initializer&&(Object.defineProperty(e,t,l),l=null),l}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const o={vertical:{40:(e,t=-1)=>(t+1)%e.length,38:(e,t=0)=>0===t?e.length-1:t-1,36:()=>0,35:e=>e.length-1},horizontal:{}} -let u=(n=Ember.inject.service("-document"),r=Ember._action,a=Ember._action,l=class extends t.default{constructor(...e){var t,n,r,a,l,i,o -super(...e),t=this,n="doc",a=this,(r=s)&&Object.defineProperty(t,n,{enumerable:r.enumerable,configurable:r.configurable,writable:r.writable,value:r.initializer?r.initializer.call(a):void 0}),o="vertical",(i="orientation")in(l=this)?Object.defineProperty(l,i,{value:o,enumerable:!0,configurable:!0,writable:!0}):l[i]=o}async keydown(e){if(27===e.keyCode)return this.options.onclose(e),void this.$trigger.focus() -const t=[...this.element.querySelectorAll('[role^="menuitem"]')],n=t.findIndex(e=>e===this.doc.activeElement) -9!==e.keyCode?void 0!==o[this.orientation][e.keyCode]&&(t[o[this.orientation][e.keyCode](t,n)].focus(),e.stopPropagation(),e.preventDefault()):e.shiftKey?0===n&&(this.options.onclose(e),this.$trigger.focus()):n===t.length-1&&(await new Promise(e=>setTimeout(e,0)),this.options.onclose(e))}async focus(e){""===e.pointerType&&(await Promise.resolve(),this.keydown({keyCode:36,stopPropagation:()=>{},preventDefault:()=>{}}))}connect(e,t){this.$trigger=this.doc.getElementById(this.element.getAttribute("aria-labelledby")),void 0!==t.openEvent&&this.focus(t.openEvent),this.doc.addEventListener("keydown",this.keydown)}disconnect(){this.doc.removeEventListener("keydown",this.keydown)}didReceiveArguments(){this.params=this.args.positional,this.options=this.args.named}didInstall(){this.connect(this.args.positional,this.args.named)}willRemove(){this.disconnect()}},s=i(l.prototype,"doc",[n],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),i(l.prototype,"keydown",[r],Object.getOwnPropertyDescriptor(l.prototype,"keydown"),l.prototype),i(l.prototype,"focus",[a],Object.getOwnPropertyDescriptor(l.prototype,"focus"),l.prototype),l) -e.default=u})),define("consul-ui/modifiers/attach-shadow",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -var t=Ember._setModifierManager(()=>({capabilities:Ember._modifierManagerCapabilities("3.13",{disableAutoTracking:!0}),createModifier(){},installModifier(e,t,n){let r,{positional:[a,...l],named:s}=n -try{r=t.attachShadow({mode:"open"})}catch(i){console.error(i)}a(r)},updateModifier(){},destroyModifier(){}}),class{}) -e.default=t})),define("consul-ui/modifiers/css-prop",["exports","ember-modifier"],(function(e,t){var n,r,a -Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -let l=(n=Ember.inject.service("-document"),r=class extends t.default{constructor(...e){var t,n,r,l -super(...e),t=this,n="doc",l=this,(r=a)&&Object.defineProperty(t,n,{enumerable:r.enumerable,configurable:r.configurable,writable:r.writable,value:r.initializer?r.initializer.call(l):void 0})}didReceiveArguments(){const e=this.args.positional,t=this.args.named;(e[1]||t.returns)(this.doc.defaultView.getComputedStyle(this.element).getPropertyValue(e[0]))}},s=r.prototype,i="doc",o=[n],u={configurable:!0,enumerable:!0,writable:!0,initializer:null},d={},Object.keys(u).forEach((function(e){d[e]=u[e]})),d.enumerable=!!d.enumerable,d.configurable=!!d.configurable,("value"in d||d.initializer)&&(d.writable=!0),d=o.slice().reverse().reduce((function(e,t){return t(s,i,e)||e}),d),c&&void 0!==d.initializer&&(d.value=d.initializer?d.initializer.call(c):void 0,d.initializer=void 0),void 0===d.initializer&&(Object.defineProperty(s,i,d),d=null),a=d,r) -var s,i,o,u,c,d -e.default=l})),define("consul-ui/modifiers/css-props",["exports","ember-modifier"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const n=Object.fromEntries([...document.styleSheets].reduce((e,t)=>e.concat([...t.cssRules].filter(e=>1===e.type).reduce((e,t)=>[...e,...[...t.style].filter(e=>e.startsWith("--")).map(e=>[e.trim(),t.style.getPropertyValue(e).trim()])],[])),[])) -var r=(0,t.modifier)((function(e,[t],r){const a=new RegExp(`^--${r.prefix||"."}${r.group||""}+`),l={} -Object.entries(n).forEach(([e,t])=>{const n=e.match(a) -if(n){let a=n[0] -"-"===a.charAt(a.length-1)&&(a=a.substr(0,a.length-1)),r.group?(void 0===l[a]&&(l[a]={}),l[a][e]=t):l[e]=t}}),t(l)})) -e.default=r})),define("consul-ui/modifiers/did-insert",["exports","@ember/render-modifiers/modifiers/did-insert"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/modifiers/did-update",["exports","@ember/render-modifiers/modifiers/did-update"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/modifiers/did-upsert",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const t=e=>({target:e.element,currentTarget:e.element}) -var n=Ember._setModifierManager(()=>({capabilities:Ember._modifierManagerCapabilities("3.13",{disableAutoTracking:!0}),createModifier:()=>({element:null}),installModifier(e,n,r){e.element=n -const[a,...l]=r.positional -a(t(e),l,r.named)},updateModifier(e,n){const[r,...a]=n.positional -r(t(e),a,n.named)},destroyModifier(){}}),class{}) -e.default=n})),define("consul-ui/modifiers/disabled",["exports","ember-modifier"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -var n=(0,t.modifier)((function(e,[t=!0]){if(["input","textarea","select","button"].includes(e.nodeName.toLowerCase()))t?(e.setAttribute("disabled",t),e.setAttribute("aria-disabled",t)):(e.dataset.disabled=!1,e.removeAttribute("disabled"),e.removeAttribute("aria-disabled")) -else for(const n of e.querySelectorAll("input,textarea,button"))t&&"false"!==n.dataset.disabled?(e.setAttribute("disabled",t),e.setAttribute("aria-disabled",t)):(e.removeAttribute("disabled"),e.removeAttribute("aria-disabled"))})) -e.default=n})),define("consul-ui/modifiers/in-viewport",["exports","ember-in-viewport/modifiers/in-viewport"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/modifiers/notification",["exports","ember-modifier"],(function(e,t){var n,r,a -function l(e,t){var n=Object.keys(e) -if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e) -t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function s(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -let i=(n=Ember.inject.service("flashMessages"),r=class extends t.default{constructor(...e){var t,n,r,l -super(...e),t=this,n="notify",l=this,(r=a)&&Object.defineProperty(t,n,{enumerable:r.enumerable,configurable:r.configurable,writable:r.writable,value:r.initializer?r.initializer.call(l):void 0})}didInstall(){this.element.setAttribute("role","alert"),this.element.dataset.notification=null -const e=function(e){for(var t=1;te.after()).catch(e=>{if("TransitionAborted"!==e.name)throw e}).then(()=>{this.notify.add(e)}):this.notify.add(e)}willDestroy(){this.args.named.sticky&&this.notify.clearMessages()}},o=r.prototype,u="notify",c=[n],d={configurable:!0,enumerable:!0,writable:!0,initializer:null},p={},Object.keys(d).forEach((function(e){p[e]=d[e]})),p.enumerable=!!p.enumerable,p.configurable=!!p.configurable,("value"in p||p.initializer)&&(p.writable=!0),p=c.slice().reverse().reduce((function(e,t){return t(o,u,e)||e}),p),m&&void 0!==p.initializer&&(p.value=p.initializer?p.initializer.call(m):void 0,p.initializer=void 0),void 0===p.initializer&&(Object.defineProperty(o,u,p),p=null),a=p,r) -var o,u,c,d,m,p -e.default=i})) -define("consul-ui/modifiers/on-outside",["exports","ember-modifier"],(function(e,t){var n,r,a,l -function s(e,t,n,r,a){var l={} -return Object.keys(r).forEach((function(e){l[e]=r[e]})),l.enumerable=!!l.enumerable,l.configurable=!!l.configurable,("value"in l||l.initializer)&&(l.writable=!0),l=n.slice().reverse().reduce((function(n,r){return r(e,t,n)||n}),l),a&&void 0!==l.initializer&&(l.value=l.initializer?l.initializer.call(a):void 0,l.initializer=void 0),void 0===l.initializer&&(Object.defineProperty(e,t,l),l=null),l}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -let i=(n=Ember.inject.service("dom"),r=Ember._action,a=class extends t.default{constructor(){var e,t,n,r -super(...arguments),e=this,t="dom",r=this,(n=l)&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(r):void 0}),this.doc=this.dom.document()}async connect(e,t){await new Promise(e=>setTimeout(e,0)) -try{this.doc.addEventListener(e[0],this.listen)}catch(n){}}listen(e){if(this.dom.isOutside(this.element,e.target)){("function"==typeof this.params[1]?this.params[1]:()=>{}).apply(this.element,[e])}}disconnect(){this.doc.removeEventListener("click",this.listen)}didReceiveArguments(){this.params=this.args.positional,this.options=this.args.named}didInstall(){this.connect(this.args.positional,this.args.named)}willRemove(){this.disconnect()}},l=s(a.prototype,"dom",[n],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),s(a.prototype,"listen",[r],Object.getOwnPropertyDescriptor(a.prototype,"listen"),a.prototype),a) -e.default=i})),define("consul-ui/modifiers/on-resize",["exports","ember-on-resize-modifier/modifiers/on-resize"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/modifiers/ref",["exports","ember-ref-modifier/modifiers/ref"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/modifiers/style",["exports","ember-modifier"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -class n extends t.default{setStyles(e=[]){const t=this._oldStyles||new Set -Array.isArray(e)||(e=Object.entries(e)),e.forEach(([e,n])=>{let r="" -n.length>0&&n.includes("!important")&&(r="important",n=n.replace("!important","")),this.element.style.setProperty(e,n,r),t.delete(e)}),t.forEach(e=>this.element.style.removeProperty(e)),this._oldStyles=new Set(e.map(e=>e[0]))}didReceiveArguments(){void 0!==this.args.named.delay?setTimeout(()=>{typeof this!==this.args.positional[0]&&this.setStyles(this.args.positional[0])},this.args.named.delay):this.setStyles(this.args.positional[0])}}e.default=n})),define("consul-ui/modifiers/tooltip",["exports","ember-modifier","tippy.js"],(function(e,t,n){function r(e,t){var n=Object.keys(e) -if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e) -t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -var l=(0,t.modifier)((e,[t],l={})=>{const s=l.options||{} -let i,o=e -if("string"==typeof s.triggerTarget){const e=o -switch(s.triggerTarget){case"parentNode":o=o.parentNode -break -default:o=o.querySelectorAll(s.triggerTarget)}t=o.cloneNode(!0),e.remove(),l.options.triggerTarget=void 0}if(void 0===t&&(t=o.innerHTML,o.innerHTML=""),"manual"===s.trigger){const e=s.delay||[] -void 0!==e[1]&&(l.options.onShown=t=>{clearInterval(i),i=setTimeout(()=>{t.hide()},e[1])})}let u=o,c=!1 -u.hasAttribute("tabindex")||(c=!0,u.setAttribute("tabindex","0")) -const d=(0,n.default)(o,function(e){for(var t=1;tt,plugins:[void 0!==s.followCursor?n.followCursor:void 0].filter(e=>Boolean(e))},l.options)) -return()=>{c&&u.removeAttribute("tabindex"),clearInterval(i),d.destroy()}}) -e.default=l})),define("consul-ui/modifiers/validate",["exports","ember-modifier"],(function(e,t){var n,r,a -function l(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function s(e,t,n,r,a){var l={} -return Object.keys(r).forEach((function(e){l[e]=r[e]})),l.enumerable=!!l.enumerable,l.configurable=!!l.configurable,("value"in l||l.initializer)&&(l.writable=!0),l=n.slice().reverse().reduce((function(n,r){return r(e,t,n)||n}),l),a&&void 0!==l.initializer&&(l.value=l.initializer?l.initializer.call(a):void 0,l.initializer=void 0),void 0===l.initializer&&(Object.defineProperty(e,t,l),l=null),l}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -class i extends Error{}let o=(n=Ember._action,r=Ember._action,s((a=class extends t.default{constructor(...e){super(...e),l(this,"item",null),l(this,"hash",null)}validate(e,t={}){if(0===Object.keys(t).length)return -const n={} -Object.entries(this.hash.validations).filter(([e,t])=>"string"!=typeof t).forEach(([t,r])=>{this.item&&(this.item[t]=e),(r||[]).forEach(r=>{new RegExp(r.test).test(e)||(n[t]=new i(r.error))})}) -const r=this.hash.chart.state -null==r.context&&(r.context={}),Object.keys(n).length>0?(r.context.errors=n,this.hash.chart.dispatch("ERROR")):(r.context.errors=null,this.hash.chart.dispatch("RESET"))}reset(e){if(0===e.target.value.length){const e=this.hash.chart.state -e.context||(e.context={}),e.context.errors||(e.context.errors={}),Object.entries(this.hash.validations).filter(([e,t])=>"string"!=typeof t).forEach(([t,n])=>{void 0!==e.context.errors[t]&&delete e.context.errors[t]}),0===Object.keys(e.context.errors).length&&(e.context.errors=null,this.hash.chart.dispatch("RESET"))}}async connect([e],t){this.element.addEventListener("input",this.listen),this.element.addEventListener("blur",this.reset),this.element.value.length>0&&(await Promise.resolve(),this&&this.element&&this.validate(this.element.value,this.hash.validations))}listen(e){this.validate(e.target.value,this.hash.validations)}disconnect(){this.item=null,this.hash=null,this.element.removeEventListener("input",this.listen),this.element.removeEventListener("blur",this.reset)}didReceiveArguments(){const[e]=this.args.positional,t=this.args.named -this.item=e,this.hash=t,void 0===t.chart&&(this.hash.chart={state:{context:{}},dispatch:e=>{switch(e){case"ERROR":t.onchange(this.hash.chart.state.context.errors) -break -case"RESET":t.onchange()}}})}didInstall(){this.connect(this.args.positional,this.args.named)}willRemove(){this.disconnect()}}).prototype,"reset",[n],Object.getOwnPropertyDescriptor(a.prototype,"reset"),a.prototype),s(a.prototype,"listen",[r],Object.getOwnPropertyDescriptor(a.prototype,"listen"),a.prototype),a) -e.default=o})),define("consul-ui/modifiers/will-destroy",["exports","@ember/render-modifiers/modifiers/will-destroy"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/modifiers/with-copyable",["exports","ember-modifier"],(function(e,t){var n,r,a -function l(e,t){var n=Object.keys(e) -if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e) -t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function s(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const i=(e,t,n)=>typeof t===e?t:n -let o=(n=Ember.inject.service("clipboard/os"),r=class extends t.default{constructor(...e){var t,n,r,l -super(...e),t=this,n="clipboard",l=this,(r=a)&&Object.defineProperty(t,n,{enumerable:r.enumerable,configurable:r.configurable,writable:r.writable,value:r.initializer?r.initializer.call(l):void 0}),s(this,"hash",null),s(this,"source",null)}connect([e],t){e=i("string",e,this.element.innerText) -const n={success:e=>i("function",t.success,()=>{})(e),error:e=>i("function",t.error,()=>{})(e)} -this.source=this.clipboard.execute(this.element,function(e){for(var t=1;te},n.options)).on("success",n.success).on("error",n.error),this.hash=n}disconnect(){this.source&&this.hash&&(this.source.off("success",this.hash.success).off("error",this.hash.error),this.source.destroy(),this.hash=null,this.source=null)}didReceiveArguments(){this.disconnect(),this.connect(this.args.positional,this.args.named)}willRemove(){this.disconnect()}},u=r.prototype,c="clipboard",d=[n],m={configurable:!0,enumerable:!0,writable:!0,initializer:null},f={},Object.keys(m).forEach((function(e){f[e]=m[e]})),f.enumerable=!!f.enumerable,f.configurable=!!f.configurable,("value"in f||f.initializer)&&(f.writable=!0),f=d.slice().reverse().reduce((function(e,t){return t(u,c,e)||e}),f),p&&void 0!==f.initializer&&(f.value=f.initializer?f.initializer.call(p):void 0,f.initializer=void 0),void 0===f.initializer&&(Object.defineProperty(u,c,f),f=null),a=f,r) -var u,c,d,m,p,f -e.default=o})),define("consul-ui/modifiers/with-overlay",["exports","ember-modifier","tippy.js"],(function(e,t,n){function r(e,t){var n=Object.keys(e) -if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e) -t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -var l=(0,t.modifier)((e,[t],l={})=>{const s=l.options||{} -let i,o=e -if("string"==typeof s.triggerTarget){const e=o -switch(s.triggerTarget){case"parentNode":o=o.parentNode -break -default:o=o.querySelectorAll(s.triggerTarget)}t=o.cloneNode(!0),e.remove(),l.options.triggerTarget=void 0}if(void 0===t&&(t=o.innerHTML,o.innerHTML=""),l.returns&&(s.trigger="manual"),"manual"===s.trigger){const e=s.delay||[] -void 0!==e[1]&&(s.onShown=t=>{clearInterval(i),i=setTimeout(()=>{t.hide()},e[1])})}let u=o -const c=(0,n.default)(o,function(e){for(var t=1;tt,interactive:!0,plugins:[void 0!==s.followCursor?n.followCursor:void 0].filter(e=>Boolean(e))},s)) -return l.returns&&l.returns(c),()=>{clearInterval(i),c.destroy()}}) -e.default=l})),define("consul-ui/router",["exports","consul-ui/config/environment","deepmerge","consul-ui/env","consul-ui/utils/routing/walk"],(function(e,t,n,r,a){function l(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}Object.defineProperty(e,"__esModule",{value:!0}),e.default=e.routes=void 0 -const s=document,i=(t.default.modulePrefix,n.default.all([...s.querySelectorAll("script[data-routes]")].map(e=>JSON.parse(e.dataset.routes)))) -e.routes=i -class o extends Ember.Router{constructor(...e){super(...e),l(this,"location",(0,r.env)("locationType")),l(this,"rootURL",(0,r.env)("rootURL"))}}e.default=o,o.map((0,a.default)(i))})),define("consul-ui/routes/application",["exports","consul-ui/routing/route","consul-ui/mixins/with-blocking-actions"],(function(e,t,n){var r,a,l,s,i -function o(e,t,n,r,a){var l={} -return Object.keys(r).forEach((function(e){l[e]=r[e]})),l.enumerable=!!l.enumerable,l.configurable=!!l.configurable,("value"in l||l.initializer)&&(l.writable=!0),l=n.slice().reverse().reduce((function(n,r){return r(e,t,n)||n}),l),a&&void 0!==l.initializer&&(l.value=l.initializer?l.initializer.call(a):void 0,l.initializer=void 0),void 0===l.initializer&&(Object.defineProperty(e,t,l),l=null),l}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -let u=(r=Ember.inject.service("client/http"),a=Ember._action,l=Ember._action,s=class extends(t.default.extend(n.default)){constructor(...e){var t,n,r,a,l,s,o -super(...e),t=this,n="client",a=this,(r=i)&&Object.defineProperty(t,n,{enumerable:r.enumerable,configurable:r.configurable,writable:r.writable,value:r.initializer?r.initializer.call(a):void 0}),o=void 0,(s="data")in(l=this)?Object.defineProperty(l,s,{value:o,enumerable:!0,configurable:!0,writable:!0}):l[s]=o}onClientChanged(e){let t=e.data -""===t&&(t={blocking:!0}),void 0!==this.data?(!0===this.data.blocking&&!1===t.blocking&&this.client.abort(),this.data=Object.assign({},t)):this.data=Object.assign({},t)}error(e,t){let n={status:e.code||e.statusCode||"",message:e.message||e.detail||"Error"} -return e.errors&&e.errors[0]&&(n=e.errors[0],n.message=n.message||n.title||n.detail||"Error"),""===n.status&&(n.message="Error"),this.controllerFor("application").setProperties({error:n}),!0}},i=o(s.prototype,"client",[r],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),o(s.prototype,"onClientChanged",[a],Object.getOwnPropertyDescriptor(s.prototype,"onClientChanged"),s.prototype),o(s.prototype,"error",[l],Object.getOwnPropertyDescriptor(s.prototype,"error"),s.prototype),s) -e.default=u})),define("consul-ui/routes/dc",["exports","consul-ui/routing/route"],(function(e,t){var n,r,a -Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -let l=(n=Ember.inject.service("repository/permission"),r=class extends t.default{constructor(...e){var t,n,r,l -super(...e),t=this,n="permissionsRepo",l=this,(r=a)&&Object.defineProperty(t,n,{enumerable:r.enumerable,configurable:r.configurable,writable:r.writable,value:r.initializer?r.initializer.call(l):void 0})}async model(e){const t=await this.permissionsRepo.findAll({dc:e.dc,ns:this.optionalParams().nspace,partition:this.optionalParams().partition}) -return this.controllerFor("application").setProperties({permissions:t}),{permissions:t}}},s=r.prototype,i="permissionsRepo",o=[n],u={configurable:!0,enumerable:!0,writable:!0,initializer:null},d={},Object.keys(u).forEach((function(e){d[e]=u[e]})),d.enumerable=!!d.enumerable,d.configurable=!!d.configurable,("value"in d||d.initializer)&&(d.writable=!0),d=o.slice().reverse().reduce((function(e,t){return t(s,i,e)||e}),d),c&&void 0!==d.initializer&&(d.value=d.initializer?d.initializer.call(c):void 0,d.initializer=void 0),void 0===d.initializer&&(Object.defineProperty(s,i,d),d=null),a=d,r) -var s,i,o,u,c,d -e.default=l})),define("consul-ui/routes/dc/acls/auth-methods/index",["exports","consul-ui/routing/route"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -class n extends t.default{constructor(...e){var t,n,r -super(...e),r={sortBy:"sort",source:"source",kind:"kind",searchproperty:{as:"searchproperty",empty:[["Name","DisplayName"]]},search:{as:"filter",replace:!0}},(n="queryParams")in(t=this)?Object.defineProperty(t,n,{value:r,enumerable:!0,configurable:!0,writable:!0}):t[n]=r}}e.default=n})),define("consul-ui/routes/dc/acls/auth-methods/show/index",["exports","consul-ui/routing/route","consul-ui/utils/routing/redirect-to"],(function(e,t,n){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -class r extends t.default{constructor(...e){var t,r,a -super(...e),t=this,r="redirect",a=(0,n.default)("auth-method"),r in t?Object.defineProperty(t,r,{value:a,enumerable:!0,configurable:!0,writable:!0}):t[r]=a}}e.default=r})),define("consul-ui/routes/dc/acls/policies/create",["exports","consul-ui/routes/dc/acls/policies/edit"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -class n extends t.default{constructor(...e){var t,n,r -super(...e),r="dc/acls/policies/edit",(n="templateName")in(t=this)?Object.defineProperty(t,n,{value:r,enumerable:!0,configurable:!0,writable:!0}):t[n]=r}}e.default=n})),define("consul-ui/routes/dc/acls/policies/edit",["exports","consul-ui/routing/route","consul-ui/mixins/with-blocking-actions"],(function(e,t,n){var r,a,l -Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -let s=(r=Ember.inject.service("repository/policy"),a=class extends(t.default.extend(n.default)){constructor(...e){var t,n,r,a -super(...e),t=this,n="repo",a=this,(r=l)&&Object.defineProperty(t,n,{enumerable:r.enumerable,configurable:r.configurable,writable:r.writable,value:r.initializer?r.initializer.call(a):void 0})}},i=a.prototype,o="repo",u=[r],c={configurable:!0,enumerable:!0,writable:!0,initializer:null},m={},Object.keys(c).forEach((function(e){m[e]=c[e]})),m.enumerable=!!m.enumerable,m.configurable=!!m.configurable,("value"in m||m.initializer)&&(m.writable=!0),m=u.slice().reverse().reduce((function(e,t){return t(i,o,e)||e}),m),d&&void 0!==m.initializer&&(m.value=m.initializer?m.initializer.call(d):void 0,m.initializer=void 0),void 0===m.initializer&&(Object.defineProperty(i,o,m),m=null),l=m,a) -var i,o,u,c,d,m -e.default=s})),define("consul-ui/routes/dc/acls/policies/index",["exports","consul-ui/routing/route","consul-ui/mixins/with-blocking-actions"],(function(e,t,n){var r,a,l -Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -let s=(r=Ember.inject.service("repository/policy"),a=class extends(t.default.extend(n.default)){constructor(...e){var t,n,r,a,s,i,o -super(...e),t=this,n="repo",a=this,(r=l)&&Object.defineProperty(t,n,{enumerable:r.enumerable,configurable:r.configurable,writable:r.writable,value:r.initializer?r.initializer.call(a):void 0}),o={sortBy:"sort",datacenter:{as:"dc"},kind:"kind",searchproperty:{as:"searchproperty",empty:[["Name","Description"]]},search:{as:"filter",replace:!0}},(i="queryParams")in(s=this)?Object.defineProperty(s,i,{value:o,enumerable:!0,configurable:!0,writable:!0}):s[i]=o}},i=a.prototype,o="repo",u=[r],c={configurable:!0,enumerable:!0,writable:!0,initializer:null},m={},Object.keys(c).forEach((function(e){m[e]=c[e]})),m.enumerable=!!m.enumerable,m.configurable=!!m.configurable,("value"in m||m.initializer)&&(m.writable=!0),m=u.slice().reverse().reduce((function(e,t){return t(i,o,e)||e}),m),d&&void 0!==m.initializer&&(m.value=m.initializer?m.initializer.call(d):void 0,m.initializer=void 0),void 0===m.initializer&&(Object.defineProperty(i,o,m),m=null),l=m,a) -var i,o,u,c,d,m -e.default=s})),define("consul-ui/routes/dc/acls/roles/create",["exports","consul-ui/routes/dc/acls/roles/edit"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -class n extends t.default{constructor(...e){var t,n,r -super(...e),r="dc/acls/roles/edit",(n="templateName")in(t=this)?Object.defineProperty(t,n,{value:r,enumerable:!0,configurable:!0,writable:!0}):t[n]=r}}e.default=n})),define("consul-ui/routes/dc/acls/roles/edit",["exports","consul-ui/routing/route","consul-ui/mixins/with-blocking-actions"],(function(e,t,n){var r,a,l -Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -let s=(r=Ember.inject.service("repository/role"),a=class extends(t.default.extend(n.default)){constructor(...e){var t,n,r,a -super(...e),t=this,n="repo",a=this,(r=l)&&Object.defineProperty(t,n,{enumerable:r.enumerable,configurable:r.configurable,writable:r.writable,value:r.initializer?r.initializer.call(a):void 0})}},i=a.prototype,o="repo",u=[r],c={configurable:!0,enumerable:!0,writable:!0,initializer:null},m={},Object.keys(c).forEach((function(e){m[e]=c[e]})),m.enumerable=!!m.enumerable,m.configurable=!!m.configurable,("value"in m||m.initializer)&&(m.writable=!0),m=u.slice().reverse().reduce((function(e,t){return t(i,o,e)||e}),m),d&&void 0!==m.initializer&&(m.value=m.initializer?m.initializer.call(d):void 0,m.initializer=void 0),void 0===m.initializer&&(Object.defineProperty(i,o,m),m=null),l=m,a) -var i,o,u,c,d,m -e.default=s})),define("consul-ui/routes/dc/acls/roles/index",["exports","consul-ui/routing/route","consul-ui/mixins/with-blocking-actions"],(function(e,t,n){var r,a,l -Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -let s=(r=Ember.inject.service("repository/role"),a=class extends(t.default.extend(n.default)){constructor(...e){var t,n,r,a,s,i,o -super(...e),t=this,n="repo",a=this,(r=l)&&Object.defineProperty(t,n,{enumerable:r.enumerable,configurable:r.configurable,writable:r.writable,value:r.initializer?r.initializer.call(a):void 0}),o={sortBy:"sort",searchproperty:{as:"searchproperty",empty:[["Name","Description","Policy"]]},search:{as:"filter",replace:!0}},(i="queryParams")in(s=this)?Object.defineProperty(s,i,{value:o,enumerable:!0,configurable:!0,writable:!0}):s[i]=o}},i=a.prototype,o="repo",u=[r],c={configurable:!0,enumerable:!0,writable:!0,initializer:null},m={},Object.keys(c).forEach((function(e){m[e]=c[e]})),m.enumerable=!!m.enumerable,m.configurable=!!m.configurable,("value"in m||m.initializer)&&(m.writable=!0),m=u.slice().reverse().reduce((function(e,t){return t(i,o,e)||e}),m),d&&void 0!==m.initializer&&(m.value=m.initializer?m.initializer.call(d):void 0,m.initializer=void 0),void 0===m.initializer&&(Object.defineProperty(i,o,m),m=null),l=m,a) -var i,o,u,c,d,m -e.default=s})),define("consul-ui/routes/dc/acls/tokens/create",["exports","consul-ui/routes/dc/acls/tokens/edit"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -class n extends t.default{constructor(...e){var t,n,r -super(...e),r="dc/acls/tokens/edit",(n="templateName")in(t=this)?Object.defineProperty(t,n,{value:r,enumerable:!0,configurable:!0,writable:!0}):t[n]=r}}e.default=n})),define("consul-ui/routes/dc/acls/tokens/edit",["exports","consul-ui/routing/route","consul-ui/mixins/with-blocking-actions"],(function(e,t,n){var r,a,l,s,i -function o(e,t,n,r){n&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(r):void 0})}function u(e,t,n,r,a){var l={} -return Object.keys(r).forEach((function(e){l[e]=r[e]})),l.enumerable=!!l.enumerable,l.configurable=!!l.configurable,("value"in l||l.initializer)&&(l.writable=!0),l=n.slice().reverse().reduce((function(n,r){return r(e,t,n)||n}),l),a&&void 0!==l.initializer&&(l.value=l.initializer?l.initializer.call(a):void 0,l.initializer=void 0),void 0===l.initializer&&(Object.defineProperty(e,t,l),l=null),l}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -let c=(r=Ember.inject.service("repository/token"),a=Ember.inject.service("settings"),l=class extends(t.default.extend(n.default)){constructor(...e){super(...e),o(this,"repo",s,this),o(this,"settings",i,this)}async model(e,t){return{token:await this.settings.findBySlug("token")}}},s=u(l.prototype,"repo",[r],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),i=u(l.prototype,"settings",[a],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),l) -e.default=c})),define("consul-ui/routes/dc/acls/tokens/index",["exports","consul-ui/routing/route","consul-ui/mixins/with-blocking-actions"],(function(e,t,n){var r,a,l -Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -let s=(r=Ember.inject.service("repository/token"),a=class extends(t.default.extend(n.default)){constructor(...e){var t,n,r,a,s,i,o -super(...e),t=this,n="repo",a=this,(r=l)&&Object.defineProperty(t,n,{enumerable:r.enumerable,configurable:r.configurable,writable:r.writable,value:r.initializer?r.initializer.call(a):void 0}),o={sortBy:"sort",kind:"kind",searchproperty:{as:"searchproperty",empty:[["AccessorID","Description","Role","Policy"]]},search:{as:"filter",replace:!0}},(i="queryParams")in(s=this)?Object.defineProperty(s,i,{value:o,enumerable:!0,configurable:!0,writable:!0}):s[i]=o}},i=a.prototype,o="repo",u=[r],c={configurable:!0,enumerable:!0,writable:!0,initializer:null},m={},Object.keys(c).forEach((function(e){m[e]=c[e]})),m.enumerable=!!m.enumerable,m.configurable=!!m.configurable,("value"in m||m.initializer)&&(m.writable=!0),m=u.slice().reverse().reduce((function(e,t){return t(i,o,e)||e}),m),d&&void 0!==m.initializer&&(m.value=m.initializer?m.initializer.call(d):void 0,m.initializer=void 0),void 0===m.initializer&&(Object.defineProperty(i,o,m),m=null),l=m,a) -var i,o,u,c,d,m -e.default=s})),define("consul-ui/routes/dc/kv/folder",["exports","consul-ui/routes/dc/kv/index"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -class n extends t.default{beforeModel(e){super.beforeModel(...arguments) -const t=this.paramsFor("dc.kv.folder") -if("/"===t.key||null==t.key)return this.transitionTo("dc.kv.index")}}e.default=n})),define("consul-ui/routes/dc/kv/index",["exports","consul-ui/routing/route","consul-ui/utils/isFolder"],(function(e,t,n){var r,a -Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -let l=(r=Ember._action,a=class extends t.default{beforeModel(){const e=this.paramsFor(this.routeName).key||"/" -if(!(0,n.default)(e))return this.replaceWith(this.routeName,e+"/")}error(e){return!e.errors||!e.errors[0]||"404"!=e.errors[0].status||this.transitionTo("dc.kv.index")}},s=a.prototype,i="error",o=[r],u=Object.getOwnPropertyDescriptor(a.prototype,"error"),c=a.prototype,d={},Object.keys(u).forEach((function(e){d[e]=u[e]})),d.enumerable=!!d.enumerable,d.configurable=!!d.configurable,("value"in d||d.initializer)&&(d.writable=!0),d=o.slice().reverse().reduce((function(e,t){return t(s,i,e)||e}),d),c&&void 0!==d.initializer&&(d.value=d.initializer?d.initializer.call(c):void 0,d.initializer=void 0),void 0===d.initializer&&(Object.defineProperty(s,i,d),d=null),a) -var s,i,o,u,c,d -e.default=l})),define("consul-ui/routes/dc/services/notfound",["exports","consul-ui/routing/route"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -class n extends t.default{redirect(e,t){this.replaceWith("dc.services.instance",e.name,e.node,e.id)}}e.default=n})),define("consul-ui/routes/dc/services/show/topology",["exports","consul-ui/routing/route"],(function(e,t){var n,r,a,l,s,i,o,u -function c(e,t){var n=Object.keys(e) -if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e) -t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function d(e){for(var t=1;tn.Datacenter===e.Datacenter&&n.SourceName===e.Name&&n.SourceNS===e.Namespace&&n.SourcePartition===e.Partition&&n.DestinationName===t.Name&&n.DestinationNS===t.Namespace&&n.DestinationPartition===t.Partition) -void 0===r?r=this.repo.create({Datacenter:e.Datacenter,SourceName:e.Name,SourceNS:e.Namespace||"default",SourcePartition:e.Partition||"default",DestinationName:t.Name,DestinationNS:t.Namespace||"default",DestinationPartition:t.Partition||"default"}):n=this.feedback.notification("update","intention"),Ember.set(r,"Action","allow"),await this.repo.persist(r),n.success(r)}catch(r){n.error(r)}this.refresh()}afterModel(e,t){const n=d(d(d({},this.optionalParams()),this.paramsFor("dc")),this.paramsFor("dc.services.show")) -this.intentions=this.data.source(e=>e`/${n.partition}/${n.nspace}/${n.dc}/intentions/for-service/${n.name}`)}async deactivate(e){(await this.intentions).destroy()}},i=f(s.prototype,"data",[n],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),o=f(s.prototype,"repo",[r],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),u=f(s.prototype,"feedback",[a],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),f(s.prototype,"createIntention",[l],Object.getOwnPropertyDescriptor(s.prototype,"createIntention"),s.prototype),s) -e.default=b})),define("consul-ui/routing/route",["exports","consul-ui/utils/path/resolve","consul-ui/router"],(function(e,t,n){var r,a,l,s,i,o,u,c,d,m,p,f,b -function h(e,t){var n=Object.keys(e) -if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e) -t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function v(e){for(var t=1;t!r.includes(e)).length&&(e=void 0)}}return e}model(){const e={} -return void 0!==this.queryParams&&void 0!==this.queryParams.searchproperty&&(e.searchProperties=this.queryParams.searchproperty.empty[0]),e}setupController(e,t){Ember.setProperties(e,v(v({},t),{},{routeName:this.routeName})),super.setupController(...arguments)}optionalParams(){return this.container.get("location:"+this.env.var("locationType")).optionalParams()}paramsFor(e){return this.routlet.normalizeParamsFor(this.routeName,super.paramsFor(...arguments))}async replaceWith(e,t){await Promise.resolve() -let n=[] -return"string"==typeof t&&(n=[t]),void 0===t||Array.isArray(t)||"string"==typeof t||(n=Object.values(t)),super.replaceWith(e,...n)}async transitionTo(e,t){await Promise.resolve() -let n=[] -return"string"==typeof t&&(n=[t]),void 0===t||Array.isArray(t)||"string"==typeof t||(n=Object.values(t)),super.transitionTo(e,...n)}},d=O(c.prototype,"container",[r],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),m=O(c.prototype,"env",[a],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),p=O(c.prototype,"permissions",[l],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),f=O(c.prototype,"router",[s],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),b=O(c.prototype,"routlet",[i],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),O(c.prototype,"replaceWith",[o],Object.getOwnPropertyDescriptor(c.prototype,"replaceWith"),c.prototype),O(c.prototype,"transitionTo",[u],Object.getOwnPropertyDescriptor(c.prototype,"transitionTo"),c.prototype),c) -e.default=_})),define("consul-ui/routing/single",["exports","consul-ui/routing/route"],(function(e,t){function n(e,t){var n=Object.keys(e) -if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e) -t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function r(e){for(var t=1;te.ID,Name:e=>e.Name}})) -define("consul-ui/search/predicates/auth-method",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -e.default={Name:e=>e.Name,DisplayName:e=>e.DisplayName}})),define("consul-ui/search/predicates/health-check",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -var t={Name:e=>e.Name,Node:e=>e.Node,Service:e=>e.ServiceName,CheckID:e=>e.CheckID||"",ID:e=>e.Service.ID||"",Notes:e=>e.Notes,Output:e=>e.Output,ServiceTags:e=>{return t=e.ServiceTags,Array.isArray(t)?t:t.toArray() -var t}} -e.default=t})),define("consul-ui/search/predicates/intention",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -var t={SourceName:e=>[e.SourceName,"*"===e.SourceName?"All Services (*)":void 0].filter(Boolean),DestinationName:e=>[e.DestinationName,"*"===e.DestinationName?"All Services (*)":void 0].filter(Boolean)} -e.default=t})),define("consul-ui/search/predicates/kv",["exports","consul-ui/utils/right-trim"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -var n={Key:e=>(0,t.default)(e.Key.toLowerCase()).split("/").filter(e=>Boolean(e)).pop()} -e.default=n})),define("consul-ui/search/predicates/node",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -var t={Node:e=>e.Node,Address:e=>e.Address,Meta:e=>Object.entries(e.Meta||{}).reduce((e,t)=>e.concat(t),[])} -e.default=t})),define("consul-ui/search/predicates/nspace",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -e.default={Name:e=>e.Name,Description:e=>e.Description,Role:e=>((e.ACLs||{}).RoleDefaults||[]).map(e=>e.Name),Policy:e=>((e.ACLs||{}).PolicyDefaults||[]).map(e=>e.Name)}})),define("consul-ui/search/predicates/policy",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -e.default={Name:e=>e.Name,Description:e=>e.Description}})),define("consul-ui/search/predicates/role",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -e.default={Name:e=>e.Name,Description:e=>e.Description,Policy:e=>(e.Policies||[]).map(e=>e.Name).concat((e.ServiceIdentities||[]).map(e=>e.ServiceName)).concat((e.NodeIdentities||[]).map(e=>e.NodeName))}})),define("consul-ui/search/predicates/service-instance",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -var t={Name:e=>e.Name,Node:e=>e.Node.Node,Tags:e=>e.Service.Tags||[],ID:e=>e.Service.ID||"",Address:e=>e.Address||"",Port:e=>(e.Service.Port||"").toString(),"Service.Meta":e=>Object.entries(e.Service.Meta||{}).reduce((e,t)=>e.concat(t),[]),"Node.Meta":e=>Object.entries(e.Node.Meta||{}).reduce((e,t)=>e.concat(t),[])} -e.default=t})),define("consul-ui/search/predicates/service",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -e.default={Name:e=>e.Name,Tags:e=>e.Tags||[]}})),define("consul-ui/search/predicates/token",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -e.default={Name:e=>e.Name,Description:e=>e.Description,AccessorID:e=>e.AccessorID,Role:e=>(e.Roles||[]).map(e=>e.Name),Policy:e=>(e.Policies||[]).map(e=>e.Name).concat((e.ServiceIdentities||[]).map(e=>e.ServiceName)).concat((e.NodeIdentities||[]).map(e=>e.NodeName))}})),define("consul-ui/search/predicates/upstream-instance",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -e.default={DestinationName:e=>e.DestinationName,LocalBindAddress:e=>e.LocalBindAddress,LocalBindPort:e=>e.LocalBindPort.toString()}})),define("consul-ui/serializers/-default",["exports","@ember-data/serializer/json"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/serializers/-json-api",["exports","@ember-data/serializer/json-api"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/serializers/-rest",["exports","@ember-data/serializer/rest"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/serializers/application",["exports","consul-ui/serializers/http","consul-ui/utils/http/consul","consul-ui/utils/http/headers","consul-ui/models/dc","consul-ui/models/nspace","consul-ui/models/partition","consul-ui/utils/create-fingerprinter"],(function(e,t,n,r,a,l,s,i){function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const u=function(e,t){const r={} -return Object.keys(e).forEach((function(t){r[t.toLowerCase()]=e[t]})),t[n.HEADERS_SYMBOL]=r,t} -class c extends t.default{constructor(...e){super(...e),o(this,"attachHeaders",u),o(this,"fingerprint",(0,i.default)(a.FOREIGN_KEY,l.NSPACE_KEY,s.PARTITION_KEY))}respondForQuery(e,t){return e((e,r)=>{return u(e,(a=r,l=this.fingerprint(this.primaryKey,this.slugKey,t.dc,e[n.HEADERS_NAMESPACE],e[n.HEADERS_PARTITION]),Array.isArray(a)?a.map(l):[a].map(l)[0])) -var a,l})}respondForQueryRecord(e,t){return e((e,r)=>u(e,this.fingerprint(this.primaryKey,this.slugKey,t.dc,e[n.HEADERS_NAMESPACE],e[n.HEADERS_PARTITION])(r)))}respondForCreateRecord(e,t,r){const l=this.slugKey,s=this.primaryKey -return e((e,t)=>(!0===t&&(t=r),this.fingerprint(s,l,r[a.FOREIGN_KEY],e[n.HEADERS_NAMESPACE],r.Partition)(t)))}respondForUpdateRecord(e,t,r){const l=this.slugKey,s=this.primaryKey -return e((e,t)=>(!0===t&&(t=r),this.fingerprint(s,l,r[a.FOREIGN_KEY],e[n.HEADERS_NAMESPACE],e[n.HEADERS_PARTITION])(t)))}respondForDeleteRecord(e,t,r){const i=this.slugKey,o=this.primaryKey -return e(e=>({[o]:this.fingerprint(o,i,r[a.FOREIGN_KEY],e[n.HEADERS_NAMESPACE],e[n.HEADERS_PARTITION])({[i]:r[i],[l.NSPACE_KEY]:r[l.NSPACE_KEY],[s.PARTITION_KEY]:r[s.PARTITION_KEY]})[o]}))}normalizeResponse(e,t,n,r,a){const l=this.normalizePayload(n,r,a),s=this.normalizeMeta(e,t,l,r,a) -"query"!==a&&(l.meta=s) -const i=super.normalizeResponse(e,t,{meta:s,[t.modelName]:l},r,a) -return void 0===i?n:i}timestamp(){return(new Date).getTime()}normalizeMeta(e,t,a,l,s){const i=a[n.HEADERS_SYMBOL]||{} -delete a[n.HEADERS_SYMBOL] -const o={cacheControl:i[r.CACHE_CONTROL.toLowerCase()],cursor:i[n.HEADERS_INDEX.toLowerCase()],dc:i[n.HEADERS_DATACENTER.toLowerCase()],nspace:i[n.HEADERS_NAMESPACE.toLowerCase()],partition:i[n.HEADERS_PARTITION.toLowerCase()]} -return void 0!==i["x-range"]&&(o.range=i["x-range"]),void 0!==i.refresh&&(o.interval=1e3*i.refresh),"query"===s&&(o.date=this.timestamp(),a.forEach((function(e){Ember.set(e,"SyncTime",o.date)}))),o}normalizePayload(e,t,n){return e}}e.default=c})),define("consul-ui/serializers/auth-method",["exports","consul-ui/serializers/application","consul-ui/models/auth-method"],(function(e,t,n){function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -class a extends t.default{constructor(...e){super(...e),r(this,"primaryKey",n.PRIMARY_KEY),r(this,"slugKey",n.SLUG_KEY)}}e.default=a})),define("consul-ui/serializers/binding-rule",["exports","consul-ui/serializers/application","consul-ui/models/binding-rule"],(function(e,t,n){function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -class a extends t.default{constructor(...e){super(...e),r(this,"primaryKey",n.PRIMARY_KEY),r(this,"slugKey",n.SLUG_KEY)}}e.default=a})),define("consul-ui/serializers/coordinate",["exports","consul-ui/serializers/application","consul-ui/models/coordinate"],(function(e,t,n){function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -class a extends t.default{constructor(...e){super(...e),r(this,"primaryKey",n.PRIMARY_KEY),r(this,"slugKey",n.SLUG_KEY)}}e.default=a})),define("consul-ui/serializers/discovery-chain",["exports","consul-ui/serializers/application","consul-ui/models/discovery-chain"],(function(e,t,n){function r(e,t){var n=Object.keys(e) -if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e) -t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function a(e){for(var t=1;tt)}respondForQueryRecord(e,t){return e((e,t)=>t)}respondForFindAll(e,t){return e((e,t)=>t)}respondForCreateRecord(e,t){return e((e,t)=>t)}respondForUpdateRecord(e,t){return e((e,t)=>t)}respondForDeleteRecord(e,t){return e((e,t)=>t)}}e.default=n})),define("consul-ui/serializers/intention",["exports","consul-ui/serializers/application","consul-ui/models/intention"],(function(e,t,n){var r,a,l -function s(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -let i=(r=Ember.inject.service("encoder"),a=class extends t.default{constructor(...e){var t,r,a,i -super(...e),t=this,r="encoder",i=this,(a=l)&&Object.defineProperty(t,r,{enumerable:a.enumerable,configurable:a.configurable,writable:a.writable,value:a.initializer?a.initializer.call(i):void 0}),s(this,"primaryKey",n.PRIMARY_KEY),s(this,"slugKey",n.SLUG_KEY)}init(){super.init(...arguments),this.uri=this.encoder.uriTag()}ensureID(e){return Ember.get(e,"ID.length")?(e.Legacy=!0,e.LegacyID=e.ID):e.Legacy=!1,e.ID=this.uri`${e.SourcePartition}:${e.SourceNS}:${e.SourceName}:${e.DestinationPartition}:${e.DestinationNS}:${e.DestinationName}`,e}respondForQuery(e,t){return super.respondForQuery(t=>e((e,n)=>t(e,n.map(e=>this.ensureID(e)))),t)}respondForQueryRecord(e,t){return super.respondForQueryRecord(t=>e((e,n)=>(n=this.ensureID(n),t(e,n))),t)}respondForCreateRecord(e,t,n){const r=this.slugKey,a=this.primaryKey -return e((e,l)=>((l=n).ID=this.uri`${t.SourcePartition}:${t.SourceNS}:${t.SourceName}:${t.DestinationPartition}:${t.DestinationNS}:${t.DestinationName}`,this.fingerprint(a,r,l.Datacenter)(l)))}respondForUpdateRecord(e,t,n){const r=this.slugKey,a=this.primaryKey -return e((e,l)=>((l=n).LegacyID=l.ID,l.ID=t.ID,this.fingerprint(a,r,l.Datacenter)(l)))}},o=a.prototype,u="encoder",c=[r],d={configurable:!0,enumerable:!0,writable:!0,initializer:null},p={},Object.keys(d).forEach((function(e){p[e]=d[e]})),p.enumerable=!!p.enumerable,p.configurable=!!p.configurable,("value"in p||p.initializer)&&(p.writable=!0),p=c.slice().reverse().reduce((function(e,t){return t(o,u,e)||e}),p),m&&void 0!==p.initializer&&(p.value=p.initializer?p.initializer.call(m):void 0,p.initializer=void 0),void 0===p.initializer&&(Object.defineProperty(o,u,p),p=null),l=p,a) -var o,u,c,d,m,p -e.default=i})),define("consul-ui/serializers/kv",["exports","consul-ui/serializers/application","consul-ui/models/kv"],(function(e,t,n){var r,a,l -function s(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -let i=(r=Ember.inject.service("atob"),a=class extends t.default{constructor(...e){var t,r,a,i -super(...e),t=this,r="decoder",i=this,(a=l)&&Object.defineProperty(t,r,{enumerable:a.enumerable,configurable:a.configurable,writable:a.writable,value:a.initializer?a.initializer.call(i):void 0}),s(this,"primaryKey",n.PRIMARY_KEY),s(this,"slugKey",n.SLUG_KEY)}serialize(e,t){const n=e.attr("Value") -return"string"==typeof n?this.decoder.execute(n):null}respondForQueryRecord(e,t){return super.respondForQueryRecord(t=>e((e,n)=>(void 0===n[0].Session&&(n[0].Session=""),t(e,n[0]))),t)}respondForQuery(e,t){return super.respondForQuery(t=>e((e,n)=>t(e,n.map(e=>({[this.slugKey]:e})))),t)}},o=a.prototype,u="decoder",c=[r],d={configurable:!0,enumerable:!0,writable:!0,initializer:null},p={},Object.keys(d).forEach((function(e){p[e]=d[e]})),p.enumerable=!!p.enumerable,p.configurable=!!p.configurable,("value"in p||p.initializer)&&(p.writable=!0),p=c.slice().reverse().reduce((function(e,t){return t(o,u,e)||e}),p),m&&void 0!==p.initializer&&(p.value=p.initializer?p.initializer.call(m):void 0,p.initializer=void 0),void 0===p.initializer&&(Object.defineProperty(o,u,p),p=null),l=p,a) -var o,u,c,d,m,p -e.default=i})),define("consul-ui/serializers/node",["exports","consul-ui/serializers/application","@ember-data/serializer/rest","consul-ui/models/node"],(function(e,t,n,r){function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const l=function(e){return""===e[r.SLUG_KEY]&&(e[r.SLUG_KEY]=e.Node),e} -class s extends(t.default.extend(n.EmbeddedRecordsMixin)){constructor(...e){super(...e),a(this,"primaryKey",r.PRIMARY_KEY),a(this,"slugKey",r.SLUG_KEY),a(this,"attrs",{Services:{embedded:"always"}})}transformHasManyResponse(e,t,n,r=null){let a,l={} -switch(t.key){case"Services":return(n.Checks||[]).filter(e=>""!==e.ServiceID).forEach(e=>{void 0===l[e.ServiceID]&&(l[e.ServiceID]=[]),l[e.ServiceID].push(e)}),a=this.store.serializerFor(t.type),n.Services=n.Services.map(e=>a.transformHasManyResponseFromNode(n,e,l)),n}return super.transformHasManyResponse(...arguments)}respondForQuery(e,t,n,r){const a=super.respondForQuery(t=>e((e,n)=>t(e,n.map(l))),t) -return r.eachRelationship((e,t)=>{a.forEach(e=>this[`transform${Ember.String.classify(t.kind)}Response`](this.store,t,e,a))}),a}respondForQueryRecord(e,t,n,r){const a=super.respondForQueryRecord(t=>e((e,n)=>t(e,l(n))),t) -return r.eachRelationship((e,t)=>{this[`transform${Ember.String.classify(t.kind)}Response`](this.store,t,a)}),a}respondForQueryLeader(e,t){return e((e,n)=>{const r=n.split(":"),a=r.pop(),l=r.join(":") -return this.attachHeaders(e,{Address:l,Port:a},t)})}}e.default=s})),define("consul-ui/serializers/nspace",["exports","consul-ui/serializers/application","consul-ui/models/nspace"],(function(e,t,n){function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const a=e=>(Ember.get(e,"ACLs.PolicyDefaults")&&(e.ACLs.PolicyDefaults=e.ACLs.PolicyDefaults.map((function(e){return void 0===e.template&&(e.template=""),e}))),["PolicyDefaults","RoleDefaults"].forEach((function(t){void 0===e.ACLs&&(e.ACLs=[]),void 0===e.ACLs[t]&&(e.ACLs[t]=[])})),e) -class l extends t.default{constructor(...e){super(...e),r(this,"primaryKey",n.PRIMARY_KEY),r(this,"slugKey",n.SLUG_KEY)}respondForQuery(e,t,n,r){return super.respondForQuery(n=>e((e,r)=>n(e,r.map((function(e){return e.Namespace="*",e.Datacenter=t.dc,a(e)})))),t)}respondForQueryRecord(e,t,n){return super.respondForQuery(n=>e((e,r)=>(r.Datacenter=t.dc,r.Namespace="*",n(e,a(r)))),t,n)}respondForCreateRecord(e,t,n){return super.respondForCreateRecord(n=>e((e,r)=>(r.Datacenter=t.dc,r.Namespace="*",n(e,a(r)))),t,n)}respondForUpdateRecord(e,t,n){return e((e,t)=>a(t))}}e.default=l})),define("consul-ui/serializers/oidc-provider",["exports","consul-ui/serializers/application","consul-ui/models/oidc-provider"],(function(e,t,n){function r(e,t){var n=Object.keys(e) -if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e) -t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -class l extends t.default{constructor(...e){super(...e),a(this,"primaryKey",n.PRIMARY_KEY),a(this,"slugKey",n.SLUG_KEY)}respondForAuthorize(e,t,n){return e((e,t)=>this.attachHeaders(e,t,n))}respondForQueryRecord(e,t){return super.respondForQueryRecord(n=>e((e,l)=>n(e,function(e){for(var t=1;te((e,n)=>t(e,n.map(e=>(e.Partition="*",e.Namespace="*",e)))),t)}}e.default=a})),define("consul-ui/serializers/permission",["exports","consul-ui/serializers/application"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -class n extends t.default{}e.default=n})),define("consul-ui/serializers/policy",["exports","consul-ui/serializers/application","consul-ui/models/policy"],(function(e,t,n){function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -class a extends t.default{constructor(...e){super(...e),r(this,"primaryKey",n.PRIMARY_KEY),r(this,"slugKey",n.SLUG_KEY)}}e.default=a})),define("consul-ui/serializers/proxy",["exports","consul-ui/serializers/application","consul-ui/models/proxy"],(function(e,t,n){function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -class a extends t.default{constructor(...e){super(...e),r(this,"primaryKey",n.PRIMARY_KEY),r(this,"slugKey",n.SLUG_KEY),r(this,"attrs",{NodeName:"Node"})}}e.default=a})) -define("consul-ui/serializers/role",["exports","consul-ui/serializers/application","consul-ui/models/role","consul-ui/mixins/policy/as-many"],(function(e,t,n,r){function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -class l extends(t.default.extend(r.default)){constructor(...e){super(...e),a(this,"primaryKey",n.PRIMARY_KEY),a(this,"slugKey",n.SLUG_KEY)}}e.default=l})),define("consul-ui/serializers/service-instance",["exports","consul-ui/serializers/application","consul-ui/models/service-instance"],(function(e,t,n){function r(e,t){var n=Object.keys(e) -if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e) -t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function a(e){for(var t=1;t{switch(t.Status){case"passing":e.ChecksPassing.push(t) -break -case"warning":e.ChecksWarning.push(t) -break -case"critical":e.ChecksCritical.push(t)}return e},{ChecksPassing:[],ChecksWarning:[],ChecksCritical:[]})),{},{Service:t,Checks:r,Node:{Datacenter:e.Datacenter,Namespace:e.Namespace,Partition:e.Partition,ID:e.ID,Node:e.Node,Address:e.Address,TaggedAddresses:e.TaggedAddresses,Meta:e.Meta}}) -return l.uid=this.extractUid(l),l}respondForQuery(e,t){return super.respondForQuery(n=>e((e,r)=>{if(0===r.length){const e=new Error -throw e.errors=[{status:"404",title:"Not found"}],e}return r.forEach(e=>{e.Datacenter=t.dc,e.Namespace=t.ns||"default",e.Partition=t.partition||"default",e.uid=this.extractUid(e)}),n(e,r)}),t)}respondForQueryRecord(e,t){return super.respondForQueryRecord(n=>e((e,r)=>{if(r.forEach(e=>{e.Datacenter=t.dc,e.Namespace=t.ns||"default",e.Partition=t.partition||"default",e.uid=this.extractUid(e)}),void 0===(r=r.find((function(e){return e.Node.Node===t.node&&e.Service.ID===t.serviceId})))){const e=new Error -throw e.errors=[{status:"404",title:"Not found"}],e}return r.Namespace=r.Service.Namespace,r.Partition=r.Service.Partition,n(e,r)}),t)}}e.default=s})),define("consul-ui/serializers/service",["exports","consul-ui/serializers/application","consul-ui/models/service"],(function(e,t,n){function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -class a extends t.default{constructor(...e){super(...e),r(this,"primaryKey",n.PRIMARY_KEY),r(this,"slugKey",n.SLUG_KEY)}respondForQuery(e,t){return super.respondForQuery(t=>e((e,n)=>{const r={} -return n.filter((function(e){return"connect-proxy"!==e.Kind})).forEach(e=>{r[e.Name]=e}),n.filter((function(e){return"connect-proxy"===e.Kind})).forEach(e=>{e.ProxyFor&&e.ProxyFor.forEach(t=>{void 0!==r[t]&&(r[t].Proxy=e)})}),t(e,n)}),t)}respondForQueryRecord(e,t){return super.respondForQueryRecord(n=>e((e,r)=>n(e,{Name:t.id,Namespace:Ember.get(r,"firstObject.Service.Namespace"),Nodes:r})),t)}}e.default=a})),define("consul-ui/serializers/session",["exports","consul-ui/serializers/application","consul-ui/models/session"],(function(e,t,n){function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -class a extends t.default{constructor(...e){super(...e),r(this,"primaryKey",n.PRIMARY_KEY),r(this,"slugKey",n.SLUG_KEY)}respondForQueryRecord(e,t){return super.respondForQueryRecord(t=>e((e,n)=>{if(0===n.length){const e=new Error -throw e.errors=[{status:"404",title:"Not found"}],e}return t(e,n[0])}),t)}}e.default=a})),define("consul-ui/serializers/token",["exports","consul-ui/serializers/application","consul-ui/models/token","consul-ui/mixins/policy/as-many","consul-ui/mixins/role/as-many"],(function(e,t,n,r,a){function l(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -class s extends(t.default.extend(r.default,a.default)){constructor(...e){super(...e),l(this,"primaryKey",n.PRIMARY_KEY),l(this,"slugKey",n.SLUG_KEY)}serialize(e,t){let n=super.serialize(...arguments) -return null!==n.Rules&&(n={ID:n.SecretID,Name:n.Description,Type:n.Type,Rules:n.Rules}),n&&delete n.SecretID,n}respondForSelf(e,t){return this.respondForQueryRecord(e,t)}respondForUpdateRecord(e,t,n){return super.respondForUpdateRecord(t=>e((e,n)=>{if(void 0!==n.Policies&&null!==n.Policies||(n.Policies=[]),void 0!==n.ID){const e=this.store.peekAll("token").findBy("SecretID",n.ID) -e&&(n.SecretID=n.ID,n.AccessorID=Ember.get(e,"AccessorID"))}return t(e,n)}),t,n)}}e.default=s})),define("consul-ui/serializers/topology",["exports","consul-ui/serializers/application","consul-ui/models/topology"],(function(e,t,n){var r,a,l -function s(e,t){var n=Object.keys(e) -if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e) -t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function i(e){for(var t=1;t{e.Intention.SourceName=e.Name,e.Intention.SourceNS=e.Namespace,e.Intention.DestinationName=t.id,e.Intention.DestinationNS=t.ns||"default",r.ensureID(e.Intention)}),l.Upstreams.forEach(e=>{e.Intention.SourceName=t.id,e.Intention.SourceNS=t.ns||"default",e.Intention.DestinationName=e.Name,e.Intention.DestinationNS=e.Namespace,r.ensureID(e.Intention)}),a(e,i(i({},l),{},{[n.SLUG_KEY]:t.id}))}))}),t)}},c=a.prototype,d="store",m=[r],p={configurable:!0,enumerable:!0,writable:!0,initializer:null},b={},Object.keys(p).forEach((function(e){b[e]=p[e]})),b.enumerable=!!b.enumerable,b.configurable=!!b.configurable,("value"in b||b.initializer)&&(b.writable=!0),b=m.slice().reverse().reduce((function(e,t){return t(c,d,e)||e}),b),f&&void 0!==b.initializer&&(b.value=b.initializer?b.initializer.call(f):void 0,b.initializer=void 0),void 0===b.initializer&&(Object.defineProperty(c,d,b),b=null),l=b,a) -var c,d,m,p,f,b -e.default=u})),define("consul-ui/services/-ensure-registered",["exports","@embroider/util/services/ensure-registered"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/services/-portal",["exports","ember-stargate/services/-portal"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/services/abilities",["exports","ember-can/services/can"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -class n extends t.default{parse(e){return super.parse(e.replace("use SSO","use authMethods").replace("service","zervice"))}}e.default=n})),define("consul-ui/services/atob",["exports","consul-ui/utils/atob"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -class n extends Ember.Service{execute(){return(0,t.default)(...arguments)}}e.default=n})),define("consul-ui/services/auth-providers/oauth2-code-with-url-provider",["exports","torii/providers/oauth2-code"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -class n extends t.default{constructor(...e){var t,n,r -super(...e),r="oidc-with-url",(n="name")in(t=this)?Object.defineProperty(t,n,{value:r,enumerable:!0,configurable:!0,writable:!0}):t[n]=r}buildUrl(){return this.baseUrl}open(e){const t=this.get("name"),n=this.buildUrl() -return this.get("popup").open(n,["state","code"],e).then((function(e){return{authorizationState:e.state,authorizationCode:decodeURIComponent(e.code),provider:t}}))}close(){const e=this.get("popup.remote")||{} -if("function"==typeof e.close)return e.close()}}e.default=n})),define("consul-ui/services/btoa",["exports","consul-ui/utils/btoa"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -class n extends Ember.Service{execute(){return(0,t.default)(...arguments)}}e.default=n})),define("consul-ui/services/can",["exports","ember-can/services/abilities"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/services/change",["exports","ember-changeset-validations","ember-changeset","consul-ui/utils/form/changeset","consul-ui/validations/intention-permission","consul-ui/validations/intention-permission-http-header"],(function(e,t,n,r,a,l){var s,i,o -Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const u={"intention-permission":a.default,"intention-permission-http-header":l.default} -let c=(s=Ember.inject.service("schema"),i=class extends Ember.Service{constructor(...e){var t,n,r,a -super(...e),t=this,n="schema",a=this,(r=o)&&Object.defineProperty(t,n,{enumerable:r.enumerable,configurable:r.configurable,writable:r.writable,value:r.initializer?r.initializer.call(a):void 0})}init(){super.init(...arguments),this._validators=new Map}willDestroy(){this._validators=null}changesetFor(e,a,l={}){const s=this.validatorFor(e,l) -let i -if(s){let e=s -"function"!=typeof s&&(e=(0,t.default)(s)),i=(0,n.Changeset)(a,e,s,{changeset:r.default})}else i=(0,n.Changeset)(a) -return i}validatorFor(e,t={}){if(!this._validators.has(e)){const t=u[e] -let n -void 0!==t&&(n=t(this.schema)),this._validators.set(e,n)}return this._validators.get(e)}},d=i.prototype,m="schema",p=[s],f={configurable:!0,enumerable:!0,writable:!0,initializer:null},h={},Object.keys(f).forEach((function(e){h[e]=f[e]})),h.enumerable=!!h.enumerable,h.configurable=!!h.configurable,("value"in h||h.initializer)&&(h.writable=!0),h=p.slice().reverse().reduce((function(e,t){return t(d,m,e)||e}),h),b&&void 0!==h.initializer&&(h.value=h.initializer?h.initializer.call(b):void 0,h.initializer=void 0),void 0===h.initializer&&(Object.defineProperty(d,m,h),h=null),o=h,i) -var d,m,p,f,b,h -e.default=c})),define("consul-ui/services/client/connections",["exports"],(function(e){var t,n,r,a,l,s,i -function o(e,t,n,r){n&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(r):void 0})}function u(e,t,n,r,a){var l={} -return Object.keys(r).forEach((function(e){l[e]=r[e]})),l.enumerable=!!l.enumerable,l.configurable=!!l.configurable,("value"in l||l.initializer)&&(l.writable=!0),l=n.slice().reverse().reduce((function(n,r){return r(e,t,n)||n}),l),a&&void 0!==l.initializer&&(l.value=l.initializer?l.initializer.call(a):void 0,l.initializer=void 0),void 0===l.initializer&&(Object.defineProperty(e,t,l),l=null),l}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -let c=(t=Ember.inject.service("dom"),n=Ember.inject.service("env"),r=Ember.inject.service("data-source/service"),a=class extends Ember.Service{constructor(...e){super(...e),o(this,"dom",l,this),o(this,"env",s,this),o(this,"data",i,this)}init(){super.init(...arguments),this._listeners=this.dom.listeners(),this.connections=new Set,this.addVisibilityChange()}willDestroy(){this._listeners.remove(),this.purge(),super.willDestroy(...arguments)}addVisibilityChange(){this._listeners.add(this.dom.document(),{visibilitychange:e=>{e.target.hidden&&this.purge(-1)}})}whenAvailable(e){const t=this.dom.document() -return t.hidden?new Promise(n=>{const r=this._listeners.add(t,{visibilitychange:function(){r(),n(e)}})}):Promise.resolve(e)}purge(e=0){[...this.connections].forEach((function(t){t.abort(e)})),this.connections=new Set}acquire(e){if(this.connections.size>=this.env.var("CONSUL_HTTP_MAX_CONNECTIONS")){const t=this.data.closed() -let n=[...this.connections].find(e=>!!e.headers()["x-request-id"]&&t.includes(e.headers()["x-request-id"])) -void 0===n&&"text/event-stream"===e.headers()["content-type"]&&(n=this.connections.values().next().value),void 0!==n&&(this.release(n),n.abort(429))}this.connections.add(e)}release(e){this.connections.delete(e)}},l=u(a.prototype,"dom",[t],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),s=u(a.prototype,"env",[n],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),i=u(a.prototype,"data",[r],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),a) -e.default=c})),define("consul-ui/services/client/http",["exports","consul-ui/utils/http/headers","consul-ui/utils/http/consul","consul-ui/utils/http/create-url","consul-ui/utils/http/create-headers","consul-ui/utils/http/create-query-params"],(function(e,t,n,r,a,l){var s,i,o,u,c,d,m,p,f,b,h,v,y,g,O -function _(e,t,n,r){n&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(r):void 0})}function P(e,t,n,r,a){var l={} -return Object.keys(r).forEach((function(e){l[e]=r[e]})),l.enumerable=!!l.enumerable,l.configurable=!!l.configurable,("value"in l||l.initializer)&&(l.writable=!0),l=n.slice().reverse().reduce((function(n,r){return r(e,t,n)||n}),l),a&&void 0!==l.initializer&&(l.value=l.initializer?l.initializer.call(a):void 0,l.initializer=void 0),void 0===l.initializer&&(Object.defineProperty(e,t,l),l=null),l}function w(e,t){var n=Object.keys(e) -if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e) -t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function E(e){for(var t=1;tx.stringify(this.sanitize(e))) -const e=this.encoder.uriTag() -this.cache=(t,n)=>(t.uri=n(e),t.SyncTime=(new Date).getTime(),this.store.push({data:{id:t.uri,type:new URL(t.uri).protocol.slice(0,-1),attributes:t}}))}sanitize(e){return this.env.var("CONSUL_NSPACES_ENABLED")&&void 0!==e.ns&&null!==e.ns&&""!==e.ns||delete e.ns,this.env.var("CONSUL_PARTITIONS_ENABLED")&&void 0!==e.partition&&null!==e.partition&&""!==e.partition||delete e.partition,e}willDestroy(){this._listeners.remove(),super.willDestroy(...arguments)}url(){return this.parseURL(...arguments)}body(){const e=function(e,...t){let n={} -const r=e.reduce((function(e,t,n){return-1!==(t=t.split("\n").map(e=>e.trim()).join("\n")).indexOf("\n\n")?n:e}),-1) -return-1!==r&&(n=t.splice(r).reduce((function(e,t,n){switch(!0){case Array.isArray(t):return 0===n&&(e=[]),e.concat(t) -case"string"!=typeof t:return E(E({},e),t) -default:return t}}),n)),[n,...t]}(...arguments) -return this.sanitize(e[0]),e}requestParams(e,...n){const[r,...a]=this.body(...arguments),[l,...s]=this.url(e,...a).split(" "),[i,...o]=s.join(" ").split("\n"),u={url:i.trim(),method:l.trim(),headers:E({[t.CONTENT_TYPE]:"application/json; charset=utf-8"},j(o)),body:null,data:r} -if(u.clientHeaders=C.reduce((function(e,t){return void 0!==u.headers[t]&&(e[t.toLowerCase()]=u.headers[t],delete u.headers[t]),e}),{}),void 0!==r)if("GET"!==u.method)-1!==u.headers[t.CONTENT_TYPE].indexOf("json")?u.body=JSON.stringify(u.data):("string"==typeof u.data&&u.data.length>0||Object.keys(u.data).length>0)&&(u.body=u.data) -else{const e=x.stringify(u.data) -e.length>0&&(-1!==u.url.indexOf("?")?u.url=`${u.url}&${e}`:u.url=`${u.url}?${e}`)}return u.headers[t.CONTENT_TYPE]="application/json; charset=utf-8",u}fetchWithToken(e,t){return this.settings.findBySlug("token").then(n=>fetch(""+e,E(E({},t),{},{headers:E({"X-Consul-Token":void 0===n.SecretID?"":n.SecretID},t.headers)})))}request(e){const t=this,r=this.cache -return e((function(e){const a=t.requestParams(...arguments) -return t.settings.findBySlug("token").then(e=>{const l=E(E({},a),{},{headers:E({[n.HEADERS_TOKEN]:void 0===e.SecretID?"":e.SecretID},a.headers)}),s=t.transport.request(l) -return new Promise((l,i)=>{const o=t._listeners.add(s,{open:e=>{t.acquire(e.target)},message:t=>{const s=E(E(E({},Object.entries(t.data.headers).reduce((function(e,[t,n]){return C.includes(t)||(e[t]=n),e}),{})),a.clientHeaders),{},{[n.HEADERS_DATACENTER]:a.data.dc,[n.HEADERS_NAMESPACE]:a.data.ns||e.Namespace||"default",[n.HEADERS_PARTITION]:a.data.partition||e.Partition||"default"}),i=function(e){let n=e(s,t.data.response,r) -const a=n.meta||{} -return 2===a.version&&(Array.isArray(n.body)?n=new Proxy(n.body,{get:(e,t)=>{switch(t){case"meta":return a}return e[t]}}):(n=n.body,n.meta=a)),n} -Ember.run.next(()=>l(i))},error:e=>{Ember.run.next(()=>i(e.error))},close:e=>{t.release(e.target),o()}}) -s.fetch()})})}))}whenAvailable(e){return this.connections.whenAvailable(e)}abort(){return this.connections.purge(...arguments)}acquire(){return this.connections.acquire(...arguments)}release(){return this.connections.release(...arguments)}},f=P(p.prototype,"dom",[s],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),b=P(p.prototype,"env",[i],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),h=P(p.prototype,"connections",[o],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),v=P(p.prototype,"transport",[u],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),y=P(p.prototype,"settings",[c],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),g=P(p.prototype,"encoder",[d],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),O=P(p.prototype,"store",[m],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),p) -e.default=S})),define("consul-ui/services/client/transports/xhr",["exports","consul-ui/utils/http/create-headers","consul-ui/utils/http/xhr","consul-ui/utils/http/request","consul-ui/utils/http/error"],(function(e,t,n,r,a){function l(e,t){var n=Object.keys(e) -if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e) -t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function s(e){for(var t=1;t(this.xhr(n),t),t}}e.default=u})),define("consul-ui/services/clipboard/local-storage",["exports","clipboard"],(function(e,t){var n,r,a -Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -class l extends t.default{constructor(e,t,n){super(e,t),this._cb=n}onClick(e){this._cb(this.text(e.delegateTarget||e.currentTarget)),this.emit("success",{})}}let s=(n=Ember.inject.service("-document"),r=class extends Ember.Service{constructor(...e){var t,n,r,l,s,i,o -super(...e),t=this,n="doc",l=this,(r=a)&&Object.defineProperty(t,n,{enumerable:r.enumerable,configurable:r.configurable,writable:r.writable,value:r.initializer?r.initializer.call(l):void 0}),o="clipboard",(i="key")in(s=this)?Object.defineProperty(s,i,{value:o,enumerable:!0,configurable:!0,writable:!0}):s[i]=o}execute(e,t){return new l(e,t,e=>{this.doc.defaultView.localStorage.setItem(this.key,e)})}},i=r.prototype,o="doc",u=[n],c={configurable:!0,enumerable:!0,writable:!0,initializer:null},m={},Object.keys(c).forEach((function(e){m[e]=c[e]})),m.enumerable=!!m.enumerable,m.configurable=!!m.configurable,("value"in m||m.initializer)&&(m.writable=!0),m=u.slice().reverse().reduce((function(e,t){return t(i,o,e)||e}),m),d&&void 0!==m.initializer&&(m.value=m.initializer?m.initializer.call(d):void 0,m.initializer=void 0),void 0===m.initializer&&(Object.defineProperty(i,o,m),m=null),a=m,r) -var i,o,u,c,d,m -e.default=s})),define("consul-ui/services/clipboard/os",["exports","clipboard"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -class n extends Ember.Service{execute(){return new t.default(...arguments)}}e.default=n})),define("consul-ui/services/code-mirror",["exports","ivy-codemirror/services/code-mirror"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/services/code-mirror/linter",["exports","consul-ui/utils/editor/lint"],(function(e,t){var n,r,a -Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const l=[{name:"JSON",mime:"application/json",mode:"javascript",ext:["json","map"],alias:["json5"]},{name:"HCL",mime:"text/x-ruby",mode:"ruby",ext:["rb"],alias:["jruby","macruby","rake","rb","rbx"]},{name:"YAML",mime:"text/x-yaml",mode:"yaml",ext:["yaml","yml"],alias:["yml"]},{name:"XML",mime:"application/xml",mode:"xml",htmlMode:!1,matchClosing:!0,alignCDATA:!1,ext:["xml"],alias:["xml"]}] -let s=(n=Ember.inject.service("dom"),r=class extends Ember.Service{constructor(...e){var t,n,r,l -super(...e),t=this,n="dom",l=this,(r=a)&&Object.defineProperty(t,n,{enumerable:r.enumerable,configurable:r.configurable,writable:r.writable,value:r.initializer?r.initializer.call(l):void 0})}modes(){return l}lint(){return(0,t.default)(...arguments)}getEditor(e){return this.dom.element("textarea + div",e).CodeMirror}},i=r.prototype,o="dom",u=[n],c={configurable:!0,enumerable:!0,writable:!0,initializer:null},m={},Object.keys(c).forEach((function(e){m[e]=c[e]})),m.enumerable=!!m.enumerable,m.configurable=!!m.configurable,("value"in m||m.initializer)&&(m.writable=!0),m=u.slice().reverse().reduce((function(e,t){return t(i,o,e)||e}),m),d&&void 0!==m.initializer&&(m.value=m.initializer?m.initializer.call(d):void 0,m.initializer=void 0),void 0===m.initializer&&(Object.defineProperty(i,o,m),m=null),a=m,r) -var i,o,u,c,d,m -e.default=s})),define("consul-ui/services/container",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -class t extends Ember.Service{constructor(e){super(...arguments),this._owner=e,this._wm=new WeakMap}set(e,t){this._wm.set(t,e)}keyForClass(e){return this._wm.get(e)}get(e){return"string"!=typeof e&&(e=this.keyForClass(e)),this.lookup(e)}lookup(e){return this._owner.lookup(e)}resolveRegistration(e){return this._owner.resolveRegistration(e).prototype}}e.default=t})),define("consul-ui/services/data-sink/protocols/http",["exports"],(function(e){var t,n,r,a,l,s,i,o,u,c,d,m,p -function f(e,t,n,r){n&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(r):void 0})}function b(e,t,n,r,a){var l={} -return Object.keys(r).forEach((function(e){l[e]=r[e]})),l.enumerable=!!l.enumerable,l.configurable=!!l.configurable,("value"in l||l.initializer)&&(l.writable=!0),l=n.slice().reverse().reduce((function(n,r){return r(e,t,n)||n}),l),a&&void 0!==l.initializer&&(l.value=l.initializer?l.initializer.call(a):void 0,l.initializer=void 0),void 0===l.initializer&&(Object.defineProperty(e,t,l),l=null),l}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -let h=(t=Ember.inject.service("settings"),n=Ember.inject.service("repository/intention"),r=Ember.inject.service("repository/kv"),a=Ember.inject.service("repository/nspace"),l=Ember.inject.service("repository/partition"),s=Ember.inject.service("repository/session"),i=class extends Ember.Service{constructor(...e){super(...e),f(this,"settings",o,this),f(this,"intention",u,this),f(this,"kv",c,this),f(this,"nspace",d,this),f(this,"partition",m,this),f(this,"session",p,this)}prepare(e,t,n){return Ember.setProperties(n,t)}persist(e,t){const[,,,,n]=e.split("/") -return this[n].persist(t)}remove(e,t){const[,,,,n]=e.split("/") -return this[n].remove(t)}},o=b(i.prototype,"settings",[t],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),u=b(i.prototype,"intention",[n],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),c=b(i.prototype,"kv",[r],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),d=b(i.prototype,"nspace",[a],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),m=b(i.prototype,"partition",[l],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),p=b(i.prototype,"session",[s],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),i) -e.default=h})),define("consul-ui/services/data-sink/protocols/local-storage",["exports"],(function(e){var t,n,r -Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -let a=(t=Ember.inject.service("settings"),n=class extends Ember.Service{constructor(...e){var t,n,a,l -super(...e),t=this,n="settings",l=this,(a=r)&&Object.defineProperty(t,n,{enumerable:a.enumerable,configurable:a.configurable,writable:a.writable,value:a.initializer?a.initializer.call(l):void 0})}prepare(e,t,n={}){return null===t||""===t?n:Ember.setProperties(n,t)}persist(e,t){const n=e.split(":").pop() -return this.settings.persist({[n]:t})}remove(e,t){const n=e.split(":").pop() -return this.settings.delete(n)}},l=n.prototype,s="settings",i=[t],o={configurable:!0,enumerable:!0,writable:!0,initializer:null},c={},Object.keys(o).forEach((function(e){c[e]=o[e]})),c.enumerable=!!c.enumerable,c.configurable=!!c.configurable,("value"in c||c.initializer)&&(c.writable=!0),c=i.slice().reverse().reduce((function(e,t){return t(l,s,e)||e}),c),u&&void 0!==c.initializer&&(c.value=c.initializer?c.initializer.call(u):void 0,c.initializer=void 0),void 0===c.initializer&&(Object.defineProperty(l,s,c),c=null),r=c,n) -var l,s,i,o,u,c -e.default=a})),define("consul-ui/services/data-sink/service",["exports"],(function(e){var t,n,r,a,l -function s(e,t,n,r){n&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(r):void 0})}function i(e,t,n,r,a){var l={} -return Object.keys(r).forEach((function(e){l[e]=r[e]})),l.enumerable=!!l.enumerable,l.configurable=!!l.configurable,("value"in l||l.initializer)&&(l.writable=!0),l=n.slice().reverse().reduce((function(n,r){return r(e,t,n)||n}),l),a&&void 0!==l.initializer&&(l.value=l.initializer?l.initializer.call(a):void 0,l.initializer=void 0),void 0===l.initializer&&(Object.defineProperty(e,t,l),l=null),l}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const o=function(e){return-1===(e=e.toString()).indexOf("://")&&(e="consul://"+e),e.split("://")} -let u=(t=Ember.inject.service("data-sink/protocols/http"),n=Ember.inject.service("data-sink/protocols/local-storage"),r=class extends Ember.Service{constructor(...e){super(...e),s(this,"consul",a,this),s(this,"settings",l,this)}prepare(e,t,n){const[r,a]=o(e) -return this[r].prepare(a,t,n)}persist(e,t){const[n,r]=o(e) -return this[n].persist(r,t)}remove(e,t){const[n,r]=o(e) -return this[n].remove(r,t)}},a=i(r.prototype,"consul",[t],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),l=i(r.prototype,"settings",[n],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),r) -e.default=u})),define("consul-ui/services/data-source/protocols/http",["exports","consul-ui/decorators/data-source"],(function(e,t){var n,r,a,l,s -function i(e,t,n,r){n&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(r):void 0})}function o(e,t,n,r,a){var l={} -return Object.keys(r).forEach((function(e){l[e]=r[e]})),l.enumerable=!!l.enumerable,l.configurable=!!l.configurable,("value"in l||l.initializer)&&(l.writable=!0),l=n.slice().reverse().reduce((function(n,r){return r(e,t,n)||n}),l),a&&void 0!==l.initializer&&(l.value=l.initializer?l.initializer.call(a):void 0,l.initializer=void 0),void 0===l.initializer&&(Object.defineProperty(e,t,l),l=null),l}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -let u=(n=Ember.inject.service("client/http"),r=Ember.inject.service("data-source/protocols/http/blocking"),a=class extends Ember.Service{constructor(...e){super(...e),i(this,"client",l,this),i(this,"type",s,this)}source(e,n){const r=(0,t.match)(e) -let a -return this.client.request(e=>{a=r.cb(r.params,Ember.getOwner(this),e)}),this.type.source(a,n)}},l=o(a.prototype,"client",[n],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),s=o(a.prototype,"type",[r],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),a) -e.default=u})),define("consul-ui/services/data-source/protocols/http/blocking",["exports","consul-ui/utils/dom/event-source","consul-ui/services/settings","consul-ui/services/client/http","consul-ui/utils/maybe-call"],(function(e,t,n,r,a){var l,s,i,o,u -function c(e,t,n,r){n&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(r):void 0})}function d(e,t,n,r,a){var l={} -return Object.keys(r).forEach((function(e){l[e]=r[e]})),l.enumerable=!!l.enumerable,l.configurable=!!l.configurable,("value"in l||l.initializer)&&(l.writable=!0),l=n.slice().reverse().reduce((function(n,r){return r(e,t,n)||n}),l),a&&void 0!==l.initializer&&(l.value=l.initializer?l.initializer.call(a):void 0,l.initializer=void 0),void 0===l.initializer&&(Object.defineProperty(e,t,l),l=null),l}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -let m=(l=Ember.inject.service("client/http"),s=Ember.inject.service("settings"),i=class extends Ember.Service{constructor(...e){super(...e),c(this,"client",o,this),c(this,"settings",u,this)}source(e,l){return new t.BlockingEventSource((t,l)=>{const s=l.close.bind(l) -return(0,a.default)(()=>t.cursor=void 0,(0,n.ifNotBlocking)(this.settings))().then(()=>e(t).then((0,a.default)(s,(0,n.ifNotBlocking)(this.settings))).then((function(e={}){const t=Ember.get(e,"meta")||{} -return void 0===t.cursor&&void 0===t.interval&&s(),e})).catch((0,r.restartWhenAvailable)(this.client)))},l)}},o=d(i.prototype,"client",[l],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),u=d(i.prototype,"settings",[s],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),i) -e.default=m})),define("consul-ui/services/data-source/protocols/http/promise",["exports","consul-ui/utils/dom/event-source"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -class n extends Ember.Service{source(e,n){return(0,t.once)(e,n)}}e.default=n})),define("consul-ui/services/data-source/protocols/local-storage",["exports","consul-ui/utils/dom/event-source"],(function(e,t){var n,r,a -Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -let l=(n=Ember.inject.service("settings"),r=class extends Ember.Service{constructor(...e){var t,n,r,l -super(...e),t=this,n="repo",l=this,(r=a)&&Object.defineProperty(t,n,{enumerable:r.enumerable,configurable:r.configurable,writable:r.writable,value:r.initializer?r.initializer.call(l):void 0})}source(e,n){const r=e.split(":").pop() -return new t.StorageEventSource(()=>this.repo.findBySlug(r),{key:e,uri:n.uri})}},s=r.prototype,i="repo",o=[n],u={configurable:!0,enumerable:!0,writable:!0,initializer:null},d={},Object.keys(u).forEach((function(e){d[e]=u[e]})),d.enumerable=!!d.enumerable,d.configurable=!!d.configurable,("value"in d||d.initializer)&&(d.writable=!0),d=o.slice().reverse().reduce((function(e,t){return t(s,i,e)||e}),d),c&&void 0!==d.initializer&&(d.value=d.initializer?d.initializer.call(c):void 0,d.initializer=void 0),void 0===d.initializer&&(Object.defineProperty(s,i,d),d=null),a=d,r) -var s,i,o,u,c,d -e.default=l})),define("consul-ui/services/data-source/service",["exports","consul-ui/utils/dom/event-source","mnemonist/multi-map"],(function(e,t,n){var r,a,l,s,i,o,u,c,d -function m(e,t,n,r){n&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(r):void 0})}function p(e,t,n,r,a){var l={} -return Object.keys(r).forEach((function(e){l[e]=r[e]})),l.enumerable=!!l.enumerable,l.configurable=!!l.configurable,("value"in l||l.initializer)&&(l.writable=!0),l=n.slice().reverse().reduce((function(n,r){return r(e,t,n)||n}),l),a&&void 0!==l.initializer&&(l.value=l.initializer?l.initializer.call(a):void 0,l.initializer=void 0),void 0===l.initializer&&(Object.defineProperty(e,t,l),l=null),l}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -let f=null,b=null,h=null -class v{constructor(e){this.uri=e}toString(){return this.uri}}let y=(r=Ember.inject.service("dom"),a=Ember.inject.service("encoder"),l=Ember.inject.service("data-source/protocols/http"),s=Ember.inject.service("data-source/protocols/local-storage"),i=class extends Ember.Service{constructor(...e){super(...e),m(this,"dom",o,this),m(this,"encoder",u,this),m(this,"consul",c,this),m(this,"settings",d,this)}init(){super.init(...arguments),f=new Map,b=new Map,h=new n.default(Set),this._listeners=this.dom.listeners()}resetCache(){f=new Map}willDestroy(){Ember.run.schedule("afterRender",()=>{this._listeners.remove(),b.forEach((function(e){e.close()})),f=null,b=null,h.clear(),h=null})}source(e,n){const r=e(this.encoder.uriTag()) -return new Promise((e,n)=>{const a={},l=this.open(r,a,!0) -l.configuration.ref=a -const s=this._listeners.add(l,{message:n=>{s(),e((0,t.proxy)(n.target,n.data))},error:e=>{s(),this.close(l,a),n(e.error)}}) -void 0!==l.getCurrentEvent()&&l.dispatchEvent(l.getCurrentEvent())})}unwrap(e,t){const n=e._source -return h.set(n,t),h.remove(n,n.configuration.ref),delete n.configuration.ref,n}uri(e){return new v(e)}open(e,t,n=!1){if(!(e instanceof v)&&"string"!=typeof e)return this.unwrap(e,t) -let r;-1===(e=e.toString()).indexOf("://")&&(e="consul://"+e) -let[a,l]=e.split("://") -const s=this[a] -if(b.has(e))r=b.get(e),b.delete(e),b.set(e,r) -else{let t={} -f.has(e)&&(t=f.get(e)),t.uri=e,r=s.source(l,t) -const n=this._listeners.add(r,{close:t=>{const r=t.target,a=r.getCurrentEvent(),l=r.configuration.cursor -void 0!==a&&void 0!==l&&t.errors&&"401"!==t.errors[0].status&&f.set(e,{currentEvent:a,cursor:l}),h.has(r)||b.delete(e),n()}}) -b.set(e,r)}return(!h.has(r)||r.readyState>1||n)&&r.open(),h.set(r,t),r}close(e,t){e&&(h.remove(e,t),h.has(e)||(e.close(),2===e.readyState&&b.delete(e.configuration.uri)))}closed(){return[...b.entries()].filter(([e,t])=>t.readyState>1).map(e=>e[0])}},o=p(i.prototype,"dom",[r],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),u=p(i.prototype,"encoder",[a],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),c=p(i.prototype,"consul",[l],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),d=p(i.prototype,"settings",[s],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),i) -e.default=y})) -define("consul-ui/services/data-structs",["exports","ngraph.graph"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -class n extends Ember.Service{graph(){return(0,t.default)()}}e.default=n})),define("consul-ui/services/dom",["exports","consul-ui/utils/dom/qsa-factory","consul-ui/utils/dom/sibling","consul-ui/utils/dom/closest","consul-ui/utils/dom/is-outside","consul-ui/utils/dom/get-component-factory","consul-ui/utils/dom/normalize-event","consul-ui/utils/dom/create-listeners","consul-ui/utils/dom/click-first-anchor"],(function(e,t,n,r,a,l,s,i,o){var u,c,d -function m(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const p=(0,t.default)() -let f,b -const h=(0,o.default)(r.default) -let v=(u=Ember.inject.service("-document"),c=class extends Ember.Service{constructor(e){var t,o,u,c -super(...arguments),t=this,o="doc",c=this,(u=d)&&Object.defineProperty(t,o,{enumerable:u.enumerable,configurable:u.configurable,writable:u.writable,value:u.initializer?u.initializer.call(c):void 0}),m(this,"clickFirstAnchor",h),m(this,"closest",r.default),m(this,"sibling",n.default),m(this,"isOutside",a.default),m(this,"normalizeEvent",s.default),m(this,"listeners",i.default),b=new WeakMap,f=(0,l.default)(e)}willDestroy(){super.willDestroy(...arguments),b=null,f=null}document(){return this.doc}viewport(){return this.doc.defaultView}guid(e){return Ember.guidFor(e)}focus(e){if("string"==typeof e&&(e=this.element(e)),void 0!==e){let t=e.getAttribute("tabindex") -e.setAttribute("tabindex","0"),e.focus(),null===t?e.removeAttribute("tabindex"):e.setAttribute("tabindex",t)}}setEventTargetProperty(e,t,n){const r=e.target -return new Proxy(e,{get:function(a,l,s){return"target"===l?new Proxy(r,{get:function(a,l){return l===t?n(e.target[t]):r[l]}}):Reflect.get(...arguments)}})}setEventTargetProperties(e,t){const n=e.target -return new Proxy(e,{get:function(r,a,l){return"target"===a?new Proxy(n,{get:function(r,a){return void 0!==t[a]?t[a](e.target):n[a]}}):Reflect.get(...arguments)}})}root(){return this.doc.documentElement}elementById(e){return this.doc.getElementById(e)}elementsByTagName(e,t){return(t=void 0===t?this.doc:t).getElementsByTagName(e)}elements(e,t){return p(e,t)}element(e,t){return"#"===e.substr(0,1)?this.elementById(e.substr(1)):[...p(e,t)][0]}component(e,t){return f("string"!=typeof e?e:this.element(e,t))}components(e,t){return[...this.elements(e,t)].map((function(e){return f(e)})).filter((function(e){return null!=e}))}isInViewport(e,t,n=0){b.set(e,t) -let r=new IntersectionObserver(e=>{e.map(e=>{const t=b.get(e.target) -"function"==typeof t&&t(e.isIntersecting)})},{rootMargin:"0px",threshold:n}) -return r.observe(e),()=>{r.unobserve(e),b&&b.delete(e),r.disconnect(),r=null}}},y=c.prototype,g="doc",O=[u],_={configurable:!0,enumerable:!0,writable:!0,initializer:null},w={},Object.keys(_).forEach((function(e){w[e]=_[e]})),w.enumerable=!!w.enumerable,w.configurable=!!w.configurable,("value"in w||w.initializer)&&(w.writable=!0),w=O.slice().reverse().reduce((function(e,t){return t(y,g,e)||e}),w),P&&void 0!==w.initializer&&(w.value=w.initializer?w.initializer.call(P):void 0,w.initializer=void 0),void 0===w.initializer&&(Object.defineProperty(y,g,w),w=null),d=w,c) -var y,g,O,_,P,w -e.default=v})),define("consul-ui/services/encoder",["exports","consul-ui/utils/atob","consul-ui/utils/btoa"],(function(e,t,n){function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -class a extends Ember.Service{constructor(...e){super(...e),r(this,"uriComponent",encodeURIComponent),r(this,"joiner",(e,t="",n="")=>(r,a)=>(a||Array(r.length).fill(t)).reduce((t,a,l)=>`${t}${a}${e(r[l]||n)}`,""))}createRegExpEncoder(e,t){return function(e,t=(e=>e)){return(n="",r={})=>""!==n?n.replace(e,(e,n)=>{const a=Ember.get(r,n) -return t(a||"")}):""}(e,t)}atob(){return(0,t.default)(...arguments)}btoa(){return(0,n.default)(...arguments)}uriJoin(){return this.joiner(this.uriComponent,"/","")(...arguments)}uriTag(){return this.tag(this.uriJoin.bind(this))}tag(e){return(t,...n)=>e(n,t)}}e.default=a})),define("consul-ui/services/env",["exports","consul-ui/env"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -class n extends Ember.Service{env(e){return this.var(e)}var(e){return(0,t.env)(e)}}e.default=n})),define("consul-ui/services/feedback",["exports","consul-ui/utils/callable-type"],(function(e,t){var n,r,a,l,s -function i(e,t){var n=Object.keys(e) -if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e) -t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function o(e){for(var t=1;tthis.success(n,e,void 0,t),error:n=>this.error(n,e,void 0,t)}}success(e,n,r=m,a){const l=(0,t.default)(n),s=(0,t.default)(r) -!1!==e&&(this.notify.clearMessages(),this.notify.add(o(o({},{timeout:6e3,extendedTimeout:300,destroyOnClick:!0}),{},{type:s("success"),action:l(),item:e,model:a})))}error(e,n,r=m,a){const l=(0,t.default)(n),s=(0,t.default)(r) -this.notify.clearMessages(),this.logger.execute(e),"TransitionAborted"===e.name?this.notify.add(o(o({},{timeout:6e3,extendedTimeout:300,destroyOnClick:!0}),{},{type:s("success"),action:l(),model:a})):this.notify.add(o(o({},{timeout:6e3,extendedTimeout:300,destroyOnClick:!0}),{},{type:s("error",e),action:l(),error:e,model:a}))}async execute(e,t,n,r){let a -try{a=await e(),this.success(a,t,n,r)}catch(l){this.error(l,t,n,r)}}},l=d(a.prototype,"notify",[n],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),s=d(a.prototype,"logger",[r],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),a) -e.default=p})),define("consul-ui/services/filter",["exports","consul-ui/utils/filter","consul-ui/filter/predicates/service","consul-ui/filter/predicates/service-instance","consul-ui/filter/predicates/health-check","consul-ui/filter/predicates/node","consul-ui/filter/predicates/kv","consul-ui/filter/predicates/intention","consul-ui/filter/predicates/token","consul-ui/filter/predicates/policy","consul-ui/filter/predicates/auth-method"],(function(e,t,n,r,a,l,s,i,o,u,c){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const d={service:(0,t.andOr)(n.default),"service-instance":(0,t.andOr)(r.default),"health-check":(0,t.andOr)(a.default),"auth-method":(0,t.andOr)(c.default),node:(0,t.andOr)(l.default),kv:(0,t.andOr)(s.default),intention:(0,t.andOr)(i.default),token:(0,t.andOr)(o.default),policy:(0,t.andOr)(u.default)} -class m extends Ember.Service{predicate(e){return d[e]}}e.default=m})),define("consul-ui/services/flash-messages",["exports","ember-cli-flash/services/flash-messages"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/services/form",["exports","consul-ui/utils/form/builder","consul-ui/forms/kv","consul-ui/forms/token","consul-ui/forms/policy","consul-ui/forms/role","consul-ui/forms/intention"],(function(e,t,n,r,a,l,s){var i,o,u,c,d -function m(e,t,n,r){n&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(r):void 0})}function p(e,t,n,r,a){var l={} -return Object.keys(r).forEach((function(e){l[e]=r[e]})),l.enumerable=!!l.enumerable,l.configurable=!!l.configurable,("value"in l||l.initializer)&&(l.writable=!0),l=n.slice().reverse().reduce((function(n,r){return r(e,t,n)||n}),l),a&&void 0!==l.initializer&&(l.value=l.initializer?l.initializer.call(a):void 0,l.initializer=void 0),void 0===l.initializer&&(Object.defineProperty(e,t,l),l=null),l}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const f=(0,t.default)(),b={kv:n.default,token:r.default,policy:a.default,role:l.default,intention:s.default} -let h=(i=Ember.inject.service("repository/role"),o=Ember.inject.service("repository/policy"),u=class extends Ember.Service{constructor(...e){var t,n,r -super(...e),m(this,"role",c,this),m(this,"policy",d,this),r=[],(n="forms")in(t=this)?Object.defineProperty(t,n,{value:r,enumerable:!0,configurable:!0,writable:!0}):t[n]=r}build(e,t){return f(...arguments)}form(e){let t=this.forms[e] -if(void 0===t&&(t=this.forms[e]=b[e](this),"role"===e||"policy"===e)){const n=this[e] -t.clear((function(e){return n.create(e)})),t.submit((function(e){return n.persist(e)}))}return t}},c=p(u.prototype,"role",[i],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),d=p(u.prototype,"policy",[o],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),u) -e.default=h})),define("consul-ui/services/i18n",["exports","ember-intl/services/intl"],(function(e,t){var n,r,a -function l(e,t){var n=Object.keys(e) -if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e) -t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function s(e){for(var t=1;t(e[t]=this.env.var(t),e),{}) -return s(s({},e),t)}},c=r.prototype,d="env",m=[n],p={configurable:!0,enumerable:!0,writable:!0,initializer:null},b={},Object.keys(p).forEach((function(e){b[e]=p[e]})),b.enumerable=!!b.enumerable,b.configurable=!!b.configurable,("value"in b||b.initializer)&&(b.writable=!0),b=m.slice().reverse().reduce((function(e,t){return t(c,d,e)||e}),b),f&&void 0!==b.initializer&&(b.value=b.initializer?b.initializer.call(f):void 0,b.initializer=void 0),void 0===b.initializer&&(Object.defineProperty(c,d,b),b=null),a=b,r) -var c,d,m,p,f,b -e.default=u})),define("consul-ui/services/in-viewport",["exports","ember-in-viewport/services/in-viewport"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/services/intl",["exports","ember-intl/services/intl"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/services/logger",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -class t extends Ember.Service{execute(e){}}e.default=t})),define("consul-ui/services/page-title-list",["exports","ember-page-title/services/page-title-list"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/services/page-title",["exports","ember-page-title/services/page-title"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/services/popup",["exports","torii/services/popup"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/services/repository",["exports","validated-changeset","consul-ui/utils/http/error","consul-ui/abilities/base"],(function(e,t,n,r){var a,l,s,i,o,u,c -function d(e,t,n,r){n&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(r):void 0})}function m(e,t,n,r,a){var l={} -return Object.keys(r).forEach((function(e){l[e]=r[e]})),l.enumerable=!!l.enumerable,l.configurable=!!l.configurable,("value"in l||l.initializer)&&(l.writable=!0),l=n.slice().reverse().reduce((function(n,r){return r(e,t,n)||n}),l),a&&void 0!==l.initializer&&(l.value=l.initializer?l.initializer.call(a):void 0,l.initializer=void 0),void 0===l.initializer&&(Object.defineProperty(e,t,l),l=null),l}Object.defineProperty(e,"__esModule",{value:!0}),e.default=e.softDelete=void 0 -e.softDelete=(e,t)=>e.store.adapterFor(e.getModelName()).rpc((e,t,n,r)=>e.requestForDeleteRecord(t,n,r),()=>t,t,e.getModelName()) -let p=(a=Ember.inject.service("store"),l=Ember.inject.service("env"),s=Ember.inject.service("repository/permission"),i=class extends Ember.Service{constructor(...e){super(...e),d(this,"store",o,this),d(this,"env",u,this),d(this,"permissions",c,this)}getModelName(){}getPrimaryKey(){}getSlugKey(){}async authorizeBySlug(e,t,n){return n.resources=await this.permissions.findBySlug(n,this.getModelName()),this.validatePermissions(e,t,n)}async authorizeByPermissions(e,t,n){return n.resources=await this.permissions.authorize(n),this.validatePermissions(e,t,n)}async validatePermissions(e,t,r){if(r.resources.length>0){const e=r.resources.find(e=>e.Access===t) -if(e&&!1===e.Allow){const e=new n.default(403) -throw e.errors=[{status:"403"}],e}}const a=await e(r.resources) -return Ember.get(a,"Resources")&&Ember.set(a,"Resources",r.resources),a}shouldReconcile(e,t){if(Ember.get(e,"Datacenter")!==t.dc)return!1 -if(this.env.var("CONSUL_NSPACES_ENABLED")){const n=Ember.get(e,"Namespace") -if(void 0!==n&&n!==t.ns)return!1}if(this.env.var("CONSUL_PARTITIONS_ENABLED")){const n=Ember.get(e,"Partition") -if(void 0!==n&&n!==t.partition)return!1}return!0}reconcile(e={},t={},n={}){void 0!==e.date&&this.store.peekAll(this.getModelName()).forEach(n=>{const r=Ember.get(n,"SyncTime") -!n.isDeleted&&void 0!==r&&r!=e.date&&this.shouldReconcile(n,t)&&this.store.unloadRecord(n)})}peekOne(e){return this.store.peekRecord(this.getModelName(),e)}peekAll(){return this.store.peekAll(this.getModelName())}cached(e){const t=Object.entries(e) -return this.store.peekAll(this.getModelName()).filter(e=>t.every(([t,n])=>e[t]===n))}async findAllByDatacenter(e,t={}){return this.findAll(...arguments)}async findAll(e={},t={}){return void 0!==t.cursor&&(e.index=t.cursor,e.uri=t.uri),this.query(e)}async query(e={},t={}){let n,r,a -try{a=await this.store.query(this.getModelName(),e),r=a.meta}catch(l){switch(Ember.get(l,"errors.firstObject.status")){case"404":case"403":r={date:Number.POSITIVE_INFINITY},n=l -break -default:throw l}}if(void 0!==r&&this.reconcile(r,e,t),void 0!==n)throw n -return a}async findBySlug(e,t={}){return""===e.id?this.create({Datacenter:e.dc,Namespace:e.ns,Partition:e.partition}):(void 0!==t.cursor&&(e.index=t.cursor,e.uri=t.uri),this.authorizeBySlug(()=>this.store.queryRecord(this.getModelName(),e),r.ACCESS_READ,e))}create(e){return this.store.createRecord(this.getModelName(),e)}persist(e){return(0,t.isChangeset)(e)&&(e.execute(),e=e.data),Ember.set(e,"SyncTime",void 0),e.save()}remove(e){let t=e -return void 0===e.destroyRecord&&(t=e.get("data")),"object"===Ember.typeOf(t)&&(t=this.store.peekRecord(this.getModelName(),t[this.getPrimaryKey()])),t.destroyRecord().then(e=>this.store.unloadRecord(e))}invalidate(){this.store.unloadAll(this.getModelName())}},o=m(i.prototype,"store",[a],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),u=m(i.prototype,"env",[l],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),c=m(i.prototype,"permissions",[s],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),i) -e.default=p})),define("consul-ui/services/repository/auth-method",["exports","consul-ui/services/repository","consul-ui/models/auth-method","consul-ui/decorators/data-source"],(function(e,t,n,r){var a,l,s -function i(e,t,n,r,a){var l={} -return Object.keys(r).forEach((function(e){l[e]=r[e]})),l.enumerable=!!l.enumerable,l.configurable=!!l.configurable,("value"in l||l.initializer)&&(l.writable=!0),l=n.slice().reverse().reduce((function(n,r){return r(e,t,n)||n}),l),a&&void 0!==l.initializer&&(l.value=l.initializer?l.initializer.call(a):void 0,l.initializer=void 0),void 0===l.initializer&&(Object.defineProperty(e,t,l),l=null),l}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -let o=(a=(0,r.default)("/:partition/:ns/:dc/auth-methods"),l=(0,r.default)("/:partition/:ns/:dc/auth-method/:id"),i((s=class extends t.default{getModelName(){return"auth-method"}getPrimaryKey(){return n.PRIMARY_KEY}getSlugKey(){return n.SLUG_KEY}async findAllByDatacenter(){return super.findAllByDatacenter(...arguments)}async findBySlug(){return super.findBySlug(...arguments)}}).prototype,"findAllByDatacenter",[a],Object.getOwnPropertyDescriptor(s.prototype,"findAllByDatacenter"),s.prototype),i(s.prototype,"findBySlug",[l],Object.getOwnPropertyDescriptor(s.prototype,"findBySlug"),s.prototype),s) -e.default=o})),define("consul-ui/services/repository/binding-rule",["exports","consul-ui/services/repository","consul-ui/models/binding-rule","consul-ui/decorators/data-source"],(function(e,t,n,r){var a,l -Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -let s=(a=(0,r.default)("/:partition/:ns/:dc/binding-rules/for-auth-method/:authmethod"),l=class extends t.default{getModelName(){return"binding-rule"}getPrimaryKey(){return n.PRIMARY_KEY}getSlugKey(){return n.SLUG_KEY}async findAllByAuthMethod(){return super.findAll(...arguments)}},i=l.prototype,o="findAllByAuthMethod",u=[a],c=Object.getOwnPropertyDescriptor(l.prototype,"findAllByAuthMethod"),d=l.prototype,m={},Object.keys(c).forEach((function(e){m[e]=c[e]})),m.enumerable=!!m.enumerable,m.configurable=!!m.configurable,("value"in m||m.initializer)&&(m.writable=!0),m=u.slice().reverse().reduce((function(e,t){return t(i,o,e)||e}),m),d&&void 0!==m.initializer&&(m.value=m.initializer?m.initializer.call(d):void 0,m.initializer=void 0),void 0===m.initializer&&(Object.defineProperty(i,o,m),m=null),l) -var i,o,u,c,d,m -e.default=s})),define("consul-ui/services/repository/coordinate",["exports","consul-ui/services/repository","consul-ui/decorators/data-source","consul-ui/utils/tomography","consul-ui/utils/distance"],(function(e,t,n,r,a){var l,s,i -function o(e,t,n,r,a){var l={} -return Object.keys(r).forEach((function(e){l[e]=r[e]})),l.enumerable=!!l.enumerable,l.configurable=!!l.configurable,("value"in l||l.initializer)&&(l.writable=!0),l=n.slice().reverse().reduce((function(n,r){return r(e,t,n)||n}),l),a&&void 0!==l.initializer&&(l.value=l.initializer?l.initializer.call(a):void 0,l.initializer=void 0),void 0===l.initializer&&(Object.defineProperty(e,t,l),l=null),l}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const u=(0,r.default)(a.default) -let c=(l=(0,n.default)("/:partition/:ns/:dc/coordinates"),s=(0,n.default)("/:partition/:ns/:dc/coordinates/for-node/:id"),o((i=class extends t.default{getModelName(){return"coordinate"}async findAllByDatacenter(e,t={}){return void 0!==t.cursor&&(e.index=t.cursor,e.uri=t.uri),this.store.query(this.getModelName(),e)}async findAllByNode(e,t){const n=await this.findAllByDatacenter(e,t) -let r={} -return n.length>1&&(r=u(e.id,n)),r.meta=n.meta,r}}).prototype,"findAllByDatacenter",[l],Object.getOwnPropertyDescriptor(i.prototype,"findAllByDatacenter"),i.prototype),o(i.prototype,"findAllByNode",[s],Object.getOwnPropertyDescriptor(i.prototype,"findAllByNode"),i.prototype),i) -e.default=c})),define("consul-ui/services/repository/dc",["exports","consul-ui/services/repository","consul-ui/decorators/data-source","consul-ui/utils/http/consul"],(function(e,t,n,r){var a,l,s,i,o,u,c -function d(e,t,n,r,a){var l={} -return Object.keys(r).forEach((function(e){l[e]=r[e]})),l.enumerable=!!l.enumerable,l.configurable=!!l.configurable,("value"in l||l.initializer)&&(l.writable=!0),l=n.slice().reverse().reduce((function(n,r){return r(e,t,n)||n}),l),a&&void 0!==l.initializer&&(l.value=l.initializer?l.initializer.call(a):void 0,l.initializer=void 0),void 0===l.initializer&&(Object.defineProperty(e,t,l),l=null),l}function m(e,t){var n=Object.keys(e) -if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e) -t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function p(e){for(var t=1;t{const l=Object.entries(e).find(([e,t])=>e.toLowerCase()===r.HEADERS_DEFAULT_ACL_POLICY.toLowerCase())[1]||"allow" -return{meta:{version:2,uri:a},body:t.map(e=>n({Name:e,Datacenter:"",Local:e===s,Primary:e===i,DefaultACLPolicy:l},t=>t`${"dc"}:///${""}/${""}/${e}/datacenter`))}})}async fetch({partition:e,ns:t,dc:n},{uri:r},a){return(await(a` - GET /v1/operator/autopilot/state?${{dc:n}} - X-Request-ID: ${r} - `))((e,t,a)=>{const l=Object.values(t.Servers),s=[] -return{meta:{version:2,uri:r},body:a(p(p({},t),{},{Servers:l,RedundancyZones:Object.entries(t.RedundancyZones||{}).map(([e,n])=>p(p({},n),{},{Name:e,Healthy:!0,Servers:n.Servers.reduce((e,n)=>{const r=t.Servers[n] -return s.push(r.ID),e.push(r),e},[])})),ReadReplicas:(t.ReadReplicas||[]).map(e=>(s.push(e),t.Servers[e])),Default:{Servers:l.filter(e=>!s.includes(e.ID))}}),e=>e`${"dc"}:///${""}/${""}/${n}/datacenter`)}})}async fetchCatalogHealth({partition:e,ns:t,dc:n},{uri:r},a){return(await(a` - GET /v1/internal/ui/catalog-overview?${{dc:n,stale:null}} - X-Request-ID: ${r} - `))((e,t)=>{const a=["Nodes","Services","Checks"].reduce((e,n)=>((e,t,n)=>t[n].reduce((e,t)=>(["Partition","Namespace"].forEach(r=>{let a=e[r][t[r]] -void 0===a&&(a=e[r][t[r]]={Name:t[r]}),void 0===a[n]&&(a[n]=p({},b)),a[n].Total+=t.Total,a[n].Passing+=t.Passing,a[n].Warning+=t.Warning,a[n].Critical+=t.Critical}),e.Datacenter[n].Total+=t.Total,e.Datacenter[n].Passing+=t.Passing,e.Datacenter[n].Warning+=t.Warning,e.Datacenter[n].Critical+=t.Critical,e),e))(e,t,n),{Datacenter:{Name:n,Nodes:p({},b),Services:p({},b),Checks:p({},b)},Partition:{},Namespace:{}}) -return{meta:{version:2,uri:r,interval:3e4},body:p({Datacenter:a.Datacenter,Partitions:Object.values(a.Partition),Namespaces:Object.values(a.Namespace)},t)}})}async find(e){const t=this.store.peekAll("dc").findBy("Name",e.name) -if(void 0===t){const e=new Ember.Error("Page not found") -throw e.status="404",{errors:[e]}}return t}},c=d(u.prototype,"env",[a],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),d(u.prototype,"fetchAll",[l],Object.getOwnPropertyDescriptor(u.prototype,"fetchAll"),u.prototype),d(u.prototype,"fetch",[s],Object.getOwnPropertyDescriptor(u.prototype,"fetch"),u.prototype),d(u.prototype,"fetchCatalogHealth",[i],Object.getOwnPropertyDescriptor(u.prototype,"fetchCatalogHealth"),u.prototype),d(u.prototype,"find",[o],Object.getOwnPropertyDescriptor(u.prototype,"find"),u.prototype),u) -e.default=h})),define("consul-ui/services/repository/discovery-chain",["exports","consul-ui/services/repository","consul-ui/decorators/data-source"],(function(e,t,n){var r,a,l,s -function i(e,t,n,r,a){var l={} -return Object.keys(r).forEach((function(e){l[e]=r[e]})),l.enumerable=!!l.enumerable,l.configurable=!!l.configurable,("value"in l||l.initializer)&&(l.writable=!0),l=n.slice().reverse().reduce((function(n,r){return r(e,t,n)||n}),l),a&&void 0!==l.initializer&&(l.value=l.initializer?l.initializer.call(a):void 0,l.initializer=void 0),void 0===l.initializer&&(Object.defineProperty(e,t,l),l=null),l}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -let o=(r=Ember.inject.service("repository/dc"),a=(0,n.default)("/:partition/:ns/:dc/discovery-chain/:id"),l=class extends t.default{constructor(...e){var t,n,r,a -super(...e),t=this,n="dcs",a=this,(r=s)&&Object.defineProperty(t,n,{enumerable:r.enumerable,configurable:r.configurable,writable:r.writable,value:r.initializer?r.initializer.call(a):void 0})}getModelName(){return"discovery-chain"}findBySlug(e,t={}){const n=this.dcs.peekAll().findBy("Name",e.dc) -return void 0===n||Ember.get(n,"MeshEnabled")?super.findBySlug(...arguments).catch(e=>{const t=Ember.get(e,"errors.firstObject.status"),r=(Ember.get(e,"errors.firstObject.detail")||"").trim() -switch(t){case"500":return void(void 0!==n&&r.endsWith("Connect must be enabled in order to use this endpoint")&&Ember.set(n,"MeshEnabled",!1)) -default:throw e}}):Promise.resolve()}},s=i(l.prototype,"dcs",[r],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),i(l.prototype,"findBySlug",[a],Object.getOwnPropertyDescriptor(l.prototype,"findBySlug"),l.prototype),l) -e.default=o})),define("consul-ui/services/repository/intention-permission-http-header",["exports","consul-ui/services/repository"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -class n extends t.default{getModelName(){return"intention-permission-http-header"}create(e={}){return this.store.createFragment(this.getModelName(),e)}persist(e){return e.execute()}}e.default=n})),define("consul-ui/services/repository/intention-permission",["exports","consul-ui/services/repository"],(function(e,t){function n(e,t){var n=Object.keys(e) -if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e) -t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function r(e){for(var t=1;te.IsManagedByCRD)),this.managedByCRDs}async authorizeBySlug(e,t,n){const[,r,,a]=n.id.split(":"),l=this.permissions.abilityFor(this.getModelName()) -return n.resources=l.generateForSegment(r).concat(l.generateForSegment(a)),this.authorizeByPermissions(e,t,n)}async persist(e){const t=await super.persist(...arguments) -return Ember.get(t,"Action.length")&&Ember.set(t,"Permissions",[]),t}async findAll(){return super.findAll(...arguments)}async findBySlug(e){let t -if(""===e.id){const n=this.env.var("CONSUL_NSPACES_ENABLED")?"*":"default",r="default" -t=await this.create({SourceNS:e.nspace||n,DestinationNS:e.nspace||n,SourcePartition:e.partition||r,DestinationPartition:e.partition||r,Datacenter:e.dc,Partition:e.partition})}else t=super.findBySlug(...arguments) -return t}async findByService(e,t={}){const n={dc:e.dc,nspace:e.nspace,filter:`SourceName == "${e.id}" or DestinationName == "${e.id}" or SourceName == "*" or DestinationName == "*"`} -return void 0!==t.cursor&&(n.index=t.cursor,n.uri=t.uri),this.store.query(this.getModelName(),n)}},u=m(o.prototype,"env",[a],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),m(o.prototype,"findAll",[l],Object.getOwnPropertyDescriptor(o.prototype,"findAll"),o.prototype),m(o.prototype,"findBySlug",[s],Object.getOwnPropertyDescriptor(o.prototype,"findBySlug"),o.prototype),m(o.prototype,"findByService",[i],Object.getOwnPropertyDescriptor(o.prototype,"findByService"),o.prototype),o) -e.default=p})),define("consul-ui/services/repository/kv",["exports","consul-ui/services/repository","consul-ui/utils/isFolder","consul-ui/models/kv","consul-ui/decorators/data-source"],(function(e,t,n,r,a){var l,s,i -function o(e,t,n,r,a){var l={} -return Object.keys(r).forEach((function(e){l[e]=r[e]})),l.enumerable=!!l.enumerable,l.configurable=!!l.configurable,("value"in l||l.initializer)&&(l.writable=!0),l=n.slice().reverse().reduce((function(n,r){return r(e,t,n)||n}),l),a&&void 0!==l.initializer&&(l.value=l.initializer?l.initializer.call(a):void 0,l.initializer=void 0),void 0===l.initializer&&(Object.defineProperty(e,t,l),l=null),l}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -let u=(l=(0,a.default)("/:partition/:ns/:dc/kv/:id"),s=(0,a.default)("/:partition/:ns/:dc/kvs/:id"),o((i=class extends t.default{getModelName(){return"kv"}getPrimaryKey(){return r.PRIMARY_KEY}shouldReconcile(e,t){return super.shouldReconcile(...arguments)&&e.Key.startsWith(t.id)}async findBySlug(e,t={}){let r -if((0,n.default)(e.id)){const t=JSON.stringify([e.partition,e.ns,e.dc,e.id]) -r=this.store.peekRecord(this.getModelName(),t),r||(r=await this.create({Key:e.id,Datacenter:e.dc,Namespace:e.ns,Partition:e.partition}))}else r=""===e.id?await this.create({Datacenter:e.dc,Namespace:e.ns,Partition:e.partition}):await super.findBySlug(...arguments) -return r}async findAllBySlug(e,t={}){e.separator="/","/"===e.id&&(e.id="") -let n=await this.findAll(...arguments) -const r=n.meta -return n=n.filter(t=>e.id!==Ember.get(t,"Key")),n.meta=r,n}}).prototype,"findBySlug",[l],Object.getOwnPropertyDescriptor(i.prototype,"findBySlug"),i.prototype),o(i.prototype,"findAllBySlug",[s],Object.getOwnPropertyDescriptor(i.prototype,"findAllBySlug"),i.prototype),i) -e.default=u})),define("consul-ui/services/repository/license",["exports","consul-ui/services/repository","consul-ui/decorators/data-source"],(function(e,t,n){var r,a -function l(e,t){var n=Object.keys(e) -if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e) -t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function s(e){for(var t=1;t({meta:{version:2,uri:r,interval:3e4},body:s(o(l,{dc:n}),r=>r`${"license"}:///${e}/${t}/${n}/license/${l.License.license_id}`)}))}},c=a.prototype,d="find",m=[r],p=Object.getOwnPropertyDescriptor(a.prototype,"find"),f=a.prototype,b={},Object.keys(p).forEach((function(e){b[e]=p[e]})),b.enumerable=!!b.enumerable,b.configurable=!!b.configurable,("value"in b||b.initializer)&&(b.writable=!0),b=m.slice().reverse().reduce((function(e,t){return t(c,d,e)||e}),b),f&&void 0!==b.initializer&&(b.value=b.initializer?b.initializer.call(f):void 0,b.initializer=void 0),void 0===b.initializer&&(Object.defineProperty(c,d,b),b=null),a) -var c,d,m,p,f,b -e.default=u})),define("consul-ui/services/repository/metrics",["exports","consul-ui/services/repository","consul-ui/decorators/data-source"],(function(e,t,n){var r,a,l,s,i,o,u,c,d,m -function p(e,t,n,r){n&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(r):void 0})}function f(e,t,n,r,a){var l={} -return Object.keys(r).forEach((function(e){l[e]=r[e]})),l.enumerable=!!l.enumerable,l.configurable=!!l.configurable,("value"in l||l.initializer)&&(l.writable=!0),l=n.slice().reverse().reduce((function(n,r){return r(e,t,n)||n}),l),a&&void 0!==l.initializer&&(l.value=l.initializer?l.initializer.call(a):void 0,l.initializer=void 0),void 0===l.initializer&&(Object.defineProperty(e,t,l),l=null),l}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -let b=(r=Ember.inject.service("ui-config"),a=Ember.inject.service("env"),l=Ember.inject.service("client/http"),s=(0,n.default)("/:partition/:ns/:dc/metrics/summary-for-service/:slug/:protocol"),i=(0,n.default)("/:partition/:ns/:dc/metrics/upstream-summary-for-service/:slug/:protocol"),o=(0,n.default)("/:partition/:ns/:dc/metrics/downstream-summary-for-service/:slug/:protocol"),u=class extends t.default{constructor(...e){var t,n,r -super(...e),p(this,"config",c,this),p(this,"env",d,this),p(this,"client",m,this),r=null,(n="error")in(t=this)?Object.defineProperty(t,n,{value:r,enumerable:!0,configurable:!0,writable:!0}):t[n]=r}getModelName(){return"metrics"}init(){super.init(...arguments) -const e=this.config.getSync(),t=e.metrics_provider_options||{} -t.metrics_proxy_enabled=e.metrics_proxy_enabled -const n=e.metrics_provider||"prometheus" -t.fetch=(e,t)=>this.client.fetchWithToken("/v1/internal/ui/metrics-proxy"+e,t) -try{this.provider=window.consul.getMetricsProvider(n,t)}catch(r){this.error=new Error("metrics provider not initialized: "+r),console.error(this.error)}}findServiceSummary(e,t={}){if(this.error)return Promise.reject(this.error) -const n=[this.provider.serviceRecentSummarySeries(e.slug,e.dc,e.ns,e.protocol,{}),this.provider.serviceRecentSummaryStats(e.slug,e.dc,e.ns,e.protocol,{})] -return Promise.all(n).then(e=>({meta:{interval:this.env.var("CONSUL_METRICS_POLL_INTERVAL")||1e4},series:e[0],stats:e[1].stats}))}findUpstreamSummary(e,t={}){return this.error?Promise.reject(this.error):this.provider.upstreamRecentSummaryStats(e.slug,e.dc,e.ns,{}).then(e=>(e.meta={interval:this.env.var("CONSUL_METRICS_POLL_INTERVAL")||1e4},e))}findDownstreamSummary(e,t={}){return this.error?Promise.reject(this.error):this.provider.downstreamRecentSummaryStats(e.slug,e.dc,e.ns,{}).then(e=>(e.meta={interval:this.env.var("CONSUL_METRICS_POLL_INTERVAL")||1e4},e))}},c=f(u.prototype,"config",[r],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),d=f(u.prototype,"env",[a],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),m=f(u.prototype,"client",[l],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),f(u.prototype,"findServiceSummary",[s],Object.getOwnPropertyDescriptor(u.prototype,"findServiceSummary"),u.prototype),f(u.prototype,"findUpstreamSummary",[i],Object.getOwnPropertyDescriptor(u.prototype,"findUpstreamSummary"),u.prototype),f(u.prototype,"findDownstreamSummary",[o],Object.getOwnPropertyDescriptor(u.prototype,"findDownstreamSummary"),u.prototype),u) -e.default=b})),define("consul-ui/services/repository/node",["exports","consul-ui/services/repository","consul-ui/decorators/data-source"],(function(e,t,n){var r,a,l,s -function i(e,t,n,r,a){var l={} -return Object.keys(r).forEach((function(e){l[e]=r[e]})),l.enumerable=!!l.enumerable,l.configurable=!!l.configurable,("value"in l||l.initializer)&&(l.writable=!0),l=n.slice().reverse().reduce((function(n,r){return r(e,t,n)||n}),l),a&&void 0!==l.initializer&&(l.value=l.initializer?l.initializer.call(a):void 0,l.initializer=void 0),void 0===l.initializer&&(Object.defineProperty(e,t,l),l=null),l}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -let o=(r=(0,n.default)("/:partition/:ns/:dc/nodes"),a=(0,n.default)("/:partition/:ns/:dc/node/:id"),l=(0,n.default)("/:partition/:ns/:dc/leader"),i((s=class extends t.default{getModelName(){return"node"}async findAllByDatacenter(){return super.findAllByDatacenter(...arguments)}async findBySlug(){return super.findBySlug(...arguments)}findLeader(e,t={}){return void 0!==t.refresh&&(e.uri=t.uri),this.store.queryLeader(this.getModelName(),e)}}).prototype,"findAllByDatacenter",[r],Object.getOwnPropertyDescriptor(s.prototype,"findAllByDatacenter"),s.prototype),i(s.prototype,"findBySlug",[a],Object.getOwnPropertyDescriptor(s.prototype,"findBySlug"),s.prototype),i(s.prototype,"findLeader",[l],Object.getOwnPropertyDescriptor(s.prototype,"findLeader"),s.prototype),s) -e.default=o})),define("consul-ui/services/repository/nspace",["exports","consul-ui/services/repository","consul-ui/models/nspace","consul-ui/decorators/data-source","consul-ui/utils/form/builder"],(function(e,t,n,r,a){var l,s,i,o,u,c,d,m,p,f,b,h,v,y,g -function O(e,t,n,r){n&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(r):void 0})}function _(e,t,n,r,a){var l={} -return Object.keys(r).forEach((function(e){l[e]=r[e]})),l.enumerable=!!l.enumerable,l.configurable=!!l.configurable,("value"in l||l.initializer)&&(l.writable=!0),l=n.slice().reverse().reduce((function(n,r){return r(e,t,n)||n}),l),a&&void 0!==l.initializer&&(l.value=l.initializer?l.initializer.call(a):void 0,l.initializer=void 0),void 0===l.initializer&&(Object.defineProperty(e,t,l),l=null),l}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -let P=(l=Ember.inject.service("router"),s=Ember.inject.service("container"),i=Ember.inject.service("env"),o=Ember.inject.service("form"),u=Ember.inject.service("settings"),c=Ember.inject.service("repository/permission"),d=(0,r.default)("/:partition/:ns/:dc/namespaces"),m=(0,r.default)("/:partition/:ns/:dc/namespace/:id"),p=class extends t.default{constructor(...e){super(...e),O(this,"router",f,this),O(this,"container",b,this),O(this,"env",h,this),O(this,"form",v,this),O(this,"settings",y,this),O(this,"permissions",g,this)}getPrimaryKey(){return n.PRIMARY_KEY}getSlugKey(){return n.SLUG_KEY}getModelName(){return"nspace"}async findAll(){return this.permissions.can("use nspaces")?super.findAll(...arguments).catch(()=>[]):[]}async findBySlug(e){let t -return t=""===e.id?await this.create({Datacenter:e.dc,Partition:e.partition,ACLs:{PolicyDefaults:[],RoleDefaults:[]}}):await super.findBySlug(...arguments),(0,a.defaultChangeset)(t)}remove(e){return(0,t.softDelete)(this,e)}authorize(e,t){return this.env.var("CONSUL_ACLS_ENABLED")?this.store.authorize(this.getModelName(),{dc:e,ns:t}).catch((function(){return[]})):Promise.resolve([{Resource:"operator",Access:"write",Allow:!0}])}async getActive(e=""){if(this.permissions.can("use nspaces"))return{Name:"default"} -const t=this.store.peekAll("nspace").toArray() -if(0===e.length){e=(await this.settings.findBySlug("token")).Namespace||"default"}return 1===t.length?t[0]:function(e,t){let n=e.find((function(e){return e.Name===t.Name})) -return void 0===n&&(n=e.find((function(e){return"default"===e.Name})),void 0===n&&(n=e[0])),n}(t,{Name:e})}},f=_(p.prototype,"router",[l],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),b=_(p.prototype,"container",[s],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),h=_(p.prototype,"env",[i],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),v=_(p.prototype,"form",[o],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),y=_(p.prototype,"settings",[u],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),g=_(p.prototype,"permissions",[c],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),_(p.prototype,"findAll",[d],Object.getOwnPropertyDescriptor(p.prototype,"findAll"),p.prototype),_(p.prototype,"findBySlug",[m],Object.getOwnPropertyDescriptor(p.prototype,"findBySlug"),p.prototype),p) -e.default=P})),define("consul-ui/services/repository/oidc-provider",["exports","consul-ui/services/repository","consul-ui/decorators/data-source"],(function(e,t,n){var r,a,l,s,i,o,u,c -function d(e,t,n,r){n&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(r):void 0})}function m(e,t,n,r,a){var l={} -return Object.keys(r).forEach((function(e){l[e]=r[e]})),l.enumerable=!!l.enumerable,l.configurable=!!l.configurable,("value"in l||l.initializer)&&(l.writable=!0),l=n.slice().reverse().reduce((function(n,r){return r(e,t,n)||n}),l),a&&void 0!==l.initializer&&(l.value=l.initializer?l.initializer.call(a):void 0,l.initializer=void 0),void 0===l.initializer&&(Object.defineProperty(e,t,l),l=null),l}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -let p=(r=Ember.inject.service("torii"),a=Ember.inject.service("settings"),l=(0,n.default)("/:partition/:ns/:dc/oidc/providers"),s=(0,n.default)("/:partition/:ns/:dc/oidc/provider/:id"),i=(0,n.default)("/:partition/:ns/:dc/oidc/authorize/:id/:code/:state"),o=class extends t.default{constructor(...e){super(...e),d(this,"manager",u,this),d(this,"settings",c,this)}init(){super.init(...arguments),this.provider=Ember.getOwner(this).lookup("torii-provider:oidc-with-url")}getModelName(){return"oidc-provider"}async findAllByDatacenter(){const e=await super.findAllByDatacenter(...arguments) -if(0===e.length){const e=new Error("Not found") -return e.statusCode=404,void this.store.adapterFor(this.getModelName()).error(e)}return e}async findBySlug(e){const t=await this.settings.findBySlug("token")||{} -return super.findBySlug({ns:e.ns||t.Namespace||"default",partition:e.partition||t.Partition||"default",dc:e.dc,id:e.id})}authorize(e,t={}){return this.store.authorize(this.getModelName(),e)}logout(e,t,n,r,a,l={}){const s={id:e} -return this.store.logout(this.getModelName(),s)}close(){this.manager.close("oidc-with-url")}findCodeByURL(e){return Ember.set(this.provider,"baseUrl",e),this.manager.open("oidc-with-url",{}).catch(e=>{let t -switch(!0){case e.message.startsWith("remote was closed"):t=new Error("Remote was closed"),t.statusCode=499 -break -default:t=new Error(e.message),t.statusCode=500}this.store.adapterFor(this.getModelName()).error(t)})}},u=m(o.prototype,"manager",[r],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),c=m(o.prototype,"settings",[a],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),m(o.prototype,"findAllByDatacenter",[l],Object.getOwnPropertyDescriptor(o.prototype,"findAllByDatacenter"),o.prototype),m(o.prototype,"findBySlug",[s],Object.getOwnPropertyDescriptor(o.prototype,"findBySlug"),o.prototype),m(o.prototype,"authorize",[i],Object.getOwnPropertyDescriptor(o.prototype,"authorize"),o.prototype),o) -e.default=p})) -define("consul-ui/services/repository/partition",["exports","consul-ui/services/repository","consul-ui/models/partition","consul-ui/decorators/data-source","consul-ui/utils/form/builder"],(function(e,t,n,r,a){var l,s,i,o,u,c,d,m,p -function f(e,t,n,r){n&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(r):void 0})}function b(e,t,n,r,a){var l={} -return Object.keys(r).forEach((function(e){l[e]=r[e]})),l.enumerable=!!l.enumerable,l.configurable=!!l.configurable,("value"in l||l.initializer)&&(l.writable=!0),l=n.slice().reverse().reduce((function(n,r){return r(e,t,n)||n}),l),a&&void 0!==l.initializer&&(l.value=l.initializer?l.initializer.call(a):void 0,l.initializer=void 0),void 0===l.initializer&&(Object.defineProperty(e,t,l),l=null),l}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -let h=(l=Ember.inject.service("settings"),s=Ember.inject.service("form"),i=Ember.inject.service("repository/permission"),o=(0,r.default)("/:partition/:ns/:dc/partitions"),u=(0,r.default)("/:partition/:ns/:dc/partition/:id"),c=class extends t.default{constructor(...e){super(...e),f(this,"settings",d,this),f(this,"form",m,this),f(this,"permissions",p,this)}getModelName(){return"partition"}getPrimaryKey(){return n.PRIMARY_KEY}getSlugKey(){return n.SLUG_KEY}async findAll(){return this.permissions.can("use partitions")?super.findAll(...arguments).catch(()=>[]):[]}async findBySlug(e){let t -return t=""===e.id?await this.create({Datacenter:e.dc,Partition:""}):await super.findBySlug(...arguments),(0,a.defaultChangeset)(t)}remove(e){return(0,t.softDelete)(this,e)}async getActive(e=""){const t=this.store.peekAll("partition").toArray() -if(0===e.length){e=(await this.settings.findBySlug("token")).Partition||"default"}return 1===t.length?t[0]:function(e,t){let n=e.find((function(e){return e.Name===t.Name})) -return void 0===n&&(n=e.find((function(e){return"default"===e.Name})),void 0===n&&(n=e[0])),n}(t,{Name:e})}},d=b(c.prototype,"settings",[l],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),m=b(c.prototype,"form",[s],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),p=b(c.prototype,"permissions",[i],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),b(c.prototype,"findAll",[o],Object.getOwnPropertyDescriptor(c.prototype,"findAll"),c.prototype),b(c.prototype,"findBySlug",[u],Object.getOwnPropertyDescriptor(c.prototype,"findBySlug"),c.prototype),c) -e.default=h})),define("consul-ui/services/repository/permission",["exports","consul-ui/services/repository","consul-ui/decorators/data-source"],(function(e,t,n){var r,a,l,s,i,o,u,c -function d(e,t){var n=Object.keys(e) -if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e) -t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function m(e){for(var t=1;tt.every(t=>n[t]===e[t])&&!0===n.Allow)}can(e){return this._can.can(e)}abilityFor(e){return this._can.abilityFor(e)}generate(e,t,n){const r={Resource:e,Access:t} -return void 0!==n&&(r.Segment=n),r}async authorize(e){if(this.env.var("CONSUL_ACLS_ENABLED")){let n=[] -try{n=await this.store.authorize("permission",e)}catch(t){}return n}return e.resources.map(e=>m(m({},e),{},{Allow:!0}))}async findBySlug(e,t){let n -try{n=this._can.abilityFor(t)}catch(a){return[]}const r=n.generateForSegment(e.id.toString()) -return 0===r.length?[]:(e.resources=r,this.authorize(e))}async findByPermissions(e){return this.authorize(e)}async findAll(e){return e.resources=h,this.permissions=await this.findByPermissions(e),this.permissions.forEach(e=>{["key","node","service","intention","session"].includes(e.Resource)&&(e.Allow=!0)}),this.permissions}},o=b(i.prototype,"env",[r],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),u=b(i.prototype,"_can",[a],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),c=b(i.prototype,"permissions",[l],{configurable:!0,enumerable:!0,writable:!0,initializer:function(){return[]}}),b(i.prototype,"findAll",[s],Object.getOwnPropertyDescriptor(i.prototype,"findAll"),i.prototype),i) -e.default=v})),define("consul-ui/services/repository/policy",["exports","consul-ui/services/repository","consul-ui/models/policy","consul-ui/decorators/data-source"],(function(e,t,n,r){var a,l,s,i,o -function u(e,t,n,r,a){var l={} -return Object.keys(r).forEach((function(e){l[e]=r[e]})),l.enumerable=!!l.enumerable,l.configurable=!!l.configurable,("value"in l||l.initializer)&&(l.writable=!0),l=n.slice().reverse().reduce((function(n,r){return r(e,t,n)||n}),l),a&&void 0!==l.initializer&&(l.value=l.initializer?l.initializer.call(a):void 0,l.initializer=void 0),void 0===l.initializer&&(Object.defineProperty(e,t,l),l=null),l}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -let c=(a=Ember.inject.service("form"),l=(0,r.default)("/:partition/:ns/:dc/policies"),s=(0,r.default)("/:partition/:ns/:dc/policy/:id"),i=class extends t.default{constructor(...e){var t,n,r,a -super(...e),t=this,n="form",a=this,(r=o)&&Object.defineProperty(t,n,{enumerable:r.enumerable,configurable:r.configurable,writable:r.writable,value:r.initializer?r.initializer.call(a):void 0})}getModelName(){return"policy"}getPrimaryKey(){return n.PRIMARY_KEY}getSlugKey(){return n.SLUG_KEY}async findAllByDatacenter(){return super.findAllByDatacenter(...arguments)}async findBySlug(e){let t -return t=""===e.id?await this.create({Datacenter:e.dc,Partition:e.partition,Namespace:e.ns}):await super.findBySlug(...arguments),this.form.form(this.getModelName()).setData(t).getData()}persist(e){switch(Ember.get(e,"template")){case"":return e.save()}return Promise.resolve(e)}translate(e){return this.store.translate("policy",Ember.get(e,"Rules"))}},o=u(i.prototype,"form",[a],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),u(i.prototype,"findAllByDatacenter",[l],Object.getOwnPropertyDescriptor(i.prototype,"findAllByDatacenter"),i.prototype),u(i.prototype,"findBySlug",[s],Object.getOwnPropertyDescriptor(i.prototype,"findBySlug"),i.prototype),i) -e.default=c})),define("consul-ui/services/repository/proxy",["exports","consul-ui/services/repository","consul-ui/models/proxy","consul-ui/decorators/data-source"],(function(e,t,n,r){var a,l,s -function i(e,t,n,r,a){var l={} -return Object.keys(r).forEach((function(e){l[e]=r[e]})),l.enumerable=!!l.enumerable,l.configurable=!!l.configurable,("value"in l||l.initializer)&&(l.writable=!0),l=n.slice().reverse().reduce((function(n,r){return r(e,t,n)||n}),l),a&&void 0!==l.initializer&&(l.value=l.initializer?l.initializer.call(a):void 0,l.initializer=void 0),void 0===l.initializer&&(Object.defineProperty(e,t,l),l=null),l}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -let o=(a=(0,r.default)("/:partition/:ns/:dc/proxies/for-service/:id"),l=(0,r.default)("/:partition/:ns/:dc/proxy-instance/:serviceId/:node/:id"),i((s=class extends t.default{getModelName(){return"proxy"}getPrimaryKey(){return n.PRIMARY_KEY}findAllBySlug(e,t={}){return void 0!==t.cursor&&(e.index=t.cursor,e.uri=t.uri),this.store.query(this.getModelName(),e).then(e=>(e.forEach(e=>{const t=JSON.parse(e.uid) -t.pop(),t.push(e.ServiceProxy.DestinationServiceID) -const n=this.store.peekRecord("service-instance",JSON.stringify(t)) -n&&Ember.set(n,"ProxyInstance",e)}),e))}async findInstanceBySlug(e,t){const n=await this.findAllBySlug(e,t) -let r={} -if(Ember.get(n,"length")>0){let t=n.filterBy("ServiceProxy.DestinationServiceID",e.serviceId).findBy("NodeName",e.node) -t?r=t:(t=n.findBy("ServiceProxy.DestinationServiceName",e.id),t&&(r=t))}return Ember.set(r,"meta",Ember.get(n,"meta")),r}}).prototype,"findAllBySlug",[a],Object.getOwnPropertyDescriptor(s.prototype,"findAllBySlug"),s.prototype),i(s.prototype,"findInstanceBySlug",[l],Object.getOwnPropertyDescriptor(s.prototype,"findInstanceBySlug"),s.prototype),s) -e.default=o})),define("consul-ui/services/repository/role",["exports","consul-ui/services/repository","consul-ui/models/role","consul-ui/decorators/data-source"],(function(e,t,n,r){var a,l,s,i,o -function u(e,t,n,r,a){var l={} -return Object.keys(r).forEach((function(e){l[e]=r[e]})),l.enumerable=!!l.enumerable,l.configurable=!!l.configurable,("value"in l||l.initializer)&&(l.writable=!0),l=n.slice().reverse().reduce((function(n,r){return r(e,t,n)||n}),l),a&&void 0!==l.initializer&&(l.value=l.initializer?l.initializer.call(a):void 0,l.initializer=void 0),void 0===l.initializer&&(Object.defineProperty(e,t,l),l=null),l}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -let c=(a=Ember.inject.service("form"),l=(0,r.default)("/:partition/:ns/:dc/roles"),s=(0,r.default)("/:partition/:ns/:dc/role/:id"),i=class extends t.default{constructor(...e){var t,n,r,a -super(...e),t=this,n="form",a=this,(r=o)&&Object.defineProperty(t,n,{enumerable:r.enumerable,configurable:r.configurable,writable:r.writable,value:r.initializer?r.initializer.call(a):void 0})}getModelName(){return"role"}getPrimaryKey(){return n.PRIMARY_KEY}getSlugKey(){return n.SLUG_KEY}async findAll(){return super.findAll(...arguments)}async findBySlug(e){let t -return t=""===e.id?await this.create({Datacenter:e.dc,Partition:e.partition,Namespace:e.ns}):await super.findBySlug(...arguments),this.form.form(this.getModelName()).setData(t).getData()}},o=u(i.prototype,"form",[a],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),u(i.prototype,"findAll",[l],Object.getOwnPropertyDescriptor(i.prototype,"findAll"),i.prototype),u(i.prototype,"findBySlug",[s],Object.getOwnPropertyDescriptor(i.prototype,"findBySlug"),i.prototype),i) -e.default=c})),define("consul-ui/services/repository/service-instance",["exports","consul-ui/services/repository","consul-ui/abilities/base","consul-ui/decorators/data-source"],(function(e,t,n,r){var a,l,s -function i(e,t,n,r,a){var l={} -return Object.keys(r).forEach((function(e){l[e]=r[e]})),l.enumerable=!!l.enumerable,l.configurable=!!l.configurable,("value"in l||l.initializer)&&(l.writable=!0),l=n.slice().reverse().reduce((function(n,r){return r(e,t,n)||n}),l),a&&void 0!==l.initializer&&(l.value=l.initializer?l.initializer.call(a):void 0,l.initializer=void 0),void 0===l.initializer&&(Object.defineProperty(e,t,l),l=null),l}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -let o=(a=(0,r.default)("/:partition/:ns/:dc/service-instances/for-service/:id"),l=(0,r.default)("/:partition/:ns/:dc/service-instance/:serviceId/:node/:id"),i((s=class extends t.default{getModelName(){return"service-instance"}shouldReconcile(e,t){return super.shouldReconcile(...arguments)&&e.Service.Service===t.id}async findByService(e,t={}){return void 0!==t.cursor&&(e.index=t.cursor,e.uri=t.uri),this.authorizeBySlug(async t=>{const n=await this.query(e) -return Ember.set(n,"firstObject.Service.Resources",t),n},n.ACCESS_READ,e)}async findBySlug(e,t={}){return super.findBySlug(...arguments)}}).prototype,"findByService",[a],Object.getOwnPropertyDescriptor(s.prototype,"findByService"),s.prototype),i(s.prototype,"findBySlug",[l],Object.getOwnPropertyDescriptor(s.prototype,"findBySlug"),s.prototype),s) -e.default=o})),define("consul-ui/services/repository/service",["exports","consul-ui/services/repository","consul-ui/decorators/data-source"],(function(e,t,n){var r,a,l -function s(e,t,n,r,a){var l={} -return Object.keys(r).forEach((function(e){l[e]=r[e]})),l.enumerable=!!l.enumerable,l.configurable=!!l.configurable,("value"in l||l.initializer)&&(l.writable=!0),l=n.slice().reverse().reduce((function(n,r){return r(e,t,n)||n}),l),a&&void 0!==l.initializer&&(l.value=l.initializer?l.initializer.call(a):void 0,l.initializer=void 0),void 0===l.initializer&&(Object.defineProperty(e,t,l),l=null),l}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -let i=(r=(0,n.default)("/:partition/:ns/:dc/services"),a=(0,n.default)("/:partition/:ns/:dc/gateways/for-service/:gateway"),s((l=class extends t.default{getModelName(){return"service"}async findAllByDatacenter(){return super.findAll(...arguments)}findGatewayBySlug(e,t={}){return void 0!==t.cursor&&(e.index=t.cursor,e.uri=t.uri),this.store.query(this.getModelName(),e)}}).prototype,"findAllByDatacenter",[r],Object.getOwnPropertyDescriptor(l.prototype,"findAllByDatacenter"),l.prototype),s(l.prototype,"findGatewayBySlug",[a],Object.getOwnPropertyDescriptor(l.prototype,"findGatewayBySlug"),l.prototype),l) -e.default=i})),define("consul-ui/services/repository/session",["exports","consul-ui/services/repository","consul-ui/decorators/data-source"],(function(e,t,n){var r,a,l,s,i -function o(e,t,n,r,a){var l={} -return Object.keys(r).forEach((function(e){l[e]=r[e]})),l.enumerable=!!l.enumerable,l.configurable=!!l.configurable,("value"in l||l.initializer)&&(l.writable=!0),l=n.slice().reverse().reduce((function(n,r){return r(e,t,n)||n}),l),a&&void 0!==l.initializer&&(l.value=l.initializer?l.initializer.call(a):void 0,l.initializer=void 0),void 0===l.initializer&&(Object.defineProperty(e,t,l),l=null),l}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -let u=(r=Ember.inject.service("store"),a=(0,n.default)("/:partition/:ns/:dc/sessions/for-node/:id"),l=(0,n.default)("/:partition/:ns/:dc/sessions/for-key/:id"),s=class extends t.default{constructor(...e){var t,n,r,a -super(...e),t=this,n="store",a=this,(r=i)&&Object.defineProperty(t,n,{enumerable:r.enumerable,configurable:r.configurable,writable:r.writable,value:r.initializer?r.initializer.call(a):void 0})}getModelName(){return"session"}findByNode(e,t={}){return void 0!==t.cursor&&(e.index=t.cursor,e.uri=t.uri),this.store.query(this.getModelName(),e)}findByKey(e,t={}){return this.findBySlug(...arguments)}},i=o(s.prototype,"store",[r],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),o(s.prototype,"findByNode",[a],Object.getOwnPropertyDescriptor(s.prototype,"findByNode"),s.prototype),o(s.prototype,"findByKey",[l],Object.getOwnPropertyDescriptor(s.prototype,"findByKey"),s.prototype),s) -e.default=u})),define("consul-ui/services/repository/token",["exports","consul-ui/services/repository","consul-ui/models/token","consul-ui/decorators/data-source"],(function(e,t,n,r){var a,l,s,i,o,u,c,d -function m(e,t,n,r,a){var l={} -return Object.keys(r).forEach((function(e){l[e]=r[e]})),l.enumerable=!!l.enumerable,l.configurable=!!l.configurable,("value"in l||l.initializer)&&(l.writable=!0),l=n.slice().reverse().reduce((function(n,r){return r(e,t,n)||n}),l),a&&void 0!==l.initializer&&(l.value=l.initializer?l.initializer.call(a):void 0,l.initializer=void 0),void 0===l.initializer&&(Object.defineProperty(e,t,l),l=null),l}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -let p=(a=Ember.inject.service("form"),l=(0,r.default)("/:partition/:ns/:dc/tokens"),s=(0,r.default)("/:partition/:ns/:dc/token/:id"),i=(0,r.default)("/:partition/:ns/:dc/token/self/:secret"),o=(0,r.default)("/:partition/:ns/:dc/tokens/for-policy/:policy"),u=(0,r.default)("/:partition/:ns/:dc/tokens/for-role/:role"),c=class extends t.default{constructor(...e){var t,n,r,a -super(...e),t=this,n="form",a=this,(r=d)&&Object.defineProperty(t,n,{enumerable:r.enumerable,configurable:r.configurable,writable:r.writable,value:r.initializer?r.initializer.call(a):void 0})}getModelName(){return"token"}getPrimaryKey(){return n.PRIMARY_KEY}getSlugKey(){return n.SLUG_KEY}async findAll(){return super.findAll(...arguments)}async findBySlug(e){let t -return t=""===e.id?await this.create({Datacenter:e.dc,Partition:e.partition,Namespace:e.ns}):await super.findBySlug(...arguments),this.form.form(this.getModelName()).setData(t).getData()}self(e){return this.store.self(this.getModelName(),{secret:e.secret,dc:e.dc}).catch(e=>Promise.reject(e))}clone(e){return this.store.clone(this.getModelName(),Ember.get(e,n.PRIMARY_KEY))}findByPolicy(e){return this.findAll(...arguments)}findByRole(){return this.findAll(...arguments)}},d=m(c.prototype,"form",[a],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),m(c.prototype,"findAll",[l],Object.getOwnPropertyDescriptor(c.prototype,"findAll"),c.prototype),m(c.prototype,"findBySlug",[s],Object.getOwnPropertyDescriptor(c.prototype,"findBySlug"),c.prototype),m(c.prototype,"self",[i],Object.getOwnPropertyDescriptor(c.prototype,"self"),c.prototype),m(c.prototype,"findByPolicy",[o],Object.getOwnPropertyDescriptor(c.prototype,"findByPolicy"),c.prototype),m(c.prototype,"findByRole",[u],Object.getOwnPropertyDescriptor(c.prototype,"findByRole"),c.prototype),c) -e.default=p})),define("consul-ui/services/repository/topology",["exports","consul-ui/services/repository","consul-ui/decorators/data-source"],(function(e,t,n){var r,a,l,s -function i(e,t,n,r,a){var l={} -return Object.keys(r).forEach((function(e){l[e]=r[e]})),l.enumerable=!!l.enumerable,l.configurable=!!l.configurable,("value"in l||l.initializer)&&(l.writable=!0),l=n.slice().reverse().reduce((function(n,r){return r(e,t,n)||n}),l),a&&void 0!==l.initializer&&(l.value=l.initializer?l.initializer.call(a):void 0,l.initializer=void 0),void 0===l.initializer&&(Object.defineProperty(e,t,l),l=null),l}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -let o=(r=Ember.inject.service("repository/dc"),a=(0,n.default)("/:partition/:ns/:dc/topology/:id/:kind"),l=class extends t.default{constructor(...e){var t,n,r,a -super(...e),t=this,n="dcs",a=this,(r=s)&&Object.defineProperty(t,n,{enumerable:r.enumerable,configurable:r.configurable,writable:r.writable,value:r.initializer?r.initializer.call(a):void 0})}getModelName(){return"topology"}findBySlug(e,t={}){const n=this.dcs.peekOne(e.dc) -return null===n||Ember.get(n,"MeshEnabled")?(void 0!==t.cursor&&(e.index=t.cursor,e.uri=t.uri),this.store.queryRecord(this.getModelName(),e).catch(e=>{const t=Ember.get(e,"errors.firstObject.status"),r=(Ember.get(e,"errors.firstObject.detail")||"").trim() -switch(t){case"500":return void(null!==n&&r.endsWith("Connect must be enabled in order to use this endpoint")&&Ember.set(n,"MeshEnabled",!1)) -default:throw e}})):Promise.resolve()}},s=i(l.prototype,"dcs",[r],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),i(l.prototype,"findBySlug",[a],Object.getOwnPropertyDescriptor(l.prototype,"findBySlug"),l.prototype),l) -e.default=o})),define("consul-ui/services/resize-observer",["exports","ember-resize-observer-service/services/resize-observer"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/services/routlet",["exports","consul-ui/utils/routing/wildcard","consul-ui/router"],(function(e,t,n){var r,a,l,s,i,o,u -function c(e,t){var n=Object.keys(e) -if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e) -t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function d(e){for(var t=1;t{if("application"===e)return 1 -if("application"===t)return-1 -const n=e.split(".").length,r=t.split(".").length -switch(!0){case n>r:return-1 -case n{e=t}),e}findOutlet(e){return[...h.keys()].find(t=>-1!==e.indexOf(t))}outletFor(e){const t=[...h.keys()],n=t.indexOf(e)+1 -return h.get(t[n])}normalizeParamsFor(e,t={}){return b(e)?Object.keys(t).reduce((function(e,n){return void 0!==t[n]?e[n]=decodeURIComponent(t[n]):e[n]=t[n],e}),{}):t}paramsFor(e){let t={} -const n=h.get(e) -void 0!==n&&void 0!==n.args.params&&(t=n.args.params) -let r=this.router.currentRoute -null===r&&(r=this.container.lookup("route:application")) -let a,l=r,s=this.normalizeParamsFor(e,l.params) -for(;a=l.parent;)s=d(d({},this.normalizeParamsFor(a.name,a.params)),s),l=a -return d(d(d({},this.container.get("location:"+this.env.var("locationType")).optionalParams()),s),t)}modelFor(e){const t=h.get(e) -if(void 0!==t)return t.model}addRoute(e,t){const n=this.outletFor(e) -void 0!==n&&(n.route=t,Ember.run.schedule("afterRender",()=>{n.routeName=e}))}removeRoute(e,t){const n=this.outletFor(e) -t._model=void 0,void 0!==n&&Ember.run.schedule("afterRender",()=>{n.route=void 0})}addOutlet(e,t){h.set(e,t)}removeOutlet(e){Ember.run.schedule("afterRender",()=>{h.delete(e)})}},i=f(s.prototype,"container",[r],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),o=f(s.prototype,"env",[a],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),u=f(s.prototype,"router",[l],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),s) -e.default=v})),define("consul-ui/services/schema",["exports","consul-ui/models/intention-permission","consul-ui/models/intention-permission-http","consul-ui/models/intention-permission-http-header"],(function(e,t,n,r){function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -class l extends Ember.Service{constructor(...e){super(...e),a(this,"intention-permission",t.schema),a(this,"intention-permission-http",n.schema),a(this,"intention-permission-http-header",r.schema)}}e.default=l})),define("consul-ui/services/search",["exports","consul-ui/utils/search/exact","consul-ui/search/predicates/intention","consul-ui/search/predicates/upstream-instance","consul-ui/search/predicates/service-instance","consul-ui/search/predicates/health-check","consul-ui/search/predicates/acl","consul-ui/search/predicates/service","consul-ui/search/predicates/node","consul-ui/search/predicates/kv","consul-ui/search/predicates/token","consul-ui/search/predicates/role","consul-ui/search/predicates/policy","consul-ui/search/predicates/auth-method","consul-ui/search/predicates/nspace"],(function(e,t,n,r,a,l,s,i,o,u,c,d,m,p,f){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const b={intention:n.default,service:i.default,"service-instance":a.default,"upstream-instance":r.default,"health-check":l.default,"auth-method":p.default,node:o.default,kv:u.default,acl:s.default,token:c.default,role:d.default,policy:m.default,nspace:f.default} -class h extends Ember.Service{constructor(...e){var n,r,a -super(...e),n=this,r="searchables",a={exact:t.default},r in n?Object.defineProperty(n,r,{value:a,enumerable:!0,configurable:!0,writable:!0}):n[r]=a}predicate(e){return b[e]}}e.default=h})),define("consul-ui/services/settings",["exports","consul-ui/utils/storage/local-storage"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=e.ifNotBlocking=void 0 -const n=(0,t.default)("consul") -e.ifNotBlocking=function(e){return e.findBySlug("client").then((function(e){return void 0!==e.blocking&&!e.blocking}))} -class r extends Ember.Service{constructor(...e){var t,r,a -super(...e),a=n,(r="storage")in(t=this)?Object.defineProperty(t,r,{value:a,enumerable:!0,configurable:!0,writable:!0}):t[r]=a}findAll(e){return Promise.resolve(this.storage.all())}findBySlug(e){return Promise.resolve(this.storage.getValue(e))}persist(e){const t=this.storage -return Object.keys(e).forEach(n=>{t.setValue(n,e[n])}),Promise.resolve(e)}delete(e){Array.isArray(e)||(e=[e]) -const t=this.storage,n=e.reduce((function(e,n){return t.removeValue(n),e}),{}) -return Promise.resolve(n)}}e.default=r})),define("consul-ui/services/sort",["exports","consul-ui/sort/comparators/service","consul-ui/sort/comparators/service-instance","consul-ui/sort/comparators/upstream-instance","consul-ui/sort/comparators/kv","consul-ui/sort/comparators/health-check","consul-ui/sort/comparators/intention","consul-ui/sort/comparators/token","consul-ui/sort/comparators/role","consul-ui/sort/comparators/policy","consul-ui/sort/comparators/auth-method","consul-ui/sort/comparators/nspace","consul-ui/sort/comparators/node"],(function(e,t,n,r,a,l,s,i,o,u,c,d,m){Object.defineProperty(e,"__esModule",{value:!0}),e.default=e.properties=void 0 -const p=e=>e.reduce((e,t)=>e.concat([t+":asc",t+":desc"]),[]),f=(e=[])=>t=>{const n=p(e) -return[n.find(e=>e===t)||n[0]]} -e.properties=f -const b={properties:f,directionify:p},h={service:(0,t.default)(b),"service-instance":(0,n.default)(b),"upstream-instance":(0,r.default)(b),"health-check":(0,l.default)(b),"auth-method":(0,c.default)(b),kv:(0,a.default)(b),intention:(0,s.default)(b),token:(0,i.default)(b),role:(0,o.default)(b),policy:(0,u.default)(b),nspace:(0,d.default)(b),node:(0,m.default)(b)} -class v extends Ember.Service{comparator(e){return h[e]}}e.default=v})),define("consul-ui/services/state-with-charts",["exports","consul-ui/services/state","consul-ui/machines/validate.xstate","consul-ui/machines/boolean.xstate"],(function(e,t,n,r){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -class a extends t.default{constructor(...e){var t,a,l -super(...e),t=this,a="stateCharts",l={validate:n.default,boolean:r.default},a in t?Object.defineProperty(t,a,{value:l,enumerable:!0,configurable:!0,writable:!0}):t[a]=l}}e.default=a})),define("consul-ui/services/state",["exports","flat","@xstate/fsm"],(function(e,t,n){var r,a,l -Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -let s=(r=Ember.inject.service("logger"),a=class extends Ember.Service{constructor(...e){var t,n,r,a,s,i,o -super(...e),r={},(n="stateCharts")in(t=this)?Object.defineProperty(t,n,{value:r,enumerable:!0,configurable:!0,writable:!0}):t[n]=r,a=this,s="logger",o=this,(i=l)&&Object.defineProperty(a,s,{enumerable:i.enumerable,configurable:i.configurable,writable:i.writable,value:i.initializer?i.initializer.call(o):void 0})}log(e,t){}stateChart(e){return this.stateCharts[e]}addGuards(e,t){return this.guards(e).forEach((function([n,r]){Ember.set(e,n,(function(){return!!t.onGuard(r,...arguments)}))})),[e,t]}machine(e,t={}){return(0,n.createMachine)(...this.addGuards(e,t))}prepareChart(e){return void 0!==(e=JSON.parse(JSON.stringify(e))).on&&Object.values(e.states).forEach((function(t){void 0===t.on?t.on=e.on:Object.keys(e.on).forEach((function(n){void 0===t.on[n]&&(t.on[n]=e.on[n])}))})),e}matches(e,t){if(void 0===e)return!1 -return(Array.isArray(t)?t:[t]).some(t=>e.matches(t))}state(e){return{matches:e}}interpret(e,t){e=this.prepareChart(e) -const r=(0,n.interpret)(this.machine(e,t)) -return r.subscribe(n=>{n.changed&&(this.log(e,n),t.onTransition(n))}),r}guards(e){return Object.entries((0,t.default)(e)).filter(([e])=>e.endsWith(".cond"))}},i=a.prototype,o="logger",u=[r],c={configurable:!0,enumerable:!0,writable:!0,initializer:null},m={},Object.keys(c).forEach((function(e){m[e]=c[e]})),m.enumerable=!!m.enumerable,m.configurable=!!m.configurable,("value"in m||m.initializer)&&(m.writable=!0),m=u.slice().reverse().reduce((function(e,t){return t(i,o,e)||e}),m),d&&void 0!==m.initializer&&(m.value=m.initializer?m.initializer.call(d):void 0,m.initializer=void 0),void 0===m.initializer&&(Object.defineProperty(i,o,m),m=null),l=m,a) -var i,o,u,c,d,m -e.default=s})),define("consul-ui/services/store",["exports","@ember-data/store"],(function(e,t){var n,r,a,l,s -function i(e,t,n,r){n&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(r):void 0})}function o(e,t,n,r,a){var l={} -return Object.keys(r).forEach((function(e){l[e]=r[e]})),l.enumerable=!!l.enumerable,l.configurable=!!l.configurable,("value"in l||l.initializer)&&(l.writable=!0),l=n.slice().reverse().reduce((function(n,r){return r(e,t,n)||n}),l),a&&void 0!==l.initializer&&(l.value=l.initializer?l.initializer.call(a):void 0,l.initializer=void 0),void 0===l.initializer&&(Object.defineProperty(e,t,l),l=null),l}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -let u=(n=Ember.inject.service("data-source/service"),r=Ember.inject.service("client/http"),a=class extends t.default{constructor(...e){super(...e),i(this,"dataSource",l,this),i(this,"client",s,this)}invalidate(e=401){this.client.abort(401),this.dataSource.resetCache(),this.init()}clear(){this.invalidate(0)}clone(e,t){return this.adapterFor(e).clone(this,{modelName:e},t,this._internalModelForId(e,t).createSnapshot({}))}self(e,t){const n=this.adapterFor(e),r=this.serializerFor(e),a={modelName:e} -return n.self(this,a,t.secret,t).then(e=>r.normalizeResponse(this,a,e,t,"self"))}queryLeader(e,t){const n=this.adapterFor(e),r=this.serializerFor(e),a={modelName:e} -return n.queryLeader(this,a,null,t).then(e=>(e.meta=r.normalizeMeta(this,a,e,null,"leader"),e))}authorize(e,t={}){const n=this.adapterFor(e),r=this.serializerFor(e),a={modelName:e} -return n.authorize(this,a,null,t).then(e=>r.normalizeResponse(this,a,e,void 0,"authorize"))}logout(e,t={}){const n={modelName:e} -return this.adapterFor(e).logout(this,n,t.id,t)}},l=o(a.prototype,"dataSource",[n],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),s=o(a.prototype,"client",[r],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),a) -e.default=u})),define("consul-ui/services/temporal",["exports","pretty-ms","parse-duration","dayjs","dayjs/plugin/relativeTime"],(function(e,t,n,r,a){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0,r.default.extend(a.default) -class l extends Ember.Service{format(e,t){const n=(0,r.default)(e) -return(0,r.default)().isBefore(n)?(0,r.default)().to(n,!0):(0,r.default)().from(n,!0)}within([e,t],n){return(0,r.default)(e).isBefore((0,r.default)().add(t,"ms"))}parse(e,t){return(0,n.default)(e)}durationFrom(e,n={}){switch(!0){case"number"==typeof e:return 0===e?"0":(0,t.default)(e/1e6,{formatSubMilliseconds:!0}).split(" ").join("") -case"string"==typeof e:default:return e}}}e.default=l})),define("consul-ui/services/text-measurer",["exports","ember-text-measurer/services/text-measurer"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/services/ticker",["exports","consul-ui/utils/ticker"],(function(e,t){let n -Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -class r extends Ember.Service{init(){super.init(...arguments),this.reset()}tweenTo(e,r="",a,l){const s=r -return n.has(s)?((r=n.get(s))instanceof t.Tween&&(r=r.stop().getTarget()),n.set(s,t.Tween.to(r,e,a,l)),r):(n.set(s,e),e)}destroy(e){return this.reset(),t.Tween.destroy()}reset(){n=new Map}}e.default=r})),define("consul-ui/services/timeout",["exports","consul-ui/utils/promisedTimeout"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const n=(0,t.default)(Promise) -class r extends Ember.Service{execute(e,t){return n(e,t)}tick(){return new Promise((function(e){Ember.run.next(e)}))}}e.default=r})),define("consul-ui/services/torii-session",["exports","torii/services/torii-session"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/services/torii",["exports","torii/services/torii"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/services/ui-config",["exports","consul-ui/decorators/data-source"],(function(e,t){var n,r,a,l,s,i -function o(e,t,n,r,a){var l={} -return Object.keys(r).forEach((function(e){l[e]=r[e]})),l.enumerable=!!l.enumerable,l.configurable=!!l.configurable,("value"in l||l.initializer)&&(l.writable=!0),l=n.slice().reverse().reduce((function(n,r){return r(e,t,n)||n}),l),a&&void 0!==l.initializer&&(l.value=l.initializer?l.initializer.call(a):void 0,l.initializer=void 0),void 0===l.initializer&&(Object.defineProperty(e,t,l),l=null),l}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -let u=(n=Ember.inject.service("env"),r=(0,t.default)("/:partition/:nspace/:dc/ui-config/:path"),a=(0,t.default)("/:partition/:nspace/:dc/notfound/:path"),l=(0,t.default)("/:partition/:nspace/:dc/ui-config"),s=class extends Ember.Service{constructor(...e){var t,n,r,a -super(...e),t=this,n="env",a=this,(r=i)&&Object.defineProperty(t,n,{enumerable:r.enumerable,configurable:r.configurable,writable:r.writable,value:r.initializer?r.initializer.call(a):void 0})}async findByPath(e){return Ember.get(this.get(),e.path)}async parsePath(e){return e.path.split("/").reduce((e,t)=>{switch(!0){case t.startsWith("~"):e.nspace=t.substr(1) -break -case t.startsWith("_"):e.partition=t.substr(1) -break -case void 0===e.dc:e.dc=t}return e},{})}async get(){return this.env.var("CONSUL_UI_CONFIG")}getSync(){return this.env.var("CONSUL_UI_CONFIG")}},i=o(s.prototype,"env",[n],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),o(s.prototype,"findByPath",[r],Object.getOwnPropertyDescriptor(s.prototype,"findByPath"),s.prototype),o(s.prototype,"parsePath",[a],Object.getOwnPropertyDescriptor(s.prototype,"parsePath"),s.prototype),o(s.prototype,"get",[l],Object.getOwnPropertyDescriptor(s.prototype,"get"),s.prototype),s) -e.default=u})),define("consul-ui/sort/comparators/auth-method",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -e.default=({properties:e})=>(t="MethodName:asc")=>e(["MethodName","TokenTTL"])(t)})),define("consul-ui/sort/comparators/health-check",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -e.default=({properties:e})=>(t="Status:asc")=>t.startsWith("Status:")?function(e,n){const[,r]=t.split(":") -let a,l -"asc"===r?(a=e,l=n):(l=e,a=n) -const s=a.Status,i=l.Status -switch(s){case"passing":return"passing"===i?0:1 -case"critical":return"critical"===i?0:-1 -case"warning":switch(i){case"passing":return-1 -case"critical":return 1 -default:return 0}}return 0}:e(["Name","Kind"])(t)})),define("consul-ui/sort/comparators/intention",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -e.default=()=>e=>[e]})),define("consul-ui/sort/comparators/kv",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -e.default=({properties:e})=>t=>e(["Key","Kind"])(t)})) -define("consul-ui/sort/comparators/node",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -e.default=({properties:e})=>(t="Name:asc")=>t.startsWith("Status:")?function(e,n){const[,r]=t.split(":") -let a,l -switch("asc"===r?(l=e,a=n):(a=e,l=n),!0){case a.ChecksCritical>l.ChecksCritical:return 1 -case a.ChecksCriticall.ChecksWarning:return 1 -case a.ChecksWarningl.ChecksPassing:return-1}}return 0}}:e(["Node"])(t)})),define("consul-ui/sort/comparators/nspace",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -e.default=({properties:e})=>t=>e(["Name"])(t)})),define("consul-ui/sort/comparators/partition",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -e.default=({properties:e})=>t=>e(["Name"])(t)})),define("consul-ui/sort/comparators/policy",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -e.default=({properties:e})=>(t="Name:asc")=>e(["Name"])(t)})),define("consul-ui/sort/comparators/role",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -e.default=({properties:e})=>(t="Name:asc")=>e(["Name","CreateIndex"])(t)})),define("consul-ui/sort/comparators/service-instance",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -e.default=({properties:e})=>t=>{if(t.startsWith("Status:")){const[,e]=t.split(":"),n=["PercentageChecksPassing","PercentageChecksWarning","PercentageChecksCritical"] -return"asc"===e&&n.reverse(),function(e,t){for(let r in n){let a=n[r] -if(e[a]!==t[a])return e[a]>t[a]?-1:1}}}return e(["Name"])(t)}})),define("consul-ui/sort/comparators/service",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -e.default=({properties:e})=>(t="Status:asc")=>t.startsWith("Status:")?function(e,n){const[,r]=t.split(":") -let a,l -switch("asc"===r?(l=e,a=n):(a=e,l=n),!0){case a.MeshChecksCritical>l.MeshChecksCritical:return 1 -case a.MeshChecksCriticall.MeshChecksWarning:return 1 -case a.MeshChecksWarningl.MeshChecksPassing:return-1}}return 0}}:e(["Name"])(t)})),define("consul-ui/sort/comparators/token",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -e.default=({properties:e})=>t=>e(["CreateTime"])(t)})),define("consul-ui/sort/comparators/upstream-instance",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -e.default=({properties:e})=>(t="DestinationName:asc")=>e(["DestinationName"])(t)})),define("consul-ui/styles/base/decoration/visually-hidden.css",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -e.default=e=>e` - @keyframes visually-hidden { - 100% { - position: absolute; - overflow: hidden; - clip: rect(0 0 0 0); - width: 1px; - height: 1px; - margin: -1px; - padding: 0; - border: 0; - } - } - `})),define("consul-ui/styles/base/icons/base-keyframes.css",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -e.default=e=>e` -*::before, *::after { - display: inline-block; - animation-play-state: paused; - animation-fill-mode: forwards; - animation-iteration-count: var(--icon-resolution, 1); - vertical-align: text-top; -} -*::before { - animation-name: var(--icon-name-start, var(--icon-name)), - var(--icon-size-start, var(--icon-size, icon-000)); - background-color: var(--icon-color-start, var(--icon-color)); -} -*::after { - animation-name: var(--icon-name-end, var(--icon-name)), - var(--icon-size-end, var(--icon-size, icon-000)); - background-color: var(--icon-color-end, var(--icon-color)); -} - -[style*='--icon-color-start']::before { - color: var(--icon-color-start); -} -[style*='--icon-color-end']::after { - color: var(--icon-color-end); -} -[style*='--icon-name-start']::before, -[style*='--icon-name-end']::after { - content: ''; -} - -@keyframes icon-000 { - 100% { - width: 1.2em; - height: 1.2em; - } -} -@keyframes icon-100 { - 100% { - width: 0.625rem; /* 10px */ - height: 0.625rem; /* 10px */ - } -} -@keyframes icon-200 { - 100% { - width: 0.75rem; /* 12px */ - height: 0.75rem; /* 12px */ - } -} -@keyframes icon-300 { - 100% { - width: 1rem; /* 16px */ - height: 1rem; /* 16px */ - } -} -@keyframes icon-400 { - 100% { - width: 1.125rem; /* 18px */ - height: 1.125rem; /* 18px */ - } -} -@keyframes icon-500 { - 100% { - width: 1.250rem; /* 20px */ - height: 1.250rem; /* 20px */ - } -} -@keyframes icon-600 { - 100% { - width: 1.375rem; /* 22px */ - height: 1.375rem; /* 22px */ - } -} -@keyframes icon-700 { - 100% { - width: 1.500rem; /* 24px */ - height: 1.500rem; /* 24px */ - } -} -@keyframes icon-800 { - 100% { - width: 1.625rem; /* 26px */ - height: 1.625rem; /* 26px */ - } -} -@keyframes icon-900 { - 100% { - width: 1.750rem; /* 28px */ - height: 1.750rem; /* 28px */ - } -} -`})),define("consul-ui/templates/application",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -var t=Ember.HTMLBars.template({id:"wBErwPik",block:'{"symbols":["route","o","partition","nspace","dcs","dc","dcs","dc","consul","o","source","value","key"],"statements":[[8,"route",[],[["@name"],[[34,26]]],[["default"],[{"statements":[[2,"\\n\\n"],[8,[32,1,["Announcer"]],[],[["@title"],["Consul"]],null],[2,"\\n"],[6,[37,6],[[30,[36,19],["use acls"],null]],null,[["default"],[{"statements":[[2," "],[1,[30,[36,23],null,[["class"],["has-acls"]]]],[2,"\\n"]],"parameters":[]}]]],[6,[37,6],[[30,[36,19],["use nspaces"],null]],null,[["default"],[{"statements":[[2," "],[1,[30,[36,23],null,[["class"],["has-nspaces"]]]],[2,"\\n"]],"parameters":[]}]]],[6,[37,6],[[30,[36,19],["use partitions"],null]],null,[["default"],[{"statements":[[2," "],[1,[30,[36,23],null,[["class"],["has-partitions"]]]],[2,"\\n"]],"parameters":[]}]]],[2,"\\n"],[8,"data-source",[],[["@src","@onchange"],[[30,[36,7],["settings://consul:client"],null],[30,[36,20],["onClientChanged"],null]]],null],[2,"\\n\\n"],[8,"data-source",[],[["@src"],[[30,[36,7],["settings://consul:theme"],null]]],[["default"],[{"statements":[[2,"\\n"],[6,[37,28],[[30,[36,27],[[32,11,["data"]]],null]],null,[["default"],[{"statements":[[6,[37,6],[[30,[36,9],[[32,12],[30,[36,25],[[32,13],[30,[36,24],["color-scheme","contrast"],null]],null]],null]],null,[["default"],[{"statements":[[2," "],[1,[30,[36,23],null,[["class"],[[30,[36,22],["prefers-",[32,13],"-",[32,12]],null]]]]],[2,"\\n"]],"parameters":[]}]]]],"parameters":[12,13]}]]]],"parameters":[11]}]]],[2,"\\n\\n"],[6,[37,6],[[30,[36,19],["use acls"],null]],null,[["default"],[{"statements":[[8,"data-source",[],[["@src","@onchange"],[[30,[36,7],["settings://consul:token"],null],[30,[36,5],[[32,0],[30,[36,17],[[35,0]],null]],[["value"],["data"]]]]],null],[2,"\\n"]],"parameters":[]}]]],[2,"\\n\\n"],[6,[37,6],[[30,[36,29],[[32,1,["currentName"]],"oauth-provider-debug"],null]],null,[["default","else"],[{"statements":[[2,"\\n"],[6,[37,6],[[30,[36,18],[[32,1,["currentName"]],"index"],null]],null,[["default","else"],[{"statements":[[2,"\\n"],[2," "],[1,[30,[36,21],[[30,[36,20],["replaceWith","dc.services.index",[30,[36,1],null,[["dc"],[[30,[36,10],["CONSUL_DATACENTER_LOCAL"],null]]]]],null]],null]],[2,"\\n"]],"parameters":[]},{"statements":[[6,[37,6],[[30,[36,18],[[32,1,["currentName"]],"notfound"],null]],null,[["default"],[{"statements":[[2," "],[8,"data-source",[],[["@src","@onchange"],[[30,[36,7],["/*/*/*/notfound/${path}",[30,[36,1],null,[["path"],[[32,1,["params","notfound"]]]]]],null],[30,[36,5],[[32,0],[30,[36,17],[[35,13]],null]],[["value"],["data"]]]]],null],[2,"\\n"]],"parameters":[]}]]],[2,"\\n"],[6,[37,16],[[30,[36,6],[[30,[36,19],["use partitions"],null],[30,[36,15],[[32,1,["params","partition"]],[35,13,["partition"]],[35,0,["Partition"]],""],null],""],null],[30,[36,6],[[30,[36,19],["use nspaces"],null],[30,[36,15],[[32,1,["params","nspace"]],[35,13,["nspace"]],[35,0,["Namespace"]],""],null],""],null]],null,[["default"],[{"statements":[[2,"\\n"],[8,"data-source",[],[["@src"],[[30,[36,7],["/*/*/*/datacenters"],null]]],[["default"],[{"statements":[[2,"\\n"],[6,[37,16],[[30,[36,15],[[30,[36,6],[[35,14,["dc"]],[30,[36,12],[0,[30,[36,11],["dc",[30,[36,1],null,[["Name"],[[35,13,["dc"]]]]]],null]],null]],null],[30,[36,12],[0,[30,[36,11],["dc",[30,[36,1],null,[["Name"],[[32,1,["params","dc"]]]]]],null]],null],[30,[36,1],null,[["Name"],[[30,[36,10],["CONSUL_DATACENTER_LOCAL"],null]]]]],null],[32,5,["data"]]],null,[["default"],[{"statements":[[6,[37,6],[[30,[36,9],[[30,[36,8],[[32,6,["Name","length"]],0],null],[32,7]],null]],null,[["default"],[{"statements":[[2,"\\n"],[2," "],[8,"data-source",[],[["@src"],[[30,[36,7],["/${partition}/*/${dc}/datacenter-cache/${name}",[30,[36,1],null,[["dc","partition","name"],[[32,6,["Name"]],[32,3],[32,6,["Name"]]]]]],null]]],[["default"],[{"statements":[[2,"\\n"],[6,[37,6],[[32,8,["data"]]],null,[["default"],[{"statements":[[2," "],[8,"hashicorp-consul",[[24,1,"wrapper"]],[["@dcs","@dc","@partition","@nspace","@user","@onchange"],[[32,7],[32,8,["data"]],[32,3],[32,4],[30,[36,1],null,[["token"],[[35,0]]]],[30,[36,5],[[32,0],"reauthorize"],null]]],[["default"],[{"statements":[[2,"\\n\\n"],[6,[37,6],[[35,4]],null,[["default","else"],[{"statements":[[2," "],[8,"app-error",[],[["@error","@login"],[[34,4],[32,9,["login","open"]]]],null],[2,"\\n"]],"parameters":[]},{"statements":[[2," "],[8,"outlet",[],[["@name","@model"],["application",[30,[36,1],null,[["app","user","dc","dcs"],[[32,9],[30,[36,1],null,[["token"],[[35,0]]]],[32,8,["data"]],[32,7]]]]]],[["default"],[{"statements":[[2,"\\n "],[1,[30,[36,3],[[30,[36,2],null,null]],null]],[2,"\\n "]],"parameters":[10]}]]],[2,"\\n\\n"],[2," "],[8,"consul/loader",[[24,0,"view-loader"]],[[],[]],null],[2,"\\n"]],"parameters":[]}]]],[2,"\\n "]],"parameters":[9]}]]],[2,"\\n"]],"parameters":[]}]]],[2," "]],"parameters":[8]}]]],[2,"\\n"]],"parameters":[]}]]]],"parameters":[6,7]}]]]],"parameters":[5]}]]],[2,"\\n"]],"parameters":[3,4]}]]]],"parameters":[]}]]]],"parameters":[]},{"statements":[[2," "],[8,"outlet",[],[["@name","@model"],["application",[30,[36,1],null,[["user"],[[30,[36,1],null,[["token"],[[35,0]]]]]]]]],[["default"],[{"statements":[[2,"\\n "],[1,[30,[36,3],[[30,[36,2],null,null]],null]],[2,"\\n "]],"parameters":[2]}]]],[2,"\\n"]],"parameters":[]}]]]],"parameters":[1]}]]],[2,"\\n"]],"hasEval":false,"upvars":["token","hash","-outlet","component","error","action","if","uri","gt","and","env","cached-model","object-at","notfound","nofound","or","let","mut","eq","can","route-action","did-insert","concat","document-attrs","array","contains","routeName","-each-in","each","not-eq"]}',meta:{moduleName:"consul-ui/templates/application.hbs"}}) -e.default=t})),define("consul-ui/templates/components/basic-dropdown-content",["exports","ember-basic-dropdown/templates/components/basic-dropdown-content"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/templates/components/basic-dropdown-optional-tag",["exports","ember-basic-dropdown/templates/components/basic-dropdown-optional-tag"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/templates/components/basic-dropdown-trigger",["exports","ember-basic-dropdown/templates/components/basic-dropdown-trigger"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/templates/components/basic-dropdown",["exports","ember-basic-dropdown/templates/components/basic-dropdown"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/templates/dc",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -var t=Ember.HTMLBars.template({id:"jdt244Ym",block:'{"symbols":["route","o"],"statements":[[8,"route",[],[["@name"],[[34,0]]],[["default"],[{"statements":[[2,"\\n "],[8,"outlet",[],[["@name","@model"],[[34,0],[32,1,["model"]]]],[["default"],[{"statements":[[2,"\\n "],[1,[30,[36,2],[[30,[36,1],null,null]],null]],[2,"\\n "]],"parameters":[2]}]]],[2,"\\n"]],"parameters":[1]}]]],[2,"\\n"]],"hasEval":false,"upvars":["routeName","-outlet","component"]}',meta:{moduleName:"consul-ui/templates/dc.hbs"}}) -e.default=t})),define("consul-ui/templates/dc/acls",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -var t=Ember.HTMLBars.template({id:"ToSP5lq3",block:'{"symbols":["route","o"],"statements":[[8,"route",[],[["@name"],[[34,0]]],[["default"],[{"statements":[[2,"\\n "],[8,"outlet",[],[["@name","@model"],[[34,0],[32,1,["model"]]]],[["default"],[{"statements":[[2,"\\n "],[1,[30,[36,2],[[30,[36,1],null,null]],null]],[2,"\\n "]],"parameters":[2]}]]],[2,"\\n"]],"parameters":[1]}]]],[2,"\\n"]],"hasEval":false,"upvars":["routeName","-outlet","component"]}',meta:{moduleName:"consul-ui/templates/dc/acls.hbs"}}) -e.default=t})),define("consul-ui/templates/dc/acls/auth-methods/index",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -var t=Ember.HTMLBars.template({id:"D0g2fM3h",block:'{"symbols":["route","loader","sort","filters","items","collection"],"statements":[[8,"route",[],[["@name"],[[34,7]]],[["default"],[{"statements":[[2,"\\n\\n "],[8,"data-loader",[],[["@src"],[[30,[36,9],["/${partition}/${nspace}/${dc}/auth-methods",[30,[36,8],null,[["partition","nspace","dc"],[[32,1,["params","partition"]],[32,1,["params","nspace"]],[32,1,["params","dc"]]]]]],null]]],[["default"],[{"statements":[[2,"\\n\\n "],[8,"block-slot",[],[["@name"],["error"]],[["default"],[{"statements":[[2,"\\n"],[6,[37,4],[[30,[36,10],[[32,2,["error","status"]],"401"],null]],null,[["default","else"],[{"statements":[[2," "],[8,"consul/acl/disabled",[],[[],[]],null],[2,"\\n"]],"parameters":[]},{"statements":[[2," "],[8,"app-error",[],[["@error","@login"],[[32,2,["error"]],[32,1,["model","app","login","open"]]]],null],[2,"\\n"]],"parameters":[]}]]],[2," "]],"parameters":[]}]]],[2,"\\n\\n "],[8,"block-slot",[],[["@name"],["loaded"]],[["default"],[{"statements":[[2,"\\n"],[6,[37,19],[[30,[36,8],null,[["value","change"],[[30,[36,18],[[35,17],"MethodName:asc"],null],[30,[36,2],[[32,0],[30,[36,1],[[35,17]],null]],[["value"],["target.selected"]]]]]],[30,[36,8],null,[["kind","source","searchproperty"],[[30,[36,8],null,[["value","change"],[[30,[36,4],[[35,16],[30,[36,13],[[35,16],","],null],[29]],null],[30,[36,2],[[32,0],[30,[36,1],[[35,16]],null]],[["value"],["target.selectedItems"]]]]]],[30,[36,8],null,[["value","change"],[[30,[36,4],[[35,15],[30,[36,13],[[35,15],","],null],[29]],null],[30,[36,2],[[32,0],[30,[36,1],[[35,15]],null]],[["value"],["target.selectedItems"]]]]]],[30,[36,8],null,[["value","change","default"],[[30,[36,4],[[30,[36,14],[[35,12],[29]],null],[30,[36,13],[[35,12],","],null],[35,11]],null],[30,[36,2],[[32,0],[30,[36,1],[[35,12]],null]],[["value"],["target.selectedItems"]]],[35,11]]]]]]],[32,2,["data"]]],null,[["default"],[{"statements":[[2,"\\n\\n "],[8,"app-view",[],[["@login"],[[32,1,["model","app","login","open"]]]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["header"]],[["default"],[{"statements":[[2,"\\n "],[10,"h1"],[12],[2,"\\n "],[8,[32,1,["Title"]],[],[["@title"],["Auth Methods"]],null],[2,"\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["toolbar"]],[["default"],[{"statements":[[2,"\\n"],[6,[37,4],[[30,[36,3],[[32,5,["length"]],0],null]],null,[["default"],[{"statements":[[2," "],[8,"consul/auth-method/search-bar",[],[["@search","@onsearch","@sort","@filter"],[[34,0],[30,[36,2],[[32,0],[30,[36,1],[[35,0]],null]],[["value"],["target.value"]]],[32,3],[32,4]]],null],[2,"\\n"]],"parameters":[]}]]],[2," "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["content"]],[["default"],[{"statements":[[2,"\\n "],[8,"data-collection",[],[["@type","@sort","@filters","@search","@items"],["auth-method",[32,3,["value"]],[32,4],[34,0],[32,5]]],[["default"],[{"statements":[[2,"\\n "],[8,[32,6,["Collection"]],[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[8,"consul/auth-method/list",[],[["@items"],[[32,6,["items"]]]],null],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,[32,6,["Empty"]],[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[8,"empty-state",[],[["@login"],[[32,1,["model","app","login","open"]]]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["header"]],[["default"],[{"statements":[[2,"\\n "],[10,"h2"],[12],[2,"\\n "],[1,[30,[36,5],["routes.dc.auth-methods.index.empty.header"],[["items"],[[32,5,["length"]]]]]],[2,"\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["body"]],[["default"],[{"statements":[[2,"\\n "],[1,[30,[36,5],["routes.dc.auth-methods.index.empty.body"],[["items","htmlSafe"],[[32,5,["length"]],true]]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["actions"]],[["default"],[{"statements":[[2,"\\n "],[10,"li"],[14,0,"docs-link"],[12],[2,"\\n "],[10,"a"],[15,6,[31,[[30,[36,6],["CONSUL_DOCS_URL"],null],"/security/acl/auth-methods"]]],[14,"rel","noopener noreferrer"],[14,"target","_blank"],[12],[2,"Documentation on auth methods"],[13],[2,"\\n "],[13],[2,"\\n "],[10,"li"],[14,0,"learn-link"],[12],[2,"\\n "],[10,"a"],[15,6,[31,[[30,[36,6],["CONSUL_DOCS_API_URL"],null],"/acl/auth-methods.html"]]],[14,"rel","noopener noreferrer"],[14,"target","_blank"],[12],[2,"Read the API Docs"],[13],[2,"\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[6]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[3,4,5]}]]],[2," "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[2]}]]],[2,"\\n"]],"parameters":[1]}]]],[2,"\\n"]],"hasEval":false,"upvars":["search","mut","action","gt","if","t","env","routeName","hash","uri","eq","searchProperties","searchproperty","split","not-eq","source","kind","sortBy","or","let"]}',meta:{moduleName:"consul-ui/templates/dc/acls/auth-methods/index.hbs"}}) -e.default=t})),define("consul-ui/templates/dc/acls/auth-methods/show",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -var t=Ember.HTMLBars.template({id:"ljPKKeyW",block:'{"symbols":["route","loader","item","o"],"statements":[[8,"route",[],[["@name"],[[34,7]]],[["default"],[{"statements":[[2,"\\n "],[8,"data-loader",[],[["@src"],[[30,[36,10],["/${partition}/${nspace}/${dc}/auth-method/${name}",[30,[36,2],null,[["partition","nspace","dc","name"],[[32,1,["params","partition"]],[32,1,["params","nspace"]],[32,1,["params","dc"]],[32,1,["params","id"]]]]]],null]]],[["default"],[{"statements":[[2,"\\n\\n "],[8,"block-slot",[],[["@name"],["error"]],[["default"],[{"statements":[[2,"\\n"],[6,[37,4],[[30,[36,11],[[32,2,["error","status"]],"401"],null]],null,[["default","else"],[{"statements":[[2," "],[8,"consul/acl/disabled",[],[[],[]],null],[2,"\\n"]],"parameters":[]},{"statements":[[2," "],[8,"app-error",[],[["@error","@login"],[[32,2,["error"]],[32,1,["model","app","login","open"]]]],null],[2,"\\n"]],"parameters":[]}]]],[2," "]],"parameters":[]}]]],[2,"\\n\\n "],[8,"block-slot",[],[["@name"],["loaded"]],[["default"],[{"statements":[[2,"\\n"],[6,[37,12],[[32,2,["data"]]],null,[["default"],[{"statements":[[2," "],[8,"app-view",[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["breadcrumbs"]],[["default"],[{"statements":[[2,"\\n "],[10,"ol"],[12],[2,"\\n "],[10,"li"],[12],[10,"a"],[15,6,[30,[36,0],["dc.acls.auth-methods"],null]],[12],[2,"All Auth Methods"],[13],[13],[2,"\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["header"]],[["default"],[{"statements":[[2,"\\n "],[10,"h1"],[12],[2,"\\n "],[8,[32,1,["Title"]],[],[["@title"],[[32,3,["Name"]]]],null],[2,"\\n "],[13],[2,"\\n "],[8,"consul/auth-method/type",[],[["@item"],[[32,3]]],null],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["nav"]],[["default"],[{"statements":[[2,"\\n "],[8,"tab-nav",[],[["@items"],[[30,[36,6],[[30,[36,5],[[30,[36,2],null,[["label","href","selected"],["General info",[30,[36,0],["dc.acls.auth-methods.show.auth-method"],null],[30,[36,1],["dc.acls.auth-methods.show.auth-method"],null]]]],[30,[36,4],[[30,[36,3],["use nspaces"],null],[30,[36,2],null,[["label","href","selected"],["Namespace rules",[30,[36,0],["dc.acls.auth-methods.show.nspace-rules"],null],[30,[36,1],["dc.acls.auth-methods.show.nspace-rules"],null]]]],""],null],[30,[36,2],null,[["label","href","selected"],["Binding rules",[30,[36,0],["dc.acls.auth-methods.show.binding-rules"],null],[30,[36,1],["dc.acls.auth-methods.show.binding-rules"],null]]]]],null]],null]]],null],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["content"]],[["default"],[{"statements":[[2,"\\n "],[8,"outlet",[],[["@name","@model"],[[34,7],[30,[36,2],null,[["item"],[[32,3]]]]]],[["default"],[{"statements":[[2,"\\n "],[1,[30,[36,9],[[30,[36,8],null,null]],null]],[2,"\\n "]],"parameters":[4]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[3]}]]],[2," "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[2]}]]],[2,"\\n"]],"parameters":[1]}]]]],"hasEval":false,"upvars":["href-to","is-href","hash","can","if","array","compact","routeName","-outlet","component","uri","eq","let"]}',meta:{moduleName:"consul-ui/templates/dc/acls/auth-methods/show.hbs"}}) -e.default=t})),define("consul-ui/templates/dc/acls/auth-methods/show/auth-method",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -var t=Ember.HTMLBars.template({id:"IJCIKqTr",block:'{"symbols":["route"],"statements":[[8,"route",[],[["@name"],[[34,0]]],[["default"],[{"statements":[[2,"\\n "],[10,"div"],[14,0,"tab-section"],[12],[2,"\\n "],[8,"consul/auth-method/view",[],[["@item"],[[32,1,["model","item"]]]],null],[2,"\\n "],[13],[2,"\\n"]],"parameters":[1]}]]],[2,"\\n"]],"hasEval":false,"upvars":["routeName"]}',meta:{moduleName:"consul-ui/templates/dc/acls/auth-methods/show/auth-method.hbs"}}) -e.default=t})),define("consul-ui/templates/dc/acls/auth-methods/show/binding-rules",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -var t=Ember.HTMLBars.template({id:"TJUhzlOO",block:'{"symbols":["route","loader","items","item"],"statements":[[8,"route",[],[["@name"],[[34,6]]],[["default"],[{"statements":[[2,"\\n\\n "],[8,"data-loader",[],[["@src"],[[30,[36,8],["/${partition}/${nspace}/${dc}/binding-rules/for-auth-method/${name}",[30,[36,7],null,[["partition","nspace","dc","name"],[[32,1,["params","partition"]],[32,1,["params","nspace"]],[32,1,["params","dc"]],[32,1,["params","id"]]]]]],null]]],[["default"],[{"statements":[[2,"\\n\\n "],[8,"block-slot",[],[["@name"],["error"]],[["default"],[{"statements":[[2,"\\n "],[8,"app-error",[],[["@error","@login"],[[32,2,["error"]],[32,1,["model","app","login","open"]]]],null],[2,"\\n "]],"parameters":[]}]]],[2,"\\n\\n "],[8,"block-slot",[],[["@name"],["loaded"]],[["default"],[{"statements":[[2,"\\n"],[6,[37,9],[[32,2,["data"]]],null,[["default"],[{"statements":[[2,"\\n "],[10,"div"],[14,0,"tab-section"],[12],[2,"\\n"],[6,[37,5],[[30,[36,4],[[32,3,["length"]],0],null]],null,[["default","else"],[{"statements":[[2," "],[10,"p"],[12],[2,"\\n Binding rules allow an operator to express a systematic way of automatically linking roles and service identities to newly created tokens without operator intervention.\\n "],[13],[2,"\\n "],[10,"p"],[12],[2,"\\n Successful authentication with an auth method returns a set of trusted identity attributes corresponding to the authenticated identity. Those attributes are matched against all configured binding rules for that auth method to determine what privileges to grant the Consul ACL token it will ultimately create.\\n "],[13],[2,"\\n "],[10,"hr"],[12],[13],[2,"\\n"],[6,[37,3],[[30,[36,2],[[30,[36,2],[[32,3]],null]],null]],null,[["default"],[{"statements":[[2," "],[8,"consul/auth-method/binding-list",[],[["@item"],[[32,4]]],null],[2,"\\n "],[10,"hr"],[12],[13],[2,"\\n"]],"parameters":[4]}]]]],"parameters":[]},{"statements":[[2," "],[8,"empty-state",[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["header"]],[["default"],[{"statements":[[2,"\\n "],[10,"h2"],[12],[2,"\\n "],[1,[30,[36,0],["routes.dc.acls.auth-methods.show.binding-rules.index.empty.header"],null]],[2,"\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["body"]],[["default"],[{"statements":[[2,"\\n "],[1,[30,[36,0],["routes.dc.acls.auth-methods.show.binding-rules.index.empty.body"],[["htmlSafe"],[true]]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["actions"]],[["default"],[{"statements":[[2,"\\n "],[10,"li"],[14,0,"docs-link"],[12],[2,"\\n "],[10,"a"],[15,6,[31,[[30,[36,1],["CONSUL_DOCS_API_URL"],null],"/acl/binding-rules"]]],[14,"rel","noopener noreferrer"],[14,"target","_blank"],[12],[2,"Read the documentation"],[13],[2,"\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[]}]]],[2," "],[13],[2,"\\n"]],"parameters":[3]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[2]}]]],[2,"\\n"]],"parameters":[1]}]]],[2,"\\n"]],"hasEval":false,"upvars":["t","env","-track-array","each","gt","if","routeName","hash","uri","let"]}',meta:{moduleName:"consul-ui/templates/dc/acls/auth-methods/show/binding-rules.hbs"}}) -e.default=t})),define("consul-ui/templates/dc/acls/auth-methods/show/nspace-rules",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -var t=Ember.HTMLBars.template({id:"wKhoHeez",block:'{"symbols":["route","item"],"statements":[[8,"route",[],[["@name"],[[34,6]]],[["default"],[{"statements":[[2,"\\n"],[6,[37,7],[[32,1,["model","item"]]],null,[["default"],[{"statements":[[2," "],[10,"div"],[14,0,"tab-section"],[12],[2,"\\n"],[6,[37,5],[[30,[36,4],[[32,2,["NamespaceRules","length"]],0],null]],null,[["default","else"],[{"statements":[[2," "],[10,"p"],[12],[2,"\\n A set of rules that can control which namespace tokens created via this auth method will be created within. Unlike binding rules, the first matching namespace rule wins.\\n "],[13],[2,"\\n "],[8,"consul/auth-method/nspace-list",[],[["@items"],[[32,2,["NamespaceRules"]]]],null],[2,"\\n"]],"parameters":[]},{"statements":[[2," "],[8,"empty-state",[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["header"]],[["default"],[{"statements":[[2,"\\n "],[10,"h2"],[12],[2,"\\n "],[1,[30,[36,1],[[30,[36,0],[[32,1,["t"]],"empty.header"],null]],null]],[2,"\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["body"]],[["default"],[{"statements":[[2,"\\n "],[1,[30,[36,1],[[30,[36,0],[[32,1,["t"]],"empty.body",[30,[36,2],null,[["htmlSafe"],[true]]]],null]],null]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["actions"]],[["default"],[{"statements":[[2,"\\n "],[10,"li"],[14,0,"docs-link"],[12],[2,"\\n "],[10,"a"],[15,6,[31,[[30,[36,3],["CONSUL_DOCS_API_URL"],null],"/acl/auth-methods#namespacerules"]]],[14,"rel","noopener noreferrer"],[14,"target","_blank"],[12],[2,"Read the documentation"],[13],[2,"\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[]}]]],[2," "],[13],[2,"\\n"]],"parameters":[2]}]]]],"parameters":[1]}]]],[2,"\\n"]],"hasEval":false,"upvars":["fn","compute","hash","env","gt","if","routeName","let"]}',meta:{moduleName:"consul-ui/templates/dc/acls/auth-methods/show/nspace-rules.hbs"}}) -e.default=t})),define("consul-ui/templates/dc/acls/index",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -var t=Ember.HTMLBars.template({id:"EbSFMm5f",block:'{"symbols":["route"],"statements":[[8,"route",[],[["@name"],[[34,0]]],[["default"],[{"statements":[[2,"\\n "],[1,[30,[36,2],[[30,[36,1],["replaceWith","dc.acls.tokens"],null]],null]],[2,"\\n"]],"parameters":[1]}]]],[2,"\\n"]],"hasEval":false,"upvars":["routeName","route-action","did-insert"]}',meta:{moduleName:"consul-ui/templates/dc/acls/index.hbs"}}) -e.default=t})),define("consul-ui/templates/dc/acls/policies/-form",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -var t=Ember.HTMLBars.template({id:"Dodweqnu",block:'{"symbols":["execute","cancel","message","close","confirm"],"statements":[[10,"form"],[12],[2,"\\n "],[8,"policy-form",[],[["@form","@partition","@nspace","@item"],[[34,15],[34,12],[34,11],[34,3]]],[["default"],[{"statements":[[2,"\\n"],[2," "],[8,"block-slot",[],[["@name"],["template"]],null],[2,"\\n "]],"parameters":[]}]]],[2,"\\n"],[6,[37,5],[[30,[36,17],[[35,16]],null]],null,[["default"],[{"statements":[[2," "],[8,"data-source",[],[["@src","@onchange"],[[30,[36,13],["/${partition}/${nspace}/${dc}/tokens/for-policy/${id}",[30,[36,1],null,[["partition","nspace","dc","id"],[[35,12],[35,11],[35,10],[30,[36,8],[[35,9],""],null]]]]],null],[30,[36,0],[[32,0],[30,[36,14],[[35,2]],null]],[["value"],["data"]]]]],null],[2,"\\n"],[6,[37,5],[[30,[36,4],[[35,2,["length"]],0],null]],null,[["default"],[{"statements":[[2," "],[8,"token-list",[],[["@caption","@items"],["Applied to the following tokens:",[34,2]]],null],[2,"\\n"]],"parameters":[]}]]]],"parameters":[]}]]],[2," "],[10,"div"],[12],[2,"\\n"],[6,[37,5],[[30,[36,18],[[35,16],[30,[36,6],["create tokens"],null]],null]],null,[["default","else"],[{"statements":[[2," "],[11,"button"],[16,"disabled",[30,[36,5],[[30,[36,8],[[35,3,["isPristine"]],[35,3,["isInvalid"]],[30,[36,7],[[35,3,["Name"]],""],null]],null],"disabled"],null]],[24,4,"submit"],[4,[38,0],[[32,0],"create",[35,3]],null],[12],[2,"Save"],[13],[2,"\\n"]],"parameters":[]},{"statements":[[6,[37,5],[[30,[36,6],["write policy"],[["item"],[[35,3]]]]],null,[["default"],[{"statements":[[2," "],[11,"button"],[16,"disabled",[30,[36,5],[[35,3,["isInvalid"]],"disabled"],null]],[24,4,"submit"],[4,[38,0],[[32,0],"update",[35,3]],null],[12],[2,"Save"],[13],[2,"\\n"]],"parameters":[]}]]]],"parameters":[]}]]],[2," "],[11,"button"],[24,4,"reset"],[4,[38,0],[[32,0],"cancel",[35,3]],null],[12],[2,"Cancel"],[13],[2,"\\n"],[6,[37,5],[[30,[36,18],[[30,[36,17],[[35,16]],null],[30,[36,6],["delete policy"],[["item"],[[35,3]]]]],null]],null,[["default"],[{"statements":[[2," "],[8,"confirmation-dialog",[],[["@message"],["Are you sure you want to delete this Policy?"]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["action"]],[["default"],[{"statements":[[2,"\\n "],[11,"button"],[24,0,"type-delete"],[24,4,"button"],[4,[38,0],[[32,0],[32,5],"delete",[35,3]],null],[12],[2,"Delete"],[13],[2,"\\n "]],"parameters":[5]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["dialog"]],[["default"],[{"statements":[[2,"\\n"],[6,[37,5],[[30,[36,4],[[35,2,["length"]],0],null]],null,[["default","else"],[{"statements":[[2," "],[8,"modal-dialog",[],[["@onclose","@open","@aria"],[[30,[36,0],[[32,0],[32,2]],null],true,[30,[36,1],null,[["label"],["Policy in Use"]]]]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["header"]],[["default"],[{"statements":[[2,"\\n "],[10,"h2"],[12],[2,"Policy in Use"],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["body"]],[["default"],[{"statements":[[2,"\\n "],[10,"p"],[12],[2,"\\n This Policy is currently in use. If you choose to delete this Policy, it will be removed from the following "],[10,"strong"],[12],[1,[35,2,["length"]]],[2," Tokens"],[13],[2,":\\n "],[13],[2,"\\n "],[8,"token-list",[],[["@items","@target"],[[34,2],"_blank"]],null],[2,"\\n "],[10,"p"],[12],[2,"\\n This action cannot be undone. "],[1,[32,3]],[2,"\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["actions"]],[["default"],[{"statements":[[2,"\\n "],[11,"button"],[24,0,"type-delete"],[24,4,"button"],[4,[38,0],[[32,0],[32,1]],null],[12],[2,"Yes, Delete"],[13],[2,"\\n "],[11,"button"],[24,0,"type-cancel"],[24,4,"button"],[4,[38,0],[[32,0],[32,4]],null],[12],[2,"Cancel"],[13],[2,"\\n "]],"parameters":[4]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[]},{"statements":[[2," "],[8,"delete-confirmation",[],[["@message","@execute","@cancel"],[[32,3],[32,1],[32,2]]],null],[2,"\\n"]],"parameters":[]}]]],[2," "]],"parameters":[1,2,3]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[]}]]],[2," "],[13],[2,"\\n"],[13],[2,"\\n"]],"hasEval":false,"upvars":["action","hash","items","item","gt","if","can","eq","or","id","dc","nspace","partition","uri","mut","form","create","not","and"]}',meta:{moduleName:"consul-ui/templates/dc/acls/policies/-form.hbs"}}) -e.default=t})),define("consul-ui/templates/dc/acls/policies/edit",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -var t=Ember.HTMLBars.template({id:"HjXPxbrO",block:'{"symbols":["route","loader","dc","partition","nspace","id","item","create","loader","notice"],"statements":[[8,"route",[],[["@name"],[[34,12]]],[["default"],[{"statements":[[2,"\\n "],[8,"data-loader",[],[["@src"],[[30,[36,4],["/${partition}/${nspace}/${dc}/policy/${id}",[30,[36,3],null,[["partition","nspace","dc","id"],[[32,1,["params","partition"]],[32,1,["params","nspace"]],[32,1,["params","dc"]],[30,[36,13],[[32,1,["params","id"]],""],null]]]]],null]]],[["default"],[{"statements":[[2,"\\n\\n "],[8,"block-slot",[],[["@name"],["error"]],[["default"],[{"statements":[[2,"\\n"],[6,[37,6],[[30,[36,11],[[32,2,["error","status"]],"401"],null]],null,[["default","else"],[{"statements":[[2," "],[8,"consul/acl/disabled",[],[[],[]],null],[2,"\\n"]],"parameters":[]},{"statements":[[2," "],[8,"app-error",[],[["@error","@login"],[[32,2,["error"]],[32,1,["model","app","login","open"]]]],null],[2,"\\n"]],"parameters":[]}]]],[2," "]],"parameters":[]}]]],[2,"\\n\\n "],[8,"block-slot",[],[["@name"],["loaded"]],[["default"],[{"statements":[[2,"\\n"],[6,[37,14],[[32,1,["params","dc"]],[32,1,["params","partition"]],[32,1,["params","nspace"]],[30,[36,13],[[32,1,["params","id"]],""],null],[32,2,["data"]],[32,2,["data","isNew"]]],null,[["default"],[{"statements":[[2," "],[8,"app-view",[],[["@login"],[[32,1,["model","app","login","open"]]]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["breadcrumbs"]],[["default"],[{"statements":[[2,"\\n "],[10,"ol"],[12],[2,"\\n "],[10,"li"],[12],[10,"a"],[15,6,[30,[36,8],["dc.acls.policies"],null]],[12],[2,"All Policies"],[13],[13],[2,"\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["header"]],[["default"],[{"statements":[[2,"\\n "],[10,"h1"],[12],[2,"\\n"],[6,[37,6],[[32,8]],null,[["default","else"],[{"statements":[[2," "],[8,[32,1,["Title"]],[],[["@title"],["New Policy"]],null],[2,"\\n"]],"parameters":[]},{"statements":[[6,[37,6],[[30,[36,7],["write policy"],[["item"],[[32,7]]]]],null,[["default","else"],[{"statements":[[2," "],[8,[32,1,["Title"]],[],[["@title"],["Edit Policy"]],null],[2,"\\n"]],"parameters":[]},{"statements":[[2," "],[8,[32,1,["Title"]],[],[["@title"],["View Policy"]],null],[2,"\\n"]],"parameters":[]}]]]],"parameters":[]}]]],[2," "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["content"]],[["default"],[{"statements":[[2,"\\n"],[6,[37,6],[[30,[36,9],[[32,8]],null]],null,[["default"],[{"statements":[[2," "],[10,"div"],[14,0,"definition-table"],[12],[2,"\\n "],[10,"dl"],[12],[2,"\\n "],[10,"dt"],[12],[2,"Policy ID"],[13],[2,"\\n "],[10,"dd"],[12],[2,"\\n "],[8,"copy-button",[],[["@value","@name","@position"],[[32,7,["ID"]],"Policy ID","top-start"]],null],[2," "],[1,[32,7,["ID"]]],[2,"\\n "],[13],[2,"\\n "],[13],[2,"\\n "],[13],[2,"\\n"]],"parameters":[]}]]],[6,[37,6],[[30,[36,11],[[30,[36,10],[[32,7]],null],"policy-management"],null]],null,[["default","else"],[{"statements":[[2," "],[8,"notice",[[24,0,"policy-management"]],[["@type"],["none"]],[["default"],[{"statements":[[2,"\\n "],[8,[32,10,["Header"]],[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[10,"h3"],[12],[2,"Management"],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,[32,10,["Body"]],[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[10,"p"],[12],[2,"\\n This global-management token is built into Consul\'s policy system. You can apply this special policy to tokens for full access. This policy is not editable or removeable, but can be ignored by not applying it to any tokens. Learn more in our "],[10,"a"],[15,6,[31,[[30,[36,0],["CONSUL_DOCS_URL"],null],"/guides/acl.html#builtin-policies"]]],[14,"target","_blank"],[14,"rel","noopener noreferrer"],[12],[2,"documentation"],[13],[2,".\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[10]}]]],[2,"\\n "],[10,"div"],[14,0,"definition-table"],[12],[2,"\\n "],[10,"dl"],[12],[2,"\\n "],[10,"dt"],[12],[2,"Name"],[13],[2,"\\n "],[10,"dd"],[12],[1,[32,7,["Name"]]],[13],[2,"\\n "],[10,"dt"],[12],[2,"Valid Datacenters"],[13],[2,"\\n "],[10,"dd"],[12],[1,[30,[36,2],[", ",[30,[36,1],[[32,7]],null]],null]],[13],[2,"\\n "],[10,"dt"],[12],[2,"Description"],[13],[2,"\\n "],[10,"dd"],[12],[1,[32,7,["Description"]]],[13],[2,"\\n "],[13],[2,"\\n "],[13],[2,"\\n "],[8,"data-source",[],[["@src"],[[30,[36,4],["/${partition}/${nspace}/${dc}/tokens/for-policy/${id}",[30,[36,3],null,[["partition","nspace","dc","id"],[[32,4],[32,5],[32,3],[32,6]]]]],null]]],[["default"],[{"statements":[[2,"\\n"],[6,[37,6],[[30,[36,5],[[32,9,["data","length"]],0],null]],null,[["default"],[{"statements":[[2," "],[8,"token-list",[],[["@caption","@items"],["Applied to the following tokens:",[32,9,["data"]]]],null],[2,"\\n"]],"parameters":[]}]]],[2," "]],"parameters":[9]}]]],[2,"\\n"]],"parameters":[]},{"statements":[[2," "],[19,"dc/acls/policies/form",[1,2,3,4,5,6,7,8]],[2,"\\n"]],"parameters":[]}]]],[2," "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[3,4,5,6,7,8]}]]],[2," "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[2]}]]],[2,"\\n"]],"parameters":[1]}]]]],"hasEval":true,"upvars":["env","policy/datacenters","join","hash","uri","gt","if","can","href-to","not","policy/typeof","eq","routeName","or","let"]}',meta:{moduleName:"consul-ui/templates/dc/acls/policies/edit.hbs"}}) -e.default=t})),define("consul-ui/templates/dc/acls/policies/index",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -var t=Ember.HTMLBars.template({id:"Fqeas+Q6",block:'{"symbols":["route","loader","sort","filters","items","collection"],"statements":[[8,"route",[],[["@name"],[[34,10]]],[["default"],[{"statements":[[2,"\\n "],[8,"data-loader",[],[["@src"],[[30,[36,12],["/${partition}/${nspace}/${dc}/policies",[30,[36,11],null,[["partition","nspace","dc"],[[32,1,["params","partition"]],[32,1,["params","nspace"]],[32,1,["params","dc"]]]]]],null]]],[["default"],[{"statements":[[2,"\\n\\n "],[8,"block-slot",[],[["@name"],["error"]],[["default"],[{"statements":[[2,"\\n"],[6,[37,5],[[30,[36,13],[[32,2,["error","status"]],"401"],null]],null,[["default","else"],[{"statements":[[2," "],[8,"consul/acl/disabled",[],[[],[]],null],[2,"\\n"]],"parameters":[]},{"statements":[[2," "],[8,"app-error",[],[["@error","@login"],[[32,2,["error"]],[32,1,["model","app","login","open"]]]],null],[2,"\\n"]],"parameters":[]}]]],[2," "]],"parameters":[]}]]],[2,"\\n\\n "],[8,"block-slot",[],[["@name"],["loaded"]],[["default"],[{"statements":[[2,"\\n"],[6,[37,22],[[30,[36,11],null,[["value","change"],[[30,[36,21],[[35,20],"Name:asc"],null],[30,[36,2],[[32,0],[30,[36,1],[[35,20]],null]],[["value"],["target.selected"]]]]]],[30,[36,11],null,[["kind","datacenter","searchproperty"],[[30,[36,11],null,[["value","change"],[[30,[36,5],[[35,19],[30,[36,16],[[35,19],","],null],[29]],null],[30,[36,2],[[32,0],[30,[36,1],[[35,19]],null]],[["value"],["target.selectedItems"]]]]]],[30,[36,11],null,[["value","change"],[[30,[36,5],[[35,18],[30,[36,16],[[35,18],","],null],[29]],null],[30,[36,2],[[32,0],[30,[36,1],[[35,18]],null]],[["value"],["target.selectedItems"]]]]]],[30,[36,11],null,[["value","change","default"],[[30,[36,5],[[30,[36,17],[[35,15],[29]],null],[30,[36,16],[[35,15],","],null],[35,14]],null],[30,[36,2],[[32,0],[30,[36,1],[[35,15]],null]],[["value"],["target.selectedItems"]]],[35,14]]]]]]],[32,2,["data"]]],null,[["default"],[{"statements":[[2," "],[8,"app-view",[],[["@login"],[[32,1,["model","app","login","open"]]]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["header"]],[["default"],[{"statements":[[2,"\\n "],[10,"h1"],[12],[2,"\\n "],[8,[32,1,["Title"]],[],[["@title"],["Policies"]],null],[2,"\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["actions"]],[["default"],[{"statements":[[2,"\\n"],[6,[37,5],[[30,[36,4],["create policies"],null]],null,[["default"],[{"statements":[[2," "],[10,"a"],[15,6,[31,[[30,[36,3],["dc.acls.policies.create"],null]]]],[14,0,"type-create"],[12],[2,"Create"],[13],[2,"\\n"]],"parameters":[]}]]],[2," "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["toolbar"]],[["default"],[{"statements":[[2,"\\n"],[6,[37,5],[[30,[36,6],[[32,5,["length"]],0],null]],null,[["default"],[{"statements":[[2," "],[8,"consul/policy/search-bar",[],[["@partition","@search","@onsearch","@sort","@filter"],[[32,1,["params","partition"]],[34,0],[30,[36,2],[[32,0],[30,[36,1],[[35,0]],null]],[["value"],["target.value"]]],[32,3],[32,4]]],null],[2,"\\n"]],"parameters":[]}]]],[2," "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["content"]],[["default"],[{"statements":[[2,"\\n "],[8,"data-collection",[],[["@type","@sort","@filters","@search","@items"],["policy",[32,3,["value"]],[32,4],[34,0],[32,5]]],[["default"],[{"statements":[[2,"\\n "],[8,[32,6,["Collection"]],[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[8,"consul/policy/list",[],[["@items","@ondelete"],[[32,6,["items"]],[30,[36,7],["delete"],null]]],null],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,[32,6,["Empty"]],[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[8,"empty-state",[],[["@login"],[[32,1,["model","app","login","open"]]]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["header"]],[["default"],[{"statements":[[2,"\\n "],[10,"h2"],[12],[2,"\\n "],[1,[30,[36,8],["routes.dc.acls.policies.index.empty.header"],[["items"],[[32,5,["length"]]]]]],[2,"\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["body"]],[["default"],[{"statements":[[2,"\\n "],[1,[30,[36,8],["routes.dc.acls.policies.index.empty.body"],[["items","htmlSafe"],[[32,5,["length"]],true]]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["actions"]],[["default"],[{"statements":[[2,"\\n "],[10,"li"],[14,0,"docs-link"],[12],[2,"\\n "],[10,"a"],[15,6,[31,[[30,[36,9],["CONSUL_DOCS_URL"],null],"/commands/acl/policy"]]],[14,"rel","noopener noreferrer"],[14,"target","_blank"],[12],[2,"Documentation on policies"],[13],[2,"\\n "],[13],[2,"\\n "],[10,"li"],[14,0,"learn-link"],[12],[2,"\\n "],[10,"a"],[15,6,[31,[[30,[36,9],["CONSUL_LEARN_URL"],null],"/consul/security-networking/managing-acl-policies"]]],[14,"rel","noopener noreferrer"],[14,"target","_blank"],[12],[2,"Take the tutorial"],[13],[2,"\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[6]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n\\n"]],"parameters":[3,4,5]}]]],[2," "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[2]}]]],[2,"\\n"]],"parameters":[1]}]]]],"hasEval":false,"upvars":["search","mut","action","href-to","can","if","gt","route-action","t","env","routeName","hash","uri","eq","searchProperties","searchproperty","split","not-eq","datacenter","kind","sortBy","or","let"]}',meta:{moduleName:"consul-ui/templates/dc/acls/policies/index.hbs"}}) -e.default=t})),define("consul-ui/templates/dc/acls/roles/-form",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -var t=Ember.HTMLBars.template({id:"BgUOJM1D",block:'{"symbols":["execute","cancel","message","close","confirm","loader"],"statements":[[10,"form"],[12],[2,"\\n "],[8,"role-form",[],[["@form","@item","@dc","@nspace","@partition"],[[34,14],[34,3],[34,10],[34,11],[34,12]]],null],[2,"\\n"],[6,[37,5],[[30,[36,16],[[35,15]],null]],null,[["default"],[{"statements":[[2," "],[8,"data-source",[],[["@src"],[[30,[36,13],["/${partition}/${nspace}/${dc}/tokens/for-role/${id}",[30,[36,1],null,[["partition","nspace","dc","id"],[[35,12],[35,11],[35,10],[30,[36,8],[[35,9],""],null]]]]],null]]],[["default"],[{"statements":[[2,"\\n"],[6,[37,5],[[30,[36,4],[[32,6,["data","length"]],0],null]],null,[["default"],[{"statements":[[2," "],[10,"h2"],[12],[2,"Where is this role used?"],[13],[2,"\\n "],[10,"p"],[12],[2,"\\n We\'re only able to show information for the primary datacenter and the current datacenter. This list may not show every case where this role is applied.\\n "],[13],[2,"\\n "],[8,"token-list",[],[["@caption","@items"],["Tokens",[32,6,["data"]]]],null],[2,"\\n"]],"parameters":[]}]]],[2," "]],"parameters":[6]}]]],[2,"\\n"]],"parameters":[]}]]],[2," "],[10,"div"],[12],[2,"\\n"],[6,[37,5],[[30,[36,17],[[35,15],[30,[36,6],["create roles"],null]],null]],null,[["default","else"],[{"statements":[[2," "],[11,"button"],[16,"disabled",[30,[36,5],[[30,[36,8],[[35,3,["isPristine"]],[35,3,["isInvalid"]],[30,[36,7],[[35,3,["Name"]],""],null]],null],"disabled"],null]],[24,4,"submit"],[4,[38,0],[[32,0],"create",[35,3]],null],[12],[2,"Save"],[13],[2,"\\n"]],"parameters":[]},{"statements":[[6,[37,5],[[30,[36,6],["write role"],[["item"],[[35,3]]]]],null,[["default"],[{"statements":[[2," "],[11,"button"],[16,"disabled",[30,[36,5],[[35,3,["isInvalid"]],"disabled"],null]],[24,4,"submit"],[4,[38,0],[[32,0],"update",[35,3]],null],[12],[2,"Save"],[13],[2,"\\n"]],"parameters":[]}]]]],"parameters":[]}]]],[2," "],[11,"button"],[24,4,"reset"],[4,[38,0],[[32,0],"cancel",[35,3]],null],[12],[2,"Cancel"],[13],[2,"\\n"],[6,[37,5],[[30,[36,17],[[30,[36,16],[[35,15]],null],[30,[36,6],["delete role"],[["item"],[[35,3]]]]],null]],null,[["default"],[{"statements":[[2," "],[8,"confirmation-dialog",[],[["@message"],["Are you sure you want to delete this Role?"]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["action"]],[["default"],[{"statements":[[2,"\\n "],[11,"button"],[24,0,"type-delete"],[24,4,"button"],[4,[38,0],[[32,0],[32,5],"delete",[35,3]],null],[12],[2,"Delete"],[13],[2,"\\n "]],"parameters":[5]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["dialog"]],[["default"],[{"statements":[[2,"\\n"],[6,[37,5],[[30,[36,4],[[35,2,["length"]],0],null]],null,[["default","else"],[{"statements":[[2," "],[8,"modal-dialog",[],[["@onclose","@aria"],[[30,[36,0],[[32,0],[32,2]],null],[30,[36,1],null,[["label"],["Role in Use"]]]]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["header"]],[["default"],[{"statements":[[2,"\\n "],[10,"h2"],[12],[2,"Role in Use"],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["body"]],[["default"],[{"statements":[[2,"\\n "],[10,"p"],[12],[2,"\\n This Role is currently in use. If you choose to delete this Role, it will be removed from the following "],[10,"strong"],[12],[1,[35,2,["length"]]],[2," Tokens"],[13],[2,":\\n "],[13],[2,"\\n "],[8,"token-list",[],[["@items","@target"],[[34,2],"_blank"]],null],[2,"\\n "],[10,"p"],[12],[2,"\\n This action cannot be undone. "],[1,[32,3]],[2,"\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["actions"]],[["default"],[{"statements":[[2,"\\n "],[11,"button"],[24,0,"type-delete"],[24,4,"button"],[4,[38,0],[[32,0],[32,1]],null],[12],[2,"Yes, Delete"],[13],[2,"\\n "],[11,"button"],[24,0,"type-cancel"],[24,4,"button"],[4,[38,0],[[32,0],[32,4]],null],[12],[2,"Cancel"],[13],[2,"\\n "]],"parameters":[4]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[]},{"statements":[[2," "],[8,"delete-confirmation",[],[["@message","@execute","@cancel"],[[32,3],[32,1],[32,2]]],null],[2,"\\n"]],"parameters":[]}]]],[2," "]],"parameters":[1,2,3]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[]}]]],[2," "],[13],[2,"\\n"],[13],[2,"\\n"]],"hasEval":false,"upvars":["action","hash","items","item","gt","if","can","eq","or","id","dc","nspace","partition","uri","form","create","not","and"]}',meta:{moduleName:"consul-ui/templates/dc/acls/roles/-form.hbs"}}) -e.default=t})),define("consul-ui/templates/dc/acls/roles/edit",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -var t=Ember.HTMLBars.template({id:"O1z/UWcV",block:'{"symbols":["route","loader","dc","partition","nspace","item","create"],"statements":[[8,"route",[],[["@name"],[[34,3]]],[["default"],[{"statements":[[2,"\\n "],[8,"data-loader",[],[["@src"],[[30,[36,6],["/${partition}/${nspace}/${dc}/role/${id}",[30,[36,5],null,[["partition","nspace","dc","id"],[[32,1,["params","partition"]],[32,1,["params","nspace"]],[32,1,["params","dc"]],[30,[36,4],[[32,1,["params","id"]],""],null]]]]],null]]],[["default"],[{"statements":[[2,"\\n\\n "],[8,"block-slot",[],[["@name"],["error"]],[["default"],[{"statements":[[2,"\\n"],[6,[37,1],[[30,[36,7],[[32,2,["error","status"]],"401"],null]],null,[["default","else"],[{"statements":[[2," "],[8,"consul/acl/disabled",[],[[],[]],null],[2,"\\n"]],"parameters":[]},{"statements":[[2," "],[8,"app-error",[],[["@error","@login"],[[32,2,["error"]],[32,1,["model","app","login","open"]]]],null],[2,"\\n"]],"parameters":[]}]]],[2," "]],"parameters":[]}]]],[2,"\\n\\n "],[8,"block-slot",[],[["@name"],["loaded"]],[["default"],[{"statements":[[2,"\\n"],[6,[37,8],[[32,1,["params","dc"]],[32,1,["params","partition"]],[32,1,["params","nspace"]],[32,2,["data"]],[32,2,["data","isNew"]]],null,[["default"],[{"statements":[[2," "],[8,"app-view",[],[["@login"],[[32,1,["model","app","login","open"]]]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["breadcrumbs"]],[["default"],[{"statements":[[2,"\\n "],[10,"ol"],[12],[2,"\\n "],[10,"li"],[12],[10,"a"],[15,6,[30,[36,0],["dc.acls.roles"],null]],[12],[2,"All Roles"],[13],[13],[2,"\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["header"]],[["default"],[{"statements":[[2,"\\n "],[10,"h1"],[12],[2,"\\n"],[6,[37,1],[[32,7]],null,[["default","else"],[{"statements":[[2," "],[8,[32,1,["Title"]],[],[["@title"],["New Role"]],null],[2,"\\n"]],"parameters":[]},{"statements":[[2," "],[8,[32,1,["Title"]],[],[["@title"],["Edit Role"]],null],[2,"\\n"]],"parameters":[]}]]],[2," "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["content"]],[["default"],[{"statements":[[2,"\\n"],[6,[37,1],[[30,[36,2],[[32,7]],null]],null,[["default"],[{"statements":[[2," "],[10,"div"],[14,0,"definition-table"],[12],[2,"\\n "],[10,"dl"],[12],[2,"\\n "],[10,"dt"],[12],[2,"Role ID"],[13],[2,"\\n "],[10,"dd"],[12],[2,"\\n "],[8,"copy-button",[],[["@value","@name","@position"],[[32,6,["ID"]],"Role ID","top-start"]],null],[2," "],[1,[32,6,["ID"]]],[2,"\\n "],[13],[2,"\\n "],[13],[2,"\\n "],[13],[2,"\\n"]],"parameters":[]}]]],[2," "],[19,"dc/acls/roles/form",[1,2,3,4,5,6,7]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[3,4,5,6,7]}]]],[2," "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[2]}]]],[2,"\\n"]],"parameters":[1]}]]]],"hasEval":true,"upvars":["href-to","if","not","routeName","or","hash","uri","eq","let"]}',meta:{moduleName:"consul-ui/templates/dc/acls/roles/edit.hbs"}}) -e.default=t})),define("consul-ui/templates/dc/acls/roles/index",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -var t=Ember.HTMLBars.template({id:"8C6UqAw5",block:'{"symbols":["route","loader","sort","filters","items","collection"],"statements":[[8,"route",[],[["@name","@title"],[[34,10],"Roles"]],[["default"],[{"statements":[[2,"\\n "],[8,"data-loader",[],[["@src"],[[30,[36,12],["/${partition}/${nspace}/${dc}/roles",[30,[36,11],null,[["partition","nspace","dc"],[[32,1,["params","partition"]],[32,1,["params","nspace"]],[32,1,["params","dc"]]]]]],null]]],[["default"],[{"statements":[[2,"\\n\\n "],[8,"block-slot",[],[["@name"],["error"]],[["default"],[{"statements":[[2,"\\n"],[6,[37,5],[[30,[36,13],[[32,2,["error","status"]],"401"],null]],null,[["default","else"],[{"statements":[[2," "],[8,"consul/acl/disabled",[],[[],[]],null],[2,"\\n"]],"parameters":[]},{"statements":[[2," "],[8,"app-error",[],[["@error","@login"],[[32,2,["error"]],[32,1,["model","app","login","open"]]]],null],[2,"\\n"]],"parameters":[]}]]],[2," "]],"parameters":[]}]]],[2,"\\n\\n "],[8,"block-slot",[],[["@name"],["loaded"]],[["default"],[{"statements":[[2,"\\n"],[6,[37,20],[[30,[36,11],null,[["value","change"],[[30,[36,19],[[35,18],"Name:asc"],null],[30,[36,2],[[32,0],[30,[36,1],[[35,18]],null]],[["value"],["target.selected"]]]]]],[30,[36,11],null,[["searchproperty"],[[30,[36,11],null,[["value","change","default"],[[30,[36,5],[[30,[36,17],[[35,15],[29]],null],[30,[36,16],[[35,15],","],null],[35,14]],null],[30,[36,2],[[32,0],[30,[36,1],[[35,15]],null]],[["value"],["target.selectedItems"]]],[35,14]]]]]]],[32,2,["data"]]],null,[["default"],[{"statements":[[2,"\\n "],[8,"app-view",[],[["@login"],[[32,1,["model","app","login","open"]]]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["header"]],[["default"],[{"statements":[[2,"\\n "],[10,"h1"],[12],[2,"\\n "],[8,[32,1,["Title"]],[],[["@title"],["Roles"]],null],[2,"\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["actions"]],[["default"],[{"statements":[[2,"\\n"],[6,[37,5],[[30,[36,4],["create roles"],null]],null,[["default"],[{"statements":[[2," "],[10,"a"],[15,6,[31,[[30,[36,3],["dc.acls.roles.create"],null]]]],[14,0,"type-create"],[12],[2,"Create"],[13],[2,"\\n"]],"parameters":[]}]]],[2," "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["toolbar"]],[["default"],[{"statements":[[2,"\\n"],[6,[37,5],[[30,[36,6],[[32,5,["length"]],0],null]],null,[["default"],[{"statements":[[2," "],[8,"consul/role/search-bar",[],[["@search","@onsearch","@sort","@filter"],[[34,0],[30,[36,2],[[32,0],[30,[36,1],[[35,0]],null]],[["value"],["target.value"]]],[32,3],[32,4]]],null],[2,"\\n"]],"parameters":[]}]]],[2," "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["content"]],[["default"],[{"statements":[[2,"\\n "],[8,"data-collection",[],[["@type","@sort","@filters","@search","@items"],["role",[32,3,["value"]],[32,4],[34,0],[32,5]]],[["default"],[{"statements":[[2,"\\n "],[8,[32,6,["Collection"]],[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[8,"consul/role/list",[],[["@items","@ondelete"],[[32,6,["items"]],[30,[36,7],["delete"],null]]],null],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,[32,6,["Empty"]],[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[8,"empty-state",[],[["@login"],[[32,1,["model","app","login","open"]]]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["header"]],[["default"],[{"statements":[[2,"\\n "],[10,"h2"],[12],[2,"\\n "],[1,[30,[36,8],["routes.dc.acls.roles.index.empty.header"],[["items"],[[32,5,["length"]]]]]],[2,"\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["body"]],[["default"],[{"statements":[[2,"\\n "],[1,[30,[36,8],["routes.dc.acls.roles.index.empty.body"],[["items","htmlSafe"],[[32,5,["length"]],true]]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["actions"]],[["default"],[{"statements":[[2,"\\n "],[10,"li"],[14,0,"docs-link"],[12],[2,"\\n "],[10,"a"],[15,6,[31,[[30,[36,9],["CONSUL_DOCS_URL"],null],"/commands/acl/role"]]],[14,"rel","noopener noreferrer"],[14,"target","_blank"],[12],[2,"Documentation on roles"],[13],[2,"\\n "],[13],[2,"\\n "],[10,"li"],[14,0,"learn-link"],[12],[2,"\\n "],[10,"a"],[15,6,[31,[[30,[36,9],["CONSUL_DOCS_API_URL"],null],"/acl/roles.html"]]],[14,"rel","noopener noreferrer"],[14,"target","_blank"],[12],[2,"Read the API Docs"],[13],[2,"\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[6]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[3,4,5]}]]],[2," "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[2]}]]],[2,"\\n"]],"parameters":[1]}]]]],"hasEval":false,"upvars":["search","mut","action","href-to","can","if","gt","route-action","t","env","routeName","hash","uri","eq","searchProperties","searchproperty","split","not-eq","sortBy","or","let"]}',meta:{moduleName:"consul-ui/templates/dc/acls/roles/index.hbs"}}) -e.default=t})) -define("consul-ui/templates/dc/acls/tokens/-fieldsets-legacy",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -var t=Ember.HTMLBars.template({id:"IUa7dEzO",block:'{"symbols":["__arg0","type"],"statements":[[2," "],[10,"fieldset"],[15,"disabled",[30,[36,4],[[30,[36,10],[[30,[36,9],["write token"],[["item"],[[35,0]]]]],null],"disabled"],null]],[12],[2,"\\n "],[10,"label"],[15,0,[31,["type-text",[30,[36,4],[[35,0,["error","Name"]]," has-error"],null]]]],[12],[2,"\\n "],[10,"span"],[12],[2,"Name"],[13],[2,"\\n "],[8,"input",[],[["@value","@name","@autofocus"],[[34,0,["Description"]],"name","autofocus"]],null],[2,"\\n "],[13],[2,"\\n"],[6,[37,4],[false],null,[["default"],[{"statements":[[2," "],[10,"div"],[14,"role","radiogroup"],[15,0,[30,[36,4],[[35,0,["error","Type"]]," has-error"],null]],[12],[2,"\\n"],[6,[37,8],[[30,[36,7],[[30,[36,7],[[30,[36,6],["management","client"],null]],null]],null]],null,[["default"],[{"statements":[[2," "],[10,"label"],[12],[2,"\\n "],[10,"span"],[12],[1,[30,[36,2],[[32,2]],null]],[13],[2,"\\n "],[10,"input"],[14,3,"Type"],[15,2,[31,[[32,2]]]],[15,"checked",[30,[36,4],[[30,[36,3],[[35,0,["Type"]],[32,2]],null],"checked"],null]],[15,"onchange",[30,[36,5],[[32,0],"change"],null]],[14,4,"radio"],[12],[13],[2,"\\n "],[13],[2,"\\n"]],"parameters":[2]}]]],[2," "],[13],[2,"\\n"]],"parameters":[]}]]],[2," "],[10,"label"],[14,0,"type-text"],[12],[2,"\\n "],[8,"code-editor",[],[["@class","@name","@syntax","@value","@onkeyup","@namedBlocksInfo"],[[30,[36,4],[[35,0,["error","Rules"]],"error"],null],"Rules","hcl",[34,0,["Rules"]],[30,[36,5],[[32,0],"change","Rules"],null],[30,[36,11],null,[["label"],[0]]]]],[["default"],[{"statements":[[6,[37,4],[[30,[36,12],[[32,1],"label"],null]],null,[["default"],[{"statements":[[2,"\\n Rules "],[10,"a"],[15,6,[31,[[30,[36,1],["CONSUL_DOCS_URL"],null],"/guides/acl.html#rule-specification"]]],[14,"rel","help noopener noreferrer"],[14,"target","_blank"],[12],[2,"(HCL Format)"],[13],[2,"\\n "]],"parameters":[]}]]]],"parameters":[1]}]]],[2,"\\n "],[13],[2,"\\n"],[6,[37,4],[[35,13]],null,[["default"],[{"statements":[[2," "],[10,"label"],[14,0,"type-text"],[12],[2,"\\n "],[10,"span"],[12],[2,"ID"],[13],[2,"\\n "],[8,"input",[],[["@value"],[[34,0,["ID"]]]],null],[2,"\\n "],[10,"em"],[12],[2,"We\'ll generate a UUID if this field is left empty."],[13],[2,"\\n "],[13],[2,"\\n"]],"parameters":[]}]]],[2," "],[13],[2,"\\n\\n"]],"hasEval":false,"upvars":["item","env","capitalize","eq","if","action","array","-track-array","each","can","not","hash","-is-named-block-invocation","create"]}',meta:{moduleName:"consul-ui/templates/dc/acls/tokens/-fieldsets-legacy.hbs"}}) -e.default=t})),define("consul-ui/templates/dc/acls/tokens/-fieldsets",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -var t=Ember.HTMLBars.template({id:"pIlDyS1J",block:'{"symbols":[],"statements":[[10,"fieldset"],[15,"disabled",[30,[36,1],[[30,[36,5],[[30,[36,4],["write token"],[["item"],[[35,3]]]]],null],"disabled"],null]],[12],[2,"\\n"],[6,[37,1],[[35,6]],null,[["default"],[{"statements":[[2," "],[10,"div"],[14,0,"type-toggle"],[12],[2,"\\n "],[10,"label"],[12],[2,"\\n "],[10,"input"],[14,3,"Local"],[15,"checked",[30,[36,1],[[35,0],"checked"],null]],[15,"onchange",[30,[36,2],[[32,0],"change"],null]],[14,4,"checkbox"],[12],[13],[2,"\\n "],[10,"span"],[12],[2,"Restrict this token to a local datacenter?"],[13],[2,"\\n "],[13],[2,"\\n "],[10,"em"],[12],[2,"Local tokens get set in the Raft store of the local DC and do not ever get transmitted to the primary DC or replicated to any other DC."],[13],[2,"\\n "],[13],[2,"\\n"]],"parameters":[]}]]],[2," "],[10,"label"],[14,0,"type-text validate-optional"],[12],[2,"\\n "],[10,"span"],[12],[2,"Description (Optional)"],[13],[2,"\\n "],[10,"textarea"],[14,3,"Description"],[15,"oninput",[30,[36,2],[[32,0],"change"],null]],[12],[1,[35,3,["Description"]]],[13],[2,"\\n "],[13],[2,"\\n"],[13],[2,"\\n"],[10,"fieldset"],[14,1,"roles"],[12],[2,"\\n "],[10,"h2"],[12],[2,"Roles"],[13],[2,"\\n "],[8,"role-selector",[],[["@disabled","@dc","@partition","@nspace","@items"],[[30,[36,5],[[30,[36,4],["write token"],[["item"],[[35,3]]]]],null],[34,7],[34,8],[34,9],[34,3,["Roles"]]]],null],[2,"\\n"],[13],[2,"\\n"],[10,"fieldset"],[14,1,"policies"],[12],[2,"\\n "],[10,"h2"],[12],[2,"Policies"],[13],[2,"\\n "],[8,"policy-selector",[],[["@disabled","@dc","@partition","@nspace","@items"],[[30,[36,5],[[30,[36,4],["write token"],[["item"],[[35,3]]]]],null],[34,7],[34,8],[34,9],[34,3,["Policies"]]]],null],[2,"\\n"],[13],[2,"\\n"]],"hasEval":false,"upvars":["Local","if","action","item","can","not","create","dc","partition","nspace"]}',meta:{moduleName:"consul-ui/templates/dc/acls/tokens/-fieldsets.hbs"}}) -e.default=t})),define("consul-ui/templates/dc/acls/tokens/-form",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -var t=Ember.HTMLBars.template({id:"vq0ZKeUV",block:'{"symbols":["execute","cancel","message","confirm"],"statements":[[10,"form"],[12],[2,"\\n"],[6,[37,2],[[30,[36,7],[[30,[36,4],[[35,0]],null]],null]],null,[["default","else"],[{"statements":[[2," "],[19,"dc/acls/tokens/fieldsets",[]],[2,"\\n"]],"parameters":[]},{"statements":[[2," "],[19,"dc/acls/tokens/fieldsets-legacy",[]],[2,"\\n"]],"parameters":[]}]]],[2," "],[10,"div"],[12],[2,"\\n"],[6,[37,2],[[30,[36,5],[[35,8],[30,[36,3],["create tokens"],null]],null]],null,[["default","else"],[{"statements":[[2," "],[11,"button"],[16,"disabled",[30,[36,2],[[30,[36,6],[[30,[36,5],[[30,[36,4],[[35,0]],null],[35,0,["isPristine"]]],null],[35,0,["isInvalid"]]],null],"disabled"],null]],[24,4,"submit"],[4,[38,1],[[32,0],"create",[35,0]],null],[12],[2,"Save"],[13],[2,"\\n"]],"parameters":[]},{"statements":[[6,[37,2],[[30,[36,3],["write token"],[["item"],[[35,0]]]]],null,[["default"],[{"statements":[[2," "],[11,"button"],[16,"disabled",[30,[36,2],[[35,0,["isInvalid"]],"disabled"],null]],[24,4,"submit"],[4,[38,1],[[32,0],"update",[35,0]],null],[12],[2,"Save"],[13],[2,"\\n"]],"parameters":[]}]]]],"parameters":[]}]]],[2,"\\n "],[11,"button"],[24,4,"reset"],[4,[38,1],[[32,0],"cancel",[35,0]],null],[12],[2,"Cancel"],[13],[2,"\\n"],[6,[37,2],[[30,[36,5],[[30,[36,7],[[35,8]],null],[30,[36,3],["delete token"],[["item","token"],[[35,0],[35,9]]]]],null]],null,[["default"],[{"statements":[[2," "],[8,"confirmation-dialog",[],[["@message"],["Are you sure you want to delete this Token?"]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["action"]],[["default"],[{"statements":[[2,"\\n "],[11,"button"],[24,0,"type-delete"],[24,4,"button"],[4,[38,1],[[32,0],[32,4],"delete",[35,0]],null],[12],[2,"Delete"],[13],[2,"\\n "]],"parameters":[4]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["dialog"]],[["default"],[{"statements":[[2,"\\n "],[8,"delete-confirmation",[],[["@message","@execute","@cancel"],[[32,3],[32,1],[32,2]]],null],[2,"\\n "]],"parameters":[1,2,3]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[]}]]],[2," "],[13],[2,"\\n"],[13],[2,"\\n"]],"hasEval":true,"upvars":["item","action","if","can","token/is-legacy","and","or","not","create","token"]}',meta:{moduleName:"consul-ui/templates/dc/acls/tokens/-form.hbs"}}) -e.default=t})),define("consul-ui/templates/dc/acls/tokens/edit",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -var t=Ember.HTMLBars.template({id:"jGx0lf6+",block:'{"symbols":["route","loader","dc","partition","nspace","item","create","notice","execute","cancel","message","confirm"],"statements":[[8,"route",[],[["@name"],[[34,10]]],[["default"],[{"statements":[[2,"\\n "],[8,"data-loader",[],[["@src"],[[30,[36,13],["/${partition}/${nspace}/${dc}/token/${id}",[30,[36,12],null,[["partition","nspace","dc","id"],[[32,1,["params","partition"]],[32,1,["params","nspace"]],[32,1,["params","dc"]],[30,[36,11],[[32,1,["params","id"]],""],null]]]]],null]]],[["default"],[{"statements":[[2,"\\n\\n "],[8,"block-slot",[],[["@name"],["error"]],[["default"],[{"statements":[[2,"\\n"],[6,[37,0],[[30,[36,14],[[32,2,["error","status"]],"401"],null]],null,[["default","else"],[{"statements":[[2," "],[8,"consul/acl/disabled",[],[[],[]],null],[2,"\\n"]],"parameters":[]},{"statements":[[2," "],[8,"app-error",[],[["@error","@login"],[[32,2,["error"]],[32,1,["model","app","login","open"]]]],null],[2,"\\n"]],"parameters":[]}]]],[2," "]],"parameters":[]}]]],[2,"\\n\\n "],[8,"block-slot",[],[["@name"],["loaded"]],[["default"],[{"statements":[[2,"\\n"],[6,[37,15],[[32,1,["params","dc"]],[32,1,["params","partition"]],[32,1,["params","nspace"]],[32,2,["data"]],[32,2,["data","isNew"]]],null,[["default"],[{"statements":[[2," "],[8,"app-view",[],[["@login"],[[32,1,["model","app","login","open"]]]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["breadcrumbs"]],[["default"],[{"statements":[[2,"\\n "],[10,"ol"],[12],[2,"\\n "],[10,"li"],[12],[10,"a"],[15,6,[30,[36,9],["dc.acls.tokens"],null]],[12],[2,"All Tokens"],[13],[13],[2,"\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["header"]],[["default"],[{"statements":[[2,"\\n "],[10,"h1"],[12],[2,"\\n"],[6,[37,0],[[32,7]],null,[["default","else"],[{"statements":[[2," "],[8,[32,1,["Title"]],[],[["@title"],["New Token"]],null],[2,"\\n"]],"parameters":[]},{"statements":[[2," "],[8,[32,1,["Title"]],[],[["@title"],["Edit Token"]],null],[2,"\\n"]],"parameters":[]}]]],[2," "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["actions"]],[["default"],[{"statements":[[2,"\\n"],[6,[37,0],[[30,[36,1],[[32,7]],null]],null,[["default"],[{"statements":[[6,[37,0],[[30,[36,7],[[32,6,["AccessorID"]],[35,6,["AccessorID"]]],null]],null,[["default"],[{"statements":[[2," "],[8,"confirmation-dialog",[],[["@message"],["Are you sure you want to use this ACL token?"]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["action"]],[["default"],[{"statements":[[2,"\\n "],[11,"button"],[24,4,"button"],[4,[38,5],[[32,0],[32,12],"use",[32,6]],null],[12],[2,"Use"],[13],[2,"\\n "]],"parameters":[12]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["dialog"]],[["default"],[{"statements":[[2,"\\n "],[10,"p"],[12],[2,"\\n "],[1,[32,11]],[2,"\\n "],[13],[2,"\\n "],[11,"button"],[24,0,"type-delete"],[24,4,"button"],[4,[38,5],[[32,0],[32,9]],null],[12],[2,"Confirm Use"],[13],[2,"\\n "],[11,"button"],[24,0,"type-cancel"],[24,4,"button"],[4,[38,5],[[32,0],[32,10]],null],[12],[2,"Cancel"],[13],[2,"\\n "]],"parameters":[9,10,11]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[]}]]],[6,[37,0],[[30,[36,8],["duplicate token"],[["item"],[[32,6]]]]],null,[["default"],[{"statements":[[2," "],[11,"button"],[24,4,"button"],[4,[38,5],[[32,0],"clone",[32,6]],null],[12],[2,"Duplicate"],[13],[2,"\\n"]],"parameters":[]}]]]],"parameters":[]}]]],[2," "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["content"]],[["default"],[{"statements":[[2,"\\n"],[6,[37,0],[[30,[36,2],[[32,6]],null]],null,[["default"],[{"statements":[[2," "],[8,"notice",[],[["@type"],["info"]],[["default"],[{"statements":[[2,"\\n "],[8,[32,8,["Header"]],[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[10,"h2"],[12],[2,"Update"],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,[32,8,["Body"]],[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[10,"p"],[12],[2,"\\n We have upgraded our ACL system by allowing you to create reusable policies which you can then apply to tokens. Don\'t worry, even though this token was written in the old style, it is still valid. However, we do recommend upgrading your old tokens to the new style. Learn how in our "],[10,"a"],[15,6,[31,[[30,[36,4],["CONSUL_DOCS_URL"],null],"/guides/acl-migrate-tokens.html"]]],[14,"target","_blank"],[14,"rel","noopener noreferrer"],[12],[2,"documentation"],[13],[2,".\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[8]}]]],[2,"\\n"]],"parameters":[]}]]],[6,[37,0],[[30,[36,1],[[32,7]],null]],null,[["default"],[{"statements":[[2," "],[10,"div"],[14,0,"definition-table"],[12],[2,"\\n "],[10,"dl"],[12],[2,"\\n "],[10,"dt"],[12],[2,"AccessorID"],[13],[2,"\\n "],[10,"dd"],[12],[2,"\\n "],[8,"copy-button",[],[["@value","@name","@position"],[[32,6,["AccessorID"]],"AccessorID","top-start"]],null],[2," "],[1,[32,6,["AccessorID"]]],[2,"\\n "],[13],[2,"\\n "],[10,"dt"],[12],[2,"Token"],[13],[2,"\\n "],[10,"dd"],[12],[2,"\\n "],[8,"copy-button",[],[["@value","@name","@position"],[[32,6,["SecretID"]],"Token","top-start"]],null],[2," "],[8,"secret-button",[],[[],[]],[["default"],[{"statements":[[1,[32,6,["SecretID"]]]],"parameters":[]}]]],[2,"\\n "],[13],[2,"\\n"],[6,[37,0],[[30,[36,3],[[30,[36,1],[[30,[36,2],[[32,6]],null]],null],[30,[36,1],[[32,7]],null]],null]],null,[["default"],[{"statements":[[2," "],[10,"dt"],[12],[2,"Scope"],[13],[2,"\\n "],[10,"dd"],[12],[2,"\\n "],[1,[30,[36,0],[[32,6,["Local"]],"local","global"],null]],[2,"\\n "],[13],[2,"\\n"]],"parameters":[]}]]],[2," "],[13],[2,"\\n "],[13],[2,"\\n"]],"parameters":[]}]]],[2," "],[19,"dc/acls/tokens/form",[1,2,3,4,5,6,7]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[3,4,5,6,7]}]]],[2," "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[2]}]]],[2,"\\n"]],"parameters":[1]}]]]],"hasEval":true,"upvars":["if","not","token/is-legacy","and","env","action","token","not-eq","can","href-to","routeName","or","hash","uri","eq","let"]}',meta:{moduleName:"consul-ui/templates/dc/acls/tokens/edit.hbs"}}) -e.default=t})),define("consul-ui/templates/dc/acls/tokens/index",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -var t=Ember.HTMLBars.template({id:"ghj4WLgF",block:'{"symbols":["route","loader","sort","filters","items","collection","notice"],"statements":[[8,"route",[],[["@name"],[[34,11]]],[["default"],[{"statements":[[2,"\\n "],[8,"data-loader",[],[["@src"],[[30,[36,13],["/${partition}/${nspace}/${dc}/tokens",[30,[36,12],null,[["partition","nspace","dc"],[[32,1,["params","partition"]],[32,1,["params","nspace"]],[32,1,["params","dc"]]]]]],null]]],[["default"],[{"statements":[[2,"\\n\\n "],[8,"block-slot",[],[["@name"],["error"]],[["default"],[{"statements":[[2,"\\n"],[6,[37,6],[[30,[36,14],[[32,2,["error","status"]],"401"],null]],null,[["default","else"],[{"statements":[[2," "],[8,"consul/acl/disabled",[],[[],[]],null],[2,"\\n"]],"parameters":[]},{"statements":[[2," "],[8,"app-error",[],[["@error","@login"],[[32,2,["error"]],[32,1,["model","app","login","open"]]]],null],[2,"\\n"]],"parameters":[]}]]],[2," "]],"parameters":[]}]]],[2,"\\n\\n "],[8,"block-slot",[],[["@name"],["loaded"]],[["default"],[{"statements":[[2,"\\n"],[6,[37,22],[[30,[36,12],null,[["value","change"],[[30,[36,21],[[35,20],"CreateTime:desc"],null],[30,[36,3],[[32,0],[30,[36,2],[[35,20]],null]],[["value"],["target.selected"]]]]]],[30,[36,12],null,[["kind","searchproperty"],[[30,[36,12],null,[["value","change"],[[30,[36,6],[[35,19],[30,[36,17],[[35,19],","],null],[29]],null],[30,[36,3],[[32,0],[30,[36,2],[[35,19]],null]],[["value"],["target.selectedItems"]]]]]],[30,[36,12],null,[["value","change","default"],[[30,[36,6],[[30,[36,18],[[35,16],[29]],null],[30,[36,17],[[35,16],","],null],[35,15]],null],[30,[36,3],[[32,0],[30,[36,2],[[35,16]],null]],[["value"],["target.selectedItems"]]],[35,15]]]]]]],[32,2,["data"]]],null,[["default"],[{"statements":[[2,"\\n "],[8,"app-view",[],[["@login"],[[32,1,["model","app","login","open"]]]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["header"]],[["default"],[{"statements":[[2,"\\n "],[10,"h1"],[12],[2,"\\n "],[8,[32,1,["Title"]],[],[["@title"],["Tokens"]],null],[2,"\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["actions"]],[["default"],[{"statements":[[2,"\\n"],[6,[37,6],[[30,[36,5],["create tokens"],null]],null,[["default"],[{"statements":[[2," "],[10,"a"],[15,6,[31,[[30,[36,4],["dc.acls.tokens.create"],null]]]],[14,0,"type-create"],[12],[2,"Create"],[13],[2,"\\n"]],"parameters":[]}]]],[2," "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["toolbar"]],[["default"],[{"statements":[[2,"\\n"],[6,[37,6],[[30,[36,7],[[32,5,["length"]],0],null]],null,[["default"],[{"statements":[[2," "],[8,"consul/token/search-bar",[],[["@search","@onsearch","@sort","@filter"],[[34,1],[30,[36,3],[[32,0],[30,[36,2],[[35,1]],null]],[["value"],["target.value"]]],[32,3],[32,4]]],null],[2,"\\n"]],"parameters":[]}]]],[2," "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["content"]],[["default"],[{"statements":[[2,"\\n"],[6,[37,6],[[30,[36,8],[[32,5]],null]],null,[["default"],[{"statements":[[2," "],[8,"notice",[],[["@type"],["info"]],[["default"],[{"statements":[[2,"\\n "],[8,[32,7,["Header"]],[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[10,"h2"],[12],[2,"Update"],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,[32,7,["Body"]],[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[10,"p"],[12],[2,"We have upgraded our ACL System to allow the creation of reusable policies that can be applied to tokens. Read more about the changes and how to upgrade legacy tokens in our "],[10,"a"],[15,6,[31,[[30,[36,0],["CONSUL_DOCS_URL"],null],"/guides/acl-migrate-tokens.html"]]],[14,"target","_blank"],[14,"rel","noopener noreferrer"],[12],[2,"documentation"],[13],[2,"."],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[7]}]]],[2,"\\n"]],"parameters":[]}]]],[2," "],[8,"data-collection",[],[["@type","@sort","@filters","@search","@items"],["token",[32,3,["value"]],[32,4],[34,1],[32,5]]],[["default"],[{"statements":[[2,"\\n "],[8,[32,6,["Collection"]],[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[8,"consul/token/list",[],[["@items","@token","@onuse","@ondelete","@onlogout","@onclone"],[[32,6,["items"]],[32,1,["model","user","token"]],[30,[36,9],["use"],null],[30,[36,9],["delete"],null],[30,[36,9],["logout"],null],[30,[36,9],["clone"],null]]],null],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,[32,6,["Empty"]],[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[8,"empty-state",[],[["@login"],[[32,1,["model","app","login","open"]]]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["header"]],[["default"],[{"statements":[[2,"\\n "],[10,"h2"],[12],[2,"\\n "],[1,[30,[36,10],["routes.dc.acls.tokens.index.empty.header"],[["items"],[[32,5,["length"]]]]]],[2,"\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["body"]],[["default"],[{"statements":[[2,"\\n "],[1,[30,[36,10],["routes.dc.acls.tokens.index.empty.body"],[["items","htmlSafe"],[[32,5,["length"]],true]]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[6]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[3,4,5]}]]],[2," "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[2]}]]],[2,"\\n"]],"parameters":[1]}]]],[2,"\\n"]],"hasEval":false,"upvars":["env","search","mut","action","href-to","can","if","gt","token/is-legacy","route-action","t","routeName","hash","uri","eq","searchProperties","searchproperty","split","not-eq","kind","sortBy","or","let"]}',meta:{moduleName:"consul-ui/templates/dc/acls/tokens/index.hbs"}}) -e.default=t})),define("consul-ui/templates/dc/intentions/edit",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -var t=Ember.HTMLBars.template({id:"e81sBB7+",block:'{"symbols":["route","loader","item","readOnly"],"statements":[[8,"route",[],[["@name"],[[34,5]]],[["default"],[{"statements":[[2,"\\n "],[8,"data-loader",[],[["@src"],[[30,[36,7],["/${partition}/${nspace}/${dc}/intention/${id}",[30,[36,3],null,[["partition","nspace","dc","id"],[[32,1,["params","partition"]],[32,1,["params","nspace"]],[32,1,["params","dc"]],[30,[36,6],[[32,1,["params","intention_id"]],""],null]]]]],null]]],[["default"],[{"statements":[[2,"\\n\\n "],[8,"block-slot",[],[["@name"],["error"]],[["default"],[{"statements":[[2,"\\n "],[8,"app-error",[],[["@error","@login"],[[32,2,["error"]],[32,1,["model","app","login","open"]]]],null],[2,"\\n "]],"parameters":[]}]]],[2,"\\n\\n "],[8,"block-slot",[],[["@name"],["loaded"]],[["default"],[{"statements":[[2,"\\n"],[6,[37,10],[[32,2,["data"]],[30,[36,2],[[30,[36,9],["write intention"],[["item"],[[35,8]]]]],null]],null,[["default"],[{"statements":[[2," "],[8,"app-view",[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["breadcrumbs"]],[["default"],[{"statements":[[2,"\\n "],[10,"ol"],[12],[2,"\\n "],[10,"li"],[12],[10,"a"],[15,6,[30,[36,1],["dc.intentions"],null]],[12],[2,"All Intentions"],[13],[13],[2,"\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["header"]],[["default"],[{"statements":[[2,"\\n "],[10,"h1"],[12],[2,"\\n"],[6,[37,0],[[30,[36,2],[[32,4]],null]],null,[["default","else"],[{"statements":[[6,[37,0],[[32,3,["ID"]]],null,[["default","else"],[{"statements":[[2," "],[8,[32,1,["Title"]],[],[["@title"],["Edit Intention"]],null],[2,"\\n"]],"parameters":[]},{"statements":[[2," "],[8,[32,1,["Title"]],[],[["@title"],["New Intention"]],null],[2,"\\n"]],"parameters":[]}]]]],"parameters":[]},{"statements":[[2," "],[8,[32,1,["Title"]],[],[["@title"],["View Intention"]],null],[2,"\\n"]],"parameters":[]}]]],[2," "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["content"]],[["default"],[{"statements":[[2,"\\n "],[8,"consul/intention/form",[],[["@readonly","@item","@dc","@nspace","@partition","@onsubmit"],[[32,4],[32,3],[32,1,["model","dc"]],[32,1,["params","nspace"]],[32,1,["params","partition"]],[30,[36,4],["transitionTo","dc.intentions.index",[30,[36,3],null,[["dc"],[[32,1,["params","dc"]]]]]],null]]],null],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[3,4]}]]],[2," "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[2]}]]],[2,"\\n"]],"parameters":[1]}]]]],"hasEval":false,"upvars":["if","href-to","not","hash","route-action","routeName","or","uri","item","can","let"]}',meta:{moduleName:"consul-ui/templates/dc/intentions/edit.hbs"}}) -e.default=t})),define("consul-ui/templates/dc/intentions/index",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -var t=Ember.HTMLBars.template({id:"yq7mXGuh",block:'{"symbols":["route","api","sort","filters","items","writer","collection","list"],"statements":[[8,"route",[],[["@name"],[[34,13]]],[["default"],[{"statements":[[2,"\\n "],[8,"data-loader",[],[["@src"],[[30,[36,9],["/${partition}/${nspace}/${dc}/intentions",[30,[36,8],null,[["partition","nspace","dc"],[[32,1,["params","partition"]],[32,1,["params","nspace"]],[32,1,["params","dc"]]]]]],null]]],[["default"],[{"statements":[[2,"\\n\\n "],[8,"block-slot",[],[["@name"],["error"]],[["default"],[{"statements":[[2,"\\n "],[8,"app-error",[],[["@error","@login"],[[32,2,["error"]],[32,1,["model","app","login","open"]]]],null],[2,"\\n "]],"parameters":[]}]]],[2,"\\n\\n "],[8,"block-slot",[],[["@name"],["loaded"]],[["default"],[{"statements":[[2,"\\n"],[6,[37,21],[[30,[36,8],null,[["value","change"],[[30,[36,20],[[35,19],"Action:asc"],null],[30,[36,2],[[32,0],[30,[36,1],[[35,19]],null]],[["value"],["target.selected"]]]]]],[30,[36,8],null,[["access","searchproperty"],[[30,[36,8],null,[["value","change"],[[30,[36,6],[[35,18],[30,[36,16],[[35,18],","],null],[29]],null],[30,[36,2],[[32,0],[30,[36,1],[[35,18]],null]],[["value"],["target.selectedItems"]]]]]],[30,[36,8],null,[["value","change","default"],[[30,[36,6],[[30,[36,17],[[35,15],[29]],null],[30,[36,16],[[35,15],","],null],[35,14]],null],[30,[36,2],[[32,0],[30,[36,1],[[35,15]],null]],[["value"],["target.selectedItems"]]],[35,14]]]]]]],[32,2,["data"]]],null,[["default"],[{"statements":[[2,"\\n "],[8,"app-view",[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["header"]],[["default"],[{"statements":[[2,"\\n "],[10,"h1"],[12],[2,"\\n "],[8,[32,1,["Title"]],[],[["@title"],["Intentions"]],null],[2," "],[10,"em"],[12],[1,[30,[36,4],[[32,5,["length"]]],null]],[2," total"],[13],[2,"\\n "],[13],[2,"\\n "],[10,"label"],[14,"for","toolbar-toggle"],[12],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["actions"]],[["default"],[{"statements":[[2,"\\n"],[6,[37,6],[[30,[36,5],["create intentions"],null]],null,[["default"],[{"statements":[[2," "],[10,"a"],[15,6,[31,[[30,[36,3],["dc.intentions.create"],null]]]],[14,0,"type-create"],[12],[2,"Create"],[13],[2,"\\n"]],"parameters":[]}]]],[2," "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["toolbar"]],[["default"],[{"statements":[[2,"\\n\\n"],[6,[37,6],[[30,[36,7],[[32,5,["length"]],0],null]],null,[["default"],[{"statements":[[2," "],[8,"consul/intention/search-bar",[],[["@search","@onsearch","@sort","@filter"],[[34,0],[30,[36,2],[[32,0],[30,[36,1],[[35,0]],null]],[["value"],["target.value"]]],[32,3],[32,4]]],null],[2,"\\n"]],"parameters":[]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["content"]],[["default"],[{"statements":[[2,"\\n "],[8,"data-writer",[],[["@sink","@type","@ondelete"],[[30,[36,9],["/${partition}/${dc}/${nspace}/intention/",[30,[36,8],null,[["partition","nspace","dc"],[[32,1,["params","partition"]],[32,1,["params","nspace"]],[32,1,["params","dc"]]]]]],null],"intention",[34,10]]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["content"]],[["default"],[{"statements":[[2,"\\n "],[8,"data-collection",[],[["@type","@sort","@filters","@search","@items"],["intention",[32,3,["value"]],[32,4],[34,0],[32,5]]],[["default"],[{"statements":[[2,"\\n "],[8,[32,7,["Collection"]],[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[8,"consul/intention/list",[],[["@items","@delete"],[[32,7,["items"]],[32,6,["delete"]]]],[["default"],[{"statements":[[2,"\\n "],[8,[32,8,["CustomResourceNotice"]],[],[[],[]],null],[2,"\\n "],[8,[32,8,["Table"]],[],[[],[]],null],[2,"\\n "]],"parameters":[8]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,[32,7,["Empty"]],[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[8,"empty-state",[],[["@login"],[[32,1,["model","app","login","open"]]]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["header"]],[["default"],[{"statements":[[2,"\\n "],[10,"h2"],[12],[2,"\\n "],[1,[30,[36,11],["routes.dc.intentions.index.empty.header"],[["items"],[[32,5,["length"]]]]]],[2,"\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["body"]],[["default"],[{"statements":[[2,"\\n "],[1,[30,[36,11],["routes.dc.intentions.index.empty.body"],[["items","htmlSafe"],[[32,5,["length"]],true]]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["actions"]],[["default"],[{"statements":[[2,"\\n "],[10,"li"],[14,0,"docs-link"],[12],[2,"\\n "],[10,"a"],[15,6,[31,[[30,[36,12],["CONSUL_DOCS_URL"],null],"/commands/intention"]]],[14,"rel","noopener noreferrer"],[14,"target","_blank"],[12],[2,"Documentation on intentions"],[13],[2,"\\n "],[13],[2,"\\n "],[10,"li"],[14,0,"learn-link"],[12],[2,"\\n "],[10,"a"],[15,6,[31,[[30,[36,12],["CONSUL_DOCS_LEARN_URL"],null],"/consul/getting-started/connect"]]],[14,"rel","noopener noreferrer"],[14,"target","_blank"],[12],[2,"Take the tutorial"],[13],[2,"\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[7]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[6]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n\\n"]],"parameters":[3,4,5]}]]],[2," "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[2]}]]],[2,"\\n"]],"parameters":[1]}]]]],"hasEval":false,"upvars":["search","mut","action","href-to","format-number","can","if","gt","hash","uri","refresh-route","t","env","routeName","searchProperties","searchproperty","split","not-eq","access","sortBy","or","let"]}',meta:{moduleName:"consul-ui/templates/dc/intentions/index.hbs"}}) -e.default=t})),define("consul-ui/templates/dc/kv/edit",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -var t=Ember.HTMLBars.template({id:"3Thl/bd4",block:'{"symbols":["route","separator","parentKey","loader","dc","partition","nspace","item","parts","breadcrumb","index"],"statements":[[8,"route",[],[["@name"],[[34,23]]],[["default"],[{"statements":[[2,"\\n\\n"],[6,[37,18],["/"],null,[["default"],[{"statements":[[2,"\\n"],[6,[37,18],[[30,[36,6],[[30,[36,12],[[32,2],[30,[36,10],[0,-1,[30,[36,17],[[32,1,["params","key"]],[32,2]],null]],null]],null],[32,2]],null]],null,[["default"],[{"statements":[[2,"\\n "],[8,"data-loader",[],[["@src"],[[30,[36,2],["/${partition}/${nspace}/${dc}/kv/${key}",[30,[36,1],null,[["partition","nspace","dc","key"],[[32,1,["params","partition"]],[32,1,["params","nspace"]],[32,1,["params","dc"]],[30,[36,7],[[30,[36,24],[[35,23],"create"],null],"",[32,1,["params","key"]]],null]]]]],null]]],[["default"],[{"statements":[[2,"\\n\\n "],[8,"block-slot",[],[["@name"],["error"]],[["default"],[{"statements":[[2,"\\n "],[8,"app-error",[],[["@error","@login"],[[32,4,["error"]],[32,1,["model","app","login","open"]]]],null],[2,"\\n "]],"parameters":[]}]]],[2,"\\n\\n "],[8,"block-slot",[],[["@name"],["loaded"]],[["default"],[{"statements":[[2,"\\n"],[6,[37,18],[[32,1,["params","dc"]],[32,1,["params","partition"]],[32,1,["params","nspace"]],[32,4,["data"]]],null,[["default"],[{"statements":[[2,"\\n "],[8,"app-view",[],[[],[]],[["default"],[{"statements":[[2,"\\n\\n "],[8,"block-slot",[],[["@name"],["breadcrumbs"]],[["default"],[{"statements":[[2,"\\n "],[10,"ol"],[12],[2,"\\n "],[10,"li"],[12],[2,"\\n "],[8,"action",[],[["@href"],[[30,[36,13],["dc.kv.index"],null]]],[["default"],[{"statements":[[2,"\\n Key / Values\\n "]],"parameters":[]}]]],[2,"\\n "],[13],[2,"\\n"],[6,[37,7],[[30,[36,19],[[32,3],[32,2]],null]],null,[["default"],[{"statements":[[2,"\\n"],[6,[37,18],[[30,[36,17],[[32,3],[32,2]],null]],null,[["default"],[{"statements":[[2,"\\n"],[6,[37,16],[[30,[36,15],[[30,[36,15],[[32,9]],null]],null]],null,[["default"],[{"statements":[[6,[37,7],[[30,[36,14],[[32,10,["length"]],0],null]],null,[["default"],[{"statements":[[2," "],[10,"li"],[12],[2,"\\n "],[8,"action",[],[["@href"],[[30,[36,13],["dc.kv.folder",[30,[36,12],["/",[30,[36,11],[[30,[36,10],[0,[30,[36,9],[[32,11],1],null],[32,9]],null],""],null]],null]],null]]],[["default"],[{"statements":[[2,"\\n "],[1,[32,10]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[13],[2,"\\n"]],"parameters":[]}]]]],"parameters":[10,11]}]]]],"parameters":[9]}]]],[2,"\\n"]],"parameters":[]}]]],[2," "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n\\n "],[8,"block-slot",[],[["@name"],["header"]],[["default"],[{"statements":[[2,"\\n "],[10,"h1"],[12],[2,"\\n"],[6,[37,7],[[30,[36,20],[[32,8,["Key"]],[30,[36,19],[[32,8,["Key"]],[32,3]],null]],null]],null,[["default","else"],[{"statements":[[2," "],[8,[32,1,["Title"]],[],[["@title","@render"],["Edit Key / Value",false]],null],[2,"\\n "],[1,[30,[36,8],[[32,8,["Key"]],[32,3]],null]],[2,"\\n"]],"parameters":[]},{"statements":[[2," "],[8,[32,1,["Title"]],[],[["@title","@render"],["New Key / Value",true]],null],[2,"\\n"]],"parameters":[]}]]],[2," "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n\\n "],[8,"block-slot",[],[["@name"],["content"]],[["default"],[{"statements":[[2,"\\n\\n"],[6,[37,7],[[32,8,["Session"]]],null,[["default"],[{"statements":[[2," "],[8,"consul/lock-session/notifications",[],[["@type"],["kv"]],null],[2,"\\n"]],"parameters":[]}]]],[2,"\\n "],[8,"consul/kv/form",[],[["@item","@dc","@nspace","@partition","@onsubmit","@parent"],[[32,8],[32,1,["params","dc"]],[32,1,["params","nspace"]],[32,1,["params","partition"]],[30,[36,7],[[30,[36,22],[[32,3],[32,2]],null],[30,[36,21],["dc.kv.index"],null],[30,[36,21],["dc.kv.folder",[32,3]],null]],null],[32,3]]],null],[2,"\\n\\n\\n"],[6,[37,7],[[30,[36,20],[[32,8,["Session"]]],null]],null,[["default"],[{"statements":[[2," "],[8,"data-source",[],[["@src","@onchange"],[[30,[36,2],["/${partition}/${nspace}/${dc}/sessions/for-key/${id}",[30,[36,1],null,[["partition","nspace","dc","id"],[[32,1,["params","partition"]],[32,1,["params","nspace"]],[32,1,["params","dc"]],[32,8,["Session"]]]]]],null],[30,[36,4],[[32,0],[30,[36,3],[[35,0]],null]],[["value"],["data"]]]]],null],[2,"\\n "],[10,"h2"],[12],[2,"\\n "],[8,"action",[[24,"rel","help"]],[["@href","@external"],[[30,[36,6],[[30,[36,5],["CONSUL_DOCS_URL"],null],"/internals/sessions.html#session-design"],null],true]],[["default"],[{"statements":[[2,"\\n Lock Session\\n "]],"parameters":[]}]]],[2,"\\n "],[13],[2,"\\n"],[6,[37,7],[[35,0,["ID"]]],null,[["default"],[{"statements":[[2," "],[8,"consul/lock-session/form",[],[["@item","@ondelete"],[[34,0],[32,4,["invalidate"]]]],null],[2,"\\n"]],"parameters":[]}]]]],"parameters":[]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[5,6,7,8]}]]],[2," "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[4]}]]],[2,"\\n"]],"parameters":[3]}]]]],"parameters":[2]}]]]],"parameters":[1]}]]]],"hasEval":false,"upvars":["session","hash","uri","mut","action","env","concat","if","left-trim","add","slice","append","join","href-to","gt","-track-array","each","split","let","not-eq","and","transition-to","eq","routeName","string-ends-with"]}',meta:{moduleName:"consul-ui/templates/dc/kv/edit.hbs"}}) -e.default=t})),define("consul-ui/templates/dc/kv/index",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -var t=Ember.HTMLBars.template({id:"46JF00/h",block:'{"symbols":["route","loader","sort","filters","parent","items","writer","collection","breadcrumb","index","after","notice","notice","notice"],"statements":[[8,"route",[],[["@name"],[[34,25]]],[["default"],[{"statements":[[2,"\\n "],[8,"data-source",[],[["@src","@onchange"],[[30,[36,20],["/${partition}/${nspace}/${dc}/kv/${key}",[30,[36,19],null,[["partition","nspace","dc","key"],[[32,1,["params","partition"]],[32,1,["params","nspace"]],[32,1,["params","dc"]],[30,[36,26],[[32,1,["params","key"]],"/"],null]]]]],null],[30,[36,5],[[32,0],[30,[36,4],[[35,27]],null]],[["value"],["data"]]]]],null],[2,"\\n "],[8,"data-loader",[],[["@src"],[[30,[36,20],["/${partition}/${nspace}/${dc}/kvs/${key}",[30,[36,19],null,[["partition","nspace","dc","key"],[[32,1,["params","partition"]],[32,1,["params","nspace"]],[32,1,["params","dc"]],[30,[36,26],[[32,1,["params","key"]],"/"],null]]]]],null]]],[["default"],[{"statements":[[2,"\\n\\n "],[8,"block-slot",[],[["@name"],["error"]],[["default"],[{"statements":[[2,"\\n "],[8,"app-error",[],[["@error","@login"],[[32,2,["error"]],[32,1,["model","app","login","open"]]]],null],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["disconnected"]],[["default"],[{"statements":[[2,"\\n"],[6,[37,2],[[30,[36,16],[[32,2,["error","status"]],"404"],null]],null,[["default","else"],[{"statements":[[2," "],[8,"notice",[[24,0,"notification-update"],[4,[38,24],null,[["sticky"],[true]]]],[["@type"],["warning"]],[["default"],[{"statements":[[2,"\\n "],[8,[32,14,["Header"]],[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[10,"strong"],[12],[2,"Warning!"],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,[32,14,["Body"]],[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[10,"p"],[12],[2,"\\n This KV or parent of this KV was deleted.\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[14]}]]],[2,"\\n"]],"parameters":[]},{"statements":[[6,[37,2],[[30,[36,16],[[32,2,["error","status"]],"403"],null]],null,[["default","else"],[{"statements":[[2," "],[8,"notice",[[24,0,"notification-update"],[4,[38,24],null,[["sticky"],[true]]]],[["@type"],["error"]],[["default"],[{"statements":[[2,"\\n "],[8,[32,13,["Header"]],[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[10,"strong"],[12],[2,"Error!"],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,[32,13,["Body"]],[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[10,"p"],[12],[2,"\\n You no longer have access to this KV.\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[13]}]]],[2,"\\n"]],"parameters":[]},{"statements":[[2," "],[8,"notice",[[24,0,"notification-update"],[4,[38,24],null,[["sticky"],[true]]]],[["@type"],["warning"]],[["default"],[{"statements":[[2,"\\n "],[8,[32,12,["Header"]],[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[10,"strong"],[12],[2,"Warning!"],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,[32,12,["Body"]],[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[10,"p"],[12],[2,"\\n An error was returned whilst loading this data, refresh to try again.\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[12]}]]],[2,"\\n "]],"parameters":[]}]]]],"parameters":[]}]]],[2," "]],"parameters":[11]}]]],[2,"\\n\\n "],[8,"block-slot",[],[["@name"],["loaded"]],[["default"],[{"statements":[[2,"\\n"],[6,[37,30],[[30,[36,19],null,[["value","change"],[[30,[36,26],[[35,29],"Kind:asc"],null],[30,[36,5],[[32,0],[30,[36,4],[[35,29]],null]],[["value"],["target.selected"]]]]]],[30,[36,19],null,[["kind"],[[30,[36,19],null,[["value","change"],[[30,[36,2],[[35,28],[30,[36,6],[[35,28],","],null],[29]],null],[30,[36,5],[[32,0],[30,[36,4],[[35,28]],null]],[["value"],["target.selectedItems"]]]]]]]]],[35,27],[32,2,["data"]]],null,[["default"],[{"statements":[[2," "],[8,"app-view",[],[[],[]],[["default"],[{"statements":[[2,"\\n"],[6,[37,2],[[30,[36,1],[[32,5,["Key"]],"/"],null]],null,[["default"],[{"statements":[[2," "],[8,"block-slot",[],[["@name"],["breadcrumbs"]],[["default"],[{"statements":[[2,"\\n "],[10,"ol"],[12],[2,"\\n "],[10,"li"],[12],[10,"a"],[15,6,[30,[36,0],["dc.kv"],null]],[12],[2,"Key / Values"],[13],[13],[2,"\\n"],[6,[37,15],[[30,[36,14],[[30,[36,14],[[30,[36,11],[0,-2,[30,[36,6],[[32,5,["Key"]],"/"],null]],null]],null]],null]],null,[["default"],[{"statements":[[2," "],[10,"li"],[12],[10,"a"],[15,6,[30,[36,0],["dc.kv.folder",[30,[36,13],["/",[30,[36,12],[[30,[36,11],[0,[30,[36,10],[[32,10],1],null],[30,[36,6],[[32,5,["Key"]],"/"],null]],null],""],null]],null]],null]],[12],[1,[32,9]],[13],[13],[2,"\\n"]],"parameters":[9,10]}]]],[2," "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[]}]]],[2," "],[8,"block-slot",[],[["@name"],["header"]],[["default"],[{"statements":[[2,"\\n "],[10,"h1"],[12],[2,"\\n"],[6,[37,2],[[30,[36,16],[[32,5,["Key"]],"/"],null]],null,[["default","else"],[{"statements":[[2," "],[8,[32,1,["Title"]],[],[["@title"],["Key / Value"]],null],[2,"\\n"]],"parameters":[]},{"statements":[[2," "],[8,[32,1,["Title"]],[],[["@title"],[[30,[36,9],[1,[30,[36,8],[1,[30,[36,7],[[30,[36,6],[[32,5,["Key"]],"/"],null]],null]],null]],null]]],null],[2,"\\n"]],"parameters":[]}]]],[2," "],[13],[2,"\\n "],[10,"label"],[14,"for","toolbar-toggle"],[12],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["toolbar"]],[["default"],[{"statements":[[2,"\\n"],[6,[37,2],[[30,[36,17],[[32,6,["length"]],0],null]],null,[["default"],[{"statements":[[2," "],[8,"consul/kv/search-bar",[],[["@search","@onsearch","@sort","@filter"],[[34,3],[30,[36,5],[[32,0],[30,[36,4],[[35,3]],null]],[["value"],["target.value"]]],[32,3],[32,4]]],null],[2,"\\n"]],"parameters":[]}]]],[2," "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["actions"]],[["default"],[{"statements":[[2,"\\n"],[6,[37,2],[[30,[36,18],["create kvs"],null]],null,[["default"],[{"statements":[[6,[37,2],[[30,[36,1],[[32,5,["Key"]],"/"],null]],null,[["default","else"],[{"statements":[[2," "],[10,"a"],[15,6,[31,[[30,[36,0],["dc.kv.create",[32,5,["Key"]]],null]]]],[14,0,"type-create"],[12],[2,"Create"],[13],[2,"\\n"]],"parameters":[]},{"statements":[[2," "],[10,"a"],[15,6,[31,[[30,[36,0],["dc.kv.root-create"],null]]]],[14,0,"type-create"],[12],[2,"Create"],[13],[2,"\\n"]],"parameters":[]}]]]],"parameters":[]}]]],[2," "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["content"]],[["default"],[{"statements":[[2,"\\n "],[8,"data-writer",[],[["@sink","@type","@label","@ondelete"],[[30,[36,20],["/${partition}/${nspace}/${dc}/kv/",[30,[36,19],null,[["partition","nspace","dc"],[[32,1,["params","partition"]],[32,1,["params","nspace"]],[32,1,["params","dc"]]]]]],null],"kv","key",[34,21]]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["content"]],[["default"],[{"statements":[[2,"\\n "],[8,"data-collection",[],[["@type","@sort","@filters","@search","@items"],["kv",[32,3,["value"]],[32,4],[34,3],[32,6]]],[["default"],[{"statements":[[2,"\\n "],[8,[32,8,["Collection"]],[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[8,"consul/kv/list",[],[["@items","@parent","@delete"],[[32,8,["items"]],[32,5],[32,7,["delete"]]]],null],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,[32,8,["Empty"]],[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[8,"empty-state",[],[["@login"],[[32,1,["model","app","login","open"]]]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["header"]],[["default"],[{"statements":[[2,"\\n "],[10,"h2"],[12],[2,"\\n "],[1,[30,[36,22],["routes.dc.kv.index.empty.header"],[["items"],[[32,6,["length"]]]]]],[2,"\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["body"]],[["default"],[{"statements":[[2,"\\n "],[1,[30,[36,22],["routes.dc.kv.index.empty.body"],[["items","htmlSafe"],[[32,6,["length"]],true]]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["actions"]],[["default"],[{"statements":[[2,"\\n "],[10,"li"],[14,0,"docs-link"],[12],[2,"\\n "],[10,"a"],[15,6,[31,[[30,[36,23],["CONSUL_DOCS_URL"],null],"/agent/kv"]]],[14,"rel","noopener noreferrer"],[14,"target","_blank"],[12],[2,"Documentation on K/V"],[13],[2,"\\n "],[13],[2,"\\n "],[10,"li"],[14,0,"learn-link"],[12],[2,"\\n "],[10,"a"],[15,6,[31,[[30,[36,23],["CONSUL_DOCS_LEARN_URL"],null],"/consul/getting-started/kv"]]],[14,"rel","noopener noreferrer"],[14,"target","_blank"],[12],[2,"Take the tutorial"],[13],[2,"\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[8]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[7]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[3,4,5,6]}]]],[2," "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[2]}]]],[2,"\\n"]],"parameters":[1]}]]]],"hasEval":false,"upvars":["href-to","not-eq","if","search","mut","action","split","reverse","drop","take","add","slice","append","join","-track-array","each","eq","gt","can","hash","uri","refresh-route","t","env","notification","routeName","or","parent","kind","sortBy","let"]}',meta:{moduleName:"consul-ui/templates/dc/kv/index.hbs"}}) -e.default=t})),define("consul-ui/templates/dc/nodes/index",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -var t=Ember.HTMLBars.template({id:"C5bHf0Hx",block:'{"symbols":["route","leader","api","sort","filters","items","leader","collection"],"statements":[[8,"route",[],[["@name"],[[34,7]]],[["default"],[{"statements":[[2,"\\n\\n "],[8,"data-source",[],[["@src"],[[30,[36,9],["/${partition}/${nspace}/${dc}/leader",[30,[36,8],null,[["partition","nspace","dc"],[[32,1,["params","partition"]],[32,1,["params","nspace"]],[32,1,["params","dc"]]]]]],null]]],[["default"],[{"statements":[[2,"\\n\\n "],[8,"data-loader",[],[["@src"],[[30,[36,9],["/${partition}/${nspace}/${dc}/nodes",[30,[36,8],null,[["partition","nspace","dc"],[[32,1,["params","partition"]],[32,1,["params","nspace"]],[32,1,["params","dc"]]]]]],null]]],[["default"],[{"statements":[[2,"\\n\\n "],[8,"block-slot",[],[["@name"],["error"]],[["default"],[{"statements":[[2,"\\n "],[8,"app-error",[],[["@error","@login"],[[32,3,["error"]],[32,1,["model","app","login","open"]]]],null],[2,"\\n "]],"parameters":[]}]]],[2,"\\n\\n "],[8,"block-slot",[],[["@name"],["loaded"]],[["default"],[{"statements":[[2,"\\n"],[6,[37,17],[[30,[36,8],null,[["value","change"],[[30,[36,16],[[35,15],"Status:asc"],null],[30,[36,2],[[32,0],[30,[36,1],[[35,15]],null]],[["value"],["target.selected"]]]]]],[30,[36,8],null,[["status","searchproperty"],[[30,[36,8],null,[["value","change"],[[30,[36,5],[[35,14],[30,[36,12],[[35,14],","],null],[29]],null],[30,[36,2],[[32,0],[30,[36,1],[[35,14]],null]],[["value"],["target.selectedItems"]]]]]],[30,[36,8],null,[["value","change","default"],[[30,[36,5],[[30,[36,13],[[35,11],[29]],null],[30,[36,12],[[35,11],","],null],[35,10]],null],[30,[36,2],[[32,0],[30,[36,1],[[35,11]],null]],[["value"],["target.selectedItems"]]],[35,10]]]]]]],[32,3,["data"]],[32,2,["data"]]],null,[["default"],[{"statements":[[2," "],[8,"app-view",[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["header"]],[["default"],[{"statements":[[2,"\\n "],[10,"h1"],[12],[2,"\\n "],[8,[32,1,["Title"]],[],[["@title"],["Nodes"]],null],[2," "],[10,"em"],[12],[1,[30,[36,3],[[32,6,["length"]]],null]],[2," total"],[13],[2,"\\n "],[13],[2,"\\n "],[10,"label"],[14,"for","toolbar-toggle"],[12],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["toolbar"]],[["default"],[{"statements":[[2,"\\n"],[6,[37,5],[[30,[36,4],[[32,6,["length"]],0],null]],null,[["default"],[{"statements":[[2," "],[8,"consul/node/search-bar",[],[["@search","@onsearch","@sort","@filter"],[[34,0],[30,[36,2],[[32,0],[30,[36,1],[[35,0]],null]],[["value"],["target.value"]]],[32,4],[32,5]]],null],[2,"\\n"]],"parameters":[]}]]],[2," "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["content"]],[["default"],[{"statements":[[2,"\\n "],[8,"data-collection",[],[["@type","@sort","@filters","@search","@items"],["node",[32,4,["value"]],[32,5],[34,0],[32,6]]],[["default"],[{"statements":[[2,"\\n "],[8,[32,8,["Collection"]],[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[8,"consul/node/list",[],[["@items","@leader"],[[32,8,["items"]],[32,7]]],null],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,[32,8,["Empty"]],[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[8,"empty-state",[],[["@login"],[[32,1,["model","app","login","open"]]]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["header"]],[["default"],[{"statements":[[2,"\\n "],[10,"h2"],[12],[2,"\\n "],[1,[30,[36,6],["routes.dc.nodes.index.empty.header"],[["items"],[[32,6,["length"]]]]]],[2,"\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["body"]],[["default"],[{"statements":[[2,"\\n "],[1,[30,[36,6],["routes.dc.nodes.index.empty.body"],[["items","htmlSafe"],[[32,6,["length"]],true]]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[8]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[4,5,6,7]}]]],[2," "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[3]}]]],[2,"\\n "]],"parameters":[2]}]]],[2,"\\n "]],"parameters":[1]}]]]],"hasEval":false,"upvars":["search","mut","action","format-number","gt","if","t","routeName","hash","uri","searchProperties","searchproperty","split","not-eq","status","sortBy","or","let"]}',meta:{moduleName:"consul-ui/templates/dc/nodes/index.hbs"}}) -e.default=t})),define("consul-ui/templates/dc/nodes/show",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -var t=Ember.HTMLBars.template({id:"AGs+VtxL",block:'{"symbols":["route","tomography","loader","item","tomography","o","status","type","after","notice","notice","notice"],"statements":[[8,"route",[],[["@name"],[[34,8]]],[["default"],[{"statements":[[2,"\\n "],[8,"data-source",[],[["@src"],[[30,[36,14],["/${partition}/${nspace}/${dc}/coordinates/for-node/${name}",[30,[36,3],null,[["partition","nspace","dc","name"],[[32,1,["params","partition"]],[32,1,["params","nspace"]],[32,1,["params","dc"]],[32,1,["params","name"]]]]]],null]]],[["default"],[{"statements":[[2,"\\n "],[8,"data-loader",[],[["@src"],[[30,[36,14],["/${partition}/${nspace}/${dc}/node/${name}",[30,[36,3],null,[["partition","nspace","dc","name"],[[32,1,["params","partition"]],[32,1,["params","nspace"]],[32,1,["params","dc"]],[32,1,["params","name"]]]]]],null]]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["error"]],[["default"],[{"statements":[[2,"\\n "],[8,"app-error",[],[["@error","@login"],[[32,3,["error"]],[32,1,["model","app","login","open"]]]],null],[2,"\\n "]],"parameters":[]}]]],[2,"\\n\\n "],[8,"block-slot",[],[["@name"],["disconnected"]],[["default"],[{"statements":[[2,"\\n"],[6,[37,5],[[30,[36,13],[[32,3,["error","status"]],"404"],null]],null,[["default","else"],[{"statements":[[2," "],[8,"notice",[[24,0,"notification-update"],[4,[38,12],null,[["sticky"],[true]]]],[["@type"],["warning"]],[["default"],[{"statements":[[2,"\\n "],[8,[32,12,["Header"]],[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[10,"strong"],[12],[2,"Warning!"],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,[32,12,["Body"]],[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[10,"p"],[12],[2,"\\n This node no longer exists in the catalog.\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[12]}]]],[2,"\\n"]],"parameters":[]},{"statements":[[6,[37,5],[[30,[36,13],[[32,3,["error","status"]],"403"],null]],null,[["default","else"],[{"statements":[[2," "],[8,"notice",[[24,0,"notification-update"],[4,[38,12],null,[["sticky"],[true]]]],[["@type"],["error"]],[["default"],[{"statements":[[2,"\\n "],[8,[32,11,["Header"]],[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[10,"strong"],[12],[2,"Error!"],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,[32,11,["Body"]],[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[10,"p"],[12],[2,"\\n You no longer have access to this node\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[11]}]]],[2,"\\n"]],"parameters":[]},{"statements":[[2," "],[8,"notice",[[24,0,"notification-update"],[4,[38,12],null,[["sticky"],[true]]]],[["@type"],["warning"]],[["default"],[{"statements":[[2,"\\n "],[8,[32,10,["Header"]],[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[10,"strong"],[12],[2,"Warning!"],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,[32,10,["Body"]],[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[10,"p"],[12],[2,"\\n An error was returned whilst loading this data, refresh to try again.\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[10]}]]],[2,"\\n "]],"parameters":[]}]]]],"parameters":[]}]]],[2," "]],"parameters":[9]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["loaded"]],[["default"],[{"statements":[[2,"\\n"],[6,[37,15],[[32,3,["data"]],[32,2,["data"]]],null,[["default"],[{"statements":[[2," "],[8,"app-view",[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["notification"]],[["default"],[{"statements":[[2,"\\n "],[8,"consul/lock-session/notifications",[],[["@type","@status"],[[32,8],[32,7]]],null],[2,"\\n "]],"parameters":[7,8]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["breadcrumbs"]],[["default"],[{"statements":[[2,"\\n "],[10,"ol"],[12],[2,"\\n "],[10,"li"],[12],[10,"a"],[15,6,[30,[36,0],["dc.nodes"],null]],[12],[2,"All Nodes"],[13],[13],[2,"\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["header"]],[["default"],[{"statements":[[2,"\\n "],[10,"h1"],[12],[2,"\\n "],[8,[32,1,["Title"]],[],[["@title"],[[32,4,["Node"]]]],null],[2,"\\n "],[13],[2,"\\n "],[10,"label"],[14,"for","toolbar-toggle"],[12],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["nav"]],[["default"],[{"statements":[[2,"\\n "],[8,"tab-nav",[],[["@items"],[[30,[36,7],[[30,[36,6],[[30,[36,3],null,[["label","href","selected"],[[30,[36,2],["routes.dc.nodes.show.healthchecks.title"],null],[30,[36,0],["dc.nodes.show.healthchecks"],null],[30,[36,1],["dc.nodes.show.healthchecks"],null]]]],[30,[36,3],null,[["label","href","selected"],[[30,[36,2],["routes.dc.nodes.show.services.title"],null],[30,[36,0],["dc.nodes.show.services"],null],[30,[36,1],["dc.nodes.show.services"],null]]]],[30,[36,5],[[32,5,["distances"]],[30,[36,3],null,[["label","href","selected"],[[30,[36,2],["routes.dc.nodes.show.rtt.title"],null],[30,[36,0],["dc.nodes.show.rtt"],null],[30,[36,1],["dc.nodes.show.rtt"],null]]]],""],null],[30,[36,5],[[30,[36,4],["read sessions"],null],[30,[36,3],null,[["label","href","selected"],[[30,[36,2],["routes.dc.nodes.show.sessions.title"],null],[30,[36,0],["dc.nodes.show.sessions"],null],[30,[36,1],["dc.nodes.show.sessions"],null]]]],""],null],[30,[36,3],null,[["label","href","selected"],[[30,[36,2],["routes.dc.nodes.show.metadata.title"],null],[30,[36,0],["dc.nodes.show.metadata"],null],[30,[36,1],["dc.nodes.show.metadata"],null]]]]],null]],null]]],null],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["actions"]],[["default"],[{"statements":[[2,"\\n "],[8,"copy-button",[],[["@value","@name"],[[32,4,["Address"]],"Address"]],[["default"],[{"statements":[[1,[32,4,["Address"]]]],"parameters":[]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["content"]],[["default"],[{"statements":[[2,"\\n "],[8,"outlet",[],[["@name","@model"],[[34,8],[30,[36,9],[[30,[36,3],null,[["item","tomography"],[[32,4],[32,5]]]],[32,1,["model"]]],null]]],[["default"],[{"statements":[[2,"\\n "],[1,[30,[36,11],[[30,[36,10],null,null]],null]],[2,"\\n "]],"parameters":[6]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[4,5]}]]],[2," "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[3]}]]],[2,"\\n "]],"parameters":[2]}]]],[2,"\\n"]],"parameters":[1]}]]],[2,"\\n"]],"hasEval":false,"upvars":["href-to","is-href","t","hash","can","if","array","compact","routeName","assign","-outlet","component","notification","eq","uri","let"]}',meta:{moduleName:"consul-ui/templates/dc/nodes/show.hbs"}}) -e.default=t})),define("consul-ui/templates/dc/nodes/show/healthchecks",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -var t=Ember.HTMLBars.template({id:"bJw4npZ1",block:'{"symbols":["route","sort","filters","items","collection","serf","notice"],"statements":[[8,"route",[],[["@name"],[[34,10]]],[["default"],[{"statements":[[2,"\\n"],[6,[37,9],[[30,[36,15],null,[["value","change"],[[30,[36,20],[[35,19],"Status:asc"],null],[30,[36,6],[[32,0],[30,[36,5],[[35,19]],null]],[["value"],["target.selected"]]]]]],[30,[36,15],null,[["status","kind","check","searchproperty"],[[30,[36,15],null,[["value","change"],[[30,[36,3],[[35,18],[30,[36,13],[[35,18],","],null],[29]],null],[30,[36,6],[[32,0],[30,[36,5],[[35,18]],null]],[["value"],["target.selectedItems"]]]]]],[30,[36,15],null,[["value","change"],[[30,[36,3],[[35,17],[30,[36,13],[[35,17],","],null],[29]],null],[30,[36,6],[[32,0],[30,[36,5],[[35,17]],null]],[["value"],["target.selectedItems"]]]]]],[30,[36,15],null,[["value","change"],[[30,[36,3],[[35,16],[30,[36,13],[[35,16],","],null],[29]],null],[30,[36,6],[[32,0],[30,[36,5],[[35,16]],null]],[["value"],["target.selectedItems"]]]]]],[30,[36,15],null,[["value","change","default"],[[30,[36,3],[[30,[36,14],[[35,12],[29]],null],[30,[36,13],[[35,12],","],null],[35,11]],null],[30,[36,6],[[32,0],[30,[36,5],[[35,12]],null]],[["value"],["target.selectedItems"]]],[35,11]]]]]]],[32,1,["model","item","Checks"]]],null,[["default"],[{"statements":[[2," "],[10,"div"],[14,0,"tab-section"],[12],[2,"\\n"],[6,[37,3],[[30,[36,7],[[32,4,["length"]],0],null]],null,[["default"],[{"statements":[[2," "],[10,"input"],[14,1,"toolbar-toggle"],[14,4,"checkbox"],[12],[13],[2,"\\n "],[8,"consul/health-check/search-bar",[],[["@search","@onsearch","@sort","@filter"],[[34,4],[30,[36,6],[[32,0],[30,[36,5],[[35,4]],null]],[["value"],["target.value"]]],[32,2],[32,3]]],null],[2,"\\n"]],"parameters":[]}]]],[6,[37,9],[[30,[36,8],["Type","serf",[32,4]],null]],null,[["default"],[{"statements":[[6,[37,3],[[30,[36,2],[[32,6],[30,[36,1],[[32,6,["Status"]],"critical"],null]],null]],null,[["default"],[{"statements":[[2," "],[8,"notice",[],[["@type"],["warning"]],[["default"],[{"statements":[[2,"\\n "],[8,[32,7,["Header"]],[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[10,"h2"],[12],[2,"\\n "],[1,[30,[36,0],["routes.dc.nodes.show.healthchecks.critical-serf-notice.header"],null]],[2,"\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,[32,7,["Body"]],[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[1,[30,[36,0],["routes.dc.nodes.show.healthchecks.critical-serf-notice.body"],[["htmlSafe"],[true]]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[7]}]]],[2,"\\n"]],"parameters":[]}]]]],"parameters":[6]}]]],[2," "],[8,"data-collection",[],[["@type","@sort","@filters","@search","@items"],["health-check",[32,2,["value"]],[32,3],[34,4],[32,4]]],[["default"],[{"statements":[[2,"\\n "],[8,[32,5,["Collection"]],[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[8,"consul/health-check/list",[],[["@items"],[[32,5,["items"]]]],null],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,[32,5,["Empty"]],[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[8,"empty-state",[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["body"]],[["default"],[{"statements":[[2,"\\n "],[1,[30,[36,0],["routes.dc.nodes.show.healthchecks.empty"],[["items","htmlSafe"],[[32,4,["length"]],true]]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[5]}]]],[2,"\\n "],[13],[2,"\\n"]],"parameters":[2,3,4]}]]]],"parameters":[1]}]]]],"hasEval":false,"upvars":["t","eq","and","if","search","mut","action","gt","find-by","let","routeName","searchProperties","searchproperty","split","not-eq","hash","check","kind","status","sortBy","or"]}',meta:{moduleName:"consul-ui/templates/dc/nodes/show/healthchecks.hbs"}}) -e.default=t})),define("consul-ui/templates/dc/nodes/show/index",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -var t=Ember.HTMLBars.template({id:"m12qfaqn",block:'{"symbols":["route"],"statements":[[8,"route",[],[["@name"],[[34,2]]],[["default"],[{"statements":[[2,"\\n"],[6,[37,4],[[30,[36,3],[[32,1,["model","item","Checks","length"]],0],null]],null,[["default","else"],[{"statements":[[2," "],[1,[30,[36,1],[[30,[36,0],["replaceWith","dc.nodes.show.services"],null]],null]],[2,"\\n"]],"parameters":[]},{"statements":[[2," "],[1,[30,[36,1],[[30,[36,0],["replaceWith","dc.nodes.show.healthchecks"],null]],null]],[2,"\\n"]],"parameters":[]}]]]],"parameters":[1]}]]],[2,"\\n"]],"hasEval":false,"upvars":["route-action","did-insert","routeName","eq","if"]}',meta:{moduleName:"consul-ui/templates/dc/nodes/show/index.hbs"}}) -e.default=t})),define("consul-ui/templates/dc/nodes/show/metadata",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -var t=Ember.HTMLBars.template({id:"etmR4DHA",block:'{"symbols":["route"],"statements":[[8,"route",[],[["@name"],[[34,1]]],[["default"],[{"statements":[[2,"\\n "],[10,"div"],[14,0,"tab-section"],[12],[2,"\\n"],[6,[37,2],[[32,1,["model","item","Meta"]]],null,[["default","else"],[{"statements":[[2," "],[8,"consul/metadata/list",[],[["@items"],[[30,[36,0],[[32,1,["model","item","Meta"]]],null]]],null],[2,"\\n"]],"parameters":[]},{"statements":[[2," "],[8,"empty-state",[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["body"]],[["default"],[{"statements":[[2,"\\n "],[10,"p"],[12],[2,"\\n This node has no metadata.\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[]}]]],[2," "],[13],[2,"\\n"]],"parameters":[1]}]]],[2,"\\n"]],"hasEval":false,"upvars":["entries","routeName","if"]}',meta:{moduleName:"consul-ui/templates/dc/nodes/show/metadata.hbs"}}) -e.default=t})),define("consul-ui/templates/dc/nodes/show/rtt",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -var t=Ember.HTMLBars.template({id:"P8rIllxs",block:'{"symbols":["route","tomography"],"statements":[[8,"route",[],[["@name"],[[34,5]]],[["default"],[{"statements":[[2,"\\n"],[6,[37,6],[[32,1,["model","tomography"]]],null,[["default"],[{"statements":[[6,[37,4],[[30,[36,3],[[32,2,["distances"]]],null]],null,[["default","else"],[{"statements":[[2," "],[1,[30,[36,2],[[30,[36,1],["replaceWith","dc.nodes.show"],null]],null]],[2,"\\n"]],"parameters":[]},{"statements":[[2," "],[10,"div"],[14,0,"tab-section"],[12],[2,"\\n "],[10,"div"],[14,0,"definition-table"],[12],[2,"\\n "],[10,"dl"],[12],[2,"\\n "],[10,"dt"],[12],[2,"\\n Minimum\\n "],[13],[2,"\\n "],[10,"dd"],[12],[2,"\\n "],[1,[30,[36,0],[[32,2,["min"]]],[["maximumFractionDigits"],[2]]]],[2,"ms\\n "],[13],[2,"\\n "],[10,"dt"],[12],[2,"\\n Median\\n "],[13],[2,"\\n "],[10,"dd"],[12],[2,"\\n "],[1,[30,[36,0],[[32,2,["median"]]],[["maximumFractionDigits"],[2]]]],[2,"ms\\n "],[13],[2,"\\n "],[10,"dt"],[12],[2,"\\n Maximum\\n "],[13],[2,"\\n "],[10,"dd"],[12],[2,"\\n "],[1,[30,[36,0],[[32,2,["max"]]],[["maximumFractionDigits"],[2]]]],[2,"ms\\n "],[13],[2,"\\n "],[13],[2,"\\n "],[13],[2,"\\n "],[8,"consul/tomography/graph",[],[["@distances"],[[32,2,["distances"]]]],null],[2,"\\n "],[13],[2,"\\n"]],"parameters":[]}]]]],"parameters":[2]}]]]],"parameters":[1]}]]],[2,"\\n"]],"hasEval":false,"upvars":["format-number","route-action","did-insert","not","if","routeName","let"]}',meta:{moduleName:"consul-ui/templates/dc/nodes/show/rtt.hbs"}}) -e.default=t})),define("consul-ui/templates/dc/nodes/show/services",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -var t=Ember.HTMLBars.template({id:"2fksFjAV",block:'{"symbols":["route","sort","filters","items","proxies","collection"],"statements":[[8,"route",[],[["@name"],[[34,9]]],[["default"],[{"statements":[[2,"\\n"],[6,[37,18],[[30,[36,13],null,[["value","change"],[[30,[36,17],[[35,16],"Status:asc"],null],[30,[36,4],[[32,0],[30,[36,3],[[35,16]],null]],[["value"],["target.selected"]]]]]],[30,[36,13],null,[["status","source","searchproperty"],[[30,[36,13],null,[["value","change"],[[30,[36,7],[[35,15],[30,[36,11],[[35,15],","],null],[29]],null],[30,[36,4],[[32,0],[30,[36,3],[[35,15]],null]],[["value"],["target.selectedItems"]]]]]],[30,[36,13],null,[["value","change"],[[30,[36,7],[[35,14],[30,[36,11],[[35,14],","],null],[29]],null],[30,[36,4],[[32,0],[30,[36,3],[[35,14]],null]],[["value"],["target.selectedItems"]]]]]],[30,[36,13],null,[["value","change","default"],[[30,[36,7],[[30,[36,12],[[35,10],[29]],null],[30,[36,11],[[35,10],","],null],[35,5]],null],[30,[36,4],[[32,0],[30,[36,3],[[35,10]],null]],[["value"],["target.selectedItems"]]],[35,5]]]]]]],[32,1,["model","item","MeshServiceInstances"]],[32,1,["model","item","ProxyServiceInstances"]]],null,[["default"],[{"statements":[[2," "],[10,"div"],[14,0,"tab-section"],[12],[2,"\\n"],[6,[37,7],[[30,[36,6],[[32,4,["length"]],0],null]],null,[["default"],[{"statements":[[2," "],[10,"input"],[14,1,"toolbar-toggle"],[14,4,"checkbox"],[12],[13],[2,"\\n "],[8,"consul/service-instance/search-bar",[],[["@sources","@search","@onsearch","@searchproperties","@sort","@filter"],[[30,[36,1],[[30,[36,0],[[32,4]],null],"ExternalSources"],null],[34,2],[30,[36,4],[[32,0],[30,[36,3],[[35,2]],null]],[["value"],["target.value"]]],[34,5],[32,2],[32,3]]],null],[2,"\\n"]],"parameters":[]}]]],[2," "],[8,"data-collection",[],[["@type","@sort","@filters","@search","@items"],["service-instance",[32,2,["value"]],[32,3],[34,2],[32,4]]],[["default"],[{"statements":[[2,"\\n "],[8,[32,6,["Collection"]],[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[8,"consul/service-instance/list",[],[["@node","@routeName","@items","@proxies"],[[32,1,["model","item"]],"dc.services.show",[32,6,["items"]],[32,5]]],null],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,[32,6,["Empty"]],[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[8,"empty-state",[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["body"]],[["default"],[{"statements":[[2,"\\n "],[1,[30,[36,8],["routes.dc.nodes.show.services.empty"],[["items","htmlSafe"],[[32,4,["length"]],true]]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[6]}]]],[2,"\\n "],[13],[2,"\\n"]],"parameters":[2,3,4,5]}]]]],"parameters":[1]}]]]],"hasEval":false,"upvars":["collection","get","search","mut","action","searchProperties","gt","if","t","routeName","searchproperty","split","not-eq","hash","source","status","sortBy","or","let"]}',meta:{moduleName:"consul-ui/templates/dc/nodes/show/services.hbs"}}) -e.default=t})),define("consul-ui/templates/dc/nodes/show/sessions",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -var t=Ember.HTMLBars.template({id:"FSj+j5r9",block:'{"symbols":["route","api","items","writer","collection","after","error","after"],"statements":[[8,"route",[],[["@name"],[[34,7]]],[["default"],[{"statements":[[2,"\\n "],[8,"data-loader",[],[["@src"],[[30,[36,1],["/${partition}/${nspace}/${dc}/sessions/for-node/${node}",[30,[36,0],null,[["partition","nspace","dc","node"],[[32,1,["params","partition"]],[32,1,["params","nspace"]],[32,1,["params","dc"]],[32,1,["params","name"]]]]]],null]]],[["default"],[{"statements":[[2,"\\n\\n "],[8,"block-slot",[],[["@name"],["error"]],[["default"],[{"statements":[[2,"\\n "],[8,"app-error",[],[["@error","@login"],[[32,2,["error"]],[32,1,["model","app","login","open"]]]],null],[2,"\\n "]],"parameters":[]}]]],[2,"\\n\\n "],[8,"block-slot",[],[["@name"],["loaded"]],[["default"],[{"statements":[[2,"\\n"],[6,[37,8],[[32,2,["data"]]],null,[["default"],[{"statements":[[2," "],[10,"div"],[14,0,"tab-section"],[12],[2,"\\n "],[8,"data-writer",[],[["@sink","@type","@label","@ondelete"],[[30,[36,1],["/${partition}/${dc}/${nspace}/session/",[30,[36,0],null,[["partition","nspace","dc"],[[32,1,["params","partition"]],[32,1,["params","nspace"]],[32,1,["params","dc"]]]]]],null],"session","Lock Session",[34,2]]],[["default"],[{"statements":[[2,"\\n\\n "],[8,"block-slot",[],[["@name"],["removed"]],[["default"],[{"statements":[[2,"\\n "],[8,"consul/lock-session/notifications",[[4,[38,4],null,[["after"],[[30,[36,3],[[32,0],[32,8]],null]]]]],[["@type"],["remove"]],null],[2,"\\n "]],"parameters":[8]}]]],[2,"\\n\\n "],[8,"block-slot",[],[["@name"],["error"]],[["default"],[{"statements":[[2,"\\n "],[8,"consul/lock-session/notifications",[[4,[38,4],null,[["after"],[[30,[36,3],[[32,0],[32,6]],null]]]]],[["@type","@error"],["remove",[32,7]]],null],[2,"\\n "]],"parameters":[6,7]}]]],[2,"\\n\\n "],[8,"block-slot",[],[["@name"],["content"]],[["default"],[{"statements":[[2,"\\n\\n "],[8,"data-collection",[],[["@type","@items"],["session",[32,3]]],[["default"],[{"statements":[[2,"\\n\\n "],[8,[32,5,["Collection"]],[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[8,"consul/lock-session/list",[],[["@items","@ondelete"],[[32,5,["items"]],[32,4,["delete"]]]],null],[2,"\\n "]],"parameters":[]}]]],[2,"\\n\\n "],[8,[32,5,["Empty"]],[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[8,"empty-state",[],[["@login"],[[32,1,["model","app","login","open"]]]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["header"]],[["default"],[{"statements":[[2,"\\n "],[10,"h2"],[12],[2,"\\n "],[1,[30,[36,5],["routes.dc.nodes.show.sessions.empty.header"],[["items"],[[32,3,["length"]]]]]],[2,"\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["body"]],[["default"],[{"statements":[[2,"\\n "],[1,[30,[36,5],["routes.dc.nodes.show.sessions.empty.body"],[["htmlSafe"],[true]]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n\\n "],[8,"block-slot",[],[["@name"],["actions"]],[["default"],[{"statements":[[2,"\\n "],[10,"li"],[14,0,"docs-link"],[12],[2,"\\n "],[8,"action",[],[["@href","@external"],[[31,[[30,[36,6],["CONSUL_DOCS_URL"],null],"/internals/sessions.html"]],true]],[["default"],[{"statements":[[2,"\\n Documentation on Lock Sessions\\n "]],"parameters":[]}]]],[2,"\\n "],[13],[2,"\\n "],[10,"li"],[14,0,"learn-link"],[12],[2,"\\n "],[8,"action",[],[["@href","@external"],[[31,[[30,[36,6],["CONSUL_DOCS_LEARN_URL"],null],"/tutorials/consul/distributed-semaphore"]],true]],[["default"],[{"statements":[[2,"\\n Take the tutorial\\n "]],"parameters":[]}]]],[2,"\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n\\n "]],"parameters":[5]}]]],[2,"\\n\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[4]}]]],[2,"\\n "],[13],[2,"\\n"]],"parameters":[3]}]]],[2," "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[2]}]]],[2,"\\n"]],"parameters":[1]}]]],[2,"\\n"]],"hasEval":false,"upvars":["hash","uri","refresh-route","action","notification","t","env","routeName","let"]}',meta:{moduleName:"consul-ui/templates/dc/nodes/show/sessions.hbs"}}) -e.default=t})),define("consul-ui/templates/dc/nspaces/edit",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -var t=Ember.HTMLBars.template({id:"vtIZmmQj",block:'{"symbols":["route","loader","dc","partition","nspace","item","create"],"statements":[[8,"route",[],[["@name"],[[34,4]]],[["default"],[{"statements":[[2,"\\n "],[8,"data-loader",[],[["@src"],[[30,[36,7],["/${partition}/${nspace}/${dc}/namespace/${id}",[30,[36,6],null,[["partition","nspace","dc","id"],[[32,1,["params","partition"]],[32,1,["params","nspace"]],[32,1,["params","dc"]],[30,[36,5],[[32,1,["params","name"]],""],null]]]]],null]]],[["default"],[{"statements":[[2,"\\n\\n "],[8,"block-slot",[],[["@name"],["error"]],[["default"],[{"statements":[[2,"\\n "],[8,"app-error",[],[["@error","@login"],[[32,2,["error"]],[32,1,["model","app","login","open"]]]],null],[2,"\\n "]],"parameters":[]}]]],[2,"\\n\\n "],[8,"block-slot",[],[["@name"],["loaded"]],[["default"],[{"statements":[[2,"\\n"],[6,[37,8],[[32,1,["params","dc"]],[32,1,["params","partition"]],[32,1,["params","nspace"]],[32,2,["data"]],[32,2,["data","isNew"]]],null,[["default"],[{"statements":[[2," "],[8,"app-view",[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["breadcrumbs"]],[["default"],[{"statements":[[2,"\\n "],[10,"ol"],[12],[2,"\\n "],[10,"li"],[12],[10,"a"],[15,6,[30,[36,0],["dc.nspaces"],null]],[12],[2,"All Namespaces"],[13],[13],[2,"\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["header"]],[["default"],[{"statements":[[2,"\\n "],[10,"h1"],[12],[2,"\\n "],[8,[32,1,["Title"]],[],[["@title"],[[30,[36,2],[[32,7],"New Namespace",[30,[36,1],["Edit ",[32,6,["Name"]]],null]],null]]],null],[2,"\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["actions"]],[["default"],[{"statements":[[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["content"]],[["default"],[{"statements":[[2,"\\n "],[8,"consul/nspace/form",[],[["@item","@dc","@nspace","@partition","@onsubmit"],[[32,6],[32,1,["params","dc"]],[32,1,["params","nspace"]],[32,1,["params","partition"]],[30,[36,3],["dc.nspaces.index"],null]]],null],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[3,4,5,6,7]}]]],[2," "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[2]}]]],[2,"\\n"]],"parameters":[1]}]]],[2,"\\n"]],"hasEval":false,"upvars":["href-to","concat","if","transition-to","routeName","or","hash","uri","let"]}',meta:{moduleName:"consul-ui/templates/dc/nspaces/edit.hbs"}}) -e.default=t})),define("consul-ui/templates/dc/nspaces/index",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -var t=Ember.HTMLBars.template({id:"0ldYIvBg",block:'{"symbols":["route","loader","sort","filters","items","writer","collection","after"],"statements":[[8,"route",[],[["@name"],[[34,12]]],[["default"],[{"statements":[[2,"\\n "],[8,"data-loader",[],[["@src"],[[30,[36,8],["/${partition}/${nspace}/${dc}/namespaces",[30,[36,7],null,[["partition","nspace","dc"],[[32,1,["params","partition"]],[32,1,["params","nspace"]],[32,1,["params","dc"]]]]]],null]]],[["default"],[{"statements":[[2,"\\n\\n "],[8,"block-slot",[],[["@name"],["error"]],[["default"],[{"statements":[[2,"\\n "],[8,"app-error",[],[["@error","@login"],[[32,2,["error"]],[32,1,["model","app","login","open"]]]],null],[2,"\\n "]],"parameters":[]}]]],[2,"\\n\\n "],[8,"block-slot",[],[["@name"],["loaded"]],[["default"],[{"statements":[[2,"\\n"],[6,[37,19],[[30,[36,7],null,[["value","change"],[[30,[36,18],[[35,17],"Name:asc"],null],[30,[36,2],[[32,0],[30,[36,1],[[35,17]],null]],[["value"],["target.selected"]]]]]],[30,[36,7],null,[["searchproperty"],[[30,[36,7],null,[["value","change","default"],[[30,[36,5],[[30,[36,16],[[35,14],[29]],null],[30,[36,15],[[35,14],","],null],[35,13]],null],[30,[36,2],[[32,0],[30,[36,1],[[35,14]],null]],[["value"],["target.selectedItems"]]],[35,13]]]]]]],[32,2,["data"]]],null,[["default"],[{"statements":[[2,"\\n "],[8,"app-view",[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["header"]],[["default"],[{"statements":[[2,"\\n "],[10,"h1"],[12],[2,"\\n "],[8,[32,1,["Title"]],[],[["@title"],["Namespaces"]],null],[2,"\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["actions"]],[["default"],[{"statements":[[2,"\\n"],[6,[37,5],[[30,[36,4],["create nspaces"],null]],null,[["default"],[{"statements":[[2," "],[10,"a"],[15,6,[31,[[30,[36,3],["dc.nspaces.create"],null]]]],[14,0,"type-create"],[12],[2,"Create"],[13],[2,"\\n"]],"parameters":[]}]]],[2," "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["toolbar"]],[["default"],[{"statements":[[2,"\\n"],[6,[37,5],[[30,[36,6],[[32,5,["length"]],0],null]],null,[["default"],[{"statements":[[2," "],[8,"consul/nspace/search-bar",[],[["@search","@onsearch","@sort","@filter"],[[34,0],[30,[36,2],[[32,0],[30,[36,1],[[35,0]],null]],[["value"],["target.value"]]],[32,3],[32,4]]],null],[2,"\\n"]],"parameters":[]}]]],[2," "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["content"]],[["default"],[{"statements":[[2,"\\n "],[8,"data-writer",[],[["@sink","@type","@label","@ondelete"],[[30,[36,8],["/${partition}/${dc}/${nspace}/nspace/",[30,[36,7],null,[["partition","nspace","dc"],[[32,1,["params","partition"]],[32,1,["params","nspace"]],[32,1,["params","dc"]]]]]],null],"nspace","Namespace",[34,9]]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["removed"]],[["default"],[{"statements":[[2,"\\n "],[8,"consul/nspace/notifications",[[4,[38,10],null,[["after"],[[30,[36,2],[[32,0],[32,8]],null]]]]],[["@type"],["remove"]],null],[2,"\\n "]],"parameters":[8]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["content"]],[["default"],[{"statements":[[2,"\\n "],[8,"data-collection",[],[["@type","@sort","@filters","@search","@items"],["nspace",[32,3,["value"]],[32,4],[34,0],[32,5]]],[["default"],[{"statements":[[2,"\\n "],[8,[32,7,["Collection"]],[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[8,"consul/nspace/list",[],[["@items","@ondelete"],[[32,7,["items"]],[32,6,["delete"]]]],null],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,[32,7,["Empty"]],[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[8,"empty-state",[],[["@login"],[[32,1,["model","app","login","open"]]]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["header"]],[["default"],[{"statements":[[2,"\\n "],[10,"h2"],[12],[2,"\\n"],[6,[37,5],[[30,[36,6],[[32,5,["length"]],0],null]],null,[["default","else"],[{"statements":[[2," No namespaces found\\n"]],"parameters":[]},{"statements":[[2," Welcome to Namespaces\\n"]],"parameters":[]}]]],[2," "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["body"]],[["default"],[{"statements":[[2,"\\n "],[10,"p"],[12],[2,"\\n"],[6,[37,5],[[30,[36,6],[[32,5,["length"]],0],null]],null,[["default","else"],[{"statements":[[2," No namespaces where found matching that search, or you may not have access to view the namespaces you are searching for.\\n"]],"parameters":[]},{"statements":[[2," There don\'t seem to be any namespaces, or you may not have access to view namespaces yet.\\n"]],"parameters":[]}]]],[2," "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["actions"]],[["default"],[{"statements":[[2,"\\n "],[10,"li"],[14,0,"docs-link"],[12],[2,"\\n "],[10,"a"],[15,6,[31,[[30,[36,11],["CONSUL_DOCS_URL"],null],"/commands/namespace"]]],[14,"rel","noopener noreferrer"],[14,"target","_blank"],[12],[2,"Documentation on namespaces"],[13],[2,"\\n "],[13],[2,"\\n "],[10,"li"],[14,0,"learn-link"],[12],[2,"\\n "],[10,"a"],[15,6,[31,[[30,[36,11],["CONSUL_DOCS_LEARN_URL"],null],"/consul/namespaces/secure-namespaces"]]],[14,"rel","noopener noreferrer"],[14,"target","_blank"],[12],[2,"Read the guide"],[13],[2,"\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[7]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[6]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[3,4,5]}]]],[2," "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[2]}]]],[2,"\\n"]],"parameters":[1]}]]],[2,"\\n"]],"hasEval":false,"upvars":["search","mut","action","href-to","can","if","gt","hash","uri","refresh-route","notification","env","routeName","searchProperties","searchproperty","split","not-eq","sortBy","or","let"]}',meta:{moduleName:"consul-ui/templates/dc/nspaces/index.hbs"}}) -e.default=t})),define("consul-ui/templates/dc/partitions/edit",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -var t=Ember.HTMLBars.template({id:"ENp7Mr/r",block:'{"symbols":["route","loader","dc","partition","nspace","item"],"statements":[[8,"route",[],[["@name"],[[34,5]]],[["default"],[{"statements":[[2,"\\n "],[8,"data-loader",[],[["@src"],[[30,[36,8],["/${partition}/${nspace}/${dc}/partition/${id}",[30,[36,7],null,[["partition","nspace","dc","id"],[[32,1,["params","partition"]],[32,1,["params","nspace"]],[32,1,["params","dc"]],[30,[36,6],[[32,1,["params","name"]],""],null]]]]],null]]],[["default"],[{"statements":[[2,"\\n\\n "],[8,"block-slot",[],[["@name"],["error"]],[["default"],[{"statements":[[2,"\\n "],[8,"app-error",[],[["@error","@login"],[[32,2,["error"]],[32,1,["model","app","login","open"]]]],null],[2,"\\n "]],"parameters":[]}]]],[2,"\\n\\n "],[8,"block-slot",[],[["@name"],["loaded"]],[["default"],[{"statements":[[2,"\\n"],[6,[37,9],[[32,1,["params","dc"]],[32,1,["params","partition"]],[32,1,["params","nspace"]],[32,2,["data"]]],null,[["default"],[{"statements":[[2," "],[8,"app-view",[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["breadcrumbs"]],[["default"],[{"statements":[[2,"\\n "],[10,"ol"],[12],[2,"\\n "],[10,"li"],[12],[10,"a"],[15,6,[30,[36,0],["dc.partitions"],null]],[12],[2,"All Admin Partitions"],[13],[13],[2,"\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["header"]],[["default"],[{"statements":[[2,"\\n "],[10,"h1"],[12],[2,"\\n "],[8,[32,1,["Title"]],[],[["@title"],[[30,[36,3],[[30,[36,2],["new partition"],[["item"],[[32,6]]]],"New Partition",[30,[36,1],["Edit ",[32,6,["Name"]]],null]],null]]],null],[2,"\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["content"]],[["default"],[{"statements":[[2,"\\n\\n "],[8,"consul/partition/form",[],[["@item","@dc","@nspace","@partition","@onsubmit"],[[32,6],[32,1,["params","dc"]],[32,1,["params","nspace"]],[32,1,["params","partition"]],[30,[36,4],["dc.partitions.index"],null]]],null],[2,"\\n\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[3,4,5,6]}]]],[2," "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[2]}]]],[2,"\\n"]],"parameters":[1]}]]],[2,"\\n"]],"hasEval":false,"upvars":["href-to","concat","is","if","transition-to","routeName","or","hash","uri","let"]}',meta:{moduleName:"consul-ui/templates/dc/partitions/edit.hbs"}}) -e.default=t})),define("consul-ui/templates/dc/partitions/index",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -var t=Ember.HTMLBars.template({id:"noxbZ0Vh",block:'{"symbols":["route","loader","sort","filters","items","writer","collection","after"],"statements":[[8,"route",[],[["@name"],[[34,12]]],[["default"],[{"statements":[[2,"\\n "],[8,"data-loader",[],[["@src"],[[30,[36,8],["/${partition}/${nspace}/${dc}/partitions",[30,[36,7],null,[["partition","nspace","dc"],[[32,1,["params","partition"]],[32,1,["params","nspace"]],[32,1,["params","dc"]]]]]],null]]],[["default"],[{"statements":[[2,"\\n\\n "],[8,"block-slot",[],[["@name"],["error"]],[["default"],[{"statements":[[2,"\\n "],[8,"app-error",[],[["@error","@login"],[[32,2,["error"]],[32,1,["model","app","login","open"]]]],null],[2,"\\n "]],"parameters":[]}]]],[2,"\\n\\n "],[8,"block-slot",[],[["@name"],["loaded"]],[["default"],[{"statements":[[2,"\\n"],[6,[37,19],[[30,[36,7],null,[["value","change"],[[30,[36,18],[[35,17],"Name:asc"],null],[30,[36,2],[[32,0],[30,[36,1],[[35,17]],null]],[["value"],["target.selected"]]]]]],[30,[36,7],null,[["searchproperty"],[[30,[36,7],null,[["value","change","default"],[[30,[36,5],[[30,[36,16],[[35,14],[29]],null],[30,[36,15],[[35,14],","],null],[35,13]],null],[30,[36,2],[[32,0],[30,[36,1],[[35,14]],null]],[["value"],["target.selectedItems"]]],[35,13]]]]]]],[32,2,["data"]]],null,[["default"],[{"statements":[[2,"\\n "],[8,"app-view",[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["header"]],[["default"],[{"statements":[[2,"\\n "],[10,"h1"],[12],[2,"\\n "],[8,[32,1,["Title"]],[],[["@title"],["Admin Partitions"]],null],[2,"\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["actions"]],[["default"],[{"statements":[[2,"\\n"],[6,[37,5],[[30,[36,4],["create partitions"],null]],null,[["default"],[{"statements":[[2," "],[10,"a"],[14,0,"type-create"],[15,6,[31,[[30,[36,3],["dc.partitions.create"],null]]]],[12],[2,"\\n Create\\n "],[13],[2,"\\n"]],"parameters":[]}]]],[2," "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["toolbar"]],[["default"],[{"statements":[[2,"\\n"],[6,[37,5],[[30,[36,6],[[32,5,["length"]],0],null]],null,[["default"],[{"statements":[[2," "],[8,"consul/partition/search-bar",[],[["@search","@onsearch","@sort","@filter"],[[34,0],[30,[36,2],[[32,0],[30,[36,1],[[35,0]],null]],[["value"],["target.value"]]],[32,3],[32,4]]],null],[2,"\\n"]],"parameters":[]}]]],[2," "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["content"]],[["default"],[{"statements":[[2,"\\n "],[8,"data-writer",[],[["@sink","@type","@label","@ondelete"],[[30,[36,8],["/${partition}/${dc}/${nspace}/partition/",[30,[36,7],null,[["partition","nspace","dc"],[[32,1,["params","partition"]],[32,1,["params","nspace"]],[32,1,["params","dc"]]]]]],null],"partition","Partition",[34,9]]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["removed"]],[["default"],[{"statements":[[2,"\\n "],[8,"consul/partition/notifications",[[4,[38,10],null,[["after"],[[30,[36,2],[[32,0],[32,8]],null]]]]],[["@type"],["remove"]],null],[2,"\\n "]],"parameters":[8]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["content"]],[["default"],[{"statements":[[2,"\\n "],[8,"data-collection",[],[["@type","@sort","@filters","@search","@items"],["nspace",[32,3,["value"]],[32,4],[34,0],[32,5]]],[["default"],[{"statements":[[2,"\\n "],[8,[32,7,["Collection"]],[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[8,"consul/partition/list",[],[["@items","@ondelete"],[[32,7,["items"]],[32,6,["delete"]]]],null],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,[32,7,["Empty"]],[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[8,"empty-state",[],[["@login"],[[32,1,["model","app","login","open"]]]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["header"]],[["default"],[{"statements":[[2,"\\n "],[10,"h2"],[12],[2,"\\n"],[6,[37,5],[[30,[36,6],[[32,5,["length"]],0],null]],null,[["default","else"],[{"statements":[[2," No partitions found\\n"]],"parameters":[]},{"statements":[[2," Welcome to Partitions\\n"]],"parameters":[]}]]],[2," "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["body"]],[["default"],[{"statements":[[2,"\\n "],[10,"p"],[12],[2,"\\n"],[6,[37,5],[[30,[36,6],[[32,5,["length"]],0],null]],null,[["default","else"],[{"statements":[[2," No partitions where found matching that search, or you may not have access to view the namespaces you are searching for.\\n"]],"parameters":[]},{"statements":[[2," There don\'t seem to be any partitions, or you may not have access to view partitions yet.\\n"]],"parameters":[]}]]],[2," "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["actions"]],[["default"],[{"statements":[[2,"\\n "],[10,"li"],[14,0,"docs-link"],[12],[2,"\\n "],[8,"action",[],[["@href","@external"],[[31,[[30,[36,11],["CONSUL_DOCS_URL"],null],"/enterprise/admin-partitions"]],true]],[["default"],[{"statements":[[2,"\\n Documentation on Admin Partitions\\n "]],"parameters":[]}]]],[2,"\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[7]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[6]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[3,4,5]}]]],[2," "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[2]}]]],[2,"\\n"]],"parameters":[1]}]]],[2,"\\n"]],"hasEval":false,"upvars":["search","mut","action","href-to","can","if","gt","hash","uri","refresh-route","notification","env","routeName","searchProperties","searchproperty","split","not-eq","sortBy","or","let"]}',meta:{moduleName:"consul-ui/templates/dc/partitions/index.hbs"}}) -e.default=t})),define("consul-ui/templates/dc/routing-config",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -var t=Ember.HTMLBars.template({id:"mrMbnEYc",block:'{"symbols":["route","loader","item"],"statements":[[8,"route",[],[["@name"],[[34,2]]],[["default"],[{"statements":[[2,"\\n\\n "],[8,"data-loader",[],[["@src"],[[30,[36,4],["/${partition}/${nspace}/${dc}/discovery-chain/${name}",[30,[36,3],null,[["partition","nspace","dc","name"],[[32,1,["params","partition"]],[32,1,["params","nspace"]],[32,1,["params","dc"]],[32,1,["params","name"]]]]]],null]]],[["default"],[{"statements":[[2,"\\n\\n "],[8,"block-slot",[],[["@name"],["error"]],[["default"],[{"statements":[[2,"\\n "],[8,"app-error",[],[["@error","@login"],[[32,2,["error"]],[32,1,["model","app","login","open"]]]],null],[2,"\\n "]],"parameters":[]}]]],[2,"\\n\\n "],[8,"block-slot",[],[["@name"],["loaded"]],[["default"],[{"statements":[[2,"\\n"],[6,[37,5],[[32,2,["data"]]],null,[["default"],[{"statements":[[8,"app-view",[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["breadcrumbs"]],[["default"],[{"statements":[[2,"\\n "],[10,"ol"],[12],[2,"\\n "],[10,"li"],[12],[10,"a"],[15,6,[30,[36,0],["dc.services"],null]],[12],[2,"All Services"],[13],[13],[2,"\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["header"]],[["default"],[{"statements":[[2,"\\n "],[10,"h1"],[12],[2,"\\n "],[8,[32,1,["Title"]],[],[["@title"],[[32,3,["Chain","ServiceName"]]]],null],[2,"\\n "],[13],[2,"\\n "],[8,"consul/source",[],[["@source","@withInfo"],[[30,[36,1],["routes.dc.routing-config.source"],null],true]],null],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["content"]],[["default"],[{"statements":[[2,"\\n "],[10,"div"],[14,0,"container"],[12],[2,"\\n "],[8,"consul/discovery-chain",[],[["@chain"],[[32,3,["Chain"]]]],null],[2,"\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[]}]]],[2,"\\n"]],"parameters":[3]}]]],[2," "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[2]}]]],[2,"\\n"]],"parameters":[1]}]]],[2,"\\n"]],"hasEval":false,"upvars":["href-to","t","routeName","hash","uri","let"]}',meta:{moduleName:"consul-ui/templates/dc/routing-config.hbs"}}) -e.default=t})),define("consul-ui/templates/dc/services/index",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -var t=Ember.HTMLBars.template({id:"LK9P+jx5",block:'{"symbols":["route","api","sort","filters","items","partition","nspace","collection","items"],"statements":[[8,"route",[],[["@name"],[[34,11]]],[["default"],[{"statements":[[2,"\\n\\n "],[8,"data-loader",[],[["@src"],[[30,[36,13],["/${partition}/${nspace}/${dc}/services",[30,[36,12],null,[["partition","nspace","dc"],[[32,1,["params","partition"]],[32,1,["params","nspace"]],[32,1,["params","dc"]]]]]],null]]],[["default"],[{"statements":[[2,"\\n\\n "],[8,"block-slot",[],[["@name"],["error"]],[["default"],[{"statements":[[2,"\\n "],[8,"app-error",[],[["@error","@login"],[[32,2,["error"]],[32,1,["model","app","login","open"]]]],null],[2,"\\n "]],"parameters":[]}]]],[2,"\\n\\n "],[8,"block-slot",[],[["@name"],["loaded"]],[["default"],[{"statements":[[2,"\\n\\n"],[6,[37,5],[[30,[36,12],null,[["value","change"],[[30,[36,14],[[35,23],"Status:asc"],null],[30,[36,3],[[32,0],[30,[36,2],[[35,23]],null]],[["value"],["target.selected"]]]]]],[30,[36,12],null,[["status","kind","source","searchproperty"],[[30,[36,12],null,[["value","change"],[[30,[36,8],[[35,22],[30,[36,18],[[35,22],","],null],[29]],null],[30,[36,3],[[32,0],[30,[36,2],[[35,22]],null]],[["value"],["target.selectedItems"]]]]]],[30,[36,12],null,[["value","change"],[[30,[36,8],[[35,21],[30,[36,18],[[35,21],","],null],[29]],null],[30,[36,3],[[32,0],[30,[36,2],[[35,21]],null]],[["value"],["target.selectedItems"]]]]]],[30,[36,12],null,[["value","change"],[[30,[36,8],[[35,20],[30,[36,18],[[35,20],","],null],[29]],null],[30,[36,3],[[32,0],[30,[36,2],[[35,20]],null]],[["value"],["target.selectedItems"]]]]]],[30,[36,12],null,[["value","change","default"],[[30,[36,8],[[30,[36,19],[[35,17],[29]],null],[30,[36,18],[[35,17],","],null],[35,16]],null],[30,[36,3],[[32,0],[30,[36,2],[[35,17]],null]],[["value"],["target.selectedItems"]]],[35,16]]]]]]],[30,[36,15],["Kind","connect-proxy",[32,2,["data"]]],null],[30,[36,14],[[32,1,["params","partition"]],[32,1,["model","user","token","Partition"]],"default"],null],[30,[36,14],[[32,1,["params","nspace"]],[32,1,["model","user","token","Namespace"]],"default"],null]],null,[["default"],[{"statements":[[2,"\\n "],[8,"app-view",[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["header"]],[["default"],[{"statements":[[2,"\\n "],[10,"h1"],[12],[2,"\\n "],[8,[32,1,["Title"]],[],[["@title"],["Services"]],null],[2," "],[10,"em"],[12],[1,[30,[36,6],[[32,5,["length"]]],null]],[2," total"],[13],[2,"\\n "],[13],[2,"\\n "],[10,"label"],[14,"for","toolbar-toggle"],[12],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["toolbar"]],[["default"],[{"statements":[[2,"\\n"],[6,[37,8],[[30,[36,7],[[32,5,["length"]],0],null]],null,[["default"],[{"statements":[[6,[37,5],[[30,[36,4],[[32,5]],null]],null,[["default"],[{"statements":[[2," "],[8,"consul/service/search-bar",[],[["@sources","@partitions","@partition","@search","@onsearch","@sort","@filter"],[[30,[36,0],[[32,9],"ExternalSources"],null],[30,[36,0],[[32,9],"Partitions"],null],[32,6],[34,1],[30,[36,3],[[32,0],[30,[36,2],[[35,1]],null]],[["value"],["target.value"]]],[32,3],[32,4]]],null],[2,"\\n"]],"parameters":[9]}]]]],"parameters":[]}]]],[2," "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["content"]],[["default"],[{"statements":[[2,"\\n "],[8,"data-collection",[],[["@type","@sort","@filters","@search","@items"],["service",[32,3,["value"]],[32,4],[34,1],[32,5]]],[["default"],[{"statements":[[2,"\\n "],[8,[32,8,["Collection"]],[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[8,"consul/service/list",[],[["@items","@partition"],[[32,8,["items"]],[32,6]]],[["default"],[{"statements":[[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,[32,8,["Empty"]],[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[8,"empty-state",[],[["@login"],[[32,1,["model","app","login","open"]]]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["header"]],[["default"],[{"statements":[[2,"\\n "],[10,"h2"],[12],[2,"\\n "],[1,[30,[36,9],["routes.dc.services.index.empty.header"],[["items"],[[32,5,["length"]]]]]],[2,"\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["body"]],[["default"],[{"statements":[[2,"\\n "],[1,[30,[36,9],["routes.dc.services.index.empty.body"],[["items","htmlSafe"],[[32,5,["length"]],true]]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["actions"]],[["default"],[{"statements":[[2,"\\n "],[10,"li"],[14,0,"docs-link"],[12],[2,"\\n "],[8,"action",[],[["@href","@external"],[[31,[[30,[36,10],["CONSUL_DOCS_URL"],null],"/commands/services"]],true]],[["default"],[{"statements":[[2,"\\n Documentation on Services\\n "]],"parameters":[]}]]],[2,"\\n "],[13],[2,"\\n "],[10,"li"],[14,0,"learn-link"],[12],[2,"\\n "],[8,"action",[],[["@href","@external"],[[31,[[30,[36,10],["CONSUL_DOCS_LEARN_URL"],null],"/consul/getting-started/services"]],true]],[["default"],[{"statements":[[2,"\\n Take the tutorial\\n "]],"parameters":[]}]]],[2,"\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[8]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n\\n "]],"parameters":[]}]]],[2,"\\n\\n"]],"parameters":[3,4,5,6,7]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[2]}]]],[2,"\\n"]],"parameters":[1]}]]],[2,"\\n"]],"hasEval":false,"upvars":["get","search","mut","action","collection","let","format-number","gt","if","t","env","routeName","hash","uri","or","reject-by","searchProperties","searchproperty","split","not-eq","source","kind","status","sortBy"]}',meta:{moduleName:"consul-ui/templates/dc/services/index.hbs"}}) -e.default=t})),define("consul-ui/templates/dc/services/instance",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -var t=Ember.HTMLBars.template({id:"N+/8UsgU",block:'{"symbols":["route","loader","item","o","address","meta","after","notice","notice","notice"],"statements":[[8,"route",[],[["@name"],[[34,14]]],[["default"],[{"statements":[[2,"\\n "],[8,"data-loader",[],[["@src"],[[30,[36,1],["/${partition}/${nspace}/${dc}/service-instance/${id}/${node}/${name}",[30,[36,0],null,[["partition","nspace","dc","id","node","name"],[[32,1,["params","partition"]],[32,1,["params","nspace"]],[32,1,["params","dc"]],[32,1,["params","id"]],[32,1,["params","node"]],[32,1,["params","name"]]]]]],null]]],[["default"],[{"statements":[[2,"\\n\\n "],[8,"block-slot",[],[["@name"],["error"]],[["default"],[{"statements":[[2,"\\n "],[8,"app-error",[],[["@error","@login"],[[32,2,["error"]],[32,1,["model","app","login","open"]]]],null],[2,"\\n "]],"parameters":[]}]]],[2,"\\n\\n "],[8,"block-slot",[],[["@name"],["disconnected"]],[["default"],[{"statements":[[2,"\\n"],[6,[37,6],[[30,[36,8],[[32,2,["error","status"]],"404"],null]],null,[["default","else"],[{"statements":[[2," "],[8,"notice",[[24,0,"notification-update"],[4,[38,18],null,[["sticky"],[true]]]],[["@type"],["warning"]],[["default"],[{"statements":[[2,"\\n "],[8,[32,10,["Header"]],[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[10,"strong"],[12],[2,"Warning!"],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,[32,10,["Body"]],[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[10,"p"],[12],[2,"\\n This service has been deregistered and no longer exists in the catalog.\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[10]}]]],[2,"\\n"]],"parameters":[]},{"statements":[[6,[37,6],[[30,[36,8],[[32,2,["error","status"]],"403"],null]],null,[["default","else"],[{"statements":[[2," "],[8,"notice",[[24,0,"notification-update"],[4,[38,18],null,[["sticky"],[true]]]],[["@type"],["error"]],[["default"],[{"statements":[[2,"\\n "],[8,[32,9,["Header"]],[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[10,"strong"],[12],[2,"Error!"],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,[32,9,["Body"]],[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[10,"p"],[12],[2,"\\n You no longer have access to this service\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[9]}]]],[2,"\\n"]],"parameters":[]},{"statements":[[2," "],[8,"notice",[[24,0,"notification-update"],[4,[38,18],null,[["sticky"],[true]]]],[["@type"],["error"]],[["default"],[{"statements":[[2,"\\n "],[8,[32,8,["Header"]],[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[10,"strong"],[12],[2,"Warning!"],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,[32,8,["Body"]],[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[10,"p"],[12],[2,"\\n An error was returned whilst loading this data, refresh to try again.\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[8]}]]],[2,"\\n "]],"parameters":[]}]]]],"parameters":[]}]]],[2," "]],"parameters":[7]}]]],[2,"\\n\\n "],[8,"block-slot",[],[["@name"],["loaded"]],[["default"],[{"statements":[[2,"\\n"],[6,[37,10],[[32,2,["data"]]],null,[["default"],[{"statements":[[6,[37,6],[[32,3,["IsOrigin"]]],null,[["default"],[{"statements":[[2," "],[8,"data-source",[],[["@src","@onchange"],[[30,[36,1],["/${partition}/${nspace}/${dc}/proxy-instance/${id}/${node}/${name}",[30,[36,0],null,[["partition","nspace","dc","id","node","name"],[[32,1,["params","partition"]],[32,1,["params","nspace"]],[32,1,["params","dc"]],[32,1,["params","id"]],[32,1,["params","node"]],[32,1,["params","name"]]]]]],null],[30,[36,4],[[32,0],[30,[36,3],[[35,5]],null]],[["value"],["data"]]]]],[["default"],[{"statements":[[2,"\\n"],[6,[37,6],[[32,6,["data","ServiceID"]]],null,[["default"],[{"statements":[[2," "],[8,"data-source",[],[["@src","@onchange"],[[30,[36,1],["/${partition}/${nspace}/${dc}/service-instance/${id}/${node}/${name}",[30,[36,0],null,[["partition","nspace","dc","id","node","name"],[[32,1,["params","partition"]],[32,1,["params","nspace"]],[32,1,["params","dc"]],[32,6,["data","ServiceID"]],[32,6,["data","NodeName"]],[32,6,["data","ServiceName"]]]]]],null],[30,[36,4],[[32,0],[30,[36,3],[[35,2]],null]],[["value"],["data"]]]]],null],[2,"\\n"]],"parameters":[]}]]],[2," "]],"parameters":[6]}]]],[2,"\\n"]],"parameters":[]}]]],[2," "],[8,"app-view",[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["breadcrumbs"]],[["default"],[{"statements":[[2,"\\n "],[10,"ol"],[12],[2,"\\n "],[10,"li"],[12],[10,"a"],[15,6,[30,[36,7],["dc.services"],null]],[12],[2,"All Services"],[13],[13],[2,"\\n "],[10,"li"],[12],[10,"a"],[15,6,[30,[36,7],["dc.services.show"],null]],[12],[2,"Service ("],[1,[32,3,["Service","Service"]]],[2,")"],[13],[13],[2,"\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["header"]],[["default"],[{"statements":[[2,"\\n "],[10,"h1"],[12],[2,"\\n "],[8,[32,1,["Title"]],[],[["@title"],[[32,3,["Service","ID"]]]],null],[2,"\\n "],[13],[2,"\\n "],[8,"consul/external-source",[],[["@item","@withInfo"],[[32,3],true]],null],[2,"\\n "],[8,"consul/kind",[],[["@item","@withInfo"],[[32,3],true]],null],[2,"\\n"],[6,[37,6],[[30,[36,8],[[35,5,["ServiceProxy","Mode"]],"transparent"],null]],null,[["default"],[{"statements":[[2," "],[8,"consul/transparent-proxy",[],[[],[]],null],[2,"\\n"]],"parameters":[]}]]],[2," "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["nav"]],[["default"],[{"statements":[[2,"\\n "],[10,"dl"],[12],[2,"\\n "],[10,"dt"],[12],[2,"Service Name"],[13],[2,"\\n "],[10,"dd"],[12],[10,"a"],[15,6,[31,[[30,[36,7],["dc.services.show",[32,3,["Service","Service"]]],null]]]],[12],[1,[32,3,["Service","Service"]]],[13],[13],[2,"\\n "],[13],[2,"\\n "],[10,"dl"],[12],[2,"\\n "],[10,"dt"],[12],[2,"Node Name"],[13],[2,"\\n "],[10,"dd"],[12],[10,"a"],[15,6,[31,[[30,[36,7],["dc.nodes.show",[32,3,["Node","Node"]]],null]]]],[12],[1,[32,3,["Node","Node"]]],[13],[13],[2,"\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["actions"]],[["default"],[{"statements":[[2,"\\n"],[6,[37,10],[[30,[36,9],[[32,3,["Service","Address"]],[32,3,["Node","Address"]]],null]],null,[["default"],[{"statements":[[2," "],[8,"copy-button",[],[["@value","@name"],[[32,5],"Address"]],[["default"],[{"statements":[[1,[32,5]]],"parameters":[]}]]],[2,"\\n"]],"parameters":[5]}]]],[2," "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["content"]],[["default"],[{"statements":[[2,"\\n "],[8,"tab-nav",[],[["@items"],[[30,[36,13],[[30,[36,12],[[30,[36,0],null,[["label","href","selected"],["Health Checks",[30,[36,7],["dc.services.instance.healthchecks"],null],[30,[36,11],["dc.services.instance.healthchecks"],null]]]],[30,[36,6],[[30,[36,8],[[32,3,["Service","Kind"]],"mesh-gateway"],null],[30,[36,0],null,[["label","href","selected"],["Addresses",[30,[36,7],["dc.services.instance.addresses"],null],[30,[36,11],["dc.services.instance.addresses"],null]]]]],null],[30,[36,6],[[35,2],[30,[36,0],null,[["label","href","selected"],["Upstreams",[30,[36,7],["dc.services.instance.upstreams"],null],[30,[36,11],["dc.services.instance.upstreams"],null]]]]],null],[30,[36,6],[[35,2],[30,[36,0],null,[["label","href","selected"],["Exposed Paths",[30,[36,7],["dc.services.instance.exposedpaths"],null],[30,[36,11],["dc.services.instance.exposedpaths"],null]]]]],null],[30,[36,0],null,[["label","href","selected"],["Tags & Meta",[30,[36,7],["dc.services.instance.metadata"],null],[30,[36,11],["dc.services.instance.metadata"],null]]]]],null]],null]]],null],[2,"\\n "],[8,"outlet",[],[["@name","@model"],[[34,14],[30,[36,15],[[30,[36,0],null,[["proxy","meta","item"],[[35,2],[35,5],[32,3]]]],[32,1,["model"]]],null]]],[["default"],[{"statements":[[2,"\\n "],[1,[30,[36,17],[[30,[36,16],null,null]],null]],[2,"\\n "]],"parameters":[4]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[3]}]]],[2," "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[2]}]]],[2,"\\n"]],"parameters":[1]}]]]],"hasEval":false,"upvars":["hash","uri","proxy","mut","action","meta","if","href-to","eq","or","let","is-href","array","compact","routeName","assign","-outlet","component","notification"]}',meta:{moduleName:"consul-ui/templates/dc/services/instance.hbs"}}) -e.default=t})),define("consul-ui/templates/dc/services/instance/addresses",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -var t=Ember.HTMLBars.template({id:"pc97C5QS",block:'{"symbols":["route","items","taggedAddress","index","address"],"statements":[[8,"route",[],[["@name"],[[34,7]]],[["default"],[{"statements":[[2,"\\n"],[6,[37,9],[[30,[36,8],[[32,1,["model","item","Service","TaggedAddresses"]]],null]],null,[["default"],[{"statements":[[2," "],[10,"div"],[14,0,"tab-section"],[12],[2,"\\n"],[6,[37,4],[[30,[36,6],[[32,2,["length"]],0],null]],null,[["default","else"],[{"statements":[[2," "],[8,"tabular-collection",[[24,0,"consul-tagged-addresses"]],[["@items"],[[32,2]]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["header"]],[["default"],[{"statements":[[2,"\\n "],[10,"th"],[12],[2,"Tag"],[13],[2,"\\n "],[10,"th"],[12],[2,"Address"],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["row"]],[["default"],[{"statements":[[2,"\\n"],[6,[37,5],[[30,[36,0],[1,[32,3]],null]],null,[["default"],[{"statements":[[2," "],[10,"td"],[12],[2,"\\n "],[1,[30,[36,0],[0,[32,3]],null]],[6,[37,4],[[30,[36,3],[[30,[36,2],[[32,5,["Address"]],[35,1,["Address"]]],null],[30,[36,2],[[32,5,["Port"]],[35,1,["Port"]]],null]],null]],null,[["default"],[{"statements":[[2," "],[10,"em"],[12],[2,"(default)"],[13]],"parameters":[]}]]],[2,"\\n "],[13],[2,"\\n "],[10,"td"],[12],[2,"\\n "],[1,[32,5,["Address"]]],[2,":"],[1,[32,5,["Port"]]],[2,"\\n "],[13],[2,"\\n"]],"parameters":[5]}]]],[2," "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[3,4]}]]],[2,"\\n"]],"parameters":[]},{"statements":[[2," "],[10,"p"],[12],[2,"\\n There are no additional addresses.\\n "],[13],[2,"\\n"]],"parameters":[]}]]],[2," "],[13],[2,"\\n"]],"parameters":[2]}]]]],"parameters":[1]}]]],[2,"\\n"]],"hasEval":false,"upvars":["object-at","item","eq","and","if","with","gt","routeName","entries","let"]}',meta:{moduleName:"consul-ui/templates/dc/services/instance/addresses.hbs"}}) -e.default=t})),define("consul-ui/templates/dc/services/instance/exposedpaths",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -var t=Ember.HTMLBars.template({id:"fkDhaB82",block:'{"symbols":["route","item","proxy"],"statements":[[8,"route",[],[["@name"],[[34,4]]],[["default"],[{"statements":[[2,"\\n"],[6,[37,5],[[32,1,["model","proxy"]],[32,1,["model","meta"]]],null,[["default"],[{"statements":[[2," "],[10,"div"],[14,0,"tab-section"],[12],[2,"\\n"],[6,[37,3],[[30,[36,2],[[32,3,["ServiceProxy","Expose","Paths","length"]],0],null]],null,[["default","else"],[{"statements":[[2," "],[1,[30,[36,0],["routes.dc.services.instance.exposedpaths.intro"],[["htmlSafe"],[true]]]],[2,"\\n "],[8,"consul/exposed-path/list",[],[["@items","@address"],[[32,3,["ServiceProxy","Expose","Paths"]],[30,[36,1],[[32,2,["Service","Address"]],[32,2,["Node","Address"]]],null]]],null],[2,"\\n"]],"parameters":[]},{"statements":[[2," "],[8,"empty-state",[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["body"]],[["default"],[{"statements":[[2,"\\n "],[1,[30,[36,0],["routes.dc.services.instance.exposedpaths.empty.body"],[["htmlSafe"],[true]]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[]}]]],[2," "],[13],[2,"\\n"]],"parameters":[2,3]}]]]],"parameters":[1]}]]]],"hasEval":false,"upvars":["t","or","gt","if","routeName","let"]}',meta:{moduleName:"consul-ui/templates/dc/services/instance/exposedpaths.hbs"}}) -e.default=t})),define("consul-ui/templates/dc/services/instance/healthchecks",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -var t=Ember.HTMLBars.template({id:"RMWIT75Y",block:'{"symbols":["route","sort","filters","items","collection","serf","notice"],"statements":[[8,"route",[],[["@name"],[[34,10]]],[["default"],[{"statements":[[2,"\\n"],[6,[37,9],[[30,[36,17],null,[["value","change"],[[30,[36,21],[[35,20],"Status:asc"],null],[30,[36,6],[[32,0],[30,[36,5],[[35,20]],null]],[["value"],["target.selected"]]]]]],[30,[36,17],null,[["status","check","searchproperty"],[[30,[36,17],null,[["value","change"],[[30,[36,3],[[35,19],[30,[36,15],[[35,19],","],null],[29]],null],[30,[36,6],[[32,0],[30,[36,5],[[35,19]],null]],[["value"],["target.selectedItems"]]]]]],[30,[36,17],null,[["value","change"],[[30,[36,3],[[35,18],[30,[36,15],[[35,18],","],null],[29]],null],[30,[36,6],[[32,0],[30,[36,5],[[35,18]],null]],[["value"],["target.selectedItems"]]]]]],[30,[36,17],null,[["value","change","default"],[[30,[36,3],[[30,[36,16],[[35,14],[29]],null],[30,[36,15],[[35,14],","],null],[35,13]],null],[30,[36,6],[[32,0],[30,[36,5],[[35,14]],null]],[["value"],["target.selectedItems"]]],[35,13]]]]]]],[30,[36,12],[[30,[36,11],[[32,1,["model","item","Checks"]],[32,1,["model","proxy","Checks"]]],null],[32,1,["model","proxy","ServiceProxy","Expose","Checks"]]],null]],null,[["default"],[{"statements":[[2," "],[10,"div"],[14,0,"tab-section"],[12],[2,"\\n\\n"],[6,[37,3],[[30,[36,7],[[32,4,["length"]],0],null]],null,[["default"],[{"statements":[[2," "],[10,"input"],[14,1,"toolbar-toggle"],[14,4,"checkbox"],[12],[13],[2,"\\n "],[8,"consul/health-check/search-bar",[],[["@search","@onsearch","@sort","@filter"],[[34,4],[30,[36,6],[[32,0],[30,[36,5],[[35,4]],null]],[["value"],["target.value"]]],[32,2],[32,3]]],null],[2,"\\n"]],"parameters":[]}]]],[2,"\\n"],[6,[37,9],[[30,[36,8],["Type","serf",[32,4]],null]],null,[["default"],[{"statements":[[6,[37,3],[[30,[36,2],[[32,6],[30,[36,1],[[32,6,["Status"]],"critical"],null]],null]],null,[["default"],[{"statements":[[2," "],[8,"notice",[],[["@type"],["warning"]],[["default"],[{"statements":[[2,"\\n "],[8,[32,7,["Header"]],[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[10,"h2"],[12],[2,"\\n "],[1,[30,[36,0],["routes.dc.services.instance.healthchecks.critical-serf-notice.header"],null]],[2,"\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,[32,7,["Body"]],[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[1,[30,[36,0],["routes.dc.services.instance.healthchecks.critical-serf-notice.body"],[["htmlSafe"],[true]]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[7]}]]],[2,"\\n"]],"parameters":[]}]]]],"parameters":[6]}]]],[2," "],[8,"data-collection",[],[["@type","@sort","@filters","@search","@items"],["health-check",[32,2,["value"]],[32,3],[34,4],[32,4]]],[["default"],[{"statements":[[2,"\\n "],[8,[32,5,["Collection"]],[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[8,"consul/health-check/list",[],[["@items"],[[32,5,["items"]]]],null],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,[32,5,["Empty"]],[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[8,"empty-state",[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["body"]],[["default"],[{"statements":[[2,"\\n "],[1,[30,[36,0],["routes.dc.services.instance.healthchecks.empty"],[["items","htmlSafe"],[[32,4,["length"]],true]]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[5]}]]],[2,"\\n\\n "],[13],[2,"\\n"]],"parameters":[2,3,4]}]]]],"parameters":[1]}]]],[2,"\\n"]],"hasEval":false,"upvars":["t","eq","and","if","search","mut","action","gt","find-by","let","routeName","array","merge-checks","searchProperties","searchproperty","split","not-eq","hash","check","status","sortBy","or"]}',meta:{moduleName:"consul-ui/templates/dc/services/instance/healthchecks.hbs"}}) -e.default=t})),define("consul-ui/templates/dc/services/instance/metadata",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -var t=Ember.HTMLBars.template({id:"qT0uOojO",block:'{"symbols":["route","item"],"statements":[[8,"route",[],[["@name"],[[34,3]]],[["default"],[{"statements":[[2,"\\n"],[6,[37,4],[[32,1,["model","item"]]],null,[["default"],[{"statements":[[2," "],[10,"div"],[14,0,"tab-section"],[12],[2,"\\n "],[10,"section"],[14,0,"tags"],[12],[2,"\\n "],[10,"h2"],[12],[2,"Tags"],[13],[2,"\\n"],[6,[37,2],[[30,[36,1],[[32,2,["Tags","length"]],0],null]],null,[["default","else"],[{"statements":[[2," "],[8,"tag-list",[],[["@item"],[[32,2]]],null],[2,"\\n"]],"parameters":[]},{"statements":[[2," "],[8,"empty-state",[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["body"]],[["default"],[{"statements":[[2,"\\n "],[10,"p"],[12],[2,"\\n There are no tags.\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[]}]]],[2," "],[13],[2,"\\n "],[10,"section"],[14,0,"metadata"],[12],[2,"\\n "],[10,"h2"],[12],[2,"Meta"],[13],[2,"\\n"],[6,[37,2],[[32,2,["Meta"]]],null,[["default","else"],[{"statements":[[2," "],[8,"consul/metadata/list",[],[["@items"],[[30,[36,0],[[32,2,["Meta"]]],null]]],null],[2,"\\n"]],"parameters":[]},{"statements":[[2," "],[8,"empty-state",[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["body"]],[["default"],[{"statements":[[2,"\\n "],[10,"p"],[12],[2,"\\n This instance has no metadata.\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[]}]]],[2," "],[13],[2,"\\n "],[13],[2,"\\n"]],"parameters":[2]}]]]],"parameters":[1]}]]],[2,"\\n"]],"hasEval":false,"upvars":["entries","gt","if","routeName","let"]}',meta:{moduleName:"consul-ui/templates/dc/services/instance/metadata.hbs"}}) -e.default=t})),define("consul-ui/templates/dc/services/instance/upstreams",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -var t=Ember.HTMLBars.template({id:"E9rUcBLq",block:'{"symbols":["route","sort","filters","partition","nspace","dc","proxy","meta","items","collection","notice"],"statements":[[8,"route",[],[["@name"],[[34,8]]],[["default"],[{"statements":[[2,"\\n "],[10,"div"],[14,0,"tab-section"],[12],[2,"\\n"],[6,[37,15],[[30,[36,13],null,[["value","change"],[[30,[36,9],[[35,14],"DestinationName:asc"],null],[30,[36,3],[[32,0],[30,[36,2],[[35,14]],null]],[["value"],["target.selected"]]]]]],[30,[36,13],null,[["searchproperty"],[[30,[36,13],null,[["value","change","default"],[[30,[36,6],[[30,[36,12],[[35,10],[29]],null],[30,[36,11],[[35,10],","],null],[35,4]],null],[30,[36,3],[[32,0],[30,[36,2],[[35,10]],null]],[["value"],["target.selectedItems"]]],[35,4]]]]]]],[30,[36,9],[[32,1,["params","partition"]],[32,1,["model","user","token","Partition"]],"default"],null],[30,[36,9],[[32,1,["params","nspace"]],[32,1,["model","user","token","Namespace"]],"default"],null],[32,1,["params","dc"]],[32,1,["model","proxy"]],[32,1,["model","meta"]],[32,1,["model","proxy","Service","Proxy","Upstreams"]]],null,[["default"],[{"statements":[[6,[37,6],[[30,[36,5],[[32,9,["length"]],0],null]],null,[["default"],[{"statements":[[2," "],[10,"input"],[14,1,"toolbar-toggle"],[14,4,"checkbox"],[12],[13],[2,"\\n "],[8,"consul/upstream-instance/search-bar",[],[["@search","@onsearch","@searchproperties","@sort","@filter"],[[34,1],[30,[36,3],[[32,0],[30,[36,2],[[35,1]],null]],[["value"],["target.value"]]],[34,4],[32,2],[32,3]]],null],[2,"\\n"]],"parameters":[]}]]],[6,[37,6],[[30,[36,7],[[32,8,["ServiceProxy","Mode"]],"transparent"],null]],null,[["default"],[{"statements":[[2," "],[8,"notice",[],[["@type"],["warning"]],[["default"],[{"statements":[[2,"\\n "],[8,[32,11,["Header"]],[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[10,"h3"],[12],[2,"\\n "],[1,[30,[36,0],["routes.dc.services.instance.upstreams.tproxy-mode.header"],null]],[2,"\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,[32,11,["Body"]],[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[1,[30,[36,0],["routes.dc.services.instance.upstreams.tproxy-mode.body"],[["htmlSafe"],[true]]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,[32,11,["Footer"]],[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[1,[30,[36,0],["routes.dc.services.instance.upstreams.tproxy-mode.footer"],[["htmlSafe"],[true]]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[11]}]]],[2,"\\n"]],"parameters":[]}]]],[2," "],[8,"data-collection",[],[["@type","@sort","@filters","@search","@items"],["upstream-instance",[32,2,["value"]],[32,3],[34,1],[32,9]]],[["default"],[{"statements":[[2,"\\n "],[8,[32,10,["Collection"]],[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[8,"consul/upstream-instance/list",[],[["@items","@dc","@nspace","@partition"],[[32,10,["items"]],[32,6],[32,5],[32,4]]],null],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,[32,10,["Empty"]],[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[8,"empty-state",[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["body"]],[["default"],[{"statements":[[2,"\\n "],[1,[30,[36,0],["routes.dc.services.instance.upstreams.empty"],[["items","htmlSafe"],[[32,9,["length"]],true]]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[10]}]]],[2,"\\n"]],"parameters":[2,3,4,5,6,7,8,9]}]]],[2," "],[13],[2,"\\n"]],"parameters":[1]}]]]],"hasEval":false,"upvars":["t","search","mut","action","searchProperties","gt","if","eq","routeName","or","searchproperty","split","not-eq","hash","sortBy","let"]}',meta:{moduleName:"consul-ui/templates/dc/services/instance/upstreams.hbs"}}) -e.default=t})),define("consul-ui/templates/dc/services/show",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -var t=Ember.HTMLBars.template({id:"+YTjbG+A",block:'{"symbols":["route","loader","items","item","dc","tabs","o","config","status","type","item","error","after","notice","notice","notice"],"statements":[[8,"route",[],[["@name"],[[34,0]]],[["default"],[{"statements":[[2,"\\n "],[8,"data-loader",[],[["@src"],[[30,[36,14],["/${partition}/${nspace}/${dc}/service-instances/for-service/${name}",[30,[36,2],null,[["partition","nspace","dc","name"],[[32,1,["params","partition"]],[32,1,["params","nspace"]],[32,1,["params","dc"]],[32,1,["params","name"]]]]]],null]]],[["default"],[{"statements":[[2,"\\n\\n "],[8,"block-slot",[],[["@name"],["error"]],[["default"],[{"statements":[[2,"\\n "],[8,"app-error",[],[["@error","@login"],[[32,2,["error"]],[32,1,["model","app","login","open"]]]],null],[2,"\\n "]],"parameters":[]}]]],[2,"\\n\\n "],[8,"block-slot",[],[["@name"],["disconnected"]],[["default"],[{"statements":[[2,"\\n"],[6,[37,10],[[30,[36,23],[[32,2,["error","status"]],"404"],null]],null,[["default","else"],[{"statements":[[2," "],[8,"notice",[[24,0,"notification-update"],[4,[38,26],null,[["sticky"],[true]]]],[["@type"],["warning"]],[["default"],[{"statements":[[2,"\\n "],[8,[32,16,["Header"]],[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[10,"strong"],[12],[2,"Warning!"],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,[32,16,["Body"]],[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[10,"p"],[12],[2,"\\n This service has been deregistered and no longer exists in the catalog.\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[16]}]]],[2,"\\n"]],"parameters":[]},{"statements":[[6,[37,10],[[30,[36,23],[[32,2,["error","status"]],"403"],null]],null,[["default","else"],[{"statements":[[2," "],[8,"notice",[[24,0,"notification-update"],[4,[38,26],null,[["sticky"],[true]]]],[["@type"],["error"]],[["default"],[{"statements":[[2,"\\n "],[8,[32,15,["Header"]],[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[10,"strong"],[12],[2,"Error!"],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,[32,15,["Body"]],[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[10,"p"],[12],[2,"\\n You no longer have access to this service\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[15]}]]],[2,"\\n"]],"parameters":[]},{"statements":[[2," "],[8,"notice",[[24,0,"notification-update"],[4,[38,26],null,[["sticky"],[true]]]],[["@type"],["warning"]],[["default"],[{"statements":[[2,"\\n "],[8,[32,14,["Header"]],[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[10,"strong"],[12],[2,"Warning!"],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,[32,14,["Body"]],[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[10,"p"],[12],[2,"\\n An error was returned whilst loading this data, refresh to try again.\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[14]}]]],[2,"\\n "]],"parameters":[]}]]]],"parameters":[]}]]],[2," "]],"parameters":[13]}]]],[2,"\\n\\n "],[8,"block-slot",[],[["@name"],["loaded"]],[["default"],[{"statements":[[2,"\\n"],[6,[37,25],[[32,2,["data"]],[32,2,["data","firstObject"]],[32,1,["model","dc"]]],null,[["default"],[{"statements":[[2,"\\n"],[6,[37,10],[[32,4,["IsOrigin"]]],null,[["default"],[{"statements":[[2," "],[8,"data-source",[],[["@src","@onchange"],[[30,[36,14],["/${partition}/${nspace}/${dc}/proxies/for-service/${name}",[30,[36,2],null,[["partition","nspace","dc","name"],[[32,1,["params","partition"]],[32,1,["params","nspace"]],[32,1,["params","dc"]],[32,1,["params","name"]]]]]],null],[30,[36,18],[[32,0],[30,[36,17],[[35,1]],null]],[["value"],["data"]]]]],null],[2,"\\n"],[6,[37,10],[[30,[36,16],[[35,15]],null]],null,[["default"],[{"statements":[[2," "],[8,"data-source",[],[["@src","@onchange"],[[30,[36,14],["/${partition}/${nspace}/${dc}/discovery-chain/${name}",[30,[36,2],null,[["partition","nspace","dc","name"],[[32,1,["params","partition"]],[32,1,["params","nspace"]],[32,1,["params","dc"]],[32,1,["params","name"]]]]]],null],[30,[36,18],[[32,0],[30,[36,17],[[35,15]],null]],[["value"],["data"]]]]],null],[2,"\\n"]],"parameters":[]}]]],[2," "],[1,[30,[36,20],[[30,[36,19],[[32,0],"chain",[29]],null],[32,1,["params","dc"]]],null]],[2,"\\n"]],"parameters":[]}]]],[6,[37,25],[[30,[36,2],null,[["topology","services","upstreams","instances","intentions","routing","tags"],[[30,[36,21],[[32,5,["MeshEnabled"]],[32,4,["IsMeshOrigin"]],[30,[36,6],[[30,[36,24],[[35,1,["length"]],0],null],[30,[36,23],[[32,4,["Service","Kind"]],"ingress-gateway"],null]],null]],null],[30,[36,23],[[32,4,["Service","Kind"]],"terminating-gateway"],null],[30,[36,23],[[32,4,["Service","Kind"]],"ingress-gateway"],null],true,[30,[36,21],[[30,[36,13],[[32,4,["Service","Kind"]],"terminating-gateway"],null],[30,[36,22],["read intention for service"],[["item"],[[32,4,["Service"]]]]]],null],[30,[36,21],[[32,5,["MeshEnabled"]],[32,4,["IsOrigin"]]],null],true]]]],null,[["default"],[{"statements":[[2," "],[8,"app-view",[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["notification"]],[["default"],[{"statements":[[2,"\\n "],[8,"topology-metrics/notifications",[],[["@type","@status","@error"],[[32,10],[32,9],[32,12]]],null],[2,"\\n "]],"parameters":[9,10,11,12]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["breadcrumbs"]],[["default"],[{"statements":[[2,"\\n "],[10,"ol"],[12],[2,"\\n "],[10,"li"],[12],[10,"a"],[15,6,[30,[36,9],["dc.services"],null]],[12],[2,"All Services"],[13],[13],[2,"\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["header"]],[["default"],[{"statements":[[2,"\\n "],[10,"h1"],[12],[2,"\\n "],[8,[32,1,["Title"]],[],[["@title"],[[32,4,["Service","Service"]]]],null],[2,"\\n "],[13],[2,"\\n "],[8,"consul/external-source",[],[["@item","@withInfo"],[[32,4,["Service"]],true]],null],[2,"\\n "],[8,"consul/kind",[],[["@item","@withInfo"],[[32,4,["Service"]],true]],null],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["nav"]],[["default"],[{"statements":[[2,"\\n"],[6,[37,10],[[30,[36,13],[[32,4,["Service","Kind"]],"mesh-gateway"],null]],null,[["default"],[{"statements":[[2," "],[8,"tab-nav",[],[["@items"],[[30,[36,12],[[30,[36,11],[[30,[36,10],[[32,6,["topology"]],[30,[36,2],null,[["label","href","selected"],["Topology",[30,[36,9],["dc.services.show.topology"],null],[30,[36,8],["dc.services.show.topology"],null]]]],""],null],[30,[36,10],[[32,6,["services"]],[30,[36,2],null,[["label","href","selected"],["Linked Services",[30,[36,9],["dc.services.show.services"],null],[30,[36,8],["dc.services.show.services"],null]]]],""],null],[30,[36,10],[[32,6,["upstreams"]],[30,[36,2],null,[["label","href","selected"],["Upstreams",[30,[36,9],["dc.services.show.upstreams"],null],[30,[36,8],["dc.services.show.upstreams"],null]]]],""],null],[30,[36,10],[[32,6,["instances"]],[30,[36,2],null,[["label","href","selected"],["Instances",[30,[36,9],["dc.services.show.instances"],null],[30,[36,8],["dc.services.show.instances"],null]]]],""],null],[30,[36,10],[[32,6,["intentions"]],[30,[36,2],null,[["label","href","selected"],["Intentions",[30,[36,9],["dc.services.show.intentions"],null],[30,[36,8],["dc.services.show.intentions"],null]]]],""],null],[30,[36,10],[[32,6,["routing"]],[30,[36,2],null,[["label","href","selected"],["Routing",[30,[36,9],["dc.services.show.routing"],null],[30,[36,8],["dc.services.show.routing"],null]]]],""],null],[30,[36,10],[[32,6,["tags"]],[30,[36,2],null,[["label","href","selected"],["Tags",[30,[36,9],["dc.services.show.tags"],null],[30,[36,8],["dc.services.show.tags"],null]]]],""],null]],null]],null]]],null],[2,"\\n"]],"parameters":[]}]]],[2," "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["actions"]],[["default"],[{"statements":[[2,"\\n "],[8,"data-source",[],[["@src"],[[30,[36,14],["/${partition}/${nspace}/${dc}/ui-config",[30,[36,2],null,[["partition","nspace","dc"],[[32,1,["params","partition"]],[32,1,["params","nspace"]],[32,1,["params","dc"]]]]]],null]]],[["default"],[{"statements":[[2,"\\n"],[6,[37,10],[[32,8,["data","dashboard_url_templates","service"]]],null,[["default"],[{"statements":[[2," "],[8,"action",[[24,0,"external-dashboard"]],[["@href","@external"],[[30,[36,7],[[32,8,["data","dashboard_url_templates","service"]],[30,[36,2],null,[["Datacenter","Service"],[[32,5,["Name"]],[30,[36,2],null,[["Name","Namespace","Partition"],[[32,4,["Service","Service"]],[30,[36,6],[[32,4,["Service","Namespace"]],""],null],[30,[36,6],[[32,4,["Service","Partition"]],""],null]]]]]]]],null],true]],[["default"],[{"statements":[[2,"\\n Open dashboard\\n "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[]}]]],[2," "]],"parameters":[8]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["content"]],[["default"],[{"statements":[[2,"\\n"],[6,[37,10],[[30,[36,6],[[30,[36,16],[[32,4,["IsOrigin"]]],null],[35,15]],null]],null,[["default"],[{"statements":[[2," "],[8,"outlet",[],[["@name","@model"],[[34,0],[30,[36,3],[[30,[36,2],null,[["items","proxies","item","tabs"],[[32,3],[35,1],[32,4],[32,6]]]],[32,1,["model"]]],null]]],[["default"],[{"statements":[[2,"\\n "],[1,[30,[36,5],[[30,[36,4],null,null]],null]],[2,"\\n "]],"parameters":[7]}]]],[2,"\\n"]],"parameters":[]}]]],[2," "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[6]}]]]],"parameters":[3,4,5]}]]],[2," "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[2]}]]],[2,"\\n"]],"parameters":[1]}]]]],"hasEval":false,"upvars":["routeName","proxies","hash","assign","-outlet","component","or","render-template","is-href","href-to","if","array","compact","not-eq","uri","chain","not","mut","action","set","did-insert","and","can","eq","gt","let","notification"]}',meta:{moduleName:"consul-ui/templates/dc/services/show.hbs"}}) -e.default=t})) -define("consul-ui/templates/dc/services/show/index",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -var t=Ember.HTMLBars.template({id:"awAzFj0u",block:'{"symbols":["route"],"statements":[[8,"route",[],[["@name"],[[34,3]]],[["default"],[{"statements":[[2,"\\n"],[6,[37,2],[[32,1,["model","tabs","topology"]]],null,[["default","else"],[{"statements":[[2," "],[1,[30,[36,1],[[30,[36,0],["replaceWith","dc.services.show.topology"],null]],null]],[2,"\\n"]],"parameters":[]},{"statements":[[6,[37,2],[[32,1,["model","tabs","upstreams"]]],null,[["default","else"],[{"statements":[[2," "],[1,[30,[36,1],[[30,[36,0],["replaceWith","dc.services.show.upstreams"],null]],null]],[2,"\\n"]],"parameters":[]},{"statements":[[6,[37,2],[[32,1,["model","tabs","services"]]],null,[["default","else"],[{"statements":[[2," "],[1,[30,[36,1],[[30,[36,0],["replaceWith","dc.services.show.services"],null]],null]],[2,"\\n"]],"parameters":[]},{"statements":[[2," "],[1,[30,[36,1],[[30,[36,0],["replaceWith","dc.services.show.instances"],null]],null]],[2,"\\n"]],"parameters":[]}]]]],"parameters":[]}]]]],"parameters":[]}]]]],"parameters":[1]}]]],[2,"\\n"]],"hasEval":false,"upvars":["route-action","did-insert","if","routeName"]}',meta:{moduleName:"consul-ui/templates/dc/services/show/index.hbs"}}) -e.default=t})),define("consul-ui/templates/dc/services/show/instances",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -var t=Ember.HTMLBars.template({id:"13/W51mM",block:'{"symbols":["route","sort","filters","items","proxyMeta","collection"],"statements":[[8,"route",[],[["@name"],[[34,11]]],[["default"],[{"statements":[[2,"\\n"],[10,"div"],[14,0,"tab-section"],[12],[2,"\\n"],[6,[37,20],[[30,[36,0],null,[["value","change"],[[30,[36,19],[[35,18],"Status:asc"],null],[30,[36,4],[[32,0],[30,[36,3],[[35,18]],null]],[["value"],["target.selected"]]]]]],[30,[36,0],null,[["status","source","searchproperty"],[[30,[36,0],null,[["value","change"],[[30,[36,9],[[35,17],[30,[36,14],[[35,17],","],null],[29]],null],[30,[36,4],[[32,0],[30,[36,3],[[35,17]],null]],[["value"],["target.selectedItems"]]]]]],[30,[36,0],null,[["value","change"],[[30,[36,9],[[35,16],[30,[36,14],[[35,16],","],null],[29]],null],[30,[36,4],[[32,0],[30,[36,3],[[35,16]],null]],[["value"],["target.selectedItems"]]]]]],[30,[36,0],null,[["value","change","default"],[[30,[36,9],[[30,[36,15],[[35,13],[29]],null],[30,[36,14],[[35,13],","],null],[35,12]],null],[30,[36,4],[[32,0],[30,[36,3],[[35,13]],null]],[["value"],["target.selectedItems"]]],[35,12]]]]]]],[32,1,["model","items"]],[32,1,["model","proxies","firstObject"]]],null,[["default"],[{"statements":[[6,[37,9],[[30,[36,8],[[32,4,["length"]],0],null]],null,[["default"],[{"statements":[[2," "],[10,"input"],[14,1,"toolbar-toggle"],[14,4,"checkbox"],[12],[13],[2,"\\n "],[8,"consul/service-instance/search-bar",[],[["@sources","@search","@onsearch","@sort","@filter"],[[30,[36,6],[[30,[36,5],[[32,4]],null],"ExternalSources"],null],[34,7],[30,[36,4],[[32,0],[30,[36,3],[[35,7]],null]],[["value"],["target.value"]]],[32,2],[32,3]]],null],[2,"\\n"]],"parameters":[]}]]],[6,[37,9],[[32,5,["ServiceName"]]],null,[["default"],[{"statements":[[2," "],[8,"data-source",[],[["@src","@onchange"],[[30,[36,1],["/${partition}/${nspace}/${dc}/service-instances/for-service/${name}",[30,[36,0],null,[["partition","nspace","dc","name"],[[32,1,["params","partition"]],[32,1,["params","nspace"]],[32,1,["params","dc"]],[32,5,["ServiceName"]]]]]],null],[30,[36,4],[[32,0],[30,[36,3],[[35,2]],null]],[["value"],["data"]]]]],null],[2,"\\n"]],"parameters":[]}]]],[2," "],[8,"data-collection",[],[["@type","@sort","@filters","@search","@items"],["service-instance",[32,2,["value"]],[32,3],[34,7],[32,4]]],[["default"],[{"statements":[[2,"\\n "],[8,[32,6,["Collection"]],[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[8,"consul/service-instance/list",[],[["@routeName","@items","@proxies"],["dc.services.instance",[32,6,["items"]],[34,2]]],null],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,[32,6,["Empty"]],[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[8,"empty-state",[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["body"]],[["default"],[{"statements":[[2,"\\n "],[1,[30,[36,10],["routes.dc.services.show.instances.empty"],[["items","htmlSafe"],[[32,4,["length"]],true]]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[6]}]]],[2,"\\n"]],"parameters":[2,3,4,5]}]]],[13],[2,"\\n"]],"parameters":[1]}]]],[2,"\\n"]],"hasEval":false,"upvars":["hash","uri","proxies","mut","action","collection","get","search","gt","if","t","routeName","searchProperties","searchproperty","split","not-eq","source","status","sortBy","or","let"]}',meta:{moduleName:"consul-ui/templates/dc/services/show/instances.hbs"}}) -e.default=t})),define("consul-ui/templates/dc/services/show/intentions",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -var t=Ember.HTMLBars.template({id:"JedXDjTs",block:'{"symbols":["route","o"],"statements":[[8,"route",[],[["@name"],[[34,0]]],[["default"],[{"statements":[[2,"\\n "],[8,"outlet",[],[["@name","@model"],[[34,0],[32,1,["model"]]]],[["default"],[{"statements":[[2,"\\n "],[1,[30,[36,2],[[30,[36,1],null,null]],null]],[2,"\\n "]],"parameters":[2]}]]],[2,"\\n"]],"parameters":[1]}]]],[2,"\\n"]],"hasEval":false,"upvars":["routeName","-outlet","component"]}',meta:{moduleName:"consul-ui/templates/dc/services/show/intentions.hbs"}}) -e.default=t})),define("consul-ui/templates/dc/services/show/intentions/edit",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -var t=Ember.HTMLBars.template({id:"5Aptuf+o",block:'{"symbols":["route","readOnly","loader","item"],"statements":[[8,"route",[],[["@name"],[[34,5]]],[["default"],[{"statements":[[2,"\\n"],[6,[37,4],[[30,[36,8],[[30,[36,7],["write intention for service"],[["item"],[[35,6,["Service"]]]]]],null]],null,[["default"],[{"statements":[[2," "],[8,"data-loader",[],[["@src"],[[30,[36,3],["/${partition}/${nspace}/${dc}/intention/${id}",[30,[36,0],null,[["partition","nspace","dc","id"],[[32,1,["params","partition"]],[32,1,["params","nspace"]],[32,1,["params","dc"]],[30,[36,2],[[32,1,["params","intention_id"]],""],null]]]]],null]]],[["default"],[{"statements":[[2,"\\n\\n "],[8,"block-slot",[],[["@name"],["error"]],[["default"],[{"statements":[[2,"\\n "],[8,"error-state",[],[["@error","@login"],[[32,3,["error"]],[32,1,["model","app","login","open"]]]],null],[2,"\\n "]],"parameters":[]}]]],[2,"\\n\\n "],[8,"block-slot",[],[["@name"],["loaded"]],[["default"],[{"statements":[[2,"\\n"],[6,[37,4],[[32,3,["data"]]],null,[["default"],[{"statements":[[2," "],[8,"consul/intention/form",[],[["@readonly","@item","@dc","@nspace","@partition","@autofill","@onsubmit"],[[32,2],[32,4],[32,1,["model","dc"]],[32,1,["params","nspace"]],[32,1,["params","partition"]],[30,[36,0],null,[["DestinationName"],[[32,1,["params","name"]]]]],[30,[36,1],["dc.services.show.intentions.index"],null]]],null],[2,"\\n"]],"parameters":[4]}]]],[2," "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[3]}]]],[2,"\\n"]],"parameters":[2]}]]]],"parameters":[1]}]]],[2,"\\n"]],"hasEval":false,"upvars":["hash","transition-to","or","uri","let","routeName","item","can","not"]}',meta:{moduleName:"consul-ui/templates/dc/services/show/intentions/edit.hbs"}}) -e.default=t})),define("consul-ui/templates/dc/services/show/intentions/index",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -var t=Ember.HTMLBars.template({id:"YEgUH4GU",block:'{"symbols":["route","api","sort","filters","items","item","writer","collection","list"],"statements":[[8,"route",[],[["@name"],[[34,12]]],[["default"],[{"statements":[[2,"\\n "],[8,"data-loader",[],[["@src"],[[30,[36,8],["/${partition}/${nspace}/${dc}/intentions/for-service/${slug}",[30,[36,7],null,[["partition","nspace","dc","slug"],[[32,1,["params","partition"]],[32,1,["params","nspace"]],[32,1,["params","dc"]],[32,1,["params","name"]]]]]],null]]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["error"]],[["default"],[{"statements":[[2,"\\n "],[8,"error-state",[],[["@error"],[[32,2,["error"]]]],null],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["loaded"]],[["default"],[{"statements":[[2,"\\n"],[6,[37,20],[[30,[36,7],null,[["value","change"],[[30,[36,19],[[35,18],"Action:asc"],null],[30,[36,2],[[32,0],[30,[36,1],[[35,18]],null]],[["value"],["target.selected"]]]]]],[30,[36,7],null,[["access","searchproperty"],[[30,[36,7],null,[["value","change"],[[30,[36,5],[[35,17],[30,[36,15],[[35,17],","],null],[29]],null],[30,[36,2],[[32,0],[30,[36,1],[[35,17]],null]],[["value"],["target.selectedItems"]]]]]],[30,[36,7],null,[["value","change","default"],[[30,[36,5],[[30,[36,16],[[35,14],[29]],null],[30,[36,15],[[35,14],","],null],[35,13]],null],[30,[36,2],[[32,0],[30,[36,1],[[35,14]],null]],[["value"],["target.selectedItems"]]],[35,13]]]]]]],[32,2,["data"]],[32,1,["model","item"]]],null,[["default"],[{"statements":[[2," "],[10,"div"],[14,0,"tab-section"],[12],[2,"\\n"],[6,[37,5],[[30,[36,4],["create intention for service"],[["item"],[[32,6,["Service"]]]]]],null,[["default"],[{"statements":[[2," "],[8,"portal",[],[["@target"],["app-view-actions"]],[["default"],[{"statements":[[2,"\\n "],[10,"a"],[15,6,[30,[36,3],["dc.services.show.intentions.create"],null]],[14,0,"type-create"],[12],[2,"Create"],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[]}]]],[6,[37,5],[[30,[36,6],[[32,5,["length"]],0],null]],null,[["default"],[{"statements":[[2," "],[8,"consul/intention/search-bar",[],[["@search","@onsearch","@sort","@filter"],[[34,0],[30,[36,2],[[32,0],[30,[36,1],[[35,0]],null]],[["value"],["target.value"]]],[32,3],[32,4]]],null],[2,"\\n"]],"parameters":[]}]]],[2," "],[8,"data-writer",[],[["@sink","@type","@ondelete"],[[30,[36,8],["/${partition}/${dc}/${nspace}/intention/",[30,[36,7],null,[["partition","nspace","dc"],[[32,1,["params","partition"]],[32,1,["params","nspace"]],[32,1,["params","dc"]]]]]],null],"intention",[34,9]]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["content"]],[["default"],[{"statements":[[2,"\\n "],[8,"data-collection",[],[["@type","@sort","@filters","@search","@items"],["intention",[32,3,["value"]],[32,4],[34,0],[32,5]]],[["default"],[{"statements":[[2,"\\n "],[8,[32,8,["Collection"]],[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[8,"consul/intention/list",[],[["@items","@check","@delete"],[[32,8,["items"]],[34,0],[32,7,["delete"]]]],[["default"],[{"statements":[[2,"\\n "],[8,[32,9,["CustomResourceNotice"]],[],[[],[]],null],[2,"\\n "],[8,[32,9,["CheckNotice"]],[],[[],[]],null],[2,"\\n "],[8,[32,9,["Table"]],[],[["@routeName"],["dc.services.show.intentions.edit"]],null],[2,"\\n "]],"parameters":[9]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,[32,8,["Empty"]],[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[8,"empty-state",[],[["@login"],[[32,1,["model","app","login","open"]]]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["header"]],[["default"],[{"statements":[[2,"\\n "],[10,"h2"],[12],[2,"\\n "],[1,[30,[36,10],["routes.dc.services.intentions.index.empty.header"],[["items"],[[32,5,["length"]]]]]],[2,"\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["body"]],[["default"],[{"statements":[[2,"\\n "],[1,[30,[36,10],["routes.dc.services.intentions.index.empty.body"],[["items","htmlSafe"],[[32,5,["length"]],true]]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["actions"]],[["default"],[{"statements":[[2,"\\n "],[10,"li"],[14,0,"docs-link"],[12],[2,"\\n "],[10,"a"],[15,6,[31,[[30,[36,11],["CONSUL_DOCS_URL"],null],"/commands/intention"]]],[14,"rel","noopener noreferrer"],[14,"target","_blank"],[12],[2,"Documentation on intentions"],[13],[2,"\\n "],[13],[2,"\\n "],[10,"li"],[14,0,"learn-link"],[12],[2,"\\n "],[10,"a"],[15,6,[31,[[30,[36,11],["CONSUL_DOCS_LEARN_URL"],null],"/consul/getting-started/connect"]]],[14,"rel","noopener noreferrer"],[14,"target","_blank"],[12],[2,"Take the tutorial"],[13],[2,"\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[8]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[7]}]]],[2,"\\n "],[13],[2,"\\n"]],"parameters":[3,4,5,6]}]]],[2," "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[2]}]]],[2,"\\n"]],"parameters":[1]}]]],[2,"\\n"]],"hasEval":false,"upvars":["search","mut","action","href-to","can","if","gt","hash","uri","refresh-route","t","env","routeName","searchProperties","searchproperty","split","not-eq","access","sortBy","or","let"]}',meta:{moduleName:"consul-ui/templates/dc/services/show/intentions/index.hbs"}}) -e.default=t})),define("consul-ui/templates/dc/services/show/routing",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -var t=Ember.HTMLBars.template({id:"ECmVG/5P",block:'{"symbols":["route","loader"],"statements":[[8,"route",[],[["@name"],[[34,0]]],[["default"],[{"statements":[[2,"\\n "],[8,"data-loader",[],[["@src"],[[30,[36,2],["/${partition}/${nspace}/${dc}/discovery-chain/${name}",[30,[36,1],null,[["partition","nspace","dc","name"],[[32,1,["params","partition"]],[32,1,["params","nspace"]],[32,1,["params","dc"]],[32,1,["params","name"]]]]]],null]]],[["default"],[{"statements":[[2,"\\n\\n "],[8,"block-slot",[],[["@name"],["error"]],[["default"],[{"statements":[[2,"\\n "],[8,"app-error",[],[["@error","@login"],[[32,2,["error"]],[32,1,["model","app","login","open"]]]],null],[2,"\\n "]],"parameters":[]}]]],[2,"\\n\\n "],[8,"block-slot",[],[["@name"],["loaded"]],[["default"],[{"statements":[[2,"\\n "],[10,"div"],[14,0,"tab-section"],[12],[2,"\\n "],[8,"consul/discovery-chain",[],[["@chain"],[[32,2,["data","Chain"]]]],null],[2,"\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[2]}]]],[2,"\\n"]],"parameters":[1]}]]],[2,"\\n"]],"hasEval":false,"upvars":["routeName","hash","uri"]}',meta:{moduleName:"consul-ui/templates/dc/services/show/routing.hbs"}}) -e.default=t})),define("consul-ui/templates/dc/services/show/services",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -var t=Ember.HTMLBars.template({id:"I2O7WlJO",block:'{"symbols":["route","loader","sort","filters","items","collection"],"statements":[[8,"route",[],[["@name"],[[34,7]]],[["default"],[{"statements":[[2,"\\n "],[8,"data-loader",[],[["@src"],[[30,[36,9],["/${partition}/${nspace}/${dc}/gateways/for-service/${name}",[30,[36,8],null,[["partition","nspace","dc","name"],[[32,1,["params","partition"]],[32,1,["params","nspace"]],[32,1,["params","dc"]],[32,1,["params","name"]]]]]],null]]],[["default"],[{"statements":[[2,"\\n\\n "],[8,"block-slot",[],[["@name"],["error"]],[["default"],[{"statements":[[2,"\\n "],[8,"app-error",[],[["@error","@login"],[[32,2,["error"]],[32,1,["model","app","login","open"]]]],null],[2,"\\n "]],"parameters":[]}]]],[2,"\\n\\n "],[8,"block-slot",[],[["@name"],["loaded"]],[["default"],[{"statements":[[2,"\\n "],[10,"div"],[14,0,"tab-section"],[12],[2,"\\n"],[6,[37,16],[[30,[36,8],null,[["value","change"],[[30,[36,6],[[35,15],"Status:asc"],null],[30,[36,2],[[32,0],[30,[36,1],[[35,15]],null]],[["value"],["target.selected"]]]]]],[30,[36,8],null,[["instance","searchproperty"],[[30,[36,8],null,[["value","change"],[[30,[36,4],[[35,14],[30,[36,12],[[35,14],","],null],[29]],null],[30,[36,2],[[32,0],[30,[36,1],[[35,14]],null]],[["value"],["target.selectedItems"]]]]]],[30,[36,8],null,[["value","change","default"],[[30,[36,4],[[30,[36,13],[[35,11],[29]],null],[30,[36,12],[[35,11],","],null],[35,10]],null],[30,[36,2],[[32,0],[30,[36,1],[[35,11]],null]],[["value"],["target.selectedItems"]]],[35,10]]]]]]],[32,2,["data"]]],null,[["default"],[{"statements":[[6,[37,4],[[30,[36,3],[[32,5,["length"]],0],null]],null,[["default"],[{"statements":[[2," "],[10,"input"],[14,1,"toolbar-toggle"],[14,4,"checkbox"],[12],[13],[2,"\\n "],[8,"consul/upstream/search-bar",[],[["@search","@onsearch","@sort","@filter"],[[34,0],[30,[36,2],[[32,0],[30,[36,1],[[35,0]],null]],[["value"],["target.value"]]],[32,3],[32,4]]],null],[2,"\\n"]],"parameters":[]}]]],[2," "],[8,"data-collection",[],[["@type","@sort","@filters","@search","@items"],["service",[32,3,["value"]],[32,4],[34,0],[32,5]]],[["default"],[{"statements":[[2,"\\n "],[8,[32,6,["Collection"]],[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[1,[30,[36,5],["routes.dc.services.show.services.intro"],[["htmlSafe"],[true]]]],[2,"\\n "],[8,"consul/service/list",[],[["@nspace","@partition","@items"],[[30,[36,6],[[32,1,["params","nspace"]],[32,1,["model","user","token","Namespace"]],"default"],null],[30,[36,6],[[32,1,["params","partition"]],[32,1,["model","user","token","Partition"]],"default"],null],[32,6,["items"]]]],[["default"],[{"statements":[[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,[32,6,["Empty"]],[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[8,"empty-state",[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["body"]],[["default"],[{"statements":[[2,"\\n "],[1,[30,[36,5],["routes.dc.services.show.services.empty"],[["items","htmlSafe"],[[32,5,["length"]],true]]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[6]}]]],[2,"\\n"]],"parameters":[3,4,5]}]]],[2," "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[2]}]]],[2,"\\n"]],"parameters":[1]}]]],[2,"\\n"]],"hasEval":false,"upvars":["search","mut","action","gt","if","t","or","routeName","hash","uri","searchProperties","searchproperty","split","not-eq","instance","sortBy","let"]}',meta:{moduleName:"consul-ui/templates/dc/services/show/services.hbs"}}) -e.default=t})),define("consul-ui/templates/dc/services/show/tags",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -var t=Ember.HTMLBars.template({id:"6gutQsyo",block:'{"symbols":["route","tags"],"statements":[[8,"route",[],[["@name"],[[34,4]]],[["default"],[{"statements":[[2,"\\n "],[10,"div"],[14,0,"tab-section"],[12],[2,"\\n"],[6,[37,7],[[30,[36,6],[[30,[36,5],["Tags",[32,1,["model","items"]]],null]],null]],null,[["default"],[{"statements":[[6,[37,3],[[30,[36,2],[[32,2,["length"]],0],null]],null,[["default","else"],[{"statements":[[2," "],[8,"tag-list",[],[["@item"],[[30,[36,1],null,[["Tags"],[[32,2]]]]]],null],[2,"\\n"]],"parameters":[]},{"statements":[[2," "],[8,"empty-state",[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["header"]],[["default"],[{"statements":[[2,"\\n "],[10,"h2"],[12],[2,"\\n "],[1,[30,[36,0],["routes.dc.services.show.tags.empty.header"],null]],[2,"\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["body"]],[["default"],[{"statements":[[2,"\\n "],[1,[30,[36,0],["routes.dc.services.show.tags.empty.body"],[["htmlSafe"],[true]]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[]}]]]],"parameters":[2]}]]],[2," "],[13],[2,"\\n"]],"parameters":[1]}]]],[2,"\\n"]],"hasEval":false,"upvars":["t","hash","gt","if","routeName","map-by","flatten","let"]}',meta:{moduleName:"consul-ui/templates/dc/services/show/tags.hbs"}}) -e.default=t})),define("consul-ui/templates/dc/services/show/topology",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -var t=Ember.HTMLBars.template({id:"YIp1h+g1",block:'{"symbols":["route","loader","nspace","dc","items","topology","config","disclosure","notices","noticesEnabled","enabled","prop","details","notice","footer"],"statements":[[8,"route",[],[["@name"],[[34,24]]],[["default"],[{"statements":[[2,"\\n "],[8,"data-loader",[],[["@src"],[[30,[36,23],["/${partition}/${nspace}/${dc}/topology/${name}/${kind}",[30,[36,1],null,[["partition","nspace","dc","name","kind"],[[32,1,["params","partition"]],[32,1,["params","nspace"]],[32,1,["params","dc"]],[32,1,["params","name"]],[30,[36,0],[[32,1,["model","items","firstObject","Service","Kind"]],""],null]]]]],null]]],[["default"],[{"statements":[[2,"\\n\\n "],[8,"block-slot",[],[["@name"],["error"]],[["default"],[{"statements":[[2,"\\n "],[8,"app-error",[],[["@error","@login"],[[32,2,["error"]],[32,1,["model","app","login","open"]]]],null],[2,"\\n "]],"parameters":[]}]]],[2,"\\n\\n "],[8,"block-slot",[],[["@name"],["loaded"]],[["default"],[{"statements":[[2,"\\n"],[6,[37,15],[[32,1,["params","nspace"]],[32,1,["model","dc"]],[32,1,["model","items"]],[32,2,["data"]]],null,[["default"],[{"statements":[[2," "],[10,"div"],[14,0,"tab-section"],[12],[2,"\\n\\n "],[10,"div"],[14,0,"topology-notices"],[12],[2,"\\n "],[8,"disclosure",[],[["@expanded"],[true]],[["default"],[{"statements":[[2,"\\n"],[6,[37,15],[[30,[36,22],[[30,[36,12],[[30,[36,12],["filtered-by-acls",[30,[36,0],[false,[32,6,["FilteredByACLs"]]],null]],null],[30,[36,12],["default-allow",[30,[36,0],[false,[30,[36,21],[[32,4,["DefaultACLPolicy"]],"allow"],null]],null]],null],[30,[36,12],["wildcard-intention",[30,[36,0],[false,[32,6,["wildcardIntention"]]],null]],null],[30,[36,12],["not-defined-intention",[30,[36,0],[false,[32,6,["notDefinedIntention"]]],null]],null],[30,[36,12],["no-dependencies",[30,[36,0],[false,[30,[36,11],[[32,6,["noDependencies"]],[30,[36,20],["use acls"],null]],null]],null]],null],[30,[36,12],["acls-disabled",[30,[36,0],[false,[30,[36,11],[[32,6,["noDependencies"]],[30,[36,3],[[30,[36,20],["use acls"],null]],null]],null]],null]],null]],null]],null]],null,[["default"],[{"statements":[[2,"\\n"],[6,[37,15],[[30,[36,19],[false,[30,[36,18],[[32,9]],null]],null]],null,[["default"],[{"statements":[[2,"\\n"],[6,[37,17],[[30,[36,16],[[32,9]],null]],null,[["default"],[{"statements":[[6,[37,7],[[32,11]],null,[["default"],[{"statements":[[2," "],[8,[32,8,["Details"]],[],[["@auto"],[false]],[["default"],[{"statements":[[2,"\\n "],[8,"notice",[[24,0,"topology-metrics-notice"],[16,1,[32,13,["id"]]]],[["@type"],[[30,[36,7],[[30,[36,13],[[32,12],[30,[36,12],["filtered-by-acls","no-dependencies"],null]],null],"info","warning"],null]]],[["default"],[{"statements":[[2,"\\n "],[8,[32,14,["Header"]],[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[10,"h3"],[12],[2,"\\n "],[1,[30,[36,9],[[30,[36,8],[[32,1,["t"]],"notice.${prop}.header",[30,[36,1],null,[["prop"],[[32,12]]]]],null]],null]],[2,"\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n"],[6,[37,7],[[32,8,["expanded"]]],null,[["default"],[{"statements":[[2," "],[8,[32,14,["Body"]],[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[10,"p"],[12],[2,"\\n "],[1,[30,[36,9],[[30,[36,8],[[32,1,["t"]],"notice.${prop}.body",[30,[36,1],null,[["prop"],[[32,12]]]]],null]],null]],[2,"\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[]}]]],[6,[37,15],[[30,[36,9],[[30,[36,8],[[32,1,["t"]],"notice.${prop}.footer",[30,[36,1],null,[["route_intentions","prop","htmlSafe"],[[30,[36,14],["dc.services.show.intentions"],null],[32,12],true]]]],null]],null]],null,[["default"],[{"statements":[[6,[37,7],[[30,[36,11],[[32,8,["expanded"]],[30,[36,10],[[32,12],"filtered-by-acls"],null]],null]],null,[["default"],[{"statements":[[2," "],[8,[32,14,["Footer"]],[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[1,[32,15]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[]}]]]],"parameters":[15]}]]],[2," "]],"parameters":[14]}]]],[2,"\\n "]],"parameters":[13]}]]],[2,"\\n"]],"parameters":[]}]]]],"parameters":[11,12]}]]],[2,"\\n"],[6,[37,7],[[30,[36,4],[[32,10,["length"]],2],null]],null,[["default"],[{"statements":[[2," "],[8,[32,8,["Action"]],[[4,[38,6],["click",[32,8,["toggle"]]],null]],[[],[]],[["default"],[{"statements":[[2,"\\n "],[1,[30,[36,9],[[30,[36,8],[[32,1,["t"]],"notices.${expanded}",[30,[36,1],null,[["expanded"],[[30,[36,7],[[32,8,["expanded"]],"close","open"],null]]]]],null]],null]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[]}]]],[2,"\\n"]],"parameters":[10]}]]]],"parameters":[9]}]]],[2," "]],"parameters":[8]}]]],[2,"\\n\\n "],[13],[2,"\\n\\n\\n "],[8,"data-source",[],[["@src"],[[30,[36,23],["/${partition}/${nspace}/${dc}/ui-config",[30,[36,1],null,[["partition","nspace","dc"],[[32,1,["params","partition"]],[32,1,["params","nspace"]],[32,1,["params","dc"]]]]]],null]]],[["default"],[{"statements":[[2,"\\n"],[6,[37,7],[[32,7,["data"]]],null,[["default"],[{"statements":[[2,"\\n "],[8,"topology-metrics",[],[["@nspace","@dc","@service","@topology","@metricsHref","@isRemoteDC","@hasMetricsProvider","@oncreate"],[[32,3],[32,4],[32,5,["firstObject"]],[32,6],[30,[36,2],[[32,7,["data","dashboard_url_templates","service"]],[30,[36,1],null,[["Datacenter","Service"],[[32,4,["Name"]],[30,[36,1],null,[["Name","Namespace","Partition"],[[32,5,["firstObject","Name"]],[30,[36,0],[[32,5,["firstObject","Namespace"]],""],null],[30,[36,0],[[32,5,["firstObject","Partition"]],""],null]]]]]]]],null],[30,[36,3],[[32,4,["Local"]]],null],[30,[36,4],[[32,7,["data","metrics_provider","length"]],0],null],[30,[36,5],["createIntention"],null]]],null],[2,"\\n\\n"]],"parameters":[]}]]],[2," "]],"parameters":[7]}]]],[2,"\\n "],[13],[2,"\\n"]],"parameters":[3,4,5,6]}]]],[2," "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[2]}]]],[2,"\\n"]],"parameters":[1]}]]],[2,"\\n"]],"hasEval":false,"upvars":["or","hash","render-template","not","gt","route-action","on","if","fn","compute","not-eq","and","array","contains","href-to","let","-each-in","each","values","without","can","eq","from-entries","uri","routeName"]}',meta:{moduleName:"consul-ui/templates/dc/services/show/topology.hbs"}}) -e.default=t})),define("consul-ui/templates/dc/services/show/upstreams",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -var t=Ember.HTMLBars.template({id:"G1oiIhX0",block:'{"symbols":["route","loader","sort","filters","partition","nspace","dc","items","collection"],"statements":[[8,"route",[],[["@name"],[[34,6]]],[["default"],[{"statements":[[2,"\\n "],[8,"data-loader",[],[["@src"],[[30,[36,8],["/${partition}/${nspace}/${dc}/gateways/for-service/${name}",[30,[36,7],null,[["partition","nspace","dc","name"],[[32,1,["params","partition"]],[32,1,["params","nspace"]],[32,1,["params","dc"]],[32,1,["params","name"]]]]]],null]]],[["default"],[{"statements":[[2,"\\n\\n "],[8,"block-slot",[],[["@name"],["error"]],[["default"],[{"statements":[[2,"\\n "],[8,"app-error",[],[["@error","@login"],[[32,2,["error"]],[32,1,["model","app","login","open"]]]],null],[2,"\\n "]],"parameters":[]}]]],[2,"\\n\\n "],[8,"block-slot",[],[["@name"],["loaded"]],[["default"],[{"statements":[[2,"\\n "],[10,"div"],[14,0,"tab-section"],[12],[2,"\\n"],[6,[37,16],[[30,[36,7],null,[["value","change"],[[30,[36,9],[[35,15],"Status:asc"],null],[30,[36,2],[[32,0],[30,[36,1],[[35,15]],null]],[["value"],["target.selected"]]]]]],[30,[36,7],null,[["instance","searchproperty"],[[30,[36,7],null,[["value","change"],[[30,[36,4],[[35,14],[30,[36,12],[[35,14],","],null],[29]],null],[30,[36,2],[[32,0],[30,[36,1],[[35,14]],null]],[["value"],["target.selectedItems"]]]]]],[30,[36,7],null,[["value","change","default"],[[30,[36,4],[[30,[36,13],[[35,11],[29]],null],[30,[36,12],[[35,11],","],null],[35,10]],null],[30,[36,2],[[32,0],[30,[36,1],[[35,11]],null]],[["value"],["target.selectedItems"]]],[35,10]]]]]]],[30,[36,9],[[32,1,["params","partition"]],[32,1,["model","user","token","Partition"]],"default"],null],[30,[36,9],[[32,1,["params","nspace"]],[32,1,["model","user","token","Namespace"]],"default"],null],[32,1,["params","dc"]],[32,2,["data"]]],null,[["default"],[{"statements":[[6,[37,4],[[30,[36,3],[[32,8,["length"]],0],null]],null,[["default"],[{"statements":[[2," "],[10,"input"],[14,1,"toolbar-toggle"],[14,4,"checkbox"],[12],[13],[2,"\\n "],[8,"consul/upstream/search-bar",[],[["@search","@onsearch","@sort","@filter"],[[34,0],[30,[36,2],[[32,0],[30,[36,1],[[35,0]],null]],[["value"],["target.value"]]],[32,3],[32,4]]],null],[2,"\\n"]],"parameters":[]}]]],[2," "],[1,[30,[36,5],["routes.dc.services.show.upstreams.intro"],[["htmlSafe"],[true]]]],[2,"\\n "],[8,"data-collection",[],[["@type","@sort","@filters","@search","@items"],["service",[32,3,["value"]],[32,4],[34,0],[32,8]]],[["default"],[{"statements":[[2,"\\n "],[8,[32,9,["Collection"]],[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[8,"consul/upstream/list",[],[["@items","@dc","@nspace","@partition"],[[32,9,["items"]],[32,7],[32,6],[32,5]]],[["default"],[{"statements":[[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,[32,9,["Empty"]],[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[8,"empty-state",[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["body"]],[["default"],[{"statements":[[2,"\\n "],[1,[30,[36,5],["routes.dc.services.show.upstreams.empty"],[["items","htmlSafe"],[[32,8,["length"]],true]]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[9]}]]],[2,"\\n"]],"parameters":[3,4,5,6,7,8]}]]],[2," "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[2]}]]],[2,"\\n"]],"parameters":[1]}]]],[2,"\\n"]],"hasEval":false,"upvars":["search","mut","action","gt","if","t","routeName","hash","uri","or","searchProperties","searchproperty","split","not-eq","instance","sortBy","let"]}',meta:{moduleName:"consul-ui/templates/dc/services/show/upstreams.hbs"}}) -e.default=t})),define("consul-ui/templates/dc/show",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -var t=Ember.HTMLBars.template({id:"l00QFa3D",block:'{"symbols":["route","o","tabs","tabsEnabled"],"statements":[[8,"route",[],[["@name"],[[34,12]]],[["default"],[{"statements":[[2,"\\n "],[8,"app-view",[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["header"]],[["default"],[{"statements":[[2,"\\n "],[10,"h1"],[12],[2,"\\n "],[8,[32,1,["Title"]],[],[["@title"],[[30,[36,3],[[30,[36,2],[[32,1,["t"]],"title"],null]],null]]],null],[2,"\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["toolbar"]],[["default"],[{"statements":[[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["nav"]],[["default"],[{"statements":[[2,"\\n\\n"],[6,[37,11],[[30,[36,14],[[30,[36,6],[[30,[36,6],["serverstatus",true],null],[30,[36,6],["cataloghealth",false],null],[30,[36,6],["license",[30,[36,13],["read license"],null]],null]],null]],null]],null,[["default"],[{"statements":[[2,"\\n"],[6,[37,11],[[30,[36,10],[false,[30,[36,9],[[32,3]],null]],null]],null,[["default"],[{"statements":[[2,"\\n"],[6,[37,5],[[30,[36,8],[[32,4,["length"]],1],null]],null,[["default"],[{"statements":[[2," "],[8,"tab-nav",[],[["@items"],[[30,[36,7],[[30,[36,6],[[30,[36,5],[[32,3,["serverstatus"]],[30,[36,4],null,[["label","href","selected"],[[30,[36,3],[[30,[36,2],[[32,1,["t"]],"serverstatus.title"],null]],null],[30,[36,1],["dc.show.serverstatus"],null],[30,[36,0],["dc.show.serverstatus"],null]]]],""],null],[30,[36,5],[[32,3,["cataloghealth"]],[30,[36,4],null,[["label","href","selected"],[[30,[36,3],[[30,[36,2],[[32,1,["t"]],"cataloghealth.title"],null]],null],[30,[36,1],["dc.show.cataloghealth"],null],[30,[36,0],["dc.show.cataloghealth"],null]]]],""],null],[30,[36,5],[[32,3,["license"]],[30,[36,4],null,[["label","href","selected"],[[30,[36,3],[[30,[36,2],[[32,1,["t"]],"license.title"],null]],null],[30,[36,1],["dc.show.license"],null],[30,[36,0],["dc.show.license"],null]]]]],null],""],null]],null]]],null],[2,"\\n"]],"parameters":[]}]]],[2,"\\n"]],"parameters":[4]}]]]],"parameters":[3]}]]],[2," "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["content"]],[["default"],[{"statements":[[2,"\\n "],[8,"outlet",[],[["@name","@model"],[[34,12],[32,1,["model"]]]],[["default"],[{"statements":[[2,"\\n "],[1,[30,[36,16],[[30,[36,15],null,null]],null]],[2,"\\n "]],"parameters":[2]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n\\n "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[1]}]]],[2,"\\n"]],"hasEval":false,"upvars":["is-href","href-to","fn","compute","hash","if","array","compact","gt","values","without","let","routeName","can","from-entries","-outlet","component"]}',meta:{moduleName:"consul-ui/templates/dc/show.hbs"}}) -e.default=t})),define("consul-ui/templates/dc/show/index",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -var t=Ember.HTMLBars.template({id:"p6/8nAfZ",block:'{"symbols":["route"],"statements":[[8,"route",[],[["@name"],[[34,0]]],[["default"],[{"statements":[[2,"\\n "],[1,[30,[36,4],[[30,[36,3],["replaceWith",[30,[36,2],[[30,[36,1],["access overview"],null],"dc.show.serverstatus","dc.services.index"],null]],null]],null]],[2,"\\n"]],"parameters":[1]}]]],[2,"\\n\\n"]],"hasEval":false,"upvars":["routeName","can","if","route-action","did-insert"]}',meta:{moduleName:"consul-ui/templates/dc/show/index.hbs"}}) -e.default=t})),define("consul-ui/templates/dc/show/license",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -var t=Ember.HTMLBars.template({id:"6J16wkmB",block:'{"symbols":["route","loader","item","after","notice","notice","notice"],"statements":[[8,"route",[],[["@name"],[[34,12]]],[["default"],[{"statements":[[2,"\\n "],[8,"data-loader",[],[["@src"],[[30,[36,13],["/${partition}/${nspace}/${dc}/license",[30,[36,8],null,[["partition","nspace","dc"],[[32,1,["params","partition"]],[32,1,["params","nspace"]],[32,1,["params","dc"]]]]]],null]]],[["default"],[{"statements":[[2,"\\n\\n"],[6,[37,14],[[32,2,["data"]]],null,[["default"],[{"statements":[[2," "],[8,"block-slot",[],[["@name"],["error"]],[["default"],[{"statements":[[2,"\\n "],[8,"error-state",[],[["@error","@login"],[[32,2,["error"]],[32,1,["model","app","login","open"]]]],null],[2,"\\n "]],"parameters":[]}]]],[2,"\\n\\n "],[8,"block-slot",[],[["@name"],["disconnected"]],[["default"],[{"statements":[[2,"\\n"],[6,[37,2],[[30,[36,1],[[32,2,["error","status"]],"404"],null]],null,[["default","else"],[{"statements":[[2," "],[8,"notice",[[24,0,"notification-update"],[4,[38,0],null,[["sticky"],[true]]]],[["@type"],["warning"]],[["default"],[{"statements":[[2,"\\n "],[8,[32,7,["Header"]],[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[10,"strong"],[12],[2,"Warning!"],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,[32,7,["Body"]],[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[10,"p"],[12],[2,"\\n This service has been deregistered and no longer exists in the catalog.\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[7]}]]],[2,"\\n"]],"parameters":[]},{"statements":[[6,[37,2],[[30,[36,1],[[32,2,["error","status"]],"403"],null]],null,[["default","else"],[{"statements":[[2," "],[8,"notice",[[24,0,"notification-update"],[4,[38,0],null,[["sticky"],[true]]]],[["@type"],["error"]],[["default"],[{"statements":[[2,"\\n "],[8,[32,6,["Header"]],[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[10,"strong"],[12],[2,"Error!"],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,[32,6,["Body"]],[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[10,"p"],[12],[2,"\\n You no longer have access to this service\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[6]}]]],[2,"\\n"]],"parameters":[]},{"statements":[[2," "],[8,"notice",[[24,0,"notification-update"],[4,[38,0],null,[["sticky"],[true]]]],[["@type"],["warning"]],[["default"],[{"statements":[[2,"\\n "],[8,[32,5,["Header"]],[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[10,"strong"],[12],[2,"Warning!"],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,[32,5,["Body"]],[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[10,"p"],[12],[2,"\\n An error was returned whilst loading this data, refresh to try again.\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[5]}]]],[2,"\\n "]],"parameters":[]}]]]],"parameters":[]}]]],[2," "]],"parameters":[4]}]]],[2,"\\n\\n "],[8,"block-slot",[],[["@name"],["loaded"]],[["default"],[{"statements":[[2,"\\n "],[10,"div"],[14,0,"tab-section"],[12],[2,"\\n "],[10,"section"],[15,0,[30,[36,4],["validity",[30,[36,3],["valid",[32,3,["Valid"]]],null]],null]],[12],[2,"\\n "],[10,"header"],[12],[2,"\\n "],[10,"h2"],[12],[2,"\\n "],[1,[30,[36,6],[[30,[36,5],[[32,1,["t"]],"expiry.header"],null]],null]],[2,"\\n "],[13],[2,"\\n "],[13],[2,"\\n\\n "],[10,"p"],[12],[2,"\\n "],[1,[30,[36,6],[[30,[36,5],[[32,1,["t"]],"expiry.${type}.body",[30,[36,8],null,[["type","date","time","htmlSafe"],[[30,[36,2],[[32,3,["Valid"]],"valid","expired"],null],[30,[36,7],[[32,3,["License","expiration_time"]]],[["year","month","day"],["numeric","long","numeric"]]],[30,[36,7],[[32,3,["License","expiration_time"]]],[["hour12","hour","hourCycle","minute","second","timeZoneName"],[true,"numeric","h12","numeric","numeric","short"]]],true]]]],null]],null]],[2,"\\n "],[13],[2,"\\n\\n "],[10,"dl"],[12],[2,"\\n "],[10,"dt"],[15,0,[30,[36,4],[[30,[36,3],["valid",[32,3,["Valid"]]],null],[30,[36,3],["expired",[30,[36,10],[[32,3,["Valid"]]],null]],null],[30,[36,3],["warning",[30,[36,9],[[32,3,["License","expiration_time"]],2629800000],null]],null]],null]],[12],[2,"\\n "],[1,[30,[36,6],[[30,[36,5],[[32,1,["t"]],"expiry.${type}.header",[30,[36,8],null,[["type"],[[30,[36,2],[[32,3,["Valid"]],"valid","expired"],null]]]]],null]],null]],[2,"\\n "],[13],[2,"\\n "],[10,"dd"],[12],[2,"\\n "],[1,[30,[36,11],[[32,3,["License","expiration_time"]]],null]],[2,"\\n "],[13],[2,"\\n "],[13],[2,"\\n\\n "],[10,"aside"],[12],[2,"\\n "],[10,"header"],[12],[2,"\\n "],[10,"h3"],[12],[2,"\\n "],[1,[30,[36,6],[[30,[36,5],[[32,1,["t"]],"documentation.title"],null]],null]],[2,"\\n "],[13],[2,"\\n "],[13],[2,"\\n "],[1,[30,[36,6],[[30,[36,5],[[32,1,["t"]],"documentation.body",[30,[36,8],null,[["htmlSafe"],[true]]]],null]],null]],[2,"\\n "],[13],[2,"\\n\\n "],[13],[2,"\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[3]}]]],[2," "]],"parameters":[2]}]]],[2,"\\n"]],"parameters":[1]}]]],[2,"\\n\\n"]],"hasEval":false,"upvars":["notification","eq","if","array","class-map","fn","compute","format-time","hash","temporal-within","not","temporal-format","routeName","uri","let"]}',meta:{moduleName:"consul-ui/templates/dc/show/license.hbs"}}) -e.default=t})),define("consul-ui/templates/dc/show/serverstatus",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -var t=Ember.HTMLBars.template({id:"oG6Yv0sK",block:'{"symbols":["route","loader","item","item","after","notice","notice","notice"],"statements":[[8,"route",[],[["@name"],[[34,16]]],[["default"],[{"statements":[[2,"\\n "],[8,"data-loader",[],[["@src"],[[30,[36,17],["/${partition}/${nspace}/${dc}/datacenter",[30,[36,13],null,[["partition","nspace","dc"],[[32,1,["params","partition"]],[32,1,["params","nspace"]],[32,1,["params","dc"]]]]]],null]]],[["default"],[{"statements":[[2,"\\n\\n"],[6,[37,18],[[32,2,["data"]]],null,[["default"],[{"statements":[[2," "],[8,"block-slot",[],[["@name"],["error"]],[["default"],[{"statements":[[2,"\\n "],[8,"error-state",[],[["@error","@login"],[[32,2,["error"]],[32,1,["model","app","login","open"]]]],null],[2,"\\n "]],"parameters":[]}]]],[2,"\\n\\n "],[8,"block-slot",[],[["@name"],["disconnected"]],[["default"],[{"statements":[[2,"\\n"],[6,[37,8],[[30,[36,4],[[32,2,["error","status"]],"404"],null]],null,[["default","else"],[{"statements":[[2," "],[8,"notice",[[24,0,"notification-update"],[4,[38,12],null,[["sticky"],[true]]]],[["@type"],["warning"]],[["default"],[{"statements":[[2,"\\n "],[8,[32,8,["Header"]],[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[10,"strong"],[12],[2,"Warning!"],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,[32,8,["Body"]],[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[10,"p"],[12],[2,"\\n This service has been deregistered and no longer exists in the catalog.\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[8]}]]],[2,"\\n"]],"parameters":[]},{"statements":[[6,[37,8],[[30,[36,4],[[32,2,["error","status"]],"403"],null]],null,[["default","else"],[{"statements":[[2," "],[8,"notice",[[24,0,"notification-update"],[4,[38,12],null,[["sticky"],[true]]]],[["@type"],["error"]],[["default"],[{"statements":[[2,"\\n "],[8,[32,7,["Header"]],[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[10,"strong"],[12],[2,"Error!"],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,[32,7,["Body"]],[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[10,"p"],[12],[2,"\\n You no longer have access to this service\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[7]}]]],[2,"\\n"]],"parameters":[]},{"statements":[[2," "],[8,"notice",[[24,0,"notification-update"],[4,[38,12],null,[["sticky"],[true]]]],[["@type"],["warning"]],[["default"],[{"statements":[[2,"\\n "],[8,[32,6,["Header"]],[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[10,"strong"],[12],[2,"Warning!"],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,[32,6,["Body"]],[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[10,"p"],[12],[2,"\\n An error was returned whilst loading this data, refresh to try again.\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[6]}]]],[2,"\\n "]],"parameters":[]}]]]],"parameters":[]}]]],[2," "]],"parameters":[5]}]]],[2,"\\n\\n "],[8,"block-slot",[],[["@name"],["loaded"]],[["default"],[{"statements":[[2,"\\n "],[10,"div"],[14,0,"tab-section"],[12],[2,"\\n\\n "],[10,"section"],[15,0,[30,[36,6],["server-failure-tolerance"],null]],[12],[2,"\\n\\n "],[10,"header"],[12],[2,"\\n "],[1,[30,[36,3],[[30,[36,2],[[32,1,["t"]],"tolerance.link",[30,[36,13],null,[["htmlSafe"],[true]]]],null]],null]],[2,"\\n "],[10,"h2"],[12],[2,"\\n "],[1,[30,[36,3],[[30,[36,2],[[32,1,["t"]],"tolerance.header"],null]],null]],[2,"\\n "],[13],[2,"\\n "],[13],[2,"\\n\\n "],[10,"section"],[15,0,[30,[36,6],[[30,[36,5],["immediate-tolerance"],null]],null]],[12],[2,"\\n "],[10,"header"],[12],[2,"\\n "],[10,"h3"],[12],[2,"\\n "],[1,[30,[36,3],[[30,[36,2],[[32,1,["t"]],"tolerance.immediate.header"],null]],null]],[2,"\\n "],[13],[2,"\\n "],[13],[2,"\\n "],[10,"dl"],[15,0,[30,[36,6],[[30,[36,5],["warning",[30,[36,14],[[30,[36,4],[[32,3,["FailureTolerance"]],0],null],[30,[36,4],[[32,3,["OptimisticFailureTolerance"]],0],null]],null]],null]],null]],[12],[2,"\\n "],[10,"dt"],[12],[2,"\\n "],[1,[30,[36,3],[[30,[36,2],[[32,1,["t"]],"tolerance.immediate.body"],null]],null]],[2,"\\n "],[13],[2,"\\n "],[10,"dd"],[12],[2,"\\n "],[1,[32,3,["FailureTolerance"]]],[2,"\\n "],[13],[2,"\\n "],[13],[2,"\\n "],[13],[2,"\\n\\n"],[6,[37,8],[[30,[36,15],["read zones"],null]],null,[["default"],[{"statements":[[2," "],[10,"section"],[15,0,[30,[36,6],[[30,[36,5],["optimistic-tolerance"],null]],null]],[12],[2,"\\n "],[10,"header"],[12],[2,"\\n "],[10,"h3"],[12],[2,"\\n "],[1,[30,[36,3],[[30,[36,2],[[32,1,["t"]],"tolerance.optimistic.header"],null]],null]],[2,"\\n "],[11,"span"],[4,[38,11],["With > 30 seconds between server failures, Consul can restore the Immediate Fault Tolerance by replacing failed active voters with healthy back-up voters when using redundancy zones."],null],[12],[2,"\\n "],[13],[2,"\\n "],[13],[2,"\\n "],[13],[2,"\\n "],[10,"dl"],[15,0,[30,[36,6],[[30,[36,5],["warning",[30,[36,4],[[32,3,["OptimisticFailureTolerance"]],0],null]],null]],null]],[12],[2,"\\n "],[10,"dt"],[12],[2,"\\n "],[1,[30,[36,3],[[30,[36,2],[[32,1,["t"]],"tolerance.optimistic.body"],null]],null]],[2,"\\n "],[13],[2,"\\n "],[10,"dd"],[12],[2,"\\n "],[1,[32,3,["OptimisticFailureTolerance"]]],[2,"\\n "],[13],[2,"\\n "],[13],[2,"\\n\\n "],[13],[2,"\\n"]],"parameters":[]}]]],[2," "],[13],[2,"\\n\\n"],[6,[37,8],[[30,[36,7],[[32,3,["RedundancyZones","length"]],0],null]],null,[["default","else"],[{"statements":[[2," "],[10,"section"],[15,0,[30,[36,6],["redundancy-zones"],null]],[12],[2,"\\n "],[10,"header"],[12],[2,"\\n "],[10,"h2"],[12],[2,"\\n "],[1,[30,[36,1],[[30,[36,0],["common.consul.redundancyzone"],null]],null]],[2,"\\n "],[13],[2,"\\n "],[13],[2,"\\n\\n"],[6,[37,10],[[30,[36,9],[[30,[36,9],[[32,3,["RedundancyZones"]]],null]],null]],null,[["default"],[{"statements":[[6,[37,8],[[30,[36,7],[[32,4,["Servers","length"]],0],null]],null,[["default"],[{"statements":[[2," "],[10,"section"],[12],[2,"\\n "],[10,"header"],[12],[2,"\\n "],[10,"h3"],[12],[2,"\\n "],[1,[32,4,["Name"]]],[2,"\\n "],[13],[2,"\\n "],[10,"dl"],[15,0,[30,[36,6],[[30,[36,5],["warning",[30,[36,4],[[32,4,["FailureTolerance"]],0],null]],null]],null]],[12],[2,"\\n "],[10,"dt"],[12],[1,[30,[36,0],["common.consul.failuretolerance"],null]],[13],[2,"\\n "],[10,"dd"],[12],[1,[32,4,["FailureTolerance"]]],[13],[2,"\\n "],[13],[2,"\\n "],[13],[2,"\\n "],[8,"consul/server/list",[],[["@items"],[[32,4,["Servers"]]]],null],[2,"\\n "],[13],[2,"\\n"]],"parameters":[]}]]]],"parameters":[4]}]]],[2,"\\n"],[6,[37,8],[[30,[36,7],[[32,3,["Default","Servers","length"]],0],null]],null,[["default"],[{"statements":[[2," "],[10,"section"],[12],[2,"\\n "],[10,"header"],[12],[2,"\\n "],[10,"h3"],[12],[2,"\\n "],[1,[30,[36,3],[[30,[36,2],[[32,1,["t"]],"unassigned"],null]],null]],[2,"\\n "],[13],[2,"\\n "],[13],[2,"\\n "],[8,"consul/server/list",[],[["@items"],[[32,3,["Default","Servers"]]]],null],[2,"\\n "],[13],[2,"\\n"]],"parameters":[]}]]],[2,"\\n "],[13],[2,"\\n"]],"parameters":[]},{"statements":[[2," "],[10,"section"],[12],[2,"\\n "],[10,"header"],[12],[2,"\\n "],[10,"h2"],[12],[2,"\\n "],[1,[30,[36,3],[[30,[36,2],[[32,1,["t"]],"servers"],null]],null]],[2,"\\n "],[13],[2,"\\n "],[13],[2,"\\n "],[8,"consul/server/list",[],[["@items"],[[32,3,["Default","Servers"]]]],null],[2,"\\n "],[13],[2,"\\n"]],"parameters":[]}]]],[2,"\\n"],[6,[37,8],[[30,[36,7],[[32,3,["ReadReplicas","length"]],0],null]],null,[["default"],[{"statements":[[2," "],[10,"section"],[12],[2,"\\n "],[10,"header"],[12],[2,"\\n "],[10,"h2"],[12],[2,"\\n "],[1,[30,[36,1],[[30,[36,0],["common.consul.readreplica"],null]],null]],[2,"\\n "],[13],[2,"\\n "],[13],[2,"\\n\\n "],[8,"consul/server/list",[],[["@items"],[[32,3,["ReadReplicas"]]]],null],[2,"\\n "],[13],[2,"\\n"]],"parameters":[]}]]],[2,"\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[3]}]]],[2," "]],"parameters":[2]}]]],[2,"\\n"]],"parameters":[1]}]]],[2,"\\n\\n"]],"hasEval":false,"upvars":["t","pluralize","fn","compute","eq","array","class-map","gt","if","-track-array","each","tooltip","notification","hash","and","can","routeName","uri","let"]}',meta:{moduleName:"consul-ui/templates/dc/show/serverstatus.hbs"}}) -e.default=t})),define("consul-ui/templates/error",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -var t=Ember.HTMLBars.template({id:"KX7JLK/T",block:'{"symbols":[],"statements":[[6,[37,1],[[35,0]],null,[["default"],[{"statements":[[8,"app-error",[],[["@error"],[[34,0]]],null],[2,"\\n"]],"parameters":[]}]]]],"hasEval":false,"upvars":["error","if"]}',meta:{moduleName:"consul-ui/templates/error.hbs"}}) -e.default=t})),define("consul-ui/templates/index",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -var t=Ember.HTMLBars.template({id:"OcrlVtCJ",block:'{"symbols":["route","o"],"statements":[[8,"route",[],[["@name"],[[34,0]]],[["default"],[{"statements":[[2,"\\n "],[8,"outlet",[],[["@name","@model"],[[34,0],[32,1,["model"]]]],[["default"],[{"statements":[[2,"\\n "],[1,[30,[36,2],[[30,[36,1],null,null]],null]],[2,"\\n "]],"parameters":[2]}]]],[2,"\\n"]],"parameters":[1]}]]],[2,"\\n"]],"hasEval":false,"upvars":["routeName","-outlet","component"]}',meta:{moduleName:"consul-ui/templates/index.hbs"}}) -e.default=t})),define("consul-ui/templates/loading",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -var t=Ember.HTMLBars.template({id:"o38EFfaS",block:'{"symbols":[],"statements":[],"hasEval":false,"upvars":[]}',meta:{moduleName:"consul-ui/templates/loading.hbs"}}) -e.default=t})),define("consul-ui/templates/notfound",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -var t=Ember.HTMLBars.template({id:"UjlaBDbX",block:'{"symbols":["route"],"statements":[[8,"route",[],[["@name"],[[34,0]]],[["default"],[{"statements":[[2,"\\n "],[8,"app-error",[],[["@login","@error"],[[32,1,["model","app","login","open"]],[30,[36,1],null,[["status","message"],[404,"Unable to find that page"]]]]],null],[2,"\\n"]],"parameters":[1]}]]],[2,"\\n\\n"]],"hasEval":false,"upvars":["routeName","hash"]}',meta:{moduleName:"consul-ui/templates/notfound.hbs"}}) -e.default=t})),define("consul-ui/templates/oauth-provider-debug",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -var t=Ember.HTMLBars.template({id:"Ngf+ijS4",block:'{"symbols":["route","item"],"statements":[[8,"route",[],[["@name"],[[34,0]]],[["default"],[{"statements":[[2,"\\n"],[10,"div"],[14,5,"width: 50%;margin: 0 auto;"],[12],[2,"\\n "],[10,"h1"],[12],[8,[32,1,["Title"]],[],[["@title"],["Mock OAuth Provider"]],null],[13],[2,"\\n "],[10,"main"],[12],[2,"\\n "],[10,"form"],[14,"method","GET"],[15,"action",[34,1]],[12],[2,"\\n"],[6,[37,3],[[30,[36,2],null,[["state","code"],["state-123456789/abcdefghijklmnopqrstuvwxyz","code-abcdefghijklmnopqrstuvwxyz/123456789"]]]],null,[["default"],[{"statements":[[2," "],[8,"text-input",[],[["@name","@label","@item","@help"],["state","State",[32,2],"The OIDC state value that will get passed through to Consul"]],null],[2,"\\n "],[8,"text-input",[],[["@name","@label","@item","@help"],["code","Code",[32,2],"The OIDC code value that will get passed through to Consul"]],null],[2,"\\n"]],"parameters":[2]}]]],[2," "],[8,"action",[],[["@type"],["submit"]],[["default"],[{"statements":[[2,"\\n Login\\n "]],"parameters":[]}]]],[2,"\\n "],[13],[2,"\\n "],[13],[2,"\\n"],[13],[2,"\\n"]],"parameters":[1]}]]],[2,"\\n"]],"hasEval":false,"upvars":["routeName","redirect_uri","hash","let"]}',meta:{moduleName:"consul-ui/templates/oauth-provider-debug.hbs"}}) -e.default=t})),define("consul-ui/templates/settings",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -var t=Ember.HTMLBars.template({id:"NoqsVAP9",block:'{"symbols":["route","loader","item","disclosure","notice"],"statements":[[8,"route",[],[["@name"],[[34,8]]],[["default"],[{"statements":[[2,"\\n "],[8,"data-loader",[],[["@src"],[[30,[36,9],["settings://consul:client"],null]]],[["default"],[{"statements":[[2,"\\n\\n "],[8,"block-slot",[],[["@name"],["error"]],[["default"],[{"statements":[[2,"\\n "],[8,"app-error",[],[["@error","@login"],[[32,2,["error"]],[32,1,["model","app","login","open"]]]],null],[2,"\\n "]],"parameters":[]}]]],[2,"\\n\\n "],[8,"block-slot",[],[["@name"],["loaded"]],[["default"],[{"statements":[[2,"\\n"],[6,[37,12],[[30,[36,11],[[32,2,["data"]],[30,[36,10],null,[["blocking"],[true]]]],null]],null,[["default"],[{"statements":[[2," "],[8,"app-view",[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[8,"block-slot",[],[["@name"],["header"]],[["default"],[{"statements":[[2,"\\n "],[10,"h1"],[12],[2,"\\n "],[8,[32,1,["Title"]],[],[["@title"],["Settings"]],null],[2,"\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,"block-slot",[],[["@name"],["content"]],[["default"],[{"statements":[[2,"\\n "],[8,"notice",[],[["@type"],["info"]],[["default"],[{"statements":[[2,"\\n "],[8,[32,5,["Header"]],[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[10,"h2"],[12],[2,"Local Storage"],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[8,[32,5,["Body"]],[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[10,"p"],[12],[2,"\\n These settings are immediately saved to local storage and persisted through browser usage.\\n "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[5]}]]],[2,"\\n "],[10,"form"],[12],[2,"\\n"],[6,[37,2],[[30,[36,3],[[30,[36,7],["CONSUL_UI_DISABLE_REALTIME"],null]],null]],null,[["default"],[{"statements":[[2," "],[8,"disclosure",[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[8,[32,4,["Details"]],[],[[],[]],[["default"],[{"statements":[[2,"\\n "],[8,"data-sink",[],[["@data","@sink","@onchange"],[[32,3],"settings://consul:client",[30,[36,1],[[32,0],[30,[36,0],[[32,4,["close"]]],null]],null]]],null],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "],[10,"fieldset"],[12],[2,"\\n "],[10,"h2"],[12],[2,"Blocking Queries"],[13],[2,"\\n "],[10,"p"],[12],[2,"Keep catalog info up-to-date without refreshing the page. Any changes made to services, nodes and intentions would be reflected in real time."],[13],[2,"\\n "],[10,"div"],[14,0,"type-toggle"],[12],[2,"\\n "],[10,"label"],[12],[2,"\\n "],[11,"input"],[24,3,"client[blocking]"],[16,"checked",[30,[36,2],[[32,3,["blocking"]],"checked"],null]],[24,4,"checkbox"],[4,[38,6],["change",[30,[36,5],[[30,[36,4],[[32,3],"blocking",[30,[36,3],[[32,3,["blocking"]]],null]],null],[30,[36,0],[[32,4,["open"]]],null]],null]],null],[12],[13],[2,"\\n "],[10,"span"],[12],[1,[30,[36,2],[[32,3,["blocking"]],"On","Off"],null]],[13],[2,"\\n "],[13],[2,"\\n "],[13],[2,"\\n "],[13],[2,"\\n "]],"parameters":[4]}]]],[2,"\\n"]],"parameters":[]}]]],[2," "],[13],[2,"\\n "]],"parameters":[]}]]],[2,"\\n "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[3]}]]],[2," "]],"parameters":[]}]]],[2,"\\n"]],"parameters":[2]}]]],[2,"\\n"]],"parameters":[1]}]]],[2,"\\n"]],"hasEval":false,"upvars":["fn","action","if","not","set","queue","on","env","routeName","uri","hash","or","let"]}',meta:{moduleName:"consul-ui/templates/settings.hbs"}}) -e.default=t})),define("consul-ui/transforms/array",["exports","ember-data-model-fragments/transforms/array"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -var n=t.default -e.default=n})),define("consul-ui/transforms/boolean",["exports","@ember-data/serializer/-private"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.BooleanTransform}})})),define("consul-ui/transforms/date",["exports","@ember-data/serializer/-private"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.DateTransform}})})),define("consul-ui/transforms/fragment-array",["exports","ember-data-model-fragments/transforms/fragment-array"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -var n=t.default -e.default=n})),define("consul-ui/transforms/fragment",["exports","ember-data-model-fragments/transforms/fragment"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -var n=t.default -e.default=n})),define("consul-ui/transforms/number",["exports","@ember-data/serializer/-private"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.NumberTransform}})})),define("consul-ui/transforms/string",["exports","@ember-data/serializer/-private"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.StringTransform}})})),define("consul-ui/utils/ascend",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(e,t){const n=e.split("/") -return n.length>t?n.slice(0,-t).concat("").join("/"):""}})),define("consul-ui/utils/atob",["exports","base64-js"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(e,n="utf-8"){const r=t.default.toByteArray(e) -return new TextDecoder(n).decode(r)}})),define("consul-ui/utils/btoa",["exports","base64-js"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(e){const n=(new TextEncoder).encode(e) -return t.default.fromByteArray(n)}})) -define("consul-ui/utils/calculate-position",["exports","ember-basic-dropdown/utils/calculate-position"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/utils/callable-type",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(e){return"function"!=typeof e?function(){return e}:e}})),define("consul-ui/utils/create-fingerprinter",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(e,t,n,r=JSON.stringify){return function(a,l,s,i,o){return function(u){if(null==(s=null==s?u[e]:s))throw new Error(`Unable to create fingerprint, missing foreignKey value. Looking for value in \`${e}\` got \`${s}\``) -const c=l.split(",").map((function(e){const t=Ember.get(u,e) -if(null==t||t.length<1)throw new Error(`Unable to create fingerprint, missing slug. Looking for value in \`${e}\` got \`${t}\``) -return t})) -return void 0===u[t]&&("*"===i&&(i="default"),u[t]=i),void 0===u[n]&&("*"===o&&(o="default"),u[n]=o),void 0===u[e]&&(u[e]=s),void 0===u[a]&&(u[a]=r([u[n],u[t],s].concat(c))),u}}}})),define("consul-ui/utils/distance",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(e,t){e=e.Coord,t=t.Coord -let n=0 -for(let s=0;s0&&(a=l) -return Math.round(1e5*a)/100}})),define("consul-ui/utils/dom/click-first-anchor",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(e,n=t){return function(t,r="tr"){switch(t.target.nodeName.toLowerCase()){case"input":case"label":case"a":case"button":return}const a=e(r,t.target).querySelector("a") -a&&n(a)}} -const t=function(e){["mousedown","mouseup","click"].map((function(e){return new MouseEvent(e,{bubbles:!0,cancelable:!0,view:window})})).forEach((function(t){e.dispatchEvent(t)}))}})),define("consul-ui/utils/dom/closest",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(e,t){try{return t.closest(e)}catch(n){return}}})),define("consul-ui/utils/dom/create-listeners",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(e=[]){return new t(e)} -class t{constructor(e=[]){this.listeners=e}add(e,n,r){let a -if("function"==typeof e)a=e -else if(e instanceof t)a=e.remove.bind(e) -else{let t="addEventListener",l="removeEventListener" -void 0===e[t]&&(t="on",l="off") -let s=n -"string"==typeof s&&(s={[n]:r}) -const i=Object.keys(s).map((function(n){return function(n,r){return e[t](n,r),function(){return e[l](n,r),r}}(n,s[n])})) -a=()=>i.map(e=>e())}return this.listeners.push(a),()=>{const e=this.listeners.findIndex((function(e){return e===a})) -return this.listeners.splice(e,1)[0]()}}remove(){const e=this.listeners.map(e=>e()) -return this.listeners.splice(0,this.listeners.length),e}}})),define("consul-ui/utils/dom/event-source/blocking",["exports"],(function(e){function t(e,t){if(null==e)return{} -var n,r,a=function(e,t){if(null==e)return{} -var n,r,a={},l=Object.keys(e) -for(r=0;r=0||(a[n]=e[n]) -return a}(e,t) -if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e) -for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(e,l=n()){const s=function(n,s={}){const{currentEvent:i}=s,o=t(s,["currentEvent"]) -e.apply(this,[e=>{const{createEvent:s}=e,i=t(e,["createEvent"]) -return n.apply(this,[i,this]).catch(l).then(t=>{if(t instanceof Error)return t -let n=("function"==typeof s?s:a)(t,e) -n.type||(n={type:"message",data:n}) -const l=Ember.get(n.data||{},"meta") -l&&(e.cursor=r(l.cursor,e.cursor),e.cacheControl=l.cacheControl,e.interval=l.interval),-1===(e.cacheControl||"").indexOf("no-store")&&(this.currentEvent=n),this.dispatchEvent(n) -const i=function(e){return function(t){return new Promise((function(n){setTimeout((function(){n(t)}),e.interval||2e3)}))}}(e,this.previousEvent) -return this.previousEvent=this.currentEvent,i(t)})},o]),void 0!==i&&(this.currentEvent=i),this.addEventListener("open",e=>{const t=e.target.getCurrentEvent() -void 0!==t&&this.dispatchEvent(t)})} -return s.prototype=Object.assign(Object.create(e.prototype,{constructor:{value:e,configurable:!0,writable:!0}}),{getCurrentEvent:function(){return this.currentEvent},getPreviousEvent:function(){return this.previousEvent}}),s},e.validateCursor=e.createErrorBackoff=void 0 -const n=function(e=3e3,t=Promise,n=setTimeout){return function(r){let a=Ember.get(r,"errors.firstObject.status")||Ember.get(r,"statusCode") -if(void 0!==a)switch(a=a.toString(),!0){case 0===a.indexOf("5")&&3===a.length&&"500"!==a:case"0"===a:return new t((function(t){n((function(){t(r)}),e)}))}throw r}} -e.createErrorBackoff=n -const r=function(e,t=null){let n=parseInt(e) -if(!isNaN(n))return null!==t&&n{if(!(this.readyState>1))return this.readyState=1,this.dispatchEvent({type:"open"}),l(this,n,r)}).catch(e=>{this.dispatchEvent(s(e)),this.readyState=2,this.dispatchEvent({type:"close",error:e})}).then(()=>{this.readyState=2})} -return i.prototype=Object.assign(Object.create(e.prototype,{constructor:{value:i,configurable:!0,writable:!0}}),{close:function(){switch(this.readyState){case 0:case 2:this.readyState=2 -break -default:this.readyState=3}return this}}),i},e.defaultRunner=void 0 -const t=function(e,n,r){if(!r(e))return e.source.bind(e)(n,e).then((function(){return t(e,n,r)})) -e.dispatchEvent({type:"close"})} -e.defaultRunner=t -const n=function(e){return new ErrorEvent("error",{error:e,message:e.message})},r=function(e){switch(e.readyState){case 2:case 3:return!0}return!1}})),define("consul-ui/utils/dom/event-source/index",["exports","consul-ui/utils/dom/create-listeners","consul-ui/utils/dom/event-target/rsvp","consul-ui/utils/dom/event-source/cache","consul-ui/utils/dom/event-source/proxy","consul-ui/utils/dom/event-source/resolver","consul-ui/utils/dom/event-source/callable","consul-ui/utils/dom/event-source/openable","consul-ui/utils/dom/event-source/blocking","consul-ui/utils/dom/event-source/storage","ember-concurrency","consul-ui/env"],(function(e,t,n,r,a,l,s,i,o,u,c,d){let m -switch(Object.defineProperty(e,"__esModule",{value:!0}),e.once=e.toPromise=e.fromPromise=e.cache=e.source=e.resolve=e.proxy=e.StorageEventSource=e.BlockingEventSource=e.OpenableEventSource=e.CallableEventSource=void 0,(0,d.env)("CONSUL_UI_REALTIME_RUNNER")){case"ec":m=function(e,t,n){return Ember.Object.extend({task:(0,c.task)((function*(){for(;!n(e);)yield e.source.bind(e)(t)}))}).create().get("task").perform()} -break -case"generator":m=async function(e,t,n){const r=function*(){for(;!n(e);)yield e.source.bind(e)(t)} -let a,l=r().next() -for(;!l.done;)a=await l.value,l=r().next() -return a} -break -case"async":m=async function(e,t,n){let r -for(;!n(e);)r=await e.source.bind(e)(t) -return r}}const p=(0,s.default)(n.default,Promise,m) -e.CallableEventSource=p -const f=(0,i.default)(p) -e.OpenableEventSource=f -const b=(0,o.default)(f) -e.BlockingEventSource=b -const h=(0,u.default)(n.default,Promise) -e.StorageEventSource=h -const v=(0,a.default)(Ember.ObjectProxy,Ember.ArrayProxy,t.default) -e.proxy=v -const y=(0,l.default)(Promise) -e.resolve=y -const g=function(e){return y(e,(0,t.default)()).then((function(t){return v(e,t)}))} -e.source=g -const O=(0,r.default)(g,b,Promise) -e.cache=O -e.fromPromise=function(e){return new p((function(){const t=this.dispatchEvent.bind(this),n=()=>{this.close()} -return e.then((function(e){n(),t({type:"message",data:e})})).catch((function(e){n(),t(function(e){return new ErrorEvent("error",{error:e,message:e.message})}(e))}))}))} -e.toPromise=function(e,t,n="message",r="error"){return new Promise((function(a,l){const s=function(e){a(e.data)},i=function(e){l(e.error)} -e.addEventListener(n,s),e.addEventListener(r,i),t((function(){"function"==typeof e.close&&e.close(),e.removeEventListener(n,s),e.removeEventListener(r,i)}))}))} -e.once=function(e,t,n=f){return new n((function(t,n){return e(t,n).then((function(e){n.dispatchEvent({type:"message",data:e}),n.close()})).catch((function(e){n.dispatchEvent({type:"error",error:e}),n.close()}))}),t)}})),define("consul-ui/utils/dom/event-source/openable",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(e=EventSource){const t=function(t,n={}){e.apply(this,arguments),this.configuration=n} -return t.prototype=Object.assign(Object.create(e.prototype,{constructor:{value:t,configurable:!0,writable:!0}}),{open:function(){switch(this.readyState){case 3:this.readyState=1 -break -case 2:e.apply(this,[this.source,this.configuration])}return this}}),t}})),define("consul-ui/utils/dom/event-source/proxy",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(e,n,r){return function(a,l=[]){let s=e,i="object" -return"string"!=typeof l&&void 0!==Ember.get(l,"length")&&(s=n,i="array",l=l.filter((function(e){return!Ember.get(e,"isDestroyed")&&!Ember.get(e,"isDeleted")&&Ember.get(e,"isLoaded")}))),void 0===t[i]&&(t[i]=s.extend({init:function(){this.listeners=r(),this.listeners.add(this._source,"message",e=>Ember.set(this,"content",e.data)),this._super(...arguments)},addEventListener:function(e,t){this.listeners.add(this._source,e,t)},getCurrentEvent:function(){return this._source.getCurrentEvent(...arguments)},removeEventListener:function(){return this._source.removeEventListener(...arguments)},dispatchEvent:function(){return this._source.dispatchEvent(...arguments)},close:function(){return this._source.close(...arguments)},open:function(){return this._source.open(...arguments)},willDestroy:function(){this._super(...arguments),this.close(),this.listeners.remove()}})),t[i].create({content:l,_source:a,configuration:a.configuration})}} -const t={}})),define("consul-ui/utils/dom/event-source/resolver",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(e=Promise){return function(t,n){let r -return"function"==typeof t.getCurrentEvent&&(r=t.getCurrentEvent()),null!=r?e.resolve(r.data).then((function(e){return t.open(),e})):new e((function(e,r){n.add(t,"error",(function(e){n.remove(),e.target.close(),r(e.error)})),n.add(t,"message",(function(t){n.remove(),e(t.data)}))}))}}})),define("consul-ui/utils/dom/event-source/storage",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(e,t=Promise){const n=function(e){if((void 0===e||e.key===this.configuration.key)&&1===this.readyState){const e=this.source(this.configuration) -t.resolve(e).then(e=>{this.configuration.cursor++,this._currentEvent={type:"message",data:e},this.dispatchEvent({type:"message",data:e})})}} -return class extends e{constructor(e,t){super(...arguments),this.readyState=2,this.target=t.target||window,this.name="storage",this.source=e,this.handler=n.bind(this),this.configuration=t,this.configuration.cursor=1,this.open()}dispatchEvent(){if(1===this.readyState)return super.dispatchEvent(...arguments)}close(){this.target.removeEventListener(this.name,this.handler),this.readyState=2}getCurrentEvent(){return this._currentEvent}open(){const e=this.readyState -this.readyState=1,1!==e&&(this.target.addEventListener(this.name,this.handler),this.handler())}}}})),define("consul-ui/utils/dom/event-target/event-target-shim/event",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.wrapEvent=function(e,t){return new(function e(t){if(null==t||t===Object.prototype)return l -let r=n.get(t) -null==r&&(r=function(e,t){const n=Object.keys(t) -if(0===n.length)return e -function r(t,n){e.call(this,t,n)}r.prototype=Object.create(e.prototype,{constructor:{value:r,configurable:!0,writable:!0}}) -for(let a=0;a{const n=function(e){return Object.entries(e).reduce((e,[t,n])=>(e[t]="function"!=typeof n?new Set(Object.keys(n)):null,e),{})}(e) -return r=>(r=function(e,n){return Object.keys(n).reduce((r,a)=>{const l=void 0===e[a]?[]:e[a] -return l.length>0&&(null!==n[a]?r[a]=[...t.default.intersection(n[a],new Set(l))]:r[a]=[...new Set(l)]),r},{})}(r,n),t=>function(e,t,n){return Object.entries(t).every(([t,r])=>{let a=n[t] -return"function"==typeof a?a(e,r):r.some(t=>a[t](e,t))})}(t,r,e))}})),define("consul-ui/utils/form/builder",["exports","ember-changeset","consul-ui/utils/form/changeset","ember-changeset-validations","consul-ui/utils/get-form-name-property"],(function(e,t,n,r,a){Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(e=l,t=a.default){return function(n="",r={}){const a={} -let l=null -const s={data:null,name:n,getName:function(){return this.name},setData:function(t){return l&&!Array.isArray(t)&&(t=e(t,l)),Ember.set(this,"data",t),this},getData:function(){return this.data},add:function(e){return a[e.getName()]=e,this},handleEvent:function(e,n){const a=e.target,l=t(n||a.name),s=l[0],i=l[1] -let o=r -if(s!==this.getName()){if(this.has(s))return this.form(s).handleEvent(e) -o=o[s]}const u=this.getData(),c="function"==typeof u.toJSON?u.toJSON():Ember.get(u,"data").toJSON() -if(!Object.keys(c).includes(i)){const e=new Error(i+" property doesn't exist") -throw e.target=a,e}let d=Ember.get(u,i) -if(Array.isArray(d)||void 0!==o[i]&&"string"==typeof o[i].type&&"array"===o[i].type.toLowerCase()){null==d&&(d=[]) -d[a.checked?"pushObject":"removeObject"](a.value),Ember.set(u,i,d)}else void 0===a.checked||"on"!==a.value.toLowerCase()&&"off"!==a.value.toLowerCase()?Ember.set(u,i,a.value):Ember.set(u,i,a.checked) -return this.validate()},reset:function(){return"function"==typeof this.getData().rollbackAttributes&&this.getData().rollbackAttributes(),this},clear:function(e={}){return"function"==typeof e?this.clearer=e:this.setData(this.clearer(e)).getData()},submit:function(e={}){if("function"==typeof e)return this.submitter=e -this.submitter(this.getData())},setValidators:function(e){return l=e,this},validate:function(){const e=this.getData() -return"function"==typeof e.validate&&e.validate(),this},addError:function(){const e=this.getData() -"function"==typeof e.addError&&e.addError(...arguments)},form:function(e){return null==e?this:a[e]},has:function(e){return void 0!==a[e]}} -return s.submit=s.submit.bind(s),s.reset=s.reset.bind(s),s}},e.defaultChangeset=void 0 -const l=function(e,a){return(0,t.Changeset)(e,(0,r.default)(a),a,{changeset:n.default})} -e.defaultChangeset=l})),define("consul-ui/utils/form/changeset",["exports","ember-changeset"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -class n extends t.EmberChangeset{pushObject(e,t){let n -void 0===Ember.get(this,"_changes."+e)?(n=Ember.get(this,"data."+e),n=n?n.toArray():[]):n=this.get(e).slice(0),n.push(t),this.set(""+e,n)}removeObject(e,t){let n -void 0===Ember.get(this,"_changes."+e)?(n=Ember.get(this,"data."+e),n=void 0===n?[]:n.toArray()):n=this.get(e).slice(0) -const r=n.indexOf(t);-1!==r&&n.splice(r,1),this.set(""+e,n)}}e.default=n})),define("consul-ui/utils/get-environment",["exports"],(function(e){function t(e,t){var n=Object.keys(e) -if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e) -t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function n(e){for(var n=1;n"script"===t.initiatorType&&e===t.name)||{}}catch(n){return{}}}(o)),u.nextHopProtocol||"http/1.1" -case"CONSUL_HTTP_MAX_CONNECTIONS":switch(r=n("CONSUL_HTTP_PROTOCOL"),!0){case 0===r.indexOf("h2"):case 0===r.indexOf("hq"):case 0===r.indexOf("spdy"):return -default:return 5}}},d=function(t){let n -switch(e.environment){case"development":case"staging":case"coverage":case"test":if(n=function(e=r.cookie){return e.split(";").filter(e=>""!==e).map(e=>{const[t,...n]=e.trim().split("=") -return[t,n.join("=")]})}().reduce((function(e,[t,n]){switch(t){case"CONSUL_INTL_LOCALE":e.CONSUL_INTL_LOCALE=String(n).toLowerCase() -break -case"CONSUL_INTL_DEBUG":e.CONSUL_INTL_DEBUG=!!JSON.parse(String(n).toLowerCase()) -break -case"CONSUL_ACLS_ENABLE":e.CONSUL_ACLS_ENABLED=!!JSON.parse(String(n).toLowerCase()) -break -case"CONSUL_NSPACES_ENABLE":e.CONSUL_NSPACES_ENABLED=!!JSON.parse(String(n).toLowerCase()) -break -case"CONSUL_SSO_ENABLE":e.CONSUL_SSO_ENABLED=!!JSON.parse(String(n).toLowerCase()) -break -case"CONSUL_PARTITIONS_ENABLE":e.CONSUL_PARTITIONS_ENABLED=!!JSON.parse(String(n).toLowerCase()) -break -case"CONSUL_METRICS_PROXY_ENABLE":e.CONSUL_METRICS_PROXY_ENABLED=!!JSON.parse(String(n).toLowerCase()) -break -case"CONSUL_UI_CONFIG":e.CONSUL_UI_CONFIG=JSON.parse(n) -break -default:e[t]=n}return e}),{}),void 0!==n[t])return n[t]}return e[t]} -return function e(t){switch(t){case"CONSUL_UI_DISABLE_REALTIME":case"CONSUL_UI_DISABLE_ANCHOR_SELECTION":return!!JSON.parse(String(a(t)||0).toLowerCase())||d(t) -case"CONSUL_UI_REALTIME_RUNNER":return a(t)||d(t) -case"CONSUL_UI_CONFIG":case"CONSUL_DATACENTER_LOCAL":case"CONSUL_DATACENTER_PRIMARY":case"CONSUL_ACLS_ENABLED":case"CONSUL_NSPACES_ENABLED":case"CONSUL_SSO_ENABLED":case"CONSUL_PARTITIONS_ENABLED":case"CONSUL_METRICS_PROVIDER":case"CONSUL_METRICS_PROXY_ENABLE":case"CONSUL_SERVICE_DASHBOARD_URL":case"CONSUL_BASE_UI_URL":case"CONSUL_HTTP_PROTOCOL":case"CONSUL_HTTP_MAX_CONNECTIONS":return d(t)||c(t,e) -default:return d(t)}}}})),define("consul-ui/utils/get-form-name-property",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(e){if(-1!==e.indexOf("["))return e.match(/(.*)\[(.*)\]/).slice(1) -return["",e]}})),define("consul-ui/utils/helpers/call-if-type",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(e){return function(t){return function(n,r={}){return typeof n[0]!==e?n[0]:t(n[0],r)}}}})),define("consul-ui/utils/http/consul",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.HEADERS_SYMBOL=e.HEADERS_DIGEST=e.HEADERS_TOKEN=e.HEADERS_INDEX=e.HEADERS_DEFAULT_ACL_POLICY=e.HEADERS_DATACENTER=e.HEADERS_NAMESPACE=e.HEADERS_PARTITION=void 0 -e.HEADERS_PARTITION="X-Consul-Partition" -e.HEADERS_NAMESPACE="X-Consul-Namespace" -e.HEADERS_DATACENTER="X-Consul-Datacenter" -e.HEADERS_DEFAULT_ACL_POLICY="X-Consul-Default-Acl-Policy" -e.HEADERS_INDEX="X-Consul-Index" -e.HEADERS_TOKEN="X-Consul-Token" -e.HEADERS_DIGEST="X-Consul-ContentHash" -e.HEADERS_SYMBOL="__consul_ui_http_headers__"})) -define("consul-ui/utils/http/create-headers",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(){return function(e){return e.reduce((function(e,t){const[n,...r]=t.split(":") -return r.length>0&&(e[n.trim()]=r.join(":").trim()),e}),{})}}})),define("consul-ui/utils/http/create-query-params",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(e=encodeURIComponent){return function t(n,r){return Object.entries(n).reduce((function(n,[a,l]){if(void 0===l)return n -let s=e(a) -return void 0!==r&&(s=`${r}[${s}]`),null===l?n.concat(s):"object"==typeof l?n.concat(t(l,s)):n.concat(`${s}=${e(l)}`)}),[]).join("&")}}})),define("consul-ui/utils/http/create-url",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(e,t){return function(n,...r){let a=1 -return n.map((function(n,l){0===l&&(n=n.trimStart()),-1!==n.indexOf("?")&&1===a&&(a=2),-1!==n.indexOf("\n\n")&&(a=4),-1!==n.indexOf("\n")&&4!==a&&(a=3) -let s=void 0!==r[l]?r[l]:"" -switch(a){case 1:switch(!0){case"string"==typeof s:s=e(s) -break -case Array.isArray(s):s=s.map((function(t){return""+e(t)}),"").join("/")}break -case 2:switch(!0){case"string"==typeof s:s=e(s) -break -case"object"==typeof s:s=t(s)}break -case 4:return n.split("\n\n")[0]}return`${n}${s}`})).join("").trim()}}})),define("consul-ui/utils/http/error",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -class t extends Error{constructor(e,t){super(t),this.statusCode=e}}e.default=t})),define("consul-ui/utils/http/headers",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.CONTENT_TYPE=e.CACHE_CONTROL=void 0 -e.CACHE_CONTROL="Cache-Control" -e.CONTENT_TYPE="Content-Type"})),define("consul-ui/utils/http/method",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.POST=e.DELETE=e.PUT=void 0 -e.PUT="PUT" -e.DELETE="DELETE" -e.POST="POST"})),define("consul-ui/utils/http/request",["exports","consul-ui/utils/dom/event-target/rsvp"],(function(e,t){function n(e,t){var n=Object.keys(e) -if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e) -t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function r(e){for(var t=1;t=200&&this.status<400){const e=r.converters["text json"](this.response) -r.success(t,e,this.status,this.statusText)}else r.error(t,this.responseText,this.status,this.statusText,this.error) -r.complete(this.status)}} -let l=r.url -l.endsWith("?")&&(l=l.substr(0,l.length-1)),a.open(r.method,l,!0),void 0===r.headers&&(r.headers={}) -const s=n(n({},r.headers),{},{"X-Requested-With":"XMLHttpRequest"}) -return Object.entries(s).forEach(([e,t])=>a.setRequestHeader(e,t)),r.beforeSend(a),a.send(r.body),a}}})),define("consul-ui/utils/intl/missing-message",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(e){const t=e.split(".").pop().split("-").join(" ") -return`${t.substr(0,1).toUpperCase()}${t.substr(1)}`}})),define("consul-ui/utils/isFolder",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(e=""){return"/"===e.slice(-1)}})),define("consul-ui/utils/keyToArray",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(e,t="/"){return(e===t?"":e).split(t)}})),define("consul-ui/utils/left-trim",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(e="",t=""){return 0===e.indexOf(t)?e.substr(t.length):e}})),define("consul-ui/utils/maybe-call",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(e,t){return function(n){return t.then((function(t){return t&&e(),n}))}}})),define("consul-ui/utils/merge-checks",["exports","mnemonist/multi-map"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -e.default=(e=[],n=!1,r=t.default)=>{const a=new r,l=e.shift().map(e=>(""===e.ServiceName&&a.set(e.Node,e.CheckID),e)).concat(e.reduce((e,t)=>void 0===t?e:e.concat(t.reduce((e,t)=>{if(""===t.ServiceName){if((a.get(t.Node)||[]).includes(t.CheckID))return e -a.set(t.Node,t.CheckID)}return e.push(t),e},[])),[])) -return n&&l.filter(e=>Ember.get(e,"Exposable")).forEach(e=>{Ember.set(e,"Exposed",n)}),l}})),define("consul-ui/utils/minimizeModel",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(e){if(Array.isArray(e))return e.filter((function(e){return!Ember.get(e,"isNew")})).map((function(e){return{ID:Ember.get(e,"ID"),Name:Ember.get(e,"Name")}}))}})),define("consul-ui/utils/non-empty-set",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(e){return function(t){return null==t||""===t?{}:{[e]:t}}}})),define("consul-ui/utils/path/resolve",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -e.default=(e,t)=>0===t.indexOf("/")?t:t.split("/").reduce((e,t,n,r)=>("."!==t&&(".."===t?e.pop():""===t&&n!==r.length-1||e.push(t)),e),e.split("/")).join("/")})),define("consul-ui/utils/promisedTimeout",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(e=Promise,t=setTimeout){return function(n,r=function(){}){return new e(e=>{r(t((function(){e(n)}),n))})}}})),define("consul-ui/utils/right-trim",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(e="",t=""){const n=e.length-t.length -if(n>=0)return e.lastIndexOf(t)===n?e.substr(0,n):e -return e}})),define("consul-ui/utils/routing/redirect-to",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(e){return function(t){const n=this.routeName.split(".").slice(0,-1).join(".") -this.replaceWith(`${n}.${e}`,t)}}})),define("consul-ui/utils/routing/transitionable",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(e,n={},r){null===e&&(e=r.lookup("route:application")) -let a,l=t(e,n),s=e -for(;a=s.parent;)l=l.concat(t(a,n)),s=a -return l.reverse(),function(e,t){return[e,...t]}(e.name||"application",l)} -const t=function(e,t={}){return(e.paramNames||[]).map((function(n){return void 0!==t[n]?t[n]:e.params[n]})).reverse()}})),define("consul-ui/utils/routing/walk",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(e){return function(){t.apply(this,[e])}},e.dump=e.walk=void 0 -const t=function(e){Object.keys(e).forEach(n=>{if("_options"===n)return -const r=e[n]._options -let a -Object.keys(e[n]).length>1&&(a=function(){t.apply(this,[e[n]])}),this.route(n,r,a)}),void 0===e.index&&(e.index={_options:{path:""}})} -e.walk=t -e.dump=()=>{}})),define("consul-ui/utils/routing/wildcard",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(e){return function(t){let n=!1 -try{n=-1!==Ember.get(e,t)._options.path.indexOf("*")}catch(r){}return n}}})),define("consul-ui/utils/search/exact",["exports","consul-ui/utils/search/predicate"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -class n extends t.default{predicate(e){return e=e.toLowerCase(),(t="")=>-1!==t.toString().toLowerCase().indexOf(e)}}e.default=n})),define("consul-ui/utils/search/fuzzy",["exports","fuse.js"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -e.default=class{constructor(e,n){this.fuse=new t.default(e,{includeMatches:!0,shouldSort:!1,threshold:.4,keys:Object.keys(n.finders)||[],getFn:(e,t)=>(n.finders[t[0]](e)||[]).toString()})}search(e){return this.fuse.search(e).map(e=>e.item)}}})),define("consul-ui/utils/search/predicate",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -e.default=class{constructor(e,t){this.items=e,this.options=t}search(e){const t=this.predicate(e) -return this.items.filter(e=>Object.entries(this.options.finders).some(([n,r])=>{const a=r(e) -return Array.isArray(a)?a.some(t):t(a)}))}}})),define("consul-ui/utils/search/regexp",["exports","consul-ui/utils/search/predicate"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -class n extends t.default{predicate(e){let t -try{t=new RegExp(e,"i")}catch(n){return()=>!1}return e=>t.test(e)}}e.default=n})),define("consul-ui/utils/storage/local-storage",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(e="",t=window.localStorage,n=JSON.stringify,r=JSON.parse,a=function(e){window.dispatchEvent(new StorageEvent("storage",{key:e}))}){const l=e+":" -return{getValue:function(e){let n=t.getItem(`${l}${e}`) -"string"!=typeof n&&(n='""') -try{n=r(n)}catch(a){n=""}return n},setValue:function(e,r){if(null===r)return this.removeValue(e) -try{r=n(r)}catch(i){r='""'}const s=t.setItem(`${l}${e}`,r) -return a(`${l}${e}`),s},removeValue:function(e){const n=t.removeItem(`${l}${e}`) -return a(`${l}${e}`),n},all:function(){return Object.keys(t).reduce((e,t)=>{if(0===t.indexOf(""+l)){const n=t.substr(l.length) -e[n]=this.getValue(n)}return e},{})}}}})),define("consul-ui/utils/templatize",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(e=[]){return e.map(e=>"template-"+e)}})) -define("consul-ui/utils/ticker/index",["exports","consul-ui/utils/dom/event-target/rsvp"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.Tween=e.Ticker=void 0 -const n=class extends t.default{constructor(e=1e3/60){super(),this.setRate(e)}tick(){this.dispatchEvent({type:"tick",target:this})}setRate(e){clearInterval(this._interval),this._interval=setInterval(()=>this.tick(),e)}destroy(){clearInterval(this._interval)}},r=class extends t.default{static destroy(){void 0!==r.defaultTickerGroup&&(r.defaultTickerGroup.destroy(),delete r.defaultTickerGroup)}constructor(e){super(),this.setTickable(e)}tick(){this._tickable.tick()}setTickable(e){this._tickable=e,void 0===this._tickable.getTicker&&(this._tickable.getTicker=()=>this),this.tick=this._tickable.tick.bind(this._tickable)}getTickable(){return this._tickable}isAlive(){return this._isAlive}start(){this._isAlive=!0,this.getTickerGroup().addEventListener("tick",this.tick),this.dispatchEvent({type:"start",target:this})}stop(){this._isAlive=!1,this.getTickerGroup().removeEventListener("tick",this.tick),this.dispatchEvent({type:"stop",target:this})}activeCount(){return this.getTickerGroup().activeCount()}setTickerGroup(e){this._group=e}getTickerGroup(){return void 0===this._group&&(void 0===r.defaultTickerGroup&&(r.defaultTickerGroup=new l),this._group=r.defaultTickerGroup),this._group}} -e.Ticker=r -const a=function(e,t,n,r){return e/=r,n*(--e*e*e+1)+t},l=n,s=class extends class{constructor(){this._currentframe=1,this.setIncrement(1)}isAtStart(){return this._currentframe<=1}isAtEnd(){return this._currentframe>=this._totalframes}addEventListener(){return this.getTicker().addEventListener(...arguments)}removeEventListener(){return this.getTicker().removeEventListener(...arguments)}stop(){return this.gotoAndStop(this._currentframe)}play(){return this.gotoAndPlay(this._currentframe)}start(){return this.gotoAndPlay(this._currentframe)}gotoAndStop(e){this._currentframe=e -const t=this.getTicker() -return t.isAlive()&&t.stop(),this}gotoAndPlay(e){this._currentframe=e -const t=this.getTicker() -return t.isAlive()||t.start(),this}getTicker(){return void 0===this._ticker&&(this._ticker=new r(this)),this._ticker}setFrames(e){return this._totalframes=e,this}setIncrement(e){return this._increment=e,this}}{static destroy(){r.destroy()}static to(e,t,n,r){return Object.keys(t).forEach((function(n){t[n]-=e[n]})),new s(e,t,n,r).play()}constructor(e,t,n=12,r=a){super(),this.setMethod(r),this.setProps(t),this.setTarget(e),this.setFrames(n),this.tick=this.forwards}_process(){Object.keys(this._props).forEach(e=>{const t=this._method(this._currentframe,this._initialstate[e],this._props[e],this._totalframes) -Ember.set(this._target,e,t)})}forwards(){this._currentframe<=this._totalframes?(this._process(),this._currentframe+=this._increment):(this._currentframe=this._totalframes,this.getTicker().stop())}backwards(){this._currentframe-=this._increment,this._currentframe>=0?this._process():(this.run=this.forwards,this._currentframe=1,this.getTicker().stop())}gotoAndPlay(){return void 0===this._initialstate&&(this._initialstate={},Object.keys(this._props).forEach(e=>{this._initialstate[e]=this._target[e]})),super.gotoAndPlay(...arguments)}setTarget(e){this._target=e}getTarget(e){return this._target}setProps(e){return this._props=e,this}setMethod(e){this._method=e}} -e.Tween=s})),define("consul-ui/utils/titleize",["exports","ember-cli-string-helpers/utils/titleize"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("consul-ui/utils/tomography",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(e){return function(t,n){var r=999999999,a=-999999999,l=[] -n.forEach((function(s){if(t==s.Node){var i=s.Segment -n.forEach((function(t){if(s.Node!=t.Node&&t.Segment==i){var n=e(s,t) -l.push({node:t.Node,distance:n,segment:i}),na&&(a=n)}})),l.sort((function(e,t){return e.distance-t.distance}))}})) -var s,i=l.length,o=Math.floor(i/2) -return i>0?s=i%2?l[o].distance:(l[o-1].distance+l[o].distance)/2:(s=0,r=0,a=0),{distances:l,min:Math.trunc(100*r)/100,median:Math.trunc(100*s)/100,max:Math.trunc(100*a)/100}}}})),define("consul-ui/utils/ucfirst",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(e){return`${e.substr(0,1).toUpperCase()}${e.substr(1)}`}})),define("consul-ui/utils/update-array-object",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(e,t,n,r){r=void 0===r?Ember.get(t,n):r -const a=e.findIndex((function(e){return Ember.get(e,n)===r}));-1!==a&&(t instanceof Ember.ObjectProxy&&Ember.set(t,"content",e.objectAt(a)),e.replace(a,1,[t])) -return t}})),define("consul-ui/validations/intention-permission-http-header",["exports","ember-changeset-validations/validators","ember-changeset-conditional-validations/validators/sometimes"],(function(e,t,n){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -e.default=()=>({Name:[(0,t.validatePresence)(!0)],Value:(0,n.default)([(0,t.validatePresence)(!0)],(function(){return"Present"!==this.get("HeaderType")}))})})),define("consul-ui/validations/intention-permission",["exports","ember-changeset-validations/validators","ember-changeset-conditional-validations/validators/sometimes"],(function(e,t,n){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -e.default=e=>({"*":(0,n.default)([(0,t.validatePresence)(!0)],(function(){const e=this.get("HTTP.Methods")||[],t=this.get("HTTP.Header")||[],n=this.get("HTTP.PathType")||"NoPath",r=this.get("HTTP.Path")||"" -return![0!==e.length,0!==t.length,"NoPath"!==n&&""!==r].includes(!0)})),Action:[(0,t.validateInclusion)({in:e["intention-permission"].Action.allowedValues})],HTTP:{Path:(0,n.default)([(0,t.validateFormat)({regex:/^\//})],(function(){const e=this.get("HTTP.PathType") -return void 0!==e&&"NoPath"!==e}))}})})),define("consul-ui/validations/intention",["exports","ember-changeset-validations/validators","ember-changeset-conditional-validations/validators/sometimes"],(function(e,t,n){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -var r={"*":(0,n.default)([(0,t.validatePresence)(!0)],(function(){const e=this.get("Action")||"",t=this.get("Permissions")||[] -return""===e&&0===t.length})),SourceName:[(0,t.validatePresence)(!0),(0,t.validateLength)({min:1})],DestinationName:[(0,t.validatePresence)(!0),(0,t.validateLength)({min:1})],Permissions:[(0,n.default)([(0,t.validateLength)({min:1})],(function(){return!this.get("Action")}))]} -e.default=r})),define("consul-ui/validations/kv",["exports","ember-changeset-validations/validators"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -var n={Key:[(0,t.validatePresence)(!0),(0,t.validateLength)({min:1})]} -e.default=n})),define("consul-ui/validations/policy",["exports","ember-changeset-validations/validators"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -var n={Name:(0,t.validateFormat)({regex:/^[A-Za-z0-9\-_]{1,128}$/})} -e.default=n})),define("consul-ui/validations/role",["exports","ember-changeset-validations/validators"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -var n={Name:(0,t.validateFormat)({regex:/^[A-Za-z0-9\-_]{1,256}$/})} -e.default=n})),define("consul-ui/validations/token",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -e.default={}})),define("consul-ui/config/environment",[],(function(){try{var e="consul-ui/config/environment",t=document.querySelector('meta[name="'+e+'"]').getAttribute("content"),n={default:JSON.parse(decodeURIComponent(t))} -return Object.defineProperty(n,"__esModule",{value:!0}),n}catch(r){throw new Error('Could not read config from meta tag with name "'+e+'".')}})),runningTests||require("consul-ui/app").default.create({name:"consul-ui",version:"2.2.0+89053cb2"}) diff --git a/agent/uiserver/dist/assets/consul-ui-f5d0ec3be8cca14adb133c8e2f488419.css b/agent/uiserver/dist/assets/consul-ui-f5d0ec3be8cca14adb133c8e2f488419.css new file mode 100644 index 00000000000..f09dcd203cf --- /dev/null +++ b/agent/uiserver/dist/assets/consul-ui-f5d0ec3be8cca14adb133c8e2f488419.css @@ -0,0 +1 @@ +@charset "UTF-8";.hds-table,table{border-spacing:0}progress,sub,sup{vertical-align:baseline}.container,.w-full{width:100%}.hover\:scale-125:hover,.scale-100,.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.ease-in-out,.transition{transition-timing-function:cubic-bezier(.4,0,.2,1)}*,::after,::before{border-width:0;border-style:solid;border-color:currentColor}html{line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji"}a,hr{color:inherit}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;font-weight:inherit;line-height:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}menu,ol,ul{list-style:none;margin:0;padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}[role=button],button{cursor:pointer}:disabled{cursor:default}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{height:auto}::-webkit-backdrop{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-scroll-snap-strictness:proximity;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgb(59 130 246 / 0.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000}::backdrop{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-scroll-snap-strictness:proximity;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgb(59 130 246 / 0.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000}@media (min-width:640px){.container{max-width:640px}}@media (min-width:768px){.container{max-width:768px}}@media (min-width:1024px){.container{max-width:1024px}}@media (min-width:1280px){.container{max-width:1280px}}@media (min-width:1536px){.container{max-width:1536px}}.visible{visibility:visible}.invisible{visibility:hidden}.static{position:static}.fixed{position:fixed}.absolute{position:absolute}.hds-breadcrumb,.hds-breadcrumb__item,.relative{position:relative}.sticky{position:-webkit-sticky;position:sticky}.bottom-0{bottom:0}.isolate{isolation:isolate}.ml-4{margin-left:1rem}.mb-3{margin-bottom:.75rem}.mt-2{margin-top:.5rem}.mb-1{margin-bottom:.25rem}.mr-1\.5{margin-right:.375rem}.mr-1{margin-right:.25rem}.mr-2\.5{margin-right:.625rem}.mr-2{margin-right:.5rem}.mt-6{margin-top:1.5rem}.mb-2{margin-bottom:.5rem}.mr-0\.5{margin-right:.125rem}.mr-0{margin-right:0}.mb-6{margin-bottom:1.5rem}.mt-3{margin-top:.75rem}.block{display:block}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.contents{display:contents}.hidden{display:none}.h-16{height:4rem}.h-8{height:2rem}.h-4{height:1rem}.h-48{height:12rem}.h-full{height:100%}.h-12{height:3rem}.h-24{height:6rem}.w-8{width:2rem}.w-4{width:1rem}.w-24{width:6rem}.\!w-80{width:20rem!important}.flex-1{flex:1 1 0%}.shrink-0{flex-shrink:0}.scale-100{--tw-scale-x:1;--tw-scale-y:1}.cursor-pointer{cursor:pointer}.resize{resize:both}.flex-col{flex-direction:column}.flex-nowrap{flex-wrap:nowrap}.items-center{align-items:center}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-1\.5{gap:.375rem}.gap-1{gap:.25rem}.space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.5rem * var(--tw-space-x-reverse));margin-left:calc(.5rem * calc(1 - var(--tw-space-x-reverse)))}.space-x-12>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(3rem * var(--tw-space-x-reverse));margin-left:calc(3rem * calc(1 - var(--tw-space-x-reverse)))}.overflow-x-auto{overflow-x:auto}.overflow-y-scroll{overflow-y:scroll}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.rounded{border-radius:.25rem}.border{border-width:1px}.p-6{padding:1.5rem}.px-4{padding-left:1rem;padding-right:1rem}.px-3{padding-left:.75rem;padding-right:.75rem}.uppercase{text-transform:uppercase}.lowercase{text-transform:lowercase}.capitalize,.type-source.popover-select li:not(.partition) button{text-transform:capitalize}.underline{-webkit-text-decoration-line:underline;text-decoration-line:underline}.opacity-0{opacity:0}.shadow{--tw-shadow:0 1px 3px 0 rgb(0 0 0 / 0.1),0 1px 2px -1px rgb(0 0 0 / 0.1);--tw-shadow-colored:0 1px 3px 0 var(--tw-shadow-color),0 1px 2px -1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.outline{outline-style:solid}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.transition{transition-property:color,background-color,border-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-text-decoration-color,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-text-decoration-color,-webkit-backdrop-filter;transition-duration:150ms}.consul-surface-nav{background:var(--token-color-palette-neutral-700)}:root{--token-color-palette-blue-500:#1c345f;--token-color-palette-blue-400:#0046d1;--token-color-palette-blue-300:#0c56e9;--token-color-palette-blue-200:#1060ff;--token-color-palette-blue-100:#cce3fe;--token-color-palette-blue-50:#f2f8ff;--token-color-palette-purple-500:#42215b;--token-color-palette-purple-400:#7b00db;--token-color-palette-purple-300:#911ced;--token-color-palette-purple-200:#a737ff;--token-color-palette-purple-100:#ead2fe;--token-color-palette-purple-50:#f9f2ff;--token-color-palette-green-500:#054220;--token-color-palette-green-400:#006619;--token-color-palette-green-300:#00781e;--token-color-palette-green-200:#008a22;--token-color-palette-green-100:#cceeda;--token-color-palette-green-50:#f2fbf6;--token-color-palette-amber-500:#542800;--token-color-palette-amber-400:#803d00;--token-color-palette-amber-300:#9e4b00;--token-color-palette-amber-200:#bb5a00;--token-color-palette-amber-100:#fbeabf;--token-color-palette-amber-50:#fff9e8;--token-color-palette-red-500:#51130a;--token-color-palette-red-400:#940004;--token-color-palette-red-300:#c00005;--token-color-palette-red-200:#e52228;--token-color-palette-red-100:#fbd4d4;--token-color-palette-red-50:#fff5f5;--token-color-palette-neutral-700:#0c0c0e;--token-color-palette-neutral-600:#3b3d45;--token-color-palette-neutral-500:#656a76;--token-color-palette-neutral-400:#8c909c;--token-color-palette-neutral-300:#c2c5cb;--token-color-palette-neutral-200:#dedfe3;--token-color-palette-neutral-100:#f1f2f3;--token-color-palette-neutral-50:#fafafa;--token-color-palette-neutral-0:#ffffff;--token-color-palette-alpha-300:#3b3d4566;--token-color-palette-alpha-200:#656a7633;--token-color-palette-alpha-100:#656a761a;--token-color-border-primary:#656a7633;--token-color-border-faint:#656a761a;--token-color-border-strong:#3b3d4566;--token-color-border-action:#cce3fe;--token-color-border-highlight:#ead2fe;--token-color-border-success:#cceeda;--token-color-border-warning:#fbeabf;--token-color-border-critical:#fbd4d4;--token-color-focus-action-internal:#0c56e9;--token-color-focus-action-external:#5990ff;--token-color-focus-critical-internal:#c00005;--token-color-focus-critical-external:#dd7578;--token-color-foreground-strong:#0c0c0e;--token-color-foreground-primary:#3b3d45;--token-color-foreground-faint:#656a76;--token-color-foreground-high-contrast:#ffffff;--token-color-foreground-disabled:#8c909c;--token-color-foreground-action:#1060ff;--token-color-foreground-action-hover:#0c56e9;--token-color-foreground-action-active:#0046d1;--token-color-foreground-highlight:#a737ff;--token-color-foreground-highlight-on-surface:#911ced;--token-color-foreground-highlight-high-contrast:#42215b;--token-color-foreground-success:#008a22;--token-color-foreground-success-on-surface:#00781e;--token-color-foreground-success-high-contrast:#054220;--token-color-foreground-warning:#bb5a00;--token-color-foreground-warning-on-surface:#9e4b00;--token-color-foreground-warning-high-contrast:#542800;--token-color-foreground-critical:#e52228;--token-color-foreground-critical-on-surface:#c00005;--token-color-foreground-critical-high-contrast:#51130a;--token-color-page-primary:#ffffff;--token-color-page-faint:#fafafa;--token-color-surface-primary:#ffffff;--token-color-surface-faint:#fafafa;--token-color-surface-strong:#f1f2f3;--token-color-surface-interactive:#ffffff;--token-color-surface-interactive-hover:#f1f2f3;--token-color-surface-interactive-active:#dedfe3;--token-color-surface-interactive-disabled:#fafafa;--token-color-surface-action:#f2f8ff;--token-color-surface-highlight:#f9f2ff;--token-color-surface-success:#f2fbf6;--token-color-surface-warning:#fff9e8;--token-color-surface-critical:#fff5f5;--token-color-hashicorp-brand:#000000;--token-color-boundary-brand:#f24c53;--token-color-boundary-foreground:#cf2d32;--token-color-boundary-surface:#ffecec;--token-color-boundary-border:#fbd7d8;--token-color-boundary-gradient-primary-start:#f97076;--token-color-boundary-gradient-primary-stop:#db363b;--token-color-boundary-gradient-faint-start:#fffafa;--token-color-boundary-gradient-faint-stop:#ffecec;--token-color-consul-brand:#e03875;--token-color-consul-foreground:#d01c5b;--token-color-consul-surface:#ffe9f1;--token-color-consul-border:#ffcede;--token-color-consul-gradient-primary-start:#ff99be;--token-color-consul-gradient-primary-stop:#da306e;--token-color-consul-gradient-faint-start:#fff9fb;--token-color-consul-gradient-faint-stop:#ffe9f1;--token-color-hcp-brand:#000000;--token-color-nomad-brand:#06d092;--token-color-nomad-foreground:#008661;--token-color-nomad-surface:#d3fdeb;--token-color-nomad-border:#bff3dd;--token-color-nomad-gradient-primary-start:#bff3dd;--token-color-nomad-gradient-primary-stop:#60dea9;--token-color-nomad-gradient-faint-start:#f3fff9;--token-color-nomad-gradient-faint-stop:#d3fdeb;--token-color-packer-brand:#02a8ef;--token-color-packer-foreground:#007eb4;--token-color-packer-surface:#d4f2ff;--token-color-packer-border:#b4e4ff;--token-color-packer-gradient-primary-start:#b4e4ff;--token-color-packer-gradient-primary-stop:#63d0ff;--token-color-packer-gradient-faint-start:#f3fcff;--token-color-packer-gradient-faint-stop:#d4f2ff;--token-color-terraform-brand:#7b42bc;--token-color-terraform-foreground:#773cb4;--token-color-terraform-surface:#f4ecff;--token-color-terraform-border:#ebdbfc;--token-color-terraform-gradient-primary-start:#bb8deb;--token-color-terraform-gradient-primary-stop:#844fba;--token-color-terraform-gradient-faint-start:#fcfaff;--token-color-terraform-gradient-faint-stop:#f4ecff;--token-color-vagrant-brand:#1868f2;--token-color-vagrant-foreground:#1c61d8;--token-color-vagrant-surface:#d6ebff;--token-color-vagrant-border:#c7dbfc;--token-color-vagrant-gradient-primary-start:#c7dbfc;--token-color-vagrant-gradient-primary-stop:#7dadff;--token-color-vagrant-gradient-faint-start:#f4faff;--token-color-vagrant-gradient-faint-stop:#d6ebff;--token-color-vault-brand:#ffd814;--token-color-vault-brand-alt:#000000;--token-color-vault-foreground:#9a6f00;--token-color-vault-surface:#fff9cf;--token-color-vault-border:#feec7b;--token-color-vault-gradient-primary-start:#feec7b;--token-color-vault-gradient-primary-stop:#ffe543;--token-color-vault-gradient-faint-start:#fffdf2;--token-color-vault-gradient-faint-stop:#fff9cf;--token-color-waypoint-brand:#14c6cb;--token-color-waypoint-foreground:#008196;--token-color-waypoint-surface:#e0fcff;--token-color-waypoint-border:#cbf1f3;--token-color-waypoint-gradient-primary-start:#cbf1f3;--token-color-waypoint-gradient-primary-stop:#62d4dc;--token-color-waypoint-gradient-faint-start:#f6feff;--token-color-waypoint-gradient-faint-stop:#e0fcff;--token-elevation-inset-box-shadow:inset 0px 1px 2px 1px #656a761a;--token-elevation-low-box-shadow:0px 1px 1px 0px #656a760d,0px 2px 2px 0px #656a760d;--token-elevation-mid-box-shadow:0px 2px 3px 0px #656a761a,0px 8px 16px -10px #656a7633;--token-elevation-high-box-shadow:0px 2px 3px 0px #656a7626,0px 16px 16px -10px #656a7633;--token-elevation-higher-box-shadow:0px 2px 3px 0px #656a761a,0px 12px 28px 0px #656a7640;--token-elevation-overlay-box-shadow:0px 2px 3px 0px #3b3d4580,0px 12px 24px 0px #3b3d4599;--token-surface-inset-box-shadow:inset 0 0 0 1px #656a764d,inset 0px 1px 2px 1px #656a761a;--token-surface-base-box-shadow:0 0 0 1px #656a7633;--token-surface-low-box-shadow:0 0 0 1px #656a7626,0px 1px 1px 0px #656a760d,0px 2px 2px 0px #656a760d;--token-surface-mid-box-shadow:0 0 0 1px #656a7626,0px 2px 3px 0px #656a761a,0px 8px 16px -10px #656a7633;--token-surface-high-box-shadow:0 0 0 1px #656a7640,0px 2px 3px 0px #656a7626,0px 16px 16px -10px #656a7633;--token-surface-higher-box-shadow:0 0 0 1px #656a7633,0px 2px 3px 0px #656a761a,0px 12px 28px 0px #656a7640;--token-surface-overlay-box-shadow:0 0 0 1px #3b3d4566,0px 2px 3px 0px #3b3d4580,0px 12px 24px 0px #3b3d4599;--token-focus-ring-action-box-shadow:inset 0 0 0 1px #0c56e9,0 0 0 3px #5990ff;--token-focus-ring-critical-box-shadow:inset 0 0 0 1px #c00005,0 0 0 3px #dd7578;--token-form-label-color:#0c0c0e;--token-form-legend-color:#0c0c0e;--token-form-helper-text-color:#656a76;--token-form-indicator-optional-color:#656a76;--token-form-error-color:#c00005;--token-form-error-icon-size:14px;--token-form-checkbox-size:16px;--token-form-checkbox-border-radius:3px;--token-form-checkbox-border-width:1px;--token-form-checkbox-background-image-size:12px;--token-form-checkbox-background-image-data-url:url("data:image/svg+xml,%3csvg viewBox='0 0 12 12' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M9.78033 3.21967C10.0732 3.51256 10.0732 3.98744 9.78033 4.28033L5.28033 8.78033C4.98744 9.07322 4.51256 9.07322 4.21967 8.78033L2.21967 6.78033C1.92678 6.48744 1.92678 6.01256 2.21967 5.71967C2.51256 5.42678 2.98744 5.42678 3.28033 5.71967L4.75 7.18934L8.71967 3.21967C9.01256 2.92678 9.48744 2.92678 9.78033 3.21967Z' fill='%23FFF'/%3e%3c/svg%3e");--token-form-checkbox-background-image-data-url-disabled:url("data:image/svg+xml,%3csvg viewBox='0 0 12 12' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M9.78033 3.21967C10.0732 3.51256 10.0732 3.98744 9.78033 4.28033L5.28033 8.78033C4.98744 9.07322 4.51256 9.07322 4.21967 8.78033L2.21967 6.78033C1.92678 6.48744 1.92678 6.01256 2.21967 5.71967C2.51256 5.42678 2.98744 5.42678 3.28033 5.71967L4.75 7.18934L8.71967 3.21967C9.01256 2.92678 9.48744 2.92678 9.78033 3.21967Z' fill='%238C909C'/%3e%3c/svg%3e");--token-form-control-base-foreground-value-color:#0c0c0e;--token-form-control-base-foreground-placeholder-color:#656a76;--token-form-control-base-surface-color-default:#ffffff;--token-form-control-base-surface-color-hover:#f1f2f3;--token-form-control-base-border-color-default:#8c909c;--token-form-control-base-border-color-hover:#656a76;--token-form-control-checked-foreground-color:#ffffff;--token-form-control-checked-surface-color-default:#1060ff;--token-form-control-checked-surface-color-hover:#0c56e9;--token-form-control-checked-border-color-default:#0c56e9;--token-form-control-checked-border-color-hover:#0046d1;--token-form-control-invalid-border-color-default:#c00005;--token-form-control-invalid-border-color-hover:#940004;--token-form-control-readonly-foreground-color:#3b3d45;--token-form-control-readonly-surface-color:#f1f2f3;--token-form-control-readonly-border-color:#656a761a;--token-form-control-disabled-foreground-color:#8c909c;--token-form-control-disabled-surface-color:#fafafa;--token-form-control-disabled-border-color:#656a7633;--token-form-control-padding:7px;--token-form-control-border-radius:5px;--token-form-control-border-width:1px;--token-form-radio-size:16px;--token-form-radio-border-width:1px;--token-form-radio-background-image-size:12px;--token-form-radio-background-image-data-url:url("data:image/svg+xml,%3csvg width='12' height='12' xmlns='http://www.w3.org/2000/svg'%3e%3ccircle cx='6' cy='6' r='2.5' fill='%23ffffff'/%3e%3c/svg%3e");--token-form-radio-background-image-data-url-disabled:url("data:image/svg+xml,%3csvg width='12' height='12' xmlns='http://www.w3.org/2000/svg'%3e%3ccircle cx='6' cy='6' r='2.5' fill='%238C909C'/%3e%3c/svg%3e");--token-form-select-background-image-size:16px;--token-form-select-background-image-position-right-x:7px;--token-form-select-background-image-position-top-y:9px;--token-form-select-background-image-data-url:url("data:image/svg+xml,%3Csvg viewBox='0 0 16 16' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M8.55 2.24a.75.75 0 0 0-1.1 0L4.2 5.74a.75.75 0 1 0 1.1 1.02L8 3.852l2.7 2.908a.75.75 0 1 0 1.1-1.02l-3.25-3.5Zm-1.1 11.52a.75.75 0 0 0 1.1 0l3.25-3.5a.75.75 0 1 0-1.1-1.02L8 12.148 5.3 9.24a.75.75 0 0 0-1.1 1.02l3.25 3.5Z' fill='%23656A76'/%3E%3C/svg%3E");--token-form-select-background-image-data-url-disabled:url("data:image/svg+xml,%3Csvg viewBox='0 0 16 16' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M8.55 2.24a.75.75 0 0 0-1.1 0L4.2 5.74a.75.75 0 1 0 1.1 1.02L8 3.852l2.7 2.908a.75.75 0 1 0 1.1-1.02l-3.25-3.5Zm-1.1 11.52a.75.75 0 0 0 1.1 0l3.25-3.5a.75.75 0 1 0-1.1-1.02L8 12.148 5.3 9.24a.75.75 0 0 0-1.1 1.02l3.25 3.5Z' fill='%238C909C'/%3E%3C/svg%3E");--token-form-text-input-background-image-size:16px;--token-form-text-input-background-image-position-x:7px;--token-form-text-input-background-image-data-url-date:url("data:image/svg+xml,%3csvg viewBox='0 0 16 16' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M11.5.75a.75.75 0 00-1.5 0V1H6V.75a.75.75 0 00-1.5 0V1H3.25A2.25 2.25 0 001 3.25v9.5A2.25 2.25 0 003.25 15h9.5A2.25 2.25 0 0015 12.75v-9.5A2.25 2.25 0 0012.75 1H11.5V.75zm-7 2.5V2.5H3.25a.75.75 0 00-.75.75V5h11V3.25a.75.75 0 00-.75-.75H11.5v.75a.75.75 0 01-1.5 0V2.5H6v.75a.75.75 0 01-1.5 0zm9 3.25h-11v6.25c0 .414.336.75.75.75h9.5a.75.75 0 00.75-.75V6.5z' fill-rule='evenodd' clip-rule='evenodd' fill='%233B3D45'/%3e%3c/svg%3e");--token-form-text-input-background-image-data-url-time:url("data:image/svg+xml,%3csvg viewBox='0 0 16 16' xmlns='http://www.w3.org/2000/svg'%3e%3cg fill='%233B3D45'%3e%3cpath d='M8.5 3.75a.75.75 0 00-1.5 0V8c0 .284.16.544.415.67l2.5 1.25a.75.75 0 10.67-1.34L8.5 7.535V3.75z'/%3e%3cpath d='M8 0a8 8 0 100 16A8 8 0 008 0zM1.5 8a6.5 6.5 0 1113 0 6.5 6.5 0 01-13 0z' fill-rule='evenodd' clip-rule='evenodd'/%3e%3c/g%3e%3c/svg%3e");--token-form-text-input-background-image-data-url-search:url("data:image/svg+xml,%3csvg viewBox='0 0 16 16' xmlns='http://www.w3.org/2000/svg'%3e%3cg fill='%23656A76'%3e%3cpath d='M7.25 2a5.25 5.25 0 103.144 9.455l2.326 2.325a.75.75 0 101.06-1.06l-2.325-2.326A5.25 5.25 0 007.25 2zM3.5 7.25a3.75 3.75 0 117.5 0 3.75 3.75 0 01-7.5 0z' fill-rule='evenodd' clip-rule='evenodd'/%3e%3c/g%3e%3c/svg%3e");--token-form-text-input-background-image-data-url-search-cancel:url("data:image/svg+xml,%3csvg viewBox='0 0 16 16' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M12.78 4.28a.75.75 0 00-1.06-1.06L8 6.94 4.28 3.22a.75.75 0 00-1.06 1.06L6.94 8l-3.72 3.72a.75.75 0 101.06 1.06L8 9.06l3.72 3.72a.75.75 0 101.06-1.06L9.06 8l3.72-3.72z'/%3e%3c/svg%3e");--token-form-toggle-width:32px;--token-form-toggle-height:16px;--token-form-toggle-base-surface-color-default:#f1f2f3;--token-form-toggle-border-radius:3px;--token-form-toggle-border-width:1px;--token-form-toggle-background-image-size:12px;--token-form-toggle-background-image-position-x:2px;--token-form-toggle-background-image-data-url:url("data:image/svg+xml,%3csvg viewBox='0 0 12 12' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M9.78033 3.21967C10.0732 3.51256 10.0732 3.98744 9.78033 4.28033L5.28033 8.78033C4.98744 9.07322 4.51256 9.07322 4.21967 8.78033L2.21967 6.78033C1.92678 6.48744 1.92678 6.01256 2.21967 5.71967C2.51256 5.42678 2.98744 5.42678 3.28033 5.71967L4.75 7.18934L8.71967 3.21967C9.01256 2.92678 9.48744 2.92678 9.78033 3.21967Z' fill='%23FFF'/%3e%3c/svg%3e");--token-form-toggle-background-image-data-url-disabled:url("data:image/svg+xml,%3csvg viewBox='0 0 12 12' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M9.78033 3.21967C10.0732 3.51256 10.0732 3.98744 9.78033 4.28033L5.28033 8.78033C4.98744 9.07322 4.51256 9.07322 4.21967 8.78033L2.21967 6.78033C1.92678 6.48744 1.92678 6.01256 2.21967 5.71967C2.51256 5.42678 2.98744 5.42678 3.28033 5.71967L4.75 7.18934L8.71967 3.21967C9.01256 2.92678 9.48744 2.92678 9.78033 3.21967Z' fill='%238C909C'/%3e%3c/svg%3e");--token-form-toggle-transition-duration:0.2s;--token-form-toggle-transition-timing-function:cubic-bezier(0.68, -0.2, 0.265, 1.15);--token-form-toggle-thumb-size:16px;--token-typography-font-stack-display:-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;--token-typography-font-stack-text:-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;--token-typography-font-stack-code:ui-monospace,Menlo,Consolas,monospace;--token-typography-font-weight-regular:400;--token-typography-font-weight-medium:500;--token-typography-font-weight-semibold:600;--token-typography-font-weight-bold:700;--token-typography-display-500-font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;--token-typography-display-500-font-size:1.875rem;--token-typography-display-500-line-height:1.2666;--token-typography-display-400-font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;--token-typography-display-400-font-size:1.5rem;--token-typography-display-400-line-height:1.3333;--token-typography-display-300-font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;--token-typography-display-300-font-size:1.125rem;--token-typography-display-300-line-height:1.3333;--token-typography-display-300-letter-spacing:-0.5px;--token-typography-display-200-font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;--token-typography-display-200-font-size:1rem;--token-typography-display-200-line-height:1.5;--token-typography-display-200-letter-spacing:-0.5px;--token-typography-display-100-font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;--token-typography-display-100-font-size:0.8125rem;--token-typography-display-100-line-height:1.3846;--token-typography-body-300-font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;--token-typography-body-300-font-size:1rem;--token-typography-body-300-line-height:1.5;--token-typography-body-200-font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;--token-typography-body-200-font-size:0.875rem;--token-typography-body-200-line-height:1.4286;--token-typography-body-100-font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;--token-typography-body-100-font-size:0.8125rem;--token-typography-body-100-line-height:1.3846;--token-typography-code-100-font-family:ui-monospace,Menlo,Consolas,monospace;--token-typography-code-100-font-size:0.8125rem;--token-typography-code-100-line-height:1.23;--decor-radius-000:0;--decor-radius-100:2px;--decor-radius-200:4px;--decor-radius-250:6px;--decor-radius-300:7px;--decor-radius-999:9999px;--decor-radius-full:100%;--decor-border-000:none;--decor-border-100:1px solid;--decor-border-200:2px solid;--decor-border-300:3px solid;--decor-border-400:4px solid;--color-info:var(--token-color-foreground-action);--color-alert:var(--token-color-palette-amber-200);--typo-family-sans:BlinkMacSystemFont,-apple-system,"Segoe UI","Roboto","Oxygen","Ubuntu","Cantarell","Fira Sans","Droid Sans","Helvetica Neue","Helvetica","Arial",sans-serif;--typo-family-mono:monospace;--typo-size-000:16px;--typo-size-100:3.5rem;--typo-size-200:1.8rem;--typo-size-250:1.750rem;--typo-size-300:1.3rem;--typo-size-400:1.2rem;--typo-size-450:1.125rem;--typo-size-500:1rem;--typo-size-600:0.875rem;--typo-size-700:0.8125rem;--typo-size-800:0.75rem;--typo-weight-light:300;--typo-weight-normal:400;--typo-weight-medium:500;--typo-weight-semibold:600;--typo-weight-bold:700;--typo-lead-000:0;--typo-lead-050:1;--typo-lead-100:1.2;--typo-lead-200:1.25;--typo-lead-300:1.28;--typo-lead-500:1.33;--typo-lead-600:1.4;--typo-lead-700:1.5;--typo-lead-800:1.7;--icon-alert-triangle-16:url('data:image/svg+xml;charset=UTF-8,');--icon-alert-triangle-24:url('data:image/svg+xml;charset=UTF-8,');--icon-arrow-left-16:url('data:image/svg+xml;charset=UTF-8,');--icon-arrow-left-24:url('data:image/svg+xml;charset=UTF-8,');--icon-arrow-right-16:url('data:image/svg+xml;charset=UTF-8,');--icon-arrow-right-24:url('data:image/svg+xml;charset=UTF-8,');--icon-x-square-fill-16:url('data:image/svg+xml;charset=UTF-8,');--icon-x-square-fill-24:url('data:image/svg+xml;charset=UTF-8,');--icon-chevron-down-16:url('data:image/svg+xml;charset=UTF-8,');--icon-chevron-down-24:url('data:image/svg+xml;charset=UTF-8,');--icon-clipboard-copy-16:url('data:image/svg+xml;charset=UTF-8,');--icon-clipboard-copy-24:url('data:image/svg+xml;charset=UTF-8,');--icon-docs-16:url('data:image/svg+xml;charset=UTF-8,');--icon-docs-24:url('data:image/svg+xml;charset=UTF-8,');--icon-external-link-16:url('data:image/svg+xml;charset=UTF-8,');--icon-external-link-24:url('data:image/svg+xml;charset=UTF-8,');--icon-file-16:url('data:image/svg+xml;charset=UTF-8,');--icon-file-24:url('data:image/svg+xml;charset=UTF-8,');--icon-folder-16:url('data:image/svg+xml;charset=UTF-8,');--icon-folder-24:url('data:image/svg+xml;charset=UTF-8,');--icon-activity-16:url('data:image/svg+xml;charset=UTF-8,');--icon-activity-24:url('data:image/svg+xml;charset=UTF-8,');--icon-help-16:url('data:image/svg+xml;charset=UTF-8,');--icon-help-24:url('data:image/svg+xml;charset=UTF-8,');--icon-learn-16:url('data:image/svg+xml;charset=UTF-8,');--icon-learn-24:url('data:image/svg+xml;charset=UTF-8,');--icon-github-color-16:url('data:image/svg+xml;charset=UTF-8,');--icon-github-color-24:url('data:image/svg+xml;charset=UTF-8,');--icon-google-color-16:url('data:image/svg+xml;charset=UTF-8,');--icon-google-color-24:url('data:image/svg+xml;charset=UTF-8,');--icon-kubernetes-color-16:url('data:image/svg+xml;charset=UTF-8,');--icon-kubernetes-color-24:url('data:image/svg+xml;charset=UTF-8,');--icon-menu-16:url('data:image/svg+xml;charset=UTF-8,');--icon-menu-24:url('data:image/svg+xml;charset=UTF-8,');--icon-minus-square-16:url('data:image/svg+xml;charset=UTF-8,');--icon-minus-square-24:url('data:image/svg+xml;charset=UTF-8,');--icon-more-horizontal-16:url('data:image/svg+xml;charset=UTF-8,');--icon-more-horizontal-24:url('data:image/svg+xml;charset=UTF-8,');--icon-globe-16:url('data:image/svg+xml;charset=UTF-8,');--icon-globe-24:url('data:image/svg+xml;charset=UTF-8,');--icon-search-16:url('data:image/svg+xml;charset=UTF-8,');--icon-search-24:url('data:image/svg+xml;charset=UTF-8,');--icon-star-16:url('data:image/svg+xml;charset=UTF-8,');--icon-star-24:url('data:image/svg+xml;charset=UTF-8,');--icon-org-16:url('data:image/svg+xml;charset=UTF-8,');--icon-org-24:url('data:image/svg+xml;charset=UTF-8,');--icon-user-16:url('data:image/svg+xml;charset=UTF-8,');--icon-user-24:url('data:image/svg+xml;charset=UTF-8,');--icon-users-16:url('data:image/svg+xml;charset=UTF-8,');--icon-users-24:url('data:image/svg+xml;charset=UTF-8,');--icon-alert-circle-16:url('data:image/svg+xml;charset=UTF-8,');--icon-alert-circle-24:url('data:image/svg+xml;charset=UTF-8,');--icon-check-16:url('data:image/svg+xml;charset=UTF-8,');--icon-check-24:url('data:image/svg+xml;charset=UTF-8,');--icon-check-circle-16:url('data:image/svg+xml;charset=UTF-8,');--icon-check-circle-24:url('data:image/svg+xml;charset=UTF-8,');--icon-check-circle-fill-16:url('data:image/svg+xml;charset=UTF-8,');--icon-check-circle-fill-24:url('data:image/svg+xml;charset=UTF-8,');--icon-chevron-left-16:url('data:image/svg+xml;charset=UTF-8,');--icon-chevron-left-24:url('data:image/svg+xml;charset=UTF-8,');--icon-chevron-right-16:url('data:image/svg+xml;charset=UTF-8,');--icon-chevron-right-24:url('data:image/svg+xml;charset=UTF-8,');--icon-chevron-up-16:url('data:image/svg+xml;charset=UTF-8,');--icon-chevron-up-24:url('data:image/svg+xml;charset=UTF-8,');--icon-delay-16:url('data:image/svg+xml;charset=UTF-8,');--icon-delay-24:url('data:image/svg+xml;charset=UTF-8,');--icon-docs-link-16:url('data:image/svg+xml;charset=UTF-8,');--icon-docs-link-24:url('data:image/svg+xml;charset=UTF-8,');--icon-eye-16:url('data:image/svg+xml;charset=UTF-8,');--icon-eye-24:url('data:image/svg+xml;charset=UTF-8,');--icon-eye-off-16:url('data:image/svg+xml;charset=UTF-8,');--icon-eye-off-24:url('data:image/svg+xml;charset=UTF-8,');--icon-file-text-16:url('data:image/svg+xml;charset=UTF-8,');--icon-file-text-24:url('data:image/svg+xml;charset=UTF-8,');--icon-gateway-16:url('data:image/svg+xml;charset=UTF-8,');--icon-gateway-24:url('data:image/svg+xml;charset=UTF-8,');--icon-git-commit-16:url('data:image/svg+xml;charset=UTF-8,');--icon-git-commit-24:url('data:image/svg+xml;charset=UTF-8,');--icon-hexagon-16:url('data:image/svg+xml;charset=UTF-8,');--icon-hexagon-24:url('data:image/svg+xml;charset=UTF-8,');--icon-history-16:url('data:image/svg+xml;charset=UTF-8,');--icon-history-24:url('data:image/svg+xml;charset=UTF-8,');--icon-info-16:url('data:image/svg+xml;charset=UTF-8,');--icon-info-24:url('data:image/svg+xml;charset=UTF-8,');--icon-layers-16:url('data:image/svg+xml;charset=UTF-8,');--icon-layers-24:url('data:image/svg+xml;charset=UTF-8,');--icon-loading-16:url('data:image/svg+xml;charset=UTF-8,');--icon-loading-24:url('data:image/svg+xml;charset=UTF-8,');--icon-network-alt-16:url('data:image/svg+xml;charset=UTF-8,');--icon-network-alt-24:url('data:image/svg+xml;charset=UTF-8,');--icon-path-16:url('data:image/svg+xml;charset=UTF-8,');--icon-path-24:url('data:image/svg+xml;charset=UTF-8,');--icon-running-16:url('data:image/svg+xml;charset=UTF-8,');--icon-running-24:url('data:image/svg+xml;charset=UTF-8,');--icon-skip-16:url('data:image/svg+xml;charset=UTF-8,');--icon-skip-24:url('data:image/svg+xml;charset=UTF-8,');--icon-socket-16:url('data:image/svg+xml;charset=UTF-8,');--icon-socket-24:url('data:image/svg+xml;charset=UTF-8,');--icon-star-circle-16:url('data:image/svg+xml;charset=UTF-8,');--icon-star-circle-24:url('data:image/svg+xml;charset=UTF-8,');--icon-star-fill-16:url('data:image/svg+xml;charset=UTF-8,');--icon-star-fill-24:url('data:image/svg+xml;charset=UTF-8,');--icon-tag-16:url('data:image/svg+xml;charset=UTF-8,');--icon-tag-24:url('data:image/svg+xml;charset=UTF-8,');--icon-x-16:url('data:image/svg+xml;charset=UTF-8,');--icon-x-24:url('data:image/svg+xml;charset=UTF-8,');--icon-x-circle-16:url('data:image/svg+xml;charset=UTF-8,');--icon-x-circle-24:url('data:image/svg+xml;charset=UTF-8,');--icon-x-square-16:url('data:image/svg+xml;charset=UTF-8,');--icon-x-square-24:url('data:image/svg+xml;charset=UTF-8,');--icon-cloud-cross-16:url('data:image/svg+xml;charset=UTF-8,');--icon-loading-motion-16:url('data:image/svg+xml;charset=UTF-8,');--icon-auth0-color-16:url('data:image/svg+xml;charset=UTF-8,');--icon-auth0-color-24:url('data:image/svg+xml;charset=UTF-8,');--icon-logo-ember-circle-color-16:url('data:image/svg+xml;charset=UTF-8,');--icon-logo-glimmer-color-16:url('data:image/svg+xml;charset=UTF-8,');--icon-logo-jwt-color-16:url('data:image/svg+xml;charset=UTF-8,');--icon-microsoft-color-16:url('data:image/svg+xml;charset=UTF-8,');--icon-microsoft-color-24:url('data:image/svg+xml;charset=UTF-8,');--icon-logo-oidc-color-16:url('data:image/svg+xml;charset=UTF-8,');--icon-okta-color-16:url('data:image/svg+xml;charset=UTF-8,');--icon-okta-color-24:url('data:image/svg+xml;charset=UTF-8,');--icon-mesh-16:url('data:image/svg+xml;charset=UTF-8,');--icon-mesh-24:url('data:image/svg+xml;charset=UTF-8,');--icon-port-16:url('data:image/svg+xml;charset=UTF-8,');--icon-protocol-16:url('data:image/svg+xml;charset=UTF-8,');--icon-redirect-16:url('data:image/svg+xml;charset=UTF-8,');--icon-redirect-24:url('data:image/svg+xml;charset=UTF-8,');--icon-search-color-16:url('data:image/svg+xml;charset=UTF-8,');--icon-sort-desc-16:url('data:image/svg+xml;charset=UTF-8,');--icon-sort-desc-24:url('data:image/svg+xml;charset=UTF-8,');--icon-union-16:url('data:image/svg+xml;charset=UTF-8,');--chrome-width:280px;--chrome-height:64px;--typo-action:var(--token-color-foreground-action);--decor-error:var(--token-color-foreground-critical);--typo-contrast:var(--token-color-hashicorp-brand);--syntax-light-grey:#dde3e7;--syntax-light-gray:#a4a4a4;--syntax-light-grey-blue:#6c7b81;--syntax-dark-grey:#788290;--syntax-faded-gray:#eaeaea;--syntax-atlas:#127eff;--syntax-vagrant:#2f88f7;--syntax-consul:#69499a;--syntax-terraform:#822ff7;--syntax-serf:#dd4e58;--syntax-packer:#1ddba3;--syntax-gray:lighten(#000, 89%);--syntax-red:#ff3d3d;--syntax-green:#39b54a;--syntax-dark-gray:#535f73;--syntax-gutter-grey:#2a2f36;--syntax-yellow:var(--token-color-vault-brand);--horizontal-kv-list-separator-width:18px;--horizontal-kv-list-key-separator:":";--horizontal-kv-list-key-wrapper-start:"(";--horizontal-kv-list-key-wrapper-end:")";--csv-list-separator:",";--icon-loading:icon-loading-motion}.hds-border-primary{border:1px solid var(--token-color-border-primary)}.hds-border-faint{border:1px solid var(--token-color-border-faint)}.hds-border-strong{border:1px solid var(--token-color-border-strong)}.hds-border-action{border:1px solid var(--token-color-border-action)}.hds-border-highlight{border:1px solid var(--token-color-border-highlight)}.hds-border-success{border:1px solid var(--token-color-border-success)}.hds-border-warning{border:1px solid var(--token-color-border-warning)}.hds-border-critical{border:1px solid var(--token-color-border-critical)}.hds-foreground-strong{color:var(--token-color-foreground-strong)}.hds-foreground-primary{color:var(--token-color-foreground-primary)}.hds-foreground-faint{color:var(--token-color-foreground-faint)}.hds-foreground-high-contrast{color:var(--token-color-foreground-high-contrast)}.hds-foreground-disabled{color:var(--token-color-foreground-disabled)}.hds-foreground-action{color:var(--token-color-foreground-action)}.hds-foreground-action-hover{color:var(--token-color-foreground-action-hover)}.hds-foreground-action-active{color:var(--token-color-foreground-action-active)}.hds-foreground-highlight{color:var(--token-color-foreground-highlight)}.hds-foreground-highlight-on-surface{color:var(--token-color-foreground-highlight-on-surface)}.hds-foreground-highlight-high-contrast{color:var(--token-color-foreground-highlight-high-contrast)}.hds-foreground-success{color:var(--token-color-foreground-success)}.hds-foreground-success-on-surface{color:var(--token-color-foreground-success-on-surface)}.hds-foreground-success-high-contrast{color:var(--token-color-foreground-success-high-contrast)}.hds-foreground-warning{color:var(--token-color-foreground-warning)}.hds-alert__text,.hds-foreground-warning-on-surface{color:var(--token-color-foreground-warning-on-surface)}.hds-foreground-warning-high-contrast{color:var(--token-color-foreground-warning-high-contrast)}.hds-foreground-critical{color:var(--token-color-foreground-critical)}.hds-foreground-critical-on-surface{color:var(--token-color-foreground-critical-on-surface)}.hds-foreground-critical-high-contrast{color:var(--token-color-foreground-critical-high-contrast)}.hds-page-primary{background-color:var(--token-color-page-primary)}.hds-page-faint{background-color:var(--token-color-page-faint)}.hds-surface-primary{background-color:var(--token-color-surface-primary)}.hds-surface-faint{background-color:var(--token-color-surface-faint)}.hds-surface-strong{background-color:var(--token-color-surface-strong)}.hds-surface-interactive{background-color:var(--token-color-surface-interactive)}.hds-surface-interactive-hover{background-color:var(--token-color-surface-interactive-hover)}.hds-surface-interactive-active{background-color:var(--token-color-surface-interactive-active)}.hds-surface-interactive-disabled{background-color:var(--token-color-surface-interactive-disabled)}.hds-surface-action{background-color:var(--token-color-surface-action)}.hds-surface-highlight{background-color:var(--token-color-surface-highlight)}.hds-surface-success{background-color:var(--token-color-surface-success)}.hds-surface-warning{background-color:var(--token-color-surface-warning)}.hds-surface-critical{background-color:var(--token-color-surface-critical)}.hds-elevation-inset{box-shadow:var(--token-elevation-inset-box-shadow)}.hds-elevation-low{box-shadow:var(--token-elevation-low-box-shadow)}.hds-elevation-mid{box-shadow:var(--token-elevation-mid-box-shadow)}.hds-elevation-high{box-shadow:var(--token-elevation-high-box-shadow)}.hds-elevation-higher{box-shadow:var(--token-elevation-higher-box-shadow)}.hds-elevation-overlay{box-shadow:var(--token-elevation-overlay-box-shadow)}.hds-surface-inset{box-shadow:var(--token-surface-inset-box-shadow)}.hds-surface-base{box-shadow:var(--token-surface-base-box-shadow)}.hds-surface-low{box-shadow:var(--token-surface-low-box-shadow)}.hds-surface-mid{box-shadow:var(--token-surface-mid-box-shadow)}.hds-surface-high{box-shadow:var(--token-surface-high-box-shadow)}.hds-surface-higher{box-shadow:var(--token-surface-higher-box-shadow)}.hds-surface-overlay{box-shadow:var(--token-surface-overlay-box-shadow)}.hds-breadcrumb__link.mock-focus,.hds-breadcrumb__link:focus,.hds-focus-ring-action-box-shadow{box-shadow:var(--token-focus-ring-action-box-shadow)}.hds-focus-ring-critical-box-shadow{box-shadow:var(--token-focus-ring-critical-box-shadow)}.hds-font-family-sans-display{font-family:var(--token-typography-font-stack-display)}.hds-font-family-sans-text{font-family:var(--token-typography-font-stack-text)}.hds-font-family-mono-code{font-family:var(--token-typography-font-stack-code)}.hds-font-weight-regular{font-weight:400}.hds-font-weight-medium{font-weight:500}.hds-font-weight-semibold{font-weight:600}.hds-font-weight-bold{font-weight:700}.hds-typography-display-500{font-family:var(--token-typography-display-500-font-family);font-size:var(--token-typography-display-500-font-size);line-height:var(--token-typography-display-500-line-height);margin:0;padding:0}.hds-typography-display-400{font-family:var(--token-typography-display-400-font-family);font-size:var(--token-typography-display-400-font-size);line-height:var(--token-typography-display-400-line-height);margin:0;padding:0}.hds-typography-display-300{font-family:var(--token-typography-display-300-font-family);font-size:var(--token-typography-display-300-font-size);line-height:var(--token-typography-display-300-line-height);margin:0;padding:0}.hds-typography-display-200{font-family:var(--token-typography-display-200-font-family);font-size:var(--token-typography-display-200-font-size);line-height:var(--token-typography-display-200-line-height);margin:0;padding:0}.hds-typography-display-100{font-family:var(--token-typography-display-100-font-family);font-size:var(--token-typography-display-100-font-size);line-height:var(--token-typography-display-100-line-height);margin:0;padding:0}.hds-typography-body-300{font-family:var(--token-typography-body-300-font-family);font-size:var(--token-typography-body-300-font-size);line-height:var(--token-typography-body-300-line-height);margin:0;padding:0}.hds-typography-body-200{font-family:var(--token-typography-body-200-font-family);font-size:var(--token-typography-body-200-font-size);line-height:var(--token-typography-body-200-line-height);margin:0;padding:0}.hds-typography-body-100{font-family:var(--token-typography-body-100-font-family);font-size:var(--token-typography-body-100-font-size);line-height:var(--token-typography-body-100-line-height);margin:0;padding:0}.hds-typography-code-100{font-family:var(--token-typography-code-100-font-family);font-size:var(--token-typography-code-100-font-size);line-height:var(--token-typography-code-100-line-height);margin:0;padding:0}.hds-alert{display:flex;align-items:flex-start}.hds-alert__icon{flex:none;width:20px;height:20px;margin-right:12px}.hds-alert__content{flex:1 1 auto}.hds-alert__text{display:flex;flex-direction:column;justify-content:center;font-size:var(--token-typography-body-200-font-size);font-family:var(--token-typography-body-200-font-family);line-height:var(--token-typography-body-200-line-height)}.hds-alert--type-compact .hds-alert__text,.hds-pagination-size-selector>select{font-size:var(--token-typography-body-100-font-size);font-family:var(--token-typography-body-100-font-family);line-height:var(--token-typography-body-100-line-height)}.hds-alert__title{font-weight:var(--token-typography-font-weight-semibold)}.hds-alert__description{color:var(--token-color-foreground-primary);font-weight:var(--token-typography-font-weight-regular);word-break:break-word}.hds-alert__title+.hds-alert__description{margin-top:4px}.hds-alert__description strong{font-weight:var(--token-typography-font-weight-semibold)}.hds-badge-count,.hds-badge__text,.hds-link-standalone{font-weight:var(--token-typography-font-weight-medium)}.hds-alert__description code,.hds-alert__description pre{display:inline;padding:1px 5px;font-size:.9em;font-family:var(--token-typography-code-100-font-family);line-height:1em;background-color:var(--token-color-surface-primary);border:1px solid var(--token-color-palette-neutral-200);border-radius:5px}.hds-badge-count,.hds-badge__text,.hds-breadcrumb__text,.hds-button,.hds-link-standalone,.hds-stepper-indicator-step__text,.hds-tag{font-family:var(--token-typography-font-stack-text)}.hds-alert__description a{color:var(--token-color-foreground-action)}.hds-alert__description a:focus,.hds-alert__description a:focus-visible{text-decoration:none;outline:var(--token-color-focus-action-internal) solid 2px;outline-offset:1px}.hds-alert__description a:hover{color:var(--token-color-foreground-action-hover)}.hds-alert__description a:active{color:var(--token-color-foreground-action-active)}.hds-alert__actions{display:flex;align-items:center}.hds-alert--type-compact .hds-alert__title,button.hds-button[href] .hds-button__text,button.hds-button[href]::before{display:none}.hds-alert__actions>*{margin-top:16px}.hds-alert__actions>*+*{margin-left:8px}.hds-alert__dismiss{margin-top:2px;margin-left:16px}.hds-alert--type-compact .hds-alert__dismiss{margin-top:1px}.hds-alert--type-page{padding:16px 48px}.hds-alert--type-inline{padding:16px;border-style:solid;border-width:1px;border-radius:6px}.hds-alert--type-compact .hds-alert__icon{width:14px;height:14px;margin-top:2px;margin-right:8px}.hds-alert--type-compact .hds-alert__title+.hds-alert__description{margin-top:0}.hds-alert--color-neutral.hds-alert--type-page{background-color:var(--token-color-surface-faint);box-shadow:0 1px 0 0 var(--token-color-palette-alpha-300)}.hds-alert--color-neutral.hds-alert--type-inline{background-color:var(--token-color-surface-faint);border-color:var(--token-color-border-strong)}.hds-alert--color-neutral .hds-alert__icon{color:var(--token-color-foreground-faint)}.hds-alert--color-neutral .hds-alert__title{color:var(--token-color-foreground-primary)}.hds-alert--color-highlight.hds-alert--type-page{background-color:var(--token-color-surface-highlight);box-shadow:0 1px 0 0 var(--token-color-border-highlight)}.hds-alert--color-highlight.hds-alert--type-inline{background-color:var(--token-color-surface-highlight);border-color:var(--token-color-border-highlight)}.hds-alert--color-highlight .hds-alert__icon,.hds-alert--color-highlight .hds-alert__title{color:var(--token-color-foreground-highlight-on-surface)}.hds-alert--color-success.hds-alert--type-page{background-color:var(--token-color-surface-success);box-shadow:0 1px 0 0 var(--token-color-border-success)}.hds-alert--color-success.hds-alert--type-inline{background-color:var(--token-color-surface-success);border-color:var(--token-color-border-success)}.hds-alert--color-success .hds-alert__icon,.hds-alert--color-success .hds-alert__title{color:var(--token-color-foreground-success-on-surface)}.hds-alert--color-warning.hds-alert--type-page{background-color:var(--token-color-surface-warning);box-shadow:0 1px 0 0 var(--token-color-border-warning)}.hds-alert--color-warning.hds-alert--type-inline{background-color:var(--token-color-surface-warning);border-color:var(--token-color-border-warning)}.hds-alert--color-warning .hds-alert__icon,.hds-alert--color-warning .hds-alert__title{color:var(--token-color-foreground-warning-on-surface)}.hds-alert--color-critical.hds-alert--type-page{background-color:var(--token-color-surface-critical);box-shadow:0 1px 0 0 var(--token-color-border-critical)}.hds-alert--color-critical.hds-alert--type-inline{background-color:var(--token-color-surface-critical);border-color:var(--token-color-border-critical)}.hds-alert--color-critical .hds-alert__icon,.hds-alert--color-critical .hds-alert__title{color:var(--token-color-foreground-critical-on-surface)}.hds-avatar{display:inline-flex;align-items:center;justify-content:center;box-sizing:border-box;width:32px;height:32px}.hds-avatar svg,.hds-form-toggle{display:inline-block}.hds-avatar img{width:inherit;height:inherit;border-radius:2px}.hds-badge{display:inline-flex;align-items:center;max-width:100%;vertical-align:middle;border:1px solid transparent;border-radius:5px}.hds-badge__icon{display:block;flex:0 0 auto}.hds-badge__text{flex:1 0 0}.hds-badge--size-small{min-height:1.25rem;padding:calc(.125rem - 1px) calc(.375rem - 1px)}.hds-badge--size-small .hds-badge__icon{width:.75rem;height:.75rem}.hds-badge--size-large .hds-badge__icon,.hds-badge--size-medium .hds-badge__icon{width:1rem;height:1rem}.hds-badge--size-small .hds-badge__text{font-size:.8125rem;line-height:1.2308}.hds-badge--size-small .hds-badge__icon+.hds-badge__text{-webkit-margin-start:.25rem;margin-inline-start:.25rem}.hds-badge--size-medium{min-height:1.5rem;padding:calc(.25rem - 1px) calc(.5rem - 1px)}.hds-badge--size-medium .hds-badge__text{font-size:.8125rem;line-height:1.2308}.hds-badge--size-medium .hds-badge__icon+.hds-badge__text{-webkit-margin-start:.25rem;margin-inline-start:.25rem}.hds-badge--size-large{min-height:2rem;padding:calc(.25rem - 1px) calc(.5rem - 1px)}.hds-badge--size-large .hds-badge__text{font-size:1rem;line-height:1.5}.hds-badge--size-large .hds-badge__icon+.hds-badge__text{-webkit-margin-start:.375rem;margin-inline-start:.375rem}.hds-badge--color-neutral.hds-badge--type-filled{color:var(--token-color-foreground-primary);background-color:var(--token-color-surface-strong)}.hds-badge--color-neutral.hds-badge--type-inverted{color:var(--token-color-foreground-high-contrast);background-color:var(--token-color-foreground-faint)}.hds-badge--color-neutral.hds-badge--type-outlined{color:var(--token-color-foreground-primary);background-color:transparent;border-color:var(--token-color-foreground-faint)}.hds-badge--color-neutral-dark-mode.hds-badge--type-filled{color:var(--token-color-foreground-high-contrast);background-color:var(--token-color-foreground-faint)}.hds-badge--color-neutral-dark-mode.hds-badge--type-inverted{color:var(--token-color-foreground-primary);background-color:var(--token-color-surface-faint)}.hds-badge--color-neutral-dark-mode.hds-badge--type-outlined{color:var(--token-color-foreground-high-contrast);background-color:transparent;border-color:var(--token-color-palette-neutral-100)}.hds-badge--color-highlight.hds-badge--type-filled{color:var(--token-color-foreground-highlight-on-surface);background-color:var(--token-color-surface-highlight)}.hds-badge--color-highlight.hds-badge--type-inverted{color:var(--token-color-foreground-high-contrast);background-color:var(--token-color-foreground-highlight)}.hds-badge--color-highlight.hds-badge--type-outlined{color:var(--token-color-foreground-highlight);background-color:transparent;border-color:currentColor}.hds-badge--color-success.hds-badge--type-filled{color:var(--token-color-foreground-success-on-surface);background-color:var(--token-color-surface-success)}.hds-badge--color-success.hds-badge--type-inverted{color:var(--token-color-foreground-high-contrast);background-color:var(--token-color-foreground-success)}.hds-badge--color-success.hds-badge--type-outlined{color:var(--token-color-foreground-success);background-color:transparent;border-color:currentColor}.hds-badge--color-warning.hds-badge--type-filled{color:var(--token-color-foreground-warning-on-surface);background-color:var(--token-color-surface-warning)}.hds-badge--color-warning.hds-badge--type-inverted{color:var(--token-color-foreground-high-contrast);background-color:var(--token-color-foreground-warning)}.hds-badge--color-warning.hds-badge--type-outlined{color:var(--token-color-foreground-warning);background-color:transparent;border-color:currentColor}.hds-badge--color-critical.hds-badge--type-filled{color:var(--token-color-foreground-critical-on-surface);background-color:var(--token-color-surface-critical)}.hds-badge--color-critical.hds-badge--type-inverted{color:var(--token-color-foreground-high-contrast);background-color:var(--token-color-foreground-critical)}.hds-badge--color-critical.hds-badge--type-outlined{color:var(--token-color-foreground-critical);background-color:transparent;border-color:currentColor}.hds-badge-count{display:inline-flex;align-items:center;max-width:100%;border:1px solid transparent}.hds-badge-count--size-small{min-height:1.25rem;padding:calc(.125rem - 1px) calc(.5rem - 1px);font-size:.8125rem;line-height:1.2308;border-radius:.625rem}.hds-badge-count--size-medium{min-height:1.5rem;padding:calc(.25rem - 1px) calc(.75rem - 1px);font-size:.8125rem;line-height:1.2308;border-radius:.75rem}.hds-badge-count--size-large{min-height:2rem;padding:calc(.25rem - 1px) calc(.875rem - 1px);font-size:1rem;line-height:1.5;border-radius:1rem}.hds-breadcrumb__list,.hds-breadcrumb__sublist{margin:0;padding:0;list-style:none}.hds-badge-count--color-neutral.hds-badge-count--type-filled{color:var(--token-color-foreground-primary);background-color:var(--token-color-surface-strong)}.hds-badge-count--color-neutral.hds-badge-count--type-inverted{color:var(--token-color-foreground-high-contrast);background-color:var(--token-color-foreground-faint)}.hds-badge-count--color-neutral.hds-badge-count--type-outlined{color:var(--token-color-foreground-primary);background-color:transparent;border-color:var(--token-color-foreground-faint)}.hds-badge-count--color-neutral-dark-mode.hds-badge-count--type-filled{color:var(--token-color-foreground-high-contrast);background-color:var(--token-color-foreground-faint)}.hds-badge-count--color-neutral-dark-mode.hds-badge-count--type-inverted{color:var(--token-color-foreground-primary);background-color:var(--token-color-surface-faint)}.hds-badge-count--color-neutral-dark-mode.hds-badge-count--type-outlined{color:var(--token-color-foreground-high-contrast);background-color:transparent;border-color:var(--token-color-palette-neutral-100)}.hds-breadcrumb__list{display:flex}.hds-breadcrumb--items-can-wrap .hds-breadcrumb__list{flex-wrap:wrap}.hds-breadcrumb__item{display:flex;flex-direction:row;align-items:center;min-width:0}.hds-breadcrumb__list>.hds-breadcrumb__item:not(:last-child)::after{padding:0 8px;color:var(--token-color-palette-neutral-300);content:"/"}.hds-breadcrumb__sublist>.hds-breadcrumb__item+.hds-breadcrumb__item{margin-top:4px}.hds-breadcrumb__item--is-truncation{flex:none}.hds-breadcrumb__link{display:flex;flex-direction:row;align-items:center;min-width:0;margin:0 -4px;padding:0 4px;color:var(--token-color-foreground-faint);border-radius:5px;-webkit-text-decoration-color:transparent;text-decoration-color:transparent;outline-style:solid;outline-color:transparent}.hds-breadcrumb__link.mock-active>.hds-breadcrumb__text,.hds-breadcrumb__link.mock-hover>.hds-breadcrumb__text,.hds-breadcrumb__link:active>.hds-breadcrumb__text,.hds-breadcrumb__link:hover>.hds-breadcrumb__text{-webkit-text-decoration-color:currentColor;text-decoration-color:currentColor}.hds-breadcrumb__link.mock-hover,.hds-breadcrumb__link:hover{color:var(--token-color-palette-neutral-600)}.hds-breadcrumb__link:focus:not(:focus-visible){box-shadow:none}.hds-breadcrumb__link:focus-visible{box-shadow:var(--token-focus-ring-action-box-shadow)}.hds-breadcrumb__link.mock-focus.mock-active,.hds-breadcrumb__link:focus:active{box-shadow:none}.hds-breadcrumb__link.mock-active,.hds-breadcrumb__link:active{color:var(--token-color-foreground-secondary)}.hds-breadcrumb__text,.hds-link-standalone,.hds-link-standalone__text{-webkit-text-decoration-color:transparent;text-decoration-color:transparent}.hds-breadcrumb__current{display:flex;flex-direction:row;align-items:center;min-width:0;margin:0 -4px;padding:0 4px;color:var(--token-color-foreground-strong)}.consul-exposed-path-list>ul>li>.detail,.consul-exposed-path-list>ul>li>.header>dl:first-child,.consul-lock-session-list ul>li:not(:first-child)>.detail,.consul-lock-session-list ul>li:not(:first-child)>.header>dl:first-child,.consul-upstream-instance-list li>.detail,.consul-upstream-instance-list li>.header>dl:first-child,.hds-breadcrumb__icon,.hds-pagination-nav__arrow--direction-next .hds-pagination-nav__arrow-label,.list-collection>ul>li:not(:first-child)>.detail,.list-collection>ul>li:not(:first-child)>.header>dl:first-child{margin-right:6px}.hds-breadcrumb__icon{flex:none;width:13px;height:13px}.hds-breadcrumb__text{padding:calc((28px - 1rem)/ 2) 0;overflow:hidden;font-size:.8125rem;line-height:1rem;white-space:nowrap;text-decoration:underline;text-overflow:ellipsis}.hds-breadcrumb__sublist .hds-breadcrumb__text{white-space:normal}.hds-breadcrumb__truncation-toggle{display:flex;flex:none;align-items:center;justify-content:center;width:28px;height:28px;margin:0 -4px;padding:0;color:var(--token-color-foreground-faint);background-color:transparent;border:1px solid transparent;border-radius:5px;outline:transparent solid 0;cursor:pointer}.hds-button,.hds-dismiss-button,.hds-dropdown-list-item--copy-item button,.hds-dropdown-list-item--interactive a,.hds-dropdown-list-item--interactive button,.hds-dropdown-toggle-icon{outline-style:solid;outline-color:transparent}.hds-breadcrumb__truncation-toggle.mock-hover,.hds-breadcrumb__truncation-toggle:hover{color:var(--token-color-foreground-faint);border-color:var(--token-color-border-strong)}.hds-breadcrumb__truncation-toggle.mock-focus,.hds-breadcrumb__truncation-toggle:focus{box-shadow:var(--token-focus-ring-action-box-shadow);background-color:transparent;border:none}.hds-breadcrumb__truncation-toggle:focus:not(:focus-visible){box-shadow:none}.hds-breadcrumb__truncation-toggle:focus-visible,.hds-dismiss-button.mock-focus::before,.hds-dismiss-button:focus::before{box-shadow:var(--token-focus-ring-action-box-shadow)}.hds-breadcrumb__truncation-toggle.mock-focus.mock-active,.hds-breadcrumb__truncation-toggle:focus:active{box-shadow:none}.hds-breadcrumb__truncation-toggle.mock-active,.hds-breadcrumb__truncation-toggle:active{color:var(--token-color-foreground-primary);background-color:var(--token-color-surface-interactive-active);border-color:var(--token-color-border-strong)}.hds-breadcrumb__truncation-content{position:absolute;top:100%;left:-4px;z-index:300;width:-webkit-max-content;width:-moz-max-content;width:max-content;max-width:200px;margin-top:4px;padding:6px 12px;background-color:var(--token-color-surface-primary);border-radius:6px;box-shadow:var(--token-surface-high-box-shadow)}.hds-button{position:relative;display:flex;align-items:center;justify-content:center;width:auto;text-decoration:none;border:1px solid transparent;border-radius:5px;isolation:isolate}.hds-disclosure,.hds-form-field--layout-vertical .hds-form-field__label,a.hds-button{width:-webkit-fit-content;width:-moz-fit-content}a.hds-button{width:fit-content}a.hds-button.mock-active,a.hds-button.mock-focus,a.hds-button.mock-hover,a.hds-button:active,a.hds-button:focus,a.hds-button:hover{text-decoration:underline}.hds-button.mock-disabled,.hds-button.mock-disabled:focus,.hds-button.mock-disabled:hover,.hds-button:disabled,.hds-button:disabled:focus,.hds-button:disabled:hover,.hds-button[disabled],.hds-button[disabled]:focus,.hds-button[disabled]:hover{color:var(--token-color-foreground-disabled);background-color:var(--token-color-surface-faint);border-color:var(--token-color-border-primary);box-shadow:none;cursor:not-allowed}.hds-button.mock-disabled::before,.hds-button.mock-disabled:focus::before,.hds-button.mock-disabled:hover::before,.hds-button:disabled::before,.hds-button:disabled:focus::before,.hds-button:disabled:hover::before,.hds-button[disabled]::before,.hds-button[disabled]:focus::before,.hds-button[disabled]:hover::before{border-color:transparent}.hds-button.hds-button--width-full{width:100%;max-width:100%}.hds-button.hds-button--width-full .hds-button__text{flex:0 0 auto}.hds-button__text,.hds-form-group--radio-cards .hds-form-radio-card--layout-fluid{flex:1 0 0}.hds-button.mock-focus,.hds-button:focus{box-shadow:none}.hds-button.mock-focus::before,.hds-button:focus::before{position:absolute;top:-4px;right:-4px;bottom:-4px;left:-4px;z-index:-1;border:3px solid transparent;border-radius:8px;content:""}.hds-button__icon+.hds-button__text,.hds-button__text+.hds-button__icon{margin-left:.375rem}.hds-button--size-small{min-height:1.75rem;padding:.375rem .6875rem}.hds-button--size-small .hds-button__icon{width:.75rem;height:.75rem}.hds-button--size-small .hds-button__text{font-size:.8125rem;line-height:.875rem}.hds-button--size-medium{min-height:2.25rem;padding:.5625rem .9375rem}.hds-button--size-medium .hds-button__icon{width:1rem;height:1rem}.hds-button--size-medium .hds-button__text{font-size:.875rem;line-height:1rem}.hds-button--size-large{min-height:3rem;padding:.6875rem 1.1875rem}.hds-button--size-large .hds-button__icon{width:1.5rem;height:1.5rem}.hds-button--size-large .hds-button__text{font-size:1rem;line-height:1.5rem}.hds-button--color-primary{color:var(--token-color-foreground-high-contrast);background-color:var(--token-color-palette-blue-200);border-color:var(--token-color-palette-blue-300);box-shadow:var(--token-elevation-low-box-shadow)}.hds-button--color-primary.mock-hover,.hds-button--color-primary:hover{color:var(--token-color-foreground-high-contrast);background-color:var(--token-color-palette-blue-300);border-color:var(--token-color-palette-blue-400);cursor:pointer}.hds-button--color-primary.mock-focus,.hds-button--color-primary:focus{color:var(--token-color-foreground-high-contrast);background-color:var(--token-color-palette-blue-200);border-color:var(--token-color-focus-action-internal)}.hds-button--color-primary.mock-focus::before,.hds-button--color-primary:focus::before{top:-6px;right:-6px;bottom:-6px;left:-6px;border-color:var(--token-color-focus-action-external);border-radius:10px}.hds-button--color-primary.mock-active,.hds-button--color-primary:active{color:var(--token-color-foreground-high-contrast);background-color:var(--token-color-palette-blue-400);border-color:var(--token-color-palette-blue-400);box-shadow:none}.hds-button--color-primary.mock-active::before,.hds-button--color-primary:active::before{border-color:transparent}.hds-button--color-secondary{color:var(--token-color-foreground-primary);background-color:var(--token-color-surface-faint);border-color:var(--token-color-border-strong);box-shadow:var(--token-elevation-low-box-shadow)}.hds-button--color-secondary.mock-hover,.hds-button--color-secondary:hover{color:var(--token-color-foreground-primary);background-color:var(--token-color-surface-primary);border-color:var(--token-color-border-strong);cursor:pointer}.hds-button--color-secondary.mock-focus,.hds-button--color-secondary:focus{color:var(--token-color-foreground-primary);background-color:var(--token-color-surface-faint);border-color:var(--token-color-focus-action-internal)}.hds-button--color-secondary.mock-focus::before,.hds-button--color-secondary:focus::before{border-color:var(--token-color-focus-action-external)}.hds-button--color-secondary.mock-active,.hds-button--color-secondary:active{color:var(--token-color-foreground-primary);background-color:var(--token-color-surface-interactive-active);border-color:var(--token-color-border-strong);box-shadow:none}.hds-button--color-secondary.mock-active::before,.hds-button--color-secondary:active::before{border-color:transparent}.hds-button--color-tertiary{color:var(--token-color-foreground-action);background-color:transparent;border-color:transparent}.hds-button--color-tertiary.mock-hover,.hds-button--color-tertiary:hover{color:var(--token-color-foreground-action-hover);background-color:var(--token-color-surface-primary);border-color:var(--token-color-border-strong);cursor:pointer}.hds-button--color-tertiary.mock-focus,.hds-button--color-tertiary:focus{color:var(--token-color-foreground-action);border-color:var(--token-color-focus-action-internal)}.hds-button--color-tertiary.mock-focus::before,.hds-button--color-tertiary:focus::before{border-color:var(--token-color-focus-action-external)}.hds-button--color-tertiary.mock-active,.hds-button--color-tertiary:active{color:var(--token-color-foreground-action-active);background-color:var(--token-color-surface-interactive-active);border-color:var(--token-color-border-strong);box-shadow:none}.hds-button--color-tertiary.mock-active::before,.hds-button--color-tertiary:active::before{border-color:transparent}.hds-button--color-tertiary.mock-disabled,.hds-button--color-tertiary.mock-disabled:focus,.hds-button--color-tertiary.mock-disabled:hover,.hds-button--color-tertiary:disabled,.hds-button--color-tertiary:disabled:focus,.hds-button--color-tertiary:disabled:hover,.hds-button--color-tertiary[disabled],.hds-button--color-tertiary[disabled]:focus,.hds-button--color-tertiary[disabled]:hover{background-color:transparent;border-color:transparent}.hds-button--color-tertiary.mock-disabled::before,.hds-button--color-tertiary.mock-disabled:focus::before,.hds-button--color-tertiary.mock-disabled:hover::before,.hds-button--color-tertiary:disabled::before,.hds-button--color-tertiary:disabled:focus::before,.hds-button--color-tertiary:disabled:hover::before,.hds-button--color-tertiary[disabled]::before,.hds-button--color-tertiary[disabled]:focus::before,.hds-button--color-tertiary[disabled]:hover::before{border-color:transparent}.hds-button--color-critical{color:var(--token-color-foreground-critical-on-surface);background-color:var(--token-color-surface-critical);border-color:var(--token-color-foreground-critical-on-surface);box-shadow:var(--token-elevation-low-box-shadow)}.hds-button--color-critical.mock-hover,.hds-button--color-critical:hover{color:var(--token-color-foreground-high-contrast);background-color:var(--token-color-palette-red-300);border-color:var(--token-color-palette-red-400);cursor:pointer}.hds-button--color-critical.mock-focus,.hds-button--color-critical:focus{color:var(--token-color-foreground-critical-on-surface);background-color:var(--token-color-surface-critical);border-color:var(--token-color-focus-critical-internal)}.hds-button--color-critical.mock-focus::before,.hds-button--color-critical:focus::before{border-color:var(--token-color-focus-critical-external)}.hds-button--color-critical.mock-active,.hds-button--color-critical:active{color:var(--token-color-foreground-high-contrast);background-color:var(--token-color-palette-red-400);border-color:var(--token-color-palette-red-400);box-shadow:none}.hds-button--color-critical.mock-active::before,.hds-button--color-critical:active::before{border-color:transparent}button.hds-button[href]{color:#fff!important;background-color:red!important;border:none}button.hds-button[href]::after{content:' Attention: you’re passing a "href" attribute to the "Hds::Button" component, you should use an "@href" argument.'}.hds-button-set{display:flex}.hds-button-set>*+*{margin-left:16px}.hds-card__container{position:relative;background-color:#fff;border-radius:6px}.hds-card__container--level-surface-base{box-shadow:var(--token-surface-base-box-shadow)}.hds-card__container--level-surface-mid{box-shadow:var(--token-surface-mid-box-shadow)}.hds-card__container--level-surface-high{box-shadow:var(--token-surface-high-box-shadow)}.hds-card__container--hover-level-surface-base.mock-hover,.hds-card__container--hover-level-surface-base:hover{box-shadow:var(--token-surface-base-box-shadow)}.hds-card__container--hover-level-surface-mid.mock-hover,.hds-card__container--hover-level-surface-mid:hover{box-shadow:var(--token-surface-mid-box-shadow)}.hds-card__container--hover-level-surface-high.mock-hover,.hds-card__container--hover-level-surface-high:hover{box-shadow:var(--token-surface-high-box-shadow)}.hds-card__container--active-level-surface-base.mock-active,.hds-card__container--active-level-surface-base:active{box-shadow:var(--token-surface-base-box-shadow)}.hds-card__container--active-level-surface-mid.mock-active,.hds-card__container--active-level-surface-mid:active{box-shadow:var(--token-surface-mid-box-shadow)}.hds-card__container--active-level-surface-high.mock-active,.hds-card__container--active-level-surface-high:active{box-shadow:var(--token-surface-high-box-shadow)}.hds-card__container--level-elevation-base{box-shadow:var(--token-elevation-base-box-shadow)}.hds-card__container--level-elevation-mid{box-shadow:var(--token-elevation-mid-box-shadow)}.hds-card__container--level-elevation-high{box-shadow:var(--token-elevation-high-box-shadow)}.hds-card__container--hover-level-elevation-base.mock-hover,.hds-card__container--hover-level-elevation-base:hover{box-shadow:var(--token-elevation-base-box-shadow)}.hds-card__container--hover-level-elevation-mid.mock-hover,.hds-card__container--hover-level-elevation-mid:hover{box-shadow:var(--token-elevation-mid-box-shadow)}.hds-card__container--hover-level-elevation-high.mock-hover,.hds-card__container--hover-level-elevation-high:hover{box-shadow:var(--token-elevation-high-box-shadow)}.hds-card__container--active-level-elevation-base.mock-active,.hds-card__container--active-level-elevation-base:active{box-shadow:var(--token-elevation-base-box-shadow)}.hds-card__container--active-level-elevation-mid.mock-active,.hds-card__container--active-level-elevation-mid:active{box-shadow:var(--token-elevation-mid-box-shadow)}.hds-card__container--active-level-elevation-high.mock-active,.hds-card__container--active-level-elevation-high:active{box-shadow:var(--token-elevation-high-box-shadow)}.hds-card__container--background-neutral-primary{background-color:var(--token-color-surface-primary)}.hds-card__container--background-neutral-secondary{background-color:var(--token-color-surface-faint)}.hds-card__container--overflow-hidden{overflow:hidden}.hds-card__container--overflow-visible{overflow:visible}.hds-disclosure{position:relative;width:fit-content}.hds-dismiss-button{flex:none;padding:0;color:var(--token-color-foreground-faint);background-color:transparent;border:none;cursor:pointer;position:relative;isolation:isolate}.hds-dismiss-button.mock-hover::before,.hds-dismiss-button:hover::before{background-color:rgba(222,223,227,.4)}.hds-dismiss-button::before{position:absolute;top:-4px;right:-4px;bottom:-4px;left:-4px;z-index:-1;border-radius:5px;content:""}.hds-dismiss-button:focus:not(:focus-visible)::before{box-shadow:none}.hds-dismiss-button:focus-visible::before{box-shadow:var(--token-focus-ring-action-box-shadow)}.hds-dismiss-button.mock-focus.mock-active::before,.hds-dismiss-button:focus:active::before{box-shadow:none}.hds-dismiss-button.mock-active,.hds-dismiss-button:active{color:var(--token-color-foreground-secondary)}.hds-dismiss-button.mock-active::before,.hds-dismiss-button:active::before{background-color:rgba(222,223,227,.4);border:1px solid var(--token-color-border-strong)}.hds-dropdown-toggle-icon{display:flex;align-items:center;justify-content:center;min-width:36px;height:36px;padding:1px;background-color:transparent;border:1px solid transparent;border-radius:5px;position:relative;isolation:isolate}.hds-dropdown-toggle-icon.mock-hover,.hds-dropdown-toggle-icon:hover{background-color:var(--token-color-surface-interactive);border-color:var(--token-color-border-strong);cursor:pointer}.hds-dropdown-toggle-icon::before{position:absolute;top:-1px;right:-1px;bottom:-1px;left:-1px;z-index:-1;border-radius:5px;content:""}.hds-dropdown-toggle-icon.mock-focus::before,.hds-dropdown-toggle-icon:focus::before{box-shadow:var(--token-focus-ring-action-box-shadow)}.hds-dropdown-toggle-icon:focus:not(:focus-visible)::before{box-shadow:none}.hds-dropdown-toggle-icon:focus-visible::before{box-shadow:var(--token-focus-ring-action-box-shadow)}.hds-dropdown-toggle-button,.hds-dropdown-toggle-icon.mock-focus.mock-active::before,.hds-dropdown-toggle-icon:focus:active::before{box-shadow:none}.hds-dropdown-toggle-icon.mock-active,.hds-dropdown-toggle-icon:active{background-color:var(--token-color-surface-interactive-active);border-color:var(--token-color-border-strong)}.hds-dropdown-toggle-icon__wrapper{display:flex;align-items:center;justify-content:center;width:32px;height:32px;padding:1px;border-radius:3px}.hds-dropdown-toggle-icon__wrapper img{width:100%;height:100%;-o-object-fit:cover;object-fit:cover;border-radius:inherit}.hds-dropdown-toggle-icon__chevron{margin-left:4px}.hds-dropdown-toggle-icon--is-open .hds-dropdown-toggle-icon__chevron{transform:rotate(-180deg)}.hds-dropdown-toggle-button .hds-button__icon{margin-right:-6px;margin-left:8px}@media (prefers-reduced-motion:no-preference){.hds-dropdown-toggle-button .hds-button__icon,.hds-dropdown-toggle-icon__chevron{transition:transform .3s}}.hds-dropdown-toggle-button--is-open .hds-button__icon{transform:rotate(-180deg)}.hds-dropdown-list{width:-webkit-max-content;width:-moz-max-content;width:max-content;min-width:200px;max-width:400px;margin:0;padding:4px 0;list-style:none;background-color:var(--token-color-surface-primary);border-radius:6px;box-shadow:var(--token-surface-high-box-shadow)}.hds-dropdown-list--fixed-width{min-width:initial;max-width:initial}.hds-dropdown-list--position-right{position:absolute;top:calc(100% + 4px);right:0;z-index:2}.hds-dropdown-list--position-left{position:absolute;top:calc(100% + 4px);left:0;z-index:2}.hds-dropdown-list-item__copy-item-title{padding:2px 0 4px;color:var(--token-color-foreground-faint)}.hds-dropdown-list-item--copy-item{width:100%;padding:10px 16px 12px}.hds-dropdown-list-item--copy-item button{display:flex;justify-content:space-between;width:100%;padding:12px 8px;color:var(--token-color-foreground-primary);background-color:transparent;border:1px solid var(--token-color-border-primary);border-radius:5px}.hds-dropdown-list-item--copy-item button.mock-hover,.hds-dropdown-list-item--copy-item button:hover{background-color:var(--token-color-surface-interactive-hover);cursor:pointer}.hds-dropdown-list-item--copy-item button.mock-focus,.hds-dropdown-list-item--copy-item button:focus{box-shadow:var(--token-focus-ring-action-box-shadow);background-color:var(--token-color-surface-action);border-color:var(--token-color-focus-action-internal)}.hds-dropdown-list-item--copy-item button:focus:not(:focus-visible){box-shadow:none}.hds-dropdown-list-item--copy-item button:focus-visible{box-shadow:var(--token-focus-ring-action-box-shadow)}.hds-dropdown-list-item--copy-item button.mock-focus.mock-active,.hds-dropdown-list-item--copy-item button:focus:active{box-shadow:none}.hds-dropdown-list-item--copy-item button.mock-active,.hds-dropdown-list-item--copy-item button:active{background-color:var(--token-color-surface-interactive-active)}.hds-dropdown-list-item--copy-item button.is-success{background-color:var(--token-color-surface-success);border-color:var(--token-color-border-success)}.hds-dropdown-list-item--copy-item button.is-success .hds-dropdown-list-item__copy-item-icon{color:var(--token-color-foreground-success)}.hds-dropdown-list-item__copy-item-text{overflow:hidden;white-space:nowrap;text-align:left;text-overflow:ellipsis}.hds-dropdown-list-item__copy-item-icon{flex:none;margin-left:8px;color:var(--token-color-foreground-action)}.hds-dropdown-list-item--description{padding:2px 16px 4px;color:var(--token-color-foreground-faint)}.hds-dropdown-list-item--generic{padding-right:16px;padding-left:16px}.hds-dropdown-list-item--interactive{position:relative;min-height:36px;isolation:isolate}.hds-dropdown-list-item--interactive button{width:100%;background-color:transparent}.hds-dropdown-list-item--interactive button:hover{cursor:pointer}.hds-dropdown-list-item--interactive a,.hds-dropdown-list-item--interactive button{display:flex;align-items:center;padding:7px 9px 7px 15px;text-decoration:none;border:1px solid transparent}.hds-dropdown-list-item--interactive a::before,.hds-dropdown-list-item--interactive button::before{position:absolute;top:6px;bottom:6px;left:4px;z-index:-1;width:2px;border-radius:1px;content:""}.hds-dropdown-list-item--interactive a::after,.hds-dropdown-list-item--interactive button::after{position:absolute;top:0;right:4px;bottom:0;left:10px;z-index:-1;border-radius:5px;content:""}.hds-dropdown-list-item--interactive a.mock-hover,.hds-dropdown-list-item--interactive a:hover,.hds-dropdown-list-item--interactive button.mock-hover,.hds-dropdown-list-item--interactive button:hover{color:var(--current-color-hover)}.hds-dropdown-list-item--interactive a.mock-focus,.hds-dropdown-list-item--interactive a:focus,.hds-dropdown-list-item--interactive a:focus-visible,.hds-dropdown-list-item--interactive button.mock-focus,.hds-dropdown-list-item--interactive button:focus,.hds-dropdown-list-item--interactive button:focus-visible{color:var(--current-color-focus)}.hds-dropdown-list-item--interactive a.mock-hover::before,.hds-dropdown-list-item--interactive a:hover::before,.hds-dropdown-list-item--interactive button.mock-hover::before,.hds-dropdown-list-item--interactive button:hover::before{background-color:currentColor}.hds-dropdown-list-item--interactive a.mock-focus::after,.hds-dropdown-list-item--interactive a:focus::after,.hds-dropdown-list-item--interactive button.mock-focus::after,.hds-dropdown-list-item--interactive button:focus::after{left:4px;background-color:var(--current-background-color);box-shadow:var(--current-focus-ring-box-shadow)}.hds-dropdown-list-item--interactive a:focus:not(:focus-visible)::after,.hds-dropdown-list-item--interactive button:focus:not(:focus-visible)::after{background-color:transparent;box-shadow:none}.hds-dropdown-list-item--interactive a:focus-visible::after,.hds-dropdown-list-item--interactive button:focus-visible::after{left:4px;background-color:var(--current-background-color);box-shadow:var(--current-focus-ring-box-shadow)}.hds-dropdown-list-item--interactive a.mock-focus.mock-active::after,.hds-dropdown-list-item--interactive a:focus-visible:active::after,.hds-dropdown-list-item--interactive a:focus:active::after,.hds-dropdown-list-item--interactive button.mock-focus.mock-active::after,.hds-dropdown-list-item--interactive button:focus-visible:active::after,.hds-dropdown-list-item--interactive button:focus:active::after{left:10px;background-color:var(--current-background-color);box-shadow:none}.hds-dropdown-list-item--interactive a.mock-active,.hds-dropdown-list-item--interactive a:active,.hds-dropdown-list-item--interactive button.mock-active,.hds-dropdown-list-item--interactive button:active{color:var(--current-color-active)}.hds-dropdown-list-item--interactive a.mock-active::before,.hds-dropdown-list-item--interactive a:active::before,.hds-dropdown-list-item--interactive button.mock-active::before,.hds-dropdown-list-item--interactive button:active::before{background-color:currentColor}.hds-dropdown-list-item--interactive a.mock-active::after,.hds-dropdown-list-item--interactive a:active::after,.hds-dropdown-list-item--interactive button.mock-active::after,.hds-dropdown-list-item--interactive button:active::after{background-color:var(--current-background-color)}.hds-dropdown-list-item__interactive-icon{margin-right:8px}.hds-dropdown-list-item__interactive-text{text-align:left}.hds-dropdown-list-item--color-action a,.hds-dropdown-list-item--color-action button{color:var(--token-color-foreground-primary);--current-color-hover:var(--token-color-foreground-action-hover);--current-color-focus:var(--token-color-foreground-action-active);--current-color-active:var(--token-color-foreground-action-active)}.hds-dropdown-list-item--color-action a::after,.hds-dropdown-list-item--color-action button::after{--current-background-color:var(--token-color-surface-action);--current-focus-ring-box-shadow:var(--token-focus-ring-action-box-shadow)}.hds-dropdown-list-item--color-critical a,.hds-dropdown-list-item--color-critical button{color:var(--token-color-foreground-critical);--current-color-hover:var(--token-color-palette-red-300);--current-color-focus:var(--token-color-palette-red-400);--current-color-active:var(--token-color-palette-red-400)}.hds-dropdown-list-item--color-critical a::after,.hds-dropdown-list-item--color-critical button::after{--current-background-color:var(--token-color-surface-critical);--current-focus-ring-box-shadow:var(--token-focus-ring-critical-box-shadow)}.hds-dropdown-list-item__interactive-loading-wrapper{display:flex;align-items:center;padding:8px 10px 8px 16px}.hds-dropdown-list-item__interactive-loading-wrapper .hds-dropdown-list-item__interactive-text{color:var(--token-color-foreground-faint)}.hds-dropdown-list-item__interactive-loading-wrapper .hds-dropdown-list-item__interactive-icon{color:var(--token-color-foreground-primary)}.hds-dropdown-list-item--separator{position:relative;width:100%;height:4px}.hds-dropdown-list-item--separator::before{position:absolute;right:6px;bottom:0;left:6px;border-bottom:1px solid var(--token-color-border-primary);content:""}.hds-dropdown-list-item--title{padding:10px 16px 4px;color:var(--token-color-foreground-strong)}.hds-empty-state{display:block;max-width:40ch;margin:0 auto;padding:0;color:var(--token-color-foreground-faint)}.hds-empty-state>*{margin:0;padding:0}.hds-empty-state__body{font-weight:400;font-size:1rem;line-height:1.5}.hds-empty-state__body+*{-webkit-margin-before:1rem;margin-block-start:1rem}.hds-empty-state__header{font-weight:700;font-size:1.25rem;line-height:1.2}.hds-flyout{z-index:49;flex-direction:column;height:100vh;max-height:100vh;margin:0;padding:0;background:var(--token-color-surface-primary);border:none;box-shadow:0 2px 3px 0 rgba(59,61,69,.2509803922),0 12px 24px 0 rgba(59,61,69,.3490196078)}.hds-flyout[open]{position:fixed;display:flex}.hds-flyout::-webkit-backdrop{display:none}.hds-flyout::backdrop{display:none}.hds-flyout__overlay{position:fixed;top:0;right:0;bottom:0;left:0;z-index:50;background:var(--token-color-palette-neutral-700);opacity:.5}.hds-flyout__header{display:flex;flex:none;align-items:flex-start;padding:16px 24px;color:var(--token-color-foreground-strong)}.hds-flyout__icon{flex:none;align-self:center;margin-right:16px}.hds-flyout__title{flex-grow:1}.hds-flyout__tagline{margin-bottom:4px;color:var(--token-color-foreground-faint)}.hds-flyout__dismiss{align-self:center;margin-left:16px}.hds-flyout__description{padding:0 24px 16px;color:var(--token-color-foreground-primary)}.hds-flyout__body{flex:1 1 auto;padding:24px;overflow-y:auto;overscroll-behavior:contain;border-top:1px solid var(--token-color-border-primary)}.hds-flyout--size-medium{width:min(480px,100vw - 40px);max-width:calc(100vw - 40px)}.hds-flyout--size-medium[open]{margin-left:calc(100% - min(480px,100vw - 40px))}.hds-flyout--size-large{width:min(720px,100vw - 40px);max-width:calc(100vw - 40px)}.hds-flyout--size-large[open]{margin-left:calc(100% - min(720px,100vw - 40px))}.hds-form-label{display:block;width:-webkit-max-content;width:-moz-max-content;width:max-content;max-width:100%;color:var(--token-form-label-color)}.hds-form-label .hds-badge{vertical-align:initial}.hds-form-helper-text{display:block;color:var(--token-form-helper-text-color)}.hds-form-error{display:flex;align-items:flex-start;color:var(--token-form-error-color)}.hds-form-error__icon{flex:none;width:var(--token-form-error-icon-size);height:var(--token-form-error-icon-size);margin:2px 8px 2px 0}.hds-form-error__content{flex:1 1 auto}.hds-form-error__message{margin:0}.hds-form-field--layout-vertical{display:grid;justify-items:start;width:100%}.hds-form-field--layout-vertical .hds-form-field__label{width:fit-content}.hds-form-field--layout-vertical .hds-form-field__helper-text:not(:first-child){margin-top:4px}.hds-form-field--layout-vertical .hds-form-field__helper-text+.hds-form-helper-text{margin-top:2px}.hds-form-field--layout-vertical .hds-form-field__control:not(:first-child){margin-top:8px}.hds-form-field--layout-vertical .hds-form-field__control:not(:last-child){margin-bottom:8px}.hds-form-field--layout-flag{display:grid;grid-auto-flow:row;grid-template-areas:"control label" "control helper-text" "control error";grid-template-rows:auto auto auto;grid-template-columns:auto 1fr;justify-items:start}.hds-form-field--layout-flag .hds-form-field__label{grid-area:label;width:-webkit-fit-content;width:-moz-fit-content;width:fit-content}.hds-form-field--layout-flag .hds-form-field__helper-text{grid-area:helper-text;margin-top:4px}.hds-form-field--layout-flag .hds-form-field__control{grid-area:control}.hds-form-field--layout-flag .hds-form-field__control:not(:only-child){margin-top:2px;margin-right:8px}.hds-form-field--layout-flag .hds-form-field__error{grid-area:error;margin-top:4px}.hds-form-legend{display:block;color:var(--token-form-legend-color)}.hds-form-legend .hds-badge{vertical-align:initial}.hds-form-group{display:block;margin:0;padding:0;border:none}.hds-form-checkbox,.hds-form-radio{padding:0;background-position:center center;border-style:solid}.hds-form-group__legend{margin:0 0 4px;padding:0}.hds-form-group__legend~.hds-form-group__control-fields-wrapper .hds-form-label{font-weight:var(--token-typography-font-weight-regular)}.hds-form-group--layout-vertical .hds-form-group__control-field+.hds-form-group__control-field{margin-top:12px}.hds-form-group--layout-horizontal .hds-form-group__control-fields-wrapper{display:flex;flex-wrap:wrap;margin-bottom:-4px}.hds-form-group--layout-horizontal .hds-form-group__control-field{margin-right:16px;margin-bottom:4px}.hds-form-group__helper-text{margin-bottom:8px}.hds-form-group__error{margin-top:8px}.hds-form-indicator--optional{color:var(--token-form-indicator-optional-color)}.hds-form-checkbox{width:var(--token-form-checkbox-size);height:var(--token-form-checkbox-size);margin:0;background-size:var(--token-form-checkbox-background-image-size) var(--token-form-checkbox-background-image-size);border-width:var(--token-form-checkbox-border-width);border-radius:var(--token-form-checkbox-border-radius);cursor:pointer;-webkit-appearance:none;-moz-appearance:none;appearance:none}.hds-form-radio,.hds-form-select{-webkit-appearance:none;-moz-appearance:none}.hds-form-checkbox:not(:checked,:indeterminate){background-color:var(--token-form-control-base-surface-color-default);border-color:var(--token-form-control-base-border-color-default);box-shadow:var(--hds-elevation-inset-box-shadow)}.hds-form-checkbox:checked,.hds-form-checkbox:indeterminate{background-color:var(--token-form-control-checked-surface-color-default);border-color:var(--token-form-control-checked-border-color-default)}.hds-form-checkbox:checked{background-image:var(--token-form-checkbox-background-image-data-url)}.hds-form-checkbox:indeterminate{background-image:var(--token-form-checkbox-background-image-data-url-indeterminate)}.hds-form-checkbox.mock-hover:not(:checked,:indeterminate),.hds-form-checkbox:hover:not(:checked,:indeterminate){background-color:var(--token-form-control-base-surface-color-hover);border-color:var(--token-form-control-base-border-color-hover)}.hds-form-checkbox.mock-hover:checked,.hds-form-checkbox.mock-hover:indeterminate,.hds-form-checkbox:hover:checked,.hds-form-checkbox:hover:indeterminate{background-color:var(--token-form-control-checked-border-color-default);border-color:var(--token-form-control-checked-border-color-hover)}.hds-form-checkbox:disabled:checked,.hds-form-checkbox:disabled:indeterminate,.hds-form-checkbox:disabled:not(:checked,:indeterminate){background-color:var(--token-form-control-disabled-surface-color);border-color:var(--token-form-control-disabled-border-color);box-shadow:none;cursor:not-allowed}.hds-form-checkbox.mock-focus,.hds-form-checkbox:focus{outline:var(--token-color-focus-action-external) solid 3px;outline-offset:1px}.hds-form-checkbox:disabled:checked{background-image:var(--token-form-checkbox-background-image-data-url-disabled)}.hds-form-checkbox:disabled:indeterminate{background-image:var(--token-form-checkbox-background-image-data-url-indeterminate-disabled);background-repeat:no-repeat}.hds-form-radio{width:var(--token-form-radio-size);height:var(--token-form-radio-size);margin:0;background-size:var(--token-form-radio-background-image-size) var(--token-form-radio-background-image-size);border-width:var(--token-form-radio-border-width);border-radius:50%;cursor:pointer;appearance:none}.hds-form-radio:not(:checked){background-color:var(--token-form-control-base-surface-color-default);border-color:var(--token-form-control-base-border-color-default);box-shadow:var(--hds-elevation-inset-box-shadow)}.hds-form-radio:checked{background-color:var(--token-form-control-checked-surface-color-default);background-image:var(--token-form-radio-background-image-data-url);border-color:var(--token-form-control-checked-border-color-default)}.hds-form-radio.mock-hover:not(:checked),.hds-form-radio:hover:not(:checked){background-color:var(--token-form-control-base-surface-color-hover);border-color:var(--token-form-control-base-border-color-hover)}.hds-form-radio.mock-hover:checked,.hds-form-radio:hover:checked{background-color:var(--token-form-control-checked-border-color-default);border-color:var(--token-form-control-checked-border-color-hover)}.hds-form-radio:disabled:checked,.hds-form-radio:disabled:not(:checked){background-color:var(--token-form-control-disabled-surface-color);border-color:var(--token-form-control-disabled-border-color);box-shadow:none;cursor:not-allowed}.hds-form-radio.mock-focus,.hds-form-radio:focus{outline:var(--token-color-focus-action-external) solid 3px;outline-offset:1px}.hds-form-radio:disabled:checked{background-image:var(--token-form-radio-background-image-data-url-disabled)}.hds-form-group--radio-cards .hds-form-group__control-fields-wrapper{margin:calc(-1 * var(--token-form-radiocard-group-gap)/ 2)}.hds-form-group--radio-cards .hds-form-group__legend{margin-bottom:12px}.hds-form-group--radio-cards .hds-form-radio-card{margin:calc(var(--token-form-radiocard-group-gap)/ 2)}.hds-form-group--radio-cards .hds-form-radio-card--layout-fixed{flex:1 0 100%}.hds-form-radio-card{display:flex;flex-direction:column;background-color:var(--token-color-surface-primary);border:var(--token-form-radiocard-border-width) solid var(--token-color-border-primary);border-radius:var(--token-form-radiocard-border-radius);box-shadow:var(--token-elevation-mid-box-shadow);cursor:pointer}.hds-form-radio-card .hds-form-radio-card__control{outline-color:transparent}.hds-form-radio-card.mock-hover,.hds-form-radio-card:hover{box-shadow:var(--token-elevation-high-box-shadow);transition:var(--token-form-radiocard-transition-duration)}.hds-form-radio-card.mock-focus,.hds-form-radio-card:focus-within{border-color:var(--token-color-focus-action-internal);box-shadow:0 0 0 3px var(--token-color-focus-action-external)}.hds-form-radio-card--checked,.hds-form-radio-card.mock-checked{border-color:var(--token-color-focus-action-internal)}.hds-form-radio-card--checked .hds-form-radio-card__control-wrapper,.hds-form-radio-card.mock-checked .hds-form-radio-card__control-wrapper{background-color:var(--token-color-surface-action);border-color:var(--token-color-border-action)}.hds-form-radio-card--disabled,.hds-form-radio-card--disabled .hds-form-radio-card__control-wrapper,.hds-form-radio-card.mock-disabled,.hds-form-radio-card.mock-disabled .hds-form-radio-card__control-wrapper{background-color:var(--token-color-surface-interactive-disabled);border-color:var(--token-color-border-primary)}.hds-form-radio-card--disabled,.hds-form-radio-card.mock-disabled{box-shadow:none;cursor:not-allowed}.hds-form-radio-card--align-left{text-align:left}.hds-form-radio-card--align-center{text-align:center}.hds-form-radio-card--align-center .flight-icon{margin:auto}.hds-form-radio-card--control-bottom .hds-form-radio-card__control-wrapper{border-top-width:var(--token-form-radiocard-border-width);border-top-style:solid;border-bottom-right-radius:inherit;border-bottom-left-radius:inherit}.hds-form-radio-card--control-left{flex-direction:row-reverse}.hds-form-radio-card--control-left .hds-form-radio-card__control-wrapper{display:flex;align-items:center;border-right-width:var(--token-form-radiocard-border-width);border-right-style:solid;border-top-left-radius:inherit;border-bottom-left-radius:inherit}.hds-form-radio-card__content{flex:1;padding:var(--token-form-radiocard-content-padding)}.hds-form-radio-card__content .hds-badge{margin-bottom:12px}.hds-form-radio-card__label{display:block;margin:8px 0;color:var(--token-form-label-color)}.hds-form-radio-card__label:first-child{margin-top:0}.hds-form-radio-card__description{display:block;color:var(--token-color-foreground-primary)}.hds-form-radio-card__control-wrapper{padding:var(--token-form-radiocard-control-padding);background-color:var(--token-color-surface-faint);border-color:var(--token-color-border-primary)}.hds-form-radio-card__control{display:block;margin:auto}.hds-form-select{max-width:100%;padding:var(--token-form-control-padding);padding-right:calc(var(--token-form-control-padding) + 24px);color:var(--token-form-control-base-foreground-value-color);background-color:var(--token-form-control-base-surface-color-default);background-image:var(--token-form-select-background-image-data-url);background-repeat:no-repeat;background-position:right var(--token-form-select-background-image-position-right-x) top var(--token-form-select-background-image-position-top-y);background-size:var(--token-form-select-background-image-size) var(--token-form-select-background-image-size);border:var(--token-form-control-border-width) solid var(--token-form-control-base-border-color-default);border-radius:var(--token-form-control-border-radius);box-shadow:var(--token-elevation-low-box-shadow);appearance:none}.hds-form-select.mock-hover,.hds-form-select:hover{border-color:var(--token-form-control-base-border-color-hover)}.hds-form-select.mock-focus,.hds-form-select:focus{border-color:var(--token-color-focus-action-internal);outline:var(--token-color-focus-action-external) solid 3px;outline-offset:0}.hds-form-select:disabled{color:var(--token-form-control-disabled-foreground-color);background-color:var(--token-form-control-disabled-surface-color);background-image:var(--token-form-select-background-image-data-url-disabled);border-color:var(--token-form-control-disabled-border-color);box-shadow:none;cursor:not-allowed}.hds-form-select.hds-form-select--is-invalid{border-color:var(--token-form-control-invalid-border-color-default)}.hds-form-select.hds-form-select--is-invalid.mock-hover,.hds-form-select.hds-form-select--is-invalid:hover{border-color:var(--token-form-control-invalid-border-color-hover)}.hds-form-select.hds-form-select--is-invalid.mock-focus,.hds-form-select.hds-form-select--is-invalid:focus{border-color:var(--token-color-focus-critical-internal);outline-color:var(--token-color-focus-critical-external)}.hds-form-select[multiple],.hds-form-select[size]{background:0 0}.hds-form-select[multiple] option,.hds-form-select[size] option{margin:2px auto;border-radius:3px}.hds-form-select[multiple] option:hover,.hds-form-select[size] option:hover{color:var(--token-color-foreground-action)}.hds-form-select[multiple] option:disabled,.hds-form-select[size] option:disabled{color:var(--token-color-foreground-disabled)}.hds-form-select[multiple] option:checked,.hds-form-select[size] option:checked{color:var(--token-color-foreground-high-contrast);background:var(--token-color-palette-blue-200)}.hds-form-text-input,.hds-form-textarea{max-width:100%;background-color:var(--token-form-control-base-surface-color-default)}.hds-form-select[multiple] optgroup,.hds-form-select[size] optgroup{color:var(--token-color-foreground-strong);font-weight:var(--token-typography-font-weight-semibold);font-style:normal}.hds-form-text-input{width:100%;padding:var(--token-form-control-padding);color:var(--token-form-control-base-foreground-value-color);border:var(--token-form-control-border-width) solid var(--token-form-control-base-border-color-default);border-radius:var(--token-form-control-border-radius);box-shadow:var(--hds-elevation-inset-box-shadow)}.hds-form-text-input ::-moz-placeholder{color:var(--token-form-control-base-foreground-placeholder-color)}.hds-form-text-input ::placeholder{color:var(--token-form-control-base-foreground-placeholder-color)}.hds-form-text-input.mock-hover,.hds-form-text-input:hover{border-color:var(--token-form-control-base-border-color-hover)}.hds-form-text-input.mock-focus,.hds-form-text-input:focus{border-color:var(--token-color-focus-action-internal);outline:var(--token-color-focus-action-external) solid 3px;outline-offset:0}.hds-form-text-input:-moz-read-only{color:var(--token-form-control-readonly-foreground-color);background-color:var(--token-form-control-readonly-surface-color);border-color:var(--token-form-control-readonly-border-color);box-shadow:none}.hds-form-text-input:read-only{color:var(--token-form-control-readonly-foreground-color);background-color:var(--token-form-control-readonly-surface-color);border-color:var(--token-form-control-readonly-border-color);box-shadow:none}.hds-form-text-input:disabled{color:var(--token-form-control-disabled-foreground-color);background-color:var(--token-form-control-disabled-surface-color);border-color:var(--token-form-control-disabled-border-color);box-shadow:none;cursor:not-allowed}.hds-form-text-input.hds-form-text-input--is-invalid{border-color:var(--token-form-control-invalid-border-color-default)}.hds-form-text-input.hds-form-text-input--is-invalid.mock-hover,.hds-form-text-input.hds-form-text-input--is-invalid:hover{border-color:var(--token-form-control-invalid-border-color-hover)}.hds-form-text-input.hds-form-text-input--is-invalid.mock-focus,.hds-form-text-input.hds-form-text-input--is-invalid:focus{border-color:var(--token-color-focus-critical-internal);outline-color:var(--token-color-focus-critical-external)}.hds-form-text-input[type=date],.hds-form-text-input[type=time]{width:initial}.hds-form-text-input[type=date]:disabled::-webkit-calendar-picker-indicator,.hds-form-text-input[type=time]:disabled::-webkit-calendar-picker-indicator{visibility:visible;opacity:.5}.hds-form-text-input[type=date][readonly]::-webkit-calendar-picker-indicator,.hds-form-text-input[type=time][readonly]::-webkit-calendar-picker-indicator{visibility:visible}.hds-form-text-input[type=date]::-webkit-calendar-picker-indicator{background-image:var(--token-form-text-input-background-image-data-url-date);background-position:center center;background-size:var(--token-form-text-input-background-image-size)}.hds-form-text-input[type=time]::-webkit-calendar-picker-indicator{background-image:var(--token-form-text-input-background-image-data-url-time);background-position:center center;background-size:var(--token-form-text-input-background-image-size)}.hds-form-text-input[type=search]{padding-left:calc(var(--token-form-control-padding) + 24px);background-image:var(--token-form-text-input-background-image-data-url-search);background-repeat:no-repeat;background-position:var(--token-form-text-input-background-image-position-x) 50%;background-size:var(--token-form-text-input-background-image-size)}.hds-form-text-input[type=search]::-webkit-search-cancel-button{width:var(--token-form-text-input-background-image-size);height:var(--token-form-text-input-background-image-size);background-image:var(--token-form-text-input-background-image-data-url-search-cancel);background-position:center center;background-size:var(--token-form-text-input-background-image-size);-webkit-appearance:none}.hds-form-textarea{width:100%;padding:var(--token-form-control-padding);color:var(--token-form-control-base-foreground-value-color);border:var(--token-form-control-border-width) solid var(--token-form-control-base-border-color-default);border-radius:var(--token-form-control-border-radius);box-shadow:var(--hds-elevation-inset-box-shadow);resize:vertical}.hds-form-textarea ::-moz-placeholder{color:var(--token-form-control-base-foreground-placeholder-color)}.hds-form-textarea ::placeholder{color:var(--token-form-control-base-foreground-placeholder-color)}.hds-form-textarea.mock-hover,.hds-form-textarea:hover{border-color:var(--token-form-control-base-border-color-hover)}.hds-form-textarea.mock-focus,.hds-form-textarea:focus{border-color:var(--token-color-focus-action-internal);outline:var(--token-color-focus-action-external) solid 3px;outline-offset:0}.hds-form-textarea:-moz-read-only{color:var(--token-form-control-disabled-foreground-color);background-color:var(--token-form-control-readonly-surface-color);border-color:var(--token-form-control-disabled-border-color);box-shadow:none}.hds-form-textarea:read-only{color:var(--token-form-control-disabled-foreground-color);background-color:var(--token-form-control-readonly-surface-color);border-color:var(--token-form-control-disabled-border-color);box-shadow:none}.hds-form-textarea:disabled{color:var(--token-form-control-disabled-foreground-color);background-color:var(--token-form-control-disabled-surface-color);border-color:var(--token-form-control-disabled-border-color);box-shadow:none;cursor:not-allowed}.hds-form-textarea.hds-form-textarea--is-invalid{border-color:var(--token-form-control-invalid-border-color-default)}.hds-form-textarea.hds-form-textarea--is-invalid.mock-hover,.hds-form-textarea.hds-form-textarea--is-invalid:hover{border-color:var(--token-form-control-invalid-border-color-hover)}.hds-form-textarea.hds-form-textarea--is-invalid.mock-focus,.hds-form-textarea.hds-form-textarea--is-invalid:focus{border-color:var(--token-color-focus-critical-internal);outline-color:var(--token-color-focus-critical-external)}.hds-form-toggle{position:relative;isolation:isolate}.hds-form-toggle__control{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;display:block;height:100%;margin:0;padding:0;color:transparent;background-color:transparent;border:none;outline:0;cursor:pointer;opacity:0;-webkit-appearance:none;-moz-appearance:none;appearance:none}.hds-form-toggle__control:disabled{cursor:not-allowed}.hds-form-toggle__facade{position:relative;display:block;width:var(--token-form-toggle-width);height:var(--token-form-toggle-height);background-image:var(--token-form-toggle-background-image-data-url);background-repeat:no-repeat;background-position:var(--token-form-toggle-background-image-position-x) 50%;background-size:var(--token-form-toggle-background-image-size) var(--token-form-toggle-background-image-size);border:var(--token-form-radio-border-width) solid var(--border-color);border-radius:calc(var(--token-form-toggle-height)/ 2)}.hds-form-toggle__facade::after{position:absolute;top:calc(var(--token-form-radio-border-width) * -1);left:calc(var(--token-form-radio-border-width) * -1);width:var(--token-form-toggle-thumb-size);height:var(--token-form-toggle-thumb-size);background-color:var(--token-form-control-base-surface-color-default);border:var(--token-form-radio-border-width) solid var(--border-color);border-radius:50%;transform:translate3d(0,0,0);content:""}@media (prefers-reduced-motion:no-preference){.hds-form-toggle__facade,.hds-form-toggle__facade::after{transition-timing-function:var(--token-form-toggle-transition-timing-function);transition-duration:var(--token-form-toggle-transition-duration);transition-property:all}}.hds-form-toggle__facade::before{position:absolute;top:-5px;right:-5px;bottom:-5px;left:-5px;margin:auto;border-width:3px;border-radius:calc(var(--token-form-toggle-height)/ 2 + 3px + 1px);content:""}:not(:checked)+.hds-form-toggle__facade{--border-color:var(--token-form-control-base-border-color-default);background-color:var(--token-form-toggle-base-surface-color-default)}:checked+.hds-form-toggle__facade{--border-color:var(--token-form-control-checked-border-color-default);background-color:var(--token-form-control-checked-surface-color-default)}:checked+.hds-form-toggle__facade::after{transform:translate3d(calc(var(--token-form-toggle-width) - var(--token-form-toggle-thumb-size)),0,0)}.mock-hover:not(:checked)+.hds-form-toggle__facade,:hover:not(:checked)+.hds-form-toggle__facade{--border-color:var(--token-form-control-base-border-color-hover)}.mock-hover:checked+.hds-form-toggle__facade,:hover:checked+.hds-form-toggle__facade{--border-color:var(--token-form-control-checked-border-color-hover);background-color:var(--token-form-control-checked-border-color-default)}.mock-focus+.hds-form-toggle__facade::before,:focus+.hds-form-toggle__facade::before{border-color:var(--token-color-focus-action-external);border-style:solid}:disabled:checked+.hds-form-toggle__facade,:disabled:not(:checked)+.hds-form-toggle__facade{--border-color:var(--token-form-control-disabled-border-color);background-color:var(--token-form-control-disabled-surface-color);background-image:var(--token-form-toggle-background-image-data-url-disabled)}.hds-icon-tile--logo,.hds-icon-tile__extra{background-color:var(--token-color-surface-primary)}.hds-icon-tile{position:relative;display:flex;border:1px solid transparent;border-radius:4px;box-shadow:0 1px 1px rgba(101,106,118,.05)}.hds-icon-tile__icon,.hds-icon-tile__logo{display:flex;margin:auto}.hds-icon-tile__extra{position:absolute;right:-6px;bottom:-6px;display:flex;box-sizing:content-box;border:1px solid var(--token-color-border-primary);box-shadow:0 1px 1px rgba(101,106,118,.05)}.hds-icon-tile__extra-icon{display:flex;margin:auto;color:var(--token-color-foreground-strong)}.hds-icon-tile--size-small{width:1.75rem;height:1.75rem;border-radius:5px}.hds-icon-tile--size-small .hds-icon-tile__icon{width:1rem;height:1rem}.hds-icon-tile--size-small .hds-icon-tile__logo{width:1.125rem;height:1.125rem}.hds-icon-tile--size-small .hds-icon-tile__extra{width:1.125rem;height:1.125rem;border-radius:4px}.hds-icon-tile--size-small .hds-icon-tile__extra-icon{width:.75rem;height:.75rem}.hds-icon-tile--size-medium{width:2.5rem;height:2.5rem;border-radius:6px}.hds-icon-tile--size-medium .hds-icon-tile__icon{width:1.5rem;height:1.5rem}.hds-icon-tile--size-medium .hds-icon-tile__logo{width:1.75rem;height:1.75rem}.hds-icon-tile--size-medium .hds-icon-tile__extra{width:1.5rem;height:1.5rem;border-radius:5px}.hds-icon-tile--size-medium .hds-icon-tile__extra-icon{width:1rem;height:1rem}.hds-icon-tile--size-large{width:3rem;height:3rem;border-radius:6px}.hds-icon-tile--size-large .hds-icon-tile__icon{width:1.5rem;height:1.5rem}.hds-icon-tile--size-large .hds-icon-tile__logo{width:2rem;height:2rem}.hds-icon-tile--size-large .hds-icon-tile__extra{width:1.5rem;height:1.5rem;border-radius:5px}.hds-icon-tile--size-large .hds-icon-tile__extra-icon{width:1rem;height:1rem}.hds-icon-tile--logo{border-color:var(--token-color-border-primary)}.hds-icon-tile--icon.hds-icon-tile--color-neutral{color:var(--token-color-foreground-faint);background-color:var(--token-color-surface-faint);border-color:var(--token-color-border-primary)}.hds-icon-tile--icon.hds-icon-tile--color-boundary{color:var(--token-color-boundary-foreground);background:linear-gradient(135deg,var(--token-color-boundary-gradient-faint-start) 0,var(--token-color-boundary-gradient-faint-stop) 100%);border-color:var(--token-color-boundary-border)}.hds-icon-tile--icon.hds-icon-tile--color-consul{color:var(--token-color-consul-foreground);background:linear-gradient(135deg,var(--token-color-consul-gradient-faint-start) 0,var(--token-color-consul-gradient-faint-stop) 100%);border-color:var(--token-color-consul-border)}.hds-icon-tile--icon.hds-icon-tile--color-hcp{color:var(--token-color-palette-hcp-brand);background-color:var(--token-color-surface-faint);border-color:var(--token-color-border-primary)}.hds-icon-tile--icon.hds-icon-tile--color-nomad{color:var(--token-color-nomad-foreground);background:linear-gradient(135deg,var(--token-color-nomad-gradient-faint-start) 0,var(--token-color-nomad-gradient-faint-stop) 100%);border-color:var(--token-color-nomad-border)}.hds-icon-tile--icon.hds-icon-tile--color-packer{color:var(--token-color-packer-foreground);background:linear-gradient(135deg,var(--token-color-packer-gradient-faint-start) 0,var(--token-color-packer-gradient-faint-stop) 100%);border-color:var(--token-color-packer-border)}.hds-icon-tile--icon.hds-icon-tile--color-terraform{color:var(--token-color-terraform-foreground);background:linear-gradient(135deg,var(--token-color-terraform-gradient-faint-start) 0,var(--token-color-terraform-gradient-faint-stop) 100%);border-color:var(--token-color-terraform-border)}.hds-icon-tile--icon.hds-icon-tile--color-vagrant{color:var(--token-color-vagrant-foreground);background:linear-gradient(135deg,var(--token-color-vagrant-gradient-faint-start) 0,var(--token-color-vagrant-gradient-faint-stop) 100%);border-color:var(--token-color-vagrant-border)}.hds-icon-tile--icon.hds-icon-tile--color-vault{color:var(--token-color-vault-foreground);background:linear-gradient(135deg,var(--token-color-vault-gradient-faint-start) 0,var(--token-color-vault-gradient-faint-stop) 100%);border-color:var(--token-color-vault-border)}.hds-icon-tile--icon.hds-icon-tile--color-waypoint{color:var(--token-color-waypoint-foreground);background:linear-gradient(135deg,var(--token-color-waypoint-gradient-faint-start) 0,var(--token-color-waypoint-gradient-faint-stop) 100%);border-color:var(--token-color-waypoint-border)}.hds-link-inline--color-primary,.hds-link-standalone--color-primary{color:var(--token-color-foreground-action)}.hds-link-inline{border-radius:2px}.hds-link-inline.mock-focus,.hds-link-inline:focus,.hds-link-inline:focus-visible{text-decoration:none;outline:var(--token-color-focus-action-internal) solid 2px;outline-offset:1px}.hds-link-standalone,.hds-pagination-nav__control,.hds-table__th-sort button,.hds-tabs__tab-button{outline-style:solid;outline-color:transparent}.hds-link-inline__icon{display:inline-block;width:1em;height:1em;vertical-align:text-bottom}.hds-link-inline--icon-leading>.hds-link-inline__icon{margin-right:.25em}.hds-link-inline--icon-trailing>.hds-link-inline__icon{margin-left:.25em}.hds-link-inline--color-primary.mock-hover,.hds-link-inline--color-primary:hover{color:var(--token-color-foreground-action-hover)}.hds-link-inline--color-primary.mock-active,.hds-link-inline--color-primary:active{color:var(--token-color-foreground-action-active)}.hds-link-inline--color-secondary{color:var(--token-color-foreground-strong)}.hds-link-inline--color-secondary.mock-hover,.hds-link-inline--color-secondary:hover{color:var(--token-color-foreground-primary)}.hds-link-inline--color-secondary.mock-active,.hds-link-inline--color-secondary:active{color:var(--token-color-foreground-faint)}.hds-link-standalone{display:flex;align-items:center;justify-content:center;width:-webkit-fit-content;width:-moz-fit-content;width:fit-content;background-color:transparent;border:1px solid transparent;position:relative;isolation:isolate}.hds-link-standalone--size-medium .hds-link-standalone__icon,.hds-link-standalone--size-small .hds-link-standalone__icon{width:1rem;height:1rem}.hds-link-standalone__text{flex:1 0 0;text-decoration:underline;transition:-webkit-text-decoration-color .25s ease-in;transition:text-decoration-color .25s ease-in;transition:text-decoration-color .25s ease-in,-webkit-text-decoration-color .25s ease-in}#login-toggle+div footer button,.consul-intention-fieldsets .permissions>button,.empty-state>ul>li>*,.empty-state>ul>li>:active,.empty-state>ul>li>label>button,.empty-state>ul>li>label>button:active,.hds-pagination-nav__control,.hds-tabs__tab,.modal-dialog [role=document] dd a,.modal-dialog [role=document] p a,.oidc-select button.reset,.search-bar-status .remove-all button,a,main dd a,main dd a:active,main p a,main p a:active{text-decoration:none}.hds-link-standalone__icon+.hds-link-standalone__text,.hds-link-standalone__text+.hds-link-standalone__icon{margin-left:.375rem}.hds-link-standalone--size-small .hds-link-standalone__text{font-size:.8125rem;line-height:1.231}.hds-link-standalone--size-medium .hds-link-standalone__text{font-size:.875rem;line-height:1.143}.hds-link-standalone--size-large .hds-link-standalone__icon{width:1.5rem;height:1.5rem}.hds-link-standalone--size-large .hds-link-standalone__text{font-size:1rem;line-height:1.5}.hds-link-standalone--color-primary.mock-hover,.hds-link-standalone--color-primary:hover{color:var(--token-color-foreground-action-hover)}.hds-link-standalone--color-primary.mock-hover .hds-link-standalone__text,.hds-link-standalone--color-primary:hover .hds-link-standalone__text{-webkit-text-decoration-color:#4e81e8;text-decoration-color:#4e81e8}.hds-link-standalone--color-primary.mock-active,.hds-link-standalone--color-primary:active{color:var(--token-color-foreground-action-active)}.hds-link-standalone--color-primary.mock-active .hds-link-standalone__text,.hds-link-standalone--color-primary:active .hds-link-standalone__text{-webkit-text-decoration-color:#396ed6;text-decoration-color:#396ed6}.hds-link-standalone--color-primary.mock-active::before,.hds-link-standalone--color-primary:active::before{background-color:var(--token-color-surface-action)}.hds-link-standalone--color-secondary{color:var(--token-color-foreground-strong)}.hds-link-standalone--color-secondary.mock-hover .hds-link-standalone__text,.hds-link-standalone--color-secondary:hover .hds-link-standalone__text{-webkit-text-decoration-color:#4d4d4f;text-decoration-color:#4d4d4f}.hds-link-standalone--color-secondary.mock-active,.hds-link-standalone--color-secondary:active{color:var(--token-color-foreground-primary)}.hds-link-standalone--color-secondary.mock-active .hds-link-standalone__text,.hds-link-standalone--color-secondary:active .hds-link-standalone__text{-webkit-text-decoration-color:#6e7075;text-decoration-color:#6e7075}.hds-link-standalone--color-secondary.mock-active::before,.hds-link-standalone--color-secondary:active::before{background-color:var(--token-color-surface-interactive-active)}.hds-link-standalone::before{position:absolute;top:-5px;right:-5px;bottom:-5px;left:-5px;z-index:-1;border-radius:5px;content:""}.hds-link-standalone.mock-focus::before,.hds-link-standalone:focus::before{box-shadow:var(--token-focus-ring-action-box-shadow)}.hds-link-standalone:focus:not(:focus-visible)::before{box-shadow:none}.hds-link-standalone:focus-visible::before,.hds-pagination-nav__control.mock-focus::before,.hds-pagination-nav__control:focus::before{box-shadow:var(--token-focus-ring-action-box-shadow)}.hds-link-standalone.mock-focus.mock-active::before,.hds-link-standalone:focus:active::before{box-shadow:none}.hds-link-standalone.hds-link-standalone--icon-position-leading::before{right:-7px}.hds-link-standalone.hds-link-standalone--icon-position-trailing::before{left:-7px}.hds-modal{z-index:50;flex-direction:column;padding:0;background:var(--token-color-surface-primary);border:none;border-radius:8px;box-shadow:var(--token-surface-overlay-box-shadow)}.hds-modal[open]{position:fixed;display:flex}.hds-modal::backdrop,.readonly-codemirror .CodeMirror-cursors{display:none}.hds-modal::-webkit-backdrop{display:none}.hds-modal__overlay{position:fixed;top:0;right:0;bottom:0;left:0;z-index:50;background:var(--token-color-palette-neutral-700);opacity:.5}.hds-modal__header{display:flex;flex:none;align-items:flex-start;padding:16px 24px;border-top-left-radius:inherit;border-top-right-radius:inherit}.hds-modal__icon{flex:none;align-self:center;margin-right:16px}.freetext-filter>label,.freetext-filter_input,.hds-modal__title{flex-grow:1}.hds-modal__tagline{margin-bottom:4px}.hds-modal__dismiss{align-self:center;margin-left:16px}.hds-modal__body{flex:1 1 auto;padding:24px;overflow-y:auto;overscroll-behavior:contain}.hds-modal__footer{flex:none;padding:16px 24px;background:var(--token-color-surface-faint);border-top:1px solid var(--token-color-border-primary);border-bottom-right-radius:inherit;border-bottom-left-radius:inherit}.hds-modal__footer .hds-button-set .hds-button--color-tertiary{margin-left:auto}.hds-modal--size-small{width:min(400px,95vw)}.hds-modal--size-medium{width:min(600px,95vw)}.hds-modal--size-large{width:min(800px,95vw)}.hds-modal--color-neutral .hds-modal__header{color:var(--token-color-foreground-strong);background:var(--token-color-surface-faint);border-bottom:1px solid var(--token-color-border-primary)}.hds-modal--color-neutral .hds-modal__tagline{color:var(--token-color-foreground-faint)}.hds-modal--color-warning .hds-modal__header,.hds-modal--color-warning .hds-modal__tagline{color:var(--token-color-foreground-warning-on-surface)}.hds-modal--color-warning .hds-modal__header{background:var(--token-color-surface-warning);border-bottom:1px solid var(--token-color-border-warning)}.hds-modal--color-critical .hds-modal__header,.hds-modal--color-critical .hds-modal__tagline{color:var(--token-color-foreground-critical-on-surface)}.hds-modal--color-critical .hds-modal__header{background:var(--token-color-surface-critical);border-bottom:1px solid var(--token-color-border-critical)}.hds-pagination{display:grid;grid-template-areas:"info nav selector";grid-template-rows:auto;grid-template-columns:1fr auto 1fr;align-items:center;margin:0 auto}@media screen and (max-width:1000px){.hds-pagination{display:flex;flex-wrap:wrap;justify-content:center}.hds-pagination-info{margin-top:var(--token-pagination-child-spacing-vertical);margin-left:var(--token-pagination-child-spacing-horizontal)}}.hds-pagination-info{grid-area:info;justify-self:flex-start;margin-right:var(--token-pagination-child-spacing-horizontal);white-space:nowrap}.hds-pagination-nav{display:flex;grid-area:nav}@media screen and (max-width:1000px){.hds-pagination-nav{justify-content:center;order:-1;width:100%}}.hds-pagination-nav__page-list{display:flex;margin:0;padding:0}.hds-pagination-nav__page-item{list-style-type:none}.hds-pagination-nav__control{display:flex;align-items:center;height:var(--token-pagination-nav-control-height);padding:0 calc(var(--token-pagination-nav-control-padding-horizontal) - 1px);color:var(--token-color-foreground-primary);background-color:transparent;border:1px solid transparent;position:relative;isolation:isolate}.hds-pagination-nav__control::before{position:absolute;top:var(--token-pagination-nav-control-focus-inset);right:var(--token-pagination-nav-control-focus-inset);bottom:var(--token-pagination-nav-control-focus-inset);left:var(--token-pagination-nav-control-focus-inset);z-index:-1;border-radius:5px;content:""}.hds-pagination-nav__control:focus:not(:focus-visible)::before{box-shadow:none}.hds-pagination-nav__control:focus-visible::before,.hds-table__th-sort button.mock-focus::before,.hds-table__th-sort button:focus::before{box-shadow:var(--token-focus-ring-action-box-shadow)}.hds-pagination-nav__control.mock-focus.mock-active::before,.hds-pagination-nav__control:focus:active::before{box-shadow:none}.hds-pagination-nav__control.mock-hover,.hds-pagination-nav__control:hover{color:var(--token-color-foreground-action-hover)}.hds-pagination-nav__control.mock-active,.hds-pagination-nav__control:active{color:var(--token-color-foreground-action-active)}.hds-pagination-nav__arrow.mock-disabled,.hds-pagination-nav__arrow:disabled{color:var(--token-color-foreground-disabled);cursor:not-allowed}.hds-pagination-nav__arrow--direction-prev{flex-direction:row;justify-content:flex-start}.hds-pagination-nav__arrow--direction-prev .hds-pagination-nav__arrow-label{margin-left:var(--token-pagination-nav-control-icon-spacing)}.hds-pagination-nav__arrow--direction-next{flex-direction:row-reverse;justify-content:flex-end}.hds-pagination-nav__number--is-selected{position:relative;color:var(--token-color-foreground-action)}.hds-pagination-nav__number--is-selected:hover{color:var(--token-color-foreground-action-hover)}.hds-pagination-nav__number--is-selected:active{color:var(--token-color-foreground-action-active)}.hds-pagination-nav__number--is-selected::after{position:absolute;right:calc(var(--token-pagination-nav-indicator-spacing) - 1px);bottom:-1px;left:calc(var(--token-pagination-nav-indicator-spacing) - 1px);height:var(--token-pagination-nav-indicator-height);margin:0 auto;background-color:currentColor;border-radius:2px;content:""}.hds-pagination-nav__ellipsis{display:flex;align-items:center;height:var(--token-pagination-nav-control-height);padding:0 var(--token-pagination-nav-control-padding-horizontal);color:var(--token-color-foreground-faint)}.hds-pagination-size-selector{display:flex;grid-area:selector;align-items:center;justify-self:flex-end;margin-left:var(--token-pagination-child-spacing-horizontal)}@media screen and (max-width:1000px){.hds-pagination-size-selector{margin-top:var(--token-pagination-child-spacing-vertical);margin-right:var(--token-pagination-child-spacing-horizontal)}}.hds-pagination-size-selector>label{white-space:nowrap}.hds-pagination-size-selector>select{height:28px;margin-left:12px;padding:0 24px 0 8px;background-position:center right 5px}.hds-stepper-indicator-step__text,.hds-tag{font-weight:var(--token-typography-font-weight-medium);font-size:.8125rem}.hds-stepper-indicator-step{position:relative;width:24px;height:24px}.hds-stepper-indicator-step__svg-hexagon{width:100%;height:100%;filter:drop-shadow(0 1px 1px rgba(101, 106, 118, .05))}.hds-stepper-indicator-step__svg-hexagon path{fill:--status-fill-color;stroke:--status-stroke-color}.hds-stepper-indicator-step__status{position:absolute;top:0;right:0;bottom:0;left:0;display:flex;align-items:center;justify-content:center}.hds-stepper-indicator-step__icon{width:12px;height:12px;color:--status-text-color}.hds-stepper-indicator-step__text{width:20px;overflow:hidden;color:--status-text-color;white-space:nowrap;text-align:center;-webkit-user-select:none;-moz-user-select:none;user-select:none}.hds-stepper-indicator-step--status-incomplete .hds-stepper-indicator-step__status{color:var(--token-color-foreground-strong)}.hds-stepper-indicator-step--status-complete .hds-stepper-indicator-step__status,.hds-stepper-indicator-step--status-processing .hds-stepper-indicator-step__status,.hds-stepper-indicator-step--status-progress .hds-stepper-indicator-step__status{color:var(--token-color-foreground-high-contrast)}.hds-stepper-indicator-step--status-incomplete .hds-stepper-indicator-step__svg-hexagon path{fill:var(--token-color-surface-faint);stroke:var(--token-color-foreground-strong)}.hds-stepper-indicator-step--status-complete .hds-stepper-indicator-step__svg-hexagon path,.hds-stepper-indicator-step--status-processing .hds-stepper-indicator-step__svg-hexagon path,.hds-stepper-indicator-step--status-progress .hds-stepper-indicator-step__svg-hexagon path{fill:var(--token-color-foreground-strong);stroke:var(--token-color-foreground-strong)}.hds-stepper-indicator-step--is-interactive{cursor:pointer}.hds-stepper-indicator-step--is-interactive.hds-stepper-indicator-step--status-incomplete .hds-stepper-indicator-step__status{color:var(--token-color-foreground-primary)}.hds-stepper-indicator-step--is-interactive.hds-stepper-indicator-step--status-processing .hds-stepper-indicator-step__status,.hds-stepper-indicator-step--is-interactive.hds-stepper-indicator-step--status-progress .hds-stepper-indicator-step__status{color:var(--token-color-foreground-high-contrast)}.hds-stepper-indicator-step--is-interactive.hds-stepper-indicator-step--status-incomplete .hds-stepper-indicator-step__svg-hexagon path{fill:var(--token-color-surface-interactive);stroke:var(--token-color-border-strong)}.hds-stepper-indicator-step--is-interactive.hds-stepper-indicator-step--status-incomplete.mock-hover .hds-stepper-indicator-step__svg-hexagon path,.hds-stepper-indicator-step--is-interactive.hds-stepper-indicator-step--status-incomplete:hover .hds-stepper-indicator-step__svg-hexagon path{fill:var(--token-color-surface-interactive-hover)}.hds-stepper-indicator-step--is-interactive.hds-stepper-indicator-step--status-incomplete.mock-active .hds-stepper-indicator-step__svg-hexagon path,.hds-stepper-indicator-step--is-interactive.hds-stepper-indicator-step--status-incomplete:active .hds-stepper-indicator-step__svg-hexagon path{fill:var(--token-color-surface-interactive-active)}.hds-stepper-indicator-step--is-interactive.hds-stepper-indicator-step--status-progress .hds-stepper-indicator-step__svg-hexagon path{fill:var(--token-color-palette-blue-200);stroke:var(--token-color-palette-blue-300)}.hds-stepper-indicator-step--is-interactive.hds-stepper-indicator-step--status-progress.mock-hover .hds-stepper-indicator-step__svg-hexagon path,.hds-stepper-indicator-step--is-interactive.hds-stepper-indicator-step--status-progress:hover .hds-stepper-indicator-step__svg-hexagon path{fill:var(--token-color-palette-blue-300);stroke:var(--token-color-palette-blue-400)}.hds-stepper-indicator-step--is-interactive.hds-stepper-indicator-step--status-progress.mock-active .hds-stepper-indicator-step__svg-hexagon path,.hds-stepper-indicator-step--is-interactive.hds-stepper-indicator-step--status-progress:active .hds-stepper-indicator-step__svg-hexagon path{fill:var(--token-color-palette-blue-400);stroke:var(--token-color-palette-blue-400)}.hds-stepper-indicator-step--is-interactive.hds-stepper-indicator-step--status-processing .hds-stepper-indicator-step__svg-hexagon path{fill:var(--token-color-palette-blue-200);stroke:var(--token-color-palette-blue-300)}.hds-stepper-indicator-step--is-interactive.hds-stepper-indicator-step--status-processing.mock-hover .hds-stepper-indicator-step__svg-hexagon path,.hds-stepper-indicator-step--is-interactive.hds-stepper-indicator-step--status-processing:hover .hds-stepper-indicator-step__svg-hexagon path{fill:var(--token-color-palette-blue-300);stroke:var(--token-color-palette-blue-400)}.hds-stepper-indicator-step--is-interactive.hds-stepper-indicator-step--status-processing.mock-active .hds-stepper-indicator-step__svg-hexagon path,.hds-stepper-indicator-step--is-interactive.hds-stepper-indicator-step--status-processing:active .hds-stepper-indicator-step__svg-hexagon path{fill:var(--token-color-palette-blue-400);stroke:var(--token-color-palette-blue-400)}.hds-stepper-indicator-step--is-interactive.hds-stepper-indicator-step--status-complete .hds-stepper-indicator-step__status{color:var(--token-color-palette-blue-200)}.hds-stepper-indicator-step--is-interactive.hds-stepper-indicator-step--status-complete .hds-stepper-indicator-step__svg-hexagon path{fill:var(--token-color-palette-blue-50);stroke:var(--token-color-palette-blue-300)}.hds-stepper-indicator-step--is-interactive.hds-stepper-indicator-step--status-complete.mock-active .hds-stepper-indicator-step__svg-hexagon path,.hds-stepper-indicator-step--is-interactive.hds-stepper-indicator-step--status-complete.mock-hover .hds-stepper-indicator-step__svg-hexagon path,.hds-stepper-indicator-step--is-interactive.hds-stepper-indicator-step--status-complete:active .hds-stepper-indicator-step__svg-hexagon path,.hds-stepper-indicator-step--is-interactive.hds-stepper-indicator-step--status-complete:hover .hds-stepper-indicator-step__svg-hexagon path{fill:var(--token-color-palette-blue-100);stroke:var(--token-color-palette-blue-400)}.hds-stepper-indicator-step--is-interactive.hds-stepper-indicator-step--status-complete.mock-hover .hds-stepper-indicator-step__status,.hds-stepper-indicator-step--is-interactive.hds-stepper-indicator-step--status-complete:hover .hds-stepper-indicator-step__status{color:var(--token-color-palette-blue-300)}.hds-stepper-indicator-step--is-interactive.hds-stepper-indicator-step--status-complete.mock-active .hds-stepper-indicator-step__status,.hds-stepper-indicator-step--is-interactive.hds-stepper-indicator-step--status-complete:active .hds-stepper-indicator-step__status{color:var(--token-color-palette-blue-400)}.hds-stepper-indicator-task{position:relative;display:flex;align-items:center;justify-content:center;width:16px;height:16px;color:var(--token-color-foreground-strong)}.hds-stepper-indicator-task__icon{width:12px;height:12px}.hds-stepper-indicator-task--is-interactive{cursor:pointer}.hds-stepper-indicator-task--is-interactive.hds-stepper-indicator-task--status-incomplete{color:var(--token-color-palette-neutral-300)}.hds-stepper-indicator-task--is-interactive.hds-stepper-indicator-task--status-incomplete.mock-hover,.hds-stepper-indicator-task--is-interactive.hds-stepper-indicator-task--status-incomplete:hover{color:var(--token-color-palette-blue-300)}.hds-stepper-indicator-task--is-interactive.hds-stepper-indicator-task--status-incomplete.mock-active,.hds-stepper-indicator-task--is-interactive.hds-stepper-indicator-task--status-incomplete:active{color:var(--token-color-palette-blue-400)}.hds-stepper-indicator-task--is-interactive.hds-stepper-indicator-task--status-progress{color:var(--token-color-palette-blue-200)}.hds-stepper-indicator-task--is-interactive.hds-stepper-indicator-task--status-progress.mock-hover,.hds-stepper-indicator-task--is-interactive.hds-stepper-indicator-task--status-progress:hover{color:var(--token-color-palette-blue-300)}.hds-stepper-indicator-task--is-interactive.hds-stepper-indicator-task--status-progress.mock-active,.hds-stepper-indicator-task--is-interactive.hds-stepper-indicator-task--status-progress:active{color:var(--token-color-palette-blue-400)}.hds-stepper-indicator-task--is-interactive.hds-stepper-indicator-task--status-processing{color:var(--token-color-palette-blue-200)}.hds-stepper-indicator-task--is-interactive.hds-stepper-indicator-task--status-processing.mock-hover,.hds-stepper-indicator-task--is-interactive.hds-stepper-indicator-task--status-processing:hover{color:var(--token-color-palette-blue-300)}.hds-stepper-indicator-task--is-interactive.hds-stepper-indicator-task--status-processing.mock-active,.hds-stepper-indicator-task--is-interactive.hds-stepper-indicator-task--status-processing:active{color:var(--token-color-palette-blue-400)}.hds-stepper-indicator-task--is-interactive.hds-stepper-indicator-task--status-complete{color:var(--token-color-palette-green-200)}.hds-stepper-indicator-task--is-interactive.hds-stepper-indicator-task--status-complete.mock-hover,.hds-stepper-indicator-task--is-interactive.hds-stepper-indicator-task--status-complete:hover{color:var(--token-color-palette-green-300)}.hds-stepper-indicator-task--is-interactive.hds-stepper-indicator-task--status-complete.mock-active,.hds-stepper-indicator-task--is-interactive.hds-stepper-indicator-task--status-complete:active{color:var(--token-color-palette-green-400)}.hds-table{width:100%;border:1px solid var(--token-color-border-primary);border-radius:6px}.hds-table--layout-fixed{table-layout:fixed}.hds-table__thead .hds-table__tr{color:var(--token-color-foreground-strong);background-color:var(--token-color-surface-strong)}.hds-table__thead .hds-table__tr:first-of-type th:first-child{border-top-left-radius:5px}.hds-table__thead .hds-table__tr:first-of-type th:last-child{border-top-right-radius:5px}.hds-table__th,.hds-table__th-sort{height:48px;text-align:left;border-top:none;border-right:none;border-bottom:1px solid var(--token-color-border-primary);border-left:none}.hds-table__th{padding:12px 16px}.hds-table__th-sort{padding:0}.hds-table__th-sort button{width:100%;height:100%;min-height:48px;margin:0;padding:12px 16px;text-align:inherit;background-color:transparent;border:1px solid transparent;border-radius:inherit;position:relative;isolation:isolate}.hds-table__th-sort button .hds-table__th-sort--button-content{display:flex;align-items:center}.hds-table__th-sort button .hds-table__th-sort--button-content .flight-icon{flex:none;margin-left:8px;color:var(--token-color-foreground-action)}.hds-tabs__tab,.hds-tabs__tablist{margin:0;position:relative;display:flex}.hds-table__th-sort button.mock-hover,.hds-table__th-sort button:hover{color:var(--token-color-foreground-strong);background-color:var(--token-color-palette-neutral-200);cursor:pointer}.hds-table__th-sort button::before{position:absolute;top:0;right:0;bottom:0;left:0;z-index:-1;border-radius:inherit;content:""}.hds-table__th-sort button:focus:not(:focus-visible)::before{box-shadow:none}.hds-table__th-sort button:focus-visible::before{box-shadow:var(--token-focus-ring-action-box-shadow)}.hds-table__th-sort button.mock-focus.mock-active::before,.hds-table__th-sort button:focus:active::before{box-shadow:none}.hds-table__th-sort button.mock-active,.hds-table__th-sort button:active{color:var(--token-color-foreground-strong);background-color:var(--token-color-palette-neutral-300)}.hds-table__tbody .hds-table__tr,.hds-tabs__tab,.hds-tag,.hds-tag__dismiss-icon{color:var(--token-color-foreground-primary)}.hds-table--striped .hds-table__tbody .hds-table__tr:nth-child(even){background-color:var(--token-color-surface-faint)}.hds-table--density-short .hds-table__tbody td{padding:4px 16px}.hds-table--density-medium .hds-table__tbody td{padding:12px 16px}.hds-table--density-tall .hds-table__tbody td{padding:20px 16px}.hds-table--valign-top .hds-table__tbody td{vertical-align:top}.hds-table--valign-middle .hds-table__tbody td,.hds-tag{vertical-align:middle}.hds-table__td--text-right,.hds-table__th--text-right,.hds-table__th-sort--text-right{text-align:right}.hds-table__td--text-center,.hds-table__th--text-center,.hds-table__th-sort--text-center{text-align:center}.hds-table__tbody .hds-table__tr{background-color:var(--token-color-surface-primary)}.hds-table__tbody .hds-table__tr td{border-top:none;border-right:none;border-bottom:1px solid var(--token-color-border-primary);border-left:none}.hds-table__tbody .hds-table__tr:last-of-type td{border-bottom:none}.hds-table__tbody .hds-table__tr:last-of-type td:first-child{border-bottom-left-radius:5px}.hds-table__tbody .hds-table__tr:last-of-type td:last-child{border-bottom-right-radius:5px}.hds-tabs__tablist-wrapper{position:relative}.hds-tabs__tablist-wrapper::before{position:absolute;right:0;bottom:calc((var(--token-tabs-indicator-height) - var(--token-tabs-divider-height))/ 2);left:0;display:block;border-top:var(--token-tabs-divider-height) solid var(--token-color-border-primary);content:""}.hds-tabs__tablist{padding:0;overflow-x:auto;-webkit-overflow-scrolling:touch}.hds-tabs__tab{align-items:center;height:var(--token-tabs-tab-height);padding:var(--token-tabs-tab-padding-vertical) var(--token-tabs-tab-padding-horizontal);white-space:nowrap;list-style:none}.hds-tabs__tab.hds-tabs__tab--is-selected,.hds-tabs__tab.mock-hover,.hds-tabs__tab:hover{color:var(--token-color-foreground-action)}.hds-tabs__tab.hds-tabs__tab--is-selected:hover{color:var(--token-color-foreground-action-hover)}.hds-tabs__tab.hds-tabs__tab--is-selected:hover~.hds-tabs__tab-indicator{background:var(--token-color-foreground-action-hover)}.hds-tabs__tab-button{isolation:isolate;position:static;display:flex;align-items:center;padding:0;color:inherit;background-color:transparent;border:none;border-radius:var(--token-tabs-tab-border-radius);cursor:pointer}.hds-tabs__tab-button::before{position:absolute;top:var(--token-tabs-tab-focus-inset);right:var(--token-tabs-tab-focus-inset);bottom:var(--token-tabs-tab-focus-inset);left:var(--token-tabs-tab-focus-inset);z-index:-1;border-radius:5px;content:""}.hds-tabs__tab-button.mock-focus::before,.hds-tabs__tab-button:focus::before{box-shadow:var(--token-focus-ring-action-box-shadow)}.hds-tabs__tab-button:focus:not(:focus-visible)::before{box-shadow:none}.hds-tabs__tab-button:focus-visible::before{box-shadow:var(--token-focus-ring-action-box-shadow)}.hds-tabs__tab-button.mock-focus.mock-active::before,.hds-tabs__tab-button:focus:active::before{box-shadow:none}.hds-tabs__tab-button::after{position:absolute;content:"";inset:0}.hds-tabs__tab-icon{margin-right:var(--token-tabs-tab-gutter)}.hds-tabs__tab-count{margin-left:var(--token-tabs-tab-gutter)}.hds-tabs__tab-indicator{position:absolute;right:0;bottom:0;left:var(--indicator-left-pos);z-index:10;display:block;width:var(--indicator-width);height:var(--token-tabs-indicator-height);background-color:var(--token-color-foreground-action);border-radius:var(--token-tabs-indicator-height)}.hds-tag,.hds-tag__dismiss,.hds-tag__link{background-color:var(--token-color-surface-interactive)}@media screen and (prefers-reduced-motion:no-preference){.hds-tabs__tab-indicator{transition-timing-function:var(--token-tabs-indicator-transition-function);transition-duration:var(--token-tabs-indicator-transition-duration);transition-property:left,width}}.hds-tag{display:inline-flex;align-items:stretch;line-height:1rem;border:1px solid var(--token-color-border-strong);border-radius:50px}article,aside,figure,footer,header,hgroup,hr,section{display:block}.hds-tag__dismiss{flex:0 0 auto;margin:0;padding:6px 2px 6px 8px;border:none;border-radius:inherit;border-top-right-radius:0;border-bottom-right-radius:0}.hds-tag__dismiss-icon{width:12px;height:12px}.hds-tag__link,.hds-tag__text{flex:1 0 0;padding:3px 10px 5px;border-radius:inherit}.hds-tag__dismiss~.hds-tag__link,.hds-tag__dismiss~.hds-tag__text{padding:3px 8px 5px 6px;border-top-left-radius:0;border-bottom-left-radius:0}.hds-tag__dismiss,.hds-tag__link{cursor:pointer}.hds-tag__dismiss.mock-hover,.hds-tag__dismiss:hover,.hds-tag__link.mock-hover,.hds-tag__link:hover{background-color:var(--token-color-surface-interactive-hover)}.hds-tag__dismiss.mock-active,.hds-tag__dismiss:active,.hds-tag__link.mock-active,.hds-tag__link:active,hr{background-color:var(--token-color-surface-interactive-active)}.hds-tag__dismiss.mock-focus,.hds-tag__dismiss:focus,.hds-tag__link.mock-focus,.hds-tag__link:focus{outline-style:solid;outline-color:transparent;z-index:1}.hds-tag__dismiss.mock-focus.mock-focus,.hds-tag__dismiss.mock-focus:focus,.hds-tag__dismiss:focus.mock-focus,.hds-tag__dismiss:focus:focus,.hds-tag__link.mock-focus.mock-focus,.hds-tag__link.mock-focus:focus,.hds-tag__link:focus.mock-focus,.hds-tag__link:focus:focus{box-shadow:var(--token-focus-ring-action-box-shadow)}.hds-tag__dismiss.mock-focus:focus:not(:focus-visible),.hds-tag__dismiss:focus:focus:not(:focus-visible),.hds-tag__link.mock-focus:focus:not(:focus-visible),.hds-tag__link:focus:focus:not(:focus-visible){box-shadow:none}.hds-tag__dismiss.mock-focus:focus-visible,.hds-tag__dismiss:focus:focus-visible,.hds-tag__link.mock-focus:focus-visible,.hds-tag__link:focus:focus-visible{box-shadow:var(--token-focus-ring-action-box-shadow)}.hds-tag__dismiss.mock-focus.mock-focus.mock-active,.hds-tag__dismiss.mock-focus:focus:active,.hds-tag__dismiss:focus.mock-focus.mock-active,.hds-tag__dismiss:focus:focus:active,.hds-tag__link.mock-focus.mock-focus.mock-active,.hds-tag__link.mock-focus:focus:active,.hds-tag__link:focus.mock-focus.mock-active,.hds-tag__link:focus:focus:active{box-shadow:none}.hds-tag--color-primary .hds-tag__link{color:var(--token-color-foreground-action)}.hds-tag--color-primary .hds-tag__link.mock-hover,.hds-tag--color-primary .hds-tag__link:hover{color:var(--token-color-foreground-action-hover)}.hds-tag--color-primary .hds-tag__link.mock-active,.hds-tag--color-primary .hds-tag__link:active{color:var(--token-color-foreground-action-active)}.hds-tag--color-secondary .hds-tag__link,body{color:var(--token-color-foreground-strong)}.hds-toast{width:-webkit-fit-content;width:-moz-fit-content;width:fit-content;min-width:min(360px,80vw);max-width:min(500px,80vw);box-shadow:var(--token-elevation-higher-box-shadow)}.sr-only{position:absolute!important;width:1px!important;height:1px!important;margin:-1px!important;padding:0!important;overflow:hidden!important;white-space:nowrap!important;border:0!important;clip:rect(1px,1px,1px,1px)!important;-webkit-clip-path:inset(50%)!important;clip-path:inset(50%)!important}fieldset,hr{border:none}blockquote,body,dd,dl,dt,fieldset,figure,h1,h2,h3,h4,h5,h6,hr,html,iframe,legend,li,ol,p,pre,textarea,ul{margin:0;padding:0}h1,h2,h3,h4,h5,h6{font-size:100%;font-weight:400}ul{list-style:none}table td,table th{padding:0;text-align:left}audio,embed,img,object,video{height:auto;max-width:100%}.consul-intention-action-warn-modal button.dangerous,.copy-button button,.disclosure-menu [aria-expanded]~*>ul>[role=treeitem],.disclosure-menu [aria-expanded]~*>ul>li>[role=menuitem],.disclosure-menu [aria-expanded]~*>ul>li>[role=option],.hashicorp-consul nav li.nspaces .disclosure-menu>button,.hashicorp-consul nav li.partitions .disclosure-menu>button,.informed-action>ul>li>*,.menu-panel>ul>[role=treeitem],.menu-panel>ul>li>[role=menuitem],.menu-panel>ul>li>[role=option],.more-popover-menu>[type=checkbox]+label+div>ul>[role=treeitem],.more-popover-menu>[type=checkbox]+label+div>ul>li>[role=menuitem],.more-popover-menu>[type=checkbox]+label+div>ul>li>[role=option],.popover-menu>[type=checkbox]+label+div>ul>[role=treeitem],.popover-menu>[type=checkbox]+label+div>ul>li>[role=menuitem],.popover-menu>[type=checkbox]+label+div>ul>li>[role=option],.popover-select label>*,.topology-notices button,.type-sort.popover-select label>*,label span,table.has-actions tr>.actions>[type=checkbox]+label+div>ul>[role=treeitem],table.has-actions tr>.actions>[type=checkbox]+label+div>ul>li>[role=menuitem],table.has-actions tr>.actions>[type=checkbox]+label+div>ul>li>[role=option],table.with-details tr>.actions>[type=checkbox]+label+div>ul>[role=treeitem],table.with-details tr>.actions>[type=checkbox]+label+div>ul>li>[role=menuitem],table.with-details tr>.actions>[type=checkbox]+label+div>ul>li>[role=option]{-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;user-select:none}a{color:var(--token-color-foreground-action)}span,strong,td,th{color:inherit}html{background-color:var(--token-color-surface-primary);font-size:var(--typo-size-000);text-rendering:optimizeLegibility;-webkit-text-size-adjust:100%;-moz-text-size-adjust:100%;text-size-adjust:100%;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;overflow-x:hidden;overflow-y:scroll;box-sizing:border-box;min-width:300px}hr{height:1px;margin:1.5rem 0}body,input,select,textarea{font-family:var(--typo-family-sans)}.CodeMirror-lint-tooltip,.cm-s-hashi.CodeMirror,code,pre{font-family:var(--typo-family-mono)}strong{font-style:inherit;font-weight:var(--typo-weight-bold)}code,pre{-moz-osx-font-smoothing:auto;-webkit-font-smoothing:auto}pre{-webkit-overflow-scrolling:touch;overflow-x:auto;white-space:pre;word-wrap:normal}*,::after,::before{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-scroll-snap-strictness:proximity;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgb(59 130 246 / 0.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;box-sizing:inherit;-webkit-animation-play-state:paused;animation-play-state:paused;-webkit-animation-fill-mode:forwards;animation-fill-mode:forwards}fieldset{width:100%}a,input[type=checkbox],input[type=radio]{cursor:pointer}input[type=checkbox],input[type=radio]{vertical-align:baseline}td,th{text-align:left;vertical-align:top}button,input,select,textarea{margin:0}iframe{border:0}.consul-bucket-list .service,.consul-bucket-list:not([class]) dt:not([class]),.consul-exposed-path-list>ul>li>.detail dl:not([class]) dt:not([class]),.consul-instance-checks:not([class]) dt:not([class]),.consul-lock-session-list dl:not([class]) dt:not([class]),.consul-server-card dt:not(.name),.consul-upstream-instance-list dl.local-bind-address dt,.consul-upstream-instance-list dl.local-bind-socket-path dt,.consul-upstream-instance-list dl:not([class]) dt:not([class]),.list-collection>ul>li:not(:first-child)>.detail dl:not([class]) dt:not([class]),.route-title,.tag-list:not([class]) dt:not([class]),section[data-route="dc.show.license"] .validity dl .expired+dd,section[data-route="dc.show.license"] .validity dl:not([class]) dt:not([class]),section[data-route="dc.show.serverstatus"] .redundancy-zones section header dl:not([class]) dt:not([class]),td.tags:not([class]) dt:not([class]){position:absolute;overflow:hidden;clip:rect(0 0 0 0);width:1px;height:1px;margin:-1px;padding:0;border:0}.consul-upstream-instance-list dl.local-bind-socket-mode dt,section[data-route="dc.show.serverstatus"] .redundancy-zones section header dt{position:static!important;clip:unset!important;overflow:visible!important;width:auto!important;height:auto!important;margin:0!important;padding:0!important}.animatable.tab-nav ul::after,.consul-auth-method-type,.consul-external-source,.consul-intention-action-warn-modal button.dangerous,.consul-intention-action-warn-modal button.dangerous:hover:active,.consul-intention-action-warn-modal button.dangerous:hover:not(:disabled):not(:active),.consul-intention-list td.intent- strong,.consul-intention-permission-form button.type-submit,.consul-intention-permission-form button.type-submit:disabled,.consul-intention-permission-form button.type-submit:focus:not(:disabled),.consul-intention-permission-form button.type-submit:hover:not(:disabled),.consul-intention-search-bar .value- span,.consul-kind,.consul-source,.consul-transparent-proxy,.disclosure-menu [aria-expanded]~*>ul>li.dangerous>:first-child,.discovery-chain .route-card>header ul li,.informed-action>ul>.dangerous>*,.informed-action>ul>.dangerous>:focus,.informed-action>ul>.dangerous>:hover,.leader,.menu-panel>ul>li.dangerous>:first-child,.modal-dialog [role=document]>footer,.modal-dialog [role=document]>header,.more-popover-menu>[type=checkbox]+label+div>ul>li.dangerous>:first-child,.popover-menu>[type=checkbox]+label+div>ul>li.dangerous>:first-child,.tab-nav .selected>*,.topology-metrics-source-type,html[data-route^="dc.acls.index"] main td strong,span.policy-node-identity,span.policy-service-identity,table.has-actions tr>.actions>[type=checkbox]+label+div>ul>li.dangerous>:first-child,table.with-details tr>.actions>[type=checkbox]+label+div>ul>li.dangerous>:first-child{border-style:solid}.animatable.tab-nav ul::after,.app .notifications .app-notification,.tab-nav li>*{transition-duration:.15s;transition-timing-function:ease-out}[role=banner] nav:first-of-type,[role=contentinfo],html body>.brand-loader,main{transition-timing-function:cubic-bezier(.1,.1,.25,.9);transition-duration:.1s}html[data-state]:not(.ember-loading) body>.brand-loader{-webkit-animation-timing-function:cubic-bezier(.1,.1,.25,.9);animation-timing-function:cubic-bezier(.1,.1,.25,.9);-webkit-animation-duration:.1s;animation-duration:.1s;-webkit-animation-name:remove-from-flow;animation-name:remove-from-flow;-webkit-animation-fill-mode:forwards;animation-fill-mode:forwards}@-webkit-keyframes remove-from-flow{100%{visibility:hidden;overflow:hidden;clip:rect(0 0 0 0)}}@keyframes remove-from-flow{100%{visibility:hidden;overflow:hidden;clip:rect(0 0 0 0)}}@-webkit-keyframes typo-truncate{100%{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}}@keyframes typo-truncate{100%{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}}.informed-action header>*{font-size:inherit;font-weight:inherit;line-height:inherit;font-style:inherit}.app-view>div form:not(.filter-bar) [role=radiogroup] label [type=password],.app-view>div form:not(.filter-bar) [role=radiogroup] label [type=text],.app-view>div form:not(.filter-bar) [role=radiogroup] label textarea,.modal-dialog [role=document] .type-password [type=password],.modal-dialog [role=document] .type-password [type=text],.modal-dialog [role=document] .type-password textarea,.modal-dialog [role=document] .type-select [type=password],.modal-dialog [role=document] .type-select [type=text],.modal-dialog [role=document] .type-select textarea,.modal-dialog [role=document] .type-text [type=password],.modal-dialog [role=document] .type-text [type=text],.modal-dialog [role=document] .type-text textarea,.modal-dialog [role=document] [role=radiogroup] label [type=password],.modal-dialog [role=document] [role=radiogroup] label [type=text],.modal-dialog [role=document] [role=radiogroup] label textarea,.oidc-select label [type=password],.oidc-select label [type=text],.oidc-select label textarea,.type-toggle [type=password],.type-toggle [type=text],.type-toggle textarea,body,main .type-password [type=password],main .type-password [type=text],main .type-password textarea,main .type-select [type=password],main .type-select [type=text],main .type-select textarea,main .type-text [type=password],main .type-text [type=text],main .type-text textarea{font-size:var(--typo-size-600);font-family:var(--typo-family-sans);line-height:var(--typo-lead-700)}.app-view>div form:not(.filter-bar) [role=radiogroup] label>span,.app-view>header .title .title-left-container>:first-child,.consul-auth-method-binding-list h2,.consul-auth-method-view section h2,.consul-health-check-list .health-check-output dt,.consul-health-check-list .health-check-output header>*,.consul-intention-list td.destination,.consul-intention-list td.source,.consul-intention-permission-form h2,.consul-intention-view h2,.consul-server-card .name+dd,.definition-table dt,.disclosure-menu [aria-expanded]~*>ul>[role=treeitem],.disclosure-menu [aria-expanded]~*>ul>li>[role=menuitem],.disclosure-menu [aria-expanded]~*>ul>li>[role=option],.empty-state header :first-child,.hashicorp-consul nav .dcs [aria-expanded],.hashicorp-consul nav li.nspaces .disclosure-menu>button,.hashicorp-consul nav li.partitions .disclosure-menu>button,.informed-action header,.informed-action>ul>li>*,.menu-panel>ul>[role=treeitem],.menu-panel>ul>li>[role=menuitem],.menu-panel>ul>li>[role=option],.modal-dialog [role=document] .type-password>span,.modal-dialog [role=document] .type-select>span,.modal-dialog [role=document] .type-text>span,.modal-dialog [role=document] [role=radiogroup] label>span,.modal-dialog [role=document] form h2,.modal-dialog [role=document] table caption,.modal-dialog [role=document] table td strong,.modal-dialog [role=document] table td:first-child,.modal-dialog [role=document] table th,.modal-dialog [role=document]>header>:not(button),.modal-dialog-body h2,.more-popover-menu>[type=checkbox]+label+div>ul>[role=treeitem],.more-popover-menu>[type=checkbox]+label+div>ul>li>[role=menuitem],.more-popover-menu>[type=checkbox]+label+div>ul>li>[role=option],.oidc-select label>span,.popover-menu>[type=checkbox]+label+div>ul>[role=treeitem],.popover-menu>[type=checkbox]+label+div>ul>li>[role=menuitem],.popover-menu>[type=checkbox]+label+div>ul>li>[role=option],.radio-card header,.tab-nav,.type-toggle label span,.type-toggle>span,[role=banner] nav:last-of-type [aria-expanded],[role=banner] nav:last-of-type>ul>li>.popover-menu>label>button,[role=banner] nav:last-of-type>ul>li>a,[role=banner] nav:last-of-type>ul>li>button,[role=banner] nav:last-of-type>ul>li>span,fieldset>header,html[data-route^="dc.kv.edit"] h2,html[data-route^="dc.services.instance.metadata"] .tab-section section h2,main .type-password>span,main .type-select>span,main .type-text>span,main form h2,main header nav:first-child ol li>*,main table caption,main table td strong,main table td:first-child,main table th,section[data-route="dc.show.license"] aside header>:first-child,section[data-route="dc.show.license"] h2,section[data-route="dc.show.serverstatus"] .redundancy-zones h3,section[data-route="dc.show.serverstatus"] h2,section[data-route="dc.show.serverstatus"] h3,table.has-actions tr>.actions>[type=checkbox]+label+div>ul>[role=treeitem],table.has-actions tr>.actions>[type=checkbox]+label+div>ul>li>[role=menuitem],table.has-actions tr>.actions>[type=checkbox]+label+div>ul>li>[role=option],table.with-details tr>.actions>[type=checkbox]+label+div>ul>[role=treeitem],table.with-details tr>.actions>[type=checkbox]+label+div>ul>li>[role=menuitem],table.with-details tr>.actions>[type=checkbox]+label+div>ul>li>[role=option]{line-height:var(--typo-lead-200)}.app-view>header .title .title-left-container>:first-child{font-weight:var(--typo-weight-bold);font-size:var(--typo-size-200)}.app-view>div form:not(.filter-bar) [role=radiogroup] label>span,.consul-auth-method-binding-list h2,.consul-auth-method-view section h2,.consul-health-check-list .health-check-output header>*,.consul-intention-list td.destination,.consul-intention-list td.source,.consul-intention-permission-form h2,.consul-intention-view h2,.consul-server-card .name+dd,.definition-table dt,.empty-state header :first-child,.hashicorp-consul nav .dcs [aria-expanded],.informed-action header,.modal-dialog [role=document] .type-password>span,.modal-dialog [role=document] .type-select>span,.modal-dialog [role=document] .type-text>span,.modal-dialog [role=document] [role=radiogroup] label>span,.modal-dialog [role=document] form h2,.modal-dialog [role=document] table caption,.modal-dialog [role=document] table td:first-child,.modal-dialog [role=document]>header>:not(button),.modal-dialog-body h2,.oidc-select label>span,.radio-card header,.type-toggle>span,[role=banner] nav:last-of-type [aria-expanded],[role=banner] nav:last-of-type>ul>li>.popover-menu>label>button,[role=banner] nav:last-of-type>ul>li>a,[role=banner] nav:last-of-type>ul>li>button,[role=banner] nav:last-of-type>ul>li>span,fieldset>header,html[data-route^="dc.kv.edit"] h2,html[data-route^="dc.services.instance.metadata"] .tab-section section h2,main .type-password>span,main .type-select>span,main .type-text>span,main form h2,main table caption,main table td:first-child,section[data-route="dc.show.license"] aside header>:first-child,section[data-route="dc.show.license"] h2,section[data-route="dc.show.serverstatus"] .redundancy-zones h3,section[data-route="dc.show.serverstatus"] h2,section[data-route="dc.show.serverstatus"] h3{font-weight:var(--typo-weight-semibold)}.consul-health-check-list .health-check-output dt,.disclosure-menu [aria-expanded]~*>ul>[role=treeitem],.disclosure-menu [aria-expanded]~*>ul>li>[role=menuitem],.disclosure-menu [aria-expanded]~*>ul>li>[role=option],.hashicorp-consul nav li.nspaces .disclosure-menu>button,.hashicorp-consul nav li.partitions .disclosure-menu>button,.informed-action>ul>li>*,.menu-panel>ul>[role=treeitem],.menu-panel>ul>li>[role=menuitem],.menu-panel>ul>li>[role=option],.modal-dialog [role=document] table td strong,.modal-dialog [role=document] table th,.more-popover-menu>[type=checkbox]+label+div>ul>[role=treeitem],.more-popover-menu>[type=checkbox]+label+div>ul>li>[role=menuitem],.more-popover-menu>[type=checkbox]+label+div>ul>li>[role=option],.popover-menu>[type=checkbox]+label+div>ul>[role=treeitem],.popover-menu>[type=checkbox]+label+div>ul>li>[role=menuitem],.popover-menu>[type=checkbox]+label+div>ul>li>[role=option],.tab-nav,.type-toggle label span,main header nav:first-child ol li>*,main table td strong,main table th,table.has-actions tr>.actions>[type=checkbox]+label+div>ul>[role=treeitem],table.has-actions tr>.actions>[type=checkbox]+label+div>ul>li>[role=menuitem],table.has-actions tr>.actions>[type=checkbox]+label+div>ul>li>[role=option],table.with-details tr>.actions>[type=checkbox]+label+div>ul>[role=treeitem],table.with-details tr>.actions>[type=checkbox]+label+div>ul>li>[role=menuitem],table.with-details tr>.actions>[type=checkbox]+label+div>ul>li>[role=option]{font-weight:var(--typo-weight-medium)}.consul-auth-method-binding-list h2,.consul-auth-method-view section h2,.consul-intention-permission-form h2,.consul-intention-view h2,.empty-state header :first-child,.modal-dialog [role=document] form h2,.modal-dialog [role=document]>header>:not(button),.modal-dialog-body h2,html[data-route^="dc.kv.edit"] h2,main form h2,section[data-route="dc.show.license"] h2,section[data-route="dc.show.serverstatus"] h2,section[data-route="dc.show.serverstatus"] h3{font-size:var(--typo-size-300)}.consul-health-check-list .health-check-output header>*,.consul-server-card .name+dd,html[data-route^="dc.services.instance.metadata"] .tab-section section h2,section[data-route="dc.show.license"] aside header>:first-child,section[data-route="dc.show.serverstatus"] .redundancy-zones h3{font-size:var(--typo-size-500)}.app-view>div form:not(.filter-bar) [role=radiogroup] label>span,.consul-intention-list td.destination,.consul-intention-list td.source,.definition-table dt,.disclosure-menu [aria-expanded]~*>ul>[role=treeitem],.disclosure-menu [aria-expanded]~*>ul>li>[role=menuitem],.disclosure-menu [aria-expanded]~*>ul>li>[role=option],.hashicorp-consul nav .dcs [aria-expanded],.hashicorp-consul nav li.nspaces .disclosure-menu>button,.hashicorp-consul nav li.partitions .disclosure-menu>button,.informed-action header,.informed-action>ul>li>*,.menu-panel>ul>[role=treeitem],.menu-panel>ul>li>[role=menuitem],.menu-panel>ul>li>[role=option],.modal-dialog [role=document] .type-password>span,.modal-dialog [role=document] .type-select>span,.modal-dialog [role=document] .type-text>span,.modal-dialog [role=document] [role=radiogroup] label>span,.modal-dialog [role=document] table caption,.modal-dialog [role=document] table td:first-child,.more-popover-menu>[type=checkbox]+label+div>ul>[role=treeitem],.more-popover-menu>[type=checkbox]+label+div>ul>li>[role=menuitem],.more-popover-menu>[type=checkbox]+label+div>ul>li>[role=option],.oidc-select label>span,.popover-menu>[type=checkbox]+label+div>ul>[role=treeitem],.popover-menu>[type=checkbox]+label+div>ul>li>[role=menuitem],.popover-menu>[type=checkbox]+label+div>ul>li>[role=option],.radio-card header,.tab-nav,.type-toggle>span,[role=banner] nav:last-of-type [aria-expanded],[role=banner] nav:last-of-type>ul>li>.popover-menu>label>button,[role=banner] nav:last-of-type>ul>li>a,[role=banner] nav:last-of-type>ul>li>button,[role=banner] nav:last-of-type>ul>li>span,fieldset>header,main .type-password>span,main .type-select>span,main .type-text>span,main header nav:first-child ol li>*,main table caption,main table td:first-child,table.has-actions tr>.actions>[type=checkbox]+label+div>ul>[role=treeitem],table.has-actions tr>.actions>[type=checkbox]+label+div>ul>li>[role=menuitem],table.has-actions tr>.actions>[type=checkbox]+label+div>ul>li>[role=option],table.with-details tr>.actions>[type=checkbox]+label+div>ul>[role=treeitem],table.with-details tr>.actions>[type=checkbox]+label+div>ul>li>[role=menuitem],table.with-details tr>.actions>[type=checkbox]+label+div>ul>li>[role=option]{font-size:var(--typo-size-600)}.consul-health-check-list .health-check-output dt,.modal-dialog [role=document] table td strong,.modal-dialog [role=document] table th,.type-toggle label span,main table td strong,main table th{font-size:var(--typo-size-700)}.app-view h1 span.kind-proxy,.app-view>div form:not(.filter-bar) [role=radiogroup] label>em,.app-view>div form:not(.filter-bar) [role=radiogroup] label>span,.auth-form em,.auth-profile,.consul-auth-method-view section,.consul-external-source,.consul-health-check-list .health-check-output dl>dd,.consul-intention-action-warn-modal button.dangerous,.consul-intention-fieldsets .permissions>button,.consul-intention-permission-header-list>ul>li dd,.consul-intention-permission-list>ul>li dd,.consul-kind,.consul-source,.copy-button button,.disclosure-menu [aria-expanded]~* [role=separator],.disclosure-menu [aria-expanded]~*>div,.discovery-chain .resolvers>header>*,.discovery-chain .routes>header>*,.discovery-chain .splitters>header>*,.empty-state header :nth-child(2),.empty-state p,.empty-state>ul>li>*,.empty-state>ul>li>label>button,.has-error>strong,.informed-action p,.menu-panel [role=separator],.menu-panel>div,.modal-dialog [role=document] .type-password>em,.modal-dialog [role=document] .type-password>span,.modal-dialog [role=document] .type-select>em,.modal-dialog [role=document] .type-select>span,.modal-dialog [role=document] .type-text>em,.modal-dialog [role=document] .type-text>span,.modal-dialog [role=document] [role=radiogroup] label>em,.modal-dialog [role=document] [role=radiogroup] label>span,.modal-dialog [role=document] form button+em,.modal-dialog [role=document] p,.modal-dialog [role=document] table td,.modal-dialog [role=document] table td p,.more-popover-menu>[type=checkbox]+label+div [role=separator],.more-popover-menu>[type=checkbox]+label+div>div,.oidc-select button.reset,.oidc-select label>em,.oidc-select label>span,.popover-menu>[type=checkbox]+label+div [role=separator],.popover-menu>[type=checkbox]+label+div>div,.popover-select label>*,.tippy-box[data-theme~=tooltip] .tippy-content,.topology-notices button,.type-sort.popover-select label>*,.type-toggle>em,.type-toggle>span,[role=banner] nav:first-of-type [role=separator],[role=banner] nav:first-of-type a,[role=banner] nav:first-of-type>ul>li>label,[role=contentinfo],main .type-password>em,main .type-password>span,main .type-select>em,main .type-select>span,main .type-text>em,main .type-text>span,main form button+em,main p,main table td,main table td p,pre code,section[data-route="dc.show.serverstatus"] .server-failure-tolerance dt,span.label,table.has-actions tr>.actions>[type=checkbox]+label+div [role=separator],table.has-actions tr>.actions>[type=checkbox]+label+div>div,table.with-details tr>.actions>[type=checkbox]+label+div [role=separator],table.with-details tr>.actions>[type=checkbox]+label+div>div{line-height:inherit;font-size:inherit}.consul-auth-method-view section,.consul-external-source,.consul-kind,.consul-source,[role=banner] nav:first-of-type a,[role=banner] nav:first-of-type>ul>li>label,pre code{font-size:var(--typo-size-600)}.app-view h1 span.kind-proxy,.app-view>div form:not(.filter-bar) [role=radiogroup] label>span,.auth-profile,.consul-health-check-list .health-check-output dl>dd,.consul-intention-fieldsets .permissions>button,.consul-intention-permission-header-list>ul>li dd,.consul-intention-permission-list>ul>li dd,.disclosure-menu [aria-expanded]~*>div,.empty-state>ul>li>*,.empty-state>ul>li>label>button,.informed-action p,.menu-panel>div,.modal-dialog [role=document] .type-password>span,.modal-dialog [role=document] .type-select>span,.modal-dialog [role=document] .type-text>span,.modal-dialog [role=document] [role=radiogroup] label>span,.modal-dialog [role=document] table td,.modal-dialog [role=document] table td p,.more-popover-menu>[type=checkbox]+label+div>div,.oidc-select label>span,.popover-menu>[type=checkbox]+label+div>div,.type-toggle>span,[role=contentinfo],main .type-password>span,main .type-select>span,main .type-text>span,main table td,main table td p,section[data-route="dc.show.serverstatus"] .server-failure-tolerance dt,span.label,table.has-actions tr>.actions>[type=checkbox]+label+div>div,table.with-details tr>.actions>[type=checkbox]+label+div>div{font-size:var(--typo-size-700)}.app-view>div form:not(.filter-bar) [role=radiogroup] label>em,.auth-form em,.consul-intention-action-warn-modal button.dangerous,.copy-button button,.disclosure-menu [aria-expanded]~* [role=separator],.discovery-chain .resolvers>header>*,.discovery-chain .routes>header>*,.discovery-chain .splitters>header>*,.empty-state header :nth-child(2),.empty-state p,.has-error>strong,.menu-panel [role=separator],.modal-dialog [role=document] .type-password>em,.modal-dialog [role=document] .type-select>em,.modal-dialog [role=document] .type-text>em,.modal-dialog [role=document] [role=radiogroup] label>em,.modal-dialog [role=document] form button+em,.modal-dialog [role=document] p,.more-popover-menu>[type=checkbox]+label+div [role=separator],.oidc-select button.reset,.oidc-select label>em,.popover-menu>[type=checkbox]+label+div [role=separator],.popover-select label>*,.tippy-box[data-theme~=tooltip] .tippy-content,.topology-notices button,.type-sort.popover-select label>*,.type-toggle>em,[role=banner] nav:first-of-type [role=separator],[role=contentinfo],main .type-password>em,main .type-select>em,main .type-text>em,main form button+em,main p,table.has-actions tr>.actions>[type=checkbox]+label+div [role=separator],table.with-details tr>.actions>[type=checkbox]+label+div [role=separator]{font-size:var(--typo-size-800)}::after,::before{--tw-content:'';display:inline-block;vertical-align:text-top;background-repeat:no-repeat;background-position:center;mask-repeat:no-repeat;-webkit-mask-repeat:no-repeat;mask-position:center;-webkit-mask-position:center}::before{-webkit-animation-name:var(--icon-name-start,var(--icon-name)),var(--icon-size-start,var(--icon-size,icon-000));animation-name:var(--icon-name-start,var(--icon-name)),var(--icon-size-start,var(--icon-size,icon-000));background-color:var(--icon-color-start,var(--icon-color))}::after{-webkit-animation-name:var(--icon-name-end,var(--icon-name)),var(--icon-size-end,var(--icon-size,icon-000));animation-name:var(--icon-name-end,var(--icon-name)),var(--icon-size-end,var(--icon-size,icon-000));background-color:var(--icon-color-end,var(--icon-color))}[style*="--icon-color-start"]::before{color:var(--icon-color-start)}[style*="--icon-color-end"]::after{color:var(--icon-color-end)}[style*="--icon-name-start"]::before,[style*="--icon-name-end"]::after{content:""}@-webkit-keyframes icon-000{100%{width:1.2em;height:1.2em}}@keyframes icon-000{100%{width:1.2em;height:1.2em}}@-webkit-keyframes icon-100{100%{width:.625rem;height:.625rem}}@keyframes icon-100{100%{width:.625rem;height:.625rem}}@-webkit-keyframes icon-200{100%{width:.75rem;height:.75rem}}@keyframes icon-200{100%{width:.75rem;height:.75rem}}@-webkit-keyframes icon-300{100%{width:1rem;height:1rem}}@keyframes icon-300{100%{width:1rem;height:1rem}}@-webkit-keyframes icon-400{100%{width:1.125rem;height:1.125rem}}@keyframes icon-400{100%{width:1.125rem;height:1.125rem}}@-webkit-keyframes icon-500{100%{width:1.25rem;height:1.25rem}}@keyframes icon-500{100%{width:1.25rem;height:1.25rem}}@-webkit-keyframes icon-600{100%{width:1.375rem;height:1.375rem}}@keyframes icon-600{100%{width:1.375rem;height:1.375rem}}@-webkit-keyframes icon-700{100%{width:1.5rem;height:1.5rem}}@keyframes icon-700{100%{width:1.5rem;height:1.5rem}}@-webkit-keyframes icon-800{100%{width:1.625rem;height:1.625rem}}@keyframes icon-800{100%{width:1.625rem;height:1.625rem}}@-webkit-keyframes icon-900{100%{width:1.75rem;height:1.75rem}}@keyframes icon-900{100%{width:1.75rem;height:1.75rem}}@-webkit-keyframes icon-999{100%{width:100%;height:100%}}@keyframes icon-999{100%{width:100%;height:100%}}.consul-intention-permission-header-list dt::before,.consul-intention-permission-list dt::before,.discovery-chain .resolver-card dt,.discovery-chain .route-card section header>::before{font-weight:var(--typo-weight-normal);background-color:var(--token-color-surface-strong);visibility:visible;padding:0 4px}.consul-intention-action-warn-modal button.dangerous:disabled .progress+*,.copy-button button:disabled .progress+*,.popover-select label>:disabled .progress+*,.topology-notices button:disabled .progress+*,[role=banner] nav:not(.in-viewport):first-of-type{visibility:hidden}#downstream-container .topology-metrics-card .details .group span::before,#downstream-container .topology-metrics-card div .critical::before,#downstream-container .topology-metrics-card div .empty::before,#downstream-container .topology-metrics-card div .health dt::before,#downstream-container .topology-metrics-card div .nspace dt::before,#downstream-container .topology-metrics-card div .partition dt::before,#downstream-container .topology-metrics-card div .passing::before,#downstream-container .topology-metrics-card div .warning::before,#downstream-container>div:first-child span::before,#login-toggle+div footer button::after,#metrics-container .link .config-link::before,#metrics-container .link .metrics-link::before,#metrics-container:hover .sparkline-key-link::before,#upstream-container .topology-metrics-card .details .group span::before,#upstream-container .topology-metrics-card div .critical::before,#upstream-container .topology-metrics-card div .empty::before,#upstream-container .topology-metrics-card div .health dt::before,#upstream-container .topology-metrics-card div .nspace dt::before,#upstream-container .topology-metrics-card div .partition dt::before,#upstream-container .topology-metrics-card div .passing::before,#upstream-container .topology-metrics-card div .warning::before,.animatable.tab-nav ul::after,.consul-auth-method-binding-list dl dt.type+dd span::before,.consul-auth-method-list ul .locality::before,.consul-auth-method-view dl dt.type+dd span::before,.consul-auth-method-view section dl dt.type+dd span::before,.consul-bucket-list .nspace::before,.consul-bucket-list .partition::before,.consul-bucket-list .peer::before,.consul-exposed-path-list>ul>li>.detail .policy-management::before,.consul-exposed-path-list>ul>li>.detail .policy::before,.consul-exposed-path-list>ul>li>.detail .role::before,.consul-exposed-path-list>ul>li>.detail dl.address dt::before,.consul-exposed-path-list>ul>li>.detail dl.behavior dt::before,.consul-exposed-path-list>ul>li>.detail dl.checks dt::before,.consul-exposed-path-list>ul>li>.detail dl.critical dt::before,.consul-exposed-path-list>ul>li>.detail dl.datacenter dt::before,.consul-exposed-path-list>ul>li>.detail dl.empty dt::before,.consul-exposed-path-list>ul>li>.detail dl.lock-delay dt::before,.consul-exposed-path-list>ul>li>.detail dl.mesh dt::before,.consul-exposed-path-list>ul>li>.detail dl.node dt::before,.consul-exposed-path-list>ul>li>.detail dl.nspace dt::before,.consul-exposed-path-list>ul>li>.detail dl.passing dt::before,.consul-exposed-path-list>ul>li>.detail dl.path dt::before,.consul-exposed-path-list>ul>li>.detail dl.port dt::before,.consul-exposed-path-list>ul>li>.detail dl.protocol dt::before,.consul-exposed-path-list>ul>li>.detail dl.socket dt::before,.consul-exposed-path-list>ul>li>.detail dl.ttl dt::before,.consul-exposed-path-list>ul>li>.detail dl.unknown dt::before,.consul-exposed-path-list>ul>li>.detail dl.warning dt::before,.consul-exposed-path-list>ul>li>.header .critical dd::before,.consul-exposed-path-list>ul>li>.header .empty dd::before,.consul-exposed-path-list>ul>li>.header .passing dd::before,.consul-exposed-path-list>ul>li>.header .policy-management dd::before,.consul-exposed-path-list>ul>li>.header .unknown dd::before,.consul-exposed-path-list>ul>li>.header .warning dd::before,.consul-exposed-path-list>ul>li>.header [rel=me] dd::before,.consul-external-source.jwt::before,.consul-external-source.oidc::before,.consul-health-check-list .health-check-output dd em.jwt::before,.consul-health-check-list .health-check-output dd em.oidc::before,.consul-health-check-list .health-check-output::before,.consul-instance-checks dt::before,.consul-intention-fieldsets .value->:last-child::before,.consul-intention-fieldsets .value-allow>:last-child::before,.consul-intention-fieldsets .value-deny>:last-child::before,.consul-intention-list em span::before,.consul-intention-list td strong.jwt::before,.consul-intention-list td strong.oidc::before,.consul-intention-list td.intent- strong::before,.consul-intention-list td.intent-allow strong::before,.consul-intention-list td.intent-deny strong::before,.consul-intention-permission-list .intent-allow::before,.consul-intention-permission-list .intent-deny::before,.consul-intention-permission-list strong.jwt::before,.consul-intention-permission-list strong.oidc::before,.consul-intention-search-bar .value- span::before,.consul-intention-search-bar .value-allow span::before,.consul-intention-search-bar .value-deny span::before,.consul-intention-search-bar li button span.jwt::before,.consul-intention-search-bar li button span.oidc::before,.consul-kind::before,.consul-lock-session-list ul>li:not(:first-child)>.detail .policy-management::before,.consul-lock-session-list ul>li:not(:first-child)>.detail .policy::before,.consul-lock-session-list ul>li:not(:first-child)>.detail .role::before,.consul-lock-session-list ul>li:not(:first-child)>.detail dl.address dt::before,.consul-lock-session-list ul>li:not(:first-child)>.detail dl.behavior dt::before,.consul-lock-session-list ul>li:not(:first-child)>.detail dl.checks dt::before,.consul-lock-session-list ul>li:not(:first-child)>.detail dl.critical dt::before,.consul-lock-session-list ul>li:not(:first-child)>.detail dl.datacenter dt::before,.consul-lock-session-list ul>li:not(:first-child)>.detail dl.empty dt::before,.consul-lock-session-list ul>li:not(:first-child)>.detail dl.lock-delay dt::before,.consul-lock-session-list ul>li:not(:first-child)>.detail dl.mesh dt::before,.consul-lock-session-list ul>li:not(:first-child)>.detail dl.node dt::before,.consul-lock-session-list ul>li:not(:first-child)>.detail dl.nspace dt::before,.consul-lock-session-list ul>li:not(:first-child)>.detail dl.passing dt::before,.consul-lock-session-list ul>li:not(:first-child)>.detail dl.path dt::before,.consul-lock-session-list ul>li:not(:first-child)>.detail dl.port dt::before,.consul-lock-session-list ul>li:not(:first-child)>.detail dl.protocol dt::before,.consul-lock-session-list ul>li:not(:first-child)>.detail dl.socket dt::before,.consul-lock-session-list ul>li:not(:first-child)>.detail dl.ttl dt::before,.consul-lock-session-list ul>li:not(:first-child)>.detail dl.unknown dt::before,.consul-lock-session-list ul>li:not(:first-child)>.detail dl.warning dt::before,.consul-lock-session-list ul>li:not(:first-child)>.header .critical dd::before,.consul-lock-session-list ul>li:not(:first-child)>.header .empty dd::before,.consul-lock-session-list ul>li:not(:first-child)>.header .passing dd::before,.consul-lock-session-list ul>li:not(:first-child)>.header .policy-management dd::before,.consul-lock-session-list ul>li:not(:first-child)>.header .unknown dd::before,.consul-lock-session-list ul>li:not(:first-child)>.header .warning dd::before,.consul-lock-session-list ul>li:not(:first-child)>.header [rel=me] dd::before,.consul-peer-search-bar li button span.jwt::before,.consul-peer-search-bar li button span.oidc::before,.consul-server-card .health-status+dd.jwt::before,.consul-server-card .health-status+dd.oidc::before,.consul-upstream-instance-list dl.datacenter dt::before,.consul-upstream-instance-list dl.nspace dt::before,.consul-upstream-instance-list dl.partition dt::before,.consul-upstream-instance-list li>.detail .policy-management::before,.consul-upstream-instance-list li>.detail .policy::before,.consul-upstream-instance-list li>.detail .role::before,.consul-upstream-instance-list li>.detail dl.address dt::before,.consul-upstream-instance-list li>.detail dl.behavior dt::before,.consul-upstream-instance-list li>.detail dl.checks dt::before,.consul-upstream-instance-list li>.detail dl.critical dt::before,.consul-upstream-instance-list li>.detail dl.datacenter dt::before,.consul-upstream-instance-list li>.detail dl.empty dt::before,.consul-upstream-instance-list li>.detail dl.lock-delay dt::before,.consul-upstream-instance-list li>.detail dl.mesh dt::before,.consul-upstream-instance-list li>.detail dl.node dt::before,.consul-upstream-instance-list li>.detail dl.nspace dt::before,.consul-upstream-instance-list li>.detail dl.passing dt::before,.consul-upstream-instance-list li>.detail dl.path dt::before,.consul-upstream-instance-list li>.detail dl.port dt::before,.consul-upstream-instance-list li>.detail dl.protocol dt::before,.consul-upstream-instance-list li>.detail dl.socket dt::before,.consul-upstream-instance-list li>.detail dl.ttl dt::before,.consul-upstream-instance-list li>.detail dl.unknown dt::before,.consul-upstream-instance-list li>.detail dl.warning dt::before,.consul-upstream-instance-list li>.header .critical dd::before,.consul-upstream-instance-list li>.header .empty dd::before,.consul-upstream-instance-list li>.header .passing dd::before,.consul-upstream-instance-list li>.header .policy-management dd::before,.consul-upstream-instance-list li>.header .unknown dd::before,.consul-upstream-instance-list li>.header .warning dd::before,.consul-upstream-instance-list li>.header [rel=me] dd::before,.consul-upstream-list dl.partition dt::before,.copy-button button::before,.dangerous.informed-action header::before,.disclosure-menu [aria-expanded]~*>ul>li.is-active>::after,.disclosure-menu [aria-expanded]~*>ul>li[aria-checked]>::after,.disclosure-menu [aria-expanded]~*>ul>li[aria-current]>::after,.disclosure-menu [aria-expanded]~*>ul>li[aria-selected]>::after,.discovery-chain .resolvers>header span::after,.discovery-chain .route-card::before,.discovery-chain .route-card>header ul li.jwt::before,.discovery-chain .route-card>header ul li.oidc::before,.discovery-chain .routes>header span::after,.discovery-chain .splitter-card::before,.discovery-chain .splitters>header span::after,.empty-state li[class*=-link]>::after,.has-error>strong::before,.hashicorp-consul .docs-link a::after,.hashicorp-consul .feedback-link a::after,.hashicorp-consul .learn-link a::after,.hashicorp-consul nav .dcs .dc-name span.jwt::before,.hashicorp-consul nav .dcs .dc-name span.oidc::before,.hashicorp-consul nav .dcs li.is-local span.jwt::before,.hashicorp-consul nav .dcs li.is-local span.oidc::before,.hashicorp-consul nav .dcs li.is-primary span.jwt::before,.hashicorp-consul nav .dcs li.is-primary span.oidc::before,.hashicorp-consul nav li.nspaces .disclosure-menu>button::after,.hashicorp-consul nav li.partitions .disclosure-menu>button::after,.info.informed-action header::before,.jwt.consul-auth-method-type::before,.jwt.consul-external-source::before,.jwt.consul-kind::before,.jwt.consul-source::before,.jwt.consul-transparent-proxy::before,.jwt.leader::before,.jwt.topology-metrics-source-type::before,.leader::before,.list-collection>button::after,.list-collection>ul>li:not(:first-child)>.detail .policy-management::before,.list-collection>ul>li:not(:first-child)>.detail .policy::before,.list-collection>ul>li:not(:first-child)>.detail .role::before,.list-collection>ul>li:not(:first-child)>.detail dl.address dt::before,.list-collection>ul>li:not(:first-child)>.detail dl.behavior dt::before,.list-collection>ul>li:not(:first-child)>.detail dl.checks dt::before,.list-collection>ul>li:not(:first-child)>.detail dl.critical dt::before,.list-collection>ul>li:not(:first-child)>.detail dl.datacenter dt::before,.list-collection>ul>li:not(:first-child)>.detail dl.empty dt::before,.list-collection>ul>li:not(:first-child)>.detail dl.lock-delay dt::before,.list-collection>ul>li:not(:first-child)>.detail dl.mesh dt::before,.list-collection>ul>li:not(:first-child)>.detail dl.node dt::before,.list-collection>ul>li:not(:first-child)>.detail dl.nspace dt::before,.list-collection>ul>li:not(:first-child)>.detail dl.passing dt::before,.list-collection>ul>li:not(:first-child)>.detail dl.path dt::before,.list-collection>ul>li:not(:first-child)>.detail dl.port dt::before,.list-collection>ul>li:not(:first-child)>.detail dl.protocol dt::before,.list-collection>ul>li:not(:first-child)>.detail dl.socket dt::before,.list-collection>ul>li:not(:first-child)>.detail dl.ttl dt::before,.list-collection>ul>li:not(:first-child)>.detail dl.unknown dt::before,.list-collection>ul>li:not(:first-child)>.detail dl.warning dt::before,.list-collection>ul>li:not(:first-child)>.header .critical dd::before,.list-collection>ul>li:not(:first-child)>.header .empty dd::before,.list-collection>ul>li:not(:first-child)>.header .passing dd::before,.list-collection>ul>li:not(:first-child)>.header .policy-management dd::before,.list-collection>ul>li:not(:first-child)>.header .unknown dd::before,.list-collection>ul>li:not(:first-child)>.header .warning dd::before,.list-collection>ul>li:not(:first-child)>.header [rel=me] dd::before,.menu-panel>ul>li.is-active>::after,.menu-panel>ul>li[aria-checked]>::after,.menu-panel>ul>li[aria-current]>::after,.menu-panel>ul>li[aria-selected]>::after,.modal-dialog [role=document] a[rel*=help]::after,.modal-dialog [role=document] table td.folder::before,.modal-dialog [role=document] table th span::after,.more-popover-menu>[type=checkbox]+label+div>ul>li.is-active>::after,.more-popover-menu>[type=checkbox]+label+div>ul>li[aria-checked]>::after,.more-popover-menu>[type=checkbox]+label+div>ul>li[aria-current]>::after,.more-popover-menu>[type=checkbox]+label+div>ul>li[aria-selected]>::after,.more-popover-menu>[type=checkbox]+label>::after,.oidc-select .auth0-oidc-provider::before,.oidc-select .google-oidc-provider::before,.oidc-select .microsoft-oidc-provider::before,.oidc-select .okta-oidc-provider::before,.oidc.consul-auth-method-type::before,.oidc.consul-external-source::before,.oidc.consul-kind::before,.oidc.consul-source::before,.oidc.consul-transparent-proxy::before,.oidc.leader::before,.oidc.topology-metrics-source-type::before,.popover-menu>[type=checkbox]+label+div>ul>li.is-active>::after,.popover-menu>[type=checkbox]+label+div>ul>li[aria-checked]>::after,.popover-menu>[type=checkbox]+label+div>ul>li[aria-current]>::after,.popover-menu>[type=checkbox]+label+div>ul>li[aria-selected]>::after,.popover-menu>[type=checkbox]+label>::after,.popover-select .jwt button::before,.popover-select .oidc button::before,.popover-select .value-critical button::before,.popover-select .value-empty button::before,.popover-select .value-passing button::before,.popover-select .value-unknown button::before,.popover-select .value-warning button::before,.search-bar-status li.jwt:not(.remove-all)::before,.search-bar-status li.oidc:not(.remove-all)::before,.search-bar-status li:not(.remove-all) button::before,.sparkline-key h3::before,.tag-list dt::before,.tooltip-panel dd>div::before,.topology-metrics-popover.deny .tippy-arrow::after,.topology-metrics-popover.deny>button::before,.topology-metrics-popover.l7 .tippy-arrow::after,.topology-metrics-popover.l7>button::before,.topology-metrics-popover.not-defined .tippy-arrow::after,.topology-metrics-popover.not-defined>button::before,.topology-metrics-status-error span::before,.topology-metrics-status-loader span::before,.topology-notices button::before,.type-sort.popover-select label>::before,.type-source.popover-select li.partition button::before,.warning.informed-action header::before,.warning.modal-dialog header::before,[class*=status-].empty-state header::before,a[rel*=external]::after,html[data-route^="dc.acls.index"] main td strong.jwt::before,html[data-route^="dc.acls.index"] main td strong.oidc::before,main a[rel*=help]::after,main header nav:first-child ol li:first-child a::before,main table td.folder::before,main table th span::after,section[data-route="dc.show.serverstatus"] .redundancy-zones section header dl.jwt::before,section[data-route="dc.show.serverstatus"] .redundancy-zones section header dl.oidc::before,section[data-route="dc.show.serverstatus"] .server-failure-tolerance header em.jwt::before,section[data-route="dc.show.serverstatus"] .server-failure-tolerance header em.oidc::before,span.jwt.policy-node-identity::before,span.jwt.policy-service-identity::before,span.oidc.policy-node-identity::before,span.oidc.policy-service-identity::before,table.has-actions tr>.actions>[type=checkbox]+label+div>ul>li.is-active>::after,table.has-actions tr>.actions>[type=checkbox]+label+div>ul>li[aria-checked]>::after,table.has-actions tr>.actions>[type=checkbox]+label+div>ul>li[aria-current]>::after,table.has-actions tr>.actions>[type=checkbox]+label+div>ul>li[aria-selected]>::after,table.has-actions tr>.actions>[type=checkbox]+label>::after,table.with-details td:only-child>div>label::before,table.with-details td>label::before,table.with-details tr>.actions>[type=checkbox]+label+div>ul>li.is-active>::after,table.with-details tr>.actions>[type=checkbox]+label+div>ul>li[aria-checked]>::after,table.with-details tr>.actions>[type=checkbox]+label+div>ul>li[aria-current]>::after,table.with-details tr>.actions>[type=checkbox]+label+div>ul>li[aria-selected]>::after,table.with-details tr>.actions>[type=checkbox]+label>::after,td.tags dt::before{content:""}.hashicorp-consul .acls-separator span{box-sizing:border-box;width:12px;height:12px}.hashicorp-consul .acls-separator span::after,.hashicorp-consul .acls-separator span::before{content:"";display:block;width:100%;height:100%;border-radius:100%}.hashicorp-consul .acls-separator span::before{border:1px solid currentColor;opacity:.5}.ember-power-select-trigger,.ember-power-select-trigger--active,.ember-power-select-trigger:focus{border-top:1px solid #aaa;border-bottom:1px solid #aaa;border-right:1px solid #aaa;border-left:1px solid #aaa}.hashicorp-consul .acls-separator span::after{position:absolute;top:2px;left:2px;width:calc(100% - 4px);height:calc(100% - 4px);background-color:currentColor}@-webkit-keyframes icon-alert-circle-outline{100%{-webkit-mask-image:var(--icon-alert-circle-16);mask-image:var(--icon-alert-circle-16);background-color:var(--icon-color,var(--color-alert-circle-outline-500,currentColor))}}@keyframes icon-alert-circle-outline{100%{-webkit-mask-image:var(--icon-alert-circle-16);mask-image:var(--icon-alert-circle-16);background-color:var(--icon-color,var(--color-alert-circle-outline-500,currentColor))}}[class*=status-].empty-state header::before{--icon-name:icon-alert-circle-outline;content:""}@-webkit-keyframes icon-alert-triangle{100%{-webkit-mask-image:var(--icon-alert-triangle-16);mask-image:var(--icon-alert-triangle-16);background-color:var(--icon-color,var(--color-alert-triangle-500,currentColor))}}@keyframes icon-alert-triangle{100%{-webkit-mask-image:var(--icon-alert-triangle-16);mask-image:var(--icon-alert-triangle-16);background-color:var(--icon-color,var(--color-alert-triangle-500,currentColor))}}#downstream-container .topology-metrics-card div .warning::before,#upstream-container .topology-metrics-card div .warning::before,.consul-exposed-path-list>ul>li>.detail dl.warning dt::before,.consul-exposed-path-list>ul>li>.header .warning dd::before,.consul-health-check-list .warning.health-check-output::before,.consul-instance-checks.warning dt::before,.consul-lock-session-list ul>li:not(:first-child)>.detail dl.warning dt::before,.consul-lock-session-list ul>li:not(:first-child)>.header .warning dd::before,.consul-upstream-instance-list li>.detail dl.warning dt::before,.consul-upstream-instance-list li>.header .warning dd::before,.dangerous.informed-action header::before,.list-collection>ul>li:not(:first-child)>.detail dl.warning dt::before,.list-collection>ul>li:not(:first-child)>.header .warning dd::before,.popover-select .value-warning button::before,.topology-metrics-popover.not-defined .tippy-arrow::after,.topology-metrics-popover.not-defined>button::before,.warning.informed-action header::before,.warning.modal-dialog header::before{--icon-name:icon-alert-triangle;content:""}@-webkit-keyframes icon-arrow-left{100%{-webkit-mask-image:var(--icon-arrow-left-16);mask-image:var(--icon-arrow-left-16);background-color:var(--icon-color,var(--color-arrow-left-500,currentColor))}}@keyframes icon-arrow-left{100%{-webkit-mask-image:var(--icon-arrow-left-16);mask-image:var(--icon-arrow-left-16);background-color:var(--icon-color,var(--color-arrow-left-500,currentColor))}}@-webkit-keyframes icon-arrow-right{100%{-webkit-mask-image:var(--icon-arrow-right-16);mask-image:var(--icon-arrow-right-16);background-color:var(--icon-color,var(--color-arrow-right-500,currentColor))}}@keyframes icon-arrow-right{100%{-webkit-mask-image:var(--icon-arrow-right-16);mask-image:var(--icon-arrow-right-16);background-color:var(--icon-color,var(--color-arrow-right-500,currentColor))}}@-webkit-keyframes icon-cancel-plain{100%{-webkit-mask-image:var(--icon-x-16);mask-image:var(--icon-x-16);background-color:var(--icon-color,var(--color-cancel-plain-500,currentColor))}}@keyframes icon-cancel-plain{100%{-webkit-mask-image:var(--icon-x-16);mask-image:var(--icon-x-16);background-color:var(--icon-color,var(--color-cancel-plain-500,currentColor))}}.search-bar-status li:not(.remove-all) button::before{--icon-name:icon-cancel-plain;content:""}@-webkit-keyframes icon-cancel-square-fill{100%{-webkit-mask-image:var(--icon-x-square-fill-16);mask-image:var(--icon-x-square-fill-16);background-color:var(--icon-color,var(--color-cancel-square-fill-500,currentColor))}}@keyframes icon-cancel-square-fill{100%{-webkit-mask-image:var(--icon-x-square-fill-16);mask-image:var(--icon-x-square-fill-16);background-color:var(--icon-color,var(--color-cancel-square-fill-500,currentColor))}}#downstream-container .topology-metrics-card div .critical::before,#upstream-container .topology-metrics-card div .critical::before,.consul-exposed-path-list>ul>li>.detail dl.critical dt::before,.consul-exposed-path-list>ul>li>.header .critical dd::before,.consul-health-check-list .critical.health-check-output::before,.consul-instance-checks.critical dt::before,.consul-lock-session-list ul>li:not(:first-child)>.detail dl.critical dt::before,.consul-lock-session-list ul>li:not(:first-child)>.header .critical dd::before,.consul-upstream-instance-list li>.detail dl.critical dt::before,.consul-upstream-instance-list li>.header .critical dd::before,.has-error>strong::before,.list-collection>ul>li:not(:first-child)>.detail dl.critical dt::before,.list-collection>ul>li:not(:first-child)>.header .critical dd::before,.popover-select .value-critical button::before,.topology-metrics-popover.deny .tippy-arrow::after,.topology-metrics-popover.deny>button::before{--icon-name:icon-cancel-square-fill;content:""}@-webkit-keyframes icon-check-plain{100%{-webkit-mask-image:var(--icon-check-16);mask-image:var(--icon-check-16);background-color:var(--icon-color,var(--color-check-plain-500,currentColor))}}@keyframes icon-check-plain{100%{-webkit-mask-image:var(--icon-check-16);mask-image:var(--icon-check-16);background-color:var(--icon-color,var(--color-check-plain-500,currentColor))}}.disclosure-menu [aria-expanded]~*>ul>li.is-active>::after,.disclosure-menu [aria-expanded]~*>ul>li[aria-checked]>::after,.disclosure-menu [aria-expanded]~*>ul>li[aria-current]>::after,.disclosure-menu [aria-expanded]~*>ul>li[aria-selected]>::after,.menu-panel>ul>li.is-active>::after,.menu-panel>ul>li[aria-checked]>::after,.menu-panel>ul>li[aria-current]>::after,.menu-panel>ul>li[aria-selected]>::after,.more-popover-menu>[type=checkbox]+label+div>ul>li.is-active>::after,.more-popover-menu>[type=checkbox]+label+div>ul>li[aria-checked]>::after,.more-popover-menu>[type=checkbox]+label+div>ul>li[aria-current]>::after,.more-popover-menu>[type=checkbox]+label+div>ul>li[aria-selected]>::after,.popover-menu>[type=checkbox]+label+div>ul>li.is-active>::after,.popover-menu>[type=checkbox]+label+div>ul>li[aria-checked]>::after,.popover-menu>[type=checkbox]+label+div>ul>li[aria-current]>::after,.popover-menu>[type=checkbox]+label+div>ul>li[aria-selected]>::after,table.has-actions tr>.actions>[type=checkbox]+label+div>ul>li.is-active>::after,table.has-actions tr>.actions>[type=checkbox]+label+div>ul>li[aria-checked]>::after,table.has-actions tr>.actions>[type=checkbox]+label+div>ul>li[aria-current]>::after,table.has-actions tr>.actions>[type=checkbox]+label+div>ul>li[aria-selected]>::after,table.with-details tr>.actions>[type=checkbox]+label+div>ul>li.is-active>::after,table.with-details tr>.actions>[type=checkbox]+label+div>ul>li[aria-checked]>::after,table.with-details tr>.actions>[type=checkbox]+label+div>ul>li[aria-current]>::after,table.with-details tr>.actions>[type=checkbox]+label+div>ul>li[aria-selected]>::after{--icon-name:icon-check-plain;content:""}@-webkit-keyframes icon-chevron-down{100%{-webkit-mask-image:var(--icon-chevron-down-16);mask-image:var(--icon-chevron-down-16);background-color:var(--icon-color,var(--color-chevron-down-500,currentColor))}}@keyframes icon-chevron-down{100%{-webkit-mask-image:var(--icon-chevron-down-16);mask-image:var(--icon-chevron-down-16);background-color:var(--icon-color,var(--color-chevron-down-500,currentColor))}}.hashicorp-consul nav li.nspaces .disclosure-menu>button::after,.hashicorp-consul nav li.partitions .disclosure-menu>button::after,.list-collection>button.closed::after,.more-popover-menu>[type=checkbox]+label>::after,.popover-menu>[type=checkbox]+label>::after,.topology-notices button::before,table.has-actions tr>.actions>[type=checkbox]+label>::after,table.with-details td:only-child>div>label::before,table.with-details td>label::before,table.with-details tr>.actions>[type=checkbox]+label>::after{--icon-name:icon-chevron-down;content:""}@-webkit-keyframes icon-copy-action{100%{-webkit-mask-image:var(--icon-clipboard-copy-16);mask-image:var(--icon-clipboard-copy-16);background-color:var(--icon-color,var(--color-copy-action-500,currentColor))}}@keyframes icon-copy-action{100%{-webkit-mask-image:var(--icon-clipboard-copy-16);mask-image:var(--icon-clipboard-copy-16);background-color:var(--icon-color,var(--color-copy-action-500,currentColor))}}.copy-button button::before{--icon-name:icon-copy-action;content:"";--icon-color:var(--token-color-foreground-faint)}@-webkit-keyframes icon-deny-alt{100%{-webkit-mask-image:var(--icon-skip-16);mask-image:var(--icon-skip-16);background-color:var(--icon-color,var(--color-deny-alt-500,currentColor))}}@keyframes icon-deny-alt{100%{-webkit-mask-image:var(--icon-skip-16);mask-image:var(--icon-skip-16);background-color:var(--icon-color,var(--color-deny-alt-500,currentColor))}}@-webkit-keyframes icon-deny-default{100%{-webkit-mask-image:var(--icon-skip-16);mask-image:var(--icon-skip-16);background-color:var(--icon-color,var(--color-deny-default-500,currentColor))}}@keyframes icon-deny-default{100%{-webkit-mask-image:var(--icon-skip-16);mask-image:var(--icon-skip-16);background-color:var(--icon-color,var(--color-deny-default-500,currentColor))}}@-webkit-keyframes icon-disabled{100%{-webkit-mask-image:var(--icon-skip-16);mask-image:var(--icon-skip-16);background-color:var(--icon-color,var(--color-disabled-500,currentColor))}}@keyframes icon-disabled{100%{-webkit-mask-image:var(--icon-skip-16);mask-image:var(--icon-skip-16);background-color:var(--icon-color,var(--color-disabled-500,currentColor))}}.status-403.empty-state header::before{--icon-name:icon-disabled;content:""}@-webkit-keyframes icon-docs{100%{-webkit-mask-image:var(--icon-docs-16);mask-image:var(--icon-docs-16);background-color:var(--icon-color,var(--color-docs-500,currentColor))}}@keyframes icon-docs{100%{-webkit-mask-image:var(--icon-docs-16);mask-image:var(--icon-docs-16);background-color:var(--icon-color,var(--color-docs-500,currentColor))}}#metrics-container .link .config-link::before,.empty-state .docs-link>::after,.hashicorp-consul .docs-link a::after{--icon-name:icon-docs;content:""}@-webkit-keyframes icon-exit{100%{-webkit-mask-image:var(--icon-external-link-16);mask-image:var(--icon-external-link-16);background-color:var(--icon-color,var(--color-exit-500,currentColor))}}@keyframes icon-exit{100%{-webkit-mask-image:var(--icon-external-link-16);mask-image:var(--icon-external-link-16);background-color:var(--icon-color,var(--color-exit-500,currentColor))}}#metrics-container .link .metrics-link::before,a[rel*=external]::after{--icon-name:icon-exit;content:""}@-webkit-keyframes icon-file-fill{100%{-webkit-mask-image:var(--icon-file-16);mask-image:var(--icon-file-16);background-color:var(--icon-color,var(--color-file-fill-500,currentColor))}}@keyframes icon-file-fill{100%{-webkit-mask-image:var(--icon-file-16);mask-image:var(--icon-file-16);background-color:var(--icon-color,var(--color-file-fill-500,currentColor))}}@-webkit-keyframes icon-folder-outline{100%{-webkit-mask-image:var(--icon-folder-16);mask-image:var(--icon-folder-16);background-color:var(--icon-color,var(--color-folder-outline-500,currentColor))}}@keyframes icon-folder-outline{100%{-webkit-mask-image:var(--icon-folder-16);mask-image:var(--icon-folder-16);background-color:var(--icon-color,var(--color-folder-outline-500,currentColor))}}#downstream-container .topology-metrics-card div .nspace dt::before,#upstream-container .topology-metrics-card div .nspace dt::before,.consul-bucket-list .nspace::before,.consul-exposed-path-list>ul>li>.detail dl.nspace dt::before,.consul-intention-list span[class|=nspace]::before,.consul-lock-session-list ul>li:not(:first-child)>.detail dl.nspace dt::before,.consul-upstream-instance-list dl.nspace dt::before,.list-collection>ul>li:not(:first-child)>.detail dl.nspace dt::before,.modal-dialog [role=document] table td.folder::before,main table td.folder::before{--icon-name:icon-folder-outline;content:""}@-webkit-keyframes icon-health{100%{-webkit-mask-image:var(--icon-activity-16);mask-image:var(--icon-activity-16);background-color:var(--icon-color,var(--color-health-500,currentColor))}}@keyframes icon-health{100%{-webkit-mask-image:var(--icon-activity-16);mask-image:var(--icon-activity-16);background-color:var(--icon-color,var(--color-health-500,currentColor))}}.consul-exposed-path-list>ul>li>.detail dl.checks dt::before,.consul-lock-session-list ul>li:not(:first-child)>.detail dl.checks dt::before,.consul-upstream-instance-list li>.detail dl.checks dt::before,.list-collection>ul>li:not(:first-child)>.detail dl.checks dt::before{--icon-name:icon-health;content:""}@-webkit-keyframes icon-help-circle-outline{100%{-webkit-mask-image:var(--icon-help-16);mask-image:var(--icon-help-16);background-color:var(--icon-color,var(--color-help-circle-outline-500,currentColor))}}@keyframes icon-help-circle-outline{100%{-webkit-mask-image:var(--icon-help-16);mask-image:var(--icon-help-16);background-color:var(--icon-color,var(--color-help-circle-outline-500,currentColor))}}#downstream-container .topology-metrics-card div .health dt::before,#upstream-container .topology-metrics-card div .health dt::before,.consul-exposed-path-list>ul>li>.detail dl.unknown dt::before,.consul-exposed-path-list>ul>li>.header .unknown dd::before,.consul-lock-session-list ul>li:not(:first-child)>.detail dl.unknown dt::before,.consul-lock-session-list ul>li:not(:first-child)>.header .unknown dd::before,.consul-upstream-instance-list li>.detail dl.unknown dt::before,.consul-upstream-instance-list li>.header .unknown dd::before,.list-collection>ul>li:not(:first-child)>.detail dl.unknown dt::before,.list-collection>ul>li:not(:first-child)>.header .unknown dd::before,.popover-select .value-unknown button::before,.status-404.empty-state header::before{--icon-name:icon-help-circle-outline;content:""}@-webkit-keyframes icon-info-circle-fill{100%{-webkit-mask-image:var(--icon-info-16);mask-image:var(--icon-info-16);background-color:var(--icon-color,var(--color-info-circle-fill-500,currentColor))}}@keyframes icon-info-circle-fill{100%{-webkit-mask-image:var(--icon-info-16);mask-image:var(--icon-info-16);background-color:var(--icon-color,var(--color-info-circle-fill-500,currentColor))}}#metrics-container:hover .sparkline-key-link::before,.info.informed-action header::before,.sparkline-key h3::before{--icon-name:icon-info-circle-fill;content:""}@-webkit-keyframes icon-info-circle-outline{100%{-webkit-mask-image:var(--icon-info-16);mask-image:var(--icon-info-16);background-color:var(--icon-color,var(--color-info-circle-outline-500,currentColor))}}@keyframes icon-info-circle-outline{100%{-webkit-mask-image:var(--icon-info-16);mask-image:var(--icon-info-16);background-color:var(--icon-color,var(--color-info-circle-outline-500,currentColor))}}#downstream-container>div:first-child span::before,.consul-auth-method-binding-list dl dt.type+dd span::before,.consul-auth-method-view dl dt.type+dd span::before,.consul-exposed-path-list>ul>li>.detail dl.behavior dt::before,.consul-lock-session-list ul>li:not(:first-child)>.detail dl.behavior dt::before,.consul-upstream-instance-list li>.detail dl.behavior dt::before,.discovery-chain .resolvers>header span::after,.discovery-chain .routes>header span::after,.discovery-chain .splitters>header span::after,.list-collection>ul>li:not(:first-child)>.detail dl.behavior dt::before,.modal-dialog [role=document] a[rel*=help]::after,.modal-dialog [role=document] table th span::after,.topology-metrics-status-error span::before,.topology-metrics-status-loader span::before,main a[rel*=help]::after,main table th span::after{--icon-name:icon-info-circle-outline;content:""}@-webkit-keyframes icon-learn{100%{-webkit-mask-image:var(--icon-learn-16);mask-image:var(--icon-learn-16);background-color:var(--icon-color,var(--color-learn-500,currentColor))}}@keyframes icon-learn{100%{-webkit-mask-image:var(--icon-learn-16);mask-image:var(--icon-learn-16);background-color:var(--icon-color,var(--color-learn-500,currentColor))}}.empty-state .learn-link>::after,.hashicorp-consul .learn-link a::after{--icon-name:icon-learn;content:""}@-webkit-keyframes icon-loading{100%{-webkit-mask-image:var(--icon-loading-16);mask-image:var(--icon-loading-16);background-color:var(--icon-color,var(--color-loading-500,currentColor))}}@-webkit-keyframes icon-logo-github-monochrome{100%{-webkit-mask-image:var(--icon-github-color-16);mask-image:var(--icon-github-color-16);background-color:var(--icon-color,var(--color-logo-github-monochrome-500,currentColor))}}@keyframes icon-logo-github-monochrome{100%{-webkit-mask-image:var(--icon-github-color-16);mask-image:var(--icon-github-color-16);background-color:var(--icon-color,var(--color-logo-github-monochrome-500,currentColor))}}.hashicorp-consul .feedback-link a::after{--icon-name:icon-logo-github-monochrome;content:""}@-webkit-keyframes icon-logo-google-color{100%{background-image:var(--icon-google-color-16)}}@keyframes icon-logo-google-color{100%{background-image:var(--icon-google-color-16)}}.oidc-select .google-oidc-provider::before{--icon-name:icon-logo-google-color;content:""}@-webkit-keyframes icon-logo-kubernetes-color{100%{background-image:var(--icon-kubernetes-color-16)}}@keyframes icon-logo-kubernetes-color{100%{background-image:var(--icon-kubernetes-color-16)}}@-webkit-keyframes icon-menu{100%{-webkit-mask-image:var(--icon-menu-16);mask-image:var(--icon-menu-16);background-color:var(--icon-color,var(--color-menu-500,currentColor))}}@keyframes icon-menu{100%{-webkit-mask-image:var(--icon-menu-16);mask-image:var(--icon-menu-16);background-color:var(--icon-color,var(--color-menu-500,currentColor))}}@-webkit-keyframes icon-minus-square-fill{100%{-webkit-mask-image:var(--icon-minus-square-16);mask-image:var(--icon-minus-square-16);background-color:var(--icon-color,var(--color-minus-square-fill-500,currentColor))}}@keyframes icon-minus-square-fill{100%{-webkit-mask-image:var(--icon-minus-square-16);mask-image:var(--icon-minus-square-16);background-color:var(--icon-color,var(--color-minus-square-fill-500,currentColor))}}#downstream-container .topology-metrics-card div .empty::before,#upstream-container .topology-metrics-card div .empty::before,.consul-exposed-path-list>ul>li>.detail dl.empty dt::before,.consul-exposed-path-list>ul>li>.header .empty dd::before,.consul-instance-checks.empty dt::before,.consul-lock-session-list ul>li:not(:first-child)>.detail dl.empty dt::before,.consul-lock-session-list ul>li:not(:first-child)>.header .empty dd::before,.consul-upstream-instance-list li>.detail dl.empty dt::before,.consul-upstream-instance-list li>.header .empty dd::before,.list-collection>ul>li:not(:first-child)>.detail dl.empty dt::before,.list-collection>ul>li:not(:first-child)>.header .empty dd::before,.popover-select .value-empty button::before{--icon-name:icon-minus-square-fill;content:""}@-webkit-keyframes icon-more-horizontal{100%{-webkit-mask-image:var(--icon-more-horizontal-16);mask-image:var(--icon-more-horizontal-16);background-color:var(--icon-color,var(--color-more-horizontal-500,currentColor))}}@keyframes icon-more-horizontal{100%{-webkit-mask-image:var(--icon-more-horizontal-16);mask-image:var(--icon-more-horizontal-16);background-color:var(--icon-color,var(--color-more-horizontal-500,currentColor))}}@-webkit-keyframes icon-public-default{100%{-webkit-mask-image:var(--icon-globe-16);mask-image:var(--icon-globe-16);background-color:var(--icon-color,var(--color-public-default-500,currentColor))}}@keyframes icon-public-default{100%{-webkit-mask-image:var(--icon-globe-16);mask-image:var(--icon-globe-16);background-color:var(--icon-color,var(--color-public-default-500,currentColor))}}.consul-auth-method-list ul .locality::before,.consul-exposed-path-list>ul>li>.detail dl.address dt::before,.consul-lock-session-list ul>li:not(:first-child)>.detail dl.address dt::before,.consul-upstream-instance-list li>.detail dl.address dt::before,.list-collection>ul>li:not(:first-child)>.detail dl.address dt::before{--icon-name:icon-public-default;content:""}@-webkit-keyframes icon-search{100%{-webkit-mask-image:var(--icon-search-16);mask-image:var(--icon-search-16);background-color:var(--icon-color,var(--color-search-500,currentColor))}}@keyframes icon-search{100%{-webkit-mask-image:var(--icon-search-16);mask-image:var(--icon-search-16);background-color:var(--icon-color,var(--color-search-500,currentColor))}}@-webkit-keyframes icon-star-outline{100%{-webkit-mask-image:var(--icon-star-16);mask-image:var(--icon-star-16);background-color:var(--icon-color,var(--color-star-outline-500,currentColor))}}@keyframes icon-star-outline{100%{-webkit-mask-image:var(--icon-star-16);mask-image:var(--icon-star-16);background-color:var(--icon-color,var(--color-star-outline-500,currentColor))}}.leader::before{--icon-name:icon-star-outline;content:""}@-webkit-keyframes icon-user-organization{100%{-webkit-mask-image:var(--icon-org-16);mask-image:var(--icon-org-16);background-color:var(--icon-color,var(--color-user-organization-500,currentColor))}}@keyframes icon-user-organization{100%{-webkit-mask-image:var(--icon-org-16);mask-image:var(--icon-org-16);background-color:var(--icon-color,var(--color-user-organization-500,currentColor))}}.consul-exposed-path-list>ul>li>.detail dl.datacenter dt::before,.consul-lock-session-list ul>li:not(:first-child)>.detail dl.datacenter dt::before,.consul-upstream-instance-list dl.datacenter dt::before,.list-collection>ul>li:not(:first-child)>.detail dl.datacenter dt::before{--icon-name:icon-user-organization;content:""}@-webkit-keyframes icon-user-plain{100%{-webkit-mask-image:var(--icon-user-16);mask-image:var(--icon-user-16);background-color:var(--icon-color,var(--color-user-plain-500,currentColor))}}@keyframes icon-user-plain{100%{-webkit-mask-image:var(--icon-user-16);mask-image:var(--icon-user-16);background-color:var(--icon-color,var(--color-user-plain-500,currentColor))}}.consul-exposed-path-list>ul>li>.detail .role::before,.consul-lock-session-list ul>li:not(:first-child)>.detail .role::before,.consul-upstream-instance-list li>.detail .role::before,.list-collection>ul>li:not(:first-child)>.detail .role::before{--icon-name:icon-user-plain;content:""}@-webkit-keyframes icon-user-team{100%{-webkit-mask-image:var(--icon-users-16);mask-image:var(--icon-users-16);background-color:var(--icon-color,var(--color-user-team-500,currentColor))}}@keyframes icon-user-team{100%{-webkit-mask-image:var(--icon-users-16);mask-image:var(--icon-users-16);background-color:var(--icon-color,var(--color-user-team-500,currentColor))}}#downstream-container .topology-metrics-card div .partition dt::before,#upstream-container .topology-metrics-card div .partition dt::before,.consul-bucket-list .partition::before,.consul-intention-list span[class|=partition]::before,.consul-upstream-instance-list dl.partition dt::before,.consul-upstream-list dl.partition dt::before,.type-source.popover-select li.partition button::before{--icon-name:icon-user-team;content:""}@-webkit-keyframes icon-alert-circle{100%{-webkit-mask-image:var(--icon-alert-circle-16);mask-image:var(--icon-alert-circle-16);background-color:var(--icon-color,var(--color-alert-circle-500,currentColor))}}@keyframes icon-alert-circle{100%{-webkit-mask-image:var(--icon-alert-circle-16);mask-image:var(--icon-alert-circle-16);background-color:var(--icon-color,var(--color-alert-circle-500,currentColor))}}@-webkit-keyframes icon-check{100%{-webkit-mask-image:var(--icon-check-16);mask-image:var(--icon-check-16);background-color:var(--icon-color,var(--color-check-500,currentColor))}}@keyframes icon-check{100%{-webkit-mask-image:var(--icon-check-16);mask-image:var(--icon-check-16);background-color:var(--icon-color,var(--color-check-500,currentColor))}}@-webkit-keyframes icon-check-circle{100%{-webkit-mask-image:var(--icon-check-circle-16);mask-image:var(--icon-check-circle-16);background-color:var(--icon-color,var(--color-check-circle-500,currentColor))}}@keyframes icon-check-circle{100%{-webkit-mask-image:var(--icon-check-circle-16);mask-image:var(--icon-check-circle-16);background-color:var(--icon-color,var(--color-check-circle-500,currentColor))}}@-webkit-keyframes icon-check-circle-fill{100%{-webkit-mask-image:var(--icon-check-circle-fill-16);mask-image:var(--icon-check-circle-fill-16);background-color:var(--icon-color,var(--color-check-circle-fill-500,currentColor))}}@keyframes icon-check-circle-fill{100%{-webkit-mask-image:var(--icon-check-circle-fill-16);mask-image:var(--icon-check-circle-fill-16);background-color:var(--icon-color,var(--color-check-circle-fill-500,currentColor))}}#downstream-container .topology-metrics-card div .passing::before,#upstream-container .topology-metrics-card div .passing::before,.consul-exposed-path-list>ul>li>.detail dl.passing dt::before,.consul-exposed-path-list>ul>li>.header .passing dd::before,.consul-exposed-path-list>ul>li>.header [rel=me] dd::before,.consul-health-check-list .passing.health-check-output::before,.consul-instance-checks.passing dt::before,.consul-lock-session-list ul>li:not(:first-child)>.detail dl.passing dt::before,.consul-lock-session-list ul>li:not(:first-child)>.header .passing dd::before,.consul-lock-session-list ul>li:not(:first-child)>.header [rel=me] dd::before,.consul-upstream-instance-list li>.detail dl.passing dt::before,.consul-upstream-instance-list li>.header .passing dd::before,.consul-upstream-instance-list li>.header [rel=me] dd::before,.list-collection>ul>li:not(:first-child)>.detail dl.passing dt::before,.list-collection>ul>li:not(:first-child)>.header .passing dd::before,.list-collection>ul>li:not(:first-child)>.header [rel=me] dd::before,.popover-select .value-passing button::before{--icon-name:icon-check-circle-fill;content:""}@-webkit-keyframes icon-chevron-left{100%{-webkit-mask-image:var(--icon-chevron-left-16);mask-image:var(--icon-chevron-left-16);background-color:var(--icon-color,var(--color-chevron-left-500,currentColor))}}@keyframes icon-chevron-left{100%{-webkit-mask-image:var(--icon-chevron-left-16);mask-image:var(--icon-chevron-left-16);background-color:var(--icon-color,var(--color-chevron-left-500,currentColor))}}.empty-state .back-link>::after,main header nav:first-child ol li:first-child a::before{--icon-name:icon-chevron-left;content:""}@-webkit-keyframes icon-chevron-right{100%{-webkit-mask-image:var(--icon-chevron-right-16);mask-image:var(--icon-chevron-right-16);background-color:var(--icon-color,var(--color-chevron-right-500,currentColor))}}@keyframes icon-chevron-right{100%{-webkit-mask-image:var(--icon-chevron-right-16);mask-image:var(--icon-chevron-right-16);background-color:var(--icon-color,var(--color-chevron-right-500,currentColor))}}#login-toggle+div footer button::after{--icon-name:icon-chevron-right;content:""}@-webkit-keyframes icon-chevron-up{100%{-webkit-mask-image:var(--icon-chevron-up-16);mask-image:var(--icon-chevron-up-16);background-color:var(--icon-color,var(--color-chevron-up-500,currentColor))}}@keyframes icon-chevron-up{100%{-webkit-mask-image:var(--icon-chevron-up-16);mask-image:var(--icon-chevron-up-16);background-color:var(--icon-color,var(--color-chevron-up-500,currentColor))}}.hashicorp-consul nav li.nspaces .disclosure-menu>button[aria-expanded=true]::after,.hashicorp-consul nav li.partitions .disclosure-menu>button[aria-expanded=true]::after,.list-collection>button::after,.more-popover-menu>[type=checkbox]:checked+label>::after,.popover-menu>[type=checkbox]:checked+label>::after,.topology-notices button[aria-expanded=true]::before,table.has-actions tr>.actions>[type=checkbox]:checked+label>::after,table.with-details tr>.actions>[type=checkbox]:checked+label>::after{--icon-name:icon-chevron-up;content:""}@-webkit-keyframes icon-delay{100%{-webkit-mask-image:var(--icon-delay-16);mask-image:var(--icon-delay-16);background-color:var(--icon-color,var(--color-delay-500,currentColor))}}@keyframes icon-delay{100%{-webkit-mask-image:var(--icon-delay-16);mask-image:var(--icon-delay-16);background-color:var(--icon-color,var(--color-delay-500,currentColor))}}.consul-exposed-path-list>ul>li>.detail dl.lock-delay dt::before,.consul-lock-session-list ul>li:not(:first-child)>.detail dl.lock-delay dt::before,.consul-upstream-instance-list li>.detail dl.lock-delay dt::before,.list-collection>ul>li:not(:first-child)>.detail dl.lock-delay dt::before{--icon-name:icon-delay;content:""}@-webkit-keyframes icon-docs-link{100%{-webkit-mask-image:var(--icon-docs-link-16);mask-image:var(--icon-docs-link-16);background-color:var(--icon-color,var(--color-docs-link-500,currentColor))}}@keyframes icon-docs-link{100%{-webkit-mask-image:var(--icon-docs-link-16);mask-image:var(--icon-docs-link-16);background-color:var(--icon-color,var(--color-docs-link-500,currentColor))}}@-webkit-keyframes icon-eye{100%{-webkit-mask-image:var(--icon-eye-16);mask-image:var(--icon-eye-16);background-color:var(--icon-color,var(--color-eye-500,currentColor))}}@keyframes icon-eye{100%{-webkit-mask-image:var(--icon-eye-16);mask-image:var(--icon-eye-16);background-color:var(--icon-color,var(--color-eye-500,currentColor))}}@-webkit-keyframes icon-eye-off{100%{-webkit-mask-image:var(--icon-eye-off-16);mask-image:var(--icon-eye-off-16);background-color:var(--icon-color,var(--color-eye-off-500,currentColor))}}@keyframes icon-eye-off{100%{-webkit-mask-image:var(--icon-eye-off-16);mask-image:var(--icon-eye-off-16);background-color:var(--icon-color,var(--color-eye-off-500,currentColor))}}@-webkit-keyframes icon-file-text{100%{-webkit-mask-image:var(--icon-file-text-16);mask-image:var(--icon-file-text-16);background-color:var(--icon-color,var(--color-file-text-500,currentColor))}}@keyframes icon-file-text{100%{-webkit-mask-image:var(--icon-file-text-16);mask-image:var(--icon-file-text-16);background-color:var(--icon-color,var(--color-file-text-500,currentColor))}}.consul-exposed-path-list>ul>li>.detail .policy::before,.consul-lock-session-list ul>li:not(:first-child)>.detail .policy::before,.consul-upstream-instance-list li>.detail .policy::before,.list-collection>ul>li:not(:first-child)>.detail .policy::before{--icon-name:icon-file-text;content:""}@-webkit-keyframes icon-gateway{100%{-webkit-mask-image:var(--icon-gateway-16);mask-image:var(--icon-gateway-16);background-color:var(--icon-color,var(--color-gateway-500,currentColor))}}@keyframes icon-gateway{100%{-webkit-mask-image:var(--icon-gateway-16);mask-image:var(--icon-gateway-16);background-color:var(--icon-color,var(--color-gateway-500,currentColor))}}.consul-kind::before{--icon-name:icon-gateway;content:""}@-webkit-keyframes icon-git-commit{100%{-webkit-mask-image:var(--icon-git-commit-16);mask-image:var(--icon-git-commit-16);background-color:var(--icon-color,var(--color-git-commit-500,currentColor))}}@keyframes icon-git-commit{100%{-webkit-mask-image:var(--icon-git-commit-16);mask-image:var(--icon-git-commit-16);background-color:var(--icon-color,var(--color-git-commit-500,currentColor))}}.consul-exposed-path-list>ul>li>.detail dl.node dt::before,.consul-lock-session-list ul>li:not(:first-child)>.detail dl.node dt::before,.consul-upstream-instance-list li>.detail dl.node dt::before,.list-collection>ul>li:not(:first-child)>.detail dl.node dt::before{--icon-name:icon-git-commit;content:""}@-webkit-keyframes icon-hexagon{100%{-webkit-mask-image:var(--icon-hexagon-16);mask-image:var(--icon-hexagon-16);background-color:var(--icon-color,var(--color-hexagon-500,currentColor))}}@keyframes icon-hexagon{100%{-webkit-mask-image:var(--icon-hexagon-16);mask-image:var(--icon-hexagon-16);background-color:var(--icon-color,var(--color-hexagon-500,currentColor))}}@-webkit-keyframes icon-history{100%{-webkit-mask-image:var(--icon-history-16);mask-image:var(--icon-history-16);background-color:var(--icon-color,var(--color-history-500,currentColor))}}@keyframes icon-history{100%{-webkit-mask-image:var(--icon-history-16);mask-image:var(--icon-history-16);background-color:var(--icon-color,var(--color-history-500,currentColor))}}.consul-exposed-path-list>ul>li>.detail dl.ttl dt::before,.consul-lock-session-list ul>li:not(:first-child)>.detail dl.ttl dt::before,.consul-upstream-instance-list li>.detail dl.ttl dt::before,.list-collection>ul>li:not(:first-child)>.detail dl.ttl dt::before{--icon-name:icon-history;content:""}@-webkit-keyframes icon-info{100%{-webkit-mask-image:var(--icon-info-16);mask-image:var(--icon-info-16);background-color:var(--icon-color,var(--color-info-500,currentColor))}}@keyframes icon-info{100%{-webkit-mask-image:var(--icon-info-16);mask-image:var(--icon-info-16);background-color:var(--icon-color,var(--color-info-500,currentColor))}}@-webkit-keyframes icon-layers{100%{-webkit-mask-image:var(--icon-layers-16);mask-image:var(--icon-layers-16);background-color:var(--icon-color,var(--color-layers-500,currentColor))}}@keyframes icon-layers{100%{-webkit-mask-image:var(--icon-layers-16);mask-image:var(--icon-layers-16);background-color:var(--icon-color,var(--color-layers-500,currentColor))}}.topology-metrics-popover.l7 .tippy-arrow::after,.topology-metrics-popover.l7>button::before{--icon-name:icon-layers;content:"";--icon-color:var(--token-color-palette-neutral-300)}@keyframes icon-loading{100%{-webkit-mask-image:var(--icon-loading-16);mask-image:var(--icon-loading-16);background-color:var(--icon-color,var(--color-loading-500,currentColor))}}@-webkit-keyframes icon-network-alt{100%{-webkit-mask-image:var(--icon-network-alt-16);mask-image:var(--icon-network-alt-16);background-color:var(--icon-color,var(--color-network-alt-500,currentColor))}}@keyframes icon-network-alt{100%{-webkit-mask-image:var(--icon-network-alt-16);mask-image:var(--icon-network-alt-16);background-color:var(--icon-color,var(--color-network-alt-500,currentColor))}}.consul-bucket-list .peer::before{--icon-name:icon-network-alt;content:""}@-webkit-keyframes icon-path{100%{-webkit-mask-image:var(--icon-path-16);mask-image:var(--icon-path-16);background-color:var(--icon-color,var(--color-path-500,currentColor))}}@keyframes icon-path{100%{-webkit-mask-image:var(--icon-path-16);mask-image:var(--icon-path-16);background-color:var(--icon-color,var(--color-path-500,currentColor))}}.consul-exposed-path-list>ul>li>.detail dl.path dt::before,.consul-lock-session-list ul>li:not(:first-child)>.detail dl.path dt::before,.consul-upstream-instance-list li>.detail dl.path dt::before,.list-collection>ul>li:not(:first-child)>.detail dl.path dt::before{--icon-name:icon-path;content:""}@-webkit-keyframes icon-running{100%{-webkit-mask-image:var(--icon-running-16);mask-image:var(--icon-running-16);background-color:var(--icon-color,var(--color-running-500,currentColor))}}@keyframes icon-running{100%{-webkit-mask-image:var(--icon-running-16);mask-image:var(--icon-running-16);background-color:var(--icon-color,var(--color-running-500,currentColor))}}@-webkit-keyframes icon-skip{100%{-webkit-mask-image:var(--icon-skip-16);mask-image:var(--icon-skip-16);background-color:var(--icon-color,var(--color-skip-500,currentColor))}}@keyframes icon-skip{100%{-webkit-mask-image:var(--icon-skip-16);mask-image:var(--icon-skip-16);background-color:var(--icon-color,var(--color-skip-500,currentColor))}}@-webkit-keyframes icon-socket{100%{-webkit-mask-image:var(--icon-socket-16);mask-image:var(--icon-socket-16);background-color:var(--icon-color,var(--color-socket-500,currentColor))}}@keyframes icon-socket{100%{-webkit-mask-image:var(--icon-socket-16);mask-image:var(--icon-socket-16);background-color:var(--icon-color,var(--color-socket-500,currentColor))}}.consul-exposed-path-list>ul>li>.detail dl.socket dt::before,.consul-lock-session-list ul>li:not(:first-child)>.detail dl.socket dt::before,.consul-upstream-instance-list li>.detail dl.socket dt::before,.list-collection>ul>li:not(:first-child)>.detail dl.socket dt::before{--icon-name:icon-socket;content:""}@-webkit-keyframes icon-star-circle{100%{-webkit-mask-image:var(--icon-star-circle-16);mask-image:var(--icon-star-circle-16);background-color:var(--icon-color,var(--color-star-circle-500,currentColor))}}@keyframes icon-star-circle{100%{-webkit-mask-image:var(--icon-star-circle-16);mask-image:var(--icon-star-circle-16);background-color:var(--icon-color,var(--color-star-circle-500,currentColor))}}@-webkit-keyframes icon-star-fill{100%{-webkit-mask-image:var(--icon-star-fill-16);mask-image:var(--icon-star-fill-16);background-color:var(--icon-color,var(--color-star-fill-500,currentColor))}}@keyframes icon-star-fill{100%{-webkit-mask-image:var(--icon-star-fill-16);mask-image:var(--icon-star-fill-16);background-color:var(--icon-color,var(--color-star-fill-500,currentColor))}}.consul-exposed-path-list>ul>li>.detail .policy-management::before,.consul-exposed-path-list>ul>li>.header .policy-management dd::before,.consul-lock-session-list ul>li:not(:first-child)>.detail .policy-management::before,.consul-lock-session-list ul>li:not(:first-child)>.header .policy-management dd::before,.consul-upstream-instance-list li>.detail .policy-management::before,.consul-upstream-instance-list li>.header .policy-management dd::before,.list-collection>ul>li:not(:first-child)>.detail .policy-management::before,.list-collection>ul>li:not(:first-child)>.header .policy-management dd::before{--icon-name:icon-star-fill;content:"";--icon-color:var(--token-color-consul-brand)}@-webkit-keyframes icon-tag{100%{-webkit-mask-image:var(--icon-tag-16);mask-image:var(--icon-tag-16);background-color:var(--icon-color,var(--color-tag-500,currentColor))}}@keyframes icon-tag{100%{-webkit-mask-image:var(--icon-tag-16);mask-image:var(--icon-tag-16);background-color:var(--icon-color,var(--color-tag-500,currentColor))}}.tag-list dt::before,td.tags dt::before{--icon-name:icon-tag;content:""}@-webkit-keyframes icon-x{100%{-webkit-mask-image:var(--icon-x-16);mask-image:var(--icon-x-16);background-color:var(--icon-color,var(--color-x-500,currentColor))}}@keyframes icon-x{100%{-webkit-mask-image:var(--icon-x-16);mask-image:var(--icon-x-16);background-color:var(--icon-color,var(--color-x-500,currentColor))}}@-webkit-keyframes icon-x-circle{100%{-webkit-mask-image:var(--icon-x-circle-16);mask-image:var(--icon-x-circle-16);background-color:var(--icon-color,var(--color-x-circle-500,currentColor))}}@keyframes icon-x-circle{100%{-webkit-mask-image:var(--icon-x-circle-16);mask-image:var(--icon-x-circle-16);background-color:var(--icon-color,var(--color-x-circle-500,currentColor))}}@-webkit-keyframes icon-x-square{100%{-webkit-mask-image:var(--icon-x-square-16);mask-image:var(--icon-x-square-16);background-color:var(--icon-color,var(--color-x-square-500,currentColor))}}@keyframes icon-x-square{100%{-webkit-mask-image:var(--icon-x-square-16);mask-image:var(--icon-x-square-16);background-color:var(--icon-color,var(--color-x-square-500,currentColor))}}@-webkit-keyframes icon-cloud-cross{100%{-webkit-mask-image:var(--icon-cloud-cross-16);mask-image:var(--icon-cloud-cross-16);background-color:var(--icon-color,var(--color-cloud-cross-500,currentColor))}}@keyframes icon-cloud-cross{100%{-webkit-mask-image:var(--icon-cloud-cross-16);mask-image:var(--icon-cloud-cross-16);background-color:var(--icon-color,var(--color-cloud-cross-500,currentColor))}}@-webkit-keyframes icon-loading-motion{100%{-webkit-mask-image:var(--icon-loading-motion-16);mask-image:var(--icon-loading-motion-16);background-color:var(--icon-color,var(--color-loading-motion-500,currentColor))}}@keyframes icon-loading-motion{100%{-webkit-mask-image:var(--icon-loading-motion-16);mask-image:var(--icon-loading-motion-16);background-color:var(--icon-color,var(--color-loading-motion-500,currentColor))}}@-webkit-keyframes icon-logo-auth0-color{100%{background-image:var(--icon-auth0-color-16)}}@keyframes icon-logo-auth0-color{100%{background-image:var(--icon-auth0-color-16)}}.oidc-select .auth0-oidc-provider::before{--icon-name:icon-logo-auth0-color;content:""}@-webkit-keyframes icon-logo-ember-circle-color{100%{background-image:var(--icon-logo-ember-circle-color-16)}}@keyframes icon-logo-ember-circle-color{100%{background-image:var(--icon-logo-ember-circle-color-16)}}@-webkit-keyframes icon-logo-glimmer-color{100%{background-image:var(--icon-logo-glimmer-color-16)}}@keyframes icon-logo-glimmer-color{100%{background-image:var(--icon-logo-glimmer-color-16)}}@-webkit-keyframes icon-logo-jwt-color{100%{background-image:var(--icon-logo-jwt-color-16)}}@keyframes icon-logo-jwt-color{100%{background-image:var(--icon-logo-jwt-color-16)}}.consul-external-source.jwt::before,.consul-health-check-list .health-check-output dd em.jwt::before,.consul-intention-list td strong.jwt::before,.consul-intention-permission-list strong.jwt::before,.consul-intention-search-bar li button span.jwt::before,.consul-peer-search-bar li button span.jwt::before,.consul-server-card .health-status+dd.jwt::before,.discovery-chain .route-card>header ul li.jwt::before,.hashicorp-consul nav .dcs .dc-name span.jwt::before,.hashicorp-consul nav .dcs li.is-local span.jwt::before,.hashicorp-consul nav .dcs li.is-primary span.jwt::before,.jwt.consul-auth-method-type::before,.jwt.consul-kind::before,.jwt.consul-source::before,.jwt.consul-transparent-proxy::before,.jwt.leader::before,.jwt.topology-metrics-source-type::before,.popover-select .jwt button::before,.search-bar-status li.jwt:not(.remove-all)::before,html[data-route^="dc.acls.index"] main td strong.jwt::before,section[data-route="dc.show.serverstatus"] .redundancy-zones section header dl.jwt::before,section[data-route="dc.show.serverstatus"] .server-failure-tolerance header em.jwt::before,span.jwt.policy-node-identity::before,span.jwt.policy-service-identity::before{--icon-name:icon-logo-jwt-color;content:""}@-webkit-keyframes icon-logo-microsoft-color{100%{background-image:var(--icon-microsoft-color-16)}}@keyframes icon-logo-microsoft-color{100%{background-image:var(--icon-microsoft-color-16)}}.oidc-select .microsoft-oidc-provider::before{--icon-name:icon-logo-microsoft-color;content:""}@-webkit-keyframes icon-logo-oidc-color{100%{background-image:var(--icon-logo-oidc-color-16)}}@keyframes icon-logo-oidc-color{100%{background-image:var(--icon-logo-oidc-color-16)}}.consul-external-source.oidc::before,.consul-health-check-list .health-check-output dd em.oidc::before,.consul-intention-list td strong.oidc::before,.consul-intention-permission-list strong.oidc::before,.consul-intention-search-bar li button span.oidc::before,.consul-peer-search-bar li button span.oidc::before,.consul-server-card .health-status+dd.oidc::before,.discovery-chain .route-card>header ul li.oidc::before,.hashicorp-consul nav .dcs .dc-name span.oidc::before,.hashicorp-consul nav .dcs li.is-local span.oidc::before,.hashicorp-consul nav .dcs li.is-primary span.oidc::before,.oidc.consul-auth-method-type::before,.oidc.consul-kind::before,.oidc.consul-source::before,.oidc.consul-transparent-proxy::before,.oidc.leader::before,.oidc.topology-metrics-source-type::before,.popover-select .oidc button::before,.search-bar-status li.oidc:not(.remove-all)::before,html[data-route^="dc.acls.index"] main td strong.oidc::before,section[data-route="dc.show.serverstatus"] .redundancy-zones section header dl.oidc::before,section[data-route="dc.show.serverstatus"] .server-failure-tolerance header em.oidc::before,span.oidc.policy-node-identity::before,span.oidc.policy-service-identity::before{--icon-name:icon-logo-oidc-color;content:""}@-webkit-keyframes icon-logo-okta-color{100%{background-image:var(--icon-okta-color-16)}}@keyframes icon-logo-okta-color{100%{background-image:var(--icon-okta-color-16)}}.oidc-select .okta-oidc-provider::before{--icon-name:icon-logo-okta-color;content:""}@-webkit-keyframes icon-mesh{100%{-webkit-mask-image:var(--icon-mesh-16);mask-image:var(--icon-mesh-16);background-color:var(--icon-color,var(--color-mesh-500,currentColor))}}@keyframes icon-mesh{100%{-webkit-mask-image:var(--icon-mesh-16);mask-image:var(--icon-mesh-16);background-color:var(--icon-color,var(--color-mesh-500,currentColor))}}.consul-exposed-path-list>ul>li>.detail dl.mesh dt::before,.consul-lock-session-list ul>li:not(:first-child)>.detail dl.mesh dt::before,.consul-upstream-instance-list li>.detail dl.mesh dt::before,.list-collection>ul>li:not(:first-child)>.detail dl.mesh dt::before{--icon-name:icon-mesh;content:""}@-webkit-keyframes icon-port{100%{-webkit-mask-image:var(--icon-port-16);mask-image:var(--icon-port-16);background-color:var(--icon-color,var(--color-port-500,currentColor))}}@keyframes icon-port{100%{-webkit-mask-image:var(--icon-port-16);mask-image:var(--icon-port-16);background-color:var(--icon-color,var(--color-port-500,currentColor))}}.consul-exposed-path-list>ul>li>.detail dl.port dt::before,.consul-lock-session-list ul>li:not(:first-child)>.detail dl.port dt::before,.consul-upstream-instance-list li>.detail dl.port dt::before,.list-collection>ul>li:not(:first-child)>.detail dl.port dt::before{--icon-name:icon-port;content:""}@-webkit-keyframes icon-protocol{100%{-webkit-mask-image:var(--icon-protocol-16);mask-image:var(--icon-protocol-16);background-color:var(--icon-color,var(--color-protocol-500,currentColor))}}@keyframes icon-protocol{100%{-webkit-mask-image:var(--icon-protocol-16);mask-image:var(--icon-protocol-16);background-color:var(--icon-color,var(--color-protocol-500,currentColor))}}.consul-exposed-path-list>ul>li>.detail dl.protocol dt::before,.consul-lock-session-list ul>li:not(:first-child)>.detail dl.protocol dt::before,.consul-upstream-instance-list li>.detail dl.protocol dt::before,.list-collection>ul>li:not(:first-child)>.detail dl.protocol dt::before{--icon-name:icon-protocol;content:""}@-webkit-keyframes icon-redirect{100%{-webkit-mask-image:var(--icon-redirect-16);mask-image:var(--icon-redirect-16);background-color:var(--icon-color,var(--color-redirect-500,currentColor))}}@keyframes icon-redirect{100%{-webkit-mask-image:var(--icon-redirect-16);mask-image:var(--icon-redirect-16);background-color:var(--icon-color,var(--color-redirect-500,currentColor))}}@-webkit-keyframes icon-search-color{100%{background-image:var(--icon-search-color-16)}}@keyframes icon-search-color{100%{background-image:var(--icon-search-color-16)}}[for=toolbar-toggle]{--icon-name:icon-search-color;content:""}@-webkit-keyframes icon-sort{100%{-webkit-mask-image:var(--icon-sort-desc-16);mask-image:var(--icon-sort-desc-16);background-color:var(--icon-color,var(--color-sort-500,currentColor))}}@keyframes icon-sort{100%{-webkit-mask-image:var(--icon-sort-desc-16);mask-image:var(--icon-sort-desc-16);background-color:var(--icon-color,var(--color-sort-500,currentColor))}}.type-sort.popover-select label>::before{--icon-name:icon-sort;content:""}@-webkit-keyframes icon-union{100%{-webkit-mask-image:var(--icon-union-16);mask-image:var(--icon-union-16);background-color:var(--icon-color,var(--color-union-500,currentColor))}}@keyframes icon-union{100%{-webkit-mask-image:var(--icon-union-16);mask-image:var(--icon-union-16);background-color:var(--icon-color,var(--color-union-500,currentColor))}}#downstream-container .topology-metrics-card .details .group span::before,#upstream-container .topology-metrics-card .details .group span::before{--icon-name:icon-union;content:""}.ember-basic-dropdown{position:relative}.ember-basic-dropdown,.ember-basic-dropdown-content,.ember-basic-dropdown-content *{box-sizing:border-box}.ember-basic-dropdown-content{position:absolute;width:auto;z-index:1000;background-color:#fff}.ember-basic-dropdown-content--left{left:0}.ember-basic-dropdown-content--right{right:0}.ember-basic-dropdown-overlay{position:fixed;background:rgba(0,0,0,.5);width:100%;height:100%;z-index:10;top:0;left:0;pointer-events:none}.ember-basic-dropdown-content-wormhole-origin{display:inline}.ember-power-select-dropdown *{box-sizing:border-box}.ember-power-select-trigger{position:relative;border-radius:4px;background-color:#fff;line-height:1.75;overflow-x:hidden;text-overflow:ellipsis;min-height:1.75em;-moz-user-select:none;user-select:none;-webkit-user-select:none;color:inherit}.ember-power-select-trigger:after{content:"";display:table;clear:both}.ember-power-select-trigger--active,.ember-power-select-trigger:focus{box-shadow:none}.ember-basic-dropdown-trigger--below.ember-power-select-trigger[aria-expanded=true],.ember-basic-dropdown-trigger--in-place.ember-power-select-trigger[aria-expanded=true]{border-bottom-left-radius:0;border-bottom-right-radius:0}.ember-basic-dropdown-trigger--above.ember-power-select-trigger[aria-expanded=true]{border-top-left-radius:0;border-top-right-radius:0}.ember-power-select-placeholder{color:#999;display:block;overflow-x:hidden;white-space:nowrap;text-overflow:ellipsis}.ember-power-select-status-icon{position:absolute;display:inline-block;width:0;height:0;top:0;bottom:0;margin:auto;border-style:solid;border-width:7px 4px 0;border-color:#aaa transparent transparent;right:5px}.ember-basic-dropdown-trigger[aria-expanded=true] .ember-power-select-status-icon{transform:rotate(180deg)}.ember-power-select-clear-btn{position:absolute;cursor:pointer;right:25px}.ember-power-select-trigger-multiple-input{font-family:inherit;font-size:inherit;border:none;display:inline-block;line-height:inherit;-webkit-appearance:none;outline:0;padding:0;float:left;background-color:transparent;text-indent:2px}.ember-power-select-trigger-multiple-input:disabled{background-color:#eee}.ember-power-select-trigger-multiple-input::placeholder{opacity:1;color:#999}.ember-power-select-trigger-multiple-input::-webkit-input-placeholder{opacity:1;color:#999}.ember-power-select-trigger-multiple-input::-moz-placeholder{opacity:1;color:#999}.ember-power-select-trigger-multiple-input::-ms-input-placeholder{opacity:1;color:#999}.active.discovery-chain [id*=":"],.discovery-chain path,.ember-power-select-multiple-remove-btn:not(:hover){opacity:.5}.ember-power-select-multiple-options{padding:0;margin:0}.ember-power-select-multiple-option{border:1px solid gray;border-radius:4px;color:#333;background-color:#e4e4e4;padding:0 4px;display:inline-block;line-height:1.45;float:left;margin:2px 0 2px 3px}.ember-power-select-multiple-remove-btn{cursor:pointer}.ember-power-select-search{padding:4px}.ember-power-select-search-input{border:1px solid #aaa;border-radius:0;width:100%;font-size:inherit;line-height:inherit;padding:0 5px}.ember-power-select-search-input:focus{border:1px solid #aaa;box-shadow:none}.ember-power-select-dropdown{border-left:1px solid #aaa;border-right:1px solid #aaa;line-height:1.75;border-radius:4px;box-shadow:none;overflow:hidden;color:inherit}.ember-power-select-dropdown.ember-basic-dropdown-content--above{border-top:1px solid #aaa;border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0}.ember-power-select-dropdown.ember-basic-dropdown-content--below,.ember-power-select-dropdown.ember-basic-dropdown-content--in-place{border-top:none;border-bottom:1px solid #aaa;border-top-left-radius:0;border-top-right-radius:0}.ember-power-select-dropdown.ember-basic-dropdown-content--in-place{width:100%}.ember-power-select-options{list-style:none;margin:0;padding:0;-moz-user-select:none;user-select:none;-webkit-user-select:none}.ember-power-select-placeholder,.ember-power-select-selected-item,a[rel*=external]::after{margin-left:8px}.ember-power-select-options[role=listbox]{overflow-y:auto;-webkit-overflow-scrolling:touch;max-height:12.25em}.ember-power-select-option{cursor:pointer;padding:0 8px}.ember-power-select-group[aria-disabled=true]{color:#999;cursor:not-allowed}.ember-power-select-group[aria-disabled=true] .ember-power-select-option,.ember-power-select-option[aria-disabled=true]{color:#999;pointer-events:none;cursor:not-allowed}.ember-power-select-option[aria-selected=true]{background-color:#ddd}.ember-power-select-option[aria-current=true]{background-color:#5897fb;color:#fff}.ember-power-select-group-name{cursor:default;font-weight:700}.ember-power-select-trigger[aria-disabled=true]{background-color:#eee}.ember-power-select-trigger{padding:0 16px 0 0}.ember-power-select-group .ember-power-select-group .ember-power-select-group-name{padding-left:24px}.ember-power-select-group .ember-power-select-group .ember-power-select-option{padding-left:40px}.ember-power-select-group .ember-power-select-option{padding-left:24px}.ember-power-select-group .ember-power-select-group-name{padding-left:8px}.ember-power-select-trigger[dir=rtl]{padding:0 0 0 16px}.ember-power-select-trigger[dir=rtl] .ember-power-select-placeholder,.ember-power-select-trigger[dir=rtl] .ember-power-select-selected-item{margin-right:8px}.ember-power-select-trigger[dir=rtl] .ember-power-select-multiple-option,.ember-power-select-trigger[dir=rtl] .ember-power-select-trigger-multiple-input{float:right}.ember-power-select-trigger[dir=rtl] .ember-power-select-status-icon{left:5px;right:initial}.ember-power-select-trigger[dir=rtl] .ember-power-select-clear-btn{left:25px;right:initial}.ember-power-select-dropdown[dir=rtl] .ember-power-select-group .ember-power-select-group .ember-power-select-group-name{padding-right:24px}.ember-power-select-dropdown[dir=rtl] .ember-power-select-group .ember-power-select-group .ember-power-select-option{padding-right:40px}.ember-power-select-dropdown[dir=rtl] .ember-power-select-group .ember-power-select-option{padding-right:24px}.ember-power-select-dropdown[dir=rtl] .ember-power-select-group .ember-power-select-group-name{padding-right:8px}#login-toggle+div footer button:focus,#login-toggle+div footer button:hover,.consul-intention-fieldsets .permissions>button:focus,.consul-intention-fieldsets .permissions>button:hover,.empty-state>ul>li>:focus,.empty-state>ul>li>:hover,.empty-state>ul>li>label>button:focus,.empty-state>ul>li>label>button:hover,.modal-dialog [role=document] dd a:focus,.modal-dialog [role=document] dd a:hover,.modal-dialog [role=document] p a:focus,.modal-dialog [role=document] p a:hover,.oidc-select button.reset:focus,.oidc-select button.reset:hover,.search-bar-status .remove-all button:focus,.search-bar-status .remove-all button:hover,main dd a:focus,main dd a:hover,main p a:focus,main p a:hover{text-decoration:underline}#login-toggle+div footer button,.consul-intention-fieldsets .permissions>button,.empty-state>ul>li>*,.empty-state>ul>li>:active,.empty-state>ul>li>:focus,.empty-state>ul>li>:hover,.empty-state>ul>li>label>button,.empty-state>ul>li>label>button:active,.empty-state>ul>li>label>button:focus,.empty-state>ul>li>label>button:hover,.modal-dialog [role=document] dd a,.modal-dialog [role=document] p a,.oidc-select button.reset,.search-bar-status .remove-all button,main dd a,main dd a:active,main dd a:focus,main dd a:hover,main p a,main p a:active,main p a:focus,main p a:hover{color:var(--token-color-foreground-action)}.modal-dialog [role=document] label a[rel*=help],div.with-confirmation p,main label a[rel*=help]{color:var(--token-color-foreground-disabled)}#login-toggle+div footer button,.consul-intention-fieldsets .permissions>button,.empty-state>ul>li>*,.empty-state>ul>li>label>button,.modal-dialog [role=document] dd a,.modal-dialog [role=document] p a,.oidc-select button.reset,.search-bar-status .remove-all button,main dd a,main p a{cursor:pointer;background-color:transparent}#login-toggle+div footer button:active,.consul-intention-fieldsets .permissions>button:active,.empty-state>ul>li>:active,.empty-state>ul>li>label>button:active,.modal-dialog [role=document] dd a:active,.modal-dialog [role=document] p a:active,.oidc-select button.reset:active,.search-bar-status .remove-all button:active,main dd a:active,main p a:active{outline:0}.modal-dialog [role=document] a[rel*=help]::after,main a[rel*=help]::after{opacity:.4}.modal-dialog [role=document] h2 a,main h2 a{color:var(--token-color-foreground-strong)}.modal-dialog [role=document] h2 a[rel*=help]::after,main h2 a[rel*=help]::after{font-size:.65em;margin-top:.2em;margin-left:.2em}.tab-section>p:only-child [rel*=help]::after{content:none}.auth-form{width:320px;margin:-20px 25px 0}.auth-form em{color:var(--token-color-foreground-faint);font-style:normal;display:inline-block;margin-top:1em}.auth-form .oidc-select,.auth-form form{padding-top:1em}.auth-form form{margin-bottom:0!important}.auth-form .ember-basic-dropdown-trigger,.auth-form button:not(.reset){width:100%}.auth-form .progress{margin:0 auto}#login-toggle+div footer button::after{font-size:120%;position:relative;top:-1px;left:-3px}#login-toggle+div footer{border-top:0;background-color:transparent;padding:10px 42px 20px}#login-toggle+div>div>div>div{padding-bottom:0}.auth-profile{padding:.9em 1em}.auth-profile dt span{font-weight:var(--typo-weight-normal)}.auth-profile dt{font-weight:var(--typo-weight-bold)}.auth-profile dd,.auth-profile dt{color:var(--token-color-paletter-neutral-300)}.auth-profile dt span,.empty-state,main header nav:first-child ol li a,main header nav:first-child ol li:not(:first-child) a::before{color:var(--token-color-foreground-faint)}main header nav:first-child ol li a{text-decoration:none}main header nav:first-child ol li a:hover{color:var(--token-color-foreground-action);text-decoration:underline}main header nav:first-child ol li a::before{text-decoration:none}main header nav:first-child ol{display:grid;grid-auto-flow:column;white-space:nowrap;overflow:hidden}main header nav:first-child ol>li{list-style-type:none;display:inline-flex;overflow:hidden}main header nav:first-child ol li:first-child a::before{background-color:var(--token-color-foreground-faint);margin-right:4px;display:inline-block}main header nav:first-child ol li:not(:first-child) a{margin-left:6px;overflow:hidden;text-overflow:ellipsis}main header nav:first-child ol li:not(:first-child) a::before{content:"/";margin-right:8px;display:inline-block}main header nav:first-child{position:absolute;top:12px}.consul-intention-action-warn-modal button.dangerous,.copy-button button,.disclosure-menu [aria-expanded]~*>ul>[role=treeitem],.disclosure-menu [aria-expanded]~*>ul>li>[role=menuitem],.disclosure-menu [aria-expanded]~*>ul>li>[role=option],.hashicorp-consul nav li.nspaces .disclosure-menu>button,.hashicorp-consul nav li.partitions .disclosure-menu>button,.informed-action>ul>li>*,.menu-panel>ul>[role=treeitem],.menu-panel>ul>li>[role=menuitem],.menu-panel>ul>li>[role=option],.more-popover-menu>[type=checkbox]+label+div>ul>[role=treeitem],.more-popover-menu>[type=checkbox]+label+div>ul>li>[role=menuitem],.more-popover-menu>[type=checkbox]+label+div>ul>li>[role=option],.popover-menu>[type=checkbox]+label+div>ul>[role=treeitem],.popover-menu>[type=checkbox]+label+div>ul>li>[role=menuitem],.popover-menu>[type=checkbox]+label+div>ul>li>[role=option],.popover-select label>*,.topology-notices button,.type-sort.popover-select label>*,table.has-actions tr>.actions>[type=checkbox]+label+div>ul>[role=treeitem],table.has-actions tr>.actions>[type=checkbox]+label+div>ul>li>[role=menuitem],table.has-actions tr>.actions>[type=checkbox]+label+div>ul>li>[role=option],table.with-details tr>.actions>[type=checkbox]+label+div>ul>[role=treeitem],table.with-details tr>.actions>[type=checkbox]+label+div>ul>li>[role=menuitem],table.with-details tr>.actions>[type=checkbox]+label+div>ul>li>[role=option]{cursor:pointer;white-space:nowrap;text-decoration:none}.consul-intention-action-warn-modal button.dangerous:disabled,.copy-button button:disabled,.disclosure-menu [aria-expanded]~*>ul>[role=treeitem]:disabled,.disclosure-menu [aria-expanded]~*>ul>li>[role=menuitem]:disabled,.disclosure-menu [aria-expanded]~*>ul>li>[role=option]:disabled,.hashicorp-consul nav li.nspaces .disclosure-menu>button:disabled,.hashicorp-consul nav li.partitions .disclosure-menu>button:disabled,.informed-action>ul>li>:disabled,.menu-panel>ul>[role=treeitem]:disabled,.menu-panel>ul>li>[role=menuitem]:disabled,.menu-panel>ul>li>[role=option]:disabled,.more-popover-menu>[type=checkbox]+label+div>ul>[role=treeitem]:disabled,.more-popover-menu>[type=checkbox]+label+div>ul>li>[role=menuitem]:disabled,.more-popover-menu>[type=checkbox]+label+div>ul>li>[role=option]:disabled,.popover-menu>[type=checkbox]+label+div>ul>[role=treeitem]:disabled,.popover-menu>[type=checkbox]+label+div>ul>li>[role=menuitem]:disabled,.popover-menu>[type=checkbox]+label+div>ul>li>[role=option]:disabled,.popover-select label>:disabled,.topology-notices button:disabled,table.has-actions tr>.actions>[type=checkbox]+label+div>ul>[role=treeitem]:disabled,table.has-actions tr>.actions>[type=checkbox]+label+div>ul>li>[role=menuitem]:disabled,table.has-actions tr>.actions>[type=checkbox]+label+div>ul>li>[role=option]:disabled,table.with-details tr>.actions>[type=checkbox]+label+div>ul>[role=treeitem]:disabled,table.with-details tr>.actions>[type=checkbox]+label+div>ul>li>[role=menuitem]:disabled,table.with-details tr>.actions>[type=checkbox]+label+div>ul>li>[role=option]:disabled{cursor:default;box-shadow:none}.checkbox-group label,.more-popover-menu>[type=checkbox]~label,.popover-menu>[type=checkbox]~label,html[data-route^="dc.acls.index"] .filter-bar [role=radiogroup] label,table.has-actions tr>.actions>[type=checkbox]~label,table.with-details tr>.actions>[type=checkbox]~label{cursor:pointer}.consul-intention-action-warn-modal button.dangerous{border-width:1px;border-radius:var(--decor-radius-100);box-shadow:var(--token-elevation-high-box-shadow)}.disclosure-menu [aria-expanded]~*>ul>[role=treeitem],.disclosure-menu [aria-expanded]~*>ul>li>[role=menuitem],.disclosure-menu [aria-expanded]~*>ul>li>[role=option],.hashicorp-consul nav li.nspaces .disclosure-menu>button,.hashicorp-consul nav li.partitions .disclosure-menu>button,.informed-action>ul>li>*,.menu-panel>ul>[role=treeitem],.menu-panel>ul>li>[role=menuitem],.menu-panel>ul>li>[role=option],.more-popover-menu>[type=checkbox]+label+div>ul>[role=treeitem],.more-popover-menu>[type=checkbox]+label+div>ul>li>[role=menuitem],.more-popover-menu>[type=checkbox]+label+div>ul>li>[role=option],.popover-menu>[type=checkbox]+label+div>ul>[role=treeitem],.popover-menu>[type=checkbox]+label+div>ul>li>[role=menuitem],.popover-menu>[type=checkbox]+label+div>ul>li>[role=option],table.has-actions tr>.actions>[type=checkbox]+label+div>ul>[role=treeitem],table.has-actions tr>.actions>[type=checkbox]+label+div>ul>li>[role=menuitem],table.has-actions tr>.actions>[type=checkbox]+label+div>ul>li>[role=option],table.with-details tr>.actions>[type=checkbox]+label+div>ul>[role=treeitem],table.with-details tr>.actions>[type=checkbox]+label+div>ul>li>[role=menuitem],table.with-details tr>.actions>[type=checkbox]+label+div>ul>li>[role=option]{color:var(--token-color-foreground-strong);background-color:var(--token-color-surface-primary)}.disclosure-menu [aria-expanded]~*>ul>[role=treeitem]:focus,.disclosure-menu [aria-expanded]~*>ul>[role=treeitem]:hover,.disclosure-menu [aria-expanded]~*>ul>li>[role=menuitem]:focus,.disclosure-menu [aria-expanded]~*>ul>li>[role=menuitem]:hover,.disclosure-menu [aria-expanded]~*>ul>li>[role=option]:focus,.disclosure-menu [aria-expanded]~*>ul>li>[role=option]:hover,.hashicorp-consul nav li.nspaces .disclosure-menu>button:focus,.hashicorp-consul nav li.nspaces .disclosure-menu>button:hover,.hashicorp-consul nav li.partitions .disclosure-menu>button:focus,.hashicorp-consul nav li.partitions .disclosure-menu>button:hover,.informed-action>ul>li>:focus,.informed-action>ul>li>:hover,.menu-panel>ul>[role=treeitem]:focus,.menu-panel>ul>[role=treeitem]:hover,.menu-panel>ul>li>[role=menuitem]:focus,.menu-panel>ul>li>[role=menuitem]:hover,.menu-panel>ul>li>[role=option]:focus,.menu-panel>ul>li>[role=option]:hover,.more-popover-menu>[type=checkbox]+label+div>ul>[role=treeitem]:focus,.more-popover-menu>[type=checkbox]+label+div>ul>[role=treeitem]:hover,.more-popover-menu>[type=checkbox]+label+div>ul>li>[role=menuitem]:focus,.more-popover-menu>[type=checkbox]+label+div>ul>li>[role=menuitem]:hover,.more-popover-menu>[type=checkbox]+label+div>ul>li>[role=option]:focus,.more-popover-menu>[type=checkbox]+label+div>ul>li>[role=option]:hover,.popover-menu>[type=checkbox]+label+div>ul>[role=treeitem]:focus,.popover-menu>[type=checkbox]+label+div>ul>[role=treeitem]:hover,.popover-menu>[type=checkbox]+label+div>ul>li>[role=menuitem]:focus,.popover-menu>[type=checkbox]+label+div>ul>li>[role=menuitem]:hover,.popover-menu>[type=checkbox]+label+div>ul>li>[role=option]:focus,.popover-menu>[type=checkbox]+label+div>ul>li>[role=option]:hover,table.has-actions tr>.actions>[type=checkbox]+label+div>ul>[role=treeitem]:focus,table.has-actions tr>.actions>[type=checkbox]+label+div>ul>[role=treeitem]:hover,table.has-actions tr>.actions>[type=checkbox]+label+div>ul>li>[role=menuitem]:focus,table.has-actions tr>.actions>[type=checkbox]+label+div>ul>li>[role=menuitem]:hover,table.has-actions tr>.actions>[type=checkbox]+label+div>ul>li>[role=option]:focus,table.has-actions tr>.actions>[type=checkbox]+label+div>ul>li>[role=option]:hover,table.with-details tr>.actions>[type=checkbox]+label+div>ul>[role=treeitem]:focus,table.with-details tr>.actions>[type=checkbox]+label+div>ul>[role=treeitem]:hover,table.with-details tr>.actions>[type=checkbox]+label+div>ul>li>[role=menuitem]:focus,table.with-details tr>.actions>[type=checkbox]+label+div>ul>li>[role=menuitem]:hover,table.with-details tr>.actions>[type=checkbox]+label+div>ul>li>[role=option]:focus,table.with-details tr>.actions>[type=checkbox]+label+div>ul>li>[role=option]:hover{background-color:var(--token-color-surface-strong)}.type-sort.popover-select label>::before{position:relative;width:16px;height:16px}.type-sort.popover-select label>::after{top:0!important}.consul-intention-action-warn-modal button.dangerous,.copy-button button,.popover-select label>*,.topology-notices button,.type-sort.popover-select label>*{position:relative}.consul-intention-action-warn-modal button.dangerous .progress.indeterminate,.copy-button button .progress.indeterminate,.popover-select label>* .progress.indeterminate,.topology-notices button .progress.indeterminate{position:absolute;top:50%;left:50%;margin-left:-12px;margin-top:-12px}.consul-intention-action-warn-modal button.dangerous:empty,.copy-button button:empty,.popover-select label>:empty,.topology-notices button:empty{padding-right:0!important;padding-left:18px!important;margin-right:5px}.consul-intention-action-warn-modal button.dangerous:empty::before,.copy-button button:empty::before,.popover-select label>:empty::before,.topology-notices button:empty::before{left:1px}.consul-intention-action-warn-modal button.dangerous:not(:empty),.copy-button button:not(:empty),.popover-select label>:not(:empty),.topology-notices button:not(:empty){display:inline-flex;text-align:center;justify-content:center;align-items:center;padding:calc(.5em - 1px) calc(2.2em - 1px);min-width:100px}.consul-intention-action-warn-modal button.dangerous:not(:last-child),.copy-button button:not(:last-child),.popover-select label>:not(:last-child),.topology-notices button:not(:last-child){margin-right:8px}.app-view>header .actions a{padding-top:calc(.4em - 1px)!important;padding-bottom:calc(.4em - 1px)!important}.disclosure-menu [aria-expanded]~*>ul>[role=treeitem],.disclosure-menu [aria-expanded]~*>ul>li>[role=menuitem],.disclosure-menu [aria-expanded]~*>ul>li>[role=option],.hashicorp-consul nav li.nspaces .disclosure-menu>button,.hashicorp-consul nav li.partitions .disclosure-menu>button,.informed-action>ul>li>*,.menu-panel>ul>[role=treeitem],.menu-panel>ul>li>[role=menuitem],.menu-panel>ul>li>[role=option],.more-popover-menu>[type=checkbox]+label+div>ul>[role=treeitem],.more-popover-menu>[type=checkbox]+label+div>ul>li>[role=menuitem],.more-popover-menu>[type=checkbox]+label+div>ul>li>[role=option],.popover-menu>[type=checkbox]+label+div>ul>[role=treeitem],.popover-menu>[type=checkbox]+label+div>ul>li>[role=menuitem],.popover-menu>[type=checkbox]+label+div>ul>li>[role=option],table.has-actions tr>.actions>[type=checkbox]+label+div>ul>[role=treeitem],table.has-actions tr>.actions>[type=checkbox]+label+div>ul>li>[role=menuitem],table.has-actions tr>.actions>[type=checkbox]+label+div>ul>li>[role=option],table.with-details tr>.actions>[type=checkbox]+label+div>ul>[role=treeitem],table.with-details tr>.actions>[type=checkbox]+label+div>ul>li>[role=menuitem],table.with-details tr>.actions>[type=checkbox]+label+div>ul>li>[role=option]{padding:.9em 1em;text-align:center;display:inline-block;box-sizing:border-box}.type-sort.popover-select label>*{height:35px!important}.discovery-chain .resolver-card,.discovery-chain .route-card,.discovery-chain .splitter-card{border:var(--decor-border-100);border-radius:var(--decor-radius-100);background-color:var(--token-color-surface-faint);display:block;position:relative}.discovery-chain .resolver-card>section,.discovery-chain .resolver-card>ul>li,.discovery-chain .route-card>section,.discovery-chain .route-card>ul>li,.discovery-chain .splitter-card>section,.discovery-chain .splitter-card>ul>li{border-top:var(--decor-border-100)}.discovery-chain .resolver-card,.discovery-chain .resolver-card>section,.discovery-chain .resolver-card>ul>li,.discovery-chain .route-card,.discovery-chain .route-card>section,.discovery-chain .route-card>ul>li,.discovery-chain .splitter-card,.discovery-chain .splitter-card>section,.discovery-chain .splitter-card>ul>li{border-color:var(--token-color-surface-interactive-active)}.discovery-chain .resolver-card:focus,.discovery-chain .resolver-card:hover,.discovery-chain .route-card:focus,.discovery-chain .route-card:hover,.discovery-chain .splitter-card:focus,.discovery-chain .splitter-card:hover{box-shadow:var(--token-surface-mid-box-shadow)}.discovery-chain .resolver-card>header,.discovery-chain .route-card>header,.discovery-chain .splitter-card>header{padding:10px}.discovery-chain .resolver-card>section,.discovery-chain .resolver-card>ul>li,.discovery-chain .route-card>section,.discovery-chain .route-card>ul>li,.discovery-chain .splitter-card>section,.discovery-chain .splitter-card>ul>li{padding:5px 10px}.discovery-chain .resolver-card ul,.discovery-chain .route-card ul,.discovery-chain .splitter-card ul{list-style-type:none;margin:0;padding:0}.checkbox-group label{margin-right:10px;white-space:nowrap}.checkbox-group span{display:inline-block;margin-left:10px;min-width:50px}.CodeMirror{max-width:1260px;min-height:300px;height:auto;padding-bottom:20px}.CodeMirror-scroll{overflow-x:hidden!important}.CodeMirror-lint-tooltip{background-color:#f9f9fa;border:1px solid var(--syntax-light-gray);border-radius:0;color:#212121;font-size:13px;padding:7px 8px 9px}.cm-s-hashi.CodeMirror{width:100%;background-color:var(--token-color-hashicorp-brand)!important;color:#cfd2d1!important;border:none;-webkit-font-smoothing:auto;line-height:1.4}.cm-s-hashi .CodeMirror-gutters{color:var(--syntax-dark-grey);background-color:var(--syntax-gutter-grey);border:none}.cm-s-hashi .CodeMirror-cursor{border-left:solid thin #f8f8f0}.cm-s-hashi .CodeMirror-linenumber{color:#6d8a88}.cm-s-hashi.CodeMirror-focused div.CodeMirror-selected{background:#214283}.cm-s-hashi .CodeMirror-line::selection,.cm-s-hashi .CodeMirror-line>span::selection,.cm-s-hashi .CodeMirror-line>span>span::selection{background:#214283}.cm-s-hashi .CodeMirror-line::-moz-selection,.cm-s-hashi .CodeMirror-line>span::-moz-selection,.cm-s-hashi .CodeMirror-line>span>span::-moz-selection{background:var(--token-color-surface-interactive)}.cm-s-hashi span.cm-comment{color:var(--syntax-light-grey)}.cm-s-hashi span.cm-string,.cm-s-hashi span.cm-string-2{color:var(--syntax-packer)}.cm-s-hashi span.cm-number{color:var(--syntax-serf)}.cm-s-hashi span.cm-variable,.cm-s-hashi span.cm-variable-2{color:#9e84c5}.cm-s-hashi span.cm-def{color:var(--syntax-packer)}.cm-s-hashi span.cm-operator{color:var(--syntax-gray)}.cm-s-hashi span.cm-keyword{color:var(--syntax-yellow)}.cm-s-hashi span.cm-atom{color:var(--syntax-serf)}.cm-s-hashi span.cm-meta,.cm-s-hashi span.cm-tag{color:var(--syntax-packer)}.cm-s-hashi span.cm-error{color:var(--syntax-red)}.cm-s-hashi span.cm-attribute,.cm-s-hashi span.cm-qualifier{color:#9fca56}.cm-s-hashi span.cm-property{color:#9e84c5}.cm-s-hashi span.cm-builtin,.cm-s-hashi span.cm-variable-3{color:#9fca56}.cm-s-hashi .CodeMirror-activeline-background{background:#101213}.cm-s-hashi .CodeMirror-matchingbracket{text-decoration:underline;color:var(--token-color-surface-primary)!important}.readonly-codemirror .cm-s-hashi span{color:var(--syntax-light-grey)}.readonly-codemirror .cm-s-hashi span.cm-string,.readonly-codemirror .cm-s-hashi span.cm-string-2{color:var(--syntax-faded-gray)}.readonly-codemirror .cm-s-hashi span.cm-number{color:#a3acbc}.readonly-codemirror .cm-s-hashi span.cm-property{color:var(--token-color-surface-primary)}.readonly-codemirror .cm-s-hashi span.cm-variable-2{color:var(--syntax-light-grey-blue)}.code-editor .toolbar-container{background:var(--token-color-surface-strong);background:linear-gradient(180deg,var(--token-color-surface-strong) 50%,var(--token-color-surface-interactive-active) 100%);border:1px solid var(--token-color-surface-interactive-active);border-bottom-color:var(--token-color-foreground-faint);border-top-color:var(--token-color-foreground-disabled)}.code-editor .toolbar-container .toolbar .title{color:var(--token-color-foreground-strong);font-size:14px;font-weight:700;padding:0 8px}.code-editor .toolbar-container .toolbar .toolbar-separator{border-right:1px solid var(--token-color-palette-neutral-300)}.code-editor .toolbar-container .ember-power-select-trigger{background-color:var(--token-color-surface-primary);color:var(--token-color-hashicorp-brand);border-radius:var(--decor-radius-100);border:var(--decor-border-100);border-color:var(--token-color-foreground-faint)}.code-editor{display:block;border:10px;overflow:hidden;position:relative;clear:both}.code-editor::after{position:absolute;bottom:0;width:100%;height:25px;background-color:var(--token-color-hashicorp-brand);content:"";display:block}.code-editor>pre{display:none}.code-editor .toolbar-container,.code-editor .toolbar-container .toolbar{align-items:center;justify-content:space-between;display:flex}.code-editor .toolbar-container{position:relative;margin-top:4px;height:44px}.code-editor .toolbar-container .toolbar{flex:1;white-space:nowrap}.code-editor .toolbar-container .toolbar .toolbar-separator{height:32px;margin:0 4px;width:0}.code-editor .toolbar-container .toolbar .tools{display:flex;flex-direction:row;margin:0 10px;align-items:center}.code-editor .toolbar-container .toolbar .tools .copy-button{margin-left:10px}.code-editor .toolbar-container .ember-basic-dropdown-trigger{margin:0 8px;width:120px;height:32px;display:flex;align-items:center;flex-direction:row}.consul-exposed-path-list>ul>li,.consul-lock-session-list ul>li:not(:first-child),.consul-upstream-instance-list li,.list-collection>ul>li:not(:first-child){display:grid;grid-template-columns:1fr auto;grid-template-rows:50% 50%;grid-template-areas:"header actions" "detail actions"}.consul-exposed-path-list>ul>li>.header,.consul-lock-session-list ul>li:not(:first-child)>.header,.consul-upstream-instance-list li>.header,.list-collection>ul>li:not(:first-child)>.header{grid-area:header;align-self:start}.consul-exposed-path-list>ul>li>.detail,.consul-lock-session-list ul>li:not(:first-child)>.detail,.consul-upstream-instance-list li>.detail,.list-collection>ul>li:not(:first-child)>.detail{grid-area:detail;align-self:end}.consul-exposed-path-list>ul>li>.detail *,.consul-lock-session-list ul>li:not(:first-child)>.detail *,.consul-upstream-instance-list li>.detail *,.list-collection>ul>li:not(:first-child)>.detail *{flex-wrap:nowrap!important}.consul-exposed-path-list>ul>li>.actions,.consul-lock-session-list ul>li:not(:first-child)>.actions,.consul-upstream-instance-list li>.actions,.list-collection>ul>li:not(:first-child)>.actions{grid-area:actions;display:inline-flex}.consul-nspace-list>ul>li:not(:first-child) dt,.consul-policy-list>ul li:not(:first-child) dl:not(.datacenter) dt,.consul-role-list>ul>li:not(:first-child) dt,.consul-service-instance-list .port dt,.consul-service-instance-list .port dt::before,.consul-token-list>ul>li:not(:first-child) dt{display:none}.consul-exposed-path-list>ul>li>.header:nth-last-child(2),.consul-lock-session-list ul>li:not(:first-child)>.header:nth-last-child(2),.consul-upstream-instance-list li>.header:nth-last-child(2),.list-collection>ul>li:not(:first-child)>.header:nth-last-child(2){grid-column-start:header;grid-column-end:actions}.consul-exposed-path-list>ul>li>.detail:last-child,.consul-lock-session-list ul>li:not(:first-child)>.detail:last-child,.consul-upstream-instance-list li>.detail:last-child,.list-collection>ul>li:not(:first-child)>.detail:last-child{grid-column-start:detail;grid-column-end:actions}.consul-nspace-list>ul>li:not(:first-child) dt+dd,.consul-policy-list>ul li:not(:first-child) dl:not(.datacenter) dt+dd,.consul-role-list>ul>li:not(:first-child) dt+dd,.consul-token-list>ul>li:not(:first-child) dt+dd{margin-left:0!important}.consul-policy-list dl.datacenter dt,.consul-service-list li>div:first-child>dl:first-child dd{margin-top:1px}.consul-service-instance-list .detail,.consul-service-list .detail{overflow-x:visible!important}.consul-intention-permission-list>ul{border-top:1px solid var(--token-color-surface-interactive-active)}.consul-service-instance-list .port .copy-button{margin-right:0}.consul-exposed-path-list>ul>li .copy-button,.consul-lock-session-list ul>li:not(:first-child) .copy-button,.consul-upstream-instance-list li .copy-button,.list-collection>ul>li:not(:first-child) .copy-button{display:inline-flex}.consul-exposed-path-list>ul>li>.header .copy-button,.consul-lock-session-list ul>li:not(:first-child)>.header .copy-button,.consul-upstream-instance-list li>.header .copy-button,.list-collection>ul>li:not(:first-child)>.header .copy-button{margin-left:4px}.consul-exposed-path-list>ul>li>.detail .copy-button,.consul-lock-session-list ul>li:not(:first-child)>.detail .copy-button,.consul-upstream-instance-list li>.detail .copy-button,.list-collection>ul>li:not(:first-child)>.detail .copy-button{margin-top:2px}.consul-exposed-path-list>ul>li .copy-button button,.consul-lock-session-list ul>li:not(:first-child) .copy-button button,.consul-upstream-instance-list li .copy-button button,.list-collection>ul>li:not(:first-child) .copy-button button{padding:0!important;margin:0!important}.consul-exposed-path-list>ul>li>.header .copy-button button,.consul-lock-session-list ul>li:not(:first-child)>.header .copy-button button,.consul-upstream-instance-list li>.header .copy-button button,.list-collection>ul>li:not(:first-child)>.header .copy-button button{display:none}.consul-exposed-path-list>ul>li>.header:hover .copy-button button,.consul-lock-session-list ul>li:not(:first-child)>.header:hover .copy-button button,.consul-upstream-instance-list li>.header:hover .copy-button button,.list-collection>ul>li:not(:first-child)>.header:hover .copy-button button{display:block}.consul-exposed-path-list>ul>li .copy-button button:hover,.consul-lock-session-list ul>li:not(:first-child) .copy-button button:hover,.consul-upstream-instance-list li .copy-button button:hover,.list-collection>ul>li:not(:first-child) .copy-button button:hover{background-color:transparent!important}.consul-exposed-path-list>ul>li>.detail>.consul-external-source:first-child,.consul-exposed-path-list>ul>li>.detail>.consul-kind:first-child,.consul-lock-session-list ul>li:not(:first-child)>.detail>.consul-external-source:first-child,.consul-lock-session-list ul>li:not(:first-child)>.detail>.consul-kind:first-child,.consul-upstream-instance-list li>.detail>.consul-external-source:first-child,.consul-upstream-instance-list li>.detail>.consul-kind:first-child,.list-collection>ul>li:not(:first-child)>.detail>.consul-external-source:first-child,.list-collection>ul>li:not(:first-child)>.detail>.consul-kind:first-child{margin-left:-5px}.consul-exposed-path-list>ul>li>.detail .policy-management::before,.consul-exposed-path-list>ul>li>.detail .policy::before,.consul-exposed-path-list>ul>li>.detail .role::before,.consul-lock-session-list ul>li:not(:first-child)>.detail .policy-management::before,.consul-lock-session-list ul>li:not(:first-child)>.detail .policy::before,.consul-lock-session-list ul>li:not(:first-child)>.detail .role::before,.consul-upstream-instance-list li>.detail .policy-management::before,.consul-upstream-instance-list li>.detail .policy::before,.consul-upstream-instance-list li>.detail .role::before,.list-collection>ul>li:not(:first-child)>.detail .policy-management::before,.list-collection>ul>li:not(:first-child)>.detail .policy::before,.list-collection>ul>li:not(:first-child)>.detail .role::before{margin-right:3px}table div.with-confirmation.confirming{background-color:var(--token-color-surface-primary)}div.with-confirmation p{margin-right:12px;padding-left:12px;margin-bottom:0!important}div.with-confirmation{justify-content:end;width:100%;display:flex;align-items:center}table td>div.with-confirmation.confirming{position:absolute;right:0}@media (max-width:420px){div.with-confirmation{float:none;margin-top:1em;display:block}div.with-confirmation p{margin-bottom:1em}}.copy-button button{color:var(--token-color-foreground-action);--icon-color:transparent;min-height:17px}.copy-button button::after{--icon-color:var(--token-color-surface-strong)}.copy-button button:focus,.copy-button button:hover:not(:disabled):not(:active){color:var(--token-color-foreground-action);--icon-color:var(--token-color-surface-strong)}.copy-button button:hover::before{--icon-color:var(--token-color-foreground-action)}.copy-button button:active{--icon-color:var(--token-color-surface-interactive-active)}.copy-button button:empty{padding:0!important;margin-right:0;top:-1px}.copy-button button:empty::after{content:"";display:none;position:absolute;top:-2px;left:-3px;width:20px;height:22px}.copy-button button:empty:hover::after{display:block}.copy-button button:empty::before{position:relative;z-index:1}.copy-button button:not(:empty)::before{margin-right:4px}.consul-bucket-list .copy-button,.consul-exposed-path-list>ul>li>.detail dl .copy-button,.consul-instance-checks .copy-button,.consul-lock-session-list dl .copy-button,.consul-lock-session-list ul>li:not(:first-child)>.detail dl .copy-button,.consul-upstream-instance-list dl .copy-button,.list-collection>ul>li:not(:first-child)>.detail dl .copy-button,.tag-list .copy-button,section[data-route="dc.show.license"] .validity dl .copy-button,section[data-route="dc.show.serverstatus"] .redundancy-zones section header dl .copy-button,td.tags .copy-button{margin-top:0!important}.consul-bucket-list .copy-btn,.consul-exposed-path-list>ul>li>.detail dl .copy-btn,.consul-instance-checks .copy-btn,.consul-lock-session-list dl .copy-btn,.consul-lock-session-list ul>li:not(:first-child)>.detail dl .copy-btn,.consul-upstream-instance-list dl .copy-btn,.list-collection>ul>li:not(:first-child)>.detail dl .copy-btn,.tag-list .copy-btn,section[data-route="dc.show.license"] .validity dl .copy-btn,section[data-route="dc.show.serverstatus"] .redundancy-zones section header dl .copy-btn,td.tags .copy-btn{top:0!important}.consul-bucket-list .copy-btn:empty::before,.consul-exposed-path-list>ul>li>.detail dl .copy-btn:empty::before,.consul-instance-checks .copy-btn:empty::before,.consul-lock-session-list dl .copy-btn:empty::before,.consul-upstream-instance-list dl .copy-btn:empty::before,.list-collection>ul>li:not(:first-child)>.detail dl .copy-btn:empty::before,.tag-list .copy-btn:empty::before,section[data-route="dc.show.license"] .validity dl .copy-btn:empty::before,section[data-route="dc.show.serverstatus"] .redundancy-zones section header dl .copy-btn:empty::before,td.tags .copy-btn:empty::before{left:0!important}.definition-table>dl{display:grid;grid-template-columns:140px auto;grid-gap:.4em 20px;margin-bottom:1.4em}.disclosure-menu{position:relative}.disclosure-menu [aria-expanded]~*{overflow-y:auto!important;will-change:scrollPosition}.more-popover-menu>[type=checkbox],.more-popover-menu>[type=checkbox]~:not(.animating):not(label),.popover-menu>[type=checkbox],.popover-menu>[type=checkbox]~:not(.animating):not(label),table.has-actions tr>.actions>[type=checkbox],table.has-actions tr>.actions>[type=checkbox]~:not(.animating):not(label),table.with-details tr>.actions>[type=checkbox],table.with-details tr>.actions>[type=checkbox]~:not(.animating):not(label){display:none}.more-popover-menu>[type=checkbox]:checked~:not(label),.popover-menu>[type=checkbox]:checked~:not(label),table.has-actions tr>.actions>[type=checkbox]:checked~:not(label),table.with-details tr>.actions>[type=checkbox]:checked~:not(label){display:block}table.dom-recycling{position:relative}table.dom-recycling tr>*{overflow:hidden}.list-collection-scroll-virtual>ul,table.dom-recycling tbody{overflow-x:hidden!important}table.dom-recycling dd{flex-wrap:nowrap}table.dom-recycling dd>*{margin-bottom:0}.empty-state,.empty-state>div{display:flex;flex-direction:column}.empty-state header :first-child{padding:0;margin:0}.empty-state{margin-top:0!important;padding-bottom:2.8em;background-color:var(--token-color-surface-faint)}.empty-state>*{width:370px;margin:0 auto}.empty-state button{margin:0 auto;display:inline}.empty-state header :first-child{margin-bottom:-3px;border-bottom:none}.empty-state header{margin-top:1.8em;margin-bottom:.5em}.empty-state>ul{display:flex;justify-content:space-between;margin-top:1em}.empty-state>ul>li>*,.empty-state>ul>li>label>button{display:inline-flex;align-items:center}.empty-state>div:only-child{padding:50px 0 10px;text-align:center}.empty-state header::before{font-size:2.6em;position:relative;top:-3px;float:left;margin-right:10px}.oidc-select button.reset,.type-dialog{float:right}.empty-state>ul>li>::before,.empty-state>ul>li>label>button::before{margin-top:-1px;margin-right:.5em;font-size:.9em}.empty-state li[class*=-link]>::after{margin-left:5px}html[data-route^="dc.acls.index"] .filter-bar [role=radiogroup]{border:var(--decor-border-100);border-color:var(--token-color-palette-neutral-300);border-radius:var(--decor-radius-100)}html[data-route^="dc.acls.index"] .filter-bar [role=radiogroup] input[type=radio]:checked+*,html[data-route^="dc.acls.index"] .filter-bar [role=radiogroup] input[type=radio]:focus+*,html[data-route^="dc.acls.index"] .filter-bar [role=radiogroup] input[type=radio]:hover+*{box-shadow:var(--token-elevation-high-box-shadow);background-color:var(--token-color-surface-primary)}@media (min-width:996px){html[data-route^="dc.acls.index"] .filter-bar [role=radiogroup]{display:flex}html[data-route^="dc.acls.index"] .filter-bar [role=radiogroup] label{flex-grow:1}}html[data-route^="dc.acls.index"] .filter-bar [role=radiogroup] input[type=radio]{display:none}.app-view>div form:not(.filter-bar) [role=radiogroup] label,.app-view>div form:not(.filter-bar) [role=radiogroup] label textarea,.app-view>div form:not(.filter-bar) [role=radiogroup] label>em,.app-view>div form:not(.filter-bar) [role=radiogroup] label>span,.modal-dialog [role=document] .type-password,.modal-dialog [role=document] .type-password textarea,.modal-dialog [role=document] .type-password>em,.modal-dialog [role=document] .type-password>span,.modal-dialog [role=document] .type-select,.modal-dialog [role=document] .type-select textarea,.modal-dialog [role=document] .type-select>em,.modal-dialog [role=document] .type-select>span,.modal-dialog [role=document] .type-text,.modal-dialog [role=document] .type-text textarea,.modal-dialog [role=document] .type-text>em,.modal-dialog [role=document] .type-text>span,.modal-dialog [role=document] [role=radiogroup] label,.modal-dialog [role=document] [role=radiogroup] label textarea,.modal-dialog [role=document] [role=radiogroup] label>em,.modal-dialog [role=document] [role=radiogroup] label>span,.modal-dialog [role=document] form button+em,.oidc-select label,.oidc-select label textarea,.oidc-select label>em,.oidc-select label>span,.type-toggle,.type-toggle textarea,.type-toggle>em,.type-toggle>span,html[data-route^="dc.acls.index"] .filter-bar [role=radiogroup] label,html[data-route^="dc.acls.index"] .filter-bar [role=radiogroup] label span,main .type-password,main .type-password textarea,main .type-password>em,main .type-password>span,main .type-select,main .type-select textarea,main .type-select>em,main .type-select>span,main .type-text,main .type-text textarea,main .type-text>em,main .type-text>span,main form button+em,span.label{display:block}html[data-route^="dc.acls.index"] .filter-bar [role=radiogroup],html[data-route^="dc.acls.index"] .filter-bar [role=radiogroup] label,html[data-route^="dc.acls.index"] .filter-bar [role=radiogroup] label span{height:100%}html[data-route^="dc.acls.index"] .filter-bar [role=radiogroup] label span{padding:5px 14px}.app-view>div form:not(.filter-bar) [role=radiogroup] label [type=password],.app-view>div form:not(.filter-bar) [role=radiogroup] label [type=text],.app-view>div form:not(.filter-bar) [role=radiogroup] label textarea,.modal-dialog [role=document] .type-password [type=password],.modal-dialog [role=document] .type-password [type=text],.modal-dialog [role=document] .type-password textarea,.modal-dialog [role=document] .type-select [type=password],.modal-dialog [role=document] .type-select [type=text],.modal-dialog [role=document] .type-select textarea,.modal-dialog [role=document] .type-text [type=password],.modal-dialog [role=document] .type-text [type=text],.modal-dialog [role=document] .type-text textarea,.modal-dialog [role=document] [role=radiogroup] label [type=password],.modal-dialog [role=document] [role=radiogroup] label [type=text],.modal-dialog [role=document] [role=radiogroup] label textarea,.oidc-select label [type=password],.oidc-select label [type=text],.oidc-select label textarea,.type-toggle [type=password],.type-toggle [type=text],.type-toggle textarea,main .type-password [type=password],main .type-password [type=text],main .type-password textarea,main .type-select [type=password],main .type-select [type=text],main .type-select textarea,main .type-text [type=password],main .type-text [type=text],main .type-text textarea{-moz-appearance:none;-webkit-appearance:none;box-shadow:var(--token-surface-inset-box-shadow);border-radius:var(--decor-radius-100);border:var(--decor-border-100);outline:0}.app-view>div form:not(.filter-bar) [role=radiogroup] label [type=password]:-moz-read-only,.app-view>div form:not(.filter-bar) [role=radiogroup] label [type=text]:-moz-read-only,.app-view>div form:not(.filter-bar) [role=radiogroup] label textarea:-moz-read-only,.modal-dialog [role=document] .type-password [type=password]:-moz-read-only,.modal-dialog [role=document] .type-password [type=text]:-moz-read-only,.modal-dialog [role=document] .type-password textarea:-moz-read-only,.modal-dialog [role=document] .type-select [type=password]:-moz-read-only,.modal-dialog [role=document] .type-select [type=text]:-moz-read-only,.modal-dialog [role=document] .type-select textarea:-moz-read-only,.modal-dialog [role=document] .type-text [type=password]:-moz-read-only,.modal-dialog [role=document] .type-text [type=text]:-moz-read-only,.modal-dialog [role=document] .type-text textarea:-moz-read-only,.modal-dialog [role=document] [role=radiogroup] label [type=password]:-moz-read-only,.modal-dialog [role=document] [role=radiogroup] label [type=text]:-moz-read-only,.modal-dialog [role=document] [role=radiogroup] label textarea:-moz-read-only,.oidc-select label [type=password]:-moz-read-only,.oidc-select label [type=text]:-moz-read-only,.oidc-select label textarea:-moz-read-only,.type-toggle [type=password]:-moz-read-only,.type-toggle [type=text]:-moz-read-only,.type-toggle textarea:-moz-read-only,main .type-password [type=password]:-moz-read-only,main .type-password [type=text]:-moz-read-only,main .type-password textarea:-moz-read-only,main .type-select [type=password]:-moz-read-only,main .type-select [type=text]:-moz-read-only,main .type-select textarea:-moz-read-only,main .type-text [type=password]:-moz-read-only,main .type-text [type=text]:-moz-read-only,main .type-text textarea:-moz-read-only{cursor:not-allowed}.app-view>div form:not(.filter-bar) [role=radiogroup] label [type=password]:disabled,.app-view>div form:not(.filter-bar) [role=radiogroup] label [type=password]:read-only,.app-view>div form:not(.filter-bar) [role=radiogroup] label [type=text]:disabled,.app-view>div form:not(.filter-bar) [role=radiogroup] label [type=text]:read-only,.app-view>div form:not(.filter-bar) [role=radiogroup] label textarea:disabled,.app-view>div form:not(.filter-bar) [role=radiogroup] label textarea:read-only,.modal-dialog [role=document] .type-password [type=password]:disabled,.modal-dialog [role=document] .type-password [type=password]:read-only,.modal-dialog [role=document] .type-password [type=text]:disabled,.modal-dialog [role=document] .type-password [type=text]:read-only,.modal-dialog [role=document] .type-password textarea:disabled,.modal-dialog [role=document] .type-password textarea:read-only,.modal-dialog [role=document] .type-select [type=password]:disabled,.modal-dialog [role=document] .type-select [type=password]:read-only,.modal-dialog [role=document] .type-select [type=text]:disabled,.modal-dialog [role=document] .type-select [type=text]:read-only,.modal-dialog [role=document] .type-select textarea:disabled,.modal-dialog [role=document] .type-select textarea:read-only,.modal-dialog [role=document] .type-text [type=password]:disabled,.modal-dialog [role=document] .type-text [type=password]:read-only,.modal-dialog [role=document] .type-text [type=text]:disabled,.modal-dialog [role=document] .type-text [type=text]:read-only,.modal-dialog [role=document] .type-text textarea:disabled,.modal-dialog [role=document] .type-text textarea:read-only,.modal-dialog [role=document] [role=radiogroup] label [type=password]:disabled,.modal-dialog [role=document] [role=radiogroup] label [type=password]:read-only,.modal-dialog [role=document] [role=radiogroup] label [type=text]:disabled,.modal-dialog [role=document] [role=radiogroup] label [type=text]:read-only,.modal-dialog [role=document] [role=radiogroup] label textarea:disabled,.modal-dialog [role=document] [role=radiogroup] label textarea:read-only,.oidc-select label [type=password]:disabled,.oidc-select label [type=password]:read-only,.oidc-select label [type=text]:disabled,.oidc-select label [type=text]:read-only,.oidc-select label textarea:disabled,.oidc-select label textarea:read-only,.type-toggle [type=password]:disabled,.type-toggle [type=password]:read-only,.type-toggle [type=text]:disabled,.type-toggle [type=text]:read-only,.type-toggle textarea:disabled,.type-toggle textarea:read-only,main .type-password [type=password]:disabled,main .type-password [type=password]:read-only,main .type-password [type=text]:disabled,main .type-password [type=text]:read-only,main .type-password textarea:disabled,main .type-password textarea:read-only,main .type-select [type=password]:disabled,main .type-select [type=password]:read-only,main .type-select [type=text]:disabled,main .type-select [type=text]:read-only,main .type-select textarea:disabled,main .type-select textarea:read-only,main .type-text [type=password]:disabled,main .type-text [type=password]:read-only,main .type-text [type=text]:disabled,main .type-text [type=text]:read-only,main .type-text textarea:disabled,main .type-text textarea:read-only,textarea:disabled+.CodeMirror{cursor:not-allowed}.app-view>div form:not(.filter-bar) [role=radiogroup] label [type=password]::-moz-placeholder,.app-view>div form:not(.filter-bar) [role=radiogroup] label [type=text]::-moz-placeholder,.app-view>div form:not(.filter-bar) [role=radiogroup] label textarea::-moz-placeholder,.modal-dialog [role=document] .type-password [type=password]::-moz-placeholder,.modal-dialog [role=document] .type-password [type=text]::-moz-placeholder,.modal-dialog [role=document] .type-password textarea::-moz-placeholder,.modal-dialog [role=document] .type-select [type=password]::-moz-placeholder,.modal-dialog [role=document] .type-select [type=text]::-moz-placeholder,.modal-dialog [role=document] .type-select textarea::-moz-placeholder,.modal-dialog [role=document] .type-text [type=password]::-moz-placeholder,.modal-dialog [role=document] .type-text [type=text]::-moz-placeholder,.modal-dialog [role=document] .type-text textarea::-moz-placeholder,.modal-dialog [role=document] [role=radiogroup] label [type=password]::-moz-placeholder,.modal-dialog [role=document] [role=radiogroup] label [type=text]::-moz-placeholder,.modal-dialog [role=document] [role=radiogroup] label textarea::-moz-placeholder,.oidc-select label [type=password]::-moz-placeholder,.oidc-select label [type=text]::-moz-placeholder,.oidc-select label textarea::-moz-placeholder,.type-toggle [type=password]::-moz-placeholder,.type-toggle [type=text]::-moz-placeholder,.type-toggle textarea::-moz-placeholder,main .type-password [type=password]::-moz-placeholder,main .type-password [type=text]::-moz-placeholder,main .type-password textarea::-moz-placeholder,main .type-select [type=password]::-moz-placeholder,main .type-select [type=text]::-moz-placeholder,main .type-select textarea::-moz-placeholder,main .type-text [type=password]::-moz-placeholder,main .type-text [type=text]::-moz-placeholder,main .type-text textarea::-moz-placeholder{color:var(--token-color-foreground-disabled)}.app-view>div form:not(.filter-bar) [role=radiogroup] label [type=password]::placeholder,.app-view>div form:not(.filter-bar) [role=radiogroup] label [type=text]::placeholder,.app-view>div form:not(.filter-bar) [role=radiogroup] label textarea::placeholder,.app-view>div form:not(.filter-bar) [role=radiogroup] label>em,.modal-dialog [role=document] .type-password [type=password]::placeholder,.modal-dialog [role=document] .type-password [type=text]::placeholder,.modal-dialog [role=document] .type-password textarea::placeholder,.modal-dialog [role=document] .type-password>em,.modal-dialog [role=document] .type-select [type=password]::placeholder,.modal-dialog [role=document] .type-select [type=text]::placeholder,.modal-dialog [role=document] .type-select textarea::placeholder,.modal-dialog [role=document] .type-select>em,.modal-dialog [role=document] .type-text [type=password]::placeholder,.modal-dialog [role=document] .type-text [type=text]::placeholder,.modal-dialog [role=document] .type-text textarea::placeholder,.modal-dialog [role=document] .type-text>em,.modal-dialog [role=document] [role=radiogroup] label [type=password]::placeholder,.modal-dialog [role=document] [role=radiogroup] label [type=text]::placeholder,.modal-dialog [role=document] [role=radiogroup] label textarea::placeholder,.modal-dialog [role=document] [role=radiogroup] label>em,.modal-dialog [role=document] form button+em,.modal-dialog [role=document] form fieldset>p,.oidc-select label [type=password]::placeholder,.oidc-select label [type=text]::placeholder,.oidc-select label textarea::placeholder,.oidc-select label>em,.type-toggle [type=password]::placeholder,.type-toggle [type=text]::placeholder,.type-toggle textarea::placeholder,.type-toggle>em,main .type-password [type=password]::placeholder,main .type-password [type=text]::placeholder,main .type-password textarea::placeholder,main .type-password>em,main .type-select [type=password]::placeholder,main .type-select [type=text]::placeholder,main .type-select textarea::placeholder,main .type-select>em,main .type-text [type=password]::placeholder,main .type-text [type=text]::placeholder,main .type-text textarea::placeholder,main .type-text>em,main form button+em,main form fieldset>p{color:var(--token-color-foreground-disabled)}.has-error>input,.has-error>textarea{border-color:var(--decor-error,var(--token-color-foreground-critical))!important}.app-view>div form:not(.filter-bar) [role=radiogroup] label [type=password],.app-view>div form:not(.filter-bar) [role=radiogroup] label [type=text],.app-view>div form:not(.filter-bar) [role=radiogroup] label textarea,.modal-dialog [role=document] .type-password [type=password],.modal-dialog [role=document] .type-password [type=text],.modal-dialog [role=document] .type-password textarea,.modal-dialog [role=document] .type-select [type=password],.modal-dialog [role=document] .type-select [type=text],.modal-dialog [role=document] .type-select textarea,.modal-dialog [role=document] .type-text [type=password],.modal-dialog [role=document] .type-text [type=text],.modal-dialog [role=document] .type-text textarea,.modal-dialog [role=document] [role=radiogroup] label [type=password],.modal-dialog [role=document] [role=radiogroup] label [type=text],.modal-dialog [role=document] [role=radiogroup] label textarea,.oidc-select label [type=password],.oidc-select label [type=text],.oidc-select label textarea,.type-toggle [type=password],.type-toggle [type=text],.type-toggle textarea,main .type-password [type=password],main .type-password [type=text],main .type-password textarea,main .type-select [type=password],main .type-select [type=text],main .type-select textarea,main .type-text [type=password],main .type-text [type=text],main .type-text textarea{color:var(--token-color-foreground-faint);border-color:var(--token-color-palette-neutral-300)}.app-view>div form:not(.filter-bar) [role=radiogroup] label [type=password]:hover,.app-view>div form:not(.filter-bar) [role=radiogroup] label [type=text]:hover,.app-view>div form:not(.filter-bar) [role=radiogroup] label textarea:hover,.modal-dialog [role=document] .type-password [type=password]:hover,.modal-dialog [role=document] .type-password [type=text]:hover,.modal-dialog [role=document] .type-password textarea:hover,.modal-dialog [role=document] .type-select [type=password]:hover,.modal-dialog [role=document] .type-select [type=text]:hover,.modal-dialog [role=document] .type-select textarea:hover,.modal-dialog [role=document] .type-text [type=password]:hover,.modal-dialog [role=document] .type-text [type=text]:hover,.modal-dialog [role=document] .type-text textarea:hover,.modal-dialog [role=document] [role=radiogroup] label [type=password]:hover,.modal-dialog [role=document] [role=radiogroup] label [type=text]:hover,.modal-dialog [role=document] [role=radiogroup] label textarea:hover,.oidc-select label [type=password]:hover,.oidc-select label [type=text]:hover,.oidc-select label textarea:hover,.type-toggle [type=password]:hover,.type-toggle [type=text]:hover,.type-toggle textarea:hover,main .type-password [type=password]:hover,main .type-password [type=text]:hover,main .type-password textarea:hover,main .type-select [type=password]:hover,main .type-select [type=text]:hover,main .type-select textarea:hover,main .type-text [type=password]:hover,main .type-text [type=text]:hover,main .type-text textarea:hover{border-color:var(--token-color-foreground-faint)}.app-view>div form:not(.filter-bar) [role=radiogroup] label [type=password]:focus,.app-view>div form:not(.filter-bar) [role=radiogroup] label [type=text]:focus,.app-view>div form:not(.filter-bar) [role=radiogroup] label textarea:focus,.modal-dialog [role=document] .type-password [type=password]:focus,.modal-dialog [role=document] .type-password [type=text]:focus,.modal-dialog [role=document] .type-password textarea:focus,.modal-dialog [role=document] .type-select [type=password]:focus,.modal-dialog [role=document] .type-select [type=text]:focus,.modal-dialog [role=document] .type-select textarea:focus,.modal-dialog [role=document] .type-text [type=password]:focus,.modal-dialog [role=document] .type-text [type=text]:focus,.modal-dialog [role=document] .type-text textarea:focus,.modal-dialog [role=document] [role=radiogroup] label [type=password]:focus,.modal-dialog [role=document] [role=radiogroup] label [type=text]:focus,.modal-dialog [role=document] [role=radiogroup] label textarea:focus,.oidc-select label [type=password]:focus,.oidc-select label [type=text]:focus,.oidc-select label textarea:focus,.type-toggle [type=password]:focus,.type-toggle [type=text]:focus,.type-toggle textarea:focus,main .type-password [type=password]:focus,main .type-password [type=text]:focus,main .type-password textarea:focus,main .type-select [type=password]:focus,main .type-select [type=text]:focus,main .type-select textarea:focus,main .type-text [type=password]:focus,main .type-text [type=text]:focus,main .type-text textarea:focus{border-color:var(--typo-action,var(--token-color-foreground-action))}.app-view>div form:not(.filter-bar) [role=radiogroup] label a,.modal-dialog [role=document] .type-password a,.modal-dialog [role=document] .type-select a,.modal-dialog [role=document] .type-text a,.modal-dialog [role=document] [role=radiogroup] label a,.oidc-select label a,.type-toggle a,main .type-password a,main .type-select a,main .type-text a{display:inline}.app-view>div form:not(.filter-bar) [role=radiogroup] label [type=password],.app-view>div form:not(.filter-bar) [role=radiogroup] label [type=text],.modal-dialog [role=document] .type-password [type=password],.modal-dialog [role=document] .type-password [type=text],.modal-dialog [role=document] .type-select [type=password],.modal-dialog [role=document] .type-select [type=text],.modal-dialog [role=document] .type-text [type=password],.modal-dialog [role=document] .type-text [type=text],.modal-dialog [role=document] [role=radiogroup] label [type=password],.modal-dialog [role=document] [role=radiogroup] label [type=text],.oidc-select label [type=password],.oidc-select label [type=text],.type-toggle [type=password],.type-toggle [type=text],main .type-password [type=password],main .type-password [type=text],main .type-select [type=password],main .type-select [type=text],main .type-text [type=password],main .type-text [type=text]{display:inline-flex;justify-content:flex-start;max-width:100%;width:100%;height:0;padding:17px 13px}.app-view>div form:not(.filter-bar) [role=radiogroup] label textarea,.modal-dialog [role=document] .type-password textarea,.modal-dialog [role=document] .type-select textarea,.modal-dialog [role=document] .type-text textarea,.modal-dialog [role=document] [role=radiogroup] label textarea,.oidc-select label textarea,.type-toggle textarea,main .type-password textarea,main .type-select textarea,main .type-text textarea{resize:vertical;max-width:100%;min-width:100%;min-height:70px;padding:6px 13px}.app-view>div form:not(.filter-bar) [role=radiogroup],.app-view>div form:not(.filter-bar) [role=radiogroup] label,.checkbox-group,.modal-dialog [role=document] .type-password,.modal-dialog [role=document] .type-select,.modal-dialog [role=document] .type-text,.modal-dialog [role=document] [role=radiogroup],.modal-dialog [role=document] [role=radiogroup] label,.modal-dialog [role=document] form table,.oidc-select label,.type-toggle,main .type-password,main .type-select,main .type-text,main form table{margin-bottom:1.4em}.app-view>div form:not(.filter-bar) [role=radiogroup] label>span,.modal-dialog [role=document] .type-password>span,.modal-dialog [role=document] .type-select>span,.modal-dialog [role=document] .type-text>span,.modal-dialog [role=document] [role=radiogroup] label>span,.oidc-select label>span,.type-toggle>span,main .type-password>span,main .type-select>span,main .type-text>span,span.label{color:var(--typo-contrast,inherit);margin-bottom:.3em}.app-view>div form:not(.filter-bar) [role=radiogroup] label>em,.modal-dialog [role=document] .type-password>em,.modal-dialog [role=document] .type-select>em,.modal-dialog [role=document] .type-text>em,.modal-dialog [role=document] [role=radiogroup] label>em,.modal-dialog [role=document] form button+em,.oidc-select label>em,.type-toggle>em,main .type-password>em,main .type-select>em,main .type-text>em,main form button+em{margin-top:2px}.app-view>div form:not(.filter-bar) [role=radiogroup] label>span+em,.modal-dialog [role=document] .type-password>span+em,.modal-dialog [role=document] .type-select>span+em,.modal-dialog [role=document] .type-text>span+em,.modal-dialog [role=document] [role=radiogroup] label>span+em,.oidc-select label>span+em,.type-toggle>span+em,main .type-password>span+em,main .type-select>span+em,main .type-text>span+em,span.label+em{margin-top:-.5em;margin-bottom:.5em}.modal-dialog [role=document] .type-password>span,.modal-dialog [role=document] .type-select>span,.modal-dialog [role=document] label.type-text>span,main .type-password>span,main .type-select>span,main label.type-text>span{line-height:2.2em}.type-toggle+.checkbox-group{margin-top:-1em}.consul-exposed-path-list>ul>li,.consul-intention-permission-header-list>ul>li,.consul-intention-permission-list>ul>li,.consul-lock-session-list ul>li:not(:first-child),.consul-upstream-instance-list li,.list-collection>ul>li:not(:first-child){list-style-type:none;border:var(--decor-border-100);border-top-color:transparent;border-bottom-color:var(--token-color-surface-interactive-active);border-right-color:transparent;border-left-color:transparent;--horizontal-padding:12px;--vertical-padding:10px;padding:var(--vertical-padding) 0;padding-left:var(--horizontal-padding)}.consul-auth-method-list>ul>li:active:not(:first-child),.consul-auth-method-list>ul>li:focus:not(:first-child),.consul-auth-method-list>ul>li:hover:not(:first-child),.consul-exposed-path-list>ul>li.linkable:active,.consul-exposed-path-list>ul>li.linkable:focus,.consul-exposed-path-list>ul>li.linkable:hover,.consul-intention-permission-list:not(.readonly)>ul>li:active,.consul-intention-permission-list:not(.readonly)>ul>li:focus,.consul-intention-permission-list:not(.readonly)>ul>li:hover,.consul-lock-session-list ul>li.linkable:active:not(:first-child),.consul-lock-session-list ul>li.linkable:focus:not(:first-child),.consul-lock-session-list ul>li.linkable:hover:not(:first-child),.consul-node-list>ul>li:active:not(:first-child),.consul-node-list>ul>li:focus:not(:first-child),.consul-node-list>ul>li:hover:not(:first-child),.consul-policy-list>ul>li:active:not(:first-child),.consul-policy-list>ul>li:focus:not(:first-child),.consul-policy-list>ul>li:hover:not(:first-child),.consul-role-list>ul>li:active:not(:first-child),.consul-role-list>ul>li:focus:not(:first-child),.consul-role-list>ul>li:hover:not(:first-child),.consul-service-instance-list>ul>li:active:not(:first-child),.consul-service-instance-list>ul>li:focus:not(:first-child),.consul-service-instance-list>ul>li:hover:not(:first-child),.consul-token-list>ul>li:active:not(:first-child),.consul-token-list>ul>li:focus:not(:first-child),.consul-token-list>ul>li:hover:not(:first-child),.consul-upstream-instance-list li.linkable:active,.consul-upstream-instance-list li.linkable:focus,.consul-upstream-instance-list li.linkable:hover,.list-collection>ul>li.linkable:active:not(:first-child),.list-collection>ul>li.linkable:focus:not(:first-child),.list-collection>ul>li.linkable:hover:not(:first-child){border-color:var(--token-color-surface-interactive-active);box-shadow:var(--token-elevation-high-box-shadow);border-top-color:transparent;cursor:pointer}.radio-card,.tippy-box{box-shadow:var(--token-surface-mid-box-shadow)}.consul-exposed-path-list>ul>li>.header,.consul-lock-session-list ul>li:not(:first-child)>.header,.consul-upstream-instance-list li>.header,.list-collection>ul>li:not(:first-child)>.header{color:var(--token-color-hashicorp-brand)}.consul-exposed-path-list>ul>li>.header *,.consul-lock-session-list ul>li:not(:first-child)>.header *,.consul-upstream-instance-list li>.header *,.list-collection>ul>li:not(:first-child)>.header *{color:inherit}.consul-exposed-path-list>ul>li>.detail,.consul-lock-session-list ul>li:not(:first-child)>.detail,.consul-upstream-instance-list li>.detail,.list-collection>ul>li:not(:first-child)>.detail,.radio-card{color:var(--token-color-foreground-faint)}.consul-exposed-path-list>ul>li>.detail a,.consul-lock-session-list ul>li:not(:first-child)>.detail a,.consul-upstream-instance-list li>.detail a,.list-collection>ul>li:not(:first-child)>.detail a{color:inherit}.consul-exposed-path-list>ul>li>.detail a:hover,.consul-lock-session-list ul>li:not(:first-child)>.detail a:hover,.consul-upstream-instance-list li>.detail a:hover,.list-collection>ul>li:not(:first-child)>.detail a:hover{color:var(--token-color-foreground-action);text-decoration:underline}.consul-exposed-path-list>ul>li>.header dt,.consul-lock-session-list ul>li:not(:first-child)>.header dt,.consul-upstream-instance-list li>.header dt,.list-collection>ul>li:not(:first-child)>.header dt{display:none}.consul-exposed-path-list>ul>li>.header dd::before,.consul-lock-session-list ul>li:not(:first-child)>.header dd::before,.consul-upstream-instance-list li>.header dd::before,.list-collection>ul>li:not(:first-child)>.header dd::before{font-size:.9em}.consul-exposed-path-list>ul>li>.detail,.consul-exposed-path-list>ul>li>.header,.consul-lock-session-list ul>li:not(:first-child)>.detail,.consul-lock-session-list ul>li:not(:first-child)>.header,.consul-upstream-instance-list li>.detail,.consul-upstream-instance-list li>.header,.list-collection>ul>li:not(:first-child)>.detail,.list-collection>ul>li:not(:first-child)>.header{display:flex;flex-wrap:nowrap;overflow-x:hidden}.consul-exposed-path-list>ul>li>.detail *,.consul-exposed-path-list>ul>li>.header *,.consul-lock-session-list ul>li:not(:first-child)>.detail *,.consul-lock-session-list ul>li:not(:first-child)>.header *,.consul-upstream-instance-list li>.detail *,.consul-upstream-instance-list li>.header *,.list-collection>ul>li:not(:first-child)>.detail *,.list-collection>ul>li:not(:first-child)>.header *{white-space:nowrap;flex-wrap:nowrap}.consul-exposed-path-list>ul>li>.detail>span,.consul-lock-session-list ul>li:not(:first-child)>.detail>span,.consul-upstream-instance-list li>.detail>span,.list-collection>ul>li:not(:first-child)>.detail>span{margin-right:18px}.consul-intention-permission-header-list>ul>li,.consul-intention-permission-list>ul>li{padding-top:0!important;padding-bottom:0!important}.consul-intention-permission-header-list>ul>li .detail,.consul-intention-permission-list>ul>li .detail{grid-row-start:header!important;grid-row-end:detail!important;align-self:center!important;padding:5px 0}.consul-intention-permission-header-list>ul>li .popover-menu>[type=checkbox]+label,.consul-intention-permission-list>ul>li .popover-menu>[type=checkbox]+label{padding:0}.consul-intention-permission-header-list>ul>li .popover-menu>[type=checkbox]+label+div:not(.above),.consul-intention-permission-list>ul>li .popover-menu>[type=checkbox]+label+div:not(.above){top:30px}.has-error>strong{font-style:normal;font-weight:400;color:inherit;color:var(--token-color-foreground-critical);position:relative;padding-left:20px}.has-error>strong::before{font-size:14px;color:var(--token-color-foreground-critical);position:absolute;top:50%;left:0;margin-top:-8px}.more-popover-menu .popover-menu>[type=checkbox]+label,table.has-actions tr>.actions .popover-menu>[type=checkbox]+label,table.with-details tr>.actions .popover-menu>[type=checkbox]+label{padding:7px}.more-popover-menu .popover-menu>[type=checkbox]+label>*,table.has-actions tr>.actions .popover-menu>[type=checkbox]+label>*,table.with-details tr>.actions .popover-menu>[type=checkbox]+label>*{background-color:transparent;border-radius:var(--decor-radius-100);width:30px;height:30px;font-size:0}.more-popover-menu .popover-menu>[type=checkbox]+label>:active,.more-popover-menu .popover-menu>[type=checkbox]+label>:focus,.more-popover-menu .popover-menu>[type=checkbox]+label>:hover,.radio-card>:first-child,table.has-actions tr>.actions .popover-menu>[type=checkbox]+label>:active,table.has-actions tr>.actions .popover-menu>[type=checkbox]+label>:focus,table.has-actions tr>.actions .popover-menu>[type=checkbox]+label>:hover,table.with-details td:only-child>div>label:active,table.with-details td:only-child>div>label:focus,table.with-details td:only-child>div>label:hover,table.with-details td>label:active,table.with-details td>label:focus,table.with-details td>label:hover,table.with-details tr>.actions .popover-menu>[type=checkbox]+label>:active,table.with-details tr>.actions .popover-menu>[type=checkbox]+label>:focus,table.with-details tr>.actions .popover-menu>[type=checkbox]+label>:hover{background-color:var(--token-color-surface-strong)}.more-popover-menu .popover-menu>[type=checkbox]+label>::after,table.has-actions tr>.actions .popover-menu>[type=checkbox]+label>::after,table.with-details tr>.actions .popover-menu>[type=checkbox]+label>::after{--icon-name:icon-more-horizontal;--icon-color:var(--token-color-foreground-strong);--icon-size:icon-300;content:"";position:absolute;top:50%;left:50%;margin-top:-8px;margin-left:-8px}.oidc-select [class$=-oidc-provider]::before{width:22px;height:22px;flex:0 0 auto;margin-right:10px}.oidc-select .ember-power-select-trigger,.oidc-select li{margin-bottom:1em}.informed-action header,.radio-card header{margin-bottom:.5em}.oidc-select .ember-power-select-trigger{width:100%}.radio-card{border:var(--decor-border-100);border-radius:var(--decor-radius-100);border-color:var(--token-color-surface-interactive-active);cursor:pointer;float:none!important;margin-right:0!important;display:flex!important}.checked.radio-card{border-color:var(--token-color-foreground-action)}.checked.radio-card>:first-child{background-color:var(--token-color-surface-action)}.radio-card header{color:var(--token-color-hashicorp-brand)}.consul-intention-fieldsets .radio-card>:last-child{padding-left:47px;position:relative}.consul-intention-fieldsets .radio-card>:last-child::before{position:absolute;left:14px;font-size:1rem}.radio-card>:first-child{padding:10px;display:grid;align-items:center;justify-items:center}.radio-card>:last-child{padding:18px}.consul-server-card,.disclosure-menu [aria-expanded]~*,.menu-panel,.more-popover-menu>[type=checkbox]+label+div,.popover-menu>[type=checkbox]+label+div,section[data-route="dc.show.license"] aside,section[data-route="dc.show.serverstatus"] .server-failure-tolerance,table.has-actions tr>.actions>[type=checkbox]+label+div,table.with-details tr>.actions>[type=checkbox]+label+div{--tone-border:var(--token-color-palette-neutral-300);border:var(--decor-border-100);border-radius:var(--decor-radius-200);box-shadow:var(--token-surface-high-box-shadow);color:var(--token-color-foreground-strong);background-color:var(--token-color-surface-primary);--padding-x:14px;--padding-y:14px;position:relative}.disclosure-menu [aria-expanded]~* [role=separator],.menu-panel [role=separator],.more-popover-menu>[type=checkbox]+label+div [role=separator],.popover-menu>[type=checkbox]+label+div [role=separator],table.has-actions tr>.actions>[type=checkbox]+label+div [role=separator],table.with-details tr>.actions>[type=checkbox]+label+div [role=separator]{border-top:var(--decor-border-100);margin:0}.consul-server-card,.disclosure-menu [aria-expanded]~*,.disclosure-menu [aria-expanded]~* [role=separator],.menu-panel,.menu-panel [role=separator],.more-popover-menu>[type=checkbox]+label+div,.more-popover-menu>[type=checkbox]+label+div [role=separator],.popover-menu>[type=checkbox]+label+div,.popover-menu>[type=checkbox]+label+div [role=separator],section[data-route="dc.show.license"] aside,section[data-route="dc.show.serverstatus"] .server-failure-tolerance,table.has-actions tr>.actions>[type=checkbox]+label+div,table.has-actions tr>.actions>[type=checkbox]+label+div [role=separator],table.with-details tr>.actions>[type=checkbox]+label+div,table.with-details tr>.actions>[type=checkbox]+label+div [role=separator]{border-color:var(--tone-border)}.paged-collection-scroll,[style*="--paged-row-height"]{overflow-y:auto!important;will-change:scrollPosition}[style*="--paged-start"]::before{content:"";display:block;height:var(--paged-start)}.consul-auth-method-type,.consul-external-source,.consul-health-check-list .health-check-output dd em,.consul-intention-list td strong,.consul-intention-permission-list strong,.consul-intention-search-bar li button span,.consul-kind,.consul-peer-search-bar li button span,.consul-server-card .health-status+dd,.consul-source,.consul-transparent-proxy,.discovery-chain .route-card>header ul li,.hashicorp-consul nav .dcs .dc-name span,.hashicorp-consul nav .dcs li.is-local span,.hashicorp-consul nav .dcs li.is-primary span,.leader,.search-bar-status li:not(.remove-all),.topology-metrics-source-type,html[data-route^="dc.acls.index"] main td strong,section[data-route="dc.show.serverstatus"] .redundancy-zones section header dl,section[data-route="dc.show.serverstatus"] .server-failure-tolerance header em,span.policy-node-identity,span.policy-service-identity{border-radius:var(--decor-radius-100);display:inline-flex;position:relative;align-items:center;white-space:nowrap}.consul-auth-method-type::before,.consul-external-source::before,.consul-health-check-list .health-check-output dd em::before,.consul-intention-list td strong::before,.consul-intention-permission-list strong::before,.consul-intention-search-bar li button span::before,.consul-kind::before,.consul-peer-search-bar li button span::before,.consul-server-card .health-status+dd::before,.consul-source::before,.consul-transparent-proxy::before,.discovery-chain .route-card>header ul li::before,.hashicorp-consul nav .dcs .dc-name span::before,.hashicorp-consul nav .dcs li.is-local span::before,.hashicorp-consul nav .dcs li.is-primary span::before,.leader::before,.search-bar-status li:not(.remove-all)::before,.topology-metrics-source-type::before,html[data-route^="dc.acls.index"] main td strong::before,section[data-route="dc.show.serverstatus"] .redundancy-zones section header dl::before,section[data-route="dc.show.serverstatus"] .server-failure-tolerance header em::before,span.policy-node-identity::before,span.policy-service-identity::before{margin-right:4px;--icon-size:icon-300}.consul-auth-method-type,.consul-external-source,.consul-kind,.consul-server-card .health-status+dd,.consul-source,.consul-transparent-proxy,.hashicorp-consul nav .dcs .dc-name span,.leader,.search-bar-status li:not(.remove-all),.topology-metrics-source-type,section[data-route="dc.show.serverstatus"] .server-failure-tolerance header em,span.policy-node-identity,span.policy-service-identity{padding:0 8px;--icon-size:icon-200}.consul-intention-permission-list strong,.consul-peer-search-bar li button span,.discovery-chain .route-card>header ul li,html[data-route^="dc.acls.index"] main td strong,section[data-route="dc.show.serverstatus"] .redundancy-zones section header dl{padding:1px 5px}.consul-intention-list td strong,.consul-intention-search-bar li button span{padding:4px 8px}span.policy-node-identity::before,span.policy-service-identity::before{vertical-align:unset}span.policy-node-identity::before{content:"Node Identity: "}span.policy-service-identity::before{content:"Service Identity: "}.more-popover-menu>[type=checkbox]+label>*,.popover-menu>[type=checkbox]+label>*,table.has-actions tr>.actions>[type=checkbox]+label>*,table.with-details tr>.actions>[type=checkbox]+label>*{cursor:pointer}.more-popover-menu>[type=checkbox]+label>::after,.popover-menu>[type=checkbox]+label>::after,table.has-actions tr>.actions>[type=checkbox]+label>::after,table.with-details tr>.actions>[type=checkbox]+label>::after{width:16px;height:16px;position:relative}.more-popover-menu,.popover-menu,table.has-actions tr>.actions,table.with-details tr>.actions{position:relative}.more-popover-menu>[type=checkbox]+label,.popover-menu>[type=checkbox]+label,table.has-actions tr>.actions>[type=checkbox]+label,table.with-details tr>.actions>[type=checkbox]+label{display:block}.more-popover-menu>[type=checkbox]+label+div,.popover-menu>[type=checkbox]+label+div,table.has-actions tr>.actions>[type=checkbox]+label+div,table.with-details tr>.actions>[type=checkbox]+label+div{min-width:192px}.more-popover-menu>[type=checkbox]+label+div:not(.above),.popover-menu>[type=checkbox]+label+div:not(.above),table.has-actions tr>.actions>[type=checkbox]+label+div:not(.above),table.with-details tr>.actions>[type=checkbox]+label+div:not(.above){top:38px}.more-popover-menu>[type=checkbox]+label+div:not(.left),.popover-menu>[type=checkbox]+label+div:not(.left),table.has-actions tr>.actions>[type=checkbox]+label+div:not(.left),table.with-details tr>.actions>[type=checkbox]+label+div:not(.left){right:5px}.popover-menu .menu-panel{position:absolute!important}.popover-select label{height:100%}.popover-select label>*{padding:0 8px!important;height:100%!important;justify-content:space-between!important;min-width:auto!important}.popover-select label>::after{margin-left:6px}.popover-select button::before{margin-right:10px}.popover-select .value-passing button::before{color:var(--token-color-foreground-success)}.popover-select .value-warning button::before{color:var(--token-color-foreground-warning)}.popover-select .value-critical button::before{color:var(--token-color-foreground-critical)}.popover-select .value-empty button::before{color:var(--token-color-foreground-disabled)}.popover-select .value-unknown button::before,.type-source.popover-select li.partition button::before{color:var(--token-color-foreground-faint)}.type-source.popover-select li.aws button{text-transform:uppercase}.progress.indeterminate{width:100%;display:flex;align-items:center;justify-content:center;--icon-size:icon-700;--icon-name:var(--icon-loading);--icon-color:var(--token-color-foreground-faint)}.progress.indeterminate::before{content:""}.app-view>div form:not(.filter-bar) [role=radiogroup],.modal-dialog [role=document] [role=radiogroup]{overflow:hidden;padding-left:1px}.app-view>div form:not(.filter-bar) [role=radiogroup] label,.modal-dialog [role=document] [role=radiogroup] label{float:left}.app-view>div form:not(.filter-bar) [role=radiogroup] label>span,.modal-dialog [role=document] [role=radiogroup] label>span{float:right;margin-left:1em}.app-view>div form:not(.filter-bar) [role=radiogroup] label:not(:last-child),.modal-dialog [role=document] [role=radiogroup] label:not(:last-child){margin-right:25px}.app-view>div form:not(.filter-bar) [role=radiogroup] label,.app-view>div form:not(.filter-bar) [role=radiogroup] label>span,.modal-dialog [role=document] [role=radiogroup] label,.modal-dialog [role=document] [role=radiogroup] label>span{margin-bottom:0!important}.type-toggle label span{cursor:pointer}.type-toggle label span::after{border-radius:var(--decor-radius-full)}.type-toggle label span::before{border-radius:7px;left:0;width:24px;height:12px;margin-top:-5px}.type-negative.type-toggle{border:0}.app-view>header .title,.modal-dialog [role=document] table td,.modal-dialog [role=document] table th,main table td,main table th{border-bottom:var(--decor-border-100)}.type-toggle label span::after{background-color:var(--token-color-surface-primary);margin-top:-3px;width:8px;height:8px}.app .skip-links,.type-negative.type-toggle label input+span::before,.type-toggle label input:checked+span::before{background-color:var(--token-color-foreground-action)}.type-negative.type-toggle label input:checked+span::before,.type-toggle label span::before{background-color:var(--token-color-palette-neutral-300)}.type-toggle label{position:relative}.type-toggle input{display:none}.type-toggle label span{color:var(--token-color-foreground-strong);display:inline-block;padding-left:34px}.type-toggle label span::after,.type-toggle label span::before{position:absolute;display:block;content:"";top:50%}.type-negative.type-toggle label input+span::after,.type-toggle label input:checked+span::after{left:14px}.type-negative.type-toggle label input:checked+span::after,.type-toggle label span::after{left:2px}.modal-dialog [role=document] table th,main table th{border-color:var(--token-color-palette-neutral-300);padding:.6em 0}.modal-dialog [role=document] table td,main table td{border-color:var(--token-color-surface-interactive-active);color:var(--token-color-foreground-faint);height:50px;vertical-align:middle}.modal-dialog [role=document] table td strong,.modal-dialog [role=document] table th,main table td strong,main table th{color:var(--token-color-foreground-faint)}.consul-intention-list td.destination,.consul-intention-list td.source,.modal-dialog [role=document] table a,.modal-dialog [role=document] table td:first-child,.tomography-graph .tick text,main table a,main table td:first-child{color:var(--token-color-foreground-strong)}.modal-dialog [role=document] table,main table{width:100%;border-collapse:collapse}table.dom-recycling tr{display:flex}table.dom-recycling tr>*{flex:1 1 auto;display:inline-flex;align-items:center}.modal-dialog [role=document] table caption,.modal-dialog [role=document] table thead th,main table caption,main table thead th{text-align:left}.modal-dialog [role=document] table th.actions input,main table th.actions input{display:none}.modal-dialog [role=document] table th.actions,main table th.actions{text-align:right}.modal-dialog [role=document] table td a,main table td a{display:block}.modal-dialog [role=document] table td.no-actions~.actions,main table td.no-actions~.actions{display:none}.modal-dialog [role=document] table td:not(.actions)>:only-child,main table td:not(.actions)>:only-child{overflow:hidden;text-overflow:ellipsis}.modal-dialog [role=document] table td:not(.actions)>*,main table td:not(.actions)>*{white-space:nowrap}.modal-dialog [role=document] table caption,main table caption{margin-bottom:.8em}.modal-dialog [role=document] table td a,.modal-dialog [role=document] table td:not(.actions),.modal-dialog [role=document] table th:not(.actions),main table td a,main table td:not(.actions),main table th:not(.actions){padding-right:.9em}.modal-dialog [role=document] table tbody td em,main table tbody td em{display:block;font-style:normal;font-weight:400;color:var(--token-color-foreground-faint)}table.has-actions tr>.actions,table.with-details tr>.actions{width:60px!important;overflow:visible}table.has-actions tr>.actions>[type=checkbox]+label,table.with-details tr>.actions>[type=checkbox]+label{position:absolute;right:5px}table.consul-metadata-list tbody tr{cursor:default}table.consul-metadata-list tbody tr:hover{box-shadow:none}.modal-dialog [role=document] table th span::after,main table th span::after{color:var(--token-color-foreground-faint);margin-left:4px}.modal-dialog [role=document] table tbody tr,main table tbody tr{cursor:pointer}.modal-dialog [role=document] table td:first-child,main table td:first-child{padding:0}.modal-dialog [role=document] table tbody tr:hover,main table tbody tr:hover{box-shadow:var(--token-elevation-high-box-shadow)}.modal-dialog [role=document] table td.folder::before,main table td.folder::before{background-color:var(--token-color-palette-neutral-300);margin-top:1px;margin-right:5px}@media (max-width:420px){.consul-intention-list tr>:nth-last-child(2),.modal-dialog [role=document] table tr>.actions,main table tr>.actions{display:none}}.voting-status-leader.consul-server-card .name{width:var(--tile-size,3rem);height:var(--tile-size,3rem)}.voting-status-leader.consul-server-card .name::before{display:block;content:"";width:100%;height:100%;border-radius:var(--decor-radius-250);border:var(--decor-border-100);background-image:linear-gradient(135deg,var(--token-color-consul-surface) 0,var(--token-color-consul-border) 100%);border-color:var(--token-color-border-faint)}.voting-status-leader.consul-server-card .name::after{content:"";position:absolute;top:calc(var(--tile-size,3rem)/ 4);left:calc(var(--tile-size,3rem)/ 4);--icon-name:icon-star-fill;--icon-size:icon-700;color:var(--token-color-consul-brand)}table.with-details td:only-child>div>label,table.with-details td>label{border-radius:var(--decor-radius-100);cursor:pointer;min-width:30px;min-height:30px;display:inline-flex;align-items:center;justify-content:center}table.dom-recycling tbody{top:33px!important;width:100%}table.dom-recycling caption~tbody{top:57px!important}table tr>:nth-last-child(2):first-child,table tr>:nth-last-child(2):first-child~*{width:50%}table tr>:nth-last-child(3):first-child,table tr>:nth-last-child(3):first-child~*{width:33.3333333333%}table tr>:nth-last-child(4):first-child,table tr>:nth-last-child(4):first-child~*{width:25%}table tr>:nth-last-child(5):first-child,table tr>:nth-last-child(5):first-child~*{width:20%}table.has-actions tr>:nth-last-child(2):first-child,table.has-actions tr>:nth-last-child(2):first-child~*{width:calc(100% - 60px)}table.has-actions tr>:nth-last-child(3):first-child,table.has-actions tr>:nth-last-child(3):first-child~*{width:calc(50% - 30px)}table.has-actions tr>:nth-last-child(4):first-child,table.has-actions tr>:nth-last-child(4):first-child~*{width:calc(33% - 20px)}table.has-actions tr>:nth-last-child(5):first-child,table.has-actions tr>:nth-last-child(5):first-child~*{width:calc(25% - 15px)}html[data-route^="dc.acls.policies"] [role=dialog] table tr>:not(last-child),html[data-route^="dc.acls.policies"] table tr>:not(last-child),html[data-route^="dc.acls.roles"] [role=dialog] table tr>:not(last-child),html[data-route^="dc.acls.roles"] main table.token-list tr>:not(last-child){width:120px}html[data-route^="dc.acls.policies"] table tr>:last-child,html[data-route^="dc.acls.roles"] [role=dialog] table tr>:last-child,html[data-route^="dc.acls.roles"] main table.token-list tr>:last-child{width:calc(100% - 240px)!important}table.with-details td:only-child{cursor:default;border:0}table.with-details td:only-child>div::before,table.with-details td:only-child>div>div,table.with-details td:only-child>div>label{background-color:var(--token-color-surface-primary)}table.with-details td:only-child>div>label::before{transform:rotate(180deg)}table.with-details td:only-child>div::before{background:var(--token-color-surface-interactive-active);content:"";display:block;height:1px;position:absolute;bottom:-20px;left:10px;width:calc(100% - 20px)}table.with-details tr>.actions{position:relative}table.with-details td:only-child>div>label,table.with-details td>label{pointer-events:auto;position:absolute;top:8px}table.with-details td:only-child>div>label span,table.with-details td>label span{display:none}table.with-details td>label{right:2px}table.with-details tr:nth-child(even) td{height:auto;position:relative;display:table-cell}table.with-details tr:nth-child(even) td>*{display:none}table.with-details td:only-child>div>label{right:11px}table.with-details tr:nth-child(even) td>input:checked+*{display:block}table.with-details td:only-child{overflow:visible;width:100%}table.with-details td:only-child>div{border:1px solid var(--token-color-palette-neutral-300);border-radius:var(--decor-radius-100);box-shadow:var(--token-surface-high-box-shadow);margin-bottom:20px;position:relative;left:-10px;right:-10px;width:calc(100% + 20px);margin-top:-51px;pointer-events:none;padding:10px}table.with-details td:only-child>div::after{content:"";display:block;clear:both}table.with-details td:only-child>div>div{pointer-events:auto;margin-top:36px}.consul-auth-method-binding-list dl,.consul-auth-method-view dl,.consul-auth-method-view section dl{display:flex;flex-wrap:wrap}.consul-auth-method-binding-list dl dd,.consul-auth-method-binding-list dl dt,.consul-auth-method-view dl dd,.consul-auth-method-view dl dt{padding:12px 0;margin:0;border-top:1px solid!important}.consul-auth-method-binding-list dl dt,.consul-auth-method-view dl dt{width:20%;font-weight:var(--typo-weight-bold)}.consul-auth-method-binding-list dl dd,.consul-auth-method-view dl dd{margin-left:auto;width:80%;display:flex}.consul-auth-method-binding-list dl dd>ul li,.consul-auth-method-view dl dd>ul li{display:flex}.consul-auth-method-binding-list dl dd>ul li:not(:last-of-type),.consul-auth-method-view dl dd>ul li:not(:last-of-type){padding-bottom:12px}.consul-auth-method-binding-list dl dt.check+dd,.consul-auth-method-view dl dt.check+dd{padding-top:16px}.consul-auth-method-binding-list dl>dd:last-of-type,.consul-auth-method-binding-list dl>dt:last-of-type,.consul-auth-method-view dl>dd:last-of-type,.consul-auth-method-view dl>dt:last-of-type{border-bottom:1px solid!important;border-color:var(--token-color-palette-neutral-300)!important}.consul-auth-method-binding-list dl dd,.consul-auth-method-binding-list dl dt,.consul-auth-method-view dl dd,.consul-auth-method-view dl dt{border-color:var(--token-color-palette-neutral-300)!important;color:var(--token-color-hashicorp-brand)!important}.consul-auth-method-binding-list dl dd .copy-button button::before,.consul-auth-method-view dl dd .copy-button button::before{background-color:var(--token-color-hashicorp-brand)}.consul-auth-method-binding-list dl dt.type+dd span::before,.consul-auth-method-view dl dt.type+dd span::before{margin-left:4px;background-color:var(--token-color-foreground-faint)}.tooltip-panel dt{cursor:pointer}.tooltip-panel dd>div::before{width:12px;height:12px;background-color:var(--token-color-surface-primary);border-top:1px solid var(--token-color-palette-neutral-300);border-right:1px solid var(--token-color-palette-neutral-300);transform:rotate(-45deg);position:absolute;left:16px;top:-7px}.tooltip-panel,.tooltip-panel dt{display:flex;flex-direction:column}.tooltip-panel dd>div.menu-panel{top:auto;overflow:visible}.tooltip-panel dd{display:none;position:relative;z-index:1;padding-top:10px;margin-bottom:-10px}.tooltip-panel:hover dd{display:block}.tooltip-panel dd>div{width:250px}.app-view>header .title{display:grid;grid-template-columns:1fr auto;grid-template-areas:"title actions";position:relative;z-index:5;padding-bottom:1.4em}.app-view>div form:not(.filter-bar) fieldset{border-bottom:var(--decor-border-200)}.app-view>header h1>em{color:var(--token-color-foreground-faint)}.app-view>header dd>a{color:var(--token-color-hashicorp-brand)}.app-view>div div>dl>dd,[role=contentinfo]{color:var(--token-color-foreground-disabled)}.app-view>div form:not(.filter-bar) fieldset,.app-view>header .title{border-color:var(--token-color-surface-interactive-active)}.app-view>header .title .title-left-container{grid-area:title;display:flex;flex-wrap:wrap;align-items:center;white-space:normal}.app-view>header .title .title-left-container>:first-child{flex-basis:100%}.app-view>header .title .title-left-container>:not(:first-child){margin-right:8px}.app-view>header .actions{grid-area:actions;align-self:end;display:flex;align-items:flex-start;margin-left:auto;margin-top:9px}.app-view>div form:not(.filter-bar) fieldset{padding-bottom:.3em;margin-bottom:2em}[for=toolbar-toggle]{background-position:0 4px;display:inline-block;width:26px;height:26px;cursor:pointer;color:var(--token-color-foreground-action)}#toolbar-toggle{display:none}@media (max-width:849px){.app-view>header .actions{margin-top:9px}}@media (min-width:996px){[for=toolbar-toggle]{display:none}}@media (max-width:995px){.app-view>header h1{display:inline-block}html[data-route$="dc.services.instance.show"] h1{display:block}#toolbar-toggle+*{display:none}#toolbar-toggle:checked+*{display:flex}}.brand-loader{position:absolute;top:50%;margin-top:-26px;left:50%}.app .skip-links{outline:solid var(--token-color-surface-primary);color:var(--token-color-surface-primary);display:flex;flex-direction:column;position:absolute;z-index:10;left:50%;padding:20px;top:-100px;transform:translateX(-50%)}.app .skip-links a,.app .skip-links button{color:inherit}.app .skip-links a,.app .skip-links button,.app .skip-links div{display:block;width:100%;text-align:center;box-sizing:border-box}.app .skip-links:focus-within{top:0}.app .notifications{position:fixed;z-index:100;bottom:2rem;left:1.5rem;pointer-events:none}.app .notifications .app-notification>*{min-width:400px}.app .notifications .app-notification{transition-property:opacity;width:-webkit-fit-content;width:-moz-fit-content;width:fit-content;max-width:80%;pointer-events:auto}[role=banner] nav:last-of-type{margin-left:auto}.hashicorp-consul nav .dcs{top:18px}.hashicorp-consul nav .dcs [aria-label]::before{display:none!important}[role=banner] nav:last-of-type [aria-haspopup=menu]~*{position:absolute;right:0;min-width:192px}[role=contentinfo]{position:fixed;z-index:50;width:250px;padding-left:25px;top:calc(100vh - 42px);top:calc(max(100vh,460px) - 42px)}html.has-partitions.has-nspaces .app [role=contentinfo]{top:calc(100vh - 42px);top:calc(max(100vh,640px) - 42px)}[role=banner] nav:first-of-type{z-index:10}[role=banner] nav:first-of-type,[role=contentinfo]{transition-property:left}.app .notifications,main{margin-top:var(--chrome-height,64px);transition-property:margin-left}.app .notifications{transition-property:margin-left,width}@media (min-width:900px){.app>input[id]~main .notifications{width:calc(100% - var(--chrome-width))}.app>input[id]:checked~main .notifications{width:100%}.app>input[id]+header>div>nav:first-of-type,.app>input[id]~footer{left:0}.app>input[id]:checked+header>div>nav:first-of-type,.app>input[id]:checked~footer{left:calc(var(--chrome-width,280px) * -1)}.app>input[id]~main{margin-left:var(--chrome-width,280px)}.app>input[id]:checked~main,.app>input[id]:checked~main .notifications{margin-left:0}}@media (max-width:899px){.app>input[id]~main .notifications{width:100%}.app>input[id]:checked+header>div>nav:first-of-type,.app>input[id]:checked~footer{left:0}.app>input[id]+header>div>nav:first-of-type,.app>input[id]~footer{left:calc(var(--chrome-width,280px) * -1)}.app>input[id]~main,.app>input[id]~main .notifications{margin-left:0}}[role=banner]::before{background-color:var(--token-color-hashicorp-brand);content:"";position:absolute;z-index:-1;left:0;width:100vw}[role=banner]{display:flex;position:fixed;z-index:50;left:0;padding:0 25px;width:calc(100% - 50px);align-items:center}[role=banner],[role=banner]::before{height:var(--chrome-height)}[role=banner]>a{display:block;line-height:0;font-size:0}.hashicorp-consul nav .dcs [aria-expanded]>a,[role=banner] nav:last-of-type [aria-expanded]>a,[role=banner] nav:last-of-type>ul>li>a>a,[role=banner] nav:last-of-type>ul>li>button>a,[role=banner] nav:last-of-type>ul>li>span>a{color:inherit}.hashicorp-consul nav .dcs [aria-expanded]::after,[role=banner] nav:last-of-type [aria-expanded]::after{--icon-name:icon-chevron-down;content:""}.hashicorp-consul nav .dcs [aria-expanded=true][aria-expanded]::after,[role=banner] nav:last-of-type [aria-expanded=true][aria-expanded]::after{transform:scaleY(-100%)}[role=banner] nav:last-of-type .disclosure-menu button+*,[role=banner] nav:last-of-type .disclosure-menu button+*>ul[role=menu],[role=banner] nav:last-of-type .disclosure-menu button+*>ul[role=menu]>li>[role=menuitem]{background-color:var(--token-color-hashicorp-brand);color:var(--token-color-palette-neutral-300)}[role=banner] nav:last-of-type .disclosure-menu button+*>ul[role=menu]>li>[role=menuitem]:hover{background-color:var(--token-color-palette-neutral-600)}.app>input[id]{display:none}.disclosure-menu [aria-expanded]~*>ul>[role=treeitem],.disclosure-menu [aria-expanded]~*>ul>li>[role=menuitem],.disclosure-menu [aria-expanded]~*>ul>li>[role=option],.menu-panel>ul>[role=treeitem],.menu-panel>ul>li>[role=menuitem],.menu-panel>ul>li>[role=option],.more-popover-menu>[type=checkbox]+label+div>ul>[role=treeitem],.more-popover-menu>[type=checkbox]+label+div>ul>li>[role=menuitem],.more-popover-menu>[type=checkbox]+label+div>ul>li>[role=option],.popover-menu>[type=checkbox]+label+div>ul>[role=treeitem],.popover-menu>[type=checkbox]+label+div>ul>li>[role=menuitem],.popover-menu>[type=checkbox]+label+div>ul>li>[role=option],[role=banner] nav:last-of-type>ul,[role=banner]>div,[role=banner]>label,table.has-actions tr>.actions>[type=checkbox]+label+div>ul>[role=treeitem],table.has-actions tr>.actions>[type=checkbox]+label+div>ul>li>[role=menuitem],table.has-actions tr>.actions>[type=checkbox]+label+div>ul>li>[role=option],table.with-details tr>.actions>[type=checkbox]+label+div>ul>[role=treeitem],table.with-details tr>.actions>[type=checkbox]+label+div>ul>li>[role=menuitem],table.with-details tr>.actions>[type=checkbox]+label+div>ul>li>[role=option]{display:flex}[role=banner]>label::before{--icon-name:icon-menu;--icon-color:var(--token-color-palette-neutral-300);content:"";cursor:pointer}.hashicorp-consul nav .dcs [aria-expanded],[role=banner] nav:last-of-type .popover-menu [type=checkbox]:checked+label>*,[role=banner] nav:last-of-type [aria-expanded],[role=banner] nav:last-of-type>ul>li>.popover-menu>label>button,[role=banner] nav:last-of-type>ul>li>a,[role=banner] nav:last-of-type>ul>li>button,[role=banner] nav:last-of-type>ul>li>span{color:var(--token-color-palette-neutral-300)}[role=banner]>label{align-items:center;height:100%;padding:0 1rem 0 5px}[role=banner]>div{justify-content:space-between;flex-grow:1}[role=banner] nav:last-of-type .disclosure-menu button+*{z-index:400;top:28px!important}.hashicorp-consul nav .dcs [aria-expanded],[role=banner] nav:last-of-type [aria-expanded],[role=banner] nav:last-of-type>ul>li>.popover-menu>label>button,[role=banner] nav:last-of-type>ul>li>a,[role=banner] nav:last-of-type>ul>li>button,[role=banner] nav:last-of-type>ul>li>span{border-radius:var(--decor-radius-200);cursor:pointer;display:block;padding:5px 12px;white-space:nowrap}[role=banner] nav:last-of-type .popover-menu>label{padding-right:5px}[role=banner] nav:last-of-type .popover-menu>label>*{padding-right:4px!important}[role=banner] nav:last-of-type .popover-menu>label>button::after{top:2px}[role=banner] nav:last-of-type>ul>li>span{cursor:default}[role=banner] nav:first-of-type a>a,[role=banner] nav:first-of-type>ul>li>label>a{color:inherit;font-size:inherit}[role=banner] nav:first-of-type [role=separator]{text-transform:uppercase;font-weight:var(--typo-weight-medium)}[role=banner] nav:first-of-type a:focus,[role=banner] nav:first-of-type a:hover,[role=banner] nav:first-of-type>ul>li>label:focus,[role=banner] nav:first-of-type>ul>li>label:hover{text-decoration:underline}.tab-nav li>*,[role=banner] nav:first-of-type>ul>li.is-active>a:focus:not(:active),[role=banner] nav:first-of-type>ul>li.is-active>a:hover:not(:active){text-decoration:none}[role=banner] nav:first-of-type{background-color:var(--token-color-foreground-strong);color:var(--token-color-foreground-faint)}[role=banner] nav:first-of-type li:not([role=separator])>span{color:var(--token-color-palette-neutral-300)}.hashicorp-consul nav .dcs [role=separator],[role=banner] nav:first-of-type [role=separator]{color:var(--token-color-palette-neutral-400);background-color:var(--token-color-foreground-strong)}[role=banner] nav:first-of-type a,[role=banner] nav:first-of-type>ul>li>label{cursor:pointer;border-right:var(--decor-border-400);border-color:transparent;color:var(--token-color-palette-neutral-300)}[role=banner] nav:first-of-type a:focus,[role=banner] nav:first-of-type a:hover,[role=banner] nav:first-of-type>ul>li.is-active>a,[role=banner] nav:first-of-type>ul>li>label:focus,[role=banner] nav:first-of-type>ul>li>label:hover,[role=banner] nav:first-of-type>ul>li[aria-label]{color:var(--token-color-palette-neutral-0)}[role=banner] nav:first-of-type>ul>li.is-active>a{background-color:var(--token-color-palette-neutral-500);border-color:var(--token-color-palette-neutral-0)}[role=banner] nav:first-of-type [aria-label]::before{color:var(--token-color-palette-neutral-400);content:attr(aria-label);display:block;margin-top:-.5rem;margin-bottom:.5rem}.hashicorp-consul nav li.nspaces .disclosure-menu>button,.hashicorp-consul nav li.partitions .disclosure-menu>button{border:var(--decor-border-100);border-color:var(--token-color-foreground-faint);border-radius:var(--decor-radius-100);font-weight:inherit;background-color:var(--token-color-foreground-strong);color:var(--token-color-palette-neutral-200)}.hashicorp-consul nav li.nspaces .disclosure-menu>button:focus,.hashicorp-consul nav li.nspaces .disclosure-menu>button:hover,.hashicorp-consul nav li.partitions .disclosure-menu>button:focus,.hashicorp-consul nav li.partitions .disclosure-menu>button:hover,[role=banner] nav:first-of-type ul[role=menu] li a[role=menuitem]{color:var(--token-color-palette-neutral-300);background-color:var(--token-color-foreground-strong)}[role=banner] nav:first-of-type ul[role=menu] li a[role=menuitem]:hover{background-color:var(--token-color-palette-neutral-600)}.hashicorp-consul nav li.nspaces .disclosure-menu>button[aria-expanded=true],.hashicorp-consul nav li.partitions .disclosure-menu>button[aria-expanded=true]{border-bottom-left-radius:var(--decor-radius-000);border-bottom-right-radius:var(--decor-radius-000)}.disclosure-menu [aria-expanded]~* [role=banner] nav:first-of-type [role=separator],.disclosure-menu [aria-expanded]~* [role=banner] nav:last-of-type [role=separator],.disclosure-menu [role=banner] nav:first-of-type [aria-expanded]~*,.disclosure-menu [role=banner] nav:last-of-type [aria-expanded]~*,.menu-panel [role=banner] nav:first-of-type [role=separator],.menu-panel [role=banner] nav:last-of-type [role=separator],.more-popover-menu>[type=checkbox]+label+div [role=banner] nav:first-of-type [role=separator],.more-popover-menu>[type=checkbox]+label+div [role=banner] nav:last-of-type [role=separator],.popover-menu>[type=checkbox]+label+div [role=banner] nav:first-of-type [role=separator],.popover-menu>[type=checkbox]+label+div [role=banner] nav:last-of-type [role=separator],[role=banner] nav:first-of-type .consul-server-card,[role=banner] nav:first-of-type .disclosure-menu [aria-expanded]~*,[role=banner] nav:first-of-type .disclosure-menu [aria-expanded]~* [role=separator],[role=banner] nav:first-of-type .menu-panel,[role=banner] nav:first-of-type .menu-panel [role=separator],[role=banner] nav:first-of-type .more-popover-menu>[type=checkbox]+label+div,[role=banner] nav:first-of-type .more-popover-menu>[type=checkbox]+label+div [role=separator],[role=banner] nav:first-of-type .popover-menu>[type=checkbox]+label+div,[role=banner] nav:first-of-type .popover-menu>[type=checkbox]+label+div [role=separator],[role=banner] nav:first-of-type section[data-route="dc.show.license"] aside,[role=banner] nav:first-of-type section[data-route="dc.show.serverstatus"] .server-failure-tolerance,[role=banner] nav:first-of-type table.has-actions tr>.actions>[type=checkbox]+label+div,[role=banner] nav:first-of-type table.has-actions tr>.actions>[type=checkbox]+label+div [role=separator],[role=banner] nav:first-of-type table.with-details tr>.actions>[type=checkbox]+label+div,[role=banner] nav:first-of-type table.with-details tr>.actions>[type=checkbox]+label+div [role=separator],[role=banner] nav:last-of-type .consul-server-card,[role=banner] nav:last-of-type .disclosure-menu [aria-expanded]~*,[role=banner] nav:last-of-type .disclosure-menu [aria-expanded]~* [role=separator],[role=banner] nav:last-of-type .menu-panel,[role=banner] nav:last-of-type .menu-panel [role=separator],[role=banner] nav:last-of-type .more-popover-menu>[type=checkbox]+label+div,[role=banner] nav:last-of-type .more-popover-menu>[type=checkbox]+label+div [role=separator],[role=banner] nav:last-of-type .popover-menu>[type=checkbox]+label+div,[role=banner] nav:last-of-type .popover-menu>[type=checkbox]+label+div [role=separator],[role=banner] nav:last-of-type section[data-route="dc.show.license"] aside,[role=banner] nav:last-of-type section[data-route="dc.show.serverstatus"] .server-failure-tolerance,[role=banner] nav:last-of-type table.has-actions tr>.actions>[type=checkbox]+label+div,[role=banner] nav:last-of-type table.has-actions tr>.actions>[type=checkbox]+label+div [role=separator],[role=banner] nav:last-of-type table.with-details tr>.actions>[type=checkbox]+label+div,[role=banner] nav:last-of-type table.with-details tr>.actions>[type=checkbox]+label+div [role=separator],section[data-route="dc.show.license"] [role=banner] nav:first-of-type aside,section[data-route="dc.show.license"] [role=banner] nav:last-of-type aside,section[data-route="dc.show.serverstatus"] [role=banner] nav:first-of-type .server-failure-tolerance,section[data-route="dc.show.serverstatus"] [role=banner] nav:last-of-type .server-failure-tolerance,table.has-actions [role=banner] nav:first-of-type tr>.actions>[type=checkbox]+label+div,table.has-actions [role=banner] nav:last-of-type tr>.actions>[type=checkbox]+label+div,table.has-actions tr>.actions>[type=checkbox]+label+div [role=banner] nav:first-of-type [role=separator],table.has-actions tr>.actions>[type=checkbox]+label+div [role=banner] nav:last-of-type [role=separator],table.with-details [role=banner] nav:first-of-type tr>.actions>[type=checkbox]+label+div,table.with-details [role=banner] nav:last-of-type tr>.actions>[type=checkbox]+label+div,table.with-details tr>.actions>[type=checkbox]+label+div [role=banner] nav:first-of-type [role=separator],table.with-details tr>.actions>[type=checkbox]+label+div [role=banner] nav:last-of-type [role=separator]{border-color:var(--token-color-foreground-faint)}.hashicorp-consul nav li.nspaces .disclosure-menu>button::after,.hashicorp-consul nav li.partitions .disclosure-menu>button::after{width:16px;height:16px;position:relative;float:right}.hashicorp-consul nav li.nspaces .disclosure-menu button+*,.hashicorp-consul nav li.partitions .disclosure-menu button+*{border-top-left-radius:var(--decor-radius-000);border-top-right-radius:var(--decor-radius-000);border-top:var(--decor-border-000);color:var(--token-color-palette-neutral-300);background-color:var(--token-color-foreground-strong)}.hashicorp-consul nav .dcs .dcs-message,.hashicorp-consul nav .dcs ul[role=menu]{background-color:var(--token-color-hashicorp-brand)}[role=banner] nav:first-of-type{position:absolute;left:0;top:var(--chrome-height,47px);width:var(--chrome-width,280px);height:calc(100vh - var(--chrome-height,47px) - 35px);padding-top:35px;overflow:auto}[role=banner] nav:first-of-type li.nspaces,[role=banner] nav:first-of-type li.partition,[role=banner] nav:first-of-type li.partitions{margin-bottom:25px;padding:0 26px}[role=banner] nav:first-of-type li.dcs{padding:0 18px}[role=banner] nav:first-of-type [role=menuitem]{justify-content:flex-start!important}[role=banner] nav:first-of-type [role=menuitem] span{margin-left:.5rem}[role=banner] nav:first-of-type [role=separator],[role=banner] nav:first-of-type a,[role=banner] nav:first-of-type li:not([role=separator])>span,[role=banner] nav:first-of-type>ul>li>label{display:block;padding:7px 25px}[role=banner] nav:first-of-type>ul>[role=separator]{margin-top:.7rem;padding-bottom:0}.hashicorp-consul nav li.nspaces .disclosure,.hashicorp-consul nav li.partitions .disclosure{position:relative}.hashicorp-consul nav li.nspaces .disclosure-menu>button,.hashicorp-consul nav li.partitions .disclosure-menu>button{width:100%;text-align:left;padding:10px}.hashicorp-consul nav li.nspaces .disclosure-menu button+*,.hashicorp-consul nav li.partitions .disclosure-menu button+*{position:absolute;z-index:1;width:calc(100% - 2px)}.hashicorp-consul nav .dcs{visibility:visible;position:fixed;z-index:10;left:100px}.hashicorp-consul nav .dcs .dcs-message{padding:8px 12px;border-bottom:1px solid var(--token-color-foreground-disabled);max-width:-webkit-fit-content;max-width:-moz-fit-content;max-width:fit-content;color:var(--token-color-palette-neutral-300)}.hashicorp-consul nav .dcs .dc-name{color:var(--token-color-foreground-faint);padding:3.25px 0;font-weight:var(--typo-weight-semibold)}.hashicorp-consul nav .dcs .dc-name span{margin-left:1rem;background-color:var(--token-color-palette-neutral-300);color:var(--token-color-hashicorp-brand)}.hashicorp-consul nav li.dcs [aria-expanded]~*{min-width:250px;max-height:560px;--paged-row-height:43px}.hashicorp-consul nav li.nspaces [aria-expanded]~*,.hashicorp-consul nav li.partitions [aria-expanded]~*{max-height:360px;--paged-row-height:43px}.hashicorp-consul [role=banner] a svg{fill:var(--token-color-consul-brand)}.hashicorp-consul .acls-separator span{color:var(--token-color-foreground-critical);display:inline-block;position:relative;top:2px;margin-left:2px}.disclosure-menu [aria-expanded]~*>div+ul,.menu-panel>div+ul,.more-popover-menu>[type=checkbox]+label+div>div+ul,.popover-menu>[type=checkbox]+label+div>div+ul,table.has-actions tr>.actions>[type=checkbox]+label+div>div+ul,table.with-details tr>.actions>[type=checkbox]+label+div>div+ul{border-top:var(--decor-border-100);border-color:var(--token-form--base-border-color-default)}.disclosure-menu [aria-expanded]~* [role=separator]:first-child:not(:empty),.menu-panel [role=separator]:first-child:not(:empty),.more-popover-menu>[type=checkbox]+label+div [role=separator]:first-child:not(:empty),.popover-menu>[type=checkbox]+label+div [role=separator]:first-child:not(:empty),table.has-actions tr>.actions>[type=checkbox]+label+div [role=separator]:first-child:not(:empty),table.with-details tr>.actions>[type=checkbox]+label+div [role=separator]:first-child:not(:empty){border:none}.disclosure-menu [aria-expanded]~* [role=separator],.menu-panel [role=separator],.more-popover-menu>[type=checkbox]+label+div [role=separator],.popover-menu>[type=checkbox]+label+div [role=separator],table.has-actions tr>.actions>[type=checkbox]+label+div [role=separator],table.with-details tr>.actions>[type=checkbox]+label+div [role=separator]{text-transform:uppercase;font-weight:var(--typo-weight-medium);color:var(--token-color-foreground-faint)}.disclosure-menu [aria-expanded]~*>ul>li,.menu-panel>ul>li,.more-popover-menu>[type=checkbox]+label+div>ul>li,.popover-menu>[type=checkbox]+label+div>ul>li,table.has-actions tr>.actions>[type=checkbox]+label+div>ul>li,table.with-details tr>.actions>[type=checkbox]+label+div>ul>li{list-style-type:none}.disclosure-menu [aria-expanded]~*>ul .informed-action,.menu-panel>ul .informed-action,.more-popover-menu>[type=checkbox]+label+div>ul .informed-action,.popover-menu>[type=checkbox]+label+div>ul .informed-action,table.has-actions tr>.actions>[type=checkbox]+label+div>ul .informed-action,table.with-details tr>.actions>[type=checkbox]+label+div>ul .informed-action{border:0!important}.disclosure-menu [aria-expanded]~*>div,.menu-panel>div,.more-popover-menu>[type=checkbox]+label+div>div,.popover-menu>[type=checkbox]+label+div>div,table.has-actions tr>.actions>[type=checkbox]+label+div>div,table.with-details tr>.actions>[type=checkbox]+label+div>div{padding:.625rem var(--padding-x);white-space:normal;max-width:-webkit-fit-content;max-width:-moz-fit-content;max-width:fit-content}@supports not ((max-width:-webkit-fit-content) or (max-width:-moz-fit-content) or (max-width:fit-content)){.disclosure-menu [aria-expanded]~*>div,.menu-panel>div,.more-popover-menu>[type=checkbox]+label+div>div,.popover-menu>[type=checkbox]+label+div>div,table.has-actions tr>.actions>[type=checkbox]+label+div>div,table.with-details tr>.actions>[type=checkbox]+label+div>div{max-width:200px}}.disclosure-menu [aria-expanded]~*>div::before,.menu-panel>div::before,.more-popover-menu>[type=checkbox]+label+div>div::before,.popover-menu>[type=checkbox]+label+div>div::before,table.has-actions tr>.actions>[type=checkbox]+label+div>div::before,table.with-details tr>.actions>[type=checkbox]+label+div>div::before{position:absolute;left:15px;top:calc(10px + .1em)}.disclosure-menu [aria-expanded]~*>ul>[role=treeitem]+*,.disclosure-menu [aria-expanded]~*>ul>li>[role=menuitem]+*,.disclosure-menu [aria-expanded]~*>ul>li>[role=option]+*,.menu-panel-deprecated>ul>li>div[role=menu],.menu-panel>ul>[role=treeitem]+*,.menu-panel>ul>li>[role=menuitem]+*,.menu-panel>ul>li>[role=option]+*,.more-popover-menu>[type=checkbox]+label+div>ul>[role=treeitem]+*,.more-popover-menu>[type=checkbox]+label+div>ul>li>[role=menuitem]+*,.more-popover-menu>[type=checkbox]+label+div>ul>li>[role=option]+*,.popover-menu>[type=checkbox]+label+div>ul>[role=treeitem]+*,.popover-menu>[type=checkbox]+label+div>ul>li>[role=menuitem]+*,.popover-menu>[type=checkbox]+label+div>ul>li>[role=option]+*,table.has-actions tr>.actions>[type=checkbox]+label+div>ul>[role=treeitem]+*,table.has-actions tr>.actions>[type=checkbox]+label+div>ul>li>[role=menuitem]+*,table.has-actions tr>.actions>[type=checkbox]+label+div>ul>li>[role=option]+*,table.with-details tr>.actions>[type=checkbox]+label+div>ul>[role=treeitem]+*,table.with-details tr>.actions>[type=checkbox]+label+div>ul>li>[role=menuitem]+*,table.with-details tr>.actions>[type=checkbox]+label+div>ul>li>[role=option]+*{position:absolute;top:0;left:calc(100% + 10px)}.disclosure-menu [aria-expanded]~*>ul,.menu-panel>ul,.more-popover-menu>[type=checkbox]+label+div>ul,.popover-menu>[type=checkbox]+label+div>ul,table.has-actions tr>.actions>[type=checkbox]+label+div>ul,table.with-details tr>.actions>[type=checkbox]+label+div>ul{margin:0;padding:calc(var(--padding-y) - .625rem) 0;transition:transform 150ms}.disclosure-menu [aria-expanded]~*>ul,.disclosure-menu [aria-expanded]~*>ul>li,.disclosure-menu [aria-expanded]~*>ul>li>*,.menu-panel>ul,.menu-panel>ul>li,.menu-panel>ul>li>*,.more-popover-menu>[type=checkbox]+label+div>ul,.more-popover-menu>[type=checkbox]+label+div>ul>li,.more-popover-menu>[type=checkbox]+label+div>ul>li>*,.popover-menu>[type=checkbox]+label+div>ul,.popover-menu>[type=checkbox]+label+div>ul>li,.popover-menu>[type=checkbox]+label+div>ul>li>*,table.has-actions tr>.actions>[type=checkbox]+label+div>ul,table.has-actions tr>.actions>[type=checkbox]+label+div>ul>li,table.has-actions tr>.actions>[type=checkbox]+label+div>ul>li>*,table.with-details tr>.actions>[type=checkbox]+label+div>ul,table.with-details tr>.actions>[type=checkbox]+label+div>ul>li,table.with-details tr>.actions>[type=checkbox]+label+div>ul>li>*{width:100%}.disclosure-menu [aria-expanded]~*>ul>[role=treeitem],.disclosure-menu [aria-expanded]~*>ul>li,.disclosure-menu [aria-expanded]~*>ul>li>[role=menuitem],.disclosure-menu [aria-expanded]~*>ul>li>[role=option],.menu-panel>ul>[role=treeitem],.menu-panel>ul>li,.menu-panel>ul>li>[role=menuitem],.menu-panel>ul>li>[role=option],.more-popover-menu>[type=checkbox]+label+div>ul>[role=treeitem],.more-popover-menu>[type=checkbox]+label+div>ul>li,.more-popover-menu>[type=checkbox]+label+div>ul>li>[role=menuitem],.more-popover-menu>[type=checkbox]+label+div>ul>li>[role=option],.popover-menu>[type=checkbox]+label+div>ul>[role=treeitem],.popover-menu>[type=checkbox]+label+div>ul>li,.popover-menu>[type=checkbox]+label+div>ul>li>[role=menuitem],.popover-menu>[type=checkbox]+label+div>ul>li>[role=option],table.has-actions tr>.actions>[type=checkbox]+label+div>ul>[role=treeitem],table.has-actions tr>.actions>[type=checkbox]+label+div>ul>li,table.has-actions tr>.actions>[type=checkbox]+label+div>ul>li>[role=menuitem],table.has-actions tr>.actions>[type=checkbox]+label+div>ul>li>[role=option],table.with-details tr>.actions>[type=checkbox]+label+div>ul>[role=treeitem],table.with-details tr>.actions>[type=checkbox]+label+div>ul>li,table.with-details tr>.actions>[type=checkbox]+label+div>ul>li>[role=menuitem],table.with-details tr>.actions>[type=checkbox]+label+div>ul>li>[role=option]{text-align:left}.hashicorp-consul nav .dcs li.is-local span,.hashicorp-consul nav .dcs li.is-primary span{color:var(--token-color-surface-primary);background-color:var(--token-color-foreground-faint);padding:0 8px;margin-left:.5rem}.disclosure-menu [aria-expanded]~*>ul>[role=treeitem]::after,.disclosure-menu [aria-expanded]~*>ul>li>[role=menuitem]::after,.disclosure-menu [aria-expanded]~*>ul>li>[role=option]::after,.menu-panel>ul>[role=treeitem]::after,.menu-panel>ul>li>[role=menuitem]::after,.menu-panel>ul>li>[role=option]::after,.more-popover-menu>[type=checkbox]+label+div>ul>[role=treeitem]::after,.more-popover-menu>[type=checkbox]+label+div>ul>li>[role=menuitem]::after,.more-popover-menu>[type=checkbox]+label+div>ul>li>[role=option]::after,.popover-menu>[type=checkbox]+label+div>ul>[role=treeitem]::after,.popover-menu>[type=checkbox]+label+div>ul>li>[role=menuitem]::after,.popover-menu>[type=checkbox]+label+div>ul>li>[role=option]::after,table.has-actions tr>.actions>[type=checkbox]+label+div>ul>[role=treeitem]::after,table.has-actions tr>.actions>[type=checkbox]+label+div>ul>li>[role=menuitem]::after,table.has-actions tr>.actions>[type=checkbox]+label+div>ul>li>[role=option]::after,table.with-details tr>.actions>[type=checkbox]+label+div>ul>[role=treeitem]::after,table.with-details tr>.actions>[type=checkbox]+label+div>ul>li>[role=menuitem]::after,table.with-details tr>.actions>[type=checkbox]+label+div>ul>li>[role=option]::after{margin-left:auto;padding-right:var(--padding-x);transform:translate(calc(var(--padding-x)/ 2),0)}.disclosure-menu [aria-expanded]~* [role=separator],.menu-panel [role=separator],.more-popover-menu>[type=checkbox]+label+div [role=separator],.popover-menu>[type=checkbox]+label+div [role=separator],table.has-actions tr>.actions>[type=checkbox]+label+div [role=separator],table.with-details tr>.actions>[type=checkbox]+label+div [role=separator]{padding-top:.375rem}.disclosure-menu [aria-expanded]~* [role=separator]:not(:first-child),.menu-panel [role=separator]:not(:first-child),.more-popover-menu>[type=checkbox]+label+div [role=separator]:not(:first-child),.popover-menu>[type=checkbox]+label+div [role=separator]:not(:first-child),table.has-actions tr>.actions>[type=checkbox]+label+div [role=separator]:not(:first-child),table.with-details tr>.actions>[type=checkbox]+label+div [role=separator]:not(:first-child){margin-top:.275rem}.disclosure-menu [aria-expanded]~* [role=separator]:not(:empty),.menu-panel [role=separator]:not(:empty),.more-popover-menu>[type=checkbox]+label+div [role=separator]:not(:empty),.popover-menu>[type=checkbox]+label+div [role=separator]:not(:empty),table.has-actions tr>.actions>[type=checkbox]+label+div [role=separator]:not(:empty),table.with-details tr>.actions>[type=checkbox]+label+div [role=separator]:not(:empty){padding-left:var(--padding-x);padding-right:var(--padding-x);padding-bottom:.125rem}.disclosure-menu [aria-expanded]~.menu-panel-confirming,.menu-panel-confirming.menu-panel,.more-popover-menu>[type=checkbox]+label+div.menu-panel-confirming,.popover-menu>[type=checkbox]+label+div.menu-panel-confirming,table.has-actions tr>.actions>[type=checkbox]+label+div.menu-panel-confirming,table.with-details tr>.actions>[type=checkbox]+label+div.menu-panel-confirming{overflow:hidden}.disclosure-menu [aria-expanded]~.menu-panel-confirming>ul,.menu-panel-confirming.menu-panel>ul,.more-popover-menu>[type=checkbox]+label+div.menu-panel-confirming>ul,.popover-menu>[type=checkbox]+label+div.menu-panel-confirming>ul,table.has-actions tr>.actions>[type=checkbox]+label+div.menu-panel-confirming>ul,table.with-details tr>.actions>[type=checkbox]+label+div.menu-panel-confirming>ul{transform:translateX(calc(-100% - 10px))}.disclosure-menu [aria-expanded]~*,.menu-panel,.more-popover-menu>[type=checkbox]+label+div,.popover-menu>[type=checkbox]+label+div,table.has-actions tr>.actions>[type=checkbox]+label+div,table.with-details tr>.actions>[type=checkbox]+label+div{overflow:hidden}.menu-panel-deprecated{position:absolute;transition:max-height 150ms;transition:min-height 150ms,max-height 150ms;min-height:0}.menu-panel-deprecated [type=checkbox]{display:none}.menu-panel-deprecated:not(.confirmation) [type=checkbox]~*{transition:transform 150ms}.confirmation.menu-panel-deprecated [role=menu]{min-height:205px!important}.menu-panel-deprecated [type=checkbox]:checked~*{transform:translateX(calc(-100% - 10px));min-height:143px;max-height:143px}.menu-panel-deprecated [id$="-"]:first-child:checked~ul label[for$="-"] * [role=menu],.menu-panel-deprecated [id$="-"]:first-child:checked~ul>li>[role=menu]{display:block}.menu-panel-deprecated>ul>li>:not(div[role=menu]),.tippy-box{position:relative}.menu-panel-deprecated:not(.left){right:0!important;left:auto!important}.left.menu-panel-deprecated{left:0}.menu-panel-deprecated:not(.above){top:28px}.above.menu-panel-deprecated{bottom:42px}.consul-upstream-instance-list dl.local-bind-socket-mode dt::after{display:inline;content:var(--horizontal-kv-list-key-separator)}.consul-bucket-list,.consul-exposed-path-list>ul>li>.detail dl,.consul-instance-checks,.consul-lock-session-list dl,.consul-lock-session-list ul>li:not(:first-child)>.detail dl,.consul-upstream-instance-list dl,.consul-upstream-instance-list li>.detail dl,.list-collection>ul>li:not(:first-child)>.detail dl,.tag-list,section[data-route="dc.show.license"] .validity dl,section[data-route="dc.show.serverstatus"] .redundancy-zones section header dl,td.tags{display:inline-flex;flex-wrap:nowrap;align-items:center}.consul-bucket-list:empty,.consul-exposed-path-list>ul>li>.detail dl:empty,.consul-instance-checks:empty,.consul-lock-session-list dl:empty,.consul-lock-session-list ul>li:not(:first-child)>.detail dl:empty,.consul-upstream-instance-list dl:empty,.list-collection>ul>li:not(:first-child)>.detail dl:empty,.tag-list:empty,section[data-route="dc.show.license"] .validity dl:empty,section[data-route="dc.show.serverstatus"] .redundancy-zones section header dl:empty,td.tags:empty{display:none}.consul-bucket-list>*>*,.consul-exposed-path-list>ul>li>.detail dl>*>*,.consul-instance-checks>*>*,.consul-lock-session-list dl>*>*,.consul-lock-session-list ul>li:not(:first-child)>.detail dl>*>*,.consul-upstream-instance-list dl>*>*,.consul-upstream-instance-list li>.detail dl>*>*,.list-collection>ul>li:not(:first-child)>.detail dl>*>*,.tag-list>*>*,section[data-route="dc.show.license"] .validity dl>*>*,section[data-route="dc.show.serverstatus"] .redundancy-zones section header dl>*>*,td.tags>*>*{display:inline-block}.consul-bucket-list>*,.consul-exposed-path-list>ul>li>.detail dl>*,.consul-instance-checks>*,.consul-lock-session-list dl>*,.consul-lock-session-list ul>li:not(:first-child)>.detail dl>*,.consul-upstream-instance-list dl>*,.consul-upstream-instance-list li>.detail dl>*,.list-collection>ul>li:not(:first-child)>.detail dl>*,.tag-list>*,section[data-route="dc.show.license"] .validity dl>*,section[data-route="dc.show.serverstatus"] .redundancy-zones section header dl>*,td.tags>*{white-space:nowrap}.consul-bucket-list>dd,.consul-exposed-path-list>ul>li>.detail dl>dd,.consul-instance-checks>dd,.consul-lock-session-list dl>dd,.consul-lock-session-list ul>li:not(:first-child)>.detail dl>dd,.consul-upstream-instance-list dl>dd,.consul-upstream-instance-list li>.detail dl>dd,.list-collection>ul>li:not(:first-child)>.detail dl>dd,.tag-list>dd,section[data-route="dc.show.license"] .validity dl>dd,section[data-route="dc.show.serverstatus"] .redundancy-zones section header dl>dd,td.tags>dd{flex-wrap:wrap}.consul-upstream-instance-list dl.local-bind-socket-mode dt{display:inline-flex;min-width:18px;overflow:hidden}.consul-lock-session-list .checks dd,.discovery-chain .resolver-card ol,.filter-bar,.filter-bar>div,.modal-dialog,.tag-list dd,td.tags dd{display:flex}.consul-bucket-list .consul-exposed-path-list>ul>li>.detail dl:not([class]) dd+dt:not([class])+dd,.consul-bucket-list .consul-lock-session-list ul>li:not(:first-child)>.detail dl:not([class]) dd+dt:not([class])+dd,.consul-bucket-list .consul-upstream-instance-list dl.local-bind-address dd+dt+dd,.consul-bucket-list .consul-upstream-instance-list dl.local-bind-socket-path dd+dt+dd,.consul-bucket-list .consul-upstream-instance-list li>.detail dl:not([class]) dd+dt:not([class])+dd,.consul-bucket-list .list-collection>ul>li:not(:first-child)>.detail dl:not([class]) dd+dt:not([class])+dd,.consul-bucket-list .tag-list:not([class]) dd+dt:not([class])+dd,.consul-bucket-list dd+dt,.consul-bucket-list td.tags:not([class]) dd+dt:not([class])+dd,.consul-bucket-list+.consul-bucket-list:not(:first-of-type),.consul-bucket-list+.consul-instance-checks:not(:first-of-type),.consul-bucket-list+.tag-list:not(:first-of-type),.consul-bucket-list+td.tags:not(:first-of-type),.consul-bucket-list:not([class]) .consul-exposed-path-list>ul>li>.detail dl dd+dt:not([class])+dd,.consul-bucket-list:not([class]) .consul-lock-session-list ul>li:not(:first-child)>.detail dl dd+dt:not([class])+dd,.consul-bucket-list:not([class]) .consul-upstream-instance-list li>.detail dl dd+dt:not([class])+dd,.consul-bucket-list:not([class]) .list-collection>ul>li:not(:first-child)>.detail dl dd+dt:not([class])+dd,.consul-bucket-list:not([class]) .tag-list dd+dt:not([class])+dd,.consul-bucket-list:not([class]) dd+dt:not([class])+dd,.consul-bucket-list:not([class]) td.tags dd+dt:not([class])+dd,.consul-exposed-path-list>ul>li>.detail .consul-bucket-list+dl:not(:first-of-type),.consul-exposed-path-list>ul>li>.detail .consul-instance-checks+dl:not(:first-of-type),.consul-exposed-path-list>ul>li>.detail .consul-lock-session-list dl+dl:not(:first-of-type),.consul-exposed-path-list>ul>li>.detail .consul-upstream-instance-list dl+dl:not(:first-of-type),.consul-exposed-path-list>ul>li>.detail .consul-upstream-instance-list dl.local-bind-address dd+dt+dd,.consul-exposed-path-list>ul>li>.detail .consul-upstream-instance-list dl.local-bind-socket-path dd+dt+dd,.consul-exposed-path-list>ul>li>.detail .list-collection>ul>li:not(:first-child)>.detail dl:not([class]) dd+dt:not([class])+dd,.consul-exposed-path-list>ul>li>.detail .tag-list+dl:not(:first-of-type),.consul-exposed-path-list>ul>li>.detail dl .consul-bucket-list:not([class]) dd+dt:not([class])+dd,.consul-exposed-path-list>ul>li>.detail dl .consul-instance-checks:not([class]) dd+dt:not([class])+dd,.consul-exposed-path-list>ul>li>.detail dl .consul-lock-session-list dl:not([class]) dd+dt:not([class])+dd,.consul-exposed-path-list>ul>li>.detail dl .consul-upstream-instance-list dl:not([class]) dd+dt:not([class])+dd,.consul-exposed-path-list>ul>li>.detail dl .tag-list:not([class]) dd+dt:not([class])+dd,.consul-exposed-path-list>ul>li>.detail dl dd+dt,.consul-exposed-path-list>ul>li>.detail dl section[data-route="dc.show.license"] .validity dl:not([class]) dd+dt:not([class])+dd,.consul-exposed-path-list>ul>li>.detail dl section[data-route="dc.show.serverstatus"] .redundancy-zones section header dl:not([class]) dd+dt:not([class])+dd,.consul-exposed-path-list>ul>li>.detail dl td.tags:not([class]) dd+dt:not([class])+dd,.consul-exposed-path-list>ul>li>.detail dl+.consul-bucket-list:not(:first-of-type),.consul-exposed-path-list>ul>li>.detail dl+.consul-instance-checks:not(:first-of-type),.consul-exposed-path-list>ul>li>.detail dl+.tag-list:not(:first-of-type),.consul-exposed-path-list>ul>li>.detail dl+dl:not(:first-of-type),.consul-exposed-path-list>ul>li>.detail dl+td.tags:not(:first-of-type),.consul-exposed-path-list>ul>li>.detail dl:not([class]) .consul-bucket-list dd+dt:not([class])+dd,.consul-exposed-path-list>ul>li>.detail dl:not([class]) .consul-instance-checks dd+dt:not([class])+dd,.consul-exposed-path-list>ul>li>.detail dl:not([class]) .consul-lock-session-list dl dd+dt:not([class])+dd,.consul-exposed-path-list>ul>li>.detail dl:not([class]) .consul-upstream-instance-list dl dd+dt:not([class])+dd,.consul-exposed-path-list>ul>li>.detail dl:not([class]) .tag-list dd+dt:not([class])+dd,.consul-exposed-path-list>ul>li>.detail dl:not([class]) dd+dt:not([class])+dd,.consul-exposed-path-list>ul>li>.detail dl:not([class]) section[data-route="dc.show.license"] .validity dl dd+dt:not([class])+dd,.consul-exposed-path-list>ul>li>.detail dl:not([class]) section[data-route="dc.show.serverstatus"] .redundancy-zones section header dl dd+dt:not([class])+dd,.consul-exposed-path-list>ul>li>.detail dl:not([class]) td.tags dd+dt:not([class])+dd,.consul-exposed-path-list>ul>li>.detail section[data-route="dc.show.license"] .validity dl+dl:not(:first-of-type),.consul-exposed-path-list>ul>li>.detail section[data-route="dc.show.serverstatus"] .redundancy-zones section header dl+dl:not(:first-of-type),.consul-exposed-path-list>ul>li>.detail td.tags+dl:not(:first-of-type),.consul-instance-checks .consul-exposed-path-list>ul>li>.detail dl:not([class]) dd+dt:not([class])+dd,.consul-instance-checks .consul-lock-session-list ul>li:not(:first-child)>.detail dl:not([class]) dd+dt:not([class])+dd,.consul-instance-checks .consul-upstream-instance-list dl.local-bind-address dd+dt+dd,.consul-instance-checks .consul-upstream-instance-list dl.local-bind-socket-path dd+dt+dd,.consul-instance-checks .consul-upstream-instance-list li>.detail dl:not([class]) dd+dt:not([class])+dd,.consul-instance-checks .list-collection>ul>li:not(:first-child)>.detail dl:not([class]) dd+dt:not([class])+dd,.consul-instance-checks .tag-list:not([class]) dd+dt:not([class])+dd,.consul-instance-checks dd+dt,.consul-instance-checks td.tags:not([class]) dd+dt:not([class])+dd,.consul-instance-checks+.consul-bucket-list:not(:first-of-type),.consul-instance-checks+.consul-instance-checks:not(:first-of-type),.consul-instance-checks+.tag-list:not(:first-of-type),.consul-instance-checks+td.tags:not(:first-of-type),.consul-instance-checks:not([class]) .consul-exposed-path-list>ul>li>.detail dl dd+dt:not([class])+dd,.consul-instance-checks:not([class]) .consul-lock-session-list ul>li:not(:first-child)>.detail dl dd+dt:not([class])+dd,.consul-instance-checks:not([class]) .consul-upstream-instance-list li>.detail dl dd+dt:not([class])+dd,.consul-instance-checks:not([class]) .list-collection>ul>li:not(:first-child)>.detail dl dd+dt:not([class])+dd,.consul-instance-checks:not([class]) .tag-list dd+dt:not([class])+dd,.consul-instance-checks:not([class]) dd+dt:not([class])+dd,.consul-instance-checks:not([class]) td.tags dd+dt:not([class])+dd,.consul-lock-session-list .consul-bucket-list ul>li:not(:first-child)>.detail dl:not([class]) dd+dt:not([class])+dd,.consul-lock-session-list .consul-bucket-list+dl:not(:first-of-type),.consul-lock-session-list .consul-bucket-list:not([class]) ul>li:not(:first-child)>.detail dl dd+dt:not([class])+dd,.consul-lock-session-list .consul-exposed-path-list>ul>li>.detail dl dl:not([class]) dd+dt:not([class])+dd,.consul-lock-session-list .consul-exposed-path-list>ul>li>.detail dl+dl:not(:first-of-type),.consul-lock-session-list .consul-exposed-path-list>ul>li>.detail dl:not([class]) dl dd+dt:not([class])+dd,.consul-lock-session-list .consul-instance-checks ul>li:not(:first-child)>.detail dl:not([class]) dd+dt:not([class])+dd,.consul-lock-session-list .consul-instance-checks+dl:not(:first-of-type),.consul-lock-session-list .consul-instance-checks:not([class]) ul>li:not(:first-child)>.detail dl dd+dt:not([class])+dd,.consul-lock-session-list .consul-upstream-instance-list dl li>.detail dl:not([class]) dd+dt:not([class])+dd,.consul-lock-session-list .consul-upstream-instance-list dl ul>li:not(:first-child)>.detail dl:not([class]) dd+dt:not([class])+dd,.consul-lock-session-list .consul-upstream-instance-list dl+dl:not(:first-of-type),.consul-lock-session-list .consul-upstream-instance-list dl.local-bind-address dl dd+dt+dd,.consul-lock-session-list .consul-upstream-instance-list dl.local-bind-socket-path dl dd+dt+dd,.consul-lock-session-list .consul-upstream-instance-list dl:not([class]) li>.detail dl dd+dt:not([class])+dd,.consul-lock-session-list .consul-upstream-instance-list dl:not([class]) ul>li:not(:first-child)>.detail dl dd+dt:not([class])+dd,.consul-lock-session-list .consul-upstream-instance-list li>.detail dl dl:not([class]) dd+dt:not([class])+dd,.consul-lock-session-list .consul-upstream-instance-list li>.detail dl+dl:not(:first-of-type),.consul-lock-session-list .consul-upstream-instance-list li>.detail dl:not([class]) dl dd+dt:not([class])+dd,.consul-lock-session-list .consul-upstream-instance-list ul>li:not(:first-child)>.detail dl dl:not([class]) dd+dt:not([class])+dd,.consul-lock-session-list .consul-upstream-instance-list ul>li:not(:first-child)>.detail dl+dl:not(:first-of-type),.consul-lock-session-list .consul-upstream-instance-list ul>li:not(:first-child)>.detail dl.local-bind-address dd+dt+dd,.consul-lock-session-list .consul-upstream-instance-list ul>li:not(:first-child)>.detail dl.local-bind-socket-path dd+dt+dd,.consul-lock-session-list .consul-upstream-instance-list ul>li:not(:first-child)>.detail dl:not([class]) dl dd+dt:not([class])+dd,.consul-lock-session-list .list-collection>ul>li:not(:first-child)>.detail dl dl:not([class]) dd+dt:not([class])+dd,.consul-lock-session-list .list-collection>ul>li:not(:first-child)>.detail dl+dl:not(:first-of-type),.consul-lock-session-list .list-collection>ul>li:not(:first-child)>.detail dl:not([class]) dl dd+dt:not([class])+dd,.consul-lock-session-list .list-collection>ul>li:not(:first-child)>.detail ul>li:not(:first-child)>.detail dl:not([class]) dd+dt:not([class])+dd,.consul-lock-session-list .tag-list dl:not([class]) dd+dt:not([class])+dd,.consul-lock-session-list .tag-list ul>li:not(:first-child)>.detail dl:not([class]) dd+dt:not([class])+dd,.consul-lock-session-list .tag-list+dl:not(:first-of-type),.consul-lock-session-list .tag-list:not([class]) dl dd+dt:not([class])+dd,.consul-lock-session-list .tag-list:not([class]) ul>li:not(:first-child)>.detail dl dd+dt:not([class])+dd,.consul-lock-session-list dl .consul-exposed-path-list>ul>li>.detail dl:not([class]) dd+dt:not([class])+dd,.consul-lock-session-list dl .consul-lock-session-list ul>li:not(:first-child)>.detail dl:not([class]) dd+dt:not([class])+dd,.consul-lock-session-list dl .consul-upstream-instance-list dl.local-bind-address dd+dt+dd,.consul-lock-session-list dl .consul-upstream-instance-list dl.local-bind-socket-path dd+dt+dd,.consul-lock-session-list dl .consul-upstream-instance-list li>.detail dl:not([class]) dd+dt:not([class])+dd,.consul-lock-session-list dl .list-collection>ul>li:not(:first-child)>.detail dl:not([class]) dd+dt:not([class])+dd,.consul-lock-session-list dl .tag-list:not([class]) dd+dt:not([class])+dd,.consul-lock-session-list dl dd+dt,.consul-lock-session-list dl td.tags:not([class]) dd+dt:not([class])+dd,.consul-lock-session-list dl ul>li:not(:first-child)>.detail dl:not([class]) dd+dt:not([class])+dd,.consul-lock-session-list dl+.consul-bucket-list:not(:first-of-type),.consul-lock-session-list dl+.consul-instance-checks:not(:first-of-type),.consul-lock-session-list dl+.tag-list:not(:first-of-type),.consul-lock-session-list dl+dl:not(:first-of-type),.consul-lock-session-list dl+td.tags:not(:first-of-type),.consul-lock-session-list dl:not([class]) .consul-exposed-path-list>ul>li>.detail dl dd+dt:not([class])+dd,.consul-lock-session-list dl:not([class]) .consul-lock-session-list ul>li:not(:first-child)>.detail dl dd+dt:not([class])+dd,.consul-lock-session-list dl:not([class]) .consul-upstream-instance-list li>.detail dl dd+dt:not([class])+dd,.consul-lock-session-list dl:not([class]) .list-collection>ul>li:not(:first-child)>.detail dl dd+dt:not([class])+dd,.consul-lock-session-list dl:not([class]) .tag-list dd+dt:not([class])+dd,.consul-lock-session-list dl:not([class]) dd+dt:not([class])+dd,.consul-lock-session-list dl:not([class]) td.tags dd+dt:not([class])+dd,.consul-lock-session-list dl:not([class]) ul>li:not(:first-child)>.detail dl dd+dt:not([class])+dd,.consul-lock-session-list section[data-route="dc.show.license"] .validity dl ul>li:not(:first-child)>.detail dl:not([class]) dd+dt:not([class])+dd,.consul-lock-session-list section[data-route="dc.show.license"] .validity dl+dl:not(:first-of-type),.consul-lock-session-list section[data-route="dc.show.license"] .validity dl:not([class]) ul>li:not(:first-child)>.detail dl dd+dt:not([class])+dd,.consul-lock-session-list section[data-route="dc.show.serverstatus"] .redundancy-zones section header dl ul>li:not(:first-child)>.detail dl:not([class]) dd+dt:not([class])+dd,.consul-lock-session-list section[data-route="dc.show.serverstatus"] .redundancy-zones section header dl+dl:not(:first-of-type),.consul-lock-session-list section[data-route="dc.show.serverstatus"] .redundancy-zones section header dl:not([class]) ul>li:not(:first-child)>.detail dl dd+dt:not([class])+dd,.consul-lock-session-list td.tags dl:not([class]) dd+dt:not([class])+dd,.consul-lock-session-list td.tags ul>li:not(:first-child)>.detail dl:not([class]) dd+dt:not([class])+dd,.consul-lock-session-list td.tags+dl:not(:first-of-type),.consul-lock-session-list td.tags:not([class]) dl dd+dt:not([class])+dd,.consul-lock-session-list td.tags:not([class]) ul>li:not(:first-child)>.detail dl dd+dt:not([class])+dd,.consul-lock-session-list ul>li:not(:first-child)>.detail .consul-bucket-list+dl:not(:first-of-type),.consul-lock-session-list ul>li:not(:first-child)>.detail .consul-instance-checks+dl:not(:first-of-type),.consul-lock-session-list ul>li:not(:first-child)>.detail .consul-upstream-instance-list dl+dl:not(:first-of-type),.consul-lock-session-list ul>li:not(:first-child)>.detail .consul-upstream-instance-list dl.local-bind-address dd+dt+dd,.consul-lock-session-list ul>li:not(:first-child)>.detail .consul-upstream-instance-list dl.local-bind-socket-path dd+dt+dd,.consul-lock-session-list ul>li:not(:first-child)>.detail .list-collection>ul>li:not(:first-child)>.detail dl:not([class]) dd+dt:not([class])+dd,.consul-lock-session-list ul>li:not(:first-child)>.detail .tag-list+dl:not(:first-of-type),.consul-lock-session-list ul>li:not(:first-child)>.detail dl .consul-bucket-list:not([class]) dd+dt:not([class])+dd,.consul-lock-session-list ul>li:not(:first-child)>.detail dl .consul-instance-checks:not([class]) dd+dt:not([class])+dd,.consul-lock-session-list ul>li:not(:first-child)>.detail dl .consul-upstream-instance-list dl:not([class]) dd+dt:not([class])+dd,.consul-lock-session-list ul>li:not(:first-child)>.detail dl .tag-list:not([class]) dd+dt:not([class])+dd,.consul-lock-session-list ul>li:not(:first-child)>.detail dl dd+dt,.consul-lock-session-list ul>li:not(:first-child)>.detail dl dl:not([class]) dd+dt:not([class])+dd,.consul-lock-session-list ul>li:not(:first-child)>.detail dl section[data-route="dc.show.license"] .validity dl:not([class]) dd+dt:not([class])+dd,.consul-lock-session-list ul>li:not(:first-child)>.detail dl section[data-route="dc.show.serverstatus"] .redundancy-zones section header dl:not([class]) dd+dt:not([class])+dd,.consul-lock-session-list ul>li:not(:first-child)>.detail dl td.tags:not([class]) dd+dt:not([class])+dd,.consul-lock-session-list ul>li:not(:first-child)>.detail dl+.consul-bucket-list:not(:first-of-type),.consul-lock-session-list ul>li:not(:first-child)>.detail dl+.consul-instance-checks:not(:first-of-type),.consul-lock-session-list ul>li:not(:first-child)>.detail dl+.tag-list:not(:first-of-type),.consul-lock-session-list ul>li:not(:first-child)>.detail dl+dl:not(:first-of-type),.consul-lock-session-list ul>li:not(:first-child)>.detail dl+td.tags:not(:first-of-type),.consul-lock-session-list ul>li:not(:first-child)>.detail dl:not([class]) .consul-bucket-list dd+dt:not([class])+dd,.consul-lock-session-list ul>li:not(:first-child)>.detail dl:not([class]) .consul-instance-checks dd+dt:not([class])+dd,.consul-lock-session-list ul>li:not(:first-child)>.detail dl:not([class]) .consul-upstream-instance-list dl dd+dt:not([class])+dd,.consul-lock-session-list ul>li:not(:first-child)>.detail dl:not([class]) .tag-list dd+dt:not([class])+dd,.consul-lock-session-list ul>li:not(:first-child)>.detail dl:not([class]) dd+dt:not([class])+dd,.consul-lock-session-list ul>li:not(:first-child)>.detail dl:not([class]) dl dd+dt:not([class])+dd,.consul-lock-session-list ul>li:not(:first-child)>.detail dl:not([class]) section[data-route="dc.show.license"] .validity dl dd+dt:not([class])+dd,.consul-lock-session-list ul>li:not(:first-child)>.detail dl:not([class]) section[data-route="dc.show.serverstatus"] .redundancy-zones section header dl dd+dt:not([class])+dd,.consul-lock-session-list ul>li:not(:first-child)>.detail dl:not([class]) td.tags dd+dt:not([class])+dd,.consul-lock-session-list ul>li:not(:first-child)>.detail section[data-route="dc.show.license"] .validity dl+dl:not(:first-of-type),.consul-lock-session-list ul>li:not(:first-child)>.detail section[data-route="dc.show.serverstatus"] .redundancy-zones section header dl+dl:not(:first-of-type),.consul-lock-session-list ul>li:not(:first-child)>.detail td.tags+dl:not(:first-of-type),.consul-upstream-instance-list .consul-bucket-list li>.detail dl:not([class]) dd+dt:not([class])+dd,.consul-upstream-instance-list .consul-bucket-list+dl:not(:first-of-type),.consul-upstream-instance-list .consul-bucket-list:not([class]) li>.detail dl dd+dt:not([class])+dd,.consul-upstream-instance-list .consul-exposed-path-list>ul>li>.detail dl dl:not([class]) dd+dt:not([class])+dd,.consul-upstream-instance-list .consul-exposed-path-list>ul>li>.detail dl+dl:not(:first-of-type),.consul-upstream-instance-list .consul-exposed-path-list>ul>li>.detail dl.local-bind-address dd+dt+dd,.consul-upstream-instance-list .consul-exposed-path-list>ul>li>.detail dl.local-bind-socket-path dd+dt+dd,.consul-upstream-instance-list .consul-exposed-path-list>ul>li>.detail dl:not([class]) dl dd+dt:not([class])+dd,.consul-upstream-instance-list .consul-instance-checks li>.detail dl:not([class]) dd+dt:not([class])+dd,.consul-upstream-instance-list .consul-instance-checks+dl:not(:first-of-type),.consul-upstream-instance-list .consul-instance-checks:not([class]) li>.detail dl dd+dt:not([class])+dd,.consul-upstream-instance-list .consul-lock-session-list dl li>.detail dl:not([class]) dd+dt:not([class])+dd,.consul-upstream-instance-list .consul-lock-session-list dl+dl:not(:first-of-type),.consul-upstream-instance-list .consul-lock-session-list dl:not([class]) li>.detail dl dd+dt:not([class])+dd,.consul-upstream-instance-list .consul-lock-session-list ul>li:not(:first-child)>.detail dl dl:not([class]) dd+dt:not([class])+dd,.consul-upstream-instance-list .consul-lock-session-list ul>li:not(:first-child)>.detail dl+dl:not(:first-of-type),.consul-upstream-instance-list .consul-lock-session-list ul>li:not(:first-child)>.detail dl.local-bind-address dd+dt+dd,.consul-upstream-instance-list .consul-lock-session-list ul>li:not(:first-child)>.detail dl.local-bind-socket-path dd+dt+dd,.consul-upstream-instance-list .consul-lock-session-list ul>li:not(:first-child)>.detail dl:not([class]) dl dd+dt:not([class])+dd,.consul-upstream-instance-list .list-collection>ul>li:not(:first-child)>.detail dl dl:not([class]) dd+dt:not([class])+dd,.consul-upstream-instance-list .list-collection>ul>li:not(:first-child)>.detail dl+dl:not(:first-of-type),.consul-upstream-instance-list .list-collection>ul>li:not(:first-child)>.detail dl.local-bind-address dd+dt+dd,.consul-upstream-instance-list .list-collection>ul>li:not(:first-child)>.detail dl.local-bind-socket-path dd+dt+dd,.consul-upstream-instance-list .list-collection>ul>li:not(:first-child)>.detail dl:not([class]) dl dd+dt:not([class])+dd,.consul-upstream-instance-list .list-collection>ul>li:not(:first-child)>.detail li>.detail dl:not([class]) dd+dt:not([class])+dd,.consul-upstream-instance-list .tag-list dl:not([class]) dd+dt:not([class])+dd,.consul-upstream-instance-list .tag-list li>.detail dl:not([class]) dd+dt:not([class])+dd,.consul-upstream-instance-list .tag-list+dl:not(:first-of-type),.consul-upstream-instance-list .tag-list:not([class]) dl dd+dt:not([class])+dd,.consul-upstream-instance-list .tag-list:not([class]) li>.detail dl dd+dt:not([class])+dd,.consul-upstream-instance-list dl .consul-exposed-path-list>ul>li>.detail dl:not([class]) dd+dt:not([class])+dd,.consul-upstream-instance-list dl .consul-lock-session-list ul>li:not(:first-child)>.detail dl:not([class]) dd+dt:not([class])+dd,.consul-upstream-instance-list dl .consul-upstream-instance-list li>.detail dl:not([class]) dd+dt:not([class])+dd,.consul-upstream-instance-list dl .list-collection>ul>li:not(:first-child)>.detail dl:not([class]) dd+dt:not([class])+dd,.consul-upstream-instance-list dl .tag-list:not([class]) dd+dt:not([class])+dd,.consul-upstream-instance-list dl dd+dt,.consul-upstream-instance-list dl li>.detail dl:not([class]) dd+dt:not([class])+dd,.consul-upstream-instance-list dl td.tags:not([class]) dd+dt:not([class])+dd,.consul-upstream-instance-list dl+.consul-bucket-list:not(:first-of-type),.consul-upstream-instance-list dl+.consul-instance-checks:not(:first-of-type),.consul-upstream-instance-list dl+.tag-list:not(:first-of-type),.consul-upstream-instance-list dl+dl:not(:first-of-type),.consul-upstream-instance-list dl+td.tags:not(:first-of-type),.consul-upstream-instance-list dl.local-bind-address .consul-bucket-list dd+dt+dd,.consul-upstream-instance-list dl.local-bind-address .consul-instance-checks dd+dt+dd,.consul-upstream-instance-list dl.local-bind-address .consul-lock-session-list dl dd+dt+dd,.consul-upstream-instance-list dl.local-bind-address .tag-list dd+dt+dd,.consul-upstream-instance-list dl.local-bind-address dd+dt+dd,.consul-upstream-instance-list dl.local-bind-address section[data-route="dc.show.license"] .validity dl dd+dt+dd,.consul-upstream-instance-list dl.local-bind-address section[data-route="dc.show.serverstatus"] .redundancy-zones section header dl dd+dt+dd,.consul-upstream-instance-list dl.local-bind-address td.tags dd+dt+dd,.consul-upstream-instance-list dl.local-bind-socket-path .consul-bucket-list dd+dt+dd,.consul-upstream-instance-list dl.local-bind-socket-path .consul-instance-checks dd+dt+dd,.consul-upstream-instance-list dl.local-bind-socket-path .consul-lock-session-list dl dd+dt+dd,.consul-upstream-instance-list dl.local-bind-socket-path .tag-list dd+dt+dd,.consul-upstream-instance-list dl.local-bind-socket-path dd+dt+dd,.consul-upstream-instance-list dl.local-bind-socket-path section[data-route="dc.show.license"] .validity dl dd+dt+dd,.consul-upstream-instance-list dl.local-bind-socket-path section[data-route="dc.show.serverstatus"] .redundancy-zones section header dl dd+dt+dd,.consul-upstream-instance-list dl.local-bind-socket-path td.tags dd+dt+dd,.consul-upstream-instance-list dl:not([class]) .consul-exposed-path-list>ul>li>.detail dl dd+dt:not([class])+dd,.consul-upstream-instance-list dl:not([class]) .consul-lock-session-list ul>li:not(:first-child)>.detail dl dd+dt:not([class])+dd,.consul-upstream-instance-list dl:not([class]) .consul-upstream-instance-list li>.detail dl dd+dt:not([class])+dd,.consul-upstream-instance-list dl:not([class]) .list-collection>ul>li:not(:first-child)>.detail dl dd+dt:not([class])+dd,.consul-upstream-instance-list dl:not([class]) .tag-list dd+dt:not([class])+dd,.consul-upstream-instance-list dl:not([class]) dd+dt:not([class])+dd,.consul-upstream-instance-list dl:not([class]) li>.detail dl dd+dt:not([class])+dd,.consul-upstream-instance-list dl:not([class]) td.tags dd+dt:not([class])+dd,.consul-upstream-instance-list li>.detail .consul-bucket-list+dl:not(:first-of-type),.consul-upstream-instance-list li>.detail .consul-instance-checks+dl:not(:first-of-type),.consul-upstream-instance-list li>.detail .consul-lock-session-list dl+dl:not(:first-of-type),.consul-upstream-instance-list li>.detail .list-collection>ul>li:not(:first-child)>.detail dl:not([class]) dd+dt:not([class])+dd,.consul-upstream-instance-list li>.detail .tag-list+dl:not(:first-of-type),.consul-upstream-instance-list li>.detail dl .consul-bucket-list:not([class]) dd+dt:not([class])+dd,.consul-upstream-instance-list li>.detail dl .consul-instance-checks:not([class]) dd+dt:not([class])+dd,.consul-upstream-instance-list li>.detail dl .consul-lock-session-list dl:not([class]) dd+dt:not([class])+dd,.consul-upstream-instance-list li>.detail dl .tag-list:not([class]) dd+dt:not([class])+dd,.consul-upstream-instance-list li>.detail dl dd+dt,.consul-upstream-instance-list li>.detail dl dl:not([class]) dd+dt:not([class])+dd,.consul-upstream-instance-list li>.detail dl section[data-route="dc.show.license"] .validity dl:not([class]) dd+dt:not([class])+dd,.consul-upstream-instance-list li>.detail dl section[data-route="dc.show.serverstatus"] .redundancy-zones section header dl:not([class]) dd+dt:not([class])+dd,.consul-upstream-instance-list li>.detail dl td.tags:not([class]) dd+dt:not([class])+dd,.consul-upstream-instance-list li>.detail dl+.consul-bucket-list:not(:first-of-type),.consul-upstream-instance-list li>.detail dl+.consul-instance-checks:not(:first-of-type),.consul-upstream-instance-list li>.detail dl+.tag-list:not(:first-of-type),.consul-upstream-instance-list li>.detail dl+dl:not(:first-of-type),.consul-upstream-instance-list li>.detail dl+td.tags:not(:first-of-type),.consul-upstream-instance-list li>.detail dl.local-bind-address dd+dt+dd,.consul-upstream-instance-list li>.detail dl.local-bind-socket-path dd+dt+dd,.consul-upstream-instance-list li>.detail dl:not([class]) .consul-bucket-list dd+dt:not([class])+dd,.consul-upstream-instance-list li>.detail dl:not([class]) .consul-instance-checks dd+dt:not([class])+dd,.consul-upstream-instance-list li>.detail dl:not([class]) .consul-lock-session-list dl dd+dt:not([class])+dd,.consul-upstream-instance-list li>.detail dl:not([class]) .tag-list dd+dt:not([class])+dd,.consul-upstream-instance-list li>.detail dl:not([class]) dd+dt:not([class])+dd,.consul-upstream-instance-list li>.detail dl:not([class]) dl dd+dt:not([class])+dd,.consul-upstream-instance-list li>.detail dl:not([class]) section[data-route="dc.show.license"] .validity dl dd+dt:not([class])+dd,.consul-upstream-instance-list li>.detail dl:not([class]) section[data-route="dc.show.serverstatus"] .redundancy-zones section header dl dd+dt:not([class])+dd,.consul-upstream-instance-list li>.detail dl:not([class]) td.tags dd+dt:not([class])+dd,.consul-upstream-instance-list li>.detail section[data-route="dc.show.license"] .validity dl+dl:not(:first-of-type),.consul-upstream-instance-list li>.detail section[data-route="dc.show.serverstatus"] .redundancy-zones section header dl+dl:not(:first-of-type),.consul-upstream-instance-list li>.detail td.tags+dl:not(:first-of-type),.consul-upstream-instance-list section[data-route="dc.show.license"] .validity dl li>.detail dl:not([class]) dd+dt:not([class])+dd,.consul-upstream-instance-list section[data-route="dc.show.license"] .validity dl+dl:not(:first-of-type),.consul-upstream-instance-list section[data-route="dc.show.license"] .validity dl:not([class]) li>.detail dl dd+dt:not([class])+dd,.consul-upstream-instance-list section[data-route="dc.show.serverstatus"] .redundancy-zones section header dl li>.detail dl:not([class]) dd+dt:not([class])+dd,.consul-upstream-instance-list section[data-route="dc.show.serverstatus"] .redundancy-zones section header dl+dl:not(:first-of-type),.consul-upstream-instance-list section[data-route="dc.show.serverstatus"] .redundancy-zones section header dl:not([class]) li>.detail dl dd+dt:not([class])+dd,.consul-upstream-instance-list td.tags dl:not([class]) dd+dt:not([class])+dd,.consul-upstream-instance-list td.tags li>.detail dl:not([class]) dd+dt:not([class])+dd,.consul-upstream-instance-list td.tags+dl:not(:first-of-type),.consul-upstream-instance-list td.tags:not([class]) dl dd+dt:not([class])+dd,.consul-upstream-instance-list td.tags:not([class]) li>.detail dl dd+dt:not([class])+dd,.list-collection>ul>li:not(:first-child)>.detail .consul-bucket-list+dl:not(:first-of-type),.list-collection>ul>li:not(:first-child)>.detail .consul-exposed-path-list>ul>li>.detail dl:not([class]) dd+dt:not([class])+dd,.list-collection>ul>li:not(:first-child)>.detail .consul-instance-checks+dl:not(:first-of-type),.list-collection>ul>li:not(:first-child)>.detail .consul-lock-session-list dl+dl:not(:first-of-type),.list-collection>ul>li:not(:first-child)>.detail .consul-lock-session-list ul>li:not(:first-child)>.detail dl:not([class]) dd+dt:not([class])+dd,.list-collection>ul>li:not(:first-child)>.detail .consul-upstream-instance-list dl+dl:not(:first-of-type),.list-collection>ul>li:not(:first-child)>.detail .consul-upstream-instance-list dl.local-bind-address dd+dt+dd,.list-collection>ul>li:not(:first-child)>.detail .consul-upstream-instance-list dl.local-bind-socket-path dd+dt+dd,.list-collection>ul>li:not(:first-child)>.detail .consul-upstream-instance-list li>.detail dl:not([class]) dd+dt:not([class])+dd,.list-collection>ul>li:not(:first-child)>.detail .tag-list+dl:not(:first-of-type),.list-collection>ul>li:not(:first-child)>.detail dl .consul-bucket-list:not([class]) dd+dt:not([class])+dd,.list-collection>ul>li:not(:first-child)>.detail dl .consul-instance-checks:not([class]) dd+dt:not([class])+dd,.list-collection>ul>li:not(:first-child)>.detail dl .consul-lock-session-list dl:not([class]) dd+dt:not([class])+dd,.list-collection>ul>li:not(:first-child)>.detail dl .consul-upstream-instance-list dl:not([class]) dd+dt:not([class])+dd,.list-collection>ul>li:not(:first-child)>.detail dl .tag-list:not([class]) dd+dt:not([class])+dd,.list-collection>ul>li:not(:first-child)>.detail dl dd+dt,.list-collection>ul>li:not(:first-child)>.detail dl section[data-route="dc.show.license"] .validity dl:not([class]) dd+dt:not([class])+dd,.list-collection>ul>li:not(:first-child)>.detail dl section[data-route="dc.show.serverstatus"] .redundancy-zones section header dl:not([class]) dd+dt:not([class])+dd,.list-collection>ul>li:not(:first-child)>.detail dl td.tags:not([class]) dd+dt:not([class])+dd,.list-collection>ul>li:not(:first-child)>.detail dl+.consul-bucket-list:not(:first-of-type),.list-collection>ul>li:not(:first-child)>.detail dl+.consul-instance-checks:not(:first-of-type),.list-collection>ul>li:not(:first-child)>.detail dl+.tag-list:not(:first-of-type),.list-collection>ul>li:not(:first-child)>.detail dl+dl:not(:first-of-type),.list-collection>ul>li:not(:first-child)>.detail dl+td.tags:not(:first-of-type),.list-collection>ul>li:not(:first-child)>.detail dl:not([class]) .consul-bucket-list dd+dt:not([class])+dd,.list-collection>ul>li:not(:first-child)>.detail dl:not([class]) .consul-instance-checks dd+dt:not([class])+dd,.list-collection>ul>li:not(:first-child)>.detail dl:not([class]) .consul-lock-session-list dl dd+dt:not([class])+dd,.list-collection>ul>li:not(:first-child)>.detail dl:not([class]) .consul-upstream-instance-list dl dd+dt:not([class])+dd,.list-collection>ul>li:not(:first-child)>.detail dl:not([class]) .tag-list dd+dt:not([class])+dd,.list-collection>ul>li:not(:first-child)>.detail dl:not([class]) dd+dt:not([class])+dd,.list-collection>ul>li:not(:first-child)>.detail dl:not([class]) section[data-route="dc.show.license"] .validity dl dd+dt:not([class])+dd,.list-collection>ul>li:not(:first-child)>.detail dl:not([class]) section[data-route="dc.show.serverstatus"] .redundancy-zones section header dl dd+dt:not([class])+dd,.list-collection>ul>li:not(:first-child)>.detail dl:not([class]) td.tags dd+dt:not([class])+dd,.list-collection>ul>li:not(:first-child)>.detail section[data-route="dc.show.license"] .validity dl+dl:not(:first-of-type),.list-collection>ul>li:not(:first-child)>.detail section[data-route="dc.show.serverstatus"] .redundancy-zones section header dl+dl:not(:first-of-type),.list-collection>ul>li:not(:first-child)>.detail td.tags+dl:not(:first-of-type),.tag-list .consul-bucket-list:not([class]) dd+dt:not([class])+dd,.tag-list .consul-exposed-path-list>ul>li>.detail dl:not([class]) dd+dt:not([class])+dd,.tag-list .consul-instance-checks:not([class]) dd+dt:not([class])+dd,.tag-list .consul-lock-session-list dl:not([class]) dd+dt:not([class])+dd,.tag-list .consul-lock-session-list ul>li:not(:first-child)>.detail dl:not([class]) dd+dt:not([class])+dd,.tag-list .consul-upstream-instance-list dl.local-bind-address dd+dt+dd,.tag-list .consul-upstream-instance-list dl.local-bind-socket-path dd+dt+dd,.tag-list .consul-upstream-instance-list dl:not([class]) dd+dt:not([class])+dd,.tag-list .consul-upstream-instance-list li>.detail dl:not([class]) dd+dt:not([class])+dd,.tag-list .list-collection>ul>li:not(:first-child)>.detail dl:not([class]) dd+dt:not([class])+dd,.tag-list dd+dt,.tag-list section[data-route="dc.show.license"] .validity dl:not([class]) dd+dt:not([class])+dd,.tag-list section[data-route="dc.show.serverstatus"] .redundancy-zones section header dl:not([class]) dd+dt:not([class])+dd,.tag-list td.tags:not([class]) dd+dt:not([class])+dd,.tag-list+.consul-bucket-list:not(:first-of-type),.tag-list+.consul-instance-checks:not(:first-of-type),.tag-list+.tag-list:not(:first-of-type),.tag-list+td.tags:not(:first-of-type),.tag-list:not([class]) .consul-bucket-list dd+dt:not([class])+dd,.tag-list:not([class]) .consul-exposed-path-list>ul>li>.detail dl dd+dt:not([class])+dd,.tag-list:not([class]) .consul-instance-checks dd+dt:not([class])+dd,.tag-list:not([class]) .consul-lock-session-list dl dd+dt:not([class])+dd,.tag-list:not([class]) .consul-lock-session-list ul>li:not(:first-child)>.detail dl dd+dt:not([class])+dd,.tag-list:not([class]) .consul-upstream-instance-list dl dd+dt:not([class])+dd,.tag-list:not([class]) .consul-upstream-instance-list li>.detail dl dd+dt:not([class])+dd,.tag-list:not([class]) .list-collection>ul>li:not(:first-child)>.detail dl dd+dt:not([class])+dd,.tag-list:not([class]) dd+dt:not([class])+dd,.tag-list:not([class]) section[data-route="dc.show.license"] .validity dl dd+dt:not([class])+dd,.tag-list:not([class]) section[data-route="dc.show.serverstatus"] .redundancy-zones section header dl dd+dt:not([class])+dd,.tag-list:not([class]) td.tags dd+dt:not([class])+dd,section[data-route="dc.show.license"] .validity .consul-bucket-list+dl:not(:first-of-type),section[data-route="dc.show.license"] .validity .consul-exposed-path-list>ul>li>.detail dl dl:not([class]) dd+dt:not([class])+dd,section[data-route="dc.show.license"] .validity .consul-exposed-path-list>ul>li>.detail dl+dl:not(:first-of-type),section[data-route="dc.show.license"] .validity .consul-exposed-path-list>ul>li>.detail dl:not([class]) dl dd+dt:not([class])+dd,section[data-route="dc.show.license"] .validity .consul-instance-checks+dl:not(:first-of-type),section[data-route="dc.show.license"] .validity .consul-lock-session-list dl ul>li:not(:first-child)>.detail dl:not([class]) dd+dt:not([class])+dd,section[data-route="dc.show.license"] .validity .consul-lock-session-list dl+dl:not(:first-of-type),section[data-route="dc.show.license"] .validity .consul-lock-session-list dl:not([class]) ul>li:not(:first-child)>.detail dl dd+dt:not([class])+dd,section[data-route="dc.show.license"] .validity .consul-lock-session-list ul>li:not(:first-child)>.detail dl dl:not([class]) dd+dt:not([class])+dd,section[data-route="dc.show.license"] .validity .consul-lock-session-list ul>li:not(:first-child)>.detail dl+dl:not(:first-of-type),section[data-route="dc.show.license"] .validity .consul-lock-session-list ul>li:not(:first-child)>.detail dl:not([class]) dl dd+dt:not([class])+dd,section[data-route="dc.show.license"] .validity .consul-upstream-instance-list dl li>.detail dl:not([class]) dd+dt:not([class])+dd,section[data-route="dc.show.license"] .validity .consul-upstream-instance-list dl+dl:not(:first-of-type),section[data-route="dc.show.license"] .validity .consul-upstream-instance-list dl.local-bind-address dl dd+dt+dd,section[data-route="dc.show.license"] .validity .consul-upstream-instance-list dl.local-bind-socket-path dl dd+dt+dd,section[data-route="dc.show.license"] .validity .consul-upstream-instance-list dl:not([class]) li>.detail dl dd+dt:not([class])+dd,section[data-route="dc.show.license"] .validity .consul-upstream-instance-list li>.detail dl dl:not([class]) dd+dt:not([class])+dd,section[data-route="dc.show.license"] .validity .consul-upstream-instance-list li>.detail dl+dl:not(:first-of-type),section[data-route="dc.show.license"] .validity .consul-upstream-instance-list li>.detail dl:not([class]) dl dd+dt:not([class])+dd,section[data-route="dc.show.license"] .validity .list-collection>ul>li:not(:first-child)>.detail dl dl:not([class]) dd+dt:not([class])+dd,section[data-route="dc.show.license"] .validity .list-collection>ul>li:not(:first-child)>.detail dl+dl:not(:first-of-type),section[data-route="dc.show.license"] .validity .list-collection>ul>li:not(:first-child)>.detail dl:not([class]) dl dd+dt:not([class])+dd,section[data-route="dc.show.license"] .validity .tag-list dl:not([class]) dd+dt:not([class])+dd,section[data-route="dc.show.license"] .validity .tag-list+dl:not(:first-of-type),section[data-route="dc.show.license"] .validity .tag-list:not([class]) dl dd+dt:not([class])+dd,section[data-route="dc.show.license"] .validity dl .consul-exposed-path-list>ul>li>.detail dl:not([class]) dd+dt:not([class])+dd,section[data-route="dc.show.license"] .validity dl .consul-lock-session-list ul>li:not(:first-child)>.detail dl:not([class]) dd+dt:not([class])+dd,section[data-route="dc.show.license"] .validity dl .consul-upstream-instance-list dl.local-bind-address dd+dt+dd,section[data-route="dc.show.license"] .validity dl .consul-upstream-instance-list dl.local-bind-socket-path dd+dt+dd,section[data-route="dc.show.license"] .validity dl .consul-upstream-instance-list li>.detail dl:not([class]) dd+dt:not([class])+dd,section[data-route="dc.show.license"] .validity dl .list-collection>ul>li:not(:first-child)>.detail dl:not([class]) dd+dt:not([class])+dd,section[data-route="dc.show.license"] .validity dl .tag-list:not([class]) dd+dt:not([class])+dd,section[data-route="dc.show.license"] .validity dl dd+dt,section[data-route="dc.show.license"] .validity dl td.tags:not([class]) dd+dt:not([class])+dd,section[data-route="dc.show.license"] .validity dl+.consul-bucket-list:not(:first-of-type),section[data-route="dc.show.license"] .validity dl+.consul-instance-checks:not(:first-of-type),section[data-route="dc.show.license"] .validity dl+.tag-list:not(:first-of-type),section[data-route="dc.show.license"] .validity dl+dl:not(:first-of-type),section[data-route="dc.show.license"] .validity dl+td.tags:not(:first-of-type),section[data-route="dc.show.license"] .validity dl:not([class]) .consul-exposed-path-list>ul>li>.detail dl dd+dt:not([class])+dd,section[data-route="dc.show.license"] .validity dl:not([class]) .consul-lock-session-list ul>li:not(:first-child)>.detail dl dd+dt:not([class])+dd,section[data-route="dc.show.license"] .validity dl:not([class]) .consul-upstream-instance-list li>.detail dl dd+dt:not([class])+dd,section[data-route="dc.show.license"] .validity dl:not([class]) .list-collection>ul>li:not(:first-child)>.detail dl dd+dt:not([class])+dd,section[data-route="dc.show.license"] .validity dl:not([class]) .tag-list dd+dt:not([class])+dd,section[data-route="dc.show.license"] .validity dl:not([class]) dd+dt:not([class])+dd,section[data-route="dc.show.license"] .validity dl:not([class]) td.tags dd+dt:not([class])+dd,section[data-route="dc.show.license"] .validity td.tags dl:not([class]) dd+dt:not([class])+dd,section[data-route="dc.show.license"] .validity td.tags+dl:not(:first-of-type),section[data-route="dc.show.license"] .validity td.tags:not([class]) dl dd+dt:not([class])+dd,section[data-route="dc.show.serverstatus"] .redundancy-zones section header .consul-bucket-list+dl:not(:first-of-type),section[data-route="dc.show.serverstatus"] .redundancy-zones section header .consul-exposed-path-list>ul>li>.detail dl dl:not([class]) dd+dt:not([class])+dd,section[data-route="dc.show.serverstatus"] .redundancy-zones section header .consul-exposed-path-list>ul>li>.detail dl+dl:not(:first-of-type),section[data-route="dc.show.serverstatus"] .redundancy-zones section header .consul-exposed-path-list>ul>li>.detail dl:not([class]) dl dd+dt:not([class])+dd,section[data-route="dc.show.serverstatus"] .redundancy-zones section header .consul-instance-checks+dl:not(:first-of-type),section[data-route="dc.show.serverstatus"] .redundancy-zones section header .consul-lock-session-list dl ul>li:not(:first-child)>.detail dl:not([class]) dd+dt:not([class])+dd,section[data-route="dc.show.serverstatus"] .redundancy-zones section header .consul-lock-session-list dl+dl:not(:first-of-type),section[data-route="dc.show.serverstatus"] .redundancy-zones section header .consul-lock-session-list dl:not([class]) ul>li:not(:first-child)>.detail dl dd+dt:not([class])+dd,section[data-route="dc.show.serverstatus"] .redundancy-zones section header .consul-lock-session-list ul>li:not(:first-child)>.detail dl dl:not([class]) dd+dt:not([class])+dd,section[data-route="dc.show.serverstatus"] .redundancy-zones section header .consul-lock-session-list ul>li:not(:first-child)>.detail dl+dl:not(:first-of-type),section[data-route="dc.show.serverstatus"] .redundancy-zones section header .consul-lock-session-list ul>li:not(:first-child)>.detail dl:not([class]) dl dd+dt:not([class])+dd,section[data-route="dc.show.serverstatus"] .redundancy-zones section header .consul-upstream-instance-list dl li>.detail dl:not([class]) dd+dt:not([class])+dd,section[data-route="dc.show.serverstatus"] .redundancy-zones section header .consul-upstream-instance-list dl+dl:not(:first-of-type),section[data-route="dc.show.serverstatus"] .redundancy-zones section header .consul-upstream-instance-list dl.local-bind-address dl dd+dt+dd,section[data-route="dc.show.serverstatus"] .redundancy-zones section header .consul-upstream-instance-list dl.local-bind-socket-path dl dd+dt+dd,section[data-route="dc.show.serverstatus"] .redundancy-zones section header .consul-upstream-instance-list dl:not([class]) li>.detail dl dd+dt:not([class])+dd,section[data-route="dc.show.serverstatus"] .redundancy-zones section header .consul-upstream-instance-list li>.detail dl dl:not([class]) dd+dt:not([class])+dd,section[data-route="dc.show.serverstatus"] .redundancy-zones section header .consul-upstream-instance-list li>.detail dl+dl:not(:first-of-type),section[data-route="dc.show.serverstatus"] .redundancy-zones section header .consul-upstream-instance-list li>.detail dl:not([class]) dl dd+dt:not([class])+dd,section[data-route="dc.show.serverstatus"] .redundancy-zones section header .list-collection>ul>li:not(:first-child)>.detail dl dl:not([class]) dd+dt:not([class])+dd,section[data-route="dc.show.serverstatus"] .redundancy-zones section header .list-collection>ul>li:not(:first-child)>.detail dl+dl:not(:first-of-type),section[data-route="dc.show.serverstatus"] .redundancy-zones section header .list-collection>ul>li:not(:first-child)>.detail dl:not([class]) dl dd+dt:not([class])+dd,section[data-route="dc.show.serverstatus"] .redundancy-zones section header .tag-list dl:not([class]) dd+dt:not([class])+dd,section[data-route="dc.show.serverstatus"] .redundancy-zones section header .tag-list+dl:not(:first-of-type),section[data-route="dc.show.serverstatus"] .redundancy-zones section header .tag-list:not([class]) dl dd+dt:not([class])+dd,section[data-route="dc.show.serverstatus"] .redundancy-zones section header dl .consul-exposed-path-list>ul>li>.detail dl:not([class]) dd+dt:not([class])+dd,section[data-route="dc.show.serverstatus"] .redundancy-zones section header dl .consul-lock-session-list ul>li:not(:first-child)>.detail dl:not([class]) dd+dt:not([class])+dd,section[data-route="dc.show.serverstatus"] .redundancy-zones section header dl .consul-upstream-instance-list dl.local-bind-address dd+dt+dd,section[data-route="dc.show.serverstatus"] .redundancy-zones section header dl .consul-upstream-instance-list dl.local-bind-socket-path dd+dt+dd,section[data-route="dc.show.serverstatus"] .redundancy-zones section header dl .consul-upstream-instance-list li>.detail dl:not([class]) dd+dt:not([class])+dd,section[data-route="dc.show.serverstatus"] .redundancy-zones section header dl .list-collection>ul>li:not(:first-child)>.detail dl:not([class]) dd+dt:not([class])+dd,section[data-route="dc.show.serverstatus"] .redundancy-zones section header dl .tag-list:not([class]) dd+dt:not([class])+dd,section[data-route="dc.show.serverstatus"] .redundancy-zones section header dl dd+dt,section[data-route="dc.show.serverstatus"] .redundancy-zones section header dl td.tags:not([class]) dd+dt:not([class])+dd,section[data-route="dc.show.serverstatus"] .redundancy-zones section header dl+.consul-bucket-list:not(:first-of-type),section[data-route="dc.show.serverstatus"] .redundancy-zones section header dl+.consul-instance-checks:not(:first-of-type),section[data-route="dc.show.serverstatus"] .redundancy-zones section header dl+.tag-list:not(:first-of-type),section[data-route="dc.show.serverstatus"] .redundancy-zones section header dl+dl:not(:first-of-type),section[data-route="dc.show.serverstatus"] .redundancy-zones section header dl+td.tags:not(:first-of-type),section[data-route="dc.show.serverstatus"] .redundancy-zones section header dl:not([class]) .consul-exposed-path-list>ul>li>.detail dl dd+dt:not([class])+dd,section[data-route="dc.show.serverstatus"] .redundancy-zones section header dl:not([class]) .consul-lock-session-list ul>li:not(:first-child)>.detail dl dd+dt:not([class])+dd,section[data-route="dc.show.serverstatus"] .redundancy-zones section header dl:not([class]) .consul-upstream-instance-list li>.detail dl dd+dt:not([class])+dd,section[data-route="dc.show.serverstatus"] .redundancy-zones section header dl:not([class]) .list-collection>ul>li:not(:first-child)>.detail dl dd+dt:not([class])+dd,section[data-route="dc.show.serverstatus"] .redundancy-zones section header dl:not([class]) .tag-list dd+dt:not([class])+dd,section[data-route="dc.show.serverstatus"] .redundancy-zones section header dl:not([class]) dd+dt:not([class])+dd,section[data-route="dc.show.serverstatus"] .redundancy-zones section header dl:not([class]) td.tags dd+dt:not([class])+dd,section[data-route="dc.show.serverstatus"] .redundancy-zones section header td.tags dl:not([class]) dd+dt:not([class])+dd,section[data-route="dc.show.serverstatus"] .redundancy-zones section header td.tags+dl:not(:first-of-type),section[data-route="dc.show.serverstatus"] .redundancy-zones section header td.tags:not([class]) dl dd+dt:not([class])+dd,section[data-route="dc.show.serverstatus"] .redundancy-zones section[data-route="dc.show.license"] .validity header dl+dl:not(:first-of-type),section[data-route="dc.show.serverstatus"] .redundancy-zones section[data-route="dc.show.license"] header .validity dl+dl:not(:first-of-type),td.tags .consul-bucket-list:not([class]) dd+dt:not([class])+dd,td.tags .consul-exposed-path-list>ul>li>.detail dl:not([class]) dd+dt:not([class])+dd,td.tags .consul-instance-checks:not([class]) dd+dt:not([class])+dd,td.tags .consul-lock-session-list dl:not([class]) dd+dt:not([class])+dd,td.tags .consul-lock-session-list ul>li:not(:first-child)>.detail dl:not([class]) dd+dt:not([class])+dd,td.tags .consul-upstream-instance-list dl.local-bind-address dd+dt+dd,td.tags .consul-upstream-instance-list dl.local-bind-socket-path dd+dt+dd,td.tags .consul-upstream-instance-list dl:not([class]) dd+dt:not([class])+dd,td.tags .consul-upstream-instance-list li>.detail dl:not([class]) dd+dt:not([class])+dd,td.tags .list-collection>ul>li:not(:first-child)>.detail dl:not([class]) dd+dt:not([class])+dd,td.tags .tag-list:not([class]) dd+dt:not([class])+dd,td.tags dd+dt,td.tags section[data-route="dc.show.license"] .validity dl:not([class]) dd+dt:not([class])+dd,td.tags section[data-route="dc.show.serverstatus"] .redundancy-zones section header dl:not([class]) dd+dt:not([class])+dd,td.tags+.consul-bucket-list:not(:first-of-type),td.tags+.consul-instance-checks:not(:first-of-type),td.tags+.tag-list:not(:first-of-type),td.tags+td.tags:not(:first-of-type),td.tags:not([class]) .consul-bucket-list dd+dt:not([class])+dd,td.tags:not([class]) .consul-exposed-path-list>ul>li>.detail dl dd+dt:not([class])+dd,td.tags:not([class]) .consul-instance-checks dd+dt:not([class])+dd,td.tags:not([class]) .consul-lock-session-list dl dd+dt:not([class])+dd,td.tags:not([class]) .consul-lock-session-list ul>li:not(:first-child)>.detail dl dd+dt:not([class])+dd,td.tags:not([class]) .consul-upstream-instance-list dl dd+dt:not([class])+dd,td.tags:not([class]) .consul-upstream-instance-list li>.detail dl dd+dt:not([class])+dd,td.tags:not([class]) .list-collection>ul>li:not(:first-child)>.detail dl dd+dt:not([class])+dd,td.tags:not([class]) .tag-list dd+dt:not([class])+dd,td.tags:not([class]) dd+dt:not([class])+dd,td.tags:not([class]) section[data-route="dc.show.license"] .validity dl dd+dt:not([class])+dd,td.tags:not([class]) section[data-route="dc.show.serverstatus"] .redundancy-zones section header dl dd+dt:not([class])+dd{margin-left:var(--horizontal-kv-list-separator-width)}.consul-bucket-list dt+dd,.consul-exposed-path-list>ul>li>.detail dl dt+dd,.consul-instance-checks dt+dd,.consul-lock-session-list dl dt+dd,.consul-lock-session-list ul>li:not(:first-child)>.detail dl dt+dd,.consul-upstream-instance-list dl dt+dd,.consul-upstream-instance-list li>.detail dl dt+dd,.list-collection>ul>li:not(:first-child)>.detail dl dt+dd,.tag-list dt+dd,section[data-route="dc.show.license"] .validity dl dt+dd,section[data-route="dc.show.serverstatus"] .redundancy-zones section header dl dt+dd,td.tags dt+dd{margin-left:4px}.consul-bucket-list:not([class]) dt:not([class])+dd,.consul-exposed-path-list>ul>li>.detail dl:not([class]) dt:not([class])+dd,.consul-instance-checks:not([class]) dt:not([class])+dd,.consul-lock-session-list dl:not([class]) dt:not([class])+dd,.consul-upstream-instance-list dl.local-bind-address dt+dd,.consul-upstream-instance-list dl.local-bind-socket-path dt+dd,.consul-upstream-instance-list dl:not([class]) dt:not([class])+dd,.list-collection>ul>li:not(:first-child)>.detail dl:not([class]) dt:not([class])+dd,.tag-list:not([class]) dt:not([class])+dd,section[data-route="dc.show.license"] .validity dl:not([class]) dt:not([class])+dd,section[data-route="dc.show.serverstatus"] .redundancy-zones section header dl:not([class]) dt:not([class])+dd,td.tags:not([class]) dt:not([class])+dd{margin-left:0!important}.consul-lock-session-list .checks dd>:not(:last-child)::after,.discovery-chain .resolver-card ol>:not(:last-child)::after,.tag-list dd>:not(:last-child)::after,td.tags dd>:not(:last-child)::after{display:inline;content:var(--csv-list-separator);vertical-align:initial;margin-right:.3em}.tag-list dt::before,td.tags dt::before{color:inherit;color:var(--token-color-foreground-faint)}.consul-exposed-path-list>ul>li>.detail dl>dt>*,.consul-lock-session-list ul>li:not(:first-child)>.detail dl>dt>*,.consul-upstream-instance-list li>.detail dl>dt>*,.list-collection>ul>li:not(:first-child)>.detail dl>dt>*{display:none}.consul-exposed-path-list>ul>li>.detail dl.passing dt::before,.consul-exposed-path-list>ul>li>.header .passing dd::before,.consul-lock-session-list ul>li:not(:first-child)>.detail dl.passing dt::before,.consul-lock-session-list ul>li:not(:first-child)>.header .passing dd::before,.consul-upstream-instance-list li>.detail dl.passing dt::before,.consul-upstream-instance-list li>.header .passing dd::before,.list-collection>ul>li:not(:first-child)>.detail dl.passing dt::before,.list-collection>ul>li:not(:first-child)>.header .passing dd::before{color:var(--token-color-foreground-success)}.consul-exposed-path-list>ul>li>.detail dl.warning dt::before,.consul-exposed-path-list>ul>li>.header .warning dd::before,.consul-lock-session-list ul>li:not(:first-child)>.detail dl.warning dt::before,.consul-lock-session-list ul>li:not(:first-child)>.header .warning dd::before,.consul-upstream-instance-list li>.detail dl.warning dt::before,.consul-upstream-instance-list li>.header .warning dd::before,.list-collection>ul>li:not(:first-child)>.detail dl.warning dt::before,.list-collection>ul>li:not(:first-child)>.header .warning dd::before{color:var(--token-color-foreground-warning)}.consul-exposed-path-list>ul>li>.detail dl.critical dt::before,.consul-exposed-path-list>ul>li>.header .critical dd::before,.consul-lock-session-list ul>li:not(:first-child)>.detail dl.critical dt::before,.consul-lock-session-list ul>li:not(:first-child)>.header .critical dd::before,.consul-upstream-instance-list li>.detail dl.critical dt::before,.consul-upstream-instance-list li>.header .critical dd::before,.list-collection>ul>li:not(:first-child)>.detail dl.critical dt::before,.list-collection>ul>li:not(:first-child)>.header .critical dd::before{color:var(--token-color-foreground-critical)}.consul-exposed-path-list>ul>li>.detail dl.empty dt::before,.consul-exposed-path-list>ul>li>.detail dl.unknown dt::before,.consul-exposed-path-list>ul>li>.header .empty dd::before,.consul-exposed-path-list>ul>li>.header .unknown dd::before,.consul-lock-session-list ul>li:not(:first-child)>.detail dl.empty dt::before,.consul-lock-session-list ul>li:not(:first-child)>.detail dl.unknown dt::before,.consul-lock-session-list ul>li:not(:first-child)>.header .empty dd::before,.consul-lock-session-list ul>li:not(:first-child)>.header .unknown dd::before,.consul-upstream-instance-list li>.detail dl.empty dt::before,.consul-upstream-instance-list li>.detail dl.unknown dt::before,.consul-upstream-instance-list li>.header .empty dd::before,.consul-upstream-instance-list li>.header .unknown dd::before,.list-collection>ul>li:not(:first-child)>.detail dl.empty dt::before,.list-collection>ul>li:not(:first-child)>.detail dl.unknown dt::before,.list-collection>ul>li:not(:first-child)>.header .empty dd::before,.list-collection>ul>li:not(:first-child)>.header .unknown dd::before{color:var(--token-color-foreground-faint)}.consul-exposed-path-list>ul>li>.header [rel=me] dd::before,.consul-lock-session-list ul>li:not(:first-child)>.header [rel=me] dd::before,.consul-upstream-instance-list li>.header [rel=me] dd::before,.list-collection>ul>li:not(:first-child)>.header [rel=me] dd::before{color:var(--token-color-foreground-action)}.app-view>div form:not(.filter-bar) [role=radiogroup] label>em>code,.modal-dialog [role=document] .type-password>em>code,.modal-dialog [role=document] .type-select>em>code,.modal-dialog [role=document] .type-text>em>code,.modal-dialog [role=document] [role=radiogroup] label>em>code,.modal-dialog [role=document] form button+em>code,.modal-dialog [role=document] p code,.oidc-select label>em>code,.type-toggle>em>code,main .type-password>em>code,main .type-select>em>code,main .type-text>em>code,main form button+em>code,main p code{border:1px solid;color:var(--token-color-consul-brand);background-color:var(--token-color-surface-strong);border-color:var(--token-color-surface-interactive-active);display:inline-block;padding:0 4px}[data-tippy-root]{max-width:calc(100vw - 10px)}.tippy-box{outline:0;transition-property:transform,visibility,opacity;background-color:var(--token-color-surface-primary);border-radius:var(--decor-radius-100)}[data-animation=fade][data-state=hidden].tippy-box{opacity:0}[data-inertia][data-state=visible].tippy-box{transition-timing-function:cubic-bezier(.54,1.5,.38,1.11)}.tippy-box .tippy-arrow{--size:5px}.tippy-box .tippy-arrow::before{content:"";position:absolute}[data-placement^=top].tippy-box>.tippy-arrow{bottom:0}[data-placement^=top].tippy-box>.tippy-arrow::before{left:0;bottom:calc(0px - var(--size));transform-origin:center top}[data-placement^=bottom].tippy-box>.tippy-arrow{top:0}[data-placement^=bottom].tippy-box>.tippy-arrow::before{left:0;top:calc(0px - var(--size));transform-origin:center bottom}[data-placement^=left].tippy-box>.tippy-arrow{right:0}[data-placement^=left].tippy-box>.tippy-arrow::before{right:calc(0px - var(--size));transform-origin:center left}[data-placement^=right].tippy-box>.tippy-arrow{left:0}[data-placement^=right].tippy-box>.tippy-arrow::before{left:calc(0px - var(--size));transform-origin:center right}[data-theme~=square-tail] .tippy-arrow{--size:18px;left:calc(0px - var(--size)/ 2)!important}[data-theme~=square-tail] .tippy-arrow::before{background-color:var(--token-color-surface-primary);width:calc(1px + var(--size));height:calc(1px + var(--size));border:var(--decor-border-100);border-color:var(--token-color-palette-neutral-300)}[data-theme~=square-tail] .tippy-arrow::after{position:absolute;left:1px}[data-theme~=square-tail][data-placement^=top]{bottom:-10px}[data-theme~=square-tail][data-placement^=top] .informed-action{border-bottom-left-radius:0!important}[data-theme~=square-tail][data-placement^=top] .tippy-arrow::before{border-bottom-left-radius:var(--decor-radius-200);border-bottom-right-radius:var(--decor-radius-200);border-top:0!important}[data-theme~=square-tail][data-placement^=top] .tippy-arrow::after{bottom:calc(0px - var(--size))}[data-theme~=square-tail][data-placement^=bottom]{top:-10px}[data-theme~=square-tail][data-placement^=bottom] .informed-action{border-top-left-radius:0!important}[data-theme~=square-tail][data-placement^=bottom] .tippy-arrow::before{border-top-left-radius:var(--decor-radius-200);border-top-right-radius:var(--decor-radius-200);border-bottom:0!important}[data-theme~=square-tail][data-placement^=bottom] .tippy-arrow::after{top:calc(0px - var(--size))}.tippy-box[data-theme~=tooltip] .tippy-content{padding:12px;max-width:224px;position:relative;z-index:1}.tippy-box[data-theme~=tooltip]{background-color:var(--token-color-foreground-faint);color:var(--token-color-surface-primary)}.tippy-box[data-theme~=tooltip] .tippy-arrow{--size:5px;color:var(--token-color-foreground-faint);width:calc(var(--size) * 2);height:calc(var(--size) * 2)}.tippy-box[data-theme~=tooltip] .tippy-arrow::before{border-color:transparent;border-style:solid}.tippy-box[data-theme~=tooltip][data-placement^=top]>.tippy-arrow::before{border-width:var(--size) var(--size) 0;border-top-color:initial}.tippy-box[data-theme~=tooltip][data-placement^=bottom]>.tippy-arrow::before{border-width:0 var(--size) var(--size);border-bottom-color:initial}.tippy-box[data-theme~=tooltip][data-placement^=left]>.tippy-arrow::before{border-width:var(--size) 0 var(--size) var(--size);border-left-color:initial}.tippy-box[data-theme~=tooltip][data-placement^=right]>.tippy-arrow::before{border-width:var(--size) var(--size) var(--size) 0;border-right-color:initial}.warning.modal-dialog header{background-color:var(--token-color-vault-gradient-faint-start);border-color:var(--token-color-vault-brand);color:var(--token-color-vault-foreground)}.warning.modal-dialog header>:not(label){font-size:var(--typo-size-500);font-weight:var(--typo-weight-semibold)}.warning.modal-dialog header::before{color:var(--token-color-vault-brand);float:left;margin-top:2px;margin-right:3px}.modal-dialog>div:first-child{background-color:var(--token-color-surface-interactive);opacity:.9}.modal-dialog [role=document]>footer,.modal-dialog [role=document]>header,.modal-dialog-body{border-color:var(--token-color-palette-neutral-300)}.modal-dialog-body{border-style:solid;border-left-width:1px;border-right-width:1px}.modal-layer{height:0}.modal-dialog [role=document] table{height:150px!important}.modal-dialog [role=document] tbody{max-height:100px}.modal-dialog table{min-height:149px}.modal-dialog,.modal-dialog>div:first-child{position:fixed;top:0;right:0;bottom:0;left:0}.modal-dialog{z-index:500;align-items:center;justify-content:center;height:100%}[aria-hidden=true].modal-dialog{display:none}.modal-dialog [role=document]{box-shadow:var(--token-elevation-overlay-box-shadow);background-color:var(--token-color-surface-primary);margin:auto;z-index:2;max-width:855px;position:relative}.modal-dialog [role=document]>*{padding-left:15px;padding-right:15px}.modal-dialog [role=document]>div{overflow-y:auto;max-height:80vh;padding:20px 23px}.modal-dialog [role=document]>footer,.modal-dialog [role=document]>header{border-width:1px;padding-top:12px;padding-bottom:10px}.modal-dialog [role=document]>header{position:relative}.modal-dialog [role=document]>header button{float:right;margin-top:-3px}.list-collection>ul{border-top:1px solid;border-color:var(--token-color-surface-interactive-active)}.list-collection>button{cursor:pointer;background-color:var(--token-color-surface-strong);color:var(--token-color-foreground-action);width:100%;padding:15px}.list-collection-scroll-virtual,.list-collection>ul>li{position:relative}.list-collection-scroll-virtual{height:500px}.filter-bar{background-color:var(--token-color-foreground-high-contrast);border-bottom:var(--decor-border-100);border-color:var(--token-color-surface-interactive-active);padding:4px 8px}.filter-bar .filters .popover-menu>[type=checkbox]:checked+label button,.filter-bar .sort .popover-menu>[type=checkbox]:checked+label button{color:var(--token-color-foreground-action);background-color:var(--token-color-foreground-high-contrast)}.filter-bar .sort{margin-left:auto}.filter-bar .popover-select{position:relative;z-index:3}.filter-bar .popover-menu>[type=checkbox]+label button{padding-left:1.5rem!important;padding-right:1.5rem!important}.filter-bar .popover-menu [role=menuitem]{justify-content:normal!important}@media (max-width:1379px){.filter-bar,.filter-bar>div{flex-wrap:wrap}.filter-bar .search{position:relative;z-index:4;width:100%;margin-bottom:.3rem}}@media (max-width:995px){.filter-bar .filters,.filter-bar .sort{display:none}}html[data-route^="dc.acls.index"] .filter-bar{color:inherit}.freetext-filter{border:var(--decor-border-100);border-radius:var(--decor-radius-100);background-color:var(--token-color-surface-primary);border-color:var(--token-color-surface-interactive-active);color:var(--token-color-foreground-disabled)}.freetext-filter:hover,.freetext-filter:hover *{border-color:var(--token-color-foreground-disabled)}.freetext-filter_input::-moz-placeholder{cursor:inherit;color:inherit;border-color:inherit}.freetext-filter *,.freetext-filter_input::placeholder{cursor:inherit;color:inherit;border-color:inherit}.freetext-filter_input{-webkit-appearance:none;border:none}.freetext-filter_label::after{visibility:visible;--icon-name:icon-search;content:"";position:absolute;top:50%;left:50%;width:16px;height:16px;margin-left:-8px;margin-top:-8px}.freetext-filter .popover-menu{background-color:var(--token-color-surface-strong);color:var(--token-color-foreground-primary);border-left:1px solid;border-color:inherit}.freetext-filter .popover-menu>[type=checkbox]:checked+label button{background-color:var(--token-color-surface-interactive-active)}.freetext-filter{--height:2.2rem;display:flex;position:relative;height:var(--height);width:100%}.freetext-filter_input,.freetext-filter_label{height:100%}.freetext-filter_input{padding:8px 10px;padding-left:var(--height);min-width:12.7rem;width:100%}.freetext-filter_label{visibility:hidden;position:absolute;z-index:1;width:var(--height)}.informed-action{border-radius:var(--decor-radius-200);border:var(--decor-border-100);border-color:var(--token-color-palette-neutral-300);background-color:var(--token-color-surface-primary);min-width:190px}.informed-action>div{border-top-left-radius:var(--decor-radius-200);border-top-right-radius:var(--decor-radius-200);cursor:default;padding:1rem}.informed-action p{color:var(--token-color-hashicorp-brand)}.informed-action>ul>li>:focus,.informed-action>ul>li>:hover{background-color:var(--token-color-surface-strong)}.info.informed-action header{color:var(--token-color-foreground-action-active)}.info.informed-action header::before{background-color:var(--token-color-foreground-action);margin-right:5px}.info.informed-action>div{background-color:var(--token-color-surface-action)}.dangerous.informed-action header{color:var(--token-color-palette-red-400)}.dangerous.informed-action header::before{background-color:var(--token-color-foreground-critical)}.dangerous.informed-action>div{background-color:var(--token-color-surface-critical)}.warning.informed-action header{color:var(--token-color-foreground-warning-on-surface)}.warning.informed-action header::before{background-color:var(--token-color-vault-brand);margin-right:5px}.warning.informed-action>div{background-color:var(--token-color-vault-gradient-faint-start)}.copyable-code::after,.tab-nav li:not(.selected)>:active,.tab-nav li:not(.selected)>:focus,.tab-nav li:not(.selected)>:hover{background-color:var(--token-color-surface-strong)}.informed-action>ul>.action>*{color:var(--token-color-foreground-action)}.documentation.informed-action{min-width:270px}.informed-action header::before{float:left;margin-right:5px}.informed-action>ul{list-style:none;display:flex;margin:0;padding:4px}.informed-action>ul>li{width:50%}.informed-action>ul>li>*{width:100%}.tab-nav ul{list-style-type:none;display:inline-flex;align-items:center;position:relative;padding:0;margin:0}.tab-nav li>:not(:disabled){cursor:pointer}.tab-nav{border-bottom:var(--decor-border-100)}.animatable.tab-nav ul::after,.tab-nav li>*{border-bottom:var(--decor-border-300)}.tab-nav{border-color:var(--token-color-surface-interactive-active);clear:both;overflow:auto;letter-spacing:.03em}.tab-nav li>*{white-space:nowrap;transition-property:background-color,border-color;border-color:transparent;color:var(--token-color-foreground-faint);display:inline-block;padding:16px 13px}.tab-nav li:not(.selected)>:focus,.tab-nav li:not(.selected)>:hover{border-color:var(--token-color-palette-neutral-300)}.animatable.tab-nav .selected a{border-color:transparent!important}.animatable.tab-nav ul::after{position:absolute;bottom:0;height:0;border-top:0;width:calc(var(--selected-width,0) * 1px);transform:translate(calc(var(--selected-left,0) * 1px),0);transition-property:transform,width}.search-bar-status{border-bottom:var(--decor-border-100);border-bottom-color:var(--token-color-surface-interactive-active);padding:.5rem 0 .5rem .5rem}.search-bar-status li:not(.remove-all) button::before{color:var(--token-color-foreground-faint);margin-top:1px;margin-right:.2rem}.search-bar-status dt::after{content:":";padding-right:.3rem}.search-bar-status>dl>dt{float:left}.search-bar-status dt{white-space:nowrap}.search-bar-status li{display:inline-flex}.search-bar-status li:not(:last-child){margin-right:.3rem;margin-bottom:.3rem}.search-bar-status li:not(.remove-all){border:var(--decor-border-100);border-color:var(--token-color-surface-interactive-active);color:var(--token-color-foreground-faint);padding:0 .2rem}.search-bar-status li:not(.remove-all) dl{display:flex}.search-bar-status li:not(.remove-all) button{cursor:pointer;padding:0}.copyable-code{display:flex;align-items:flex-start;position:relative;width:100%;padding:8px 14px 3px;border:var(--decor-border-100);border-color:var(--token-color-surface-interactive-active);border-radius:var(--decor-radius-200)}.copyable-code.obfuscated{padding-left:4px}.copyable-code::after{position:absolute;top:0;right:0;width:40px;height:100%;display:block;content:""}.copyable-code .copy-button{position:absolute;top:0;right:0;z-index:1}.copyable-code .copy-button button{width:40px;height:40px}.copyable-code .copy-button button:empty::after{display:none}.copyable-code button[aria-expanded]{margin-top:1px;margin-right:4px;cursor:pointer}.copyable-code button[aria-expanded]::before{content:"";--icon-size:icon-000;--icon-color:var(--token-color-foreground-faint)}.copyable-code button[aria-expanded=true]::before{--icon-name:icon-eye-off}.copyable-code button[aria-expanded=false]::before{--icon-name:icon-eye}.copyable-code pre{padding-right:30px}.copyable-code code{display:inline-block;overflow:hidden;text-overflow:ellipsis;width:100%}.copyable-code hr{width:calc(100% - 80px);margin:8px 0 13px;border:3px dashed var(--token-color-palette-neutral-300);background-color:var(--token-color-surface-primary)}.consul-loader circle{fill:var(--token-color-consul-gradient-faint-stop);-webkit-animation:loader-animation 1.5s infinite ease-in-out;animation:loader-animation 1.5s infinite ease-in-out;transform-origin:50% 50%}.consul-loader g:nth-last-child(2) circle{-webkit-animation-delay:.2s;animation-delay:.2s}.consul-loader g:nth-last-child(3) circle{-webkit-animation-delay:.3s;animation-delay:.3s}.consul-loader g:nth-last-child(4) circle{-webkit-animation-delay:.4s;animation-delay:.4s}.consul-loader g:nth-last-child(5) circle{-webkit-animation-delay:.5s;animation-delay:.5s}@-webkit-keyframes loader-animation{0%,100%{transform:scale3D(1,1,1)}33%{transform:scale3D(0,0,1)}}@keyframes loader-animation{0%,100%{transform:scale3D(1,1,1)}33%{transform:scale3D(0,0,1)}}.consul-loader{display:flex;align-items:center;justify-content:center;height:100%;position:absolute;width:100%;top:0;margin-top:0!important}.tomography-graph .background{fill:var(--token-color-surface-strong)}.tomography-graph .axis{fill:none;stroke:var(--token-color-palette-neutral-300);stroke-dasharray:4 4}.tomography-graph .border{fill:none;stroke:var(--token-color-palette-neutral-300)}.tomography-graph .point{stroke:var(--token-color-foreground-disabled);fill:var(--token-color-consul-foreground)}.tomography-graph .lines rect{fill:var(--token-color-consul-foreground);stroke:transparent;stroke-width:5px}.tomography-graph .lines rect:hover{fill:var(--token-color-palette-neutral-300);height:3px;y:-1px}.tomography-graph .tick line{stroke:var(--token-color-palette-neutral-300)}.tomography-graph .tick text{font-size:var(--typo-size-600);text-anchor:start}.discovery-chain .resolver-card,.discovery-chain .route-card,.discovery-chain .splitter-card,.discovery-chain path{transition-duration:.1s;transition-timing-function:linear;cursor:pointer}.discovery-chain path{transition-property:stroke;fill:none;stroke:var(--token-color-foreground-disabled);stroke-width:2;vector-effect:non-scaling-stroke}#downstream-lines svg circle,#upstream-lines svg circle,.discovery-chain circle{fill:var(--token-color-surface-primary)}.discovery-chain .resolver-card,.discovery-chain .resolver-card a,.discovery-chain .route-card,.discovery-chain .route-card a,.discovery-chain .splitter-card,.discovery-chain .splitter-card a{color:var(--token-color-foreground-strong)!important}.discovery-chain path:focus,.discovery-chain path:hover{stroke:var(--token-color-foreground-strong)}.discovery-chain .resolvers,.discovery-chain .routes,.discovery-chain .splitters{border-radius:var(--decor-radius-100);border:1px solid;border-color:var(--token-color-surface-interactive-active);background-color:var(--token-color-surface-strong);pointer-events:none}.discovery-chain .resolver-card,.discovery-chain .resolvers>header span,.discovery-chain .route-card,.discovery-chain .routes>header span,.discovery-chain .splitter-card,.discovery-chain .splitters>header span{pointer-events:all}.discovery-chain .resolvers>header>*,.discovery-chain .routes>header>*,.discovery-chain .splitters>header>*{text-transform:uppercase}.discovery-chain .resolvers>header span::after,.discovery-chain .routes>header span::after,.discovery-chain .splitters>header span::after{width:1.2em;height:1.2em;opacity:.6}.discovery-chain .resolver-card,.discovery-chain .route-card,.discovery-chain .splitter-card{transition-property:opacity background-color border-color;margin-top:0!important}.discovery-chain [id*=":"]:not(path):hover{opacity:1;background-color:var(--token-color-surface-primary);border-color:var(--token-color-foreground-faint)}.discovery-chain .route-card header:not(.short) dd{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.discovery-chain .route-card section header>*{visibility:hidden}.discovery-chain .route-card .match-headers header ::before{content:"H"}.discovery-chain .route-card .match-queryparams header>::before{content:"Q"}.discovery-chain .resolver-card dt::before{content:"";--icon-size:icon-999}.discovery-chain .resolver-card dl.failover dt::before{--icon-name:icon-cloud-cross}.discovery-chain .resolver-card dl.redirect dt::before{--icon-name:icon-redirect}.discovery-chain circle{stroke-width:2;stroke:var(--token-color-foreground-disabled)}.discovery-chain{position:relative;display:flex;justify-content:space-between}.discovery-chain svg{position:absolute}.discovery-chain .resolvers,.discovery-chain .routes,.discovery-chain .splitters{padding:10px 1%;width:32%}.discovery-chain .resolvers>header,.discovery-chain .routes>header,.discovery-chain .splitters>header{height:18px}.discovery-chain .resolvers>header span,.discovery-chain .routes>header span,.discovery-chain .splitters>header span{position:relative;z-index:1;margin-left:2px}.discovery-chain .resolvers [role=group],.discovery-chain .routes [role=group],.discovery-chain .splitters [role=group]{position:relative;z-index:1;display:flex;flex-direction:column;justify-content:space-around;height:100%}.discovery-chain .resolver-card dl,.discovery-chain .route-card dl,.discovery-chain .splitter-card dl{margin:0;float:none}.discovery-chain .resolver-card,.discovery-chain .route-card,.discovery-chain .splitter-card{margin-bottom:20px}.discovery-chain .route-card header.short dl{display:flex}.discovery-chain .route-card header.short dt::after{content:" ";display:inline-block}.discovery-chain .route-card>header ul{float:right;margin-top:-2px}.discovery-chain .route-card>header ul li{margin-left:5px}.discovery-chain .route-card section{display:flex}.discovery-chain .route-card section header{display:block;width:19px;margin-right:14px}.discovery-chain .resolver-card a{display:block}.discovery-chain .resolver-card dl{display:flex;flex-wrap:wrap;margin-top:5px}.discovery-chain .resolver-card dt{font-size:0;margin-right:6px;margin-top:1px;width:23px;height:20px}.discovery-chain .resolver-card ol{display:flex;flex-wrap:wrap;list-style-type:none}.discovery-chain .route-card,.discovery-chain .splitter-card{position:relative}.discovery-chain .route-card::before,.discovery-chain .splitter-card::before{background-color:var(--token-color-surface-primary);border-radius:var(--decor-radius-full);border:2px solid;border-color:var(--token-color-foreground-disabled);position:absolute;z-index:1;right:-5px;top:50%;margin-top:-5px;width:10px;height:10px}.discovery-chain .resolver-inlets,.discovery-chain .splitter-inlets{width:10px;height:100%;z-index:1}.discovery-chain .splitter-inlets{left:50%;margin-left:calc(-15% - 3px)}.discovery-chain .resolver-inlets{right:calc(31% - 7px)}.consul-bucket-list .service+dd{font-weight:var(--typo-weight-semibold)}.consul-bucket-list dd:not(:last-child)::after{display:inline-block;content:"/";margin:0 6px 0 3px}.consul-bucket-list .service+dd,.consul-bucket-list dd+dt{margin-left:0!important}.consul-upstream-instance-list dl.local-bind-socket-mode dt{text-transform:lowercase;font-weight:var(--typo-weight-semibold)}.consul-health-check-list .health-check-output::before{min-width:20px;min-height:20px;margin-right:15px}@media (max-width:650px){.consul-health-check-list .health-check-output::before{min-width:18px;min-height:18px;margin-right:8px}}.consul-health-check-list .health-check-output dd em{background-color:var(--token-color-surface-strong);cursor:default;font-style:normal;margin-top:-2px;margin-left:.5em}.consul-health-check-list .passing.health-check-output::before{color:var(--token-color-foreground-success)}.consul-health-check-list .warning.health-check-output::before{color:var(--token-color-foreground-warning)}.consul-health-check-list .critical.health-check-output::before{color:var(--token-color-foreground-critical)}.consul-health-check-list .health-check-output,.consul-health-check-list .health-check-output pre{border-radius:var(--decor-radius-100)}.consul-health-check-list .health-check-output dd:first-of-type{color:var(--token-color-foreground-disabled)}.consul-health-check-list .health-check-output pre{background-color:var(--token-color-surface-strong);color:var(--token-color-foreground-faint)}.consul-health-check-list .health-check-output{border-width:1px 1px 1px 4px;color:var(--token-color-foreground-strong);border-color:var(--token-color-surface-interactive-active);border-style:solid;display:flex;padding:20px 24px 20px 16px}.consul-health-check-list .passing.health-check-output{border-left-color:var(--token-color-foreground-success)}.consul-health-check-list .warning.health-check-output{border-left-color:var(--token-color-vault-brand)}.consul-health-check-list .critical.health-check-output{border-left-color:var(--token-color-foreground-critical)}.consul-health-check-list .health-check-output:not(:last-child){margin-bottom:24px}.consul-health-check-list .health-check-output dl:last-of-type,.consul-health-check-list .health-check-output header{width:100%}.consul-health-check-list .health-check-output header{margin-bottom:.9em}.consul-health-check-list .health-check-output>div{flex:1 1 auto;width:calc(100% - 26px);display:flex;flex-wrap:wrap;justify-content:space-between}.consul-health-check-list .health-check-output dl{min-width:110px}.consul-health-check-list .health-check-output dl>*{display:block;width:auto;position:static;padding-left:0}.consul-health-check-list .health-check-output dt{margin-bottom:0}.consul-health-check-list .health-check-output dd{position:relative}.consul-health-check-list .health-check-output dl:nth-last-of-type(2){width:50%}.consul-health-check-list .health-check-output dl:last-of-type{margin-top:1em;margin-bottom:0}.consul-health-check-list .health-check-output dl:last-of-type dt{margin-bottom:.3em}.consul-health-check-list .health-check-output pre{padding:12px 40px 12px 12px;white-space:pre-wrap;position:relative}.consul-health-check-list .health-check-output pre code{word-wrap:break-word}.consul-health-check-list .health-check-output .copy-button{position:absolute;right:.5em;top:.7em}@media (max-width:650px){.consul-health-check-list .health-check-output{padding:15px 19px 15px 14px}.consul-health-check-list .health-check-output::before{margin-right:8px}.consul-health-check-list .health-check-output dl:nth-last-of-type(2){width:100%}.consul-health-check-list .health-check-output dl:not(:last-of-type){margin-right:0}}.consul-instance-checks.passing dt::before{color:var(--token-color-foreground-success)}.consul-instance-checks.warning dt::before{color:var(--token-color-foreground-warning)}.consul-instance-checks.critical dt::before{color:var(--token-color-foreground-critical)}.consul-instance-checks.empty dt::before{color:var(--token-color-foreground-faint)}.consul-exposed-path-list>ul{border-top:1px solid var(--token-color-surface-interactive-active)}.consul-external-source::before,.consul-kind::before{--icon-size:icon-300}.consul-intention-list td.intent- strong::before,.consul-intention-list td.intent-allow strong::before,.consul-intention-list td.intent-deny strong::before,.consul-intention-permission-list .intent-allow::before,.consul-intention-permission-list .intent-deny::before,.consul-intention-search-bar .value- span::before,.consul-intention-search-bar .value-allow span::before,.consul-intention-search-bar .value-deny span::before{margin-right:5px}.consul-intention-list td.intent- strong,.consul-intention-list td.intent-allow strong,.consul-intention-list td.intent-deny strong,.consul-intention-permission-list .intent-allow,.consul-intention-permission-list .intent-deny,.consul-intention-search-bar .value- span,.consul-intention-search-bar .value-allow span,.consul-intention-search-bar .value-deny span{display:inline-block;font-weight:var(--typo-weight-normal);font-size:var(--typo-size-600)}.consul-intention-list td.intent-allow strong,.consul-intention-permission-list .intent-allow,.consul-intention-search-bar .value-allow span{color:var(--token-color-foreground-success-on-surface);background-color:var(--token-color-border-success)}.consul-intention-list td.intent-deny strong,.consul-intention-permission-list .intent-deny,.consul-intention-search-bar .value-deny span{color:var(--token-color-foreground-critical-on-surface);background-color:var(--token-color-border-critical)}.consul-intention-list td.permissions{color:var(--token-color-foreground-action)}.consul-intention-list em{--word-spacing:0.25rem}.consul-intention-list em span::before,.consul-intention-list em span:first-child{margin-right:var(--word-spacing)}.consul-intention-list em span:last-child{margin-left:var(--word-spacing)}.consul-intention-list td{height:59px}.consul-intention-list tr>:nth-child(1){width:calc(30% - 50px)}.consul-intention-list tr>:nth-child(2){width:120px}.consul-intention-list tr>:nth-child(3){width:calc(30% - 50px)}.consul-intention-list tr>:nth-child(4){width:calc(40% - 240px)}.consul-intention-list tr>:nth-child(5){width:160px}.consul-intention-list tr>:last-child{width:60px}.consul-intention-list .menu-panel.confirmation{width:200px}@media (max-width:849px){.consul-intention-list tr>:not(.source):not(.destination):not(.intent){display:none}}.consul-intention-action-warn-modal .modal-dialog-window{max-width:450px}.consul-intention-action-warn-modal .modal-dialog-body p{font-size:var(--typo-size-600)}.consul-intention-fieldsets [role=radiogroup]{overflow:visible!important;display:grid;grid-gap:12px;grid-template-columns:repeat(auto-fit,minmax(270px,auto))}.consul-intention-fieldsets .radio-card header>*{display:inline}.consul-intention-fieldsets .permissions>button{float:right}.consul-intention-permission-modal [role=dialog]{width:100%}.consul-intention-permission-list dl.permission-methods dt::before{content:"M"}.consul-intention-permission-list dl.permission-path dt::before{content:"P"}.consul-intention-permission-header-list dt::before,.consul-intention-permission-list dl.permission-header dt::before{content:"H"}.consul-intention-permission-list .detail>div{display:flex;width:100%}.consul-intention-permission-list strong{margin-right:8px}.consul-intention-permission-form h2{border-top:1px solid var(--token-color-foreground-action);padding-top:1.4em;margin-top:.2em;margin-bottom:.6em}.consul-intention-permission-form .consul-intention-permission-header-form{margin-top:10px}.consul-intention-permission-form .consul-intention-permission-header-form fieldset>div,.consul-intention-permission-form fieldset:nth-child(2)>div{display:grid;grid-template-columns:repeat(auto-fit,minmax(160px,1fr));grid-gap:12px}.consul-intention-permission-form fieldset:nth-child(2)>div label:last-child{grid-column:span 2}.consul-intention-permission-form .ember-basic-dropdown-trigger{padding:5px}.consul-intention-permission-form .checkbox-group{flex-direction:column}.consul-intention-permission-header-list{max-height:200px;overflow:auto}.consul-lock-session-list button{margin-right:var(--horizontal-padding)}.consul-lock-session-form{overflow:hidden}.consul-server-list ul{display:grid;grid-template-columns:repeat(4,minmax(215px,25%));gap:12px}.consul-server-list a:hover div{box-shadow:var(--token-elevation-overlay-box-shadow);--tone-border:var(--token-color-foreground-faint)}.consul-server-card .name+dd{color:var(--token-color-hashicorp-brand);-webkit-animation-name:typo-truncate;animation-name:typo-truncate}.consul-server-card .health-status+dd{font-size:var(--typo-size-700)}.voting-status-non-voter.consul-server-card .health-status+dd{background-color:var(--token-color-surface-strong);color:var(--token-color-foreground-faint)}.consul-server-card:not(.voting-status-non-voter) .health-status.healthy+dd{background-color:var(--token-color-surface-success);color:var(--token-color-palette-green-400)}.consul-server-card:not(.voting-status-non-voter) .health-status:not(.healthy)+dd{background-color:var(--token-color-surface-critical);color:var(--token-color-foreground-critical)}.consul-server-card .health-status+dd::before{--icon-size:icon-000;content:""}.consul-server-card .health-status.healthy+dd::before{--icon-name:icon-check}.consul-server-card .health-status:not(.healthy)+dd::before{--icon-name:icon-x}.consul-server-card{position:relative;overflow:hidden;--padding-x:24px;--padding-y:24px;padding:var(--padding-y) var(--padding-x);--tile-size:3rem}.consul-auth-method-binding-list h2,.consul-auth-method-view section h2{padding-bottom:12px}.voting-status-leader.consul-server-card .name{position:absolute!important}.consul-server-card dd:not(:last-of-type){margin-bottom:calc(var(--padding-y)/ 2)}.voting-status-leader.consul-server-card dd{margin-left:calc(var(--tile-size) + 1rem)}.consul-auth-method-list ul .locality::before{margin-right:4px}.consul-auth-method-view{margin-bottom:32px}.consul-auth-method-view section{width:100%;position:relative;overflow-y:auto}.consul-auth-method-view section table thead td{color:var(--token-color-foreground-faint);font-weight:var(--typo-weight-semibold);font-size:var(--typo-size-700)}.consul-auth-method-view section table tbody td{font-size:var(--typo-size-600);color:var(--token-color-hashicorp-brand)}.consul-auth-method-view section table tbody tr{cursor:default}.consul-auth-method-view section table tbody tr:hover{box-shadow:none}.consul-auth-method-view section dt{width:30%}.consul-auth-method-view section dd{width:70%}.consul-auth-method-binding-list p{margin-bottom:4px!important}.consul-auth-method-binding-list code{background-color:var(--token-color-surface-strong);padding:0 12px}.consul-auth-method-nspace-list thead td{color:var(--token-color-foreground-faint)!important;font-weight:var(--typo-weight-semibold)!important;font-size:var(--typo-size-700)!important}.consul-auth-method-nspace-list tbody td{font-size:var(--typo-size-600);color:var(--token-color-hashicorp-brand)}.consul-auth-method-nspace-list tbody tr{cursor:default}.consul-auth-method-nspace-list tbody tr:hover{box-shadow:none}.role-selector [name="role[state]"],.role-selector [name="role[state]"]+*{display:none}.role-selector [name="role[state]"]:checked+*{display:block}.topology-notices button{color:var(--token-color-foreground-action);float:right;margin-top:16px;margin-bottom:32px}#metrics-container .link a,.topology-container{color:var(--token-color-foreground-faint)}#downstream-container .topology-metrics-card:not(:last-child),#upstream-column #upstream-container:not(:last-child),#upstream-container .topology-metrics-card:not(:last-child){margin-bottom:8px}#downstream-container,#metrics-container,#upstream-container{border-radius:var(--decor-radius-100);border:1px solid;border-color:var(--token-color-surface-interactive-active)}#downstream-container,#upstream-container{background-color:var(--token-color-surface-strong);padding:12px}#downstream-container>div:first-child{display:inline-flex}#downstream-container>div:first-child span::before{background-color:var(--token-color-foreground-faint)}#metrics-container div:first-child{background-color:var(--token-color-surface-primary);padding:12px;border:none;font-size:16px;font-weight:700}#metrics-container .link{background-color:var(--token-color-surface-strong);padding:18px}#metrics-container .link a:hover{color:var(--token-color-foreground-action)}#downstream-lines svg path,#upstream-lines svg path{fill:transparent}#downstream-lines svg .allow-arrow,#upstream-lines svg .allow-arrow{fill:var(--token-color-palette-neutral-300);stroke-linejoin:round}#downstream-lines svg .allow-arrow,#downstream-lines svg .allow-dot,#downstream-lines svg path,#upstream-lines svg .allow-arrow,#upstream-lines svg .allow-dot,#upstream-lines svg path{stroke:var(--token-color-palette-neutral-300);stroke-width:2}#downstream-lines svg path[data-permission=empty],#downstream-lines svg path[data-permission=not-defined],#upstream-lines svg path[data-permission=empty],#upstream-lines svg path[data-permission=not-defined]{stroke-dasharray:4}#downstream-lines svg path[data-permission=deny],#upstream-lines svg path[data-permission=deny]{stroke:var(--token-color-foreground-critical)}#downstream-lines svg .deny-dot,#upstream-lines svg .deny-dot{stroke:var(--token-color-foreground-critical);stroke-width:2}#downstream-lines svg .deny-arrow,#upstream-lines svg .deny-arrow{fill:var(--token-color-foreground-critical);stroke:var(--token-color-foreground-critical);stroke-linejoin:round}.topology-notices{display:flow-root}.topology-container{display:grid;height:100%;align-items:start;grid-template-columns:2fr 1fr 2fr 1fr 2fr;grid-template-rows:50px 1fr 50px;grid-template-areas:"down-cards down-lines . up-lines up-cards" "down-cards down-lines metrics up-lines up-cards" "down-cards down-lines . up-lines up-cards"}#downstream-container{grid-area:down-cards}#downstream-lines{grid-area:down-lines;margin-left:-20px}#upstream-lines{grid-area:up-lines;margin-right:-20px}#upstream-column{grid-area:up-cards}#downstream-lines,#upstream-lines{position:relative}#metrics-container{grid-area:metrics}#metrics-container .link a::before{background-color:var(--token-color-foreground-faint);margin-right:4px}#downstream-container .topology-metrics-card,#upstream-container .topology-metrics-card{display:block;color:var(--token-color-foreground-faint);overflow:hidden;background-color:var(--token-color-surface-primary);border-radius:var(--decor-radius-100);border:1px solid;border-color:var(--token-color-surface-interactive-active)}#downstream-container .topology-metrics-card p,#upstream-container .topology-metrics-card p{padding:12px 12px 0;font-size:var(--typo-size-500);font-weight:var(--typo-weight-semibold);margin-bottom:0!important}#downstream-container .topology-metrics-card p.empty,#upstream-container .topology-metrics-card p.empty{padding:12px!important}#downstream-container .topology-metrics-card div dl,#upstream-container .topology-metrics-card div dl{display:inline-flex;margin-right:8px}#downstream-container .topology-metrics-card div dd,#upstream-container .topology-metrics-card div dd{color:var(--token-color-foreground-faint)}#downstream-container .topology-metrics-card div span,#upstream-container .topology-metrics-card div span{margin-right:8px}#downstream-container .topology-metrics-card div dt::before,#downstream-container .topology-metrics-card div span::before,#upstream-container .topology-metrics-card div dt::before,#upstream-container .topology-metrics-card div span::before{margin-right:4px}#downstream-container .topology-metrics-card div .health dt::before,#downstream-container .topology-metrics-card div .nspace dt::before,#upstream-container .topology-metrics-card div .health dt::before,#upstream-container .topology-metrics-card div .nspace dt::before{margin-top:2px}#downstream-container .topology-metrics-card div .health dt::before,#downstream-container .topology-metrics-card div .nspace dt::before,#downstream-container .topology-metrics-card div .partition dt::before,#upstream-container .topology-metrics-card div .health dt::before,#upstream-container .topology-metrics-card div .nspace dt::before,#upstream-container .topology-metrics-card div .partition dt::before{--icon-color:var(--token-color-foreground-faint)}#downstream-container .topology-metrics-card div .passing::before,#upstream-container .topology-metrics-card div .passing::before{--icon-color:var(--token-color-foreground-success)}#downstream-container .topology-metrics-card div .warning::before,#upstream-container .topology-metrics-card div .warning::before{--icon-color:var(--token-color-foreground-warning)}#downstream-container .topology-metrics-card div .critical::before,#upstream-container .topology-metrics-card div .critical::before{--icon-color:var(--token-color-foreground-critical)}#downstream-container .topology-metrics-card div .empty::before,#upstream-container .topology-metrics-card div .empty::before{--icon-color:var(--token-color-foreground-faint)}#downstream-container .topology-metrics-card .details,#upstream-container .topology-metrics-card .details{padding:0 12px 12px}#downstream-container .topology-metrics-card .details>:not(:last-child),#upstream-container .topology-metrics-card .details>:not(:last-child){padding-bottom:6px}#downstream-container .topology-metrics-card .details .group,#upstream-container .topology-metrics-card .details .group{display:grid;grid-template-columns:20px 1fr;grid-template-rows:repeat(2,1fr);grid-template-areas:"partition partition" "union namespace"}#downstream-container .topology-metrics-card .details .group span,#upstream-container .topology-metrics-card .details .group span{display:inline-block;grid-area:union;padding-left:7px;margin-right:0}#downstream-container .topology-metrics-card .details .group span::before,#upstream-container .topology-metrics-card .details .group span::before{margin-right:0;--icon-color:var(--token-color-foreground-faint)}#downstream-container .topology-metrics-card .details .group dl:first-child,#upstream-container .topology-metrics-card .details .group dl:first-child{grid-area:partition;padding-bottom:6px}#downstream-container .topology-metrics-card .details .group dl:nth-child(2),#upstream-container .topology-metrics-card .details .group dl:nth-child(2){grid-area:namespace}.topology-metrics-source-type{margin:6px 0 6px 12px;display:table}.topology-metrics-popover>button{position:absolute;transform:translate(-50%,-50%);background-color:var(--token-color-surface-primary);padding:1px}.topology-metrics-popover>button:hover{cursor:pointer}.topology-metrics-popover>button:disabled,html[data-route^="dc.nodes.show.metadata"] table tr{cursor:default}.topology-metrics-popover>button:active,.topology-metrics-popover>button:focus{outline:0}.topology-metrics-popover.deny .informed-action header::before{display:none}.topology-metrics-popover.deny .tippy-arrow::after,.topology-metrics-popover.deny>button::before{--icon-color:var(--token-color-foreground-critical)}.topology-metrics-popover.not-defined .tippy-arrow::after,.topology-metrics-popover.not-defined>button::before{--icon-color:var(--token-color-vault-brand)}#metrics-container .sparkline-wrapper svg path{stroke-width:0}#metrics-container .sparkline-wrapper .tooltip{padding:0 0 10px;font-size:.875em;line-height:1.5em;font-weight:400;border:1px solid var(--token-color-palette-neutral-300);background:#fff;border-radius:2px;box-sizing:border-box;box-shadow:var(--token-elevation-higher-box-shadow)}#metrics-container .sparkline-wrapper .tooltip .sparkline-time{padding:8px 10px;font-weight:700;font-size:14px;color:#000;border-bottom:1px solid var(--token-color-surface-interactive-active);margin-bottom:4px;text-align:center}#metrics-container .sparkline-wrapper .tooltip .sparkline-tt-legend,#metrics-container .sparkline-wrapper .tooltip .sparkline-tt-sum{border:0;padding:3px 10px 0}#metrics-container .sparkline-wrapper .tooltip .sparkline-tt-sum{border-top:1px solid var(--token-color-surface-interactive-active);margin-top:4px;padding:8px 10px 0}#metrics-container .sparkline-wrapper .tooltip .sparkline-tt-legend-color{width:12px;height:12px;border-radius:2px;margin:0 5px 0 0;padding:0}#metrics-container .sparkline-wrapper .tooltip .sparkline-tt-legend-value,#metrics-container .sparkline-wrapper .tooltip .sparkline-tt-sum-value{float:right}#metrics-container .sparkline-wrapper div.tooltip:before{content:"";display:block;position:absolute;width:12px;height:12px;left:15px;bottom:-7px;border:1px solid var(--token-color-palette-neutral-300);border-top:0;border-left:0;background:#fff;transform:rotate(45deg)}.sparkline-key h3::before{margin:2px 3px 0 0;font-size:14px}.sparkline-key h3{color:var(--token-color-foreground-strong);font-size:16px}.sparkline-key .sparkline-key-content dd,.sparkline-key-link{color:var(--token-color-foreground-faint)}.sparkline-key-link:hover{color:var(--token-color-foreground-action)}#metrics-container:hover .sparkline-key-link::before{margin:1px 3px 0 0;font-size:12px}#metrics-container div .sparkline-wrapper,#metrics-container div .sparkline-wrapper svg.sparkline{width:100%;height:70px;padding:0;margin:0}#metrics-container div .sparkline-wrapper{position:relative}#metrics-container div .sparkline-wrapper .tooltip{visibility:hidden;position:absolute;z-index:10;bottom:78px;width:217px}#metrics-container div .sparkline-wrapper .sparkline-tt-legend-color{display:inline-block}#metrics-container div .sparkline-wrapper .topology-metrics-error,#metrics-container div .sparkline-wrapper .topology-metrics-loader{padding-top:15px}.sparkline-key .sparkline-key-content{width:500px;min-height:100px}.sparkline-key .sparkline-key-content dl{padding:10px 0 0}.sparkline-key .sparkline-key-content dt{font-weight:600;width:125px;float:left}.sparkline-key .sparkline-key-content dd{margin:0 0 12px 135px}.sparkline-key-link{visibility:hidden;float:right;margin-top:-35px;margin-right:12px}#metrics-container:hover .sparkline-key-link{visibility:visible}.topology-metrics-stats{padding:12px 12px 0;display:flex;flex-flow:row wrap;justify-content:space-between;align-items:stretch;width:100%;border-top:1px solid var(--token-color-surface-interactive-active)}.topology-metrics-stats dl{display:flex;padding-bottom:12px}.topology-metrics-stats dt{margin-right:5px;line-height:1.5em!important}.topology-metrics-stats dd{color:var(--token-color-foreground-disabled)!important}.topology-metrics-stats span{padding-bottom:12px}.topology-metrics-status-error,.topology-metrics-status-loader{font-weight:400;font-size:.875rem;color:var(--token-color-foreground-faint);text-align:center;margin:0 auto!important;display:block}.topology-metrics-status-error span::before,.topology-metrics-status-loader span::before{background-color:var(--token-color-foreground-faint)}span.topology-metrics-status-loader::after{--icon-name:var(--icon-loading);content:"";margin-left:.5rem}.consul-node-peer-info .consul-node-peer-info__name,.consul-peer-info .consul-peer-info__description{margin-left:4px}.consul-intention-list-table__meta-info{display:flex}.consul-intention-list-table__meta-info .consul-intention-list-table__meta-info__peer{display:flex;align-items:center}.consul-node-peer-info,.peerings-badge{align-items:center;display:flex}.consul-peer-search-bar .value-active span::before,.consul-peer-search-bar .value-deleting span::before,.consul-peer-search-bar .value-establishing span::before,.consul-peer-search-bar .value-failing span::before,.consul-peer-search-bar .value-pending span::before,.consul-peer-search-bar .value-terminated span::before{--icon-size:icon-000;content:""}.consul-peer-search-bar .value-active span,.consul-peer-search-bar .value-deleting span,.consul-peer-search-bar .value-establishing span,.consul-peer-search-bar .value-failing span,.consul-peer-search-bar .value-pending span,.consul-peer-search-bar .value-terminated span{font-weight:var(--typo-weight-medium);font-size:var(--typo-size-700)}.consul-peer-search-bar .value-pending span::before{--icon-name:icon-running;--icon-color:var(--token-color-palette-neutral-600)}.consul-peer-search-bar .value-pending span{background-color:var(--token-color-consul-surface);color:var(--token-color-consul-foreground)}.consul-peer-search-bar .value-establishing span::before{--icon-name:icon-running;--icon-color:var(--token-color-palette-neutral-600)}.consul-peer-search-bar .value-establishing span{background-color:var(--token-color-palette-blue-50);color:var(--token-color-palette-blue-200)}.consul-peer-search-bar .value-active span::before{--icon-name:icon-check;--icon-color:var(--token-color-palette-green-400)}.consul-peer-search-bar .value-active span{background-color:var(--token-color-palette-green-50);color:var(--token-color-palette-green-200)}.consul-peer-search-bar .value-failing span::before{--icon-name:icon-x;--icon-color:var(--token-color-palette-red-200)}.consul-peer-search-bar .value-failing span{background-color:var(--token-color-palette-red-50);color:var(--token-color-palette-red-200)}.consul-peer-search-bar .value-terminated span::before{--icon-name:icon-x-square;--icon-color:var(--token-color-palette-neutral-600)}.consul-peer-search-bar .value-terminated span{background-color:var(--token-color-palette-neutral-200);color:var(--token-color-palette-neutral-600)}.consul-peer-search-bar .value-deleting span::before{--icon-name:icon-loading;--icon-color:var(--token-color-foreground-warning-on-surface)}.consul-peer-search-bar .value-deleting span{background-color:var(--token-color-surface-warning);color:var(--token-color-foreground-warning-on-surface)}.peers__list__peer-detail{display:flex;align-content:center;gap:18px}.border-bottom-primary{border-bottom:1px solid var(--token-color-border-primary)}.peerings-badge{justify-content:center;padding:2px 8px;border-radius:5px;gap:4px}.peerings-badge.active{background:var(--token-color-surface-success);color:var(--token-color-foreground-success)}.peerings-badge.pending{background:var(--token-color-consul-surface);color:var(--token-color-consul-brand)}.peerings-badge.establishing{background:var(--token-color-surface-action);color:var(--token-color-foreground-action)}.peerings-badge.failing{background:var(--token-color-surface-critical);color:var(--token-color-foreground-critical)}.peerings-badge.deleting{background:var(--token-color-surface-warning);color:var(--token-color-foreground-warning-on-surface)}.peerings-badge.terminated,.peerings-badge.undefined{background:var(--token-color-surface-interactive-active);color:var(--token-color-foreground-primary)}.consul-peer-info,section[data-route="dc.show.serverstatus"] .server-failure-tolerance dt{color:var(--token-color-foreground-faint)}.peerings-badge .peerings-badge__text{font-weight:500;font-size:13px}.consul-peer-info{background:var(--token-color-surface-faint);padding:0 8px;border-radius:2px;display:flex;align-items:center}.consul-peer-form{width:416px}.consul-peer-form nav{margin-bottom:20px}.consul-peer-form-generate{width:416px;min-height:200px}.consul-peer-form-generate ol{list-style-position:outside;list-style-type:none;counter-reset:hexagonal-counter;position:relative}.consul-peer-form-generate ol::before{content:"";border-left:var(--decor-border-100);border-color:var(--token-color-palette-neutral-300);height:100%;position:absolute;left:2rem}.consul-peer-form-generate li{counter-increment:hexagonal-counter;position:relative;margin-left:60px;margin-bottom:1rem}.consul-peer-form-generate li .copyable-code{margin-top:1rem}.consul-peer-form-generate li::before{--icon-name:icon-hexagon;--icon-size:icon-600;content:"";position:absolute;z-index:2}.consul-peer-form-generate li::after{content:counter(hexagonal-counter);position:absolute;top:0;font-size:14px;font-weight:var(--typo-weight-bold);background-color:var(--token-color-palette-neutral-0);z-index:1;text-align:center}.consul-peer-form-generate li::after,.consul-peer-form-generate li::before{left:-2.4rem;width:20px;height:20px}.consul-hcp-home{position:relative;top:-22px}.consul-hcp-home a::before{content:"";--icon-name:icon-arrow-left;--icon-size:icon-300;margin-right:8px}.agentless-node-notice .hds-alert__title{display:flex;justify-content:space-between}.definition-table dt{line-height:var(--typo-lead-700)}.app-view>div form:not(.filter-bar) [role=radiogroup] label,.modal-dialog [role=document] [role=radiogroup] label{line-height:var(--typo-lead-200)}.app-view>div form:not(.filter-bar) [role=radiogroup] label>span,.consul-intention-action-warn-modal button.dangerous,.copy-button button,.modal-dialog [role=document] .type-password>span,.modal-dialog [role=document] .type-select>span,.modal-dialog [role=document] .type-text>span,.modal-dialog [role=document] [role=radiogroup] label>span,.oidc-select label>span,.popover-select label>*,.topology-notices button,.type-sort.popover-select label>*,.type-toggle>span,main .type-password>span,main .type-select>span,main .type-text>span,span.label{font-weight:var(--typo-weight-semibold)}.discovery-chain .route-card header:not(.short) dd,.discovery-chain .route-card section dt,.discovery-chain .splitter-card>header{font-weight:var(--typo-weight-bold)}.app-view h1 em,.app-view>div form:not(.filter-bar) [role=radiogroup] label>strong,.consul-auth-method-type,.consul-external-source,.consul-health-check-list .health-check-output dd em,.consul-intention-list td strong,.consul-intention-list td.destination em,.consul-intention-list td.source em,.consul-intention-permission-list strong,.consul-intention-search-bar li button span,.consul-kind,.consul-peer-search-bar li button span,.consul-server-card .health-status+dd,.consul-source,.consul-transparent-proxy,.discovery-chain .route-card header dt,.discovery-chain .route-card>header ul li,.empty-state header :nth-child(2),.hashicorp-consul nav .dcs .dc-name span,.hashicorp-consul nav .dcs li.is-local span,.hashicorp-consul nav .dcs li.is-primary span,.leader,.modal-dialog [role=document] .type-password>strong,.modal-dialog [role=document] .type-select>strong,.modal-dialog [role=document] .type-text>strong,.modal-dialog [role=document] [role=radiogroup] label>strong,.modal-dialog [role=document] label a[rel*=help],.modal-dialog [role=document] table td:first-child em,.oidc-select label>strong,.search-bar-status li:not(.remove-all),.topology-metrics-source-type,.type-toggle>strong,html[data-route^="dc.acls.index"] main td strong,main .type-password>strong,main .type-select>strong,main .type-text>strong,main label a[rel*=help],main table td:first-child em,section[data-route="dc.show.serverstatus"] .redundancy-zones section header dl,section[data-route="dc.show.serverstatus"] .server-failure-tolerance header em,span.policy-node-identity,span.policy-service-identity{font-weight:var(--typo-weight-normal)}.app-view h1 em,.app-view>div form:not(.filter-bar) [role=radiogroup] label>em,.consul-intention-list td.destination em,.consul-intention-list td.source em,.modal-dialog [role=document] .type-password>em,.modal-dialog [role=document] .type-select>em,.modal-dialog [role=document] .type-text>em,.modal-dialog [role=document] [role=radiogroup] label>em,.modal-dialog [role=document] form button+em,.modal-dialog [role=document] table td:first-child em,.oidc-select label>em,.type-toggle>em,main .type-password>em,main .type-select>em,main .type-text>em,main form button+em,main table td:first-child em{font-style:normal}.consul-exposed-path-list>ul>li>.header,.consul-lock-session-list ul>li:not(:first-child)>.header,.consul-upstream-instance-list li>.header,.list-collection>ul>li:not(:first-child)>.header{font-size:var(--typo-size-450);font-weight:var(--typo-weight-medium)}.consul-exposed-path-list>ul>li>.header :not(button),.consul-lock-session-list ul>li:not(:first-child)>.header :not(button),.consul-upstream-instance-list li>.header :not(button),.list-collection>ul>li:not(:first-child)>.header :not(button){font-size:inherit;font-weight:inherit}.app-view h1 em{font-size:var(--typo-size-500)}@media (max-width:420px) and (-webkit-min-device-pixel-ratio:0){input{font-size:16px!important}}#wrapper{box-sizing:content-box}#wrapper>footer>*,.modal-dialog>*,main>*{box-sizing:border-box}html[data-route$=create] main,html[data-route$=edit] main{max-width:1260px}fieldset [role=group]{display:flex;flex-wrap:wrap;flex-direction:row}.outlet[data-state=loading],html.ember-loading .view-loader,html:not(.has-nspaces) [class*=nspace-],html:not(.has-partitions) [class*=partition-],html[data-state=idle] .view-loader{display:none}[role=group] fieldset{width:50%}[role=group] fieldset:not(:first-of-type){padding-left:20px;border-left:1px solid;border-left:var(--token-color-foreground-faint)}[role=group] fieldset:not(:last-of-type){padding-right:20px}.app-view{margin-top:50px}@media (max-width:849px){html:not(.with-breadcrumbs) .app-view{margin-top:10px}}html body>.brand-loader{transition-property:transform,opacity;transform:translate(0,0);opacity:1}html[data-state]:not(.ember-loading) body>.brand-loader{opacity:0}@media (min-width:900px){html[data-state] body>.brand-loader{transform:translate(calc(var(--chrome-width)/ 2),0)}}html[data-route$=create] .app-view>header+div>:first-child,html[data-route$=edit] .app-view>header+div>:first-child{margin-top:1.8em}.app-view>div .container,.app-view>div .tab-section .consul-health-check-list,.app-view>div .tab-section>.search-bar+p,.app-view>div .tab-section>:first-child:not(.filter-bar):not(table){margin-top:1.25em}.consul-upstream-instance-list,html[data-route^="dc.nodes.show.sessions"] .consul-lock-session-list{margin-top:0!important}.consul-auth-method-list ul,.consul-node-list ul,.consul-nspace-list ul,.consul-peer-list ul,.consul-policy-list ul,.consul-role-list ul,.consul-service-instance-list ul,.consul-token-list ul,html[data-route="dc.services.index"] .consul-service-list ul,html[data-route^="dc.nodes.show.sessions"] .consul-lock-session-list ul{border-top-width:0!important}#wrapper{padding-left:48px;padding-right:48px;display:flex;min-height:100vh;flex-direction:column}main{position:relative;flex:1}html:not([data-route$=index]):not([data-route$=instances]) main{margin-bottom:2em}@media (max-width:849px){.actions button.copy-btn{margin-top:-56px;padding:0}}.modal-dialog [role=document] p:not(:last-child),main p:not(:last-child){margin-bottom:1em}.modal-dialog [role=document] form+div .with-confirmation,.modal-dialog [role=document] form:not(.filter-bar),main form+div .with-confirmation,main form:not(.filter-bar){margin-bottom:2em}@media (max-width:420px){main form [type=reset]{float:right;margin-right:0!important}}html[data-route^="dc.services.show"] .app-view .actions .external-dashboard{position:absolute;top:50px;right:0}html[data-route^="dc.services.instance"] .app-view>header dl{float:left;margin-top:19px;margin-bottom:23px;margin-right:50px}html[data-route^="dc.services.instance"] .app-view>header dt{font-weight:var(--typo-weight-bold)}html[data-route^="dc.services.instance"] .tab-nav{border-top:var(--decor-border-100)}html[data-route^="dc.services.instance"] .tab-section section:not(:last-child){border-bottom:var(--decor-border-100);padding-bottom:24px}html[data-route^="dc.services.instance"] .tab-nav,html[data-route^="dc.services.instance"] .tab-section section:not(:last-child){border-color:var(--token-color-surface-interactive-active)}html[data-route^="dc.services.instance.metadata"] .tab-section section h2{margin:24px 0 12px}html[data-route^="dc.kv"] .type-toggle{float:right;margin-bottom:0!important}html[data-route^="dc.kv.edit"] h2{border-bottom:var(--decor-border-200);border-color:var(--token-color-surface-interactive-active);padding-bottom:.2em;margin-bottom:.5em}html[data-route^="dc.acls.index"] main td strong{margin-right:3px}@media (max-width:420px){html[data-route^="dc.acls.create"] main header .actions,html[data-route^="dc.acls.edit"] main header .actions{float:none;display:flex;justify-content:space-between;margin-bottom:1em}html[data-route^="dc.acls.create"] main header .actions .with-feedback,html[data-route^="dc.acls.edit"] main header .actions .with-feedback{position:absolute;right:0}html[data-route^="dc.acls.create"] main header .actions .with-confirmation,html[data-route^="dc.acls.edit"] main header .actions .with-confirmation{margin-top:0}}html[data-route^="dc.intentions.edit"] .definition-table{margin-bottom:1em}section[data-route="dc.show.serverstatus"] .server-failure-tolerance{box-shadow:none;padding:var(--padding-y) var(--padding-x);max-width:770px;display:flex;flex-wrap:wrap}section[data-route="dc.show.serverstatus"] .server-failure-tolerance>header{width:100%;display:flex;flex-direction:row;justify-content:space-between;align-items:center;padding-bottom:.5rem;margin-bottom:1rem;border-bottom:var(--decor-border-100);border-color:var(--tone-border)}section[data-route="dc.show.serverstatus"] .server-failure-tolerance header em{font-size:.812rem;background-color:var(--token-color-surface-interactive-active);text-transform:uppercase;font-style:normal}section[data-route="dc.show.serverstatus"] .server-failure-tolerance>section{width:50%}section[data-route="dc.show.serverstatus"] .server-failure-tolerance dl,section[data-route="dc.show.serverstatus"] .server-failure-tolerance>section{display:flex;flex-direction:column}section[data-route="dc.show.serverstatus"] .server-failure-tolerance dl{flex-grow:1;justify-content:space-between}section[data-route="dc.show.serverstatus"] .server-failure-tolerance dl.warning dd::before{--icon-name:icon-alert-circle;--icon-size:icon-800;--icon-color:var(--token-color-foreground-warning);content:"";margin-right:.5rem}section[data-route="dc.show.serverstatus"] .server-failure-tolerance section:first-of-type dl{padding-right:1.5rem}section[data-route="dc.show.serverstatus"] .server-failure-tolerance dd{display:flex;align-items:center;font-size:var(--typo-size-250);color:var(--token-color-hashicorp-brand)}section[data-route="dc.show.serverstatus"] .server-failure-tolerance header span::before{--icon-name:icon-info;--icon-size:icon-300;--icon-color:var(--token-color-foreground-faint);vertical-align:unset;content:""}section[data-route="dc.show.serverstatus"] section:not([class*=-tolerance]) h2{margin-top:1.5rem;margin-bottom:1.5rem}section[data-route="dc.show.serverstatus"] section:not([class*=-tolerance]) header{margin-top:18px;margin-bottom:18px}section[data-route="dc.show.serverstatus"] .redundancy-zones section header{display:flow-root}section[data-route="dc.show.serverstatus"] .redundancy-zones section header h3{float:left;margin-right:.5rem}section[data-route="dc.show.serverstatus"] .redundancy-zones section header dl:not(.warning){background-color:var(--token-color-surface-strong)}section[data-route="dc.show.serverstatus"] .redundancy-zones section header dl.warning{background-color:var(--token-color-border-warning);color:var(--token-color-palette-amber-400)}section[data-route="dc.show.serverstatus"] .redundancy-zones section header dl.warning::before{--icon-name:icon-alert-circle;--icon-size:icon-000;margin-right:.312rem;content:""}section[data-route="dc.show.serverstatus"] .redundancy-zones section header dt::after{content:":";display:inline-block;vertical-align:revert;background-color:transparent}section[data-route="dc.show.license"] .validity p{color:var(--token-color-foreground-faint)}section[data-route="dc.show.license"] .validity dl{font-size:var(--typo-size-400)}section[data-route="dc.show.license"] .validity dl dt::before{content:"";margin-right:.25rem}section[data-route="dc.show.license"] .validity dl .expired::before{--icon-name:icon-x-circle;--icon-color:var(--token-color-foreground-critical)}section[data-route="dc.show.license"] .validity dl .warning::before{--icon-name:icon-alert-circle;--icon-color:var(--token-color-foreground-warning)}section[data-route="dc.show.license"] .validity dl .valid:not(.warning)::before{--icon-name:icon-check-circle;--icon-color:var(--token-color-foreground-success)}section[data-route="dc.show.license"] aside{box-shadow:none;padding:var(--padding-y) var(--padding-x);width:40%;min-width:413px;margin-top:1rem}section[data-route="dc.show.license"] aside header{margin-bottom:1rem}.prefers-reduced-motion{--icon-loading:icon-loading}@media (prefers-reduced-motion){:root{--icon-loading:icon-loading}}.consul-intention-fieldsets .value->:last-child::before,.consul-intention-fieldsets .value-allow>:last-child::before,.consul-intention-fieldsets .value-deny>:last-child::before{--icon-size:icon-500;--icon-resolution:0.5}.consul-intention-fieldsets .value-allow>:last-child::before,.consul-intention-list td.intent-allow strong::before,.consul-intention-permission-list .intent-allow::before,.consul-intention-search-bar .value-allow span::before{--icon-name:icon-arrow-right;--icon-color:var(--token-color-foreground-success-on-surface)}.consul-intention-fieldsets .value-deny>:last-child::before,.consul-intention-list td.intent-deny strong::before,.consul-intention-permission-list .intent-deny::before,.consul-intention-search-bar .value-deny span::before{--icon-name:icon-skip;--icon-color:var(--token-color-foreground-critical-on-surface)}.consul-intention-fieldsets .value->:last-child::before,.consul-intention-list td.intent- strong::before,.consul-intention-search-bar .value- span::before{--icon-name:icon-layers}*{border-width:0}.animatable.tab-nav ul::after,.consul-auth-method-type,.consul-external-source,.consul-intention-action-warn-modal button.dangerous,.consul-intention-action-warn-modal button.dangerous:disabled,.consul-intention-action-warn-modal button.dangerous:focus,.consul-intention-action-warn-modal button.dangerous:hover:active,.consul-intention-action-warn-modal button.dangerous:hover:not(:disabled):not(:active),.consul-intention-list td.intent- strong,.consul-intention-permission-form button.type-submit,.consul-intention-permission-form button.type-submit:disabled,.consul-intention-permission-form button.type-submit:focus:not(:disabled),.consul-intention-permission-form button.type-submit:hover:not(:disabled),.consul-intention-search-bar .value- span,.consul-kind,.consul-source,.consul-transparent-proxy,.disclosure-menu [aria-expanded]~*>ul>li.dangerous>:first-child,.disclosure-menu [aria-expanded]~*>ul>li.dangerous>:focus:first-child,.disclosure-menu [aria-expanded]~*>ul>li.dangerous>:hover:first-child,.discovery-chain .route-card>header ul li,.informed-action>ul>.dangerous>*,.informed-action>ul>.dangerous>:focus,.informed-action>ul>.dangerous>:hover,.leader,.menu-panel>ul>li.dangerous>:first-child,.menu-panel>ul>li.dangerous>:focus:first-child,.menu-panel>ul>li.dangerous>:hover:first-child,.modal-dialog [role=document]>footer,.modal-dialog [role=document]>header,.more-popover-menu>[type=checkbox]+label+div>ul>li.dangerous>:first-child,.more-popover-menu>[type=checkbox]+label+div>ul>li.dangerous>:focus:first-child,.more-popover-menu>[type=checkbox]+label+div>ul>li.dangerous>:hover:first-child,.popover-menu>[type=checkbox]+label+div>ul>li.dangerous>:first-child,.popover-menu>[type=checkbox]+label+div>ul>li.dangerous>:focus:first-child,.popover-menu>[type=checkbox]+label+div>ul>li.dangerous>:hover:first-child,.tab-nav .selected>*,.topology-metrics-source-type,html[data-route^="dc.acls.index"] main td strong,span.policy-node-identity,span.policy-service-identity,table.has-actions tr>.actions>[type=checkbox]+label+div>ul>li.dangerous>:first-child,table.has-actions tr>.actions>[type=checkbox]+label+div>ul>li.dangerous>:focus:first-child,table.has-actions tr>.actions>[type=checkbox]+label+div>ul>li.dangerous>:hover:first-child,table.with-details tr>.actions>[type=checkbox]+label+div>ul>li.dangerous>:first-child,table.with-details tr>.actions>[type=checkbox]+label+div>ul>li.dangerous>:focus:first-child,table.with-details tr>.actions>[type=checkbox]+label+div>ul>li.dangerous>:hover:first-child{border-style:solid}.consul-auth-method-type,.consul-external-source,.consul-kind,.consul-source,.consul-transparent-proxy,.leader,.topology-metrics-source-type,span.policy-node-identity,span.policy-service-identity{background-color:var(--token-color-surface-strong);border-color:var(--token-color-foreground-faint);color:var(--token-color-foreground-primary)}.consul-intention-list td.intent- strong,.consul-intention-search-bar .value- span,.discovery-chain .route-card>header ul li,.modal-dialog [role=document]>footer,.modal-dialog [role=document]>header,html[data-route^="dc.acls.index"] main td strong{background-color:var(--token-color-surface-strong);border-color:var(--token-color-palette-neutral-300);color:var(--token-color-foreground-strong)}.animatable.tab-nav ul::after,.consul-intention-permission-form button.type-submit,.consul-intention-permission-form button.type-submit:disabled,.tab-nav .selected>*{background-color:var(--token-color-surface-primary);border-color:var(--token-color-foreground-action);color:var(--token-color-foreground-action)}.consul-intention-permission-form button.type-submit:focus:not(:disabled),.consul-intention-permission-form button.type-submit:hover:not(:disabled){background-color:var(--token-color-surface-action);border-color:var(--token-color-foreground-action);color:var(--token-color-palette-blue-500)}.consul-intention-action-warn-modal button.dangerous,.disclosure-menu [aria-expanded]~*>ul>li.dangerous>:first-child,.informed-action>ul>.dangerous>*,.menu-panel>ul>li.dangerous>:first-child,.more-popover-menu>[type=checkbox]+label+div>ul>li.dangerous>:first-child,.popover-menu>[type=checkbox]+label+div>ul>li.dangerous>:first-child,table.has-actions tr>.actions>[type=checkbox]+label+div>ul>li.dangerous>:first-child,table.with-details tr>.actions>[type=checkbox]+label+div>ul>li.dangerous>:first-child{background-color:transparent;border-color:var(--token-color-foreground-critical);color:var(--token-color-foreground-critical)}.consul-intention-action-warn-modal button.dangerous:disabled{background-color:var(--token-color-border-critical);border-color:var(--token-color-foreground-disabled);color:var(--token-color-surface-primary)}.consul-intention-action-warn-modal button.dangerous:focus,.consul-intention-action-warn-modal button.dangerous:hover:not(:disabled):not(:active),.disclosure-menu [aria-expanded]~*>ul>li.dangerous>:focus:first-child,.disclosure-menu [aria-expanded]~*>ul>li.dangerous>:hover:first-child,.informed-action>ul>.dangerous>:focus,.informed-action>ul>.dangerous>:hover,.menu-panel>ul>li.dangerous>:focus:first-child,.menu-panel>ul>li.dangerous>:hover:first-child,.more-popover-menu>[type=checkbox]+label+div>ul>li.dangerous>:focus:first-child,.more-popover-menu>[type=checkbox]+label+div>ul>li.dangerous>:hover:first-child,.popover-menu>[type=checkbox]+label+div>ul>li.dangerous>:focus:first-child,.popover-menu>[type=checkbox]+label+div>ul>li.dangerous>:hover:first-child,table.has-actions tr>.actions>[type=checkbox]+label+div>ul>li.dangerous>:focus:first-child,table.has-actions tr>.actions>[type=checkbox]+label+div>ul>li.dangerous>:hover:first-child,table.with-details tr>.actions>[type=checkbox]+label+div>ul>li.dangerous>:focus:first-child,table.with-details tr>.actions>[type=checkbox]+label+div>ul>li.dangerous>:hover:first-child{background-color:var(--token-color-foreground-critical);border-color:var(--token-color-foreground-critical-high-contrast);color:var(--token-color-surface-primary)}.consul-intention-action-warn-modal button.dangerous:hover:active{background-color:var(--token-color-palette-red-400);border-color:var(--token-color-foreground-critical-high-contrast);color:var(--token-color-surface-primary)}[role=banner] nav:last-of-type .dangerous button:focus,[role=banner] nav:last-of-type .dangerous button:hover{color:var(--token-color-surface-primary)!important}[role=banner] nav:first-of-type .menu-panel a:focus,[role=banner] nav:first-of-type .menu-panel a:hover{background-color:var(--token-color-foreground-action)}.hover\:scale-125:hover{--tw-scale-x:1.25;--tw-scale-y:1.25}.group:hover .group-hover\:opacity-100{opacity:1} \ No newline at end of file diff --git a/agent/uiserver/dist/assets/consul-ui/routes-e55bc65732ba7c0352d43313fd9563e6.js b/agent/uiserver/dist/assets/consul-ui/routes-c69d5bf72b7c740af5e6ce29eefe65bf.js similarity index 52% rename from agent/uiserver/dist/assets/consul-ui/routes-e55bc65732ba7c0352d43313fd9563e6.js rename to agent/uiserver/dist/assets/consul-ui/routes-c69d5bf72b7c740af5e6ce29eefe65bf.js index 0168f3ce0a0..0004d8645f9 100644 --- a/agent/uiserver/dist/assets/consul-ui/routes-e55bc65732ba7c0352d43313fd9563e6.js +++ b/agent/uiserver/dist/assets/consul-ui/routes-c69d5bf72b7c740af5e6ce29eefe65bf.js @@ -1 +1 @@ -((e,t=("undefined"!=typeof document?document.currentScript.dataset:module.exports))=>{t.routes=JSON.stringify(e)})({dc:{_options:{path:"/:dc"},index:{_options:{path:"/",redirect:"../services"}},show:{_options:{path:"/overview",abilities:["access overview"]},serverstatus:{_options:{path:"/server-status",abilities:["access overview","read zones"]}},cataloghealth:{_options:{path:"/catalog-health",abilities:["access overview"]}},license:{_options:{path:"/license",abilities:["access overview","read licence"]}}},services:{_options:{path:"/services"},index:{_options:{path:"/",queryParams:{sortBy:"sort",status:"status",source:"source",kind:"kind",searchproperty:{as:"searchproperty",empty:[["Name","Tags"]]},search:{as:"filter",replace:!0}}}},show:{_options:{path:"/:name"},instances:{_options:{path:"/instances",queryParams:{sortBy:"sort",status:"status",source:"source",searchproperty:{as:"searchproperty",empty:[["Name","Node","Tags","ID","Address","Port","Service.Meta","Node.Meta"]]},search:{as:"filter",replace:!0}}}},intentions:{_options:{path:"/intentions"},index:{_options:{path:"",queryParams:{sortBy:"sort",access:"access",searchproperty:{as:"searchproperty",empty:[["SourceName","DestinationName"]]},search:{as:"filter",replace:!0}}}},edit:{_options:{path:"/:intention_id"}},create:{_options:{template:"../edit",path:"/create"}}},topology:{_options:{path:"/topology"}},services:{_options:{path:"/services",queryParams:{sortBy:"sort",instance:"instance",searchproperty:{as:"searchproperty",empty:[["Name","Tags"]]},search:{as:"filter",replace:!0}}}},upstreams:{_options:{path:"/upstreams",queryParams:{sortBy:"sort",instance:"instance",searchproperty:{as:"searchproperty",empty:[["Name","Tags"]]},search:{as:"filter",replace:!0}}}},routing:{_options:{path:"/routing"}},tags:{_options:{path:"/tags"}}},instance:{_options:{path:"/:name/instances/:node/:id",redirect:"./healthchecks"},healthchecks:{_options:{path:"/health-checks",queryParams:{sortBy:"sort",status:"status",check:"check",searchproperty:{as:"searchproperty",empty:[["Name","Node","CheckID","Notes","Output","ServiceTags"]]},search:{as:"filter",replace:!0}}}},upstreams:{_options:{path:"/upstreams",queryParams:{sortBy:"sort",search:{as:"filter",replace:!0},searchproperty:{as:"searchproperty",empty:[["DestinationName","LocalBindAddress","LocalBindPort"]]}}}},exposedpaths:{_options:{path:"/exposed-paths"}},addresses:{_options:{path:"/addresses"}},metadata:{_options:{path:"/metadata"}}},notfound:{_options:{path:"/:name/:node/:id"}}},nodes:{_options:{path:"/nodes"},index:{_options:{path:"",queryParams:{sortBy:"sort",status:"status",searchproperty:{as:"searchproperty",empty:[["Node","Address","Meta"]]},search:{as:"filter",replace:!0}}}},show:{_options:{path:"/:name"},healthchecks:{_options:{path:"/health-checks",queryParams:{sortBy:"sort",status:"status",kind:"kind",check:"check",searchproperty:{as:"searchproperty",empty:[["Name","Service","CheckID","Notes","Output","ServiceTags"]]},search:{as:"filter",replace:!0}}}},services:{_options:{path:"/service-instances",queryParams:{sortBy:"sort",status:"status",source:"source",searchproperty:{as:"searchproperty",empty:[["Name","Tags","ID","Address","Port","Service.Meta"]]},search:{as:"filter",replace:!0}}}},rtt:{_options:{path:"/round-trip-time"}},metadata:{_options:{path:"/metadata"}}}},intentions:{_options:{path:"/intentions"},index:{_options:{path:"/",queryParams:{sortBy:"sort",access:"access",searchproperty:{as:"searchproperty",empty:[["SourceName","DestinationName"]]},search:{as:"filter",replace:!0}}}},edit:{_options:{path:"/:intention_id",abilities:["read intentions"]}},create:{_options:{template:"../edit",path:"/create",abilities:["create intentions"]}}},kv:{_options:{path:"/kv"},index:{_options:{path:"/",queryParams:{sortBy:"sort",kind:"kind",search:{as:"filter",replace:!0}}}},folder:{_options:{template:"../index",path:"/*key"}},edit:{_options:{path:"/*key/edit"}},create:{_options:{template:"../edit",path:"/*key/create",abilities:["create kvs"]}},"root-create":{_options:{template:"../edit",path:"/create",abilities:["create kvs"]}}},acls:{_options:{path:"/acls",abilities:["access acls"]},policies:{_options:{path:"/policies",abilities:["read policies"]},edit:{_options:{path:"/:id"}},create:{_options:{path:"/create",abilities:["create policies"]}}},roles:{_options:{path:"/roles",abilities:["read roles"]},edit:{_options:{path:"/:id"}},create:{_options:{path:"/create",abilities:["create roles"]}}},tokens:{_options:{path:"/tokens",abilities:["access acls"]},edit:{_options:{path:"/:id"}},create:{_options:{path:"/create",abilities:["create tokens"]}}},"auth-methods":{_options:{path:"/auth-methods",abilities:["read auth-methods"]},show:{_options:{path:"/:id"},"auth-method":{_options:{path:"/auth-method"}},"binding-rules":{_options:{path:"/binding-rules"}},"nspace-rules":{_options:{path:"/nspace-rules"}}}}},"routing-config":{_options:{path:"/routing-config/:name"}}},index:{_options:{path:"/"}},settings:{_options:{path:"/settings"}},setting:{_options:{path:"/setting",redirect:"../settings"}},notfound:{_options:{path:"/*notfound"}}}) +((e,t=("undefined"!=typeof document?document.currentScript.dataset:module.exports))=>{t.routes=JSON.stringify(e)})({dc:{_options:{path:"/:dc"},index:{_options:{path:"/",redirect:"../services"}},show:{_options:{path:"/overview",abilities:["access overview"]},serverstatus:{_options:{path:"/server-status",abilities:["read servers"]}},cataloghealth:{_options:{path:"/catalog-health",abilities:["access overview"]}},license:{_options:{path:"/license",abilities:["read license"]}}},services:{_options:{path:"/services"},index:{_options:{path:"/",queryParams:{sortBy:"sort",status:"status",source:"source",kind:"kind",searchproperty:{as:"searchproperty",empty:[["Partition","Name","Tags","PeerName"]]},search:{as:"filter",replace:!0}}}},show:{_options:{path:"/:name"},instances:{_options:{path:"/instances",queryParams:{sortBy:"sort",status:"status",source:"source",searchproperty:{as:"searchproperty",empty:[["Name","Node","Tags","ID","Address","Port","Service.Meta","Node.Meta"]]},search:{as:"filter",replace:!0}}}},intentions:{_options:{path:"/intentions"},index:{_options:{path:"",queryParams:{sortBy:"sort",access:"access",searchproperty:{as:"searchproperty",empty:[["SourceName","DestinationName"]]},search:{as:"filter",replace:!0}}}},edit:{_options:{path:"/:intention_id"}},create:{_options:{template:"../edit",path:"/create"}}},topology:{_options:{path:"/topology"}},services:{_options:{path:"/services",queryParams:{sortBy:"sort",instance:"instance",searchproperty:{as:"searchproperty",empty:[["Name","Tags"]]},search:{as:"filter",replace:!0}}}},upstreams:{_options:{path:"/upstreams",queryParams:{sortBy:"sort",instance:"instance",searchproperty:{as:"searchproperty",empty:[["Name","Tags"]]},search:{as:"filter",replace:!0}}}},routing:{_options:{path:"/routing"}},tags:{_options:{path:"/tags"}}},instance:{_options:{path:"/:name/instances/:node/:id",redirect:"./healthchecks"},healthchecks:{_options:{path:"/health-checks",queryParams:{sortBy:"sort",status:"status",check:"check",searchproperty:{as:"searchproperty",empty:[["Name","Node","CheckID","Notes","Output","ServiceTags"]]},search:{as:"filter",replace:!0}}}},upstreams:{_options:{path:"/upstreams",queryParams:{sortBy:"sort",search:{as:"filter",replace:!0},searchproperty:{as:"searchproperty",empty:[["DestinationName","LocalBindAddress","LocalBindPort"]]}}}},exposedpaths:{_options:{path:"/exposed-paths"}},addresses:{_options:{path:"/addresses"}},metadata:{_options:{path:"/metadata"}}},notfound:{_options:{path:"/:name/:node/:id"}}},nodes:{_options:{path:"/nodes"},index:{_options:{path:"",queryParams:{sortBy:"sort",status:"status",searchproperty:{as:"searchproperty",empty:[["Node","Address","Meta","PeerName"]]},search:{as:"filter",replace:!0}}}},show:{_options:{path:"/:name"},healthchecks:{_options:{path:"/health-checks",queryParams:{sortBy:"sort",status:"status",kind:"kind",check:"check",searchproperty:{as:"searchproperty",empty:[["Name","Service","CheckID","Notes","Output","ServiceTags"]]},search:{as:"filter",replace:!0}}}},services:{_options:{path:"/service-instances",queryParams:{sortBy:"sort",status:"status",source:"source",searchproperty:{as:"searchproperty",empty:[["Name","Tags","ID","Address","Port","Service.Meta"]]},search:{as:"filter",replace:!0}}}},rtt:{_options:{path:"/round-trip-time"}},metadata:{_options:{path:"/metadata"}}}},intentions:{_options:{path:"/intentions"},index:{_options:{path:"/",queryParams:{sortBy:"sort",access:"access",searchproperty:{as:"searchproperty",empty:[["SourceName","DestinationName"]]},search:{as:"filter",replace:!0}}}},edit:{_options:{path:"/:intention_id",abilities:["read intentions"]}},create:{_options:{template:"../edit",path:"/create",abilities:["create intentions"]}}},kv:{_options:{path:"/kv"},index:{_options:{path:"/",queryParams:{sortBy:"sort",kind:"kind",search:{as:"filter",replace:!0}}}},folder:{_options:{template:"../index",path:"/*key"}},edit:{_options:{path:"/*key/edit"}},create:{_options:{template:"../edit",path:"/*key/create",abilities:["create kvs"]}},"root-create":{_options:{template:"../edit",path:"/create",abilities:["create kvs"]}}},acls:{_options:{path:"/acls",abilities:["access acls"]},policies:{_options:{path:"/policies",abilities:["read policies"]},edit:{_options:{path:"/:id"}},create:{_options:{path:"/create",abilities:["create policies"]}}},roles:{_options:{path:"/roles",abilities:["read roles"]},edit:{_options:{path:"/:id"}},create:{_options:{path:"/create",abilities:["create roles"]}}},tokens:{_options:{path:"/tokens",abilities:["access acls"]},edit:{_options:{path:"/:id"}},create:{_options:{path:"/create",abilities:["create tokens"]}}},"auth-methods":{_options:{path:"/auth-methods",abilities:["read auth-methods"]},show:{_options:{path:"/:id"},"auth-method":{_options:{path:"/auth-method"}},"binding-rules":{_options:{path:"/binding-rules"}},"nspace-rules":{_options:{path:"/nspace-rules"}}}}},"routing-config":{_options:{path:"/routing-config/:name"}}},index:{_options:{path:"/"}},settings:{_options:{path:"/settings"}},setting:{_options:{path:"/setting",redirect:"../settings"}},notfound:{_options:{path:"/*notfound"}}}) diff --git a/agent/uiserver/dist/assets/consul-ui/routes-debug-8f884a3e3f7105d43b7b4024db9b4c99.js b/agent/uiserver/dist/assets/consul-ui/routes-debug-41d0902009004c6875ddb9882b4ee3f6.js similarity index 100% rename from agent/uiserver/dist/assets/consul-ui/routes-debug-8f884a3e3f7105d43b7b4024db9b4c99.js rename to agent/uiserver/dist/assets/consul-ui/routes-debug-41d0902009004c6875ddb9882b4ee3f6.js diff --git a/agent/uiserver/dist/assets/consul-ui/services-debug-5a3f1d2e3954a05aa8383f02db31b8e6.js b/agent/uiserver/dist/assets/consul-ui/services-debug-d1862bae590c1c8cd6dc0dd81645801a.js similarity index 100% rename from agent/uiserver/dist/assets/consul-ui/services-debug-5a3f1d2e3954a05aa8383f02db31b8e6.js rename to agent/uiserver/dist/assets/consul-ui/services-debug-d1862bae590c1c8cd6dc0dd81645801a.js diff --git a/agent/uiserver/dist/assets/consul-ui/services-a17470cdfbd4a4096117ac0103802226.js b/agent/uiserver/dist/assets/consul-ui/services-faa0d1867ff0795f940a4199bcf17128.js similarity index 78% rename from agent/uiserver/dist/assets/consul-ui/services-a17470cdfbd4a4096117ac0103802226.js rename to agent/uiserver/dist/assets/consul-ui/services-faa0d1867ff0795f940a4199bcf17128.js index b4e8774d509..a50f394f1c8 100644 --- a/agent/uiserver/dist/assets/consul-ui/services-a17470cdfbd4a4096117ac0103802226.js +++ b/agent/uiserver/dist/assets/consul-ui/services-faa0d1867ff0795f940a4199bcf17128.js @@ -1 +1 @@ -((e,s=("undefined"!=typeof document?document.currentScript.dataset:module.exports))=>{s.services=JSON.stringify(e)})({"route:basic":{class:"consul-ui/routing/route"},"service:intl":{class:"consul-ui/services/i18n"},"service:state":{class:"consul-ui/services/state-with-charts"},"auth-provider:oidc-with-url":{class:"consul-ui/services/auth-providers/oauth2-code-with-url-provider"},"component:consul/partition/selector":{class:"@glimmer/component"}}) +((e,s=("undefined"!=typeof document?document.currentScript.dataset:module.exports))=>{s.services=JSON.stringify(e)})({"route:basic":{class:"consul-ui/routing/route"},"service:intl":{class:"consul-ui/services/i18n"},"service:state":{class:"consul-ui/services/state-with-charts"},"auth-provider:oidc-with-url":{class:"consul-ui/services/auth-providers/oauth2-code-with-url-provider"},"component:consul/partition/selector":{class:"@glimmer/component"},"component:consul/peer/selector":{class:"@glimmer/component"},"component:consul/hcp/home":{class:"@glimmer/component"}}) diff --git a/agent/uiserver/dist/assets/css.escape-851839b3ea1d0b4eb4c7089446df5e9f.js b/agent/uiserver/dist/assets/css.escape-fe4db48c9e3f272a6d12cf1312de889e.js similarity index 100% rename from agent/uiserver/dist/assets/css.escape-851839b3ea1d0b4eb4c7089446df5e9f.js rename to agent/uiserver/dist/assets/css.escape-fe4db48c9e3f272a6d12cf1312de889e.js diff --git a/agent/uiserver/dist/assets/encoding-022884ab2a5bd42b6f4fff580fa0dd34.js b/agent/uiserver/dist/assets/encoding-022884ab2a5bd42b6f4fff580fa0dd34.js new file mode 100644 index 00000000000..35d450c1100 --- /dev/null +++ b/agent/uiserver/dist/assets/encoding-022884ab2a5bd42b6f4fff580fa0dd34.js @@ -0,0 +1,209 @@ +(function(n){"use strict" +function e(n,e,r){return e<=n&&n<=r}"undefined"!=typeof module&&module.exports&&!n["encoding-indexes"]&&(n["encoding-indexes"]=require("./encoding-indexes-50f27403be5972eae4831f5b69db1f80.js")["encoding-indexes"]) +var r=Math.floor +function i(n){if(void 0===n)return{} +if(n===Object(n))return n +throw TypeError("Could not convert argument to dictionary")}function t(n){return 0<=n&&n<=127}var o=t,s=-1 +function a(n){this.tokens=[].slice.call(n),this.tokens.reverse()}a.prototype={endOfStream:function(){return!this.tokens.length},read:function(){return this.tokens.length?this.tokens.pop():s},prepend:function(n){if(Array.isArray(n))for(var e=n;e.length;)this.tokens.push(e.pop()) +else this.tokens.push(n)},push:function(n){if(Array.isArray(n))for(var e=n;e.length;)this.tokens.unshift(e.shift()) +else this.tokens.unshift(n)}} +var u=-1 +function l(n,e){if(n)throw TypeError("Decoder error") +return e||65533}function f(n){throw TypeError("The code point "+n+" could not be encoded.")}function c(n){return n=String(n).trim().toLowerCase(),Object.prototype.hasOwnProperty.call(h,n)?h[n]:null}var d=[{encodings:[{labels:["unicode-1-1-utf-8","utf-8","utf8"],name:"UTF-8"}],heading:"The Encoding"},{encodings:[{labels:["866","cp866","csibm866","ibm866"],name:"IBM866"},{labels:["csisolatin2","iso-8859-2","iso-ir-101","iso8859-2","iso88592","iso_8859-2","iso_8859-2:1987","l2","latin2"],name:"ISO-8859-2"},{labels:["csisolatin3","iso-8859-3","iso-ir-109","iso8859-3","iso88593","iso_8859-3","iso_8859-3:1988","l3","latin3"],name:"ISO-8859-3"},{labels:["csisolatin4","iso-8859-4","iso-ir-110","iso8859-4","iso88594","iso_8859-4","iso_8859-4:1988","l4","latin4"],name:"ISO-8859-4"},{labels:["csisolatincyrillic","cyrillic","iso-8859-5","iso-ir-144","iso8859-5","iso88595","iso_8859-5","iso_8859-5:1988"],name:"ISO-8859-5"},{labels:["arabic","asmo-708","csiso88596e","csiso88596i","csisolatinarabic","ecma-114","iso-8859-6","iso-8859-6-e","iso-8859-6-i","iso-ir-127","iso8859-6","iso88596","iso_8859-6","iso_8859-6:1987"],name:"ISO-8859-6"},{labels:["csisolatingreek","ecma-118","elot_928","greek","greek8","iso-8859-7","iso-ir-126","iso8859-7","iso88597","iso_8859-7","iso_8859-7:1987","sun_eu_greek"],name:"ISO-8859-7"},{labels:["csiso88598e","csisolatinhebrew","hebrew","iso-8859-8","iso-8859-8-e","iso-ir-138","iso8859-8","iso88598","iso_8859-8","iso_8859-8:1988","visual"],name:"ISO-8859-8"},{labels:["csiso88598i","iso-8859-8-i","logical"],name:"ISO-8859-8-I"},{labels:["csisolatin6","iso-8859-10","iso-ir-157","iso8859-10","iso885910","l6","latin6"],name:"ISO-8859-10"},{labels:["iso-8859-13","iso8859-13","iso885913"],name:"ISO-8859-13"},{labels:["iso-8859-14","iso8859-14","iso885914"],name:"ISO-8859-14"},{labels:["csisolatin9","iso-8859-15","iso8859-15","iso885915","iso_8859-15","l9"],name:"ISO-8859-15"},{labels:["iso-8859-16"],name:"ISO-8859-16"},{labels:["cskoi8r","koi","koi8","koi8-r","koi8_r"],name:"KOI8-R"},{labels:["koi8-ru","koi8-u"],name:"KOI8-U"},{labels:["csmacintosh","mac","macintosh","x-mac-roman"],name:"macintosh"},{labels:["dos-874","iso-8859-11","iso8859-11","iso885911","tis-620","windows-874"],name:"windows-874"},{labels:["cp1250","windows-1250","x-cp1250"],name:"windows-1250"},{labels:["cp1251","windows-1251","x-cp1251"],name:"windows-1251"},{labels:["ansi_x3.4-1968","ascii","cp1252","cp819","csisolatin1","ibm819","iso-8859-1","iso-ir-100","iso8859-1","iso88591","iso_8859-1","iso_8859-1:1987","l1","latin1","us-ascii","windows-1252","x-cp1252"],name:"windows-1252"},{labels:["cp1253","windows-1253","x-cp1253"],name:"windows-1253"},{labels:["cp1254","csisolatin5","iso-8859-9","iso-ir-148","iso8859-9","iso88599","iso_8859-9","iso_8859-9:1989","l5","latin5","windows-1254","x-cp1254"],name:"windows-1254"},{labels:["cp1255","windows-1255","x-cp1255"],name:"windows-1255"},{labels:["cp1256","windows-1256","x-cp1256"],name:"windows-1256"},{labels:["cp1257","windows-1257","x-cp1257"],name:"windows-1257"},{labels:["cp1258","windows-1258","x-cp1258"],name:"windows-1258"},{labels:["x-mac-cyrillic","x-mac-ukrainian"],name:"x-mac-cyrillic"}],heading:"Legacy single-byte encodings"},{encodings:[{labels:["chinese","csgb2312","csiso58gb231280","gb2312","gb_2312","gb_2312-80","gbk","iso-ir-58","x-gbk"],name:"GBK"},{labels:["gb18030"],name:"gb18030"}],heading:"Legacy multi-byte Chinese (simplified) encodings"},{encodings:[{labels:["big5","big5-hkscs","cn-big5","csbig5","x-x-big5"],name:"Big5"}],heading:"Legacy multi-byte Chinese (traditional) encodings"},{encodings:[{labels:["cseucpkdfmtjapanese","euc-jp","x-euc-jp"],name:"EUC-JP"},{labels:["csiso2022jp","iso-2022-jp"],name:"ISO-2022-JP"},{labels:["csshiftjis","ms932","ms_kanji","shift-jis","shift_jis","sjis","windows-31j","x-sjis"],name:"Shift_JIS"}],heading:"Legacy multi-byte Japanese encodings"},{encodings:[{labels:["cseuckr","csksc56011987","euc-kr","iso-ir-149","korean","ks_c_5601-1987","ks_c_5601-1989","ksc5601","ksc_5601","windows-949"],name:"EUC-KR"}],heading:"Legacy multi-byte Korean encodings"},{encodings:[{labels:["csiso2022kr","hz-gb-2312","iso-2022-cn","iso-2022-cn-ext","iso-2022-kr"],name:"replacement"},{labels:["utf-16be"],name:"UTF-16BE"},{labels:["utf-16","utf-16le"],name:"UTF-16LE"},{labels:["x-user-defined"],name:"x-user-defined"}],heading:"Legacy miscellaneous encodings"}],h={} +d.forEach((function(n){n.encodings.forEach((function(n){n.labels.forEach((function(e){h[e]=n}))}))})) +var g,p,b={},_={} +function w(n,e){return e&&e[n]||null}function m(n,e){var r=e.indexOf(n) +return-1===r?null:r}function v(e){if(!("encoding-indexes"in n))throw Error("Indexes missing. Did you forget to include encoding-indexes-50f27403be5972eae4831f5b69db1f80.js first?") +return n["encoding-indexes"][e]}var y="utf-8" +function x(n,e){if(!(this instanceof x))throw TypeError("Called as a function. Did you forget 'new'?") +n=void 0!==n?String(n):y,e=i(e),this._encoding=null,this._decoder=null,this._ignoreBOM=!1,this._BOMseen=!1,this._error_mode="replacement",this._do_not_flush=!1 +var r=c(n) +if(null===r||"replacement"===r.name)throw RangeError("Unknown encoding: "+n) +if(!_[r.name])throw Error("Decoder not present. Did you forget to include encoding-indexes-50f27403be5972eae4831f5b69db1f80.js first?") +var t=this +return t._encoding=r,Boolean(e.fatal)&&(t._error_mode="fatal"),Boolean(e.ignoreBOM)&&(t._ignoreBOM=!0),Object.defineProperty||(this.encoding=t._encoding.name.toLowerCase(),this.fatal="fatal"===t._error_mode,this.ignoreBOM=t._ignoreBOM),t}function O(e,r){if(!(this instanceof O))throw TypeError("Called as a function. Did you forget 'new'?") +r=i(r),this._encoding=null,this._encoder=null,this._do_not_flush=!1,this._fatal=Boolean(r.fatal)?"fatal":"replacement" +var t=this +if(Boolean(r.NONSTANDARD_allowLegacyEncoding)){var o=c(e=void 0!==e?String(e):y) +if(null===o||"replacement"===o.name)throw RangeError("Unknown encoding: "+e) +if(!b[o.name])throw Error("Encoder not present. Did you forget to include encoding-indexes-50f27403be5972eae4831f5b69db1f80.js first?") +t._encoding=o}else t._encoding=c("utf-8"),void 0!==e&&"console"in n&&console.warn("TextEncoder constructor called with encoding label, which is ignored.") +return Object.defineProperty||(this.encoding=t._encoding.name.toLowerCase()),t}function k(n){var r=n.fatal,i=0,t=0,o=0,a=128,f=191 +this.handler=function(n,c){if(c===s&&0!==o)return o=0,l(r) +if(c===s)return u +if(0===o){if(e(c,0,127))return c +if(e(c,194,223))o=1,i=31&c +else if(e(c,224,239))224===c&&(a=160),237===c&&(f=159),o=2,i=15&c +else{if(!e(c,240,244))return l(r) +240===c&&(a=144),244===c&&(f=143),o=3,i=7&c}return null}if(!e(c,a,f))return i=o=t=0,a=128,f=191,n.prepend(c),l(r) +if(a=128,f=191,i=i<<6|63&c,(t+=1)!==o)return null +var d=i +return i=o=t=0,d}}function E(n){n.fatal +this.handler=function(n,r){if(r===s)return u +if(o(r))return r +var i,t +e(r,128,2047)?(i=1,t=192):e(r,2048,65535)?(i=2,t=224):e(r,65536,1114111)&&(i=3,t=240) +for(var a=[(r>>6*i)+t];i>0;){var l=r>>6*(i-1) +a.push(128|63&l),i-=1}return a}}function j(n,e){var r=e.fatal +this.handler=function(e,i){if(i===s)return u +if(t(i))return i +var o=n[i-128] +return null===o?l(r):o}}function B(n,e){e.fatal +this.handler=function(e,r){if(r===s)return u +if(o(r))return r +var i=m(r,n) +return null===i&&f(r),i+128}}function S(n){var r=n.fatal,i=0,o=0,a=0 +this.handler=function(n,f){if(f===s&&0===i&&0===o&&0===a)return u +var c +if(f!==s||0===i&&0===o&&0===a||(i=0,o=0,a=0,l(r)),0!==a){c=null,e(f,48,57)&&(c=function(n){if(n>39419&&n<189e3||n>1237575)return null +if(7457===n)return 59335 +var e,r=0,i=0,t=v("gb18030-ranges") +for(e=0;e>8,i=255&n +return e?[r,i]:[i,r]}function R(n,r){var i=r.fatal,t=null,o=null +this.handler=function(r,a){if(a===s&&(null!==t||null!==o))return l(i) +if(a===s&&null===t&&null===o)return u +if(null===t)return t=a,null +var f +if(f=n?(t<<8)+a:(a<<8)+t,t=null,null!==o){var c=o +return o=null,e(f,56320,57343)?65536+1024*(c-55296)+(f-56320):(r.prepend(K(f,n)),l(i))}return e(f,55296,56319)?(o=f,null):e(f,56320,57343)?l(i):f}}function G(n,r){r.fatal +this.handler=function(r,i){if(i===s)return u +if(e(i,0,65535))return K(i,n) +var t=K(55296+(i-65536>>10),n),o=K(56320+(i-65536&1023),n) +return t.concat(o)}}function N(n){n.fatal +this.handler=function(n,e){return e===s?u:t(e)?e:63360+e-128}}function q(n){n.fatal +this.handler=function(n,r){return r===s?u:o(r)?r:e(r,63360,63487)?r-63360+128:f(r)}}Object.defineProperty&&(Object.defineProperty(x.prototype,"encoding",{get:function(){return this._encoding.name.toLowerCase()}}),Object.defineProperty(x.prototype,"fatal",{get:function(){return"fatal"===this._error_mode}}),Object.defineProperty(x.prototype,"ignoreBOM",{get:function(){return this._ignoreBOM}})),x.prototype.decode=function(n,e){var r +r="object"==typeof n&&n instanceof ArrayBuffer?new Uint8Array(n):"object"==typeof n&&"buffer"in n&&n.buffer instanceof ArrayBuffer?new Uint8Array(n.buffer,n.byteOffset,n.byteLength):new Uint8Array(0),e=i(e),this._do_not_flush||(this._decoder=_[this._encoding.name]({fatal:"fatal"===this._error_mode}),this._BOMseen=!1),this._do_not_flush=Boolean(e.stream) +for(var t,o=new a(r),l=[];;){var f=o.read() +if(f===s)break +if((t=this._decoder.handler(o,f))===u)break +null!==t&&(Array.isArray(t)?l.push.apply(l,t):l.push(t))}if(!this._do_not_flush){do{if((t=this._decoder.handler(o,o.read()))===u)break +null!==t&&(Array.isArray(t)?l.push.apply(l,t):l.push(t))}while(!o.endOfStream()) +this._decoder=null}return function(n){var e,r +return e=["UTF-8","UTF-16LE","UTF-16BE"],r=this._encoding.name,-1===e.indexOf(r)||this._ignoreBOM||this._BOMseen||(n.length>0&&65279===n[0]?(this._BOMseen=!0,n.shift()):n.length>0&&(this._BOMseen=!0)),function(n){for(var e="",r=0;r>10),56320+(1023&i)))}return e}(n)}.call(this,l)},Object.defineProperty&&Object.defineProperty(O.prototype,"encoding",{get:function(){return this._encoding.name.toLowerCase()}}),O.prototype.encode=function(n,e){n=void 0===n?"":String(n),e=i(e),this._do_not_flush||(this._encoder=b[this._encoding.name]({fatal:"fatal"===this._fatal})),this._do_not_flush=Boolean(e.stream) +for(var r,t=new a(function(n){for(var e=String(n),r=e.length,i=0,t=[];i57343)t.push(o) +else if(56320<=o&&o<=57343)t.push(65533) +else if(55296<=o&&o<=56319)if(i===r-1)t.push(65533) +else{var s=e.charCodeAt(i+1) +if(56320<=s&&s<=57343){var a=1023&o,u=1023&s +t.push(65536+(a<<10)+u),i+=1}else t.push(65533)}i+=1}return t}(n)),o=[];;){var l=t.read() +if(l===s)break +if((r=this._encoder.handler(t,l))===u)break +Array.isArray(r)?o.push.apply(o,r):o.push(r)}if(!this._do_not_flush){for(;(r=this._encoder.handler(t,t.read()))!==u;)Array.isArray(r)?o.push.apply(o,r):o.push(r) +this._encoder=null}return new Uint8Array(o)},b["UTF-8"]=function(n){return new E(n)},_["UTF-8"]=function(n){return new k(n)},"encoding-indexes"in n&&d.forEach((function(n){"Legacy single-byte encodings"===n.heading&&n.encodings.forEach((function(n){var e=n.name,r=v(e.toLowerCase()) +_[e]=function(n){return new j(r,n)},b[e]=function(n){return new B(r,n)}}))})),_.GBK=function(n){return new S(n)},b.GBK=function(n){return new T(n,!0)},b.gb18030=function(n){return new T(n)},_.gb18030=function(n){return new S(n)},b.Big5=function(n){return new U(n)},_.Big5=function(n){return new I(n)},b["EUC-JP"]=function(n){return new A(n)},_["EUC-JP"]=function(n){return new C(n)},b["ISO-2022-JP"]=function(n){return new M(n)},_["ISO-2022-JP"]=function(n){return new L(n)},b.Shift_JIS=function(n){return new D(n)},_.Shift_JIS=function(n){return new P(n)},b["EUC-KR"]=function(n){return new J(n)},_["EUC-KR"]=function(n){return new F(n)},b["UTF-16BE"]=function(n){return new G(!0,n)},_["UTF-16BE"]=function(n){return new R(!0,n)},b["UTF-16LE"]=function(n){return new G(!1,n)},_["UTF-16LE"]=function(n){return new R(!1,n)},b["x-user-defined"]=function(n){return new q(n)},_["x-user-defined"]=function(n){return new N(n)},n.TextEncoder||(n.TextEncoder=O),n.TextDecoder||(n.TextDecoder=x),"undefined"!=typeof module&&module.exports&&(module.exports={TextEncoder:n.TextEncoder,TextDecoder:n.TextDecoder,EncodingIndexes:n["encoding-indexes"]})})(this||{}) diff --git a/agent/uiserver/dist/assets/encoding-cdb50fbdab6d4d3fdf574dd784f77d27.js b/agent/uiserver/dist/assets/encoding-cdb50fbdab6d4d3fdf574dd784f77d27.js deleted file mode 100644 index 19f436540f3..00000000000 --- a/agent/uiserver/dist/assets/encoding-cdb50fbdab6d4d3fdf574dd784f77d27.js +++ /dev/null @@ -1,204 +0,0 @@ -(function(n){"use strict" -function e(n,e,r){return e<=n&&n<=r}"undefined"!=typeof module&&module.exports&&!n["encoding-indexes"]&&(n["encoding-indexes"]=require("./encoding-indexes-75eea16b259716db4fd162ee283d2ae5.js")["encoding-indexes"]) -var r=Math.floor -function i(n){if(void 0===n)return{} -if(n===Object(n))return n -throw TypeError("Could not convert argument to dictionary")}function t(n){return 0<=n&&n<=127}var o=t -function s(n){this.tokens=[].slice.call(n),this.tokens.reverse()}s.prototype={endOfStream:function(){return!this.tokens.length},read:function(){return this.tokens.length?this.tokens.pop():-1},prepend:function(n){if(Array.isArray(n))for(var e=n;e.length;)this.tokens.push(e.pop()) -else this.tokens.push(n)},push:function(n){if(Array.isArray(n))for(var e=n;e.length;)this.tokens.unshift(e.shift()) -else this.tokens.unshift(n)}} -function a(n,e){if(n)throw TypeError("Decoder error") -return e||65533}function u(n){throw TypeError("The code point "+n+" could not be encoded.")}function l(n){return n=String(n).trim().toLowerCase(),Object.prototype.hasOwnProperty.call(c,n)?c[n]:null}var f=[{encodings:[{labels:["unicode-1-1-utf-8","utf-8","utf8"],name:"UTF-8"}],heading:"The Encoding"},{encodings:[{labels:["866","cp866","csibm866","ibm866"],name:"IBM866"},{labels:["csisolatin2","iso-8859-2","iso-ir-101","iso8859-2","iso88592","iso_8859-2","iso_8859-2:1987","l2","latin2"],name:"ISO-8859-2"},{labels:["csisolatin3","iso-8859-3","iso-ir-109","iso8859-3","iso88593","iso_8859-3","iso_8859-3:1988","l3","latin3"],name:"ISO-8859-3"},{labels:["csisolatin4","iso-8859-4","iso-ir-110","iso8859-4","iso88594","iso_8859-4","iso_8859-4:1988","l4","latin4"],name:"ISO-8859-4"},{labels:["csisolatincyrillic","cyrillic","iso-8859-5","iso-ir-144","iso8859-5","iso88595","iso_8859-5","iso_8859-5:1988"],name:"ISO-8859-5"},{labels:["arabic","asmo-708","csiso88596e","csiso88596i","csisolatinarabic","ecma-114","iso-8859-6","iso-8859-6-e","iso-8859-6-i","iso-ir-127","iso8859-6","iso88596","iso_8859-6","iso_8859-6:1987"],name:"ISO-8859-6"},{labels:["csisolatingreek","ecma-118","elot_928","greek","greek8","iso-8859-7","iso-ir-126","iso8859-7","iso88597","iso_8859-7","iso_8859-7:1987","sun_eu_greek"],name:"ISO-8859-7"},{labels:["csiso88598e","csisolatinhebrew","hebrew","iso-8859-8","iso-8859-8-e","iso-ir-138","iso8859-8","iso88598","iso_8859-8","iso_8859-8:1988","visual"],name:"ISO-8859-8"},{labels:["csiso88598i","iso-8859-8-i","logical"],name:"ISO-8859-8-I"},{labels:["csisolatin6","iso-8859-10","iso-ir-157","iso8859-10","iso885910","l6","latin6"],name:"ISO-8859-10"},{labels:["iso-8859-13","iso8859-13","iso885913"],name:"ISO-8859-13"},{labels:["iso-8859-14","iso8859-14","iso885914"],name:"ISO-8859-14"},{labels:["csisolatin9","iso-8859-15","iso8859-15","iso885915","iso_8859-15","l9"],name:"ISO-8859-15"},{labels:["iso-8859-16"],name:"ISO-8859-16"},{labels:["cskoi8r","koi","koi8","koi8-r","koi8_r"],name:"KOI8-R"},{labels:["koi8-ru","koi8-u"],name:"KOI8-U"},{labels:["csmacintosh","mac","macintosh","x-mac-roman"],name:"macintosh"},{labels:["dos-874","iso-8859-11","iso8859-11","iso885911","tis-620","windows-874"],name:"windows-874"},{labels:["cp1250","windows-1250","x-cp1250"],name:"windows-1250"},{labels:["cp1251","windows-1251","x-cp1251"],name:"windows-1251"},{labels:["ansi_x3.4-1968","ascii","cp1252","cp819","csisolatin1","ibm819","iso-8859-1","iso-ir-100","iso8859-1","iso88591","iso_8859-1","iso_8859-1:1987","l1","latin1","us-ascii","windows-1252","x-cp1252"],name:"windows-1252"},{labels:["cp1253","windows-1253","x-cp1253"],name:"windows-1253"},{labels:["cp1254","csisolatin5","iso-8859-9","iso-ir-148","iso8859-9","iso88599","iso_8859-9","iso_8859-9:1989","l5","latin5","windows-1254","x-cp1254"],name:"windows-1254"},{labels:["cp1255","windows-1255","x-cp1255"],name:"windows-1255"},{labels:["cp1256","windows-1256","x-cp1256"],name:"windows-1256"},{labels:["cp1257","windows-1257","x-cp1257"],name:"windows-1257"},{labels:["cp1258","windows-1258","x-cp1258"],name:"windows-1258"},{labels:["x-mac-cyrillic","x-mac-ukrainian"],name:"x-mac-cyrillic"}],heading:"Legacy single-byte encodings"},{encodings:[{labels:["chinese","csgb2312","csiso58gb231280","gb2312","gb_2312","gb_2312-80","gbk","iso-ir-58","x-gbk"],name:"GBK"},{labels:["gb18030"],name:"gb18030"}],heading:"Legacy multi-byte Chinese (simplified) encodings"},{encodings:[{labels:["big5","big5-hkscs","cn-big5","csbig5","x-x-big5"],name:"Big5"}],heading:"Legacy multi-byte Chinese (traditional) encodings"},{encodings:[{labels:["cseucpkdfmtjapanese","euc-jp","x-euc-jp"],name:"EUC-JP"},{labels:["csiso2022jp","iso-2022-jp"],name:"ISO-2022-JP"},{labels:["csshiftjis","ms932","ms_kanji","shift-jis","shift_jis","sjis","windows-31j","x-sjis"],name:"Shift_JIS"}],heading:"Legacy multi-byte Japanese encodings"},{encodings:[{labels:["cseuckr","csksc56011987","euc-kr","iso-ir-149","korean","ks_c_5601-1987","ks_c_5601-1989","ksc5601","ksc_5601","windows-949"],name:"EUC-KR"}],heading:"Legacy multi-byte Korean encodings"},{encodings:[{labels:["csiso2022kr","hz-gb-2312","iso-2022-cn","iso-2022-cn-ext","iso-2022-kr"],name:"replacement"},{labels:["utf-16be"],name:"UTF-16BE"},{labels:["utf-16","utf-16le"],name:"UTF-16LE"},{labels:["x-user-defined"],name:"x-user-defined"}],heading:"Legacy miscellaneous encodings"}],c={} -f.forEach((function(n){n.encodings.forEach((function(n){n.labels.forEach((function(e){c[e]=n}))}))})) -var d,h,g={},p={} -function _(n,e){return e&&e[n]||null}function b(n,e){var r=e.indexOf(n) -return-1===r?null:r}function w(e){if(!("encoding-indexes"in n))throw Error("Indexes missing. Did you forget to include encoding-indexes-75eea16b259716db4fd162ee283d2ae5.js first?") -return n["encoding-indexes"][e]}function m(n,e){if(!(this instanceof m))throw TypeError("Called as a function. Did you forget 'new'?") -n=void 0!==n?String(n):"utf-8",e=i(e),this._encoding=null,this._decoder=null,this._ignoreBOM=!1,this._BOMseen=!1,this._error_mode="replacement",this._do_not_flush=!1 -var r=l(n) -if(null===r||"replacement"===r.name)throw RangeError("Unknown encoding: "+n) -if(!p[r.name])throw Error("Decoder not present. Did you forget to include encoding-indexes-75eea16b259716db4fd162ee283d2ae5.js first?") -return this._encoding=r,Boolean(e.fatal)&&(this._error_mode="fatal"),Boolean(e.ignoreBOM)&&(this._ignoreBOM=!0),Object.defineProperty||(this.encoding=this._encoding.name.toLowerCase(),this.fatal="fatal"===this._error_mode,this.ignoreBOM=this._ignoreBOM),this}function v(e,r){if(!(this instanceof v))throw TypeError("Called as a function. Did you forget 'new'?") -r=i(r),this._encoding=null,this._encoder=null,this._do_not_flush=!1,this._fatal=Boolean(r.fatal)?"fatal":"replacement" -if(Boolean(r.NONSTANDARD_allowLegacyEncoding)){var t=l(e=void 0!==e?String(e):"utf-8") -if(null===t||"replacement"===t.name)throw RangeError("Unknown encoding: "+e) -if(!g[t.name])throw Error("Encoder not present. Did you forget to include encoding-indexes-75eea16b259716db4fd162ee283d2ae5.js first?") -this._encoding=t}else this._encoding=l("utf-8"),void 0!==e&&"console"in n&&console.warn("TextEncoder constructor called with encoding label, which is ignored.") -return Object.defineProperty||(this.encoding=this._encoding.name.toLowerCase()),this}function y(n){var r=n.fatal,i=0,t=0,o=0,s=128,u=191 -this.handler=function(n,l){if(-1===l&&0!==o)return o=0,a(r) -if(-1===l)return-1 -if(0===o){if(e(l,0,127))return l -if(e(l,194,223))o=1,i=31&l -else if(e(l,224,239))224===l&&(s=160),237===l&&(u=159),o=2,i=15&l -else{if(!e(l,240,244))return a(r) -240===l&&(s=144),244===l&&(u=143),o=3,i=7&l}return null}if(!e(l,s,u))return i=o=t=0,s=128,u=191,n.prepend(l),a(r) -if(s=128,u=191,i=i<<6|63&l,(t+=1)!==o)return null -var f=i -return i=o=t=0,f}}function x(n){n.fatal -this.handler=function(n,r){if(-1===r)return-1 -if(o(r))return r -var i,t -e(r,128,2047)?(i=1,t=192):e(r,2048,65535)?(i=2,t=224):e(r,65536,1114111)&&(i=3,t=240) -for(var s=[(r>>6*i)+t];i>0;){var a=r>>6*(i-1) -s.push(128|63&a),i-=1}return s}}function O(n,e){var r=e.fatal -this.handler=function(e,i){if(-1===i)return-1 -if(t(i))return i -var o=n[i-128] -return null===o?a(r):o}}function k(n,e){e.fatal -this.handler=function(e,r){if(-1===r)return-1 -if(o(r))return r -var i=b(r,n) -return null===i&&u(r),i+128}}function E(n){var r=n.fatal,i=0,o=0,s=0 -this.handler=function(n,u){if(-1===u&&0===i&&0===o&&0===s)return-1 -var l -if(-1!==u||0===i&&0===o&&0===s||(i=0,o=0,s=0,a(r)),0!==s){l=null,e(u,48,57)&&(l=function(n){if(n>39419&&n<189e3||n>1237575)return null -if(7457===n)return 59335 -var e,r=0,i=0,t=w("gb18030-ranges") -for(e=0;e>8,i=255&n -return e?[r,i]:[i,r]}function F(n,r){var i=r.fatal,t=null,o=null -this.handler=function(r,s){if(-1===s&&(null!==t||null!==o))return a(i) -if(-1===s&&null===t&&null===o)return-1 -if(null===t)return t=s,null -var u -if(u=n?(t<<8)+s:(s<<8)+t,t=null,null!==o){var l=o -return o=null,e(u,56320,57343)?65536+1024*(l-55296)+(u-56320):(r.prepend(D(u,n)),a(i))}return e(u,55296,56319)?(o=u,null):e(u,56320,57343)?a(i):u}}function J(n,r){r.fatal -this.handler=function(r,i){if(-1===i)return-1 -if(e(i,0,65535))return D(i,n) -var t=D(55296+(i-65536>>10),n),o=D(56320+(i-65536&1023),n) -return t.concat(o)}}function K(n){n.fatal -this.handler=function(n,e){return-1===e?-1:t(e)?e:63360+e-128}}function R(n){n.fatal -this.handler=function(n,r){return-1===r?-1:o(r)?r:e(r,63360,63487)?r-63360+128:u(r)}}Object.defineProperty&&(Object.defineProperty(m.prototype,"encoding",{get:function(){return this._encoding.name.toLowerCase()}}),Object.defineProperty(m.prototype,"fatal",{get:function(){return"fatal"===this._error_mode}}),Object.defineProperty(m.prototype,"ignoreBOM",{get:function(){return this._ignoreBOM}})),m.prototype.decode=function(n,e){var r -r="object"==typeof n&&n instanceof ArrayBuffer?new Uint8Array(n):"object"==typeof n&&"buffer"in n&&n.buffer instanceof ArrayBuffer?new Uint8Array(n.buffer,n.byteOffset,n.byteLength):new Uint8Array(0),e=i(e),this._do_not_flush||(this._decoder=p[this._encoding.name]({fatal:"fatal"===this._error_mode}),this._BOMseen=!1),this._do_not_flush=Boolean(e.stream) -for(var t,o=new s(r),a=[];;){var u=o.read() -if(-1===u)break -if(-1===(t=this._decoder.handler(o,u)))break -null!==t&&(Array.isArray(t)?a.push.apply(a,t):a.push(t))}if(!this._do_not_flush){do{if(-1===(t=this._decoder.handler(o,o.read())))break -null!==t&&(Array.isArray(t)?a.push.apply(a,t):a.push(t))}while(!o.endOfStream()) -this._decoder=null}return function(n){var e,r -return e=["UTF-8","UTF-16LE","UTF-16BE"],r=this._encoding.name,-1===e.indexOf(r)||this._ignoreBOM||this._BOMseen||(n.length>0&&65279===n[0]?(this._BOMseen=!0,n.shift()):n.length>0&&(this._BOMseen=!0)),function(n){for(var e="",r=0;r>10),56320+(1023&i)))}return e}(n)}.call(this,a)},Object.defineProperty&&Object.defineProperty(v.prototype,"encoding",{get:function(){return this._encoding.name.toLowerCase()}}),v.prototype.encode=function(n,e){n=void 0===n?"":String(n),e=i(e),this._do_not_flush||(this._encoder=g[this._encoding.name]({fatal:"fatal"===this._fatal})),this._do_not_flush=Boolean(e.stream) -for(var r,t=new s(function(n){for(var e=String(n),r=e.length,i=0,t=[];i57343)t.push(o) -else if(56320<=o&&o<=57343)t.push(65533) -else if(55296<=o&&o<=56319)if(i===r-1)t.push(65533) -else{var s=e.charCodeAt(i+1) -if(56320<=s&&s<=57343){var a=1023&o,u=1023&s -t.push(65536+(a<<10)+u),i+=1}else t.push(65533)}i+=1}return t}(n)),o=[];;){var a=t.read() -if(-1===a)break -if(-1===(r=this._encoder.handler(t,a)))break -Array.isArray(r)?o.push.apply(o,r):o.push(r)}if(!this._do_not_flush){for(;-1!==(r=this._encoder.handler(t,t.read()));)Array.isArray(r)?o.push.apply(o,r):o.push(r) -this._encoder=null}return new Uint8Array(o)},g["UTF-8"]=function(n){return new x(n)},p["UTF-8"]=function(n){return new y(n)},"encoding-indexes"in n&&f.forEach((function(n){"Legacy single-byte encodings"===n.heading&&n.encodings.forEach((function(n){var e=n.name,r=w(e.toLowerCase()) -p[e]=function(n){return new O(r,n)},g[e]=function(n){return new k(r,n)}}))})),p.GBK=function(n){return new E(n)},g.GBK=function(n){return new j(n,!0)},g.gb18030=function(n){return new j(n)},p.gb18030=function(n){return new E(n)},g.Big5=function(n){return new S(n)},p.Big5=function(n){return new B(n)},g["EUC-JP"]=function(n){return new I(n)},p["EUC-JP"]=function(n){return new T(n)},g["ISO-2022-JP"]=function(n){return new C(n)},p["ISO-2022-JP"]=function(n){return new U(n)},g.Shift_JIS=function(n){return new L(n)},p.Shift_JIS=function(n){return new A(n)},g["EUC-KR"]=function(n){return new P(n)},p["EUC-KR"]=function(n){return new M(n)},g["UTF-16BE"]=function(n){return new J(!0,n)},p["UTF-16BE"]=function(n){return new F(!0,n)},g["UTF-16LE"]=function(n){return new J(!1,n)},p["UTF-16LE"]=function(n){return new F(!1,n)},g["x-user-defined"]=function(n){return new R(n)},p["x-user-defined"]=function(n){return new K(n)},n.TextEncoder||(n.TextEncoder=v),n.TextDecoder||(n.TextDecoder=m),"undefined"!=typeof module&&module.exports&&(module.exports={TextEncoder:n.TextEncoder,TextDecoder:n.TextDecoder,EncodingIndexes:n["encoding-indexes"]})})(this||{}) diff --git a/agent/uiserver/dist/assets/encoding-indexes-75eea16b259716db4fd162ee283d2ae5.js b/agent/uiserver/dist/assets/encoding-indexes-50f27403be5972eae4831f5b69db1f80.js similarity index 100% rename from agent/uiserver/dist/assets/encoding-indexes-75eea16b259716db4fd162ee283d2ae5.js rename to agent/uiserver/dist/assets/encoding-indexes-50f27403be5972eae4831f5b69db1f80.js diff --git a/agent/uiserver/dist/assets/init-21ea65714d133467454b601efc15e2dd.js b/agent/uiserver/dist/assets/init-21ea65714d133467454b601efc15e2dd.js deleted file mode 100644 index 0befe4545f1..00000000000 --- a/agent/uiserver/dist/assets/init-21ea65714d133467454b601efc15e2dd.js +++ /dev/null @@ -1,5 +0,0 @@ -(function(e){const t=new Map(Object.entries(JSON.parse(e.querySelector("[data-consul-ui-fs]").textContent))),n=function(t){var n=e.createElement("script") -n.src=t,e.body.appendChild(n)} -"TextDecoder"in window||(n(t.get(["text-encoding","encoding-indexes"].join("/")+".js")),n(t.get(["text-encoding","encoding"].join("/")+".js"))),window.CSS&&window.CSS.escape||n(t.get(["css.escape","css.escape"].join("/")+".js")) -try{const t=e.querySelector('[name="consul-ui/config/environment"]'),n=JSON.parse(e.querySelector("[data-consul-ui-config]").textContent),o=JSON.parse(decodeURIComponent(t.getAttribute("content"))),c="string"!=typeof n.ContentPath?"":n.ContentPath -c.length>0&&(o.rootURL=c),t.setAttribute("content",encodeURIComponent(JSON.stringify(o)))}catch(o){throw new Error("Unable to parse consul-ui settings: "+o.message)}})(document) diff --git a/agent/uiserver/dist/assets/init-fe2561b45ce1429092f4a9a2bbb9ce71.js b/agent/uiserver/dist/assets/init-fe2561b45ce1429092f4a9a2bbb9ce71.js new file mode 100644 index 00000000000..084a65b5555 --- /dev/null +++ b/agent/uiserver/dist/assets/init-fe2561b45ce1429092f4a9a2bbb9ce71.js @@ -0,0 +1,5 @@ +(function(e,t){const n=new Map(Object.entries(JSON.parse(e.querySelector("[data-consul-ui-fs]").textContent))),o=function(t){var n=e.createElement("script") +n.src=t,e.body.appendChild(n)} +"TextDecoder"in window||(o(n.get(`${["text-encoding","encoding-indexes"].join("/")}.js`)),o(n.get(`${["text-encoding","encoding"].join("/")}.js`))),window.CSS&&window.CSS.escape||o(n.get(`${["css.escape","css.escape"].join("/")}.js`)) +try{const t=e.querySelector('[name="consul-ui/config/environment"]'),n=JSON.parse(e.querySelector("[data-consul-ui-config]").textContent),o=JSON.parse(decodeURIComponent(t.getAttribute("content"))),c="string"!=typeof n.ContentPath?"":n.ContentPath +c.length>0&&(o.rootURL=c),t.setAttribute("content",encodeURIComponent(JSON.stringify(o)))}catch(c){throw new Error(`Unable to parse consul-ui settings: ${c.message}`)}})(document) diff --git a/agent/uiserver/dist/assets/metrics-providers/consul-31d7e3b0ef7c58d62338c7d7aeaaf545.js b/agent/uiserver/dist/assets/metrics-providers/consul-5e97a9af114229497d43377450c54418.js similarity index 100% rename from agent/uiserver/dist/assets/metrics-providers/consul-31d7e3b0ef7c58d62338c7d7aeaaf545.js rename to agent/uiserver/dist/assets/metrics-providers/consul-5e97a9af114229497d43377450c54418.js diff --git a/agent/uiserver/dist/assets/metrics-providers/prometheus-5f31ba3b7ffd850fa916a0a76933e968.js b/agent/uiserver/dist/assets/metrics-providers/prometheus-8779f1c99f6a15611567154767f1f674.js similarity index 74% rename from agent/uiserver/dist/assets/metrics-providers/prometheus-5f31ba3b7ffd850fa916a0a76933e968.js rename to agent/uiserver/dist/assets/metrics-providers/prometheus-8779f1c99f6a15611567154767f1f674.js index 073ed767a50..725f6e0b424 100644 --- a/agent/uiserver/dist/assets/metrics-providers/prometheus-5f31ba3b7ffd850fa916a0a76933e968.js +++ b/agent/uiserver/dist/assets/metrics-providers/prometheus-8779f1c99f6a15611567154767f1f674.js @@ -7,28 +7,28 @@ return this.hasL7Metrics(s)?(a.push(this.fetchRPS(e,t,r,"service",n)),a.push(thi return a.push(this.fetchRPS(e,t,r,s,n)),a.push(this.fetchER(e,t,r,s,n)),a.push(this.fetchPercentile(50,e,t,r,s,n)),a.push(this.fetchPercentile(99,e,t,r,s,n)),a.push(this.fetchConnRate(e,t,r,s,n)),a.push(this.fetchServiceRx(e,t,r,s,n)),a.push(this.fetchServiceTx(e,t,r,s,n)),a.push(this.fetchServiceNoRoute(e,t,r,s,n)),this.fetchStatsGrouped(a)},hasL7Metrics:function(e){return"http"===e||"http2"===e||"grpc"===e},fetchStats:function(e){return Promise.all(e).then((function(t){for(var r={stats:[]},s=0;s${c} request rate averaged over the last 15 minutes`,r,this.groupByInfix(n))},fetchER:function(e,t,s,n){var a=this.makeHTTPSelector(e,t,s,n),c=this.makeSubject(e,t,s,n),i="" -"upstream"==n?i+=" by (consul_upstream_service,consul_upstream_datacenter,consul_upstream_namespace)":"downstream"==n&&(i+=" by (consul_source_service,consul_source_datacenter,consul_source_namespace)") -var u=this.metricPrefixHTTP(n),o=`sum(rate(${u}_xx{${a},envoy_response_code_class="5"}[15m]))${i}/sum(rate(${u}_xx{${a}}[15m]))${i}` -return this.fetchStat(o,"ER",`Percentage of ${c} requests which were 5xx status over the last 15 minutes`,(function(e){return r(e)+"%"}),this.groupByInfix(n))},fetchPercentile:function(e,t,r,n,a){var c=this.makeHTTPSelector(t,r,n,a),i=this.makeSubject(t,r,n,a),u="le" -"upstream"==a?u+=",consul_upstream_service,consul_upstream_datacenter,consul_upstream_namespace":"downstream"==a&&(u+=",consul_source_service,consul_source_datacenter,consul_source_namespace") -var o=`histogram_quantile(${e/100}, sum by(${u}) (rate(${this.metricPrefixHTTP(a)}_time_bucket{${c}}[15m])))` -return this.fetchStat(o,"P"+e,`${i} ${e}th percentile request service time over the last 15 minutes`,s,this.groupByInfix(a))},fetchConnRate:function(e,t,s,n){var a=this.makeTCPSelector(e,t,s,n),c=this.makeSubject(e,t,s,n),i=`sum(rate(${this.metricPrefixTCP(n)}_total{${a}}[15m]))` -return this.fetchStat(this.groupQuery(n,i),"CR",`${c} inbound TCP connections per second averaged over the last 15 minutes`,r,this.groupByInfix(n))},fetchServiceRx:function(e,t,s,n){var a=this.makeTCPSelector(e,t,s,n),c=this.makeSubject(e,t,s,n),i=`8 * sum(rate(${this.metricPrefixTCP(n)}_rx_bytes_total{${a}}[15m]))` -return this.fetchStat(this.groupQuery(n,i),"RX",`${c} received bits per second averaged over the last 15 minutes`,r,this.groupByInfix(n))},fetchServiceTx:function(e,t,s,n){var a=this.makeTCPSelector(e,t,s,n),c=this.makeSubject(e,t,s,n),i=`8 * sum(rate(${this.metricPrefixTCP(n)}_tx_bytes_total{${a}}[15m]))` -return this.fetchStat(this.groupQuery(n,i),"TX",`${c} transmitted bits per second averaged over the last 15 minutes`,r,this.groupByInfix(n))},fetchServiceNoRoute:function(e,t,s,n){var a=this.makeTCPSelector(e,t,s,n),c=this.makeSubject(e,t,s,n),i="_no_route" -"downstream"==n&&(i="_connect_fail") -var u=`sum(rate(${this.metricPrefixTCP(n)}${i}{${a}}[15m]))` -return this.fetchStat(this.groupQuery(n,u),"NR",`${c} unroutable (failed) connections per second averaged over the last 15 minutes`,r,this.groupByInfix(n))},fetchStat:function(e,t,r,s,n){n||(e+=" OR on() vector(0)") +return n+="upstream"==s?',envoy_tcp_prefix=~"upstream.*"':',envoy_tcp_prefix="public_listener"'},groupQuery:function(e,t){return"upstream"==e?t+=" by (consul_upstream_service,consul_upstream_datacenter,consul_upstream_namespace)":"downstream"==e&&(t+=" by (consul_source_service,consul_source_datacenter,consul_source_namespace)"),t},groupByInfix:function(e){return"upstream"==e?"upstream":"downstream"==e&&"source"},metricPrefixHTTP:function(e){return"downstream"==e?"envoy_cluster_upstream_rq":"envoy_http_downstream_rq"},metricPrefixTCP:function(e){return"downstream"==e?"envoy_cluster_upstream_cx":"envoy_tcp_downstream_cx"},fetchRPS:function(e,t,s,n,a){var c=this.makeHTTPSelector(e,t,s,n),i=this.makeSubject(e,t,s,n),u=`sum(rate(${this.metricPrefixHTTP(n)}_completed{${c}}[15m]))` +return this.fetchStat(this.groupQuery(n,u),"RPS",`${i} request rate averaged over the last 15 minutes`,r,this.groupByInfix(n))},fetchER:function(e,t,s,n,a){var c=this.makeHTTPSelector(e,t,s,n),i=this.makeSubject(e,t,s,n),u="" +"upstream"==n?u+=" by (consul_upstream_service,consul_upstream_datacenter,consul_upstream_namespace)":"downstream"==n&&(u+=" by (consul_source_service,consul_source_datacenter,consul_source_namespace)") +var o=this.metricPrefixHTTP(n),h=`sum(rate(${o}_xx{${c},envoy_response_code_class="5"}[15m]))${u}/sum(rate(${o}_xx{${c}}[15m]))${u}` +return this.fetchStat(h,"ER",`Percentage of ${i} requests which were 5xx status over the last 15 minutes`,(function(e){return r(e)+"%"}),this.groupByInfix(n))},fetchPercentile:function(e,t,r,n,a,c){var i=this.makeHTTPSelector(t,r,n,a),u=this.makeSubject(t,r,n,a),o="le" +"upstream"==a?o+=",consul_upstream_service,consul_upstream_datacenter,consul_upstream_namespace":"downstream"==a&&(o+=",consul_source_service,consul_source_datacenter,consul_source_namespace") +var h=`histogram_quantile(${e/100}, sum by(${o}) (rate(${this.metricPrefixHTTP(a)}_time_bucket{${i}}[15m])))` +return this.fetchStat(h,`P${e}`,`${u} ${e}th percentile request service time over the last 15 minutes`,s,this.groupByInfix(a))},fetchConnRate:function(e,t,s,n,a){var c=this.makeTCPSelector(e,t,s,n),i=this.makeSubject(e,t,s,n),u=`sum(rate(${this.metricPrefixTCP(n)}_total{${c}}[15m]))` +return this.fetchStat(this.groupQuery(n,u),"CR",`${i} inbound TCP connections per second averaged over the last 15 minutes`,r,this.groupByInfix(n))},fetchServiceRx:function(e,t,s,n,a){var c=this.makeTCPSelector(e,t,s,n),i=this.makeSubject(e,t,s,n),u=`8 * sum(rate(${this.metricPrefixTCP(n)}_rx_bytes_total{${c}}[15m]))` +return this.fetchStat(this.groupQuery(n,u),"RX",`${i} received bits per second averaged over the last 15 minutes`,r,this.groupByInfix(n))},fetchServiceTx:function(e,t,s,n,a){var c=this.makeTCPSelector(e,t,s,n),i=this.makeSubject(e,t,s,n),u=`8 * sum(rate(${this.metricPrefixTCP(n)}_tx_bytes_total{${c}}[15m]))` +return this.fetchStat(this.groupQuery(n,u),"TX",`${i} transmitted bits per second averaged over the last 15 minutes`,r,this.groupByInfix(n))},fetchServiceNoRoute:function(e,t,s,n,a){var c=this.makeTCPSelector(e,t,s,n),i=this.makeSubject(e,t,s,n),u="_no_route" +"downstream"==n&&(u="_connect_fail") +var o=`sum(rate(${this.metricPrefixTCP(n)}${u}{${c}}[15m]))` +return this.fetchStat(this.groupQuery(n,o),"NR",`${i} unroutable (failed) connections per second averaged over the last 15 minutes`,r,this.groupByInfix(n))},fetchStat:function(e,t,r,s,n){n||(e+=" OR on() vector(0)") var a={query:e,time:(new Date).getTime()/1e3} return this.httpGet("/api/v1/query",a).then((function(e){if(!n){var a=parseFloat(e.data.result[0].value[1]) return{label:t,desc:r,value:isNaN(a)?"-":s(a)}}for(var c={},i=0;ispan::selection,.CodeMirror-line>span>span::selection{background:#d7d4f0}.CodeMirror-line::-moz-selection,.CodeMirror-line>span::-moz-selection,.CodeMirror-line>span>span::-moz-selection{background:#d7d4f0}.cm-searching{background:#ffa;background:rgba(255,255,0,.4)}.cm-force-border{padding-right:.1px}@media print{.CodeMirror div.CodeMirror-cursors{visibility:hidden}}.cm-tab-wrap-hack:after{content:''}span.CodeMirror-selectedtext{background:0 0}.CodeMirror-lint-markers{width:16px}.CodeMirror-lint-tooltip{background-color:#ffd;border:1px solid #000;border-radius:4px;color:#000;font-family:monospace;font-size:10pt;overflow:hidden;padding:2px 5px;position:fixed;white-space:pre;white-space:pre-wrap;z-index:100;max-width:600px;opacity:0;transition:opacity .4s;-moz-transition:opacity .4s;-webkit-transition:opacity .4s;-o-transition:opacity .4s;-ms-transition:opacity .4s}.CodeMirror-lint-mark-error,.CodeMirror-lint-mark-warning{background-position:left bottom;background-repeat:repeat-x}.CodeMirror-lint-mark-error{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAYAAAC09K7GAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9sJDw4cOCW1/KIAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAHElEQVQI12NggIL/DAz/GdA5/xkY/qPKMDAwAADLZwf5rvm+LQAAAABJRU5ErkJggg==)}.CodeMirror-lint-mark-warning{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAYAAAC09K7GAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9sJFhQXEbhTg7YAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAMklEQVQI12NkgIIvJ3QXMjAwdDN+OaEbysDA4MPAwNDNwMCwiOHLCd1zX07o6kBVGQEAKBANtobskNMAAAAASUVORK5CYII=)}.CodeMirror-lint-marker-error,.CodeMirror-lint-marker-warning{background-position:center center;background-repeat:no-repeat;cursor:pointer;display:inline-block;height:16px;width:16px;vertical-align:middle;position:relative}.CodeMirror-lint-message-error,.CodeMirror-lint-message-warning{padding-left:18px;background-position:top left;background-repeat:no-repeat}.CodeMirror-lint-marker-error,.CodeMirror-lint-message-error{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAHlBMVEW7AAC7AACxAAC7AAC7AAAAAAC4AAC5AAD///+7AAAUdclpAAAABnRSTlMXnORSiwCK0ZKSAAAATUlEQVR42mWPOQ7AQAgDuQLx/z8csYRmPRIFIwRGnosRrpamvkKi0FTIiMASR3hhKW+hAN6/tIWhu9PDWiTGNEkTtIOucA5Oyr9ckPgAWm0GPBog6v4AAAAASUVORK5CYII=)}.CodeMirror-lint-marker-warning,.CodeMirror-lint-message-warning{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAANlBMVEX/uwDvrwD/uwD/uwD/uwD/uwD/uwD/uwD/uwD6twD/uwAAAADurwD2tQD7uAD+ugAAAAD/uwDhmeTRAAAADHRSTlMJ8mN1EYcbmiixgACm7WbuAAAAVklEQVR42n3PUQqAIBBFUU1LLc3u/jdbOJoW1P08DA9Gba8+YWJ6gNJoNYIBzAA2chBth5kLmG9YUoG0NHAUwFXwO9LuBQL1giCQb8gC9Oro2vp5rncCIY8L8uEx5ZkAAAAASUVORK5CYII=)}.CodeMirror-lint-marker-multiple{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAHCAMAAADzjKfhAAAACVBMVEUAAAAAAAC/v7914kyHAAAAAXRSTlMAQObYZgAAACNJREFUeNo1ioEJAAAIwmz/H90iFFSGJgFMe3gaLZ0od+9/AQZ0ADosbYraAAAAAElFTkSuQmCC);background-repeat:no-repeat;background-position:right bottom;width:100%;height:100%} \ No newline at end of file diff --git a/agent/uiserver/dist/assets/vendor-aeac0d1e27f3b95c9b4bad3aac59a219.js b/agent/uiserver/dist/assets/vendor-aeac0d1e27f3b95c9b4bad3aac59a219.js new file mode 100644 index 00000000000..88a469d1852 --- /dev/null +++ b/agent/uiserver/dist/assets/vendor-aeac0d1e27f3b95c9b4bad3aac59a219.js @@ -0,0 +1,11134 @@ +window.EmberENV=function(e,t){for(var r in t)e[r]=t[r] +return e}(window.EmberENV||{},{FEATURES:{},EXTEND_PROTOTYPES:{Date:!1},_APPLICATION_TEMPLATE_WRAPPER:!1,_DEFAULT_ASYNC_OBSERVERS:!0,_JQUERY_INTEGRATION:!1,_TEMPLATE_ONLY_GLIMMER_COMPONENTS:!0}) +var loader,define,requireModule,require,requirejs,runningTests=!1;(function(e){"use strict" +function t(){var e=Object.create(null) +return e.__=void 0,delete e.__,e}var r={loader:loader,define:define,requireModule:requireModule,require:require,requirejs:requirejs} +requirejs=require=requireModule=function(e){for(var t=[],r=c(e,"(require)",t),n=t.length-1;n>=0;n--)t[n].exports() +return r.module.exports},loader={noConflict:function(t){var n,i +for(n in t)t.hasOwnProperty(n)&&r.hasOwnProperty(n)&&(i=t[n],e[i]=e[n],e[n]=r[n])},makeDefaultExport:!0} +var n=t(),i=(t(),0) +function o(e){throw new Error("an unsupported module was defined, expected `define(id, deps, module)` instead got: `"+e+"` arguments to define`")}var s=["require","exports","module"] +function a(e,t,r,n){this.uuid=i++,this.id=e,this.deps=!t.length&&r.length?s:t,this.module={exports:{}},this.callback=r,this.hasExportsAsDep=!1,this.isAlias=n,this.reified=new Array(t.length),this.state="new"}function l(){}function u(e){this.id=e}function c(e,t,r){for(var i=n[e]||n[e+"/index"];i&&i.isAlias;)i=n[i.id]||n[i.id+"/index"] +return i||function(e,t){throw new Error("Could not find module `"+e+"` imported from `"+t+"`")}(e,t),r&&"pending"!==i.state&&"finalized"!==i.state&&(i.findDeps(r),r.push(i)),i}function d(e,t){if("."!==e.charAt(0))return e +for(var r=e.split("/"),n=t.split("/").slice(0,-1),i=0,o=r.length;i2?arguments[2]:void 0,c=Math.min((void 0===u?s:i(u,s))-l,s-a),d=1 +for(l0;)l in r?r[a]=r[l]:delete r[a],a+=d,l+=d +return r}},{135:135,139:139,140:140}],38:[function(e,t,r){"use strict" +var n=e(140),i=e(135),o=e(139) +t.exports=function(e){for(var t=n(this),r=o(t.length),s=arguments.length,a=i(s>1?arguments[1]:void 0,r),l=s>2?arguments[2]:void 0,u=void 0===l?r:i(l,r);u>a;)t[a++]=e +return t}},{135:135,139:139,140:140}],39:[function(e,t,r){var n=e(138),i=e(139),o=e(135) +t.exports=function(e){return function(t,r,s){var a,l=n(t),u=i(l.length),c=o(s,u) +if(e&&r!=r){for(;u>c;)if((a=l[c++])!=a)return!0}else for(;u>c;c++)if((e||c in l)&&l[c]===r)return e||c||0 +return!e&&-1}}},{135:135,138:138,139:139}],40:[function(e,t,r){var n=e(52),i=e(75),o=e(140),s=e(139),a=e(43) +t.exports=function(e,t){var r=1==e,l=2==e,u=3==e,c=4==e,d=6==e,h=5==e||d,p=t||a +return function(t,a,f){for(var m,g,v=o(t),b=i(v),y=n(a,f,3),_=s(b.length),w=0,O=r?p(t,_):l?p(t,0):void 0;_>w;w++)if((h||w in b)&&(g=y(m=b[w],w,v),e))if(r)O[w]=g +else if(g)switch(e){case 3:return!0 +case 5:return m +case 6:return w +case 2:O.push(m)}else if(c)return!1 +return d?-1:u||c?c:O}}},{139:139,140:140,43:43,52:52,75:75}],41:[function(e,t,r){var n=e(31),i=e(140),o=e(75),s=e(139) +t.exports=function(e,t,r,a,l){n(t) +var u=i(e),c=o(u),d=s(u.length),h=l?d-1:0,p=l?-1:1 +if(r<2)for(;;){if(h in c){a=c[h],h+=p +break}if(h+=p,l?h<0:d<=h)throw TypeError("Reduce of empty array with no initial value")}for(;l?h>=0:d>h;h+=p)h in c&&(a=t(a,c[h],h,u)) +return a}},{139:139,140:140,31:31,75:75}],42:[function(e,t,r){var n=e(79),i=e(77),o=e(150)("species") +t.exports=function(e){var t +return i(e)&&("function"!=typeof(t=e.constructor)||t!==Array&&!i(t.prototype)||(t=void 0),n(t)&&null===(t=t[o])&&(t=void 0)),void 0===t?Array:t}},{150:150,77:77,79:79}],43:[function(e,t,r){var n=e(42) +t.exports=function(e,t){return new(n(e))(t)}},{42:42}],44:[function(e,t,r){"use strict" +var n=e(31),i=e(79),o=e(74),s=[].slice,a={},l=function(e,t,r){if(!(t in a)){for(var n=[],i=0;i1?arguments[1]:void 0,3);r=r?r.n:this._f;)for(n(r.v,r.k,this);r&&r.r;)r=r.p},has:function(e){return!!g(f(this,t),e)}}),h&&n(c.prototype,"size",{get:function(){return f(this,t)[m]}}),c},def:function(e,t,r){var n,i,o=g(e,t) +return o?o.v=r:(e._l=o={i:i=p(t,!0),k:t,v:r,p:n=e._l,n:void 0,r:!1},e._f||(e._f=o),n&&(n.n=o),e[m]++,"F"!==i&&(e._i[i]=o)),e},getEntry:g,setStrong:function(e,t,r){u(e,t,(function(e,r){this._t=f(e,t),this._k=r,this._l=void 0}),(function(){for(var e=this,t=e._k,r=e._l;r&&r.r;)r=r.p +return e._t&&(e._l=r=r?r.n:e._t._f)?c(0,"keys"==t?r.k:"values"==t?r.v:[r.k,r.v]):(e._t=void 0,c(1))}),r?"entries":"values",!r,!0),d(t)}}},{115:115,121:121,147:147,35:35,52:52,56:56,66:66,83:83,85:85,92:92,96:96,97:97}],48:[function(e,t,r){"use strict" +var n=e(115),i=e(92).getWeak,o=e(36),s=e(79),a=e(35),l=e(66),u=e(40),c=e(69),d=e(147),h=u(5),p=u(6),f=0,m=function(e){return e._l||(e._l=new g)},g=function(){this.a=[]},v=function(e,t){return h(e.a,(function(e){return e[0]===t}))} +g.prototype={get:function(e){var t=v(this,e) +if(t)return t[1]},has:function(e){return!!v(this,e)},set:function(e,t){var r=v(this,e) +r?r[1]=t:this.a.push([e,t])},delete:function(e){var t=p(this.a,(function(t){return t[0]===e})) +return~t&&this.a.splice(t,1),!!~t}},t.exports={getConstructor:function(e,t,r,o){var u=e((function(e,n){a(e,u,t,"_i"),e._t=t,e._i=f++,e._l=void 0,null!=n&&l(n,r,e[o],e)})) +return n(u.prototype,{delete:function(e){if(!s(e))return!1 +var r=i(e) +return!0===r?m(d(this,t)).delete(e):r&&c(r,this._i)&&delete r[this._i]},has:function(e){if(!s(e))return!1 +var r=i(e) +return!0===r?m(d(this,t)).has(e):r&&c(r,this._i)}}),u},def:function(e,t,r){var n=i(o(t),!0) +return!0===n?m(e).set(t,r):n[e._i]=r,e},ufstore:m}},{115:115,147:147,35:35,36:36,40:40,66:66,69:69,79:79,92:92}],49:[function(e,t,r){"use strict" +var n=e(68),i=e(60),o=e(116),s=e(115),a=e(92),l=e(66),u=e(35),c=e(79),d=e(62),h=e(84),p=e(122),f=e(73) +t.exports=function(e,t,r,m,g,v){var b=n[e],y=b,_=g?"set":"add",w=y&&y.prototype,O={},x=function(e){var t=w[e] +o(w,e,"delete"==e||"has"==e?function(e){return!(v&&!c(e))&&t.call(this,0===e?0:e)}:"get"==e?function(e){return v&&!c(e)?void 0:t.call(this,0===e?0:e)}:"add"==e?function(e){return t.call(this,0===e?0:e),this}:function(e,r){return t.call(this,0===e?0:e,r),this})} +if("function"==typeof y&&(v||w.forEach&&!d((function(){(new y).entries().next()})))){var P=new y,S=P[_](v?{}:-0,1)!=P,T=d((function(){P.has(1)})),E=h((function(e){new y(e)})),C=!v&&d((function(){for(var e=new y,t=5;t--;)e[_](t,t) +return!e.has(-0)})) +E||((y=t((function(t,r){u(t,y,e) +var n=f(new b,t,y) +return null!=r&&l(r,g,n[_],n),n}))).prototype=w,w.constructor=y),(T||C)&&(x("delete"),x("has"),g&&x("get")),(C||S)&&x(_),v&&w.clear&&delete w.clear}else y=m.getConstructor(t,e,g,_),s(y.prototype,r),a.NEED=!0 +return p(y,e),O[e]=y,i(i.G+i.W+i.F*(y!=b),O),v||m.setStrong(y,e,g),y}},{115:115,116:116,122:122,35:35,60:60,62:62,66:66,68:68,73:73,79:79,84:84,92:92}],50:[function(e,t,r){arguments[4][16][0].apply(r,arguments)},{16:16}],51:[function(e,t,r){"use strict" +var n=e(97),i=e(114) +t.exports=function(e,t,r){t in e?n.f(e,t,i(0,r)):e[t]=r}},{114:114,97:97}],52:[function(e,t,r){arguments[4][17][0].apply(r,arguments)},{17:17,31:31}],53:[function(e,t,r){"use strict" +var n=e(62),i=Date.prototype.getTime,o=Date.prototype.toISOString,s=function(e){return e>9?e:"0"+e} +t.exports=n((function(){return"0385-07-25T07:06:39.999Z"!=o.call(new Date(-50000000000001))}))||!n((function(){o.call(new Date(NaN))}))?function(){if(!isFinite(i.call(this)))throw RangeError("Invalid time value") +var e=this,t=e.getUTCFullYear(),r=e.getUTCMilliseconds(),n=t<0?"-":t>9999?"+":"" +return n+("00000"+Math.abs(t)).slice(n?-6:-4)+"-"+s(e.getUTCMonth()+1)+"-"+s(e.getUTCDate())+"T"+s(e.getUTCHours())+":"+s(e.getUTCMinutes())+":"+s(e.getUTCSeconds())+"."+(r>99?r:"0"+s(r))+"Z"}:o},{62:62}],54:[function(e,t,r){"use strict" +var n=e(36),i=e(141),o="number" +t.exports=function(e){if("string"!==e&&e!==o&&"default"!==e)throw TypeError("Incorrect hint") +return i(n(this),e!=o)}},{141:141,36:36}],55:[function(e,t,r){t.exports=function(e){if(null==e)throw TypeError("Can't call method on "+e) +return e}},{}],56:[function(e,t,r){arguments[4][18][0].apply(r,arguments)},{18:18,62:62}],57:[function(e,t,r){arguments[4][19][0].apply(r,arguments)},{19:19,68:68,79:79}],58:[function(e,t,r){t.exports="constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf".split(",")},{}],59:[function(e,t,r){var n=e(105),i=e(102),o=e(106) +t.exports=function(e){var t=n(e),r=i.f +if(r)for(var s,a=r(e),l=o.f,u=0;a.length>u;)l.call(e,s=a[u++])&&t.push(s) +return t}},{102:102,105:105,106:106}],60:[function(e,t,r){var n=e(68),i=e(50),o=e(70),s=e(116),a=e(52),l=function(e,t,r){var u,c,d,h,p=e&l.F,f=e&l.G,m=e&l.S,g=e&l.P,v=e&l.B,b=f?n:m?n[t]||(n[t]={}):(n[t]||{}).prototype,y=f?i:i[t]||(i[t]={}),_=y.prototype||(y.prototype={}) +for(u in f&&(r=t),r)d=((c=!p&&b&&void 0!==b[u])?b:r)[u],h=v&&c?a(d,n):g&&"function"==typeof d?a(Function.call,d):d,b&&s(b,u,d,e&l.U),y[u]!=d&&o(y,u,h),g&&_[u]!=d&&(_[u]=d)} +n.core=i,l.F=1,l.G=2,l.S=4,l.P=8,l.B=16,l.W=32,l.U=64,l.R=128,t.exports=l},{116:116,50:50,52:52,68:68,70:70}],61:[function(e,t,r){var n=e(150)("match") +t.exports=function(e){var t=/./ +try{"/./"[e](t)}catch(r){try{return t[n]=!1,!"/./"[e](t)}catch(i){}}return!0}},{150:150}],62:[function(e,t,r){arguments[4][21][0].apply(r,arguments)},{21:21}],63:[function(e,t,r){"use strict" +e(246) +var n=e(116),i=e(70),o=e(62),s=e(55),a=e(150),l=e(118),u=a("species"),c=!o((function(){var e=/./ +return e.exec=function(){var e=[] +return e.groups={a:"7"},e},"7"!=="".replace(e,"$")})),d=function(){var e=/(?:)/,t=e.exec +e.exec=function(){return t.apply(this,arguments)} +var r="ab".split(e) +return 2===r.length&&"a"===r[0]&&"b"===r[1]}() +t.exports=function(e,t,r){var h=a(e),p=!o((function(){var t={} +return t[h]=function(){return 7},7!=""[e](t)})),f=p?!o((function(){var t=!1,r=/a/ +return r.exec=function(){return t=!0,null},"split"===e&&(r.constructor={},r.constructor[u]=function(){return r}),r[h](""),!t})):void 0 +if(!p||!f||"replace"===e&&!c||"split"===e&&!d){var m=/./[h],g=r(s,h,""[e],(function(e,t,r,n,i){return t.exec===l?p&&!i?{done:!0,value:m.call(t,r,n)}:{done:!0,value:e.call(r,t,n)}:{done:!1}})),v=g[0],b=g[1] +n(String.prototype,e,v),i(RegExp.prototype,h,2==t?function(e,t){return b.call(e,this,t)}:function(e){return b.call(e,this)})}}},{116:116,118:118,150:150,246:246,55:55,62:62,70:70}],64:[function(e,t,r){"use strict" +var n=e(36) +t.exports=function(){var e=n(this),t="" +return e.global&&(t+="g"),e.ignoreCase&&(t+="i"),e.multiline&&(t+="m"),e.unicode&&(t+="u"),e.sticky&&(t+="y"),t}},{36:36}],65:[function(e,t,r){"use strict" +var n=e(77),i=e(79),o=e(139),s=e(52),a=e(150)("isConcatSpreadable") +t.exports=function e(t,r,l,u,c,d,h,p){for(var f,m,g=c,v=0,b=!!h&&s(h,p,3);v0)g=e(t,r,f,o(f.length),g,d-1)-1 +else{if(g>=9007199254740991)throw TypeError() +t[g]=f}g++}v++}return g}},{139:139,150:150,52:52,77:77,79:79}],66:[function(e,t,r){var n=e(52),i=e(81),o=e(76),s=e(36),a=e(139),l=e(151),u={},c={};(r=t.exports=function(e,t,r,d,h){var p,f,m,g,v=h?function(){return e}:l(e),b=n(r,d,t?2:1),y=0 +if("function"!=typeof v)throw TypeError(e+" is not iterable!") +if(o(v)){for(p=a(e.length);p>y;y++)if((g=t?b(s(f=e[y])[0],f[1]):b(e[y]))===u||g===c)return g}else for(m=v.call(e);!(f=m.next()).done;)if((g=i(m,b,f.value,t))===u||g===c)return g}).BREAK=u,r.RETURN=c},{139:139,151:151,36:36,52:52,76:76,81:81}],67:[function(e,t,r){t.exports=e(124)("native-function-to-string",Function.toString)},{124:124}],68:[function(e,t,r){arguments[4][22][0].apply(r,arguments)},{22:22}],69:[function(e,t,r){arguments[4][23][0].apply(r,arguments)},{23:23}],70:[function(e,t,r){arguments[4][24][0].apply(r,arguments)},{114:114,24:24,56:56,97:97}],71:[function(e,t,r){var n=e(68).document +t.exports=n&&n.documentElement},{68:68}],72:[function(e,t,r){arguments[4][25][0].apply(r,arguments)},{25:25,56:56,57:57,62:62}],73:[function(e,t,r){var n=e(79),i=e(120).set +t.exports=function(e,t,r){var o,s=t.constructor +return s!==r&&"function"==typeof s&&(o=s.prototype)!==r.prototype&&n(o)&&i&&i(e,o),e}},{120:120,79:79}],74:[function(e,t,r){t.exports=function(e,t,r){var n=void 0===r +switch(t.length){case 0:return n?e():e.call(r) +case 1:return n?e(t[0]):e.call(r,t[0]) +case 2:return n?e(t[0],t[1]):e.call(r,t[0],t[1]) +case 3:return n?e(t[0],t[1],t[2]):e.call(r,t[0],t[1],t[2]) +case 4:return n?e(t[0],t[1],t[2],t[3]):e.call(r,t[0],t[1],t[2],t[3])}return e.apply(r,t)}},{}],75:[function(e,t,r){var n=e(46) +t.exports=Object("z").propertyIsEnumerable(0)?Object:function(e){return"String"==n(e)?e.split(""):Object(e)}},{46:46}],76:[function(e,t,r){var n=e(86),i=e(150)("iterator"),o=Array.prototype +t.exports=function(e){return void 0!==e&&(n.Array===e||o[i]===e)}},{150:150,86:86}],77:[function(e,t,r){var n=e(46) +t.exports=Array.isArray||function(e){return"Array"==n(e)}},{46:46}],78:[function(e,t,r){var n=e(79),i=Math.floor +t.exports=function(e){return!n(e)&&isFinite(e)&&i(e)===e}},{79:79}],79:[function(e,t,r){arguments[4][26][0].apply(r,arguments)},{26:26}],80:[function(e,t,r){var n=e(79),i=e(46),o=e(150)("match") +t.exports=function(e){var t +return n(e)&&(void 0!==(t=e[o])?!!t:"RegExp"==i(e))}},{150:150,46:46,79:79}],81:[function(e,t,r){var n=e(36) +t.exports=function(e,t,r,i){try{return i?t(n(r)[0],r[1]):t(r)}catch(s){var o=e.return +throw void 0!==o&&n(o.call(e)),s}}},{36:36}],82:[function(e,t,r){"use strict" +var n=e(96),i=e(114),o=e(122),s={} +e(70)(s,e(150)("iterator"),(function(){return this})),t.exports=function(e,t,r){e.prototype=n(s,{next:i(1,r)}),o(e,t+" Iterator")}},{114:114,122:122,150:150,70:70,96:96}],83:[function(e,t,r){"use strict" +var n=e(87),i=e(60),o=e(116),s=e(70),a=e(86),l=e(82),u=e(122),c=e(103),d=e(150)("iterator"),h=!([].keys&&"next"in[].keys()),p="keys",f="values",m=function(){return this} +t.exports=function(e,t,r,g,v,b,y){l(r,t,g) +var _,w,O,x=function(e){if(!h&&e in E)return E[e] +switch(e){case p:case f:return function(){return new r(this,e)}}return function(){return new r(this,e)}},P=t+" Iterator",S=v==f,T=!1,E=e.prototype,C=E[d]||E["@@iterator"]||v&&E[v],k=C||x(v),M=v?S?x("entries"):k:void 0,A="Array"==t&&E.entries||C +if(A&&(O=c(A.call(new e)))!==Object.prototype&&O.next&&(u(O,P,!0),n||"function"==typeof O[d]||s(O,d,m)),S&&C&&C.name!==f&&(T=!0,k=function(){return C.call(this)}),n&&!y||!h&&!T&&E[d]||s(E,d,k),a[t]=k,a[P]=m,v)if(_={values:S?k:x(f),keys:b?k:x(p),entries:M},y)for(w in _)w in E||o(E,w,_[w]) +else i(i.P+i.F*(h||T),t,_) +return _}},{103:103,116:116,122:122,150:150,60:60,70:70,82:82,86:86,87:87}],84:[function(e,t,r){var n=e(150)("iterator"),i=!1 +try{var o=[7][n]() +o.return=function(){i=!0},Array.from(o,(function(){throw 2}))}catch(s){}t.exports=function(e,t){if(!t&&!i)return!1 +var r=!1 +try{var o=[7],a=o[n]() +a.next=function(){return{done:r=!0}},o[n]=function(){return a},e(o)}catch(s){}return r}},{150:150}],85:[function(e,t,r){t.exports=function(e,t){return{value:t,done:!!e}}},{}],86:[function(e,t,r){t.exports={}},{}],87:[function(e,t,r){t.exports=!1},{}],88:[function(e,t,r){var n=Math.expm1 +t.exports=!n||n(10)>22025.465794806718||n(10)<22025.465794806718||-2e-17!=n(-2e-17)?function(e){return 0==(e=+e)?e:e>-1e-6&&e<1e-6?e+e*e/2:Math.exp(e)-1}:n},{}],89:[function(e,t,r){var n=e(91),i=Math.pow,o=i(2,-52),s=i(2,-23),a=i(2,127)*(2-s),l=i(2,-126) +t.exports=Math.fround||function(e){var t,r,i=Math.abs(e),u=n(e) +return ia||r!=r?u*(1/0):u*r}},{91:91}],90:[function(e,t,r){t.exports=Math.log1p||function(e){return(e=+e)>-1e-8&&e<1e-8?e-e*e/2:Math.log(1+e)}},{}],91:[function(e,t,r){t.exports=Math.sign||function(e){return 0==(e=+e)||e!=e?e:e<0?-1:1}},{}],92:[function(e,t,r){var n=e(145)("meta"),i=e(79),o=e(69),s=e(97).f,a=0,l=Object.isExtensible||function(){return!0},u=!e(62)((function(){return l(Object.preventExtensions({}))})),c=function(e){s(e,n,{value:{i:"O"+ ++a,w:{}}})},d=t.exports={KEY:n,NEED:!1,fastKey:function(e,t){if(!i(e))return"symbol"==typeof e?e:("string"==typeof e?"S":"P")+e +if(!o(e,n)){if(!l(e))return"F" +if(!t)return"E" +c(e)}return e[n].i},getWeak:function(e,t){if(!o(e,n)){if(!l(e))return!0 +if(!t)return!1 +c(e)}return e[n].w},onFreeze:function(e){return u&&d.NEED&&l(e)&&!o(e,n)&&c(e),e}}},{145:145,62:62,69:69,79:79,97:97}],93:[function(e,t,r){var n=e(68),i=e(134).set,o=n.MutationObserver||n.WebKitMutationObserver,s=n.process,a=n.Promise,l="process"==e(46)(s) +t.exports=function(){var e,t,r,u=function(){var n,i +for(l&&(n=s.domain)&&n.exit();e;){i=e.fn,e=e.next +try{i()}catch(o){throw e?r():t=void 0,o}}t=void 0,n&&n.enter()} +if(l)r=function(){s.nextTick(u)} +else if(!o||n.navigator&&n.navigator.standalone)if(a&&a.resolve){var c=a.resolve(void 0) +r=function(){c.then(u)}}else r=function(){i.call(n,u)} +else{var d=!0,h=document.createTextNode("") +new o(u).observe(h,{characterData:!0}),r=function(){h.data=d=!d}}return function(n){var i={fn:n,next:void 0} +t&&(t.next=i),e||(e=i,r()),t=i}}},{134:134,46:46,68:68}],94:[function(e,t,r){"use strict" +var n=e(31) +function i(e){var t,r +this.promise=new e((function(e,n){if(void 0!==t||void 0!==r)throw TypeError("Bad Promise constructor") +t=e,r=n})),this.resolve=n(t),this.reject=n(r)}t.exports.f=function(e){return new i(e)}},{31:31}],95:[function(e,t,r){"use strict" +var n=e(56),i=e(105),o=e(102),s=e(106),a=e(140),l=e(75),u=Object.assign +t.exports=!u||e(62)((function(){var e={},t={},r=Symbol(),n="abcdefghijklmnopqrst" +return e[r]=7,n.split("").forEach((function(e){t[e]=e})),7!=u({},e)[r]||Object.keys(u({},t)).join("")!=n}))?function(e,t){for(var r=a(e),u=arguments.length,c=1,d=o.f,h=s.f;u>c;)for(var p,f=l(arguments[c++]),m=d?i(f).concat(d(f)):i(f),g=m.length,v=0;g>v;)p=m[v++],n&&!h.call(f,p)||(r[p]=f[p]) +return r}:u},{102:102,105:105,106:106,140:140,56:56,62:62,75:75}],96:[function(e,t,r){var n=e(36),i=e(98),o=e(58),s=e(123)("IE_PROTO"),a=function(){},l=function(){var t,r=e(57)("iframe"),n=o.length +for(r.style.display="none",e(71).appendChild(r),r.src="javascript:",(t=r.contentWindow.document).open(),t.write(" - - - + + + {{if .ACLsEnabled}} - + +{{end}} +{{if .PeeringEnabled}} + + {{end}} {{if .PartitionsEnabled}} - - + + {{end}} {{if .NamespacesEnabled}} - + +{{end}} +{{if .HCPEnabled}} + + {{end}} - - + + + + - - + + {{ range .ExtraScripts }} {{ end }} - + -
      + +
      From 176945aa86bdb469fdf020fb938bacc3249fcda8 Mon Sep 17 00:00:00 2001 From: Semir Patel Date: Thu, 9 Mar 2023 13:40:23 -0600 Subject: [PATCH 136/262] GRPC stub for the ResourceService (#16528) --- agent/consul/server.go | 136 +- .../grpc-external/services/resource/server.go | 56 + .../services/resource/server_test.go | 75 + .../rate_limit_mappings.gen.go | 6 + proto-public/pbresource/resource.pb.binary.go | 178 ++ proto-public/pbresource/resource.pb.go | 1667 +++++++++++++++++ proto-public/pbresource/resource.proto | 141 ++ proto-public/pbresource/resource_grpc.pb.go | 311 +++ 8 files changed, 2507 insertions(+), 63 deletions(-) create mode 100644 agent/grpc-external/services/resource/server.go create mode 100644 agent/grpc-external/services/resource/server_test.go create mode 100644 proto-public/pbresource/resource.pb.binary.go create mode 100644 proto-public/pbresource/resource.pb.go create mode 100644 proto-public/pbresource/resource.proto create mode 100644 proto-public/pbresource/resource_grpc.pb.go diff --git a/agent/consul/server.go b/agent/consul/server.go index 19ebc9c8821..81b323e8be0 100644 --- a/agent/consul/server.go +++ b/agent/consul/server.go @@ -48,6 +48,7 @@ import ( "github.com/hashicorp/consul/agent/grpc-external/services/connectca" "github.com/hashicorp/consul/agent/grpc-external/services/dataplane" "github.com/hashicorp/consul/agent/grpc-external/services/peerstream" + "github.com/hashicorp/consul/agent/grpc-external/services/resource" "github.com/hashicorp/consul/agent/grpc-external/services/serverdiscovery" agentgrpc "github.com/hashicorp/consul/agent/grpc-internal" "github.com/hashicorp/consul/agent/grpc-internal/services/subscribe" @@ -728,69 +729,8 @@ func NewServer(config *Config, flat Deps, externalGRPCServer *grpc.Server, incom s.overviewManager = NewOverviewManager(s.logger, s.fsm, s.config.MetricsReportingInterval) go s.overviewManager.Run(&lib.StopChannelContext{StopCh: s.shutdownCh}) - // Initialize external gRPC server - register services on external gRPC server. - s.externalACLServer = aclgrpc.NewServer(aclgrpc.Config{ - ACLsEnabled: s.config.ACLsEnabled, - ForwardRPC: func(info structs.RPCInfo, fn func(*grpc.ClientConn) error) (bool, error) { - return s.ForwardGRPC(s.grpcConnPool, info, fn) - }, - InPrimaryDatacenter: s.InPrimaryDatacenter(), - LoadAuthMethod: func(methodName string, entMeta *acl.EnterpriseMeta) (*structs.ACLAuthMethod, aclgrpc.Validator, error) { - return s.loadAuthMethod(methodName, entMeta) - }, - LocalTokensEnabled: s.LocalTokensEnabled, - Logger: logger.Named("grpc-api.acl"), - NewLogin: func() aclgrpc.Login { return s.aclLogin() }, - NewTokenWriter: func() aclgrpc.TokenWriter { return s.aclTokenWriter() }, - PrimaryDatacenter: s.config.PrimaryDatacenter, - ValidateEnterpriseRequest: s.validateEnterpriseRequest, - }) - s.externalACLServer.Register(s.externalGRPCServer) - - s.externalConnectCAServer = connectca.NewServer(connectca.Config{ - Publisher: s.publisher, - GetStore: func() connectca.StateStore { return s.FSM().State() }, - Logger: logger.Named("grpc-api.connect-ca"), - ACLResolver: s.ACLResolver, - CAManager: s.caManager, - ForwardRPC: func(info structs.RPCInfo, fn func(*grpc.ClientConn) error) (bool, error) { - return s.ForwardGRPC(s.grpcConnPool, info, fn) - }, - ConnectEnabled: s.config.ConnectEnabled, - }) - s.externalConnectCAServer.Register(s.externalGRPCServer) - - dataplane.NewServer(dataplane.Config{ - GetStore: func() dataplane.StateStore { return s.FSM().State() }, - Logger: logger.Named("grpc-api.dataplane"), - ACLResolver: s.ACLResolver, - Datacenter: s.config.Datacenter, - }).Register(s.externalGRPCServer) - - serverdiscovery.NewServer(serverdiscovery.Config{ - Publisher: s.publisher, - ACLResolver: s.ACLResolver, - Logger: logger.Named("grpc-api.server-discovery"), - }).Register(s.externalGRPCServer) - - s.peeringBackend = NewPeeringBackend(s) - s.operatorBackend = NewOperatorBackend(s) - s.peerStreamServer = peerstream.NewServer(peerstream.Config{ - Backend: s.peeringBackend, - GetStore: func() peerstream.StateStore { return s.FSM().State() }, - Logger: logger.Named("grpc-api.peerstream"), - ACLResolver: s.ACLResolver, - Datacenter: s.config.Datacenter, - ConnectEnabled: s.config.ConnectEnabled, - ForwardRPC: func(info structs.RPCInfo, fn func(*grpc.ClientConn) error) (bool, error) { - // Only forward the request if the dc in the request matches the server's datacenter. - if info.RequestDatacenter() != "" && info.RequestDatacenter() != config.Datacenter { - return false, fmt.Errorf("requests to generate peering tokens cannot be forwarded to remote datacenters") - } - return s.ForwardGRPC(s.grpcConnPool, info, fn) - }, - }) - s.peerStreamServer.Register(s.externalGRPCServer) + // Initialize external gRPC server + s.setupExternalGRPC(config, logger) // Initialize internal gRPC server. // @@ -1220,6 +1160,76 @@ func (s *Server) setupRPC() error { return nil } +// Initialize and register services on external gRPC server. +func (s *Server) setupExternalGRPC(config *Config, logger hclog.Logger) { + + s.externalACLServer = aclgrpc.NewServer(aclgrpc.Config{ + ACLsEnabled: s.config.ACLsEnabled, + ForwardRPC: func(info structs.RPCInfo, fn func(*grpc.ClientConn) error) (bool, error) { + return s.ForwardGRPC(s.grpcConnPool, info, fn) + }, + InPrimaryDatacenter: s.InPrimaryDatacenter(), + LoadAuthMethod: func(methodName string, entMeta *acl.EnterpriseMeta) (*structs.ACLAuthMethod, aclgrpc.Validator, error) { + return s.loadAuthMethod(methodName, entMeta) + }, + LocalTokensEnabled: s.LocalTokensEnabled, + Logger: logger.Named("grpc-api.acl"), + NewLogin: func() aclgrpc.Login { return s.aclLogin() }, + NewTokenWriter: func() aclgrpc.TokenWriter { return s.aclTokenWriter() }, + PrimaryDatacenter: s.config.PrimaryDatacenter, + ValidateEnterpriseRequest: s.validateEnterpriseRequest, + }) + s.externalACLServer.Register(s.externalGRPCServer) + + s.externalConnectCAServer = connectca.NewServer(connectca.Config{ + Publisher: s.publisher, + GetStore: func() connectca.StateStore { return s.FSM().State() }, + Logger: logger.Named("grpc-api.connect-ca"), + ACLResolver: s.ACLResolver, + CAManager: s.caManager, + ForwardRPC: func(info structs.RPCInfo, fn func(*grpc.ClientConn) error) (bool, error) { + return s.ForwardGRPC(s.grpcConnPool, info, fn) + }, + ConnectEnabled: s.config.ConnectEnabled, + }) + s.externalConnectCAServer.Register(s.externalGRPCServer) + + dataplane.NewServer(dataplane.Config{ + GetStore: func() dataplane.StateStore { return s.FSM().State() }, + Logger: logger.Named("grpc-api.dataplane"), + ACLResolver: s.ACLResolver, + Datacenter: s.config.Datacenter, + }).Register(s.externalGRPCServer) + + serverdiscovery.NewServer(serverdiscovery.Config{ + Publisher: s.publisher, + ACLResolver: s.ACLResolver, + Logger: logger.Named("grpc-api.server-discovery"), + }).Register(s.externalGRPCServer) + + s.peeringBackend = NewPeeringBackend(s) + s.operatorBackend = NewOperatorBackend(s) + + s.peerStreamServer = peerstream.NewServer(peerstream.Config{ + Backend: s.peeringBackend, + GetStore: func() peerstream.StateStore { return s.FSM().State() }, + Logger: logger.Named("grpc-api.peerstream"), + ACLResolver: s.ACLResolver, + Datacenter: s.config.Datacenter, + ConnectEnabled: s.config.ConnectEnabled, + ForwardRPC: func(info structs.RPCInfo, fn func(*grpc.ClientConn) error) (bool, error) { + // Only forward the request if the dc in the request matches the server's datacenter. + if info.RequestDatacenter() != "" && info.RequestDatacenter() != config.Datacenter { + return false, fmt.Errorf("requests to generate peering tokens cannot be forwarded to remote datacenters") + } + return s.ForwardGRPC(s.grpcConnPool, info, fn) + }, + }) + s.peerStreamServer.Register(s.externalGRPCServer) + + resource.NewServer(resource.Config{}).Register(s.externalGRPCServer) +} + // Shutdown is used to shutdown the server func (s *Server) Shutdown() error { s.logger.Info("shutting down server") diff --git a/agent/grpc-external/services/resource/server.go b/agent/grpc-external/services/resource/server.go new file mode 100644 index 00000000000..0fac97e462c --- /dev/null +++ b/agent/grpc-external/services/resource/server.go @@ -0,0 +1,56 @@ +package resource + +import ( + "context" + + "google.golang.org/grpc" + + "github.com/hashicorp/consul/proto-public/pbresource" +) + +type Server struct { + Config +} + +type Config struct { +} + +func NewServer(cfg Config) *Server { + return &Server{cfg} +} + +var _ pbresource.ResourceServiceServer = (*Server)(nil) + +func (s *Server) Register(grpcServer *grpc.Server) { + pbresource.RegisterResourceServiceServer(grpcServer, s) +} + +func (s *Server) Read(ctx context.Context, req *pbresource.ReadRequest) (*pbresource.ReadResponse, error) { + // TODO + return &pbresource.ReadResponse{}, nil +} + +func (s *Server) Write(ctx context.Context, req *pbresource.WriteRequest) (*pbresource.WriteResponse, error) { + // TODO + return &pbresource.WriteResponse{}, nil +} + +func (s *Server) WriteStatus(ctx context.Context, req *pbresource.WriteStatusRequest) (*pbresource.WriteStatusResponse, error) { + // TODO + return &pbresource.WriteStatusResponse{}, nil +} + +func (s *Server) List(ctx context.Context, req *pbresource.ListRequest) (*pbresource.ListResponse, error) { + // TODO + return &pbresource.ListResponse{}, nil +} + +func (s *Server) Delete(ctx context.Context, req *pbresource.DeleteRequest) (*pbresource.DeleteResponse, error) { + // TODO + return &pbresource.DeleteResponse{}, nil +} + +func (s *Server) Watch(req *pbresource.WatchRequest, ws pbresource.ResourceService_WatchServer) error { + // TODO + return nil +} diff --git a/agent/grpc-external/services/resource/server_test.go b/agent/grpc-external/services/resource/server_test.go new file mode 100644 index 00000000000..a07b181e0c7 --- /dev/null +++ b/agent/grpc-external/services/resource/server_test.go @@ -0,0 +1,75 @@ +package resource + +import ( + "context" + "testing" + + "github.com/stretchr/testify/require" + "google.golang.org/grpc" + + "github.com/hashicorp/consul/agent/grpc-external/testutils" + "github.com/hashicorp/consul/proto-public/pbresource" +) + +func testClient(t *testing.T, server *Server) pbresource.ResourceServiceClient { + t.Helper() + + addr := testutils.RunTestServer(t, server) + + //nolint:staticcheck + conn, err := grpc.DialContext(context.Background(), addr.String(), grpc.WithInsecure()) + require.NoError(t, err) + t.Cleanup(func() { + require.NoError(t, conn.Close()) + }) + + return pbresource.NewResourceServiceClient(conn) +} + +func TestRead_TODO(t *testing.T) { + server := NewServer(Config{}) + client := testClient(t, server) + resp, err := client.Read(context.Background(), &pbresource.ReadRequest{}) + require.NoError(t, err) + require.NotNil(t, resp) +} + +func TestWrite_TODO(t *testing.T) { + server := NewServer(Config{}) + client := testClient(t, server) + resp, err := client.Write(context.Background(), &pbresource.WriteRequest{}) + require.NoError(t, err) + require.NotNil(t, resp) +} + +func TestWriteStatus_TODO(t *testing.T) { + server := NewServer(Config{}) + client := testClient(t, server) + resp, err := client.WriteStatus(context.Background(), &pbresource.WriteStatusRequest{}) + require.NoError(t, err) + require.NotNil(t, resp) +} + +func TestList_TODO(t *testing.T) { + server := NewServer(Config{}) + client := testClient(t, server) + resp, err := client.List(context.Background(), &pbresource.ListRequest{}) + require.NoError(t, err) + require.NotNil(t, resp) +} + +func TestDelete_TODO(t *testing.T) { + server := NewServer(Config{}) + client := testClient(t, server) + resp, err := client.Delete(context.Background(), &pbresource.DeleteRequest{}) + require.NoError(t, err) + require.NotNil(t, resp) +} + +func TestWatch_TODO(t *testing.T) { + server := NewServer(Config{}) + client := testClient(t, server) + wc, err := client.Watch(context.Background(), &pbresource.WatchRequest{}) + require.NoError(t, err) + require.NotNil(t, wc) +} diff --git a/agent/grpc-middleware/rate_limit_mappings.gen.go b/agent/grpc-middleware/rate_limit_mappings.gen.go index 663d7373942..ed593ac1243 100644 --- a/agent/grpc-middleware/rate_limit_mappings.gen.go +++ b/agent/grpc-middleware/rate_limit_mappings.gen.go @@ -22,6 +22,12 @@ var rpcRateLimitSpecs = map[string]rate.OperationType{ "/hashicorp.consul.internal.peering.PeeringService/TrustBundleRead": rate.OperationTypeRead, "/hashicorp.consul.internal.peerstream.PeerStreamService/ExchangeSecret": rate.OperationTypeWrite, "/hashicorp.consul.internal.peerstream.PeerStreamService/StreamResources": rate.OperationTypeRead, + "/hashicorp.consul.resource.ResourceService/Delete": rate.OperationTypeWrite, + "/hashicorp.consul.resource.ResourceService/List": rate.OperationTypeRead, + "/hashicorp.consul.resource.ResourceService/Read": rate.OperationTypeRead, + "/hashicorp.consul.resource.ResourceService/Watch": rate.OperationTypeRead, + "/hashicorp.consul.resource.ResourceService/Write": rate.OperationTypeWrite, + "/hashicorp.consul.resource.ResourceService/WriteStatus": rate.OperationTypeWrite, "/hashicorp.consul.serverdiscovery.ServerDiscoveryService/WatchServers": rate.OperationTypeRead, "/subscribe.StateChangeSubscription/Subscribe": rate.OperationTypeRead, } diff --git a/proto-public/pbresource/resource.pb.binary.go b/proto-public/pbresource/resource.pb.binary.go new file mode 100644 index 00000000000..7db73ebf8eb --- /dev/null +++ b/proto-public/pbresource/resource.pb.binary.go @@ -0,0 +1,178 @@ +// Code generated by protoc-gen-go-binary. DO NOT EDIT. +// source: pbresource/resource.proto + +package pbresource + +import ( + "google.golang.org/protobuf/proto" +) + +// MarshalBinary implements encoding.BinaryMarshaler +func (msg *Type) MarshalBinary() ([]byte, error) { + return proto.Marshal(msg) +} + +// UnmarshalBinary implements encoding.BinaryUnmarshaler +func (msg *Type) UnmarshalBinary(b []byte) error { + return proto.Unmarshal(b, msg) +} + +// MarshalBinary implements encoding.BinaryMarshaler +func (msg *Tenancy) MarshalBinary() ([]byte, error) { + return proto.Marshal(msg) +} + +// UnmarshalBinary implements encoding.BinaryUnmarshaler +func (msg *Tenancy) UnmarshalBinary(b []byte) error { + return proto.Unmarshal(b, msg) +} + +// MarshalBinary implements encoding.BinaryMarshaler +func (msg *ID) MarshalBinary() ([]byte, error) { + return proto.Marshal(msg) +} + +// UnmarshalBinary implements encoding.BinaryUnmarshaler +func (msg *ID) UnmarshalBinary(b []byte) error { + return proto.Unmarshal(b, msg) +} + +// MarshalBinary implements encoding.BinaryMarshaler +func (msg *Resource) MarshalBinary() ([]byte, error) { + return proto.Marshal(msg) +} + +// UnmarshalBinary implements encoding.BinaryUnmarshaler +func (msg *Resource) UnmarshalBinary(b []byte) error { + return proto.Unmarshal(b, msg) +} + +// MarshalBinary implements encoding.BinaryMarshaler +func (msg *WatchEvent) MarshalBinary() ([]byte, error) { + return proto.Marshal(msg) +} + +// UnmarshalBinary implements encoding.BinaryUnmarshaler +func (msg *WatchEvent) UnmarshalBinary(b []byte) error { + return proto.Unmarshal(b, msg) +} + +// MarshalBinary implements encoding.BinaryMarshaler +func (msg *ReadRequest) MarshalBinary() ([]byte, error) { + return proto.Marshal(msg) +} + +// UnmarshalBinary implements encoding.BinaryUnmarshaler +func (msg *ReadRequest) UnmarshalBinary(b []byte) error { + return proto.Unmarshal(b, msg) +} + +// MarshalBinary implements encoding.BinaryMarshaler +func (msg *ReadResponse) MarshalBinary() ([]byte, error) { + return proto.Marshal(msg) +} + +// UnmarshalBinary implements encoding.BinaryUnmarshaler +func (msg *ReadResponse) UnmarshalBinary(b []byte) error { + return proto.Unmarshal(b, msg) +} + +// MarshalBinary implements encoding.BinaryMarshaler +func (msg *ListRequest) MarshalBinary() ([]byte, error) { + return proto.Marshal(msg) +} + +// UnmarshalBinary implements encoding.BinaryUnmarshaler +func (msg *ListRequest) UnmarshalBinary(b []byte) error { + return proto.Unmarshal(b, msg) +} + +// MarshalBinary implements encoding.BinaryMarshaler +func (msg *ListResponse) MarshalBinary() ([]byte, error) { + return proto.Marshal(msg) +} + +// UnmarshalBinary implements encoding.BinaryUnmarshaler +func (msg *ListResponse) UnmarshalBinary(b []byte) error { + return proto.Unmarshal(b, msg) +} + +// MarshalBinary implements encoding.BinaryMarshaler +func (msg *WriteRequest) MarshalBinary() ([]byte, error) { + return proto.Marshal(msg) +} + +// UnmarshalBinary implements encoding.BinaryUnmarshaler +func (msg *WriteRequest) UnmarshalBinary(b []byte) error { + return proto.Unmarshal(b, msg) +} + +// MarshalBinary implements encoding.BinaryMarshaler +func (msg *WriteResponse) MarshalBinary() ([]byte, error) { + return proto.Marshal(msg) +} + +// UnmarshalBinary implements encoding.BinaryUnmarshaler +func (msg *WriteResponse) UnmarshalBinary(b []byte) error { + return proto.Unmarshal(b, msg) +} + +// MarshalBinary implements encoding.BinaryMarshaler +func (msg *WriteStatusResponse) MarshalBinary() ([]byte, error) { + return proto.Marshal(msg) +} + +// UnmarshalBinary implements encoding.BinaryUnmarshaler +func (msg *WriteStatusResponse) UnmarshalBinary(b []byte) error { + return proto.Unmarshal(b, msg) +} + +// MarshalBinary implements encoding.BinaryMarshaler +func (msg *WriteStatusRequest) MarshalBinary() ([]byte, error) { + return proto.Marshal(msg) +} + +// UnmarshalBinary implements encoding.BinaryUnmarshaler +func (msg *WriteStatusRequest) UnmarshalBinary(b []byte) error { + return proto.Unmarshal(b, msg) +} + +// MarshalBinary implements encoding.BinaryMarshaler +func (msg *DeleteRequest) MarshalBinary() ([]byte, error) { + return proto.Marshal(msg) +} + +// UnmarshalBinary implements encoding.BinaryUnmarshaler +func (msg *DeleteRequest) UnmarshalBinary(b []byte) error { + return proto.Unmarshal(b, msg) +} + +// MarshalBinary implements encoding.BinaryMarshaler +func (msg *DeleteResponse) MarshalBinary() ([]byte, error) { + return proto.Marshal(msg) +} + +// UnmarshalBinary implements encoding.BinaryUnmarshaler +func (msg *DeleteResponse) UnmarshalBinary(b []byte) error { + return proto.Unmarshal(b, msg) +} + +// MarshalBinary implements encoding.BinaryMarshaler +func (msg *WatchRequest) MarshalBinary() ([]byte, error) { + return proto.Marshal(msg) +} + +// UnmarshalBinary implements encoding.BinaryUnmarshaler +func (msg *WatchRequest) UnmarshalBinary(b []byte) error { + return proto.Unmarshal(b, msg) +} + +// MarshalBinary implements encoding.BinaryMarshaler +func (msg *WatchResponse) MarshalBinary() ([]byte, error) { + return proto.Marshal(msg) +} + +// UnmarshalBinary implements encoding.BinaryUnmarshaler +func (msg *WatchResponse) UnmarshalBinary(b []byte) error { + return proto.Unmarshal(b, msg) +} diff --git a/proto-public/pbresource/resource.pb.go b/proto-public/pbresource/resource.pb.go new file mode 100644 index 00000000000..f5804c3d89c --- /dev/null +++ b/proto-public/pbresource/resource.pb.go @@ -0,0 +1,1667 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.28.1 +// protoc (unknown) +// source: pbresource/resource.proto + +package pbresource + +import ( + _ "github.com/hashicorp/consul/proto-public/annotations/ratelimit" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + anypb "google.golang.org/protobuf/types/known/anypb" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +type Condition int32 + +const ( + Condition_CONDITION_UNSPECIFIED Condition = 0 + Condition_CONDITION_ACCEPTED Condition = 1 + Condition_CONDITION_INVALID Condition = 2 + Condition_CONDITION_PERSISTENT_FAILURE Condition = 3 +) + +// Enum value maps for Condition. +var ( + Condition_name = map[int32]string{ + 0: "CONDITION_UNSPECIFIED", + 1: "CONDITION_ACCEPTED", + 2: "CONDITION_INVALID", + 3: "CONDITION_PERSISTENT_FAILURE", + } + Condition_value = map[string]int32{ + "CONDITION_UNSPECIFIED": 0, + "CONDITION_ACCEPTED": 1, + "CONDITION_INVALID": 2, + "CONDITION_PERSISTENT_FAILURE": 3, + } +) + +func (x Condition) Enum() *Condition { + p := new(Condition) + *p = x + return p +} + +func (x Condition) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (Condition) Descriptor() protoreflect.EnumDescriptor { + return file_pbresource_resource_proto_enumTypes[0].Descriptor() +} + +func (Condition) Type() protoreflect.EnumType { + return &file_pbresource_resource_proto_enumTypes[0] +} + +func (x Condition) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use Condition.Descriptor instead. +func (Condition) EnumDescriptor() ([]byte, []int) { + return file_pbresource_resource_proto_rawDescGZIP(), []int{0} +} + +type WatchEvent_Operation int32 + +const ( + WatchEvent_OPERATION_UNSPECIFIED WatchEvent_Operation = 0 + WatchEvent_OPERATION_UPSERT WatchEvent_Operation = 1 + WatchEvent_OPERATION_DELETE WatchEvent_Operation = 2 +) + +// Enum value maps for WatchEvent_Operation. +var ( + WatchEvent_Operation_name = map[int32]string{ + 0: "OPERATION_UNSPECIFIED", + 1: "OPERATION_UPSERT", + 2: "OPERATION_DELETE", + } + WatchEvent_Operation_value = map[string]int32{ + "OPERATION_UNSPECIFIED": 0, + "OPERATION_UPSERT": 1, + "OPERATION_DELETE": 2, + } +) + +func (x WatchEvent_Operation) Enum() *WatchEvent_Operation { + p := new(WatchEvent_Operation) + *p = x + return p +} + +func (x WatchEvent_Operation) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (WatchEvent_Operation) Descriptor() protoreflect.EnumDescriptor { + return file_pbresource_resource_proto_enumTypes[1].Descriptor() +} + +func (WatchEvent_Operation) Type() protoreflect.EnumType { + return &file_pbresource_resource_proto_enumTypes[1] +} + +func (x WatchEvent_Operation) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use WatchEvent_Operation.Descriptor instead. +func (WatchEvent_Operation) EnumDescriptor() ([]byte, []int) { + return file_pbresource_resource_proto_rawDescGZIP(), []int{4, 0} +} + +type WatchResponse_Operation int32 + +const ( + WatchResponse_OPERATION_UNSPECIFIED WatchResponse_Operation = 0 + WatchResponse_OPERATION_UPSERT WatchResponse_Operation = 1 + WatchResponse_OPERATION_DELETE WatchResponse_Operation = 2 +) + +// Enum value maps for WatchResponse_Operation. +var ( + WatchResponse_Operation_name = map[int32]string{ + 0: "OPERATION_UNSPECIFIED", + 1: "OPERATION_UPSERT", + 2: "OPERATION_DELETE", + } + WatchResponse_Operation_value = map[string]int32{ + "OPERATION_UNSPECIFIED": 0, + "OPERATION_UPSERT": 1, + "OPERATION_DELETE": 2, + } +) + +func (x WatchResponse_Operation) Enum() *WatchResponse_Operation { + p := new(WatchResponse_Operation) + *p = x + return p +} + +func (x WatchResponse_Operation) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (WatchResponse_Operation) Descriptor() protoreflect.EnumDescriptor { + return file_pbresource_resource_proto_enumTypes[2].Descriptor() +} + +func (WatchResponse_Operation) Type() protoreflect.EnumType { + return &file_pbresource_resource_proto_enumTypes[2] +} + +func (x WatchResponse_Operation) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use WatchResponse_Operation.Descriptor instead. +func (WatchResponse_Operation) EnumDescriptor() ([]byte, []int) { + return file_pbresource_resource_proto_rawDescGZIP(), []int{16, 0} +} + +type Type struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Group string `protobuf:"bytes,1,opt,name=group,proto3" json:"group,omitempty"` + GroupVersion string `protobuf:"bytes,2,opt,name=group_version,json=groupVersion,proto3" json:"group_version,omitempty"` + Kind string `protobuf:"bytes,3,opt,name=kind,proto3" json:"kind,omitempty"` +} + +func (x *Type) Reset() { + *x = Type{} + if protoimpl.UnsafeEnabled { + mi := &file_pbresource_resource_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Type) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Type) ProtoMessage() {} + +func (x *Type) ProtoReflect() protoreflect.Message { + mi := &file_pbresource_resource_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Type.ProtoReflect.Descriptor instead. +func (*Type) Descriptor() ([]byte, []int) { + return file_pbresource_resource_proto_rawDescGZIP(), []int{0} +} + +func (x *Type) GetGroup() string { + if x != nil { + return x.Group + } + return "" +} + +func (x *Type) GetGroupVersion() string { + if x != nil { + return x.GroupVersion + } + return "" +} + +func (x *Type) GetKind() string { + if x != nil { + return x.Kind + } + return "" +} + +type Tenancy struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Partition string `protobuf:"bytes,1,opt,name=partition,proto3" json:"partition,omitempty"` + Namespace string `protobuf:"bytes,2,opt,name=namespace,proto3" json:"namespace,omitempty"` + PeerName string `protobuf:"bytes,3,opt,name=peer_name,json=peerName,proto3" json:"peer_name,omitempty"` +} + +func (x *Tenancy) Reset() { + *x = Tenancy{} + if protoimpl.UnsafeEnabled { + mi := &file_pbresource_resource_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Tenancy) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Tenancy) ProtoMessage() {} + +func (x *Tenancy) ProtoReflect() protoreflect.Message { + mi := &file_pbresource_resource_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Tenancy.ProtoReflect.Descriptor instead. +func (*Tenancy) Descriptor() ([]byte, []int) { + return file_pbresource_resource_proto_rawDescGZIP(), []int{1} +} + +func (x *Tenancy) GetPartition() string { + if x != nil { + return x.Partition + } + return "" +} + +func (x *Tenancy) GetNamespace() string { + if x != nil { + return x.Namespace + } + return "" +} + +func (x *Tenancy) GetPeerName() string { + if x != nil { + return x.PeerName + } + return "" +} + +type ID struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Uid string `protobuf:"bytes,1,opt,name=uid,proto3" json:"uid,omitempty"` + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` + Type *Type `protobuf:"bytes,3,opt,name=type,proto3" json:"type,omitempty"` + Tenancy *Tenancy `protobuf:"bytes,4,opt,name=tenancy,proto3" json:"tenancy,omitempty"` +} + +func (x *ID) Reset() { + *x = ID{} + if protoimpl.UnsafeEnabled { + mi := &file_pbresource_resource_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ID) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ID) ProtoMessage() {} + +func (x *ID) ProtoReflect() protoreflect.Message { + mi := &file_pbresource_resource_proto_msgTypes[2] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ID.ProtoReflect.Descriptor instead. +func (*ID) Descriptor() ([]byte, []int) { + return file_pbresource_resource_proto_rawDescGZIP(), []int{2} +} + +func (x *ID) GetUid() string { + if x != nil { + return x.Uid + } + return "" +} + +func (x *ID) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *ID) GetType() *Type { + if x != nil { + return x.Type + } + return nil +} + +func (x *ID) GetTenancy() *Tenancy { + if x != nil { + return x.Tenancy + } + return nil +} + +type Resource struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Id *ID `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Owner *ID `protobuf:"bytes,2,opt,name=owner,proto3" json:"owner,omitempty"` + Version string `protobuf:"bytes,3,opt,name=version,proto3" json:"version,omitempty"` + Generation string `protobuf:"bytes,4,opt,name=generation,proto3" json:"generation,omitempty"` + Metadata map[string]string `protobuf:"bytes,5,rep,name=metadata,proto3" json:"metadata,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Data *anypb.Any `protobuf:"bytes,7,opt,name=data,proto3" json:"data,omitempty"` +} + +func (x *Resource) Reset() { + *x = Resource{} + if protoimpl.UnsafeEnabled { + mi := &file_pbresource_resource_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Resource) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Resource) ProtoMessage() {} + +func (x *Resource) ProtoReflect() protoreflect.Message { + mi := &file_pbresource_resource_proto_msgTypes[3] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Resource.ProtoReflect.Descriptor instead. +func (*Resource) Descriptor() ([]byte, []int) { + return file_pbresource_resource_proto_rawDescGZIP(), []int{3} +} + +func (x *Resource) GetId() *ID { + if x != nil { + return x.Id + } + return nil +} + +func (x *Resource) GetOwner() *ID { + if x != nil { + return x.Owner + } + return nil +} + +func (x *Resource) GetVersion() string { + if x != nil { + return x.Version + } + return "" +} + +func (x *Resource) GetGeneration() string { + if x != nil { + return x.Generation + } + return "" +} + +func (x *Resource) GetMetadata() map[string]string { + if x != nil { + return x.Metadata + } + return nil +} + +func (x *Resource) GetData() *anypb.Any { + if x != nil { + return x.Data + } + return nil +} + +type WatchEvent struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Operation WatchEvent_Operation `protobuf:"varint,1,opt,name=operation,proto3,enum=hashicorp.consul.resource.WatchEvent_Operation" json:"operation,omitempty"` + Resource *Resource `protobuf:"bytes,2,opt,name=resource,proto3" json:"resource,omitempty"` +} + +func (x *WatchEvent) Reset() { + *x = WatchEvent{} + if protoimpl.UnsafeEnabled { + mi := &file_pbresource_resource_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *WatchEvent) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*WatchEvent) ProtoMessage() {} + +func (x *WatchEvent) ProtoReflect() protoreflect.Message { + mi := &file_pbresource_resource_proto_msgTypes[4] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use WatchEvent.ProtoReflect.Descriptor instead. +func (*WatchEvent) Descriptor() ([]byte, []int) { + return file_pbresource_resource_proto_rawDescGZIP(), []int{4} +} + +func (x *WatchEvent) GetOperation() WatchEvent_Operation { + if x != nil { + return x.Operation + } + return WatchEvent_OPERATION_UNSPECIFIED +} + +func (x *WatchEvent) GetResource() *Resource { + if x != nil { + return x.Resource + } + return nil +} + +type ReadRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Id *ID `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` +} + +func (x *ReadRequest) Reset() { + *x = ReadRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_pbresource_resource_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ReadRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ReadRequest) ProtoMessage() {} + +func (x *ReadRequest) ProtoReflect() protoreflect.Message { + mi := &file_pbresource_resource_proto_msgTypes[5] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ReadRequest.ProtoReflect.Descriptor instead. +func (*ReadRequest) Descriptor() ([]byte, []int) { + return file_pbresource_resource_proto_rawDescGZIP(), []int{5} +} + +func (x *ReadRequest) GetId() *ID { + if x != nil { + return x.Id + } + return nil +} + +type ReadResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Resource *Resource `protobuf:"bytes,1,opt,name=resource,proto3" json:"resource,omitempty"` +} + +func (x *ReadResponse) Reset() { + *x = ReadResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_pbresource_resource_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ReadResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ReadResponse) ProtoMessage() {} + +func (x *ReadResponse) ProtoReflect() protoreflect.Message { + mi := &file_pbresource_resource_proto_msgTypes[6] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ReadResponse.ProtoReflect.Descriptor instead. +func (*ReadResponse) Descriptor() ([]byte, []int) { + return file_pbresource_resource_proto_rawDescGZIP(), []int{6} +} + +func (x *ReadResponse) GetResource() *Resource { + if x != nil { + return x.Resource + } + return nil +} + +type ListRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Type *Type `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` + Tenancy *Tenancy `protobuf:"bytes,2,opt,name=tenancy,proto3" json:"tenancy,omitempty"` + NamePrefix string `protobuf:"bytes,3,opt,name=name_prefix,json=namePrefix,proto3" json:"name_prefix,omitempty"` +} + +func (x *ListRequest) Reset() { + *x = ListRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_pbresource_resource_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ListRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListRequest) ProtoMessage() {} + +func (x *ListRequest) ProtoReflect() protoreflect.Message { + mi := &file_pbresource_resource_proto_msgTypes[7] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListRequest.ProtoReflect.Descriptor instead. +func (*ListRequest) Descriptor() ([]byte, []int) { + return file_pbresource_resource_proto_rawDescGZIP(), []int{7} +} + +func (x *ListRequest) GetType() *Type { + if x != nil { + return x.Type + } + return nil +} + +func (x *ListRequest) GetTenancy() *Tenancy { + if x != nil { + return x.Tenancy + } + return nil +} + +func (x *ListRequest) GetNamePrefix() string { + if x != nil { + return x.NamePrefix + } + return "" +} + +type ListResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Resources []*Resource `protobuf:"bytes,1,rep,name=resources,proto3" json:"resources,omitempty"` +} + +func (x *ListResponse) Reset() { + *x = ListResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_pbresource_resource_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ListResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListResponse) ProtoMessage() {} + +func (x *ListResponse) ProtoReflect() protoreflect.Message { + mi := &file_pbresource_resource_proto_msgTypes[8] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListResponse.ProtoReflect.Descriptor instead. +func (*ListResponse) Descriptor() ([]byte, []int) { + return file_pbresource_resource_proto_rawDescGZIP(), []int{8} +} + +func (x *ListResponse) GetResources() []*Resource { + if x != nil { + return x.Resources + } + return nil +} + +type WriteRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Resource *Resource `protobuf:"bytes,1,opt,name=resource,proto3" json:"resource,omitempty"` +} + +func (x *WriteRequest) Reset() { + *x = WriteRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_pbresource_resource_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *WriteRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*WriteRequest) ProtoMessage() {} + +func (x *WriteRequest) ProtoReflect() protoreflect.Message { + mi := &file_pbresource_resource_proto_msgTypes[9] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use WriteRequest.ProtoReflect.Descriptor instead. +func (*WriteRequest) Descriptor() ([]byte, []int) { + return file_pbresource_resource_proto_rawDescGZIP(), []int{9} +} + +func (x *WriteRequest) GetResource() *Resource { + if x != nil { + return x.Resource + } + return nil +} + +type WriteResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Resource *Resource `protobuf:"bytes,1,opt,name=resource,proto3" json:"resource,omitempty"` +} + +func (x *WriteResponse) Reset() { + *x = WriteResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_pbresource_resource_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *WriteResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*WriteResponse) ProtoMessage() {} + +func (x *WriteResponse) ProtoReflect() protoreflect.Message { + mi := &file_pbresource_resource_proto_msgTypes[10] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use WriteResponse.ProtoReflect.Descriptor instead. +func (*WriteResponse) Descriptor() ([]byte, []int) { + return file_pbresource_resource_proto_rawDescGZIP(), []int{10} +} + +func (x *WriteResponse) GetResource() *Resource { + if x != nil { + return x.Resource + } + return nil +} + +type WriteStatusResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Resource *Resource `protobuf:"bytes,1,opt,name=resource,proto3" json:"resource,omitempty"` +} + +func (x *WriteStatusResponse) Reset() { + *x = WriteStatusResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_pbresource_resource_proto_msgTypes[11] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *WriteStatusResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*WriteStatusResponse) ProtoMessage() {} + +func (x *WriteStatusResponse) ProtoReflect() protoreflect.Message { + mi := &file_pbresource_resource_proto_msgTypes[11] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use WriteStatusResponse.ProtoReflect.Descriptor instead. +func (*WriteStatusResponse) Descriptor() ([]byte, []int) { + return file_pbresource_resource_proto_rawDescGZIP(), []int{11} +} + +func (x *WriteStatusResponse) GetResource() *Resource { + if x != nil { + return x.Resource + } + return nil +} + +type WriteStatusRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Id *ID `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Version string `protobuf:"bytes,2,opt,name=version,proto3" json:"version,omitempty"` + Key string `protobuf:"bytes,3,opt,name=key,proto3" json:"key,omitempty"` + Condition Condition `protobuf:"varint,4,opt,name=condition,proto3,enum=hashicorp.consul.resource.Condition" json:"condition,omitempty"` + State string `protobuf:"bytes,5,opt,name=state,proto3" json:"state,omitempty"` + Messages []string `protobuf:"bytes,6,rep,name=messages,proto3" json:"messages,omitempty"` +} + +func (x *WriteStatusRequest) Reset() { + *x = WriteStatusRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_pbresource_resource_proto_msgTypes[12] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *WriteStatusRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*WriteStatusRequest) ProtoMessage() {} + +func (x *WriteStatusRequest) ProtoReflect() protoreflect.Message { + mi := &file_pbresource_resource_proto_msgTypes[12] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use WriteStatusRequest.ProtoReflect.Descriptor instead. +func (*WriteStatusRequest) Descriptor() ([]byte, []int) { + return file_pbresource_resource_proto_rawDescGZIP(), []int{12} +} + +func (x *WriteStatusRequest) GetId() *ID { + if x != nil { + return x.Id + } + return nil +} + +func (x *WriteStatusRequest) GetVersion() string { + if x != nil { + return x.Version + } + return "" +} + +func (x *WriteStatusRequest) GetKey() string { + if x != nil { + return x.Key + } + return "" +} + +func (x *WriteStatusRequest) GetCondition() Condition { + if x != nil { + return x.Condition + } + return Condition_CONDITION_UNSPECIFIED +} + +func (x *WriteStatusRequest) GetState() string { + if x != nil { + return x.State + } + return "" +} + +func (x *WriteStatusRequest) GetMessages() []string { + if x != nil { + return x.Messages + } + return nil +} + +type DeleteRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Id *ID `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Version string `protobuf:"bytes,2,opt,name=version,proto3" json:"version,omitempty"` +} + +func (x *DeleteRequest) Reset() { + *x = DeleteRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_pbresource_resource_proto_msgTypes[13] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DeleteRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DeleteRequest) ProtoMessage() {} + +func (x *DeleteRequest) ProtoReflect() protoreflect.Message { + mi := &file_pbresource_resource_proto_msgTypes[13] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DeleteRequest.ProtoReflect.Descriptor instead. +func (*DeleteRequest) Descriptor() ([]byte, []int) { + return file_pbresource_resource_proto_rawDescGZIP(), []int{13} +} + +func (x *DeleteRequest) GetId() *ID { + if x != nil { + return x.Id + } + return nil +} + +func (x *DeleteRequest) GetVersion() string { + if x != nil { + return x.Version + } + return "" +} + +type DeleteResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *DeleteResponse) Reset() { + *x = DeleteResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_pbresource_resource_proto_msgTypes[14] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DeleteResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DeleteResponse) ProtoMessage() {} + +func (x *DeleteResponse) ProtoReflect() protoreflect.Message { + mi := &file_pbresource_resource_proto_msgTypes[14] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DeleteResponse.ProtoReflect.Descriptor instead. +func (*DeleteResponse) Descriptor() ([]byte, []int) { + return file_pbresource_resource_proto_rawDescGZIP(), []int{14} +} + +type WatchRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Id *ID `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` +} + +func (x *WatchRequest) Reset() { + *x = WatchRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_pbresource_resource_proto_msgTypes[15] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *WatchRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*WatchRequest) ProtoMessage() {} + +func (x *WatchRequest) ProtoReflect() protoreflect.Message { + mi := &file_pbresource_resource_proto_msgTypes[15] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use WatchRequest.ProtoReflect.Descriptor instead. +func (*WatchRequest) Descriptor() ([]byte, []int) { + return file_pbresource_resource_proto_rawDescGZIP(), []int{15} +} + +func (x *WatchRequest) GetId() *ID { + if x != nil { + return x.Id + } + return nil +} + +type WatchResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Operation WatchResponse_Operation `protobuf:"varint,1,opt,name=operation,proto3,enum=hashicorp.consul.resource.WatchResponse_Operation" json:"operation,omitempty"` + Resource *Resource `protobuf:"bytes,2,opt,name=resource,proto3" json:"resource,omitempty"` +} + +func (x *WatchResponse) Reset() { + *x = WatchResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_pbresource_resource_proto_msgTypes[16] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *WatchResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*WatchResponse) ProtoMessage() {} + +func (x *WatchResponse) ProtoReflect() protoreflect.Message { + mi := &file_pbresource_resource_proto_msgTypes[16] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use WatchResponse.ProtoReflect.Descriptor instead. +func (*WatchResponse) Descriptor() ([]byte, []int) { + return file_pbresource_resource_proto_rawDescGZIP(), []int{16} +} + +func (x *WatchResponse) GetOperation() WatchResponse_Operation { + if x != nil { + return x.Operation + } + return WatchResponse_OPERATION_UNSPECIFIED +} + +func (x *WatchResponse) GetResource() *Resource { + if x != nil { + return x.Resource + } + return nil +} + +var File_pbresource_resource_proto protoreflect.FileDescriptor + +var file_pbresource_resource_proto_rawDesc = []byte{ + 0x0a, 0x19, 0x70, 0x62, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2f, 0x72, 0x65, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x19, 0x68, 0x61, 0x73, + 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x72, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x1a, 0x25, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x2f, 0x72, 0x61, 0x74, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x2f, 0x72, 0x61, + 0x74, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x19, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x61, + 0x6e, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x55, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, + 0x12, 0x14, 0x0a, 0x05, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x23, 0x0a, 0x0d, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, + 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x67, + 0x72, 0x6f, 0x75, 0x70, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6b, + 0x69, 0x6e, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x22, + 0x62, 0x0a, 0x07, 0x54, 0x65, 0x6e, 0x61, 0x6e, 0x63, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x70, 0x61, + 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, + 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, + 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x65, 0x65, 0x72, 0x5f, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x65, 0x65, 0x72, 0x4e, + 0x61, 0x6d, 0x65, 0x22, 0x9d, 0x01, 0x0a, 0x02, 0x49, 0x44, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x12, 0x33, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, + 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, + 0x6c, 0x2e, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, + 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x3c, 0x0a, 0x07, 0x74, 0x65, 0x6e, 0x61, 0x6e, 0x63, 0x79, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, + 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x2e, 0x54, 0x65, 0x6e, 0x61, 0x6e, 0x63, 0x79, 0x52, 0x07, 0x74, 0x65, 0x6e, 0x61, + 0x6e, 0x63, 0x79, 0x22, 0xe4, 0x02, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x12, 0x2d, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x68, + 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, + 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x49, 0x44, 0x52, 0x02, 0x69, 0x64, 0x12, + 0x33, 0x0a, 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, + 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, + 0x6c, 0x2e, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x49, 0x44, 0x52, 0x05, 0x6f, + 0x77, 0x6e, 0x65, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1e, + 0x0a, 0x0a, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0a, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x4d, + 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x31, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, + 0x73, 0x75, 0x6c, 0x2e, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x52, 0x65, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x28, 0x0a, + 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x41, 0x6e, + 0x79, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x1a, 0x3b, 0x0a, 0x0d, 0x4d, 0x65, 0x74, 0x61, 0x64, + 0x61, 0x74, 0x61, 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, 0x4a, 0x04, 0x08, 0x06, 0x10, 0x07, 0x22, 0xf0, 0x01, 0x0a, 0x0a, 0x57, + 0x61, 0x74, 0x63, 0x68, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x4d, 0x0a, 0x09, 0x6f, 0x70, 0x65, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2f, 0x2e, 0x68, + 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, + 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x57, 0x61, 0x74, 0x63, 0x68, 0x45, 0x76, + 0x65, 0x6e, 0x74, 0x2e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x09, 0x6f, + 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3f, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x68, 0x61, 0x73, + 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x72, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, + 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x22, 0x52, 0x0a, 0x09, 0x4f, 0x70, 0x65, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x19, 0x0a, 0x15, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, + 0x49, 0x4f, 0x4e, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, + 0x00, 0x12, 0x14, 0x0a, 0x10, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x55, + 0x50, 0x53, 0x45, 0x52, 0x54, 0x10, 0x01, 0x12, 0x14, 0x0a, 0x10, 0x4f, 0x50, 0x45, 0x52, 0x41, + 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x45, 0x10, 0x02, 0x22, 0x3c, 0x0a, + 0x0b, 0x52, 0x65, 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2d, 0x0a, 0x02, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, + 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x72, 0x65, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x2e, 0x49, 0x44, 0x52, 0x02, 0x69, 0x64, 0x22, 0x4f, 0x0a, 0x0c, 0x52, + 0x65, 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3f, 0x0a, 0x08, 0x72, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, + 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, + 0x2e, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x52, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x22, 0xa1, 0x01, 0x0a, + 0x0b, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x33, 0x0a, 0x04, + 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x68, 0x61, 0x73, + 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x72, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, + 0x65, 0x12, 0x3c, 0x0a, 0x07, 0x74, 0x65, 0x6e, 0x61, 0x6e, 0x63, 0x79, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, + 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x54, + 0x65, 0x6e, 0x61, 0x6e, 0x63, 0x79, 0x52, 0x07, 0x74, 0x65, 0x6e, 0x61, 0x6e, 0x63, 0x79, 0x12, + 0x1f, 0x0a, 0x0b, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x6e, 0x61, 0x6d, 0x65, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, + 0x22, 0x51, 0x0a, 0x0c, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x41, 0x0a, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, + 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, + 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x73, 0x22, 0x4f, 0x0a, 0x0c, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x3f, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, + 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x08, 0x72, 0x65, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x22, 0x50, 0x0a, 0x0d, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3f, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, + 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x72, 0x65, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x08, 0x72, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x22, 0x56, 0x0a, 0x13, 0x57, 0x72, 0x69, 0x74, 0x65, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3f, 0x0a, + 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x23, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, + 0x75, 0x6c, 0x2e, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x52, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x22, 0xe5, + 0x01, 0x0a, 0x12, 0x57, 0x72, 0x69, 0x74, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2d, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1d, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, + 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x49, 0x44, + 0x52, 0x02, 0x69, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x10, + 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, + 0x12, 0x42, 0x0a, 0x09, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x24, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, + 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, + 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x09, 0x63, 0x6f, 0x6e, 0x64, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x6d, 0x65, + 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x6d, 0x65, + 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x22, 0x58, 0x0a, 0x0d, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2d, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, + 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, + 0x49, 0x44, 0x52, 0x02, 0x69, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x22, 0x10, 0x0a, 0x0e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x3d, 0x0a, 0x0c, 0x57, 0x61, 0x74, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x2d, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, + 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, + 0x6c, 0x2e, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x49, 0x44, 0x52, 0x02, 0x69, + 0x64, 0x22, 0xf6, 0x01, 0x0a, 0x0d, 0x57, 0x61, 0x74, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x50, 0x0a, 0x09, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x32, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, + 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x2e, 0x57, 0x61, 0x74, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x2e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x09, 0x6f, 0x70, 0x65, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3f, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, + 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x72, 0x65, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x08, 0x72, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x22, 0x52, 0x0a, 0x09, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x19, 0x0a, 0x15, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, + 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x14, + 0x0a, 0x10, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x55, 0x50, 0x53, 0x45, + 0x52, 0x54, 0x10, 0x01, 0x12, 0x14, 0x0a, 0x10, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x49, 0x4f, + 0x4e, 0x5f, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x45, 0x10, 0x02, 0x2a, 0x77, 0x0a, 0x09, 0x43, 0x6f, + 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x19, 0x0a, 0x15, 0x43, 0x4f, 0x4e, 0x44, 0x49, + 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, + 0x10, 0x00, 0x12, 0x16, 0x0a, 0x12, 0x43, 0x4f, 0x4e, 0x44, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x5f, + 0x41, 0x43, 0x43, 0x45, 0x50, 0x54, 0x45, 0x44, 0x10, 0x01, 0x12, 0x15, 0x0a, 0x11, 0x43, 0x4f, + 0x4e, 0x44, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, + 0x02, 0x12, 0x20, 0x0a, 0x1c, 0x43, 0x4f, 0x4e, 0x44, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x50, + 0x45, 0x52, 0x53, 0x49, 0x53, 0x54, 0x45, 0x4e, 0x54, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x55, 0x52, + 0x45, 0x10, 0x03, 0x32, 0xfa, 0x04, 0x0a, 0x0f, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x5f, 0x0a, 0x04, 0x52, 0x65, 0x61, 0x64, 0x12, + 0x26, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, + 0x75, 0x6c, 0x2e, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x52, 0x65, 0x61, 0x64, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, + 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x72, 0x65, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x2e, 0x52, 0x65, 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x06, 0xe2, 0x86, 0x04, 0x02, 0x08, 0x02, 0x12, 0x62, 0x0a, 0x05, 0x57, 0x72, 0x69, 0x74, + 0x65, 0x12, 0x27, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, + 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x57, 0x72, + 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x68, 0x61, 0x73, + 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x72, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xe2, 0x86, 0x04, 0x02, 0x08, 0x03, 0x12, 0x74, 0x0a, 0x0b, + 0x57, 0x72, 0x69, 0x74, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x2d, 0x2e, 0x68, 0x61, + 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x72, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x57, 0x72, 0x69, 0x74, 0x65, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x68, 0x61, 0x73, + 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x72, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x57, 0x72, 0x69, 0x74, 0x65, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xe2, 0x86, 0x04, 0x02, + 0x08, 0x03, 0x12, 0x5f, 0x0a, 0x04, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x26, 0x2e, 0x68, 0x61, 0x73, + 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x72, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, + 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x4c, + 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xe2, 0x86, 0x04, + 0x02, 0x08, 0x02, 0x12, 0x65, 0x0a, 0x06, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x28, 0x2e, + 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, + 0x2e, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, + 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x72, 0x65, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x06, 0xe2, 0x86, 0x04, 0x02, 0x08, 0x03, 0x12, 0x64, 0x0a, 0x05, 0x57, 0x61, + 0x74, 0x63, 0x68, 0x12, 0x27, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, + 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, + 0x57, 0x61, 0x74, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x68, + 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, + 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x57, 0x61, 0x74, 0x63, 0x68, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xe2, 0x86, 0x04, 0x02, 0x08, 0x02, 0x30, 0x01, + 0x42, 0xe9, 0x01, 0x0a, 0x1d, 0x63, 0x6f, 0x6d, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, + 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x42, 0x0d, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x50, 0x72, 0x6f, 0x74, + 0x6f, 0x50, 0x01, 0x5a, 0x33, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, + 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, + 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2d, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x2f, 0x70, 0x62, + 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0xa2, 0x02, 0x03, 0x48, 0x43, 0x52, 0xaa, 0x02, + 0x19, 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x43, 0x6f, 0x6e, 0x73, 0x75, + 0x6c, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0xca, 0x02, 0x19, 0x48, 0x61, 0x73, + 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x5c, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x5c, 0x52, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0xe2, 0x02, 0x25, 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, + 0x72, 0x70, 0x5c, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x5c, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, + 0x1b, 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x3a, 0x3a, 0x43, 0x6f, 0x6e, 0x73, + 0x75, 0x6c, 0x3a, 0x3a, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x62, 0x06, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_pbresource_resource_proto_rawDescOnce sync.Once + file_pbresource_resource_proto_rawDescData = file_pbresource_resource_proto_rawDesc +) + +func file_pbresource_resource_proto_rawDescGZIP() []byte { + file_pbresource_resource_proto_rawDescOnce.Do(func() { + file_pbresource_resource_proto_rawDescData = protoimpl.X.CompressGZIP(file_pbresource_resource_proto_rawDescData) + }) + return file_pbresource_resource_proto_rawDescData +} + +var file_pbresource_resource_proto_enumTypes = make([]protoimpl.EnumInfo, 3) +var file_pbresource_resource_proto_msgTypes = make([]protoimpl.MessageInfo, 18) +var file_pbresource_resource_proto_goTypes = []interface{}{ + (Condition)(0), // 0: hashicorp.consul.resource.Condition + (WatchEvent_Operation)(0), // 1: hashicorp.consul.resource.WatchEvent.Operation + (WatchResponse_Operation)(0), // 2: hashicorp.consul.resource.WatchResponse.Operation + (*Type)(nil), // 3: hashicorp.consul.resource.Type + (*Tenancy)(nil), // 4: hashicorp.consul.resource.Tenancy + (*ID)(nil), // 5: hashicorp.consul.resource.ID + (*Resource)(nil), // 6: hashicorp.consul.resource.Resource + (*WatchEvent)(nil), // 7: hashicorp.consul.resource.WatchEvent + (*ReadRequest)(nil), // 8: hashicorp.consul.resource.ReadRequest + (*ReadResponse)(nil), // 9: hashicorp.consul.resource.ReadResponse + (*ListRequest)(nil), // 10: hashicorp.consul.resource.ListRequest + (*ListResponse)(nil), // 11: hashicorp.consul.resource.ListResponse + (*WriteRequest)(nil), // 12: hashicorp.consul.resource.WriteRequest + (*WriteResponse)(nil), // 13: hashicorp.consul.resource.WriteResponse + (*WriteStatusResponse)(nil), // 14: hashicorp.consul.resource.WriteStatusResponse + (*WriteStatusRequest)(nil), // 15: hashicorp.consul.resource.WriteStatusRequest + (*DeleteRequest)(nil), // 16: hashicorp.consul.resource.DeleteRequest + (*DeleteResponse)(nil), // 17: hashicorp.consul.resource.DeleteResponse + (*WatchRequest)(nil), // 18: hashicorp.consul.resource.WatchRequest + (*WatchResponse)(nil), // 19: hashicorp.consul.resource.WatchResponse + nil, // 20: hashicorp.consul.resource.Resource.MetadataEntry + (*anypb.Any)(nil), // 21: google.protobuf.Any +} +var file_pbresource_resource_proto_depIdxs = []int32{ + 3, // 0: hashicorp.consul.resource.ID.type:type_name -> hashicorp.consul.resource.Type + 4, // 1: hashicorp.consul.resource.ID.tenancy:type_name -> hashicorp.consul.resource.Tenancy + 5, // 2: hashicorp.consul.resource.Resource.id:type_name -> hashicorp.consul.resource.ID + 5, // 3: hashicorp.consul.resource.Resource.owner:type_name -> hashicorp.consul.resource.ID + 20, // 4: hashicorp.consul.resource.Resource.metadata:type_name -> hashicorp.consul.resource.Resource.MetadataEntry + 21, // 5: hashicorp.consul.resource.Resource.data:type_name -> google.protobuf.Any + 1, // 6: hashicorp.consul.resource.WatchEvent.operation:type_name -> hashicorp.consul.resource.WatchEvent.Operation + 6, // 7: hashicorp.consul.resource.WatchEvent.resource:type_name -> hashicorp.consul.resource.Resource + 5, // 8: hashicorp.consul.resource.ReadRequest.id:type_name -> hashicorp.consul.resource.ID + 6, // 9: hashicorp.consul.resource.ReadResponse.resource:type_name -> hashicorp.consul.resource.Resource + 3, // 10: hashicorp.consul.resource.ListRequest.type:type_name -> hashicorp.consul.resource.Type + 4, // 11: hashicorp.consul.resource.ListRequest.tenancy:type_name -> hashicorp.consul.resource.Tenancy + 6, // 12: hashicorp.consul.resource.ListResponse.resources:type_name -> hashicorp.consul.resource.Resource + 6, // 13: hashicorp.consul.resource.WriteRequest.resource:type_name -> hashicorp.consul.resource.Resource + 6, // 14: hashicorp.consul.resource.WriteResponse.resource:type_name -> hashicorp.consul.resource.Resource + 6, // 15: hashicorp.consul.resource.WriteStatusResponse.resource:type_name -> hashicorp.consul.resource.Resource + 5, // 16: hashicorp.consul.resource.WriteStatusRequest.id:type_name -> hashicorp.consul.resource.ID + 0, // 17: hashicorp.consul.resource.WriteStatusRequest.condition:type_name -> hashicorp.consul.resource.Condition + 5, // 18: hashicorp.consul.resource.DeleteRequest.id:type_name -> hashicorp.consul.resource.ID + 5, // 19: hashicorp.consul.resource.WatchRequest.id:type_name -> hashicorp.consul.resource.ID + 2, // 20: hashicorp.consul.resource.WatchResponse.operation:type_name -> hashicorp.consul.resource.WatchResponse.Operation + 6, // 21: hashicorp.consul.resource.WatchResponse.resource:type_name -> hashicorp.consul.resource.Resource + 8, // 22: hashicorp.consul.resource.ResourceService.Read:input_type -> hashicorp.consul.resource.ReadRequest + 12, // 23: hashicorp.consul.resource.ResourceService.Write:input_type -> hashicorp.consul.resource.WriteRequest + 15, // 24: hashicorp.consul.resource.ResourceService.WriteStatus:input_type -> hashicorp.consul.resource.WriteStatusRequest + 10, // 25: hashicorp.consul.resource.ResourceService.List:input_type -> hashicorp.consul.resource.ListRequest + 16, // 26: hashicorp.consul.resource.ResourceService.Delete:input_type -> hashicorp.consul.resource.DeleteRequest + 18, // 27: hashicorp.consul.resource.ResourceService.Watch:input_type -> hashicorp.consul.resource.WatchRequest + 9, // 28: hashicorp.consul.resource.ResourceService.Read:output_type -> hashicorp.consul.resource.ReadResponse + 13, // 29: hashicorp.consul.resource.ResourceService.Write:output_type -> hashicorp.consul.resource.WriteResponse + 14, // 30: hashicorp.consul.resource.ResourceService.WriteStatus:output_type -> hashicorp.consul.resource.WriteStatusResponse + 11, // 31: hashicorp.consul.resource.ResourceService.List:output_type -> hashicorp.consul.resource.ListResponse + 17, // 32: hashicorp.consul.resource.ResourceService.Delete:output_type -> hashicorp.consul.resource.DeleteResponse + 19, // 33: hashicorp.consul.resource.ResourceService.Watch:output_type -> hashicorp.consul.resource.WatchResponse + 28, // [28:34] is the sub-list for method output_type + 22, // [22:28] is the sub-list for method input_type + 22, // [22:22] is the sub-list for extension type_name + 22, // [22:22] is the sub-list for extension extendee + 0, // [0:22] is the sub-list for field type_name +} + +func init() { file_pbresource_resource_proto_init() } +func file_pbresource_resource_proto_init() { + if File_pbresource_resource_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_pbresource_resource_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Type); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_pbresource_resource_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Tenancy); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_pbresource_resource_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ID); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_pbresource_resource_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Resource); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_pbresource_resource_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*WatchEvent); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_pbresource_resource_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ReadRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_pbresource_resource_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ReadResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_pbresource_resource_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_pbresource_resource_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_pbresource_resource_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*WriteRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_pbresource_resource_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*WriteResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_pbresource_resource_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*WriteStatusResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_pbresource_resource_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*WriteStatusRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_pbresource_resource_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DeleteRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_pbresource_resource_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DeleteResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_pbresource_resource_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*WatchRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_pbresource_resource_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*WatchResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_pbresource_resource_proto_rawDesc, + NumEnums: 3, + NumMessages: 18, + NumExtensions: 0, + NumServices: 1, + }, + GoTypes: file_pbresource_resource_proto_goTypes, + DependencyIndexes: file_pbresource_resource_proto_depIdxs, + EnumInfos: file_pbresource_resource_proto_enumTypes, + MessageInfos: file_pbresource_resource_proto_msgTypes, + }.Build() + File_pbresource_resource_proto = out.File + file_pbresource_resource_proto_rawDesc = nil + file_pbresource_resource_proto_goTypes = nil + file_pbresource_resource_proto_depIdxs = nil +} diff --git a/proto-public/pbresource/resource.proto b/proto-public/pbresource/resource.proto new file mode 100644 index 00000000000..156b103e5e5 --- /dev/null +++ b/proto-public/pbresource/resource.proto @@ -0,0 +1,141 @@ +syntax = "proto3"; + +package hashicorp.consul.resource; + +import "annotations/ratelimit/ratelimit.proto"; +import "google/protobuf/any.proto"; + +message Type { + string group = 1; + string group_version = 2; + string kind = 3; +} + +message Tenancy { + string partition = 1; + string namespace = 2; + string peer_name = 3; +} + +message ID { + string uid = 1; + string name = 2; + Type type = 3; + Tenancy tenancy = 4; +} + +message Resource { + ID id = 1; + ID owner = 2; + string version = 3; + string generation = 4; + + map metadata = 5; + reserved 6; // status + + google.protobuf.Any data = 7; +} + +message WatchEvent { + enum Operation { + OPERATION_UNSPECIFIED = 0; + OPERATION_UPSERT = 1; + OPERATION_DELETE = 2; + } + + Operation operation = 1; + Resource resource = 2; +} + +service ResourceService { + rpc Read(ReadRequest) returns (ReadResponse) { + option (hashicorp.consul.internal.ratelimit.spec) = {operation_type: OPERATION_TYPE_READ}; + } + + rpc Write(WriteRequest) returns (WriteResponse) { + option (hashicorp.consul.internal.ratelimit.spec) = {operation_type: OPERATION_TYPE_WRITE}; + } + + rpc WriteStatus(WriteStatusRequest) returns (WriteStatusResponse) { + option (hashicorp.consul.internal.ratelimit.spec) = {operation_type: OPERATION_TYPE_WRITE}; + } + + rpc List(ListRequest) returns (ListResponse) { + option (hashicorp.consul.internal.ratelimit.spec) = {operation_type: OPERATION_TYPE_READ}; + } + + rpc Delete(DeleteRequest) returns (DeleteResponse) { + option (hashicorp.consul.internal.ratelimit.spec) = {operation_type: OPERATION_TYPE_WRITE}; + } + + rpc Watch(WatchRequest) returns (stream WatchResponse) { + option (hashicorp.consul.internal.ratelimit.spec) = {operation_type: OPERATION_TYPE_READ}; + } +} + +enum Condition { + CONDITION_UNSPECIFIED = 0; + CONDITION_ACCEPTED = 1; + CONDITION_INVALID = 2; + CONDITION_PERSISTENT_FAILURE = 3; +} + +message ReadRequest { + ID id = 1; +} + +message ReadResponse { + Resource resource = 1; +} + +message ListRequest { + Type type = 1; + Tenancy tenancy = 2; + string name_prefix = 3; +} + +message ListResponse { + repeated Resource resources = 1; +} + +message WriteRequest { + Resource resource = 1; +} + +message WriteResponse { + Resource resource = 1; +} + +message WriteStatusResponse { + Resource resource = 1; +} + +message WriteStatusRequest { + ID id = 1; + string version = 2; + string key = 3; + Condition condition = 4; + string state = 5; + repeated string messages = 6; +} + +message DeleteRequest { + ID id = 1; + string version = 2; +} + +message DeleteResponse {} + +message WatchRequest { + ID id = 1; +} + +message WatchResponse { + enum Operation { + OPERATION_UNSPECIFIED = 0; + OPERATION_UPSERT = 1; + OPERATION_DELETE = 2; + } + Operation operation = 1; + Resource resource = 2; +} diff --git a/proto-public/pbresource/resource_grpc.pb.go b/proto-public/pbresource/resource_grpc.pb.go new file mode 100644 index 00000000000..1671552aa0d --- /dev/null +++ b/proto-public/pbresource/resource_grpc.pb.go @@ -0,0 +1,311 @@ +// Code generated by protoc-gen-go-grpc. DO NOT EDIT. +// versions: +// - protoc-gen-go-grpc v1.2.0 +// - protoc (unknown) +// source: pbresource/resource.proto + +package pbresource + +import ( + context "context" + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" +) + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +// Requires gRPC-Go v1.32.0 or later. +const _ = grpc.SupportPackageIsVersion7 + +// ResourceServiceClient is the client API for ResourceService service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. +type ResourceServiceClient interface { + Read(ctx context.Context, in *ReadRequest, opts ...grpc.CallOption) (*ReadResponse, error) + Write(ctx context.Context, in *WriteRequest, opts ...grpc.CallOption) (*WriteResponse, error) + WriteStatus(ctx context.Context, in *WriteStatusRequest, opts ...grpc.CallOption) (*WriteStatusResponse, error) + List(ctx context.Context, in *ListRequest, opts ...grpc.CallOption) (*ListResponse, error) + Delete(ctx context.Context, in *DeleteRequest, opts ...grpc.CallOption) (*DeleteResponse, error) + Watch(ctx context.Context, in *WatchRequest, opts ...grpc.CallOption) (ResourceService_WatchClient, error) +} + +type resourceServiceClient struct { + cc grpc.ClientConnInterface +} + +func NewResourceServiceClient(cc grpc.ClientConnInterface) ResourceServiceClient { + return &resourceServiceClient{cc} +} + +func (c *resourceServiceClient) Read(ctx context.Context, in *ReadRequest, opts ...grpc.CallOption) (*ReadResponse, error) { + out := new(ReadResponse) + err := c.cc.Invoke(ctx, "/hashicorp.consul.resource.ResourceService/Read", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *resourceServiceClient) Write(ctx context.Context, in *WriteRequest, opts ...grpc.CallOption) (*WriteResponse, error) { + out := new(WriteResponse) + err := c.cc.Invoke(ctx, "/hashicorp.consul.resource.ResourceService/Write", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *resourceServiceClient) WriteStatus(ctx context.Context, in *WriteStatusRequest, opts ...grpc.CallOption) (*WriteStatusResponse, error) { + out := new(WriteStatusResponse) + err := c.cc.Invoke(ctx, "/hashicorp.consul.resource.ResourceService/WriteStatus", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *resourceServiceClient) List(ctx context.Context, in *ListRequest, opts ...grpc.CallOption) (*ListResponse, error) { + out := new(ListResponse) + err := c.cc.Invoke(ctx, "/hashicorp.consul.resource.ResourceService/List", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *resourceServiceClient) Delete(ctx context.Context, in *DeleteRequest, opts ...grpc.CallOption) (*DeleteResponse, error) { + out := new(DeleteResponse) + err := c.cc.Invoke(ctx, "/hashicorp.consul.resource.ResourceService/Delete", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *resourceServiceClient) Watch(ctx context.Context, in *WatchRequest, opts ...grpc.CallOption) (ResourceService_WatchClient, error) { + stream, err := c.cc.NewStream(ctx, &ResourceService_ServiceDesc.Streams[0], "/hashicorp.consul.resource.ResourceService/Watch", opts...) + if err != nil { + return nil, err + } + x := &resourceServiceWatchClient{stream} + if err := x.ClientStream.SendMsg(in); err != nil { + return nil, err + } + if err := x.ClientStream.CloseSend(); err != nil { + return nil, err + } + return x, nil +} + +type ResourceService_WatchClient interface { + Recv() (*WatchResponse, error) + grpc.ClientStream +} + +type resourceServiceWatchClient struct { + grpc.ClientStream +} + +func (x *resourceServiceWatchClient) Recv() (*WatchResponse, error) { + m := new(WatchResponse) + if err := x.ClientStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} + +// ResourceServiceServer is the server API for ResourceService service. +// All implementations should embed UnimplementedResourceServiceServer +// for forward compatibility +type ResourceServiceServer interface { + Read(context.Context, *ReadRequest) (*ReadResponse, error) + Write(context.Context, *WriteRequest) (*WriteResponse, error) + WriteStatus(context.Context, *WriteStatusRequest) (*WriteStatusResponse, error) + List(context.Context, *ListRequest) (*ListResponse, error) + Delete(context.Context, *DeleteRequest) (*DeleteResponse, error) + Watch(*WatchRequest, ResourceService_WatchServer) error +} + +// UnimplementedResourceServiceServer should be embedded to have forward compatible implementations. +type UnimplementedResourceServiceServer struct { +} + +func (UnimplementedResourceServiceServer) Read(context.Context, *ReadRequest) (*ReadResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method Read not implemented") +} +func (UnimplementedResourceServiceServer) Write(context.Context, *WriteRequest) (*WriteResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method Write not implemented") +} +func (UnimplementedResourceServiceServer) WriteStatus(context.Context, *WriteStatusRequest) (*WriteStatusResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method WriteStatus not implemented") +} +func (UnimplementedResourceServiceServer) List(context.Context, *ListRequest) (*ListResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method List not implemented") +} +func (UnimplementedResourceServiceServer) Delete(context.Context, *DeleteRequest) (*DeleteResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method Delete not implemented") +} +func (UnimplementedResourceServiceServer) Watch(*WatchRequest, ResourceService_WatchServer) error { + return status.Errorf(codes.Unimplemented, "method Watch not implemented") +} + +// UnsafeResourceServiceServer may be embedded to opt out of forward compatibility for this service. +// Use of this interface is not recommended, as added methods to ResourceServiceServer will +// result in compilation errors. +type UnsafeResourceServiceServer interface { + mustEmbedUnimplementedResourceServiceServer() +} + +func RegisterResourceServiceServer(s grpc.ServiceRegistrar, srv ResourceServiceServer) { + s.RegisterService(&ResourceService_ServiceDesc, srv) +} + +func _ResourceService_Read_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ReadRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ResourceServiceServer).Read(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/hashicorp.consul.resource.ResourceService/Read", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ResourceServiceServer).Read(ctx, req.(*ReadRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _ResourceService_Write_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(WriteRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ResourceServiceServer).Write(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/hashicorp.consul.resource.ResourceService/Write", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ResourceServiceServer).Write(ctx, req.(*WriteRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _ResourceService_WriteStatus_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(WriteStatusRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ResourceServiceServer).WriteStatus(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/hashicorp.consul.resource.ResourceService/WriteStatus", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ResourceServiceServer).WriteStatus(ctx, req.(*WriteStatusRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _ResourceService_List_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ListRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ResourceServiceServer).List(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/hashicorp.consul.resource.ResourceService/List", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ResourceServiceServer).List(ctx, req.(*ListRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _ResourceService_Delete_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(DeleteRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ResourceServiceServer).Delete(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/hashicorp.consul.resource.ResourceService/Delete", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ResourceServiceServer).Delete(ctx, req.(*DeleteRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _ResourceService_Watch_Handler(srv interface{}, stream grpc.ServerStream) error { + m := new(WatchRequest) + if err := stream.RecvMsg(m); err != nil { + return err + } + return srv.(ResourceServiceServer).Watch(m, &resourceServiceWatchServer{stream}) +} + +type ResourceService_WatchServer interface { + Send(*WatchResponse) error + grpc.ServerStream +} + +type resourceServiceWatchServer struct { + grpc.ServerStream +} + +func (x *resourceServiceWatchServer) Send(m *WatchResponse) error { + return x.ServerStream.SendMsg(m) +} + +// ResourceService_ServiceDesc is the grpc.ServiceDesc for ResourceService service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var ResourceService_ServiceDesc = grpc.ServiceDesc{ + ServiceName: "hashicorp.consul.resource.ResourceService", + HandlerType: (*ResourceServiceServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "Read", + Handler: _ResourceService_Read_Handler, + }, + { + MethodName: "Write", + Handler: _ResourceService_Write_Handler, + }, + { + MethodName: "WriteStatus", + Handler: _ResourceService_WriteStatus_Handler, + }, + { + MethodName: "List", + Handler: _ResourceService_List_Handler, + }, + { + MethodName: "Delete", + Handler: _ResourceService_Delete_Handler, + }, + }, + Streams: []grpc.StreamDesc{ + { + StreamName: "Watch", + Handler: _ResourceService_Watch_Handler, + ServerStreams: true, + }, + }, + Metadata: "pbresource/resource.proto", +} From e6aeb31a2654cdf6bb802db9f437aa37d1d3646c Mon Sep 17 00:00:00 2001 From: Tyler Wendlandt Date: Thu, 9 Mar 2023 12:43:35 -0700 Subject: [PATCH 137/262] UI: Fix htmlsafe errors throughout the app (#16574) * Upgrade ember-intl * Add changelog * Add yarn lock --- .changelog/16574.txt | 3 +++ ui/packages/consul-ui/package.json | 2 +- ui/yarn.lock | 8 ++++---- 3 files changed, 8 insertions(+), 5 deletions(-) create mode 100644 .changelog/16574.txt diff --git a/.changelog/16574.txt b/.changelog/16574.txt new file mode 100644 index 00000000000..78bfc334984 --- /dev/null +++ b/.changelog/16574.txt @@ -0,0 +1,3 @@ +```release-note:bug +ui: fix rendering issues on Overview and empty-states by addressing isHTMLSafe errors +``` diff --git a/ui/packages/consul-ui/package.json b/ui/packages/consul-ui/package.json index 5786593c178..8ecf761f132 100644 --- a/ui/packages/consul-ui/package.json +++ b/ui/packages/consul-ui/package.json @@ -134,7 +134,7 @@ "ember-export-application-global": "^2.0.1", "ember-in-viewport": "^3.8.1", "ember-inflector": "^4.0.1", - "ember-intl": "^5.5.1", + "ember-intl": "^5.7.0", "ember-load-initializers": "^2.1.2", "ember-math-helpers": "^2.4.0", "ember-maybe-import-regenerator": "^0.1.6", diff --git a/ui/yarn.lock b/ui/yarn.lock index dd29b32ed1e..0d238218fcc 100644 --- a/ui/yarn.lock +++ b/ui/yarn.lock @@ -9136,10 +9136,10 @@ ember-inflector@^4.0.2: dependencies: ember-cli-babel "^7.26.5" -ember-intl@^5.5.1: - version "5.6.2" - resolved "https://registry.yarnpkg.com/ember-intl/-/ember-intl-5.6.2.tgz#ece4820923dfda033c279b7e3920cbbc8b6bde07" - integrity sha512-+FfI2udVbnEzueompcRb3ytBWhfnBfVVjAwnCuxwqIyS9ti8lK0ZiYHa5bquNPHjjfBzfFl4x5TlVgDNaCnccg== +ember-intl@^5.7.0: + version "5.7.2" + resolved "https://registry.yarnpkg.com/ember-intl/-/ember-intl-5.7.2.tgz#76d933f974f041448b01247888bc3bcc9261e812" + integrity sha512-gs17uY1ywzMaUpx1gxfBkFQYRTWTSa/zbkL13MVtffG9aBLP+998MibytZOUxIipMtLCm4sr/g6/1aaKRr9/+g== dependencies: broccoli-caching-writer "^3.0.3" broccoli-funnel "^3.0.3" From fa93a0d4f788c0a2409a69ac5a94192b401af0f0 Mon Sep 17 00:00:00 2001 From: John Maguire Date: Thu, 9 Mar 2023 15:46:02 -0500 Subject: [PATCH 138/262] Add namespace file with build tag for OSS gateway tests (#16590) * Add namespace file with build tag for OSS tests * Remove TODO comment --- .../test/gateways/gateway_endpoint_test.go | 9 +++++---- .../test/gateways/http_route_test.go | 15 ++++++--------- .../test/gateways/namespace_oss.go | 8 ++++++++ 3 files changed, 19 insertions(+), 13 deletions(-) create mode 100644 test/integration/consul-container/test/gateways/namespace_oss.go diff --git a/test/integration/consul-container/test/gateways/gateway_endpoint_test.go b/test/integration/consul-container/test/gateways/gateway_endpoint_test.go index e088222c50c..9b0ed15bb52 100644 --- a/test/integration/consul-container/test/gateways/gateway_endpoint_test.go +++ b/test/integration/consul-container/test/gateways/gateway_endpoint_test.go @@ -83,10 +83,11 @@ func TestAPIGatewayCreate(t *testing.T) { // Create a client proxy instance with the server as an upstream _, gatewayService := createServices(t, cluster, listenerPortOne) - //make sure the gateway/route come online - //make sure config entries have been properly created - checkGatewayConfigEntry(t, client, "api-gateway", "") - checkTCPRouteConfigEntry(t, client, "api-gateway-route", "") + // make sure the gateway/route come online + // make sure config entries have been properly created + namespace := getNamespace() + checkGatewayConfigEntry(t, client, "api-gateway", namespace) + checkTCPRouteConfigEntry(t, client, "api-gateway-route", namespace) port, err := gatewayService.GetPort(listenerPortOne) require.NoError(t, err) diff --git a/test/integration/consul-container/test/gateways/http_route_test.go b/test/integration/consul-container/test/gateways/http_route_test.go index ef05f8c3f0b..f0f9586887b 100644 --- a/test/integration/consul-container/test/gateways/http_route_test.go +++ b/test/integration/consul-container/test/gateways/http_route_test.go @@ -5,21 +5,19 @@ import ( "crypto/rand" "encoding/hex" "fmt" + "testing" + "time" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "github.com/hashicorp/consul/api" libassert "github.com/hashicorp/consul/test/integration/consul-container/libs/assert" libcluster "github.com/hashicorp/consul/test/integration/consul-container/libs/cluster" libservice "github.com/hashicorp/consul/test/integration/consul-container/libs/service" libtopology "github.com/hashicorp/consul/test/integration/consul-container/libs/topology" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" - "testing" - "time" ) -func getNamespace() string { - return "" -} - // randomName generates a random name of n length with the provided // prefix. If prefix is omitted, the then entire name is random char. func randomName(prefix string, n int) string { @@ -80,7 +78,6 @@ func TestHTTPRouteFlattening(t *testing.T) { }, ) - //TODO this should only matter in consul enterprise I believe? namespace := getNamespace() gatewayName := randomName("gw", 16) routeOneName := randomName("route", 16) diff --git a/test/integration/consul-container/test/gateways/namespace_oss.go b/test/integration/consul-container/test/gateways/namespace_oss.go new file mode 100644 index 00000000000..3867e72987b --- /dev/null +++ b/test/integration/consul-container/test/gateways/namespace_oss.go @@ -0,0 +1,8 @@ +//go:build !consulent +// +build !consulent + +package gateways + +func getNamespace() string { + return "" +} From 40312ac072fda2e5a9fc37d6ae8141ad23cbcbae Mon Sep 17 00:00:00 2001 From: David Yu Date: Thu, 9 Mar 2023 14:29:39 -0800 Subject: [PATCH 139/262] JIRA pr check: Filter out OSS/ENT merges (#16593) * jira pr check filter out dependabot and oss/ent merges --- .github/workflows/jira-pr.yaml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.github/workflows/jira-pr.yaml b/.github/workflows/jira-pr.yaml index 17b7d26b1ff..be8eb77865b 100644 --- a/.github/workflows/jira-pr.yaml +++ b/.github/workflows/jira-pr.yaml @@ -41,6 +41,12 @@ jobs: if [[ -n ${ROLE} ]]; then echo "Actor ${{ github.actor }} is a ${TEAM} team member" echo "MESSAGE=true" >> $GITHUB_OUTPUT + elif [[ "${{ contains(github.actor, 'hc-github-team-consul-core') }}" == "true" ]]; then + echo "Actor ${{ github.actor }} is a ${TEAM} team member" + echo "MESSAGE=true" >> $GITHUB_OUTPUT + elif [[ "${{ contains(github.actor, 'dependabot') }}" == "true" ]]; then + echo "Actor ${{ github.actor }} is a ${TEAM} team member" + echo "MESSAGE=true" >> $GITHUB_OUTPUT else echo "Actor ${{ github.actor }} is NOT a ${TEAM} team member" echo "MESSAGE=false" >> $GITHUB_OUTPUT From 57e24934151e61146b955c3f53fdfb954bc52ed2 Mon Sep 17 00:00:00 2001 From: Eric Haberkorn Date: Fri, 10 Mar 2023 09:36:15 -0500 Subject: [PATCH 140/262] allow setting locality on services and nodes (#16581) --- agent/agent.go | 1 + agent/agent_endpoint.go | 1 + agent/agent_test.go | 1 + agent/config/config.go | 2 +- agent/config/runtime.go | 10 +- agent/config/runtime_test.go | 2 +- .../TestRuntimeConfig_Sanitize.golden | 1 + agent/consul/config.go | 2 +- agent/consul/leader_peering.go | 3 +- agent/consul/leader_peering_test.go | 9 +- agent/consul/state/catalog.go | 1 + agent/consul/state/catalog_test.go | 23 +- agent/consul/state/peering_test.go | 19 +- agent/local/state.go | 3 + agent/local/state_test.go | 10 +- agent/rpc/peering/service.go | 5 +- agent/structs/peering.go | 2 +- agent/structs/service_definition.go | 2 + agent/structs/structs.deepcopy.go | 12 + agent/structs/structs.go | 23 +- api/agent.go | 4 +- api/agent_test.go | 11 +- api/api_test.go | 16 +- api/catalog.go | 7 +- api/catalog_test.go | 10 +- api/peering.go | 2 +- proto/private/pbcommon/common.gen.go | 14 + proto/private/pbcommon/common.go | 30 + proto/private/pbcommon/common.pb.binary.go | 10 + proto/private/pbcommon/common.pb.go | 145 +- proto/private/pbcommon/common.proto | 13 + proto/private/pbpeering/peering.gen.go | 24 +- proto/private/pbpeering/peering.go | 53 +- proto/private/pbpeering/peering.pb.binary.go | 10 - proto/private/pbpeering/peering.pb.go | 1250 ++++++++--------- proto/private/pbpeering/peering.proto | 17 +- proto/private/pbservice/convert.go | 22 + proto/private/pbservice/node.gen.go | 4 + proto/private/pbservice/node.pb.go | 196 +-- proto/private/pbservice/node.proto | 7 + proto/private/pbservice/service.gen.go | 2 + proto/private/pbservice/service.pb.go | 106 +- proto/private/pbservice/service.proto | 4 + sdk/testutil/server.go | 7 + 44 files changed, 1169 insertions(+), 927 deletions(-) diff --git a/agent/agent.go b/agent/agent.go index dd073dcab06..aa8422bdc23 100644 --- a/agent/agent.go +++ b/agent/agent.go @@ -532,6 +532,7 @@ func LocalConfig(cfg *config.RuntimeConfig) local.Config { DiscardCheckOutput: cfg.DiscardCheckOutput, NodeID: cfg.NodeID, NodeName: cfg.NodeName, + NodeLocality: cfg.StructLocality(), Partition: cfg.PartitionOrDefault(), TaggedAddresses: map[string]string{}, } diff --git a/agent/agent_endpoint.go b/agent/agent_endpoint.go index c8c78f7d79d..5f9d82cd446 100644 --- a/agent/agent_endpoint.go +++ b/agent/agent_endpoint.go @@ -304,6 +304,7 @@ func buildAgentService(s *structs.NodeService, dc string) api.AgentService { ModifyIndex: s.ModifyIndex, Weights: weights, Datacenter: dc, + Locality: s.Locality.ToAPI(), } if as.Tags == nil { diff --git a/agent/agent_test.go b/agent/agent_test.go index ad2be987b5f..90e14c795f4 100644 --- a/agent/agent_test.go +++ b/agent/agent_test.go @@ -443,6 +443,7 @@ func testAgent_AddService(t *testing.T, extraHCL string) { Tags: []string{"tag1"}, Weights: nil, // nil weights... Port: 8100, + Locality: &structs.Locality{Region: "us-west-1", Zone: "us-west-1a"}, EnterpriseMeta: *structs.DefaultEnterpriseMetaInDefaultPartition(), }, // ... should be populated to avoid "IsSame" returning true during AE. diff --git a/agent/config/config.go b/agent/config/config.go index 849cbbd9140..7278e4f9164 100644 --- a/agent/config/config.go +++ b/agent/config/config.go @@ -186,7 +186,7 @@ type Config struct { LeaveOnTerm *bool `mapstructure:"leave_on_terminate" json:"leave_on_terminate,omitempty"` LicensePath *string `mapstructure:"license_path" json:"license_path,omitempty"` Limits Limits `mapstructure:"limits" json:"-"` - Locality Locality `mapstructure:"locality" json:"-"` + Locality *Locality `mapstructure:"locality" json:"-"` LogLevel *string `mapstructure:"log_level" json:"log_level,omitempty"` LogJSON *bool `mapstructure:"log_json" json:"log_json,omitempty"` LogFile *string `mapstructure:"log_file" json:"log_file,omitempty"` diff --git a/agent/config/runtime.go b/agent/config/runtime.go index fb0c34d8379..e8616759f2a 100644 --- a/agent/config/runtime.go +++ b/agent/config/runtime.go @@ -796,7 +796,7 @@ type RuntimeConfig struct { // hcl: leave_on_terminate = (true|false) LeaveOnTerm bool - Locality Locality + Locality *Locality // Logging configuration used to initialize agent logging. Logging logging.Config @@ -1715,8 +1715,12 @@ func (c *RuntimeConfig) VersionWithMetadata() string { return version } -func (c *RuntimeConfig) StructLocality() structs.Locality { - return structs.Locality{ +// StructLocality converts the RuntimeConfig Locality to a struct Locality. +func (c *RuntimeConfig) StructLocality() *structs.Locality { + if c.Locality == nil { + return nil + } + return &structs.Locality{ Region: stringVal(c.Locality.Region), Zone: stringVal(c.Locality.Zone), } diff --git a/agent/config/runtime_test.go b/agent/config/runtime_test.go index 52d6b9efc82..c892fe38d76 100644 --- a/agent/config/runtime_test.go +++ b/agent/config/runtime_test.go @@ -7092,7 +7092,7 @@ func TestRuntimeConfig_Sanitize(t *testing.T) { }, }, }, - Locality: Locality{Region: strPtr("us-west-1"), Zone: strPtr("us-west-1a")}, + Locality: &Locality{Region: strPtr("us-west-1"), Zone: strPtr("us-west-1a")}, } b, err := json.MarshalIndent(rt.Sanitized(), "", " ") diff --git a/agent/config/testdata/TestRuntimeConfig_Sanitize.golden b/agent/config/testdata/TestRuntimeConfig_Sanitize.golden index 24d626bf4aa..48d760c706e 100644 --- a/agent/config/testdata/TestRuntimeConfig_Sanitize.golden +++ b/agent/config/testdata/TestRuntimeConfig_Sanitize.golden @@ -371,6 +371,7 @@ "EnterpriseMeta": {}, "ID": "", "Kind": "", + "Locality": null, "Meta": {}, "Name": "foo", "Port": 0, diff --git a/agent/consul/config.go b/agent/consul/config.go index 446da01ffaa..1ba42c129c6 100644 --- a/agent/consul/config.go +++ b/agent/consul/config.go @@ -436,7 +436,7 @@ type Config struct { PeeringTestAllowPeerRegistrations bool - Locality structs.Locality + Locality *structs.Locality // Embedded Consul Enterprise specific configuration *EnterpriseConfig diff --git a/agent/consul/leader_peering.go b/agent/consul/leader_peering.go index fa87ce8b076..713ef42cf15 100644 --- a/agent/consul/leader_peering.go +++ b/agent/consul/leader_peering.go @@ -27,6 +27,7 @@ import ( "github.com/hashicorp/consul/agent/structs" "github.com/hashicorp/consul/api" "github.com/hashicorp/consul/logging" + "github.com/hashicorp/consul/proto/private/pbcommon" "github.com/hashicorp/consul/proto/private/pbpeering" "github.com/hashicorp/consul/proto/private/pbpeerstream" ) @@ -385,7 +386,7 @@ func (s *Server) establishStream(ctx context.Context, Remote: &pbpeering.RemoteInfo{ Partition: peer.Partition, Datacenter: s.config.Datacenter, - Locality: pbpeering.LocalityFromStruct(s.config.Locality), + Locality: pbcommon.LocalityToProto(s.config.Locality), }, }, }, diff --git a/agent/consul/leader_peering_test.go b/agent/consul/leader_peering_test.go index 9e960de3075..f8d9127d6bf 100644 --- a/agent/consul/leader_peering_test.go +++ b/agent/consul/leader_peering_test.go @@ -28,6 +28,7 @@ import ( "github.com/hashicorp/consul/agent/consul/state" "github.com/hashicorp/consul/agent/structs" "github.com/hashicorp/consul/api" + "github.com/hashicorp/consul/proto/private/pbcommon" "github.com/hashicorp/consul/proto/private/pbpeering" "github.com/hashicorp/consul/sdk/freeport" "github.com/hashicorp/consul/sdk/testutil" @@ -661,7 +662,7 @@ func TestLeader_Peering_RemoteInfo(t *testing.T) { t.Skip("too slow for testing.Short") } - acceptorLocality := structs.Locality{ + acceptorLocality := &structs.Locality{ Region: "us-west-2", Zone: "us-west-2a", } @@ -689,7 +690,7 @@ func TestLeader_Peering_RemoteInfo(t *testing.T) { ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second) t.Cleanup(cancel) - dialerLocality := structs.Locality{ + dialerLocality := &structs.Locality{ Region: "us-west-1", Zone: "us-west-1a", } @@ -755,7 +756,7 @@ func TestLeader_Peering_RemoteInfo(t *testing.T) { require.NoError(t, err) require.Equal(t, "dc1", p.Peering.Remote.Datacenter) require.Contains(t, []string{"", "default"}, p.Peering.Remote.Partition) - require.Equal(t, pbpeering.LocalityFromStruct(acceptorLocality), p.Peering.Remote.Locality) + require.Equal(t, pbcommon.LocalityToProto(acceptorLocality), p.Peering.Remote.Locality) // Retry fetching the until the peering is active in the acceptor. ctx, cancel = context.WithTimeout(context.Background(), 10*time.Second) @@ -771,7 +772,7 @@ func TestLeader_Peering_RemoteInfo(t *testing.T) { require.NotNil(t, p) require.Equal(t, "dc2", p.Peering.Remote.Datacenter) require.Contains(t, []string{"", "default"}, p.Peering.Remote.Partition) - require.Equal(t, pbpeering.LocalityFromStruct(dialerLocality), p.Peering.Remote.Locality) + require.Equal(t, pbcommon.LocalityToProto(dialerLocality), p.Peering.Remote.Locality) } // Test that the dialing peer attempts to reestablish connections when the accepting peer diff --git a/agent/consul/state/catalog.go b/agent/consul/state/catalog.go index 077fbde79a8..fdda21d723a 100644 --- a/agent/consul/state/catalog.go +++ b/agent/consul/state/catalog.go @@ -197,6 +197,7 @@ func (s *Store) ensureRegistrationTxn(tx WriteTxn, idx uint64, preserveIndexes b TaggedAddresses: req.TaggedAddresses, Meta: req.NodeMeta, PeerName: req.PeerName, + Locality: req.Locality, } if preserveIndexes { node.CreateIndex = req.CreateIndex diff --git a/agent/consul/state/catalog_test.go b/agent/consul/state/catalog_test.go index b5976bbd2b0..969990d83b5 100644 --- a/agent/consul/state/catalog_test.go +++ b/agent/consul/state/catalog_test.go @@ -39,21 +39,21 @@ func TestStateStore_GetNodeID(t *testing.T) { _, out, err := s.GetNodeID(types.NodeID("wrongId"), nil, "") if err == nil || out != nil || !strings.Contains(err.Error(), "node lookup by ID failed: index error: UUID (without hyphens) must be") { - t.Errorf("want an error, nil value, err:=%q ; out:=%q", err.Error(), out) + t.Errorf("want an error, nil value, err:=%q ; out:=%+v", err.Error(), out) } _, out, err = s.GetNodeID(types.NodeID("0123456789abcdefghijklmnopqrstuvwxyz"), nil, "") if err == nil || out != nil || !strings.Contains(err.Error(), "node lookup by ID failed: index error: invalid UUID") { - t.Errorf("want an error, nil value, err:=%q ; out:=%q", err, out) + t.Errorf("want an error, nil value, err:=%q ; out:=%+v", err, out) } _, out, err = s.GetNodeID(types.NodeID("00a916bc-a357-4a19-b886-59419fcee50Z"), nil, "") if err == nil || out != nil || !strings.Contains(err.Error(), "node lookup by ID failed: index error: invalid UUID") { - t.Errorf("want an error, nil value, err:=%q ; out:=%q", err, out) + t.Errorf("want an error, nil value, err:=%q ; out:=%+v", err, out) } _, out, err = s.GetNodeID(types.NodeID("00a916bc-a357-4a19-b886-59419fcee506"), nil, "") if err != nil || out != nil { - t.Errorf("do not want any error nor returned value, err:=%q ; out:=%q", err, out) + t.Errorf("do not want any error nor returned value, err:=%q ; out:=%+v", err, out) } nodeID := types.NodeID("00a916bc-a357-4a19-b886-59419fceeaaa") @@ -219,6 +219,7 @@ func TestStateStore_EnsureRegistration(t *testing.T) { TaggedAddresses: map[string]string{"hello": "world"}, NodeMeta: map[string]string{"somekey": "somevalue"}, PeerName: peerName, + Locality: &structs.Locality{Region: "us-west-1", Zone: "us-west-1a"}, } if f != nil { f(req) @@ -236,6 +237,7 @@ func TestStateStore_EnsureRegistration(t *testing.T) { Meta: map[string]string{"somekey": "somevalue"}, RaftIndex: structs.RaftIndex{CreateIndex: 1, ModifyIndex: 1}, PeerName: peerName, + Locality: &structs.Locality{Region: "us-west-1", Zone: "us-west-1a"}, } _, out, err := s.GetNode("node1", nil, peerName) @@ -259,6 +261,7 @@ func TestStateStore_EnsureRegistration(t *testing.T) { RaftIndex: structs.RaftIndex{CreateIndex: 2, ModifyIndex: 2}, EnterpriseMeta: *structs.DefaultEnterpriseMetaInDefaultPartition(), PeerName: peerName, + Locality: &structs.Locality{Region: "us-west-1", Zone: "us-west-1a"}, }, } @@ -368,6 +371,7 @@ func TestStateStore_EnsureRegistration(t *testing.T) { Meta: map[string]string{strings.Repeat("a", 129): "somevalue"}, Tags: []string{"primary"}, PeerName: peerName, + Locality: &structs.Locality{Region: "us-west-1", Zone: "us-west-1a"}, } }) testutil.RequireErrorContains(t, s.EnsureRegistration(9, req), `Key is too long (limit: 128 characters)`) @@ -384,6 +388,7 @@ func TestStateStore_EnsureRegistration(t *testing.T) { Tags: []string{"primary"}, Weights: &structs.Weights{Passing: 1, Warning: 1}, PeerName: peerName, + Locality: &structs.Locality{Region: "us-west-1", Zone: "us-west-1a"}, } }) require.NoError(t, s.EnsureRegistration(2, req)) @@ -404,6 +409,7 @@ func TestStateStore_EnsureRegistration(t *testing.T) { Tags: []string{"primary"}, Weights: &structs.Weights{Passing: 1, Warning: 1}, PeerName: peerName, + Locality: &structs.Locality{Region: "us-west-1", Zone: "us-west-1a"}, } req.Check = &structs.HealthCheck{ Node: "node1", @@ -432,6 +438,7 @@ func TestStateStore_EnsureRegistration(t *testing.T) { Tags: []string{"primary"}, Weights: &structs.Weights{Passing: 1, Warning: 1}, PeerName: peerName, + Locality: &structs.Locality{Region: "us-west-1", Zone: "us-west-1a"}, } req.Check = &structs.HealthCheck{ Node: "node1", @@ -939,7 +946,7 @@ func TestNodeRenamingNodes(t *testing.T) { } if _, node, err := s.GetNodeID(nodeID1, nil, ""); err != nil || node == nil || node.ID != nodeID1 { - t.Fatalf("err: %s, node:= %q", err, node) + t.Fatalf("err: %s, node:= %+v", err, node) } if _, node, err := s.GetNodeID(nodeID2, nil, ""); err != nil && node == nil || node.ID != nodeID2 { @@ -1121,7 +1128,7 @@ func TestStateStore_EnsureNode(t *testing.T) { _, out, err = s.GetNode("node1", nil, "") require.NoError(t, err) if out != nil { - t.Fatalf("Node should not exist anymore: %q", out) + t.Fatalf("Node should not exist anymore: %+v", out) } idx, out, err = s.GetNode("node1-renamed", nil, "") @@ -1277,10 +1284,10 @@ func TestStateStore_EnsureNode(t *testing.T) { t.Fatalf("[DEPRECATED] err: %s", err) } if out.CreateIndex != 10 { - t.Fatalf("[DEPRECATED] We expected to modify node previously added, but add index = %d for node %q", out.CreateIndex, out) + t.Fatalf("[DEPRECATED] We expected to modify node previously added, but add index = %d for node %+v", out.CreateIndex, out) } if out.Address != "1.1.1.66" || out.ModifyIndex != 15 { - t.Fatalf("[DEPRECATED] Node with newNodeID should have been updated, but was: %d with content := %q", out.CreateIndex, out) + t.Fatalf("[DEPRECATED] Node with newNodeID should have been updated, but was: %d with content := %+v", out.CreateIndex, out) } } diff --git a/agent/consul/state/peering_test.go b/agent/consul/state/peering_test.go index 3d5a2a2a9c4..daa1de995f0 100644 --- a/agent/consul/state/peering_test.go +++ b/agent/consul/state/peering_test.go @@ -11,6 +11,7 @@ import ( "github.com/hashicorp/consul/acl" "github.com/hashicorp/consul/agent/connect" "github.com/hashicorp/consul/agent/structs" + "github.com/hashicorp/consul/proto/private/pbcommon" "github.com/hashicorp/consul/proto/private/pbpeering" "github.com/hashicorp/consul/proto/private/prototest" "github.com/hashicorp/consul/sdk/testutil" @@ -1261,7 +1262,7 @@ func TestStore_PeeringWrite(t *testing.T) { Remote: &pbpeering.RemoteInfo{ Partition: "part1", Datacenter: "datacenter1", - Locality: &pbpeering.Locality{ + Locality: &pbcommon.Locality{ Region: "us-west-1", Zone: "us-west-1a", }, @@ -1276,7 +1277,7 @@ func TestStore_PeeringWrite(t *testing.T) { Remote: &pbpeering.RemoteInfo{ Partition: "part1", Datacenter: "datacenter1", - Locality: &pbpeering.Locality{ + Locality: &pbcommon.Locality{ Region: "us-west-1", Zone: "us-west-1a", }, @@ -1311,7 +1312,7 @@ func TestStore_PeeringWrite(t *testing.T) { Remote: &pbpeering.RemoteInfo{ Partition: "part1", Datacenter: "datacenter1", - Locality: &pbpeering.Locality{ + Locality: &pbcommon.Locality{ Region: "us-west-1", Zone: "us-west-1a", }, @@ -1344,7 +1345,7 @@ func TestStore_PeeringWrite(t *testing.T) { Remote: &pbpeering.RemoteInfo{ Partition: "part1", Datacenter: "datacenter1", - Locality: &pbpeering.Locality{ + Locality: &pbcommon.Locality{ Region: "us-west-1", Zone: "us-west-1a", }, @@ -1377,7 +1378,7 @@ func TestStore_PeeringWrite(t *testing.T) { Remote: &pbpeering.RemoteInfo{ Partition: "part1", Datacenter: "datacenter1", - Locality: &pbpeering.Locality{ + Locality: &pbcommon.Locality{ Region: "us-west-1", Zone: "us-west-1a", }, @@ -1409,7 +1410,7 @@ func TestStore_PeeringWrite(t *testing.T) { Remote: &pbpeering.RemoteInfo{ Partition: "part1", Datacenter: "datacenter1", - Locality: &pbpeering.Locality{ + Locality: &pbcommon.Locality{ Region: "us-west-1", Zone: "us-west-1a", }, @@ -1440,7 +1441,7 @@ func TestStore_PeeringWrite(t *testing.T) { Remote: &pbpeering.RemoteInfo{ Partition: "part1", Datacenter: "datacenter1", - Locality: &pbpeering.Locality{ + Locality: &pbcommon.Locality{ Region: "us-west-1", Zone: "us-west-1a", }, @@ -1471,7 +1472,7 @@ func TestStore_PeeringWrite(t *testing.T) { Remote: &pbpeering.RemoteInfo{ Partition: "part1", Datacenter: "datacenter1", - Locality: &pbpeering.Locality{ + Locality: &pbcommon.Locality{ Region: "us-west-1", Zone: "us-west-1a", }, @@ -1501,7 +1502,7 @@ func TestStore_PeeringWrite(t *testing.T) { Remote: &pbpeering.RemoteInfo{ Partition: "part1", Datacenter: "datacenter1", - Locality: &pbpeering.Locality{ + Locality: &pbcommon.Locality{ Region: "us-west-1", Zone: "us-west-1a", }, diff --git a/agent/local/state.go b/agent/local/state.go index d3ffa1e023e..3ef1725dad6 100644 --- a/agent/local/state.go +++ b/agent/local/state.go @@ -59,6 +59,7 @@ type Config struct { DiscardCheckOutput bool NodeID types.NodeID NodeName string + NodeLocality *structs.Locality Partition string // this defaults if empty TaggedAddresses map[string]string } @@ -1073,6 +1074,7 @@ func (l *State) updateSyncState() error { // Check if node info needs syncing if svcNode == nil || svcNode.ID != l.config.NodeID || !reflect.DeepEqual(svcNode.TaggedAddresses, l.config.TaggedAddresses) || + !reflect.DeepEqual(svcNode.Locality, l.config.NodeLocality) || !reflect.DeepEqual(svcNode.Meta, l.metadata) { l.nodeInfoInSync = false } @@ -1565,6 +1567,7 @@ func (l *State) syncNodeInfo() error { Node: l.config.NodeName, Address: l.config.AdvertiseAddr, TaggedAddresses: l.config.TaggedAddresses, + Locality: l.config.NodeLocality, NodeMeta: l.metadata, EnterpriseMeta: l.agentEnterpriseMeta, WriteRequest: structs.WriteRequest{Token: at}, diff --git a/agent/local/state_test.go b/agent/local/state_test.go index 6052fa4784d..52f24d8b29c 100644 --- a/agent/local/state_test.go +++ b/agent/local/state_test.go @@ -1974,6 +1974,10 @@ func TestAgentAntiEntropy_NodeInfo(t *testing.T) { node_id = "40e4a748-2192-161a-0510-9bf59fe950b5" node_meta { somekey = "somevalue" + } + locality { + region = "us-west-1" + zone = "us-west-1a" }`} if err := a.Start(t); err != nil { t.Fatal(err) @@ -2008,10 +2012,12 @@ func TestAgentAntiEntropy_NodeInfo(t *testing.T) { id := services.NodeServices.Node.ID addrs := services.NodeServices.Node.TaggedAddresses meta := services.NodeServices.Node.Meta + nodeLocality := services.NodeServices.Node.Locality delete(meta, structs.MetaSegmentKey) // Added later, not in config. require.Equal(t, a.Config.NodeID, id) require.Equal(t, a.Config.TaggedAddresses, addrs) - assert.Equal(t, unNilMap(a.Config.NodeMeta), meta) + require.Equal(t, a.Config.StructLocality(), nodeLocality) + require.Equal(t, unNilMap(a.Config.NodeMeta), meta) // Blow away the catalog version of the node info if err := a.RPC(context.Background(), "Catalog.Register", args, &out); err != nil { @@ -2031,9 +2037,11 @@ func TestAgentAntiEntropy_NodeInfo(t *testing.T) { id := services.NodeServices.Node.ID addrs := services.NodeServices.Node.TaggedAddresses meta := services.NodeServices.Node.Meta + nodeLocality := services.NodeServices.Node.Locality delete(meta, structs.MetaSegmentKey) // Added later, not in config. require.Equal(t, nodeID, id) require.Equal(t, a.Config.TaggedAddresses, addrs) + require.Equal(t, a.Config.StructLocality(), nodeLocality) require.Equal(t, nodeMeta, meta) } } diff --git a/agent/rpc/peering/service.go b/agent/rpc/peering/service.go index 91cab013232..ea473a74249 100644 --- a/agent/rpc/peering/service.go +++ b/agent/rpc/peering/service.go @@ -28,6 +28,7 @@ import ( "github.com/hashicorp/consul/agent/grpc-external/services/peerstream" "github.com/hashicorp/consul/agent/structs" "github.com/hashicorp/consul/lib" + "github.com/hashicorp/consul/proto/private/pbcommon" "github.com/hashicorp/consul/proto/private/pbpeering" "github.com/hashicorp/consul/proto/private/pbpeerstream" ) @@ -87,7 +88,7 @@ type Config struct { Datacenter string ConnectEnabled bool PeeringEnabled bool - Locality structs.Locality + Locality *structs.Locality } func NewServer(cfg Config) *Server { @@ -447,7 +448,7 @@ func (s *Server) Establish( Remote: &pbpeering.RemoteInfo{ Partition: tok.Remote.Partition, Datacenter: tok.Remote.Datacenter, - Locality: pbpeering.LocalityFromStruct(tok.Remote.Locality), + Locality: pbcommon.LocalityToProto(tok.Remote.Locality), }, } diff --git a/agent/structs/peering.go b/agent/structs/peering.go index 96fd049cb40..8e34987f6dc 100644 --- a/agent/structs/peering.go +++ b/agent/structs/peering.go @@ -14,7 +14,7 @@ type PeeringToken struct { type PeeringTokenRemote struct { Partition string Datacenter string - Locality Locality + Locality *Locality } type IndexedExportedServiceList struct { diff --git a/agent/structs/service_definition.go b/agent/structs/service_definition.go index d506c15f984..0be59596aa3 100644 --- a/agent/structs/service_definition.go +++ b/agent/structs/service_definition.go @@ -26,6 +26,7 @@ type ServiceDefinition struct { Weights *Weights Token string EnableTagOverride bool + Locality *Locality // Proxy is the configuration set for Kind = connect-proxy. It is mandatory in // that case and an error to be set for any other kind. This config is part of @@ -76,6 +77,7 @@ func (s *ServiceDefinition) NodeService() *NodeService { Weights: s.Weights, EnableTagOverride: s.EnableTagOverride, EnterpriseMeta: s.EnterpriseMeta, + Locality: s.Locality, } ns.EnterpriseMeta.Normalize() diff --git a/agent/structs/structs.deepcopy.go b/agent/structs/structs.deepcopy.go index 3adcdaa8a7e..72a7a464a69 100644 --- a/agent/structs/structs.deepcopy.go +++ b/agent/structs/structs.deepcopy.go @@ -642,6 +642,10 @@ func (o *Node) DeepCopy() *Node { cp.Meta[k2] = v2 } } + if o.Locality != nil { + cp.Locality = new(Locality) + *cp.Locality = *o.Locality + } return &cp } @@ -668,6 +672,10 @@ func (o *NodeService) DeepCopy() *NodeService { cp.Weights = new(Weights) *cp.Weights = *o.Weights } + if o.Locality != nil { + cp.Locality = new(Locality) + *cp.Locality = *o.Locality + } { retV := o.Proxy.DeepCopy() cp.Proxy = *retV @@ -842,6 +850,10 @@ func (o *ServiceDefinition) DeepCopy() *ServiceDefinition { cp.Weights = new(Weights) *cp.Weights = *o.Weights } + if o.Locality != nil { + cp.Locality = new(Locality) + *cp.Locality = *o.Locality + } if o.Proxy != nil { cp.Proxy = o.Proxy.DeepCopy() } diff --git a/agent/structs/structs.go b/agent/structs/structs.go index 9d752a383d5..49e0787217c 100644 --- a/agent/structs/structs.go +++ b/agent/structs/structs.go @@ -462,6 +462,7 @@ type RegisterRequest struct { Service *NodeService Check *HealthCheck Checks HealthChecks + Locality *Locality // SkipNodeUpdate can be used when a register request is intended for // updating a service and/or checks, but doesn't want to overwrite any @@ -506,7 +507,8 @@ func (r *RegisterRequest) ChangesNode(node *Node) bool { r.Address != node.Address || r.Datacenter != node.Datacenter || !reflect.DeepEqual(r.TaggedAddresses, node.TaggedAddresses) || - !reflect.DeepEqual(r.NodeMeta, node.Meta) { + !reflect.DeepEqual(r.NodeMeta, node.Meta) || + !reflect.DeepEqual(r.Locality, node.Locality) { return true } @@ -875,6 +877,7 @@ type Node struct { PeerName string `json:",omitempty"` TaggedAddresses map[string]string Meta map[string]string + Locality *Locality `json:",omitempty" bexpr:"-"` RaftIndex `bexpr:"-"` } @@ -1045,6 +1048,7 @@ type ServiceNode struct { ServiceEnableTagOverride bool ServiceProxy ConnectProxyConfig ServiceConnect ServiceConnect + ServiceLocality *Locality `bexpr:"-"` // If not empty, PeerName represents the peer that this ServiceNode was imported from. PeerName string `json:",omitempty"` @@ -1103,6 +1107,7 @@ func (s *ServiceNode) PartialClone() *ServiceNode { ServiceEnableTagOverride: s.ServiceEnableTagOverride, ServiceProxy: s.ServiceProxy, ServiceConnect: s.ServiceConnect, + ServiceLocality: s.ServiceLocality, RaftIndex: RaftIndex{ CreateIndex: s.CreateIndex, ModifyIndex: s.ModifyIndex, @@ -1130,6 +1135,7 @@ func (s *ServiceNode) ToNodeService() *NodeService { Connect: s.ServiceConnect, PeerName: s.PeerName, EnterpriseMeta: s.EnterpriseMeta, + Locality: s.ServiceLocality, RaftIndex: RaftIndex{ CreateIndex: s.CreateIndex, ModifyIndex: s.ModifyIndex, @@ -1274,6 +1280,7 @@ type NodeService struct { SocketPath string `json:",omitempty"` // TODO This might be integrated into Address somehow, but not sure about the ergonomics. Only one of (address,port) or socketpath can be defined. Weights *Weights EnableTagOverride bool + Locality *Locality `json:",omitempty" bexpr:"-"` // Proxy is the configuration set for Kind = connect-proxy. It is mandatory in // that case and an error to be set for any other kind. This config is part of @@ -1656,6 +1663,7 @@ func (s *NodeService) IsSame(other *NodeService) bool { !reflect.DeepEqual(s.TaggedAddresses, other.TaggedAddresses) || !reflect.DeepEqual(s.Weights, other.Weights) || !reflect.DeepEqual(s.Meta, other.Meta) || + !reflect.DeepEqual(s.Locality, other.Locality) || s.EnableTagOverride != other.EnableTagOverride || s.Kind != other.Kind || !reflect.DeepEqual(s.Proxy, other.Proxy) || @@ -1731,6 +1739,7 @@ func (s *NodeService) ToServiceNode(node string) *ServiceNode { ServiceEnableTagOverride: s.EnableTagOverride, ServiceProxy: s.Proxy, ServiceConnect: s.Connect, + ServiceLocality: s.Locality, EnterpriseMeta: s.EnterpriseMeta, PeerName: s.PeerName, RaftIndex: RaftIndex{ @@ -3034,3 +3043,15 @@ type Locality struct { // Zone is the zone the entity is running in. Zone string `json:",omitempty"` } + +// ToAPI converts a struct Locality to an API Locality. +func (l *Locality) ToAPI() *api.Locality { + if l == nil { + return nil + } + + return &api.Locality{ + Region: l.Region, + Zone: l.Zone, + } +} diff --git a/api/agent.go b/api/agent.go index 7904e7b71f7..f049afa51dd 100644 --- a/api/agent.go +++ b/api/agent.go @@ -104,7 +104,8 @@ type AgentService struct { Namespace string `json:",omitempty" bexpr:"-" hash:"ignore"` Partition string `json:",omitempty" bexpr:"-" hash:"ignore"` // Datacenter is only ever returned and is ignored if presented. - Datacenter string `json:",omitempty" bexpr:"-" hash:"ignore"` + Datacenter string `json:",omitempty" bexpr:"-" hash:"ignore"` + Locality *Locality `json:",omitempty" bexpr:"-" hash:"ignore"` } // AgentServiceChecksInfo returns information about a Service and its checks @@ -291,6 +292,7 @@ type AgentServiceRegistration struct { Connect *AgentServiceConnect `json:",omitempty"` Namespace string `json:",omitempty" bexpr:"-" hash:"ignore"` Partition string `json:",omitempty" bexpr:"-" hash:"ignore"` + Locality *Locality `json:",omitempty" bexpr:"-" hash:"ignore"` } // ServiceRegisterOpts is used to pass extra options to the service register. diff --git a/api/agent_test.go b/api/agent_test.go index 4f78d39ad07..72196a1fec0 100644 --- a/api/agent_test.go +++ b/api/agent_test.go @@ -178,7 +178,7 @@ func TestAPI_AgentServiceAndReplaceChecks(t *testing.T) { agent := c.Agent() s.WaitForSerfCheck(t) - + locality := &Locality{Region: "us-west-1", Zone: "us-west-1a"} reg := &AgentServiceRegistration{ Name: "foo", ID: "foo", @@ -193,6 +193,7 @@ func TestAPI_AgentServiceAndReplaceChecks(t *testing.T) { Check: &AgentServiceCheck{ TTL: "15s", }, + Locality: locality, } regupdate := &AgentServiceRegistration{ @@ -205,7 +206,8 @@ func TestAPI_AgentServiceAndReplaceChecks(t *testing.T) { Port: 80, }, }, - Port: 9000, + Port: 9000, + Locality: locality, } if err := agent.ServiceRegister(reg); err != nil { @@ -241,12 +243,14 @@ func TestAPI_AgentServiceAndReplaceChecks(t *testing.T) { require.NotNil(t, out) require.Equal(t, HealthPassing, state) require.Equal(t, 9000, out.Service.Port) + require.Equal(t, locality, out.Service.Locality) state, outs, err := agent.AgentHealthServiceByName("foo") require.Nil(t, err) require.NotNil(t, outs) require.Equal(t, HealthPassing, state) require.Equal(t, 9000, outs[0].Service.Port) + require.Equal(t, locality, outs[0].Service.Locality) if err := agent.ServiceDeregister("foo"); err != nil { t.Fatalf("err: %v", err) @@ -330,6 +334,7 @@ func TestAPI_AgentServices(t *testing.T) { agent := c.Agent() s.WaitForSerfCheck(t) + locality := &Locality{Region: "us-west-1", Zone: "us-west-1a"} reg := &AgentServiceRegistration{ Name: "foo", ID: "foo", @@ -344,6 +349,7 @@ func TestAPI_AgentServices(t *testing.T) { Check: &AgentServiceCheck{ TTL: "15s", }, + Locality: locality, } if err := agent.ServiceRegister(reg); err != nil { t.Fatalf("err: %v", err) @@ -380,6 +386,7 @@ func TestAPI_AgentServices(t *testing.T) { require.NotNil(t, out) require.Equal(t, HealthCritical, state) require.Equal(t, 8000, out.Service.Port) + require.Equal(t, locality, out.Service.Locality) state, outs, err := agent.AgentHealthServiceByName("foo") require.Nil(t, err) diff --git a/api/api_test.go b/api/api_test.go index 7c8048cb4bb..7a9a722c41c 100644 --- a/api/api_test.go +++ b/api/api_test.go @@ -172,19 +172,21 @@ func testNodeServiceCheckRegistrations(t *testing.T, client *Client, datacenter Notes: "foo has ssh access", }, }, + Locality: &Locality{Region: "us-west-1", Zone: "us-west-1a"}, }, "Service redis v1 on foo": { Datacenter: datacenter, Node: "foo", SkipNodeUpdate: true, Service: &AgentService{ - Kind: ServiceKindTypical, - ID: "redisV1", - Service: "redis", - Tags: []string{"v1"}, - Meta: map[string]string{"version": "1"}, - Port: 1234, - Address: "198.18.1.2", + Kind: ServiceKindTypical, + ID: "redisV1", + Service: "redis", + Tags: []string{"v1"}, + Meta: map[string]string{"version": "1"}, + Port: 1234, + Address: "198.18.1.2", + Locality: &Locality{Region: "us-west-1", Zone: "us-west-1a"}, }, Checks: HealthChecks{ &HealthCheck{ diff --git a/api/catalog.go b/api/catalog.go index 84a2bdbc653..27407de90fa 100644 --- a/api/catalog.go +++ b/api/catalog.go @@ -19,8 +19,9 @@ type Node struct { Meta map[string]string CreateIndex uint64 ModifyIndex uint64 - Partition string `json:",omitempty"` - PeerName string `json:",omitempty"` + Partition string `json:",omitempty"` + PeerName string `json:",omitempty"` + Locality *Locality `json:",omitempty"` } type ServiceAddress struct { @@ -45,6 +46,7 @@ type CatalogService struct { ServiceWeights Weights ServiceEnableTagOverride bool ServiceProxy *AgentServiceConnectProxyConfig + ServiceLocality *Locality `json:",omitempty"` CreateIndex uint64 Checks HealthChecks ModifyIndex uint64 @@ -74,6 +76,7 @@ type CatalogRegistration struct { Checks HealthChecks SkipNodeUpdate bool Partition string `json:",omitempty"` + Locality *Locality } type CatalogDeregistration struct { diff --git a/api/catalog_test.go b/api/catalog_test.go index b0071e87f47..c49b0a7172f 100644 --- a/api/catalog_test.go +++ b/api/catalog_test.go @@ -326,11 +326,12 @@ func TestAPI_CatalogService_SingleTag(t *testing.T) { agent := c.Agent() catalog := c.Catalog() - + locality := &Locality{Region: "us-west-1", Zone: "us-west-1a"} reg := &AgentServiceRegistration{ - Name: "foo", - ID: "foo1", - Tags: []string{"bar"}, + Name: "foo", + ID: "foo1", + Tags: []string{"bar"}, + Locality: locality, } require.NoError(t, agent.ServiceRegister(reg)) defer agent.ServiceDeregister("foo1") @@ -341,6 +342,7 @@ func TestAPI_CatalogService_SingleTag(t *testing.T) { require.NotEqual(r, meta.LastIndex, 0) require.Len(r, services, 1) require.Equal(r, services[0].ServiceID, "foo1") + require.Equal(r, locality, services[0].ServiceLocality) }) } diff --git a/api/peering.go b/api/peering.go index 4de1aad9301..9143b6ccb9a 100644 --- a/api/peering.go +++ b/api/peering.go @@ -44,7 +44,7 @@ type PeeringRemoteInfo struct { Partition string // Datacenter is the remote peer's datacenter. Datacenter string - Locality Locality + Locality *Locality } // Locality identifies where a given entity is running. diff --git a/proto/private/pbcommon/common.gen.go b/proto/private/pbcommon/common.gen.go index f5a8f82cab5..d7659b834ee 100644 --- a/proto/private/pbcommon/common.gen.go +++ b/proto/private/pbcommon/common.gen.go @@ -20,6 +20,20 @@ func EnvoyExtensionFromStructs(t *structs.EnvoyExtension, s *EnvoyExtension) { s.Required = t.Required s.Arguments = MapStringInterfaceToProtobufTypesStruct(t.Arguments) } +func LocalityToStructs(s *Locality, t *structs.Locality) { + if s == nil { + return + } + t.Region = s.Region + t.Zone = s.Zone +} +func LocalityFromStructs(t *structs.Locality, s *Locality) { + if s == nil { + return + } + s.Region = t.Region + s.Zone = t.Zone +} func QueryMetaToStructs(s *QueryMeta, t *structs.QueryMeta) { if s == nil { return diff --git a/proto/private/pbcommon/common.go b/proto/private/pbcommon/common.go index 892c53887a6..199b71dbb68 100644 --- a/proto/private/pbcommon/common.go +++ b/proto/private/pbcommon/common.go @@ -184,3 +184,33 @@ func (q *QueryMeta) GetBackend() structs.QueryBackend { func (q *QueryMeta) SetResultsFilteredByACLs(v bool) { q.ResultsFilteredByACLs = v } + +// IsEmpty returns true if the Locality is unset or contains an empty region and zone. +func (l *Locality) IsEmpty() bool { + if l == nil { + return true + } + return l.Region == "" && l.Zone == "" +} + +// LocalityFromProto converts a protobuf Locality to a struct Locality. +func LocalityFromProto(l *Locality) *structs.Locality { + if l == nil { + return nil + } + return &structs.Locality{ + Region: l.Region, + Zone: l.Zone, + } +} + +// LocalityFromProto converts a struct Locality to a protobuf Locality. +func LocalityToProto(l *structs.Locality) *Locality { + if l == nil { + return nil + } + return &Locality{ + Region: l.Region, + Zone: l.Zone, + } +} diff --git a/proto/private/pbcommon/common.pb.binary.go b/proto/private/pbcommon/common.pb.binary.go index e7e96dbf732..23716de0b98 100644 --- a/proto/private/pbcommon/common.pb.binary.go +++ b/proto/private/pbcommon/common.pb.binary.go @@ -86,3 +86,13 @@ func (msg *EnvoyExtension) MarshalBinary() ([]byte, error) { func (msg *EnvoyExtension) UnmarshalBinary(b []byte) error { return proto.Unmarshal(b, msg) } + +// MarshalBinary implements encoding.BinaryMarshaler +func (msg *Locality) MarshalBinary() ([]byte, error) { + return proto.Marshal(msg) +} + +// UnmarshalBinary implements encoding.BinaryUnmarshaler +func (msg *Locality) UnmarshalBinary(b []byte) error { + return proto.Unmarshal(b, msg) +} diff --git a/proto/private/pbcommon/common.pb.go b/proto/private/pbcommon/common.pb.go index f785eca341f..9887d5d743b 100644 --- a/proto/private/pbcommon/common.pb.go +++ b/proto/private/pbcommon/common.pb.go @@ -660,6 +660,68 @@ func (x *EnvoyExtension) GetArguments() *structpb.Struct { return nil } +// mog annotation: +// +// target=github.com/hashicorp/consul/agent/structs.Locality +// output=common.gen.go +// name=Structs +type Locality struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Region is region the zone belongs to. + Region string `protobuf:"bytes,1,opt,name=Region,proto3" json:"Region,omitempty"` + // Zone is the zone the entity is running in. + Zone string `protobuf:"bytes,2,opt,name=Zone,proto3" json:"Zone,omitempty"` +} + +func (x *Locality) Reset() { + *x = Locality{} + if protoimpl.UnsafeEnabled { + mi := &file_private_pbcommon_common_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Locality) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Locality) ProtoMessage() {} + +func (x *Locality) ProtoReflect() protoreflect.Message { + mi := &file_private_pbcommon_common_proto_msgTypes[8] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Locality.ProtoReflect.Descriptor instead. +func (*Locality) Descriptor() ([]byte, []int) { + return file_private_pbcommon_common_proto_rawDescGZIP(), []int{8} +} + +func (x *Locality) GetRegion() string { + if x != nil { + return x.Region + } + return "" +} + +func (x *Locality) GetZone() string { + if x != nil { + return x.Zone + } + return "" +} + var File_private_pbcommon_common_proto protoreflect.FileDescriptor var file_private_pbcommon_common_proto_rawDesc = []byte{ @@ -745,24 +807,28 @@ var file_private_pbcommon_common_proto_rawDesc = []byte{ 0x09, 0x41, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x09, 0x41, 0x72, 0x67, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x73, 0x42, 0x8b, 0x02, 0x0a, 0x24, 0x63, 0x6f, 0x6d, 0x2e, 0x68, 0x61, 0x73, - 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, - 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x42, 0x0b, 0x43, - 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x32, 0x67, 0x69, - 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, - 0x72, 0x70, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, - 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2f, 0x70, 0x62, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, - 0xa2, 0x02, 0x04, 0x48, 0x43, 0x49, 0x43, 0xaa, 0x02, 0x20, 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, - 0x6f, 0x72, 0x70, 0x2e, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x72, - 0x6e, 0x61, 0x6c, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0xca, 0x02, 0x20, 0x48, 0x61, 0x73, - 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x5c, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x5c, 0x49, 0x6e, - 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5c, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0xe2, 0x02, 0x2c, - 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x5c, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, - 0x5c, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5c, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, - 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x23, 0x48, - 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x3a, 0x3a, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, - 0x3a, 0x3a, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x3a, 0x3a, 0x43, 0x6f, 0x6d, 0x6d, - 0x6f, 0x6e, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x65, 0x6e, 0x74, 0x73, 0x22, 0x36, 0x0a, 0x08, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x69, 0x74, 0x79, + 0x12, 0x16, 0x0a, 0x06, 0x52, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x06, 0x52, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x5a, 0x6f, 0x6e, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x5a, 0x6f, 0x6e, 0x65, 0x42, 0x8b, 0x02, 0x0a, + 0x24, 0x63, 0x6f, 0x6d, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, + 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, + 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x42, 0x0b, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x50, 0x72, 0x6f, + 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x32, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, + 0x2f, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x75, + 0x6c, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2f, + 0x70, 0x62, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0xa2, 0x02, 0x04, 0x48, 0x43, 0x49, 0x43, 0xaa, + 0x02, 0x20, 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x43, 0x6f, 0x6e, 0x73, + 0x75, 0x6c, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, + 0x6f, 0x6e, 0xca, 0x02, 0x20, 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x5c, 0x43, + 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x5c, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5c, 0x43, + 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0xe2, 0x02, 0x2c, 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, + 0x70, 0x5c, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x5c, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, + 0x6c, 0x5c, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, + 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x23, 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, + 0x3a, 0x3a, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x3a, 0x3a, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, + 0x61, 0x6c, 0x3a, 0x3a, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x33, } var ( @@ -777,7 +843,7 @@ func file_private_pbcommon_common_proto_rawDescGZIP() []byte { return file_private_pbcommon_common_proto_rawDescData } -var file_private_pbcommon_common_proto_msgTypes = make([]protoimpl.MessageInfo, 8) +var file_private_pbcommon_common_proto_msgTypes = make([]protoimpl.MessageInfo, 9) var file_private_pbcommon_common_proto_goTypes = []interface{}{ (*RaftIndex)(nil), // 0: hashicorp.consul.internal.common.RaftIndex (*TargetDatacenter)(nil), // 1: hashicorp.consul.internal.common.TargetDatacenter @@ -787,21 +853,22 @@ var file_private_pbcommon_common_proto_goTypes = []interface{}{ (*QueryMeta)(nil), // 5: hashicorp.consul.internal.common.QueryMeta (*EnterpriseMeta)(nil), // 6: hashicorp.consul.internal.common.EnterpriseMeta (*EnvoyExtension)(nil), // 7: hashicorp.consul.internal.common.EnvoyExtension - (*durationpb.Duration)(nil), // 8: google.protobuf.Duration - (*structpb.Struct)(nil), // 9: google.protobuf.Struct + (*Locality)(nil), // 8: hashicorp.consul.internal.common.Locality + (*durationpb.Duration)(nil), // 9: google.protobuf.Duration + (*structpb.Struct)(nil), // 10: google.protobuf.Struct } var file_private_pbcommon_common_proto_depIdxs = []int32{ - 8, // 0: hashicorp.consul.internal.common.QueryOptions.MaxQueryTime:type_name -> google.protobuf.Duration - 8, // 1: hashicorp.consul.internal.common.QueryOptions.MaxStaleDuration:type_name -> google.protobuf.Duration - 8, // 2: hashicorp.consul.internal.common.QueryOptions.MaxAge:type_name -> google.protobuf.Duration - 8, // 3: hashicorp.consul.internal.common.QueryOptions.StaleIfError:type_name -> google.protobuf.Duration - 8, // 4: hashicorp.consul.internal.common.QueryMeta.LastContact:type_name -> google.protobuf.Duration - 9, // 5: hashicorp.consul.internal.common.EnvoyExtension.Arguments:type_name -> google.protobuf.Struct - 6, // [6:6] is the sub-list for method output_type - 6, // [6:6] is the sub-list for method input_type - 6, // [6:6] is the sub-list for extension type_name - 6, // [6:6] is the sub-list for extension extendee - 0, // [0:6] is the sub-list for field type_name + 9, // 0: hashicorp.consul.internal.common.QueryOptions.MaxQueryTime:type_name -> google.protobuf.Duration + 9, // 1: hashicorp.consul.internal.common.QueryOptions.MaxStaleDuration:type_name -> google.protobuf.Duration + 9, // 2: hashicorp.consul.internal.common.QueryOptions.MaxAge:type_name -> google.protobuf.Duration + 9, // 3: hashicorp.consul.internal.common.QueryOptions.StaleIfError:type_name -> google.protobuf.Duration + 9, // 4: hashicorp.consul.internal.common.QueryMeta.LastContact:type_name -> google.protobuf.Duration + 10, // 5: hashicorp.consul.internal.common.EnvoyExtension.Arguments:type_name -> google.protobuf.Struct + 6, // [6:6] is the sub-list for method output_type + 6, // [6:6] is the sub-list for method input_type + 6, // [6:6] is the sub-list for extension type_name + 6, // [6:6] is the sub-list for extension extendee + 0, // [0:6] is the sub-list for field type_name } func init() { file_private_pbcommon_common_proto_init() } @@ -906,6 +973,18 @@ func file_private_pbcommon_common_proto_init() { return nil } } + file_private_pbcommon_common_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Locality); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } } type x struct{} out := protoimpl.TypeBuilder{ @@ -913,7 +992,7 @@ func file_private_pbcommon_common_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_private_pbcommon_common_proto_rawDesc, NumEnums: 0, - NumMessages: 8, + NumMessages: 9, NumExtensions: 0, NumServices: 0, }, diff --git a/proto/private/pbcommon/common.proto b/proto/private/pbcommon/common.proto index 35a891c459b..2d0830d2e0e 100644 --- a/proto/private/pbcommon/common.proto +++ b/proto/private/pbcommon/common.proto @@ -183,3 +183,16 @@ message EnvoyExtension { // mog: func-to=ProtobufTypesStructToMapStringInterface func-from=MapStringInterfaceToProtobufTypesStruct google.protobuf.Struct Arguments = 3; } + +// mog annotation: +// +// target=github.com/hashicorp/consul/agent/structs.Locality +// output=common.gen.go +// name=Structs +message Locality { + // Region is region the zone belongs to. + string Region = 1; + + // Zone is the zone the entity is running in. + string Zone = 2; +} diff --git a/proto/private/pbpeering/peering.gen.go b/proto/private/pbpeering/peering.gen.go index 6cc2a6462f4..1105d8db180 100644 --- a/proto/private/pbpeering/peering.gen.go +++ b/proto/private/pbpeering/peering.gen.go @@ -62,20 +62,6 @@ func GenerateTokenResponseFromAPI(t *api.PeeringGenerateTokenResponse, s *Genera } s.PeeringToken = t.PeeringToken } -func LocalityToAPI(s *Locality, t *api.Locality) { - if s == nil { - return - } - t.Region = s.Region - t.Zone = s.Zone -} -func LocalityFromAPI(t *api.Locality, s *Locality) { - if s == nil { - return - } - s.Region = t.Region - s.Zone = t.Zone -} func PeeringToAPI(s *Peering, t *api.Peering) { if s == nil { return @@ -126,9 +112,7 @@ func RemoteInfoToAPI(s *RemoteInfo, t *api.PeeringRemoteInfo) { } t.Partition = s.Partition t.Datacenter = s.Datacenter - if s.Locality != nil { - LocalityToAPI(s.Locality, &t.Locality) - } + t.Locality = LocalityToAPI(s.Locality) } func RemoteInfoFromAPI(t *api.PeeringRemoteInfo, s *RemoteInfo) { if s == nil { @@ -136,9 +120,5 @@ func RemoteInfoFromAPI(t *api.PeeringRemoteInfo, s *RemoteInfo) { } s.Partition = t.Partition s.Datacenter = t.Datacenter - { - var x Locality - LocalityFromAPI(&t.Locality, &x) - s.Locality = &x - } + s.Locality = LocalityFromAPI(t.Locality) } diff --git a/proto/private/pbpeering/peering.go b/proto/private/pbpeering/peering.go index a0f337409ce..c945c1541de 100644 --- a/proto/private/pbpeering/peering.go +++ b/proto/private/pbpeering/peering.go @@ -15,6 +15,7 @@ import ( "github.com/hashicorp/consul/agent/structs" "github.com/hashicorp/consul/api" "github.com/hashicorp/consul/lib" + "github.com/hashicorp/consul/proto/private/pbcommon" ) // RequestDatacenter implements structs.RPCInfo @@ -279,13 +280,6 @@ func (r *RemoteInfo) IsEmpty() bool { return r.Partition == "" && r.Datacenter == "" && r.Locality.IsEmpty() } -func (l *Locality) IsEmpty() bool { - if l == nil { - return true - } - return l.Region == "" && l.Zone == "" -} - // convenience func NewGenerateTokenRequestFromAPI(req *api.PeeringGenerateTokenRequest) *GenerateTokenRequest { if req == nil { @@ -332,8 +326,49 @@ func (o *PeeringTrustBundle) DeepCopy() *PeeringTrustBundle { return cp } -func LocalityFromStruct(l structs.Locality) *Locality { - return &Locality{ +// TODO: handle this with mog +// LocalityToStructs converts a protobuf Locality to a struct Locality. +func LocalityToStructs(l *pbcommon.Locality) *structs.Locality { + if l == nil { + return nil + } + return &structs.Locality{ + Region: l.Region, + Zone: l.Zone, + } +} + +// TODO: handle this with mog +// LocalityFromStructs converts a struct Locality to a protobuf Locality. +func LocalityFromStructs(l *structs.Locality) *pbcommon.Locality { + if l == nil { + return nil + } + return &pbcommon.Locality{ + Region: l.Region, + Zone: l.Zone, + } +} + +// TODO: handle this with mog +// LocalityToAPI converts a protobuf Locality to an API Locality. +func LocalityToAPI(l *pbcommon.Locality) *api.Locality { + if l == nil { + return nil + } + return &api.Locality{ + Region: l.Region, + Zone: l.Zone, + } +} + +// TODO: handle this with mog +// LocalityFromProto converts an API Locality to a protobuf Locality. +func LocalityFromAPI(l *api.Locality) *pbcommon.Locality { + if l == nil { + return nil + } + return &pbcommon.Locality{ Region: l.Region, Zone: l.Zone, } diff --git a/proto/private/pbpeering/peering.pb.binary.go b/proto/private/pbpeering/peering.pb.binary.go index 064c0e294ad..af74d9a49e6 100644 --- a/proto/private/pbpeering/peering.pb.binary.go +++ b/proto/private/pbpeering/peering.pb.binary.go @@ -107,16 +107,6 @@ func (msg *RemoteInfo) UnmarshalBinary(b []byte) error { return proto.Unmarshal(b, msg) } -// MarshalBinary implements encoding.BinaryMarshaler -func (msg *Locality) MarshalBinary() ([]byte, error) { - return proto.Marshal(msg) -} - -// UnmarshalBinary implements encoding.BinaryUnmarshaler -func (msg *Locality) UnmarshalBinary(b []byte) error { - return proto.Unmarshal(b, msg) -} - // MarshalBinary implements encoding.BinaryMarshaler func (msg *StreamStatus) MarshalBinary() ([]byte, error) { return proto.Marshal(msg) diff --git a/proto/private/pbpeering/peering.pb.go b/proto/private/pbpeering/peering.pb.go index 56893499f43..e5da2e7b83b 100644 --- a/proto/private/pbpeering/peering.pb.go +++ b/proto/private/pbpeering/peering.pb.go @@ -8,6 +8,7 @@ package pbpeering import ( _ "github.com/hashicorp/consul/proto-public/annotations/ratelimit" + pbcommon "github.com/hashicorp/consul/proto/private/pbcommon" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" timestamppb "google.golang.org/protobuf/types/known/timestamppb" @@ -491,7 +492,8 @@ type RemoteInfo struct { // Datacenter is the remote peer's datacenter. Datacenter string `protobuf:"bytes,2,opt,name=Datacenter,proto3" json:"Datacenter,omitempty"` // Locality identifies where the peer is running. - Locality *Locality `protobuf:"bytes,3,opt,name=Locality,proto3" json:"Locality,omitempty"` + // mog: func-to=LocalityToAPI func-from=LocalityFromAPI + Locality *pbcommon.Locality `protobuf:"bytes,3,opt,name=Locality,proto3" json:"Locality,omitempty"` } func (x *RemoteInfo) Reset() { @@ -540,75 +542,13 @@ func (x *RemoteInfo) GetDatacenter() string { return "" } -func (x *RemoteInfo) GetLocality() *Locality { +func (x *RemoteInfo) GetLocality() *pbcommon.Locality { if x != nil { return x.Locality } return nil } -// mog annotation: -// -// target=github.com/hashicorp/consul/api.Locality -// output=peering.gen.go -// name=API -type Locality struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // Region is region the zone belongs to. - Region string `protobuf:"bytes,1,opt,name=Region,proto3" json:"Region,omitempty"` - // Zone is the zone the entity is running in. - Zone string `protobuf:"bytes,2,opt,name=Zone,proto3" json:"Zone,omitempty"` -} - -func (x *Locality) Reset() { - *x = Locality{} - if protoimpl.UnsafeEnabled { - mi := &file_private_pbpeering_peering_proto_msgTypes[4] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *Locality) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*Locality) ProtoMessage() {} - -func (x *Locality) ProtoReflect() protoreflect.Message { - mi := &file_private_pbpeering_peering_proto_msgTypes[4] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use Locality.ProtoReflect.Descriptor instead. -func (*Locality) Descriptor() ([]byte, []int) { - return file_private_pbpeering_peering_proto_rawDescGZIP(), []int{4} -} - -func (x *Locality) GetRegion() string { - if x != nil { - return x.Region - } - return "" -} - -func (x *Locality) GetZone() string { - if x != nil { - return x.Zone - } - return "" -} - // StreamStatus represents information about an active peering stream. type StreamStatus struct { state protoimpl.MessageState @@ -630,7 +570,7 @@ type StreamStatus struct { func (x *StreamStatus) Reset() { *x = StreamStatus{} if protoimpl.UnsafeEnabled { - mi := &file_private_pbpeering_peering_proto_msgTypes[5] + mi := &file_private_pbpeering_peering_proto_msgTypes[4] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -643,7 +583,7 @@ func (x *StreamStatus) String() string { func (*StreamStatus) ProtoMessage() {} func (x *StreamStatus) ProtoReflect() protoreflect.Message { - mi := &file_private_pbpeering_peering_proto_msgTypes[5] + mi := &file_private_pbpeering_peering_proto_msgTypes[4] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -656,7 +596,7 @@ func (x *StreamStatus) ProtoReflect() protoreflect.Message { // Deprecated: Use StreamStatus.ProtoReflect.Descriptor instead. func (*StreamStatus) Descriptor() ([]byte, []int) { - return file_private_pbpeering_peering_proto_rawDescGZIP(), []int{5} + return file_private_pbpeering_peering_proto_rawDescGZIP(), []int{4} } func (x *StreamStatus) GetImportedServices() []string { @@ -722,7 +662,7 @@ type PeeringTrustBundle struct { func (x *PeeringTrustBundle) Reset() { *x = PeeringTrustBundle{} if protoimpl.UnsafeEnabled { - mi := &file_private_pbpeering_peering_proto_msgTypes[6] + mi := &file_private_pbpeering_peering_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -735,7 +675,7 @@ func (x *PeeringTrustBundle) String() string { func (*PeeringTrustBundle) ProtoMessage() {} func (x *PeeringTrustBundle) ProtoReflect() protoreflect.Message { - mi := &file_private_pbpeering_peering_proto_msgTypes[6] + mi := &file_private_pbpeering_peering_proto_msgTypes[5] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -748,7 +688,7 @@ func (x *PeeringTrustBundle) ProtoReflect() protoreflect.Message { // Deprecated: Use PeeringTrustBundle.ProtoReflect.Descriptor instead. func (*PeeringTrustBundle) Descriptor() ([]byte, []int) { - return file_private_pbpeering_peering_proto_rawDescGZIP(), []int{6} + return file_private_pbpeering_peering_proto_rawDescGZIP(), []int{5} } func (x *PeeringTrustBundle) GetTrustDomain() string { @@ -813,7 +753,7 @@ type PeeringServerAddresses struct { func (x *PeeringServerAddresses) Reset() { *x = PeeringServerAddresses{} if protoimpl.UnsafeEnabled { - mi := &file_private_pbpeering_peering_proto_msgTypes[7] + mi := &file_private_pbpeering_peering_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -826,7 +766,7 @@ func (x *PeeringServerAddresses) String() string { func (*PeeringServerAddresses) ProtoMessage() {} func (x *PeeringServerAddresses) ProtoReflect() protoreflect.Message { - mi := &file_private_pbpeering_peering_proto_msgTypes[7] + mi := &file_private_pbpeering_peering_proto_msgTypes[6] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -839,7 +779,7 @@ func (x *PeeringServerAddresses) ProtoReflect() protoreflect.Message { // Deprecated: Use PeeringServerAddresses.ProtoReflect.Descriptor instead. func (*PeeringServerAddresses) Descriptor() ([]byte, []int) { - return file_private_pbpeering_peering_proto_rawDescGZIP(), []int{7} + return file_private_pbpeering_peering_proto_rawDescGZIP(), []int{6} } func (x *PeeringServerAddresses) GetAddresses() []string { @@ -862,7 +802,7 @@ type PeeringReadRequest struct { func (x *PeeringReadRequest) Reset() { *x = PeeringReadRequest{} if protoimpl.UnsafeEnabled { - mi := &file_private_pbpeering_peering_proto_msgTypes[8] + mi := &file_private_pbpeering_peering_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -875,7 +815,7 @@ func (x *PeeringReadRequest) String() string { func (*PeeringReadRequest) ProtoMessage() {} func (x *PeeringReadRequest) ProtoReflect() protoreflect.Message { - mi := &file_private_pbpeering_peering_proto_msgTypes[8] + mi := &file_private_pbpeering_peering_proto_msgTypes[7] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -888,7 +828,7 @@ func (x *PeeringReadRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use PeeringReadRequest.ProtoReflect.Descriptor instead. func (*PeeringReadRequest) Descriptor() ([]byte, []int) { - return file_private_pbpeering_peering_proto_rawDescGZIP(), []int{8} + return file_private_pbpeering_peering_proto_rawDescGZIP(), []int{7} } func (x *PeeringReadRequest) GetName() string { @@ -916,7 +856,7 @@ type PeeringReadResponse struct { func (x *PeeringReadResponse) Reset() { *x = PeeringReadResponse{} if protoimpl.UnsafeEnabled { - mi := &file_private_pbpeering_peering_proto_msgTypes[9] + mi := &file_private_pbpeering_peering_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -929,7 +869,7 @@ func (x *PeeringReadResponse) String() string { func (*PeeringReadResponse) ProtoMessage() {} func (x *PeeringReadResponse) ProtoReflect() protoreflect.Message { - mi := &file_private_pbpeering_peering_proto_msgTypes[9] + mi := &file_private_pbpeering_peering_proto_msgTypes[8] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -942,7 +882,7 @@ func (x *PeeringReadResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use PeeringReadResponse.ProtoReflect.Descriptor instead. func (*PeeringReadResponse) Descriptor() ([]byte, []int) { - return file_private_pbpeering_peering_proto_rawDescGZIP(), []int{9} + return file_private_pbpeering_peering_proto_rawDescGZIP(), []int{8} } func (x *PeeringReadResponse) GetPeering() *Peering { @@ -964,7 +904,7 @@ type PeeringListRequest struct { func (x *PeeringListRequest) Reset() { *x = PeeringListRequest{} if protoimpl.UnsafeEnabled { - mi := &file_private_pbpeering_peering_proto_msgTypes[10] + mi := &file_private_pbpeering_peering_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -977,7 +917,7 @@ func (x *PeeringListRequest) String() string { func (*PeeringListRequest) ProtoMessage() {} func (x *PeeringListRequest) ProtoReflect() protoreflect.Message { - mi := &file_private_pbpeering_peering_proto_msgTypes[10] + mi := &file_private_pbpeering_peering_proto_msgTypes[9] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -990,7 +930,7 @@ func (x *PeeringListRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use PeeringListRequest.ProtoReflect.Descriptor instead. func (*PeeringListRequest) Descriptor() ([]byte, []int) { - return file_private_pbpeering_peering_proto_rawDescGZIP(), []int{10} + return file_private_pbpeering_peering_proto_rawDescGZIP(), []int{9} } func (x *PeeringListRequest) GetPartition() string { @@ -1012,7 +952,7 @@ type PeeringListResponse struct { func (x *PeeringListResponse) Reset() { *x = PeeringListResponse{} if protoimpl.UnsafeEnabled { - mi := &file_private_pbpeering_peering_proto_msgTypes[11] + mi := &file_private_pbpeering_peering_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1025,7 +965,7 @@ func (x *PeeringListResponse) String() string { func (*PeeringListResponse) ProtoMessage() {} func (x *PeeringListResponse) ProtoReflect() protoreflect.Message { - mi := &file_private_pbpeering_peering_proto_msgTypes[11] + mi := &file_private_pbpeering_peering_proto_msgTypes[10] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1038,7 +978,7 @@ func (x *PeeringListResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use PeeringListResponse.ProtoReflect.Descriptor instead. func (*PeeringListResponse) Descriptor() ([]byte, []int) { - return file_private_pbpeering_peering_proto_rawDescGZIP(), []int{11} + return file_private_pbpeering_peering_proto_rawDescGZIP(), []int{10} } func (x *PeeringListResponse) GetPeerings() []*Peering { @@ -1072,7 +1012,7 @@ type PeeringWriteRequest struct { func (x *PeeringWriteRequest) Reset() { *x = PeeringWriteRequest{} if protoimpl.UnsafeEnabled { - mi := &file_private_pbpeering_peering_proto_msgTypes[12] + mi := &file_private_pbpeering_peering_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1085,7 +1025,7 @@ func (x *PeeringWriteRequest) String() string { func (*PeeringWriteRequest) ProtoMessage() {} func (x *PeeringWriteRequest) ProtoReflect() protoreflect.Message { - mi := &file_private_pbpeering_peering_proto_msgTypes[12] + mi := &file_private_pbpeering_peering_proto_msgTypes[11] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1098,7 +1038,7 @@ func (x *PeeringWriteRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use PeeringWriteRequest.ProtoReflect.Descriptor instead. func (*PeeringWriteRequest) Descriptor() ([]byte, []int) { - return file_private_pbpeering_peering_proto_rawDescGZIP(), []int{12} + return file_private_pbpeering_peering_proto_rawDescGZIP(), []int{11} } func (x *PeeringWriteRequest) GetPeering() *Peering { @@ -1132,7 +1072,7 @@ type PeeringWriteResponse struct { func (x *PeeringWriteResponse) Reset() { *x = PeeringWriteResponse{} if protoimpl.UnsafeEnabled { - mi := &file_private_pbpeering_peering_proto_msgTypes[13] + mi := &file_private_pbpeering_peering_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1145,7 +1085,7 @@ func (x *PeeringWriteResponse) String() string { func (*PeeringWriteResponse) ProtoMessage() {} func (x *PeeringWriteResponse) ProtoReflect() protoreflect.Message { - mi := &file_private_pbpeering_peering_proto_msgTypes[13] + mi := &file_private_pbpeering_peering_proto_msgTypes[12] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1158,7 +1098,7 @@ func (x *PeeringWriteResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use PeeringWriteResponse.ProtoReflect.Descriptor instead. func (*PeeringWriteResponse) Descriptor() ([]byte, []int) { - return file_private_pbpeering_peering_proto_rawDescGZIP(), []int{13} + return file_private_pbpeering_peering_proto_rawDescGZIP(), []int{12} } type PeeringDeleteRequest struct { @@ -1173,7 +1113,7 @@ type PeeringDeleteRequest struct { func (x *PeeringDeleteRequest) Reset() { *x = PeeringDeleteRequest{} if protoimpl.UnsafeEnabled { - mi := &file_private_pbpeering_peering_proto_msgTypes[14] + mi := &file_private_pbpeering_peering_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1186,7 +1126,7 @@ func (x *PeeringDeleteRequest) String() string { func (*PeeringDeleteRequest) ProtoMessage() {} func (x *PeeringDeleteRequest) ProtoReflect() protoreflect.Message { - mi := &file_private_pbpeering_peering_proto_msgTypes[14] + mi := &file_private_pbpeering_peering_proto_msgTypes[13] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1199,7 +1139,7 @@ func (x *PeeringDeleteRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use PeeringDeleteRequest.ProtoReflect.Descriptor instead. func (*PeeringDeleteRequest) Descriptor() ([]byte, []int) { - return file_private_pbpeering_peering_proto_rawDescGZIP(), []int{14} + return file_private_pbpeering_peering_proto_rawDescGZIP(), []int{13} } func (x *PeeringDeleteRequest) GetName() string { @@ -1225,7 +1165,7 @@ type PeeringDeleteResponse struct { func (x *PeeringDeleteResponse) Reset() { *x = PeeringDeleteResponse{} if protoimpl.UnsafeEnabled { - mi := &file_private_pbpeering_peering_proto_msgTypes[15] + mi := &file_private_pbpeering_peering_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1238,7 +1178,7 @@ func (x *PeeringDeleteResponse) String() string { func (*PeeringDeleteResponse) ProtoMessage() {} func (x *PeeringDeleteResponse) ProtoReflect() protoreflect.Message { - mi := &file_private_pbpeering_peering_proto_msgTypes[15] + mi := &file_private_pbpeering_peering_proto_msgTypes[14] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1251,7 +1191,7 @@ func (x *PeeringDeleteResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use PeeringDeleteResponse.ProtoReflect.Descriptor instead. func (*PeeringDeleteResponse) Descriptor() ([]byte, []int) { - return file_private_pbpeering_peering_proto_rawDescGZIP(), []int{15} + return file_private_pbpeering_peering_proto_rawDescGZIP(), []int{14} } type TrustBundleListByServiceRequest struct { @@ -1268,7 +1208,7 @@ type TrustBundleListByServiceRequest struct { func (x *TrustBundleListByServiceRequest) Reset() { *x = TrustBundleListByServiceRequest{} if protoimpl.UnsafeEnabled { - mi := &file_private_pbpeering_peering_proto_msgTypes[16] + mi := &file_private_pbpeering_peering_proto_msgTypes[15] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1281,7 +1221,7 @@ func (x *TrustBundleListByServiceRequest) String() string { func (*TrustBundleListByServiceRequest) ProtoMessage() {} func (x *TrustBundleListByServiceRequest) ProtoReflect() protoreflect.Message { - mi := &file_private_pbpeering_peering_proto_msgTypes[16] + mi := &file_private_pbpeering_peering_proto_msgTypes[15] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1294,7 +1234,7 @@ func (x *TrustBundleListByServiceRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use TrustBundleListByServiceRequest.ProtoReflect.Descriptor instead. func (*TrustBundleListByServiceRequest) Descriptor() ([]byte, []int) { - return file_private_pbpeering_peering_proto_rawDescGZIP(), []int{16} + return file_private_pbpeering_peering_proto_rawDescGZIP(), []int{15} } func (x *TrustBundleListByServiceRequest) GetServiceName() string { @@ -1337,7 +1277,7 @@ type TrustBundleListByServiceResponse struct { func (x *TrustBundleListByServiceResponse) Reset() { *x = TrustBundleListByServiceResponse{} if protoimpl.UnsafeEnabled { - mi := &file_private_pbpeering_peering_proto_msgTypes[17] + mi := &file_private_pbpeering_peering_proto_msgTypes[16] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1350,7 +1290,7 @@ func (x *TrustBundleListByServiceResponse) String() string { func (*TrustBundleListByServiceResponse) ProtoMessage() {} func (x *TrustBundleListByServiceResponse) ProtoReflect() protoreflect.Message { - mi := &file_private_pbpeering_peering_proto_msgTypes[17] + mi := &file_private_pbpeering_peering_proto_msgTypes[16] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1363,7 +1303,7 @@ func (x *TrustBundleListByServiceResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use TrustBundleListByServiceResponse.ProtoReflect.Descriptor instead. func (*TrustBundleListByServiceResponse) Descriptor() ([]byte, []int) { - return file_private_pbpeering_peering_proto_rawDescGZIP(), []int{17} + return file_private_pbpeering_peering_proto_rawDescGZIP(), []int{16} } func (x *TrustBundleListByServiceResponse) GetIndex() uint64 { @@ -1392,7 +1332,7 @@ type TrustBundleReadRequest struct { func (x *TrustBundleReadRequest) Reset() { *x = TrustBundleReadRequest{} if protoimpl.UnsafeEnabled { - mi := &file_private_pbpeering_peering_proto_msgTypes[18] + mi := &file_private_pbpeering_peering_proto_msgTypes[17] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1405,7 +1345,7 @@ func (x *TrustBundleReadRequest) String() string { func (*TrustBundleReadRequest) ProtoMessage() {} func (x *TrustBundleReadRequest) ProtoReflect() protoreflect.Message { - mi := &file_private_pbpeering_peering_proto_msgTypes[18] + mi := &file_private_pbpeering_peering_proto_msgTypes[17] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1418,7 +1358,7 @@ func (x *TrustBundleReadRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use TrustBundleReadRequest.ProtoReflect.Descriptor instead. func (*TrustBundleReadRequest) Descriptor() ([]byte, []int) { - return file_private_pbpeering_peering_proto_rawDescGZIP(), []int{18} + return file_private_pbpeering_peering_proto_rawDescGZIP(), []int{17} } func (x *TrustBundleReadRequest) GetName() string { @@ -1447,7 +1387,7 @@ type TrustBundleReadResponse struct { func (x *TrustBundleReadResponse) Reset() { *x = TrustBundleReadResponse{} if protoimpl.UnsafeEnabled { - mi := &file_private_pbpeering_peering_proto_msgTypes[19] + mi := &file_private_pbpeering_peering_proto_msgTypes[18] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1460,7 +1400,7 @@ func (x *TrustBundleReadResponse) String() string { func (*TrustBundleReadResponse) ProtoMessage() {} func (x *TrustBundleReadResponse) ProtoReflect() protoreflect.Message { - mi := &file_private_pbpeering_peering_proto_msgTypes[19] + mi := &file_private_pbpeering_peering_proto_msgTypes[18] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1473,7 +1413,7 @@ func (x *TrustBundleReadResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use TrustBundleReadResponse.ProtoReflect.Descriptor instead. func (*TrustBundleReadResponse) Descriptor() ([]byte, []int) { - return file_private_pbpeering_peering_proto_rawDescGZIP(), []int{19} + return file_private_pbpeering_peering_proto_rawDescGZIP(), []int{18} } func (x *TrustBundleReadResponse) GetIndex() uint64 { @@ -1502,7 +1442,7 @@ type PeeringTerminateByIDRequest struct { func (x *PeeringTerminateByIDRequest) Reset() { *x = PeeringTerminateByIDRequest{} if protoimpl.UnsafeEnabled { - mi := &file_private_pbpeering_peering_proto_msgTypes[20] + mi := &file_private_pbpeering_peering_proto_msgTypes[19] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1515,7 +1455,7 @@ func (x *PeeringTerminateByIDRequest) String() string { func (*PeeringTerminateByIDRequest) ProtoMessage() {} func (x *PeeringTerminateByIDRequest) ProtoReflect() protoreflect.Message { - mi := &file_private_pbpeering_peering_proto_msgTypes[20] + mi := &file_private_pbpeering_peering_proto_msgTypes[19] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1528,7 +1468,7 @@ func (x *PeeringTerminateByIDRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use PeeringTerminateByIDRequest.ProtoReflect.Descriptor instead. func (*PeeringTerminateByIDRequest) Descriptor() ([]byte, []int) { - return file_private_pbpeering_peering_proto_rawDescGZIP(), []int{20} + return file_private_pbpeering_peering_proto_rawDescGZIP(), []int{19} } func (x *PeeringTerminateByIDRequest) GetID() string { @@ -1547,7 +1487,7 @@ type PeeringTerminateByIDResponse struct { func (x *PeeringTerminateByIDResponse) Reset() { *x = PeeringTerminateByIDResponse{} if protoimpl.UnsafeEnabled { - mi := &file_private_pbpeering_peering_proto_msgTypes[21] + mi := &file_private_pbpeering_peering_proto_msgTypes[20] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1560,7 +1500,7 @@ func (x *PeeringTerminateByIDResponse) String() string { func (*PeeringTerminateByIDResponse) ProtoMessage() {} func (x *PeeringTerminateByIDResponse) ProtoReflect() protoreflect.Message { - mi := &file_private_pbpeering_peering_proto_msgTypes[21] + mi := &file_private_pbpeering_peering_proto_msgTypes[20] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1573,7 +1513,7 @@ func (x *PeeringTerminateByIDResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use PeeringTerminateByIDResponse.ProtoReflect.Descriptor instead. func (*PeeringTerminateByIDResponse) Descriptor() ([]byte, []int) { - return file_private_pbpeering_peering_proto_rawDescGZIP(), []int{21} + return file_private_pbpeering_peering_proto_rawDescGZIP(), []int{20} } type PeeringTrustBundleWriteRequest struct { @@ -1587,7 +1527,7 @@ type PeeringTrustBundleWriteRequest struct { func (x *PeeringTrustBundleWriteRequest) Reset() { *x = PeeringTrustBundleWriteRequest{} if protoimpl.UnsafeEnabled { - mi := &file_private_pbpeering_peering_proto_msgTypes[22] + mi := &file_private_pbpeering_peering_proto_msgTypes[21] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1600,7 +1540,7 @@ func (x *PeeringTrustBundleWriteRequest) String() string { func (*PeeringTrustBundleWriteRequest) ProtoMessage() {} func (x *PeeringTrustBundleWriteRequest) ProtoReflect() protoreflect.Message { - mi := &file_private_pbpeering_peering_proto_msgTypes[22] + mi := &file_private_pbpeering_peering_proto_msgTypes[21] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1613,7 +1553,7 @@ func (x *PeeringTrustBundleWriteRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use PeeringTrustBundleWriteRequest.ProtoReflect.Descriptor instead. func (*PeeringTrustBundleWriteRequest) Descriptor() ([]byte, []int) { - return file_private_pbpeering_peering_proto_rawDescGZIP(), []int{22} + return file_private_pbpeering_peering_proto_rawDescGZIP(), []int{21} } func (x *PeeringTrustBundleWriteRequest) GetPeeringTrustBundle() *PeeringTrustBundle { @@ -1632,7 +1572,7 @@ type PeeringTrustBundleWriteResponse struct { func (x *PeeringTrustBundleWriteResponse) Reset() { *x = PeeringTrustBundleWriteResponse{} if protoimpl.UnsafeEnabled { - mi := &file_private_pbpeering_peering_proto_msgTypes[23] + mi := &file_private_pbpeering_peering_proto_msgTypes[22] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1645,7 +1585,7 @@ func (x *PeeringTrustBundleWriteResponse) String() string { func (*PeeringTrustBundleWriteResponse) ProtoMessage() {} func (x *PeeringTrustBundleWriteResponse) ProtoReflect() protoreflect.Message { - mi := &file_private_pbpeering_peering_proto_msgTypes[23] + mi := &file_private_pbpeering_peering_proto_msgTypes[22] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1658,7 +1598,7 @@ func (x *PeeringTrustBundleWriteResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use PeeringTrustBundleWriteResponse.ProtoReflect.Descriptor instead. func (*PeeringTrustBundleWriteResponse) Descriptor() ([]byte, []int) { - return file_private_pbpeering_peering_proto_rawDescGZIP(), []int{23} + return file_private_pbpeering_peering_proto_rawDescGZIP(), []int{22} } type PeeringTrustBundleDeleteRequest struct { @@ -1673,7 +1613,7 @@ type PeeringTrustBundleDeleteRequest struct { func (x *PeeringTrustBundleDeleteRequest) Reset() { *x = PeeringTrustBundleDeleteRequest{} if protoimpl.UnsafeEnabled { - mi := &file_private_pbpeering_peering_proto_msgTypes[24] + mi := &file_private_pbpeering_peering_proto_msgTypes[23] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1686,7 +1626,7 @@ func (x *PeeringTrustBundleDeleteRequest) String() string { func (*PeeringTrustBundleDeleteRequest) ProtoMessage() {} func (x *PeeringTrustBundleDeleteRequest) ProtoReflect() protoreflect.Message { - mi := &file_private_pbpeering_peering_proto_msgTypes[24] + mi := &file_private_pbpeering_peering_proto_msgTypes[23] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1699,7 +1639,7 @@ func (x *PeeringTrustBundleDeleteRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use PeeringTrustBundleDeleteRequest.ProtoReflect.Descriptor instead. func (*PeeringTrustBundleDeleteRequest) Descriptor() ([]byte, []int) { - return file_private_pbpeering_peering_proto_rawDescGZIP(), []int{24} + return file_private_pbpeering_peering_proto_rawDescGZIP(), []int{23} } func (x *PeeringTrustBundleDeleteRequest) GetName() string { @@ -1725,7 +1665,7 @@ type PeeringTrustBundleDeleteResponse struct { func (x *PeeringTrustBundleDeleteResponse) Reset() { *x = PeeringTrustBundleDeleteResponse{} if protoimpl.UnsafeEnabled { - mi := &file_private_pbpeering_peering_proto_msgTypes[25] + mi := &file_private_pbpeering_peering_proto_msgTypes[24] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1738,7 +1678,7 @@ func (x *PeeringTrustBundleDeleteResponse) String() string { func (*PeeringTrustBundleDeleteResponse) ProtoMessage() {} func (x *PeeringTrustBundleDeleteResponse) ProtoReflect() protoreflect.Message { - mi := &file_private_pbpeering_peering_proto_msgTypes[25] + mi := &file_private_pbpeering_peering_proto_msgTypes[24] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1751,7 +1691,7 @@ func (x *PeeringTrustBundleDeleteResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use PeeringTrustBundleDeleteResponse.ProtoReflect.Descriptor instead. func (*PeeringTrustBundleDeleteResponse) Descriptor() ([]byte, []int) { - return file_private_pbpeering_peering_proto_rawDescGZIP(), []int{25} + return file_private_pbpeering_peering_proto_rawDescGZIP(), []int{24} } // mog annotation: @@ -1779,7 +1719,7 @@ type GenerateTokenRequest struct { func (x *GenerateTokenRequest) Reset() { *x = GenerateTokenRequest{} if protoimpl.UnsafeEnabled { - mi := &file_private_pbpeering_peering_proto_msgTypes[26] + mi := &file_private_pbpeering_peering_proto_msgTypes[25] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1792,7 +1732,7 @@ func (x *GenerateTokenRequest) String() string { func (*GenerateTokenRequest) ProtoMessage() {} func (x *GenerateTokenRequest) ProtoReflect() protoreflect.Message { - mi := &file_private_pbpeering_peering_proto_msgTypes[26] + mi := &file_private_pbpeering_peering_proto_msgTypes[25] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1805,7 +1745,7 @@ func (x *GenerateTokenRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GenerateTokenRequest.ProtoReflect.Descriptor instead. func (*GenerateTokenRequest) Descriptor() ([]byte, []int) { - return file_private_pbpeering_peering_proto_rawDescGZIP(), []int{26} + return file_private_pbpeering_peering_proto_rawDescGZIP(), []int{25} } func (x *GenerateTokenRequest) GetPeerName() string { @@ -1854,7 +1794,7 @@ type GenerateTokenResponse struct { func (x *GenerateTokenResponse) Reset() { *x = GenerateTokenResponse{} if protoimpl.UnsafeEnabled { - mi := &file_private_pbpeering_peering_proto_msgTypes[27] + mi := &file_private_pbpeering_peering_proto_msgTypes[26] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1867,7 +1807,7 @@ func (x *GenerateTokenResponse) String() string { func (*GenerateTokenResponse) ProtoMessage() {} func (x *GenerateTokenResponse) ProtoReflect() protoreflect.Message { - mi := &file_private_pbpeering_peering_proto_msgTypes[27] + mi := &file_private_pbpeering_peering_proto_msgTypes[26] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1880,7 +1820,7 @@ func (x *GenerateTokenResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GenerateTokenResponse.ProtoReflect.Descriptor instead. func (*GenerateTokenResponse) Descriptor() ([]byte, []int) { - return file_private_pbpeering_peering_proto_rawDescGZIP(), []int{27} + return file_private_pbpeering_peering_proto_rawDescGZIP(), []int{26} } func (x *GenerateTokenResponse) GetPeeringToken() string { @@ -1913,7 +1853,7 @@ type EstablishRequest struct { func (x *EstablishRequest) Reset() { *x = EstablishRequest{} if protoimpl.UnsafeEnabled { - mi := &file_private_pbpeering_peering_proto_msgTypes[28] + mi := &file_private_pbpeering_peering_proto_msgTypes[27] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1926,7 +1866,7 @@ func (x *EstablishRequest) String() string { func (*EstablishRequest) ProtoMessage() {} func (x *EstablishRequest) ProtoReflect() protoreflect.Message { - mi := &file_private_pbpeering_peering_proto_msgTypes[28] + mi := &file_private_pbpeering_peering_proto_msgTypes[27] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1939,7 +1879,7 @@ func (x *EstablishRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use EstablishRequest.ProtoReflect.Descriptor instead. func (*EstablishRequest) Descriptor() ([]byte, []int) { - return file_private_pbpeering_peering_proto_rawDescGZIP(), []int{28} + return file_private_pbpeering_peering_proto_rawDescGZIP(), []int{27} } func (x *EstablishRequest) GetPeerName() string { @@ -1984,7 +1924,7 @@ type EstablishResponse struct { func (x *EstablishResponse) Reset() { *x = EstablishResponse{} if protoimpl.UnsafeEnabled { - mi := &file_private_pbpeering_peering_proto_msgTypes[29] + mi := &file_private_pbpeering_peering_proto_msgTypes[28] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1997,7 +1937,7 @@ func (x *EstablishResponse) String() string { func (*EstablishResponse) ProtoMessage() {} func (x *EstablishResponse) ProtoReflect() protoreflect.Message { - mi := &file_private_pbpeering_peering_proto_msgTypes[29] + mi := &file_private_pbpeering_peering_proto_msgTypes[28] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2010,7 +1950,7 @@ func (x *EstablishResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use EstablishResponse.ProtoReflect.Descriptor instead. func (*EstablishResponse) Descriptor() ([]byte, []int) { - return file_private_pbpeering_peering_proto_rawDescGZIP(), []int{29} + return file_private_pbpeering_peering_proto_rawDescGZIP(), []int{28} } // GenerateTokenRequest encodes a request to persist a peering establishment @@ -2028,7 +1968,7 @@ type SecretsWriteRequest_GenerateTokenRequest struct { func (x *SecretsWriteRequest_GenerateTokenRequest) Reset() { *x = SecretsWriteRequest_GenerateTokenRequest{} if protoimpl.UnsafeEnabled { - mi := &file_private_pbpeering_peering_proto_msgTypes[30] + mi := &file_private_pbpeering_peering_proto_msgTypes[29] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2041,7 +1981,7 @@ func (x *SecretsWriteRequest_GenerateTokenRequest) String() string { func (*SecretsWriteRequest_GenerateTokenRequest) ProtoMessage() {} func (x *SecretsWriteRequest_GenerateTokenRequest) ProtoReflect() protoreflect.Message { - mi := &file_private_pbpeering_peering_proto_msgTypes[30] + mi := &file_private_pbpeering_peering_proto_msgTypes[29] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2082,7 +2022,7 @@ type SecretsWriteRequest_ExchangeSecretRequest struct { func (x *SecretsWriteRequest_ExchangeSecretRequest) Reset() { *x = SecretsWriteRequest_ExchangeSecretRequest{} if protoimpl.UnsafeEnabled { - mi := &file_private_pbpeering_peering_proto_msgTypes[31] + mi := &file_private_pbpeering_peering_proto_msgTypes[30] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2095,7 +2035,7 @@ func (x *SecretsWriteRequest_ExchangeSecretRequest) String() string { func (*SecretsWriteRequest_ExchangeSecretRequest) ProtoMessage() {} func (x *SecretsWriteRequest_ExchangeSecretRequest) ProtoReflect() protoreflect.Message { - mi := &file_private_pbpeering_peering_proto_msgTypes[31] + mi := &file_private_pbpeering_peering_proto_msgTypes[30] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2141,7 +2081,7 @@ type SecretsWriteRequest_PromotePendingRequest struct { func (x *SecretsWriteRequest_PromotePendingRequest) Reset() { *x = SecretsWriteRequest_PromotePendingRequest{} if protoimpl.UnsafeEnabled { - mi := &file_private_pbpeering_peering_proto_msgTypes[32] + mi := &file_private_pbpeering_peering_proto_msgTypes[31] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2154,7 +2094,7 @@ func (x *SecretsWriteRequest_PromotePendingRequest) String() string { func (*SecretsWriteRequest_PromotePendingRequest) ProtoMessage() {} func (x *SecretsWriteRequest_PromotePendingRequest) ProtoReflect() protoreflect.Message { - mi := &file_private_pbpeering_peering_proto_msgTypes[32] + mi := &file_private_pbpeering_peering_proto_msgTypes[31] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2193,7 +2133,7 @@ type SecretsWriteRequest_EstablishRequest struct { func (x *SecretsWriteRequest_EstablishRequest) Reset() { *x = SecretsWriteRequest_EstablishRequest{} if protoimpl.UnsafeEnabled { - mi := &file_private_pbpeering_peering_proto_msgTypes[33] + mi := &file_private_pbpeering_peering_proto_msgTypes[32] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2206,7 +2146,7 @@ func (x *SecretsWriteRequest_EstablishRequest) String() string { func (*SecretsWriteRequest_EstablishRequest) ProtoMessage() {} func (x *SecretsWriteRequest_EstablishRequest) ProtoReflect() protoreflect.Message { - mi := &file_private_pbpeering_peering_proto_msgTypes[33] + mi := &file_private_pbpeering_peering_proto_msgTypes[32] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2241,7 +2181,7 @@ type PeeringSecrets_Establishment struct { func (x *PeeringSecrets_Establishment) Reset() { *x = PeeringSecrets_Establishment{} if protoimpl.UnsafeEnabled { - mi := &file_private_pbpeering_peering_proto_msgTypes[34] + mi := &file_private_pbpeering_peering_proto_msgTypes[33] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2254,7 +2194,7 @@ func (x *PeeringSecrets_Establishment) String() string { func (*PeeringSecrets_Establishment) ProtoMessage() {} func (x *PeeringSecrets_Establishment) ProtoReflect() protoreflect.Message { - mi := &file_private_pbpeering_peering_proto_msgTypes[34] + mi := &file_private_pbpeering_peering_proto_msgTypes[33] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2300,7 +2240,7 @@ type PeeringSecrets_Stream struct { func (x *PeeringSecrets_Stream) Reset() { *x = PeeringSecrets_Stream{} if protoimpl.UnsafeEnabled { - mi := &file_private_pbpeering_peering_proto_msgTypes[35] + mi := &file_private_pbpeering_peering_proto_msgTypes[34] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2313,7 +2253,7 @@ func (x *PeeringSecrets_Stream) String() string { func (*PeeringSecrets_Stream) ProtoMessage() {} func (x *PeeringSecrets_Stream) ProtoReflect() protoreflect.Message { - mi := &file_private_pbpeering_peering_proto_msgTypes[35] + mi := &file_private_pbpeering_peering_proto_msgTypes[34] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2354,423 +2294,421 @@ var file_private_pbpeering_peering_proto_rawDesc = []byte{ 0x73, 0x2f, 0x72, 0x61, 0x74, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x2f, 0x72, 0x61, 0x74, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, - 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xe5, 0x06, 0x0a, - 0x13, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x50, 0x65, 0x65, 0x72, 0x49, 0x44, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x50, 0x65, 0x65, 0x72, 0x49, 0x44, 0x12, 0x74, 0x0a, 0x0e, - 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x4b, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, - 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, - 0x2e, 0x70, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, - 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x47, 0x65, 0x6e, - 0x65, 0x72, 0x61, 0x74, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x48, 0x00, 0x52, 0x0d, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x54, 0x6f, 0x6b, - 0x65, 0x6e, 0x12, 0x77, 0x0a, 0x0f, 0x65, 0x78, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x73, - 0x65, 0x63, 0x72, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x4c, 0x2e, 0x68, 0x61, - 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, - 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x2e, + 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1d, 0x70, 0x72, + 0x69, 0x76, 0x61, 0x74, 0x65, 0x2f, 0x70, 0x62, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x63, + 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xe5, 0x06, 0x0a, 0x13, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x2e, 0x45, 0x78, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x53, 0x65, 0x63, 0x72, - 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x0e, 0x65, 0x78, 0x63, - 0x68, 0x61, 0x6e, 0x67, 0x65, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x12, 0x77, 0x0a, 0x0f, 0x70, - 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x5f, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x4c, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, - 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, - 0x2e, 0x70, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, - 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x72, 0x6f, - 0x6d, 0x6f, 0x74, 0x65, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x48, 0x00, 0x52, 0x0e, 0x70, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x50, 0x65, 0x6e, - 0x64, 0x69, 0x6e, 0x67, 0x12, 0x67, 0x0a, 0x09, 0x65, 0x73, 0x74, 0x61, 0x62, 0x6c, 0x69, 0x73, - 0x68, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x47, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, - 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, - 0x6e, 0x61, 0x6c, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x53, 0x65, 0x63, 0x72, - 0x65, 0x74, 0x73, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, - 0x45, 0x73, 0x74, 0x61, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x48, 0x00, 0x52, 0x09, 0x65, 0x73, 0x74, 0x61, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x1a, 0x49, 0x0a, - 0x14, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x31, 0x0a, 0x14, 0x65, 0x73, 0x74, 0x61, 0x62, 0x6c, 0x69, - 0x73, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x13, 0x65, 0x73, 0x74, 0x61, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x6d, 0x65, - 0x6e, 0x74, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x1a, 0x7e, 0x0a, 0x15, 0x45, 0x78, 0x63, 0x68, - 0x61, 0x6e, 0x67, 0x65, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x31, 0x0a, 0x14, 0x65, 0x73, 0x74, 0x61, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x6d, 0x65, - 0x6e, 0x74, 0x5f, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x13, 0x65, 0x73, 0x74, 0x61, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, - 0x63, 0x72, 0x65, 0x74, 0x12, 0x32, 0x0a, 0x15, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, - 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5f, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x13, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x72, 0x65, - 0x61, 0x6d, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x1a, 0x49, 0x0a, 0x15, 0x50, 0x72, 0x6f, 0x6d, + 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x50, 0x65, 0x65, 0x72, 0x49, 0x44, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x06, 0x50, 0x65, 0x65, 0x72, 0x49, 0x44, 0x12, 0x74, 0x0a, 0x0e, 0x67, + 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x4b, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, + 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, + 0x70, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x57, + 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x47, 0x65, 0x6e, 0x65, + 0x72, 0x61, 0x74, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x48, 0x00, 0x52, 0x0d, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x54, 0x6f, 0x6b, 0x65, + 0x6e, 0x12, 0x77, 0x0a, 0x0f, 0x65, 0x78, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x73, 0x65, + 0x63, 0x72, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x4c, 0x2e, 0x68, 0x61, 0x73, + 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, + 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x53, + 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x2e, 0x45, 0x78, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x53, 0x65, 0x63, 0x72, 0x65, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x0e, 0x65, 0x78, 0x63, 0x68, + 0x61, 0x6e, 0x67, 0x65, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x12, 0x77, 0x0a, 0x0f, 0x70, 0x72, + 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x5f, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x4c, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, + 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, + 0x70, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x57, + 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x30, 0x0a, 0x14, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x73, 0x74, 0x72, 0x65, - 0x61, 0x6d, 0x5f, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x12, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x53, 0x65, 0x63, - 0x72, 0x65, 0x74, 0x1a, 0x44, 0x0a, 0x10, 0x45, 0x73, 0x74, 0x61, 0x62, 0x6c, 0x69, 0x73, 0x68, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x30, 0x0a, 0x14, 0x61, 0x63, 0x74, 0x69, 0x76, - 0x65, 0x5f, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5f, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x53, 0x74, 0x72, - 0x65, 0x61, 0x6d, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x42, 0x09, 0x0a, 0x07, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x22, 0xea, 0x02, 0x0a, 0x0e, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, - 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x50, 0x65, 0x65, 0x72, 0x49, - 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x50, 0x65, 0x65, 0x72, 0x49, 0x44, 0x12, - 0x65, 0x0a, 0x0d, 0x65, 0x73, 0x74, 0x61, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x6d, 0x65, 0x6e, 0x74, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3f, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, + 0x74, 0x48, 0x00, 0x52, 0x0e, 0x70, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x50, 0x65, 0x6e, 0x64, + 0x69, 0x6e, 0x67, 0x12, 0x67, 0x0a, 0x09, 0x65, 0x73, 0x74, 0x61, 0x62, 0x6c, 0x69, 0x73, 0x68, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x47, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, - 0x61, 0x6c, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x69, - 0x6e, 0x67, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x2e, 0x45, 0x73, 0x74, 0x61, 0x62, 0x6c, - 0x69, 0x73, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0d, 0x65, 0x73, 0x74, 0x61, 0x62, 0x6c, 0x69, - 0x73, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x50, 0x0a, 0x06, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, - 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, - 0x61, 0x6c, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x69, - 0x6e, 0x67, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, - 0x52, 0x06, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x1a, 0x2b, 0x0a, 0x0d, 0x45, 0x73, 0x74, 0x61, - 0x62, 0x6c, 0x69, 0x73, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x53, 0x65, 0x63, - 0x72, 0x65, 0x74, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x53, 0x65, 0x63, - 0x72, 0x65, 0x74, 0x49, 0x44, 0x1a, 0x5a, 0x0a, 0x06, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x12, - 0x26, 0x0a, 0x0e, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x49, - 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x53, - 0x65, 0x63, 0x72, 0x65, 0x74, 0x49, 0x44, 0x12, 0x28, 0x0a, 0x0f, 0x50, 0x65, 0x6e, 0x64, 0x69, - 0x6e, 0x67, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0f, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x49, - 0x44, 0x22, 0xf7, 0x05, 0x0a, 0x07, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x0e, 0x0a, - 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, 0x12, 0x0a, - 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, - 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, - 0x38, 0x0a, 0x09, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, - 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x48, 0x0a, 0x04, 0x4d, 0x65, 0x74, - 0x61, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, - 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, - 0x6e, 0x61, 0x6c, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x50, 0x65, 0x65, 0x72, - 0x69, 0x6e, 0x67, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x4d, - 0x65, 0x74, 0x61, 0x12, 0x45, 0x0a, 0x05, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x0e, 0x32, 0x2f, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, - 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x70, - 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x53, 0x74, - 0x61, 0x74, 0x65, 0x52, 0x05, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x50, 0x65, - 0x65, 0x72, 0x49, 0x44, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x50, 0x65, 0x65, 0x72, - 0x49, 0x44, 0x12, 0x1e, 0x0a, 0x0a, 0x50, 0x65, 0x65, 0x72, 0x43, 0x41, 0x50, 0x65, 0x6d, 0x73, - 0x18, 0x08, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x50, 0x65, 0x65, 0x72, 0x43, 0x41, 0x50, 0x65, - 0x6d, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x50, 0x65, 0x65, 0x72, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, - 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x50, 0x65, 0x65, 0x72, - 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x30, 0x0a, 0x13, 0x50, 0x65, - 0x65, 0x72, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, - 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x09, 0x52, 0x13, 0x50, 0x65, 0x65, 0x72, 0x53, 0x65, 0x72, - 0x76, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x12, 0x53, 0x0a, 0x0c, - 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x0d, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, - 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x70, - 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x52, 0x0c, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, - 0x18, 0x0b, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x49, 0x6e, - 0x64, 0x65, 0x78, 0x12, 0x20, 0x0a, 0x0b, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x49, 0x6e, 0x64, - 0x65, 0x78, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, - 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x45, 0x0a, 0x06, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x18, - 0x11, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, + 0x61, 0x6c, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x53, 0x65, 0x63, 0x72, 0x65, + 0x74, 0x73, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x45, + 0x73, 0x74, 0x61, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, + 0x00, 0x52, 0x09, 0x65, 0x73, 0x74, 0x61, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x1a, 0x49, 0x0a, 0x14, + 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x31, 0x0a, 0x14, 0x65, 0x73, 0x74, 0x61, 0x62, 0x6c, 0x69, 0x73, + 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x13, 0x65, 0x73, 0x74, 0x61, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x6d, 0x65, 0x6e, + 0x74, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x1a, 0x7e, 0x0a, 0x15, 0x45, 0x78, 0x63, 0x68, 0x61, + 0x6e, 0x67, 0x65, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x31, 0x0a, 0x14, 0x65, 0x73, 0x74, 0x61, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x6d, 0x65, 0x6e, + 0x74, 0x5f, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, + 0x65, 0x73, 0x74, 0x61, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x63, + 0x72, 0x65, 0x74, 0x12, 0x32, 0x0a, 0x15, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x73, + 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5f, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x13, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x72, 0x65, 0x61, + 0x6d, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x1a, 0x49, 0x0a, 0x15, 0x50, 0x72, 0x6f, 0x6d, 0x6f, + 0x74, 0x65, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x30, 0x0a, 0x14, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x73, 0x74, 0x72, 0x65, 0x61, + 0x6d, 0x5f, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, + 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x53, 0x65, 0x63, 0x72, + 0x65, 0x74, 0x1a, 0x44, 0x0a, 0x10, 0x45, 0x73, 0x74, 0x61, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x30, 0x0a, 0x14, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, + 0x5f, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5f, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x53, 0x74, 0x72, 0x65, + 0x61, 0x6d, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x42, 0x09, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x22, 0xea, 0x02, 0x0a, 0x0e, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x53, + 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x50, 0x65, 0x65, 0x72, 0x49, 0x44, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x50, 0x65, 0x65, 0x72, 0x49, 0x44, 0x12, 0x65, + 0x0a, 0x0d, 0x65, 0x73, 0x74, 0x61, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3f, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, - 0x6c, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, - 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x06, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x12, 0x34, 0x0a, 0x15, - 0x4d, 0x61, 0x6e, 0x75, 0x61, 0x6c, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, - 0x65, 0x73, 0x73, 0x65, 0x73, 0x18, 0x12, 0x20, 0x03, 0x28, 0x09, 0x52, 0x15, 0x4d, 0x61, 0x6e, - 0x75, 0x61, 0x6c, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, - 0x65, 0x73, 0x1a, 0x37, 0x0a, 0x09, 0x4d, 0x65, 0x74, 0x61, 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, 0x22, 0x93, 0x01, 0x0a, 0x0a, - 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1c, 0x0a, 0x09, 0x50, 0x61, - 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x50, - 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x44, 0x61, 0x74, 0x61, - 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x44, 0x61, - 0x74, 0x61, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x12, 0x47, 0x0a, 0x08, 0x4c, 0x6f, 0x63, 0x61, - 0x6c, 0x69, 0x74, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x68, 0x61, 0x73, - 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, - 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x4c, - 0x6f, 0x63, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x52, 0x08, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x69, 0x74, - 0x79, 0x22, 0x36, 0x0a, 0x08, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x12, 0x16, 0x0a, - 0x06, 0x52, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x52, - 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x5a, 0x6f, 0x6e, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x5a, 0x6f, 0x6e, 0x65, 0x22, 0x9e, 0x02, 0x0a, 0x0c, 0x53, 0x74, - 0x72, 0x65, 0x61, 0x6d, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x2a, 0x0a, 0x10, 0x49, 0x6d, - 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x09, 0x52, 0x10, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x53, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x2a, 0x0a, 0x10, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, - 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, - 0x52, 0x10, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x73, 0x12, 0x40, 0x0a, 0x0d, 0x4c, 0x61, 0x73, 0x74, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, - 0x65, 0x61, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, - 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0d, 0x4c, 0x61, 0x73, 0x74, 0x48, 0x65, 0x61, 0x72, 0x74, - 0x62, 0x65, 0x61, 0x74, 0x12, 0x3c, 0x0a, 0x0b, 0x4c, 0x61, 0x73, 0x74, 0x52, 0x65, 0x63, 0x65, - 0x69, 0x76, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, - 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0b, 0x4c, 0x61, 0x73, 0x74, 0x52, 0x65, 0x63, 0x65, 0x69, - 0x76, 0x65, 0x12, 0x36, 0x0a, 0x08, 0x4c, 0x61, 0x73, 0x74, 0x53, 0x65, 0x6e, 0x64, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, - 0x52, 0x08, 0x4c, 0x61, 0x73, 0x74, 0x53, 0x65, 0x6e, 0x64, 0x22, 0xfe, 0x01, 0x0a, 0x12, 0x50, - 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x54, 0x72, 0x75, 0x73, 0x74, 0x42, 0x75, 0x6e, 0x64, 0x6c, - 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x54, 0x72, 0x75, 0x73, 0x74, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x54, 0x72, 0x75, 0x73, 0x74, 0x44, 0x6f, 0x6d, - 0x61, 0x69, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x50, 0x65, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x50, 0x65, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, - 0x1c, 0x0a, 0x09, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x09, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, - 0x08, 0x52, 0x6f, 0x6f, 0x74, 0x50, 0x45, 0x4d, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, - 0x08, 0x52, 0x6f, 0x6f, 0x74, 0x50, 0x45, 0x4d, 0x73, 0x12, 0x2c, 0x0a, 0x11, 0x45, 0x78, 0x70, - 0x6f, 0x72, 0x74, 0x65, 0x64, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x50, 0x61, - 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x06, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x43, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x20, 0x0a, 0x0b, 0x4d, 0x6f, 0x64, - 0x69, 0x66, 0x79, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x07, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, - 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x36, 0x0a, 0x16, 0x50, - 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, - 0x65, 0x73, 0x73, 0x65, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, - 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, - 0x73, 0x65, 0x73, 0x22, 0x46, 0x0a, 0x12, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x65, - 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, - 0x09, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x09, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x5b, 0x0a, 0x13, 0x50, - 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x44, 0x0a, 0x07, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, - 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, - 0x70, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x52, - 0x07, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x32, 0x0a, 0x12, 0x50, 0x65, 0x65, 0x72, - 0x69, 0x6e, 0x67, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, - 0x0a, 0x09, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x09, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x73, 0x0a, 0x13, - 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x46, 0x0a, 0x08, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, + 0x6c, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, + 0x67, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x2e, 0x45, 0x73, 0x74, 0x61, 0x62, 0x6c, 0x69, + 0x73, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0d, 0x65, 0x73, 0x74, 0x61, 0x62, 0x6c, 0x69, 0x73, + 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x50, 0x0a, 0x06, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, - 0x67, 0x52, 0x08, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x49, - 0x6e, 0x64, 0x65, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x49, 0x6e, 0x64, 0x65, - 0x78, 0x22, 0xca, 0x02, 0x0a, 0x13, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x57, 0x72, 0x69, - 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x44, 0x0a, 0x07, 0x50, 0x65, 0x65, - 0x72, 0x69, 0x6e, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x68, 0x61, 0x73, - 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, - 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x50, - 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x07, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x12, - 0x5e, 0x0a, 0x0e, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, - 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, - 0x6e, 0x61, 0x6c, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x53, 0x65, 0x63, 0x72, - 0x65, 0x74, 0x73, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, - 0x0e, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x54, 0x0a, 0x04, 0x4d, 0x65, 0x74, 0x61, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x40, 0x2e, + 0x67, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, + 0x06, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x1a, 0x2b, 0x0a, 0x0d, 0x45, 0x73, 0x74, 0x61, 0x62, + 0x6c, 0x69, 0x73, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x53, 0x65, 0x63, 0x72, + 0x65, 0x74, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x53, 0x65, 0x63, 0x72, + 0x65, 0x74, 0x49, 0x44, 0x1a, 0x5a, 0x0a, 0x06, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x12, 0x26, + 0x0a, 0x0e, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x49, 0x44, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x53, 0x65, + 0x63, 0x72, 0x65, 0x74, 0x49, 0x44, 0x12, 0x28, 0x0a, 0x0f, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, + 0x67, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0f, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x49, 0x44, + 0x22, 0xf7, 0x05, 0x0a, 0x07, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x0e, 0x0a, 0x02, + 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, 0x12, 0x0a, 0x04, + 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, + 0x12, 0x1c, 0x0a, 0x09, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x09, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x38, + 0x0a, 0x09, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x44, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x48, 0x0a, 0x04, 0x4d, 0x65, 0x74, 0x61, + 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, + 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, + 0x61, 0x6c, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x69, + 0x6e, 0x67, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x4d, 0x65, + 0x74, 0x61, 0x12, 0x45, 0x0a, 0x05, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x2f, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, + 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x70, 0x65, + 0x65, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, + 0x74, 0x65, 0x52, 0x05, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x50, 0x65, 0x65, + 0x72, 0x49, 0x44, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x50, 0x65, 0x65, 0x72, 0x49, + 0x44, 0x12, 0x1e, 0x0a, 0x0a, 0x50, 0x65, 0x65, 0x72, 0x43, 0x41, 0x50, 0x65, 0x6d, 0x73, 0x18, + 0x08, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x50, 0x65, 0x65, 0x72, 0x43, 0x41, 0x50, 0x65, 0x6d, + 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x50, 0x65, 0x65, 0x72, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x4e, + 0x61, 0x6d, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x50, 0x65, 0x65, 0x72, 0x53, + 0x65, 0x72, 0x76, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x30, 0x0a, 0x13, 0x50, 0x65, 0x65, + 0x72, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, + 0x18, 0x0a, 0x20, 0x03, 0x28, 0x09, 0x52, 0x13, 0x50, 0x65, 0x65, 0x72, 0x53, 0x65, 0x72, 0x76, + 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x12, 0x53, 0x0a, 0x0c, 0x53, + 0x74, 0x72, 0x65, 0x61, 0x6d, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x0d, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x2f, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, + 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x70, 0x65, + 0x65, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x52, 0x0c, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x12, 0x20, 0x0a, 0x0b, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x18, + 0x0b, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x64, + 0x65, 0x78, 0x12, 0x20, 0x0a, 0x0b, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x49, 0x6e, 0x64, 0x65, + 0x78, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x49, + 0x6e, 0x64, 0x65, 0x78, 0x12, 0x45, 0x0a, 0x06, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x18, 0x11, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, + 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, + 0x2e, 0x70, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x49, + 0x6e, 0x66, 0x6f, 0x52, 0x06, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x12, 0x34, 0x0a, 0x15, 0x4d, + 0x61, 0x6e, 0x75, 0x61, 0x6c, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, + 0x73, 0x73, 0x65, 0x73, 0x18, 0x12, 0x20, 0x03, 0x28, 0x09, 0x52, 0x15, 0x4d, 0x61, 0x6e, 0x75, + 0x61, 0x6c, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, + 0x73, 0x1a, 0x37, 0x0a, 0x09, 0x4d, 0x65, 0x74, 0x61, 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, 0x22, 0x92, 0x01, 0x0a, 0x0a, 0x52, + 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1c, 0x0a, 0x09, 0x50, 0x61, 0x72, + 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x50, 0x61, + 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x44, 0x61, 0x74, 0x61, 0x63, + 0x65, 0x6e, 0x74, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x44, 0x61, 0x74, + 0x61, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x12, 0x46, 0x0a, 0x08, 0x4c, 0x6f, 0x63, 0x61, 0x6c, + 0x69, 0x74, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x68, 0x61, 0x73, 0x68, + 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, + 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4c, 0x6f, 0x63, + 0x61, 0x6c, 0x69, 0x74, 0x79, 0x52, 0x08, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x22, + 0x9e, 0x02, 0x0a, 0x0c, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x12, 0x2a, 0x0a, 0x10, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x10, 0x49, 0x6d, 0x70, 0x6f, + 0x72, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x2a, 0x0a, 0x10, + 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, + 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x10, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x40, 0x0a, 0x0d, 0x4c, 0x61, 0x73, 0x74, + 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0d, 0x4c, 0x61, 0x73, + 0x74, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x12, 0x3c, 0x0a, 0x0b, 0x4c, 0x61, + 0x73, 0x74, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0b, 0x4c, 0x61, 0x73, + 0x74, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x12, 0x36, 0x0a, 0x08, 0x4c, 0x61, 0x73, 0x74, + 0x53, 0x65, 0x6e, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, + 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x08, 0x4c, 0x61, 0x73, 0x74, 0x53, 0x65, 0x6e, 0x64, + 0x22, 0xfe, 0x01, 0x0a, 0x12, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x54, 0x72, 0x75, 0x73, + 0x74, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x54, 0x72, 0x75, 0x73, 0x74, + 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x54, 0x72, + 0x75, 0x73, 0x74, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x50, 0x65, 0x65, + 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x50, 0x65, 0x65, + 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x52, 0x6f, 0x6f, 0x74, 0x50, 0x45, 0x4d, 0x73, 0x18, + 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x52, 0x6f, 0x6f, 0x74, 0x50, 0x45, 0x4d, 0x73, 0x12, + 0x2c, 0x0a, 0x11, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x50, 0x61, 0x72, 0x74, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x45, 0x78, 0x70, 0x6f, + 0x72, 0x74, 0x65, 0x64, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x20, 0x0a, + 0x0b, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x04, 0x52, 0x0b, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, + 0x20, 0x0a, 0x0b, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x07, + 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x49, 0x6e, 0x64, 0x65, + 0x78, 0x22, 0x36, 0x0a, 0x16, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x53, 0x65, 0x72, 0x76, + 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x41, + 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, + 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x22, 0x46, 0x0a, 0x12, 0x50, 0x65, 0x65, + 0x72, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, + 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x5b, 0x0a, 0x13, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x61, 0x64, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x44, 0x0a, 0x07, 0x50, 0x65, 0x65, 0x72, + 0x69, 0x6e, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x68, 0x61, 0x73, 0x68, + 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, + 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x50, 0x65, + 0x65, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x07, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x32, + 0x0a, 0x12, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x73, 0x0a, 0x13, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x4c, 0x69, 0x73, + 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x46, 0x0a, 0x08, 0x50, 0x65, 0x65, + 0x72, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x68, 0x61, + 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, + 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x2e, + 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x08, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, + 0x73, 0x12, 0x14, 0x0a, 0x05, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x05, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x22, 0xca, 0x02, 0x0a, 0x13, 0x50, 0x65, 0x65, 0x72, + 0x69, 0x6e, 0x67, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x44, 0x0a, 0x07, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x2a, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, + 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x70, 0x65, 0x65, + 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x07, 0x50, 0x65, + 0x65, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x5e, 0x0a, 0x0e, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x69, 0x6e, - 0x67, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, - 0x04, 0x4d, 0x65, 0x74, 0x61, 0x1a, 0x37, 0x0a, 0x09, 0x4d, 0x65, 0x74, 0x61, 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, 0x22, 0x16, - 0x0a, 0x14, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x48, 0x0a, 0x14, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, - 0x67, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, - 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, - 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, - 0x22, 0x17, 0x0a, 0x15, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x44, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x93, 0x01, 0x0a, 0x1f, 0x54, 0x72, - 0x75, 0x73, 0x74, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x79, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, - 0x0b, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0b, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, - 0x1c, 0x0a, 0x09, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x09, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1c, 0x0a, - 0x09, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x09, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x4b, - 0x69, 0x6e, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4b, 0x69, 0x6e, 0x64, 0x22, - 0x89, 0x01, 0x0a, 0x20, 0x54, 0x72, 0x75, 0x73, 0x74, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x4c, - 0x69, 0x73, 0x74, 0x42, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x04, 0x52, 0x05, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x4f, 0x0a, 0x07, 0x42, 0x75, - 0x6e, 0x64, 0x6c, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x68, 0x61, + 0x67, 0x2e, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x0e, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x54, 0x0a, 0x04, 0x4d, 0x65, 0x74, 0x61, 0x18, 0x03, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x40, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, + 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, + 0x70, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x57, + 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4d, 0x65, 0x74, 0x61, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x4d, 0x65, 0x74, 0x61, 0x1a, 0x37, 0x0a, 0x09, 0x4d, + 0x65, 0x74, 0x61, 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, 0x22, 0x16, 0x0a, 0x14, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x57, + 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x48, 0x0a, 0x14, + 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x50, 0x61, 0x72, 0x74, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x50, 0x61, 0x72, + 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x17, 0x0a, 0x15, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, + 0x67, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x93, 0x01, 0x0a, 0x1f, 0x54, 0x72, 0x75, 0x73, 0x74, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x4c, + 0x69, 0x73, 0x74, 0x42, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4e, 0x61, + 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, + 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x4b, 0x69, 0x6e, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x4b, 0x69, 0x6e, 0x64, 0x22, 0x89, 0x01, 0x0a, 0x20, 0x54, 0x72, 0x75, 0x73, 0x74, 0x42, + 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x49, 0x6e, + 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x49, 0x6e, 0x64, 0x65, 0x78, + 0x12, 0x4f, 0x0a, 0x07, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x35, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, + 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x70, 0x65, + 0x65, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x54, 0x72, 0x75, + 0x73, 0x74, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x52, 0x07, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, + 0x73, 0x22, 0x4a, 0x0a, 0x16, 0x54, 0x72, 0x75, 0x73, 0x74, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, + 0x52, 0x65, 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x4e, + 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, + 0x1c, 0x0a, 0x09, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x09, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x7e, 0x0a, + 0x17, 0x54, 0x72, 0x75, 0x73, 0x74, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x52, 0x65, 0x61, 0x64, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x49, 0x6e, 0x64, 0x65, + 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x4d, + 0x0a, 0x06, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x35, + 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, + 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x69, + 0x6e, 0x67, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x54, 0x72, 0x75, 0x73, 0x74, 0x42, + 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x52, 0x06, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x22, 0x2d, 0x0a, + 0x1b, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, + 0x65, 0x42, 0x79, 0x49, 0x44, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, + 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x22, 0x1e, 0x0a, 0x1c, + 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, + 0x42, 0x79, 0x49, 0x44, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x87, 0x01, 0x0a, + 0x1e, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x54, 0x72, 0x75, 0x73, 0x74, 0x42, 0x75, 0x6e, + 0x64, 0x6c, 0x65, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x65, 0x0a, 0x12, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x54, 0x72, 0x75, 0x73, 0x74, 0x42, + 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x54, 0x72, 0x75, 0x73, 0x74, 0x42, 0x75, 0x6e, 0x64, - 0x6c, 0x65, 0x52, 0x07, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x73, 0x22, 0x4a, 0x0a, 0x16, 0x54, - 0x72, 0x75, 0x73, 0x74, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x52, 0x65, 0x61, 0x64, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x50, 0x61, 0x72, - 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x50, 0x61, - 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x7e, 0x0a, 0x17, 0x54, 0x72, 0x75, 0x73, 0x74, - 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x52, 0x65, 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x04, 0x52, 0x05, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x4d, 0x0a, 0x06, 0x42, 0x75, 0x6e, 0x64, - 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, - 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, - 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x50, 0x65, 0x65, - 0x72, 0x69, 0x6e, 0x67, 0x54, 0x72, 0x75, 0x73, 0x74, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x52, - 0x06, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x22, 0x2d, 0x0a, 0x1b, 0x50, 0x65, 0x65, 0x72, 0x69, - 0x6e, 0x67, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x42, 0x79, 0x49, 0x44, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x22, 0x1e, 0x0a, 0x1c, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, - 0x67, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x42, 0x79, 0x49, 0x44, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x87, 0x01, 0x0a, 0x1e, 0x50, 0x65, 0x65, 0x72, 0x69, - 0x6e, 0x67, 0x54, 0x72, 0x75, 0x73, 0x74, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x57, 0x72, 0x69, - 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x65, 0x0a, 0x12, 0x50, 0x65, 0x65, - 0x72, 0x69, 0x6e, 0x67, 0x54, 0x72, 0x75, 0x73, 0x74, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, - 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, - 0x6c, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, - 0x67, 0x54, 0x72, 0x75, 0x73, 0x74, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x52, 0x12, 0x50, 0x65, - 0x65, 0x72, 0x69, 0x6e, 0x67, 0x54, 0x72, 0x75, 0x73, 0x74, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, - 0x22, 0x21, 0x0a, 0x1f, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x54, 0x72, 0x75, 0x73, 0x74, - 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x53, 0x0a, 0x1f, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x54, 0x72, - 0x75, 0x73, 0x74, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x50, 0x61, - 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x50, - 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x22, 0x0a, 0x20, 0x50, 0x65, 0x65, 0x72, - 0x69, 0x6e, 0x67, 0x54, 0x72, 0x75, 0x73, 0x74, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x44, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x9a, 0x02, 0x0a, - 0x14, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x50, 0x65, 0x65, 0x72, 0x4e, 0x61, 0x6d, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x50, 0x65, 0x65, 0x72, 0x4e, 0x61, 0x6d, - 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, + 0x6c, 0x65, 0x52, 0x12, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x54, 0x72, 0x75, 0x73, 0x74, + 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x22, 0x21, 0x0a, 0x1f, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, + 0x67, 0x54, 0x72, 0x75, 0x73, 0x74, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x57, 0x72, 0x69, 0x74, + 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x53, 0x0a, 0x1f, 0x50, 0x65, 0x65, + 0x72, 0x69, 0x6e, 0x67, 0x54, 0x72, 0x75, 0x73, 0x74, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x44, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, + 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, + 0x12, 0x1c, 0x0a, 0x09, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x09, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x22, + 0x0a, 0x20, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x54, 0x72, 0x75, 0x73, 0x74, 0x42, 0x75, + 0x6e, 0x64, 0x6c, 0x65, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x9a, 0x02, 0x0a, 0x14, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x54, + 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x50, + 0x65, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x50, + 0x65, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x50, 0x61, 0x72, 0x74, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x50, 0x61, 0x72, 0x74, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x55, 0x0a, 0x04, 0x4d, 0x65, 0x74, 0x61, 0x18, 0x05, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x41, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, + 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, + 0x70, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, + 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4d, 0x65, 0x74, + 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x38, 0x0a, 0x17, + 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x41, 0x64, + 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x17, 0x53, + 0x65, 0x72, 0x76, 0x65, 0x72, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x41, 0x64, 0x64, + 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x1a, 0x37, 0x0a, 0x09, 0x4d, 0x65, 0x74, 0x61, 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, 0x22, + 0x3b, 0x0a, 0x15, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x50, 0x65, 0x65, 0x72, + 0x69, 0x6e, 0x67, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, + 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0xfc, 0x01, 0x0a, + 0x10, 0x45, 0x73, 0x74, 0x61, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x50, 0x65, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x50, 0x65, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x22, 0x0a, + 0x0c, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0c, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x54, 0x6f, 0x6b, 0x65, + 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, - 0x55, 0x0a, 0x04, 0x4d, 0x65, 0x74, 0x61, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x41, 0x2e, + 0x51, 0x0a, 0x04, 0x4d, 0x65, 0x74, 0x61, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3d, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x69, 0x6e, - 0x67, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x52, 0x04, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x38, 0x0a, 0x17, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, - 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, - 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x17, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x45, - 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, - 0x1a, 0x37, 0x0a, 0x09, 0x4d, 0x65, 0x74, 0x61, 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, 0x22, 0x3b, 0x0a, 0x15, 0x47, 0x65, 0x6e, - 0x65, 0x72, 0x61, 0x74, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x54, 0x6f, 0x6b, - 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, - 0x67, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0xfc, 0x01, 0x0a, 0x10, 0x45, 0x73, 0x74, 0x61, 0x62, - 0x6c, 0x69, 0x73, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x50, - 0x65, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x50, - 0x65, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x50, 0x65, 0x65, 0x72, 0x69, - 0x6e, 0x67, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x50, - 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x50, - 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, - 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x51, 0x0a, 0x04, 0x4d, 0x65, 0x74, - 0x61, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3d, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, + 0x67, 0x2e, 0x45, 0x73, 0x74, 0x61, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x4d, 0x65, + 0x74, 0x61, 0x1a, 0x37, 0x0a, 0x09, 0x4d, 0x65, 0x74, 0x61, 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, 0x22, 0x13, 0x0a, 0x11, 0x45, + 0x73, 0x74, 0x61, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x2a, 0x73, 0x0a, 0x0c, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, + 0x12, 0x0d, 0x0a, 0x09, 0x55, 0x4e, 0x44, 0x45, 0x46, 0x49, 0x4e, 0x45, 0x44, 0x10, 0x00, 0x12, + 0x0b, 0x0a, 0x07, 0x50, 0x45, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x10, 0x0a, 0x0c, + 0x45, 0x53, 0x54, 0x41, 0x42, 0x4c, 0x49, 0x53, 0x48, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x12, 0x0a, + 0x0a, 0x06, 0x41, 0x43, 0x54, 0x49, 0x56, 0x45, 0x10, 0x03, 0x12, 0x0b, 0x0a, 0x07, 0x46, 0x41, + 0x49, 0x4c, 0x49, 0x4e, 0x47, 0x10, 0x04, 0x12, 0x0c, 0x0a, 0x08, 0x44, 0x45, 0x4c, 0x45, 0x54, + 0x49, 0x4e, 0x47, 0x10, 0x05, 0x12, 0x0e, 0x0a, 0x0a, 0x54, 0x45, 0x52, 0x4d, 0x49, 0x4e, 0x41, + 0x54, 0x45, 0x44, 0x10, 0x06, 0x32, 0x83, 0x09, 0x0a, 0x0e, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, + 0x67, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x8a, 0x01, 0x0a, 0x0d, 0x47, 0x65, 0x6e, + 0x65, 0x72, 0x61, 0x74, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x37, 0x2e, 0x68, 0x61, 0x73, + 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, + 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x47, + 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x38, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, + 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, + 0x70, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, + 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xe2, + 0x86, 0x04, 0x02, 0x08, 0x03, 0x12, 0x7e, 0x0a, 0x09, 0x45, 0x73, 0x74, 0x61, 0x62, 0x6c, 0x69, + 0x73, 0x68, 0x12, 0x33, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, + 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x70, + 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x45, 0x73, 0x74, 0x61, 0x62, 0x6c, 0x69, 0x73, 0x68, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x34, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x45, 0x73, 0x74, 0x61, - 0x62, 0x6c, 0x69, 0x73, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4d, 0x65, 0x74, - 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x4d, 0x65, 0x74, 0x61, 0x1a, 0x37, 0x0a, 0x09, - 0x4d, 0x65, 0x74, 0x61, 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, 0x22, 0x13, 0x0a, 0x11, 0x45, 0x73, 0x74, 0x61, 0x62, 0x6c, 0x69, - 0x73, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2a, 0x73, 0x0a, 0x0c, 0x50, 0x65, - 0x65, 0x72, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x0d, 0x0a, 0x09, 0x55, 0x4e, - 0x44, 0x45, 0x46, 0x49, 0x4e, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x50, 0x45, 0x4e, - 0x44, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x10, 0x0a, 0x0c, 0x45, 0x53, 0x54, 0x41, 0x42, 0x4c, - 0x49, 0x53, 0x48, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x12, 0x0a, 0x0a, 0x06, 0x41, 0x43, 0x54, 0x49, - 0x56, 0x45, 0x10, 0x03, 0x12, 0x0b, 0x0a, 0x07, 0x46, 0x41, 0x49, 0x4c, 0x49, 0x4e, 0x47, 0x10, - 0x04, 0x12, 0x0c, 0x0a, 0x08, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x49, 0x4e, 0x47, 0x10, 0x05, 0x12, - 0x0e, 0x0a, 0x0a, 0x54, 0x45, 0x52, 0x4d, 0x49, 0x4e, 0x41, 0x54, 0x45, 0x44, 0x10, 0x06, 0x32, - 0x83, 0x09, 0x0a, 0x0e, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x12, 0x8a, 0x01, 0x0a, 0x0d, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x54, - 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x37, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, - 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, - 0x2e, 0x70, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, - 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x38, 0x2e, - 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, - 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x69, 0x6e, - 0x67, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xe2, 0x86, 0x04, 0x02, 0x08, 0x03, 0x12, - 0x7e, 0x0a, 0x09, 0x45, 0x73, 0x74, 0x61, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x12, 0x33, 0x2e, 0x68, + 0x62, 0x6c, 0x69, 0x73, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xe2, + 0x86, 0x04, 0x02, 0x08, 0x03, 0x12, 0x84, 0x01, 0x0a, 0x0b, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, + 0x67, 0x52, 0x65, 0x61, 0x64, 0x12, 0x35, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, + 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, + 0x6c, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, + 0x67, 0x52, 0x65, 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x36, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, - 0x2e, 0x45, 0x73, 0x74, 0x61, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x34, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, - 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x70, 0x65, - 0x65, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x45, 0x73, 0x74, 0x61, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xe2, 0x86, 0x04, 0x02, 0x08, 0x03, 0x12, - 0x84, 0x01, 0x0a, 0x0b, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x61, 0x64, 0x12, - 0x35, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, - 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x70, 0x65, 0x65, 0x72, - 0x69, 0x6e, 0x67, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x61, 0x64, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x36, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, - 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, - 0x61, 0x6c, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x69, - 0x6e, 0x67, 0x52, 0x65, 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, - 0xe2, 0x86, 0x04, 0x02, 0x08, 0x02, 0x12, 0x84, 0x01, 0x0a, 0x0b, 0x50, 0x65, 0x65, 0x72, 0x69, - 0x6e, 0x67, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x35, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, - 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, - 0x61, 0x6c, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x69, - 0x6e, 0x67, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x36, 0x2e, - 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, - 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x69, 0x6e, - 0x67, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xe2, 0x86, 0x04, 0x02, 0x08, 0x02, 0x12, 0x8a, 0x01, - 0x0a, 0x0d, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, - 0x37, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, - 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x70, 0x65, 0x65, 0x72, - 0x69, 0x6e, 0x67, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x44, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x38, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, - 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, - 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x50, 0x65, 0x65, - 0x72, 0x69, 0x6e, 0x67, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x06, 0xe2, 0x86, 0x04, 0x02, 0x08, 0x03, 0x12, 0x87, 0x01, 0x0a, 0x0c, 0x50, - 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x57, 0x72, 0x69, 0x74, 0x65, 0x12, 0x36, 0x2e, 0x68, 0x61, - 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, - 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x2e, - 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x37, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, + 0x2e, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xe2, 0x86, 0x04, 0x02, 0x08, 0x02, 0x12, 0x84, 0x01, 0x0a, + 0x0b, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x35, 0x2e, 0x68, + 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, + 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, + 0x2e, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x36, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, - 0x70, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x57, - 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xe2, 0x86, - 0x04, 0x02, 0x08, 0x03, 0x12, 0xab, 0x01, 0x0a, 0x18, 0x54, 0x72, 0x75, 0x73, 0x74, 0x42, 0x75, - 0x6e, 0x64, 0x6c, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x12, 0x42, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, - 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x70, 0x65, - 0x65, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x54, 0x72, 0x75, 0x73, 0x74, 0x42, 0x75, 0x6e, 0x64, 0x6c, - 0x65, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x43, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, + 0x70, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x4c, + 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xe2, 0x86, 0x04, + 0x02, 0x08, 0x02, 0x12, 0x8a, 0x01, 0x0a, 0x0d, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x44, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x37, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, - 0x6c, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x54, 0x72, 0x75, 0x73, 0x74, 0x42, - 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xe2, 0x86, 0x04, 0x02, - 0x08, 0x02, 0x12, 0x90, 0x01, 0x0a, 0x0f, 0x54, 0x72, 0x75, 0x73, 0x74, 0x42, 0x75, 0x6e, 0x64, - 0x6c, 0x65, 0x52, 0x65, 0x61, 0x64, 0x12, 0x39, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, - 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, - 0x61, 0x6c, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x54, 0x72, 0x75, 0x73, 0x74, - 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x52, 0x65, 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x3a, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, + 0x6c, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, + 0x67, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x38, + 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, + 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x69, + 0x6e, 0x67, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xe2, 0x86, 0x04, 0x02, 0x08, 0x03, + 0x12, 0x87, 0x01, 0x0a, 0x0c, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x57, 0x72, 0x69, 0x74, + 0x65, 0x12, 0x36, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x70, 0x65, - 0x65, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x54, 0x72, 0x75, 0x73, 0x74, 0x42, 0x75, 0x6e, 0x64, 0x6c, - 0x65, 0x52, 0x65, 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xe2, - 0x86, 0x04, 0x02, 0x08, 0x02, 0x42, 0x92, 0x02, 0x0a, 0x25, 0x63, 0x6f, 0x6d, 0x2e, 0x68, 0x61, + 0x65, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x57, 0x72, 0x69, + 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x37, 0x2e, 0x68, 0x61, 0x73, 0x68, + 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, + 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x50, 0x65, + 0x65, 0x72, 0x69, 0x6e, 0x67, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x06, 0xe2, 0x86, 0x04, 0x02, 0x08, 0x03, 0x12, 0xab, 0x01, 0x0a, 0x18, 0x54, + 0x72, 0x75, 0x73, 0x74, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x79, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x42, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, + 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, + 0x6e, 0x61, 0x6c, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x54, 0x72, 0x75, 0x73, + 0x74, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x79, 0x53, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x43, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, - 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x42, - 0x0c, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, - 0x33, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x68, 0x61, 0x73, 0x68, - 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2f, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x2f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2f, 0x70, 0x62, 0x70, 0x65, 0x65, - 0x72, 0x69, 0x6e, 0x67, 0xa2, 0x02, 0x04, 0x48, 0x43, 0x49, 0x50, 0xaa, 0x02, 0x21, 0x48, 0x61, - 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x49, - 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0xca, - 0x02, 0x21, 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x5c, 0x43, 0x6f, 0x6e, 0x73, - 0x75, 0x6c, 0x5c, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5c, 0x50, 0x65, 0x65, 0x72, - 0x69, 0x6e, 0x67, 0xe2, 0x02, 0x2d, 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x5c, - 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x5c, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5c, - 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, - 0x61, 0x74, 0x61, 0xea, 0x02, 0x24, 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x3a, - 0x3a, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x3a, 0x3a, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, - 0x6c, 0x3a, 0x3a, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x33, + 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x2e, + 0x54, 0x72, 0x75, 0x73, 0x74, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x42, + 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x06, 0xe2, 0x86, 0x04, 0x02, 0x08, 0x02, 0x12, 0x90, 0x01, 0x0a, 0x0f, 0x54, 0x72, 0x75, + 0x73, 0x74, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x52, 0x65, 0x61, 0x64, 0x12, 0x39, 0x2e, 0x68, + 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, + 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, + 0x2e, 0x54, 0x72, 0x75, 0x73, 0x74, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x52, 0x65, 0x61, 0x64, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3a, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, + 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, + 0x6e, 0x61, 0x6c, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x54, 0x72, 0x75, 0x73, + 0x74, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x52, 0x65, 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x06, 0xe2, 0x86, 0x04, 0x02, 0x08, 0x02, 0x42, 0x92, 0x02, 0x0a, 0x25, + 0x63, 0x6f, 0x6d, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, + 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x70, 0x65, + 0x65, 0x72, 0x69, 0x6e, 0x67, 0x42, 0x0c, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x50, 0x72, + 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x33, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, + 0x6d, 0x2f, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2f, 0x63, 0x6f, 0x6e, 0x73, + 0x75, 0x6c, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, + 0x2f, 0x70, 0x62, 0x70, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0xa2, 0x02, 0x04, 0x48, 0x43, 0x49, + 0x50, 0xaa, 0x02, 0x21, 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x43, 0x6f, + 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x50, 0x65, + 0x65, 0x72, 0x69, 0x6e, 0x67, 0xca, 0x02, 0x21, 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, + 0x70, 0x5c, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x5c, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, + 0x6c, 0x5c, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0xe2, 0x02, 0x2d, 0x48, 0x61, 0x73, 0x68, + 0x69, 0x63, 0x6f, 0x72, 0x70, 0x5c, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x5c, 0x49, 0x6e, 0x74, + 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5c, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x5c, 0x47, 0x50, + 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x24, 0x48, 0x61, 0x73, 0x68, + 0x69, 0x63, 0x6f, 0x72, 0x70, 0x3a, 0x3a, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x3a, 0x3a, 0x49, + 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x3a, 0x3a, 0x50, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, + 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -2786,93 +2724,93 @@ func file_private_pbpeering_peering_proto_rawDescGZIP() []byte { } var file_private_pbpeering_peering_proto_enumTypes = make([]protoimpl.EnumInfo, 1) -var file_private_pbpeering_peering_proto_msgTypes = make([]protoimpl.MessageInfo, 40) +var file_private_pbpeering_peering_proto_msgTypes = make([]protoimpl.MessageInfo, 39) var file_private_pbpeering_peering_proto_goTypes = []interface{}{ (PeeringState)(0), // 0: hashicorp.consul.internal.peering.PeeringState (*SecretsWriteRequest)(nil), // 1: hashicorp.consul.internal.peering.SecretsWriteRequest (*PeeringSecrets)(nil), // 2: hashicorp.consul.internal.peering.PeeringSecrets (*Peering)(nil), // 3: hashicorp.consul.internal.peering.Peering (*RemoteInfo)(nil), // 4: hashicorp.consul.internal.peering.RemoteInfo - (*Locality)(nil), // 5: hashicorp.consul.internal.peering.Locality - (*StreamStatus)(nil), // 6: hashicorp.consul.internal.peering.StreamStatus - (*PeeringTrustBundle)(nil), // 7: hashicorp.consul.internal.peering.PeeringTrustBundle - (*PeeringServerAddresses)(nil), // 8: hashicorp.consul.internal.peering.PeeringServerAddresses - (*PeeringReadRequest)(nil), // 9: hashicorp.consul.internal.peering.PeeringReadRequest - (*PeeringReadResponse)(nil), // 10: hashicorp.consul.internal.peering.PeeringReadResponse - (*PeeringListRequest)(nil), // 11: hashicorp.consul.internal.peering.PeeringListRequest - (*PeeringListResponse)(nil), // 12: hashicorp.consul.internal.peering.PeeringListResponse - (*PeeringWriteRequest)(nil), // 13: hashicorp.consul.internal.peering.PeeringWriteRequest - (*PeeringWriteResponse)(nil), // 14: hashicorp.consul.internal.peering.PeeringWriteResponse - (*PeeringDeleteRequest)(nil), // 15: hashicorp.consul.internal.peering.PeeringDeleteRequest - (*PeeringDeleteResponse)(nil), // 16: hashicorp.consul.internal.peering.PeeringDeleteResponse - (*TrustBundleListByServiceRequest)(nil), // 17: hashicorp.consul.internal.peering.TrustBundleListByServiceRequest - (*TrustBundleListByServiceResponse)(nil), // 18: hashicorp.consul.internal.peering.TrustBundleListByServiceResponse - (*TrustBundleReadRequest)(nil), // 19: hashicorp.consul.internal.peering.TrustBundleReadRequest - (*TrustBundleReadResponse)(nil), // 20: hashicorp.consul.internal.peering.TrustBundleReadResponse - (*PeeringTerminateByIDRequest)(nil), // 21: hashicorp.consul.internal.peering.PeeringTerminateByIDRequest - (*PeeringTerminateByIDResponse)(nil), // 22: hashicorp.consul.internal.peering.PeeringTerminateByIDResponse - (*PeeringTrustBundleWriteRequest)(nil), // 23: hashicorp.consul.internal.peering.PeeringTrustBundleWriteRequest - (*PeeringTrustBundleWriteResponse)(nil), // 24: hashicorp.consul.internal.peering.PeeringTrustBundleWriteResponse - (*PeeringTrustBundleDeleteRequest)(nil), // 25: hashicorp.consul.internal.peering.PeeringTrustBundleDeleteRequest - (*PeeringTrustBundleDeleteResponse)(nil), // 26: hashicorp.consul.internal.peering.PeeringTrustBundleDeleteResponse - (*GenerateTokenRequest)(nil), // 27: hashicorp.consul.internal.peering.GenerateTokenRequest - (*GenerateTokenResponse)(nil), // 28: hashicorp.consul.internal.peering.GenerateTokenResponse - (*EstablishRequest)(nil), // 29: hashicorp.consul.internal.peering.EstablishRequest - (*EstablishResponse)(nil), // 30: hashicorp.consul.internal.peering.EstablishResponse - (*SecretsWriteRequest_GenerateTokenRequest)(nil), // 31: hashicorp.consul.internal.peering.SecretsWriteRequest.GenerateTokenRequest - (*SecretsWriteRequest_ExchangeSecretRequest)(nil), // 32: hashicorp.consul.internal.peering.SecretsWriteRequest.ExchangeSecretRequest - (*SecretsWriteRequest_PromotePendingRequest)(nil), // 33: hashicorp.consul.internal.peering.SecretsWriteRequest.PromotePendingRequest - (*SecretsWriteRequest_EstablishRequest)(nil), // 34: hashicorp.consul.internal.peering.SecretsWriteRequest.EstablishRequest - (*PeeringSecrets_Establishment)(nil), // 35: hashicorp.consul.internal.peering.PeeringSecrets.Establishment - (*PeeringSecrets_Stream)(nil), // 36: hashicorp.consul.internal.peering.PeeringSecrets.Stream - nil, // 37: hashicorp.consul.internal.peering.Peering.MetaEntry - nil, // 38: hashicorp.consul.internal.peering.PeeringWriteRequest.MetaEntry - nil, // 39: hashicorp.consul.internal.peering.GenerateTokenRequest.MetaEntry - nil, // 40: hashicorp.consul.internal.peering.EstablishRequest.MetaEntry - (*timestamppb.Timestamp)(nil), // 41: google.protobuf.Timestamp + (*StreamStatus)(nil), // 5: hashicorp.consul.internal.peering.StreamStatus + (*PeeringTrustBundle)(nil), // 6: hashicorp.consul.internal.peering.PeeringTrustBundle + (*PeeringServerAddresses)(nil), // 7: hashicorp.consul.internal.peering.PeeringServerAddresses + (*PeeringReadRequest)(nil), // 8: hashicorp.consul.internal.peering.PeeringReadRequest + (*PeeringReadResponse)(nil), // 9: hashicorp.consul.internal.peering.PeeringReadResponse + (*PeeringListRequest)(nil), // 10: hashicorp.consul.internal.peering.PeeringListRequest + (*PeeringListResponse)(nil), // 11: hashicorp.consul.internal.peering.PeeringListResponse + (*PeeringWriteRequest)(nil), // 12: hashicorp.consul.internal.peering.PeeringWriteRequest + (*PeeringWriteResponse)(nil), // 13: hashicorp.consul.internal.peering.PeeringWriteResponse + (*PeeringDeleteRequest)(nil), // 14: hashicorp.consul.internal.peering.PeeringDeleteRequest + (*PeeringDeleteResponse)(nil), // 15: hashicorp.consul.internal.peering.PeeringDeleteResponse + (*TrustBundleListByServiceRequest)(nil), // 16: hashicorp.consul.internal.peering.TrustBundleListByServiceRequest + (*TrustBundleListByServiceResponse)(nil), // 17: hashicorp.consul.internal.peering.TrustBundleListByServiceResponse + (*TrustBundleReadRequest)(nil), // 18: hashicorp.consul.internal.peering.TrustBundleReadRequest + (*TrustBundleReadResponse)(nil), // 19: hashicorp.consul.internal.peering.TrustBundleReadResponse + (*PeeringTerminateByIDRequest)(nil), // 20: hashicorp.consul.internal.peering.PeeringTerminateByIDRequest + (*PeeringTerminateByIDResponse)(nil), // 21: hashicorp.consul.internal.peering.PeeringTerminateByIDResponse + (*PeeringTrustBundleWriteRequest)(nil), // 22: hashicorp.consul.internal.peering.PeeringTrustBundleWriteRequest + (*PeeringTrustBundleWriteResponse)(nil), // 23: hashicorp.consul.internal.peering.PeeringTrustBundleWriteResponse + (*PeeringTrustBundleDeleteRequest)(nil), // 24: hashicorp.consul.internal.peering.PeeringTrustBundleDeleteRequest + (*PeeringTrustBundleDeleteResponse)(nil), // 25: hashicorp.consul.internal.peering.PeeringTrustBundleDeleteResponse + (*GenerateTokenRequest)(nil), // 26: hashicorp.consul.internal.peering.GenerateTokenRequest + (*GenerateTokenResponse)(nil), // 27: hashicorp.consul.internal.peering.GenerateTokenResponse + (*EstablishRequest)(nil), // 28: hashicorp.consul.internal.peering.EstablishRequest + (*EstablishResponse)(nil), // 29: hashicorp.consul.internal.peering.EstablishResponse + (*SecretsWriteRequest_GenerateTokenRequest)(nil), // 30: hashicorp.consul.internal.peering.SecretsWriteRequest.GenerateTokenRequest + (*SecretsWriteRequest_ExchangeSecretRequest)(nil), // 31: hashicorp.consul.internal.peering.SecretsWriteRequest.ExchangeSecretRequest + (*SecretsWriteRequest_PromotePendingRequest)(nil), // 32: hashicorp.consul.internal.peering.SecretsWriteRequest.PromotePendingRequest + (*SecretsWriteRequest_EstablishRequest)(nil), // 33: hashicorp.consul.internal.peering.SecretsWriteRequest.EstablishRequest + (*PeeringSecrets_Establishment)(nil), // 34: hashicorp.consul.internal.peering.PeeringSecrets.Establishment + (*PeeringSecrets_Stream)(nil), // 35: hashicorp.consul.internal.peering.PeeringSecrets.Stream + nil, // 36: hashicorp.consul.internal.peering.Peering.MetaEntry + nil, // 37: hashicorp.consul.internal.peering.PeeringWriteRequest.MetaEntry + nil, // 38: hashicorp.consul.internal.peering.GenerateTokenRequest.MetaEntry + nil, // 39: hashicorp.consul.internal.peering.EstablishRequest.MetaEntry + (*timestamppb.Timestamp)(nil), // 40: google.protobuf.Timestamp + (*pbcommon.Locality)(nil), // 41: hashicorp.consul.internal.common.Locality } var file_private_pbpeering_peering_proto_depIdxs = []int32{ - 31, // 0: hashicorp.consul.internal.peering.SecretsWriteRequest.generate_token:type_name -> hashicorp.consul.internal.peering.SecretsWriteRequest.GenerateTokenRequest - 32, // 1: hashicorp.consul.internal.peering.SecretsWriteRequest.exchange_secret:type_name -> hashicorp.consul.internal.peering.SecretsWriteRequest.ExchangeSecretRequest - 33, // 2: hashicorp.consul.internal.peering.SecretsWriteRequest.promote_pending:type_name -> hashicorp.consul.internal.peering.SecretsWriteRequest.PromotePendingRequest - 34, // 3: hashicorp.consul.internal.peering.SecretsWriteRequest.establish:type_name -> hashicorp.consul.internal.peering.SecretsWriteRequest.EstablishRequest - 35, // 4: hashicorp.consul.internal.peering.PeeringSecrets.establishment:type_name -> hashicorp.consul.internal.peering.PeeringSecrets.Establishment - 36, // 5: hashicorp.consul.internal.peering.PeeringSecrets.stream:type_name -> hashicorp.consul.internal.peering.PeeringSecrets.Stream - 41, // 6: hashicorp.consul.internal.peering.Peering.DeletedAt:type_name -> google.protobuf.Timestamp - 37, // 7: hashicorp.consul.internal.peering.Peering.Meta:type_name -> hashicorp.consul.internal.peering.Peering.MetaEntry + 30, // 0: hashicorp.consul.internal.peering.SecretsWriteRequest.generate_token:type_name -> hashicorp.consul.internal.peering.SecretsWriteRequest.GenerateTokenRequest + 31, // 1: hashicorp.consul.internal.peering.SecretsWriteRequest.exchange_secret:type_name -> hashicorp.consul.internal.peering.SecretsWriteRequest.ExchangeSecretRequest + 32, // 2: hashicorp.consul.internal.peering.SecretsWriteRequest.promote_pending:type_name -> hashicorp.consul.internal.peering.SecretsWriteRequest.PromotePendingRequest + 33, // 3: hashicorp.consul.internal.peering.SecretsWriteRequest.establish:type_name -> hashicorp.consul.internal.peering.SecretsWriteRequest.EstablishRequest + 34, // 4: hashicorp.consul.internal.peering.PeeringSecrets.establishment:type_name -> hashicorp.consul.internal.peering.PeeringSecrets.Establishment + 35, // 5: hashicorp.consul.internal.peering.PeeringSecrets.stream:type_name -> hashicorp.consul.internal.peering.PeeringSecrets.Stream + 40, // 6: hashicorp.consul.internal.peering.Peering.DeletedAt:type_name -> google.protobuf.Timestamp + 36, // 7: hashicorp.consul.internal.peering.Peering.Meta:type_name -> hashicorp.consul.internal.peering.Peering.MetaEntry 0, // 8: hashicorp.consul.internal.peering.Peering.State:type_name -> hashicorp.consul.internal.peering.PeeringState - 6, // 9: hashicorp.consul.internal.peering.Peering.StreamStatus:type_name -> hashicorp.consul.internal.peering.StreamStatus + 5, // 9: hashicorp.consul.internal.peering.Peering.StreamStatus:type_name -> hashicorp.consul.internal.peering.StreamStatus 4, // 10: hashicorp.consul.internal.peering.Peering.Remote:type_name -> hashicorp.consul.internal.peering.RemoteInfo - 5, // 11: hashicorp.consul.internal.peering.RemoteInfo.Locality:type_name -> hashicorp.consul.internal.peering.Locality - 41, // 12: hashicorp.consul.internal.peering.StreamStatus.LastHeartbeat:type_name -> google.protobuf.Timestamp - 41, // 13: hashicorp.consul.internal.peering.StreamStatus.LastReceive:type_name -> google.protobuf.Timestamp - 41, // 14: hashicorp.consul.internal.peering.StreamStatus.LastSend:type_name -> google.protobuf.Timestamp + 41, // 11: hashicorp.consul.internal.peering.RemoteInfo.Locality:type_name -> hashicorp.consul.internal.common.Locality + 40, // 12: hashicorp.consul.internal.peering.StreamStatus.LastHeartbeat:type_name -> google.protobuf.Timestamp + 40, // 13: hashicorp.consul.internal.peering.StreamStatus.LastReceive:type_name -> google.protobuf.Timestamp + 40, // 14: hashicorp.consul.internal.peering.StreamStatus.LastSend:type_name -> google.protobuf.Timestamp 3, // 15: hashicorp.consul.internal.peering.PeeringReadResponse.Peering:type_name -> hashicorp.consul.internal.peering.Peering 3, // 16: hashicorp.consul.internal.peering.PeeringListResponse.Peerings:type_name -> hashicorp.consul.internal.peering.Peering 3, // 17: hashicorp.consul.internal.peering.PeeringWriteRequest.Peering:type_name -> hashicorp.consul.internal.peering.Peering 1, // 18: hashicorp.consul.internal.peering.PeeringWriteRequest.SecretsRequest:type_name -> hashicorp.consul.internal.peering.SecretsWriteRequest - 38, // 19: hashicorp.consul.internal.peering.PeeringWriteRequest.Meta:type_name -> hashicorp.consul.internal.peering.PeeringWriteRequest.MetaEntry - 7, // 20: hashicorp.consul.internal.peering.TrustBundleListByServiceResponse.Bundles:type_name -> hashicorp.consul.internal.peering.PeeringTrustBundle - 7, // 21: hashicorp.consul.internal.peering.TrustBundleReadResponse.Bundle:type_name -> hashicorp.consul.internal.peering.PeeringTrustBundle - 7, // 22: hashicorp.consul.internal.peering.PeeringTrustBundleWriteRequest.PeeringTrustBundle:type_name -> hashicorp.consul.internal.peering.PeeringTrustBundle - 39, // 23: hashicorp.consul.internal.peering.GenerateTokenRequest.Meta:type_name -> hashicorp.consul.internal.peering.GenerateTokenRequest.MetaEntry - 40, // 24: hashicorp.consul.internal.peering.EstablishRequest.Meta:type_name -> hashicorp.consul.internal.peering.EstablishRequest.MetaEntry - 27, // 25: hashicorp.consul.internal.peering.PeeringService.GenerateToken:input_type -> hashicorp.consul.internal.peering.GenerateTokenRequest - 29, // 26: hashicorp.consul.internal.peering.PeeringService.Establish:input_type -> hashicorp.consul.internal.peering.EstablishRequest - 9, // 27: hashicorp.consul.internal.peering.PeeringService.PeeringRead:input_type -> hashicorp.consul.internal.peering.PeeringReadRequest - 11, // 28: hashicorp.consul.internal.peering.PeeringService.PeeringList:input_type -> hashicorp.consul.internal.peering.PeeringListRequest - 15, // 29: hashicorp.consul.internal.peering.PeeringService.PeeringDelete:input_type -> hashicorp.consul.internal.peering.PeeringDeleteRequest - 13, // 30: hashicorp.consul.internal.peering.PeeringService.PeeringWrite:input_type -> hashicorp.consul.internal.peering.PeeringWriteRequest - 17, // 31: hashicorp.consul.internal.peering.PeeringService.TrustBundleListByService:input_type -> hashicorp.consul.internal.peering.TrustBundleListByServiceRequest - 19, // 32: hashicorp.consul.internal.peering.PeeringService.TrustBundleRead:input_type -> hashicorp.consul.internal.peering.TrustBundleReadRequest - 28, // 33: hashicorp.consul.internal.peering.PeeringService.GenerateToken:output_type -> hashicorp.consul.internal.peering.GenerateTokenResponse - 30, // 34: hashicorp.consul.internal.peering.PeeringService.Establish:output_type -> hashicorp.consul.internal.peering.EstablishResponse - 10, // 35: hashicorp.consul.internal.peering.PeeringService.PeeringRead:output_type -> hashicorp.consul.internal.peering.PeeringReadResponse - 12, // 36: hashicorp.consul.internal.peering.PeeringService.PeeringList:output_type -> hashicorp.consul.internal.peering.PeeringListResponse - 16, // 37: hashicorp.consul.internal.peering.PeeringService.PeeringDelete:output_type -> hashicorp.consul.internal.peering.PeeringDeleteResponse - 14, // 38: hashicorp.consul.internal.peering.PeeringService.PeeringWrite:output_type -> hashicorp.consul.internal.peering.PeeringWriteResponse - 18, // 39: hashicorp.consul.internal.peering.PeeringService.TrustBundleListByService:output_type -> hashicorp.consul.internal.peering.TrustBundleListByServiceResponse - 20, // 40: hashicorp.consul.internal.peering.PeeringService.TrustBundleRead:output_type -> hashicorp.consul.internal.peering.TrustBundleReadResponse + 37, // 19: hashicorp.consul.internal.peering.PeeringWriteRequest.Meta:type_name -> hashicorp.consul.internal.peering.PeeringWriteRequest.MetaEntry + 6, // 20: hashicorp.consul.internal.peering.TrustBundleListByServiceResponse.Bundles:type_name -> hashicorp.consul.internal.peering.PeeringTrustBundle + 6, // 21: hashicorp.consul.internal.peering.TrustBundleReadResponse.Bundle:type_name -> hashicorp.consul.internal.peering.PeeringTrustBundle + 6, // 22: hashicorp.consul.internal.peering.PeeringTrustBundleWriteRequest.PeeringTrustBundle:type_name -> hashicorp.consul.internal.peering.PeeringTrustBundle + 38, // 23: hashicorp.consul.internal.peering.GenerateTokenRequest.Meta:type_name -> hashicorp.consul.internal.peering.GenerateTokenRequest.MetaEntry + 39, // 24: hashicorp.consul.internal.peering.EstablishRequest.Meta:type_name -> hashicorp.consul.internal.peering.EstablishRequest.MetaEntry + 26, // 25: hashicorp.consul.internal.peering.PeeringService.GenerateToken:input_type -> hashicorp.consul.internal.peering.GenerateTokenRequest + 28, // 26: hashicorp.consul.internal.peering.PeeringService.Establish:input_type -> hashicorp.consul.internal.peering.EstablishRequest + 8, // 27: hashicorp.consul.internal.peering.PeeringService.PeeringRead:input_type -> hashicorp.consul.internal.peering.PeeringReadRequest + 10, // 28: hashicorp.consul.internal.peering.PeeringService.PeeringList:input_type -> hashicorp.consul.internal.peering.PeeringListRequest + 14, // 29: hashicorp.consul.internal.peering.PeeringService.PeeringDelete:input_type -> hashicorp.consul.internal.peering.PeeringDeleteRequest + 12, // 30: hashicorp.consul.internal.peering.PeeringService.PeeringWrite:input_type -> hashicorp.consul.internal.peering.PeeringWriteRequest + 16, // 31: hashicorp.consul.internal.peering.PeeringService.TrustBundleListByService:input_type -> hashicorp.consul.internal.peering.TrustBundleListByServiceRequest + 18, // 32: hashicorp.consul.internal.peering.PeeringService.TrustBundleRead:input_type -> hashicorp.consul.internal.peering.TrustBundleReadRequest + 27, // 33: hashicorp.consul.internal.peering.PeeringService.GenerateToken:output_type -> hashicorp.consul.internal.peering.GenerateTokenResponse + 29, // 34: hashicorp.consul.internal.peering.PeeringService.Establish:output_type -> hashicorp.consul.internal.peering.EstablishResponse + 9, // 35: hashicorp.consul.internal.peering.PeeringService.PeeringRead:output_type -> hashicorp.consul.internal.peering.PeeringReadResponse + 11, // 36: hashicorp.consul.internal.peering.PeeringService.PeeringList:output_type -> hashicorp.consul.internal.peering.PeeringListResponse + 15, // 37: hashicorp.consul.internal.peering.PeeringService.PeeringDelete:output_type -> hashicorp.consul.internal.peering.PeeringDeleteResponse + 13, // 38: hashicorp.consul.internal.peering.PeeringService.PeeringWrite:output_type -> hashicorp.consul.internal.peering.PeeringWriteResponse + 17, // 39: hashicorp.consul.internal.peering.PeeringService.TrustBundleListByService:output_type -> hashicorp.consul.internal.peering.TrustBundleListByServiceResponse + 19, // 40: hashicorp.consul.internal.peering.PeeringService.TrustBundleRead:output_type -> hashicorp.consul.internal.peering.TrustBundleReadResponse 33, // [33:41] is the sub-list for method output_type 25, // [25:33] is the sub-list for method input_type 25, // [25:25] is the sub-list for extension type_name @@ -2935,18 +2873,6 @@ func file_private_pbpeering_peering_proto_init() { } } file_private_pbpeering_peering_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Locality); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_private_pbpeering_peering_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*StreamStatus); i { case 0: return &v.state @@ -2958,7 +2884,7 @@ func file_private_pbpeering_peering_proto_init() { return nil } } - file_private_pbpeering_peering_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { + file_private_pbpeering_peering_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PeeringTrustBundle); i { case 0: return &v.state @@ -2970,7 +2896,7 @@ func file_private_pbpeering_peering_proto_init() { return nil } } - file_private_pbpeering_peering_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { + file_private_pbpeering_peering_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PeeringServerAddresses); i { case 0: return &v.state @@ -2982,7 +2908,7 @@ func file_private_pbpeering_peering_proto_init() { return nil } } - file_private_pbpeering_peering_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { + file_private_pbpeering_peering_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PeeringReadRequest); i { case 0: return &v.state @@ -2994,7 +2920,7 @@ func file_private_pbpeering_peering_proto_init() { return nil } } - file_private_pbpeering_peering_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { + file_private_pbpeering_peering_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PeeringReadResponse); i { case 0: return &v.state @@ -3006,7 +2932,7 @@ func file_private_pbpeering_peering_proto_init() { return nil } } - file_private_pbpeering_peering_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { + file_private_pbpeering_peering_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PeeringListRequest); i { case 0: return &v.state @@ -3018,7 +2944,7 @@ func file_private_pbpeering_peering_proto_init() { return nil } } - file_private_pbpeering_peering_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { + file_private_pbpeering_peering_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PeeringListResponse); i { case 0: return &v.state @@ -3030,7 +2956,7 @@ func file_private_pbpeering_peering_proto_init() { return nil } } - file_private_pbpeering_peering_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { + file_private_pbpeering_peering_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PeeringWriteRequest); i { case 0: return &v.state @@ -3042,7 +2968,7 @@ func file_private_pbpeering_peering_proto_init() { return nil } } - file_private_pbpeering_peering_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { + file_private_pbpeering_peering_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PeeringWriteResponse); i { case 0: return &v.state @@ -3054,7 +2980,7 @@ func file_private_pbpeering_peering_proto_init() { return nil } } - file_private_pbpeering_peering_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { + file_private_pbpeering_peering_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PeeringDeleteRequest); i { case 0: return &v.state @@ -3066,7 +2992,7 @@ func file_private_pbpeering_peering_proto_init() { return nil } } - file_private_pbpeering_peering_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { + file_private_pbpeering_peering_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PeeringDeleteResponse); i { case 0: return &v.state @@ -3078,7 +3004,7 @@ func file_private_pbpeering_peering_proto_init() { return nil } } - file_private_pbpeering_peering_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { + file_private_pbpeering_peering_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*TrustBundleListByServiceRequest); i { case 0: return &v.state @@ -3090,7 +3016,7 @@ func file_private_pbpeering_peering_proto_init() { return nil } } - file_private_pbpeering_peering_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { + file_private_pbpeering_peering_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*TrustBundleListByServiceResponse); i { case 0: return &v.state @@ -3102,7 +3028,7 @@ func file_private_pbpeering_peering_proto_init() { return nil } } - file_private_pbpeering_peering_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { + file_private_pbpeering_peering_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*TrustBundleReadRequest); i { case 0: return &v.state @@ -3114,7 +3040,7 @@ func file_private_pbpeering_peering_proto_init() { return nil } } - file_private_pbpeering_peering_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { + file_private_pbpeering_peering_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*TrustBundleReadResponse); i { case 0: return &v.state @@ -3126,7 +3052,7 @@ func file_private_pbpeering_peering_proto_init() { return nil } } - file_private_pbpeering_peering_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { + file_private_pbpeering_peering_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PeeringTerminateByIDRequest); i { case 0: return &v.state @@ -3138,7 +3064,7 @@ func file_private_pbpeering_peering_proto_init() { return nil } } - file_private_pbpeering_peering_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { + file_private_pbpeering_peering_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PeeringTerminateByIDResponse); i { case 0: return &v.state @@ -3150,7 +3076,7 @@ func file_private_pbpeering_peering_proto_init() { return nil } } - file_private_pbpeering_peering_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { + file_private_pbpeering_peering_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PeeringTrustBundleWriteRequest); i { case 0: return &v.state @@ -3162,7 +3088,7 @@ func file_private_pbpeering_peering_proto_init() { return nil } } - file_private_pbpeering_peering_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { + file_private_pbpeering_peering_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PeeringTrustBundleWriteResponse); i { case 0: return &v.state @@ -3174,7 +3100,7 @@ func file_private_pbpeering_peering_proto_init() { return nil } } - file_private_pbpeering_peering_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { + file_private_pbpeering_peering_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PeeringTrustBundleDeleteRequest); i { case 0: return &v.state @@ -3186,7 +3112,7 @@ func file_private_pbpeering_peering_proto_init() { return nil } } - file_private_pbpeering_peering_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { + file_private_pbpeering_peering_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PeeringTrustBundleDeleteResponse); i { case 0: return &v.state @@ -3198,7 +3124,7 @@ func file_private_pbpeering_peering_proto_init() { return nil } } - file_private_pbpeering_peering_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { + file_private_pbpeering_peering_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GenerateTokenRequest); i { case 0: return &v.state @@ -3210,7 +3136,7 @@ func file_private_pbpeering_peering_proto_init() { return nil } } - file_private_pbpeering_peering_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { + file_private_pbpeering_peering_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GenerateTokenResponse); i { case 0: return &v.state @@ -3222,7 +3148,7 @@ func file_private_pbpeering_peering_proto_init() { return nil } } - file_private_pbpeering_peering_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { + file_private_pbpeering_peering_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*EstablishRequest); i { case 0: return &v.state @@ -3234,7 +3160,7 @@ func file_private_pbpeering_peering_proto_init() { return nil } } - file_private_pbpeering_peering_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { + file_private_pbpeering_peering_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*EstablishResponse); i { case 0: return &v.state @@ -3246,7 +3172,7 @@ func file_private_pbpeering_peering_proto_init() { return nil } } - file_private_pbpeering_peering_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} { + file_private_pbpeering_peering_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SecretsWriteRequest_GenerateTokenRequest); i { case 0: return &v.state @@ -3258,7 +3184,7 @@ func file_private_pbpeering_peering_proto_init() { return nil } } - file_private_pbpeering_peering_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { + file_private_pbpeering_peering_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SecretsWriteRequest_ExchangeSecretRequest); i { case 0: return &v.state @@ -3270,7 +3196,7 @@ func file_private_pbpeering_peering_proto_init() { return nil } } - file_private_pbpeering_peering_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} { + file_private_pbpeering_peering_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SecretsWriteRequest_PromotePendingRequest); i { case 0: return &v.state @@ -3282,7 +3208,7 @@ func file_private_pbpeering_peering_proto_init() { return nil } } - file_private_pbpeering_peering_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} { + file_private_pbpeering_peering_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SecretsWriteRequest_EstablishRequest); i { case 0: return &v.state @@ -3294,7 +3220,7 @@ func file_private_pbpeering_peering_proto_init() { return nil } } - file_private_pbpeering_peering_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} { + file_private_pbpeering_peering_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PeeringSecrets_Establishment); i { case 0: return &v.state @@ -3306,7 +3232,7 @@ func file_private_pbpeering_peering_proto_init() { return nil } } - file_private_pbpeering_peering_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} { + file_private_pbpeering_peering_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PeeringSecrets_Stream); i { case 0: return &v.state @@ -3331,7 +3257,7 @@ func file_private_pbpeering_peering_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_private_pbpeering_peering_proto_rawDesc, NumEnums: 1, - NumMessages: 40, + NumMessages: 39, NumExtensions: 0, NumServices: 1, }, diff --git a/proto/private/pbpeering/peering.proto b/proto/private/pbpeering/peering.proto index b84b10d3035..3bd6daf7fb3 100644 --- a/proto/private/pbpeering/peering.proto +++ b/proto/private/pbpeering/peering.proto @@ -4,6 +4,7 @@ package hashicorp.consul.internal.peering; import "annotations/ratelimit/ratelimit.proto"; import "google/protobuf/timestamp.proto"; +import "private/pbcommon/common.proto"; // PeeringService handles operations for establishing peering relationships // between disparate Consul clusters. @@ -239,20 +240,8 @@ message RemoteInfo { string Datacenter = 2; // Locality identifies where the peer is running. - Locality Locality = 3; -} - -// mog annotation: -// -// target=github.com/hashicorp/consul/api.Locality -// output=peering.gen.go -// name=API -message Locality { - // Region is region the zone belongs to. - string Region = 1; - - // Zone is the zone the entity is running in. - string Zone = 2; + // mog: func-to=LocalityToAPI func-from=LocalityFromAPI + common.Locality Locality = 3; } // StreamStatus represents information about an active peering stream. diff --git a/proto/private/pbservice/convert.go b/proto/private/pbservice/convert.go index 8e42e3758bd..148698d1bfc 100644 --- a/proto/private/pbservice/convert.go +++ b/proto/private/pbservice/convert.go @@ -276,3 +276,25 @@ func NewServiceDefinitionPtrFromStructs(t *structs.ServiceDefinition) *ServiceDe ServiceDefinitionFromStructs(t, sd) return sd } + +// TODO: handle this with mog +func LocalityToStructs(l *pbcommon.Locality) *structs.Locality { + if l == nil { + return nil + } + return &structs.Locality{ + Region: l.Region, + Zone: l.Zone, + } +} + +// TODO: handle this with mog +func LocalityFromStructs(l *structs.Locality) *pbcommon.Locality { + if l == nil { + return nil + } + return &pbcommon.Locality{ + Region: l.Region, + Zone: l.Zone, + } +} diff --git a/proto/private/pbservice/node.gen.go b/proto/private/pbservice/node.gen.go index f231ea836ab..fb37e933bef 100644 --- a/proto/private/pbservice/node.gen.go +++ b/proto/private/pbservice/node.gen.go @@ -16,6 +16,7 @@ func NodeToStructs(s *Node, t *structs.Node) { t.PeerName = s.PeerName t.TaggedAddresses = s.TaggedAddresses t.Meta = s.Meta + t.Locality = LocalityToStructs(s.Locality) t.RaftIndex = RaftIndexToStructs(s.RaftIndex) } func NodeFromStructs(t *structs.Node, s *Node) { @@ -30,6 +31,7 @@ func NodeFromStructs(t *structs.Node, s *Node) { s.PeerName = t.PeerName s.TaggedAddresses = t.TaggedAddresses s.Meta = t.Meta + s.Locality = LocalityFromStructs(t.Locality) s.RaftIndex = NewRaftIndexFromStructs(t.RaftIndex) } func NodeServiceToStructs(s *NodeService, t *structs.NodeService) { @@ -47,6 +49,7 @@ func NodeServiceToStructs(s *NodeService, t *structs.NodeService) { t.SocketPath = s.SocketPath t.Weights = WeightsPtrToStructs(s.Weights) t.EnableTagOverride = s.EnableTagOverride + t.Locality = LocalityToStructs(s.Locality) if s.Proxy != nil { ConnectProxyConfigToStructs(s.Proxy, &t.Proxy) } @@ -73,6 +76,7 @@ func NodeServiceFromStructs(t *structs.NodeService, s *NodeService) { s.SocketPath = t.SocketPath s.Weights = NewWeightsPtrFromStructs(t.Weights) s.EnableTagOverride = t.EnableTagOverride + s.Locality = LocalityFromStructs(t.Locality) { var x ConnectProxyConfig ConnectProxyConfigFromStructs(&t.Proxy, &x) diff --git a/proto/private/pbservice/node.pb.go b/proto/private/pbservice/node.pb.go index a9c22c570f5..61eb2c7211e 100644 --- a/proto/private/pbservice/node.pb.go +++ b/proto/private/pbservice/node.pb.go @@ -165,6 +165,9 @@ type Node struct { Meta map[string]string `protobuf:"bytes,6,rep,name=Meta,proto3" json:"Meta,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // mog: func-to=RaftIndexToStructs func-from=NewRaftIndexFromStructs RaftIndex *pbcommon.RaftIndex `protobuf:"bytes,7,opt,name=RaftIndex,proto3" json:"RaftIndex,omitempty"` + // Locality identifies where the node is running. + // mog: func-to=LocalityToStructs func-from=LocalityFromStructs + Locality *pbcommon.Locality `protobuf:"bytes,10,opt,name=Locality,proto3" json:"Locality,omitempty"` } func (x *Node) Reset() { @@ -262,6 +265,13 @@ func (x *Node) GetRaftIndex() *pbcommon.RaftIndex { return nil } +func (x *Node) GetLocality() *pbcommon.Locality { + if x != nil { + return x.Locality + } + return nil +} + // NodeService is a service provided by a node // // mog annotation: @@ -329,6 +339,9 @@ type NodeService struct { PeerName string `protobuf:"bytes,18,opt,name=PeerName,proto3" json:"PeerName,omitempty"` // mog: func-to=RaftIndexToStructs func-from=NewRaftIndexFromStructs RaftIndex *pbcommon.RaftIndex `protobuf:"bytes,14,opt,name=RaftIndex,proto3" json:"RaftIndex,omitempty"` + // Locality identifies where the service is running. + // mog: func-to=LocalityToStructs func-from=LocalityFromStructs + Locality *pbcommon.Locality `protobuf:"bytes,19,opt,name=Locality,proto3" json:"Locality,omitempty"` } func (x *NodeService) Reset() { @@ -482,6 +495,13 @@ func (x *NodeService) GetRaftIndex() *pbcommon.RaftIndex { return nil } +func (x *NodeService) GetLocality() *pbcommon.Locality { + if x != nil { + return x.Locality + } + return nil +} + var File_private_pbservice_node_proto protoreflect.FileDescriptor var file_private_pbservice_node_proto_rawDesc = []byte{ @@ -517,7 +537,7 @@ var file_private_pbservice_node_proto_rawDesc = []byte{ 0x2e, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, - 0x06, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x22, 0x95, 0x04, 0x0a, 0x04, 0x4e, 0x6f, 0x64, 0x65, + 0x06, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x22, 0xdd, 0x04, 0x0a, 0x04, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, @@ -543,70 +563,79 @@ var file_private_pbservice_node_proto_rawDesc = []byte{ 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x52, 0x61, 0x66, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x09, 0x52, 0x61, 0x66, 0x74, 0x49, 0x6e, 0x64, - 0x65, 0x78, 0x1a, 0x42, 0x0a, 0x14, 0x54, 0x61, 0x67, 0x67, 0x65, 0x64, 0x41, 0x64, 0x64, 0x72, - 0x65, 0x73, 0x73, 0x65, 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, 0x37, 0x0a, 0x09, 0x4d, 0x65, 0x74, 0x61, 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, 0x22, - 0xa9, 0x08, 0x0a, 0x0b, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, - 0x12, 0x0a, 0x04, 0x4b, 0x69, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4b, - 0x69, 0x6e, 0x64, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x02, 0x49, 0x44, 0x12, 0x18, 0x0a, 0x07, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x12, 0x0a, - 0x04, 0x54, 0x61, 0x67, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x54, 0x61, 0x67, - 0x73, 0x12, 0x18, 0x0a, 0x07, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x07, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x6d, 0x0a, 0x0f, 0x54, - 0x61, 0x67, 0x67, 0x65, 0x64, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x18, 0x0f, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x43, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, + 0x65, 0x78, 0x12, 0x46, 0x0a, 0x08, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x18, 0x0a, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, - 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x2e, 0x54, 0x61, 0x67, 0x67, 0x65, 0x64, 0x41, 0x64, 0x64, 0x72, 0x65, - 0x73, 0x73, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0f, 0x54, 0x61, 0x67, 0x67, 0x65, - 0x64, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x12, 0x4c, 0x0a, 0x04, 0x4d, 0x65, - 0x74, 0x61, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, - 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, - 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x4e, 0x6f, 0x64, - 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x52, 0x04, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x6f, 0x72, 0x74, - 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x1e, 0x0a, 0x0a, - 0x53, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x50, 0x61, 0x74, 0x68, 0x18, 0x11, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0a, 0x53, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x50, 0x61, 0x74, 0x68, 0x12, 0x44, 0x0a, 0x07, - 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, - 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, - 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x2e, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x52, 0x07, 0x57, 0x65, 0x69, 0x67, 0x68, - 0x74, 0x73, 0x12, 0x2c, 0x0a, 0x11, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x61, 0x67, 0x4f, - 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x45, - 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x61, 0x67, 0x4f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, - 0x12, 0x4b, 0x0a, 0x05, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x35, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, - 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x73, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x2e, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x50, 0x72, 0x6f, 0x78, 0x79, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x05, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x12, 0x4b, 0x0a, - 0x07, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, - 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, - 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, - 0x74, 0x52, 0x07, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x12, 0x3e, 0x0a, 0x1a, 0x4c, 0x6f, - 0x63, 0x61, 0x6c, 0x6c, 0x79, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x41, - 0x73, 0x53, 0x69, 0x64, 0x65, 0x63, 0x61, 0x72, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x08, 0x52, 0x1a, - 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x6c, 0x79, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, - 0x64, 0x41, 0x73, 0x53, 0x69, 0x64, 0x65, 0x63, 0x61, 0x72, 0x12, 0x58, 0x0a, 0x0e, 0x45, 0x6e, - 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x18, 0x10, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, - 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, - 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, - 0x4d, 0x65, 0x74, 0x61, 0x52, 0x0e, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, - 0x4d, 0x65, 0x74, 0x61, 0x12, 0x1a, 0x0a, 0x08, 0x50, 0x65, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, - 0x18, 0x12, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x50, 0x65, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, - 0x12, 0x49, 0x0a, 0x09, 0x52, 0x61, 0x66, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x0e, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, - 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, - 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x52, 0x61, 0x66, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, - 0x52, 0x09, 0x52, 0x61, 0x66, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x1a, 0x75, 0x0a, 0x14, 0x54, + 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x69, 0x74, 0x79, + 0x52, 0x08, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x1a, 0x42, 0x0a, 0x14, 0x54, 0x61, + 0x67, 0x67, 0x65, 0x64, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 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, 0x37, + 0x0a, 0x09, 0x4d, 0x65, 0x74, 0x61, 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, 0x22, 0xf1, 0x08, 0x0a, 0x0b, 0x4e, 0x6f, 0x64, 0x65, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x4b, 0x69, 0x6e, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x0e, 0x0a, 0x02, 0x49, + 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, 0x18, 0x0a, 0x07, 0x53, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x53, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x54, 0x61, 0x67, 0x73, 0x18, 0x04, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x04, 0x54, 0x61, 0x67, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x41, 0x64, 0x64, + 0x72, 0x65, 0x73, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x41, 0x64, 0x64, 0x72, + 0x65, 0x73, 0x73, 0x12, 0x6d, 0x0a, 0x0f, 0x54, 0x61, 0x67, 0x67, 0x65, 0x64, 0x41, 0x64, 0x64, + 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x18, 0x0f, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x43, 0x2e, 0x68, + 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, + 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x54, 0x61, 0x67, + 0x67, 0x65, 0x64, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x0f, 0x54, 0x61, 0x67, 0x67, 0x65, 0x64, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, + 0x65, 0x73, 0x12, 0x4c, 0x0a, 0x04, 0x4d, 0x65, 0x74, 0x61, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x38, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, + 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x73, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x4d, 0x65, 0x74, 0x61, + 0x12, 0x12, 0x0a, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, + 0x50, 0x6f, 0x72, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x53, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x50, 0x61, + 0x74, 0x68, 0x18, 0x11, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x53, 0x6f, 0x63, 0x6b, 0x65, 0x74, + 0x50, 0x61, 0x74, 0x68, 0x12, 0x44, 0x0a, 0x07, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x18, + 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, + 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, + 0x6c, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, + 0x73, 0x52, 0x07, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x12, 0x2c, 0x0a, 0x11, 0x45, 0x6e, + 0x61, 0x62, 0x6c, 0x65, 0x54, 0x61, 0x67, 0x4f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x18, + 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x61, 0x67, + 0x4f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x12, 0x4b, 0x0a, 0x05, 0x50, 0x72, 0x6f, 0x78, + 0x79, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, + 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, + 0x6e, 0x61, 0x6c, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x43, 0x6f, 0x6e, 0x6e, + 0x65, 0x63, 0x74, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x05, + 0x50, 0x72, 0x6f, 0x78, 0x79, 0x12, 0x4b, 0x0a, 0x07, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, + 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, + 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, + 0x61, 0x6c, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x52, 0x07, 0x43, 0x6f, 0x6e, 0x6e, 0x65, + 0x63, 0x74, 0x12, 0x3e, 0x0a, 0x1a, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x6c, 0x79, 0x52, 0x65, 0x67, + 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x41, 0x73, 0x53, 0x69, 0x64, 0x65, 0x63, 0x61, 0x72, + 0x18, 0x0d, 0x20, 0x01, 0x28, 0x08, 0x52, 0x1a, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x6c, 0x79, 0x52, + 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x41, 0x73, 0x53, 0x69, 0x64, 0x65, 0x63, + 0x61, 0x72, 0x12, 0x58, 0x0a, 0x0e, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, + 0x4d, 0x65, 0x74, 0x61, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x68, 0x61, 0x73, + 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, + 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6e, + 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x52, 0x0e, 0x45, 0x6e, + 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x1a, 0x0a, 0x08, + 0x50, 0x65, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x12, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x50, 0x65, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x49, 0x0a, 0x09, 0x52, 0x61, 0x66, 0x74, + 0x49, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x68, 0x61, + 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, + 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x52, + 0x61, 0x66, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x09, 0x52, 0x61, 0x66, 0x74, 0x49, 0x6e, + 0x64, 0x65, 0x78, 0x12, 0x46, 0x0a, 0x08, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x18, + 0x13, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, + 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, + 0x6c, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x69, 0x74, + 0x79, 0x52, 0x08, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x1a, 0x75, 0x0a, 0x14, 0x54, 0x61, 0x67, 0x67, 0x65, 0x64, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 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, 0x47, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, @@ -662,11 +691,12 @@ var file_private_pbservice_node_proto_goTypes = []interface{}{ nil, // 7: hashicorp.consul.internal.service.NodeService.MetaEntry (*HealthCheck)(nil), // 8: hashicorp.consul.internal.service.HealthCheck (*pbcommon.RaftIndex)(nil), // 9: hashicorp.consul.internal.common.RaftIndex - (*Weights)(nil), // 10: hashicorp.consul.internal.service.Weights - (*ConnectProxyConfig)(nil), // 11: hashicorp.consul.internal.service.ConnectProxyConfig - (*ServiceConnect)(nil), // 12: hashicorp.consul.internal.service.ServiceConnect - (*pbcommon.EnterpriseMeta)(nil), // 13: hashicorp.consul.internal.common.EnterpriseMeta - (*ServiceAddress)(nil), // 14: hashicorp.consul.internal.service.ServiceAddress + (*pbcommon.Locality)(nil), // 10: hashicorp.consul.internal.common.Locality + (*Weights)(nil), // 11: hashicorp.consul.internal.service.Weights + (*ConnectProxyConfig)(nil), // 12: hashicorp.consul.internal.service.ConnectProxyConfig + (*ServiceConnect)(nil), // 13: hashicorp.consul.internal.service.ServiceConnect + (*pbcommon.EnterpriseMeta)(nil), // 14: hashicorp.consul.internal.common.EnterpriseMeta + (*ServiceAddress)(nil), // 15: hashicorp.consul.internal.service.ServiceAddress } var file_private_pbservice_node_proto_depIdxs = []int32{ 1, // 0: hashicorp.consul.internal.service.IndexedCheckServiceNodes.Nodes:type_name -> hashicorp.consul.internal.service.CheckServiceNode @@ -676,19 +706,21 @@ var file_private_pbservice_node_proto_depIdxs = []int32{ 4, // 4: hashicorp.consul.internal.service.Node.TaggedAddresses:type_name -> hashicorp.consul.internal.service.Node.TaggedAddressesEntry 5, // 5: hashicorp.consul.internal.service.Node.Meta:type_name -> hashicorp.consul.internal.service.Node.MetaEntry 9, // 6: hashicorp.consul.internal.service.Node.RaftIndex:type_name -> hashicorp.consul.internal.common.RaftIndex - 6, // 7: hashicorp.consul.internal.service.NodeService.TaggedAddresses:type_name -> hashicorp.consul.internal.service.NodeService.TaggedAddressesEntry - 7, // 8: hashicorp.consul.internal.service.NodeService.Meta:type_name -> hashicorp.consul.internal.service.NodeService.MetaEntry - 10, // 9: hashicorp.consul.internal.service.NodeService.Weights:type_name -> hashicorp.consul.internal.service.Weights - 11, // 10: hashicorp.consul.internal.service.NodeService.Proxy:type_name -> hashicorp.consul.internal.service.ConnectProxyConfig - 12, // 11: hashicorp.consul.internal.service.NodeService.Connect:type_name -> hashicorp.consul.internal.service.ServiceConnect - 13, // 12: hashicorp.consul.internal.service.NodeService.EnterpriseMeta:type_name -> hashicorp.consul.internal.common.EnterpriseMeta - 9, // 13: hashicorp.consul.internal.service.NodeService.RaftIndex:type_name -> hashicorp.consul.internal.common.RaftIndex - 14, // 14: hashicorp.consul.internal.service.NodeService.TaggedAddressesEntry.value:type_name -> hashicorp.consul.internal.service.ServiceAddress - 15, // [15:15] is the sub-list for method output_type - 15, // [15:15] is the sub-list for method input_type - 15, // [15:15] is the sub-list for extension type_name - 15, // [15:15] is the sub-list for extension extendee - 0, // [0:15] is the sub-list for field type_name + 10, // 7: hashicorp.consul.internal.service.Node.Locality:type_name -> hashicorp.consul.internal.common.Locality + 6, // 8: hashicorp.consul.internal.service.NodeService.TaggedAddresses:type_name -> hashicorp.consul.internal.service.NodeService.TaggedAddressesEntry + 7, // 9: hashicorp.consul.internal.service.NodeService.Meta:type_name -> hashicorp.consul.internal.service.NodeService.MetaEntry + 11, // 10: hashicorp.consul.internal.service.NodeService.Weights:type_name -> hashicorp.consul.internal.service.Weights + 12, // 11: hashicorp.consul.internal.service.NodeService.Proxy:type_name -> hashicorp.consul.internal.service.ConnectProxyConfig + 13, // 12: hashicorp.consul.internal.service.NodeService.Connect:type_name -> hashicorp.consul.internal.service.ServiceConnect + 14, // 13: hashicorp.consul.internal.service.NodeService.EnterpriseMeta:type_name -> hashicorp.consul.internal.common.EnterpriseMeta + 9, // 14: hashicorp.consul.internal.service.NodeService.RaftIndex:type_name -> hashicorp.consul.internal.common.RaftIndex + 10, // 15: hashicorp.consul.internal.service.NodeService.Locality:type_name -> hashicorp.consul.internal.common.Locality + 15, // 16: hashicorp.consul.internal.service.NodeService.TaggedAddressesEntry.value:type_name -> hashicorp.consul.internal.service.ServiceAddress + 17, // [17:17] is the sub-list for method output_type + 17, // [17:17] is the sub-list for method input_type + 17, // [17:17] is the sub-list for extension type_name + 17, // [17:17] is the sub-list for extension extendee + 0, // [0:17] is the sub-list for field type_name } func init() { file_private_pbservice_node_proto_init() } diff --git a/proto/private/pbservice/node.proto b/proto/private/pbservice/node.proto index 7ea79bb7008..feba2d20c4e 100644 --- a/proto/private/pbservice/node.proto +++ b/proto/private/pbservice/node.proto @@ -41,6 +41,9 @@ message Node { // mog: func-to=RaftIndexToStructs func-from=NewRaftIndexFromStructs common.RaftIndex RaftIndex = 7; + // Locality identifies where the node is running. + // mog: func-to=LocalityToStructs func-from=LocalityFromStructs + common.Locality Locality = 10; } // NodeService is a service provided by a node @@ -114,4 +117,8 @@ message NodeService { // mog: func-to=RaftIndexToStructs func-from=NewRaftIndexFromStructs common.RaftIndex RaftIndex = 14; + + // Locality identifies where the service is running. + // mog: func-to=LocalityToStructs func-from=LocalityFromStructs + common.Locality Locality = 19; } diff --git a/proto/private/pbservice/service.gen.go b/proto/private/pbservice/service.gen.go index cca5b995a7c..f1030cd5854 100644 --- a/proto/private/pbservice/service.gen.go +++ b/proto/private/pbservice/service.gen.go @@ -192,6 +192,7 @@ func ServiceDefinitionToStructs(s *ServiceDefinition, t *structs.ServiceDefiniti t.Weights = WeightsPtrToStructs(s.Weights) t.Token = s.Token t.EnableTagOverride = s.EnableTagOverride + t.Locality = LocalityToStructs(s.Locality) t.Proxy = ConnectProxyConfigPtrToStructs(s.Proxy) t.EnterpriseMeta = EnterpriseMetaToStructs(s.EnterpriseMeta) t.Connect = ServiceConnectPtrToStructs(s.Connect) @@ -218,6 +219,7 @@ func ServiceDefinitionFromStructs(t *structs.ServiceDefinition, s *ServiceDefini s.Weights = NewWeightsPtrFromStructs(t.Weights) s.Token = t.Token s.EnableTagOverride = t.EnableTagOverride + s.Locality = LocalityFromStructs(t.Locality) s.Proxy = NewConnectProxyConfigPtrFromStructs(t.Proxy) s.EnterpriseMeta = NewEnterpriseMetaFromStructs(t.EnterpriseMeta) s.Connect = NewServiceConnectPtrFromStructs(t.Connect) diff --git a/proto/private/pbservice/service.pb.go b/proto/private/pbservice/service.pb.go index 743ea79b2ee..80a3efffd67 100644 --- a/proto/private/pbservice/service.pb.go +++ b/proto/private/pbservice/service.pb.go @@ -953,6 +953,9 @@ type ServiceDefinition struct { EnterpriseMeta *pbcommon.EnterpriseMeta `protobuf:"bytes,17,opt,name=EnterpriseMeta,proto3" json:"EnterpriseMeta,omitempty"` // mog: func-to=ServiceConnectPtrToStructs func-from=NewServiceConnectPtrFromStructs Connect *ServiceConnect `protobuf:"bytes,15,opt,name=Connect,proto3" json:"Connect,omitempty"` + // Locality identifies where the service is running. + // mog: func-to=LocalityToStructs func-from=LocalityFromStructs + Locality *pbcommon.Locality `protobuf:"bytes,19,opt,name=Locality,proto3" json:"Locality,omitempty"` } func (x *ServiceDefinition) Reset() { @@ -1106,6 +1109,13 @@ func (x *ServiceDefinition) GetConnect() *ServiceConnect { return nil } +func (x *ServiceDefinition) GetLocality() *pbcommon.Locality { + if x != nil { + return x.Locality + } + return nil +} + // Type to hold an address and port of a service type ServiceAddress struct { state protoimpl.MessageState @@ -1389,7 +1399,7 @@ var file_private_pbservice_service_proto_rawDesc = []byte{ 0x72, 0x6d, 0x61, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x4a, 0x53, 0x4f, 0x4e, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x54, 0x65, 0x78, 0x74, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x54, 0x65, 0x78, 0x74, - 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0xae, 0x08, 0x0a, 0x11, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0xf6, 0x08, 0x0a, 0x11, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x4b, 0x69, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, @@ -1445,44 +1455,48 @@ var file_private_pbservice_service_proto_rawDesc = []byte{ 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x52, 0x07, - 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x1a, 0x75, 0x0a, 0x14, 0x54, 0x61, 0x67, 0x67, 0x65, - 0x64, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 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, 0x47, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x31, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, - 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x73, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x41, 0x64, 0x64, 0x72, - 0x65, 0x73, 0x73, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x37, - 0x0a, 0x09, 0x4d, 0x65, 0x74, 0x61, 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, 0x22, 0x3e, 0x0a, 0x0e, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x41, 0x64, 0x64, - 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x41, 0x64, 0x64, 0x72, - 0x65, 0x73, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x22, 0x3d, 0x0a, 0x07, 0x57, 0x65, 0x69, 0x67, 0x68, - 0x74, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x50, 0x61, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x07, 0x50, 0x61, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x12, 0x18, 0x0a, 0x07, - 0x57, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x57, - 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x42, 0x92, 0x02, 0x0a, 0x25, 0x63, 0x6f, 0x6d, 0x2e, 0x68, - 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, - 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x42, 0x0c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, - 0x5a, 0x33, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x68, 0x61, 0x73, - 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2f, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x2f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2f, 0x70, 0x62, 0x73, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0xa2, 0x02, 0x04, 0x48, 0x43, 0x49, 0x53, 0xaa, 0x02, 0x21, 0x48, - 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, - 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0xca, 0x02, 0x21, 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x5c, 0x43, 0x6f, 0x6e, - 0x73, 0x75, 0x6c, 0x5c, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5c, 0x53, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0xe2, 0x02, 0x2d, 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, - 0x5c, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x5c, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, - 0x5c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, - 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x24, 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, - 0x3a, 0x3a, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x3a, 0x3a, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, - 0x61, 0x6c, 0x3a, 0x3a, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x33, + 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x12, 0x46, 0x0a, 0x08, 0x4c, 0x6f, 0x63, 0x61, 0x6c, + 0x69, 0x74, 0x79, 0x18, 0x13, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x68, 0x61, 0x73, 0x68, + 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, + 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4c, 0x6f, 0x63, + 0x61, 0x6c, 0x69, 0x74, 0x79, 0x52, 0x08, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x1a, + 0x75, 0x0a, 0x14, 0x54, 0x61, 0x67, 0x67, 0x65, 0x64, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, + 0x65, 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, 0x47, 0x0a, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, + 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, + 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x53, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x37, 0x0a, 0x09, 0x4d, 0x65, 0x74, 0x61, 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, 0x22, + 0x3e, 0x0a, 0x0e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, + 0x73, 0x12, 0x18, 0x0a, 0x07, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x07, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x50, + 0x6f, 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x22, + 0x3d, 0x0a, 0x07, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x50, 0x61, + 0x73, 0x73, 0x69, 0x6e, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x50, 0x61, 0x73, + 0x73, 0x69, 0x6e, 0x67, 0x12, 0x18, 0x0a, 0x07, 0x57, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x57, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x42, 0x92, + 0x02, 0x0a, 0x25, 0x63, 0x6f, 0x6d, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, + 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, + 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x42, 0x0c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x33, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, + 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2f, 0x63, + 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x70, 0x72, 0x69, 0x76, + 0x61, 0x74, 0x65, 0x2f, 0x70, 0x62, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0xa2, 0x02, 0x04, + 0x48, 0x43, 0x49, 0x53, 0xaa, 0x02, 0x21, 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, + 0x2e, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, + 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0xca, 0x02, 0x21, 0x48, 0x61, 0x73, 0x68, 0x69, + 0x63, 0x6f, 0x72, 0x70, 0x5c, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x5c, 0x49, 0x6e, 0x74, 0x65, + 0x72, 0x6e, 0x61, 0x6c, 0x5c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0xe2, 0x02, 0x2d, 0x48, + 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x5c, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x5c, + 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x24, 0x48, + 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x3a, 0x3a, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, + 0x3a, 0x3a, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x3a, 0x3a, 0x53, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -1517,6 +1531,7 @@ var file_private_pbservice_service_proto_goTypes = []interface{}{ (*pbcommon.EnvoyExtension)(nil), // 15: hashicorp.consul.internal.common.EnvoyExtension (*CheckType)(nil), // 16: hashicorp.consul.internal.service.CheckType (*pbcommon.EnterpriseMeta)(nil), // 17: hashicorp.consul.internal.common.EnterpriseMeta + (*pbcommon.Locality)(nil), // 18: hashicorp.consul.internal.common.Locality } var file_private_pbservice_service_proto_depIdxs = []int32{ 14, // 0: hashicorp.consul.internal.service.ConnectProxyConfig.Config:type_name -> google.protobuf.Struct @@ -1539,12 +1554,13 @@ var file_private_pbservice_service_proto_depIdxs = []int32{ 0, // 17: hashicorp.consul.internal.service.ServiceDefinition.Proxy:type_name -> hashicorp.consul.internal.service.ConnectProxyConfig 17, // 18: hashicorp.consul.internal.service.ServiceDefinition.EnterpriseMeta:type_name -> hashicorp.consul.internal.common.EnterpriseMeta 2, // 19: hashicorp.consul.internal.service.ServiceDefinition.Connect:type_name -> hashicorp.consul.internal.service.ServiceConnect - 10, // 20: hashicorp.consul.internal.service.ServiceDefinition.TaggedAddressesEntry.value:type_name -> hashicorp.consul.internal.service.ServiceAddress - 21, // [21:21] is the sub-list for method output_type - 21, // [21:21] is the sub-list for method input_type - 21, // [21:21] is the sub-list for extension type_name - 21, // [21:21] is the sub-list for extension extendee - 0, // [0:21] is the sub-list for field type_name + 18, // 20: hashicorp.consul.internal.service.ServiceDefinition.Locality:type_name -> hashicorp.consul.internal.common.Locality + 10, // 21: hashicorp.consul.internal.service.ServiceDefinition.TaggedAddressesEntry.value:type_name -> hashicorp.consul.internal.service.ServiceAddress + 22, // [22:22] is the sub-list for method output_type + 22, // [22:22] is the sub-list for method input_type + 22, // [22:22] is the sub-list for extension type_name + 22, // [22:22] is the sub-list for extension extendee + 0, // [0:22] is the sub-list for field type_name } func init() { file_private_pbservice_service_proto_init() } diff --git a/proto/private/pbservice/service.proto b/proto/private/pbservice/service.proto index b25363e2f87..7ffe1e71726 100644 --- a/proto/private/pbservice/service.proto +++ b/proto/private/pbservice/service.proto @@ -307,6 +307,10 @@ message ServiceDefinition { // mog: func-to=ServiceConnectPtrToStructs func-from=NewServiceConnectPtrFromStructs ServiceConnect Connect = 15; + + // Locality identifies where the service is running. + // mog: func-to=LocalityToStructs func-from=LocalityFromStructs + common.Locality Locality = 19; } // Type to hold an address and port of a service diff --git a/sdk/testutil/server.go b/sdk/testutil/server.go index de42a8e41af..f48a1083947 100644 --- a/sdk/testutil/server.go +++ b/sdk/testutil/server.go @@ -72,11 +72,18 @@ type TestNetworkSegment struct { Advertise string `json:"advertise"` } +// Locality is used as the TestServerConfig's Locality. +type Locality struct { + Region string `json:"region"` + Zone string `json:"zone"` +} + // TestServerConfig is the main server configuration struct. type TestServerConfig struct { NodeName string `json:"node_name"` NodeID string `json:"node_id"` NodeMeta map[string]string `json:"node_meta,omitempty"` + NodeLocality *Locality `json:"locality,omitempty"` Performance *TestPerformanceConfig `json:"performance,omitempty"` Bootstrap bool `json:"bootstrap,omitempty"` Server bool `json:"server,omitempty"` From e298f506a5058a34925b2cef7cc964e3d7d71829 Mon Sep 17 00:00:00 2001 From: Eric Haberkorn Date: Fri, 10 Mar 2023 12:59:47 -0500 Subject: [PATCH 141/262] Add Peer Locality to Discovery Chains (#16588) Add peer locality to discovery chains --- agent/configentry/discoverychain.go | 13 ++++++ agent/consul/discoverychain/compile.go | 6 +++ agent/consul/discoverychain/compile_test.go | 31 +++++++++++++ agent/consul/state/config_entry.go | 22 +++++++++ agent/consul/state/config_entry_test.go | 49 ++++++++++++++++++++ agent/structs/config_entry_discoverychain.go | 21 +++++++++ agent/structs/discovery_chain.go | 13 +++--- agent/structs/structs.deepcopy.go | 4 ++ 8 files changed, 153 insertions(+), 6 deletions(-) diff --git a/agent/configentry/discoverychain.go b/agent/configentry/discoverychain.go index 4acf3f9ff88..556d807b81e 100644 --- a/agent/configentry/discoverychain.go +++ b/agent/configentry/discoverychain.go @@ -2,6 +2,7 @@ package configentry import ( "github.com/hashicorp/consul/agent/structs" + "github.com/hashicorp/consul/proto/private/pbpeering" ) // DiscoveryChainSet is a wrapped set of raw cross-referenced config entries @@ -13,6 +14,7 @@ type DiscoveryChainSet struct { Splitters map[structs.ServiceID]*structs.ServiceSplitterConfigEntry Resolvers map[structs.ServiceID]*structs.ServiceResolverConfigEntry Services map[structs.ServiceID]*structs.ServiceConfigEntry + Peers map[string]*pbpeering.Peering ProxyDefaults map[string]*structs.ProxyConfigEntry } @@ -22,6 +24,7 @@ func NewDiscoveryChainSet() *DiscoveryChainSet { Splitters: make(map[structs.ServiceID]*structs.ServiceSplitterConfigEntry), Resolvers: make(map[structs.ServiceID]*structs.ServiceResolverConfigEntry), Services: make(map[structs.ServiceID]*structs.ServiceConfigEntry), + Peers: make(map[string]*pbpeering.Peering), ProxyDefaults: make(map[string]*structs.ProxyConfigEntry), } } @@ -111,6 +114,16 @@ func (e *DiscoveryChainSet) AddProxyDefaults(entries ...*structs.ProxyConfigEntr } } +// AddPeers adds cluster peers. Convenience function for testing. +func (e *DiscoveryChainSet) AddPeers(entries ...*pbpeering.Peering) { + if e.Peers == nil { + e.Peers = make(map[string]*pbpeering.Peering) + } + for _, entry := range entries { + e.Peers[entry.Name] = entry + } +} + // AddEntries adds generic configs. Convenience function for testing. Panics on // operator error. func (e *DiscoveryChainSet) AddEntries(entries ...structs.ConfigEntry) { diff --git a/agent/consul/discoverychain/compile.go b/agent/consul/discoverychain/compile.go index 0158fc90161..ea1140bf097 100644 --- a/agent/consul/discoverychain/compile.go +++ b/agent/consul/discoverychain/compile.go @@ -12,6 +12,7 @@ import ( "github.com/hashicorp/consul/agent/configentry" "github.com/hashicorp/consul/agent/connect" "github.com/hashicorp/consul/agent/structs" + "github.com/hashicorp/consul/proto/private/pbpeering" ) type CompileRequest struct { @@ -736,6 +737,11 @@ func (c *compiler) newTarget(opts structs.DiscoveryTargetOpts) *structs.Discover // Use the same representation for the name. This will NOT be overridden // later. t.Name = t.SNI + } else { + peer := c.entries.Peers[opts.Peer] + if peer != nil && peer.Remote != nil { + t.Locality = pbpeering.LocalityToStructs(peer.Remote.Locality) + } } prev, ok := c.loadedTargets[t.ID] diff --git a/agent/consul/discoverychain/compile_test.go b/agent/consul/discoverychain/compile_test.go index 1e6690233da..99371a61d1e 100644 --- a/agent/consul/discoverychain/compile_test.go +++ b/agent/consul/discoverychain/compile_test.go @@ -9,6 +9,8 @@ import ( "github.com/hashicorp/consul/agent/configentry" "github.com/hashicorp/consul/agent/connect" "github.com/hashicorp/consul/agent/structs" + "github.com/hashicorp/consul/proto/private/pbcommon" + "github.com/hashicorp/consul/proto/private/pbpeering" ) type compileTestCase struct { @@ -1578,12 +1580,25 @@ func testcase_Failover_Targets() compileTestCase { {Datacenter: "dc3"}, {Service: "new-main"}, {Peer: "cluster-01"}, + {Peer: "cluster-02"}, }, }, }, }, ) + entries.AddPeers( + &pbpeering.Peering{ + Name: "cluster-01", + Remote: &pbpeering.RemoteInfo{ + Locality: &pbcommon.Locality{ + Region: "us-west-1", + Zone: "us-west-1a", + }, + }, + }, + ) + expect := &structs.CompiledDiscoveryChain{ Protocol: "tcp", StartNode: "resolver:main.default.default.dc1", @@ -1599,6 +1614,7 @@ func testcase_Failover_Targets() compileTestCase { "main.default.default.dc3", "new-main.default.default.dc1", "main.default.default.external.cluster-01", + "main.default.default.external.cluster-02", }, }, }, @@ -1626,6 +1642,21 @@ func testcase_Failover_Targets() compileTestCase { "main.default.default.external.cluster-01": newTarget(structs.DiscoveryTargetOpts{ Service: "main", Peer: "cluster-01", + }, func(t *structs.DiscoveryTarget) { + t.SNI = "" + t.Name = "" + t.Datacenter = "" + t.MeshGateway = structs.MeshGatewayConfig{ + Mode: structs.MeshGatewayModeRemote, + } + t.Locality = &structs.Locality{ + Region: "us-west-1", + Zone: "us-west-1a", + } + }), + "main.default.default.external.cluster-02": newTarget(structs.DiscoveryTargetOpts{ + Service: "main", + Peer: "cluster-02", }, func(t *structs.DiscoveryTarget) { t.SNI = "" t.Name = "" diff --git a/agent/consul/state/config_entry.go b/agent/consul/state/config_entry.go index 903fcbe9ee7..3e4964c5a53 100644 --- a/agent/consul/state/config_entry.go +++ b/agent/consul/state/config_entry.go @@ -1293,6 +1293,7 @@ func readDiscoveryChainConfigEntriesTxn( todoSplitters = make(map[structs.ServiceID]struct{}) todoResolvers = make(map[structs.ServiceID]struct{}) todoDefaults = make(map[structs.ServiceID]struct{}) + todoPeers = make(map[string]struct{}) ) sid := structs.NewServiceID(serviceName, entMeta) @@ -1394,6 +1395,10 @@ func readDiscoveryChainConfigEntriesTxn( for _, svc := range resolver.ListRelatedServices() { todoResolvers[svc] = struct{}{} } + + for _, peer := range resolver.RelatedPeers() { + todoPeers[peer] = struct{}{} + } } for { @@ -1435,6 +1440,23 @@ func readDiscoveryChainConfigEntriesTxn( res.Services[svcID] = entry } + peerEntMeta := structs.DefaultEnterpriseMetaInPartition(entMeta.PartitionOrDefault()) + for peerName := range todoPeers { + q := Query{ + Value: peerName, + EnterpriseMeta: *peerEntMeta, + } + idx, entry, err := peeringReadTxn(tx, ws, q) + if err != nil { + return 0, nil, err + } + if idx > maxIdx { + maxIdx = idx + } + + res.Peers[peerName] = entry + } + // Strip nils now that they are no longer necessary. for sid, entry := range res.Routers { if entry == nil { diff --git a/agent/consul/state/config_entry_test.go b/agent/consul/state/config_entry_test.go index 5253a20278e..b6db8d52cb9 100644 --- a/agent/consul/state/config_entry_test.go +++ b/agent/consul/state/config_entry_test.go @@ -9,6 +9,8 @@ import ( "github.com/hashicorp/consul/agent/configentry" "github.com/hashicorp/consul/agent/structs" + "github.com/hashicorp/consul/proto/private/pbpeering" + "github.com/hashicorp/consul/proto/private/prototest" "github.com/hashicorp/consul/sdk/testutil" ) @@ -2065,6 +2067,53 @@ func TestStore_ReadDiscoveryChainConfigEntries_SubsetSplit(t *testing.T) { require.Len(t, entrySet.Services, 1) } +func TestStore_ReadDiscoveryChainConfigEntries_FetchPeers(t *testing.T) { + s := testConfigStateStore(t) + + entries := []structs.ConfigEntry{ + &structs.ServiceConfigEntry{ + Kind: structs.ServiceDefaults, + Name: "main", + Protocol: "http", + }, + &structs.ServiceResolverConfigEntry{ + Kind: structs.ServiceResolver, + Name: "main", + Failover: map[string]structs.ServiceResolverFailover{ + "*": { + Targets: []structs.ServiceResolverFailoverTarget{ + {Peer: "cluster-01"}, + {Peer: "cluster-02"}, // Non-existant + }, + }, + }, + }, + } + + for _, entry := range entries { + require.NoError(t, s.EnsureConfigEntry(0, entry)) + } + + cluster01Peering := &pbpeering.Peering{ + ID: testFooPeerID, + Name: "cluster-01", + } + err := s.PeeringWrite(0, &pbpeering.PeeringWriteRequest{Peering: cluster01Peering}) + require.NoError(t, err) + + _, entrySet, err := s.readDiscoveryChainConfigEntries(nil, "main", nil, nil) + require.NoError(t, err) + + require.Len(t, entrySet.Routers, 0) + require.Len(t, entrySet.Splitters, 0) + require.Len(t, entrySet.Resolvers, 1) + require.Len(t, entrySet.Services, 1) + prototest.AssertDeepEqual(t, entrySet.Peers, map[string]*pbpeering.Peering{ + "cluster-01": cluster01Peering, + "cluster-02": nil, + }) +} + // TODO(rb): add ServiceIntentions tests func TestStore_ValidateGatewayNamesCannotBeShared(t *testing.T) { diff --git a/agent/structs/config_entry_discoverychain.go b/agent/structs/config_entry_discoverychain.go index 7b655475c7e..0d58acef8a5 100644 --- a/agent/structs/config_entry_discoverychain.go +++ b/agent/structs/config_entry_discoverychain.go @@ -18,6 +18,7 @@ import ( "github.com/hashicorp/consul/acl" "github.com/hashicorp/consul/agent/cache" "github.com/hashicorp/consul/lib" + "github.com/hashicorp/consul/lib/maps" ) const ( @@ -871,6 +872,26 @@ type ServiceResolverConfigEntry struct { RaftIndex } +func (e *ServiceResolverConfigEntry) RelatedPeers() []string { + peers := make(map[string]struct{}) + + if r := e.Redirect; r != nil && r.Peer != "" { + peers[r.Peer] = struct{}{} + } + + if e.Failover != nil { + for _, f := range e.Failover { + for _, t := range f.Targets { + if t.Peer != "" { + peers[t.Peer] = struct{}{} + } + } + } + } + + return maps.SliceOfKeys(peers) +} + func (e *ServiceResolverConfigEntry) MarshalJSON() ([]byte, error) { type Alias ServiceResolverConfigEntry exported := &struct { diff --git a/agent/structs/discovery_chain.go b/agent/structs/discovery_chain.go index 67abde33b17..545aa19a2b9 100644 --- a/agent/structs/discovery_chain.go +++ b/agent/structs/discovery_chain.go @@ -190,12 +190,13 @@ type DiscoveryTarget struct { // chain. It should be treated as a per-compile opaque string. ID string `json:",omitempty"` - Service string `json:",omitempty"` - ServiceSubset string `json:",omitempty"` - Namespace string `json:",omitempty"` - Partition string `json:",omitempty"` - Datacenter string `json:",omitempty"` - Peer string `json:",omitempty"` + Service string `json:",omitempty"` + ServiceSubset string `json:",omitempty"` + Namespace string `json:",omitempty"` + Partition string `json:",omitempty"` + Datacenter string `json:",omitempty"` + Peer string `json:",omitempty"` + Locality *Locality `json:",omitempty"` MeshGateway MeshGatewayConfig `json:",omitempty"` Subset ServiceResolverSubset `json:",omitempty"` diff --git a/agent/structs/structs.deepcopy.go b/agent/structs/structs.deepcopy.go index 72a7a464a69..b1b7748effd 100644 --- a/agent/structs/structs.deepcopy.go +++ b/agent/structs/structs.deepcopy.go @@ -125,6 +125,10 @@ func (o *CompiledDiscoveryChain) DeepCopy() *CompiledDiscoveryChain { if v2 != nil { cp_Targets_v2 = new(DiscoveryTarget) *cp_Targets_v2 = *v2 + if v2.Locality != nil { + cp_Targets_v2.Locality = new(Locality) + *cp_Targets_v2.Locality = *v2.Locality + } } cp.Targets[k2] = cp_Targets_v2 } From 51902695de8fc58a5526eed6e06cc9de712fc699 Mon Sep 17 00:00:00 2001 From: trujillo-adam <47586768+trujillo-adam@users.noreply.github.com> Date: Fri, 10 Mar 2023 11:33:42 -0800 Subject: [PATCH 142/262] fixes for unsupported partitions field in CRD metadata block (#16604) * fixes for unsupported partitions field in CRD metadata block * Apply suggestions from code review Co-authored-by: Luke Kysow <1034429+lkysow@users.noreply.github.com> --------- Co-authored-by: Luke Kysow <1034429+lkysow@users.noreply.github.com> --- .../config-entries/ingress-gateway.mdx | 4 +- .../config-entries/service-defaults.mdx | 9 -- .../docs/services/usage/define-services.mdx | 86 ++++++++++++++++++- 3 files changed, 88 insertions(+), 11 deletions(-) diff --git a/website/content/docs/connect/config-entries/ingress-gateway.mdx b/website/content/docs/connect/config-entries/ingress-gateway.mdx index b1cb5c87ab4..07f01a03b1c 100644 --- a/website/content/docs/connect/config-entries/ingress-gateway.mdx +++ b/website/content/docs/connect/config-entries/ingress-gateway.mdx @@ -88,6 +88,9 @@ spec: + +For Kubernetes environments, the configuration entry is always created in the same partition as the Kubernetes cluster. + ```hcl @@ -117,7 +120,6 @@ kind: IngressGateway metadata: name: namespace: - partition: spec: listeners: diff --git a/website/content/docs/connect/config-entries/service-defaults.mdx b/website/content/docs/connect/config-entries/service-defaults.mdx index 3dd9812d3c0..f14b0c63e64 100644 --- a/website/content/docs/connect/config-entries/service-defaults.mdx +++ b/website/content/docs/connect/config-entries/service-defaults.mdx @@ -82,7 +82,6 @@ The following outline shows how to format the service splitter configuration ent - [`metadata`](#metadata): map | no default - [`name`](#name): string | no default - [`namespace`](#namespace): string | no default | - - [`partition`](#partition): string | no default | - [`spec`](#spec): map | no default - [`protocol`](#protocol): string | default: `tcp` - [`balanceInboundConnections`](#balanceinboundconnections): string | no default @@ -239,7 +238,6 @@ kind: ServiceDefaults metadata: name: namespace: - partition: spec: protocol: tcp balanceInboundConnnections: exact_balance @@ -802,13 +800,6 @@ Specifies the Consul namespace that the configuration entry applies to. Refer to - Default: `default` - Data type: string -### `metadata.partition` - -Specifies the name of the name of the Consul admin partition that the configuration entry applies to. Refer to [Consul Enterprise](/consul/docs/k8s/crds#consul-enterprise) for information about how Consul Enterprise on Kubernetes. Consul OSS distributions ignore the `metadata.partition` configuration. - -- Default: `default` -- Data type: string - ### `spec` Map that contains the details about the `ServiceDefaults` configuration entry. The `apiVersion`, `kind`, and `metadata` fields are siblings of the `spec` field. All other configurations are children. diff --git a/website/content/docs/services/usage/define-services.mdx b/website/content/docs/services/usage/define-services.mdx index a4b6eaa1596..3a7862c92a7 100644 --- a/website/content/docs/services/usage/define-services.mdx +++ b/website/content/docs/services/usage/define-services.mdx @@ -15,7 +15,7 @@ You must tell Consul about the services deployed to your network if you want the You can define multiple services individually using `service` blocks or group multiple services into the same `services` configuration block. Refer to [Define multiple services in a single file](#define-multiple-services-in-a-single-file) for additional information. -If Consul service mesh is enabled in your network, you can use the `service-defaults` configuration entry to specify default global values for services. The configuraiton entry lets you define common service parameter, such as upstreams, namespaces, and partitions. Refer to [Define service defaults](#define-service-defaults) for additional information. +If Consul service mesh is enabled in your network, you can use the [service defaults configuration entry](/consul/docs/connect/config-entries/service-defaults) to specify default global values for services. The configuration entry lets you define common service parameter, such as upstreams, namespaces, and partitions. Refer to [Define service defaults](#define-service-defaults) for additional information. ## Requirements @@ -145,6 +145,9 @@ If Consul service mesh is enabled in your network, you can define default values Create a file for the configuration entry and specify the required fields. If you are authoring `service-defaults` in HCL or JSON, the `Kind` and `Name` fields are required. On Kubernetes, the `apiVersion`, `kind`, and `metadata.name` fields are required. Refer to [Service Defaults Reference](/consul/docs/connect/config-entries/service-defaults) for details about the configuration options. +If you use Consul Enterprise, you can also specify the `Namespace` and `Partition` fields to apply the configuration to services in a specific namespace or partition. For Kubernetes environments, the configuration entry is always created in the same partition as the Kubernetes cluster. + +### Consul OSS example The following example instructs services named `counting` to send up to `512` concurrent requests to a mesh gateway: @@ -222,6 +225,87 @@ spec: ``` +### Consul Enterprise example +The following example instructs services named `counting` in the `prod` namespace to send up to `512` concurrent requests to a mesh gateway: + + + +```hcl +Kind = "service-defaults" +Name = "counting" +Namespace = "prod" + +UpstreamConfig = { + Defaults = { + MeshGateway = { + Mode = "local" + } + Limits = { + MaxConnections = 512 + MaxPendingRequests = 512 + MaxConcurrentRequests = 512 + } + } + + Overrides = [ + { + Name = "dashboard" + MeshGateway = { + Mode = "remote" + } + } + ] +} +``` +```yaml +apiVersion: consul.hashicorp.com/v1alpha1 +kind: ServiceDefaults +metadata: + name: counting + namespace: prod +spec: + upstreamConfig: + defaults: + meshGateway: + mode: local + limits: + maxConnections: 512 + maxPendingRequests: 512 + maxConcurrentRequests: 512 + overrides: + - name: dashboard + meshGateway: + mode: remote +``` +```json +{ + "Kind": "service-defaults", + "Name": "counting", + "Namespace" : "prod", + "UpstreamConfig": { + "Defaults": { + "MeshGateway": { + "Mode": "local" + }, + "Limits": { + "MaxConnections": 512, + "MaxPendingRequests": 512, + "MaxConcurrentRequests": 512 + } + }, + "Overrides": [ + { + "Name": "dashboard", + "MeshGateway": { + "Mode": "remote" + } + } + ] + } +} +``` + + ### Apply service defaults You can apply your `service-defaults` configuration entry using the [`consul config` command](/consul/commands/config) or by calling the [`/config` API endpoint](/consul/api-docs/config). In Kubernetes environments, apply the `service-defaults` custom resource definitions (CRD) to implement and manage Consul configuration entries. From a01920b0c06ab4b544f7be06e757c868b777be92 Mon Sep 17 00:00:00 2001 From: Eddie Rowe <74205376+eddie-rowe@users.noreply.github.com> Date: Fri, 10 Mar 2023 14:13:14 -0600 Subject: [PATCH 143/262] Create a weekly 404 checker for all Consul docs content (#16603) --- .github/workflows/broken-link-check.yml | 30 +++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 .github/workflows/broken-link-check.yml diff --git a/.github/workflows/broken-link-check.yml b/.github/workflows/broken-link-check.yml new file mode 100644 index 00000000000..8e865a485f0 --- /dev/null +++ b/.github/workflows/broken-link-check.yml @@ -0,0 +1,30 @@ +name: Broken Link Check + +on: + workflow_dispatch: + schedule: + - cron: "0 0 * * 1" + +jobs: + linkChecker: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + + - name: Run lychee link checker + id: lychee + uses: lycheeverse/lychee-action@v1.6.1 + with: + args: ./docs --base https://developer.hashicorp.com/ --exclude-all-private --exclude .png --exclude .svg --max-concurrency=24 --no-progress --verbose + # Fail GitHub action when broken links are found? + fail: false + env: + GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}} + + - name: Create GitHub Issue From lychee output file + if: env.lychee_exit_code != 0 + uses: peter-evans/create-issue-from-file@v4 + with: + title: Link Checker Report + content-filepath: ./lychee/out.md + labels: report, automated issue \ No newline at end of file From 726c97b2bd2bd82fbf372b1af55e6eaec0a76fcc Mon Sep 17 00:00:00 2001 From: natemollica-dev <57850649+natemollica-nm@users.noreply.github.com> Date: Fri, 10 Mar 2023 12:45:32 -0800 Subject: [PATCH 144/262] Consul WAN Fed with Vault Secrets Backend document updates (#16597) * Consul WAN Fed with Vault Secrets Backend document updates * Corrected dc1-consul.yaml and dc2-consul.yaml file highlights * Update website/content/docs/k8s/deployment-configurations/vault/wan-federation.mdx Co-authored-by: trujillo-adam <47586768+trujillo-adam@users.noreply.github.com> * Update website/content/docs/k8s/deployment-configurations/vault/wan-federation.mdx Co-authored-by: trujillo-adam <47586768+trujillo-adam@users.noreply.github.com> --------- Co-authored-by: trujillo-adam <47586768+trujillo-adam@users.noreply.github.com> --- .../vault/wan-federation.mdx | 27 +++++++++++++++---- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/website/content/docs/k8s/deployment-configurations/vault/wan-federation.mdx b/website/content/docs/k8s/deployment-configurations/vault/wan-federation.mdx index 5c2badb0932..a243269f54a 100644 --- a/website/content/docs/k8s/deployment-configurations/vault/wan-federation.mdx +++ b/website/content/docs/k8s/deployment-configurations/vault/wan-federation.mdx @@ -311,12 +311,16 @@ Repeat the following steps for each datacenter in the cluster: 1. Update the Consul on Kubernetes helm chart. ### Secrets and Policies -1. Store the ACL Replication Token, Gossip Encryption Key, and Root CA certificate secrets in Vault. +1. Store the ACL bootstrap and replication tokens, gossip encryption key, and root CA certificate secrets in Vault. ```shell-session $ vault kv put consul/secret/gossip key="$(consul keygen)" ``` + ```shell-session + $ vault kv put consul/secret/bootstrap token="$(uuidgen | tr '[:upper:]' '[:lower:]')" + ``` + ```shell-session $ vault kv put consul/secret/replication token="$(uuidgen | tr '[:upper:]' '[:lower:]')" ``` @@ -334,6 +338,14 @@ Repeat the following steps for each datacenter in the cluster: EOF ``` + ```shell-session + $ vault policy write bootstrap-token - < + ```yaml global: @@ -460,8 +472,13 @@ Repeat the following steps for each datacenter in the cluster: secretName: pki/cert/ca federation: enabled: true + createFederationSecret: false acls: manageSystemACLs: true + createReplicationToken: true + boostrapToken: + secretName: consul/data/secret/bootstrap + secretKey: token replicationToken: secretName: consul/data/secret/replication secretKey: token @@ -611,7 +628,7 @@ Repeat the following steps for each datacenter in the cluster: -> **Note**: To configure Vault as the Connect CA in secondary datacenters, you need to make sure that the Root CA path is the same. The intermediate path is different for each datacenter. In the `connectCA` Helm configuration for a secondary datacenter, you can specify a `intermediatePKIPath` that is, for example, prefixed with the datacenter for which this configuration is intended (e.g. `dc2/connect-intermediate`). - + ```yaml global: @@ -673,4 +690,4 @@ Repeat the following steps for each datacenter in the cluster: ## Next steps You have completed the process of federating the secondary datacenter (dc2) with the primary datacenter (dc1) using Vault as the Secrets backend. To validate that everything is configured properly, please confirm that all pods within both datacenters are in a running state. -For further detail on specific Consul secrets that are available to be stored in Vault, please checkout the detailed information in the [Data Integration](/consul/docs/k8s/deployment-configurations/vault/data-integration) section of the [Vault as a Secrets Backend](/consul/docs/k8s/deployment-configurations/vault) area of the Consul on Kubernetes documentation. +For additional information about specific Consul secrets that you can store in Vault, refer to [Data Integration](/consul/docs/k8s/deployment-configurations/vault/data-integration) in the [Vault as a Secrets Backend](/consul/docs/k8s/deployment-configurations/vault) documentation. From f95ffe03556650feba579b3e3ab5c0a031c23449 Mon Sep 17 00:00:00 2001 From: Ashvitha Date: Fri, 10 Mar 2023 15:52:54 -0500 Subject: [PATCH 145/262] Allow HCP metrics collection for Envoy proxies Co-authored-by: Ashvitha Sridharan Co-authored-by: Freddy Add a new envoy flag: "envoy_hcp_metrics_bind_socket_dir", a directory where a unix socket will be created with the name `_.sock` to forward Envoy metrics. If set, this will configure: - In bootstrap configuration a local stats_sink and static cluster. These will forward metrics to a loopback listener sent over xDS. - A dynamic listener listening at the socket path that the previously defined static cluster is sending metrics to. - A dynamic cluster that will forward traffic received at this listener to the hcp-metrics-collector service. Reasons for having a static cluster pointing at a dynamic listener: - We want to secure the metrics stream using TLS, but the stats sink can only be defined in bootstrap config. With dynamic listeners/clusters we can use the proxy's leaf certificate issued by the Connect CA, which isn't available at bootstrap time. - We want to intelligently route to the HCP collector. Configuring its addreess at bootstrap time limits our flexibility routing-wise. More on this below. Reasons for defining the collector as an upstream in `proxycfg`: - The HCP collector will be deployed as a mesh service. - Certificate management is taken care of, as mentioned above. - Service discovery and routing logic is automatically taken care of, meaning that no code changes are required in the xds package. - Custom routing rules can be added for the collector using discovery chain config entries. Initially the collector is expected to be deployed to each admin partition, but in the future could be deployed centrally in the default partition. These config entries could even be managed by HCP itself. --- .changelog/16585.txt | 3 + agent/proxycfg/connect_proxy.go | 71 +++++ agent/proxycfg/state_test.go | 184 ++++++++++++- agent/proxycfg/testing_connect_proxy.go | 50 ++++ agent/xds/resources_test.go | 4 + .../clusters/hcp-metrics.latest.golden | 183 +++++++++++++ .../endpoints/hcp-metrics.latest.golden | 97 +++++++ .../listeners/hcp-metrics.latest.golden | 184 +++++++++++++ .../testdata/routes/hcp-metrics.latest.golden | 5 + .../secrets/hcp-metrics.latest.golden | 5 + api/connect.go | 3 + command/connect/envoy/bootstrap_config.go | 66 ++++- .../connect/envoy/bootstrap_config_test.go | 200 ++++++++++++-- command/connect/envoy/bootstrap_tpl.go | 4 +- command/connect/envoy/envoy_test.go | 23 ++ .../connect/envoy/testdata/hcp-metrics.golden | 247 ++++++++++++++++++ website/content/commands/connect/envoy.mdx | 4 + 17 files changed, 1295 insertions(+), 38 deletions(-) create mode 100644 .changelog/16585.txt create mode 100644 agent/xds/testdata/clusters/hcp-metrics.latest.golden create mode 100644 agent/xds/testdata/endpoints/hcp-metrics.latest.golden create mode 100644 agent/xds/testdata/listeners/hcp-metrics.latest.golden create mode 100644 agent/xds/testdata/routes/hcp-metrics.latest.golden create mode 100644 agent/xds/testdata/secrets/hcp-metrics.latest.golden create mode 100644 command/connect/envoy/testdata/hcp-metrics.golden diff --git a/.changelog/16585.txt b/.changelog/16585.txt new file mode 100644 index 00000000000..11e2959cfbd --- /dev/null +++ b/.changelog/16585.txt @@ -0,0 +1,3 @@ +```release-note:feature +xds: Allow for configuring connect proxies to send service mesh telemetry to an HCP metrics collection service. +``` \ No newline at end of file diff --git a/agent/proxycfg/connect_proxy.go b/agent/proxycfg/connect_proxy.go index 98001fd8663..97cd0527b9f 100644 --- a/agent/proxycfg/connect_proxy.go +++ b/agent/proxycfg/connect_proxy.go @@ -3,12 +3,16 @@ package proxycfg import ( "context" "fmt" + "path" "strings" + "github.com/hashicorp/consul/acl" cachetype "github.com/hashicorp/consul/agent/cache-types" "github.com/hashicorp/consul/agent/proxycfg/internal/watch" "github.com/hashicorp/consul/agent/structs" + "github.com/hashicorp/consul/api" "github.com/hashicorp/consul/proto/private/pbpeering" + "github.com/mitchellh/mapstructure" ) type handlerConnectProxy struct { @@ -103,6 +107,10 @@ func (s *handlerConnectProxy) initialize(ctx context.Context) (ConfigSnapshot, e return snap, err } + if err := s.maybeInitializeHCPMetricsWatches(ctx, snap); err != nil { + return snap, fmt.Errorf("failed to initialize HCP metrics watches: %w", err) + } + if s.proxyCfg.Mode == structs.ProxyModeTransparent { // When in transparent proxy we will infer upstreams from intentions with this source err := s.dataSources.IntentionUpstreams.Notify(ctx, &structs.ServiceSpecificRequest{ @@ -614,3 +622,66 @@ func (s *handlerConnectProxy) handleUpdate(ctx context.Context, u UpdateEvent, s } return nil } + +// hcpMetricsConfig represents the basic opaque config values for pushing telemetry to HCP. +type hcpMetricsConfig struct { + // HCPMetricsBindSocketDir is a string that configures the directory for a + // unix socket where Envoy will forward metrics. These metrics get pushed to + // the HCP Metrics collector to show service mesh metrics on HCP. + HCPMetricsBindSocketDir string `mapstructure:"envoy_hcp_metrics_bind_socket_dir"` +} + +func parseHCPMetricsConfig(m map[string]interface{}) (hcpMetricsConfig, error) { + var cfg hcpMetricsConfig + err := mapstructure.WeakDecode(m, &cfg) + + if err != nil { + return cfg, fmt.Errorf("failed to decode: %w", err) + } + + return cfg, nil +} + +// maybeInitializeHCPMetricsWatches will initialize a synthetic upstream and discovery chain +// watch for the HCP metrics collector, if metrics collection is enabled on the proxy registration. +func (s *handlerConnectProxy) maybeInitializeHCPMetricsWatches(ctx context.Context, snap ConfigSnapshot) error { + hcpCfg, err := parseHCPMetricsConfig(s.proxyCfg.Config) + if err != nil { + s.logger.Error("failed to parse connect.proxy.config", "error", err) + } + + if hcpCfg.HCPMetricsBindSocketDir == "" { + // Metrics collection is not enabled, return early. + return nil + } + + // The path includes the proxy ID so that when multiple proxies are on the same host + // they each have a distinct path to send their metrics. + sock := fmt.Sprintf("%s_%s.sock", s.proxyID.NamespaceOrDefault(), s.proxyID.ID) + path := path.Join(hcpCfg.HCPMetricsBindSocketDir, sock) + + upstream := structs.Upstream{ + DestinationNamespace: acl.DefaultNamespaceName, + DestinationPartition: s.proxyID.PartitionOrDefault(), + DestinationName: api.HCPMetricsCollectorName, + LocalBindSocketPath: path, + Config: map[string]interface{}{ + "protocol": "grpc", + }, + } + uid := NewUpstreamID(&upstream) + snap.ConnectProxy.UpstreamConfig[uid] = &upstream + + err = s.dataSources.CompiledDiscoveryChain.Notify(ctx, &structs.DiscoveryChainRequest{ + Datacenter: s.source.Datacenter, + QueryOptions: structs.QueryOptions{Token: s.token}, + Name: upstream.DestinationName, + EvaluateInDatacenter: s.source.Datacenter, + EvaluateInNamespace: uid.NamespaceOrDefault(), + EvaluateInPartition: uid.PartitionOrDefault(), + }, "discovery-chain:"+uid.String(), s.ch) + if err != nil { + return fmt.Errorf("failed to watch discovery chain for %s: %v", uid.String(), err) + } + return nil +} diff --git a/agent/proxycfg/state_test.go b/agent/proxycfg/state_test.go index da4de7960fd..55e6aeaaca7 100644 --- a/agent/proxycfg/state_test.go +++ b/agent/proxycfg/state_test.go @@ -7,14 +7,16 @@ import ( "testing" "time" + cachetype "github.com/hashicorp/consul/agent/cache-types" "github.com/hashicorp/go-hclog" "github.com/stretchr/testify/require" "golang.org/x/time/rate" "github.com/hashicorp/consul/acl" - cachetype "github.com/hashicorp/consul/agent/cache-types" + "github.com/hashicorp/consul/agent/consul/discoverychain" "github.com/hashicorp/consul/agent/structs" + apimod "github.com/hashicorp/consul/api" "github.com/hashicorp/consul/proto/private/pbpeering" "github.com/hashicorp/consul/proto/private/prototest" "github.com/hashicorp/consul/sdk/testutil" @@ -455,16 +457,18 @@ func TestState_WatchesAndUpdates(t *testing.T) { // Used to account for differences in OSS/ent implementations of ServiceID.String() var ( - db = structs.NewServiceName("db", nil) - billing = structs.NewServiceName("billing", nil) - api = structs.NewServiceName("api", nil) - apiA = structs.NewServiceName("api-a", nil) - - apiUID = NewUpstreamIDFromServiceName(api) - dbUID = NewUpstreamIDFromServiceName(db) - pqUID = UpstreamIDFromString("prepared_query:query") - extApiUID = NewUpstreamIDFromServiceName(apiA) - extDBUID = NewUpstreamIDFromServiceName(db) + db = structs.NewServiceName("db", nil) + billing = structs.NewServiceName("billing", nil) + api = structs.NewServiceName("api", nil) + apiA = structs.NewServiceName("api-a", nil) + hcpCollector = structs.NewServiceName(apimod.HCPMetricsCollectorName, nil) + + apiUID = NewUpstreamIDFromServiceName(api) + dbUID = NewUpstreamIDFromServiceName(db) + pqUID = UpstreamIDFromString("prepared_query:query") + extApiUID = NewUpstreamIDFromServiceName(apiA) + extDBUID = NewUpstreamIDFromServiceName(db) + hcpCollectorUID = NewUpstreamIDFromServiceName(hcpCollector) ) // TODO(peering): NewUpstreamIDFromServiceName should take a PeerName extApiUID.Peer = "peer-a" @@ -3623,6 +3627,164 @@ func TestState_WatchesAndUpdates(t *testing.T) { }, }, }, + "hcp-metrics": { + ns: structs.NodeService{ + Kind: structs.ServiceKindConnectProxy, + ID: "web-sidecar-proxy", + Service: "web-sidecar-proxy", + Address: "10.0.1.1", + Port: 443, + Proxy: structs.ConnectProxyConfig{ + DestinationServiceName: "web", + Config: map[string]interface{}{ + "envoy_hcp_metrics_bind_socket_dir": "/tmp/consul/hcp-metrics/", + }, + }, + }, + sourceDC: "dc1", + stages: []verificationStage{ + { + requiredWatches: map[string]verifyWatchRequest{ + fmt.Sprintf("discovery-chain:%s", hcpCollectorUID.String()): genVerifyDiscoveryChainWatch(&structs.DiscoveryChainRequest{ + Name: hcpCollector.Name, + EvaluateInDatacenter: "dc1", + EvaluateInNamespace: "default", + EvaluateInPartition: "default", + Datacenter: "dc1", + QueryOptions: structs.QueryOptions{ + Token: aclToken, + }, + }), + }, + verifySnapshot: func(t testing.TB, snap *ConfigSnapshot) { + require.False(t, snap.Valid(), "should not be valid") + + require.Len(t, snap.ConnectProxy.DiscoveryChain, 0, "%+v", snap.ConnectProxy.DiscoveryChain) + require.Len(t, snap.ConnectProxy.WatchedDiscoveryChains, 0, "%+v", snap.ConnectProxy.WatchedDiscoveryChains) + require.Len(t, snap.ConnectProxy.WatchedUpstreams, 0, "%+v", snap.ConnectProxy.WatchedUpstreams) + require.Len(t, snap.ConnectProxy.WatchedUpstreamEndpoints, 0, "%+v", snap.ConnectProxy.WatchedUpstreamEndpoints) + }, + }, + { + events: []UpdateEvent{ + rootWatchEvent(), + { + CorrelationID: peeringTrustBundlesWatchID, + Result: peerTrustBundles, + }, + { + CorrelationID: leafWatchID, + Result: issuedCert, + Err: nil, + }, + { + CorrelationID: intentionsWatchID, + Result: TestIntentions(), + Err: nil, + }, + { + CorrelationID: meshConfigEntryID, + Result: &structs.ConfigEntryResponse{}, + }, + { + CorrelationID: fmt.Sprintf("discovery-chain:%s", hcpCollectorUID.String()), + Result: &structs.DiscoveryChainResponse{ + Chain: discoverychain.TestCompileConfigEntries(t, hcpCollector.Name, "default", "default", "dc1", "trustdomain.consul", nil), + }, + Err: nil, + }, + }, + verifySnapshot: func(t testing.TB, snap *ConfigSnapshot) { + require.True(t, snap.Valid()) + require.Equal(t, indexedRoots, snap.Roots) + require.Equal(t, issuedCert, snap.ConnectProxy.Leaf) + + // An event was received with the HCP collector's discovery chain, which sets up some bookkeeping in the snapshot. + require.Len(t, snap.ConnectProxy.DiscoveryChain, 1, "%+v", snap.ConnectProxy.DiscoveryChain) + require.Contains(t, snap.ConnectProxy.DiscoveryChain, hcpCollectorUID) + + require.Len(t, snap.ConnectProxy.WatchedUpstreams, 1, "%+v", snap.ConnectProxy.WatchedUpstreams) + require.Len(t, snap.ConnectProxy.WatchedUpstreamEndpoints, 1, "%+v", snap.ConnectProxy.WatchedUpstreamEndpoints) + require.Contains(t, snap.ConnectProxy.WatchedUpstreamEndpoints, hcpCollectorUID) + + expectUpstream := structs.Upstream{ + DestinationNamespace: "default", + DestinationPartition: "default", + DestinationName: apimod.HCPMetricsCollectorName, + LocalBindSocketPath: "/tmp/consul/hcp-metrics/default_web-sidecar-proxy.sock", + Config: map[string]interface{}{ + "protocol": "grpc", + }, + } + uid := NewUpstreamID(&expectUpstream) + + require.Contains(t, snap.ConnectProxy.UpstreamConfig, uid) + require.Equal(t, &expectUpstream, snap.ConnectProxy.UpstreamConfig[uid]) + + // No endpoints have arrived yet. + require.Len(t, snap.ConnectProxy.WatchedUpstreamEndpoints[hcpCollectorUID], 0, "%+v", snap.ConnectProxy.WatchedUpstreamEndpoints) + }, + }, + { + requiredWatches: map[string]verifyWatchRequest{ + fmt.Sprintf("upstream-target:%s.default.default.dc1:", apimod.HCPMetricsCollectorName) + hcpCollectorUID.String(): genVerifyServiceSpecificRequest(apimod.HCPMetricsCollectorName, "", "dc1", true), + }, + events: []UpdateEvent{ + { + CorrelationID: fmt.Sprintf("upstream-target:%s.default.default.dc1:", apimod.HCPMetricsCollectorName) + hcpCollectorUID.String(), + Result: &structs.IndexedCheckServiceNodes{ + Nodes: structs.CheckServiceNodes{ + { + Node: &structs.Node{ + Node: "node1", + Address: "10.0.0.1", + }, + Service: &structs.NodeService{ + ID: apimod.HCPMetricsCollectorName, + Service: apimod.HCPMetricsCollectorName, + Port: 8080, + }, + }, + }, + }, + Err: nil, + }, + }, + verifySnapshot: func(t testing.TB, snap *ConfigSnapshot) { + require.True(t, snap.Valid()) + require.Equal(t, indexedRoots, snap.Roots) + require.Equal(t, issuedCert, snap.ConnectProxy.Leaf) + + // Discovery chain for the HCP collector should still be stored in the snapshot. + require.Len(t, snap.ConnectProxy.DiscoveryChain, 1, "%+v", snap.ConnectProxy.DiscoveryChain) + require.Contains(t, snap.ConnectProxy.DiscoveryChain, hcpCollectorUID) + + require.Len(t, snap.ConnectProxy.WatchedUpstreams, 1, "%+v", snap.ConnectProxy.WatchedUpstreams) + require.Len(t, snap.ConnectProxy.WatchedUpstreamEndpoints, 1, "%+v", snap.ConnectProxy.WatchedUpstreamEndpoints) + require.Contains(t, snap.ConnectProxy.WatchedUpstreamEndpoints, hcpCollectorUID) + + // An endpoint arrived for the HCP collector, so it should be present in the snapshot. + require.Len(t, snap.ConnectProxy.WatchedUpstreamEndpoints[hcpCollectorUID], 1, "%+v", snap.ConnectProxy.WatchedUpstreamEndpoints) + + nodes := structs.CheckServiceNodes{ + { + Node: &structs.Node{ + Node: "node1", + Address: "10.0.0.1", + }, + Service: &structs.NodeService{ + ID: apimod.HCPMetricsCollectorName, + Service: apimod.HCPMetricsCollectorName, + Port: 8080, + }, + }, + } + target := fmt.Sprintf("%s.default.default.dc1", apimod.HCPMetricsCollectorName) + require.Equal(t, nodes, snap.ConnectProxy.WatchedUpstreamEndpoints[hcpCollectorUID][target]) + }, + }, + }, + }, } for name, tc := range cases { diff --git a/agent/proxycfg/testing_connect_proxy.go b/agent/proxycfg/testing_connect_proxy.go index 74ac5cb8670..394687a44bc 100644 --- a/agent/proxycfg/testing_connect_proxy.go +++ b/agent/proxycfg/testing_connect_proxy.go @@ -1,6 +1,7 @@ package proxycfg import ( + "fmt" "time" "github.com/mitchellh/go-testing-interface" @@ -9,6 +10,7 @@ import ( "github.com/hashicorp/consul/agent/connect" "github.com/hashicorp/consul/agent/consul/discoverychain" "github.com/hashicorp/consul/agent/structs" + "github.com/hashicorp/consul/api" "github.com/hashicorp/consul/types" ) @@ -288,3 +290,51 @@ func TestConfigSnapshotGRPCExposeHTTP1(t testing.T) *ConfigSnapshot { }, }) } + +// TestConfigSnapshotDiscoveryChain returns a fully populated snapshot using a discovery chain +func TestConfigSnapshotHCPMetrics(t testing.T) *ConfigSnapshot { + // DiscoveryChain without an UpstreamConfig should yield a + // filter chain when in transparent proxy mode + var ( + collector = structs.NewServiceName(api.HCPMetricsCollectorName, nil) + collectorUID = NewUpstreamIDFromServiceName(collector) + collectorChain = discoverychain.TestCompileConfigEntries(t, api.HCPMetricsCollectorName, "default", "default", "dc1", connect.TestClusterID+".consul", nil) + ) + + return TestConfigSnapshot(t, func(ns *structs.NodeService) { + ns.Proxy.Config = map[string]interface{}{ + "envoy_hcp_metrics_bind_socket_dir": "/tmp/consul/hcp-metrics", + } + }, []UpdateEvent{ + { + CorrelationID: meshConfigEntryID, + Result: &structs.ConfigEntryResponse{ + Entry: nil, + }, + }, + { + CorrelationID: "discovery-chain:" + collectorUID.String(), + Result: &structs.DiscoveryChainResponse{ + Chain: collectorChain, + }, + }, + { + CorrelationID: fmt.Sprintf("upstream-target:%s.default.default.dc1:", api.HCPMetricsCollectorName) + collectorUID.String(), + Result: &structs.IndexedCheckServiceNodes{ + Nodes: []structs.CheckServiceNode{ + { + Node: &structs.Node{ + Address: "8.8.8.8", + Datacenter: "dc1", + }, + Service: &structs.NodeService{ + Service: api.HCPMetricsCollectorName, + Address: "9.9.9.9", + Port: 9090, + }, + }, + }, + }, + }, + }) +} diff --git a/agent/xds/resources_test.go b/agent/xds/resources_test.go index 5fc31dc9e2d..d5009f63685 100644 --- a/agent/xds/resources_test.go +++ b/agent/xds/resources_test.go @@ -166,6 +166,10 @@ func TestAllResourcesFromSnapshot(t *testing.T) { name: "local-mesh-gateway-with-peered-upstreams", create: proxycfg.TestConfigSnapshotPeeringLocalMeshGateway, }, + { + name: "hcp-metrics", + create: proxycfg.TestConfigSnapshotHCPMetrics, + }, } tests = append(tests, getConnectProxyTransparentProxyGoldenTestCases()...) tests = append(tests, getMeshGatewayPeeringGoldenTestCases()...) diff --git a/agent/xds/testdata/clusters/hcp-metrics.latest.golden b/agent/xds/testdata/clusters/hcp-metrics.latest.golden new file mode 100644 index 00000000000..441763f1a92 --- /dev/null +++ b/agent/xds/testdata/clusters/hcp-metrics.latest.golden @@ -0,0 +1,183 @@ +{ + "versionInfo": "00000001", + "resources": [ + { + "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", + "name": "db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "altStatName": "db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "type": "EDS", + "edsClusterConfig": { + "edsConfig": { + "ads": {}, + "resourceApiVersion": "V3" + } + }, + "connectTimeout": "5s", + "circuitBreakers": {}, + "outlierDetection": {}, + "commonLbConfig": { + "healthyPanicThreshold": {} + }, + "transportSocket": { + "name": "tls", + "typedConfig": { + "@type": "type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext", + "commonTlsContext": { + "tlsParams": {}, + "tlsCertificates": [ + { + "certificateChain": { + "inlineString": "-----BEGIN CERTIFICATE-----\nMIICjDCCAjKgAwIBAgIIC5llxGV1gB8wCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowDjEMMAoG\nA1UEAxMDd2ViMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEADPv1RHVNRfa2VKR\nAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Favq5E0ivpNtv1QnFhxtPd7d5k4e+T7\nSkW1TaOCAXIwggFuMA4GA1UdDwEB/wQEAwIDuDAdBgNVHSUEFjAUBggrBgEFBQcD\nAgYIKwYBBQUHAwEwDAYDVR0TAQH/BAIwADBoBgNVHQ4EYQRfN2Q6MDc6ODc6M2E6\nNDA6MTk6NDc6YzM6NWE6YzA6YmE6NjI6ZGY6YWY6NGI6ZDQ6MDU6MjU6NzY6M2Q6\nNWE6OGQ6MTY6OGQ6Njc6NWU6MmU6YTA6MzQ6N2Q6ZGM6ZmYwagYDVR0jBGMwYYBf\nZDE6MTE6MTE6YWM6MmE6YmE6OTc6YjI6M2Y6YWM6N2I6YmQ6ZGE6YmU6YjE6OGE6\nZmM6OWE6YmE6YjU6YmM6ODM6ZTc6NWU6NDE6NmY6ZjI6NzM6OTU6NTg6MGM6ZGIw\nWQYDVR0RBFIwUIZOc3BpZmZlOi8vMTExMTExMTEtMjIyMi0zMzMzLTQ0NDQtNTU1\nNTU1NTU1NTU1LmNvbnN1bC9ucy9kZWZhdWx0L2RjL2RjMS9zdmMvd2ViMAoGCCqG\nSM49BAMCA0gAMEUCIGC3TTvvjj76KMrguVyFf4tjOqaSCRie3nmHMRNNRav7AiEA\npY0heYeK9A6iOLrzqxSerkXXQyj5e9bE4VgUnxgPU6g=\n-----END CERTIFICATE-----\n" + }, + "privateKey": { + "inlineString": "-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEIMoTkpRggp3fqZzFKh82yS4LjtJI+XY+qX/7DefHFrtdoAoGCCqGSM49\nAwEHoUQDQgAEADPv1RHVNRfa2VKRAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Fav\nq5E0ivpNtv1QnFhxtPd7d5k4e+T7SkW1TQ==\n-----END EC PRIVATE KEY-----\n" + } + } + ], + "validationContext": { + "trustedCa": { + "inlineString": "-----BEGIN CERTIFICATE-----\nMIICXDCCAgKgAwIBAgIICpZq70Z9LyUwCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowFDESMBAG\nA1UEAxMJVGVzdCBDQSAyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEIhywH1gx\nAsMwuF3ukAI5YL2jFxH6Usnma1HFSfVyxbXX1/uoZEYrj8yCAtdU2yoHETyd+Zx2\nThhRLP79pYegCaOCATwwggE4MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTAD\nAQH/MGgGA1UdDgRhBF9kMToxMToxMTphYzoyYTpiYTo5NzpiMjozZjphYzo3Yjpi\nZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1ZTo0MTo2ZjpmMjo3\nMzo5NTo1ODowYzpkYjBqBgNVHSMEYzBhgF9kMToxMToxMTphYzoyYTpiYTo5Nzpi\nMjozZjphYzo3YjpiZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1\nZTo0MTo2ZjpmMjo3Mzo5NTo1ODowYzpkYjA/BgNVHREEODA2hjRzcGlmZmU6Ly8x\nMTExMTExMS0yMjIyLTMzMzMtNDQ0NC01NTU1NTU1NTU1NTUuY29uc3VsMAoGCCqG\nSM49BAMCA0gAMEUCICOY0i246rQHJt8o8Oya0D5PLL1FnmsQmQqIGCi31RwnAiEA\noR5f6Ku+cig2Il8T8LJujOp2/2A72QcHZA57B13y+8o=\n-----END CERTIFICATE-----\n" + }, + "matchSubjectAltNames": [ + { + "exact": "spiffe://11111111-2222-3333-4444-555555555555.consul/ns/default/dc/dc1/svc/db" + } + ] + } + }, + "sni": "db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul" + } + } + }, + { + "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", + "name": "geo-cache.default.dc1.query.11111111-2222-3333-4444-555555555555.consul", + "type": "EDS", + "edsClusterConfig": { + "edsConfig": { + "ads": {}, + "resourceApiVersion": "V3" + } + }, + "connectTimeout": "5s", + "circuitBreakers": {}, + "outlierDetection": {}, + "transportSocket": { + "name": "tls", + "typedConfig": { + "@type": "type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext", + "commonTlsContext": { + "tlsParams": {}, + "tlsCertificates": [ + { + "certificateChain": { + "inlineString": "-----BEGIN CERTIFICATE-----\nMIICjDCCAjKgAwIBAgIIC5llxGV1gB8wCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowDjEMMAoG\nA1UEAxMDd2ViMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEADPv1RHVNRfa2VKR\nAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Favq5E0ivpNtv1QnFhxtPd7d5k4e+T7\nSkW1TaOCAXIwggFuMA4GA1UdDwEB/wQEAwIDuDAdBgNVHSUEFjAUBggrBgEFBQcD\nAgYIKwYBBQUHAwEwDAYDVR0TAQH/BAIwADBoBgNVHQ4EYQRfN2Q6MDc6ODc6M2E6\nNDA6MTk6NDc6YzM6NWE6YzA6YmE6NjI6ZGY6YWY6NGI6ZDQ6MDU6MjU6NzY6M2Q6\nNWE6OGQ6MTY6OGQ6Njc6NWU6MmU6YTA6MzQ6N2Q6ZGM6ZmYwagYDVR0jBGMwYYBf\nZDE6MTE6MTE6YWM6MmE6YmE6OTc6YjI6M2Y6YWM6N2I6YmQ6ZGE6YmU6YjE6OGE6\nZmM6OWE6YmE6YjU6YmM6ODM6ZTc6NWU6NDE6NmY6ZjI6NzM6OTU6NTg6MGM6ZGIw\nWQYDVR0RBFIwUIZOc3BpZmZlOi8vMTExMTExMTEtMjIyMi0zMzMzLTQ0NDQtNTU1\nNTU1NTU1NTU1LmNvbnN1bC9ucy9kZWZhdWx0L2RjL2RjMS9zdmMvd2ViMAoGCCqG\nSM49BAMCA0gAMEUCIGC3TTvvjj76KMrguVyFf4tjOqaSCRie3nmHMRNNRav7AiEA\npY0heYeK9A6iOLrzqxSerkXXQyj5e9bE4VgUnxgPU6g=\n-----END CERTIFICATE-----\n" + }, + "privateKey": { + "inlineString": "-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEIMoTkpRggp3fqZzFKh82yS4LjtJI+XY+qX/7DefHFrtdoAoGCCqGSM49\nAwEHoUQDQgAEADPv1RHVNRfa2VKRAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Fav\nq5E0ivpNtv1QnFhxtPd7d5k4e+T7SkW1TQ==\n-----END EC PRIVATE KEY-----\n" + } + } + ], + "validationContext": { + "trustedCa": { + "inlineString": "-----BEGIN CERTIFICATE-----\nMIICXDCCAgKgAwIBAgIICpZq70Z9LyUwCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowFDESMBAG\nA1UEAxMJVGVzdCBDQSAyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEIhywH1gx\nAsMwuF3ukAI5YL2jFxH6Usnma1HFSfVyxbXX1/uoZEYrj8yCAtdU2yoHETyd+Zx2\nThhRLP79pYegCaOCATwwggE4MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTAD\nAQH/MGgGA1UdDgRhBF9kMToxMToxMTphYzoyYTpiYTo5NzpiMjozZjphYzo3Yjpi\nZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1ZTo0MTo2ZjpmMjo3\nMzo5NTo1ODowYzpkYjBqBgNVHSMEYzBhgF9kMToxMToxMTphYzoyYTpiYTo5Nzpi\nMjozZjphYzo3YjpiZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1\nZTo0MTo2ZjpmMjo3Mzo5NTo1ODowYzpkYjA/BgNVHREEODA2hjRzcGlmZmU6Ly8x\nMTExMTExMS0yMjIyLTMzMzMtNDQ0NC01NTU1NTU1NTU1NTUuY29uc3VsMAoGCCqG\nSM49BAMCA0gAMEUCICOY0i246rQHJt8o8Oya0D5PLL1FnmsQmQqIGCi31RwnAiEA\noR5f6Ku+cig2Il8T8LJujOp2/2A72QcHZA57B13y+8o=\n-----END CERTIFICATE-----\n" + }, + "matchSubjectAltNames": [ + { + "exact": "spiffe://11111111-2222-3333-4444-555555555555.consul/ns/default/dc/dc1/svc/geo-cache-target" + }, + { + "exact": "spiffe://11111111-2222-3333-4444-555555555555.consul/ns/default/dc/dc2/svc/geo-cache-target" + } + ] + } + }, + "sni": "geo-cache.default.dc1.query.11111111-2222-3333-4444-555555555555.consul" + } + } + }, + { + "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", + "name": "hcp-metrics-collector.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "altStatName": "hcp-metrics-collector.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "type": "EDS", + "edsClusterConfig": { + "edsConfig": { + "ads": {}, + "resourceApiVersion": "V3" + } + }, + "connectTimeout": "5s", + "circuitBreakers": {}, + "typedExtensionProtocolOptions": { + "envoy.extensions.upstreams.http.v3.HttpProtocolOptions": { + "@type": "type.googleapis.com/envoy.extensions.upstreams.http.v3.HttpProtocolOptions", + "explicitHttpConfig": { + "http2ProtocolOptions": {} + } + } + }, + "outlierDetection": {}, + "commonLbConfig": { + "healthyPanicThreshold": {} + }, + "transportSocket": { + "name": "tls", + "typedConfig": { + "@type": "type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext", + "commonTlsContext": { + "tlsParams": {}, + "tlsCertificates": [ + { + "certificateChain": { + "inlineString": "-----BEGIN CERTIFICATE-----\nMIICjDCCAjKgAwIBAgIIC5llxGV1gB8wCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowDjEMMAoG\nA1UEAxMDd2ViMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEADPv1RHVNRfa2VKR\nAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Favq5E0ivpNtv1QnFhxtPd7d5k4e+T7\nSkW1TaOCAXIwggFuMA4GA1UdDwEB/wQEAwIDuDAdBgNVHSUEFjAUBggrBgEFBQcD\nAgYIKwYBBQUHAwEwDAYDVR0TAQH/BAIwADBoBgNVHQ4EYQRfN2Q6MDc6ODc6M2E6\nNDA6MTk6NDc6YzM6NWE6YzA6YmE6NjI6ZGY6YWY6NGI6ZDQ6MDU6MjU6NzY6M2Q6\nNWE6OGQ6MTY6OGQ6Njc6NWU6MmU6YTA6MzQ6N2Q6ZGM6ZmYwagYDVR0jBGMwYYBf\nZDE6MTE6MTE6YWM6MmE6YmE6OTc6YjI6M2Y6YWM6N2I6YmQ6ZGE6YmU6YjE6OGE6\nZmM6OWE6YmE6YjU6YmM6ODM6ZTc6NWU6NDE6NmY6ZjI6NzM6OTU6NTg6MGM6ZGIw\nWQYDVR0RBFIwUIZOc3BpZmZlOi8vMTExMTExMTEtMjIyMi0zMzMzLTQ0NDQtNTU1\nNTU1NTU1NTU1LmNvbnN1bC9ucy9kZWZhdWx0L2RjL2RjMS9zdmMvd2ViMAoGCCqG\nSM49BAMCA0gAMEUCIGC3TTvvjj76KMrguVyFf4tjOqaSCRie3nmHMRNNRav7AiEA\npY0heYeK9A6iOLrzqxSerkXXQyj5e9bE4VgUnxgPU6g=\n-----END CERTIFICATE-----\n" + }, + "privateKey": { + "inlineString": "-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEIMoTkpRggp3fqZzFKh82yS4LjtJI+XY+qX/7DefHFrtdoAoGCCqGSM49\nAwEHoUQDQgAEADPv1RHVNRfa2VKRAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Fav\nq5E0ivpNtv1QnFhxtPd7d5k4e+T7SkW1TQ==\n-----END EC PRIVATE KEY-----\n" + } + } + ], + "validationContext": { + "trustedCa": { + "inlineString": "-----BEGIN CERTIFICATE-----\nMIICXDCCAgKgAwIBAgIICpZq70Z9LyUwCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowFDESMBAG\nA1UEAxMJVGVzdCBDQSAyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEIhywH1gx\nAsMwuF3ukAI5YL2jFxH6Usnma1HFSfVyxbXX1/uoZEYrj8yCAtdU2yoHETyd+Zx2\nThhRLP79pYegCaOCATwwggE4MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTAD\nAQH/MGgGA1UdDgRhBF9kMToxMToxMTphYzoyYTpiYTo5NzpiMjozZjphYzo3Yjpi\nZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1ZTo0MTo2ZjpmMjo3\nMzo5NTo1ODowYzpkYjBqBgNVHSMEYzBhgF9kMToxMToxMTphYzoyYTpiYTo5Nzpi\nMjozZjphYzo3YjpiZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1\nZTo0MTo2ZjpmMjo3Mzo5NTo1ODowYzpkYjA/BgNVHREEODA2hjRzcGlmZmU6Ly8x\nMTExMTExMS0yMjIyLTMzMzMtNDQ0NC01NTU1NTU1NTU1NTUuY29uc3VsMAoGCCqG\nSM49BAMCA0gAMEUCICOY0i246rQHJt8o8Oya0D5PLL1FnmsQmQqIGCi31RwnAiEA\noR5f6Ku+cig2Il8T8LJujOp2/2A72QcHZA57B13y+8o=\n-----END CERTIFICATE-----\n" + }, + "matchSubjectAltNames": [ + { + "exact": "spiffe://11111111-2222-3333-4444-555555555555.consul/ns/default/dc/dc1/svc/hcp-metrics-collector" + } + ] + } + }, + "sni": "hcp-metrics-collector.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul" + } + } + }, + { + "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster", + "name": "local_app", + "type": "STATIC", + "connectTimeout": "5s", + "loadAssignment": { + "clusterName": "local_app", + "endpoints": [ + { + "lbEndpoints": [ + { + "endpoint": { + "address": { + "socketAddress": { + "address": "127.0.0.1", + "portValue": 8080 + } + } + } + } + ] + } + ] + } + } + ], + "typeUrl": "type.googleapis.com/envoy.config.cluster.v3.Cluster", + "nonce": "00000001" +} \ No newline at end of file diff --git a/agent/xds/testdata/endpoints/hcp-metrics.latest.golden b/agent/xds/testdata/endpoints/hcp-metrics.latest.golden new file mode 100644 index 00000000000..a19ac95f210 --- /dev/null +++ b/agent/xds/testdata/endpoints/hcp-metrics.latest.golden @@ -0,0 +1,97 @@ +{ + "versionInfo": "00000001", + "resources": [ + { + "@type": "type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment", + "clusterName": "db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "endpoints": [ + { + "lbEndpoints": [ + { + "endpoint": { + "address": { + "socketAddress": { + "address": "10.10.1.1", + "portValue": 8080 + } + } + }, + "healthStatus": "HEALTHY", + "loadBalancingWeight": 1 + }, + { + "endpoint": { + "address": { + "socketAddress": { + "address": "10.10.1.2", + "portValue": 8080 + } + } + }, + "healthStatus": "HEALTHY", + "loadBalancingWeight": 1 + } + ] + } + ] + }, + { + "@type": "type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment", + "clusterName": "geo-cache.default.dc1.query.11111111-2222-3333-4444-555555555555.consul", + "endpoints": [ + { + "lbEndpoints": [ + { + "endpoint": { + "address": { + "socketAddress": { + "address": "10.10.1.1", + "portValue": 8080 + } + } + }, + "healthStatus": "HEALTHY", + "loadBalancingWeight": 1 + }, + { + "endpoint": { + "address": { + "socketAddress": { + "address": "10.20.1.2", + "portValue": 8080 + } + } + }, + "healthStatus": "HEALTHY", + "loadBalancingWeight": 1 + } + ] + } + ] + }, + { + "@type": "type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment", + "clusterName": "hcp-metrics-collector.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul", + "endpoints": [ + { + "lbEndpoints": [ + { + "endpoint": { + "address": { + "socketAddress": { + "address": "9.9.9.9", + "portValue": 9090 + } + } + }, + "healthStatus": "HEALTHY", + "loadBalancingWeight": 1 + } + ] + } + ] + } + ], + "typeUrl": "type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment", + "nonce": "00000001" +} \ No newline at end of file diff --git a/agent/xds/testdata/listeners/hcp-metrics.latest.golden b/agent/xds/testdata/listeners/hcp-metrics.latest.golden new file mode 100644 index 00000000000..d89036a935c --- /dev/null +++ b/agent/xds/testdata/listeners/hcp-metrics.latest.golden @@ -0,0 +1,184 @@ +{ + "versionInfo": "00000001", + "resources": [ + { + "@type": "type.googleapis.com/envoy.config.listener.v3.Listener", + "name": "db:127.0.0.1:9191", + "address": { + "socketAddress": { + "address": "127.0.0.1", + "portValue": 9191 + } + }, + "filterChains": [ + { + "filters": [ + { + "name": "envoy.filters.network.tcp_proxy", + "typedConfig": { + "@type": "type.googleapis.com/envoy.extensions.filters.network.tcp_proxy.v3.TcpProxy", + "statPrefix": "upstream.db.default.default.dc1", + "cluster": "db.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul" + } + } + ] + } + ], + "trafficDirection": "OUTBOUND" + }, + { + "@type": "type.googleapis.com/envoy.config.listener.v3.Listener", + "name": "hcp-metrics-collector:/tmp/consul/hcp-metrics/default_web-sidecar-proxy.sock", + "address": { + "pipe": { + "path": "/tmp/consul/hcp-metrics/default_web-sidecar-proxy.sock" + } + }, + "filterChains": [ + { + "filters": [ + { + "name": "envoy.filters.network.http_connection_manager", + "typedConfig": { + "@type": "type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager", + "statPrefix": "upstream.hcp-metrics-collector.default.default.dc1", + "routeConfig": { + "name": "hcp-metrics-collector", + "virtualHosts": [ + { + "name": "hcp-metrics-collector.default.default.dc1", + "domains": [ + "*" + ], + "routes": [ + { + "match": { + "prefix": "/" + }, + "route": { + "cluster": "hcp-metrics-collector.default.dc1.internal.11111111-2222-3333-4444-555555555555.consul" + } + } + ] + } + ] + }, + "httpFilters": [ + { + "name": "envoy.filters.http.grpc_stats", + "typedConfig": { + "@type": "type.googleapis.com/envoy.extensions.filters.http.grpc_stats.v3.FilterConfig", + "statsForAllMethods": true + } + }, + { + "name": "envoy.filters.http.grpc_http1_bridge", + "typedConfig": { + "@type": "type.googleapis.com/envoy.extensions.filters.http.grpc_http1_bridge.v3.Config" + } + }, + { + "name": "envoy.filters.http.router", + "typedConfig": { + "@type": "type.googleapis.com/envoy.extensions.filters.http.router.v3.Router" + } + } + ], + "tracing": { + "randomSampling": {} + }, + "http2ProtocolOptions": {} + } + } + ] + } + ], + "trafficDirection": "OUTBOUND" + }, + { + "@type": "type.googleapis.com/envoy.config.listener.v3.Listener", + "name": "prepared_query:geo-cache:127.10.10.10:8181", + "address": { + "socketAddress": { + "address": "127.10.10.10", + "portValue": 8181 + } + }, + "filterChains": [ + { + "filters": [ + { + "name": "envoy.filters.network.tcp_proxy", + "typedConfig": { + "@type": "type.googleapis.com/envoy.extensions.filters.network.tcp_proxy.v3.TcpProxy", + "statPrefix": "upstream.prepared_query_geo-cache", + "cluster": "geo-cache.default.dc1.query.11111111-2222-3333-4444-555555555555.consul" + } + } + ] + } + ], + "trafficDirection": "OUTBOUND" + }, + { + "@type": "type.googleapis.com/envoy.config.listener.v3.Listener", + "name": "public_listener:0.0.0.0:9999", + "address": { + "socketAddress": { + "address": "0.0.0.0", + "portValue": 9999 + } + }, + "filterChains": [ + { + "filters": [ + { + "name": "envoy.filters.network.rbac", + "typedConfig": { + "@type": "type.googleapis.com/envoy.extensions.filters.network.rbac.v3.RBAC", + "rules": {}, + "statPrefix": "connect_authz" + } + }, + { + "name": "envoy.filters.network.tcp_proxy", + "typedConfig": { + "@type": "type.googleapis.com/envoy.extensions.filters.network.tcp_proxy.v3.TcpProxy", + "statPrefix": "public_listener", + "cluster": "local_app" + } + } + ], + "transportSocket": { + "name": "tls", + "typedConfig": { + "@type": "type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.DownstreamTlsContext", + "commonTlsContext": { + "tlsParams": {}, + "tlsCertificates": [ + { + "certificateChain": { + "inlineString": "-----BEGIN CERTIFICATE-----\nMIICjDCCAjKgAwIBAgIIC5llxGV1gB8wCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowDjEMMAoG\nA1UEAxMDd2ViMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEADPv1RHVNRfa2VKR\nAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Favq5E0ivpNtv1QnFhxtPd7d5k4e+T7\nSkW1TaOCAXIwggFuMA4GA1UdDwEB/wQEAwIDuDAdBgNVHSUEFjAUBggrBgEFBQcD\nAgYIKwYBBQUHAwEwDAYDVR0TAQH/BAIwADBoBgNVHQ4EYQRfN2Q6MDc6ODc6M2E6\nNDA6MTk6NDc6YzM6NWE6YzA6YmE6NjI6ZGY6YWY6NGI6ZDQ6MDU6MjU6NzY6M2Q6\nNWE6OGQ6MTY6OGQ6Njc6NWU6MmU6YTA6MzQ6N2Q6ZGM6ZmYwagYDVR0jBGMwYYBf\nZDE6MTE6MTE6YWM6MmE6YmE6OTc6YjI6M2Y6YWM6N2I6YmQ6ZGE6YmU6YjE6OGE6\nZmM6OWE6YmE6YjU6YmM6ODM6ZTc6NWU6NDE6NmY6ZjI6NzM6OTU6NTg6MGM6ZGIw\nWQYDVR0RBFIwUIZOc3BpZmZlOi8vMTExMTExMTEtMjIyMi0zMzMzLTQ0NDQtNTU1\nNTU1NTU1NTU1LmNvbnN1bC9ucy9kZWZhdWx0L2RjL2RjMS9zdmMvd2ViMAoGCCqG\nSM49BAMCA0gAMEUCIGC3TTvvjj76KMrguVyFf4tjOqaSCRie3nmHMRNNRav7AiEA\npY0heYeK9A6iOLrzqxSerkXXQyj5e9bE4VgUnxgPU6g=\n-----END CERTIFICATE-----\n" + }, + "privateKey": { + "inlineString": "-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEIMoTkpRggp3fqZzFKh82yS4LjtJI+XY+qX/7DefHFrtdoAoGCCqGSM49\nAwEHoUQDQgAEADPv1RHVNRfa2VKRAB16b6rZnEt7tuhaxCFpQXPj7M2omb0B9Fav\nq5E0ivpNtv1QnFhxtPd7d5k4e+T7SkW1TQ==\n-----END EC PRIVATE KEY-----\n" + } + } + ], + "validationContext": { + "trustedCa": { + "inlineString": "-----BEGIN CERTIFICATE-----\nMIICXDCCAgKgAwIBAgIICpZq70Z9LyUwCgYIKoZIzj0EAwIwFDESMBAGA1UEAxMJ\nVGVzdCBDQSAyMB4XDTE5MDMyMjEzNTgyNloXDTI5MDMyMjEzNTgyNlowFDESMBAG\nA1UEAxMJVGVzdCBDQSAyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEIhywH1gx\nAsMwuF3ukAI5YL2jFxH6Usnma1HFSfVyxbXX1/uoZEYrj8yCAtdU2yoHETyd+Zx2\nThhRLP79pYegCaOCATwwggE4MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTAD\nAQH/MGgGA1UdDgRhBF9kMToxMToxMTphYzoyYTpiYTo5NzpiMjozZjphYzo3Yjpi\nZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1ZTo0MTo2ZjpmMjo3\nMzo5NTo1ODowYzpkYjBqBgNVHSMEYzBhgF9kMToxMToxMTphYzoyYTpiYTo5Nzpi\nMjozZjphYzo3YjpiZDpkYTpiZTpiMTo4YTpmYzo5YTpiYTpiNTpiYzo4MzplNzo1\nZTo0MTo2ZjpmMjo3Mzo5NTo1ODowYzpkYjA/BgNVHREEODA2hjRzcGlmZmU6Ly8x\nMTExMTExMS0yMjIyLTMzMzMtNDQ0NC01NTU1NTU1NTU1NTUuY29uc3VsMAoGCCqG\nSM49BAMCA0gAMEUCICOY0i246rQHJt8o8Oya0D5PLL1FnmsQmQqIGCi31RwnAiEA\noR5f6Ku+cig2Il8T8LJujOp2/2A72QcHZA57B13y+8o=\n-----END CERTIFICATE-----\n" + } + } + }, + "requireClientCertificate": true + } + } + } + ], + "trafficDirection": "INBOUND" + } + ], + "typeUrl": "type.googleapis.com/envoy.config.listener.v3.Listener", + "nonce": "00000001" +} \ No newline at end of file diff --git a/agent/xds/testdata/routes/hcp-metrics.latest.golden b/agent/xds/testdata/routes/hcp-metrics.latest.golden new file mode 100644 index 00000000000..306f5220e7b --- /dev/null +++ b/agent/xds/testdata/routes/hcp-metrics.latest.golden @@ -0,0 +1,5 @@ +{ + "versionInfo": "00000001", + "typeUrl": "type.googleapis.com/envoy.config.route.v3.RouteConfiguration", + "nonce": "00000001" +} \ No newline at end of file diff --git a/agent/xds/testdata/secrets/hcp-metrics.latest.golden b/agent/xds/testdata/secrets/hcp-metrics.latest.golden new file mode 100644 index 00000000000..e6c25e165c6 --- /dev/null +++ b/agent/xds/testdata/secrets/hcp-metrics.latest.golden @@ -0,0 +1,5 @@ +{ + "versionInfo": "00000001", + "typeUrl": "type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.Secret", + "nonce": "00000001" +} \ No newline at end of file diff --git a/api/connect.go b/api/connect.go index a40d1e2321a..a5298d81369 100644 --- a/api/connect.go +++ b/api/connect.go @@ -1,5 +1,8 @@ package api +// HCPMetricsCollectorName is the service name for the HCP Metrics Collector +const HCPMetricsCollectorName string = "hcp-metrics-collector" + // Connect can be used to work with endpoints related to Connect, the // feature for securely connecting services within Consul. type Connect struct { diff --git a/command/connect/envoy/bootstrap_config.go b/command/connect/envoy/bootstrap_config.go index 23427ad0af6..e88d83e6a0d 100644 --- a/command/connect/envoy/bootstrap_config.go +++ b/command/connect/envoy/bootstrap_config.go @@ -7,9 +7,11 @@ import ( "net" "net/url" "os" + "path" "strings" "text/template" + "github.com/hashicorp/consul/acl" "github.com/hashicorp/consul/api" ) @@ -49,6 +51,11 @@ type BootstrapConfig struct { // stats_config.stats_tags can be made by overriding envoy_stats_config_json. StatsTags []string `mapstructure:"envoy_stats_tags"` + // HCPMetricsBindSocketDir is a string that configures the directory for a + // unix socket where Envoy will forward metrics. These metrics get pushed to + // the HCP Metrics collector to show service mesh metrics on HCP. + HCPMetricsBindSocketDir string `mapstructure:"envoy_hcp_metrics_bind_socket_dir"` + // PrometheusBindAddr configures an : on which the Envoy will listen // and expose a single /metrics HTTP endpoint for Prometheus to scrape. It // does this by proxying that URL to the internal admin server's prometheus @@ -238,6 +245,11 @@ func (c *BootstrapConfig) ConfigureArgs(args *BootstrapTplArgs, omitDeprecatedTa args.StatsFlushInterval = c.StatsFlushInterval } + // Setup HCP Metrics if needed. This MUST happen after the Static*JSON is set above + if c.HCPMetricsBindSocketDir != "" { + appendHCPMetricsConfig(args, c.HCPMetricsBindSocketDir) + } + return nil } @@ -271,7 +283,7 @@ func (c *BootstrapConfig) generateStatsSinks(args *BootstrapTplArgs) error { } if len(stats_sinks) > 0 { - args.StatsSinksJSON = "[\n" + strings.Join(stats_sinks, ",\n") + "\n]" + args.StatsSinksJSON = strings.Join(stats_sinks, ",\n") } return nil } @@ -796,6 +808,58 @@ func (c *BootstrapConfig) generateListenerConfig(args *BootstrapTplArgs, bindAdd return nil } +// appendHCPMetricsConfig generates config to enable a socket at path: /_.sock +// or /.sock, if namespace is empty. +func appendHCPMetricsConfig(args *BootstrapTplArgs, hcpMetricsBindSocketDir string) { + // Normalize namespace to "default". This ensures we match the namespace behaviour in proxycfg package, + // where a dynamic listener will be created at the same socket path via xDS. + sock := fmt.Sprintf("%s_%s.sock", acl.NamespaceOrDefault(args.Namespace), args.ProxyID) + path := path.Join(hcpMetricsBindSocketDir, sock) + + if args.StatsSinksJSON != "" { + args.StatsSinksJSON += ",\n" + } + args.StatsSinksJSON += `{ + "name": "envoy.stat_sinks.metrics_service", + "typed_config": { + "@type": "type.googleapis.com/envoy.config.metrics.v3.MetricsServiceConfig", + "transport_api_version": "V3", + "grpc_service": { + "envoy_grpc": { + "cluster_name": "hcp_metrics_collector" + } + } + } + }` + + if args.StaticClustersJSON != "" { + args.StaticClustersJSON += ",\n" + } + args.StaticClustersJSON += fmt.Sprintf(`{ + "name": "hcp_metrics_collector", + "type": "STATIC", + "http2_protocol_options": {}, + "loadAssignment": { + "clusterName": "hcp_metrics_collector", + "endpoints": [ + { + "lbEndpoints": [ + { + "endpoint": { + "address": { + "pipe": { + "path": "%s" + } + } + } + } + ] + } + ] + } + }`, path) +} + func containsSelfAdminCluster(clustersJSON string) (bool, error) { clusterNames := []struct { Name string diff --git a/command/connect/envoy/bootstrap_config_test.go b/command/connect/envoy/bootstrap_config_test.go index 9e8038ae036..e5d9548e655 100644 --- a/command/connect/envoy/bootstrap_config_test.go +++ b/command/connect/envoy/bootstrap_config_test.go @@ -513,6 +513,56 @@ const ( } ] }` + + expectedStatsdSink = `{ + "name": "envoy.stat_sinks.statsd", + "typedConfig": { + "@type": "type.googleapis.com/envoy.config.metrics.v3.StatsdSink", + "address": { + "socket_address": { + "address": "127.0.0.1", + "port_value": 9125 + } + } + } +}` + + expectedHCPMetricsStatsSink = `{ + "name": "envoy.stat_sinks.metrics_service", + "typed_config": { + "@type": "type.googleapis.com/envoy.config.metrics.v3.MetricsServiceConfig", + "transport_api_version": "V3", + "grpc_service": { + "envoy_grpc": { + "cluster_name": "hcp_metrics_collector" + } + } + } + }` + + expectedHCPMetricsCluster = `{ + "name": "hcp_metrics_collector", + "type": "STATIC", + "http2_protocol_options": {}, + "loadAssignment": { + "clusterName": "hcp_metrics_collector", + "endpoints": [ + { + "lbEndpoints": [ + { + "endpoint": { + "address": { + "pipe": { + "path": "/tmp/consul/hcp-metrics/default_web-sidecar-proxy.sock" + } + } + } + } + ] + } + ] + } + }` ) func TestBootstrapConfig_ConfigureArgs(t *testing.T) { @@ -557,33 +607,71 @@ func TestBootstrapConfig_ConfigureArgs(t *testing.T) { }, wantArgs: BootstrapTplArgs{ StatsConfigJSON: defaultStatsConfigJSON, - StatsSinksJSON: `[{ + StatsSinksJSON: `{ "name": "envoy.custom_exciting_sink", "config": { "foo": "bar" } - }]`, + }`, }, }, { - name: "simple-statsd-sink", + name: "hcp-metrics-sink", + baseArgs: BootstrapTplArgs{ + ProxyID: "web-sidecar-proxy", + }, input: BootstrapConfig{ - StatsdURL: "udp://127.0.0.1:9125", + HCPMetricsBindSocketDir: "/tmp/consul/hcp-metrics", }, wantArgs: BootstrapTplArgs{ + ProxyID: "web-sidecar-proxy", StatsConfigJSON: defaultStatsConfigJSON, - StatsSinksJSON: `[{ - "name": "envoy.stat_sinks.statsd", - "typedConfig": { - "@type": "type.googleapis.com/envoy.config.metrics.v3.StatsdSink", - "address": { - "socket_address": { - "address": "127.0.0.1", - "port_value": 9125 + StatsSinksJSON: `{ + "name": "envoy.stat_sinks.metrics_service", + "typed_config": { + "@type": "type.googleapis.com/envoy.config.metrics.v3.MetricsServiceConfig", + "transport_api_version": "V3", + "grpc_service": { + "envoy_grpc": { + "cluster_name": "hcp_metrics_collector" + } + } + } + }`, + StaticClustersJSON: `{ + "name": "hcp_metrics_collector", + "type": "STATIC", + "http2_protocol_options": {}, + "loadAssignment": { + "clusterName": "hcp_metrics_collector", + "endpoints": [ + { + "lbEndpoints": [ + { + "endpoint": { + "address": { + "pipe": { + "path": "/tmp/consul/hcp-metrics/default_web-sidecar-proxy.sock" + } + } + } } + ] } + ] } - }]`, + }`, + }, + wantErr: false, + }, + { + name: "simple-statsd-sink", + input: BootstrapConfig{ + StatsdURL: "udp://127.0.0.1:9125", + }, + wantArgs: BootstrapTplArgs{ + StatsConfigJSON: defaultStatsConfigJSON, + StatsSinksJSON: expectedStatsdSink, }, wantErr: false, }, @@ -600,7 +688,7 @@ func TestBootstrapConfig_ConfigureArgs(t *testing.T) { }, wantArgs: BootstrapTplArgs{ StatsConfigJSON: defaultStatsConfigJSON, - StatsSinksJSON: `[{ + StatsSinksJSON: `{ "name": "envoy.stat_sinks.statsd", "typedConfig": { "@type": "type.googleapis.com/envoy.config.metrics.v3.StatsdSink", @@ -617,7 +705,7 @@ func TestBootstrapConfig_ConfigureArgs(t *testing.T) { "config": { "foo": "bar" } - }]`, + }`, }, wantErr: false, }, @@ -629,7 +717,7 @@ func TestBootstrapConfig_ConfigureArgs(t *testing.T) { env: []string{"MY_STATSD_URL=udp://127.0.0.1:9125"}, wantArgs: BootstrapTplArgs{ StatsConfigJSON: defaultStatsConfigJSON, - StatsSinksJSON: `[{ + StatsSinksJSON: `{ "name": "envoy.stat_sinks.statsd", "typedConfig": { "@type": "type.googleapis.com/envoy.config.metrics.v3.StatsdSink", @@ -640,7 +728,7 @@ func TestBootstrapConfig_ConfigureArgs(t *testing.T) { } } } - }]`, + }`, }, wantErr: false, }, @@ -652,7 +740,7 @@ func TestBootstrapConfig_ConfigureArgs(t *testing.T) { env: []string{"HOST_IP=127.0.0.1"}, wantArgs: BootstrapTplArgs{ StatsConfigJSON: defaultStatsConfigJSON, - StatsSinksJSON: `[{ + StatsSinksJSON: `{ "name": "envoy.stat_sinks.statsd", "typedConfig": { "@type": "type.googleapis.com/envoy.config.metrics.v3.StatsdSink", @@ -663,7 +751,7 @@ func TestBootstrapConfig_ConfigureArgs(t *testing.T) { } } } - }]`, + }`, }, wantErr: false, }, @@ -685,7 +773,7 @@ func TestBootstrapConfig_ConfigureArgs(t *testing.T) { }, wantArgs: BootstrapTplArgs{ StatsConfigJSON: defaultStatsConfigJSON, - StatsSinksJSON: `[{ + StatsSinksJSON: `{ "name": "envoy.stat_sinks.dog_statsd", "typedConfig": { "@type": "type.googleapis.com/envoy.config.metrics.v3.DogStatsdSink", @@ -696,7 +784,7 @@ func TestBootstrapConfig_ConfigureArgs(t *testing.T) { } } } - }]`, + }`, }, wantErr: false, }, @@ -707,7 +795,7 @@ func TestBootstrapConfig_ConfigureArgs(t *testing.T) { }, wantArgs: BootstrapTplArgs{ StatsConfigJSON: defaultStatsConfigJSON, - StatsSinksJSON: `[{ + StatsSinksJSON: `{ "name": "envoy.stat_sinks.dog_statsd", "typedConfig": { "@type": "type.googleapis.com/envoy.config.metrics.v3.DogStatsdSink", @@ -717,7 +805,7 @@ func TestBootstrapConfig_ConfigureArgs(t *testing.T) { } } } - }]`, + }`, }, wantErr: false, }, @@ -730,7 +818,7 @@ func TestBootstrapConfig_ConfigureArgs(t *testing.T) { env: []string{"MY_STATSD_URL=udp://127.0.0.1:9125"}, wantArgs: BootstrapTplArgs{ StatsConfigJSON: defaultStatsConfigJSON, - StatsSinksJSON: `[{ + StatsSinksJSON: `{ "name": "envoy.stat_sinks.dog_statsd", "typedConfig": { "@type": "type.googleapis.com/envoy.config.metrics.v3.DogStatsdSink", @@ -741,7 +829,7 @@ func TestBootstrapConfig_ConfigureArgs(t *testing.T) { } } } - }]`, + }`, }, wantErr: false, }, @@ -1539,3 +1627,65 @@ func TestConsulTagSpecifiers(t *testing.T) { }) } } + +func TestAppendHCPMetrics(t *testing.T) { + tests := map[string]struct { + inputArgs *BootstrapTplArgs + bindSocketDir string + wantArgs *BootstrapTplArgs + }{ + "dir-without-trailing-slash": { + inputArgs: &BootstrapTplArgs{ + ProxyID: "web-sidecar-proxy", + }, + bindSocketDir: "/tmp/consul/hcp-metrics", + wantArgs: &BootstrapTplArgs{ + ProxyID: "web-sidecar-proxy", + StatsSinksJSON: expectedHCPMetricsStatsSink, + StaticClustersJSON: expectedHCPMetricsCluster, + }, + }, + "dir-with-trailing-slash": { + inputArgs: &BootstrapTplArgs{ + ProxyID: "web-sidecar-proxy", + }, + bindSocketDir: "/tmp/consul/hcp-metrics", + wantArgs: &BootstrapTplArgs{ + ProxyID: "web-sidecar-proxy", + StatsSinksJSON: expectedHCPMetricsStatsSink, + StaticClustersJSON: expectedHCPMetricsCluster, + }, + }, + "append-clusters-and-stats-sink": { + inputArgs: &BootstrapTplArgs{ + ProxyID: "web-sidecar-proxy", + StatsSinksJSON: expectedStatsdSink, + StaticClustersJSON: expectedSelfAdminCluster, + }, + bindSocketDir: "/tmp/consul/hcp-metrics", + wantArgs: &BootstrapTplArgs{ + ProxyID: "web-sidecar-proxy", + StatsSinksJSON: expectedStatsdSink + ",\n" + expectedHCPMetricsStatsSink, + StaticClustersJSON: expectedSelfAdminCluster + ",\n" + expectedHCPMetricsCluster, + }, + }, + } + + for name, tt := range tests { + t.Run(name, func(t *testing.T) { + appendHCPMetricsConfig(tt.inputArgs, tt.bindSocketDir) + + // Some of our JSON strings are comma separated objects to be + // insertedinto an array which is not valid JSON on it's own so wrap + // them all in an array. For simple values this is still valid JSON + // too. + wantStatsSink := "[" + tt.wantArgs.StatsSinksJSON + "]" + gotStatsSink := "[" + tt.inputArgs.StatsSinksJSON + "]" + require.JSONEq(t, wantStatsSink, gotStatsSink, "field StatsSinksJSON should be equivalent JSON") + + wantClusters := "[" + tt.wantArgs.StaticClustersJSON + "]" + gotClusters := "[" + tt.inputArgs.StaticClustersJSON + "]" + require.JSONEq(t, wantClusters, gotClusters, "field StaticClustersJSON should be equivalent JSON") + }) + } +} diff --git a/command/connect/envoy/bootstrap_tpl.go b/command/connect/envoy/bootstrap_tpl.go index 7ed75304bca..9e264fe9351 100644 --- a/command/connect/envoy/bootstrap_tpl.go +++ b/command/connect/envoy/bootstrap_tpl.go @@ -262,7 +262,9 @@ const bootstrapTemplate = `{ {{- end }} }, {{- if .StatsSinksJSON }} - "stats_sinks": {{ .StatsSinksJSON }}, + "stats_sinks": [ + {{ .StatsSinksJSON }} + ], {{- end }} {{- if .StatsConfigJSON }} "stats_config": {{ .StatsConfigJSON }}, diff --git a/command/connect/envoy/envoy_test.go b/command/connect/envoy/envoy_test.go index e2692c77d7c..8366d65974e 100644 --- a/command/connect/envoy/envoy_test.go +++ b/command/connect/envoy/envoy_test.go @@ -195,6 +195,29 @@ func TestGenerateConfig(t *testing.T) { PrometheusScrapePath: "/metrics", }, }, + { + Name: "hcp-metrics", + Flags: []string{"-proxy-id", "test-proxy"}, + ProxyConfig: map[string]interface{}{ + "envoy_hcp_metrics_bind_socket_dir": "/tmp/consul/hcp-metrics", + }, + WantArgs: BootstrapTplArgs{ + ProxyCluster: "test-proxy", + ProxyID: "test-proxy", + // We don't know this til after the lookup so it will be empty in the + // initial args call we are testing here. + ProxySourceService: "", + GRPC: GRPC{ + AgentAddress: "127.0.0.1", + AgentPort: "8502", + }, + AdminAccessLogPath: "/dev/null", + AdminBindAddress: "127.0.0.1", + AdminBindPort: "19000", + LocalAgentClusterName: xds.LocalAgentClusterName, + PrometheusScrapePath: "/metrics", + }, + }, { Name: "prometheus-metrics", Flags: []string{"-proxy-id", "test-proxy", diff --git a/command/connect/envoy/testdata/hcp-metrics.golden b/command/connect/envoy/testdata/hcp-metrics.golden new file mode 100644 index 00000000000..563d662e443 --- /dev/null +++ b/command/connect/envoy/testdata/hcp-metrics.golden @@ -0,0 +1,247 @@ +{ + "admin": { + "access_log_path": "/dev/null", + "address": { + "socket_address": { + "address": "127.0.0.1", + "port_value": 19000 + } + } + }, + "node": { + "cluster": "test", + "id": "test-proxy", + "metadata": { + "namespace": "default", + "partition": "default" + } + }, + "layered_runtime": { + "layers": [ + { + "name": "base", + "static_layer": { + "re2.max_program_size.error_level": 1048576 + } + } + ] + }, + "static_resources": { + "clusters": [ + { + "name": "local_agent", + "ignore_health_on_host_removal": false, + "connect_timeout": "1s", + "type": "STATIC", + "http2_protocol_options": {}, + "loadAssignment": { + "clusterName": "local_agent", + "endpoints": [ + { + "lbEndpoints": [ + { + "endpoint": { + "address": { + "socket_address": { + "address": "127.0.0.1", + "port_value": 8502 + } + } + } + } + ] + } + ] + } + }, + { + "name": "hcp_metrics_collector", + "type": "STATIC", + "http2_protocol_options": {}, + "loadAssignment": { + "clusterName": "hcp_metrics_collector", + "endpoints": [ + { + "lbEndpoints": [ + { + "endpoint": { + "address": { + "pipe": { + "path": "/tmp/consul/hcp-metrics/default_test-proxy.sock" + } + } + } + } + ] + } + ] + } + } + ] + }, + "stats_sinks": [ + { + "name": "envoy.stat_sinks.metrics_service", + "typed_config": { + "@type": "type.googleapis.com/envoy.config.metrics.v3.MetricsServiceConfig", + "transport_api_version": "V3", + "grpc_service": { + "envoy_grpc": { + "cluster_name": "hcp_metrics_collector" + } + } + } + } + ], + "stats_config": { + "stats_tags": [ + { + "regex": "^cluster\\.(?:passthrough~)?((?:([^.]+)~)?(?:[^.]+\\.)?[^.]+\\.[^.]+\\.(?:[^.]+\\.)?[^.]+\\.[^.]+\\.[^.]+\\.consul\\.)", + "tag_name": "consul.destination.custom_hash" + }, + { + "regex": "^cluster\\.(?:passthrough~)?((?:[^.]+~)?(?:([^.]+)\\.)?[^.]+\\.[^.]+\\.(?:[^.]+\\.)?[^.]+\\.[^.]+\\.[^.]+\\.consul\\.)", + "tag_name": "consul.destination.service_subset" + }, + { + "regex": "^cluster\\.(?:passthrough~)?((?:[^.]+~)?(?:[^.]+\\.)?([^.]+)\\.[^.]+\\.(?:[^.]+\\.)?[^.]+\\.[^.]+\\.[^.]+\\.consul\\.)", + "tag_name": "consul.destination.service" + }, + { + "regex": "^cluster\\.(?:passthrough~)?((?:[^.]+~)?(?:[^.]+\\.)?[^.]+\\.([^.]+)\\.(?:[^.]+\\.)?[^.]+\\.[^.]+\\.[^.]+\\.consul\\.)", + "tag_name": "consul.destination.namespace" + }, + { + "regex": "^cluster\\.(?:passthrough~)?((?:[^.]+~)?(?:[^.]+\\.)?[^.]+\\.[^.]+\\.(?:([^.]+)\\.)?[^.]+\\.internal[^.]*\\.[^.]+\\.consul\\.)", + "tag_name": "consul.destination.partition" + }, + { + "regex": "^cluster\\.(?:passthrough~)?((?:[^.]+~)?(?:[^.]+\\.)?[^.]+\\.[^.]+\\.(?:[^.]+\\.)?([^.]+)\\.internal[^.]*\\.[^.]+\\.consul\\.)", + "tag_name": "consul.destination.datacenter" + }, + { + "regex": "^cluster\\.([^.]+\\.(?:[^.]+\\.)?([^.]+)\\.external\\.[^.]+\\.consul\\.)", + "tag_name": "consul.destination.peer" + }, + { + "regex": "^cluster\\.(?:passthrough~)?((?:[^.]+~)?(?:[^.]+\\.)?[^.]+\\.[^.]+\\.(?:[^.]+\\.)?[^.]+\\.([^.]+)\\.[^.]+\\.consul\\.)", + "tag_name": "consul.destination.routing_type" + }, + { + "regex": "^cluster\\.(?:passthrough~)?((?:[^.]+~)?(?:[^.]+\\.)?[^.]+\\.[^.]+\\.(?:[^.]+\\.)?[^.]+\\.[^.]+\\.([^.]+)\\.consul\\.)", + "tag_name": "consul.destination.trust_domain" + }, + { + "regex": "^cluster\\.(?:passthrough~)?(((?:[^.]+~)?(?:[^.]+\\.)?[^.]+\\.[^.]+\\.(?:[^.]+\\.)?[^.]+)\\.[^.]+\\.[^.]+\\.consul\\.)", + "tag_name": "consul.destination.target" + }, + { + "regex": "^cluster\\.(?:passthrough~)?(((?:[^.]+~)?(?:[^.]+\\.)?[^.]+\\.[^.]+\\.(?:[^.]+\\.)?[^.]+\\.[^.]+\\.[^.]+)\\.consul\\.)", + "tag_name": "consul.destination.full_target" + }, + { + "regex": "^(?:tcp|http)\\.upstream(?:_peered)?\\.(([^.]+)(?:\\.[^.]+)?(?:\\.[^.]+)?\\.[^.]+\\.)", + "tag_name": "consul.upstream.service" + }, + { + "regex": "^(?:tcp|http)\\.upstream\\.([^.]+(?:\\.[^.]+)?(?:\\.[^.]+)?\\.([^.]+)\\.)", + "tag_name": "consul.upstream.datacenter" + }, + { + "regex": "^(?:tcp|http)\\.upstream_peered\\.([^.]+(?:\\.[^.]+)?\\.([^.]+)\\.)", + "tag_name": "consul.upstream.peer" + }, + { + "regex": "^(?:tcp|http)\\.upstream(?:_peered)?\\.([^.]+(?:\\.([^.]+))?(?:\\.[^.]+)?\\.[^.]+\\.)", + "tag_name": "consul.upstream.namespace" + }, + { + "regex": "^(?:tcp|http)\\.upstream\\.([^.]+(?:\\.[^.]+)?(?:\\.([^.]+))?\\.[^.]+\\.)", + "tag_name": "consul.upstream.partition" + }, + { + "regex": "^cluster\\.((?:([^.]+)~)?(?:[^.]+\\.)?[^.]+\\.[^.]+\\.(?:[^.]+\\.)?[^.]+\\.[^.]+\\.[^.]+\\.consul\\.)", + "tag_name": "consul.custom_hash" + }, + { + "regex": "^cluster\\.((?:[^.]+~)?(?:([^.]+)\\.)?[^.]+\\.[^.]+\\.(?:[^.]+\\.)?[^.]+\\.[^.]+\\.[^.]+\\.consul\\.)", + "tag_name": "consul.service_subset" + }, + { + "regex": "^cluster\\.((?:[^.]+~)?(?:[^.]+\\.)?([^.]+)\\.[^.]+\\.(?:[^.]+\\.)?[^.]+\\.[^.]+\\.[^.]+\\.consul\\.)", + "tag_name": "consul.service" + }, + { + "regex": "^cluster\\.((?:[^.]+~)?(?:[^.]+\\.)?[^.]+\\.([^.]+)\\.(?:[^.]+\\.)?[^.]+\\.[^.]+\\.[^.]+\\.consul\\.)", + "tag_name": "consul.namespace" + }, + { + "regex": "^cluster\\.((?:[^.]+~)?(?:[^.]+\\.)?[^.]+\\.[^.]+\\.(?:[^.]+\\.)?([^.]+)\\.internal[^.]*\\.[^.]+\\.consul\\.)", + "tag_name": "consul.datacenter" + }, + { + "regex": "^cluster\\.((?:[^.]+~)?(?:[^.]+\\.)?[^.]+\\.[^.]+\\.(?:[^.]+\\.)?[^.]+\\.([^.]+)\\.[^.]+\\.consul\\.)", + "tag_name": "consul.routing_type" + }, + { + "regex": "^cluster\\.((?:[^.]+~)?(?:[^.]+\\.)?[^.]+\\.[^.]+\\.(?:[^.]+\\.)?[^.]+\\.[^.]+\\.([^.]+)\\.consul\\.)", + "tag_name": "consul.trust_domain" + }, + { + "regex": "^cluster\\.(((?:[^.]+~)?(?:[^.]+\\.)?[^.]+\\.[^.]+\\.(?:[^.]+\\.)?[^.]+)\\.[^.]+\\.[^.]+\\.consul\\.)", + "tag_name": "consul.target" + }, + { + "regex": "^cluster\\.(((?:[^.]+~)?(?:[^.]+\\.)?[^.]+\\.[^.]+\\.(?:[^.]+\\.)?[^.]+\\.[^.]+\\.[^.]+)\\.consul\\.)", + "tag_name": "consul.full_target" + }, + { + "tag_name": "local_cluster", + "fixed_value": "test" + }, + { + "tag_name": "consul.source.service", + "fixed_value": "test" + }, + { + "tag_name": "consul.source.namespace", + "fixed_value": "default" + }, + { + "tag_name": "consul.source.partition", + "fixed_value": "default" + }, + { + "tag_name": "consul.source.datacenter", + "fixed_value": "dc1" + } + ], + "use_all_default_tags": true + }, + "dynamic_resources": { + "lds_config": { + "ads": {}, + "resource_api_version": "V3" + }, + "cds_config": { + "ads": {}, + "resource_api_version": "V3" + }, + "ads_config": { + "api_type": "DELTA_GRPC", + "transport_api_version": "V3", + "grpc_services": { + "initial_metadata": [ + { + "key": "x-consul-token", + "value": "" + } + ], + "envoy_grpc": { + "cluster_name": "local_agent" + } + } + } + } +} + diff --git a/website/content/commands/connect/envoy.mdx b/website/content/commands/connect/envoy.mdx index 90bccf2faf8..c35a0b4feaa 100644 --- a/website/content/commands/connect/envoy.mdx +++ b/website/content/commands/connect/envoy.mdx @@ -75,6 +75,10 @@ Usage: `consul connect envoy [options] [-- pass-through options]` In cases where either assumption is violated this flag will prevent the command attempting to resolve config from the local agent. +- `envoy_hcp_metrics_bind_socket_dir` - Specifies the directory where Envoy creates a unix socket. + Envoy sends metrics to the socket so that HCP collectors can connect to collect them." + The socket is not configured by default. + - `-envoy-ready-bind-address` - By default the proxy does not have a readiness probe configured on it. This flag in conjunction with the `envoy-ready-bind-port` flag configures where the envoy readiness probe is configured on the proxy. A `/ready` HTTP From 7cb2af17c6757b4084465518773c0c5c8762ef6f Mon Sep 17 00:00:00 2001 From: Ronald Date: Mon, 13 Mar 2023 13:24:00 +0100 Subject: [PATCH 146/262] Add copywrite setup file (#16602) --- .copywrite.hcl | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 .copywrite.hcl diff --git a/.copywrite.hcl b/.copywrite.hcl new file mode 100644 index 00000000000..7c54610b04f --- /dev/null +++ b/.copywrite.hcl @@ -0,0 +1,14 @@ +schema_version = 1 + +project { + license = "MPL-2.0" + copyright_year = 2013 + + # (OPTIONAL) A list of globs that should not have copyright/license headers. + # Supports doublestar glob patterns for more flexibility in defining which + # files or folders should be ignored + header_ignore = [ + # "vendors/**", + # "**autogen**", + ] +} From f2902e66088b783c2a0814de2f5411176d293eba Mon Sep 17 00:00:00 2001 From: Derek Menteer <105233703+hashi-derek@users.noreply.github.com> Date: Mon, 13 Mar 2023 16:19:11 -0500 Subject: [PATCH 147/262] Add sameness-group configuration entry. (#16608) This commit adds a sameness-group config entry to the API and structs packages. It includes some validation logic and a new memdb index that tracks the default sameness-group for each partition. Sameness groups will simplify the effort of managing failovers / intentions / exports for peers and partitions. Note that this change purely to introduce the configuration entry and does not include the full functionality of sameness-groups. --- agent/consul/state/config_entry.go | 6 ++ .../state/config_entry_sameness_group_oss.go | 29 ++++++++ .../config_entry_sameness_group_oss_test.go | 18 +++++ agent/consul/state/config_entry_schema.go | 14 +++- .../usagemetrics/usagemetrics_oss_test.go | 32 +++++++++ agent/structs/config_entry.go | 4 ++ agent/structs/config_entry_sameness_group.go | 72 +++++++++++++++++++ .../config_entry_sameness_group_oss.go | 10 +++ api/config_entry.go | 3 + api/config_entry_samness_group.go | 25 +++++++ 10 files changed, 210 insertions(+), 3 deletions(-) create mode 100644 agent/consul/state/config_entry_sameness_group_oss.go create mode 100644 agent/consul/state/config_entry_sameness_group_oss_test.go create mode 100644 agent/structs/config_entry_sameness_group.go create mode 100644 agent/structs/config_entry_sameness_group_oss.go create mode 100644 api/config_entry_samness_group.go diff --git a/agent/consul/state/config_entry.go b/agent/consul/state/config_entry.go index 3e4964c5a53..b37098aaf8a 100644 --- a/agent/consul/state/config_entry.go +++ b/agent/consul/state/config_entry.go @@ -494,6 +494,11 @@ func insertConfigEntryWithTxn(tx WriteTxn, idx uint64, conf structs.ConfigEntry) return fmt.Errorf("failed to persist service name: %v", err) } } + case structs.SamenessGroup: + err := checkSamenessGroup(tx, conf) + if err != nil { + return err + } } // Insert the config entry and update the index @@ -539,6 +544,7 @@ func validateProposedConfigEntryInGraph( if err != nil { return err } + case structs.SamenessGroup: case structs.ServiceIntentions: case structs.MeshConfig: case structs.ExportedServices: diff --git a/agent/consul/state/config_entry_sameness_group_oss.go b/agent/consul/state/config_entry_sameness_group_oss.go new file mode 100644 index 00000000000..d217061fc98 --- /dev/null +++ b/agent/consul/state/config_entry_sameness_group_oss.go @@ -0,0 +1,29 @@ +//go:build !consulent +// +build !consulent + +package state + +import ( + "fmt" + + "github.com/hashicorp/consul/agent/structs" + "github.com/hashicorp/go-memdb" +) + +// SamnessGroupDefaultIndex is a placeholder for OSS. Sameness-groups are enterprise only. +type SamenessGroupDefaultIndex struct{} + +var _ memdb.Indexer = (*SamenessGroupDefaultIndex)(nil) +var _ memdb.MultiIndexer = (*SamenessGroupDefaultIndex)(nil) + +func (*SamenessGroupDefaultIndex) FromObject(obj interface{}) (bool, [][]byte, error) { + return false, nil, nil +} + +func (*SamenessGroupDefaultIndex) FromArgs(args ...interface{}) ([]byte, error) { + return nil, nil +} + +func checkSamenessGroup(tx ReadTxn, newConfig structs.ConfigEntry) error { + return fmt.Errorf("sameness-groups are an enterprise-only feature") +} diff --git a/agent/consul/state/config_entry_sameness_group_oss_test.go b/agent/consul/state/config_entry_sameness_group_oss_test.go new file mode 100644 index 00000000000..c6f24719184 --- /dev/null +++ b/agent/consul/state/config_entry_sameness_group_oss_test.go @@ -0,0 +1,18 @@ +//go:build !consulent +// +build !consulent + +package state + +import ( + "github.com/hashicorp/consul/agent/structs" + "github.com/stretchr/testify/require" + "testing" +) + +func TestStore_SamenessGroup_checkSamenessGroup(t *testing.T) { + s := testStateStore(t) + err := s.EnsureConfigEntry(0, &structs.SamenessGroupConfigEntry{ + Name: "sg1", + }) + require.ErrorContains(t, err, "sameness-groups are an enterprise-only feature") +} diff --git a/agent/consul/state/config_entry_schema.go b/agent/consul/state/config_entry_schema.go index e99068d1045..7ef560eb1f1 100644 --- a/agent/consul/state/config_entry_schema.go +++ b/agent/consul/state/config_entry_schema.go @@ -11,9 +11,10 @@ import ( const ( tableConfigEntries = "config-entries" - indexLink = "link" - indexIntentionLegacyID = "intention-legacy-id" - indexSource = "intention-source" + indexLink = "link" + indexIntentionLegacyID = "intention-legacy-id" + indexSource = "intention-source" + indexSamenessGroupDefault = "sameness-group-default" ) // configTableSchema returns a new table schema used to store global @@ -50,6 +51,12 @@ func configTableSchema() *memdb.TableSchema { Unique: false, Indexer: &ServiceIntentionSourceIndex{}, }, + indexSamenessGroupDefault: { + Name: indexSamenessGroupDefault, + AllowMissing: true, + Unique: true, + Indexer: &SamenessGroupDefaultIndex{}, + }, }, } } @@ -67,6 +74,7 @@ type configEntryIndexable interface { } var _ configEntryIndexable = (*structs.ExportedServicesConfigEntry)(nil) +var _ configEntryIndexable = (*structs.SamenessGroupConfigEntry)(nil) var _ configEntryIndexable = (*structs.IngressGatewayConfigEntry)(nil) var _ configEntryIndexable = (*structs.MeshConfigEntry)(nil) var _ configEntryIndexable = (*structs.ProxyConfigEntry)(nil) diff --git a/agent/consul/usagemetrics/usagemetrics_oss_test.go b/agent/consul/usagemetrics/usagemetrics_oss_test.go index 3789b6660cf..44cd1f29363 100644 --- a/agent/consul/usagemetrics/usagemetrics_oss_test.go +++ b/agent/consul/usagemetrics/usagemetrics_oss_test.go @@ -357,6 +357,22 @@ var baseCases = map[string]testCase{ {Name: "kind", Value: "exported-services"}, }, }, + "consul.usage.test.consul.state.config_entries;datacenter=dc1;kind=sameness-group": { // Legacy + Name: "consul.usage.test.consul.state.config_entries", + Value: 0, + Labels: []metrics.Label{ + {Name: "datacenter", Value: "dc1"}, + {Name: "kind", Value: "sameness-group"}, + }, + }, + "consul.usage.test.state.config_entries;datacenter=dc1;kind=sameness-group": { + Name: "consul.usage.test.state.config_entries", + Value: 0, + Labels: []metrics.Label{ + {Name: "datacenter", Value: "dc1"}, + {Name: "kind", Value: "sameness-group"}, + }, + }, "consul.usage.test.consul.state.config_entries;datacenter=dc1;kind=api-gateway": { // Legacy Name: "consul.usage.test.consul.state.config_entries", Value: 0, @@ -784,6 +800,22 @@ var baseCases = map[string]testCase{ {Name: "kind", Value: "exported-services"}, }, }, + "consul.usage.test.consul.state.config_entries;datacenter=dc1;kind=sameness-group": { // Legacy + Name: "consul.usage.test.consul.state.config_entries", + Value: 0, + Labels: []metrics.Label{ + {Name: "datacenter", Value: "dc1"}, + {Name: "kind", Value: "sameness-group"}, + }, + }, + "consul.usage.test.state.config_entries;datacenter=dc1;kind=sameness-group": { + Name: "consul.usage.test.state.config_entries", + Value: 0, + Labels: []metrics.Label{ + {Name: "datacenter", Value: "dc1"}, + {Name: "kind", Value: "sameness-group"}, + }, + }, "consul.usage.test.consul.state.config_entries;datacenter=dc1;kind=api-gateway": { // Legacy Name: "consul.usage.test.consul.state.config_entries", Value: 0, diff --git a/agent/structs/config_entry.go b/agent/structs/config_entry.go index 7d8bf1d62fe..f330babf709 100644 --- a/agent/structs/config_entry.go +++ b/agent/structs/config_entry.go @@ -34,6 +34,7 @@ const ( ServiceIntentions string = "service-intentions" MeshConfig string = "mesh" ExportedServices string = "exported-services" + SamenessGroup string = "sameness-group" APIGateway string = "api-gateway" BoundAPIGateway string = "bound-api-gateway" InlineCertificate string = "inline-certificate" @@ -59,6 +60,7 @@ var AllConfigEntryKinds = []string{ ServiceIntentions, MeshConfig, ExportedServices, + SamenessGroup, APIGateway, BoundAPIGateway, HTTPRoute, @@ -672,6 +674,8 @@ func MakeConfigEntry(kind, name string) (ConfigEntry, error) { return &MeshConfigEntry{}, nil case ExportedServices: return &ExportedServicesConfigEntry{Name: name}, nil + case SamenessGroup: + return &SamenessGroupConfigEntry{Name: name}, nil case APIGateway: return &APIGatewayConfigEntry{Name: name}, nil case BoundAPIGateway: diff --git a/agent/structs/config_entry_sameness_group.go b/agent/structs/config_entry_sameness_group.go new file mode 100644 index 00000000000..c4d4e3f8a48 --- /dev/null +++ b/agent/structs/config_entry_sameness_group.go @@ -0,0 +1,72 @@ +package structs + +import ( + "encoding/json" + "fmt" + + "github.com/hashicorp/consul/acl" +) + +type SamenessGroupConfigEntry struct { + Name string + IsDefault bool `json:",omitempty" alias:"is_default"` + Members []SamenessGroupMember + Meta map[string]string `json:",omitempty"` + acl.EnterpriseMeta `hcl:",squash" mapstructure:",squash"` + RaftIndex +} + +func (s *SamenessGroupConfigEntry) GetKind() string { return SamenessGroup } +func (s *SamenessGroupConfigEntry) GetName() string { return s.Name } +func (s *SamenessGroupConfigEntry) GetMeta() map[string]string { return s.Meta } +func (s *SamenessGroupConfigEntry) GetCreateIndex() uint64 { return s.CreateIndex } +func (s *SamenessGroupConfigEntry) GetModifyIndex() uint64 { return s.ModifyIndex } + +func (s *SamenessGroupConfigEntry) GetRaftIndex() *RaftIndex { + if s == nil { + return &RaftIndex{} + } + return &s.RaftIndex +} + +func (s *SamenessGroupConfigEntry) GetEnterpriseMeta() *acl.EnterpriseMeta { + if s == nil { + return nil + } + return &s.EnterpriseMeta +} + +func (s *SamenessGroupConfigEntry) Normalize() error { + if s == nil { + return fmt.Errorf("config entry is nil") + } + s.EnterpriseMeta.Normalize() + return nil +} + +func (s *SamenessGroupConfigEntry) CanRead(authz acl.Authorizer) error { + return nil +} + +func (s *SamenessGroupConfigEntry) CanWrite(authz acl.Authorizer) error { + var authzContext acl.AuthorizerContext + s.FillAuthzContext(&authzContext) + return authz.ToAllowAuthorizer().MeshWriteAllowed(&authzContext) +} + +func (s *SamenessGroupConfigEntry) MarshalJSON() ([]byte, error) { + type Alias SamenessGroupConfigEntry + source := &struct { + Kind string + *Alias + }{ + Kind: SamenessGroup, + Alias: (*Alias)(s), + } + return json.Marshal(source) +} + +type SamenessGroupMember struct { + Partition string + Peer string +} diff --git a/agent/structs/config_entry_sameness_group_oss.go b/agent/structs/config_entry_sameness_group_oss.go new file mode 100644 index 00000000000..21a34b5e1e0 --- /dev/null +++ b/agent/structs/config_entry_sameness_group_oss.go @@ -0,0 +1,10 @@ +//go:build !consulent +// +build !consulent + +package structs + +import "fmt" + +func (s *SamenessGroupConfigEntry) Validate() error { + return fmt.Errorf("sameness-groups are an enterprise-only feature") +} diff --git a/api/config_entry.go b/api/config_entry.go index 39b7727c89a..3a5b7bb36b8 100644 --- a/api/config_entry.go +++ b/api/config_entry.go @@ -23,6 +23,7 @@ const ( ServiceIntentions string = "service-intentions" MeshConfig string = "mesh" ExportedServices string = "exported-services" + SamenessGroup string = "sameness-group" ProxyConfigGlobal string = "global" MeshConfigMesh string = "mesh" @@ -355,6 +356,8 @@ func makeConfigEntry(kind, name string) (ConfigEntry, error) { return &MeshConfigEntry{}, nil case ExportedServices: return &ExportedServicesConfigEntry{Name: name}, nil + case SamenessGroup: + return &SamenessGroupConfigEntry{Kind: kind, Name: name}, nil case APIGateway: return &APIGatewayConfigEntry{Kind: kind, Name: name}, nil case TCPRoute: diff --git a/api/config_entry_samness_group.go b/api/config_entry_samness_group.go new file mode 100644 index 00000000000..d910a366865 --- /dev/null +++ b/api/config_entry_samness_group.go @@ -0,0 +1,25 @@ +package api + +type SamenessGroupConfigEntry struct { + Kind string + Name string + Partition string `json:",omitempty"` + IsDefault bool `json:",omitempty" alias:"is_default"` + Members []SamenessGroupMember + Meta map[string]string `json:",omitempty"` + CreateIndex uint64 + ModifyIndex uint64 +} + +type SamenessGroupMember struct { + Partition string + Peer string +} + +func (s *SamenessGroupConfigEntry) GetKind() string { return s.Kind } +func (s *SamenessGroupConfigEntry) GetName() string { return s.Name } +func (s *SamenessGroupConfigEntry) GetPartition() string { return s.Partition } +func (s *SamenessGroupConfigEntry) GetNamespace() string { return "" } +func (s *SamenessGroupConfigEntry) GetCreateIndex() uint64 { return s.CreateIndex } +func (s *SamenessGroupConfigEntry) GetModifyIndex() uint64 { return s.ModifyIndex } +func (s *SamenessGroupConfigEntry) GetMeta() map[string]string { return s.Meta } From d5677e5680050a9b22403c160f5edde59613a4fc Mon Sep 17 00:00:00 2001 From: "Chris S. Kim" Date: Mon, 13 Mar 2023 17:32:59 -0400 Subject: [PATCH 148/262] Preserve CARoots when updating Vault CA configuration (#16592) If a CA config update did not cause a root change, the codepath would return early and skip some steps which preserve its intermediate certificates and signing key ID. This commit re-orders some code and prevents updates from generating new intermediate certificates. --- .changelog/16592.txt | 3 + agent/consul/leader_connect_ca.go | 37 +++++++----- agent/consul/leader_connect_ca_test.go | 81 ++++++++++++++++++-------- 3 files changed, 82 insertions(+), 39 deletions(-) create mode 100644 .changelog/16592.txt diff --git a/.changelog/16592.txt b/.changelog/16592.txt new file mode 100644 index 00000000000..ba37d69015f --- /dev/null +++ b/.changelog/16592.txt @@ -0,0 +1,3 @@ +```release-note:bug +ca: Fixes a bug where updating Vault CA Provider config would cause TLS issues in the service mesh +``` diff --git a/agent/consul/leader_connect_ca.go b/agent/consul/leader_connect_ca.go index 008289c947e..abb92f54b6b 100644 --- a/agent/consul/leader_connect_ca.go +++ b/agent/consul/leader_connect_ca.go @@ -12,7 +12,7 @@ import ( "time" "github.com/hashicorp/go-hclog" - uuid "github.com/hashicorp/go-uuid" + "github.com/hashicorp/go-uuid" "golang.org/x/time/rate" "github.com/hashicorp/consul/acl" @@ -272,7 +272,7 @@ func newCARoot(pemValue, provider, clusterID string) (*structs.CARoot, error) { ExternalTrustDomain: clusterID, NotBefore: primaryCert.NotBefore, NotAfter: primaryCert.NotAfter, - RootCert: pemValue, + RootCert: lib.EnsureTrailingNewline(pemValue), PrivateKeyType: keyType, PrivateKeyBits: keyBits, Active: true, @@ -887,6 +887,23 @@ func (c *CAManager) primaryUpdateRootCA(newProvider ca.Provider, args *structs.C return err } + // TODO: https://github.com/hashicorp/consul/issues/12386 + intermediate, err := newProvider.ActiveIntermediate() + if err != nil { + return fmt.Errorf("error fetching active intermediate: %w", err) + } + if intermediate == "" { + intermediate, err = newProvider.GenerateIntermediate() + if err != nil { + return fmt.Errorf("error generating intermediate: %w", err) + } + } + if intermediate != newRootPEM { + if err := setLeafSigningCert(newActiveRoot, intermediate); err != nil { + return err + } + } + // See if the provider needs to persist any state along with the config pState, err := newProvider.State() if err != nil { @@ -970,19 +987,9 @@ func (c *CAManager) primaryUpdateRootCA(newProvider ca.Provider, args *structs.C } // Add the cross signed cert to the new CA's intermediates (to be attached - // to leaf certs). - newActiveRoot.IntermediateCerts = []string{xcCert} - } - } - - // TODO: https://github.com/hashicorp/consul/issues/12386 - intermediate, err := newProvider.GenerateIntermediate() - if err != nil { - return err - } - if intermediate != newRootPEM { - if err := setLeafSigningCert(newActiveRoot, intermediate); err != nil { - return err + // to leaf certs). We do not want it to be the last cert if there are any + // existing intermediate certs so we push to the front. + newActiveRoot.IntermediateCerts = append([]string{xcCert}, newActiveRoot.IntermediateCerts...) } } diff --git a/agent/consul/leader_connect_ca_test.go b/agent/consul/leader_connect_ca_test.go index 7e84a87b19b..1e4e4d2af96 100644 --- a/agent/consul/leader_connect_ca_test.go +++ b/agent/consul/leader_connect_ca_test.go @@ -25,7 +25,7 @@ import ( "github.com/hashicorp/consul/acl" "github.com/hashicorp/consul/agent/connect" - ca "github.com/hashicorp/consul/agent/connect/ca" + "github.com/hashicorp/consul/agent/connect/ca" "github.com/hashicorp/consul/agent/consul/fsm" "github.com/hashicorp/consul/agent/consul/state" "github.com/hashicorp/consul/agent/structs" @@ -612,39 +612,72 @@ func TestCAManager_UpdateConfiguration_Vault_Primary(t *testing.T) { _, origRoot, err := s1.fsm.State().CARootActive(nil) require.NoError(t, err) require.Len(t, origRoot.IntermediateCerts, 1) + origRoot.CreateIndex = s1.caManager.providerRoot.CreateIndex + origRoot.ModifyIndex = s1.caManager.providerRoot.ModifyIndex + require.Equal(t, s1.caManager.providerRoot, origRoot) cert, err := connect.ParseCert(s1.caManager.getLeafSigningCertFromRoot(origRoot)) require.NoError(t, err) require.Equal(t, connect.HexString(cert.SubjectKeyId), origRoot.SigningKeyID) - vaultToken2 := ca.CreateVaultTokenWithAttrs(t, vault.Client(), &ca.VaultTokenAttributes{ - RootPath: "pki-root-2", - IntermediatePath: "pki-intermediate-2", - ConsulManaged: true, + t.Run("update config without changing root", func(t *testing.T) { + err = s1.caManager.UpdateConfiguration(&structs.CARequest{ + Config: &structs.CAConfiguration{ + Provider: "vault", + Config: map[string]interface{}{ + "Address": vault.Addr, + "Token": vaultToken, + "RootPKIPath": "pki-root/", + "IntermediatePKIPath": "pki-intermediate/", + "CSRMaxPerSecond": 100, + }, + }, + }) + require.NoError(t, err) + _, sameRoot, err := s1.fsm.State().CARootActive(nil) + require.NoError(t, err) + require.Len(t, sameRoot.IntermediateCerts, 1) + sameRoot.CreateIndex = s1.caManager.providerRoot.CreateIndex + sameRoot.ModifyIndex = s1.caManager.providerRoot.ModifyIndex + + cert, err := connect.ParseCert(s1.caManager.getLeafSigningCertFromRoot(sameRoot)) + require.NoError(t, err) + require.Equal(t, connect.HexString(cert.SubjectKeyId), sameRoot.SigningKeyID) + + require.Equal(t, origRoot, sameRoot) + require.Equal(t, sameRoot, s1.caManager.providerRoot) }) - err = s1.caManager.UpdateConfiguration(&structs.CARequest{ - Config: &structs.CAConfiguration{ - Provider: "vault", - Config: map[string]interface{}{ - "Address": vault.Addr, - "Token": vaultToken2, - "RootPKIPath": "pki-root-2/", - "IntermediatePKIPath": "pki-intermediate-2/", + t.Run("update config and change root", func(t *testing.T) { + vaultToken2 := ca.CreateVaultTokenWithAttrs(t, vault.Client(), &ca.VaultTokenAttributes{ + RootPath: "pki-root-2", + IntermediatePath: "pki-intermediate-2", + ConsulManaged: true, + }) + + err = s1.caManager.UpdateConfiguration(&structs.CARequest{ + Config: &structs.CAConfiguration{ + Provider: "vault", + Config: map[string]interface{}{ + "Address": vault.Addr, + "Token": vaultToken2, + "RootPKIPath": "pki-root-2/", + "IntermediatePKIPath": "pki-intermediate-2/", + }, }, - }, - }) - require.NoError(t, err) + }) + require.NoError(t, err) - _, newRoot, err := s1.fsm.State().CARootActive(nil) - require.NoError(t, err) - require.Len(t, newRoot.IntermediateCerts, 2, - "expected one cross-sign cert and one local leaf sign cert") - require.NotEqual(t, origRoot.ID, newRoot.ID) + _, newRoot, err := s1.fsm.State().CARootActive(nil) + require.NoError(t, err) + require.Len(t, newRoot.IntermediateCerts, 2, + "expected one cross-sign cert and one local leaf sign cert") + require.NotEqual(t, origRoot.ID, newRoot.ID) - cert, err = connect.ParseCert(s1.caManager.getLeafSigningCertFromRoot(newRoot)) - require.NoError(t, err) - require.Equal(t, connect.HexString(cert.SubjectKeyId), newRoot.SigningKeyID) + cert, err = connect.ParseCert(s1.caManager.getLeafSigningCertFromRoot(newRoot)) + require.NoError(t, err) + require.Equal(t, connect.HexString(cert.SubjectKeyId), newRoot.SigningKeyID) + }) } func TestCAManager_Initialize_Vault_WithIntermediateAsPrimaryCA(t *testing.T) { From 9d21736e9f5828920cb8302397e0f11c95cae88c Mon Sep 17 00:00:00 2001 From: Ronald Date: Tue, 14 Mar 2023 14:18:55 +0100 Subject: [PATCH 149/262] Add UI copyright headers files (#16614) * Add copyright headers to UI files * Ensure copywrite file ignores external libs --- .copywrite.hcl | 6 ++++-- .../app/components/consul/acl/selector/index.hbs | 5 +++++ .../app/components/consul/token/selector/index.hbs | 5 +++++ .../app/components/consul/token/selector/index.js | 5 +++++ ui/packages/consul-acls/vendor/consul-acls/routes.js | 5 +++++ ui/packages/consul-acls/vendor/consul-acls/services.js | 5 +++++ .../consul-hcp/app/components/consul/hcp/home/index.hbs | 5 +++++ .../consul-hcp/app/components/consul/hcp/home/index.scss | 5 +++++ .../consul-hcp/app/components/consul/hcp/home/index.test.js | 5 +++++ ui/packages/consul-hcp/vendor/consul-hcp/routes.js | 5 +++++ ui/packages/consul-hcp/vendor/consul-hcp/services.js | 5 +++++ .../app/components/consul/lock-session/form/index.hbs | 5 +++++ .../app/components/consul/lock-session/form/index.scss | 5 +++++ .../app/components/consul/lock-session/list/index.hbs | 5 +++++ .../app/components/consul/lock-session/list/index.scss | 5 +++++ .../components/consul/lock-session/notifications/index.hbs | 5 +++++ .../app/templates/dc/nodes/show/sessions.hbs | 5 +++++ .../vendor/consul-lock-sessions/routes.js | 5 +++++ .../vendor/consul-lock-sessions/services.js | 5 +++++ .../app/components/consul/nspace/form/index.hbs | 5 +++++ .../app/components/consul/nspace/form/index.js | 5 +++++ .../app/components/consul/nspace/list/index.hbs | 5 +++++ .../app/components/consul/nspace/list/pageobject.js | 5 +++++ .../app/components/consul/nspace/notifications/index.hbs | 5 +++++ .../app/components/consul/nspace/search-bar/index.hbs | 5 +++++ .../app/components/consul/nspace/selector/index.hbs | 5 +++++ .../consul-nspaces/app/templates/dc/nspaces/edit.hbs | 5 +++++ .../consul-nspaces/app/templates/dc/nspaces/index.hbs | 5 +++++ ui/packages/consul-nspaces/vendor/consul-nspaces/routes.js | 5 +++++ .../consul-nspaces/vendor/consul-nspaces/services.js | 5 +++++ .../app/components/consul/partition/form/index.hbs | 5 +++++ .../app/components/consul/partition/list/index.hbs | 5 +++++ .../app/components/consul/partition/list/test-support.js | 5 +++++ .../app/components/consul/partition/notifications/index.hbs | 5 +++++ .../app/components/consul/partition/search-bar/index.hbs | 5 +++++ .../app/components/consul/partition/selector/index.hbs | 5 +++++ .../consul-partitions/app/templates/dc/partitions/edit.hbs | 5 +++++ .../consul-partitions/app/templates/dc/partitions/index.hbs | 5 +++++ .../consul-partitions/vendor/consul-partitions/routes.js | 5 +++++ .../consul-partitions/vendor/consul-partitions/services.js | 5 +++++ .../app/components/consul/peer/address/list/index.hbs | 5 +++++ .../app/components/consul/peer/address/list/index.scss | 5 +++++ .../app/components/consul/peer/bento-box/index.hbs | 5 +++++ .../app/components/consul/peer/components.scss | 5 +++++ .../app/components/consul/peer/form/chart.xstate.js | 5 +++++ .../components/consul/peer/form/generate/actions/index.hbs | 5 +++++ .../components/consul/peer/form/generate/chart.xstate.js | 5 +++++ .../consul/peer/form/generate/fieldsets/index.hbs | 5 +++++ .../components/consul/peer/form/generate/fieldsets/index.js | 5 +++++ .../app/components/consul/peer/form/generate/index.hbs | 5 +++++ .../app/components/consul/peer/form/index.hbs | 5 +++++ .../app/components/consul/peer/form/index.scss | 5 +++++ .../components/consul/peer/form/initiate/actions/index.hbs | 5 +++++ .../consul/peer/form/initiate/fieldsets/index.hbs | 5 +++++ .../app/components/consul/peer/form/initiate/index.hbs | 5 +++++ .../app/components/consul/peer/form/token/actions/index.hbs | 5 +++++ .../components/consul/peer/form/token/fieldsets/index.hbs | 5 +++++ .../consul-peerings/app/components/consul/peer/index.scss | 5 +++++ .../app/components/consul/peer/list/index.hbs | 5 +++++ .../app/components/consul/peer/list/test-support.js | 5 +++++ .../app/components/consul/peer/notifications/index.hbs | 5 +++++ .../app/components/consul/peer/search-bar/index.hbs | 5 +++++ .../app/components/consul/peer/search-bar/index.scss | 5 +++++ .../app/components/consul/peer/selector/index.hbs | 5 +++++ .../consul-peerings/app/controllers/dc/peers/index.js | 5 +++++ .../app/controllers/dc/peers/show/exported.js | 5 +++++ .../consul-peerings/app/controllers/dc/peers/show/index.js | 5 +++++ .../consul-peerings/app/templates/dc/peers/index.hbs | 5 +++++ ui/packages/consul-peerings/app/templates/dc/peers/show.hbs | 5 +++++ .../app/templates/dc/peers/show/addresses.hbs | 5 +++++ .../app/templates/dc/peers/show/exported.hbs | 5 +++++ .../app/templates/dc/peers/show/imported.hbs | 5 +++++ .../consul-peerings/app/templates/dc/peers/show/index.hbs | 5 +++++ .../consul-peerings/vendor/consul-peerings/routes.js | 5 +++++ .../consul-peerings/vendor/consul-peerings/services.js | 5 +++++ ui/packages/consul-ui/.docfy-config.js | 5 +++++ ui/packages/consul-ui/.eslintrc.js | 5 +++++ ui/packages/consul-ui/.istanbul.yml | 3 +++ ui/packages/consul-ui/.prettierrc.js | 5 +++++ ui/packages/consul-ui/.template-lintrc.js | 5 +++++ ui/packages/consul-ui/app/abilities/acl.js | 5 +++++ ui/packages/consul-ui/app/abilities/auth-method.js | 5 +++++ ui/packages/consul-ui/app/abilities/base.js | 5 +++++ ui/packages/consul-ui/app/abilities/intention.js | 5 +++++ ui/packages/consul-ui/app/abilities/kv.js | 5 +++++ ui/packages/consul-ui/app/abilities/license.js | 5 +++++ ui/packages/consul-ui/app/abilities/node.js | 5 +++++ ui/packages/consul-ui/app/abilities/nspace.js | 5 +++++ ui/packages/consul-ui/app/abilities/overview.js | 5 +++++ ui/packages/consul-ui/app/abilities/partition.js | 5 +++++ ui/packages/consul-ui/app/abilities/peer.js | 5 +++++ ui/packages/consul-ui/app/abilities/permission.js | 5 +++++ ui/packages/consul-ui/app/abilities/policy.js | 5 +++++ ui/packages/consul-ui/app/abilities/role.js | 5 +++++ ui/packages/consul-ui/app/abilities/server.js | 5 +++++ ui/packages/consul-ui/app/abilities/service-instance.js | 5 +++++ ui/packages/consul-ui/app/abilities/session.js | 5 +++++ ui/packages/consul-ui/app/abilities/token.js | 5 +++++ ui/packages/consul-ui/app/abilities/upstream.js | 5 +++++ ui/packages/consul-ui/app/abilities/zervice.js | 5 +++++ ui/packages/consul-ui/app/abilities/zone.js | 5 +++++ ui/packages/consul-ui/app/adapters/application.js | 5 +++++ ui/packages/consul-ui/app/adapters/auth-method.js | 5 +++++ ui/packages/consul-ui/app/adapters/binding-rule.js | 5 +++++ ui/packages/consul-ui/app/adapters/coordinate.js | 5 +++++ ui/packages/consul-ui/app/adapters/discovery-chain.js | 5 +++++ ui/packages/consul-ui/app/adapters/http.js | 5 +++++ ui/packages/consul-ui/app/adapters/intention.js | 5 +++++ ui/packages/consul-ui/app/adapters/kv.js | 5 +++++ ui/packages/consul-ui/app/adapters/node.js | 5 +++++ ui/packages/consul-ui/app/adapters/nspace.js | 5 +++++ ui/packages/consul-ui/app/adapters/oidc-provider.js | 5 +++++ ui/packages/consul-ui/app/adapters/partition.js | 5 +++++ ui/packages/consul-ui/app/adapters/permission.js | 5 +++++ ui/packages/consul-ui/app/adapters/policy.js | 5 +++++ ui/packages/consul-ui/app/adapters/proxy.js | 5 +++++ ui/packages/consul-ui/app/adapters/role.js | 5 +++++ ui/packages/consul-ui/app/adapters/service-instance.js | 5 +++++ ui/packages/consul-ui/app/adapters/service.js | 5 +++++ ui/packages/consul-ui/app/adapters/session.js | 5 +++++ ui/packages/consul-ui/app/adapters/token.js | 5 +++++ ui/packages/consul-ui/app/adapters/topology.js | 5 +++++ ui/packages/consul-ui/app/app.js | 5 +++++ ui/packages/consul-ui/app/components/action/index.hbs | 5 +++++ ui/packages/consul-ui/app/components/anchors/index.scss | 5 +++++ ui/packages/consul-ui/app/components/anchors/skin.scss | 5 +++++ ui/packages/consul-ui/app/components/anonymous/index.hbs | 5 +++++ ui/packages/consul-ui/app/components/anonymous/index.js | 5 +++++ ui/packages/consul-ui/app/components/app-error/index.hbs | 5 +++++ ui/packages/consul-ui/app/components/app-view/index.hbs | 5 +++++ ui/packages/consul-ui/app/components/app-view/index.js | 5 +++++ ui/packages/consul-ui/app/components/app-view/index.scss | 5 +++++ ui/packages/consul-ui/app/components/app-view/layout.scss | 5 +++++ ui/packages/consul-ui/app/components/app-view/skin.scss | 5 +++++ ui/packages/consul-ui/app/components/app/index.hbs | 5 +++++ ui/packages/consul-ui/app/components/app/index.js | 5 +++++ ui/packages/consul-ui/app/components/app/index.scss | 5 +++++ .../consul-ui/app/components/app/notification/index.hbs | 5 +++++ ui/packages/consul-ui/app/components/aria-menu/index.hbs | 5 +++++ ui/packages/consul-ui/app/components/aria-menu/index.js | 5 +++++ .../consul-ui/app/components/auth-dialog/chart.xstate.js | 5 +++++ ui/packages/consul-ui/app/components/auth-dialog/index.hbs | 5 +++++ ui/packages/consul-ui/app/components/auth-dialog/index.js | 5 +++++ .../consul-ui/app/components/auth-form/chart.xstate.js | 5 +++++ ui/packages/consul-ui/app/components/auth-form/index.hbs | 5 +++++ ui/packages/consul-ui/app/components/auth-form/index.js | 5 +++++ ui/packages/consul-ui/app/components/auth-form/index.scss | 5 +++++ ui/packages/consul-ui/app/components/auth-form/layout.scss | 5 +++++ .../consul-ui/app/components/auth-form/pageobject.js | 5 +++++ ui/packages/consul-ui/app/components/auth-form/skin.scss | 5 +++++ .../consul-ui/app/components/auth-form/tabs.xstate.js | 5 +++++ ui/packages/consul-ui/app/components/auth-modal/index.scss | 5 +++++ ui/packages/consul-ui/app/components/auth-modal/layout.scss | 5 +++++ ui/packages/consul-ui/app/components/auth-modal/skin.scss | 5 +++++ ui/packages/consul-ui/app/components/auth-profile/index.hbs | 5 +++++ .../consul-ui/app/components/auth-profile/index.scss | 5 +++++ ui/packages/consul-ui/app/components/badge/debug.scss | 5 +++++ ui/packages/consul-ui/app/components/badge/index.scss | 5 +++++ .../consul-ui/app/components/brand-loader/enterprise.hbs | 5 +++++ ui/packages/consul-ui/app/components/brand-loader/index.hbs | 5 +++++ .../consul-ui/app/components/brand-loader/index.scss | 5 +++++ .../consul-ui/app/components/brand-loader/layout.scss | 5 +++++ ui/packages/consul-ui/app/components/brand-loader/skin.scss | 5 +++++ ui/packages/consul-ui/app/components/breadcrumbs/index.scss | 5 +++++ .../consul-ui/app/components/breadcrumbs/layout.scss | 5 +++++ ui/packages/consul-ui/app/components/breadcrumbs/skin.scss | 5 +++++ ui/packages/consul-ui/app/components/buttons/index.scss | 5 +++++ ui/packages/consul-ui/app/components/buttons/layout.scss | 5 +++++ ui/packages/consul-ui/app/components/buttons/skin.scss | 5 +++++ ui/packages/consul-ui/app/components/card/index.scss | 5 +++++ ui/packages/consul-ui/app/components/card/layout.scss | 5 +++++ ui/packages/consul-ui/app/components/card/skin.scss | 5 +++++ .../consul-ui/app/components/checkbox-group/index.scss | 5 +++++ .../consul-ui/app/components/checkbox-group/layout.scss | 5 +++++ .../consul-ui/app/components/checkbox-group/skin.scss | 5 +++++ .../consul-ui/app/components/child-selector/index.hbs | 5 +++++ .../consul-ui/app/components/child-selector/index.js | 5 +++++ ui/packages/consul-ui/app/components/code-editor/index.hbs | 5 +++++ ui/packages/consul-ui/app/components/code-editor/index.js | 5 +++++ ui/packages/consul-ui/app/components/code-editor/index.scss | 5 +++++ .../consul-ui/app/components/code-editor/layout.scss | 5 +++++ ui/packages/consul-ui/app/components/code-editor/skin.scss | 5 +++++ .../consul-ui/app/components/composite-row/index.scss | 5 +++++ .../consul-ui/app/components/composite-row/layout.scss | 5 +++++ .../consul-ui/app/components/confirmation-alert/index.hbs | 5 +++++ .../consul-ui/app/components/confirmation-alert/index.js | 5 +++++ .../consul-ui/app/components/confirmation-dialog/index.hbs | 5 +++++ .../consul-ui/app/components/confirmation-dialog/index.js | 5 +++++ .../consul-ui/app/components/confirmation-dialog/index.scss | 5 +++++ .../app/components/confirmation-dialog/layout.scss | 5 +++++ .../consul-ui/app/components/confirmation-dialog/skin.scss | 5 +++++ .../consul-ui/app/components/consul/acl/disabled/index.hbs | 5 +++++ .../components/consul/auth-method/binding-list/index.hbs | 5 +++++ .../consul-ui/app/components/consul/auth-method/index.scss | 5 +++++ .../app/components/consul/auth-method/list/index.hbs | 5 +++++ .../app/components/consul/auth-method/list/pageobject.js | 5 +++++ .../app/components/consul/auth-method/nspace-list/index.hbs | 5 +++++ .../app/components/consul/auth-method/search-bar/index.hbs | 5 +++++ .../app/components/consul/auth-method/type/index.hbs | 5 +++++ .../app/components/consul/auth-method/view/index.hbs | 5 +++++ .../consul-ui/app/components/consul/bucket/list/index.hbs | 5 +++++ .../consul-ui/app/components/consul/bucket/list/index.js | 5 +++++ .../consul-ui/app/components/consul/bucket/list/index.scss | 5 +++++ .../app/components/consul/datacenter/selector/index.hbs | 5 +++++ .../app/components/consul/discovery-chain/index.hbs | 5 +++++ .../app/components/consul/discovery-chain/index.js | 5 +++++ .../app/components/consul/discovery-chain/index.scss | 5 +++++ .../app/components/consul/discovery-chain/layout.scss | 5 +++++ .../consul/discovery-chain/resolver-card/index.hbs | 5 +++++ .../components/consul/discovery-chain/route-card/index.hbs | 5 +++++ .../components/consul/discovery-chain/route-card/index.js | 5 +++++ .../app/components/consul/discovery-chain/skin.scss | 5 +++++ .../consul/discovery-chain/splitter-card/index.hbs | 5 +++++ .../app/components/consul/discovery-chain/utils.js | 5 +++++ .../app/components/consul/exposed-path/list/index.hbs | 5 +++++ .../app/components/consul/exposed-path/list/index.scss | 5 +++++ .../app/components/consul/external-source/index.hbs | 5 +++++ .../app/components/consul/external-source/index.scss | 5 +++++ .../app/components/consul/health-check/list/index.hbs | 5 +++++ .../app/components/consul/health-check/list/index.scss | 5 +++++ .../app/components/consul/health-check/list/layout.scss | 5 +++++ .../app/components/consul/health-check/list/pageobject.js | 5 +++++ .../app/components/consul/health-check/list/skin.scss | 5 +++++ .../app/components/consul/health-check/search-bar/index.hbs | 5 +++++ .../app/components/consul/instance-checks/index.hbs | 5 +++++ .../app/components/consul/instance-checks/index.scss | 5 +++++ .../app/components/consul/intention/components.scss | 5 +++++ .../components/consul/intention/form/fieldsets/index.hbs | 5 +++++ .../app/components/consul/intention/form/fieldsets/index.js | 5 +++++ .../components/consul/intention/form/fieldsets/index.scss | 5 +++++ .../components/consul/intention/form/fieldsets/layout.scss | 5 +++++ .../components/consul/intention/form/fieldsets/skin.scss | 5 +++++ .../app/components/consul/intention/form/index.hbs | 5 +++++ .../consul-ui/app/components/consul/intention/form/index.js | 5 +++++ .../app/components/consul/intention/form/index.scss | 5 +++++ .../consul-ui/app/components/consul/intention/index.scss | 5 +++++ .../app/components/consul/intention/list/check/index.hbs | 5 +++++ .../app/components/consul/intention/list/components.scss | 5 +++++ .../app/components/consul/intention/list/index.hbs | 5 +++++ .../consul-ui/app/components/consul/intention/list/index.js | 5 +++++ .../app/components/consul/intention/list/index.scss | 5 +++++ .../app/components/consul/intention/list/layout.scss | 5 +++++ .../app/components/consul/intention/list/pageobject.js | 5 +++++ .../app/components/consul/intention/list/skin.scss | 5 +++++ .../app/components/consul/intention/list/table/index.hbs | 5 +++++ .../app/components/consul/intention/list/table/index.scss | 5 +++++ .../consul/intention/notice/custom-resource/index.hbs | 5 +++++ .../consul/intention/notice/permissions/index.hbs | 5 +++++ .../app/components/consul/intention/notifications/index.hbs | 5 +++++ .../components/consul/intention/permission/form/index.hbs | 5 +++++ .../components/consul/intention/permission/form/index.js | 5 +++++ .../components/consul/intention/permission/form/index.scss | 5 +++++ .../components/consul/intention/permission/form/layout.scss | 5 +++++ .../consul/intention/permission/form/pageobject.js | 5 +++++ .../components/consul/intention/permission/form/skin.scss | 5 +++++ .../consul/intention/permission/header/form/index.hbs | 5 +++++ .../consul/intention/permission/header/form/index.js | 5 +++++ .../consul/intention/permission/header/form/pageobject.js | 5 +++++ .../consul/intention/permission/header/list/index.hbs | 5 +++++ .../consul/intention/permission/header/list/index.js | 5 +++++ .../consul/intention/permission/header/list/index.scss | 5 +++++ .../consul/intention/permission/header/list/layout.scss | 5 +++++ .../consul/intention/permission/header/list/pageobject.js | 5 +++++ .../consul/intention/permission/header/list/skin.scss | 5 +++++ .../components/consul/intention/permission/list/index.hbs | 5 +++++ .../components/consul/intention/permission/list/index.js | 5 +++++ .../components/consul/intention/permission/list/index.scss | 5 +++++ .../components/consul/intention/permission/list/layout.scss | 5 +++++ .../consul/intention/permission/list/pageobject.js | 5 +++++ .../components/consul/intention/permission/list/skin.scss | 5 +++++ .../app/components/consul/intention/search-bar/index.hbs | 5 +++++ .../app/components/consul/intention/search-bar/index.scss | 5 +++++ .../app/components/consul/intention/view/index.hbs | 5 +++++ .../consul-ui/app/components/consul/intention/view/index.js | 5 +++++ ui/packages/consul-ui/app/components/consul/kind/index.hbs | 5 +++++ ui/packages/consul-ui/app/components/consul/kind/index.js | 5 +++++ ui/packages/consul-ui/app/components/consul/kind/index.scss | 5 +++++ .../consul-ui/app/components/consul/kv/form/index.hbs | 5 +++++ .../consul-ui/app/components/consul/kv/form/index.js | 5 +++++ .../consul-ui/app/components/consul/kv/list/index.hbs | 5 +++++ .../consul-ui/app/components/consul/kv/list/pageobject.js | 5 +++++ .../consul-ui/app/components/consul/kv/search-bar/index.hbs | 5 +++++ .../consul-ui/app/components/consul/loader/index.hbs | 5 +++++ .../consul-ui/app/components/consul/loader/index.scss | 5 +++++ .../consul-ui/app/components/consul/loader/layout.scss | 5 +++++ .../consul-ui/app/components/consul/loader/skin.scss | 5 +++++ .../consul-ui/app/components/consul/metadata/list/index.hbs | 5 +++++ .../consul-ui/app/components/consul/metadata/list/index.js | 5 +++++ .../app/components/consul/node-identity/template/index.hbs | 5 +++++ .../app/components/consul/node/agentless-notice/index.hbs | 5 +++++ .../app/components/consul/node/agentless-notice/index.js | 5 +++++ .../app/components/consul/node/agentless-notice/index.scss | 5 +++++ .../consul-ui/app/components/consul/node/list/index.hbs | 5 +++++ .../app/components/consul/node/peer-info/index.hbs | 5 +++++ .../app/components/consul/node/peer-info/index.scss | 5 +++++ .../app/components/consul/node/search-bar/index.hbs | 5 +++++ .../consul-ui/app/components/consul/peer/info/index.hbs | 5 +++++ .../consul-ui/app/components/consul/peer/info/index.scss | 5 +++++ .../consul-ui/app/components/consul/peer/list/index.scss | 5 +++++ .../consul-ui/app/components/consul/policy/list/index.hbs | 5 +++++ .../app/components/consul/policy/list/pageobject.js | 5 +++++ .../app/components/consul/policy/notifications/index.hbs | 5 +++++ .../app/components/consul/policy/search-bar/index.hbs | 5 +++++ .../app/components/consul/policy/search-bar/index.js | 5 +++++ .../consul-ui/app/components/consul/role/list/index.hbs | 5 +++++ .../consul-ui/app/components/consul/role/list/pageobject.js | 5 +++++ .../app/components/consul/role/notifications/index.hbs | 5 +++++ .../app/components/consul/role/search-bar/index.hbs | 5 +++++ .../consul-ui/app/components/consul/server/card/index.hbs | 5 +++++ .../consul-ui/app/components/consul/server/card/index.scss | 5 +++++ .../consul-ui/app/components/consul/server/card/layout.scss | 5 +++++ .../consul-ui/app/components/consul/server/card/skin.scss | 5 +++++ .../consul-ui/app/components/consul/server/list/index.hbs | 5 +++++ .../consul-ui/app/components/consul/server/list/index.scss | 5 +++++ .../components/consul/service-identity/template/index.hbs | 5 +++++ .../app/components/consul/service-instance/list/index.hbs | 5 +++++ .../app/components/consul/service-instance/list/index.js | 5 +++++ .../components/consul/service-instance/search-bar/index.hbs | 5 +++++ .../consul-ui/app/components/consul/service/list/index.hbs | 5 +++++ .../app/components/consul/service/search-bar/index.hbs | 5 +++++ .../app/components/consul/service/search-bar/index.js | 5 +++++ .../consul-ui/app/components/consul/source/index.hbs | 5 +++++ .../consul-ui/app/components/consul/source/index.scss | 5 +++++ .../app/components/consul/sources-select/index.hbs | 5 +++++ .../consul-ui/app/components/consul/token/list/index.hbs | 5 +++++ .../app/components/consul/token/list/pageobject.js | 5 +++++ .../app/components/consul/token/notifications/index.hbs | 5 +++++ .../app/components/consul/token/ruleset/list/index.hbs | 5 +++++ .../app/components/consul/token/ruleset/list/index.js | 5 +++++ .../app/components/consul/token/search-bar/index.hbs | 5 +++++ .../app/components/consul/tomography/graph/index.hbs | 5 +++++ .../app/components/consul/tomography/graph/index.js | 5 +++++ .../app/components/consul/tomography/graph/index.scss | 5 +++++ .../app/components/consul/transparent-proxy/index.hbs | 5 +++++ .../app/components/consul/upstream-instance/list/index.hbs | 5 +++++ .../app/components/consul/upstream-instance/list/index.scss | 5 +++++ .../components/consul/upstream-instance/list/pageobject.js | 5 +++++ .../consul/upstream-instance/search-bar/index.hbs | 5 +++++ .../consul-ui/app/components/consul/upstream/list/index.hbs | 5 +++++ .../app/components/consul/upstream/list/index.scss | 5 +++++ .../app/components/consul/upstream/search-bar/index.hbs | 5 +++++ .../consul-ui/app/components/copy-button/chart.xstate.js | 5 +++++ ui/packages/consul-ui/app/components/copy-button/index.hbs | 5 +++++ ui/packages/consul-ui/app/components/copy-button/index.js | 5 +++++ ui/packages/consul-ui/app/components/copy-button/index.scss | 5 +++++ .../consul-ui/app/components/copy-button/layout.scss | 5 +++++ ui/packages/consul-ui/app/components/copy-button/skin.scss | 5 +++++ .../consul-ui/app/components/copyable-code/index.hbs | 5 +++++ .../consul-ui/app/components/copyable-code/index.scss | 5 +++++ ui/packages/consul-ui/app/components/csv-list/debug.scss | 5 +++++ ui/packages/consul-ui/app/components/csv-list/index.scss | 5 +++++ .../consul-ui/app/components/data-collection/index.hbs | 5 +++++ .../consul-ui/app/components/data-collection/index.js | 5 +++++ ui/packages/consul-ui/app/components/data-form/index.hbs | 5 +++++ ui/packages/consul-ui/app/components/data-form/index.js | 5 +++++ .../consul-ui/app/components/data-loader/chart.xstate.js | 5 +++++ ui/packages/consul-ui/app/components/data-loader/index.hbs | 5 +++++ ui/packages/consul-ui/app/components/data-loader/index.js | 5 +++++ ui/packages/consul-ui/app/components/data-sink/index.hbs | 5 +++++ ui/packages/consul-ui/app/components/data-sink/index.js | 5 +++++ ui/packages/consul-ui/app/components/data-source/index.hbs | 5 +++++ ui/packages/consul-ui/app/components/data-source/index.js | 5 +++++ .../consul-ui/app/components/data-writer/chart.xstate.js | 5 +++++ ui/packages/consul-ui/app/components/data-writer/index.hbs | 5 +++++ ui/packages/consul-ui/app/components/data-writer/index.js | 5 +++++ .../consul-ui/app/components/debug/navigation/index.hbs | 5 +++++ .../consul-ui/app/components/definition-table/debug.scss | 5 +++++ .../consul-ui/app/components/definition-table/index.scss | 5 +++++ .../consul-ui/app/components/definition-table/layout.scss | 5 +++++ .../consul-ui/app/components/definition-table/skin.scss | 5 +++++ .../consul-ui/app/components/delete-confirmation/index.hbs | 5 +++++ .../consul-ui/app/components/delete-confirmation/index.js | 5 +++++ .../app/components/disclosure-menu/action/index.hbs | 5 +++++ .../consul-ui/app/components/disclosure-menu/index.hbs | 5 +++++ .../consul-ui/app/components/disclosure-menu/index.scss | 5 +++++ .../consul-ui/app/components/disclosure-menu/menu/index.hbs | 5 +++++ .../consul-ui/app/components/disclosure/action/index.hbs | 5 +++++ .../consul-ui/app/components/disclosure/details/index.hbs | 5 +++++ ui/packages/consul-ui/app/components/disclosure/index.hbs | 5 +++++ ui/packages/consul-ui/app/components/disclosure/index.js | 5 +++++ .../consul-ui/app/components/display-toggle/index.scss | 5 +++++ .../consul-ui/app/components/display-toggle/layout.scss | 5 +++++ .../consul-ui/app/components/display-toggle/skin.scss | 5 +++++ .../consul-ui/app/components/dom-recycling-table/index.scss | 5 +++++ .../app/components/dom-recycling-table/layout.scss | 5 +++++ ui/packages/consul-ui/app/components/empty-state/index.hbs | 5 +++++ ui/packages/consul-ui/app/components/empty-state/index.js | 5 +++++ ui/packages/consul-ui/app/components/empty-state/index.scss | 5 +++++ .../consul-ui/app/components/empty-state/layout.scss | 5 +++++ .../consul-ui/app/components/empty-state/pageobject.js | 5 +++++ ui/packages/consul-ui/app/components/empty-state/skin.scss | 5 +++++ ui/packages/consul-ui/app/components/error-state/index.hbs | 5 +++++ ui/packages/consul-ui/app/components/event-source/index.hbs | 5 +++++ ui/packages/consul-ui/app/components/event-source/index.js | 5 +++++ .../app/components/expanded-single-select/index.scss | 5 +++++ .../app/components/expanded-single-select/layout.scss | 5 +++++ .../app/components/expanded-single-select/skin.scss | 5 +++++ ui/packages/consul-ui/app/components/filter-bar/index.scss | 5 +++++ ui/packages/consul-ui/app/components/filter-bar/layout.scss | 5 +++++ ui/packages/consul-ui/app/components/filter-bar/skin.scss | 5 +++++ .../consul-ui/app/components/form-component/index.hbs | 5 +++++ .../consul-ui/app/components/form-component/index.js | 5 +++++ .../consul-ui/app/components/form-elements/index.scss | 5 +++++ .../consul-ui/app/components/form-elements/layout.scss | 5 +++++ .../consul-ui/app/components/form-elements/skin.scss | 5 +++++ .../app/components/form-group/element/checkbox/index.hbs | 5 +++++ .../app/components/form-group/element/error/index.hbs | 5 +++++ .../consul-ui/app/components/form-group/element/index.hbs | 5 +++++ .../consul-ui/app/components/form-group/element/index.js | 5 +++++ .../app/components/form-group/element/label/index.hbs | 5 +++++ .../app/components/form-group/element/radio/index.hbs | 5 +++++ .../app/components/form-group/element/text/index.hbs | 5 +++++ ui/packages/consul-ui/app/components/form-group/index.hbs | 5 +++++ ui/packages/consul-ui/app/components/form-group/index.js | 5 +++++ ui/packages/consul-ui/app/components/form-input/index.hbs | 5 +++++ .../consul-ui/app/components/freetext-filter/index.hbs | 5 +++++ .../consul-ui/app/components/freetext-filter/index.js | 5 +++++ .../consul-ui/app/components/freetext-filter/index.scss | 5 +++++ .../consul-ui/app/components/freetext-filter/layout.scss | 5 +++++ .../consul-ui/app/components/freetext-filter/pageobject.js | 5 +++++ .../consul-ui/app/components/freetext-filter/skin.scss | 5 +++++ .../consul-ui/app/components/hashicorp-consul/index.hbs | 5 +++++ .../consul-ui/app/components/hashicorp-consul/index.js | 5 +++++ .../consul-ui/app/components/hashicorp-consul/index.scss | 5 +++++ .../consul-ui/app/components/horizontal-kv-list/debug.scss | 5 +++++ .../consul-ui/app/components/horizontal-kv-list/index.scss | 5 +++++ .../consul-ui/app/components/horizontal-kv-list/layout.scss | 5 +++++ .../consul-ui/app/components/horizontal-kv-list/skin.scss | 5 +++++ .../consul-ui/app/components/icon-definition/debug.scss | 5 +++++ .../consul-ui/app/components/icon-definition/index.scss | 5 +++++ .../consul-ui/app/components/informed-action/index.hbs | 5 +++++ .../consul-ui/app/components/informed-action/index.scss | 5 +++++ .../consul-ui/app/components/informed-action/layout.scss | 5 +++++ .../consul-ui/app/components/informed-action/skin.scss | 5 +++++ .../consul-ui/app/components/inline-alert/debug.scss | 5 +++++ .../consul-ui/app/components/inline-alert/index.scss | 5 +++++ .../consul-ui/app/components/inline-alert/layout.scss | 5 +++++ ui/packages/consul-ui/app/components/inline-alert/skin.scss | 5 +++++ ui/packages/consul-ui/app/components/inline-code/index.scss | 5 +++++ .../consul-ui/app/components/inline-code/layout.scss | 5 +++++ ui/packages/consul-ui/app/components/inline-code/skin.scss | 5 +++++ ui/packages/consul-ui/app/components/jwt-source/index.js | 5 +++++ .../consul-ui/app/components/list-collection/index.hbs | 5 +++++ .../consul-ui/app/components/list-collection/index.js | 5 +++++ .../consul-ui/app/components/list-collection/index.scss | 5 +++++ .../consul-ui/app/components/list-collection/layout.scss | 5 +++++ .../consul-ui/app/components/list-collection/skin.scss | 5 +++++ ui/packages/consul-ui/app/components/list-row/index.scss | 5 +++++ ui/packages/consul-ui/app/components/list-row/layout.scss | 5 +++++ ui/packages/consul-ui/app/components/list-row/skin.scss | 5 +++++ .../app/components/main-header-horizontal/index.scss | 5 +++++ .../app/components/main-header-horizontal/layout.scss | 5 +++++ .../app/components/main-header-horizontal/skin.scss | 5 +++++ .../consul-ui/app/components/main-nav-horizontal/index.scss | 5 +++++ .../app/components/main-nav-horizontal/layout.scss | 5 +++++ .../consul-ui/app/components/main-nav-horizontal/skin.scss | 5 +++++ .../consul-ui/app/components/main-nav-vertical/debug.scss | 5 +++++ .../consul-ui/app/components/main-nav-vertical/index.scss | 5 +++++ .../consul-ui/app/components/main-nav-vertical/layout.scss | 5 +++++ .../consul-ui/app/components/main-nav-vertical/skin.scss | 5 +++++ .../consul-ui/app/components/menu-panel/deprecated.scss | 5 +++++ ui/packages/consul-ui/app/components/menu-panel/index.hbs | 5 +++++ ui/packages/consul-ui/app/components/menu-panel/index.js | 5 +++++ ui/packages/consul-ui/app/components/menu-panel/index.scss | 5 +++++ ui/packages/consul-ui/app/components/menu-panel/layout.scss | 5 +++++ ui/packages/consul-ui/app/components/menu-panel/skin.scss | 5 +++++ ui/packages/consul-ui/app/components/menu/action/index.hbs | 5 +++++ ui/packages/consul-ui/app/components/menu/index.hbs | 5 +++++ ui/packages/consul-ui/app/components/menu/item/index.hbs | 5 +++++ .../consul-ui/app/components/menu/separator/index.hbs | 5 +++++ ui/packages/consul-ui/app/components/modal-dialog/index.hbs | 5 +++++ ui/packages/consul-ui/app/components/modal-dialog/index.js | 5 +++++ .../consul-ui/app/components/modal-dialog/index.scss | 5 +++++ .../consul-ui/app/components/modal-dialog/layout.scss | 5 +++++ ui/packages/consul-ui/app/components/modal-dialog/skin.scss | 5 +++++ ui/packages/consul-ui/app/components/modal-layer/index.hbs | 5 +++++ .../consul-ui/app/components/more-popover-menu/index.hbs | 5 +++++ .../consul-ui/app/components/more-popover-menu/index.js | 5 +++++ .../consul-ui/app/components/more-popover-menu/index.scss | 5 +++++ .../app/components/more-popover-menu/pageobject.js | 5 +++++ .../consul-ui/app/components/oidc-select/chart.xstate.js | 5 +++++ ui/packages/consul-ui/app/components/oidc-select/index.hbs | 5 +++++ ui/packages/consul-ui/app/components/oidc-select/index.js | 5 +++++ ui/packages/consul-ui/app/components/oidc-select/index.scss | 5 +++++ .../consul-ui/app/components/oidc-select/layout.scss | 5 +++++ ui/packages/consul-ui/app/components/oidc-select/skin.scss | 5 +++++ ui/packages/consul-ui/app/components/option-input/index.hbs | 5 +++++ ui/packages/consul-ui/app/components/outlet/index.hbs | 5 +++++ ui/packages/consul-ui/app/components/outlet/index.js | 5 +++++ ui/packages/consul-ui/app/components/overlay/index.scss | 5 +++++ ui/packages/consul-ui/app/components/overlay/none.scss | 5 +++++ .../consul-ui/app/components/overlay/square-tail.scss | 5 +++++ .../consul-ui/app/components/paged-collection/index.hbs | 5 +++++ .../consul-ui/app/components/paged-collection/index.js | 5 +++++ .../consul-ui/app/components/paged-collection/index.scss | 5 +++++ ui/packages/consul-ui/app/components/panel/debug.scss | 5 +++++ ui/packages/consul-ui/app/components/panel/index.css.js | 5 +++++ ui/packages/consul-ui/app/components/panel/index.scss | 5 +++++ ui/packages/consul-ui/app/components/panel/layout.scss | 5 +++++ ui/packages/consul-ui/app/components/panel/skin.scss | 5 +++++ .../consul-ui/app/components/peerings/badge/icon/index.hbs | 5 +++++ .../consul-ui/app/components/peerings/badge/index.hbs | 5 +++++ .../consul-ui/app/components/peerings/badge/index.js | 5 +++++ .../consul-ui/app/components/peerings/badge/index.scss | 5 +++++ .../consul-ui/app/components/peerings/provider/index.hbs | 5 +++++ .../consul-ui/app/components/peerings/provider/index.js | 5 +++++ ui/packages/consul-ui/app/components/pill/index.scss | 5 +++++ ui/packages/consul-ui/app/components/pill/layout.scss | 5 +++++ ui/packages/consul-ui/app/components/pill/skin.scss | 5 +++++ ui/packages/consul-ui/app/components/policy-form/index.hbs | 5 +++++ ui/packages/consul-ui/app/components/policy-form/index.js | 5 +++++ .../consul-ui/app/components/policy-form/pageobject.js | 5 +++++ .../consul-ui/app/components/policy-selector/index.hbs | 5 +++++ .../consul-ui/app/components/policy-selector/index.js | 5 +++++ .../consul-ui/app/components/policy-selector/pageobject.js | 5 +++++ ui/packages/consul-ui/app/components/popover-menu/index.hbs | 5 +++++ ui/packages/consul-ui/app/components/popover-menu/index.js | 5 +++++ .../consul-ui/app/components/popover-menu/index.scss | 5 +++++ .../consul-ui/app/components/popover-menu/layout.scss | 5 +++++ .../app/components/popover-menu/menu-item/index.hbs | 5 +++++ .../app/components/popover-menu/menu-item/index.js | 5 +++++ .../app/components/popover-menu/menu-separator/index.hbs | 5 +++++ .../app/components/popover-menu/menu-separator/index.js | 5 +++++ ui/packages/consul-ui/app/components/popover-menu/skin.scss | 5 +++++ .../consul-ui/app/components/popover-select/index.hbs | 5 +++++ .../consul-ui/app/components/popover-select/index.js | 5 +++++ .../consul-ui/app/components/popover-select/index.scss | 5 +++++ .../app/components/popover-select/optgroup/index.hbs | 5 +++++ .../app/components/popover-select/option/index.hbs | 5 +++++ .../consul-ui/app/components/popover-select/option/index.js | 5 +++++ .../consul-ui/app/components/popover-select/pageobject.js | 5 +++++ .../consul-ui/app/components/power-select/pageobject.js | 5 +++++ ui/packages/consul-ui/app/components/progress/index.hbs | 5 +++++ ui/packages/consul-ui/app/components/progress/index.scss | 5 +++++ ui/packages/consul-ui/app/components/progress/layout.scss | 5 +++++ ui/packages/consul-ui/app/components/progress/skin.scss | 5 +++++ .../consul-ui/app/components/providers/dimension/index.hbs | 5 +++++ .../consul-ui/app/components/providers/dimension/index.js | 5 +++++ .../consul-ui/app/components/providers/search/index.hbs | 5 +++++ .../consul-ui/app/components/providers/search/index.js | 5 +++++ ui/packages/consul-ui/app/components/radio-card/index.hbs | 5 +++++ ui/packages/consul-ui/app/components/radio-card/index.js | 5 +++++ ui/packages/consul-ui/app/components/radio-card/index.scss | 5 +++++ ui/packages/consul-ui/app/components/radio-card/layout.scss | 5 +++++ ui/packages/consul-ui/app/components/radio-card/skin.scss | 5 +++++ ui/packages/consul-ui/app/components/radio-group/index.hbs | 5 +++++ ui/packages/consul-ui/app/components/radio-group/index.js | 5 +++++ ui/packages/consul-ui/app/components/radio-group/index.scss | 5 +++++ .../consul-ui/app/components/radio-group/layout.scss | 5 +++++ .../consul-ui/app/components/radio-group/pageobject.js | 5 +++++ ui/packages/consul-ui/app/components/radio-group/skin.scss | 5 +++++ ui/packages/consul-ui/app/components/ref/index.js | 5 +++++ ui/packages/consul-ui/app/components/role-form/index.hbs | 5 +++++ ui/packages/consul-ui/app/components/role-form/index.js | 5 +++++ .../consul-ui/app/components/role-form/pageobject.js | 5 +++++ .../consul-ui/app/components/role-selector/index.hbs | 5 +++++ ui/packages/consul-ui/app/components/role-selector/index.js | 5 +++++ .../consul-ui/app/components/role-selector/index.scss | 5 +++++ .../consul-ui/app/components/role-selector/pageobject.js | 5 +++++ .../consul-ui/app/components/route/announcer/index.hbs | 5 +++++ ui/packages/consul-ui/app/components/route/index.hbs | 5 +++++ ui/packages/consul-ui/app/components/route/index.js | 5 +++++ ui/packages/consul-ui/app/components/route/title/index.hbs | 5 +++++ ui/packages/consul-ui/app/components/route/title/index.scss | 5 +++++ ui/packages/consul-ui/app/components/search-bar/index.hbs | 5 +++++ ui/packages/consul-ui/app/components/search-bar/index.js | 5 +++++ ui/packages/consul-ui/app/components/search-bar/index.scss | 5 +++++ .../app/components/search-bar/remove-filter/index.hbs | 5 +++++ ui/packages/consul-ui/app/components/search-bar/utils.js | 5 +++++ ui/packages/consul-ui/app/components/skip-links/index.scss | 5 +++++ ui/packages/consul-ui/app/components/skip-links/layout.scss | 5 +++++ ui/packages/consul-ui/app/components/skip-links/skin.scss | 5 +++++ .../consul-ui/app/components/sliding-toggle/index.scss | 5 +++++ .../consul-ui/app/components/sliding-toggle/layout.scss | 5 +++++ .../consul-ui/app/components/sliding-toggle/skin.scss | 5 +++++ .../consul-ui/app/components/state-chart/action/index.hbs | 5 +++++ .../consul-ui/app/components/state-chart/action/index.js | 5 +++++ .../consul-ui/app/components/state-chart/guard/index.hbs | 5 +++++ .../consul-ui/app/components/state-chart/guard/index.js | 5 +++++ ui/packages/consul-ui/app/components/state-chart/index.hbs | 5 +++++ ui/packages/consul-ui/app/components/state-chart/index.js | 5 +++++ .../consul-ui/app/components/state-machine/index.hbs | 5 +++++ ui/packages/consul-ui/app/components/state-machine/index.js | 5 +++++ ui/packages/consul-ui/app/components/state/index.hbs | 5 +++++ ui/packages/consul-ui/app/components/state/index.js | 5 +++++ ui/packages/consul-ui/app/components/tab-nav/index.hbs | 5 +++++ ui/packages/consul-ui/app/components/tab-nav/index.js | 5 +++++ ui/packages/consul-ui/app/components/tab-nav/index.scss | 5 +++++ ui/packages/consul-ui/app/components/tab-nav/layout.scss | 5 +++++ ui/packages/consul-ui/app/components/tab-nav/pageobject.js | 5 +++++ ui/packages/consul-ui/app/components/tab-nav/skin.scss | 5 +++++ ui/packages/consul-ui/app/components/table/index.scss | 5 +++++ ui/packages/consul-ui/app/components/table/layout.scss | 5 +++++ ui/packages/consul-ui/app/components/table/skin.scss | 5 +++++ .../consul-ui/app/components/tabular-collection/index.hbs | 5 +++++ .../consul-ui/app/components/tabular-collection/index.js | 5 +++++ .../consul-ui/app/components/tabular-collection/index.scss | 5 +++++ .../consul-ui/app/components/tabular-details/index.hbs | 5 +++++ .../consul-ui/app/components/tabular-details/index.js | 5 +++++ .../consul-ui/app/components/tabular-details/index.scss | 5 +++++ .../consul-ui/app/components/tabular-details/layout.scss | 5 +++++ .../consul-ui/app/components/tabular-details/skin.scss | 5 +++++ ui/packages/consul-ui/app/components/tabular-dl/index.scss | 5 +++++ ui/packages/consul-ui/app/components/tabular-dl/layout.scss | 5 +++++ ui/packages/consul-ui/app/components/tabular-dl/skin.scss | 5 +++++ ui/packages/consul-ui/app/components/tag-list/index.hbs | 5 +++++ ui/packages/consul-ui/app/components/tag-list/index.scss | 5 +++++ ui/packages/consul-ui/app/components/text-input/index.hbs | 5 +++++ ui/packages/consul-ui/app/components/tile/debug.scss | 5 +++++ ui/packages/consul-ui/app/components/tile/index.scss | 5 +++++ .../consul-ui/app/components/toggle-button/index.hbs | 5 +++++ ui/packages/consul-ui/app/components/toggle-button/index.js | 5 +++++ .../consul-ui/app/components/toggle-button/index.scss | 5 +++++ .../consul-ui/app/components/toggle-button/layout.scss | 5 +++++ .../consul-ui/app/components/toggle-button/skin.scss | 5 +++++ ui/packages/consul-ui/app/components/token-list/index.hbs | 5 +++++ ui/packages/consul-ui/app/components/token-list/index.js | 5 +++++ .../consul-ui/app/components/token-list/pageobject.js | 5 +++++ .../consul-ui/app/components/token-source/chart.xstate.js | 5 +++++ ui/packages/consul-ui/app/components/token-source/index.hbs | 5 +++++ ui/packages/consul-ui/app/components/token-source/index.js | 5 +++++ .../consul-ui/app/components/tooltip-panel/index.scss | 5 +++++ .../consul-ui/app/components/tooltip-panel/layout.scss | 5 +++++ .../consul-ui/app/components/tooltip-panel/skin.scss | 5 +++++ ui/packages/consul-ui/app/components/tooltip/index.hbs | 5 +++++ ui/packages/consul-ui/app/components/tooltip/index.scss | 5 +++++ .../app/components/topology-metrics/card/index.hbs | 5 +++++ .../consul-ui/app/components/topology-metrics/card/index.js | 5 +++++ .../app/components/topology-metrics/card/index.scss | 5 +++++ .../app/components/topology-metrics/down-lines/index.hbs | 5 +++++ .../app/components/topology-metrics/down-lines/index.js | 5 +++++ .../consul-ui/app/components/topology-metrics/index.hbs | 5 +++++ .../consul-ui/app/components/topology-metrics/index.js | 5 +++++ .../consul-ui/app/components/topology-metrics/index.scss | 5 +++++ .../consul-ui/app/components/topology-metrics/layout.scss | 5 +++++ .../app/components/topology-metrics/notifications/index.hbs | 5 +++++ .../app/components/topology-metrics/popover/index.hbs | 5 +++++ .../app/components/topology-metrics/popover/index.js | 5 +++++ .../app/components/topology-metrics/popover/index.scss | 5 +++++ .../app/components/topology-metrics/series/index.hbs | 5 +++++ .../app/components/topology-metrics/series/index.js | 5 +++++ .../app/components/topology-metrics/series/index.scss | 5 +++++ .../app/components/topology-metrics/series/layout.scss | 5 +++++ .../app/components/topology-metrics/series/skin.scss | 5 +++++ .../consul-ui/app/components/topology-metrics/skin.scss | 5 +++++ .../app/components/topology-metrics/source-type/index.hbs | 5 +++++ .../app/components/topology-metrics/source-type/index.scss | 5 +++++ .../app/components/topology-metrics/stats/index.hbs | 5 +++++ .../app/components/topology-metrics/stats/index.js | 5 +++++ .../app/components/topology-metrics/stats/index.scss | 5 +++++ .../app/components/topology-metrics/status/index.hbs | 5 +++++ .../app/components/topology-metrics/status/index.scss | 5 +++++ .../app/components/topology-metrics/up-lines/index.hbs | 5 +++++ .../app/components/topology-metrics/up-lines/index.js | 5 +++++ ui/packages/consul-ui/app/components/watcher/index.hbs | 5 +++++ ui/packages/consul-ui/app/components/watcher/index.js | 5 +++++ ui/packages/consul-ui/app/components/yield/index.hbs | 5 +++++ ui/packages/consul-ui/app/controllers/_peered-resource.js | 5 +++++ ui/packages/consul-ui/app/controllers/application.js | 5 +++++ .../consul-ui/app/controllers/dc/acls/policies/create.js | 5 +++++ .../consul-ui/app/controllers/dc/acls/policies/edit.js | 5 +++++ .../consul-ui/app/controllers/dc/acls/roles/create.js | 5 +++++ ui/packages/consul-ui/app/controllers/dc/acls/roles/edit.js | 5 +++++ .../consul-ui/app/controllers/dc/acls/tokens/create.js | 5 +++++ .../consul-ui/app/controllers/dc/acls/tokens/edit.js | 5 +++++ ui/packages/consul-ui/app/controllers/dc/nodes/index.js | 5 +++++ ui/packages/consul-ui/app/controllers/dc/services/index.js | 5 +++++ .../app/controllers/dc/services/instance/healthchecks.js | 5 +++++ ui/packages/consul-ui/app/decorators/data-source.js | 5 +++++ ui/packages/consul-ui/app/decorators/replace.js | 5 +++++ ui/packages/consul-ui/app/env.js | 5 +++++ ui/packages/consul-ui/app/filter/predicates/auth-method.js | 5 +++++ ui/packages/consul-ui/app/filter/predicates/health-check.js | 5 +++++ ui/packages/consul-ui/app/filter/predicates/intention.js | 5 +++++ ui/packages/consul-ui/app/filter/predicates/kv.js | 5 +++++ ui/packages/consul-ui/app/filter/predicates/node.js | 5 +++++ ui/packages/consul-ui/app/filter/predicates/peer.js | 5 +++++ ui/packages/consul-ui/app/filter/predicates/policy.js | 5 +++++ .../consul-ui/app/filter/predicates/service-instance.js | 5 +++++ ui/packages/consul-ui/app/filter/predicates/service.js | 5 +++++ ui/packages/consul-ui/app/filter/predicates/token.js | 5 +++++ ui/packages/consul-ui/app/formats.js | 5 +++++ ui/packages/consul-ui/app/forms/intention.js | 5 +++++ ui/packages/consul-ui/app/forms/kv.js | 5 +++++ ui/packages/consul-ui/app/forms/policy.js | 5 +++++ ui/packages/consul-ui/app/forms/role.js | 5 +++++ ui/packages/consul-ui/app/forms/token.js | 5 +++++ ui/packages/consul-ui/app/helpers/adopt-styles.js | 5 +++++ ui/packages/consul-ui/app/helpers/atob.js | 5 +++++ ui/packages/consul-ui/app/helpers/cached-model.js | 5 +++++ ui/packages/consul-ui/app/helpers/class-map.js | 5 +++++ ui/packages/consul-ui/app/helpers/collection.js | 5 +++++ ui/packages/consul-ui/app/helpers/css-map.js | 5 +++++ ui/packages/consul-ui/app/helpers/css.js | 5 +++++ ui/packages/consul-ui/app/helpers/document-attrs.js | 5 +++++ ui/packages/consul-ui/app/helpers/dom-position.js | 5 +++++ ui/packages/consul-ui/app/helpers/duration-from.js | 5 +++++ ui/packages/consul-ui/app/helpers/env.js | 5 +++++ ui/packages/consul-ui/app/helpers/flatten-property.js | 5 +++++ ui/packages/consul-ui/app/helpers/format-short-time.js | 5 +++++ ui/packages/consul-ui/app/helpers/href-to.js | 5 +++++ ui/packages/consul-ui/app/helpers/icon-mapping.js | 5 +++++ ui/packages/consul-ui/app/helpers/icons-debug.js | 5 +++++ ui/packages/consul-ui/app/helpers/is-href.js | 5 +++++ ui/packages/consul-ui/app/helpers/is.js | 5 +++++ ui/packages/consul-ui/app/helpers/json-stringify.js | 5 +++++ ui/packages/consul-ui/app/helpers/last.js | 5 +++++ ui/packages/consul-ui/app/helpers/left-trim.js | 5 +++++ ui/packages/consul-ui/app/helpers/merge-checks.js | 5 +++++ ui/packages/consul-ui/app/helpers/percentage-of.js | 5 +++++ ui/packages/consul-ui/app/helpers/policy/datacenters.js | 5 +++++ ui/packages/consul-ui/app/helpers/policy/group.js | 5 +++++ ui/packages/consul-ui/app/helpers/policy/typeof.js | 5 +++++ ui/packages/consul-ui/app/helpers/refresh-route.js | 5 +++++ ui/packages/consul-ui/app/helpers/render-template.js | 5 +++++ ui/packages/consul-ui/app/helpers/require.js | 5 +++++ ui/packages/consul-ui/app/helpers/right-trim.js | 5 +++++ ui/packages/consul-ui/app/helpers/route-match.js | 5 +++++ .../consul-ui/app/helpers/service/card-permissions.js | 5 +++++ .../consul-ui/app/helpers/service/external-source.js | 5 +++++ .../consul-ui/app/helpers/service/health-percentage.js | 5 +++++ ui/packages/consul-ui/app/helpers/slugify.js | 5 +++++ ui/packages/consul-ui/app/helpers/smart-date-format.js | 5 +++++ ui/packages/consul-ui/app/helpers/split.js | 5 +++++ ui/packages/consul-ui/app/helpers/state-chart.js | 5 +++++ ui/packages/consul-ui/app/helpers/state-matches.js | 5 +++++ ui/packages/consul-ui/app/helpers/style-map.js | 5 +++++ ui/packages/consul-ui/app/helpers/substr.js | 5 +++++ ui/packages/consul-ui/app/helpers/svg-curve.js | 5 +++++ ui/packages/consul-ui/app/helpers/temporal-format.js | 5 +++++ ui/packages/consul-ui/app/helpers/temporal-within.js | 5 +++++ ui/packages/consul-ui/app/helpers/test.js | 5 +++++ ui/packages/consul-ui/app/helpers/to-hash.js | 5 +++++ ui/packages/consul-ui/app/helpers/to-route.js | 5 +++++ ui/packages/consul-ui/app/helpers/token/is-anonymous.js | 5 +++++ ui/packages/consul-ui/app/helpers/token/is-legacy.js | 5 +++++ ui/packages/consul-ui/app/helpers/tween-to.js | 5 +++++ ui/packages/consul-ui/app/helpers/uniq-by.js | 5 +++++ ui/packages/consul-ui/app/helpers/unique-id.js | 5 +++++ ui/packages/consul-ui/app/helpers/uri.js | 5 +++++ ui/packages/consul-ui/app/index.html | 5 +++++ .../consul-ui/app/instance-initializers/container.js | 5 +++++ ui/packages/consul-ui/app/instance-initializers/href-to.js | 5 +++++ .../consul-ui/app/instance-initializers/ivy-codemirror.js | 5 +++++ .../consul-ui/app/instance-initializers/selection.js | 5 +++++ .../consul-ui/app/locations/fsm-with-optional-test.js | 5 +++++ ui/packages/consul-ui/app/locations/fsm-with-optional.js | 5 +++++ ui/packages/consul-ui/app/locations/fsm.js | 5 +++++ ui/packages/consul-ui/app/machines/boolean.xstate.js | 5 +++++ ui/packages/consul-ui/app/machines/validate.xstate.js | 5 +++++ ui/packages/consul-ui/app/mixins/policy/as-many.js | 5 +++++ ui/packages/consul-ui/app/mixins/role/as-many.js | 5 +++++ ui/packages/consul-ui/app/mixins/with-blocking-actions.js | 5 +++++ ui/packages/consul-ui/app/models/auth-method.js | 5 +++++ ui/packages/consul-ui/app/models/binding-rule.js | 5 +++++ ui/packages/consul-ui/app/models/coordinate.js | 5 +++++ ui/packages/consul-ui/app/models/dc.js | 5 +++++ ui/packages/consul-ui/app/models/discovery-chain.js | 5 +++++ ui/packages/consul-ui/app/models/gateway-config.js | 5 +++++ ui/packages/consul-ui/app/models/health-check.js | 5 +++++ .../app/models/intention-permission-http-header.js | 5 +++++ .../consul-ui/app/models/intention-permission-http.js | 5 +++++ ui/packages/consul-ui/app/models/intention-permission.js | 5 +++++ ui/packages/consul-ui/app/models/intention.js | 5 +++++ ui/packages/consul-ui/app/models/kv.js | 5 +++++ ui/packages/consul-ui/app/models/license.js | 5 +++++ ui/packages/consul-ui/app/models/node.js | 5 +++++ ui/packages/consul-ui/app/models/nspace.js | 5 +++++ ui/packages/consul-ui/app/models/oidc-provider.js | 5 +++++ ui/packages/consul-ui/app/models/partition.js | 5 +++++ ui/packages/consul-ui/app/models/peer.js | 5 +++++ ui/packages/consul-ui/app/models/permission.js | 5 +++++ ui/packages/consul-ui/app/models/policy.js | 5 +++++ ui/packages/consul-ui/app/models/proxy.js | 5 +++++ ui/packages/consul-ui/app/models/role.js | 5 +++++ ui/packages/consul-ui/app/models/service-instance.js | 5 +++++ ui/packages/consul-ui/app/models/service.js | 5 +++++ ui/packages/consul-ui/app/models/session.js | 5 +++++ ui/packages/consul-ui/app/models/token.js | 5 +++++ ui/packages/consul-ui/app/models/topology.js | 5 +++++ ui/packages/consul-ui/app/modifiers/aria-menu.js | 5 +++++ ui/packages/consul-ui/app/modifiers/css-prop.js | 5 +++++ ui/packages/consul-ui/app/modifiers/css-props.js | 5 +++++ ui/packages/consul-ui/app/modifiers/did-upsert.js | 5 +++++ ui/packages/consul-ui/app/modifiers/disabled.js | 5 +++++ ui/packages/consul-ui/app/modifiers/notification.js | 5 +++++ ui/packages/consul-ui/app/modifiers/on-outside.js | 5 +++++ ui/packages/consul-ui/app/modifiers/style.js | 5 +++++ ui/packages/consul-ui/app/modifiers/tooltip.js | 5 +++++ ui/packages/consul-ui/app/modifiers/validate.js | 5 +++++ ui/packages/consul-ui/app/modifiers/with-copyable.js | 5 +++++ ui/packages/consul-ui/app/modifiers/with-overlay.js | 5 +++++ ui/packages/consul-ui/app/router.js | 5 +++++ ui/packages/consul-ui/app/routes/application.js | 5 +++++ ui/packages/consul-ui/app/routes/dc.js | 5 +++++ .../consul-ui/app/routes/dc/acls/auth-methods/index.js | 5 +++++ .../consul-ui/app/routes/dc/acls/auth-methods/show/index.js | 5 +++++ ui/packages/consul-ui/app/routes/dc/acls/policies/create.js | 5 +++++ ui/packages/consul-ui/app/routes/dc/acls/policies/edit.js | 5 +++++ ui/packages/consul-ui/app/routes/dc/acls/policies/index.js | 5 +++++ ui/packages/consul-ui/app/routes/dc/acls/roles/create.js | 5 +++++ ui/packages/consul-ui/app/routes/dc/acls/roles/edit.js | 5 +++++ ui/packages/consul-ui/app/routes/dc/acls/roles/index.js | 5 +++++ ui/packages/consul-ui/app/routes/dc/acls/tokens/create.js | 5 +++++ ui/packages/consul-ui/app/routes/dc/acls/tokens/edit.js | 5 +++++ ui/packages/consul-ui/app/routes/dc/acls/tokens/index.js | 5 +++++ ui/packages/consul-ui/app/routes/dc/kv/folder.js | 5 +++++ ui/packages/consul-ui/app/routes/dc/kv/index.js | 5 +++++ ui/packages/consul-ui/app/routes/dc/services/notfound.js | 5 +++++ .../consul-ui/app/routes/dc/services/show/topology.js | 5 +++++ ui/packages/consul-ui/app/routing/application-debug.js | 5 +++++ ui/packages/consul-ui/app/routing/route.js | 5 +++++ ui/packages/consul-ui/app/routing/single.js | 5 +++++ ui/packages/consul-ui/app/search/predicates/acl.js | 5 +++++ ui/packages/consul-ui/app/search/predicates/auth-method.js | 5 +++++ ui/packages/consul-ui/app/search/predicates/health-check.js | 5 +++++ ui/packages/consul-ui/app/search/predicates/intention.js | 5 +++++ ui/packages/consul-ui/app/search/predicates/kv.js | 5 +++++ ui/packages/consul-ui/app/search/predicates/node.js | 5 +++++ ui/packages/consul-ui/app/search/predicates/nspace.js | 5 +++++ ui/packages/consul-ui/app/search/predicates/peer.js | 5 +++++ ui/packages/consul-ui/app/search/predicates/policy.js | 5 +++++ ui/packages/consul-ui/app/search/predicates/role.js | 5 +++++ .../consul-ui/app/search/predicates/service-instance.js | 5 +++++ ui/packages/consul-ui/app/search/predicates/service.js | 5 +++++ ui/packages/consul-ui/app/search/predicates/token.js | 5 +++++ .../consul-ui/app/search/predicates/upstream-instance.js | 5 +++++ ui/packages/consul-ui/app/serializers/application.js | 5 +++++ ui/packages/consul-ui/app/serializers/auth-method.js | 5 +++++ ui/packages/consul-ui/app/serializers/binding-rule.js | 5 +++++ ui/packages/consul-ui/app/serializers/coordinate.js | 5 +++++ ui/packages/consul-ui/app/serializers/discovery-chain.js | 5 +++++ ui/packages/consul-ui/app/serializers/http.js | 5 +++++ ui/packages/consul-ui/app/serializers/intention.js | 5 +++++ ui/packages/consul-ui/app/serializers/kv.js | 5 +++++ ui/packages/consul-ui/app/serializers/node.js | 5 +++++ ui/packages/consul-ui/app/serializers/nspace.js | 5 +++++ ui/packages/consul-ui/app/serializers/oidc-provider.js | 5 +++++ ui/packages/consul-ui/app/serializers/partition.js | 5 +++++ ui/packages/consul-ui/app/serializers/permission.js | 5 +++++ ui/packages/consul-ui/app/serializers/policy.js | 5 +++++ ui/packages/consul-ui/app/serializers/proxy.js | 5 +++++ ui/packages/consul-ui/app/serializers/role.js | 5 +++++ ui/packages/consul-ui/app/serializers/service-instance.js | 5 +++++ ui/packages/consul-ui/app/serializers/service.js | 5 +++++ ui/packages/consul-ui/app/serializers/session.js | 5 +++++ ui/packages/consul-ui/app/serializers/token.js | 5 +++++ ui/packages/consul-ui/app/serializers/topology.js | 5 +++++ ui/packages/consul-ui/app/services/abilities.js | 5 +++++ ui/packages/consul-ui/app/services/atob.js | 5 +++++ .../auth-providers/oauth2-code-with-url-provider.js | 5 +++++ ui/packages/consul-ui/app/services/btoa.js | 5 +++++ ui/packages/consul-ui/app/services/change.js | 5 +++++ ui/packages/consul-ui/app/services/client/connections.js | 5 +++++ ui/packages/consul-ui/app/services/client/http.js | 5 +++++ ui/packages/consul-ui/app/services/client/transports/xhr.js | 5 +++++ .../consul-ui/app/services/clipboard/local-storage.js | 5 +++++ ui/packages/consul-ui/app/services/clipboard/os.js | 5 +++++ ui/packages/consul-ui/app/services/code-mirror/linter.js | 5 +++++ ui/packages/consul-ui/app/services/container.js | 5 +++++ .../consul-ui/app/services/data-sink/protocols/http.js | 5 +++++ .../app/services/data-sink/protocols/local-storage.js | 5 +++++ ui/packages/consul-ui/app/services/data-sink/service.js | 5 +++++ .../consul-ui/app/services/data-source/protocols/http.js | 5 +++++ .../app/services/data-source/protocols/http/blocking.js | 5 +++++ .../app/services/data-source/protocols/http/promise.js | 5 +++++ .../app/services/data-source/protocols/local-storage.js | 5 +++++ ui/packages/consul-ui/app/services/data-source/service.js | 5 +++++ ui/packages/consul-ui/app/services/data-structs.js | 5 +++++ ui/packages/consul-ui/app/services/dom.js | 5 +++++ ui/packages/consul-ui/app/services/encoder.js | 5 +++++ ui/packages/consul-ui/app/services/env.js | 5 +++++ ui/packages/consul-ui/app/services/feedback.js | 5 +++++ ui/packages/consul-ui/app/services/filter.js | 5 +++++ ui/packages/consul-ui/app/services/form.js | 5 +++++ ui/packages/consul-ui/app/services/hcp.js | 5 +++++ ui/packages/consul-ui/app/services/i18n-debug.js | 5 +++++ ui/packages/consul-ui/app/services/local-storage.js | 5 +++++ ui/packages/consul-ui/app/services/logger.js | 5 +++++ ui/packages/consul-ui/app/services/repository.js | 5 +++++ .../consul-ui/app/services/repository/auth-method.js | 5 +++++ .../consul-ui/app/services/repository/binding-rule.js | 5 +++++ ui/packages/consul-ui/app/services/repository/coordinate.js | 5 +++++ ui/packages/consul-ui/app/services/repository/dc.js | 5 +++++ .../consul-ui/app/services/repository/discovery-chain.js | 5 +++++ .../services/repository/intention-permission-http-header.js | 5 +++++ .../app/services/repository/intention-permission.js | 5 +++++ ui/packages/consul-ui/app/services/repository/intention.js | 5 +++++ ui/packages/consul-ui/app/services/repository/kv.js | 5 +++++ ui/packages/consul-ui/app/services/repository/license.js | 5 +++++ ui/packages/consul-ui/app/services/repository/metrics.js | 5 +++++ ui/packages/consul-ui/app/services/repository/node.js | 5 +++++ ui/packages/consul-ui/app/services/repository/nspace.js | 5 +++++ .../consul-ui/app/services/repository/oidc-provider.js | 5 +++++ ui/packages/consul-ui/app/services/repository/partition.js | 5 +++++ ui/packages/consul-ui/app/services/repository/peer.js | 5 +++++ ui/packages/consul-ui/app/services/repository/permission.js | 5 +++++ ui/packages/consul-ui/app/services/repository/policy.js | 5 +++++ ui/packages/consul-ui/app/services/repository/proxy.js | 5 +++++ ui/packages/consul-ui/app/services/repository/role.js | 5 +++++ .../consul-ui/app/services/repository/service-instance.js | 5 +++++ ui/packages/consul-ui/app/services/repository/service.js | 5 +++++ ui/packages/consul-ui/app/services/repository/session.js | 5 +++++ ui/packages/consul-ui/app/services/repository/token.js | 5 +++++ ui/packages/consul-ui/app/services/repository/topology.js | 5 +++++ ui/packages/consul-ui/app/services/routlet.js | 5 +++++ ui/packages/consul-ui/app/services/schema.js | 5 +++++ ui/packages/consul-ui/app/services/search.js | 5 +++++ ui/packages/consul-ui/app/services/settings.js | 5 +++++ ui/packages/consul-ui/app/services/sort.js | 5 +++++ ui/packages/consul-ui/app/services/state-with-charts.js | 5 +++++ ui/packages/consul-ui/app/services/state.js | 5 +++++ ui/packages/consul-ui/app/services/store.js | 5 +++++ ui/packages/consul-ui/app/services/temporal.js | 5 +++++ ui/packages/consul-ui/app/services/ticker.js | 5 +++++ ui/packages/consul-ui/app/services/timeout.js | 5 +++++ ui/packages/consul-ui/app/services/ui-config.js | 5 +++++ ui/packages/consul-ui/app/sort/comparators/auth-method.js | 5 +++++ ui/packages/consul-ui/app/sort/comparators/health-check.js | 5 +++++ ui/packages/consul-ui/app/sort/comparators/intention.js | 5 +++++ ui/packages/consul-ui/app/sort/comparators/kv.js | 5 +++++ ui/packages/consul-ui/app/sort/comparators/node.js | 5 +++++ ui/packages/consul-ui/app/sort/comparators/nspace.js | 5 +++++ ui/packages/consul-ui/app/sort/comparators/partition.js | 5 +++++ ui/packages/consul-ui/app/sort/comparators/peer.js | 5 +++++ ui/packages/consul-ui/app/sort/comparators/policy.js | 5 +++++ ui/packages/consul-ui/app/sort/comparators/role.js | 5 +++++ .../consul-ui/app/sort/comparators/service-instance.js | 5 +++++ ui/packages/consul-ui/app/sort/comparators/service.js | 5 +++++ ui/packages/consul-ui/app/sort/comparators/token.js | 5 +++++ .../consul-ui/app/sort/comparators/upstream-instance.js | 5 +++++ ui/packages/consul-ui/app/storages/base.js | 5 +++++ ui/packages/consul-ui/app/storages/notices.js | 5 +++++ ui/packages/consul-ui/app/styles/app.scss | 5 +++++ ui/packages/consul-ui/app/styles/base/animation/index.scss | 5 +++++ ui/packages/consul-ui/app/styles/base/color/index.scss | 5 +++++ .../consul-ui/app/styles/base/color/semantic-variables.scss | 5 +++++ .../app/styles/base/color/ui/frame-placeholders.scss | 5 +++++ ui/packages/consul-ui/app/styles/base/color/ui/index.scss | 5 +++++ ui/packages/consul-ui/app/styles/base/component/index.scss | 5 +++++ .../app/styles/base/decoration/base-placeholders.scss | 5 +++++ .../app/styles/base/decoration/base-variables.scss | 5 +++++ ui/packages/consul-ui/app/styles/base/decoration/index.scss | 5 +++++ .../app/styles/base/decoration/visually-hidden.css.js | 5 +++++ .../consul-ui/app/styles/base/icons/base-keyframes.css.js | 5 +++++ .../consul-ui/app/styles/base/icons/base-keyframes.scss | 5 +++++ .../consul-ui/app/styles/base/icons/base-placeholders.scss | 5 +++++ ui/packages/consul-ui/app/styles/base/icons/debug.scss | 5 +++++ .../app/styles/base/icons/icons/activity/index.scss | 5 +++++ .../app/styles/base/icons/icons/activity/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/activity/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/activity/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/activity/property-24.scss | 5 +++++ .../styles/base/icons/icons/alert-circle-fill/index.scss | 5 +++++ .../base/icons/icons/alert-circle-fill/keyframes.scss | 5 +++++ .../base/icons/icons/alert-circle-fill/placeholders.scss | 5 +++++ .../base/icons/icons/alert-circle-fill/property-16.scss | 5 +++++ .../base/icons/icons/alert-circle-fill/property-24.scss | 5 +++++ .../styles/base/icons/icons/alert-circle-outline/index.scss | 5 +++++ .../base/icons/icons/alert-circle-outline/keyframes.scss | 5 +++++ .../base/icons/icons/alert-circle-outline/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/alert-circle/index.scss | 5 +++++ .../app/styles/base/icons/icons/alert-circle/keyframes.scss | 5 +++++ .../styles/base/icons/icons/alert-circle/placeholders.scss | 5 +++++ .../styles/base/icons/icons/alert-circle/property-16.scss | 5 +++++ .../styles/base/icons/icons/alert-circle/property-24.scss | 5 +++++ .../styles/base/icons/icons/alert-octagon-fill/index.scss | 5 +++++ .../base/icons/icons/alert-octagon-fill/keyframes.scss | 5 +++++ .../base/icons/icons/alert-octagon-fill/placeholders.scss | 5 +++++ .../base/icons/icons/alert-octagon-fill/property-16.scss | 5 +++++ .../base/icons/icons/alert-octagon-fill/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/alert-octagon/index.scss | 5 +++++ .../styles/base/icons/icons/alert-octagon/keyframes.scss | 5 +++++ .../styles/base/icons/icons/alert-octagon/placeholders.scss | 5 +++++ .../styles/base/icons/icons/alert-octagon/property-16.scss | 5 +++++ .../styles/base/icons/icons/alert-octagon/property-24.scss | 5 +++++ .../styles/base/icons/icons/alert-triangle-fill/index.scss | 5 +++++ .../base/icons/icons/alert-triangle-fill/keyframes.scss | 5 +++++ .../base/icons/icons/alert-triangle-fill/placeholders.scss | 5 +++++ .../base/icons/icons/alert-triangle-fill/property-16.scss | 5 +++++ .../base/icons/icons/alert-triangle-fill/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/alert-triangle/index.scss | 5 +++++ .../styles/base/icons/icons/alert-triangle/keyframes.scss | 5 +++++ .../base/icons/icons/alert-triangle/placeholders.scss | 5 +++++ .../styles/base/icons/icons/alert-triangle/property-16.scss | 5 +++++ .../styles/base/icons/icons/alert-triangle/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/alibaba-color/index.scss | 5 +++++ .../styles/base/icons/icons/alibaba-color/keyframes.scss | 5 +++++ .../styles/base/icons/icons/alibaba-color/placeholders.scss | 5 +++++ .../styles/base/icons/icons/alibaba-color/property-16.scss | 5 +++++ .../styles/base/icons/icons/alibaba-color/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/alibaba/index.scss | 5 +++++ .../app/styles/base/icons/icons/alibaba/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/alibaba/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/alibaba/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/alibaba/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/align-center/index.scss | 5 +++++ .../app/styles/base/icons/icons/align-center/keyframes.scss | 5 +++++ .../styles/base/icons/icons/align-center/placeholders.scss | 5 +++++ .../styles/base/icons/icons/align-center/property-16.scss | 5 +++++ .../styles/base/icons/icons/align-center/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/align-justify/index.scss | 5 +++++ .../styles/base/icons/icons/align-justify/keyframes.scss | 5 +++++ .../styles/base/icons/icons/align-justify/placeholders.scss | 5 +++++ .../styles/base/icons/icons/align-justify/property-16.scss | 5 +++++ .../styles/base/icons/icons/align-justify/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/align-left/index.scss | 5 +++++ .../app/styles/base/icons/icons/align-left/keyframes.scss | 5 +++++ .../styles/base/icons/icons/align-left/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/align-left/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/align-left/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/align-right/index.scss | 5 +++++ .../app/styles/base/icons/icons/align-right/keyframes.scss | 5 +++++ .../styles/base/icons/icons/align-right/placeholders.scss | 5 +++++ .../styles/base/icons/icons/align-right/property-16.scss | 5 +++++ .../styles/base/icons/icons/align-right/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/amazon-eks-color/index.scss | 5 +++++ .../styles/base/icons/icons/amazon-eks-color/keyframes.scss | 5 +++++ .../base/icons/icons/amazon-eks-color/placeholders.scss | 5 +++++ .../base/icons/icons/amazon-eks-color/property-16.scss | 5 +++++ .../base/icons/icons/amazon-eks-color/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/amazon-eks/index.scss | 5 +++++ .../app/styles/base/icons/icons/amazon-eks/keyframes.scss | 5 +++++ .../styles/base/icons/icons/amazon-eks/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/amazon-eks/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/amazon-eks/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/apple-color/index.scss | 5 +++++ .../app/styles/base/icons/icons/apple-color/keyframes.scss | 5 +++++ .../styles/base/icons/icons/apple-color/placeholders.scss | 5 +++++ .../styles/base/icons/icons/apple-color/property-16.scss | 5 +++++ .../styles/base/icons/icons/apple-color/property-24.scss | 5 +++++ .../consul-ui/app/styles/base/icons/icons/apple/index.scss | 5 +++++ .../app/styles/base/icons/icons/apple/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/apple/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/apple/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/apple/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/archive/index.scss | 5 +++++ .../app/styles/base/icons/icons/archive/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/archive/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/archive/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/archive/property-24.scss | 5 +++++ .../styles/base/icons/icons/arrow-down-circle/index.scss | 5 +++++ .../base/icons/icons/arrow-down-circle/keyframes.scss | 5 +++++ .../base/icons/icons/arrow-down-circle/placeholders.scss | 5 +++++ .../base/icons/icons/arrow-down-circle/property-16.scss | 5 +++++ .../base/icons/icons/arrow-down-circle/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/arrow-down-left/index.scss | 5 +++++ .../styles/base/icons/icons/arrow-down-left/keyframes.scss | 5 +++++ .../base/icons/icons/arrow-down-left/placeholders.scss | 5 +++++ .../base/icons/icons/arrow-down-left/property-16.scss | 5 +++++ .../base/icons/icons/arrow-down-left/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/arrow-down-right/index.scss | 5 +++++ .../styles/base/icons/icons/arrow-down-right/keyframes.scss | 5 +++++ .../base/icons/icons/arrow-down-right/placeholders.scss | 5 +++++ .../base/icons/icons/arrow-down-right/property-16.scss | 5 +++++ .../base/icons/icons/arrow-down-right/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/arrow-down/index.scss | 5 +++++ .../app/styles/base/icons/icons/arrow-down/keyframes.scss | 5 +++++ .../styles/base/icons/icons/arrow-down/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/arrow-down/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/arrow-down/property-24.scss | 5 +++++ .../styles/base/icons/icons/arrow-left-circle/index.scss | 5 +++++ .../base/icons/icons/arrow-left-circle/keyframes.scss | 5 +++++ .../base/icons/icons/arrow-left-circle/placeholders.scss | 5 +++++ .../base/icons/icons/arrow-left-circle/property-16.scss | 5 +++++ .../base/icons/icons/arrow-left-circle/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/arrow-left/index.scss | 5 +++++ .../app/styles/base/icons/icons/arrow-left/keyframes.scss | 5 +++++ .../styles/base/icons/icons/arrow-left/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/arrow-left/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/arrow-left/property-24.scss | 5 +++++ .../styles/base/icons/icons/arrow-right-circle/index.scss | 5 +++++ .../base/icons/icons/arrow-right-circle/keyframes.scss | 5 +++++ .../base/icons/icons/arrow-right-circle/placeholders.scss | 5 +++++ .../base/icons/icons/arrow-right-circle/property-16.scss | 5 +++++ .../base/icons/icons/arrow-right-circle/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/arrow-right/index.scss | 5 +++++ .../app/styles/base/icons/icons/arrow-right/keyframes.scss | 5 +++++ .../styles/base/icons/icons/arrow-right/placeholders.scss | 5 +++++ .../styles/base/icons/icons/arrow-right/property-16.scss | 5 +++++ .../styles/base/icons/icons/arrow-right/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/arrow-up-circle/index.scss | 5 +++++ .../styles/base/icons/icons/arrow-up-circle/keyframes.scss | 5 +++++ .../base/icons/icons/arrow-up-circle/placeholders.scss | 5 +++++ .../base/icons/icons/arrow-up-circle/property-16.scss | 5 +++++ .../base/icons/icons/arrow-up-circle/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/arrow-up-left/index.scss | 5 +++++ .../styles/base/icons/icons/arrow-up-left/keyframes.scss | 5 +++++ .../styles/base/icons/icons/arrow-up-left/placeholders.scss | 5 +++++ .../styles/base/icons/icons/arrow-up-left/property-16.scss | 5 +++++ .../styles/base/icons/icons/arrow-up-left/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/arrow-up-right/index.scss | 5 +++++ .../styles/base/icons/icons/arrow-up-right/keyframes.scss | 5 +++++ .../base/icons/icons/arrow-up-right/placeholders.scss | 5 +++++ .../styles/base/icons/icons/arrow-up-right/property-16.scss | 5 +++++ .../styles/base/icons/icons/arrow-up-right/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/arrow-up/index.scss | 5 +++++ .../app/styles/base/icons/icons/arrow-up/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/arrow-up/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/arrow-up/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/arrow-up/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/at-sign/index.scss | 5 +++++ .../app/styles/base/icons/icons/at-sign/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/at-sign/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/at-sign/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/at-sign/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/auth0-color/index.scss | 5 +++++ .../app/styles/base/icons/icons/auth0-color/keyframes.scss | 5 +++++ .../styles/base/icons/icons/auth0-color/placeholders.scss | 5 +++++ .../styles/base/icons/icons/auth0-color/property-16.scss | 5 +++++ .../styles/base/icons/icons/auth0-color/property-24.scss | 5 +++++ .../consul-ui/app/styles/base/icons/icons/auth0/index.scss | 5 +++++ .../app/styles/base/icons/icons/auth0/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/auth0/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/auth0/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/auth0/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/auto-apply/index.scss | 5 +++++ .../app/styles/base/icons/icons/auto-apply/keyframes.scss | 5 +++++ .../styles/base/icons/icons/auto-apply/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/auto-apply/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/auto-apply/property-24.scss | 5 +++++ .../consul-ui/app/styles/base/icons/icons/award/index.scss | 5 +++++ .../app/styles/base/icons/icons/award/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/award/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/award/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/award/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/azure-color/index.scss | 5 +++++ .../app/styles/base/icons/icons/azure-color/keyframes.scss | 5 +++++ .../styles/base/icons/icons/azure-color/placeholders.scss | 5 +++++ .../styles/base/icons/icons/azure-color/property-16.scss | 5 +++++ .../styles/base/icons/icons/azure-color/property-24.scss | 5 +++++ .../styles/base/icons/icons/azure-devops-color/index.scss | 5 +++++ .../base/icons/icons/azure-devops-color/keyframes.scss | 5 +++++ .../base/icons/icons/azure-devops-color/placeholders.scss | 5 +++++ .../base/icons/icons/azure-devops-color/property-16.scss | 5 +++++ .../base/icons/icons/azure-devops-color/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/azure-devops/index.scss | 5 +++++ .../app/styles/base/icons/icons/azure-devops/keyframes.scss | 5 +++++ .../styles/base/icons/icons/azure-devops/placeholders.scss | 5 +++++ .../styles/base/icons/icons/azure-devops/property-16.scss | 5 +++++ .../styles/base/icons/icons/azure-devops/property-24.scss | 5 +++++ .../consul-ui/app/styles/base/icons/icons/azure/index.scss | 5 +++++ .../app/styles/base/icons/icons/azure/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/azure/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/azure/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/azure/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/bank-vault/index.scss | 5 +++++ .../app/styles/base/icons/icons/bank-vault/keyframes.scss | 5 +++++ .../styles/base/icons/icons/bank-vault/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/bank-vault/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/bank-vault/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/bar-chart-alt/index.scss | 5 +++++ .../styles/base/icons/icons/bar-chart-alt/keyframes.scss | 5 +++++ .../styles/base/icons/icons/bar-chart-alt/placeholders.scss | 5 +++++ .../styles/base/icons/icons/bar-chart-alt/property-16.scss | 5 +++++ .../styles/base/icons/icons/bar-chart-alt/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/bar-chart/index.scss | 5 +++++ .../app/styles/base/icons/icons/bar-chart/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/bar-chart/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/bar-chart/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/bar-chart/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/battery-charging/index.scss | 5 +++++ .../styles/base/icons/icons/battery-charging/keyframes.scss | 5 +++++ .../base/icons/icons/battery-charging/placeholders.scss | 5 +++++ .../base/icons/icons/battery-charging/property-16.scss | 5 +++++ .../base/icons/icons/battery-charging/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/battery/index.scss | 5 +++++ .../app/styles/base/icons/icons/battery/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/battery/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/battery/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/battery/property-24.scss | 5 +++++ .../consul-ui/app/styles/base/icons/icons/beaker/index.scss | 5 +++++ .../app/styles/base/icons/icons/beaker/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/beaker/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/beaker/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/beaker/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/bell-active-fill/index.scss | 5 +++++ .../styles/base/icons/icons/bell-active-fill/keyframes.scss | 5 +++++ .../base/icons/icons/bell-active-fill/placeholders.scss | 5 +++++ .../base/icons/icons/bell-active-fill/property-16.scss | 5 +++++ .../base/icons/icons/bell-active-fill/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/bell-active/index.scss | 5 +++++ .../app/styles/base/icons/icons/bell-active/keyframes.scss | 5 +++++ .../styles/base/icons/icons/bell-active/placeholders.scss | 5 +++++ .../styles/base/icons/icons/bell-active/property-16.scss | 5 +++++ .../styles/base/icons/icons/bell-active/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/bell-off/index.scss | 5 +++++ .../app/styles/base/icons/icons/bell-off/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/bell-off/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/bell-off/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/bell-off/property-24.scss | 5 +++++ .../consul-ui/app/styles/base/icons/icons/bell/index.scss | 5 +++++ .../app/styles/base/icons/icons/bell/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/bell/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/bell/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/bell/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/bitbucket-color/index.scss | 5 +++++ .../styles/base/icons/icons/bitbucket-color/keyframes.scss | 5 +++++ .../base/icons/icons/bitbucket-color/placeholders.scss | 5 +++++ .../base/icons/icons/bitbucket-color/property-16.scss | 5 +++++ .../base/icons/icons/bitbucket-color/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/bitbucket/index.scss | 5 +++++ .../app/styles/base/icons/icons/bitbucket/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/bitbucket/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/bitbucket/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/bitbucket/property-24.scss | 5 +++++ .../consul-ui/app/styles/base/icons/icons/bolt/index.scss | 5 +++++ .../app/styles/base/icons/icons/bolt/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/bolt/placeholders.scss | 5 +++++ .../styles/base/icons/icons/bookmark-add-fill/index.scss | 5 +++++ .../base/icons/icons/bookmark-add-fill/keyframes.scss | 5 +++++ .../base/icons/icons/bookmark-add-fill/placeholders.scss | 5 +++++ .../base/icons/icons/bookmark-add-fill/property-16.scss | 5 +++++ .../base/icons/icons/bookmark-add-fill/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/bookmark-add/index.scss | 5 +++++ .../app/styles/base/icons/icons/bookmark-add/keyframes.scss | 5 +++++ .../styles/base/icons/icons/bookmark-add/placeholders.scss | 5 +++++ .../styles/base/icons/icons/bookmark-add/property-16.scss | 5 +++++ .../styles/base/icons/icons/bookmark-add/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/bookmark-fill/index.scss | 5 +++++ .../styles/base/icons/icons/bookmark-fill/keyframes.scss | 5 +++++ .../styles/base/icons/icons/bookmark-fill/placeholders.scss | 5 +++++ .../styles/base/icons/icons/bookmark-fill/property-16.scss | 5 +++++ .../styles/base/icons/icons/bookmark-fill/property-24.scss | 5 +++++ .../styles/base/icons/icons/bookmark-remove-fill/index.scss | 5 +++++ .../base/icons/icons/bookmark-remove-fill/keyframes.scss | 5 +++++ .../base/icons/icons/bookmark-remove-fill/placeholders.scss | 5 +++++ .../base/icons/icons/bookmark-remove-fill/property-16.scss | 5 +++++ .../base/icons/icons/bookmark-remove-fill/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/bookmark-remove/index.scss | 5 +++++ .../styles/base/icons/icons/bookmark-remove/keyframes.scss | 5 +++++ .../base/icons/icons/bookmark-remove/placeholders.scss | 5 +++++ .../base/icons/icons/bookmark-remove/property-16.scss | 5 +++++ .../base/icons/icons/bookmark-remove/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/bookmark/index.scss | 5 +++++ .../app/styles/base/icons/icons/bookmark/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/bookmark/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/bookmark/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/bookmark/property-24.scss | 5 +++++ .../consul-ui/app/styles/base/icons/icons/bottom/index.scss | 5 +++++ .../app/styles/base/icons/icons/bottom/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/bottom/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/bottom/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/bottom/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/boundary-color/index.scss | 5 +++++ .../styles/base/icons/icons/boundary-color/keyframes.scss | 5 +++++ .../base/icons/icons/boundary-color/placeholders.scss | 5 +++++ .../styles/base/icons/icons/boundary-color/property-16.scss | 5 +++++ .../styles/base/icons/icons/boundary-color/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/boundary/index.scss | 5 +++++ .../app/styles/base/icons/icons/boundary/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/boundary/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/boundary/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/boundary/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/box-check-fill/index.scss | 5 +++++ .../styles/base/icons/icons/box-check-fill/keyframes.scss | 5 +++++ .../base/icons/icons/box-check-fill/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/box-outline/index.scss | 5 +++++ .../app/styles/base/icons/icons/box-outline/keyframes.scss | 5 +++++ .../styles/base/icons/icons/box-outline/placeholders.scss | 5 +++++ .../consul-ui/app/styles/base/icons/icons/box/index.scss | 5 +++++ .../app/styles/base/icons/icons/box/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/box/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/box/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/box/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/briefcase/index.scss | 5 +++++ .../app/styles/base/icons/icons/briefcase/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/briefcase/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/briefcase/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/briefcase/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/broadcast/index.scss | 5 +++++ .../app/styles/base/icons/icons/broadcast/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/broadcast/placeholders.scss | 5 +++++ .../consul-ui/app/styles/base/icons/icons/bug/index.scss | 5 +++++ .../app/styles/base/icons/icons/bug/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/bug/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/bug/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/bug/property-24.scss | 5 +++++ .../consul-ui/app/styles/base/icons/icons/build/index.scss | 5 +++++ .../app/styles/base/icons/icons/build/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/build/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/build/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/build/property-24.scss | 5 +++++ .../consul-ui/app/styles/base/icons/icons/bulb/index.scss | 5 +++++ .../app/styles/base/icons/icons/bulb/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/bulb/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/bulb/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/bulb/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/calendar/index.scss | 5 +++++ .../app/styles/base/icons/icons/calendar/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/calendar/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/calendar/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/calendar/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/camera-off/index.scss | 5 +++++ .../app/styles/base/icons/icons/camera-off/keyframes.scss | 5 +++++ .../styles/base/icons/icons/camera-off/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/camera-off/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/camera-off/property-24.scss | 5 +++++ .../consul-ui/app/styles/base/icons/icons/camera/index.scss | 5 +++++ .../app/styles/base/icons/icons/camera/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/camera/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/camera/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/camera/property-24.scss | 5 +++++ .../styles/base/icons/icons/cancel-circle-fill/index.scss | 5 +++++ .../base/icons/icons/cancel-circle-fill/keyframes.scss | 5 +++++ .../base/icons/icons/cancel-circle-fill/placeholders.scss | 5 +++++ .../base/icons/icons/cancel-circle-outline/index.scss | 5 +++++ .../base/icons/icons/cancel-circle-outline/keyframes.scss | 5 +++++ .../icons/icons/cancel-circle-outline/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/cancel-plain/index.scss | 5 +++++ .../app/styles/base/icons/icons/cancel-plain/keyframes.scss | 5 +++++ .../styles/base/icons/icons/cancel-plain/placeholders.scss | 5 +++++ .../styles/base/icons/icons/cancel-square-fill/index.scss | 5 +++++ .../base/icons/icons/cancel-square-fill/keyframes.scss | 5 +++++ .../base/icons/icons/cancel-square-fill/placeholders.scss | 5 +++++ .../base/icons/icons/cancel-square-outline/index.scss | 5 +++++ .../base/icons/icons/cancel-square-outline/keyframes.scss | 5 +++++ .../icons/icons/cancel-square-outline/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/caret-down/index.scss | 5 +++++ .../app/styles/base/icons/icons/caret-down/keyframes.scss | 5 +++++ .../styles/base/icons/icons/caret-down/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/caret-up/index.scss | 5 +++++ .../app/styles/base/icons/icons/caret-up/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/caret-up/placeholders.scss | 5 +++++ .../consul-ui/app/styles/base/icons/icons/caret/index.scss | 5 +++++ .../app/styles/base/icons/icons/caret/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/caret/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/caret/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/caret/property-24.scss | 5 +++++ .../consul-ui/app/styles/base/icons/icons/cast/index.scss | 5 +++++ .../app/styles/base/icons/icons/cast/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/cast/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/cast/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/cast/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/certificate/index.scss | 5 +++++ .../app/styles/base/icons/icons/certificate/keyframes.scss | 5 +++++ .../styles/base/icons/icons/certificate/placeholders.scss | 5 +++++ .../styles/base/icons/icons/certificate/property-16.scss | 5 +++++ .../styles/base/icons/icons/certificate/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/change-circle/index.scss | 5 +++++ .../styles/base/icons/icons/change-circle/keyframes.scss | 5 +++++ .../styles/base/icons/icons/change-circle/placeholders.scss | 5 +++++ .../styles/base/icons/icons/change-circle/property-16.scss | 5 +++++ .../styles/base/icons/icons/change-circle/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/change-square/index.scss | 5 +++++ .../styles/base/icons/icons/change-square/keyframes.scss | 5 +++++ .../styles/base/icons/icons/change-square/placeholders.scss | 5 +++++ .../styles/base/icons/icons/change-square/property-16.scss | 5 +++++ .../styles/base/icons/icons/change-square/property-24.scss | 5 +++++ .../consul-ui/app/styles/base/icons/icons/change/index.scss | 5 +++++ .../app/styles/base/icons/icons/change/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/change/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/change/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/change/property-24.scss | 5 +++++ .../styles/base/icons/icons/check-circle-fill/index.scss | 5 +++++ .../base/icons/icons/check-circle-fill/keyframes.scss | 5 +++++ .../base/icons/icons/check-circle-fill/placeholders.scss | 5 +++++ .../base/icons/icons/check-circle-fill/property-16.scss | 5 +++++ .../base/icons/icons/check-circle-fill/property-24.scss | 5 +++++ .../styles/base/icons/icons/check-circle-outline/index.scss | 5 +++++ .../base/icons/icons/check-circle-outline/keyframes.scss | 5 +++++ .../base/icons/icons/check-circle-outline/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/check-circle/index.scss | 5 +++++ .../app/styles/base/icons/icons/check-circle/keyframes.scss | 5 +++++ .../styles/base/icons/icons/check-circle/placeholders.scss | 5 +++++ .../styles/base/icons/icons/check-circle/property-16.scss | 5 +++++ .../styles/base/icons/icons/check-circle/property-24.scss | 5 +++++ .../styles/base/icons/icons/check-diamond-fill/index.scss | 5 +++++ .../base/icons/icons/check-diamond-fill/keyframes.scss | 5 +++++ .../base/icons/icons/check-diamond-fill/placeholders.scss | 5 +++++ .../base/icons/icons/check-diamond-fill/property-16.scss | 5 +++++ .../base/icons/icons/check-diamond-fill/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/check-diamond/index.scss | 5 +++++ .../styles/base/icons/icons/check-diamond/keyframes.scss | 5 +++++ .../styles/base/icons/icons/check-diamond/placeholders.scss | 5 +++++ .../styles/base/icons/icons/check-diamond/property-16.scss | 5 +++++ .../styles/base/icons/icons/check-diamond/property-24.scss | 5 +++++ .../styles/base/icons/icons/check-hexagon-fill/index.scss | 5 +++++ .../base/icons/icons/check-hexagon-fill/keyframes.scss | 5 +++++ .../base/icons/icons/check-hexagon-fill/placeholders.scss | 5 +++++ .../base/icons/icons/check-hexagon-fill/property-16.scss | 5 +++++ .../base/icons/icons/check-hexagon-fill/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/check-hexagon/index.scss | 5 +++++ .../styles/base/icons/icons/check-hexagon/keyframes.scss | 5 +++++ .../styles/base/icons/icons/check-hexagon/placeholders.scss | 5 +++++ .../styles/base/icons/icons/check-hexagon/property-16.scss | 5 +++++ .../styles/base/icons/icons/check-hexagon/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/check-plain/index.scss | 5 +++++ .../app/styles/base/icons/icons/check-plain/keyframes.scss | 5 +++++ .../styles/base/icons/icons/check-plain/placeholders.scss | 5 +++++ .../styles/base/icons/icons/check-square-fill/index.scss | 5 +++++ .../base/icons/icons/check-square-fill/keyframes.scss | 5 +++++ .../base/icons/icons/check-square-fill/placeholders.scss | 5 +++++ .../base/icons/icons/check-square-fill/property-16.scss | 5 +++++ .../base/icons/icons/check-square-fill/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/check-square/index.scss | 5 +++++ .../app/styles/base/icons/icons/check-square/keyframes.scss | 5 +++++ .../styles/base/icons/icons/check-square/placeholders.scss | 5 +++++ .../styles/base/icons/icons/check-square/property-16.scss | 5 +++++ .../styles/base/icons/icons/check-square/property-24.scss | 5 +++++ .../consul-ui/app/styles/base/icons/icons/check/index.scss | 5 +++++ .../app/styles/base/icons/icons/check/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/check/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/check/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/check/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/chevron-down/index.scss | 5 +++++ .../app/styles/base/icons/icons/chevron-down/keyframes.scss | 5 +++++ .../styles/base/icons/icons/chevron-down/placeholders.scss | 5 +++++ .../styles/base/icons/icons/chevron-down/property-16.scss | 5 +++++ .../styles/base/icons/icons/chevron-down/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/chevron-left/index.scss | 5 +++++ .../app/styles/base/icons/icons/chevron-left/keyframes.scss | 5 +++++ .../styles/base/icons/icons/chevron-left/placeholders.scss | 5 +++++ .../styles/base/icons/icons/chevron-left/property-16.scss | 5 +++++ .../styles/base/icons/icons/chevron-left/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/chevron-right/index.scss | 5 +++++ .../styles/base/icons/icons/chevron-right/keyframes.scss | 5 +++++ .../styles/base/icons/icons/chevron-right/placeholders.scss | 5 +++++ .../styles/base/icons/icons/chevron-right/property-16.scss | 5 +++++ .../styles/base/icons/icons/chevron-right/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/chevron-up/index.scss | 5 +++++ .../app/styles/base/icons/icons/chevron-up/keyframes.scss | 5 +++++ .../styles/base/icons/icons/chevron-up/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/chevron-up/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/chevron-up/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/chevrons-down/index.scss | 5 +++++ .../styles/base/icons/icons/chevrons-down/keyframes.scss | 5 +++++ .../styles/base/icons/icons/chevrons-down/placeholders.scss | 5 +++++ .../styles/base/icons/icons/chevrons-down/property-16.scss | 5 +++++ .../styles/base/icons/icons/chevrons-down/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/chevrons-left/index.scss | 5 +++++ .../styles/base/icons/icons/chevrons-left/keyframes.scss | 5 +++++ .../styles/base/icons/icons/chevrons-left/placeholders.scss | 5 +++++ .../styles/base/icons/icons/chevrons-left/property-16.scss | 5 +++++ .../styles/base/icons/icons/chevrons-left/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/chevrons-right/index.scss | 5 +++++ .../styles/base/icons/icons/chevrons-right/keyframes.scss | 5 +++++ .../base/icons/icons/chevrons-right/placeholders.scss | 5 +++++ .../styles/base/icons/icons/chevrons-right/property-16.scss | 5 +++++ .../styles/base/icons/icons/chevrons-right/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/chevrons-up/index.scss | 5 +++++ .../app/styles/base/icons/icons/chevrons-up/keyframes.scss | 5 +++++ .../styles/base/icons/icons/chevrons-up/placeholders.scss | 5 +++++ .../styles/base/icons/icons/chevrons-up/property-16.scss | 5 +++++ .../styles/base/icons/icons/chevrons-up/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/circle-dot/index.scss | 5 +++++ .../app/styles/base/icons/icons/circle-dot/keyframes.scss | 5 +++++ .../styles/base/icons/icons/circle-dot/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/circle-dot/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/circle-dot/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/circle-fill/index.scss | 5 +++++ .../app/styles/base/icons/icons/circle-fill/keyframes.scss | 5 +++++ .../styles/base/icons/icons/circle-fill/placeholders.scss | 5 +++++ .../styles/base/icons/icons/circle-fill/property-16.scss | 5 +++++ .../styles/base/icons/icons/circle-fill/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/circle-half/index.scss | 5 +++++ .../app/styles/base/icons/icons/circle-half/keyframes.scss | 5 +++++ .../styles/base/icons/icons/circle-half/placeholders.scss | 5 +++++ .../styles/base/icons/icons/circle-half/property-16.scss | 5 +++++ .../styles/base/icons/icons/circle-half/property-24.scss | 5 +++++ .../consul-ui/app/styles/base/icons/icons/circle/index.scss | 5 +++++ .../app/styles/base/icons/icons/circle/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/circle/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/circle/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/circle/property-24.scss | 5 +++++ .../styles/base/icons/icons/clipboard-checked/index.scss | 5 +++++ .../base/icons/icons/clipboard-checked/keyframes.scss | 5 +++++ .../base/icons/icons/clipboard-checked/placeholders.scss | 5 +++++ .../base/icons/icons/clipboard-checked/property-16.scss | 5 +++++ .../base/icons/icons/clipboard-checked/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/clipboard-copy/index.scss | 5 +++++ .../styles/base/icons/icons/clipboard-copy/keyframes.scss | 5 +++++ .../base/icons/icons/clipboard-copy/placeholders.scss | 5 +++++ .../styles/base/icons/icons/clipboard-copy/property-16.scss | 5 +++++ .../styles/base/icons/icons/clipboard-copy/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/clipboard/index.scss | 5 +++++ .../app/styles/base/icons/icons/clipboard/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/clipboard/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/clipboard/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/clipboard/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/clock-fill/index.scss | 5 +++++ .../app/styles/base/icons/icons/clock-fill/keyframes.scss | 5 +++++ .../styles/base/icons/icons/clock-fill/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/clock-outline/index.scss | 5 +++++ .../styles/base/icons/icons/clock-outline/keyframes.scss | 5 +++++ .../styles/base/icons/icons/clock-outline/placeholders.scss | 5 +++++ .../consul-ui/app/styles/base/icons/icons/clock/index.scss | 5 +++++ .../app/styles/base/icons/icons/clock/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/clock/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/clock/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/clock/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/cloud-check/index.scss | 5 +++++ .../app/styles/base/icons/icons/cloud-check/keyframes.scss | 5 +++++ .../styles/base/icons/icons/cloud-check/placeholders.scss | 5 +++++ .../styles/base/icons/icons/cloud-check/property-16.scss | 5 +++++ .../styles/base/icons/icons/cloud-check/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/cloud-cross/index.scss | 5 +++++ .../app/styles/base/icons/icons/cloud-cross/keyframes.scss | 5 +++++ .../styles/base/icons/icons/cloud-cross/placeholders.scss | 5 +++++ .../styles/base/icons/icons/cloud-cross/property-16.scss | 5 +++++ .../styles/base/icons/icons/cloud-cross/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/cloud-download/index.scss | 5 +++++ .../styles/base/icons/icons/cloud-download/keyframes.scss | 5 +++++ .../base/icons/icons/cloud-download/placeholders.scss | 5 +++++ .../styles/base/icons/icons/cloud-download/property-16.scss | 5 +++++ .../styles/base/icons/icons/cloud-download/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/cloud-lightning/index.scss | 5 +++++ .../styles/base/icons/icons/cloud-lightning/keyframes.scss | 5 +++++ .../base/icons/icons/cloud-lightning/placeholders.scss | 5 +++++ .../base/icons/icons/cloud-lightning/property-16.scss | 5 +++++ .../base/icons/icons/cloud-lightning/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/cloud-lock/index.scss | 5 +++++ .../app/styles/base/icons/icons/cloud-lock/keyframes.scss | 5 +++++ .../styles/base/icons/icons/cloud-lock/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/cloud-lock/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/cloud-lock/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/cloud-off/index.scss | 5 +++++ .../app/styles/base/icons/icons/cloud-off/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/cloud-off/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/cloud-off/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/cloud-off/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/cloud-upload/index.scss | 5 +++++ .../app/styles/base/icons/icons/cloud-upload/keyframes.scss | 5 +++++ .../styles/base/icons/icons/cloud-upload/placeholders.scss | 5 +++++ .../styles/base/icons/icons/cloud-upload/property-16.scss | 5 +++++ .../styles/base/icons/icons/cloud-upload/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/cloud-x/index.scss | 5 +++++ .../app/styles/base/icons/icons/cloud-x/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/cloud-x/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/cloud-x/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/cloud-x/property-24.scss | 5 +++++ .../consul-ui/app/styles/base/icons/icons/cloud/index.scss | 5 +++++ .../app/styles/base/icons/icons/cloud/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/cloud/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/cloud/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/cloud/property-24.scss | 5 +++++ .../consul-ui/app/styles/base/icons/icons/code/index.scss | 5 +++++ .../app/styles/base/icons/icons/code/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/code/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/code/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/code/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/codepen-color/index.scss | 5 +++++ .../styles/base/icons/icons/codepen-color/keyframes.scss | 5 +++++ .../styles/base/icons/icons/codepen-color/placeholders.scss | 5 +++++ .../styles/base/icons/icons/codepen-color/property-16.scss | 5 +++++ .../styles/base/icons/icons/codepen-color/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/codepen/index.scss | 5 +++++ .../app/styles/base/icons/icons/codepen/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/codepen/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/codepen/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/codepen/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/collections/index.scss | 5 +++++ .../app/styles/base/icons/icons/collections/keyframes.scss | 5 +++++ .../styles/base/icons/icons/collections/placeholders.scss | 5 +++++ .../styles/base/icons/icons/collections/property-16.scss | 5 +++++ .../styles/base/icons/icons/collections/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/command/index.scss | 5 +++++ .../app/styles/base/icons/icons/command/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/command/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/command/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/command/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/compass/index.scss | 5 +++++ .../app/styles/base/icons/icons/compass/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/compass/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/compass/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/compass/property-24.scss | 5 +++++ .../styles/base/icons/icons/connection-gateway/index.scss | 5 +++++ .../base/icons/icons/connection-gateway/keyframes.scss | 5 +++++ .../base/icons/icons/connection-gateway/placeholders.scss | 5 +++++ .../base/icons/icons/connection-gateway/property-16.scss | 5 +++++ .../base/icons/icons/connection-gateway/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/connection/index.scss | 5 +++++ .../app/styles/base/icons/icons/connection/keyframes.scss | 5 +++++ .../styles/base/icons/icons/connection/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/connection/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/connection/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/console/index.scss | 5 +++++ .../app/styles/base/icons/icons/console/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/console/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/copy-action/index.scss | 5 +++++ .../app/styles/base/icons/icons/copy-action/keyframes.scss | 5 +++++ .../styles/base/icons/icons/copy-action/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/copy-success/index.scss | 5 +++++ .../app/styles/base/icons/icons/copy-success/keyframes.scss | 5 +++++ .../styles/base/icons/icons/copy-success/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/corner-down-left/index.scss | 5 +++++ .../styles/base/icons/icons/corner-down-left/keyframes.scss | 5 +++++ .../base/icons/icons/corner-down-left/placeholders.scss | 5 +++++ .../base/icons/icons/corner-down-left/property-16.scss | 5 +++++ .../base/icons/icons/corner-down-left/property-24.scss | 5 +++++ .../styles/base/icons/icons/corner-down-right/index.scss | 5 +++++ .../base/icons/icons/corner-down-right/keyframes.scss | 5 +++++ .../base/icons/icons/corner-down-right/placeholders.scss | 5 +++++ .../base/icons/icons/corner-down-right/property-16.scss | 5 +++++ .../base/icons/icons/corner-down-right/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/corner-left-down/index.scss | 5 +++++ .../styles/base/icons/icons/corner-left-down/keyframes.scss | 5 +++++ .../base/icons/icons/corner-left-down/placeholders.scss | 5 +++++ .../base/icons/icons/corner-left-down/property-16.scss | 5 +++++ .../base/icons/icons/corner-left-down/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/corner-left-up/index.scss | 5 +++++ .../styles/base/icons/icons/corner-left-up/keyframes.scss | 5 +++++ .../base/icons/icons/corner-left-up/placeholders.scss | 5 +++++ .../styles/base/icons/icons/corner-left-up/property-16.scss | 5 +++++ .../styles/base/icons/icons/corner-left-up/property-24.scss | 5 +++++ .../styles/base/icons/icons/corner-right-down/index.scss | 5 +++++ .../base/icons/icons/corner-right-down/keyframes.scss | 5 +++++ .../base/icons/icons/corner-right-down/placeholders.scss | 5 +++++ .../base/icons/icons/corner-right-down/property-16.scss | 5 +++++ .../base/icons/icons/corner-right-down/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/corner-right-up/index.scss | 5 +++++ .../styles/base/icons/icons/corner-right-up/keyframes.scss | 5 +++++ .../base/icons/icons/corner-right-up/placeholders.scss | 5 +++++ .../base/icons/icons/corner-right-up/property-16.scss | 5 +++++ .../base/icons/icons/corner-right-up/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/corner-up-left/index.scss | 5 +++++ .../styles/base/icons/icons/corner-up-left/keyframes.scss | 5 +++++ .../base/icons/icons/corner-up-left/placeholders.scss | 5 +++++ .../styles/base/icons/icons/corner-up-left/property-16.scss | 5 +++++ .../styles/base/icons/icons/corner-up-left/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/corner-up-right/index.scss | 5 +++++ .../styles/base/icons/icons/corner-up-right/keyframes.scss | 5 +++++ .../base/icons/icons/corner-up-right/placeholders.scss | 5 +++++ .../base/icons/icons/corner-up-right/property-16.scss | 5 +++++ .../base/icons/icons/corner-up-right/property-24.scss | 5 +++++ .../consul-ui/app/styles/base/icons/icons/cpu/index.scss | 5 +++++ .../app/styles/base/icons/icons/cpu/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/cpu/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/cpu/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/cpu/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/credit-card/index.scss | 5 +++++ .../app/styles/base/icons/icons/credit-card/keyframes.scss | 5 +++++ .../styles/base/icons/icons/credit-card/placeholders.scss | 5 +++++ .../styles/base/icons/icons/credit-card/property-16.scss | 5 +++++ .../styles/base/icons/icons/credit-card/property-24.scss | 5 +++++ .../consul-ui/app/styles/base/icons/icons/crop/index.scss | 5 +++++ .../app/styles/base/icons/icons/crop/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/crop/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/crop/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/crop/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/crosshair/index.scss | 5 +++++ .../app/styles/base/icons/icons/crosshair/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/crosshair/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/crosshair/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/crosshair/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/dashboard/index.scss | 5 +++++ .../app/styles/base/icons/icons/dashboard/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/dashboard/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/dashboard/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/dashboard/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/database/index.scss | 5 +++++ .../app/styles/base/icons/icons/database/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/database/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/database/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/database/property-24.scss | 5 +++++ .../consul-ui/app/styles/base/icons/icons/delay/index.scss | 5 +++++ .../app/styles/base/icons/icons/delay/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/delay/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/delay/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/delay/property-24.scss | 5 +++++ .../consul-ui/app/styles/base/icons/icons/delete/index.scss | 5 +++++ .../app/styles/base/icons/icons/delete/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/delete/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/delete/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/delete/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/deny-alt/index.scss | 5 +++++ .../app/styles/base/icons/icons/deny-alt/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/deny-alt/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/deny-color/index.scss | 5 +++++ .../app/styles/base/icons/icons/deny-color/keyframes.scss | 5 +++++ .../styles/base/icons/icons/deny-color/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/deny-color/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/deny-color/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/deny-default/index.scss | 5 +++++ .../app/styles/base/icons/icons/deny-default/keyframes.scss | 5 +++++ .../styles/base/icons/icons/deny-default/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/diamond-fill/index.scss | 5 +++++ .../app/styles/base/icons/icons/diamond-fill/keyframes.scss | 5 +++++ .../styles/base/icons/icons/diamond-fill/placeholders.scss | 5 +++++ .../styles/base/icons/icons/diamond-fill/property-16.scss | 5 +++++ .../styles/base/icons/icons/diamond-fill/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/diamond/index.scss | 5 +++++ .../app/styles/base/icons/icons/diamond/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/diamond/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/diamond/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/diamond/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/disabled/index.scss | 5 +++++ .../app/styles/base/icons/icons/disabled/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/disabled/placeholders.scss | 5 +++++ .../consul-ui/app/styles/base/icons/icons/disc/index.scss | 5 +++++ .../app/styles/base/icons/icons/disc/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/disc/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/disc/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/disc/property-24.scss | 5 +++++ .../styles/base/icons/icons/discussion-circle/index.scss | 5 +++++ .../base/icons/icons/discussion-circle/keyframes.scss | 5 +++++ .../base/icons/icons/discussion-circle/placeholders.scss | 5 +++++ .../base/icons/icons/discussion-circle/property-16.scss | 5 +++++ .../base/icons/icons/discussion-circle/property-24.scss | 5 +++++ .../styles/base/icons/icons/discussion-square/index.scss | 5 +++++ .../base/icons/icons/discussion-square/keyframes.scss | 5 +++++ .../base/icons/icons/discussion-square/placeholders.scss | 5 +++++ .../base/icons/icons/discussion-square/property-16.scss | 5 +++++ .../base/icons/icons/discussion-square/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/docker-color/index.scss | 5 +++++ .../app/styles/base/icons/icons/docker-color/keyframes.scss | 5 +++++ .../styles/base/icons/icons/docker-color/placeholders.scss | 5 +++++ .../styles/base/icons/icons/docker-color/property-16.scss | 5 +++++ .../styles/base/icons/icons/docker-color/property-24.scss | 5 +++++ .../consul-ui/app/styles/base/icons/icons/docker/index.scss | 5 +++++ .../app/styles/base/icons/icons/docker/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/docker/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/docker/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/docker/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/docs-download/index.scss | 5 +++++ .../styles/base/icons/icons/docs-download/keyframes.scss | 5 +++++ .../styles/base/icons/icons/docs-download/placeholders.scss | 5 +++++ .../styles/base/icons/icons/docs-download/property-16.scss | 5 +++++ .../styles/base/icons/icons/docs-download/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/docs-link/index.scss | 5 +++++ .../app/styles/base/icons/icons/docs-link/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/docs-link/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/docs-link/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/docs-link/property-24.scss | 5 +++++ .../consul-ui/app/styles/base/icons/icons/docs/index.scss | 5 +++++ .../app/styles/base/icons/icons/docs/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/docs/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/docs/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/docs/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/dollar-sign/index.scss | 5 +++++ .../app/styles/base/icons/icons/dollar-sign/keyframes.scss | 5 +++++ .../styles/base/icons/icons/dollar-sign/placeholders.scss | 5 +++++ .../styles/base/icons/icons/dollar-sign/property-16.scss | 5 +++++ .../styles/base/icons/icons/dollar-sign/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/dot-half/index.scss | 5 +++++ .../app/styles/base/icons/icons/dot-half/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/dot-half/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/dot-half/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/dot-half/property-24.scss | 5 +++++ .../consul-ui/app/styles/base/icons/icons/dot/index.scss | 5 +++++ .../app/styles/base/icons/icons/dot/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/dot/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/dot/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/dot/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/download/index.scss | 5 +++++ .../app/styles/base/icons/icons/download/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/download/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/download/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/download/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/droplet/index.scss | 5 +++++ .../app/styles/base/icons/icons/droplet/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/droplet/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/droplet/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/droplet/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/duplicate/index.scss | 5 +++++ .../app/styles/base/icons/icons/duplicate/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/duplicate/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/duplicate/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/duplicate/property-24.scss | 5 +++++ .../consul-ui/app/styles/base/icons/icons/edit/index.scss | 5 +++++ .../app/styles/base/icons/icons/edit/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/edit/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/edit/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/edit/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/enterprise/index.scss | 5 +++++ .../app/styles/base/icons/icons/enterprise/keyframes.scss | 5 +++++ .../styles/base/icons/icons/enterprise/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/enterprise/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/enterprise/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/entry-point/index.scss | 5 +++++ .../app/styles/base/icons/icons/entry-point/keyframes.scss | 5 +++++ .../styles/base/icons/icons/entry-point/placeholders.scss | 5 +++++ .../styles/base/icons/icons/entry-point/property-16.scss | 5 +++++ .../styles/base/icons/icons/entry-point/property-24.scss | 5 +++++ .../styles/base/icons/icons/envelope-sealed-fill/index.scss | 5 +++++ .../base/icons/icons/envelope-sealed-fill/keyframes.scss | 5 +++++ .../base/icons/icons/envelope-sealed-fill/placeholders.scss | 5 +++++ .../base/icons/icons/envelope-sealed-outline/index.scss | 5 +++++ .../base/icons/icons/envelope-sealed-outline/keyframes.scss | 5 +++++ .../icons/icons/envelope-sealed-outline/placeholders.scss | 5 +++++ .../base/icons/icons/envelope-unsealed--outline/index.scss | 5 +++++ .../icons/icons/envelope-unsealed--outline/keyframes.scss | 5 +++++ .../icons/envelope-unsealed--outline/placeholders.scss | 5 +++++ .../base/icons/icons/envelope-unsealed-fill/index.scss | 5 +++++ .../base/icons/icons/envelope-unsealed-fill/keyframes.scss | 5 +++++ .../icons/icons/envelope-unsealed-fill/placeholders.scss | 5 +++++ .../consul-ui/app/styles/base/icons/icons/event/index.scss | 5 +++++ .../app/styles/base/icons/icons/event/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/event/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/event/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/event/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/exit-point/index.scss | 5 +++++ .../app/styles/base/icons/icons/exit-point/keyframes.scss | 5 +++++ .../styles/base/icons/icons/exit-point/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/exit-point/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/exit-point/property-24.scss | 5 +++++ .../consul-ui/app/styles/base/icons/icons/exit/index.scss | 5 +++++ .../app/styles/base/icons/icons/exit/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/exit/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/expand-less/index.scss | 5 +++++ .../app/styles/base/icons/icons/expand-less/keyframes.scss | 5 +++++ .../styles/base/icons/icons/expand-less/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/expand-more/index.scss | 5 +++++ .../app/styles/base/icons/icons/expand-more/keyframes.scss | 5 +++++ .../styles/base/icons/icons/expand-more/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/external-link/index.scss | 5 +++++ .../styles/base/icons/icons/external-link/keyframes.scss | 5 +++++ .../styles/base/icons/icons/external-link/placeholders.scss | 5 +++++ .../styles/base/icons/icons/external-link/property-16.scss | 5 +++++ .../styles/base/icons/icons/external-link/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/eye-off/index.scss | 5 +++++ .../app/styles/base/icons/icons/eye-off/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/eye-off/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/eye-off/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/eye-off/property-24.scss | 5 +++++ .../consul-ui/app/styles/base/icons/icons/eye/index.scss | 5 +++++ .../app/styles/base/icons/icons/eye/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/eye/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/eye/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/eye/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/f5-color/index.scss | 5 +++++ .../app/styles/base/icons/icons/f5-color/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/f5-color/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/f5-color/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/f5-color/property-24.scss | 5 +++++ .../consul-ui/app/styles/base/icons/icons/f5/index.scss | 5 +++++ .../consul-ui/app/styles/base/icons/icons/f5/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/f5/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/f5/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/f5/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/facebook-color/index.scss | 5 +++++ .../styles/base/icons/icons/facebook-color/keyframes.scss | 5 +++++ .../base/icons/icons/facebook-color/placeholders.scss | 5 +++++ .../styles/base/icons/icons/facebook-color/property-16.scss | 5 +++++ .../styles/base/icons/icons/facebook-color/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/facebook/index.scss | 5 +++++ .../app/styles/base/icons/icons/facebook/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/facebook/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/facebook/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/facebook/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/fast-forward/index.scss | 5 +++++ .../app/styles/base/icons/icons/fast-forward/keyframes.scss | 5 +++++ .../styles/base/icons/icons/fast-forward/placeholders.scss | 5 +++++ .../styles/base/icons/icons/fast-forward/property-16.scss | 5 +++++ .../styles/base/icons/icons/fast-forward/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/file-change/index.scss | 5 +++++ .../app/styles/base/icons/icons/file-change/keyframes.scss | 5 +++++ .../styles/base/icons/icons/file-change/placeholders.scss | 5 +++++ .../styles/base/icons/icons/file-change/property-16.scss | 5 +++++ .../styles/base/icons/icons/file-change/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/file-check/index.scss | 5 +++++ .../app/styles/base/icons/icons/file-check/keyframes.scss | 5 +++++ .../styles/base/icons/icons/file-check/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/file-check/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/file-check/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/file-diff/index.scss | 5 +++++ .../app/styles/base/icons/icons/file-diff/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/file-diff/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/file-diff/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/file-diff/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/file-fill/index.scss | 5 +++++ .../app/styles/base/icons/icons/file-fill/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/file-fill/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/file-minus/index.scss | 5 +++++ .../app/styles/base/icons/icons/file-minus/keyframes.scss | 5 +++++ .../styles/base/icons/icons/file-minus/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/file-minus/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/file-minus/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/file-outline/index.scss | 5 +++++ .../app/styles/base/icons/icons/file-outline/keyframes.scss | 5 +++++ .../styles/base/icons/icons/file-outline/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/file-plus/index.scss | 5 +++++ .../app/styles/base/icons/icons/file-plus/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/file-plus/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/file-plus/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/file-plus/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/file-source/index.scss | 5 +++++ .../app/styles/base/icons/icons/file-source/keyframes.scss | 5 +++++ .../styles/base/icons/icons/file-source/placeholders.scss | 5 +++++ .../styles/base/icons/icons/file-source/property-16.scss | 5 +++++ .../styles/base/icons/icons/file-source/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/file-text/index.scss | 5 +++++ .../app/styles/base/icons/icons/file-text/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/file-text/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/file-text/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/file-text/property-24.scss | 5 +++++ .../consul-ui/app/styles/base/icons/icons/file-x/index.scss | 5 +++++ .../app/styles/base/icons/icons/file-x/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/file-x/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/file-x/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/file-x/property-24.scss | 5 +++++ .../consul-ui/app/styles/base/icons/icons/file/index.scss | 5 +++++ .../app/styles/base/icons/icons/file/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/file/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/file/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/file/property-24.scss | 5 +++++ .../consul-ui/app/styles/base/icons/icons/files/index.scss | 5 +++++ .../app/styles/base/icons/icons/files/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/files/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/files/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/files/property-24.scss | 5 +++++ .../consul-ui/app/styles/base/icons/icons/film/index.scss | 5 +++++ .../app/styles/base/icons/icons/film/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/film/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/film/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/film/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/filter-circle/index.scss | 5 +++++ .../styles/base/icons/icons/filter-circle/keyframes.scss | 5 +++++ .../styles/base/icons/icons/filter-circle/placeholders.scss | 5 +++++ .../styles/base/icons/icons/filter-circle/property-16.scss | 5 +++++ .../styles/base/icons/icons/filter-circle/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/filter-fill/index.scss | 5 +++++ .../app/styles/base/icons/icons/filter-fill/keyframes.scss | 5 +++++ .../styles/base/icons/icons/filter-fill/placeholders.scss | 5 +++++ .../styles/base/icons/icons/filter-fill/property-16.scss | 5 +++++ .../styles/base/icons/icons/filter-fill/property-24.scss | 5 +++++ .../consul-ui/app/styles/base/icons/icons/filter/index.scss | 5 +++++ .../app/styles/base/icons/icons/filter/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/filter/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/filter/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/filter/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/fingerprint/index.scss | 5 +++++ .../app/styles/base/icons/icons/fingerprint/keyframes.scss | 5 +++++ .../styles/base/icons/icons/fingerprint/placeholders.scss | 5 +++++ .../styles/base/icons/icons/fingerprint/property-16.scss | 5 +++++ .../styles/base/icons/icons/fingerprint/property-24.scss | 5 +++++ .../consul-ui/app/styles/base/icons/icons/flag/index.scss | 5 +++++ .../app/styles/base/icons/icons/flag/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/flag/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/flag/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/flag/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/folder-fill/index.scss | 5 +++++ .../app/styles/base/icons/icons/folder-fill/keyframes.scss | 5 +++++ .../styles/base/icons/icons/folder-fill/placeholders.scss | 5 +++++ .../styles/base/icons/icons/folder-fill/property-16.scss | 5 +++++ .../styles/base/icons/icons/folder-fill/property-24.scss | 5 +++++ .../styles/base/icons/icons/folder-minus-fill/index.scss | 5 +++++ .../base/icons/icons/folder-minus-fill/keyframes.scss | 5 +++++ .../base/icons/icons/folder-minus-fill/placeholders.scss | 5 +++++ .../base/icons/icons/folder-minus-fill/property-16.scss | 5 +++++ .../base/icons/icons/folder-minus-fill/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/folder-minus/index.scss | 5 +++++ .../app/styles/base/icons/icons/folder-minus/keyframes.scss | 5 +++++ .../styles/base/icons/icons/folder-minus/placeholders.scss | 5 +++++ .../styles/base/icons/icons/folder-minus/property-16.scss | 5 +++++ .../styles/base/icons/icons/folder-minus/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/folder-outline/index.scss | 5 +++++ .../styles/base/icons/icons/folder-outline/keyframes.scss | 5 +++++ .../base/icons/icons/folder-outline/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/folder-plus-fill/index.scss | 5 +++++ .../styles/base/icons/icons/folder-plus-fill/keyframes.scss | 5 +++++ .../base/icons/icons/folder-plus-fill/placeholders.scss | 5 +++++ .../base/icons/icons/folder-plus-fill/property-16.scss | 5 +++++ .../base/icons/icons/folder-plus-fill/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/folder-plus/index.scss | 5 +++++ .../app/styles/base/icons/icons/folder-plus/keyframes.scss | 5 +++++ .../styles/base/icons/icons/folder-plus/placeholders.scss | 5 +++++ .../styles/base/icons/icons/folder-plus/property-16.scss | 5 +++++ .../styles/base/icons/icons/folder-plus/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/folder-star/index.scss | 5 +++++ .../app/styles/base/icons/icons/folder-star/keyframes.scss | 5 +++++ .../styles/base/icons/icons/folder-star/placeholders.scss | 5 +++++ .../styles/base/icons/icons/folder-star/property-16.scss | 5 +++++ .../styles/base/icons/icons/folder-star/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/folder-users/index.scss | 5 +++++ .../app/styles/base/icons/icons/folder-users/keyframes.scss | 5 +++++ .../styles/base/icons/icons/folder-users/placeholders.scss | 5 +++++ .../styles/base/icons/icons/folder-users/property-16.scss | 5 +++++ .../styles/base/icons/icons/folder-users/property-24.scss | 5 +++++ .../consul-ui/app/styles/base/icons/icons/folder/index.scss | 5 +++++ .../app/styles/base/icons/icons/folder/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/folder/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/folder/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/folder/property-24.scss | 5 +++++ .../consul-ui/app/styles/base/icons/icons/frown/index.scss | 5 +++++ .../app/styles/base/icons/icons/frown/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/frown/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/frown/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/frown/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/gateway/index.scss | 5 +++++ .../app/styles/base/icons/icons/gateway/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/gateway/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/gateway/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/gateway/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/gcp-color/index.scss | 5 +++++ .../app/styles/base/icons/icons/gcp-color/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/gcp-color/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/gcp-color/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/gcp-color/property-24.scss | 5 +++++ .../consul-ui/app/styles/base/icons/icons/gcp/index.scss | 5 +++++ .../app/styles/base/icons/icons/gcp/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/gcp/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/gcp/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/gcp/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/gift-fill/index.scss | 5 +++++ .../app/styles/base/icons/icons/gift-fill/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/gift-fill/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/gift-outline/index.scss | 5 +++++ .../app/styles/base/icons/icons/gift-outline/keyframes.scss | 5 +++++ .../styles/base/icons/icons/gift-outline/placeholders.scss | 5 +++++ .../consul-ui/app/styles/base/icons/icons/gift/index.scss | 5 +++++ .../app/styles/base/icons/icons/gift/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/gift/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/gift/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/gift/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/git-branch/index.scss | 5 +++++ .../app/styles/base/icons/icons/git-branch/keyframes.scss | 5 +++++ .../styles/base/icons/icons/git-branch/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/git-branch/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/git-branch/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/git-commit/index.scss | 5 +++++ .../app/styles/base/icons/icons/git-commit/keyframes.scss | 5 +++++ .../styles/base/icons/icons/git-commit/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/git-commit/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/git-commit/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/git-merge/index.scss | 5 +++++ .../app/styles/base/icons/icons/git-merge/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/git-merge/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/git-merge/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/git-merge/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/git-pull-request/index.scss | 5 +++++ .../styles/base/icons/icons/git-pull-request/keyframes.scss | 5 +++++ .../base/icons/icons/git-pull-request/placeholders.scss | 5 +++++ .../base/icons/icons/git-pull-request/property-16.scss | 5 +++++ .../base/icons/icons/git-pull-request/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/git-repo/index.scss | 5 +++++ .../app/styles/base/icons/icons/git-repo/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/git-repo/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/git-repo/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/git-repo/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/git-repository/index.scss | 5 +++++ .../styles/base/icons/icons/git-repository/keyframes.scss | 5 +++++ .../base/icons/icons/git-repository/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/github-color/index.scss | 5 +++++ .../app/styles/base/icons/icons/github-color/keyframes.scss | 5 +++++ .../styles/base/icons/icons/github-color/placeholders.scss | 5 +++++ .../styles/base/icons/icons/github-color/property-16.scss | 5 +++++ .../styles/base/icons/icons/github-color/property-24.scss | 5 +++++ .../consul-ui/app/styles/base/icons/icons/github/index.scss | 5 +++++ .../app/styles/base/icons/icons/github/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/github/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/github/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/github/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/gitlab-color/index.scss | 5 +++++ .../app/styles/base/icons/icons/gitlab-color/keyframes.scss | 5 +++++ .../styles/base/icons/icons/gitlab-color/placeholders.scss | 5 +++++ .../styles/base/icons/icons/gitlab-color/property-16.scss | 5 +++++ .../styles/base/icons/icons/gitlab-color/property-24.scss | 5 +++++ .../consul-ui/app/styles/base/icons/icons/gitlab/index.scss | 5 +++++ .../app/styles/base/icons/icons/gitlab/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/gitlab/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/gitlab/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/gitlab/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/globe-private/index.scss | 5 +++++ .../styles/base/icons/icons/globe-private/keyframes.scss | 5 +++++ .../styles/base/icons/icons/globe-private/placeholders.scss | 5 +++++ .../styles/base/icons/icons/globe-private/property-16.scss | 5 +++++ .../styles/base/icons/icons/globe-private/property-24.scss | 5 +++++ .../consul-ui/app/styles/base/icons/icons/globe/index.scss | 5 +++++ .../app/styles/base/icons/icons/globe/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/globe/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/globe/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/globe/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/google-color/index.scss | 5 +++++ .../app/styles/base/icons/icons/google-color/keyframes.scss | 5 +++++ .../styles/base/icons/icons/google-color/placeholders.scss | 5 +++++ .../styles/base/icons/icons/google-color/property-16.scss | 5 +++++ .../styles/base/icons/icons/google-color/property-24.scss | 5 +++++ .../consul-ui/app/styles/base/icons/icons/google/index.scss | 5 +++++ .../app/styles/base/icons/icons/google/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/google/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/google/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/google/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/grid-alt/index.scss | 5 +++++ .../app/styles/base/icons/icons/grid-alt/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/grid-alt/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/grid-alt/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/grid-alt/property-24.scss | 5 +++++ .../consul-ui/app/styles/base/icons/icons/grid/index.scss | 5 +++++ .../app/styles/base/icons/icons/grid/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/grid/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/grid/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/grid/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/guide-link/index.scss | 5 +++++ .../app/styles/base/icons/icons/guide-link/keyframes.scss | 5 +++++ .../styles/base/icons/icons/guide-link/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/guide-link/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/guide-link/property-24.scss | 5 +++++ .../consul-ui/app/styles/base/icons/icons/guide/index.scss | 5 +++++ .../app/styles/base/icons/icons/guide/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/guide/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/guide/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/guide/property-24.scss | 5 +++++ .../consul-ui/app/styles/base/icons/icons/hammer/index.scss | 5 +++++ .../app/styles/base/icons/icons/hammer/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/hammer/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/hammer/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/hammer/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/handshake/index.scss | 5 +++++ .../app/styles/base/icons/icons/handshake/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/handshake/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/handshake/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/handshake/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/hard-drive/index.scss | 5 +++++ .../app/styles/base/icons/icons/hard-drive/keyframes.scss | 5 +++++ .../styles/base/icons/icons/hard-drive/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/hard-drive/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/hard-drive/property-24.scss | 5 +++++ .../consul-ui/app/styles/base/icons/icons/hash/index.scss | 5 +++++ .../app/styles/base/icons/icons/hash/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/hash/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/hash/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/hash/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/hashicorp-color/index.scss | 5 +++++ .../styles/base/icons/icons/hashicorp-color/keyframes.scss | 5 +++++ .../base/icons/icons/hashicorp-color/placeholders.scss | 5 +++++ .../base/icons/icons/hashicorp-color/property-16.scss | 5 +++++ .../base/icons/icons/hashicorp-color/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/hashicorp/index.scss | 5 +++++ .../app/styles/base/icons/icons/hashicorp/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/hashicorp/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/hashicorp/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/hashicorp/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/hcp-color/index.scss | 5 +++++ .../app/styles/base/icons/icons/hcp-color/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/hcp-color/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/hcp-color/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/hcp-color/property-24.scss | 5 +++++ .../consul-ui/app/styles/base/icons/icons/hcp/index.scss | 5 +++++ .../app/styles/base/icons/icons/hcp/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/hcp/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/hcp/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/hcp/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/headphones/index.scss | 5 +++++ .../app/styles/base/icons/icons/headphones/keyframes.scss | 5 +++++ .../styles/base/icons/icons/headphones/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/headphones/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/headphones/property-24.scss | 5 +++++ .../consul-ui/app/styles/base/icons/icons/health/index.scss | 5 +++++ .../app/styles/base/icons/icons/health/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/health/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/heart-fill/index.scss | 5 +++++ .../app/styles/base/icons/icons/heart-fill/keyframes.scss | 5 +++++ .../styles/base/icons/icons/heart-fill/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/heart-fill/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/heart-fill/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/heart-off/index.scss | 5 +++++ .../app/styles/base/icons/icons/heart-off/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/heart-off/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/heart-off/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/heart-off/property-24.scss | 5 +++++ .../consul-ui/app/styles/base/icons/icons/heart/index.scss | 5 +++++ .../app/styles/base/icons/icons/heart/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/heart/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/heart/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/heart/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/help-circle-fill/index.scss | 5 +++++ .../styles/base/icons/icons/help-circle-fill/keyframes.scss | 5 +++++ .../base/icons/icons/help-circle-fill/placeholders.scss | 5 +++++ .../styles/base/icons/icons/help-circle-outline/index.scss | 5 +++++ .../base/icons/icons/help-circle-outline/keyframes.scss | 5 +++++ .../base/icons/icons/help-circle-outline/placeholders.scss | 5 +++++ .../consul-ui/app/styles/base/icons/icons/help/index.scss | 5 +++++ .../app/styles/base/icons/icons/help/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/help/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/help/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/help/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/hexagon-fill/index.scss | 5 +++++ .../app/styles/base/icons/icons/hexagon-fill/keyframes.scss | 5 +++++ .../styles/base/icons/icons/hexagon-fill/placeholders.scss | 5 +++++ .../styles/base/icons/icons/hexagon-fill/property-16.scss | 5 +++++ .../styles/base/icons/icons/hexagon-fill/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/hexagon/index.scss | 5 +++++ .../app/styles/base/icons/icons/hexagon/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/hexagon/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/hexagon/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/hexagon/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/history/index.scss | 5 +++++ .../app/styles/base/icons/icons/history/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/history/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/history/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/history/property-24.scss | 5 +++++ .../consul-ui/app/styles/base/icons/icons/home/index.scss | 5 +++++ .../app/styles/base/icons/icons/home/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/home/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/home/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/home/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/hourglass/index.scss | 5 +++++ .../app/styles/base/icons/icons/hourglass/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/hourglass/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/hourglass/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/hourglass/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/identity-service/index.scss | 5 +++++ .../styles/base/icons/icons/identity-service/keyframes.scss | 5 +++++ .../base/icons/icons/identity-service/placeholders.scss | 5 +++++ .../base/icons/icons/identity-service/property-16.scss | 5 +++++ .../base/icons/icons/identity-service/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/identity-user/index.scss | 5 +++++ .../styles/base/icons/icons/identity-user/keyframes.scss | 5 +++++ .../styles/base/icons/icons/identity-user/placeholders.scss | 5 +++++ .../styles/base/icons/icons/identity-user/property-16.scss | 5 +++++ .../styles/base/icons/icons/identity-user/property-24.scss | 5 +++++ .../consul-ui/app/styles/base/icons/icons/image/index.scss | 5 +++++ .../app/styles/base/icons/icons/image/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/image/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/image/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/image/property-24.scss | 5 +++++ .../consul-ui/app/styles/base/icons/icons/inbox/index.scss | 5 +++++ .../app/styles/base/icons/icons/inbox/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/inbox/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/inbox/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/inbox/property-24.scss | 5 +++++ .../consul-ui/app/styles/base/icons/icons/index.scss | 5 +++++ .../app/styles/base/icons/icons/info-circle-fill/index.scss | 5 +++++ .../styles/base/icons/icons/info-circle-fill/keyframes.scss | 5 +++++ .../base/icons/icons/info-circle-fill/placeholders.scss | 5 +++++ .../styles/base/icons/icons/info-circle-outline/index.scss | 5 +++++ .../base/icons/icons/info-circle-outline/keyframes.scss | 5 +++++ .../base/icons/icons/info-circle-outline/placeholders.scss | 5 +++++ .../consul-ui/app/styles/base/icons/icons/info/index.scss | 5 +++++ .../app/styles/base/icons/icons/info/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/info/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/info/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/info/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/jump-link/index.scss | 5 +++++ .../app/styles/base/icons/icons/jump-link/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/jump-link/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/jump-link/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/jump-link/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/key-values/index.scss | 5 +++++ .../app/styles/base/icons/icons/key-values/keyframes.scss | 5 +++++ .../styles/base/icons/icons/key-values/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/key-values/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/key-values/property-24.scss | 5 +++++ .../consul-ui/app/styles/base/icons/icons/key/index.scss | 5 +++++ .../app/styles/base/icons/icons/key/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/key/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/key/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/key/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/keychain/index.scss | 5 +++++ .../app/styles/base/icons/icons/keychain/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/keychain/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/keychain/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/keychain/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/kubernetes-color/index.scss | 5 +++++ .../styles/base/icons/icons/kubernetes-color/keyframes.scss | 5 +++++ .../base/icons/icons/kubernetes-color/placeholders.scss | 5 +++++ .../base/icons/icons/kubernetes-color/property-16.scss | 5 +++++ .../base/icons/icons/kubernetes-color/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/kubernetes/index.scss | 5 +++++ .../app/styles/base/icons/icons/kubernetes/keyframes.scss | 5 +++++ .../styles/base/icons/icons/kubernetes/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/kubernetes/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/kubernetes/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/labyrinth/index.scss | 5 +++++ .../app/styles/base/icons/icons/labyrinth/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/labyrinth/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/labyrinth/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/labyrinth/property-24.scss | 5 +++++ .../consul-ui/app/styles/base/icons/icons/layers/index.scss | 5 +++++ .../app/styles/base/icons/icons/layers/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/layers/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/layers/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/layers/property-24.scss | 5 +++++ .../consul-ui/app/styles/base/icons/icons/layout/index.scss | 5 +++++ .../app/styles/base/icons/icons/layout/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/layout/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/layout/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/layout/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/learn-link/index.scss | 5 +++++ .../app/styles/base/icons/icons/learn-link/keyframes.scss | 5 +++++ .../styles/base/icons/icons/learn-link/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/learn-link/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/learn-link/property-24.scss | 5 +++++ .../consul-ui/app/styles/base/icons/icons/learn/index.scss | 5 +++++ .../app/styles/base/icons/icons/learn/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/learn/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/learn/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/learn/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/line-chart-up/index.scss | 5 +++++ .../styles/base/icons/icons/line-chart-up/keyframes.scss | 5 +++++ .../styles/base/icons/icons/line-chart-up/placeholders.scss | 5 +++++ .../styles/base/icons/icons/line-chart-up/property-16.scss | 5 +++++ .../styles/base/icons/icons/line-chart-up/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/line-chart/index.scss | 5 +++++ .../app/styles/base/icons/icons/line-chart/keyframes.scss | 5 +++++ .../styles/base/icons/icons/line-chart/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/line-chart/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/line-chart/property-24.scss | 5 +++++ .../consul-ui/app/styles/base/icons/icons/link/index.scss | 5 +++++ .../app/styles/base/icons/icons/link/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/link/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/link/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/link/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/linkedin-color/index.scss | 5 +++++ .../styles/base/icons/icons/linkedin-color/keyframes.scss | 5 +++++ .../base/icons/icons/linkedin-color/placeholders.scss | 5 +++++ .../styles/base/icons/icons/linkedin-color/property-16.scss | 5 +++++ .../styles/base/icons/icons/linkedin-color/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/linkedin/index.scss | 5 +++++ .../app/styles/base/icons/icons/linkedin/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/linkedin/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/linkedin/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/linkedin/property-24.scss | 5 +++++ .../consul-ui/app/styles/base/icons/icons/list/index.scss | 5 +++++ .../app/styles/base/icons/icons/list/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/list/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/list/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/list/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/load-balancer/index.scss | 5 +++++ .../styles/base/icons/icons/load-balancer/keyframes.scss | 5 +++++ .../styles/base/icons/icons/load-balancer/placeholders.scss | 5 +++++ .../styles/base/icons/icons/load-balancer/property-16.scss | 5 +++++ .../styles/base/icons/icons/load-balancer/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/loading-motion/index.scss | 5 +++++ .../styles/base/icons/icons/loading-motion/keyframes.scss | 5 +++++ .../base/icons/icons/loading-motion/placeholders.scss | 5 +++++ .../styles/base/icons/icons/loading-motion/property-16.scss | 5 +++++ .../styles/base/icons/icons/loading-motion/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/loading/index.scss | 5 +++++ .../app/styles/base/icons/icons/loading/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/loading/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/loading/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/loading/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/lock-closed-fill/index.scss | 5 +++++ .../styles/base/icons/icons/lock-closed-fill/keyframes.scss | 5 +++++ .../base/icons/icons/lock-closed-fill/placeholders.scss | 5 +++++ .../styles/base/icons/icons/lock-closed-outline/index.scss | 5 +++++ .../base/icons/icons/lock-closed-outline/keyframes.scss | 5 +++++ .../base/icons/icons/lock-closed-outline/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/lock-closed/index.scss | 5 +++++ .../app/styles/base/icons/icons/lock-closed/keyframes.scss | 5 +++++ .../styles/base/icons/icons/lock-closed/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/lock-disabled/index.scss | 5 +++++ .../styles/base/icons/icons/lock-disabled/keyframes.scss | 5 +++++ .../styles/base/icons/icons/lock-disabled/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/lock-fill/index.scss | 5 +++++ .../app/styles/base/icons/icons/lock-fill/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/lock-fill/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/lock-fill/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/lock-fill/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/lock-off/index.scss | 5 +++++ .../app/styles/base/icons/icons/lock-off/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/lock-off/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/lock-off/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/lock-off/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/lock-open/index.scss | 5 +++++ .../app/styles/base/icons/icons/lock-open/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/lock-open/placeholders.scss | 5 +++++ .../consul-ui/app/styles/base/icons/icons/lock/index.scss | 5 +++++ .../app/styles/base/icons/icons/lock/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/lock/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/lock/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/lock/property-24.scss | 5 +++++ .../styles/base/icons/icons/logo-alicloud-color/index.scss | 5 +++++ .../base/icons/icons/logo-alicloud-color/keyframes.scss | 5 +++++ .../base/icons/icons/logo-alicloud-color/placeholders.scss | 5 +++++ .../base/icons/icons/logo-alicloud-monochrome/index.scss | 5 +++++ .../icons/icons/logo-alicloud-monochrome/keyframes.scss | 5 +++++ .../icons/icons/logo-alicloud-monochrome/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/logo-auth0-color/index.scss | 5 +++++ .../styles/base/icons/icons/logo-auth0-color/keyframes.scss | 5 +++++ .../base/icons/icons/logo-auth0-color/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/logo-aws-color/index.scss | 5 +++++ .../styles/base/icons/icons/logo-aws-color/keyframes.scss | 5 +++++ .../base/icons/icons/logo-aws-color/placeholders.scss | 5 +++++ .../styles/base/icons/icons/logo-aws-monochrome/index.scss | 5 +++++ .../base/icons/icons/logo-aws-monochrome/keyframes.scss | 5 +++++ .../base/icons/icons/logo-aws-monochrome/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/logo-azure-color/index.scss | 5 +++++ .../styles/base/icons/icons/logo-azure-color/keyframes.scss | 5 +++++ .../base/icons/icons/logo-azure-color/placeholders.scss | 5 +++++ .../base/icons/icons/logo-azure-dev-ops-color/index.scss | 5 +++++ .../icons/icons/logo-azure-dev-ops-color/keyframes.scss | 5 +++++ .../icons/icons/logo-azure-dev-ops-color/placeholders.scss | 5 +++++ .../icons/icons/logo-azure-dev-ops-monochrome/index.scss | 5 +++++ .../icons/logo-azure-dev-ops-monochrome/keyframes.scss | 5 +++++ .../icons/logo-azure-dev-ops-monochrome/placeholders.scss | 5 +++++ .../base/icons/icons/logo-azure-monochrome/index.scss | 5 +++++ .../base/icons/icons/logo-azure-monochrome/keyframes.scss | 5 +++++ .../icons/icons/logo-azure-monochrome/placeholders.scss | 5 +++++ .../styles/base/icons/icons/logo-bitbucket-color/index.scss | 5 +++++ .../base/icons/icons/logo-bitbucket-color/keyframes.scss | 5 +++++ .../base/icons/icons/logo-bitbucket-color/placeholders.scss | 5 +++++ .../base/icons/icons/logo-bitbucket-monochrome/index.scss | 5 +++++ .../icons/icons/logo-bitbucket-monochrome/keyframes.scss | 5 +++++ .../icons/icons/logo-bitbucket-monochrome/placeholders.scss | 5 +++++ .../base/icons/icons/logo-ember-circle-color/index.scss | 5 +++++ .../base/icons/icons/logo-ember-circle-color/keyframes.scss | 5 +++++ .../icons/icons/logo-ember-circle-color/placeholders.scss | 5 +++++ .../icons/icons/logo-ember-circle-color/property-16.scss | 5 +++++ .../icons/icons/logo-ember-circle-color/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/logo-gcp-color/index.scss | 5 +++++ .../styles/base/icons/icons/logo-gcp-color/keyframes.scss | 5 +++++ .../base/icons/icons/logo-gcp-color/placeholders.scss | 5 +++++ .../styles/base/icons/icons/logo-gcp-monochrome/index.scss | 5 +++++ .../base/icons/icons/logo-gcp-monochrome/keyframes.scss | 5 +++++ .../base/icons/icons/logo-gcp-monochrome/placeholders.scss | 5 +++++ .../styles/base/icons/icons/logo-github-color/index.scss | 5 +++++ .../base/icons/icons/logo-github-color/keyframes.scss | 5 +++++ .../base/icons/icons/logo-github-color/placeholders.scss | 5 +++++ .../base/icons/icons/logo-github-monochrome/index.scss | 5 +++++ .../base/icons/icons/logo-github-monochrome/keyframes.scss | 5 +++++ .../icons/icons/logo-github-monochrome/placeholders.scss | 5 +++++ .../styles/base/icons/icons/logo-gitlab-color/index.scss | 5 +++++ .../base/icons/icons/logo-gitlab-color/keyframes.scss | 5 +++++ .../base/icons/icons/logo-gitlab-color/placeholders.scss | 5 +++++ .../base/icons/icons/logo-gitlab-monochrome/index.scss | 5 +++++ .../base/icons/icons/logo-gitlab-monochrome/keyframes.scss | 5 +++++ .../icons/icons/logo-gitlab-monochrome/placeholders.scss | 5 +++++ .../styles/base/icons/icons/logo-glimmer-color/index.scss | 5 +++++ .../base/icons/icons/logo-glimmer-color/keyframes.scss | 5 +++++ .../base/icons/icons/logo-glimmer-color/placeholders.scss | 5 +++++ .../base/icons/icons/logo-glimmer-color/property-16.scss | 5 +++++ .../base/icons/icons/logo-glimmer-color/property-24.scss | 5 +++++ .../styles/base/icons/icons/logo-google-color/index.scss | 5 +++++ .../base/icons/icons/logo-google-color/keyframes.scss | 5 +++++ .../base/icons/icons/logo-google-color/placeholders.scss | 5 +++++ .../base/icons/icons/logo-google-monochrome/index.scss | 5 +++++ .../base/icons/icons/logo-google-monochrome/keyframes.scss | 5 +++++ .../icons/icons/logo-google-monochrome/placeholders.scss | 5 +++++ .../styles/base/icons/icons/logo-hashicorp-color/index.scss | 5 +++++ .../base/icons/icons/logo-hashicorp-color/keyframes.scss | 5 +++++ .../base/icons/icons/logo-hashicorp-color/placeholders.scss | 5 +++++ .../base/icons/icons/logo-hashicorp-color/property-16.scss | 5 +++++ .../base/icons/icons/logo-hashicorp-color/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/logo-jwt-color/index.scss | 5 +++++ .../styles/base/icons/icons/logo-jwt-color/keyframes.scss | 5 +++++ .../base/icons/icons/logo-jwt-color/placeholders.scss | 5 +++++ .../styles/base/icons/icons/logo-jwt-color/property-16.scss | 5 +++++ .../styles/base/icons/icons/logo-jwt-color/property-24.scss | 5 +++++ .../base/icons/icons/logo-kubernetes-color/index.scss | 5 +++++ .../base/icons/icons/logo-kubernetes-color/keyframes.scss | 5 +++++ .../icons/icons/logo-kubernetes-color/placeholders.scss | 5 +++++ .../base/icons/icons/logo-kubernetes-monochrome/index.scss | 5 +++++ .../icons/icons/logo-kubernetes-monochrome/keyframes.scss | 5 +++++ .../icons/logo-kubernetes-monochrome/placeholders.scss | 5 +++++ .../styles/base/icons/icons/logo-microsoft-color/index.scss | 5 +++++ .../base/icons/icons/logo-microsoft-color/keyframes.scss | 5 +++++ .../base/icons/icons/logo-microsoft-color/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/logo-oidc-color/index.scss | 5 +++++ .../styles/base/icons/icons/logo-oidc-color/keyframes.scss | 5 +++++ .../base/icons/icons/logo-oidc-color/placeholders.scss | 5 +++++ .../base/icons/icons/logo-oidc-color/property-16.scss | 5 +++++ .../base/icons/icons/logo-oidc-color/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/logo-okta-color/index.scss | 5 +++++ .../styles/base/icons/icons/logo-okta-color/keyframes.scss | 5 +++++ .../base/icons/icons/logo-okta-color/placeholders.scss | 5 +++++ .../styles/base/icons/icons/logo-oracle-color/index.scss | 5 +++++ .../base/icons/icons/logo-oracle-color/keyframes.scss | 5 +++++ .../base/icons/icons/logo-oracle-color/placeholders.scss | 5 +++++ .../base/icons/icons/logo-oracle-monochrome/index.scss | 5 +++++ .../base/icons/icons/logo-oracle-monochrome/keyframes.scss | 5 +++++ .../icons/icons/logo-oracle-monochrome/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/logo-slack-color/index.scss | 5 +++++ .../styles/base/icons/icons/logo-slack-color/keyframes.scss | 5 +++++ .../base/icons/icons/logo-slack-color/placeholders.scss | 5 +++++ .../base/icons/icons/logo-slack-monochrome/index.scss | 5 +++++ .../base/icons/icons/logo-slack-monochrome/keyframes.scss | 5 +++++ .../icons/icons/logo-slack-monochrome/placeholders.scss | 5 +++++ .../styles/base/icons/icons/logo-vmware-color/index.scss | 5 +++++ .../base/icons/icons/logo-vmware-color/keyframes.scss | 5 +++++ .../base/icons/icons/logo-vmware-color/placeholders.scss | 5 +++++ .../base/icons/icons/logo-vmware-monochrome/index.scss | 5 +++++ .../base/icons/icons/logo-vmware-monochrome/keyframes.scss | 5 +++++ .../icons/icons/logo-vmware-monochrome/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/mail-open/index.scss | 5 +++++ .../app/styles/base/icons/icons/mail-open/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/mail-open/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/mail-open/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/mail-open/property-24.scss | 5 +++++ .../consul-ui/app/styles/base/icons/icons/mail/index.scss | 5 +++++ .../app/styles/base/icons/icons/mail/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/mail/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/mail/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/mail/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/mainframe/index.scss | 5 +++++ .../app/styles/base/icons/icons/mainframe/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/mainframe/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/mainframe/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/mainframe/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/map-pin/index.scss | 5 +++++ .../app/styles/base/icons/icons/map-pin/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/map-pin/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/map-pin/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/map-pin/property-24.scss | 5 +++++ .../consul-ui/app/styles/base/icons/icons/map/index.scss | 5 +++++ .../app/styles/base/icons/icons/map/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/map/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/map/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/map/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/maximize-alt/index.scss | 5 +++++ .../app/styles/base/icons/icons/maximize-alt/keyframes.scss | 5 +++++ .../styles/base/icons/icons/maximize-alt/placeholders.scss | 5 +++++ .../styles/base/icons/icons/maximize-alt/property-16.scss | 5 +++++ .../styles/base/icons/icons/maximize-alt/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/maximize/index.scss | 5 +++++ .../app/styles/base/icons/icons/maximize/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/maximize/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/maximize/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/maximize/property-24.scss | 5 +++++ .../consul-ui/app/styles/base/icons/icons/meh/index.scss | 5 +++++ .../app/styles/base/icons/icons/meh/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/meh/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/meh/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/meh/property-24.scss | 5 +++++ .../consul-ui/app/styles/base/icons/icons/menu/index.scss | 5 +++++ .../app/styles/base/icons/icons/menu/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/menu/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/menu/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/menu/property-24.scss | 5 +++++ .../consul-ui/app/styles/base/icons/icons/mesh/index.scss | 5 +++++ .../app/styles/base/icons/icons/mesh/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/mesh/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/mesh/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/mesh/property-24.scss | 5 +++++ .../styles/base/icons/icons/message-circle-fill/index.scss | 5 +++++ .../base/icons/icons/message-circle-fill/keyframes.scss | 5 +++++ .../base/icons/icons/message-circle-fill/placeholders.scss | 5 +++++ .../base/icons/icons/message-circle-fill/property-16.scss | 5 +++++ .../base/icons/icons/message-circle-fill/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/message-circle/index.scss | 5 +++++ .../styles/base/icons/icons/message-circle/keyframes.scss | 5 +++++ .../base/icons/icons/message-circle/placeholders.scss | 5 +++++ .../styles/base/icons/icons/message-circle/property-16.scss | 5 +++++ .../styles/base/icons/icons/message-circle/property-24.scss | 5 +++++ .../styles/base/icons/icons/message-square-fill/index.scss | 5 +++++ .../base/icons/icons/message-square-fill/keyframes.scss | 5 +++++ .../base/icons/icons/message-square-fill/placeholders.scss | 5 +++++ .../base/icons/icons/message-square-fill/property-16.scss | 5 +++++ .../base/icons/icons/message-square-fill/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/message-square/index.scss | 5 +++++ .../styles/base/icons/icons/message-square/keyframes.scss | 5 +++++ .../base/icons/icons/message-square/placeholders.scss | 5 +++++ .../styles/base/icons/icons/message-square/property-16.scss | 5 +++++ .../styles/base/icons/icons/message-square/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/message/index.scss | 5 +++++ .../app/styles/base/icons/icons/message/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/message/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/mic-off/index.scss | 5 +++++ .../app/styles/base/icons/icons/mic-off/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/mic-off/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/mic-off/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/mic-off/property-24.scss | 5 +++++ .../consul-ui/app/styles/base/icons/icons/mic/index.scss | 5 +++++ .../app/styles/base/icons/icons/mic/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/mic/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/mic/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/mic/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/microsoft-color/index.scss | 5 +++++ .../styles/base/icons/icons/microsoft-color/keyframes.scss | 5 +++++ .../base/icons/icons/microsoft-color/placeholders.scss | 5 +++++ .../base/icons/icons/microsoft-color/property-16.scss | 5 +++++ .../base/icons/icons/microsoft-color/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/microsoft/index.scss | 5 +++++ .../app/styles/base/icons/icons/microsoft/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/microsoft/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/microsoft/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/microsoft/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/migrate/index.scss | 5 +++++ .../app/styles/base/icons/icons/migrate/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/migrate/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/migrate/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/migrate/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/minimize-alt/index.scss | 5 +++++ .../app/styles/base/icons/icons/minimize-alt/keyframes.scss | 5 +++++ .../styles/base/icons/icons/minimize-alt/placeholders.scss | 5 +++++ .../styles/base/icons/icons/minimize-alt/property-16.scss | 5 +++++ .../styles/base/icons/icons/minimize-alt/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/minimize/index.scss | 5 +++++ .../app/styles/base/icons/icons/minimize/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/minimize/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/minimize/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/minimize/property-24.scss | 5 +++++ .../styles/base/icons/icons/minus-circle-fill/index.scss | 5 +++++ .../base/icons/icons/minus-circle-fill/keyframes.scss | 5 +++++ .../base/icons/icons/minus-circle-fill/placeholders.scss | 5 +++++ .../styles/base/icons/icons/minus-circle-outline/index.scss | 5 +++++ .../base/icons/icons/minus-circle-outline/keyframes.scss | 5 +++++ .../base/icons/icons/minus-circle-outline/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/minus-circle/index.scss | 5 +++++ .../app/styles/base/icons/icons/minus-circle/keyframes.scss | 5 +++++ .../styles/base/icons/icons/minus-circle/placeholders.scss | 5 +++++ .../styles/base/icons/icons/minus-circle/property-16.scss | 5 +++++ .../styles/base/icons/icons/minus-circle/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/minus-plain/index.scss | 5 +++++ .../app/styles/base/icons/icons/minus-plain/keyframes.scss | 5 +++++ .../styles/base/icons/icons/minus-plain/placeholders.scss | 5 +++++ .../styles/base/icons/icons/minus-plus-circle/index.scss | 5 +++++ .../base/icons/icons/minus-plus-circle/keyframes.scss | 5 +++++ .../base/icons/icons/minus-plus-circle/placeholders.scss | 5 +++++ .../base/icons/icons/minus-plus-circle/property-16.scss | 5 +++++ .../base/icons/icons/minus-plus-circle/property-24.scss | 5 +++++ .../styles/base/icons/icons/minus-plus-square/index.scss | 5 +++++ .../base/icons/icons/minus-plus-square/keyframes.scss | 5 +++++ .../base/icons/icons/minus-plus-square/placeholders.scss | 5 +++++ .../base/icons/icons/minus-plus-square/property-16.scss | 5 +++++ .../base/icons/icons/minus-plus-square/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/minus-plus/index.scss | 5 +++++ .../app/styles/base/icons/icons/minus-plus/keyframes.scss | 5 +++++ .../styles/base/icons/icons/minus-plus/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/minus-plus/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/minus-plus/property-24.scss | 5 +++++ .../styles/base/icons/icons/minus-square-fill/index.scss | 5 +++++ .../base/icons/icons/minus-square-fill/keyframes.scss | 5 +++++ .../base/icons/icons/minus-square-fill/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/minus-square/index.scss | 5 +++++ .../app/styles/base/icons/icons/minus-square/keyframes.scss | 5 +++++ .../styles/base/icons/icons/minus-square/placeholders.scss | 5 +++++ .../styles/base/icons/icons/minus-square/property-16.scss | 5 +++++ .../styles/base/icons/icons/minus-square/property-24.scss | 5 +++++ .../consul-ui/app/styles/base/icons/icons/minus/index.scss | 5 +++++ .../app/styles/base/icons/icons/minus/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/minus/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/minus/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/minus/property-24.scss | 5 +++++ .../consul-ui/app/styles/base/icons/icons/module/index.scss | 5 +++++ .../app/styles/base/icons/icons/module/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/module/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/module/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/module/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/monitor/index.scss | 5 +++++ .../app/styles/base/icons/icons/monitor/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/monitor/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/monitor/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/monitor/property-24.scss | 5 +++++ .../consul-ui/app/styles/base/icons/icons/moon/index.scss | 5 +++++ .../app/styles/base/icons/icons/moon/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/moon/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/moon/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/moon/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/more-horizontal/index.scss | 5 +++++ .../styles/base/icons/icons/more-horizontal/keyframes.scss | 5 +++++ .../base/icons/icons/more-horizontal/placeholders.scss | 5 +++++ .../base/icons/icons/more-horizontal/property-16.scss | 5 +++++ .../base/icons/icons/more-horizontal/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/more-vertical/index.scss | 5 +++++ .../styles/base/icons/icons/more-vertical/keyframes.scss | 5 +++++ .../styles/base/icons/icons/more-vertical/placeholders.scss | 5 +++++ .../styles/base/icons/icons/more-vertical/property-16.scss | 5 +++++ .../styles/base/icons/icons/more-vertical/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/mouse-pointer/index.scss | 5 +++++ .../styles/base/icons/icons/mouse-pointer/keyframes.scss | 5 +++++ .../styles/base/icons/icons/mouse-pointer/placeholders.scss | 5 +++++ .../styles/base/icons/icons/mouse-pointer/property-16.scss | 5 +++++ .../styles/base/icons/icons/mouse-pointer/property-24.scss | 5 +++++ .../consul-ui/app/styles/base/icons/icons/move/index.scss | 5 +++++ .../app/styles/base/icons/icons/move/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/move/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/move/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/move/property-24.scss | 5 +++++ .../consul-ui/app/styles/base/icons/icons/music/index.scss | 5 +++++ .../app/styles/base/icons/icons/music/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/music/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/music/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/music/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/navigation-alt/index.scss | 5 +++++ .../styles/base/icons/icons/navigation-alt/keyframes.scss | 5 +++++ .../base/icons/icons/navigation-alt/placeholders.scss | 5 +++++ .../styles/base/icons/icons/navigation-alt/property-16.scss | 5 +++++ .../styles/base/icons/icons/navigation-alt/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/navigation/index.scss | 5 +++++ .../app/styles/base/icons/icons/navigation/keyframes.scss | 5 +++++ .../styles/base/icons/icons/navigation/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/navigation/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/navigation/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/network-alt/index.scss | 5 +++++ .../app/styles/base/icons/icons/network-alt/keyframes.scss | 5 +++++ .../styles/base/icons/icons/network-alt/placeholders.scss | 5 +++++ .../styles/base/icons/icons/network-alt/property-16.scss | 5 +++++ .../styles/base/icons/icons/network-alt/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/network/index.scss | 5 +++++ .../app/styles/base/icons/icons/network/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/network/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/network/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/network/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/newspaper/index.scss | 5 +++++ .../app/styles/base/icons/icons/newspaper/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/newspaper/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/newspaper/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/newspaper/property-24.scss | 5 +++++ .../consul-ui/app/styles/base/icons/icons/node/index.scss | 5 +++++ .../app/styles/base/icons/icons/node/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/node/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/node/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/node/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/nomad-color/index.scss | 5 +++++ .../app/styles/base/icons/icons/nomad-color/keyframes.scss | 5 +++++ .../styles/base/icons/icons/nomad-color/placeholders.scss | 5 +++++ .../styles/base/icons/icons/nomad-color/property-16.scss | 5 +++++ .../styles/base/icons/icons/nomad-color/property-24.scss | 5 +++++ .../consul-ui/app/styles/base/icons/icons/nomad/index.scss | 5 +++++ .../app/styles/base/icons/icons/nomad/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/nomad/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/nomad/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/nomad/property-24.scss | 5 +++++ .../base/icons/icons/notification-disabled/index.scss | 5 +++++ .../base/icons/icons/notification-disabled/keyframes.scss | 5 +++++ .../icons/icons/notification-disabled/placeholders.scss | 5 +++++ .../styles/base/icons/icons/notification-fill/index.scss | 5 +++++ .../base/icons/icons/notification-fill/keyframes.scss | 5 +++++ .../base/icons/icons/notification-fill/placeholders.scss | 5 +++++ .../styles/base/icons/icons/notification-outline/index.scss | 5 +++++ .../base/icons/icons/notification-outline/keyframes.scss | 5 +++++ .../base/icons/icons/notification-outline/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/octagon/index.scss | 5 +++++ .../app/styles/base/icons/icons/octagon/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/octagon/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/octagon/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/octagon/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/okta-color/index.scss | 5 +++++ .../app/styles/base/icons/icons/okta-color/keyframes.scss | 5 +++++ .../styles/base/icons/icons/okta-color/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/okta-color/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/okta-color/property-24.scss | 5 +++++ .../consul-ui/app/styles/base/icons/icons/okta/index.scss | 5 +++++ .../app/styles/base/icons/icons/okta/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/okta/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/okta/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/okta/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/oracle-color/index.scss | 5 +++++ .../app/styles/base/icons/icons/oracle-color/keyframes.scss | 5 +++++ .../styles/base/icons/icons/oracle-color/placeholders.scss | 5 +++++ .../styles/base/icons/icons/oracle-color/property-16.scss | 5 +++++ .../styles/base/icons/icons/oracle-color/property-24.scss | 5 +++++ .../consul-ui/app/styles/base/icons/icons/oracle/index.scss | 5 +++++ .../app/styles/base/icons/icons/oracle/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/oracle/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/oracle/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/oracle/property-24.scss | 5 +++++ .../consul-ui/app/styles/base/icons/icons/org/index.scss | 5 +++++ .../app/styles/base/icons/icons/org/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/org/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/org/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/org/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/outline/index.scss | 5 +++++ .../app/styles/base/icons/icons/outline/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/outline/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/outline/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/outline/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/pack-color/index.scss | 5 +++++ .../app/styles/base/icons/icons/pack-color/keyframes.scss | 5 +++++ .../styles/base/icons/icons/pack-color/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/pack-color/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/pack-color/property-24.scss | 5 +++++ .../consul-ui/app/styles/base/icons/icons/pack/index.scss | 5 +++++ .../app/styles/base/icons/icons/pack/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/pack/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/pack/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/pack/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/package/index.scss | 5 +++++ .../app/styles/base/icons/icons/package/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/package/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/package/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/package/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/packer-color/index.scss | 5 +++++ .../app/styles/base/icons/icons/packer-color/keyframes.scss | 5 +++++ .../styles/base/icons/icons/packer-color/placeholders.scss | 5 +++++ .../styles/base/icons/icons/packer-color/property-16.scss | 5 +++++ .../styles/base/icons/icons/packer-color/property-24.scss | 5 +++++ .../consul-ui/app/styles/base/icons/icons/packer/index.scss | 5 +++++ .../app/styles/base/icons/icons/packer/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/packer/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/packer/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/packer/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/page-outline/index.scss | 5 +++++ .../app/styles/base/icons/icons/page-outline/keyframes.scss | 5 +++++ .../styles/base/icons/icons/page-outline/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/paperclip/index.scss | 5 +++++ .../app/styles/base/icons/icons/paperclip/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/paperclip/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/paperclip/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/paperclip/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/partner/index.scss | 5 +++++ .../app/styles/base/icons/icons/partner/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/partner/placeholders.scss | 5 +++++ .../consul-ui/app/styles/base/icons/icons/path/index.scss | 5 +++++ .../app/styles/base/icons/icons/path/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/path/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/path/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/path/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/pause-circle/index.scss | 5 +++++ .../app/styles/base/icons/icons/pause-circle/keyframes.scss | 5 +++++ .../styles/base/icons/icons/pause-circle/placeholders.scss | 5 +++++ .../styles/base/icons/icons/pause-circle/property-16.scss | 5 +++++ .../styles/base/icons/icons/pause-circle/property-24.scss | 5 +++++ .../consul-ui/app/styles/base/icons/icons/pause/index.scss | 5 +++++ .../app/styles/base/icons/icons/pause/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/pause/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/pause/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/pause/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/pen-tool/index.scss | 5 +++++ .../app/styles/base/icons/icons/pen-tool/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/pen-tool/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/pen-tool/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/pen-tool/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/pencil-tool/index.scss | 5 +++++ .../app/styles/base/icons/icons/pencil-tool/keyframes.scss | 5 +++++ .../styles/base/icons/icons/pencil-tool/placeholders.scss | 5 +++++ .../styles/base/icons/icons/pencil-tool/property-16.scss | 5 +++++ .../styles/base/icons/icons/pencil-tool/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/phone-call/index.scss | 5 +++++ .../app/styles/base/icons/icons/phone-call/keyframes.scss | 5 +++++ .../styles/base/icons/icons/phone-call/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/phone-call/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/phone-call/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/phone-off/index.scss | 5 +++++ .../app/styles/base/icons/icons/phone-off/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/phone-off/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/phone-off/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/phone-off/property-24.scss | 5 +++++ .../consul-ui/app/styles/base/icons/icons/phone/index.scss | 5 +++++ .../app/styles/base/icons/icons/phone/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/phone/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/phone/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/phone/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/pie-chart/index.scss | 5 +++++ .../app/styles/base/icons/icons/pie-chart/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/pie-chart/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/pie-chart/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/pie-chart/property-24.scss | 5 +++++ .../consul-ui/app/styles/base/icons/icons/pin/index.scss | 5 +++++ .../app/styles/base/icons/icons/pin/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/pin/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/pin/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/pin/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/play-circle/index.scss | 5 +++++ .../app/styles/base/icons/icons/play-circle/keyframes.scss | 5 +++++ .../styles/base/icons/icons/play-circle/placeholders.scss | 5 +++++ .../styles/base/icons/icons/play-circle/property-16.scss | 5 +++++ .../styles/base/icons/icons/play-circle/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/play-fill/index.scss | 5 +++++ .../app/styles/base/icons/icons/play-fill/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/play-fill/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/play-outline/index.scss | 5 +++++ .../app/styles/base/icons/icons/play-outline/keyframes.scss | 5 +++++ .../styles/base/icons/icons/play-outline/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/play-plain/index.scss | 5 +++++ .../app/styles/base/icons/icons/play-plain/keyframes.scss | 5 +++++ .../styles/base/icons/icons/play-plain/placeholders.scss | 5 +++++ .../consul-ui/app/styles/base/icons/icons/play/index.scss | 5 +++++ .../app/styles/base/icons/icons/play/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/play/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/play/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/play/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/plus-circle-fill/index.scss | 5 +++++ .../styles/base/icons/icons/plus-circle-fill/keyframes.scss | 5 +++++ .../base/icons/icons/plus-circle-fill/placeholders.scss | 5 +++++ .../styles/base/icons/icons/plus-circle-outline/index.scss | 5 +++++ .../base/icons/icons/plus-circle-outline/keyframes.scss | 5 +++++ .../base/icons/icons/plus-circle-outline/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/plus-circle/index.scss | 5 +++++ .../app/styles/base/icons/icons/plus-circle/keyframes.scss | 5 +++++ .../styles/base/icons/icons/plus-circle/placeholders.scss | 5 +++++ .../styles/base/icons/icons/plus-circle/property-16.scss | 5 +++++ .../styles/base/icons/icons/plus-circle/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/plus-plain/index.scss | 5 +++++ .../app/styles/base/icons/icons/plus-plain/keyframes.scss | 5 +++++ .../styles/base/icons/icons/plus-plain/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/plus-square-fill/index.scss | 5 +++++ .../styles/base/icons/icons/plus-square-fill/keyframes.scss | 5 +++++ .../base/icons/icons/plus-square-fill/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/plus-square/index.scss | 5 +++++ .../app/styles/base/icons/icons/plus-square/keyframes.scss | 5 +++++ .../styles/base/icons/icons/plus-square/placeholders.scss | 5 +++++ .../styles/base/icons/icons/plus-square/property-16.scss | 5 +++++ .../styles/base/icons/icons/plus-square/property-24.scss | 5 +++++ .../consul-ui/app/styles/base/icons/icons/plus/index.scss | 5 +++++ .../app/styles/base/icons/icons/plus/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/plus/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/plus/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/plus/property-24.scss | 5 +++++ .../consul-ui/app/styles/base/icons/icons/port/index.scss | 5 +++++ .../app/styles/base/icons/icons/port/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/port/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/port/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/port/property-24.scss | 5 +++++ .../consul-ui/app/styles/base/icons/icons/power/index.scss | 5 +++++ .../app/styles/base/icons/icons/power/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/power/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/power/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/power/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/printer/index.scss | 5 +++++ .../app/styles/base/icons/icons/printer/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/printer/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/printer/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/printer/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/protocol/index.scss | 5 +++++ .../app/styles/base/icons/icons/protocol/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/protocol/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/protocol/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/protocol/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/provider/index.scss | 5 +++++ .../app/styles/base/icons/icons/provider/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/provider/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/provider/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/provider/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/public-default/index.scss | 5 +++++ .../styles/base/icons/icons/public-default/keyframes.scss | 5 +++++ .../base/icons/icons/public-default/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/public-locked/index.scss | 5 +++++ .../styles/base/icons/icons/public-locked/keyframes.scss | 5 +++++ .../styles/base/icons/icons/public-locked/placeholders.scss | 5 +++++ .../consul-ui/app/styles/base/icons/icons/queue/index.scss | 5 +++++ .../app/styles/base/icons/icons/queue/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/queue/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/queue/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/queue/property-24.scss | 5 +++++ .../styles/base/icons/icons/radio-button-checked/index.scss | 5 +++++ .../base/icons/icons/radio-button-checked/keyframes.scss | 5 +++++ .../base/icons/icons/radio-button-checked/placeholders.scss | 5 +++++ .../base/icons/icons/radio-button-unchecked/index.scss | 5 +++++ .../base/icons/icons/radio-button-unchecked/keyframes.scss | 5 +++++ .../icons/icons/radio-button-unchecked/placeholders.scss | 5 +++++ .../consul-ui/app/styles/base/icons/icons/radio/index.scss | 5 +++++ .../app/styles/base/icons/icons/radio/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/radio/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/radio/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/radio/property-24.scss | 5 +++++ .../consul-ui/app/styles/base/icons/icons/random/index.scss | 5 +++++ .../app/styles/base/icons/icons/random/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/random/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/random/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/random/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/redirect/index.scss | 5 +++++ .../app/styles/base/icons/icons/redirect/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/redirect/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/redirect/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/redirect/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/refresh-alert/index.scss | 5 +++++ .../styles/base/icons/icons/refresh-alert/keyframes.scss | 5 +++++ .../styles/base/icons/icons/refresh-alert/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/refresh-default/index.scss | 5 +++++ .../styles/base/icons/icons/refresh-default/keyframes.scss | 5 +++++ .../base/icons/icons/refresh-default/placeholders.scss | 5 +++++ .../consul-ui/app/styles/base/icons/icons/reload/index.scss | 5 +++++ .../app/styles/base/icons/icons/reload/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/reload/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/reload/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/reload/property-24.scss | 5 +++++ .../consul-ui/app/styles/base/icons/icons/remix/index.scss | 5 +++++ .../app/styles/base/icons/icons/remix/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/remix/placeholders.scss | 5 +++++ .../consul-ui/app/styles/base/icons/icons/repeat/index.scss | 5 +++++ .../app/styles/base/icons/icons/repeat/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/repeat/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/repeat/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/repeat/property-24.scss | 5 +++++ .../styles/base/icons/icons/replication-direct/index.scss | 5 +++++ .../base/icons/icons/replication-direct/keyframes.scss | 5 +++++ .../base/icons/icons/replication-direct/placeholders.scss | 5 +++++ .../base/icons/icons/replication-direct/property-16.scss | 5 +++++ .../base/icons/icons/replication-direct/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/replication-perf/index.scss | 5 +++++ .../styles/base/icons/icons/replication-perf/keyframes.scss | 5 +++++ .../base/icons/icons/replication-perf/placeholders.scss | 5 +++++ .../base/icons/icons/replication-perf/property-16.scss | 5 +++++ .../base/icons/icons/replication-perf/property-24.scss | 5 +++++ .../consul-ui/app/styles/base/icons/icons/rewind/index.scss | 5 +++++ .../app/styles/base/icons/icons/rewind/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/rewind/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/rewind/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/rewind/property-24.scss | 5 +++++ .../consul-ui/app/styles/base/icons/icons/ribbon/index.scss | 5 +++++ .../app/styles/base/icons/icons/ribbon/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/ribbon/placeholders.scss | 5 +++++ .../consul-ui/app/styles/base/icons/icons/rocket/index.scss | 5 +++++ .../app/styles/base/icons/icons/rocket/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/rocket/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/rocket/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/rocket/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/rotate-ccw/index.scss | 5 +++++ .../app/styles/base/icons/icons/rotate-ccw/keyframes.scss | 5 +++++ .../styles/base/icons/icons/rotate-ccw/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/rotate-ccw/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/rotate-ccw/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/rotate-cw/index.scss | 5 +++++ .../app/styles/base/icons/icons/rotate-cw/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/rotate-cw/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/rotate-cw/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/rotate-cw/property-24.scss | 5 +++++ .../consul-ui/app/styles/base/icons/icons/rss/index.scss | 5 +++++ .../app/styles/base/icons/icons/rss/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/rss/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/rss/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/rss/property-24.scss | 5 +++++ .../consul-ui/app/styles/base/icons/icons/run/index.scss | 5 +++++ .../app/styles/base/icons/icons/run/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/run/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/run/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/run/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/running/index.scss | 5 +++++ .../app/styles/base/icons/icons/running/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/running/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/running/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/running/property-24.scss | 5 +++++ .../consul-ui/app/styles/base/icons/icons/save/index.scss | 5 +++++ .../app/styles/base/icons/icons/save/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/save/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/save/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/save/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/scissors/index.scss | 5 +++++ .../app/styles/base/icons/icons/scissors/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/scissors/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/scissors/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/scissors/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/search-color/index.scss | 5 +++++ .../app/styles/base/icons/icons/search-color/keyframes.scss | 5 +++++ .../styles/base/icons/icons/search-color/placeholders.scss | 5 +++++ .../styles/base/icons/icons/search-color/property-16.scss | 5 +++++ .../styles/base/icons/icons/search-color/property-24.scss | 5 +++++ .../consul-ui/app/styles/base/icons/icons/search/index.scss | 5 +++++ .../app/styles/base/icons/icons/search/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/search/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/search/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/search/property-24.scss | 5 +++++ .../consul-ui/app/styles/base/icons/icons/send/index.scss | 5 +++++ .../app/styles/base/icons/icons/send/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/send/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/send/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/send/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/server-cluster/index.scss | 5 +++++ .../styles/base/icons/icons/server-cluster/keyframes.scss | 5 +++++ .../base/icons/icons/server-cluster/placeholders.scss | 5 +++++ .../styles/base/icons/icons/server-cluster/property-16.scss | 5 +++++ .../styles/base/icons/icons/server-cluster/property-24.scss | 5 +++++ .../consul-ui/app/styles/base/icons/icons/server/index.scss | 5 +++++ .../app/styles/base/icons/icons/server/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/server/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/server/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/server/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/serverless/index.scss | 5 +++++ .../app/styles/base/icons/icons/serverless/keyframes.scss | 5 +++++ .../styles/base/icons/icons/serverless/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/serverless/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/serverless/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/settings/index.scss | 5 +++++ .../app/styles/base/icons/icons/settings/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/settings/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/settings/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/settings/property-24.scss | 5 +++++ .../consul-ui/app/styles/base/icons/icons/share/index.scss | 5 +++++ .../app/styles/base/icons/icons/share/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/share/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/share/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/share/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/shield-alert/index.scss | 5 +++++ .../app/styles/base/icons/icons/shield-alert/keyframes.scss | 5 +++++ .../styles/base/icons/icons/shield-alert/placeholders.scss | 5 +++++ .../styles/base/icons/icons/shield-alert/property-16.scss | 5 +++++ .../styles/base/icons/icons/shield-alert/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/shield-check/index.scss | 5 +++++ .../app/styles/base/icons/icons/shield-check/keyframes.scss | 5 +++++ .../styles/base/icons/icons/shield-check/placeholders.scss | 5 +++++ .../styles/base/icons/icons/shield-check/property-16.scss | 5 +++++ .../styles/base/icons/icons/shield-check/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/shield-off/index.scss | 5 +++++ .../app/styles/base/icons/icons/shield-off/keyframes.scss | 5 +++++ .../styles/base/icons/icons/shield-off/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/shield-off/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/shield-off/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/shield-x/index.scss | 5 +++++ .../app/styles/base/icons/icons/shield-x/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/shield-x/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/shield-x/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/shield-x/property-24.scss | 5 +++++ .../consul-ui/app/styles/base/icons/icons/shield/index.scss | 5 +++++ .../app/styles/base/icons/icons/shield/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/shield/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/shield/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/shield/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/shopping-bag/index.scss | 5 +++++ .../app/styles/base/icons/icons/shopping-bag/keyframes.scss | 5 +++++ .../styles/base/icons/icons/shopping-bag/placeholders.scss | 5 +++++ .../styles/base/icons/icons/shopping-bag/property-16.scss | 5 +++++ .../styles/base/icons/icons/shopping-bag/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/shopping-cart/index.scss | 5 +++++ .../styles/base/icons/icons/shopping-cart/keyframes.scss | 5 +++++ .../styles/base/icons/icons/shopping-cart/placeholders.scss | 5 +++++ .../styles/base/icons/icons/shopping-cart/property-16.scss | 5 +++++ .../styles/base/icons/icons/shopping-cart/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/shuffle/index.scss | 5 +++++ .../app/styles/base/icons/icons/shuffle/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/shuffle/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/shuffle/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/shuffle/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/sidebar-hide/index.scss | 5 +++++ .../app/styles/base/icons/icons/sidebar-hide/keyframes.scss | 5 +++++ .../styles/base/icons/icons/sidebar-hide/placeholders.scss | 5 +++++ .../styles/base/icons/icons/sidebar-hide/property-16.scss | 5 +++++ .../styles/base/icons/icons/sidebar-hide/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/sidebar-show/index.scss | 5 +++++ .../app/styles/base/icons/icons/sidebar-show/keyframes.scss | 5 +++++ .../styles/base/icons/icons/sidebar-show/placeholders.scss | 5 +++++ .../styles/base/icons/icons/sidebar-show/property-16.scss | 5 +++++ .../styles/base/icons/icons/sidebar-show/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/sidebar/index.scss | 5 +++++ .../app/styles/base/icons/icons/sidebar/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/sidebar/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/sidebar/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/sidebar/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/sign-in/index.scss | 5 +++++ .../app/styles/base/icons/icons/sign-in/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/sign-in/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/sign-in/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/sign-in/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/sign-out/index.scss | 5 +++++ .../app/styles/base/icons/icons/sign-out/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/sign-out/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/sign-out/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/sign-out/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/skip-back/index.scss | 5 +++++ .../app/styles/base/icons/icons/skip-back/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/skip-back/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/skip-back/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/skip-back/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/skip-forward/index.scss | 5 +++++ .../app/styles/base/icons/icons/skip-forward/keyframes.scss | 5 +++++ .../styles/base/icons/icons/skip-forward/placeholders.scss | 5 +++++ .../styles/base/icons/icons/skip-forward/property-16.scss | 5 +++++ .../styles/base/icons/icons/skip-forward/property-24.scss | 5 +++++ .../consul-ui/app/styles/base/icons/icons/skip/index.scss | 5 +++++ .../app/styles/base/icons/icons/skip/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/skip/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/skip/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/skip/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/slack-color/index.scss | 5 +++++ .../app/styles/base/icons/icons/slack-color/keyframes.scss | 5 +++++ .../styles/base/icons/icons/slack-color/placeholders.scss | 5 +++++ .../styles/base/icons/icons/slack-color/property-16.scss | 5 +++++ .../styles/base/icons/icons/slack-color/property-24.scss | 5 +++++ .../consul-ui/app/styles/base/icons/icons/slack/index.scss | 5 +++++ .../app/styles/base/icons/icons/slack/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/slack/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/slack/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/slack/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/slash-square/index.scss | 5 +++++ .../app/styles/base/icons/icons/slash-square/keyframes.scss | 5 +++++ .../styles/base/icons/icons/slash-square/placeholders.scss | 5 +++++ .../styles/base/icons/icons/slash-square/property-16.scss | 5 +++++ .../styles/base/icons/icons/slash-square/property-24.scss | 5 +++++ .../consul-ui/app/styles/base/icons/icons/slash/index.scss | 5 +++++ .../app/styles/base/icons/icons/slash/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/slash/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/slash/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/slash/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/sliders/index.scss | 5 +++++ .../app/styles/base/icons/icons/sliders/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/sliders/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/sliders/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/sliders/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/smartphone/index.scss | 5 +++++ .../app/styles/base/icons/icons/smartphone/keyframes.scss | 5 +++++ .../styles/base/icons/icons/smartphone/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/smartphone/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/smartphone/property-24.scss | 5 +++++ .../consul-ui/app/styles/base/icons/icons/smile/index.scss | 5 +++++ .../app/styles/base/icons/icons/smile/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/smile/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/smile/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/smile/property-24.scss | 5 +++++ .../consul-ui/app/styles/base/icons/icons/socket/index.scss | 5 +++++ .../app/styles/base/icons/icons/socket/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/socket/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/socket/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/socket/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/sort-asc/index.scss | 5 +++++ .../app/styles/base/icons/icons/sort-asc/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/sort-asc/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/sort-asc/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/sort-asc/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/sort-desc/index.scss | 5 +++++ .../app/styles/base/icons/icons/sort-desc/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/sort-desc/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/sort-desc/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/sort-desc/property-24.scss | 5 +++++ .../consul-ui/app/styles/base/icons/icons/sort/index.scss | 5 +++++ .../app/styles/base/icons/icons/sort/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/sort/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/source-file/index.scss | 5 +++++ .../app/styles/base/icons/icons/source-file/keyframes.scss | 5 +++++ .../styles/base/icons/icons/source-file/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/speaker/index.scss | 5 +++++ .../app/styles/base/icons/icons/speaker/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/speaker/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/speaker/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/speaker/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/square-fill/index.scss | 5 +++++ .../app/styles/base/icons/icons/square-fill/keyframes.scss | 5 +++++ .../styles/base/icons/icons/square-fill/placeholders.scss | 5 +++++ .../styles/base/icons/icons/square-fill/property-16.scss | 5 +++++ .../styles/base/icons/icons/square-fill/property-24.scss | 5 +++++ .../consul-ui/app/styles/base/icons/icons/square/index.scss | 5 +++++ .../app/styles/base/icons/icons/square/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/square/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/square/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/square/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/star-circle/index.scss | 5 +++++ .../app/styles/base/icons/icons/star-circle/keyframes.scss | 5 +++++ .../styles/base/icons/icons/star-circle/placeholders.scss | 5 +++++ .../styles/base/icons/icons/star-circle/property-16.scss | 5 +++++ .../styles/base/icons/icons/star-circle/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/star-fill/index.scss | 5 +++++ .../app/styles/base/icons/icons/star-fill/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/star-fill/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/star-fill/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/star-fill/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/star-off/index.scss | 5 +++++ .../app/styles/base/icons/icons/star-off/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/star-off/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/star-off/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/star-off/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/star-outline/index.scss | 5 +++++ .../app/styles/base/icons/icons/star-outline/keyframes.scss | 5 +++++ .../styles/base/icons/icons/star-outline/placeholders.scss | 5 +++++ .../consul-ui/app/styles/base/icons/icons/star/index.scss | 5 +++++ .../app/styles/base/icons/icons/star/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/star/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/star/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/star/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/stop-circle/index.scss | 5 +++++ .../app/styles/base/icons/icons/stop-circle/keyframes.scss | 5 +++++ .../styles/base/icons/icons/stop-circle/placeholders.scss | 5 +++++ .../styles/base/icons/icons/stop-circle/property-16.scss | 5 +++++ .../styles/base/icons/icons/stop-circle/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/sub-left/index.scss | 5 +++++ .../app/styles/base/icons/icons/sub-left/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/sub-left/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/sub-right/index.scss | 5 +++++ .../app/styles/base/icons/icons/sub-right/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/sub-right/placeholders.scss | 5 +++++ .../consul-ui/app/styles/base/icons/icons/sun/index.scss | 5 +++++ .../app/styles/base/icons/icons/sun/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/sun/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/sun/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/sun/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/support/index.scss | 5 +++++ .../app/styles/base/icons/icons/support/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/support/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/support/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/support/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/swap-horizontal/index.scss | 5 +++++ .../styles/base/icons/icons/swap-horizontal/keyframes.scss | 5 +++++ .../base/icons/icons/swap-horizontal/placeholders.scss | 5 +++++ .../base/icons/icons/swap-horizontal/property-16.scss | 5 +++++ .../base/icons/icons/swap-horizontal/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/swap-vertical/index.scss | 5 +++++ .../styles/base/icons/icons/swap-vertical/keyframes.scss | 5 +++++ .../styles/base/icons/icons/swap-vertical/placeholders.scss | 5 +++++ .../styles/base/icons/icons/swap-vertical/property-16.scss | 5 +++++ .../styles/base/icons/icons/swap-vertical/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/switcher/index.scss | 5 +++++ .../app/styles/base/icons/icons/switcher/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/switcher/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/switcher/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/switcher/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/sync-alert/index.scss | 5 +++++ .../app/styles/base/icons/icons/sync-alert/keyframes.scss | 5 +++++ .../styles/base/icons/icons/sync-alert/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/sync-alert/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/sync-alert/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/sync-reverse/index.scss | 5 +++++ .../app/styles/base/icons/icons/sync-reverse/keyframes.scss | 5 +++++ .../styles/base/icons/icons/sync-reverse/placeholders.scss | 5 +++++ .../styles/base/icons/icons/sync-reverse/property-16.scss | 5 +++++ .../styles/base/icons/icons/sync-reverse/property-24.scss | 5 +++++ .../consul-ui/app/styles/base/icons/icons/sync/index.scss | 5 +++++ .../app/styles/base/icons/icons/sync/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/sync/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/sync/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/sync/property-24.scss | 5 +++++ .../consul-ui/app/styles/base/icons/icons/tablet/index.scss | 5 +++++ .../app/styles/base/icons/icons/tablet/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/tablet/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/tablet/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/tablet/property-24.scss | 5 +++++ .../consul-ui/app/styles/base/icons/icons/tag/index.scss | 5 +++++ .../app/styles/base/icons/icons/tag/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/tag/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/tag/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/tag/property-24.scss | 5 +++++ .../consul-ui/app/styles/base/icons/icons/target/index.scss | 5 +++++ .../app/styles/base/icons/icons/target/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/target/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/target/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/target/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/terminal-screen/index.scss | 5 +++++ .../styles/base/icons/icons/terminal-screen/keyframes.scss | 5 +++++ .../base/icons/icons/terminal-screen/placeholders.scss | 5 +++++ .../base/icons/icons/terminal-screen/property-16.scss | 5 +++++ .../base/icons/icons/terminal-screen/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/terminal/index.scss | 5 +++++ .../app/styles/base/icons/icons/terminal/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/terminal/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/terminal/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/terminal/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/terraform-color/index.scss | 5 +++++ .../styles/base/icons/icons/terraform-color/keyframes.scss | 5 +++++ .../base/icons/icons/terraform-color/placeholders.scss | 5 +++++ .../base/icons/icons/terraform-color/property-16.scss | 5 +++++ .../base/icons/icons/terraform-color/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/terraform/index.scss | 5 +++++ .../app/styles/base/icons/icons/terraform/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/terraform/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/terraform/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/terraform/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/thumbs-down/index.scss | 5 +++++ .../app/styles/base/icons/icons/thumbs-down/keyframes.scss | 5 +++++ .../styles/base/icons/icons/thumbs-down/placeholders.scss | 5 +++++ .../styles/base/icons/icons/thumbs-down/property-16.scss | 5 +++++ .../styles/base/icons/icons/thumbs-down/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/thumbs-up/index.scss | 5 +++++ .../app/styles/base/icons/icons/thumbs-up/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/thumbs-up/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/thumbs-up/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/thumbs-up/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/toggle-left/index.scss | 5 +++++ .../app/styles/base/icons/icons/toggle-left/keyframes.scss | 5 +++++ .../styles/base/icons/icons/toggle-left/placeholders.scss | 5 +++++ .../styles/base/icons/icons/toggle-left/property-16.scss | 5 +++++ .../styles/base/icons/icons/toggle-left/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/toggle-right/index.scss | 5 +++++ .../app/styles/base/icons/icons/toggle-right/keyframes.scss | 5 +++++ .../styles/base/icons/icons/toggle-right/placeholders.scss | 5 +++++ .../styles/base/icons/icons/toggle-right/property-16.scss | 5 +++++ .../styles/base/icons/icons/toggle-right/property-24.scss | 5 +++++ .../consul-ui/app/styles/base/icons/icons/token/index.scss | 5 +++++ .../app/styles/base/icons/icons/token/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/token/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/token/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/token/property-24.scss | 5 +++++ .../consul-ui/app/styles/base/icons/icons/tools/index.scss | 5 +++++ .../app/styles/base/icons/icons/tools/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/tools/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/tools/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/tools/property-24.scss | 5 +++++ .../consul-ui/app/styles/base/icons/icons/top/index.scss | 5 +++++ .../app/styles/base/icons/icons/top/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/top/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/top/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/top/property-24.scss | 5 +++++ .../consul-ui/app/styles/base/icons/icons/trash/index.scss | 5 +++++ .../app/styles/base/icons/icons/trash/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/trash/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/trash/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/trash/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/trend-down/index.scss | 5 +++++ .../app/styles/base/icons/icons/trend-down/keyframes.scss | 5 +++++ .../styles/base/icons/icons/trend-down/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/trend-down/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/trend-down/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/trend-up/index.scss | 5 +++++ .../app/styles/base/icons/icons/trend-up/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/trend-up/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/trend-up/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/trend-up/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/triangle-fill/index.scss | 5 +++++ .../styles/base/icons/icons/triangle-fill/keyframes.scss | 5 +++++ .../styles/base/icons/icons/triangle-fill/placeholders.scss | 5 +++++ .../styles/base/icons/icons/triangle-fill/property-16.scss | 5 +++++ .../styles/base/icons/icons/triangle-fill/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/triangle/index.scss | 5 +++++ .../app/styles/base/icons/icons/triangle/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/triangle/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/triangle/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/triangle/property-24.scss | 5 +++++ .../consul-ui/app/styles/base/icons/icons/truck/index.scss | 5 +++++ .../app/styles/base/icons/icons/truck/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/truck/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/truck/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/truck/property-24.scss | 5 +++++ .../consul-ui/app/styles/base/icons/icons/tune/index.scss | 5 +++++ .../app/styles/base/icons/icons/tune/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/tune/placeholders.scss | 5 +++++ .../consul-ui/app/styles/base/icons/icons/tv/index.scss | 5 +++++ .../consul-ui/app/styles/base/icons/icons/tv/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/tv/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/tv/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/tv/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/twitch-color/index.scss | 5 +++++ .../app/styles/base/icons/icons/twitch-color/keyframes.scss | 5 +++++ .../styles/base/icons/icons/twitch-color/placeholders.scss | 5 +++++ .../styles/base/icons/icons/twitch-color/property-16.scss | 5 +++++ .../styles/base/icons/icons/twitch-color/property-24.scss | 5 +++++ .../consul-ui/app/styles/base/icons/icons/twitch/index.scss | 5 +++++ .../app/styles/base/icons/icons/twitch/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/twitch/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/twitch/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/twitch/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/twitter-color/index.scss | 5 +++++ .../styles/base/icons/icons/twitter-color/keyframes.scss | 5 +++++ .../styles/base/icons/icons/twitter-color/placeholders.scss | 5 +++++ .../styles/base/icons/icons/twitter-color/property-16.scss | 5 +++++ .../styles/base/icons/icons/twitter-color/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/twitter/index.scss | 5 +++++ .../app/styles/base/icons/icons/twitter/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/twitter/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/twitter/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/twitter/property-24.scss | 5 +++++ .../consul-ui/app/styles/base/icons/icons/type/index.scss | 5 +++++ .../app/styles/base/icons/icons/type/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/type/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/type/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/type/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/unfold-close/index.scss | 5 +++++ .../app/styles/base/icons/icons/unfold-close/keyframes.scss | 5 +++++ .../styles/base/icons/icons/unfold-close/placeholders.scss | 5 +++++ .../styles/base/icons/icons/unfold-close/property-16.scss | 5 +++++ .../styles/base/icons/icons/unfold-close/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/unfold-less/index.scss | 5 +++++ .../app/styles/base/icons/icons/unfold-less/keyframes.scss | 5 +++++ .../styles/base/icons/icons/unfold-less/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/unfold-more/index.scss | 5 +++++ .../app/styles/base/icons/icons/unfold-more/keyframes.scss | 5 +++++ .../styles/base/icons/icons/unfold-more/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/unfold-open/index.scss | 5 +++++ .../app/styles/base/icons/icons/unfold-open/keyframes.scss | 5 +++++ .../styles/base/icons/icons/unfold-open/placeholders.scss | 5 +++++ .../styles/base/icons/icons/unfold-open/property-16.scss | 5 +++++ .../styles/base/icons/icons/unfold-open/property-24.scss | 5 +++++ .../consul-ui/app/styles/base/icons/icons/union/index.scss | 5 +++++ .../app/styles/base/icons/icons/union/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/union/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/union/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/union/property-24.scss | 5 +++++ .../consul-ui/app/styles/base/icons/icons/unlock/index.scss | 5 +++++ .../app/styles/base/icons/icons/unlock/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/unlock/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/unlock/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/unlock/property-24.scss | 5 +++++ .../consul-ui/app/styles/base/icons/icons/upload/index.scss | 5 +++++ .../app/styles/base/icons/icons/upload/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/upload/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/upload/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/upload/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/user-add/index.scss | 5 +++++ .../app/styles/base/icons/icons/user-add/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/user-add/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/user-check/index.scss | 5 +++++ .../app/styles/base/icons/icons/user-check/keyframes.scss | 5 +++++ .../styles/base/icons/icons/user-check/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/user-check/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/user-check/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/user-circle-fill/index.scss | 5 +++++ .../styles/base/icons/icons/user-circle-fill/keyframes.scss | 5 +++++ .../base/icons/icons/user-circle-fill/placeholders.scss | 5 +++++ .../base/icons/icons/user-circle-fill/property-16.scss | 5 +++++ .../base/icons/icons/user-circle-fill/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/user-circle/index.scss | 5 +++++ .../app/styles/base/icons/icons/user-circle/keyframes.scss | 5 +++++ .../styles/base/icons/icons/user-circle/placeholders.scss | 5 +++++ .../styles/base/icons/icons/user-circle/property-16.scss | 5 +++++ .../styles/base/icons/icons/user-circle/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/user-minus/index.scss | 5 +++++ .../app/styles/base/icons/icons/user-minus/keyframes.scss | 5 +++++ .../styles/base/icons/icons/user-minus/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/user-minus/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/user-minus/property-24.scss | 5 +++++ .../styles/base/icons/icons/user-organization/index.scss | 5 +++++ .../base/icons/icons/user-organization/keyframes.scss | 5 +++++ .../base/icons/icons/user-organization/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/user-plain/index.scss | 5 +++++ .../app/styles/base/icons/icons/user-plain/keyframes.scss | 5 +++++ .../styles/base/icons/icons/user-plain/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/user-plus/index.scss | 5 +++++ .../app/styles/base/icons/icons/user-plus/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/user-plus/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/user-plus/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/user-plus/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/user-square-fill/index.scss | 5 +++++ .../styles/base/icons/icons/user-square-fill/keyframes.scss | 5 +++++ .../base/icons/icons/user-square-fill/placeholders.scss | 5 +++++ .../styles/base/icons/icons/user-square-outline/index.scss | 5 +++++ .../base/icons/icons/user-square-outline/keyframes.scss | 5 +++++ .../base/icons/icons/user-square-outline/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/user-team/index.scss | 5 +++++ .../app/styles/base/icons/icons/user-team/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/user-team/placeholders.scss | 5 +++++ .../consul-ui/app/styles/base/icons/icons/user-x/index.scss | 5 +++++ .../app/styles/base/icons/icons/user-x/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/user-x/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/user-x/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/user-x/property-24.scss | 5 +++++ .../consul-ui/app/styles/base/icons/icons/user/index.scss | 5 +++++ .../app/styles/base/icons/icons/user/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/user/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/user/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/user/property-24.scss | 5 +++++ .../consul-ui/app/styles/base/icons/icons/users/index.scss | 5 +++++ .../app/styles/base/icons/icons/users/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/users/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/users/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/users/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/vagrant-color/index.scss | 5 +++++ .../styles/base/icons/icons/vagrant-color/keyframes.scss | 5 +++++ .../styles/base/icons/icons/vagrant-color/placeholders.scss | 5 +++++ .../styles/base/icons/icons/vagrant-color/property-16.scss | 5 +++++ .../styles/base/icons/icons/vagrant-color/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/vagrant/index.scss | 5 +++++ .../app/styles/base/icons/icons/vagrant/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/vagrant/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/vagrant/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/vagrant/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/vault-color/index.scss | 5 +++++ .../app/styles/base/icons/icons/vault-color/keyframes.scss | 5 +++++ .../styles/base/icons/icons/vault-color/placeholders.scss | 5 +++++ .../styles/base/icons/icons/vault-color/property-16.scss | 5 +++++ .../styles/base/icons/icons/vault-color/property-24.scss | 5 +++++ .../consul-ui/app/styles/base/icons/icons/vault/index.scss | 5 +++++ .../app/styles/base/icons/icons/vault/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/vault/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/vault/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/vault/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/verified/index.scss | 5 +++++ .../app/styles/base/icons/icons/verified/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/verified/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/verified/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/verified/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/video-off/index.scss | 5 +++++ .../app/styles/base/icons/icons/video-off/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/video-off/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/video-off/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/video-off/property-24.scss | 5 +++++ .../consul-ui/app/styles/base/icons/icons/video/index.scss | 5 +++++ .../app/styles/base/icons/icons/video/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/video/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/video/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/video/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/visibility-hide/index.scss | 5 +++++ .../styles/base/icons/icons/visibility-hide/keyframes.scss | 5 +++++ .../base/icons/icons/visibility-hide/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/visibility-show/index.scss | 5 +++++ .../styles/base/icons/icons/visibility-show/keyframes.scss | 5 +++++ .../base/icons/icons/visibility-show/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/vmware-color/index.scss | 5 +++++ .../app/styles/base/icons/icons/vmware-color/keyframes.scss | 5 +++++ .../styles/base/icons/icons/vmware-color/placeholders.scss | 5 +++++ .../styles/base/icons/icons/vmware-color/property-16.scss | 5 +++++ .../styles/base/icons/icons/vmware-color/property-24.scss | 5 +++++ .../consul-ui/app/styles/base/icons/icons/vmware/index.scss | 5 +++++ .../app/styles/base/icons/icons/vmware/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/vmware/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/vmware/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/vmware/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/volume-2/index.scss | 5 +++++ .../app/styles/base/icons/icons/volume-2/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/volume-2/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/volume-2/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/volume-2/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/volume-down/index.scss | 5 +++++ .../app/styles/base/icons/icons/volume-down/keyframes.scss | 5 +++++ .../styles/base/icons/icons/volume-down/placeholders.scss | 5 +++++ .../styles/base/icons/icons/volume-down/property-16.scss | 5 +++++ .../styles/base/icons/icons/volume-down/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/volume-x/index.scss | 5 +++++ .../app/styles/base/icons/icons/volume-x/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/volume-x/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/volume-x/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/volume-x/property-24.scss | 5 +++++ .../consul-ui/app/styles/base/icons/icons/volume/index.scss | 5 +++++ .../app/styles/base/icons/icons/volume/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/volume/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/volume/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/volume/property-24.scss | 5 +++++ .../consul-ui/app/styles/base/icons/icons/wall/index.scss | 5 +++++ .../app/styles/base/icons/icons/wall/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/wall/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/wall/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/wall/property-24.scss | 5 +++++ .../consul-ui/app/styles/base/icons/icons/wand/index.scss | 5 +++++ .../app/styles/base/icons/icons/wand/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/wand/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/wand/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/wand/property-24.scss | 5 +++++ .../consul-ui/app/styles/base/icons/icons/watch/index.scss | 5 +++++ .../app/styles/base/icons/icons/watch/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/watch/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/watch/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/watch/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/waypoint-color/index.scss | 5 +++++ .../styles/base/icons/icons/waypoint-color/keyframes.scss | 5 +++++ .../base/icons/icons/waypoint-color/placeholders.scss | 5 +++++ .../styles/base/icons/icons/waypoint-color/property-16.scss | 5 +++++ .../styles/base/icons/icons/waypoint-color/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/waypoint/index.scss | 5 +++++ .../app/styles/base/icons/icons/waypoint/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/waypoint/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/waypoint/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/waypoint/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/webhook/index.scss | 5 +++++ .../app/styles/base/icons/icons/webhook/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/webhook/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/webhook/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/webhook/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/wifi-off/index.scss | 5 +++++ .../app/styles/base/icons/icons/wifi-off/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/wifi-off/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/wifi-off/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/wifi-off/property-24.scss | 5 +++++ .../consul-ui/app/styles/base/icons/icons/wifi/index.scss | 5 +++++ .../app/styles/base/icons/icons/wifi/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/wifi/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/wifi/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/wifi/property-24.scss | 5 +++++ .../consul-ui/app/styles/base/icons/icons/wrench/index.scss | 5 +++++ .../app/styles/base/icons/icons/wrench/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/wrench/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/wrench/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/wrench/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/x-circle-fill/index.scss | 5 +++++ .../styles/base/icons/icons/x-circle-fill/keyframes.scss | 5 +++++ .../styles/base/icons/icons/x-circle-fill/placeholders.scss | 5 +++++ .../styles/base/icons/icons/x-circle-fill/property-16.scss | 5 +++++ .../styles/base/icons/icons/x-circle-fill/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/x-circle/index.scss | 5 +++++ .../app/styles/base/icons/icons/x-circle/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/x-circle/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/x-circle/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/x-circle/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/x-diamond-fill/index.scss | 5 +++++ .../styles/base/icons/icons/x-diamond-fill/keyframes.scss | 5 +++++ .../base/icons/icons/x-diamond-fill/placeholders.scss | 5 +++++ .../styles/base/icons/icons/x-diamond-fill/property-16.scss | 5 +++++ .../styles/base/icons/icons/x-diamond-fill/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/x-diamond/index.scss | 5 +++++ .../app/styles/base/icons/icons/x-diamond/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/x-diamond/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/x-diamond/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/x-diamond/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/x-hexagon-fill/index.scss | 5 +++++ .../styles/base/icons/icons/x-hexagon-fill/keyframes.scss | 5 +++++ .../base/icons/icons/x-hexagon-fill/placeholders.scss | 5 +++++ .../styles/base/icons/icons/x-hexagon-fill/property-16.scss | 5 +++++ .../styles/base/icons/icons/x-hexagon-fill/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/x-hexagon/index.scss | 5 +++++ .../app/styles/base/icons/icons/x-hexagon/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/x-hexagon/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/x-hexagon/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/x-hexagon/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/x-square-fill/index.scss | 5 +++++ .../styles/base/icons/icons/x-square-fill/keyframes.scss | 5 +++++ .../styles/base/icons/icons/x-square-fill/placeholders.scss | 5 +++++ .../styles/base/icons/icons/x-square-fill/property-16.scss | 5 +++++ .../styles/base/icons/icons/x-square-fill/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/x-square/index.scss | 5 +++++ .../app/styles/base/icons/icons/x-square/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/x-square/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/x-square/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/x-square/property-24.scss | 5 +++++ .../consul-ui/app/styles/base/icons/icons/x/index.scss | 5 +++++ .../consul-ui/app/styles/base/icons/icons/x/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/x/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/x/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/x/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/youtube-color/index.scss | 5 +++++ .../styles/base/icons/icons/youtube-color/keyframes.scss | 5 +++++ .../styles/base/icons/icons/youtube-color/placeholders.scss | 5 +++++ .../styles/base/icons/icons/youtube-color/property-16.scss | 5 +++++ .../styles/base/icons/icons/youtube-color/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/youtube/index.scss | 5 +++++ .../app/styles/base/icons/icons/youtube/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/youtube/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/youtube/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/youtube/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/zap-off/index.scss | 5 +++++ .../app/styles/base/icons/icons/zap-off/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/zap-off/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/zap-off/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/zap-off/property-24.scss | 5 +++++ .../consul-ui/app/styles/base/icons/icons/zap/index.scss | 5 +++++ .../app/styles/base/icons/icons/zap/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/zap/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/zap/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/zap/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/zoom-in/index.scss | 5 +++++ .../app/styles/base/icons/icons/zoom-in/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/zoom-in/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/zoom-in/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/zoom-in/property-24.scss | 5 +++++ .../app/styles/base/icons/icons/zoom-out/index.scss | 5 +++++ .../app/styles/base/icons/icons/zoom-out/keyframes.scss | 5 +++++ .../app/styles/base/icons/icons/zoom-out/placeholders.scss | 5 +++++ .../app/styles/base/icons/icons/zoom-out/property-16.scss | 5 +++++ .../app/styles/base/icons/icons/zoom-out/property-24.scss | 5 +++++ ui/packages/consul-ui/app/styles/base/icons/index.scss | 5 +++++ ui/packages/consul-ui/app/styles/base/icons/overrides.scss | 5 +++++ ui/packages/consul-ui/app/styles/base/index.scss | 5 +++++ .../consul-ui/app/styles/base/reset/base-variables.scss | 5 +++++ ui/packages/consul-ui/app/styles/base/reset/index.scss | 5 +++++ ui/packages/consul-ui/app/styles/base/reset/minireset.scss | 5 +++++ ui/packages/consul-ui/app/styles/base/reset/system.scss | 5 +++++ .../app/styles/base/typography/base-keyframes.scss | 5 +++++ .../app/styles/base/typography/base-placeholders.scss | 5 +++++ .../app/styles/base/typography/base-variables.scss | 5 +++++ ui/packages/consul-ui/app/styles/base/typography/index.scss | 5 +++++ ui/packages/consul-ui/app/styles/components.scss | 5 +++++ ui/packages/consul-ui/app/styles/debug.scss | 5 +++++ ui/packages/consul-ui/app/styles/icons.scss | 5 +++++ ui/packages/consul-ui/app/styles/layout.scss | 5 +++++ ui/packages/consul-ui/app/styles/layouts/index.scss | 5 +++++ ui/packages/consul-ui/app/styles/prism-coldark-cold.scss | 5 +++++ ui/packages/consul-ui/app/styles/prism-coldark-dark.scss | 5 +++++ ui/packages/consul-ui/app/styles/routes.scss | 5 +++++ ui/packages/consul-ui/app/styles/routes/dc/acls/index.scss | 5 +++++ .../consul-ui/app/styles/routes/dc/intentions/index.scss | 5 +++++ ui/packages/consul-ui/app/styles/routes/dc/kv/index.scss | 5 +++++ ui/packages/consul-ui/app/styles/routes/dc/nodes/index.scss | 5 +++++ .../consul-ui/app/styles/routes/dc/overview/license.scss | 5 +++++ .../app/styles/routes/dc/overview/serverstatus.scss | 5 +++++ .../consul-ui/app/styles/routes/dc/services/index.scss | 5 +++++ ui/packages/consul-ui/app/styles/tailwind.scss | 5 +++++ ui/packages/consul-ui/app/styles/themes.scss | 5 +++++ ui/packages/consul-ui/app/styles/typography.scss | 5 +++++ ui/packages/consul-ui/app/styles/variables.scss | 5 +++++ .../consul-ui/app/styles/variables/custom-query.scss | 5 +++++ ui/packages/consul-ui/app/styles/variables/layout.scss | 5 +++++ ui/packages/consul-ui/app/styles/variables/skin.scss | 5 +++++ ui/packages/consul-ui/app/templates/application.hbs | 5 +++++ ui/packages/consul-ui/app/templates/dc.hbs | 5 +++++ ui/packages/consul-ui/app/templates/dc/acls.hbs | 5 +++++ .../consul-ui/app/templates/dc/acls/auth-methods/index.hbs | 5 +++++ .../consul-ui/app/templates/dc/acls/auth-methods/show.hbs | 5 +++++ .../app/templates/dc/acls/auth-methods/show/auth-method.hbs | 5 +++++ .../templates/dc/acls/auth-methods/show/binding-rules.hbs | 5 +++++ .../templates/dc/acls/auth-methods/show/nspace-rules.hbs | 5 +++++ ui/packages/consul-ui/app/templates/dc/acls/index.hbs | 5 +++++ .../consul-ui/app/templates/dc/acls/policies/-form.hbs | 5 +++++ .../consul-ui/app/templates/dc/acls/policies/edit.hbs | 5 +++++ .../consul-ui/app/templates/dc/acls/policies/index.hbs | 5 +++++ ui/packages/consul-ui/app/templates/dc/acls/roles/-form.hbs | 5 +++++ ui/packages/consul-ui/app/templates/dc/acls/roles/edit.hbs | 5 +++++ ui/packages/consul-ui/app/templates/dc/acls/roles/index.hbs | 5 +++++ .../app/templates/dc/acls/tokens/-fieldsets-legacy.hbs | 5 +++++ .../consul-ui/app/templates/dc/acls/tokens/-fieldsets.hbs | 5 +++++ .../consul-ui/app/templates/dc/acls/tokens/-form.hbs | 5 +++++ ui/packages/consul-ui/app/templates/dc/acls/tokens/edit.hbs | 5 +++++ .../consul-ui/app/templates/dc/acls/tokens/index.hbs | 5 +++++ ui/packages/consul-ui/app/templates/dc/intentions/edit.hbs | 5 +++++ ui/packages/consul-ui/app/templates/dc/intentions/index.hbs | 5 +++++ ui/packages/consul-ui/app/templates/dc/kv/edit.hbs | 5 +++++ ui/packages/consul-ui/app/templates/dc/kv/index.hbs | 5 +++++ ui/packages/consul-ui/app/templates/dc/nodes/index.hbs | 5 +++++ ui/packages/consul-ui/app/templates/dc/nodes/show.hbs | 5 +++++ .../consul-ui/app/templates/dc/nodes/show/healthchecks.hbs | 5 +++++ ui/packages/consul-ui/app/templates/dc/nodes/show/index.hbs | 5 +++++ .../consul-ui/app/templates/dc/nodes/show/metadata.hbs | 5 +++++ ui/packages/consul-ui/app/templates/dc/nodes/show/rtt.hbs | 5 +++++ .../consul-ui/app/templates/dc/nodes/show/services.hbs | 5 +++++ ui/packages/consul-ui/app/templates/dc/routing-config.hbs | 5 +++++ ui/packages/consul-ui/app/templates/dc/services/index.hbs | 5 +++++ .../consul-ui/app/templates/dc/services/instance.hbs | 5 +++++ .../app/templates/dc/services/instance/addresses.hbs | 5 +++++ .../app/templates/dc/services/instance/exposedpaths.hbs | 5 +++++ .../app/templates/dc/services/instance/healthchecks.hbs | 5 +++++ .../app/templates/dc/services/instance/metadata.hbs | 5 +++++ .../app/templates/dc/services/instance/upstreams.hbs | 5 +++++ ui/packages/consul-ui/app/templates/dc/services/show.hbs | 5 +++++ .../consul-ui/app/templates/dc/services/show/index.hbs | 5 +++++ .../consul-ui/app/templates/dc/services/show/instances.hbs | 5 +++++ .../consul-ui/app/templates/dc/services/show/intentions.hbs | 5 +++++ .../app/templates/dc/services/show/intentions/edit.hbs | 5 +++++ .../app/templates/dc/services/show/intentions/index.hbs | 5 +++++ .../consul-ui/app/templates/dc/services/show/routing.hbs | 5 +++++ .../consul-ui/app/templates/dc/services/show/services.hbs | 5 +++++ .../consul-ui/app/templates/dc/services/show/tags.hbs | 5 +++++ .../consul-ui/app/templates/dc/services/show/topology.hbs | 5 +++++ .../consul-ui/app/templates/dc/services/show/upstreams.hbs | 5 +++++ ui/packages/consul-ui/app/templates/dc/show.hbs | 5 +++++ ui/packages/consul-ui/app/templates/dc/show/index.hbs | 5 +++++ ui/packages/consul-ui/app/templates/dc/show/license.hbs | 5 +++++ .../consul-ui/app/templates/dc/show/serverstatus.hbs | 5 +++++ ui/packages/consul-ui/app/templates/debug.hbs | 5 +++++ ui/packages/consul-ui/app/templates/error.hbs | 5 +++++ ui/packages/consul-ui/app/templates/index.hbs | 5 +++++ ui/packages/consul-ui/app/templates/loading.hbs | 5 +++++ ui/packages/consul-ui/app/templates/notfound.hbs | 5 +++++ .../consul-ui/app/templates/oauth-provider-debug.hbs | 5 +++++ ui/packages/consul-ui/app/templates/settings.hbs | 5 +++++ ui/packages/consul-ui/app/utils/ascend.js | 5 +++++ ui/packages/consul-ui/app/utils/atob.js | 5 +++++ ui/packages/consul-ui/app/utils/btoa.js | 5 +++++ ui/packages/consul-ui/app/utils/callable-type.js | 5 +++++ ui/packages/consul-ui/app/utils/create-fingerprinter.js | 5 +++++ ui/packages/consul-ui/app/utils/distance.js | 5 +++++ ui/packages/consul-ui/app/utils/dom/click-first-anchor.js | 5 +++++ ui/packages/consul-ui/app/utils/dom/closest.js | 5 +++++ ui/packages/consul-ui/app/utils/dom/create-listeners.js | 5 +++++ .../consul-ui/app/utils/dom/event-source/blocking.js | 5 +++++ ui/packages/consul-ui/app/utils/dom/event-source/cache.js | 5 +++++ .../consul-ui/app/utils/dom/event-source/callable.js | 5 +++++ ui/packages/consul-ui/app/utils/dom/event-source/index.js | 5 +++++ .../consul-ui/app/utils/dom/event-source/openable.js | 5 +++++ ui/packages/consul-ui/app/utils/dom/event-source/proxy.js | 5 +++++ .../consul-ui/app/utils/dom/event-source/resolver.js | 5 +++++ ui/packages/consul-ui/app/utils/dom/event-source/storage.js | 5 +++++ .../consul-ui/app/utils/dom/get-component-factory.js | 5 +++++ ui/packages/consul-ui/app/utils/dom/is-outside.js | 5 +++++ ui/packages/consul-ui/app/utils/dom/normalize-event.js | 5 +++++ ui/packages/consul-ui/app/utils/dom/qsa-factory.js | 5 +++++ ui/packages/consul-ui/app/utils/dom/sibling.js | 5 +++++ ui/packages/consul-ui/app/utils/editor/lint.js | 5 +++++ ui/packages/consul-ui/app/utils/filter/index.js | 5 +++++ ui/packages/consul-ui/app/utils/form/builder.js | 5 +++++ ui/packages/consul-ui/app/utils/form/changeset.js | 5 +++++ ui/packages/consul-ui/app/utils/get-environment.js | 5 +++++ ui/packages/consul-ui/app/utils/get-form-name-property.js | 5 +++++ ui/packages/consul-ui/app/utils/helpers/call-if-type.js | 5 +++++ ui/packages/consul-ui/app/utils/http/consul.js | 5 +++++ ui/packages/consul-ui/app/utils/http/create-headers.js | 5 +++++ ui/packages/consul-ui/app/utils/http/create-query-params.js | 5 +++++ ui/packages/consul-ui/app/utils/http/create-url.js | 5 +++++ ui/packages/consul-ui/app/utils/http/error.js | 5 +++++ ui/packages/consul-ui/app/utils/http/headers.js | 5 +++++ ui/packages/consul-ui/app/utils/http/method.js | 5 +++++ ui/packages/consul-ui/app/utils/http/request.js | 5 +++++ ui/packages/consul-ui/app/utils/http/status.js | 5 +++++ ui/packages/consul-ui/app/utils/http/xhr.js | 5 +++++ ui/packages/consul-ui/app/utils/intl/missing-message.js | 5 +++++ ui/packages/consul-ui/app/utils/isFolder.js | 5 +++++ ui/packages/consul-ui/app/utils/keyToArray.js | 5 +++++ ui/packages/consul-ui/app/utils/left-trim.js | 5 +++++ ui/packages/consul-ui/app/utils/maybe-call.js | 5 +++++ ui/packages/consul-ui/app/utils/merge-checks.js | 5 +++++ ui/packages/consul-ui/app/utils/minimizeModel.js | 5 +++++ ui/packages/consul-ui/app/utils/non-empty-set.js | 5 +++++ ui/packages/consul-ui/app/utils/path/resolve.js | 5 +++++ ui/packages/consul-ui/app/utils/promisedTimeout.js | 5 +++++ ui/packages/consul-ui/app/utils/right-trim.js | 5 +++++ ui/packages/consul-ui/app/utils/routing/redirect-to.js | 5 +++++ ui/packages/consul-ui/app/utils/routing/transitionable.js | 5 +++++ ui/packages/consul-ui/app/utils/routing/walk.js | 5 +++++ ui/packages/consul-ui/app/utils/routing/wildcard.js | 5 +++++ ui/packages/consul-ui/app/utils/search/exact.js | 5 +++++ ui/packages/consul-ui/app/utils/search/fuzzy.js | 5 +++++ ui/packages/consul-ui/app/utils/search/predicate.js | 5 +++++ ui/packages/consul-ui/app/utils/search/regexp.js | 5 +++++ ui/packages/consul-ui/app/utils/storage/local-storage.js | 5 +++++ ui/packages/consul-ui/app/utils/templatize.js | 5 +++++ ui/packages/consul-ui/app/utils/ticker/index.js | 5 +++++ ui/packages/consul-ui/app/utils/tomography.js | 5 +++++ ui/packages/consul-ui/app/utils/ucfirst.js | 5 +++++ ui/packages/consul-ui/app/utils/update-array-object.js | 5 +++++ .../app/validations/intention-permission-http-header.js | 5 +++++ .../consul-ui/app/validations/intention-permission.js | 5 +++++ ui/packages/consul-ui/app/validations/intention.js | 5 +++++ ui/packages/consul-ui/app/validations/kv.js | 5 +++++ ui/packages/consul-ui/app/validations/policy.js | 5 +++++ ui/packages/consul-ui/app/validations/role.js | 5 +++++ ui/packages/consul-ui/app/validations/sometimes.js | 5 +++++ ui/packages/consul-ui/app/validations/token.js | 5 +++++ ui/packages/consul-ui/blueprints/adapter-test/index.js | 5 +++++ .../__root__/__path__/integration/adapters/__test__.js | 5 +++++ .../qunit-files/__root__/__path__/unit/adapters/__test__.js | 5 +++++ .../blueprints/adapter/files/__root__/__path__/__name__.js | 5 +++++ ui/packages/consul-ui/blueprints/adapter/index.js | 5 +++++ .../files/__root__/__templatepath__/__templatename__.hbs | 5 +++++ ui/packages/consul-ui/blueprints/component/index.js | 5 +++++ .../css-component/files/__root__/__path__/__name__.scss | 5 +++++ .../files/__root__/__path__/__name__/index.scss | 5 +++++ .../files/__root__/__path__/__name__/layout.scss | 5 +++++ .../files/__root__/__path__/__name__/skin.scss | 5 +++++ ui/packages/consul-ui/blueprints/css-component/index.js | 5 +++++ ui/packages/consul-ui/blueprints/model-test/index.js | 5 +++++ .../qunit-files/__root__/__path__/unit/models/__test__.js | 5 +++++ .../blueprints/model/files/__root__/__path__/__name__.js | 5 +++++ ui/packages/consul-ui/blueprints/model/index.js | 5 +++++ ui/packages/consul-ui/blueprints/repository-test/index.js | 5 +++++ .../__path__/integration/services/repository/__test__.js | 5 +++++ .../__root__/__path__/unit/services/repository/__test__.js | 5 +++++ .../repository/files/__root__/__path__/__name__.js | 5 +++++ ui/packages/consul-ui/blueprints/repository/index.js | 5 +++++ ui/packages/consul-ui/blueprints/route-test/index.js | 5 +++++ ui/packages/consul-ui/blueprints/route/index.js | 5 +++++ .../__root__/__templatepath__/__templatename__.hbs | 5 +++++ ui/packages/consul-ui/blueprints/serializer-test/index.js | 5 +++++ .../__root__/__path__/integration/serializers/__test__.js | 5 +++++ .../__root__/__path__/unit/serializers/__test__.js | 5 +++++ .../serializer/files/__root__/__path__/__name__.js | 5 +++++ ui/packages/consul-ui/blueprints/serializer/index.js | 5 +++++ ui/packages/consul-ui/config/deprecation-workflow.js | 5 +++++ ui/packages/consul-ui/config/ember-intl.js | 5 +++++ ui/packages/consul-ui/config/environment.js | 5 +++++ ui/packages/consul-ui/config/targets.js | 5 +++++ ui/packages/consul-ui/config/utils.js | 5 +++++ ui/packages/consul-ui/ember-cli-build.js | 5 +++++ ui/packages/consul-ui/lib/.eslintrc.js | 5 +++++ ui/packages/consul-ui/lib/colocated-components/index.js | 5 +++++ ui/packages/consul-ui/lib/commands/bin/list.js | 5 +++++ ui/packages/consul-ui/lib/commands/index.js | 5 +++++ ui/packages/consul-ui/lib/commands/lib/list.js | 5 +++++ ui/packages/consul-ui/lib/custom-element/index.js | 5 +++++ ui/packages/consul-ui/lib/startup/index.js | 5 +++++ ui/packages/consul-ui/lib/startup/templates/body.html.js | 5 +++++ ui/packages/consul-ui/lib/startup/templates/head.html.js | 5 +++++ ui/packages/consul-ui/node-tests/config/environment.js | 5 +++++ ui/packages/consul-ui/node-tests/config/utils.js | 5 +++++ ui/packages/consul-ui/server/index.js | 5 +++++ ui/packages/consul-ui/tailwind.config.js | 5 +++++ ui/packages/consul-ui/testem.js | 5 +++++ ui/packages/consul-ui/tests/acceptance/hcp-login-test.js | 5 +++++ .../consul-ui/tests/acceptance/steps/api-prefix-steps.js | 5 +++++ .../tests/acceptance/steps/components/acl-filter-steps.js | 5 +++++ .../acceptance/steps/components/catalog-filter-steps.js | 5 +++++ .../acceptance/steps/components/catalog-toolbar-steps.js | 5 +++++ .../tests/acceptance/steps/components/copy-button-steps.js | 5 +++++ .../tests/acceptance/steps/components/kv-filter-steps.js | 5 +++++ .../tests/acceptance/steps/components/text-input-steps.js | 5 +++++ .../tests/acceptance/steps/dc/acls/access-steps.js | 5 +++++ .../acceptance/steps/dc/acls/auth-methods/index-steps.js | 5 +++++ .../steps/dc/acls/auth-methods/navigation-steps.js | 5 +++++ .../acceptance/steps/dc/acls/auth-methods/sorting-steps.js | 5 +++++ .../consul-ui/tests/acceptance/steps/dc/acls/index-steps.js | 5 +++++ .../tests/acceptance/steps/dc/acls/list-order-steps.js | 5 +++++ .../steps/dc/acls/policies/as-many/add-existing-steps.js | 5 +++++ .../steps/dc/acls/policies/as-many/add-new-steps.js | 5 +++++ .../acceptance/steps/dc/acls/policies/as-many/list-steps.js | 5 +++++ .../steps/dc/acls/policies/as-many/nspaces-steps.js | 5 +++++ .../steps/dc/acls/policies/as-many/remove-steps.js | 5 +++++ .../steps/dc/acls/policies/as-many/reset-steps.js | 5 +++++ .../tests/acceptance/steps/dc/acls/policies/create-steps.js | 5 +++++ .../tests/acceptance/steps/dc/acls/policies/delete-steps.js | 5 +++++ .../tests/acceptance/steps/dc/acls/policies/index-steps.js | 5 +++++ .../acceptance/steps/dc/acls/policies/navigation-steps.js | 5 +++++ .../acceptance/steps/dc/acls/policies/sorting-steps.js | 5 +++++ .../tests/acceptance/steps/dc/acls/policies/update-steps.js | 5 +++++ .../steps/dc/acls/policies/view-management-steps.js | 5 +++++ .../steps/dc/acls/roles/as-many/add-existing-steps.js | 5 +++++ .../acceptance/steps/dc/acls/roles/as-many/add-new-steps.js | 5 +++++ .../acceptance/steps/dc/acls/roles/as-many/list-steps.js | 5 +++++ .../acceptance/steps/dc/acls/roles/as-many/remove-steps.js | 5 +++++ .../tests/acceptance/steps/dc/acls/roles/create-steps.js | 5 +++++ .../tests/acceptance/steps/dc/acls/roles/index-steps.js | 5 +++++ .../acceptance/steps/dc/acls/roles/navigation-steps.js | 5 +++++ .../tests/acceptance/steps/dc/acls/roles/sorting-steps.js | 5 +++++ .../tests/acceptance/steps/dc/acls/roles/update-steps.js | 5 +++++ .../steps/dc/acls/tokens/anonymous-no-delete-steps.js | 5 +++++ .../tests/acceptance/steps/dc/acls/tokens/clone-steps.js | 5 +++++ .../tests/acceptance/steps/dc/acls/tokens/create-steps.js | 5 +++++ .../tests/acceptance/steps/dc/acls/tokens/index-steps.js | 5 +++++ .../acceptance/steps/dc/acls/tokens/legacy/update-steps.js | 5 +++++ .../acceptance/steps/dc/acls/tokens/login-errors-steps.js | 5 +++++ .../tests/acceptance/steps/dc/acls/tokens/login-steps.js | 5 +++++ .../acceptance/steps/dc/acls/tokens/navigation-steps.js | 5 +++++ .../acceptance/steps/dc/acls/tokens/own-no-delete-steps.js | 5 +++++ .../tests/acceptance/steps/dc/acls/tokens/sorting-steps.js | 5 +++++ .../tests/acceptance/steps/dc/acls/tokens/update-steps.js | 5 +++++ .../tests/acceptance/steps/dc/acls/tokens/use-steps.js | 5 +++++ .../tests/acceptance/steps/dc/acls/update-steps.js | 5 +++++ .../consul-ui/tests/acceptance/steps/dc/acls/use-steps.js | 5 +++++ .../consul-ui/tests/acceptance/steps/dc/error-steps.js | 5 +++++ .../consul-ui/tests/acceptance/steps/dc/forwarding-steps.js | 5 +++++ .../consul-ui/tests/acceptance/steps/dc/index-steps.js | 5 +++++ .../tests/acceptance/steps/dc/intentions/create-steps.js | 5 +++++ .../tests/acceptance/steps/dc/intentions/delete-steps.js | 5 +++++ .../acceptance/steps/dc/intentions/filtered-select-steps.js | 5 +++++ .../acceptance/steps/dc/intentions/form-select-steps.js | 5 +++++ .../tests/acceptance/steps/dc/intentions/index-steps.js | 5 +++++ .../acceptance/steps/dc/intentions/navigation-steps.js | 5 +++++ .../steps/dc/intentions/permissions/create-steps.js | 5 +++++ .../steps/dc/intentions/permissions/warn-steps.js | 5 +++++ .../tests/acceptance/steps/dc/intentions/read-only-steps.js | 5 +++++ .../tests/acceptance/steps/dc/intentions/sorting-steps.js | 5 +++++ .../tests/acceptance/steps/dc/intentions/update-steps.js | 5 +++++ .../tests/acceptance/steps/dc/kv/index/view-kvs-steps.js | 5 +++++ .../consul-ui/tests/acceptance/steps/dc/kvs/create-steps.js | 5 +++++ .../consul-ui/tests/acceptance/steps/dc/kvs/delete-steps.js | 5 +++++ .../consul-ui/tests/acceptance/steps/dc/kvs/edit-steps.js | 5 +++++ .../consul-ui/tests/acceptance/steps/dc/kvs/index-steps.js | 5 +++++ .../tests/acceptance/steps/dc/kvs/list-order-steps.js | 5 +++++ .../acceptance/steps/dc/kvs/sessions/invalidate-steps.js | 5 +++++ .../tests/acceptance/steps/dc/kvs/trailing-slash-steps.js | 5 +++++ .../consul-ui/tests/acceptance/steps/dc/kvs/update-steps.js | 5 +++++ .../tests/acceptance/steps/dc/list-blocking-steps.js | 5 +++++ .../consul-ui/tests/acceptance/steps/dc/list-steps.js | 5 +++++ .../tests/acceptance/steps/dc/nodes/empty-ids-steps.js | 5 +++++ .../tests/acceptance/steps/dc/nodes/index-steps.js | 5 +++++ .../acceptance/steps/dc/nodes/index/view-nodes-steps.js | 5 +++++ .../tests/acceptance/steps/dc/nodes/navigation-steps.js | 5 +++++ .../tests/acceptance/steps/dc/nodes/no-leader-steps.js | 5 +++++ .../tests/acceptance/steps/dc/nodes/services/list-steps.js | 5 +++++ .../acceptance/steps/dc/nodes/sessions/invalidate-steps.js | 5 +++++ .../tests/acceptance/steps/dc/nodes/sessions/list-steps.js | 5 +++++ .../consul-ui/tests/acceptance/steps/dc/nodes/show-steps.js | 5 +++++ .../acceptance/steps/dc/nodes/show/health-checks-steps.js | 5 +++++ .../tests/acceptance/steps/dc/nodes/sorting-steps.js | 5 +++++ .../tests/acceptance/steps/dc/nspaces/create-steps.js | 5 +++++ .../tests/acceptance/steps/dc/nspaces/delete-steps.js | 5 +++++ .../tests/acceptance/steps/dc/nspaces/index-steps.js | 5 +++++ .../tests/acceptance/steps/dc/nspaces/manage-steps.js | 5 +++++ .../tests/acceptance/steps/dc/nspaces/sorting-steps.js | 5 +++++ .../tests/acceptance/steps/dc/nspaces/update-steps.js | 5 +++++ .../tests/acceptance/steps/dc/peers/create-steps.js | 5 +++++ .../tests/acceptance/steps/dc/peers/delete-steps.js | 5 +++++ .../tests/acceptance/steps/dc/peers/establish-steps.js | 5 +++++ .../tests/acceptance/steps/dc/peers/index-steps.js | 5 +++++ .../tests/acceptance/steps/dc/peers/regenerate-steps.js | 5 +++++ .../consul-ui/tests/acceptance/steps/dc/peers/show-steps.js | 5 +++++ .../tests/acceptance/steps/dc/routing-config-steps.js | 5 +++++ .../tests/acceptance/steps/dc/services/dc-switch-steps.js | 5 +++++ .../tests/acceptance/steps/dc/services/error-steps.js | 5 +++++ .../tests/acceptance/steps/dc/services/index-steps.js | 5 +++++ .../steps/dc/services/index/view-services-steps.js | 5 +++++ .../acceptance/steps/dc/services/instances/error-steps.js | 5 +++++ .../steps/dc/services/instances/exposed-paths-steps.js | 5 +++++ .../acceptance/steps/dc/services/instances/gateway-steps.js | 5 +++++ .../steps/dc/services/instances/health-checks-steps.js | 5 +++++ .../steps/dc/services/instances/navigation-steps.js | 5 +++++ .../acceptance/steps/dc/services/instances/proxy-steps.js | 5 +++++ .../acceptance/steps/dc/services/instances/show-steps.js | 5 +++++ .../steps/dc/services/instances/sidecar-proxy-steps.js | 5 +++++ .../steps/dc/services/instances/upstreams-steps.js | 5 +++++ .../steps/dc/services/instances/with-proxy-steps.js | 5 +++++ .../steps/dc/services/instances/with-sidecar-steps.js | 5 +++++ .../acceptance/steps/dc/services/list-blocking-steps.js | 5 +++++ .../tests/acceptance/steps/dc/services/list-steps.js | 5 +++++ .../tests/acceptance/steps/dc/services/navigation-steps.js | 5 +++++ .../acceptance/steps/dc/services/show-routing-steps.js | 5 +++++ .../tests/acceptance/steps/dc/services/show-steps.js | 5 +++++ .../acceptance/steps/dc/services/show-with-slashes-steps.js | 5 +++++ .../acceptance/steps/dc/services/show/dc-switch-steps.js | 5 +++++ .../steps/dc/services/show/intentions-error-steps.js | 5 +++++ .../steps/dc/services/show/intentions/create-steps.js | 5 +++++ .../steps/dc/services/show/intentions/index-steps.js | 5 +++++ .../acceptance/steps/dc/services/show/navigation-steps.js | 5 +++++ .../acceptance/steps/dc/services/show/services-steps.js | 5 +++++ .../tests/acceptance/steps/dc/services/show/tags-steps.js | 5 +++++ .../steps/dc/services/show/topology/empty-steps.js | 5 +++++ .../steps/dc/services/show/topology/index-steps.js | 5 +++++ .../steps/dc/services/show/topology/intentions-steps.js | 5 +++++ .../steps/dc/services/show/topology/metrics-steps.js | 5 +++++ .../steps/dc/services/show/topology/notices-steps.js | 5 +++++ .../steps/dc/services/show/topology/routing-config-steps.js | 5 +++++ .../steps/dc/services/show/topology/stats-steps.js | 5 +++++ .../acceptance/steps/dc/services/show/upstreams-steps.js | 5 +++++ .../tests/acceptance/steps/dc/services/sorting-steps.js | 5 +++++ .../consul-ui/tests/acceptance/steps/deleting-steps.js | 5 +++++ .../tests/acceptance/steps/index-forwarding-steps.js | 5 +++++ .../consul-ui/tests/acceptance/steps/login-errors-steps.js | 5 +++++ ui/packages/consul-ui/tests/acceptance/steps/login-steps.js | 5 +++++ .../tests/acceptance/steps/navigation-links-steps.js | 5 +++++ .../consul-ui/tests/acceptance/steps/nodes/sorting-steps.js | 5 +++++ .../tests/acceptance/steps/page-navigation-steps.js | 5 +++++ .../consul-ui/tests/acceptance/steps/settings/show-steps.js | 5 +++++ .../tests/acceptance/steps/settings/update-steps.js | 5 +++++ .../consul-ui/tests/acceptance/steps/startup-steps.js | 5 +++++ ui/packages/consul-ui/tests/acceptance/steps/steps.js | 5 +++++ .../consul-ui/tests/acceptance/steps/submit-blank-steps.js | 5 +++++ .../consul-ui/tests/acceptance/steps/token-header-steps.js | 5 +++++ ui/packages/consul-ui/tests/dictionary.js | 5 +++++ ui/packages/consul-ui/tests/helpers/api.js | 5 +++++ ui/packages/consul-ui/tests/helpers/destroy-app.js | 5 +++++ ui/packages/consul-ui/tests/helpers/flash-message.js | 5 +++++ ui/packages/consul-ui/tests/helpers/get-nspace-runner.js | 5 +++++ ui/packages/consul-ui/tests/helpers/measure.js | 5 +++++ .../consul-ui/tests/helpers/module-for-acceptance.js | 5 +++++ ui/packages/consul-ui/tests/helpers/normalizers.js | 5 +++++ ui/packages/consul-ui/tests/helpers/page.js | 5 +++++ ui/packages/consul-ui/tests/helpers/repo.js | 5 +++++ ui/packages/consul-ui/tests/helpers/set-cookies.js | 5 +++++ ui/packages/consul-ui/tests/helpers/stub-super.js | 5 +++++ ui/packages/consul-ui/tests/helpers/type-to-url.js | 5 +++++ ui/packages/consul-ui/tests/helpers/yadda-annotations.js | 5 +++++ ui/packages/consul-ui/tests/index.html | 5 +++++ .../tests/integration/adapters/auth-method-test.js | 5 +++++ .../tests/integration/adapters/binding-rule-test.js | 5 +++++ .../consul-ui/tests/integration/adapters/coordinate-test.js | 5 +++++ .../tests/integration/adapters/discovery-chain-test.js | 5 +++++ .../consul-ui/tests/integration/adapters/intention-test.js | 5 +++++ ui/packages/consul-ui/tests/integration/adapters/kv-test.js | 5 +++++ .../consul-ui/tests/integration/adapters/node-test.js | 5 +++++ .../consul-ui/tests/integration/adapters/nspace-test.js | 5 +++++ .../tests/integration/adapters/oidc-provider-test.js | 5 +++++ .../consul-ui/tests/integration/adapters/partition-test.js | 5 +++++ .../consul-ui/tests/integration/adapters/permission-test.js | 5 +++++ .../consul-ui/tests/integration/adapters/policy-test.js | 5 +++++ .../consul-ui/tests/integration/adapters/role-test.js | 5 +++++ .../tests/integration/adapters/service-instance-test.js | 5 +++++ .../consul-ui/tests/integration/adapters/service-test.js | 5 +++++ .../consul-ui/tests/integration/adapters/session-test.js | 5 +++++ .../consul-ui/tests/integration/adapters/token-test.js | 5 +++++ .../consul-ui/tests/integration/adapters/topology-test.js | 5 +++++ .../consul-ui/tests/integration/components/app-view-test.js | 5 +++++ .../tests/integration/components/aria-menu-test.js | 5 +++++ .../tests/integration/components/auth-profile-test.js | 5 +++++ .../tests/integration/components/code-editor-test.js | 5 +++++ .../integration/components/confirmation-dialog-test.js | 5 +++++ .../tests/integration/components/consul/bucket/list-test.js | 5 +++++ .../components/consul/datacenter/selector-test.js | 5 +++++ .../integration/components/consul/discovery-chain-test.js | 5 +++++ .../tests/integration/components/consul/hcp/home-test.js | 5 +++++ .../components/consul/intention/permission/form-test.js | 5 +++++ .../consul/intention/permission/header/form-test.js | 5 +++++ .../components/consul/node/agentless-notice-test.js | 5 +++++ .../tests/integration/components/data-collection-test.js | 5 +++++ .../tests/integration/components/data-source-test.js | 5 +++++ .../integration/components/delete-confirmation-test.js | 5 +++++ .../tests/integration/components/event-source-test.js | 5 +++++ .../tests/integration/components/freetext-filter-test.js | 5 +++++ .../tests/integration/components/hashicorp-consul-test.js | 5 +++++ .../tests/integration/components/jwt-source-test.js | 5 +++++ .../tests/integration/components/list-collection-test.js | 5 +++++ .../tests/integration/components/oidc-select-test.js | 5 +++++ .../tests/integration/components/popover-menu-test.js | 5 +++++ .../tests/integration/components/radio-group-test.js | 5 +++++ .../consul-ui/tests/integration/components/ref-test.js | 5 +++++ .../tests/integration/components/resolver-card-test.js | 5 +++++ .../tests/integration/components/route-card-test.js | 5 +++++ .../tests/integration/components/splitter-card-test.js | 5 +++++ .../consul-ui/tests/integration/components/state-test.js | 5 +++++ .../consul-ui/tests/integration/components/tab-nav-test.js | 5 +++++ .../tests/integration/components/tabular-collection-test.js | 5 +++++ .../tests/integration/components/tabular-details-test.js | 5 +++++ .../consul-ui/tests/integration/components/tag-list-test.js | 5 +++++ .../tests/integration/components/toggle-button-test.js | 5 +++++ .../tests/integration/components/token-list-test.js | 5 +++++ .../consul-ui/tests/integration/helpers/atob-test.js | 5 +++++ .../tests/integration/helpers/dom-position-test.js | 5 +++++ .../tests/integration/helpers/duration-from-test.js | 5 +++++ .../tests/integration/helpers/format-short-time-test.js | 5 +++++ .../consul-ui/tests/integration/helpers/is-href-test.js | 5 +++++ .../consul-ui/tests/integration/helpers/last-test.js | 5 +++++ .../consul-ui/tests/integration/helpers/left-trim-test.js | 5 +++++ .../tests/integration/helpers/policy/datacenters-test.js | 5 +++++ .../tests/integration/helpers/policy/typeof-test.js | 5 +++++ .../tests/integration/helpers/render-template-test.js | 5 +++++ .../consul-ui/tests/integration/helpers/right-trim-test.js | 5 +++++ .../consul-ui/tests/integration/helpers/route-match-test.js | 5 +++++ .../consul-ui/tests/integration/helpers/searchable-test.js | 5 +++++ .../integration/helpers/service/card-permissions-test.js | 5 +++++ .../integration/helpers/service/external-source-test.js | 5 +++++ .../integration/helpers/service/health-percentage-test.js | 5 +++++ .../consul-ui/tests/integration/helpers/slugify-test.js | 5 +++++ .../consul-ui/tests/integration/helpers/split-test.js | 5 +++++ .../tests/integration/helpers/state-matches-test.js | 5 +++++ .../consul-ui/tests/integration/helpers/substr-test.js | 5 +++++ .../consul-ui/tests/integration/helpers/svg-curve-test.js | 5 +++++ .../tests/integration/helpers/token/is-anonymous-test.js | 5 +++++ .../tests/integration/helpers/token/is-legacy-test.js | 5 +++++ .../consul-ui/tests/integration/helpers/tween-to-test.js | 5 +++++ .../tests/integration/serializers/auth-method-test.js | 5 +++++ .../tests/integration/serializers/binding-rule-test.js | 5 +++++ .../tests/integration/serializers/coordinate-test.js | 5 +++++ .../tests/integration/serializers/discovery-chain-test.js | 5 +++++ .../tests/integration/serializers/intention-test.js | 5 +++++ .../consul-ui/tests/integration/serializers/kv-test.js | 5 +++++ .../consul-ui/tests/integration/serializers/node-test.js | 5 +++++ .../consul-ui/tests/integration/serializers/nspace-test.js | 5 +++++ .../tests/integration/serializers/oidc-provider-test.js | 5 +++++ .../tests/integration/serializers/partition-test.js | 5 +++++ .../consul-ui/tests/integration/serializers/policy-test.js | 5 +++++ .../consul-ui/tests/integration/serializers/role-test.js | 5 +++++ .../tests/integration/serializers/service-instance-test.js | 5 +++++ .../consul-ui/tests/integration/serializers/service-test.js | 5 +++++ .../consul-ui/tests/integration/serializers/session-test.js | 5 +++++ .../consul-ui/tests/integration/serializers/token-test.js | 5 +++++ .../tests/integration/serializers/topology-test.js | 5 +++++ .../integration/services/repository/auth-method-test.js | 5 +++++ .../integration/services/repository/coordinate-test.js | 5 +++++ .../tests/integration/services/repository/dc-test.js | 5 +++++ .../integration/services/repository/discovery-chain-test.js | 5 +++++ .../tests/integration/services/repository/kv-test.js | 5 +++++ .../tests/integration/services/repository/node-test.js | 5 +++++ .../tests/integration/services/repository/policy-test.js | 5 +++++ .../tests/integration/services/repository/role-test.js | 5 +++++ .../tests/integration/services/repository/service-test.js | 5 +++++ .../tests/integration/services/repository/session-test.js | 5 +++++ .../tests/integration/services/repository/token-test.js | 5 +++++ .../tests/integration/services/repository/topology-test.js | 5 +++++ .../consul-ui/tests/integration/services/routlet-test.js | 5 +++++ .../integration/utils/dom/event-source/callable-test.js | 5 +++++ ui/packages/consul-ui/tests/lib/measure/getMeasure.js | 5 +++++ .../consul-ui/tests/lib/page-object/createCancelable.js | 5 +++++ .../consul-ui/tests/lib/page-object/createCreatable.js | 5 +++++ .../consul-ui/tests/lib/page-object/createDeletable.js | 5 +++++ .../consul-ui/tests/lib/page-object/createSubmitable.js | 5 +++++ ui/packages/consul-ui/tests/lib/page-object/index.js | 5 +++++ ui/packages/consul-ui/tests/lib/page-object/visitable.js | 5 +++++ ui/packages/consul-ui/tests/pages.js | 5 +++++ ui/packages/consul-ui/tests/pages/dc.js | 5 +++++ .../consul-ui/tests/pages/dc/acls/auth-methods/index.js | 5 +++++ ui/packages/consul-ui/tests/pages/dc/acls/edit.js | 5 +++++ ui/packages/consul-ui/tests/pages/dc/acls/index.js | 5 +++++ ui/packages/consul-ui/tests/pages/dc/acls/policies/edit.js | 5 +++++ ui/packages/consul-ui/tests/pages/dc/acls/policies/index.js | 5 +++++ ui/packages/consul-ui/tests/pages/dc/acls/roles/edit.js | 5 +++++ ui/packages/consul-ui/tests/pages/dc/acls/roles/index.js | 5 +++++ ui/packages/consul-ui/tests/pages/dc/acls/tokens/edit.js | 5 +++++ ui/packages/consul-ui/tests/pages/dc/acls/tokens/index.js | 5 +++++ ui/packages/consul-ui/tests/pages/dc/intentions/edit.js | 5 +++++ ui/packages/consul-ui/tests/pages/dc/intentions/index.js | 5 +++++ ui/packages/consul-ui/tests/pages/dc/kv/edit.js | 5 +++++ ui/packages/consul-ui/tests/pages/dc/kv/index.js | 5 +++++ ui/packages/consul-ui/tests/pages/dc/nodes/index.js | 5 +++++ ui/packages/consul-ui/tests/pages/dc/nodes/show.js | 5 +++++ ui/packages/consul-ui/tests/pages/dc/nspaces/edit.js | 5 +++++ ui/packages/consul-ui/tests/pages/dc/nspaces/index.js | 5 +++++ ui/packages/consul-ui/tests/pages/dc/peers/index.js | 5 +++++ ui/packages/consul-ui/tests/pages/dc/peers/show.js | 5 +++++ ui/packages/consul-ui/tests/pages/dc/routing-config.js | 5 +++++ ui/packages/consul-ui/tests/pages/dc/services/index.js | 5 +++++ ui/packages/consul-ui/tests/pages/dc/services/instance.js | 5 +++++ ui/packages/consul-ui/tests/pages/dc/services/show.js | 5 +++++ ui/packages/consul-ui/tests/pages/index.js | 5 +++++ ui/packages/consul-ui/tests/pages/settings.js | 5 +++++ ui/packages/consul-ui/tests/steps.js | 5 +++++ ui/packages/consul-ui/tests/steps/assertions/dom.js | 5 +++++ ui/packages/consul-ui/tests/steps/assertions/form.js | 5 +++++ ui/packages/consul-ui/tests/steps/assertions/http.js | 5 +++++ ui/packages/consul-ui/tests/steps/assertions/model.js | 5 +++++ ui/packages/consul-ui/tests/steps/assertions/page.js | 5 +++++ ui/packages/consul-ui/tests/steps/debug/index.js | 5 +++++ ui/packages/consul-ui/tests/steps/doubles/http.js | 5 +++++ ui/packages/consul-ui/tests/steps/doubles/model.js | 5 +++++ ui/packages/consul-ui/tests/steps/interactions/click.js | 5 +++++ ui/packages/consul-ui/tests/steps/interactions/form.js | 5 +++++ ui/packages/consul-ui/tests/steps/interactions/visit.js | 5 +++++ ui/packages/consul-ui/tests/test-helper.js | 5 +++++ ui/packages/consul-ui/tests/unit/abilities/-test.js | 5 +++++ .../consul-ui/tests/unit/adapters/application-test.js | 5 +++++ .../consul-ui/tests/unit/adapters/auth-method-test.js | 5 +++++ .../consul-ui/tests/unit/adapters/binding-rule-test.js | 5 +++++ .../consul-ui/tests/unit/adapters/coordinate-test.js | 5 +++++ .../consul-ui/tests/unit/adapters/discovery-chain-test.js | 5 +++++ ui/packages/consul-ui/tests/unit/adapters/http-test.js | 5 +++++ ui/packages/consul-ui/tests/unit/adapters/intention-test.js | 5 +++++ ui/packages/consul-ui/tests/unit/adapters/kv-test.js | 5 +++++ ui/packages/consul-ui/tests/unit/adapters/node-test.js | 5 +++++ ui/packages/consul-ui/tests/unit/adapters/nspace-test.js | 5 +++++ .../consul-ui/tests/unit/adapters/oidc-provider-test.js | 5 +++++ ui/packages/consul-ui/tests/unit/adapters/partition-test.js | 5 +++++ .../consul-ui/tests/unit/adapters/permission-test.js | 5 +++++ ui/packages/consul-ui/tests/unit/adapters/policy-test.js | 5 +++++ ui/packages/consul-ui/tests/unit/adapters/proxy-test.js | 5 +++++ ui/packages/consul-ui/tests/unit/adapters/role-test.js | 5 +++++ .../consul-ui/tests/unit/adapters/service-instance-test.js | 5 +++++ ui/packages/consul-ui/tests/unit/adapters/session-test.js | 5 +++++ ui/packages/consul-ui/tests/unit/adapters/token-test.js | 5 +++++ .../consul/discovery-chain/get-alternate-services-test.js | 5 +++++ .../components/consul/discovery-chain/get-resolvers-test.js | 5 +++++ .../components/consul/discovery-chain/get-splitters-test.js | 5 +++++ .../tests/unit/components/search-bar/filters-test.js | 5 +++++ .../consul-ui/tests/unit/controllers/application-test.js | 5 +++++ .../tests/unit/controllers/dc/acls/policies/create-test.js | 5 +++++ .../tests/unit/controllers/dc/acls/policies/edit-test.js | 5 +++++ .../tests/unit/controllers/dc/acls/roles/create-test.js | 5 +++++ .../tests/unit/controllers/dc/acls/roles/edit-test.js | 5 +++++ .../tests/unit/controllers/dc/acls/tokens/create-test.js | 5 +++++ .../tests/unit/controllers/dc/acls/tokens/edit-test.js | 5 +++++ .../tests/unit/filter/predicates/intention-test.js | 5 +++++ .../consul-ui/tests/unit/filter/predicates/service-test.js | 5 +++++ .../consul-ui/tests/unit/helpers/document-attrs-test.js | 5 +++++ .../consul-ui/tests/unit/helpers/policy/datacenters-test.js | 5 +++++ .../consul-ui/tests/unit/helpers/token/is-anonymous-test.js | 5 +++++ .../consul-ui/tests/unit/helpers/token/is-legacy-test.js | 5 +++++ .../consul-ui/tests/unit/mixins/policy/as-many-test.js | 5 +++++ .../consul-ui/tests/unit/mixins/role/as-many-test.js | 5 +++++ .../tests/unit/mixins/with-blocking-actions-test.js | 5 +++++ ui/packages/consul-ui/tests/unit/models/auth-method-test.js | 5 +++++ ui/packages/consul-ui/tests/unit/models/coordinate-test.js | 5 +++++ ui/packages/consul-ui/tests/unit/models/dc-test.js | 5 +++++ .../consul-ui/tests/unit/models/discovery-chain-test.js | 5 +++++ ui/packages/consul-ui/tests/unit/models/intention-test.js | 5 +++++ ui/packages/consul-ui/tests/unit/models/kv-test.js | 5 +++++ ui/packages/consul-ui/tests/unit/models/node-test.js | 5 +++++ .../consul-ui/tests/unit/models/oidc-provider-test.js | 5 +++++ ui/packages/consul-ui/tests/unit/models/partition-test.js | 5 +++++ ui/packages/consul-ui/tests/unit/models/permission-test.js | 5 +++++ ui/packages/consul-ui/tests/unit/models/policy-test.js | 5 +++++ ui/packages/consul-ui/tests/unit/models/proxy-test.js | 5 +++++ ui/packages/consul-ui/tests/unit/models/role-test.js | 5 +++++ .../consul-ui/tests/unit/models/service-instance-test.js | 5 +++++ ui/packages/consul-ui/tests/unit/models/service-test.js | 5 +++++ ui/packages/consul-ui/tests/unit/models/session-test.js | 5 +++++ ui/packages/consul-ui/tests/unit/models/token-test.js | 5 +++++ ui/packages/consul-ui/tests/unit/routes/application-test.js | 5 +++++ ui/packages/consul-ui/tests/unit/routes/dc-test.js | 5 +++++ .../tests/unit/routes/dc/acls/policies/create-test.js | 5 +++++ .../tests/unit/routes/dc/acls/policies/edit-test.js | 5 +++++ .../tests/unit/routes/dc/acls/policies/index-test.js | 5 +++++ .../tests/unit/routes/dc/acls/roles/create-test.js | 5 +++++ .../consul-ui/tests/unit/routes/dc/acls/roles/edit-test.js | 5 +++++ .../consul-ui/tests/unit/routes/dc/acls/roles/index-test.js | 5 +++++ .../tests/unit/routes/dc/acls/tokens/create-test.js | 5 +++++ .../consul-ui/tests/unit/routes/dc/acls/tokens/edit-test.js | 5 +++++ .../tests/unit/routes/dc/acls/tokens/index-test.js | 5 +++++ .../tests/unit/search/predicates/intention-test.js | 5 +++++ .../consul-ui/tests/unit/search/predicates/kv-test.js | 5 +++++ .../consul-ui/tests/unit/search/predicates/node-test.js | 5 +++++ .../consul-ui/tests/unit/search/predicates/policy-test.js | 5 +++++ .../consul-ui/tests/unit/search/predicates/role-test.js | 5 +++++ .../consul-ui/tests/unit/search/predicates/service-test.js | 5 +++++ .../consul-ui/tests/unit/search/predicates/token-test.js | 5 +++++ .../consul-ui/tests/unit/serializers/application-test.js | 5 +++++ .../consul-ui/tests/unit/serializers/auth-method-test.js | 5 +++++ .../consul-ui/tests/unit/serializers/binding-rule-test.js | 5 +++++ .../consul-ui/tests/unit/serializers/coordinate-test.js | 5 +++++ .../tests/unit/serializers/discovery-chain-test.js | 5 +++++ .../consul-ui/tests/unit/serializers/intention-test.js | 5 +++++ ui/packages/consul-ui/tests/unit/serializers/kv-test.js | 5 +++++ ui/packages/consul-ui/tests/unit/serializers/node-test.js | 5 +++++ ui/packages/consul-ui/tests/unit/serializers/nspace-test.js | 5 +++++ .../consul-ui/tests/unit/serializers/oidc-provider-test.js | 5 +++++ .../consul-ui/tests/unit/serializers/partition-test.js | 5 +++++ .../consul-ui/tests/unit/serializers/permission-test.js | 5 +++++ ui/packages/consul-ui/tests/unit/serializers/policy-test.js | 5 +++++ ui/packages/consul-ui/tests/unit/serializers/proxy-test.js | 5 +++++ ui/packages/consul-ui/tests/unit/serializers/role-test.js | 5 +++++ .../tests/unit/serializers/service-instance-test.js | 5 +++++ .../consul-ui/tests/unit/serializers/service-test.js | 5 +++++ .../consul-ui/tests/unit/serializers/session-test.js | 5 +++++ ui/packages/consul-ui/tests/unit/serializers/token-test.js | 5 +++++ ui/packages/consul-ui/tests/unit/services/atob-test.js | 5 +++++ ui/packages/consul-ui/tests/unit/services/btoa-test.js | 5 +++++ .../tests/unit/services/client/connections-test.js | 5 +++++ .../consul-ui/tests/unit/services/client/http-test.js | 5 +++++ .../tests/unit/services/client/transports/xhr-test.js | 5 +++++ .../tests/unit/services/clipboard/local-storage-test.js | 5 +++++ .../consul-ui/tests/unit/services/clipboard/os-test.js | 5 +++++ .../tests/unit/services/code-mirror/linter-test.js | 5 +++++ .../tests/unit/services/data-source/protocols/http-test.js | 5 +++++ .../services/data-source/protocols/local-storage-test.js | 5 +++++ .../consul-ui/tests/unit/services/data-structs-test.js | 5 +++++ ui/packages/consul-ui/tests/unit/services/dom-test.js | 5 +++++ ui/packages/consul-ui/tests/unit/services/encoder-test.js | 5 +++++ ui/packages/consul-ui/tests/unit/services/env-test.js | 5 +++++ ui/packages/consul-ui/tests/unit/services/feedback-test.js | 5 +++++ ui/packages/consul-ui/tests/unit/services/form-test.js | 5 +++++ ui/packages/consul-ui/tests/unit/services/logger-test.js | 5 +++++ .../consul-ui/tests/unit/services/repository-test.js | 5 +++++ .../tests/unit/services/repository/auth-method-test.js | 5 +++++ .../tests/unit/services/repository/coordinate-test.js | 5 +++++ .../consul-ui/tests/unit/services/repository/dc-test.js | 5 +++++ .../tests/unit/services/repository/discovery-chain-test.js | 5 +++++ .../tests/unit/services/repository/intention-test.js | 5 +++++ .../consul-ui/tests/unit/services/repository/kv-test.js | 5 +++++ .../consul-ui/tests/unit/services/repository/node-test.js | 5 +++++ .../consul-ui/tests/unit/services/repository/nspace-test.js | 5 +++++ .../tests/unit/services/repository/oidc-provider-test.js | 5 +++++ .../tests/unit/services/repository/partition-test.js | 5 +++++ .../tests/unit/services/repository/permission-test.js | 5 +++++ .../consul-ui/tests/unit/services/repository/policy-test.js | 5 +++++ .../consul-ui/tests/unit/services/repository/role-test.js | 5 +++++ .../tests/unit/services/repository/service-instance-test.js | 5 +++++ .../tests/unit/services/repository/service-test.js | 5 +++++ .../tests/unit/services/repository/session-test.js | 5 +++++ .../consul-ui/tests/unit/services/repository/token-test.js | 5 +++++ ui/packages/consul-ui/tests/unit/services/search-test.js | 5 +++++ ui/packages/consul-ui/tests/unit/services/settings-test.js | 5 +++++ ui/packages/consul-ui/tests/unit/services/sort-test.js | 5 +++++ ui/packages/consul-ui/tests/unit/services/state-test.js | 5 +++++ ui/packages/consul-ui/tests/unit/services/store-test.js | 5 +++++ ui/packages/consul-ui/tests/unit/services/temporal-test.js | 5 +++++ ui/packages/consul-ui/tests/unit/services/ticker-test.js | 5 +++++ ui/packages/consul-ui/tests/unit/services/timeout-test.js | 5 +++++ .../consul-ui/tests/unit/sort/comparators/service-test.js | 5 +++++ ui/packages/consul-ui/tests/unit/utils/ascend-test.js | 5 +++++ ui/packages/consul-ui/tests/unit/utils/atob-test.js | 5 +++++ ui/packages/consul-ui/tests/unit/utils/btoa-test.js | 5 +++++ .../consul-ui/tests/unit/utils/callable-type-test.js | 5 +++++ .../consul-ui/tests/unit/utils/create-fingerprinter-test.js | 5 +++++ .../tests/unit/utils/dom/click-first-anchor-test.js | 5 +++++ ui/packages/consul-ui/tests/unit/utils/dom/closest-test.js | 5 +++++ .../consul-ui/tests/unit/utils/dom/create-listeners-test.js | 5 +++++ .../tests/unit/utils/dom/event-source/blocking-test.js | 5 +++++ .../tests/unit/utils/dom/event-source/cache-test.js | 5 +++++ .../tests/unit/utils/dom/event-source/callable-test.js | 5 +++++ .../tests/unit/utils/dom/event-source/index-test.js | 5 +++++ .../tests/unit/utils/dom/event-source/openable-test.js | 5 +++++ .../tests/unit/utils/dom/event-source/proxy-test.js | 5 +++++ .../tests/unit/utils/dom/event-source/resolver-test.js | 5 +++++ .../tests/unit/utils/dom/event-source/storage-test.js | 5 +++++ .../tests/unit/utils/dom/event-target/rsvp-test.js | 5 +++++ .../tests/unit/utils/dom/get-component-factory-test.js | 5 +++++ .../consul-ui/tests/unit/utils/dom/is-outside-test.js | 5 +++++ .../consul-ui/tests/unit/utils/dom/normalize-event-test.js | 5 +++++ .../consul-ui/tests/unit/utils/dom/qsa-factory-test.js | 5 +++++ ui/packages/consul-ui/tests/unit/utils/dom/sibling-test.js | 5 +++++ .../consul-ui/tests/unit/utils/get-environment-test.js | 5 +++++ .../tests/unit/utils/get-form-name-property-test.js | 5 +++++ .../consul-ui/tests/unit/utils/helpers/call-if-type-test.js | 5 +++++ .../consul-ui/tests/unit/utils/http/create-headers-test.js | 5 +++++ .../tests/unit/utils/http/create-query-params-test.js | 5 +++++ .../consul-ui/tests/unit/utils/http/create-url-test.js | 5 +++++ ui/packages/consul-ui/tests/unit/utils/http/error-test.js | 5 +++++ ui/packages/consul-ui/tests/unit/utils/http/request-test.js | 5 +++++ ui/packages/consul-ui/tests/unit/utils/http/xhr-test.js | 5 +++++ ui/packages/consul-ui/tests/unit/utils/isFolder-test.js | 5 +++++ ui/packages/consul-ui/tests/unit/utils/keyToArray-test.js | 5 +++++ ui/packages/consul-ui/tests/unit/utils/left-trim-test.js | 5 +++++ ui/packages/consul-ui/tests/unit/utils/maybe-call-test.js | 5 +++++ ui/packages/consul-ui/tests/unit/utils/merge-checks-test.js | 5 +++++ .../consul-ui/tests/unit/utils/non-empty-set-test.js | 5 +++++ ui/packages/consul-ui/tests/unit/utils/path/resolve-test.js | 5 +++++ .../consul-ui/tests/unit/utils/promisedTimeout-test.js | 5 +++++ ui/packages/consul-ui/tests/unit/utils/right-trim-test.js | 5 +++++ .../tests/unit/utils/routing/transitionable-test.js | 5 +++++ ui/packages/consul-ui/tests/unit/utils/routing/walk-test.js | 5 +++++ .../consul-ui/tests/unit/utils/routing/wildcard-test.js | 5 +++++ .../tests/unit/utils/storage/local-storage-test.js | 5 +++++ ui/packages/consul-ui/tests/unit/utils/templatize-test.js | 5 +++++ ui/packages/consul-ui/tests/unit/utils/ticker/index-test.js | 5 +++++ ui/packages/consul-ui/tests/unit/utils/ucfirst-test.js | 5 +++++ .../consul-ui/tests/unit/utils/update-array-object-test.js | 5 +++++ ui/packages/consul-ui/translations/common/en-us.yaml | 3 +++ .../consul-ui/translations/components/app/en-us.yaml | 3 +++ .../consul-ui/translations/components/consul/en-us.yaml | 3 +++ .../translations/components/copy-button/en-us.yaml | 3 +++ ui/packages/consul-ui/translations/models/en-us.yaml | 3 +++ ui/packages/consul-ui/translations/routes/en-us.yaml | 3 +++ ui/packages/consul-ui/vendor/consul-ui/routes-debug.js | 5 +++++ ui/packages/consul-ui/vendor/consul-ui/routes.js | 5 +++++ ui/packages/consul-ui/vendor/consul-ui/services-debug.js | 5 +++++ ui/packages/consul-ui/vendor/consul-ui/services.js | 5 +++++ ui/packages/consul-ui/vendor/init.js | 5 +++++ ui/packages/consul-ui/vendor/metrics-providers/consul.js | 5 +++++ .../consul-ui/vendor/metrics-providers/prometheus.js | 5 +++++ 4416 files changed, 22065 insertions(+), 2 deletions(-) diff --git a/.copywrite.hcl b/.copywrite.hcl index 7c54610b04f..5f27fbf8a9f 100644 --- a/.copywrite.hcl +++ b/.copywrite.hcl @@ -8,7 +8,9 @@ project { # Supports doublestar glob patterns for more flexibility in defining which # files or folders should be ignored header_ignore = [ - # "vendors/**", - # "**autogen**", + # Forked and modified UI libs + "ui/packages/consul-ui/app/utils/dom/event-target/**", + "ui/packages/consul-ui/lib/rehype-prism/**", + "ui/packages/consul-ui/lib/block-slots/**", ] } diff --git a/ui/packages/consul-acls/app/components/consul/acl/selector/index.hbs b/ui/packages/consul-acls/app/components/consul/acl/selector/index.hbs index f5e6bae3481..afee0962633 100644 --- a/ui/packages/consul-acls/app/components/consul/acl/selector/index.hbs +++ b/ui/packages/consul-acls/app/components/consul/acl/selector/index.hbs @@ -1,3 +1,8 @@ +{{! + Copyright (c) HashiCorp, Inc. + SPDX-License-Identifier: MPL-2.0 +}} +